Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Redefine TIF_32BITS thread flag

Moving TIF_32BIT to use bit 20 instead of 4 in the task flag field.

This change is making room for an upcoming new task macro
(_TIF_SYSCALL_EMU) which is preferred to set a bit in the lower 16-bits
part of the word.

This upcoming flag macro will take part in a composed macro
(_TIF_SYSCALL_DOTRACE) which will contain other flags as well, and it is
preferred that the whole _TIF_SYSCALL_DOTRACE macro only sets the lower 16
bits of a word, so, it could be handled using immediate operations (as load
immediate, add immediate, ...) where the immediate operand (SI) is limited
to 16-bits.

Another possible solution would be using the LOAD_REG_IMMEDIATE() macro
to load a full 64-bits word immediate, but it takes 5 operations instead of
one.

Having TIF_32BITS being redefined to use an upper bit is not a problem
since there is only one place in the assembly code where TIF_32BIT is being
used, and it could be replaced with an operation with right shift (addis),
since it is used alone, i.e. not being part of a composed macro, which has
different bits set, and would require LOAD_REG_IMMEDIATE().

Tested on a 64 bits Big Endian machine running a 32 bits task.

Signed-off-by: Breno Leitao <leitao@debian.org>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>

authored by

Breno Leitao and committed by
Michael Ellerman
16d7c69c 06ec27ae

+2 -2
+1 -1
arch/powerpc/include/asm/thread_info.h
··· 81 81 #define TIF_SIGPENDING 1 /* signal pending */ 82 82 #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ 83 83 #define TIF_FSCHECK 3 /* Check FS is USER_DS on return */ 84 - #define TIF_32BIT 4 /* 32 bit binary */ 85 84 #define TIF_RESTORE_TM 5 /* need to restore TM FP/VEC/VSX */ 86 85 #define TIF_PATCH_PENDING 6 /* pending live patching update */ 87 86 #define TIF_SYSCALL_AUDIT 7 /* syscall auditing active */ ··· 99 100 #define TIF_ELF2ABI 18 /* function descriptors must die! */ 100 101 #endif 101 102 #define TIF_POLLING_NRFLAG 19 /* true if poll_idle() is polling TIF_NEED_RESCHED */ 103 + #define TIF_32BIT 20 /* 32 bit binary */ 102 104 103 105 /* as above, but as bit values */ 104 106 #define _TIF_SYSCALL_TRACE (1<<TIF_SYSCALL_TRACE)
+1 -1
arch/powerpc/kernel/entry_64.S
··· 171 171 * based on caller's run-mode / personality. 172 172 */ 173 173 ld r11,SYS_CALL_TABLE@toc(2) 174 - andi. r10,r10,_TIF_32BIT 174 + andis. r10,r10,_TIF_32BIT@h 175 175 beq 15f 176 176 addi r11,r11,8 /* use 32-bit syscall entries */ 177 177 clrldi r3,r3,32