syscall/arch/
x86_64.rs

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    // TODO: YMM/ZMM
106}
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    // TODO: PKRU?
136}
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}