diff options
Diffstat (limited to 'Kernel/Sources')
| -rw-r--r-- | Kernel/Sources/CxxAbi-AMD64.cxx (renamed from Kernel/Sources/CxxAbi.cxx) | 7 | ||||
| -rw-r--r-- | Kernel/Sources/CxxAbi-ARM64.cxx | 76 | ||||
| -rw-r--r-- | Kernel/Sources/Network/IP.cxx | 4 | ||||
| -rw-r--r-- | Kernel/Sources/PageAllocator.cxx | 7 | ||||
| -rw-r--r-- | Kernel/Sources/SMPManager.cxx | 4 | ||||
| -rw-r--r-- | Kernel/Sources/String.cxx | 8 | ||||
| -rw-r--r-- | Kernel/Sources/power64-cb.make | 0 | ||||
| -rw-r--r-- | Kernel/Sources/rv64-cb.make | 0 |
8 files changed, 90 insertions, 16 deletions
diff --git a/Kernel/Sources/CxxAbi.cxx b/Kernel/Sources/CxxAbi-AMD64.cxx index febffbc4..9376321c 100644 --- a/Kernel/Sources/CxxAbi.cxx +++ b/Kernel/Sources/CxxAbi-AMD64.cxx @@ -20,17 +20,12 @@ EXTERN_C void __cxa_pure_virtual() Kernel::kcout << "newoskrnl: C++ placeholder method.\n"; } -EXTERN_C void ___chkstk_ms() +EXTERN_C void ___chkstk_ms(void) { 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) 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 <KernelKit/DebugOutput.hpp> +#include <NewKit/CxxAbi.hpp> +#include <KernelKit/HError.hpp> + + +EXTERN_C +{ +#include <limits.h> +} + +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/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<StringView> IPFactory::ToStringView(Ref<RawIPAddress6> ipv6) + ErrorOr<StringView> IPFactory::ToStringView(Ref<RawIPAddress6>& ipv6) { auto str = StringBuilder::Construct(ipv6.Leak().Address()); return str; } - ErrorOr<StringView> IPFactory::ToStringView(Ref<RawIPAddress> ipv4) + ErrorOr<StringView> IPFactory::ToStringView(Ref<RawIPAddress>& 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<PTE*>(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 --- /dev/null +++ b/Kernel/Sources/power64-cb.make diff --git a/Kernel/Sources/rv64-cb.make b/Kernel/Sources/rv64-cb.make new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/Kernel/Sources/rv64-cb.make |
