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

source code of linux/arch/powerpc/platforms/ps3/hvcall.S