aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/include
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2011-11-08 19:23:30 -0500
committerAvi Kivity <avi@redhat.com>2012-03-05 07:52:26 -0500
commitb59049720dd95021dfe0d9f4e1fa9458a67cfe29 (patch)
tree3b54577e12ba4a84bec409518c6c8f399ebba6e0 /arch/powerpc/include
parent940b45ec18cf00046b8b28299d97066a2c43d559 (diff)
KVM: PPC: Paravirtualize SPRG4-7, ESR, PIR, MASn
This allows additional registers to be accessed by the guest in PR-mode KVM without trapping. SPRG4-7 are readable from userspace. On booke, KVM will sync these registers when it enters the guest, so that accesses from guest userspace will work. The guest kernel, OTOH, must consistently use either the real registers or the shared area between exits. This also applies to the already-paravirted SPRG3. On non-booke, it's not clear to what extent SPRG4-7 are supported (they're not architected for book3s, but exist on at least some classic chips). They are copied in the get/set regs ioctls, but I do not see any non-booke emulation. I also do not see any syncing with real registers (in PR-mode) including the user-readable SPRG3. This patch should not make that situation any worse. Signed-off-by: Scott Wood <scottwood@freescale.com> Signed-off-by: Alexander Graf <agraf@suse.de> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'arch/powerpc/include')
-rw-r--r--arch/powerpc/include/asm/kvm_e500.h8
-rw-r--r--arch/powerpc/include/asm/kvm_host.h6
-rw-r--r--arch/powerpc/include/asm/kvm_para.h31
3 files changed, 29 insertions, 16 deletions
diff --git a/arch/powerpc/include/asm/kvm_e500.h b/arch/powerpc/include/asm/kvm_e500.h
index bc17441535f2..8cd50a514271 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 {
71 u32 pid[E500_PID_NUM]; 71 u32 pid[E500_PID_NUM];
72 u32 svr; 72 u32 svr;
73 73
74 u32 mas0;
75 u32 mas1;
76 u32 mas2;
77 u64 mas7_3;
78 u32 mas4;
79 u32 mas5;
80 u32 mas6;
81
82 /* vcpu id table */ 74 /* vcpu id table */
83 struct vcpu_id_table *idt; 75 struct vcpu_id_table *idt;
84 76
diff --git a/arch/powerpc/include/asm/kvm_host.h b/arch/powerpc/include/asm/kvm_host.h
index bf8af5d5d5dc..bfd0c9912da5 100644
--- a/arch/powerpc/include/asm/kvm_host.h
+++ b/arch/powerpc/include/asm/kvm_host.h
@@ -318,10 +318,6 @@ struct kvm_vcpu_arch {
318 u32 vrsave; /* also USPRG0 */ 318 u32 vrsave; /* also USPRG0 */
319 u32 mmucr; 319 u32 mmucr;
320 ulong shadow_msr; 320 ulong shadow_msr;
321 ulong sprg4;
322 ulong sprg5;
323 ulong sprg6;
324 ulong sprg7;
325 ulong csrr0; 321 ulong csrr0;
326 ulong csrr1; 322 ulong csrr1;
327 ulong dsrr0; 323 ulong dsrr0;
@@ -329,7 +325,6 @@ struct kvm_vcpu_arch {
329 ulong mcsrr0; 325 ulong mcsrr0;
330 ulong mcsrr1; 326 ulong mcsrr1;
331 ulong mcsr; 327 ulong mcsr;
332 ulong esr;
333 u32 dec; 328 u32 dec;
334 u32 decar; 329 u32 decar;
335 u32 tbl; 330 u32 tbl;
@@ -338,7 +333,6 @@ struct kvm_vcpu_arch {
338 u32 tsr; 333 u32 tsr;
339 u32 ivor[64]; 334 u32 ivor[64];
340 ulong ivpr; 335 ulong ivpr;
341 u32 pir;
342 u32 pvr; 336 u32 pvr;
343 337
344 u32 shadow_pid; 338 u32 shadow_pid;
diff --git a/arch/powerpc/include/asm/kvm_para.h b/arch/powerpc/include/asm/kvm_para.h
index 50533f9adf40..ece70fb36513 100644
--- a/arch/powerpc/include/asm/kvm_para.h
+++ b/arch/powerpc/include/asm/kvm_para.h
@@ -33,11 +33,35 @@ struct kvm_vcpu_arch_shared {
33 __u64 sprg3; 33 __u64 sprg3;
34 __u64 srr0; 34 __u64 srr0;
35 __u64 srr1; 35 __u64 srr1;
36 __u64 dar; 36 __u64 dar; /* dear on BookE */
37 __u64 msr; 37 __u64 msr;
38 __u32 dsisr; 38 __u32 dsisr;
39 __u32 int_pending; /* Tells the guest if we have an interrupt */ 39 __u32 int_pending; /* Tells the guest if we have an interrupt */
40 __u32 sr[16]; 40 __u32 sr[16];
41 __u32 mas0;
42 __u32 mas1;
43 __u64 mas7_3;
44 __u64 mas2;
45 __u32 mas4;
46 __u32 mas6;
47 __u32 esr;
48 __u32 pir;
49
50 /*
51 * SPRG4-7 are user-readable, so we can only keep these consistent
52 * between the shared area and the real registers when there's an
53 * intervening exit to KVM. This also applies to SPRG3 on some
54 * chips.
55 *
56 * This suffices for access by guest userspace, since in PR-mode
57 * KVM, an exit must occur when changing the guest's MSR[PR].
58 * If the guest kernel writes to SPRG3-7 via the shared area, it
59 * must also use the shared area for reading while in kernel space.
60 */
61 __u64 sprg4;
62 __u64 sprg5;
63 __u64 sprg6;
64 __u64 sprg7;
41}; 65};
42 66
43#define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */ 67#define KVM_SC_MAGIC_R0 0x4b564d21 /* "KVM!" */
@@ -47,7 +71,10 @@ struct kvm_vcpu_arch_shared {
47 71
48#define KVM_FEATURE_MAGIC_PAGE 1 72#define KVM_FEATURE_MAGIC_PAGE 1
49 73
50#define KVM_MAGIC_FEAT_SR (1 << 0) 74#define KVM_MAGIC_FEAT_SR (1 << 0)
75
76/* MASn, ESR, PIR, and high SPRGs */
77#define KVM_MAGIC_FEAT_MAS0_TO_SPRG7 (1 << 1)
51 78
52#ifdef __KERNEL__ 79#ifdef __KERNEL__
53 80