| From foo@baz Tue Oct 28 11:21:06 CST 2014 |
| From: "David S. Miller" <davem@davemloft.net> |
| Date: Sat, 18 Oct 2014 23:12:33 -0400 |
| Subject: sparc64: Do not define thread fpregs save area as zero-length array. |
| |
| From: "David S. Miller" <davem@davemloft.net> |
| |
| [ Upstream commit e2653143d7d79a49f1a961aeae1d82612838b12c ] |
| |
| This breaks the stack end corruption detection facility. |
| |
| What that facility does it write a magic value to "end_of_stack()" |
| and checking to see if it gets overwritten. |
| |
| "end_of_stack()" is "task_thread_info(p) + 1", which for sparc64 is |
| the beginning of the FPU register save area. |
| |
| So once the user uses the FPU, the magic value is overwritten and the |
| debug checks trigger. |
| |
| Fix this by making the size explicit. |
| |
| Due to the size we use for the fpsaved[], gsr[], and xfsr[] arrays we |
| are limited to 7 levels of FPU state saves. So each FPU register set |
| is 256 bytes, allocate 256 * 7 for the fpregs area. |
| |
| Reported-by: Meelis Roos <mroos@linux.ee> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/sparc/include/asm/thread_info_64.h | 3 ++- |
| 1 file changed, 2 insertions(+), 1 deletion(-) |
| |
| --- a/arch/sparc/include/asm/thread_info_64.h |
| +++ b/arch/sparc/include/asm/thread_info_64.h |
| @@ -63,7 +63,8 @@ struct thread_info { |
| struct pt_regs *kern_una_regs; |
| unsigned int kern_una_insn; |
| |
| - unsigned long fpregs[0] __attribute__ ((aligned(64))); |
| + unsigned long fpregs[(7 * 256) / sizeof(unsigned long)] |
| + __attribute__ ((aligned(64))); |
| }; |
| |
| #endif /* !(__ASSEMBLY__) */ |