1 #define __STDC_FORMAT_MACROS
8 #include "threads-model.h"
10 void store_8(void *addr, uint8_t val)
12 DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
13 thread_id_t tid = thread_current()->get_id();
14 raceCheckWrite(tid, addr);
15 (*(uint8_t *)addr) = val;
18 void store_16(void *addr, uint16_t val)
20 DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
21 thread_id_t tid = thread_current()->get_id();
22 raceCheckWrite(tid, addr);
23 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
24 (*(uint16_t *)addr) = val;
27 void store_32(void *addr, uint32_t val)
29 DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
30 thread_id_t tid = thread_current()->get_id();
31 raceCheckWrite(tid, addr);
32 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
33 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
34 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
35 (*(uint32_t *)addr) = val;
38 void store_64(void *addr, uint64_t val)
40 DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
41 thread_id_t tid = thread_current()->get_id();
42 raceCheckWrite(tid, addr);
43 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
44 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
45 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
46 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
47 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
48 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
49 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
50 (*(uint64_t *)addr) = val;
53 uint8_t load_8(const void *addr)
55 DEBUG("addr = %p\n", addr);
56 thread_id_t tid = thread_current()->get_id();
57 raceCheckRead(tid, addr);
58 return *((uint8_t *)addr);
61 uint16_t load_16(const void *addr)
63 DEBUG("addr = %p\n", addr);
64 thread_id_t tid = thread_current()->get_id();
65 raceCheckRead(tid, addr);
66 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
67 return *((uint16_t *)addr);
70 uint32_t load_32(const void *addr)
72 DEBUG("addr = %p\n", addr);
73 thread_id_t tid = thread_current()->get_id();
74 raceCheckRead(tid, addr);
75 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
76 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
77 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
78 return *((uint32_t *)addr);
81 uint64_t load_64(const void *addr)
83 DEBUG("addr = %p\n", addr);
84 thread_id_t tid = thread_current()->get_id();
85 raceCheckRead(tid, addr);
86 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 1));
87 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 2));
88 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 3));
89 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 4));
90 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 5));
91 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 6));
92 raceCheckRead(tid, (const void *)(((uintptr_t)addr) + 7));
93 return *((uint64_t *)addr);
96 // helper functions used by CdsPass
97 // The CdsPass implementation does not replace normal load/stores with cds load/stores,
98 // but inserts cds load/stores to check dataraces. Thus, the cds load/stores do not
101 void cds_store8(void *addr)
103 //DEBUG("addr = %p, val = %" PRIu8 "\n", addr, val);
104 thread_id_t tid = thread_current()->get_id();
105 raceCheckWrite(tid, addr);
108 void cds_store16(void *addr)
110 //DEBUG("addr = %p, val = %" PRIu16 "\n", addr, val);
111 thread_id_t tid = thread_current()->get_id();
112 raceCheckWrite(tid, addr);
113 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
116 void cds_store32(void *addr)
118 //DEBUG("addr = %p, val = %" PRIu32 "\n", addr, val);
119 thread_id_t tid = thread_current()->get_id();
120 raceCheckWrite(tid, addr);
121 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
122 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
123 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
126 void cds_store64(void *addr)
128 //DEBUG("addr = %p, val = %" PRIu64 "\n", addr, val);
129 thread_id_t tid = thread_current()->get_id();
130 raceCheckWrite(tid, addr);
131 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 1));
132 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 2));
133 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 3));
134 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 4));
135 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 5));
136 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 6));
137 raceCheckWrite(tid, (void *)(((uintptr_t)addr) + 7));
140 void cds_load8(const void *addr) { load_8(addr); }
141 void cds_load16(const void *addr) { load_16(addr); }
142 void cds_load32(const void *addr) { load_32(addr); }
143 void cds_load64(const void *addr) { load_64(addr); }