cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hvcall.S (14560B)


      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>