qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [RFC 14/38] softmmu: add helpers to get ld/st physical


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [RFC 14/38] softmmu: add helpers to get ld/st physical addresses
Date: Sun, 23 Aug 2015 19:02:30 -0700
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.1.0


On 23/08/2015 17:23, Emilio G. Cota wrote:
> This will be used by the atomic instruction emulation code.

Is this a fast path?  If not, we can use the existing addend field and
convert the host address to a ram_addr_t easily.

Paolo

> Signed-off-by: Emilio G. Cota <address@hidden>
> ---
>  softmmu_template.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
>  tcg/tcg.h          |  5 +++++
>  2 files changed, 53 insertions(+)
> 
> diff --git a/softmmu_template.h b/softmmu_template.h
> index b66eaf8..6496a8a 100644
> --- a/softmmu_template.h
> +++ b/softmmu_template.h
> @@ -480,6 +480,54 @@ void helper_le_st_name(CPUArchState *env, target_ulong 
> addr, DATA_TYPE val,
>  #endif
>  }
>  
> +#if DATA_SIZE == 1
> +
> +/* get a load's physical address */
> +hwaddr helper_ret_get_ld_phys(CPUArchState *env, target_ulong addr,
> +                              int mmu_idx, uintptr_t retaddr)
> +{
> +    int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
> +    CPUTLBEntry *te = &env->tlb_table[mmu_idx][index];
> +    target_ulong taddr;
> +    target_ulong phys_addr;
> +
> +    retaddr -= GETPC_ADJ;
> +    taddr = te->addr_read & (TARGET_PAGE_MASK | TLB_INVALID_MASK);
> +    if (taddr != (addr & TARGET_PAGE_MASK)) {
> +        if (!VICTIM_TLB_HIT(addr_read)) {
> +            CPUState *cs = ENV_GET_CPU(env);
> +
> +            tlb_fill(cs, addr, MMU_DATA_LOAD, mmu_idx, retaddr);
> +        }
> +    }
> +    phys_addr = te->addr_phys;
> +    return phys_addr | (addr & ~TARGET_PAGE_MASK);
> +}
> +
> +/* get a store's physical address */
> +hwaddr helper_ret_get_st_phys(CPUArchState *env, target_ulong addr,
> +                              int mmu_idx, uintptr_t retaddr)
> +{
> +    int index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
> +    CPUTLBEntry *te = &env->tlb_table[mmu_idx][index];
> +    target_ulong taddr;
> +    target_ulong phys_addr;
> +
> +    retaddr -= GETPC_ADJ;
> +    taddr = te->addr_write & (TARGET_PAGE_MASK | TLB_INVALID_MASK);
> +    if (taddr != (addr & TARGET_PAGE_MASK)) {
> +        if (!VICTIM_TLB_HIT(addr_write)) {
> +            CPUState *cs = ENV_GET_CPU(env);
> +
> +            tlb_fill(cs, addr, MMU_DATA_STORE, mmu_idx, retaddr);
> +        }
> +    }
> +    phys_addr = te->addr_phys;
> +    return phys_addr | (addr & ~TARGET_PAGE_MASK);
> +}
> +
> +#endif /* DATA_SIZE == 1 */
> +
>  #if DATA_SIZE > 1
>  void helper_be_st_name(CPUArchState *env, target_ulong addr, DATA_TYPE val,
>                         TCGMemOpIdx oi, uintptr_t retaddr)
> diff --git a/tcg/tcg.h b/tcg/tcg.h
> index 66b36f2..8d30d61 100644
> --- a/tcg/tcg.h
> +++ b/tcg/tcg.h
> @@ -992,6 +992,11 @@ void helper_be_stl_mmu(CPUArchState *env, target_ulong 
> addr, uint32_t val,
>  void helper_be_stq_mmu(CPUArchState *env, target_ulong addr, uint64_t val,
>                         TCGMemOpIdx oi, uintptr_t retaddr);
>  
> +hwaddr helper_ret_get_ld_phys(CPUArchState *env, target_ulong addr,
> +                              int mmu_idx, uintptr_t retaddr);
> +hwaddr helper_ret_get_st_phys(CPUArchState *env, target_ulong addr,
> +                              int mmu_idx, uintptr_t retaddr);
> +
>  /* Temporary aliases until backends are converted.  */
>  #ifdef TARGET_WORDS_BIGENDIAN
>  # define helper_ret_ldsw_mmu  helper_be_ldsw_mmu
> 



reply via email to

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