1use core::ffi::c_uint;
8
9use sel4_config::{sel4_cfg_enum, sel4_cfg_wrap_match};
10
11use crate::{
12 ObjectBlueprint, ObjectBlueprintSeL4Arch, ObjectType, ObjectTypeSeL4Arch,
13 const_helpers::u32_into_usize, sys,
14};
15
16pub type ObjectTypeArch = ObjectTypeX86;
17
18pub type ObjectBlueprintArch = ObjectBlueprintX86;
19
20#[sel4_cfg_enum]
21#[derive(Debug, Clone, Eq, PartialEq)]
22pub enum ObjectTypeX86 {
23 _4k,
24 LargePage,
25 PageTable,
26 PageDirectory,
27 #[sel4_cfg(IOMMU)]
28 IOPageTable,
29 #[sel4_cfg(VTX)]
30 VCpu,
31 #[sel4_cfg(VTX)]
32 EPTPageDirectory,
33 #[sel4_cfg(VTX)]
34 EPTPageTable,
35 SeL4Arch(ObjectTypeSeL4Arch),
36}
37
38impl ObjectTypeX86 {
39 pub(crate) const fn into_sys(self) -> c_uint {
40 sel4_cfg_wrap_match! {
41 match self {
42 Self::_4k => sys::_object::seL4_X86_4K,
43 Self::LargePage => sys::_object::seL4_X86_LargePageObject,
44 Self::PageTable => sys::_object::seL4_X86_PageTableObject,
45 Self::PageDirectory => sys::_object::seL4_X86_PageDirectoryObject,
46 #[sel4_cfg(IOMMU)]
47 Self::IOPageTable => sys::_object::seL4_X86_IOPageTableObject,
48 #[sel4_cfg(VTX)]
49 Self::VCpu => sys::_object::seL4_X86_VCPUObject,
50 #[sel4_cfg(VTX)]
51 Self::EPTPageDirectory => sys::_object::seL4_X86_EPTPDObject,
52 #[sel4_cfg(VTX)]
53 Self::EPTPageTable => sys::_object::seL4_X86_EPTPTObject,
54 Self::SeL4Arch(sel4_arch) => sel4_arch.into_sys(),
55 }
56 }
57 }
58}
59
60impl From<ObjectTypeSeL4Arch> for ObjectTypeArch {
61 fn from(ty: ObjectTypeSeL4Arch) -> Self {
62 Self::SeL4Arch(ty)
63 }
64}
65
66impl From<ObjectTypeSeL4Arch> for ObjectType {
67 fn from(ty: ObjectTypeSeL4Arch) -> Self {
68 Self::from(ObjectTypeArch::from(ty))
69 }
70}
71
72#[sel4_cfg_enum]
73#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
74pub enum ObjectBlueprintX86 {
75 _4k,
76 LargePage,
77 PageTable,
78 PageDirectory,
79 #[sel4_cfg(IOMMU)]
80 IOPageTable,
81 #[sel4_cfg(VTX)]
82 VCpu,
83 #[sel4_cfg(VTX)]
84 EPTPageDirectory,
85 #[sel4_cfg(VTX)]
86 EPTPageTable,
87 SeL4Arch(ObjectBlueprintSeL4Arch),
88}
89
90impl ObjectBlueprintX86 {
91 pub(crate) const fn ty(self) -> ObjectTypeX86 {
92 sel4_cfg_wrap_match! {
93 match self {
94 Self::_4k => ObjectTypeX86::_4k,
95 Self::LargePage => ObjectTypeX86::LargePage,
96 Self::PageTable => ObjectTypeX86::PageTable,
97 Self::PageDirectory => ObjectTypeX86::PageDirectory,
98 #[sel4_cfg(IOMMU)]
99 Self::IOPageTable => ObjectTypeX86::IOPageTable,
100 #[sel4_cfg(VTX)]
101 Self::VCpu => ObjectTypeX86::VCpu,
102 #[sel4_cfg(VTX)]
103 Self::EPTPageDirectory => ObjectTypeX86::EPTPageDirectory,
104 #[sel4_cfg(VTX)]
105 Self::EPTPageTable => ObjectTypeX86::EPTPageTable,
106 Self::SeL4Arch(sel4_arch) => ObjectTypeX86::SeL4Arch(sel4_arch.ty()),
107 }
108 }
109 }
110
111 pub(crate) const fn physical_size_bits(self) -> usize {
112 sel4_cfg_wrap_match! {
113 match self {
114 Self::_4k => u32_into_usize(sys::seL4_PageBits),
115 Self::LargePage => u32_into_usize(sys::seL4_LargePageBits),
116 Self::PageTable => u32_into_usize(sys::seL4_PageTableBits),
117 Self::PageDirectory => u32_into_usize(sys::seL4_PageDirBits),
118 #[sel4_cfg(IOMMU)]
119 Self::IOPageTable => u32_into_usize(sys::seL4_IOPageTableBits),
120 #[sel4_cfg(VTX)]
121 Self::VCpu => u32_into_usize(sys::seL4_VCPUBits),
122 #[sel4_cfg(VTX)]
123 Self::EPTPageDirectory => u32_into_usize(sys::seL4_X86_EPTPDBits),
124 #[sel4_cfg(VTX)]
125 Self::EPTPageTable => u32_into_usize(sys::seL4_X86_EPTPTBits),
126 Self::SeL4Arch(sel4_arch) => sel4_arch.physical_size_bits(),
127 }
128 }
129 }
130}
131
132impl From<ObjectBlueprintSeL4Arch> for ObjectBlueprintArch {
133 fn from(blueprint: ObjectBlueprintSeL4Arch) -> Self {
134 Self::SeL4Arch(blueprint)
135 }
136}
137
138impl From<ObjectBlueprintSeL4Arch> for ObjectBlueprint {
139 fn from(ty: ObjectBlueprintSeL4Arch) -> Self {
140 Self::from(ObjectBlueprintArch::from(ty))
141 }
142}