Commit f740a8b4 authored by Sven Schnelle's avatar Sven Schnelle Committed by Vasily Gorbik
Browse files

s390/traps: Change stack overflow message



When the kernel stack pointer is pointing to invalid memory,
a 'Kernel stack overflow' message is printed, which is misleading.
Change the message to actually say that the stack pointer is invalid
instead.

Reviewed-by: default avatarHeiko Carstens <hca@linux.ibm.com>
Signed-off-by: default avatarSven Schnelle <svens@linux.ibm.com>
Signed-off-by: default avatarVasily Gorbik <gor@linux.ibm.com>
parent a9f24559
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -68,7 +68,7 @@ _LPP_OFFSET = __LC_LPP
	clg	%r14,__LC_RESTART_STACK(\lowcore)
	je	\oklabel
	la	%r14,\savearea(\lowcore)
	j	stack_overflow
	j	stack_invalid
	.endm

	/*
@@ -316,7 +316,7 @@ SYM_CODE_START(pgm_check_handler)
	tm	__LC_PGM_ILC+3(%r13),0x80	# check for per exception
	jnz	.Lpgm_svcper		# -> single stepped svc
2:	aghi	%r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE)
	# CHECK_VMAP_STACK branches to stack_overflow or 4f
	# CHECK_VMAP_STACK branches to stack_invalid or 4f
	CHECK_VMAP_STACK __LC_SAVE_AREA,%r13,4f
3:	lg	%r15,__LC_KERNEL_STACK(%r13)
4:	la	%r11,STACK_FRAME_OVERHEAD(%r15)
@@ -591,11 +591,11 @@ SYM_CODE_END(early_pgm_check_handler)
	.section .kprobes.text, "ax"

/*
 * The synchronous or the asynchronous stack overflowed. We are dead.
 * The synchronous or the asynchronous stack pointer is invalid. We are dead.
 * No need to properly save the registers, we are going to panic anyway.
 * Setup a pt_regs so that show_trace can provide a good call trace.
 */
SYM_CODE_START(stack_overflow)
SYM_CODE_START(stack_invalid)
	GET_LC	%r15
	lg	%r15,__LC_NODAT_STACK(%r15) # change to panic stack
	la	%r11,STACK_FRAME_OVERHEAD(%r15)
@@ -605,8 +605,8 @@ SYM_CODE_START(stack_overflow)
	stg	%r10,__PT_ORIG_GPR2(%r11) # store last break to orig_gpr2
	xc	__SF_BACKCHAIN(8,%r15),__SF_BACKCHAIN(%r15)
	lgr	%r2,%r11		# pass pointer to pt_regs
	jg	kernel_stack_overflow
SYM_CODE_END(stack_overflow)
	jg	kernel_stack_invalid
SYM_CODE_END(stack_invalid)

	.section .data, "aw"
	.balign	4
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ void do_secure_storage_access(struct pt_regs *regs);
void do_non_secure_storage_access(struct pt_regs *regs);
void do_secure_storage_violation(struct pt_regs *regs);
void do_report_trap(struct pt_regs *regs, int si_signo, int si_code, char *str);
void kernel_stack_overflow(struct pt_regs * regs);
void kernel_stack_invalid(struct pt_regs *regs);
void handle_signal32(struct ksignal *ksig, sigset_t *oldset,
		     struct pt_regs *regs);

+4 −4
Original line number Diff line number Diff line
@@ -236,7 +236,7 @@ static void monitor_event_exception(struct pt_regs *regs)
	}
}

void kernel_stack_overflow(struct pt_regs *regs)
void kernel_stack_invalid(struct pt_regs *regs)
{
	/*
	 * Normally regs are unpoisoned by the generic entry code, but
@@ -244,12 +244,12 @@ void kernel_stack_overflow(struct pt_regs *regs)
	 */
	kmsan_unpoison_entry_regs(regs);
	bust_spinlocks(1);
	pr_emerg("Kernel stack overflow\n");
	pr_emerg("Kernel stack pointer invalid\n");
	show_regs(regs);
	bust_spinlocks(0);
	panic("Corrupt kernel stack, cannot continue");
	panic("Invalid kernel stack pointer, cannot continue");
}
NOKPROBE_SYMBOL(kernel_stack_overflow);
NOKPROBE_SYMBOL(kernel_stack_invalid);

static void __init test_monitor_call(void)
{