iPXE
|
Multiprocessor functions. More...
#include <stdint.h>
#include <ipxe/api.h>
#include <config/defaults.h>
#include <ipxe/null_mp.h>
#include <ipxe/efi/efi_mp.h>
#include <bits/mp.h>
Go to the source code of this file.
Macros | |
#define | MPAPI_INLINE(_subsys, _api_func) SINGLE_API_INLINE ( MPAPI_PREFIX_ ## _subsys, _api_func ) |
Calculate static inline multiprocessor API function name. More... | |
#define | PROVIDE_MPAPI(_subsys, _api_func, _func) PROVIDE_SINGLE_API ( MPAPI_PREFIX_ ## _subsys, _api_func, _func ) |
Provide a multiprocessor API implementation. More... | |
#define | PROVIDE_MPAPI_INLINE(_subsys, _api_func) PROVIDE_SINGLE_API_INLINE ( MPAPI_PREFIX_ ## _subsys, _api_func ) |
Provide a static inline multiprocessor API implementation. More... | |
Typedefs | |
typedef unsigned long | mp_addr_t |
An address within the address space for a multiprocessor function. More... | |
typedef void() | mp_func_t(mp_addr_t opaque, unsigned int cpuid) |
A multiprocessor function. More... | |
Functions | |
FILE_LICENCE (GPL2_OR_LATER_OR_UBDL) | |
void __asmcall | mp_call (mp_addr_t func, mp_addr_t opaque) |
Call a multiprocessor function from C code on the current CPU. More... | |
mp_addr_t | mp_address (void *address) |
Calculate address as seen by a multiprocessor function. More... | |
void | mp_exec_boot (mp_func_t func, void *opaque) |
Execute a multiprocessor function on the boot processor. More... | |
void | mp_start_all (mp_func_t func, void *opaque) |
Start a multiprocessor function on all application processors. More... | |
unsigned int | mp_boot_cpuid (void) |
Get boot CPU identifier. More... | |
unsigned int | mp_max_cpuid (void) |
Get maximum CPU identifier. More... | |
Variables | |
mp_func_t | mp_update_max_cpuid |
Update maximum observed CPU identifier. More... | |
Multiprocessor functions.
Definition in file mp.h.
#define MPAPI_INLINE | ( | _subsys, | |
_api_func | |||
) | SINGLE_API_INLINE ( MPAPI_PREFIX_ ## _subsys, _api_func ) |
#define PROVIDE_MPAPI | ( | _subsys, | |
_api_func, | |||
_func | |||
) | PROVIDE_SINGLE_API ( MPAPI_PREFIX_ ## _subsys, _api_func, _func ) |
#define PROVIDE_MPAPI_INLINE | ( | _subsys, | |
_api_func | |||
) | PROVIDE_SINGLE_API_INLINE ( MPAPI_PREFIX_ ## _subsys, _api_func ) |
typedef unsigned long mp_addr_t |
An address within the address space for a multiprocessor function.
Application processors may be started in a different address space from the normal iPXE runtime environment. For example: under legacy BIOS the application processors will use flat 32-bit physical addressing (with no paging or virtual address offset).
typedef void() mp_func_t(mp_addr_t opaque, unsigned int cpuid) |
A multiprocessor function.
opaque | Opaque data pointer |
cpuid | CPU identifier |
iPXE does not set up a normal multiprocessor environment. In particular, there is no support for dispatching code to individual processors and there is no per-CPU stack allocation.
Multiprocessor code must be prepared to run wth no stack space (and with a zero stack pointer). Functions may use the CPU identifier to construct a pointer to per-CPU result storage.
Multiprocessor functions are permitted to overwrite all registers apart from the stack pointer. On exit, the function should check the stack pointer value: if zero then the function should halt the CPU, if non-zero then the function should return in the normal way.
Multiprocessor functions do not have access to any capabilities typically provided by the firmware: they cannot, for example, write any console output.
All parameters are passed in registers, since there may be no stack available. These functions cannot be called directly from C code.
FILE_LICENCE | ( | GPL2_OR_LATER_OR_UBDL | ) |
Call a multiprocessor function from C code on the current CPU.
func | Multiprocessor function |
opaque | Opaque data pointer |
This function must be provided for each CPU architecture to bridge the normal C ABI to the iPXE multiprocessor function ABI. It must therefore preserve any necessary registers, determine the CPU identifier, call the multiprocessor function (which may destroy any registers other than the stack pointer), restore registers, and return to the C caller.
This function must be called from within the multiprocessor address space (e.g. with flat 32-bit physical addressing for BIOS). It can be called directly from C code if the multiprocessor address space is identical to the address space used for C code (e.g. under EFI, where everything uses flat physical addresses).
Referenced by bios_mp_exec_boot(), efi_mp_call(), mp_boot_cpuid(), and mp_max_cpuid().
mp_addr_t mp_address | ( | void * | address | ) |
Calculate address as seen by a multiprocessor function.
address | Address in normal iPXE address space |
address | Address in application processor address space |
Definition at line 27 of file bios_mp.h.
References address, and virt_to_phys().
Referenced by bios_mp_exec_boot(), bios_mp_start_all(), efi_mp_exec_boot(), and efi_mp_start_all().
void mp_exec_boot | ( | mp_func_t | func, |
void * | opaque | ||
) |
Execute a multiprocessor function on the boot processor.
func | Multiprocessor function |
opaque | Opaque data pointer |
This is a blocking operation: the call will return only when the multiprocessor function exits.
Referenced by mp_boot_cpuid(), and ucode_update_all().
void mp_start_all | ( | mp_func_t | func, |
void * | opaque | ||
) |
Start a multiprocessor function on all application processors.
func | Multiprocessor function |
opaque | Opaque data pointer |
This is a non-blocking operation: it is the caller's responsibility to provide a way to determine when the multiprocessor function has finished executing and halted its CPU.
Referenced by mp_max_cpuid(), and ucode_update_all().
unsigned int mp_boot_cpuid | ( | void | ) |
Get boot CPU identifier.
id | Boot CPU identifier |
Definition at line 43 of file mp.c.
References DBGC, max, mp_call(), mp_exec_boot(), and mp_update_max_cpuid.
Referenced by mp_max_cpuid(), and ucode_update_all().
unsigned int mp_max_cpuid | ( | void | ) |
Get maximum CPU identifier.
max | Maximum CPU identifier |
Definition at line 58 of file mp.c.
References DBGC, max, mdelay(), mp_boot_cpuid(), mp_call(), MP_MAX_CPUID_WAIT_MS, mp_start_all(), and mp_update_max_cpuid.
Referenced by ucode_update_all().
mp_func_t mp_update_max_cpuid |
Update maximum observed CPU identifier.
opaque | Opaque data pointer |
cpuid | CPU identifier |
This may be invoked on each processor to update a shared maximum CPU identifier value.
Referenced by mp_boot_cpuid(), and mp_max_cpuid().