]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Darwin: update wqthread_hijack arguments
authorPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 11 Nov 2025 14:57:14 +0000 (15:57 +0100)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Tue, 11 Nov 2025 14:57:14 +0000 (15:57 +0100)
Taken from Louis Brunner's GitHub repo.

Now when I launch TextEdit with memcheck it doesnt fail straight away.
I get a few memcheck errors and then it hangs. Looks like the 3 threads
are all running JITted code with one blocked having access errors.

coregrind/m_syswrap/priv_syswrap-darwin.h
coregrind/m_syswrap/syswrap-amd64-darwin.c

index 67c3412d36498dd406f6cd5eee6894a804501629..37d330d939714e937d919212f77a0a931d2239f7 100644 (file)
@@ -826,7 +826,7 @@ extern void pthread_hijack_asm(void);
 extern void pthread_hijack(Addr self, Addr kport, Addr func, Addr func_arg, 
                            Addr stacksize, Addr flags, Addr sp);
 extern void wqthread_hijack_asm(void);
-extern void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, Int reuse, Addr sp);
+extern void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, UInt reuse, Int kevent_count, Addr sp);
 
 extern Addr pthread_starter;
 extern Addr wqthread_starter;
index e6f284c9a65da6a6984e3a9ad2b6774abc58adfc..01ebf1b7cb7024ed735a76452a41fdc10bab95a4 100644 (file)
@@ -416,7 +416,7 @@ void pthread_hijack(Addr self, Addr kport, Addr func, Addr func_arg,
 asm(
 ".globl _wqthread_hijack_asm\n"
 "_wqthread_hijack_asm:\n"
-"   movq %rsp,%r9\n"  // original sp
+"   push %rsp\n"      // original sp
                       // other values stay where they are in registers
 "   push $0\n"        // fake return address
 "   jmp _wqthread_hijack\n"
@@ -431,7 +431,7 @@ asm(
     thread for every work item.
 */
 void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem, 
-                     Int reuse, Addr sp)
+                     UInt reuse, Int kevent_count, Addr sp)
 {
    ThreadState *tst;
    VexGuestAMD64State *vex;
@@ -451,8 +451,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, (UInt)reuse, sp);
+            "stackaddr %#lx, workitem %#lx, reuse/flags %#x, kevent_count %d, sp %#lx\n",
+            self, kport, stackaddr, workitem, (UInt)reuse, kevent_count, sp);
 
    /* Start the thread with all signals blocked.  VG_(scheduler) will
       set the mask correctly when we finally get there. */
@@ -476,7 +476,7 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem,
      /* For whatever reason, tst->os_state.pthread appear to have a
         constant offset of 96 on 10.7, but zero on 10.6 and 10.5.  No
         idea why. */
-#      if DARWIN_VERS <= DARWIN_10_6 || DARWIN_VERS == DARWIN_10_13
+#      if DARWIN_VERS <= DARWIN_10_6 || DARWIN_VERS >= DARWIN_10_13
        UWord magic_delta = 0;
 #      elif DARWIN_VERS == DARWIN_10_7 || DARWIN_VERS == DARWIN_10_8
        UWord magic_delta = 0x60;
@@ -506,6 +506,10 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem,
                           tid, (void *)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 {
@@ -525,7 +529,7 @@ void wqthread_hijack(Addr self, Addr kport, Addr stackaddr, Addr workitem,
    vex->guest_RDX = stackaddr;
    vex->guest_RCX = workitem;
    vex->guest_R8  = reuse;
-   vex->guest_R9  = 0;
+   vex->guest_R9  = kevent_count;
    vex->guest_RSP = sp;
 #if DARWIN_VERS >= DARWIN_10_12
    vex->guest_GS_CONST = self + pthread_tsd_offset;