refactor: tasks code cleanup
This commit is contained in:
@@ -202,7 +202,6 @@ pub unsafe fn enter_user(
|
||||
"mov ds, {user_data_selector:x}",
|
||||
"mov es, {user_data_selector:x}",
|
||||
"mov fs, {user_data_selector:x}",
|
||||
"mov gs, {user_data_selector:x}",
|
||||
|
||||
"push {user_data_selector}",
|
||||
"push {user_stack_pointer}",
|
||||
@@ -227,6 +226,10 @@ pub unsafe fn enter_user(
|
||||
"xor r14, r14",
|
||||
"xor r15, r15",
|
||||
|
||||
// Kernel GS is CpuLocal; leave it in IA32_KERNEL_GS_BASE so
|
||||
// syscall_entry can recover it with SWAPGS.
|
||||
"swapgs",
|
||||
"mov gs, {user_data_selector:x}",
|
||||
"iretq",
|
||||
user_data_selector = in(reg) gdt::USER_DATA_SELECTOR as usize,
|
||||
user_code_selector = in(reg) gdt::USER_CODE_SELECTOR as usize,
|
||||
|
||||
@@ -44,6 +44,10 @@ pub fn init(cpu_local: *const CpuLocal) {
|
||||
write_msr(IA32_FMASK, RFLAGS_MASK);
|
||||
write_msr(IA32_GS_BASE, 0);
|
||||
write_msr(IA32_KERNEL_GS_BASE, cpu_local as u64);
|
||||
|
||||
// Kernel code always runs with GS pointing at CpuLocal. User entry
|
||||
// swaps this into IA32_KERNEL_GS_BASE before transitioning to ring 3.
|
||||
asm!("swapgs", options(nostack, preserves_flags));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,7 +107,7 @@ unsafe extern "C" fn syscall_entry() {
|
||||
}
|
||||
|
||||
extern "C" fn syscall_dispatch(frame: &mut SyscallFrame) {
|
||||
let ret = crate::task::syscall::handle(
|
||||
let ret = crate::syscall::handle(
|
||||
frame.rax, frame.rdi, frame.rsi, frame.rdx, frame.r10, frame.r8, frame.r9,
|
||||
);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user