mirror of https://github.com/xemu-project/xemu.git
riscv: AND stage-1 and stage-2 protection flags
Take the result of stage-1 and stage-2 page table walks and AND the two protection flags together. This way we require both to set permissions instead of just stage-2. Signed-off-by: Alistair Francis <alistair.francis@wdc.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Tested-by: Anup Patel <anup@brainfault.org> Message-id: 846f1e18f5922d818bc464ec32c144ef314ec724.1585262586.git.alistair.francis@wdc.com Message-Id: <846f1e18f5922d818bc464ec32c144ef314ec724.1585262586.git.alistair.francis@wdc.com>
This commit is contained in:
parent
3847289054
commit
8f67cd6db7
|
@ -707,7 +707,7 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
vaddr im_address;
|
vaddr im_address;
|
||||||
hwaddr pa = 0;
|
hwaddr pa = 0;
|
||||||
int prot;
|
int prot, prot2;
|
||||||
bool pmp_violation = false;
|
bool pmp_violation = false;
|
||||||
bool m_mode_two_stage = false;
|
bool m_mode_two_stage = false;
|
||||||
bool hs_mode_two_stage = false;
|
bool hs_mode_two_stage = false;
|
||||||
|
@ -757,13 +757,15 @@ bool riscv_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||||
/* Second stage lookup */
|
/* Second stage lookup */
|
||||||
im_address = pa;
|
im_address = pa;
|
||||||
|
|
||||||
ret = get_physical_address(env, &pa, &prot, im_address,
|
ret = get_physical_address(env, &pa, &prot2, im_address,
|
||||||
access_type, mmu_idx, false, true);
|
access_type, mmu_idx, false, true);
|
||||||
|
|
||||||
qemu_log_mask(CPU_LOG_MMU,
|
qemu_log_mask(CPU_LOG_MMU,
|
||||||
"%s 2nd-stage address=%" VADDR_PRIx " ret %d physical "
|
"%s 2nd-stage address=%" VADDR_PRIx " ret %d physical "
|
||||||
TARGET_FMT_plx " prot %d\n",
|
TARGET_FMT_plx " prot %d\n",
|
||||||
__func__, im_address, ret, pa, prot);
|
__func__, im_address, ret, pa, prot2);
|
||||||
|
|
||||||
|
prot &= prot2;
|
||||||
|
|
||||||
if (riscv_feature(env, RISCV_FEATURE_PMP) &&
|
if (riscv_feature(env, RISCV_FEATURE_PMP) &&
|
||||||
(ret == TRANSLATE_SUCCESS) &&
|
(ret == TRANSLATE_SUCCESS) &&
|
||||||
|
|
Loading…
Reference in New Issue