summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-22 09:31:21 -0500
committerAmlal El Mahrouss <amlal@nekernel.org>2025-11-22 09:32:01 -0500
commitab37adbacf0f33845804c788b39680cd754752a8 (patch)
treea533c6f0256d3067ed0e050dae59a54a6f37342b /dev
parentefefa7221a3fea3636a64f2bf067e2af75626f34 (diff)
fix: kernel: Important kernel fixes for SMP. Adding 'NeKernel' process as well.
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'dev')
-rw-r--r--dev/boot/amd64-ci.make2
-rw-r--r--dev/boot/amd64-desktop.make2
-rw-r--r--dev/boot/arm64-desktop.make2
-rw-r--r--dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc14
-rw-r--r--dev/kernel/HALKit/AMD64/HalInterruptAPI.asm36
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc6
-rw-r--r--dev/kernel/KernelKit/ProcessScheduler.h10
-rw-r--r--dev/kernel/NeKit/ErrorOr.h2
-rw-r--r--dev/kernel/amd64-ci.make2
-rw-r--r--dev/kernel/amd64-desktop.make2
-rw-r--r--dev/kernel/arm64-desktop.make2
11 files changed, 42 insertions, 38 deletions
diff --git a/dev/boot/amd64-ci.make b/dev/boot/amd64-ci.make
index 229e3359..eee7b3cb 100644
--- a/dev/boot/amd64-ci.make
+++ b/dev/boot/amd64-ci.make
@@ -65,7 +65,7 @@ REM=rm
REM_FLAG=-f
FLAG_ASM=-f win64
-FLAG_GNU=-fshort-wchar -Wall -Wpedantic -Wextra -Werror -D__EFI_x86_64__ -mno-red-zone -D__NEOSKRNL__ -D__BOOTZ__ \
+FLAG_GNU=-fshort-wchar -Wall -Wpedantic -Wextra -Werror -D__EFI_x86_64__ -mno-red-zone -D__NEKERNEL__ -D__BOOTZ__ \
-DEFI_FUNCTION_WRAPPER -I./ -I../kernel $(DEBUG_MACRO) $(DISK_DRV) -I../ -c -nostdlib -fno-rtti -fno-exceptions \
-std=c++20 -DBOOTZ_GPT_SUPPORT -DBOOTZ_EPM_SUPPORT -D__HAVE_NE_APIS__ -DZBA_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT
diff --git a/dev/boot/amd64-desktop.make b/dev/boot/amd64-desktop.make
index 337f78d5..2ddc4659 100644
--- a/dev/boot/amd64-desktop.make
+++ b/dev/boot/amd64-desktop.make
@@ -67,7 +67,7 @@ REM=rm
REM_FLAG=-f
FLAG_ASM=-f win64
-FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -Wall -Wpedantic -Wextra -mno-red-zone -D__NEOSKRNL__ -D__BOOTZ__ -DBOOTZ_VEPM_SUPPORT \
+FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -Wall -Wpedantic -Wextra -mno-red-zone -D__NEKERNEL__ -D__BOOTZ__ -DBOOTZ_VEPM_SUPPORT \
-DEFI_FUNCTION_WRAPPER -I./ -I../kernel $(DISK_DRV) -I../ -c -nostdlib -fno-rtti -fno-exceptions \
-std=c++20 -DBOOTZ_GPT_SUPPORT -D__HAVE_NE_APIS__ -DZBA_USE_FB -D__NE_AMD64__ -D__NE__ -DNE_AUTO_FORMAT -Wl,--disable-reloc-section
diff --git a/dev/boot/arm64-desktop.make b/dev/boot/arm64-desktop.make
index 989b37ed..44299cc3 100644
--- a/dev/boot/arm64-desktop.make
+++ b/dev/boot/arm64-desktop.make
@@ -45,7 +45,7 @@ REM_FLAG=-f
FLAG_ASM=-f win64
FLAG_GNU=-fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__NE_ARM64__ -fno-rtti -fno-exceptions -I./ \
-target aarch64-unknown-windows \
- -std=c++20 -DBOOTZ_EPM_SUPPORT -DZBA_USE_FB -D__FSKIT_USE_NEFS__ -D__BOOTZ_STANDALONE__ -D__NEOSKRNL__ -D__BOOTZ__ -D__HAVE_NE_APIS__ -D__NE__ -I../ -I../kernel
+ -std=c++20 -DBOOTZ_EPM_SUPPORT -DZBA_USE_FB -D__FSKIT_USE_NEFS__ -D__BOOTZ_STANDALONE__ -D__NEKERNEL__ -D__BOOTZ__ -D__HAVE_NE_APIS__ -D__NE__ -I../ -I../kernel
BOOT_LOADER=ne_bootz
KERNEL=ne_kernel
diff --git a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
index 8957ca8f..5a530457 100644
--- a/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
+++ b/dev/kernel/HALKit/AMD64/HalApplicationProcessor.cc
@@ -116,14 +116,13 @@ EXTERN_C HAL::StackFramePtr mp_get_current_task(ThreadID thrdid) {
EXTERN_C BOOL mp_register_task(HAL::StackFramePtr stack_frame, ThreadID thrdid) {
if (!stack_frame) return NO;
- if (thrdid > kSMPCount) return NO;
-
if (!kSMPAware) {
sched_jump_to_task(kHWThread[thrdid].mFramePtr);
-
return YES;
}
+ if (thrdid > kSMPCount) return NO;
+
HardwareThreadScheduler::The()[thrdid].Leak()->Busy(NO);
kHWThread[thrdid].mFramePtr = stack_frame;
@@ -146,12 +145,6 @@ Bool mp_is_smp(Void) noexcept {
Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
if (!vendor_ptr) return;
- if (!kHandoverHeader) return;
-
- if (!kHandoverHeader->f_HardwareTables.f_MultiProcessingEnabled) {
- kSMPAware = NO;
- return;
- }
PowerFactoryInterface hw_and_pow_int{vendor_ptr};
@@ -210,9 +203,6 @@ Void mp_init_cores(VoidPtr vendor_ptr) noexcept {
++kSMPCount;
kout << "AP: kind: LAPIC: ON.\r";
-
- // 0x7c00, as recommended by the Intel SDM.
- hal_send_ipi_msg(kApicBaseAddress, entry_struct->ProcessorID, 0x7c);
} else {
kout << "AP: kind: LAPIC: OFF.\r";
}
diff --git a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
index 3b3ad849..c761684e 100644
--- a/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/dev/kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -16,7 +16,7 @@
%macro IntExp 1
global __NE_INT_%1
__NE_INT_%1:
- cld
+ cli
std
@@ -26,7 +26,7 @@ __NE_INT_%1:
%macro IntNormal 1
global __NE_INT_%1
__NE_INT_%1:
- cld
+ cli
std
@@ -52,7 +52,7 @@ extern idt_handle_math
section .text
__NE_INT_0:
- cld
+ cli
push rcx
call idt_handle_generic
pop rcx
@@ -62,7 +62,7 @@ __NE_INT_0:
o64 iret
__NE_INT_1:
- cld
+ cli
push rcx
call idt_handle_generic
pop rcx
@@ -72,7 +72,7 @@ __NE_INT_1:
o64 iret
__NE_INT_2:
- cld
+ cli
push rcx
call idt_handle_generic
pop rcx
@@ -83,7 +83,7 @@ __NE_INT_2:
;; @brief Triggers a breakpoint and freeze the process. RIP is also fetched.
__NE_INT_3:
- cld
+ cli
push rcx
call idt_handle_breakpoint
pop rcx
@@ -93,7 +93,7 @@ __NE_INT_3:
o64 iret
__NE_INT_4:
- cld
+ cli
push rcx
call idt_handle_generic
@@ -104,14 +104,14 @@ __NE_INT_4:
o64 iret
__NE_INT_5:
- cld
+ cli
std
o64 iret
;; Invalid opcode interrupt
__NE_INT_6:
- cld
+ cli
push rcx
call idt_handle_ud
pop rcx
@@ -121,7 +121,7 @@ __NE_INT_6:
o64 iret
__NE_INT_7:
- cld
+ cli
push rcx
call idt_handle_generic
pop rcx
@@ -132,7 +132,7 @@ __NE_INT_7:
;; Invalid opcode interrupt
__NE_INT_8:
- cld
+ cli
push rcx
call idt_handle_math
@@ -149,7 +149,7 @@ IntExp 11
IntExp 12
__NE_INT_13:
- cld
+ cli
push rcx
call idt_handle_gpf
@@ -162,7 +162,7 @@ __NE_INT_13:
o64 iret
__NE_INT_14:
- cld
+ cli
push rcx
call idt_handle_pf
pop rcx
@@ -195,7 +195,7 @@ IntNormal 31
[extern kApicBaseAddress]
__NE_INT_32:
- cld
+ cli
push rax
mov rcx, rsp
@@ -218,7 +218,7 @@ IntNormal 39
[extern rtl_rtl8139_interrupt_handler]
__NE_INT_40:
- cld
+ cli
push rax
mov rcx, rsp
@@ -244,7 +244,7 @@ IntNormal 49
[extern hal_kernel_call_enter]
__NE_INT_50:
- cld
+ cli
push rax
mov rax, hal_system_call_enter
@@ -262,7 +262,7 @@ __NE_INT_50:
o64 iret
__NE_INT_51:
- cld
+ cli
push rax
mov rax, hal_kernel_call_enter
@@ -301,7 +301,7 @@ section .text
[global hal_load_gdt]
hal_load_gdt:
- cld
+ cli
lgdt [rcx]
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index dfd71777..e23c5bc1 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -142,6 +142,12 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
NeFS::fs_init_nefs();
#endif
+ UserProcessScheduler::The().SwitchTeam(kHighUserTeam);
+
+ rtl_create_user_process([]() -> void { while (YES); }, "NeKernel");
+
+ HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
+
HAL::Register64 idt_reg;
idt_reg.Base = reinterpret_cast<UIntPtr>(kInterruptVectorTable);
diff --git a/dev/kernel/KernelKit/ProcessScheduler.h b/dev/kernel/KernelKit/ProcessScheduler.h
index a907e096..7414e4fe 100644
--- a/dev/kernel/KernelKit/ProcessScheduler.h
+++ b/dev/kernel/KernelKit/ProcessScheduler.h
@@ -7,4 +7,12 @@
#pragma once
#include <KernelKit/KernelTaskScheduler.h>
-#include <KernelKit/UserProcessScheduler.h> \ No newline at end of file
+#include <KernelKit/UserProcessScheduler.h>
+
+#ifdef __NEOSKRNL__
+namespace Kernel {
+inline UserProcessTeam kLowUserTeam;
+inline UserProcessTeam kHighUserTeam;
+inline UserProcessTeam kMidUserTeam;
+} // namespace Kernel
+#endif \ No newline at end of file
diff --git a/dev/kernel/NeKit/ErrorOr.h b/dev/kernel/NeKit/ErrorOr.h
index 4c924957..d930fe17 100644
--- a/dev/kernel/NeKit/ErrorOr.h
+++ b/dev/kernel/NeKit/ErrorOr.h
@@ -50,7 +50,7 @@ class ErrorOr final {
/// @note DO NOT MAKE THIS EXPLICIT! IT WILL BREAK THE COMPILATION.
operator bool() { return mRef; }
- BOOL HasError() { return this->mId > 0; }
+ BOOL HasError() { return this->mId < 0; }
private:
Ref<T> mRef;
diff --git a/dev/kernel/amd64-ci.make b/dev/kernel/amd64-ci.make
index bd9741b3..203d0dc9 100644
--- a/dev/kernel/amd64-ci.make
+++ b/dev/kernel/amd64-ci.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NE_VEPM__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
+CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Werror -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__FSKIT_INCLUDES_NEFS__ -D__NEKERNEL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm
diff --git a/dev/kernel/amd64-desktop.make b/dev/kernel/amd64-desktop.make
index 61e77a4c..081bf75b 100644
--- a/dev/kernel/amd64-desktop.make
+++ b/dev/kernel/amd64-desktop.make
@@ -5,7 +5,7 @@
CXX = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
-CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NE_USE_PEF__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__FSKIT_INCLUDES_OPENHEFS__ -D__FSKIT_INCLUDES_EXT2__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__NEOSKRNL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
+CCFLAGS = -fshort-wchar -c -D__NE_AMD64__ -D__NEOSKRNL__ -D__NE_VEPM__ -Wall -Wpedantic -Wextra -mno-red-zone -fno-rtti -fno-exceptions -std=c++20 -D__FSKIT_INCLUDES_OPENHEFS__ -D__FSKIT_INCLUDES_EXT2__ -D__NE_SUPPORT_NX__ -O0 -I../vendor -D__NEKERNEL__ -D__HAVE_NE_APIS__ -D__FREESTANDING__ -D__NE_VIRTUAL_MEMORY_SUPPORT__ -D__NE_AUTO_FORMAT__ -D__NE__ -I./ -I../ -I../boot
ASM = nasm
diff --git a/dev/kernel/arm64-desktop.make b/dev/kernel/arm64-desktop.make
index 08260525..f5228d6b 100644
--- a/dev/kernel/arm64-desktop.make
+++ b/dev/kernel/arm64-desktop.make
@@ -7,7 +7,7 @@ CC = clang++
LD = lld-link
CCFLAGS = -fshort-wchar -c -ffreestanding -MMD -mno-red-zone -D__NE_ARM64__ -fno-rtti -fno-exceptions -I./ \
-target aarch64-unknown-windows \
- -std=c++20 -O3 -D__NEOSKRNL__ -D__NE_VEPM__ -D__NE_MINIMAL_OS__ -D__NE_NO_BUILTIN__ -D__HAVE_NE_APIS__ -D__NE__ -I../
+ -std=c++20 -O3 -D__NEKERNEL__ -D__NEOSKRNL__ -D__NE_VEPM__ -D__NE_MINIMAL_OS__ -D__NE_NO_BUILTIN__ -D__HAVE_NE_APIS__ -D__NE__ -I../
ASM = clang++