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;
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"
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;
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. */
/* 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;
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 {
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;