| // Example: Freestanding |
| // |
| // This example is a plain UEFI application without any external requirements |
| // but `core`. It immediately returns control to the caller upon execution, |
| // yielding the exit code 0. |
| // |
| // The `main` function serves as entry-point. Depending on your |
| // target-configuration, it must be exported with a pre-configured name so the |
| // linker will correctly mark it as entry-point. The target configurations |
| // shipped with upstream rust-lang use `efi_main` as symbol name. |
| // |
| // Additionally, a panic handler is provided. This is executed by rust on |
| // panic. For simplicity, we simply end up in an infinite loop. For real |
| // applications, this method should probably call into |
| // `SystemTable->boot_services->exit()` to exit the UEFI application. Note, |
| // however, that UEFI applications are likely to run in the same address space |
| // as the entire firmware. Hence, halting the machine might be a viable |
| // alternative. All that is out-of-scope for this example, though. |
| // |
| // Note that as of rust-1.31.0, all features used here are stabilized. No |
| // unstable features are required, nor do we rely on nightly compilers. |
| |
| #![no_main] |
| #![no_std] |
| |
| #[panic_handler] |
| fn panic_handler(_info: &core::panic::PanicInfo) -> ! { |
| loop {} |
| } |
| |
| #[export_name = "efi_main"] |
| pub extern "C" fn main(_h: *mut core::ffi::c_void, _st: *mut core::ffi::c_void) -> usize { |
| 0 |
| } |