summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/Makefile1
-rw-r--r--kernel/include/syscall.h6
-rw-r--r--kernel/src/cpu/tss.c1
-rw-r--r--kernel/src/main.c2
-rw-r--r--kernel/src/sys/syscall.S0
-rw-r--r--kernel/src/sys/syscall.c9
-rw-r--r--kernel/src/sys/syscall_asm.S40
-rw-r--r--kernel/src/sys/userspace.c4
-rw-r--r--kernel/src/sys/userspace_asm.S5
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