diff options
| author | Amlal El Mahrouss <amlalelmahrouss@icloud.com> | 2024-02-03 20:39:06 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlalelmahrouss@icloud.com> | 2024-02-03 20:39:06 +0100 |
| commit | f99e383775fa43c5c1354067962b1590ff2abdae (patch) | |
| tree | f83a9b232c0424963fc9989b517e53f903ee036f | |
| parent | 0ca5d0d92ee326f3deda797403c27090bd0784ab (diff) | |
NewBoot: Will work on AHCI instead, ATA is not getting any further in
the future.
Signed-off-by: Amlal El Mahrouss <amlalelmahrouss@icloud.com>
| -rw-r--r-- | MailMap | 2 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/ACPI/ACPI.hpp | 1 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalACPIManager.cpp (renamed from Private/HALKit/AMD64/ACPIManagerAMD64.cpp) | 7 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalControlRegister.s (renamed from Private/HALKit/AMD64/ControlRegister.s) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp (renamed from Private/HALKit/AMD64/CoreInterruptHandlerAMD64.cpp) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp (renamed from Private/HALKit/AMD64/CoreMultiProcessingAMD64.cpp) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalCoreSyscallHandlerAMD64.cpp (renamed from Private/HALKit/AMD64/CoreSyscallHandlerAMD64.cpp) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalDebugOutput.cxx (renamed from Private/HALKit/AMD64/DebugOutput.cxx) | 5 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalDebugPort.cxx (renamed from Private/HALKit/AMD64/DebugPort.cxx) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalInstallTIB.asm (renamed from Private/HALKit/AMD64/InstallTIB.asm) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalSMPCoreManager.asm (renamed from Private/HALKit/AMD64/SMPCoreManager.asm) | 0 | ||||
| -rw-r--r-- | Private/HALKit/AMD64/HalStartSequence.asm (renamed from Private/HALKit/AMD64/StartSequence.asm) | 0 | ||||
| -rw-r--r-- | Private/HALKit/PowerPC/HalHardware.cxx (renamed from Private/HALKit/PowerPC/HalHardware.cpp) | 5 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/Arch/AHCI.hxx | 12 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/Arch/ATA.hxx | 11 | ||||
| -rw-r--r-- | Private/NewBoot/BootKit/BootKit.hxx | 22 | ||||
| -rw-r--r-- | Private/NewBoot/Source/Entrypoint.cxx | 5 | ||||
| -rw-r--r-- | Private/NewBoot/Source/FileReader.cxx (renamed from Private/NewBoot/Source/ImageReader.cxx) | 32 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx | 19 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx | 183 | ||||
| -rw-r--r-- | Private/NewBoot/Source/HEL/AMD64/AMD64-CoreSync-ATA.asm | 24 | ||||
| -rw-r--r-- | Private/NewBoot/Source/String.cxx | 25 | ||||
| -rw-r--r-- | Private/NewBoot/Source/TextWriter.cxx | 48 | ||||
| -rw-r--r-- | Private/NewBoot/Source/makefile | 8 | ||||
| -rw-r--r-- | Private/NewKit/Macros.hpp | 4 | ||||
| -rw-r--r-- | Private/NewKit/compile_flags.txt | 1 | ||||
| -rw-r--r-- | Private/Source/CxxKitRT.cxx | 20 | ||||
| -rw-r--r-- | Private/makefile | 7 | ||||
| -rw-r--r-- | Public/BUG_LIST.TXT (renamed from BUG_LIST.TXT) | 0 | ||||
| -rw-r--r-- | Public/SPECIFICATION.TXT (renamed from SPECIFICATION.TXT) | 0 | ||||
| -rw-r--r-- | Public/TODO_LIST.TXT (renamed from TODO_LIST.TXT) | 0 |
31 files changed, 241 insertions, 200 deletions
@@ -1 +1 @@ -amlel - Microkernel,Bootloader - amlalelmahrouss@icloud.com, +33 6 58 57 30 14 +amlel - Microkernel and Bootloader - amlalelmahrouss@icloud.com, +33 6 58 57 30 14 diff --git a/Private/HALKit/AMD64/ACPI/ACPI.hpp b/Private/HALKit/AMD64/ACPI/ACPI.hpp index d97c4fdd..f1a7c27c 100644 --- a/Private/HALKit/AMD64/ACPI/ACPI.hpp +++ b/Private/HALKit/AMD64/ACPI/ACPI.hpp @@ -13,6 +13,7 @@ /** https://uefi.org/specs/ACPI/6.5/05_ACPI_Software_Programming_Model.html + https://wiki.osdev.org/RSDT */ #include <NewKit/Defines.hpp> diff --git a/Private/HALKit/AMD64/ACPIManagerAMD64.cpp b/Private/HALKit/AMD64/HalACPIManager.cpp index 9bdd368b..6cac4eca 100644 --- a/Private/HALKit/AMD64/ACPIManagerAMD64.cpp +++ b/Private/HALKit/AMD64/HalACPIManager.cpp @@ -47,6 +47,11 @@ ErrorOr<voidPtr> ACPIManager::Find(const char *signature) { return ErrorOr<voidPtr>{-1}; } +/*** + @brief check SDT header + @param checksum the header to checksum + @param len the length of it. +*/ bool ACPIManager::Checksum(const char *checksum, SSizeT len) { if (len == 0) return -1; @@ -65,5 +70,5 @@ void rt_shutdown_acpi_qemu_30_plus(void) { HAL::Out16(0x604, 0x2000); } void rt_shutdown_acpi_virtualbox(void) { HAL::Out16(0x4004, 0x3400); } -/// you'll have to parse the MADT otherwise! +/// You have to parse the MADT! } // namespace HCore diff --git a/Private/HALKit/AMD64/ControlRegister.s b/Private/HALKit/AMD64/HalControlRegister.s index d7e0c019..d7e0c019 100644 --- a/Private/HALKit/AMD64/ControlRegister.s +++ b/Private/HALKit/AMD64/HalControlRegister.s diff --git a/Private/HALKit/AMD64/CoreInterruptHandlerAMD64.cpp b/Private/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp index caf891d1..caf891d1 100644 --- a/Private/HALKit/AMD64/CoreInterruptHandlerAMD64.cpp +++ b/Private/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp diff --git a/Private/HALKit/AMD64/CoreMultiProcessingAMD64.cpp b/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp index 1e53140f..1e53140f 100644 --- a/Private/HALKit/AMD64/CoreMultiProcessingAMD64.cpp +++ b/Private/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp diff --git a/Private/HALKit/AMD64/CoreSyscallHandlerAMD64.cpp b/Private/HALKit/AMD64/HalCoreSyscallHandlerAMD64.cpp index 4f1ed4da..4f1ed4da 100644 --- a/Private/HALKit/AMD64/CoreSyscallHandlerAMD64.cpp +++ b/Private/HALKit/AMD64/HalCoreSyscallHandlerAMD64.cpp diff --git a/Private/HALKit/AMD64/DebugOutput.cxx b/Private/HALKit/AMD64/HalDebugOutput.cxx index c4e9cc48..ac16cf70 100644 --- a/Private/HALKit/AMD64/DebugOutput.cxx +++ b/Private/HALKit/AMD64/HalDebugOutput.cxx @@ -53,8 +53,9 @@ bool serial_init() { } } // namespace Detail -void system_io_print(const char *bytes) { +void ke_io_print(const char *bytes) { if (!bytes || Detail::kState != kStateReady) return; + if (*bytes == 0) return; Detail::kState = kStateTransmit; @@ -69,5 +70,5 @@ void system_io_print(const char *bytes) { Detail::kState = kStateReady; } -TerminalDevice kcout(HCore::system_io_print, nullptr); +TerminalDevice kcout(HCore::ke_io_print, nullptr); } // namespace HCore diff --git a/Private/HALKit/AMD64/DebugPort.cxx b/Private/HALKit/AMD64/HalDebugPort.cxx index d292f95d..d292f95d 100644 --- a/Private/HALKit/AMD64/DebugPort.cxx +++ b/Private/HALKit/AMD64/HalDebugPort.cxx diff --git a/Private/HALKit/AMD64/InstallTIB.asm b/Private/HALKit/AMD64/HalInstallTIB.asm index 58f4801b..58f4801b 100644 --- a/Private/HALKit/AMD64/InstallTIB.asm +++ b/Private/HALKit/AMD64/HalInstallTIB.asm diff --git a/Private/HALKit/AMD64/SMPCoreManager.asm b/Private/HALKit/AMD64/HalSMPCoreManager.asm index 9741d092..9741d092 100644 --- a/Private/HALKit/AMD64/SMPCoreManager.asm +++ b/Private/HALKit/AMD64/HalSMPCoreManager.asm diff --git a/Private/HALKit/AMD64/StartSequence.asm b/Private/HALKit/AMD64/HalStartSequence.asm index c8e0a4e2..c8e0a4e2 100644 --- a/Private/HALKit/AMD64/StartSequence.asm +++ b/Private/HALKit/AMD64/HalStartSequence.asm diff --git a/Private/HALKit/PowerPC/HalHardware.cpp b/Private/HALKit/PowerPC/HalHardware.cxx index 96b2d09f..550d3747 100644 --- a/Private/HALKit/PowerPC/HalHardware.cpp +++ b/Private/HALKit/PowerPC/HalHardware.cxx @@ -12,6 +12,7 @@ extern "C" void flush_tlb() {} extern "C" void rt_wait_for_io() {} + extern "C" HCore::HAL::StackFrame* rt_get_current_context() {} namespace HCore { @@ -32,7 +33,7 @@ void rt_hang_thread(HAL::StackFrame* stack) {} // @brief main HAL entrypoint void ke_init_hal() {} -void system_io_print(const char* bytes) { +void ke_com_print(const char* bytes) { if (!bytes) return; SizeT index = 0; @@ -44,5 +45,5 @@ void system_io_print(const char* bytes) { } } -TerminalDevice kcout(HCore::system_io_print, nullptr); +TerminalDevice kcout(HCore::ke_com_print, nullptr); } // namespace HCore diff --git a/Private/NewBoot/BootKit/Arch/AHCI.hxx b/Private/NewBoot/BootKit/Arch/AHCI.hxx new file mode 100644 index 00000000..2e3739b5 --- /dev/null +++ b/Private/NewBoot/BootKit/Arch/AHCI.hxx @@ -0,0 +1,12 @@ +/* + * ======================================================== + * + * NewBoot + * Copyright Mahrouss Logic, all rights reserved. + * + * ======================================================== + */ + +#pragma once + +#include <Drivers/AHCI/Defines.hxx> diff --git a/Private/NewBoot/BootKit/Arch/ATA.hxx b/Private/NewBoot/BootKit/Arch/ATA.hxx index 4042aaa9..4b4eb399 100644 --- a/Private/NewBoot/BootKit/Arch/ATA.hxx +++ b/Private/NewBoot/BootKit/Arch/ATA.hxx @@ -111,12 +111,6 @@ using namespace HCore; #define ATA_ADDRESS3(x) (x + 5) #define ATA_COMMAND(x) (x + 7) -Boolean ATAInitDriver(UInt8 Bus, UInt8 Drv); -Void ATAWait(UInt16 IO); -Void ATAReadLba(UInt32 Lba, UInt8 Bus, Boolean Master, wchar_t* Buf, - SizeT Offset); -Void ATAWriteLba(UInt32 Lba, UInt8 Bus, Boolean Master, wchar_t* Buf, - SizeT Offset); Boolean ATAIsDetected(Void); class BATADevice final { @@ -134,7 +128,10 @@ class BATADevice final { struct ATATraits final { SizeT mBase{1024}; UInt16 mBus{kPrimary}; - Boolean mMaster{true}; + UInt8 mMaster{0}; + Boolean mErr{false}; + + operator bool() { return !mErr; } }; operator bool() { return ATAIsDetected(); } diff --git a/Private/NewBoot/BootKit/BootKit.hxx b/Private/NewBoot/BootKit/BootKit.hxx index 6fdbacaf..d1584d8a 100644 --- a/Private/NewBoot/BootKit/BootKit.hxx +++ b/Private/NewBoot/BootKit/BootKit.hxx @@ -56,13 +56,13 @@ HCore::SizeT BSetMem(CharacterType *src, const CharacterType byte, const HCore::SizeT len); /** - * @brief BootKit Image Reader class - * Reads using the UEFI Simple File protocol. + * @brief BootKit File Reader class + * Reads using the New Filesystem Boot partition. */ -class BImageReader final { +class BFileReader final { public: - explicit BImageReader(const CharacterType *path); - ~BImageReader() = default; + explicit BFileReader(const CharacterType *path); + ~BFileReader() = default; HCore::VoidPtr Fetch(SizeT &size); @@ -78,8 +78,8 @@ class BImageReader final { Int32 &Error() { return mErrorCode; } public: - BImageReader &operator=(const BImageReader &) = default; - BImageReader(const BImageReader &) = default; + BFileReader &operator=(const BFileReader &) = default; + BFileReader(const BFileReader &) = default; private: Int32 mErrorCode{kOperationOkay}; @@ -115,21 +115,21 @@ inline void Out32(UInt16 port, UInt32 value) { } inline UInt8 In8(UInt16 port) { - UInt8 value = 0UL; + UInt8 value; asm volatile("inb %1, %%al" : "=a"(value) : "Nd"(port) : "memory"); return value; } inline UInt16 In16(UInt16 port) { - UInt16 value = 0UL; - asm volatile("in %%dx, %%ax" : "=a"(value) : "d"(port)); + UInt16 value; + asm volatile("inw %%dx, %%ax" : "=a"(value) : "d"(port)); return value; } inline UInt32 In32(UInt16 port) { - UInt32 value = 0UL; + UInt32 value; asm volatile("inl %1, %%eax" : "=a"(value) : "Nd"(port) : "memory"); return value; diff --git a/Private/NewBoot/Source/Entrypoint.cxx b/Private/NewBoot/Source/Entrypoint.cxx index ff118f8a..d2134746 100644 --- a/Private/NewBoot/Source/Entrypoint.cxx +++ b/Private/NewBoot/Source/Entrypoint.cxx @@ -7,7 +7,6 @@ * ======================================================== */ -#include "EFIKit/EFI.hxx" #define __BOOTLOADER__ 1 #include <BootKit/BootKit.hxx> @@ -25,7 +24,7 @@ STATIC Void DrawBackground() { for (int h = 0; h < gop->Mode->Info->HorizontalResolution; ++h) { *((UInt32*)(gop->Mode->FrameBufferBase + 4 * gop->Mode->Info->PixelsPerScanLine * w + 4 * h)) = - RGB(20, 20, 20); + RGB(10, 10, 10); } } } @@ -43,7 +42,7 @@ EFI_EXTERN_C Int EfiMain(EfiHandlePtr ImageHandle, UInt64 mapKey = 0; - BImageReader img(L"HCoreKrnl.exe"); + BFileReader img(L"HCoreKrnl.exe"); SizeT sz = 0UL; PEImagePtr blob = (PEImagePtr)img.Fetch(sz); diff --git a/Private/NewBoot/Source/ImageReader.cxx b/Private/NewBoot/Source/FileReader.cxx index 98e025a8..39884f9f 100644 --- a/Private/NewBoot/Source/ImageReader.cxx +++ b/Private/NewBoot/Source/FileReader.cxx @@ -2,8 +2,9 @@ Copyright Mahrouss Logic - File: String.cxx - Purpose: NewBoot string library + File: FileReader.cxx + Purpose: NewBoot FileReader, + Read complete file and store it in a buffer. Revision History: @@ -15,8 +16,6 @@ #include <EFIKit/Api.hxx> #include <FSKit/NewFS.hxx> -#include "NewKit/Defines.hpp" - //////////////////////////////////////////////////////////////////////////////////////////////////// // // @@ -28,7 +27,7 @@ /*** @brief File Reader constructor. */ -BImageReader::BImageReader(const CharacterType *path) { +BFileReader::BFileReader(const CharacterType *path) { if (path != nullptr) { SizeT index = 0UL; for (; path[index] != L'\0'; ++index) { @@ -43,30 +42,13 @@ BImageReader::BImageReader(const CharacterType *path) { @brief this reads all of the buffer. @param size, new buffer size. */ -HCore::VoidPtr BImageReader::Fetch(SizeT &size) { - mWriter.WriteString(L"HCoreLdr: Fetch-Image: ") +HCore::VoidPtr BFileReader::Fetch(SizeT &size) { + mWriter.WriteString(L"HCoreLdr: Fetch-File: ") .WriteString(mPath) .WriteString(L"\r\n"); - CharacterType bootBlockBytes[kATASectorSz] = {0}; - - mDevice.Leak().mBase = kNewFSAddressAsLba; - mDevice.Leak().mMaster = true; - - mDevice.Read(bootBlockBytes, kATASectorSz); - - NewBootBlock *bootBlock = (NewBootBlock *)bootBlockBytes; - - for (SizeT index = 0UL; index < kNewFSIdentLen; ++index) { - if (bootBlock->Ident[index] != kNewFSIdent[index]) { - mWriter.WriteString(L"HCoreLdr: NewFS: Not found.\r\n"); - return nullptr; - } - } - - /// get file catalog with mPath inside it. - this->mCached = true; + this->mErrorCode = kNotSupported; return nullptr; } diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx new file mode 100644 index 00000000..2d449bbb --- /dev/null +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-AHCI.cxx @@ -0,0 +1,19 @@ +/* + * ======================================================== + * + * NewBoot + * Copyright Mahrouss Logic, all rights reserved. + * + * ======================================================== + */ + +/** + * @file AHCI.cxx + * @author Amlal El Mahrouss (amlalelmahrouss@icloud.com) + * @brief AHCI driver. + * @version 0.1 + * @date 2024-02-02 + * + * @copyright Copyright (c) 2024 Mahrouss Logic + * + */ diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx index d6b6e0a9..3414d060 100644 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx +++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx @@ -14,133 +14,162 @@ * @version 0.1 * @date 2024-02-02 * - * @copyright Copyright (c) 2024 + * @copyright Copyright (c) 2024 Mahrouss Logic * */ #include <BootKit/Arch/ATA.hxx> #include <BootKit/BootKit.hxx> +#include <EFIKit/Api.hxx> + +#include "BootKit/Platform.hxx" /// bugs: 0 -extern "C" Void ATAWaitForIO(Void); +#define kATADataLen 256 static Boolean kATADetected = false; static Int32 kATADeviceType = kATADeviceCount; +static CharacterType kATAData[kATADataLen] = {0}; + +STATIC Boolean ATAWaitForIO(UInt16 IO) { + for (int i = 0; i < 4; i++) In8(IO + ATA_REG_STATUS); + +ATAWaitForIO_Retry: + auto statRdy = In8(IO + ATA_REG_STATUS); + + if ((statRdy & ATA_SR_BSY)) goto ATAWaitForIO_Retry; + +ATAWaitForIO_Retry2: + statRdy = In8(IO + ATA_REG_STATUS); + + if (statRdy & ATA_SR_ERR) return false; + + if (!(statRdy & ATA_SR_DRDY)) goto ATAWaitForIO_Retry2; + + return true; +} -void ATASelect(UInt8 Bus, Boolean isMaster) { - if (Bus == ATA_PRIMARY) - Out8(ATA_PRIMARY_IO + ATA_REG_HDDEVSEL, - isMaster ? ATA_PRIMARY_SEL : ATA_SECONDARY_SEL); +Void ATASelect(UInt16 Bus) { + if (Bus == ATA_PRIMARY_IO) + Out8(Bus + ATA_REG_HDDEVSEL, ATA_PRIMARY_SEL); else - Out8(ATA_SECONDARY_IO + ATA_REG_HDDEVSEL, - isMaster ? ATA_PRIMARY_SEL : ATA_SECONDARY_SEL); + Out8(Bus + ATA_REG_HDDEVSEL, ATA_SECONDARY_SEL); } -Boolean ATAInitDriver(UInt8 Bus, UInt8 Drive, UInt16& OutBus, - Boolean& OutMaster) { +Boolean ATAInitDriver(UInt16 Bus, UInt8 Drive, UInt16& OutBus, + UInt8& OutMaster) { BTextWriter writer; - UInt16 IO = (Bus == ATA_PRIMARY) ? ATA_PRIMARY_IO : ATA_SECONDARY_IO; + UInt16 IO = Bus; - ATASelect(Bus, Drive); + // Bus init, NEIN bit. + Out8(IO + 1, 1); - Out8(IO + ATA_REG_SEC_COUNT0, 0); - Out8(IO + ATA_REG_LBA0, 0); - Out8(IO + ATA_REG_LBA1, 0); - Out8(IO + ATA_REG_LBA2, 0); + ATASelect(IO); + + // identify until it's good. +ATAInit_Retry: + auto statRdy = In8(IO + ATA_REG_STATUS); + + if (statRdy & ATA_SR_ERR) { + return false; + } + if ((statRdy & ATA_SR_BSY)) goto ATAInit_Retry; Out8(IO + ATA_REG_COMMAND, ATA_CMD_IDENTIFY); - UInt8 status = In8(IO + ATA_REG_STATUS); + for (SizeT indexData = 0ul; indexData < kATADataLen; ++indexData) { + kATAData[indexData] = In16(IO + ATA_REG_DATA); + } - if (status & ATA_SR_ERR) { -#ifdef __DEBUG__ - writer.WriteString(L"HCoreLdr: Init ATA: Bad Drive!\r\n"); -#endif // ifdef __DEBUG__ - return false; + writer.WriteString(L"HCoreLdr: Drive: "); + + /// fetch drive info + + for (SizeT indexData = 0; indexData < kATADataLen; indexData += 1) { + writer.WriteCharacter(kATAData[indexData + 1]) + .WriteCharacter(kATAData[indexData]); } + writer.WriteString(L"\r\n"); + OutBus = (Bus == ATA_PRIMARY) ? BATADevice::kPrimary : BATADevice::kSecondary; - OutMaster = (Bus == ATA_PRIMARY); + OutMaster = (Bus == ATA_PRIMARY) ? ATA_MASTER : ATA_SLAVE; - unsigned cl = In16(Bus + ATA_CYL_LOW); /* get the "signature bytes" */ - unsigned ch = In16(Bus + ATA_CYL_HIGH); + Out8(Bus + ATA_REG_HDDEVSEL, 0xA0 | ATA_MASTER << 4); + + In8(Bus + ATA_REG_CONTROL); + In8(Bus + ATA_REG_CONTROL); + In8(Bus + ATA_REG_CONTROL); + In8(Bus + ATA_REG_CONTROL); + + unsigned cl = In8(Bus + ATA_CYL_LOW); /* get the "signature bytes" */ + unsigned ch = In8(Bus + ATA_CYL_HIGH); /* differentiate ATA, ATAPI, SATA and SATAPI */ if (cl == 0x14 && ch == 0xEB) { - writer.WriteString(L"HCoreLdr: PATAPI: drive detected.\r\n"); + writer.WriteString(L"HCoreLdr: PATAPI drive detected.\r\n"); kATADeviceType = kATADevicePATA_PI; } if (cl == 0x69 && ch == 0x96) { - writer.WriteString(L"HCoreLdr: SATAPI: drive detected.\r\n"); + writer.WriteString(L"HCoreLdr: SATAPI drive detected.\r\n"); kATADeviceType = kATADeviceSATA_PI; } + if (cl == 0 && ch == 0) { - writer.WriteString(L"HCoreLdr: PATA: drive detected.\r\n"); + writer.WriteString(L"HCoreLdr: PATA drive detected.\r\n"); kATADeviceType = kATADevicePATA; } + if (cl == 0x3c && ch == 0xc3) { - writer.WriteString(L"HCoreLdr: SATA: drive detected.\r\n"); + writer.WriteString(L"HCoreLdr: SATA drive detected.\r\n"); kATADeviceType = kATADeviceSATA; } - return true; -} + Out8(IO + ATA_REG_CONTROL, 0x02); -/*** @brief - * This polls the ATA drive. - */ -void ATAWait(UInt16 IO) { - for (int i = 0; i < 4000; i++) In8(IO + ATA_REG_ALT_STATUS); + return true; } -void ATAPoll(UInt16 IO) { ATAWait(IO); } - -Void ATAReadLba(UInt32 Lba, UInt8 IO, Boolean Master, CharacterType* Buf, +Void ATAReadLba(UInt32 Lba, UInt8 IO, UInt8 Master, CharacterType* Buf, SizeT Offset) { - rt_cli(); - ATAWaitForIO(); - - Lba &= 0x00FFFFFF; - UInt8 Command = (Master ? 0xE0 : 0xF0); - Out8(IO + ATA_REG_HDDEVSEL, Command | ((Lba >> 24))); + Out8(IO + ATA_REG_HDDEVSEL, + (Command << 4) | (((Lba & 0x0f000000) >> 24) & 0x0f)); Out8(IO + ATA_REG_SEC_COUNT0, 0x1); + Out8(IO + ATA_REG_FEATURES, 0); - Out8(IO + ATA_REG_LBA0, (UInt8)Lba); - Out8(IO + ATA_REG_LBA1, (UInt8)Lba >> 8); - Out8(IO + ATA_REG_LBA2, (UInt8)Lba >> 16); + Out8(IO + ATA_REG_LBA0, (UInt8)(Lba & 0x000000ff)); + Out8(IO + ATA_REG_LBA1, (UInt8)(Lba & 0x0000ff00) >> 8); + Out8(IO + ATA_REG_LBA2, (UInt8)(Lba & 0x00ff0000) >> 16); Out8(IO + ATA_REG_COMMAND, ATA_CMD_READ_PIO); - Buf[Offset] = In16(IO); - - ATAWaitForIO(); - rt_sti(); + for (SizeT i = 0; i < 256; ++i) { + Buf[Offset + i] = In16(IO + ATA_REG_DATA); + } } -Void ATAWriteLba(UInt32 Lba, UInt8 IO, Boolean Master, wchar_t* Buf, +Void ATAWriteLba(UInt32 Lba, UInt8 IO, UInt8 Master, wchar_t* Buf, SizeT Offset) { - rt_cli(); - ATAWaitForIO(); - Lba &= 0x00FFFFFF; - UInt8 Command = (Master ? 0xE0 : 0xF0); - Out8(IO + ATA_REG_HDDEVSEL, Command | ((Lba >> 24))); + Out8(IO + ATA_REG_HDDEVSEL, + (Command << 4) | (((Lba & 0x0f000000) >> 24) & 0x0f)); Out8(IO + ATA_REG_SEC_COUNT0, 0x1); + Out8(IO + ATA_REG_FEATURES, 0); - Out8(IO + ATA_REG_LBA0, (UInt8)Lba); - Out8(IO + ATA_REG_LBA1, (UInt8)Lba >> 8); - Out8(IO + ATA_REG_LBA2, (UInt8)Lba >> 16); + Out8(IO + ATA_REG_LBA0, (UInt8)(Lba & 0x000000ff)); + Out8(IO + ATA_REG_LBA1, (UInt8)(Lba & 0x0000ff00) >> 8); + Out8(IO + ATA_REG_LBA2, (UInt8)(Lba & 0x00ff0000) >> 16); Out8(IO + ATA_REG_COMMAND, ATA_CMD_WRITE_PIO); - Out16(IO, Buf[Offset]); - ATAWaitForIO(); - rt_sti(); + for (SizeT i = 0; i < 256; ++i) { + Out16(IO + ATA_REG_DATA, Buf[Offset + i]); + } } Boolean ATAIsDetected(Void) { return kATADetected; } @@ -160,13 +189,13 @@ Boolean ATAIsDetected(Void) { return kATADetected; } BATADevice::BATADevice() noexcept { if (ATAIsDetected()) return; - if (ATAInitDriver(ATA_PRIMARY, true, this->Leak().mBus, + if (ATAInitDriver(ATA_PRIMARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_PRIMARY, false, this->Leak().mBus, + ATAInitDriver(ATA_PRIMARY_IO, false, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_SECONDARY, true, this->Leak().mBus, + ATAInitDriver(ATA_SECONDARY_IO, true, this->Leak().mBus, this->Leak().mMaster) || - ATAInitDriver(ATA_SECONDARY, false, this->Leak().mBus, + ATAInitDriver(ATA_SECONDARY_IO, false, this->Leak().mBus, this->Leak().mMaster)) { kATADetected = true; @@ -181,9 +210,14 @@ BATADevice::BATADevice() noexcept { @param Buf buffer */ BATADevice& BATADevice::Read(CharacterType* Buf, const SizeT& SectorSz) { - if (!ATAIsDetected()) return *this; + if (!ATAIsDetected()) { + Leak().mErr = true; + return *this; + } + + Leak().mErr = false; - if (!Buf || SectorSz > kATASectorSz || SectorSz < 1) return *this; + if (!Buf || SectorSz < 1) return *this; for (SizeT i = 0UL; i < SectorSz; ++i) { ATAReadLba(this->Leak().mBase + i, this->Leak().mBus, this->Leak().mMaster, @@ -199,9 +233,14 @@ BATADevice& BATADevice::Read(CharacterType* Buf, const SizeT& SectorSz) { @param Buf buffer */ BATADevice& BATADevice::Write(CharacterType* Buf, const SizeT& SectorSz) { - if (!ATAIsDetected()) return *this; + if (!ATAIsDetected()) { + Leak().mErr = true; + return *this; + } + + Leak().mErr = false; - if (!Buf || SectorSz > kATASectorSz || SectorSz < 1) return *this; + if (!Buf || SectorSz < 1) return *this; SizeT Off = 0UL; diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-CoreSync-ATA.asm b/Private/NewBoot/Source/HEL/AMD64/AMD64-CoreSync-ATA.asm deleted file mode 100644 index 6ad07a59..00000000 --- a/Private/NewBoot/Source/HEL/AMD64/AMD64-CoreSync-ATA.asm +++ /dev/null @@ -1,24 +0,0 @@ -[bits 64] - - -section .text -global ATAWaitForIO - -ATAWaitForIO: - push ax - push dx - - xor ax, ax - mov dx, 01F7h - -ATAWaitForIO_Loop: - in al, dx - and al, 0C0h - cmp al, 040h - jne ATAWaitForIO_Loop - -ATAWaitForIO_End: - pop dx - pop ax - - ret diff --git a/Private/NewBoot/Source/String.cxx b/Private/NewBoot/Source/String.cxx index a2d19f1f..e080a01d 100644 --- a/Private/NewBoot/Source/String.cxx +++ b/Private/NewBoot/Source/String.cxx @@ -61,28 +61,3 @@ HCore::SizeT BSetMem(CharacterType *src, const CharacterType byte, return cnt; } - -///////////////////////////////////////////////////////////////////////////////////////////////////////// - -/** -@brief puts wrapper over EFI. -*/ -BTextWriter &BTextWriter::WriteString(const CharacterType *str) { - if (*str == 0 || !str) return *this; - - ST->ConOut->OutputString(ST->ConOut, str); - - return *this; -} - -/** -@brief putc wrapper over EFI. -*/ -BTextWriter &BTextWriter::WriteCharacter(CharacterType c) { - EfiCharType str[2]; - str[0] = c; - str[1] = 0; - ST->ConOut->OutputString(ST->ConOut, str); - - return *this; -} diff --git a/Private/NewBoot/Source/TextWriter.cxx b/Private/NewBoot/Source/TextWriter.cxx new file mode 100644 index 00000000..77baa067 --- /dev/null +++ b/Private/NewBoot/Source/TextWriter.cxx @@ -0,0 +1,48 @@ +/* ------------------------------------------- + + Copyright Mahrouss Logic + + File: String.cxx + Purpose: NewBoot string library + + Revision History: + + + +------------------------------------------- */ + +#include <BootKit/BootKit.hxx> +#include <EFIKit/Api.hxx> +#include <FSKit/NewFS.hxx> + +/// bugs 0 + +///////////////////////////////////////////////////////////////////////////////////////////////////////// + +/** +@brief puts wrapper over EFI ConOut. +*/ +BTextWriter &BTextWriter::WriteString(const CharacterType *str) { +#ifdef __DEBUG__ + + if (*str == 0 || !str) return *this; + + ST->ConOut->OutputString(ST->ConOut, str); +#endif + + return *this; +} + +/** +@brief putc wrapper over EFI ConOut. +*/ +BTextWriter &BTextWriter::WriteCharacter(CharacterType c) { +#ifdef __DEBUG__ + EfiCharType str[2]; + str[0] = c; + str[1] = 0; + ST->ConOut->OutputString(ST->ConOut, str); +#endif + + return *this; +} diff --git a/Private/NewBoot/Source/makefile b/Private/NewBoot/Source/makefile index eb836632..460b5dc1 100644 --- a/Private/NewBoot/Source/makefile +++ b/Private/NewBoot/Source/makefile @@ -16,16 +16,18 @@ invalid-recipe: .PHONY: bootloader-amd64 bootloader-amd64: - $(ASM) $(FLAG_ASM) HEL/AMD64/AMD64-CoreSync-ATA.asm $(CC_GNU) $(FLAG_GNU) HEL/AMD64/*.cxx *.cxx $(LD_GNU) *.o HEL/AMD64/*.obj -e efi_main -filealign:16 -shared --subsystem=10 -ffreestanding -o HCoreLdr.exe cp HCoreLdr.exe CDROM/EFI/BOOT/BOOTX64.EFI - cp ../../HCoreKrnl.exe CDROM/EFI/BOOT/HCoreKrnl.exe + +.PHONY: make-disk +make-disk: + qemu-img create -f qcow2 os.epm 1M .PHONY: run-efi-debug run-efi-debug: wget https://retrage.github.io/edk2-nightly/bin/DEBUGX64_OVMF.fd -O OVMF.fd - qemu-system-x86_64 -bios OVMF.fd -drive file=fat:rw:CDROM,format=raw -d int + qemu-system-x86_64 -M q35 -bios OVMF.fd -drive file=os.epm,index=0,if=ide,format=qcow2 -drive file=fat:rw:CDROM,index=1,format=raw -d int .PHONY: clean clean: diff --git a/Private/NewKit/Macros.hpp b/Private/NewKit/Macros.hpp index 50d44946..8b974fc2 100644 --- a/Private/NewKit/Macros.hpp +++ b/Private/NewKit/Macros.hpp @@ -88,4 +88,6 @@ #define NO_EXEC ATTRIBUTE(noexec) #define EXTERN extern -#define STATIC static
\ No newline at end of file +#define STATIC static + +#include <HintKit/CompilerHint.hxx> diff --git a/Private/NewKit/compile_flags.txt b/Private/NewKit/compile_flags.txt index a37ae6bf..14c5bc51 100644 --- a/Private/NewKit/compile_flags.txt +++ b/Private/NewKit/compile_flags.txt @@ -3,3 +3,4 @@ -std=c++20 -I./ -I../ +-I../../../ diff --git a/Private/Source/CxxKitRT.cxx b/Private/Source/CxxKitRT.cxx deleted file mode 100644 index cc2d477d..00000000 --- a/Private/Source/CxxKitRT.cxx +++ /dev/null @@ -1,20 +0,0 @@ -/* - * ======================================================== - * - * HCore - * Copyright Mahrouss Logic, all rights reserved. - * - * ======================================================== - */ - -#include <HintKit/CompilerHint.hxx> -#include <KernelKit/OSErr.hpp> -#include <NewKit/Utils.hpp> - -using namespace HCore; - -// unimplemented _HintTell -void _HintTell(_HintMessage* ppMsg, _HintId* pId) { - (void)ppMsg; - (void)pId; -} diff --git a/Private/makefile b/Private/makefile index f21a037e..6834c0be 100644 --- a/Private/makefile +++ b/Private/makefile @@ -8,7 +8,7 @@ LD = x86_64-w64-mingw32-ld CCFLAGS = -c -ffreestanding -fno-rtti -fno-exceptions -std=c++20 -D__HAVE_HCORE_APIS__ -D__HCORE__ -I../ -I./ -I$(HOME)/ ASM = nasm ASMFLAGS = -f win64 -LDFLAGS = -e Main -filealign:16 -shared --subsystem=10 +LDFLAGS = -e Main -filealign:16 -shared --subsystem=10 LDOBJ = Obj/*.obj # This file is the kernel, responsible of task management, memory, drivers and more. @@ -31,8 +31,9 @@ h-core-amd64: $(CC) $(CCFLAGS) Source/*.cxx HALKit/AMD64/PCI/*.cpp Source/Network/*.cpp\ Source/Storage/*.cxx HALKit/AMD64/*.cxx HALKit/AMD64/*.cpp HALKit/AMD64/*.s $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptRouting.asm - $(ASM) $(ASMFLAGS) HALKit/AMD64/SMPCoreManager.asm - $(ASM) $(ASMFLAGS) HALKit/AMD64/StartSequence.asm + $(ASM) $(ASMFLAGS) HALKit/AMD64/HalSMPCoreManager.asm + $(ASM) $(ASMFLAGS) HALKit/AMD64/HalStartSequence.asm + $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInstallTIB.asm $(MOVEALL) OBJCOPY = x86_64-elf-objcopy diff --git a/BUG_LIST.TXT b/Public/BUG_LIST.TXT index 1fa4e00a..1fa4e00a 100644 --- a/BUG_LIST.TXT +++ b/Public/BUG_LIST.TXT diff --git a/SPECIFICATION.TXT b/Public/SPECIFICATION.TXT index a681984f..a681984f 100644 --- a/SPECIFICATION.TXT +++ b/Public/SPECIFICATION.TXT diff --git a/TODO_LIST.TXT b/Public/TODO_LIST.TXT index b89c0659..b89c0659 100644 --- a/TODO_LIST.TXT +++ b/Public/TODO_LIST.TXT |
