PERFORCE change 167582 for review
Stanislav Sedov
stas at FreeBSD.org
Fri Aug 21 19:35:17 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167582
Change 167582 by stas at stas_yandex on 2009/08/21 19:34:58
- Add addtional filed to SyscallArgs to store the syscall type instead
of encoding it in high bits of syscall word as it breaks valgrind.
Affected files ...
.. //depot/projects/valgrind/coregrind/m_signals.c#12 edit
.. //depot/projects/valgrind/coregrind/m_syscall.c#12 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/priv_types_n_macros.h#10 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-amd64-freebsd.c#11 edit
.. //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#17 edit
.. //depot/projects/valgrind/coregrind/m_vkiscnums.c#3 edit
.. //depot/projects/valgrind/include/pub_tool_basics.h#6 edit
.. //depot/projects/valgrind/include/vki/vki-scnums-freebsd.h#6 edit
Differences ...
==== //depot/projects/valgrind/coregrind/m_signals.c#12 (text+ko) ====
@@ -507,7 +507,7 @@
# define VG_UCONTEXT_SYSCALL_SYSRES(uc) \
/* Convert the value in uc_mcontext.eax into a SysRes. */ \
VG_(mk_SysRes_x86_freebsd)( (uc)->uc_mcontext.eax, \
- (uc)->uc_mcontext.edx, (uc)->uc_mcontext.eflags )
+ (uc)->uc_mcontext.edx, ((uc)->uc_mcontext.eflags & 1) != 0 ? True : False)
# define VG_UCONTEXT_LINK_REG(uc) 0 /* What is an LR for anyway? */
#elif defined(VGP_amd64_freebsd)
@@ -518,7 +518,7 @@
# define VG_UCONTEXT_SYSCALL_SYSRES(uc) \
/* Convert the value in uc_mcontext.rax into a SysRes. */ \
VG_(mk_SysRes_amd64_freebsd)( (uc)->uc_mcontext.rax, \
- (uc)->uc_mcontext.rdx, (uc)->uc_mcontext.rflags )
+ (uc)->uc_mcontext.rdx, ((uc)->uc_mcontext.rflags & 1) != 0 ? True : False )
# define VG_UCONTEXT_LINK_REG(uc) 0 /* No LR on amd64 either */
#else
# error Unknown platform
==== //depot/projects/valgrind/coregrind/m_syscall.c#12 (text+ko) ====
@@ -818,7 +818,7 @@
UInt err = 0;
val = do_syscall_WRK(sysno, a1, a2, a3, a4, a5,
a6, a7, a8, &err);
- return VG_(mk_SysRes_x86_freebsd)( (UInt)val, (UInt)(val>>32), err);
+ return VG_(mk_SysRes_x86_freebsd)( (UInt)val, (UInt)(val>>32), (err & 1) != 0 ? True : False);
# elif defined(VGP_amd64_freebsd)
UWord val;
@@ -826,7 +826,7 @@
UInt err = 0;
val = do_syscall_WRK(sysno, a1, a2, a3, a4, a5,
a6, a7, a8, &err, &val2);
- return VG_(mk_SysRes_amd64_freebsd)( val, val2, err ? True : False);
+ return VG_(mk_SysRes_amd64_freebsd)( val, val2, (err & 1) != 0 ? True : False);
# elif defined(VGP_ppc32_linux)
ULong ret = do_syscall_WRK(sysno,a1,a2,a3,a4,a5,a6);
==== //depot/projects/valgrind/coregrind/m_syswrap/priv_types_n_macros.h#10 (text+ko) ====
@@ -50,6 +50,7 @@
/* Arguments for a syscall. */
typedef
struct SyscallArgs {
+ Word class;
Word sysno;
UWord arg1;
UWord arg2;
@@ -291,11 +292,11 @@
# define GENX_(sysno, name) WRAPPER_ENTRY_X_(generic, sysno, name)
# define GENXY(sysno, name) WRAPPER_ENTRY_XY(generic, sysno, name)
#elif defined(VGO_freebsd)
-# define GENX_(sysno, name) WRAPPER_ENTRY_X_(generic, VG_FREEBSD_SYSNO_INDEX(sysno), name)
-# define GENXY(sysno, name) WRAPPER_ENTRY_XY(generic, VG_FREEBSD_SYSNO_INDEX(sysno), name)
+# define GENX_(sysno, name) WRAPPER_ENTRY_X_(generic, sysno, name)
+# define GENXY(sysno, name) WRAPPER_ENTRY_XY(generic, sysno, name)
#elif defined(VGO_darwin)
-# define GENX_(sysno, name) WRAPPER_ENTRY_X_(generic, VG_DARWIN_SYSNO_INDEX(sysno), name)
-# define GENXY(sysno, name) WRAPPER_ENTRY_XY(generic, VG_DARWIN_SYSNO_INDEX(sysno), name)
+# define GENX_(sysno, name) WRAPPER_ENTRY_X_(generic, sysno, name)
+# define GENXY(sysno, name) WRAPPER_ENTRY_XY(generic, sysno, name)
#else
# error Unknown OS
#endif
==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-amd64-freebsd.c#11 (text+ko) ====
@@ -299,7 +299,7 @@
driver logic copies it back unchanged. Also, note %EAX is of
the guest registers written by VG_(sigframe_destroy). */
rflags = LibVEX_GuestAMD64_get_rflags(&tst->arch.vex);
- SET_STATUS_from_SysRes( VG_(mk_SysRes_amd64_freebsd)( tst->arch.vex.guest_RAX, tst->arch.vex.guest_RDX, rflags ) );
+ SET_STATUS_from_SysRes( VG_(mk_SysRes_amd64_freebsd)( tst->arch.vex.guest_RAX, tst->arch.vex.guest_RDX, (rflags & 1) != 0 ? True : False) );
/* Check to see if some any signals arose as a result of this. */
*flags |= SfPollAfter;
==== //depot/projects/valgrind/coregrind/m_syswrap/syswrap-main.c#17 (text+ko) ====
@@ -394,7 +394,6 @@
static
Bool eq_SyscallStatus ( SyscallStatus* s1, SyscallStatus* s2 )
{
- /* was: return s1->what == s2->what && sr_EQ( s1->sres, s2->sres ); */
if (s1->what == s2->what && sr_EQ( s1->sres, s2->sres ))
return True;
# if defined(VGO_darwin)
@@ -484,15 +483,18 @@
// FreeBSD supports different calling conventions
switch (gst->guest_EAX) {
case __NR_syscall:
- canonical->sysno = VG_FREEBSD_SYSCALL_CONSTRUCT(VG_FREEBSD_SYSCALL0, stack[1]);
+ canonical->class = VG_FREEBSD_SYSCALL0;
+ canonical->sysno = stack[1];
stack += 1;
break;
case __NR___syscall:
- canonical->sysno = VG_FREEBSD_SYSCALL_CONSTRUCT(VG_FREEBSD_SYSCALL198, stack[1]);
+ canonical->class = VG_FREEBSD_SYSCALL198;
+ canonical->sysno = stack[1];
stack += 2;
break;
default:
- canonical->sysno = VG_FREEBSD_SYSCALL_CONSTRUCT(0, gst->guest_EAX);
+ canonical->class = 0;
+ canonical->sysno = gst->guest_EAX;
break;
}
// stack[0] is a (fake) return address
@@ -512,15 +514,16 @@
// FreeBSD supports different calling conventions
switch (gst->guest_RAX) {
case __NR_syscall:
- canonical->sysno = VG_FREEBSD_SYSCALL_CONSTRUCT(VG_FREEBSD_SYSCALL0,
- gst->guest_RDI);
+ canonical->class = VG_FREEBSD_SYSCALL0;
+ canonical->sysno = gst->guest_RDI;
break;
case __NR___syscall:
- canonical->sysno = VG_FREEBSD_SYSCALL_CONSTRUCT(VG_FREEBSD_SYSCALL198,
- gst->guest_RDI);
+ canonical->class = VG_FREEBSD_SYSCALL198;
+ canonical->sysno = gst->guest_RDI;
break;
default:
- canonical->sysno = VG_FREEBSD_SYSCALL_CONSTRUCT(0, gst->guest_RAX);
+ canonical->class = 0;
+ canonical->sysno = gst->guest_RAX;
break;
}
// stack[0] is a (fake) return address
@@ -743,19 +746,19 @@
UWord *stack = (UWord *)gst->guest_ESP;
// stack[0] is a (fake) return address
- switch (VG_FREEBSD_SYSNO_CLASS(canonical->sysno)) {
+ switch (canonical->class) {
case VG_FREEBSD_SYSCALL0:
gst->guest_EAX = __NR_syscall;
- stack[1] = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
+ stack[1] = canonical->sysno;
stack++;
break;
case VG_FREEBSD_SYSCALL198:
gst->guest_EAX = __NR___syscall;
- stack[1] = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
+ stack[1] = canonical->sysno;
stack += 2;
break;
default:
- gst->guest_EAX = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
+ gst->guest_EAX = canonical->sysno;
break;
}
stack[1] = canonical->arg1;
@@ -772,10 +775,10 @@
UWord *stack = (UWord *)gst->guest_RSP;
// stack[0] is a (fake) return address
- switch (VG_FREEBSD_SYSNO_CLASS(canonical->sysno)) {
+ switch (canonical->class) {
case VG_FREEBSD_SYSCALL0:
gst->guest_RAX = __NR_syscall;
- gst->guest_RDI = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
+ gst->guest_RDI = canonical->sysno;
gst->guest_RSI = canonical->arg1;
gst->guest_RDX = canonical->arg2;
gst->guest_R10 = canonical->arg3;
@@ -787,7 +790,7 @@
break;
case VG_FREEBSD_SYSCALL198:
gst->guest_RAX = __NR___syscall;
- gst->guest_RDI = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
+ gst->guest_RDI = canonical->sysno;
gst->guest_RSI = canonical->arg1;
gst->guest_RDX = canonical->arg2;
gst->guest_R10 = canonical->arg3;
@@ -798,7 +801,7 @@
stack[3] = canonical->arg8;
break;
default:
- gst->guest_RAX = VG_FREEBSD_SYSNO_INDEX(canonical->sysno);
+ gst->guest_RAX = canonical->sysno;
gst->guest_RDI = canonical->arg1;
gst->guest_RSI = canonical->arg2;
gst->guest_RDX = canonical->arg3;
@@ -907,7 +910,7 @@
UInt flags = LibVEX_GuestX86_get_eflags(gst);
canonical->sres = VG_(mk_SysRes_x86_freebsd)(gst->guest_EAX, gst->guest_EDX,
- flags);
+ (flags & 1) != 0 ? True : False);
canonical->what = SsComplete;
# elif defined(VGP_amd64_freebsd)
@@ -915,7 +918,7 @@
VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;
ULong flags = LibVEX_GuestAMD64_get_rflags(gst);
canonical->sres = VG_(mk_SysRes_amd64_freebsd)(gst->guest_RAX, gst->guest_RDX,
- flags);
+ (flags & 1) != 0 ? True : False);
canonical->what = SsComplete;
# elif defined(VGP_ppc32_aix5)
==== //depot/projects/valgrind/coregrind/m_vkiscnums.c#3 (text+ko) ====
@@ -76,7 +76,7 @@
Char* VG_(sysnum_string)(Word sysnum, SizeT n_buf, Char* buf)
{
- VG_(snprintf)(buf, n_buf, "%3ld", VG_FREEBSD_SYSNO_INDEX(sysnum));
+ VG_(snprintf)(buf, n_buf, "%3ld", sysnum);
return buf;
}
==== //depot/projects/valgrind/include/pub_tool_basics.h#6 (text+ko) ====
@@ -253,10 +253,10 @@
return sr._isError ? sr._val : 0;
}
static inline Bool sr_EQ ( SysRes sr1, SysRes sr2 ) {
- return sr1._val == sr2._val
- && sr1._val2 == sr2._val2
- && ((sr1._isError && sr2._isError)
- || (!sr1._isError && !sr2._isError));
+ return sr_Res(sr1) == sr_Res(sr2)
+ && sr_ResHI(sr1) == sr_ResHI(sr2)
+ && ((sr_isError(sr1) && sr_isError(sr2))
+ || (!sr_isError(sr1) && !sr_isError(sr2)));
}
#elif defined(VGO_aix5)
==== //depot/projects/valgrind/include/vki/vki-scnums-freebsd.h#6 (text+ko) ====
@@ -27,20 +27,10 @@
#ifndef __VKI_UNISTD_FREEBSD_H
#define __VKI_UNISTD_FREEBSD_H
-#define VG_FREEBSD_SYSCALL_CLASS_SHIFT 16
-#define VG_FREEBSD_SYSCALL_CLASS_MASK 0xFFFF
-#define VG_FREEBSD_SYSCALL_NUMBER_MASK 0xFFFF
-
+#define VG_FREEBSD_SYSCALL_STD 0
#define VG_FREEBSD_SYSCALL0 1
#define VG_FREEBSD_SYSCALL198 2
-#define VG_FREEBSD_SYSCALL_CONSTRUCT(class, sysno) \
- ((class << VG_FREEBSD_SYSCALL_CLASS_SHIFT) | sysno )
-
-#define VG_FREEBSD_SYSNO_INDEX(sysno) ((sysno) & VG_FREEBSD_SYSCALL_NUMBER_MASK)
-#define VG_FREEBSD_SYSNO_CLASS(sysno) \
- (((sysno) >> VG_FREEBSD_SYSCALL_CLASS_SHIFT) & VG_FREEBSD_SYSCALL_CLASS_MASK)
-
// From sys/syscall.h
#define __NR_syscall 0
More information about the p4-projects
mailing list