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