summaryrefslogtreecommitdiffhomepage
path: root/Kernel
diff options
context:
space:
mode:
authorAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-09 19:55:54 +0200
committerAmlal EL Mahrouss <amlalelmahrouss@icloud.com>2024-08-09 19:56:35 +0200
commit1c217ed09c6c4b13ec09b897270a208439f0db55 (patch)
tree43c93aef6ee233fafcd7ca07a5700dd76d5ecdf5 /Kernel
parentacd8297fe927e601a7173cec7ca5445fd4a9c74a (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.cxx10
-rw-r--r--Kernel/HALKit/AMD64/HalCoreInterruptHandlerAMD64.cxx5
-rw-r--r--Kernel/HALKit/AMD64/HalCoreMultiProcessingAMD64.cxx3
-rw-r--r--Kernel/HALKit/AMD64/HalDebugOutput.cxx4
-rw-r--r--Kernel/HALKit/AMD64/HalKernelMain.cxx44
-rw-r--r--Kernel/KernelKit/DebugOutput.hxx36
-rw-r--r--Kernel/KernelKit/User.hxx12
-rw-r--r--Kernel/NewKit/ErrorOr.hxx2
-rw-r--r--Kernel/Sources/HalPageAlloc.cxx2
-rw-r--r--Kernel/Sources/Heap.cxx19
-rw-r--r--Kernel/Sources/KernelCheck.cxx2
-rw-r--r--Kernel/Sources/User.cxx46
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;
}