summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-08 12:20:59 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-08 12:20:59 +0200
commit591335ea0cf843c198ef8f75c3adbbf6a733e14f (patch)
tree0748536407359c53a2d5c46a3e0d6006f56fdb73 /dev
parent49df5ae7f4475695e04567771dffe50292e695de (diff)
[ IMP ] Don't use the functions when jumping to user space via scheduler, since they're not on the same page.
[ ADD ] Add ZXD diagram (ZKA eXtended Driver) Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/ZKA/HALKit/AMD64/HalProcessor.cxx18
-rw-r--r--dev/ZKA/Sources/ExeMain.cxx20
2 files changed, 17 insertions, 21 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
index b31f58e2..56b4e190 100644
--- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
@@ -42,14 +42,14 @@ namespace Kernel::HAL
// And then PTE
volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pt_base + (pte_idx * kPTEAlign));
- kcout << (pt_entry[pte_idx] & 0x01 ? "Page Present." : "Page Not Present.") << endl;
- kcout << (pt_entry[pte_idx] & 0x02 ? "Page RW." : "Page Not RW.") << endl;
- kcout << (pt_entry[pte_idx] & 0x04 ? "Page User." : "Page Not User.") << endl;
+ kcout << (pt_entry[0] & 0x01 ? "Page Present." : "Page Not Present.") << endl;
+ kcout << (pt_entry[0] & 0x02 ? "Page RW." : "Page Not RW.") << endl;
+ kcout << (pt_entry[0] & 0x04 ? "Page User." : "Page Not User.") << endl;
switch ((UIntPtr)phys_addr)
{
case kBadAddress: {
- phys_addr = (VoidPtr)((pt_entry[pte_idx] & ~0xFFF) + ((UIntPtr)virt_addr & 0xFFF));
+ phys_addr = (VoidPtr)((pt_entry[0] & ~0xFFF) + ((UIntPtr)virt_addr & 0xFFF));
break;
}
default: {
@@ -57,7 +57,15 @@ namespace Kernel::HAL
}
}
- pt_entry[pte_idx] = ((UIntPtr)phys_addr) | (flags & 0xFFF) | 0x01;
+ if (!(pt_entry[0] & 0x01))
+ {
+ pt_entry[0] = ((UIntPtr)phys_addr) | (flags & 0xFFF) | 0x01;
+ hal_write_cr3(pml4_base);
+
+ return 0;
+ }
+
+ pt_entry[0] = ((UIntPtr)phys_addr) | (flags & 0xFFF);
return 0;
}
diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx
index e1b6afc1..ff2bad02 100644
--- a/dev/ZKA/Sources/ExeMain.cxx
+++ b/dev/ZKA/Sources/ExeMain.cxx
@@ -110,17 +110,6 @@ namespace Kernel::Detail
};
} // namespace Kernel::Detail
-EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void)
-{
- asm volatile(
- ".intel_syntax;"
- "start:"
- "syscall;"
- "jmp start;"
- ".att_syntax;"
- );
-}
-
namespace Kernel
{
EXTERN UserProcessScheduler* cProcessScheduler;
@@ -157,9 +146,8 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
CG::CGDrawStringToWnd(cKernelWnd, "Running: ", 10, 10, RGB(0, 0, 0));
CG::CGDrawStringToWnd(cKernelWnd, kSysLdr, 10, 10 + (FONT_SIZE_X * Kernel::rt_string_len("Running: ")), RGB(0, 0, 0));
- Kernel::UserProcessHelper::StartScheduling();
-
- Kernel::sched_execute_thread(HangCPU, kSysLdr);
-
- Kernel::UserProcessHelper::StartScheduling();
+ while (Yes)
+ {
+ Kernel::UserProcessHelper::StartScheduling();
+ }
}