syscall base

This commit is contained in:
2023-10-26 16:17:30 +02:00
parent 19bf417ee0
commit 9fc44baaff
7 changed files with 90 additions and 8 deletions

View File

@@ -21,7 +21,9 @@ target_sources(kernel.elf PRIVATE
paging.cpp
kmain.cpp
gdt.cpp
misc.cpp)
misc.cpp
syscalls.cpp
syscalls.asm)
target_include_directories(kernel.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

View File

@@ -60,13 +60,6 @@ gdt_data:
db PRESENT | NOT_SYS | RW ; Access
db GRAN_4K | SZ_32 | 0xF ; Flags & Limit (high, bits 16-19)
db 0 ; Base (high, bits 24-31)
global gdt_code_user:data
gdt_code_user:
dd 0xFFFF ; Limit & Base (low, bits 0-15)
db 0 ; Base (mid, bits 16-23)
db PRESENT | USER | NOT_SYS | EXEC | RW ; Access
db GRAN_4K | LONG_MODE | 0xF ; Flags & Limit (high, bits 16-19)
db 0 ; Base (high, bits 24-31)
global gdt_data_user:data
gdt_data_user:
dd 0xFFFF ; Limit & Base (low, bits 0-15)
@@ -74,6 +67,13 @@ gdt_data_user:
db PRESENT | USER | NOT_SYS | RW ; Access
db GRAN_4K | SZ_32 | 0xF ; Flags & Limit (high, bits 16-19)
db 0 ; Base (high, bits 24-31)
global gdt_code_user:data
gdt_code_user:
dd 0xFFFF ; Limit & Base (low, bits 0-15)
db 0 ; Base (mid, bits 16-23)
db PRESENT | USER | NOT_SYS | EXEC | RW ; Access
db GRAN_4K | LONG_MODE | 0xF ; Flags & Limit (high, bits 16-19)
db 0 ; Base (high, bits 24-31)
global gdt_tss:data
gdt_tss:
dq 0x00000000 ;TODO

View File

@@ -15,6 +15,7 @@
#include "misc.hpp"
#include "mutex.hpp"
#include "rand.h"
#include "syscalls.hpp"
#include "task.hpp"
#include "timer.hpp"
#include "tty.hpp"
@@ -187,8 +188,10 @@ void stress_tester() {
remove_self();
}
void user_task() {
while (true) {
asm("syscall");
__builtin_ia32_pause();
}
}
@@ -231,6 +234,7 @@ void kmain() {
new_ktask(ktask_main, "ktask_main");
new_ktask(dummy_task, "dummy");
setup_syscalls();
init_tasks();
for (;;) {
__asm__ __volatile__("hlt");

View File

@@ -54,6 +54,23 @@ static inline void irqrestore(unsigned long flags) {
irqrestore(f); \
}
static inline void wrmsr(uint64_t msr, uint64_t value) {
uint32_t low = value & 0xFFFFFFFF;
uint32_t high = value >> 32;
asm volatile(
"wrmsr"
:
: "c"(msr), "a"(low), "d"(high));
}
static inline uint64_t rdmsr(uint64_t msr) {
uint32_t low, high;
asm volatile(
"rdmsr"
: "=a"(low), "=d"(high)
: "c"(msr));
return ((uint64_t) high << 32) | low;
}
char *itoa(int value, char *str, int base);

View File

@@ -0,0 +1,7 @@
[BITS 64]
section .text
global _syscall_entrypoint:function (_syscall_entrypoint.end - _syscall_entrypoint)
_syscall_entrypoint:
sysret
.end:

40
src/arch/x86/syscalls.cpp Normal file
View File

@@ -0,0 +1,40 @@
//
// Created by Stepan Usatiuk on 26.10.2023.
//
#include "syscalls.hpp"
#include <cstdint>
#include "asserts.hpp"
#include "gdt.hpp"
#include "misc.hpp"
struct STAR {
unsigned ret_cs_ss : 16;
unsigned call_cs_ss : 16;
unsigned unused : 32;
} __attribute__((packed));
static_assert(sizeof(STAR) == 8);
void setup_syscalls() {
union {
STAR star;
uint64_t bytes;
} newstar{};
newstar.star.ret_cs_ss = (GDTSEL(gdt_data_user) - 8) | 0x3;
assert(newstar.star.ret_cs_ss + 8 == (GDTSEL(gdt_data_user) | 0x3));
assert(newstar.star.ret_cs_ss + 16 == (GDTSEL(gdt_code_user) | 0x3));
newstar.star.call_cs_ss = (GDTSEL(gdt_code));
assert(newstar.star.call_cs_ss == GDTSEL(gdt_code));
assert(newstar.star.call_cs_ss + 8 == GDTSEL(gdt_data));
wrmsr(0xc0000081, newstar.bytes);
wrmsr(0xc0000082, reinterpret_cast<uint64_t>(&_syscall_entrypoint));
wrmsr(0xc0000084, 0);
wrmsr(0xC0000080, rdmsr(0xC0000080) | 0b1);
}

12
src/arch/x86/syscalls.hpp Normal file
View File

@@ -0,0 +1,12 @@
//
// Created by Stepan Usatiuk on 26.10.2023.
//
#ifndef OS2_SYSCALLS_HPP
#define OS2_SYSCALLS_HPP
void setup_syscalls();
extern "C" void _syscall_entrypoint();
#endif//OS2_SYSCALLS_HPP