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