diff --git a/Cargo.lock b/Cargo.lock index cf5def9..30a555e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,16 +24,34 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "freeloader" version = "0.1.0" dependencies = [ + "goblin", "log", "uefi", ] +[[package]] +name = "goblin" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b363a30c165f666402fe6a3024d3bec7ebc898f96a4a23bd1c99f8dbf3f4f47" +dependencies = [ + "log", + "plain", + "scroll", +] + [[package]] name = "log" version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "proc-macro2" version = "1.0.86" @@ -72,6 +90,26 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "scroll" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab8598aa408498679922eff7fa985c25d58a90771bd6be794434c5277eab1a6" +dependencies = [ + "scroll_derive", +] + +[[package]] +name = "scroll_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f81c2fde025af7e69b1d1420531c8a8811ca898919db177141a85313b1cb932" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "syn" version = "1.0.109" diff --git a/Cargo.toml b/Cargo.toml index d164982..97badc6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,3 +6,4 @@ edition = "2021" [dependencies] uefi = { version = "0.29.0", default-features = false, features = [ "alloc", "global_allocator", "panic_handler", "logger" ] } log = { version = "0.4.22", default-features = false } +goblin = { version = "0.8.2", default_features = false, features = [ "elf32", "elf64", "alloc" ] } diff --git a/src/abi.rs b/src/abi.rs new file mode 100644 index 0000000..a370d43 --- /dev/null +++ b/src/abi.rs @@ -0,0 +1,90 @@ +use uefi::proto::console::gop::{GraphicsOutput, PixelFormat}; + +#[repr(C)] +pub struct EFIFramebufferParams { + pub addr: u64, + pub size: u64, + pub height: u32, + pub width: u32, + pub stride: u32, + pub mask_red: u32, + pub mask_green: u32, + pub mask_blue: u32, + pub mask_reserved: u32, +} + +impl EFIFramebufferParams { + pub fn from_graphics_output(graphics_output: &mut GraphicsOutput) -> Option { + let mode = graphics_output.current_mode_info(); + let (mask_red, mask_green, mask_blue, mask_reserved) = match mode.pixel_format() { + PixelFormat::Rgb => (0x0000_00ff, 0x0000_ff00, 0x00ff_0000, 0xff00_000), + PixelFormat::Bgr => (0x00ff_0000, 0x0000_ff00, 0x0000_00ff, 0xff00_000), + PixelFormat::Bitmask => { + let bitmask = mode.pixel_bitmask()?; + (bitmask.red, bitmask.green, bitmask.blue, bitmask.reserved) + } + _ => return None, + }; + + let (width, height) = mode.resolution(); + + let mut frame_buffer = graphics_output.frame_buffer(); + let size = frame_buffer.size(); + + Some(Self { + addr: frame_buffer.as_mut_ptr() as u64, + size: size.try_into().ok()?, + height: height.try_into().ok()?, + width: width.try_into().ok()?, + stride: mode.stride().try_into().ok()?, + mask_red, + mask_green, + mask_blue, + mask_reserved, + }) + } +} + +#[cfg_attr(target_pointer_width = "64", repr(C, align(8)))] +#[cfg_attr(target_pointer_width = "32", repr(C, align(4)))] +pub struct ModuleDirectoryElem { + ident: ModInfo, + size: u32, + data: T, +} + + +#[repr(C)] +pub struct FileMetadataElem { + size: usize, + typ: FileMetadataType, + addr: *const T, + next: Option<*const FileMetadataElem>, + data: T, +} + +#[repr(u32)] +pub enum ModInfo { + End = 0, + Name = 1, + Type = 2, + Addr = 3, + Size = 4, + Args = 6, +} + +#[repr(u16)] +pub enum FileMetadataType { + AoutExecHeader = 1, + ElfHeader = 2, + StartSymbols = 3, + EndSymbols = 4, + Dynamic = 5, + MB2Header = 6, + SectionHeader = 9, + CtorsAddress = 10, + CtorsSize = 11, + FirmwareHandle = 12, + KeyBuffer = 13, + Font = 14, +} diff --git a/src/main.rs b/src/main.rs index cfaf22e..42591aa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,8 @@ #![no_main] #![no_std] +mod abi; + use log::info; use uefi::prelude::*;