source: rtems/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S @ fdd9de80

4.115
Last change on this file since fdd9de80 was fdd9de80, checked in by Sebastian Huber <sebastian.huber@…>, on 07/21/11 at 15:03:31

2011-07-21 Sebastian Huber <sebastian.huber@…>

PR 1799/bsps

  • new-exceptions/bspsupport/ppc_exc_async_normal.S: New file.
  • new-exceptions/cpu.c, new-exceptions/cpu_asm.S, new-exceptions/bspsupport/ppc_exc_asm_macros.h, new-exceptions/bspsupport/ppc_exc_global_handler.c, new-exceptions/bspsupport/ppc_exc_prologue.c, new-exceptions/bspsupport/vectors.h: Added support for SPE.
  • configure.ac, preinstall.am, Makefile.am: Added support for qoriq BSPs.
  • Property mode set to 100644
File size: 13.2 KB
Line 
1
2/*  cpu_asm.s   1.1 - 95/12/04
3 *
4 *  This file contains the assembly code for the PowerPC implementation
5 *  of RTEMS.
6 *
7 *  Author:     Andrew Bray <andy@i-cubed.co.uk>
8 *
9 *  COPYRIGHT (c) 1995 by i-cubed ltd.
10 *
11 *  To anyone who acknowledges that this file is provided "AS IS"
12 *  without any express or implied warranty:
13 *      permission to use, copy, modify, and distribute this file
14 *      for any purpose is hereby granted without fee, provided that
15 *      the above copyright notice and this notice appears in all
16 *      copies, and that the name of i-cubed limited not be used in
17 *      advertising or publicity pertaining to distribution of the
18 *      software without specific, written prior permission.
19 *      i-cubed limited makes no representations about the suitability
20 *      of this software for any purpose.
21 *
22 *  Derived from c/src/exec/cpu/no_cpu/cpu_asm.c:
23 *
24 *  COPYRIGHT (c) 1989-1997.
25 *  On-Line Applications Research Corporation (OAR).
26 *
27 *  Copyright (c) 2011 embedded brains GmbH.
28 *
29 *  The license and distribution terms for this file may in
30 *  the file LICENSE in this distribution or at
31 *  http://www.rtems.com/license/LICENSE.
32 *
33 *  $Id$
34 */
35
36#include <rtems/asm.h>
37#include <rtems/powerpc/powerpc.h>
38#include <rtems/score/cpu.h>
39#include <bspopts.h>
40
41#if BSP_DATA_CACHE_ENABLED && PPC_CACHE_ALIGNMENT == 32
42  #define DATA_CACHE_ALIGNMENT(reg) \
43    li reg, PPC_CACHE_ALIGNMENT
44  #define DATA_CACHE_ZERO(rega, regb) \
45    dcbz rega, regb
46  #define DATA_CACHE_TOUCH(rega, regb) \
47    dcbt rega, regb
48  #define DATA_CACHE_ZERO_AND_TOUCH(reg, offset) \
49    li reg, offset; dcbz reg, r3; dcbt reg, r4
50#else
51  #define DATA_CACHE_ALIGNMENT(reg)
52  #define DATA_CACHE_ZERO(rega, regb)
53  #define DATA_CACHE_TOUCH(rega, regb)
54  #define DATA_CACHE_ZERO_AND_TOUCH(reg, offset) \
55    li reg, offset
56#endif
57
58/*
59 * Offsets for various Contexts
60 */
61        .set    GP_1, 0
62        .set    GP_2, (GP_1 + 4)
63        .set    GP_13, (GP_2 + 4)
64        .set    GP_14, (GP_13 + 4)
65
66        .set    GP_15, (GP_14 + 4)
67        .set    GP_16, (GP_15 + 4)
68        .set    GP_17, (GP_16 + 4)
69        .set    GP_18, (GP_17 + 4)
70
71        .set    GP_19, (GP_18 + 4)
72        .set    GP_20, (GP_19 + 4)
73        .set    GP_21, (GP_20 + 4)
74        .set    GP_22, (GP_21 + 4)
75
76        .set    GP_23, (GP_22 + 4)
77        .set    GP_24, (GP_23 + 4)
78        .set    GP_25, (GP_24 + 4)
79        .set    GP_26, (GP_25 + 4)
80
81        .set    GP_27, (GP_26 + 4)
82        .set    GP_28, (GP_27 + 4)
83        .set    GP_29, (GP_28 + 4)
84        .set    GP_30, (GP_29 + 4)
85
86        .set    GP_31, (GP_30 + 4)
87        .set    GP_CR, (GP_31 + 4)
88        .set    GP_PC, (GP_CR + 4)
89        .set    GP_MSR, (GP_PC + 4)
90
91#if (PPC_HAS_DOUBLE==1)
92        .set    FP_SIZE,        8
93#define LDF     lfd
94#define STF     stfd
95#else
96        .set    FP_SIZE,        4
97#define LDF     lfs
98#define STF     stfs
99#endif
100
101        .set    FP_0, 0
102        .set    FP_1, (FP_0 + FP_SIZE)
103        .set    FP_2, (FP_1 + FP_SIZE)
104        .set    FP_3, (FP_2 + FP_SIZE)
105        .set    FP_4, (FP_3 + FP_SIZE)
106        .set    FP_5, (FP_4 + FP_SIZE)
107        .set    FP_6, (FP_5 + FP_SIZE)
108        .set    FP_7, (FP_6 + FP_SIZE)
109        .set    FP_8, (FP_7 + FP_SIZE)
110        .set    FP_9, (FP_8 + FP_SIZE)
111        .set    FP_10, (FP_9 + FP_SIZE)
112        .set    FP_11, (FP_10 + FP_SIZE)
113        .set    FP_12, (FP_11 + FP_SIZE)
114        .set    FP_13, (FP_12 + FP_SIZE)
115        .set    FP_14, (FP_13 + FP_SIZE)
116        .set    FP_15, (FP_14 + FP_SIZE)
117        .set    FP_16, (FP_15 + FP_SIZE)
118        .set    FP_17, (FP_16 + FP_SIZE)
119        .set    FP_18, (FP_17 + FP_SIZE)
120        .set    FP_19, (FP_18 + FP_SIZE)
121        .set    FP_20, (FP_19 + FP_SIZE)
122        .set    FP_21, (FP_20 + FP_SIZE)
123        .set    FP_22, (FP_21 + FP_SIZE)
124        .set    FP_23, (FP_22 + FP_SIZE)
125        .set    FP_24, (FP_23 + FP_SIZE)
126        .set    FP_25, (FP_24 + FP_SIZE)
127        .set    FP_26, (FP_25 + FP_SIZE)
128        .set    FP_27, (FP_26 + FP_SIZE)
129        .set    FP_28, (FP_27 + FP_SIZE)
130        .set    FP_29, (FP_28 + FP_SIZE)
131        .set    FP_30, (FP_29 + FP_SIZE)
132        .set    FP_31, (FP_30 + FP_SIZE)
133        .set    FP_FPSCR, (FP_31 + FP_SIZE)
134
135        .set    IP_LINK, 0
136        .set    IP_0, (IP_LINK + 8)
137        .set    IP_2, (IP_0 + 4)
138
139        .set    IP_3, (IP_2 + 4)
140        .set    IP_4, (IP_3 + 4)
141        .set    IP_5, (IP_4 + 4)
142        .set    IP_6, (IP_5 + 4)
143
144        .set    IP_7, (IP_6 + 4)
145        .set    IP_8, (IP_7 + 4)
146        .set    IP_9, (IP_8 + 4)
147        .set    IP_10, (IP_9 + 4)
148
149        .set    IP_11, (IP_10 + 4)
150        .set    IP_12, (IP_11 + 4)
151        .set    IP_13, (IP_12 + 4)
152        .set    IP_28, (IP_13 + 4)
153
154        .set    IP_29, (IP_28 + 4)
155        .set    IP_30, (IP_29 + 4)
156        .set    IP_31, (IP_30 + 4)
157        .set    IP_CR, (IP_31 + 4)
158
159        .set    IP_CTR, (IP_CR + 4)
160        .set    IP_XER, (IP_CTR + 4)
161        .set    IP_LR, (IP_XER + 4)
162        .set    IP_PC, (IP_LR + 4)
163
164        .set    IP_MSR, (IP_PC + 4)
165        .set    IP_END, (IP_MSR + 16)
166
167        BEGIN_CODE
168/*
169 *  _CPU_Context_save_fp_context
170 *
171 *  This routine is responsible for saving the FP context
172 *  at *fp_context_ptr.  If the point to load the FP context
173 *  from is changed then the pointer is modified by this routine.
174 *
175 *  Sometimes a macro implementation of this is in cpu.h which dereferences
176 *  the ** and a similarly named routine in this file is passed something
177 *  like a (Context_Control_fp *).  The general rule on making this decision
178 *  is to avoid writing assembly language.
179 */
180
181        ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
182        PUBLIC_PROC (_CPU_Context_save_fp)
183PROC (_CPU_Context_save_fp):
184#if (PPC_HAS_FPU == 1)
185/* A FP context switch may occur in an ISR or exception handler when the FPU is not
186 * available. Therefore, we must explicitely enable it here!
187 */
188        mfmsr   r4
189        andi.   r5,r4,MSR_FP
190        bne     1f
191        ori     r5,r4,MSR_FP
192        mtmsr   r5
193        isync
1941:
195        lwz     r3, 0(r3)
196        STF     f0, FP_0(r3)
197        STF     f1, FP_1(r3)
198        STF     f2, FP_2(r3)
199        STF     f3, FP_3(r3)
200        STF     f4, FP_4(r3)
201        STF     f5, FP_5(r3)
202        STF     f6, FP_6(r3)
203        STF     f7, FP_7(r3)
204        STF     f8, FP_8(r3)
205        STF     f9, FP_9(r3)
206        STF     f10, FP_10(r3)
207        STF     f11, FP_11(r3)
208        STF     f12, FP_12(r3)
209        STF     f13, FP_13(r3)
210        STF     f14, FP_14(r3)
211        STF     f15, FP_15(r3)
212        STF     f16, FP_16(r3)
213        STF     f17, FP_17(r3)
214        STF     f18, FP_18(r3)
215        STF     f19, FP_19(r3)
216        STF     f20, FP_20(r3)
217        STF     f21, FP_21(r3)
218        STF     f22, FP_22(r3)
219        STF     f23, FP_23(r3)
220        STF     f24, FP_24(r3)
221        STF     f25, FP_25(r3)
222        STF     f26, FP_26(r3)
223        STF     f27, FP_27(r3)
224        STF     f28, FP_28(r3)
225        STF     f29, FP_29(r3)
226        STF     f30, FP_30(r3)
227        STF     f31, FP_31(r3)
228        mffs    f2
229        STF     f2, FP_FPSCR(r3)
230        bne     1f
231        mtmsr   r4
232        isync
2331:
234#endif
235        blr
236
237/*
238 *  _CPU_Context_restore_fp_context
239 *
240 *  This routine is responsible for restoring the FP context
241 *  at *fp_context_ptr.  If the point to load the FP context
242 *  from is changed then the pointer is modified by this routine.
243 *
244 *  Sometimes a macro implementation of this is in cpu.h which dereferences
245 *  the ** and a similarly named routine in this file is passed something
246 *  like a (Context_Control_fp *).  The general rule on making this decision
247 *  is to avoid writing assembly language.
248 */
249
250        ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
251        PUBLIC_PROC (_CPU_Context_restore_fp)
252PROC (_CPU_Context_restore_fp):
253#if (PPC_HAS_FPU == 1)
254        lwz     r3, 0(r3)
255/* A FP context switch may occur in an ISR or exception handler when the FPU is not
256 * available. Therefore, we must explicitely enable it here!
257 */
258        mfmsr   r4
259        andi.   r5,r4,MSR_FP
260        bne     1f
261        ori     r5,r4,MSR_FP
262        mtmsr   r5
263        isync
2641:
265        LDF     f2, FP_FPSCR(r3)
266        mtfsf   255, f2
267        LDF     f0, FP_0(r3)
268        LDF     f1, FP_1(r3)
269        LDF     f2, FP_2(r3)
270        LDF     f3, FP_3(r3)
271        LDF     f4, FP_4(r3)
272        LDF     f5, FP_5(r3)
273        LDF     f6, FP_6(r3)
274        LDF     f7, FP_7(r3)
275        LDF     f8, FP_8(r3)
276        LDF     f9, FP_9(r3)
277        LDF     f10, FP_10(r3)
278        LDF     f11, FP_11(r3)
279        LDF     f12, FP_12(r3)
280        LDF     f13, FP_13(r3)
281        LDF     f14, FP_14(r3)
282        LDF     f15, FP_15(r3)
283        LDF     f16, FP_16(r3)
284        LDF     f17, FP_17(r3)
285        LDF     f18, FP_18(r3)
286        LDF     f19, FP_19(r3)
287        LDF     f20, FP_20(r3)
288        LDF     f21, FP_21(r3)
289        LDF     f22, FP_22(r3)
290        LDF     f23, FP_23(r3)
291        LDF     f24, FP_24(r3)
292        LDF     f25, FP_25(r3)
293        LDF     f26, FP_26(r3)
294        LDF     f27, FP_27(r3)
295        LDF     f28, FP_28(r3)
296        LDF     f29, FP_29(r3)
297        LDF     f30, FP_30(r3)
298        LDF     f31, FP_31(r3)
299        bne     1f
300        mtmsr   r4
301        isync
3021:
303#endif
304        blr
305
306/*  _CPU_Context_switch
307 *
308 *  This routine performs a normal non-FP context switch.
309 */
310        ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
311        PUBLIC_PROC (_CPU_Context_switch)
312PROC (_CPU_Context_switch):
313#ifndef __SPE__
314        sync
315        isync
316        /* This assumes that all the registers are in the given order */
317        DATA_CACHE_ALIGNMENT(r5)
318        addi    r9,r3,-4
319        DATA_CACHE_ZERO(r5, r9)
320#ifdef RTEMS_MULTIPROCESSING
321        /*
322         * We have to clear the reservation of the executing thread.  See also
323         * Book E section 6.1.6.2 "Atomic Update Primitives".
324         */
325        li      r10, GP_1 + 4
326        stwcx.  r1, r9, r10
327#endif
328        stw     r1, GP_1+4(r9)
329        stw     r2, GP_2+4(r9)
330#if (PPC_USE_MULTIPLE == 1)
331        addi    r9, r9, GP_18+4
332        DATA_CACHE_ZERO(r5, r9)
333        stmw    r13, GP_13-GP_18(r9)
334#else
335        stw     r13, GP_13+4(r9)
336        stw     r14, GP_14+4(r9)
337        stw     r15, GP_15+4(r9)
338        stw     r16, GP_16+4(r9)
339        stw     r17, GP_17+4(r9)
340        stwu    r18, GP_18+4(r9)
341        DATA_CACHE_ZERO(r5, r9)
342        stw     r19, GP_19-GP_18(r9)
343        stw     r20, GP_20-GP_18(r9)
344        stw     r21, GP_21-GP_18(r9)
345        stw     r22, GP_22-GP_18(r9)
346        stw     r23, GP_23-GP_18(r9)
347        stw     r24, GP_24-GP_18(r9)
348        stw     r25, GP_25-GP_18(r9)
349        stw     r26, GP_26-GP_18(r9)
350        stw     r27, GP_27-GP_18(r9)
351        stw     r28, GP_28-GP_18(r9)
352        stw     r29, GP_29-GP_18(r9)
353        stw     r30, GP_30-GP_18(r9)
354        stw     r31, GP_31-GP_18(r9)
355#endif
356        DATA_CACHE_TOUCH(r0, r4)
357        mfcr    r6
358        stw     r6, GP_CR-GP_18(r9)
359        mflr    r7
360        stw     r7, GP_PC-GP_18(r9)
361        mfmsr   r8
362        stw     r8, GP_MSR-GP_18(r9)
363
364#ifdef __ALTIVEC__
365        mr      r14, r4
366        EXTERN_PROC(_CPU_Context_switch_altivec)
367        bl              _CPU_Context_switch_altivec
368        mr      r4, r14
369        DATA_CACHE_ALIGNMENT(r5)
370#endif
371
372        DATA_CACHE_TOUCH(r5, r4)
373        lwz     r1, GP_1(r4)
374        lwz     r2, GP_2(r4)
375#if (PPC_USE_MULTIPLE == 1)
376        addi    r4, r4, GP_19
377        DATA_CACHE_TOUCH(r5, r4)
378        lmw     r13, GP_13-GP_19(r4)
379#else
380        lwz     r13, GP_13(r4)
381        lwz     r14, GP_14(r4)
382        lwz     r15, GP_15(r4)
383        lwz     r16, GP_16(r4)
384        lwz     r17, GP_17(r4)
385        lwz     r18, GP_18(r4)
386        lwzu    r19, GP_19(r4)
387        DATA_CACHE_TOUCH(r5, r4)
388        lwz     r20, GP_20-GP_19(r4)
389        lwz     r21, GP_21-GP_19(r4)
390        lwz     r22, GP_22-GP_19(r4)
391        lwz     r23, GP_23-GP_19(r4)
392        lwz     r24, GP_24-GP_19(r4)
393        lwz     r25, GP_25-GP_19(r4)
394        lwz     r26, GP_26-GP_19(r4)
395        lwz     r27, GP_27-GP_19(r4)
396        lwz     r28, GP_28-GP_19(r4)
397        lwz     r29, GP_29-GP_19(r4)
398        lwz     r30, GP_30-GP_19(r4)
399        lwz     r31, GP_31-GP_19(r4)
400#endif
401        lwz     r6, GP_CR-GP_19(r4)
402        lwz     r7, GP_PC-GP_19(r4)
403        lwz     r8, GP_MSR-GP_19(r4)
404        mtcrf   255, r6
405        mtlr    r7
406        mtmsr   r8
407        isync
408
409        blr
410#else /* __SPE__ */
411        /* Align to a cache line */
412        clrrwi  r3, r3, 5
413        clrrwi  r4, r4, 5
414
415        DATA_CACHE_ZERO_AND_TOUCH(r10, PPC_CONTEXT_CACHE_LINE_0)
416        DATA_CACHE_ZERO_AND_TOUCH(r11, PPC_CONTEXT_CACHE_LINE_1)
417
418        /* Save context to r3 */
419
420        mfmsr   r5
421        mflr    r6
422        mfcr    r7
423#ifdef RTEMS_MULTIPROCESSING
424        /*
425         * We have to clear the reservation of the executing thread.  See also
426         * Book E section 6.1.6.2 "Atomic Update Primitives".
427         *
428         * Here we assume PPC_CONTEXT_OFFSET_SP == PPC_CONTEXT_CACHE_LINE_0.
429         */
430        stwcx.  r1, r3, r10
431#endif
432        stw     r1, PPC_CONTEXT_OFFSET_SP(r3)
433        stw     r5, PPC_CONTEXT_OFFSET_MSR(r3)
434        stw     r6, PPC_CONTEXT_OFFSET_LR(r3)
435        stw     r7, PPC_CONTEXT_OFFSET_CR(r3)
436        evstdd  r14, PPC_CONTEXT_OFFSET_GPR14(r3)
437        evstdd  r15, PPC_CONTEXT_OFFSET_GPR15(r3)
438
439        DATA_CACHE_ZERO_AND_TOUCH(r10, PPC_CONTEXT_CACHE_LINE_2)
440
441        evstdd  r16, PPC_CONTEXT_OFFSET_GPR16(r3)
442        evstdd  r17, PPC_CONTEXT_OFFSET_GPR17(r3)
443        evstdd  r18, PPC_CONTEXT_OFFSET_GPR18(r3)
444        evstdd  r19, PPC_CONTEXT_OFFSET_GPR19(r3)
445
446        DATA_CACHE_ZERO_AND_TOUCH(r10, PPC_CONTEXT_CACHE_LINE_3)
447
448        evstdd  r20, PPC_CONTEXT_OFFSET_GPR20(r3)
449        evstdd  r21, PPC_CONTEXT_OFFSET_GPR21(r3)
450        evstdd  r22, PPC_CONTEXT_OFFSET_GPR22(r3)
451        evstdd  r23, PPC_CONTEXT_OFFSET_GPR23(r3)
452
453        DATA_CACHE_ZERO_AND_TOUCH(r10, PPC_CONTEXT_CACHE_LINE_4)
454
455        evstdd  r24, PPC_CONTEXT_OFFSET_GPR24(r3)
456        evstdd  r25, PPC_CONTEXT_OFFSET_GPR25(r3)
457        evstdd  r26, PPC_CONTEXT_OFFSET_GPR26(r3)
458        evstdd  r27, PPC_CONTEXT_OFFSET_GPR27(r3)
459
460        evstdd  r28, PPC_CONTEXT_OFFSET_GPR28(r3)
461        evstdd  r29, PPC_CONTEXT_OFFSET_GPR29(r3)
462        evstdd  r30, PPC_CONTEXT_OFFSET_GPR30(r3)
463        evstdd  r31, PPC_CONTEXT_OFFSET_GPR31(r3)
464
465        /* Restore context from r4 */
466restore_context:
467
468        lwz     r1, PPC_CONTEXT_OFFSET_SP(r4)
469        lwz     r5, PPC_CONTEXT_OFFSET_MSR(r4)
470        lwz     r6, PPC_CONTEXT_OFFSET_LR(r4)
471        lwz     r7, PPC_CONTEXT_OFFSET_CR(r4)
472
473        evldd   r14, PPC_CONTEXT_OFFSET_GPR14(r4)
474        evldd   r15, PPC_CONTEXT_OFFSET_GPR15(r4)
475
476        DATA_CACHE_TOUCH(r0, r1)
477
478        evldd   r16, PPC_CONTEXT_OFFSET_GPR16(r4)
479        evldd   r17, PPC_CONTEXT_OFFSET_GPR17(r4)
480        evldd   r18, PPC_CONTEXT_OFFSET_GPR18(r4)
481        evldd   r19, PPC_CONTEXT_OFFSET_GPR19(r4)
482
483        evldd   r20, PPC_CONTEXT_OFFSET_GPR20(r4)
484        evldd   r21, PPC_CONTEXT_OFFSET_GPR21(r4)
485        evldd   r22, PPC_CONTEXT_OFFSET_GPR22(r4)
486        evldd   r23, PPC_CONTEXT_OFFSET_GPR23(r4)
487
488        evldd   r24, PPC_CONTEXT_OFFSET_GPR24(r4)
489        evldd   r25, PPC_CONTEXT_OFFSET_GPR25(r4)
490        evldd   r26, PPC_CONTEXT_OFFSET_GPR26(r4)
491        evldd   r27, PPC_CONTEXT_OFFSET_GPR27(r4)
492
493        evldd   r28, PPC_CONTEXT_OFFSET_GPR28(r4)
494        evldd   r29, PPC_CONTEXT_OFFSET_GPR29(r4)
495        evldd   r30, PPC_CONTEXT_OFFSET_GPR30(r4)
496        evldd   r31, PPC_CONTEXT_OFFSET_GPR31(r4)
497
498        mtcr    r7
499        mtlr    r6
500        mtmsr   r5
501
502        blr
503#endif /* __SPE__ */
504
505/*
506 *  _CPU_Context_restore
507 *
508 *  This routine is generallu used only to restart self in an
509 *  efficient manner.  It may simply be a label in _CPU_Context_switch.
510 *
511 *  NOTE: May be unnecessary to reload some registers.
512 */
513/*
514 * ACB: Don't worry about cache optimisation here - this is not THAT critical.
515 */
516        ALIGN (PPC_CACHE_ALIGNMENT, PPC_CACHE_ALIGN_POWER)
517        PUBLIC_PROC (_CPU_Context_restore)
518PROC (_CPU_Context_restore):
519#ifndef __SPE__
520        lwz     r5, GP_CR(r3)
521        lwz     r6, GP_PC(r3)
522        lwz     r7, GP_MSR(r3)
523        mtcrf   255, r5
524        mtlr    r6
525        mtmsr   r7
526        isync
527        lwz     r1, GP_1(r3)
528        lwz     r2, GP_2(r3)
529#if (PPC_USE_MULTIPLE == 1)
530        lmw     r13, GP_13(r3)
531#else
532        lwz     r13, GP_13(r3)
533        lwz     r14, GP_14(r3)
534        lwz     r15, GP_15(r3)
535        lwz     r16, GP_16(r3)
536        lwz     r17, GP_17(r3)
537        lwz     r18, GP_18(r3)
538        lwz     r19, GP_19(r3)
539        lwz     r20, GP_20(r3)
540        lwz     r21, GP_21(r3)
541        lwz     r22, GP_22(r3)
542        lwz     r23, GP_23(r3)
543        lwz     r24, GP_24(r3)
544        lwz     r25, GP_25(r3)
545        lwz     r26, GP_26(r3)
546        lwz     r27, GP_27(r3)
547        lwz     r28, GP_28(r3)
548        lwz     r29, GP_29(r3)
549        lwz     r30, GP_30(r3)
550        lwz     r31, GP_31(r3)
551#endif
552#ifdef __ALTIVEC__
553        EXTERN_PROC(_CPU_Context_restore_altivec)
554        b _CPU_Context_restore_altivec
555#endif
556        blr
557#else /* __SPE__ */
558        /* Align to a cache line */
559        clrrwi  r4, r3, 5
560
561        b       restore_context
562#endif /* __SPE__ */
Note: See TracBrowser for help on using the repository browser.