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(VTX)]
28 VCpu,
29 #[sel4_cfg(VTX)]
30 EPTPageDirectory,
31 #[sel4_cfg(VTX)]
32 EPTPageTable,
33 SeL4Arch(ObjectTypeSeL4Arch),
34}
35
36impl ObjectTypeX86 {
37 pub(crate) const fn into_sys(self) -> c_uint {
38 sel4_cfg_wrap_match! {
39 match self {
40 Self::_4k => sys::_object::seL4_X86_4K,
41 Self::LargePage => sys::_object::seL4_X86_LargePageObject,
42 Self::PageTable => sys::_object::seL4_X86_PageTableObject,
43 Self::PageDirectory => sys::_object::seL4_X86_PageDirectoryObject,
44 #[sel4_cfg(VTX)]
45 Self::VCpu => sys::_object::seL4_X86_VCPUObject,
46 #[sel4_cfg(VTX)]
47 Self::EPTPageDirectory => sys::_object::seL4_X86_EPTPDObject,
48 #[sel4_cfg(VTX)]
49 Self::EPTPageTable => sys::_object::seL4_X86_EPTPTObject,
50 Self::SeL4Arch(sel4_arch) => sel4_arch.into_sys(),
51 }
52 }
53 }
54}
55
56impl From<ObjectTypeSeL4Arch> for ObjectTypeArch {
57 fn from(ty: ObjectTypeSeL4Arch) -> Self {
58 Self::SeL4Arch(ty)
59 }
60}
61
62impl From<ObjectTypeSeL4Arch> for ObjectType {
63 fn from(ty: ObjectTypeSeL4Arch) -> Self {
64 Self::from(ObjectTypeArch::from(ty))
65 }
66}
67
68#[sel4_cfg_enum]
69#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
70pub enum ObjectBlueprintX86 {
71 _4k,
72 LargePage,
73 PageTable,
74 PageDirectory,
75 #[sel4_cfg(VTX)]
76 VCpu,
77 #[sel4_cfg(VTX)]
78 EPTPageDirectory,
79 #[sel4_cfg(VTX)]
80 EPTPageTable,
81 SeL4Arch(ObjectBlueprintSeL4Arch),
82}
83
84impl ObjectBlueprintX86 {
85 pub(crate) const fn ty(self) -> ObjectTypeX86 {
86 sel4_cfg_wrap_match! {
87 match self {
88 Self::_4k => ObjectTypeX86::_4k,
89 Self::LargePage => ObjectTypeX86::LargePage,
90 Self::PageTable => ObjectTypeX86::PageTable,
91 Self::PageDirectory => ObjectTypeX86::PageDirectory,
92 #[sel4_cfg(VTX)]
93 Self::VCpu => ObjectTypeX86::VCpu,
94 #[sel4_cfg(VTX)]
95 Self::EPTPageDirectory => ObjectTypeX86::EPTPageDirectory,
96 #[sel4_cfg(VTX)]
97 Self::EPTPageTable => ObjectTypeX86::EPTPageTable,
98 Self::SeL4Arch(sel4_arch) => ObjectTypeX86::SeL4Arch(sel4_arch.ty()),
99 }
100 }
101 }
102
103 pub(crate) const fn physical_size_bits(self) -> usize {
104 sel4_cfg_wrap_match! {
105 match self {
106 Self::_4k => u32_into_usize(sys::seL4_PageBits),
107 Self::LargePage => u32_into_usize(sys::seL4_LargePageBits),
108 Self::PageTable => u32_into_usize(sys::seL4_PageTableBits),
109 Self::PageDirectory => u32_into_usize(sys::seL4_PageDirBits),
110 #[sel4_cfg(VTX)]
111 Self::VCpu => u32_into_usize(sys::seL4_VCPUBits),
112 #[sel4_cfg(VTX)]
113 Self::EPTPageDirectory => u32_into_usize(sys::seL4_X86_EPTPDBits),
114 #[sel4_cfg(VTX)]
115 Self::EPTPageTable => u32_into_usize(sys::seL4_X86_EPTPTBits),
116 Self::SeL4Arch(sel4_arch) => sel4_arch.physical_size_bits(),
117 }
118 }
119 }
120}
121
122impl From<ObjectBlueprintSeL4Arch> for ObjectBlueprintArch {
123 fn from(blueprint: ObjectBlueprintSeL4Arch) -> Self {
124 Self::SeL4Arch(blueprint)
125 }
126}
127
128impl From<ObjectBlueprintSeL4Arch> for ObjectBlueprint {
129 fn from(ty: ObjectBlueprintSeL4Arch) -> Self {
130 Self::from(ObjectBlueprintArch::from(ty))
131 }
132}