Message ID | 20230418140632.53166-7-liweiwei@iscas.ac.cn (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | target/riscv: Fix PMP related problem | expand |
On 2023/4/18 22:06, Weiwei Li wrote: > When PMP entry overlap part of the page, we'll set the tlb_size to 1, which > will make the address in tlb entry set with TLB_INVALID_MASK, and the next > access will again go through tlb_fill.However, this way will not work in > tb_gen_code() => get_page_addr_code_hostp(): the TLB host address will be > cached, and the following instructions can use this host address directly > which may lead to the bypass of PMP related check. We can add a link to the issue in the commit message, https://gitlab.com/qemu-project/qemu/-/issues/1542 Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com> Zhiwei > > Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn> > Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn> > --- > accel/tcg/cputlb.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c > index e984a98dc4..efa0cb67c9 100644 > --- a/accel/tcg/cputlb.c > +++ b/accel/tcg/cputlb.c > @@ -1696,6 +1696,11 @@ tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong addr, > if (p == NULL) { > return -1; > } > + > + if (full->lg_page_size < TARGET_PAGE_BITS) { > + return -1; > + } > + > if (hostp) { > *hostp = p; > }
On 4/18/23 16:06, Weiwei Li wrote: > When PMP entry overlap part of the page, we'll set the tlb_size to 1, which > will make the address in tlb entry set with TLB_INVALID_MASK, and the next > access will again go through tlb_fill.However, this way will not work in > tb_gen_code() => get_page_addr_code_hostp(): the TLB host address will be > cached, and the following instructions can use this host address directly > which may lead to the bypass of PMP related check. > > Signed-off-by: Weiwei Li<liweiwei@iscas.ac.cn> > Signed-off-by: Junqiang Wang<wangjunqiang@iscas.ac.cn> > --- > accel/tcg/cputlb.c | 5 +++++ > 1 file changed, 5 insertions(+) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c index e984a98dc4..efa0cb67c9 100644 --- a/accel/tcg/cputlb.c +++ b/accel/tcg/cputlb.c @@ -1696,6 +1696,11 @@ tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong addr, if (p == NULL) { return -1; } + + if (full->lg_page_size < TARGET_PAGE_BITS) { + return -1; + } + if (hostp) { *hostp = p; }