| From 8fe9c93e7453e67b8bd09f263ec1bb0783c733fc Mon Sep 17 00:00:00 2001 |
| From: Andreas Schwab <schwab@linux-m68k.org> |
| Date: Mon, 30 Dec 2013 15:31:17 +0100 |
| Subject: powerpc: Add vr save/restore functions |
| |
| From: Andreas Schwab <schwab@linux-m68k.org> |
| |
| commit 8fe9c93e7453e67b8bd09f263ec1bb0783c733fc 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> |
| |
| --- |
| arch/powerpc/lib/crtsavres.S | 186 +++++++++++++++++++++++++++++++++++++++++++ |
| scripts/mod/modpost.c | 8 + |
| 2 files changed, 192 insertions(+), 2 deletions(-) |
| |
| --- a/arch/powerpc/lib/crtsavres.S |
| +++ b/arch/powerpc/lib/crtsavres.S |
| @@ -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 |
| @@ -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 |
| --- a/scripts/mod/modpost.c |
| +++ b/scripts/mod/modpost.c |
| @@ -573,12 +573,16 @@ static int ignore_undef_symbol(struct el |
| 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; |