]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Arch-abstraction:
authorNicholas Nethercote <n.nethercote@gmail.com>
Mon, 18 Oct 2004 14:47:48 +0000 (14:47 +0000)
committerNicholas Nethercote <n.nethercote@gmail.com>
Mon, 18 Oct 2004 14:47:48 +0000 (14:47 +0000)
- account for x86's strange argument passing (via memory) for mmap()

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@2785

coregrind/vg_mylibc.c
coregrind/vg_syscalls.c
coregrind/x86-linux/core_platform.h

index 691804c6e9b76675e38596077c2ac546ff62ae50..ce861e2311f58d511468d2d3a500a6606629f92c 100644 (file)
@@ -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. */
index 7f4153d8439dc489ae0ab9c895f6fc041eb8b8fb..92cd78c2b5e4b8e69ef844c9362f6e973f870919 100644 (file)
@@ -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"));
index d599811d6185df24935bc3613634702ba55d3a5f..f199987e37f637d633e643bd3103a017d1a3d274 100644 (file)
@@ -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                                                          ---*/
 /*--------------------------------------------------------------------*/