Move global_asm inline in threads module

This commit is contained in:
Philipp Oppermann
2020-01-23 09:20:17 +01:00
parent cd138a3a1b
commit e1242a867f
2 changed files with 19 additions and 16 deletions

View File

@@ -1,13 +0,0 @@
.intel_syntax noprefix
asm_context_switch:
pushfq
mov rax, rsp
mov rsp, rdi
mov rdi, rax
call add_paused_thread
popfq
ret

View File

@@ -2,19 +2,35 @@ use alloc::collections::VecDeque;
use x86_64::structures::paging::{FrameAllocator, Mapper, Size4KiB};
use x86_64::VirtAddr;
global_asm!(include_str!("multitasking/context_switch.s"));
pub unsafe fn context_switch(stack_pointer: VirtAddr) {
asm!(
"call asm_context_switch"
:
: "{rdi}"(stack_pointer.as_u64())
: "rax", "rbx", "rcx", "rdx", "rsi", "rdi", "rpb", "r8", "r9", "r10",
"r11", "r12", "r13", "r14", "r15", "rflags", "memory"
"r11", "r12", "r13", "r14", "r15", "rflags", "memory"
: "intel", "volatile"
);
}
global_asm!(
"
.intel_syntax noprefix
asm_context_switch:
pushfq
mov rax, rsp
mov rsp, rdi
mov rdi, rax
call add_paused_thread
popfq
ret
"
);
pub fn scheduler() {
let next = PAUSED_THREADS.try_lock().and_then(|mut paused_threads| {
paused_threads