Re: [PATCH 1/4] Add basic little endian support.

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

 



On Mon, 2016-03-21 at 18:17 +1100, Balbir Singh wrote:

> Currently kvmtool works well/was designed for big endian ppc64 systems.
> This patch adds support for little endian systems
> 
> The system does not yet boot as support for h_set_mode is required to help
> with exceptions in big endian mode -- first page fault. The support comes in
> the next patch of the series

Can we define some of the variables below with the appropriate endian?
pft_size_prop, segment_page_sizes_1, and rtas could all be defined as
big endian.

Mikey



> Signed-off-by: Balbir Singh <bsingharora@xxxxxxxxx>
> ---
>  powerpc/kvm.c   | 24 ++++++++++++------------
>  powerpc/spapr.h |  5 +++--
>  2 files changed, 15 insertions(+), 14 deletions(-)
> 
> diff --git a/powerpc/kvm.c b/powerpc/kvm.c
> index b4c3310..d147e0c 100644
> --- a/powerpc/kvm.c
> +++ b/powerpc/kvm.c
> @@ -253,21 +253,21 @@ static void generate_segment_page_sizes(struct kvm_ppc_smu_info *info, struct f
>    	  	  if (sps->page_shift == 0)
>    	  	  	  break;
>  
> -  	  	  *p++ = sps->page_shift;
> -  	  	  *p++ = sps->slb_enc;
> +  	  	  *p++ = cpu_to_be32(sps->page_shift);
> +  	  	  *p++ = cpu_to_be32(sps->slb_enc);
>  
>    	  	  for (j = 0; j < KVM_PPC_PAGE_SIZES_MAX_SZ; j++)
>    	  	  	  if (!info->sps[i].enc[j].page_shift)
>    	  	  	  	  break;
>  
> -  	  	  *p++ = j;  	  /* count of enc */
> +  	  	  *p++ = cpu_to_be32(j);  	  /* count of enc */
>  
>    	  	  for (j = 0; j < KVM_PPC_PAGE_SIZES_MAX_SZ; j++) {
>    	  	  	  if (!info->sps[i].enc[j].page_shift)
>    	  	  	  	  break;
>  
> -  	  	  	  *p++ = info->sps[i].enc[j].page_shift;
> -  	  	  	  *p++ = info->sps[i].enc[j].pte_enc;
> +  	  	  	  *p++ = cpu_to_be32(info->sps[i].enc[j].page_shift);
> +  	  	  	  *p++ = cpu_to_be32(info->sps[i].enc[j].pte_enc);
>    	  	  }
>    	  }
>  }
> @@ -292,7 +292,7 @@ static int setup_fdt(struct kvm *kvm)
>    	  u8  	  	  staging_fdt[FDT_MAX_SIZE];
>    	  struct cpu_info *cpu_info = find_cpu_info(kvm);
>    	  struct fdt_prop segment_page_sizes;
> -  	  u32 segment_sizes_1T[] = {0x1c, 0x28, 0xffffffff, 0xffffffff};
> +  	  u32 segment_sizes_1T[] = {cpu_to_be32(0x1c), cpu_to_be32(0x28), 0xffffffff, 0xffffffff};
>  
>    	  /* Generate an appropriate DT at kvm->arch.fdt_gra */
>    	  void *fdt_dest = guest_flat_to_host(kvm, kvm->arch.fdt_gra);
> @@ -364,7 +364,7 @@ static int setup_fdt(struct kvm *kvm)
>    	  _FDT(fdt_property_cell(fdt, "#size-cells", 0x0));
>  
>    	  for (i = 0; i < smp_cpus; i += SMT_THREADS) {
> -  	  	  int32_t pft_size_prop[] = { 0, HPT_ORDER };
> +  	  	  int32_t pft_size_prop[] = { 0, cpu_to_be32(HPT_ORDER) };
>    	  	  uint32_t servers_prop[SMT_THREADS];
>    	  	  uint32_t gservers_prop[SMT_THREADS * 2];
>    	  	  int threads = (smp_cpus - i) >= SMT_THREADS ? SMT_THREADS :
> @@ -503,11 +503,11 @@ int kvm__arch_setup_firmware(struct kvm *kvm)
>    	   */
>    	  uint32_t *rtas = guest_flat_to_host(kvm, kvm->arch.rtas_gra);
>  
> -  	  rtas[0] = 0x7c641b78;
> -  	  rtas[1] = 0x3c600000;
> -  	  rtas[2] = 0x6063f000;
> -  	  rtas[3] = 0x44000022;
> -  	  rtas[4] = 0x4e800020;
> +  	  rtas[0] = cpu_to_be32(0x7c641b78);
> +  	  rtas[1] = cpu_to_be32(0x3c600000);
> +  	  rtas[2] = cpu_to_be32(0x6063f000);
> +  	  rtas[3] = cpu_to_be32(0x44000022);
> +  	  rtas[4] = cpu_to_be32(0x4e800020);
>    	  kvm->arch.rtas_size = 20;
>  
>    	  pr_info("Set up %ld bytes of RTAS at 0x%lx\n",
> diff --git a/powerpc/spapr.h b/powerpc/spapr.h
> index 7a377d0..8b294d1 100644
> --- a/powerpc/spapr.h
> +++ b/powerpc/spapr.h
> @@ -15,6 +15,7 @@
>  #define __HW_SPAPR_H__
>  
>  #include <inttypes.h>
> +#include <linux/byteorder.h>
>  
>  #include "kvm/kvm.h"
>  #include "kvm/kvm-cpu.h"
> @@ -80,12 +81,12 @@ int spapr_rtas_fdt_setup(struct kvm *kvm, void *fdt);
>  
>  static inline uint32_t rtas_ld(struct kvm *kvm, target_ulong phys, int n)
>  {
> -  	  return *((uint32_t *)guest_flat_to_host(kvm, phys + 4*n));
> +  	  return cpu_to_be32(*((uint32_t *)guest_flat_to_host(kvm, phys + 4*n)));
>  }
>  
>  static inline void rtas_st(struct kvm *kvm, target_ulong phys, int n, uint32_t val)
>  {
> -  	  *((uint32_t *)guest_flat_to_host(kvm, phys + 4*n)) = val;
> +  	  *((uint32_t *)guest_flat_to_host(kvm, phys + 4*n)) = cpu_to_be32(val);
>  }
>  
>  typedef void (*spapr_rtas_fn)(struct kvm_cpu *vcpu, uint32_t token,
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux