From 560a6c233286ec736a7a7c570efc68161c9953be Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Tue, 9 Jul 2024 16:49:29 +0200 Subject: MHR-36: newoskrnl: Adding support for ARM64 based UEFI machines, (EPM UEFI) Signed-off-by: Amlal El Mahrouss --- Kernel/Sources/CxxAbi-AMD64.cxx | 87 +++++++++++++++++++++++++++++++++++++ Kernel/Sources/CxxAbi-ARM64.cxx | 76 +++++++++++++++++++++++++++++++++ Kernel/Sources/CxxAbi.cxx | 92 ---------------------------------------- Kernel/Sources/Network/IP.cxx | 4 +- Kernel/Sources/PageAllocator.cxx | 7 ++- Kernel/Sources/SMPManager.cxx | 4 +- Kernel/Sources/String.cxx | 8 ++-- Kernel/Sources/power64-cb.make | 0 Kernel/Sources/rv64-cb.make | 0 9 files changed, 176 insertions(+), 102 deletions(-) create mode 100644 Kernel/Sources/CxxAbi-AMD64.cxx create mode 100644 Kernel/Sources/CxxAbi-ARM64.cxx delete mode 100644 Kernel/Sources/CxxAbi.cxx create mode 100644 Kernel/Sources/power64-cb.make create mode 100644 Kernel/Sources/rv64-cb.make (limited to 'Kernel/Sources') diff --git a/Kernel/Sources/CxxAbi-AMD64.cxx b/Kernel/Sources/CxxAbi-AMD64.cxx new file mode 100644 index 00000000..9376321c --- /dev/null +++ b/Kernel/Sources/CxxAbi-AMD64.cxx @@ -0,0 +1,87 @@ +/* ------------------------------------------- + + Copyright Zeta Electronics Corporation + +------------------------------------------- */ + +#include +#include +#include + +atexit_func_entry_t __atexit_funcs[kDSOMaxObjects]; + +uarch_t __atexit_func_count; + +/// @brief Dynamic Shared Object Handle. +Kernel::UIntPtr __dso_handle; + +EXTERN_C void __cxa_pure_virtual() +{ + Kernel::kcout << "newoskrnl: C++ placeholder method.\n"; +} + +EXTERN_C void ___chkstk_ms(void) +{ + Kernel::err_bug_check_raise(); + Kernel::err_bug_check(); +} + +EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso) +{ + if (__atexit_func_count >= kDSOMaxObjects) + return -1; + + __atexit_funcs[__atexit_func_count].destructor_func = f; + __atexit_funcs[__atexit_func_count].obj_ptr = arg; + __atexit_funcs[__atexit_func_count].dso_handle = dso; + + __atexit_func_count++; + + return 0; +} + +EXTERN_C void __cxa_finalize(void* f) +{ + uarch_t i = __atexit_func_count; + if (!f) + { + while (i--) + { + if (__atexit_funcs[i].destructor_func) + { + (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + }; + } + + return; + } + + while (i--) + { + if (__atexit_funcs[i].destructor_func) + { + (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); + __atexit_funcs[i].destructor_func = 0; + }; + } +} + +namespace cxxabiv1 +{ + EXTERN_C int __cxa_guard_acquire(__guard* g) + { + (void)g; + return 0; + } + + EXTERN_C int __cxa_guard_release(__guard* g) + { + *(char*)g = 1; + return 0; + } + + EXTERN_C void __cxa_guard_abort(__guard* g) + { + (void)g; + } +} // namespace cxxabiv1 diff --git a/Kernel/Sources/CxxAbi-ARM64.cxx b/Kernel/Sources/CxxAbi-ARM64.cxx new file mode 100644 index 00000000..79bdb63f --- /dev/null +++ b/Kernel/Sources/CxxAbi-ARM64.cxx @@ -0,0 +1,76 @@ +/* ------------------------------------------- + + Copyright Zeta Electronics Corporation + +------------------------------------------- */ + +#ifdef __NEWOS_ARM64__ + +#include +#include +#include + + +EXTERN_C +{ +#include +} + +int const cUninitialized = 0; +int const cBeingInitialized = -1; +int const cEpochStart = INT_MIN; + +EXTERN_C +{ + int _Init_global_epoch = cEpochStart; + __thread int _Init_thread_epoch = cEpochStart; +} + +Kernel::UInt32 const cNKTimeout = 100; // ms + +EXTERN_C void __cdecl _Init_thread_wait(Kernel::UInt32 const timeout) +{ + MUST_PASS(timeout != INT_MAX); +} + +EXTERN_C void __cdecl _Init_thread_header(int* const pOnce) noexcept +{ + if (*pOnce == cUninitialized) + { + *pOnce = cBeingInitialized; + } + else + { + while (*pOnce == cBeingInitialized) + { + _Init_thread_wait(cNKTimeout); + + if (*pOnce == cUninitialized) + { + *pOnce = cBeingInitialized; + return; + } + } + _Init_thread_epoch = _Init_global_epoch; + } + +} + +EXTERN_C void __cdecl _Init_thread_abort(int* const pOnce) noexcept +{ + *pOnce = cUninitialized; +} + +EXTERN_C void __cdecl _Init_thread_footer(int* const pOnce) noexcept +{ + ++_Init_global_epoch; + *pOnce = _Init_global_epoch; + _Init_thread_epoch = _Init_global_epoch; +} + +EXTERN_C void _purecall() +{ + Kernel::kcout << "newoskrnl: C++ placeholder method.\n"; +} + +#endif // ifdef __NEWOS_ARM64__ diff --git a/Kernel/Sources/CxxAbi.cxx b/Kernel/Sources/CxxAbi.cxx deleted file mode 100644 index febffbc4..00000000 --- a/Kernel/Sources/CxxAbi.cxx +++ /dev/null @@ -1,92 +0,0 @@ -/* ------------------------------------------- - - Copyright Zeta Electronics Corporation - -------------------------------------------- */ - -#include -#include -#include - -atexit_func_entry_t __atexit_funcs[kDSOMaxObjects]; - -uarch_t __atexit_func_count; - -/// @brief Dynamic Shared Object Handle. -Kernel::UIntPtr __dso_handle; - -EXTERN_C void __cxa_pure_virtual() -{ - Kernel::kcout << "newoskrnl: C++ placeholder method.\n"; -} - -EXTERN_C void ___chkstk_ms() -{ - Kernel::err_bug_check_raise(); - Kernel::err_bug_check(); -} - -#ifdef __NEWOS_ARM64__ -// AEABI specific. -#define atexit __aeabi_atexit -#endif - -EXTERN_C int atexit(void (*f)(void*), void* arg, void* dso) -{ - if (__atexit_func_count >= kDSOMaxObjects) - return -1; - - __atexit_funcs[__atexit_func_count].destructor_func = f; - __atexit_funcs[__atexit_func_count].obj_ptr = arg; - __atexit_funcs[__atexit_func_count].dso_handle = dso; - - __atexit_func_count++; - - return 0; -} - -EXTERN_C void __cxa_finalize(void* f) -{ - uarch_t i = __atexit_func_count; - if (!f) - { - while (i--) - { - if (__atexit_funcs[i].destructor_func) - { - (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); - }; - } - - return; - } - - while (i--) - { - if (__atexit_funcs[i].destructor_func) - { - (*__atexit_funcs[i].destructor_func)(__atexit_funcs[i].obj_ptr); - __atexit_funcs[i].destructor_func = 0; - }; - } -} - -namespace cxxabiv1 -{ - EXTERN_C int __cxa_guard_acquire(__guard* g) - { - (void)g; - return 0; - } - - EXTERN_C int __cxa_guard_release(__guard* g) - { - *(char*)g = 1; - return 0; - } - - EXTERN_C void __cxa_guard_abort(__guard* g) - { - (void)g; - } -} // namespace cxxabiv1 diff --git a/Kernel/Sources/Network/IP.cxx b/Kernel/Sources/Network/IP.cxx index 676e12a8..6fef69f1 100644 --- a/Kernel/Sources/Network/IP.cxx +++ b/Kernel/Sources/Network/IP.cxx @@ -90,13 +90,13 @@ namespace Kernel return true; } - ErrorOr IPFactory::ToStringView(Ref ipv6) + ErrorOr IPFactory::ToStringView(Ref& ipv6) { auto str = StringBuilder::Construct(ipv6.Leak().Address()); return str; } - ErrorOr IPFactory::ToStringView(Ref ipv4) + ErrorOr IPFactory::ToStringView(Ref& ipv4) { auto str = StringBuilder::Construct(ipv4.Leak().Address()); return str; diff --git a/Kernel/Sources/PageAllocator.cxx b/Kernel/Sources/PageAllocator.cxx index 27006885..5bcca898 100644 --- a/Kernel/Sources/PageAllocator.cxx +++ b/Kernel/Sources/PageAllocator.cxx @@ -26,11 +26,14 @@ namespace Kernel::Detail void exec_disable(UIntPtr VirtualAddr) { +#ifdef __NEWOS_SUPPORT_NX__ PTE* VirtualAddrTable = reinterpret_cast(VirtualAddr); - MUST_PASS(!VirtualAddrTable->Accessed); + + MUST_PASS(!VirtualAddrTable->ExecDisable == false); VirtualAddrTable->ExecDisable = true; hal_flush_tlb(); +#endif // ifdef __NEWOS_SUPPORT_NX__ } bool page_disable(UIntPtr VirtualAddr) @@ -38,8 +41,8 @@ namespace Kernel::Detail if (VirtualAddr) { auto VirtualAddrTable = (PTE*)(VirtualAddr); - MUST_PASS(!VirtualAddrTable->Accessed); + MUST_PASS(!VirtualAddrTable->Present == true); VirtualAddrTable->Present = false; hal_flush_tlb(); diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx index 8b0aca9b..59c66073 100644 --- a/Kernel/Sources/SMPManager.cxx +++ b/Kernel/Sources/SMPManager.cxx @@ -160,9 +160,9 @@ namespace Kernel // to avoid any null deref. if (!fThreadList[idx].Leak().Leak()->fStack) continue; - if (fThreadList[idx].Leak().Leak()->fStack->Rsp == 0) + if (fThreadList[idx].Leak().Leak()->fStack->SP == 0) continue; - if (fThreadList[idx].Leak().Leak()->fStack->Rbp == 0) + if (fThreadList[idx].Leak().Leak()->fStack->BP == 0) continue; fThreadList[idx].Leak().Leak()->Busy(true); diff --git a/Kernel/Sources/String.cxx b/Kernel/Sources/String.cxx index 8dd4b7bf..cabe9d1b 100644 --- a/Kernel/Sources/String.cxx +++ b/Kernel/Sources/String.cxx @@ -98,7 +98,7 @@ namespace Kernel if (!fmt) return ("-1"); - char* ret = (char*)Alloca(sizeof(char) * 8 + rt_string_len(fmt)); + char* ret = (char*)ALLOCA(sizeof(char) * 8 + rt_string_len(fmt)); if (!ret) return ("-1"); @@ -131,7 +131,7 @@ namespace Kernel ret[idx] = fmt[idx]; } - return ret; /* Copy that ret into a buffer, Alloca allocates to the stack */ + return ret; /* Copy that ret into a buffer, 'ALLOCA' allocates to the stack */ } const char* StringBuilder::FromBool(const char* fmt, bool i) @@ -140,7 +140,7 @@ namespace Kernel return ("?"); const char* boolean_expr = i ? "true" : "false"; - char* ret = (char*)Alloca((sizeof(char) * i) ? 4 : 5 + rt_string_len(fmt)); + char* ret = (char*)ALLOCA((sizeof(char) * i) ? 4 : 5 + rt_string_len(fmt)); if (!ret) return ("?"); @@ -189,7 +189,7 @@ namespace Kernel return ("?"); char* ret = - (char*)Alloca(sizeof(char) * rt_string_len(fmt2) + rt_string_len(fmt2)); + (char*)ALLOCA(sizeof(char) * rt_string_len(fmt2) + rt_string_len(fmt2)); if (!ret) return ("?"); diff --git a/Kernel/Sources/power64-cb.make b/Kernel/Sources/power64-cb.make new file mode 100644 index 00000000..e69de29b diff --git a/Kernel/Sources/rv64-cb.make b/Kernel/Sources/rv64-cb.make new file mode 100644 index 00000000..e69de29b -- cgit v1.2.3