]> git.karo-electronics.de Git - linux-beck.git/commitdiff
MIPS: 16 byte align MSA vector context
authorPaul Burton <paul.burton@imgtec.com>
Fri, 11 Jul 2014 15:46:54 +0000 (16:46 +0100)
committerRalf Baechle <ralf@linux-mips.org>
Fri, 1 Aug 2014 22:06:44 +0000 (00:06 +0200)
The MSA specification upon first read appears to suggest that it is safe
to perform vector loads & stores with arbitrary alignment. However it
leaves provision for "address-dependent exceptions"... Align the vector
context to a 16 byte boundary to ensure that the kernel cannot cause any
such exceptions.

Note that the fpu field of struct thread_struct was already at a 16 byte
boundary within the struct, the introduction of FPU_ALIGN simply makes
the requirement explicit. The only part of this impacting the generated
kernel binary is ARCH_MIN_TASKALIGN.

Signed-off-by: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/7308/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
arch/mips/include/asm/processor.h

index ad70cba8daffaeaeb7f62a7a47308dc1597a8be4..5733faba4f7f74295a28f571adede04a43e8f8b5 100644 (file)
@@ -238,7 +238,13 @@ typedef struct {
        unsigned long seg;
 } mm_segment_t;
 
-#define ARCH_MIN_TASKALIGN     8
+#ifdef CONFIG_CPU_HAS_MSA
+# define ARCH_MIN_TASKALIGN    16
+# define FPU_ALIGN             __aligned(16)
+#else
+# define ARCH_MIN_TASKALIGN    8
+# define FPU_ALIGN
+#endif
 
 struct mips_abi;
 
@@ -255,7 +261,7 @@ struct thread_struct {
        unsigned long cp0_status;
 
        /* Saved fpu/fpu emulator stuff. */
-       struct mips_fpu_struct fpu;
+       struct mips_fpu_struct fpu FPU_ALIGN;
 #ifdef CONFIG_MIPS_MT_FPAFF
        /* Emulated instruction count */
        unsigned long emulated_fp;