From 650fee520f526d9cd5ffa75735bd94d5140dd247 Mon Sep 17 00:00:00 2001 From: Amlal Date: Sat, 20 Jul 2024 08:43:16 +0200 Subject: [IMP] See below. - Revoke OTA flag for now inside bootloader (newosldr #4) - Rework Comm as SCI (System Call Interface) (newoskrnl #3) - Rework and fix some parts of the scheduler (newoskrnl #2) - Return from thread when region is zero (newosldr #1) - Separate allocation functions and c++ runtime from each other. (DDK #5) - Rename kHartStandard to kStandard (newoskrnl #6) Signed-off-by: Amlal --- Boot/Sources/HEL/AMD64/BootMain.cxx | 2 +- Boot/Sources/ProgramLoader.cxx | 26 ++-- Boot/amd64-efi.make | 2 +- Comm/compile_flags.txt | 4 - Comm/herror.hxx | 52 -------- Comm/newstd.hxx | 123 ------------------- DDK/KernelAlloc.c | 26 ++++ DDK/KernelCxxRt.cxx | 29 +++++ DDK/KernelStdCxx.cc | 36 ------ Drivers/Hello/Hello.c | 131 --------------------- Drivers/Hello/Main.c | 131 +++++++++++++++++++++ Drivers/Hello/x86_64.mk | 2 +- Drivers/SampleDriver/Main.c | 20 ++++ Drivers/SampleDriver/SampleDriver.c | 20 ---- Drivers/VideoDrv/Main.cxx | 22 ++++ Drivers/VideoDrv/VideoDrv.cxx | 22 ---- .../HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx | 10 +- Kernel/KernelKit/ProcessHeap.hxx | 2 +- Kernel/KernelKit/ProcessScheduler.hxx | 24 ++-- Kernel/KernelKit/RLE.hxx | 3 + Kernel/Sources/ProcessScheduler.cxx | 20 ++-- Kernel/Sources/SMPManager.cxx | 14 ++- SCI/ErrorTypes.hxx | 52 ++++++++ SCI/Hint.hxx | 23 ++++ SCI/StandardInterface.hxx | 123 +++++++++++++++++++ SCI/compile_flags.txt | 4 + newoskrnl.files | 10 +- 27 files changed, 498 insertions(+), 435 deletions(-) delete mode 100644 Comm/compile_flags.txt delete mode 100644 Comm/herror.hxx delete mode 100644 Comm/newstd.hxx create mode 100644 DDK/KernelAlloc.c create mode 100644 DDK/KernelCxxRt.cxx delete mode 100644 DDK/KernelStdCxx.cc delete mode 100644 Drivers/Hello/Hello.c create mode 100644 Drivers/Hello/Main.c create mode 100644 Drivers/SampleDriver/Main.c delete mode 100644 Drivers/SampleDriver/SampleDriver.c create mode 100644 Drivers/VideoDrv/Main.cxx delete mode 100644 Drivers/VideoDrv/VideoDrv.cxx create mode 100644 SCI/ErrorTypes.hxx create mode 100644 SCI/Hint.hxx create mode 100644 SCI/StandardInterface.hxx create mode 100644 SCI/compile_flags.txt diff --git a/Boot/Sources/HEL/AMD64/BootMain.cxx b/Boot/Sources/HEL/AMD64/BootMain.cxx index 8946aadc..95d795ea 100644 --- a/Boot/Sources/HEL/AMD64/BootMain.cxx +++ b/Boot/Sources/HEL/AMD64/BootMain.cxx @@ -245,7 +245,7 @@ EFI_EXTERN_C EFI_API Int Main(EfiHandlePtr ImageHandle, if (loader) loader->Start(handoverHdrPtr); #else - hal_init_platform(handoverHdrPtr); + hal_init_platform(handoverHdrPtr); #endif // ifdef __NEWOS_OTA__ EFI::Stop(); diff --git a/Boot/Sources/ProgramLoader.cxx b/Boot/Sources/ProgramLoader.cxx index 5938c2a0..4ea0d4c6 100644 --- a/Boot/Sources/ProgramLoader.cxx +++ b/Boot/Sources/ProgramLoader.cxx @@ -20,7 +20,7 @@ EXTERN_C namespace Boot { - EXTERN_C Int32 rt_jump_to_address(HEL::HandoverProc baseCode, HEL::HandoverInformationHeader* handover, Char* stackPointer); + EXTERN_C Int32 rt_jump_to_address(HEL::HandoverProc baseCode, HEL::HandoverInformationHeader* handover, Char* stackPointer); ProgramLoader::ProgramLoader(VoidPtr blob) : fBlob(blob), fStartAddress(nullptr) @@ -39,14 +39,14 @@ namespace Boot if (firstBytes[0] == kMagMz0 && firstBytes[1] == kMagMz1) { - writer.Write("newosldr: MZ executable detected.\r"); + writer.Write("newosldr: MZ executable detected.\r"); - ExecHeaderPtr hdrPtr = (ldr_find_exec_header(firstBytes)); - ExecOptionalHeaderPtr optHdr = (ldr_find_opt_exec_header(firstBytes)); + ExecHeaderPtr hdrPtr = (ldr_find_exec_header(firstBytes)); + ExecOptionalHeaderPtr optHdr = (ldr_find_opt_exec_header(firstBytes)); // Parse PE32+ fStartAddress = (VoidPtr)((UIntPtr)optHdr->mImageBase + optHdr->mBaseOfCode + optHdr->mAddressOfEntryPoint); - fStackPtr = new Char[optHdr->mSizeOfStackReserve]; + fStackPtr = new Char[optHdr->mSizeOfStackReserve]; writer.Write("newosldr: Major Linker: ").Write(optHdr->mMajorLinkerVersion).Write("\r"); writer.Write("newosldr: Minor Linker: ").Write(optHdr->mMinorLinkerVersion).Write("\r"); @@ -73,21 +73,21 @@ namespace Boot /// @note handover header has to be valid! Void ProgramLoader::Start(HEL::HandoverInformationHeader* handover) { - BTextWriter writer; + BTextWriter writer; - if (!handover) + if (!handover || + ((Char*)fStartAddress)[0] == 0x0) { - writer.Write("newosldr: Exec format error.\r"); - return; + writer.Write("newosldr: Exec format error.\r"); + return; } writer.Write("newosldr: Trying to run: ").Write(fBlobName).Write("\r"); - if (!fStartAddress || - ((Char*)fStartAddress)[0] == 0x0) + if (!fStartAddress) { - HEL::HandoverProc fn = [](HEL::HandoverInformationHeader* rcx) -> void { - BTextWriter writer; + HEL::HandoverProc fn = [](HEL::HandoverInformationHeader* rcx) -> void { + BTextWriter writer; writer.Write("newosldr: Exec format error, Thread has been aborted.\r"); EFI::ThrowError(L"Exec-Format-Error", L"Format doesn't match (Thread aborted.)"); diff --git a/Boot/amd64-efi.make b/Boot/amd64-efi.make index af5864e2..b9a4fc1a 100644 --- a/Boot/amd64-efi.make +++ b/Boot/amd64-efi.make @@ -52,7 +52,7 @@ REM_FLAG=-f FLAG_ASM=-f win64 FLAG_GNU=-fshort-wchar -D__EFI_x86_64__ -mno-red-zone -D__KERNEL__ -D__NEWBOOT__ \ -DEFI_FUNCTION_WRAPPER -I./ -I../Vendor -I../Kernel -c -nostdlib -fno-rtti -fno-exceptions \ - -std=c++20 -D__NEWOS_OTA__ -D__HAVE_MAHROUSS_APIS__ -D__NEWOS_AMD64__ -D__MAHROUSS__ -D__BOOTLOADER__ + -std=c++20 -D__HAVE_MAHROUSS_APIS__ -D__NEWOS_AMD64__ -D__MAHROUSS__ -D__BOOTLOADER__ BOOT_LOADER=newosldr.exe KERNEL=newoskrnl.exe diff --git a/Comm/compile_flags.txt b/Comm/compile_flags.txt deleted file mode 100644 index 509e3eed..00000000 --- a/Comm/compile_flags.txt +++ /dev/null @@ -1,4 +0,0 @@ --I./ --I../Kernel --I../ --std=c++20 diff --git a/Comm/herror.hxx b/Comm/herror.hxx deleted file mode 100644 index 08fbc81d..00000000 --- a/Comm/herror.hxx +++ /dev/null @@ -1,52 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#pragma once - -#include - -#ifdef __KERNEL__ -#error !!! including header in kernel mode !!! -#endif // __KERNEL__ - -#define ErrLocalIsOk() (kLastError == kErrorSuccess) -#define ErrLocalFailed() (kLastError != kErrorSuccess) -#define ErrLocal() (kLastError) - -typedef SInt32 HError; - -inline constexpr HError kErrorSuccess = 0; -inline constexpr HError kErrorExecutable = 33; -inline constexpr HError kErrorExecutableLib = 34; -inline constexpr HError kErrorFileNotFound = 35; -inline constexpr HError kErrorDirectoryNotFound = 36; -inline constexpr HError kErrorDiskReadOnly = 37; -inline constexpr HError kErrorDiskIsFull = 38; -inline constexpr HError kErrorProcessFault = 39; -inline constexpr HError kErrorSocketHangUp = 40; -inline constexpr HError kErrorThreadLocalStorage = 41; -inline constexpr HError kErrorMath = 42; -inline constexpr HError kErrorNoNetwork = 43; -inline constexpr HError kErrorHeapOutOfMemory = 44; -inline constexpr HError kErrorNoSuchDisk = 45; -inline constexpr HError kErrorFileExists = 46; -inline constexpr HError kErrorFormatFailed = 47; -inline constexpr HError kErrorNetworkTimeout = 48; -inline constexpr HError kErrorInternal = 49; -inline constexpr HError kErrorForkAlreadyExists = 50; -inline constexpr HError kErrorOutOfTeamSlot = 51; -inline constexpr HError kErrorHeapNotPresent = 52; -inline constexpr HError kErrorNoEntrypoint = 53; -inline constexpr HError kErrorDiskIsCorrupted = 54; -inline constexpr HError kErrorDisk = 55; -inline constexpr HError kErrorInvalidData = 56; -inline constexpr HError kErrorAsync = 57; -inline constexpr HError kErrorNonBlocking = 58; -inline constexpr HError kErrorIPC = 59; -inline constexpr HError kErrorSign = 60; -inline constexpr HError kErrorUnimplemented = 0; - -inline HError kLastError = 0; diff --git a/Comm/newstd.hxx b/Comm/newstd.hxx deleted file mode 100644 index d8ef3123..00000000 --- a/Comm/newstd.hxx +++ /dev/null @@ -1,123 +0,0 @@ -/* ------------------------------------------- - -Copyright ZKA Technologies. - -File: newstd.hxx. -Purpose: System Call Interface. - -------------------------------------------- */ - -#ifndef _INC_COMM_NEWSTD_HXX_ -#define _INC_COMM_NEWSTD_HXX_ - -#ifdef __KERNEL__ -#error !!! including header in kernel mode !!! -#endif // __KERNEL__ - -#define IMPORT_CXX extern "C++" -#define IMPORT_C extern "C" - -#define cRestrictR "r" -#define cRestrictRB "rb" -#define cRestrictW "w" -#define cRestrictRW "rw" - -class NSSyscallInterface; /// @brief System call class. - -typedef int OSType; -typedef bool Bool; -typedef void UInt0; - -typedef __UINT64_TYPE__ UInt64; -typedef __UINT32_TYPE__ UInt32; -typedef __UINT16_TYPE__ UInt16; -typedef __UINT8_TYPE__ UInt8; - -typedef __SIZE_TYPE__ SizeT; - -typedef __INT64_TYPE__ SInt64; -typedef __INT32_TYPE__ SInt32; -typedef __INT16_TYPE__ SInt16; -typedef __INT8_TYPE__ SInt8; - -typedef char UTFChar; - -typedef UInt32 PowerID; - -/** - @brief System call class. -*/ -class NSSyscallInterface -{ -public: - explicit NSSyscallInterface() = default; - virtual ~NSSyscallInterface() = default; - - NSSyscallInterface& operator=(const NSSyscallInterface&) = default; - NSSyscallInterface(const NSSyscallInterface&) = default; - -public: - /// @brief disable device. - virtual UInt0 PowerOff(PowerID) = 0; - - /// @brief enable device. - virtual UInt0 PowerOn(PowerID) = 0; - - /// @brief reboot device. - virtual UInt0 PowerReboot(PowerID) = 0; - - /// @brief check if MBCI device is wokeup. - virtual Bool PowerIsWokeup(PowerID) = 0; - - /// @brief probe MBCI/ACPI device from phone. - virtual PowerID PowerProbeDevice(const char* namepace, const int index) = 0; - - // THOSE DOESNT REQUIRE PERMISSIONS FROM THE USER. // - - /// @brief terminate app. - virtual UInt0 Terminate() = 0; - - /// @brief exit thread. - virtual Bool Exit(OSType code) = 0; - - /// @brief alloc pointer. - virtual UInt0* New(long long sz) = 0; - - /// @brief free pointer. - virtual UInt0 Delete(void* ptr) = 0; - - // THOSE MAY REQUIRE PERMISSIONS FROM THE USER. // - - /// @brief Open descriptor. - virtual OSType OpenStorage(const char* path, const char* restr) = 0; - - /// @brief Close descriptor. - virtual UInt0 CloseStorage(OSType descriptorType) = 0; - - /// @brief Execute from shell. - virtual OSType URLExecute(const UTFChar* shellLink) = 0; - - /// @brief Read descriptor. - virtual UInt0* ReadStorage(const UTFChar* cmdNameOrData, SizeT cmdSize, OSType descriptorType) = 0; - - /// @brief Seek in storage file - virtual UInt64 SeekStorage(OSType descriptorType, UInt64 offset) = 0; - - /// @brief Tell storage cursor. - virtual UInt64 TellStorage(OSType descriptorType) = 0; - - /// @brief Remove stored file. - virtual UInt64 RemoveStorage(OSType descriptorType) = 0; - - /// @brief Create stored file. - virtual OSType CreateStorage(const UTFChar* fileName, UInt64 flags) = 0; - - /// @brief Write descriptor. - virtual UInt0* WriteStorage(const UTFChar* cmdNameOrData, SizeT cmdSize, OSType descriptorType) = 0; -}; - -/// @brief Get shared syscall object. -/// @return Syscall implementation. -IMPORT_C NSSyscallInterface* NSGetSharedSyscallInterface(UInt0); - -#endif // ifndef _INC_COMM_NEWSTD_HXX_ diff --git a/DDK/KernelAlloc.c b/DDK/KernelAlloc.c new file mode 100644 index 00000000..6f31ae1c --- /dev/null +++ b/DDK/KernelAlloc.c @@ -0,0 +1,26 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + + Purpose: Standard library. + +------------------------------------------- */ + +#include + +DK_EXTERN void* kernelAlloc(size_t sz) +{ + if (!sz) ++sz; + + void* ptr = kernelCall("NewHeap", 1, &sz, sizeof(size_t)); + kernelCall("ProtectHeap", 1, ptr, sz); + + return ptr; +} + +DK_EXTERN void kernelFree(void* ptr) +{ + if (!ptr) return; + + kernelCall("DeleteHeap", 1, ptr, 0); +} diff --git a/DDK/KernelCxxRt.cxx b/DDK/KernelCxxRt.cxx new file mode 100644 index 00000000..8a5f4c66 --- /dev/null +++ b/DDK/KernelCxxRt.cxx @@ -0,0 +1,29 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + + Purpose: Driver C++ Definitions. + +------------------------------------------- */ + +#include + +void* operator new(size_t sz) +{ + return kernelAlloc(sz); +} + +void operator delete(void* ptr) +{ + kernelFree(ptr); +} + +void* operator new[](size_t sz) +{ + return kernelAlloc(sz); +} + +void operator delete[](void* ptr) +{ + kernelFree(ptr); +} diff --git a/DDK/KernelStdCxx.cc b/DDK/KernelStdCxx.cc deleted file mode 100644 index be5c438d..00000000 --- a/DDK/KernelStdCxx.cc +++ /dev/null @@ -1,36 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - - Purpose: Driver C++ Definitions. - -------------------------------------------- */ - -#include - -void* operator new(size_t sz) -{ - return kernelAlloc(sz); -} - -void operator delete(void* ptr) noexcept -{ - kernelFree(ptr); -} - -DK_EXTERN void* kernelAlloc(size_t sz) -{ - if (!sz) ++sz; - - auto ptr = kernelCall("NewHeap", 1, &sz, sizeof(size_t)); - kernelCall("ProtectHeap", 1, ptr, sz); - - return ptr; -} - -DK_EXTERN void kernelFree(void* ptr) -{ - if (!ptr) return; - - kernelCall("DeleteHeap", 1, ptr, 0); -} diff --git a/Drivers/Hello/Hello.c b/Drivers/Hello/Hello.c deleted file mode 100644 index 10feda48..00000000 --- a/Drivers/Hello/Hello.c +++ /dev/null @@ -1,131 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#include -#include -#include - -struct HelloMasterConfigHeader; -struct HelloMasterConfigHeaderInput; - -struct HelloMasterConfigHeaderInput -{ - size_t fSizeOfOutput; - struct HelloMasterConfigHeader* fOutput; -}; - -/// @file Hello.c -/// @brief Zero configuration protocol, a much more better protocol for zero configuration. - -#define cHMCHMaxDataLength (1024) - -typedef struct HelloMasterConfigHeader -{ - int64_t fMagic; - int64_t fVersion; - int64_t fSourceAddress; - size_t fDataLength; - wchar_t fUTF16Data[cHMCHMaxDataLength]; -} __attribute__((packed)) HelloMasterConfigHeader; - -#define cHMCHDeviceLen 255 - -static kernelDeviceRef cDev = nil; -static char* cDeviceUUID = nil; // 3ed40738-c7d6-4b59-afdf-3c104b05fbf -static HelloMasterConfigHeader* cHeader = nil; - -/// @brief Link to master device to attribute DHCP lease. -static void __hello_link_device(void* a0) -{ - kernelPrintStr("Hello: linking...\r"); - - if (!cDev) - { - // open raw network device. - cDev = kernelOpenDevice("BROADCAST:\\"); - } - - cDev->write("+LINK", kernelStringLength("+LINK")); - cDev->wait(); - - cDev->write((void*)cDeviceUUID, kernelStringLength(cDeviceUUID)); - cDev->wait(); - - if (cHeader) - { - kernelFree(cHeader); - cHeader = nil; - } - - cHeader = cDev->read(nil, sizeof(HelloMasterConfigHeader)); -} - -static void __hello_get_hmch(void* a0) -{ - if (a0 == nil) - return; - - kernelPrintStr("Hello: returning header...\r"); - - struct HelloMasterConfigHeaderInput* in = a0; - in->fOutput = cHeader; - in->fSizeOfOutput = sizeof(in->fOutput); -} - -static void __hello_unlink_device(void* a0) -{ - kernelPrintStr("Hello: unlinking...\r"); - - if (cDev) - { - cDev->write("+UNLINK", kernelStringLength("+UNLINK")); - cDev->wait(); - - /// here is my uuid and my config header. Please disconnect me. - cDev->write((void*)cDeviceUUID, kernelStringLength(cDeviceUUID)); - cDev->write(cHeader, sizeof(cHeader)); - - cDev->wait(); - - kernelCloseDevice(cDev); - cDev = nil; - } - - if (cDeviceUUID) - { - kernelFree((void*)cDeviceUUID); - cDeviceUUID = nil; - } - - cDev = nil; -} - -int __at_enter(void) -{ - kernelPrintStr("Hello: starting up Helloconf...\r"); - - cDeviceUUID = kernelAlloc(sizeof(char) * cHMCHDeviceLen); - - kernelAddSyscall(0, __hello_link_device); - kernelAddSyscall(1, __hello_unlink_device); - kernelAddSyscall(2, __hello_get_hmch); - - return 0; -} - -int __at_exit(void) -{ - kernelPrintStr("Hello: starting up Helloconf...\r"); - - // first unlink. - __hello_unlink_device(nil); - - // then unregister syscalls. - kernelAddSyscall(0, nil); - kernelAddSyscall(1, nil); - - return 0; -} diff --git a/Drivers/Hello/Main.c b/Drivers/Hello/Main.c new file mode 100644 index 00000000..10feda48 --- /dev/null +++ b/Drivers/Hello/Main.c @@ -0,0 +1,131 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include +#include +#include + +struct HelloMasterConfigHeader; +struct HelloMasterConfigHeaderInput; + +struct HelloMasterConfigHeaderInput +{ + size_t fSizeOfOutput; + struct HelloMasterConfigHeader* fOutput; +}; + +/// @file Hello.c +/// @brief Zero configuration protocol, a much more better protocol for zero configuration. + +#define cHMCHMaxDataLength (1024) + +typedef struct HelloMasterConfigHeader +{ + int64_t fMagic; + int64_t fVersion; + int64_t fSourceAddress; + size_t fDataLength; + wchar_t fUTF16Data[cHMCHMaxDataLength]; +} __attribute__((packed)) HelloMasterConfigHeader; + +#define cHMCHDeviceLen 255 + +static kernelDeviceRef cDev = nil; +static char* cDeviceUUID = nil; // 3ed40738-c7d6-4b59-afdf-3c104b05fbf +static HelloMasterConfigHeader* cHeader = nil; + +/// @brief Link to master device to attribute DHCP lease. +static void __hello_link_device(void* a0) +{ + kernelPrintStr("Hello: linking...\r"); + + if (!cDev) + { + // open raw network device. + cDev = kernelOpenDevice("BROADCAST:\\"); + } + + cDev->write("+LINK", kernelStringLength("+LINK")); + cDev->wait(); + + cDev->write((void*)cDeviceUUID, kernelStringLength(cDeviceUUID)); + cDev->wait(); + + if (cHeader) + { + kernelFree(cHeader); + cHeader = nil; + } + + cHeader = cDev->read(nil, sizeof(HelloMasterConfigHeader)); +} + +static void __hello_get_hmch(void* a0) +{ + if (a0 == nil) + return; + + kernelPrintStr("Hello: returning header...\r"); + + struct HelloMasterConfigHeaderInput* in = a0; + in->fOutput = cHeader; + in->fSizeOfOutput = sizeof(in->fOutput); +} + +static void __hello_unlink_device(void* a0) +{ + kernelPrintStr("Hello: unlinking...\r"); + + if (cDev) + { + cDev->write("+UNLINK", kernelStringLength("+UNLINK")); + cDev->wait(); + + /// here is my uuid and my config header. Please disconnect me. + cDev->write((void*)cDeviceUUID, kernelStringLength(cDeviceUUID)); + cDev->write(cHeader, sizeof(cHeader)); + + cDev->wait(); + + kernelCloseDevice(cDev); + cDev = nil; + } + + if (cDeviceUUID) + { + kernelFree((void*)cDeviceUUID); + cDeviceUUID = nil; + } + + cDev = nil; +} + +int __at_enter(void) +{ + kernelPrintStr("Hello: starting up Helloconf...\r"); + + cDeviceUUID = kernelAlloc(sizeof(char) * cHMCHDeviceLen); + + kernelAddSyscall(0, __hello_link_device); + kernelAddSyscall(1, __hello_unlink_device); + kernelAddSyscall(2, __hello_get_hmch); + + return 0; +} + +int __at_exit(void) +{ + kernelPrintStr("Hello: starting up Helloconf...\r"); + + // first unlink. + __hello_unlink_device(nil); + + // then unregister syscalls. + kernelAddSyscall(0, nil); + kernelAddSyscall(1, nil); + + return 0; +} diff --git a/Drivers/Hello/x86_64.mk b/Drivers/Hello/x86_64.mk index 07f41807..4ddb7e5b 100644 --- a/Drivers/Hello/x86_64.mk +++ b/Drivers/Hello/x86_64.mk @@ -20,7 +20,7 @@ REM=rm REM_FLAG=-f FLAG_ASM=-f win64 -FLAG_GNU=-fshort-wchar -fno-rtti -fno-exceptions -D__DDK_AMD64__ -mgeneral-regs-only -mno-red-zone -D__KERNEL__ \ +FLAG_GNU=-fshort-wchar -D__DDK_AMD64__ -mgeneral-regs-only -mno-red-zone -D__KERNEL__ \ -DEFI_FUNCTION_WRAPPER -I../ -I../../ -I./ -c -ffreestanding -std=c17 -D__HAVE_MAHROUSS_APIS__ -D__MAHROUSS__ -D__BOOTLOADER__ -I./ .PHONY: invalid-recipe diff --git a/Drivers/SampleDriver/Main.c b/Drivers/SampleDriver/Main.c new file mode 100644 index 00000000..6b54742f --- /dev/null +++ b/Drivers/SampleDriver/Main.c @@ -0,0 +1,20 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include +#include + +int __ImageStart(void) +{ + kernelPrintStr("SampleDriver: Starting up...\r"); + return 0; +} + +int __ImageEnd(void) +{ + kernelPrintStr("SampleDriver: Shutting down...\r"); + return 0; +} diff --git a/Drivers/SampleDriver/SampleDriver.c b/Drivers/SampleDriver/SampleDriver.c deleted file mode 100644 index 6b54742f..00000000 --- a/Drivers/SampleDriver/SampleDriver.c +++ /dev/null @@ -1,20 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#include -#include - -int __ImageStart(void) -{ - kernelPrintStr("SampleDriver: Starting up...\r"); - return 0; -} - -int __ImageEnd(void) -{ - kernelPrintStr("SampleDriver: Shutting down...\r"); - return 0; -} diff --git a/Drivers/VideoDrv/Main.cxx b/Drivers/VideoDrv/Main.cxx new file mode 100644 index 00000000..25c13b8e --- /dev/null +++ b/Drivers/VideoDrv/Main.cxx @@ -0,0 +1,22 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#include +#include + +#include + +DK_EXTERN int __at_enter(void) +{ + kernelPrintStr("VideoDrv: Starting GPU...\r"); + return 0; +} + +DK_EXTERN int __at_exit(void) +{ + kernelPrintStr("VideoDrv: Shutting GPU...\r"); + return 0; +} diff --git a/Drivers/VideoDrv/VideoDrv.cxx b/Drivers/VideoDrv/VideoDrv.cxx deleted file mode 100644 index 25c13b8e..00000000 --- a/Drivers/VideoDrv/VideoDrv.cxx +++ /dev/null @@ -1,22 +0,0 @@ -/* ------------------------------------------- - - Copyright ZKA Technologies - -------------------------------------------- */ - -#include -#include - -#include - -DK_EXTERN int __at_enter(void) -{ - kernelPrintStr("VideoDrv: Starting GPU...\r"); - return 0; -} - -DK_EXTERN int __at_exit(void) -{ - kernelPrintStr("VideoDrv: Shutting GPU...\r"); - return 0; -} diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx index 327ee665..29c0f3c7 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx @@ -14,7 +14,7 @@ EXTERN_C void idt_handle_gpf(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: General Protection Fault, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -25,7 +25,7 @@ EXTERN_C void idt_handle_pf(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Segmentation Fault, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -36,7 +36,7 @@ EXTERN_C void idt_handle_math(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Math error, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -47,7 +47,7 @@ EXTERN_C void idt_handle_generic(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Execution error, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } @@ -58,7 +58,7 @@ EXTERN_C void idt_handle_ud(Kernel::UIntPtr rsp) { Kernel::kcout << "newoskrnl: Invalid interrupt, caused by " - << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetName(); + << Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().GetProcessName(); Kernel::ProcessScheduler::The().Leak().TheCurrent().Leak().Crash(); } diff --git a/Kernel/KernelKit/ProcessHeap.hxx b/Kernel/KernelKit/ProcessHeap.hxx index 677aa835..d2ec4035 100644 --- a/Kernel/KernelKit/ProcessHeap.hxx +++ b/Kernel/KernelKit/ProcessHeap.hxx @@ -15,7 +15,7 @@ /// @version 5/11/23 /// @file ProcessHeap.hxx -/// @brief memory heap for user processes. +/// @brief Heap for user processes. #define kUserHeapMaxSz (4096) #define kUserHeapMag (0xFAF0FEF0) diff --git a/Kernel/KernelKit/ProcessScheduler.hxx b/Kernel/KernelKit/ProcessScheduler.hxx index cbce2ec2..3f6e7828 100644 --- a/Kernel/KernelKit/ProcessScheduler.hxx +++ b/Kernel/KernelKit/ProcessScheduler.hxx @@ -13,7 +13,7 @@ #include #include -#define kSchedMinMicroTime (AffinityKind::kHartStandard) +#define kSchedMinMicroTime (AffinityKind::kStandard) #define kSchedInvalidPID (-1) #define kSchedProcessLimitPerTeam (16U) @@ -58,7 +58,7 @@ namespace Kernel kInvalid = 300, kVeryHigh = 250, kHigh = 200, - kHartStandard = 150, + kStandard = 150, kLowUsage = 100, kVeryLowUsage = 50, }; @@ -167,7 +167,7 @@ namespace Kernel kKindCount, }; - ProcessTime PTime; + ProcessTime PTime{0}; PID ProcessId{kSchedInvalidPID}; Int32 Kind{kAppKind}; @@ -178,25 +178,29 @@ namespace Kernel return Status != ProcessStatus::kDead; } - //! @brief Crash the app, exits with code ~0. + ///! @brief Crashes the app, exits with code ~0. Void Crash(); - //! @brief Exits app. + ///! @brief Exits the app. Void Exit(Int32 exitCode = 0); - //! @brief TLS Allocate + ///! @brief TLS allocate. + ///! @param sz size of new ptr. VoidPtr New(const SizeT& sz); - //! @brief TLS Free. + ///! @brief TLS free. + ///! @param ptr the pointer to free. + ///! @param sz the size of it. Boolean Delete(VoidPtr ptr, const SizeT& sz); - //! @brief Wakes up threads. + ///! @brief Wakes up threads. Void Wake(const bool wakeup = false); // ProcessHeader getters. public: - //! @brief ProcessHeader name getter, example: "C RunTime" - const Char* GetName() noexcept; + ///! @brief Get the process's name + ///! @example 'C Runtime Library' + const Char* GetProcessName() noexcept; //! @brief return local error code of process. //! @return Int32 local error code. diff --git a/Kernel/KernelKit/RLE.hxx b/Kernel/KernelKit/RLE.hxx index e43d2462..9256c23b 100644 --- a/Kernel/KernelKit/RLE.hxx +++ b/Kernel/KernelKit/RLE.hxx @@ -9,4 +9,7 @@ #include +EXTERN_C void rle_compress(void* data, long sz, void* out, long out_sz); +EXTERN_C void rle_decompress(void* data, long sz, void* out, long out_sz); + #endif // !ifndef __KERNELKIT_RLE_HXX__ diff --git a/Kernel/Sources/ProcessScheduler.cxx b/Kernel/Sources/ProcessScheduler.cxx index a536bf52..34bc321d 100644 --- a/Kernel/Sources/ProcessScheduler.cxx +++ b/Kernel/Sources/ProcessScheduler.cxx @@ -138,7 +138,7 @@ namespace Kernel } /// @brief process name getter. - const Char* ProcessHeader::GetName() noexcept + const Char* ProcessHeader::GetProcessName() noexcept { return this->Name; } @@ -273,21 +273,21 @@ namespace Kernel { auto unwrapped_process = *process.Leak(); - unwrapped_process.PTime = 0; - // set the current process. mTeam.AsRef() = unwrapped_process; // tell helper to find a core to schedule on. - ProcessHelper::Switch(mTeam.AsRef().Leak().StackFrame, - mTeam.AsRef().Leak().ProcessId); + ProcessHelper::Switch(unwrapped_process.StackFrame, + unwrapped_process.ProcessId); + + unwrapped_process.PTime = static_cast(unwrapped_process.Affinity); - kcout << unwrapped_process.Name << ": process switched.\r"; + kcout << unwrapped_process.Name << ": has been switched to process core.\r"; } else { // otherwise increment the P-time. - ++mTeam.AsRef().Leak().PTime; + --mTeam.AsRef().Leak().PTime; } } @@ -336,10 +336,10 @@ namespace Kernel if (process.Leak().GetStatus() == ProcessStatus::kStarting) { - if (process.Leak().PTime < static_cast(kSchedMinMicroTime)) + if (process.Leak().PTime <= 0) { process.Leak().Status = ProcessStatus::kRunning; - process.Leak().Affinity = AffinityKind::kHartStandard; + process.Leak().Affinity = AffinityKind::kStandard; return true; } @@ -347,7 +347,7 @@ namespace Kernel ++process.Leak().PTime; } - return process.Leak().PTime > static_cast(kSchedMinMicroTime); + return process.Leak().PTime > 0; } /** diff --git a/Kernel/Sources/SMPManager.cxx b/Kernel/Sources/SMPManager.cxx index e32f8be7..f5424525 100644 --- a/Kernel/Sources/SMPManager.cxx +++ b/Kernel/Sources/SMPManager.cxx @@ -7,6 +7,7 @@ #include #include #include +#include ///! BUGS: 0 @@ -16,6 +17,8 @@ namespace Kernel { + STATIC Property cSMPCoreName; + ///! A HardwareThread class takes care of it's owned hardware thread. ///! It has a stack for it's core. @@ -120,7 +123,16 @@ namespace Kernel //! @brief Constructor and destructor ///! @brief Default constructor. - SMPManager::SMPManager() = default; + SMPManager::SMPManager() + { + StringView strCoreName(512); + strCoreName += "\\Properties\\Smp\\SchedulerClass"; + + cSMPCoreName.GetKey() = strCoreName; + cSMPCoreName.GetValue() = (UIntPtr)this; + + kcout << "newoskrnl: initializing " << strCoreName.CData() << endl; + } ///! @brief Default destructor. SMPManager::~SMPManager() = default; diff --git a/SCI/ErrorTypes.hxx b/SCI/ErrorTypes.hxx new file mode 100644 index 00000000..7ab31215 --- /dev/null +++ b/SCI/ErrorTypes.hxx @@ -0,0 +1,52 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#pragma once + +#include + +#ifdef __KERNEL__ +#error !!! including header in kernel mode !!! +#endif // __KERNEL__ + +#define ErrLocalIsOk() (kLastError == kErrorSuccess) +#define ErrLocalFailed() (kLastError != kErrorSuccess) +#define ErrLocal() (kLastError) + +typedef SInt32 HError; + +inline constexpr HError kErrorSuccess = 0; +inline constexpr HError kErrorExecutable = 33; +inline constexpr HError kErrorExecutableLib = 34; +inline constexpr HError kErrorFileNotFound = 35; +inline constexpr HError kErrorDirectoryNotFound = 36; +inline constexpr HError kErrorDiskReadOnly = 37; +inline constexpr HError kErrorDiskIsFull = 38; +inline constexpr HError kErrorProcessFault = 39; +inline constexpr HError kErrorSocketHangUp = 40; +inline constexpr HError kErrorThreadLocalStorage = 41; +inline constexpr HError kErrorMath = 42; +inline constexpr HError kErrorNoNetwork = 43; +inline constexpr HError kErrorHeapOutOfMemory = 44; +inline constexpr HError kErrorNoSuchDisk = 45; +inline constexpr HError kErrorFileExists = 46; +inline constexpr HError kErrorFormatFailed = 47; +inline constexpr HError kErrorNetworkTimeout = 48; +inline constexpr HError kErrorInternal = 49; +inline constexpr HError kErrorForkAlreadyExists = 50; +inline constexpr HError kErrorOutOfTeamSlot = 51; +inline constexpr HError kErrorHeapNotPresent = 52; +inline constexpr HError kErrorNoEntrypoint = 53; +inline constexpr HError kErrorDiskIsCorrupted = 54; +inline constexpr HError kErrorDisk = 55; +inline constexpr HError kErrorInvalidData = 56; +inline constexpr HError kErrorAsync = 57; +inline constexpr HError kErrorNonBlocking = 58; +inline constexpr HError kErrorIPC = 59; +inline constexpr HError kErrorSign = 60; +inline constexpr HError kErrorUnimplemented = 0; + +inline HError kLastError = 0; diff --git a/SCI/Hint.hxx b/SCI/Hint.hxx new file mode 100644 index 00000000..fd91ece9 --- /dev/null +++ b/SCI/Hint.hxx @@ -0,0 +1,23 @@ +/* ------------------------------------------- + + Copyright ZKA Technologies + +------------------------------------------- */ + +#ifndef __SCI_HINT_HXX__ +#define __SCI_HINT_HXX__ + +#pragma compiler(hint_manifest) + +#define _Input +#define _Output + +#define _Optional + +#define _StrictCheckInput +#define _StrictCheckOutput + +#define _InOut +#define _StrictInOut + +#endif // ifndef __SCI_HINT_HXX__ diff --git a/SCI/StandardInterface.hxx b/SCI/StandardInterface.hxx new file mode 100644 index 00000000..9e792546 --- /dev/null +++ b/SCI/StandardInterface.hxx @@ -0,0 +1,123 @@ +/* ------------------------------------------- + +Copyright ZKA Technologies. + +File: newstd.hxx. +Purpose: System Call Interface. + +------------------------------------------- */ + +#ifndef __SCI_STD_HXX__ +#define __SCI_STD_HXX__ + +#ifdef __KERNEL__ +#error !!! including header in kernel mode !!! +#endif // __KERNEL__ + +#define IMPORT_CXX extern "C++" +#define IMPORT_C extern "C" + +#define cRestrictR "r" +#define cRestrictRB "rb" +#define cRestrictW "w" +#define cRestrictRW "rw" + +class SCISharedInterface; /// @brief System call class. + +typedef long long int FD; +typedef bool Bool; +typedef void UInt0; + +typedef __UINT64_TYPE__ UInt64; +typedef __UINT32_TYPE__ UInt32; +typedef __UINT16_TYPE__ UInt16; +typedef __UINT8_TYPE__ UInt8; + +typedef __SIZE_TYPE__ SizeT; + +typedef __INT64_TYPE__ SInt64; +typedef __INT32_TYPE__ SInt32; +typedef __INT16_TYPE__ SInt16; +typedef __INT8_TYPE__ SInt8; + +typedef char UTFChar; + +typedef UInt32 PowerID; + +/** + @brief System call class. +*/ +class SCISharedInterface +{ +public: + explicit SCISharedInterface() = default; + virtual ~SCISharedInterface() = default; + + SCISharedInterface& operator=(const SCISharedInterface&) = default; + SCISharedInterface(const SCISharedInterface&) = default; + +public: + /// @brief disable device. + virtual UInt0 PowerOff(PowerID) = 0; + + /// @brief enable device. + virtual UInt0 PowerOn(PowerID) = 0; + + /// @brief reboot device. + virtual UInt0 PowerReboot(PowerID) = 0; + + /// @brief check if MBCI device is wokeup. + virtual Bool PowerIsWokeup(PowerID) = 0; + + /// @brief probe MBCI/ACPI device from phone. + virtual PowerID PowerProbeDevice(const char* namepace, const int index) = 0; + + // THOSE DOESNT REQUIRE PERMISSIONS FROM THE USER. // + + /// @brief terminate app. + virtual UInt0 Terminate() = 0; + + /// @brief exit thread. + virtual Bool Exit(FD code) = 0; + + /// @brief alloc pointer. + virtual UInt0* New(long long sz) = 0; + + /// @brief free pointer. + virtual UInt0 Delete(void* ptr) = 0; + + // THOSE MAY REQUIRE PERMISSIONS FROM THE USER. // + + /// @brief Open descriptor. + virtual FD OpenStorage(const char* path, const char* restr) = 0; + + /// @brief Close descriptor. + virtual UInt0 CloseStorage(FD descriptorType) = 0; + + /// @brief Execute from shell. + virtual FD URLExecute(const UTFChar* shellLink) = 0; + + /// @brief Read descriptor. + virtual UInt0* ReadStorage(const UTFChar* cmdNameOrData, SizeT cmdSize, FD descriptorType) = 0; + + /// @brief Seek in storage file + virtual UInt64 SeekStorage(FD descriptorType, UInt64 offset) = 0; + + /// @brief Tell storage cursor. + virtual UInt64 TellStorage(FD descriptorType) = 0; + + /// @brief Remove stored file. + virtual UInt64 RemoveStorage(FD descriptorType) = 0; + + /// @brief Create stored file. + virtual FD CreateStorage(const UTFChar* fileName, UInt64 flags) = 0; + + /// @brief Write descriptor. + virtual UInt0* WriteStorage(const UTFChar* cmdNameOrData, SizeT cmdSize, FD descriptorType) = 0; +}; + +/// @brief Get shared syscall object. +/// @return Syscall implementation. +IMPORT_C SCISharedInterface* SCIGetSharedInterface(UInt0); + +#endif // ifndef __SCI_STD_HXX__ diff --git a/SCI/compile_flags.txt b/SCI/compile_flags.txt new file mode 100644 index 00000000..509e3eed --- /dev/null +++ b/SCI/compile_flags.txt @@ -0,0 +1,4 @@ +-I./ +-I../Kernel +-I../ +-std=c++20 diff --git a/newoskrnl.files b/newoskrnl.files index 43039950..762df4f9 100644 --- a/newoskrnl.files +++ b/newoskrnl.files @@ -36,9 +36,10 @@ Boot/Sources/HEL/POWER/CoreBootStartup.S Boot/Sources/HEL/64X000/Boot64x0.S Boot/Sources/compile_flags.txt Boot/amd64-efi.make -Comm/compile_flags.txt -Comm/herror.hxx -Comm/newstd.hxx +SCI/compile_flags.txt +SCI/ErrorTypes.hxx +SCI/StandardInterface.hxx +SCI/Hint.hxx DDK/KernelCall.c DDK/KernelDev.c DDK/KernelDev.h @@ -46,7 +47,8 @@ DDK/KernelDispatchCall.S DDK/KernelPrint.c DDK/KernelPrint.h DDK/KernelStd.h -DDK/KernelStdCxx.cc +DDK/KernelAlloc.c +DDK/KernelCxxRt.cxx DDK/KernelString.c DDK/KernelString.h DDK/ReadMe.txt -- cgit v1.2.3