hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/arch/powerpc/kernel/entry_64.S
....@@ -176,7 +176,7 @@
176176 * based on caller's run-mode / personality.
177177 */
178178 ld r11,SYS_CALL_TABLE@toc(2)
179
- andi. r10,r10,_TIF_32BIT
179
+ andis. r10,r10,_TIF_32BIT@h
180180 beq 15f
181181 addi r11,r11,8 /* use 32-bit syscall entries */
182182 clrldi r3,r3,32
....@@ -250,7 +250,9 @@
250250
251251 ld r9,TI_FLAGS(r12)
252252 li r11,-MAX_ERRNO
253
- andi. r0,r9,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)
253
+ lis r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@h
254
+ ori r0,r0,(_TIF_SYSCALL_DOTRACE|_TIF_SINGLESTEP|_TIF_USER_WORK_MASK|_TIF_PERSYSCALL_MASK)@l
255
+ and. r0,r9,r0
254256 bne- .Lsyscall_exit_work
255257
256258 andi. r0,r8,MSR_FP
....@@ -363,25 +365,25 @@
363365 /* If TIF_RESTOREALL is set, don't scribble on either r3 or ccr.
364366 If TIF_NOERROR is set, just save r3 as it is. */
365367
366
- andi. r0,r9,_TIF_RESTOREALL
368
+ andis. r0,r9,_TIF_RESTOREALL@h
367369 beq+ 0f
368370 REST_NVGPRS(r1)
369371 b 2f
370372 0: cmpld r3,r11 /* r11 is -MAX_ERRNO */
371373 blt+ 1f
372
- andi. r0,r9,_TIF_NOERROR
374
+ andis. r0,r9,_TIF_NOERROR@h
373375 bne- 1f
374376 ld r5,_CCR(r1)
375377 neg r3,r3
376378 oris r5,r5,0x1000 /* Set SO bit in CR */
377379 std r5,_CCR(r1)
378380 1: std r3,GPR3(r1)
379
-2: andi. r0,r9,(_TIF_PERSYSCALL_MASK)
381
+2: andis. r0,r9,(_TIF_PERSYSCALL_MASK)@h
380382 beq 4f
381383
382384 /* Clear per-syscall TIF flags if any are set. */
383385
384
- li r11,_TIF_PERSYSCALL_MASK
386
+ lis r11,(_TIF_PERSYSCALL_MASK)@h
385387 addi r12,r12,TI_FLAGS
386388 3: ldarx r10,0,r12
387389 andc r10,r10,r11
....@@ -774,7 +776,7 @@
774776 bl restore_math
775777 b restore
776778 #endif
777
-1: andi. r0,r4,_TIF_NEED_RESCHED
779
+1: andi. r0,r4,_TIF_NEED_RESCHED_MASK
778780 beq 2f
779781 bl restore_interrupts
780782 SCHEDULE_USER
....@@ -836,10 +838,18 @@
836838
837839 #ifdef CONFIG_PREEMPT
838840 /* Check if we need to preempt */
839
- andi. r0,r4,_TIF_NEED_RESCHED
840
- beq+ restore
841
- /* Check that preempt_count() == 0 and interrupts are enabled */
842841 lwz r8,TI_PREEMPT(r9)
842
+ cmpwi 0,r8,0 /* if non-zero, just restore regs and return */
843
+ bne restore
844
+ andi. r0,r4,_TIF_NEED_RESCHED
845
+ bne+ check_count
846
+
847
+ andi. r0,r4,_TIF_NEED_RESCHED_LAZY
848
+ beq+ restore
849
+ lwz r8,TI_PREEMPT_LAZY(r9)
850
+
851
+ /* Check that preempt_count() == 0 and interrupts are enabled */
852
+check_count:
843853 cmpwi cr0,r8,0
844854 bne restore
845855 ld r0,SOFTE(r1)
....@@ -856,7 +866,7 @@
856866 /* Re-test flags and eventually loop */
857867 CURRENT_THREAD_INFO(r9, r1)
858868 ld r4,TI_FLAGS(r9)
859
- andi. r0,r4,_TIF_NEED_RESCHED
869
+ andi. r0,r4,_TIF_NEED_RESCHED_MASK
860870 bne 1b
861871
862872 /*