mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-28 15:34:33 +00:00
Kernel & User time stub
This commit is contained in:
parent
6a05343e51
commit
042bce48a0
@ -139,13 +139,13 @@ namespace CrashHandler
|
|||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case KEY_D_RIGHT:
|
case KEY_D_RIGHT:
|
||||||
if (SBIdx > 250)
|
if (SBIdx > 251)
|
||||||
SBIdx--;
|
SBIdx--;
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
break;
|
break;
|
||||||
case KEY_D_DOWN:
|
case KEY_D_DOWN:
|
||||||
if (SBIdx > 250)
|
if (SBIdx > 251)
|
||||||
SBIdx--;
|
SBIdx--;
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
@ -446,10 +446,10 @@ namespace CrashHandler
|
|||||||
crashdata.Process = cpudata->CurrentProcess;
|
crashdata.Process = cpudata->CurrentProcess;
|
||||||
crashdata.Thread = cpudata->CurrentThread;
|
crashdata.Thread = cpudata->CurrentThread;
|
||||||
|
|
||||||
error("Current Process: %s(%ld)\n",
|
error("Current Process: %s(%ld)",
|
||||||
cpudata->CurrentProcess->Name,
|
cpudata->CurrentProcess->Name,
|
||||||
cpudata->CurrentProcess->ID);
|
cpudata->CurrentProcess->ID);
|
||||||
error("Current Thread: %s(%ld)\n",
|
error("Current Thread: %s(%ld)",
|
||||||
cpudata->CurrentThread->Name,
|
cpudata->CurrentThread->Name,
|
||||||
cpudata->CurrentThread->ID);
|
cpudata->CurrentThread->ID);
|
||||||
}
|
}
|
||||||
|
@ -44,17 +44,19 @@ namespace CrashHandler
|
|||||||
if (TaskManager)
|
if (TaskManager)
|
||||||
{
|
{
|
||||||
if (data.Thread)
|
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());
|
EHPrint("\eFAFAFAProcess list (%ld):\n", Plist.size());
|
||||||
foreach (auto Process in Plist)
|
foreach (auto Process in Plist)
|
||||||
{
|
{
|
||||||
EHPrint("\e%s-> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\n",
|
EHPrint("\e%s-> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\eFAFAFA PT:\e00AAAA%#lx\n",
|
||||||
StatusColor[Process->Status], Process->Name, Process->ID, StatusString[Process->Status]);
|
StatusColor[Process->Status], Process->Name, Process->ID, StatusString[Process->Status],
|
||||||
|
Process->PageTable);
|
||||||
|
|
||||||
foreach (auto Thread in Process->Threads)
|
foreach (auto Thread in Process->Threads)
|
||||||
EHPrint("\e%s -> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\n",
|
EHPrint("\e%s -> \eFAFAFA%s\eCCCCCC(%ld) \e00AAAA%s\eFAFAFA Stack:\e00AAAA%#lx\n",
|
||||||
StatusColor[Thread->Status], Thread->Name, Thread->ID, StatusString[Thread->Status]);
|
StatusColor[Thread->Status], Thread->Name, Thread->ID, StatusString[Thread->Status],
|
||||||
|
Thread->Stack);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -46,7 +46,7 @@ namespace Driver
|
|||||||
SmartLock(DriverDisplayPrintLock);
|
SmartLock(DriverDisplayPrintLock);
|
||||||
debug("Requesting %ld pages from the kernel...", Size);
|
debug("Requesting %ld pages from the kernel...", Size);
|
||||||
void *ret = KernelAllocator.RequestPages(Size);
|
void *ret = KernelAllocator.RequestPages(Size);
|
||||||
debug("Got %p", ret);
|
debug("Got %#lx", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
104
Tasking/Task.cpp
104
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)
|
if (Info->Affinity[Core] == true)
|
||||||
{
|
{
|
||||||
// TODO: Not working
|
// TODO: Not working(?)
|
||||||
uint64_t CounterNow = CPU::Counter();
|
uint64_t CounterNow = CPU::Counter();
|
||||||
|
|
||||||
Info->OldUserTime = Info->CurrentUserTime;
|
Info->OldUserTime = Info->CurrentUserTime;
|
||||||
@ -120,9 +132,6 @@ namespace Tasking
|
|||||||
Info->CurrentUserTime = Info->UserTime;
|
Info->CurrentUserTime = Info->UserTime;
|
||||||
Info->CurrentKernelTime = Info->KernelTime;
|
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->CurrentUserTime - Info->OldUserTime) + (Info->CurrentKernelTime - Info->OldKernelTime);
|
||||||
Info->Usage[Core] = (Info->Usage[Core] * 100) / (CounterNow - Info->SpawnTime);
|
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("Scheduler called on CPU %d.", CurrentCPU->ID);
|
||||||
schedbg("%d: %ld%%", CurrentCPU->ID, GetUsage(CurrentCPU->ID));
|
schedbg("%d: %ld%%", CurrentCPU->ID, GetUsage(CurrentCPU->ID));
|
||||||
|
|
||||||
schedbg("================================================================");
|
{
|
||||||
schedbg("Status: 0-ukn | 1-rdy | 2-run | 3-wait | 4-term");
|
schedbg("================================================================");
|
||||||
schedbg("Technical Informations on regs %#lx", Frame->InterruptNumber);
|
schedbg("Status: 0-ukn | 1-rdy | 2-run | 3-wait | 4-term");
|
||||||
schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx",
|
schedbg("Technical Informations on regs %#lx", Frame->InterruptNumber);
|
||||||
CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE),
|
schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx",
|
||||||
Frame->ss, Frame->cs, Frame->ds);
|
CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE),
|
||||||
schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx",
|
Frame->ss, Frame->cs, Frame->ds);
|
||||||
Frame->r8, Frame->r9, Frame->r10, Frame->r11);
|
schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx",
|
||||||
schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx",
|
Frame->r8, Frame->r9, Frame->r10, Frame->r11);
|
||||||
Frame->r12, Frame->r13, Frame->r14, Frame->r15);
|
schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx",
|
||||||
schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx",
|
Frame->r12, Frame->r13, Frame->r14, Frame->r15);
|
||||||
Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx);
|
schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx",
|
||||||
schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx",
|
Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx);
|
||||||
Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
|
schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx",
|
||||||
schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx",
|
Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
|
||||||
Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode);
|
schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx",
|
||||||
schedbg("================================================================");
|
Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode);
|
||||||
|
schedbg("================================================================");
|
||||||
|
}
|
||||||
|
|
||||||
// Null or invalid process/thread? Let's find a new one to execute.
|
// Null or invalid process/thread? Let's find a new one to execute.
|
||||||
if (InvalidPCB(CurrentCPU->CurrentProcess) || InvalidTCB(CurrentCPU->CurrentThread))
|
if (InvalidPCB(CurrentCPU->CurrentProcess) || InvalidTCB(CurrentCPU->CurrentThread))
|
||||||
@ -467,26 +478,39 @@ namespace Tasking
|
|||||||
}
|
}
|
||||||
End:
|
End:
|
||||||
{
|
{
|
||||||
UpdateInfo(&CurrentCPU->CurrentProcess->Info, CurrentCPU->ID);
|
// TODO: This is not accurate.
|
||||||
UpdateInfo(&CurrentCPU->CurrentThread->Info, CurrentCPU->ID);
|
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);
|
OneShot(CurrentCPU->CurrentThread->Info.Priority);
|
||||||
}
|
}
|
||||||
schedbg("================================================================");
|
{
|
||||||
schedbg("Technical Informations on Thread %s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID);
|
schedbg("================================================================");
|
||||||
schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx",
|
schedbg("Technical Informations on Thread %s[%ld]:", CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID);
|
||||||
CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE),
|
schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx",
|
||||||
Frame->ss, Frame->cs, Frame->ds);
|
CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE), CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE),
|
||||||
schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx",
|
Frame->ss, Frame->cs, Frame->ds);
|
||||||
Frame->r8, Frame->r9, Frame->r10, Frame->r11);
|
schedbg("R8=%#lx R9=%#lx R10=%#lx R11=%#lx",
|
||||||
schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx",
|
Frame->r8, Frame->r9, Frame->r10, Frame->r11);
|
||||||
Frame->r12, Frame->r13, Frame->r14, Frame->r15);
|
schedbg("R12=%#lx R13=%#lx R14=%#lx R15=%#lx",
|
||||||
schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx",
|
Frame->r12, Frame->r13, Frame->r14, Frame->r15);
|
||||||
Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx);
|
schedbg("RAX=%#lx RBX=%#lx RCX=%#lx RDX=%#lx",
|
||||||
schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx",
|
Frame->rax, Frame->rbx, Frame->rcx, Frame->rdx);
|
||||||
Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
|
schedbg("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx",
|
||||||
schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx",
|
Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
|
||||||
Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode);
|
schedbg("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx",
|
||||||
schedbg("================================================================");
|
Frame->rip, Frame->rflags, Frame->InterruptNumber, Frame->ErrorCode);
|
||||||
|
schedbg("================================================================");
|
||||||
|
}
|
||||||
RealEnd:
|
RealEnd:
|
||||||
{
|
{
|
||||||
schedbg("Scheduler end");
|
schedbg("Scheduler end");
|
||||||
|
@ -193,7 +193,9 @@ namespace Tasking
|
|||||||
void RemoveThread(TCB *tcb);
|
void RemoveThread(TCB *tcb);
|
||||||
void RemoveProcess(PCB *pcb);
|
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 FindNewProcess(void *CPUDataPointer);
|
||||||
bool GetNextAvailableThread(void *CPUDataPointer);
|
bool GetNextAvailableThread(void *CPUDataPointer);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user