|
From: Nicholas N. <nj...@ca...> - 2004-10-18 14:47:51
|
CVS commit by nethercote:
Arch-abstraction:
- account for x86's strange argument passing (via memory) for mmap()
M +6 -10 vg_mylibc.c 1.94
M +4 -19 vg_syscalls.c 1.145
M +28 -0 x86-linux/core_platform.h 1.5
--- valgrind/coregrind/vg_mylibc.c #1.93:1.94
@@ -271,14 +271,10 @@ static Int munmap_inner(void *start, UIn
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;
+ Int ret;
- return VG_(do_syscall)(__NR_mmap, (UInt)(&(args[0])) );
+ PLATFORM_DO_MMAP(ret, start, length, prot,
+ flags & ~(VKI_MAP_NOSYMS|VKI_MAP_CLIENT),
+ fd, offset);
+ return ret;
}
--- valgrind/coregrind/vg_syscalls.c #1.144:1.145
@@ -4184,15 +4184,9 @@ PRE(mmap)
*/
- 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 );
@@ -4204,5 +4198,5 @@ PRE(mmap)
}
} 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;
@@ -4212,14 +4206,5 @@ 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)) {
--- valgrind/coregrind/x86-linux/core_platform.h #1.4:1.5
@@ -94,4 +94,32 @@ extern Addr VG_(do_useseg) ( UInt seg_se
#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 ---*/
|