Message ID | 1344985483-7440-36-git-send-email-agraf@suse.de |
---|---|
State | New, archived |
Headers | show |
On 08/14/2012 06:04 PM, Alexander Graf wrote: > From: Bharat Bhushan <r65777@freescale.com> > > 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> > Signed-off-by: Alexander Graf <agraf@suse.de> > --- > arch/powerpc/include/asm/kvm.h | 12 ++++++++ > arch/powerpc/include/asm/kvm_host.h | 24 ++++++++++++++++- > arch/powerpc/kvm/booke.c | 48 +++++++++++++++++++++++++++++++++- > arch/powerpc/kvm/booke_emulate.c | 8 +++--- > 4 files changed, 84 insertions(+), 8 deletions(-) Shouldn't this be added to the table in Documentation/virtual/kvm/api.txt section 4.68 (KVM_SET_ONE_REG)? Oh, and section 4.69 refers to 4.68 as 4.64. :-P Maybe the section numbering should be removed altogether. -Scott -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 15.08.2012, at 01:44, Scott Wood wrote: > On 08/14/2012 06:04 PM, Alexander Graf wrote: >> From: Bharat Bhushan <r65777@freescale.com> >> >> 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> >> Signed-off-by: Alexander Graf <agraf@suse.de> >> --- >> arch/powerpc/include/asm/kvm.h | 12 ++++++++ >> arch/powerpc/include/asm/kvm_host.h | 24 ++++++++++++++++- >> arch/powerpc/kvm/booke.c | 48 +++++++++++++++++++++++++++++++++- >> arch/powerpc/kvm/booke_emulate.c | 8 +++--- >> 4 files changed, 84 insertions(+), 8 deletions(-) > > Shouldn't this be added to the table in > Documentation/virtual/kvm/api.txt section 4.68 (KVM_SET_ONE_REG)? Very good point. Bharat, please send a patch to add the reg to the documentation. > Oh, and section 4.69 refers to 4.68 as 4.64. :-P Maybe the section > numbering should be removed altogether. ... and while at it please also post a patch to fix the numbering mess :). I'd prefer if you just fix the numbers rather than remove them altogether though ;). Alex -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 08/14/2012 06:47 PM, Alexander Graf wrote: > > On 15.08.2012, at 01:44, Scott Wood wrote: > >> On 08/14/2012 06:04 PM, Alexander Graf wrote: >>> From: Bharat Bhushan <r65777@freescale.com> >>> >>> 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> >>> Signed-off-by: Alexander Graf <agraf@suse.de> >>> --- >>> arch/powerpc/include/asm/kvm.h | 12 ++++++++ >>> arch/powerpc/include/asm/kvm_host.h | 24 ++++++++++++++++- >>> arch/powerpc/kvm/booke.c | 48 +++++++++++++++++++++++++++++++++- >>> arch/powerpc/kvm/booke_emulate.c | 8 +++--- >>> 4 files changed, 84 insertions(+), 8 deletions(-) >> >> Shouldn't this be added to the table in >> Documentation/virtual/kvm/api.txt section 4.68 (KVM_SET_ONE_REG)? > > Very good point. Bharat, please send a patch to add the reg to the documentation. > >> Oh, and section 4.69 refers to 4.68 as 4.64. :-P Maybe the section >> numbering should be removed altogether. > > ... and while at it please also post a patch to fix the numbering mess :). I'd prefer if you just fix the numbers rather than remove them altogether though ;). The numbering seems to be a recurring problem, and just asking for trouble in a distributed development environment. I had to renumber the MMU API documentation numerous times during its long development, which was even more fun since the numbering in that area of the documentation was already broken. -Scott -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/powerpc/include/asm/kvm.h b/arch/powerpc/include/asm/kvm.h index 1bea4d8..3c14202 100644 --- a/arch/powerpc/include/asm/kvm.h +++ b/arch/powerpc/include/asm/kvm.h @@ -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 */ diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h index 51b0ccd..f20a5ef 100644 --- a/arch/powerpc/include/asm/kvm_host.h +++ b/arch/powerpc/include/asm/kvm_host.h @@ -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; @@ -440,8 +461,6 @@ struct kvm_vcpu_arch { u32 ccr0; u32 ccr1; - u32 dbcr0; - u32 dbcr1; u32 dbsr; u64 mmcr[3]; @@ -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; diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c index 09e8bf3..959aae9 100644 --- a/arch/powerpc/kvm/booke.c +++ b/arch/powerpc/kvm/booke.c @@ -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) diff --git a/arch/powerpc/kvm/booke_emulate.c b/arch/powerpc/kvm/booke_emulate.c index 5a66ade..cc99a0b 100644 --- a/arch/powerpc/kvm/booke_emulate.c +++ b/arch/powerpc/kvm/booke_emulate.c @@ -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;