accel/tcg: Uncache the host address for instruction fetch when tlb size < 1
authorWeiwei Li <liweiwei@iscas.ac.cn>
Sat, 22 Apr 2023 13:03:27 +0000 (21:03 +0800)
committerRichard Henderson <richard.henderson@linaro.org>
Tue, 2 May 2023 19:31:50 +0000 (12:31 -0700)
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.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1542.

Signed-off-by: Weiwei Li <liweiwei@iscas.ac.cn>
Signed-off-by: Junqiang Wang <wangjunqiang@iscas.ac.cn>
Reviewed-by: LIU Zhiwei <zhiwei_liu@linux.alibaba.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230422130329.23555-6-liweiwei@iscas.ac.cn>

accel/tcg/cputlb.c

index e984a98dc466a136ccfb93c6fd15fdd7cba24c11..efa0cb67c9e903fc83323970fa2ff6f1423cc3d9 100644 (file)
@@ -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;
     }