summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/FSKit/NewFS.hxx30
-rw-r--r--Kernel/HALKit/AMD64/CPUID.hxx124
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx14
-rw-r--r--Kernel/KernelKit/PEFSharedObject.hxx4
-rw-r--r--Kernel/KernelKit/ProcessHeap.hxx10
-rw-r--r--Kernel/KernelKit/ProcessScheduler.hxx10
-rw-r--r--Kernel/Sources/PEFSharedObject.cxx20
-rw-r--r--Kernel/Sources/ProcessHeap.cxx4
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx17
-rw-r--r--Kernel/Sources/Timer.cxx3
10 files changed, 135 insertions, 101 deletions
diff --git a/Kernel/FSKit/NewFS.hxx b/Kernel/FSKit/NewFS.hxx
index 5f8341f1..24e77225 100644
--- a/Kernel/FSKit/NewFS.hxx
+++ b/Kernel/FSKit/NewFS.hxx
@@ -67,15 +67,15 @@ default.
#define kNewFSCatalogKindDevice (9)
#define kNewFSCatalogKindLock (10)
-#define kNewFSCatalogKindRLE (11)
+#define kNewFSCatalogKindRLE (11)
#define kNewFSCatalogKindMetaFile (12)
-#define kNewFSSeparator '\\'
+#define kNewFSSeparator '\\'
#define kNewFSSeparatorAlt '/'
-#define kNewFSUpDir ".."
-#define kNewFSRoot "\\"
+#define kNewFSUpDir ".."
+#define kNewFSRoot "\\"
#define kNewFSRootAlt "/"
#define kNewFSLF '\r'
@@ -147,7 +147,7 @@ struct PACKED NFS_CATALOG_STRUCT final
/// whereas the data fork is reserved for file data.
struct PACKED NFS_FORK_STRUCT final
{
- Kernel::Char ForkName[kNewFSForkNameLen];
+ Kernel::Char ForkName[kNewFSForkNameLen];
Kernel::Char CatalogName[kNewFSNodeNameLen];
Kernel::Int32 Flags;
@@ -228,15 +228,15 @@ namespace Kernel
/// @param theFork the fork itself.
/// @return the fork
_Output NFS_FORK_STRUCT* CreateFork(_Input NFS_CATALOG_STRUCT* catalog,
- _Input NFS_FORK_STRUCT& theFork);
+ _Input NFS_FORK_STRUCT& theFork);
/// @brief Find fork inside New filesystem.
/// @param catalog the catalog.
/// @param name the fork name.
/// @return the fork.
_Output NFS_FORK_STRUCT* FindFork(_Input NFS_CATALOG_STRUCT* catalog,
- _Input const Char* name,
- Boolean dataOrRsrc);
+ _Input const Char* name,
+ Boolean dataOrRsrc);
_Output Void RemoveFork(_Input NFS_FORK_STRUCT* fork);
@@ -247,19 +247,19 @@ namespace Kernel
_Output NFS_CATALOG_STRUCT* GetCatalog(_Input const char* name);
_Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name,
- _Input const Int32& flags,
- _Input const Int32& kind);
+ _Input const Int32& flags,
+ _Input const Int32& kind);
_Output NFS_CATALOG_STRUCT* CreateCatalog(_Input const char* name);
bool WriteCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog,
- voidPtr data,
- SizeT sizeOfData,
- _Input const char* forkName);
+ voidPtr data,
+ SizeT sizeOfData,
+ _Input const char* forkName);
VoidPtr ReadCatalog(_Input _Output NFS_CATALOG_STRUCT* catalog,
- SizeT dataSz,
- _Input const char* forkName);
+ SizeT dataSz,
+ _Input const char* forkName);
bool Seek(_Input _Output NFS_CATALOG_STRUCT* catalog, SizeT off);
diff --git a/Kernel/HALKit/AMD64/CPUID.hxx b/Kernel/HALKit/AMD64/CPUID.hxx
index 5c05277e..4f88921e 100644
--- a/Kernel/HALKit/AMD64/CPUID.hxx
+++ b/Kernel/HALKit/AMD64/CPUID.hxx
@@ -15,67 +15,67 @@
enum
{
- CPU_FEATURE_ECX_SSE3 = 1 << 0,
- CPU_FEATURE_ECX_PCLMUL = 1 << 1,
- CPU_FEATURE_ECX_DTES64 = 1 << 2,
- CPU_FEATURE_ECX_MONITOR = 1 << 3,
- CPU_FEATURE_ECX_DS_CPL = 1 << 4,
- CPU_FEATURE_ECX_VMX = 1 << 5,
- CPU_FEATURE_ECX_SMX = 1 << 6,
- CPU_FEATURE_ECX_EST = 1 << 7,
- CPU_FEATURE_ECX_TM2 = 1 << 8,
- CPU_FEATURE_ECX_SSSE3 = 1 << 9,
- CPU_FEATURE_ECX_CID = 1 << 10,
- CPU_FEATURE_ECX_SDBG = 1 << 11,
- CPU_FEATURE_ECX_FMA = 1 << 12,
- CPU_FEATURE_ECX_CX16 = 1 << 13,
- CPU_FEATURE_ECX_XTPR = 1 << 14,
- CPU_FEATURE_ECX_PDCM = 1 << 15,
- CPU_FEATURE_ECX_PCID = 1 << 17,
- CPU_FEATURE_ECX_DCA = 1 << 18,
- CPU_FEATURE_ECX_SSE4_1 = 1 << 19,
- CPU_FEATURE_ECX_SSE4_2 = 1 << 20,
- CPU_FEATURE_ECX_X2APIC = 1 << 21,
- CPU_FEATURE_ECX_MOVBE = 1 << 22,
- CPU_FEATURE_ECX_POP3C = 1 << 23,
- CPU_FEATURE_ECX_TSC = 1 << 24,
- CPU_FEATURE_ECX_AES = 1 << 25,
- CPU_FEATURE_ECX_XSAVE = 1 << 26,
- CPU_FEATURE_ECX_OSXSAVE = 1 << 27,
- CPU_FEATURE_ECX_AVX = 1 << 28,
- CPU_FEATURE_ECX_F16C = 1 << 29,
- CPU_FEATURE_ECX_RDRAND = 1 << 30,
- CPU_FEATURE_ECX_HYPERVISOR = 1 << 31,
- CPU_FEATURE_EDX_FPU = 1 << 0,
- CPU_FEATURE_EDX_VME = 1 << 1,
- CPU_FEATURE_EDX_DE = 1 << 2,
- CPU_FEATURE_EDX_PSE = 1 << 3,
- CPU_FEATURE_EDX_TSC = 1 << 4,
- CPU_FEATURE_EDX_MSR = 1 << 5,
- CPU_FEATURE_EDX_PAE = 1 << 6,
- CPU_FEATURE_EDX_MCE = 1 << 7,
- CPU_FEATURE_EDX_CX8 = 1 << 8,
- CPU_FEATURE_EDX_APIC = 1 << 9,
- CPU_FEATURE_EDX_SEP = 1 << 11,
- CPU_FEATURE_EDX_MTRR = 1 << 12,
- CPU_FEATURE_EDX_PGE = 1 << 13,
- CPU_FEATURE_EDX_MCA = 1 << 14,
- CPU_FEATURE_EDX_CMOV = 1 << 15,
- CPU_FEATURE_EDX_PAT = 1 << 16,
- CPU_FEATURE_EDX_PSE36 = 1 << 17,
- CPU_FEATURE_EDX_PSN = 1 << 18,
- CPU_FEATURE_EDX_CLFLUSH = 1 << 19,
- CPU_FEATURE_EDX_DS = 1 << 21,
- CPU_FEATURE_EDX_ACPI = 1 << 22,
- CPU_FEATURE_EDX_MMX = 1 << 23,
- CPU_FEATURE_EDX_FXSR = 1 << 24,
- CPU_FEATURE_EDX_SSE = 1 << 25,
- CPU_FEATURE_EDX_SSE2 = 1 << 26,
- CPU_FEATURE_EDX_SS = 1 << 27,
- CPU_FEATURE_EDX_HTT = 1 << 28,
- CPU_FEATURE_EDX_TM = 1 << 29,
- CPU_FEATURE_EDX_IA64 = 1 << 30,
- CPU_FEATURE_EDX_PBE = 1 << 31
+ eCPU_FEATURE_ECX_SSE3 = 1 << 0,
+ eCPU_FEATURE_ECX_PCLMUL = 1 << 1,
+ eCPU_FEATURE_ECX_DTES64 = 1 << 2,
+ eCPU_FEATURE_ECX_MONITOR = 1 << 3,
+ eCPU_FEATURE_ECX_DS_CPL = 1 << 4,
+ eCPU_FEATURE_ECX_VMX = 1 << 5,
+ eCPU_FEATURE_ECX_SMX = 1 << 6,
+ eCPU_FEATURE_ECX_EST = 1 << 7,
+ eCPU_FEATURE_ECX_TM2 = 1 << 8,
+ eCPU_FEATURE_ECX_SSSE3 = 1 << 9,
+ eCPU_FEATURE_ECX_CID = 1 << 10,
+ eCPU_FEATURE_ECX_SDBG = 1 << 11,
+ eCPU_FEATURE_ECX_FMA = 1 << 12,
+ eCPU_FEATURE_ECX_CX16 = 1 << 13,
+ eCPU_FEATURE_ECX_XTPR = 1 << 14,
+ eCPU_FEATURE_ECX_PDCM = 1 << 15,
+ eCPU_FEATURE_ECX_PCID = 1 << 17,
+ eCPU_FEATURE_ECX_DCA = 1 << 18,
+ eCPU_FEATURE_ECX_SSE4_1 = 1 << 19,
+ eCPU_FEATURE_ECX_SSE4_2 = 1 << 20,
+ eCPU_FEATURE_ECX_X2APIC = 1 << 21,
+ eCPU_FEATURE_ECX_MOVBE = 1 << 22,
+ eCPU_FEATURE_ECX_POP3C = 1 << 23,
+ eCPU_FEATURE_ECX_TSC = 1 << 24,
+ eCPU_FEATURE_ECX_AES = 1 << 25,
+ eCPU_FEATURE_ECX_XSAVE = 1 << 26,
+ eCPU_FEATURE_ECX_OSXSAVE = 1 << 27,
+ eCPU_FEATURE_ECX_AVX = 1 << 28,
+ eCPU_FEATURE_ECX_F16C = 1 << 29,
+ eCPU_FEATURE_ECX_RDRAND = 1 << 30,
+ eCPU_FEATURE_ECX_HYPERVISOR = 1 << 31,
+ eCPU_FEATURE_EDX_FPU = 1 << 0,
+ eCPU_FEATURE_EDX_VME = 1 << 1,
+ eCPU_FEATURE_EDX_DE = 1 << 2,
+ eCPU_FEATURE_EDX_PSE = 1 << 3,
+ eCPU_FEATURE_EDX_TSC = 1 << 4,
+ eCPU_FEATURE_EDX_MSR = 1 << 5,
+ eCPU_FEATURE_EDX_PAE = 1 << 6,
+ eCPU_FEATURE_EDX_MCE = 1 << 7,
+ eCPU_FEATURE_EDX_CX8 = 1 << 8,
+ eCPU_FEATURE_EDX_APIC = 1 << 9,
+ eCPU_FEATURE_EDX_SEP = 1 << 11,
+ eCPU_FEATURE_EDX_MTRR = 1 << 12,
+ eCPU_FEATURE_EDX_PGE = 1 << 13,
+ eCPU_FEATURE_EDX_MCA = 1 << 14,
+ eCPU_FEATURE_EDX_CMOV = 1 << 15,
+ eCPU_FEATURE_EDX_PAT = 1 << 16,
+ eCPU_FEATURE_EDX_PSE36 = 1 << 17,
+ eCPU_FEATURE_EDX_PSN = 1 << 18,
+ eCPU_FEATURE_EDX_CLFLUSH = 1 << 19,
+ eCPU_FEATURE_EDX_DS = 1 << 21,
+ eCPU_FEATURE_EDX_ACPI = 1 << 22,
+ eCPU_FEATURE_EDX_MMX = 1 << 23,
+ eCPU_FEATURE_EDX_FXSR = 1 << 24,
+ eCPU_FEATURE_EDX_SSE = 1 << 25,
+ eCPU_FEATURE_EDX_SSE2 = 1 << 26,
+ eCPU_FEATURE_EDX_SS = 1 << 27,
+ eCPU_FEATURE_EDX_HTT = 1 << 28,
+ eCPU_FEATURE_EDX_TM = 1 << 29,
+ eCPU_FEATURE_EDX_IA64 = 1 << 30,
+ eCPU_FEATURE_EDX_PBE = 1 << 31
};
-typedef int CPU_FEATURE; \ No newline at end of file
+typedef long long int hal_cpu_feature_type; \ No newline at end of file
diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
index 2f82da6b..a79d1881 100644
--- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
+++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx
@@ -166,7 +166,6 @@ namespace Kernel::HAL
{
while (Yes)
{
-
}
}
@@ -176,9 +175,17 @@ namespace Kernel::HAL
hal_switch_context(stackFrame);
}
+ constexpr auto cMaxPCBBlocks = 64;
+
+ struct PROCESS_CONTROL_BLOCK final
+ {
+ ProcessHeader* f_Header;
+ HAL::StackFramePtr f_StackFrame;
+ } fBlocks[cMaxPCBBlocks] = {0};
+
STATIC Void hal_switch_context(HAL::StackFramePtr stackFrame)
{
- Semaphore sem;
+ STATIC Semaphore sem;
constexpr auto cSeconds = 1U;
@@ -187,6 +194,9 @@ namespace Kernel::HAL
cFramePtr = stackFrame;
+ fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_Header = &ProcessScheduler::The().Leak().TheCurrent().Leak();
+ fBlocks[ProcessScheduler::The().Leak().TheCurrent().Leak().ProcessId % cMaxPCBBlocks].f_StackFrame = stackFrame;
+
sem.Unlock();
}
diff --git a/Kernel/KernelKit/PEFSharedObject.hxx b/Kernel/KernelKit/PEFSharedObject.hxx
index f8119971..d490c567 100644
--- a/Kernel/KernelKit/PEFSharedObject.hxx
+++ b/Kernel/KernelKit/PEFSharedObject.hxx
@@ -107,6 +107,10 @@ namespace Kernel
};
typedef SharedObject* SharedObjectPtr;
+
+ EXTERN_C SharedObjectPtr rtl_init_shared_object(ProcessHeader* header);
+ EXTERN_C Void rtl_fini_shared_object(ProcessHeader* header, SharedObjectPtr lib, Bool* successful);
} // namespace Kernel
#endif /* ifndef __KERNELKIT_SHARED_OBJECT_HXX__ */
+
diff --git a/Kernel/KernelKit/ProcessHeap.hxx b/Kernel/KernelKit/ProcessHeap.hxx
index 7772398e..377e6009 100644
--- a/Kernel/KernelKit/ProcessHeap.hxx
+++ b/Kernel/KernelKit/ProcessHeap.hxx
@@ -15,7 +15,7 @@
/// @version 5/11/23
/// @file ProcessHeap.hxx
-/// @brief Heap for user processes.
+/// @brief Process heap allocator.
#define kUserHeapMaxSz (4096)
#define kUserHeapMag (0xFAF0FEF0)
@@ -33,12 +33,12 @@ namespace Kernel
} kUserHeapFlags;
/// @brief Allocate a process heap, no zero out is done here.
- /// @param flags
+ /// @param flags the allocation flags.
/// @return The process's heap.
- VoidPtr rt_new_heap(Int32 flags);
+ VoidPtr sched_new_heap(Int32 flags);
/// @brief Frees the process heap.
/// @param pointer The process heap pointer.
- /// @return
- Int32 rt_free_heap(voidPtr pointer);
+ /// @return status code of the freeing.
+ Int32 sched_free_heap(voidPtr pointer);
} // namespace Kernel
diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx
index 5c27af79..b174858a 100644
--- a/Kernel/KernelKit/ProcessScheduler.hxx
+++ b/Kernel/KernelKit/ProcessScheduler.hxx
@@ -36,10 +36,11 @@ namespace Kernel
//! @brief Process name length.
inline constexpr SizeT kProcessLen = 256U;
- //! @brief Forward declaration.
+ //! @brief Forward declarations.
class ProcessHeader;
class ProcessScheduler;
class ProcessHelper;
+ class SharedObject;
//! @brief Process status enum.
enum class ProcessStatus : Int32
@@ -144,7 +145,7 @@ namespace Kernel
const Int32& GetExitCode() noexcept;
public:
- Char Name[kProcessLen] = {"Process"};
+ Char Name[kProcessLen] = {"Unknown Process"};
ProcessSubsystem SubSystem{ProcessSubsystem::eProcessSubsystemInvalid};
ProcessSelector Selector{ProcessSelector::kRingUser};
HAL::StackFramePtr StackFrame{nullptr};
@@ -156,7 +157,10 @@ namespace Kernel
ImagePtr Image{nullptr};
HeapPtrKind HeapPtr{nullptr};
- // memory usage
+ // shared library handle, reserved for .lib only.
+ SharedObject* SharedLibObjectPtr{nullptr};
+
+ // Memory usage.
SizeT UsedMemory{0};
SizeT FreeMemory{0};
diff --git a/Kernel/Sources/PEFSharedObject.cxx b/Kernel/Sources/PEFSharedObject.cxx
index dccb9d12..7d02ac19 100644
--- a/Kernel/Sources/PEFSharedObject.cxx
+++ b/Kernel/Sources/PEFSharedObject.cxx
@@ -18,11 +18,11 @@
Revision History:
- 01/02/24: Rework shared sharedObj ABI, except a rt_library_init and
- rt_library_fini (amlel) 15/02/24: Breaking changes, changed the name of the
+ 01/02/24: Rework shared sharedObj ABI, except a rtl_init_shared_object and
+ rtl_fini_shared_object (amlel) 15/02/24: Breaking changes, changed the name of the
routines. (amlel)
- 07/28/24: Replace rt_library_free with rt_library_fini
+ 07/28/24: Replace rt_library_free with rtl_fini_shared_object
------------------------------------------- */
@@ -37,13 +37,13 @@ using namespace Kernel;
/** @brief Library initializer. */
/***********************************************************************************/
-EXTERN_C SharedObjectPtr rt_library_init(void)
+EXTERN_C SharedObjectPtr rtl_init_shared_object(ProcessHeader* header)
{
SharedObjectPtr sharedObj = tls_new_class<SharedObject>();
if (!sharedObj)
{
- ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
+ header->Crash();
return nullptr;
}
@@ -52,17 +52,17 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
if (!sharedObj->Get())
{
- ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
+ header->Crash();
return nullptr;
}
sharedObj->Get()->fImageObject =
- ProcessScheduler::The().Leak().TheCurrent().Leak().Image;
+ header->Image;
if (!sharedObj->Get()->fImageObject)
{
- ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
+ header->Crash();
return nullptr;
}
@@ -80,7 +80,7 @@ EXTERN_C SharedObjectPtr rt_library_init(void)
/** @param successful Reports if successful or not. */
/***********************************************************************************/
-EXTERN_C Void rt_library_fini(SharedObjectPtr lib, bool* successful)
+EXTERN_C Void rtl_fini_shared_object(ProcessHeader* header, SharedObjectPtr lib, Bool* successful)
{
MUST_PASS(successful);
@@ -88,7 +88,7 @@ EXTERN_C Void rt_library_fini(SharedObjectPtr lib, bool* successful)
if (lib == nullptr)
{
*successful = false;
- ProcessScheduler::The().Leak().TheCurrent().Leak().Crash();
+ header->Crash();
}
delete lib->Get();
diff --git a/Kernel/Sources/ProcessHeap.cxx b/Kernel/Sources/ProcessHeap.cxx
index 86ac1554..414cd934 100644
--- a/Kernel/Sources/ProcessHeap.cxx
+++ b/Kernel/Sources/ProcessHeap.cxx
@@ -199,7 +199,7 @@ namespace Kernel
/// @brief Creates a new pool pointer.
/// @param flags the flags attached to it.
/// @return a pool pointer with selected permissions.
- VoidPtr rt_new_heap(Int32 flags)
+ VoidPtr sched_new_heap(Int32 flags)
{
if (!ProcessHeapHelper::IsEnabled())
return nullptr;
@@ -233,7 +233,7 @@ namespace Kernel
/// @brief free a pool pointer.
/// @param ptr The pool pointer to free.
/// @return status code
- Int32 rt_free_heap(VoidPtr ptr)
+ Int32 sched_free_heap(VoidPtr ptr)
{
if (!ProcessHeapHelper::IsEnabled())
return -1;
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 3301588a..94ae5fad 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -10,6 +10,7 @@
/***********************************************************************************/
#include <KernelKit/ProcessScheduler.hxx>
+#include <KernelKit/PEFSharedObject.hxx>
#include <KernelKit/MPManager.hpp>
#include <KernelKit/Heap.hxx>
#include <NewKit/String.hpp>
@@ -193,6 +194,17 @@ namespace Kernel
this->Image = nullptr;
this->StackFrame = nullptr;
+ if (this->Kind == kShLibKind)
+ {
+ bool success = false;
+ rtl_fini_shared_object(this, this->SharedLibObjectPtr, &success);
+
+ if (success)
+ {
+ this->SharedLibObjectPtr = nullptr;
+ }
+ }
+
ProcessScheduler::The().Leak().Remove(this->ProcessId);
}
@@ -217,11 +229,12 @@ namespace Kernel
/// Create heap according to type of process.
if (process.Leak().Kind == ProcessHeader::kAppKind)
{
- process.Leak().HeapPtr = rt_new_heap(kUserHeapUser | kUserHeapRw);
+ process.Leak().HeapPtr = sched_new_heap(kUserHeapUser | kUserHeapRw);
}
else if (process.Leak().Kind == ProcessHeader::kShLibKind)
{
- process.Leak().HeapPtr = rt_new_heap(kUserHeapUser | kUserHeapRw | kUserHeapShared);
+ process.Leak().SharedLibObjectPtr = rtl_init_shared_object(&process.Leak());
+ process.Leak().HeapPtr = sched_new_heap(kUserHeapUser | kUserHeapRw | kUserHeapShared);
}
else
{
diff --git a/Kernel/Sources/Timer.cxx b/Kernel/Sources/Timer.cxx
index ad43310d..0d56dcae 100644
--- a/Kernel/Sources/Timer.cxx
+++ b/Kernel/Sources/Timer.cxx
@@ -22,7 +22,9 @@ Int32 HardwareTimerInterface::Wait() noexcept
HardwareTimer::HardwareTimer(Int64 seconds)
: fWaitFor(seconds)
{
+ MUST_PASS(fWaitFor > 0);
}
+
HardwareTimer::~HardwareTimer()
{
fWaitFor = 0;
@@ -35,6 +37,7 @@ Int32 HardwareTimer::Wait() noexcept
while (*fDigitalTimer < (*fDigitalTimer + fWaitFor))
{
+ ;
}
return 0;