[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 13/20] accel/tcg: Document the faulting lookup in tb_lookup_cmp
From: |
Richard Henderson |
Subject: |
[PULL 13/20] accel/tcg: Document the faulting lookup in tb_lookup_cmp |
Date: |
Thu, 1 Sep 2022 07:52:03 +0100 |
It was non-obvious to me why we can raise an exception in
the middle of a comparison function, but it works.
While nearby, use TARGET_PAGE_ALIGN instead of open-coding.
Acked-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
accel/tcg/cpu-exec.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 7887af6f45..5f43b9769a 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -198,7 +198,16 @@ static bool tb_lookup_cmp(const void *p, const void *d)
tb_page_addr_t phys_page2;
target_ulong virt_page2;
- virt_page2 = (desc->pc & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE;
+ /*
+ * We know that the first page matched, and an otherwise valid TB
+ * encountered an incomplete instruction at the end of that page,
+ * therefore we know that generating a new TB from the current PC
+ * must also require reading from the next page -- even if the
+ * second pages do not match, and therefore the resulting insn
+ * is different for the new TB. Therefore any exception raised
+ * here by the faulting lookup is not premature.
+ */
+ virt_page2 = TARGET_PAGE_ALIGN(desc->pc);
phys_page2 = get_page_addr_code(desc->env, virt_page2);
if (tb->page_addr[1] == phys_page2) {
return true;
--
2.34.1
- [PULL 07/20] accel/tcg: Introduce is_same_page(), (continued)
- [PULL 07/20] accel/tcg: Introduce is_same_page(), Richard Henderson, 2022/09/01
- [PULL 12/20] accel/tcg: Use probe_access_internal for softmmu get_page_addr_code_hostp, Richard Henderson, 2022/09/01
- [PULL 4/4] target/avr: Disable interrupts when env->skip set, Richard Henderson, 2022/09/01
- [PULL 11/20] accel/tcg: Move qemu_ram_addr_from_host_nofail to physmem.c, Richard Henderson, 2022/09/01
- [PULL 03/20] linux-user/x86_64: Allocate vsyscall page as a commpage, Richard Henderson, 2022/09/01
- [PULL 3/4] target/avr: Only execute one interrupt at a time, Richard Henderson, 2022/09/01
- [PULL 04/20] linux-user: Honor PT_GNU_STACK, Richard Henderson, 2022/09/01
- [PULL 14/20] accel/tcg: Remove translator_ldsw, Richard Henderson, 2022/09/01
- [PULL 09/20] accel/tcg: Unlock mmap_lock after longjmp, Richard Henderson, 2022/09/01
- [PULL 08/20] accel/tcg: Properly implement get_page_addr_code for user-only, Richard Henderson, 2022/09/01
- [PULL 13/20] accel/tcg: Document the faulting lookup in tb_lookup_cmp,
Richard Henderson <=
- [PULL 15/20] accel/tcg: Add pc and host_pc params to gen_intermediate_code, Richard Henderson, 2022/09/01
- [PULL 16/20] accel/tcg: Add fast path for translator_ld*, Richard Henderson, 2022/09/01
- [PULL 17/20] target/s390x: Make translator stop before the end of a page, Richard Henderson, 2022/09/01
- [PULL 18/20] target/i386: Make translator stop before the end of a page, Richard Henderson, 2022/09/01
- [PULL 19/20] target/riscv: Add MAX_INSN_LEN and insn_len, Richard Henderson, 2022/09/01
- [PULL 20/20] target/riscv: Make translator stop before the end of a page, Richard Henderson, 2022/09/01
- Re: [PULL 00/20] tcg patch queue, Stefan Hajnoczi, 2022/09/01