summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Private/ArchKit/ArchKit.hpp9
-rw-r--r--Private/HALKit/AMD64/HalDebugOutput.cxx12
-rw-r--r--Private/HALKit/AMD64/HalHardwareInit.cpp13
-rw-r--r--Private/KernelKit/DebugOutput.hpp10
-rw-r--r--Private/NewBoot/Source/HEL/AMD64/AMD64-Platform.cxx4
-rw-r--r--Private/NewBoot/Source/RuntimeMain.cxx17
-rw-r--r--Private/Source/KernelHeap.cxx13
-rw-r--r--Private/Source/KernelMain.cxx (renamed from Private/Source/RuntimeMain.cxx)4
-rw-r--r--Private/Source/PageManager.cxx11
-rw-r--r--Private/Source/Pmm.cxx18
-rw-r--r--Private/makefile2
-rw-r--r--Public/Kits/SystemKit/XIFF.hxx5
12 files changed, 72 insertions, 46 deletions
diff --git a/Private/ArchKit/ArchKit.hpp b/Private/ArchKit/ArchKit.hpp
index ae63c2a1..20d83ecc 100644
--- a/Private/ArchKit/ArchKit.hpp
+++ b/Private/ArchKit/ArchKit.hpp
@@ -62,11 +62,10 @@ extern HCore::Array<void (*)(HCore::Int32 id, HCore::HAL::StackFrame *),
kMaxSyscalls>
kSyscalls;
-extern "C" HCore::Void rt_wait_for_io();
-extern "C" HCore::Void rt_syscall_handle(HCore::HAL::StackFramePtr stackFrame);
-extern "C" HCore::HAL::StackFramePtr rt_get_current_context();
-extern "C" HCore::Void rt_do_context_switch(
- HCore::HAL::StackFramePtr stackFrame);
+EXTERN_C HCore::Void rt_wait_for_io();
+EXTERN_C HCore::Void rt_syscall_handle(HCore::HAL::StackFramePtr stackFrame);
+EXTERN_C HCore::HAL::StackFramePtr rt_get_current_context();
+EXTERN_C HCore::Void rt_do_context_switch(HCore::HAL::StackFramePtr stackFrame);
inline HCore::VoidPtr kKernelVirtualStart;
inline HCore::UIntPtr kKernelVirtualSize;
diff --git a/Private/HALKit/AMD64/HalDebugOutput.cxx b/Private/HALKit/AMD64/HalDebugOutput.cxx
index ba8770fe..635537ae 100644
--- a/Private/HALKit/AMD64/HalDebugOutput.cxx
+++ b/Private/HALKit/AMD64/HalDebugOutput.cxx
@@ -42,7 +42,7 @@ bool serial_init() {
ke_stop(RUNTIME_CHECK_HANDSHAKE);
}
- kReady = kStateReady;
+ kState = kStateReady;
// If serial is not faulty set it in normal operation mode
// (not-loopback with IRQs enabled and OUT#1 and OUT#2 bits enabled)
@@ -54,6 +54,8 @@ bool serial_init() {
} // namespace Detail
void ke_io_print(const char *bytes) {
+ Detail::serial_init();
+
if (!bytes || Detail::kState != kStateReady) return;
if (*bytes == 0) return;
@@ -67,8 +69,14 @@ void ke_io_print(const char *bytes) {
++index;
}
+ HAL::Out8(Detail::PORT, '\r');
+ HAL::Out8(Detail::PORT, '\n');
Detail::kState = kStateReady;
}
-TerminalDevice kcout(HCore::ke_io_print, nullptr);
+TerminalDevice TerminalDevice::Shared() noexcept {
+ TerminalDevice out(HCore::ke_io_print, nullptr);
+ return out;
+}
+
} // namespace HCore
diff --git a/Private/HALKit/AMD64/HalHardwareInit.cpp b/Private/HALKit/AMD64/HalHardwareInit.cpp
index adcacce4..2a44f696 100644
--- a/Private/HALKit/AMD64/HalHardwareInit.cpp
+++ b/Private/HALKit/AMD64/HalHardwareInit.cpp
@@ -13,20 +13,15 @@
extern "C" HCore::VoidPtr __EXEC_IVT;
-static HCore::HAL::Register64* kIdtRegister;
-static HCore::HAL::Register64* kGdtRegister;
-
namespace HCore {
bool ke_init_hal() {
- kIdtRegister = nullptr;
- kGdtRegister = nullptr;
+ HCore::HAL::Register64 kIdtRegister;
- kIdtRegister = new HCore::HAL::Register64();
- kIdtRegister->Base = (UIntPtr)__EXEC_IVT;
- kIdtRegister->Limit = sizeof(HAL::Register64) * 256;
+ kIdtRegister.Base = (UIntPtr)__EXEC_IVT;
+ kIdtRegister.Limit = sizeof(HAL::Register64) * 256;
HAL::IDTLoader idt;
- idt.Load(*kIdtRegister);
+ idt.Load(kIdtRegister);
return true;
}
diff --git a/Private/KernelKit/DebugOutput.hpp b/Private/KernelKit/DebugOutput.hpp
index 6e651924..235163ac 100644
--- a/Private/KernelKit/DebugOutput.hpp
+++ b/Private/KernelKit/DebugOutput.hpp
@@ -28,11 +28,17 @@ class TerminalDevice final : public DeviceInterface<const Char *> {
TerminalDevice &operator=(const TerminalDevice &) = default;
TerminalDevice(const TerminalDevice &) = default;
+
+ static TerminalDevice Shared() noexcept;
};
namespace Detail {
bool serial_init();
}
-
-extern TerminalDevice kcout;
} // namespace HCore
+
+#ifdef kcout
+#undef kcout
+#endif // ifdef kcout
+
+#define kcout TerminalDevice::Shared()
diff --git a/Private/NewBoot/Source/HEL/AMD64/AMD64-Platform.cxx b/Private/NewBoot/Source/HEL/AMD64/AMD64-Platform.cxx
index 5a4a2445..e6c962b1 100644
--- a/Private/NewBoot/Source/HEL/AMD64/AMD64-Platform.cxx
+++ b/Private/NewBoot/Source/HEL/AMD64/AMD64-Platform.cxx
@@ -18,6 +18,8 @@
#include <BootKit/Platform.hxx>
#include <EFIKit/Api.hxx>
+#ifndef __BUNDLE_KERNEL__
+
extern "C" void rt_halt() { asm volatile("hlt"); }
extern "C" void rt_cli() { asm volatile("cli"); }
@@ -32,6 +34,8 @@ extern "C" void rt_std() { asm volatile("std"); }
extern "C" void ___chkstk_ms(void) {}
+#endif
+
namespace EFI {
Void Stop() noexcept {
while (true) {
diff --git a/Private/NewBoot/Source/RuntimeMain.cxx b/Private/NewBoot/Source/RuntimeMain.cxx
index 38eb0ea8..4dd0c437 100644
--- a/Private/NewBoot/Source/RuntimeMain.cxx
+++ b/Private/NewBoot/Source/RuntimeMain.cxx
@@ -18,7 +18,7 @@
#ifdef __x86_64__
#include <HALKit/AMD64/HalPageAlloc.hpp>
#else
-#error Unknown CPU.
+#error This CPU is unknown.
#endif // ifdef __x86_64__
#define kHeadersSz \
@@ -43,7 +43,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle,
const char strDate[] = __DATE__;
- writer.WriteString(L"HCoreLdr: Build date: ");
+ writer.WriteString(L"HCoreLdr: Build: ");
for (auto& ch : strDate) writer.WriteCharacter(ch);
@@ -64,7 +64,8 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle,
if (ptrHdr && ptrHdr->mMachine == EFI::Platform() &&
ptrHdr->mMagic == kPeMagic) {
- if (ptrHdr->mNumberOfSections > 1) {
+ /// sections must be at least 3.
+ if (ptrHdr->mNumberOfSections >= 3) {
ExecOptionalHeaderPtr optHdr = reinterpret_cast<ExecOptionalHeaderPtr>(
ptrHdr + sizeof(ExecHeader));
@@ -122,15 +123,7 @@ EFI_EXTERN_C EFI_API Int EfiMain(EfiHandlePtr ImageHandle,
SystemTable->FirmwareVendor,
handoverHdrPtr->f_FirmwareVendorLen);
- writer.WriteString(L"HCoreLdr: Leaving it to kernel...\r\n");
-
- EFI::ExitBootServices(MapKey, ImageHandle);
-
- HCore::HEL::HandoverProc proc =
- reinterpret_cast<HCore::HEL::HandoverProc>(
- optHdr->mAddressOfEntryPoint);
-
- proc(handoverHdrPtr);
+ writer.WriteString(L"HCoreLdr: Booting HCore...\r\n");
EFI::Stop();
diff --git a/Private/Source/KernelHeap.cxx b/Private/Source/KernelHeap.cxx
index 72aa2d67..38b279a7 100644
--- a/Private/Source/KernelHeap.cxx
+++ b/Private/Source/KernelHeap.cxx
@@ -9,6 +9,8 @@
#include <NewKit/KernelHeap.hpp>
+#include "KernelKit/DebugOutput.hpp"
+
//! @file KernelHeap.cpp
//! @brief Kernel allocator.
@@ -18,7 +20,7 @@ namespace HCore {
static Ref<PTEWrapper *> kWrapperList[kMaxWrappers];
static SizeT kWrapperCount = 0UL;
static Ref<PTEWrapper *> kLastWrapper;
-static Pmm kPmm;
+static PageManager kPageManager;
namespace Detail {
STATIC voidPtr ke_find_heap(const SizeT &sz, const bool rw, const bool user) {
@@ -45,7 +47,7 @@ VoidPtr ke_new_ke_heap(SizeT sz, const bool rw, const bool user) {
if (auto ptr = Detail::ke_find_heap(sz, rw, user); ptr) return ptr;
- Ref<PTEWrapper *> wrapper = kPmm.RequestPage(user, rw);
+ Ref<PTEWrapper *> wrapper = kPageManager.Request(user, rw, false);
if (wrapper) {
kLastWrapper = wrapper;
@@ -67,7 +69,7 @@ Int32 ke_delete_ke_heap(voidPtr ptr) {
const UIntPtr virtualAddress = reinterpret_cast<UIntPtr>(ptr);
if (kLastWrapper && virtualAddress == kLastWrapper->VirtualAddress()) {
- if (kPmm.FreePage(kLastWrapper)) {
+ if (kPageManager.Free(kLastWrapper)) {
kLastWrapper->NoExecute(false);
return true;
}
@@ -82,7 +84,7 @@ Int32 ke_delete_ke_heap(voidPtr ptr) {
wrapper = kWrapperList[indexWrapper];
// if page is no more, then mark it also as non executable.
- if (kPmm.FreePage(wrapper)) {
+ if (kPageManager.Free(wrapper)) {
wrapper->NoExecute(false);
return true;
}
@@ -124,6 +126,7 @@ Boolean kernel_valid_ptr(voidPtr ptr) {
Void ke_init_ke_heap() noexcept {
kWrapperCount = 0UL;
Ref<PTEWrapper *> kLastWrapper = Ref<PTEWrapper *>(nullptr);
- Pmm kPmm = Pmm();
+
+ kcout << "KernelHeap: Init [OK]\r\n";
}
} // namespace HCore
diff --git a/Private/Source/RuntimeMain.cxx b/Private/Source/KernelMain.cxx
index abbfb749..1d52967d 100644
--- a/Private/Source/RuntimeMain.cxx
+++ b/Private/Source/KernelMain.cxx
@@ -15,7 +15,9 @@
#include <NewKit/KernelHeap.hpp>
#include <NewKit/UserHeap.hpp>
-extern "C" void RuntimeMain(
+#include "NewKit/Utils.hpp"
+
+EXTERN_C void RuntimeMain(
HCore::HEL::HandoverInformationHeader* HandoverHeader) {
/// Setup kernel globals.
kKernelVirtualSize = HandoverHeader->f_VirtualSize;
diff --git a/Private/Source/PageManager.cxx b/Private/Source/PageManager.cxx
index b4d9ed8e..b3a168d3 100644
--- a/Private/Source/PageManager.cxx
+++ b/Private/Source/PageManager.cxx
@@ -10,6 +10,8 @@
#include <KernelKit/DebugOutput.hpp>
#include <NewKit/PageManager.hpp>
+#include "NewKit/String.hpp"
+
#ifdef __x86_64__
#include <HALKit/AMD64/HalPageAlloc.hpp>
#endif // ifdef __x86_64__
@@ -47,6 +49,13 @@ 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);
}
@@ -75,6 +84,8 @@ PTEWrapper *PageManager::Request(Boolean Rw, Boolean User,
return nullptr;
}
+ PageTableEntry->NoExecute(ExecDisable);
+
*PageTableEntry =
PTEWrapper{Rw, User, ExecDisable, Detail::create_page_wrapper(Rw, User)};
return PageTableEntry;
diff --git a/Private/Source/Pmm.cxx b/Private/Source/Pmm.cxx
index 7eb6875e..58f3e4a2 100644
--- a/Private/Source/Pmm.cxx
+++ b/Private/Source/Pmm.cxx
@@ -11,22 +11,24 @@
#include <NewKit/Pmm.hpp>
namespace HCore {
-Pmm::Pmm() : m_PageManager() {
- kcout << "[PMM] Allocate PageMemoryManager\r\n";
-}
+Pmm::Pmm() : m_PageManager() { kcout << "[PMM] Allocate PageMemoryManager"; }
Pmm::~Pmm() = default;
/* If this returns Null pointer, enter emergency mode */
Ref<PTEWrapper *> Pmm::RequestPage(Boolean user, Boolean readWrite) {
- if (m_PageManager) {
- PTEWrapper *pt = m_PageManager.Leak().Request(user, readWrite, true);
+ PTEWrapper *pt = m_PageManager.Leak().Request(user, readWrite, false);
+
+ if (pt) {
+ pt->m_Present = true;
+ pt->FlushTLB(m_PageManager);
+
+ kcout << "[PMM]: Allocation was successful.";
- if (pt) return Ref<PTEWrapper *>(pt);
+ return Ref<PTEWrapper *>(pt);
}
- kcout << "[Pmm::RequestPage] Ref<PTEWrapper*> could not be created! "
- "m_PageManager is nullptr!\r\n";
+ kcout << "[PMM]: Allocation failure.";
return {};
}
diff --git a/Private/makefile b/Private/makefile
index 1296117b..9aab13b8 100644
--- a/Private/makefile
+++ b/Private/makefile
@@ -5,7 +5,7 @@
CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -c -ffreestanding -fno-rtti -fno-exceptions -std=c++20 -D__USE_NEWFS__ -D__HAVE_HCORE_APIS__ -D__HCORE__ -I../ -I./ -I$(HOME)/
+CCFLAGS = -c -ffreestanding -fno-rtti -fno-exceptions -std=c++20 -D__DEBUG__ -D__USE_NEWFS__ -D__HAVE_HCORE_APIS__ -D__HCORE__ -I../ -I./ -I$(HOME)/
ASM = nasm
ASMFLAGS = -f win64
LDFLAGS = -e Main -shared --subsystem=17
diff --git a/Public/Kits/SystemKit/XIFF.hxx b/Public/Kits/SystemKit/XIFF.hxx
index fb8b441f..665a8b67 100644
--- a/Public/Kits/SystemKit/XIFF.hxx
+++ b/Public/Kits/SystemKit/XIFF.hxx
@@ -2,7 +2,8 @@
(C) Mahrouss Logic
===========================================*/
-#pragma once
+#ifndef __XIFF__
+#define __XIFF__
/** ---------------------------------------------------
@@ -31,3 +32,5 @@ struct PACKED XiffHeader {
#define kXIFFAudio "XAFF"
#define kXIFFInstaller "XnFF"
#define kXIFFGeneric "XIFF"
+
+#endif // ifndef __XIFF__