diff options
Diffstat (limited to 'kernel/src/sys')
| -rw-r--r-- | kernel/src/sys/syscall.S | 0 | ||||
| -rw-r--r-- | kernel/src/sys/syscall.c | 9 | ||||
| -rw-r--r-- | kernel/src/sys/syscall_asm.S | 40 | ||||
| -rw-r--r-- | kernel/src/sys/userspace.c | 4 | ||||
| -rw-r--r-- | kernel/src/sys/userspace_asm.S | 5 |
5 files changed, 57 insertions, 1 deletions
diff --git a/kernel/src/sys/syscall.S b/kernel/src/sys/syscall.S deleted file mode 100644 index e69de29..0000000 --- a/kernel/src/sys/syscall.S +++ /dev/null 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 <libk/stdio.h> +#include <syscall.h> + +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 |
