Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/powerpc/platforms/cell/beat_hvCall.S
10818 views
1
/*
2
* Beat hypervisor call I/F
3
*
4
* (C) Copyright 2007 TOSHIBA CORPORATION
5
*
6
* This code is based on arch/powerpc/platforms/pseries/hvCall.S.
7
*
8
* This program is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* This program is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License along
19
* with this program; if not, write to the Free Software Foundation, Inc.,
20
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21
*/
22
23
#include <asm/ppc_asm.h>
24
25
#define STK_PARM(i) (48 + ((i)-3)*8)
26
27
/* Not implemented on Beat, now */
28
#define HCALL_INST_PRECALL
29
#define HCALL_INST_POSTCALL
30
31
.text
32
33
#define HVSC .long 0x44000022
34
35
/* Note: takes only 7 input parameters at maximum */
36
_GLOBAL(beat_hcall_norets)
37
HMT_MEDIUM
38
39
mfcr r0
40
stw r0,8(r1)
41
42
HCALL_INST_PRECALL
43
44
mr r11,r3
45
mr r3,r4
46
mr r4,r5
47
mr r5,r6
48
mr r6,r7
49
mr r7,r8
50
mr r8,r9
51
52
HVSC /* invoke the hypervisor */
53
54
HCALL_INST_POSTCALL
55
56
lwz r0,8(r1)
57
mtcrf 0xff,r0
58
59
blr /* return r3 = status */
60
61
/* Note: takes 8 input parameters at maximum */
62
_GLOBAL(beat_hcall_norets8)
63
HMT_MEDIUM
64
65
mfcr r0
66
stw r0,8(r1)
67
68
HCALL_INST_PRECALL
69
70
mr r11,r3
71
mr r3,r4
72
mr r4,r5
73
mr r5,r6
74
mr r6,r7
75
mr r7,r8
76
mr r8,r9
77
ld r10,STK_PARM(r10)(r1)
78
79
HVSC /* invoke the hypervisor */
80
81
HCALL_INST_POSTCALL
82
83
lwz r0,8(r1)
84
mtcrf 0xff,r0
85
86
blr /* return r3 = status */
87
88
/* Note: takes only 6 input parameters, 1 output parameters at maximum */
89
_GLOBAL(beat_hcall1)
90
HMT_MEDIUM
91
92
mfcr r0
93
stw r0,8(r1)
94
95
HCALL_INST_PRECALL
96
97
std r4,STK_PARM(r4)(r1) /* save ret buffer */
98
99
mr r11,r3
100
mr r3,r5
101
mr r4,r6
102
mr r5,r7
103
mr r6,r8
104
mr r7,r9
105
mr r8,r10
106
107
HVSC /* invoke the hypervisor */
108
109
HCALL_INST_POSTCALL
110
111
ld r12,STK_PARM(r4)(r1)
112
std r4, 0(r12)
113
114
lwz r0,8(r1)
115
mtcrf 0xff,r0
116
117
blr /* return r3 = status */
118
119
/* Note: takes only 6 input parameters, 2 output parameters at maximum */
120
_GLOBAL(beat_hcall2)
121
HMT_MEDIUM
122
123
mfcr r0
124
stw r0,8(r1)
125
126
HCALL_INST_PRECALL
127
128
std r4,STK_PARM(r4)(r1) /* save ret buffer */
129
130
mr r11,r3
131
mr r3,r5
132
mr r4,r6
133
mr r5,r7
134
mr r6,r8
135
mr r7,r9
136
mr r8,r10
137
138
HVSC /* invoke the hypervisor */
139
140
HCALL_INST_POSTCALL
141
142
ld r12,STK_PARM(r4)(r1)
143
std r4, 0(r12)
144
std r5, 8(r12)
145
146
lwz r0,8(r1)
147
mtcrf 0xff,r0
148
149
blr /* return r3 = status */
150
151
/* Note: takes only 6 input parameters, 3 output parameters at maximum */
152
_GLOBAL(beat_hcall3)
153
HMT_MEDIUM
154
155
mfcr r0
156
stw r0,8(r1)
157
158
HCALL_INST_PRECALL
159
160
std r4,STK_PARM(r4)(r1) /* save ret buffer */
161
162
mr r11,r3
163
mr r3,r5
164
mr r4,r6
165
mr r5,r7
166
mr r6,r8
167
mr r7,r9
168
mr r8,r10
169
170
HVSC /* invoke the hypervisor */
171
172
HCALL_INST_POSTCALL
173
174
ld r12,STK_PARM(r4)(r1)
175
std r4, 0(r12)
176
std r5, 8(r12)
177
std r6, 16(r12)
178
179
lwz r0,8(r1)
180
mtcrf 0xff,r0
181
182
blr /* return r3 = status */
183
184
/* Note: takes only 6 input parameters, 4 output parameters at maximum */
185
_GLOBAL(beat_hcall4)
186
HMT_MEDIUM
187
188
mfcr r0
189
stw r0,8(r1)
190
191
HCALL_INST_PRECALL
192
193
std r4,STK_PARM(r4)(r1) /* save ret buffer */
194
195
mr r11,r3
196
mr r3,r5
197
mr r4,r6
198
mr r5,r7
199
mr r6,r8
200
mr r7,r9
201
mr r8,r10
202
203
HVSC /* invoke the hypervisor */
204
205
HCALL_INST_POSTCALL
206
207
ld r12,STK_PARM(r4)(r1)
208
std r4, 0(r12)
209
std r5, 8(r12)
210
std r6, 16(r12)
211
std r7, 24(r12)
212
213
lwz r0,8(r1)
214
mtcrf 0xff,r0
215
216
blr /* return r3 = status */
217
218
/* Note: takes only 6 input parameters, 5 output parameters at maximum */
219
_GLOBAL(beat_hcall5)
220
HMT_MEDIUM
221
222
mfcr r0
223
stw r0,8(r1)
224
225
HCALL_INST_PRECALL
226
227
std r4,STK_PARM(r4)(r1) /* save ret buffer */
228
229
mr r11,r3
230
mr r3,r5
231
mr r4,r6
232
mr r5,r7
233
mr r6,r8
234
mr r7,r9
235
mr r8,r10
236
237
HVSC /* invoke the hypervisor */
238
239
HCALL_INST_POSTCALL
240
241
ld r12,STK_PARM(r4)(r1)
242
std r4, 0(r12)
243
std r5, 8(r12)
244
std r6, 16(r12)
245
std r7, 24(r12)
246
std r8, 32(r12)
247
248
lwz r0,8(r1)
249
mtcrf 0xff,r0
250
251
blr /* return r3 = status */
252
253
/* Note: takes only 6 input parameters, 6 output parameters at maximum */
254
_GLOBAL(beat_hcall6)
255
HMT_MEDIUM
256
257
mfcr r0
258
stw r0,8(r1)
259
260
HCALL_INST_PRECALL
261
262
std r4,STK_PARM(r4)(r1) /* save ret buffer */
263
264
mr r11,r3
265
mr r3,r5
266
mr r4,r6
267
mr r5,r7
268
mr r6,r8
269
mr r7,r9
270
mr r8,r10
271
272
HVSC /* invoke the hypervisor */
273
274
HCALL_INST_POSTCALL
275
276
ld r12,STK_PARM(r4)(r1)
277
std r4, 0(r12)
278
std r5, 8(r12)
279
std r6, 16(r12)
280
std r7, 24(r12)
281
std r8, 32(r12)
282
std r9, 40(r12)
283
284
lwz r0,8(r1)
285
mtcrf 0xff,r0
286
287
blr /* return r3 = status */
288
289