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