source: rtems/cpukit/score/cpu/arm/arm_exc_abort.S @ eb142fee

5
Last change on this file since eb142fee was c499856, checked in by Chris Johns <chrisj@…>, on 03/20/14 at 21:10:47

Change all references of rtems.com to rtems.org.

  • Property mode set to 100644
File size: 2.2 KB
Line 
1/**
2 * @file
3 *
4 * @ingroup ScoreCPU
5 *
6 * @brief ARM data and prefetch abort exception prologue and epilogue.
7 */
8
9/*
10 * Copyright (c) 2009
11 * embedded brains GmbH
12 * Obere Lagerstr. 30
13 * D-82178 Puchheim
14 * Germany
15 * <rtems@embedded-brains.de>
16 *
17 * The license and distribution terms for this file may be
18 * found in the file LICENSE in this distribution or at
19 * http://www.rtems.org/license/LICENSE.
20 */
21
22#ifdef HAVE_CONFIG_H
23#include "config.h"
24#endif
25
26#include <rtems/asm.h>
27#include <rtems/system.h>
28
29#ifdef ARM_MULTILIB_ARCH_V4
30
31.extern _ARM_Exception_default
32
33.globl _ARMV4_Exception_data_abort_set_handler
34.globl _ARMV4_Exception_data_abort
35
36.globl _ARMV4_Exception_prefetch_abort_set_handler
37.globl _ARMV4_Exception_prefetch_abort
38
39.section ".bss"
40
41data_abort_handler:
42.long 0
43
44prefetch_abort_handler:
45.long 0
46
47.section ".text"
48
49#ifdef __thumb__
50        .thumb_func
51#endif
52
53_ARMV4_Exception_data_abort_set_handler:
54        ldr     r1, =data_abort_handler
55        str     r0, [r1]
56#ifdef __thumb__
57        bx      lr
58#else
59        mov     pc, lr
60#endif
61
62#ifdef __thumb__
63        .thumb_func
64#endif
65
66_ARMV4_Exception_prefetch_abort_set_handler:
67        ldr     r1, =prefetch_abort_handler
68        str     r0, [r1]
69#ifdef __thumb__
70        bx      lr
71#else
72        mov     pc, lr
73#endif
74
75.arm
76
77_ARMV4_Exception_prefetch_abort:
78
79        /* Save context and load handler */
80        sub     sp, #20
81        stmdb   sp!, {r0-r12}
82        mov     r4, #3
83        ldr     r6, =prefetch_abort_handler
84
85        b       save_more_context
86
87_ARMV4_Exception_data_abort:
88
89        /* Save context and load handler */
90        sub     sp, #20
91        stmdb   sp!, {r0-r12}
92        mov     r4, #4
93        ldr     r6, =data_abort_handler
94
95save_more_context:
96
97        /* Save more context */
98        mov     r2, lr
99        mrs     r3, spsr
100        mrs     r7, cpsr
101        orr     r5, r3, #ARM_PSR_I
102        bic     r5, #ARM_PSR_T
103        msr     cpsr, r5
104        mov     r0, sp
105        mov     r1, lr
106        msr     cpsr, r7
107        add     r5, sp, #72
108        stmdb   r5!, {r0-r4}
109
110        /* Call high level handler */
111        ldr     r2, [r6]
112        cmp     r2, #0
113        ldreq   r2, =_ARM_Exception_default
114        mov     r0, sp
115#ifndef __thumb__
116        mov     lr, pc
117        mov     pc, r2
118#else /* __thumb__ */
119        SWITCH_FROM_ARM_TO_THUMB        r1
120        bl      call_handler
121        SWITCH_FROM_THUMB_TO_ARM
122#endif /* __thumb__ */
123
124        /* Restore context */
125        ldmia   r5!, {r0-r4}
126        mov     lr, r2
127        msr     spsr, r3
128        ldmia   sp!, {r0-r12}
129        add     sp, #20
130
131        /* Return from interrupt */
132        subs    pc, lr, #8
133
134#ifdef __thumb__
135.thumb
136call_handler:
137        bx      r2
138#endif /* __thumb__ */
139
140#endif /* ARM_MULTILIB_ARCH_V4 */
Note: See TracBrowser for help on using the repository browser.