summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/ArchKit/ArchKit.hpp2
-rw-r--r--Kernel/CRT/__mpcc_defines.hxx2
-rw-r--r--Kernel/FirmwareKit/EFI/API.hxx6
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp2
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMouse.cxx2
-rw-r--r--Kernel/HALKit/AMD64/HalScheduler.cxx (renamed from Kernel/HALKit/AMD64/HalSMPCore.cxx)6
-rw-r--r--Kernel/HALKit/AMD64/Processor.hpp2
-rw-r--r--Kernel/HALKit/ARM64/HalHart.cxx29
-rw-r--r--Kernel/HALKit/ARM64/HalKernelMain.cxx178
-rw-r--r--Kernel/HALKit/ARM64/HalScheduler.cxx31
-rw-r--r--Kernel/HALKit/ARM64/Processor.hxx3
-rw-r--r--Kernel/KernelKit/FileManager.hpp2
-rw-r--r--Kernel/Modules/CoreCG/CoreCG.hxx18
-rw-r--r--Kernel/Modules/CoreCG/CoreIMG.hxx13
-rw-r--r--Kernel/NetworkKit/IP.hpp4
-rw-r--r--Kernel/NewKit/CxxAbi.hpp4
-rw-r--r--Kernel/NewKit/Macros.hpp10
-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
-rw-r--r--Kernel/amd64-efi.make2
-rw-r--r--Kernel/arm64-efi.make (renamed from Kernel/arm64-cb.make)15
27 files changed, 382 insertions, 55 deletions
diff --git a/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp
index 144c4e35..bf9bd8e5 100644
--- a/Kernel/ArchKit/ArchKit.hpp
+++ b/Kernel/ArchKit/ArchKit.hpp
@@ -14,7 +14,7 @@
#include <HALKit/AMD64/HalPageAlloc.hpp>
#include <HALKit/AMD64/Hypervisor.hpp>
#include <HALKit/AMD64/Processor.hpp>
-#elif defined(__NEWOS_PPC__)
+#elif defined(__NEWOS_POWER64__)
#include <HALKit/POWER/Processor.hpp>
#elif defined(__NEWOS_ARM64__)
#include <HALKit/ARM64/Processor.hxx>
diff --git a/Kernel/CRT/__mpcc_defines.hxx b/Kernel/CRT/__mpcc_defines.hxx
index 55bf7b2b..1640ae41 100644
--- a/Kernel/CRT/__mpcc_defines.hxx
+++ b/Kernel/CRT/__mpcc_defines.hxx
@@ -30,7 +30,7 @@ typedef char* caddr_t;
#ifdef __GNUC__
#include <CRT/__mpcc_alloca.hxx>
#define __mpcc_alloca(sz) __mpcc_alloca_gcc(sz)
-#elif defined(__MPCC__)
+#elif defined(__NDK__)
#define __alloca(sz) __mpcc_alloca(sz)
#endif
diff --git a/Kernel/FirmwareKit/EFI/API.hxx b/Kernel/FirmwareKit/EFI/API.hxx
index 7ec87227..d93ea748 100644
--- a/Kernel/FirmwareKit/EFI/API.hxx
+++ b/Kernel/FirmwareKit/EFI/API.hxx
@@ -89,13 +89,13 @@ Bascially frees everything we have in the EFI side.
#endif // ifdef __DEBUG__
#ifdef __NEWBOOT__
- GXInit();
+ CGInit();
- GXDrawImg(NewBootFatal, NEWBOOTFATAL_HEIGHT, NEWBOOTFATAL_WIDTH,
+ CGDrawBitMapInRegion(NewBootFatal, NEWBOOTFATAL_HEIGHT, NEWBOOTFATAL_WIDTH,
(kHandoverHeader->f_GOP.f_Width - NEWBOOTFATAL_WIDTH) / 2,
(kHandoverHeader->f_GOP.f_Height - NEWBOOTFATAL_HEIGHT) / 2);
- GXFini();
+ CGFini();
/// Show the QR code now.
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index ce121da4..275a511b 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -193,7 +193,7 @@ namespace Kernel::HAL
cFramePtr = stackFrame;
/// yes the exception field contains the core id.
- hal_send_start_ipi(stackFrame->Rcx, cSMPInterrupt, cBaseAddressAPIC);
+ hal_send_start_ipi(stackFrame->A0, cSMPInterrupt, cBaseAddressAPIC);
sem.Unlock();
}
diff --git a/Kernel/HALKit/AMD64/HalKernelMouse.cxx b/Kernel/HALKit/AMD64/HalKernelMouse.cxx
index 2aeb8119..df44dd4f 100644
--- a/Kernel/HALKit/AMD64/HalKernelMouse.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMouse.cxx
@@ -23,7 +23,7 @@ STATIC Kernel::PS2MouseInterface kMousePS2;
STATIC Kernel::Char kMousePacket[4] = {};
STATIC Kernel::Boolean kMousePacketReady = false;
-STATIC GXInit();
+STATIC CGInit();
#define kPS2Leftbutton 0b00000001
#define kPS2Middlebutton 0b00000010
diff --git a/Kernel/HALKit/AMD64/HalSMPCore.cxx b/Kernel/HALKit/AMD64/HalScheduler.cxx
index 4cb87542..997b9a13 100644
--- a/Kernel/HALKit/AMD64/HalSMPCore.cxx
+++ b/Kernel/HALKit/AMD64/HalScheduler.cxx
@@ -12,8 +12,8 @@ Void ProcessHeader::SetEntrypoint(UIntPtr& imageStart) noexcept
if (imageStart == 0)
this->Crash();
- this->StackFrame->Rbp = imageStart;
- this->StackFrame->Rsp = this->StackFrame->Rbp;
+ this->StackFrame->BP = imageStart;
+ this->StackFrame->SP = this->StackFrame->BP;
}
namespace Kernel
@@ -22,7 +22,7 @@ namespace Kernel
{
if (!stackPtr)
return false;
- if (stackPtr->Rbp == 0 || stackPtr->Rsp == 0)
+ if (stackPtr->BP == 0 || stackPtr->SP == 0)
return false;
return true;
diff --git a/Kernel/HALKit/AMD64/Processor.hpp b/Kernel/HALKit/AMD64/Processor.hpp
index 756c5770..27c1bfbb 100644
--- a/Kernel/HALKit/AMD64/Processor.hpp
+++ b/Kernel/HALKit/AMD64/Processor.hpp
@@ -155,7 +155,7 @@ namespace Kernel::HAL
struct PACKED StackFrame final
{
Reg IntNum, Exception;
- Reg Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
+ Reg A0, A2, BP, SP, A3, A4, A5, A6;
Reg R8, R9, R10, R11, R12, R13, R14, R15;
Reg Gs, Fs;
};
diff --git a/Kernel/HALKit/ARM64/HalHart.cxx b/Kernel/HALKit/ARM64/HalHart.cxx
new file mode 100644
index 00000000..ab4f9785
--- /dev/null
+++ b/Kernel/HALKit/ARM64/HalHart.cxx
@@ -0,0 +1,29 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <ArchKit/ArchKit.hpp>
+
+// bugs = 0
+
+namespace Kernel
+{
+ /// @brief wakes up thread.
+ /// wakes up thread from hang.
+ void rt_wakeup_thread(HAL::StackFrame* stack)
+ {
+ rt_do_context_switch(stack);
+ }
+
+ /// @brief makes the thread sleep on a loop.
+ /// hooks and hangs thread to prevent code from executing.
+ void rt_hang_thread(HAL::StackFrame* stack)
+ {
+ while (true)
+ {
+ /* nohing, code is spinning */
+ }
+ }
+} // namespace Kernel
diff --git a/Kernel/HALKit/ARM64/HalKernelMain.cxx b/Kernel/HALKit/ARM64/HalKernelMain.cxx
new file mode 100644
index 00000000..3b27f420
--- /dev/null
+++ b/Kernel/HALKit/ARM64/HalKernelMain.cxx
@@ -0,0 +1,178 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <ArchKit/ArchKit.hpp>
+#include <Modules/CoreCG/CoreCG.hxx>
+#include <FirmwareKit/Handover.hxx>
+#include <KernelKit/FileManager.hpp>
+#include <KernelKit/Framebuffer.hpp>
+#include <KernelKit/KernelHeap.hpp>
+#include <KernelKit/PEFCodeManager.hxx>
+#include <KernelKit/ProcessScheduler.hxx>
+#include <KernelKit/UserHeap.hpp>
+#include <NewKit/Json.hpp>
+#include <Modules/CoreCG/Accessibility.hxx>
+#include <KernelKit/CodeManager.hpp>
+#include <Modules/ACPI/ACPIFactoryInterface.hxx>
+#include <NetworkKit/IPCEP.hxx>
+
+#define KERNEL_INIT(X) \
+ X; \
+ Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
+
+/// @brief This symbol is the kernel main symbol.
+EXTERN_C void KeMain();
+
+EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
+
+struct PACKED HeapAllocInfo final
+{
+ Kernel::VoidPtr fThe;
+ Kernel::Size fTheSz;
+};
+
+struct PACKED ProcessBlockInfo final
+{
+ ThreadInformationBlock* fTIB;
+ ThreadInformationBlock* fPIB;
+};
+
+struct PACKED ProcessExitInfo final
+{
+ STATIC constexpr auto cReasonLen = 512;
+
+ Kernel::Int64 fCode;
+ Kernel::Char fReason[cReasonLen];
+};
+
+EXTERN_C void hal_init_platform(
+ Kernel::HEL::HandoverInformationHeader* HandoverHeader)
+{
+ /* Setup globals. */
+
+ kHandoverHeader = HandoverHeader;
+
+ if (kHandoverHeader->f_Magic != kHandoverMagic &&
+ kHandoverHeader->f_Version != kHandoverVersion)
+ {
+ return;
+ }
+
+ kKernelVirtualSize = HandoverHeader->f_VirtualSize;
+ kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
+ reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset);
+
+ kKernelPhysicalStart = HandoverHeader->f_PhysicalStart;
+
+ // Register the basic SCI functions.
+
+ constexpr auto cSerialAlertInterrupt = 0x10;
+ 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 cLPCSanitizeMsg = 0x28;
+
+ kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ const char* msg = (const char*)rdx;
+ Kernel::kcout << "serial: " << msg << "\r";
+ };
+
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ tls_check_syscall_impl(rdx);
+ };
+
+ kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ Kernel::ipc_sanitize_packet(reinterpret_cast<Kernel::IPCEPMessageHeader*>(rdx));
+ };
+
+ kSyscalls[cNewInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ // get HAC struct.
+ HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx);
+
+ if (!rdxInf)
+ return;
+
+ // assign the fThe field with the pointer.
+ rdxInf->fThe = Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().New(rdxInf->fTheSz);
+ };
+
+ kSyscalls[cDeleteInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ // get HAC struct.
+ HeapAllocInfo* rdxInf = reinterpret_cast<HeapAllocInfo*>(rdx);
+
+ if (!rdxInf)
+ return;
+
+ // delete ptr with sz in mind.
+ Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Delete(rdxInf->fThe, rdxInf->fTheSz);
+ };
+
+ kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ ProcessBlockInfo* rdxPb = reinterpret_cast<ProcessBlockInfo*>(rdx);
+
+ if (!rdxPb)
+ return;
+
+ // install the fTIB and fPIB.
+ rt_install_tib(rdxPb->fTIB, rdxPb->fPIB);
+ };
+
+ kSyscalls[cExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx);
+
+ if (!rdxEi)
+ return;
+
+ Kernel::kcout << "newoskrnl: " << rdxEi->fReason << "\r";
+ Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Exit(rdxEi->fCode);
+ };
+
+ kSyscalls[cLastExitInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ ProcessExitInfo* rdxEi = reinterpret_cast<ProcessExitInfo*>(rdx);
+
+ if (!rdxEi)
+ return;
+
+ rdxEi->fCode = Kernel::rt_get_exit_code();
+ };
+
+ kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr);
+ acpi.Reboot();
+ };
+
+ kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr);
+ acpi.Shutdown();
+ };
+
+ kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fHooked = true;
+ 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;
+ kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true;
+
+ KERNEL_INIT(KeMain());
+}
diff --git a/Kernel/HALKit/ARM64/HalScheduler.cxx b/Kernel/HALKit/ARM64/HalScheduler.cxx
new file mode 100644
index 00000000..31f5fa07
--- /dev/null
+++ b/Kernel/HALKit/ARM64/HalScheduler.cxx
@@ -0,0 +1,31 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include <KernelKit/ProcessScheduler.hxx>
+
+using namespace Kernel;
+
+Void ProcessHeader::SetEntrypoint(UIntPtr& imageStart) noexcept
+{
+ if (imageStart == 0)
+ this->Crash();
+
+ this->StackFrame->BP = imageStart;
+ this->StackFrame->SP = this->StackFrame->BP;
+}
+
+namespace Kernel
+{
+ bool rt_check_stack(HAL::StackFramePtr stackPtr)
+ {
+ if (!stackPtr)
+ return false;
+ if (stackPtr->BP == 0 || stackPtr->SP == 0)
+ return false;
+
+ return true;
+ }
+} // namespace Kernel
diff --git a/Kernel/HALKit/ARM64/Processor.hxx b/Kernel/HALKit/ARM64/Processor.hxx
index 631ecdf0..fcffe065 100644
--- a/Kernel/HALKit/ARM64/Processor.hxx
+++ b/Kernel/HALKit/ARM64/Processor.hxx
@@ -36,10 +36,11 @@ namespace Kernel::HAL
typedef UIntPtr Reg;
typedef Register64 Register;
+ /// @note let's keep the same name as AMD64 HAL.
struct PACKED StackFrame final
{
Reg IntNum, Exception;
- Reg Rdi, Rsi, Rbp, Rsp, Rbx, Rdx, Rcx, Rax;
+ Reg A0, A2, BP, SP, A3, A4, A5, A6;
Reg R8, R9, R10, R11, R12, R13, R14, R15;
Reg Gs, Fs;
};
diff --git a/Kernel/KernelKit/FileManager.hpp b/Kernel/KernelKit/FileManager.hpp
index 7f16cfa0..8eb37834 100644
--- a/Kernel/KernelKit/FileManager.hpp
+++ b/Kernel/KernelKit/FileManager.hpp
@@ -157,7 +157,7 @@ namespace Kernel
NodePtr Open(const Char* path, const Char* r) override;
Void Write(NodePtr node, VoidPtr data, Int32 flags, SizeT sz) override;
VoidPtr Read(NodePtr node, Int32 flags, SizeT sz) override;
- bool Seek(NodePtr node, SizeT off);
+ bool Seek(NodePtr node, SizeT off) override;
SizeT Tell(NodePtr node) override;
bool Rewind(NodePtr node) override;
diff --git a/Kernel/Modules/CoreCG/CoreCG.hxx b/Kernel/Modules/CoreCG/CoreCG.hxx
index a0f1ede1..b77a2f28 100644
--- a/Kernel/Modules/CoreCG/CoreCG.hxx
+++ b/Kernel/Modules/CoreCG/CoreCG.hxx
@@ -8,16 +8,16 @@
#include <NewKit/Defines.hpp>
-#define GXInit() Kernel::SizeT __GXCursor = 0
+#define CGInit() Kernel::SizeT __GXCursor = 0
-#define GXRgba(R, G, B) (UInt32)(R | G | B)
+#define CGColor(R, G, B) RGB(R, G, B)
-#define gxClearClr RGB(9d, 9d, 9d)
+#define cCGClearClr CGColor(0x0, 0x0, 0x0)
-#define GXFini() __GXCursor = 0
+#define CGFini() __GXCursor = 0
/// @brief Performs OR drawing on the framebuffer.
-#define GXDrawAlphaImg(ImgPtr, _Height, _Width, BaseX, BaseY) \
+#define CGDrawBitMapInRegionA(ImgPtr, _Height, _Width, BaseX, BaseY) \
__GXCursor = 0; \
\
for (Kernel::SizeT i = BaseX; i < (_Height + BaseX); ++i) \
@@ -34,7 +34,7 @@
}
/// @brief Draws a resource.
-#define GXDrawImg(ImgPtr, _Height, _Width, BaseX, BaseY) \
+#define CGDrawBitMapInRegion(ImgPtr, _Height, _Width, BaseX, BaseY) \
__GXCursor = 0; \
\
for (Kernel::SizeT i = BaseX; i < (_Height + BaseX); ++i) \
@@ -51,7 +51,7 @@
}
/// @brief Cleans a resource.
-#define GXClear(_Height, _Width, BaseX, BaseY) \
+#define CGClearRegion(_Height, _Width, BaseX, BaseY) \
\
for (Kernel::SizeT i = BaseX; i < _Height + BaseX; ++i) \
{ \
@@ -60,12 +60,12 @@
*(((volatile Kernel::UInt32*)(kHandoverHeader->f_GOP.f_The + \
4 * kHandoverHeader->f_GOP.f_PixelPerLine * \
i + \
- 4 * u))) = gxClearClr; \
+ 4 * u))) = cCGClearClr; \
} \
}
/// @brief Draws inside a zone.
-#define GXDraw(_Clr, _Height, _Width, BaseX, BaseY) \
+#define CGDrawInRegion(_Clr, _Height, _Width, BaseX, BaseY) \
\
for (Kernel::SizeT i = BaseX; i < (_Width + BaseX); ++i) \
{ \
diff --git a/Kernel/Modules/CoreCG/CoreIMG.hxx b/Kernel/Modules/CoreCG/CoreIMG.hxx
new file mode 100644
index 00000000..8fb4629d
--- /dev/null
+++ b/Kernel/Modules/CoreCG/CoreIMG.hxx
@@ -0,0 +1,13 @@
+#ifndef __CORECG_IMG_HXX__
+#define __CORECG_IMG_HXX__
+
+#include <NewKit/Defines.hpp>
+
+namespace Kernel
+{
+ struct IMGContainerHeader;
+ struct IMGMetadataHeader;
+
+}
+
+#endif // ifndef __CORECG_IMG_HXX__
diff --git a/Kernel/NetworkKit/IP.hpp b/Kernel/NetworkKit/IP.hpp
index e6ab2e83..ef3aef82 100644
--- a/Kernel/NetworkKit/IP.hpp
+++ b/Kernel/NetworkKit/IP.hpp
@@ -76,8 +76,8 @@ namespace Kernel
class IPFactory final
{
public:
- static ErrorOr<StringView> ToStringView(Ref<RawIPAddress6> ipv6);
- static ErrorOr<StringView> ToStringView(Ref<RawIPAddress> ipv4);
+ static ErrorOr<StringView> ToStringView(Ref<RawIPAddress6>& ipv6);
+ static ErrorOr<StringView> ToStringView(Ref<RawIPAddress>& ipv4);
static bool IpCheckVersion4(const char* ip);
};
} // namespace Kernel
diff --git a/Kernel/NewKit/CxxAbi.hpp b/Kernel/NewKit/CxxAbi.hpp
index 3f858e21..bcab19a7 100644
--- a/Kernel/NewKit/CxxAbi.hpp
+++ b/Kernel/NewKit/CxxAbi.hpp
@@ -7,7 +7,7 @@
#include <NewKit/Defines.hpp>
-#ifdef __GNUC__
+#ifndef __NDK__
#define kDSOMaxObjects (128)
@@ -25,4 +25,4 @@ namespace cxxabiv1
typedef void* __guard;
}
-#endif // __GNUC__ \ No newline at end of file
+#endif // __GNUC__
diff --git a/Kernel/NewKit/Macros.hpp b/Kernel/NewKit/Macros.hpp
index b15cda51..913ad7cf 100644
--- a/Kernel/NewKit/Macros.hpp
+++ b/Kernel/NewKit/Macros.hpp
@@ -86,9 +86,9 @@
#define END_STRING_ENUM() }
#endif
-#ifndef Alloca
-#define Alloca(Sz) __builtin_alloca(Sz)
-#endif // #ifndef Alloca
+#ifndef ALLOCA
+#define ALLOCA(Sz) __builtin_alloca(Sz)
+#endif // #ifndef ALLOCA
#ifndef CANT_REACH
#define CANT_REACH() __builtin_unreachable()
@@ -107,8 +107,8 @@
#define CONST const
#define STRINGIFY(X) #X
-#define NEWOS_UNUSED(X) ((void)X)
+#define NEWOS_UNUSED(X) ((Kernel::Void)X)
#ifndef RGB
-#define RGB(R, G, B) (UInt32)(0x##R##G##B)
+#define RGB(R, G, B) (Kernel::UInt32)(R | G << 0x8 | B << 0x10)
#endif // !RGB
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
diff --git a/Kernel/amd64-efi.make b/Kernel/amd64-efi.make
index b3bb3898..6cb94ac9 100644
--- a/Kernel/amd64-efi.make
+++ b/Kernel/amd64-efi.make
@@ -6,7 +6,7 @@
CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
CCFLAGS = -c -fPIC -ffreestanding -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
- -std=c++20 -D__FSKIT_USE_NEWFS__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./
+ -std=c++20 -D__NEWOS_SUPPORT_NX__ -D__FSKIT_USE_NEWFS__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./
ASM = nasm
diff --git a/Kernel/arm64-cb.make b/Kernel/arm64-efi.make
index fe604b93..cf46cee6 100644
--- a/Kernel/arm64-cb.make
+++ b/Kernel/arm64-efi.make
@@ -3,12 +3,13 @@
# This is the microkernel makefile.
##################################################
-CC = arm-none-eabi-g++ -march=armv8-a
-LD = arm-none-eabi-ld
-CCFLAGS = -c -fPIC -ffreestanding -D__NEWOS_ARM64__ -fno-rtti -fno-exceptions -I./ \
- -std=c++20 -D__FSKIT_USE_NEWFS__ -D__ZETA_MACHINE__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__
+CC = clang++
+LD = lld-link
+CCFLAGS = -c -ffreestanding -MMD -mno-red-zone -D__NEWOS_ARM64__ -fno-rtti -fno-exceptions -I./ \
+ -target aarch64-unknown-windows \
+ -std=c++20 -D__FSKIT_USE_NEWFS__ -D__ZETA_MACHINE__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__
-ASM = arm-none-eabi-as -march=armv8-a
+ASM = clang++
DISKDRIVER = -D__FLASH_MEM__
@@ -22,7 +23,7 @@ endif
COPY = cp
-LDFLAGS = -e __ImageStart
+LDFLAGS = -subsystem:efi_application -entry:hal_init_platform /nodefaultlib
LDOBJ = Objects/*.obj
# This file is the kernel, responsible of task management and memory.
@@ -50,7 +51,7 @@ OBJCOPY=x86_64-w64-mingw32-objcopy
.PHONY: link-arm64-epm
link-arm64-epm:
- $(LD) $(LDFLAGS) $(LDOBJ) -o $(KERNEL)
+ $(LD) $(LDFLAGS) $(LDOBJ) /out:$(KERNEL)
.PHONY: all
all: newos-arm64-epm link-arm64-epm