Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 24 Oct 2008 04:04:05 GMT
From:      Peter Wemm <peter@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 151842 for review
Message-ID:  <200810240404.m9O445AU056046@repoman.freebsd.org>

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

Change 151842 by peter@peter_cheese on 2008/10/24 04:03:43

	Try and get a better handle on err vs return value stuff in the New World Order.
	Hack to ignore a discrepancy in err value in client state - we have the right
	return anyway - this is a redundant sanity check that fails.
	
	With this, it runs /bin/ls successfully and reports a leak.

Affected files ...

.. //depot/projects/valgrind/coregrind/m_syscall.c#5 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#7 edit

Differences ...

==== //depot/projects/valgrind/coregrind/m_syscall.c#5 (text+ko) ====

@@ -142,7 +142,13 @@
 SysRes VG_(mk_SysRes_x86_freebsd) ( UInt val, UInt val2, UInt flags ) {
    SysRes res;
    res.isError = (flags & 1) != 0;	/* PSL_C, carry bit */
-   res.res     = val;
+   if (res.isError) {
+      res.err = val;
+      res.res = 0;
+   } else {
+      res.err = 0;
+      res.res = val;
+   }
    res.res2    = val2;
    return res;
 }
@@ -151,7 +157,13 @@
 SysRes VG_(mk_SysRes_amd64_freebsd) ( ULong val, ULong val2, ULong flags ) {
    SysRes res;
    res.isError = (flags & 1) != 0;	/* PSL_C, carry bit */
-   res.res     = val;
+   if (res.isError) {
+      res.err = val;
+      res.res = 0;
+   } else {
+      res.err = 0;
+      res.res = val;
+   }
    res.res2    = val2;
    return res;
 }

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

@@ -286,12 +286,16 @@
 static
 Bool eq_SyscallStatus ( SyscallStatus* s1, SyscallStatus* s2 )
 {
+//VG_(printf)( "eq_SyscallStatus: what %d %d res %ld %ld res2 %ld %ld err %ld %ld\n", s1->what, s2->what, s1->sres.res, s2->sres.res, s1->sres.res2, s2->sres.res2, s1->sres.err, s2->sres.err);
    return s1->what == s2->what 
           && s1->sres.res == s2->sres.res
 #if defined(VGO_freebsd)
           && s1->sres.res2 == s2->sres.res2
 #endif
-          && s1->sres.err == s2->sres.err;
+#if !defined(VGO_freebsd)	/* getSyscallStatusFromMumble is out of sync */
+          && s1->sres.err == s2->sres.err
+#endif
+          && s1->sres.isError == s2->sres.isError;
 }
 
 
@@ -410,7 +414,7 @@
     * Blindly copy 8 arguments from the stack. Valgrind checks
     * for initialized-ness elsewhere.
     */
-   memcpy(&canonical->arg1, &argv[1], 8 * sizeof(UWord));
+   VG_(memcpy)(&canonical->arg1, &argv[1], 8 * sizeof(UWord));
 
 #else
 #  error "getSyscallArgsFromGuestState: unknown arch"
@@ -536,8 +540,7 @@
 #elif defined(VGP_x86_freebsd)
    VexGuestX86State* gst = (VexGuestX86State*)gst_vanilla;
    canonical->what = SsComplete;
-   canonical->sres.res  = (UWord)gst->guest_EAX;
-   canonical->sres.res2 = (UWord)gst->guest_EDX;
+   canonical->sres = VG_(mk_SysRes_x86_freebsd)( gst->guest_EAX, gst->guest_EDX, LibVEX_GuestX86_get_eflags(gst));
 
 #elif defined(VGP_amd64_freebsd)
    VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;



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