summaryrefslogtreecommitdiffhomepage
path: root/dev/ZKA/HALKit
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-07 09:18:35 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-07 09:18:35 +0200
commit1003d7a20bab6885b4edde7d11103a199de30d21 (patch)
treea1992f26fd9afeb802bbb1829dec8ebe02ce5cd9 /dev/ZKA/HALKit
parent4019b870041d1ac50a48ba9e7a981df1afde96e6 (diff)
Daily bump.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev/ZKA/HALKit')
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx14
-rw-r--r--dev/ZKA/HALKit/AMD64/HalControlRegister.s5
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx21
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm46
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm61
-rw-r--r--dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx5
-rw-r--r--dev/ZKA/HALKit/AMD64/HalProcessor.cxx51
-rw-r--r--dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx3
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx6
9 files changed, 111 insertions, 101 deletions
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
index ab160648..c5f39eaa 100644
--- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
@@ -46,17 +46,18 @@ namespace Kernel
kcout << "BMPMgr: Allocated pointer!\r";
kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl;
kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl;
kcout << "Size of pointer (MIB): " << number(MIB(ptr_bit_set[1])) << endl;
kcout << "Size of pointer (GIB): " << number(GIB(ptr_bit_set[1])) << endl;
kcout << "Size of pointer (TIB): " << number(TIB(ptr_bit_set[1])) << endl;
- kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl;
+ kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl;
if (rw)
- mm_update_pte(base_ptr, eFlagsRw);
+ mm_map_page(base_ptr, 0, eFlagsRw);
if (user)
- mm_update_pte(base_ptr, eFlagsUser);
+ mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser);
return (VoidPtr)ptr_bit_set;
}
@@ -71,17 +72,18 @@ namespace Kernel
kcout << "BMPMgr: Allocated pointer!\r";
kcout << "Magic Number: " << hex_number(ptr_bit_set[0]) << endl;
+ kcout << "Size of pointer (B): " << number(ptr_bit_set[1]) << endl;
kcout << "Size of pointer (KIB): " << number(KIB(ptr_bit_set[1])) << endl;
kcout << "Size of pointer (MIB): " << number(MIB(ptr_bit_set[1])) << endl;
kcout << "Size of pointer (GIB): " << number(GIB(ptr_bit_set[1])) << endl;
kcout << "Size of pointer (TIB): " << number(TIB(ptr_bit_set[1])) << endl;
- kcout << "Address Of Header: " << hex_number((UIntPtr)ptr_bit_set) << endl;
+ kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl;
if (rw)
- mm_update_pte(base_ptr, eFlagsRw);
+ mm_map_page(base_ptr, 0, eFlagsRw);
if (user)
- mm_update_pte(base_ptr, eFlagsUser);
+ mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser);
return (VoidPtr)ptr_bit_set;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalControlRegister.s b/dev/ZKA/HALKit/AMD64/HalControlRegister.s
index 76053921..6fde8878 100644
--- a/dev/ZKA/HALKit/AMD64/HalControlRegister.s
+++ b/dev/ZKA/HALKit/AMD64/HalControlRegister.s
@@ -10,9 +10,14 @@
.globl hal_read_cr3
.globl hal_read_cr0
.globl hal_flush_tlb
+.globl hal_invl_tlb
.text
+hal_invl_tlb:
+ invlpg (%rcx)
+ ret
+
hal_flush_tlb:
call hal_read_cr3
mov %rax, %rcx
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx
index 5f6c0552..a5bf07ec 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreMPScheduler.cxx
@@ -134,31 +134,36 @@ namespace Kernel::HAL
Kernel::ke_dma_write(targetAddress, kAPIC_ICR_Low, kAPIC_EIPI_Vector | vector);
}
- EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame);
+ EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame);
/// @brief Called when the AP is ready.
/// @internal
- EXTERN_C Void hal_on_ap_startup(HAL::StackFramePtr stack_frame)
+ EXTERN_C Void hal_on_ap_startup(Void)
{
- mp_register_process(stack_frame);
- ke_stop(RUNTIME_CHECK_FAILED);
+ while (Yes)
+ {
+ }
}
struct PROCESS_CONTROL_BLOCK final
{
- UserProcessPtr f_Process;
+ HAL::StackFramePtr f_Frame;
+ UInt8* f_Stack;
+ VoidPtr f_Image;
} fBlocks[kSchedProcessLimitPerTeam] = {0};
EXTERN_C HAL::StackFramePtr _hal_leak_current_context(Void)
{
- return fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Process->StackFrame;
+ return fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame;
}
- EXTERN_C Bool mp_register_process(HAL::StackFramePtr stack_frame)
+ EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr stack_frame)
{
if (kSMPAware)
{
- fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Process = &UserProcessScheduler::The().CurrentProcess().Leak();
+ fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Frame = stack_frame;
+ fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Stack = stack_ptr;
+ fBlocks[UserProcessScheduler::The().CurrentProcess().Leak().ProcessId % kSchedProcessLimitPerTeam].f_Image = image;
return Yes;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
index 28f86b34..56853441 100644
--- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
@@ -237,12 +237,58 @@ extern hal_real_init
hal_reload_segments:
sti
+ ;; Write address of syscall handler.
+
+ mov rdx, [mp_system_call_handler]
+ shr rdx, 32
+ mov rcx, 0xC0000082
+ wrmsr
+
+ ;; Set segments of syscall handler.
+
+ xor rax, rax
+ mov rdx, 0x230008
+ mov rcx, 0xC0000081
+ wrmsr
+
+ mov ecx, 0xC0000080
+ rdmsr
+ or eax, 1
+ wrmsr
+
jmp hal_real_init
ret
global hal_load_idt
global hal_user_code_start
+extern hal_system_call_enter
+global mp_system_call_handler
+
+mp_system_call_handler:
+
+ push r8
+ push r9
+ push r10
+ push r11
+ push r12
+ push r13
+ push r14
+ push r15
+
+ jmp hal_system_call_enter
+
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop r11
+ pop r10
+ pop r9
+ pop r8
+
+ o64 sysret
+
hal_load_idt:
cli
lidt [rcx]
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index 2a6be79a..4403263a 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -21,66 +21,21 @@ section .text
;; rcx: code ptr.
;; rdx: stack ptr.
mp_do_context_switch:
- call mp_pre_switch
-
- mov ax, 0x18
+ mov ax, 0x18 | 3
mov ds, ax
mov es, ax
- mov fs, ax
mov gs, ax
+ mov fs, ax
- mov rsp, rdx
+ push 0x18 | 3
+ push rdx
+ push 0x200
+ push 0x20 | 3
+ push rcx
- mov r11, 0x202
- o64 sysret
+ o64 iret
;; @brief Gets the current stack frame.
mp_get_current_context:
call _hal_leak_current_context
ret
-
-extern hal_system_call_enter
-global mp_system_call_handler
-
-mp_pre_switch:
- mov rcx, 0xc0000082
- wrmsr
- mov rcx, 0xc0000080
- rdmsr
- or eax, 1
- wrmsr
- mov rcx, 0xc0000081
- rdmsr
- mov edx, 0x00180008
- wrmsr
-
- mov rdx, [mp_system_call_handler]
- shr rdx, 32
- mov rcx, 0xc0000082
- wrmsr
-
- ret
-
-mp_system_call_handler:
-
- push r8
- push r9
- push r10
- push r11
- push r12
- push r13
- push r14
- push r15
-
- jmp hal_system_call_enter
-
- pop r15
- pop r14
- pop r13
- pop r12
- pop r11
- pop r10
- pop r9
- pop r8
-
- o64 sysret
diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
index 8eb85e78..b0d444d9 100644
--- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
+++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.hxx
@@ -31,7 +31,8 @@
#endif // !kAlign
EXTERN_C void hal_flush_tlb();
-EXTERN_C void hal_write_cr3(Kernel::UIntPtr phys_addr);
+EXTERN_C void hal_invl_tlb(Kernel::UIntPtr addr);
+EXTERN_C void hal_write_cr3(Kernel::UIntPtr pml4);
EXTERN_C void hal_write_cr0(Kernel::UIntPtr bit);
EXTERN_C Kernel::VoidPtr hal_read_cr0(); // @brief CPU control register.
@@ -82,7 +83,7 @@ namespace Kernel::HAL
}
} // namespace Detail
- struct ZKA_PDE final
+ struct ALIGN(0x08) ZKA_PDE final
{
ZKA_PTE ALIGN(kPTEAlign) Pte[kPTEMax];
};
diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
index 3c34ab68..dd9afd47 100644
--- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
@@ -16,46 +16,41 @@
namespace Kernel::HAL
{
- EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags)
+ /// @brief Set a PTE from pd_base.
+ /// @param virt_addr a valid virtual address.
+ /// @param phys_addr point to physical address.
+ /// @param flags the flags to put on the page.
+ /// @return Status code of page manip.
+ EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, VoidPtr phys_addr, UInt32 flags)
{
VoidPtr pml4_base = hal_read_cr3();
- UIntPtr pml4_idx = ((UIntPtr)virt_addr >> 39) & 0x1FFF;
- UIntPtr pdpt_idx = ((UIntPtr)virt_addr >> 30) & 0x1FFF;
- UIntPtr pd_idx = ((UIntPtr)virt_addr >> 21) & 0x1FFF;
- UIntPtr pte_idx = ((UIntPtr)virt_addr >> 12) & 0x1FFF;
+ UIntPtr pd_idx = ((UIntPtr)virt_addr >> 22);
+ UIntPtr pte_idx = ((UIntPtr)virt_addr >> 12) & 0x3FFF;
+ // Now PD
+ volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pml4_base) + pd_idx * sizeof(UIntPtr));
- // Access PML4 entry
- volatile UInt64* pml4_entry = (volatile UInt64*)(((UInt64)pml4_base) + pml4_idx * sizeof(UIntPtr));
- UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages)
+ kcout << (*pd_entry & 0x01 ? "PageDir present." : "PageDir not present") << endl;
- // Access PDPT entry
- volatile UInt64* pdpt_entry = (volatile UInt64*)(((UInt64)pdpt_base) + pdpt_idx * sizeof(UIntPtr));
- UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags
+ if ((*pd_entry & 0x01) == 0)
+ {
+ *pd_entry |= 0x01;
+ }
- // Now PD
- volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pd_base) + pd_idx * sizeof(UIntPtr));
UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags
// And then PTE
- volatile UInt64* page_addr = (volatile UInt64*)(((UInt64)pt_base) + (pte_idx * sizeof(UIntPtr)));
-
- if (flags & eFlagsPresent)
- *page_addr |= 0x01; // present bit
- else if (flags & ~eFlagsPresent)
- *page_addr &= 0x01; // present bit
+ volatile UIntPtr* page_addr = (volatile UIntPtr*)(((UInt64)pt_base) + (pte_idx * sizeof(UIntPtr)));
- if (flags & eFlagsRw)
- *page_addr |= 0x02;
- else if (flags & ~eFlagsRw)
- *page_addr &= 0x02; // present bit
+ kcout << (*page_addr & 0x01 ? "Page present." : "Page not present") << endl;
+ kcout << (*page_addr & 0x04 ? "User bit present." : "User bit not present") << endl;
- if (flags & eFlagsUser)
- *page_addr |= 0x04;
- else if (flags & ~eFlagsUser)
- *page_addr &= 0x04; // present bit
+ if (phys_addr == nullptr)
+ {
+ phys_addr = (VoidPtr)((*page_addr & ~0xFFF) + ((UIntPtr)virt_addr & 0xFFF));
+ }
- hal_write_cr3((UIntPtr)pml4_base);
+ (*page_addr) = ((UIntPtr)phys_addr) | (flags & 0xFFF) | 0x01;
return 0;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
index cef5d368..89982cbc 100644
--- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
@@ -14,8 +14,7 @@ Void UserProcess::SetImageStart(VoidPtr imageStart) noexcept
if (imageStart == nullptr)
this->Crash();
- HAL::mm_update_pte(imageStart, HAL::eFlagsPresent);
- HAL::mm_update_pte(imageStart, HAL::eFlagsUser);
+ HAL::mm_map_page(imageStart, 0, HAL::eFlagsUser);
this->Image = imageStart;
}
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index fd3e7b0a..289d6f45 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -61,10 +61,12 @@ namespace Kernel::HAL
eFlagsCount = 0x3,
};
- /// @brief Updates a PTE from pd_base.
+ /// @brief Set a PTE from pd_base.
/// @param virt_addr a valid virtual address.
+ /// @param phys_addr point to physical address.
/// @param flags the flags to put on the page.
- EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags);
+ /// @return Status code of page manip.
+ EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, VoidPtr phys_addr, UInt32 flags);
EXTERN_C UChar In8(UInt16 port);
EXTERN_C UShort In16(UInt16 port);