1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * PS3 hvcall interface. |
4 | * |
5 | * Copyright (C) 2006 Sony Computer Entertainment Inc. |
6 | * Copyright 2006 Sony Corp. |
7 | * Copyright 2003, 2004 (c) MontaVista Software, Inc. |
8 | */ |
9 | |
10 | #include <asm/processor.h> |
11 | #include <asm/ppc_asm.h> |
12 | #include <asm/ptrace.h> |
13 | |
14 | #define lv1call .long 0x44000022; extsw r3, r3 |
15 | |
16 | #define LV1_N_IN_0_OUT(API_NAME, API_NUMBER) \ |
17 | _GLOBAL(_##API_NAME) \ |
18 | \ |
19 | mflr r0; \ |
20 | std r0, LRSAVE(r1); \ |
21 | \ |
22 | stdu r1, -STACK_FRAME_MIN_SIZE(r1); \ |
23 | li r11, API_NUMBER; \ |
24 | lv1call; \ |
25 | addi r1, r1, STACK_FRAME_MIN_SIZE; \ |
26 | \ |
27 | ld r0, LRSAVE(r1); \ |
28 | mtlr r0; \ |
29 | blr |
30 | |
31 | #define LV1_0_IN_0_OUT LV1_N_IN_0_OUT |
32 | #define LV1_1_IN_0_OUT LV1_N_IN_0_OUT |
33 | #define LV1_2_IN_0_OUT LV1_N_IN_0_OUT |
34 | #define LV1_3_IN_0_OUT LV1_N_IN_0_OUT |
35 | #define LV1_4_IN_0_OUT LV1_N_IN_0_OUT |
36 | #define LV1_5_IN_0_OUT LV1_N_IN_0_OUT |
37 | #define LV1_6_IN_0_OUT LV1_N_IN_0_OUT |
38 | #define LV1_7_IN_0_OUT LV1_N_IN_0_OUT |
39 | |
40 | #define LV1_0_IN_1_OUT(API_NAME, API_NUMBER) \ |
41 | _GLOBAL(_##API_NAME) \ |
42 | \ |
43 | mflr r0; \ |
44 | std r0, LRSAVE(r1); \ |
45 | \ |
46 | std r3, -8(r1); \ |
47 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
48 | \ |
49 | li r11, API_NUMBER; \ |
50 | lv1call; \ |
51 | \ |
52 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
53 | ld r11, -8(r1); \ |
54 | std r4, 0(r11); \ |
55 | \ |
56 | ld r0, LRSAVE(r1); \ |
57 | mtlr r0; \ |
58 | blr |
59 | |
60 | #define LV1_0_IN_2_OUT(API_NAME, API_NUMBER) \ |
61 | _GLOBAL(_##API_NAME) \ |
62 | \ |
63 | mflr r0; \ |
64 | std r0, LRSAVE(r1); \ |
65 | \ |
66 | std r3, -8(r1); \ |
67 | std r4, -16(r1); \ |
68 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
69 | \ |
70 | li r11, API_NUMBER; \ |
71 | lv1call; \ |
72 | \ |
73 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
74 | ld r11, -8(r1); \ |
75 | std r4, 0(r11); \ |
76 | ld r11, -16(r1); \ |
77 | std r5, 0(r11); \ |
78 | \ |
79 | ld r0, LRSAVE(r1); \ |
80 | mtlr r0; \ |
81 | blr |
82 | |
83 | #define LV1_0_IN_3_OUT(API_NAME, API_NUMBER) \ |
84 | _GLOBAL(_##API_NAME) \ |
85 | \ |
86 | mflr r0; \ |
87 | std r0, LRSAVE(r1); \ |
88 | \ |
89 | std r3, -8(r1); \ |
90 | std r4, -16(r1); \ |
91 | std r5, -24(r1); \ |
92 | stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \ |
93 | \ |
94 | li r11, API_NUMBER; \ |
95 | lv1call; \ |
96 | \ |
97 | addi r1, r1, STACK_FRAME_MIN_SIZE+24; \ |
98 | ld r11, -8(r1); \ |
99 | std r4, 0(r11); \ |
100 | ld r11, -16(r1); \ |
101 | std r5, 0(r11); \ |
102 | ld r11, -24(r1); \ |
103 | std r6, 0(r11); \ |
104 | \ |
105 | ld r0, LRSAVE(r1); \ |
106 | mtlr r0; \ |
107 | blr |
108 | |
109 | #define LV1_0_IN_7_OUT(API_NAME, API_NUMBER) \ |
110 | _GLOBAL(_##API_NAME) \ |
111 | \ |
112 | mflr r0; \ |
113 | std r0, LRSAVE(r1); \ |
114 | \ |
115 | std r3, -8(r1); \ |
116 | std r4, -16(r1); \ |
117 | std r5, -24(r1); \ |
118 | std r6, -32(r1); \ |
119 | std r7, -40(r1); \ |
120 | std r8, -48(r1); \ |
121 | std r9, -56(r1); \ |
122 | stdu r1, -STACK_FRAME_MIN_SIZE-56(r1); \ |
123 | \ |
124 | li r11, API_NUMBER; \ |
125 | lv1call; \ |
126 | \ |
127 | addi r1, r1, STACK_FRAME_MIN_SIZE+56; \ |
128 | ld r11, -8(r1); \ |
129 | std r4, 0(r11); \ |
130 | ld r11, -16(r1); \ |
131 | std r5, 0(r11); \ |
132 | ld r11, -24(r1); \ |
133 | std r6, 0(r11); \ |
134 | ld r11, -32(r1); \ |
135 | std r7, 0(r11); \ |
136 | ld r11, -40(r1); \ |
137 | std r8, 0(r11); \ |
138 | ld r11, -48(r1); \ |
139 | std r9, 0(r11); \ |
140 | ld r11, -56(r1); \ |
141 | std r10, 0(r11); \ |
142 | \ |
143 | ld r0, LRSAVE(r1); \ |
144 | mtlr r0; \ |
145 | blr |
146 | |
147 | #define LV1_1_IN_1_OUT(API_NAME, API_NUMBER) \ |
148 | _GLOBAL(_##API_NAME) \ |
149 | \ |
150 | mflr r0; \ |
151 | std r0, LRSAVE(r1); \ |
152 | \ |
153 | std r4, -8(r1); \ |
154 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
155 | \ |
156 | li r11, API_NUMBER; \ |
157 | lv1call; \ |
158 | \ |
159 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
160 | ld r11, -8(r1); \ |
161 | std r4, 0(r11); \ |
162 | \ |
163 | ld r0, LRSAVE(r1); \ |
164 | mtlr r0; \ |
165 | blr |
166 | |
167 | #define LV1_1_IN_2_OUT(API_NAME, API_NUMBER) \ |
168 | _GLOBAL(_##API_NAME) \ |
169 | \ |
170 | mflr r0; \ |
171 | std r0, LRSAVE(r1); \ |
172 | \ |
173 | std r4, -8(r1); \ |
174 | std r5, -16(r1); \ |
175 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
176 | \ |
177 | li r11, API_NUMBER; \ |
178 | lv1call; \ |
179 | \ |
180 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
181 | ld r11, -8(r1); \ |
182 | std r4, 0(r11); \ |
183 | ld r11, -16(r1); \ |
184 | std r5, 0(r11); \ |
185 | \ |
186 | ld r0, LRSAVE(r1); \ |
187 | mtlr r0; \ |
188 | blr |
189 | |
190 | #define LV1_1_IN_3_OUT(API_NAME, API_NUMBER) \ |
191 | _GLOBAL(_##API_NAME) \ |
192 | \ |
193 | mflr r0; \ |
194 | std r0, LRSAVE(r1); \ |
195 | \ |
196 | std r4, -8(r1); \ |
197 | std r5, -16(r1); \ |
198 | std r6, -24(r1); \ |
199 | stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \ |
200 | \ |
201 | li r11, API_NUMBER; \ |
202 | lv1call; \ |
203 | \ |
204 | addi r1, r1, STACK_FRAME_MIN_SIZE+24; \ |
205 | ld r11, -8(r1); \ |
206 | std r4, 0(r11); \ |
207 | ld r11, -16(r1); \ |
208 | std r5, 0(r11); \ |
209 | ld r11, -24(r1); \ |
210 | std r6, 0(r11); \ |
211 | \ |
212 | ld r0, LRSAVE(r1); \ |
213 | mtlr r0; \ |
214 | blr |
215 | |
216 | #define LV1_1_IN_4_OUT(API_NAME, API_NUMBER) \ |
217 | _GLOBAL(_##API_NAME) \ |
218 | \ |
219 | mflr r0; \ |
220 | std r0, LRSAVE(r1); \ |
221 | \ |
222 | std r4, -8(r1); \ |
223 | std r5, -16(r1); \ |
224 | std r6, -24(r1); \ |
225 | std r7, -32(r1); \ |
226 | stdu r1, -STACK_FRAME_MIN_SIZE-32(r1); \ |
227 | \ |
228 | li r11, API_NUMBER; \ |
229 | lv1call; \ |
230 | \ |
231 | addi r1, r1, STACK_FRAME_MIN_SIZE+32; \ |
232 | ld r11, -8(r1); \ |
233 | std r4, 0(r11); \ |
234 | ld r11, -16(r1); \ |
235 | std r5, 0(r11); \ |
236 | ld r11, -24(r1); \ |
237 | std r6, 0(r11); \ |
238 | ld r11, -32(r1); \ |
239 | std r7, 0(r11); \ |
240 | \ |
241 | ld r0, LRSAVE(r1); \ |
242 | mtlr r0; \ |
243 | blr |
244 | |
245 | #define LV1_1_IN_5_OUT(API_NAME, API_NUMBER) \ |
246 | _GLOBAL(_##API_NAME) \ |
247 | \ |
248 | mflr r0; \ |
249 | std r0, LRSAVE(r1); \ |
250 | \ |
251 | std r4, -8(r1); \ |
252 | std r5, -16(r1); \ |
253 | std r6, -24(r1); \ |
254 | std r7, -32(r1); \ |
255 | std r8, -40(r1); \ |
256 | stdu r1, -STACK_FRAME_MIN_SIZE-40(r1); \ |
257 | \ |
258 | li r11, API_NUMBER; \ |
259 | lv1call; \ |
260 | \ |
261 | addi r1, r1, STACK_FRAME_MIN_SIZE+40; \ |
262 | ld r11, -8(r1); \ |
263 | std r4, 0(r11); \ |
264 | ld r11, -16(r1); \ |
265 | std r5, 0(r11); \ |
266 | ld r11, -24(r1); \ |
267 | std r6, 0(r11); \ |
268 | ld r11, -32(r1); \ |
269 | std r7, 0(r11); \ |
270 | ld r11, -40(r1); \ |
271 | std r8, 0(r11); \ |
272 | \ |
273 | ld r0, LRSAVE(r1); \ |
274 | mtlr r0; \ |
275 | blr |
276 | |
277 | #define LV1_1_IN_6_OUT(API_NAME, API_NUMBER) \ |
278 | _GLOBAL(_##API_NAME) \ |
279 | \ |
280 | mflr r0; \ |
281 | std r0, LRSAVE(r1); \ |
282 | \ |
283 | std r4, -8(r1); \ |
284 | std r5, -16(r1); \ |
285 | std r6, -24(r1); \ |
286 | std r7, -32(r1); \ |
287 | std r8, -40(r1); \ |
288 | std r9, -48(r1); \ |
289 | stdu r1, -STACK_FRAME_MIN_SIZE-48(r1); \ |
290 | \ |
291 | li r11, API_NUMBER; \ |
292 | lv1call; \ |
293 | \ |
294 | addi r1, r1, STACK_FRAME_MIN_SIZE+48; \ |
295 | ld r11, -8(r1); \ |
296 | std r4, 0(r11); \ |
297 | ld r11, -16(r1); \ |
298 | std r5, 0(r11); \ |
299 | ld r11, -24(r1); \ |
300 | std r6, 0(r11); \ |
301 | ld r11, -32(r1); \ |
302 | std r7, 0(r11); \ |
303 | ld r11, -40(r1); \ |
304 | std r8, 0(r11); \ |
305 | ld r11, -48(r1); \ |
306 | std r9, 0(r11); \ |
307 | \ |
308 | ld r0, LRSAVE(r1); \ |
309 | mtlr r0; \ |
310 | blr |
311 | |
312 | #define LV1_1_IN_7_OUT(API_NAME, API_NUMBER) \ |
313 | _GLOBAL(_##API_NAME) \ |
314 | \ |
315 | mflr r0; \ |
316 | std r0, LRSAVE(r1); \ |
317 | \ |
318 | std r4, -8(r1); \ |
319 | std r5, -16(r1); \ |
320 | std r6, -24(r1); \ |
321 | std r7, -32(r1); \ |
322 | std r8, -40(r1); \ |
323 | std r9, -48(r1); \ |
324 | std r10, -56(r1); \ |
325 | stdu r1, -STACK_FRAME_MIN_SIZE-56(r1); \ |
326 | \ |
327 | li r11, API_NUMBER; \ |
328 | lv1call; \ |
329 | \ |
330 | addi r1, r1, STACK_FRAME_MIN_SIZE+56; \ |
331 | ld r11, -8(r1); \ |
332 | std r4, 0(r11); \ |
333 | ld r11, -16(r1); \ |
334 | std r5, 0(r11); \ |
335 | ld r11, -24(r1); \ |
336 | std r6, 0(r11); \ |
337 | ld r11, -32(r1); \ |
338 | std r7, 0(r11); \ |
339 | ld r11, -40(r1); \ |
340 | std r8, 0(r11); \ |
341 | ld r11, -48(r1); \ |
342 | std r9, 0(r11); \ |
343 | ld r11, -56(r1); \ |
344 | std r10, 0(r11); \ |
345 | \ |
346 | ld r0, LRSAVE(r1); \ |
347 | mtlr r0; \ |
348 | blr |
349 | |
350 | #define LV1_2_IN_1_OUT(API_NAME, API_NUMBER) \ |
351 | _GLOBAL(_##API_NAME) \ |
352 | \ |
353 | mflr r0; \ |
354 | std r0, LRSAVE(r1); \ |
355 | \ |
356 | std r5, -8(r1); \ |
357 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
358 | \ |
359 | li r11, API_NUMBER; \ |
360 | lv1call; \ |
361 | \ |
362 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
363 | ld r11, -8(r1); \ |
364 | std r4, 0(r11); \ |
365 | \ |
366 | ld r0, LRSAVE(r1); \ |
367 | mtlr r0; \ |
368 | blr |
369 | |
370 | #define LV1_2_IN_2_OUT(API_NAME, API_NUMBER) \ |
371 | _GLOBAL(_##API_NAME) \ |
372 | \ |
373 | mflr r0; \ |
374 | std r0, LRSAVE(r1); \ |
375 | \ |
376 | std r5, -8(r1); \ |
377 | std r6, -16(r1); \ |
378 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
379 | \ |
380 | li r11, API_NUMBER; \ |
381 | lv1call; \ |
382 | \ |
383 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
384 | ld r11, -8(r1); \ |
385 | std r4, 0(r11); \ |
386 | ld r11, -16(r1); \ |
387 | std r5, 0(r11); \ |
388 | \ |
389 | ld r0, LRSAVE(r1); \ |
390 | mtlr r0; \ |
391 | blr |
392 | |
393 | #define LV1_2_IN_3_OUT(API_NAME, API_NUMBER) \ |
394 | _GLOBAL(_##API_NAME) \ |
395 | \ |
396 | mflr r0; \ |
397 | std r0, LRSAVE(r1); \ |
398 | \ |
399 | std r5, -8(r1); \ |
400 | std r6, -16(r1); \ |
401 | std r7, -24(r1); \ |
402 | stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \ |
403 | \ |
404 | li r11, API_NUMBER; \ |
405 | lv1call; \ |
406 | \ |
407 | addi r1, r1, STACK_FRAME_MIN_SIZE+24; \ |
408 | ld r11, -8(r1); \ |
409 | std r4, 0(r11); \ |
410 | ld r11, -16(r1); \ |
411 | std r5, 0(r11); \ |
412 | ld r11, -24(r1); \ |
413 | std r6, 0(r11); \ |
414 | \ |
415 | ld r0, LRSAVE(r1); \ |
416 | mtlr r0; \ |
417 | blr |
418 | |
419 | #define LV1_2_IN_4_OUT(API_NAME, API_NUMBER) \ |
420 | _GLOBAL(_##API_NAME) \ |
421 | \ |
422 | mflr r0; \ |
423 | std r0, LRSAVE(r1); \ |
424 | \ |
425 | std r5, -8(r1); \ |
426 | std r6, -16(r1); \ |
427 | std r7, -24(r1); \ |
428 | std r8, -32(r1); \ |
429 | stdu r1, -STACK_FRAME_MIN_SIZE-32(r1); \ |
430 | \ |
431 | li r11, API_NUMBER; \ |
432 | lv1call; \ |
433 | \ |
434 | addi r1, r1, STACK_FRAME_MIN_SIZE+32;\ |
435 | ld r11, -8(r1); \ |
436 | std r4, 0(r11); \ |
437 | ld r11, -16(r1); \ |
438 | std r5, 0(r11); \ |
439 | ld r11, -24(r1); \ |
440 | std r6, 0(r11); \ |
441 | ld r11, -32(r1); \ |
442 | std r7, 0(r11); \ |
443 | \ |
444 | ld r0, LRSAVE(r1); \ |
445 | mtlr r0; \ |
446 | blr |
447 | |
448 | #define LV1_2_IN_5_OUT(API_NAME, API_NUMBER) \ |
449 | _GLOBAL(_##API_NAME) \ |
450 | \ |
451 | mflr r0; \ |
452 | std r0, LRSAVE(r1); \ |
453 | \ |
454 | std r5, -8(r1); \ |
455 | std r6, -16(r1); \ |
456 | std r7, -24(r1); \ |
457 | std r8, -32(r1); \ |
458 | std r9, -40(r1); \ |
459 | stdu r1, -STACK_FRAME_MIN_SIZE-40(r1); \ |
460 | \ |
461 | li r11, API_NUMBER; \ |
462 | lv1call; \ |
463 | \ |
464 | addi r1, r1, STACK_FRAME_MIN_SIZE+40; \ |
465 | ld r11, -8(r1); \ |
466 | std r4, 0(r11); \ |
467 | ld r11, -16(r1); \ |
468 | std r5, 0(r11); \ |
469 | ld r11, -24(r1); \ |
470 | std r6, 0(r11); \ |
471 | ld r11, -32(r1); \ |
472 | std r7, 0(r11); \ |
473 | ld r11, -40(r1); \ |
474 | std r8, 0(r11); \ |
475 | \ |
476 | ld r0, LRSAVE(r1); \ |
477 | mtlr r0; \ |
478 | blr |
479 | |
480 | #define LV1_3_IN_1_OUT(API_NAME, API_NUMBER) \ |
481 | _GLOBAL(_##API_NAME) \ |
482 | \ |
483 | mflr r0; \ |
484 | std r0, LRSAVE(r1); \ |
485 | \ |
486 | std r6, -8(r1); \ |
487 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
488 | \ |
489 | li r11, API_NUMBER; \ |
490 | lv1call; \ |
491 | \ |
492 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
493 | ld r11, -8(r1); \ |
494 | std r4, 0(r11); \ |
495 | \ |
496 | ld r0, LRSAVE(r1); \ |
497 | mtlr r0; \ |
498 | blr |
499 | |
500 | #define LV1_3_IN_2_OUT(API_NAME, API_NUMBER) \ |
501 | _GLOBAL(_##API_NAME) \ |
502 | \ |
503 | mflr r0; \ |
504 | std r0, LRSAVE(r1); \ |
505 | \ |
506 | std r6, -8(r1); \ |
507 | std r7, -16(r1); \ |
508 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
509 | \ |
510 | li r11, API_NUMBER; \ |
511 | lv1call; \ |
512 | \ |
513 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
514 | ld r11, -8(r1); \ |
515 | std r4, 0(r11); \ |
516 | ld r11, -16(r1); \ |
517 | std r5, 0(r11); \ |
518 | \ |
519 | ld r0, LRSAVE(r1); \ |
520 | mtlr r0; \ |
521 | blr |
522 | |
523 | #define LV1_3_IN_3_OUT(API_NAME, API_NUMBER) \ |
524 | _GLOBAL(_##API_NAME) \ |
525 | \ |
526 | mflr r0; \ |
527 | std r0, LRSAVE(r1); \ |
528 | \ |
529 | std r6, -8(r1); \ |
530 | std r7, -16(r1); \ |
531 | std r8, -24(r1); \ |
532 | stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \ |
533 | \ |
534 | li r11, API_NUMBER; \ |
535 | lv1call; \ |
536 | \ |
537 | addi r1, r1, STACK_FRAME_MIN_SIZE+24; \ |
538 | ld r11, -8(r1); \ |
539 | std r4, 0(r11); \ |
540 | ld r11, -16(r1); \ |
541 | std r5, 0(r11); \ |
542 | ld r11, -24(r1); \ |
543 | std r6, 0(r11); \ |
544 | \ |
545 | ld r0, LRSAVE(r1); \ |
546 | mtlr r0; \ |
547 | blr |
548 | |
549 | #define LV1_4_IN_1_OUT(API_NAME, API_NUMBER) \ |
550 | _GLOBAL(_##API_NAME) \ |
551 | \ |
552 | mflr r0; \ |
553 | std r0, LRSAVE(r1); \ |
554 | \ |
555 | std r7, -8(r1); \ |
556 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
557 | \ |
558 | li r11, API_NUMBER; \ |
559 | lv1call; \ |
560 | \ |
561 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
562 | ld r11, -8(r1); \ |
563 | std r4, 0(r11); \ |
564 | \ |
565 | ld r0, LRSAVE(r1); \ |
566 | mtlr r0; \ |
567 | blr |
568 | |
569 | #define LV1_4_IN_2_OUT(API_NAME, API_NUMBER) \ |
570 | _GLOBAL(_##API_NAME) \ |
571 | \ |
572 | mflr r0; \ |
573 | std r0, LRSAVE(r1); \ |
574 | \ |
575 | std r7, -8(r1); \ |
576 | std r8, -16(r1); \ |
577 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
578 | \ |
579 | li r11, API_NUMBER; \ |
580 | lv1call; \ |
581 | \ |
582 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
583 | ld r11, -8(r1); \ |
584 | std r4, 0(r11); \ |
585 | ld r11, -16(r1); \ |
586 | std r5, 0(r11); \ |
587 | \ |
588 | ld r0, LRSAVE(r1); \ |
589 | mtlr r0; \ |
590 | blr |
591 | |
592 | #define LV1_4_IN_3_OUT(API_NAME, API_NUMBER) \ |
593 | _GLOBAL(_##API_NAME) \ |
594 | \ |
595 | mflr r0; \ |
596 | std r0, LRSAVE(r1); \ |
597 | \ |
598 | std r7, -8(r1); \ |
599 | std r8, -16(r1); \ |
600 | std r9, -24(r1); \ |
601 | stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \ |
602 | \ |
603 | li r11, API_NUMBER; \ |
604 | lv1call; \ |
605 | \ |
606 | addi r1, r1, STACK_FRAME_MIN_SIZE+24; \ |
607 | ld r11, -8(r1); \ |
608 | std r4, 0(r11); \ |
609 | ld r11, -16(r1); \ |
610 | std r5, 0(r11); \ |
611 | ld r11, -24(r1); \ |
612 | std r6, 0(r11); \ |
613 | \ |
614 | ld r0, LRSAVE(r1); \ |
615 | mtlr r0; \ |
616 | blr |
617 | |
618 | #define LV1_5_IN_1_OUT(API_NAME, API_NUMBER) \ |
619 | _GLOBAL(_##API_NAME) \ |
620 | \ |
621 | mflr r0; \ |
622 | std r0, LRSAVE(r1); \ |
623 | \ |
624 | std r8, -8(r1); \ |
625 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
626 | \ |
627 | li r11, API_NUMBER; \ |
628 | lv1call; \ |
629 | \ |
630 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
631 | ld r11, -8(r1); \ |
632 | std r4, 0(r11); \ |
633 | \ |
634 | ld r0, LRSAVE(r1); \ |
635 | mtlr r0; \ |
636 | blr |
637 | |
638 | #define LV1_5_IN_2_OUT(API_NAME, API_NUMBER) \ |
639 | _GLOBAL(_##API_NAME) \ |
640 | \ |
641 | mflr r0; \ |
642 | std r0, LRSAVE(r1); \ |
643 | \ |
644 | std r8, -8(r1); \ |
645 | std r9, -16(r1); \ |
646 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
647 | \ |
648 | li r11, API_NUMBER; \ |
649 | lv1call; \ |
650 | \ |
651 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
652 | ld r11, -8(r1); \ |
653 | std r4, 0(r11); \ |
654 | ld r11, -16(r1); \ |
655 | std r5, 0(r11); \ |
656 | \ |
657 | ld r0, LRSAVE(r1); \ |
658 | mtlr r0; \ |
659 | blr |
660 | |
661 | #define LV1_5_IN_3_OUT(API_NAME, API_NUMBER) \ |
662 | _GLOBAL(_##API_NAME) \ |
663 | \ |
664 | mflr r0; \ |
665 | std r0, LRSAVE(r1); \ |
666 | \ |
667 | std r8, -8(r1); \ |
668 | std r9, -16(r1); \ |
669 | std r10, -24(r1); \ |
670 | stdu r1, -STACK_FRAME_MIN_SIZE-24(r1); \ |
671 | \ |
672 | li r11, API_NUMBER; \ |
673 | lv1call; \ |
674 | \ |
675 | addi r1, r1, STACK_FRAME_MIN_SIZE+24; \ |
676 | ld r11, -8(r1); \ |
677 | std r4, 0(r11); \ |
678 | ld r11, -16(r1); \ |
679 | std r5, 0(r11); \ |
680 | ld r11, -24(r1); \ |
681 | std r6, 0(r11); \ |
682 | \ |
683 | ld r0, LRSAVE(r1); \ |
684 | mtlr r0; \ |
685 | blr |
686 | |
687 | #define LV1_6_IN_1_OUT(API_NAME, API_NUMBER) \ |
688 | _GLOBAL(_##API_NAME) \ |
689 | \ |
690 | mflr r0; \ |
691 | std r0, LRSAVE(r1); \ |
692 | \ |
693 | std r9, -8(r1); \ |
694 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
695 | \ |
696 | li r11, API_NUMBER; \ |
697 | lv1call; \ |
698 | \ |
699 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
700 | ld r11, -8(r1); \ |
701 | std r4, 0(r11); \ |
702 | \ |
703 | ld r0, LRSAVE(r1); \ |
704 | mtlr r0; \ |
705 | blr |
706 | |
707 | #define LV1_6_IN_2_OUT(API_NAME, API_NUMBER) \ |
708 | _GLOBAL(_##API_NAME) \ |
709 | \ |
710 | mflr r0; \ |
711 | std r0, LRSAVE(r1); \ |
712 | \ |
713 | std r9, -8(r1); \ |
714 | std r10, -16(r1); \ |
715 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
716 | \ |
717 | li r11, API_NUMBER; \ |
718 | lv1call; \ |
719 | \ |
720 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
721 | ld r11, -8(r1); \ |
722 | std r4, 0(r11); \ |
723 | ld r11, -16(r1); \ |
724 | std r5, 0(r11); \ |
725 | \ |
726 | ld r0, LRSAVE(r1); \ |
727 | mtlr r0; \ |
728 | blr |
729 | |
730 | #define LV1_6_IN_3_OUT(API_NAME, API_NUMBER) \ |
731 | _GLOBAL(_##API_NAME) \ |
732 | \ |
733 | mflr r0; \ |
734 | std r0, LRSAVE(r1); \ |
735 | \ |
736 | std r9, -8(r1); \ |
737 | std r10, -16(r1); \ |
738 | stdu r1, -STACK_FRAME_MIN_SIZE-16(r1); \ |
739 | \ |
740 | li r11, API_NUMBER; \ |
741 | lv1call; \ |
742 | \ |
743 | addi r1, r1, STACK_FRAME_MIN_SIZE+16; \ |
744 | ld r11, -8(r1); \ |
745 | std r4, 0(r11); \ |
746 | ld r11, -16(r1); \ |
747 | std r5, 0(r11); \ |
748 | ld r11, STK_PARAM_AREA+8*8(r1); \ |
749 | std r6, 0(r11); \ |
750 | \ |
751 | ld r0, LRSAVE(r1); \ |
752 | mtlr r0; \ |
753 | blr |
754 | |
755 | #define LV1_7_IN_1_OUT(API_NAME, API_NUMBER) \ |
756 | _GLOBAL(_##API_NAME) \ |
757 | \ |
758 | mflr r0; \ |
759 | std r0, LRSAVE(r1); \ |
760 | \ |
761 | std r10, -8(r1); \ |
762 | stdu r1, -STACK_FRAME_MIN_SIZE-8(r1); \ |
763 | \ |
764 | li r11, API_NUMBER; \ |
765 | lv1call; \ |
766 | \ |
767 | addi r1, r1, STACK_FRAME_MIN_SIZE+8; \ |
768 | ld r11, -8(r1); \ |
769 | std r4, 0(r11); \ |
770 | \ |
771 | ld r0, LRSAVE(r1); \ |
772 | mtlr r0; \ |
773 | blr |
774 | |
775 | #define LV1_7_IN_6_OUT(API_NAME, API_NUMBER) \ |
776 | _GLOBAL(_##API_NAME) \ |
777 | \ |
778 | mflr r0; \ |
779 | std r0, LRSAVE(r1); \ |
780 | \ |
781 | std r10, STK_PARAM_AREA+8*7(r1); \ |
782 | stdu r1, -STACK_FRAME_MIN_SIZE(r1); \ |
783 | \ |
784 | li r11, API_NUMBER; \ |
785 | lv1call; \ |
786 | \ |
787 | addi r1, r1, STACK_FRAME_MIN_SIZE; \ |
788 | ld r11, STK_PARAM_AREA+8*7(r1); \ |
789 | std r4, 0(r11); \ |
790 | ld r11, STK_PARAM_AREA+8*8(r1); \ |
791 | std r5, 0(r11); \ |
792 | ld r11, STK_PARAM_AREA+8*9(r1); \ |
793 | std r6, 0(r11); \ |
794 | ld r11, STK_PARAM_AREA+8*10(r1); \ |
795 | std r7, 0(r11); \ |
796 | ld r11, STK_PARAM_AREA+8*11(r1); \ |
797 | std r8, 0(r11); \ |
798 | ld r11, STK_PARAM_AREA+8*12(r1); \ |
799 | std r9, 0(r11); \ |
800 | \ |
801 | ld r0, LRSAVE(r1); \ |
802 | mtlr r0; \ |
803 | blr |
804 | |
805 | #define LV1_8_IN_1_OUT(API_NAME, API_NUMBER) \ |
806 | _GLOBAL(_##API_NAME) \ |
807 | \ |
808 | mflr r0; \ |
809 | std r0, LRSAVE(r1); \ |
810 | stdu r1, -STACK_FRAME_MIN_SIZE(r1); \ |
811 | \ |
812 | li r11, API_NUMBER; \ |
813 | lv1call; \ |
814 | \ |
815 | addi r1, r1, STACK_FRAME_MIN_SIZE; \ |
816 | ld r11, STK_PARAM_AREA+8*8(r1); \ |
817 | std r4, 0(r11); \ |
818 | \ |
819 | ld r0, LRSAVE(r1); \ |
820 | mtlr r0; \ |
821 | blr |
822 | |
823 | .text |
824 | |
825 | /* the lv1 underscored call definitions expand here */ |
826 | |
827 | #define LV1_CALL(name, in, out, num) LV1_##in##_IN_##out##_OUT(lv1_##name, num) |
828 | #include <asm/lv1call.h> |
829 | |