diff options
author | Andrew Waterman <andrew@sifive.com> | 2024-08-27 18:08:50 -0700 |
---|---|---|
committer | Andrew Waterman <andrew@sifive.com> | 2024-08-27 18:16:50 -0700 |
commit | 52f045d9ba21fe0552c1475e4171fddc3c13c5e3 (patch) | |
tree | bffa3d9fc56684c8c930e41c13a723c8d1a32f0a | |
parent | 16870946ed32d79b1eb4597d9266194b3b543c3f (diff) | |
download | riscv-isa-sim-52f045d9ba21fe0552c1475e4171fddc3c13c5e3.zip riscv-isa-sim-52f045d9ba21fe0552c1475e4171fddc3c13c5e3.tar.gz riscv-isa-sim-52f045d9ba21fe0552c1475e4171fddc3c13c5e3.tar.bz2 |
Lift restriction on physical-address size
It remains true that PTEs can only represent addresses >= 2^56, but there's
no need to impose that constraint on untranslated accesses.
-rw-r--r-- | riscv/mmu.h | 2 | ||||
-rw-r--r-- | riscv/sim.cc | 3 | ||||
-rw-r--r-- | spike_main/spike.cc | 17 |
3 files changed, 4 insertions, 18 deletions
diff --git a/riscv/mmu.h b/riscv/mmu.h index 0aa1f96..1047a71 100644 --- a/riscv/mmu.h +++ b/riscv/mmu.h @@ -19,7 +19,7 @@ #define PGSHIFT 12 const reg_t PGSIZE = 1 << PGSHIFT; const reg_t PGMASK = ~(PGSIZE-1); -#define MAX_PADDR_BITS 56 // imposed by Sv39 / Sv48 +#define MAX_PADDR_BITS 64 struct insn_fetch_t { diff --git a/riscv/sim.cc b/riscv/sim.cc index d08e274..8ab74b1 100644 --- a/riscv/sim.cc +++ b/riscv/sim.cc @@ -322,7 +322,8 @@ void sim_t::set_procs_debug(bool value) static bool paddr_ok(reg_t addr) { - return (addr >> MAX_PADDR_BITS) == 0; + static_assert(MAX_PADDR_BITS == 8 * sizeof(addr)); + return true; } bool sim_t::mmio_load(reg_t paddr, size_t len, uint8_t* bytes) diff --git a/spike_main/spike.cc b/spike_main/spike.cc index 4c09ac3..d656d64 100644 --- a/spike_main/spike.cc +++ b/spike_main/spike.cc @@ -213,22 +213,7 @@ static mem_cfg_t create_mem_region(unsigned long long base, unsigned long long s exit(EXIT_FAILURE); } - const unsigned long long max_allowed_pa = (1ull << MAX_PADDR_BITS) - 1ull; - assert(max_allowed_pa <= std::numeric_limits<reg_t>::max()); - mem_cfg_t mem_region(base, size); - if (mem_region.get_inclusive_end() > max_allowed_pa) { - int bits_required = 64 - clz(mem_region.get_inclusive_end()); - fprintf(stderr, "Unsupported memory region " - "{base = 0x%" PRIX64 ", size = 0x%" PRIX64 "} specified," - " which requires %d bits of physical address\n" - " The largest accessible physical address " - "is 0x%llX (defined by MAX_PADDR_BITS constant, which is %d)\n", - mem_region.get_base(), mem_region.get_size(), bits_required, - max_allowed_pa, MAX_PADDR_BITS); - exit(EXIT_FAILURE); - } - - return mem_region; + return mem_cfg_t(base, size); } static std::vector<mem_cfg_t> parse_mem_layout(const char* arg) |