diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2013-12-30 09:31:17 -0500 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2014-01-14 21:46:43 -0500 |
commit | 8fe9c93e7453e67b8bd09f263ec1bb0783c733fc (patch) | |
tree | ed2ad17b085d320d7acd24a32e531fb2a05363b4 | |
parent | dece8ada993e1764a115bdff0f1effffaa5fc8dc (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.S | 186 | ||||
-rw-r--r-- | scripts/mod/modpost.c | 8 |
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; |