From b40d3ad738f87ade9f9614fea2f6c3d486eca72d Mon Sep 17 00:00:00 2001 From: Amelia Coutard Date: Sun, 26 Mar 2023 03:52:53 +0200 Subject: [PATCH] Added phys_ptr --- kernel/src/lib/phys_ptr.hpp | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/kernel/src/lib/phys_ptr.hpp b/kernel/src/lib/phys_ptr.hpp index c42c47e..10d16b2 100644 --- a/kernel/src/lib/phys_ptr.hpp +++ b/kernel/src/lib/phys_ptr.hpp @@ -18,6 +18,36 @@ namespace os { +template +class phys_ptr; + +template <> +class phys_ptr { +public: + constexpr explicit phys_ptr(std::uintptr_t phys_addr): phys_addr(phys_addr) {} + constexpr phys_ptr(std::nullptr_t): phys_addr(~0ull) {} + + void* operator->() const { + return get_virt_addr(); + } + explicit operator void*() const { + return get_virt_addr(); + } + + constexpr std::uintptr_t get_phys_addr() const { + return phys_addr; + } + + friend constexpr auto operator<=>(phys_ptr a, phys_ptr b) = default; + +private: + constexpr void* get_virt_addr() const { + return reinterpret_cast(phys_addr + 0xFFFF800000000000); + } + + std::uintptr_t phys_addr; +}; + template class phys_ptr { public: @@ -39,6 +69,9 @@ public: explicit operator void*() const { return get_virt_addr(); } + operator phys_ptr() const { + return phys_ptr{phys_addr}; + } constexpr phys_ptr& operator++() { return *this += 1; -- 2.47.0