sel4/arch/x86/
object.rs

1//
2// Copyright 2023, Colias Group, LLC
3//
4// SPDX-License-Identifier: MIT
5//
6
7use 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}