[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
>
- [Qemu-devel] [RFC 12/38] linux-user: call rcu_(un)register_thread on pthread_(exit|create), (continued)
[Qemu-devel] [RFC 11/38] qemu-thread: handle spurious futex_wait wakeups, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 13/38] cputlb: add physical address to CPUTLBEntry, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 14/38] softmmu: add helpers to get ld/st physical addresses, Emilio G. Cota, 2015/08/23
- Re: [Qemu-devel] [RFC 14/38] softmmu: add helpers to get ld/st physical addresses,
Paolo Bonzini <=
[Qemu-devel] [RFC 17/38] aie: add target helpers, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 15/38] radix-tree: add generic lockless radix tree module, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 16/38] aie: add module for Atomic Instruction Emulation, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 20/38] tcg/i386: implement fences, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 29/38] tcg: export have_tb_lock, Emilio G. Cota, 2015/08/23
[Qemu-devel] [RFC 25/38] cpu: add barriers around cpu->tcg_exit_req, Emilio G. Cota, 2015/08/23