Pārlūkot izejas kodu

sparc64: Fix recursion in stack overflow detection handling.

The calls down into prom_printf() when we detect an overflowed stack
can recurse again since the overflow stack will be "below" the current
kernel stack limit.

Prevent this by just returning straight if we are on the stack
overflow safe stack already.

Signed-off-by: David S. Miller <davem@davemloft.net>
David S. Miller 16 gadi atpakaļ
vecāks
revīzija
c7498081a6
1 mainītis faili ar 14 papildinājumiem un 3 dzēšanām
  1. 14 3
      arch/sparc64/lib/mcount.S

+ 14 - 3
arch/sparc64/lib/mcount.S

@@ -48,12 +48,23 @@ mcount:
 	sub		%g3, STACK_BIAS, %g3
 	sub		%g3, STACK_BIAS, %g3
 	cmp		%sp, %g3
 	cmp		%sp, %g3
 	bg,pt		%xcc, 1f
 	bg,pt		%xcc, 1f
-	 sethi		%hi(panicstring), %g3
+	 nop
+	/* If we are already on ovstack, don't hop onto it
+	 * again, we are already trying to output the stack overflow
+	 * message.
+	 */
 	sethi		%hi(ovstack), %g7		! cant move to panic stack fast enough
 	sethi		%hi(ovstack), %g7		! cant move to panic stack fast enough
 	 or		%g7, %lo(ovstack), %g7
 	 or		%g7, %lo(ovstack), %g7
-	add		%g7, OVSTACKSIZE, %g7
+	add		%g7, OVSTACKSIZE, %g3
+	sub		%g3, STACK_BIAS + 192, %g3
 	sub		%g7, STACK_BIAS, %g7
 	sub		%g7, STACK_BIAS, %g7
-	mov		%g7, %sp
+	cmp		%sp, %g7
+	blu,pn		%xcc, 2f
+	 cmp		%sp, %g3
+	bleu,pn		%xcc, 1f
+	 nop
+2:	mov		%g3, %sp
+	sethi		%hi(panicstring), %g3
 	call		prom_printf
 	call		prom_printf
 	 or		%g3, %lo(panicstring), %o0
 	 or		%g3, %lo(panicstring), %o0
 	call		prom_halt
 	call		prom_halt