Start adding ABI types

This commit is contained in:
Artemis Tosini 2024-07-29 21:57:28 +00:00
parent c2f378c0ce
commit 15bb412b83
Signed by: artemist
GPG key ID: EE5227935FE3FF18
4 changed files with 131 additions and 0 deletions

38
Cargo.lock generated
View file

@ -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"

View file

@ -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" ] }

90
src/abi.rs Normal file
View file

@ -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<Self> {
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<T> {
ident: ModInfo,
size: u32,
data: T,
}
#[repr(C)]
pub struct FileMetadataElem<T> {
size: usize,
typ: FileMetadataType,
addr: *const T,
next: Option<*const FileMetadataElem<T>>,
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,
}

View file

@ -1,6 +1,8 @@
#![no_main]
#![no_std]
mod abi;
use log::info;
use uefi::prelude::*;