diff options
| author | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-08 12:20:59 +0200 |
|---|---|---|
| committer | Amlal <amlal@el-mahrouss-logic.com> | 2024-09-08 12:20:59 +0200 |
| commit | 591335ea0cf843c198ef8f75c3adbbf6a733e14f (patch) | |
| tree | 0748536407359c53a2d5c46a3e0d6006f56fdb73 /dev/ZKA/HALKit | |
| parent | 49df5ae7f4475695e04567771dffe50292e695de (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/ZKA/HALKit')
| -rw-r--r-- | dev/ZKA/HALKit/AMD64/HalProcessor.cxx | 18 |
1 files changed, 13 insertions, 5 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; } |
