summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootJump.S6
-rw-r--r--dev/ZBA/Sources/Thread.cxx5
-rw-r--r--dev/ZBA/amd64-efi.make2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx14
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm11
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx31
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm41
-rw-r--r--dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx6
-rw-r--r--dev/ZKA/HALKit/AMD64/HalProcessor.cxx33
-rw-r--r--dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx14
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx37
-rw-r--r--dev/ZKA/KernelKit/PEFDLLInterface.hxx2
-rw-r--r--dev/ZKA/NewKit/Macros.hxx12
-rw-r--r--dev/ZKA/Sources/CodeManager.cxx2
-rw-r--r--dev/ZKA/Sources/DLLInterface.cxx11
-rw-r--r--dev/ZKA/Sources/DLLMain.cxx2
-rw-r--r--dev/ZKA/Sources/MP.cxx11
-rw-r--r--dev/ZKA/Sources/PEFCodeManager.cxx8
-rw-r--r--dev/ZKA/Sources/UserProcessScheduler.cxx5
-rw-r--r--dev/ZKA/amd64-efi.make2
20 files changed, 152 insertions, 103 deletions
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootJump.S b/dev/ZBA/Sources/HEL/AMD64/BootJump.S
index f9943ecf..d8e09d4e 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootJump.S
+++ b/dev/ZBA/Sources/HEL/AMD64/BootJump.S
@@ -9,15 +9,9 @@
@brief this function setups a stack and then jumps to
a function */
rt_jump_to_address:
- mov rsp, r8
-
- push rax
- push rdx
mov rbx, rcx
mov rcx, rdx
jmp rbx
- pop rdx
- pop rax
ret
diff --git a/dev/ZBA/Sources/Thread.cxx b/dev/ZBA/Sources/Thread.cxx
index c7a62a04..1ea83618 100644
--- a/dev/ZBA/Sources/Thread.cxx
+++ b/dev/ZBA/Sources/Thread.cxx
@@ -22,6 +22,9 @@ EXTERN_C{
#include <string.h>
}
+EXTERN_C Void
+rt_jump_to_address(VoidPtr start, VoidPtr handover);
+
// External boot services symbol.
EXTERN EfiBootServices* BS;
@@ -162,7 +165,7 @@ namespace Boot
err_fn(handover);
}
- reinterpret_cast<HEL::HandoverProc>(fStartAddress)(handover);
+ rt_jump_to_address(fStartAddress, handover);
}
const Char* BThread::GetName()
diff --git a/dev/ZBA/amd64-efi.make b/dev/ZBA/amd64-efi.make
index 62147f7c..d75f2aaf 100644
--- a/dev/ZBA/amd64-efi.make
+++ b/dev/ZBA/amd64-efi.make
@@ -36,7 +36,7 @@ EMU_FLAGS=-net none -m 8G -M q35 -cpu qemu64 \
file=fat:rw:Sources/Root/,index=2,format=raw \
-drive id=disk_2,file=$(IMG_2),if=none \
-device ahci,id=ahci \
- -device ide-hd,drive=disk_2,bus=ahci.0 -d int -no-reboot
+ -device ide-hd,drive=disk_2,bus=ahci.0 -d int
LD_FLAGS=-e Main --subsystem=10
diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
index 0033f614..9a0914f8 100644
--- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -10,9 +10,6 @@ namespace Kernel::HAL
{
namespace Detail
{
- STATIC RegisterGDT kRegGdt;
- STATIC HAL::Register64 kRegIdt;
-
STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64
kInterruptVectorTable[kKernelIdtSize];
@@ -41,10 +38,7 @@ namespace Kernel::HAL
/// @return
Void GDTLoader::Load(RegisterGDT& gdt)
{
- Detail::kRegGdt.Base = gdt.Base;
- Detail::kRegGdt.Limit = gdt.Limit;
-
- hal_load_gdt(Detail::kRegGdt);
+ hal_load_gdt(gdt);
}
Void IDTLoader::Load(Register64& idt)
@@ -81,11 +75,7 @@ namespace Kernel::HAL
Detail::kInterruptVectorTable[idt_indx].Zero = 0x0;
}
- Detail::kRegIdt.Base = reinterpret_cast<UIntPtr>(Detail::kInterruptVectorTable);
- Detail::kRegIdt.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) *
- (kKernelIdtSize - 1);
-
- hal_load_idt(Detail::kRegIdt);
+ hal_load_idt(idt);
Detail::hal_remap_intel_pic_ctrl();
}
diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
index d3decfde..d59cc197 100644
--- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
@@ -140,7 +140,14 @@ IntNormal 37
IntNormal 38
IntNormal 39
IntNormal 40
-IntNormal 41
+
+extern mp_system_call_handler
+
+__ZKA_INT_41:
+ cmp rcx, 0
+ jne mp_system_call_handler
+ iretq
+
IntNormal 42
IntNormal 43
IntNormal 44
@@ -218,7 +225,7 @@ hal_load_gdt:
push 0x08
lea rax, [rel rt_reload_segments]
push rax
- retfq
+ o64 retf
rt_reload_segments:
mov ax, 0x10
mov ds, ax
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index d99431fa..2cdeb7f0 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -64,19 +64,35 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept;
EXTERN_C void hal_user_code_start(void);
EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void);
+/* @brief TSS */
+
+Kernel::HAL::Detail::ZKA_TSS cTSS = {
+ .fReserved1 = 0x0,
+ .fRsp0 = 0x0,
+ .fRsp1 = 0x0,
+ .fRsp2 = 0x0,
+ .fReserved2 = 0x0,
+ .fIst1 = 0x0,
+ .fIst2 = 0x0,
+ .fIst3 = 0x0,
+ .fIst4 = 0x0,
+ .fIst5 = 0x0,
+ .fIst6 = 0x0,
+ .fIst7 = 0x0,
+ .fReserved3 = 0x0,
+ .fReserved4 = 0x0,
+ .fIopb = 0x0,
+};
/* GDT, mostly descriptors for user and kernel segments. */
-STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY cGdt[9] = {
+STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY cGdt[6] = {
{.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // Null entry
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel code
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fFlags = 0xA0, .fBaseHigh = 0}, // Kernel data
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fFlags = 0xA0, .fBaseHigh = 0}, // User code
{.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fFlags = 0xA0, .fBaseHigh = 0}, // User data
// reserve them for later.
- {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data
- {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data
- {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data
- {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0}, // User data
+ {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fFlags = 0x00, .fBaseHigh = 0},
};
EXTERN_C void hal_init_platform(
@@ -117,7 +133,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
Kernel::HAL::RegisterGDT gdtBase;
gdtBase.Base = reinterpret_cast<Kernel::UIntPtr>(cGdt);
- gdtBase.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * 9);
+ gdtBase.Limit = (sizeof(Kernel::HAL::Detail::ZKA_GDT_ENTRY) * 6) - 1;
CONST Kernel::HAL::GDTLoader cGDT;
cGDT.Load(gdtBase);
@@ -126,7 +142,8 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
Kernel::HAL::Register64 idtBase;
idtBase.Base = (Kernel::UIntPtr)kInterruptVectorTable;
- idtBase.Limit = 0;
+ idtBase.Limit = sizeof(::Kernel::Detail::AMD64::InterruptDescriptorAMD64) *
+ (kKernelIdtSize - 1);
CONST Kernel::HAL::IDTLoader cIDT;
cIDT.Load(idtBase);
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index ac68dfad..dc534589 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -21,6 +21,9 @@ section .text
;; rcx: code ptr.
;; rdx: stack ptr.
mp_do_context_switch:
+ mov rsp, rdx
+ mov rbp, rsp
+
mov r9, [r8 + (8 * 2)]
mov r10, [r8 + (8 * 3)]
mov fs, [r8 + (8 * 4)]
@@ -31,11 +34,11 @@ mp_do_context_switch:
mov gs, [r8 + (8 * 9)]
mov r8, [r8]
+ mov rax, rcx
+
mov r11, 0x202
- mov rsp, rdx
- xor rax, rax
- o64 sysret
+ o64 sysret
;; @brief Gets the current stack frame.
mp_get_current_context:
@@ -43,35 +46,41 @@ mp_get_current_context:
ret
extern hal_system_call_enter
+global mp_system_call_handler
mp_system_call_handler:
+ swapgs
+
push r8
push r9
push r10
- call hal_system_call_enter
+ jmp hal_system_call_enter
pop r10
pop r9
pop r8
- sysret
+ swapgs
+ sti
+
+ o64 sysret
mp_do_context_switch_pre:
+ mov rcx, 0xc0000080
+ rdmsr
+ or eax, 1
+ wrmsr
- xor rdx, rdx
- mov rax, 0x202
- mov rcx, 0xc0000084
+ mov rcx, 0xc0000081
+ rdmsr
+ mov rax, 0x00000000
+ mov edx, 0x00180008
wrmsr
- xor rax, rax
- mov rax, mp_system_call_handler
- mov rdx, rax
- shr rdx, 32
+
mov rcx, 0xc0000082
- wrmsr
- xor rax, rax
- mov rdx, 0x230008
- mov rcx, 0xc0000081
+ mov rax, mp_system_call_handler
+ mov rdx, 0x0
wrmsr
ret
diff --git a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx b/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx
index 3d8deac2..28b5f9be 100644
--- a/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalPageAlloc.cxx
@@ -98,11 +98,9 @@ namespace Kernel
kAllocationInProgress = false;
VoidPtr result = reinterpret_cast<VoidPtr>(vmh_header + sizeof(Detail::VIRTUAL_MEMORY_HEADER));
- VoidPtr cr3 = hal_read_cr3();
- mm_update_pte(cr3, 0, result, eFlagsPresent | (rw ? eFlagsRw : 0) | (user ? eFlagsUser : 0));
- mm_update_pte(cr3, 0, result, (rw ? eFlagsRw : 0));
- mm_update_pte(cr3, 0, result, (user ? eFlagsUser : 0));
+ mm_update_pte(result, (rw ? eFlagsRw : 0));
+ mm_update_pte(result, (user ? eFlagsUser : 0));
return result;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
index 94d989e7..169c02f5 100644
--- a/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalProcessor.cxx
@@ -16,25 +16,38 @@
namespace Kernel::HAL
{
- EXTERN_C Int32 mm_update_pte(VoidPtr pd_base, VoidPtr phys_addr, VoidPtr virt_addr, UInt32 flags)
+ EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags)
{
- UIntPtr pte_idx = (UIntPtr)virt_addr >> 12;
+ VoidPtr pml4_base = hal_read_cr3();
- volatile PTE* pte = (volatile PTE*)((UIntPtr)pd_base + (kPTEAlign * pte_idx));
+ 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;
- if (pte)
+ // Access PML4 entry
+ volatile UInt64* pml4_entry = (volatile UInt64*)(pml4_base + pml4_idx * sizeof(UIntPtr));
+ UInt64 pdpt_base = *pml4_entry & ~0xFFF; // Remove flags (assuming 4KB pages)
+
+ // Access PDPT entry
+ volatile UInt64* pdpt_entry = (volatile UInt64*)(pdpt_base + pdpt_idx * sizeof(UIntPtr));
+ UInt64 pd_base = *pdpt_entry & ~0xFFF; // Remove flags
+
+ volatile UInt64* pd_entry = (volatile UInt64*)(pd_base + pd_idx * sizeof(UIntPtr));
+ UInt64 pt_base = *pd_entry & ~0xFFF; // Remove flags
+
+ volatile UInt64* page_addr = (volatile UInt64*)((UIntPtr)pt_base + (pte_idx * sizeof(UIntPtr)));
+
+ if (page_addr)
{
if (flags & eFlagsPresent)
- pte->Present = flags & eFlagsPresent;
+ *page_addr |= 0x01; // present bit
if (flags & eFlagsRw)
- pte->Rw = flags & eFlagsRw;
+ *page_addr |= 0x02;
if (flags & eFlagsUser)
- pte->User = flags & eFlagsUser;
-
- if (flags & eFlagsExecDisable)
- pte->ExecDisable = flags & eFlagsExecDisable;
+ *page_addr |= 0x02;
return Yes;
}
diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
index 7b1f1711..bf98d01d 100644
--- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
@@ -14,14 +14,24 @@ Void UserProcess::SetImageStart(VoidPtr imageStart) noexcept
if (imageStart == nullptr)
this->Crash();
- HAL::mm_update_pte(hal_read_cr3(), 0, imageStart, HAL::eFlagsPresent | HAL::eFlagsUser);
+ HAL::mm_update_pte(imageStart, HAL::eFlagsPresent | HAL::eFlagsUser);
this->Image = imageStart;
}
namespace Kernel
{
- bool hal_check_stack(HAL::StackFramePtr stack_ptr)
+ /***********************************************************************************/
+ /// @brief Unimplemented function (crashes by default)
+ /// @param
+ /***********************************************************************************/
+
+ EXTERN_C Void __zka_pure_call(void)
+ {
+ asm volatile ("mov %r8, 0; mov %r9, 1; syscall");
+ }
+
+ Bool hal_check_stack(HAL::StackFramePtr stack_ptr)
{
if (!stack_ptr)
return false;
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index 911af46e..0f24a2be 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -24,16 +24,16 @@ EXTERN_C
#include <cpuid.h>
}
-#define kSyscallRoute (51)
+#define kSyscallRoute (0x29)
#define IsActiveLow(FLG) (FLG & 2)
#define IsLevelTriggered(FLG) (FLG & 8)
-#define kInterruptGate (0x8E)
-#define kTrapGate (0xEF)
-#define kTaskGate (0b10001100)
-#define kGdtKernelCodeSelector (0x08)
-#define kGdtUserCodeSelector (0x23)
+#define kInterruptGate (0x8E)
+#define kTrapGate (0xEF)
+#define kTaskGate (0b10001100)
+#define kGdtKernelCodeSelector (0x08)
+#define kGdtUserCodeSelector (0x23)
namespace Kernel
{
@@ -62,16 +62,13 @@ namespace Kernel::HAL
eFlagsUser,
eFlagsRw,
eFlagsExecDisable,
- eFlagsSetPhysAddress,
eFlagsCount,
};
/// @brief Updates a PTE from pd_base.
- /// @param pd_base a valid PDE address.
- /// @param phys_addr a valid phyiscal address.
/// @param virt_addr a valid virtual address.
/// @param flags the flags to put on the page.
- EXTERN_C Int32 mm_update_pte(VoidPtr pd_base, VoidPtr phys_addr, VoidPtr virt_addr, UInt32 flags);
+ EXTERN_C Int32 mm_update_pte(VoidPtr virt_addr, UInt32 flags);
EXTERN_C UChar In8(UInt16 port);
EXTERN_C UShort In16(UInt16 port);
@@ -230,6 +227,26 @@ namespace Kernel::HAL
/// @brief Processor specific namespace.
namespace Detail
{
+ /* @brief TSS struct. */
+ struct ZKA_TSS final
+ {
+ UInt32 fReserved1;
+ UInt64 fRsp0;
+ UInt64 fRsp1;
+ UInt64 fRsp2;
+ UInt64 fReserved2;
+ UInt64 fIst1;
+ UInt64 fIst2;
+ UInt64 fIst3;
+ UInt64 fIst4;
+ UInt64 fIst5;
+ UInt64 fIst6;
+ UInt64 fIst7;
+ UInt64 fReserved3;
+ UInt16 fReserved4;
+ UInt16 fIopb;
+ };
+
/**
@brief Global descriptor table entry, either null, code or data.
*/
diff --git a/dev/ZKA/KernelKit/PEFDLLInterface.hxx b/dev/ZKA/KernelKit/PEFDLLInterface.hxx
index cfedd07c..ef1a844f 100644
--- a/dev/ZKA/KernelKit/PEFDLLInterface.hxx
+++ b/dev/ZKA/KernelKit/PEFDLLInterface.hxx
@@ -84,7 +84,7 @@ namespace Kernel
if (!ret)
{
if (kind == kPefCode)
- return (VoidPtr)__zka_pure_call;
+ return (VoidPtr)&__zka_pure_call;
return nullptr;
}
diff --git a/dev/ZKA/NewKit/Macros.hxx b/dev/ZKA/NewKit/Macros.hxx
index 4b1f4268..153b8c45 100644
--- a/dev/ZKA/NewKit/Macros.hxx
+++ b/dev/ZKA/NewKit/Macros.hxx
@@ -15,27 +15,27 @@
#endif
#ifndef MIB
-#define MIB(X) ((UInt64)KIB(X) / 1024)
+#define MIB(X) ((Kernel::UInt64)KIB(X) / 1024)
#endif
#ifndef mib_cast
-#define mib_cast(X) ((UInt64)kib_cast(X) * 1024)
+#define mib_cast(X) ((Kernel::UInt64)kib_cast(X) * 1024)
#endif
#ifndef GIB
-#define GIB(X) ((UInt64)MIB(X) / 1024)
+#define GIB(X) ((Kernel::UInt64)MIB(X) / 1024)
#endif
#ifndef gib_cast
-#define gib_cast(X) ((UInt64)mib_cast(X) * 1024)
+#define gib_cast(X) ((Kernel::UInt64)mib_cast(X) * 1024)
#endif
#ifndef TIB
-#define TIB(X) ((UInt64)GIB(X) / 1024)
+#define TIB(X) ((Kernel::UInt64)GIB(X) / 1024)
#endif
#ifndef tib_cast
-#define tib_cast(X) ((UInt64)gib_cast(X) * 1024)
+#define tib_cast(X) ((Kernel::UInt64)gib_cast(X) * 1024)
#endif
#ifndef ARRAY_SIZE
diff --git a/dev/ZKA/Sources/CodeManager.cxx b/dev/ZKA/Sources/CodeManager.cxx
index f01bf41c..7e180ac0 100644
--- a/dev/ZKA/Sources/CodeManager.cxx
+++ b/dev/ZKA/Sources/CodeManager.cxx
@@ -23,7 +23,7 @@ namespace Kernel
proc.SetImageStart(reinterpret_cast<VoidPtr>(main));
proc.Kind = UserProcess::kExeKind;
- proc.StackSize = mib_cast(1);
+ proc.StackSize = kib_cast(8);
rt_copy_memory((VoidPtr)processName, proc.Name, rt_string_len(processName));
diff --git a/dev/ZKA/Sources/DLLInterface.cxx b/dev/ZKA/Sources/DLLInterface.cxx
index 0ff6e91b..c18f2f00 100644
--- a/dev/ZKA/Sources/DLLInterface.cxx
+++ b/dev/ZKA/Sources/DLLInterface.cxx
@@ -13,14 +13,3 @@
#include <KernelKit/UserProcessScheduler.hxx>
using namespace Kernel;
-
-/***********************************************************************************/
-/// @brief Unimplemented function (crashes by default)
-/// @param
-/***********************************************************************************/
-
-EXTERN_C void __zka_pure_call(void)
-{
- kcout << "newoskrnl.exe: Unimplemented entrypoint symbol!\r";
- UserProcessScheduler::The().CurrentProcess().Leak().Crash();
-}
diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx
index 8faa7a08..934f418c 100644
--- a/dev/ZKA/Sources/DLLMain.cxx
+++ b/dev/ZKA/Sources/DLLMain.cxx
@@ -155,7 +155,7 @@ namespace Kernel
EXTERN UserProcessScheduler* cProcessScheduler;
} // namespace Kernel
-Kernel::Void HangCPU(Kernel::Void)
+EXTERN_C Kernel::Void HangCPU(Kernel::Void)
{
while (1);
}
diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx
index 23916a2f..fcf555cb 100644
--- a/dev/ZKA/Sources/MP.cxx
+++ b/dev/ZKA/Sources/MP.cxx
@@ -15,6 +15,10 @@
///! @brief This file handles multi processing in the Kernel.
///! @brief Multi processing is needed for multi-tasking operations.
+#ifdef __ZKA_AMD64__
+EXTERN Kernel::HAL::Detail::ZKA_TSS cTSS;
+#endif // ifdef __ZKA_AMD64__
+
namespace Kernel
{
/***********************************************************************************/
@@ -100,13 +104,18 @@ namespace Kernel
if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
{
+#ifdef __ZKA_AMD64__
+ cTSS.fRsp0 = (UIntPtr)stack_ptr;
+#endif // ifdef __ZKA_AMD64__
return mp_register_process(fStack);
}
//! SMP is disabled here.
mp_do_context_switch_pre();
- return mp_do_context_switch(image, stack_ptr, fStack) != 0;
+ mp_do_context_switch(image, stack_ptr, fStack);
+
+ return true;
}
///! @brief Tells if processor is waked up.
diff --git a/dev/ZKA/Sources/PEFCodeManager.cxx b/dev/ZKA/Sources/PEFCodeManager.cxx
index 911281f6..a797fd50 100644
--- a/dev/ZKA/Sources/PEFCodeManager.cxx
+++ b/dev/ZKA/Sources/PEFCodeManager.cxx
@@ -166,14 +166,6 @@ namespace Kernel
rt_copy_memory((VoidPtr)((Char*)blob + sizeof(PEFCommandHeader)), blobRet, container_header->Size);
-#ifdef __ZKA_AMD64__
- HAL::mm_update_pte(hal_read_cr3(), 0, blobRet, HAL::eFlagsPresent);
- HAL::mm_update_pte(hal_read_cr3(), 0, blobRet, HAL::eFlagsUser);
- HAL::mm_update_pte(hal_read_cr3(), 0, blobRet, (container_header->Kind != kPefCode ? HAL::eFlagsRw : 0));
-#else
-#warning ! No page bits set fo blob !
-#endif
-
mm_delete_ke_heap(blob);
return blobRet;
}
diff --git a/dev/ZKA/Sources/UserProcessScheduler.cxx b/dev/ZKA/Sources/UserProcessScheduler.cxx
index 1d49ff5c..dc142b18 100644
--- a/dev/ZKA/Sources/UserProcessScheduler.cxx
+++ b/dev/ZKA/Sources/UserProcessScheduler.cxx
@@ -260,7 +260,7 @@ namespace Kernel
if (!process.StackReserve)
{
process.StackReserve = (UInt8*)mm_new_ke_heap(kSchedMaxStackSz, Yes, Yes);
- kcout << "newoskrnl.exe: Use fallback reserve.\r";
+ kcout << "newoskrnl.exe: Use fallback reserve size.\r";
}
}
else
@@ -341,10 +341,11 @@ namespace Kernel
kcout << process.Name << ": will be runned.\r";
// tell helper to find a core to schedule on.
- if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize - 1], process.StackFrame,
+ if (!UserProcessHelper::Switch(process.Image, &process.StackReserve[process.StackSize], process.StackFrame,
process.ProcessId))
{
process.Crash();
+ continue;
}
process.Exit();
diff --git a/dev/ZKA/amd64-efi.make b/dev/ZKA/amd64-efi.make
index 730c4b10..02224e93 100644
--- a/dev/ZKA/amd64-efi.make
+++ b/dev/ZKA/amd64-efi.make
@@ -5,7 +5,7 @@
CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -c -shared -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
+CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
-std=c++20 -D__ZKA_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ \
-D__NEWOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../ZBA