effie 0.0.1

Idiomatic api to uefi
Documentation
#![no_std]
#![feature(extended_varargs_abi_support)]
#![feature(allocator_api)]
#![feature(ptr_metadata)]

extern crate alloc;


use core::mem::MaybeUninit;

mod allocator;
mod protocol;
mod status;
mod types;
mod util;
mod wstr;

pub mod protocols;
pub mod tables;

pub use allocator::Allocator;
pub use protocol::Protocol;
pub use status::{Result, Status};
pub use types::*;
pub use wstr::WStr;

pub use uguid::Guid;

pub use effie_macros::w;

use tables::SystemTable;

static mut SYSTEM_TABLE: MaybeUninit<&SystemTable> = MaybeUninit::uninit();
static mut IMAGE_HANDLE: MaybeUninit<Handle> = MaybeUninit::uninit();

#[global_allocator]
static mut ALLOCATOR: Allocator = Allocator;

#[no_mangle]
extern "efiapi" fn efi_main(image_handle: Handle, system_table: &'static SystemTable) -> Status {
    extern "Rust" {
        fn main() -> Result;
    }

    unsafe { SYSTEM_TABLE.write(system_table) };
    unsafe { IMAGE_HANDLE.write(image_handle) };

    unsafe {
        if let Err(status) = main() {
            let _ = system_table.con_out().output_line(status.description());
            status
        } else {
            Status::SUCCESS
        }
    }
}

pub fn system_table() -> &'static SystemTable {
    unsafe { SYSTEM_TABLE.assume_init() }
}

pub fn image_handle() -> Handle {
    unsafe { IMAGE_HANDLE.assume_init() }
}