summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-09-02 17:30:15 +0200
committerAmlal El Mahrouss <amlal.elmahrouss@icloud.com>2024-09-02 17:30:15 +0200
commite47e393fc01c663ca634068c56a41eb74ed01439 (patch)
tree3f2e313834295db3d18b93bbe539126097496183 /dev
parentb3888ff9e2c18da6b73a57f453f7ad36fea61b7b (diff)
[ FIX ] A fix has been found for the SYSRET issue. Will apply it later.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev')
-rw-r--r--dev/ZBA/Sources/HEL/AMD64/BootMain.cxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalControlRegister.s10
-rw-r--r--dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx19
-rw-r--r--dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm29
-rw-r--r--dev/ZKA/HALKit/AMD64/HalKernelMain.cxx127
-rw-r--r--dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm34
-rw-r--r--dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx2
-rw-r--r--dev/ZKA/HALKit/AMD64/Processor.hxx16
-rw-r--r--dev/ZKA/HALKit/ARM64/HalKernelMain.cxx102
-rw-r--r--dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx2
-rw-r--r--dev/ZKA/KernelKit/UserProcessScheduler.hxx2
-rw-r--r--dev/ZKA/Sources/CodeManager.cxx2
-rw-r--r--dev/ZKA/Sources/DLLMain.cxx11
-rw-r--r--dev/ZKA/Sources/MP.cxx12
-rw-r--r--dev/ZKA/Sources/PEFCodeManager.cxx2
16 files changed, 101 insertions, 273 deletions
diff --git a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
index ff8c3211..bb929028 100644
--- a/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
+++ b/dev/ZBA/Sources/HEL/AMD64/BootMain.cxx
@@ -191,7 +191,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
handoverHdrPtr->f_HeapStart = 0;
- while (BS->AllocatePool(EfiRuntimeServicesCode, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart) != kEfiOk)
+ while (BS->AllocatePool(EfiLoaderData, kHandoverHeapSz, &handoverHdrPtr->f_HeapStart) != kEfiOk)
;
handoverHdrPtr->f_VirtualSize =
diff --git a/dev/ZKA/HALKit/AMD64/HalControlRegister.s b/dev/ZKA/HALKit/AMD64/HalControlRegister.s
index 879d35c1..11c52ff3 100644
--- a/dev/ZKA/HALKit/AMD64/HalControlRegister.s
+++ b/dev/ZKA/HALKit/AMD64/HalControlRegister.s
@@ -15,7 +15,7 @@
hal_flush_tlb:
call hal_read_cr3
- mov %rcx, %rax
+ mov %rax, %rcx
call hal_write_cr3
ret
@@ -24,17 +24,17 @@ hal_read_cr3:
ret
hal_read_cr0:
- movq %rax, %cr0
+ movq %cr0, %rax
ret
hal_read_cr2:
- movq %rax, %cr2
+ movq %cr3, %rax
ret
hal_write_cr3:
- movq %cr3, %rdi
+ movq %rcx, %cr3
ret
hal_write_cr0:
- movq %cr0, %rdi
+ movq %rcx, %cr3
ret
diff --git a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
index 7838a8ed..1101e5e2 100644
--- a/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx
@@ -66,7 +66,7 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr
/// @brief Enter Kernel call from assembly (DDK only).
/// @param stack the stack pushed from assembly routine.
/// @return nothing.
-EXTERN_C Kernel::Void hal_Kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx, Kernel::UIntPtr r8, Kernel::UIntPtr r9)
+EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx, Kernel::UIntPtr r8, Kernel::UIntPtr r9)
{
if (rcx <= (kSyscalls.Count() - 1))
{
diff --git a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
index 3b91aa88..0033f614 100644
--- a/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -51,11 +51,26 @@ namespace Kernel::HAL
{
volatile ::Kernel::UIntPtr** ptr_ivt = (volatile ::Kernel::UIntPtr**)idt.Base;
- for (UInt16 idt_indx = 0; idt_indx < kKernelIdtSize; ++idt_indx)
+ for (UInt16 idt_indx = 0; idt_indx < 12; ++idt_indx)
{
MUST_PASS(ptr_ivt[idt_indx]);
- Detail::kInterruptVectorTable[idt_indx].Selector = idt_indx == kSyscallRoute ? kGdtUserCodeSelector : kGdtCodeSelector;
+ Detail::kInterruptVectorTable[idt_indx].Selector = kGdtKernelCodeSelector;
+ Detail::kInterruptVectorTable[idt_indx].Ist = 0;
+ Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kTrapGate;
+ Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & __INT16_MAX__);
+ Detail::kInterruptVectorTable[idt_indx].OffsetMid = (((UIntPtr)ptr_ivt[idt_indx] >> 16) & __INT16_MAX__);
+ Detail::kInterruptVectorTable[idt_indx].OffsetHigh =
+ (((UIntPtr)ptr_ivt[idt_indx] >> 32) & __INT32_MAX__);
+
+ Detail::kInterruptVectorTable[idt_indx].Zero = 0x0;
+ }
+
+ for (UInt16 idt_indx = 13; idt_indx < kKernelIdtSize; ++idt_indx)
+ {
+ MUST_PASS(ptr_ivt[idt_indx]);
+
+ Detail::kInterruptVectorTable[idt_indx].Selector = (idt_indx == kSyscallRoute) ? kGdtUserCodeSelector : kGdtKernelCodeSelector;
Detail::kInterruptVectorTable[idt_indx].Ist = 0;
Detail::kInterruptVectorTable[idt_indx].TypeAttributes = kInterruptGate;
Detail::kInterruptVectorTable[idt_indx].OffsetLow = ((UIntPtr)ptr_ivt[idt_indx] & __INT16_MAX__);
diff --git a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
index 5fe8b1aa..d3decfde 100644
--- a/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/ZKA/HALKit/AMD64/HalInterruptAPI.asm
@@ -129,15 +129,11 @@ IntNormal 26
IntNormal 27
IntNormal 28
IntNormal 29
-
IntExp 30
-
IntNormal 31
-
IntNormal 32
-IntNormal 34
-
IntNormal 33
+IntNormal 34
IntNormal 35
IntNormal 36
IntNormal 37
@@ -154,25 +150,10 @@ IntNormal 47
IntNormal 48
IntNormal 49
-[extern hal_system_call_enter]
-[extern hal_Kernel_call_enter]
-
-__ZKA_INT_50:
- cli
-
- push rcx
- push rdx
- push rax
-
- call hal_system_call_enter
-
- pop rax
- pop rdx
- pop rcx
-
- sti
- iretq
+[extern hal_kernel_call_enter]
+IntNormal 50
+
__ZKA_INT_51:
cli
@@ -182,7 +163,7 @@ __ZKA_INT_51:
push r9
push rax
- call hal_Kernel_call_enter
+ call hal_kernel_call_enter
pop rax
pop r9
diff --git a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
index faf59920..af767938 100644
--- a/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalKernelMain.cxx
@@ -63,16 +63,16 @@ namespace Kernel::HAL
/* GDT, mostly descriptors for user and kernel segments. */
STATIC Kernel::HAL::Detail::ZKA_GDT_ENTRY cGdt[9] = {
- {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, // Null entry
- {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0x9A, .fGranularity = 0xA0, .fBase2 = 0}, // Kernel code
- {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0x92, .fGranularity = 0xA0, .fBase2 = 0}, // Kernel data
- {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0xFA, .fGranularity = 0xA0, .fBase2 = 0}, // User code
- {.fLimit0 = 0xFFFF, .fBase0 = 0, .fBase1 = 00, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBase2 = 0}, // User data
+ {.fLimitLow = 0, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBaseHigh = 0}, // Null entry
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x9A, .fGranularity = 0xA0, .fBaseHigh = 0}, // Kernel code
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0x92, .fGranularity = 0xA0, .fBaseHigh = 0}, // Kernel data
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xFA, .fGranularity = 0xA0, .fBaseHigh = 0}, // User code
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data
// reserve them for later.
- {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0}, // Null entry
- {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0},
- {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0},
- {.fLimit0 = 0, .fBase0 = 0, .fBase1 = 0, .fAccessByte = 0x00, .fGranularity = 0x00, .fBase2 = 0},
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data
+ {.fLimitLow = 0xFFFF, .fBaseLow = 0, .fBaseMid = 0, .fAccessByte = 0xF2, .fGranularity = 0xA0, .fBaseHigh = 0}, // User data
};
Kernel::Void hal_real_init(Kernel::Void) noexcept;
@@ -134,115 +134,6 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
CONST Kernel::HAL::IDTLoader cIDT;
cIDT.Load(idtBase);
- // Register the basic system calls.
-
- constexpr auto cTlsInterrupt = 0x11;
- constexpr auto cTlsInstallInterrupt = 0x12;
- constexpr auto cNewInterrupt = 0x13;
- constexpr auto cDeleteInterrupt = 0x14;
- constexpr auto cExitInterrupt = 0x15;
- constexpr auto cLastExitInterrupt = 0x16;
- constexpr auto cCatalogOpen = 0x17;
- constexpr auto cForkRead = 0x18;
- constexpr auto cForkWrite = 0x19;
- constexpr auto cCatalogClose = 0x20;
- constexpr auto cCatalogRemove = 0x21;
- constexpr auto cCatalogCreate = 0x22;
- constexpr auto cRebootInterrupt = 0x23;
- constexpr auto cShutdownInterrupt = 0x24;
- constexpr auto cLPCSendMsg = 0x25;
- constexpr auto cLPCOpenMsg = 0x26;
- constexpr auto cLPCCloseMsg = 0x27;
- constexpr auto cCreateThreadInterrupt = 0x28;
-
- kSyscalls[cTlsInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- if (tls_check_syscall_impl(rdx) == false)
- {
- Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Crash();
- }
- };
-
- kSyscalls[cNewInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- // get HAC struct.
- HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
-
- if (!rdxInf)
- return;
-
- // assign the fThe field with the pointer.
- rdxInf->fThe = Kernel::UserProcessScheduler::The().CurrentProcess().Leak().New(rdxInf->fTheSz);
- };
-
- kSyscalls[cDeleteInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- // get HAC struct.
- HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
-
- if (!rdxInf)
- return;
-
- // delete ptr with sz in mind.
- Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz);
- };
-
- kSyscalls[cTlsInstallInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- PROCESS_BLOCK_INFO* rdxPb = reinterpret_cast<PROCESS_BLOCK_INFO*>(rdx);
-
- if (!rdxPb)
- return;
-
- // install the fTIB and fGIB.
- rt_install_tib(rdxPb->fTIB, rdxPb->fGIB);
- };
-
- kSyscalls[cCreateThreadInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- CREATE_THREAD_INFO* rdxPb = reinterpret_cast<CREATE_THREAD_INFO*>(rdx);
-
- if (!rdxPb)
- return;
-
- // install the fTIB and fGIB.
- Kernel::sched_execute_thread(rdxPb->fMain, rdxPb->fName);
- };
-
- kSyscalls[cExitInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
-
- if (!rdxEi)
- return;
-
- Kernel::kcout << "newoskrnl.dll: " << rdxEi->fReason << "\r";
- Kernel::UserProcessScheduler::The().CurrentProcess().Leak().Exit(rdxEi->fCode);
- };
-
- kSyscalls[cLastExitInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
-
- if (!rdxEi)
- return;
-
- rdxEi->fCode = Kernel::sched_get_exit_code();
- };
-
- kSyscalls[cRebootInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- pow.Reboot();
- };
-
- kSyscalls[cShutdownInterrupt].fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- pow.Shutdown();
- };
-
- kSyscalls[cTlsInterrupt].fHooked = true;
- kSyscalls[cTlsInstallInterrupt].fHooked = true;
- kSyscalls[cDeleteInterrupt].fHooked = true;
- kSyscalls[cNewInterrupt].fHooked = true;
- kSyscalls[cExitInterrupt].fHooked = true;
- kSyscalls[cLastExitInterrupt].fHooked = true;
- kSyscalls[cShutdownInterrupt].fHooked = true;
- kSyscalls[cRebootInterrupt].fHooked = true;
- kSyscalls[cCreateThreadInterrupt].fHooked = true;
-
if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
diff --git a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
index 42d5ffe5..601ff29e 100644
--- a/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
+++ b/dev/ZKA/HALKit/AMD64/HalMPContextSwitch.asm
@@ -21,8 +21,21 @@ section .text
;; rcx: code ptr.
;; rdx: stack ptr.
mp_do_context_switch:
+ jmp mp_jump_user_mode
+mp_jump_user_mode:
mov r11, 0x0202
- mov rsp, rdx
+ mov r13, rdx
+ mov r12, rcx
+
+ mov eax, 0x23
+ mov ds, eax
+ mov gs, eax
+ mov es, eax
+ mov fs, eax
+
+ mov rcx, r12
+ mov rsp, r13
+
o64 sysret
;; @brief Gets the current stack frame.
@@ -30,8 +43,27 @@ mp_get_current_context:
call _hal_leak_current_context
ret
+extern hal_system_call_enter
+
+mp_system_call_handler:
+ cli
+
+ push rcx
+ push rdx
+ push rax
+
+ call hal_system_call_enter
+
+ pop rax
+ pop rdx
+ pop rcx
+
+ sti
+ sysret
+
mp_do_context_switch_pre:
; Enable SCE that enables sysret and syscall
+ mov rax, mp_system_call_handler
mov rcx, 0xc0000082
wrmsr
mov rcx, 0xc0000080
diff --git a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
index e8a89f85..50d00368 100644
--- a/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
+++ b/dev/ZKA/HALKit/AMD64/HalSchedulerCore.cxx
@@ -9,7 +9,7 @@
using namespace Kernel;
-Void UserProcess::SetEntrypoint(VoidPtr imageStart) noexcept
+Void UserProcess::SetImageStart(VoidPtr imageStart) noexcept
{
if (imageStart == nullptr)
this->Crash();
diff --git a/dev/ZKA/HALKit/AMD64/Processor.hxx b/dev/ZKA/HALKit/AMD64/Processor.hxx
index 570346c1..ec053435 100644
--- a/dev/ZKA/HALKit/AMD64/Processor.hxx
+++ b/dev/ZKA/HALKit/AMD64/Processor.hxx
@@ -24,7 +24,7 @@ EXTERN_C
#include <cpuid.h>
}
-#define kSyscallRoute (0x32)
+#define kSyscallRoute (51)
#define IsActiveLow(FLG) (FLG & 2)
#define IsLevelTriggered(FLG) (FLG & 8)
@@ -32,8 +32,8 @@ EXTERN_C
#define kInterruptGate (0x8E)
#define kTrapGate (0xEF)
#define kTaskGate (0b10001100)
-#define kGdtCodeSelector (0x08)
-#define kGdtUserCodeSelector (0x2b)
+#define kGdtKernelCodeSelector (0x08)
+#define kGdtUserCodeSelector (0x23)
namespace Kernel
{
@@ -110,7 +110,7 @@ namespace Kernel::HAL
UIntPtr R8{0};
UIntPtr R9{0};
UIntPtr R10{0};
- UIntPtr R11{0};
+ UIntPtr R11{0}; // not tied to r11, rax this time!
UIntPtr R12{0};
UIntPtr R13{0};
UIntPtr R14{0};
@@ -237,12 +237,12 @@ namespace Kernel::HAL
struct PACKED ZKA_GDT_ENTRY final
{
- UInt16 fLimit0;
- UInt16 fBase0;
- UInt8 fBase1;
+ UInt16 fLimitLow;
+ UInt16 fBaseLow;
+ UInt8 fBaseMid;
UInt8 fAccessByte;
UInt8 fGranularity;
- UInt8 fBase2;
+ UInt8 fBaseHigh;
};
} // namespace Detail
diff --git a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
index 9145eec0..6bb3d7b4 100644
--- a/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalKernelMain.cxx
@@ -12,7 +12,6 @@
#include <KernelKit/Heap.hxx>
#include <KernelKit/PEFCodeManager.hxx>
#include <KernelKit/UserProcessScheduler.hxx>
-#include <KernelKit/ProcessHeap.hxx>
#include <NewKit/Json.hxx>
#include <Modules/CoreCG/Accessibility.hxx>
#include <KernelKit/CodeManager.hxx>
@@ -50,7 +49,7 @@ namespace Kernel::HAL
{
/// @brief Gets the system cores using the MADT.
/// @param rsdPtr The 'RSD PTR' data structure.
- EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr);
+ EXTERN void mp_get_cores(Kernel::voidPtr rsdPtr) noexcept;
} // namespace Kernel::HAL
Kernel::Void hal_real_init(Kernel::Void) noexcept;
@@ -90,104 +89,7 @@ Kernel::Void hal_real_init(Kernel::Void) noexcept
kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_PhysicalStart));
- // Register the basic system calls.
-
- constexpr auto cTlsInterrupt = 0x11;
- constexpr auto cTlsInstallInterrupt = 0x12;
- constexpr auto cNewInterrupt = 0x13;
- constexpr auto cDeleteInterrupt = 0x14;
- constexpr auto cExitInterrupt = 0x15;
- constexpr auto cLastExitInterrupt = 0x16;
- constexpr auto cCatalogOpen = 0x17;
- constexpr auto cForkRead = 0x18;
- constexpr auto cForkWrite = 0x19;
- constexpr auto cCatalogClose = 0x20;
- constexpr auto cCatalogRemove = 0x21;
- constexpr auto cCatalogCreate = 0x22;
- constexpr auto cRebootInterrupt = 0x23;
- constexpr auto cShutdownInterrupt = 0x24;
- constexpr auto cLPCSendMsg = 0x25;
- constexpr auto cLPCOpenMsg = 0x26;
- constexpr auto cLPCCloseMsg = 0x27;
-
- kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- if (tls_check_syscall_impl(rdx) == false)
- {
- Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().Crash();
- }
- };
-
- kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- // get HAC struct.
- HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
-
- if (!rdxInf)
- return;
-
- // assign the fThe field with the pointer.
- rdxInf->fThe = Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().New(rdxInf->fTheSz);
- };
-
- kSyscalls[cDeleteInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- // get HAC struct.
- HEAP_ALLOC_INFO* rdxInf = reinterpret_cast<HEAP_ALLOC_INFO*>(rdx);
-
- if (!rdxInf)
- return;
-
- // delete ptr with sz in mind.
- Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz);
- };
-
- kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- PROCESS_BLOCK_INFO* rdxPb = reinterpret_cast<PROCESS_BLOCK_INFO*>(rdx);
-
- if (!rdxPb)
- return;
-
- // install the fTIB and fGIB.
- rt_install_tib(rdxPb->fTIB, rdxPb->fGIB);
- };
-
- kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
-
- if (!rdxEi)
- return;
-
- Kernel::kcout << "newoskrnl.dll: " << rdxEi->fReason << "\r";
- Kernel::UserProcessScheduler::The().Leak().CurrentProcess().Leak().Exit(rdxEi->fCode);
- };
-
- kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- PROCESS_EXIT_INFO* rdxEi = reinterpret_cast<PROCESS_EXIT_INFO*>(rdx);
-
- if (!rdxEi)
- return;
-
- rdxEi->fCode = Kernel::sched_get_exit_code();
- };
-
- kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- pow.Reboot();
- };
-
- kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
- Kernel::PowerFactoryInterface pow(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- pow.Shutdown();
- };
-
- kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
-
- if (kHandoverHeader->f_MultiProcessingEnabled)
+ if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
Kernel::HAL::mp_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
else
Kernel::HAL::mp_get_cores(nullptr);
diff --git a/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx b/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx
index 74e37d91..781c639a 100644
--- a/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx
+++ b/dev/ZKA/HALKit/ARM64/HalSchedulerCore.cxx
@@ -8,7 +8,7 @@
using namespace Kernel;
-Void UserProcess::SetEntrypoint(UIntPtr& imageStart) noexcept
+Void UserProcess::SetImageStart(UIntPtr& imageStart) noexcept
{
if (imageStart == 0)
this->Crash();
diff --git a/dev/ZKA/KernelKit/UserProcessScheduler.hxx b/dev/ZKA/KernelKit/UserProcessScheduler.hxx
index da6a9fc2..7a7d200e 100644
--- a/dev/ZKA/KernelKit/UserProcessScheduler.hxx
+++ b/dev/ZKA/KernelKit/UserProcessScheduler.hxx
@@ -138,7 +138,7 @@ namespace Kernel
ZKA_COPY_DEFAULT(UserProcess)
public:
- void SetEntrypoint(VoidPtr imageStart) noexcept;
+ void SetImageStart(VoidPtr imageStart) noexcept;
const UInt32& GetExitCode() noexcept;
public:
diff --git a/dev/ZKA/Sources/CodeManager.cxx b/dev/ZKA/Sources/CodeManager.cxx
index 5f634539..f01bf41c 100644
--- a/dev/ZKA/Sources/CodeManager.cxx
+++ b/dev/ZKA/Sources/CodeManager.cxx
@@ -20,7 +20,7 @@ namespace Kernel
return false;
UserProcess proc;
- proc.SetEntrypoint(reinterpret_cast<VoidPtr>(main));
+ proc.SetImageStart(reinterpret_cast<VoidPtr>(main));
proc.Kind = UserProcess::kExeKind;
proc.StackSize = mib_cast(1);
diff --git a/dev/ZKA/Sources/DLLMain.cxx b/dev/ZKA/Sources/DLLMain.cxx
index d8edeaaf..25be253f 100644
--- a/dev/ZKA/Sources/DLLMain.cxx
+++ b/dev/ZKA/Sources/DLLMain.cxx
@@ -188,8 +188,15 @@ EXTERN_C Kernel::Void ke_dll_entrypoint(Kernel::Void)
Kernel::cProcessScheduler = nullptr;
Kernel::ProcessHelper::StartScheduling();
- CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.dll: Starting ZKA System...", 30, 10, RGB(0, 0, 0));
+ CG::CGDrawStringToWnd(cKernelWnd, "newoskrnl.dll: Starting ZKA System...", 20, 10, RGB(0, 0, 0));
+
+ static Kernel::MainKind fn = []() -> void {while(1); };
+ Kernel::sched_execute_thread(fn, "ZKA Logger");
+
+ while (Yes)
+ {
+ Kernel::ProcessHelper::StartScheduling();
+ }
- Kernel::ProcessHelper::StartScheduling();
Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
diff --git a/dev/ZKA/Sources/MP.cxx b/dev/ZKA/Sources/MP.cxx
index 9c7a47f3..5b44a119 100644
--- a/dev/ZKA/Sources/MP.cxx
+++ b/dev/ZKA/Sources/MP.cxx
@@ -98,15 +98,15 @@ namespace Kernel
fStack = frame;
- auto ret = mp_register_process(fStack);
-
- if (!ret)
+ if (kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled)
{
- mp_do_context_switch_pre();
- return mp_do_context_switch(image, stack_ptr, fStack) != 0;
+ return mp_register_process(fStack);
}
- return ret;
+ kcout << "newoskrnl: Switching now...\r";
+
+ mp_do_context_switch_pre();
+ return mp_do_context_switch(image, stack_ptr, fStack) != 0;
}
///! @brief Tells if processor is waked up.
diff --git a/dev/ZKA/Sources/PEFCodeManager.cxx b/dev/ZKA/Sources/PEFCodeManager.cxx
index 11743373..0f1a4885 100644
--- a/dev/ZKA/Sources/PEFCodeManager.cxx
+++ b/dev/ZKA/Sources/PEFCodeManager.cxx
@@ -206,7 +206,7 @@ namespace Kernel
UserProcess proc;
- proc.SetEntrypoint(errOrStart.Leak().Leak());
+ proc.SetImageStart(errOrStart.Leak().Leak());
proc.Kind = procKind;
proc.StackSize = *(UIntPtr*)exec.FindSymbol(cPefStackSizeSymbol, kPefData);