| From: Matt Redfearn <matt.redfearn@mips.com> |
| Date: Tue, 17 Apr 2018 16:40:01 +0100 |
| Subject: MIPS: uaccess: Add micromips clobbers to bzero invocation |
| |
| commit b3d7e55c3f886493235bfee08e1e5a4a27cbcce8 upstream. |
| |
| The micromips implementation of bzero additionally clobbers registers t7 |
| & t8. Specify this in the clobbers list when invoking bzero. |
| |
| Fixes: 26c5e07d1478 ("MIPS: microMIPS: Optimise 'memset' core library function.") |
| Reported-by: James Hogan <jhogan@kernel.org> |
| Signed-off-by: Matt Redfearn <matt.redfearn@mips.com> |
| Cc: Ralf Baechle <ralf@linux-mips.org> |
| Cc: linux-mips@linux-mips.org |
| Patchwork: https://patchwork.linux-mips.org/patch/19110/ |
| Signed-off-by: James Hogan <jhogan@kernel.org> |
| [bwh: Backported to 3.16: adjust context] |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| arch/mips/include/asm/uaccess.h | 11 +++++++++-- |
| 1 file changed, 9 insertions(+), 2 deletions(-) |
| |
| --- a/arch/mips/include/asm/uaccess.h |
| +++ b/arch/mips/include/asm/uaccess.h |
| @@ -1210,6 +1210,13 @@ __clear_user(void __user *addr, __kernel |
| { |
| __kernel_size_t res; |
| |
| +#ifdef CONFIG_CPU_MICROMIPS |
| +/* micromips memset / bzero also clobbers t7 & t8 */ |
| +#define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$15", "$24", "$31" |
| +#else |
| +#define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$31" |
| +#endif /* CONFIG_CPU_MICROMIPS */ |
| + |
| if (config_enabled(CONFIG_EVA) && segment_eq(get_fs(), get_ds())) { |
| __asm__ __volatile__( |
| "move\t$4, %1\n\t" |
| @@ -1219,7 +1226,7 @@ __clear_user(void __user *addr, __kernel |
| "move\t%0, $6" |
| : "=r" (res) |
| : "r" (addr), "r" (size) |
| - : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"); |
| + : bzero_clobbers); |
| } else { |
| might_fault(); |
| __asm__ __volatile__( |
| @@ -1230,7 +1237,7 @@ __clear_user(void __user *addr, __kernel |
| "move\t%0, $6" |
| : "=r" (res) |
| : "r" (addr), "r" (size) |
| - : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"); |
| + : bzero_clobbers); |
| } |
| |
| return res; |