From 1effe3b9ac0bb1a819f6ae5ebb8438e60b77f9a2 Mon Sep 17 00:00:00 2001 From: Aleksa Vuckovic Date: Wed, 7 Sep 2022 22:10:02 +0200 Subject: syscall --- kernel/src/cpu/tss.c | 1 - kernel/src/main.c | 2 +- kernel/src/sys/syscall.S | 0 kernel/src/sys/syscall.c | 9 +++++++++ kernel/src/sys/syscall_asm.S | 40 ++++++++++++++++++++++++++++++++++++++++ kernel/src/sys/userspace.c | 4 +++- kernel/src/sys/userspace_asm.S | 5 +++++ 7 files changed, 58 insertions(+), 3 deletions(-) delete mode 100644 kernel/src/sys/syscall.S create mode 100644 kernel/src/sys/syscall.c create mode 100644 kernel/src/sys/syscall_asm.S (limited to 'kernel/src') diff --git a/kernel/src/cpu/tss.c b/kernel/src/cpu/tss.c index 843c114..a1224f6 100644 --- a/kernel/src/cpu/tss.c +++ b/kernel/src/cpu/tss.c @@ -18,5 +18,4 @@ void init_tss() tss.rsp0_high = (uint32_t)(stack >> 32); load_tss(); - printf("rsp0 addr in tss: 0x%x\n", stack); } diff --git a/kernel/src/main.c b/kernel/src/main.c index 4b0d62a..03e0168 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -25,8 +25,8 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) init_timer(TICKS_PER_SECOND); init_idt(); init_heap(); - read_mb2(multiboot_bootinfo, multiboot_magic); init_tss(); + read_mb2(multiboot_bootinfo, multiboot_magic); // disc_init(); // ext2_init(); // ls(path_to_inode("/")); diff --git a/kernel/src/sys/syscall.S b/kernel/src/sys/syscall.S deleted file mode 100644 index e69de29..0000000 diff --git a/kernel/src/sys/syscall.c b/kernel/src/sys/syscall.c new file mode 100644 index 0000000..7f0e492 --- /dev/null +++ b/kernel/src/sys/syscall.c @@ -0,0 +1,9 @@ +#include +#include + +void syscall_handler() +{ + uint64_t rax; + __asm__ volatile ("mov %%rax, %0;" : "=r"(rax) : :); + printf("syscall invoked with rax=0x%x\n", rax); +} diff --git a/kernel/src/sys/syscall_asm.S b/kernel/src/sys/syscall_asm.S new file mode 100644 index 0000000..a9942ca --- /dev/null +++ b/kernel/src/sys/syscall_asm.S @@ -0,0 +1,40 @@ +.extern syscall_handler + +.macro pushall + push %rax + push %rcx + push %rdx + push %rsi + push %rdi + push %r8 + push %r9 + push %r10 + push %r11 + pushfq +.endm + +.macro popall + popfq + pop %r11 + pop %r10 + pop %r9 + pop %r8 + pop %rdi + pop %rsi + pop %rdx + pop %rcx + pop %rax +.endm + +.global __syscall +__syscall: + pushq %rcx + pushq %r11 + + pushall + call syscall_handler + popall + + popfq + popq %rcx + sysretq diff --git a/kernel/src/sys/userspace.c b/kernel/src/sys/userspace.c index 4add4d5..111180a 100644 --- a/kernel/src/sys/userspace.c +++ b/kernel/src/sys/userspace.c @@ -3,7 +3,9 @@ void begin_userspace() { + __asm__ volatile ("mov $0x1, %rax; syscall;"); + __asm__ volatile ("mov $0x11, %rax; syscall;"); + __asm__ volatile ("mov $0x111, %rax; syscall;"); while(true) { - } } diff --git a/kernel/src/sys/userspace_asm.S b/kernel/src/sys/userspace_asm.S index c722df0..5817a8c 100644 --- a/kernel/src/sys/userspace_asm.S +++ b/kernel/src/sys/userspace_asm.S @@ -1,6 +1,7 @@ .text .extern begin_userspace +.extern syscall_handler .global jump_userspace jump_userspace: @@ -11,6 +12,10 @@ jump_userspace: mov %ax, %gs mov $0xc0000082, %rcx + movabs $__syscall, %rax + shr $32, %rax + mov %eax, %edx + movabs $__syscall, %rax wrmsr mov $0xc0000080, %rcx rdmsr -- cgit v1.2.3