1use core::{
2 mem,
3 ops::{Deref, DerefMut},
4 slice,
5};
6
7pub const PAGE_SIZE: usize = 4096;
8pub const KERNEL_METADATA_SIZE: usize = 4 * PAGE_SIZE;
10
11#[cfg(feature = "userspace")]
12macro_rules! syscall {
13 ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, $($g:ident, )?)?)?)?)?)?);)+) => {
14 $(
15 pub unsafe fn $name(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize, $($g: usize)?)?)?)?)?)?) -> crate::error::Result<usize> {
16 core::arch::asm!(
17 "syscall",
18 inout("rax") $a,
19 $(
20 in("rdi") $b,
21 $(
22 in("rsi") $c,
23 $(
24 in("rdx") $d,
25 $(
26 in("r10") $e,
27 $(
28 in("r8") $f,
29 $(
30 in("r9") $g,
31 )?
32 )?
33 )?
34 )?
35 )?
36 )?
37 out("rcx") _,
38 out("r11") _,
39 options(nostack),
40 );
41
42 crate::error::Error::demux($a)
43 }
44 )+
45 };
46}
47
48#[cfg(feature = "userspace")]
49syscall! {
50 syscall0(a,);
51 syscall1(a, b,);
52 syscall2(a, b, c,);
53 syscall3(a, b, c, d,);
54 syscall4(a, b, c, d, e,);
55 syscall5(a, b, c, d, e, f,);
56 syscall6(a, b, c, d, e, f, g,);
57}
58
59#[derive(Copy, Clone, Debug, Default)]
60#[repr(C)]
61pub struct IntRegisters {
62 pub r15: usize,
63 pub r14: usize,
64 pub r13: usize,
65 pub r12: usize,
66 pub rbp: usize,
67 pub rbx: usize,
68 pub r11: usize,
69 pub r10: usize,
70 pub r9: usize,
71 pub r8: usize,
72 pub rax: usize,
73 pub rcx: usize,
74 pub rdx: usize,
75 pub rsi: usize,
76 pub rdi: usize,
77 pub rip: usize,
78 pub cs: usize,
79 pub rflags: usize,
80 pub rsp: usize,
81 pub ss: usize,
82}
83
84impl Deref for IntRegisters {
85 type Target = [u8];
86 fn deref(&self) -> &[u8] {
87 unsafe { slice::from_raw_parts(self as *const Self as *const u8, mem::size_of::<Self>()) }
88 }
89}
90
91impl DerefMut for IntRegisters {
92 fn deref_mut(&mut self) -> &mut [u8] {
93 unsafe { slice::from_raw_parts_mut(self as *mut Self as *mut u8, mem::size_of::<Self>()) }
94 }
95}
96
97#[derive(Clone, Copy, Debug, Default)]
98#[repr(C, packed)]
99pub struct FloatRegisters {
100 pub fcw: u16,
101 pub fsw: u16,
102 pub ftw: u8,
103 pub _reserved: u8,
104 pub fop: u16,
105 pub fip: u64,
106 pub fdp: u64,
107 pub mxcsr: u32,
108 pub mxcsr_mask: u32,
109 pub st_space: [u128; 8],
110 pub xmm_space: [u128; 16],
111 }
113
114impl Deref for FloatRegisters {
115 type Target = [u8];
116 fn deref(&self) -> &[u8] {
117 unsafe {
118 slice::from_raw_parts(
119 self as *const FloatRegisters as *const u8,
120 mem::size_of::<FloatRegisters>(),
121 )
122 }
123 }
124}
125
126impl DerefMut for FloatRegisters {
127 fn deref_mut(&mut self) -> &mut [u8] {
128 unsafe {
129 slice::from_raw_parts_mut(
130 self as *mut FloatRegisters as *mut u8,
131 mem::size_of::<FloatRegisters>(),
132 )
133 }
134 }
135}
136#[derive(Clone, Copy, Debug, Default)]
137#[repr(C, packed)]
138pub struct EnvRegisters {
139 pub fsbase: u64,
140 pub gsbase: u64,
141 }
143impl Deref for EnvRegisters {
144 type Target = [u8];
145 fn deref(&self) -> &[u8] {
146 unsafe {
147 slice::from_raw_parts(
148 self as *const EnvRegisters as *const u8,
149 mem::size_of::<EnvRegisters>(),
150 )
151 }
152 }
153}
154
155impl DerefMut for EnvRegisters {
156 fn deref_mut(&mut self) -> &mut [u8] {
157 unsafe {
158 slice::from_raw_parts_mut(
159 self as *mut EnvRegisters as *mut u8,
160 mem::size_of::<EnvRegisters>(),
161 )
162 }
163 }
164}
165
166#[derive(Clone, Copy, Debug, Default)]
167#[repr(C, packed)]
168pub struct Exception {
169 pub kind: usize,
170 pub code: usize,
171 pub address: usize,
172}
173impl Deref for Exception {
174 type Target = [u8];
175 fn deref(&self) -> &[u8] {
176 unsafe {
177 slice::from_raw_parts(
178 self as *const Exception as *const u8,
179 mem::size_of::<Exception>(),
180 )
181 }
182 }
183}
184
185impl DerefMut for Exception {
186 fn deref_mut(&mut self) -> &mut [u8] {
187 unsafe {
188 slice::from_raw_parts_mut(
189 self as *mut Exception as *mut u8,
190 mem::size_of::<Exception>(),
191 )
192 }
193 }
194}