Skip to content

Commit

Permalink
powerpc: Add vr save/restore functions
Browse files Browse the repository at this point in the history
commit 8fe9c93 upstream.

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>
Cc: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
andreas-schwab authored and gregkh committed May 31, 2014
1 parent 04168b9 commit 70c6edb
Show file tree
Hide file tree
Showing 2 changed files with 192 additions and 2 deletions.
186 changes: 186 additions & 0 deletions arch/powerpc/lib/crtsavres.S
Expand Up @@ -231,6 +231,87 @@ _GLOBAL(_rest32gpr_31_x)
mr 1,11
blr

#ifdef CONFIG_ALTIVEC
/* Called with r0 pointing just beyond the end of the vector save area. */

_GLOBAL(_savevr_20)
li r11,-192
stvx vr20,r11,r0
_GLOBAL(_savevr_21)
li r11,-176
stvx vr21,r11,r0
_GLOBAL(_savevr_22)
li r11,-160
stvx vr22,r11,r0
_GLOBAL(_savevr_23)
li r11,-144
stvx vr23,r11,r0
_GLOBAL(_savevr_24)
li r11,-128
stvx vr24,r11,r0
_GLOBAL(_savevr_25)
li r11,-112
stvx vr25,r11,r0
_GLOBAL(_savevr_26)
li r11,-96
stvx vr26,r11,r0
_GLOBAL(_savevr_27)
li r11,-80
stvx vr27,r11,r0
_GLOBAL(_savevr_28)
li r11,-64
stvx vr28,r11,r0
_GLOBAL(_savevr_29)
li r11,-48
stvx vr29,r11,r0
_GLOBAL(_savevr_30)
li r11,-32
stvx vr30,r11,r0
_GLOBAL(_savevr_31)
li r11,-16
stvx vr31,r11,r0
blr

_GLOBAL(_restvr_20)
li r11,-192
lvx vr20,r11,r0
_GLOBAL(_restvr_21)
li r11,-176
lvx vr21,r11,r0
_GLOBAL(_restvr_22)
li r11,-160
lvx vr22,r11,r0
_GLOBAL(_restvr_23)
li r11,-144
lvx vr23,r11,r0
_GLOBAL(_restvr_24)
li r11,-128
lvx vr24,r11,r0
_GLOBAL(_restvr_25)
li r11,-112
lvx vr25,r11,r0
_GLOBAL(_restvr_26)
li r11,-96
lvx vr26,r11,r0
_GLOBAL(_restvr_27)
li r11,-80
lvx vr27,r11,r0
_GLOBAL(_restvr_28)
li r11,-64
lvx vr28,r11,r0
_GLOBAL(_restvr_29)
li r11,-48
lvx vr29,r11,r0
_GLOBAL(_restvr_30)
li r11,-32
lvx vr30,r11,r0
_GLOBAL(_restvr_31)
li r11,-16
lvx vr31,r11,r0
blr

#endif /* CONFIG_ALTIVEC */

#else /* CONFIG_PPC64 */

.section ".text.save.restore","ax",@progbits
Expand Down Expand Up @@ -356,6 +437,111 @@ _restgpr0_31:
mtlr r0
blr

#ifdef CONFIG_ALTIVEC
/* Called with r0 pointing just beyond the end of the vector save area. */

.globl _savevr_20
_savevr_20:
li r12,-192
stvx vr20,r12,r0
.globl _savevr_21
_savevr_21:
li r12,-176
stvx vr21,r12,r0
.globl _savevr_22
_savevr_22:
li r12,-160
stvx vr22,r12,r0
.globl _savevr_23
_savevr_23:
li r12,-144
stvx vr23,r12,r0
.globl _savevr_24
_savevr_24:
li r12,-128
stvx vr24,r12,r0
.globl _savevr_25
_savevr_25:
li r12,-112
stvx vr25,r12,r0
.globl _savevr_26
_savevr_26:
li r12,-96
stvx vr26,r12,r0
.globl _savevr_27
_savevr_27:
li r12,-80
stvx vr27,r12,r0
.globl _savevr_28
_savevr_28:
li r12,-64
stvx vr28,r12,r0
.globl _savevr_29
_savevr_29:
li r12,-48
stvx vr29,r12,r0
.globl _savevr_30
_savevr_30:
li r12,-32
stvx vr30,r12,r0
.globl _savevr_31
_savevr_31:
li r12,-16
stvx vr31,r12,r0
blr

.globl _restvr_20
_restvr_20:
li r12,-192
lvx vr20,r12,r0
.globl _restvr_21
_restvr_21:
li r12,-176
lvx vr21,r12,r0
.globl _restvr_22
_restvr_22:
li r12,-160
lvx vr22,r12,r0
.globl _restvr_23
_restvr_23:
li r12,-144
lvx vr23,r12,r0
.globl _restvr_24
_restvr_24:
li r12,-128
lvx vr24,r12,r0
.globl _restvr_25
_restvr_25:
li r12,-112
lvx vr25,r12,r0
.globl _restvr_26
_restvr_26:
li r12,-96
lvx vr26,r12,r0
.globl _restvr_27
_restvr_27:
li r12,-80
lvx vr27,r12,r0
.globl _restvr_28
_restvr_28:
li r12,-64
lvx vr28,r12,r0
.globl _restvr_29
_restvr_29:
li r12,-48
lvx vr29,r12,r0
.globl _restvr_30
_restvr_30:
li r12,-32
lvx vr30,r12,r0
.globl _restvr_31
_restvr_31:
li r12,-16
lvx vr31,r12,r0
blr

#endif /* CONFIG_ALTIVEC */

#endif /* CONFIG_PPC64 */

#endif
8 changes: 6 additions & 2 deletions scripts/mod/modpost.c
Expand Up @@ -573,12 +573,16 @@ static int ignore_undef_symbol(struct elf_info *info, const char *symname)
if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 ||
strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 ||
strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 ||
strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0)
strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0 ||
strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
return 1;
if (info->hdr->e_machine == EM_PPC64)
/* Special register function linked on all modules during final link of .ko */
if (strncmp(symname, "_restgpr0_", sizeof("_restgpr0_") - 1) == 0 ||
strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0)
strncmp(symname, "_savegpr0_", sizeof("_savegpr0_") - 1) == 0 ||
strncmp(symname, "_restvr_", sizeof("_restvr_") - 1) == 0 ||
strncmp(symname, "_savevr_", sizeof("_savevr_") - 1) == 0)
return 1;
/* Do not ignore this symbol */
return 0;
Expand Down

0 comments on commit 70c6edb

Please sign in to comment.