1 #define __STDC_FORMAT_MACROS
8 #include "threads-model.h"
9 #include "snapshot-interface.h"
11 void store_8(void *addr, uint8_t val)
13 DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
14 thread_id_t tid = thread_current()->get_id();
15 raceCheckWrite(tid, addr);
16 (*(uint8_t *)addr) = val;
19 void store_16(void *addr, uint16_t val)
21 DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
22 thread_id_t tid = thread_current()->get_id();
23 raceCheckWrite(tid, addr);
24 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
25 (*(uint16_t *)addr) = val;
28 void store_32(void *addr, uint32_t val)
30 DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
31 thread_id_t tid = thread_current()->get_id();
32 raceCheckWrite(tid, addr);
33 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
34 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
35 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
36 (*(uint32_t *)addr) = val;
39 void store_64(void *addr, uint64_t val)
41 DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
42 thread_id_t tid = thread_current()->get_id();
43 raceCheckWrite(tid, addr);
44 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
45 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
46 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
47 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
48 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
49 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
50 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
51 (*(uint64_t *)addr) = val;
54 uint8_t load_8(const void *addr)
56 DEBUG("addr = %p\n", addr);
57 thread_id_t tid = thread_current()->get_id();
58 raceCheckRead(tid, addr);
59 return *((uint8_t *)addr);
62 uint16_t load_16(const void *addr)
64 DEBUG("addr = %p\n", addr);
65 thread_id_t tid = thread_current()->get_id();
66 raceCheckRead(tid, addr);
67 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
68 return *((uint16_t *)addr);
71 uint32_t load_32(const void *addr)
73 DEBUG("addr = %p\n", addr);
74 thread_id_t tid = thread_current()->get_id();
75 raceCheckRead(tid, addr);
76 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
77 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
78 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
79 return *((uint32_t *)addr);
82 uint64_t load_64(const void *addr)
84 DEBUG("addr = %p\n", addr);
85 thread_id_t tid = thread_current()->get_id();
86 raceCheckRead(tid, addr);
87 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
88 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
89 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
90 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 4));
91 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 5));
92 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 6));
93 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 7));
94 return *((uint64_t *)addr);
98 * Helper functions used by CDSPass
99 * The CDSPass implementation does not replace normal load/stores with cds load/stores,
100 * but inserts cds load/stores to check dataraces. Thus, the cds load/stores do not
104 void cds_store8(void *addr)
106 //DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
109 thread_id_t tid = thread_current()->get_id();
110 raceCheckWrite8(tid, addr);
112 // raceCheckWrite(tid, addr);
115 void cds_store16(void *addr)
117 //DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
120 thread_id_t tid = thread_current()->get_id();
121 raceCheckWrite16(tid, addr);
123 // raceCheckWrite(tid, addr);
124 // raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
127 void cds_store32(void *addr)
129 //DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
132 thread_id_t tid = thread_current()->get_id();
133 raceCheckWrite32(tid, addr);
136 raceCheckWrite(tid, addr);
137 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
138 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
139 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
143 void cds_store64(void *addr)
145 //DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
148 thread_id_t tid = thread_current()->get_id();
149 raceCheckWrite64(tid, addr);
152 raceCheckWrite(tid, addr);
153 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
154 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
155 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
156 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
157 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
158 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
159 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
163 void cds_load8(const void *addr) {
166 thread_id_t tid = thread_current()->get_id();
168 raceCheckRead8(tid, addr);
170 // raceCheckRead(tid, addr);
173 void cds_load16(const void *addr) {
176 thread_id_t tid = thread_current()->get_id();
178 raceCheckRead16(tid, addr);
179 // raceCheckRead(tid, addr);
180 // raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
183 void cds_load32(const void *addr) {
186 thread_id_t tid = thread_current()->get_id();
188 raceCheckRead32(tid, addr);
190 raceCheckRead(tid, addr);
191 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
192 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
193 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
197 void cds_load64(const void *addr) {
200 thread_id_t tid = thread_current()->get_id();
202 raceCheckRead64(tid, addr);
204 raceCheckRead(tid, addr);
205 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
206 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
207 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
208 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 4));
209 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 5));
210 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 6));
211 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 7));