hvcall.S 14 KB

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