summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-04 16:29:09 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-04 16:29:09 +0200
commit1b92501a27f8781945bc6b19bb43e22588d4c933 (patch)
tree8e73c4045188b0620bd8612dacdbab449ae97f94
parenta38083f7d528111087949a0ba8e3970f091f2fc9 (diff)
[IMP] ProgramLoader class for PE32+.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
-rw-r--r--Boot/BootKit/BootKit.hxx2
-rw-r--r--Boot/Sources/HEL/AMD64/BootFileReader.cxx30
-rw-r--r--Boot/Sources/HEL/AMD64/BootMain.cxx10
-rw-r--r--Boot/Sources/HEL/AMD64/Support.cxx19
-rw-r--r--Boot/Sources/ProgramLoader.cxx46
-rw-r--r--Kernel/HALKit/AMD64/HalBoot.asm3
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx4
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx73
-rw-r--r--Kernel/KernelKit/PE.hxx12
-rw-r--r--Kernel/amd64-efi.make4
10 files changed, 117 insertions, 86 deletions
diff --git a/Boot/BootKit/BootKit.hxx b/Boot/BootKit/BootKit.hxx
index 9bc915b2..1f6b7d95 100644
--- a/Boot/BootKit/BootKit.hxx
+++ b/Boot/BootKit/BootKit.hxx
@@ -101,7 +101,7 @@ public:
~BFileReader();
public:
- Void ReadAll(SizeT until, SizeT chunk = kib_cast(4));
+ Void ReadAll(SizeT until, SizeT chunk = kib_cast(4), UIntPtr outAddress = 0UL);
enum
{
diff --git a/Boot/Sources/HEL/AMD64/BootFileReader.cxx b/Boot/Sources/HEL/AMD64/BootFileReader.cxx
index f784bf6f..7b07ee23 100644
--- a/Boot/Sources/HEL/AMD64/BootFileReader.cxx
+++ b/Boot/Sources/HEL/AMD64/BootFileReader.cxx
@@ -123,12 +123,12 @@ BFileReader::~BFileReader()
@param **readUntil** size of file
@param **chunkToRead** chunk to read each time.
*/
-Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead)
+Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead, UIntPtr outAddress)
{
if (mBlob == nullptr)
{
EfiFileInfo newPtrInfo;
- UInt32 szInfo = 0;
+ UInt32 szInfo = 0;
EfiGUID cFileInfoGUID = EFI_FILE_INFO_GUID;
@@ -142,11 +142,18 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead)
mWriter.Write(L"newosldr: physical size: ").Write(readUntil).Write("\r");
}
- if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) !=
- kEfiOk)
+ if (!outAddress)
{
- mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r");
- EFI::ThrowError(L"OutOfMemory", L"Out of memory.");
+ if (auto err = BS->AllocatePool(EfiLoaderCode, readUntil, (VoidPtr*)&mBlob) !=
+ kEfiOk)
+ {
+ mWriter.Write(L"*** error: ").Write(err).Write(L" ***\r");
+ EFI::ThrowError(L"OutOfMemory", L"Out of memory.");
+ }
+ }
+ else
+ {
+ mBlob = (VoidPtr)outAddress;
}
}
@@ -163,16 +170,7 @@ Void BFileReader::ReadAll(SizeT readUntil, SizeT chunkToRead)
if (res == kBufferTooSmall)
{
- mErrorCode = kTooSmall;
- return;
- }
- else if (res == kEfiOk)
- {
- continue;
- }
- else
- {
- break;
+ bufSize = chunkToRead;
}
}
diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx
index 0c0c9953..6aec67f5 100644
--- a/Boot/Sources/HEL/AMD64/BootMain.cxx
+++ b/Boot/Sources/HEL/AMD64/BootMain.cxx
@@ -157,12 +157,6 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
CGDrawInRegion(CGColor(0xFF, 0xFF, 0xFF), handoverHdrPtr->f_GOP.f_Height, handoverHdrPtr->f_GOP.f_Width, 0, 0);
CGFini();
- // check if we are running in the PC platform. If so abort.
-#if defined(__NEWOS_AMD64__) && !defined(__DEBUG__)
- writer.Write(L"\rnewosldr: AMD64 support is not official.\r");
- EFI::ThrowError(L"Beta-Software", L"Beta Software.");
-#endif
-
// ---------------------------------------------------- //
// The following checks for an exisiting partition
// inside the disk, if it doesn't have one,
@@ -170,7 +164,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
// ---------------------------------------------------- //
BFileReader readerKernel(L"newoskrnl.dll", ImageHandle);
-
+
readerKernel.ReadAll(0);
Boot::ProgramLoader* loader = nullptr;
@@ -198,7 +192,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
// ---------------------------------------------------- //
cg_write_text("NEWOSLDR (C) ZKA TECHNOLOGIES.", 10, 10, RGB(0x00, 0x00, 0x00));
- cg_write_text("SMP OS (MAX 8 CORES).", 20, 10, RGB(0x00, 0x00, 0x00));
+ cg_write_text("LOADING NEWOSKRNL...", 20, 10, RGB(0x00, 0x00, 0x00));
loader->Start(handoverHdrPtr);
diff --git a/Boot/Sources/HEL/AMD64/Support.cxx b/Boot/Sources/HEL/AMD64/Support.cxx
index a2ac6394..8c82f78a 100644
--- a/Boot/Sources/HEL/AMD64/Support.cxx
+++ b/Boot/Sources/HEL/AMD64/Support.cxx
@@ -58,6 +58,25 @@ EXTERN_C size_t strlen(const char* whatToCheck)
return len;
}
+/// @brief strcmp definition in C++.
+EXTERN_C int strcmp(const char* whatToCheck, const char* whatToCheckRight)
+{
+ if (!whatToCheck || *whatToCheck == 0)
+ return 0;
+
+ SizeT len = 0;
+
+ while (whatToCheck[len] == whatToCheckRight[len])
+ {
+ if (whatToCheck[len] == 0)
+ return 0;
+
+ ++len;
+ }
+
+ return whatToCheck[len] == whatToCheckRight[len] ? 0 : len;
+}
+
/// @brief somthing specific to the Microsoft's ABI, When the stack grows too big.
EXTERN_C void ___chkstk_ms(void)
{
diff --git a/Boot/Sources/ProgramLoader.cxx b/Boot/Sources/ProgramLoader.cxx
index e4f61630..7461b87b 100644
--- a/Boot/Sources/ProgramLoader.cxx
+++ b/Boot/Sources/ProgramLoader.cxx
@@ -46,43 +46,47 @@ namespace Boot
ExecHeaderPtr hdrPtr = ldr_find_exec_header(firstBytes);
ExecOptionalHeaderPtr optHdr = ldr_find_opt_exec_header(firstBytes);
- // ================================ //
- // Allocate stack.
- // ================================ //
- fStackPtr = new Char[optHdr->mSizeOfStackReserve];
+ auto numSecs = hdrPtr->mNumberOfSections;
writer.Write("newosldr: Major Linker Ver: ").Write(optHdr->mMajorLinkerVersion).Write("\r");
writer.Write("newosldr: Minor Linker Ver: ").Write(optHdr->mMinorLinkerVersion).Write("\r");
writer.Write("newosldr: Major Subsystem Ver: ").Write(optHdr->mMajorSubsystemVersion).Write("\r");
writer.Write("newosldr: Minor Subsystem Ver: ").Write(optHdr->mMinorSubsystemVersion).Write("\r");
- writer.Write("newosldr: Magic: ").Write(optHdr->mMagic).Write("\r");
+ writer.Write("newosldr: Magic: ").Write(hdrPtr->mSignature).Write("\r");
writer.Write("newosldr: ImageBase: ").Write(optHdr->mImageBase).Write("\r");
- EfiPhysicalAddress base_img_addr = optHdr->mImageBase;
+ constexpr auto cPageSize = 512;
- constexpr auto cMaxSectionsOfKernel = 10;
+ EfiPhysicalAddress loadStartAddress = optHdr->mImageBase;
+ loadStartAddress += optHdr->mBaseOfData;
- BS->AllocatePages(EfiAllocateType::AllocateAnyPages, EfiMemoryType::EfiLoaderCode, cMaxSectionsOfKernel, &base_img_addr);
+ auto numPages = optHdr->mSizeOfImage / cPageSize;
+ BS->AllocatePages(AllocateAddress, EfiLoaderData, numPages, &loadStartAddress);
- ExecSectionHeaderPtr sectPtr = (ExecSectionHeaderPtr)((UIntPtr)firstBytes + ((DosHeaderPtr)firstBytes)->eLfanew + hdrPtr->mSizeOfOptionalHeader + sizeof(ExecHeader) + sizeof(UInt32));
+ ExecSectionHeaderPtr sectPtr = (ExecSectionHeaderPtr)(((Char*)optHdr) + hdrPtr->mSizeOfOptionalHeader);
- for (SizeT sectIndex = 0; sectIndex < cMaxSectionsOfKernel; ++sectIndex)
+ for (SizeT sectIndex = 0; sectIndex < numSecs; ++sectIndex)
{
ExecSectionHeaderPtr sect = &sectPtr[sectIndex];
- EfiPhysicalAddress address_to_alloc = sect->mVirtualAddress;
-
- // if this is a code header, then we can look for the entrypoint.
- if (sect->mCharacteristics & eUserSection)
+ if (strcmp(".text", sect->mName) == 0)
{
- if (!fStartAddress)
- {
- fStartAddress = (VoidPtr)((VoidPtr)((UIntPtr)sect->mPointerToRawData + (sect->mVirtualAddress - optHdr->mAddressOfEntryPoint)));
-
- writer.Write("newosldr: Start Address set: ").Write((UIntPtr)fStartAddress).Write("\r");
- }
+ fStartAddress = (VoidPtr)((UIntPtr)fBlob + sect->mVirtualAddress + optHdr->mAddressOfEntryPoint);
}
+
+ CopyMem((VoidPtr)(loadStartAddress + sect->mVirtualAddress), (VoidPtr)((UIntPtr)fBlob + sect->mPointerToRawData), sect->mSizeOfRawData);
}
+
+ EfiPhysicalAddress start = (EfiPhysicalAddress)fStartAddress;
+
+ BS->AllocatePages(AllocateAddress, EfiLoaderData, 1, &start);
+
+ writer.Write("newosldr: Start Address: ").Write((UIntPtr)fStartAddress).Write("\r");
+
+ // ================================ //
+ // Allocate stack.
+ // ================================ //
+ fStackPtr = new Char[optHdr->mSizeOfStackReserve];
}
else if (firstBytes[0] == kPefMagic[0] &&
firstBytes[1] == kPefMagic[1] &&
@@ -117,7 +121,7 @@ namespace Boot
BTextWriter writer;
writer.Write("newosldr: Exec format error, Thread has been aborted.\r");
- EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted.)");
+ EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted).");
};
if (!fStartAddress)
diff --git a/Kernel/HALKit/AMD64/HalBoot.asm b/Kernel/HALKit/AMD64/HalBoot.asm
index f03982e6..6cd119ac 100644
--- a/Kernel/HALKit/AMD64/HalBoot.asm
+++ b/Kernel/HALKit/AMD64/HalBoot.asm
@@ -29,4 +29,7 @@ section .text
[global ke_startup_platform]
ke_startup_platform:
+ push rax
+ jmp hal_init_platform
+ pop rax
ret \ No newline at end of file
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
index c9552851..dd912d2b 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
@@ -12,6 +12,10 @@
#include <KernelKit/ProcessScheduler.hxx>
#include <KernelKit/Timer.hxx>
+// Needed for SMP. //
+
+#include <KernelKit/MP.hxx>
+
#define kAPIC_ICR_Low 0x300
#define kAPIC_ICR_High 0x310
#define kAPIC_SIPI_Vector 0x00500
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 2eae6053..0ed63569 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -19,6 +19,7 @@
#include <Modules/ACPI/ACPIFactoryInterface.hxx>
#include <NetworkKit/IPC.hxx>
#include <CFKit/Property.hxx>
+#include <Modules/CoreCG/TextRenderer.hxx>
#define mInitKernel(X) \
X; \
@@ -52,6 +53,8 @@ struct PROCESS_EXIT_INFO final
Kernel::Char fReason[cReasonLen];
};
+STATIC Kernel::UInt32 kTextOffsetY = 30;
+
namespace Kernel::HAL
{
/// @brief Gets the system cores using the MADT.
@@ -82,6 +85,11 @@ EXTERN_C void hal_init_platform(
return;
}
+ cg_write_text("NEWOSKRNL (C) ZKA TECHNOLOGIES.", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
+ kTextOffsetY += 10;
+
+ cg_write_text("SMP OS (MAX 8 CORES).", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
+
kKernelVirtualSize = HandoverHeader->f_VirtualSize;
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset);
@@ -109,29 +117,30 @@ EXTERN_C void hal_init_platform(
// Register the basic SCI functions.
- constexpr auto cSerialAlertInterrupt = 0x10;
- constexpr auto cTlsInterrupt = 0x11;
- constexpr auto cTlsInstallInterrupt = 0x12;
- constexpr auto cNewInterrupt = 0x13;
- constexpr auto cDeleteInterrupt = 0x14;
- constexpr auto cExitInterrupt = 0x15;
- constexpr auto cLastExitInterrupt = 0x16;
- constexpr auto cCatalogOpen = 0x17;
- constexpr auto cForkRead = 0x18;
- constexpr auto cForkWrite = 0x19;
- constexpr auto cCatalogClose = 0x20;
- constexpr auto cCatalogRemove = 0x21;
- constexpr auto cCatalogCreate = 0x22;
- constexpr auto cRebootInterrupt = 0x23;
- constexpr auto cShutdownInterrupt = 0x24;
- constexpr auto cLPCSendMsg = 0x25;
- constexpr auto cLPCOpenMsg = 0x26;
- constexpr auto cLPCCloseMsg = 0x27;
- constexpr auto cLPCSanitizeMsg = 0x28;
-
- kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
+ constexpr auto cVGAWrite = 0x10;
+ constexpr auto cTlsInterrupt = 0x11;
+ constexpr auto cTlsInstallInterrupt = 0x12;
+ constexpr auto cNewInterrupt = 0x13;
+ constexpr auto cDeleteInterrupt = 0x14;
+ constexpr auto cExitInterrupt = 0x15;
+ constexpr auto cLastExitInterrupt = 0x16;
+ constexpr auto cCatalogOpen = 0x17;
+ constexpr auto cForkRead = 0x18;
+ constexpr auto cForkWrite = 0x19;
+ constexpr auto cCatalogClose = 0x20;
+ constexpr auto cCatalogRemove = 0x21;
+ constexpr auto cCatalogCreate = 0x22;
+ constexpr auto cRebootInterrupt = 0x23;
+ constexpr auto cShutdownInterrupt = 0x24;
+ constexpr auto cLPCSendMsg = 0x25;
+ constexpr auto cLPCOpenMsg = 0x26;
+ constexpr auto cLPCCloseMsg = 0x27;
+ constexpr auto cLPCSanitizeMsg = 0x28;
+
+ kSyscalls[cVGAWrite].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
const char* msg = (const char*)rdx;
- Kernel::kcout << "Kernel: " << msg << "\r";
+ cg_write_text(msg, kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
+ kTextOffsetY += 10;
};
kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](Kernel::VoidPtr rdx) -> void {
@@ -206,16 +215,16 @@ EXTERN_C void hal_init_platform(
pow.Shutdown();
};
- kSyscalls[cSerialAlertInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
- kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true;
+ kSyscalls[cVGAWrite].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInstallInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cDeleteInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cNewInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cExitInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cLastExitInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true;
// newoskrnl version 1.00.
Kernel::StringView strVer(cMaxPropLen);
diff --git a/Kernel/KernelKit/PE.hxx b/Kernel/KernelKit/PE.hxx
index bcf325c6..2931410f 100644
--- a/Kernel/KernelKit/PE.hxx
+++ b/Kernel/KernelKit/PE.hxx
@@ -26,6 +26,7 @@
typedef struct ExecHeader final
{
+ Kernel::UInt32 mSignature;
Kernel::UInt16 mMachine;
Kernel::UInt16 mNumberOfSections;
Kernel::UInt32 mTimeDateStamp;
@@ -33,7 +34,7 @@ typedef struct ExecHeader final
Kernel::UInt32 mNumberOfSymbols;
Kernel::UInt16 mSizeOfOptionalHeader;
Kernel::UInt16 mCharacteristics;
-} PACKED ExecHeader, *ExecHeaderPtr;
+} ExecHeader, *ExecHeaderPtr;
typedef struct ExecOptionalHeader final
{
@@ -67,7 +68,7 @@ typedef struct ExecOptionalHeader final
Kernel::UInt32 mSizeOfHeapCommit;
Kernel::UInt32 mLoaderFlags;
Kernel::UInt32 mNumberOfRvaAndSizes;
-} PACKED ExecOptionalHeader, *ExecOptionalHeaderPtr;
+} ExecOptionalHeader, *ExecOptionalHeaderPtr;
typedef struct ExecSectionHeader final
{
@@ -81,7 +82,7 @@ typedef struct ExecSectionHeader final
Kernel::UInt16 mNumberOfRelocations;
Kernel::UInt16 mNumberOfLinenumbers;
Kernel::UInt32 mCharacteristics;
-} ExecSectionHeader, *ExecSectionHeaderPtr;
+} ExecSectionHeader, *ExecSectionHeaderPtr;
enum kExecDataDirParams
{
@@ -104,7 +105,7 @@ typedef struct ExecExportDirectory
Kernel::UInt32 mAddressOfFunctions; // export table rva
Kernel::UInt32 mAddressOfNames;
Kernel::UInt32 mAddressOfNameOrdinal; // ordinal table rva
-} PACKED ExecExportDirectory, *ExecExportDirectoryPtr;
+} ExecExportDirectory, *ExecExportDirectoryPtr;
typedef struct ExecImportDirectory
{
@@ -116,7 +117,7 @@ typedef struct ExecImportDirectory
Kernel::UInt32 mForwarderChain;
Kernel::UInt32 mNameRva;
Kernel::UInt32 mThunkTableRva;
-} PACKED ExecImportDirectory, *ExecImportDirectoryPtr;
+} ExecImportDirectory, *ExecImportDirectoryPtr;
typedef struct ExecDataDirectory {
Kernel::UInt32 VirtualAddress;
@@ -124,7 +125,6 @@ typedef struct ExecDataDirectory {
} ExecDataDirectory, *ExecDataDirectoryPtr;
typedef struct ExecImageHeader {
- Kernel::UInt32 mSignature;
ExecHeader mHeader;
ExecOptionalHeader mOptHdr;
} ExecImageHeader, *ExecImageHeaderPtr;
diff --git a/Kernel/amd64-efi.make b/Kernel/amd64-efi.make
index fd2ecc55..bf41827b 100644
--- a/Kernel/amd64-efi.make
+++ b/Kernel/amd64-efi.make
@@ -5,7 +5,7 @@
CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -c -ffreestanding -fPIC -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
+CCFLAGS = -fshort-wchar -c -ffreestanding -fPIC -shared -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
-std=c++20 -D__NEWOS_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ \
-D__NEWOSKRNL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./ -I../
@@ -35,7 +35,7 @@ COPY = cp
ASMFLAGS = -f win64
# Kernel subsystem is 17 and entrypoint is __ImageStart
-LDFLAGS = -e ke_startup_platform --subsystem=17
+LDFLAGS = -e ke_startup_platform --subsystem=17 --image-base 0x10000000
LDOBJ = Objects/*.obj
# This file is the kernel, responsible of task management and memory.