]> git.proxmox.com Git - cargo.git/blob - vendor/redox_syscall/src/arch/x86.rs
New upstream version 0.63.1
[cargo.git] / vendor / redox_syscall / src / arch / x86.rs
1 use core::{mem, slice};
2 use core::arch::asm;
3 use core::ops::{Deref, DerefMut};
4
5 use super::error::{Error, Result};
6
7 macro_rules! syscall {
8 ($($name:ident($a:ident, $($b:ident, $($c:ident, $($d:ident, $($e:ident, $($f:ident, )?)?)?)?)?);)+) => {
9 $(
10 pub unsafe fn $name(mut $a: usize, $($b: usize, $($c: usize, $($d: usize, $($e: usize, $($f: usize)?)?)?)?)?) -> Result<usize> {
11 asm!(
12 "int 0x80",
13 inout("eax") $a,
14 $(
15 in("ebx") $b,
16 $(
17 in("ecx") $c,
18 $(
19 in("edx") $d,
20 $(
21 in("esi") $e,
22 $(
23 in("edi") $f,
24 )?
25 )?
26 )?
27 )?
28 )?
29 options(nostack),
30 );
31
32 Error::demux($a)
33 }
34 )+
35 };
36 }
37
38 syscall! {
39 syscall0(a,);
40 syscall1(a, b,);
41 syscall2(a, b, c,);
42 syscall3(a, b, c, d,);
43 // Must be done custom because LLVM reserves ESI
44 //syscall4(a, b, c, d, e,);
45 //syscall5(a, b, c, d, e, f,);
46 }
47
48 pub unsafe fn syscall4(mut a: usize, b: usize, c: usize, d: usize, e: usize)
49 -> Result<usize> {
50 asm!(
51 "xchg esi, {e}
52 int 0x80
53 xchg esi, {e}",
54 e = in(reg) e,
55 inout("eax") a,
56 in("ebx") b,
57 in("ecx") c,
58 in("edx") d,
59 options(nostack),
60 );
61
62 Error::demux(a)
63 }
64
65 pub unsafe fn syscall5(mut a: usize, b: usize, c: usize, d: usize, e: usize, f: usize)
66 -> Result<usize> {
67 asm!(
68 "xchg esi, {e}
69 int 0x80
70 xchg esi, {e}",
71 e = in(reg) e,
72 inout("eax") a,
73 in("ebx") b,
74 in("ecx") c,
75 in("edx") d,
76 in("edi") f,
77 options(nostack),
78 );
79
80 Error::demux(a)
81 }
82
83 #[derive(Clone, Copy, Debug, Default)]
84 #[repr(packed)]
85 pub struct EnvRegisters {
86 pub fsbase: u32,
87 pub gsbase: u32,
88 }
89
90 impl Deref for EnvRegisters {
91 type Target = [u8];
92 fn deref(&self) -> &[u8] {
93 unsafe {
94 slice::from_raw_parts(self as *const EnvRegisters as *const u8, mem::size_of::<EnvRegisters>())
95 }
96 }
97 }
98
99 impl DerefMut for EnvRegisters {
100 fn deref_mut(&mut self) -> &mut [u8] {
101 unsafe {
102 slice::from_raw_parts_mut(self as *mut EnvRegisters as *mut u8, mem::size_of::<EnvRegisters>())
103 }
104 }
105 }