summaryrefslogtreecommitdiffhomepage
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
parent4019b870041d1ac50a48ba9e7a981df1afde96e6 (diff)
Daily bump.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
-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
-rw-r--r--dev/ZKA/Sources/CodeMgr.cxx1
-rw-r--r--dev/ZKA/Sources/ExeMain.cxx12
-rw-r--r--dev/ZKA/Sources/HardwareThreadScheduler.cxx6
-rw-r--r--dev/ZKA/Sources/PEFCodeMgr.cxx15
-rw-r--r--tools/drvsign.cxx8
14 files changed, 138 insertions, 116 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);
diff --git a/dev/ZKA/Sources/CodeMgr.cxx b/dev/ZKA/Sources/CodeMgr.cxx
index ae4cb00b..8e560408 100644
--- a/dev/ZKA/Sources/CodeMgr.cxx
+++ b/dev/ZKA/Sources/CodeMgr.cxx
@@ -25,6 +25,7 @@ namespace Kernel
proc.Kind = UserProcess::kExeKind;
proc.StackSize = mib_cast(4);
+ rt_set_memory(proc.Name, 0, kProcessLen);
rt_copy_memory((VoidPtr)process_name, proc.Name, rt_string_len(process_name));
return UserProcessScheduler::The().Add(proc) > 0;
diff --git a/dev/ZKA/Sources/ExeMain.cxx b/dev/ZKA/Sources/ExeMain.cxx
index 036c5725..4497d5b3 100644
--- a/dev/ZKA/Sources/ExeMain.cxx
+++ b/dev/ZKA/Sources/ExeMain.cxx
@@ -112,11 +112,13 @@ namespace Kernel::Detail
EXTERN_C ATTRIBUTE(naked) Kernel::Void HangCPU(Kernel::Void)
{
- while (Yes)
- {
- Kernel::Char* p = nullptr;
- *p = 4;
- }
+ asm volatile(
+ ".intel_syntax;"
+ "start:"
+ "syscall;"
+ "jmp start;"
+ ".att_syntax;"
+ );
}
namespace Kernel
diff --git a/dev/ZKA/Sources/HardwareThreadScheduler.cxx b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
index cbe0cc46..5b310fca 100644
--- a/dev/ZKA/Sources/HardwareThreadScheduler.cxx
+++ b/dev/ZKA/Sources/HardwareThreadScheduler.cxx
@@ -79,7 +79,7 @@ namespace Kernel
/// @note Those symbols are needed in order to switch and validate the stack.
EXTERN Bool hal_check_stack(HAL::StackFramePtr stackPtr);
- EXTERN_C Bool mp_register_process(HAL::StackFramePtr stackPtr);
+ EXTERN_C Bool mp_register_process(VoidPtr image, UInt8* stack_ptr, HAL::StackFramePtr frame_ptr);
/// @brief Switch to hardware thread.
/// @param stack the new hardware thread.
@@ -99,8 +99,10 @@ namespace Kernel
if (this->IsBusy())
return false;
+ kcout << "Switching to the Process's HW thread...\r";
+
this->Busy(true);
- Bool ret = mp_register_process(fStack);
+ Bool ret = mp_register_process(image, stack_ptr, fStack);
this->Busy(false);
return ret;
diff --git a/dev/ZKA/Sources/PEFCodeMgr.cxx b/dev/ZKA/Sources/PEFCodeMgr.cxx
index 23dfae31..b6f7e3da 100644
--- a/dev/ZKA/Sources/PEFCodeMgr.cxx
+++ b/dev/ZKA/Sources/PEFCodeMgr.cxx
@@ -15,6 +15,7 @@
/// @brief PEF stack size symbol.
#define cPefStackSizeSymbol "SizeOfReserveStack"
+#define cPefNameSymbol "ProgramName"
namespace Kernel
{
@@ -164,11 +165,10 @@ namespace Kernel
Char* blobRet = new Char[container_header->Size];
- HAL::mm_update_pte(blobRet, HAL::eFlagsPresent);
- HAL::mm_update_pte(blobRet, HAL::eFlagsUser);
-
if (container_header->Kind != kPefCode)
- HAL::mm_update_pte(blobRet, HAL::eFlagsRw);
+ HAL::mm_map_page(blobRet, 0, HAL::eFlagsRw | HAL::eFlagsUser);
+ else
+ HAL::mm_map_page(blobRet, 0, HAL::eFlagsUser);
rt_copy_memory((VoidPtr)((Char*)blob + sizeof(PEFCommandHeader)), blobRet, container_header->Size);
@@ -214,6 +214,13 @@ namespace Kernel
proc.Kind = procKind;
proc.StackSize = *(UIntPtr*)exec.FindSymbol(cPefStackSizeSymbol, kPefData);
+ rt_set_memory(proc.Name, 0, kProcessLen);
+
+ if (exec.FindSymbol(cPefNameSymbol, kPefData))
+ rt_copy_memory((VoidPtr)exec.FindSymbol(cPefNameSymbol, kPefData), proc.Name, rt_string_len((Char*)exec.FindSymbol(cPefNameSymbol, kPefData)));
+ else
+ rt_copy_memory((VoidPtr) "UNNAMED PROCESS.", proc.Name, rt_string_len("UNNAMED PROCESS."));
+
if (!proc.StackSize)
{
const auto cDefaultStackSizeMib = 8;
diff --git a/tools/drvsign.cxx b/tools/drvsign.cxx
index ad3eee67..18678448 100644
--- a/tools/drvsign.cxx
+++ b/tools/drvsign.cxx
@@ -11,14 +11,15 @@
#include <sstream>
#include <filesystem>
-#define kDriverSignedExt ".sigg"
+#define kDriverSignedExt ".vxd"
#define kDriverExt ".sys"
-#define kSignedDriverMagic "SIGG"
+#define kSignedDriverMagic " VXD"
namespace details
{
struct SIGNED_DRIVER_HEADER final
{
+ char d_binary_padding[512];
// doesn't change.
char d_binary_magic[5];
int d_binary_version;
@@ -26,7 +27,6 @@ namespace details
char d_binary_name[4096];
std::uint64_t d_binary_checksum;
std::uint64_t d_binary_size;
- char d_binary_padding[512];
};
/***********************************************************************************/
@@ -97,8 +97,8 @@ int main(int argc, char* argv[])
sig.d_binary_checksum ^= sig.d_binary_size;
- of_drv.write((char*)&sig, sizeof(details::SIGNED_DRIVER_HEADER));
of_drv.write(ss.str().c_str(), ss.str().size());
+ of_drv.write((char*)&sig, sizeof(details::SIGNED_DRIVER_HEADER));
std::cout << "drvsign: Signing is done, quiting, here is the key: " << sig.d_binary_checksum << ".\n";