Browse Source

Remove require_alignment flag from loads

The last remaining use was LR, which we can identify through other means.
pull/1122/head
Andrew Waterman 4 years ago
parent
commit
a09b88d4ab
  1. 4
      riscv/mmu.cc
  2. 10
      riscv/mmu.h

4
riscv/mmu.cc

@ -199,7 +199,7 @@ void mmu_t::load_slow_path_intrapage(reg_t addr, reg_t len, uint8_t* bytes, uint
}
}
void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate_flags, bool UNUSED require_alignment)
void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate_flags)
{
check_triggers(triggers::OPERATION_LOAD, addr);
@ -210,7 +210,7 @@ void mmu_t::load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate
#ifndef RISCV_ENABLE_MISALIGNED
throw trap_load_address_misaligned(gva, addr, 0, 0);
#else
if (require_alignment)
if (xlate_flags & RISCV_XLATE_LR)
throw trap_load_access_fault(gva, addr, 0, 0);
reg_t len_page0 = std::min(len, PGSIZE - addr % PGSIZE);

10
riscv/mmu.h

@ -61,7 +61,7 @@ public:
#endif
template<typename T>
T ALWAYS_INLINE load(reg_t addr, bool require_alignment = false, uint32_t xlate_flags = 0) {
T ALWAYS_INLINE load(reg_t addr, uint32_t xlate_flags = 0) {
target_endian<T> res;
reg_t vpn = addr >> PGSHIFT;
bool aligned = (addr & (sizeof(T) - 1)) == 0;
@ -70,7 +70,7 @@ public:
if (likely(xlate_flags == 0 && aligned && tlb_hit)) {
res = *(target_endian<T>*)(tlb_data[vpn % TLB_ENTRIES].host_offset + addr);
} else {
load_slow_path(addr, sizeof(T), (uint8_t*)&res, xlate_flags, require_alignment);
load_slow_path(addr, sizeof(T), (uint8_t*)&res, xlate_flags);
}
if (proc)
@ -81,12 +81,12 @@ public:
template<typename T>
T load_reserved(reg_t addr) {
return load<T>(addr, true, RISCV_XLATE_LR);
return load<T>(addr, RISCV_XLATE_LR);
}
// template for functions that load an aligned value from memory
#define load_func(type, prefix, xlate_flags) \
type##_t ALWAYS_INLINE prefix##_##type(reg_t addr, bool require_alignment = false) { return load<type##_t>(addr, require_alignment, xlate_flags); }
type##_t ALWAYS_INLINE prefix##_##type(reg_t addr) { return load<type##_t>(addr, xlate_flags); }
// load value from memory at aligned address; zero extend to register width
load_func(uint8, load, 0)
@ -384,7 +384,7 @@ private:
// handle uncommon cases: TLB misses, page faults, MMIO
tlb_entry_t fetch_slow_path(reg_t addr);
void load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate_flags, bool require_alignment);
void load_slow_path(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate_flags);
void load_slow_path_intrapage(reg_t addr, reg_t len, uint8_t* bytes, uint32_t xlate_flags);
void store_slow_path(reg_t addr, reg_t len, const uint8_t* bytes, uint32_t xlate_flags, bool actually_store, bool require_alignment);
void store_slow_path_intrapage(reg_t addr, reg_t len, const uint8_t* bytes, uint32_t xlate_flags, bool actually_store);

Loading…
Cancel
Save