On Fri, Aug 19, 2022 at 1:40 PM Richard Henderson <richard.hender...@linaro.org> wrote: > > The current implementation is a no-op, simply returning addr. > This is incorrect, because we ought to be checking the page > permissions for execution. > > Make get_page_addr_code inline for both implementations. > > Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
Acked-by: Alistair Francis <alistair.fran...@wdc.com> Alistair > --- > include/exec/exec-all.h | 85 ++++++++++++++--------------------------- > accel/tcg/cputlb.c | 5 --- > accel/tcg/user-exec.c | 15 ++++++++ > 3 files changed, 43 insertions(+), 62 deletions(-) > > diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h > index 311e5fb422..0475ec6007 100644 > --- a/include/exec/exec-all.h > +++ b/include/exec/exec-all.h > @@ -598,43 +598,44 @@ struct MemoryRegionSection *iotlb_to_section(CPUState > *cpu, > hwaddr index, MemTxAttrs attrs); > #endif > > -#if defined(CONFIG_USER_ONLY) > -void mmap_lock(void); > -void mmap_unlock(void); > -bool have_mmap_lock(void); > - > /** > - * get_page_addr_code() - user-mode version > + * get_page_addr_code_hostp() > * @env: CPUArchState > * @addr: guest virtual address of guest code > * > - * Returns @addr. > + * See get_page_addr_code() (full-system version) for documentation on the > + * return value. > + * > + * Sets *@hostp (when @hostp is non-NULL) as follows. > + * If the return value is -1, sets *@hostp to NULL. Otherwise, sets *@hostp > + * to the host address where @addr's content is kept. > + * > + * Note: this function can trigger an exception. > + */ > +tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong addr, > + void **hostp); > + > +/** > + * get_page_addr_code() > + * @env: CPUArchState > + * @addr: guest virtual address of guest code > + * > + * If we cannot translate and execute from the entire RAM page, or if > + * the region is not backed by RAM, returns -1. Otherwise, returns the > + * ram_addr_t corresponding to the guest code at @addr. > + * > + * Note: this function can trigger an exception. > */ > static inline tb_page_addr_t get_page_addr_code(CPUArchState *env, > target_ulong addr) > { > - return addr; > + return get_page_addr_code_hostp(env, addr, NULL); > } > > -/** > - * get_page_addr_code_hostp() - user-mode version > - * @env: CPUArchState > - * @addr: guest virtual address of guest code > - * > - * Returns @addr. > - * > - * If @hostp is non-NULL, sets *@hostp to the host address where @addr's > content > - * is kept. > - */ > -static inline tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, > - target_ulong addr, > - void **hostp) > -{ > - if (hostp) { > - *hostp = g2h_untagged(addr); > - } > - return addr; > -} > +#if defined(CONFIG_USER_ONLY) > +void mmap_lock(void); > +void mmap_unlock(void); > +bool have_mmap_lock(void); > > /** > * adjust_signal_pc: > @@ -691,36 +692,6 @@ G_NORETURN void cpu_loop_exit_sigbus(CPUState *cpu, > target_ulong addr, > static inline void mmap_lock(void) {} > static inline void mmap_unlock(void) {} > > -/** > - * get_page_addr_code() - full-system version > - * @env: CPUArchState > - * @addr: guest virtual address of guest code > - * > - * If we cannot translate and execute from the entire RAM page, or if > - * the region is not backed by RAM, returns -1. Otherwise, returns the > - * ram_addr_t corresponding to the guest code at @addr. > - * > - * Note: this function can trigger an exception. > - */ > -tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr); > - > -/** > - * get_page_addr_code_hostp() - full-system version > - * @env: CPUArchState > - * @addr: guest virtual address of guest code > - * > - * See get_page_addr_code() (full-system version) for documentation on the > - * return value. > - * > - * Sets *@hostp (when @hostp is non-NULL) as follows. > - * If the return value is -1, sets *@hostp to NULL. Otherwise, sets *@hostp > - * to the host address where @addr's content is kept. > - * > - * Note: this function can trigger an exception. > - */ > -tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong addr, > - void **hostp); > - > void tlb_reset_dirty(CPUState *cpu, ram_addr_t start1, ram_addr_t length); > void tlb_set_dirty(CPUState *cpu, target_ulong vaddr); > > diff --git a/accel/tcg/cputlb.c b/accel/tcg/cputlb.c > index a46f3a654d..43bd65c973 100644 > --- a/accel/tcg/cputlb.c > +++ b/accel/tcg/cputlb.c > @@ -1544,11 +1544,6 @@ tb_page_addr_t get_page_addr_code_hostp(CPUArchState > *env, target_ulong addr, > return qemu_ram_addr_from_host_nofail(p); > } > > -tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr) > -{ > - return get_page_addr_code_hostp(env, addr, NULL); > -} > - > static void notdirty_write(CPUState *cpu, vaddr mem_vaddr, unsigned size, > CPUIOTLBEntry *iotlbentry, uintptr_t retaddr) > { > diff --git a/accel/tcg/user-exec.c b/accel/tcg/user-exec.c > index 20ada5472b..a20234fb02 100644 > --- a/accel/tcg/user-exec.c > +++ b/accel/tcg/user-exec.c > @@ -199,6 +199,21 @@ void *probe_access(CPUArchState *env, target_ulong addr, > int size, > return size ? g2h(env_cpu(env), addr) : NULL; > } > > +tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong addr, > + void **hostp) > +{ > + int flags; > + > + flags = probe_access_internal(env, addr, 1, MMU_INST_FETCH, true, 0); > + if (unlikely(flags)) { > + return -1; > + } > + if (hostp) { > + *hostp = g2h_untagged(addr); > + } > + return addr; > +} > + > /* The softmmu versions of these helpers are in cputlb.c. */ > > /* > -- > 2.34.1 > >