diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-16 09:51:24 +0200 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-05-16 10:08:17 +0200 |
| commit | 5b2ec031ab578caec8fbbdbe5350b9c0df493fd3 (patch) | |
| tree | a0aab7bea6ef32aaa48ece6bdf287974dd67c8eb | |
| parent | b7c6e7aef4c2c647623520f65d78921841bdffaa (diff) | |
feat(kernel/ap): Improved and fixed the AP boot flow, also made sure that the segment
loading for the long mode stub works.
TODO:
- Stack pointer shall be set when jumping to AP routine.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalAPICController.cc | 38 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc | 39 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc | 138 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm | 14 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc | 20 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalHandoverStub.asm (renamed from dev/kernel/HALKit/AMD64/HalBootHeader.asm) | 2 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalInterruptAPI.asm | 8 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/HalKernelMain.cc | 10 | ||||
| -rw-r--r-- | dev/kernel/HALKit/AMD64/Processor.h | 17 | ||||
| -rw-r--r-- | dev/kernel/amd64-ci.make | 2 | ||||
| -rw-r--r-- | dev/kernel/amd64-desktop.make | 2 | ||||
| -rw-r--r-- | dev/kernel/src/UserProcessTeam.cc | 1 |
12 files changed, 146 insertions, 145 deletions
diff --git a/dev/kernel/HALKit/AMD64/HalAPICController.cc b/dev/kernel/HALKit/AMD64/HalAPICController.cc deleted file mode 100644 index e547d982..00000000 --- a/dev/kernel/HALKit/AMD64/HalAPICController.cc +++ /dev/null @@ -1,38 +0,0 @@ -/* ------------------------------------------- - - Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. - -------------------------------------------- */ - -#include <HALKit/AMD64/Processor.h> -#include <modules/ACPI/ACPIFactoryInterface.h> - -#define kIOAPICRegVal (4) -#define kIOAPICRegReg (0) - -namespace Kernel::HAL { -APICController::APICController(VoidPtr base) : fApic(base) {} - -/// @brief Read from APIC controller. -/// @param reg register. -UInt32 APICController::Read(UInt32 reg) noexcept { - MUST_PASS(this->fApic); - - UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic; - io_apic[kIOAPICRegReg] = (reg & 0xFF); - - return io_apic[kIOAPICRegVal]; -} - -/// @brief Write to APIC controller. -/// @param reg register. -/// @param value value. -Void APICController::Write(UInt32 reg, UInt32 value) noexcept { - MUST_PASS(this->fApic); - - UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic; - - io_apic[kIOAPICRegReg] = (reg & 0xFF); - io_apic[kIOAPICRegVal] = value; -} -} // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc b/dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc new file mode 100644 index 00000000..6aba5b0e --- /dev/null +++ b/dev/kernel/HALKit/AMD64/HalAPICDmaWrapper.cc @@ -0,0 +1,39 @@ +/* ------------------------------------------- + + Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. + +------------------------------------------- */ + +#include <HALKit/AMD64/Processor.h> +#include <modules/ACPI/ACPIFactoryInterface.h> + +namespace Kernel::HAL { +/***********************************************************************************/ +/// Constructors. +/***********************************************************************************/ +LAPICDmaWrapper::LAPICDmaWrapper(VoidPtr base) : fApic(base) {} +LAPICDmaWrapper::~LAPICDmaWrapper() = default; + +/***********************************************************************************/ +/// @brief Read from APIC controller. +/// @param reg register. +/***********************************************************************************/ +UInt32 LAPICDmaWrapper::Read(UInt16 reg) noexcept { + MUST_PASS(this->fApic); + + UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic; + return io_apic[reg]; +} + +/***********************************************************************************/ +/// @brief Write to APIC controller. +/// @param reg register. +/// @param value value. +/***********************************************************************************/ +Void LAPICDmaWrapper::Write(UInt16 reg, UInt32 value) noexcept { + MUST_PASS(this->fApic); + + UInt32 volatile* io_apic = (UInt32 volatile*) this->fApic; + io_apic[reg] = value; +} +} // namespace Kernel::HAL diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc index 46b376c0..98e96687 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc @@ -13,18 +13,23 @@ #include <NewKit/KernelPanic.h> #include <modules/ACPI/ACPIFactoryInterface.h> #include <modules/CoreGfx/TextGfx.h> +#include "NewKit/Defines.h" #define APIC_Signature "APIC" -#define APIC_ICR_Low 0x300 -#define APIC_ICR_High 0x310 -#define APIC_SIPI_Vector 0x00500 -#define APIC_EIPI_Vector 0x00400 +#define AP_BLOB_SIZE 126 + +#define APIC_ICR_LOW 0x300 +#define APIC_ICR_HIGH 0x310 +#define APIC_SIPI_VEC 0x00500 +#define APIC_EIPI_VEC 0x00400 #define LAPIC_REG_TIMER_LVT 0x320 #define LAPIC_REG_TIMER_INITCNT 0x380 #define LAPIC_REG_TIMER_CURRCNT 0x390 #define LAPIC_REG_TIMER_DIV 0x3E0 +#define LAPIC_REG_ENABLE 0x80 +#define LAPIC_REG_SPURIOUS 0xF0 #define APIC_BASE_MSR 0x1B #define APIC_BASE_MSR_BSP 0x100 @@ -52,7 +57,7 @@ STATIC HAL_APIC_MADT* kMADTBlock = nullptr; STATIC Bool kSMPAware = false; STATIC Int64 kSMPCount = 0; -EXTERN_C UIntPtr kApicBaseAddress = 0UL; +EXTERN_C UIntPtr kApicBaseAddress; STATIC Int32 kSMPInterrupt = 0; STATIC UInt64 kAPICLocales[kSchedProcessLimitPerTeam] = {0}; @@ -61,46 +66,16 @@ STATIC VoidPtr kRawMADT = nullptr; /// @brief Multiple APIC Descriptor Table. struct HAL_APIC_MADT final SDT_OBJECT { UInt32 Address; // Madt address - UInt8 Flags; // Madt flags - - struct { - UInt8 Type; - UInt8 Len; - - union APIC { - struct IOAPIC { - UInt8 IoID; - UInt8 Zero; - UInt32 IoAddress; - UInt32 GISBase; - } IOAPIC; - - struct LAPIC_NMI { - UInt8 Source; - UInt8 IRQSource; - UInt32 GSI; - UInt16 Flags; - } LApicNMI; - - struct LAPIC { - UInt8 ProcessorID; - UInt16 Flags; - UInt8 LINT; - } LAPIC; - - struct LAPIC_OVERRIDE { - UInt16 Reserved; - UInt64 Address; - } LApicOverride; - - struct LAPIC_X2 { - UInt16 Reserved; - UInt32 x2APICID; - UInt32 Flags; - UInt32 AcpiID; - } LocalApicX2; - } Apic; - } List[1]; // Records List + UInt32 Flags; // Madt flags + UInt8 List[1]; // Records List +}; + +struct LAPIC final { + UInt8 Type; + UInt8 Length; + UInt8 ProcessorID; + UInt8 APICID; + UInt32 Flags; }; /////////////////////////////////////////////////////////////////////////////////////// @@ -114,10 +89,10 @@ struct HAL_APIC_MADT final SDT_OBJECT { /***********************************************************************************/ Void hal_send_start_ipi(UInt32 target, UInt32 apic_id) { - Kernel::ke_dma_write<UInt32>(target, APIC_ICR_High, apic_id << 24); - Kernel::ke_dma_write<UInt32>(target, APIC_ICR_Low, 0x00000500 | 0x00004000 | 0x00000000); + Kernel::ke_dma_write<UInt32>(target, APIC_ICR_HIGH, apic_id << 24); + Kernel::ke_dma_write<UInt32>(target, APIC_ICR_LOW, 0x00000500 | 0x00004000 | 0x00000000); - while (Kernel::ke_dma_read<UInt32>(target, APIC_ICR_Low) & 0x1000) { + while (Kernel::ke_dma_read<UInt32>(target, APIC_ICR_LOW) & 0x1000) { ; } } @@ -130,10 +105,10 @@ Void hal_send_start_ipi(UInt32 target, UInt32 apic_id) { /// @return /***********************************************************************************/ Void hal_send_sipi(UInt32 target, UInt32 apic_id, UInt8 vector) { - Kernel::ke_dma_write<UInt32>(target, APIC_ICR_High, apic_id << 24); - Kernel::ke_dma_write<UInt32>(target, APIC_ICR_Low, 0x00000600 | 0x00004000 | 0x00000000 | vector); + Kernel::ke_dma_write<UInt32>(target, APIC_ICR_HIGH, apic_id << 24); + Kernel::ke_dma_write<UInt32>(target, APIC_ICR_LOW, 0x00000600 | 0x00004000 | 0x00000000 | vector); - while (Kernel::ke_dma_read<UInt32>(target, APIC_ICR_Low) & 0x1000) { + while (Kernel::ke_dma_read<UInt32>(target, APIC_ICR_LOW) & 0x1000) { NE_UNUSED(0); } } @@ -202,8 +177,6 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kSMPAware = NO; if (kMADTBlock) { - SizeT index = 0; - kSMPInterrupt = 0; kSMPCount = 0; @@ -221,39 +194,52 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept { kApicBaseAddress = apic_base & 0xFFFFF000; - // Allow LAPIC to forward interrupts (TPR = 0) - *(volatile UInt32*) (kApicBaseAddress + 0x80) = 0; + LAPICDmaWrapper controller{(VoidPtr) kApicBaseAddress}; - // Set Spurious Interrupt Vector and enable LAPIC (bit 8) - *(volatile UInt32*) (kApicBaseAddress + 0xF0) = 0x1FF; // vector = 0xFF, enable bit = 1 << 8 + controller.Write(LAPIC_REG_ENABLE, 0); + controller.Write(LAPIC_REG_SPURIOUS, 0x1FF); // Enable bit, spurious interrupt vector register. + controller.Write(LAPIC_REG_TIMER_DIV, 0b0011); + controller.Write(LAPIC_REG_TIMER_LVT, 32 | (1 << 17)); + controller.Write(LAPIC_REG_TIMER_INITCNT, 1000000); - // LAPIC timer setup - *(volatile UInt32*) (kApicBaseAddress + LAPIC_REG_TIMER_DIV) = 0b0011; // Divide by 16 + const UIntPtr trampoline_phys = 0x8000; - *(volatile UInt32*) (kApicBaseAddress + LAPIC_REG_TIMER_LVT) = - 32 | (1 << 17); // Vector 32, periodic + HAL::mm_map_page((VoidPtr)trampoline_phys, (VoidPtr)trampoline_phys, HAL::kMMFlagsWr | HAL::kMMFlagsPresent); - *(volatile UInt32*) (kApicBaseAddress + LAPIC_REG_TIMER_INITCNT) = - 1000000; // Init count (e.g., ~100Hz) + const SizeT len = AP_BLOB_SIZE; /// AP blob size. - constexpr const auto kSMPCountMax = kMaxAPInsideSched; + rt_copy_memory(hal_ap_blob_start, reinterpret_cast<VoidPtr>(trampoline_phys), len); - while (Yes) { - // @note Don't probe greater than what the APMgr expects. - if (kSMPCount > kSMPCountMax) break; + volatile UInt8* entry_ptr = reinterpret_cast<volatile UInt8*>(kMADTBlock->List); + volatile UInt8* end_ptr = ((UInt8*) kMADTBlock) + kMADTBlock->Length; - /// @note Anything bigger than x2APIC type doesn't exist. - if (kMADTBlock->List[index].Type > 9) { - ++index; - continue; - } + while (entry_ptr < end_ptr) { + UInt8 type = *entry_ptr; + UInt8 length = *(entry_ptr + 1); - kAPICLocales[kSMPCount] = kMADTBlock->List[kSMPCount].Apic.LAPIC.ProcessorID; - (Void)(kout << "SMP: APIC ID: " << number(kAPICLocales[kSMPCount]) << kendl); + // Avoid infinite loop on bad APIC tables. + if (length < 2) break; - ++kSMPCount; + if (type == 0) { + volatile LAPIC* entry_struct = (volatile LAPIC*) entry_ptr; + + if (entry_struct->Flags & 0x1) { + kAPICLocales[kSMPCount] = entry_struct->ProcessorID; + ++kSMPCount; + + kout << "LAPIC type, also is on...\r"; + + hal_send_start_ipi(kApicBaseAddress, entry_struct->ProcessorID); + hal_send_sipi(kApicBaseAddress, entry_struct->ProcessorID, trampoline_phys >> 12); + + } else { + kout << "LAPIC type, also is not on...\r"; + } + } else { + kout << "Unknown APIC type...\r"; + } - ++index; + entry_ptr += length; } kSMPAware = kSMPCount > 1; diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm index 09a59e4f..181937ab 100644 --- a/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm +++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessorStartup.asm @@ -10,7 +10,7 @@ ;; */ [bits 16] -[org 0x7c000] +[org 0x8000] hal_ap_start: mov ax, 0x0 @@ -61,19 +61,15 @@ hal_ap_64bit_entry: mov fs, ax mov gs, ax mov ss, ax - mov rsp, [hal_ap_64bit_entry_stack_end] + + mov rsp, rbx push 0x33 - push qword [hal_ap_64bit_entry_loop] + lea rax, [hal_ap_64bit_entry_loop] + push rax o64 pushf - push rsp - push 0x33 o64 iret hal_ap_64bit_entry_loop: jmp $ - -hal_ap_64bit_entry_stack: - times 8196*2 nop -hal_ap_64bit_entry_stack_end:
\ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc index ff283141..d5a40390 100644 --- a/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc +++ b/dev/kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cc @@ -11,9 +11,11 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip); +EXTERN_C Kernel::UIntPtr kApicBaseAddress; + /// @brief Handle GPF fault. /// @param rsp -EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { +EXTERN_C Kernel::Void idt_handle_gpf(Kernel::UIntPtr rsp) { auto& process = Kernel::UserProcessScheduler::The().CurrentProcess(); Kernel::kout << "Kernel: General Protection Fault.\r"; @@ -27,6 +29,8 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Handle page fault. @@ -44,10 +48,16 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Handle scheduler interrupt. EXTERN_C void idt_handle_scheduler(Kernel::UIntPtr rsp) { + ((volatile UInt32*) kApicBaseAddress)[0xB0] = 0; + + Kernel::HAL::rt_out8(0x20, 0x20); + NE_UNUSED(rsp); Kernel::UserProcessHelper::StartScheduling(); } @@ -68,6 +78,8 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Handle any generic fault. @@ -87,6 +99,8 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { @@ -104,6 +118,8 @@ EXTERN_C Kernel::Void idt_handle_breakpoint(Kernel::UIntPtr rip) { Kernel::kout << "Kernel: SIGTRAP status.\r"; process.Leak().Status = Kernel::ProcessStatusKind::kFrozen; + + idt_handle_scheduler(rip); } /// @brief Handle #UD fault. @@ -124,6 +140,8 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { process.Leak().Status = Kernel::ProcessStatusKind::kKilled; process.Leak().Crash(); + + dbg_break_point(); } /// @brief Enter syscall from assembly. diff --git a/dev/kernel/HALKit/AMD64/HalBootHeader.asm b/dev/kernel/HALKit/AMD64/HalHandoverStub.asm index 21f8621b..a337a223 100644 --- a/dev/kernel/HALKit/AMD64/HalBootHeader.asm +++ b/dev/kernel/HALKit/AMD64/HalHandoverStub.asm @@ -4,8 +4,6 @@ ;; * NeKernel ;; * Copyright (C) 2024-2025, Amlal El Mahrouss, all rights reserved. ;; * -;; * 25/03/25: Rename HalBootHeader.asm to HalBootHeader.asm, expose struct symbols; remove unused external symbol. -;; * ;; * ======================================================== ;; */ diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm index 189b2976..fdd62e57 100644 --- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm +++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm @@ -232,11 +232,6 @@ IntNormal 31 [extern kApicBaseAddress] __NE_INT_32: - mov al, 0x20 - out 0x20, al - - mov dword [kApicBaseAddress+0xB0], 0 - push rax mov rcx, rsp call idt_handle_scheduler @@ -411,3 +406,6 @@ kInterruptVectorTable: dq __NE_INT_%+i %assign i i+1 %endrep + +kApicBaseAddress: + dq 0
\ No newline at end of file diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc index b7ff3038..158eaa85 100644 --- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc @@ -106,10 +106,12 @@ EXTERN_C Int32 hal_init_platform(Kernel::HEL::BootInfoHeader* handover_hdr) { EXTERN_C void rtl_ne_task(void); EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { - Kernel::rtl_create_user_process(rtl_ne_task, "MGMTCTL"); - Kernel::rtl_create_user_process(rtl_ne_task, "LAUNCHCTL"); - Kernel::rtl_create_user_process(rtl_ne_task, "SECURITYCTL"); + Kernel::rtl_create_user_process(rtl_ne_task, "MgmtSrv"); + Kernel::rtl_create_user_process(rtl_ne_task, "LaunchSrv"); + Kernel::rtl_create_user_process(rtl_ne_task, "SecSrv"); + Kernel::HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); + Kernel::HAL::Register64 idt_reg; idt_reg.Base = reinterpret_cast<Kernel::UIntPtr>(kInterruptVectorTable); @@ -117,8 +119,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { idt_loader.Load(idt_reg); - Kernel::HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); - #ifdef __FSKIT_INCLUDES_HEFS__ if (Kernel::HeFS::fs_init_hefs()) { goto hal_spin_kernel; diff --git a/dev/kernel/HALKit/AMD64/Processor.h b/dev/kernel/HALKit/AMD64/Processor.h index 1b2e35f7..8fb69c0c 100644 --- a/dev/kernel/HALKit/AMD64/Processor.h +++ b/dev/kernel/HALKit/AMD64/Processor.h @@ -19,6 +19,8 @@ #include <NewKit/Defines.h> #include <NewKit/Utils.h> +#include <HALKit/AMD64/CPUID.h> + #define kPITControlPort (0x43) #define kPITChannel0Port (0x40) #define kPITFrequency (1193180) @@ -28,7 +30,8 @@ #define kPIC2Command (0xA0) #define kPIC2Data (0xA1) -#include <HALKit/AMD64/CPUID.h> +#define kIOAPICRegVal (4) +#define kIOAPICRegReg (0) #define rtl_nop_op() asm volatile("nop") @@ -229,16 +232,16 @@ namespace Detail { }; } // namespace Detail -class APICController final { +class LAPICDmaWrapper final { public: - explicit APICController(VoidPtr base); - ~APICController() = default; + explicit LAPICDmaWrapper(VoidPtr base); + ~LAPICDmaWrapper(); - NE_COPY_DEFAULT(APICController) + NE_COPY_DEFAULT(LAPICDmaWrapper) public: - UInt32 Read(UInt32 reg) noexcept; - Void Write(UInt32 reg, UInt32 value) noexcept; + UInt32 Read(UInt16 reg) noexcept; + Void Write(UInt16 reg, UInt32 value) noexcept; private: VoidPtr fApic{nullptr}; diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make index d431342a..38021901 100644 --- a/dev/kernel/amd64-ci.make +++ b/dev/kernel/amd64-ci.make @@ -51,7 +51,7 @@ nekernel-amd64-epm: clean $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s) $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm - $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBootHeader.asm + $(ASM) $(ASMFLAGS) HALKit/AMD64/HalHandoverStub.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalUtilsAPI.asm $(MOVEALL) diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make index 0358bd0a..ae2307fd 100644 --- a/dev/kernel/amd64-desktop.make +++ b/dev/kernel/amd64-desktop.make @@ -53,7 +53,7 @@ nekernel-amd64-epm: clean $(CXX) $(CCFLAGS) $(DISK_DRV) $(DEBUG_MACRO) $(wildcard src/*.cc) $(wildcard src/Gfx/*.cc) $(wildcard HALKit/AMD64/Network/*.cc) $(wildcard HALKit/AMD64/PCI/*.cc) $(wildcard src/Network/*.cc) $(wildcard src/Storage/*.cc) $(wildcard src/FS/*.cc) $(wildcard HALKit/AMD64/Storage/*.cc) $(wildcard HALKit/AMD64/*.cc) $(wildcard src/Swap/*.cc) $(wildcard HALKit/AMD64/*.s) $(ASM) $(ASMFLAGS) HALKit/AMD64/HalInterruptAPI.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalCommonAPI.asm - $(ASM) $(ASMFLAGS) HALKit/AMD64/HalBootHeader.asm + $(ASM) $(ASMFLAGS) HALKit/AMD64/HalHandoverStub.asm $(ASM) $(ASMFLAGS) HALKit/AMD64/HalUtilsAPI.asm $(MOVEALL) diff --git a/dev/kernel/src/UserProcessTeam.cc b/dev/kernel/src/UserProcessTeam.cc index 7acbcf8d..987fbf0b 100644 --- a/dev/kernel/src/UserProcessTeam.cc +++ b/dev/kernel/src/UserProcessTeam.cc @@ -16,6 +16,7 @@ UserProcessTeam::UserProcessTeam() { for (SizeT i = 0U; i < this->mProcessList.Count(); ++i) { this->mProcessList[i] = USER_PROCESS(); this->mProcessList[i].PTime = 0; + this->mProcessList[i].RTime = 0; this->mProcessList[i].Status = ProcessStatusKind::kKilled; } |
