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});