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