Commit f22b9c21 authored by Heiko Carstens's avatar Heiko Carstens

s390/test_unwind: fix CALL_ON_STACK tests

The CALL_ON_STACK tests use the no_dat stack to switch to a different
stack for unwinding tests. If an interrupt or machine check happens
while using that stack, and previously being on the async stack, the
interrupt / machine check entry code (SWITCH_ASYNC) will assume that
the previous context did not use the async stack and happily use the
async stack again.

This will lead to stack corruption of the previous context.

To solve this disable both interrupts and machine checks before
switching to the no_dat stack.

Fixes: 7868249f ("s390/test_unwind: add CALL_ON_STACK tests")
Signed-off-by: default avatarHeiko Carstens <hca@linux.ibm.com>
parent f0c7cf13
......@@ -205,12 +205,15 @@ static noinline int unwindme_func3(struct unwindme *u)
/* This function must appear in the backtrace. */
static noinline int unwindme_func2(struct unwindme *u)
{
unsigned long flags;
int rc;
if (u->flags & UWM_SWITCH_STACK) {
preempt_disable();
local_irq_save(flags);
local_mcck_disable();
rc = CALL_ON_STACK(unwindme_func3, S390_lowcore.nodat_stack, 1, u);
preempt_enable();
local_mcck_enable();
local_irq_restore(flags);
return rc;
} else {
return unwindme_func3(u);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment