File indexing completed on 2025-05-11 08:24:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #ifdef HAVE_CONFIG_H
0037 #include "config.h"
0038 #endif
0039
0040 #include <rtems/asm.h>
0041
0042 #ifdef ARM_MULTILIB_ARCH_V4
0043
0044 .extern _ARM_Exception_default
0045
0046 .globl _ARMV4_Exception_data_abort_set_handler
0047 .globl _ARMV4_Exception_data_abort
0048
0049 .globl _ARMV4_Exception_prefetch_abort_set_handler
0050 .globl _ARMV4_Exception_prefetch_abort
0051
0052 .section ".bss"
0053
0054 data_abort_handler:
0055 .long 0
0056
0057 prefetch_abort_handler:
0058 .long 0
0059
0060 .section ".text"
0061
0062 #ifdef __thumb__
0063 .thumb_func
0064 #endif
0065
0066 _ARMV4_Exception_data_abort_set_handler:
0067 ldr r1, =data_abort_handler
0068 str r0, [r1]
0069 #ifdef __thumb__
0070 bx lr
0071 #else
0072 mov pc, lr
0073 #endif
0074
0075 #ifdef __thumb__
0076 .thumb_func
0077 #endif
0078
0079 _ARMV4_Exception_prefetch_abort_set_handler:
0080 ldr r1, =prefetch_abort_handler
0081 str r0, [r1]
0082 #ifdef __thumb__
0083 bx lr
0084 #else
0085 mov pc, lr
0086 #endif
0087
0088 .arm
0089
0090 _ARMV4_Exception_prefetch_abort:
0091
0092
0093 sub sp, #20
0094 stmdb sp!, {r0-r12}
0095 mov r4, #3
0096 ldr r6, =prefetch_abort_handler
0097
0098 b save_more_context
0099
0100 _ARMV4_Exception_data_abort:
0101
0102
0103 sub sp, #20
0104 stmdb sp!, {r0-r12}
0105 mov r4, #4
0106 ldr r6, =data_abort_handler
0107
0108 save_more_context:
0109
0110
0111 mov r2, lr
0112 mrs r3, spsr
0113 mrs r7, cpsr
0114 orr r5, r3, #ARM_PSR_I
0115 bic r5, #ARM_PSR_T
0116 msr cpsr, r5
0117 mov r0, sp
0118 mov r1, lr
0119 msr cpsr, r7
0120 add r5, sp, #72
0121 stmdb r5!, {r0-r4}
0122
0123
0124 ldr r2, [r6]
0125 cmp r2, #0
0126 ldreq r2, =_ARM_Exception_default
0127 mov r0, sp
0128 #ifndef __thumb__
0129 mov lr, pc
0130 mov pc, r2
0131 #else
0132 SWITCH_FROM_ARM_TO_THUMB r1
0133 bl call_handler
0134 SWITCH_FROM_THUMB_TO_ARM
0135 #endif
0136
0137
0138 ldmia r5!, {r0-r4}
0139 mov lr, r2
0140 msr spsr, r3
0141 ldmia sp!, {r0-r12}
0142 add sp, #20
0143
0144
0145 subs pc, lr, #8
0146
0147 #ifdef __thumb__
0148 .thumb
0149 call_handler:
0150 bx r2
0151 #endif
0152
0153 #endif