if (0) VG_(printf)("stacksize = %d\n", stacksize);
/* client_SP is the client's stack pointer */
- client_SP = clstack_end - stacksize;
+ client_SP = clstack_end + 1 - stacksize;
client_SP = VG_ROUNDDN(client_SP, 32); /* make stack 32 byte aligned */
/* base of the string table (aligned) */
clstack_max_size = VG_PGROUNDUP(clstack_max_size);
/* Darwin stack is chosen by the ume loader */
- clstack_start = clstack_end - clstack_max_size;
+ clstack_start = clstack_end + 1 - clstack_max_size;
/* Record stack extent -- needed for stack-change code. */
/* GrP fixme really? */
IIFinaliseImageInfo VG_(ii_create_image)( IICreateImageInfo iicii )
{
ExeInfo info;
+ VG_(memset)( &info, 0, sizeof(info) );
+
HChar** env = NULL;
IIFinaliseImageInfo iifii;
if (flavor == i386_THREAD_STATE && count == i386_THREAD_STATE_COUNT) {
i386_thread_state_t *state = (i386_thread_state_t *)p;
if (entry) *entry = (vki_uint8_t *)state->__eip;
- if (stack_end) *stack_end = (vki_uint8_t *)(state->__esp ? state->__esp : VKI_USRSTACK);
+ if (stack_end) {
+ *stack_end = (vki_uint8_t *)(state->__esp ? state->__esp
+ : VKI_USRSTACK);
+ vg_assert(VG_IS_PAGE_ALIGNED(*stack_end));
+ (*stack_end)--;
+ }
if (customstack) *customstack = state->__esp;
return 0;
}
if (flavor == x86_THREAD_STATE64 && count == x86_THREAD_STATE64_COUNT){
x86_thread_state64_t *state = (x86_thread_state64_t *)p;
if (entry) *entry = (vki_uint8_t *)state->__rip;
- if (stack_end) *stack_end = (vki_uint8_t *)(state->__rsp ? state->__rsp : VKI_USRSTACK64);
+ if (stack_end) {
+ *stack_end = (vki_uint8_t *)(state->__rsp ? state->__rsp
+ : VKI_USRSTACK64);
+ vg_assert(VG_IS_PAGE_ALIGNED(*stack_end));
+ (*stack_end)--;
+ }
if (customstack) *customstack = state->__rsp;
return 0;
}
if (!customstack) {
// Map the stack
vki_size_t stacksize = VG_PGROUNDUP(default_stack_size());
- vm_address_t stackbase = VG_PGROUNDDN(stack_end-stacksize);
+ vm_address_t stackbase = VG_PGROUNDDN(stack_end+1-stacksize);
SysRes res;
res = VG_(am_mmap_anon_fixed_client)(stackbase, stacksize, VKI_PROT_READ|VKI_PROT_WRITE|VKI_PROT_EXEC);