diff options
| author | Prashanth Mundkur | 2018-05-02 17:38:28 -0700 |
|---|---|---|
| committer | Prashanth Mundkur | 2018-05-02 17:38:28 -0700 |
| commit | fb4c8689e417d4f02dcfa61d44ee2271855161f1 (patch) | |
| tree | 21fcbd4436c3dd279b3ea3d24bf57a74e8972dcd /riscv | |
| parent | f11fbc70cad8efe0fbc43843626da19d7dcb31d0 (diff) | |
Hook in address translation for loads.
Diffstat (limited to 'riscv')
| -rw-r--r-- | riscv/riscv.sail | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/riscv/riscv.sail b/riscv/riscv.sail index d409481e..cfe5c4d7 100644 --- a/riscv/riscv.sail +++ b/riscv/riscv.sail @@ -232,12 +232,16 @@ function process_load(rd, addr, value, is_unsigned) = } function clause execute(LOAD(imm, rs1, rd, is_unsigned, width, aq, rl)) = - let addr : xlenbits = X(rs1) + EXTS(imm) in - match width { - BYTE => process_load(rd, addr, mem_read(addr, 1, aq, rl, false), is_unsigned), - HALF => process_load(rd, addr, mem_read(addr, 2, aq, rl, false), is_unsigned), - WORD => process_load(rd, addr, mem_read(addr, 4, aq, rl, false), is_unsigned), - DOUBLE => process_load(rd, addr, mem_read(addr, 8, aq, rl, false), is_unsigned) + let vaddr : xlenbits = X(rs1) + EXTS(imm) in + match translateAddr(vaddr, Read, Data) { + TR_Address(addr) => + match width { + BYTE => process_load(rd, vaddr, mem_read(addr, 1, aq, rl, false), is_unsigned), + HALF => process_load(rd, vaddr, mem_read(addr, 2, aq, rl, false), is_unsigned), + WORD => process_load(rd, vaddr, mem_read(addr, 4, aq, rl, false), is_unsigned), + DOUBLE => process_load(rd, vaddr, mem_read(addr, 8, aq, rl, false), is_unsigned) + }, + TR_Failure(e) => handle_mem_exception(vaddr, e) } /* FIXME: aq/rl are getting dropped */ |
