diff options
| author | Michael Ellerman | 2015-04-07 05:25:14 +0200 | 
|---|---|---|
| committer | Michael Ellerman | 2015-04-07 05:25:14 +0200 | 
| commit | b7f859dda95c231a276f2ec915253708f1ca7bdb (patch) | |
| tree | 17d153ebe4cd233afa3680580419f553e79087fc /arch/powerpc | |
| parent | Merge branch 'next-eeh' of git://git.kernel.org/pub/scm/linux/kernel/git/benh... (diff) | |
| parent | powerpc: Remove unused st_le*() and ld_le* functions (diff) | |
| download | kernel-qcow2-linux-b7f859dda95c231a276f2ec915253708f1ca7bdb.tar.gz kernel-qcow2-linux-b7f859dda95c231a276f2ec915253708f1ca7bdb.tar.xz kernel-qcow2-linux-b7f859dda95c231a276f2ec915253708f1ca7bdb.zip | |
Merge branch 'next-remove-ldst' of git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc into next
Diffstat (limited to 'arch/powerpc')
| -rw-r--r-- | arch/powerpc/include/asm/dbdma.h | 12 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/kvm_host.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/swab.h | 26 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/vga.h | 4 | ||||
| -rw-r--r-- | arch/powerpc/kvm/powerpc.c | 38 | 
5 files changed, 27 insertions, 55 deletions
| diff --git a/arch/powerpc/include/asm/dbdma.h b/arch/powerpc/include/asm/dbdma.h index e23f07e73cb3..6c69836b4ec2 100644 --- a/arch/powerpc/include/asm/dbdma.h +++ b/arch/powerpc/include/asm/dbdma.h @@ -42,12 +42,12 @@ struct dbdma_regs {   * DBDMA command structure.  These fields are all little-endian!   */  struct dbdma_cmd { -    unsigned short req_count;	/* requested byte transfer count */ -    unsigned short command;	/* command word (has bit-fields) */ -    unsigned int   phy_addr;	/* physical data address */ -    unsigned int   cmd_dep;	/* command-dependent field */ -    unsigned short res_count;	/* residual count after completion */ -    unsigned short xfer_status;	/* transfer status */ +	__le16 req_count;	/* requested byte transfer count */ +	__le16 command;		/* command word (has bit-fields) */ +	__le32 phy_addr;	/* physical data address */ +	__le32 cmd_dep;		/* command-dependent field */ +	__le16 res_count;	/* residual count after completion */ +	__le16 xfer_status;	/* transfer status */  };  /* DBDMA command values in command field */ diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 8ef05121d3cd..c610961720c7 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -585,7 +585,7 @@ struct kvm_vcpu_arch {  	pgd_t *pgdir;  	u8 io_gpr; /* GPR used as IO source/target */ -	u8 mmio_is_bigendian; +	u8 mmio_host_swabbed;  	u8 mmio_sign_extend;  	u8 osi_needed;  	u8 osi_enabled; diff --git a/arch/powerpc/include/asm/swab.h b/arch/powerpc/include/asm/swab.h index 96f59de61855..487e09077a3e 100644 --- a/arch/powerpc/include/asm/swab.h +++ b/arch/powerpc/include/asm/swab.h @@ -9,30 +9,4 @@  #include <uapi/asm/swab.h> -static __inline__ __u16 ld_le16(const volatile __u16 *addr) -{ -	__u16 val; - -	__asm__ __volatile__ ("lhbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); -	return val; -} - -static __inline__ void st_le16(volatile __u16 *addr, const __u16 val) -{ -	__asm__ __volatile__ ("sthbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); -} - -static __inline__ __u32 ld_le32(const volatile __u32 *addr) -{ -	__u32 val; - -	__asm__ __volatile__ ("lwbrx %0,0,%1" : "=r" (val) : "r" (addr), "m" (*addr)); -	return val; -} - -static __inline__ void st_le32(volatile __u32 *addr, const __u32 val) -{ -	__asm__ __volatile__ ("stwbrx %1,0,%2" : "=m" (*addr) : "r" (val), "r" (addr)); -} -  #endif /* _ASM_POWERPC_SWAB_H */ diff --git a/arch/powerpc/include/asm/vga.h b/arch/powerpc/include/asm/vga.h index e5f8dd366212..ab3acd2f2786 100644 --- a/arch/powerpc/include/asm/vga.h +++ b/arch/powerpc/include/asm/vga.h @@ -25,12 +25,12 @@  static inline void scr_writew(u16 val, volatile u16 *addr)  { -    st_le16(addr, val); +	*addr = cpu_to_le16(val);  }  static inline u16 scr_readw(volatile const u16 *addr)  { -    return ld_le16(addr); +	return le16_to_cpu(*addr);  }  #define VT_BUF_HAVE_MEMCPYW diff --git a/arch/powerpc/kvm/powerpc.c b/arch/powerpc/kvm/powerpc.c index 27c0face86f4..41c5f8f8a20d 100644 --- a/arch/powerpc/kvm/powerpc.c +++ b/arch/powerpc/kvm/powerpc.c @@ -720,7 +720,7 @@ static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu,  		return;  	} -	if (vcpu->arch.mmio_is_bigendian) { +	if (!vcpu->arch.mmio_host_swabbed) {  		switch (run->mmio.len) {  		case 8: gpr = *(u64 *)run->mmio.data; break;  		case 4: gpr = *(u32 *)run->mmio.data; break; @@ -728,10 +728,10 @@ static void kvmppc_complete_mmio_load(struct kvm_vcpu *vcpu,  		case 1: gpr = *(u8 *)run->mmio.data; break;  		}  	} else { -		/* Convert BE data from userland back to LE. */  		switch (run->mmio.len) { -		case 4: gpr = ld_le32((u32 *)run->mmio.data); break; -		case 2: gpr = ld_le16((u16 *)run->mmio.data); break; +		case 8: gpr = swab64(*(u64 *)run->mmio.data); break; +		case 4: gpr = swab32(*(u32 *)run->mmio.data); break; +		case 2: gpr = swab16(*(u16 *)run->mmio.data); break;  		case 1: gpr = *(u8 *)run->mmio.data; break;  		}  	} @@ -780,14 +780,13 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,  		       int is_default_endian)  {  	int idx, ret; -	int is_bigendian; +	bool host_swabbed; +	/* Pity C doesn't have a logical XOR operator */  	if (kvmppc_need_byteswap(vcpu)) { -		/* Default endianness is "little endian". */ -		is_bigendian = !is_default_endian; +		host_swabbed = is_default_endian;  	} else { -		/* Default endianness is "big endian". */ -		is_bigendian = is_default_endian; +		host_swabbed = !is_default_endian;  	}  	if (bytes > sizeof(run->mmio.data)) { @@ -800,7 +799,7 @@ int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu,  	run->mmio.is_write = 0;  	vcpu->arch.io_gpr = rt; -	vcpu->arch.mmio_is_bigendian = is_bigendian; +	vcpu->arch.mmio_host_swabbed = host_swabbed;  	vcpu->mmio_needed = 1;  	vcpu->mmio_is_write = 0;  	vcpu->arch.mmio_sign_extend = 0; @@ -840,14 +839,13 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,  {  	void *data = run->mmio.data;  	int idx, ret; -	int is_bigendian; +	bool host_swabbed; +	/* Pity C doesn't have a logical XOR operator */  	if (kvmppc_need_byteswap(vcpu)) { -		/* Default endianness is "little endian". */ -		is_bigendian = !is_default_endian; +		host_swabbed = is_default_endian;  	} else { -		/* Default endianness is "big endian". */ -		is_bigendian = is_default_endian; +		host_swabbed = !is_default_endian;  	}  	if (bytes > sizeof(run->mmio.data)) { @@ -862,7 +860,7 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,  	vcpu->mmio_is_write = 1;  	/* Store the value at the lowest bytes in 'data'. */ -	if (is_bigendian) { +	if (!host_swabbed) {  		switch (bytes) {  		case 8: *(u64 *)data = val; break;  		case 4: *(u32 *)data = val; break; @@ -870,11 +868,11 @@ int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu,  		case 1: *(u8  *)data = val; break;  		}  	} else { -		/* Store LE value into 'data'. */  		switch (bytes) { -		case 4: st_le32(data, val); break; -		case 2: st_le16(data, val); break; -		case 1: *(u8 *)data = val; break; +		case 8: *(u64 *)data = swab64(val); break; +		case 4: *(u32 *)data = swab32(val); break; +		case 2: *(u16 *)data = swab16(val); break; +		case 1: *(u8  *)data = val; break;  		}  	} | 
