mirror of
https://github.com/torvalds/linux.git
synced 2026-10-07 05:31:08 -04:00
x86, mm: Use a bitfield to mask nuisance get_user() warnings
Even though it is never executed, gcc wants to warn for casting from a large integer to a pointer. Furthermore, using a variable with __typeof__() doesn't work because __typeof__ retains storage specifiers (const, restrict, volatile). However, we can declare a bitfield using sizeof(), which is legal because sizeof() is a constant expression. This quiets the warning, although the code generated isn't 100% identical from the baseline before96477b4x86-32: Add support for 64bit get_user(): [x86-mb is baseline, x86-mm is this commit] text data bss filename 113716147 15858380 35037184 tip.x86-mb/o.i386-allconfig/vmlinux 113716145 15858380 35037184 tip.x86-mm/o.i386-allconfig/vmlinux 12989837359794412255232 tip.x86-mb/o.i386-modconfig/vmlinux 12989831359794412255232 tip.x86-mm/o.i386-modconfig/vmlinux 1462784 237608 1401988 tip.x86-mb/o.i386-noconfig/vmlinux 1462837 237608 1401964 tip.x86-mm/o.i386-noconfig/vmlinux 7938994 553688 7639040 tip.x86-mb/o.i386-pae/vmlinux 7943136 557784 7639040 tip.x86-mm/o.i386-pae/vmlinux7186126510572 6574080 tip.x86-mb/o.i386/vmlinux 7186124 510572 6574080 tip.x86-mm/o.i386/vmlinux 103747269 33578856 65888256 tip.x86-mb/o.x86_64-allconfig/vmlinux 103746949 33578856 65888256 tip.x86-mm/o.x86_64-allconfig/vmlinux 12116695 11035832 20160512 tip.x86-mb/o.x86_64-modconfig/vmlinux 12116567 11035832 20160512 tip.x86-mm/o.x86_64-modconfig/vmlinux 1700790 380524 511808 tip.x86-mb/o.x86_64-noconfig/vmlinux 1700790 380524 511808 tip.x86-mm/o.x86_64-noconfig/vmlinux 12413612 1133376 1101824 tip.x86-mb/o.x86_64/vmlinux 12413484 1133376 1101824 tip.x86-mm/o.x86_64/vmlinux Cc: Jamie Lokier <[email protected]> Cc: Ville Syrjälä <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Russell King <[email protected]> Cc: Linus Torvalds <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: H. Peter Anvin <[email protected]>
This commit is contained in:
1 parent
136867f517
commit
b390784dc1
1 file changed
+9
-11
@@ -168,31 +168,29 @@ do { \
|
||||
#define get_user(x, ptr) \
|
||||
({ \
|
||||
int __ret_gu; \
|
||||
unsigned long __val_gu; \
|
||||
unsigned long long __val_gu8; \
|
||||
struct { \
|
||||
unsigned long long __val_n : 8*sizeof(*(ptr)); \
|
||||
} __val_gu; \
|
||||
__chk_user_ptr(ptr); \
|
||||
might_fault(); \
|
||||
switch (sizeof(*(ptr))) { \
|
||||
case 1: \
|
||||
__get_user_x(1, __ret_gu, __val_gu, ptr); \
|
||||
__get_user_x(1, __ret_gu, __val_gu.__val_n, ptr); \
|
||||
break; \
|
||||
case 2: \
|
||||
__get_user_x(2, __ret_gu, __val_gu, ptr); \
|
||||
__get_user_x(2, __ret_gu, __val_gu.__val_n, ptr); \
|
||||
break; \
|
||||
case 4: \
|
||||
__get_user_x(4, __ret_gu, __val_gu, ptr); \
|
||||
__get_user_x(4, __ret_gu, __val_gu.__val_n, ptr); \
|
||||
break; \
|
||||
case 8: \
|
||||
__get_user_8(__ret_gu, __val_gu8, ptr); \
|
||||
__get_user_8(__ret_gu, __val_gu.__val_n, ptr); \
|
||||
break; \
|
||||
default: \
|
||||
__get_user_x(X, __ret_gu, __val_gu, ptr); \
|
||||
__get_user_x(X, __ret_gu, __val_gu.__val_n, ptr); \
|
||||
break; \
|
||||
} \
|
||||
if (sizeof(*(ptr)) == 8) \
|
||||
(x) = (__typeof__(*(ptr)))__val_gu8; \
|
||||
else \
|
||||
(x) = (__typeof__(*(ptr)))__val_gu; \
|
||||
(x) = (__typeof__(*(ptr)))__val_gu.__val_n; \
|
||||
__ret_gu; \
|
||||
})
|
||||
|
||||
|
||||
Reference in new issue
Block a user