summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.vscode/c_cpp_properties.json22
-rw-r--r--Kernel/HALKit/AMD64/HalDebugOutput.cxx18
-rw-r--r--Kernel/HALKit/AMD64/HalDescriptorLoader.cxx9
-rw-r--r--Kernel/HALKit/AMD64/HalInstallTIB.asm19
-rw-r--r--Kernel/HALKit/AMD64/HalPageAlloc.hxx4
-rw-r--r--Kernel/HALKit/AMD64/Processor.hxx3
-rw-r--r--Kernel/HALKit/POWER/HalSerialPort.cxx2
-rw-r--r--Kernel/Sources/HalPageAlloc.cxx8
-rw-r--r--Kernel/Sources/ProcessHeap.cxx71
-rw-r--r--Kernel/Sources/ProcessScheduler.cxx8
-rw-r--r--Kernel/Sources/Utils.cxx2
-rw-r--r--Kernel/StorageKit/Storage.hpp20
-rw-r--r--Kernel/amd64-efi.make2
13 files changed, 106 insertions, 82 deletions
diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index 87bb07f6..1c195e89 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -6,9 +6,7 @@
"${workspaceFolder}/Kernel/**",
"${workspaceFolder}/Drv/**",
"${workspaceFolder}/Boot/**",
- "${workspaceFolder}/**",
- "${workspaceFolder}/Usr/Sys/CoreSystem/**",
- "${workspaceFolder}/Usr/Sys/**"
+ "${workspaceFolder}/**"
],
"defines": [
"__MAHROUSS__",
@@ -18,7 +16,8 @@
"__FSKIT_USE_NEWFS__",
"__EFI_x86_64__",
"__ATA_PIO__",
- "__NEWOS_AMD64__"
+ "__NEWOS_AMD64__",
+ "__DEBUG__"
],
"cStandard": "c17",
"cppStandard": "c++20",
@@ -26,22 +25,12 @@
"intelliSenseMode": "gcc-x64"
},
{
- "name": "AppDev ",
- "includePath": ["${workspaceFolder}/Usr/Developer/**"],
- "defines": [],
- "cStandard": "c17",
- "cppStandard": "c++20",
- "intelliSenseMode": "gcc-x64"
- },
- {
"name": "MicroKernel (Windows)",
"includePath": [
"${workspaceFolder}/Drv/**",
"${workspaceFolder}/Kernel/**",
"${workspaceFolder}/Boot/**",
- "${workspaceFolder}/**",
- "${workspaceFolder}/Usr/Sys/CoreSystem/**",
- "${workspaceFolder}/Usr/Sys/**"
+ "${workspaceFolder}/**"
],
"defines": [
"__MAHROUSS__",
@@ -51,7 +40,8 @@
"__FSKIT_USE_NEWFS__",
"__EFI_x86_64__",
"__ATA_PIO__",
- "__NEWOS_AMD64__"
+ "__NEWOS_AMD64__",
+ "__DEBUG__"
],
"cStandard": "c17",
"cppStandard": "c++20",
diff --git a/Kernel/HALKit/AMD64/HalDebugOutput.cxx b/Kernel/HALKit/AMD64/HalDebugOutput.cxx
index 9e3dfcd8..36ae96b0 100644
--- a/Kernel/HALKit/AMD64/HalDebugOutput.cxx
+++ b/Kernel/HALKit/AMD64/HalDebugOutput.cxx
@@ -27,7 +27,7 @@ namespace Kernel
/// @brief Init COM1.
/// @return
- bool serial_init() noexcept
+ bool hal_serial_init() noexcept
{
#ifdef __DEBUG__
if (kState == kStateReady || kState == kStateTransmit)
@@ -64,7 +64,7 @@ namespace Kernel
EXTERN_C void ke_io_write(const char* bytes)
{
#ifdef __DEBUG__
- Detail::serial_init();
+ Detail::hal_serial_init();
if (!bytes || Detail::kState != kStateReady)
return;
@@ -74,18 +74,10 @@ namespace Kernel
Detail::kState = kStateTransmit;
SizeT index = 0;
- SizeT len = rt_string_len(bytes, 0);
-
- const auto cColor = "\x1b[1;32m";
- SizeT lenClr = rt_string_len(cColor, 0);
-
- while (index < lenClr)
- {
- HAL::Out8(Detail::PORT, cColor[index]);
- ++index;
- }
+ SizeT len = 0;
index = 0;
+ len = rt_string_len(bytes, 255);
while (index < len)
{
@@ -103,7 +95,7 @@ namespace Kernel
EXTERN_C void ke_io_read(const char* bytes)
{
#ifdef __DEBUG__
- Detail::serial_init();
+ Detail::hal_serial_init();
if (!bytes || Detail::kState != kStateReady)
return;
diff --git a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx
index d0ac4e12..7ded9259 100644
--- a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -61,13 +61,14 @@ namespace Kernel::HAL
{
MUST_PASS(baseIdt[i]);
- Detail::kInterruptVectorTable[i].Selector = kGdtCodeSelector;
+ Detail::kInterruptVectorTable[i].Selector = (i == kSyscallRoute) ? ((3 * 8) | 3) : kGdtCodeSelector;
Detail::kInterruptVectorTable[i].Ist = 0x0;
Detail::kInterruptVectorTable[i].TypeAttributes = kInterruptGate;
- Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & 0xFFFF);
- Detail::kInterruptVectorTable[i].OffsetMid = (((UIntPtr)baseIdt[i] >> 16) & 0xFFFF);
+ Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & __INT16_MAX__);
+ Detail::kInterruptVectorTable[i].OffsetMid = (((UIntPtr)baseIdt[i] >> 16) & __INT16_MAX__);
Detail::kInterruptVectorTable[i].OffsetHigh =
- (((UIntPtr)baseIdt[i] >> 32) & 0xFFFFFFFF);
+ (((UIntPtr)baseIdt[i] >> 32) & __INT32_MAX__);
+
Detail::kInterruptVectorTable[i].Zero = 0x0;
}
diff --git a/Kernel/HALKit/AMD64/HalInstallTIB.asm b/Kernel/HALKit/AMD64/HalInstallTIB.asm
index 477018c0..00fe2ad8 100644
--- a/Kernel/HALKit/AMD64/HalInstallTIB.asm
+++ b/Kernel/HALKit/AMD64/HalInstallTIB.asm
@@ -22,3 +22,22 @@ rt_install_tib:
ret
;; //////////////////////////////////////////////////// ;;
+
+[global rt_jump_user_mode]
+
+;; @used rcx, address to jump on.
+;; @note adjusted for long mode.
+rt_jump_user_mode:
+ mov ax, (6 * 8) | 3 ; user data segment with RPL 3
+ mov ds, ax
+ mov es, ax
+ mov fs, ax
+ mov gs, ax ; SS is handled by iret
+
+ mov rax, rsp
+ push (6 * 8) | 3
+ push rax
+ pushf
+ push (5 * 8) | 3
+ push rcx
+ iretq
diff --git a/Kernel/HALKit/AMD64/HalPageAlloc.hxx b/Kernel/HALKit/AMD64/HalPageAlloc.hxx
index 3166a46e..6e05e58e 100644
--- a/Kernel/HALKit/AMD64/HalPageAlloc.hxx
+++ b/Kernel/HALKit/AMD64/HalPageAlloc.hxx
@@ -26,6 +26,10 @@
#define kPTESize (0x1000)
#endif // !kPTESize
+#ifndef kAlign
+#define kAlign __BIGGEST_ALIGNMENT__
+#endif // !kAlign
+
EXTERN_C void hal_flush_tlb();
EXTERN_C void hal_write_cr3(Kernel::UIntPtr pde);
EXTERN_C void hal_write_cr0(Kernel::UIntPtr bit);
diff --git a/Kernel/HALKit/AMD64/Processor.hxx b/Kernel/HALKit/AMD64/Processor.hxx
index 9571cbfe..92b91c70 100644
--- a/Kernel/HALKit/AMD64/Processor.hxx
+++ b/Kernel/HALKit/AMD64/Processor.hxx
@@ -30,6 +30,8 @@ EXTERN_C
#define kCPUBackendName "AMD64"
+#define kSyscallRoute 0x32
+
#define IsActiveLow(FLG) (FLG & 2)
#define IsLevelTriggered(FLG) (FLG & 8)
@@ -37,6 +39,7 @@ EXTERN_C
#define kTrapGate (0xEF)
#define kTaskGate (0b10001100)
#define kGdtCodeSelector (0x08)
+#define kGdtUserCodeSelector (0x10)
#define cHeapStartOffset (0x10000000)
namespace Kernel
diff --git a/Kernel/HALKit/POWER/HalSerialPort.cxx b/Kernel/HALKit/POWER/HalSerialPort.cxx
index 3c62824b..86b43bb7 100644
--- a/Kernel/HALKit/POWER/HalSerialPort.cxx
+++ b/Kernel/HALKit/POWER/HalSerialPort.cxx
@@ -17,7 +17,7 @@ void ke_io_write(const Char* bytes)
return;
SizeT index = 0;
- SizeT len = rt_string_len(bytes, 0);
+ SizeT len = rt_string_len(bytes, 255);
while (index < len)
{
diff --git a/Kernel/Sources/HalPageAlloc.cxx b/Kernel/Sources/HalPageAlloc.cxx
index dad70f02..75e31e86 100644
--- a/Kernel/Sources/HalPageAlloc.cxx
+++ b/Kernel/Sources/HalPageAlloc.cxx
@@ -29,7 +29,7 @@ namespace Kernel
Boolean Present;
Boolean ReadWrite;
Boolean User;
- SizeT PageSize;
+ SizeT Size;
};
struct VirtualMemoryHeaderTraits
@@ -39,7 +39,7 @@ namespace Kernel
/// @return
VirtualMemoryHeader* Next(VirtualMemoryHeader* current)
{
- return current + sizeof(PTE) + current->PageSize;
+ return current + sizeof(VirtualMemoryHeader) + current->Size;
}
/// @brief Get previous header.
@@ -47,7 +47,7 @@ namespace Kernel
/// @return
VirtualMemoryHeader* Prev(VirtualMemoryHeader* current)
{
- return current - sizeof(PTE) - current->PageSize;
+ return current - sizeof(VirtualMemoryHeader) - current->Size;
}
};
} // namespace Detail
@@ -80,7 +80,7 @@ namespace Kernel
vmHeader->Present = true;
vmHeader->ReadWrite = rw;
vmHeader->User = user;
- vmHeader->PageSize = size;
+ vmHeader->Size = size;
kAllocationInProgress = false;
diff --git a/Kernel/Sources/ProcessHeap.cxx b/Kernel/Sources/ProcessHeap.cxx
index 4a2205e6..86ac1554 100644
--- a/Kernel/Sources/ProcessHeap.cxx
+++ b/Kernel/Sources/ProcessHeap.cxx
@@ -22,7 +22,7 @@ namespace Kernel
* @brief Process Heap Header
* @note Allocated per process, it denotes the user's heap.
*/
- struct UserHeapHeader final
+ struct PROCESS_HEAP_HEADER final
{
UInt32 fMagic;
Int32 fFlags;
@@ -30,35 +30,38 @@ namespace Kernel
UInt8 fPadding[kHeapHeaderPaddingSz];
};
+ /// @brief PROCESS_HEAP_HEADER as pointer type.
+ typedef PROCESS_HEAP_HEADER* PROCESS_HEAP_HEADER_PTR;
+
/**
- * @brief User Heap Manager class, takes care of allocating the process pools.
+ * @brief Process heap class, takes care of allocating the process pools.
* @note This rely on Virtual Memory! Consider adding good vmem support when
* @note porting to a new arch.
*/
- class UserHeapManager final
+ class ProcessHeapHelper final
{
- UserHeapManager() = delete;
+ ProcessHeapHelper() = delete;
public:
- ~UserHeapManager() = default;
+ ~ProcessHeapHelper() = default;
public:
- STATIC SizeT& Count()
+ STATIC SizeT& Count() noexcept
{
return s_NumPools;
}
- STATIC Ref<Pmm>& Leak()
+ STATIC Ref<Pmm>& Leak() noexcept
{
return s_Pmm;
}
- STATIC Boolean& IsEnabled()
+ STATIC Boolean& IsEnabled() noexcept
{
return s_PoolsAreEnabled;
}
- STATIC MutableArray<Ref<PTEWrapper>>& The()
+ STATIC MutableArray<Ref<PTEWrapper>>& The() noexcept
{
return s_Pool;
}
@@ -74,10 +77,10 @@ namespace Kernel
//! declare fields
- SizeT UserHeapManager::s_NumPools = 0UL;
- Ref<Pmm> UserHeapManager::s_Pmm;
- Boolean UserHeapManager::s_PoolsAreEnabled = true;
- MutableArray<Ref<PTEWrapper>> UserHeapManager::s_Pool;
+ SizeT ProcessHeapHelper::s_NumPools = 0UL;
+ Ref<Pmm> ProcessHeapHelper::s_Pmm;
+ Boolean ProcessHeapHelper::s_PoolsAreEnabled = true;
+ MutableArray<Ref<PTEWrapper>> ProcessHeapHelper::s_Pool;
STATIC VoidPtr ke_find_unused_heap(Int32 flags);
STATIC Void ke_free_heap_internal(VoidPtr vaddr);
@@ -91,15 +94,15 @@ namespace Kernel
{
for (SizeT index = 0; index < kUserHeapMaxSz; ++index)
{
- if (UserHeapManager::The()[index] &&
- !UserHeapManager::The()[index].Leak().Leak().Present())
+ if (ProcessHeapHelper::The()[index] &&
+ !ProcessHeapHelper::The()[index].Leak().Leak().Present())
{
- UserHeapManager::Leak().Leak().TogglePresent(
- UserHeapManager::The()[index].Leak().Leak(), true);
+ ProcessHeapHelper::Leak().Leak().TogglePresent(
+ ProcessHeapHelper::The()[index].Leak().Leak(), true);
kcout << "[ke_find_unused_heap] Done, trying to make a pool now...\r";
return ke_make_heap_internal(
- (VoidPtr)UserHeapManager::The()[index].Leak().Leak().VirtualAddress(),
+ (VoidPtr)ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress(),
flags);
}
}
@@ -115,7 +118,7 @@ namespace Kernel
{
if (virtualAddress)
{
- UserHeapHeader* poolHdr = reinterpret_cast<UserHeapHeader*>(virtualAddress);
+ PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast<PROCESS_HEAP_HEADER*>(virtualAddress);
if (!poolHdr->fFree)
{
@@ -130,7 +133,7 @@ namespace Kernel
kcout << "[ke_make_heap_internal] New allocation has been done.\n";
return reinterpret_cast<VoidPtr>(
- (reinterpret_cast<UIntPtr>(virtualAddress) + sizeof(UserHeapHeader)));
+ (reinterpret_cast<UIntPtr>(virtualAddress) + sizeof(PROCESS_HEAP_HEADER)));
}
kcout << "[ke_make_heap_internal] Address is invalid";
@@ -143,8 +146,8 @@ namespace Kernel
/// @return
STATIC Void ke_free_heap_internal(VoidPtr virtualAddress)
{
- UserHeapHeader* poolHdr = reinterpret_cast<UserHeapHeader*>(
- reinterpret_cast<UIntPtr>(virtualAddress) - sizeof(UserHeapHeader));
+ PROCESS_HEAP_HEADER* poolHdr = reinterpret_cast<PROCESS_HEAP_HEADER*>(
+ reinterpret_cast<UIntPtr>(virtualAddress) - sizeof(PROCESS_HEAP_HEADER));
if (poolHdr->fMagic == kUserHeapMag)
{
@@ -170,18 +173,18 @@ namespace Kernel
*/
STATIC Boolean ke_check_and_free_heap(const SizeT& index, VoidPtr ptr)
{
- if (UserHeapManager::The()[index])
+ if (ProcessHeapHelper::The()[index])
{
// ErrorOr<>::operator Boolean
/// if (address matches)
/// -> Free heap.
- if (UserHeapManager::The()[index].Leak().Leak().VirtualAddress() ==
+ if (ProcessHeapHelper::The()[index].Leak().Leak().VirtualAddress() ==
(UIntPtr)ptr)
{
- UserHeapManager::Leak().Leak().FreePage(
- UserHeapManager::The()[index].Leak().Leak());
+ ProcessHeapHelper::Leak().Leak().FreePage(
+ ProcessHeapHelper::The()[index].Leak().Leak());
- --UserHeapManager::Count();
+ --ProcessHeapHelper::Count();
ke_free_heap_internal(ptr);
ptr = nullptr;
@@ -198,24 +201,24 @@ namespace Kernel
/// @return a pool pointer with selected permissions.
VoidPtr rt_new_heap(Int32 flags)
{
- if (!UserHeapManager::IsEnabled())
+ if (!ProcessHeapHelper::IsEnabled())
return nullptr;
- if (UserHeapManager::Count() > kUserHeapMaxSz)
+ if (ProcessHeapHelper::Count() > kUserHeapMaxSz)
return nullptr;
if (VoidPtr ret = ke_find_unused_heap(flags))
return ret;
// this wasn't set to true
- auto ref_page = UserHeapManager::Leak().Leak().RequestPage(
+ auto ref_page = ProcessHeapHelper::Leak().Leak().RequestPage(
((flags & kUserHeapUser)), (flags & kUserHeapRw));
if (ref_page)
{
///! reserve page.
- UserHeapManager::The()[UserHeapManager::Count()].Leak() = ref_page;
- auto& ref = UserHeapManager::Count();
+ ProcessHeapHelper::The()[ProcessHeapHelper::Count()].Leak() = ref_page;
+ auto& ref = ProcessHeapHelper::Count();
++ref; // increment the number of addresses we have now.
@@ -232,12 +235,12 @@ namespace Kernel
/// @return status code
Int32 rt_free_heap(VoidPtr ptr)
{
- if (!UserHeapManager::IsEnabled())
+ if (!ProcessHeapHelper::IsEnabled())
return -1;
if (ptr)
{
- SizeT base = UserHeapManager::Count();
+ SizeT base = ProcessHeapHelper::Count();
if (ke_check_and_free_heap(base, ptr))
return 0;
diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx
index 8119c11e..bfa6fddf 100644
--- a/Kernel/Sources/ProcessScheduler.cxx
+++ b/Kernel/Sources/ProcessScheduler.cxx
@@ -43,10 +43,16 @@ namespace Kernel
void ProcessHeader::Crash()
{
- kcout << (*this->Name == 0 ? "Unknown" : this->Name) << ": crashed. (id = ";
+ kcout << (*this->Name == 0 ? "Kernel" : this->Name) << ": crashed. (id = ";
kcout.Number(kErrorProcessFault);
kcout << ")\r";
+ if (Kernel::ProcessScheduler::The().Leak().CurrentTeam().AsArray().Count() < 1)
+ {
+ kcout << "*** BAD PROCESS ***\rTerminating as we are the only process...\r";
+ ke_stop(RUNTIME_CHECK_PROCESS);
+ }
+
this->Exit(kErrorProcessFault);
}
diff --git a/Kernel/Sources/Utils.cxx b/Kernel/Sources/Utils.cxx
index 12e2e2a8..eeac3f93 100644
--- a/Kernel/Sources/Utils.cxx
+++ b/Kernel/Sources/Utils.cxx
@@ -37,7 +37,7 @@ namespace Kernel
{
if (len > _len)
{
- break;
+ return 0;
}
++len;
diff --git a/Kernel/StorageKit/Storage.hpp b/Kernel/StorageKit/Storage.hpp
index 981463ab..aa9e335e 100644
--- a/Kernel/StorageKit/Storage.hpp
+++ b/Kernel/StorageKit/Storage.hpp
@@ -6,11 +6,17 @@
#pragma once
-#include <NewKit/Defines.hpp>
-#include <StorageKit/NVME.hxx>
-#include <StorageKit/AHCI.hpp>
-#include <StorageKit/SCSI.hxx>
+#define kDriveSectorSizeHDD (512)
+#define kDriveSectorSizeSSD (4096)
+#define kDriveSectorSizeOptical (2048)
-#define kDriveSectorSizeHDD (512)
-#define kDriveSectorSizeSSD (4096)
-#define kDriveSectorSizeCDROM (2048)
+namespace Kernel
+{
+ template <typename T>
+ class DeviceInterface;
+
+ class NVMEDeviceInterface;
+ class AHCIDeviceInterface;
+ class ATADeviceInterface;
+ class SCSIDeviceInterface;
+} // namespace Kernel
diff --git a/Kernel/amd64-efi.make b/Kernel/amd64-efi.make
index be59f2e9..e59034c9 100644
--- a/Kernel/amd64-efi.make
+++ b/Kernel/amd64-efi.make
@@ -6,7 +6,7 @@
CC = x86_64-w64-mingw32-g++
LD = x86_64-w64-mingw32-ld
CCFLAGS = -fshort-wchar -c -fPIC -ffreestanding -D__NEWOS_AMD64__ -mno-red-zone -fno-rtti -fno-exceptions \
- -std=c++20 -D__NEWOS_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./
+ -std=c++20 -D__NEWOS_SUPPORT_NX__ -I../Vendor -D__FSKIT_USE_NEWFS__ -D__KERNEL__ -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -I./
ASM = nasm