[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v4 20/43] tcg: Return the TB pointer from the rx region from exit
From: |
Richard Henderson |
Subject: |
[PATCH v4 20/43] tcg: Return the TB pointer from the rx region from exit_tb |
Date: |
Mon, 14 Dec 2020 08:02:51 -0600 |
This produces a small pc-relative displacement within the
generated code to the TB structure that preceeds it.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
accel/tcg/cpu-exec.c | 35 ++++++++++++++++++++++-------------
tcg/tcg-op.c | 13 ++++++++++++-
2 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c
index 272d596e0c..8df0a1782e 100644
--- a/accel/tcg/cpu-exec.c
+++ b/accel/tcg/cpu-exec.c
@@ -144,12 +144,13 @@ static void init_delay_params(SyncClocks *sc, const
CPUState *cpu)
#endif /* CONFIG USER ONLY */
/* Execute a TB, and fix up the CPU state afterwards if necessary */
-static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu, TranslationBlock
*itb)
+static inline TranslationBlock *cpu_tb_exec(CPUState *cpu,
+ TranslationBlock *itb,
+ int *tb_exit)
{
CPUArchState *env = cpu->env_ptr;
uintptr_t ret;
TranslationBlock *last_tb;
- int tb_exit;
const void *tb_ptr = itb->tc.ptr;
qemu_log_mask_and_addr(CPU_LOG_EXEC, itb->pc,
@@ -177,11 +178,20 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu,
TranslationBlock *itb)
ret = tcg_qemu_tb_exec(env, tb_ptr);
cpu->can_do_io = 1;
- last_tb = (TranslationBlock *)(ret & ~TB_EXIT_MASK);
- tb_exit = ret & TB_EXIT_MASK;
- trace_exec_tb_exit(last_tb, tb_exit);
+ /*
+ * TODO: Delay swapping back to the read-write region of the TB
+ * until we actually need to modify the TB. The read-only copy,
+ * coming from the rx region, shares the same host TLB entry as
+ * the code that executed the exit_tb opcode that arrived here.
+ * If we insist on touching both the RX and the RW pages, we
+ * double the host TLB pressure.
+ */
+ last_tb = tcg_splitwx_to_rw((void *)(ret & ~TB_EXIT_MASK));
+ *tb_exit = ret & TB_EXIT_MASK;
- if (tb_exit > TB_EXIT_IDX1) {
+ trace_exec_tb_exit(last_tb, *tb_exit);
+
+ if (*tb_exit > TB_EXIT_IDX1) {
/* We didn't start executing this TB (eg because the instruction
* counter hit zero); we must restore the guest PC to the address
* of the start of the TB.
@@ -199,7 +209,7 @@ static inline tcg_target_ulong cpu_tb_exec(CPUState *cpu,
TranslationBlock *itb)
cc->set_pc(cpu, last_tb->pc);
}
}
- return ret;
+ return last_tb;
}
#ifndef CONFIG_USER_ONLY
@@ -210,6 +220,7 @@ static void cpu_exec_nocache(CPUState *cpu, int max_cycles,
{
TranslationBlock *tb;
uint32_t cflags = curr_cflags() | CF_NOCACHE;
+ int tb_exit;
if (ignore_icount) {
cflags &= ~CF_USE_ICOUNT;
@@ -227,7 +238,7 @@ static void cpu_exec_nocache(CPUState *cpu, int max_cycles,
/* execute the generated code */
trace_exec_tb_nocache(tb, tb->pc);
- cpu_tb_exec(cpu, tb);
+ cpu_tb_exec(cpu, tb, &tb_exit);
mmap_lock();
tb_phys_invalidate(tb, -1);
@@ -244,6 +255,7 @@ void cpu_exec_step_atomic(CPUState *cpu)
uint32_t flags;
uint32_t cflags = 1;
uint32_t cf_mask = cflags & CF_HASH_MASK;
+ int tb_exit;
if (sigsetjmp(cpu->jmp_env, 0) == 0) {
start_exclusive();
@@ -260,7 +272,7 @@ void cpu_exec_step_atomic(CPUState *cpu)
cc->cpu_exec_enter(cpu);
/* execute the generated code */
trace_exec_tb(tb, pc);
- cpu_tb_exec(cpu, tb);
+ cpu_tb_exec(cpu, tb, &tb_exit);
cc->cpu_exec_exit(cpu);
} else {
/*
@@ -653,13 +665,10 @@ static inline bool cpu_handle_interrupt(CPUState *cpu,
static inline void cpu_loop_exec_tb(CPUState *cpu, TranslationBlock *tb,
TranslationBlock **last_tb, int *tb_exit)
{
- uintptr_t ret;
int32_t insns_left;
trace_exec_tb(tb, tb->pc);
- ret = cpu_tb_exec(cpu, tb);
- tb = (TranslationBlock *)(ret & ~TB_EXIT_MASK);
- *tb_exit = ret & TB_EXIT_MASK;
+ tb = cpu_tb_exec(cpu, tb, tb_exit);
if (*tb_exit != TB_EXIT_REQUESTED) {
*last_tb = tb;
return;
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
index e3dc0cb4cb..56bb8db040 100644
--- a/tcg/tcg-op.c
+++ b/tcg/tcg-op.c
@@ -2666,7 +2666,18 @@ void tcg_gen_extr32_i64(TCGv_i64 lo, TCGv_i64 hi,
TCGv_i64 arg)
void tcg_gen_exit_tb(const TranslationBlock *tb, unsigned idx)
{
- uintptr_t val = (uintptr_t)tb + idx;
+ /*
+ * Let the jit code return the read-only version of the
+ * TranslationBlock, so that we minimize the pc-relative
+ * distance of the address of the exit_tb code to TB.
+ * This will improve utilization of pc-relative address loads.
+ *
+ * TODO: Move this to translator_loop, so that all const
+ * TranslationBlock pointers refer to read-only memory.
+ * This requires coordination with targets that do not use
+ * the translator_loop.
+ */
+ uintptr_t val = (uintptr_t)tcg_splitwx_to_rx((void *)tb) + idx;
if (tb == NULL) {
tcg_debug_assert(idx == 0);
--
2.25.1
- Re: [PATCH v4 11/43] tcg: Adjust tcg_out_label for const, (continued)
- [PATCH v4 12/43] tcg: Adjust tcg_register_jit for const, Richard Henderson, 2020/12/14
- [PATCH v4 09/43] tcg: Adjust TCGLabel for const, Richard Henderson, 2020/12/14
- [PATCH v4 14/43] tcg: Make DisasContextBase.tb const, Richard Henderson, 2020/12/14
- [PATCH v4 10/43] tcg: Adjust tcg_out_call for const, Richard Henderson, 2020/12/14
- [PATCH v4 18/43] accel/tcg: Support split-wx for linux with memfd, Richard Henderson, 2020/12/14
- [PATCH v4 15/43] tcg: Make tb arg to synchronize_from_tb const, Richard Henderson, 2020/12/14
- [PATCH v4 20/43] tcg: Return the TB pointer from the rx region from exit_tb,
Richard Henderson <=
- [PATCH v4 16/43] tcg: Use Error with alloc_code_gen_buffer, Richard Henderson, 2020/12/14
- [PATCH v4 13/43] tcg: Adjust tb_target_set_jmp_target for split-wx, Richard Henderson, 2020/12/14
- [PATCH v4 19/43] accel/tcg: Support split-wx for darwin/iOS with vm_remap, Richard Henderson, 2020/12/14
- [PATCH v4 17/43] tcg: Add --accel tcg,split-wx property, Richard Henderson, 2020/12/14
- [PATCH v4 21/43] tcg/i386: Support split-wx code generation, Richard Henderson, 2020/12/14
- [PATCH v4 22/43] tcg/aarch64: Use B not BL for tcg_out_goto_long, Richard Henderson, 2020/12/14
- [PATCH v4 25/43] tcg/tci: Push const down through bytecode reading, Richard Henderson, 2020/12/14
- [PATCH v4 24/43] disas: Push const down through host disasassembly, Richard Henderson, 2020/12/14