On 27.08.2011, at 01:31, Scott Wood wrote: > Signed-off-by: Scott Wood <scottwood@xxxxxxxxxxxxx> Patch description missing. > --- > arch/powerpc/include/asm/kvm_e500.h | 8 -- > arch/powerpc/include/asm/kvm_host.h | 2 - > arch/powerpc/include/asm/kvm_para.h | 28 +++++- > arch/powerpc/kernel/asm-offsets.c | 9 ++ > arch/powerpc/kernel/kvm.c | 201 +++++++++++++++++++++++++++++------ > arch/powerpc/kvm/booke.c | 7 +- > arch/powerpc/kvm/booke_emulate.c | 4 +- > arch/powerpc/kvm/e500.c | 24 ++-- > arch/powerpc/kvm/e500_emulate.c | 38 ++++--- > arch/powerpc/kvm/e500_tlb.c | 83 ++++++++------- > arch/powerpc/kvm/e500_tlb.h | 25 ++--- > arch/powerpc/kvm/emulate.c | 3 +- > arch/powerpc/kvm/powerpc.c | 2 +- > 13 files changed, 299 insertions(+), 135 deletions(-) > > diff --git a/arch/powerpc/include/asm/kvm_e500.h b/arch/powerpc/include/asm/kvm_e500.h > index bc17441..8cd50a5 100644 > --- a/arch/powerpc/include/asm/kvm_e500.h > +++ b/arch/powerpc/include/asm/kvm_e500.h > @@ -71,14 +71,6 @@ struct kvmppc_vcpu_e500 { > u32 pid[E500_PID_NUM]; > u32 svr; > > - u32 mas0; > - u32 mas1; > - u32 mas2; > - u64 mas7_3; > - u32 mas4; > - u32 mas5; > - u32 mas6; > - > /* vcpu id table */ > struct vcpu_id_table *idt; > > diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h > index cc22b28..3305af4 100644 > --- a/arch/powerpc/include/asm/kvm_host.h > +++ b/arch/powerpc/include/asm/kvm_host.h > @@ -329,7 +329,6 @@ struct kvm_vcpu_arch { > ulong mcsrr0; > ulong mcsrr1; > ulong mcsr; > - ulong esr; > u32 dec; > u32 decar; > u32 tbl; > @@ -338,7 +337,6 @@ struct kvm_vcpu_arch { > u32 tsr; > u32 ivor[64]; > ulong ivpr; > - u32 pir; > u32 pvr; > > u32 shadow_pid; > diff --git a/arch/powerpc/include/asm/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h > index 50533f9..e04b4a5 100644 > --- a/arch/powerpc/include/asm/kvm_para.h > +++ b/arch/powerpc/include/asm/kvm_para.h > @@ -33,11 +33,32 @@ struct kvm_vcpu_arch_shared { > __u64 sprg3; > __u64 srr0; > __u64 srr1; > - __u64 dar; > + __u64 dar; /* dear on BookE */ > __u64 msr; > __u32 dsisr; > __u32 int_pending; /* Tells the guest if we have an interrupt */ > __u32 sr[16]; > + __u32 mas0; > + __u32 mas1; > + __u64 mas7_3; > + __u64 mas2; > + __u32 mas4; > + __u32 mas6; > + __u32 esr; > + __u32 pir; > + > + /* > + * SPRG4-7 are user-readable, so we can't keep these > + * consistent between the magic page and the real > + * registers. We provide space in case the guest > + * can deal with this. > + * > + * This also applies to SPRG3 on some chips. > + */ > + __u64 sprg4; > + __u64 sprg5; > + __u64 sprg6; > + __u64 sprg7; Hrm. You're touching sprg4-7 but don't remove the fields from vcpu->arch. That sounds wrong. Also, the entry/exit code needs to use these now instead of the vcpu struct fields to restore the correct values. > }; > > #define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */ > @@ -47,7 +68,10 @@ struct kvm_vcpu_arch_shared { > > #define KVM_FEATURE_MAGIC_PAGE 1 > > -#define KVM_MAGIC_FEAT_SR (1 << 0) > +#define KVM_MAGIC_FEAT_SR (1 << 0) > + > +/* MASn, ESR, PIR, and high SPRGs */ > +#define KVM_MAGIC_FEAT_MAS0_TO_SPRG7 (1 << 1) > > #ifdef __KERNEL__ > > diff --git a/arch/powerpc/kernel/asm-offsets.c b/arch/powerpc/kernel/asm-offsets.c > index 5f078bc..34da20d 100644 > --- a/arch/powerpc/kernel/asm-offsets.c > +++ b/arch/powerpc/kernel/asm-offsets.c > @@ -431,6 +431,15 @@ int main(void) > DEFINE(VCPU_SHARED_MSR, offsetof(struct kvm_vcpu_arch_shared, msr)); > DEFINE(VCPU_SHADOW_MSR, offsetof(struct kvm_vcpu, arch.shadow_msr)); > > +#ifdef CONFIG_FSL_BOOKE > + DEFINE(VCPU_SHARED_MAS0, offsetof(struct kvm_vcpu_arch_shared, mas0)); > + DEFINE(VCPU_SHARED_MAS1, offsetof(struct kvm_vcpu_arch_shared, mas1)); > + DEFINE(VCPU_SHARED_MAS2, offsetof(struct kvm_vcpu_arch_shared, mas2)); > + DEFINE(VCPU_SHARED_MAS7_3, offsetof(struct kvm_vcpu_arch_shared, mas7_3)); > + DEFINE(VCPU_SHARED_MAS4, offsetof(struct kvm_vcpu_arch_shared, mas4)); > + DEFINE(VCPU_SHARED_MAS6, offsetof(struct kvm_vcpu_arch_shared, mas6)); > +#endif While I agree that they only make sense on BookE, the fields in the ABI are not #ifdef'ed, so I don't see why the asm-offsets fields should be. > + > /* book3s */ > #ifdef CONFIG_KVM_BOOK3S_64_HV > DEFINE(KVM_LPID, offsetof(struct kvm, arch.lpid)); > diff --git a/arch/powerpc/kernel/kvm.c b/arch/powerpc/kernel/kvm.c > index e50c683..eb95a03 100644 > --- a/arch/powerpc/kernel/kvm.c > +++ b/arch/powerpc/kernel/kvm.c > @@ -48,23 +48,14 @@ > #define KVM_RT_30 0x03c00000 > #define KVM_MASK_RB 0x0000f800 > #define KVM_INST_MFMSR 0x7c0000a6 > -#define KVM_INST_MFSPR_SPRG0 0x7c1042a6 > -#define KVM_INST_MFSPR_SPRG1 0x7c1142a6 > -#define KVM_INST_MFSPR_SPRG2 0x7c1242a6 > -#define KVM_INST_MFSPR_SPRG3 0x7c1342a6 > -#define KVM_INST_MFSPR_SRR0 0x7c1a02a6 > -#define KVM_INST_MFSPR_SRR1 0x7c1b02a6 > -#define KVM_INST_MFSPR_DAR 0x7c1302a6 > -#define KVM_INST_MFSPR_DSISR 0x7c1202a6 > - > -#define KVM_INST_MTSPR_SPRG0 0x7c1043a6 > -#define KVM_INST_MTSPR_SPRG1 0x7c1143a6 > -#define KVM_INST_MTSPR_SPRG2 0x7c1243a6 > -#define KVM_INST_MTSPR_SPRG3 0x7c1343a6 > -#define KVM_INST_MTSPR_SRR0 0x7c1a03a6 > -#define KVM_INST_MTSPR_SRR1 0x7c1b03a6 > -#define KVM_INST_MTSPR_DAR 0x7c1303a6 > -#define KVM_INST_MTSPR_DSISR 0x7c1203a6 > + > +#define SPR_FROM 0 > +#define SPR_TO 0x100 > + > +#define KVM_INST_SPR(sprn, moveto) (0x7c0002a6 | \ > + (((sprn) & 0x1f) << 16) | \ > + (((sprn) & 0x3e0) << 6) | \ > + (moveto)) #define KVM_INST_MFSPR(sprn) KVM_INST_MFSPR(sprn, SPR_FROM) #define KVM_INST_MTSPR(sprn) KVM_INST_MFSPR(sprn, SPR_TO) makes it more readable really :) > > [...] > @@ -618,6 +618,7 @@ int kvm_arch_vcpu_setup(struct kvm_vcpu *vcpu) > vcpu->arch.pc = 0; > vcpu->arch.shared->msr = 0; > vcpu->arch.shadow_msr = MSR_USER | MSR_DE | MSR_IS | MSR_DS; > + vcpu->arch.shared->pir = vcpu->vcpu_id; That one rings a bell. Are you sure this patch set is on top of the other one that fixes PIR? Alex -- To unsubscribe from this list: send the line "unsubscribe kvm-ppc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html