aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Blanchard <anton@samba.org>2014-03-09 18:44:22 -0400
committerAnton Blanchard <anton@samba.org>2014-04-22 20:05:22 -0400
commitb86206e4c32cbe6ac3de1c6dc52c2d64bcf461cb (patch)
treebbad949975ee4a562d9aed6800e54a035cfb03a3
parent26f920605680b69e484a114b3dcb47ce11df9827 (diff)
powerpc: Fix branch patching code for ABIv2
The MMU hashtable and SLB branch patching code uses function pointers for the update sites. This creates a difference between ABIv1 and ABIv2 because we don't have function descriptors on ABIv2. Get rid of the function pointer and just point at the update sites directly. This works on both ABIs. Signed-off-by: Anton Blanchard <anton@samba.org>
-rw-r--r--arch/powerpc/mm/hash_low_64.S36
-rw-r--r--arch/powerpc/mm/hash_utils_64.c20
-rw-r--r--arch/powerpc/mm/slb.c12
-rw-r--r--arch/powerpc/mm/slb_low.S12
4 files changed, 47 insertions, 33 deletions
diff --git a/arch/powerpc/mm/hash_low_64.S b/arch/powerpc/mm/hash_low_64.S
index 8bf7537a7f53..057cbbb4c576 100644
--- a/arch/powerpc/mm/hash_low_64.S
+++ b/arch/powerpc/mm/hash_low_64.S
@@ -201,7 +201,8 @@ htab_insert_pte:
201 li r8,MMU_PAGE_4K /* page size */ 201 li r8,MMU_PAGE_4K /* page size */
202 li r9,MMU_PAGE_4K /* actual page size */ 202 li r9,MMU_PAGE_4K /* actual page size */
203 ld r10,STK_PARAM(R9)(r1) /* segment size */ 203 ld r10,STK_PARAM(R9)(r1) /* segment size */
204_GLOBAL(htab_call_hpte_insert1) 204.globl htab_call_hpte_insert1
205htab_call_hpte_insert1:
205 bl . /* Patched by htab_finish_init() */ 206 bl . /* Patched by htab_finish_init() */
206 cmpdi 0,r3,0 207 cmpdi 0,r3,0
207 bge htab_pte_insert_ok /* Insertion successful */ 208 bge htab_pte_insert_ok /* Insertion successful */
@@ -225,7 +226,8 @@ _GLOBAL(htab_call_hpte_insert1)
225 li r8,MMU_PAGE_4K /* page size */ 226 li r8,MMU_PAGE_4K /* page size */
226 li r9,MMU_PAGE_4K /* actual page size */ 227 li r9,MMU_PAGE_4K /* actual page size */
227 ld r10,STK_PARAM(R9)(r1) /* segment size */ 228 ld r10,STK_PARAM(R9)(r1) /* segment size */
228_GLOBAL(htab_call_hpte_insert2) 229.globl htab_call_hpte_insert2
230htab_call_hpte_insert2:
229 bl . /* Patched by htab_finish_init() */ 231 bl . /* Patched by htab_finish_init() */
230 cmpdi 0,r3,0 232 cmpdi 0,r3,0
231 bge+ htab_pte_insert_ok /* Insertion successful */ 233 bge+ htab_pte_insert_ok /* Insertion successful */
@@ -242,7 +244,8 @@ _GLOBAL(htab_call_hpte_insert2)
2422: and r0,r5,r27 2442: and r0,r5,r27
243 rldicr r3,r0,3,63-3 /* r0 = (hash & mask) << 3 */ 245 rldicr r3,r0,3,63-3 /* r0 = (hash & mask) << 3 */
244 /* Call ppc_md.hpte_remove */ 246 /* Call ppc_md.hpte_remove */
245_GLOBAL(htab_call_hpte_remove) 247.globl htab_call_hpte_remove
248htab_call_hpte_remove:
246 bl . /* Patched by htab_finish_init() */ 249 bl . /* Patched by htab_finish_init() */
247 250
248 /* Try all again */ 251 /* Try all again */
@@ -296,7 +299,8 @@ htab_modify_pte:
296 li r7,MMU_PAGE_4K /* actual page size */ 299 li r7,MMU_PAGE_4K /* actual page size */
297 ld r8,STK_PARAM(R9)(r1) /* segment size */ 300 ld r8,STK_PARAM(R9)(r1) /* segment size */
298 ld r9,STK_PARAM(R8)(r1) /* get "local" param */ 301 ld r9,STK_PARAM(R8)(r1) /* get "local" param */
299_GLOBAL(htab_call_hpte_updatepp) 302.globl htab_call_hpte_updatepp
303htab_call_hpte_updatepp:
300 bl . /* Patched by htab_finish_init() */ 304 bl . /* Patched by htab_finish_init() */
301 305
302 /* if we failed because typically the HPTE wasn't really here 306 /* if we failed because typically the HPTE wasn't really here
@@ -526,7 +530,8 @@ htab_special_pfn:
526 li r8,MMU_PAGE_4K /* page size */ 530 li r8,MMU_PAGE_4K /* page size */
527 li r9,MMU_PAGE_4K /* actual page size */ 531 li r9,MMU_PAGE_4K /* actual page size */
528 ld r10,STK_PARAM(R9)(r1) /* segment size */ 532 ld r10,STK_PARAM(R9)(r1) /* segment size */
529_GLOBAL(htab_call_hpte_insert1) 533.globl htab_call_hpte_insert1
534htab_call_hpte_insert1:
530 bl . /* patched by htab_finish_init() */ 535 bl . /* patched by htab_finish_init() */
531 cmpdi 0,r3,0 536 cmpdi 0,r3,0
532 bge htab_pte_insert_ok /* Insertion successful */ 537 bge htab_pte_insert_ok /* Insertion successful */
@@ -554,7 +559,8 @@ _GLOBAL(htab_call_hpte_insert1)
554 li r8,MMU_PAGE_4K /* page size */ 559 li r8,MMU_PAGE_4K /* page size */
555 li r9,MMU_PAGE_4K /* actual page size */ 560 li r9,MMU_PAGE_4K /* actual page size */
556 ld r10,STK_PARAM(R9)(r1) /* segment size */ 561 ld r10,STK_PARAM(R9)(r1) /* segment size */
557_GLOBAL(htab_call_hpte_insert2) 562.globl htab_call_hpte_insert2
563htab_call_hpte_insert2:
558 bl . /* patched by htab_finish_init() */ 564 bl . /* patched by htab_finish_init() */
559 cmpdi 0,r3,0 565 cmpdi 0,r3,0
560 bge+ htab_pte_insert_ok /* Insertion successful */ 566 bge+ htab_pte_insert_ok /* Insertion successful */
@@ -571,7 +577,8 @@ _GLOBAL(htab_call_hpte_insert2)
5712: and r0,r5,r27 5772: and r0,r5,r27
572 rldicr r3,r0,3,63-3 /* r0 = (hash & mask) << 3 */ 578 rldicr r3,r0,3,63-3 /* r0 = (hash & mask) << 3 */
573 /* Call ppc_md.hpte_remove */ 579 /* Call ppc_md.hpte_remove */
574_GLOBAL(htab_call_hpte_remove) 580.globl htab_call_hpte_remove
581htab_call_hpte_remove:
575 bl . /* patched by htab_finish_init() */ 582 bl . /* patched by htab_finish_init() */
576 583
577 /* Try all again */ 584 /* Try all again */
@@ -660,7 +667,8 @@ htab_modify_pte:
660 li r7,MMU_PAGE_4K /* actual page size */ 667 li r7,MMU_PAGE_4K /* actual page size */
661 ld r8,STK_PARAM(R9)(r1) /* segment size */ 668 ld r8,STK_PARAM(R9)(r1) /* segment size */
662 ld r9,STK_PARAM(R8)(r1) /* get "local" param */ 669 ld r9,STK_PARAM(R8)(r1) /* get "local" param */
663_GLOBAL(htab_call_hpte_updatepp) 670.globl htab_call_hpte_updatepp
671htab_call_hpte_updatepp:
664 bl . /* patched by htab_finish_init() */ 672 bl . /* patched by htab_finish_init() */
665 673
666 /* if we failed because typically the HPTE wasn't really here 674 /* if we failed because typically the HPTE wasn't really here
@@ -857,7 +865,8 @@ ht64_insert_pte:
857 li r8,MMU_PAGE_64K 865 li r8,MMU_PAGE_64K
858 li r9,MMU_PAGE_64K /* actual page size */ 866 li r9,MMU_PAGE_64K /* actual page size */
859 ld r10,STK_PARAM(R9)(r1) /* segment size */ 867 ld r10,STK_PARAM(R9)(r1) /* segment size */
860_GLOBAL(ht64_call_hpte_insert1) 868.globl ht64_call_hpte_insert1
869ht64_call_hpte_insert1:
861 bl . /* patched by htab_finish_init() */ 870 bl . /* patched by htab_finish_init() */
862 cmpdi 0,r3,0 871 cmpdi 0,r3,0
863 bge ht64_pte_insert_ok /* Insertion successful */ 872 bge ht64_pte_insert_ok /* Insertion successful */
@@ -881,7 +890,8 @@ _GLOBAL(ht64_call_hpte_insert1)
881 li r8,MMU_PAGE_64K 890 li r8,MMU_PAGE_64K
882 li r9,MMU_PAGE_64K /* actual page size */ 891 li r9,MMU_PAGE_64K /* actual page size */
883 ld r10,STK_PARAM(R9)(r1) /* segment size */ 892 ld r10,STK_PARAM(R9)(r1) /* segment size */
884_GLOBAL(ht64_call_hpte_insert2) 893.globl ht64_call_hpte_insert2
894ht64_call_hpte_insert2:
885 bl . /* patched by htab_finish_init() */ 895 bl . /* patched by htab_finish_init() */
886 cmpdi 0,r3,0 896 cmpdi 0,r3,0
887 bge+ ht64_pte_insert_ok /* Insertion successful */ 897 bge+ ht64_pte_insert_ok /* Insertion successful */
@@ -898,7 +908,8 @@ _GLOBAL(ht64_call_hpte_insert2)
8982: and r0,r5,r27 9082: and r0,r5,r27
899 rldicr r3,r0,3,63-3 /* r0 = (hash & mask) << 3 */ 909 rldicr r3,r0,3,63-3 /* r0 = (hash & mask) << 3 */
900 /* Call ppc_md.hpte_remove */ 910 /* Call ppc_md.hpte_remove */
901_GLOBAL(ht64_call_hpte_remove) 911.globl ht64_call_hpte_remove
912ht64_call_hpte_remove:
902 bl . /* patched by htab_finish_init() */ 913 bl . /* patched by htab_finish_init() */
903 914
904 /* Try all again */ 915 /* Try all again */
@@ -952,7 +963,8 @@ ht64_modify_pte:
952 li r7,MMU_PAGE_64K /* actual page size */ 963 li r7,MMU_PAGE_64K /* actual page size */
953 ld r8,STK_PARAM(R9)(r1) /* segment size */ 964 ld r8,STK_PARAM(R9)(r1) /* segment size */
954 ld r9,STK_PARAM(R8)(r1) /* get "local" param */ 965 ld r9,STK_PARAM(R8)(r1) /* get "local" param */
955_GLOBAL(ht64_call_hpte_updatepp) 966.globl ht64_call_hpte_updatepp
967ht64_call_hpte_updatepp:
956 bl . /* patched by htab_finish_init() */ 968 bl . /* patched by htab_finish_init() */
957 969
958 /* if we failed because typically the HPTE wasn't really here 970 /* if we failed because typically the HPTE wasn't really here
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index 49fc935ee807..d685dff382c9 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -603,19 +603,18 @@ int remove_section_mapping(unsigned long start, unsigned long end)
603} 603}
604#endif /* CONFIG_MEMORY_HOTPLUG */ 604#endif /* CONFIG_MEMORY_HOTPLUG */
605 605
606extern u32 htab_call_hpte_insert1[];
607extern u32 htab_call_hpte_insert2[];
608extern u32 htab_call_hpte_remove[];
609extern u32 htab_call_hpte_updatepp[];
610extern u32 ht64_call_hpte_insert1[];
611extern u32 ht64_call_hpte_insert2[];
612extern u32 ht64_call_hpte_remove[];
613extern u32 ht64_call_hpte_updatepp[];
614
606static void __init htab_finish_init(void) 615static void __init htab_finish_init(void)
607{ 616{
608 extern unsigned int *htab_call_hpte_insert1;
609 extern unsigned int *htab_call_hpte_insert2;
610 extern unsigned int *htab_call_hpte_remove;
611 extern unsigned int *htab_call_hpte_updatepp;
612
613#ifdef CONFIG_PPC_HAS_HASH_64K 617#ifdef CONFIG_PPC_HAS_HASH_64K
614 extern unsigned int *ht64_call_hpte_insert1;
615 extern unsigned int *ht64_call_hpte_insert2;
616 extern unsigned int *ht64_call_hpte_remove;
617 extern unsigned int *ht64_call_hpte_updatepp;
618
619 patch_branch(ht64_call_hpte_insert1, 618 patch_branch(ht64_call_hpte_insert1,
620 ppc_function_entry(ppc_md.hpte_insert), 619 ppc_function_entry(ppc_md.hpte_insert),
621 BRANCH_SET_LINK); 620 BRANCH_SET_LINK);
@@ -628,7 +627,6 @@ static void __init htab_finish_init(void)
628 patch_branch(ht64_call_hpte_updatepp, 627 patch_branch(ht64_call_hpte_updatepp,
629 ppc_function_entry(ppc_md.hpte_updatepp), 628 ppc_function_entry(ppc_md.hpte_updatepp),
630 BRANCH_SET_LINK); 629 BRANCH_SET_LINK);
631
632#endif /* CONFIG_PPC_HAS_HASH_64K */ 630#endif /* CONFIG_PPC_HAS_HASH_64K */
633 631
634 patch_branch(htab_call_hpte_insert1, 632 patch_branch(htab_call_hpte_insert1,
diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
index 9d1d33cd2be5..4623366f82e9 100644
--- a/arch/powerpc/mm/slb.c
+++ b/arch/powerpc/mm/slb.c
@@ -256,10 +256,14 @@ static inline void patch_slb_encoding(unsigned int *insn_addr,
256 patch_instruction(insn_addr, insn); 256 patch_instruction(insn_addr, insn);
257} 257}
258 258
259extern u32 slb_compare_rr_to_size[];
260extern u32 slb_miss_kernel_load_linear[];
261extern u32 slb_miss_kernel_load_io[];
262extern u32 slb_compare_rr_to_size[];
263extern u32 slb_miss_kernel_load_vmemmap[];
264
259void slb_set_size(u16 size) 265void slb_set_size(u16 size)
260{ 266{
261 extern unsigned int *slb_compare_rr_to_size;
262
263 if (mmu_slb_size == size) 267 if (mmu_slb_size == size)
264 return; 268 return;
265 269
@@ -272,11 +276,7 @@ void slb_initialize(void)
272 unsigned long linear_llp, vmalloc_llp, io_llp; 276 unsigned long linear_llp, vmalloc_llp, io_llp;
273 unsigned long lflags, vflags; 277 unsigned long lflags, vflags;
274 static int slb_encoding_inited; 278 static int slb_encoding_inited;
275 extern unsigned int *slb_miss_kernel_load_linear;
276 extern unsigned int *slb_miss_kernel_load_io;
277 extern unsigned int *slb_compare_rr_to_size;
278#ifdef CONFIG_SPARSEMEM_VMEMMAP 279#ifdef CONFIG_SPARSEMEM_VMEMMAP
279 extern unsigned int *slb_miss_kernel_load_vmemmap;
280 unsigned long vmemmap_llp; 280 unsigned long vmemmap_llp;
281#endif 281#endif
282 282
diff --git a/arch/powerpc/mm/slb_low.S b/arch/powerpc/mm/slb_low.S
index 17aa6dfceb34..28cffb68c2e1 100644
--- a/arch/powerpc/mm/slb_low.S
+++ b/arch/powerpc/mm/slb_low.S
@@ -59,7 +59,8 @@ _GLOBAL(slb_allocate_realmode)
59 /* Linear mapping encoding bits, the "li" instruction below will 59 /* Linear mapping encoding bits, the "li" instruction below will
60 * be patched by the kernel at boot 60 * be patched by the kernel at boot
61 */ 61 */
62_GLOBAL(slb_miss_kernel_load_linear) 62.globl slb_miss_kernel_load_linear
63slb_miss_kernel_load_linear:
63 li r11,0 64 li r11,0
64 /* 65 /*
65 * context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1 66 * context = (MAX_USER_CONTEXT) + ((ea >> 60) - 0xc) + 1
@@ -79,7 +80,8 @@ END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT)
79 /* Check virtual memmap region. To be patches at kernel boot */ 80 /* Check virtual memmap region. To be patches at kernel boot */
80 cmpldi cr0,r9,0xf 81 cmpldi cr0,r9,0xf
81 bne 1f 82 bne 1f
82_GLOBAL(slb_miss_kernel_load_vmemmap) 83.globl slb_miss_kernel_load_vmemmap
84slb_miss_kernel_load_vmemmap:
83 li r11,0 85 li r11,0
84 b 6f 86 b 6f
851: 871:
@@ -95,7 +97,8 @@ _GLOBAL(slb_miss_kernel_load_vmemmap)
95 b 6f 97 b 6f
965: 985:
97 /* IO mapping */ 99 /* IO mapping */
98 _GLOBAL(slb_miss_kernel_load_io) 100.globl slb_miss_kernel_load_io
101slb_miss_kernel_load_io:
99 li r11,0 102 li r11,0
1006: 1036:
101 /* 104 /*
@@ -250,7 +253,8 @@ slb_finish_load:
2507: ld r10,PACASTABRR(r13) 2537: ld r10,PACASTABRR(r13)
251 addi r10,r10,1 254 addi r10,r10,1
252 /* This gets soft patched on boot. */ 255 /* This gets soft patched on boot. */
253_GLOBAL(slb_compare_rr_to_size) 256.globl slb_compare_rr_to_size
257slb_compare_rr_to_size:
254 cmpldi r10,0 258 cmpldi r10,0
255 259
256 blt+ 4f 260 blt+ 4f