Re: [PATCH 2/5] KVM: PPC: Book3S: Add MMIO emulation for FP and VSX instructions

2017-03-24 Thread kbuild test robot
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

2017-03-22 Thread Paul Mackerras
From: Bin Lu 

This 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];