diff options
Diffstat (limited to 'arch/s390/kernel/entry.S')
-rw-r--r-- | arch/s390/kernel/entry.S | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/arch/s390/kernel/entry.S b/arch/s390/kernel/entry.S index 1ae93b573d7d..870bad6d56fc 100644 --- a/arch/s390/kernel/entry.S +++ b/arch/s390/kernel/entry.S | |||
@@ -1,8 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/entry.S | ||
3 | * S390 low-level entry points. | 2 | * S390 low-level entry points. |
4 | * | 3 | * |
5 | * Copyright (C) IBM Corp. 1999,2012 | 4 | * Copyright IBM Corp. 1999, 2012 |
6 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), | 5 | * Author(s): Martin Schwidefsky (schwidefsky@de.ibm.com), |
7 | * Hartmut Penner (hp@de.ibm.com), | 6 | * Hartmut Penner (hp@de.ibm.com), |
8 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), | 7 | * Denis Joseph Barrow (djbarrow@de.ibm.com,barrow_dj@yahoo.com), |
@@ -18,6 +17,7 @@ | |||
18 | #include <asm/asm-offsets.h> | 17 | #include <asm/asm-offsets.h> |
19 | #include <asm/unistd.h> | 18 | #include <asm/unistd.h> |
20 | #include <asm/page.h> | 19 | #include <asm/page.h> |
20 | #include <asm/sigp.h> | ||
21 | 21 | ||
22 | __PT_R0 = __PT_GPRS | 22 | __PT_R0 = __PT_GPRS |
23 | __PT_R1 = __PT_GPRS + 4 | 23 | __PT_R1 = __PT_GPRS + 4 |
@@ -616,17 +616,13 @@ ext_skip: | |||
616 | * Load idle PSW. The second "half" of this function is in cleanup_idle. | 616 | * Load idle PSW. The second "half" of this function is in cleanup_idle. |
617 | */ | 617 | */ |
618 | ENTRY(psw_idle) | 618 | ENTRY(psw_idle) |
619 | st %r4,__SF_EMPTY(%r15) | 619 | st %r3,__SF_EMPTY(%r15) |
620 | basr %r1,0 | 620 | basr %r1,0 |
621 | la %r1,psw_idle_lpsw+4-.(%r1) | 621 | la %r1,psw_idle_lpsw+4-.(%r1) |
622 | st %r1,__SF_EMPTY+4(%r15) | 622 | st %r1,__SF_EMPTY+4(%r15) |
623 | oi __SF_EMPTY+4(%r15),0x80 | 623 | oi __SF_EMPTY+4(%r15),0x80 |
624 | la %r1,.Lvtimer_max-psw_idle_lpsw-4(%r1) | 624 | stck __CLOCK_IDLE_ENTER(%r2) |
625 | stck __IDLE_ENTER(%r2) | 625 | stpt __TIMER_IDLE_ENTER(%r2) |
626 | ltr %r5,%r5 | ||
627 | stpt __VQ_IDLE_ENTER(%r3) | ||
628 | jz psw_idle_lpsw | ||
629 | spt 0(%r1) | ||
630 | psw_idle_lpsw: | 626 | psw_idle_lpsw: |
631 | lpsw __SF_EMPTY(%r15) | 627 | lpsw __SF_EMPTY(%r15) |
632 | br %r14 | 628 | br %r14 |
@@ -723,15 +719,17 @@ ENTRY(restart_int_handler) | |||
723 | mvc __PT_PSW(8,%r15),__LC_RST_OLD_PSW # store restart old psw | 719 | mvc __PT_PSW(8,%r15),__LC_RST_OLD_PSW # store restart old psw |
724 | ahi %r15,-STACK_FRAME_OVERHEAD # create stack frame on stack | 720 | ahi %r15,-STACK_FRAME_OVERHEAD # create stack frame on stack |
725 | xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) | 721 | xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) |
726 | lm %r1,%r3,__LC_RESTART_FN # load fn, parm & source cpu | 722 | l %r1,__LC_RESTART_FN # load fn, parm & source cpu |
723 | l %r2,__LC_RESTART_DATA | ||
724 | l %r3,__LC_RESTART_SOURCE | ||
727 | ltr %r3,%r3 # test source cpu address | 725 | ltr %r3,%r3 # test source cpu address |
728 | jm 1f # negative -> skip source stop | 726 | jm 1f # negative -> skip source stop |
729 | 0: sigp %r4,%r3,1 # sigp sense to source cpu | 727 | 0: sigp %r4,%r3,SIGP_SENSE # sigp sense to source cpu |
730 | brc 10,0b # wait for status stored | 728 | brc 10,0b # wait for status stored |
731 | 1: basr %r14,%r1 # call function | 729 | 1: basr %r14,%r1 # call function |
732 | stap __SF_EMPTY(%r15) # store cpu address | 730 | stap __SF_EMPTY(%r15) # store cpu address |
733 | lh %r3,__SF_EMPTY(%r15) | 731 | lh %r3,__SF_EMPTY(%r15) |
734 | 2: sigp %r4,%r3,5 # sigp stop to current cpu | 732 | 2: sigp %r4,%r3,SIGP_STOP # sigp stop to current cpu |
735 | brc 2,2b | 733 | brc 2,2b |
736 | 3: j 3b | 734 | 3: j 3b |
737 | 735 | ||
@@ -883,33 +881,28 @@ cleanup_io_restore_insn: | |||
883 | 881 | ||
884 | cleanup_idle: | 882 | cleanup_idle: |
885 | # copy interrupt clock & cpu timer | 883 | # copy interrupt clock & cpu timer |
886 | mvc __IDLE_EXIT(8,%r2),__LC_INT_CLOCK | 884 | mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_INT_CLOCK |
887 | mvc __VQ_IDLE_EXIT(8,%r3),__LC_ASYNC_ENTER_TIMER | 885 | mvc __TIMER_IDLE_EXIT(8,%r2),__LC_ASYNC_ENTER_TIMER |
888 | chi %r11,__LC_SAVE_AREA_ASYNC | 886 | chi %r11,__LC_SAVE_AREA_ASYNC |
889 | je 0f | 887 | je 0f |
890 | mvc __IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK | 888 | mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK |
891 | mvc __VQ_IDLE_EXIT(8,%r3),__LC_MCCK_ENTER_TIMER | 889 | mvc __TIMER_IDLE_EXIT(8,%r2),__LC_MCCK_ENTER_TIMER |
892 | 0: # check if stck has been executed | 890 | 0: # check if stck has been executed |
893 | cl %r9,BASED(cleanup_idle_insn) | 891 | cl %r9,BASED(cleanup_idle_insn) |
894 | jhe 1f | 892 | jhe 1f |
895 | mvc __IDLE_ENTER(8,%r2),__IDLE_EXIT(%r2) | 893 | mvc __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2) |
896 | mvc __VQ_IDLE_ENTER(8,%r3),__VQ_IDLE_EXIT(%r3) | 894 | mvc __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r3) |
897 | j 2f | 895 | 1: # account system time going idle |
898 | 1: # check if the cpu timer has been reprogrammed | ||
899 | ltr %r5,%r5 | ||
900 | jz 2f | ||
901 | spt __VQ_IDLE_ENTER(%r3) | ||
902 | 2: # account system time going idle | ||
903 | lm %r9,%r10,__LC_STEAL_TIMER | 896 | lm %r9,%r10,__LC_STEAL_TIMER |
904 | ADD64 %r9,%r10,__IDLE_ENTER(%r2) | 897 | ADD64 %r9,%r10,__CLOCK_IDLE_ENTER(%r2) |
905 | SUB64 %r9,%r10,__LC_LAST_UPDATE_CLOCK | 898 | SUB64 %r9,%r10,__LC_LAST_UPDATE_CLOCK |
906 | stm %r9,%r10,__LC_STEAL_TIMER | 899 | stm %r9,%r10,__LC_STEAL_TIMER |
907 | mvc __LC_LAST_UPDATE_CLOCK(8),__IDLE_EXIT(%r2) | 900 | mvc __LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2) |
908 | lm %r9,%r10,__LC_SYSTEM_TIMER | 901 | lm %r9,%r10,__LC_SYSTEM_TIMER |
909 | ADD64 %r9,%r10,__LC_LAST_UPDATE_TIMER | 902 | ADD64 %r9,%r10,__LC_LAST_UPDATE_TIMER |
910 | SUB64 %r9,%r10,__VQ_IDLE_ENTER(%r3) | 903 | SUB64 %r9,%r10,__TIMER_IDLE_ENTER(%r2) |
911 | stm %r9,%r10,__LC_SYSTEM_TIMER | 904 | stm %r9,%r10,__LC_SYSTEM_TIMER |
912 | mvc __LC_LAST_UPDATE_TIMER(8),__VQ_IDLE_EXIT(%r3) | 905 | mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) |
913 | # prepare return psw | 906 | # prepare return psw |
914 | n %r8,BASED(cleanup_idle_wait) # clear wait state bit | 907 | n %r8,BASED(cleanup_idle_wait) # clear wait state bit |
915 | l %r9,24(%r11) # return from psw_idle | 908 | l %r9,24(%r11) # return from psw_idle |