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:
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;