KVM: PPC: Book3S PR: Handle Facility interrupt and FSCR
authorAlexander Graf <agraf@suse.de>
Tue, 29 Apr 2014 14:48:44 +0000 (16:48 +0200)
committerAlexander Graf <agraf@suse.de>
Fri, 30 May 2014 12:26:22 +0000 (14:26 +0200)
POWER8 introduced a new interrupt type called "Facility unavailable interrupt"
which contains its status message in a new register called FSCR.

Handle these exits and try to emulate instructions for unhandled facilities.
Follow-on patches enable KVM to expose specific facilities into the guest.

Signed-off-by: Alexander Graf <agraf@suse.de>
arch/powerpc/include/asm/kvm_asm.h
arch/powerpc/include/asm/kvm_book3s_asm.h
arch/powerpc/include/asm/kvm_host.h
arch/powerpc/kernel/asm-offsets.c
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/book3s_emulate.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_pr.c
arch/powerpc/kvm/book3s_segment.S

index 19eb74a..9601741 100644 (file)
 #define BOOK3S_INTERRUPT_PERFMON       0xf00
 #define BOOK3S_INTERRUPT_ALTIVEC       0xf20
 #define BOOK3S_INTERRUPT_VSX           0xf40
+#define BOOK3S_INTERRUPT_FAC_UNAVAIL   0xf60
 #define BOOK3S_INTERRUPT_H_FAC_UNAVAIL 0xf80
 
 #define BOOK3S_IRQPRIO_SYSTEM_RESET            0
 #define BOOK3S_IRQPRIO_FP_UNAVAIL              7
 #define BOOK3S_IRQPRIO_ALTIVEC                 8
 #define BOOK3S_IRQPRIO_VSX                     9
-#define BOOK3S_IRQPRIO_SYSCALL                 10
-#define BOOK3S_IRQPRIO_MACHINE_CHECK           11
-#define BOOK3S_IRQPRIO_DEBUG                   12
-#define BOOK3S_IRQPRIO_EXTERNAL                        13
-#define BOOK3S_IRQPRIO_DECREMENTER             14
-#define BOOK3S_IRQPRIO_PERFORMANCE_MONITOR     15
-#define BOOK3S_IRQPRIO_EXTERNAL_LEVEL          16
-#define BOOK3S_IRQPRIO_MAX                     17
+#define BOOK3S_IRQPRIO_FAC_UNAVAIL             10
+#define BOOK3S_IRQPRIO_SYSCALL                 11
+#define BOOK3S_IRQPRIO_MACHINE_CHECK           12
+#define BOOK3S_IRQPRIO_DEBUG                   13
+#define BOOK3S_IRQPRIO_EXTERNAL                        14
+#define BOOK3S_IRQPRIO_DECREMENTER             15
+#define BOOK3S_IRQPRIO_PERFORMANCE_MONITOR     16
+#define BOOK3S_IRQPRIO_EXTERNAL_LEVEL          17
+#define BOOK3S_IRQPRIO_MAX                     18
 
 #define BOOK3S_HFLAG_DCBZ32                    0x1
 #define BOOK3S_HFLAG_SLB                       0x2
index 821725c..5bdfb5d 100644 (file)
@@ -104,6 +104,7 @@ struct kvmppc_host_state {
 #ifdef CONFIG_PPC_BOOK3S_64
        u64 cfar;
        u64 ppr;
+       u64 host_fscr;
 #endif
 };
 
@@ -133,6 +134,7 @@ struct kvmppc_book3s_shadow_vcpu {
                u64     esid;
                u64     vsid;
        } slb[64];                      /* guest SLB */
+       u64 shadow_fscr;
 #endif
 };
 
index 15f19d3..232ec5f 100644 (file)
@@ -475,6 +475,7 @@ struct kvm_vcpu_arch {
        ulong ppr;
        ulong pspb;
        ulong fscr;
+       ulong shadow_fscr;
        ulong ebbhr;
        ulong ebbrr;
        ulong bescr;
index bbf3b9a..e2b86b5 100644 (file)
@@ -537,6 +537,7 @@ int main(void)
        DEFINE(VCPU_CFAR, offsetof(struct kvm_vcpu, arch.cfar));
        DEFINE(VCPU_PPR, offsetof(struct kvm_vcpu, arch.ppr));
        DEFINE(VCPU_FSCR, offsetof(struct kvm_vcpu, arch.fscr));
+       DEFINE(VCPU_SHADOW_FSCR, offsetof(struct kvm_vcpu, arch.shadow_fscr));
        DEFINE(VCPU_PSPB, offsetof(struct kvm_vcpu, arch.pspb));
        DEFINE(VCPU_EBBHR, offsetof(struct kvm_vcpu, arch.ebbhr));
        DEFINE(VCPU_EBBRR, offsetof(struct kvm_vcpu, arch.ebbrr));
@@ -618,6 +619,7 @@ int main(void)
 #ifdef CONFIG_PPC64
        SVCPU_FIELD(SVCPU_SLB, slb);
        SVCPU_FIELD(SVCPU_SLB_MAX, slb_max);
+       SVCPU_FIELD(SVCPU_SHADOW_FSCR, shadow_fscr);
 #endif
 
        HSTATE_FIELD(HSTATE_HOST_R1, host_r1);
@@ -653,6 +655,7 @@ int main(void)
 #ifdef CONFIG_PPC_BOOK3S_64
        HSTATE_FIELD(HSTATE_CFAR, cfar);
        HSTATE_FIELD(HSTATE_PPR, ppr);
+       HSTATE_FIELD(HSTATE_HOST_FSCR, host_fscr);
 #endif /* CONFIG_PPC_BOOK3S_64 */
 
 #else /* CONFIG_PPC_BOOK3S */
Simple merge
Simple merge
Simple merge
Simple merge
Simple merge