treewide: remove duplicate includes
[firefly-linux-kernel-4.4.55.git] / arch / s390 / kvm / sie64a.S
1 /*
2  * sie64a.S - low level sie call
3  *
4  * Copyright IBM Corp. 2008,2010
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License (version 2 only)
8  * as published by the Free Software Foundation.
9  *
10  *    Author(s): Heiko Carstens <heiko.carstens@de.ibm.com>
11  *               Christian Ehrhardt <ehrhardt@linux.vnet.ibm.com>
12  */
13
14 #include <linux/errno.h>
15 #include <asm/asm-offsets.h>
16 #include <asm/setup.h>
17 #include <asm/ptrace.h>
18 #include <asm/thread_info.h>
19
20 _TIF_EXIT_SIE = (_TIF_SIGPENDING | _TIF_NEED_RESCHED | _TIF_MCCK_PENDING)
21
22 /*
23  * offsets into stackframe
24  * SP_  = offsets into stack sie64 is called with
25  * SPI_ = offsets into irq stack
26  */
27 SP_GREGS = __SF_EMPTY
28 SP_HOOK  = __SF_EMPTY+8
29 SP_GPP   = __SF_EMPTY+16
30 SPI_PSW  = STACK_FRAME_OVERHEAD + __PT_PSW
31
32
33         .macro SPP newpp
34         tm      __LC_MACHINE_FLAGS+6,0x20       # MACHINE_FLAG_SPP
35         jz      0f
36         .insn   s,0xb2800000,\newpp
37 0:
38         .endm
39
40 sie_irq_handler:
41         SPP     __LC_CMF_HPP                    # set host id
42         larl    %r2,sie_inst
43         clg     %r2,SPI_PSW+8(0,%r15)           # intercepted sie
44         jne     1f
45         xc      __LC_SIE_HOOK(8),__LC_SIE_HOOK
46         lg      %r2,__LC_THREAD_INFO            # pointer thread_info struct
47         tm      __TI_flags+7(%r2),_TIF_EXIT_SIE
48         jz      0f
49         larl    %r2,sie_exit                    # work pending, leave sie
50         stg     %r2,SPI_PSW+8(0,%r15)
51         br      %r14
52 0:      larl    %r2,sie_reenter                 # re-enter with guest id
53         stg     %r2,SPI_PSW+8(0,%r15)
54 1:      br      %r14
55
56 /*
57  * sie64a calling convention:
58  * %r2 pointer to sie control block
59  * %r3 guest register save area
60  */
61         .globl  sie64a
62 sie64a:
63         stg     %r3,SP_GREGS(%r15)              # save guest register save area
64         stmg    %r6,%r14,__SF_GPRS(%r15)        # save registers on entry
65         lgr     %r14,%r2                        # pointer to sie control block
66         larl    %r5,sie_irq_handler
67         stg     %r2,SP_GPP(%r15)
68         stg     %r5,SP_HOOK(%r15)               # save hook target
69         lmg     %r0,%r13,0(%r3)                 # load guest gprs 0-13
70 sie_reenter:
71         mvc     __LC_SIE_HOOK(8),SP_HOOK(%r15)
72         SPP     SP_GPP(%r15)                    # set guest id
73 sie_inst:
74         sie     0(%r14)
75         xc      __LC_SIE_HOOK(8),__LC_SIE_HOOK
76         SPP     __LC_CMF_HPP                    # set host id
77 sie_exit:
78         lg      %r14,SP_GREGS(%r15)
79         stmg    %r0,%r13,0(%r14)                # save guest gprs 0-13
80         lghi    %r2,0
81         lmg     %r6,%r14,__SF_GPRS(%r15)
82         br      %r14
83
84 sie_err:
85         xc      __LC_SIE_HOOK(8),__LC_SIE_HOOK
86         SPP     __LC_CMF_HPP                    # set host id
87         lg      %r14,SP_GREGS(%r15)
88         stmg    %r0,%r13,0(%r14)                # save guest gprs 0-13
89         lghi    %r2,-EFAULT
90         lmg     %r6,%r14,__SF_GPRS(%r15)
91         br      %r14
92
93         .section __ex_table,"a"
94         .quad   sie_inst,sie_err
95         .quad   sie_exit,sie_err
96         .quad   sie_reenter,sie_err
97         .previous