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

4.104.114.84.95
Last change on this file since a77cd066 was 4f3e4f33, checked in by Joel Sherrill <joel.sherrill@…>, on 02/20/03 at 21:32:07

2003-02-20 Till Straumann <strauman@…>

PR 349/bsps

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