#pragma once #include "util/number.h" constexpr uint64_t high_base = 0xFFFF800000000000; constexpr uint64_t uncached_base = high_base + (uint64_t{1} << 38); #define read_symbol(symbol) \ []() { \ uint64_t res; \ asm volatile("movabsq $" symbol ", %0" : "=r"(res)); \ return res; \ }() struct paddr_t { uint64_t address; template T* access() { return reinterpret_cast(address + high_base); } template T* access_uc() { return reinterpret_cast(address + uncached_base); } }; inline void* operator new(size_t, void* p) { return p; } inline void* operator new[](size_t, void* p) { return p; } inline void* memcpy(void* dest, const void* src, size_t n) { for (size_t i = 0; i < n; i++) { ((uint8_t*)dest)[i] = ((uint8_t*)src)[i]; } return dest; } inline void* memset(void* dest, int c, size_t n) { for (size_t i = 0; i < n; i++) { ((uint8_t*)dest)[i] = (uint8_t)c; } return dest; }