summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-01 10:38:27 +0200
committerAmlal El Mahrouss <amlal@nekernel.org>2025-04-01 10:38:27 +0200
commit1c3b37123cef3fa9c69099bc6228d7b4a082ee90 (patch)
tree34c23cc3508114f3985289f6cb4e915454604426
parentcb4d1fbb3a8f31641147f43375c7d66f693ef3ea (diff)
ahci, boot: bump, and working on a patch.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
-rw-r--r--dev/boot/src/BootThread.cc23
-rw-r--r--dev/boot/src/New+Delete.cc11
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc40
3 files changed, 50 insertions, 24 deletions
diff --git a/dev/boot/src/BootThread.cc b/dev/boot/src/BootThread.cc
index 3341601a..aac3c931 100644
--- a/dev/boot/src/BootThread.cc
+++ b/dev/boot/src/BootThread.cc
@@ -83,6 +83,8 @@ namespace Boot
auto numPages = opt_header_ptr->SizeOfImage / cPageSize;
BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress);
+ fStack = new UInt8[mib_cast(16)];
+
LDR_SECTION_HEADER_PTR sectPtr = (LDR_SECTION_HEADER_PTR)(((Char*)opt_header_ptr) + header_ptr->SizeOfOptionalHeader);
constexpr auto sectionForCode = ".text";
@@ -93,7 +95,19 @@ namespace Boot
{
LDR_SECTION_HEADER_PTR sect = &sectPtr[sectIndex];
- SetMem((VoidPtr)(loadStartAddress + sect->VirtualAddress), 0, sect->SizeOfRawData);
+ auto sz = sect->VirtualSize;
+
+ if (sect->SizeOfRawData > 0)
+ sz = sect->SizeOfRawData;
+
+ SetMem((VoidPtr)(loadStartAddress + sect->VirtualAddress), 0, sz);
+
+ if (sect->SizeOfRawData > 0)
+ {
+ CopyMem((VoidPtr)(loadStartAddress + sect->VirtualAddress),
+ (VoidPtr)((UIntPtr)fBlob + sect->PointerToRawData),
+ sect->SizeOfRawData);
+ }
if (StrCmp(sectionForCode, sect->Name) == 0)
{
@@ -152,8 +166,6 @@ namespace Boot
{
writer.Write("BootZ: Invalid Executable.\r");
}
-
- fStack = new UInt8[mib_cast(16)];
}
/// @note handover header has to be valid!
@@ -175,7 +187,10 @@ namespace Boot
if (own_stack)
{
- rt_jump_to_address(fStartAddress, fHandover, &fStack[mib_cast(16) - 1]);
+ UInt8* aligned_stack = &fStack[mib_cast(16)];
+ aligned_stack = (UInt8*)((UIntPtr)aligned_stack & ~0xF);
+
+ rt_jump_to_address(fStartAddress, fHandover, aligned_stack);
}
else
{
diff --git a/dev/boot/src/New+Delete.cc b/dev/boot/src/New+Delete.cc
index b7941e29..b9982923 100644
--- a/dev/boot/src/New+Delete.cc
+++ b/dev/boot/src/New+Delete.cc
@@ -19,7 +19,7 @@ void* operator new(size_t sz)
void* buf = nullptr;
while (BS->AllocatePool(EfiMemoryType::EfiLoaderData, sz, &buf) != kEfiOk)
- BS->FreePool(buf);
+ ;
return buf;
}
@@ -39,6 +39,9 @@ void* operator new[](size_t sz)
/// @param buf the object.
void operator delete(void* buf)
{
+ if (!buf)
+ return;
+
BS->FreePool(buf);
}
@@ -46,6 +49,9 @@ void operator delete(void* buf)
/// @param buf the object.
void operator delete[](void* buf)
{
+ if (!buf)
+ return;
+
BS->FreePool(buf);
}
@@ -54,6 +60,9 @@ void operator delete[](void* buf)
/// @param size it's size.
void operator delete(void* buf, size_t size)
{
+ if (!buf)
+ return;
+
BS->FreePool(buf);
}
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
index a02bf5e1..2a360e60 100644
--- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
@@ -75,9 +75,7 @@ STATIC Void drv_compute_disk_ahci() noexcept
const UInt16 kSzIdent = kib_cast(1);
/// Push it to the stack
- UInt8* identify_data ATTRIBUTE(aligned(4096)) = (UInt8*)mib_cast(1);
-
- HAL::mm_map_page((VoidPtr)mib_cast(1), (VoidPtr)mib_cast(1), HAL::kMMFlagsWr);
+ UInt8* identify_data ATTRIBUTE(aligned(4096)) = new UInt8[kSzIdent];
/// Send AHCI command for identification.
drv_std_input_output_ahci<NO, YES, YES>(0, identify_data, kAHCISectorSize, kSzIdent);
@@ -86,19 +84,13 @@ STATIC Void drv_compute_disk_ahci() noexcept
UInt64 lba48_sectors = 0;
lba48_sectors |= (UInt64)identify_data[100];
- lba48_sectors |= (UInt64)identify_data[101] << 16;
- lba48_sectors |= (UInt64)identify_data[102] << 32;
+ lba48_sectors |= (UInt64)identify_data[101] << 16;
+ lba48_sectors |= (UInt64)identify_data[102] << 32;
if (lba48_sectors == 0)
kSATASectorCount = (identify_data[61] << 16) | identify_data[60];
else
kSATASectorCount = lba48_sectors;
-
- /// Show what we got.
-
- kout << "Disk Model: " << kCurrentDiskModel << kendl;
- kout << "Disk Size: " << number(drv_get_size()) << kendl;
- kout << "Disk Sector Count: " << number(kSATASectorCount) << kendl;
}
/// @brief Finds a command slot for a HBA port.
@@ -171,6 +163,9 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
{
UInt32 chunk = (bytes_remaining > kMaxPRDSize) ? kMaxPRDSize : bytes_remaining;
+ if (chunk == 0)
+ break;
+
command_table->Prdt[i].Dba = (UInt32)(buffer_phys & 0xFFFFFFFF);
command_table->Prdt[i].Dbau = (UInt32)(buffer_phys >> 32);
command_table->Prdt[i].Dbc = chunk - 1;
@@ -180,7 +175,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
bytes_remaining -= chunk;
}
- volatile FisRegH2D* h2d_fis = (volatile FisRegH2D*)(&command_table->Cfis);
+ volatile FisRegH2D* h2d_fis = (volatile FisRegH2D*)(&command_table->Cfis[0]);
rt_set_memory((FisRegH2D*)h2d_fis, 0, sizeof(FisRegH2D));
@@ -274,7 +269,8 @@ STATIC Void ahci_enable_and_probe()
// Relocate Command List Base.
- constexpr UIntPtr const kAHCIBaseAddress = mib_cast(4);
+ auto const addr = mm_new_heap(kib_cast(64), YES, NO, 0);
+ auto kAHCIBaseAddress = (UIntPtr)addr;
port->Clb = kAHCIBaseAddress + (kSATAIndex << 10);
port->Clbu = 0;
@@ -301,6 +297,12 @@ STATIC Void ahci_enable_and_probe()
rt_set_memory(reinterpret_cast<VoidPtr>(cmd_hdr[i].Ctba), 0, 256);
}
+ for (UIntPtr offset = 0; offset < kib_cast(64); offset += kib_cast(1))
+ {
+ VoidPtr addr = reinterpret_cast<VoidPtr>(kAHCIBaseAddress + offset);
+ HAL::mm_map_page(addr, addr, HAL::kMMFlagsWr);
+ }
+
// Now we are ready.
kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre;
@@ -367,7 +369,9 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi)
ahci_enable_and_probe();
- break;
+ err_global_get() = kErrorSuccess;
+
+ return YES;
}
else if (atapi && kSATAPISignature == mem_ahci->Ports[ahci_index].Sig)
{
@@ -376,16 +380,14 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi)
ahci_enable_and_probe();
- break;
+ err_global_get() = kErrorSuccess;
+
+ return YES;
}
ports_implemented >>= 1;
++ahci_index;
}
-
- err_global_get() = kErrorSuccess;
-
- return YES;
}
}