From cae9572cc1ddcffc0d449c7ae67e04695a0a67a8 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 20 Oct 2022 05:02:49 +0300 Subject: [PATCH] More work on system calls --- Architecture/amd64/SystemCalls.cpp | 76 +++++++++++++++++-- .../amd64/SystemCallsAssemblyStub.asm | 54 +++++++++++++ 2 files changed, 124 insertions(+), 6 deletions(-) create mode 100644 Architecture/amd64/SystemCallsAssemblyStub.asm diff --git a/Architecture/amd64/SystemCalls.cpp b/Architecture/amd64/SystemCalls.cpp index 943c04d..f9607b4 100644 --- a/Architecture/amd64/SystemCalls.cpp +++ b/Architecture/amd64/SystemCalls.cpp @@ -4,18 +4,82 @@ #include "cpu/gdt.hpp" +// https://supercip971.github.io/02-wingos-syscalls.html 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" 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() { 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_LSTAR, (uint64_t)SystemCallsHandler); - wrmsr(MSR_SYSCALL_MASK, 0); + wrmsr(MSR_LSTAR, (uint64_t)SystemCallHandlerStub); + wrmsr(MSR_SYSCALL_MASK, (uint64_t)(1 << 9)); } diff --git a/Architecture/amd64/SystemCallsAssemblyStub.asm b/Architecture/amd64/SystemCallsAssemblyStub.asm new file mode 100644 index 0000000..610f8b5 --- /dev/null +++ b/Architecture/amd64/SystemCallsAssemblyStub.asm @@ -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