diff options
Diffstat (limited to 'arch/s390/kernel/entry.S')
-rw-r--r-- | arch/s390/kernel/entry.S | 81 |
1 files changed, 17 insertions, 64 deletions
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 5f437b830da5..6143521a4fff 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -2,7 +2,7 @@ | |||
2 | * arch/s390/kernel/entry.S | 2 | * arch/s390/kernel/entry.S |
3 | * S390 low-level entry points. | 3 | * S390 low-level entry points. |
4 | * | 4 | * |
5 | * Copyright (C) IBM Corp. 1999,2006 | 5 | * Copyright (C) IBM Corp. 1999,2012 |
6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | 6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), |
7 | * Hartmut Penner (hp@de.ibm.com), | 7 | * Hartmut Penner (hp@de.ibm.com), |
8 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), | 8 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), |
@@ -691,77 +691,30 @@ mcck_panic: | |||
691 | 0: ahi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) | 691 | 0: ahi %r15,-(STACK_FRAME_OVERHEAD + __PT_SIZE) |
692 | j mcck_skip | 692 | j mcck_skip |
693 | 693 | ||
694 | /* | ||
695 | * Restart interruption handler, kick starter for additional CPUs | ||
696 | */ | ||
697 | #ifdef CONFIG_SMP | ||
698 | __CPUINIT | ||
699 | ENTRY(restart_int_handler) | ||
700 | basr %r1,0 | ||
701 | restart_base: | ||
702 | spt restart_vtime-restart_base(%r1) | ||
703 | stck __LC_LAST_UPDATE_CLOCK | ||
704 | mvc __LC_LAST_UPDATE_TIMER(8),restart_vtime-restart_base(%r1) | ||
705 | mvc __LC_EXIT_TIMER(8),restart_vtime-restart_base(%r1) | ||
706 | l %r15,__LC_GPREGS_SAVE_AREA+60 # load ksp | ||
707 | lctl %c0,%c15,__LC_CREGS_SAVE_AREA # get new ctl regs | ||
708 | lam %a0,%a15,__LC_AREGS_SAVE_AREA | ||
709 | lm %r6,%r15,__SF_GPRS(%r15)# load registers from clone | ||
710 | l %r1,__LC_THREAD_INFO | ||
711 | mvc __LC_USER_TIMER(8),__TI_user_timer(%r1) | ||
712 | mvc __LC_SYSTEM_TIMER(8),__TI_system_timer(%r1) | ||
713 | xc __LC_STEAL_TIMER(8),__LC_STEAL_TIMER | ||
714 | ssm __LC_PGM_NEW_PSW # turn dat on, keep irqs off | ||
715 | basr %r14,0 | ||
716 | l %r14,restart_addr-.(%r14) | ||
717 | basr %r14,%r14 # call start_secondary | ||
718 | restart_addr: | ||
719 | .long start_secondary | ||
720 | .align 8 | ||
721 | restart_vtime: | ||
722 | .long 0x7fffffff,0xffffffff | ||
723 | .previous | ||
724 | #else | ||
725 | /* | ||
726 | * If we do not run with SMP enabled, let the new CPU crash ... | ||
727 | */ | ||
728 | ENTRY(restart_int_handler) | ||
729 | basr %r1,0 | ||
730 | restart_base: | ||
731 | lpsw restart_crash-restart_base(%r1) | ||
732 | .align 8 | ||
733 | restart_crash: | ||
734 | .long 0x000a0000,0x00000000 | ||
735 | restart_go: | ||
736 | #endif | ||
737 | |||
738 | # | 694 | # |
739 | # PSW restart interrupt handler | 695 | # PSW restart interrupt handler |
740 | # | 696 | # |
741 | ENTRY(psw_restart_int_handler) | 697 | ENTRY(restart_int_handler) |
742 | st %r15,__LC_SAVE_AREA_RESTART | 698 | st %r15,__LC_SAVE_AREA_RESTART |
743 | basr %r15,0 | 699 | l %r15,__LC_RESTART_STACK |
744 | 0: l %r15,.Lrestart_stack-0b(%r15) # load restart stack | ||
745 | l %r15,0(%r15) | ||
746 | ahi %r15,-__PT_SIZE # create pt_regs on stack | 700 | ahi %r15,-__PT_SIZE # create pt_regs on stack |
701 | xc 0(__PT_SIZE,%r15),0(%r15) | ||
747 | stm %r0,%r14,__PT_R0(%r15) | 702 | stm %r0,%r14,__PT_R0(%r15) |
748 | mvc __PT_R15(4,%r15),__LC_SAVE_AREA_RESTART | 703 | mvc __PT_R15(4,%r15),__LC_SAVE_AREA_RESTART |
749 | mvc __PT_PSW(8,%r15),__LC_RST_OLD_PSW # store restart old psw | 704 | mvc __PT_PSW(8,%r15),__LC_RST_OLD_PSW # store restart old psw |
750 | ahi %r15,-STACK_FRAME_OVERHEAD | 705 | ahi %r15,-STACK_FRAME_OVERHEAD # create stack frame on stack |
751 | xc __SF_BACKCHAIN(4,%r15),__SF_BACKCHAIN(%r15) | 706 | xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) |
752 | basr %r14,0 | 707 | lm %r1,%r3,__LC_RESTART_FN # load fn, parm & source cpu |
753 | 1: l %r14,.Ldo_restart-1b(%r14) | 708 | ltr %r3,%r3 # test source cpu address |
754 | basr %r14,%r14 | 709 | jm 1f # negative -> skip source stop |
755 | basr %r14,0 # load disabled wait PSW if | 710 | 0: sigp %r4,%r3,1 # sigp sense to source cpu |
756 | 2: lpsw restart_psw_crash-2b(%r14) # do_restart returns | 711 | brc 10,0b # wait for status stored |
757 | .align 4 | 712 | 1: basr %r14,%r1 # call function |
758 | .Ldo_restart: | 713 | stap __SF_EMPTY(%r15) # store cpu address |
759 | .long do_restart | 714 | lh %r3,__SF_EMPTY(%r15) |
760 | .Lrestart_stack: | 715 | 2: sigp %r4,%r3,5 # sigp stop to current cpu |
761 | .long restart_stack | 716 | brc 2,2b |
762 | .align 8 | 717 | 3: j 3b |
763 | restart_psw_crash: | ||
764 | .long 0x000a0000,0x00000000 + restart_psw_crash | ||
765 | 718 | ||
766 | .section .kprobes.text, "ax" | 719 | .section .kprobes.text, "ax" |
767 | 720 | ||