Linux Audio

Check our new training course

Loading...
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright 2014, Michael Ellerman, IBM Corp.
  4 */
  5
  6#include <ppc-asm.h>
  7#include "reg.h"
  8
  9
 10/* ppc-asm.h defines most of the reg aliases, but not r1/r2. */
 11#define r1 1
 12#define r2 2
 13
 14#define RFEBB   .long 0x4c000924
 15
 16/* Stack layout:
 17 *
 18 *                   ^
 19 *  User stack       |
 20 *  Back chain ------+	<- r1		<-------+
 21 *  ...						|
 22 *  Red zone / ABI Gap				|
 23 *  ...						|
 24 *  vr63	<+				|
 25 *  vr0		 |				|
 26 *  VSCR	 |				|
 27 *  FSCR	 |				|
 28 *  r31		 | Save area			|
 29 *  r0		 |				|
 30 *  XER		 |				|
 31 *  CTR		 |				|
 32 *  LR		 |				|
 33 *  CCR		<+				|
 34 *  ...		<+				|
 35 *  LR		 | Caller frame			|
 36 *  CCR		 |				|
 37 *  Back chain	<+	<- updated r1	--------+
 38 *
 39 */
 40
 41#if defined(_CALL_ELF) && _CALL_ELF == 2
 42#define ABIGAP		512
 43#else
 44#define ABIGAP		288
 45#endif
 46
 47#define NR_GPR		32
 48#define NR_SPR		6
 49#define NR_VSR		64
 50
 51#define SAVE_AREA	((NR_GPR + NR_SPR) * 8 + (NR_VSR * 16))
 52#define CALLER_FRAME	112
 53
 54#define STACK_FRAME	(ABIGAP + SAVE_AREA + CALLER_FRAME)
 55
 56#define CCR_SAVE	(CALLER_FRAME)
 57#define LR_SAVE		(CCR_SAVE + 8)
 58#define CTR_SAVE	(LR_SAVE  + 8)
 59#define XER_SAVE	(CTR_SAVE + 8)
 60#define GPR_SAVE(n)	(XER_SAVE + 8 + (8 * n))
 61#define FSCR_SAVE	(GPR_SAVE(31) + 8)
 62#define VSCR_SAVE	(FSCR_SAVE + 8)
 63#define VSR_SAVE(n)	(VSCR_SAVE + 8 + (16 * n))
 64
 65#define SAVE_GPR(n)	std n,GPR_SAVE(n)(r1)
 66#define REST_GPR(n)	ld  n,GPR_SAVE(n)(r1)
 67#define TRASH_GPR(n)	lis n,0xaaaa
 68
 69#define SAVE_VSR(n, b)	li b, VSR_SAVE(n); stxvd2x n,b,r1
 70#define LOAD_VSR(n, b)	li b, VSR_SAVE(n); lxvd2x  n,b,r1
 71
 72#define LOAD_REG_IMMEDIATE(reg,expr)	\
 73	lis     reg,(expr)@highest;	\
 74	ori     reg,reg,(expr)@higher;	\
 75	rldicr  reg,reg,32,31;		\
 76	oris    reg,reg,(expr)@h;	\
 77	ori     reg,reg,(expr)@l;
 78
 79
 80#if defined(_CALL_ELF) && _CALL_ELF == 2
 81#define ENTRY_POINT(name) \
 82	.type FUNC_NAME(name),@function; \
 83	.globl FUNC_NAME(name); \
 84	FUNC_NAME(name):
 85
 86#define RESTORE_TOC(name)	\
 87	/* Restore our TOC pointer using our entry point */	\
 88	LOAD_REG_IMMEDIATE(r12, name)				\
 890:	addis	r2,r12,(.TOC.-0b)@ha;				\
 90	addi	r2,r2,(.TOC.-0b)@l;
 91
 92#else
 93#define ENTRY_POINT(name) FUNC_START(name)
 94#define RESTORE_TOC(name)	\
 95	/* Restore our TOC pointer via our opd entry */	\
 96	LOAD_REG_IMMEDIATE(r2, name)			\
 97	ld      r2,8(r2);
 98#endif
 99
100    .text
101
102ENTRY_POINT(ebb_handler)
103    stdu    r1,-STACK_FRAME(r1)
104    SAVE_GPR(0)
105    mflr    r0
106    std     r0,LR_SAVE(r1)
107    mfcr    r0
108    std     r0,CCR_SAVE(r1)
109    mfctr   r0
110    std     r0,CTR_SAVE(r1)
111    mfxer   r0
112    std     r0,XER_SAVE(r1)
113    SAVE_GPR(2)
114    SAVE_GPR(3)
115    SAVE_GPR(4)
116    SAVE_GPR(5)
117    SAVE_GPR(6)
118    SAVE_GPR(7)
119    SAVE_GPR(8)
120    SAVE_GPR(9)
121    SAVE_GPR(10)
122    SAVE_GPR(11)
123    SAVE_GPR(12)
124    SAVE_GPR(13)
125    SAVE_GPR(14)
126    SAVE_GPR(15)
127    SAVE_GPR(16)
128    SAVE_GPR(17)
129    SAVE_GPR(18)
130    SAVE_GPR(19)
131    SAVE_GPR(20)
132    SAVE_GPR(21)
133    SAVE_GPR(22)
134    SAVE_GPR(23)
135    SAVE_GPR(24)
136    SAVE_GPR(25)
137    SAVE_GPR(26)
138    SAVE_GPR(27)
139    SAVE_GPR(28)
140    SAVE_GPR(29)
141    SAVE_GPR(30)
142    SAVE_GPR(31)
143    SAVE_VSR(0, r3)
144    mffs     f0
145    stfd     f0, FSCR_SAVE(r1)
146    mfvscr   f0
147    stfd     f0, VSCR_SAVE(r1)
148    SAVE_VSR(1,  r3)
149    SAVE_VSR(2,  r3)
150    SAVE_VSR(3,  r3)
151    SAVE_VSR(4,  r3)
152    SAVE_VSR(5,  r3)
153    SAVE_VSR(6,  r3)
154    SAVE_VSR(7,  r3)
155    SAVE_VSR(8,  r3)
156    SAVE_VSR(9,  r3)
157    SAVE_VSR(10, r3)
158    SAVE_VSR(11, r3)
159    SAVE_VSR(12, r3)
160    SAVE_VSR(13, r3)
161    SAVE_VSR(14, r3)
162    SAVE_VSR(15, r3)
163    SAVE_VSR(16, r3)
164    SAVE_VSR(17, r3)
165    SAVE_VSR(18, r3)
166    SAVE_VSR(19, r3)
167    SAVE_VSR(20, r3)
168    SAVE_VSR(21, r3)
169    SAVE_VSR(22, r3)
170    SAVE_VSR(23, r3)
171    SAVE_VSR(24, r3)
172    SAVE_VSR(25, r3)
173    SAVE_VSR(26, r3)
174    SAVE_VSR(27, r3)
175    SAVE_VSR(28, r3)
176    SAVE_VSR(29, r3)
177    SAVE_VSR(30, r3)
178    SAVE_VSR(31, r3)
179    SAVE_VSR(32, r3)
180    SAVE_VSR(33, r3)
181    SAVE_VSR(34, r3)
182    SAVE_VSR(35, r3)
183    SAVE_VSR(36, r3)
184    SAVE_VSR(37, r3)
185    SAVE_VSR(38, r3)
186    SAVE_VSR(39, r3)
187    SAVE_VSR(40, r3)
188    SAVE_VSR(41, r3)
189    SAVE_VSR(42, r3)
190    SAVE_VSR(43, r3)
191    SAVE_VSR(44, r3)
192    SAVE_VSR(45, r3)
193    SAVE_VSR(46, r3)
194    SAVE_VSR(47, r3)
195    SAVE_VSR(48, r3)
196    SAVE_VSR(49, r3)
197    SAVE_VSR(50, r3)
198    SAVE_VSR(51, r3)
199    SAVE_VSR(52, r3)
200    SAVE_VSR(53, r3)
201    SAVE_VSR(54, r3)
202    SAVE_VSR(55, r3)
203    SAVE_VSR(56, r3)
204    SAVE_VSR(57, r3)
205    SAVE_VSR(58, r3)
206    SAVE_VSR(59, r3)
207    SAVE_VSR(60, r3)
208    SAVE_VSR(61, r3)
209    SAVE_VSR(62, r3)
210    SAVE_VSR(63, r3)
211
212    TRASH_GPR(2)
213    TRASH_GPR(3)
214    TRASH_GPR(4)
215    TRASH_GPR(5)
216    TRASH_GPR(6)
217    TRASH_GPR(7)
218    TRASH_GPR(8)
219    TRASH_GPR(9)
220    TRASH_GPR(10)
221    TRASH_GPR(11)
222    TRASH_GPR(12)
223    TRASH_GPR(14)
224    TRASH_GPR(15)
225    TRASH_GPR(16)
226    TRASH_GPR(17)
227    TRASH_GPR(18)
228    TRASH_GPR(19)
229    TRASH_GPR(20)
230    TRASH_GPR(21)
231    TRASH_GPR(22)
232    TRASH_GPR(23)
233    TRASH_GPR(24)
234    TRASH_GPR(25)
235    TRASH_GPR(26)
236    TRASH_GPR(27)
237    TRASH_GPR(28)
238    TRASH_GPR(29)
239    TRASH_GPR(30)
240    TRASH_GPR(31)
241
242    RESTORE_TOC(ebb_handler)
243
244    /*
245     * r13 is our TLS pointer. We leave whatever value was in there when the
246     * EBB fired. That seems to be OK because once set the TLS pointer is not
247     * changed - but presumably that could change in future.
248     */
249
250    bl      ebb_hook
251    nop
252
253    /* r2 may be changed here but we don't care */
254
255    lfd      f0, FSCR_SAVE(r1)
256    mtfsf    0xff,f0
257    lfd      f0, VSCR_SAVE(r1)
258    mtvscr   f0
259    LOAD_VSR(0, r3)
260    LOAD_VSR(1,  r3)
261    LOAD_VSR(2,  r3)
262    LOAD_VSR(3,  r3)
263    LOAD_VSR(4,  r3)
264    LOAD_VSR(5,  r3)
265    LOAD_VSR(6,  r3)
266    LOAD_VSR(7,  r3)
267    LOAD_VSR(8,  r3)
268    LOAD_VSR(9,  r3)
269    LOAD_VSR(10, r3)
270    LOAD_VSR(11, r3)
271    LOAD_VSR(12, r3)
272    LOAD_VSR(13, r3)
273    LOAD_VSR(14, r3)
274    LOAD_VSR(15, r3)
275    LOAD_VSR(16, r3)
276    LOAD_VSR(17, r3)
277    LOAD_VSR(18, r3)
278    LOAD_VSR(19, r3)
279    LOAD_VSR(20, r3)
280    LOAD_VSR(21, r3)
281    LOAD_VSR(22, r3)
282    LOAD_VSR(23, r3)
283    LOAD_VSR(24, r3)
284    LOAD_VSR(25, r3)
285    LOAD_VSR(26, r3)
286    LOAD_VSR(27, r3)
287    LOAD_VSR(28, r3)
288    LOAD_VSR(29, r3)
289    LOAD_VSR(30, r3)
290    LOAD_VSR(31, r3)
291    LOAD_VSR(32, r3)
292    LOAD_VSR(33, r3)
293    LOAD_VSR(34, r3)
294    LOAD_VSR(35, r3)
295    LOAD_VSR(36, r3)
296    LOAD_VSR(37, r3)
297    LOAD_VSR(38, r3)
298    LOAD_VSR(39, r3)
299    LOAD_VSR(40, r3)
300    LOAD_VSR(41, r3)
301    LOAD_VSR(42, r3)
302    LOAD_VSR(43, r3)
303    LOAD_VSR(44, r3)
304    LOAD_VSR(45, r3)
305    LOAD_VSR(46, r3)
306    LOAD_VSR(47, r3)
307    LOAD_VSR(48, r3)
308    LOAD_VSR(49, r3)
309    LOAD_VSR(50, r3)
310    LOAD_VSR(51, r3)
311    LOAD_VSR(52, r3)
312    LOAD_VSR(53, r3)
313    LOAD_VSR(54, r3)
314    LOAD_VSR(55, r3)
315    LOAD_VSR(56, r3)
316    LOAD_VSR(57, r3)
317    LOAD_VSR(58, r3)
318    LOAD_VSR(59, r3)
319    LOAD_VSR(60, r3)
320    LOAD_VSR(61, r3)
321    LOAD_VSR(62, r3)
322    LOAD_VSR(63, r3)
323
324    ld      r0,XER_SAVE(r1)
325    mtxer   r0
326    ld      r0,CTR_SAVE(r1)
327    mtctr   r0
328    ld      r0,LR_SAVE(r1)
329    mtlr    r0
330    ld      r0,CCR_SAVE(r1)
331    mtcr    r0
332    REST_GPR(0)
333    REST_GPR(2)
334    REST_GPR(3)
335    REST_GPR(4)
336    REST_GPR(5)
337    REST_GPR(6)
338    REST_GPR(7)
339    REST_GPR(8)
340    REST_GPR(9)
341    REST_GPR(10)
342    REST_GPR(11)
343    REST_GPR(12)
344    REST_GPR(13)
345    REST_GPR(14)
346    REST_GPR(15)
347    REST_GPR(16)
348    REST_GPR(17)
349    REST_GPR(18)
350    REST_GPR(19)
351    REST_GPR(20)
352    REST_GPR(21)
353    REST_GPR(22)
354    REST_GPR(23)
355    REST_GPR(24)
356    REST_GPR(25)
357    REST_GPR(26)
358    REST_GPR(27)
359    REST_GPR(28)
360    REST_GPR(29)
361    REST_GPR(30)
362    REST_GPR(31)
363    addi    r1,r1,STACK_FRAME
364    RFEBB
365FUNC_END(ebb_handler)