From 2f921f57ec48cc8c98882d7150a08c354b60bb72 Mon Sep 17 00:00:00 2001
From: Amlal El Mahrouss
Date: Thu, 13 Jun 2024 09:41:32 +0200
Subject: MHR-31: initial commit.
Signed-off-by: Amlal El Mahrouss
---
Kernel/Sources/FS/NewFS.cxx | 2 ++
Kernel/Sources/KeMain.cxx | 24 ++++++++++++------------
2 files changed, 14 insertions(+), 12 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Kernel/Sources/FS/NewFS.cxx b/Kernel/Sources/FS/NewFS.cxx
index f015673d..2938c53f 100644
--- a/Kernel/Sources/FS/NewFS.cxx
+++ b/Kernel/Sources/FS/NewFS.cxx
@@ -593,6 +593,8 @@ _Output NewCatalog* NewFSParser::FindCatalog(_Input const char* catalogName,
if (!sMountpointInterface.GetAddressOf(this->fDriveIndex))
return nullptr;
+ kcout << "newoskrnl: start finding catalog...\r";
+
Char* sectorBuf = new Char[sizeof(NewPartitionBlock)];
auto drive = sMountpointInterface.GetAddressOf(this->fDriveIndex);
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index f4f9f44c..e2f41464 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -39,7 +39,7 @@ namespace NewOS::Detail
{
/// Mounted partition, cool!
NewOS::kcout
- << "New OS: No need to create for a NewFS partition here...\r";
+ << "newoskrnl: No need to create for a NewFS partition here...\r";
}
else
{
@@ -51,11 +51,11 @@ namespace NewOS::Detail
if (fNewFS->GetParser())
{
- constexpr auto cFolderInfo = "Metadata";
+ constexpr auto cFolderInfo = "META-INF";
const auto cDirCount = 8;
const char* cDirStr[cDirCount] = {
- "/Boot/", "/System/", "/Support/", "/Applications/",
- "/Users/", "/Library/", "/Mount/", "/Assistants/"};
+ "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\",
+ "\\Users\\", "\\Library\\", "\\Mount\\", "\\DCIM\\"};
for (NewOS::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx)
{
@@ -113,9 +113,9 @@ namespace NewOS::Detail
}
NewCatalog* catalogDisk =
- this->fNewFS->GetParser()->GetCatalog("/Mount/This Disk");
+ this->fNewFS->GetParser()->GetCatalog("\\Mount\\This Disk");
- const NewOS::Char* cSrcName = "DiskInfo";
+ const NewOS::Char* cSrcName = "DISK-INF";
if (catalogDisk)
{
@@ -128,14 +128,14 @@ namespace NewOS::Detail
else
{
catalogDisk =
- (NewCatalog*)this->Leak()->CreateAlias("/Mount/This Disk");
+ (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\This Disk");
NewOS::StringView diskFolder(kNewFSSectorSz);
diskFolder +=
- "Kind: alias to disk
\rCreated by: system
\rEdited "
+ "
Kind: alias to disk
\rCreated by: newoskrnl
\rEdited "
"by: "
- "system
\rVolume Type: New OS Standard
\r";
+ "N/A
\rVolume Type: New OS Standard
\r";
diskFolder += "Original Path: ";
diskFolder += NewOS::NewFilesystemHelper::Root();
@@ -184,7 +184,7 @@ namespace NewOS::Detail
/// @return void no return value.
STATIC NewOS::Void SystemLauncher_Main(NewOS::Void)
{
- NewOS::PEFLoader lockScreen("/System/LockScreen");
+ NewOS::PEFLoader lockScreen("\\System\\LockScreen");
if (!lockScreen.IsLoaded())
{
@@ -194,7 +194,7 @@ namespace NewOS::Detail
NewOS::Utils::execute_from_image(lockScreen,
NewOS::ProcessHeader::kAppKind);
- NewOS::PEFLoader stageBoard("/System/StageBoard");
+ NewOS::PEFLoader stageBoard("\\System\\StageBoard");
if (!stageBoard.IsLoaded())
{
@@ -221,7 +221,7 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void)
auto cLoaderName = "SystemLauncher";
NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName);
- while (true)
+ while (true)
{
NewOS::ProcessScheduler::The().Leak().Run();
}
--
cgit v1.2.3
From 349fe48baf941b2d1b571d3a5d0d796823bae312 Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Thu, 13 Jun 2024 17:41:19 +0200
Subject: MHR-31: New systemcall/kernelcall architecture.
Signed-off-by: Amlal EL Mahrouss
---
Boot/makefile | 2 +-
DDK/KernelCall.c | 11 ++--
DDK/KernelDev.c | 7 +--
DDK/KernelPrint.c | 2 +-
DDK/KernelStd.h | 8 ++-
DDK/KernelStdCxx.cc | 6 +--
Kernel/ArchKit/ArchKit.hpp | 13 ++++-
.../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 50 +++++++++++-------
.../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 22 ++------
Kernel/HALKit/AMD64/HalInterruptAPI.asm | 59 +++++++++++++++++++++-
Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp | 20 +++++---
Kernel/NewKit/Array.hpp | 9 +---
Kernel/Sources/SMPManager.cxx | 2 +-
13 files changed, 139 insertions(+), 72 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Boot/makefile b/Boot/makefile
index 4bee19a2..e54b1aa8 100644
--- a/Boot/makefile
+++ b/Boot/makefile
@@ -26,7 +26,7 @@ BIOS=OVMF.fd
IMG=epm.img
IMG_2=epm-slave.img
-EMU_FLAGS=-net none -smp 4 -serial stdio -m 4G -M q35 \
+EMU_FLAGS=-net none -smp 4 -m 4G -M q35 \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c
index c20a4894..a16a5278 100644
--- a/DDK/KernelCall.c
+++ b/DDK/KernelCall.c
@@ -9,22 +9,17 @@
#include
#include
-DK_EXTERN __attribute__((naked)) void __kernelDispatchCall(int32_t cnt, ...);
+DK_EXTERN __attribute__((naked)) void* __kernelDispatchCall(const char* name, int32_t cnt, void* data, size_t sz);
/// @brief Execute a function on the kernel.
/// @param kernelRpcName the name of the function.
/// @param cnt number of arguments.
/// @param
/// @return
-DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...)
+DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* data, size_t sz)
{
if (!kernelRpcName || cnt == 0)
return NIL;
- va_list arg;
- va_start(arg, cnt);
-
- __kernelDispatchCall(cnt, arg);
-
- va_end(arg);
+ return __kernelDispatchCall(kernelRpcName, cnt, data, sz);
}
diff --git a/DDK/KernelDev.c b/DDK/KernelDev.c
index f19f85c6..6a6aac99 100644
--- a/DDK/KernelDev.c
+++ b/DDK/KernelDev.c
@@ -7,6 +7,7 @@
------------------------------------------- */
#include
+#include
/// @brief Open a new binary device from path.
DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath)
@@ -14,7 +15,7 @@ DK_EXTERN kernelDeviceRef kernelOpenBinaryDevice(const char* devicePath)
if (!devicePath)
return NIL;
- return kernelCall("OpenBinaryDevice", 1, devicePath);
+ return kernelCall("OpenBinaryDevice", 1, devicePath, kernelStringLength(devicePath));
}
/// @brief Open a new character device from path.
@@ -23,7 +24,7 @@ DK_EXTERN kernelDeviceRef kernelOpenCharDevice(const char* devicePath)
if (!devicePath)
return NIL;
- return kernelCall("OpenCharDevice", 1, devicePath);
+ return kernelCall("OpenCharDevice", 1, devicePath, kernelStringLength(devicePath));
}
/// @brief Close any device.
@@ -33,5 +34,5 @@ DK_EXTERN void kernelCloseDevice(kernelDeviceRef device)
if (!device)
return;
- kernelCall("CloseDevice", 1, device);
+ kernelCall("CloseDevice", 1, device, sizeof(kernelDevice));
}
diff --git a/DDK/KernelPrint.c b/DDK/KernelPrint.c
index b7513149..77f70280 100644
--- a/DDK/KernelPrint.c
+++ b/DDK/KernelPrint.c
@@ -10,7 +10,7 @@
DK_EXTERN void kernelPrintChar(const char ch)
{
- kernelCall("WriteCharacter", 1, ch);
+ kernelCall("WriteCharacter", 1, ch, 1);
}
/// @brief print string to UART.
diff --git a/DDK/KernelStd.h b/DDK/KernelStd.h
index 61bc23a9..63df4c2a 100644
--- a/DDK/KernelStd.h
+++ b/DDK/KernelStd.h
@@ -19,4 +19,10 @@
#include
#include
-DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, ...);
+/// @brief Call kernel (interrupt 0x33)
+/// @param kernelRpcName
+/// @param cnt
+/// @param dat
+/// @param sz
+/// @return
+DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* dat, size_t sz);
diff --git a/DDK/KernelStdCxx.cc b/DDK/KernelStdCxx.cc
index b1d233fa..cdca85dc 100644
--- a/DDK/KernelStdCxx.cc
+++ b/DDK/KernelStdCxx.cc
@@ -11,8 +11,8 @@
void* operator new(size_t sz) {
if (!sz) ++sz;
- auto ptr = kernelCall("NewKernelHeap", 1, sz);
- kernelCall("ProtectKernelHeap", 1, ptr);
+ auto ptr = kernelCall("NewKernelHeap", 1, &sz, sizeof(size_t));
+ kernelCall("ProtectKernelHeap", 1, ptr, sz);
return ptr;
}
@@ -20,5 +20,5 @@ void* operator new(size_t sz) {
void operator delete(void* ptr) noexcept {
if (!ptr) return;
- kernelCall("DeleteKernelHeap", 1,ptr);
+ kernelCall("DeleteKernelHeap", 1, ptr, 0);
}
diff --git a/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp
index 419f2c7a..c2e5a967 100644
--- a/Kernel/ArchKit/ArchKit.hpp
+++ b/Kernel/ArchKit/ArchKit.hpp
@@ -81,10 +81,21 @@ namespace NewOS
typedef NewOS::Void (*rt_syscall_proc)(NewOS::HAL::StackFramePtr);
-extern NewOS::Array
kSyscalls;
+inline NewOS::Array
+ kKerncalls;
+
EXTERN_C NewOS::HAL::StackFramePtr rt_get_current_context();
EXTERN_C NewOS::Void rt_do_context_switch(NewOS::HAL::StackFramePtr stackFrame);
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
index 5f64cc20..a21a4c47 100644
--- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
@@ -24,24 +24,6 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
}
-/// @brief Handle the scheduler interrupt, raised from the HPET timer.
-/// @param rsp
-EXTERN_C void idt_handle_scheduler(NewOS::UIntPtr rsp)
-{
- NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
- NewOS::kcout
- << "newoskrnl: Will be scheduled back later "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName()
- << NewOS::end_line();
-
- /// schedule another process.
- if (!NewOS::ProcessHelper::StartScheduling())
- {
- NewOS::kcout << "newoskrnl: Continue schedule this process...\r";
- }
-}
-
/// @brief Handle page fault.
/// @param rsp
EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
@@ -99,3 +81,35 @@ EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp)
NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
}
+
+/// @brief Enter syscall from assembly.
+/// @param stack the stack pushed from assembly routine.
+/// @return nothing.
+EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx)
+{
+ if (rcx <= (kSyscalls.Count() - 1))
+ {
+ NewOS::kcout << "newoskrnl: syscall: enter.\r";
+
+ NewOS::kcout << "rcx: " << NewOS::number(rcx) << NewOS::endl;
+
+ if (kSyscalls[rcx].Leak().Leak().fHooked)
+ (kSyscalls[rcx].Leak().Leak().fProc)((NewOS::HAL::StackFramePtr)rdx);
+
+ NewOS::kcout << "newoskrnl: syscall: exit.\r";
+ }
+}
+
+/// @brief Enter kernel call from assembly (DDK only).
+/// @param stack the stack pushed from assembly routine.
+/// @return nothing.
+EXTERN_C NewOS::Void hal_kernel_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx,
+ NewOS::UIntPtr r8, NewOS::UIntPtr r9)
+{
+ if (rcx != 0)
+ {
+ NewOS::kcout << "newoskrnl: kerncall: enter.\r";
+
+ NewOS::kcout << "newoskrnl: kerncall: exit.\r";
+ }
+}
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index b70649ee..e2520332 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -159,23 +159,10 @@ namespace NewOS::HAL
EXTERN_C Void hal_apic_acknowledge_cont(Void)
{
- kcout << "newoskrnl: finish kernel init... \r";
+ /// TODO: better init code.
+ KeMain();
- if (cProgramInitialized &&
- *cProgramInitialized)
- {
- *cProgramInitialized = false;
-
- kcout << "newoskrnl: putting thread to sleep...\r";
-
- KeMain();
-
- _hal_spin_core();
- }
- else
- {
- _hal_spin_core();
- }
+ _hal_spin_core();
}
EXTERN_C StackFramePtr _hal_leak_current_context(Void)
@@ -196,6 +183,7 @@ namespace NewOS::HAL
STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame)
{
Semaphore sem;
+
while (sem.IsLocked())
{
}
@@ -205,7 +193,7 @@ namespace NewOS::HAL
cFramePtr = stackFrame;
/// yes the exception field contains the core id.
- hal_send_start_ipi(stackFrame->Exception, 0x40, cBaseAddressAPIC);
+ hal_send_start_ipi(stackFrame->Rcx, 0x40, cBaseAddressAPIC);
sem.Unlock();
}
diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
index ef5a8319..e88ffc0d 100644
--- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -195,15 +195,69 @@ IntNormal 47
IntNormal 48
IntNormal 49
+[extern hal_system_call_enter]
+[extern hal_kernel_call_enter]
+
__NEW_INT_50:
cli
- ;; todo handle system calls.
+ push rax
+
+ call hal_system_call_enter
+
+ pop rax
+
+ sti
+ iretq
+
+__NEW_INT_51:
+ cli
+
+ push 0
+ push 51
+ push rax
+ push rcx
+ push rdx
+ push rbx
+ push rbp
+ push rsi
+ push rdi
+ push r8
+ push r9
+ push r10
+ push r11
+ push r12
+ push r13
+ push r14
+ push r15
+ push gs
+ push fs
+
+ mov rcx, rbp
+
+ call hal_kernel_call_enter
+
+ pop fs
+ pop gs
+ pop r15
+ pop r14
+ pop r13
+ pop r12
+ pop r11
+ pop r10
+ pop r9
+ pop r8
+ pop rdi
+ pop rsi
+ pop rbp
+ pop rbx
+ pop rdx
+ pop rcx
+ pop rax
sti
iretq
-IntNormal 51
IntNormal 52
IntNormal 53
IntNormal 54
@@ -223,6 +277,7 @@ IntNormal 60
;; this one is doing a POST for us.
;; testing interrupts.
_ke_power_on_self_test:
+ mov rcx, 0x10
int 0x32
int 0x32
int 0x32
diff --git a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp
index ea0997ed..3217a660 100644
--- a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp
+++ b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp
@@ -5,16 +5,20 @@
------------------------------------------- */
#include
-#include
+#include
-NewOS::Array
- kSyscalls;
-
-extern "C" void rt_syscall_handle(NewOS::HAL::StackFrame* stack)
+/// @brief Internal call for syscall, to work with C++.
+/// @param stack
+/// @return nothing.
+EXTERN_C void rt_syscall_handle(NewOS::HAL::StackFrame* stack)
{
- for (NewOS::SizeT index = 0UL; index < kKernelMaxSystemCalls; ++index)
+ if (stack->Rcx <= (kSyscalls.Count() - 1))
{
- (kSyscalls[index].Leak().Leak())(stack->ID, stack);
+ NewOS::kcout << "newoskrnl: syscall: enter.\r";
+
+ if (kSyscalls[stack->Rcx].Leak().Leak().fHooked)
+ (kSyscalls[stack->Rcx].Leak().Leak().fProc)(stack);
+
+ NewOS::kcout << "newoskrnl: syscall: exit.\r";
}
}
diff --git a/Kernel/NewKit/Array.hpp b/Kernel/NewKit/Array.hpp
index b8386c9a..1c89f365 100644
--- a/Kernel/NewKit/Array.hpp
+++ b/Kernel/NewKit/Array.hpp
@@ -43,14 +43,7 @@ namespace NewOS
SizeT Count() const
{
- SizeT cntElems = 0UL;
- for (auto Val : fArray)
- {
- if (Val)
- ++cntElems;
- }
-
- return cntElems;
+ return N;
}
const T* CData()
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index f0b680ce..99a3b025 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -113,7 +113,7 @@ namespace NewOS
fStack->R9 = stack->R9;
fStack->R8 = stack->R8;
- fStack->Exception = this->fID;
+ fStack->Rcx = this->fID;
}
rt_do_context_switch(fStack);
--
cgit v1.2.3
From 7327f305efb1c6678722308cc5f9645dd39f451e Mon Sep 17 00:00:00 2001
From: Amlal El Mahrouss
Date: Thu, 13 Jun 2024 19:38:29 +0200
Subject: MHR-31: Lots of fixes and improvements regarding the kernel.
Signed-off-by: Amlal El Mahrouss
---
Boot/makefile | 2 +-
Kernel/ArchKit/ArchKit.hpp | 4 +-
.../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 25 +--------
.../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 7 +--
Kernel/HALKit/AMD64/HalHardwareMP.cpp | 30 -----------
Kernel/HALKit/AMD64/HalHart.cpp | 30 +++++++++++
Kernel/HALKit/AMD64/HalInterruptAPI.asm | 47 +++++------------
Kernel/HALKit/AMD64/HalKernelMain.cxx | 19 ++++++-
Kernel/HALKit/AMD64/PCI/Iterator.cxx | 6 +--
Kernel/KernelKit/ProcessScheduler.hxx | 19 ++-----
Kernel/KernelKit/SMPManager.hpp | 6 +--
Kernel/NewKit/Array.hpp | 4 +-
Kernel/NewKit/MutableArray.hpp | 7 +++
Kernel/Sources/HError.cxx | 3 +-
Kernel/Sources/KeMain.cxx | 5 --
Kernel/Sources/ProcessScheduler.cxx | 61 +++++++++++-----------
Kernel/Sources/SMPManager.cxx | 46 +++++++++-------
17 files changed, 145 insertions(+), 176 deletions(-)
delete mode 100644 Kernel/HALKit/AMD64/HalHardwareMP.cpp
create mode 100644 Kernel/HALKit/AMD64/HalHart.cpp
(limited to 'Kernel/Sources')
diff --git a/Boot/makefile b/Boot/makefile
index e54b1aa8..4bee19a2 100644
--- a/Boot/makefile
+++ b/Boot/makefile
@@ -26,7 +26,7 @@ BIOS=OVMF.fd
IMG=epm.img
IMG_2=epm-slave.img
-EMU_FLAGS=-net none -smp 4 -m 4G -M q35 \
+EMU_FLAGS=-net none -smp 4 -serial stdio -m 4G -M q35 \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
diff --git a/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp
index c2e5a967..6407a0d8 100644
--- a/Kernel/ArchKit/ArchKit.hpp
+++ b/Kernel/ArchKit/ArchKit.hpp
@@ -79,7 +79,7 @@ namespace NewOS
#define kKernelMaxSystemCalls (256)
-typedef NewOS::Void (*rt_syscall_proc)(NewOS::HAL::StackFramePtr);
+typedef NewOS::Void (*rt_syscall_proc)(NewOS::VoidPtr);
struct RTSyscallInfoHdr final
{
@@ -95,7 +95,7 @@ inline NewOS::Array
kKerncalls;
-
+
EXTERN_C NewOS::HAL::StackFramePtr rt_get_current_context();
EXTERN_C NewOS::Void rt_do_context_switch(NewOS::HAL::StackFramePtr stackFrame);
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
index a21a4c47..51570b86 100644
--- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
@@ -12,11 +12,6 @@
/// @param rsp
EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
-
- NewOS::kcout << "newoskrnl: Stack Pointer: "
- << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: General Protection Fault, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -28,9 +23,6 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
- NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Segmentation Fault, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -42,9 +34,6 @@ EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
- NewOS::kcout << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Math error, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -56,9 +45,6 @@ EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
- NewOS::kcout << NewOS::StringBuilder::FromInt("sp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Execution error, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -70,11 +56,6 @@ EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp)
/// @param rsp
EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp)
{
- MUST_PASS(NewOS::ProcessScheduler::The().Leak().GetCurrent());
-
- NewOS::kcout << "newoskrnl: Stack Pointer: "
- << NewOS::StringBuilder::FromInt("rsp{%}", rsp);
-
NewOS::kcout
<< "newoskrnl: Invalid interrupt, caused by "
<< NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
@@ -91,10 +72,8 @@ EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rd
{
NewOS::kcout << "newoskrnl: syscall: enter.\r";
- NewOS::kcout << "rcx: " << NewOS::number(rcx) << NewOS::endl;
-
- if (kSyscalls[rcx].Leak().Leak().fHooked)
- (kSyscalls[rcx].Leak().Leak().fProc)((NewOS::HAL::StackFramePtr)rdx);
+ if (kSyscalls[rcx].Leak().Leak()->fHooked)
+ (kSyscalls[rcx].Leak().Leak()->fProc)((NewOS::VoidPtr)rdx);
NewOS::kcout << "newoskrnl: syscall: exit.\r";
}
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index e2520332..c15a7b55 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -16,9 +16,6 @@
#define kAPIC_SIPI_Vector 0x00500
#define kAPIC_EIPI_Vector 0x00400
-/// @brief This symbol is the kernel main symbol.
-EXTERN_C void KeMain();
-
/// @brief assembly routine. internal use only.
EXTERN_C void _hal_enable_smp(void);
@@ -159,9 +156,7 @@ namespace NewOS::HAL
EXTERN_C Void hal_apic_acknowledge_cont(Void)
{
- /// TODO: better init code.
- KeMain();
-
+ ProcessHelper::StartScheduling();
_hal_spin_core();
}
diff --git a/Kernel/HALKit/AMD64/HalHardwareMP.cpp b/Kernel/HALKit/AMD64/HalHardwareMP.cpp
deleted file mode 100644
index 92e075aa..00000000
--- a/Kernel/HALKit/AMD64/HalHardwareMP.cpp
+++ /dev/null
@@ -1,30 +0,0 @@
-/* -------------------------------------------
-
- Copyright Zeta Electronics Corporation
-
-------------------------------------------- */
-
-#include
-
-// bugs = 0
-
-namespace NewOS
-{
- /// @brief wakes up thread.
- /// wakes up thread from hang.
- void rt_wakeup_thread(HAL::StackFrame* stack)
- {
- HAL::rt_cli();
-
- HAL::rt_sti();
- }
-
- /// @brief makes thread sleep.
- /// hooks and hangs thread to prevent code from executing.
- void rt_hang_thread(HAL::StackFrame* stack)
- {
- HAL::rt_cli();
-
- HAL::rt_sti();
- }
-} // namespace NewOS
diff --git a/Kernel/HALKit/AMD64/HalHart.cpp b/Kernel/HALKit/AMD64/HalHart.cpp
new file mode 100644
index 00000000..92e075aa
--- /dev/null
+++ b/Kernel/HALKit/AMD64/HalHart.cpp
@@ -0,0 +1,30 @@
+/* -------------------------------------------
+
+ Copyright Zeta Electronics Corporation
+
+------------------------------------------- */
+
+#include
+
+// bugs = 0
+
+namespace NewOS
+{
+ /// @brief wakes up thread.
+ /// wakes up thread from hang.
+ void rt_wakeup_thread(HAL::StackFrame* stack)
+ {
+ HAL::rt_cli();
+
+ HAL::rt_sti();
+ }
+
+ /// @brief makes thread sleep.
+ /// hooks and hangs thread to prevent code from executing.
+ void rt_hang_thread(HAL::StackFrame* stack)
+ {
+ HAL::rt_cli();
+
+ HAL::rt_sti();
+ }
+} // namespace NewOS
diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
index e88ffc0d..150cfc10 100644
--- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -201,11 +201,15 @@ IntNormal 49
__NEW_INT_50:
cli
+ push rcx
+ push rdx
push rax
call hal_system_call_enter
pop rax
+ pop rdx
+ pop rcx
sti
iretq
@@ -213,47 +217,19 @@ __NEW_INT_50:
__NEW_INT_51:
cli
- push 0
- push 51
- push rax
push rcx
push rdx
- push rbx
- push rbp
- push rsi
- push rdi
push r8
push r9
- push r10
- push r11
- push r12
- push r13
- push r14
- push r15
- push gs
- push fs
-
- mov rcx, rbp
+ push rax
call hal_kernel_call_enter
- pop fs
- pop gs
- pop r15
- pop r14
- pop r13
- pop r12
- pop r11
- pop r10
+ pop rax
pop r9
pop r8
- pop rdi
- pop rsi
- pop rbp
- pop rbx
pop rdx
pop rcx
- pop rax
sti
iretq
@@ -278,13 +254,18 @@ IntNormal 60
;; testing interrupts.
_ke_power_on_self_test:
mov rcx, 0x10
- int 0x32
- int 0x32
- int 0x32
+ mov rdx, _ke_string_post
+
int 0x32
ret
+section .data
+_ke_string_post:
+ db "POST has been successful.", 0
+
+section .text
+
[global hal_load_gdt]
hal_load_gdt:
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 708004b3..6f01734e 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -14,6 +14,10 @@
#include
#include
#include
+#include
+
+/// @brief This symbol is the kernel main symbol.
+EXTERN_C void KeMain();
EXTERN_C NewOS::VoidPtr kInterruptVectorTable[];
@@ -72,13 +76,24 @@ EXTERN_C void hal_init_platform(
/// START POST
+ constexpr auto cDummyInterrupt = 0x10; // 16
+
+ kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void {
+ const char* msg = (const char*)sf;
+ NewOS::kcout << "newoskrnl: " << msg << "\r";
+ };
+
+ kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true;
+
NewOS::HAL::Detail::_ke_power_on_self_test();
+ auto cLoaderName = "newoskrnl";
+ NewOS::execute_from_image(KeMain, cLoaderName);
+
NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
NewOS::kcout << "newoskrnl: We're done here...\r";
while (true)
- {
- }
+ {}
}
diff --git a/Kernel/HALKit/AMD64/PCI/Iterator.cxx b/Kernel/HALKit/AMD64/PCI/Iterator.cxx
index 8675f171..297aa89c 100644
--- a/Kernel/HALKit/AMD64/PCI/Iterator.cxx
+++ b/Kernel/HALKit/AMD64/PCI/Iterator.cxx
@@ -7,8 +7,8 @@
#include
#define PCI_ITERATOR_FIND_AND_UNWRAP(DEV, SZ) \
- if (DEV.Leak()) \
- return DEV.Leak();
+ if (DEV.Leak().Leak()) \
+ return *DEV.Leak().Leak();
namespace NewOS::PCI
{
@@ -25,7 +25,7 @@ namespace NewOS::PCI
if (dev.Class() == (UChar)type)
{
- fDevices[bus].Leak().Leak() = dev;
+ *fDevices[bus].Leak().Leak() = dev;
}
}
}
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index c6e090e4..8c1971b0 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -17,7 +17,7 @@
#define kSchedMinMicroTime (AffinityKind::kHartStandard)
#define kSchedInvalidPID (-1)
-#define kSchedProcessLimitPerTeam (100U)
+#define kSchedProcessLimitPerTeam (16U)
////////////////////////////////////////////////////
@@ -134,7 +134,6 @@ namespace NewOS
explicit ProcessHeader(VoidPtr startImage = nullptr)
: Image(startImage)
{
- MUST_PASS(startImage);
}
~ProcessHeader() = default;
@@ -145,7 +144,7 @@ namespace NewOS
void SetEntrypoint(UIntPtr& imageStart) noexcept;
public:
- Char Name[kProcessLen] = {"NewOS Process"};
+ Char Name[kProcessLen] = {"Process"};
ProcessSubsystem SubSystem{ProcessSubsystem::eProcessSubsystemInvalid};
ProcessSelector Selector{ProcessSelector::kRingUser};
HAL::StackFramePtr StackFrame{nullptr};
@@ -240,23 +239,15 @@ namespace NewOS
/// The main class which you call to schedule an app.
class ProcessScheduler final
{
- private:
- explicit ProcessScheduler() = default;
+ explicit ProcessScheduler() = default;
public:
~ProcessScheduler() = default;
NEWOS_COPY_DEFAULT(ProcessScheduler)
- operator bool()
- {
- return mTeam.AsArray().Count() > 0;
- }
-
- bool operator!()
- {
- return mTeam.AsArray().Count() == 0;
- }
+ operator bool();
+ bool operator!();
public:
ProcessTeam& CurrentTeam();
diff --git a/Kernel/KernelKit/SMPManager.hpp b/Kernel/KernelKit/SMPManager.hpp
index 985050f1..ba706cf6 100644
--- a/Kernel/KernelKit/SMPManager.hpp
+++ b/Kernel/KernelKit/SMPManager.hpp
@@ -94,11 +94,11 @@ namespace NewOS
NEWOS_COPY_DEFAULT(SMPManager);
public:
- bool Switch(HAL::StackFrame* the);
- HAL::StackFramePtr GetStackFrame() noexcept;
+ bool Switch(HAL::StackFramePtr the);
+ HAL::StackFramePtr Leak() noexcept;
public:
- Ref operator[](const SizeT& idx);
+ Ref operator[](const SizeT& idx);
bool operator!() noexcept;
operator bool() noexcept;
diff --git a/Kernel/NewKit/Array.hpp b/Kernel/NewKit/Array.hpp
index 1c89f365..dca5c13f 100644
--- a/Kernel/NewKit/Array.hpp
+++ b/Kernel/NewKit/Array.hpp
@@ -21,13 +21,13 @@ namespace NewOS
Array& operator=(const Array&) = default;
Array(const Array&) = default;
- ErrorOr operator[](Size At)
+ ErrorOr operator[](Size At)
{
if (At > N)
return {};
kcout << "Returning element\r";
- return ErrorOr(fArray[At]);
+ return ErrorOr(&fArray[At]);
}
Boolean Empty() const
diff --git a/Kernel/NewKit/MutableArray.hpp b/Kernel/NewKit/MutableArray.hpp
index f9c79301..a3ad4cb1 100644
--- a/Kernel/NewKit/MutableArray.hpp
+++ b/Kernel/NewKit/MutableArray.hpp
@@ -170,6 +170,13 @@ namespace NewOS
Boolean Add(const T val)
{
auto* iterationNode = fFirstNode;
+
+ if (!iterationNode)
+ {
+ fFirstNode = new MutableLinkedList();
+ iterationNode = fFirstNode;
+ }
+
MUST_PASS(iterationNode);
while (iterationNode)
diff --git a/Kernel/Sources/HError.cxx b/Kernel/Sources/HError.cxx
index 937e983a..1f36d020 100644
--- a/Kernel/Sources/HError.cxx
+++ b/Kernel/Sources/HError.cxx
@@ -13,6 +13,7 @@ namespace NewOS
/// @return if error-free: true, otherwise false.
Boolean ke_bug_check(void) noexcept
{
- return true;
+ /// TODO:
+ return false;
}
} // namespace NewOS
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index e2f41464..60494ee3 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -220,9 +220,4 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void)
auto cLoaderName = "SystemLauncher";
NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName);
-
- while (true)
- {
- NewOS::ProcessScheduler::The().Leak().Run();
- }
}
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 08a7971e..7008eafe 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -18,7 +18,7 @@
///! BUGS: 0
/***********************************************************************************/
-/* This file handles the process scheduling.
+/* This file handles the process scheduling. */
/***********************************************************************************/
namespace NewOS
@@ -42,7 +42,8 @@ namespace NewOS
void ProcessHeader::Crash()
{
- kcout << this->Name << ": crashed. (id = " << number(kErrorProcessFault);
+ kcout << (*this->Name == 0 ? "Unknown" : this->Name) << ": crashed. (id = ";
+ kcout.Number(kErrorProcessFault);
kcout << ")\r";
if (this->Ring != kRingUserKind)
@@ -201,9 +202,6 @@ namespace NewOS
/// @return
SizeT ProcessScheduler::Add(Ref& process)
{
- if (!process)
- return -1;
-
if (!process.Leak().Image)
{
if (process.Leak().Kind != ProcessHeader::kShLibKind)
@@ -212,7 +210,7 @@ namespace NewOS
}
}
- if (!mTeam.AsArray().Count() > kSchedProcessLimitPerTeam)
+ if (mTeam.AsArray().Count() > kSchedProcessLimitPerTeam)
return -kErrorOutOfTeamSlot;
kcout << "ProcessScheduler::Add(Ref& process)\r";
@@ -262,8 +260,8 @@ namespace NewOS
{
auto process = mTeam.AsArray()[processIndex];
- MUST_PASS(process); //! no need for a MUST_PASS(process.Leak());, it is
- //! recursive because of the nature of the class;
+ if (!process)
+ continue;
//! run any process needed to be scheduled.
if (ProcessHelper::CanBeScheduled(process.Leak()))
@@ -351,22 +349,11 @@ namespace NewOS
bool ProcessHelper::StartScheduling()
{
- if (ProcessHelper::CanBeScheduled(
- ProcessScheduler::The().Leak().GetCurrent()))
- {
- --ProcessScheduler::The().Leak().GetCurrent().Leak().PTime;
- return false;
- }
-
- auto processRef = ProcessScheduler::The().Leak();
-
- if (!processRef)
- return false; // we have nothing to schedule. simply return.
+ auto& processRef = ProcessScheduler::The().Leak();
+ SizeT ret = processRef.Run();
- SizeT ret = processRef.Run();
-
- kcout << StringBuilder::FromInt(
- "ProcessHelper::StartScheduling() Iterated over {%} jobs inside team.\r", ret);
+ kcout << "newoskrnl: Iterated over: " << number(ret);
+ kcout << " processes.\r";
return true;
}
@@ -384,30 +371,42 @@ namespace NewOS
for (SizeT index = 0UL; index < SMPManager::The().Leak().Count(); ++index)
{
- if (SMPManager::The().Leak()[index].Leak().Kind() == kInvalidHart)
+ if (SMPManager::The().Leak()[index].Leak()->Kind() == kInvalidHart)
continue;
- if (SMPManager::The().Leak()[index].Leak().StackFrame() == the_stack)
+ if (SMPManager::The().Leak()[index].Leak()->StackFrame() == the_stack)
{
- SMPManager::The().Leak()[index].Leak().Busy(false);
+ SMPManager::The().Leak()[index].Leak()->Busy(false);
continue;
}
- if (SMPManager::The().Leak()[index].Leak().IsBusy())
+ if (SMPManager::The().Leak()[index].Leak()->IsBusy())
continue;
- if (SMPManager::The().Leak()[index].Leak().Kind() !=
+ if (SMPManager::The().Leak()[index].Leak()->Kind() !=
ThreadKind::kHartBoot &&
- SMPManager::The().Leak()[index].Leak().Kind() !=
+ SMPManager::The().Leak()[index].Leak()->Kind() !=
ThreadKind::kHartSystemReserved)
{
- SMPManager::The().Leak()[index].Leak().Busy(true);
+ SMPManager::The().Leak()[index].Leak()->Busy(true);
ProcessHelper::GetCurrentPID() = new_pid;
- return SMPManager::The().Leak()[index].Leak().Switch(the_stack);
+ return SMPManager::The().Leak()[index].Leak()->Switch(the_stack);
}
}
return false;
}
+
+ /// @brief this checks if any process is on the team.
+ ProcessScheduler::operator bool()
+ {
+ return mTeam.AsArray().Count() > 0;
+ }
+
+ /// @brief this checks if no process is on the team.
+ bool ProcessScheduler::operator!()
+ {
+ return mTeam.AsArray().Count() == 0;
+ }
} // namespace NewOS
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index 99a3b025..683343ff 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -117,7 +117,7 @@ namespace NewOS
}
rt_do_context_switch(fStack);
-
+
return true;
}
@@ -143,12 +143,12 @@ namespace NewOS
}
/// @brief Get Stack Frame of Core
- HAL::StackFramePtr SMPManager::GetStackFrame() noexcept
+ HAL::StackFramePtr SMPManager::Leak() noexcept
{
if (fThreadList[fCurrentThread].Leak() &&
ProcessHelper::GetCurrentPID() ==
- fThreadList[fCurrentThread].Leak().Leak().fPID)
- return fThreadList[fCurrentThread].Leak().Leak().fStack;
+ fThreadList[fCurrentThread].Leak().Leak()->fPID)
+ return fThreadList[fCurrentThread].Leak().Leak()->fStack;
return nullptr;
}
@@ -163,35 +163,35 @@ namespace NewOS
{
// stack != nullptr -> if core is used, then continue.
if (!fThreadList[idx].Leak() ||
- !fThreadList[idx].Leak().Leak().IsWakeup() ||
- fThreadList[idx].Leak().Leak().IsBusy())
+ !fThreadList[idx].Leak().Leak()->IsWakeup() ||
+ fThreadList[idx].Leak().Leak()->IsBusy())
continue;
// to avoid any null deref.
- if (!fThreadList[idx].Leak().Leak().fStack)
+ if (!fThreadList[idx].Leak().Leak()->fStack)
continue;
- if (fThreadList[idx].Leak().Leak().fStack->Rsp == 0)
+ if (fThreadList[idx].Leak().Leak()->fStack->Rsp == 0)
continue;
- if (fThreadList[idx].Leak().Leak().fStack->Rbp == 0)
+ if (fThreadList[idx].Leak().Leak()->fStack->Rbp == 0)
continue;
- fThreadList[idx].Leak().Leak().Busy(true);
+ fThreadList[idx].Leak().Leak()->Busy(true);
- fThreadList[idx].Leak().Leak().fID = idx;
+ fThreadList[idx].Leak().Leak()->fID = idx;
/// I figured out this:
/// Allocate stack
/// Set APIC base to stack
/// Do stuff and relocate stack based on this code.
/// - Amlel
- rt_copy_memory(stack, fThreadList[idx].Leak().Leak().fStack,
+ rt_copy_memory(stack, fThreadList[idx].Leak().Leak()->fStack,
sizeof(HAL::StackFrame));
- fThreadList[idx].Leak().Leak().Switch(fThreadList[idx].Leak().Leak().fStack);
+ fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack);
- fThreadList[idx].Leak().Leak().fPID = ProcessHelper::GetCurrentPID();
+ fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::GetCurrentPID();
- fThreadList[idx].Leak().Leak().Busy(false);
+ fThreadList[idx].Leak().Leak()->Busy(false);
return true;
}
@@ -204,19 +204,25 @@ namespace NewOS
* @param idx the index
* @return the reference to the hardware thread.
*/
- Ref SMPManager::operator[](const SizeT& idx)
+ Ref SMPManager::operator[](const SizeT& idx)
{
if (idx == 0)
{
- if (fThreadList[idx].Leak().Leak().Kind() != kHartSystemReserved)
+ if (fThreadList[idx].Leak().Leak()->Kind() != kHartSystemReserved)
{
- fThreadList[idx].Leak().Leak().fKind = kHartBoot;
+ fThreadList[idx].Leak().Leak()->fKind = kHartBoot;
}
}
else if (idx >= kMaxHarts)
{
- HardwareThread fakeThread;
- fakeThread.fKind = kInvalidHart;
+ static HardwareThread* fakeThread = new HardwareThread();
+
+ if (!fakeThread)
+ {
+ fakeThread = new HardwareThread();
+ }
+
+ fakeThread->fKind = kInvalidHart;
return {fakeThread};
}
--
cgit v1.2.3
From 12126f9eebfa7fc6b2cd6148f13585ff71cf5425 Mon Sep 17 00:00:00 2001
From: Amlal El Mahrouss
Date: Thu, 13 Jun 2024 19:55:30 +0200
Subject: MHR-31: Rework scheduler, remove the concept of user driver and
rings.
Signed-off-by: Amlal El Mahrouss
---
Kernel/HALKit/AMD64/HalKernelMain.cxx | 4 +---
Kernel/KernelKit/ProcessScheduler.hxx | 8 --------
Kernel/Sources/CodeManager.cxx | 4 ++--
Kernel/Sources/KeMain.cxx | 7 ++-----
Kernel/Sources/ProcessScheduler.cxx | 24 ++----------------------
5 files changed, 7 insertions(+), 40 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 6f01734e..7064183b 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -87,13 +87,11 @@ EXTERN_C void hal_init_platform(
NewOS::HAL::Detail::_ke_power_on_self_test();
- auto cLoaderName = "newoskrnl";
+ auto cLoaderName = "LaunchDevil";
NewOS::execute_from_image(KeMain, cLoaderName);
NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
- NewOS::kcout << "newoskrnl: We're done here...\r";
-
while (true)
{}
}
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 8c1971b0..1ac19053 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -164,19 +164,11 @@ namespace NewOS
{
kAppKind = 1,
kShLibKind = 2,
- kDriverKind = 3,
kKindCount,
};
- enum
- {
- kRingUserKind = 3,
- kRingDriverKind = 0,
- };
-
ProcessTime PTime;
PID ProcessId{kSchedInvalidPID};
- Int32 Ring{kRingDriverKind};
Int32 Kind{kAppKind};
public:
diff --git a/Kernel/Sources/CodeManager.cxx b/Kernel/Sources/CodeManager.cxx
index 33121edf..9f374c18 100644
--- a/Kernel/Sources/CodeManager.cxx
+++ b/Kernel/Sources/CodeManager.cxx
@@ -20,11 +20,11 @@ namespace NewOS
return false;
ProcessHeader proc((VoidPtr)main);
- proc.Kind = ProcessHeader::kDriverKind;
+ proc.Kind = ProcessHeader::kAppKind;
rt_copy_memory((VoidPtr)processName, proc.Name, rt_string_len(proc.Name));
Ref refProc = proc;
return ProcessScheduler::The().Leak().Add(refProc);
}
-} // namespace NewOS
\ No newline at end of file
+} // namespace NewOS
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index 60494ee3..9be8a026 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -204,9 +204,7 @@ namespace NewOS::Detail
NewOS::Utils::execute_from_image(stageBoard,
NewOS::ProcessHeader::kAppKind);
- NewOS::kcout << "SystemLauncher: done, sleeping...";
-
- while (true) {}
+ /// TODO: now jump to user mode using the HAL.
}
} // namespace NewOS::Detail
@@ -218,6 +216,5 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void)
/// Now run kernel loop, until no process are running.
NewOS::Detail::FilesystemWizard wizard; // automatic.
- auto cLoaderName = "SystemLauncher";
- NewOS::execute_from_image(NewOS::Detail::SystemLauncher_Main, cLoaderName);
+ NewOS::Detail::SystemLauncher_Main();
}
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 7008eafe..d9d013c6 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -46,11 +46,6 @@ namespace NewOS
kcout.Number(kErrorProcessFault);
kcout << ")\r";
- if (this->Ring != kRingUserKind)
- {
- MUST_PASS(ke_bug_check());
- }
-
this->Exit(kErrorProcessFault);
}
@@ -167,24 +162,8 @@ namespace NewOS
ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId)
ke_stop(RUNTIME_CHECK_PROCESS);
- if (this->Ring == (Int32)ProcessSelector::kRingKernel &&
- ProcessScheduler::The().Leak().GetCurrent().Leak().Ring > 0)
- ke_stop(RUNTIME_CHECK_PROCESS);
-
kLastExitCode = exit_code;
- if (this->Ring != (Int32)ProcessSelector::kRingDriver)
- {
- if (this->HeapPtr)
- rt_free_heap(this->HeapPtr);
-
- this->HeapPtr = nullptr;
- this->HeapCursor = nullptr;
-
- this->FreeMemory = 0UL;
- this->UsedMemory = 0UL;
- }
-
//! Delete image if not done already.
if (this->Image)
ke_delete_ke_heap(this->Image);
@@ -352,7 +331,8 @@ namespace NewOS
auto& processRef = ProcessScheduler::The().Leak();
SizeT ret = processRef.Run();
- kcout << "newoskrnl: Iterated over: " << number(ret);
+ kcout << "newoskrnl: Iterated over: ";
+ kcout.Number(ret);
kcout << " processes.\r";
return true;
--
cgit v1.2.3
From 67a14f5c12510e277911cbcf8ea5ce01f8b8fbb1 Mon Sep 17 00:00:00 2001
From: amlal
Date: Thu, 13 Jun 2024 22:02:27 +0200
Subject: MHR-31: Detect all types of cores except the boot one.
Signed-off-by: amlal
---
Boot/NetBoot/NetBoot.hxx | 7 +++---
Boot/Sources/HEL/AMD64/BootMain.cxx | 10 ++++----
Boot/makefile | 2 +-
DDK/KernelCall.c | 5 ++--
DDK/KernelStd.h | 10 ++++----
Kernel/ArchKit/ArchKit.hpp | 4 ++--
Kernel/FirmwareKit/EFI/API.hxx | 4 ++--
Kernel/FirmwareKit/EPM.hxx | 8 +++----
.../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 3 +--
.../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 27 ++++++++++++++--------
Kernel/HALKit/AMD64/HalKernelMain.cxx | 7 +++---
Kernel/HALKit/AMD64/PCI/Iterator.cxx | 2 +-
Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp | 2 +-
Kernel/KernelKit/DriveManager.hxx | 6 ++---
Kernel/KernelKit/FileManager.hpp | 2 +-
Kernel/KernelKit/Framebuffer.hpp | 2 +-
Kernel/KernelKit/KernelHeap.hpp | 8 +++----
Kernel/KernelKit/ProcessScheduler.hxx | 8 +++----
Kernel/KernelKit/SMPManager.hpp | 4 ++--
Kernel/KernelKit/XCOFF.hxx | 11 +++++----
Kernel/NetworkKit/IPCEP.hxx | 4 ++--
Kernel/NewKit/Array.hpp | 1 -
Kernel/NewKit/MutableArray.hpp | 4 ++--
Kernel/Sources/HError.cxx | 2 +-
Kernel/Sources/KeMain.cxx | 6 ++---
Kernel/Sources/KernelHeap.cxx | 4 ++--
Kernel/Sources/SMPManager.cxx | 6 ++---
Kernel/Sources/UserHeap.cxx | 8 +++----
Usr/Sys/CoreSystem/Headers/Defines.h | 19 ++++++++-------
Usr/Sys/CoreSystem/Headers/File.h | 2 +-
Usr/Sys/CoreSystem/Headers/Intl.h | 6 ++---
Usr/Sys/CoreSystem/Headers/Transport.h | 6 ++---
Usr/Sys/CoreSystem/Sources/CRTStartup.c | 2 +-
Usr/Sys/CoreSystem/Sources/File.c | 18 +++++++--------
34 files changed, 113 insertions(+), 107 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Boot/NetBoot/NetBoot.hxx b/Boot/NetBoot/NetBoot.hxx
index ccb43290..e3119c5f 100644
--- a/Boot/NetBoot/NetBoot.hxx
+++ b/Boot/NetBoot/NetBoot.hxx
@@ -19,9 +19,8 @@ typedef struct NetBootInternetHeader
CharacterTypeUTF8 NB3; /// magic char 3 'T'
CharacterTypeUTF8 NB4; /// magic char 4 'B'
- CharacterTypeUTF8 PatchName[255]; /// example: ColdChoco
- NewOS::Int32 PatchLength; /// the patch length.
+ CharacterTypeUTF8 PatchName[255]; /// example: ColdChoco
+ NewOS::Int32 PatchLength; /// the patch length.
CharacterTypeUTF8 PatchTarget[255]; /// the target file.
- NewOS::Boolean ImpliesROM; /// does it implies EEPROM patching?
+ NewOS::Boolean ImpliesROM; /// does it implies EEPROM patching?
} NetBootInternetHeader;
-
diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx
index 5ab7914a..fab212ee 100644
--- a/Boot/Sources/HEL/AMD64/BootMain.cxx
+++ b/Boot/Sources/HEL/AMD64/BootMain.cxx
@@ -81,8 +81,8 @@ STATIC Bool CheckBootDevice(BootDeviceATA& ataDev)
EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
EfiSystemTable* SystemTable)
{
- InitEFI(SystemTable); ///! Init the EFI library.
- InitVideoFB(); ///! Init the GOP.
+ InitEFI(SystemTable); ///! Init the EFI library.
+ InitVideoFB(); ///! Init the GOP.
BTextWriter writer;
@@ -146,13 +146,13 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle,
GXInit();
GXDraw(RGB(9d, 9d, 9d), handoverHdrPtr->f_GOP.f_Height,
- handoverHdrPtr->f_GOP.f_Width, 0, 0);
+ handoverHdrPtr->f_GOP.f_Width, 0, 0);
GXFini();
GXDrawImg(NewBoot, NEWBOOT_HEIGHT, NEWBOOT_WIDTH,
- (handoverHdrPtr->f_GOP.f_Width - NEWBOOT_WIDTH) / 2,
- (handoverHdrPtr->f_GOP.f_Height - NEWBOOT_HEIGHT) / 2);
+ (handoverHdrPtr->f_GOP.f_Width - NEWBOOT_WIDTH) / 2,
+ (handoverHdrPtr->f_GOP.f_Height - NEWBOOT_HEIGHT) / 2);
GXFini();
diff --git a/Boot/makefile b/Boot/makefile
index 4bee19a2..e54b1aa8 100644
--- a/Boot/makefile
+++ b/Boot/makefile
@@ -26,7 +26,7 @@ BIOS=OVMF.fd
IMG=epm.img
IMG_2=epm-slave.img
-EMU_FLAGS=-net none -smp 4 -serial stdio -m 4G -M q35 \
+EMU_FLAGS=-net none -smp 4 -m 4G -M q35 \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
diff --git a/DDK/KernelCall.c b/DDK/KernelCall.c
index a16a5278..7dc5761c 100644
--- a/DDK/KernelCall.c
+++ b/DDK/KernelCall.c
@@ -9,13 +9,14 @@
#include
#include
+/// @brief this is an internal call, do not use it.
DK_EXTERN __attribute__((naked)) void* __kernelDispatchCall(const char* name, int32_t cnt, void* data, size_t sz);
/// @brief Execute a function on the kernel.
/// @param kernelRpcName the name of the function.
/// @param cnt number of arguments.
-/// @param
-/// @return
+/// @param
+/// @return
DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* data, size_t sz)
{
if (!kernelRpcName || cnt == 0)
diff --git a/DDK/KernelStd.h b/DDK/KernelStd.h
index 63df4c2a..0486479c 100644
--- a/DDK/KernelStd.h
+++ b/DDK/KernelStd.h
@@ -20,9 +20,9 @@
#include
/// @brief Call kernel (interrupt 0x33)
-/// @param kernelRpcName
-/// @param cnt
-/// @param dat
-/// @param sz
-/// @return
+/// @param kernelRpcName
+/// @param cnt
+/// @param dat
+/// @param sz
+/// @return
DK_EXTERN void* kernelCall(const char* kernelRpcName, int32_t cnt, void* dat, size_t sz);
diff --git a/Kernel/ArchKit/ArchKit.hpp b/Kernel/ArchKit/ArchKit.hpp
index 6407a0d8..c889c93c 100644
--- a/Kernel/ArchKit/ArchKit.hpp
+++ b/Kernel/ArchKit/ArchKit.hpp
@@ -83,8 +83,8 @@ typedef NewOS::Void (*rt_syscall_proc)(NewOS::VoidPtr);
struct RTSyscallInfoHdr final
{
- NewOS::Int64 fHash;
- NewOS::Bool fHooked;
+ NewOS::Int64 fHash;
+ NewOS::Bool fHooked;
rt_syscall_proc fProc;
};
diff --git a/Kernel/FirmwareKit/EFI/API.hxx b/Kernel/FirmwareKit/EFI/API.hxx
index c6d02a3e..0f7da5a4 100644
--- a/Kernel/FirmwareKit/EFI/API.hxx
+++ b/Kernel/FirmwareKit/EFI/API.hxx
@@ -92,8 +92,8 @@ Bascially frees everything we have in the EFI side.
GXInit();
GXDrawImg(NewBootFatal, NEWBOOTFATAL_HEIGHT, NEWBOOTFATAL_WIDTH,
- (kHandoverHeader->f_GOP.f_Width - NEWBOOTFATAL_WIDTH) / 2,
- (kHandoverHeader->f_GOP.f_Height - NEWBOOTFATAL_HEIGHT) / 2);
+ (kHandoverHeader->f_GOP.f_Width - NEWBOOTFATAL_WIDTH) / 2,
+ (kHandoverHeader->f_GOP.f_Height - NEWBOOTFATAL_HEIGHT) / 2);
GXFini();
diff --git a/Kernel/FirmwareKit/EPM.hxx b/Kernel/FirmwareKit/EPM.hxx
index 7c4b37b6..93f4730e 100644
--- a/Kernel/FirmwareKit/EPM.hxx
+++ b/Kernel/FirmwareKit/EPM.hxx
@@ -117,16 +117,16 @@ typedef struct PartitionBlock PartitionBlockType;
///! @brief partition must start at this address.
///! Anything below is reserved for Data backup by the Main OS.
-#define kEPMStartPartitionBlk (sizeof(BootBlock))
+#define kEPMStartPartitionBlk (sizeof(BootBlock))
///! @brief Current EPM revision (2)
-#define kEPMRevision (3)
+#define kEPMRevision (3)
///! @brief Current EPM revision (2)
-#define kEPMRevisionUEFI (0xF)
+#define kEPMRevisionUEFI (0xF)
/* @brief Maximum block count. */
-#define kEPMMaxBlks (128)
+#define kEPMMaxBlks (128)
/// END OF SPECS
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
index 51570b86..e9c0941c 100644
--- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
@@ -82,8 +82,7 @@ EXTERN_C NewOS::Void hal_system_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rd
/// @brief Enter kernel call from assembly (DDK only).
/// @param stack the stack pushed from assembly routine.
/// @return nothing.
-EXTERN_C NewOS::Void hal_kernel_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx,
- NewOS::UIntPtr r8, NewOS::UIntPtr r9)
+EXTERN_C NewOS::Void hal_kernel_call_enter(NewOS::UIntPtr rcx, NewOS::UIntPtr rdx, NewOS::UIntPtr r8, NewOS::UIntPtr r9)
{
if (rcx != 0)
{
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index c15a7b55..37a681ab 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -113,10 +113,16 @@ namespace NewOS::HAL
///////////////////////////////////////////////////////////////////////////////////////
- STATIC MadtType* kApicInfoBlock = nullptr;
- STATIC UIntPtr kApicMadtAddresses[255] = {0};
- STATIC SizeT kApicMadtAddressesCount = 0UL;
- STATIC UIntPtr cBaseAddressAPIC = 0xFEE00000;
+ STATIC MadtType* kApicInfoBlock = nullptr;
+
+ STATIC struct
+ {
+ UIntPtr fAddress{0};
+ UInt32 fKind{0};
+ } kApicMadtAddresses[255] = {};
+
+ STATIC SizeT kApicMadtAddressesCount = 0UL;
+ STATIC UIntPtr cBaseAddressAPIC = 0xFEE00000;
/// @brief this will help us schedule our cores.
STATIC Boolean* cProgramInitialized = nullptr;
@@ -156,7 +162,6 @@ namespace NewOS::HAL
EXTERN_C Void hal_apic_acknowledge_cont(Void)
{
- ProcessHelper::StartScheduling();
_hal_spin_core();
}
@@ -202,21 +207,23 @@ namespace NewOS::HAL
if (kApicMadt != nullptr)
{
- MadtType* madt = (MadtType*)kApicMadt;
+ MadtType* madt = reinterpret_cast(kApicMadt);
constexpr auto cMaxProbableCores = 4; // the amount of cores we want.
constexpr auto cStartAt = 0; // start here to avoid boot core.
for (SizeT coreAt = cStartAt; coreAt < cMaxProbableCores; ++coreAt)
{
- if (madt->MadtRecords[coreAt].Flags == kThreadLAPIC) // if local apic.
+ if (madt->MadtRecords[coreAt].Flags != kThreadBoot) // if local apic.
{
MadtType::MadtAddress& madtRecord = madt->MadtRecords[coreAt];
// then register as a core for scheduler.
- kcout << "newoskrnl: register core as scheduler thread.\r";
+ kcout << "newoskrnl: Register Local APIC.\r";
+
+ kApicMadtAddresses[kApicMadtAddressesCount].fAddress = madtRecord.Address;
+ kApicMadtAddresses[kApicMadtAddressesCount].fKind = madt->MadtRecords[coreAt].Flags;
- kApicMadtAddresses[kApicMadtAddressesCount] = madtRecord.Address;
++kApicMadtAddressesCount;
}
}
@@ -241,7 +248,7 @@ namespace NewOS::HAL
cProgramInitialized = new Boolean(true);
constexpr auto cWhereToInterrupt = 0x40;
- constexpr auto cWhatCore = 1;
+ constexpr auto cWhatCore = 1;
hal_send_start_ipi(cWhatCore, cWhereToInterrupt, cBaseAddressAPIC);
}
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 7064183b..9b605e1a 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -79,8 +79,8 @@ EXTERN_C void hal_init_platform(
constexpr auto cDummyInterrupt = 0x10; // 16
kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void {
- const char* msg = (const char*)sf;
- NewOS::kcout << "newoskrnl: " << msg << "\r";
+ const char* msg = (const char*)sf;
+ NewOS::kcout << "newoskrnl: " << msg << "\r";
};
kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true;
@@ -93,5 +93,6 @@ EXTERN_C void hal_init_platform(
NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
while (true)
- {}
+ {
+ }
}
diff --git a/Kernel/HALKit/AMD64/PCI/Iterator.cxx b/Kernel/HALKit/AMD64/PCI/Iterator.cxx
index 297aa89c..d3167b46 100644
--- a/Kernel/HALKit/AMD64/PCI/Iterator.cxx
+++ b/Kernel/HALKit/AMD64/PCI/Iterator.cxx
@@ -7,7 +7,7 @@
#include
#define PCI_ITERATOR_FIND_AND_UNWRAP(DEV, SZ) \
- if (DEV.Leak().Leak()) \
+ if (DEV.Leak().Leak()) \
return *DEV.Leak().Leak();
namespace NewOS::PCI
diff --git a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp
index 3217a660..f308b0b5 100644
--- a/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp
+++ b/Kernel/HALKit/AXP/CoreSyscallHandlerDEC.cpp
@@ -8,7 +8,7 @@
#include
/// @brief Internal call for syscall, to work with C++.
-/// @param stack
+/// @param stack
/// @return nothing.
EXTERN_C void rt_syscall_handle(NewOS::HAL::StackFrame* stack)
{
diff --git a/Kernel/KernelKit/DriveManager.hxx b/Kernel/KernelKit/DriveManager.hxx
index e78c350e..df7d5f28 100644
--- a/Kernel/KernelKit/DriveManager.hxx
+++ b/Kernel/KernelKit/DriveManager.hxx
@@ -14,10 +14,10 @@
#include
#include
-#define kDriveManagerCount (4U)
+#define kDriveManagerCount (4U)
-#define kDriveInvalidID (-1)
-#define kDriveNameLen (32)
+#define kDriveInvalidID (-1)
+#define kDriveNameLen (32)
namespace NewOS
{
diff --git a/Kernel/KernelKit/FileManager.hpp b/Kernel/KernelKit/FileManager.hpp
index 71f3cfd0..b06b926e 100644
--- a/Kernel/KernelKit/FileManager.hpp
+++ b/Kernel/KernelKit/FileManager.hpp
@@ -134,7 +134,7 @@ namespace NewOS
void SetDataFork(const char* forkName);
/// @brief Get internal parser.
- /// @return
+ /// @return
NewFSParser* GetParser() noexcept;
private:
diff --git a/Kernel/KernelKit/Framebuffer.hpp b/Kernel/KernelKit/Framebuffer.hpp
index 3437fed1..ebe983c8 100644
--- a/Kernel/KernelKit/Framebuffer.hpp
+++ b/Kernel/KernelKit/Framebuffer.hpp
@@ -39,7 +39,7 @@ namespace NewOS
: fFrameBufferAddr(addr)
{
}
-
+
~Framebuffer()
{
}
diff --git a/Kernel/KernelKit/KernelHeap.hpp b/Kernel/KernelKit/KernelHeap.hpp
index 7b8cbc7c..6be94a63 100644
--- a/Kernel/KernelKit/KernelHeap.hpp
+++ b/Kernel/KernelKit/KernelHeap.hpp
@@ -37,8 +37,8 @@ namespace NewOS
/// @return if it valid: point has crc now., otherwise fail.
Boolean ke_protect_ke_heap(VoidPtr heapPtr);
- /// @brief Makes a kernel heap page.
- /// @param heapPtr
- /// @return
- Int32 ke_make_ke_page(VoidPtr heapPtr);
+ /// @brief Makes a kernel heap page.
+ /// @param heapPtr
+ /// @return
+ Int32 ke_make_ke_page(VoidPtr heapPtr);
} // namespace NewOS
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 1ac19053..637fc8c4 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -162,8 +162,8 @@ namespace NewOS
enum
{
- kAppKind = 1,
- kShLibKind = 2,
+ kAppKind = 1,
+ kShLibKind = 2,
kKindCount,
};
@@ -231,14 +231,14 @@ namespace NewOS
/// The main class which you call to schedule an app.
class ProcessScheduler final
{
- explicit ProcessScheduler() = default;
+ explicit ProcessScheduler() = default;
public:
~ProcessScheduler() = default;
NEWOS_COPY_DEFAULT(ProcessScheduler)
- operator bool();
+ operator bool();
bool operator!();
public:
diff --git a/Kernel/KernelKit/SMPManager.hpp b/Kernel/KernelKit/SMPManager.hpp
index ba706cf6..1840dd20 100644
--- a/Kernel/KernelKit/SMPManager.hpp
+++ b/Kernel/KernelKit/SMPManager.hpp
@@ -99,8 +99,8 @@ namespace NewOS
public:
Ref operator[](const SizeT& idx);
- bool operator!() noexcept;
- operator bool() noexcept;
+ bool operator!() noexcept;
+ operator bool() noexcept;
public:
/// @brief Shared instance of the SMP Manager.
diff --git a/Kernel/KernelKit/XCOFF.hxx b/Kernel/KernelKit/XCOFF.hxx
index 4574fcf7..0d74b3ef 100644
--- a/Kernel/KernelKit/XCOFF.hxx
+++ b/Kernel/KernelKit/XCOFF.hxx
@@ -16,7 +16,7 @@
#include
-#define cXCOFF64Magic (0x01F7)
+#define cXCOFF64Magic (0x01F7)
#define cXCOFFRelFlg (0x0001)
#define cXCOFFExecutable (0x0002)
@@ -41,10 +41,11 @@ typedef struct XCoffFileHeader
#define cForkNameLen (255)
/// @brief This the executable manifest fork.
-typedef struct XCoffForkHeader {
- NewOS::Char fPropertiesXMLFork[cForkNameLen];
- NewOS::Char fDynamicLoaderFork[cForkNameLen];
- NewOS::Char fCodeSignFork[cForkNameLen];
+typedef struct XCoffForkHeader
+{
+ NewOS::Char fPropertiesXMLFork[cForkNameLen];
+ NewOS::Char fDynamicLoaderFork[cForkNameLen];
+ NewOS::Char fCodeSignFork[cForkNameLen];
} XCoffForkHeader;
#endif // ifndef __XCOFF__
diff --git a/Kernel/NetworkKit/IPCEP.hxx b/Kernel/NetworkKit/IPCEP.hxx
index a00fa98e..72efae73 100644
--- a/Kernel/NetworkKit/IPCEP.hxx
+++ b/Kernel/NetworkKit/IPCEP.hxx
@@ -50,8 +50,8 @@ namespace NewOS
IPCEPAddressType IpcFrom;
IPCEPAddressType IpcTo;
UInt32 IpcCRC32;
- UInt32 IpcMsg;
- UInt32 IpcMsgSz;
+ UInt32 IpcMsg;
+ UInt32 IpcMsgSz;
} PACKED IPCEPConnectionHeader;
} // namespace NewOS
diff --git a/Kernel/NewKit/Array.hpp b/Kernel/NewKit/Array.hpp
index dca5c13f..b0b94584 100644
--- a/Kernel/NewKit/Array.hpp
+++ b/Kernel/NewKit/Array.hpp
@@ -26,7 +26,6 @@ namespace NewOS
if (At > N)
return {};
- kcout << "Returning element\r";
return ErrorOr(&fArray[At]);
}
diff --git a/Kernel/NewKit/MutableArray.hpp b/Kernel/NewKit/MutableArray.hpp
index a3ad4cb1..6be9c15e 100644
--- a/Kernel/NewKit/MutableArray.hpp
+++ b/Kernel/NewKit/MutableArray.hpp
@@ -173,8 +173,8 @@ namespace NewOS
if (!iterationNode)
{
- fFirstNode = new MutableLinkedList();
- iterationNode = fFirstNode;
+ fFirstNode = new MutableLinkedList();
+ iterationNode = fFirstNode;
}
MUST_PASS(iterationNode);
diff --git a/Kernel/Sources/HError.cxx b/Kernel/Sources/HError.cxx
index 1f36d020..5ba02049 100644
--- a/Kernel/Sources/HError.cxx
+++ b/Kernel/Sources/HError.cxx
@@ -13,7 +13,7 @@ namespace NewOS
/// @return if error-free: true, otherwise false.
Boolean ke_bug_check(void) noexcept
{
- /// TODO:
+ /// TODO:
return false;
}
} // namespace NewOS
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index 9be8a026..58c76dc4 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -68,7 +68,7 @@ namespace NewOS::Detail
}
catalogDir = fNewFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0,
- kNewFSCatalogKindDir);
+ kNewFSCatalogKindDir);
NewFork theFork{0};
@@ -157,8 +157,8 @@ namespace NewOS::Detail
fNewFS->GetParser()->CreateFork(catalogDisk, theDiskFork);
fNewFS->GetParser()->WriteCatalog(catalogDisk,
- (NewOS::VoidPtr)diskFolder.CData(),
- kNewFSSectorSz, cSrcName);
+ (NewOS::VoidPtr)diskFolder.CData(),
+ kNewFSSectorSz, cSrcName);
delete catalogDisk;
}
diff --git a/Kernel/Sources/KernelHeap.cxx b/Kernel/Sources/KernelHeap.cxx
index 00dfce8c..c3e8e86b 100644
--- a/Kernel/Sources/KernelHeap.cxx
+++ b/Kernel/Sources/KernelHeap.cxx
@@ -76,8 +76,8 @@ namespace NewOS
}
/// @brief Makes a page heap.
- /// @param heapPtr
- /// @return
+ /// @param heapPtr
+ /// @return
Int32 ke_make_ke_page(VoidPtr heapPtr)
{
if (kHeapCount < 1)
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index 683343ff..5002e880 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -110,8 +110,8 @@ namespace NewOS
fStack->R11 = stack->R11;
fStack->R10 = stack->R10;
- fStack->R9 = stack->R9;
- fStack->R8 = stack->R8;
+ fStack->R9 = stack->R9;
+ fStack->R8 = stack->R8;
fStack->Rcx = this->fID;
}
@@ -219,7 +219,7 @@ namespace NewOS
if (!fakeThread)
{
- fakeThread = new HardwareThread();
+ fakeThread = new HardwareThread();
}
fakeThread->fKind = kInvalidHart;
diff --git a/Kernel/Sources/UserHeap.cxx b/Kernel/Sources/UserHeap.cxx
index ad3c4aa4..d1de13a6 100644
--- a/Kernel/Sources/UserHeap.cxx
+++ b/Kernel/Sources/UserHeap.cxx
@@ -37,8 +37,8 @@ namespace NewOS
*/
class UserHeapManager final
{
- UserHeapManager() = delete;
-
+ UserHeapManager() = delete;
+
public:
~UserHeapManager() = default;
@@ -47,12 +47,12 @@ namespace NewOS
{
return s_NumPools;
}
-
+
STATIC Ref& Leak()
{
return s_Pmm;
}
-
+
STATIC Boolean& IsEnabled()
{
return s_PoolsAreEnabled;
diff --git a/Usr/Sys/CoreSystem/Headers/Defines.h b/Usr/Sys/CoreSystem/Headers/Defines.h
index 2c04c3f1..f659fa76 100644
--- a/Usr/Sys/CoreSystem/Headers/Defines.h
+++ b/Usr/Sys/CoreSystem/Headers/Defines.h
@@ -11,12 +11,12 @@
#endif
#ifdef _DEBUG
-#define CS_MUST_PASS(e) \
- { \
- if (!e) \
- { \
+#define CS_MUST_PASS(e) \
+ { \
+ if (!e) \
+ { \
UiAlert("Assertion failed.\nExpression :%s\nFile: %s\nLine: %i", #e, __FILE__, __LINE__) RtAssertTriggerInterrupt() \
- } \
+ } \
}
#else
#define CS_MUST_PASS(e) CS_UNREFERENCED_PARAMETER(e)
@@ -124,7 +124,7 @@ typedef CharacterTypeUTF8 BooleanType;
#define CS_CONSTEXPR
#endif // __cplusplus
-enum
+enum
{
kCallAllocPtr = 1,
kCallFreePtr,
@@ -173,8 +173,7 @@ typedef struct ApplicationInterface
{
VoidType (*Release)(struct ApplicationInterface* Self, DWordType ExitCode);
IntPtrType (*Invoke)(struct ApplicationInterface* Self, DWordType Sel, ...);
- VoidType (*Query)(struct ApplicationInterface* Self, PtrVoidType* Dst,
- SizeType SzDst, struct GUID* GuidOf);
+ VoidType (*Query)(struct ApplicationInterface* Self, PtrVoidType* Dst, SizeType SzDst, struct GUID* GuidOf);
} ApplicationInterface, *ApplicationInterfaceRef;
#ifdef __cplusplus
@@ -214,12 +213,12 @@ CS_EXTERN_C ApplicationInterfaceRef RtGetAppPointer(VoidType);
/// @brief Get argument count
/// @param
/// @return
-CS_EXTERN_C SizeType RtGetAppArgumentsCount(VoidType);
+CS_EXTERN_C SizeType RtGetAppArgumentsCount(VoidType);
/// @brief Get argument pointer.
/// @param
/// @return
-CS_EXTERN_C CharacterTypeUTF8** RtGetAppArgumentsPtr(VoidType);
+CS_EXTERN_C CharacterTypeUTF8** RtGetAppArgumentsPtr(VoidType);
/// @brief Shared application interface.
CS_EXTERN_C ApplicationInterfaceRef kSharedApplication;
diff --git a/Usr/Sys/CoreSystem/Headers/File.h b/Usr/Sys/CoreSystem/Headers/File.h
index 66bc6549..12dfb033 100644
--- a/Usr/Sys/CoreSystem/Headers/File.h
+++ b/Usr/Sys/CoreSystem/Headers/File.h
@@ -51,7 +51,7 @@ CS_EXTERN_C BooleanType CSIsValidPath(const CharacterTypeUTF8* path);
/// @brief Flush file
/// @param refCS the file reference.
-/// @return
+/// @return
CS_EXTERN_C VoidType CSFlushFile(FSRef refCS);
/// END OF FILE
diff --git a/Usr/Sys/CoreSystem/Headers/Intl.h b/Usr/Sys/CoreSystem/Headers/Intl.h
index c9eae306..afc7431c 100644
--- a/Usr/Sys/CoreSystem/Headers/Intl.h
+++ b/Usr/Sys/CoreSystem/Headers/Intl.h
@@ -14,12 +14,12 @@ typedef UInt64Type IntlRef;
/// @brief Get app locale.
/// @param name locale name.
-/// @return
-IntlRef IntlGetLocale(const char* name);
+/// @return
+IntlRef IntlGetLocale(const char* name);
/// @brief Set app locale.
/// @param intl the locale
-/// @return
+/// @return
BooleanType IntlSetLocale(const IntlRef intl);
/// @brief locale helpers.
diff --git a/Usr/Sys/CoreSystem/Headers/Transport.h b/Usr/Sys/CoreSystem/Headers/Transport.h
index 671621c8..996e69cc 100644
--- a/Usr/Sys/CoreSystem/Headers/Transport.h
+++ b/Usr/Sys/CoreSystem/Headers/Transport.h
@@ -28,19 +28,19 @@ CS_EXTERN_C CS_CONST TptStreamType CSOpenSocket(UInt32Type afType, UInt32Type so
/// @brief Close a STREAMS socket.
/// @param streams The streams socket.
-/// @return
+/// @return
CS_EXTERN_C VoidType CSCloseSocket(CS_CONST TptStreamType streams);
/// @brief Get OpenTransport version.
/// @param void
-/// @return
+/// @return
CS_EXTERN_C CS_CONST Int32Type CSGetVersion(VoidType);
enum
{
TrSocketProtoTCP, /// TCP socket
TrSocketProtoUDP, /// UDP socket
- TrSocketProtoUN, /// IPC socket
+ TrSocketProtoUN, /// IPC socket
TrSocketProtoRaw, /// Raw socket
TrSocketProtoCount,
};
diff --git a/Usr/Sys/CoreSystem/Sources/CRTStartup.c b/Usr/Sys/CoreSystem/Sources/CRTStartup.c
index faefe9b7..2dc9b1c4 100644
--- a/Usr/Sys/CoreSystem/Sources/CRTStartup.c
+++ b/Usr/Sys/CoreSystem/Sources/CRTStartup.c
@@ -8,5 +8,5 @@
VoidType __DllMainCRTStartup(VoidType)
{
- kSharedApplication = RtGetAppPointer();
+ kSharedApplication = RtGetAppPointer();
}
\ No newline at end of file
diff --git a/Usr/Sys/CoreSystem/Sources/File.c b/Usr/Sys/CoreSystem/Sources/File.c
index 9f6b3b35..2e34d782 100644
--- a/Usr/Sys/CoreSystem/Sources/File.c
+++ b/Usr/Sys/CoreSystem/Sources/File.c
@@ -19,7 +19,7 @@ enum FileOp
/// @brief Opens a new file.
/// @param path where to find it.
/// @param rest the restrict (rw, rwe, r+, w+, r, w)
-/// @return FSRef the file.
+/// @return FSRef file reference.
CS_EXTERN_C FSRef CSOpenFile(const CharacterTypeUTF8* path,
const CharacterTypeUTF8* rest)
{
@@ -33,7 +33,7 @@ CS_EXTERN_C FSRef CSOpenFile(const CharacterTypeUTF8* path,
/// @brief Closes the file and flushes it to the said file.
/// @param refCS the filesystem reference.
-/// @return
+/// @return void
CS_EXTERN_C VoidType CSCloseFile(FSRef refCS)
{
CS_MUST_PASS(kSharedApplication);
@@ -45,7 +45,7 @@ CS_EXTERN_C VoidType CSCloseFile(FSRef refCS)
/// @brief Flush file
/// @param refCS the file reference.
-/// @return
+/// @return void
CS_EXTERN_C VoidType CSFlushFile(FSRef refCS)
{
CS_MUST_PASS(kSharedApplication);
@@ -54,16 +54,16 @@ CS_EXTERN_C VoidType CSFlushFile(FSRef refCS)
}
/// @brief Check if filesystem path is valid.
-/// @param path
-/// @return
+/// @param path the filesystem path.
+/// @return if the path is valid or not.
CS_EXTERN_C BooleanType CSIsValidPath(const CharacterTypeUTF8* path)
{
CS_MUST_PASS(kSharedApplication);
CS_MUST_PASS(path);
return kSharedApplication->Invoke(kSharedApplication, kCallFileExists, path) ||
- kSharedApplication->Invoke(kSharedApplication, kCallDirectoryExists, path) ||
- kSharedApplication->Invoke(kSharedApplication, kCallSymlinkExists, path) ||
- kSharedApplication->Invoke(kSharedApplication, kCallDriveExists, path) ||
- kSharedApplication->Invoke(kSharedApplication, kCallDeviceExists, path);
+ kSharedApplication->Invoke(kSharedApplication, kCallDirectoryExists, path) ||
+ kSharedApplication->Invoke(kSharedApplication, kCallSymlinkExists, path) ||
+ kSharedApplication->Invoke(kSharedApplication, kCallDriveExists, path) ||
+ kSharedApplication->Invoke(kSharedApplication, kCallDeviceExists, path);
}
\ No newline at end of file
--
cgit v1.2.3
From dd7b72379108c10cd68853d2a8a0332784ebb8cb Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Fri, 14 Jun 2024 09:58:11 +0200
Subject: Kernel: Scheduler: ProcessHeader::New: do not get the pointer before
allocating it!
Kernel: HAL: AMD64: Two things.
- Switching to an ARM HAL for our Zeta platform.
- Fix return register when sending acknowledge on APIC, which was using
the 32-bit eax instead of rax.
Kernel: Boot: Update uname for Windows.
Kernel: GDT: move as global (HalKenelMain.cxx)
Signed-off-by: Amlal EL Mahrouss
---
Boot/makefile | 6 +++--
Kernel/HALKit/AMD64/HalInterruptAPI.asm | 4 +--
Kernel/HALKit/AMD64/HalKernelMain.cxx | 37 +++++++++++++--------------
Kernel/Sources/KeMain.cxx | 11 ++++++--
Kernel/Sources/ProcessScheduler.cxx | 45 ++++++++++++++++++---------------
5 files changed, 56 insertions(+), 47 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Boot/makefile b/Boot/makefile
index e54b1aa8..98726bbe 100644
--- a/Boot/makefile
+++ b/Boot/makefile
@@ -12,10 +12,12 @@ ADD_FILE=touch
COPY=cp
HTTP_GET=wget
-ifneq ($(shell uname), Windows_NT)
+# Select this for UNIX distributions
+ifneq ($(shell uname), CYGWIN_NT-10.0-19045)
EMU=qemu-system-x86_64
else
-EMU=qemu-system-x86_64w
+# this for NT distributions
+EMU=qemu-system-x86_64w.exe
endif
ifeq ($(NEWS_MODEL), )
diff --git a/Kernel/HALKit/AMD64/HalInterruptAPI.asm b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
index 150cfc10..4832ecf3 100644
--- a/Kernel/HALKit/AMD64/HalInterruptAPI.asm
+++ b/Kernel/HALKit/AMD64/HalInterruptAPI.asm
@@ -157,10 +157,10 @@ __NEW_INT_32:
pop rcx
pop rax
- mov eax, 0
+ mov rax, 0
;; tell there local apic that we're done.
- mov dword [0xFEE00000 + 0xB0], eax ; LAPIC_EOI
+ mov [0xFEE00000 + 0xB0], rax ; LAPIC_EOI
iretq
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 9b605e1a..cafa6388 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -28,9 +28,21 @@ namespace NewOS::HAL
extern void hal_system_get_cores(NewOS::voidPtr rsdPtr);
} // namespace NewOS::HAL
+/* GDT constant. */
+STATIC NewOS::HAL::Detail::NewOSGDT cGdt = {
+ {0, 0, 0, 0x00, 0x00, 0}, // null entry
+ {0, 0, 0, 0x9a, 0xaf, 0}, // kernel code
+ {0, 0, 0, 0x92, 0xaf, 0}, // kernel data
+ {0, 0, 0, 0x00, 0x00, 0}, // null entry
+ {0, 0, 0, 0x9a, 0xaf, 0}, // user code
+ {0, 0, 0, 0x92, 0xaf, 0}, // user data
+};
+
EXTERN_C void hal_init_platform(
NewOS::HEL::HandoverInformationHeader* HandoverHeader)
{
+ /* Setup globals. */
+
kHandoverHeader = HandoverHeader;
if (kHandoverHeader->f_Magic != kHandoverMagic &&
@@ -39,29 +51,17 @@ EXTERN_C void hal_init_platform(
return;
}
- /// Setup kernel globals.
kKernelVirtualSize = HandoverHeader->f_VirtualSize;
kKernelVirtualStart = reinterpret_cast(
reinterpret_cast(HandoverHeader->f_VirtualStart) + kVirtualAddressStartOffset);
kKernelPhysicalStart = HandoverHeader->f_PhysicalStart;
- STATIC NewOS::HAL::Detail::NewOSGDT GDT = {
- {0, 0, 0, 0x00, 0x00, 0}, // null entry
- {0, 0, 0, 0x9a, 0xaf, 0}, // kernel code
- {0, 0, 0, 0x92, 0xaf, 0}, // kernel data
- {0, 0, 0, 0x00, 0x00, 0}, // null entry
- {0, 0, 0, 0x9a, 0xaf, 0}, // user code
- {0, 0, 0, 0x92, 0xaf, 0}, // user data
- };
-
NewOS::HAL::RegisterGDT gdtBase;
- gdtBase.Base = reinterpret_cast(&GDT);
+ gdtBase.Base = reinterpret_cast(&cGdt);
gdtBase.Limit = sizeof(NewOS::HAL::Detail::NewOSGDT) - 1;
- /// Load GDT.
-
NewOS::HAL::GDTLoader gdt;
gdt.Load(gdtBase);
@@ -74,7 +74,7 @@ EXTERN_C void hal_init_platform(
NewOS::HAL::IDTLoader idt;
idt.Load(idtBase);
- /// START POST
+ /* install basic hooks. */
constexpr auto cDummyInterrupt = 0x10; // 16
@@ -87,12 +87,9 @@ EXTERN_C void hal_init_platform(
NewOS::HAL::Detail::_ke_power_on_self_test();
- auto cLoaderName = "LaunchDevil";
- NewOS::execute_from_image(KeMain, cLoaderName);
+ /* Call generic kernel entrypoint. */
- NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
+ KeMain();
- while (true)
- {
- }
+ NewOS::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index 58c76dc4..23e32c1d 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -203,8 +203,6 @@ namespace NewOS::Detail
NewOS::Utils::execute_from_image(stageBoard,
NewOS::ProcessHeader::kAppKind);
-
- /// TODO: now jump to user mode using the HAL.
}
} // namespace NewOS::Detail
@@ -217,4 +215,13 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void)
NewOS::Detail::FilesystemWizard wizard; // automatic.
NewOS::Detail::SystemLauncher_Main();
+
+ // fetch system cores.
+ NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
+
+ while (true)
+ {
+ // start scheduling.
+ NewOS::ProcessHelper::StartScheduling();
+ }
}
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index d9d013c6..dc273cf6 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -59,18 +59,20 @@ namespace NewOS
VoidPtr ProcessHeader::New(const SizeT& sz)
{
- if (this->FreeMemory < 1)
+ if (this->HeapCursor)
{
- DbgLastError() = kErrorHeapOutOfMemory;
- this->Crash(); /// out of memory.
+ if (this->FreeMemory < 1)
+ {
+ DbgLastError() = kErrorHeapOutOfMemory;
+
+ /* we're going out of memory */
+ this->Crash();
- return nullptr;
- }
+ return nullptr;
+ }
- if (this->HeapCursor)
- {
- VoidPtr ptr = this->HeapCursor;
this->HeapCursor = (VoidPtr)((UIntPtr)this->HeapCursor + (sizeof(sz)));
+ VoidPtr ptr = this->HeapCursor;
++this->UsedMemory;
--this->FreeMemory;
@@ -206,12 +208,14 @@ namespace NewOS
ke_new_ke_heap(sizeof(HAL::StackFrame), true, false));
MUST_PASS(process.Leak().StackFrame);
+
+ process.Leak().Status = ProcessStatus::kRunning;
- mTeam.AsArray().Add(process);
-
- process.Leak().ProcessId = mTeam.AsArray().Count() - 1;
+ process.Leak().ProcessId = (mTeam.AsArray().Count() - 1);
process.Leak().HeapCursor = process.Leak().HeapPtr;
+ mTeam.AsArray().Add(process);
+
return mTeam.AsArray().Count() - 1;
}
@@ -232,17 +236,14 @@ namespace NewOS
/// @return
SizeT ProcessScheduler::Run() noexcept
{
- SizeT processIndex = 0; //! we store this guy to tell the scheduler how many
+ SizeT process_index = 0; //! we store this guy to tell the scheduler how many
//! things we have scheduled.
- for (; processIndex < mTeam.AsArray().Count(); ++processIndex)
+ for (; process_index < mTeam.AsArray().Count(); ++process_index)
{
- auto process = mTeam.AsArray()[processIndex];
-
- if (!process)
- continue;
+ auto process = mTeam.AsArray()[process_index];
- //! run any process needed to be scheduled.
+ //! check if process needs to be scheduled.
if (ProcessHelper::CanBeScheduled(process.Leak()))
{
auto unwrapped_process = *process.Leak();
@@ -255,6 +256,8 @@ namespace NewOS
// tell helper to find a core to schedule on.
ProcessHelper::Switch(mTeam.AsRef().Leak().StackFrame,
mTeam.AsRef().Leak().ProcessId);
+
+ kcout << unwrapped_process.Name << ": process switched.\r";
}
else
{
@@ -263,7 +266,7 @@ namespace NewOS
}
}
- return processIndex;
+ return process_index;
}
/// @brief Gets the current scheduled team.
@@ -328,8 +331,8 @@ namespace NewOS
bool ProcessHelper::StartScheduling()
{
- auto& processRef = ProcessScheduler::The().Leak();
- SizeT ret = processRef.Run();
+ auto& process_ref = ProcessScheduler::The().Leak();
+ SizeT ret = process_ref.Run();
kcout << "newoskrnl: Iterated over: ";
kcout.Number(ret);
--
cgit v1.2.3
From f05b598a1c1a8ca4f1bf0acca078f9c9e3c07991 Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Sat, 15 Jun 2024 13:49:07 +0200
Subject: kernel: include assembly files as well in project.
Signed-off-by: Amlal EL Mahrouss
---
Kernel/CFKit/Property.hpp | 20 +++++++++-----------
Kernel/FSKit/IndexableProperty.hxx | 5 +++--
Kernel/KernelKit/ProcessScheduler.hxx | 2 +-
Kernel/Sources/IndexableProperty.cxx | 12 +++++++-----
Kernel/Sources/KeMain.cxx | 10 +++++-----
Kernel/Sources/ProcessScheduler.cxx | 8 ++------
Kernel/Sources/Property.cxx | 8 ++++++++
newoskrnl.10x | 2 +-
8 files changed, 36 insertions(+), 31 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Kernel/CFKit/Property.hpp b/Kernel/CFKit/Property.hpp
index 7667194f..5c5aeb8f 100644
--- a/Kernel/CFKit/Property.hpp
+++ b/Kernel/CFKit/Property.hpp
@@ -4,8 +4,8 @@
------------------------------------------- */
-#ifndef _INC_PLIST_HPP__
-#define _INC_PLIST_HPP__
+#ifndef __INC_PLIST_HPP__
+#define __INC_PLIST_HPP__
#include
#include
@@ -14,18 +14,16 @@
namespace NewOS
{
- using PropertyId = Int;
+ /// @brief handle to anything (number, ptr, string...)
+ using PropertyId = UIntPtr;
/// @brief Kernel property class.
+ /// @example \Properties\SmpCores or \Properties\KernelVersion
class Property
{
public:
- explicit Property(const StringView& sw)
- : fName(sw)
- {
- }
-
- virtual ~Property() = default;
+ explicit Property(const StringView& sw);
+ virtual ~Property();
public:
Property& operator=(const Property&) = default;
@@ -39,8 +37,8 @@ namespace NewOS
PropertyId fAction;
};
- template
+ template
using PropertyArray = Array;
} // namespace NewOS
-#endif // !_INC_PLIST_HPP__
+#endif // !__INC_PLIST_HPP__
diff --git a/Kernel/FSKit/IndexableProperty.hxx b/Kernel/FSKit/IndexableProperty.hxx
index 91b90903..892083a2 100644
--- a/Kernel/FSKit/IndexableProperty.hxx
+++ b/Kernel/FSKit/IndexableProperty.hxx
@@ -24,11 +24,12 @@ namespace NewOS
Char Path[kIndexerNodeNameLength];
};
+
class IndexableProperty final : public Property
{
public:
explicit IndexableProperty()
- : Property(StringBuilder::Construct("Indexable").Leak().Leak())
+ : Property(StringBuilder::Construct("\\Filesystem\\IsIndexable?").Leak().Leak())
{
}
@@ -37,7 +38,7 @@ namespace NewOS
NEWOS_COPY_DEFAULT(IndexableProperty);
public:
- IndexProperty& LeakProperty() noexcept;
+ IndexProperty& Leak() noexcept;
public:
void AddFlag(Int16 flag);
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 637fc8c4..f49292f1 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -269,7 +269,7 @@ namespace NewOS
static bool Switch(HAL::StackFrame* newStack, const PID& newPid);
static bool CanBeScheduled(Ref& process);
static PID& GetCurrentPID();
- static bool StartScheduling();
+ static SizeT StartScheduling();
};
const Int32& rt_get_exit_code() noexcept;
diff --git a/Kernel/Sources/IndexableProperty.cxx b/Kernel/Sources/IndexableProperty.cxx
index a687e0ec..457e2c53 100644
--- a/Kernel/Sources/IndexableProperty.cxx
+++ b/Kernel/Sources/IndexableProperty.cxx
@@ -20,19 +20,21 @@ namespace NewOS
{
namespace Indexer
{
- IndexProperty& IndexableProperty::LeakProperty() noexcept
+ IndexProperty& IndexableProperty::Leak() noexcept
{
return fIndex;
}
- void IndexableProperty::AddFlag(Int16 flag)
+ Void IndexableProperty::AddFlag(Int16 flag)
{
fFlags |= flag;
}
- void IndexableProperty::RemoveFlag(Int16 flag)
+
+ Void IndexableProperty::RemoveFlag(Int16 flag)
{
fFlags &= flag;
}
+
Int16 IndexableProperty::HasFlag(Int16 flag)
{
return fFlags & flag;
@@ -48,9 +50,9 @@ namespace NewOS
if (!indexer.HasFlag(kIndexerClaimed))
{
indexer.AddFlag(kIndexerClaimed);
- rt_copy_memory((VoidPtr)indexer.LeakProperty().Path, (VoidPtr)filename, filenameLen);
+ rt_copy_memory((VoidPtr)indexer.Leak().Path, (VoidPtr)filename, filenameLen);
- kcout << "newoskrnl: FSKit: index new file: " << filename << endl;
+ kcout << "newoskrnl: filesystem: index new file: " << filename << endl;
}
}
} // namespace Indexer
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index 23e32c1d..e1b347b8 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -182,9 +182,9 @@ namespace NewOS::Detail
/// @brief System loader entrypoint.
/// @param void no parameters.
/// @return void no return value.
- STATIC NewOS::Void SystemLauncher_Main(NewOS::Void)
+ STATIC NewOS::Void ke_launch_srv(NewOS::Void)
{
- NewOS::PEFLoader lockScreen("\\System\\LockScreen");
+ NewOS::PEFLoader lockScreen("\\System\\securesrv.exe");
if (!lockScreen.IsLoaded())
{
@@ -194,7 +194,7 @@ namespace NewOS::Detail
NewOS::Utils::execute_from_image(lockScreen,
NewOS::ProcessHeader::kAppKind);
- NewOS::PEFLoader stageBoard("\\System\\StageBoard");
+ NewOS::PEFLoader stageBoard("\\System\\uisrv.exe");
if (!stageBoard.IsLoaded())
{
@@ -212,9 +212,9 @@ namespace NewOS::Detail
EXTERN_C NewOS::Void KeMain(NewOS::Void)
{
/// Now run kernel loop, until no process are running.
- NewOS::Detail::FilesystemWizard wizard; // automatic.
+ NewOS::Detail::FilesystemWizard wizard; // automatic filesystem creation.
- NewOS::Detail::SystemLauncher_Main();
+ NewOS::Detail::ke_launch_srv();
// fetch system cores.
NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index dc273cf6..d232c72e 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -329,16 +329,12 @@ namespace NewOS
* @brief Spin scheduler class.
*/
- bool ProcessHelper::StartScheduling()
+ SizeT ProcessHelper::StartScheduling()
{
auto& process_ref = ProcessScheduler::The().Leak();
SizeT ret = process_ref.Run();
- kcout << "newoskrnl: Iterated over: ";
- kcout.Number(ret);
- kcout << " processes.\r";
-
- return true;
+ return ret;
}
/**
diff --git a/Kernel/Sources/Property.cxx b/Kernel/Sources/Property.cxx
index dca34429..b58de469 100644
--- a/Kernel/Sources/Property.cxx
+++ b/Kernel/Sources/Property.cxx
@@ -8,6 +8,14 @@
namespace NewOS
{
+ Property::Property(const StringView& sw)
+ : fName(sw)
+ {
+ kcout << "Property: created: " << sw.CData() << endl;
+ }
+
+ Property::~Property() = default;
+
bool Property::StringEquals(StringView& name)
{
return fName && this->fName == name;
diff --git a/newoskrnl.10x b/newoskrnl.10x
index d232f112..4d9241c7 100644
--- a/newoskrnl.10x
+++ b/newoskrnl.10x
@@ -1,7 +1,7 @@
- *.c,*.cc,*.cpp,*.c++,*.cp,*.cxx,*.h,*.hh,*.hpp,*.h++,*.hp,*.hxx,*.inl,*.cs,*.rs,*.java,*.jav,*.js,*.jsc,*.jsx,*.json,*.cls,*.py,*.rpy,*.php,*.php3,*.phl,*.phtml,*.rhtml,*.tpl,*.phps,*.lua,*.html,*.html5,*.htm,*.xml,*.xaml,*.css,*.ssi,*.haml,*.yaml,*.bat,*.wbf,*.wbt,*.txt,*.cmake,*.make,*.makefile,*.mak,*.mk,*.sh,*.bash,*.csv,*.asp,*.pl,*.mac,*.ws,*.vbs,*.perl,*.src,*.rss,*.inc,*.f,*.go,*.prl,*.plx,*.rb,*.lsp,*.lpx,*.ps1,*.command,*.cbl,*.cob,*.qs,*.wxs,*.ph,*.msc,*.glsl,*.hlsl,*.fx,*.vert,*.tesc,*.tese,*.geom,*.frag,*.comp,*.pssl,*.scons,*.cu,*.jai,
+ *.s,*.asm,*.S,*.c,*.cc,*.cpp,*.c++,*.cp,*.cxx,*.h,*.hh,*.hpp,*.h++,*.hp,*.hxx,*.inl,*.cs,*.rs,*.java,*.jav,*.js,*.jsc,*.jsx,*.json,*.cls,*.py,*.rpy,*.php,*.php3,*.phl,*.phtml,*.rhtml,*.tpl,*.phps,*.lua,*.html,*.html5,*.htm,*.xml,*.xaml,*.css,*.ssi,*.haml,*.yaml,*.bat,*.wbf,*.wbt,*.txt,*.cmake,*.make,*.makefile,*.mak,*.mk,*.sh,*.bash,*.csv,*.asp,*.pl,*.mac,*.ws,*.vbs,*.perl,*.src,*.rss,*.inc,*.f,*.go,*.prl,*.plx,*.rb,*.lsp,*.lpx,*.ps1,*.command,*.cbl,*.cob,*.qs,*.wxs,*.ph,*.msc,*.glsl,*.hlsl,*.fx,*.vert,*.tesc,*.tese,*.geom,*.frag,*.comp,*.pssl,*.scons,*.cu,*.jai,
true
true
--
cgit v1.2.3
From 84aea90cff9952dbafcf147b7741c1985622a8d2 Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Sun, 16 Jun 2024 00:25:47 +0200
Subject: MHR-31: Add cHartIpi enum, improve ReadMe and fix FilesystemWizard.
Signed-off-by: Amlal EL Mahrouss
---
Kernel/Builtins/ReadMe.txt | 8 ++++----
Kernel/HALKit/ARM64/Hart.hxx | 10 +++++++++-
Kernel/Sources/KeMain.cxx | 42 +++++++++++++++++++++---------------------
3 files changed, 34 insertions(+), 26 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Kernel/Builtins/ReadMe.txt b/Kernel/Builtins/ReadMe.txt
index b0a5a327..df63e0be 100644
--- a/Kernel/Builtins/ReadMe.txt
+++ b/Kernel/Builtins/ReadMe.txt
@@ -6,14 +6,14 @@ NewOS Builtins
What are these?
===============
-These are NewOS builtins device drivers.
+These are like modules for the kernel.
===================
Maintainers/Authors
===================
-ACPIFactoryInterface: Amlal EL Mahrouss.
+ACPI: Amlal EL Mahrouss.
AHCI: Amlal EL Mahrouss.
GX: Amlal EL Mahrouss.
-PS2: Amlal EL Mahrouss
-ATA: Amlal EL Mahrouss
\ No newline at end of file
+PS2: Amlal EL Mahrouss.
+ATA: Amlal EL Mahrouss.
\ No newline at end of file
diff --git a/Kernel/HALKit/ARM64/Hart.hxx b/Kernel/HALKit/ARM64/Hart.hxx
index bc35c3f5..1b16a072 100644
--- a/Kernel/HALKit/ARM64/Hart.hxx
+++ b/Kernel/HALKit/ARM64/Hart.hxx
@@ -17,4 +17,12 @@ typedef NewOS::Int32 Arm64HartType;
/// @param hart the hart
/// @param epc the pc.
/// @return
-EXTERN_C NewOS::Void hal_switch_to_hart(Arm64HartType hart, NewOS::VoidPtr epc);
\ No newline at end of file
+EXTERN_C NewOS::Void hal_switch_to_hart(Arm64HartType hart, NewOS::VoidPtr epc);
+
+/// @brief Hart IPI enum
+enum {
+ cHartIpiTurnOn,
+ cHartIpiTurnOff,
+ cHartIpiStop,
+ cHartIpiResume,
+};
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index e1b347b8..83702d77 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -33,6 +33,7 @@ namespace NewOS::Detail
NewOS::NewFilesystemManager* fNewFS{nullptr};
public:
+ /// @brief wizard constructor.
explicit FilesystemWizard()
{
if (NewOS::FilesystemManagerInterface::GetMounted())
@@ -54,7 +55,7 @@ namespace NewOS::Detail
constexpr auto cFolderInfo = "META-INF";
const auto cDirCount = 8;
const char* cDirStr[cDirCount] = {
- "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\",
+ "\\Boot\\", "\\System\\", "\\Support\\", "\\Packages\\",
"\\Users\\", "\\Library\\", "\\Mount\\", "\\DCIM\\"};
for (NewOS::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx)
@@ -92,9 +93,9 @@ namespace NewOS::Detail
metadataFolder +=
"Kind: folder
\rCreated by: system
\rEdited by: "
- "system
\rVolume Type: New OS Standard
\r";
+ "system
\rVolume Type: s10 Filesystem
\r";
- metadataFolder += "File name: ";
+ metadataFolder += "
Path: ";
metadataFolder += cDirStr[dirIndx];
metadataFolder += "
\r";
@@ -113,7 +114,7 @@ namespace NewOS::Detail
}
NewCatalog* catalogDisk =
- this->fNewFS->GetParser()->GetCatalog("\\Mount\\This Disk");
+ this->fNewFS->GetParser()->GetCatalog("\\Mount\\C:\\");
const NewOS::Char* cSrcName = "DISK-INF";
@@ -128,16 +129,16 @@ namespace NewOS::Detail
else
{
catalogDisk =
- (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\This Disk");
+ (NewCatalog*)this->Leak()->CreateAlias("\\Mount\\C:\\");
NewOS::StringView diskFolder(kNewFSSectorSz);
diskFolder +=
- "Kind: alias to disk
\rCreated by: newoskrnl
\rEdited "
+ "
Kind: alias to disk
\rCreated by: system
\rEdited "
"by: "
- "N/A
\rVolume Type: New OS Standard
\r";
+ "system\rVolume Type: s10 Filesystem
\r";
- diskFolder += "Original Path: ";
+ diskFolder += "
Root: ";
diskFolder += NewOS::NewFilesystemHelper::Root();
diskFolder += "
\r";
@@ -165,43 +166,41 @@ namespace NewOS::Detail
}
}
- ~FilesystemWizard()
- {
- delete fNewFS;
- }
+ ~FilesystemWizard() = default;
NEWOS_COPY_DEFAULT(FilesystemWizard);
- /// Grab the disk's NewFS reference.
+ /// @brief Grab the disk's NewFS reference.
+ /// @return NewFilesystemManager the filesystem interface
NewOS::NewFilesystemManager* Leak()
{
return fNewFS;
}
};
- /// @brief System loader entrypoint.
+ /// @brief Loads necessary servers for the OS to work.
/// @param void no parameters.
/// @return void no return value.
STATIC NewOS::Void ke_launch_srv(NewOS::Void)
{
- NewOS::PEFLoader lockScreen("\\System\\securesrv.exe");
+ NewOS::PEFLoader secureSrv("\\System\\securesrv.exe");
- if (!lockScreen.IsLoaded())
+ if (!secureSrv.IsLoaded())
{
NewOS::ke_stop(RUNTIME_CHECK_FAILED);
}
- NewOS::Utils::execute_from_image(lockScreen,
+ NewOS::Utils::execute_from_image(secureSrv,
NewOS::ProcessHeader::kAppKind);
- NewOS::PEFLoader stageBoard("\\System\\uisrv.exe");
+ NewOS::PEFLoader uiSrv("\\System\\uisrv.exe");
- if (!stageBoard.IsLoaded())
+ if (!uiSrv.IsLoaded())
{
NewOS::ke_stop(RUNTIME_CHECK_FAILED);
}
- NewOS::Utils::execute_from_image(stageBoard,
+ NewOS::Utils::execute_from_image(uiSrv,
NewOS::ProcessHeader::kAppKind);
}
} // namespace NewOS::Detail
@@ -219,7 +218,8 @@ EXTERN_C NewOS::Void KeMain(NewOS::Void)
// fetch system cores.
NewOS::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_RsdPtr);
- while (true)
+ // spin forever.
+ while (Yes)
{
// start scheduling.
NewOS::ProcessHelper::StartScheduling();
--
cgit v1.2.3
From 684197d4bcb66e94c1dbf37591ed2a984792e51d Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Sun, 16 Jun 2024 12:32:15 +0200
Subject: MHR-31: Add ARM64 executable type for newoskrnl's PEF implementation.
Signed-off-by: Amlal EL Mahrouss
---
Boot/makefile | 2 +-
Kernel/KernelKit/PEF.hpp | 1 +
Kernel/NewKit/Defines.hpp | 6 ------
Kernel/NewKit/String.hpp | 2 +-
Kernel/Sources/FileManager.cxx | 4 ++--
Kernel/Sources/String.cxx | 2 +-
Kernel/makefile | 2 +-
7 files changed, 7 insertions(+), 12 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Boot/makefile b/Boot/makefile
index 98726bbe..37ac3704 100644
--- a/Boot/makefile
+++ b/Boot/makefile
@@ -28,7 +28,7 @@ BIOS=OVMF.fd
IMG=epm.img
IMG_2=epm-slave.img
-EMU_FLAGS=-net none -smp 4 -m 4G -M q35 \
+EMU_FLAGS=-net none -smp 4 -m 4G -M q35 -d int \
-bios $(BIOS) -device piix3-ide,id=ide \
-drive id=disk,file=$(IMG),format=raw,if=none \
-device ide-hd,drive=disk,bus=ide.0 -drive \
diff --git a/Kernel/KernelKit/PEF.hpp b/Kernel/KernelKit/PEF.hpp
index 0713e7c5..005c7673 100644
--- a/Kernel/KernelKit/PEF.hpp
+++ b/Kernel/KernelKit/PEF.hpp
@@ -36,6 +36,7 @@ namespace NewOS
kPefArch64x0, /* 64x0. ISA */
kPefArch32x0, /* 32x0. ISA */
kPefArchPowerPC,
+ kPefArchARM64,
kPefArchCount = (kPefArchPowerPC - kPefArchIntel86S) + 1,
kPefArchInvalid = 0xFF,
};
diff --git a/Kernel/NewKit/Defines.hpp b/Kernel/NewKit/Defines.hpp
index 96f13fd9..3210f1ef 100644
--- a/Kernel/NewKit/Defines.hpp
+++ b/Kernel/NewKit/Defines.hpp
@@ -133,12 +133,6 @@ namespace NewOS
};
} // namespace NewOS
-/// @note this is for the purpose of having a common namespace alongside zeta's codebase.
-namespace ma::zeta::kernel
-{
- using namespace NewOS;
-}
-
#define DEDUCE_ENDIAN(address, value) \
(((reinterpret_cast(address)[0]) == (value)) \
? (NewOS::Endian::kEndianBig) \
diff --git a/Kernel/NewKit/String.hpp b/Kernel/NewKit/String.hpp
index 644a1394..14286ca0 100644
--- a/Kernel/NewKit/String.hpp
+++ b/Kernel/NewKit/String.hpp
@@ -35,7 +35,7 @@ namespace NewOS
StringView(const StringView&) = default;
Char* Data();
- const Char* CData();
+ const Char* CData() const;
Size Length() const;
bool operator==(const Char* rhs) const;
diff --git a/Kernel/Sources/FileManager.cxx b/Kernel/Sources/FileManager.cxx
index 6e61a65d..ee285ae1 100644
--- a/Kernel/Sources/FileManager.cxx
+++ b/Kernel/Sources/FileManager.cxx
@@ -90,7 +90,7 @@ namespace NewOS
NEWOS_UNUSED(flags);
- auto dataForkName = "FileData";
+ auto dataForkName = kNewFSDataFork;
if ((reinterpret_cast(node))->Kind == kNewFSCatalogKindFile)
fImpl->WriteCatalog(reinterpret_cast(node), data, size,
@@ -112,7 +112,7 @@ namespace NewOS
NEWOS_UNUSED(flags);
- auto dataForkName = "FileData";
+ auto dataForkName = kNewFSDataFork;
if ((reinterpret_cast(node))->Kind == kNewFSCatalogKindFile)
return fImpl->ReadCatalog(reinterpret_cast(node), sz,
diff --git a/Kernel/Sources/String.cxx b/Kernel/Sources/String.cxx
index 08ca1036..fab12226 100644
--- a/Kernel/Sources/String.cxx
+++ b/Kernel/Sources/String.cxx
@@ -15,7 +15,7 @@ namespace NewOS
return fData;
}
- const Char* StringView::CData()
+ const Char* StringView::CData() const
{
return fData;
}
diff --git a/Kernel/makefile b/Kernel/makefile
index 16a36013..1f749323 100644
--- a/Kernel/makefile
+++ b/Kernel/makefile
@@ -25,7 +25,7 @@ ifneq ($(AHCI_SUPPORT), )
DISKDRIVER = -D__AHCI__
endif
-ifeq ($(RELEASE_SUPPORT), )
+ifneq ($(DEBUG_SUPPORT), )
DEBUG = -D__DEBUG__
endif
--
cgit v1.2.3
From 8051ad2bd4af1f226a9751288957ee6af7e787d7 Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Mon, 17 Jun 2024 18:55:38 +0200
Subject: MHR-31: IMP: Add setter for Name.
Signed-off-by: Amlal EL Mahrouss
---
Drv/GSMDrv/GSMDrv.c | 6 ++++--
Drv/VideoDrv/VideoDrv.c | 4 ++--
Kernel/NetworkKit/NetworkDevice.hpp | 9 +++++++--
Kernel/Sources/Network/NetworkDevice.cxx | 20 +++++++++++++++++++-
4 files changed, 32 insertions(+), 7 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Drv/GSMDrv/GSMDrv.c b/Drv/GSMDrv/GSMDrv.c
index 791c0678..1b7cfed6 100644
--- a/Drv/GSMDrv/GSMDrv.c
+++ b/Drv/GSMDrv/GSMDrv.c
@@ -7,7 +7,8 @@
#include
#include
-int __ImageStart(void)
+/// @brief GSM entrypoint.
+int __at_enter(void)
{
kernelPrintStr("GSMDrv: Starting up...\r");
@@ -16,7 +17,8 @@ int __ImageStart(void)
return 0;
}
-int __ImageEnd(void)
+/// @brief GSM 'atexit' function.
+int __at_exit(void)
{
kernelPrintStr("GSMDrv: Shutting down...\r");
return 0;
diff --git a/Drv/VideoDrv/VideoDrv.c b/Drv/VideoDrv/VideoDrv.c
index 3ba104d6..fc79d2a0 100644
--- a/Drv/VideoDrv/VideoDrv.c
+++ b/Drv/VideoDrv/VideoDrv.c
@@ -9,13 +9,13 @@
#include
-int __ImageStart(void)
+int __at_enter(void)
{
kernelPrintStr("VideoDrv: Starting up...\r");
return 0;
}
-int __ImageEnd(void)
+int __at_exit(void)
{
kernelPrintStr("VideoDrv: Shutting down...\r");
return 0;
diff --git a/Kernel/NetworkKit/NetworkDevice.hpp b/Kernel/NetworkKit/NetworkDevice.hpp
index 20c2a66a..4ea98e4f 100644
--- a/Kernel/NetworkKit/NetworkDevice.hpp
+++ b/Kernel/NetworkKit/NetworkDevice.hpp
@@ -35,12 +35,17 @@ namespace NewOS
public:
const char* Name() const override;
+ Boolean Name(const char* strView);
private:
- void (*fCleanup)(void);
+ constexpr auto cNetworkNameLen = 512;
+
+ Void (*fCleanup)(void);
+ Char fNetworkName[cNetworkNameLen];
+
};
- struct PACKED NetworkDeviceCommand final
+ struct NetworkDeviceCommand final
{
UInt32 CommandName;
UInt32 CommandType;
diff --git a/Kernel/Sources/Network/NetworkDevice.cxx b/Kernel/Sources/Network/NetworkDevice.cxx
index 511246c7..e1994baa 100644
--- a/Kernel/Sources/Network/NetworkDevice.cxx
+++ b/Kernel/Sources/Network/NetworkDevice.cxx
@@ -8,8 +8,26 @@
namespace NewOS
{
+ /// \brief Getter for fNetworkName.
const char* NetworkDevice::Name() const
{
- return "NetworkDevice";
+ return this->fNetworkName;
+ }
+
+ /// \brief Setter for fNetworkName.
+ Boolean NetworkDevice::Name(const char* strView)
+ {
+ if (strView == nullptr)
+ return false;
+
+ if (*strView == 0)
+ return false;
+
+ if (rt_string_len(strView) > cNetworkNameLen)
+ return false;
+
+ rt_copy_memory(strView, this->fNetworkName, rt_string_len(strView));
+
+ return true;
}
} // namespace NewOS
--
cgit v1.2.3
From 596268586bb4c8248a8ec106b8cdea12b9ab926a Mon Sep 17 00:00:00 2001
From: Amlal EL Mahrouss
Date: Tue, 18 Jun 2024 10:39:00 +0200
Subject: IMP: TLS syscall, serial write syscall. FIX: SMP manager writes to
stack frame directly, check if we also want to free the stack.
Signed-off-by: Amlal EL Mahrouss
---
.../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp | 20 +++++-----
.../HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp | 2 +-
Kernel/HALKit/AMD64/HalKernelMain.cxx | 14 +++++--
Kernel/KernelKit/ProcessScheduler.hxx | 4 +-
Kernel/KernelKit/ThreadLocalStorage.hxx | 6 ++-
Kernel/KernelKit/ThreadLocalStorage.inl | 8 ++--
Kernel/NetworkKit/NetworkDevice.hpp | 2 +-
Kernel/Sources/KeMain.cxx | 10 ++---
Kernel/Sources/Network/NetworkDevice.cxx | 4 +-
Kernel/Sources/PEFSharedObject.cxx | 10 ++---
Kernel/Sources/ProcessScheduler.cxx | 12 +++---
Kernel/Sources/SMPManager.cxx | 44 +++++++++-------------
Kernel/Sources/ThreadLocalStorage.cxx | 8 ++--
Kernel/Sources/UserHeap.cxx | 2 +-
14 files changed, 74 insertions(+), 72 deletions(-)
(limited to 'Kernel/Sources')
diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
index e9c0941c..657ab622 100644
--- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cpp
@@ -14,9 +14,9 @@ EXTERN_C void idt_handle_gpf(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: General Protection Fault, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle page fault.
@@ -25,9 +25,9 @@ EXTERN_C void idt_handle_pf(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Segmentation Fault, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle math fault.
@@ -36,9 +36,9 @@ EXTERN_C void idt_handle_math(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Math error, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle any generic fault.
@@ -47,9 +47,9 @@ EXTERN_C void idt_handle_generic(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Execution error, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Handle #UD fault.
@@ -58,9 +58,9 @@ EXTERN_C void idt_handle_ud(NewOS::UIntPtr rsp)
{
NewOS::kcout
<< "newoskrnl: Invalid interrupt, caused by "
- << NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().GetName();
+ << NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName();
- NewOS::ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ NewOS::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
/// @brief Enter syscall from assembly.
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
index 26773640..4e9d2ff6 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cpp
@@ -185,7 +185,7 @@ namespace NewOS::HAL
{
Semaphore sem;
- sem.LockOrWait(&ProcessScheduler::The().Leak().GetCurrent().Leak(), Seconds(5));
+ sem.LockOrWait(&ProcessScheduler::The().Leak().TheCurrent().Leak(), Seconds(5));
cFramePtr = stackFrame;
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index cafa6388..3fac40ca 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -76,14 +76,20 @@ EXTERN_C void hal_init_platform(
/* install basic hooks. */
- constexpr auto cDummyInterrupt = 0x10; // 16
+ constexpr auto cSerialWriteInterrupt = 0x10; // 16
+ constexpr auto cTlsInterrupt = 0x11; // 17
- kSyscalls[cDummyInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr sf) -> void {
- const char* msg = (const char*)sf;
+ kSyscalls[cSerialWriteInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx) -> void {
+ const char* msg = (const char*)rdx;
NewOS::kcout << "newoskrnl: " << msg << "\r";
};
- kSyscalls[cDummyInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fProc = [](NewOS::VoidPtr rdx)->void {
+ tls_check_syscall_impl(rdx);
+ };
+
+ kSyscalls[cSerialWriteInterrupt].Leak().Leak()->fHooked = true;
+ kSyscalls[cTlsInterrupt].Leak().Leak()->fHooked = true;
NewOS::HAL::Detail::_ke_power_on_self_test();
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 7c8f99be..8c470bb4 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -249,7 +249,7 @@ namespace NewOS
bool Remove(SizeT headerIndex);
public:
- Ref& GetCurrent();
+ Ref& TheCurrent();
SizeT Run() noexcept;
public:
@@ -268,7 +268,7 @@ namespace NewOS
public:
static bool Switch(HAL::StackFrame* newStack, const PID& newPid);
static bool CanBeScheduled(Ref& process);
- static PID& GetCurrentPID();
+ static PID& TheCurrentPID();
static SizeT StartScheduling();
};
diff --git a/Kernel/KernelKit/ThreadLocalStorage.hxx b/Kernel/KernelKit/ThreadLocalStorage.hxx
index eaae7991..432cc9ac 100644
--- a/Kernel/KernelKit/ThreadLocalStorage.hxx
+++ b/Kernel/KernelKit/ThreadLocalStorage.hxx
@@ -37,14 +37,16 @@ struct PACKED ThreadInformationBlock final
NewOS::Int32 ThreadID; // Thread execution ID.
};
+typedef struct ThreadInformationBlock ProcessInformationBlock;
+
/// @brief TLS install TIB and PIB.
-EXTERN_C void rt_install_tib(ThreadInformationBlock* TIB, NewOS::VoidPtr PIB);
+EXTERN_C void rt_install_tib(ThreadInformationBlock* TIB, ThreadInformationBlock* PIB);
///! @brief Cookie Sanity check.
NewOS::Boolean tls_check_tib(ThreadInformationBlock* Ptr);
/// @brief TLS check system call
-EXTERN_C NewOS::Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr StackPtr) noexcept;
+EXTERN_C NewOS::Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept;
#include
diff --git a/Kernel/KernelKit/ThreadLocalStorage.inl b/Kernel/KernelKit/ThreadLocalStorage.inl
index 1df825a3..6dbff3a1 100644
--- a/Kernel/KernelKit/ThreadLocalStorage.inl
+++ b/Kernel/KernelKit/ThreadLocalStorage.inl
@@ -15,9 +15,9 @@ inline T* tls_new_ptr(void)
{
using namespace NewOS;
- MUST_PASS(ProcessScheduler::The().Leak().GetCurrent());
+ MUST_PASS(ProcessScheduler::The().Leak().TheCurrent());
- auto ref_process = ProcessScheduler::The().Leak().GetCurrent();
+ auto ref_process = ProcessScheduler::The().Leak().TheCurrent();
T* pointer = (T*)ref_process.Leak().New(sizeof(T));
return pointer;
@@ -32,9 +32,9 @@ inline bool tls_delete_ptr(T* ptr)
using namespace NewOS;
- MUST_PASS(ProcessScheduler::The().Leak().GetCurrent());
+ MUST_PASS(ProcessScheduler::The().Leak().TheCurrent());
- auto ref_process = ProcessScheduler::The().Leak().GetCurrent();
+ auto ref_process = ProcessScheduler::The().Leak().TheCurrent();
return ref_process.Leak().Delete(ptr, sizeof(T));
}
diff --git a/Kernel/NetworkKit/NetworkDevice.hpp b/Kernel/NetworkKit/NetworkDevice.hpp
index 4ea98e4f..9b251c2e 100644
--- a/Kernel/NetworkKit/NetworkDevice.hpp
+++ b/Kernel/NetworkKit/NetworkDevice.hpp
@@ -38,7 +38,7 @@ namespace NewOS
Boolean Name(const char* strView);
private:
- constexpr auto cNetworkNameLen = 512;
+ static constexpr auto cNetworkNameLen = 512;
Void (*fCleanup)(void);
Char fNetworkName[cNetworkNameLen];
diff --git a/Kernel/Sources/KeMain.cxx b/Kernel/Sources/KeMain.cxx
index 83702d77..fb127271 100644
--- a/Kernel/Sources/KeMain.cxx
+++ b/Kernel/Sources/KeMain.cxx
@@ -28,13 +28,13 @@ namespace NewOS::Detail
{
/// @brief Filesystem auto mounter, additional checks are also done by the
/// class.
- class FilesystemWizard final
+ class FilesystemInstaller final
{
NewOS::NewFilesystemManager* fNewFS{nullptr};
public:
/// @brief wizard constructor.
- explicit FilesystemWizard()
+ explicit FilesystemInstaller()
{
if (NewOS::FilesystemManagerInterface::GetMounted())
{
@@ -166,9 +166,9 @@ namespace NewOS::Detail
}
}
- ~FilesystemWizard() = default;
+ ~FilesystemInstaller() = default;
- NEWOS_COPY_DEFAULT(FilesystemWizard);
+ NEWOS_COPY_DEFAULT(FilesystemInstaller);
/// @brief Grab the disk's NewFS reference.
/// @return NewFilesystemManager the filesystem interface
@@ -211,7 +211,7 @@ namespace NewOS::Detail
EXTERN_C NewOS::Void KeMain(NewOS::Void)
{
/// Now run kernel loop, until no process are running.
- NewOS::Detail::FilesystemWizard wizard; // automatic filesystem creation.
+ NewOS::Detail::FilesystemInstaller installer; // automatic filesystem creation.
NewOS::Detail::ke_launch_srv();
diff --git a/Kernel/Sources/Network/NetworkDevice.cxx b/Kernel/Sources/Network/NetworkDevice.cxx
index e1994baa..027613ac 100644
--- a/Kernel/Sources/Network/NetworkDevice.cxx
+++ b/Kernel/Sources/Network/NetworkDevice.cxx
@@ -5,6 +5,7 @@
------------------------------------------- */
#include
+#include
namespace NewOS
{
@@ -26,7 +27,8 @@ namespace NewOS
if (rt_string_len(strView) > cNetworkNameLen)
return false;
- rt_copy_memory(strView, this->fNetworkName, rt_string_len(strView));
+ rt_copy_memory((VoidPtr)strView,
+ (VoidPtr)this->fNetworkName, rt_string_len(strView));
return true;
}
diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx
index 5103e075..0d5949f1 100644
--- a/Kernel/Sources/PEFSharedObject.cxx
+++ b/Kernel/Sources/PEFSharedObject.cxx
@@ -41,7 +41,7 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!library)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
@@ -50,17 +50,17 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!library->Get())
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
library->Get()->fImageObject =
- ProcessScheduler::The().Leak().GetCurrent().Leak().Image;
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Image;
if (!library->Get()->fImageObject)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return nullptr;
}
@@ -85,7 +85,7 @@ EXTERN_C Void rt_library_free(SharedObjectPtr lib, bool* successful)
if (lib == nullptr)
{
*successful = false;
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
delete lib->Get();
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index d232c72e..aae69386 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -161,7 +161,7 @@ namespace NewOS
void ProcessHeader::Exit(Int32 exit_code)
{
if (this->ProcessId !=
- ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId)
+ ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId)
ke_stop(RUNTIME_CHECK_PROCESS);
kLastExitCode = exit_code;
@@ -286,17 +286,17 @@ namespace NewOS
/// @brief Gets current running process.
/// @return
- Ref& ProcessScheduler::GetCurrent()
+ Ref& ProcessScheduler::TheCurrent()
{
return mTeam.AsRef();
}
/// @brief Current proccess id getter.
/// @return Process ID integer.
- PID& ProcessHelper::GetCurrentPID()
+ PID& ProcessHelper::TheCurrentPID()
{
- kcout << "ProcessHelper::GetCurrentPID: Leaking ProcessId...\r";
- return ProcessScheduler::The().Leak().GetCurrent().Leak().ProcessId;
+ kcout << "ProcessHelper::TheCurrentPID: Leaking ProcessId...\r";
+ return ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId;
}
/// @brief Check if process can be schedulded.
@@ -368,7 +368,7 @@ namespace NewOS
ThreadKind::kHartSystemReserved)
{
SMPManager::The().Leak()[index].Leak()->Busy(true);
- ProcessHelper::GetCurrentPID() = new_pid;
+ ProcessHelper::TheCurrentPID() = new_pid;
return SMPManager::The().Leak()[index].Leak()->Switch(the_stack);
}
diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx
index 5002e880..149b1334 100644
--- a/Kernel/Sources/SMPManager.cxx
+++ b/Kernel/Sources/SMPManager.cxx
@@ -85,36 +85,26 @@ namespace NewOS
bool HardwareThread::Switch(HAL::StackFramePtr stack)
{
if (!rt_check_stack(stack))
- return false;
-
- if (!fStack)
- {
- fStack = stack;
- }
- else
{
- /// Keep the arguments, switch the base pointer, stack pointer
- /// fs and gs registers.
- fStack->Rbp = stack->Rbp;
- fStack->Rsp = stack->Rsp;
- fStack->Fs = stack->Fs;
- fStack->Gs = stack->Gs;
-
- // save global registers.
-
- fStack->R15 = stack->R15;
- fStack->R14 = stack->R14;
+ /// provide 'nullptr' to free the stack frame.
+ if (stack == nullptr)
+ {
+ delete fStack;
+ fStack = nullptr;
- fStack->R13 = stack->R13;
- fStack->R12 = stack->R12;
- fStack->R11 = stack->R11;
+ return true;
+ }
- fStack->R10 = stack->R10;
- fStack->R9 = stack->R9;
- fStack->R8 = stack->R8;
+ return false;
+ }
- fStack->Rcx = this->fID;
+ if (fStack)
+ {
+ delete fStack;
+ fStack = nullptr;
}
+
+ fStack = stack;
rt_do_context_switch(fStack);
@@ -146,7 +136,7 @@ namespace NewOS
HAL::StackFramePtr SMPManager::Leak() noexcept
{
if (fThreadList[fCurrentThread].Leak() &&
- ProcessHelper::GetCurrentPID() ==
+ ProcessHelper::TheCurrentPID() ==
fThreadList[fCurrentThread].Leak().Leak()->fPID)
return fThreadList[fCurrentThread].Leak().Leak()->fStack;
@@ -189,7 +179,7 @@ namespace NewOS
fThreadList[idx].Leak().Leak()->Switch(fThreadList[idx].Leak().Leak()->fStack);
- fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::GetCurrentPID();
+ fThreadList[idx].Leak().Leak()->fPID = ProcessHelper::TheCurrentPID();
fThreadList[idx].Leak().Leak()->Busy(false);
diff --git a/Kernel/Sources/ThreadLocalStorage.cxx b/Kernel/Sources/ThreadLocalStorage.cxx
index c292d078..4d6fec14 100644
--- a/Kernel/Sources/ThreadLocalStorage.cxx
+++ b/Kernel/Sources/ThreadLocalStorage.cxx
@@ -44,14 +44,16 @@ Boolean tls_check_tib(ThreadInformationBlock* tib)
* @param stackPtr The call frame.
* @return
*/
-EXTERN_C Void tls_check_syscall_impl(NewOS::HAL::StackFramePtr stackPtr) noexcept
+EXTERN_C Void tls_check_syscall_impl(NewOS::VoidPtr TIB) noexcept
{
- ThreadInformationBlock* tib = (ThreadInformationBlock*)stackPtr->Gs;
+ if (!TIB) return;
+
+ ThreadInformationBlock* tib = (ThreadInformationBlock*)TIB;
if (!tls_check_tib(tib))
{
kcout << "newoskrnl: Verification failed, Crashing...\r";
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
}
kcout << "newoskrnl: Verification succeeded! Keeping on...\r";
diff --git a/Kernel/Sources/UserHeap.cxx b/Kernel/Sources/UserHeap.cxx
index d1de13a6..f20e30f8 100644
--- a/Kernel/Sources/UserHeap.cxx
+++ b/Kernel/Sources/UserHeap.cxx
@@ -150,7 +150,7 @@ namespace NewOS
{
if (!poolHdr->fFree)
{
- ProcessScheduler::The().Leak().GetCurrent().Leak().Crash();
+ ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
return;
}
--
cgit v1.2.3