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; |
