xref: /linux/arch/powerpc/platforms/ps3/hvcall.S (revision 6d9b262afe0ec1d6e0ef99321ca9d6b921310471)
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