Skip to content

Commit db12578

Browse files
syscall: genericize the do_syscall function
Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent 77e7759 commit db12578

File tree

3 files changed

+45
-30
lines changed

3 files changed

+45
-30
lines changed

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,41 @@ use raw_cpuid::CpuId;
33
use crate::arch::gdt::GdtEntryType;
44
use crate::utils::io;
55

6+
use super::interrupts::InterruptStack;
7+
68
extern "C" {
79
fn x86_64_syscall_handler();
810
}
911

12+
#[no_mangle]
13+
extern "C" fn x86_64_do_syscall(stack: &mut InterruptStack) {
14+
let syscall_number = stack.scratch.rax as usize;
15+
16+
match syscall_number {
17+
aero_syscall::prelude::SYS_EXIT => {}
18+
aero_syscall::prelude::SYS_SIGRETURN => {
19+
let result = super::signals::sigreturn(stack);
20+
stack.scratch.rax = result as u64;
21+
return;
22+
}
23+
24+
_ => unsafe { super::interrupts::enable_interrupts() },
25+
}
26+
27+
let result_usize = crate::syscall::generic_do_syscall(
28+
syscall_number,
29+
stack.scratch.rdi as usize, // argument 1
30+
stack.scratch.rsi as usize, // argument 2
31+
stack.scratch.rdx as usize, // argument 3
32+
stack.scratch.r10 as usize, // argument 4
33+
stack.scratch.r8 as usize, // argument 5
34+
stack.scratch.r9 as usize, // argument 6
35+
);
36+
37+
super::signals::syscall_check_signals(result_usize as isize, stack);
38+
stack.scratch.rax = result_usize as _;
39+
}
40+
1041
/// Initializes support for the `syscall` and `sysret` instructions for the
1142
/// current CPU.
1243
pub(super) fn init() {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
; You should have received a copy of the GNU General Public License
1616
; along with Aero. If not, see <https://www.gnu.org/licenses/>.
1717

18-
extern __inner_syscall
18+
extern x86_64_do_syscall
1919
global x86_64_syscall_handler
2020

2121
%define TSS_TEMP_USTACK_OFF 0x1c
@@ -82,7 +82,7 @@ x86_64_syscall_handler:
8282
mov rdi, rsp
8383

8484
cld
85-
call __inner_syscall
85+
call x86_64_do_syscall
8686
cli
8787

8888
; pop the preserved registers

src/aero_kernel/src/syscall/mod.rs

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,7 @@ pub use ipc::*;
7575
pub use process::*;
7676
pub use time::*;
7777

78-
use crate::arch::interrupts::InterruptStack;
79-
use crate::arch::signals;
80-
use crate::arch::{interrupts};
81-
use crate::utils::{StackHelper};
78+
use crate::utils::StackHelper;
8279

8380
pub struct ExecArgs {
8481
inner: Vec<Box<[u8]>>,
@@ -128,27 +125,15 @@ pub fn exec_args_from_slice(args: usize, size: usize) -> ExecArgs {
128125
ExecArgs { inner: result }
129126
}
130127

131-
#[no_mangle]
132-
extern "C" fn __inner_syscall(stack: &mut InterruptStack) {
133-
let a = stack.scratch.rax as usize;
134-
let b = stack.scratch.rdi as usize;
135-
let c = stack.scratch.rsi as usize;
136-
let d = stack.scratch.rdx as usize;
137-
let e = stack.scratch.r10 as usize;
138-
let f = stack.scratch.r8 as usize;
139-
let g = stack.scratch.r9 as usize;
140-
141-
match a {
142-
SYS_EXIT => {}
143-
_ => unsafe { interrupts::enable_interrupts() },
144-
}
145-
146-
if a == SYS_SIGRETURN {
147-
let result = signals::sigreturn(stack);
148-
stack.scratch.rax = result as u64;
149-
return;
150-
}
151-
128+
pub fn generic_do_syscall(
129+
a: usize,
130+
b: usize,
131+
c: usize,
132+
d: usize,
133+
e: usize,
134+
f: usize,
135+
g: usize,
136+
) -> usize {
152137
let result = match a {
153138
SYS_EXIT => process::exit(b),
154139
SYS_SHUTDOWN => process::shutdown(),
@@ -204,7 +189,7 @@ extern "C" fn __inner_syscall(stack: &mut InterruptStack) {
204189
}
205190
};
206191

207-
let result_usize = aero_syscall::syscall_result_as_usize(result) as _;
192+
let result_usize = aero_syscall::syscall_result_as_usize(result);
208193

209194
#[cfg(feature = "syslog")]
210195
{
@@ -242,6 +227,5 @@ extern "C" fn __inner_syscall(stack: &mut InterruptStack) {
242227
uart_16550::serial_println!("{}", result_v);
243228
}
244229

245-
crate::arch::signals::syscall_check_signals(result_usize as isize, stack);
246-
stack.scratch.rax = result_usize;
230+
result_usize
247231
}

0 commit comments

Comments
 (0)