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. */
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 );
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
}
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"));
#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 ---*/
/*--------------------------------------------------------------------*/