use super::responses::*;
use crate::LimineRequest;
use crate::{impl_request, LimineRequestMarker};
use core::{cell::UnsafeCell, ptr::NonNull};
const COMMON_MAGIC: [u64; 2] = [0xc7b1dd30df4c8b88, 0x0a82e883a194f07b];
#[macro_export]
macro_rules! impl_request {
($id1:expr, $id2:expr, $item:ident) => {
impl $item {
pub const ID: [u64; 4] = [COMMON_MAGIC[0], COMMON_MAGIC[1], $id1, $id2];
pub fn new() -> $item {
Self {
id: Self::ID,
..Self::default()
}
}
pub const fn into_request(self) -> LimineRequest<Self> {
LimineRequest(UnsafeCell::new(self))
}
}
impl LimineRequestMarker for $item {}
};
}
#[macro_export]
macro_rules! impl_request_with_lifetime {
($id1:expr, $id2:expr, $item:ident) => {
impl<'a> $item<'a> {
pub const ID: [u64; 4] = [COMMON_MAGIC[0], COMMON_MAGIC[1], $id1, $id2];
pub fn new() -> $item<'a> {
Self {
id: [COMMON_MAGIC[0], COMMON_MAGIC[1], $id1, $id2],
..Self::default()
}
}
pub const fn into_request(self) -> LimineRequest<Self> {
LimineRequest(UnsafeCell::new(self))
}
}
impl<'a> LimineRequestMarker for $item<'a> {}
};
}
#[repr(C)]
#[derive(Debug, Default)]
pub struct InfoRequest<'a> {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<InfoResponse<'a>>>,
}
impl_request_with_lifetime!(0xf55038d8e2a1202f, 0x279426fcf5f59740, InfoRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct StackSizeRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<StackSizeResponse>>,
pub stack_size: u64,
}
impl_request!(0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d, StackSizeRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct HHDMRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<HHDMResponse>>,
}
impl_request!(0x48dcf1cb8ad2b852, 0x63984e959a98244b, HHDMRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct TerminalRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<TerminalResponse>>,
}
impl_request!(0x0785a0aea5d0750f, 0x1c1936fee0d6cf6e, TerminalRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct FramebufferRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<FramebufferResponse>>,
}
impl_request!(0xcbfe81d7dd2d1977, 0x063150319ebc9b71, FramebufferRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct Level5PagingRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<Level5PagingResponse>>,
}
impl_request!(0x94469551da9b3192, 0xebe5e86db7382888, Level5PagingRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct SMPRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<SMPResponse>>,
pub flags: u64,
}
impl_request!(0x95a67b819a1b857e, 0xa0b61b723b6a73e0, SMPRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct MemoryMapRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<MemoryMapResponse>>,
}
impl_request!(0x67cf3d9d378a806f, 0xe304acdfc50c3c62, MemoryMapRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct EntryPointRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<EntryPointResponse>>,
pub entry: Option<*mut ()>,
}
impl_request!(0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a, EntryPointRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct KernelFileRequest<'a> {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<KernelFileResponse<'a>>>,
}
impl_request_with_lifetime!(0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69, KernelFileRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct ModuleRequest<'a> {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<ModuleResponse<'a>>>,
}
impl_request_with_lifetime!(0x3e7e279702be32af, 0xca1c4f3bd1280cee, ModuleRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct RSDPRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<RSDPResponse>>,
}
impl_request!(0xc5e77b6b397e7b43, 0x27637845accdcf3c, RSDPRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct SMBIOSRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<SMBIOSResponse>>,
}
impl_request!(0x9e9046f11e095391, 0xaa4a520fefbde5ee, SMBIOSRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct EfiSystemTableRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<EfiSystemTableResponse>>,
}
impl_request!(
0x5ceba5163eaaf6d6,
0x0a6981610cf65fcc,
EfiSystemTableRequest
);
#[repr(C)]
#[derive(Debug, Default)]
pub struct BootTimeRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<BootTimeResponse>>,
}
impl_request!(0x502746e184c088aa, 0xfbc5ec83e6327893, BootTimeRequest);
#[repr(C)]
#[derive(Debug, Default)]
pub struct KernelAddressRequest {
pub id: [u64; 4],
pub revision: u64,
pub response: Option<NonNull<KernelAddressResponse>>,
}
impl_request!(0x71ba76863cc55f63, 0xb2644a48c516a487, KernelAddressRequest);