summaryrefslogtreecommitdiffhomepage
path: root/Kernel/Sources
diff options
context:
space:
mode:
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.cxx76
-rw-r--r--Kernel/Sources/Network/IP.cxx4
-rw-r--r--Kernel/Sources/PageAllocator.cxx7
-rw-r--r--Kernel/Sources/SMPManager.cxx4
-rw-r--r--Kernel/Sources/String.cxx8
-rw-r--r--Kernel/Sources/power64-cb.make0
-rw-r--r--Kernel/Sources/rv64-cb.make0
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