• Christophe Leroy's avatar
    powerpc/kuap: Fix set direction in allow/prevent_user_access() · 1d8f739b
    Christophe Leroy authored
    __builtin_constant_p() always return 0 for pointers, so on RADIX
    we always end up opening both direction (by writing 0 in SPR29):
    
      0000000000000170 <._copy_to_user>:
      ...
       1b0:	4c 00 01 2c 	isync
       1b4:	39 20 00 00 	li      r9,0
       1b8:	7d 3d 03 a6 	mtspr   29,r9
       1bc:	4c 00 01 2c 	isync
       1c0:	48 00 00 01 	bl      1c0 <._copy_to_user+0x50>
      			1c0: R_PPC64_REL24	.__copy_tofrom_user
      ...
      0000000000000220 <._copy_from_user>:
      ...
       2ac:	4c 00 01 2c 	isync
       2b0:	39 20 00 00 	li      r9,0
       2b4:	7d 3d 03 a6 	mtspr   29,r9
       2b8:	4c 00 01 2c 	isync
       2bc:	7f c5 f3 78 	mr      r5,r30
       2c0:	7f 83 e3 78 	mr      r3,r28
       2c4:	48 00 00 01 	bl      2c4 <._copy_from_user+0xa4>
      			2c4: R_PPC64_REL24	.__copy_tofrom_user
      ...
    
    Use an explicit parameter for direction selection, so that GCC
    is able to see it is a constant:
    
      00000000000001b0 <._copy_to_user>:
      ...
       1f0:	4c 00 01 2c 	isync
       1f4:	3d 20 40 00 	lis     r9,16384
       1f8:	79 29 07 c6 	rldicr  r9,r9,32,31
       1fc:	7d 3d 03 a6 	mtspr   29,r9
       200:	4c 00 01 2c 	isync
       204:	48 00 00 01 	bl      204 <._copy_to_user+0x54>
      			204: R_PPC64_REL24	.__copy_tofrom_user
      ...
      0000000000000260 <._copy_from_user>:
      ...
       2ec:	4c 00 01 2c 	isync
       2f0:	39 20 ff ff 	li      r9,-1
       2f4:	79 29 00 04 	rldicr  r9,r9,0,0
       2f8:	7d 3d 03 a6 	mtspr   29,r9
       2fc:	4c 00 01 2c 	isync
       300:	7f c5 f3 78 	mr      r5,r30
       304:	7f 83 e3 78 	mr      r3,r28
       308:	48 00 00 01 	bl      308 <._copy_from_user+0xa8>
      			308: R_PPC64_REL24	.__copy_tofrom_user
      ...
    Signed-off-by: default avatarChristophe Leroy <christophe.leroy@c-s.fr>
    [mpe: Spell out the directions, s/KUAP_R/KUAP_READ/ etc.]
    Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
    Link: https://lore.kernel.org/r/f4e88ec4941d5facb35ce75026b0112f980086c3.1579866752.git.christophe.leroy@c-s.fr
    1d8f739b
kup-radix.h 2.91 KB