__private_extern__ kern_return_t chudxnu_cpusig_send(int otherCPU, uint32_t request) { int thisCPU; kern_return_t retval = KERN_FAILURE; int retries = 0; boolean_t oldlevel; uint32_t temp[2]; oldlevel = ml_set_interrupts_enabled(FALSE); thisCPU = cpu_number(); if(thisCPU!=otherCPU) { temp[0] = 0xFFFFFFFF; /* set sync flag */ temp[1] = request; /* set request */ __asm__ volatile("eieio"); /* force order */ __asm__ volatile("sync"); /* force to memory */ do { retval=cpu_signal(otherCPU, SIGPcpureq, CPRQchud, (uint32_t)&temp); } while(retval!=KERN_SUCCESS && (retries++)<16); if(retries>=16) { retval = KERN_FAILURE; } else { retval = hw_cpu_sync(temp, LockTimeOut); /* wait for the other processor */ if(!retval) { retval = KERN_FAILURE; } else { retval = KERN_SUCCESS; } } } else {
static void qemu_cpu_kick_thread(CPUState *cpu) { #ifndef _WIN32 int err; err = pthread_kill(cpu->thread->thread, SIG_IPI); if (err) { fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); exit(1); } #else /* _WIN32 */ if (!qemu_cpu_is_self(cpu)) { SuspendThread(cpu->hThread); cpu_signal(0); ResumeThread(cpu->hThread); } #endif }
static void qemu_cpu_kick_thread(CPUState *cpu) { #ifndef _WIN32 int err; err = pthread_kill(cpu->thread->thread, SIG_IPI); if (err) { fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); exit(1); } #else /* _WIN32 */ if (!qemu_cpu_is_self(cpu)) { CONTEXT tcgContext; if (SuspendThread(cpu->hThread) == (DWORD)-1) { fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__, GetLastError()); exit(1); } /* On multi-core systems, we are not sure that the thread is actually * suspended until we can get the context. */ tcgContext.ContextFlags = CONTEXT_CONTROL; while (GetThreadContext(cpu->hThread, &tcgContext) != 0) { continue; } cpu_signal(0); if (ResumeThread(cpu->hThread) == (DWORD)-1) { fprintf(stderr, "qemu:%s: GetLastError:%lu\n", __func__, GetLastError()); exit(1); } } #endif }
static void qemu_cpu_kick_thread(CPUArchState *env) { #ifndef _WIN32 int err; LOGD_CPUS("%s1\n", __func__); err = pthread_kill(env->thread->thread, SIG_IPI); LOGD_CPUS("%s2: KILL pthread\n", __func__); if (err) { LOGD_CPUS("%s3: ERROR = %d:%s\n", __func__, err, strerror(err)); fprintf(stderr, "qemu:%s: %s", __func__, strerror(err)); exit(1); } LOGD_CPUS("%s4\n", __func__); #else /* _WIN32 */ if (!qemu_cpu_is_self(env)) { SuspendThread(env->hThread); cpu_signal(0); ResumeThread(env->hThread); } #endif }