source: rtems/c/src/lib/libbsp/powerpc/shared/vectors/vectors.S @ e79a1947

4.104.114.84.95
Last change on this file since e79a1947 was f05b2ac, checked in by Ralf Corsepius <ralf.corsepius@…>, on Apr 21, 2004 at 4:01:48 PM

Remove duplicate white lines.

  • Property mode set to 100644
File size: 3.1 KB
Line 
1/*
2 * (c) 1999, Eric Valette valette@crf.canon.fr
3 *
4 *
5 *  This file contains the assembly code for the PowerPC
6 *  exception veneers for RTEMS.
7 *
8 * $Id$
9 */
10
11#include <rtems/asm.h>
12#include <rtems/score/cpu.h>
13#include <bsp/vectors.h>
14
15#define SYNC \
16        sync; \
17        isync
18
19        PUBLIC_VAR (__rtems_start)
20        .section .entry_point_section,"awx",@progbits
21/*
22 * Entry point information used by bootloader code
23 */
24SYM (__rtems_start):
25        .long   __rtems_entry_point
26
27        /*
28         * end of special Entry point section
29         */
30        .text
31        .p2align 5
32
33PUBLIC_VAR(default_exception_vector_code_prolog)
34SYM (default_exception_vector_code_prolog):
35        /*
36         * let room for exception frame
37         */
38        stwu    r1, - (EXCEPTION_FRAME_END)(r1)
39        stw     r3, GPR3_OFFSET(r1)
40        /* R2 should never change (EABI: pointer to .sdata2) - we
41     * save it nevertheless..
42         */
43        stw     r2, GPR2_OFFSET(r1)
44        mflr    r3
45        stw     r3, EXC_LR_OFFSET(r1)
46        bl      0f
470:      /*
48         * r3 = exception vector entry point
49         * (256 * vector number) + few instructions
50         */
51        mflr    r3
52        /*
53         * r3 = r3 >> 8 = vector
54         */
55        srwi    r3,r3,8
56        ba      push_normalized_frame
57
58        PUBLIC_VAR (default_exception_vector_code_prolog_size)
59
60        default_exception_vector_code_prolog_size= . - default_exception_vector_code_prolog
61
62        .p2align 5
63PUBLIC_VAR (push_normalized_frame)
64SYM (push_normalized_frame):
65        stw     r3, EXCEPTION_NUMBER_OFFSET(r1)
66        stw     r0, GPR0_OFFSET(r1)
67        mfsrr0  r3
68        stw     r3, SRR0_FRAME_OFFSET(r1)
69        mfsrr1  r3
70        stw     r3, SRR1_FRAME_OFFSET(r1)
71        /*
72         * Save general purpose registers
73         * Already saved in prolog : R1, R2, R3, LR.
74         * Saved a few line above  : R0
75         *
76         * Manual says that "stmw" instruction may be slower than
77         * series of individual "stw" but who cares about performance
78         * for the DEFAULT exception handler?
79         */
80        stmw    r4, GPR4_OFFSET(r1)     /* save R4->R31 */
81
82        mfcr    r31
83        stw     r31,  EXC_CR_OFFSET(r1)
84        mfctr   r30
85        stw     r30,  EXC_CTR_OFFSET(r1)
86        mfxer   r28
87        stw     r28,  EXC_XER_OFFSET(r1)
88        mfmsr   r28
89        stw     r28,  EXC_MSR_OFFSET(r1)
90        mfdar   r28
91        stw     r28,  EXC_DAR_OFFSET(r1)
92        /*
93         * compute SP at exception entry
94         */
95        addi    r3, r1, EXCEPTION_FRAME_END
96        /*
97         * store it at the right place
98         */
99        stw     r3, GPR1_OFFSET(r1)
100        /*
101         * Enable data and instruction address translation, exception nesting
102         */
103        mfmsr   r3
104        ori     r3,r3, MSR_RI | MSR_IR | MSR_DR
105        mtmsr   r3
106        SYNC
107
108        /*
109         * Call C exception handler
110         */
111        /*
112         * store the execption frame address in r3 (first param)
113         */
114        addi    r3, r1, 0x8
115        /*
116         * globalExceptHdl(r3)
117         */
118        addis   r4, 0, globalExceptHdl@ha
119        lwz     r5, globalExceptHdl@l(r4)
120        mtlr    r5
121        blrl
122        /*
123         * Restore registers status
124         */
125        lwz     r31,  EXC_CR_OFFSET(r1)
126        mtcr    r31
127        lwz     r30,  EXC_CTR_OFFSET(r1)
128        mtctr   r30
129        lwz     r29,  EXC_LR_OFFSET(r1)
130        mtlr    r29
131        lwz     r28,  EXC_XER_OFFSET(r1)
132        mtxer   r28
133
134        lmw     r4, GPR4_OFFSET(r1)
135        lwz     r2, GPR2_OFFSET(r1)
136        lwz     r0, GPR0_OFFSET(r1)
137
138        /*
139         * Disable data and instruction translation. Make path non recoverable...
140         */
141        mfmsr   r3
142        xori    r3, r3, MSR_RI | MSR_IR | MSR_DR
143        mtmsr   r3
144        SYNC
145        /*
146         * Restore rfi related settings
147         */
148
149        lwz     r3, SRR1_FRAME_OFFSET(r1)
150        mtsrr1  r3
151        lwz     r3, SRR0_FRAME_OFFSET(r1)
152        mtsrr0  r3
153
154        lwz     r3, GPR3_OFFSET(r1)
155        addi    r1,r1, EXCEPTION_FRAME_END
156        SYNC
157        rfi
Note: See TracBrowser for help on using the repository browser.