aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2013-12-30 09:31:17 -0500
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>2014-01-14 21:46:43 -0500
commit8fe9c93e7453e67b8bd09f263ec1bb0783c733fc (patch)
treeed2ad17b085d320d7acd24a32e531fb2a05363b4
parentdece8ada993e1764a115bdff0f1effffaa5fc8dc (diff)
powerpc: Add vr save/restore functions
GCC 4.8 now generates out-of-line vr save/restore functions when optimizing for size. They are needed for the raid6 altivec support. Signed-off-by: Andreas Schwab <schwab@linux-m68k.org> Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
-rw-r--r--arch/powerpc/lib/crtsavres.S186
-rw-r--r--scripts/mod/modpost.c8
2 files changed, 192 insertions, 2 deletions
diff --git a/arch/powerpc/lib/crtsavres.S b/arch/powerpc/lib/crtsavres.S
index b2c68ce139ae..a5b30c71a8d3 100644
--- a/arch/powerpc/lib/crtsavres.S
+++ b/arch/powerpc/lib/crtsavres.S
@@ -231,6 +231,87 @@ _GLOBAL(_rest32gpr_31_x)
231 mr 1,11 231 mr 1,11
232 blr 232 blr
233 233
234#ifdef CONFIG_ALTIVEC
235/* Called with r0 pointing just beyond the end of the vector save area. */
236
237_GLOBAL(_savevr_20)
238 li r11,-192
239 stvx vr20,r11,r0
240_GLOBAL(_savevr_21)
241 li r11,-176
242 stvx vr21,r11,r0
243_GLOBAL(_savevr_22)
244 li r11,-160
245 stvx vr22,r11,r0
246_GLOBAL(_savevr_23)
247 li r11,-144
248 stvx vr23,r11,r0
249_GLOBAL(_savevr_24)
250 li r11,-128
251 stvx vr24,r11,r0
252_GLOBAL(_savevr_25)
253 li r11,-112
254 stvx vr25,r11,r0
255_GLOBAL(_savevr_26)
256 li r11,-96
257 stvx vr26,r11,r0
258_GLOBAL(_savevr_27)
259 li r11,-80
260 stvx vr27,r11,r0
261_GLOBAL(_savevr_28)
262 li r11,-64
263 stvx vr28,r11,r0
264_GLOBAL(_savevr_29)
265 li r11,-48
266 stvx vr29,r11,r0
267_GLOBAL(_savevr_30)
268 li r11,-32
269 stvx vr30,r11,r0
270_GLOBAL(_savevr_31)
271 li r11,-16
272 stvx vr31,r11,r0
273 blr
274
275_GLOBAL(_restvr_20)
276 li r11,-192
277 lvx vr20,r11,r0
278_GLOBAL(_restvr_21)
279 li r11,-176
280 lvx vr21,r11,r0
281_GLOBAL(_restvr_22)
282 li r11,-160
283 lvx vr22,r11,r0
284_GLOBAL(_restvr_23)
285 li r11,-144
286 lvx vr23,r11,r0
287_GLOBAL(_restvr_24)
288 li r11,-128
289 lvx vr24,r11,r0
290_GLOBAL(_restvr_25)
291 li r11,-112
292 lvx vr25,r11,r0
293_GLOBAL(_restvr_26)
294 li r11,-96
295 lvx vr26,r11,r0
296_GLOBAL(_restvr_27)
297 li r11,-80
298 lvx vr27,r11,r0
299_GLOBAL(_restvr_28)
300 li r11,-64
301 lvx vr28,r11,r0
302_GLOBAL(_restvr_29)
303 li r11,-48
304 lvx vr29,r11,r0
305_GLOBAL(_restvr_30)
306 li r11,-32
307 lvx vr30,r11,r0
308_GLOBAL(_restvr_31)
309 li r11,-16
310 lvx vr31,r11,r0
311 blr
312
313#endif /* CONFIG_ALTIVEC */
314
234#else /* CONFIG_PPC64 */ 315#else /* CONFIG_PPC64 */
235 316
236 .section ".text.save.restore","ax",@progbits 317 .section ".text.save.restore","ax",@progbits
@@ -356,6 +437,111 @@ _restgpr0_31:
356 mtlr r0 437 mtlr r0
357 blr 438 blr
358 439
440#ifdef CONFIG_ALTIVEC
441/* Called with r0 pointing just beyond the end of the vector save area. */
442
443.globl _savevr_20
444_savevr_20:
445 li r12,-192
446 stvx vr20,r12,r0
447.globl _savevr_21
448_savevr_21:
449 li r12,-176
450 stvx vr21,r12,r0
451.globl _savevr_22
452_savevr_22:
453 li r12,-160
454 stvx vr22,r12,r0
455.globl _savevr_23
456_savevr_23:
457 li r12,-144
458 stvx vr23,r12,r0
459.globl _savevr_24
460_savevr_24:
461 li r12,-128
462 stvx vr24,r12,r0
463.globl _savevr_25
464_savevr_25:
465 li r12,-112
466 stvx vr25,r12,r0
467.globl _savevr_26
468_savevr_26:
469 li r12,-96
470 stvx vr26,r12,r0
471.globl _savevr_27
472_savevr_27:
473 li r12,-80
474 stvx vr27,r12,r0
475.globl _savevr_28
476_savevr_28:
477 li r12,-64
478 stvx vr28,r12,r0
479.globl _savevr_29
480_savevr_29:
481 li r12,-48
482 stvx vr29,r12,r0
483.globl _savevr_30
484_savevr_30:
485 li r12,-32
486 stvx vr30,r12,r0
487.globl _savevr_31
488_savevr_31:
489 li r12,-16
490 stvx vr31,r12,r0
491 blr
492
493.globl _restvr_20
494_restvr_20:
495 li r12,-192
496 lvx vr20,r12,r0
497.globl _restvr_21
498_restvr_21:
499 li r12,-176
500 lvx vr21,r12,r0
501.globl _restvr_22
502_restvr_22:
503 li r12,-160
504 lvx vr22,r12,r0
505.globl _restvr_23
506_restvr_23:
507 li r12,-144
508 lvx vr23,r12,r0
509.globl _restvr_24
510_restvr_24:
511 li r12,-128
512 lvx vr24,r12,r0
513.globl _restvr_25
514_restvr_25:
515 li r12,-112
516 lvx vr25,r12,r0
517.globl _restvr_26
518_restvr_26:
519 li r12,-96
520 lvx vr26,r12,r0
521.globl _restvr_27
522_restvr_27:
523 li r12,-80
524 lvx vr27,r12,r0
525.globl _restvr_28
526_restvr_28:
527 li r12,-64
528 lvx vr28,r12,r0
529.globl _restvr_29
530_restvr_29:
531 li r12,-48
532 lvx vr29,r12,r0
533.globl _restvr_30
534_restvr_30:
535 li r12,-32
536 lvx vr30,r12,r0
537.globl _restvr_31
538_restvr_31:
539 li r12,-16
540 lvx vr31,r12,r0
541 blr
542
543#endif /* CONFIG_ALTIVEC */
544
359#endif /* CONFIG_PPC64 */ 545#endif /* CONFIG_PPC64 */
360 546
361#endif 547#endif
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
index 17855761e6b7..40610984a1b5 100644
--- a/scripts/mod/modpost.c
+++ b/scripts/mod/modpost.c
@@ -584,12 +584,16 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
584 if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 || 584 if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
585 strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 || 585 strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
586 strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 || 586 strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
587 strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0) 587 strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0 ||
588 strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
589 strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
588 return 1; 590 return 1;
589 if (info->hdr->e_machine == EM_PPC64) 591 if (info->hdr->e_machine == EM_PPC64)
590 /* Special register function linked on all modules during final link of .ko */ 592 /* Special register function linked on all modules during final link of .ko */
591 if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 || 593 if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
592 strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0) 594 strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
595 strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
596 strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
593 return 1; 597 return 1;
594 /* Do not ignore this symbol */ 598 /* Do not ignore this symbol */
595 return 0; 599 return 0;