On 27.08.2011, at 01:31, Scott Wood wrote:
> Signed-off-by: Scott Wood <[email protected]>
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 [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html