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