]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Darwin: update x86 syswrap code
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 30 Nov 2025 17:21:56 +0000 (18:21 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sun, 30 Nov 2025 17:21:56 +0000 (18:21 +0100)
Code from Louis Brunner.

coregrind/m_syswrap/syswrap-x86-darwin.c

index 97c044f77e52edd65943afac87eb961b285a3da7..a0bc1a1e7a13bb732c0fe7d47a6f9a5052273f35 100644 (file)
@@ -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