On Fri, Sep 21, 2018 at 08:01:45PM +1000, Paul Mackerras wrote: > When the 'regs' field was added to struct kvm_vcpu_arch, the code > was changed to use several of the fields inside regs (e.g., gpr, lr, > etc.) but not the ccr field, because the ccr field in struct pt_regs > is 64 bits on 64-bit platforms, but the cr field in kvm_vcpu_arch is > only 32 bits. This changes the code to use the regs.ccr field > instead of cr, and changes the assembly code on 64-bit platforms to > use 64-bit loads and stores instead of 32-bit ones. > > Signed-off-by: Paul Mackerras <paulus@xxxxxxxxxx> Reviewed-by: David Gibson <david@xxxxxxxxxxxxxxxxxxxxx> > --- > arch/powerpc/include/asm/kvm_book3s.h | 4 ++-- > arch/powerpc/include/asm/kvm_book3s_64.h | 4 ++-- > arch/powerpc/include/asm/kvm_booke.h | 4 ++-- > arch/powerpc/include/asm/kvm_host.h | 2 -- > arch/powerpc/kernel/asm-offsets.c | 4 ++-- > arch/powerpc/kvm/book3s_emulate.c | 12 ++++++------ > arch/powerpc/kvm/book3s_hv.c | 4 ++-- > arch/powerpc/kvm/book3s_hv_rmhandlers.S | 4 ++-- > arch/powerpc/kvm/book3s_hv_tm.c | 6 +++--- > arch/powerpc/kvm/book3s_hv_tm_builtin.c | 5 +++-- > arch/powerpc/kvm/book3s_pr.c | 4 ++-- > arch/powerpc/kvm/bookehv_interrupts.S | 8 ++++---- > arch/powerpc/kvm/emulate_loadstore.c | 1 - > 13 files changed, 30 insertions(+), 32 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_book3s.h b/arch/powerpc/include/asm/kvm_book3s.h > index 83a9aa3..dd18d81 100644 > --- a/arch/powerpc/include/asm/kvm_book3s.h > +++ b/arch/powerpc/include/asm/kvm_book3s.h > @@ -301,12 +301,12 @@ static inline ulong kvmppc_get_gpr(struct kvm_vcpu *vcpu, int num) > > static inline void kvmppc_set_cr(struct kvm_vcpu *vcpu, u32 val) > { > - vcpu->arch.cr = val; > + vcpu->arch.regs.ccr = val; > } > > static inline u32 kvmppc_get_cr(struct kvm_vcpu *vcpu) > { > - return vcpu->arch.cr; > + return vcpu->arch.regs.ccr; > } > > static inline void kvmppc_set_xer(struct kvm_vcpu *vcpu, ulong val) > diff --git a/arch/powerpc/include/asm/kvm_book3s_64.h b/arch/powerpc/include/asm/kvm_book3s_64.h > index af25aaa..5c0e2d9 100644 > --- a/arch/powerpc/include/asm/kvm_book3s_64.h > +++ b/arch/powerpc/include/asm/kvm_book3s_64.h > @@ -483,7 +483,7 @@ static inline u64 sanitize_msr(u64 msr) > #ifdef CONFIG_PPC_TRANSACTIONAL_MEM > static inline void copy_from_checkpoint(struct kvm_vcpu *vcpu) > { > - vcpu->arch.cr = vcpu->arch.cr_tm; > + vcpu->arch.regs.ccr = vcpu->arch.cr_tm; > vcpu->arch.regs.xer = vcpu->arch.xer_tm; > vcpu->arch.regs.link = vcpu->arch.lr_tm; > vcpu->arch.regs.ctr = vcpu->arch.ctr_tm; > @@ -500,7 +500,7 @@ static inline void copy_from_checkpoint(struct kvm_vcpu *vcpu) > > static inline void copy_to_checkpoint(struct kvm_vcpu *vcpu) > { > - vcpu->arch.cr_tm = vcpu->arch.cr; > + vcpu->arch.cr_tm = vcpu->arch.regs.ccr; > vcpu->arch.xer_tm = vcpu->arch.regs.xer; > vcpu->arch.lr_tm = vcpu->arch.regs.link; > vcpu->arch.ctr_tm = vcpu->arch.regs.ctr; > diff --git a/arch/powerpc/include/asm/kvm_booke.h b/arch/powerpc/include/asm/kvm_booke.h > index d513e3e..f0cef62 100644 > --- a/arch/powerpc/include/asm/kvm_booke.h > +++ b/arch/powerpc/include/asm/kvm_booke.h > @@ -46,12 +46,12 @@ static inline ulong kvmppc_get_gpr(struct kvm_vcpu *vcpu, int num) > > static inline void kvmppc_set_cr(struct kvm_vcpu *vcpu, u32 val) > { > - vcpu->arch.cr = val; > + vcpu->arch.regs.ccr = val; > } > > static inline u32 kvmppc_get_cr(struct kvm_vcpu *vcpu) > { > - return vcpu->arch.cr; > + return vcpu->arch.regs.ccr; > } > > static inline void kvmppc_set_xer(struct kvm_vcpu *vcpu, ulong val) > diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h > index a3d4f61..c9cc42f 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -538,8 +538,6 @@ struct kvm_vcpu_arch { > ulong tar; > #endif > > - u32 cr; > - > #ifdef CONFIG_PPC_BOOK3S > ulong hflags; > ulong guest_owned_ext; > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 89cf155..7c3738d 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -438,7 +438,7 @@ int main(void) > #ifdef CONFIG_PPC_BOOK3S > OFFSET(VCPU_TAR, kvm_vcpu, arch.tar); > #endif > - OFFSET(VCPU_CR, kvm_vcpu, arch.cr); > + OFFSET(VCPU_CR, kvm_vcpu, arch.regs.ccr); > OFFSET(VCPU_PC, kvm_vcpu, arch.regs.nip); > #ifdef CONFIG_KVM_BOOK3S_HV_POSSIBLE > OFFSET(VCPU_MSR, kvm_vcpu, arch.shregs.msr); > @@ -695,7 +695,7 @@ int main(void) > #endif /* CONFIG_PPC_BOOK3S_64 */ > > #else /* CONFIG_PPC_BOOK3S */ > - OFFSET(VCPU_CR, kvm_vcpu, arch.cr); > + OFFSET(VCPU_CR, kvm_vcpu, arch.regs.ccr); > OFFSET(VCPU_XER, kvm_vcpu, arch.regs.xer); > OFFSET(VCPU_LR, kvm_vcpu, arch.regs.link); > OFFSET(VCPU_CTR, kvm_vcpu, arch.regs.ctr); > diff --git a/arch/powerpc/kvm/book3s_emulate.c b/arch/powerpc/kvm/book3s_emulate.c > index 36b11c5..2654df2 100644 > --- a/arch/powerpc/kvm/book3s_emulate.c > +++ b/arch/powerpc/kvm/book3s_emulate.c > @@ -110,7 +110,7 @@ static inline void kvmppc_copyto_vcpu_tm(struct kvm_vcpu *vcpu) > vcpu->arch.ctr_tm = vcpu->arch.regs.ctr; > vcpu->arch.tar_tm = vcpu->arch.tar; > vcpu->arch.lr_tm = vcpu->arch.regs.link; > - vcpu->arch.cr_tm = vcpu->arch.cr; > + vcpu->arch.cr_tm = vcpu->arch.regs.ccr; > vcpu->arch.xer_tm = vcpu->arch.regs.xer; > vcpu->arch.vrsave_tm = vcpu->arch.vrsave; > } > @@ -129,7 +129,7 @@ static inline void kvmppc_copyfrom_vcpu_tm(struct kvm_vcpu *vcpu) > vcpu->arch.regs.ctr = vcpu->arch.ctr_tm; > vcpu->arch.tar = vcpu->arch.tar_tm; > vcpu->arch.regs.link = vcpu->arch.lr_tm; > - vcpu->arch.cr = vcpu->arch.cr_tm; > + vcpu->arch.regs.ccr = vcpu->arch.cr_tm; > vcpu->arch.regs.xer = vcpu->arch.xer_tm; > vcpu->arch.vrsave = vcpu->arch.vrsave_tm; > } > @@ -141,7 +141,7 @@ static void kvmppc_emulate_treclaim(struct kvm_vcpu *vcpu, int ra_val) > uint64_t texasr; > > /* CR0 = 0 | MSR[TS] | 0 */ > - vcpu->arch.cr = (vcpu->arch.cr & ~(CR0_MASK << CR0_SHIFT)) | > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) | > (((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1)) > << CR0_SHIFT); > > @@ -220,7 +220,7 @@ void kvmppc_emulate_tabort(struct kvm_vcpu *vcpu, int ra_val) > tm_abort(ra_val); > > /* CR0 = 0 | MSR[TS] | 0 */ > - vcpu->arch.cr = (vcpu->arch.cr & ~(CR0_MASK << CR0_SHIFT)) | > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT)) | > (((guest_msr & MSR_TS_MASK) >> (MSR_TS_S_LG - 1)) > << CR0_SHIFT); > > @@ -494,8 +494,8 @@ int kvmppc_core_emulate_op_pr(struct kvm_run *run, struct kvm_vcpu *vcpu, > > if (!(kvmppc_get_msr(vcpu) & MSR_PR)) { > preempt_disable(); > - vcpu->arch.cr = (CR0_TBEGIN_FAILURE | > - (vcpu->arch.cr & ~(CR0_MASK << CR0_SHIFT))); > + vcpu->arch.regs.ccr = (CR0_TBEGIN_FAILURE | > + (vcpu->arch.regs.ccr & ~(CR0_MASK << CR0_SHIFT))); > > vcpu->arch.texasr = (TEXASR_FS | TEXASR_EXACT | > (((u64)(TM_CAUSE_EMULATE | TM_CAUSE_PERSISTENT)) > diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c > index e699787..be8c863 100644 > --- a/arch/powerpc/kvm/book3s_hv.c > +++ b/arch/powerpc/kvm/book3s_hv.c > @@ -410,8 +410,8 @@ static void kvmppc_dump_regs(struct kvm_vcpu *vcpu) > vcpu->arch.shregs.sprg0, vcpu->arch.shregs.sprg1); > pr_err("sprg2 = %.16llx sprg3 = %.16llx\n", > vcpu->arch.shregs.sprg2, vcpu->arch.shregs.sprg3); > - pr_err("cr = %.8x xer = %.16lx dsisr = %.8x\n", > - vcpu->arch.cr, vcpu->arch.regs.xer, vcpu->arch.shregs.dsisr); > + pr_err("cr = %.8lx xer = %.16lx dsisr = %.8x\n", > + vcpu->arch.regs.ccr, vcpu->arch.regs.xer, vcpu->arch.shregs.dsisr); > pr_err("dar = %.16llx\n", vcpu->arch.shregs.dar); > pr_err("fault dar = %.16lx dsisr = %.8x\n", > vcpu->arch.fault_dar, vcpu->arch.fault_dsisr); > diff --git a/arch/powerpc/kvm/book3s_hv_rmhandlers.S b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > index 2abc336..83efc13 100644 > --- a/arch/powerpc/kvm/book3s_hv_rmhandlers.S > +++ b/arch/powerpc/kvm/book3s_hv_rmhandlers.S > @@ -1092,7 +1092,7 @@ BEGIN_FTR_SECTION > END_FTR_SECTION_IFSET(CPU_FTR_HAS_PPR) > > ld r5, VCPU_LR(r4) > - lwz r6, VCPU_CR(r4) > + ld r6, VCPU_CR(r4) > mtlr r5 > mtcr r6 > > @@ -1280,7 +1280,7 @@ kvmppc_interrupt_hv: > std r3, VCPU_GPR(R12)(r9) > /* CR is in the high half of r12 */ > srdi r4, r12, 32 > - stw r4, VCPU_CR(r9) > + std r4, VCPU_CR(r9) > BEGIN_FTR_SECTION > ld r3, HSTATE_CFAR(r13) > std r3, VCPU_CFAR(r9) > diff --git a/arch/powerpc/kvm/book3s_hv_tm.c b/arch/powerpc/kvm/book3s_hv_tm.c > index 0082850..888e260 100644 > --- a/arch/powerpc/kvm/book3s_hv_tm.c > +++ b/arch/powerpc/kvm/book3s_hv_tm.c > @@ -130,7 +130,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) > return RESUME_GUEST; > } > /* Set CR0 to indicate previous transactional state */ > - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | > (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); > /* L=1 => tresume, L=0 => tsuspend */ > if (instr & (1 << 21)) { > @@ -174,7 +174,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) > copy_from_checkpoint(vcpu); > > /* Set CR0 to indicate previous transactional state */ > - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | > (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); > vcpu->arch.shregs.msr &= ~MSR_TS_MASK; > return RESUME_GUEST; > @@ -204,7 +204,7 @@ int kvmhv_p9_tm_emulation(struct kvm_vcpu *vcpu) > copy_to_checkpoint(vcpu); > > /* Set CR0 to indicate previous transactional state */ > - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | > (((msr & MSR_TS_MASK) >> MSR_TS_S_LG) << 28); > vcpu->arch.shregs.msr = msr | MSR_TS_S; > return RESUME_GUEST; > diff --git a/arch/powerpc/kvm/book3s_hv_tm_builtin.c b/arch/powerpc/kvm/book3s_hv_tm_builtin.c > index b2c7c6f..3cf5863 100644 > --- a/arch/powerpc/kvm/book3s_hv_tm_builtin.c > +++ b/arch/powerpc/kvm/book3s_hv_tm_builtin.c > @@ -89,7 +89,8 @@ int kvmhv_p9_tm_emulation_early(struct kvm_vcpu *vcpu) > if (instr & (1 << 21)) > vcpu->arch.shregs.msr = (msr & ~MSR_TS_MASK) | MSR_TS_T; > /* Set CR0 to 0b0010 */ > - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | 0x20000000; > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | > + 0x20000000; > return 1; > } > > @@ -105,5 +106,5 @@ void kvmhv_emulate_tm_rollback(struct kvm_vcpu *vcpu) > vcpu->arch.shregs.msr &= ~MSR_TS_MASK; /* go to N state */ > vcpu->arch.regs.nip = vcpu->arch.tfhar; > copy_from_checkpoint(vcpu); > - vcpu->arch.cr = (vcpu->arch.cr & 0x0fffffff) | 0xa0000000; > + vcpu->arch.regs.ccr = (vcpu->arch.regs.ccr & 0x0fffffff) | 0xa0000000; > } > diff --git a/arch/powerpc/kvm/book3s_pr.c b/arch/powerpc/kvm/book3s_pr.c > index 059683e4..4efd65d 100644 > --- a/arch/powerpc/kvm/book3s_pr.c > +++ b/arch/powerpc/kvm/book3s_pr.c > @@ -167,7 +167,7 @@ void kvmppc_copy_to_svcpu(struct kvm_vcpu *vcpu) > svcpu->gpr[11] = vcpu->arch.regs.gpr[11]; > svcpu->gpr[12] = vcpu->arch.regs.gpr[12]; > svcpu->gpr[13] = vcpu->arch.regs.gpr[13]; > - svcpu->cr = vcpu->arch.cr; > + svcpu->cr = vcpu->arch.regs.ccr; > svcpu->xer = vcpu->arch.regs.xer; > svcpu->ctr = vcpu->arch.regs.ctr; > svcpu->lr = vcpu->arch.regs.link; > @@ -249,7 +249,7 @@ void kvmppc_copy_from_svcpu(struct kvm_vcpu *vcpu) > vcpu->arch.regs.gpr[11] = svcpu->gpr[11]; > vcpu->arch.regs.gpr[12] = svcpu->gpr[12]; > vcpu->arch.regs.gpr[13] = svcpu->gpr[13]; > - vcpu->arch.cr = svcpu->cr; > + vcpu->arch.regs.ccr = svcpu->cr; > vcpu->arch.regs.xer = svcpu->xer; > vcpu->arch.regs.ctr = svcpu->ctr; > vcpu->arch.regs.link = svcpu->lr; > diff --git a/arch/powerpc/kvm/bookehv_interrupts.S b/arch/powerpc/kvm/bookehv_interrupts.S > index 81bd8a07..051af7d 100644 > --- a/arch/powerpc/kvm/bookehv_interrupts.S > +++ b/arch/powerpc/kvm/bookehv_interrupts.S > @@ -182,7 +182,7 @@ > */ > PPC_LL r4, PACACURRENT(r13) > PPC_LL r4, (THREAD + THREAD_KVM_VCPU)(r4) > - stw r10, VCPU_CR(r4) > + PPC_STL r10, VCPU_CR(r4) > PPC_STL r11, VCPU_GPR(R4)(r4) > PPC_STL r5, VCPU_GPR(R5)(r4) > PPC_STL r6, VCPU_GPR(R6)(r4) > @@ -292,7 +292,7 @@ _GLOBAL(kvmppc_handler_\intno\()_\srr1) > PPC_STL r4, VCPU_GPR(R4)(r11) > PPC_LL r4, THREAD_NORMSAVE(0)(r10) > PPC_STL r5, VCPU_GPR(R5)(r11) > - stw r13, VCPU_CR(r11) > + PPC_STL r13, VCPU_CR(r11) > mfspr r5, \srr0 > PPC_STL r3, VCPU_GPR(R10)(r11) > PPC_LL r3, THREAD_NORMSAVE(2)(r10) > @@ -319,7 +319,7 @@ _GLOBAL(kvmppc_handler_\intno\()_\srr1) > PPC_STL r4, VCPU_GPR(R4)(r11) > PPC_LL r4, GPR9(r8) > PPC_STL r5, VCPU_GPR(R5)(r11) > - stw r9, VCPU_CR(r11) > + PPC_STL r9, VCPU_CR(r11) > mfspr r5, \srr0 > PPC_STL r3, VCPU_GPR(R8)(r11) > PPC_LL r3, GPR10(r8) > @@ -643,7 +643,7 @@ lightweight_exit: > PPC_LL r3, VCPU_LR(r4) > PPC_LL r5, VCPU_XER(r4) > PPC_LL r6, VCPU_CTR(r4) > - lwz r7, VCPU_CR(r4) > + PPC_LL r7, VCPU_CR(r4) > PPC_LL r8, VCPU_PC(r4) > PPC_LD(r9, VCPU_SHARED_MSR, r11) > PPC_LL r0, VCPU_GPR(R0)(r4) > diff --git a/arch/powerpc/kvm/emulate_loadstore.c b/arch/powerpc/kvm/emulate_loadstore.c > index 75dce1e..f91b130 100644 > --- a/arch/powerpc/kvm/emulate_loadstore.c > +++ b/arch/powerpc/kvm/emulate_loadstore.c > @@ -117,7 +117,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu) > > emulated = EMULATE_FAIL; > vcpu->arch.regs.msr = vcpu->arch.shared->msr; > - vcpu->arch.regs.ccr = vcpu->arch.cr; > if (analyse_instr(&op, &vcpu->arch.regs, inst) == 0) { > int type = op.type & INSTR_TYPE_MASK; > int size = GETSIZE(op.type); -- David Gibson | I'll have my music baroque, and my code david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_ | _way_ _around_! http://www.ozlabs.org/~dgibson
Attachment:
signature.asc
Description: PGP signature