mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-05-25 22:14:37 +00:00
Tasking is now working under 32-bit
This commit is contained in:
parent
9e751dcc41
commit
446a571018
@ -102,26 +102,13 @@ namespace InterruptDescriptorTable
|
|||||||
asm("cld\n"
|
asm("cld\n"
|
||||||
"cli\n"
|
"cli\n"
|
||||||
|
|
||||||
// "push %eax\n"
|
|
||||||
// "push %ebx\n"
|
|
||||||
// "push %ecx\n"
|
|
||||||
// "push %edx\n"
|
|
||||||
// "push %esi\n"
|
|
||||||
// "push %edi\n"
|
|
||||||
// "push %ebp\n"
|
|
||||||
"pusha\n"
|
"pusha\n"
|
||||||
|
|
||||||
"push %esp\n"
|
"push %esp\n"
|
||||||
"call ExceptionHandler\n"
|
"call ExceptionHandler\n"
|
||||||
|
"pop %esp\n"
|
||||||
|
|
||||||
"popa\n"
|
"popa\n"
|
||||||
// "pop %ebp\n"
|
|
||||||
// "pop %edi\n"
|
|
||||||
// "pop %esi\n"
|
|
||||||
// "pop %edx\n"
|
|
||||||
// "pop %ecx\n"
|
|
||||||
// "pop %ebx\n"
|
|
||||||
// "pop %eax\n"
|
|
||||||
|
|
||||||
"add $8, %esp\n"
|
"add $8, %esp\n"
|
||||||
|
|
||||||
@ -133,26 +120,13 @@ namespace InterruptDescriptorTable
|
|||||||
asm("cld\n"
|
asm("cld\n"
|
||||||
"cli\n"
|
"cli\n"
|
||||||
|
|
||||||
// "push %eax\n"
|
|
||||||
// "push %ebx\n"
|
|
||||||
// "push %ecx\n"
|
|
||||||
// "push %edx\n"
|
|
||||||
// "push %esi\n"
|
|
||||||
// "push %edi\n"
|
|
||||||
// "push %ebp\n"
|
|
||||||
"pusha\n"
|
"pusha\n"
|
||||||
|
|
||||||
"push %esp\n"
|
"push %esp\n"
|
||||||
"call MainInterruptHandler\n"
|
"call MainInterruptHandler\n"
|
||||||
|
"pop %esp\n"
|
||||||
|
|
||||||
"popa\n"
|
"popa\n"
|
||||||
// "pop %ebp\n"
|
|
||||||
// "pop %edi\n"
|
|
||||||
// "pop %esi\n"
|
|
||||||
// "pop %edx\n"
|
|
||||||
// "pop %ecx\n"
|
|
||||||
// "pop %ebx\n"
|
|
||||||
// "pop %eax\n"
|
|
||||||
|
|
||||||
"add $8, %esp\n"
|
"add $8, %esp\n"
|
||||||
|
|
||||||
|
@ -1082,10 +1082,10 @@ namespace CrashHandler
|
|||||||
asmv("mov %%ds, %0"
|
asmv("mov %%ds, %0"
|
||||||
: "=r"(ds));
|
: "=r"(ds));
|
||||||
|
|
||||||
EHPrint("\eFF2525FS=%#x GS=%#x SS=%#x CS=%#x DS=%#x\n",
|
EHPrint("\eFF2525FS=%#x GS=%#x CS=%#x DS=%#x\n",
|
||||||
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE),
|
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE),
|
||||||
CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
||||||
Frame->ss, Frame->cs, ds);
|
Frame->cs, ds);
|
||||||
|
|
||||||
EHPrint("EAX=%#x EBX=%#x ECX=%#x EDX=%#x\n",
|
EHPrint("EAX=%#x EBX=%#x ECX=%#x EDX=%#x\n",
|
||||||
Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
|
Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
|
||||||
@ -1300,9 +1300,9 @@ namespace CrashHandler
|
|||||||
crashdata.efer.SVME ? "True " : "False", crashdata.efer.LMSLE ? "True " : "False", crashdata.efer.FFXSR ? "True " : "False", crashdata.efer.TCE ? "True " : "False",
|
crashdata.efer.SVME ? "True " : "False", crashdata.efer.LMSLE ? "True " : "False", crashdata.efer.FFXSR ? "True " : "False", crashdata.efer.TCE ? "True " : "False",
|
||||||
crashdata.efer.Reserved0, crashdata.efer.Reserved1, crashdata.efer.Reserved2);
|
crashdata.efer.Reserved0, crashdata.efer.Reserved1, crashdata.efer.Reserved2);
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
error("FS=%#x GS=%#x SS=%#x CS=%#x DS=%#x",
|
error("FS=%#x GS=%#x CS=%#x DS=%#x",
|
||||||
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
||||||
Frame->ss, Frame->cs, ds);
|
Frame->cs, ds);
|
||||||
|
|
||||||
error("EAX=%#x EBX=%#x ECX=%#x EDX=%#x",
|
error("EAX=%#x EBX=%#x ECX=%#x EDX=%#x",
|
||||||
Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
|
Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
|
||||||
|
@ -79,9 +79,9 @@ namespace CrashHandler
|
|||||||
EHPrint("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx\n", data.Frame->rsi, data.Frame->rdi, data.Frame->rbp, data.Frame->rsp);
|
EHPrint("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx\n", data.Frame->rsi, data.Frame->rdi, data.Frame->rbp, data.Frame->rsp);
|
||||||
EHPrint("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx EFER=%#lx\n", data.Frame->rip, data.Frame->rflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode, data.efer.raw);
|
EHPrint("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx EFER=%#lx\n", data.Frame->rip, data.Frame->rflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode, data.efer.raw);
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
EHPrint("\e7981FCFS=%#x GS=%#x SS=%#x CS=%#x DS=%#x\n",
|
EHPrint("\e7981FCFS=%#x GS=%#x CS=%#x DS=%#x\n",
|
||||||
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
||||||
data.Frame->ss, data.Frame->cs, ds);
|
data.Frame->cs, ds);
|
||||||
EHPrint("EAX=%#x EBX=%#x ECX=%#x EDX=%#x\n", data.Frame->eax, data.Frame->ebx, data.Frame->ecx, data.Frame->edx);
|
EHPrint("EAX=%#x EBX=%#x ECX=%#x EDX=%#x\n", data.Frame->eax, data.Frame->ebx, data.Frame->ecx, data.Frame->edx);
|
||||||
EHPrint("ESI=%#x EDI=%#x EBP=%#x ESP=%#x\n", data.Frame->esi, data.Frame->edi, data.Frame->ebp, data.Frame->esp);
|
EHPrint("ESI=%#x EDI=%#x EBP=%#x ESP=%#x\n", data.Frame->esi, data.Frame->edi, data.Frame->ebp, data.Frame->esp);
|
||||||
EHPrint("EIP=%#x EFL=%#x INT=%#x ERR=%#x\n", data.Frame->eip, data.Frame->eflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode);
|
EHPrint("EIP=%#x EFL=%#x INT=%#x ERR=%#x\n", data.Frame->eip, data.Frame->eflags.raw, data.Frame->InterruptNumber, data.Frame->ErrorCode);
|
||||||
|
@ -88,9 +88,9 @@ SafeFunction void UserModeExceptionHandler(CHArchTrapFrame *Frame)
|
|||||||
error("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
|
error("RSI=%#lx RDI=%#lx RBP=%#lx RSP=%#lx", Frame->rsi, Frame->rdi, Frame->rbp, Frame->rsp);
|
||||||
error("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx EFER=%#lx", Frame->rip, Frame->rflags.raw, Frame->InterruptNumber, Frame->ErrorCode, efer.raw);
|
error("RIP=%#lx RFL=%#lx INT=%#lx ERR=%#lx EFER=%#lx", Frame->rip, Frame->rflags.raw, Frame->InterruptNumber, Frame->ErrorCode, efer.raw);
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
error("FS=%#x GS=%#x SS=%#x CS=%#x DS=%#x",
|
error("FS=%#x GS=%#x CS=%#x DS=%#x",
|
||||||
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE), CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE),
|
||||||
Frame->ss, Frame->cs, ds);
|
Frame->cs, ds);
|
||||||
error("EAX=%#x EBX=%#x ECX=%#x EDX=%#x", Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
|
error("EAX=%#x EBX=%#x ECX=%#x EDX=%#x", Frame->eax, Frame->ebx, Frame->ecx, Frame->edx);
|
||||||
error("ESI=%#x EDI=%#x EBP=%#x ESP=%#x", Frame->esi, Frame->edi, Frame->ebp, Frame->esp);
|
error("ESI=%#x EDI=%#x EBP=%#x ESP=%#x", Frame->esi, Frame->edi, Frame->ebp, Frame->esp);
|
||||||
error("EIP=%#x EFL=%#x INT=%#x ERR=%#x", Frame->eip, Frame->eflags.raw, Frame->InterruptNumber, Frame->ErrorCode);
|
error("EIP=%#x EFL=%#x INT=%#x ERR=%#x", Frame->eip, Frame->eflags.raw, Frame->InterruptNumber, Frame->ErrorCode);
|
||||||
|
@ -305,12 +305,13 @@ namespace Driver
|
|||||||
regs.rsp = Frame->rsp;
|
regs.rsp = Frame->rsp;
|
||||||
regs.ss = Frame->ss;
|
regs.ss = Frame->ss;
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
regs.ebp = Frame->ebp;
|
|
||||||
regs.edi = Frame->edi;
|
regs.edi = Frame->edi;
|
||||||
regs.esi = Frame->esi;
|
regs.esi = Frame->esi;
|
||||||
|
regs.ebp = Frame->ebp;
|
||||||
|
regs.esp = Frame->esp;
|
||||||
|
regs.ebx = Frame->ebx;
|
||||||
regs.edx = Frame->edx;
|
regs.edx = Frame->edx;
|
||||||
regs.ecx = Frame->ecx;
|
regs.ecx = Frame->ecx;
|
||||||
regs.ebx = Frame->ebx;
|
|
||||||
regs.eax = Frame->eax;
|
regs.eax = Frame->eax;
|
||||||
|
|
||||||
regs.InterruptNumber = Frame->InterruptNumber;
|
regs.InterruptNumber = Frame->InterruptNumber;
|
||||||
@ -318,8 +319,8 @@ namespace Driver
|
|||||||
regs.eip = Frame->eip;
|
regs.eip = Frame->eip;
|
||||||
regs.cs = Frame->cs;
|
regs.cs = Frame->cs;
|
||||||
regs.eflags = Frame->eflags.raw;
|
regs.eflags = Frame->eflags.raw;
|
||||||
regs.esp = Frame->esp;
|
regs.r3_esp = Frame->r3_esp;
|
||||||
regs.ss = Frame->ss;
|
regs.r3_ss = Frame->r3_ss;
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
#endif
|
#endif
|
||||||
((int (*)(void *))(Handle.InterruptCallback))(®s);
|
((int (*)(void *))(Handle.InterruptCallback))(®s);
|
||||||
|
16
DAPI.hpp
16
DAPI.hpp
@ -135,8 +135,10 @@ struct KernelAPI
|
|||||||
|
|
||||||
struct KAPIDisplay
|
struct KAPIDisplay
|
||||||
{
|
{
|
||||||
__UINT32_TYPE__ (*GetWidth)(void);
|
__UINT32_TYPE__ (*GetWidth)
|
||||||
__UINT32_TYPE__ (*GetHeight)(void);
|
(void);
|
||||||
|
__UINT32_TYPE__ (*GetHeight)
|
||||||
|
(void);
|
||||||
/* TODO: Add more */
|
/* TODO: Add more */
|
||||||
} Display;
|
} Display;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
@ -428,21 +430,23 @@ union CPURegisters
|
|||||||
__UINT64_TYPE__ rsp;
|
__UINT64_TYPE__ rsp;
|
||||||
__UINT64_TYPE__ ss;
|
__UINT64_TYPE__ ss;
|
||||||
#elif defined(__i386__)
|
#elif defined(__i386__)
|
||||||
__UINT32_TYPE__ ebp;
|
|
||||||
__UINT32_TYPE__ edi;
|
__UINT32_TYPE__ edi;
|
||||||
__UINT32_TYPE__ esi;
|
__UINT32_TYPE__ esi;
|
||||||
|
__UINT32_TYPE__ ebp;
|
||||||
|
__UINT32_TYPE__ esp;
|
||||||
|
__UINT32_TYPE__ ebx;
|
||||||
__UINT32_TYPE__ edx;
|
__UINT32_TYPE__ edx;
|
||||||
__UINT32_TYPE__ ecx;
|
__UINT32_TYPE__ ecx;
|
||||||
__UINT32_TYPE__ ebx;
|
|
||||||
__UINT32_TYPE__ eax;
|
__UINT32_TYPE__ eax;
|
||||||
|
|
||||||
__UINT32_TYPE__ InterruptNumber;
|
__UINT32_TYPE__ InterruptNumber;
|
||||||
__UINT32_TYPE__ ErrorCode;
|
__UINT32_TYPE__ ErrorCode;
|
||||||
|
|
||||||
__UINT32_TYPE__ eip;
|
__UINT32_TYPE__ eip;
|
||||||
__UINT32_TYPE__ cs;
|
__UINT32_TYPE__ cs;
|
||||||
__UINT32_TYPE__ eflags;
|
__UINT32_TYPE__ eflags;
|
||||||
__UINT32_TYPE__ esp;
|
__UINT32_TYPE__ r3_esp;
|
||||||
__UINT32_TYPE__ ss;
|
__UINT32_TYPE__ r3_ss;
|
||||||
#else
|
#else
|
||||||
#warning "Unsupported architecture"
|
#warning "Unsupported architecture"
|
||||||
#endif
|
#endif
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
#include "../Architecture/amd64/cpu/gdt.hpp"
|
#include "../Architecture/amd64/cpu/gdt.hpp"
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
#include "../Architecture/i386/cpu/apic.hpp"
|
#include "../Architecture/i386/cpu/apic.hpp"
|
||||||
|
#include "../Architecture/i386/cpu/gdt.hpp"
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -109,16 +110,15 @@ extern "C" SafeFunction NIF void TaskingScheduler_OneShot(int TimeSlice)
|
|||||||
{
|
{
|
||||||
if (TimeSlice == 0)
|
if (TimeSlice == 0)
|
||||||
TimeSlice = Tasking::TaskPriority::Normal;
|
TimeSlice = Tasking::TaskPriority::Normal;
|
||||||
#if defined(a64)
|
#if defined(a86)
|
||||||
((APIC::Timer *)Interrupts::apicTimer[GetCurrentCPU()->ID])->OneShot(CPU::x86::IRQ16, TimeSlice);
|
((APIC::Timer *)Interrupts::apicTimer[GetCurrentCPU()->ID])->OneShot(CPU::x86::IRQ16, TimeSlice);
|
||||||
#elif defined(a32)
|
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Tasking
|
namespace Tasking
|
||||||
{
|
{
|
||||||
#if defined(a64)
|
#if defined(a86)
|
||||||
SafeFunction NIF bool Task::FindNewProcess(void *CPUDataPointer)
|
SafeFunction NIF bool Task::FindNewProcess(void *CPUDataPointer)
|
||||||
{
|
{
|
||||||
CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
|
CPUData *CurrentCPU = (CPUData *)CPUDataPointer;
|
||||||
@ -473,7 +473,11 @@ namespace Tasking
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef a64
|
||||||
SafeFunction NIF void Task::Schedule(CPU::x64::TrapFrame *Frame)
|
SafeFunction NIF void Task::Schedule(CPU::x64::TrapFrame *Frame)
|
||||||
|
#else
|
||||||
|
SafeFunction NIF void Task::Schedule(CPU::x32::TrapFrame *Frame)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
if (StopScheduler)
|
if (StopScheduler)
|
||||||
{
|
{
|
||||||
@ -481,9 +485,14 @@ namespace Tasking
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
bool ProcessNotChanged = false;
|
bool ProcessNotChanged = false;
|
||||||
CPU::x64::writecr3({.raw = (uint64_t)KernelPageTable}); /* Restore kernel page table for safety reasons. */
|
/* Restore kernel page table for safety reasons. */
|
||||||
|
#ifdef a64
|
||||||
|
CPU::x64::writecr3({.raw = (uint64_t)KernelPageTable});
|
||||||
|
#else
|
||||||
|
CPU::x32::writecr3({.raw = (uint32_t)KernelPageTable});
|
||||||
|
#endif
|
||||||
uint64_t SchedTmpTicks = TimeManager->GetCounter();
|
uint64_t SchedTmpTicks = TimeManager->GetCounter();
|
||||||
this->LastTaskTicks.store(SchedTmpTicks - this->SchedulerTicks.load());
|
this->LastTaskTicks.store(size_t(SchedTmpTicks - this->SchedulerTicks.load()));
|
||||||
CPUData *CurrentCPU = GetCurrentCPU();
|
CPUData *CurrentCPU = GetCurrentCPU();
|
||||||
this->LastCore.store(CurrentCPU->ID);
|
this->LastCore.store(CurrentCPU->ID);
|
||||||
schedbg("Scheduler called on CPU %d.", CurrentCPU->ID);
|
schedbg("Scheduler called on CPU %d.", CurrentCPU->ID);
|
||||||
@ -526,9 +535,15 @@ namespace Tasking
|
|||||||
{
|
{
|
||||||
CurrentCPU->CurrentThread->Registers = *Frame;
|
CurrentCPU->CurrentThread->Registers = *Frame;
|
||||||
CPU::x64::fxsave(&CurrentCPU->CurrentThread->FPU);
|
CPU::x64::fxsave(&CurrentCPU->CurrentThread->FPU);
|
||||||
|
#ifdef a64
|
||||||
CurrentCPU->CurrentThread->ShadowGSBase = CPU::x64::rdmsr(CPU::x64::MSR_SHADOW_GS_BASE);
|
CurrentCPU->CurrentThread->ShadowGSBase = CPU::x64::rdmsr(CPU::x64::MSR_SHADOW_GS_BASE);
|
||||||
CurrentCPU->CurrentThread->GSBase = CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE);
|
CurrentCPU->CurrentThread->GSBase = CPU::x64::rdmsr(CPU::x64::MSR_GS_BASE);
|
||||||
CurrentCPU->CurrentThread->FSBase = CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE);
|
CurrentCPU->CurrentThread->FSBase = CPU::x64::rdmsr(CPU::x64::MSR_FS_BASE);
|
||||||
|
#else
|
||||||
|
CurrentCPU->CurrentThread->ShadowGSBase = uintptr_t(CPU::x32::rdmsr(CPU::x32::MSR_SHADOW_GS_BASE));
|
||||||
|
CurrentCPU->CurrentThread->GSBase = uintptr_t(CPU::x32::rdmsr(CPU::x32::MSR_GS_BASE));
|
||||||
|
CurrentCPU->CurrentThread->FSBase = uintptr_t(CPU::x32::rdmsr(CPU::x32::MSR_FS_BASE));
|
||||||
|
#endif
|
||||||
|
|
||||||
if (CurrentCPU->CurrentProcess->Status.load() == TaskStatus::Running)
|
if (CurrentCPU->CurrentProcess->Status.load() == TaskStatus::Running)
|
||||||
CurrentCPU->CurrentProcess->Status.store(TaskStatus::Ready);
|
CurrentCPU->CurrentProcess->Status.store(TaskStatus::Ready);
|
||||||
@ -609,6 +624,7 @@ namespace Tasking
|
|||||||
for (size_t i = 0; i < (sizeof(CurrentCPU->CurrentThread->IPHistory) / sizeof(CurrentCPU->CurrentThread->IPHistory[0])) - 1; i++)
|
for (size_t i = 0; i < (sizeof(CurrentCPU->CurrentThread->IPHistory) / sizeof(CurrentCPU->CurrentThread->IPHistory[0])) - 1; i++)
|
||||||
CurrentCPU->CurrentThread->IPHistory[i + 1] = CurrentCPU->CurrentThread->IPHistory[i];
|
CurrentCPU->CurrentThread->IPHistory[i + 1] = CurrentCPU->CurrentThread->IPHistory[i];
|
||||||
|
|
||||||
|
#ifdef a64
|
||||||
CurrentCPU->CurrentThread->IPHistory[0] = Frame->rip;
|
CurrentCPU->CurrentThread->IPHistory[0] = Frame->rip;
|
||||||
|
|
||||||
GlobalDescriptorTable::SetKernelStack((void *)((uintptr_t)CurrentCPU->CurrentThread->Stack->GetStackTop()));
|
GlobalDescriptorTable::SetKernelStack((void *)((uintptr_t)CurrentCPU->CurrentThread->Stack->GetStackTop()));
|
||||||
@ -620,6 +636,19 @@ namespace Tasking
|
|||||||
CPU::x64::wrmsr(CPU::x64::MSR_SHADOW_GS_BASE, CurrentCPU->CurrentThread->ShadowGSBase);
|
CPU::x64::wrmsr(CPU::x64::MSR_SHADOW_GS_BASE, CurrentCPU->CurrentThread->ShadowGSBase);
|
||||||
CPU::x64::wrmsr(CPU::x64::MSR_GS_BASE, CurrentCPU->CurrentThread->GSBase);
|
CPU::x64::wrmsr(CPU::x64::MSR_GS_BASE, CurrentCPU->CurrentThread->GSBase);
|
||||||
CPU::x64::wrmsr(CPU::x64::MSR_FS_BASE, CurrentCPU->CurrentThread->FSBase);
|
CPU::x64::wrmsr(CPU::x64::MSR_FS_BASE, CurrentCPU->CurrentThread->FSBase);
|
||||||
|
#else
|
||||||
|
CurrentCPU->CurrentThread->IPHistory[0] = Frame->eip;
|
||||||
|
|
||||||
|
GlobalDescriptorTable::SetKernelStack((void *)((uintptr_t)CurrentCPU->CurrentThread->Stack->GetStackTop()));
|
||||||
|
CPU::x32::writecr3({.raw = (uint32_t)CurrentCPU->CurrentProcess->PageTable});
|
||||||
|
/* Not sure if this is needed, but it's better to be safe than sorry. */
|
||||||
|
asmv("movl %cr3, %eax");
|
||||||
|
asmv("movl %eax, %cr3");
|
||||||
|
CPU::x32::fxrstor(&CurrentCPU->CurrentThread->FPU);
|
||||||
|
CPU::x32::wrmsr(CPU::x32::MSR_SHADOW_GS_BASE, CurrentCPU->CurrentThread->ShadowGSBase);
|
||||||
|
CPU::x32::wrmsr(CPU::x32::MSR_GS_BASE, CurrentCPU->CurrentThread->GSBase);
|
||||||
|
CPU::x32::wrmsr(CPU::x32::MSR_FS_BASE, CurrentCPU->CurrentThread->FSBase);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ON_SCREEN_SCHEDULER_TASK_MANAGER
|
#ifdef ON_SCREEN_SCHEDULER_TASK_MANAGER
|
||||||
OnScreenTaskManagerUpdate();
|
OnScreenTaskManagerUpdate();
|
||||||
@ -646,16 +675,26 @@ namespace Tasking
|
|||||||
TaskingScheduler_OneShot(CurrentCPU->CurrentThread->Info.Priority);
|
TaskingScheduler_OneShot(CurrentCPU->CurrentThread->Info.Priority);
|
||||||
|
|
||||||
if (CurrentCPU->CurrentThread->Security.IsDebugEnabled && CurrentCPU->CurrentThread->Security.IsKernelDebugEnabled)
|
if (CurrentCPU->CurrentThread->Security.IsDebugEnabled && CurrentCPU->CurrentThread->Security.IsKernelDebugEnabled)
|
||||||
|
{
|
||||||
|
#ifdef a64
|
||||||
trace("%s[%ld]: RIP=%#lx RBP=%#lx RSP=%#lx",
|
trace("%s[%ld]: RIP=%#lx RBP=%#lx RSP=%#lx",
|
||||||
CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID,
|
CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID,
|
||||||
CurrentCPU->CurrentThread->Registers.rip,
|
CurrentCPU->CurrentThread->Registers.rip,
|
||||||
CurrentCPU->CurrentThread->Registers.rbp,
|
CurrentCPU->CurrentThread->Registers.rbp,
|
||||||
CurrentCPU->CurrentThread->Registers.rsp);
|
CurrentCPU->CurrentThread->Registers.rsp);
|
||||||
|
#else
|
||||||
|
trace("%s[%ld]: EIP=%#lx EBP=%#lx ESP=%#lx",
|
||||||
|
CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID,
|
||||||
|
CurrentCPU->CurrentThread->Registers.eip,
|
||||||
|
CurrentCPU->CurrentThread->Registers.ebp,
|
||||||
|
CurrentCPU->CurrentThread->Registers.esp);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
schedbg("================================================================");
|
schedbg("================================================================");
|
||||||
schedbg("Technical Informations on Thread %s[%ld]:",
|
schedbg("Technical Informations on Thread %s[%ld]:",
|
||||||
CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID);
|
CurrentCPU->CurrentThread->Name, CurrentCPU->CurrentThread->ID);
|
||||||
uint64_t ds;
|
uintptr_t ds;
|
||||||
asmv("mov %%ds, %0"
|
asmv("mov %%ds, %0"
|
||||||
: "=r"(ds));
|
: "=r"(ds));
|
||||||
schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx",
|
schedbg("FS=%#lx GS=%#lx SS=%#lx CS=%#lx DS=%#lx",
|
||||||
@ -674,45 +713,18 @@ namespace Tasking
|
|||||||
schedbg("================================================================");
|
schedbg("================================================================");
|
||||||
|
|
||||||
End:
|
End:
|
||||||
this->SchedulerTicks.store(TimeManager->GetCounter() - SchedTmpTicks);
|
this->SchedulerTicks.store(size_t(TimeManager->GetCounter() - SchedTmpTicks));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef a64
|
||||||
SafeFunction NIF void Task::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
|
SafeFunction NIF void Task::OnInterruptReceived(CPU::x64::TrapFrame *Frame)
|
||||||
|
#else
|
||||||
|
SafeFunction NIF void Task::OnInterruptReceived(CPU::x32::TrapFrame *Frame)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
SmartCriticalSection(SchedulerLock);
|
SmartCriticalSection(SchedulerLock);
|
||||||
this->Schedule(Frame);
|
this->Schedule(Frame);
|
||||||
}
|
}
|
||||||
#elif defined(a32)
|
|
||||||
SafeFunction bool Task::FindNewProcess(void *CPUDataPointer)
|
|
||||||
{
|
|
||||||
fixme("unimplemented");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SafeFunction bool Task::GetNextAvailableThread(void *CPUDataPointer)
|
|
||||||
{
|
|
||||||
fixme("unimplemented");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SafeFunction bool Task::GetNextAvailableProcess(void *CPUDataPointer)
|
|
||||||
{
|
|
||||||
fixme("unimplemented");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SafeFunction bool Task::SchedulerSearchProcessThread(void *CPUDataPointer)
|
|
||||||
{
|
|
||||||
fixme("unimplemented");
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SafeFunction void Task::Schedule(void *Frame)
|
|
||||||
{
|
|
||||||
fixme("unimplemented");
|
|
||||||
}
|
|
||||||
|
|
||||||
SafeFunction void Task::OnInterruptReceived(CPU::x32::TrapFrame *Frame) { this->Schedule(Frame); }
|
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
SafeFunction bool Task::FindNewProcess(void *CPUDataPointer)
|
SafeFunction bool Task::FindNewProcess(void *CPUDataPointer)
|
||||||
{
|
{
|
||||||
|
@ -377,7 +377,7 @@ namespace Tasking
|
|||||||
IdleProcess->ELFSymbolTable = KernelSymbolTable;
|
IdleProcess->ELFSymbolTable = KernelSymbolTable;
|
||||||
for (int i = 0; i < SMP::CPUCores; i++)
|
for (int i = 0; i < SMP::CPUCores; i++)
|
||||||
{
|
{
|
||||||
IdleThread = CreateThread(IdleProcess, reinterpret_cast<uintptr_t>(IdleProcessLoop));
|
IdleThread = CreateThread(IdleProcess, IP(IdleProcessLoop));
|
||||||
char IdleName[16];
|
char IdleName[16];
|
||||||
sprintf(IdleName, "Idle Thread %d", i);
|
sprintf(IdleName, "Idle Thread %d", i);
|
||||||
IdleThread->Rename(IdleName);
|
IdleThread->Rename(IdleName);
|
||||||
@ -387,7 +387,7 @@ namespace Tasking
|
|||||||
IdleThread->Info.Affinity[i] = true;
|
IdleThread->Info.Affinity[i] = true;
|
||||||
}
|
}
|
||||||
debug("Tasking Started");
|
debug("Tasking Started");
|
||||||
#if defined(a64)
|
#if defined(a86)
|
||||||
if (Interrupts::apicTimer[0])
|
if (Interrupts::apicTimer[0])
|
||||||
{
|
{
|
||||||
((APIC::Timer *)Interrupts::apicTimer[0])->OneShot(CPU::x86::IRQ16, 100);
|
((APIC::Timer *)Interrupts::apicTimer[0])->OneShot(CPU::x86::IRQ16, 100);
|
||||||
@ -402,7 +402,6 @@ namespace Tasking
|
|||||||
// ((APIC::APIC *)Interrupts::apic[0])->IPI(i, icr);
|
// ((APIC::APIC *)Interrupts::apic[0])->IPI(i, icr);
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
#elif defined(a32)
|
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -388,7 +388,7 @@ namespace Tasking
|
|||||||
POKE(uintptr_t, this->Registers.rsp) = (uintptr_t)ThreadDoExit;
|
POKE(uintptr_t, this->Registers.rsp) = (uintptr_t)ThreadDoExit;
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
this->Registers.cs = GDT_KERNEL_CODE;
|
this->Registers.cs = GDT_KERNEL_CODE;
|
||||||
this->Registers.ss = GDT_KERNEL_DATA;
|
this->Registers.r3_ss = GDT_KERNEL_DATA;
|
||||||
this->Registers.eflags.AlwaysOne = 1;
|
this->Registers.eflags.AlwaysOne = 1;
|
||||||
this->Registers.eflags.IF = 1;
|
this->Registers.eflags.IF = 1;
|
||||||
this->Registers.eflags.ID = 1;
|
this->Registers.eflags.ID = 1;
|
||||||
@ -431,7 +431,7 @@ namespace Tasking
|
|||||||
this->SetupUserStack_x86_64(argv, envp, auxv);
|
this->SetupUserStack_x86_64(argv, envp, auxv);
|
||||||
#elif defined(a32)
|
#elif defined(a32)
|
||||||
this->Registers.cs = GDT_USER_CODE;
|
this->Registers.cs = GDT_USER_CODE;
|
||||||
this->Registers.ss = GDT_USER_DATA;
|
this->Registers.r3_ss = GDT_USER_DATA;
|
||||||
this->Registers.eflags.AlwaysOne = 1;
|
this->Registers.eflags.AlwaysOne = 1;
|
||||||
this->Registers.eflags.IF = 1;
|
this->Registers.eflags.IF = 1;
|
||||||
this->Registers.eflags.ID = 1;
|
this->Registers.eflags.ID = 1;
|
||||||
|
@ -291,14 +291,6 @@ namespace CPU
|
|||||||
|
|
||||||
typedef struct TrapFrame
|
typedef struct TrapFrame
|
||||||
{
|
{
|
||||||
// uint32_t ebp; // Base Pointer (meant for stack frames)
|
|
||||||
// uint32_t edi; // Destination index for string operations
|
|
||||||
// uint32_t esi; // Source index for string operations
|
|
||||||
// uint32_t edx; // Data (commonly extends the A register)
|
|
||||||
// uint32_t ecx; // Counter
|
|
||||||
// uint32_t ebx; // Base
|
|
||||||
// uint32_t eax; // Accumulator
|
|
||||||
|
|
||||||
uint32_t edi; // Destination index for string operations
|
uint32_t edi; // Destination index for string operations
|
||||||
uint32_t esi; // Source index for string operations
|
uint32_t esi; // Source index for string operations
|
||||||
uint32_t ebp; // Base Pointer (meant for stack frames)
|
uint32_t ebp; // Base Pointer (meant for stack frames)
|
||||||
@ -314,8 +306,9 @@ namespace CPU
|
|||||||
uint32_t eip; // Instruction Pointer
|
uint32_t eip; // Instruction Pointer
|
||||||
uint32_t cs; // Code Segment
|
uint32_t cs; // Code Segment
|
||||||
EFLAGS eflags; // Register Flags
|
EFLAGS eflags; // Register Flags
|
||||||
// uint32_t esp; // Stack Pointer
|
|
||||||
uint32_t ss; // Stack Segment
|
uint32_t r3_esp; // Stack Pointer
|
||||||
|
uint32_t r3_ss; // Stack Segment
|
||||||
} TrapFrame;
|
} TrapFrame;
|
||||||
|
|
||||||
typedef union DR6
|
typedef union DR6
|
||||||
|
@ -391,7 +391,7 @@ namespace Tasking
|
|||||||
/**
|
/**
|
||||||
* @note This function is NOT thread safe
|
* @note This function is NOT thread safe
|
||||||
*/
|
*/
|
||||||
void Schedule(void *Frame);
|
void Schedule(CPU::x32::TrapFrame *Frame);
|
||||||
|
|
||||||
void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
|
void OnInterruptReceived(CPU::x32::TrapFrame *Frame);
|
||||||
#elif defined(aa64)
|
#elif defined(aa64)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user