49 lines
1.5 KiB
C++
49 lines
1.5 KiB
C++
#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<typename T>
|
|
T* access() {
|
|
return reinterpret_cast<T*>(address + high_base);
|
|
}
|
|
|
|
template<typename T>
|
|
T* access_uc() {
|
|
return reinterpret_cast<T*>(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;
|
|
}
|