diff options
Diffstat (limited to 'arch/x86/include/asm/smpboot_hooks.h')
| -rw-r--r-- | arch/x86/include/asm/smpboot_hooks.h | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/arch/x86/include/asm/smpboot_hooks.h b/arch/x86/include/asm/smpboot_hooks.h new file mode 100644 index 00000000000..1def6011490 --- /dev/null +++ b/arch/x86/include/asm/smpboot_hooks.h | |||
| @@ -0,0 +1,61 @@ | |||
| 1 | /* two abstractions specific to kernel/smpboot.c, mainly to cater to visws | ||
| 2 | * which needs to alter them. */ | ||
| 3 | |||
| 4 | static inline void smpboot_clear_io_apic_irqs(void) | ||
| 5 | { | ||
| 6 | #ifdef CONFIG_X86_IO_APIC | ||
| 7 | io_apic_irqs = 0; | ||
| 8 | #endif | ||
| 9 | } | ||
| 10 | |||
| 11 | static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) | ||
| 12 | { | ||
| 13 | CMOS_WRITE(0xa, 0xf); | ||
| 14 | local_flush_tlb(); | ||
| 15 | pr_debug("1.\n"); | ||
| 16 | *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_high)) = | ||
| 17 | start_eip >> 4; | ||
| 18 | pr_debug("2.\n"); | ||
| 19 | *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_low)) = | ||
| 20 | start_eip & 0xf; | ||
| 21 | pr_debug("3.\n"); | ||
| 22 | } | ||
| 23 | |||
| 24 | static inline void smpboot_restore_warm_reset_vector(void) | ||
| 25 | { | ||
| 26 | /* | ||
| 27 | * Install writable page 0 entry to set BIOS data area. | ||
| 28 | */ | ||
| 29 | local_flush_tlb(); | ||
| 30 | |||
| 31 | /* | ||
| 32 | * Paranoid: Set warm reset code and vector here back | ||
| 33 | * to default values. | ||
| 34 | */ | ||
| 35 | CMOS_WRITE(0, 0xf); | ||
| 36 | |||
| 37 | *((volatile long *)phys_to_virt(apic->trampoline_phys_low)) = 0; | ||
| 38 | } | ||
| 39 | |||
| 40 | static inline void __init smpboot_setup_io_apic(void) | ||
| 41 | { | ||
| 42 | #ifdef CONFIG_X86_IO_APIC | ||
| 43 | /* | ||
| 44 | * Here we can be sure that there is an IO-APIC in the system. Let's | ||
| 45 | * go and set it up: | ||
| 46 | */ | ||
| 47 | if (!skip_ioapic_setup && nr_ioapics) | ||
| 48 | setup_IO_APIC(); | ||
| 49 | else { | ||
| 50 | nr_ioapics = 0; | ||
| 51 | localise_nmi_watchdog(); | ||
| 52 | } | ||
| 53 | #endif | ||
| 54 | } | ||
| 55 | |||
| 56 | static inline void smpboot_clear_io_apic(void) | ||
| 57 | { | ||
| 58 | #ifdef CONFIG_X86_IO_APIC | ||
| 59 | nr_ioapics = 0; | ||
| 60 | #endif | ||
| 61 | } | ||
