preemptive_threads/
context.rs

1use crate::thread::ThreadContext;
2
3/// # Safety
4/// This function performs low-level context switching between threads.
5/// Caller must ensure valid ThreadContext pointers and proper thread state.
6#[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.");