diff options
author | Anton Blanchard <anton@samba.org> | 2014-02-04 00:04:52 -0500 |
---|---|---|
committer | Anton Blanchard <anton@samba.org> | 2014-04-22 20:05:17 -0400 |
commit | ad0289e4acf2bd6989e745cff3b4f0781a919e30 (patch) | |
tree | 2027687114b62c2ac5fc201897e67795ea7e964b | |
parent | b1576fec7f4dd4657694fefc97fda4cf28ec68e9 (diff) |
powerpc: Remove superflous function descriptors in assembly only code
We have a number of places where we load the text address of a local
function and indirectly branch to it in assembly. Since it is an
indirect branch binutils will not know to use the function text
address, so that trick wont work.
There is no need for these functions to have a function descriptor
so we can replace it with a label and remove the dot symbol.
Signed-off-by: Anton Blanchard <anton@samba.org>
-rw-r--r-- | arch/powerpc/kernel/entry_64.S | 10 | ||||
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 18 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_64.S | 9 | ||||
-rw-r--r-- | arch/powerpc/platforms/powernv/opal-wrappers.S | 4 |
4 files changed, 21 insertions, 20 deletions
diff --git a/arch/powerpc/kernel/entry_64.S b/arch/powerpc/kernel/entry_64.S index b629198b072c..2d92eeb08b76 100644 --- a/arch/powerpc/kernel/entry_64.S +++ b/arch/powerpc/kernel/entry_64.S | |||
@@ -1021,7 +1021,7 @@ _GLOBAL(enter_rtas) | |||
1021 | std r6,PACASAVEDMSR(r13) | 1021 | std r6,PACASAVEDMSR(r13) |
1022 | 1022 | ||
1023 | /* Setup our real return addr */ | 1023 | /* Setup our real return addr */ |
1024 | LOAD_REG_ADDR(r4,.rtas_return_loc) | 1024 | LOAD_REG_ADDR(r4,rtas_return_loc) |
1025 | clrldi r4,r4,2 /* convert to realmode address */ | 1025 | clrldi r4,r4,2 /* convert to realmode address */ |
1026 | mtlr r4 | 1026 | mtlr r4 |
1027 | 1027 | ||
@@ -1045,7 +1045,7 @@ _GLOBAL(enter_rtas) | |||
1045 | rfid | 1045 | rfid |
1046 | b . /* prevent speculative execution */ | 1046 | b . /* prevent speculative execution */ |
1047 | 1047 | ||
1048 | _STATIC(rtas_return_loc) | 1048 | rtas_return_loc: |
1049 | FIXUP_ENDIAN | 1049 | FIXUP_ENDIAN |
1050 | 1050 | ||
1051 | /* relocation is off at this point */ | 1051 | /* relocation is off at this point */ |
@@ -1054,7 +1054,7 @@ _STATIC(rtas_return_loc) | |||
1054 | 1054 | ||
1055 | bcl 20,31,$+4 | 1055 | bcl 20,31,$+4 |
1056 | 0: mflr r3 | 1056 | 0: mflr r3 |
1057 | ld r3,(1f-0b)(r3) /* get &.rtas_restore_regs */ | 1057 | ld r3,(1f-0b)(r3) /* get &rtas_restore_regs */ |
1058 | 1058 | ||
1059 | mfmsr r6 | 1059 | mfmsr r6 |
1060 | li r0,MSR_RI | 1060 | li r0,MSR_RI |
@@ -1071,9 +1071,9 @@ _STATIC(rtas_return_loc) | |||
1071 | b . /* prevent speculative execution */ | 1071 | b . /* prevent speculative execution */ |
1072 | 1072 | ||
1073 | .align 3 | 1073 | .align 3 |
1074 | 1: .llong .rtas_restore_regs | 1074 | 1: .llong rtas_restore_regs |
1075 | 1075 | ||
1076 | _STATIC(rtas_restore_regs) | 1076 | rtas_restore_regs: |
1077 | /* relocation is on at this point */ | 1077 | /* relocation is on at this point */ |
1078 | REST_GPR(2, r1) /* Restore the TOC */ | 1078 | REST_GPR(2, r1) /* Restore the TOC */ |
1079 | REST_GPR(13, r1) /* Restore paca */ | 1079 | REST_GPR(13, r1) /* Restore paca */ |
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 28391e048120..f2f9d6144ae1 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -214,13 +214,13 @@ data_access_slb_pSeries: | |||
214 | b slb_miss_realmode | 214 | b slb_miss_realmode |
215 | #else | 215 | #else |
216 | /* | 216 | /* |
217 | * We can't just use a direct branch to .slb_miss_realmode | 217 | * We can't just use a direct branch to slb_miss_realmode |
218 | * because the distance from here to there depends on where | 218 | * because the distance from here to there depends on where |
219 | * the kernel ends up being put. | 219 | * the kernel ends up being put. |
220 | */ | 220 | */ |
221 | mfctr r11 | 221 | mfctr r11 |
222 | ld r10,PACAKBASE(r13) | 222 | ld r10,PACAKBASE(r13) |
223 | LOAD_HANDLER(r10, .slb_miss_realmode) | 223 | LOAD_HANDLER(r10, slb_miss_realmode) |
224 | mtctr r10 | 224 | mtctr r10 |
225 | bctr | 225 | bctr |
226 | #endif | 226 | #endif |
@@ -247,7 +247,7 @@ instruction_access_slb_pSeries: | |||
247 | #else | 247 | #else |
248 | mfctr r11 | 248 | mfctr r11 |
249 | ld r10,PACAKBASE(r13) | 249 | ld r10,PACAKBASE(r13) |
250 | LOAD_HANDLER(r10, .slb_miss_realmode) | 250 | LOAD_HANDLER(r10, slb_miss_realmode) |
251 | mtctr r10 | 251 | mtctr r10 |
252 | bctr | 252 | bctr |
253 | #endif | 253 | #endif |
@@ -524,7 +524,7 @@ do_stab_bolted_pSeries: | |||
524 | std r12,PACA_EXSLB+EX_R12(r13) | 524 | std r12,PACA_EXSLB+EX_R12(r13) |
525 | GET_SCRATCH0(r10) | 525 | GET_SCRATCH0(r10) |
526 | std r10,PACA_EXSLB+EX_R13(r13) | 526 | std r10,PACA_EXSLB+EX_R13(r13) |
527 | EXCEPTION_PROLOG_PSERIES_1(.do_stab_bolted, EXC_STD) | 527 | EXCEPTION_PROLOG_PSERIES_1(do_stab_bolted, EXC_STD) |
528 | 528 | ||
529 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) | 529 | KVM_HANDLER_SKIP(PACA_EXGEN, EXC_STD, 0x300) |
530 | KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) | 530 | KVM_HANDLER_SKIP(PACA_EXSLB, EXC_STD, 0x380) |
@@ -832,13 +832,13 @@ data_access_slb_relon_pSeries: | |||
832 | b slb_miss_realmode | 832 | b slb_miss_realmode |
833 | #else | 833 | #else |
834 | /* | 834 | /* |
835 | * We can't just use a direct branch to .slb_miss_realmode | 835 | * We can't just use a direct branch to slb_miss_realmode |
836 | * because the distance from here to there depends on where | 836 | * because the distance from here to there depends on where |
837 | * the kernel ends up being put. | 837 | * the kernel ends up being put. |
838 | */ | 838 | */ |
839 | mfctr r11 | 839 | mfctr r11 |
840 | ld r10,PACAKBASE(r13) | 840 | ld r10,PACAKBASE(r13) |
841 | LOAD_HANDLER(r10, .slb_miss_realmode) | 841 | LOAD_HANDLER(r10, slb_miss_realmode) |
842 | mtctr r10 | 842 | mtctr r10 |
843 | bctr | 843 | bctr |
844 | #endif | 844 | #endif |
@@ -858,7 +858,7 @@ instruction_access_slb_relon_pSeries: | |||
858 | #else | 858 | #else |
859 | mfctr r11 | 859 | mfctr r11 |
860 | ld r10,PACAKBASE(r13) | 860 | ld r10,PACAKBASE(r13) |
861 | LOAD_HANDLER(r10, .slb_miss_realmode) | 861 | LOAD_HANDLER(r10, slb_miss_realmode) |
862 | mtctr r10 | 862 | mtctr r10 |
863 | bctr | 863 | bctr |
864 | #endif | 864 | #endif |
@@ -1468,7 +1468,7 @@ machine_check_handle_early: | |||
1468 | * r3 is saved in paca->slb_r3 | 1468 | * r3 is saved in paca->slb_r3 |
1469 | * We assume we aren't going to take any exceptions during this procedure. | 1469 | * We assume we aren't going to take any exceptions during this procedure. |
1470 | */ | 1470 | */ |
1471 | _GLOBAL(slb_miss_realmode) | 1471 | slb_miss_realmode: |
1472 | mflr r10 | 1472 | mflr r10 |
1473 | #ifdef CONFIG_RELOCATABLE | 1473 | #ifdef CONFIG_RELOCATABLE |
1474 | mtctr r11 | 1474 | mtctr r11 |
@@ -1646,7 +1646,7 @@ do_ste_alloc: | |||
1646 | * We assume (DAR >> 60) == 0xc. | 1646 | * We assume (DAR >> 60) == 0xc. |
1647 | */ | 1647 | */ |
1648 | .align 7 | 1648 | .align 7 |
1649 | _GLOBAL(do_stab_bolted) | 1649 | do_stab_bolted: |
1650 | stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */ | 1650 | stw r9,PACA_EXSLB+EX_CCR(r13) /* save CR in exc. frame */ |
1651 | std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */ | 1651 | std r11,PACA_EXSLB+EX_SRR0(r13) /* save SRR0 in exc. frame */ |
1652 | mfspr r11,SPRN_DAR /* ea */ | 1652 | mfspr r11,SPRN_DAR /* ea */ |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index afcfd631bf7f..8d7c868e5a43 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -639,7 +639,7 @@ __secondary_start: | |||
639 | stb r0,PACAIRQHAPPENED(r13) | 639 | stb r0,PACAIRQHAPPENED(r13) |
640 | 640 | ||
641 | /* enable MMU and jump to start_secondary */ | 641 | /* enable MMU and jump to start_secondary */ |
642 | LOAD_REG_ADDR(r3, .start_secondary_prolog) | 642 | LOAD_REG_ADDR(r3, start_secondary_prolog) |
643 | LOAD_REG_IMMEDIATE(r4, MSR_KERNEL) | 643 | LOAD_REG_IMMEDIATE(r4, MSR_KERNEL) |
644 | 644 | ||
645 | mtspr SPRN_SRR0,r3 | 645 | mtspr SPRN_SRR0,r3 |
@@ -652,7 +652,7 @@ __secondary_start: | |||
652 | * zero the stack back-chain pointer and get the TOC virtual address | 652 | * zero the stack back-chain pointer and get the TOC virtual address |
653 | * before going into C code. | 653 | * before going into C code. |
654 | */ | 654 | */ |
655 | _GLOBAL(start_secondary_prolog) | 655 | start_secondary_prolog: |
656 | ld r2,PACATOC(r13) | 656 | ld r2,PACATOC(r13) |
657 | li r3,0 | 657 | li r3,0 |
658 | std r3,0(r1) /* Zero the stack frame pointer */ | 658 | std r3,0(r1) /* Zero the stack frame pointer */ |
@@ -778,7 +778,7 @@ _INIT_STATIC(start_here_multiplatform) | |||
778 | mr r3,r31 | 778 | mr r3,r31 |
779 | bl early_setup /* also sets r13 and SPRG_PACA */ | 779 | bl early_setup /* also sets r13 and SPRG_PACA */ |
780 | 780 | ||
781 | LOAD_REG_ADDR(r3, .start_here_common) | 781 | LOAD_REG_ADDR(r3, start_here_common) |
782 | ld r4,PACAKMSR(r13) | 782 | ld r4,PACAKMSR(r13) |
783 | mtspr SPRN_SRR0,r3 | 783 | mtspr SPRN_SRR0,r3 |
784 | mtspr SPRN_SRR1,r4 | 784 | mtspr SPRN_SRR1,r4 |
@@ -786,7 +786,8 @@ _INIT_STATIC(start_here_multiplatform) | |||
786 | b . /* prevent speculative execution */ | 786 | b . /* prevent speculative execution */ |
787 | 787 | ||
788 | /* This is where all platforms converge execution */ | 788 | /* This is where all platforms converge execution */ |
789 | _INIT_GLOBAL(start_here_common) | 789 | |
790 | start_here_common: | ||
790 | /* relocation is on at this point */ | 791 | /* relocation is on at this point */ |
791 | std r1,PACAKSAVE(r13) | 792 | std r1,PACAKSAVE(r13) |
792 | 793 | ||
diff --git a/arch/powerpc/platforms/powernv/opal-wrappers.S b/arch/powerpc/platforms/powernv/opal-wrappers.S index f531ffe35b3e..b5ebc545a373 100644 --- a/arch/powerpc/platforms/powernv/opal-wrappers.S +++ b/arch/powerpc/platforms/powernv/opal-wrappers.S | |||
@@ -32,7 +32,7 @@ | |||
32 | std r12,PACASAVEDMSR(r13); \ | 32 | std r12,PACASAVEDMSR(r13); \ |
33 | andc r12,r12,r0; \ | 33 | andc r12,r12,r0; \ |
34 | mtmsrd r12,1; \ | 34 | mtmsrd r12,1; \ |
35 | LOAD_REG_ADDR(r0,.opal_return); \ | 35 | LOAD_REG_ADDR(r0,opal_return); \ |
36 | mtlr r0; \ | 36 | mtlr r0; \ |
37 | li r0,MSR_DR|MSR_IR|MSR_LE;\ | 37 | li r0,MSR_DR|MSR_IR|MSR_LE;\ |
38 | andc r12,r12,r0; \ | 38 | andc r12,r12,r0; \ |
@@ -44,7 +44,7 @@ | |||
44 | mtspr SPRN_HSRR0,r12; \ | 44 | mtspr SPRN_HSRR0,r12; \ |
45 | hrfid | 45 | hrfid |
46 | 46 | ||
47 | _STATIC(opal_return) | 47 | opal_return: |
48 | /* | 48 | /* |
49 | * Fixup endian on OPAL return... we should be able to simplify | 49 | * Fixup endian on OPAL return... we should be able to simplify |
50 | * this by instead converting the below trampoline to a set of | 50 | * this by instead converting the below trampoline to a set of |