source: rtems/c/src/lib/libbsp/powerpc/eth_comm/vectors/vectors.S @ 49ec556

4.104.114.84.95
Last change on this file since 49ec556 was 4055e6f8, checked in by Joel Sherrill <joel.sherrill@…>, on 04/16/01 at 20:18:03

2001-04-11 Eric Valette <valette@…>

  • clock/.cvsignore, clock/Makefile.am, clock/p_clock.c, include/8xx_immap.h, include/commproc.h, irq/.cvsignore, irq/Makefile.am, irq/irq.c, irq/irq.h, irq/irq_asm.S, irq/irq_init.c, vectors/.cvsignore, vectors/Makefile.am, vectors/vectors.S, vectors/vectors.h, vectors/vectors_init.c: New file.
  • Switch the eth_comm BSP to use the "new exception processing model."
  • Property mode set to 100644
File size: 2.8 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 <bsp/vectors.h>
14#include <libcpu/cpu.h>
15#include <rtems/score/targopts.h>
16#include "asm.h"
17       
18
19#define SYNC \
20        sync; \
21        isync
22       
23        .text
24        .p2align 5     
25               
26PUBLIC_VAR(default_exception_vector_code_prolog)
27SYM (default_exception_vector_code_prolog):
28        /*
29         * let room for exception frame
30         */
31        stwu    r1, - (EXCEPTION_FRAME_END)(r1)
32        stw     r3, GPR3_OFFSET(r1)
33        stw     r2, GPR2_OFFSET(r1)
34        mflr    r2
35        stw     r2, EXC_LR_OFFSET(r1)
36        bl      0f
370:      /*
38         * r3 = exception vector entry point
39         * (256 * vector number) + few instructions
40         */
41        mflr    r3
42        /*
43         * r3 = r3 >> 8 = vector
44         */
45        srwi    r3,r3,8
46        ba      push_normalized_frame
47       
48        PUBLIC_VAR (default_exception_vector_code_prolog_size)
49       
50        default_exception_vector_code_prolog_size= . - default_exception_vector_code_prolog
51       
52        .p2align 5
53PUBLIC_VAR (push_normalized_frame)     
54SYM (push_normalized_frame):
55        stw     r3, EXCEPTION_NUMBER_OFFSET(r1)
56        stw     r0, GPR0_OFFSET(r1)
57        mfsrr0  r2
58        stw     r2, SRR0_FRAME_OFFSET(r1)
59        mfsrr1  r3
60        stw     r3, SRR1_FRAME_OFFSET(r1)
61        /*
62         * Save general purpose registers
63         * Already saved in prolog : R1, R2, R3, LR.
64         * Saved a few line above  : R0
65         *
66         * Manual says that "stmw" instruction may be slower than
67         * series of individual "stw" but who cares about performance
68         * for the DEFAULT exception handler?
69         */
70        stmw    r4, GPR4_OFFSET(r1)     /* save R4->R31 */
71
72        mfcr    r31
73        stw     r31,  EXC_CR_OFFSET(r1)
74        mfctr   r30
75        stw     r30,  EXC_CTR_OFFSET(r1)
76        mfxer   r28
77        stw     r28,  EXC_XER_OFFSET(r1)
78        /*
79         * compute SP at exception entry
80         */
81        addi    r2, r1, EXCEPTION_FRAME_END
82        /*
83         * store it at the right place
84         */
85        stw     r2, GPR1_OFFSET(r1)
86        /*
87         * Enable data and instruction address translation, exception nesting
88         */
89        mfmsr   r3
90        ori     r3,r3, MSR_RI | MSR_IR | MSR_DR
91        mtmsr   r3
92        SYNC
93       
94        /*
95         * Call C exception handler
96         */
97        /*
98         * store the execption frame address in r3 (first param)
99         */
100        addi    r3, r1, 0x8
101        /*
102         * globalExceptHdl(r3)
103         */
104        addis   r4, 0, globalExceptHdl@ha
105        lwz     r5, globalExceptHdl@l(r4)
106        mtlr    r5
107        blrl
108        /*
109         * Restore registers status
110         */
111        lwz     r31,  EXC_CR_OFFSET(r1)
112        mtcr    r31
113        lwz     r30,  EXC_CTR_OFFSET(r1)
114        mtctr   r30
115        lwz     r29,  EXC_LR_OFFSET(r1)
116        mtlr    r29
117        lwz     r28,  EXC_XER_OFFSET(r1)
118        mtxer   r28
119
120        lmw     r4, GPR4_OFFSET(r1)
121        lwz     r2, GPR2_OFFSET(r1)
122        lwz     r0, GPR0_OFFSET(r1)
123
124        /*
125         * Disable data and instruction translation. Make path non recoverable...
126         */
127        mfmsr   r3
128        xori    r3, r3, MSR_RI | MSR_IR | MSR_DR
129        mtmsr   r3
130        SYNC
131        /*
132         * Restore rfi related settings
133         */
134                 
135        lwz     r3, SRR1_FRAME_OFFSET(r1)
136        mtsrr1  r3
137        lwz     r3, SRR0_FRAME_OFFSET(r1)
138        mtsrr0  r3
139       
140        lwz     r3, GPR3_OFFSET(r1)
141        addi    r1,r1, EXCEPTION_FRAME_END
142        SYNC
143        rfi
Note: See TracBrowser for help on using the repository browser.