Message ID | 20220819032615.884847-11-richard.henderson@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | linux-user: Fix siginfo_t contents when jumping to non-readable pages | expand |
On Fri, Aug 19, 2022 at 1:33 PM Richard Henderson <richard.henderson@linaro.org> wrote: > > The function is not used outside of cpu-exec.c. Move it and > its subroutines up in the file, before the first use. > > Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Alistair > --- > include/exec/exec-all.h | 3 - > accel/tcg/cpu-exec.c | 122 ++++++++++++++++++++-------------------- > 2 files changed, 61 insertions(+), 64 deletions(-) > > diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h > index 0475ec6007..9f35e3b7a9 100644 > --- a/include/exec/exec-all.h > +++ b/include/exec/exec-all.h > @@ -552,9 +552,6 @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs); > #endif > void tb_flush(CPUState *cpu); > void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); > -TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, > - target_ulong cs_base, uint32_t flags, > - uint32_t cflags); > void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr); > > /* GETPC is the true target of the return instruction that we'll execute. */ > diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c > index d18081ca6f..7887af6f45 100644 > --- a/accel/tcg/cpu-exec.c > +++ b/accel/tcg/cpu-exec.c > @@ -170,6 +170,67 @@ uint32_t curr_cflags(CPUState *cpu) > return cflags; > } > > +struct tb_desc { > + target_ulong pc; > + target_ulong cs_base; > + CPUArchState *env; > + tb_page_addr_t phys_page1; > + uint32_t flags; > + uint32_t cflags; > + uint32_t trace_vcpu_dstate; > +}; > + > +static bool tb_lookup_cmp(const void *p, const void *d) > +{ > + const TranslationBlock *tb = p; > + const struct tb_desc *desc = d; > + > + if (tb->pc == desc->pc && > + tb->page_addr[0] == desc->phys_page1 && > + tb->cs_base == desc->cs_base && > + tb->flags == desc->flags && > + tb->trace_vcpu_dstate == desc->trace_vcpu_dstate && > + tb_cflags(tb) == desc->cflags) { > + /* check next page if needed */ > + if (tb->page_addr[1] == -1) { > + return true; > + } else { > + tb_page_addr_t phys_page2; > + target_ulong virt_page2; > + > + virt_page2 = (desc->pc & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; > + phys_page2 = get_page_addr_code(desc->env, virt_page2); > + if (tb->page_addr[1] == phys_page2) { > + return true; > + } > + } > + } > + return false; > +} > + > +static TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, > + target_ulong cs_base, uint32_t flags, > + uint32_t cflags) > +{ > + tb_page_addr_t phys_pc; > + struct tb_desc desc; > + uint32_t h; > + > + desc.env = cpu->env_ptr; > + desc.cs_base = cs_base; > + desc.flags = flags; > + desc.cflags = cflags; > + desc.trace_vcpu_dstate = *cpu->trace_dstate; > + desc.pc = pc; > + phys_pc = get_page_addr_code(desc.env, pc); > + if (phys_pc == -1) { > + return NULL; > + } > + desc.phys_page1 = phys_pc & TARGET_PAGE_MASK; > + h = tb_hash_func(phys_pc, pc, flags, cflags, *cpu->trace_dstate); > + return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp); > +} > + > /* Might cause an exception, so have a longjmp destination ready */ > static inline TranslationBlock *tb_lookup(CPUState *cpu, target_ulong pc, > target_ulong cs_base, > @@ -485,67 +546,6 @@ void cpu_exec_step_atomic(CPUState *cpu) > end_exclusive(); > } > > -struct tb_desc { > - target_ulong pc; > - target_ulong cs_base; > - CPUArchState *env; > - tb_page_addr_t phys_page1; > - uint32_t flags; > - uint32_t cflags; > - uint32_t trace_vcpu_dstate; > -}; > - > -static bool tb_lookup_cmp(const void *p, const void *d) > -{ > - const TranslationBlock *tb = p; > - const struct tb_desc *desc = d; > - > - if (tb->pc == desc->pc && > - tb->page_addr[0] == desc->phys_page1 && > - tb->cs_base == desc->cs_base && > - tb->flags == desc->flags && > - tb->trace_vcpu_dstate == desc->trace_vcpu_dstate && > - tb_cflags(tb) == desc->cflags) { > - /* check next page if needed */ > - if (tb->page_addr[1] == -1) { > - return true; > - } else { > - tb_page_addr_t phys_page2; > - target_ulong virt_page2; > - > - virt_page2 = (desc->pc & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; > - phys_page2 = get_page_addr_code(desc->env, virt_page2); > - if (tb->page_addr[1] == phys_page2) { > - return true; > - } > - } > - } > - return false; > -} > - > -TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, > - target_ulong cs_base, uint32_t flags, > - uint32_t cflags) > -{ > - tb_page_addr_t phys_pc; > - struct tb_desc desc; > - uint32_t h; > - > - desc.env = cpu->env_ptr; > - desc.cs_base = cs_base; > - desc.flags = flags; > - desc.cflags = cflags; > - desc.trace_vcpu_dstate = *cpu->trace_dstate; > - desc.pc = pc; > - phys_pc = get_page_addr_code(desc.env, pc); > - if (phys_pc == -1) { > - return NULL; > - } > - desc.phys_page1 = phys_pc & TARGET_PAGE_MASK; > - h = tb_hash_func(phys_pc, pc, flags, cflags, *cpu->trace_dstate); > - return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp); > -} > - > void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr) > { > if (TCG_TARGET_HAS_direct_jump) { > -- > 2.34.1 > >
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index 0475ec6007..9f35e3b7a9 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -552,9 +552,6 @@ void tb_invalidate_phys_addr(AddressSpace *as, hwaddr addr, MemTxAttrs attrs); #endif void tb_flush(CPUState *cpu); void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); -TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, - target_ulong cs_base, uint32_t flags, - uint32_t cflags); void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr); /* GETPC is the true target of the return instruction that we'll execute. */ diff --git a/accel/tcg/cpu-exec.c b/accel/tcg/cpu-exec.c index d18081ca6f..7887af6f45 100644 --- a/accel/tcg/cpu-exec.c +++ b/accel/tcg/cpu-exec.c @@ -170,6 +170,67 @@ uint32_t curr_cflags(CPUState *cpu) return cflags; } +struct tb_desc { + target_ulong pc; + target_ulong cs_base; + CPUArchState *env; + tb_page_addr_t phys_page1; + uint32_t flags; + uint32_t cflags; + uint32_t trace_vcpu_dstate; +}; + +static bool tb_lookup_cmp(const void *p, const void *d) +{ + const TranslationBlock *tb = p; + const struct tb_desc *desc = d; + + if (tb->pc == desc->pc && + tb->page_addr[0] == desc->phys_page1 && + tb->cs_base == desc->cs_base && + tb->flags == desc->flags && + tb->trace_vcpu_dstate == desc->trace_vcpu_dstate && + tb_cflags(tb) == desc->cflags) { + /* check next page if needed */ + if (tb->page_addr[1] == -1) { + return true; + } else { + tb_page_addr_t phys_page2; + target_ulong virt_page2; + + virt_page2 = (desc->pc & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; + phys_page2 = get_page_addr_code(desc->env, virt_page2); + if (tb->page_addr[1] == phys_page2) { + return true; + } + } + } + return false; +} + +static TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, + target_ulong cs_base, uint32_t flags, + uint32_t cflags) +{ + tb_page_addr_t phys_pc; + struct tb_desc desc; + uint32_t h; + + desc.env = cpu->env_ptr; + desc.cs_base = cs_base; + desc.flags = flags; + desc.cflags = cflags; + desc.trace_vcpu_dstate = *cpu->trace_dstate; + desc.pc = pc; + phys_pc = get_page_addr_code(desc.env, pc); + if (phys_pc == -1) { + return NULL; + } + desc.phys_page1 = phys_pc & TARGET_PAGE_MASK; + h = tb_hash_func(phys_pc, pc, flags, cflags, *cpu->trace_dstate); + return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp); +} + /* Might cause an exception, so have a longjmp destination ready */ static inline TranslationBlock *tb_lookup(CPUState *cpu, target_ulong pc, target_ulong cs_base, @@ -485,67 +546,6 @@ void cpu_exec_step_atomic(CPUState *cpu) end_exclusive(); } -struct tb_desc { - target_ulong pc; - target_ulong cs_base; - CPUArchState *env; - tb_page_addr_t phys_page1; - uint32_t flags; - uint32_t cflags; - uint32_t trace_vcpu_dstate; -}; - -static bool tb_lookup_cmp(const void *p, const void *d) -{ - const TranslationBlock *tb = p; - const struct tb_desc *desc = d; - - if (tb->pc == desc->pc && - tb->page_addr[0] == desc->phys_page1 && - tb->cs_base == desc->cs_base && - tb->flags == desc->flags && - tb->trace_vcpu_dstate == desc->trace_vcpu_dstate && - tb_cflags(tb) == desc->cflags) { - /* check next page if needed */ - if (tb->page_addr[1] == -1) { - return true; - } else { - tb_page_addr_t phys_page2; - target_ulong virt_page2; - - virt_page2 = (desc->pc & TARGET_PAGE_MASK) + TARGET_PAGE_SIZE; - phys_page2 = get_page_addr_code(desc->env, virt_page2); - if (tb->page_addr[1] == phys_page2) { - return true; - } - } - } - return false; -} - -TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, - target_ulong cs_base, uint32_t flags, - uint32_t cflags) -{ - tb_page_addr_t phys_pc; - struct tb_desc desc; - uint32_t h; - - desc.env = cpu->env_ptr; - desc.cs_base = cs_base; - desc.flags = flags; - desc.cflags = cflags; - desc.trace_vcpu_dstate = *cpu->trace_dstate; - desc.pc = pc; - phys_pc = get_page_addr_code(desc.env, pc); - if (phys_pc == -1) { - return NULL; - } - desc.phys_page1 = phys_pc & TARGET_PAGE_MASK; - h = tb_hash_func(phys_pc, pc, flags, cflags, *cpu->trace_dstate); - return qht_lookup_custom(&tb_ctx.htable, &desc, h, tb_lookup_cmp); -} - void tb_set_jmp_target(TranslationBlock *tb, int n, uintptr_t addr) { if (TCG_TARGET_HAS_direct_jump) {
The function is not used outside of cpu-exec.c. Move it and its subroutines up in the file, before the first use. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> --- include/exec/exec-all.h | 3 - accel/tcg/cpu-exec.c | 122 ++++++++++++++++++++-------------------- 2 files changed, 61 insertions(+), 64 deletions(-)