First Support on Ginger and OMAP TI
[linux-ginger.git] / arch / powerpc / platforms / cell / beat_hvCall.S
blob74c8174489483bfbc582482ff5312aef4aee8eba
1 /*
2  * Beat hypervisor call I/F
3  *
4  * (C) Copyright 2007 TOSHIBA CORPORATION
5  *
6  * This code is based on arch/powerpc/platforms/pseries/hvCall.S.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License along
19  * with this program; if not, write to the Free Software Foundation, Inc.,
20  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
21  */
23 #include <asm/ppc_asm.h>
25 #define STK_PARM(i)     (48 + ((i)-3)*8)
27 /* Not implemented on Beat, now */
28 #define HCALL_INST_PRECALL
29 #define HCALL_INST_POSTCALL
31         .text
33 #define HVSC    .long   0x44000022
35 /* Note: takes only 7 input parameters at maximum */
36 _GLOBAL(beat_hcall_norets)
37         HMT_MEDIUM
39         mfcr    r0
40         stw     r0,8(r1)
42         HCALL_INST_PRECALL
44         mr      r11,r3
45         mr      r3,r4
46         mr      r4,r5
47         mr      r5,r6
48         mr      r6,r7
49         mr      r7,r8
50         mr      r8,r9
52         HVSC                            /* invoke the hypervisor */
54         HCALL_INST_POSTCALL
56         lwz     r0,8(r1)
57         mtcrf   0xff,r0
59         blr                             /* return r3 = status */
61 /* Note: takes 8 input parameters at maximum */
62 _GLOBAL(beat_hcall_norets8)
63         HMT_MEDIUM
65         mfcr    r0
66         stw     r0,8(r1)
68         HCALL_INST_PRECALL
70         mr      r11,r3
71         mr      r3,r4
72         mr      r4,r5
73         mr      r5,r6
74         mr      r6,r7
75         mr      r7,r8
76         mr      r8,r9
77         ld      r10,STK_PARM(r10)(r1)
79         HVSC                            /* invoke the hypervisor */
81         HCALL_INST_POSTCALL
83         lwz     r0,8(r1)
84         mtcrf   0xff,r0
86         blr                             /* return r3 = status */
88 /* Note: takes only 6 input parameters, 1 output parameters at maximum */
89 _GLOBAL(beat_hcall1)
90         HMT_MEDIUM
92         mfcr    r0
93         stw     r0,8(r1)
95         HCALL_INST_PRECALL
97         std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
99         mr      r11,r3
100         mr      r3,r5
101         mr      r4,r6
102         mr      r5,r7
103         mr      r6,r8
104         mr      r7,r9
105         mr      r8,r10
107         HVSC                            /* invoke the hypervisor */
109         HCALL_INST_POSTCALL
111         ld      r12,STK_PARM(r4)(r1)
112         std     r4,  0(r12)
114         lwz     r0,8(r1)
115         mtcrf   0xff,r0
117         blr                             /* return r3 = status */
119 /* Note: takes only 6 input parameters, 2 output parameters at maximum */
120 _GLOBAL(beat_hcall2)
121         HMT_MEDIUM
123         mfcr    r0
124         stw     r0,8(r1)
126         HCALL_INST_PRECALL
128         std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
130         mr      r11,r3
131         mr      r3,r5
132         mr      r4,r6
133         mr      r5,r7
134         mr      r6,r8
135         mr      r7,r9
136         mr      r8,r10
138         HVSC                            /* invoke the hypervisor */
140         HCALL_INST_POSTCALL
142         ld      r12,STK_PARM(r4)(r1)
143         std     r4,  0(r12)
144         std     r5,  8(r12)
146         lwz     r0,8(r1)
147         mtcrf   0xff,r0
149         blr                             /* return r3 = status */
151 /* Note: takes only 6 input parameters, 3 output parameters at maximum */
152 _GLOBAL(beat_hcall3)
153         HMT_MEDIUM
155         mfcr    r0
156         stw     r0,8(r1)
158         HCALL_INST_PRECALL
160         std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
162         mr      r11,r3
163         mr      r3,r5
164         mr      r4,r6
165         mr      r5,r7
166         mr      r6,r8
167         mr      r7,r9
168         mr      r8,r10
170         HVSC                            /* invoke the hypervisor */
172         HCALL_INST_POSTCALL
174         ld      r12,STK_PARM(r4)(r1)
175         std     r4,  0(r12)
176         std     r5,  8(r12)
177         std     r6, 16(r12)
179         lwz     r0,8(r1)
180         mtcrf   0xff,r0
182         blr                             /* return r3 = status */
184 /* Note: takes only 6 input parameters, 4 output parameters at maximum */
185 _GLOBAL(beat_hcall4)
186         HMT_MEDIUM
188         mfcr    r0
189         stw     r0,8(r1)
191         HCALL_INST_PRECALL
193         std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
195         mr      r11,r3
196         mr      r3,r5
197         mr      r4,r6
198         mr      r5,r7
199         mr      r6,r8
200         mr      r7,r9
201         mr      r8,r10
203         HVSC                            /* invoke the hypervisor */
205         HCALL_INST_POSTCALL
207         ld      r12,STK_PARM(r4)(r1)
208         std     r4,  0(r12)
209         std     r5,  8(r12)
210         std     r6, 16(r12)
211         std     r7, 24(r12)
213         lwz     r0,8(r1)
214         mtcrf   0xff,r0
216         blr                             /* return r3 = status */
218 /* Note: takes only 6 input parameters, 5 output parameters at maximum */
219 _GLOBAL(beat_hcall5)
220         HMT_MEDIUM
222         mfcr    r0
223         stw     r0,8(r1)
225         HCALL_INST_PRECALL
227         std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
229         mr      r11,r3
230         mr      r3,r5
231         mr      r4,r6
232         mr      r5,r7
233         mr      r6,r8
234         mr      r7,r9
235         mr      r8,r10
237         HVSC                            /* invoke the hypervisor */
239         HCALL_INST_POSTCALL
241         ld      r12,STK_PARM(r4)(r1)
242         std     r4,  0(r12)
243         std     r5,  8(r12)
244         std     r6, 16(r12)
245         std     r7, 24(r12)
246         std     r8, 32(r12)
248         lwz     r0,8(r1)
249         mtcrf   0xff,r0
251         blr                             /* return r3 = status */
253 /* Note: takes only 6 input parameters, 6 output parameters at maximum */
254 _GLOBAL(beat_hcall6)
255         HMT_MEDIUM
257         mfcr    r0
258         stw     r0,8(r1)
260         HCALL_INST_PRECALL
262         std     r4,STK_PARM(r4)(r1)     /* save ret buffer */
264         mr      r11,r3
265         mr      r3,r5
266         mr      r4,r6
267         mr      r5,r7
268         mr      r6,r8
269         mr      r7,r9
270         mr      r8,r10
272         HVSC                            /* invoke the hypervisor */
274         HCALL_INST_POSTCALL
276         ld      r12,STK_PARM(r4)(r1)
277         std     r4,  0(r12)
278         std     r5,  8(r12)
279         std     r6, 16(r12)
280         std     r7, 24(r12)
281         std     r8, 32(r12)
282         std     r9, 40(r12)
284         lwz     r0,8(r1)
285         mtcrf   0xff,r0
287         blr                             /* return r3 = status */