static void* threadentry(void *v) { ThreadStart ts; tcb_fixup(0); ts = *(ThreadStart*)v; free(v); ts.g->stackbase = (uintptr)&ts; /* * _cgo_sys_thread_start set stackguard to stack size; * change to actual guard pointer. */ ts.g->stackguard = (uintptr)&ts - ts.g->stackguard + 4096; /* * Set specific keys. */ setg_gcc((void*)ts.g); crosscall_386(ts.fn); return nil; }
static void* threadentry(void *v) { ThreadStart ts; stack_t ss; ts = *(ThreadStart*)v; free(v); /* * Set specific keys. */ setg_gcc((void*)ts.g); // On NetBSD, a new thread inherits the signal stack of the // creating thread. That confuses minit, so we remove that // signal stack here before calling the regular mstart. It's // a bit baroque to remove a signal stack here only to add one // in minit, but it's a simple change that keeps NetBSD // working like other OS's. At this point all signals are // blocked, so there is no race. memset(&ss, 0, sizeof ss); ss.ss_flags = SS_DISABLE; sigaltstack(&ss, nil); crosscall_amd64(ts.fn); return nil; }
static void* threadentry(void *v) { ThreadStart ts; ts = *(ThreadStart*)v; free(v); // Save g for this thread in C TLS setg_gcc((void*)ts.g); crosscall_ppc64(ts.fn, (void*)ts.g); return nil; }
static void* threadentry(void *v) { ThreadStart ts; ts = *(ThreadStart*)v; free(v); /* * Set specific keys. */ setg_gcc((void*)ts.g); crosscall_386(ts.fn); return nil; }
static void* threadentry(void *v) { if (x_cgo_threadentry) { return x_cgo_threadentry(v); } ThreadStart ts; ts = *(ThreadStart*)v; free(v); /* * Set specific keys. */ setg_gcc((void*)ts.g); crosscall_amd64(ts.fn); return nil; }