equal
deleted
inserted
replaced
|
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 *) TRAMPOLINE_HIGH) = start_eip >> 4; |
|
17 pr_debug("2.\n"); |
|
18 *((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf; |
|
19 pr_debug("3.\n"); |
|
20 } |
|
21 |
|
22 static inline void smpboot_restore_warm_reset_vector(void) |
|
23 { |
|
24 /* |
|
25 * Install writable page 0 entry to set BIOS data area. |
|
26 */ |
|
27 local_flush_tlb(); |
|
28 |
|
29 /* |
|
30 * Paranoid: Set warm reset code and vector here back |
|
31 * to default values. |
|
32 */ |
|
33 CMOS_WRITE(0, 0xf); |
|
34 |
|
35 *((volatile long *) phys_to_virt(0x467)) = 0; |
|
36 } |
|
37 |
|
38 static inline void __init smpboot_setup_io_apic(void) |
|
39 { |
|
40 #ifdef CONFIG_X86_IO_APIC |
|
41 /* |
|
42 * Here we can be sure that there is an IO-APIC in the system. Let's |
|
43 * go and set it up: |
|
44 */ |
|
45 if (!skip_ioapic_setup && nr_ioapics) |
|
46 setup_IO_APIC(); |
|
47 else { |
|
48 nr_ioapics = 0; |
|
49 localise_nmi_watchdog(); |
|
50 } |
|
51 #endif |
|
52 } |
|
53 |
|
54 static inline void smpboot_clear_io_apic(void) |
|
55 { |
|
56 #ifdef CONFIG_X86_IO_APIC |
|
57 nr_ioapics = 0; |
|
58 #endif |
|
59 } |