56 lines
1.9 KiB
Rust
56 lines
1.9 KiB
Rust
// Example: Hello World!
|
|
//
|
|
// This is an example UEFI application that prints "Hello World!", then waits
|
|
// for key input before it exits. It serves as base example how to write UEFI
|
|
// applications without any helper modules other than the UEFI protocol
|
|
// definitions.
|
|
//
|
|
// This example builds upon the `freestanding.rs` example, using the same setup
|
|
// and rust integration. See there for details on the panic-handler and entry
|
|
// point configuration.
|
|
//
|
|
// Note that UEFI uses UTF-16 strings. Since rust literals are UTF-8, we have
|
|
// to use an open-coded, zero-terminated, UTF-16 array as argument to
|
|
// `output_string()`. Similarly to the panic handler, real applications should
|
|
// rather use UTF-16 modules.
|
|
|
|
#![no_main]
|
|
#![no_std]
|
|
|
|
use r_efi::efi;
|
|
|
|
#[panic_handler]
|
|
fn panic_handler(_info: &core::panic::PanicInfo) -> ! {
|
|
loop {}
|
|
}
|
|
|
|
#[export_name = "efi_main"]
|
|
pub extern "C" fn main(_h: efi::Handle, st: *mut efi::SystemTable) -> efi::Status {
|
|
let s = [
|
|
0x0048u16, 0x0065u16, 0x006cu16, 0x006cu16, 0x006fu16, // "Hello"
|
|
0x0020u16, // " "
|
|
0x0057u16, 0x006fu16, 0x0072u16, 0x006cu16, 0x0064u16, // "World"
|
|
0x0021u16, // "!"
|
|
0x000au16, // "\n"
|
|
0x0000u16, // NUL
|
|
];
|
|
|
|
// Print "Hello World!".
|
|
let r =
|
|
unsafe { ((*(*st).con_out).output_string)((*st).con_out, s.as_ptr() as *mut efi::Char16) };
|
|
if r.is_error() {
|
|
return r;
|
|
}
|
|
|
|
// Wait for key input, by waiting on the `wait_for_key` event hook.
|
|
let r = unsafe {
|
|
let mut x: usize = 0;
|
|
((*(*st).boot_services).wait_for_event)(1, &mut (*(*st).con_in).wait_for_key, &mut x)
|
|
};
|
|
if r.is_error() {
|
|
return r;
|
|
}
|
|
|
|
efi::Status::SUCCESS
|
|
}
|