aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc/kernel
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-03-01 19:33:52 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2012-03-08 18:55:20 -0500
commitd9ada91ae2969ae6b6dc3574fd08a6ebda5df766 (patch)
treea4509657892acb0b853760d6d26729a913a5fc2b /arch/powerpc/kernel
parent9424fabf8617c15e18a5ffd29bc3bcfa36620473 (diff)
powerpc: Replace mfmsr instructions with load from PACA kernel_msr field
On 64-bit, the mfmsr instruction can be quite slow, slower than loading a field from the cache-hot PACA, which happens to already contain the value we want in most cases. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r--arch/powerpc/kernel/entry_64.S14
-rw-r--r--arch/powerpc/kernel/exceptions-64s.S5
2 files changed, 7 insertions, 12 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S
index cc030b73174b..c513beb78b3b 100644
--- a/arch/powerpc/kernel/entry_64.S
+++ b/arch/powerpc/kernel/entry_64.S
@@ -557,10 +557,8 @@ _GLOBAL(ret_from_except_lite)
557#ifdef CONFIG_PPC_BOOK3E 557#ifdef CONFIG_PPC_BOOK3E
558 wrteei 0 558 wrteei 0
559#else 559#else
560 mfmsr r10 /* Get current interrupt state */ 560 ld r10,PACAKMSR(r13) /* Get kernel MSR without EE */
561 rldicl r9,r10,48,1 /* clear MSR_EE */ 561 mtmsrd r10,1 /* Update machine state */
562 rotldi r9,r9,16
563 mtmsrd r9,1 /* Update machine state */
564#endif /* CONFIG_PPC_BOOK3E */ 562#endif /* CONFIG_PPC_BOOK3E */
565 563
566#ifdef CONFIG_PREEMPT 564#ifdef CONFIG_PREEMPT
@@ -625,8 +623,8 @@ ALT_FTR_SECTION_END_IFCLR(CPU_FTR_STCX_CHECKS_ADDRESS)
625 * userspace and we take an exception after restoring r13, 623 * userspace and we take an exception after restoring r13,
626 * we end up corrupting the userspace r13 value. 624 * we end up corrupting the userspace r13 value.
627 */ 625 */
628 mfmsr r4 626 ld r4,PACAKMSR(r13) /* Get kernel MSR without EE */
629 andc r4,r4,r0 /* r0 contains MSR_RI here */ 627 andc r4,r4,r0 /* r0 contains MSR_RI here */
630 mtmsrd r4,1 628 mtmsrd r4,1
631 629
632 /* 630 /*
@@ -686,9 +684,7 @@ do_work:
686#ifdef CONFIG_PPC_BOOK3E 684#ifdef CONFIG_PPC_BOOK3E
687 wrteei 0 685 wrteei 0
688#else 686#else
689 mfmsr r10 687 ld r10,PACAKMSR(r13) /* Get kernel MSR without EE */
690 rldicl r10,r10,48,1
691 rotldi r10,r10,16
692 mtmsrd r10,1 688 mtmsrd r10,1
693#endif /* CONFIG_PPC_BOOK3E */ 689#endif /* CONFIG_PPC_BOOK3E */
694 li r0,0 690 li r0,0
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S
index 0fb42ae21694..02448ea58ad3 100644
--- a/arch/powerpc/kernel/exceptions-64s.S
+++ b/arch/powerpc/kernel/exceptions-64s.S
@@ -848,9 +848,8 @@ fast_exception_return:
848 REST_GPR(0, r1) 848 REST_GPR(0, r1)
849 REST_8GPRS(2, r1) 849 REST_8GPRS(2, r1)
850 850
851 mfmsr r10 851 ld r10,PACAKMSR(r13)
852 rldicl r10,r10,48,1 /* clear EE */ 852 clrrdi r10,r10,2 /* clear RI */
853 rldicr r10,r10,16,61 /* clear RI (LE is 0 already) */
854 mtmsrd r10,1 853 mtmsrd r10,1
855 854
856 mtspr SPRN_SRR1,r12 855 mtspr SPRN_SRR1,r12