diff --git a/Architecture/amd64/cpu/GlobalDescriptorTable.cpp b/Architecture/amd64/cpu/GlobalDescriptorTable.cpp index aec13bb..0628182 100644 --- a/Architecture/amd64/cpu/GlobalDescriptorTable.cpp +++ b/Architecture/amd64/cpu/GlobalDescriptorTable.cpp @@ -75,7 +75,7 @@ namespace GlobalDescriptorTable // tss {}}; - static GlobalDescriptorTableEntries GDTEntries[MAX_CPU]; + GlobalDescriptorTableEntries GDTEntries[MAX_CPU]; GlobalDescriptorTableDescriptor gdt[MAX_CPU]; TaskStateSegment tss[MAX_CPU] = { @@ -145,9 +145,14 @@ namespace GlobalDescriptorTable SafeFunction void SetKernelStack(void *Stack) { - if (Stack) - tss[GetCurrentCPU()->ID].StackPointer[0] = (uint64_t)Stack; + long CPUID = GetCurrentCPU()->ID; + if (Stack != nullptr) + tss[CPUID].StackPointer[0] = (uint64_t)Stack; else - tss[GetCurrentCPU()->ID].StackPointer[0] = (uint64_t)CPUStackPointer[GetCurrentCPU()->ID] + STACK_SIZE; + tss[CPUID].StackPointer[0] = (uint64_t)CPUStackPointer[CPUID] + STACK_SIZE; + + // TODO: This may cause problems in the future I guess? This should be checked later + asmv("mov %%rsp, %0" + : "=r"(tss[CPUID].StackPointer[0])); } } diff --git a/Architecture/amd64/cpu/InterruptDescriptorTable.cpp b/Architecture/amd64/cpu/InterruptDescriptorTable.cpp index 7acdf67..e97b44e 100644 --- a/Architecture/amd64/cpu/InterruptDescriptorTable.cpp +++ b/Architecture/amd64/cpu/InterruptDescriptorTable.cpp @@ -113,6 +113,8 @@ namespace InterruptDescriptorTable // : "q"(KPT) // : "memory"); + // GlobalDescriptorTable::SetKernelStack(nullptr); + asm( // "cmp $0x1000, %rsp\n" // "jng .skip_swap_check__1\n" diff --git a/Architecture/amd64/cpu/gdt.hpp b/Architecture/amd64/cpu/gdt.hpp index c8fe93a..900c6b9 100644 --- a/Architecture/amd64/cpu/gdt.hpp +++ b/Architecture/amd64/cpu/gdt.hpp @@ -131,6 +131,7 @@ namespace GlobalDescriptorTable } __attribute__((packed)) GlobalDescriptorTableDescriptor; extern void *CPUStackPointer[]; + extern TaskStateSegment tss[]; void Init(int Core); void SetKernelStack(void *Stack); } diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index b6ab7ba..21f7014 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -215,6 +215,7 @@ namespace CrashHandler EHPrint("tlb
- Print the page table entries\n"); EHPrint("bitmap - Print the memory bitmap\n"); EHPrint("cr - Print the CPU control register\n"); + EHPrint("tss - Print the CPU task state segment\n"); EHPrint("main - Show the main screen.\n"); EHPrint("details - Show the details screen.\n"); EHPrint("frames - Show the stack frame screen.\n"); @@ -427,6 +428,36 @@ namespace CrashHandler break; } } + else if (strncmp(Input, "tss", 3) == 0) + { + char *arg = TrimWhiteSpace(Input + 3); + int TSSIndex = atoi(arg); + if (TSSIndex > SMP::CPUCores) + { + EHPrint("\eFF0000Invalid TSS index\n"); + } + else + { + GlobalDescriptorTable::TaskStateSegment tss = GlobalDescriptorTable::tss[TSSIndex]; + EHPrint("\eFAFAFAStack Pointer 0: \eAABB22%#lx\n", tss.StackPointer[0]); + EHPrint("\eFAFAFAStack Pointer 1: \eAABB22%#lx\n", tss.StackPointer[1]); + EHPrint("\eFAFAFAStack Pointer 2: \eAABB22%#lx\n", tss.StackPointer[2]); + + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[0]); + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[1]); + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[2]); + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[3]); + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[4]); + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[5]); + EHPrint("\eFAFAFAInterrupt Stack Table: \eAABB22%#lx\n", tss.InterruptStackTable[6]); + + EHPrint("\eFAFAFAI/O Map Base Address Offset: \eAABB22%#lx\n", tss.IOMapBaseAddressOffset); + + EHPrint("\eFAFAFAReserved 0: \eAABB22%#lx\n", tss.Reserved0); + EHPrint("\eFAFAFAReserved 1: \eAABB22%#lx\n", tss.Reserved1); + EHPrint("\eFAFAFAReserved 2: \eAABB22%#lx\n", tss.Reserved2); + } + } else if (strcmp(Input, "main") == 0) { SBIdx = 255; diff --git a/Core/Interrupts/IntManager.cpp b/Core/Interrupts/IntManager.cpp index 83af544..abb2b58 100644 --- a/Core/Interrupts/IntManager.cpp +++ b/Core/Interrupts/IntManager.cpp @@ -130,7 +130,7 @@ namespace Interrupts if (likely(handler != (Handler *)0xdeadbeef)) handler->OnInterruptReceived(Frame); else - error("Unhandled IRQ%ld on CPU %d.", Frame->InterruptNumber - 32, Core); + error("IRQ%ld is unhandled on CPU %d.", Frame->InterruptNumber - 32, Core); if (likely(apic[Core])) { diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index 9592249..328aae0 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -486,33 +486,6 @@ namespace Tasking CurrentCPU->CurrentProcess->Status = TaskStatus::Running; CurrentCPU->CurrentThread->Status = TaskStatus::Running; - // This should never happen, but if it does, we can fix it. - if (CurrentCPU->CurrentThread->Security.TrustLevel == TaskTrustLevel::User) - { - if (CurrentCPU->CurrentThread->Registers.cs != GDT_USER_CODE || - CurrentCPU->CurrentThread->Registers.ss != GDT_USER_DATA) - { - warn("Wrong CS or SS for user thread %s(%ld)! (Code:%#lx, Data:%#lx != Code:%#lx, Data:%#lx)", - CurrentCPU->CurrentThread->Registers.cs, CurrentCPU->CurrentThread->Registers.ss, - GDT_USER_CODE, GDT_USER_DATA, - CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); - CurrentCPU->CurrentThread->Registers.cs = GDT_USER_CODE; - CurrentCPU->CurrentThread->Registers.ss = GDT_USER_DATA; - } - } - else - { - if (CurrentCPU->CurrentThread->Registers.cs != GDT_KERNEL_CODE || - CurrentCPU->CurrentThread->Registers.ss != GDT_KERNEL_DATA) - { - warn("Wrong CS or SS for kernel thread %s(%ld)! (Code:%#lx, Data:%#lx != Code:%#lx, Data:%#lx", - CurrentCPU->CurrentThread->Registers.cs, CurrentCPU->CurrentThread->Registers.ss, - GDT_KERNEL_CODE, GDT_KERNEL_DATA, - CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); - CurrentCPU->CurrentThread->Registers.cs = GDT_KERNEL_CODE; - CurrentCPU->CurrentThread->Registers.ss = GDT_KERNEL_DATA; - } - } *Frame = CurrentCPU->CurrentThread->Registers; GlobalDescriptorTable::SetKernelStack((void *)((uint64_t)CurrentCPU->CurrentThread->Stack->GetStackTop())); CPU::x64::writecr3({.raw = (uint64_t)CurrentCPU->CurrentProcess->PageTable});