Skip to content

Commit 9990bba

Browse files
committed
Add support for efiapi abi
1 parent cc0cda6 commit 9990bba

7 files changed

Lines changed: 393 additions & 6 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ unexpected_cfgs = { level = "warn", check-cfg = [
4141
'cfg(has_abi_vectorcall)',
4242
'cfg(has_abi_win64)',
4343
'cfg(has_abi_sysv64)',
44-
'cfg(has_abi_aapcs)'
44+
'cfg(has_abi_aapcs)',
45+
'cfg(has_abi_efiapi)'
4546
]}

build.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,4 +34,11 @@ fn main() {
3434
if t.arch == Arch::Arm {
3535
cargo_emit::rustc_cfg!("has_abi_aapcs");
3636
}
37+
38+
if matches!(
39+
t.arch,
40+
Arch::X86 | Arch::X86_64 | Arch::Arm | Arch::AArch64 | Arch::Riscv32 | Arch::Riscv64
41+
) {
42+
cargo_emit::rustc_cfg!("has_abi_efiapi");
43+
}
3744
}

out.txt

Lines changed: 351 additions & 0 deletions
Large diffs are not rendered by default.

src/abi.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ define_abi_marker!(SysV64Unwind, "sysv64-unwind");
6363
define_abi_marker!(Win64, "win64");
6464
define_abi_marker!(Win64Unwind, "win64-unwind");
6565

66+
// Other
67+
define_abi_marker!(EfiApi, "efiapi");
68+
6669
/// Macro to convert an abi string to the corresponding [`Abi`] marker type.
6770
#[macro_export]
6871
macro_rules! abi {
@@ -136,4 +139,9 @@ macro_rules! abi {
136139
("win64-unwind") => {
137140
$crate::abi::Win64Unwind
138141
};
142+
143+
// Other
144+
("efiapi") => {
145+
$crate::abi::EfiApi
146+
};
139147
}

src/abi_value.rs

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,10 @@ pub enum AbiValue {
6868
/// Whether unwinding across this abi boundary is allowed (`*-unwind`).
6969
unwind: bool,
7070
},
71+
72+
/* Other */
73+
/// UEFI ABI, usually an alias of C, but sometimes an arch-specific alias.
74+
EfiApi,
7175
}
7276

7377
impl AbiValue {
@@ -76,6 +80,7 @@ impl AbiValue {
7680
pub const fn allows_unwind(&self) -> bool {
7781
match *self {
7882
AbiValue::Rust => true,
83+
AbiValue::EfiApi => false,
7984
AbiValue::C { unwind }
8085
| AbiValue::System { unwind }
8186
| AbiValue::Aapcs { unwind }
@@ -106,6 +111,8 @@ impl AbiValue {
106111
let arch_arm = cfg!(target_arch = "arm");
107112
let arch_aarch64 = cfg!(target_arch = "aarch64");
108113
let arch_arm_any = arch_arm || arch_aarch64;
114+
let arch_riscv32 = cfg!(target_arch = "riscv32");
115+
let arch_riscv64 = cfg!(target_arch = "riscv64");
109116

110117
#[allow(clippy::match_same_arms)]
111118
let out = match self {
@@ -144,6 +151,13 @@ impl AbiValue {
144151
AbiValue::SysV64 { unwind } if arch_x86_64 => AbiValue::SysV64 { unwind },
145152
AbiValue::Win64 { unwind } if arch_x86_64 => AbiValue::Win64 { unwind },
146153
AbiValue::SysV64 { .. } | AbiValue::Win64 { .. } => return None,
154+
155+
AbiValue::EfiApi if arch_x86_64 => AbiValue::Win64 { unwind: false },
156+
AbiValue::EfiApi if arch_arm => AbiValue::Aapcs { unwind: false },
157+
AbiValue::EfiApi if arch_x86 || arch_aarch64 || arch_riscv32 || arch_riscv64 => {
158+
AbiValue::C { unwind: false }
159+
}
160+
AbiValue::EfiApi => return None,
147161
};
148162

149163
Some(out)
@@ -160,8 +174,8 @@ macro_rules! abi_kind_impl {
160174
(
161175
$t:ty => {
162176
$(
163-
$variant:ident $( { unwind: $uw:literal } )? => $tok:literal,
164-
)*
177+
$variant:ident $( { unwind: $uw:literal } )? => $tok:literal
178+
),* $(,)?
165179
}
166180
) => {
167181
impl $t {
@@ -220,4 +234,5 @@ abi_kind_impl!(AbiValue => {
220234
SysV64 { unwind: true } => "sysv64-unwind",
221235
Win64 { unwind: false } => "win64",
222236
Win64 { unwind: true } => "win64-unwind",
237+
EfiApi => "efiapi"
223238
});

src/base.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,6 @@ ffi_opaque::opaque! {
2020
/// Type alias for a raw untyped function pointer.
2121
pub type UntypedFnPtr = *const OpaqueFn;
2222

23-
cfg_tt::cfg_tt! {}
24-
2523
cfg_tt::cfg_tt! {
2624
/// Marker trait for all function pointers.
2725
pub trait FnPtr:
@@ -66,6 +64,7 @@ pub trait FnPtr:
6664
#[cfg(has_abi_sysv64)](+ WithAbiImpl<abi::SysV64Unwind>)
6765
#[cfg(has_abi_win64)](+ WithAbiImpl<abi::Win64>)
6866
#[cfg(has_abi_win64)](+ WithAbiImpl<abi::Win64Unwind>)
67+
#[cfg(has_abi_efiapi)](+ WithAbiImpl<abi::EfiApi>)
6968
{
7069
/// The argument types as a tuple.
7170
type Args: Tuple;

src/impl.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ macro_rules! impl_fn {
2424
impl_fn!(@impl_u_and_s ($($nm : $ty),*), System, "system");
2525
impl_fn!(@impl_u_and_s ($($nm : $ty),*), SystemUnwind, "system-unwind");
2626

27-
// Common platform ABIs
27+
// Platform-specific ABIs
2828
#[cfg(has_abi_cdecl)]
2929
impl_fn!(@impl_u_and_s ($($nm : $ty),*), Cdecl, "cdecl");
3030
#[cfg(has_abi_cdecl)]
@@ -64,6 +64,9 @@ macro_rules! impl_fn {
6464
impl_fn!(@impl_u_and_s ($($nm : $ty),*), Aapcs, "aapcs");
6565
#[cfg(has_abi_aapcs)]
6666
impl_fn!(@impl_u_and_s ($($nm : $ty),*), AapcsUnwind, "aapcs-unwind");
67+
68+
#[cfg(has_abi_efiapi)]
69+
impl_fn!(@impl_u_and_s ($($nm : $ty),*), EfiApi, "efiapi");
6770
};
6871

6972
// call for safe and unsafe
@@ -170,6 +173,9 @@ macro_rules! impl_fn {
170173
impl_fn!(@impl_withabi ($($nm : $ty),*), $fn_type, $safety, "aapcs");
171174
#[cfg(has_abi_aapcs)]
172175
impl_fn!(@impl_withabi ($($nm : $ty),*), $fn_type, $safety, "aapcs-unwind");
176+
177+
#[cfg(has_abi_efiapi)]
178+
impl_fn!(@impl_withabi ($($nm : $ty),*), $fn_type, $safety, "efiapi");
173179
};
174180

175181
(@impl_withabi ($($nm:ident : $ty:ident),*), $fn_type:ty, $safety:tt, $abi:tt) => {

0 commit comments

Comments
 (0)