@@ -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];
@@ -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 */
@@ -342,6 +342,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;
@@ -436,9 +457,8 @@ struct kvm_vcpu_arch {
u32 ccr0;
u32 ccr1;
- u32 dbcr0;
- u32 dbcr1;
u32 dbsr;
+ struct kvmppc_booke_debug_reg dbg_reg;
u64 mmcr[3];
u32 pmc[8];
@@ -1353,12 +1353,74 @@ 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:
+ r = copy_to_user((u64 __user *)(long)reg->addr,
+ &vcpu->arch.dbg_reg.iac[0], sizeof(u64));
+ break;
+ case KVM_REG_PPC_IAC2:
+ r = copy_to_user((u64 __user *)(long)reg->addr,
+ &vcpu->arch.dbg_reg.iac[1], sizeof(u64));
+ break;
+#ifndef CONFIG_PPC_FSL_BOOK3E
+ case KVM_REG_PPC_IAC3:
+ r = copy_to_user((u64 __user *)(long)reg->addr,
+ &vcpu->arch.dbg_reg.iac[2], sizeof(u64));
+ break;
+ case KVM_REG_PPC_IAC4:
+ r = copy_to_user((u64 __user *)(long)reg->addr,
+ &vcpu->arch.dbg_reg.iac[3], sizeof(u64));
+ break;
+#endif
+ case KVM_REG_PPC_DAC1:
+ r = copy_to_user((u64 __user *)(long)reg->addr,
+ &vcpu->arch.dbg_reg.dac[0], sizeof(u64));
+ break;
+ case KVM_REG_PPC_DAC2:
+ r = copy_to_user((u64 __user *)(long)reg->addr,
+ &vcpu->arch.dbg_reg.dac[1], 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:
+ r = copy_from_user(&vcpu->arch.dbg_reg.iac[0],
+ (u64 __user *)(long)reg->addr, sizeof(u64));
+ break;
+ case KVM_REG_PPC_IAC2:
+ r = copy_from_user(&vcpu->arch.dbg_reg.iac[1],
+ (u64 __user *)(long)reg->addr, sizeof(u64));
+ break;
+ case KVM_REG_PPC_IAC3:
+ r = copy_from_user(&vcpu->arch.dbg_reg.iac[2],
+ (u64 __user *)(long)reg->addr, sizeof(u64));
+ break;
+ case KVM_REG_PPC_IAC4:
+ r = copy_from_user(&vcpu->arch.dbg_reg.iac[3],
+ (u64 __user *)(long)reg->addr, sizeof(u64));
+ break;
+ case KVM_REG_PPC_DAC1:
+ r = copy_from_user(&vcpu->arch.dbg_reg.dac[0],
+ (u64 __user *)(long)reg->addr, sizeof(u64));
+ break;
+ case KVM_REG_PPC_DAC2:
+ r = copy_from_user(&vcpu->arch.dbg_reg.dac[1],
+ (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)
@@ -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;
@@ -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;
IAC/DAC are defined as 32 bit while they are 64 bit wide. So ONE_REG interface is added to set/get them. Signed-off-by: Bharat Bhushan <bharat.bhushan@freescale.com> --- v3: - IAC3/4 defined on non-fsl booke - kvmppc_debug_reg renamed to kvmppc_booke_debug_reg v2: - Using copy_to/from_user() apis. arch/powerpc/include/asm/kvm.h | 12 ++++++ arch/powerpc/include/asm/kvm_host.h | 24 +++++++++++- arch/powerpc/kvm/booke.c | 66 +++++++++++++++++++++++++++++++++- arch/powerpc/kvm/booke_emulate.c | 8 ++-- 4 files changed, 102 insertions(+), 8 deletions(-)