aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/mips/include/asm/uaccess.h11
1 files changed, 9 insertions, 2 deletions
diff --git a/arch/mips/include/asm/uaccess.h b/arch/mips/include/asm/uaccess.h
index b71306947290..06629011a434 100644
--- a/arch/mips/include/asm/uaccess.h
+++ b/arch/mips/include/asm/uaccess.h
@@ -654,6 +654,13 @@ __clear_user(void __user *addr, __kernel_size_t size)
654{ 654{
655 __kernel_size_t res; 655 __kernel_size_t res;
656 656
657#ifdef CONFIG_CPU_MICROMIPS
658/* micromips memset / bzero also clobbers t7 & t8 */
659#define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$15", "$24", "$31"
660#else
661#define bzero_clobbers "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"
662#endif /* CONFIG_CPU_MICROMIPS */
663
657 if (eva_kernel_access()) { 664 if (eva_kernel_access()) {
658 __asm__ __volatile__( 665 __asm__ __volatile__(
659 "move\t$4, %1\n\t" 666 "move\t$4, %1\n\t"
@@ -663,7 +670,7 @@ __clear_user(void __user *addr, __kernel_size_t size)
663 "move\t%0, $6" 670 "move\t%0, $6"
664 : "=r" (res) 671 : "=r" (res)
665 : "r" (addr), "r" (size) 672 : "r" (addr), "r" (size)
666 : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"); 673 : bzero_clobbers);
667 } else { 674 } else {
668 might_fault(); 675 might_fault();
669 __asm__ __volatile__( 676 __asm__ __volatile__(
@@ -674,7 +681,7 @@ __clear_user(void __user *addr, __kernel_size_t size)
674 "move\t%0, $6" 681 "move\t%0, $6"
675 : "=r" (res) 682 : "=r" (res)
676 : "r" (addr), "r" (size) 683 : "r" (addr), "r" (size)
677 : "$4", "$5", "$6", __UA_t0, __UA_t1, "$31"); 684 : bzero_clobbers);
678 } 685 }
679 686
680 return res; 687 return res;