Skip to content

Commit fdae11d

Browse files
task: push error stack instead of normal one
Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent 0a28db9 commit fdae11d

File tree

4 files changed

+24
-12
lines changed

4 files changed

+24
-12
lines changed

src/aero_kernel/src/arch/x86_64/syscall.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use crate::mem::paging::VirtAddr;
66
use crate::userland::scheduler;
77
use crate::utils::io;
88

9-
use super::interrupts::InterruptStack;
9+
use super::interrupts::InterruptErrorStack;
1010

1111
extern "C" {
1212
fn x86_64_syscall_handler();
@@ -54,7 +54,9 @@ fn arch_prctl(command: usize, address: usize) -> Result<usize, AeroSyscallError>
5454
}
5555

5656
#[no_mangle]
57-
extern "C" fn x86_64_do_syscall(stack: &mut InterruptStack) {
57+
extern "C" fn x86_64_do_syscall(stack: &mut InterruptErrorStack) {
58+
let stack = &mut stack.stack;
59+
5860
let syscall_number = stack.scratch.rax as usize; // syscall number
5961
let a = stack.scratch.rdi as usize; // argument 1
6062
let b = stack.scratch.rsi as usize; // argument 2

src/aero_kernel/src/arch/x86_64/syscall_handler.asm

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,19 @@ x86_64_syscall_handler:
7979
push r14
8080
push r15
8181

82+
; push a "fake" error code to match with the layout of the
83+
; `InterruptErrorStack` structure.
84+
push 0
85+
8286
mov rdi, rsp
8387

8488
cld
8589
call x86_64_do_syscall
8690
cli
8791

92+
; pop the "fake" error code
93+
add rsp, 8
94+
8895
; pop the preserved registers
8996
pop r15
9097
pop r14

src/aero_kernel/src/arch/x86_64/task.asm

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ iretq_init:
4444
jmp generic_iretq_init
4545

4646
generic_iretq_init:
47+
; pop the error code
48+
add rsp, 8
49+
4750
; pop the preserved registers
4851
pop r15
4952
pop r14

src/aero_kernel/src/arch/x86_64/task.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ use alloc::vec::Vec;
4040
use core::alloc::Layout;
4141
use core::ptr::Unique;
4242

43-
use crate::arch::interrupts::InterruptStack;
43+
use crate::arch::interrupts::InterruptErrorStack;
4444
use crate::fs::cache::DirCacheItem;
4545
use crate::mem::paging::*;
4646
use crate::syscall::ExecArgs;
@@ -147,13 +147,13 @@ impl ArchTask {
147147
let mut stack_ptr = task_stack as u64;
148148
let mut stack = StackHelper::new(&mut stack_ptr);
149149

150-
let kframe = unsafe { stack.offset::<InterruptStack>() };
150+
let kframe = unsafe { stack.offset::<InterruptErrorStack>() };
151151

152-
kframe.iret.ss = 0x10; // kernel stack segment
153-
kframe.iret.cs = 0x08; // kernel code segment
154-
kframe.iret.rip = entry_point.as_u64();
155-
kframe.iret.rsp = unsafe { task_stack.sub(8) as u64 };
156-
kframe.iret.rflags = if enable_interrupts { 0x200 } else { 0x00 };
152+
kframe.stack.iret.ss = 0x10; // kernel stack segment
153+
kframe.stack.iret.cs = 0x08; // kernel code segment
154+
kframe.stack.iret.rip = entry_point.as_u64();
155+
kframe.stack.iret.rsp = unsafe { task_stack.sub(8) as u64 };
156+
kframe.stack.iret.rflags = if enable_interrupts { 0x200 } else { 0x00 };
157157

158158
extern "C" {
159159
fn iretq_init();
@@ -208,11 +208,11 @@ impl ArchTask {
208208
let mut new_stack = StackHelper::new(&mut new_stack_ptr);
209209

210210
unsafe {
211-
let registers_frame = new_stack.offset::<InterruptStack>();
212-
let old_registers_frame = old_stack.offset::<InterruptStack>();
211+
let registers_frame = new_stack.offset::<InterruptErrorStack>();
212+
let old_registers_frame = old_stack.offset::<InterruptErrorStack>();
213213

214214
*registers_frame = *old_registers_frame;
215-
registers_frame.scratch.rax = 0x00; // Set the syscall result to 0
215+
registers_frame.stack.scratch.rax = 0x00; // Set the syscall result to 0
216216
}
217217

218218
// Prepare the trampoline...

0 commit comments

Comments
 (0)