BIOS multiprocessor API implementation.
Definition in file bios_mp.c.
static void bios_mp_start_all |
( |
mp_func_t |
func, |
|
|
void * |
opaque |
|
) |
| |
|
static |
Start a multiprocessor function on all application processors.
- Parameters
-
func | Multiprocessor function |
opaque | Opaque data pointer |
Definition at line 127 of file bios_mp.c.
143 ( x2apic ?
"x2" :
"" ), ( (
unsigned long long )
base ) );
static mp_address(void *address)
Calculate address as seen by a multiprocessor function.
unsigned long long uint64_t
#define SIPI_VECTOR
Startup IPI vector.
#define PAGE_SIZE
Page size.
#define MSR_APIC_BASE_MASK
Local APIC base address mask.
static __always_inline unsigned long virt_to_phys(volatile const void *addr)
Convert virtual address to a physical address.
#define APIC_ICR_INIT
Interrupt command register: INIT.
#define APIC_ICR_LEVEL
Interrupt command register: level mode.
#define APIC_ICR_SIPI(vector)
Interrupt command register: SIPI.
void setup_sipi(unsigned int vector, uint32_t handler, struct i386_regs *regs)
Set up startup IPI handler.
#define APIC_ICR_ALL_NOT_SELF
Interrupt command register: send to all excluding self.
A 32-bit general register dump.
#define MSR_APIC_BASE
Local APIC base address MSR.
void __asmcall mp_jump(mp_addr_t func, mp_addr_t opaque)
Protected-mode startup IPI handler.
#define MSR_APIC_BASE_X2APIC
Local APIC is in x2APIC mode.
#define APIC_ICR_LEVEL_ASSERT
Interrupt command register: level asserted.
void iounmap(volatile const void *io_addr)
Unmap I/O address.
void * ioremap(unsigned long bus_addr, size_t len)
Map bus address as an I/O address.
static void bios_mp_ipi(void *apic, int x2apic, uint32_t icr)
Send an interprocessor interrupt.
References APIC_ICR_ALL_NOT_SELF, APIC_ICR_INIT, APIC_ICR_LEVEL, APIC_ICR_LEVEL_ASSERT, APIC_ICR_SIPI, base, bios_mp_ipi(), DBGC, i386_regs::eax, i386_regs::edx, ioremap(), iounmap(), mp_address(), mp_jump(), MSR_APIC_BASE, MSR_APIC_BASE_MASK, MSR_APIC_BASE_X2APIC, PAGE_SIZE, regs, setup_sipi(), SIPI_VECTOR, and virt_to_phys().