summaryrefslogtreecommitdiffhomepage
path: root/dev/kernel
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-11-21 03:30:40 -0500
committerGitHub <noreply@github.com>2025-11-21 03:30:40 -0500
commite3fa27827e7647a0ecc466f4d92097fe48fbbb43 (patch)
tree33ba30655f555d37e3c970707b27413936e5a9ad /dev/kernel
parentc739255b48b3a5b2e184ca1a637f9f1f95c978ff (diff)
parentefefa7221a3fea3636a64f2bf067e2af75626f34 (diff)
Merge pull request #79 from nekernel-org/devv0.0.61
Kernel: OpenHeFS fixes and new components.
Diffstat (limited to 'dev/kernel')
-rw-r--r--dev/kernel/FSKit/OpenHeFS.h6
-rw-r--r--dev/kernel/HALKit/AMD64/HalKernelMain.cc2
-rw-r--r--dev/kernel/HALKit/AMD64/HalTimer.cc6
-rw-r--r--dev/kernel/NeKit/ErrorOr.h3
-rw-r--r--dev/kernel/NeKit/Function.h9
-rw-r--r--dev/kernel/NeKit/Json.h51
-rw-r--r--dev/kernel/NeKit/Ref.h1
-rw-r--r--dev/kernel/NeKit/TOML.h15
-rw-r--r--dev/kernel/NeKit/Variant.h18
-rw-r--r--dev/kernel/src/BitMapMgr.cc23
-rw-r--r--dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc26
-rw-r--r--dev/kernel/src/Json.cc3
-rw-r--r--dev/kernel/src/SoftwareTimer.cc2
-rw-r--r--dev/kernel/src/Variant.cc4
14 files changed, 101 insertions, 68 deletions
diff --git a/dev/kernel/FSKit/OpenHeFS.h b/dev/kernel/FSKit/OpenHeFS.h
index 4e44b948..04f07b8e 100644
--- a/dev/kernel/FSKit/OpenHeFS.h
+++ b/dev/kernel/FSKit/OpenHeFS.h
@@ -17,9 +17,9 @@
/// @file OpenHeFS.h
/// @brief OpenHeFS filesystem support.
-#define kHeFSVersion (0x0103)
-#define kHeFSMagic " HeFS"
-#define kHeFSMagicLen (8)
+#define kHeFSVersion (0x0104)
+#define kHeFSMagic "OpenHeFS"
+#define kHeFSMagicLen (9U)
#define kHeFSBlockLen (512U)
#define kHeFSFileNameLen (256U)
diff --git a/dev/kernel/HALKit/AMD64/HalKernelMain.cc b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
index bd7c207d..dfd71777 100644
--- a/dev/kernel/HALKit/AMD64/HalKernelMain.cc
+++ b/dev/kernel/HALKit/AMD64/HalKernelMain.cc
@@ -148,8 +148,6 @@ EXTERN_C Kernel::Void hal_real_init(Kernel::Void) {
HAL::IDTLoader idt_loader;
idt_loader.Load(idt_reg);
- HAL::mp_init_cores(kHandoverHeader->f_HardwareTables.f_VendorPtr);
-
while (YES)
;
}
diff --git a/dev/kernel/HALKit/AMD64/HalTimer.cc b/dev/kernel/HALKit/AMD64/HalTimer.cc
index 1f500ac9..f6488b05 100644
--- a/dev/kernel/HALKit/AMD64/HalTimer.cc
+++ b/dev/kernel/HALKit/AMD64/HalTimer.cc
@@ -15,7 +15,9 @@
#include <KernelKit/Timer.h>
#include <modules/ACPI/ACPIFactoryInterface.h>
-// timer slot 0
+/// ================================================================================
+/// @note timer slot 0
+/// ================================================================================
#define kHPETSignature ("HPET")
@@ -24,9 +26,11 @@
#define kHPETCompRegValue (0x24)
#define kHPETInterruptRegValue (0x2C)
+/// ================================================================================
///! BUGS: 0
///! @file HalTimer.cc
///! @brief Hardware Timer (HPET)
+/// ================================================================================
namespace Kernel::Detail {
struct HPET_BLOCK : public Kernel::SDT {
diff --git a/dev/kernel/NeKit/ErrorOr.h b/dev/kernel/NeKit/ErrorOr.h
index 2e3afb46..4c924957 100644
--- a/dev/kernel/NeKit/ErrorOr.h
+++ b/dev/kernel/NeKit/ErrorOr.h
@@ -15,6 +15,9 @@
namespace Kernel {
using ErrorT = Int32;
+/// ================================================================================
+/// @brief ErrorOr class for error handling.
+/// ================================================================================
template <typename T>
class ErrorOr final {
public:
diff --git a/dev/kernel/NeKit/Function.h b/dev/kernel/NeKit/Function.h
index 45b1a5af..70242bc3 100644
--- a/dev/kernel/NeKit/Function.h
+++ b/dev/kernel/NeKit/Function.h
@@ -4,13 +4,15 @@
======================================== */
-#ifndef _INC_FUNCTION_H_
-#define _INC_FUNCTION_H_
+#pragma once
#include <NeKit/Defines.h>
#include <NeKit/ErrorOr.h>
namespace Kernel {
+/// ================================================================================
+/// @brief Function wrapper class.
+/// ================================================================================
template <typename T, typename... Args>
class Function final {
public:
@@ -40,11 +42,10 @@ class Function final {
private:
T(*fFn)
- (Args... args);
+ (Args... args){nullptr};
};
template <typename T, typename... Args>
using FunctionOr = ErrorOr<Function<T, Args...>>;
} // namespace Kernel
-#endif // !_INC_FUNCTION_H__
diff --git a/dev/kernel/NeKit/Json.h b/dev/kernel/NeKit/Json.h
index 836a0995..1e804354 100644
--- a/dev/kernel/NeKit/Json.h
+++ b/dev/kernel/NeKit/Json.h
@@ -19,54 +19,68 @@
#define kNeJsonLen (256)
#define kNeJsonNullArr "[]"
#define kNeJsonNullObj "{}"
+#define kNeJsonNullKey "null"
+#define kNeJsonNullValue kNeJsonNullKey
namespace Kernel {
-/// @brief JavaScript object class
+/// ================================================================================
+/// @brief JSON object representation.
+/// ================================================================================
+template <typename CharKind = Char>
class JsonObject final {
public:
explicit JsonObject() {
- auto len = kNeJsonMaxLen;
- KBasicString<> key = KString(len);
- key += kNeJsonNullObj;
+ KBasicString<CharKind> key = KString(kNeJsonMaxLen);
+ key += kNeJsonNullValue;
this->AsKey() = key;
- this->AsValue() = key;
+ this->AsValue() = key;
}
- explicit JsonObject(SizeT lhsLen, SizeT rhsLen) : fKey(lhsLen), fValue(rhsLen) {}
+ explicit JsonObject(SizeT lhsLen, SizeT rhsLen) : fKey(lhsLen), fValue(rhsLen) {
+
+ KBasicString<CharKind> key = KString(lhsLen);
+ this->AsKey() = key;
+
+ KBasicString<CharKind> value = KString(rhsLen);
+ this->AsValue() = value;
+ }
~JsonObject() = default;
NE_COPY_DEFAULT(JsonObject)
+ NE_MOVE_DEFAULT(JsonObject)
Bool& IsUndefined() { return fUndefined; }
private:
Bool fUndefined; // is this instance undefined?
- KBasicString<> fKey;
- KBasicString<> fValue;
+ KBasicString<CharKind> fKey;
+ KBasicString<CharKind> fValue;
public:
/// @brief returns the key of the json
/// @return the key as string view.
- KBasicString<>& AsKey() { return fKey; }
+ KBasicString<CharKind>& AsKey() { return fKey; }
/// @brief returns the value of the json.
/// @return the key as string view.
- KBasicString<>& AsValue() { return fValue; }
+ KBasicString<CharKind>& AsValue() { return fValue; }
- static JsonObject kNull;
+ STATIC JsonObject<CharKind> kNull;
};
-/// @brief JsonObject stream reader helper.
-struct JsonStreamReader final {
- STATIC JsonObject In(const Char* full_array) {
+/// ================================================================================
+/// @brief JsonObject stream reader helper for ASCII.
+/// ================================================================================
+struct AsciiJsonStreamReader final {
+ STATIC JsonObject<Char> In(const Char* full_array) {
auto start_val = '{';
auto end_val = '}';
Boolean probe_value = false;
if (full_array[0] != start_val) {
- if (full_array[0] != '[') return JsonObject::kNull;
+ if (full_array[0] != '[') return JsonObject<Char>{0, 0};
start_val = '[';
end_val = ']';
@@ -79,7 +93,7 @@ struct JsonStreamReader final {
SizeT key_len = 0;
SizeT value_len = 0;
- JsonObject type(kNeJsonMaxLen, kNeJsonMaxLen);
+ JsonObject<Char> type(kNeJsonMaxLen, kNeJsonMaxLen);
for (SizeT i = 1; i < len; ++i) {
if (full_array[i] == '\r' || full_array[i] == '\n') continue;
@@ -125,5 +139,8 @@ struct JsonStreamReader final {
}
};
-using JsonStream = Stream<JsonStreamReader, JsonObject>;
+/// ================================================================================
+/// @brief AsciiJsonStream type definition.
+/// ================================================================================
+using AsciiJsonStream = Stream<AsciiJsonStreamReader, JsonObject<Char>>;
} // namespace Kernel
diff --git a/dev/kernel/NeKit/Ref.h b/dev/kernel/NeKit/Ref.h
index 9c244be5..dac701e0 100644
--- a/dev/kernel/NeKit/Ref.h
+++ b/dev/kernel/NeKit/Ref.h
@@ -56,6 +56,7 @@ class NonNullRef final {
NonNullRef(nullPtr) = delete;
NonNullRef(T* ref) : fRef(ref) { MUST_PASS(ref); }
+ NonNullRef(Ref<T> ref) : fRef(ref) { MUST_PASS(ref); }
Ref<T>& operator->() {
MUST_PASS(fRef);
diff --git a/dev/kernel/NeKit/TOML.h b/dev/kernel/NeKit/TOML.h
new file mode 100644
index 00000000..dee273ad
--- /dev/null
+++ b/dev/kernel/NeKit/TOML.h
@@ -0,0 +1,15 @@
+/* ========================================
+
+ Copyright (C) 2025, Amlal El Mahrouss, licensed under the Apache 2.0 license.
+
+======================================== */
+
+#pragma once
+
+namespace Kernel {
+class TOMLObject final {
+ public:
+ explicit TOMLObject() = delete;
+ ~TOMLObject() = default;
+};
+} // namespace Kernel \ No newline at end of file
diff --git a/dev/kernel/NeKit/Variant.h b/dev/kernel/NeKit/Variant.h
index 42a47bc0..7bcd0dff 100644
--- a/dev/kernel/NeKit/Variant.h
+++ b/dev/kernel/NeKit/Variant.h
@@ -8,6 +8,7 @@
#include <NeKit/Defines.h>
#include <NeKit/Json.h>
+#include <NeKit/TOML.h>
#include <NeKit/KString.h>
#include <SwapKit/DiskSwap.h>
@@ -15,13 +16,13 @@ namespace Kernel {
class Variant final {
public:
enum class VariantKind {
- kString,
+ kInvalid = 0,
+ kString = 200,
kBlob,
kNull,
kJson,
- kXML,
+ kTOML,
kSwap,
- kInvalid,
};
public:
@@ -37,7 +38,9 @@ class Variant final {
explicit Variant(KBasicString<CharKind>* stringView)
: fPtr((VoidPtr) stringView), fKind(VariantKind::kString) {}
- explicit Variant(JsonObject* json) : fPtr((VoidPtr) json), fKind(VariantKind::kJson) {}
+ explicit Variant(JsonObject<>* json) : fPtr((VoidPtr) json), fKind(VariantKind::kJson) {}
+
+ explicit Variant(TOMLObject* toml) : fPtr((VoidPtr) toml), fKind(VariantKind::kTOML) {}
explicit Variant(nullPtr ptr) : fPtr(ptr), fKind(VariantKind::kNull) {}
@@ -47,10 +50,15 @@ class Variant final {
public:
const Char* ToString();
+
+ /// ========================================================================
+ /// @brief Returns the underlying pointer.
+ /// @return the underlying pointer.
+ /// ========================================================================
VoidPtr Leak();
template <typename T>
- T* As() {
+ T* As() noexcept {
return reinterpret_cast<T*>(fPtr);
}
diff --git a/dev/kernel/src/BitMapMgr.cc b/dev/kernel/src/BitMapMgr.cc
index 2039e1c9..d7ecb810 100644
--- a/dev/kernel/src/BitMapMgr.cc
+++ b/dev/kernel/src/BitMapMgr.cc
@@ -88,9 +88,10 @@ namespace HAL {
}
VoidPtr base = reinterpret_cast<VoidPtr>((UIntPtr) base_ptr);
-
MUST_PASS(base);
+ if (!base) return nullptr;
+
STATIC SizeT biggest = 0UL;
while (YES) {
@@ -105,7 +106,7 @@ namespace HAL {
this->GetBitMapStatus(ptr_bit_set);
UInt32 flags = this->MakeMMFlags(wr, user);
- mm_map_page(ptr_bit_set, ptr_bit_set, flags);
+ mm_map_page(ptr_bit_set, (VoidPtr)mm_get_page_addr(ptr_bit_set), flags);
if (biggest < (size + pad)) biggest = size + pad;
@@ -121,7 +122,7 @@ namespace HAL {
this->GetBitMapStatus(ptr_bit_set);
UInt32 flags = this->MakeMMFlags(wr, user);
- mm_map_page(ptr_bit_set, ptr_bit_set, flags);
+ mm_map_page(ptr_bit_set, (VoidPtr)mm_get_page_addr(ptr_bit_set), flags);
if (biggest < (size + pad)) biggest = (size + pad);
@@ -136,7 +137,6 @@ namespace HAL {
: ptr_bit_set[kBitMapSizeIdx];
base = reinterpret_cast<VoidPtr>(raw_base + offset);
-
if (base == nullptr) return nullptr;
}
@@ -166,9 +166,10 @@ namespace HAL {
};
} // namespace Detail
+ STATIC Detail::IBitMapProxy kBitMapMgr;
+
auto mm_is_bitmap(VoidPtr ptr) -> BOOL {
- Detail::IBitMapProxy bitmp;
- return bitmp.IsBitMap(ptr);
+ return kBitMapMgr.IsBitMap(ptr);
}
/***********************************************************************************/
@@ -178,12 +179,10 @@ namespace HAL {
/// @return a new bitmap allocated pointer.
/***********************************************************************************/
auto mm_alloc_bitmap(Boolean wr, Boolean user, SizeT size, Bool is_page, SizeT pad) -> VoidPtr {
- VoidPtr ptr_new = nullptr;
- Detail::IBitMapProxy bitmp;
-
+ VoidPtr ptr_new = nullptr;
if (is_page) return nullptr;
- ptr_new = bitmp.FindBitMap(kKernelBitMpStart, size, wr, user, pad);
+ ptr_new = kBitMapMgr.FindBitMap(kKernelBitMpStart, size, wr, user, pad);
if (!ptr_new) {
ke_panic(RUNTIME_CHECK_VIRTUAL_OUT_OF_MEM, "Out of memory bitmap");
@@ -200,9 +199,7 @@ namespace HAL {
auto mm_free_bitmap(VoidPtr ptr) -> Bool {
if (!ptr) return No;
- Detail::IBitMapProxy bitmp;
- Bool ret = bitmp.FreeBitMap(ptr);
-
+ Bool ret = kBitMapMgr.FreeBitMap(ptr);
return ret;
}
} // namespace HAL
diff --git a/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc b/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc
index c79b6323..d8e22f18 100644
--- a/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc
+++ b/dev/kernel/src/FS/OpenHeFS+FileSystemParser.cc
@@ -764,9 +764,6 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
if (drv_std_get_size() < kHeFSMinimumDiskSize) {
(Void)(kout << "OpenHeFS recommends at least 128 GiB of free space." << kendl);
- (Void)(kout << "The OS will still try to format a OpenHeFS disk here anyway, don't expect "
- "perfect geometry."
- << kendl);
}
HEFS_BOOT_NODE* boot = (HEFS_BOOT_NODE*) RTL_ALLOCA(sizeof(HEFS_BOOT_NODE));
@@ -880,12 +877,12 @@ _Output Bool HeFileSystemParser::Format(_Input _Output DriveTrait* mnt, _Input c
return NO;
}
- constexpr const SizeT kHeFSPreallocateCount = 0x6UL;
+ /// AMLALE: Better way to create default directories than before.
+ const Utf8Char* kFileMap[] = {u8"/", u8"/boot", u8"/system", u8"/network",
+ u8"/devices", u8"/media", u8"/dev", (Utf8Char*) nullptr};
- const Utf8Char* kFileMap[kHeFSPreallocateCount] = {u8"/", u8"/boot", u8"/system",
- u8"/network", u8"/devices", u8"/media"};
-
- for (SizeT i = 0; i < kHeFSPreallocateCount; ++i) {
+ SizeT i = 0;
+ while (kFileMap[++i] != nullptr) {
this->CreateINodeDirectory(mnt, kHeFSEncodingFlagsUTF8, kFileMap[i]);
}
@@ -1153,19 +1150,10 @@ Boolean OpenHeFS::fs_init_openhefs(Void) noexcept {
if (kMountpoint.A().fPacket.fPacketReadOnly == YES) {
kout << "Main disk cannot be mounted (read-only media).\r";
- return NO;
- }
-
- HeFileSystemParser parser;
-
- if (!parser.Format(&kMountpoint.A(), kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName)) {
- kout << "Failed to format OpenHeFS partition!\r";
- return NO;
+ return YES;
}
- kout << "Valid OpenHeFS disk...\r";
-
- return YES;
+ return HeFileSystemParser{}.Format(&kMountpoint.A(), kHeFSEncodingFlagsUTF8, kHeFSDefaultVolumeName);
}
} // namespace Kernel
diff --git a/dev/kernel/src/Json.cc b/dev/kernel/src/Json.cc
index 8f073da8..198aed99 100644
--- a/dev/kernel/src/Json.cc
+++ b/dev/kernel/src/Json.cc
@@ -6,5 +6,4 @@
#include <NeKit/Json.h>
-/// @brief Undefined object, is null in length.
-RTL_INIT_OBJECT(Kernel::JsonObject::kNull, Kernel::JsonObject);
+namespace Kernel {} \ No newline at end of file
diff --git a/dev/kernel/src/SoftwareTimer.cc b/dev/kernel/src/SoftwareTimer.cc
index 167fc630..eafe8db6 100644
--- a/dev/kernel/src/SoftwareTimer.cc
+++ b/dev/kernel/src/SoftwareTimer.cc
@@ -6,8 +6,10 @@
#include <KernelKit/Timer.h>
+/// ================================================================================
/// @brief SoftwareTimer class, meant to be generic.
///! @author Amlal El Mahrouss (amlal@nekernel.org)
+/// ================================================================================
using namespace Kernel;
diff --git a/dev/kernel/src/Variant.cc b/dev/kernel/src/Variant.cc
index 732dabd2..fcf2f443 100644
--- a/dev/kernel/src/Variant.cc
+++ b/dev/kernel/src/Variant.cc
@@ -9,8 +9,8 @@
namespace Kernel {
const Char* Variant::ToString() {
switch (fKind) {
- case VariantKind::kXML:
- return ("Class:{XML}");
+ case VariantKind::kTOML:
+ return ("Class:{TOML}");
case VariantKind::kJson:
return ("Class:{Json}");
case VariantKind::kString: