mirror of
https://github.com/usatiuk/ficus.git
synced 2025-10-29 00:27:52 +01:00
syscall base
This commit is contained in:
@@ -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})
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
7
src/arch/x86/syscalls.asm
Normal file
7
src/arch/x86/syscalls.asm
Normal 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
40
src/arch/x86/syscalls.cpp
Normal 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
12
src/arch/x86/syscalls.hpp
Normal 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
|
||||
Reference in New Issue
Block a user