boot_services/
protocol_handler.rs1use core::{ffi::c_void, ops::Deref, ptr::NonNull};
2
3use r_efi::efi;
4
5pub unsafe trait Protocol: Deref<Target = efi::Guid> {
6 type Interface;
7 fn protocol_guid(&self) -> &'static efi::Guid;
8}
9
10pub type Registration = NonNull<c_void>;
11
12#[derive(Debug, Clone, Copy)]
13pub enum HandleSearchType {
14 AllHandle,
15 ByRegisterNotify(Registration),
16 ByProtocol(&'static efi::Guid),
17}
18
19impl Into<efi::LocateSearchType> for HandleSearchType {
20 fn into(self) -> efi::LocateSearchType {
21 match self {
22 HandleSearchType::AllHandle => efi::ALL_HANDLES,
23 HandleSearchType::ByRegisterNotify(_) => efi::BY_REGISTER_NOTIFY,
24 HandleSearchType::ByProtocol(_) => efi::BY_PROTOCOL,
25 }
26 }
27}
28
29macro_rules! impl_protocol {
30 ($protocol_struct:ident, $protocol_type:ty, $guid:expr) => {
31 pub struct $protocol_struct;
32 unsafe impl Protocol for $protocol_struct {
33 type Interface = $protocol_type;
34 fn protocol_guid(&self) -> &'static efi::Guid {
35 &$guid
36 }
37 }
38 impl core::ops::Deref for $protocol_struct {
39 type Target = r_efi::efi::Guid;
40 fn deref(&self) -> &Self::Target {
41 &self.protocol_guid()
42 }
43 }
44 };
45}
46
47macro_rules! impl_r_efi_protocol {
48 ($protocol_struct:ident, $protocol:ident) => {
49 impl_protocol! {
50 $protocol_struct,
51 r_efi::efi::protocols::$protocol::Protocol,
52 r_efi::efi::protocols::$protocol::PROTOCOL_GUID
53 }
54 };
55}
56
57impl_r_efi_protocol!(AbsolutePointer, absolute_pointer);
58impl_r_efi_protocol!(BlockIo, block_io);
59impl_r_efi_protocol!(BusSpecificDriverOverride, bus_specific_driver_override);
60impl_r_efi_protocol!(DebugSupport, debug_support);
61impl_r_efi_protocol!(DebugPort, debugport);
62impl_r_efi_protocol!(Decompress, decompress);
63impl_r_efi_protocol!(DevicePath, device_path);
64impl_r_efi_protocol!(DevicePathFromText, device_path_from_text);
65impl_r_efi_protocol!(DevicePathUtilities, device_path_utilities);
66impl_r_efi_protocol!(DiskIo, disk_io);
67impl_r_efi_protocol!(DiskIo2, disk_io2);
68impl_r_efi_protocol!(DriverBinding, driver_binding);
69impl_r_efi_protocol!(DriverDiagnostic2, driver_diagnostics2);
70impl_r_efi_protocol!(DriverFamilyOverride, driver_family_override);
71impl_r_efi_protocol!(GraphicOutput, graphics_output);
73impl_r_efi_protocol!(HiiDatabase, hii_database);
74impl_r_efi_protocol!(HiiFont, hii_font);
75impl_r_efi_protocol!(HiiFontEx, hii_font_ex);
76impl_r_efi_protocol!(HiiString, hii_string);
78impl_r_efi_protocol!(Ip4, ip4);
79impl_r_efi_protocol!(Ip6, ip6);
80impl_r_efi_protocol!(LoadFile, load_file);
81impl_r_efi_protocol!(LoadFile2, load_file2);
82impl_r_efi_protocol!(LoadedImage, loaded_image);
83impl_protocol!(
84 LoadedImageDevicePath,
85 efi::protocols::loaded_image::Protocol,
86 efi::protocols::loaded_image_device_path::PROTOCOL_GUID
87);
88impl_r_efi_protocol!(ManagedNetwork, managed_network);
89impl_r_efi_protocol!(MpService, mp_services);
90impl_r_efi_protocol!(PciIo, pci_io);
91impl_r_efi_protocol!(PlatformDriverOverride, platform_driver_override);
92impl_r_efi_protocol!(Rng, rng);
93impl_r_efi_protocol!(Shell, shell);
95impl_r_efi_protocol!(ShellDynamicCommand, shell_dynamic_command);
96impl_r_efi_protocol!(ShellParameters, shell_parameters);
97impl_r_efi_protocol!(SimpleFileSystem, simple_file_system);
98impl_r_efi_protocol!(SimpleNetwork, simple_network);
99impl_r_efi_protocol!(SimpleTextInput, simple_text_input);
100impl_r_efi_protocol!(SimpleTextInputEx, simple_text_input_ex);
101impl_r_efi_protocol!(SimpleTextOutput, simple_text_output);
102impl_r_efi_protocol!(Tcp4, tcp4);
103impl_r_efi_protocol!(Tcp6, tcp6);
104impl_r_efi_protocol!(Timerstamp, timestamp);
105impl_r_efi_protocol!(Udp4, udp4);
106impl_r_efi_protocol!(Udp6, udp6);