Merge branch 'linus'
[linux-2.6] / arch / powerpc / platforms / pseries / hvCall.S
1 /*
2  * This file contains the generic code to perform a call to the
3  * pSeries LPAR hypervisor.
4  * NOTE: this file will go away when we move to inline this work.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version
9  * 2 of the License, or (at your option) any later version.
10  */
11 #include <asm/hvcall.h>
12 #include <asm/processor.h>
13 #include <asm/ppc_asm.h>
14         
15 #define STK_PARM(i)     (48 + ((i)-3)*8)
16
17         .text
18
19 /* long plpar_hcall(unsigned long opcode,               R3
20                         unsigned long arg1,             R4
21                         unsigned long arg2,             R5
22                         unsigned long arg3,             R6
23                         unsigned long arg4,             R7
24                         unsigned long *out1,            R8
25                         unsigned long *out2,            R9
26                         unsigned long *out3);           R10
27  */
28 _GLOBAL(plpar_hcall)
29         HMT_MEDIUM
30
31         mfcr    r0
32
33         std     r8,STK_PARM(r8)(r1)     /* Save out ptrs */
34         std     r9,STK_PARM(r9)(r1)
35         std     r10,STK_PARM(r10)(r1)
36
37         stw     r0,8(r1)
38
39         HVSC                            /* invoke the hypervisor */
40
41         lwz     r0,8(r1)
42
43         ld      r8,STK_PARM(r8)(r1)     /* Fetch r4-r6 ret args */
44         ld      r9,STK_PARM(r9)(r1)
45         ld      r10,STK_PARM(r10)(r1)
46         std     r4,0(r8)
47         std     r5,0(r9)
48         std     r6,0(r10)
49
50         mtcrf   0xff,r0
51         blr                             /* return r3 = status */
52
53
54 /* Simple interface with no output values (other than status) */
55 _GLOBAL(plpar_hcall_norets)
56         HMT_MEDIUM
57
58         mfcr    r0
59         stw     r0,8(r1)
60
61         HVSC                            /* invoke the hypervisor */
62
63         lwz     r0,8(r1)
64         mtcrf   0xff,r0
65         blr                             /* return r3 = status */
66
67
68 /* long plpar_hcall_8arg_2ret(unsigned long opcode,     R3
69                         unsigned long arg1,             R4
70                         unsigned long arg2,             R5
71                         unsigned long arg3,             R6
72                         unsigned long arg4,             R7
73                         unsigned long arg5,             R8
74                         unsigned long arg6,             R9
75                         unsigned long arg7,             R10
76                         unsigned long arg8,             112(R1)
77                         unsigned long *out1);           120(R1)
78  */
79 _GLOBAL(plpar_hcall_8arg_2ret)
80         HMT_MEDIUM
81
82         mfcr    r0
83         ld      r11,STK_PARM(r11)(r1)   /* put arg8 in R11 */
84         stw     r0,8(r1)
85
86         HVSC                            /* invoke the hypervisor */
87
88         lwz     r0,8(r1)
89         ld      r10,STK_PARM(r12)(r1)   /* Fetch r4 ret arg */
90         std     r4,0(r10)
91         mtcrf   0xff,r0
92         blr                             /* return r3 = status */
93
94
95 /* long plpar_hcall_4out(unsigned long opcode,          R3
96                         unsigned long arg1,             R4
97                         unsigned long arg2,             R5
98                         unsigned long arg3,             R6
99                         unsigned long arg4,             R7
100                         unsigned long *out1,            R8
101                         unsigned long *out2,            R9
102                         unsigned long *out3,            R10
103                         unsigned long *out4);           112(R1)
104  */
105 _GLOBAL(plpar_hcall_4out)
106         HMT_MEDIUM
107
108         mfcr    r0
109         stw     r0,8(r1)
110
111         std     r8,STK_PARM(r8)(r1)     /* Save out ptrs */
112         std     r9,STK_PARM(r9)(r1)
113         std     r10,STK_PARM(r10)(r1)
114
115         HVSC                            /* invoke the hypervisor */
116
117         lwz     r0,8(r1)
118
119         ld      r8,STK_PARM(r8)(r1)     /* Fetch r4-r7 ret args */
120         ld      r9,STK_PARM(r9)(r1)
121         ld      r10,STK_PARM(r10)(r1)
122         ld      r11,STK_PARM(r11)(r1)
123         std     r4,0(r8)
124         std     r5,0(r9)
125         std     r6,0(r10)
126         std     r7,0(r11)
127
128         mtcrf   0xff,r0
129         blr                             /* return r3 = status */