From c2628019b70c8eeee28ee748ce430380a3dbcb5e Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 15 Nov 2022 15:09:52 +0200 Subject: [PATCH] Syscalls working as expected --- Architecture/amd64/SystemCalls.cpp | 1 - .../amd64/SystemCallsAssemblyStub.asm | 4 +-- .../amd64/cpu/GlobalDescriptorTable.cpp | 28 +++++++++---------- .../amd64/cpu/InterruptDescriptorTable.cpp | 12 -------- Architecture/amd64/cpu/gdt.hpp | 2 +- Core/Crash/CrashHandler.cpp | 10 +++++-- Core/Crash/Screens/Details.cpp | 13 ++++++++- Core/Crash/UserHandler.cpp | 14 ++++++++-- Tasking/Task.cpp | 20 +++++++------ include/cpu.hpp | 10 ------- 10 files changed, 61 insertions(+), 53 deletions(-) diff --git a/Architecture/amd64/SystemCalls.cpp b/Architecture/amd64/SystemCalls.cpp index 6baa688..59c22d4 100644 --- a/Architecture/amd64/SystemCalls.cpp +++ b/Architecture/amd64/SystemCalls.cpp @@ -79,7 +79,6 @@ extern "C" __attribute__((naked, used, no_stack_protector)) void SystemCallHandl void InitializeSystemCalls() { wrmsr(MSR_EFER, rdmsr(MSR_EFER) | 1); - // TODO: THIS IS NOT WORKING! USER CODE AND USER DATA SHOULD BE CS:0x23 AND SS:0x1B wrmsr(MSR_STAR, ((uint64_t)(GDT_KERNEL_CODE) << 32) | ((uint64_t)(GDT_KERNEL_DATA | 3) << 48)); 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 index 78e02f8..25e281f 100644 --- a/Architecture/amd64/SystemCallsAssemblyStub.asm +++ b/Architecture/amd64/SystemCallsAssemblyStub.asm @@ -7,10 +7,10 @@ SystemCallHandlerStub: mov [gs:0x8], rsp ; CPUData->TempStack mov rsp, [gs:0x0] ; CPUData->SystemCallStack - push qword 0x23 ; user data segment + push qword 0x1b ; user data segment push qword [gs:0x8] ; saved stack push r11 ; saved rflags - push qword 0x1b ; user code segment + push qword 0x23 ; user code segment push rcx ; Current RIP cld diff --git a/Architecture/amd64/cpu/GlobalDescriptorTable.cpp b/Architecture/amd64/cpu/GlobalDescriptorTable.cpp index d7d95af..67fc010 100644 --- a/Architecture/amd64/cpu/GlobalDescriptorTable.cpp +++ b/Architecture/amd64/cpu/GlobalDescriptorTable.cpp @@ -44,20 +44,6 @@ namespace GlobalDescriptorTable .Flags = {.Raw = 0x0}, .BaseHigh = 0x0}, - // user code - {.Length = 0x0, - .BaseLow = 0x0, - .BaseMiddle = 0x0, - .Access = {.A = 0, - .RW = 1, - .DC = 0, - .E = 1, - .S = 1, - .DPL = 3, - .P = 1}, - .Flags = {.Unknown = 0x0, .L = 1}, - .BaseHigh = 0x0}, - // user data {.Length = 0x0, .BaseLow = 0x0, @@ -72,6 +58,20 @@ namespace GlobalDescriptorTable .Flags = {.Raw = 0x0}, .BaseHigh = 0x0}, + // user code + {.Length = 0x0, + .BaseLow = 0x0, + .BaseMiddle = 0x0, + .Access = {.A = 0, + .RW = 1, + .DC = 0, + .E = 1, + .S = 1, + .DPL = 3, + .P = 1}, + .Flags = {.Unknown = 0x0, .L = 1}, + .BaseHigh = 0x0}, + // tss {}}; diff --git a/Architecture/amd64/cpu/InterruptDescriptorTable.cpp b/Architecture/amd64/cpu/InterruptDescriptorTable.cpp index df4c0fd..c9b2de3 100644 --- a/Architecture/amd64/cpu/InterruptDescriptorTable.cpp +++ b/Architecture/amd64/cpu/InterruptDescriptorTable.cpp @@ -55,16 +55,10 @@ namespace InterruptDescriptorTable "pushq %r13\n" "pushq %r14\n" "pushq %r15\n" - // push ds segment - "movq %ds, %rax\n" - "pushq %rax\n" "movq %rsp, %rdi\n" "call ExceptionHandler\n" - // pop ds segment - "popq %rax\n" - // pop all registers "popq %r15\n" "popq %r14\n" @@ -104,16 +98,10 @@ namespace InterruptDescriptorTable "pushq %r13\n" "pushq %r14\n" "pushq %r15\n" - // push ds segment - "movq %ds, %rax\n" - "pushq %rax\n" "movq %rsp, %rdi\n" "call MainInterruptHandler\n" - // pop ds segment - "popq %rax\n" - "popq %r15\n" "popq %r14\n" "popq %r13\n" diff --git a/Architecture/amd64/cpu/gdt.hpp b/Architecture/amd64/cpu/gdt.hpp index 5d25ad8..c8fe93a 100644 --- a/Architecture/amd64/cpu/gdt.hpp +++ b/Architecture/amd64/cpu/gdt.hpp @@ -117,8 +117,8 @@ namespace GlobalDescriptorTable GlobalDescriptorTableEntry Null; GlobalDescriptorTableEntry Code; GlobalDescriptorTableEntry Data; - GlobalDescriptorTableEntry UserCode; GlobalDescriptorTableEntry UserData; + GlobalDescriptorTableEntry UserCode; TaskStateSegmentEntry TaskStateSegment; } __attribute__((packed)) GlobalDescriptorTableEntries; diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 21fd251..c273ba9 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -348,10 +348,13 @@ namespace CrashHandler CPU::x64::CR8 cr8 = CPU::x64::readcr8(); CPU::x64::EFER efer; efer.raw = CPU::x64::rdmsr(CPU::x64::MSR_EFER); + uint64_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); EHPrint("\eFF0000FS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx\n", CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), - Frame->ss, Frame->cs, Frame->ds); + Frame->ss, Frame->cs, ds); EHPrint("R8=%#llx R9=%#llx R10=%#llx R11=%#llx\n", Frame->r8, Frame->r9, Frame->r10, Frame->r11); EHPrint("R12=%#llx R13=%#llx R14=%#llx R15=%#llx\n", Frame->r12, Frame->r13, Frame->r14, Frame->r15); EHPrint("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx\n", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); @@ -402,6 +405,9 @@ namespace CrashHandler crashdata.cr4 = CPU::x64::readcr4(); crashdata.cr8 = CPU::x64::readcr8(); crashdata.efer.raw = CPU::x64::rdmsr(CPU::x64::MSR_EFER); + uint64_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); // Get debug registers asmv("movq %%dr0, %0" @@ -458,7 +464,7 @@ namespace CrashHandler { error("FS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx", CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), - Frame->ss, Frame->cs, Frame->ds); + Frame->ss, Frame->cs, ds); error("R8=%#llx R9=%#llx R10=%#llx R11=%#llx", Frame->r8, Frame->r9, Frame->r10, Frame->r11); error("R12=%#llx R13=%#llx R14=%#llx R15=%#llx", Frame->r12, Frame->r13, Frame->r14, Frame->r15); error("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); diff --git a/Core/Crash/Screens/Details.cpp b/Core/Crash/Screens/Details.cpp index 3544693..6ffcc4f 100644 --- a/Core/Crash/Screens/Details.cpp +++ b/Core/Crash/Screens/Details.cpp @@ -28,9 +28,20 @@ namespace CrashHandler data.Thread->Name, data.Thread->ID); EHPrint("\e7981FCTechnical Informations on CPU %lld:\n", data.ID); +#if defined(__amd64__) + uint64_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); +#elif defined(__i386__) + uint32_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); +#elif defined(__aarch64__) +#endif + EHPrint("\e7981FCFS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx\n", CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), - data.Frame->ss, data.Frame->cs, data.Frame->ds); + data.Frame->ss, data.Frame->cs, ds); #if defined(__amd64__) EHPrint("R8=%#llx R9=%#llx R10=%#llx R11=%#llx\n", data.Frame->r8, data.Frame->r9, data.Frame->r10, data.Frame->r11); EHPrint("R12=%#llx R13=%#llx R14=%#llx R15=%#llx\n", data.Frame->r12, data.Frame->r13, data.Frame->r14, data.Frame->r15); diff --git a/Core/Crash/UserHandler.cpp b/Core/Crash/UserHandler.cpp index b1ecfbc..b455dc3 100644 --- a/Core/Crash/UserHandler.cpp +++ b/Core/Crash/UserHandler.cpp @@ -42,10 +42,20 @@ __no_stack_protector void UserModeExceptionHandler(CHArchTrapFrame *Frame) efer.raw = CPU::x64::rdmsr(CPU::x64::MSR_EFER); error("Technical Informations on CPU %lld:", GetCurrentCPU()->ID); +#if defined(__amd64__) + uint64_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); +#elif defined(__i386__) + uint32_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); +#elif defined(__aarch64__) +#endif error("FS=%#llx GS=%#llx SS=%#llx CS=%#llx DS=%#llx", CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), - Frame->ss, Frame->cs, Frame->ds); - #if defined(__amd64__) + Frame->ss, Frame->cs, ds); +#if defined(__amd64__) error("R8=%#llx R9=%#llx R10=%#llx R11=%#llx", Frame->r8, Frame->r9, Frame->r10, Frame->r11); error("R12=%#llx R13=%#llx R14=%#llx R15=%#llx", Frame->r12, Frame->r13, Frame->r14, Frame->r15); error("RAX=%#llx RBX=%#llx RCX=%#llx RDX=%#llx", Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index 2ddd092..7ac517d 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -362,9 +362,12 @@ namespace Tasking schedbg("================================================================"); schedbg("Status: 0-ukn | 1-rdy | 2-run | 3-wait | 4-term"); schedbg("Technical Informations on regs %#lx", Frame->InterruptNumber); + uint64_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx", CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), - Frame->ss, Frame->cs, Frame->ds); + Frame->ss, Frame->cs, ds); schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx", Frame->r8, Frame->r9, Frame->r10, Frame->r11); schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx", @@ -486,8 +489,8 @@ namespace Tasking CurrentCPU->CurrentThread->Registers.ss != GDT_USER_DATA) { warn("Wrong CS or SS for user process! (Code:%#lx, Data:%#lx != Code:%#lx, Data:%#lx)", - CurrentCPU->CurrentThread->Registers.cs, CurrentCPU->CurrentThread->Registers.ss, - GDT_USER_CODE, GDT_USER_DATA); + CurrentCPU->CurrentThread->Registers.cs, CurrentCPU->CurrentThread->Registers.ss, + GDT_USER_CODE, GDT_USER_DATA); CurrentCPU->CurrentThread->Registers.cs = GDT_USER_CODE; CurrentCPU->CurrentThread->Registers.ss = GDT_USER_DATA; } @@ -498,8 +501,8 @@ namespace Tasking CurrentCPU->CurrentThread->Registers.ss != GDT_KERNEL_DATA) { warn("Wrong CS or SS for kernel process! (Code:%#lx, Data:%#lx != Code:%#lx, Data:%#lx", - CurrentCPU->CurrentThread->Registers.cs, CurrentCPU->CurrentThread->Registers.ss, - GDT_KERNEL_CODE, GDT_KERNEL_DATA); + CurrentCPU->CurrentThread->Registers.cs, CurrentCPU->CurrentThread->Registers.ss, + GDT_KERNEL_CODE, GDT_KERNEL_DATA); CurrentCPU->CurrentThread->Registers.cs = GDT_KERNEL_CODE; CurrentCPU->CurrentThread->Registers.ss = GDT_KERNEL_DATA; } @@ -553,9 +556,12 @@ namespace Tasking { schedbg("================================================================"); schedbg("Technical Informations on Thread %s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); + uint64_t ds; + asmv("mov %%ds, %0" + : "=r"(ds)); schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx", CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE), - Frame->ss, Frame->cs, Frame->ds); + Frame->ss, Frame->cs, ds); schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx", Frame->r8, Frame->r9, Frame->r10, Frame->r11); schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx", @@ -725,7 +731,6 @@ namespace Tasking Thread->GSBase = CPU::x64::rdmsr(CPU::x64::MSRID::MSR_GS_BASE); Thread->FSBase = CPU::x64::rdmsr(CPU::x64::MSRID::MSR_FS_BASE); Thread->Registers.cs = GDT_KERNEL_CODE; - Thread->Registers.ds = GDT_KERNEL_DATA; Thread->Registers.ss = GDT_KERNEL_DATA; Thread->Registers.rflags.AlwaysOne = 1; Thread->Registers.rflags.IF = 1; @@ -744,7 +749,6 @@ namespace Tasking Thread->GSBase = 0; Thread->FSBase = 0; Thread->Registers.cs = GDT_USER_CODE; - Thread->Registers.ds = GDT_USER_DATA; Thread->Registers.ss = GDT_USER_DATA; Thread->Registers.rflags.AlwaysOne = 1; // Thread->Registers.rflags.PF = 1; diff --git a/include/cpu.hpp b/include/cpu.hpp index 2d27fe6..89b9d39 100644 --- a/include/cpu.hpp +++ b/include/cpu.hpp @@ -312,11 +312,6 @@ namespace CPU typedef struct TrapFrame { - // uint32_t gs; // General-purpose Segment - // uint32_t fs; // General-purpose Segment - // uint32_t es; // Extra Segment (used for string operations) - uint32_t ds; // Data Segment - uint32_t ebp; // Base Pointer (meant for stack frames) uint32_t edi; // Destination index for string operations uint32_t esi; // Source index for string operations @@ -1396,11 +1391,6 @@ namespace CPU typedef struct TrapFrame { - // uint64_t gs; // General-purpose Segment - // uint64_t fs; // General-purpose Segment - // uint64_t es; // Extra Segment (used for string operations) - uint64_t ds; // Data Segment - uint64_t r15; // General purpose uint64_t r14; // General purpose uint64_t r13; // General purpose