diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-13 13:43:04 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-02-13 13:43:04 -0500 |
| commit | f1252515d901ee2a184a9d49a7f29ae14da823eb (patch) | |
| tree | deb2cd0776ace4fdb9614eb7f161e89dd2d76ee5 | |
| parent | 8329aa9fff3fca84009e6a444d8d160193643bac (diff) | |
| parent | 740e1433f50e6d0f1c4705c1a963645072f5a74c (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile
Pull arch/tile changes from Chris Metcalf:
"Not much in this batch, just some minor cleanups"
* git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile:
tile: change MAINTAINERS website from tilera.com to ezchip.com
tile: enable sparse checks for get/put_user
tile: fix put_user sparse errors
tile: default to little endian on older toolchains
| -rw-r--r-- | MAINTAINERS | 2 | ||||
| -rw-r--r-- | arch/tile/include/asm/uaccess.h | 37 | ||||
| -rw-r--r-- | arch/tile/include/uapi/asm/byteorder.h | 4 |
3 files changed, 22 insertions, 21 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index 482bfc55397d..debe74cde67b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -9726,7 +9726,7 @@ F: net/tipc/ | |||
| 9726 | 9726 | ||
| 9727 | TILE ARCHITECTURE | 9727 | TILE ARCHITECTURE |
| 9728 | M: Chris Metcalf <cmetcalf@ezchip.com> | 9728 | M: Chris Metcalf <cmetcalf@ezchip.com> |
| 9729 | W: http://www.tilera.com/scm/ | 9729 | W: http://www.ezchip.com/scm/ |
| 9730 | S: Supported | 9730 | S: Supported |
| 9731 | F: arch/tile/ | 9731 | F: arch/tile/ |
| 9732 | F: drivers/char/tile-srom.c | 9732 | F: drivers/char/tile-srom.c |
diff --git a/arch/tile/include/asm/uaccess.h b/arch/tile/include/asm/uaccess.h index b6cde3209b96..f41cb53cf645 100644 --- a/arch/tile/include/asm/uaccess.h +++ b/arch/tile/include/asm/uaccess.h | |||
| @@ -114,14 +114,14 @@ struct exception_table_entry { | |||
| 114 | extern int fixup_exception(struct pt_regs *regs); | 114 | extern int fixup_exception(struct pt_regs *regs); |
| 115 | 115 | ||
| 116 | /* | 116 | /* |
| 117 | * This is a type: either unsigned long, if the argument fits into | ||
| 118 | * that type, or otherwise unsigned long long. | ||
| 119 | */ | ||
| 120 | #define __inttype(x) \ | ||
| 121 | __typeof__(__builtin_choose_expr(sizeof(x) > sizeof(0UL), 0ULL, 0UL)) | ||
| 122 | |||
| 123 | /* | ||
| 117 | * Support macros for __get_user(). | 124 | * Support macros for __get_user(). |
| 118 | * | ||
| 119 | * Implementation note: The "case 8" logic of casting to the type of | ||
| 120 | * the result of subtracting the value from itself is basically a way | ||
| 121 | * of keeping all integer types the same, but casting any pointers to | ||
| 122 | * ptrdiff_t, i.e. also an integer type. This way there are no | ||
| 123 | * questionable casts seen by the compiler on an ILP32 platform. | ||
| 124 | * | ||
| 125 | * Note that __get_user() and __put_user() assume proper alignment. | 125 | * Note that __get_user() and __put_user() assume proper alignment. |
| 126 | */ | 126 | */ |
| 127 | 127 | ||
| @@ -178,7 +178,7 @@ extern int fixup_exception(struct pt_regs *regs); | |||
| 178 | "9:" \ | 178 | "9:" \ |
| 179 | : "=r" (ret), "=r" (__a), "=&r" (__b) \ | 179 | : "=r" (ret), "=r" (__a), "=&r" (__b) \ |
| 180 | : "r" (ptr), "i" (-EFAULT)); \ | 180 | : "r" (ptr), "i" (-EFAULT)); \ |
| 181 | (x) = (__typeof(x))(__typeof((x)-(x))) \ | 181 | (x) = (__force __typeof(x))(__inttype(x)) \ |
| 182 | (((u64)__hi32(__a, __b) << 32) | \ | 182 | (((u64)__hi32(__a, __b) << 32) | \ |
| 183 | __lo32(__a, __b)); \ | 183 | __lo32(__a, __b)); \ |
| 184 | }) | 184 | }) |
| @@ -210,14 +210,16 @@ extern int __get_user_bad(void) | |||
| 210 | #define __get_user(x, ptr) \ | 210 | #define __get_user(x, ptr) \ |
| 211 | ({ \ | 211 | ({ \ |
| 212 | int __ret; \ | 212 | int __ret; \ |
| 213 | typeof(x) _x; \ | ||
| 213 | __chk_user_ptr(ptr); \ | 214 | __chk_user_ptr(ptr); \ |
| 214 | switch (sizeof(*(ptr))) { \ | 215 | switch (sizeof(*(ptr))) { \ |
| 215 | case 1: __get_user_1(x, ptr, __ret); break; \ | 216 | case 1: __get_user_1(_x, ptr, __ret); break; \ |
| 216 | case 2: __get_user_2(x, ptr, __ret); break; \ | 217 | case 2: __get_user_2(_x, ptr, __ret); break; \ |
| 217 | case 4: __get_user_4(x, ptr, __ret); break; \ | 218 | case 4: __get_user_4(_x, ptr, __ret); break; \ |
| 218 | case 8: __get_user_8(x, ptr, __ret); break; \ | 219 | case 8: __get_user_8(_x, ptr, __ret); break; \ |
| 219 | default: __ret = __get_user_bad(); break; \ | 220 | default: __ret = __get_user_bad(); break; \ |
| 220 | } \ | 221 | } \ |
| 222 | (x) = (typeof(*(ptr))) _x; \ | ||
| 221 | __ret; \ | 223 | __ret; \ |
| 222 | }) | 224 | }) |
| 223 | 225 | ||
| @@ -246,7 +248,7 @@ extern int __get_user_bad(void) | |||
| 246 | #define __put_user_4(x, ptr, ret) __put_user_asm(sw, x, ptr, ret) | 248 | #define __put_user_4(x, ptr, ret) __put_user_asm(sw, x, ptr, ret) |
| 247 | #define __put_user_8(x, ptr, ret) \ | 249 | #define __put_user_8(x, ptr, ret) \ |
| 248 | ({ \ | 250 | ({ \ |
| 249 | u64 __x = (__typeof((x)-(x)))(x); \ | 251 | u64 __x = (__force __inttype(x))(x); \ |
| 250 | int __lo = (int) __x, __hi = (int) (__x >> 32); \ | 252 | int __lo = (int) __x, __hi = (int) (__x >> 32); \ |
| 251 | asm volatile("1: { sw %1, %2; addi %0, %1, 4 }\n" \ | 253 | asm volatile("1: { sw %1, %2; addi %0, %1, 4 }\n" \ |
| 252 | "2: { sw %0, %3; movei %0, 0 }\n" \ | 254 | "2: { sw %0, %3; movei %0, 0 }\n" \ |
| @@ -289,12 +291,13 @@ extern int __put_user_bad(void) | |||
| 289 | #define __put_user(x, ptr) \ | 291 | #define __put_user(x, ptr) \ |
| 290 | ({ \ | 292 | ({ \ |
| 291 | int __ret; \ | 293 | int __ret; \ |
| 294 | typeof(*(ptr)) _x = (x); \ | ||
| 292 | __chk_user_ptr(ptr); \ | 295 | __chk_user_ptr(ptr); \ |
| 293 | switch (sizeof(*(ptr))) { \ | 296 | switch (sizeof(*(ptr))) { \ |
| 294 | case 1: __put_user_1(x, ptr, __ret); break; \ | 297 | case 1: __put_user_1(_x, ptr, __ret); break; \ |
| 295 | case 2: __put_user_2(x, ptr, __ret); break; \ | 298 | case 2: __put_user_2(_x, ptr, __ret); break; \ |
| 296 | case 4: __put_user_4(x, ptr, __ret); break; \ | 299 | case 4: __put_user_4(_x, ptr, __ret); break; \ |
| 297 | case 8: __put_user_8(x, ptr, __ret); break; \ | 300 | case 8: __put_user_8(_x, ptr, __ret); break; \ |
| 298 | default: __ret = __put_user_bad(); break; \ | 301 | default: __ret = __put_user_bad(); break; \ |
| 299 | } \ | 302 | } \ |
| 300 | __ret; \ | 303 | __ret; \ |
diff --git a/arch/tile/include/uapi/asm/byteorder.h b/arch/tile/include/uapi/asm/byteorder.h index fb72ecf49218..6b8fa2e1cf6e 100644 --- a/arch/tile/include/uapi/asm/byteorder.h +++ b/arch/tile/include/uapi/asm/byteorder.h | |||
| @@ -14,8 +14,6 @@ | |||
| 14 | 14 | ||
| 15 | #if defined (__BIG_ENDIAN__) | 15 | #if defined (__BIG_ENDIAN__) |
| 16 | #include <linux/byteorder/big_endian.h> | 16 | #include <linux/byteorder/big_endian.h> |
| 17 | #elif defined (__LITTLE_ENDIAN__) | ||
| 18 | #include <linux/byteorder/little_endian.h> | ||
| 19 | #else | 17 | #else |
| 20 | #error "__BIG_ENDIAN__ or __LITTLE_ENDIAN__ must be defined." | 18 | #include <linux/byteorder/little_endian.h> |
| 21 | #endif | 19 | #endif |
