From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Subject: Re: [PATCH 1/3] booke: Added ONE_REG interface for IAC/DAC debug registers Date: Tue, 7 Aug 2012 12:30:55 +0200 Message-ID: References: <1343977723-25341-1-git-send-email-Bharat.Bhushan@freescale.com> Mime-Version: 1.0 (Apple Message framework v1278) Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 8BIT Cc: , , Bharat Bhushan To: Bharat Bhushan Return-path: In-Reply-To: <1343977723-25341-1-git-send-email-Bharat.Bhushan@freescale.com> Sender: kvm-ppc-owner@vger.kernel.org List-Id: kvm.vger.kernel.org On 03.08.2012, at 09:08, Bharat Bhushan wrote: > From: Bharat Bhushan > > 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 > --- > 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(-) > > 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 873ec11..dcee499 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -344,6 +344,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; > @@ -438,9 +459,8 @@ struct kvm_vcpu_arch { > > u32 ccr0; > u32 ccr1; > - u32 dbcr0; > - u32 dbcr1; > u32 dbsr; > + struct kvmppc_booke_debug_reg dbg_reg; Please put an #ifdef CONFIG_BOOKE around the above block. > > u64 mmcr[3]; > u32 pmc[8]; > diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c > index 68ed863..aebbb8b 100644 > --- a/arch/powerpc/kvm/booke.c > +++ b/arch/powerpc/kvm/booke.c > @@ -1379,12 +1379,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 No need for the #ifdef. Also, please do something like 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(..., ...iac[iac], ...); break; } Alex > + 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) > 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; > -- > 1.7.0.4 > > From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alexander Graf Date: Tue, 07 Aug 2012 10:30:55 +0000 Subject: Re: [PATCH 1/3] booke: Added ONE_REG interface for IAC/DAC debug registers Message-Id: List-Id: References: <1343977723-25341-1-git-send-email-Bharat.Bhushan@freescale.com> In-Reply-To: <1343977723-25341-1-git-send-email-Bharat.Bhushan@freescale.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: Bharat Bhushan Cc: kvm-ppc@vger.kernel.org, kvm@vger.kernel.org, Bharat Bhushan On 03.08.2012, at 09:08, Bharat Bhushan wrote: > From: Bharat Bhushan > > 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 > --- > 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(-) > > 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 873ec11..dcee499 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -344,6 +344,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; > @@ -438,9 +459,8 @@ struct kvm_vcpu_arch { > > u32 ccr0; > u32 ccr1; > - u32 dbcr0; > - u32 dbcr1; > u32 dbsr; > + struct kvmppc_booke_debug_reg dbg_reg; Please put an #ifdef CONFIG_BOOKE around the above block. > > u64 mmcr[3]; > u32 pmc[8]; > diff --git a/arch/powerpc/kvm/booke.c b/arch/powerpc/kvm/booke.c > index 68ed863..aebbb8b 100644 > --- a/arch/powerpc/kvm/booke.c > +++ b/arch/powerpc/kvm/booke.c > @@ -1379,12 +1379,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 No need for the #ifdef. Also, please do something like 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(..., ...iac[iac], ...); break; } Alex > + 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) > 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; > -- > 1.7.0.4 > >