163 lines
3.9 KiB
Rust
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
|
|
}
|
|
}
|
|
}
|