summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authoramlal <amlal@el-mahrouss-logic.com>2024-03-17 07:25:31 +0100
committeramlal <amlal@el-mahrouss-logic.com>2024-03-17 07:25:31 +0100
commit45548d516ddf5e88bf80940365d151e1bd69c29f (patch)
treef7347078e07a9d524e874f7f6c23622d538064bc
parenta4d4de6913fb7dd54847b0e5a004c3100bc02459 (diff)
HCR-14: A series of important fixes and improvements regarding the
kernel. Signed-off-by: amlal <amlal@el-mahrouss-logic.com>
-rw-r--r--Private/Drivers/AHCI/Defines.hxx8
-rw-r--r--Private/Drivers/PS2/PS2KernelMouse.hxx23
-rw-r--r--Private/FSKit/HCFS.hxx11
-rw-r--r--Private/FSKit/NewFS.hxx106
-rw-r--r--Private/HALKit/AMD64/HalDescriptorLoader.cpp3
-rw-r--r--Private/HALKit/AMD64/HalInterruptRouting.asm6
-rw-r--r--Private/HALKit/AMD64/HalKernelMain.cxx22
-rw-r--r--Private/HALKit/AMD64/HalKernelMouse.cxx19
-rw-r--r--Private/KernelKit/DebugOutput.hpp35
-rw-r--r--Private/KernelKit/PE.hpp137
-rw-r--r--Private/KernelKit/Rsrc/Util.hxx4
-rw-r--r--Private/NewBoot/BootKit/Arch/AHCI.hxx38
-rw-r--r--Private/NewBoot/BootKit/Arch/ATA.hxx4
-rw-r--r--Private/NewBoot/BootKit/Arch/SATA.hxx38
-rw-r--r--Private/NewBoot/Source/BootMain.cxx38
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx2
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx49
-rw-r--r--Private/NewBoot/Source/makefile2
-rw-r--r--Private/NewKit/Macros.hpp2
-rw-r--r--Private/Source/KernelHeap.cxx3
-rw-r--r--Private/Source/NewFS+FileManager.cxx12
-rw-r--r--Private/Source/PageManager.cxx40
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