7 #include "trinity.h" // page_size
8 #include "arch.h" // KERNEL_ADDR etc
17 static bool within_page(void *addr, void *check)
21 if ((addr > check) && (addr < (check + page_size)))
26 bool validate_address(void *addr)
28 if (within_page(addr, shm) == TRUE)
30 if (within_page(addr, page_rand) == TRUE)
32 if (within_page(addr, page_zeros) == TRUE)
34 if (within_page(addr, page_0xff) == TRUE)
36 if (within_page(addr, page_allocs) == TRUE)
43 static void * _get_address(unsigned char null_allowed
)
48 if (null_allowed
== TRUE
)
57 case 1: addr
= (void *) KERNEL_ADDR
;
59 case 2: addr
= page_zeros
;
61 case 3: addr
= page_0xff
;
63 case 4: addr
= page_rand
;
65 case 5: addr
= page_allocs
;
67 case 6: addr
= (void *)(unsigned long)rand64();
69 case 7: addr
= get_map();
71 case 8: addr
= malloc(page_size
* 2);
72 // FIXME: We leak this. This is the address we need to store for later
73 // freeing, not the potentially munged version below.
74 // tricky. We want to hand the munged version out too, so we might end up
75 // having to split this into alloc_address / get_address.
78 BUG("unreachable!\n");
83 * Most of the time, we just return the address we got above unmunged.
84 * But sometimes, we return an address just before the end of the page.
85 * The idea here is that we might see some bugs that are caused by page boundary failures.
89 case 0: addr
+= (page_size
- sizeof(char));
91 case 1: addr
+= (page_size
- sizeof(int));
93 case 2: addr
+= (page_size
- sizeof(long));
95 case 3: addr
+= (page_size
/ 2);
104 void * get_address(void)
106 return _get_address(TRUE
);
109 void * get_non_null_address(void)
111 return _get_address(FALSE
);
115 unsigned long find_previous_arg_address(unsigned int argnum
, unsigned int call
, int childno
)
117 unsigned long addr
= 0;
120 if ((syscalls
[call
].entry
->arg1type
== ARG_ADDRESS
) ||
121 (syscalls
[call
].entry
->arg1type
== ARG_NON_NULL_ADDRESS
))
122 addr
= shm
->a1
[childno
];
125 if ((syscalls
[call
].entry
->arg2type
== ARG_ADDRESS
) ||
126 (syscalls
[call
].entry
->arg2type
== ARG_NON_NULL_ADDRESS
))
127 addr
= shm
->a2
[childno
];
130 if ((syscalls
[call
].entry
->arg3type
== ARG_ADDRESS
) ||
131 (syscalls
[call
].entry
->arg3type
== ARG_NON_NULL_ADDRESS
))
132 addr
= shm
->a3
[childno
];
135 if ((syscalls
[call
].entry
->arg4type
== ARG_ADDRESS
) ||
136 (syscalls
[call
].entry
->arg4type
== ARG_NON_NULL_ADDRESS
))
137 addr
= shm
->a4
[childno
];
140 if ((syscalls
[call
].entry
->arg5type
== ARG_ADDRESS
) ||
141 (syscalls
[call
].entry
->arg5type
== ARG_NON_NULL_ADDRESS
))
142 addr
= shm
->a5
[childno
];
149 * iovec's are just special cases of the ARG_ADDRESS's
151 struct iovec
* alloc_iovec(unsigned int num
)
156 iov
= malloc(num
* sizeof(struct iovec
));
158 for (i
= 0; i
< num
; i
++) {
159 iov
[i
].iov_base
= malloc(page_size
);
160 iov
[i
].iov_len
= page_size
;