From 042bce48a0f304559255dfcb453dde7254214b85 Mon Sep 17 00:00:00 2001 From: Alex Date: Mon, 14 Nov 2022 07:42:37 +0200 Subject: [PATCH] Kernel & User time stub --- Core/Crash/CrashHandler.cpp | 8 +-- Core/Crash/Screens/Tasks.cpp | 12 ++-- Core/Driver.cpp | 2 +- Tasking/Task.cpp | 104 +++++++++++++++++++++-------------- include/task.hpp | 4 +- 5 files changed, 79 insertions(+), 51 deletions(-) diff --git a/Core/Crash/CrashHandler.cpp b/Core/Crash/CrashHandler.cpp index 29ca56d..8fa2c20 100644 --- a/Core/Crash/CrashHandler.cpp +++ b/Core/Crash/CrashHandler.cpp @@ -139,13 +139,13 @@ namespace CrashHandler return; break; case KEY_D_RIGHT: - if (SBIdx > 250) + if (SBIdx > 251) SBIdx--; else return; break; case KEY_D_DOWN: - if (SBIdx > 250) + if (SBIdx > 251) SBIdx--; else return; @@ -446,10 +446,10 @@ namespace CrashHandler crashdata.Process = cpudata->CurrentProcess; crashdata.Thread = cpudata->CurrentThread; - error("Current Process: %s(%ld)\n", + error("Current Process: %s(%ld)", cpudata->CurrentProcess->Name, cpudata->CurrentProcess->ID); - error("Current Thread: %s(%ld)\n", + error("Current Thread: %s(%ld)", cpudata->CurrentThread->Name, cpudata->CurrentThread->ID); } diff --git a/Core/Crash/Screens/Tasks.cpp b/Core/Crash/Screens/Tasks.cpp index 679ce05..326b752 100644 --- a/Core/Crash/Screens/Tasks.cpp +++ b/Core/Crash/Screens/Tasks.cpp @@ -44,17 +44,19 @@ namespace CrashHandler if (TaskManager) { if (data.Thread) - EHPrint("\eFAFAFACrash occured in thread \eAA0F0F%s\eFAFAFA(%ld)\n", data.Thread->Name, data.Thread->ID); + EHPrint("\eFAFAFACrash occured in thread \eAA0F0F%s\eFAFAFA(%ld) at \e00AAAA%#lx\n", data.Thread->Name, data.Thread->ID, data.Frame->rip); EHPrint("\eFAFAFAProcess list (%ld):\n", Plist.size()); foreach (auto Process in Plist) { - EHPrint("\e%s-> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\n", - StatusColor[Process->Status], Process->Name, Process->ID, StatusString[Process->Status]); + EHPrint("\e%s-> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\eFAFAFA PT:\e00AAAA%#lx\n", + StatusColor[Process->Status], Process->Name, Process->ID, StatusString[Process->Status], + Process->PageTable); foreach (auto Thread in Process->Threads) - EHPrint("\e%s -> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\n", - StatusColor[Thread->Status], Thread->Name, Thread->ID, StatusString[Thread->Status]); + EHPrint("\e%s -> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\eFAFAFA Stack:\e00AAAA%#lx\n", + StatusColor[Thread->Status], Thread->Name, Thread->ID, StatusString[Thread->Status], + Thread->Stack); } } else diff --git a/Core/Driver.cpp b/Core/Driver.cpp index d263e9d..ea49996 100644 --- a/Core/Driver.cpp +++ b/Core/Driver.cpp @@ -46,7 +46,7 @@ namespace Driver SmartLock(DriverDisplayPrintLock); debug("Requesting %ld pages from the kernel...", Size); void *ret = KernelAllocator.RequestPages(Size); - debug("Got %p", ret); + debug("Got %#lx", ret); return ret; } diff --git a/Tasking/Task.cpp b/Tasking/Task.cpp index b1a6ca2..c8988da 100644 --- a/Tasking/Task.cpp +++ b/Tasking/Task.cpp @@ -107,11 +107,23 @@ namespace Tasking } } - __no_stack_protector void Task::UpdateInfo(TaskInfo *Info, int Core) + __no_stack_protector void Task::UpdateUserTime(TaskInfo *Info) + { + // TODO + Info->UserTime++; + } + + __no_stack_protector void Task::UpdateKernelTime(TaskInfo *Info) + { + // TODO + Info->KernelTime++; + } + + __no_stack_protector void Task::UpdateUsage(TaskInfo *Info, int Core) { if (Info->Affinity[Core] == true) { - // TODO: Not working + // TODO: Not working(?) uint64_t CounterNow = CPU::Counter(); Info->OldUserTime = Info->CurrentUserTime; @@ -120,9 +132,6 @@ namespace Tasking Info->CurrentUserTime = Info->UserTime; Info->CurrentKernelTime = Info->KernelTime; - Info->UserTime = 0; - Info->KernelTime = 0; - Info->Usage[Core] = (Info->CurrentUserTime - Info->OldUserTime) + (Info->CurrentKernelTime - Info->OldKernelTime); Info->Usage[Core] = (Info->Usage[Core] * 100) / (CounterNow - Info->SpawnTime); @@ -317,23 +326,25 @@ namespace Tasking schedbg("Scheduler called on CPU %d.", CurrentCPU->ID); schedbg("%d: %ld%%", CurrentCPU->ID, GetUsage(CurrentCPU->ID)); - schedbg("================================================================"); - schedbg("Status: 0-ukn | 1-rdy | 2-run | 3-wait | 4-term"); - schedbg("Technical Informations on regs %#lx", Frame->InterruptNumber); - 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); - 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", - Frame->r12, Frame->r13, Frame->r14, Frame->r15); - schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx", - Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); - schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", - Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp); - schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx", - Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode); - schedbg("================================================================"); + { + schedbg("================================================================"); + schedbg("Status: 0-ukn | 1-rdy | 2-run | 3-wait | 4-term"); + schedbg("Technical Informations on regs %#lx", Frame->InterruptNumber); + 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); + 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", + Frame->r12, Frame->r13, Frame->r14, Frame->r15); + schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx", + Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); + schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", + Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp); + schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx", + Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode); + schedbg("================================================================"); + } // Null or invalid process/thread? Let's find a new one to execute. if (InvalidPCB(CurrentCPU->CurrentProcess) || InvalidTCB(CurrentCPU->CurrentThread)) @@ -467,26 +478,39 @@ namespace Tasking } End: { - UpdateInfo(&CurrentCPU->CurrentProcess->Info, CurrentCPU->ID); - UpdateInfo(&CurrentCPU->CurrentThread->Info, CurrentCPU->ID); + // TODO: This is not accurate. + if (CurrentCPU->CurrentProcess->Security.TrustLevel == TaskTrustLevel::User) + UpdateUserTime(&CurrentCPU->CurrentProcess->Info); + else + UpdateKernelTime(&CurrentCPU->CurrentProcess->Info); + + if (CurrentCPU->CurrentThread->Security.TrustLevel == TaskTrustLevel::User) + UpdateUserTime(&CurrentCPU->CurrentThread->Info); + else + UpdateKernelTime(&CurrentCPU->CurrentThread->Info); + + UpdateUsage(&CurrentCPU->CurrentProcess->Info, CurrentCPU->ID); + UpdateUsage(&CurrentCPU->CurrentThread->Info, CurrentCPU->ID); OneShot(CurrentCPU->CurrentThread->Info.Priority); } - schedbg("================================================================"); - schedbg("Technical Informations on Thread %s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); - 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); - 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", - Frame->r12, Frame->r13, Frame->r14, Frame->r15); - schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx", - Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); - schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", - Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp); - schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx", - Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode); - schedbg("================================================================"); + { + schedbg("================================================================"); + schedbg("Technical Informations on Thread %s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID); + 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); + 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", + Frame->r12, Frame->r13, Frame->r14, Frame->r15); + schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx", + Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx); + schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", + Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp); + schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx", + Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode); + schedbg("================================================================"); + } RealEnd: { schedbg("Scheduler end"); diff --git a/include/task.hpp b/include/task.hpp index 2103cfd..e9944a2 100644 --- a/include/task.hpp +++ b/include/task.hpp @@ -193,7 +193,9 @@ namespace Tasking void RemoveThread(TCB *tcb); void RemoveProcess(PCB *pcb); - void UpdateInfo(TaskInfo *Info, int Core); + void UpdateUserTime(TaskInfo *Info); + void UpdateKernelTime(TaskInfo *Info); + void UpdateUsage(TaskInfo *Info, int Core); bool FindNewProcess(void *CPUDataPointer); bool GetNextAvailableThread(void *CPUDataPointer);