diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/Makefile | 1 | ||||
| -rw-r--r-- | kernel/include/syscall.h | 6 | ||||
| -rw-r--r-- | kernel/src/cpu/tss.c | 1 | ||||
| -rw-r--r-- | kernel/src/main.c | 2 | ||||
| -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 |
9 files changed, 65 insertions, 3 deletions
diff --git a/kernel/Makefile b/kernel/Makefile index cff4fa2..9d7658b 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -28,6 +28,7 @@ OBJS = \ src/misc/debug.o \ src/misc/graphics.o \ src/misc/stdbuff.o \ + src/sys/syscall_asm.o \ src/sys/syscall.o \ src/sys/userspace_asm.o \ src/sys/userspace.o \ diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h new file mode 100644 index 0000000..440f9e6 --- /dev/null +++ b/kernel/include/syscall.h @@ -0,0 +1,6 @@ +#ifndef SYSCALL_H +#define SYSCALL_H + +void syscall_handler(void); + +#endif 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 --- 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 |
