提交 98587c2d 编写于 作者: M Martin Schwidefsky

s390: simplify disabled_wait

The disabled_wait() function uses its argument as the PSW address when
it stops the CPU with a wait PSW that is disabled for interrupts.
The different callers sometimes use a specific number like 0xdeadbeef
to indicate a specific failure, the early boot code uses 0 and some
other calls sites use __builtin_return_address(0).

At the time a dump is created the current PSW and the registers of a
CPU are written to lowcore to make them avaiable to the dump analysis
tool. For a CPU stopped with disabled_wait the PSW and the registers
do not really make sense together, the PSW address does not point to
the function the registers belong to.

Simplify disabled_wait() by using _THIS_IP_ for the PSW address and
drop the argument to the function.
Signed-off-by: NMartin Schwidefsky <schwidefsky@de.ibm.com>
上级 ec7bf478
...@@ -99,7 +99,7 @@ static void facility_mismatch(void) ...@@ -99,7 +99,7 @@ static void facility_mismatch(void)
print_machine_type(); print_machine_type();
print_missing_facilities(); print_missing_facilities();
sclp_early_printk("See Principles of Operations for facility bits\n"); sclp_early_printk("See Principles of Operations for facility bits\n");
disabled_wait(0x8badcccc); disabled_wait();
} }
void verify_facilities(void) void verify_facilities(void)
......
...@@ -57,7 +57,7 @@ void error(char *x) ...@@ -57,7 +57,7 @@ void error(char *x)
sclp_early_printk(x); sclp_early_printk(x);
sclp_early_printk("\n\n -- System halted"); sclp_early_printk("\n\n -- System halted");
disabled_wait(0xdeadbeef); disabled_wait();
} }
#ifdef CONFIG_KERNEL_UNCOMPRESSED #ifdef CONFIG_KERNEL_UNCOMPRESSED
......
...@@ -315,12 +315,12 @@ void enabled_wait(void); ...@@ -315,12 +315,12 @@ void enabled_wait(void);
/* /*
* Function to drop a processor into disabled wait state * Function to drop a processor into disabled wait state
*/ */
static inline void __noreturn disabled_wait(unsigned long code) static inline void __noreturn disabled_wait(void)
{ {
psw_t psw; psw_t psw;
psw.mask = PSW_MASK_BASE | PSW_MASK_WAIT | PSW_MASK_BA | PSW_MASK_EA; psw.mask = PSW_MASK_BASE | PSW_MASK_WAIT | PSW_MASK_BA | PSW_MASK_EA;
psw.addr = code; psw.addr = _THIS_IP_;
__load_psw(psw); __load_psw(psw);
while (1); while (1);
} }
......
...@@ -141,7 +141,7 @@ static void early_pgm_check_handler(void) ...@@ -141,7 +141,7 @@ static void early_pgm_check_handler(void)
addr = S390_lowcore.program_old_psw.addr; addr = S390_lowcore.program_old_psw.addr;
fixup = s390_search_extables(addr); fixup = s390_search_extables(addr);
if (!fixup) if (!fixup)
disabled_wait(0); disabled_wait();
/* Disable low address protection before storing into lowcore. */ /* Disable low address protection before storing into lowcore. */
__ctl_store(cr0, 0, 0); __ctl_store(cr0, 0, 0);
cr0_new = cr0 & ~(1UL << 28); cr0_new = cr0 & ~(1UL << 28);
...@@ -298,7 +298,7 @@ static void __init check_image_bootable(void) ...@@ -298,7 +298,7 @@ static void __init check_image_bootable(void)
sclp_early_printk("Linux kernel boot failure: An attempt to boot a vmlinux ELF image failed.\n"); sclp_early_printk("Linux kernel boot failure: An attempt to boot a vmlinux ELF image failed.\n");
sclp_early_printk("This image does not contain all parts necessary for starting up. Use\n"); sclp_early_printk("This image does not contain all parts necessary for starting up. Use\n");
sclp_early_printk("bzImage or arch/s390/boot/compressed/vmlinux instead.\n"); sclp_early_printk("bzImage or arch/s390/boot/compressed/vmlinux instead.\n");
disabled_wait(0xbadb007); disabled_wait();
} }
void __init startup_init(void) void __init startup_init(void)
......
...@@ -25,7 +25,7 @@ static void __init reset_tod_clock(void) ...@@ -25,7 +25,7 @@ static void __init reset_tod_clock(void)
return; return;
/* TOD clock not running. Set the clock to Unix Epoch. */ /* TOD clock not running. Set the clock to Unix Epoch. */
if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock(&time) != 0) if (set_tod_clock(TOD_UNIX_EPOCH) != 0 || store_tod_clock(&time) != 0)
disabled_wait(0); disabled_wait();
memset(tod_clock_base, 0, 16); memset(tod_clock_base, 0, 16);
*(__u64 *) &tod_clock_base[1] = TOD_UNIX_EPOCH; *(__u64 *) &tod_clock_base[1] = TOD_UNIX_EPOCH;
......
...@@ -920,7 +920,7 @@ static void __reipl_run(void *unused) ...@@ -920,7 +920,7 @@ static void __reipl_run(void *unused)
case IPL_TYPE_FCP_DUMP: case IPL_TYPE_FCP_DUMP:
break; break;
} }
disabled_wait((unsigned long) __builtin_return_address(0)); disabled_wait();
} }
static void reipl_run(struct shutdown_trigger *trigger) static void reipl_run(struct shutdown_trigger *trigger)
...@@ -1375,7 +1375,7 @@ static void stop_run(struct shutdown_trigger *trigger) ...@@ -1375,7 +1375,7 @@ static void stop_run(struct shutdown_trigger *trigger)
{ {
if (strcmp(trigger->name, ON_PANIC_STR) == 0 || if (strcmp(trigger->name, ON_PANIC_STR) == 0 ||
strcmp(trigger->name, ON_RESTART_STR) == 0) strcmp(trigger->name, ON_RESTART_STR) == 0)
disabled_wait((unsigned long) __builtin_return_address(0)); disabled_wait();
smp_stop_cpu(); smp_stop_cpu();
} }
......
...@@ -96,7 +96,7 @@ static void __do_machine_kdump(void *image) ...@@ -96,7 +96,7 @@ static void __do_machine_kdump(void *image)
start_kdump(1); start_kdump(1);
/* Die if start_kdump returns */ /* Die if start_kdump returns */
disabled_wait((unsigned long) __builtin_return_address(0)); disabled_wait();
} }
/* /*
...@@ -284,7 +284,7 @@ static void __do_machine_kexec(void *data) ...@@ -284,7 +284,7 @@ static void __do_machine_kexec(void *data)
(*data_mover)(&image->head, image->start); (*data_mover)(&image->head, image->start);
/* Die if kexec returns */ /* Die if kexec returns */
disabled_wait((unsigned long) __builtin_return_address(0)); disabled_wait();
} }
/* /*
......
...@@ -125,7 +125,7 @@ void nmi_free_per_cpu(struct lowcore *lc) ...@@ -125,7 +125,7 @@ void nmi_free_per_cpu(struct lowcore *lc)
static notrace void s390_handle_damage(void) static notrace void s390_handle_damage(void)
{ {
smp_emergency_stop(); smp_emergency_stop();
disabled_wait((unsigned long) __builtin_return_address(0)); disabled_wait();
while (1); while (1);
} }
NOKPROBE_SYMBOL(s390_handle_damage); NOKPROBE_SYMBOL(s390_handle_damage);
......
...@@ -318,12 +318,7 @@ void panic(const char *fmt, ...) ...@@ -318,12 +318,7 @@ void panic(const char *fmt, ...)
} }
#endif #endif
#if defined(CONFIG_S390) #if defined(CONFIG_S390)
{ disabled_wait();
unsigned long caller;
caller = (unsigned long)__builtin_return_address(0);
disabled_wait(caller);
}
#endif #endif
pr_emerg("---[ end Kernel panic - not syncing: %s ]---\n", buf); pr_emerg("---[ end Kernel panic - not syncing: %s ]---\n", buf);
local_irq_enable(); local_irq_enable();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册