Messages in this thread | | | Subject | GCC bug ? Re: [PATCH v2 10/10] powerpc/32s: Implement Kernel Userspace Access Protection | From | Christophe Leroy <> | Date | Tue, 21 Jan 2020 17:22:32 +0000 |
| |
On 04/18/2019 06:55 AM, Michael Ellerman wrote: > Christophe Leroy <christophe.leroy@c-s.fr> writes: >> diff --git a/arch/powerpc/include/asm/book3s/32/kup.h b/arch/powerpc/include/asm/book3s/32/kup.h >> index 5f97c742ca71..b3560b2de435 100644 >> --- a/arch/powerpc/include/asm/book3s/32/kup.h >> +++ b/arch/powerpc/include/asm/book3s/32/kup.h >> @@ -37,6 +37,113 @@ > ... >> + >> +static inline void allow_user_access(void __user *to, const void __user *from, u32 size) >> +{ >> + u32 addr = (__force u32)to; >> + u32 end = min(addr + size, TASK_SIZE); >> + >> + if (!addr || addr >= TASK_SIZE || !size) >> + return; >> + >> + current->thread.kuap = (addr & 0xf0000000) | ((((end - 1) >> 28) + 1) & 0xf); >> + kuap_update_sr(mfsrin(addr) & ~SR_KS, addr, end); /* Clear Ks */ >> +} > > When rebasing on my v6 I changed the above to: > > static inline void allow_user_access(void __user *to, const void __user *from, u32 size) > { > u32 addr, end; > > if (__builtin_constant_p(to) && to == NULL) > return;
Look like the above doesn't work: gcc bug ?
#define NULL (void*)0
static inline int f1(void *to) { if (__builtin_constant_p(to) && to == NULL) return 3; return 5; }
int g1(void) { return f1(NULL); }
static inline int f2(int x) { if (__builtin_constant_p(x) && x == 0) return 7; return 9; }
int g2(void) { return f2(0); }
toto.o: file format elf32-powerpc
Disassembly of section .text:
00000000 <g1>: 0: 38 60 00 05 li r3,5 4: 4e 80 00 20 blr
00000008 <g2>: 8: 38 60 00 07 li r3,7 c: 4e 80 00 20 blr
It works for the int const, but not for the pointer const:
g1() should return 3, not 5. GCC bug ?
Christophe
| |