qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC v2 09/38] cputlb: introduce get_page_addr_code_hos


From: Alex Bennée
Subject: Re: [Qemu-devel] [RFC v2 09/38] cputlb: introduce get_page_addr_code_hostp
Date: Thu, 24 Jan 2019 14:51:27 +0000
User-agent: mu4e 1.1.0; emacs 26.1.91

Emilio G. Cota <address@hidden> writes:

> This will be used by plugins to get the host address
> of instructions.
>
> Signed-off-by: Emilio G. Cota <address@hidden>
> ---
>  include/exec/exec-all.h | 13 +++++++++++++
>  accel/tcg/cputlb.c      | 14 +++++++++++++-
>  2 files changed, 26 insertions(+), 1 deletion(-)
>
> diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
> index 815e5b1e83..afcc01e0e3 100644
> --- a/include/exec/exec-all.h
> +++ b/include/exec/exec-all.h
> @@ -22,6 +22,7 @@
>
>  #include "qemu-common.h"
>  #include "exec/tb-context.h"
> +#include "exec/cpu_ldst.h"
>  #include "sysemu/cpus.h"
>
>  /* allow to see translation results - the slowdown should be negligible, so 
> we leave it */
> @@ -487,12 +488,24 @@ static inline tb_page_addr_t 
> get_page_addr_code(CPUArchState *env1, target_ulong
>  {
>      return addr;
>  }
> +
> +static inline tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env1,
> +                                                      target_ulong addr,
> +                                                      void **hostp)
> +{
> +    if (hostp) {
> +        *hostp = g2h(addr);
> +    }
> +    return addr;
> +}
>  #else
>  static inline void mmap_lock(void) {}
>  static inline void mmap_unlock(void) {}
>
>  /* cputlb.c */
>  tb_page_addr_t get_page_addr_code(CPUArchState *env1, target_ulong addr);
> +tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env1, target_ulong 
> addr,
> +                                        void **hostp);
>

It's probably about time these helpers got proper doc headers. So I take
it the host address of an instruction is where in host memory the code
is or where in host memory the translation for that instruction is?

>  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 e3582f2f1d..5c61908084 100644
> --- a/accel/tcg/cputlb.c
> +++ b/accel/tcg/cputlb.c
> @@ -1069,7 +1069,8 @@ static bool victim_tlb_hit(CPUArchState *env, size_t 
> mmu_idx, size_t index,
>   * is actually a ram_addr_t (in system mode; the user mode emulation
>   * version of this function returns a guest virtual address).
>   */
> -tb_page_addr_t get_page_addr_code(CPUArchState *env, target_ulong addr)
> +tb_page_addr_t get_page_addr_code_hostp(CPUArchState *env, target_ulong addr,
> +                                        void **hostp)
>  {
>      uintptr_t mmu_idx = cpu_mmu_index(env, true);
>      uintptr_t index = tlb_index(env, mmu_idx, addr);
> @@ -1092,13 +1093,24 @@ tb_page_addr_t get_page_addr_code(CPUArchState *env, 
> target_ulong addr)
>           *    than a target page, so we must redo the MMU check every insn
>           *  - TLB_MMIO: region is not backed by RAM
>           */
> +        if (hostp) {
> +            *hostp = NULL;
> +        }
>          return -1;
>      }
>
>      p = (void *)((uintptr_t)addr + entry->addend);
> +    if (hostp) {
> +        *hostp = p;
> +    }
>      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);
> +}
> +
>  /* Probe for whether the specified guest write access is permitted.
>   * If it is not permitted then an exception will be taken in the same
>   * way as if this were a real write access (and we will not return).


--
Alex Bennée



reply via email to

[Prev in Thread] Current Thread [Next in Thread]