@@ -39,9 +39,9 @@ struct tlb_entry_t {
3939};
4040
4141struct xlate_flags_t {
42- const bool forced_virt : 1 ;
43- const bool hlvx : 1 ;
44- const bool lr : 1 ;
42+ const bool forced_virt : 1 { false } ;
43+ const bool hlvx : 1 { false } ;
44+ const bool lr : 1 { false } ;
4545
4646 bool is_special_access () const {
4747 return forced_virt || hlvx || lr;
@@ -72,7 +72,7 @@ class mmu_t
7272
7373 mem_access_info_t generate_access_info (reg_t addr, access_type type, xlate_flags_t xlate_flags) {
7474 if (!proc)
75- return {addr, 0 , false , {false , false , false }, type};
75+ return {addr, 0 , false , {}, type};
7676 bool virt = proc->state .v ;
7777 reg_t mode = proc->state .prv ;
7878 if (type != FETCH) {
@@ -94,7 +94,7 @@ class mmu_t
9494 ~mmu_t ();
9595
9696 template <typename T>
97- T ALWAYS_INLINE load (reg_t addr, xlate_flags_t xlate_flags = {false , false , false }) {
97+ T ALWAYS_INLINE load (reg_t addr, xlate_flags_t xlate_flags = {}) {
9898 target_endian<T> res;
9999 reg_t vpn = addr >> PGSHIFT;
100100 bool aligned = (addr & (sizeof (T) - 1 )) == 0 ;
@@ -114,30 +114,21 @@ class mmu_t
114114
115115 template <typename T>
116116 T load_reserved (reg_t addr) {
117- bool forced_virt = false ;
118- bool hlvx = false ;
119- bool lr = true ;
120- return load<T>(addr, {forced_virt, hlvx, lr});
117+ return load<T>(addr, {.lr = true });
121118 }
122119
123120 template <typename T>
124121 T guest_load (reg_t addr) {
125- bool forced_virt = true ;
126- bool hlvx = false ;
127- bool lr = false ;
128- return load<T>(addr, {forced_virt, hlvx, lr});
122+ return load<T>(addr, {.forced_virt = true });
129123 }
130124
131125 template <typename T>
132126 T guest_load_x (reg_t addr) {
133- bool forced_virt = true ;
134- bool hlvx = true ;
135- bool lr = false ;
136- return load<T>(addr, {forced_virt, hlvx, lr});
127+ return load<T>(addr, {.forced_virt =true , .hlvx =true });
137128 }
138129
139130 template <typename T>
140- void ALWAYS_INLINE store (reg_t addr, T val, xlate_flags_t xlate_flags = {false , false , false }) {
131+ void ALWAYS_INLINE store (reg_t addr, T val, xlate_flags_t xlate_flags = {}) {
141132 reg_t vpn = addr >> PGSHIFT;
142133 bool aligned = (addr & (sizeof (T) - 1 )) == 0 ;
143134 bool tlb_hit = tlb_store_tag[vpn % TLB_ENTRIES] == vpn;
@@ -155,10 +146,7 @@ class mmu_t
155146
156147 template <typename T>
157148 void guest_store (reg_t addr, T val) {
158- bool forced_virt = true ;
159- bool hlvx = false ;
160- bool lr = false ;
161- store (addr, val, {forced_virt, hlvx, lr});
149+ store (addr, val, {.forced_virt =true });
162150 }
163151
164152 // AMO/Zicbom faults should be reported as store faults
@@ -180,7 +168,7 @@ class mmu_t
180168 template <typename T, typename op>
181169 T amo (reg_t addr, op f) {
182170 convert_load_traps_to_store_traps ({
183- store_slow_path (addr, sizeof (T), nullptr , {false , false , false }, false , true );
171+ store_slow_path (addr, sizeof (T), nullptr , {}, false , true );
184172 auto lhs = load<T>(addr);
185173 store<T>(addr, f (lhs));
186174 return lhs;
@@ -190,7 +178,7 @@ class mmu_t
190178 template <typename T>
191179 T amo_compare_and_swap (reg_t addr, T comp, T swap) {
192180 convert_load_traps_to_store_traps ({
193- store_slow_path (addr, sizeof (T), nullptr , {false , false , false }, false , true );
181+ store_slow_path (addr, sizeof (T), nullptr , {}, false , true );
194182 auto lhs = load<T>(addr);
195183 if (lhs == comp)
196184 store<T>(addr, swap);
@@ -230,7 +218,7 @@ class mmu_t
230218 for (size_t offset = 0 ; offset < blocksz; offset += 1 )
231219 check_triggers (triggers::OPERATION_STORE, base + offset, false , addr, std::nullopt );
232220 convert_load_traps_to_store_traps ({
233- const reg_t paddr = translate (generate_access_info (addr, LOAD, {false , false , false }), 1 );
221+ const reg_t paddr = translate (generate_access_info (addr, LOAD, {}), 1 );
234222 if (sim->reservable (paddr)) {
235223 if (tracer.interested_in_range (paddr, paddr + PGSIZE, LOAD))
236224 tracer.clean_invalidate (paddr, blocksz, clean, inval);
@@ -249,10 +237,10 @@ class mmu_t
249237 {
250238 if (vaddr & (size-1 )) {
251239 // Raise either access fault or misaligned exception
252- store_slow_path (vaddr, size, nullptr , {false , false , false }, false , true );
240+ store_slow_path (vaddr, size, nullptr , {}, false , true );
253241 }
254242
255- reg_t paddr = translate (generate_access_info (vaddr, STORE, {false , false , false }), 1 );
243+ reg_t paddr = translate (generate_access_info (vaddr, STORE, {}), 1 );
256244 if (sim->reservable (paddr))
257245 return load_reservation_address == paddr;
258246 else
0 commit comments