summaryrefslogtreecommitdiffhomepage
path: root/Private
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-03 20:39:06 +0100
committerAmlal El Mahrouss <amlalelmahrouss@icloud.com>2024-02-03 20:39:06 +0100
commitf99e383775fa43c5c1354067962b1590ff2abdae (patch)
treef83a9b232c0424963fc9989b517e53f903ee036f /Private
parent0ca5d0d92ee326f3deda797403c27090bd0784ab (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>
Diffstat (limited to 'Private')
-rw-r--r--Private/HALKit/AMD64/ACPI/ACPI.hpp1
-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.hxx12
-rw-r--r--Private/NewBoot/BootKit/Arch/ATA.hxx11
-rw-r--r--Private/NewBoot/BootKit/BootKit.hxx22
-rw-r--r--Private/NewBoot/Source/Entrypoint.cxx5
-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.cxx19
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-ATA.cxx183
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-CoreSync-ATA.asm24
-rw-r--r--Private/NewBoot/Source/String.cxx25
-rw-r--r--Private/NewBoot/Source/TextWriter.cxx48
-rw-r--r--Private/NewBoot/Source/makefile8
-rw-r--r--Private/NewKit/Macros.hpp4
-rw-r--r--Private/NewKit/compile_flags.txt1
-rw-r--r--Private/Source/CxxKitRT.cxx20
-rw-r--r--Private/makefile7
27 files changed, 240 insertions, 199 deletions
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