diff options
| author | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-09 19:55:54 +0200 |
|---|---|---|
| committer | Amlal EL Mahrouss <amlalelmahrouss@icloud.com> | 2024-08-09 19:56:35 +0200 |
| commit | 1c217ed09c6c4b13ec09b897270a208439f0db55 (patch) | |
| tree | 43c93aef6ee233fafcd7ca07a5700dd76d5ecdf5 /Kernel | |
| parent | acd8297fe927e601a7173cec7ca5445fd4a9c74a (diff) | |
[FIX] Fix bootloop on serial write, fixing more bugs now, still have to
fix allocation.
Signed-off-by: Amlal EL Mahrouss <amlalelmahrouss@icloud.com>
Diffstat (limited to 'Kernel')
| -rw-r--r-- | Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx | 10 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx | 5 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx | 3 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalDebugOutput.cxx | 4 | ||||
| -rw-r--r-- | Kernel/HALKit/AMD64/HalKernelMain.cxx | 44 | ||||
| -rw-r--r-- | Kernel/KernelKit/DebugOutput.hxx | 36 | ||||
| -rw-r--r-- | Kernel/KernelKit/User.hxx | 12 | ||||
| -rw-r--r-- | Kernel/NewKit/ErrorOr.hxx | 2 | ||||
| -rw-r--r-- | Kernel/Sources/HalPageAlloc.cxx | 2 | ||||
| -rw-r--r-- | Kernel/Sources/Heap.cxx | 19 | ||||
| -rw-r--r-- | Kernel/Sources/KernelCheck.cxx | 2 | ||||
| -rw-r--r-- | Kernel/Sources/User.cxx | 46 |
12 files changed, 113 insertions, 72 deletions
diff --git a/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx b/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx index aca319c3..e13cc0fc 100644 --- a/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx +++ b/Kernel/HALKit/AMD64/HalACPIFactoryInterface.cxx @@ -102,18 +102,18 @@ namespace Kernel for (Size index = 0; index < this->fEntries; ++index) { - SDT& sdt = *reinterpret_cast<SDT*>(xsdt->AddressArr[index]); + SDT* sdt = reinterpret_cast<SDT*>(xsdt->AddressArr[index]); - kcout << "ACPI: Checksum: " << number(sdt.Checksum) << endl; - kcout << "ACPI: Revision: " << number(sdt.Revision) << endl; + kcout << "ACPI: Checksum: " << number(sdt->Checksum) << endl; + kcout << "ACPI: Revision: " << number(sdt->Revision) << endl; for (short signature_index = 0; signature_index < cAcpiSignatureLength; ++signature_index) { - if (sdt.Signature[signature_index] != signature[signature_index]) + if (sdt->Signature[signature_index] != signature[signature_index]) break; if (signature_index == (cAcpiSignatureLength - 1)) - return ErrorOr<voidPtr>(reinterpret_cast<voidPtr>(&sdt)); + return ErrorOr<voidPtr>(reinterpret_cast<voidPtr>(xsdt->AddressArr[index])); } } diff --git a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx index c181be30..bf463ae9 100644 --- a/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx +++ b/Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx @@ -84,10 +84,13 @@ EXTERN_C Kernel::Void hal_system_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr /// @return nothing. EXTERN_C Kernel::Void hal_kernel_call_enter(Kernel::UIntPtr rcx, Kernel::UIntPtr rdx, Kernel::UIntPtr r8, Kernel::UIntPtr r9) { - if (rcx != 0) + if (rcx <= (kSyscalls.Count() - 1)) { Kernel::kcout << "newoskrnl: kerncall: enter.\r"; + if (kKerncalls[rcx].Leak().Leak()->fHooked) + (kKerncalls[rcx].Leak().Leak()->fProc)((Kernel::VoidPtr)rdx); + Kernel::kcout << "newoskrnl: kerncall: exit.\r"; } } diff --git a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx index 5c1a4323..d15fba73 100644 --- a/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx +++ b/Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx @@ -16,6 +16,8 @@ #include <KernelKit/MP.hxx> +#define kApicSignature "APIC" + #define kAPIC_ICR_Low 0x300 #define kAPIC_ICR_High 0x310 #define kAPIC_SIPI_Vector 0x00500 @@ -66,7 +68,6 @@ namespace Kernel::HAL }; STATIC VoidPtr kApicMadt = nullptr; - STATIC const Char* kApicSignature = "APIC"; /// @brief Multiple APIC Descriptor Table. struct MadtType final : public SDT diff --git a/Kernel/HALKit/AMD64/HalDebugOutput.cxx b/Kernel/HALKit/AMD64/HalDebugOutput.cxx index b80ab761..3b4c29c7 100644 --- a/Kernel/HALKit/AMD64/HalDebugOutput.cxx +++ b/Kernel/HALKit/AMD64/HalDebugOutput.cxx @@ -136,9 +136,9 @@ namespace Kernel #endif // __DEBUG__ } - TerminalDevice& TerminalDevice::The() noexcept + TerminalDevice TerminalDevice::The() noexcept { - STATIC TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read); + TerminalDevice out(Kernel::ke_io_write, Kernel::ke_io_read); return out; } diff --git a/Kernel/HALKit/AMD64/HalKernelMain.cxx b/Kernel/HALKit/AMD64/HalKernelMain.cxx index 93841bc1..924eb6c9 100644 --- a/Kernel/HALKit/AMD64/HalKernelMain.cxx +++ b/Kernel/HALKit/AMD64/HalKernelMain.cxx @@ -53,6 +53,13 @@ namespace Kernel::HAL extern void hal_system_get_cores(Kernel::voidPtr rsdPtr); } // namespace Kernel::HAL +namespace Kernel +{ + EXTERN SizeT kHeapCount; + EXTERN PageManager kHeapPageManager; + EXTERN Bool kOperationInProgress; +} // namespace Kernel + /* GDT. */ STATIC Kernel::HAL::Detail::NewOSGDT cGdt = { {0, 0, 0, 0x00, 0x00, 0}, // null entry @@ -65,6 +72,8 @@ STATIC Kernel::HAL::Detail::NewOSGDT cGdt = { void hal_real_init(void); +static Kernel::User* cRoot; + EXTERN_C void hal_init_platform( Kernel::HEL::HandoverInformationHeader* HandoverHeader) { @@ -78,25 +87,24 @@ EXTERN_C void hal_init_platform( return; } - STATIC Kernel::UInt32 kTextOffsetY = 30; - - 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)); - - Kernel::ke_stop(RUNTIME_CHECK_BOOTSTRAP); - hal_real_init(); } +EXTERN Kernel::Boolean kAllocationInProgress; + void hal_real_init(void) { + Kernel::kHeapPageManager = Kernel::PageManager(); + Kernel::kHeapCount = 0UL; + Kernel::kOperationInProgress = No; + kAllocationInProgress = No; + // get page size. kKernelVirtualSize = kHandoverHeader->f_VirtualSize; - // get virtual address start. + // get virtual address start (for the heap) kKernelVirtualStart = reinterpret_cast<Kernel::VoidPtr>( - reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart)); + reinterpret_cast<Kernel::UIntPtr>(kHandoverHeader->f_VirtualStart) + cHeapStartOffset); // get physical address start. kKernelPhysicalStart = reinterpret_cast<Kernel::VoidPtr>( @@ -217,5 +225,19 @@ void hal_real_init(void) kSyscalls[cShutdownInterrupt].Leak().Leak()->fHooked = true; kSyscalls[cRebootInterrupt].Leak().Leak()->fHooked = true; - Kernel::HAL::hal_system_get_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr); + cRoot = new Kernel::User(Kernel::RingKind::kRingSuperUser, kSuperUser); + +#ifdef __DEBUG__ + cRoot->TrySave("6aa162f3-20f6-4143-92f9-5dd37066aedc"); +#else + cRoot->TrySave("password"); +#endif + +#ifdef __DEBUG__ + Kernel::UserManager::The()->TryLogIn(cRoot, "6aa162f3-20f6-4143-92f9-5dd37066aedc"); +#else + Kernel::UserManager::The()->TryLogIn(cRoot, "password"); +#endif + + Kernel::ke_stop(RUNTIME_CHECK_FAILED); } diff --git a/Kernel/KernelKit/DebugOutput.hxx b/Kernel/KernelKit/DebugOutput.hxx index f0c4565a..4e01381c 100644 --- a/Kernel/KernelKit/DebugOutput.hxx +++ b/Kernel/KernelKit/DebugOutput.hxx @@ -29,9 +29,9 @@ namespace Kernel { class TerminalDevice; - inline TerminalDevice& end_line(); - inline TerminalDevice& number(const Long& x); - inline TerminalDevice& hex_number(const Long& x); + inline TerminalDevice end_line(); + inline TerminalDevice number(const Long& x); + inline TerminalDevice hex_number(const Long& x); // @brief Emulates a VT100 terminal. class TerminalDevice final : public DeviceInterface<const Char*> @@ -53,34 +53,34 @@ namespace Kernel NEWOS_COPY_DEFAULT(TerminalDevice); - static TerminalDevice& The() noexcept; + STATIC TerminalDevice The() noexcept; }; - inline TerminalDevice& end_line() + inline TerminalDevice end_line() { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); selfTerm << "\r"; return selfTerm; } - inline TerminalDevice& carriage_return() + inline TerminalDevice carriage_return() { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); selfTerm << "\r"; return selfTerm; } - inline TerminalDevice& tabulate() + inline TerminalDevice tabulate() { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); selfTerm << "\t"; return selfTerm; } /// @brief emulate a terminal bell, like the VT100 does. - inline TerminalDevice& bell() + inline TerminalDevice bell() { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); selfTerm << "\a"; return selfTerm; } @@ -144,9 +144,9 @@ namespace Kernel } } // namespace Detail - inline TerminalDevice& hex_number(const Long& x) + inline TerminalDevice hex_number(const Long& x) { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); selfTerm << "0x"; Detail::_write_number_hex(x, selfTerm); @@ -154,18 +154,18 @@ namespace Kernel return selfTerm; } - inline TerminalDevice& number(const Long& x) + inline TerminalDevice number(const Long& x) { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); Detail::_write_number(x, selfTerm); return selfTerm; } - inline TerminalDevice& get_console_in(Char* buf) + inline TerminalDevice get_console_in(Char* buf) { - TerminalDevice& selfTerm = TerminalDevice::The(); + TerminalDevice selfTerm = TerminalDevice::The(); selfTerm >> buf; diff --git a/Kernel/KernelKit/User.hxx b/Kernel/KernelKit/User.hxx index a7aaa508..169a8bce 100644 --- a/Kernel/KernelKit/User.hxx +++ b/Kernel/KernelKit/User.hxx @@ -57,7 +57,7 @@ namespace Kernel public: /// @brief Get software ring const RingKind& Ring() noexcept; - + /// @brief Get user name StringView& Name() noexcept; @@ -67,6 +67,8 @@ namespace Kernel /// @brief Is she a super user? Bool IsSuperUser() noexcept; + Bool TrySave(const Char* password) noexcept; + private: RingKind fRing{RingKind::kRingStdUser}; StringView fUserName; @@ -77,7 +79,7 @@ namespace Kernel class UserManager final { - UserManager() = default; + UserManager() = default; ~UserManager() = default; User* fCurrentUser = nullptr; @@ -90,9 +92,9 @@ namespace Kernel NEWOS_COPY_DELETE(UserManager); STATIC UserManager* The() noexcept; - Bool TryLogIn(User* user, const Char* password) noexcept; - User* GetCurrent() noexcept; - Void TryLogOff() noexcept; + Bool TryLogIn(User* user, const Char* password) noexcept; + User* GetCurrent() noexcept; + Void TryLogOff() noexcept; }; } // namespace Kernel diff --git a/Kernel/NewKit/ErrorOr.hxx b/Kernel/NewKit/ErrorOr.hxx index 9cd6087d..4a8897c8 100644 --- a/Kernel/NewKit/ErrorOr.hxx +++ b/Kernel/NewKit/ErrorOr.hxx @@ -47,7 +47,7 @@ namespace Kernel return *this; } - Ref<T> Leak() + Ref<T>& Leak() { return mRef; } diff --git a/Kernel/Sources/HalPageAlloc.cxx b/Kernel/Sources/HalPageAlloc.cxx index 645b8e46..f22db98a 100644 --- a/Kernel/Sources/HalPageAlloc.cxx +++ b/Kernel/Sources/HalPageAlloc.cxx @@ -15,7 +15,7 @@ #include <NewKit/Defines.hxx> #include <NewKit/KernelCheck.hxx> -STATIC Kernel::Boolean kAllocationInProgress = false; +Kernel::Boolean kAllocationInProgress = false; namespace Kernel { diff --git a/Kernel/Sources/Heap.cxx b/Kernel/Sources/Heap.cxx index 72c0b77c..167636a0 100644 --- a/Kernel/Sources/Heap.cxx +++ b/Kernel/Sources/Heap.cxx @@ -18,10 +18,9 @@ namespace Kernel { - STATIC SizeT kHeapCount = 0UL; - STATIC PageManager kHeapPageManager; - - STATIC Bool kOperationInProgress = No; + SizeT kHeapCount = 0UL; + PageManager kHeapPageManager; + Bool kOperationInProgress = No; namespace Detail { @@ -48,19 +47,9 @@ namespace Kernel typedef HEAP_INFORMATION_BLOCK* HEAP_INFORMATION_BLOCK_PTR; - Bool mm_alloc_init_timeout(Void) noexcept + Void mm_alloc_init_timeout(Void) noexcept { - SizeT timOut = 0U; - - while (kOperationInProgress) - { - ++timOut; - if (timOut > 10000000) - return false; - } - kOperationInProgress = Yes; - return true; } Void mm_alloc_fini_timeout(Void) noexcept diff --git a/Kernel/Sources/KernelCheck.cxx b/Kernel/Sources/KernelCheck.cxx index bf3d91b6..cff17077 100644 --- a/Kernel/Sources/KernelCheck.cxx +++ b/Kernel/Sources/KernelCheck.cxx @@ -68,7 +68,7 @@ namespace Kernel switch (id) { case RUNTIME_CHECK_PROCESS: { - cg_write_text("Scheduler error.", start_y, x, panicTxt); + cg_write_text("Process scheduler error (Catasrophic failure).", start_y, x, panicTxt); break; } case RUNTIME_CHECK_ACPI: { diff --git a/Kernel/Sources/User.cxx b/Kernel/Sources/User.cxx index 2b22cf05..46dd0d76 100644 --- a/Kernel/Sources/User.cxx +++ b/Kernel/Sources/User.cxx @@ -33,33 +33,57 @@ namespace Kernel for (Size i_pass = 0; i_pass < rt_string_len(password); ++i_pass) { - Char cur_chr = password[i_pass]; + Char cur_chr = password[i_pass]; password[i_pass] = cur_chr + (user->IsStdUser() ? 0xCF : 0xEF); } - return 0; } - } + } // namespace Detail User::User(const Int32& sel, const Char* userName) : fRing((RingKind)sel) { MUST_PASS(sel >= 0); - - auto view = StringBuilder::Construct(userName); - this->fUserName += view.Leak().Leak(); + this->fUserName += userName; } User::User(const RingKind& ringKind, const Char* userName) : fRing(ringKind) { - auto view = StringBuilder::Construct(userName); - this->fUserName += view.Leak().Leak(); + this->fUserName += userName; } User::~User() = default; + Bool User::TrySave(const Char* password) noexcept + { + SizeT len = rt_string_len(password); + + Char* token = new Char[len]; + + MUST_PASS(token); + + rt_copy_memory((VoidPtr)password, token, rt_string_len(password)); + + Detail::cred_construct_token(token, this); + + if (NewFilesystemManager::GetMounted()) + { + if (auto dir = NewFilesystemManager::GetMounted()->CreateDirectory("\\Users")) + delete dir; + + auto node = NewFilesystemManager::GetMounted()->Create(kUsersFile); + NewFilesystemManager::GetMounted()->Write(this->fUserName.CData(), node, (VoidPtr)token, this->IsStdUser() ? 0xCF : 0xEF, len); + + delete node; + + return true; + } + + return false; + } + bool User::operator==(const User& lhs) { return lhs.fRing == this->fRing; @@ -129,7 +153,7 @@ namespace Kernel } else { - Char generated_token[255] = { 0 }; + Char generated_token[255] = {0}; // ================================================== // // Provide password on token variable. @@ -155,7 +179,7 @@ namespace Kernel return false; } - kcout << "newoskrnl: Correct credentials, moving on.\r"; + kcout << "newoskrnl: Credentials are correct, moving on.\r"; } // ------------------------------------------ // @@ -177,7 +201,7 @@ namespace Kernel } fCurrentUser = user; - Kernel::kcout << "newoskrnl: logged in as: " << fCurrentUser->Name().CData() << Kernel::endl; + Kernel::kcout << "newoskrnl: Logged in as: " << fCurrentUser->Name().CData() << Kernel::endl; return true; } |
