diff options
author | Balbir Singh <bsingharora@gmail.com> | 2016-04-03 20:37:58 +1000 |
---|---|---|
committer | Will Deacon <will.deacon@arm.com> | 2016-04-11 11:59:57 +0100 |
commit | 62a15bd19897dd7cbcc35e74037bcba9dec39d02 (patch) | |
tree | fd3eb9bb54f7e6d44c60339e251d922f8a8fa7a5 | |
parent | 7dda8cca6df01763f720e8f1c239b27a6443073d (diff) | |
download | kvmtool-62a15bd19897dd7cbcc35e74037bcba9dec39d02.tar.gz |
Add basic little endian support for ppc64le.
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
Signed-off-by: Balbir Singh <bsingharora@gmail.com>
Acked-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r-- | powerpc/kvm.c | 24 | ||||
-rw-r--r-- | powerpc/spapr.h | 5 |
2 files changed, 15 insertions, 14 deletions
diff --git a/powerpc/kvm.c b/powerpc/kvm.c index 2b0bddd0..d061c981 100644 --- a/powerpc/kvm.c +++ b/powerpc/kvm.c @@ -258,21 +258,21 @@ static void generate_segment_page_sizes(struct kvm_ppc_smmu_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); } } } @@ -297,7 +297,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); @@ -369,7 +369,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 : @@ -508,11 +508,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 7a377d09..8b294d17 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, |