5 #ifndef __SHADOW_MEMORY__
6 #define __SHADOW_MEMORY__
14 #define PAGE_OFFSET_BITS (16LL)
15 #define PAGE_OFFSET(addr) (addr & 0xFFFF)
16 #define PAGE_OFFSET_MASK (0xFFFF)
17 #define SHADOW_PAGE_SIZE (1 << PAGE_OFFSET_BITS)
20 #define PTR_SIZE (sizeof(struct Status*))
21 #define LEVEL_1_PAGE_TABLE_BITS (20)
22 #define LEVEL_1_PAGE_TABLE_ENTRIES (1 << LEVEL_1_PAGE_TABLE_BITS)
23 #define LEVEL_1_PAGE_TABLE_SIZE (LEVEL_1_PAGE_TABLE_ENTRIES * PTR_SIZE)
25 #define LEVEL_2_PAGE_TABLE_BITS (12)
26 #define LEVEL_2_PAGE_TABLE_ENTRIES (1 << LEVEL_2_PAGE_TABLE_BITS)
27 #define LEVEL_2_PAGE_TABLE_SIZE (LEVEL_2_PAGE_TABLE_ENTRIES * PTR_SIZE)
29 #define LEVEL_1_PAGE_TABLE_SLOT(addr) ((((uint64_t)addr) >> (LEVEL_2_PAGE_TABLE_BITS + PAGE_OFFSET_BITS)) & 0xfffff)
30 #define LEVEL_2_PAGE_TABLE_SLOT(addr) ((((uint64_t)addr) >> (PAGE_OFFSET_BITS)) & 0xFFF)
32 #define SHADOW_STRUCT_SIZE (sizeof(T))
35 #define PIN_ExitProcess(a) exit(a)
55 template <
class... Args>
60 template <
typename... Ts>
68 pageDirectory = (atomic<atomic<
ShadowTuple<Ts...>*>*>*)mmap(
nullptr,
LEVEL_1_PAGE_TABLE_SIZE, PROT_WRITE | PROT_READ, MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, 0, 0);
69 if (pageDirectory == MAP_FAILED) {
70 perror(
"mmap pageDirectory");
78 if ((l1Page = pageDirectory[i].load(memory_order_relaxed)) !=
nullptr) {
81 if ((l2Page = l1Page[j].load(memory_order_relaxed)) !=
nullptr) {
86 perror(
"munmap pageDirectory");
92 perror(
"munmap pageDirectory");
100 if ((v1 = l1Ptr->load(memory_order_consume)) ==
nullptr) {
102 if (l1pg == MAP_FAILED) {
108 if (!l1Ptr->compare_exchange_strong(nullVal, l1pg, memory_order_acq_rel, memory_order_relaxed)) {
113 v1 = l1Ptr->load(memory_order_consume);
120 if ((v2 = l2Ptr->load(memory_order_consume)) ==
nullptr) {
122 if (l2pg == MAP_FAILED) {
127 if (!l2Ptr->compare_exchange_strong(nullVal, l2pg, memory_order_acq_rel, memory_order_relaxed)) {
129 v2 = l2Ptr->load(memory_order_consume);
139 template <
int I,
typename... Ts>
148 auto& shadowPage =
sm.GetOrCreateShadowBaseAddress(
address);
153 template <
typename... Ts>
162 if (pageDirectory == MAP_FAILED) {
163 perror(
"mmap pageDirectory");
171 if ((l1Page = pageDirectory[i]) !=
nullptr) {
174 if ((l2Page = l1Page[j]) !=
nullptr) {
179 perror(
"munmap pageDirectory");
185 perror(
"munmap pageDirectory");
193 if ((v1 = *l1Ptr) ==
nullptr) {
195 if (l1pg == MAP_FAILED) {
204 if ((v2 = *l2Ptr) ==
nullptr) {
206 if (l2pg == MAP_FAILED) {
217 template <
int I,
typename... Ts>
221 auto& shadowPage =
sm.GetOrCreateShadowBaseAddress(
address);
231 for(
int i = 0; i < 0xffff; i++){
232 GetOrCreateShadowAddress<0>(s, 0x12345678)[0] = 1234;
233 int j = GetOrCreateShadowAddress<0>(s, 0x12345678)[0];
235 GetOrCreateShadowAddress<0>(cs, 0x12345678)[0] = 1234;
236 j = GetOrCreateShadowAddress<0>(cs, 0x12345678)[0];
int main(int argc, char *argv[])
atomic< atomic< ShadowTuple< Ts... > * > * > * pageDirectory
~ConcurrentShadowMemory()
ShadowTuple< Ts... > & GetOrCreateShadowBaseAddress(const size_t address)
ShadowTuple< Ts... > *** pageDirectory
ShadowTuple< Ts... > & GetOrCreateShadowBaseAddress(const size_t address)
static ConcurrentShadowMemory< DataHandle_t > sm
std::tuple< Args[SHADOW_PAGE_SIZE]... > ShadowTuple
#define LEVEL_2_PAGE_TABLE_SIZE
#define LEVEL_1_PAGE_TABLE_SLOT(addr)
#define PAGE_OFFSET(addr)
#define LEVEL_1_PAGE_TABLE_ENTRIES
#define LEVEL_2_PAGE_TABLE_ENTRIES
#define LEVEL_1_PAGE_TABLE_SIZE
__attribute__((always_inline)) typename std
#define PIN_ExitProcess(a)
#define LEVEL_2_PAGE_TABLE_SLOT(addr)