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