summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiaxun Yang <jiaxun.yang@flygoat.com>2019-09-27 01:33:39 -0400
committerPaul Burton <paul.burton@mips.com>2019-10-01 15:59:59 -0400
commitd345d9cad22532ac18afa70efa0506b1d8cface5 (patch)
treeeecd0a460bcb0e1af35f2003d20856ead14c3f7f
parent0889d07f3e4b171c453b2aaf2b257f9074cdf624 (diff)
MIPS: cpu-bugs64: Mark inline functions as __always_inline
Commit ac7c3e4ff401 ("compiler: enable CONFIG_OPTIMIZE_INLINING forcibly") allows compiler to uninline functions marked as 'inline'. Leading to section mismatch in this case. Since we're using const variables to pass assembly flags, 'inline's can't be dropped. So we simply mark them as __always_inline. Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com> Cc: linux-mips@vger.kernel.org [paul.burton@mips.com: - Annotate these functions with __init, even if it only serves to inform human readers when the code can be used. - Drop the __always_inline from check_daddi() & check_daddiu() which don't use arguments as immediates in inline asm. - Rewrap the commit message.] Signed-off-by: Paul Burton <paul.burton@mips.com>
-rw-r--r--arch/mips/kernel/cpu-bugs64.c14
1 files changed, 8 insertions, 6 deletions
diff --git a/arch/mips/kernel/cpu-bugs64.c b/arch/mips/kernel/cpu-bugs64.c
index fa62cd1dff93..6a7afe7ef4d3 100644
--- a/arch/mips/kernel/cpu-bugs64.c
+++ b/arch/mips/kernel/cpu-bugs64.c
@@ -24,7 +24,8 @@ static char r4kwar[] __initdata =
24static char daddiwar[] __initdata = 24static char daddiwar[] __initdata =
25 "Enable CPU_DADDI_WORKAROUNDS to rectify."; 25 "Enable CPU_DADDI_WORKAROUNDS to rectify.";
26 26
27static inline void align_mod(const int align, const int mod) 27static __always_inline __init
28void align_mod(const int align, const int mod)
28{ 29{
29 asm volatile( 30 asm volatile(
30 ".set push\n\t" 31 ".set push\n\t"
@@ -38,8 +39,9 @@ static inline void align_mod(const int align, const int mod)
38 : "n"(align), "n"(mod)); 39 : "n"(align), "n"(mod));
39} 40}
40 41
41static __always_inline void mult_sh_align_mod(long *v1, long *v2, long *w, 42static __always_inline __init
42 const int align, const int mod) 43void mult_sh_align_mod(long *v1, long *v2, long *w,
44 const int align, const int mod)
43{ 45{
44 unsigned long flags; 46 unsigned long flags;
45 int m1, m2; 47 int m1, m2;
@@ -113,7 +115,7 @@ static __always_inline void mult_sh_align_mod(long *v1, long *v2, long *w,
113 *w = lw; 115 *w = lw;
114} 116}
115 117
116static inline void check_mult_sh(void) 118static __always_inline __init void check_mult_sh(void)
117{ 119{
118 long v1[8], v2[8], w[8]; 120 long v1[8], v2[8], w[8];
119 int bug, fix, i; 121 int bug, fix, i;
@@ -176,7 +178,7 @@ asmlinkage void __init do_daddi_ov(struct pt_regs *regs)
176 exception_exit(prev_state); 178 exception_exit(prev_state);
177} 179}
178 180
179static inline void check_daddi(void) 181static __init void check_daddi(void)
180{ 182{
181 extern asmlinkage void handle_daddi_ov(void); 183 extern asmlinkage void handle_daddi_ov(void);
182 unsigned long flags; 184 unsigned long flags;
@@ -242,7 +244,7 @@ static inline void check_daddi(void)
242 244
243int daddiu_bug = IS_ENABLED(CONFIG_CPU_MIPSR6) ? 0 : -1; 245int daddiu_bug = IS_ENABLED(CONFIG_CPU_MIPSR6) ? 0 : -1;
244 246
245static inline void check_daddiu(void) 247static __init void check_daddiu(void)
246{ 248{
247 long v, w, tmp; 249 long v, w, tmp;
248 250