This repository has been archived by the owner on Nov 10, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathsysv.rs
68 lines (64 loc) · 1.8 KB
/
sysv.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
// SPDX-License-Identifier: Apache-2.0
#[derive(Default)]
#[repr(C, align(16))]
pub struct Context([usize; 8]);
impl Context {
#[naked]
#[inline(never)]
pub extern "C" fn wipe() {
unsafe {
asm!(
"xor rax, rax",
"xor rcx, rcx",
"xor rdx, rdx",
"xor rdi, rdi",
"xor rsi, rsi",
"xor r8, r8",
"xor r9, r9",
"xor r10, r10",
"xor r11, r11",
"add rax, rax",
"cld",
"ret",
options(noreturn)
)
}
}
#[naked]
#[must_use]
#[inline(never)]
pub extern "C" fn save(&mut self) -> bool {
unsafe {
asm!(
"pop rsi",
"mov [rdi + 0x00], r15",
"mov [rdi + 0x08], r14",
"mov [rdi + 0x10], r13",
"mov [rdi + 0x18], r12",
"mov [rdi + 0x20], rbx",
"mov [rdi + 0x28], rbp",
"mov [rdi + 0x30], rsp",
"mov [rdi + 0x38], rsi",
"mov rax, 1",
"jmp rsi",
options(noreturn)
)
}
}
#[naked]
#[inline(never)]
pub unsafe extern "C" fn load(&self) -> ! {
asm!(
"mov rax, 0",
"mov r15, [rdi + 0x00]",
"mov r14, [rdi + 0x08]",
"mov r13, [rdi + 0x10]",
"mov r12, [rdi + 0x18]",
"mov rbx, [rdi + 0x20]",
"mov rbp, [rdi + 0x28]",
"mov rsp, [rdi + 0x30]",
"jmp [rdi + 0x38]",
options(noreturn)
)
}
}