summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel/HALKit
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-04-11 17:52:52 +0200
committerGitHub <noreply@github.com>2025-04-11 17:52:52 +0200
commitc1d9fbd3925d6e10919a7793fc214c9f1a01b2ab (patch)
treea74bdf6f87d07a24496effbc157f74d379d25007 /dev/kernel/HALKit
parent8988b6f166d1087615b21229df651e0bcc0fa048 (diff)
parentc3856eddb5a8146751dac82ad1ba4433f5ca6d6d (diff)
Merge pull request #14 from amlel-el-mahrouss/dev
tweak kernel, boot: use -Wall, -Werror, -Wpedantic now
Diffstat (limited to 'dev/kernel/HALKit')
-rw-r--r--dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc2
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc7
-rw-r--r--dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc46
-rw-r--r--dev/kernel/HALKit/AMD64/HalDebugOutput.cc10
-rw-r--r--dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc41
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc4
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelPanic.cc17
-rw-r--r--dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc90
-rw-r--r--dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc3
-rw-r--r--dev/kernel/HALKit/AMD64/HalTimerAMD64.cc2
-rw-r--r--dev/kernel/HALKit/AMD64/PCI/DMA.cc10
-rw-r--r--dev/kernel/HALKit/AMD64/Paging.h29
-rw-r--r--dev/kernel/HALKit/AMD64/Processor.h11
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc19
-rw-r--r--dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc5
-rw-r--r--dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc2
-rw-r--r--dev/kernel/HALKit/ARM64/HalKernelPanic.cc4
17 files changed, 148 insertions, 154 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc b/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc
index 711fc78a..2430da07 100644
--- a/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc
+++ b/dev/kernel/HALKit/AMD64/HalACPIFactoryInterface.cc
@@ -89,7 +89,6 @@ namespace Kernel
Bool ACPIFactoryInterface::Shutdown()
{
- failed_to_shutdown:
return NO;
}
@@ -97,7 +96,6 @@ namespace Kernel
/// @return nothing it's a reboot.
Void ACPIFactoryInterface::Reboot()
{
- failed_to_reboot:
asm volatile(".intel_syntax noprefix; "
"rt_reset_hardware:; "
"cli; "
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index c7e639e4..43888f3b 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -103,7 +103,7 @@ namespace Kernel::HAL
UInt32 AcpiID;
} LApic;
};
- } List[]; // Records List
+ } List[1]; // Records List
};
///////////////////////////////////////////////////////////////////////////////////////
@@ -215,7 +215,6 @@ namespace Kernel::HAL
kSMPInterrupt = 0;
kSMPCount = 0;
- UInt32 eax, edx;
kout << "SMP: Starting APs...\r";
kApicBaseAddress = kMADTBlock->Address;
@@ -242,7 +241,7 @@ namespace Kernel::HAL
break;
kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].LAPIC.ProcessorID;
- kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl;
+ (void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl);
// I'll just make the AP start from scratch here.
@@ -265,7 +264,7 @@ namespace Kernel::HAL
++index;
}
- kout << "SMP: number of APs: " << number(kSMPCount) << kendl;
+ (void)(kout << "SMP: number of APs: " << number(kSMPCount) << kendl);
// Kernel is now SMP aware.
// That means that the scheduler is now available (on MP Kernels)
diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
index 7de5bb0b..7209fd06 100644
--- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc
@@ -22,13 +22,13 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp)
kIsScheduling = NO;
- kout << "Kernel: General Protection Fault.\r";
+ Kernel::kout << "Kernel: General Protection Fault.\r";
process.Leak().ProcessSignal.SignalArg = rsp;
process.Leak().ProcessSignal.SignalID = SIGKILL;
process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status;
- kout << "Kernel: SIGKILL status.\r";
+ Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
@@ -46,8 +46,8 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp)
kIsScheduling = NO;
- kout << "Kernel: Page Fault.\r";
- kout << "Kernel: SIGKILL\r";
+ Kernel::kout << "Kernel: Page Fault.\r";
+ Kernel::kout << "Kernel: SIGKILL\r";
process.Leak().ProcessSignal.SignalArg = rsp;
process.Leak().ProcessSignal.SignalID = SIGKILL;
@@ -66,6 +66,8 @@ namespace Kernel::Detail
/// @brief Handle scheduler interrupt.
EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp)
{
+ NE_UNUSED(rsp);
+
static Kernel::Int64 try_count_before_brute = Kernel::Detail::kTimeoutCount;
while (kIsScheduling)
@@ -95,13 +97,13 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp)
kIsScheduling = NO;
- kout << "Kernel: Math error (division by zero?).\r";
+ Kernel::kout << "Kernel: Math error (division by zero?).\r";
process.Leak().ProcessSignal.SignalArg = rsp;
process.Leak().ProcessSignal.SignalID = SIGKILL;
process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status;
- kout << "Kernel: SIGKILL status.\r";
+ Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
@@ -119,13 +121,13 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp)
kIsScheduling = NO;
- kout << "Kernel: Generic Process Fault.\r";
+ Kernel::kout << "Kernel: Generic Process Fault.\r";
process.Leak().ProcessSignal.SignalArg = rsp;
process.Leak().ProcessSignal.SignalID = SIGKILL;
process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status;
- kout << "Kernel: SIGKILL status.\r";
+ Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
@@ -138,7 +140,7 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip)
if (process.Leak().Status != Kernel::ProcessStatusKind::kRunning)
{
- kout << "Kernel: SIGTRAP\r";
+ Kernel::kout << "Kernel: SIGTRAP\r";
while (YES)
;
@@ -146,15 +148,15 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip)
kIsScheduling = NO;
- kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << kendl;
- kout << "Kernel: SIGTRAP\r";
+ (void)(Kernel::kout << "Kernel: Process RIP: " << Kernel::hex_number(rip) << Kernel::kendl);
+ Kernel::kout << "Kernel: SIGTRAP\r";
process.Leak().ProcessSignal.SignalArg = rip;
process.Leak().ProcessSignal.SignalID = SIGTRAP;
process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status;
- kout << "Kernel: SIGTRAP status.\r";
+ Kernel::kout << "Kernel: SIGTRAP status.\r";
process.Leak().Status = Kernel::ProcessStatusKind::kFrozen;
}
@@ -170,13 +172,13 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp)
kIsScheduling = NO;
- kout << "Kernel: Undefined Opcode.\r";
+ Kernel::kout << "Kernel: Undefined Opcode.\r";
process.Leak().ProcessSignal.SignalArg = rsp;
process.Leak().ProcessSignal.SignalID = SIGKILL;
process.Leak().ProcessSignal.PreviousStatus = process.Leak().Status;
- kout << "Kernel: SIGKILL status.\r";
+ Kernel::kout << "Kernel: SIGKILL status.\r";
process.Leak().Status = Kernel::ProcessStatusKind::kKilled;
@@ -190,7 +192,7 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, K
{
if (rcx_syscall_index < kSyscalls.Count())
{
- kout << "syscall: Enter Syscall.\r";
+ Kernel::kout << "syscall: Enter Syscall.\r";
if (kSyscalls[rcx_syscall_index].fHooked)
{
@@ -200,15 +202,15 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx_syscall_index, K
}
else
{
- kout << "syscall: syscall isn't valid at all! (is nullptr)\r";
+ Kernel::kout << "syscall: syscall isn't valid at all! (is nullptr)\r";
}
}
else
{
- kout << "syscall: syscall isn't hooked at all! (is set to false)\r";
+ Kernel::kout << "syscall: syscall isn't hooked at all! (is set to false)\r";
}
- kout << "syscall: Exit Syscall.\r";
+ Kernel::kout << "syscall: Exit Syscall.\r";
}
}
@@ -219,7 +221,7 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index,
{
if (rcx_kerncall_index < kKerncalls.Count())
{
- kout << "kerncall: Enter Kernel Call List.\r";
+ Kernel::kout << "kerncall: Enter Kernel Call List.\r";
if (kKerncalls[rcx_kerncall_index].fHooked)
{
@@ -229,14 +231,14 @@ EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx_kerncall_index,
}
else
{
- kout << "kerncall: Kernel call isn't valid at all! (is nullptr)\r";
+ Kernel::kout << "kerncall: Kernel call isn't valid at all! (is nullptr)\r";
}
}
else
{
- kout << "kerncall: Kernel call isn't hooked at all! (is set to false)\r";
+ Kernel::kout << "kerncall: Kernel call isn't hooked at all! (is set to false)\r";
}
- kout << "kerncall: Exit Kernel Call List.\r";
+ Kernel::kout << "kerncall: Exit Kernel Call List.\r";
}
}
diff --git a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
index e79b6b09..0ee7eef0 100644
--- a/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
+++ b/dev/kernel/HALKit/AMD64/HalDebugOutput.cc
@@ -65,6 +65,8 @@ namespace Kernel
EXTERN_C void ke_io_write(IDeviceObject<const Char*>* obj, const Char* bytes)
{
+ NE_UNUSED(obj);
+
#ifdef __DEBUG__
Detail::hal_serial_init<Detail::kPort>();
@@ -82,7 +84,7 @@ namespace Kernel
index = 0;
len = rt_string_len(bytes, 256U);
- static int x = kFontSizeX, y = kFontSizeY;
+ static SizeT x = kFontSizeX, y = kFontSizeY;
static BOOL not_important = YES;
@@ -123,12 +125,8 @@ namespace Kernel
{
y = kFontSizeY;
- fb_init();
-
FBDrawInRegion(fb_get_clear_clr(), FB::FBAccessibilty::Height(), FB::FBAccessibilty::Width(),
0, 0);
-
- fb_clear();
}
++index;
@@ -183,7 +181,7 @@ namespace Kernel
TerminalDevice TerminalDevice::The() noexcept
{
- TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read);
+ static TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read);
return out;
}
diff --git a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
index 96276964..ddfc49b6 100644
--- a/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
+++ b/dev/kernel/HALKit/AMD64/HalDescriptorLoader.cc
@@ -17,26 +17,8 @@ namespace Kernel::HAL
STATIC ::Kernel::Detail::AMD64::InterruptDescriptorAMD64
kInterruptVectorTable[kKernelIdtSize] = {};
- STATIC void hal_set_irq_mask(UInt8 irql);
- STATIC void hal_clear_irq_mask(UInt8 irql);
-
- STATIC Void hal_enable_pit(UInt16 ticks) noexcept
- {
- if (ticks == 0)
- ticks = kPITDefaultTicks;
-
- // Configure PIT to receieve scheduler interrupts.
-
- UInt16 kPITCommDivisor = kPITFrequency / ticks; // 100 Hz.
-
- HAL::rt_out8(kPITControlPort, 0x36); // Command to PIT
- HAL::rt_out8(kPITChannel0Port, kPITCommDivisor & 0xFF); // Send low byte
- HAL::rt_out8(kPITChannel0Port, (kPITCommDivisor >> 8) & 0xFF); // Send high byte
-
- hal_clear_irq_mask(32);
- }
-
- STATIC void hal_set_irq_mask(UInt8 irql)
+#if 0
+ STATIC void hal_set_irq_mask(UInt8 irql) [[maybe_unused]]
{
UInt16 port;
UInt8 value;
@@ -54,8 +36,9 @@ namespace Kernel::HAL
value = rt_in8(port) | (1 << irql);
rt_out8(port, value);
}
+#endif // make gcc shut up
- STATIC void hal_clear_irq_mask(UInt8 irql)
+ STATIC void hal_clear_irq_mask(UInt8 irql) [[maybe_unused]]
{
UInt16 port;
UInt8 value;
@@ -73,6 +56,22 @@ namespace Kernel::HAL
value = rt_in8(port) & ~(1 << irql);
rt_out8(port, value);
}
+
+ STATIC Void hal_enable_pit(UInt16 ticks) noexcept
+ {
+ if (ticks == 0)
+ ticks = kPITDefaultTicks;
+
+ // Configure PIT to receieve scheduler interrupts.
+
+ UInt16 kPITCommDivisor = kPITFrequency / ticks; // 100 Hz.
+
+ HAL::rt_out8(kPITControlPort, 0x36); // Command to PIT
+ HAL::rt_out8(kPITChannel0Port, kPITCommDivisor & 0xFF); // Send low byte
+ HAL::rt_out8(kPITChannel0Port, (kPITCommDivisor >> 8) & 0xFF); // Send high byte
+
+ hal_clear_irq_mask(32);
+ }
} // namespace Detail
/// @brief Loads the provided Global Descriptor Table.
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index 0d58bb8a..cc346b5c 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -96,7 +96,7 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
{
kEndTim = hal_rdtsc_fn();
- kout << "Boot Time: " << Kernel::number(kEndTim - kStartTim) << kendl;
+ (void)(Kernel::kout << "Boot Time: " << Kernel::number(kEndTim - kStartTim) << Kernel::kendl);
Kernel::NeFS::fs_init_nefs();
@@ -110,7 +110,7 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept
kEndTim = hal_rdtsc_fn();
- kout << "Init Time: " << Kernel::number(kEndTim - kStartTim) << kendl;
+ (void)(Kernel::kout << "Init Time: " << Kernel::number(kEndTim - kStartTim) << Kernel::kendl);
idt_loader.Load(idt_reg);
diff --git a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
index 3703692c..2641f058 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelPanic.cc
@@ -33,16 +33,9 @@ namespace Kernel
/***********************************************************************************/
Void ke_panic(const Kernel::Int32& id, const Char* message)
{
- fb_init();
-
- auto panic_text = RGB(0xff, 0xff, 0xff);
-
- auto y = 10;
- auto x = 10;
-
- kout << "Kernel_Panic_MSG: " << message << kendl;
- kout << "Kernel_Panic_ID: " << hex_number(id) << kendl;
- kout << "Kernel_Panic_CR2: " << hex_number((UIntPtr)hal_read_cr2()) << kendl;
+ (void)(kout << "Kernel_Panic_MSG: " << message << kendl);
+ (void)(kout << "Kernel_Panic_ID: " << hex_number(id) << kendl);
+ (void)(kout << "Kernel_Panic_CR2: " << hex_number((UIntPtr)hal_read_cr2()) << kendl);
RecoveryFactory::Recover();
}
@@ -59,8 +52,8 @@ namespace Kernel
{
if (!expr)
{
- kout << "Kernel_Panic_File: " << file << kendl;
- kout << "Kernel_Panic_Line: " << line << kendl;
+ (void)(kout << "Kernel_Panic_File: " << file << kendl);
+ (void)(kout << "Kernel_Panic_Line: " << line << kendl);
ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
}
diff --git a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
index 040b6fd9..8bd98923 100644
--- a/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalPagingMgrAMD64.cc
@@ -12,6 +12,41 @@
namespace Kernel::HAL
{
+ namespace Detail
+ {
+ struct PTE
+ {
+ UInt64 Present : 1;
+ UInt64 Wr : 1;
+ UInt64 User : 1;
+ UInt64 Pwt : 1; // Page-level Write-Through
+ UInt64 Pcd : 1; // Page-level Cache Disable
+ UInt64 Accessed : 1;
+ UInt64 Dirty : 1;
+ UInt64 Pat : 1; // Page Attribute Table (or PS for PDE)
+ UInt64 Global : 1;
+ UInt64 Ignored1 : 3; // Available to software
+ UInt64 PhysicalAddress : 40; // Physical page frame address (bits 12–51)
+ UInt64 Ignored2 : 7; // More software bits / reserved
+ UInt64 Protection_key : 4; // Optional (if PKU enabled)
+ UInt64 Reserved : 1; // Usually reserved
+ UInt64 Nx : 1; // No Execute
+ };
+ } // namespace Detail
+
+ /***********************************************************************************/
+ /// \brief Retrieve the page status of a PTE.
+ /// \param pte Page Table Entry pointer.
+ /***********************************************************************************/
+ STATIC Void mmi_page_status(Detail::PTE* pte)
+ {
+ (void)(kout << (pte->Present ? "Present" : "Not Present") << kendl);
+ (void)(kout << (pte->Wr ? "W/R" : "Not W/R") << kendl);
+ (void)(kout << (pte->Nx ? "NX" : "Not NX") << kendl);
+ (void)(kout << (pte->User ? "User" : "Not User") << kendl);
+ (void)(kout << (pte->Pcd ? "Not Cached" : "Cached") << kendl);
+ }
+
/***********************************************************************************/
/// @brief Gets a physical address from a virtual address.
/// @param virt a valid virtual address.
@@ -25,6 +60,8 @@ namespace Kernel::HAL
UInt64 cr3 = (UInt64)hal_read_cr3() & ~kPageOffsetMask;
+ hal_invl_tlb(virt);
+
// Level 4
auto pml4 = reinterpret_cast<UInt64*>(cr3);
UInt64 pml4e = pml4[(vaddr >> 39) & kMask9Bits];
@@ -54,28 +91,16 @@ namespace Kernel::HAL
// Level 1
auto pt = reinterpret_cast<UInt64*>(pde & ~kPageOffsetMask);
- UInt64 pte = pt[(vaddr >> 12) & kMask9Bits];
+ Detail::PTE* pte = (Detail::PTE*)pt[(vaddr >> 12) & kMask9Bits];
- if (!(pte & 1))
+ if (!pte->Present)
return 0;
- return (pte & ~kPageOffsetMask) | (vaddr & kPageOffsetMask);
- }
+ mmi_page_status((Detail::PTE*)pte);
- /***********************************************************************************/
- /// \brief Retrieve the page status of a PTE.
- /// \param pte Page Table Entry pointer.
- /***********************************************************************************/
- STATIC Void mmi_page_status(PTE* pte)
- {
- kout << (pte->Present ? "Present" : "Not Present") << kendl;
- kout << (pte->Wr ? "W/R" : "Not W/R") << kendl;
- kout << (pte->ExecDisable ? "NX" : "Not NX") << kendl;
- kout << (pte->User ? "User" : "Not User") << kendl;
+ return pte->PhysicalAddress;
}
- STATIC Int32 mmi_map_page_table_entry(UIntPtr virtual_address, UInt32 physical_address, UInt32 flags, NE_PTE* pt_entry, NE_PDE* pd_entry);
-
/***********************************************************************************/
/// @brief Maps or allocates a page from virtual_address.
/// @param virtual_address a valid virtual address.
@@ -95,39 +120,36 @@ namespace Kernel::HAL
UInt64 pml4e = pml4[(vaddr >> 39) & kMask9];
if (!(pml4e & 1))
- return 1;
+ return kErrorInvalidData;
auto pdpt = reinterpret_cast<UInt64*>(pml4e & ~kPageMask);
UInt64 pdpte = pdpt[(vaddr >> 30) & kMask9];
if (!(pdpte & 1))
- return 1;
+ return kErrorInvalidData;
auto pd = reinterpret_cast<UInt64*>(pdpte & ~kPageMask);
UInt64 pde = pd[(vaddr >> 21) & kMask9];
if (!(pde & 1))
- return 1;
-
- auto pt = reinterpret_cast<UInt64*>(pde & ~kPageMask);
- UInt64& pte = pt[(vaddr >> 12) & kMask9];
+ return kErrorInvalidData;
- // Set the new PTE
- pte = (reinterpret_cast<UInt64>(physical_address) & ~0xFFFULL) | 0x01ULL; // Present
+ UInt64* pt = reinterpret_cast<UInt64*>(pde & ~kPageMask);
+ Detail::PTE* pte = (Detail::PTE*)pt[(vaddr >> 12) & kMask9];
- if (flags & ~kMMFlagsPresent)
- pte &= ~(0x01ULL); // Not Present
+ pte->Present = !!(flags & kMMFlagsPresent);
+ pte->Wr = !!(flags & kMMFlagsWr);
+ pte->User = !!(flags & kMMFlagsUser);
+ pte->Nx = !!(flags & kMMFlagsNX);
+ pte->Pcd = !(flags & kMMFlagsUncached);
- if (flags & kMMFlagsWr)
- pte |= 1 << 1; // Writable
+ if (physical_address)
+ pte->PhysicalAddress = (UIntPtr)physical_address;
- if (flags & kMMFlagsUser)
- pte |= 1 << 2; // User
+ hal_invl_tlb(virtual_address);
- if (flags & kMMFlagsNX)
- pte |= 1ULL << 63; // NX
+ mmi_page_status(pte);
- hal_invl_tlb(virtual_address);
- return 0;
+ return kErrorSuccess;
}
} // namespace Kernel::HAL
diff --git a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc
index fafb29e9..dea3b3d4 100644
--- a/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalSchedulerCorePrimitivesAMD64.cc
@@ -37,6 +37,7 @@ namespace Kernel
/// Wakes up thread from the hang state.
Void mp_wakeup_thread(HAL::StackFrame* stack)
{
+ NE_UNUSED(stack);
Kernel::UserProcessHelper::StartScheduling();
}
@@ -44,6 +45,8 @@ namespace Kernel
/// hooks and hangs thread to prevent code from executing.
Void mp_hang_thread(HAL::StackFrame* stack)
{
+ NE_UNUSED(stack);
+
while (Yes)
{
/* Nothing to do, code is spinning */
diff --git a/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc b/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc
index 2cb23716..01be2be5 100644
--- a/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc
+++ b/dev/kernel/HALKit/AMD64/HalTimerAMD64.cc
@@ -53,7 +53,7 @@ HardwareTimer::HardwareTimer(Int64 ms)
auto hpet = (Detail::HPET_BLOCK*)power.Find("HPET").Leak().Leak();
MUST_PASS(hpet);
- fDigitalTimer = (IntPtr*)hpet->address.Address;
+ fDigitalTimer = (UIntPtr*)hpet->address.Address;
}
HardwareTimer::~HardwareTimer()
diff --git a/dev/kernel/HALKit/AMD64/PCI/DMA.cc b/dev/kernel/HALKit/AMD64/PCI/DMA.cc
index 33cff13e..4a63625e 100644
--- a/dev/kernel/HALKit/AMD64/PCI/DMA.cc
+++ b/dev/kernel/HALKit/AMD64/PCI/DMA.cc
@@ -31,14 +31,14 @@ namespace Kernel
return reinterpret_cast<UIntPtr>(this->fAddress) >= offset;
}
- bool DMAWrapper::Write(const UIntPtr& bit, const UInt32& offset)
+ bool DMAWrapper::Write(UIntPtr& bit, const UInt32& offset)
{
kout << "[DMAWrapper::Read] Checking this->fAddress...\r";
if (!this->fAddress)
return false;
- kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl;
+ (void)(kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
ke_dma_write<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset, bit);
@@ -52,12 +52,12 @@ namespace Kernel
if (!this->fAddress)
return ~0;
- kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl;
+ (void)(kout << "[DMAWrapper::Write] Writing at address: " << hex_number(reinterpret_cast<UIntPtr>(this->fAddress) + offset) << kendl);
- return ke_dma_read<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset);
+ return (UIntPtr)ke_dma_read<UInt32>(reinterpret_cast<UIntPtr>(this->fAddress), offset);
}
- UIntPtr DMAWrapper::operator[](const UIntPtr& offset)
+ UIntPtr DMAWrapper::operator[](UIntPtr& offset)
{
return this->Read(offset);
}
diff --git a/dev/kernel/HALKit/AMD64/Paging.h b/dev/kernel/HALKit/AMD64/Paging.h
index 474c74e7..da90a71a 100644
--- a/dev/kernel/HALKit/AMD64/Paging.h
+++ b/dev/kernel/HALKit/AMD64/Paging.h
@@ -41,25 +41,6 @@ EXTERN_C Kernel::VoidPtr hal_read_cr3(); // @brief Page table.
namespace Kernel::HAL
{
- /// @brief Final page entry (Not PML, PDPT)
- struct PACKED NE_PTE final
- {
- UInt64 Present : 1;
- UInt64 Wr : 1;
- UInt64 User : 1;
- UInt64 Wt : 1;
- UInt64 Cache : 1;
- UInt64 Accessed : 1;
- UInt64 Dirty : 1;
- UInt64 MemoryType : 1;
- UInt64 Global : 1;
- UInt64 Resvered1 : 3;
- UInt64 PhysicalAddress : 36;
- UInt64 Reserved2 : 10;
- UInt64 ProtectionKey : 5;
- UInt64 ExecDisable : 1;
- };
-
namespace Detail
{
enum class ControlRegisterBits
@@ -83,17 +64,13 @@ namespace Kernel::HAL
}
} // namespace Detail
- struct NE_PDE final
- {
- NE_PTE* ALIGN(kPageAlign) fEntries[kPageMax];
- };
- auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, const SizeT pad = 0) -> VoidPtr;
+ auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad = 0) -> VoidPtr;
auto mm_free_bitmap(VoidPtr page_ptr) -> Bool;
} // namespace Kernel::HAL
namespace Kernel
{
- typedef HAL::NE_PTE PTE;
- typedef HAL::NE_PDE PDE;
+ typedef VoidPtr PTE;
+ typedef VoidPtr PDE;
} // namespace Kernel
diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h
index eff0292b..ff9d13a5 100644
--- a/dev/kernel/HALKit/AMD64/Processor.h
+++ b/dev/kernel/HALKit/AMD64/Processor.h
@@ -68,11 +68,12 @@ namespace Kernel::HAL
/// @brief Memory Manager mapping flags.
enum
{
- kMMFlagsInvalid = 0 << 0,
- kMMFlagsPresent = 1 << 0,
- kMMFlagsWr = 1 << 1,
- kMMFlagsUser = 1 << 2,
- kMMFlagsNX = 1 << 3,
+ kMMFlagsInvalid = 1 << 0,
+ kMMFlagsPresent = 1 << 1,
+ kMMFlagsWr = 1 << 2,
+ kMMFlagsUser = 1 << 3,
+ kMMFlagsNX = 1 << 4,
+ kMMFlagsUncached = 1 << 5,
kMMFlagsCount = 4,
};
diff --git a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
index 41aabca2..f0893e2d 100644
--- a/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/AHCI+Generic.cc
@@ -76,7 +76,7 @@ namespace AHCI::Detail
UIntPtr addr = (UIntPtr)address;
- UIntPtr aligned_addr = (addr + alignement - 1) & ~alignement - 1;
+ UIntPtr aligned_addr = (addr + alignement - 1) & (~alignement - 1);
return (RetType*)aligned_addr;
}
@@ -87,7 +87,7 @@ STATIC Void drv_compute_disk_ahci() noexcept
kSATASectorCount = 0UL;
/// Normally 512 bytes, but add an additional 512 bytes to make 1 KIB.
- const UInt16 kSzIdent = 256;
+ const UInt16 kSzIdent = 512;
/// Push it to the stack
UInt16* identify_data = AHCI::Detail::ahci_align_address<UInt16>(new UInt16[kSzIdent], kib_cast(1));
@@ -107,6 +107,8 @@ STATIC Void drv_compute_disk_ahci() noexcept
else
kSATASectorCount = lba48_sectors;
+ (Void)(kout << "Device: " << kCurrentDiskModel << kendl);
+
delete[] identify_data;
identify_data = nullptr;
}
@@ -141,7 +143,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
slot = drv_find_cmd_slot_ahci(&kSATAHba->Ports[kSATAIndex]);
- if (slot == ~0)
+ if (slot == ~0UL)
{
err_global_get() = kErrorDisk;
return;
@@ -166,11 +168,8 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
/// check for command header.
MUST_PASS(command_header);
- /// 4kb per PRD.
- constexpr const UInt32 kMaxPRDSize = kib_cast(4);
-
- command_header->Cfl = sizeof(FisRegH2D) / sizeof(UInt32);
- command_header->Write = Write;
+ command_header->Struc.Cfl = sizeof(FisRegH2D) / sizeof(UInt32);
+ command_header->Struc.Write = Write;
command_header->Prdtl = 1;
auto ctba_phys = ((UInt64)command_header->Ctbau << 32) | command_header->Ctba;
@@ -186,7 +185,7 @@ STATIC Void drv_std_input_output_ahci(UInt64 lba, UInt8* buffer, SizeT sector_sz
command_table->Prdt[0].Dba = (UInt32)(buffer_phys & 0xFFFFFFFF);
command_table->Prdt[0].Dbau = (UInt32)(buffer_phys >> 32);
command_table->Prdt[0].Dbc = bytes_remaining - 1;
- command_table->Prdt[0].Ie = 1;
+ command_table->Prdt[0].Ie = NO;
volatile FisRegH2D* h2d_fis = (volatile FisRegH2D*)(&command_table->Cfis[0]);
@@ -300,6 +299,8 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL& atapi)
kSATADev.EnableMmio();
kSATADev.BecomeBusMaster();
+ HAL::mm_map_page((VoidPtr)mem_ahci, (VoidPtr)mem_ahci, HAL::kMMFlagsPresent | HAL::kMMFlagsWr | HAL::kMMFlagsUncached);
+
UInt32 ports_implemented = mem_ahci->Pi;
UInt16 ahci_index = 0;
diff --git a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
index fc608e94..cc8c92d8 100644
--- a/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
+++ b/dev/kernel/HALKit/AMD64/Storage/PIO+Generic.cc
@@ -28,7 +28,6 @@ using namespace Kernel::HAL;
#define kATADataLen 256
STATIC Boolean kATADetected = false;
-STATIC Int32 kATADeviceType = kATADeviceCount;
STATIC UInt16 kATAIdentifyData[kATADataLen] = {0};
STATIC Char kATADiskModel[50] = {"GENERIC PIO"};
@@ -67,6 +66,8 @@ Boolean drv_pio_std_init(UInt16 Bus, UInt8 Drive, UInt16& OutBus, UInt8& OutMast
{
UInt16 IO = Bus;
+ NE_UNUSED(Drive);
+
drv_pio_std_select(IO);
// Bus init, NEIN bit.
@@ -107,7 +108,7 @@ ATAInit_Retry:
kATADiskModel[40] = '\0';
- kout << "Drive Model: " << kATADiskModel << kendl;
+ (void)(kout << "Drive Model: " << kATADiskModel << kendl);
return true;
}
diff --git a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
index 8ad16c57..1553b2ed 100644
--- a/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/ARM64/HalApplicationProcessor.cc
@@ -93,7 +93,7 @@ namespace Kernel
const UInt16 kInterruptScheduler = 0x20;
- kout << "Handling interrupt for AP: " << interrupt << kendl;
+ (void)(kout << "Handling interrupt for AP: " << interrupt << kendl);
switch (interrupt)
{
diff --git a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
index 1e008c0f..1c88ccc6 100644
--- a/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
+++ b/dev/kernel/HALKit/ARM64/HalKernelPanic.cc
@@ -71,8 +71,8 @@ namespace Kernel
{
if (!expr)
{
- kout << "FAILED: FILE: " << file << kendl;
- kout << "FAILED: LINE: " << line << kendl;
+ (void)(kout << "FAILED: FILE: " << file << kendl);
+ (void)(kout << "FAILED: LINE: " << line << kendl);
ke_panic(RUNTIME_CHECK_FAILED, file); // Runtime Check failed
}