Skip to content

Commit f6d41bc

Browse files
authored
Merge pull request #1901 from binno/cfi_fixes
CFI fixes
2 parents 3c61a0f + bdac989 commit f6d41bc

File tree

5 files changed

+12
-3
lines changed

5 files changed

+12
-3
lines changed

riscv/csrs.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,7 @@ bool mnstatus_csr_t::unlogged_write(const reg_t val) noexcept {
585585
// NMIE can be set but not cleared
586586
const reg_t mask = (~read() & MNSTATUS_NMIE)
587587
| (proc->extension_enabled('H') ? MNSTATUS_MNPV : 0)
588+
| (proc->extension_enabled(EXT_ZICFILP) ? MNSTATUS_MNPELP : 0)
588589
| MNSTATUS_MNPP;
589590

590591
const reg_t requested_mnpp = proc->legalize_privilege(get_field(val, MNSTATUS_MNPP));

riscv/insns/mnret.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,11 @@ if (prev_prv != PRV_M) {
1010
STATE.mstatus->write(mstatus);
1111
}
1212
s = set_field(s, MNSTATUS_NMIE, 1);
13+
if (ZICFILP_xLPE(prev_virt, prev_prv)) {
14+
STATE.elp = static_cast<elp_t>(get_field(s, MNSTATUS_MNPELP));
15+
}
16+
if (p->extension_enabled(EXT_ZICFILP)) {
17+
s = set_field(s, MNSTATUS_MNPELP, elp_t::NO_LP_EXPECTED);
18+
}
1319
STATE.mnstatus->write(s);
1420
p->set_privilege(prev_prv, prev_virt);

riscv/insns/ssrdp.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#include "zicfiss.h"
22

33
if (xSSE()) {
4-
WRITE_RD(STATE.ssp->read());
4+
WRITE_RD(sext_xlen(STATE.ssp->read()));
55
} else {
66
#include "mop_r_N.h"
77
}

riscv/mmu.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,9 @@ void mmu_t::load_slow_path_intrapage(reg_t len, uint8_t* bytes, mem_access_info_
215215
refill_tlb(addr, paddr, host_addr, LOAD);
216216

217217
} else if (!mmio_load(paddr, len, bytes)) {
218-
throw trap_load_access_fault(access_info.effective_virt, transformed_addr, 0, 0);
218+
(access_info.flags.ss_access)?
219+
throw trap_store_access_fault(access_info.effective_virt, transformed_addr, 0, 0) :
220+
throw trap_load_access_fault(access_info.effective_virt, transformed_addr, 0, 0);
219221
}
220222

221223
if (access_info.flags.lr) {

riscv/zicfiss.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
shadow_return_addr = MMU.ss_load<uint32_t>(STATE.ssp->read()); \
2626
else \
2727
shadow_return_addr = MMU.ss_load<uint64_t>(STATE.ssp->read()); \
28-
software_check(value == shadow_return_addr, SHADOW_STACK_FAULT); \
28+
software_check(zext_xlen(value) == shadow_return_addr, SHADOW_STACK_FAULT); \
2929
STATE.ssp->write(STATE.ssp->read() + xlen / 8);
3030

3131
#endif

0 commit comments

Comments
 (0)