diff options
Diffstat (limited to 'arch/s390/kernel/entry64.S')
-rw-r--r-- | arch/s390/kernel/entry64.S | 52 |
1 files changed, 21 insertions, 31 deletions
diff --git a/arch/s390/kernel/entry64.S b/arch/s390/kernel/entry64.S index 229fe1d07749..349b7eeb348a 100644 --- a/arch/s390/kernel/entry64.S +++ b/arch/s390/kernel/entry64.S | |||
@@ -1,8 +1,7 @@ | |||
1 | /* | 1 | /* |
2 | * arch/s390/kernel/entry64.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 + 8 | 23 | __PT_R1 = __PT_GPRS + 8 |
@@ -642,15 +642,11 @@ ext_skip: | |||
642 | * Load idle PSW. The second "half" of this function is in cleanup_idle. | 642 | * Load idle PSW. The second "half" of this function is in cleanup_idle. |
643 | */ | 643 | */ |
644 | ENTRY(psw_idle) | 644 | ENTRY(psw_idle) |
645 | stg %r4,__SF_EMPTY(%r15) | 645 | stg %r3,__SF_EMPTY(%r15) |
646 | larl %r1,psw_idle_lpsw+4 | 646 | larl %r1,psw_idle_lpsw+4 |
647 | stg %r1,__SF_EMPTY+8(%r15) | 647 | stg %r1,__SF_EMPTY+8(%r15) |
648 | larl %r1,.Lvtimer_max | 648 | STCK __CLOCK_IDLE_ENTER(%r2) |
649 | STCK __IDLE_ENTER(%r2) | 649 | stpt __TIMER_IDLE_ENTER(%r2) |
650 | ltr %r5,%r5 | ||
651 | stpt __VQ_IDLE_ENTER(%r3) | ||
652 | jz psw_idle_lpsw | ||
653 | spt 0(%r1) | ||
654 | psw_idle_lpsw: | 650 | psw_idle_lpsw: |
655 | lpswe __SF_EMPTY(%r15) | 651 | lpswe __SF_EMPTY(%r15) |
656 | br %r14 | 652 | br %r14 |
@@ -750,15 +746,17 @@ ENTRY(restart_int_handler) | |||
750 | mvc __PT_PSW(16,%r15),__LC_RST_OLD_PSW # store restart old psw | 746 | mvc __PT_PSW(16,%r15),__LC_RST_OLD_PSW # store restart old psw |
751 | aghi %r15,-STACK_FRAME_OVERHEAD # create stack frame on stack | 747 | aghi %r15,-STACK_FRAME_OVERHEAD # create stack frame on stack |
752 | xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) | 748 | xc 0(STACK_FRAME_OVERHEAD,%r15),0(%r15) |
753 | lmg %r1,%r3,__LC_RESTART_FN # load fn, parm & source cpu | 749 | lg %r1,__LC_RESTART_FN # load fn, parm & source cpu |
750 | lg %r2,__LC_RESTART_DATA | ||
751 | lg %r3,__LC_RESTART_SOURCE | ||
754 | ltgr %r3,%r3 # test source cpu address | 752 | ltgr %r3,%r3 # test source cpu address |
755 | jm 1f # negative -> skip source stop | 753 | jm 1f # negative -> skip source stop |
756 | 0: sigp %r4,%r3,1 # sigp sense to source cpu | 754 | 0: sigp %r4,%r3,SIGP_SENSE # sigp sense to source cpu |
757 | brc 10,0b # wait for status stored | 755 | brc 10,0b # wait for status stored |
758 | 1: basr %r14,%r1 # call function | 756 | 1: basr %r14,%r1 # call function |
759 | stap __SF_EMPTY(%r15) # store cpu address | 757 | stap __SF_EMPTY(%r15) # store cpu address |
760 | llgh %r3,__SF_EMPTY(%r15) | 758 | llgh %r3,__SF_EMPTY(%r15) |
761 | 2: sigp %r4,%r3,5 # sigp stop to current cpu | 759 | 2: sigp %r4,%r3,SIGP_STOP # sigp stop to current cpu |
762 | brc 2,2b | 760 | brc 2,2b |
763 | 3: j 3b | 761 | 3: j 3b |
764 | 762 | ||
@@ -916,33 +914,28 @@ cleanup_io_restore_insn: | |||
916 | 914 | ||
917 | cleanup_idle: | 915 | cleanup_idle: |
918 | # copy interrupt clock & cpu timer | 916 | # copy interrupt clock & cpu timer |
919 | mvc __IDLE_EXIT(8,%r2),__LC_INT_CLOCK | 917 | mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_INT_CLOCK |
920 | mvc __VQ_IDLE_EXIT(8,%r3),__LC_ASYNC_ENTER_TIMER | 918 | mvc __TIMER_IDLE_EXIT(8,%r2),__LC_ASYNC_ENTER_TIMER |
921 | cghi %r11,__LC_SAVE_AREA_ASYNC | 919 | cghi %r11,__LC_SAVE_AREA_ASYNC |
922 | je 0f | 920 | je 0f |
923 | mvc __IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK | 921 | mvc __CLOCK_IDLE_EXIT(8,%r2),__LC_MCCK_CLOCK |
924 | mvc __VQ_IDLE_EXIT(8,%r3),__LC_MCCK_ENTER_TIMER | 922 | mvc __TIMER_IDLE_EXIT(8,%r2),__LC_MCCK_ENTER_TIMER |
925 | 0: # check if stck & stpt have been executed | 923 | 0: # check if stck & stpt have been executed |
926 | clg %r9,BASED(cleanup_idle_insn) | 924 | clg %r9,BASED(cleanup_idle_insn) |
927 | jhe 1f | 925 | jhe 1f |
928 | mvc __IDLE_ENTER(8,%r2),__IDLE_EXIT(%r2) | 926 | mvc __CLOCK_IDLE_ENTER(8,%r2),__CLOCK_IDLE_EXIT(%r2) |
929 | mvc __VQ_IDLE_ENTER(8,%r3),__VQ_IDLE_EXIT(%r3) | 927 | mvc __TIMER_IDLE_ENTER(8,%r2),__TIMER_IDLE_EXIT(%r2) |
930 | j 2f | 928 | 1: # account system time going idle |
931 | 1: # check if the cpu timer has been reprogrammed | ||
932 | ltr %r5,%r5 | ||
933 | jz 2f | ||
934 | spt __VQ_IDLE_ENTER(%r3) | ||
935 | 2: # account system time going idle | ||
936 | lg %r9,__LC_STEAL_TIMER | 929 | lg %r9,__LC_STEAL_TIMER |
937 | alg %r9,__IDLE_ENTER(%r2) | 930 | alg %r9,__CLOCK_IDLE_ENTER(%r2) |
938 | slg %r9,__LC_LAST_UPDATE_CLOCK | 931 | slg %r9,__LC_LAST_UPDATE_CLOCK |
939 | stg %r9,__LC_STEAL_TIMER | 932 | stg %r9,__LC_STEAL_TIMER |
940 | mvc __LC_LAST_UPDATE_CLOCK(8),__IDLE_EXIT(%r2) | 933 | mvc __LC_LAST_UPDATE_CLOCK(8),__CLOCK_IDLE_EXIT(%r2) |
941 | lg %r9,__LC_SYSTEM_TIMER | 934 | lg %r9,__LC_SYSTEM_TIMER |
942 | alg %r9,__LC_LAST_UPDATE_TIMER | 935 | alg %r9,__LC_LAST_UPDATE_TIMER |
943 | slg %r9,__VQ_IDLE_ENTER(%r3) | 936 | slg %r9,__TIMER_IDLE_ENTER(%r2) |
944 | stg %r9,__LC_SYSTEM_TIMER | 937 | stg %r9,__LC_SYSTEM_TIMER |
945 | mvc __LC_LAST_UPDATE_TIMER(8),__VQ_IDLE_EXIT(%r3) | 938 | mvc __LC_LAST_UPDATE_TIMER(8),__TIMER_IDLE_EXIT(%r2) |
946 | # prepare return psw | 939 | # prepare return psw |
947 | nihh %r8,0xfffd # clear wait state bit | 940 | nihh %r8,0xfffd # clear wait state bit |
948 | lg %r9,48(%r11) # return from psw_idle | 941 | lg %r9,48(%r11) # return from psw_idle |
@@ -958,8 +951,6 @@ cleanup_idle_insn: | |||
958 | .quad __critical_start | 951 | .quad __critical_start |
959 | .Lcritical_length: | 952 | .Lcritical_length: |
960 | .quad __critical_end - __critical_start | 953 | .quad __critical_end - __critical_start |
961 | .Lvtimer_max: | ||
962 | .quad 0x7fffffffffffffff | ||
963 | 954 | ||
964 | 955 | ||
965 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) | 956 | #if defined(CONFIG_KVM) || defined(CONFIG_KVM_MODULE) |
@@ -974,7 +965,6 @@ ENTRY(sie64a) | |||
974 | stg %r3,__SF_EMPTY+8(%r15) # save guest register save area | 965 | stg %r3,__SF_EMPTY+8(%r15) # save guest register save area |
975 | xc __SF_EMPTY+16(8,%r15),__SF_EMPTY+16(%r15) # host id == 0 | 966 | xc __SF_EMPTY+16(8,%r15),__SF_EMPTY+16(%r15) # host id == 0 |
976 | lmg %r0,%r13,0(%r3) # load guest gprs 0-13 | 967 | lmg %r0,%r13,0(%r3) # load guest gprs 0-13 |
977 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct | ||
978 | sie_loop: | 968 | sie_loop: |
979 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct | 969 | lg %r14,__LC_THREAD_INFO # pointer thread_info struct |
980 | tm __TI_flags+7(%r14),_TIF_EXIT_SIE | 970 | tm __TI_flags+7(%r14),_TIF_EXIT_SIE |