diff options
Diffstat (limited to 'Private')
22 files changed, 315 insertions, 287 deletions
diff --git a/Private/Drivers/AHCI/Defines.hxx b/Private/Drivers/AHCI/Defines.hxx index f3b93660..c1d3c063 100644 --- a/Private/Drivers/AHCI/Defines.hxx +++ b/Private/Drivers/AHCI/Defines.hxx @@ -313,10 +313,4 @@ typedef struct HbaCmdTbl final { HbaPrdtEntry prdtEntries[1]; // Physical region descriptor table entries, 0 ~ 65535 } HbaCmdTbl; -/* - * - * - * - * - * - */ +/* EOF */ diff --git a/Private/Drivers/PS2/PS2KernelMouse.hxx b/Private/Drivers/PS2/PS2KernelMouse.hxx index ecfc0459..e78bd97f 100644 --- a/Private/Drivers/PS2/PS2KernelMouse.hxx +++ b/Private/Drivers/PS2/PS2KernelMouse.hxx @@ -32,25 +32,30 @@ class PS2KernelMouse final { this->Write(0xFF); + HAL::Out8(0x64, 0xA8); + this->Wait(); HAL::Out8(0x64, 0x20); - this->Wait(); + this->WaitInput(); - auto status = HAL::In8(0x60); + UInt8 dataStatus = HAL::In8(0x60); - status |= 0x12; + dataStatus |= 0b10; this->Wait(); - - HAL::Out8(0x64, 0x60); - this->Wait(); - - HAL::Out8(0x60, status); + HAL::Out8(0x60, dataStatus); + + this->Write(0xF6); + auto f6Dat = this->Read(); + + this->Write(0xF4); + auto f4Dat = this->Read(); - HCore::kcout << "HCoreKrnl.exe: PS/2 mouse is OK.\r\n"; + HCore::kcout << "HCoreKrnl.exe: PS/2 mouse is OK: " << hex_number(f6Dat); + HCore::kcout << ", " << hex_number(f4Dat) << end_line(); } private: diff --git a/Private/FSKit/HCFS.hxx b/Private/FSKit/HCFS.hxx index a9d4013d..90285bd9 100644 --- a/Private/FSKit/HCFS.hxx +++ b/Private/FSKit/HCFS.hxx @@ -12,9 +12,14 @@ #include <FirmwareKit/EPM.hxx> #define kHCFSIdentLen 8 +#define kHCFSIdent " HCFS" #define kHCFSNameLen 256 #define kHCFSPadLen 16 +#define kHCFSFlagDeleted 0xF0 +#define kHCFSFlagUnallocated 0x0F +#define kHCFSFlagCatalog 0xFF + #define kHCFSGuid "@{0771b3c9-b977-440a-a9ca-396b6d3f07b5}" /// @brief HCFS Balanced Tree structure. @@ -32,6 +37,7 @@ typedef struct HCFSBTree final { HCore::Char fReserved[384]; } PACKED HCFSBTree; +/// @brief Catalog file for HCFS. typedef struct HCFSCatalog { HCore::Char fCatalogName[kHCFSNameLen]; HCore::UInt32 fCatalogKind; @@ -48,6 +54,11 @@ typedef struct HCFSCatalog { HCore::Char fReserved[152]; } HCFSCatalog; +#define kHCFSCatalogKindFile 1 +#define kHCFSCatalogKindDirectory 2 +#define kHCFSCatalogKindJunction 3 +#define kHCFSCatalogKindNetwork 4 + enum { kHCFSHardDrive = 0xC0, // Hard Drive kHCFSOpticalDrive = 0x0C, // Blu-Ray/DVD diff --git a/Private/FSKit/NewFS.hxx b/Private/FSKit/NewFS.hxx index e3469e73..63e4a017 100644 --- a/Private/FSKit/NewFS.hxx +++ b/Private/FSKit/NewFS.hxx @@ -31,7 +31,7 @@ #define kNewFSMinimumSectorSz 2048 #define kNewFSIdentLen 8 -#define kNewFSIdent " NEFS" +#define kNewFSIdent " NewFS" #define kNewFSPadLen 16 //! On EPM and GPT disks. @@ -40,6 +40,47 @@ #define kNewFSVersionInteger 0x121 #define kNewFSVerionString "1.2.1" +#define kNewFSCatalogKindFile 1 +#define kNewFSCatalogKindDir 2 +#define kNewFSCatalogKindAlias 3 + +//! shared between network or +//! other filesystems. Export forks as .zip when copying. +#define kNewFSCatalogKindShared 4 + +#define kNewFSCatalogKindResource 5 +#define kNewFSCatalogKindExecutable 6 + +#define kNewFSCatalogKindPage 8 + +#define kNewFSCatalogKindDevice 9 +#define kNewFSCatalogKindLock 10 + +#define kNewFSSeparator '/' + +#define kNewFSUpDir ".." +#define kNewFSRoot "/" + +#define kNewFSLF '\r' +#define kNewFSEOF (-1) + +#define kNewFSBitWidth (sizeof(NewCharType)) +#define kNewFSLbaType (HCore::Lba) + +/// Start After the PM headers, pad 1024 bytes. +#define kNewFSAddressAsLba (1024U) + +#define kResourceTypeDialog 10 +#define kResourceTypeString 11 +#define kResourceTypeMenu 12 + +#define kConfigLen 64 +#define kPartLen 32 + +#define kNewFSFlagDeleted 0xF0 +#define kNewFSFlagUnallocated 0x0F +#define kNewFSFlagCatalog 0xFF + typedef HCore::Char NewCharType; enum { @@ -70,17 +111,6 @@ struct PACKED NewBootBlock final { NewCharType Pad[kNewFSPadLen]; }; -#define kFlagDeleted 0xF0 -#define kFlagUnallocated 0x0F -#define kFlagCatalog 0xFF - -#define kKindCatalog 1 -#define kKindDirectory 2 -#define kKindSymlink 3 -#define kKindPartition 4 -#define kKindDevice 5 -#define kKindNetwork 6 - struct PACKED NewCatalog final { NewCharType Name[kNewFSNodeNameLen]; @@ -90,16 +120,13 @@ struct PACKED NewCatalog final { HCore::Lba FirstFork; HCore::Lba LastFork; - HCore::Lba SiblingRecords[12]; -}; - -#define kNewFSMaxEntries 256 - -struct PACKED NewCatalogRecord final { - HCore::Lba Entries[kNewFSMaxEntries]; + HCore::Lba NextSibling; + HCore::Lba PrevSibling; }; struct PACKED NewFork final { + NewCharType Name[kNewFSNodeNameLen]; + HCore::Int32 Flags; HCore::Int32 Kind; @@ -107,20 +134,13 @@ struct PACKED NewFork final { HCore::Int32 ResourceKind; HCore::Int32 ResourceFlags; - HCore::Lba DataOffset; // Where to look for this data? - HCore::SizeT DataSize; // Data size according using sector count. + HCore::Lba DataOffset; //8 Where to look for this data? + HCore::SizeT DataSize; /// Data size according using sector count. HCore::Lba NextSibling; HCore::Lba PreviousSibling; }; -#define kResourceTypeDialog 10 -#define kResourceTypeString 11 -#define kResourceTypeMenu 12 - -#define kConfigLen 64 -#define kPartLen 32 - struct PACKED NewPartitionBlock final { NewCharType Ident[kNewFSIdentLen]; NewCharType PartitionName[kPartLen]; @@ -142,36 +162,6 @@ struct PACKED NewPartitionBlock final { HCore::Char Pad[kNewFSPadLen]; }; -#define kCatalogKindFile 1 -#define kCatalogKindDir 2 -#define kCatalogKindAlias 3 - -//! shared between network or -//! other filesystems. Export forks as .zip when copying. -#define kCatalogKindShared 4 - -#define kCatalogKindResource 5 -#define kCatalogKindExecutable 6 - -#define kCatalogKindPage 8 - -#define kCatalogKindDevice 9 -#define kCatalogKindLock 10 - -#define kFilesystemSeparator '/' - -#define kFilesystemUpDir ".." -#define kFilesystemRoot "/" - -#define kFilesystemLF '\r' -#define kFilesystemEOF (-1) - -#define kFilesystemBitWidth (sizeof(NewCharType)) -#define kFilesystemLbaType (HCore::Lba) - -/// Start After the PM headers, pad 1024 bytes. -#define kNewFSAddressAsLba (1024U) - namespace HCore { /// /// \name NewFSParser diff --git a/Private/HALKit/AMD64/HalDescriptorLoader.cpp b/Private/HALKit/AMD64/HalDescriptorLoader.cpp index 595d52e4..a5f445e5 100644 --- a/Private/HALKit/AMD64/HalDescriptorLoader.cpp +++ b/Private/HALKit/AMD64/HalDescriptorLoader.cpp @@ -44,9 +44,6 @@ STATIC Void RemapPIC(Void) noexcept { HAL::Out8(0x21, a1); HAL::rt_wait_400ns(); HAL::Out8(0xA1, a2); - - HAL::Out8(0x21, 0xfd); - HAL::Out8(0xa1, 0xff); } } // namespace Detail diff --git a/Private/HALKit/AMD64/HalInterruptRouting.asm b/Private/HALKit/AMD64/HalInterruptRouting.asm index 2364593d..f021bf9a 100644 --- a/Private/HALKit/AMD64/HalInterruptRouting.asm +++ b/Private/HALKit/AMD64/HalInterruptRouting.asm @@ -58,7 +58,9 @@ IntNormal 9 IntExp 10 IntExp 11 -__HCR_INT_12: +IntExp 12 + +__HCR_INT_13: cli push rax @@ -71,8 +73,6 @@ __HCR_INT_12: sti iretq -IntExp 13 - __HCR_INT_14: cli diff --git a/Private/HALKit/AMD64/HalKernelMain.cxx b/Private/HALKit/AMD64/HalKernelMain.cxx index b3f2aa42..b82dccd7 100644 --- a/Private/HALKit/AMD64/HalKernelMain.cxx +++ b/Private/HALKit/AMD64/HalKernelMain.cxx @@ -20,18 +20,17 @@ #define kInstalledMedia 0xDD EXTERN_C HCore::VoidPtr kInterruptVectorTable[]; -EXTERN_C HCore::Void _ke_init_mouse(); +EXTERN_C HCore::Void _hal_init_mouse(); +EXTERN_C HCore::Void _hal_mouse_handler(); EXTERN_C HCore::Void _hal_mouse_draw(); namespace Detail { STATIC HCore::Void ke_page_protect_nullptr(HCore::Void) { - HCore::HAL::PageDirectory64* pageDirNull = nullptr; + HCore::PTEWrapper wrapper(false, false, false, 0); + HCore::PageManager pageManager; + HCore::Ref<HCore::PageManager> refMan(pageManager); - for (HCore::SizeT indexPte = 0; indexPte < kPTEMax; ++indexPte) { - pageDirNull->Pte[indexPte].Rw = false; - } - - hal_flush_tlb(reinterpret_cast<HCore::UIntPtr>(pageDirNull)); + wrapper.FlushTLB(refMan); } } // namespace Detail @@ -74,8 +73,6 @@ EXTERN_C void RuntimeMain( HCore::HAL::IDTLoader idt; idt.Load(idtBase); - Detail::ke_page_protect_nullptr(); - KeInitRsrc(); KeDrawRsrc(MahroussLogic, MAHROUSSLOGIC_HEIGHT, MAHROUSSLOGIC_WIDTH, @@ -87,6 +84,7 @@ EXTERN_C void RuntimeMain( /// START POST HCore::HAL::Detail::_ke_power_on_self_test(); + Detail::ke_page_protect_nullptr(); /// END POST @@ -100,5 +98,11 @@ EXTERN_C void RuntimeMain( /// TODO: Install hcore on host. } + _hal_init_mouse(); + + while (1) { + _hal_mouse_draw(); + } + HCore::ke_stop(RUNTIME_CHECK_BOOTSTRAP); } diff --git a/Private/HALKit/AMD64/HalKernelMouse.cxx b/Private/HALKit/AMD64/HalKernelMouse.cxx index 58c45dfe..bce6272f 100644 --- a/Private/HALKit/AMD64/HalKernelMouse.cxx +++ b/Private/HALKit/AMD64/HalKernelMouse.cxx @@ -62,6 +62,11 @@ EXTERN_C void _hal_mouse_handler() default: break; } + + // Notify PIC controller that we're done with it's interrupt. + + HCore::HAL::Out8(0x20, 0x20); + HCore::HAL::Out8(0xA0, 0x20); #endif } @@ -114,9 +119,21 @@ EXTERN_C void _hal_mouse_draw() /// @brief Inital kernel mouse initializer /// @param -EXTERN_C void _ke_init_mouse(void) +EXTERN_C void _hal_init_mouse(void) { #ifdef __DEBUG__ kMousePS2.Init(); + + auto pic1Port = 0x20; + auto pic2Port = 0xA0; + + auto mask = 1 << 12; + auto currentMask = HCore::HAL::In8(pic1Port + 1); + auto newMask = currentMask & ~mask; + HCore::HAL::Out8(pic1Port + 1, newMask); + + currentMask = HCore::HAL::In8(pic2Port + 1); + newMask = currentMask & ~mask; + HCore::HAL::Out8(pic2Port + 1, newMask); #endif }
\ No newline at end of file diff --git a/Private/KernelKit/DebugOutput.hpp b/Private/KernelKit/DebugOutput.hpp index 75031687..a2355cd8 100644 --- a/Private/KernelKit/DebugOutput.hpp +++ b/Private/KernelKit/DebugOutput.hpp @@ -55,7 +55,40 @@ inline TerminalDevice carriage_return() { return selfTerm; } -inline TerminalDevice get_buffer(Char* buf) { +namespace Detail { +inline TerminalDevice _write_number_hex(const Long &x, TerminalDevice& term) { + int y = x / 16; + int h = x % 16; + + if (y) _write_number_hex(y, term); + + /* fail if the hex number is not base-16 */ + if (h > 15) { + _write_number_hex('?', term); + return term; + } + + if (y < 0) y = -y; + + const char NUMBERS[17] = "0123456789ABCDEF"; + + Char buf[2]; + buf[0] = NUMBERS[h]; + buf[1] = 0; + + term << buf; + return term; +} +} // namespace Detail + +inline TerminalDevice hex_number(const Long &x) { + TerminalDevice selfTerm = TerminalDevice::Shared(); + Detail::_write_number_hex(x, selfTerm); + + return selfTerm; +} + +inline TerminalDevice get_console_in(Char* buf) { TerminalDevice selfTerm = TerminalDevice::Shared(); selfTerm >> buf; return selfTerm; diff --git a/Private/KernelKit/PE.hpp b/Private/KernelKit/PE.hpp index 3a2db99f..3fd4f965 100644 --- a/Private/KernelKit/PE.hpp +++ b/Private/KernelKit/PE.hpp @@ -19,24 +19,23 @@ namespace Detail { - typedef HCore::UIntPtr U64; - typedef HCore::UInt32 U32; - typedef HCore::UInt16 U16; - typedef HCore::UInt8 U8; - typedef Detail::U8 BYTE; + typedef HCore::UIntPtr PE_QWORD; + typedef HCore::UInt32 PE_DWORD; + typedef HCore::UInt16 PE_WORD; + typedef HCore::UChar PE_BYTE; } // namespace Detail #define kPeMagic 0x00004550 typedef struct ExecHeader final { - Detail::U32 mMagic; // PE\0\0 or 0x00004550 - Detail::U16 mMachine; - Detail::U16 mNumberOfSections; - Detail::U32 mTimeDateStamp; - Detail::U32 mPointerToSymbolTable; - Detail::U32 mNumberOfSymbols; - Detail::U16 mSizeOfOptionalHeader; - Detail::U16 mCharacteristics; + Detail::PE_DWORD mMagic; // PE\0\0 or 0x00004550 + Detail::PE_WORD mMachine; + Detail::PE_WORD mNumberOfSections; + Detail::PE_DWORD mTimeDateStamp; + Detail::PE_DWORD mPointerToSymbolTable; + Detail::PE_DWORD mNumberOfSymbols; + Detail::PE_WORD mSizeOfOptionalHeader; + Detail::PE_WORD mCharacteristics; } ALIGN(8) ExecHeader, *ExecHeaderPtr; #define kMagPE32 0x010b @@ -46,48 +45,48 @@ typedef struct ExecHeader final { #define kPEMachineARM64 0xaa64 typedef struct ExecOptionalHeader final { - Detail::U16 mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit) - Detail::U8 mMajorLinkerVersion; - Detail::U8 mMinorLinkerVersion; - Detail::U64 mSizeOfCode; - Detail::U64 mSizeOfInitializedData; - Detail::U64 mSizeOfUninitializedData; - Detail::U32 mAddressOfEntryPoint; - Detail::U32 mBaseOfCode; - Detail::U64 mImageBase; - Detail::U32 mSectionAlignment; - Detail::U32 mFileAlignment; - Detail::U16 mMajorOperatingSystemVersion; - Detail::U16 mMinorOperatingSystemVersion; - Detail::U16 mMajorImageVersion; - Detail::U16 mMinorImageVersion; - Detail::U16 mMajorSubsystemVersion; - Detail::U16 mMinorSubsystemVersion; - Detail::U32 mWin32VersionValue; - Detail::U64 mSizeOfImage; - Detail::U64 mSizeOfHeaders; - Detail::U32 mCheckSum; - Detail::U16 mSubsystem; - Detail::U16 mDllCharacteristics; - Detail::U64 mSizeOfStackReserve; - Detail::U64 mSizeOfStackCommit; - Detail::U64 mSizeOfHeapReserve; - Detail::U64 mSizeOfHeapCommit; - Detail::U32 mLoaderFlags; - Detail::U32 mNumberOfRvaAndSizes; + Detail::PE_WORD mMagic; // 0x010b - PE32, 0x020b - PE32+ (64 bit) + Detail::PE_BYTE mMajorLinkerVersion; + Detail::PE_BYTE mMinorLinkerVersion; + Detail::PE_QWORD mSizeOfCode; + Detail::PE_QWORD mSizeOfInitializedData; + Detail::PE_QWORD mSizeOfUninitializedData; + Detail::PE_DWORD mAddressOfEntryPoint; + Detail::PE_DWORD mBaseOfCode; + Detail::PE_QWORD mImageBase; + Detail::PE_DWORD mSectionAlignment; + Detail::PE_DWORD mFileAlignment; + Detail::PE_WORD mMajorOperatingSystemVersion; + Detail::PE_WORD mMinorOperatingSystemVersion; + Detail::PE_WORD mMajorImageVersion; + Detail::PE_WORD mMinorImageVersion; + Detail::PE_WORD mMajorSubsystemVersion; + Detail::PE_WORD mMinorSubsystemVersion; + Detail::PE_DWORD mWin32VersionValue; + Detail::PE_QWORD mSizeOfImage; + Detail::PE_QWORD mSizeOfHeaders; + Detail::PE_DWORD mCheckSum; + Detail::PE_WORD mSubsystem; + Detail::PE_WORD mDllCharacteristics; + Detail::PE_QWORD mSizeOfStackReserve; + Detail::PE_QWORD mSizeOfStackCommit; + Detail::PE_QWORD mSizeOfHeapReserve; + Detail::PE_QWORD mSizeOfHeapCommit; + Detail::PE_DWORD mLoaderFlags; + Detail::PE_DWORD mNumberOfRvaAndSizes; } ExecOptionalHeader, *ExecOptionalHeaderPtr; typedef struct ExecSectionHeader final { - Detail::BYTE mName[8]; - Detail::U32 mVirtualSize; - Detail::U32 mVirtualAddress; - Detail::U32 mSizeOfRawData; - Detail::U32 mPointerToRawData; - Detail::U32 mPointerToRelocations; - Detail::U32 mPointerToLinenumbers; - Detail::U16 mNumberOfRelocations; - Detail::U16 mNumberOfLinenumbers; - Detail::U32 mCharacteristics; + CONST Detail::PE_BYTE mName[8]; + Detail::PE_DWORD mVirtualSize; + Detail::PE_DWORD mVirtualAddress; + Detail::PE_DWORD mSizeOfRawData; + Detail::PE_DWORD mPointerToRawData; + Detail::PE_DWORD mPointerToRelocations; + Detail::PE_DWORD mPointerToLinenumbers; + Detail::PE_WORD mNumberOfRelocations; + Detail::PE_WORD mNumberOfLinenumbers; + Detail::PE_DWORD mCharacteristics; } ExecSectionHeader, *ExecSectionHeaderPtr; enum kExecDataDirParams { @@ -98,28 +97,28 @@ enum kExecDataDirParams { }; typedef struct ExecExportDirectory { - Detail::U32 mCharacteristics; - Detail::U32 mTimeDateStamp; - Detail::U16 mMajorVersion; - Detail::U16 mMinorVersion; - Detail::U32 mName; - Detail::U32 mBase; - Detail::U32 mNumberOfFunctions; - Detail::U32 mNumberOfNames; - Detail::U32 mAddressOfFunctions; // export table rva - Detail::U32 mAddressOfNames; - Detail::U32 mAddressOfNameOrdinal; // ordinal table rva + Detail::PE_DWORD mCharacteristics; + Detail::PE_DWORD mTimeDateStamp; + Detail::PE_WORD mMajorVersion; + Detail::PE_WORD mMinorVersion; + Detail::PE_DWORD mName; + Detail::PE_DWORD mBase; + Detail::PE_DWORD mNumberOfFunctions; + Detail::PE_DWORD mNumberOfNames; + Detail::PE_DWORD mAddressOfFunctions; // export table rva + Detail::PE_DWORD mAddressOfNames; + Detail::PE_DWORD mAddressOfNameOrdinal; // ordinal table rva } ExecExportDirectory, *ExecExportDirectoryPtr; typedef struct ExecImportDirectory { union { - Detail::U32 mCharacteristics; - Detail::U32 mOriginalFirstThunk; + Detail::PE_DWORD mCharacteristics; + Detail::PE_DWORD mOriginalFirstThunk; }; - Detail::U32 mTimeDateStamp; - Detail::U32 mForwarderChain; - Detail::U32 mNameRva; - Detail::U32 mThunkTableRva; + Detail::PE_DWORD mTimeDateStamp; + Detail::PE_DWORD mForwarderChain; + Detail::PE_DWORD mNameRva; + Detail::PE_DWORD mThunkTableRva; } ExecImportDirectory, *ExecImportDirectoryPtr; #define kPeStart "__hcore_subsys_start" diff --git a/Private/KernelKit/Rsrc/Util.hxx b/Private/KernelKit/Rsrc/Util.hxx index 2ff81076..bf753055 100644 --- a/Private/KernelKit/Rsrc/Util.hxx +++ b/Private/KernelKit/Rsrc/Util.hxx @@ -5,6 +5,7 @@ // Sat Feb 24 CET 2024 #define KeInitRsrc() HCore::SizeT uA = 0 + #define KeClearRsrc() uA = 0 /// @brief draws a resource. @@ -33,6 +34,7 @@ } \ } + /// @brief cleans a resource. #define KeClearZone(_Height, _Width, BaseX, BaseY) \ \ @@ -47,6 +49,7 @@ } \ } + #define KeDrawZone(_Clr, _Height, _Width, BaseX, BaseY) \ \ for (HCore::SizeT i = BaseX; i < _Height + BaseX; ++i) { \ @@ -60,4 +63,5 @@ } \ } + #endif diff --git a/Private/NewBoot/BootKit/Arch/AHCI.hxx b/Private/NewBoot/BootKit/Arch/AHCI.hxx deleted file mode 100644 index 9505377b..00000000 --- a/Private/NewBoot/BootKit/Arch/AHCI.hxx +++ /dev/null @@ -1,38 +0,0 @@ -/* ------------------------------------------- - - Copyright Mahrouss Logic - -------------------------------------------- */ - -#pragma once - -#include <CompilerKit/CompilerKit.hxx> -#include <Drivers/AHCI/Defines.hxx> - -class BDeviceAHCI final { - public: - explicit BDeviceAHCI() noexcept; - ~BDeviceAHCI() = default; - - HCORE_COPY_DEFAULT(BDeviceAHCI); - - struct AHCITraits final { - HCore::SizeT fBase{1024}; - HCore::Boolean fError{false}; - HCore::Boolean fDetected{false}; - - operator bool() { return !this->fError; } - }; - - operator bool() { return this->Leak().fDetected; } - - BDeviceAHCI& Read(HCore::WideChar* Buf, const HCore::SizeT& SecCount); - BDeviceAHCI& Write(HCore::WideChar* Buf, const HCore::SizeT& SecCount); - - AHCITraits& Leak(); - - private: - AHCITraits mTraits; -}; - -#define kAHCISectorSz 512 diff --git a/Private/NewBoot/BootKit/Arch/ATA.hxx b/Private/NewBoot/BootKit/Arch/ATA.hxx index 3370fdba..15d36317 100644 --- a/Private/NewBoot/BootKit/Arch/ATA.hxx +++ b/Private/NewBoot/BootKit/Arch/ATA.hxx @@ -8,8 +8,6 @@ #include <Drivers/ATA/Defines.hxx> -Boolean IsATADetected(Void); - class BDeviceATA final { public: enum { @@ -31,7 +29,7 @@ class BDeviceATA final { operator bool() { return !mErr; } }; - operator bool() { return IsATADetected(); } + operator bool(); BDeviceATA& Read(WideChar* Buf, const SizeT& SecCount); BDeviceATA& Write(WideChar* Buf, const SizeT& SecCount); diff --git a/Private/NewBoot/BootKit/Arch/SATA.hxx b/Private/NewBoot/BootKit/Arch/SATA.hxx new file mode 100644 index 00000000..3e37be19 --- /dev/null +++ b/Private/NewBoot/BootKit/Arch/SATA.hxx @@ -0,0 +1,38 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + +------------------------------------------- */ + +#pragma once + +#include <CompilerKit/CompilerKit.hxx> +#include <Drivers/AHCI/Defines.hxx> + +class BDeviceSATA final { + public: + explicit BDeviceSATA() noexcept; + ~BDeviceSATA() = default; + + HCORE_COPY_DEFAULT(BDeviceSATA); + + struct AHCITraits final { + HCore::SizeT mBase{1024}; + HCore::Boolean mErr{false}; + HCore::Boolean mDetected{false}; + + operator bool() { return !this->mErr; } + }; + + operator bool() { return this->Leak().mDetected; } + + BDeviceSATA& Read(HCore::WideChar* Buf, const HCore::SizeT& SecCount); + BDeviceSATA& Write(HCore::WideChar* Buf, const HCore::SizeT& SecCount); + + AHCITraits& Leak(); + + private: + AHCITraits mTraits; +}; + +#define kAHCISectorSz 512 diff --git a/Private/NewBoot/Source/BootMain.cxx b/Private/NewBoot/Source/BootMain.cxx index 829c98ad..650196f6 100644 --- a/Private/NewBoot/Source/BootMain.cxx +++ b/Private/NewBoot/Source/BootMain.cxx @@ -35,9 +35,8 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, /// Splash screen stuff - writer.Write(L"MahroussLogic (R) HCoreLdr: "); - - writer.Write(BVersionString::Shared()).Write(L"\r\n"); + writer.Write(L"MahroussLogic (R) HCoreLdr: ") + .Write(BVersionString::Shared()).Write(L"\r\n"); const char strDate[] = __DATE__; @@ -98,34 +97,11 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, .Write(ptrHdr->mNumberOfSections * sizeof(ExecSectionHeader)) .Write(L"\r\n"); - volatile ALIGN(kPTEAlign) ExecSectionHeader* blobKrnl = - (ExecSectionHeader*)(reinterpret_cast<DosHeaderPtr>(blob) + - reinterpret_cast<DosHeaderPtr>(blob)->eLfanew + - ptrHdr->mSizeOfOptionalHeader + - (sizeof(ExecHeader) + - sizeof(ExecOptionalHeader) + sizeof(UInt32))); - - while (blobKrnl->mCharacteristics != 0x00000020) { - blobKrnl = blobKrnl + sizeof(ExecSectionHeader); - } - - writer.Write(L"HCoreLdr: Exec Timestamp: ") - .Write(ptrHdr->mTimeDateStamp) - .Write(L"\r\n"); + ExecSectionHeader* blobKrnl = + (ExecSectionHeader*)(&optHdr + sizeof(ExecOptionalHeader) + sizeof(UInt32)); for (size_t i = 0; i < ptrHdr->mNumberOfSections; i++) { - writer.Write(L"HCoreLdr: Virtual-Size: ") - .Write(blobKrnl[i].mVirtualSize) - .Write(L"\r\n"); - writer.Write(L"HCoreLdr: Virtual-Address: ") - .Write(blobKrnl[i].mVirtualAddress) - .Write(L"\r\n"); - writer.Write(L"HCoreLdr: Raw-Address: ") - .Write(blobKrnl[i].mPointerToRawData) - .Write(L"\r\n"); - writer.Write(L"HCoreLdr: Raw-Size: ") - .Write(blobKrnl[i].mSizeOfRawData) - .Write(L"\r\n"); + // TODO: parse PE information here. } UInt32 MapKey = 0; @@ -143,7 +119,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, /**** * - * LOAD KERNEL CODE + * Load kernel into memory. * */ @@ -158,7 +134,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle, /**** * - * GET MEMORY MAP OF COMPUTER. + * Get machine memory map. * */ diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx index dbb0bde4..be7010a8 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx @@ -15,4 +15,4 @@ * */ -#include <BootKit/Arch/AHCI.hxx> +#include <BootKit/Arch/SATA.hxx> diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx index 551b0200..145976c1 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx @@ -26,7 +26,9 @@ static Boolean kATADetected = false; static Int32 kATADeviceType = kATADeviceCount; static CharacterType kATAData[kATADataLen] = {0}; -STATIC Boolean ATAWaitForIO(UInt16 IO) { +Boolean boot_ata_detected(Void); + +STATIC Boolean boot_ata_wait_io(UInt16 IO) { for (int i = 0; i < 4; i++) In8(IO + ATA_REG_STATUS); ATAWaitForIO_Retry: @@ -51,9 +53,9 @@ Void ATASelect(UInt16 Bus) { Out8(Bus + ATA_REG_HDDEVSEL, ATA_SECONDARY_SEL); } -Boolean ATAInitDriver(UInt16 Bus, UInt8 Drive, UInt16& OutBus, +Boolean boot_ata_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMaster) { - if (IsATADetected()) return false; + if (boot_ata_detected()) return false; BTextWriter writer; @@ -135,7 +137,7 @@ ATAInit_Retry: return true; } -Void ATAReadLba(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, +Void boot_ata_read(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, SizeT Offset) { UInt8 Command = (Master ? 0xE0 : 0xF0); @@ -150,12 +152,12 @@ Void ATAReadLba(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO); - for (SizeT i = 0; i < 256; ++i) { - Buf[Offset + i] = In16(IO + ATA_REG_DATA); + for (SizeT IndexOff = 0; IndexOff < 256; ++IndexOff) { + Buf[Offset + IndexOff] = In16(IO + ATA_REG_DATA); } } -Void ATAWriteLba(UInt32 Lba, UInt8 IO, UInt8 Master, wchar_t* Buf, +Void boot_ata_write(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, SizeT Offset) { UInt8 Command = (Master ? 0xE0 : 0xF0); @@ -170,13 +172,13 @@ Void ATAWriteLba(UInt32 Lba, UInt8 IO, UInt8 Master, wchar_t* Buf, Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO); - for (SizeT i = 0; i < 256; ++i) { - Out16(IO + ATA_REG_DATA, Buf[Offset + i]); + for (SizeT IndexOff = 0; IndexOff < 256; ++IndexOff) { + Out16(IO + ATA_REG_DATA, Buf[Offset + IndexOff]); } } /// @check is ATA detected? -Boolean IsATADetected(Void) { return kATADetected; } +Boolean boot_ata_detected(Void) { return kATADetected; } /*** * @@ -191,15 +193,15 @@ Boolean IsATADetected(Void) { return kATADetected; } * @param void none. */ BDeviceATA::BDeviceATA() noexcept { - if (IsATADetected()) return; + if (boot_ata_detected()) return; - if (ATAInitDriver(ATA_PRIMARY_IO, true, this->Leak().mBus, + if (boot_ata_init(ATA_PRIMARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_PRIMARY_IO, false, this->Leak().mBus, + boot_ata_init(ATA_PRIMARY_IO, false, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_SECONDARY_IO, true, this->Leak().mBus, + boot_ata_init(ATA_SECONDARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_SECONDARY_IO, false, this->Leak().mBus, + boot_ata_init(ATA_SECONDARY_IO, false, this->Leak().mBus, this->Leak().mMaster)) { kATADetected = true; @@ -207,6 +209,10 @@ BDeviceATA::BDeviceATA() noexcept { writer.Write(L"HCoreLdr: Driver: OnLine.\r\n"); } } +/** + * @brief Is ATA detected? +*/ +BDeviceATA::operator bool() { return boot_ata_detected(); } /** @brief Read Buf from disk @@ -214,7 +220,7 @@ BDeviceATA::BDeviceATA() noexcept { @param Buf buffer */ BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { - if (!IsATADetected()) { + if (!boot_ata_detected()) { Leak().mErr = true; return *this; } @@ -224,8 +230,11 @@ BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { if (!Buf || SectorSz < 1) return *this; for (SizeT i = 0UL; i < SectorSz; ++i) { - ATAReadLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, + boot_ata_read(this->Leak().mBase + i, + this->Leak().mBus, this->Leak().mMaster, Buf, i); + + boot_ata_wait_io(this->Leak().mBus); } return *this; @@ -237,7 +246,7 @@ BDeviceATA& BDeviceATA::Read(CharacterType* Buf, const SizeT& SectorSz) { @param Buf buffer */ BDeviceATA& BDeviceATA::Write(CharacterType* Buf, const SizeT& SectorSz) { - if (!IsATADetected()) { + if (!boot_ata_detected()) { Leak().mErr = true; return *this; } @@ -249,10 +258,12 @@ BDeviceATA& BDeviceATA::Write(CharacterType* Buf, const SizeT& SectorSz) { SizeT Off = 0UL; for (SizeT i = 0UL; i < SectorSz; ++i) { - ATAWriteLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, + boot_ata_write(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, Buf, Off); Off += kATASectorSz; + + boot_ata_wait_io(this->Leak().mBus); } return *this; diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index 5e25496b..511a4894 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -35,7 +35,7 @@ bootloader-amd64: .PHONY: run-efi-amd64 run-efi-amd64: - $(EMU) -net none -smp 2 -m 4G -M pc -bios OVMF.fd -drive file=fat:rw:CDROM,index=1,format=raw -serial stdio + $(EMU) -net none -smp 2 -m 4G -M q35 -bios OVMF.fd -drive file=fat:rw:CDROM,index=1,format=raw -serial stdio .PHONY: download-edk download-edk: diff --git a/Private/NewKit/Macros.hpp b/Private/NewKit/Macros.hpp index 141ccc53..c6c4f530 100644 --- a/Private/NewKit/Macros.hpp +++ b/Private/NewKit/Macros.hpp @@ -84,6 +84,8 @@ #define EXTERN extern #define STATIC static +#define CONST const + #ifndef self #define self this #endif diff --git a/Private/Source/KernelHeap.cxx b/Private/Source/KernelHeap.cxx index 208a7223..3acb3d79 100644 --- a/Private/Source/KernelHeap.cxx +++ b/Private/Source/KernelHeap.cxx @@ -60,6 +60,9 @@ VoidPtr ke_new_ke_heap(SizeT sz, const bool rw, const bool user) { Ref<PTEWrapper *> wrapper = kPageManager.Request(user, rw, false); + Ref<PageManager> refMan(kPageManager); + wrapper->FlushTLB(refMan); + kLastWrapper = wrapper; Detail::HeapInformationBlockPtr heapInfo = diff --git a/Private/Source/NewFS+FileManager.cxx b/Private/Source/NewFS+FileManager.cxx index e03cc471..5924385d 100644 --- a/Private/Source/NewFS+FileManager.cxx +++ b/Private/Source/NewFS+FileManager.cxx @@ -26,22 +26,22 @@ bool NewFilesystemManager::Remove(const char* node_name) { } NodePtr NewFilesystemManager::Create(const char* path) { - return node_cast(fImpl->CreateCatalog(path, 0, kCatalogKindFile)); + return node_cast(fImpl->CreateCatalog(path, 0, kNewFSCatalogKindFile)); } NodePtr NewFilesystemManager::CreateDirectory(const char* path) { - return node_cast(fImpl->CreateCatalog(path, 0, kCatalogKindDir)); + return node_cast(fImpl->CreateCatalog(path, 0, kNewFSCatalogKindDir)); } NodePtr NewFilesystemManager::CreateAlias(const char* path) { - return node_cast(fImpl->CreateCatalog(path, 0, kCatalogKindAlias)); + return node_cast(fImpl->CreateCatalog(path, 0, kNewFSCatalogKindAlias)); } -const char* NewFilesystemHelper::Root() { return kFilesystemRoot; } +const char* NewFilesystemHelper::Root() { return kNewFSRoot; } -const char* NewFilesystemHelper::UpDir() { return kFilesystemUpDir; } +const char* NewFilesystemHelper::UpDir() { return kNewFSUpDir; } -const char NewFilesystemHelper::Separator() { return kFilesystemSeparator; } +const char NewFilesystemHelper::Separator() { return kNewFSSeparator; } } // namespace HCore #endif // ifdef __FSKIT_NEWFS__ diff --git a/Private/Source/PageManager.cxx b/Private/Source/PageManager.cxx index 1b535e43..572effae 100644 --- a/Private/Source/PageManager.cxx +++ b/Private/Source/PageManager.cxx @@ -44,14 +44,14 @@ PTEWrapper::~PTEWrapper() { } void PTEWrapper::FlushTLB(Ref<PageManager> &pm) { - volatile PTE *virtAddr = static_cast<volatile PTE *>(virtAddr); - - virtAddr->Present = this->m_Present; - virtAddr->ExecDisable = this->m_ExecDisable; - virtAddr->Rw = this->m_Rw; - virtAddr->User = this->m_User; - - pm.Leak().FlushTLB(this->m_VirtAddr); + PTE* ptIndex = (PTE*)((m_VirtAddr >> 12) & 0x1FF); + ptIndex->Wt = m_Wt; + ptIndex->Rw = m_Rw; + ptIndex->Cache = m_Cache; + ptIndex->Present = m_Present; + ptIndex->ExecDisable = m_ExecDisable; + + pm.Leak().FlushTLB((UIntPtr)ptIndex); } void PageManager::FlushTLB(UIntPtr VirtAddr) { @@ -71,8 +71,9 @@ bool PTEWrapper::Reclaim() { PTEWrapper *PageManager::Request(Boolean Rw, Boolean User, Boolean ExecDisable) { + // Store PTE wrapper right after PTE. PTEWrapper *PageTableEntry = reinterpret_cast<PTEWrapper *>( - HCore::HAL::hal_alloc_page(sizeof(PTEWrapper), Rw, User)); + HCore::HAL::hal_alloc_page(sizeof(PTEWrapper), Rw, User) + sizeof(PTE)); PageTableEntry->NoExecute(ExecDisable); @@ -92,19 +93,7 @@ bool PageManager::Free(Ref<PTEWrapper *> &wrapper) { return false; } -//////////////////////////// - -// VIRTUAL ADDRESS GETTER (SKIP PTE) - -//////////////////////////// - -const UIntPtr PTEWrapper::VirtualAddress() { return (m_VirtAddr + sizeof(PTE)); } - -//////////////////////////// - -// PAGE GETTERS - -//////////////////////////// +const UIntPtr PTEWrapper::VirtualAddress() { return (m_VirtAddr + sizeof(PTE) + sizeof(PTEWrapper)); } bool PTEWrapper::Shareable() { return m_Shareable; } @@ -112,12 +101,7 @@ bool PTEWrapper::Present() { return m_Present; } bool PTEWrapper::Access() { return m_Accessed; } -//////////////////////////// - -// NO EXECUTE PROTECTION - -//////////////////////////// - void PTEWrapper::NoExecute(const bool enable) { this->m_ExecDisable = enable; } + const bool &PTEWrapper::NoExecute() { return this->m_ExecDisable; } } // namespace HCore |
