Syscalls didn't worked because I'm dumb...

This commit is contained in:
Alex 2022-11-08 22:01:39 +02:00
parent 3e5c2bcacd
commit 40b1da9dd1
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
2 changed files with 9 additions and 0 deletions

View File

@ -342,6 +342,8 @@ namespace Tasking
// Save current process and thread registries, gs, fs, fpu, etc... // Save current process and thread registries, gs, fs, fpu, etc...
CurrentCPU->CurrentThread->Registers = *Frame; CurrentCPU->CurrentThread->Registers = *Frame;
CPU::x64::fxsave(CurrentCPU->CurrentThread->FXRegion); CPU::x64::fxsave(CurrentCPU->CurrentThread->FXRegion);
CurrentCPU->CurrentThread->GSBase = CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE);
CurrentCPU->CurrentThread->FSBase = CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE);
// Set the process & thread as ready if it's running. // Set the process & thread as ready if it's running.
if (CurrentCPU->CurrentProcess->Status == TaskStatus::Running) if (CurrentCPU->CurrentProcess->Status == TaskStatus::Running)
@ -388,6 +390,8 @@ namespace Tasking
GlobalDescriptorTable::SetKernelStack((void *)((uint64_t)CurrentCPU->CurrentThread->Stack + STACK_SIZE)); GlobalDescriptorTable::SetKernelStack((void *)((uint64_t)CurrentCPU->CurrentThread->Stack + STACK_SIZE));
CPU::x64::writecr3({.raw = (uint64_t)CurrentCPU->CurrentProcess->PageTable}); CPU::x64::writecr3({.raw = (uint64_t)CurrentCPU->CurrentProcess->PageTable});
CPU::x64::fxrstor(CurrentCPU->CurrentThread->FXRegion); CPU::x64::fxrstor(CurrentCPU->CurrentThread->FXRegion);
CPU::x64::wrmsr(CPU::x64::MSR_GS_BASE, CurrentCPU->CurrentThread->GSBase);
CPU::x64::wrmsr(CPU::x64::MSR_FS_BASE, CurrentCPU->CurrentThread->FSBase);
switch (CurrentCPU->CurrentProcess->Security.TrustLevel) switch (CurrentCPU->CurrentProcess->Security.TrustLevel)
{ {
@ -590,6 +594,8 @@ namespace Tasking
{ {
#if defined(__amd64__) #if defined(__amd64__)
SecurityManager.TrustToken(Thread->Security.UniqueToken, TokenTrustLevel::TrustedByKernel); SecurityManager.TrustToken(Thread->Security.UniqueToken, TokenTrustLevel::TrustedByKernel);
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.cs = GDT_KERNEL_CODE;
Thread->Registers.ds = GDT_KERNEL_DATA; Thread->Registers.ds = GDT_KERNEL_DATA;
Thread->Registers.ss = GDT_KERNEL_DATA; Thread->Registers.ss = GDT_KERNEL_DATA;
@ -607,6 +613,8 @@ namespace Tasking
{ {
#if defined(__amd64__) #if defined(__amd64__)
SecurityManager.TrustToken(Thread->Security.UniqueToken, TokenTrustLevel::Untrusted); SecurityManager.TrustToken(Thread->Security.UniqueToken, TokenTrustLevel::Untrusted);
Thread->GSBase = 0;
Thread->FSBase = 0;
Thread->Registers.cs = GDT_USER_CODE; Thread->Registers.cs = GDT_USER_CODE;
Thread->Registers.ds = GDT_USER_DATA; Thread->Registers.ds = GDT_USER_DATA;
Thread->Registers.ss = GDT_USER_DATA; Thread->Registers.ss = GDT_USER_DATA;

View File

@ -91,6 +91,7 @@ namespace Tasking
TaskStatus Status; TaskStatus Status;
#if defined(__amd64__) #if defined(__amd64__)
CPU::x64::TrapFrame Registers; CPU::x64::TrapFrame Registers;
uint64_t GSBase, FSBase;
#elif defined(__i386__) #elif defined(__i386__)
uint32_t Registers; // TODO uint32_t Registers; // TODO
#elif defined(__aarch64__) #elif defined(__aarch64__)