diff options
author | Anton Blanchard <anton@samba.org> | 2006-07-18 18:01:28 -0400 |
---|---|---|
committer | Paul Mackerras <paulus@samba.org> | 2006-08-01 02:19:15 -0400 |
commit | b9377ffc3a03cde558d76349a262a1adbb6d3112 (patch) | |
tree | c61fcdb732d06c64b9c5634953e46cefdf6af846 /arch/powerpc/platforms/pseries/hvCall.S | |
parent | 57cad8084e0837e0f2c97da789ec9b3f36809be9 (diff) |
[POWERPC] clean up pseries hcall interfaces
Our pseries hcall interfaces are out of control:
plpar_hcall_norets
plpar_hcall
plpar_hcall_8arg_2ret
plpar_hcall_4out
plpar_hcall_7arg_7ret
plpar_hcall_9arg_9ret
Create 3 interfaces to cover all cases:
plpar_hcall_norets: 7 arguments no returns
plpar_hcall: 6 arguments 4 returns
plpar_hcall9: 9 arguments 9 returns
There are only 2 cases in the kernel that need plpar_hcall9, hopefully
we can keep it that way.
Pass in a buffer to stash return parameters so we avoid the &dummy1,
&dummy2 madness.
Signed-off-by: Anton Blanchard <anton@samba.org>
--
Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'arch/powerpc/platforms/pseries/hvCall.S')
-rw-r--r-- | arch/powerpc/platforms/pseries/hvCall.S | 207 |
1 files changed, 35 insertions, 172 deletions
diff --git a/arch/powerpc/platforms/pseries/hvCall.S b/arch/powerpc/platforms/pseries/hvCall.S index c9ff547f9d2..9a99b056bd2 100644 --- a/arch/powerpc/platforms/pseries/hvCall.S +++ b/arch/powerpc/platforms/pseries/hvCall.S | |||
@@ -1,7 +1,6 @@ | |||
1 | /* | 1 | /* |
2 | * This file contains the generic code to perform a call to the | 2 | * This file contains the generic code to perform a call to the |
3 | * pSeries LPAR hypervisor. | 3 | * pSeries LPAR hypervisor. |
4 | * NOTE: this file will go away when we move to inline this work. | ||
5 | * | 4 | * |
6 | * This program is free software; you can redistribute it and/or | 5 | * This program is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU General Public License | 6 | * modify it under the terms of the GNU General Public License |
@@ -16,42 +15,6 @@ | |||
16 | 15 | ||
17 | .text | 16 | .text |
18 | 17 | ||
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) | 18 | _GLOBAL(plpar_hcall_norets) |
56 | HMT_MEDIUM | 19 | HMT_MEDIUM |
57 | 20 | ||
@@ -64,164 +27,64 @@ _GLOBAL(plpar_hcall_norets) | |||
64 | mtcrf 0xff,r0 | 27 | mtcrf 0xff,r0 |
65 | blr /* return r3 = status */ | 28 | blr /* return r3 = status */ |
66 | 29 | ||
67 | 30 | _GLOBAL(plpar_hcall) | |
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 | 31 | HMT_MEDIUM |
81 | 32 | ||
82 | mfcr r0 | 33 | mfcr r0 |
83 | ld r11,STK_PARM(r11)(r1) /* put arg8 in R11 */ | ||
84 | stw r0,8(r1) | 34 | stw r0,8(r1) |
85 | 35 | ||
86 | HVSC /* invoke the hypervisor */ | 36 | std r4,STK_PARM(r4)(r1) /* Save ret buffer */ |
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 | 37 | ||
111 | std r8,STK_PARM(r8)(r1) /* Save out ptrs */ | 38 | mr r4,r5 |
112 | std r9,STK_PARM(r9)(r1) | 39 | mr r5,r6 |
113 | std r10,STK_PARM(r10)(r1) | 40 | mr r6,r7 |
41 | mr r7,r8 | ||
42 | mr r8,r9 | ||
43 | mr r9,r10 | ||
114 | 44 | ||
115 | HVSC /* invoke the hypervisor */ | 45 | HVSC /* invoke the hypervisor */ |
116 | 46 | ||
117 | lwz r0,8(r1) | 47 | ld r12,STK_PARM(r4)(r1) |
118 | 48 | std r4, 0(r12) | |
119 | ld r8,STK_PARM(r8)(r1) /* Fetch r4-r7 ret args */ | 49 | std r5, 8(r12) |
120 | ld r9,STK_PARM(r9)(r1) | 50 | std r6, 16(r12) |
121 | ld r10,STK_PARM(r10)(r1) | 51 | std r7, 24(r12) |
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 */ | ||
130 | |||
131 | /* plpar_hcall_7arg_7ret(unsigned long opcode, R3 | ||
132 | unsigned long arg1, R4 | ||
133 | unsigned long arg2, R5 | ||
134 | unsigned long arg3, R6 | ||
135 | unsigned long arg4, R7 | ||
136 | unsigned long arg5, R8 | ||
137 | unsigned long arg6, R9 | ||
138 | unsigned long arg7, R10 | ||
139 | unsigned long *out1, 112(R1) | ||
140 | unsigned long *out2, 110(R1) | ||
141 | unsigned long *out3, 108(R1) | ||
142 | unsigned long *out4, 106(R1) | ||
143 | unsigned long *out5, 104(R1) | ||
144 | unsigned long *out6, 102(R1) | ||
145 | unsigned long *out7); 100(R1) | ||
146 | */ | ||
147 | _GLOBAL(plpar_hcall_7arg_7ret) | ||
148 | HMT_MEDIUM | ||
149 | |||
150 | mfcr r0 | ||
151 | stw r0,8(r1) | ||
152 | |||
153 | HVSC /* invoke the hypervisor */ | ||
154 | 52 | ||
155 | lwz r0,8(r1) | 53 | lwz r0,8(r1) |
156 | |||
157 | ld r11,STK_PARM(r11)(r1) /* Fetch r4 ret arg */ | ||
158 | std r4,0(r11) | ||
159 | ld r11,STK_PARM(r12)(r1) /* Fetch r5 ret arg */ | ||
160 | std r5,0(r11) | ||
161 | ld r11,STK_PARM(r13)(r1) /* Fetch r6 ret arg */ | ||
162 | std r6,0(r11) | ||
163 | ld r11,STK_PARM(r14)(r1) /* Fetch r7 ret arg */ | ||
164 | std r7,0(r11) | ||
165 | ld r11,STK_PARM(r15)(r1) /* Fetch r8 ret arg */ | ||
166 | std r8,0(r11) | ||
167 | ld r11,STK_PARM(r16)(r1) /* Fetch r9 ret arg */ | ||
168 | std r9,0(r11) | ||
169 | ld r11,STK_PARM(r17)(r1) /* Fetch r10 ret arg */ | ||
170 | std r10,0(r11) | ||
171 | |||
172 | mtcrf 0xff,r0 | 54 | mtcrf 0xff,r0 |
173 | 55 | ||
174 | blr /* return r3 = status */ | 56 | blr /* return r3 = status */ |
175 | 57 | ||
176 | /* plpar_hcall_9arg_9ret(unsigned long opcode, R3 | 58 | _GLOBAL(plpar_hcall9) |
177 | unsigned long arg1, R4 | ||
178 | unsigned long arg2, R5 | ||
179 | unsigned long arg3, R6 | ||
180 | unsigned long arg4, R7 | ||
181 | unsigned long arg5, R8 | ||
182 | unsigned long arg6, R9 | ||
183 | unsigned long arg7, R10 | ||
184 | unsigned long arg8, 112(R1) | ||
185 | unsigned long arg9, 110(R1) | ||
186 | unsigned long *out1, 108(R1) | ||
187 | unsigned long *out2, 106(R1) | ||
188 | unsigned long *out3, 104(R1) | ||
189 | unsigned long *out4, 102(R1) | ||
190 | unsigned long *out5, 100(R1) | ||
191 | unsigned long *out6, 98(R1) | ||
192 | unsigned long *out7); 96(R1) | ||
193 | unsigned long *out8, 94(R1) | ||
194 | unsigned long *out9, 92(R1) | ||
195 | */ | ||
196 | _GLOBAL(plpar_hcall_9arg_9ret) | ||
197 | HMT_MEDIUM | 59 | HMT_MEDIUM |
198 | 60 | ||
199 | mfcr r0 | 61 | mfcr r0 |
200 | stw r0,8(r1) | 62 | stw r0,8(r1) |
201 | 63 | ||
202 | ld r11,STK_PARM(r11)(r1) /* put arg8 in R11 */ | 64 | std r4,STK_PARM(r4)(r1) /* Save ret buffer */ |
203 | ld r12,STK_PARM(r12)(r1) /* put arg9 in R12 */ | 65 | |
66 | mr r4,r5 | ||
67 | mr r5,r6 | ||
68 | mr r6,r7 | ||
69 | mr r7,r8 | ||
70 | mr r8,r9 | ||
71 | mr r9,r10 | ||
72 | ld r10,STK_PARM(r11)(r1) /* put arg7 in R10 */ | ||
73 | ld r11,STK_PARM(r12)(r1) /* put arg8 in R11 */ | ||
74 | ld r12,STK_PARM(r13)(r1) /* put arg9 in R12 */ | ||
204 | 75 | ||
205 | HVSC /* invoke the hypervisor */ | 76 | HVSC /* invoke the hypervisor */ |
206 | 77 | ||
207 | ld r0,STK_PARM(r13)(r1) /* Fetch r4 ret arg */ | 78 | ld r12,STK_PARM(r4)(r1) |
208 | stdx r4,r0,r0 | 79 | std r4, 0(r12) |
209 | ld r0,STK_PARM(r14)(r1) /* Fetch r5 ret arg */ | 80 | std r5, 8(r12) |
210 | stdx r5,r0,r0 | 81 | std r6, 16(r12) |
211 | ld r0,STK_PARM(r15)(r1) /* Fetch r6 ret arg */ | 82 | std r7, 24(r12) |
212 | stdx r6,r0,r0 | 83 | std r8, 32(r12) |
213 | ld r0,STK_PARM(r16)(r1) /* Fetch r7 ret arg */ | 84 | std r9, 40(r12) |
214 | stdx r7,r0,r0 | 85 | std r10,48(r12) |
215 | ld r0,STK_PARM(r17)(r1) /* Fetch r8 ret arg */ | 86 | std r11,56(r12) |
216 | stdx r8,r0,r0 | 87 | std r12,64(r12) |
217 | ld r0,STK_PARM(r18)(r1) /* Fetch r9 ret arg */ | ||
218 | stdx r9,r0,r0 | ||
219 | ld r0,STK_PARM(r19)(r1) /* Fetch r10 ret arg */ | ||
220 | stdx r10,r0,r0 | ||
221 | ld r0,STK_PARM(r20)(r1) /* Fetch r11 ret arg */ | ||
222 | stdx r11,r0,r0 | ||
223 | ld r0,STK_PARM(r21)(r1) /* Fetch r12 ret arg */ | ||
224 | stdx r12,r0,r0 | ||
225 | 88 | ||
226 | lwz r0,8(r1) | 89 | lwz r0,8(r1) |
227 | mtcrf 0xff,r0 | 90 | mtcrf 0xff,r0 |