Description
All the UEFI functions are declared with the extern "C"
calling convention, which matches the specification.
However, this raises an issue regarding the ABI on x64: extern "C"
refers to MS's ABI when compiling for Windows-like targets, but refers to the System-V ABI when compiling for UNIX targets.
This is OK when building with the example target.json
, since it tells LLVM to compile for the x86_64-pc-windows-gnu
target, which makes it use the MS ABI.
This can cause an issue if the calling executable does not use the MS ABI: if an OS kernel were to be built as an ELF executable, and use this crate for calling UEFI runtime services, it would lead to undefined behavior, since the ELF ABI, gnuabi
, is not the same as UEFI's ABI, msabi
.
With C compilers we could make a distinction with __attribute__((msabi))
and __attribute__((gnuabi))
, but Rust doesn't seem to make that kind of distinction.
Basically, we need to find a way to have functions declared as extern "C"
when compiling for all targets except x86_64, where we'll have to use extern "win64"
(because otherwise extern "C"
becomes extern "sysv64"
, which is incorrect).