diff options
| author | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-12-01 18:41:41 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal.elmahrouss@icloud.com> | 2024-12-01 18:41:41 +0100 |
| commit | f83e7bddcf24433adbfc9214e0f8f8139f8b6362 (patch) | |
| tree | 0447eddc2ebff291f96286847c238b4f907515b1 /dev/ZKAKit | |
| parent | c62790f8f773a2f10464d2b1e0e286f2b3156712 (diff) | |
FIX: Fixing ARM64 execution when booting from bootloader.
FIX: Now works both for ARM64 and AMD64 EFI backends.
TODO: The ACB backend needs to be done too.
Signed-off-by: Amlal El Mahrouss <amlal.elmahrouss@icloud.com>
Diffstat (limited to 'dev/ZKAKit')
| -rw-r--r-- | dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc | 5 | ||||
| -rw-r--r-- | dev/ZKAKit/HALKit/ARM64/HalSchedulerCoreARM64.cc | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/HintKit/CompilerHint.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/IDLLObject.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/IPEFDLLObject.h | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/PEFCodeMgr.h | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/ThreadLocalStorage.h | 11 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/ThreadLocalStorage.inl | 21 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/UserProcessScheduler.h | 4 | ||||
| -rw-r--r-- | dev/ZKAKit/KernelKit/UserProcessScheduler.inl | 40 | ||||
| -rw-r--r-- | dev/ZKAKit/amd64-efi.make | 2 | ||||
| -rw-r--r-- | dev/ZKAKit/src/CxxAbi-ARM64.cc | 15 | ||||
| -rw-r--r-- | dev/ZKAKit/src/IPEFDLLObject.cc | 3 | ||||
| -rw-r--r-- | dev/ZKAKit/src/UserProcessScheduler.cc | 37 | ||||
| -rw-r--r-- | dev/ZKAKit/src/Utils.cc | 7 |
15 files changed, 108 insertions, 49 deletions
diff --git a/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc b/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc index 1d901e48..6d89dfc4 100644 --- a/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc +++ b/dev/ZKAKit/HALKit/ARM64/HalKernelMain.cc @@ -44,8 +44,5 @@ EXTERN_C void hal_init_platform( kKernelBitMpStart = reinterpret_cast<Kernel::VoidPtr>( reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_BitMapStart)); - Kernel::NeFileSystemMgr::Mount(new Kernel::NeFileSystemMgr()); - - while (Yes) - ; + Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/dev/ZKAKit/HALKit/ARM64/HalSchedulerCoreARM64.cc b/dev/ZKAKit/HALKit/ARM64/HalSchedulerCoreARM64.cc index 4c620ab9..55619d54 100644 --- a/dev/ZKAKit/HALKit/ARM64/HalSchedulerCoreARM64.cc +++ b/dev/ZKAKit/HALKit/ARM64/HalSchedulerCoreARM64.cc @@ -35,6 +35,6 @@ namespace Kernel /// hooks and hangs thread to prevent code from executing. Void mp_hang_thread(HAL::StackFrame* stack) { - ZKA_UNUSUED(stack); + ZKA_UNUSED(stack); } } // namespace Kernel diff --git a/dev/ZKAKit/HintKit/CompilerHint.h b/dev/ZKAKit/HintKit/CompilerHint.h index 415e4776..f484a261 100644 --- a/dev/ZKAKit/HintKit/CompilerHint.h +++ b/dev/ZKAKit/HintKit/CompilerHint.h @@ -7,7 +7,9 @@ #ifndef __HINTKIT_COMPILER_HINT_H__ #define __HINTKIT_COMPILER_HINT_H__ +#ifdef __TK__ #pragma compiler(hint_manifest) +#endif #define _Input #define _Output diff --git a/dev/ZKAKit/KernelKit/IDLLObject.h b/dev/ZKAKit/KernelKit/IDLLObject.h index bd1aa5d0..e14e335f 100644 --- a/dev/ZKAKit/KernelKit/IDLLObject.h +++ b/dev/ZKAKit/KernelKit/IDLLObject.h @@ -12,6 +12,8 @@ #include <NewKit/Defines.h> #include <CompilerKit/CompilerKit.h> +#define ZKA_DLL_OBJECT : public IDLLObject + namespace Kernel { /// @brief DLL class object. A handle to a shared library. diff --git a/dev/ZKAKit/KernelKit/IPEFDLLObject.h b/dev/ZKAKit/KernelKit/IPEFDLLObject.h index 9447a98f..03dcd53f 100644 --- a/dev/ZKAKit/KernelKit/IPEFDLLObject.h +++ b/dev/ZKAKit/KernelKit/IPEFDLLObject.h @@ -22,7 +22,7 @@ namespace Kernel * @brief Shared Library class * Load library from this class */ - class IPEFDLLObject final : public IDLLObject + class IPEFDLLObject final ZKA_DLL_OBJECT { public: explicit IPEFDLLObject() = default; diff --git a/dev/ZKAKit/KernelKit/PEFCodeMgr.h b/dev/ZKAKit/KernelKit/PEFCodeMgr.h index 5474e4b6..c42701ce 100644 --- a/dev/ZKAKit/KernelKit/PEFCodeMgr.h +++ b/dev/ZKAKit/KernelKit/PEFCodeMgr.h @@ -12,6 +12,10 @@ #include <NewKit/KString.h> #include <KernelKit/FileMgr.h> +#ifndef INC_PROCESS_SCHEDULER_H +#include <KernelKit/UserProcessScheduler.h> +#endif + #define kPefApplicationMime "application/vnd-zka-executable" namespace Kernel diff --git a/dev/ZKAKit/KernelKit/ThreadLocalStorage.h b/dev/ZKAKit/KernelKit/ThreadLocalStorage.h index 93e0a9a4..2c0a8810 100644 --- a/dev/ZKAKit/KernelKit/ThreadLocalStorage.h +++ b/dev/ZKAKit/KernelKit/ThreadLocalStorage.h @@ -8,6 +8,7 @@ #define KERNELKIT_TLS_H #include <NewKit/Defines.h> +#include <NewKit/ErrorOr.h> ///! @brief Thread Local Storage for minoskrnl. @@ -38,6 +39,16 @@ T* tls_new_ptr(void) noexcept; template <typename T> Kernel::Boolean tls_delete_ptr(T* ptr) noexcept; +//! @brief Delete process pointer. +//! @param obj The pointer to delete. +template <typename T> +inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T> obj) noexcept; + +//! @brief Delete process pointer. +//! @param obj The pointer to delete. +template <typename T> +inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T*> obj) noexcept; + template <typename T, typename... Args> T* tls_new_class(Args&&... args); diff --git a/dev/ZKAKit/KernelKit/ThreadLocalStorage.inl b/dev/ZKAKit/KernelKit/ThreadLocalStorage.inl index d9850c01..3683bc4b 100644 --- a/dev/ZKAKit/KernelKit/ThreadLocalStorage.inl +++ b/dev/ZKAKit/KernelKit/ThreadLocalStorage.inl @@ -7,6 +7,7 @@ //! @file ThreadLocalStorage.inl //! @brief Allocate resources from the process's heap storage. +#include "NewKit/ErrorOr.h" #ifndef INC_PROCESS_SCHEDULER_H #include <KernelKit/UserProcessScheduler.h> #endif @@ -40,7 +41,25 @@ inline Kernel::Bool tls_delete_ptr(T* obj) noexcept auto ref_process = UserProcessScheduler::The().GetCurrentProcess(); MUST_PASS(ref_process); - return ref_process.Leak().Delete(obj, sizeof(T)); + ErrorOr<T*> obj_wrapped{obj}; + + return ref_process.Leak().Delete(obj_wrapped, sizeof(T)); +} + +//! @brief Delete process pointer. +//! @param obj The pointer to delete. +template <typename T> +inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T> obj) noexcept +{ + return tls_delete_ptr(obj.Leak()); +} + +//! @brief Delete process pointer. +//! @param obj The pointer to delete. +template <typename T> +inline Kernel::Bool tls_delete_ptr(Kernel::ErrorOr<T*> obj) noexcept +{ + return tls_delete_ptr(obj->Leak()); } /// @brief Allocate a C++ class, and then call the constructor of it. diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.h b/dev/ZKAKit/KernelKit/UserProcessScheduler.h index a3a6c8bd..c1559085 100644 --- a/dev/ZKAKit/KernelKit/UserProcessScheduler.h +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.h @@ -219,7 +219,8 @@ namespace Kernel ///! @brief TLS free. ///! @param ptr the pointer to free. ///! @param sz the size of it. - Boolean Delete(ErrorOr<VoidPtr> ptr, const SizeT& sz); + template <typename T> + Boolean Delete(ErrorOr<T*> ptr, const SizeT& sz); ///! @brief Wakes up threads. Void Wake(const Bool wakeup = false); @@ -324,6 +325,7 @@ namespace Kernel } // namespace Kernel #include <KernelKit/ThreadLocalStorage.h> +#include <KernelKit/UserProcessScheduler.inl> //////////////////////////////////////////////////// diff --git a/dev/ZKAKit/KernelKit/UserProcessScheduler.inl b/dev/ZKAKit/KernelKit/UserProcessScheduler.inl new file mode 100644 index 00000000..b99fafbf --- /dev/null +++ b/dev/ZKAKit/KernelKit/UserProcessScheduler.inl @@ -0,0 +1,40 @@ +namespace Kernel +{ + /***********************************************************************************/ + /** @brief Free pointer from usage. */ + /***********************************************************************************/ + + template <typename T> + Boolean UserProcess::Delete(ErrorOr<T*> ptr, const SizeT& sz) + { + if (!ptr || + sz == 0) + return No; + + UserProcessHeapList* entry = this->MemoryHeap; + + while (entry != nullptr) + { + if (entry->MemoryEntry == ptr.Leak().Leak()) + { +#ifdef __ZKA_AMD64__ + auto pd = hal_read_cr3(); + hal_write_cr3(this->VMRegister); + + auto ret = mm_delete_heap(entry->MemoryEntry); + + hal_write_cr3(pd); + + return ret; +#else + Bool ret = mm_delete_heap(ptr.Leak().Leak()); + return ret; +#endif + } + + entry = entry->MemoryNext; + } + + return No; + } +} // namespace Kernel
\ No newline at end of file diff --git a/dev/ZKAKit/amd64-efi.make b/dev/ZKAKit/amd64-efi.make index 296abbb9..97ce96de 100644 --- a/dev/ZKAKit/amd64-efi.make +++ b/dev/ZKAKit/amd64-efi.make @@ -7,7 +7,7 @@ CC = x86_64-w64-mingw32-g++ LD = x86_64-w64-mingw32-ld CCFLAGS = -fshort-wchar -c -D__ZKA_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ -std=c++20 -D__ZKA_SUPPORT_NX__ -O0 -I../Vendor -D__FSKIT_INCLUDES_NEFS__ \ - -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../zba -Wall + -D__MINOSKRNL__ -D__HAVE_ZKA_APIS__ -D__FREESTANDING__ -D__ZKA__ -I./ -I../ -I../zba ASM = nasm diff --git a/dev/ZKAKit/src/CxxAbi-ARM64.cc b/dev/ZKAKit/src/CxxAbi-ARM64.cc index 91ca0fe2..68a3acdc 100644 --- a/dev/ZKAKit/src/CxxAbi-ARM64.cc +++ b/dev/ZKAKit/src/CxxAbi-ARM64.cc @@ -87,4 +87,19 @@ EXTERN_C Kernel::Void _purecall(void* self) kcout << ", has unimplemented virtual functions.\r"; } +EXTERN_C Kernel::Void _Init_thread_footer(Kernel::Int* thread_obj) +{ + ZKA_UNUSED(thread_obj); +} + +EXTERN_C Kernel::Void _Init_thread_epoch(Kernel::Void) +{ +} + +EXTERN_C Kernel::Void _Init_thread_header(Kernel::Int* thread_obj) +{ +} + +EXTERN_C Kernel::Int _tls_index = 0UL; + #endif // ifdef __ZKA_ARM64__ diff --git a/dev/ZKAKit/src/IPEFDLLObject.cc b/dev/ZKAKit/src/IPEFDLLObject.cc index 89b613ac..3eb102b5 100644 --- a/dev/ZKAKit/src/IPEFDLLObject.cc +++ b/dev/ZKAKit/src/IPEFDLLObject.cc @@ -7,6 +7,7 @@ * ======================================================== */ +#include "KernelKit/IDLLObject.h" #include <KernelKit/DebugOutput.h> #include <KernelKit/PEF.h> #include <KernelKit/IPEFDLLObject.h> @@ -55,6 +56,7 @@ EXTERN_C IDLL rtl_init_dll(UserProcess* header) { tls_delete_class(dll_obj); header->Crash(); + return nullptr; } @@ -65,6 +67,7 @@ EXTERN_C IDLL rtl_init_dll(UserProcess* header) { tls_delete_class(dll_obj); header->Crash(); + return nullptr; } diff --git a/dev/ZKAKit/src/UserProcessScheduler.cc b/dev/ZKAKit/src/UserProcessScheduler.cc index 7f303d7c..e9cd1c54 100644 --- a/dev/ZKAKit/src/UserProcessScheduler.cc +++ b/dev/ZKAKit/src/UserProcessScheduler.cc @@ -156,43 +156,6 @@ namespace Kernel } /***********************************************************************************/ - /** @brief Free pointer from usage. */ - /***********************************************************************************/ - - Boolean UserProcess::Delete(ErrorOr<VoidPtr> ptr, const SizeT& sz) - { - if (!ptr || - sz == 0) - return No; - - UserProcessHeapList* entry = this->MemoryHeap; - - while (entry != nullptr) - { - if (entry->MemoryEntry == ptr.Leak().Leak()) - { -#ifdef __ZKA_AMD64__ - auto pd = hal_read_cr3(); - hal_write_cr3(this->VMRegister); - - auto ret = mm_delete_heap(entry->MemoryEntry); - - hal_write_cr3(pd); - - return ret; -#else - Bool ret = mm_delete_heap(ptr); - return ret; -#endif - } - - entry = entry->MemoryNext; - } - - return No; - } - - /***********************************************************************************/ /// @brief Gets the name of the current process. /***********************************************************************************/ diff --git a/dev/ZKAKit/src/Utils.cc b/dev/ZKAKit/src/Utils.cc index 412e4a45..d6657680 100644 --- a/dev/ZKAKit/src/Utils.cc +++ b/dev/ZKAKit/src/Utils.cc @@ -211,12 +211,13 @@ namespace Kernel } } // namespace Kernel -EXTERN_C void* memset(void* dst, int c, __SIZE_TYPE__ len) +EXTERN_C void* memset(void* dst, int c, long long unsigned int len) { return Kernel::rt_set_memory(dst, c, len); } -EXTERN_C __UINT32_TYPE__ memcpy(void* dst, void* src, __SIZE_TYPE__ len) +EXTERN_C void* memcpy(void* dst, const void* src, long long unsigned int len) { - return Kernel::rt_copy_memory(src, dst, len); + Kernel::rt_copy_memory(const_cast<void*>(src), dst, len); + return dst; } |
