X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/b0d623f7f2ae71ed96e60569f61f9a9a27016e80..39236c6e673c41db228275375ab7fdb0f837b292:/osfmk/i386/cpu.c diff --git a/osfmk/i386/cpu.c b/osfmk/i386/cpu.c index 0bcfbb77f..fc9fcc43e 100644 --- a/osfmk/i386/cpu.c +++ b/osfmk/i386/cpu.c @@ -40,12 +40,13 @@ #include #include #include -#include +#include #include #if CONFIG_VMX #include #endif #include +#include struct processor processor_master; @@ -89,8 +90,6 @@ cpu_sleep(void) { cpu_data_t *cdp = current_cpu_datap(); - i386_deactivate_cpu(); - PE_cpu_machine_quiesce(cdp->cpu_id); cpu_thread_halt(); @@ -101,6 +100,9 @@ cpu_init(void) { cpu_data_t *cdp = current_cpu_datap(); + timer_call_queue_init(&cdp->rtclock_timer.queue); + cdp->rtclock_timer.deadline = EndOfAllTime; + cdp->cpu_type = cpuid_cputype(); cdp->cpu_subtype = cpuid_cpusubtype(); @@ -143,19 +145,32 @@ cpu_exit_wait( int cpu) { cpu_data_t *cdp = cpu_datap(cpu); + boolean_t intrs_enabled; + uint64_t tsc_timeout; /* * Wait until the CPU indicates that it has stopped. + * Disable interrupts while the topo lock is held -- arguably + * this should always be done but in this instance it can lead to + * a timeout if long-running interrupt were to occur here. */ + intrs_enabled = ml_set_interrupts_enabled(FALSE); simple_lock(&x86_topo_lock); + /* Set a generous timeout of several seconds (in TSC ticks) */ + tsc_timeout = rdtsc64() + (10ULL * 1000 * 1000 * 1000); while ((cdp->lcpu.state != LCPU_HALT) && (cdp->lcpu.state != LCPU_OFF) && !cdp->lcpu.stopped) { simple_unlock(&x86_topo_lock); + ml_set_interrupts_enabled(intrs_enabled); cpu_pause(); + if (rdtsc64() > tsc_timeout) + panic("cpu_exit_wait(%d) timeout", cpu); + ml_set_interrupts_enabled(FALSE); simple_lock(&x86_topo_lock); } simple_unlock(&x86_topo_lock); + ml_set_interrupts_enabled(intrs_enabled); } void @@ -167,13 +182,6 @@ cpu_machine_init( PE_cpu_machine_init(cdp->cpu_id, !cdp->cpu_boot_complete); cdp->cpu_boot_complete = TRUE; cdp->cpu_running = TRUE; -#if 0 - if (cpu_datap(cpu)->hibernate) - { - cpu_datap(cpu)->hibernate = 0; - hibernate_machine_init(); - } -#endif ml_init_interrupt(); #if CONFIG_VMX @@ -246,8 +254,6 @@ slot_threadtype( return (cpu_datap(slot_num)->cpu_threadtype); } - - cpu_type_t cpu_type(void) {