Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Oct 2008 11:37:56 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 152095 for review
Message-ID:  <200810281137.m9SBbuIU098213@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=152095

Change 152095 by peter@peter_overcee on 2008/10/28 11:37:13

	Get syscall encode/decode a little closer to reality.

Affected files ...

.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#8 edit

Differences ...

==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#8 (text+ko) ====

@@ -334,16 +334,32 @@
 // AAA: missing 7th arg for freebsd/amd64
 #elif defined(VGP_amd64_linux) || defined(VGP_amd64_freebsd)
    VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;
-   canonical->sysno = gst->guest_RAX;
-   canonical->arg1  = gst->guest_RDI;
-   canonical->arg2  = gst->guest_RSI;
-   canonical->arg3  = gst->guest_RDX;
-   canonical->arg4  = gst->guest_R10;
-   canonical->arg5  = gst->guest_R8;
-   canonical->arg6  = gst->guest_R9;
-   canonical->arg7  = 0;
-   canonical->arg8  = 0;
-
+   ULong *argv = (void *)(ULong)gst->guest_RSP;
+   switch (gst->guest_RAX) {
+   default:
+      canonical->sysno = gst->guest_RAX;
+      canonical->arg1  = gst->guest_RDI;
+      canonical->arg2  = gst->guest_RSI;
+      canonical->arg3  = gst->guest_RDX;
+      canonical->arg4  = gst->guest_R10;
+      canonical->arg5  = gst->guest_R8;
+      canonical->arg6  = gst->guest_R9;
+      canonical->arg7  = argv[1];
+      canonical->arg8  = argv[2];
+      break;
+   case 198:
+   case 0:
+      canonical->sysno = gst->guest_RDI;
+      canonical->arg1  = gst->guest_RSI;
+      canonical->arg2  = gst->guest_RDX;
+      canonical->arg3  = gst->guest_R10;
+      canonical->arg4  = gst->guest_R8;
+      canonical->arg5  = gst->guest_R9;
+      canonical->arg6  = argv[1];
+      canonical->arg7  = argv[2];
+      canonical->arg8  = argv[2];
+      break;
+   }
 
 #elif defined(VGP_ppc32_linux)
    VexGuestPPC32State* gst = (VexGuestPPC32State*)gst_vanilla;
@@ -668,8 +684,7 @@
    layout->o_arg8   = -1; /* impossible value */
    layout->o_retval = OFFSET_x86_EAX;
 
-// AAA: missing 7th arg for freebsd 64 bit (eg: mmap)
-#elif defined(VGP_amd64_linux) || defined(VGP_amd64_freebsd)
+#elif defined(VGP_amd64_linux)
    layout->o_sysno  = OFFSET_amd64_RAX;
    layout->o_arg1   = OFFSET_amd64_RDI;
    layout->o_arg2   = OFFSET_amd64_RSI;
@@ -742,6 +757,19 @@
    layout->o_retval = OFFSET_x86_EAX;
    layout->o_retval2 = OFFSET_x86_EDX;
 
+#elif defined(VGP_amd64_freebsd)
+   layout->o_sysno  = OFFSET_amd64_RAX;
+   layout->o_arg1   = OFFSET_amd64_RDI;
+   layout->o_arg2   = OFFSET_amd64_RSI;
+   layout->o_arg3   = OFFSET_amd64_RDX;
+   layout->o_arg4   = OFFSET_amd64_R10;
+   layout->o_arg5   = OFFSET_amd64_R8;
+   layout->o_arg6   = OFFSET_amd64_R9;
+   layout->o_arg7   = 8;  /* on stack */
+   layout->o_arg8   = 16; /* on stack */
+   layout->o_retval = OFFSET_amd64_RAX;
+   layout->o_retval2 = OFFSET_amd64_RDX;
+
 #else
 #  error "getSyscallLayout: unknown arch"
 #endif



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810281137.m9SBbuIU098213>