Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
424 | giacomo | 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 | io_apic_irqs = 0; |
||
7 | } |
||
8 | |||
9 | static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) |
||
10 | { |
||
11 | /* reset code is stored in 8255 on PC-9800. */ |
||
12 | outb(0x0e, 0x37); /* SHUT0 = 0 */ |
||
13 | local_flush_tlb(); |
||
14 | Dprintk("1.\n"); |
||
15 | *((volatile unsigned short *) TRAMPOLINE_HIGH) = start_eip >> 4; |
||
16 | Dprintk("2.\n"); |
||
17 | *((volatile unsigned short *) TRAMPOLINE_LOW) = start_eip & 0xf; |
||
18 | Dprintk("3.\n"); |
||
19 | /* |
||
20 | * On PC-9800, continuation on warm reset is done by loading |
||
21 | * %ss:%sp from 0x0000:0404 and executing 'lret', so: |
||
22 | */ |
||
23 | /* 0x3f0 is on unused interrupt vector and should be safe... */ |
||
24 | *((volatile unsigned long *) phys_to_virt(0x404)) = 0x000003f0; |
||
25 | Dprintk("4.\n"); |
||
26 | } |
||
27 | |||
28 | static inline void smpboot_restore_warm_reset_vector(void) |
||
29 | { |
||
30 | /* |
||
31 | * Install writable page 0 entry to set BIOS data area. |
||
32 | */ |
||
33 | local_flush_tlb(); |
||
34 | |||
35 | /* |
||
36 | * Paranoid: Set warm reset code and vector here back |
||
37 | * to default values. |
||
38 | */ |
||
39 | outb(0x0f, 0x37); /* SHUT0 = 1 */ |
||
40 | |||
41 | *((volatile long *) phys_to_virt(0x404)) = 0; |
||
42 | } |
||
43 | |||
44 | static inline void smpboot_setup_io_apic(void) |
||
45 | { |
||
46 | /* |
||
47 | * Here we can be sure that there is an IO-APIC in the system. Let's |
||
48 | * go and set it up: |
||
49 | */ |
||
50 | if (!skip_ioapic_setup && nr_ioapics) |
||
51 | setup_IO_APIC(); |
||
52 | } |