Skip to content

Commit d89ba53

Browse files
rnavmpe
authored andcommitted
powerpc/64s: Handle data breakpoints in Radix mode
On Power9, trying to use data breakpoints throws the splat shown below. This is because the check for a data breakpoint in DSISR is in do_hash_page(), which is not called when in Radix mode. Unable to handle kernel paging request for data at address 0xc000000000e19218 Faulting instruction address: 0xc0000000001155e8 cpu 0x0: Vector: 300 (Data Access) at [c0000000ef1e7b20] pc: c0000000001155e8: find_pid_ns+0x48/0xe0 lr: c000000000116ac4: find_task_by_vpid+0x44/0x90 sp: c0000000ef1e7da0 msr: 9000000000009033 dar: c000000000e19218 dsisr: 400000 Move the check to handle_page_fault() so as to catch data breakpoints in both Hash and Radix MMU modes. We have to change the check in do_hash_page() against 0xa410 to use 0xa450, so as to include the value of (DSISR_DABRMATCH << 16). There are two sites that call handle_page_fault() when in Radix, both already pass DSISR in r4. Fixes: caca285 ("powerpc/mm/radix: Use STD_MMU_64 to properly isolate hash related code") Cc: stable@vger.kernel.org # v4.7+ Reported-by: Shriya R. Kulkarni <shriykul@in.ibm.com> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> [mpe: Fix the fall-through case on hash, we need to reload DSISR] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
1 parent c05b8c4 commit d89ba53

File tree

1 file changed

+7
-4
lines changed

1 file changed

+7
-4
lines changed

arch/powerpc/kernel/exceptions-64s.S

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,10 +1411,8 @@ USE_TEXT_SECTION()
14111411
.balign IFETCH_ALIGN_BYTES
14121412
do_hash_page:
14131413
#ifdef CONFIG_PPC_STD_MMU_64
1414-
andis. r0,r4,0xa410 /* weird error? */
1414+
andis. r0,r4,0xa450 /* weird error? */
14151415
bne- handle_page_fault /* if not, try to insert a HPTE */
1416-
andis. r0,r4,DSISR_DABRMATCH@h
1417-
bne- handle_dabr_fault
14181416
CURRENT_THREAD_INFO(r11, r1)
14191417
lwz r0,TI_PREEMPT(r11) /* If we're in an "NMI" */
14201418
andis. r0,r0,NMI_MASK@h /* (i.e. an irq when soft-disabled) */
@@ -1438,11 +1436,16 @@ do_hash_page:
14381436

14391437
/* Error */
14401438
blt- 13f
1439+
1440+
/* Reload DSISR into r4 for the DABR check below */
1441+
ld r4,_DSISR(r1)
14411442
#endif /* CONFIG_PPC_STD_MMU_64 */
14421443

14431444
/* Here we have a page fault that hash_page can't handle. */
14441445
handle_page_fault:
1445-
11: ld r4,_DAR(r1)
1446+
11: andis. r0,r4,DSISR_DABRMATCH@h
1447+
bne- handle_dabr_fault
1448+
ld r4,_DAR(r1)
14461449
ld r5,_DSISR(r1)
14471450
addi r3,r1,STACK_FRAME_OVERHEAD
14481451
bl do_page_fault

0 commit comments

Comments
 (0)