summaryrefslogtreecommitdiffhomepage
path: root/src/kernel/HALKit/AMD64
diff options
context:
space:
mode:
Diffstat (limited to 'src/kernel/HALKit/AMD64')
-rw-r--r--src/kernel/HALKit/AMD64/CxxAbi.cpp2
-rw-r--r--src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp2
-rw-r--r--src/kernel/HALKit/AMD64/HalCoreSystemCalls+DDK.cpp8
-rw-r--r--src/kernel/HALKit/AMD64/HalCoreSystemCalls+NeLaunch.cpp8
-rw-r--r--src/kernel/HALKit/AMD64/HalDebugOutput.cpp8
-rw-r--r--src/kernel/HALKit/AMD64/HalKernelMain.cpp14
-rw-r--r--src/kernel/HALKit/AMD64/HalKernelPanic.cpp11
-rw-r--r--src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp (renamed from src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp)58
-rw-r--r--src/kernel/HALKit/AMD64/Paging.h4
9 files changed, 62 insertions, 53 deletions
diff --git a/src/kernel/HALKit/AMD64/CxxAbi.cpp b/src/kernel/HALKit/AMD64/CxxAbi.cpp
index 50b6ccf2..c2487f85 100644
--- a/src/kernel/HALKit/AMD64/CxxAbi.cpp
+++ b/src/kernel/HALKit/AMD64/CxxAbi.cpp
@@ -11,7 +11,7 @@
#define kAtExitMaxDestructors (128U)
atexit_func_entry_t __atexit_funcs[kAtExitMaxDestructors];
-uarch_t __atexit_func_count;
+uarch_t __atexit_func_count;
/// @brief dynamic shared object Handle.
Kernel::UIntPtr __dso_handle;
diff --git a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp
index 92fb064c..118dd98c 100644
--- a/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp
+++ b/src/kernel/HALKit/AMD64/HalCoreInterruptHandler.cpp
@@ -5,7 +5,7 @@
#include <ArchKit/ArchKit.h>
#include <KernelKit/ProcessScheduler.h>
-#include <KernelKit/UserMgr+User.h>
+#include <KernelKit/User.h>
#include <NeKit/Atom.h>
#include <NeKit/KString.h>
#include <SignalKit/Signals.h>
diff --git a/src/kernel/HALKit/AMD64/HalCoreSystemCalls+DDK.cpp b/src/kernel/HALKit/AMD64/HalCoreSystemCalls+DDK.cpp
deleted file mode 100644
index a0632ff0..00000000
--- a/src/kernel/HALKit/AMD64/HalCoreSystemCalls+DDK.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// Copyright 2026, Amlal El Mahrouss (amlal@nekernel.org)
-// Licensed under the Apache License, Version 2.0 (see LICENSE file)
-// Official repository: https://github.com/ne-foss-org/nekernel
-
-#include <ArchKit/ArchKit.h>
-
-namespace Kernel {} \ No newline at end of file
diff --git a/src/kernel/HALKit/AMD64/HalCoreSystemCalls+NeLaunch.cpp b/src/kernel/HALKit/AMD64/HalCoreSystemCalls+NeLaunch.cpp
deleted file mode 100644
index 2a770052..00000000
--- a/src/kernel/HALKit/AMD64/HalCoreSystemCalls+NeLaunch.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-// Copyright 2026, Amlal El Mahrouss (amlal@nekernel.org)
-// Licensed under the Apache License, Version 2.0 (see LICENSE file)
-// Official repository: https://github.com/ne-foss-org/nekernel
-
-#include <ArchKit/ArchKit.h>
-
-namespace Kernel {}
diff --git a/src/kernel/HALKit/AMD64/HalDebugOutput.cpp b/src/kernel/HALKit/AMD64/HalDebugOutput.cpp
index a63b3657..dc4b78e7 100644
--- a/src/kernel/HALKit/AMD64/HalDebugOutput.cpp
+++ b/src/kernel/HALKit/AMD64/HalDebugOutput.cpp
@@ -59,7 +59,7 @@ namespace Detail {
TerminalDevice::~TerminalDevice() = default;
#ifdef __DEBUG__
-STATIC SizeT kX = kFontSizeX, kY = kFontSizeY;
+STATIC SizeT kX = kFontSizeX, kY = kFontSizeY + 70;
#endif // __DEBUG__
EXTERN_C void ke_utf_io_write(IDevice<const Utf8Char*>* obj, const Utf8Char* bytes) {
@@ -91,7 +91,7 @@ EXTERN_C void ke_utf_io_write(IDevice<const Utf8Char*>* obj, const Utf8Char* byt
tmp_str[0] = (bytes[index] > 127) ? '?' : bytes[index];
tmp_str[1] = 0;
- cg_render_string(tmp_str, kY, kX, RGB(0x00, 0x00, 0x00));
+ cg_render_string(tmp_str, kY, kX, RGB(0xFF, 0xFF, 0xFF));
if (bytes[index] == '\r') {
kY += kFontSizeY;
@@ -147,7 +147,7 @@ EXTERN_C void ke_io_write(IDevice<const Char*>* obj, const Char* bytes) {
tmp_str[0] = bytes[index];
tmp_str[1] = 0;
- cg_render_string(tmp_str, kY, kX, RGB(0x00, 0x00, 0x00));
+ cg_render_string(tmp_str, kY, kX, RGB(0xFF, 0xFF, 0xFF));
if (bytes[index] == '\r') {
kY += kFontSizeY;
@@ -161,7 +161,7 @@ EXTERN_C void ke_io_write(IDevice<const Char*>* obj, const Char* bytes) {
}
if (kY > kHandoverHeader->f_GOP.f_Height) {
- kY = kFontSizeY;
+ kY = kFontSizeY + 70;
FBDrawInRegion(cg_get_clear_clr(), FB::CGAccessibilty::Height(), FB::CGAccessibilty::Width(),
0, 0);
diff --git a/src/kernel/HALKit/AMD64/HalKernelMain.cpp b/src/kernel/HALKit/AMD64/HalKernelMain.cpp
index 7468b76d..2c454e20 100644
--- a/src/kernel/HALKit/AMD64/HalKernelMain.cpp
+++ b/src/kernel/HALKit/AMD64/HalKernelMain.cpp
@@ -133,6 +133,8 @@ EXTERN_C Kernel::Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_h
return kEfiFail;
}
+EXTERN_C BOOL rtl_init_nic_rtl8139();
+
EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
@@ -156,11 +158,17 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
PEFLoader ldr("/system/init.out");
- if (ldr.IsLoaded()) rtl_create_user_process(ldr, UserProcess::ExecutableKind::kExecutableKind);
- else ke_panic(RUNTIME_CHECK_PROCESS, "RuntimeCheck: Invalid Process Data!");
-
+ if (ldr.IsLoaded())
+ rtl_create_user_process(ldr, UserProcess::ExecutableKind::kExecutableKind);
+ else
+ ke_panic(RUNTIME_CHECK_BAD_BEHAVIOR, "Invalid Init Process.");
+
UserProcessScheduler::The().SwitchTeam(kMidUserTeam);
+#ifdef __HALKIT_INCLUDES_BNID__
+ rtl_init_nic_rtl8139();
+#endif
+
while (YES);
}
#endif // ifndef __NE_MODULAR_KERNEL_COMPONENTS__
diff --git a/src/kernel/HALKit/AMD64/HalKernelPanic.cpp b/src/kernel/HALKit/AMD64/HalKernelPanic.cpp
index d9afa204..a5f0b8bc 100644
--- a/src/kernel/HALKit/AMD64/HalKernelPanic.cpp
+++ b/src/kernel/HALKit/AMD64/HalKernelPanic.cpp
@@ -45,19 +45,18 @@ Void RecoveryFactory::Recover() {
HAL::rt_cli();
HAL::rt_halt();
}
-
+
alreadyDumped = YES;
-
- HeFileSystemMgr mgr;
- auto node = mgr.Open("/system/dump.dmp", "wb");
+ HeFileSystemMgr mgr;
+ auto node = mgr.Open("/system/dump.dmp", "wb");
if (node && hal_read_cr2()) mgr.Write(node, hal_read_cr2(), 0, 0x100);
if (node) mm_free_ptr(node);
-
+
node = nullptr;
#endif
-
+
while (YES) {
HAL::rt_cli();
HAL::rt_halt();
diff --git a/src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp b/src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp
index aacda36c..4c1d0f1f 100644
--- a/src/kernel/HALKit/AMD64/Network/Generic+Basic+RTL8139.cpp
+++ b/src/kernel/HALKit/AMD64/Network/Generic+Basic+BNID.cpp
@@ -5,66 +5,82 @@
#include <DmaKit/DmaPool.h>
#include <HALKit/AMD64/Processor.h>
+#include <KernelKit/PCI/Iterator.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
+/// @note BNID (RTL8139' Basic Network Interface) driver
+
+#define kNetDevID (0x8139)
+#define kNetSubClass (0x10EC)
+
using namespace Kernel;
using namespace Kernel::HAL;
STATIC UInt16 kRTLIOBase = 0xFFFF;
-STATIC BOOL kTXRXEnabled = NO;
-
STATIC UInt32 kRXOffset = 0UL;
STATIC constexpr CONST UInt32 kRXBufferSize = 8192 + 16 + 1500;
STATIC UInt8* kRXUpperLayer = nullptr;
STATIC UInt8* kRXBuffer = nullptr;
+STATIC PCI::Device kNetDev;
+
/***********************************************************************************/
-///@brief RTL8139 Init routine.
+///@brief BNID Init routine.
/***********************************************************************************/
-EXTERN_C BOOL rtl_init_nic_rtl8139(UInt16 io_base) {
+EXTERN_C BOOL rtl_init_nic_rtl8139() {
+ STATIC BOOL kTXRXEnabled = NO;
if (kTXRXEnabled) return NO;
- kRTLIOBase = io_base;
+ PCI::Iterator iterator(Types::PciDeviceKind::NetworkController, 0x00);
- MUST_PASS(io_base != 0xFFFF);
+ for (SizeT device_index = 0; device_index < NE_BUS_COUNT; ++device_index) {
+ kNetDev = iterator[device_index].Leak(); // Leak device.
- kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
+ if (kNetDev.VendorId() == kNetSubClass && kNetDev.DeviceId() == kNetDevID) {
+ kNetDev.EnableMmio();
+ kNetDev.BecomeBusMaster();
+
+ break;
+ }
+ }
+
+ kRTLIOBase = kNetDev.Bar(0);
- MUST_PASS(kRXBuffer);
+ MUST_PASS(kRTLIOBase != 0xFFFF);
+
+ kRXBuffer = reinterpret_cast<UInt8*>(rtl_dma_alloc(sizeof(UInt8) * kRXBufferSize, 0));
/// Reset first.
- rt_out8(io_base + 0x37, 0x10);
+ rt_out8(kRTLIOBase + 0x37, 0x10);
UInt16 timeout = 0U;
- while (rt_in8(io_base + 0x37) & 0x10) {
+ while (rt_in8(kRTLIOBase + 0x37) & 0x10) {
++timeout;
if (timeout > 0x1000) break;
}
- if (timeout <= 0x1000) {
- return NO;
- }
-
- rt_out32(io_base + 0x30, (UInt32) (UIntPtr) kRXBuffer);
+ rt_out32(kRTLIOBase + 0x30, (UInt32) (UIntPtr) kRXBuffer);
- rt_out8(io_base + 0x37, 0x0C);
+ rt_out8(kRTLIOBase + 0x37, 0x0C);
- rt_out32(io_base + 0x44, 0xF | (1 << 7));
+ rt_out32(kRTLIOBase + 0x44, 0xF | (1 << 7));
- rt_out16(io_base + 0x3C, 0x0005);
+ rt_out16(kRTLIOBase + 0x3C, 0x0005);
kTXRXEnabled = YES;
+ kout << "The Basic Network Interface Driver (BNID) has been initialized.\r";
+
return YES;
}
/***********************************************************************************/
-/// @brief RTL8139 I/O interrupt handler.
+/// @brief BNID I/O interrupt handler.
/// @param rsp stack pointer.
/// @note This function is called when the device interrupts to retrieve network data.
/***********************************************************************************/
@@ -105,7 +121,7 @@ EXTERN_C Void rtl_rtl8139_interrupt_handler(UIntPtr rsp) {
}
/***********************************************************************************/
-/// @brief RTL8139 get upper layer function
+/// @brief BNID get upper layer function
/// @return the upper layer.
/// @retval nullptr if no upper layer is set.
/// @retval pointer to the upper layer if set.
@@ -116,7 +132,7 @@ EXTERN_C UInt8* rtl_rtl8139_get_upper_layer() {
}
/***********************************************************************************/
-/// @brief RTL8139 set upper layer function
+/// @brief BNID set upper layer function
/// @param layer the upper layer.
/***********************************************************************************/
diff --git a/src/kernel/HALKit/AMD64/Paging.h b/src/kernel/HALKit/AMD64/Paging.h
index f6ec0bf4..7b64835a 100644
--- a/src/kernel/HALKit/AMD64/Paging.h
+++ b/src/kernel/HALKit/AMD64/Paging.h
@@ -57,7 +57,9 @@ namespace Detail {
kPageEnable = 31,
};
- inline UInt8 control_register_cast(ControlRegisterBits reg) { return static_cast<UInt8>(reg); }
+ inline UInt8 control_register_cast(ControlRegisterBits reg) {
+ return static_cast<UInt8>(reg);
+ }
} // namespace Detail
auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad = 0) -> VoidPtr;