aboutsummaryrefslogtreecommitdiff
path: root/kapi/include
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-04-29 09:25:53 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-04-29 09:37:44 +0200
commit4b71a936183070e43a6ca73c2975eae70742e124 (patch)
tree2f3f3be1f816bfd392ae09a69c9ff92696b75967 /kapi/include
parentd6ef2153fb32ee7ba04acdf37e7a535a855229db (diff)
downloadkernel-4b71a936183070e43a6ca73c2975eae70742e124.tar.xz
kernel-4b71a936183070e43a6ca73c2975eae70742e124.zip
chore: migrate 'kapi' to p1204 layout
Diffstat (limited to 'kapi/include')
-rw-r--r--kapi/include/kapi/acpi.hpp40
-rw-r--r--kapi/include/kapi/boot.hpp17
-rw-r--r--kapi/include/kapi/boot_module/boot_module.hpp23
-rw-r--r--kapi/include/kapi/boot_module/boot_module_registry.hpp107
-rw-r--r--kapi/include/kapi/boot_modules.hpp31
-rw-r--r--kapi/include/kapi/cio.hpp48
-rw-r--r--kapi/include/kapi/cio/output_device.hpp39
-rw-r--r--kapi/include/kapi/cpu.hpp135
-rw-r--r--kapi/include/kapi/devices.hpp37
-rw-r--r--kapi/include/kapi/devices/bus.hpp63
-rw-r--r--kapi/include/kapi/devices/cpu.hpp37
-rw-r--r--kapi/include/kapi/devices/device.hpp80
-rw-r--r--kapi/include/kapi/devices/manager.hpp53
-rw-r--r--kapi/include/kapi/filesystem.hpp73
-rw-r--r--kapi/include/kapi/interrupts.hpp74
-rw-r--r--kapi/include/kapi/memory.hpp131
-rw-r--r--kapi/include/kapi/memory/address.hpp252
-rw-r--r--kapi/include/kapi/memory/chunk.hpp109
-rw-r--r--kapi/include/kapi/memory/frame.hpp48
-rw-r--r--kapi/include/kapi/memory/frame_allocator.hpp66
-rw-r--r--kapi/include/kapi/memory/layout.hpp54
-rw-r--r--kapi/include/kapi/memory/page.hpp38
-rw-r--r--kapi/include/kapi/memory/page_mapper.hpp90
-rw-r--r--kapi/include/kapi/system.hpp32
24 files changed, 0 insertions, 1677 deletions
diff --git a/kapi/include/kapi/acpi.hpp b/kapi/include/kapi/acpi.hpp
deleted file mode 100644
index 885fcde..0000000
--- a/kapi/include/kapi/acpi.hpp
+++ /dev/null
@@ -1,40 +0,0 @@
-#ifndef TEACHOS_KAPI_ACPI_HPP
-#define TEACHOS_KAPI_ACPI_HPP
-
-#include <acpi/acpi.hpp>
-
-#include <kstd/memory>
-#include <kstd/units>
-
-#include <string_view>
-
-namespace kapi::acpi
-{
-
- //! @addtogroup kapi-acpi-kernel-defined
- //! @{
-
- //! Initialize the ACPI subsystem and discover the available tables.
- //!
- //! @return true iff. a valid system description tabled was found, false otherwise.
- auto init(::acpi::rsdp const & sdp) -> bool;
-
- //! Get a pointer to an ACPI table by its signature.
- //!
- //! @param signature The signature of the table to get.
- //! @return A pointer to the table if found, nullptr otherwise.
- auto get_table(std::string_view signature) -> kstd::observer_ptr<::acpi::table_header const>;
-
- //! Get a type-cast pointer to an ACPI table by its signature.
- //!
- //! @tparam Signature The signature of the table to get
- //! @return A pointer to the table if found, nullptr otherwise.
- template<char const * Signature>
- auto get_table() -> kstd::observer_ptr<::acpi::table_type_t<Signature> const>
- {
- return kstd::make_observer(static_cast<::acpi::table_type_t<Signature> const *>(get_table(Signature).get()));
- }
-
-} // namespace kapi::acpi
-
-#endif
diff --git a/kapi/include/kapi/boot.hpp b/kapi/include/kapi/boot.hpp
deleted file mode 100644
index 55ca941..0000000
--- a/kapi/include/kapi/boot.hpp
+++ /dev/null
@@ -1,17 +0,0 @@
-#ifndef TEACHOS_KAPI_BOOT_HPP
-#define TEACHOS_KAPI_BOOT_HPP
-
-namespace kapi::boot
-{
- //! @qualifier platform-defined
- //! Information passed from the early pre-main stage to the kernel executable.
- //!
- //! The specific structure of this type is defined on a platform level.
- struct information;
-
- //! @qualifier platform-defined
- //! An object passed from the early pre-main stage to the kernel executable.
- extern "C" information const bootstrap_information;
-} // namespace kapi::boot
-
-#endif
diff --git a/kapi/include/kapi/boot_module/boot_module.hpp b/kapi/include/kapi/boot_module/boot_module.hpp
deleted file mode 100644
index 9b4b165..0000000
--- a/kapi/include/kapi/boot_module/boot_module.hpp
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef TEACHOS_KAPI_BOOT_MODULE_BOOT_MODULE_HPP
-#define TEACHOS_KAPI_BOOT_MODULE_BOOT_MODULE_HPP
-
-#include <kapi/memory.hpp>
-
-#include <cstddef>
-#include <string_view>
-
-namespace kapi::boot_modules
-{
- // ! The boot module struct
- // !
- // ! The boot module struct represents a module loaded by the bootloader, and contains information about it, such as
- // ! its name, virtual start address, and size.
- struct boot_module
- {
- std::string_view name{};
- memory::linear_address start_address{};
- std::size_t size{};
- };
-} // namespace kapi::boot_modules
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/boot_module/boot_module_registry.hpp b/kapi/include/kapi/boot_module/boot_module_registry.hpp
deleted file mode 100644
index fc3590f..0000000
--- a/kapi/include/kapi/boot_module/boot_module_registry.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef TEACHOS_KAPI_BOOT_MODULE_BOOT_MODULE_REGISTRY_HPP
-#define TEACHOS_KAPI_BOOT_MODULE_BOOT_MODULE_REGISTRY_HPP
-
-#include <kapi/boot_module/boot_module.hpp>
-
-#include <kstd/vector>
-
-#include <cstddef>
-
-namespace kapi::boot_modules
-{
-
- // ! The interface of the boot module registry
- // !
- // ! The boot module registry is responsible for keeping track of the modules loaded by the bootloader, and
- // ! providing access to them for the rest of the kernel.
- struct boot_module_registry
- {
- using range_type = kstd::vector<boot_module>;
- using value_type = range_type::value_type;
- using const_reference = range_type::const_reference;
-
- using const_iterator = range_type::const_iterator;
- using const_reverse_iterator = range_type::const_reverse_iterator;
- using size_type = range_type::size_type;
-
- [[nodiscard]] auto begin() const noexcept -> const_iterator
- {
- return m_modules.begin();
- }
-
- [[nodiscard]] auto end() const noexcept -> const_iterator
- {
- return m_modules.end();
- }
-
- [[nodiscard]] auto cbegin() const noexcept -> const_iterator
- {
- return begin();
- }
-
- [[nodiscard]] auto cend() const noexcept -> const_iterator
- {
- return end();
- }
-
- [[nodiscard]] auto rbegin() const noexcept -> const_reverse_iterator
- {
- return m_modules.rbegin();
- }
-
- [[nodiscard]] auto rend() const noexcept -> const_reverse_iterator
- {
- return m_modules.rend();
- }
-
- [[nodiscard]] auto crbegin() const noexcept -> const_reverse_iterator
- {
- return rbegin();
- }
-
- [[nodiscard]] auto crend() const noexcept -> const_reverse_iterator
- {
- return rend();
- }
-
- [[nodiscard]] auto front() const noexcept -> const_reference
- {
- return m_modules.front();
- }
-
- [[nodiscard]] auto back() const noexcept -> const_reference
- {
- return m_modules.back();
- }
-
- [[nodiscard]] auto size() const noexcept -> std::size_t
- {
- return m_modules.size();
- }
-
- [[nodiscard]] auto empty() const noexcept -> bool
- {
- return m_modules.empty();
- }
-
- [[nodiscard]] auto at(std::size_t index) const -> const_reference
- {
- return m_modules.at(index);
- }
-
- [[nodiscard]] auto operator[](std::size_t index) const noexcept -> const_reference
- {
- return m_modules[index];
- }
-
- auto add_boot_module(boot_module module) -> void
- {
- m_modules.push_back(module);
- }
-
- private:
- range_type m_modules{};
- };
-} // namespace kapi::boot_modules
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/boot_modules.hpp b/kapi/include/kapi/boot_modules.hpp
deleted file mode 100644
index 026479d..0000000
--- a/kapi/include/kapi/boot_modules.hpp
+++ /dev/null
@@ -1,31 +0,0 @@
-#ifndef TEACHOS_KAPI_BOOT_MODULES_HPP
-#define TEACHOS_KAPI_BOOT_MODULES_HPP
-
-#include <kapi/boot_module/boot_module_registry.hpp> // IWYU pragma: export
-
-namespace kapi::boot_modules
-{
-
- //! @qualifier platform-defined
- //! Initialize the boot module registry.
- //!
- //! @note This function must be implemented by the target platform.
- //!
- //! This function initializes the boot module registry, which is responsible for keeping track of the modules loaded
- //! by the bootloader, and providing access to them for the rest of the kernel.
- auto init() -> void;
-
- //! @qualifier kernel-defined
- //! Set the boot module registry
- //!
- //! @param registry A new boot module registry.
- auto set_boot_module_registry(boot_module_registry & registry) -> void;
-
- //! @qualifier kernel-defined
- //! Get the boot module registry.
- //!
- //! @returns The boot module registry.
- auto get_boot_module_registry() -> boot_module_registry &;
-
-} // namespace kapi::boot_modules
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/cio.hpp b/kapi/include/kapi/cio.hpp
deleted file mode 100644
index 9bbf7fa..0000000
--- a/kapi/include/kapi/cio.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef TEACHOS_KAPI_CIO_HPP
-#define TEACHOS_KAPI_CIO_HPP
-
-#include <kapi/cio/output_device.hpp> // IWYU pragma: export
-
-#include <kstd/format>
-
-#include <optional>
-#include <string_view>
-
-namespace kapi::cio
-{
-
- //! @addtogroup kapi-cio
- //! @{
- //! @}
-
- //! @addtogroup kapi-cio-kernel-defined
- //! @{
-
- //! Set the currently active output device.
- //!
- //! @param device A new output device.
- //! @return The previously active output device.
- auto set_output_device(output_device & device) -> std::optional<output_device *>;
-
- //! Write a string to the given output stream.
- //!
- //! @param stream The output stream to write to.
- //! @param text The text to write to the stream.
- auto write(output_stream stream, std::string_view text) -> void;
-
- //! @}
-
- //! @addtogroup kapi-cio-platform-defined
- //! @{
-
- //! Initialize the character I/O subsystem.
- //!
- //! If a platform support character output, it shall ensure that when this function returns, basic character
- //! output can be performed on the system.
- auto init() -> void;
-
- //! @}
-
-} // namespace kapi::cio
-
-#endif
diff --git a/kapi/include/kapi/cio/output_device.hpp b/kapi/include/kapi/cio/output_device.hpp
deleted file mode 100644
index 9fe2557..0000000
--- a/kapi/include/kapi/cio/output_device.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef TEACHOS_KAPI_CIO_OUTPUT_DEVICE_HPP
-#define TEACHOS_KAPI_CIO_OUTPUT_DEVICE_HPP
-
-// IWYU pragma: private, include <kapi/cio.hpp>
-
-#include <string_view>
-
-namespace kapi::cio
-{
-
- enum struct output_stream
- {
- stdout,
- stderr,
- };
-
- //! The interface of a device able to perform character output on a platform.
- struct output_device
- {
- output_device(output_device const &) = delete;
- output_device(output_device &&) = delete;
- auto operator=(output_device const &) -> output_device & = delete;
- auto operator=(output_device &&) -> output_device & = delete;
-
- virtual ~output_device() = default;
-
- //! Write the given text to the output device.
- //!
- //! @param stream The stream to write to.
- //! @param text The text to write.
- auto virtual write(output_stream stream, std::string_view text) -> void = 0;
-
- protected:
- output_device() = default;
- };
-
-} // namespace kapi::cio
-
-#endif
diff --git a/kapi/include/kapi/cpu.hpp b/kapi/include/kapi/cpu.hpp
deleted file mode 100644
index deaf5cd..0000000
--- a/kapi/include/kapi/cpu.hpp
+++ /dev/null
@@ -1,135 +0,0 @@
-#ifndef TEACHOS_KAPI_CPU_HPP
-#define TEACHOS_KAPI_CPU_HPP
-
-#include <kapi/memory.hpp>
-
-#include <kstd/format>
-#include <kstd/memory>
-
-#include <cstdint>
-
-namespace kapi::cpu
-{
-
- //! @addtogroup kapi-cpu
- //! @{
-
- //! An exception originating from the CPU directly.
- //!
- //! Exception generally model interrupts that are synchronous to the instruction stream. This means that they do not
- //! originate from external hardware, but rather are a product of program execution.
- struct exception
- {
- //! The type of the exception, which identifies the reason for it being raised.
- enum class type : std::uint8_t
- {
- //! The reason for the exception is unknown or platform-specific
- unknown,
- //! A page fault occurred
- page_fault,
- //! A memory access (either in the data or instruction stream) violated it's alignment constraints.
- alignment_fault,
- //! A memory access (either in the data or instruction stream) violated it's permissions.
- memory_access_fault,
- //! An invalid instruction was present in the instruction stream.
- illegal_instruction,
- //! The preconditions for the execution of an instruction were not met.
- privilege_violation,
- //! An arithmetic error occurred.
- arithmetic_error,
- //! A breakpoint was hit in the instruction stream.
- breakpoint,
- //! The CPU is single-stepping through the instruction stream.
- single_step,
- };
-
- //! The type of this exception.
- type type{};
-
- //! The value of the instruction pointer at the time this exception was raised.
- kapi::memory::linear_address instruction_pointer{};
-
- //! The memory address that caused this exception.
- kapi::memory::linear_address access_address{};
-
- //! Whether the page was present at the time of the exception.
- bool is_present{};
-
- //! Whether the exception was caused by a write access.
- bool is_write_access{};
-
- //! Whether the exception was caused by a user mode access.
- bool is_user_mode{};
- };
-
- //! @}
-
- //! @addtogroup kapi-cpu-kernel-defined
- //! @{
-
- //! Dispatch an exception to the appropriate handler.
- //!
- //! @param context The exception context.
- //! @return Whether the exception was handled.
- [[nodiscard]] auto dispatch(exception const & context) -> bool;
-
- //! @}
-
- //! @addtogroup kapi-cpu-platform-defined
- //! @{
-
- //! Halt the CPU.
- //!
- //! This function terminates execution of the kernel.
- [[noreturn]] auto halt() -> void;
-
- //! Perform early CPU initialization.
- //!
- //! When this function returns, the CPU is in a state where interrupt could be enabled. This function must not enable
- //! interrupts itself.
- auto init() -> void;
-
- //! Discover the CPU topology of the platform and attach it to the given CPU bus.
- //!
- //! @return true iff. the CPU topology was discovered successfully, false otherwise.
- auto discover_topology() -> bool;
-
- //! @}
-
-} // namespace kapi::cpu
-
-template<>
-struct kstd::formatter<enum kapi::cpu::exception::type>
-{
- constexpr auto parse(kstd::format_parse_context & ctx) -> decltype(ctx.begin())
- {
- return ctx.begin();
- }
-
- constexpr auto format(enum kapi::cpu::exception::type type, kstd::format_context & ctx) const -> void
- {
- switch (type)
- {
- case kapi::cpu::exception::type::unknown:
- return ctx.push("unknown");
- case kapi::cpu::exception::type::page_fault:
- return ctx.push("page fault");
- case kapi::cpu::exception::type::alignment_fault:
- return ctx.push("alignment fault");
- case kapi::cpu::exception::type::memory_access_fault:
- return ctx.push("memory access fault");
- case kapi::cpu::exception::type::illegal_instruction:
- return ctx.push("illegal instruction");
- case kapi::cpu::exception::type::privilege_violation:
- return ctx.push("privilege violation");
- case kapi::cpu::exception::type::arithmetic_error:
- return ctx.push("arithmetic error");
- case kapi::cpu::exception::type::breakpoint:
- return ctx.push("breakpoint");
- case kapi::cpu::exception::type::single_step:
- return ctx.push("single step");
- }
- }
-};
-
-#endif
diff --git a/kapi/include/kapi/devices.hpp b/kapi/include/kapi/devices.hpp
deleted file mode 100644
index b597aa8..0000000
--- a/kapi/include/kapi/devices.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef TEACHOS_KAPI_DEVICES_HPP
-#define TEACHOS_KAPI_DEVICES_HPP
-
-#include <kapi/devices/bus.hpp> // IWYU pragma: export
-#include <kapi/devices/cpu.hpp> // IWYU pragma: export
-#include <kapi/devices/device.hpp> // IWYU pragma: export
-#include <kapi/devices/manager.hpp> // IWYU pragma: export
-
-namespace kapi::devices
-{
-
- //! @addtogroup kapi-devices-kernel-defined
- //! @{
-
- //! Initialize the kernel's device management subsystem.
- auto init() -> void;
-
- //! Get the virtual system root bus.
- //!
- //! @warning This function will panic if the root bus has not been initialized.
- //!
- //! @return a reference to the root bus.
- auto get_root_bus() -> bus &;
-
- //! @}
-
- //! @addtogroup kapi-devices-platform-defined
- //! @{
-
- //! Initialize the platform's device tree.
- auto init_platform_devices() -> void;
-
- //! @}
-
-} // namespace kapi::devices
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/devices/bus.hpp b/kapi/include/kapi/devices/bus.hpp
deleted file mode 100644
index 59f49f7..0000000
--- a/kapi/include/kapi/devices/bus.hpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef TEACHOS_KAPI_DEVICES_BUS_HPP
-#define TEACHOS_KAPI_DEVICES_BUS_HPP
-
-// IWYU pragma: private, include <kapi/devices.hpp>
-
-#include <kapi/devices/device.hpp>
-
-#include <kstd/memory>
-#include <kstd/print>
-#include <kstd/string>
-#include <kstd/vector>
-
-#include <atomic>
-#include <cstddef>
-
-namespace kapi::devices
-{
-
- //! @addtogroup kapi-devices-kernel-defined
- //! @{
-
- //! A bus device that represents a logical/physical tree of devices and busses.
- struct bus : device
- {
- //! Construct a bus with the given major number, minor number, and name.
- //!
- //! @param major The major number of the bus.
- //! @param minor The minor number of the bus.
- //! @param name The name of the bus.
- bus(std::size_t major, std::size_t minor, kstd::string const & name);
-
- //! Initialize the bus and all of its children.
- //!
- //! @return true iff. the bus and all of its children are healthy, false otherwise.
- auto init() -> bool final;
-
- //! Attach a child device to this bus.
- //!
- //! Whenever a device is attached to a bus, the bus takes sole ownership of the device.
- //!
- //! @param child The child device to attach.
- auto add_child(kstd::unique_ptr<device> child) -> void;
-
- [[nodiscard]] auto children() const -> kstd::vector<kstd::observer_ptr<device>> const &;
-
- protected:
- //! Probe the bus hardware state.
- //!
- //! @return true iff. the bus hardware is healthy, false otherwise.
- auto virtual probe() -> bool;
-
- private:
- kstd::vector<kstd::unique_ptr<device>> m_devices;
- kstd::vector<kstd::observer_ptr<device>> m_observers;
- std::atomic_flag m_init_was_called{};
- std::atomic_flag m_initialized{};
- };
-
- //! @}
-
-} // namespace kapi::devices
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/devices/cpu.hpp b/kapi/include/kapi/devices/cpu.hpp
deleted file mode 100644
index f8ff60c..0000000
--- a/kapi/include/kapi/devices/cpu.hpp
+++ /dev/null
@@ -1,37 +0,0 @@
-#ifndef TEACHOS_KAPI_DEVICES_CPU_HPP
-#define TEACHOS_KAPI_DEVICES_CPU_HPP
-
-#include <kapi/devices/bus.hpp>
-
-#include <cstddef>
-#include <cstdint>
-
-namespace kapi::devices
-{
-
- //! A virtual CPU bus to host all CPUs in the system.
- struct cpu final : kapi::devices::bus
- {
- //! A virtual CPU Core to host all core local devices.
- struct core final : kapi::devices::bus
- {
- explicit core(std::size_t major_number, std::size_t minor_number, std::uint64_t hardware_id, bool is_bsp);
-
- [[nodiscard]] auto hardware_id() const -> std::uint64_t;
- [[nodiscard]] auto is_bsp() const -> bool;
-
- private:
- std::uint64_t m_hardware_id;
- bool m_is_bsp;
- };
-
- //! Create a new CPU with the given major and minor numbers.
- //!
- //! @param major The major number of this CPU
- //! @param minor The minor number of this CPU, identifying the physical CPU
- cpu(std::size_t major, std::size_t minor);
- };
-
-} // namespace kapi::devices
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/devices/device.hpp b/kapi/include/kapi/devices/device.hpp
deleted file mode 100644
index 70cf01f..0000000
--- a/kapi/include/kapi/devices/device.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef TEACH_OS_KAPI_DEVICES_DEVICE_HPP
-#define TEACH_OS_KAPI_DEVICES_DEVICE_HPP
-
-// IWYU pragma: private, include <kapi/devices.hpp>
-
-#include <kstd/memory>
-#include <kstd/string>
-
-#include <cstddef>
-
-namespace kapi::devices
-{
-
- //! @addtogroup kapi-devices-kernel-defined
- //! @{
-
- /**
- * @brief Base device identified by a major, minor number and name.
- */
- struct device
- {
- /**
- * @brief Create a device identifier from @p major, @p minor and @p name.
- * @param major Device major number.
- * @param minor Device minor number.
- * @param name Device name.
- */
- device(size_t major, size_t minor, kstd::string const & name);
-
- /**
- * @brief Virtual destructor for device.
- */
- virtual ~device() = default;
-
- /**
- * @brief Initialize the device.
- * @return true on success, false otherwise.
- */
- virtual auto init() -> bool = 0;
-
- /**
- * @brief Returns the major number of the device.
- * @return Device major number.
- */
- [[nodiscard]] auto major() const -> size_t;
-
- /**
- * @brief Returns the minor number of the device.
- * @return Device minor number.
- */
- [[nodiscard]] auto minor() const -> size_t;
-
- /**
- * @brief Returns the name of the device.
- * @return Device name.
- */
- [[nodiscard]] auto name() const -> kstd::string const &;
-
- /**
- * @brief Check if the device is a block device.
- * @return true if this device is a block device, false otherwise.
- */
- [[nodiscard]] virtual auto is_block_device() const -> bool;
-
- private:
- friend struct bus;
-
- auto set_parent(kstd::observer_ptr<struct bus> parent) -> void;
-
- size_t m_major;
- size_t m_minor;
- kstd::string m_name;
- kstd::observer_ptr<bus> m_parent;
- };
-
- //! @}
-
-} // namespace kapi::devices
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/devices/manager.hpp b/kapi/include/kapi/devices/manager.hpp
deleted file mode 100644
index c9b90b4..0000000
--- a/kapi/include/kapi/devices/manager.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef TEACHOS_KAPI_DEVICES_MANAGER_HPP
-#define TEACHOS_KAPI_DEVICES_MANAGER_HPP
-
-// IWYU pragma: private, include <kapi/devices.hpp>
-
-#include <kapi/devices/device.hpp>
-
-#include <kstd/memory>
-
-#include <cstddef>
-#include <string_view>
-
-namespace kapi::devices
-{
-
- //! @addtogroup kapi-devices-kernel-defined
- //! @{
-
- //! Ask the kernel to allocate a new major number.
- //!
- //! @return a new, unused major number.
- auto allocate_major_number() -> std::size_t;
-
- //! Register a new device with the kernel's device manager.
- //!
- //! @param device The device to register.
- //! @return true if the device was registered successfully, false otherwise.
- auto register_device(device & device) -> bool;
-
- //! Unregister a device from the kernel's device manager.
- //!
- //! @param device The device to unregister.
- //! @return true if the device was unregistered successfully, false otherwise.
- auto unregister_device(device & device) -> bool;
-
- //! Find a device by its major and minor numbers.
- //!
- //! @param major the major number of the device.
- //! @param minor the minor number of the device.
- //! @return a pointer to the device iff. the device was found, nullptr otherwise.
- auto find_device(std::size_t major, std::size_t minor) -> kstd::observer_ptr<device>;
-
- //! Find a device by its name.
- //!
- //! @param name the name of the device.
- //! @return a pointer to the device iff. the device was found, nullptr otherwise.
- auto find_device(std::string_view name) -> kstd::observer_ptr<device>;
-
- //! @}
-
-} // namespace kapi::devices
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/filesystem.hpp b/kapi/include/kapi/filesystem.hpp
deleted file mode 100644
index 94d42ce..0000000
--- a/kapi/include/kapi/filesystem.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef TEACHOS_KAPI_FILESYSTEM_HPP
-#define TEACHOS_KAPI_FILESYSTEM_HPP
-
-#include <cstddef>
-#include <string_view>
-
-#include <sys/types.h>
-
-namespace kapi::filesystem
-{
- /**
- @brief The kapi::filesystem namespace provides the interface for filesystem operations in the kernel. It includes
- functions for mounting and unmounting filesystems, as well as basic file operations such as opening, closing, reading
- from, and writing to files. The actual implementation of these functions is in the kernel's filesystem subsystem,
- which will handle the specifics of different filesystem types and their interactions with the underlying storage
- devices.
- */
-
- /**
- @brief Mounts a filesystem from the specified @p source at the specified @p target path.
- @param source The source device or filesystem to mount.
- @param target The target mount point.
- @return 0 on success, -1 on failure.
- @qualifier kernel-defined
- */
- auto mount(std::string_view source, std::string_view target) -> int;
-
- /**
- @brief Unmounts a filesystem from the specified @p target path.
- @param target The target mount point to unmount.
- @return 0 on success, -1 on failure.
- @qualifier kernel-defined
- */
- auto umount(std::string_view target) -> int;
-
- /**
- @brief Opens a file at the specified @p path.
- @param path The path to the file to open.
- @return A file descriptor on success, -1 on failure.
- @qualifier kernel-defined
- */
- auto open(std::string_view path) -> int;
-
- /**
- @brief Closes a @p file_descriptor.
- @param file_descriptor The file descriptor to close.
- @return 0 on success, -1 on failure.
- @qualifier kernel-defined
- */
- auto close(int file_descriptor) -> int;
-
- /**
- @brief Reads @p size bytes into @p buffer from a @p file_descriptor.
- @param file_descriptor The file descriptor to read from.
- @param buffer The buffer to store the read data.
- @param size The number of bytes to read.
- @return The number of bytes read on success, -1 on failure.
- @qualifier kernel-defined
- */
- auto read(int file_descriptor, void * buffer, size_t size) -> ssize_t;
-
- /**
- @brief Writes @p size bytes from @p buffer to a @p file_descriptor.
- @param file_descriptor The file descriptor to write to.
- @param buffer The buffer containing the data to write.
- @param size The number of bytes to write.
- @return The number of bytes written on success, -1 on failure.
- @qualifier kernel-defined
- */
- auto write(int file_descriptor, void const * buffer, size_t size) -> ssize_t;
-} // namespace kapi::filesystem
-
-#endif // TEACHOS_KAPI_FILESYSTEM_HPP \ No newline at end of file
diff --git a/kapi/include/kapi/interrupts.hpp b/kapi/include/kapi/interrupts.hpp
deleted file mode 100644
index 4ba0684..0000000
--- a/kapi/include/kapi/interrupts.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef TEACHOS_KAPI_INTERRUPTS_HPP
-#define TEACHOS_KAPI_INTERRUPTS_HPP
-
-#include <cstdint>
-
-namespace kapi::interrupts
-{
-
- //! @addtogroup kapi-interrupts
- //! @{
-
- //! A status that indicates whether an interrupt was handled by a handler.
- enum class status : bool
- {
- //! The interrupt was not handled by any handler.
- unhandled,
- //! The interrupt was handled by at least one handler.
- handled,
- };
-
- //! The interface for all interrupt handlers.
- struct handler
- {
- virtual ~handler() = default;
-
- //! Handle an interrupt with the given IRQ number.
- //
- //! This function will be called by the kernel in an interrupt context. As such, the function should complete its
- //! task quickly and must take care when acquiring globally shared locks.
- //!
- //! @param irq_number The identifier of the interrupt request that triggered the handler.
- //! @return status::handled if the handler successfully handled the interrupt, status::unhandled otherwise.
- virtual auto handle_interrupt(std::uint32_t irq_number) -> status = 0;
- };
-
- //! @}
-
- //! @addtogroup kapi-interrupts-kernel-defined
- //! @{
-
- //! Register an interrupt handler for the given IRQ number.
- //!
- //! @param irq_number The IRQ number to register the handler for.
- //! @param handler The interrupt handler to register.
- auto register_handler(std::uint32_t irq_number, handler & handler) -> void;
-
- //! Unregister a previously registered interrupt handler.
- //!
- //! @param irq_number The IRQ number to unregister the handler for.
- //! @param handler The interrupt handler to unregister.
- auto unregister_handler(std::uint32_t irq_number, handler & handler) -> void;
-
- //! Dispatch an interrupt to all registered handlers.
- //!
- //! @param irq_number The IRQ number to dispatch.
- //! @return status::handled if the interrupt was handled by at least one handler, status::unhandled otherwise.
- auto dispatch(std::uint32_t irq_number) -> status;
-
- //! @}
-
- //! @addtogroup kapi-interrupts-platform-defined
- //! @{
-
- //! Enable external interrupts.
- auto enable() -> void;
-
- //! Disable external interrupts.
- auto disable() -> void;
-
- //! @}
-
-} // namespace kapi::interrupts
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/memory.hpp b/kapi/include/kapi/memory.hpp
deleted file mode 100644
index 8ad8d6e..0000000
--- a/kapi/include/kapi/memory.hpp
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_HPP
-#define TEACHOS_KAPI_MEMORY_HPP
-
-#include <kapi/memory/address.hpp> // IWYU pragma: export
-#include <kapi/memory/chunk.hpp> // IWYU pragma: export
-#include <kapi/memory/frame.hpp> // IWYU pragma: export
-#include <kapi/memory/frame_allocator.hpp> // IWYU pragma: export
-#include <kapi/memory/layout.hpp> // IWYU pragma: export
-#include <kapi/memory/page.hpp> // IWYU pragma: export
-#include <kapi/memory/page_mapper.hpp> // IWYU pragma: export
-
-#include <cstddef>
-#include <optional>
-#include <utility>
-
-namespace kapi::memory
-{
-
- using mmio_region = std::pair<linear_address, std::size_t>;
-
- //! @addtogroup kapi-memory-kernel-defined
- //! @{
-
- //! Initialize the physical memory manager.
- //!
- //! This function initializes the kernel-wide physical memory manager. The function will invoke the handoff handler to
- //! transfer the platform-specific frame allocation state to the physical memory manager.
- //!
- //! @note Once this function returns, the global allocator has been replaced by the platform-agnostic, kernel-defined
- //! allocator. Any state of the platform specific allocator may be released.
- //!
- //! @param frame_count The number of frames present in the system.
- //! @param handoff_handler A function to be invoked to transfer the platform-specific frame allocation state. The
- //! allocator to hand off to is passed to the handler.
- auto init_pmm(std::size_t frame_count, void (&handoff_handler)(frame_allocator &)) -> void;
-
- //! Get the currently active frame allocator.
- auto get_frame_allocator() -> frame_allocator &;
-
- //! Set the currently active frame allocator.
- //!
- //! @param allocator A new frame allocator.
- //! @return The previously active frame allocator.
- auto set_frame_allocator(frame_allocator & allocator) -> std::optional<frame_allocator *>;
-
- //! Set the currently active page mapper.
- //!
- //! @param mapper A new page mapper.
- //! @return The previously active page mapper.
- auto set_page_mapper(page_mapper & mapper) -> std::optional<page_mapper *>;
-
- //! Allocate a new frame of physical memory
- //!
- //! @warning This function will panic if no frame allocator has been registered.
- //!
- //! @return An engaged std::optional iff. a frame could be allocated, std::nullopt otherwise.
- auto allocate_frame() -> std::optional<frame>;
-
- //! Allocate multiple new frames of physical memory
- //!
- //! @warning This function will panic if no frame allocator has been registered.
- //!
- //! @return An engaged std::optional iff. @p count frames could be allocated, std::nullopt otherwise.
- auto allocate_many_frames(std::size_t count) -> std::optional<std::pair<frame, std::size_t>>;
-
- //! Map a page onto a frame.
- //!
- //! @warning This function will panic if no page mapper has been registered, or the page has already been mapped.
- //! This function will not ensure that the frame is not already in use.
- //!
- //! @param page The page to map.
- //! @param frame The frame to map the page into.
- //! @param flags The flags to apply to this mapping.
- //! @return A pointer to the first byte of the mapped page.
- auto map(page page, frame frame, page_mapper::flags flags = page_mapper::flags::empty) -> std::byte *;
-
- //! Unmap a page.
- //!
- //! @warning This function will panic if no page mapper has been registered, or the page is not mapped.
- //!
- //! @param page The page to unmap
- auto unmap(page page) -> void;
-
- //! Initialize the Memory-mapped I/O region system.
- //!
- //! @param base The base address for the MMIO region.
- //! @param page_count The number of pages the MMIO region is spans.
- auto init_mmio(linear_address base, std::size_t page_count) -> void;
-
- //! Allocate a Memory-mapped I/O region of the given size.
- //!
- //! @warning This function will panic if the MMIO system has not been initialized!
- //! @param page_count The number of pages to allocate.
- auto allocate_mmio_region(std::size_t page_count) -> mmio_region;
-
- //! Map a region of Memory-mapped I/O address space to a given hardware address using the given flags.
- //!
- //! @warning This function will panic if no page mapper has been registered, or the page has already been mapped.
- //! This function will not ensure that the frame is not already in use.
- //!
- //! This function will always set the @p uncached flag.
- //!
- //! @param region The region to map.
- //! @param hw_base The base of the hardware region.
- //! @param flags The flags to apply.
- auto map_mmio_region(mmio_region region, physical_address hw_base, page_mapper::flags flags = {}) -> std::byte *;
-
- //! Release a Memory-mapped I/O region.
- //!
- //! @warning This function will panic if the MMIO system has not been initialized!
- //! @param region The region to release.
- auto release_mmio_region(mmio_region region) -> void;
-
- //! @}
-
- //! @addtogroup kapi-memory-platform-defined
- //! @{
-
- //! Initialize the memory subsystem.
- //!
- //! @note This function must be implemented by the target platform.
- //!
- //! This function initializes the memory subsystem and activates the platform-specific frame allocator and page
- //! mapper. When this function returns, a valid frame allocator and page mapper are expected to have been registered.
- auto init() -> void;
-
- //! @}
-
-} // namespace kapi::memory
-
-#endif
diff --git a/kapi/include/kapi/memory/address.hpp b/kapi/include/kapi/memory/address.hpp
deleted file mode 100644
index 9231cfc..0000000
--- a/kapi/include/kapi/memory/address.hpp
+++ /dev/null
@@ -1,252 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_ADDRESS_HPP
-#define TEACHOS_KAPI_MEMORY_ADDRESS_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kstd/format>
-#include <kstd/units>
-
-#include <bit>
-#include <compare>
-#include <cstddef>
-#include <cstdint>
-#include <string_view>
-
-namespace kapi::memory
-{
-
- //! @qualifier kernel-defined
- //! A tag for different address types.
- enum struct address_type : bool
- {
- linear,
- physical,
- };
-
- //! @qualifier kernel-defined
- //! A physical or virtual address.
- //!
- //! This convenience wrapper type is used to ensure that no linear address is passed where a physical one is expected
- //! and vice versa.
- //!
- //! @tparam Type The type of address.
- template<address_type Type>
- struct address
- {
- //! Construct a null-address.
- constexpr address() noexcept = default;
-
- //! Construct an address representing the given value.
- //!
- //! @param value The raw value to initialize this address with.
- constexpr explicit address(std::uintptr_t value) noexcept
- : m_value{value}
- {}
-
- //! Construct an address representing the given pointer value.
- //!
- //! @param pointer The pointer value to initialize this address with.
- explicit address(std::byte * pointer) noexcept
- : m_value{std::bit_cast<std::uintptr_t>(pointer)}
- {}
-
- //! Convert this address into a C++ pointer.
- //!
- //! @tparam T The type of the object this address should refer to.
- //! @return This address as a typed pointer to the given type.
- template<typename ObjectType>
- explicit operator ObjectType *() const noexcept
- {
- return std::bit_cast<ObjectType *>(m_value);
- }
-
- //! Create a new address n beyond this one.
- //!
- //! @param n The amount to add to this address.
- //! @return A new address, n further than this one.
- [[nodiscard]] constexpr auto operator+(std::ptrdiff_t n) const noexcept -> address
- {
- return address{m_value + n};
- }
-
- //! Increment this address by a given amount.
- //!
- //! @param n The amount to Increment the address by.
- //! @return A reference to this address.
- constexpr auto operator+=(std::ptrdiff_t n) noexcept -> address &
- {
- m_value += n;
- return *this;
- }
-
- //! Increment this address by one.
- //!
- //! @return A reference to this address.
- constexpr auto operator++() noexcept -> address &
- {
- return (*this += 1);
- }
-
- //! Increment this address by one.
- //!
- //! @return A copy of this address before the increment.
- constexpr auto operator++(int) noexcept -> address
- {
- auto copy = *this;
- ++*this;
- return copy;
- }
-
- //! Create a new address n bytes before this one
- //!
- //! @param n The amount to subtract from this address
- //! @return A nre address, @p n ahead of this one
- [[nodiscard]] constexpr auto operator-(std::ptrdiff_t n) noexcept -> address
- {
- return address{m_value - n};
- }
-
- //! Decrement this address by a given amount.
- //!
- //! @param n The amount to Decrement the address by.
- //! @return A reference to this address.
- constexpr auto operator-=(std::ptrdiff_t n) noexcept -> address &
- {
- m_value -= n;
- return *this;
- }
-
- //! Decrement this address by one.
- //!
- //! @return A reference to this address.
- constexpr auto operator--() noexcept -> address &
- {
- return (*this -= 1);
- }
-
- //! Decrement this address by one.
- //!
- //! @return A copy of this address before the decrement.
- constexpr auto operator--(int) noexcept -> address
- {
- auto copy = *this;
- --*this;
- return copy;
- }
-
- //! Calculate the distance between this address and another one
- //!
- //! @param other The address to calculate the distance to.
- //! @return The distance between this address and the given one.
- [[nodiscard]] constexpr auto operator-(address const & other) noexcept -> std::ptrdiff_t
- {
- return m_value - other.m_value;
- }
-
- //! Extract the lower bits of the address
- //!
- //! @note The only meaningful values for @p n are powers of two.
- //!
- //! @param n The divisor to use for extraction.
- //! @return The lower bits of the address as defined by the divisor.
- constexpr auto operator%(std::size_t n) const noexcept -> std::uintptr_t
- {
- return m_value % n;
- }
-
- //! Extract the upper bits of the address
- //!
- //! @note The only meaningful values for @p n are powers of two.
- //!
- //! @param n The divisor to use for extraction.
- //! @return The upper bits of the address as defined by the divisor.
- constexpr auto operator/(std::size_t n) const noexcept -> std::uintptr_t
- {
- return m_value / n;
- }
-
- //! Shift this address n bits to the right.
- //!
- //! @param n The width of the shift.
- //! @return A new address representing the result of the shift operation.
- constexpr auto operator>>(std::size_t n) const noexcept -> address
- {
- return address{m_value >> n};
- }
-
- //! Apply the given mask to this address.
- //!
- //! @param mask The mask to apply
- //! @return A new address representing the result of the masking operation.
- template<typename MaskType>
- constexpr auto operator&(MaskType mask) const noexcept -> MaskType
- {
- return static_cast<MaskType>(m_value & mask);
- }
-
- constexpr auto operator+(kstd::units::bytes n) const noexcept -> address
- {
- return address{m_value + n.value};
- }
-
- constexpr auto operator+=(kstd::units::bytes n) noexcept -> address &
- {
- return *this = *this + n;
- }
-
- //! Check if this address is equal to another one.
- constexpr auto operator==(address const &) const noexcept -> bool = default;
-
- //! Lexicographically compare this address with another one.
- constexpr auto operator<=>(address const &) const noexcept -> std::strong_ordering = default;
-
- //! Extract the raw value from this address.
- //!
- //! @return The raw value of this address.
- [[nodiscard]] constexpr auto raw() const noexcept -> std::uintptr_t
- {
- return m_value;
- }
-
- private:
- //! The raw address value.
- std::uintptr_t m_value{};
- };
-
- //! A linear/virtual address.
- using linear_address = address<address_type::linear>;
-
- //! A physical address.
- using physical_address = address<address_type::physical>;
-
-} // namespace kapi::memory
-
-namespace kstd
-{
-
- template<kapi::memory::address_type Type>
- struct formatter<kapi::memory::address<Type>> : kstd::formatter<std::uintptr_t>
- {
- constexpr auto static suffix = Type == kapi::memory::address_type::linear ? "%lin" : "%phy";
-
- constexpr auto parse(format_parse_context & context) -> format_parse_context::iterator
- {
- auto result = formatter<std::uintptr_t>::parse(context);
- if (!this->specifiers.type)
- {
- this->specifiers.type = 'p';
- this->specifiers.alternative_form = true;
- }
- return result;
- }
-
- auto format(kapi::memory::address<Type> const & address, format_context & context) const -> void
- {
- formatter<std::uintptr_t>::format(address.raw(), context);
- context.push(suffix);
- }
- };
-
-} // namespace kstd
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/memory/chunk.hpp b/kapi/include/kapi/memory/chunk.hpp
deleted file mode 100644
index 485a890..0000000
--- a/kapi/include/kapi/memory/chunk.hpp
+++ /dev/null
@@ -1,109 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_CHUNK_HPP
-#define TEACHOS_KAPI_MEMORY_CHUNK_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kstd/units>
-
-#include <compare>
-#include <cstddef>
-
-namespace kapi::memory
-{
-
- //! @qualifier kernel-defined
- //! A fixed-size unit of memory, indexed by a number.
- //!
- //! @tparam ChunkType The CRTP type of the deriving class
- //! @tparam AddressType The type of addresses used to index this chunk
- //! @tparam Size The size of this chunk.
- template<typename ChunkType, typename AddressType, kstd::units::bytes Size>
- struct chunk
- {
- //! The type of addresses used to index this chunk
- using address_type = AddressType;
-
- //! The size of this chunk
- constexpr auto static size = Size;
-
- //! Construct a new chunk handle for the chunk containing the given address.
- //!
- //! @param address An address contained by the desired chunk.
- //! @return A handle to a chunk containing the given address.
- constexpr auto static containing(address_type address) noexcept -> ChunkType
- {
- return ChunkType{address / size.value};
- }
-
- //! Get the start address of the chunk referenced by this handle.
- //!
- //! @return The address of the first byte contained by the chunk referenced by this handle.
- [[nodiscard]] constexpr auto start_address() const noexcept -> address_type
- {
- return address_type{(m_number * size).value};
- }
-
- //! Get the number of the chunk referenced by this handle.
- //!
- //! @return The zero-based number of the chunk referenced by this handle.
- [[nodiscard]] constexpr auto number() const noexcept -> std::size_t
- {
- return m_number;
- }
-
- //! Get a handle n chunks after the one referenced by this handle.
- //!
- //! @param n The positive offset to this chunk.
- //! @return A handle referencing the chunk n chunks after the one referenced by this handle.
- constexpr auto operator+(std::size_t n) const noexcept -> ChunkType
- {
- return ChunkType{m_number + n};
- }
-
- //! Let this handle reference the next chunk after the currently reference one.
- //!
- //! @return A handle referencing the same chunk as this handle did before the operation.
- constexpr auto operator++(int) noexcept -> ChunkType
- {
- auto copy = static_cast<ChunkType>(*this);
- ++*this;
- return copy;
- }
-
- //! Let this handle reference the next chunk after the currently reference one.
- //!
- //! @return A reference to this handle.
- constexpr auto operator++() noexcept -> ChunkType &
- {
- ++m_number;
- return static_cast<ChunkType &>(*this);
- }
-
- //! Check if this chunk handle reference the same chunk as another one.
- //!
- //! @param other Another chunk handle.
- constexpr auto operator==(chunk const & other) const noexcept -> bool = default;
-
- //! Compare the number of the chunk referenced by this handle to the one reference by another one.
- //!
- //! @param other Another chunk handle.
- constexpr auto operator<=>(chunk const & other) const noexcept -> std::strong_ordering = default;
-
- private:
- friend ChunkType;
-
- //! Construct a handle referencing the first chunk of the respective address space.
- constexpr chunk() noexcept = default;
-
- //! Construct a handle referencing the chunk of memory with the given number.
- explicit constexpr chunk(std::size_t number) noexcept
- : m_number{number}
- {}
-
- //! The number of the currently referenced chunk.
- std::size_t m_number{};
- };
-
-} // namespace kapi::memory
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/memory/frame.hpp b/kapi/include/kapi/memory/frame.hpp
deleted file mode 100644
index e423fa4..0000000
--- a/kapi/include/kapi/memory/frame.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_FRAME_HPP
-#define TEACHOS_KAPI_MEMORY_FRAME_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kapi/memory/address.hpp>
-#include <kapi/memory/chunk.hpp>
-#include <kapi/memory/layout.hpp>
-
-#include <cstddef>
-
-namespace kapi::memory
-{
-
- //! @qualifier kernel-defined
- //! A handle to a frame of physical memory.
- //!
- //! @note Contrary to the address types, this type is modeled using inheritance to support future extensions.
- struct frame : chunk<frame, physical_address, frame_size>
- {
- frame() = default;
-
- frame(std::size_t number)
- : chunk{number}
- {}
-
- using difference_type = std::ptrdiff_t;
-
- //! @copydoc chunk::containing
- //!
- //! @note This factory shadows the base factory to aid in type deduction.
- constexpr auto static containing(physical_address address) noexcept -> frame
- {
- return frame{chunk::containing(address)};
- }
-
- //! Convert a base chunk into a page.
- //!
- //! This constructor allows for conversion from chunk<physical_address, PLATFORM_FRAME_SIZE> to a frame for
- //! convenience. It is deliberately not explicit.
- constexpr frame(chunk other)
- : chunk{other}
- {}
- };
-
-} // namespace kapi::memory
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/memory/frame_allocator.hpp b/kapi/include/kapi/memory/frame_allocator.hpp
deleted file mode 100644
index 784ea93..0000000
--- a/kapi/include/kapi/memory/frame_allocator.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_FRAME_ALLOCATOR_HPP
-#define TEACHOS_KAPI_MEMORY_FRAME_ALLOCATOR_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kapi/memory/frame.hpp>
-
-#include <cstddef>
-#include <optional>
-#include <utility>
-
-namespace kapi::memory
-{
-
- //! The interface of all frame allocators.
- //!
- //! A frame allocator is responsible for the allocation, and deallocation, of frames of physical memory. Frames
- //! obtained from an allocator shall only be deallocated, or released, via the same allocator. When a frame allocated
- //! from one allocator is release via a different one (instance or type), the behavior is undefined.
- struct frame_allocator
- {
- frame_allocator(frame_allocator const &) = delete;
- frame_allocator(frame_allocator &&) = delete;
- auto operator=(frame_allocator const &) -> frame_allocator & = delete;
- auto operator=(frame_allocator &&) -> frame_allocator & = delete;
-
- virtual ~frame_allocator() = default;
-
- //! Allocate a frame of physical memory.
- //!
- //! @return An engaged std::optional iff. a new frame could be allocated, std::nullopt otherwise.
- virtual auto allocate() noexcept -> std::optional<frame>
- {
- return allocate_many(1).transform([](auto result) { return result.first; });
- }
-
- //! Mark the given frame as used
- virtual auto mark_used(frame frame) -> void = 0;
-
- //! Allocate multiple consecutive frames of physical memory.
- //!
- //! @param count The number of frames to allocate
- //! @return an engaged optional iff. a block of consecutive frames could be allocated, std::nullopt otherwise.
- virtual auto allocate_many(std::size_t count) noexcept -> std::optional<std::pair<frame, std::size_t>> = 0;
-
- //! Release a frame of physical memory.
- //!
- //! @param frame A frame of physical memory, previously acquired by a call to the #allocate function.
- virtual auto release(frame frame) -> void
- {
- return release_many({frame, 1});
- }
-
- //! Release a frame of physical memory.
- //!
- //! @param frame_set A set of frames of physical memory, previously acquired by a call to the #allocate_many
- //! function.
- virtual auto release_many(std::pair<frame, std::size_t> frame_set) -> void = 0;
-
- protected:
- frame_allocator() = default;
- };
-
-} // namespace kapi::memory
-
-#endif // TEACHOS_KAPI_MEMORY_FRAME_ALLOCATOR_HPP \ No newline at end of file
diff --git a/kapi/include/kapi/memory/layout.hpp b/kapi/include/kapi/memory/layout.hpp
deleted file mode 100644
index 733fa96..0000000
--- a/kapi/include/kapi/memory/layout.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_LAYOUT_HPP
-#define TEACHOS_KAPI_MEMORY_LAYOUT_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kapi/memory/address.hpp>
-
-#include <kstd/units>
-
-namespace kapi::memory
-{
-
- //! The size of a single page of virtual memory.
- //!
- //! Platforms that use different sizes of pages are expected to emulate 4 KiB pages towards the kernel.
- constexpr auto page_size = kstd::units::KiB(4);
-
- //! The size of a single frame of physical memory.
- //!
- //! Platforms that use different sizes of frames are expected to emulate 4 KiB pages towards the kernel.
- constexpr auto frame_size = kstd::units::KiB(4);
-
- //! The linear base address of the higher-half direct map.
- //!
- //! Platforms are expected to provide a mapping of at least the first 512 GiB of available memory at this address.
- constexpr auto higher_half_direct_map_base = linear_address{0xffff'8000'0000'0000uz};
-
- //! The linear base address of the kernel heap.
- constexpr auto heap_base = linear_address{0xffff'c000'0000'0000uz};
-
- //! The linear base address of the memory region reserved for the metadata required by the PMM.
- constexpr auto pmm_metadata_base = linear_address{0xffff'd000'0000'0000uz};
-
- //! The linear base address of all Memory Mapped I/O mappings.
- constexpr auto mmio_base = linear_address{0xffff'e000'0000'0000uz};
-
- //! The linear base address of the loaded kernel image.
- constexpr auto kernel_base = linear_address{0xffff'ffff'8000'0000uz};
-
- //! Convert a physical address to a linear address using the higher-half direct map.
- constexpr auto hhdm_to_linear(physical_address address) -> linear_address
- {
- return linear_address{address.raw() + higher_half_direct_map_base.raw()};
- }
-
- //! Convert a linear address in the higher-half direct map to a physical address.
- constexpr auto hhdm_to_physical(linear_address address) -> physical_address
- {
- return physical_address{address.raw() - higher_half_direct_map_base.raw()};
- }
-
-} // namespace kapi::memory
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/memory/page.hpp b/kapi/include/kapi/memory/page.hpp
deleted file mode 100644
index d987534..0000000
--- a/kapi/include/kapi/memory/page.hpp
+++ /dev/null
@@ -1,38 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_PAGE_HPP
-#define TEACHOS_KAPI_MEMORY_PAGE_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kapi/memory/address.hpp>
-#include <kapi/memory/chunk.hpp>
-#include <kapi/memory/layout.hpp>
-
-#include <cstddef>
-
-namespace kapi::memory
-{
-
- //! @qualifier kernel-defined
- //! A handle to a page of virtual memory.
- //!
- //! @note Contrary to the address types, this type is modeled using inheritance to support future extensions.
- struct page : chunk<page, linear_address, page_size>
- {
- page() = default;
-
- page(std::size_t number)
- : chunk{number}
- {}
-
- //! Convert a base chunk into a page.
- //!
- //! This constructor allows for conversion from chunk<linear_address, PLATFORM_PAGE_SIZE> to a page for convenience.
- //! It is deliberately not explicit.
- constexpr page(chunk other)
- : chunk{other}
- {}
- };
-
-} // namespace kapi::memory
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/memory/page_mapper.hpp b/kapi/include/kapi/memory/page_mapper.hpp
deleted file mode 100644
index fb600b2..0000000
--- a/kapi/include/kapi/memory/page_mapper.hpp
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef TEACHOS_KAPI_MEMORY_PAGE_MAPPER_HPP
-#define TEACHOS_KAPI_MEMORY_PAGE_MAPPER_HPP
-
-// IWYU pragma: private, include <kapi/memory.hpp>
-
-#include <kapi/memory/frame.hpp>
-#include <kapi/memory/page.hpp>
-
-#include <kstd/ext/bitfield_enum>
-
-#include <cstddef>
-#include <cstdint>
-#include <type_traits>
-
-namespace kapi::memory
-{
-
- //! @qualifier platform-implemented
- //! The interface of a type allowing the mapping, and unmapping, of pages onto frames.
- struct page_mapper
- {
- page_mapper(page_mapper const &) = delete;
- page_mapper(page_mapper &&) = delete;
- auto operator=(page_mapper const &) -> page_mapper & = delete;
- auto operator=(page_mapper &&) -> page_mapper & = delete;
-
- //! Platform independent page mapping flags
- enum struct flags : std::uint64_t
- {
- empty,
- writable = 1 << 0, //! The page is writable.
- executable = 1 << 1, //! The page contains executable instructions.
- uncached = 1 << 2, //! The page contents must not be cached.
- supervisor_only = 1 << 3, //! The page is only accessible in supervisor mode.
- global = 1 << 4, //! The page translation persists across context switches.
- };
-
- virtual ~page_mapper() = default;
-
- //! Map a page into a given frame, applying the given flags.
- //!
- //! @param page The page to map.
- //! @param frame The frame to map the page into.
- //! @param flags The flags to map the page with.
- //! @return A pointer to the first byte of mapped page.
- virtual auto map(page page, frame frame, flags flags) -> std::byte * = 0;
-
- //! Unmap the given page.
- //!
- //! @warning If the provided page is not mapped, the behavior is undefined. Implementation are encourage to
- //! terminate execution via a kernel panic.
- //!
- //! @param page The page to unmap.
- virtual auto unmap(page page) -> void = 0;
-
- //! Try to unmap the given page.
- //!
- //! @param page The page to unmap
- //! @return true iff. the page was successfully unmapped, false otherwise.
- virtual auto try_unmap(page page) noexcept -> bool = 0;
-
- //! @qualifier kernel-defined
- //! Map a page into a given frame, applyint the given flags.
- //!
- //! @tparam T The type of data contained in the page.
- //! @param page The page to map.
- //! @param frame The frame to map the page into.
- //! @param flags The flags to map the page with.
- //! @return A pointer to the first T in the page.
- template<typename T>
- [[nodiscard]] auto map_as(page page, frame frame, flags flags) -> T *
- {
- return std::bit_cast<T *>(map(page, frame, flags));
- }
-
- protected:
- page_mapper() = default;
- };
-
-} // namespace kapi::memory
-
-namespace kstd::ext
-{
- template<>
- struct is_bitfield_enum<kapi::memory::page_mapper::flags> : std::true_type
- {
- };
-} // namespace kstd::ext
-
-#endif \ No newline at end of file
diff --git a/kapi/include/kapi/system.hpp b/kapi/include/kapi/system.hpp
deleted file mode 100644
index 8a20af9..0000000
--- a/kapi/include/kapi/system.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef TEACHOS_KAPI_SYSTEM_HPP
-#define TEACHOS_KAPI_SYSTEM_HPP
-
-#include <source_location>
-#include <string_view>
-
-namespace kapi::system
-{
-
- //! @addtogroup kapi-system-kernel-defined
- //! @{
-
- //! Terminate kernel execution with the given error message.
- //!
- //! This function terminates the execution of the kernel and attempts to issue the given error message to the user.
- //!
- //! @param message The message associated with the panic
- [[noreturn]] auto panic(std::string_view message, std::source_location = std::source_location::current()) -> void;
-
- //! @} // end group kernel-defined
-
- //! @addtogroup kapi-system-platform-defined
- //! @{
-
- //! A hook that runs once the memory subsystem has been initialized.
- auto memory_initialized() -> void;
-
- //! @} // end group platform-defined
-
-} // namespace kapi::system
-
-#endif