|
From: <sv...@va...> - 2009-04-05 10:29:00
|
Author: sewardj
Date: 2009-04-05 11:28:46 +0100 (Sun, 05 Apr 2009)
New Revision: 9517
Log:
Unbreak the 64-bit build following recent SysRes/syscall hackery, so
it now builds again on 64-bit Darwin and can run small programs.
Support for syscalls interrupted by signals is still lacking, but
fixing it is mostly a case of enabling the __NR___pthread_sigmask
calls in syscall-amd64-darwin.S, fixing
ML_(fixup_guest_state_to_restart_syscall), and setting IP_AT_SYSCALL
in the Vex front end for amd64.
Modified:
branches/DARWIN/coregrind/m_signals.c
branches/DARWIN/coregrind/m_syscall.c
branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S
branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c
branches/DARWIN/coregrind/m_syswrap/syswrap-main.c
branches/DARWIN/coregrind/m_vki.c
branches/DARWIN/coregrind/pub_core_syscall.h
branches/DARWIN/include/pub_tool_basics.h
Modified: branches/DARWIN/coregrind/m_signals.c
===================================================================
--- branches/DARWIN/coregrind/m_signals.c 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/m_signals.c 2009-04-05 10:28:46 UTC (rev 9517)
@@ -370,7 +370,8 @@
static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) {
I_die_here;
}
- static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV ) {
+ static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV,
+ UWord scclass ) {
I_die_here;
}
static inline Addr VG_UCONTEXT_LINK_REG( void* ucV ) {
Modified: branches/DARWIN/coregrind/m_syscall.c
===================================================================
--- branches/DARWIN/coregrind/m_syscall.c 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/m_syscall.c 2009-04-05 10:28:46 UTC (rev 9517)
@@ -192,22 +192,37 @@
return res;
}
-static SysRes mk_SysRes_amd64_darwin ( UWord val, UWord val2, UWord errflag ) {
- I_die_here;
- /*
+SysRes VG_(mk_SysRes_amd64_darwin) ( UChar scclass, Bool isErr,
+ ULong wHI, ULong wLO )
+{
SysRes res;
- res.isError = errflag != 0;
- if (res.isError) {
- res.err = val;
- res.res = 0;
- res.res2 = 0;
- } else {
- res.err = 0;
- res.res = val;
- res.res2 = val2;
+ res._wHI = 0;
+ res._wLO = 0;
+ res._mode = 0; /* invalid */
+ vg_assert(isErr == False || isErr == True);
+ vg_assert(sizeof(UWord) == sizeof(ULong));
+ switch (scclass) {
+ case VG_DARWIN_SYSCALL_CLASS_UNIX:
+ res._wLO = wLO;
+ res._wHI = wHI;
+ res._mode = isErr ? SysRes_UNIX_ERR : SysRes_UNIX_OK;
+ break;
+ case VG_DARWIN_SYSCALL_CLASS_MACH:
+ vg_assert(!isErr);
+ vg_assert(wHI == 0);
+ res._wLO = wLO;
+ res._mode = SysRes_MACH;
+ break;
+ case VG_DARWIN_SYSCALL_CLASS_MDEP:
+ vg_assert(!isErr);
+ vg_assert(wHI == 0);
+ res._wLO = wLO;
+ res._mode = SysRes_MDEP;
+ break;
+ default:
+ vg_assert(0);
}
return res;
- */
}
/* Generic constructors. We assume (without checking if this makes
@@ -559,6 +574,8 @@
Error:
* MACH,MDEP: no error is returned
* UNIX: the carry flag indicates success or failure
+
+ nb here, sizeof(UWord) == sizeof(UInt)
*/
__private_extern__ ULong
@@ -616,13 +633,15 @@
The kernel's syscall calling convention is:
* the syscall number goes in rax
* the args are passed to the syscall in registers and the stack
- * the call instruction is `syscall`
+ * the call instruction is 'syscall'
Return value:
* MACH,MDEP: the return value comes back in rax
- * UNIX: the return value comes back in rdx:rax
+ * UNIX: the return value comes back in rdx:rax (hi64:lo64)
Error:
* MACH,MDEP: no error is returned
* UNIX: the carry flag indicates success or failure
+
+ nb here, sizeof(UWord) == sizeof(ULong)
*/
__private_extern__ UWord
@@ -630,8 +649,8 @@
UWord a4, UWord a5, UWord a6, /* rcx, r8, r9 */
UWord a7, UWord a8, /* 8(rsp), 16(rsp) */
UWord syscall_no, /* 24(rsp) */
- /*OUT*/UWord *errflag, /* 32(rsp) */
- /*OUT*/UWord *res2 ); /* 40(rsp) */
+ /*OUT*/ULong* errflag, /* 32(rsp) */
+ /*OUT*/ULong* res2 ); /* 40(rsp) */
// Unix syscall: 128-bit return in rax:rdx, with LSB in rax
// error indicated by carry flag: clear=good, set=bad
asm(".private_extern _do_syscall_unix_WRK\n"
@@ -767,18 +786,16 @@
return VG_(mk_SysRes_x86_darwin)( scclass, err ? True : False, wHI, wLO );
# elif defined(VGP_amd64_darwin)
- UWord err = 0;
- UWord val = 0, val2 = 0;
+ ULong wLO = 0, wHI = 0, err = 0;
UChar scclass = VG_DARWIN_SYSNO_CLASS(sysno);
- switch (VG_DARWIN_SYSNO_CLASS(sysno)) {
+ switch (scclass) {
case VG_DARWIN_SYSCALL_CLASS_UNIX:
- case VG_DARWIN_SYSCALL_CLASS_UX64:
- val = do_syscall_unix_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
- VG_DARWIN_SYSNO_NUM(sysno), &err, &val2);
+ wLO = do_syscall_unix_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
+ VG_DARWIN_SYSNO_NUM(sysno), &err, &wHI);
break;
case VG_DARWIN_SYSCALL_CLASS_MACH:
case VG_DARWIN_SYSCALL_CLASS_MDEP:
- val = do_syscall_mach_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
+ wLO = do_syscall_mach_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
VG_DARWIN_SYSNO_NUM(sysno));
err = 0;
break;
@@ -786,8 +803,8 @@
vg_assert(0);
break;
}
- return mk_SysRes_amd64_darwin( val, val2, err );
-
+ return VG_(mk_SysRes_amd64_darwin)( scclass, err ? True : False, wHI, wLO );
+
#else
# error Unknown platform
#endif
Modified: branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S 2009-04-05 10:28:46 UTC (rev 9517)
@@ -67,11 +67,12 @@
const vki_sigset_t *sysmask, // rdx
const vki_sigset_t *postmask, // rcx
Int sigsetSzB) // r8
-
+
+ Note that sigsetSzB is totally ignored (and irrelevant).
*/
/* from vki_arch.h */
-#define VKI_SIG_SETMASK 2
+#define VKI_SIG_SETMASK 3
/* DO_SYSCALL MACH|MDEP|UNIX */
#define MACH 1
@@ -92,7 +93,7 @@
L_$0_1: /* Even though we can't take a signal until the sigprocmask completes,
start the range early.
- If eip is in the range [1,2), the syscall hasn't been started yet */
+ If rip is in the range [1,2), the syscall hasn't been started yet */
/* Set the signal mask which should be current during the syscall. */
/* GrP fixme signals
@@ -195,10 +196,6 @@
_ML_(do_syscall_for_client_unix_WRK):
DO_SYSCALL UNIX
-.globl _ML_(do_syscall_for_client_ux64_WRK)
-_ML_(do_syscall_for_client_ux64_WRK):
- jmp _ML_(do_syscall_for_client_unix_WRK)
-
.globl _ML_(do_syscall_for_client_mach_WRK)
_ML_(do_syscall_for_client_mach_WRK):
DO_SYSCALL MACH
@@ -212,18 +209,45 @@
VG_(fixup_guest_state_after_syscall_interrupted) can do the
right thing */
-/* GrP fixme wrong */
-.globl _ML_(blksys_setup)
-.globl _ML_(blksys_restart)
-.globl _ML_(blksys_complete)
-.globl _ML_(blksys_committed)
-.globl _ML_(blksys_finished)
-_ML_(blksys_setup): .quad L_1_1
-_ML_(blksys_restart): .quad L_1_2
-_ML_(blksys_complete): .quad L_1_3
-_ML_(blksys_committed): .quad L_1_4
-_ML_(blksys_finished): .quad L_1_5
+/* eg MK_L_SCLASS_N(UNIX,99) produces L_3_99
+ since UNIX is #defined to 3 at the top of this file */
+#define FOO(scclass,labelno) L_##scclass##_##labelno
+#define MK_L_SCCLASS_N(scclass,labelno) FOO(scclass,labelno)
+.globl _ML_(blksys_setup_MACH)
+.globl _ML_(blksys_restart_MACH)
+.globl _ML_(blksys_complete_MACH)
+.globl _ML_(blksys_committed_MACH)
+.globl _ML_(blksys_finished_MACH)
+_ML_(blksys_setup_MACH): .quad MK_L_SCCLASS_N(MACH,1)
+_ML_(blksys_restart_MACH): .quad MK_L_SCCLASS_N(MACH,2)
+_ML_(blksys_complete_MACH): .quad MK_L_SCCLASS_N(MACH,3)
+_ML_(blksys_committed_MACH): .quad MK_L_SCCLASS_N(MACH,4)
+_ML_(blksys_finished_MACH): .quad MK_L_SCCLASS_N(MACH,5)
+
+.globl _ML_(blksys_setup_MDEP)
+.globl _ML_(blksys_restart_MDEP)
+.globl _ML_(blksys_complete_MDEP)
+.globl _ML_(blksys_committed_MDEP)
+.globl _ML_(blksys_finished_MDEP)
+_ML_(blksys_setup_MDEP): .quad MK_L_SCCLASS_N(MDEP,1)
+_ML_(blksys_restart_MDEP): .quad MK_L_SCCLASS_N(MDEP,2)
+_ML_(blksys_complete_MDEP): .quad MK_L_SCCLASS_N(MDEP,3)
+_ML_(blksys_committed_MDEP): .quad MK_L_SCCLASS_N(MDEP,4)
+_ML_(blksys_finished_MDEP): .quad MK_L_SCCLASS_N(MDEP,5)
+
+.globl _ML_(blksys_setup_UNIX)
+.globl _ML_(blksys_restart_UNIX)
+.globl _ML_(blksys_complete_UNIX)
+.globl _ML_(blksys_committed_UNIX)
+.globl _ML_(blksys_finished_UNIX)
+_ML_(blksys_setup_UNIX): .quad MK_L_SCCLASS_N(UNIX,1)
+_ML_(blksys_restart_UNIX): .quad MK_L_SCCLASS_N(UNIX,2)
+_ML_(blksys_complete_UNIX): .quad MK_L_SCCLASS_N(UNIX,3)
+_ML_(blksys_committed_UNIX): .quad MK_L_SCCLASS_N(UNIX,4)
+_ML_(blksys_finished_UNIX): .quad MK_L_SCCLASS_N(UNIX,5)
+
+
/*--------------------------------------------------------------------*/
/*--- end ---*/
/*--------------------------------------------------------------------*/
Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c 2009-04-05 10:28:46 UTC (rev 9517)
@@ -6854,7 +6854,14 @@
ThreadState *tst = VG_(get_ThreadState)(tid);
tst->os_state.pthread = ARG1;
tst->arch.vex.guest_GS_0x60 = ARG1;
- SET_STATUS_Success(0x60);
+ // SET_STATUS_Success(0x60);
+ // see comments on x86 case just above
+ SET_STATUS_from_SysRes(
+ VG_(mk_SysRes_amd64_darwin)(
+ VG_DARWIN_SYSNO_CLASS(__NR_pthread_set_self),
+ False, 0, 0x60
+ )
+ );
}
#else
Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-main.c
===================================================================
--- branches/DARWIN/coregrind/m_syswrap/syswrap-main.c 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/m_syswrap/syswrap-main.c 2009-04-05 10:28:46 UTC (rev 9517)
@@ -79,12 +79,12 @@
Mach traps: result is in r3, and there is no error flag.
ppc64 r0 r3 r4 r5 r6 r7 r8 ?? ?? r3+CR0.SO (== ARG1)
x86 eax +4 +8 +12 +16 +20 +24 +28 +32 edx:eax, eflags.c
- amd64 rax rdi rsi rdx rcx r8 r9 stk stk edx:eax, eflags.c
+ amd64 rax rdi rsi rdx rcx r8 r9 +8 +16 rdx:rax, rflags.c
- For x86-darwin, "+N" denotes "in memory at N(%esp)". Apparently
- 0(%esp) is some kind of return address (perhaps for syscalls done
- with "sysenter"?) I don't think it is relevant for syscalls done
- with "int $0x80/1/2".
+ For x86-darwin, "+N" denotes "in memory at N(%esp)"; ditto
+ amd64-darwin. Apparently 0(%esp) is some kind of return address
+ (perhaps for syscalls done with "sysenter"?) I don't think it is
+ relevant for syscalls done with "int $0x80/1/2".
*/
/* This is the top level of the system-call handler module. All
@@ -595,7 +595,7 @@
canonical->arg7 = stack[2];
canonical->arg8 = stack[3];
- PRINT("SYSCALL[%d,?](%5lld) syscall(#%x, ...); please stand by...\n",
+ PRINT("SYSCALL[%d,?](%5lld) syscall(#%lx, ...); please stand by...\n",
VG_(getpid)(), /*tid,*/ (Long)0,
VG_DARWIN_SYSNO_PRINT(canonical->sysno));
}
@@ -787,53 +787,35 @@
canonical->what = SsComplete;
# elif defined(VGP_amd64_darwin)
+ /* duplicates logic in m_signals.VG_UCONTEXT_SYSCALL_SYSRES */
VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;
- UInt carry = 1 & LibVEX_GuestAMD64_get_rflags(gst);
- UInt err;
- UWord val;
- UWord val2;
-
+ ULong carry = 1 & LibVEX_GuestAMD64_get_rflags(gst);
+ ULong err = 0;
+ ULong wLO = 0;
+ ULong wHI = 0;
switch (gst->guest_SC_CLASS) {
- case VG_DARWIN_SYSCALL_CLASS_UX64:
- // int $0x80 = Unix, 128-bit result
- err = carry;
- val = gst->guest_RAX;
- val2 = gst->guest_RDX;
- break;
- case VG_DARWIN_SYSCALL_CLASS_UNIX:
- // syscall = Unix, 64-bit result
- err = carry;
- val = gst->guest_RAX;
- val2 = 0;
- break;
- case VG_DARWIN_SYSCALL_CLASS_MACH:
- // int $0x81 = Mach, 64-bit result
- err = 0;
- val = gst->guest_RAX;
- val2 = 0;
- break;
- case VG_DARWIN_SYSCALL_CLASS_MDEP:
- // int $0x82 = mdep, 64-bit result
- err = 0;
- val = gst->guest_RAX;
- val2 = 0;
- break;
- default:
- vg_assert(0);
- break;
+ case VG_DARWIN_SYSCALL_CLASS_UNIX:
+ // syscall = Unix, 128-bit result
+ err = carry;
+ wLO = gst->guest_RAX;
+ wHI = gst->guest_RDX;
+ break;
+ case VG_DARWIN_SYSCALL_CLASS_MACH:
+ // syscall = Mach, 64-bit result
+ wLO = gst->guest_RAX;
+ break;
+ case VG_DARWIN_SYSCALL_CLASS_MDEP:
+ // syscall = mdep, 64-bit result
+ wLO = gst->guest_RAX;
+ break;
+ default:
+ vg_assert(0);
+ break;
}
-
- if (err) {
- canonical->sres.isError = True;
- canonical->sres.res = 0;
- canonical->sres.res2 = 0;
- canonical->sres.err = val;
- } else {
- canonical->sres.isError = False;
- canonical->sres.res = val;
- canonical->sres.res2 = val2;
- canonical->sres.err = 0;
- }
+ canonical->sres = VG_(mk_SysRes_amd64_darwin)(
+ gst->guest_SC_CLASS, err ? True : False,
+ wHI, wLO
+ );
canonical->what = SsComplete;
# else
@@ -935,8 +917,7 @@
SysRes sres = canonical->sres;
vg_assert(canonical->what == SsComplete);
/* Unfortunately here we have to break abstraction and look
- directly inside 'res', in order to decide what to do. There are
- 6 cases (yuck). */
+ directly inside 'res', in order to decide what to do. */
switch (sres._mode) {
case SysRes_MACH: // int $0x81 = Mach, 32-bit result
case SysRes_MDEP: // int $0x82 = mdep, 32-bit result
@@ -966,39 +947,35 @@
#elif defined(VGP_amd64_darwin)
VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;
- UWord val =
- canonical->sres.isError ? canonical->sres.err : canonical->sres.res;
+ SysRes sres = canonical->sres;
vg_assert(canonical->what == SsComplete);
-
- switch (gst->guest_SC_CLASS) {
- case VG_DARWIN_SYSCALL_CLASS_UNIX:
- // syscall = Unix, 32-bit result
- if (!canonical->sres.isError) gst->guest_RDX = canonical->sres.res2;
- VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
- OFFSET_amd64_RDX, sizeof(UWord) );
- gst->guest_RAX = val;
- LibVEX_GuestAMD64_put_rflag_c(canonical->sres.isError, gst);
- VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
- OFFSET_amd64_RAX, sizeof(UWord) );
- // fixme sets defined for entire rflags, not just bit c
- VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
- offsetof(VexGuestAMD64State, guest_CC_DEP1), sizeof(ULong) );
- break;
- case VG_DARWIN_SYSCALL_CLASS_MACH:
- // int $0x81 = Mach, 32-bit result
- gst->guest_RAX = val;
- VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
- OFFSET_amd64_RAX, sizeof(UWord) );
- break;
- case VG_DARWIN_SYSCALL_CLASS_MDEP:
- // int $0x82 = mdep, 32-bit result
- gst->guest_RAX = val;
- VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
- OFFSET_amd64_RAX, sizeof(UWord) );
- break;
- default:
- vg_assert(0);
- break;
+ /* Unfortunately here we have to break abstraction and look
+ directly inside 'res', in order to decide what to do. */
+ switch (sres._mode) {
+ case SysRes_MACH: // syscall = Mach, 64-bit result
+ case SysRes_MDEP: // syscall = mdep, 64-bit result
+ gst->guest_RAX = sres._wLO;
+ VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
+ OFFSET_amd64_RAX, sizeof(ULong) );
+ break;
+ case SysRes_UNIX_OK: // syscall = Unix, 128-bit result
+ case SysRes_UNIX_ERR: // syscall = Unix, 128-bit error
+ gst->guest_RAX = sres._wLO;
+ VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
+ OFFSET_amd64_RAX, sizeof(ULong) );
+ gst->guest_RDX = sres._wHI;
+ VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
+ OFFSET_amd64_RDX, sizeof(ULong) );
+ LibVEX_GuestAMD64_put_rflag_c( sres._mode==SysRes_UNIX_ERR ? 1 : 0,
+ gst );
+ // fixme sets defined for entire rflags, not just bit c
+ // DDD: this breaks exp-ptrcheck.
+ VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
+ offsetof(VexGuestAMD64State, guest_CC_DEP1), sizeof(ULong) );
+ break;
+ default:
+ vg_assert(0);
+ break;
}
# else
Modified: branches/DARWIN/coregrind/m_vki.c
===================================================================
--- branches/DARWIN/coregrind/m_vki.c 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/m_vki.c 2009-04-05 10:28:46 UTC (rev 9517)
@@ -123,7 +123,8 @@
# endif
}
/* also .. */
- /* VKI_SET_SIGMASK is hardwired into syscall-x86-darwin.S */
+ /* VKI_SET_SIGMASK is hardwired into syscall-x86-darwin.S and
+ syscall-amd64-darwin.S */
vg_assert(VKI_SIG_SETMASK == 3);
# else
Modified: branches/DARWIN/coregrind/pub_core_syscall.h
===================================================================
--- branches/DARWIN/coregrind/pub_core_syscall.h 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/coregrind/pub_core_syscall.h 2009-04-05 10:28:46 UTC (rev 9517)
@@ -77,7 +77,8 @@
extern SysRes VG_(mk_SysRes_ppc64_aix5) ( ULong val, ULong err );
extern SysRes VG_(mk_SysRes_x86_darwin) ( UChar scclass, Bool isErr,
UInt wHI, UInt wLO );
-//extern SysRes VG_(mk_SysRes_amd64_darwin) ( UWord val, UWord val2, UWord err );
+extern SysRes VG_(mk_SysRes_amd64_darwin)( UChar scclass, Bool isErr,
+ ULong wHI, ULong wLO );
extern SysRes VG_(mk_SysRes_Error) ( UWord val );
extern SysRes VG_(mk_SysRes_Success) ( UWord val );
Modified: branches/DARWIN/include/pub_tool_basics.h
===================================================================
--- branches/DARWIN/include/pub_tool_basics.h 2009-04-04 15:14:55 UTC (rev 9516)
+++ branches/DARWIN/include/pub_tool_basics.h 2009-04-05 10:28:46 UTC (rev 9517)
@@ -156,8 +156,8 @@
When _mode is SysRes_UNIX_ERR, _wHI:_wLO holds the error code.
Probably the high word of an error is always ignored by
userspace, but we have to record it, so that we can correctly
- update both EDX and EAX (in guest state) given a SysRes, if
- we're required to.
+ update both {R,E}DX and {R,E}AX (in guest state) given a SysRes,
+ if we're required to.
*/
#if defined(VGO_linux)
typedef
|
|
From: Filipe C. <fi...@gm...> - 2009-04-05 11:11:15
|
Hi,
How can I enable a 64bit build in darwin? I even tried
--enable-only64bit but it would only build a 32bit binary:
Maximum build arch: x86
Primary build arch: x86
Build OS: darwin
Primary build target: X86_DARWIN
Secondary build target:
How can I make it build a 64bit version? (Or one with both arches)
Regards,
F
P.S: configure line: ./configure --prefix=/Users/filcab/valgrind/
--enable-only64bit
sv...@va... wrote:
> Author: sewardj
> Date: 2009-04-05 11:28:46 +0100 (Sun, 05 Apr 2009)
> New Revision: 9517
>
> Log:
> Unbreak the 64-bit build following recent SysRes/syscall hackery, so
> it now builds again on 64-bit Darwin and can run small programs.
> Support for syscalls interrupted by signals is still lacking, but
> fixing it is mostly a case of enabling the __NR___pthread_sigmask
> calls in syscall-amd64-darwin.S, fixing
> ML_(fixup_guest_state_to_restart_syscall), and setting IP_AT_SYSCALL
> in the Vex front end for amd64.
>
>
>
> Modified:
> branches/DARWIN/coregrind/m_signals.c
> branches/DARWIN/coregrind/m_syscall.c
> branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S
> branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c
> branches/DARWIN/coregrind/m_syswrap/syswrap-main.c
> branches/DARWIN/coregrind/m_vki.c
> branches/DARWIN/coregrind/pub_core_syscall.h
> branches/DARWIN/include/pub_tool_basics.h
>
>
> Modified: branches/DARWIN/coregrind/m_signals.c
> ===================================================================
> --- branches/DARWIN/coregrind/m_signals.c 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/m_signals.c 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -370,7 +370,8 @@
> static inline Addr VG_UCONTEXT_STACK_PTR( void* ucV ) {
> I_die_here;
> }
> - static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV ) {
> + static inline SysRes VG_UCONTEXT_SYSCALL_SYSRES( void* ucV,
> + UWord scclass ) {
> I_die_here;
> }
> static inline Addr VG_UCONTEXT_LINK_REG( void* ucV ) {
>
> Modified: branches/DARWIN/coregrind/m_syscall.c
> ===================================================================
> --- branches/DARWIN/coregrind/m_syscall.c 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/m_syscall.c 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -192,22 +192,37 @@
> return res;
> }
>
> -static SysRes mk_SysRes_amd64_darwin ( UWord val, UWord val2, UWord errflag ) {
> - I_die_here;
> - /*
> +SysRes VG_(mk_SysRes_amd64_darwin) ( UChar scclass, Bool isErr,
> + ULong wHI, ULong wLO )
> +{
> SysRes res;
> - res.isError = errflag != 0;
> - if (res.isError) {
> - res.err = val;
> - res.res = 0;
> - res.res2 = 0;
> - } else {
> - res.err = 0;
> - res.res = val;
> - res.res2 = val2;
> + res._wHI = 0;
> + res._wLO = 0;
> + res._mode = 0; /* invalid */
> + vg_assert(isErr == False || isErr == True);
> + vg_assert(sizeof(UWord) == sizeof(ULong));
> + switch (scclass) {
> + case VG_DARWIN_SYSCALL_CLASS_UNIX:
> + res._wLO = wLO;
> + res._wHI = wHI;
> + res._mode = isErr ? SysRes_UNIX_ERR : SysRes_UNIX_OK;
> + break;
> + case VG_DARWIN_SYSCALL_CLASS_MACH:
> + vg_assert(!isErr);
> + vg_assert(wHI == 0);
> + res._wLO = wLO;
> + res._mode = SysRes_MACH;
> + break;
> + case VG_DARWIN_SYSCALL_CLASS_MDEP:
> + vg_assert(!isErr);
> + vg_assert(wHI == 0);
> + res._wLO = wLO;
> + res._mode = SysRes_MDEP;
> + break;
> + default:
> + vg_assert(0);
> }
> return res;
> - */
> }
>
> /* Generic constructors. We assume (without checking if this makes
> @@ -559,6 +574,8 @@
> Error:
> * MACH,MDEP: no error is returned
> * UNIX: the carry flag indicates success or failure
> +
> + nb here, sizeof(UWord) == sizeof(UInt)
> */
>
> __private_extern__ ULong
> @@ -616,13 +633,15 @@
> The kernel's syscall calling convention is:
> * the syscall number goes in rax
> * the args are passed to the syscall in registers and the stack
> - * the call instruction is `syscall`
> + * the call instruction is 'syscall'
> Return value:
> * MACH,MDEP: the return value comes back in rax
> - * UNIX: the return value comes back in rdx:rax
> + * UNIX: the return value comes back in rdx:rax (hi64:lo64)
> Error:
> * MACH,MDEP: no error is returned
> * UNIX: the carry flag indicates success or failure
> +
> + nb here, sizeof(UWord) == sizeof(ULong)
> */
>
> __private_extern__ UWord
> @@ -630,8 +649,8 @@
> UWord a4, UWord a5, UWord a6, /* rcx, r8, r9 */
> UWord a7, UWord a8, /* 8(rsp), 16(rsp) */
> UWord syscall_no, /* 24(rsp) */
> - /*OUT*/UWord *errflag, /* 32(rsp) */
> - /*OUT*/UWord *res2 ); /* 40(rsp) */
> + /*OUT*/ULong* errflag, /* 32(rsp) */
> + /*OUT*/ULong* res2 ); /* 40(rsp) */
> // Unix syscall: 128-bit return in rax:rdx, with LSB in rax
> // error indicated by carry flag: clear=good, set=bad
> asm(".private_extern _do_syscall_unix_WRK\n"
> @@ -767,18 +786,16 @@
> return VG_(mk_SysRes_x86_darwin)( scclass, err ? True : False, wHI, wLO );
>
> # elif defined(VGP_amd64_darwin)
> - UWord err = 0;
> - UWord val = 0, val2 = 0;
> + ULong wLO = 0, wHI = 0, err = 0;
> UChar scclass = VG_DARWIN_SYSNO_CLASS(sysno);
> - switch (VG_DARWIN_SYSNO_CLASS(sysno)) {
> + switch (scclass) {
> case VG_DARWIN_SYSCALL_CLASS_UNIX:
> - case VG_DARWIN_SYSCALL_CLASS_UX64:
> - val = do_syscall_unix_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
> - VG_DARWIN_SYSNO_NUM(sysno), &err, &val2);
> + wLO = do_syscall_unix_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
> + VG_DARWIN_SYSNO_NUM(sysno), &err, &wHI);
> break;
> case VG_DARWIN_SYSCALL_CLASS_MACH:
> case VG_DARWIN_SYSCALL_CLASS_MDEP:
> - val = do_syscall_mach_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
> + wLO = do_syscall_mach_WRK(a1,a2,a3,a4,a5,a6,a7,a8,
> VG_DARWIN_SYSNO_NUM(sysno));
> err = 0;
> break;
> @@ -786,8 +803,8 @@
> vg_assert(0);
> break;
> }
> - return mk_SysRes_amd64_darwin( val, val2, err );
> -
> + return VG_(mk_SysRes_amd64_darwin)( scclass, err ? True : False, wHI, wLO );
> +
> #else
> # error Unknown platform
> #endif
>
> Modified: branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S
> ===================================================================
> --- branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/m_syswrap/syscall-amd64-darwin.S 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -67,11 +67,12 @@
> const vki_sigset_t *sysmask, // rdx
> const vki_sigset_t *postmask, // rcx
> Int sigsetSzB) // r8
> -
> +
> + Note that sigsetSzB is totally ignored (and irrelevant).
> */
>
> /* from vki_arch.h */
> -#define VKI_SIG_SETMASK 2
> +#define VKI_SIG_SETMASK 3
>
> /* DO_SYSCALL MACH|MDEP|UNIX */
> #define MACH 1
> @@ -92,7 +93,7 @@
>
> L_$0_1: /* Even though we can't take a signal until the sigprocmask completes,
> start the range early.
> - If eip is in the range [1,2), the syscall hasn't been started yet */
> + If rip is in the range [1,2), the syscall hasn't been started yet */
>
> /* Set the signal mask which should be current during the syscall. */
> /* GrP fixme signals
> @@ -195,10 +196,6 @@
> _ML_(do_syscall_for_client_unix_WRK):
> DO_SYSCALL UNIX
>
> -.globl _ML_(do_syscall_for_client_ux64_WRK)
> -_ML_(do_syscall_for_client_ux64_WRK):
> - jmp _ML_(do_syscall_for_client_unix_WRK)
> -
> .globl _ML_(do_syscall_for_client_mach_WRK)
> _ML_(do_syscall_for_client_mach_WRK):
> DO_SYSCALL MACH
> @@ -212,18 +209,45 @@
> VG_(fixup_guest_state_after_syscall_interrupted) can do the
> right thing */
>
> -/* GrP fixme wrong */
> -.globl _ML_(blksys_setup)
> -.globl _ML_(blksys_restart)
> -.globl _ML_(blksys_complete)
> -.globl _ML_(blksys_committed)
> -.globl _ML_(blksys_finished)
> -_ML_(blksys_setup): .quad L_1_1
> -_ML_(blksys_restart): .quad L_1_2
> -_ML_(blksys_complete): .quad L_1_3
> -_ML_(blksys_committed): .quad L_1_4
> -_ML_(blksys_finished): .quad L_1_5
> +/* eg MK_L_SCLASS_N(UNIX,99) produces L_3_99
> + since UNIX is #defined to 3 at the top of this file */
> +#define FOO(scclass,labelno) L_##scclass##_##labelno
> +#define MK_L_SCCLASS_N(scclass,labelno) FOO(scclass,labelno)
>
> +.globl _ML_(blksys_setup_MACH)
> +.globl _ML_(blksys_restart_MACH)
> +.globl _ML_(blksys_complete_MACH)
> +.globl _ML_(blksys_committed_MACH)
> +.globl _ML_(blksys_finished_MACH)
> +_ML_(blksys_setup_MACH): .quad MK_L_SCCLASS_N(MACH,1)
> +_ML_(blksys_restart_MACH): .quad MK_L_SCCLASS_N(MACH,2)
> +_ML_(blksys_complete_MACH): .quad MK_L_SCCLASS_N(MACH,3)
> +_ML_(blksys_committed_MACH): .quad MK_L_SCCLASS_N(MACH,4)
> +_ML_(blksys_finished_MACH): .quad MK_L_SCCLASS_N(MACH,5)
> +
> +.globl _ML_(blksys_setup_MDEP)
> +.globl _ML_(blksys_restart_MDEP)
> +.globl _ML_(blksys_complete_MDEP)
> +.globl _ML_(blksys_committed_MDEP)
> +.globl _ML_(blksys_finished_MDEP)
> +_ML_(blksys_setup_MDEP): .quad MK_L_SCCLASS_N(MDEP,1)
> +_ML_(blksys_restart_MDEP): .quad MK_L_SCCLASS_N(MDEP,2)
> +_ML_(blksys_complete_MDEP): .quad MK_L_SCCLASS_N(MDEP,3)
> +_ML_(blksys_committed_MDEP): .quad MK_L_SCCLASS_N(MDEP,4)
> +_ML_(blksys_finished_MDEP): .quad MK_L_SCCLASS_N(MDEP,5)
> +
> +.globl _ML_(blksys_setup_UNIX)
> +.globl _ML_(blksys_restart_UNIX)
> +.globl _ML_(blksys_complete_UNIX)
> +.globl _ML_(blksys_committed_UNIX)
> +.globl _ML_(blksys_finished_UNIX)
> +_ML_(blksys_setup_UNIX): .quad MK_L_SCCLASS_N(UNIX,1)
> +_ML_(blksys_restart_UNIX): .quad MK_L_SCCLASS_N(UNIX,2)
> +_ML_(blksys_complete_UNIX): .quad MK_L_SCCLASS_N(UNIX,3)
> +_ML_(blksys_committed_UNIX): .quad MK_L_SCCLASS_N(UNIX,4)
> +_ML_(blksys_finished_UNIX): .quad MK_L_SCCLASS_N(UNIX,5)
> +
> +
> /*--------------------------------------------------------------------*/
> /*--- end ---*/
> /*--------------------------------------------------------------------*/
>
> Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c
> ===================================================================
> --- branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/m_syswrap/syswrap-darwin.c 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -6854,7 +6854,14 @@
> ThreadState *tst = VG_(get_ThreadState)(tid);
> tst->os_state.pthread = ARG1;
> tst->arch.vex.guest_GS_0x60 = ARG1;
> - SET_STATUS_Success(0x60);
> + // SET_STATUS_Success(0x60);
> + // see comments on x86 case just above
> + SET_STATUS_from_SysRes(
> + VG_(mk_SysRes_amd64_darwin)(
> + VG_DARWIN_SYSNO_CLASS(__NR_pthread_set_self),
> + False, 0, 0x60
> + )
> + );
> }
>
> #else
>
> Modified: branches/DARWIN/coregrind/m_syswrap/syswrap-main.c
> ===================================================================
> --- branches/DARWIN/coregrind/m_syswrap/syswrap-main.c 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/m_syswrap/syswrap-main.c 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -79,12 +79,12 @@
> Mach traps: result is in r3, and there is no error flag.
> ppc64 r0 r3 r4 r5 r6 r7 r8 ?? ?? r3+CR0.SO (== ARG1)
> x86 eax +4 +8 +12 +16 +20 +24 +28 +32 edx:eax, eflags.c
> - amd64 rax rdi rsi rdx rcx r8 r9 stk stk edx:eax, eflags.c
> + amd64 rax rdi rsi rdx rcx r8 r9 +8 +16 rdx:rax, rflags.c
>
> - For x86-darwin, "+N" denotes "in memory at N(%esp)". Apparently
> - 0(%esp) is some kind of return address (perhaps for syscalls done
> - with "sysenter"?) I don't think it is relevant for syscalls done
> - with "int $0x80/1/2".
> + For x86-darwin, "+N" denotes "in memory at N(%esp)"; ditto
> + amd64-darwin. Apparently 0(%esp) is some kind of return address
> + (perhaps for syscalls done with "sysenter"?) I don't think it is
> + relevant for syscalls done with "int $0x80/1/2".
> */
>
> /* This is the top level of the system-call handler module. All
> @@ -595,7 +595,7 @@
> canonical->arg7 = stack[2];
> canonical->arg8 = stack[3];
>
> - PRINT("SYSCALL[%d,?](%5lld) syscall(#%x, ...); please stand by...\n",
> + PRINT("SYSCALL[%d,?](%5lld) syscall(#%lx, ...); please stand by...\n",
> VG_(getpid)(), /*tid,*/ (Long)0,
> VG_DARWIN_SYSNO_PRINT(canonical->sysno));
> }
> @@ -787,53 +787,35 @@
> canonical->what = SsComplete;
>
> # elif defined(VGP_amd64_darwin)
> + /* duplicates logic in m_signals.VG_UCONTEXT_SYSCALL_SYSRES */
> VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;
> - UInt carry = 1 & LibVEX_GuestAMD64_get_rflags(gst);
> - UInt err;
> - UWord val;
> - UWord val2;
> -
> + ULong carry = 1 & LibVEX_GuestAMD64_get_rflags(gst);
> + ULong err = 0;
> + ULong wLO = 0;
> + ULong wHI = 0;
> switch (gst->guest_SC_CLASS) {
> - case VG_DARWIN_SYSCALL_CLASS_UX64:
> - // int $0x80 = Unix, 128-bit result
> - err = carry;
> - val = gst->guest_RAX;
> - val2 = gst->guest_RDX;
> - break;
> - case VG_DARWIN_SYSCALL_CLASS_UNIX:
> - // syscall = Unix, 64-bit result
> - err = carry;
> - val = gst->guest_RAX;
> - val2 = 0;
> - break;
> - case VG_DARWIN_SYSCALL_CLASS_MACH:
> - // int $0x81 = Mach, 64-bit result
> - err = 0;
> - val = gst->guest_RAX;
> - val2 = 0;
> - break;
> - case VG_DARWIN_SYSCALL_CLASS_MDEP:
> - // int $0x82 = mdep, 64-bit result
> - err = 0;
> - val = gst->guest_RAX;
> - val2 = 0;
> - break;
> - default:
> - vg_assert(0);
> - break;
> + case VG_DARWIN_SYSCALL_CLASS_UNIX:
> + // syscall = Unix, 128-bit result
> + err = carry;
> + wLO = gst->guest_RAX;
> + wHI = gst->guest_RDX;
> + break;
> + case VG_DARWIN_SYSCALL_CLASS_MACH:
> + // syscall = Mach, 64-bit result
> + wLO = gst->guest_RAX;
> + break;
> + case VG_DARWIN_SYSCALL_CLASS_MDEP:
> + // syscall = mdep, 64-bit result
> + wLO = gst->guest_RAX;
> + break;
> + default:
> + vg_assert(0);
> + break;
> }
> -
> - if (err) {
> - canonical->sres.isError = True;
> - canonical->sres.res = 0;
> - canonical->sres.res2 = 0;
> - canonical->sres.err = val;
> - } else {
> - canonical->sres.isError = False;
> - canonical->sres.res = val;
> - canonical->sres.res2 = val2;
> - canonical->sres.err = 0;
> - }
> + canonical->sres = VG_(mk_SysRes_amd64_darwin)(
> + gst->guest_SC_CLASS, err ? True : False,
> + wHI, wLO
> + );
> canonical->what = SsComplete;
>
> # else
> @@ -935,8 +917,7 @@
> SysRes sres = canonical->sres;
> vg_assert(canonical->what == SsComplete);
> /* Unfortunately here we have to break abstraction and look
> - directly inside 'res', in order to decide what to do. There are
> - 6 cases (yuck). */
> + directly inside 'res', in order to decide what to do. */
> switch (sres._mode) {
> case SysRes_MACH: // int $0x81 = Mach, 32-bit result
> case SysRes_MDEP: // int $0x82 = mdep, 32-bit result
> @@ -966,39 +947,35 @@
>
> #elif defined(VGP_amd64_darwin)
> VexGuestAMD64State* gst = (VexGuestAMD64State*)gst_vanilla;
> - UWord val =
> - canonical->sres.isError ? canonical->sres.err : canonical->sres.res;
> + SysRes sres = canonical->sres;
> vg_assert(canonical->what == SsComplete);
> -
> - switch (gst->guest_SC_CLASS) {
> - case VG_DARWIN_SYSCALL_CLASS_UNIX:
> - // syscall = Unix, 32-bit result
> - if (!canonical->sres.isError) gst->guest_RDX = canonical->sres.res2;
> - VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> - OFFSET_amd64_RDX, sizeof(UWord) );
> - gst->guest_RAX = val;
> - LibVEX_GuestAMD64_put_rflag_c(canonical->sres.isError, gst);
> - VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> - OFFSET_amd64_RAX, sizeof(UWord) );
> - // fixme sets defined for entire rflags, not just bit c
> - VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> - offsetof(VexGuestAMD64State, guest_CC_DEP1), sizeof(ULong) );
> - break;
> - case VG_DARWIN_SYSCALL_CLASS_MACH:
> - // int $0x81 = Mach, 32-bit result
> - gst->guest_RAX = val;
> - VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> - OFFSET_amd64_RAX, sizeof(UWord) );
> - break;
> - case VG_DARWIN_SYSCALL_CLASS_MDEP:
> - // int $0x82 = mdep, 32-bit result
> - gst->guest_RAX = val;
> - VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> - OFFSET_amd64_RAX, sizeof(UWord) );
> - break;
> - default:
> - vg_assert(0);
> - break;
> + /* Unfortunately here we have to break abstraction and look
> + directly inside 'res', in order to decide what to do. */
> + switch (sres._mode) {
> + case SysRes_MACH: // syscall = Mach, 64-bit result
> + case SysRes_MDEP: // syscall = mdep, 64-bit result
> + gst->guest_RAX = sres._wLO;
> + VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> + OFFSET_amd64_RAX, sizeof(ULong) );
> + break;
> + case SysRes_UNIX_OK: // syscall = Unix, 128-bit result
> + case SysRes_UNIX_ERR: // syscall = Unix, 128-bit error
> + gst->guest_RAX = sres._wLO;
> + VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> + OFFSET_amd64_RAX, sizeof(ULong) );
> + gst->guest_RDX = sres._wHI;
> + VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> + OFFSET_amd64_RDX, sizeof(ULong) );
> + LibVEX_GuestAMD64_put_rflag_c( sres._mode==SysRes_UNIX_ERR ? 1 : 0,
> + gst );
> + // fixme sets defined for entire rflags, not just bit c
> + // DDD: this breaks exp-ptrcheck.
> + VG_TRACK( post_reg_write, Vg_CoreSysCall, tid,
> + offsetof(VexGuestAMD64State, guest_CC_DEP1), sizeof(ULong) );
> + break;
> + default:
> + vg_assert(0);
> + break;
> }
>
> # else
>
> Modified: branches/DARWIN/coregrind/m_vki.c
> ===================================================================
> --- branches/DARWIN/coregrind/m_vki.c 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/m_vki.c 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -123,7 +123,8 @@
> # endif
> }
> /* also .. */
> - /* VKI_SET_SIGMASK is hardwired into syscall-x86-darwin.S */
> + /* VKI_SET_SIGMASK is hardwired into syscall-x86-darwin.S and
> + syscall-amd64-darwin.S */
> vg_assert(VKI_SIG_SETMASK == 3);
>
> # else
>
> Modified: branches/DARWIN/coregrind/pub_core_syscall.h
> ===================================================================
> --- branches/DARWIN/coregrind/pub_core_syscall.h 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/coregrind/pub_core_syscall.h 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -77,7 +77,8 @@
> extern SysRes VG_(mk_SysRes_ppc64_aix5) ( ULong val, ULong err );
> extern SysRes VG_(mk_SysRes_x86_darwin) ( UChar scclass, Bool isErr,
> UInt wHI, UInt wLO );
> -//extern SysRes VG_(mk_SysRes_amd64_darwin) ( UWord val, UWord val2, UWord err );
> +extern SysRes VG_(mk_SysRes_amd64_darwin)( UChar scclass, Bool isErr,
> + ULong wHI, ULong wLO );
> extern SysRes VG_(mk_SysRes_Error) ( UWord val );
> extern SysRes VG_(mk_SysRes_Success) ( UWord val );
>
>
> Modified: branches/DARWIN/include/pub_tool_basics.h
> ===================================================================
> --- branches/DARWIN/include/pub_tool_basics.h 2009-04-04 15:14:55 UTC (rev 9516)
> +++ branches/DARWIN/include/pub_tool_basics.h 2009-04-05 10:28:46 UTC (rev 9517)
> @@ -156,8 +156,8 @@
> When _mode is SysRes_UNIX_ERR, _wHI:_wLO holds the error code.
> Probably the high word of an error is always ignored by
> userspace, but we have to record it, so that we can correctly
> - update both EDX and EAX (in guest state) given a SysRes, if
> - we're required to.
> + update both {R,E}DX and {R,E}AX (in guest state) given a SysRes,
> + if we're required to.
> */
> #if defined(VGO_linux)
> typedef
>
>
> ------------------------------------------------------------------------------
> _______________________________________________
> Valgrind-developers mailing list
> Val...@li...
> https://lists.sourceforge.net/lists/listinfo/valgrind-developers
|
|
From: Julian S. <js...@ac...> - 2009-04-05 12:01:56
|
> How can I make it build a 64bit version? (Or one with both arches) Apparently --build=amd64-darwin is the correct magic incantation. Hopefully in the future at some point, the build system behaviour can be changed so as to be more consistent with Linux. J |
|
From: Nicholas N. <n.n...@gm...> - 2009-04-05 13:06:23
|
On Sun, Apr 5, 2009 at 7:05 AM, Julian Seward <js...@ac...> wrote: > >> How can I make it build a 64bit version? (Or one with both arches) > > Apparently --build=amd64-darwin is the correct magic incantation. > Hopefully in the future at some point, the build system behaviour > can be changed so as to be more consistent with Linux. Yes, --build=amd64-darwin works. OS 10.5 pretends to be a 32-bit OS -- that's the default output for gcc, and what 'configure' says -- but it's actually 64-bit-capable. From what I've heard it seems likely that 10.6 will be proudly 64-bit. So the easy thing to do would be just to wait for it, rumours indicate it's likely to come out around June or July. The amd64-darwin port of Valgrind needs some work -- in particular, it's very slow to start-up (3 or 4 seconds on my machine) because it temporarily uses some very large mmaps. Nick |