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