PERFORCE change 152095 for review
Peter Wemm
peter at FreeBSD.org
Tue Oct 28 11:37:57 UTC 2008
http://perforce.freebsd.org/chv.cgi?CH=152095
Change 152095 by peter at 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
More information about the p4-projects
mailing list