|
From: Paul F. <pa...@so...> - 2025-11-30 17:22:52
|
https://sourceware.org/cgit/valgrind/commit/?id=e06e758b33111f012301dc54f6577c0c81dc12a9 commit e06e758b33111f012301dc54f6577c0c81dc12a9 Author: Paul Floyd <pj...@wa...> Date: Sun Nov 30 18:21:56 2025 +0100 Darwin: update x86 syswrap code Code from Louis Brunner. Diff: --- coregrind/m_syswrap/syswrap-x86-darwin.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/coregrind/m_syswrap/syswrap-x86-darwin.c b/coregrind/m_syswrap/syswrap-x86-darwin.c index 97c044f77e..a0bc1a1e7a 100644 --- a/coregrind/m_syswrap/syswrap-x86-darwin.c +++ b/coregrind/m_syswrap/syswrap-x86-darwin.c @@ -195,7 +195,7 @@ ThreadState *build_thread(const thread_state_t state, // Edit the thread state to send to the real kernel. // The real thread will run start_thread_NORETURN(tst) // on a separate non-client stack. -void hijack_thread_state(thread_state_t mach_generic, +void hijack_thread_state(thread_state_t mach_generic, thread_state_flavor_t flavor, mach_msg_type_number_t count, ThreadState *tst) @@ -271,7 +271,7 @@ asm( -void pthread_hijack(Addr self, Addr kport, Addr func, Addr func_arg, +void pthread_hijack(Addr self, Addr kport, Addr func, Addr func_arg, Addr stacksize, Addr flags, Addr sp) { vki_sigset_t blockall; @@ -358,6 +358,7 @@ asm( " push $0\n" // alignment " push $0\n" // alignment " push %ebp\n" // original sp +" push %esi\n" // kevent_count " push %edi\n" // reuse " push %edx\n" // workitem " push %ecx\n" // stackaddr @@ -375,7 +376,7 @@ asm( To handle this in valgrind, we create and destroy a valgrind thread for every work item. */ -void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, +void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, UInt reuse, Int kevent_count, Addr sp) { ThreadState *tst; @@ -396,8 +397,8 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, if (0) VG_(printf)( "wqthread_hijack: self %#lx, kport %#lx, " - "stackaddr %#lx, workitem %#lx, reuse/flags %x, sp %#lx\n", - self, kport, stackaddr, workitem, reuse, sp); + "stackaddr %#lx, workitem %#lx, reuse/flags %x, kevent_count %d, sp %#lx\n", + self, kport, stackaddr, workitem, reuse, kevent_count, sp); /* Start the thread with all signals blocked. VG_(scheduler) will set the mask correctly when we finally get there. */ @@ -429,7 +430,8 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, || DARWIN_VERS == DARWIN_10_10 \ || DARWIN_VERS == DARWIN_10_11 \ || DARWIN_VERS == DARWIN_10_12 \ - || DARWIN_VERS == DARWIN_10_13 + || DARWIN_VERS == DARWIN_10_13 \ + || DARWIN_VERS == DARWIN_10_14 UWord magic_delta = 0xB0; # else # error "magic_delta: to be computed on new OS version" @@ -452,6 +454,10 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, tid, tst, tst->os_state.pthread, self); vex = &tst->arch.vex; + if (tst->os_state.pthread - magic_delta != self) { + VG_(printf)("wqthread_hijack reuse: tst->os_state.pthread %#lx vs self %#lx (diff: %#lx vs %#lx)\n", + tst->os_state.pthread, self, tst->os_state.pthread - self, magic_delta); + } vg_assert(tst->os_state.pthread - magic_delta == self); } else { @@ -471,7 +477,7 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, vex->guest_ECX = stackaddr; vex->guest_EDX = workitem; vex->guest_EDI = reuse; - vex->guest_ESI = 0; + vex->guest_ESI = kevent_count; vex->guest_ESP = sp; stacksize = 512*1024; // wq stacks are always DEFAULT_STACK_SIZE |