Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/linux...
[linux-2.6] / arch / s390 / kvm / sie64a.S
1 /*
2  * sie64a.S - low level sie call
3  *
4  * Copyright IBM Corp. 2008
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  */
12
13 #include <linux/errno.h>
14 #include <asm/asm-offsets.h>
15
16 SP_R5 = 5 * 8   # offset into stackframe
17 SP_R6 = 6 * 8
18
19 /*
20  * sie64a calling convention:
21  * %r2 pointer to sie control block
22  * %r3 guest register save area
23  */
24         .globl  sie64a
25 sie64a:
26         lgr     %r5,%r3
27         stmg    %r5,%r14,SP_R5(%r15)    # save register on entry
28         lgr     %r14,%r2                # pointer to sie control block
29         lmg     %r0,%r13,0(%r3)         # load guest gprs 0-13
30 sie_inst:
31         sie     0(%r14)
32         lg      %r14,SP_R5(%r15)
33         stmg    %r0,%r13,0(%r14)        # save guest gprs 0-13
34         lghi    %r2,0
35         lmg     %r6,%r14,SP_R6(%r15)
36         br      %r14
37
38 sie_err:
39         lg      %r14,SP_R5(%r15)
40         stmg    %r0,%r13,0(%r14)        # save guest gprs 0-13
41         lghi    %r2,-EFAULT
42         lmg     %r6,%r14,SP_R6(%r15)
43         br      %r14
44
45         .section __ex_table,"a"
46         .quad   sie_inst,sie_err
47         .previous