mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-29 07:47:59 +00:00
Fixed wrong stack pointer & new tss command for crash screen
This commit is contained in:
parent
b9f8e976f6
commit
eab80c215c
@ -75,7 +75,7 @@ namespace GlobalDescriptorTable
|
|||||||
// tss
|
// tss
|
||||||
{}};
|
{}};
|
||||||
|
|
||||||
static GlobalDescriptorTableEntries GDTEntries[MAX_CPU];
|
GlobalDescriptorTableEntries GDTEntries[MAX_CPU];
|
||||||
GlobalDescriptorTableDescriptor gdt[MAX_CPU];
|
GlobalDescriptorTableDescriptor gdt[MAX_CPU];
|
||||||
|
|
||||||
TaskStateSegment tss[MAX_CPU] = {
|
TaskStateSegment tss[MAX_CPU] = {
|
||||||
@ -145,9 +145,14 @@ namespace GlobalDescriptorTable
|
|||||||
|
|
||||||
SafeFunction void SetKernelStack(void *Stack)
|
SafeFunction void SetKernelStack(void *Stack)
|
||||||
{
|
{
|
||||||
if (Stack)
|
long CPUID = GetCurrentCPU()->ID;
|
||||||
tss[GetCurrentCPU()->ID].StackPointer[0] = (uint64_t)Stack;
|
if (Stack != nullptr)
|
||||||
|
tss[CPUID].StackPointer[0] = (uint64_t)Stack;
|
||||||
else
|
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]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -113,6 +113,8 @@ namespace InterruptDescriptorTable
|
|||||||
// : "q"(KPT)
|
// : "q"(KPT)
|
||||||
// : "memory");
|
// : "memory");
|
||||||
|
|
||||||
|
// GlobalDescriptorTable::SetKernelStack(nullptr);
|
||||||
|
|
||||||
asm(
|
asm(
|
||||||
// "cmp $0x1000, %rsp\n"
|
// "cmp $0x1000, %rsp\n"
|
||||||
// "jng .skip_swap_check__1\n"
|
// "jng .skip_swap_check__1\n"
|
||||||
|
@ -131,6 +131,7 @@ namespace GlobalDescriptorTable
|
|||||||
} __attribute__((packed)) GlobalDescriptorTableDescriptor;
|
} __attribute__((packed)) GlobalDescriptorTableDescriptor;
|
||||||
|
|
||||||
extern void *CPUStackPointer[];
|
extern void *CPUStackPointer[];
|
||||||
|
extern TaskStateSegment tss[];
|
||||||
void Init(int Core);
|
void Init(int Core);
|
||||||
void SetKernelStack(void *Stack);
|
void SetKernelStack(void *Stack);
|
||||||
}
|
}
|
||||||
|
@ -215,6 +215,7 @@ namespace CrashHandler
|
|||||||
EHPrint("tlb <ADDRESS> - Print the page table entries\n");
|
EHPrint("tlb <ADDRESS> - Print the page table entries\n");
|
||||||
EHPrint("bitmap - Print the memory bitmap\n");
|
EHPrint("bitmap - Print the memory bitmap\n");
|
||||||
EHPrint("cr<INDEX> - Print the CPU control register\n");
|
EHPrint("cr<INDEX> - Print the CPU control register\n");
|
||||||
|
EHPrint("tss <CORE> - Print the CPU task state segment\n");
|
||||||
EHPrint("main - Show the main screen.\n");
|
EHPrint("main - Show the main screen.\n");
|
||||||
EHPrint("details - Show the details screen.\n");
|
EHPrint("details - Show the details screen.\n");
|
||||||
EHPrint("frames - Show the stack frame screen.\n");
|
EHPrint("frames - Show the stack frame screen.\n");
|
||||||
@ -427,6 +428,36 @@ namespace CrashHandler
|
|||||||
break;
|
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)
|
else if (strcmp(Input, "main") == 0)
|
||||||
{
|
{
|
||||||
SBIdx = 255;
|
SBIdx = 255;
|
||||||
|
@ -130,7 +130,7 @@ namespace Interrupts
|
|||||||
if (likely(handler != (Handler *)0xdeadbeef))
|
if (likely(handler != (Handler *)0xdeadbeef))
|
||||||
handler->OnInterruptReceived(Frame);
|
handler->OnInterruptReceived(Frame);
|
||||||
else
|
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]))
|
if (likely(apic[Core]))
|
||||||
{
|
{
|
||||||
|
@ -486,33 +486,6 @@ namespace Tasking
|
|||||||
CurrentCPU->CurrentProcess->Status = TaskStatus::Running;
|
CurrentCPU->CurrentProcess->Status = TaskStatus::Running;
|
||||||
CurrentCPU->CurrentThread->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;
|
*Frame = CurrentCPU->CurrentThread->Registers;
|
||||||
GlobalDescriptorTable::SetKernelStack((void *)((uint64_t)CurrentCPU->CurrentThread->Stack->GetStackTop()));
|
GlobalDescriptorTable::SetKernelStack((void *)((uint64_t)CurrentCPU->CurrentThread->Stack->GetStackTop()));
|
||||||
CPU::x64::writecr3({.raw = (uint64_t)CurrentCPU->CurrentProcess->PageTable});
|
CPU::x64::writecr3({.raw = (uint64_t)CurrentCPU->CurrentProcess->PageTable});
|
||||||
|
Loading…
x
Reference in New Issue
Block a user