summaryrefslogtreecommitdiffstats
path: root/vendor/r-efi/src/protocols/mp_services.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/r-efi/src/protocols/mp_services.rs')
-rw-r--r--vendor/r-efi/src/protocols/mp_services.rs121
1 files changed, 121 insertions, 0 deletions
diff --git a/vendor/r-efi/src/protocols/mp_services.rs b/vendor/r-efi/src/protocols/mp_services.rs
new file mode 100644
index 000000000..6163b4c51
--- /dev/null
+++ b/vendor/r-efi/src/protocols/mp_services.rs
@@ -0,0 +1,121 @@
+//! Multi-Processor Services Protocol
+//!
+//! This Protocol is defined in the UEFI Platform Integration Specification,
+//! Section 13.4.
+//!
+//! This provides a generalized way of performing the following tasks:
+//! - Retrieving information of multi-processor environments.
+//! - Dispatching user-provided function to APs.
+//! - Maintain MP-related processor status.
+
+pub const PROTOCOL_GUID: crate::base::Guid = crate::base::Guid::from_fields(
+ 0x3fdda605,
+ 0xa76e,
+ 0x4f46,
+ 0xad,
+ 0x29,
+ &[0x12, 0xf4, 0x53, 0x1b, 0x3d, 0x08],
+);
+
+pub const PROCESSOR_AS_BSP_BIT: u32 = 0x00000001;
+pub const PROCESSOR_ENABLED_BIT: u32 = 0x00000002;
+pub const PROCESSOR_HEALTH_STATUS_BIT: u32 = 0x00000004;
+
+pub const END_OF_CPU_LIST: usize = usize::MAX;
+
+#[repr(C)]
+#[derive(Debug, Clone, Copy)]
+pub struct CpuPhysicalLocation {
+ pub package: u32,
+ pub core: u32,
+ pub thread: u32,
+}
+
+#[repr(C)]
+#[derive(Debug, Clone, Copy)]
+pub struct CpuPhysicalLocation2 {
+ pub package: u32,
+ pub module: u32,
+ pub tile: u32,
+ pub die: u32,
+ pub core: u32,
+ pub thread: u32,
+}
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub union ExtendedProcessorInformation {
+ pub location2: CpuPhysicalLocation2,
+}
+
+#[repr(C)]
+#[derive(Clone, Copy)]
+pub struct ProcessorInformation {
+ pub processor_id: u64,
+ pub status_flag: u32,
+ pub location: CpuPhysicalLocation,
+ pub extended_information: ExtendedProcessorInformation,
+}
+
+pub type ApProcedure = eficall! {fn(*mut core::ffi::c_void)};
+
+pub type GetNumberOfProcessors = eficall! {fn(
+ *mut Protocol,
+ *mut usize,
+ *mut usize,
+) -> crate::base::Status};
+
+pub type GetProcessorInfo = eficall! {fn(
+ *mut Protocol,
+ usize,
+ *mut ProcessorInformation,
+) -> crate::base::Status};
+
+pub type StartupAllAps = eficall! {fn(
+ *mut Protocol,
+ ApProcedure,
+ crate::base::Boolean,
+ crate::base::Event,
+ usize,
+ *mut core::ffi::c_void,
+ *mut *mut usize,
+) -> crate::base::Status};
+
+pub type StartupThisAp = eficall! {fn(
+ *mut Protocol,
+ ApProcedure,
+ usize,
+ crate::base::Event,
+ usize,
+ *mut core::ffi::c_void,
+ *mut crate::base::Boolean,
+) -> crate::base::Status};
+
+pub type SwitchBsp = eficall! {fn(
+ *mut Protocol,
+ usize,
+ crate::base::Boolean,
+) -> crate::base::Status};
+
+pub type EnableDisableAp = eficall! {fn(
+ *mut Protocol,
+ usize,
+ crate::base::Boolean,
+ *mut u32,
+) -> crate::base::Status};
+
+pub type WhoAmI = eficall! {fn(
+ *mut Protocol,
+ *mut usize,
+) -> crate::base::Status};
+
+#[repr(C)]
+pub struct Protocol {
+ pub get_number_of_processors: GetNumberOfProcessors,
+ pub get_processor_info: GetProcessorInfo,
+ pub startup_all_aps: StartupAllAps,
+ pub startup_this_ap: StartupThisAp,
+ pub switch_bsp: SwitchBsp,
+ pub enable_disable_ap: EnableDisableAp,
+ pub who_am_i: WhoAmI,
+}