refactor: tasks code cleanup

This commit is contained in:
Zoe
2026-09-03 07:13:35 -05:00
parent 4c32bcfb35
commit b0f804e412
13 changed files with 607 additions and 114 deletions
+4 -1
View File
@@ -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,
+5 -1
View File
@@ -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,
);