preemptive_threads/
context.rs1use crate::thread::ThreadContext;
2
3#[cfg(target_arch = "x86_64")]
7#[unsafe(naked)]
8#[no_mangle]
9pub unsafe extern "C" fn switch_context(from: *mut ThreadContext, to: *const ThreadContext) {
10 core::arch::naked_asm!(
11 "
12 push rbp
13 push rbx
14 push r12
15 push r13
16 push r14
17 push r15
18 pushfq
19
20 mov [rdi + 0], rsp
21 mov [rdi + 8], rbp
22 mov [rdi + 16], rbx
23 mov [rdi + 24], r12
24 mov [rdi + 32], r13
25 mov [rdi + 40], r14
26 mov [rdi + 48], r15
27
28 mov rsp, [rsi + 0]
29 mov rbp, [rsi + 8]
30 mov rbx, [rsi + 16]
31 mov r12, [rsi + 24]
32 mov r13, [rsi + 32]
33 mov r14, [rsi + 40]
34 mov r15, [rsi + 48]
35
36 popfq
37 pop r15
38 pop r14
39 pop r13
40 pop r12
41 pop rbx
42 pop rbp
43
44 ret
45 "
46 );
47}
48
49#[cfg(not(target_arch = "x86_64"))]
50compile_error!("This library currently only supports x86_64 architecture. ARM64 and other architectures are not yet implemented.");