From 4337019afdad1069fdc757733febb7db5b531421 Mon Sep 17 00:00:00 2001 From: Amlal Date: Thu, 11 Jul 2024 14:15:21 +0200 Subject: [META] Update copyright notice. Signed-off-by: Amlal --- Kernel/StorageKit/Storage.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'Kernel/StorageKit/Storage.hpp') diff --git a/Kernel/StorageKit/Storage.hpp b/Kernel/StorageKit/Storage.hpp index a374c6e1..4c38d89d 100644 --- a/Kernel/StorageKit/Storage.hpp +++ b/Kernel/StorageKit/Storage.hpp @@ -1,6 +1,6 @@ /* ------------------------------------------- - Copyright Zeta Electronics Corporation + Copyright ZKA Technologies ------------------------------------------- */ -- cgit v1.2.3 From 384300904e6cf9187e5e4c4d9a8fad740592cacb Mon Sep 17 00:00:00 2001 From: Amlal Date: Thu, 18 Jul 2024 09:43:27 +0200 Subject: [IMP] BootJump has been fixed, LoaderUtils API for CFKit. (Kernel's CoreFoundation like API) [IMP] Add Write for UChar* types. (BTextWriter) Signed-off-by: Amlal --- Boot/BootKit/BootKit.hxx | 1 + Boot/BootKit/ProgramLoader.hxx | 3 +- Boot/Sources/HEL/AMD64/BootJump.S | 11 +-- Boot/Sources/HEL/AMD64/BootMain.cxx | 14 +-- Boot/Sources/HEL/AMD64/BootTextWriter.cxx | 30 +++++++ Boot/Sources/ProgramLoader.cxx | 49 +++++++++-- Kernel/CFKit/LoaderUtils.hxx | 54 ++++++++++++ Kernel/FirmwareKit/Handover.hxx | 2 +- Kernel/HALKit/AMD64/HalKernelMain.cxx | 6 +- Kernel/HALKit/ARM64/HalKernelMain.cxx | 4 +- Kernel/KernelKit/MSDOS.hxx | 18 ---- Kernel/KernelKit/PE.hxx | 24 +++--- Kernel/KernelKit/PEF.hpp | 113 ------------------------- Kernel/KernelKit/PEF.hxx | 113 +++++++++++++++++++++++++ Kernel/KernelKit/PEFCodeManager.hxx | 2 +- Kernel/KernelKit/PEFSharedObject.hxx | 2 +- Kernel/Sources/Main.cxx | 2 +- Kernel/Sources/PEFSharedObject.cxx | 2 +- Kernel/Sources/Storage/NVMEDeviceInterface.cxx | 2 +- Kernel/StorageKit/NVME.hpp | 36 -------- Kernel/StorageKit/NVME.hxx | 36 ++++++++ Kernel/StorageKit/Storage.hpp | 2 +- newoskrnl.files | 4 +- 23 files changed, 316 insertions(+), 214 deletions(-) create mode 100644 Kernel/CFKit/LoaderUtils.hxx delete mode 100644 Kernel/KernelKit/PEF.hpp create mode 100644 Kernel/KernelKit/PEF.hxx delete mode 100644 Kernel/StorageKit/NVME.hpp create mode 100644 Kernel/StorageKit/NVME.hxx (limited to 'Kernel/StorageKit/Storage.hpp') diff --git a/Boot/BootKit/BootKit.hxx b/Boot/BootKit/BootKit.hxx index 16f81696..1b93bd30 100644 --- a/Boot/BootKit/BootKit.hxx +++ b/Boot/BootKit/BootKit.hxx @@ -66,6 +66,7 @@ public: BTextWriter& Write(const Char* str); BTextWriter& Write(const CharacterTypeUTF16* str); BTextWriter& WriteCharacter(CharacterTypeUTF16 c); + BTextWriter& Write(const UChar* str); public: explicit BTextWriter() = default; diff --git a/Boot/BootKit/ProgramLoader.hxx b/Boot/BootKit/ProgramLoader.hxx index 6f789d37..90f8996f 100644 --- a/Boot/BootKit/ProgramLoader.hxx +++ b/Boot/BootKit/ProgramLoader.hxx @@ -35,7 +35,8 @@ namespace Boot private: Char fBlobName[255]; + Char* fStackPtr{nullptr}; VoidPtr fStartAddress{nullptr}; VoidPtr fBlob{nullptr}; }; -} // namespace Boot \ No newline at end of file +} // namespace Boot diff --git a/Boot/Sources/HEL/AMD64/BootJump.S b/Boot/Sources/HEL/AMD64/BootJump.S index e807ab52..fc7b3c68 100644 --- a/Boot/Sources/HEL/AMD64/BootJump.S +++ b/Boot/Sources/HEL/AMD64/BootJump.S @@ -8,11 +8,12 @@ @brief this function setups a stack and then jumps to a function */ rt_jump_to_address: - mov rdx, rsp - mov rdi, rcx - mov rdx, rbp + mov r8, rsp + push rax - mov r8, rcx - call rdi + push rdx + jmp rcx + pop rdx pop rax + ret diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx index 51f8e8cf..8946aadc 100644 --- a/Boot/Sources/HEL/AMD64/BootMain.cxx +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include #include #include @@ -121,8 +121,8 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, vendorTable[4] == 'P' && vendorTable[5] == 'T' && vendorTable[6] == 'R' && vendorTable[7] == ' ') { - writer.Write(L"newosldr: filling rsdptr...\r"); - handoverHdrPtr->f_HardwareTables.f_RsdPtr = (VoidPtr)vendorTable; + writer.Write(L"newosldr: Filling rsdptr...\r"); + handoverHdrPtr->f_HardwareTables.f_VendorPtr = (VoidPtr)vendorTable; break; } @@ -149,8 +149,8 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, kHandoverHeader = handoverHdrPtr; - // check if we are in AMD64 -#if defined(__NEWOS_AMD64__) + // check if we are running in the PC platform. If so abort. +#if defined(__NEWOS_AMD64__) && !defined(__DEBUG__) writer.Write(L"\rnewosldr: AMD64 support is not official.\r"); EFI::ThrowError(L"Beta-Software", L"Beta Software."); #endif @@ -244,10 +244,10 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, #ifdef __NEWOS_OTA__ if (loader) loader->Start(handoverHdrPtr); +#else + hal_init_platform(handoverHdrPtr); #endif // ifdef __NEWOS_OTA__ - hal_init_platform(handoverHdrPtr); - EFI::Stop(); CANT_REACH(); diff --git a/Boot/Sources/HEL/AMD64/BootTextWriter.cxx b/Boot/Sources/HEL/AMD64/BootTextWriter.cxx index 18f32bd8..7b0ab50c 100644 --- a/Boot/Sources/HEL/AMD64/BootTextWriter.cxx +++ b/Boot/Sources/HEL/AMD64/BootTextWriter.cxx @@ -85,6 +85,36 @@ BTextWriter& BTextWriter::Write(const Char* str) return *this; } +BTextWriter& BTextWriter::Write(const UChar* str) +{ +#ifdef __DEBUG__ + if (!str || *str == 0) + return *this; + + CharacterTypeUTF16 strTmp[2]; + strTmp[1] = 0; + + for (size_t i = 0; str[i] != 0; i++) + { + if (str[i] == '\r') + { + strTmp[0] = str[i]; + ST->ConOut->OutputString(ST->ConOut, strTmp); + + strTmp[0] = '\n'; + ST->ConOut->OutputString(ST->ConOut, strTmp); + } + else + { + strTmp[0] = str[i]; + ST->ConOut->OutputString(ST->ConOut, strTmp); + } + } +#endif // ifdef __DEBUG__ + + return *this; +} + /** @brief putc wrapper over EFI ConOut. */ diff --git a/Boot/Sources/ProgramLoader.cxx b/Boot/Sources/ProgramLoader.cxx index 88e2f14a..5938c2a0 100644 --- a/Boot/Sources/ProgramLoader.cxx +++ b/Boot/Sources/ProgramLoader.cxx @@ -8,7 +8,10 @@ #include #include -#include +#include +#include +#include +#include EXTERN_C { @@ -17,6 +20,8 @@ EXTERN_C namespace Boot { + EXTERN_C Int32 rt_jump_to_address(HEL::HandoverProc baseCode, HEL::HandoverInformationHeader* handover, Char* stackPointer); + ProgramLoader::ProgramLoader(VoidPtr blob) : fBlob(blob), fStartAddress(nullptr) { @@ -34,9 +39,21 @@ namespace Boot if (firstBytes[0] == kMagMz0 && firstBytes[1] == kMagMz1) { + writer.Write("newosldr: MZ executable detected.\r"); + + ExecHeaderPtr hdrPtr = (ldr_find_exec_header(firstBytes)); + ExecOptionalHeaderPtr optHdr = (ldr_find_opt_exec_header(firstBytes)); + // Parse PE32+ - fStartAddress = nullptr; - writer.Write("newosldr: MZ executable detected.\r"); + fStartAddress = (VoidPtr)((UIntPtr)optHdr->mImageBase + optHdr->mBaseOfCode + optHdr->mAddressOfEntryPoint); + fStackPtr = new Char[optHdr->mSizeOfStackReserve]; + + writer.Write("newosldr: Major Linker: ").Write(optHdr->mMajorLinkerVersion).Write("\r"); + writer.Write("newosldr: Minor Linker: ").Write(optHdr->mMinorLinkerVersion).Write("\r"); + writer.Write("newosldr: Major Subsystem: ").Write(optHdr->mMajorSubsystemVersion).Write("\r"); + writer.Write("newosldr: Minor Subsystem: ").Write(optHdr->mMinorSubsystemVersion).Write("\r"); + writer.Write("newosldr: Magic: ").Write(optHdr->mMagic).Write("\r"); + writer.Write("newosldr: StartAddress: ").Write((UIntPtr)optHdr->mImageBase + optHdr->mBaseOfCode + optHdr->mAddressOfEntryPoint).Write("\r"); } else if (firstBytes[0] == kPefMagic[0] && firstBytes[1] == kPefMagic[1] && @@ -56,18 +73,34 @@ namespace Boot /// @note handover header has to be valid! Void ProgramLoader::Start(HEL::HandoverInformationHeader* handover) { - MUST_PASS(handover); + BTextWriter writer; + + if (!handover) + { + writer.Write("newosldr: Exec format error.\r"); + return; + } - BTextWriter writer; writer.Write("newosldr: Trying to run: ").Write(fBlobName).Write("\r"); - if (!fStartAddress) + if (!fStartAddress || + ((Char*)fStartAddress)[0] == 0x0) { - writer.Write("newosldr: Exec format error.\r"); + HEL::HandoverProc fn = [](HEL::HandoverInformationHeader* rcx) -> void { + BTextWriter writer; + writer.Write("newosldr: Exec format error, Thread has been aborted.\r"); + + EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted.)"); + }; + + rt_jump_to_address(fn, handover, fStackPtr); + return; } - ((HEL::HandoverProc)fStartAddress)(handover); + HEL::HandoverProc start = reinterpret_cast((UIntPtr)fStartAddress); + + rt_jump_to_address(start, handover, fStackPtr); } const Char* ProgramLoader::GetName() diff --git a/Kernel/CFKit/LoaderUtils.hxx b/Kernel/CFKit/LoaderUtils.hxx new file mode 100644 index 00000000..3edacc67 --- /dev/null +++ b/Kernel/CFKit/LoaderUtils.hxx @@ -0,0 +1,54 @@ +#ifndef __CFKIT_LOADER_UTILS_HXX__ +#define __CFKIT_LOADER_UTILS_HXX__ + +#include +#include + +namespace Kernel +{ + /// @brief Find the PE header inside the blob. + inline auto ldr_find_exec_header(DosHeaderPtr ptrDos) -> ExecHeaderPtr + { + if (!ptrDos) + return nullptr; + + if (ptrDos->eMagic[0] != kMagMz0) + return nullptr; + + if (ptrDos->eMagic[1] != kMagMz1) + return nullptr; + + return (ExecHeaderPtr)(VoidPtr)(&ptrDos->eLfanew + 1); + } + + /// @brief Find the PE optional header inside the blob. + inline auto ldr_find_opt_exec_header(DosHeaderPtr ptrDos) -> ExecOptionalHeaderPtr + { + if (!ptrDos) + return nullptr; + + auto exec = ldr_find_exec_header(ptrDos); + + if (!exec) + return nullptr; + + return (ExecOptionalHeaderPtr)(VoidPtr)(&exec->mCharacteristics + 1); + } + + /// @brief Find the PE header inside the blob. + /// @note overloaded function. + inline auto ldr_find_exec_header(const Char* ptrDos) -> ExecHeaderPtr + { + return ldr_find_exec_header((DosHeaderPtr)ptrDos); + } + + + /// @brief Find the PE header inside the blob. + /// @note overloaded function. + inline auto ldr_find_opt_exec_header(const Char* ptrDos) -> ExecOptionalHeaderPtr + { + return ldr_find_opt_exec_header((DosHeaderPtr)ptrDos); + } +} // namespace Kernel + +#endif // ifndef __CFKIT_LOADER_UTILS_HXX__ diff --git a/Kernel/FirmwareKit/Handover.hxx b/Kernel/FirmwareKit/Handover.hxx index d6c3a1a2..01f2be2c 100644 --- a/Kernel/FirmwareKit/Handover.hxx +++ b/Kernel/FirmwareKit/Handover.hxx @@ -76,7 +76,7 @@ it tells us more about it and IS format independent. struct { VoidPtr f_SmBios; - VoidPtr f_RsdPtr; + VoidPtr f_VendorPtr; } f_HardwareTables; struct diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 9c7f571e..ad031b8b 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -196,12 +196,12 @@ EXTERN_C void hal_init_platform( }; kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); acpi.Reboot(); }; kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); acpi.Shutdown(); }; @@ -229,7 +229,7 @@ EXTERN_C void hal_init_platform( cAutoFormatDisk.GetKey() = strAutoMount; cAutoFormatDisk.GetValue() = Yes; - Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); mInitKernel(KeMain()); } diff --git a/Kernel/HALKit/ARM64/HalKernelMain.cxx b/Kernel/HALKit/ARM64/HalKernelMain.cxx index 5e66a3d8..a2d215f6 100644 --- a/Kernel/HALKit/ARM64/HalKernelMain.cxx +++ b/Kernel/HALKit/ARM64/HalKernelMain.cxx @@ -154,12 +154,12 @@ EXTERN_C void hal_init_platform( }; kSyscalls[cRebootInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); acpi.Reboot(); }; kSyscalls[cShutdownInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void { - Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_RsdPtr); + Kernel::ACPIFactoryInterface acpi(kHandoverHeader->f_HardwareTables.f_VendorPtr); acpi.Shutdown(); }; diff --git a/Kernel/KernelKit/MSDOS.hxx b/Kernel/KernelKit/MSDOS.hxx index a7da9e86..62fc1c64 100644 --- a/Kernel/KernelKit/MSDOS.hxx +++ b/Kernel/KernelKit/MSDOS.hxx @@ -49,22 +49,4 @@ typedef struct _DosHeader DosLong eLfanew; } DosHeader, *DosHeaderPtr; -namespace Kernel -{ - /// @brief Find the PE header inside the the blob. - inline auto rt_find_exec_header(DosHeaderPtr ptrDos) -> VoidPtr - { - if (!ptrDos) - return nullptr; - - if (ptrDos->eMagic[0] != kMagMz0) - return nullptr; - - if (ptrDos->eMagic[1] != kMagMz1) - return nullptr; - - return (VoidPtr)(&ptrDos->eLfanew + 1); - } -} // namespace Kernel - #endif /* ifndef __MSDOS_EXEC__ */ diff --git a/Kernel/KernelKit/PE.hxx b/Kernel/KernelKit/PE.hxx index d494c5aa..debd6aba 100644 --- a/Kernel/KernelKit/PE.hxx +++ b/Kernel/KernelKit/PE.hxx @@ -11,13 +11,19 @@ ------------------------------------------- */ -#ifndef __PE__ -#define __PE__ +#ifndef __KERNELKIT_INC_PE_HXX__ +#define __KERNELKIT_INC_PE_HXX__ #include #define kPeMagic 0x00004550 +#define kMagPE32 0x010b +#define kMagPE64 0x020b + +#define kPEMachineAMD64 0x8664 +#define kPEMachineARM64 0xaa64 + typedef struct ExecHeader final { Kernel::UInt32 mMagic; // PE\0\0 or 0x00004550 @@ -30,12 +36,6 @@ typedef struct ExecHeader final Kernel::UInt16 mCharacteristics; } PACKED ExecHeader, *ExecHeaderPtr; -#define kMagPE32 0x010b -#define kMagPE64 0x020b - -#define kPEMachineAMD64 0x8664 -#define kPEMachineARM64 0xaa64 - typedef struct ExecOptionalHeader final { Kernel::UInt16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit) @@ -71,17 +71,17 @@ typedef struct ExecOptionalHeader final typedef struct ExecSectionHeader final { - CONST Kernel::UChar mName[8]; + Kernel::UChar mName[8]; Kernel::UInt32 mVirtualSize; Kernel::UInt32 mVirtualAddress; Kernel::UInt32 mSizeOfRawData; Kernel::UInt32 mPointerToRawData; Kernel::UInt32 mPointerToRelocations; - Kernel::UInt32 mPointerToLinenumbers; + Kernel::UInt32 mPointerToLineNumbers; Kernel::UInt16 mNumberOfRelocations; Kernel::UInt16 mNumberOfLinenumbers; Kernel::UInt32 mCharacteristics; -} PACKED ExecSectionHeader, *ExecSectionHeaderPtr; +} ExecSectionHeader, *ExecSectionHeaderPtr; enum kExecDataDirParams { @@ -120,4 +120,4 @@ typedef struct ExecImportDirectory #define kPeStart "__ImageStart" -#endif /* ifndef __PE__ */ +#endif /* ifndef __KERNELKIT_INC_PE_HXX__ */ diff --git a/Kernel/KernelKit/PEF.hpp b/Kernel/KernelKit/PEF.hpp deleted file mode 100644 index da8d7aa0..00000000 --- a/Kernel/KernelKit/PEF.hpp +++ /dev/null @@ -1,113 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - - File: PEF.hpp - Purpose: Preferred Executable Format for Kernel. - - Revision History: - - ?/?/23: Added file (amlel) - -------------------------------------------- */ - -#ifndef __INC_PEF_HPP__ -#define __INC_PEF_HPP__ - -#include -#include -#include - -#define kPefMagic "Joy!" -#define kPefMagicFat "yoJ!" - -#define kPefMagicLen 5 - -#define kPefVersion 1 -#define kPefNameLen 255 - -namespace Kernel -{ - enum - { - kPefArchIntel86S, - kPefArchAMD64, - kPefArchRISCV, - kPefArch64x0, /* 64x0. ISA */ - kPefArch32x0, /* 32x0. ISA */ - kPefArchPowerPC, - kPefArchARM64, - kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1, - kPefArchInvalid = 0xFF, - }; - - enum - { - kPefSubArchAMD, - kPefSubArchIntel, - kPefSubArchGeneric, - kPefSubArchIBM, - }; - - enum - { - kPefKindExec = 1, /* .exe */ - kPefKindSharedObject = 2, /* .lib */ - kPefKindObject = 4, /* .obj */ - kPefKindDebug = 5, /* .dbg */ - kPefKindDriver = 6, - kPefKindCount, - }; - - typedef struct PEFContainer final - { - Char Magic[kPefMagicLen]; - UInt32 Linker; - UInt32 Version; - UInt32 Kind; - UInt32 Abi; - UInt32 Cpu; - UInt32 SubCpu; /* Cpu specific information */ - UIntPtr Start; - SizeT HdrSz; /* Size of header */ - SizeT Count; /* container header count */ - } PACKED PEFContainer; - - /* First PEFCommandHeader starts after PEFContainer */ - - typedef struct PEFCommandHeader final - { - Char Name[kPefNameLen]; /* container name */ - UInt32 Cpu; /* container cpu */ - UInt32 SubCpu; /* container sub-cpu */ - UInt32 Flags; /* container flags */ - UInt16 Kind; /* container kind */ - UIntPtr Offset; /* content offset */ - SizeT Size; /* content Size */ - } PACKED PEFCommandHeader; - - enum - { - kPefCode = 0xC, - kPefData = 0xD, - kPefZero = 0xE, - kPefLinkerID = 0x1, - }; -} // namespace Kernel - -/* not mandatory, only for non fork based filesystems */ -#define kPefExt ".exec" -#define kPefDylibExt ".lib" -#define kPefLibExt ".slib" -#define kPefObjectExt ".obj" -#define kPefDebugExt ".dbg" - -// Kernel System Binary Interface. -#define kPefAbi (0x5046) - -#define kPefStart "__ImageStart" - -#define kPefForkKind kPefMagic -#define kPefForkKindFAT kPefMagicFat - -#endif /* ifndef __INC_PEF_HPP__ */ diff --git a/Kernel/KernelKit/PEF.hxx b/Kernel/KernelKit/PEF.hxx new file mode 100644 index 00000000..c3b1b94b --- /dev/null +++ b/Kernel/KernelKit/PEF.hxx @@ -0,0 +1,113 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + + File: PEF.hxx + Purpose: Preferred Executable Format for Kernel. + + Revision History: + + ?/?/23: Added file (amlel) + +------------------------------------------- */ + +#ifndef __KERNELKIT_INC_PEF_HXX__ +#define __KERNELKIT_INC_PEF_HXX__ + +#include +#include +#include + +#define kPefMagic "Joy!" +#define kPefMagicFat "yoJ!" + +#define kPefMagicLen 5 + +#define kPefVersion 1 +#define kPefNameLen 255 + +namespace Kernel +{ + enum + { + kPefArchIntel86S, + kPefArchAMD64, + kPefArchRISCV, + kPefArch64x0, /* 64x0. ISA */ + kPefArch32x0, /* 32x0. ISA */ + kPefArchPowerPC, + kPefArchARM64, + kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1, + kPefArchInvalid = 0xFF, + }; + + enum + { + kPefSubArchAMD, + kPefSubArchIntel, + kPefSubArchGeneric, + kPefSubArchIBM, + }; + + enum + { + kPefKindExec = 1, /* .exe */ + kPefKindSharedObject = 2, /* .lib */ + kPefKindObject = 4, /* .obj */ + kPefKindDebug = 5, /* .dbg */ + kPefKindDriver = 6, + kPefKindCount, + }; + + typedef struct PEFContainer final + { + Char Magic[kPefMagicLen]; + UInt32 Linker; + UInt32 Version; + UInt32 Kind; + UInt32 Abi; + UInt32 Cpu; + UInt32 SubCpu; /* Cpu specific information */ + UIntPtr Start; + SizeT HdrSz; /* Size of header */ + SizeT Count; /* container header count */ + } PACKED PEFContainer; + + /* First PEFCommandHeader starts after PEFContainer */ + + typedef struct PEFCommandHeader final + { + Char Name[kPefNameLen]; /* container name */ + UInt32 Cpu; /* container cpu */ + UInt32 SubCpu; /* container sub-cpu */ + UInt32 Flags; /* container flags */ + UInt16 Kind; /* container kind */ + UIntPtr Offset; /* content offset */ + SizeT Size; /* content Size */ + } PACKED PEFCommandHeader; + + enum + { + kPefCode = 0xC, + kPefData = 0xD, + kPefZero = 0xE, + kPefLinkerID = 0x1, + }; +} // namespace Kernel + +/* not mandatory, only for non fork based filesystems */ +#define kPefExt ".exec" +#define kPefDylibExt ".lib" +#define kPefLibExt ".slib" +#define kPefObjectExt ".obj" +#define kPefDebugExt ".dbg" + +// Kernel System Binary Interface. +#define kPefAbi (0x5046) + +#define kPefStart "__ImageStart" + +#define kPefForkKind kPefMagic +#define kPefForkKindFAT kPefMagicFat + +#endif /* ifndef __KERNELKIT_INC_PEF_HXX__ */ diff --git a/Kernel/KernelKit/PEFCodeManager.hxx b/Kernel/KernelKit/PEFCodeManager.hxx index 79c9d0ab..5e48331a 100644 --- a/Kernel/KernelKit/PEFCodeManager.hxx +++ b/Kernel/KernelKit/PEFCodeManager.hxx @@ -7,7 +7,7 @@ #ifndef _INC_CODE_MANAGER_PEF_HXX_ #define _INC_CODE_MANAGER_PEF_HXX_ -#include +#include #include #include #include diff --git a/Kernel/KernelKit/PEFSharedObject.hxx b/Kernel/KernelKit/PEFSharedObject.hxx index a583ad70..f8119971 100644 --- a/Kernel/KernelKit/PEFSharedObject.hxx +++ b/Kernel/KernelKit/PEFSharedObject.hxx @@ -11,7 +11,7 @@ #define __KERNELKIT_SHARED_OBJECT_HXX__ #include -#include +#include #include #include diff --git a/Kernel/Sources/Main.cxx b/Kernel/Sources/Main.cxx index b4751110..92dac251 100644 --- a/Kernel/Sources/Main.cxx +++ b/Kernel/Sources/Main.cxx @@ -14,7 +14,7 @@ #include #include #include -#include +#include #include #include #include diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx index e131f7ce..a5928f1b 100644 --- a/Kernel/Sources/PEFSharedObject.cxx +++ b/Kernel/Sources/PEFSharedObject.cxx @@ -8,7 +8,7 @@ */ #include -#include +#include #include #include #include diff --git a/Kernel/Sources/Storage/NVMEDeviceInterface.cxx b/Kernel/Sources/Storage/NVMEDeviceInterface.cxx index e1d4ed30..f4f0f667 100644 --- a/Kernel/Sources/Storage/NVMEDeviceInterface.cxx +++ b/Kernel/Sources/Storage/NVMEDeviceInterface.cxx @@ -4,7 +4,7 @@ ------------------------------------------- */ -#include +#include namespace Kernel { diff --git a/Kernel/StorageKit/NVME.hpp b/Kernel/StorageKit/NVME.hpp deleted file mode 100644 index f1601149..00000000 --- a/Kernel/StorageKit/NVME.hpp +++ /dev/null @@ -1,36 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#pragma once - -#include -#include -#include - -namespace Kernel -{ - class NVMEDeviceInterface final : public DeviceInterface - { - public: - explicit NVMEDeviceInterface(void (*Out)(MountpointInterface* outpacket), - void (*In)(MountpointInterface* inpacket), - void (*Cleanup)(void)); - - ~NVMEDeviceInterface() override; - - public: - NVMEDeviceInterface& operator=(const NVMEDeviceInterface&) = default; - NVMEDeviceInterface(const NVMEDeviceInterface&) = default; - - const char* Name() const override; - - public: - OwnPtr operator()(UInt32 dmaLow, UInt32 dmaHigh, SizeT sz); - - private: - void (*fCleanup)(void) = {nullptr}; - }; -} // namespace Kernel diff --git a/Kernel/StorageKit/NVME.hxx b/Kernel/StorageKit/NVME.hxx new file mode 100644 index 00000000..f1601149 --- /dev/null +++ b/Kernel/StorageKit/NVME.hxx @@ -0,0 +1,36 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#pragma once + +#include +#include +#include + +namespace Kernel +{ + class NVMEDeviceInterface final : public DeviceInterface + { + public: + explicit NVMEDeviceInterface(void (*Out)(MountpointInterface* outpacket), + void (*In)(MountpointInterface* inpacket), + void (*Cleanup)(void)); + + ~NVMEDeviceInterface() override; + + public: + NVMEDeviceInterface& operator=(const NVMEDeviceInterface&) = default; + NVMEDeviceInterface(const NVMEDeviceInterface&) = default; + + const char* Name() const override; + + public: + OwnPtr operator()(UInt32 dmaLow, UInt32 dmaHigh, SizeT sz); + + private: + void (*fCleanup)(void) = {nullptr}; + }; +} // namespace Kernel diff --git a/Kernel/StorageKit/Storage.hpp b/Kernel/StorageKit/Storage.hpp index 4c38d89d..981463ab 100644 --- a/Kernel/StorageKit/Storage.hpp +++ b/Kernel/StorageKit/Storage.hpp @@ -7,7 +7,7 @@ #pragma once #include -#include +#include #include #include diff --git a/newoskrnl.files b/newoskrnl.files index 92e48082..43039950 100644 --- a/newoskrnl.files +++ b/newoskrnl.files @@ -171,7 +171,7 @@ Kernel/KernelKit/PCI/Iterator.hpp Kernel/KernelKit/PCI/PCI.hpp Kernel/KernelKit/PE.hxx Kernel/KernelKit/PECodeManager.hxx -Kernel/KernelKit/PEF.hpp +Kernel/KernelKit/PEF.hxx Kernel/KernelKit/PEFCodeManager.hxx Kernel/KernelKit/PEFSharedObject.hxx Kernel/KernelKit/PermissionSelector.hxx @@ -300,7 +300,7 @@ Kernel/Sources/Variant.cxx Kernel/Sources/compile_flags.txt Kernel/StorageKit/AHCI.hpp Kernel/StorageKit/ATA.hpp -Kernel/StorageKit/NVME.hpp +Kernel/StorageKit/NVME.hxx Kernel/StorageKit/PRDT.hpp Kernel/StorageKit/SCSI.hxx Kernel/StorageKit/Storage.hpp -- cgit v1.2.3 From d42e9fa42af70105346f14c8b48f60cd3f4ea845 Mon Sep 17 00:00:00 2001 From: Amlal EL Mahrouss Date: Sun, 28 Jul 2024 08:37:45 +0200 Subject: [IMP] New Storage.hpp inside StorageKit. [REFACTOR] Process heap adjustements. [WIP] SMP and Ring-3 switch for scheduler core. Signed-off-by: Amlal EL Mahrouss --- .vscode/c_cpp_properties.json | 22 +++------ Kernel/HALKit/AMD64/HalDebugOutput.cxx | 18 ++------ Kernel/HALKit/AMD64/HalDescriptorLoader.cxx | 9 ++-- Kernel/HALKit/AMD64/HalInstallTIB.asm | 19 ++++++++ Kernel/HALKit/AMD64/HalPageAlloc.hxx | 4 ++ Kernel/HALKit/AMD64/Processor.hxx | 3 ++ Kernel/HALKit/POWER/HalSerialPort.cxx | 2 +- Kernel/Sources/HalPageAlloc.cxx | 8 ++-- Kernel/Sources/ProcessHeap.cxx | 71 +++++++++++++++-------------- Kernel/Sources/ProcessScheduler.cxx | 8 +++- Kernel/Sources/Utils.cxx | 2 +- Kernel/StorageKit/Storage.hpp | 20 +++++--- Kernel/amd64-efi.make | 2 +- 13 files changed, 106 insertions(+), 82 deletions(-) (limited to 'Kernel/StorageKit/Storage.hpp') diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json index 87bb07f6..1c195e89 100644 --- a/.vscode/c_cpp_properties.json +++ b/.vscode/c_cpp_properties.json @@ -6,9 +6,7 @@ "${workspaceFolder}/Kernel/**", "${workspaceFolder}/Drv/**", "${workspaceFolder}/Boot/**", - "${workspaceFolder}/**", - "${workspaceFolder}/Usr/Sys/CoreSystem/**", - "${workspaceFolder}/Usr/Sys/**" + "${workspaceFolder}/**" ], "defines": [ "__MAHROUSS__", @@ -18,30 +16,21 @@ "__FSKIT_USE_NEWFS__", "__EFI_x86_64__", "__ATA_PIO__", - "__NEWOS_AMD64__" + "__NEWOS_AMD64__", + "__DEBUG__" ], "cStandard": "c17", "cppStandard": "c++20", "compilerPath": "/opt/homebrew/bin/x86_64-w64-mingw32-gcc", "intelliSenseMode": "gcc-x64" }, - { - "name": "AppDev ", - "includePath": ["${workspaceFolder}/Usr/Developer/**"], - "defines": [], - "cStandard": "c17", - "cppStandard": "c++20", - "intelliSenseMode": "gcc-x64" - }, { "name": "MicroKernel (Windows)", "includePath": [ "${workspaceFolder}/Drv/**", "${workspaceFolder}/Kernel/**", "${workspaceFolder}/Boot/**", - "${workspaceFolder}/**", - "${workspaceFolder}/Usr/Sys/CoreSystem/**", - "${workspaceFolder}/Usr/Sys/**" + "${workspaceFolder}/**" ], "defines": [ "__MAHROUSS__", @@ -51,7 +40,8 @@ "__FSKIT_USE_NEWFS__", "__EFI_x86_64__", "__ATA_PIO__", - "__NEWOS_AMD64__" + "__NEWOS_AMD64__", + "__DEBUG__" ], "cStandard": "c17", "cppStandard": "c++20", diff --git a/Kernel/HALKit/AMD64/HalDebugOutput.cxx b/Kernel/HALKit/AMD64/HalDebugOutput.cxx index 9e3dfcd8..36ae96b0 100644 --- a/Kernel/HALKit/AMD64/HalDebugOutput.cxx +++ b/Kernel/HALKit/AMD64/HalDebugOutput.cxx @@ -27,7 +27,7 @@ namespace Kernel /// @brief Init COM1. /// @return - bool serial_init() noexcept + bool hal_serial_init() noexcept { #ifdef __DEBUG__ if (kState == kStateReady || kState == kStateTransmit) @@ -64,7 +64,7 @@ namespace Kernel EXTERN_C void ke_io_write(const char* bytes) { #ifdef __DEBUG__ - Detail::serial_init(); + Detail::hal_serial_init(); if (!bytes || Detail::kState != kStateReady) return; @@ -74,18 +74,10 @@ namespace Kernel Detail::kState = kStateTransmit; SizeT index = 0; - SizeT len = rt_string_len(bytes, 0); - - const auto cColor = "\x1b[1;32m"; - SizeT lenClr = rt_string_len(cColor, 0); - - while (index < lenClr) - { - HAL::Out8(Detail::PORT, cColor[index]); - ++index; - } + SizeT len = 0; index = 0; + len = rt_string_len(bytes, 255); while (index < len) { @@ -103,7 +95,7 @@ namespace Kernel EXTERN_C void ke_io_read(const char* bytes) { #ifdef __DEBUG__ - Detail::serial_init(); + Detail::hal_serial_init(); if (!bytes || Detail::kState != kStateReady) return; diff --git a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx index d0ac4e12..7ded9259 100644 --- a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx +++ b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx @@ -61,13 +61,14 @@ namespace Kernel::HAL { MUST_PASS(baseIdt[i]); - Detail::kInterruptVectorTable[i].Selector = kGdtCodeSelector; + Detail::kInterruptVectorTable[i].Selector = (i == kSyscallRoute) ? ((3 * 8) | 3) : kGdtCodeSelector; Detail::kInterruptVectorTable[i].Ist = 0x0; Detail::kInterruptVectorTable[i].TypeAttributes = kInterruptGate; - Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & 0xFFFF); - Detail::kInterruptVectorTable[i].OffsetMid = (((UIntPtr)baseIdt[i] >> 16) & 0xFFFF); + Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & __INT16_MAX__); + Detail::kInterruptVectorTable[i].OffsetMid = (((UIntPtr)baseIdt[i] >> 16) & __INT16_MAX__); Detail::kInterruptVectorTable[i].OffsetHigh = - (((UIntPtr)baseIdt[i] >> 32) & 0xFFFFFFFF); + (((UIntPtr)baseIdt[i] >> 32) & __INT32_MAX__); + Detail::kInterruptVectorTable[i].Zero = 0x0; } diff --git a/Kernel/HALKit/AMD64/HalInstallTIB.asm b/Kernel/HALKit/AMD64/HalInstallTIB.asm index 477018c0..00fe2ad8 100644 --- a/Kernel/HALKit/AMD64/HalInstallTIB.asm +++ b/Kernel/HALKit/AMD64/HalInstallTIB.asm @@ -22,3 +22,22 @@ rt_install_tib: ret ;; //////////////////////////////////////////////////// ;; + +[global rt_jump_user_mode] + +;; @used rcx, address to jump on. +;; @note adjusted for long mode. +rt_jump_user_mode: + mov ax, (6 * 8) | 3 ; user data segment with RPL 3 + mov ds, ax + mov es, ax + mov fs, ax + mov gs, ax ; SS is handled by iret + + mov rax, rsp + push (6 * 8) | 3 + push rax + pushf + push (5 * 8) | 3 + push rcx + iretq diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.hxx b/Kernel/HALKit/AMD64/HalPageAlloc.hxx index 3166a46e..6e05e58e 100644 --- a/Kernel/HALKit/AMD64/HalPageAlloc.hxx +++ b/Kernel/HALKit/AMD64/HalPageAlloc.hxx @@ -26,6 +26,10 @@ #define kPTESize (0x1000) #endif // !kPTESize +#ifndef kAlign +#define kAlign __BIGGEST_ALIGNMENT__ +#endif // !kAlign + EXTERN_C void hal_flush_tlb(); EXTERN_C void hal_write_cr3(Kernel::UIntPtr pde); EXTERN_C void hal_write_cr0(Kernel::UIntPtr bit); diff --git a/Kernel/HALKit/AMD64/Processor.hxx b/Kernel/HALKit/AMD64/Processor.hxx index 9571cbfe..92b91c70 100644 --- a/Kernel/HALKit/AMD64/Processor.hxx +++ b/Kernel/HALKit/AMD64/Processor.hxx @@ -30,6 +30,8 @@ EXTERN_C #define kCPUBackendName "AMD64" +#define kSyscallRoute 0x32 + #define IsActiveLow(FLG) (FLG & 2) #define IsLevelTriggered(FLG) (FLG & 8) @@ -37,6 +39,7 @@ EXTERN_C #define kTrapGate (0xEF) #define kTaskGate (0b10001100) #define kGdtCodeSelector (0x08) +#define kGdtUserCodeSelector (0x10) #define cHeapStartOffset (0x10000000) namespace Kernel diff --git a/Kernel/HALKit/POWER/HalSerialPort.cxx b/Kernel/HALKit/POWER/HalSerialPort.cxx index 3c62824b..86b43bb7 100644 --- a/Kernel/HALKit/POWER/HalSerialPort.cxx +++ b/Kernel/HALKit/POWER/HalSerialPort.cxx @@ -17,7 +17,7 @@ void ke_io_write(const Char* bytes) return; SizeT index = 0; - SizeT len = rt_string_len(bytes, 0); + SizeT len = rt_string_len(bytes, 255); while (index < len) { diff --git a/Kernel/Sources/HalPageAlloc.cxx b/Kernel/Sources/HalPageAlloc.cxx index dad70f02..75e31e86 100644 --- a/Kernel/Sources/HalPageAlloc.cxx +++ b/Kernel/Sources/HalPageAlloc.cxx @@ -29,7 +29,7 @@ namespace Kernel Boolean Present; Boolean ReadWrite; Boolean User; - SizeT PageSize; + SizeT Size; }; struct VirtualMemoryHeaderTraits @@ -39,7 +39,7 @@ namespace Kernel /// @return VirtualMemoryHeader* Next(VirtualMemoryHeader* current) { - return current + sizeof(PTE) + current->PageSize; + return current + sizeof(VirtualMemoryHeader) + current->Size; } /// @brief Get previous header. @@ -47,7 +47,7 @@ namespace Kernel /// @return VirtualMemoryHeader* Prev(VirtualMemoryHeader* current) { - return current - sizeof(PTE) - current->PageSize; + return current - sizeof(VirtualMemoryHeader) - current->Size; } }; } // namespace Detail @@ -80,7 +80,7 @@ namespace Kernel vmHeader->Present = true; vmHeader->ReadWrite = rw; vmHeader->User = user; - vmHeader->PageSize = size; + vmHeader->Size = size; kAllocationInProgress = false; diff --git a/Kernel/Sources/ProcessHeap.cxx b/Kernel/Sources/ProcessHeap.cxx index 4a2205e6..86ac1554 100644 --- a/Kernel/Sources/ProcessHeap.cxx +++ b/Kernel/Sources/ProcessHeap.cxx @@ -22,7 +22,7 @@ namespace Kernel * @brief Process Heap Header * @note Allocated per process, it denotes the user's heap. */ - struct UserHeapHeader final + struct PROCESS_HEAP_HEADER final { UInt32 fMagic; Int32 fFlags; @@ -30,35 +30,38 @@ namespace Kernel UInt8 fPadding[kHeapHeaderPaddingSz]; }; + /// @brief PROCESS_HEAP_HEADER as pointer type. + typedef PROCESS_HEAP_HEADER* PROCESS_HEAP_HEADER_PTR; + /** - * @brief User Heap Manager class, takes care of allocating the process pools. + * @brief Process heap class, takes care of allocating the process pools. * @note This rely on Virtual Memory! Consider adding good vmem support when * @note porting to a new arch. */ - class UserHeapManager final + class ProcessHeapHelper final { - UserHeapManager() = delete; + ProcessHeapHelper() = delete; public: - ~UserHeapManager() = default; + ~ProcessHeapHelper() = default; public: - STATIC SizeT& Count() + STATIC SizeT& Count() noexcept { return s_NumPools; } - STATIC Ref& Leak() + STATIC Ref& Leak() noexcept { return s_Pmm; } - STATIC Boolean& IsEnabled() + STATIC Boolean& IsEnabled() noexcept { return s_PoolsAreEnabled; } - STATIC MutableArray>& The() + STATIC MutableArray>& The() noexcept { return s_Pool; } @@ -74,10 +77,10 @@ namespace Kernel //! declare fields - SizeT UserHeapManager::s_NumPools = 0UL; - Ref UserHeapManager::s_Pmm; - Boolean UserHeapManager::s_PoolsAreEnabled = true; - MutableArray> UserHeapManager::s_Pool; + SizeT ProcessHeapHelper::s_NumPools = 0UL; + Ref ProcessHeapHelper::s_Pmm; + Boolean ProcessHeapHelper::s_PoolsAreEnabled = true; + MutableArray> ProcessHeapHelper::s_Pool; STATIC VoidPtr ke_find_unused_heap(Int32 flags); STATIC Void ke_free_heap_internal(VoidPtr vaddr); @@ -91,15 +94,15 @@ namespace Kernel { for (SizeT index = 0; index < kUserHeapMaxSz; ++index) { - if (UserHeapManager::The()[index] && - !UserHeapManager::The()[index].Leak().Leak().Present()) + if (ProcessHeapHelper::The()[index] && + !ProcessHeapHelper::The()[index].Leak().Leak().Present()) { - UserHeapManager::Leak().Leak().TogglePresent( - UserHeapManager::The()[index].Leak().Leak(), true); + ProcessHeapHelper::Leak().Leak().TogglePresent( + ProcessHeapHelper::The()[index].Leak().Leak(), true); kcout << "[ke_find_unused_heap] Done, trying to make a pool now...\r"; return ke_make_heap_internal( - (VoidPtr)UserHeapManager::The()[index].Leak().Leak().VirtualAddress(), + (VoidPtr)ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress(), flags); } } @@ -115,7 +118,7 @@ namespace Kernel { if (virtualAddress) { - UserHeapHeader* poolHdr = reinterpret_cast(virtualAddress); + PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast(virtualAddress); if (!poolHdr->fFree) { @@ -130,7 +133,7 @@ namespace Kernel kcout << "[ke_make_heap_internal] New allocation has been done.\n"; return reinterpret_cast( - (reinterpret_cast(virtualAddress) + sizeof(UserHeapHeader))); + (reinterpret_cast(virtualAddress) + sizeof(PROCESS_HEAP_HEADER))); } kcout << "[ke_make_heap_internal] Address is invalid"; @@ -143,8 +146,8 @@ namespace Kernel /// @return STATIC Void ke_free_heap_internal(VoidPtr virtualAddress) { - UserHeapHeader* poolHdr = reinterpret_cast( - reinterpret_cast(virtualAddress) - sizeof(UserHeapHeader)); + PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast( + reinterpret_cast(virtualAddress) - sizeof(PROCESS_HEAP_HEADER)); if (poolHdr->fMagic == kUserHeapMag) { @@ -170,18 +173,18 @@ namespace Kernel */ STATIC Boolean ke_check_and_free_heap(const SizeT& index, VoidPtr ptr) { - if (UserHeapManager::The()[index]) + if (ProcessHeapHelper::The()[index]) { // ErrorOr<>::operator Boolean /// if (address matches) /// -> Free heap. - if (UserHeapManager::The()[index].Leak().Leak().VirtualAddress() == + if (ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress() == (UIntPtr)ptr) { - UserHeapManager::Leak().Leak().FreePage( - UserHeapManager::The()[index].Leak().Leak()); + ProcessHeapHelper::Leak().Leak().FreePage( + ProcessHeapHelper::The()[index].Leak().Leak()); - --UserHeapManager::Count(); + --ProcessHeapHelper::Count(); ke_free_heap_internal(ptr); ptr = nullptr; @@ -198,24 +201,24 @@ namespace Kernel /// @return a pool pointer with selected permissions. VoidPtr rt_new_heap(Int32 flags) { - if (!UserHeapManager::IsEnabled()) + if (!ProcessHeapHelper::IsEnabled()) return nullptr; - if (UserHeapManager::Count() > kUserHeapMaxSz) + if (ProcessHeapHelper::Count() > kUserHeapMaxSz) return nullptr; if (VoidPtr ret = ke_find_unused_heap(flags)) return ret; // this wasn't set to true - auto ref_page = UserHeapManager::Leak().Leak().RequestPage( + auto ref_page = ProcessHeapHelper::Leak().Leak().RequestPage( ((flags & kUserHeapUser)), (flags & kUserHeapRw)); if (ref_page) { ///! reserve page. - UserHeapManager::The()[UserHeapManager::Count()].Leak() = ref_page; - auto& ref = UserHeapManager::Count(); + ProcessHeapHelper::The()[ProcessHeapHelper::Count()].Leak() = ref_page; + auto& ref = ProcessHeapHelper::Count(); ++ref; // increment the number of addresses we have now. @@ -232,12 +235,12 @@ namespace Kernel /// @return status code Int32 rt_free_heap(VoidPtr ptr) { - if (!UserHeapManager::IsEnabled()) + if (!ProcessHeapHelper::IsEnabled()) return -1; if (ptr) { - SizeT base = UserHeapManager::Count(); + SizeT base = ProcessHeapHelper::Count(); if (ke_check_and_free_heap(base, ptr)) return 0; diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index 8119c11e..bfa6fddf 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -43,10 +43,16 @@ namespace Kernel void ProcessHeader::Crash() { - kcout << (*this->Name == 0 ? "Unknown" : this->Name) << ": crashed. (id = "; + kcout << (*this->Name == 0 ? "Kernel" : this->Name) << ": crashed. (id = "; kcout.Number(kErrorProcessFault); kcout << ")\r"; + if (Kernel::ProcessScheduler::The().Leak().CurrentTeam().AsArray().Count() < 1) + { + kcout << "*** BAD PROCESS ***\rTerminating as we are the only process...\r"; + ke_stop(RUNTIME_CHECK_PROCESS); + } + this->Exit(kErrorProcessFault); } diff --git a/Kernel/Sources/Utils.cxx b/Kernel/Sources/Utils.cxx index 12e2e2a8..eeac3f93 100644 --- a/Kernel/Sources/Utils.cxx +++ b/Kernel/Sources/Utils.cxx @@ -37,7 +37,7 @@ namespace Kernel { if (len > _len) { - break; + return 0; } ++len; diff --git a/Kernel/StorageKit/Storage.hpp b/Kernel/StorageKit/Storage.hpp index 981463ab..aa9e335e 100644 --- a/Kernel/StorageKit/Storage.hpp +++ b/Kernel/StorageKit/Storage.hpp @@ -6,11 +6,17 @@ #pragma once -#include -#include -#include -#include +#define kDriveSectorSizeHDD (512) +#define kDriveSectorSizeSSD (4096) +#define kDriveSectorSizeOptical (2048) -#define kDriveSectorSizeHDD (512) -#define kDriveSectorSizeSSD (4096) -#define kDriveSectorSizeCDROM (2048) +namespace Kernel +{ + template + class DeviceInterface; + + class NVMEDeviceInterface; + class AHCIDeviceInterface; + class ATADeviceInterface; + class SCSIDeviceInterface; +} // namespace Kernel diff --git a/Kernel/amd64-efi.make b/Kernel/amd64-efi.make index be59f2e9..e59034c9 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 = -fshort-wchar -c -fPIC -ffreestanding -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \ - -std=c++20 -D__NEWOS_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./ + -std=c++20 -D__NEWOS_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./ ASM = nasm -- cgit v1.2.3