use core::ffi::CStr;
#[allow(unused_imports)]
use crate::{
requests::*,
structures::{
file::File,
framebuffer::Framebuffer,
memory_map_entry::MemoryMapEntry,
smpinfo::SMPInfo,
terminal::{Terminal, TerminalWriteFn},
},
};
#[repr(C)]
#[derive(Debug)]
pub struct InfoResponse<'a> {
pub revision: u64,
pub name: &'a CStr,
pub version: &'a CStr,
}
#[repr(C)]
#[derive(Debug)]
pub struct StackSizeResponse {
pub revision: u64,
}
#[repr(C)]
#[derive(Debug)]
pub struct HHDMResponse {
pub revision: u64,
pub offset: u64,
}
#[repr(C)]
#[derive(Debug)]
pub struct TerminalResponse {
pub revision: u64,
pub terminal_count: u64,
pub terminals: *const *const Terminal,
pub write: TerminalWriteFn,
}
impl TerminalResponse {
pub unsafe fn get_terminals(&self) -> Option<&[&Terminal]> {
if self.terminals.is_null() {
return None;
}
Some(core::slice::from_raw_parts(
self.terminals as *const &Terminal,
self.terminal_count as usize,
))
}
}
#[repr(C)]
#[derive(Debug)]
pub struct FramebufferResponse {
pub revision: u64,
pub framebuffer_count: u64,
pub framebuffers: *mut *mut Framebuffer,
}
impl FramebufferResponse {
pub unsafe fn get_framebuffers(&self) -> Option<&[&Framebuffer]> {
if self.framebuffers.is_null() {
return None;
}
Some(core::slice::from_raw_parts(
self.framebuffers as *const &Framebuffer,
self.framebuffer_count as usize,
))
}
}
#[repr(C)]
#[derive(Debug)]
pub struct Level5PagingResponse {
pub revision: u64,
}
#[repr(C)]
#[derive(Debug)]
pub struct SMPResponse {
pub revision: u64,
pub flags: u32,
pub bsp_lapic_id: u32,
pub cpu_count: u64,
pub cpus: *const *const SMPInfo,
}
impl SMPResponse {
pub unsafe fn get_cpu_info(&self) -> Option<&[&SMPInfo]> {
if self.cpus.is_null() {
return None;
}
Some(core::slice::from_raw_parts(
self.cpus as *const &SMPInfo,
self.cpu_count as usize,
))
}
}
#[repr(C)]
#[derive(Debug)]
pub struct MemoryMapResponse {
pub revision: u64,
pub entry_count: u64,
pub entries: *const *const MemoryMapEntry,
}
impl MemoryMapResponse {
pub unsafe fn get_memory_map(&self) -> Option<&[&MemoryMapEntry]> {
if self.entries.is_null() {
return None;
}
Some(core::slice::from_raw_parts(
self.entries as *const &MemoryMapEntry,
self.entry_count as usize,
))
}
}
#[repr(C)]
#[derive(Debug)]
pub struct EntryPointResponse {
pub revision: u64,
}
#[repr(C)]
#[derive(Debug)]
pub struct KernelFileResponse<'a> {
pub revision: u64,
pub kernel_file: *const File<'a>,
}
#[repr(C)]
#[derive(Debug)]
pub struct ModuleResponse<'a> {
pub revision: u64,
pub module_count: u64,
pub modules: *const *const File<'a>,
}
#[repr(C)]
#[derive(Debug)]
pub struct RSDPResponse {
pub revision: u64,
pub address: Option<*const u8>,
}
#[repr(C)]
#[derive(Debug)]
pub struct SMBIOSResponse {
pub revision: u64,
pub entry_32: Option<*const u8>,
pub entry_64: Option<*const u8>,
}
#[repr(C)]
#[derive(Debug)]
pub struct EfiSystemTableResponse {
pub revision: u64,
pub address: Option<*const u8>,
}
#[repr(C)]
#[derive(Debug)]
pub struct BootTimeResponse {
pub revision: u64,
pub boot_time: i64,
}
#[repr(C)]
#[derive(Debug)]
pub struct KernelAddressResponse {
pub revision: u64,
pub physical_base: u64,
pub virtual_base: u64,
}