summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal <amlal@el-mahrouss-logic.com>2024-09-09 10:27:19 +0200
committerAmlal <amlal@el-mahrouss-logic.com>2024-09-09 10:27:19 +0200
commit04e3bbd771c8a50822aa9e75c8715349fc4ecda4 (patch)
treefc4509cdf3738a750f93a617dd01029d1ae1d58d /dev
parentef71b80d3df1969a2be85eadf2d83cd85745469d (diff)
META: Bumping repository.
Signed-off-by: Amlal <amlal@el-mahrouss-logic.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootAPI.S2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx10
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx8
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm13
-rw-r--r--dev/ZKA/HALKit/AMD64/HalProcessor.cxx54
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx14
-rw-r--r--dev/ZKA/amd64-efi.make2
7 files changed, 67 insertions, 36 deletions
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootAPI.S b/dev/ZBA/Sources/HEL/AMD64/BootAPI.S
index e391351d..380aeb94 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootAPI.S
+++ b/dev/ZBA/Sources/HEL/AMD64/BootAPI.S
@@ -44,4 +44,4 @@ reset_wait:
write_cr3:
mov cr3, rcx
- ret \ No newline at end of file
+ ret
diff --git a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
index 56a5f3a6..cb302f93 100644
--- a/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalBMPMgr.cxx
@@ -54,10 +54,10 @@ namespace Kernel
kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl;
if (rw)
- mm_map_page(base_ptr, 0, eFlagsRw);
+ mm_map_page(base_ptr, 0, eFlagsRw | eFlagsPresent);
if (user)
- mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser);
+ mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser | eFlagsPresent);
return (VoidPtr)ptr_bit_set;
}
@@ -80,10 +80,10 @@ namespace Kernel
kcout << "Address Of BMP: " << hex_number((UIntPtr)ptr_bit_set) << endl;
if (rw)
- mm_map_page(base_ptr, 0, eFlagsRw);
+ mm_map_page(base_ptr, 0, eFlagsRw | eFlagsPresent);
if (user)
- mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser);
+ mm_map_page(base_ptr, 0, eFlagsRw | eFlagsUser | eFlagsPresent);
return (VoidPtr)ptr_bit_set;
}
@@ -141,6 +141,8 @@ namespace Kernel
ptr_bit_set[0] = cBitMpMagic;
ptr_bit_set[2] = No;
+ mm_map_page(page_ptr, 0, 0);
+
return true;
}
} // namespace HAL
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index e6d5d292..e59eb7cf 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -56,6 +56,9 @@ namespace Kernel::HAL
Kernel::Property cKernelVersion;
Kernel::User cUserSuper{Kernel::RingKind::kRingSuperUser, kSuperUser};
+EXTERN_C ATTRIBUTE(naked) void mp_user_switch_proc(void);
+EXTERN_C Kernel::UInt8* mp_user_switch_proc_end;
+
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept;
EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void);
@@ -112,7 +115,7 @@ EXTERN_C void hal_init_platform(
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
Kernel::HAL::Register64 idtBase;
- idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable;
+ idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable;
CONST Kernel::HAL::IDTLoader cIDT;
cIDT.Load(idtBase);
@@ -126,6 +129,9 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
MUST_PASS(fs);
+ Kernel::HAL::mm_map_page((Kernel::VoidPtr)mp_user_switch_proc, 0, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsRw | Kernel::HAL::eFlagsPresent);
+ Kernel::HAL::mm_map_page((Kernel::VoidPtr)mp_user_switch_proc_end, 0, Kernel::HAL::eFlagsUser | Kernel::HAL::eFlagsRw | Kernel::HAL::eFlagsPresent);
+
Kernel::NewFilesystemMgr::Mount(fs);
const auto cPassword = "ZKA_KERNEL_AUTHORITY";
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index c61db220..945830e2 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -11,13 +11,18 @@
[global mp_do_user_switch]
[global mp_do_context_switch_pre]
+[global mp_user_switch_proc]
+[global mp_user_switch_proc_end]
section .text
-;; Does a user mode switch, and then loads the task to be run.
-;; rcx: code ptr.
-;; rdx: stack ptr.
+;; @brief Switch to user mode.
mp_do_user_switch:
+ mov rbp, rsp
+ mov rsp, mp_user_switch_proc_end
+
+ invlpg [0]
+
mov ax, 0x18 | 3
mov ds, ax
mov es, ax
@@ -36,8 +41,6 @@ mp_do_user_switch:
mov rdx, mp_user_switch_proc
push rdx
- mov rsp, mp_user_switch_proc_end
-
o64 iret
section .bss
diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
index 56b4e190..24c123df 100644
--- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
@@ -10,7 +10,7 @@
#include <HALKit/AMD64/Processor.hxx>
/**
- * @file Processor.cpp
+ * @file HalProcessor.cxx
* @brief This file is about processor specific functions (in/out/cli/std...)
*/
@@ -23,6 +23,11 @@ namespace Kernel::HAL
/// @return Status code of page manip.
EXTERN_C Int32 mm_map_page(VoidPtr virt_addr, VoidPtr phys_addr, UInt32 flags)
{
+ rt_cli();
+
+ const auto cPAddrMask = 0x000ffffffffff000;
+ const auto cFlagsMask = 0xFFF;
+
VoidPtr pml4_base = hal_read_cr3();
UIntPtr pd_idx = ((UIntPtr)virt_addr >> 22);
@@ -31,25 +36,12 @@ namespace Kernel::HAL
// Now get pd_entry
volatile UInt64* pd_entry = (volatile UInt64*)(((UInt64)pml4_base) + (pd_idx * kPTEAlign));
- // Don't bother allocate directory.
- if (!(*pd_entry & 0x01))
- {
- ke_stop(RUNTIME_CHECK_PAGE);
- }
-
- UInt64 pt_base = pd_entry[pd_idx] & ~0xFFF; // Remove flags
-
- // And then PTE
- volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pt_base + (pte_idx * kPTEAlign));
-
- 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;
+ UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags
switch ((UIntPtr)phys_addr)
{
case kBadAddress: {
- phys_addr = (VoidPtr)((pt_entry[0] & ~0xFFF) + ((UIntPtr)virt_addr & 0xFFF));
+ phys_addr = (VoidPtr)((pt_base & cPAddrMask) + ((UIntPtr)virt_addr & cFlagsMask));
break;
}
default: {
@@ -57,16 +49,38 @@ namespace Kernel::HAL
}
}
- if (!(pt_entry[0] & 0x01))
+ // And then PTE
+ volatile UIntPtr* pt_entry = (volatile UIntPtr*)(pt_base + (pte_idx * kPTEAlign));
+
+ if (!(*pt_entry & eFlagsPresent))
{
- pt_entry[0] = ((UIntPtr)phys_addr) | (flags & 0xFFF) | 0x01;
- hal_write_cr3(pml4_base);
+ *pt_entry = ((UIntPtr)phys_addr) | (flags & 0xFFF) | eFlagsPresent;
+ hal_invl_tlb((VoidPtr)virt_addr);
+
+ kcout << "=================================================\r";
+ kcout << "Post page allocation.\r";
+ kcout << "=================================================\r";
+ kcout << (*pt_entry & eFlagsPresent ? "Page Present." : "Page Not Present.") << endl;
+ kcout << (*pt_entry & eFlagsRw ? "Page RW." : "Page Not RW.") << endl;
+ kcout << (*pt_entry & eFlagsUser ? "Page User." : "Page Not User.") << endl;
+
+ rt_sti();
return 0;
}
- pt_entry[0] = ((UIntPtr)phys_addr) | (flags & 0xFFF);
+ *pt_entry = ((UIntPtr)phys_addr) | (flags & 0xFFF) | eFlagsPresent;
+
+ hal_invl_tlb((VoidPtr)virt_addr);
+
+ kcout << "=================================================\r";
+ kcout << "Post page change.\r";
+ kcout << "=================================================\r";
+ kcout << (*pt_entry & eFlagsPresent ? "Page Present." : "Page Not Present.") << endl;
+ kcout << (*pt_entry & eFlagsRw ? "Page RW." : "Page Not RW.") << endl;
+ kcout << (*pt_entry & eFlagsUser ? "Page User." : "Page Not User.") << endl;
+ rt_sti();
return 0;
}
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index 289d6f45..90310aa1 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -55,10 +55,16 @@ namespace Kernel::HAL
/// @brief Virtual memory flags.
enum
{
- eFlagsPresent = 0x01,
- eFlagsRw = 0x02,
- eFlagsUser = 0x04,
- eFlagsCount = 0x3,
+ eFlagsPresent = 1 << 0,
+ eFlagsRw = 1 << 1,
+ eFlagsUser = 1 << 2,
+ eFlagsWt = 1 << 3,
+ eFlagsNoCache = 1 << 4,
+ eFlagsAccess = 1 << 5,
+ eFlagsDirty = 1 << 6,
+ eFlagsHuge = 1 << 7,
+ eFlagsGlobal = 1 << 8,
+ eFlagsCount = 8,
};
/// @brief Set a PTE from pd_base.
diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make
index 00c2664e..ad6d799b 100644
--- a/dev/ZKA/amd64-efi.make
+++ b/dev/ZKA/amd64-efi.make
@@ -34,7 +34,7 @@ COPY = cp
# Add assembler, linker, and object files variables.
ASMFLAGS = -f win64
-# Kernel subsystem is 17 and entrypoint is __ImageStart
+# Kernel subsystem is 17 and entrypoint is hal_init_platform
LDFLAGS = -e hal_init_platform --subsystem=17 --image-base 0x10000000
LDOBJ = Objects/*.obj