summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-04 17:47:13 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-04 17:48:40 +0200
commitfb0ca452cda3bdc4a13f278c115f2dcd9360d818 (patch)
tree788411aebd30ed446cb8c4bb5756a3e937c08f0a /Kernel
parent34bb37c9a464ab0dfccfa5ff217a283e36b32693 (diff)
[IMP] [MHR-39] Ticket done.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
-rw-r--r--Kernel/HALKit/AMD64/HalDescriptorLoader.cxx2
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx53
-rw-r--r--Kernel/Modules/CoreCG/TextRenderer.hxx3
-rw-r--r--Kernel/Sources/KernelCheck.cxx22
-rw-r--r--Kernel/Sources/Main.cxx159
5 files changed, 46 insertions, 193 deletions
diff --git a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx
index 62d31a40..99776265 100644
--- a/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx
+++ b/Kernel/HALKit/AMD64/HalDescriptorLoader.cxx
@@ -61,7 +61,7 @@ namespace Kernel::HAL
{
MUST_PASS(baseIdt[i]);
- Detail::kInterruptVectorTable[i].Selector = (i == kSyscallRoute) ? ((3 * 8) | 3) : kGdtCodeSelector;
+ Detail::kInterruptVectorTable[i].Selector = kGdtCodeSelector;
Detail::kInterruptVectorTable[i].Ist = 0x0;
Detail::kInterruptVectorTable[i].TypeAttributes = kInterruptGate;
Detail::kInterruptVectorTable[i].OffsetLow = ((UIntPtr)baseIdt[i] & __INT16_MAX__);
diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx
index 0ed63569..020ee59d 100644
--- a/Kernel/HALKit/AMD64/HalKernelMain.cxx
+++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx
@@ -21,16 +21,9 @@
#include <CFKit/Property.hxx>
#include <Modules/CoreCG/TextRenderer.hxx>
-#define mInitKernel(X) \
- X; \
- Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
-
Kernel::Property cKernelVersion;
Kernel::Property cAutoFormatDisk;
-/// @brief This symbol is the kernel main symbol.
-EXTERN_C void KeMain();
-
EXTERN_C Kernel::VoidPtr kInterruptVectorTable[];
struct HEAP_ALLOC_INFO final
@@ -72,6 +65,8 @@ STATIC Kernel::HAL::Detail::NewOSGDT cGdt = {
{0, 0, 0, 0x92, 0xaf, 0}, // user data
};
+void hal_real_init(void);
+
EXTERN_C void hal_init_platform(
Kernel::HEL::HandoverInformationHeader* HandoverHeader)
{
@@ -87,17 +82,23 @@ EXTERN_C void hal_init_platform(
cg_write_text("NEWOSKRNL (C) ZKA TECHNOLOGIES.", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
kTextOffsetY += 10;
-
cg_write_text("SMP OS (MAX 8 CORES).", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
- kKernelVirtualSize = HandoverHeader->f_VirtualSize;
+ hal_real_init();
+}
+
+void hal_real_init(void)
+{
+ kKernelVirtualSize = kHandoverHeader->f_VirtualSize;
kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>(
- reinterpret_cast<Kernel::UIntPtr>(HandoverHeader->f_VirtualStart) + cHeapStartOffset);
+ reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart) + cHeapStartOffset);
- kKernelPhysicalStart = HandoverHeader->f_PhysicalStart;
+ kKernelPhysicalStart = kHandoverHeader->f_PhysicalStart;
- // Load memory descriptors.
+ kTextOffsetY += 10;
+ cg_write_text("LOADING INTERRUPTS...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
+ // Load memory descriptors.
Kernel::HAL::RegisterGDT gdtBase;
gdtBase.Base = reinterpret_cast<Kernel::UIntPtr>(&cGdt);
@@ -117,6 +118,9 @@ EXTERN_C void hal_init_platform(
// Register the basic SCI functions.
+ kTextOffsetY += 10;
+ cg_write_text("LOADING SYSCALLS...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
+
constexpr auto cVGAWrite = 0x10;
constexpr auto cTlsInterrupt = 0x11;
constexpr auto cTlsInstallInterrupt = 0x12;
@@ -226,17 +230,8 @@ EXTERN_C void hal_init_platform(
kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true;
kSyscalls[cLPCSanitizeMsg].Leak().Leak()->fHooked = true;
- // newoskrnl version 1.00.
- Kernel::StringView strVer(cMaxPropLen);
- strVer += "\\Properties\\KernelVersion";
-
- cKernelVersion.GetKey() = strVer;
- cKernelVersion.GetValue() = __MAHROUSS_VER__;
-
- Kernel::StringView strAutoMount(cMaxPropLen);
- strAutoMount += "\\Properties\\AutoMountFS?";
-
- cAutoFormatDisk.GetKey() = strAutoMount;
+ kTextOffsetY += 10;
+ cg_write_text("LOADING SMP...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
for (size_t i = 0; i < cMaxCmdLine; i++)
{
@@ -247,14 +242,8 @@ EXTERN_C void hal_init_platform(
}
}
- for (size_t i = 0; i < cMaxCmdLine; i++)
- {
- if (Kernel::rt_string_cmp(kHandoverHeader->f_CommandLine[i], "/SMP", Kernel::rt_string_len("/SMP")) == 0)
- {
- Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
- break;
- }
- }
+ kTextOffsetY += 10;
+ cg_write_text("LOADING SUBSYSTEMS...", kTextOffsetY, 10, RGB(0x00, 0x00, 0x00));
- mInitKernel(KeMain());
+ Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP);
}
diff --git a/Kernel/Modules/CoreCG/TextRenderer.hxx b/Kernel/Modules/CoreCG/TextRenderer.hxx
index 2ea46b3f..eada9b9f 100644
--- a/Kernel/Modules/CoreCG/TextRenderer.hxx
+++ b/Kernel/Modules/CoreCG/TextRenderer.hxx
@@ -166,7 +166,8 @@ inline Kernel::Void cg_write_text(const Kernel::Char* text, Kernel::Int32 x_dst,
if (text[i] == '\r' ||
text[i] == '\n')
{
- x_dst += FONT_SIZE_X;
+ y_dst += FONT_SIZE_Y;
+
continue;
}
diff --git a/Kernel/Sources/KernelCheck.cxx b/Kernel/Sources/KernelCheck.cxx
index d33002bd..defe6841 100644
--- a/Kernel/Sources/KernelCheck.cxx
+++ b/Kernel/Sources/KernelCheck.cxx
@@ -11,6 +11,10 @@
#include <FirmwareKit/Handover.hxx>
#include <Modules/ACPI/ACPIFactoryInterface.hxx>
+#include <Modules/CoreCG/Accessibility.hxx>
+#include <Modules/CoreCG/FbRenderer.hxx>
+#include <Modules/CoreCG/TextRenderer.hxx>
+
EXTERN_C [[noreturn]] Kernel::Void ke_wait_for_debugger()
{
while (Yes)
@@ -29,6 +33,24 @@ namespace Kernel
{
void ke_stop(const Kernel::Int& id)
{
+ CGInit();
+
+ auto panicBack = RGB(0xDC, 0xF5, 0xF5);
+ auto panicTxt = RGB(0, 0, 0);
+
+ CGDrawInRegion(panicBack, UIAccessibilty::The().Height(), UIAccessibilty::The().Width(), 0, 0);
+
+ auto start_y = 10;
+ auto x = 10;
+
+ cg_write_text("*** Kernel panic! ***\rnewoskrnl.dll stopped working properly so we had to shut it down.", start_y, x, panicTxt);
+
+ CGFini();
+
+ // ******* //
+ // shows in debug only.
+ // ******* //
+
kcout << "*** STOP *** \r";
kcout << "*** Kernel has trigerred a runtime stop. *** \r";
diff --git a/Kernel/Sources/Main.cxx b/Kernel/Sources/Main.cxx
deleted file mode 100644
index ac6d3fe7..00000000
--- a/Kernel/Sources/Main.cxx
+++ /dev/null
@@ -1,159 +0,0 @@
-/* -------------------------------------------
-
- Copyright ZKA Technologies
-
- File: Main.cxx
- Purpose: Main entrypoint of kernel.
-
-------------------------------------------- */
-
-#include <ArchKit/ArchKit.hxx>
-#include <Modules/CoreCG/FbRenderer.hxx>
-#include <CompilerKit/Detail.hxx>
-#include <FirmwareKit/Handover.hxx>
-#include <KernelKit/FileManager.hxx>
-#include <KernelKit/Framebuffer.hxx>
-#include <KernelKit/Heap.hxx>
-#include <KernelKit/PEF.hxx>
-#include <KernelKit/PEFCodeManager.hxx>
-#include <KernelKit/ProcessScheduler.hxx>
-#include <KernelKit/ProcessHeap.hxx>
-#include <NewKit/Json.hxx>
-#include <NewKit/KernelCheck.hxx>
-#include <NewKit/String.hxx>
-#include <NewKit/Utils.hxx>
-#include <KernelKit/CodeManager.hxx>
-#include <CFKit/Property.hxx>
-
-EXTERN Kernel::Property cKernelVersion;
-EXTERN Kernel::Property cAutoFormatDisk;
-
-namespace Kernel::Detail
-{
- /// @brief Filesystem auto formatter, additional checks are also done by the class.
- class FilesystemInstaller final
- {
- Kernel::NewFilesystemManager* fNewFS{nullptr};
-
- public:
- /// @brief wizard constructor.
- explicit FilesystemInstaller()
- {
- if (cAutoFormatDisk.GetValue() == No)
- {
- return;
- }
-
- if (Kernel::FilesystemManagerInterface::GetMounted())
- {
- // Partition is mounted, cool!
- Kernel::kcout
- << "newoskrnl: No need to create for a new NewFS (EPM) partition here...\r";
- }
- else
- {
- // Mounts a NewFS from main drive.
- fNewFS = new Kernel::NewFilesystemManager();
-
- Kernel::FilesystemManagerInterface::Mount(fNewFS);
-
- if (fNewFS->GetParser())
- {
- constexpr auto cFolderInfo = "META-INF";
- const auto cDirCount = 7;
- const char* cDirStr[cDirCount] = {
- "\\Boot\\", "\\System\\", "\\Support\\", "\\Applications\\",
- "\\Users\\", "\\Library\\", "\\Mounted\\"};
-
- for (Kernel::SizeT dirIndx = 0UL; dirIndx < cDirCount; ++dirIndx)
- {
- auto catalogDir = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]);
-
- if (catalogDir)
- {
- Kernel::kcout << "newoskrnl: already exists.\r";
-
- delete catalogDir;
- continue;
- }
-
- catalogDir = fNewFS->GetParser()->CreateCatalog(cDirStr[dirIndx], 0,
- kNewFSCatalogKindDir);
-
- NFS_FORK_STRUCT theFork{0};
-
- const Kernel::Char* cSrcName = cFolderInfo;
-
- Kernel::rt_copy_memory((Kernel::VoidPtr)(cSrcName), theFork.ForkName,
- Kernel::rt_string_len(cSrcName));
-
- Kernel::rt_copy_memory((Kernel::VoidPtr)(catalogDir->Name),
- theFork.CatalogName,
- Kernel::rt_string_len(catalogDir->Name));
-
- delete catalogDir;
-
- theFork.DataSize = kNewFSForkSize;
- theFork.ResourceId = 0;
- theFork.ResourceKind = Kernel::kNewFSRsrcForkKind;
- theFork.Kind = Kernel::kNewFSDataForkKind;
-
- Kernel::StringView metadataFolder(kNewFSSectorSz);
-
- metadataFolder +=
- "<!properties/>\r<p>Kind: folder</p>\r<p>Created by: system</p>\r<p>Edited by: "
- "system</p>\r<p>Volume Type: ZKA Filesystem</p>\r";
-
- metadataFolder += "<p>Path: ";
- metadataFolder += cDirStr[dirIndx];
- metadataFolder += "</p>\r";
-
- const Kernel::SizeT metadataSz = kNewFSSectorSz;
-
- auto catalogSystem = fNewFS->GetParser()->GetCatalog(cDirStr[dirIndx]);
-
- fNewFS->GetParser()->CreateFork(catalogSystem, theFork);
-
- fNewFS->GetParser()->WriteCatalog(
- catalogSystem, (Kernel::VoidPtr)(metadataFolder.CData()),
- metadataSz, cFolderInfo);
-
- delete catalogSystem;
- }
- }
- }
- }
-
- ~FilesystemInstaller() = default;
-
- NEWOS_COPY_DEFAULT(FilesystemInstaller);
-
- /// @brief Grab the disk's NewFS reference.
- /// @return NewFilesystemManager the filesystem interface
- Kernel::NewFilesystemManager* Leak()
- {
- return fNewFS;
- }
- };
-
- /// @brief Loads necessary servers for the kernel -> user mode switch.
- /// @param void no args.
- /// @return void no return value.
- STATIC Kernel::Void ke_user_switch(Kernel::Void)
- {
- Kernel::UserManager::The()->fRootUser = new User(RingKind::kRingSuperUser, kSuperUser);
- Kernel::UserManager::The()->LogIn(Kernel::UserManager::The()->fRootUser, "root");
-
- Kernel::kcout << "newoskrnl: " << cKernelVersion.GetKey().CData() << ": " << Kernel::number(cKernelVersion.GetValue()) << Kernel::endl;
- }
-} // namespace Kernel::Detail
-
-/// @brief Application entrypoint.
-/// @param Void
-/// @return Void
-EXTERN_C Kernel::Void KeMain(Kernel::Void)
-{
- /// Now run kernel loop, until no process are running.
- Kernel::Detail::FilesystemInstaller(); // automatic filesystem creation.
- Kernel::Detail::ke_user_switch();
-}