Re: [PATCH 2/5] KVM: PPC: Book3S: Add MMIO emulation for FP and VSX instructions
Hi Bin, [auto build test ERROR on powerpc/next] [also build test ERROR on v4.11-rc3 next-20170324] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Paul-Mackerras/KVM-PPC-Improve-MMIO-emulation/20170323-180125 base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next config: powerpc-allyesconfig (attached as .config) compiler: powerpc64-linux-gnu-gcc (Debian 6.1.1-9) 6.1.1 20160705 reproduce: wget https://raw.githubusercontent.com/01org/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # save the attached .config to linux build tree make.cross ARCH=powerpc All errors (new ones prefixed by >>): >> arch/powerpc/kvm/fpu.o:(.opd+0x0): multiple definition of `fps_fres' arch/powerpc/kvm/fpu.o:(.opd+0x0): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fres': (.text+0x0): multiple definition of `.fps_fres' arch/powerpc/kvm/fpu.o:(.text+0x0): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x18): multiple definition of `fps_frsqrte' arch/powerpc/kvm/fpu.o:(.opd+0x18): first defined here arch/powerpc/kvm/fpu.o: In function `fps_frsqrte': (.text+0x20): multiple definition of `.fps_frsqrte' arch/powerpc/kvm/fpu.o:(.text+0x20): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x30): multiple definition of `fps_fsqrts' arch/powerpc/kvm/fpu.o:(.opd+0x30): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fsqrts': (.text+0x40): multiple definition of `.fps_fsqrts' arch/powerpc/kvm/fpu.o:(.text+0x40): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x48): multiple definition of `fps_fadds' arch/powerpc/kvm/fpu.o:(.opd+0x48): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fadds': (.text+0x60): multiple definition of `.fps_fadds' arch/powerpc/kvm/fpu.o:(.text+0x60): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x60): multiple definition of `fps_fdivs' arch/powerpc/kvm/fpu.o:(.opd+0x60): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fdivs': (.text+0x84): multiple definition of `.fps_fdivs' arch/powerpc/kvm/fpu.o:(.text+0x84): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x78): multiple definition of `fps_fmuls' arch/powerpc/kvm/fpu.o:(.opd+0x78): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fmuls': (.text+0xa8): multiple definition of `.fps_fmuls' arch/powerpc/kvm/fpu.o:(.text+0xa8): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x90): multiple definition of `fps_fsubs' arch/powerpc/kvm/fpu.o:(.opd+0x90): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fsubs': (.text+0xcc): multiple definition of `.fps_fsubs' arch/powerpc/kvm/fpu.o:(.text+0xcc): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0xa8): multiple definition of `fps_fmadds' arch/powerpc/kvm/fpu.o:(.opd+0xa8): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fmadds': (.text+0xf0): multiple definition of `.fps_fmadds' arch/powerpc/kvm/fpu.o:(.text+0xf0): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0xc0): multiple definition of `fps_fmsubs' arch/powerpc/kvm/fpu.o:(.opd+0xc0): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fmsubs': (.text+0x118): multiple definition of `.fps_fmsubs' arch/powerpc/kvm/fpu.o:(.text+0x118): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0xd8): multiple definition of `fps_fnmadds' arch/powerpc/kvm/fpu.o:(.opd+0xd8): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fnmadds': (.text+0x140): multiple definition of `.fps_fnmadds' arch/powerpc/kvm/fpu.o:(.text+0x140): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0xf0): multiple definition of `fps_fnmsubs' arch/powerpc/kvm/fpu.o:(.opd+0xf0): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fnmsubs': (.text+0x168): multiple definition of `.fps_fnmsubs' arch/powerpc/kvm/fpu.o:(.text+0x168): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x108): multiple definition of `fps_fsel' arch/powerpc/kvm/fpu.o:(.opd+0x108): first defined here arch/powerpc/kvm/fpu.o: In function `fps_fsel': (.text+0x190): multiple definition of `.fps_fsel' arch/powerpc/kvm/fpu.o:(.text+0x190): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x120): multiple definition of `fpd_fsqrts' arch/powerpc/kvm/fpu.o:(.opd+0x120): first defined here arch/powerpc/kvm/fpu.o: In function `fpd_fsqrts': (.text+0x1f0): multiple definition of `.fpd_fsqrts' arch/powerpc/kvm/fpu.o:(.text+0x1f0): first defined here >> arch/powerpc/kvm/fpu.o:(.opd+0x138): multiple definition of `fpd_frsqrtes' arch/powerpc/kvm/fpu.o:(.opd+0x138): first defined here arch/powerpc/kvm/fpu.o: In function `fpd_frsqrtes': (.text+0x204): multiple definition of `.fpd_frsqrtes' arch/powerpc/kvm/fpu.o:(.text+0x204): first defined here >>
[PATCH 2/5] KVM: PPC: Book3S: Add MMIO emulation for FP and VSX instructions
From: Bin LuThis patch provides the MMIO load/store emulation for instructions of 'double & vector unsigned char & vector signed char & vector unsigned short & vector signed short & vector unsigned int & vector signed int & vector double '. The instructions that this adds emulation for are: - ldx, ldux, lwax, - lfs, lfsx, lfsu, lfsux, lfd, lfdx, lfdu, lfdux, - stfs, stfsx, stfsu, stfsux, stfd, stfdx, stfdu, stfdux, stfiwx, - lxsdx, lxsspx, lxsiwax, lxsiwzx, lxvd2x, lxvw4x, lxvdsx, - stxsdx, stxsspx, stxsiwx, stxvd2x, stxvw4x [pau...@ozlabs.org - some cleanups, fixes and rework, make it compile for Book E] Signed-off-by: Bin Lu Signed-off-by: Paul Mackerras --- arch/powerpc/include/asm/disassemble.h | 5 + arch/powerpc/include/asm/kvm_host.h| 23 +++ arch/powerpc/include/asm/kvm_ppc.h | 7 + arch/powerpc/include/asm/ppc-opcode.h | 50 + arch/powerpc/kvm/Makefile | 2 +- arch/powerpc/kvm/emulate_loadstore.c | 335 - arch/powerpc/kvm/powerpc.c | 317 ++- 7 files changed, 731 insertions(+), 8 deletions(-) diff --git a/arch/powerpc/include/asm/disassemble.h b/arch/powerpc/include/asm/disassemble.h index 4852e84..c0a5505 100644 --- a/arch/powerpc/include/asm/disassemble.h +++ b/arch/powerpc/include/asm/disassemble.h @@ -87,6 +87,11 @@ static inline unsigned int get_oc(u32 inst) return (inst >> 11) & 0x7fff; } +static inline unsigned int get_tx_or_sx(u32 inst) +{ + return (inst) & 0x1; +} + #define IS_XFORM(inst) (get_op(inst) == 31) #define IS_DSFORM(inst)(get_op(inst) >= 56) diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 7bba8f4..201438b 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -441,6 +441,11 @@ struct mmio_hpte_cache { unsigned int index; }; +#define KVMPPC_VSX_COPY_NONE 0 +#define KVMPPC_VSX_COPY_WORD 1 +#define KVMPPC_VSX_COPY_DWORD 2 +#define KVMPPC_VSX_COPY_DWORD_LOAD_DUMP3 + struct openpic; struct kvm_vcpu_arch { @@ -644,6 +649,21 @@ struct kvm_vcpu_arch { u8 io_gpr; /* GPR used as IO source/target */ u8 mmio_host_swabbed; u8 mmio_sign_extend; + /* conversion between single and double precision */ + u8 mmio_sp64_extend; + /* +* Number of simulations for vsx. +* If we use 2*8bytes to simulate 1*16bytes, +* then the number should be 2 and +* mmio_vsx_copy_type=KVMPPC_VSX_COPY_DWORD. +* If we use 4*4bytes to simulate 1*16bytes, +* the number should be 4 and +* mmio_vsx_copy_type=KVMPPC_VSX_COPY_WORD. +*/ + u8 mmio_vsx_copy_nums; + u8 mmio_vsx_offset; + u8 mmio_vsx_copy_type; + u8 mmio_vsx_tx_sx_enabled; u8 osi_needed; u8 osi_enabled; u8 papr_enabled; @@ -732,6 +752,8 @@ struct kvm_vcpu_arch { }; #define VCPU_FPR(vcpu, i) (vcpu)->arch.fp.fpr[i][TS_FPROFFSET] +#define VCPU_VSX_FPR(vcpu, i, j) ((vcpu)->arch.fp.fpr[i][j]) +#define VCPU_VSX_VR(vcpu, i) ((vcpu)->arch.vr.vr[i]) /* Values for vcpu->arch.state */ #define KVMPPC_VCPU_NOTREADY 0 @@ -745,6 +767,7 @@ struct kvm_vcpu_arch { #define KVM_MMIO_REG_FPR 0x0020 #define KVM_MMIO_REG_QPR 0x0040 #define KVM_MMIO_REG_FQPR 0x0060 +#define KVM_MMIO_REG_VSX 0x0080 #define __KVM_HAVE_ARCH_WQP #define __KVM_HAVE_CREATE_DEVICE diff --git a/arch/powerpc/include/asm/kvm_ppc.h b/arch/powerpc/include/asm/kvm_ppc.h index 4f1f22f..bbecec4 100644 --- a/arch/powerpc/include/asm/kvm_ppc.h +++ b/arch/powerpc/include/asm/kvm_ppc.h @@ -78,9 +78,15 @@ extern int kvmppc_handle_load(struct kvm_run *run, struct kvm_vcpu *vcpu, extern int kvmppc_handle_loads(struct kvm_run *run, struct kvm_vcpu *vcpu, unsigned int rt, unsigned int bytes, int is_default_endian); +extern int kvmppc_handle_vsx_load(struct kvm_run *run, struct kvm_vcpu *vcpu, + unsigned int rt, unsigned int bytes, + int is_default_endian, int mmio_sign_extend); extern int kvmppc_handle_store(struct kvm_run *run, struct kvm_vcpu *vcpu, u64 val, unsigned int bytes, int is_default_endian); +extern int kvmppc_handle_vsx_store(struct kvm_run *run, struct kvm_vcpu *vcpu, + int rs, unsigned int bytes, + int is_default_endian); extern int kvmppc_load_last_inst(struct kvm_vcpu *vcpu, enum instruction_type type, u32 *inst); @@ -243,6 +249,7 @@ union kvmppc_one_reg { u64 dval; vector128 vval; u64 vsxval[2]; + u32 vsx32val[4];