aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-01-20 01:50:21 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2011-04-19 21:03:22 -0400
commit2dd60d79e0202628a47af9812a84d502cc63628c (patch)
tree03a114dcb4a8c3b75ec689d372abd331aff5a555
parent24cc67de62eebbda3ce0c46bdd56582c00dccd03 (diff)
powerpc: In HV mode, use HSPRG0 for PACA
When running in Hypervisor mode (arch 2.06 or later), we store the PACA in HSPRG0 instead of SPRG1. The architecture specifies that SPRGs may be lost during a "nap" power management operation (though they aren't currently on POWER7) and this enables use of SPRG1 by KVM guests. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/include/asm/exception-64s.h6
-rw-r--r--arch/powerpc/include/asm/reg.h27
-rw-r--r--arch/powerpc/kernel/entry_64.S4
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S8
-rw-r--r--arch/powerpc/kernel/head_64.S4
-rw-r--r--arch/powerpc/kernel/paca.c13
-rw-r--r--arch/powerpc/kvm/book3s_rmhandlers.S4
7 files changed, 50 insertions, 16 deletions
diff --git a/arch/powerpc/include/asm/exception-64s.h b/arch/powerpc/include/asm/exception-64s.h
index 7778d6f0c878..337b6fa2f8cd 100644
--- a/arch/powerpc/include/asm/exception-64s.h
+++ b/arch/powerpc/include/asm/exception-64s.h
@@ -56,8 +56,8 @@
56#define LOAD_HANDLER(reg, label) \ 56#define LOAD_HANDLER(reg, label) \
57 addi reg,reg,(label)-_stext; /* virt addr of handler ... */ 57 addi reg,reg,(label)-_stext; /* virt addr of handler ... */
58 58
59#define EXCEPTION_PROLOG_1(area) \ 59#define EXCEPTION_PROLOG_1(area) \
60 mfspr r13,SPRN_SPRG_PACA; /* get paca address into r13 */ \ 60 GET_PACA(r13); \
61 std r9,area+EX_R9(r13); /* save r9 - r12 */ \ 61 std r9,area+EX_R9(r13); /* save r9 - r12 */ \
62 std r10,area+EX_R10(r13); \ 62 std r10,area+EX_R10(r13); \
63 std r11,area+EX_R11(r13); \ 63 std r11,area+EX_R11(r13); \
@@ -174,7 +174,7 @@ label##_pSeries: \
174 HMT_MEDIUM; \ 174 HMT_MEDIUM; \
175 DO_KVM n; \ 175 DO_KVM n; \
176 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \ 176 mtspr SPRN_SPRG_SCRATCH0,r13; /* save r13 */ \
177 mfspr r13,SPRN_SPRG_PACA; /* get paca address into r13 */ \ 177 GET_PACA(r13); \
178 std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \ 178 std r9,PACA_EXGEN+EX_R9(r13); /* save r9, r10 */ \
179 std r10,PACA_EXGEN+EX_R10(r13); \ 179 std r10,PACA_EXGEN+EX_R10(r13); \
180 lbz r10,PACASOFTIRQEN(r13); \ 180 lbz r10,PACASOFTIRQEN(r13); \
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 6eb1d77edb4b..13429a0eba09 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -715,12 +715,15 @@
715 * SPRG usage: 715 * SPRG usage:
716 * 716 *
717 * All 64-bit: 717 * All 64-bit:
718 * - SPRG1 stores PACA pointer 718 * - SPRG1 stores PACA pointer except 64-bit server in
719 * HV mode in which case it is HSPRG0
719 * 720 *
720 * 64-bit server: 721 * 64-bit server:
721 * - SPRG0 unused (reserved for HV on Power4) 722 * - SPRG0 unused (reserved for HV on Power4)
722 * - SPRG2 scratch for exception vectors 723 * - SPRG2 scratch for exception vectors
723 * - SPRG3 unused (user visible) 724 * - SPRG3 unused (user visible)
725 * - HSPRG0 stores PACA in HV mode
726 * - HSPRG1 scratch for "HV" exceptions
724 * 727 *
725 * 64-bit embedded 728 * 64-bit embedded
726 * - SPRG0 generic exception scratch 729 * - SPRG0 generic exception scratch
@@ -783,6 +786,22 @@
783 786
784#ifdef CONFIG_PPC_BOOK3S_64 787#ifdef CONFIG_PPC_BOOK3S_64
785#define SPRN_SPRG_SCRATCH0 SPRN_SPRG2 788#define SPRN_SPRG_SCRATCH0 SPRN_SPRG2
789#define SPRN_SPRG_HPACA SPRN_HSPRG0
790#define SPRN_SPRG_HSCRATCH0 SPRN_HSPRG1
791
792#define GET_PACA(rX) \
793 BEGIN_FTR_SECTION_NESTED(66); \
794 mfspr rX,SPRN_SPRG_PACA; \
795 FTR_SECTION_ELSE_NESTED(66); \
796 mfspr rX,SPRN_SPRG_HPACA; \
797 ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
798
799#define SET_PACA(rX) \
800 BEGIN_FTR_SECTION_NESTED(66); \
801 mtspr SPRN_SPRG_PACA,rX; \
802 FTR_SECTION_ELSE_NESTED(66); \
803 mtspr SPRN_SPRG_HPACA,rX; \
804 ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_HVMODE_206, 66)
786#endif 805#endif
787 806
788#ifdef CONFIG_PPC_BOOK3E_64 807#ifdef CONFIG_PPC_BOOK3E_64
@@ -792,6 +811,10 @@
792#define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2 811#define SPRN_SPRG_TLB_EXFRAME SPRN_SPRG2
793#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6 812#define SPRN_SPRG_TLB_SCRATCH SPRN_SPRG6
794#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0 813#define SPRN_SPRG_GEN_SCRATCH SPRN_SPRG0
814
815#define SET_PACA(rX) mtspr SPRN_SPRG_PACA,rX
816#define GET_PACA(rX) mfspr rX,SPRN_SPRG_PACA
817
795#endif 818#endif
796 819
797#ifdef CONFIG_PPC_BOOK3S_32 820#ifdef CONFIG_PPC_BOOK3S_32
@@ -842,6 +865,8 @@
842#define SPRN_SPRG_SCRATCH1 SPRN_SPRG1 865#define SPRN_SPRG_SCRATCH1 SPRN_SPRG1
843#endif 866#endif
844 867
868
869
845/* 870/*
846 * An mtfsf instruction with the L bit set. On CPUs that support this a 871 * An mtfsf instruction with the L bit set. On CPUs that support this a
847 * full 64bits of FPSCR is restored and on other CPUs the L bit is ignored. 872 * full 64bits of FPSCR is restored and on other CPUs the L bit is ignored.
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index d82878c4daa6..dbf5bfafd7bc 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -838,7 +838,7 @@ _GLOBAL(enter_rtas)
838 838
839_STATIC(rtas_return_loc) 839_STATIC(rtas_return_loc)
840 /* relocation is off at this point */ 840 /* relocation is off at this point */
841 mfspr r4,SPRN_SPRG_PACA /* Get PACA */ 841 GET_PACA(r4)
842 clrldi r4,r4,2 /* convert to realmode address */ 842 clrldi r4,r4,2 /* convert to realmode address */
843 843
844 bcl 20,31,$+4 844 bcl 20,31,$+4
@@ -869,7 +869,7 @@ _STATIC(rtas_restore_regs)
869 REST_8GPRS(14, r1) /* Restore the non-volatiles */ 869 REST_8GPRS(14, r1) /* Restore the non-volatiles */
870 REST_10GPRS(22, r1) /* ditto */ 870 REST_10GPRS(22, r1) /* ditto */
871 871
872 mfspr r13,SPRN_SPRG_PACA 872 GET_PACA(r13)
873 873
874 ld r4,_CCR(r1) 874 ld r4,_CCR(r1)
875 mtcr r4 875 mtcr r4
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index aeb739e18769..6784bf7090f6 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -53,7 +53,7 @@ data_access_pSeries:
53 DO_KVM 0x300 53 DO_KVM 0x300
54 mtspr SPRN_SPRG_SCRATCH0,r13 54 mtspr SPRN_SPRG_SCRATCH0,r13
55BEGIN_FTR_SECTION 55BEGIN_FTR_SECTION
56 mfspr r13,SPRN_SPRG_PACA 56 GET_PACA(r13)
57 std r9,PACA_EXSLB+EX_R9(r13) 57 std r9,PACA_EXSLB+EX_R9(r13)
58 std r10,PACA_EXSLB+EX_R10(r13) 58 std r10,PACA_EXSLB+EX_R10(r13)
59 mfspr r10,SPRN_DAR 59 mfspr r10,SPRN_DAR
@@ -82,7 +82,7 @@ data_access_slb_pSeries:
82 HMT_MEDIUM 82 HMT_MEDIUM
83 DO_KVM 0x380 83 DO_KVM 0x380
84 mtspr SPRN_SPRG_SCRATCH0,r13 84 mtspr SPRN_SPRG_SCRATCH0,r13
85 mfspr r13,SPRN_SPRG_PACA /* get paca address into r13 */ 85 GET_PACA(r13)
86 std r3,PACA_EXSLB+EX_R3(r13) 86 std r3,PACA_EXSLB+EX_R3(r13)
87 mfspr r3,SPRN_DAR 87 mfspr r3,SPRN_DAR
88 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ 88 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */
@@ -121,7 +121,7 @@ instruction_access_slb_pSeries:
121 HMT_MEDIUM 121 HMT_MEDIUM
122 DO_KVM 0x480 122 DO_KVM 0x480
123 mtspr SPRN_SPRG_SCRATCH0,r13 123 mtspr SPRN_SPRG_SCRATCH0,r13
124 mfspr r13,SPRN_SPRG_PACA /* get paca address into r13 */ 124 GET_PACA(r13)
125 std r3,PACA_EXSLB+EX_R3(r13) 125 std r3,PACA_EXSLB+EX_R3(r13)
126 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */ 126 mfspr r3,SPRN_SRR0 /* SRR0 is faulting address */
127 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */ 127 std r9,PACA_EXSLB+EX_R9(r13) /* save r9 - r12 */
@@ -165,7 +165,7 @@ BEGIN_FTR_SECTION
165 beq- 1f 165 beq- 1f
166END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE) 166END_FTR_SECTION_IFSET(CPU_FTR_REAL_LE)
167 mr r9,r13 167 mr r9,r13
168 mfspr r13,SPRN_SPRG_PACA 168 GET_PACA(r13)
169 mfspr r11,SPRN_SRR0 169 mfspr r11,SPRN_SRR0
170 ld r12,PACAKBASE(r13) 170 ld r12,PACAKBASE(r13)
171 ld r10,PACAKMSR(r13) 171 ld r10,PACAKMSR(r13)
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S
index 3a319f9c9d3e..39a40400f3f2 100644
--- a/arch/powerpc/kernel/head_64.S
+++ b/arch/powerpc/kernel/head_64.S
@@ -228,7 +228,7 @@ generic_secondary_common_init:
228 mr r3,r24 /* not found, copy phys to r3 */ 228 mr r3,r24 /* not found, copy phys to r3 */
229 b .kexec_wait /* next kernel might do better */ 229 b .kexec_wait /* next kernel might do better */
230 230
2312: mtspr SPRN_SPRG_PACA,r13 /* Save vaddr of paca in an SPRG */ 2312: SET_PACA(r13)
232#ifdef CONFIG_PPC_BOOK3E 232#ifdef CONFIG_PPC_BOOK3E
233 addi r12,r13,PACA_EXTLB /* and TLB exc frame in another */ 233 addi r12,r13,PACA_EXTLB /* and TLB exc frame in another */
234 mtspr SPRN_SPRG_TLB_EXFRAME,r12 234 mtspr SPRN_SPRG_TLB_EXFRAME,r12
@@ -534,7 +534,7 @@ _GLOBAL(pmac_secondary_start)
534 ld r4,0(r4) /* Get base vaddr of paca array */ 534 ld r4,0(r4) /* Get base vaddr of paca array */
535 mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */ 535 mulli r13,r24,PACA_SIZE /* Calculate vaddr of right paca */
536 add r13,r13,r4 /* for this processor. */ 536 add r13,r13,r4 /* for this processor. */
537 mtspr SPRN_SPRG_PACA,r13 /* Save vaddr of paca in an SPRG*/ 537 SET_PACA(r13) /* Save vaddr of paca in an SPRG*/
538 538
539 /* Mark interrupts soft and hard disabled (they might be enabled 539 /* Mark interrupts soft and hard disabled (they might be enabled
540 * in the PACA when doing hotplug) 540 * in the PACA when doing hotplug)
diff --git a/arch/powerpc/kernel/paca.c b/arch/powerpc/kernel/paca.c
index 10f0aadee95b..102244edecf0 100644
--- a/arch/powerpc/kernel/paca.c
+++ b/arch/powerpc/kernel/paca.c
@@ -156,11 +156,22 @@ void __init initialise_paca(struct paca_struct *new_paca, int cpu)
156/* Put the paca pointer into r13 and SPRG_PACA */ 156/* Put the paca pointer into r13 and SPRG_PACA */
157void setup_paca(struct paca_struct *new_paca) 157void setup_paca(struct paca_struct *new_paca)
158{ 158{
159 /* Setup r13 */
159 local_paca = new_paca; 160 local_paca = new_paca;
160 mtspr(SPRN_SPRG_PACA, local_paca); 161
161#ifdef CONFIG_PPC_BOOK3E 162#ifdef CONFIG_PPC_BOOK3E
163 /* On Book3E, initialize the TLB miss exception frames */
162 mtspr(SPRN_SPRG_TLB_EXFRAME, local_paca->extlb); 164 mtspr(SPRN_SPRG_TLB_EXFRAME, local_paca->extlb);
165#else
166 /* In HV mode, we setup both HPACA and PACA to avoid problems
167 * if we do a GET_PACA() before the feature fixups have been
168 * applied
169 */
170 if (cpu_has_feature(CPU_FTR_HVMODE_206))
171 mtspr(SPRN_SPRG_HPACA, local_paca);
163#endif 172#endif
173 mtspr(SPRN_SPRG_PACA, local_paca);
174
164} 175}
165 176
166static int __initdata paca_size; 177static int __initdata paca_size;
diff --git a/arch/powerpc/kvm/book3s_rmhandlers.S b/arch/powerpc/kvm/book3s_rmhandlers.S
index 2b9c9088d00e..b0ff5ff76e25 100644
--- a/arch/powerpc/kvm/book3s_rmhandlers.S
+++ b/arch/powerpc/kvm/book3s_rmhandlers.S
@@ -35,9 +35,7 @@
35 35
36#if defined(CONFIG_PPC_BOOK3S_64) 36#if defined(CONFIG_PPC_BOOK3S_64)
37 37
38#define LOAD_SHADOW_VCPU(reg) \ 38#define LOAD_SHADOW_VCPU(reg) GET_PACA(reg)
39 mfspr reg, SPRN_SPRG_PACA
40
41#define SHADOW_VCPU_OFF PACA_KVM_SVCPU 39#define SHADOW_VCPU_OFF PACA_KVM_SVCPU
42#define MSR_NOIRQ MSR_KERNEL & ~(MSR_IR | MSR_DR) 40#define MSR_NOIRQ MSR_KERNEL & ~(MSR_IR | MSR_DR)
43#define FUNC(name) GLUE(.,name) 41#define FUNC(name) GLUE(.,name)