diff --git a/coregrind/vg_mylibc.c b/coregrind/vg_mylibc.c index 691804c6e..ce861e231 100644 --- a/coregrind/vg_mylibc.c +++ b/coregrind/vg_mylibc.c @@ -270,16 +270,12 @@ static Int munmap_inner(void *start, UInt length) static Addr mmap_inner(void *start, UInt length, UInt prot, UInt flags, UInt fd, UInt offset) { - UInt args[6]; - - args[0] = (UInt)start; - args[1] = length; - args[2] = prot; - args[3] = flags & ~(VKI_MAP_NOSYMS|VKI_MAP_CLIENT); - args[4] = fd; - args[5] = offset; - - return VG_(do_syscall)(__NR_mmap, (UInt)(&(args[0])) ); + Int ret; + + PLATFORM_DO_MMAP(ret, start, length, prot, + flags & ~(VKI_MAP_NOSYMS|VKI_MAP_CLIENT), + fd, offset); + return ret; } /* Returns -1 on failure. */ diff --git a/coregrind/vg_syscalls.c b/coregrind/vg_syscalls.c index 7f4153d84..92cd78c2b 100644 --- a/coregrind/vg_syscalls.c +++ b/coregrind/vg_syscalls.c @@ -4183,17 +4183,11 @@ PRE(mmap) int flags, int fd, off_t offset); */ - UInt* arg_block = (UInt*)arg1; UInt a1, a2, a3, a4, a5, a6; - SYSCALL_TRACK( pre_mem_read, tid, "mmap(args)", arg1, 6*sizeof(UInt) ); + vg_assert(tid = tst->tid); + PLATFORM_GET_MMAP_ARGS(tst, a1, a2, a3, a4, a5, a6); - a1 = arg_block[0]; - a2 = arg_block[1]; - a3 = arg_block[2]; - a4 = arg_block[3]; - a5 = arg_block[4]; - a6 = arg_block[5]; MAYBE_PRINTF("mmap ( %p, %d, %d, %d, %d, %d )\n", a1, a2, a3, a4, a5, a6 ); @@ -4203,7 +4197,7 @@ PRE(mmap) res = -VKI_ENOMEM; } } else { - a1 = VG_(find_map_space)(arg_block[0], arg_block[1], True); + a1 = VG_(find_map_space)(a1, a2, True); if (a1 == 0) res = -VKI_ENOMEM; else @@ -4211,16 +4205,7 @@ PRE(mmap) } if (res != -VKI_ENOMEM) { - UInt new_arg_block[6]; - - new_arg_block[0] = a1; - new_arg_block[1] = a2; - new_arg_block[2] = a3; - new_arg_block[3] = a4; - new_arg_block[4] = a5; - new_arg_block[5] = a6; - - res = VG_(do_syscall)(__NR_mmap, new_arg_block); + PLATFORM_DO_MMAP(res, a1, a2, a3, a4, a5, a6); if (!VG_(is_kerror)(res)) { vg_assert(valid_client_addr(res, a2, tid, "mmap")); diff --git a/coregrind/x86-linux/core_platform.h b/coregrind/x86-linux/core_platform.h index d599811d6..f199987e3 100644 --- a/coregrind/x86-linux/core_platform.h +++ b/coregrind/x86-linux/core_platform.h @@ -93,6 +93,34 @@ extern Addr VG_(do_useseg) ( UInt seg_selector, Addr virtual_addr ); #define UCONTEXT_FRAME_PTR(uc) ((uc)->uc_mcontext.ebp) #define UCONTEXT_SYSCALL_NUM(uc) ((uc)->uc_mcontext.eax) +/* --------------------------------------------------------------------- + mmap() stuff + ------------------------------------------------------------------ */ + +#define PLATFORM_DO_MMAP(ret, start, length, prot, flags, fd, offset) { \ + UInt __args[6]; \ + \ + __args[0] = (UInt)(start); \ + __args[1] = (length); \ + __args[2] = (prot); \ + __args[3] = (flags); \ + __args[4] = (fd); \ + __args[5] = (offset); \ + \ + ret = VG_(do_syscall)(__NR_mmap, (UInt)(&(__args[0])) ); \ +} + +#define PLATFORM_GET_MMAP_ARGS(tst, a1, a2, a3, a4, a5, a6) do {\ + UInt *arg_block = (UInt*)PLATFORM_SYSCALL_ARG1(tst->arch); \ + SYSCALL_TRACK( pre_mem_read, tst->tid, "mmap(args)", arg1, 6*sizeof(UWord) ); \ + a1 = arg_block[0]; \ + a2 = arg_block[1]; \ + a3 = arg_block[2]; \ + a4 = arg_block[3]; \ + a5 = arg_block[4]; \ + a6 = arg_block[5]; \ +} while (0) + /*--------------------------------------------------------------------*/ /*--- end ---*/ /*--------------------------------------------------------------------*/