Skip to main content

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(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}