Loading arch/powerpc/include/asm/kvm.h +12 −0 Original line number Diff line number Diff line Loading @@ -221,6 +221,12 @@ struct kvm_sregs { __u32 dbsr; /* KVM_SREGS_E_UPDATE_DBSR */ __u32 dbcr[3]; /* * iac/dac registers are 64bit wide, while this API * interface provides only lower 32 bits on 64 bit * processors. ONE_REG interface is added for 64bit * iac/dac registers. */ __u32 iac[4]; __u32 dac[2]; __u32 dvc[2]; Loading Loading @@ -326,5 +332,11 @@ struct kvm_book3e_206_tlb_params { }; #define KVM_REG_PPC_HIOR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1) #define KVM_REG_PPC_IAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2) #define KVM_REG_PPC_IAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3) #define KVM_REG_PPC_IAC3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4) #define KVM_REG_PPC_IAC4 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5) #define KVM_REG_PPC_DAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6) #define KVM_REG_PPC_DAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7) #endif /* __LINUX_KVM_POWERPC_H */ arch/powerpc/include/asm/kvm_host.h +22 −2 Original line number Diff line number Diff line Loading @@ -346,6 +346,27 @@ struct kvmppc_slb { bool class : 1; }; # ifdef CONFIG_PPC_FSL_BOOK3E #define KVMPPC_BOOKE_IAC_NUM 2 #define KVMPPC_BOOKE_DAC_NUM 2 # else #define KVMPPC_BOOKE_IAC_NUM 4 #define KVMPPC_BOOKE_DAC_NUM 2 # endif #define KVMPPC_BOOKE_MAX_IAC 4 #define KVMPPC_BOOKE_MAX_DAC 2 struct kvmppc_booke_debug_reg { u32 dbcr0; u32 dbcr1; u32 dbcr2; #ifdef CONFIG_KVM_E500MC u32 dbcr4; #endif u64 iac[KVMPPC_BOOKE_MAX_IAC]; u64 dac[KVMPPC_BOOKE_MAX_DAC]; }; struct kvm_vcpu_arch { ulong host_stack; u32 host_pid; Loading Loading @@ -440,8 +461,6 @@ struct kvm_vcpu_arch { u32 ccr0; u32 ccr1; u32 dbcr0; u32 dbcr1; u32 dbsr; u64 mmcr[3]; Loading Loading @@ -476,6 +495,7 @@ struct kvm_vcpu_arch { u32 tlbcfg[4]; u32 mmucfg; u32 epr; struct kvmppc_booke_debug_reg dbg_reg; #endif gpa_t paddr_accessed; gva_t vaddr_accessed; Loading arch/powerpc/kvm/booke.c +46 −2 Original line number Diff line number Diff line Loading @@ -1351,12 +1351,56 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) { return -EINVAL; int r = -EINVAL; switch (reg->id) { case KVM_REG_PPC_IAC1: case KVM_REG_PPC_IAC2: case KVM_REG_PPC_IAC3: case KVM_REG_PPC_IAC4: { int iac = reg->id - KVM_REG_PPC_IAC1; r = copy_to_user((u64 __user *)(long)reg->addr, &vcpu->arch.dbg_reg.iac[iac], sizeof(u64)); break; } case KVM_REG_PPC_DAC1: case KVM_REG_PPC_DAC2: { int dac = reg->id - KVM_REG_PPC_DAC1; r = copy_to_user((u64 __user *)(long)reg->addr, &vcpu->arch.dbg_reg.dac[dac], sizeof(u64)); break; } default: break; } return r; } int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) { return -EINVAL; int r = -EINVAL; switch (reg->id) { case KVM_REG_PPC_IAC1: case KVM_REG_PPC_IAC2: case KVM_REG_PPC_IAC3: case KVM_REG_PPC_IAC4: { int iac = reg->id - KVM_REG_PPC_IAC1; r = copy_from_user(&vcpu->arch.dbg_reg.iac[iac], (u64 __user *)(long)reg->addr, sizeof(u64)); break; } case KVM_REG_PPC_DAC1: case KVM_REG_PPC_DAC2: { int dac = reg->id - KVM_REG_PPC_DAC1; r = copy_from_user(&vcpu->arch.dbg_reg.dac[dac], (u64 __user *)(long)reg->addr, sizeof(u64)); break; } default: break; } return r; } int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) Loading arch/powerpc/kvm/booke_emulate.c +4 −4 Original line number Diff line number Diff line Loading @@ -133,10 +133,10 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val) vcpu->arch.csrr1 = spr_val; break; case SPRN_DBCR0: vcpu->arch.dbcr0 = spr_val; vcpu->arch.dbg_reg.dbcr0 = spr_val; break; case SPRN_DBCR1: vcpu->arch.dbcr1 = spr_val; vcpu->arch.dbg_reg.dbcr1 = spr_val; break; case SPRN_DBSR: vcpu->arch.dbsr &= ~spr_val; Loading Loading @@ -266,10 +266,10 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val) *spr_val = vcpu->arch.csrr1; break; case SPRN_DBCR0: *spr_val = vcpu->arch.dbcr0; *spr_val = vcpu->arch.dbg_reg.dbcr0; break; case SPRN_DBCR1: *spr_val = vcpu->arch.dbcr1; *spr_val = vcpu->arch.dbg_reg.dbcr1; break; case SPRN_DBSR: *spr_val = vcpu->arch.dbsr; Loading Loading
arch/powerpc/include/asm/kvm.h +12 −0 Original line number Diff line number Diff line Loading @@ -221,6 +221,12 @@ struct kvm_sregs { __u32 dbsr; /* KVM_SREGS_E_UPDATE_DBSR */ __u32 dbcr[3]; /* * iac/dac registers are 64bit wide, while this API * interface provides only lower 32 bits on 64 bit * processors. ONE_REG interface is added for 64bit * iac/dac registers. */ __u32 iac[4]; __u32 dac[2]; __u32 dvc[2]; Loading Loading @@ -326,5 +332,11 @@ struct kvm_book3e_206_tlb_params { }; #define KVM_REG_PPC_HIOR (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x1) #define KVM_REG_PPC_IAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x2) #define KVM_REG_PPC_IAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x3) #define KVM_REG_PPC_IAC3 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x4) #define KVM_REG_PPC_IAC4 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x5) #define KVM_REG_PPC_DAC1 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x6) #define KVM_REG_PPC_DAC2 (KVM_REG_PPC | KVM_REG_SIZE_U64 | 0x7) #endif /* __LINUX_KVM_POWERPC_H */
arch/powerpc/include/asm/kvm_host.h +22 −2 Original line number Diff line number Diff line Loading @@ -346,6 +346,27 @@ struct kvmppc_slb { bool class : 1; }; # ifdef CONFIG_PPC_FSL_BOOK3E #define KVMPPC_BOOKE_IAC_NUM 2 #define KVMPPC_BOOKE_DAC_NUM 2 # else #define KVMPPC_BOOKE_IAC_NUM 4 #define KVMPPC_BOOKE_DAC_NUM 2 # endif #define KVMPPC_BOOKE_MAX_IAC 4 #define KVMPPC_BOOKE_MAX_DAC 2 struct kvmppc_booke_debug_reg { u32 dbcr0; u32 dbcr1; u32 dbcr2; #ifdef CONFIG_KVM_E500MC u32 dbcr4; #endif u64 iac[KVMPPC_BOOKE_MAX_IAC]; u64 dac[KVMPPC_BOOKE_MAX_DAC]; }; struct kvm_vcpu_arch { ulong host_stack; u32 host_pid; Loading Loading @@ -440,8 +461,6 @@ struct kvm_vcpu_arch { u32 ccr0; u32 ccr1; u32 dbcr0; u32 dbcr1; u32 dbsr; u64 mmcr[3]; Loading Loading @@ -476,6 +495,7 @@ struct kvm_vcpu_arch { u32 tlbcfg[4]; u32 mmucfg; u32 epr; struct kvmppc_booke_debug_reg dbg_reg; #endif gpa_t paddr_accessed; gva_t vaddr_accessed; Loading
arch/powerpc/kvm/booke.c +46 −2 Original line number Diff line number Diff line Loading @@ -1351,12 +1351,56 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu, int kvm_vcpu_ioctl_get_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) { return -EINVAL; int r = -EINVAL; switch (reg->id) { case KVM_REG_PPC_IAC1: case KVM_REG_PPC_IAC2: case KVM_REG_PPC_IAC3: case KVM_REG_PPC_IAC4: { int iac = reg->id - KVM_REG_PPC_IAC1; r = copy_to_user((u64 __user *)(long)reg->addr, &vcpu->arch.dbg_reg.iac[iac], sizeof(u64)); break; } case KVM_REG_PPC_DAC1: case KVM_REG_PPC_DAC2: { int dac = reg->id - KVM_REG_PPC_DAC1; r = copy_to_user((u64 __user *)(long)reg->addr, &vcpu->arch.dbg_reg.dac[dac], sizeof(u64)); break; } default: break; } return r; } int kvm_vcpu_ioctl_set_one_reg(struct kvm_vcpu *vcpu, struct kvm_one_reg *reg) { return -EINVAL; int r = -EINVAL; switch (reg->id) { case KVM_REG_PPC_IAC1: case KVM_REG_PPC_IAC2: case KVM_REG_PPC_IAC3: case KVM_REG_PPC_IAC4: { int iac = reg->id - KVM_REG_PPC_IAC1; r = copy_from_user(&vcpu->arch.dbg_reg.iac[iac], (u64 __user *)(long)reg->addr, sizeof(u64)); break; } case KVM_REG_PPC_DAC1: case KVM_REG_PPC_DAC2: { int dac = reg->id - KVM_REG_PPC_DAC1; r = copy_from_user(&vcpu->arch.dbg_reg.dac[dac], (u64 __user *)(long)reg->addr, sizeof(u64)); break; } default: break; } return r; } int kvm_arch_vcpu_ioctl_get_fpu(struct kvm_vcpu *vcpu, struct kvm_fpu *fpu) Loading
arch/powerpc/kvm/booke_emulate.c +4 −4 Original line number Diff line number Diff line Loading @@ -133,10 +133,10 @@ int kvmppc_booke_emulate_mtspr(struct kvm_vcpu *vcpu, int sprn, ulong spr_val) vcpu->arch.csrr1 = spr_val; break; case SPRN_DBCR0: vcpu->arch.dbcr0 = spr_val; vcpu->arch.dbg_reg.dbcr0 = spr_val; break; case SPRN_DBCR1: vcpu->arch.dbcr1 = spr_val; vcpu->arch.dbg_reg.dbcr1 = spr_val; break; case SPRN_DBSR: vcpu->arch.dbsr &= ~spr_val; Loading Loading @@ -266,10 +266,10 @@ int kvmppc_booke_emulate_mfspr(struct kvm_vcpu *vcpu, int sprn, ulong *spr_val) *spr_val = vcpu->arch.csrr1; break; case SPRN_DBCR0: *spr_val = vcpu->arch.dbcr0; *spr_val = vcpu->arch.dbg_reg.dbcr0; break; case SPRN_DBCR1: *spr_val = vcpu->arch.dbcr1; *spr_val = vcpu->arch.dbg_reg.dbcr1; break; case SPRN_DBSR: *spr_val = vcpu->arch.dbsr; Loading