extern int kdb_active[];
extern volatile boolean_t mp_kdp_trap;
+extern volatile boolean_t mp_kdp_is_NMI;
extern volatile boolean_t force_immediate_debugger_NMI;
extern volatile boolean_t pmap_tlb_flush_timeout;
extern volatile usimple_lock_t spinlock_timed_out;
extern uint64_t LastDebuggerEntryAllowance;
-extern void mp_kdp_enter(void);
-extern void mp_kdp_exit(void);
+extern void mp_kdp_enter(boolean_t proceed_on_failure);
+extern void mp_kdp_exit(void);
+extern boolean_t mp_kdp_all_cpus_halted(void);
extern boolean_t mp_recent_debugger_activity(void);
+extern void kernel_spin(uint64_t spin_ns);
/*
* All cpu rendezvous:
void (*action_func)(void *),
void *arg);
extern void mp_rendezvous_break_lock(void);
+extern void mp_rendezvous_lock(void);
+extern void mp_rendezvous_unlock(void);
/*
* All cpu broadcast.
void (*action_func)(void *, void*),
void *arg0,
void *arg1,
- cpumask_t *cpus_calledp,
- cpumask_t *cpus_notcalledp);
+ cpumask_t *cpus_calledp);
-extern void mp_cpus_NMIPI(cpumask_t cpus);
+typedef enum {
+ NONE = 0,
+ SPINLOCK_TIMEOUT,
+ TLB_FLUSH_TIMEOUT,
+ CROSSCALL_TIMEOUT,
+ INTERRUPT_WATCHDOG
+} NMI_reason_t;
+extern void NMIPI_panic(cpumask_t cpus, NMI_reason_t reason);
/* Interrupt a set of cpus, forcing an exit out of non-root mode */
extern void mp_cpus_kick(cpumask_t cpus);
#define i_bit(bit, word) i_bit_impl((long)(*(word)), bit)
#endif
-#if MACH_RT
-
-#if defined(__x86_64__)
-
-#define _DISABLE_PREEMPTION \
- incl %gs:CPU_PREEMPTION_LEVEL
-
-#define _ENABLE_PREEMPTION \
- decl %gs:CPU_PREEMPTION_LEVEL ; \
- jne 9f ; \
- call EXT(kernel_preempt_check) ; \
-9:
-
-#define _ENABLE_PREEMPTION_NO_CHECK \
- decl %gs:CPU_PREEMPTION_LEVEL
-
-#else
-#error Unsupported architecture
-#endif
-
-/* x86_64 just calls through to the other macro directly */
-#define DISABLE_PREEMPTION _DISABLE_PREEMPTION
-#define ENABLE_PREEMPTION _ENABLE_PREEMPTION
-#define ENABLE_PREEMPTION_NO_CHECK _ENABLE_PREEMPTION_NO_CHECK
-#define MP_DISABLE_PREEMPTION _DISABLE_PREEMPTION
-#define MP_ENABLE_PREEMPTION _ENABLE_PREEMPTION
-#define MP_ENABLE_PREEMPTION_NO_CHECK _ENABLE_PREEMPTION_NO_CHECK
-
-#else /* MACH_RT */
-#define DISABLE_PREEMPTION
-#define ENABLE_PREEMPTION
-#define ENABLE_PREEMPTION_NO_CHECK
-#define MP_DISABLE_PREEMPTION
-#define MP_ENABLE_PREEMPTION
-#define MP_ENABLE_PREEMPTION_NO_CHECK
-#endif /* MACH_RT */
#endif /* _I386_MP_H_ */