Commit 38696e33 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'xtensa-20200603' of git://github.com/jcmvbkbc/linux-xtensa

Pull Xtensa updates from Max Filippov:

 - fix __user annotations in asm/uaccess.h

 - fix comments in entry.S

* tag 'xtensa-20200603' of git://github.com/jcmvbkbc/linux-xtensa:
  xtensa: Fix spelling/grammar in comment
  xtensa: add missing __user annotations to asm/uaccess.h
  xtensa: fix error paths in __get_user_{check,size}
  xtensa: fix type conversion in __get_user_size
  xtensa: add missing __user annotations to __{get,put}_user_check
parents 44e40e96 3ead2f97
...@@ -84,7 +84,7 @@ extern long __put_user_bad(void); ...@@ -84,7 +84,7 @@ extern long __put_user_bad(void);
#define __put_user_check(x, ptr, size) \ #define __put_user_check(x, ptr, size) \
({ \ ({ \
long __pu_err = -EFAULT; \ long __pu_err = -EFAULT; \
__typeof__(*(ptr)) *__pu_addr = (ptr); \ __typeof__(*(ptr)) __user *__pu_addr = (ptr); \
if (access_ok(__pu_addr, size)) \ if (access_ok(__pu_addr, size)) \
__put_user_size((x), __pu_addr, (size), __pu_err); \ __put_user_size((x), __pu_addr, (size), __pu_err); \
__pu_err; \ __pu_err; \
...@@ -180,11 +180,11 @@ __asm__ __volatile__( \ ...@@ -180,11 +180,11 @@ __asm__ __volatile__( \
#define __get_user_check(x, ptr, size) \ #define __get_user_check(x, ptr, size) \
({ \ ({ \
long __gu_err = -EFAULT; \ long __gu_err = -EFAULT; \
const __typeof__(*(ptr)) *__gu_addr = (ptr); \ const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
if (access_ok(__gu_addr, size)) \ if (access_ok(__gu_addr, size)) \
__get_user_size((x), __gu_addr, (size), __gu_err); \ __get_user_size((x), __gu_addr, (size), __gu_err); \
else \ else \
(x) = 0; \ (x) = (__typeof__(*(ptr)))0; \
__gu_err; \ __gu_err; \
}) })
...@@ -202,13 +202,15 @@ do { \ ...@@ -202,13 +202,15 @@ do { \
u64 __x; \ u64 __x; \
if (unlikely(__copy_from_user(&__x, ptr, 8))) { \ if (unlikely(__copy_from_user(&__x, ptr, 8))) { \
retval = -EFAULT; \ retval = -EFAULT; \
(x) = 0; \ (x) = (__typeof__(*(ptr)))0; \
} else { \ } else { \
(x) = *(__force __typeof__((ptr)))&__x; \ (x) = *(__force __typeof__(*(ptr)) *)&__x; \
} \ } \
break; \ break; \
} \ } \
default: (x) = 0; __get_user_bad(); \ default: \
(x) = (__typeof__(*(ptr)))0; \
__get_user_bad(); \
} \ } \
} while (0) } while (0)
...@@ -270,15 +272,15 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n) ...@@ -270,15 +272,15 @@ raw_copy_to_user(void __user *to, const void *from, unsigned long n)
*/ */
static inline unsigned long static inline unsigned long
__xtensa_clear_user(void *addr, unsigned long size) __xtensa_clear_user(void __user *addr, unsigned long size)
{ {
if (!__memset(addr, 0, size)) if (!__memset((void __force *)addr, 0, size))
return size; return size;
return 0; return 0;
} }
static inline unsigned long static inline unsigned long
clear_user(void *addr, unsigned long size) clear_user(void __user *addr, unsigned long size)
{ {
if (access_ok(addr, size)) if (access_ok(addr, size))
return __xtensa_clear_user(addr, size); return __xtensa_clear_user(addr, size);
...@@ -290,10 +292,10 @@ clear_user(void *addr, unsigned long size) ...@@ -290,10 +292,10 @@ clear_user(void *addr, unsigned long size)
#ifndef CONFIG_GENERIC_STRNCPY_FROM_USER #ifndef CONFIG_GENERIC_STRNCPY_FROM_USER
extern long __strncpy_user(char *, const char *, long); extern long __strncpy_user(char *dst, const char __user *src, long count);
static inline long static inline long
strncpy_from_user(char *dst, const char *src, long count) strncpy_from_user(char *dst, const char __user *src, long count)
{ {
if (access_ok(src, 1)) if (access_ok(src, 1))
return __strncpy_user(dst, src, count); return __strncpy_user(dst, src, count);
...@@ -306,13 +308,11 @@ long strncpy_from_user(char *dst, const char *src, long count); ...@@ -306,13 +308,11 @@ long strncpy_from_user(char *dst, const char *src, long count);
/* /*
* Return the size of a string (including the ending 0!) * Return the size of a string (including the ending 0!)
*/ */
extern long __strnlen_user(const char *, long); extern long __strnlen_user(const char __user *str, long len);
static inline long strnlen_user(const char *str, long len) static inline long strnlen_user(const char __user *str, long len)
{ {
unsigned long top = __kernel_ok ? ~0UL : TASK_SIZE - 1; if (!access_ok(str, 1))
if ((unsigned long)str > top)
return 0; return 0;
return __strnlen_user(str, len); return __strnlen_user(str, len);
} }
......
...@@ -959,14 +959,14 @@ ENDPROC(unrecoverable_exception) ...@@ -959,14 +959,14 @@ ENDPROC(unrecoverable_exception)
* of the proper size instead. * of the proper size instead.
* *
* This algorithm simply backs out the register changes started by the user * This algorithm simply backs out the register changes started by the user
* excpetion handler, makes it appear that we have started a window underflow * exception handler, makes it appear that we have started a window underflow
* by rotating the window back and then setting the old window base (OWB) in * by rotating the window back and then setting the old window base (OWB) in
* the 'ps' register with the rolled back window base. The 'movsp' instruction * the 'ps' register with the rolled back window base. The 'movsp' instruction
* will be re-executed and this time since the next window frames is in the * will be re-executed and this time since the next window frames is in the
* active AR registers it won't cause an exception. * active AR registers it won't cause an exception.
* *
* If the WindowUnderflow code gets a TLB miss the page will get mapped * If the WindowUnderflow code gets a TLB miss the page will get mapped
* the the partial windeowUnderflow will be handeled in the double exception * the partial WindowUnderflow will be handled in the double exception
* handler. * handler.
* *
* Entry condition: * Entry condition:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment