Files
opencoreC/kernel/src/limine_requests.rs
T

163 lines
3.9 KiB
Rust

//! Limine Bootloader Protocol Requests & Types for opencoreC Microkernel
//! Implements Base Revision 3 specification.
#[repr(C)]
pub struct LimineBaseRevision {
pub id: [u64; 4],
pub revision: u64,
}
unsafe impl Sync for LimineBaseRevision {}
#[repr(C)]
pub struct LimineHhdmResponse {
pub revision: u64,
pub offset: u64,
}
#[repr(C)]
pub struct LimineHhdmRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: *const LimineHhdmResponse,
}
unsafe impl Sync for LimineHhdmRequest {}
#[repr(C)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LimineMemoryType {
Usable = 0,
Reserved = 1,
AcpiReclaimable = 2,
AcpiNvs = 3,
BadMemory = 4,
BootloaderReclaimable = 5,
KernelAndModules = 6,
Framebuffer = 7,
}
#[repr(C)]
pub struct LimineMemmapEntry {
pub base: u64,
pub length: u64,
pub typ: u64,
}
#[repr(C)]
pub struct LimineMemmapResponse {
pub revision: u64,
pub entry_count: u64,
pub entries: *const *const LimineMemmapEntry,
}
#[repr(C)]
pub struct LimineMemmapRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: *const LimineMemmapResponse,
}
unsafe impl Sync for LimineMemmapRequest {}
#[repr(C)]
pub struct LimineKernelAddressResponse {
pub revision: u64,
pub physical_base: u64,
pub virtual_base: u64,
}
#[repr(C)]
pub struct LimineKernelAddressRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: *const LimineKernelAddressResponse,
}
unsafe impl Sync for LimineKernelAddressRequest {}
#[repr(C)]
pub struct LimineFile {
pub revision: u64,
pub address: *const u8,
pub size: u64,
pub path: *const u8,
pub cmdline: *const u8,
pub media_type: u32,
pub unused: u32,
pub tftp_ip: u32,
pub tftp_port: u32,
pub partition_index: u32,
pub mbr_disk_id: u32,
pub gpt_disk_uuid: [u8; 16],
pub gpt_part_uuid: [u8; 16],
pub part_uuid: [u8; 16],
}
#[repr(C)]
pub struct LimineModuleResponse {
pub revision: u64,
pub module_count: u64,
pub modules: *const *const LimineFile,
}
#[repr(C)]
pub struct LimineModuleRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: *const LimineModuleResponse,
pub internal_module_count: u64,
pub internal_modules: *const *const LimineFile,
}
unsafe impl Sync for LimineModuleRequest {}
/* Constants for Limine Request Identifiers */
#[used]
#[link_section = ".limine_requests"]
pub static BASE_REVISION: LimineBaseRevision = LimineBaseRevision {
id: [0xf9562b2d5c95a6c8, 0x6a59638edd43477b, 0, 3],
revision: 3,
};
#[used]
#[link_section = ".limine_requests"]
pub static HHDM_REQUEST: LimineHhdmRequest = LimineHhdmRequest {
id: [0xc7b1dd30df4c8b88, 0x0a82e883a194f07b, 0x48d150213051ecda, 0x21e2d0708170e71e],
revision: 0,
response: core::ptr::null(),
};
#[used]
#[link_section = ".limine_requests"]
pub static MEMMAP_REQUEST: LimineMemmapRequest = LimineMemmapRequest {
id: [0xc7b1dd30df4c8b88, 0x0a82e883a194f07b, 0x67cf3d9d378a14e6, 0xe310ac092f613308],
revision: 0,
response: core::ptr::null(),
};
#[used]
#[link_section = ".limine_requests"]
pub static KERNEL_ADDRESS_REQUEST: LimineKernelAddressRequest = LimineKernelAddressRequest {
id: [0xc7b1dd30df4c8b88, 0x0a82e883a194f07b, 0x71ba76863cc55f63, 0xb2644a48c516a487],
revision: 0,
response: core::ptr::null(),
};
#[used]
#[link_section = ".limine_requests"]
pub static MODULE_REQUEST: LimineModuleRequest = LimineModuleRequest {
id: [0xc7b1dd30df4c8b88, 0x0a82e883a194f07b, 0x3e7e2797022b3699, 0xa69dc94525d978b1],
revision: 0,
response: core::ptr::null(),
internal_module_count: 0,
internal_modules: core::ptr::null(),
};
/// Get HHDM direct map virtual offset
pub fn get_hhdm_offset() -> Option<u64> {
unsafe {
let resp = HHDM_REQUEST.response;
if !resp.is_null() {
Some((*resp).offset)
} else {
None
}
}
}