]> git.ameliathe1st.gay Git - voyage-au-centre-des-fichiers.git/commitdiff
Added phys_ptr<void>
authorAmelia Coutard <eliottulio.coutard@gmail.com>
Sun, 26 Mar 2023 01:52:53 +0000 (03:52 +0200)
committerAmelia Coutard <eliottulio.coutard@gmail.com>
Sun, 26 Mar 2023 01:52:53 +0000 (03:52 +0200)
kernel/src/lib/phys_ptr.hpp

index c42c47ed251b0696087ee9fd0246adc1086bc1bb..10d16b2613d30f729aca9c3e60acb04f2f51b18f 100644 (file)
 
 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;