aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/x86/include/asm/smpboot_hooks.h8
1 files changed, 8 insertions, 0 deletions
diff --git a/arch/x86/include/asm/smpboot_hooks.h b/arch/x86/include/asm/smpboot_hooks.h
index 725b77831993..49adfd7bb4a4 100644
--- a/arch/x86/include/asm/smpboot_hooks.h
+++ b/arch/x86/include/asm/smpboot_hooks.h
@@ -10,7 +10,11 @@ static inline void smpboot_clear_io_apic_irqs(void)
10 10
11static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip) 11static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
12{ 12{
13 unsigned long flags;
14
15 spin_lock_irqsave(&rtc_lock, flags);
13 CMOS_WRITE(0xa, 0xf); 16 CMOS_WRITE(0xa, 0xf);
17 spin_unlock_irqrestore(&rtc_lock, flags);
14 local_flush_tlb(); 18 local_flush_tlb();
15 pr_debug("1.\n"); 19 pr_debug("1.\n");
16 *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_high)) = 20 *((volatile unsigned short *)phys_to_virt(apic->trampoline_phys_high)) =
@@ -23,6 +27,8 @@ static inline void smpboot_setup_warm_reset_vector(unsigned long start_eip)
23 27
24static inline void smpboot_restore_warm_reset_vector(void) 28static inline void smpboot_restore_warm_reset_vector(void)
25{ 29{
30 unsigned long flags;
31
26 /* 32 /*
27 * Install writable page 0 entry to set BIOS data area. 33 * Install writable page 0 entry to set BIOS data area.
28 */ 34 */
@@ -32,7 +38,9 @@ static inline void smpboot_restore_warm_reset_vector(void)
32 * Paranoid: Set warm reset code and vector here back 38 * Paranoid: Set warm reset code and vector here back
33 * to default values. 39 * to default values.
34 */ 40 */
41 spin_lock_irqsave(&rtc_lock, flags);
35 CMOS_WRITE(0, 0xf); 42 CMOS_WRITE(0, 0xf);
43 spin_unlock_irqrestore(&rtc_lock, flags);
36 44
37 *((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0; 45 *((volatile u32 *)phys_to_virt(apic->trampoline_phys_low)) = 0;
38} 46}