diff options
Diffstat (limited to 'Kernel')
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 |
