qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] target-ppc: fix 32 bit build break in the page


From: Aneesh Kumar K.V
Subject: Re: [Qemu-devel] [PATCH] target-ppc: fix 32 bit build break in the page table lookup code
Date: Thu, 13 Feb 2014 08:30:00 +0530
User-agent: Notmuch/0.17+7~gc734dd75344e (http://notmuchmail.org) Emacs/24.3.1 (x86_64-pc-linux-gnu)

Greg Kurz <address@hidden> writes:

> The 396bb9874 commit reworked page table lookup to support kvm.
> Unfortunately this breaks 32 bit build:
>
> target-ppc/mmu-hash64.h: In function ‘ppc_hash64_load_hpte0’:
> target-ppc/mmu-hash64.h:90:23: error: cast to pointer from integer of
> different size
>
> target-ppc/mmu-hash64.h: In function ‘ppc_hash64_load_hpte1’:
> target-ppc/mmu-hash64.h:101:23: error: cast to pointer from integer of
> different size
>
> The problem is that we have two cases to handle here:
> - the HTAB is external and it is accessed with a pointer
> - the HTAB is emulated and it is accessed with a hwaddr
>
> Depending on the way the HTAB is controlled, we should use the appropriate
> type:
> - controlled by kvm, it is copied to an allocated buffer (pointer)
> - controlled by qemu with an allocated buffer (pointer)
> - controlled by qemu with soft mmu (hwaddr)
>
> This patch introduces an explicit distinction between the two cases in
> the new page table lookup code.

Reviewed-by: Aneesh Kumar K.V <address@hidden>

>
> Signed-off-by: Greg Kurz <address@hidden>
> ---
>  hw/ppc/spapr_hcall.c    |    6 +++---
>  target-ppc/kvm.c        |   10 +++++-----
>  target-ppc/kvm_ppc.h    |   10 +++++-----
>  target-ppc/mmu-hash64.c |   28 +++++++++++-----------------
>  target-ppc/mmu-hash64.h |   25 +++++++++++++++++--------
>  5 files changed, 41 insertions(+), 38 deletions(-)
>
> diff --git a/hw/ppc/spapr_hcall.c b/hw/ppc/spapr_hcall.c
> index 55d4eef..9653774 100644
> --- a/hw/ppc/spapr_hcall.c
> +++ b/hw/ppc/spapr_hcall.c
> @@ -51,7 +51,7 @@ static target_ulong h_enter(PowerPCCPU *cpu, 
> sPAPREnvironment *spapr,
>      target_ulong page_shift = 12;
>      target_ulong raddr;
>      target_ulong index;
> -    uint64_t token;
> +    ppc_hash64_access_t token;
>  
>      /* only handle 4k and 16M pages for now */
>      if (pteh & HPTE64_V_LARGE) {
> @@ -137,7 +137,7 @@ static RemoveResult remove_hpte(CPUPPCState *env, 
> target_ulong ptex,
>                                  target_ulong flags,
>                                  target_ulong *vp, target_ulong *rp)
>  {
> -    uint64_t token;
> +    ppc_hash64_access_t token;
>      target_ulong v, r, rb;
>  
>      if ((ptex * HASH_PTE_SIZE_64) & ~env->htab_mask) {
> @@ -263,7 +263,7 @@ static target_ulong h_protect(PowerPCCPU *cpu, 
> sPAPREnvironment *spapr,
>      target_ulong flags = args[0];
>      target_ulong pte_index = args[1];
>      target_ulong avpn = args[2];
> -    uint64_t token;
> +    ppc_hash64_access_t token;
>      target_ulong v, r, rb;
>  
>      if ((pte_index * HASH_PTE_SIZE_64) & ~env->htab_mask) {
> diff --git a/target-ppc/kvm.c b/target-ppc/kvm.c
> index e2b07a4..2eaf956 100644
> --- a/target-ppc/kvm.c
> +++ b/target-ppc/kvm.c
> @@ -1952,7 +1952,7 @@ struct kvm_get_htab_buf {
>      target_ulong hpte[(HPTES_PER_GROUP * 2) + 1];
>  };
>  
> -uint64_t kvmppc_hash64_read_pteg(PowerPCCPU *cpu, target_ulong pte_index)
> +void *kvmppc_hash64_read_pteg(PowerPCCPU *cpu, target_ulong pte_index)
>  {
>      int htab_fd;
>      struct kvm_get_htab_fd ghf;
> @@ -1974,20 +1974,20 @@ uint64_t kvmppc_hash64_read_pteg(PowerPCCPU *cpu, 
> target_ulong pte_index)
>      }
>  
>      close(htab_fd);
> -    return (uint64_t) hpte_buf->hpte;
> +    return hpte_buf->hpte;
>  
>  out_close:
>      g_free(hpte_buf);
>      close(htab_fd);
>  error_out:
> -    return 0;
> +    return NULL;
>  }
>  
> -void kvmppc_hash64_free_pteg(uint64_t token)
> +void kvmppc_hash64_free_pteg(void *pteg)
>  {
>      struct kvm_get_htab_buf *htab_buf;
>  
> -    htab_buf = container_of((void *)token, struct kvm_get_htab_buf, hpte);
> +    htab_buf = container_of((void *)pteg, struct kvm_get_htab_buf, hpte);
>      g_free(htab_buf);
>      return;
>  }
> diff --git a/target-ppc/kvm_ppc.h b/target-ppc/kvm_ppc.h
> index a65d345..bf29e7c 100644
> --- a/target-ppc/kvm_ppc.h
> +++ b/target-ppc/kvm_ppc.h
> @@ -44,8 +44,8 @@ int kvmppc_get_htab_fd(bool write);
>  int kvmppc_save_htab(QEMUFile *f, int fd, size_t bufsize, int64_t max_ns);
>  int kvmppc_load_htab_chunk(QEMUFile *f, int fd, uint32_t index,
>                             uint16_t n_valid, uint16_t n_invalid);
> -uint64_t kvmppc_hash64_read_pteg(PowerPCCPU *cpu, target_ulong pte_index);
> -void kvmppc_hash64_free_pteg(uint64_t token);
> +void *kvmppc_hash64_read_pteg(PowerPCCPU *cpu, target_ulong pte_index);
> +void kvmppc_hash64_free_pteg(void *pteg);
>  
>  void kvmppc_hash64_write_pte(CPUPPCState *env, target_ulong pte_index,
>                               target_ulong pte0, target_ulong pte1);
> @@ -199,13 +199,13 @@ static inline int kvmppc_load_htab_chunk(QEMUFile *f, 
> int fd, uint32_t index,
>      abort();
>  }
>  
> -static inline uint64_t kvmppc_hash64_read_pteg(PowerPCCPU *cpu,
> -                                               target_ulong pte_index)
> +static inline void *kvmppc_hash64_read_pteg(PowerPCCPU *cpu,
> +                                            target_ulong pte_index)
>  {
>      abort();
>  }
>  
> -static inline void kvmppc_hash64_free_pteg(uint64_t token)
> +static inline void kvmppc_hash64_free_pteg(void *pteg)
>  {
>      abort();
>  }
> diff --git a/target-ppc/mmu-hash64.c b/target-ppc/mmu-hash64.c
> index 4e574d9..98878ef 100644
> --- a/target-ppc/mmu-hash64.c
> +++ b/target-ppc/mmu-hash64.c
> @@ -315,9 +315,10 @@ static int ppc_hash64_amr_prot(CPUPPCState *env, 
> ppc_hash_pte64_t pte)
>      return prot;
>  }
>  
> -uint64_t ppc_hash64_start_access(PowerPCCPU *cpu, target_ulong pte_index)
> +ppc_hash64_access_t ppc_hash64_start_access(PowerPCCPU *cpu,
> +                                            target_ulong pte_index)
>  {
> -    uint64_t token = 0;
> +    ppc_hash64_access_t token = { .phys_addr = 0UL };
>      hwaddr pte_offset;
>  
>      pte_offset = pte_index * HASH_PTE_SIZE_64;
> @@ -325,32 +326,25 @@ uint64_t ppc_hash64_start_access(PowerPCCPU *cpu, 
> target_ulong pte_index)
>          /*
>           * HTAB is controlled by KVM. Fetch the PTEG into a new buffer.
>           */
> -        token = kvmppc_hash64_read_pteg(cpu, pte_index);
> -        if (token) {
> -            return token;
> -        }
> -        /*
> -         * pteg read failed, even though we have allocated htab via
> -         * kvmppc_reset_htab.
> -         */
> -        return 0;
> +        token.ext_ptr = kvmppc_hash64_read_pteg(cpu, pte_index);
> +        return token;
>      }
>      /*
>       * HTAB is controlled by QEMU. Just point to the internally
>       * accessible PTEG.
>       */
>      if (cpu->env.external_htab) {
> -        token = (uint64_t) cpu->env.external_htab + pte_offset;
> +        token.ext_ptr = cpu->env.external_htab + pte_offset;
>      } else if (cpu->env.htab_base) {
> -        token = cpu->env.htab_base + pte_offset;
> +        token.phys_addr = cpu->env.htab_base + pte_offset;
>      }
>      return token;
>  }
>  
> -void ppc_hash64_stop_access(uint64_t token)
> +void ppc_hash64_stop_access(ppc_hash64_access_t token)
>  {
>      if (kvmppc_kern_htab) {
> -        return kvmppc_hash64_free_pteg(token);
> +        return kvmppc_hash64_free_pteg(token.ext_ptr);
>      }
>  }
>  
> @@ -359,13 +353,13 @@ static hwaddr ppc_hash64_pteg_search(CPUPPCState *env, 
> hwaddr hash,
>                                       ppc_hash_pte64_t *pte)
>  {
>      int i;
> -    uint64_t token;
> +    ppc_hash64_access_t token;
>      target_ulong pte0, pte1;
>      target_ulong pte_index;
>  
>      pte_index = (hash & env->htab_mask) * HPTES_PER_GROUP;
>      token = ppc_hash64_start_access(ppc_env_get_cpu(env), pte_index);
> -    if (!token) {
> +    if (token.phys_addr == 0UL) {
>          return -1;
>      }
>      for (i = 0; i < HPTES_PER_GROUP; i++) {
> diff --git a/target-ppc/mmu-hash64.h b/target-ppc/mmu-hash64.h
> index 9c9ca1d..eb55190 100644
> --- a/target-ppc/mmu-hash64.h
> +++ b/target-ppc/mmu-hash64.h
> @@ -79,28 +79,37 @@ void ppc_hash64_store_hpte(CPUPPCState *env, target_ulong 
> index,
>  
>  
>  extern bool kvmppc_kern_htab;
> -uint64_t ppc_hash64_start_access(PowerPCCPU *cpu, target_ulong pte_index);
> -void ppc_hash64_stop_access(uint64_t token);
> +
> +typedef union {
> +    void *ext_ptr;
> +    hwaddr phys_addr;
> +} ppc_hash64_access_t;
> +
> +ppc_hash64_access_t ppc_hash64_start_access(PowerPCCPU *cpu,
> +                                            target_ulong pte_index);
> +void ppc_hash64_stop_access(ppc_hash64_access_t token);
>  
>  static inline target_ulong ppc_hash64_load_hpte0(CPUPPCState *env,
> -                                                 uint64_t token, int index)
> +                                                 ppc_hash64_access_t token,
> +                                                 int index)
>  {
>      index *= HASH_PTE_SIZE_64;
>      if (env->external_htab) {
> -        return  ldq_p((const void *)(token + index));
> +        return  ldq_p(token.ext_ptr + index);
>      } else {
> -        return ldq_phys(token + index);
> +        return ldq_phys(token.phys_addr + index);
>      }
>  }
>  
>  static inline target_ulong ppc_hash64_load_hpte1(CPUPPCState *env,
> -                                                 uint64_t token, int index)
> +                                                 ppc_hash64_access_t token,
> +                                                 int index)
>  {
>      index *= HASH_PTE_SIZE_64;
>      if (env->external_htab) {
> -        return  ldq_p((const void *)(token + index + HASH_PTE_SIZE_64/2));
> +        return  ldq_p(token.ext_ptr + index + HASH_PTE_SIZE_64/2);
>      } else {
> -        return ldq_phys(token + index + HASH_PTE_SIZE_64/2);
> +        return ldq_phys(token.phys_addr + index + HASH_PTE_SIZE_64/2);
>      }
>  }
>  




reply via email to

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