From b40d3ad738f87ade9f9614fea2f6c3d486eca72d Mon Sep 17 00:00:00 2001 From: Amelia Coutard <eliottulio.coutard@gmail.com> Date: Sun, 26 Mar 2023 03:52:53 +0200 Subject: [PATCH] Added phys_ptr<void> --- 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 <typename T> +class phys_ptr; + +template <> +class phys_ptr<void> { +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<void> a, phys_ptr<void> b) = default; + +private: + constexpr void* get_virt_addr() const { + return reinterpret_cast<void*>(phys_addr + 0xFFFF800000000000); + } + + std::uintptr_t phys_addr; +}; + template <typename T> class phys_ptr { public: @@ -39,6 +69,9 @@ public: explicit operator void*() const { return get_virt_addr(); } + operator phys_ptr<void>() const { + return phys_ptr<void>{phys_addr}; + } constexpr phys_ptr<T>& operator++() { return *this += 1; -- 2.46.0