aboutsummaryrefslogtreecommitdiff
path: root/kapi
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-03-26 16:25:35 +0100
committerFelix Morgner <felix.morgner@ost.ch>2026-03-27 07:02:35 +0100
commit2521d58e7a5c16595e401e1af7becb572ad35f53 (patch)
tree74f688edd76fef2e8005cdeb09d2fbc2a1d464a9 /kapi
parent8d06763f47e7b7c93af2a55f6bd2dbc4aa9abfa2 (diff)
downloadteachos-2521d58e7a5c16595e401e1af7becb572ad35f53.tar.xz
teachos-2521d58e7a5c16595e401e1af7becb572ad35f53.zip
kapi: dissolve cpu/exception.hpp into cpu.hpp
Diffstat (limited to 'kapi')
-rw-r--r--kapi/include/kapi/cpu.hpp96
-rw-r--r--kapi/include/kapi/cpu/exception.hpp106
2 files changed, 95 insertions, 107 deletions
diff --git a/kapi/include/kapi/cpu.hpp b/kapi/include/kapi/cpu.hpp
index 712de16..041a5db 100644
--- a/kapi/include/kapi/cpu.hpp
+++ b/kapi/include/kapi/cpu.hpp
@@ -1,11 +1,64 @@
#ifndef TEACHOS_KAPI_CPU_HPP
#define TEACHOS_KAPI_CPU_HPP
-#include "kapi/cpu/exception.hpp" // IWYU pragma: export
#include "kapi/cpu/interrupts.hpp" // IWYU pragma: export
+#include "kapi/memory.hpp"
+
+#include <kstd/format>
+
+#include <cstdint>
namespace 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{};
+ };
+
//! @qualifier platform-defined
//! Halt the CPU.
//!
@@ -19,6 +72,47 @@ namespace kapi::cpu
//! interrupts itself.
auto init() -> void;
+ //! @qualifier 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;
+
} // 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/cpu/exception.hpp b/kapi/include/kapi/cpu/exception.hpp
deleted file mode 100644
index d6e8511..0000000
--- a/kapi/include/kapi/cpu/exception.hpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef TEACHOS_KAPI_CPU_EXCEPTION_HPP
-#define TEACHOS_KAPI_CPU_EXCEPTION_HPP
-
-// IWYU pragma: private, include "kapi/cpu.hpp"
-
-#include "kapi/memory.hpp"
-
-#include <kstd/format>
-
-#include <cstdint>
-
-namespace 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{};
- };
-
- //! @qualifier kernel-defined
- //! Dispatch an exception to the appropriate handler.
- //!
- //! @param context The exception context.
- //! @return Whether the exception was handled.
- auto dispatch(exception const & context) -> 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 \ No newline at end of file