From c0f7f3f300d603d355fc7ec5be317afe1f0ee1b6 Mon Sep 17 00:00:00 2001 From: Amlal El Mahrouss Date: Thu, 26 Dec 2024 18:15:54 +0100 Subject: IMPL: Improvements and fixes. Signed-off-by: Amlal El Mahrouss --- dev/Kernel/FirmwareKit/EFI/EFI.h | 59 ++++++++++++++++++++++++++------ dev/Kernel/FirmwareKit/Handover.h | 2 +- dev/Kernel/HALKit/AMD64/HalKernelMain.cc | 3 -- dev/Kernel/HALKit/AMD64/HalTimerAMD64.cc | 6 ++-- dev/Kernel/HALKit/ARM64/HalKernelMain.cc | 3 -- dev/Kernel/KernelKit/Timer.h | 6 ++-- dev/Kernel/src/KernelMain.cc | 1 - dev/Kernel/src/SoftwareTimer.cc | 39 +++++++++++++++++++++ dev/Kernel/src/Timer.cc | 32 ++--------------- 9 files changed, 97 insertions(+), 54 deletions(-) create mode 100644 dev/Kernel/src/SoftwareTimer.cc (limited to 'dev/Kernel') diff --git a/dev/Kernel/FirmwareKit/EFI/EFI.h b/dev/Kernel/FirmwareKit/EFI/EFI.h index befa4e87..2e168bcd 100644 --- a/dev/Kernel/FirmwareKit/EFI/EFI.h +++ b/dev/Kernel/FirmwareKit/EFI/EFI.h @@ -42,6 +42,7 @@ struct EfiHandle; struct EfiGraphicsOutputProtocol; struct EfiBitmask; struct EfiFileProtocol; +struct EfiSimpleTextInputProtocol; typedef UInt64 EfiStatusType; @@ -473,6 +474,14 @@ typedef struct EfiGUID EFI_FINAL * Protocol stuff... */ +#define EFI_SIMPLE_TEXT_INPUT_PROTOCOL_GUID \ + { \ + 0x387477c1, 0x69c7, 0x11d2, \ + { \ + 0x8e, 0x39, 0x00, 0xa0, 0xc9, 0x69, 0x72, 0x3b \ + } \ + } + /** some helpers */ #define EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL 0x00000001 #define EFI_OPEN_PROTOCOL_GET_PROTOCOL 0x00000002 @@ -563,6 +572,36 @@ typedef struct EfiSimpleTextOutputProtocol VoidPtr Mode; } EfiSimpleTextOutputProtocol; +typedef struct +{ + UInt16 ScanCode; + char16_t UnicodeChar; +} EfiInputKey; + +typedef EfiStatusType(EFI_API* EfiInputReadKey)( + IN EfiSimpleTextInputProtocol* This, + OUT EfiInputKey* Key); + +typedef EfiStatusType(EFI_API* EfiInputReset)( + IN EfiSimpleTextInputProtocol* This, + IN Boolean ExtendedChk ); + +typedef +EfiStatusType +(EFI_API *EfiWaitForEvent) ( + IN UInt32 NumberOfEvents, + IN VoidPtr Event, + OUT UInt32 *Index + ); + +typedef struct EfiSimpleTextInputProtocol +{ + EfiInputReset Reset; + EfiInputReadKey ReadKeyStroke; + EfiWaitForEvent WaitForKey; +} EfiSimpleTextInputProtocol; + +/// @biref Open Volume procedure ptr. typedef UInt64(EFI_API* EfiOpenVolume)(struct EfiSimpleFilesystemProtocol*, struct EfiFileProtocol**); @@ -581,7 +620,7 @@ typedef struct EfiSystemTable WideChar* FirmwareVendor; UInt32 FirmwareRevision; EfiHandlePtr ConsoleInHandle; - VoidPtr ConIn; + EfiSimpleTextInputProtocol* ConIn; EfiHandlePtr ConsoleOutHandle; EfiSimpleTextOutputProtocol* ConOut; EfiHandlePtr StandardErrorHandle; @@ -826,11 +865,11 @@ typedef struct _EfiProcessorInformation typedef EfiStatusType EFI_API (*EfiMpServicesGetNumberOfProcessors)( IN struct _EfiMpServicesProtocol* Self, - OUT UInt32* NumberOfProcessors, - OUT UInt32* NumberOfEnabledProcessors); + OUT UInt32* NumberOfProcessors, + OUT UInt32* NumberOfEnabledProcessors); typedef EfiStatusType EFI_API (*EfiMpServicesGetProcessorInfo)( - IN struct _EfiMpServicesProtocol* Self, + IN struct _EfiMpServicesProtocol* Self, IN UInt32* ProcessorNumber, OUT struct _EfiProcessorInformation* NumberOfEnabledProcessors); @@ -843,8 +882,8 @@ typedef EfiStatusType EFI_API (*EfiMpServicesStartupAllAPS)( IN Boolean SingleThread, IN VoidPtr WaitEvent OPTIONAL, // EFI_EVENT first, but unused here. IN UInt32 TimeoutInMicroSeconds, - IN Void* ProcedureArgument OPTIONAL, - OUT UInt32** FailedCpuList OPTIONAL); + IN Void* ProcedureArgument OPTIONAL, + OUT UInt32** FailedCpuList OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesSwitchBSP)( IN struct _EfiMpServicesProtocol* Self, @@ -857,18 +896,18 @@ typedef EfiStatusType EFI_API (*EfiMpServicesStartupThisAP)( IN UInt32 ProcessorNumber, IN VoidPtr WaitEvent OPTIONAL, IN UInt32 TimeoutInMicroseconds, - IN Void* ProcedureArgument OPTIONAL, - OUT Boolean* Finished OPTIONAL); + IN Void* ProcedureArgument OPTIONAL, + OUT Boolean* Finished OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesDisableThisAP)( IN struct _EfiMpServicesProtocol* Self, IN UInt32 ProcessorNumber, IN Boolean EnableAP, - IN UInt32* HealthFlag OPTIONAL); + IN UInt32* HealthFlag OPTIONAL); typedef EfiStatusType EFI_API (*EfiMpServicesWhoAmI)( IN struct _EfiMpServicesProtocol* Self, - OUT UInt32* ProcessorNumber); + OUT UInt32* ProcessorNumber); typedef struct _EfiMpServicesProtocol { diff --git a/dev/Kernel/FirmwareKit/Handover.h b/dev/Kernel/FirmwareKit/Handover.h index 86650d34..9a7e7e80 100644 --- a/dev/Kernel/FirmwareKit/Handover.h +++ b/dev/Kernel/FirmwareKit/Handover.h @@ -103,7 +103,7 @@ namespace Kernel::HEL }; /// @brief Alias of bootloader main type. - typedef void (*HandoverProc)(BootInfoHeader* boot_info); + typedef Int32 (*HandoverProc)(BootInfoHeader* boot_info); } // namespace Kernel::HEL /// @brief Bootloader information header global variable. diff --git a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc index 75c41433..690ece70 100644 --- a/dev/Kernel/HALKit/AMD64/HalKernelMain.cc +++ b/dev/Kernel/HALKit/AMD64/HalKernelMain.cc @@ -11,7 +11,6 @@ #include #include #include -#include #include EXTERN_C Kernel::VoidPtr kInterruptVectorTable[]; @@ -84,8 +83,6 @@ EXTERN_C void hal_init_platform( EXTERN_C Kernel::Void hal_real_init(Kernel::Void) noexcept { - UI::ui_draw_background(); - auto str_proc = Kernel::rt_alloc_string("System"); Kernel::rtl_create_process(rtl_kernel_main, str_proc); diff --git a/dev/Kernel/HALKit/AMD64/HalTimerAMD64.cc b/dev/Kernel/HALKit/AMD64/HalTimerAMD64.cc index 97da8c48..9e42fe3f 100644 --- a/dev/Kernel/HALKit/AMD64/HalTimerAMD64.cc +++ b/dev/Kernel/HALKit/AMD64/HalTimerAMD64.cc @@ -62,10 +62,10 @@ HardwareTimer::~HardwareTimer() fWaitFor = 0; } -Int32 HardwareTimer::Wait() noexcept +BOOL HardwareTimer::Wait() noexcept { if (fWaitFor < 1) - return 1; + return NO; // if not enabled yet. if (!(*(fDigitalTimer + cHPETConfigRegValue) & (1 << 0))) @@ -82,5 +82,5 @@ Int32 HardwareTimer::Wait() noexcept while (*(fDigitalTimer + cHPETCounterRegValue) < (ticks)) ; - return 0; + return YES; } diff --git a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc index ff4676e4..4a81fa64 100644 --- a/dev/Kernel/HALKit/ARM64/HalKernelMain.cc +++ b/dev/Kernel/HALKit/ARM64/HalKernelMain.cc @@ -15,7 +15,6 @@ #include #include #include -#include #include Kernel::Void hal_real_init(Kernel::Void) noexcept; @@ -47,8 +46,6 @@ EXTERN_C void hal_init_platform( /// @note do initialize the interrupts after it. - UI::ui_draw_background(); - auto str_proc = Kernel::rt_alloc_string("System"); Kernel::rtl_create_process(rtl_kernel_main, str_proc); diff --git a/dev/Kernel/KernelKit/Timer.h b/dev/Kernel/KernelKit/Timer.h index a2dae8cd..db8b49fe 100644 --- a/dev/Kernel/KernelKit/Timer.h +++ b/dev/Kernel/KernelKit/Timer.h @@ -26,7 +26,7 @@ namespace Kernel ZKA_COPY_DEFAULT(TimerInterface); public: - virtual Int32 Wait() noexcept; + virtual BOOL Wait() noexcept; }; class SoftwareTimer final : public TimerInterface @@ -39,7 +39,7 @@ namespace Kernel ZKA_COPY_DEFAULT(SoftwareTimer); public: - Int32 Wait() noexcept override; + BOOL Wait() noexcept override; private: IntPtr* fDigitalTimer{nullptr}; @@ -56,7 +56,7 @@ namespace Kernel ZKA_COPY_DEFAULT(HardwareTimer); public: - Int32 Wait() noexcept override; + BOOL Wait() noexcept override; private: IntPtr* fDigitalTimer{nullptr}; diff --git a/dev/Kernel/src/KernelMain.cc b/dev/Kernel/src/KernelMain.cc index d3498f24..fdbda512 100644 --- a/dev/Kernel/src/KernelMain.cc +++ b/dev/Kernel/src/KernelMain.cc @@ -22,7 +22,6 @@ #include #include #include -#include #include namespace Kernel::Detail diff --git a/dev/Kernel/src/SoftwareTimer.cc b/dev/Kernel/src/SoftwareTimer.cc new file mode 100644 index 00000000..797722d3 --- /dev/null +++ b/dev/Kernel/src/SoftwareTimer.cc @@ -0,0 +1,39 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Theater Quality Inc, all rights reserved. + +------------------------------------------- */ + +#include + +/// @brief SoftwareTimer class, meant to be generic. + +using namespace Kernel; + +SoftwareTimer::SoftwareTimer(Int64 seconds) + : fWaitFor(seconds) +{ + fDigitalTimer = new IntPtr(); + MUST_PASS(fDigitalTimer); +} + +SoftwareTimer::~SoftwareTimer() +{ + delete fDigitalTimer; + fDigitalTimer = nullptr; + + fWaitFor = 0; +} + +BOOL SoftwareTimer::Wait() noexcept +{ + if (fWaitFor < 1) + return NO; + + while (*fDigitalTimer < (*fDigitalTimer + fWaitFor)) + { + ++(*fDigitalTimer); + } + + return YES; +} diff --git a/dev/Kernel/src/Timer.cc b/dev/Kernel/src/Timer.cc index 8795dd66..d304f6ee 100644 --- a/dev/Kernel/src/Timer.cc +++ b/dev/Kernel/src/Timer.cc @@ -13,35 +13,7 @@ using namespace Kernel; /// @brief Unimplemented as it is an interface. -Int32 TimerInterface::Wait() noexcept +BOOL TimerInterface::Wait() noexcept { - return kErrorUnimplemented; -} - -/// @brief SoftwareTimer class, meant to be generic. - -SoftwareTimer::SoftwareTimer(Int64 seconds) - : fWaitFor(seconds) -{ - fDigitalTimer = new IntPtr(); - MUST_PASS(fDigitalTimer); -} - -SoftwareTimer::~SoftwareTimer() -{ - delete fDigitalTimer; - fWaitFor = 0; -} - -Int32 SoftwareTimer::Wait() noexcept -{ - if (fWaitFor < 1) - return 1; - - while (*fDigitalTimer < (*fDigitalTimer + fWaitFor)) - { - ++(*fDigitalTimer); - } - - return 0; + return NO; } -- cgit v1.2.3