ps3-hvcall.S 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * PS3 bootwrapper hvcalls.
  4. *
  5. * Copyright (C) 2007 Sony Computer Entertainment Inc.
  6. * Copyright 2007 Sony Corp.
  7. */
  8. #include "ppc_asm.h"
  9. .machine "ppc64"
  10. /*
  11. * The PS3 hypervisor uses a 64 bit "C" language calling convention.
  12. * The routines here marshal arguments between the 32 bit wrapper
  13. * program and the 64 bit hvcalls.
  14. *
  15. * wrapper lv1
  16. * 32-bit (h,l) 64-bit
  17. *
  18. * 1: r3,r4 <-> r3
  19. * 2: r5,r6 <-> r4
  20. * 3: r7,r8 <-> r5
  21. * 4: r9,r10 <-> r6
  22. * 5: 8(r1),12(r1) <-> r7
  23. * 6: 16(r1),20(r1) <-> r8
  24. * 7: 24(r1),28(r1) <-> r9
  25. * 8: 32(r1),36(r1) <-> r10
  26. *
  27. */
  28. .macro GLOBAL name
  29. .section ".text"
  30. .balign 4
  31. .globl \name
  32. \name:
  33. .endm
  34. .macro NO_SUPPORT name
  35. GLOBAL \name
  36. b ps3_no_support
  37. .endm
  38. .macro HVCALL num
  39. li r11, \num
  40. .long 0x44000022
  41. extsw r3, r3
  42. .endm
  43. .macro SAVE_LR offset=4
  44. mflr r0
  45. stw r0, \offset(r1)
  46. .endm
  47. .macro LOAD_LR offset=4
  48. lwz r0, \offset(r1)
  49. mtlr r0
  50. .endm
  51. .macro LOAD_64_REG target,high,low
  52. sldi r11, \high, 32
  53. or \target, r11, \low
  54. .endm
  55. .macro LOAD_64_STACK target,offset
  56. ld \target, \offset(r1)
  57. .endm
  58. .macro LOAD_R3
  59. LOAD_64_REG r3,r3,r4
  60. .endm
  61. .macro LOAD_R4
  62. LOAD_64_REG r4,r5,r6
  63. .endm
  64. .macro LOAD_R5
  65. LOAD_64_REG r5,r7,r8
  66. .endm
  67. .macro LOAD_R6
  68. LOAD_64_REG r6,r9,r10
  69. .endm
  70. .macro LOAD_R7
  71. LOAD_64_STACK r7,8
  72. .endm
  73. .macro LOAD_R8
  74. LOAD_64_STACK r8,16
  75. .endm
  76. .macro LOAD_R9
  77. LOAD_64_STACK r9,24
  78. .endm
  79. .macro LOAD_R10
  80. LOAD_64_STACK r10,32
  81. .endm
  82. .macro LOAD_REGS_0
  83. stwu 1,-16(1)
  84. stw 3, 8(1)
  85. .endm
  86. .macro LOAD_REGS_5
  87. LOAD_R3
  88. LOAD_R4
  89. LOAD_R5
  90. LOAD_R6
  91. LOAD_R7
  92. .endm
  93. .macro LOAD_REGS_6
  94. LOAD_REGS_5
  95. LOAD_R8
  96. .endm
  97. .macro LOAD_REGS_8
  98. LOAD_REGS_6
  99. LOAD_R9
  100. LOAD_R10
  101. .endm
  102. .macro STORE_REGS_0_1
  103. lwz r11, 8(r1)
  104. std r4, 0(r11)
  105. mr r4, r3
  106. li r3, 0
  107. addi r1,r1,16
  108. .endm
  109. .macro STORE_REGS_5_2
  110. lwz r11, 16(r1)
  111. std r4, 0(r11)
  112. lwz r11, 20(r1)
  113. std r5, 0(r11)
  114. .endm
  115. .macro STORE_REGS_6_1
  116. lwz r11, 24(r1)
  117. std r4, 0(r11)
  118. .endm
  119. GLOBAL lv1_get_logical_ppe_id
  120. SAVE_LR
  121. LOAD_REGS_0
  122. HVCALL 69
  123. STORE_REGS_0_1
  124. LOAD_LR
  125. blr
  126. GLOBAL lv1_get_logical_partition_id
  127. SAVE_LR
  128. LOAD_REGS_0
  129. HVCALL 74
  130. STORE_REGS_0_1
  131. LOAD_LR
  132. blr
  133. GLOBAL lv1_get_repository_node_value
  134. SAVE_LR
  135. LOAD_REGS_5
  136. HVCALL 91
  137. STORE_REGS_5_2
  138. LOAD_LR
  139. blr
  140. GLOBAL lv1_panic
  141. SAVE_LR
  142. LOAD_REGS_8
  143. HVCALL 255
  144. LOAD_LR
  145. blr