diff options
Diffstat (limited to 'arch/s390/kernel/smp.c')
-rw-r--r-- | arch/s390/kernel/smp.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c index a6d85c0a7f20..70f4b9604575 100644 --- a/arch/s390/kernel/smp.c +++ b/arch/s390/kernel/smp.c | |||
@@ -468,6 +468,11 @@ int __cpuinit start_secondary(void *cpuvoid) | |||
468 | ipi_call_lock(); | 468 | ipi_call_lock(); |
469 | set_cpu_online(smp_processor_id(), true); | 469 | set_cpu_online(smp_processor_id(), true); |
470 | ipi_call_unlock(); | 470 | ipi_call_unlock(); |
471 | __ctl_clear_bit(0, 28); /* Disable lowcore protection */ | ||
472 | S390_lowcore.restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY; | ||
473 | S390_lowcore.restart_psw.addr = | ||
474 | PSW_ADDR_AMODE | (unsigned long) psw_restart_int_handler; | ||
475 | __ctl_set_bit(0, 28); /* Enable lowcore protection */ | ||
471 | /* Switch on interrupts */ | 476 | /* Switch on interrupts */ |
472 | local_irq_enable(); | 477 | local_irq_enable(); |
473 | /* cpu_idle will call schedule for us */ | 478 | /* cpu_idle will call schedule for us */ |
@@ -507,7 +512,11 @@ static int __cpuinit smp_alloc_lowcore(int cpu) | |||
507 | memset((char *)lowcore + 512, 0, sizeof(*lowcore) - 512); | 512 | memset((char *)lowcore + 512, 0, sizeof(*lowcore) - 512); |
508 | lowcore->async_stack = async_stack + ASYNC_SIZE; | 513 | lowcore->async_stack = async_stack + ASYNC_SIZE; |
509 | lowcore->panic_stack = panic_stack + PAGE_SIZE; | 514 | lowcore->panic_stack = panic_stack + PAGE_SIZE; |
510 | 515 | lowcore->restart_psw.mask = PSW_BASE_BITS | PSW_DEFAULT_KEY; | |
516 | lowcore->restart_psw.addr = | ||
517 | PSW_ADDR_AMODE | (unsigned long) restart_int_handler; | ||
518 | if (user_mode != HOME_SPACE_MODE) | ||
519 | lowcore->restart_psw.mask |= PSW_ASC_HOME; | ||
511 | #ifndef CONFIG_64BIT | 520 | #ifndef CONFIG_64BIT |
512 | if (MACHINE_HAS_IEEE) { | 521 | if (MACHINE_HAS_IEEE) { |
513 | unsigned long save_area; | 522 | unsigned long save_area; |