mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-29 07:47:59 +00:00
More work on system calls
This commit is contained in:
parent
3dc83ad90f
commit
cae9572cc1
@ -4,18 +4,82 @@
|
|||||||
|
|
||||||
#include "cpu/gdt.hpp"
|
#include "cpu/gdt.hpp"
|
||||||
|
|
||||||
|
// https://supercip971.github.io/02-wingos-syscalls.html
|
||||||
using namespace CPU::x64;
|
using namespace CPU::x64;
|
||||||
|
|
||||||
extern "C" __attribute__((naked, used, no_stack_protector)) void SystemCallHandlerStub()
|
// "Core/SystemCalls.cpp"
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" uint64_t SystemCallsHandler(SyscallsRegs *regs);
|
extern "C" uint64_t SystemCallsHandler(SyscallsRegs *regs);
|
||||||
|
|
||||||
|
extern "C" void SystemCallHandlerStub();
|
||||||
|
|
||||||
|
extern "C" __attribute__((naked, used, no_stack_protector)) void SystemCallHandlerStub_broken()
|
||||||
|
{
|
||||||
|
// asmv(
|
||||||
|
// // "cmp $0x08, 0x8(%rsp)\n"
|
||||||
|
// // "je 1f\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// // "1:\n"
|
||||||
|
|
||||||
|
// "mov %rsp, 0x8(%gs)\n" // CPUData->TempStack
|
||||||
|
// "mov 0x0(%gs), %rsp\n" // CPUData->SystemCallStack
|
||||||
|
// "push $0x1b\n" // user data segment
|
||||||
|
// "push 0x8(%gs)\n" // saved stack
|
||||||
|
// "push %r11\n" // saved rflags
|
||||||
|
// "push $0x23\n" // user code segment
|
||||||
|
// "push %rcx\n" // Current RIP
|
||||||
|
|
||||||
|
// "push %rax\n"
|
||||||
|
// "push %rbx\n"
|
||||||
|
// "push %rcx\n"
|
||||||
|
// "push %rdx\n"
|
||||||
|
// "push %rsi\n"
|
||||||
|
// "push %rdi\n"
|
||||||
|
// "push %rbp\n"
|
||||||
|
// "push %r8\n"
|
||||||
|
// "push %r9\n"
|
||||||
|
// "push %r10\n"
|
||||||
|
// "push %r11\n"
|
||||||
|
// "push %r12\n"
|
||||||
|
// "push %r13\n"
|
||||||
|
// "push %r14\n"
|
||||||
|
// "push %r15\n"
|
||||||
|
|
||||||
|
// "mov %rsp, %rdi\n"
|
||||||
|
// "mov $0, %rbp\n"
|
||||||
|
// "call SystemCallsHandler\n"
|
||||||
|
|
||||||
|
// "pop %r15\n"
|
||||||
|
// "pop %r14\n"
|
||||||
|
// "pop %r13\n"
|
||||||
|
// "pop %r12\n"
|
||||||
|
// "pop %r11\n"
|
||||||
|
// "pop %r10\n"
|
||||||
|
// "pop %r9\n"
|
||||||
|
// "pop %r8\n"
|
||||||
|
// "pop %rbp\n"
|
||||||
|
// "pop %rdi\n"
|
||||||
|
// "pop %rsi\n"
|
||||||
|
// "pop %rdx\n"
|
||||||
|
// "pop %rcx\n"
|
||||||
|
// "pop %rbx\n"
|
||||||
|
// /* "pop %rax\n" */
|
||||||
|
|
||||||
|
// "mov 0x8(%gs), %rsp\n" // CPUData->TempStack
|
||||||
|
|
||||||
|
// // "cmp $0x08, 0x8(%rsp)\n"
|
||||||
|
// // "je 1f\n"
|
||||||
|
// "swapgs\n"
|
||||||
|
// // "1:\n"
|
||||||
|
|
||||||
|
// "sti\n"
|
||||||
|
|
||||||
|
// "sysretq\n");
|
||||||
|
}
|
||||||
|
|
||||||
void InitializeSystemCalls()
|
void InitializeSystemCalls()
|
||||||
{
|
{
|
||||||
wrmsr(MSR_EFER, rdmsr(MSR_EFER) | 1);
|
wrmsr(MSR_EFER, rdmsr(MSR_EFER) | 1);
|
||||||
wrmsr(MSR_STAR, ((uint64_t)(GDT_KERNEL_CODE) << 32) | ((uint64_t)(GDT_KERNEL_DATA | 3) << 48));
|
wrmsr(MSR_STAR, ((uint64_t)(GDT_KERNEL_CODE) << 32) | ((uint64_t)(GDT_KERNEL_DATA | 3) << 48));
|
||||||
wrmsr(MSR_LSTAR, (uint64_t)SystemCallsHandler);
|
wrmsr(MSR_LSTAR, (uint64_t)SystemCallHandlerStub);
|
||||||
wrmsr(MSR_SYSCALL_MASK, 0);
|
wrmsr(MSR_SYSCALL_MASK, (uint64_t)(1 << 9));
|
||||||
}
|
}
|
||||||
|
54
Architecture/amd64/SystemCallsAssemblyStub.asm
Normal file
54
Architecture/amd64/SystemCallsAssemblyStub.asm
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
[BITS 64]
|
||||||
|
ALIGN 4096
|
||||||
|
extern SystemCallsHandler
|
||||||
|
global SystemCallHandlerStub
|
||||||
|
SystemCallHandlerStub:
|
||||||
|
swapgs
|
||||||
|
mov [gs:0x8], rsp ; CPUData->TempStack
|
||||||
|
mov rsp, [gs:0x0] ; CPUData->SystemCallStack
|
||||||
|
|
||||||
|
push qword 0x23 ; user data segment
|
||||||
|
push qword [gs:0x8] ; saved stack
|
||||||
|
push r11 ; saved rflags
|
||||||
|
push qword 0x1b ; user code segment
|
||||||
|
push rcx ; Current RIP
|
||||||
|
|
||||||
|
push rax
|
||||||
|
push rbx
|
||||||
|
push rcx
|
||||||
|
push rdx
|
||||||
|
push rsi
|
||||||
|
push rdi
|
||||||
|
push rbp
|
||||||
|
push r8
|
||||||
|
push r9
|
||||||
|
push r10
|
||||||
|
push r11
|
||||||
|
push r12
|
||||||
|
push r13
|
||||||
|
push r14
|
||||||
|
push r15
|
||||||
|
|
||||||
|
mov rdi, rsp
|
||||||
|
mov rbp, 0
|
||||||
|
call SystemCallsHandler
|
||||||
|
|
||||||
|
pop r15
|
||||||
|
pop r14
|
||||||
|
pop r13
|
||||||
|
pop r12
|
||||||
|
pop r11
|
||||||
|
pop r10
|
||||||
|
pop r9
|
||||||
|
pop r8
|
||||||
|
pop rbp
|
||||||
|
pop rdi
|
||||||
|
pop rsi
|
||||||
|
pop rdx
|
||||||
|
pop rcx
|
||||||
|
pop rbx
|
||||||
|
|
||||||
|
mov rsp, [gs:0x8]
|
||||||
|
swapgs
|
||||||
|
sti
|
||||||
|
o64 sysret
|
Loading…
x
Reference in New Issue
Block a user