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
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056 #ifndef _RTEMS_ASM_H
0057 #define _RTEMS_ASM_H
0058
0059
0060
0061
0062
0063 #ifndef ASM
0064 #define ASM
0065 #endif
0066 #include <rtems/score/percpu.h>
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084 #ifndef __USER_LABEL_PREFIX__
0085 #define __USER_LABEL_PREFIX__ _
0086 #endif
0087
0088 #ifndef __REGISTER_PREFIX__
0089 #define __REGISTER_PREFIX__
0090 #endif
0091
0092
0093
0094 #define SYM(x) RTEMS_XCONCAT(__USER_LABEL_PREFIX__, x)
0095
0096
0097
0098 #define REG(x) RTEMS_XCONCAT(__REGISTER_PREFIX__, x)
0099
0100
0101
0102
0103
0104
0105
0106 #define r0 REG(r0)
0107 #define r1 REG(r1)
0108 #define r2 REG(r2)
0109 #define r3 REG(r3)
0110 #define r4 REG(r4)
0111 #define r5 REG(r5)
0112 #define r6 REG(r6)
0113 #define r7 REG(r7)
0114 #define r8 REG(r8)
0115 #define r9 REG(r9)
0116 #define r10 REG(r10)
0117 #define r11 REG(r11)
0118 #define r12 REG(r12)
0119 #define r13 REG(r13)
0120 #define r14 REG(r14)
0121 #define r15 REG(r15)
0122
0123 #define CPSR REG(CPSR)
0124
0125 #define SPSR REG(SPSR)
0126
0127 #define NUM_IRQ_VECTOR 6
0128 #define NUM_FIQ_VECTOR 7
0129
0130 #define CPSR_IRQ_DISABLE 0x80
0131 #define CPSR_FIQ_DISABLE 0x40
0132 #define CPSR_THUMB_ENABLE 0x20
0133 #define CPSR_FIQ_MODE 0x11
0134 #define CPSR_IRQ_MODE 0x12
0135 #define CPSR_SUPERVISOR_MODE 0x13
0136 #define CPSR_UNDEF_MODE 0x1B
0137
0138 #define CPSR_MODE_BITS 0x1F
0139
0140
0141
0142
0143
0144
0145 #define BEGIN_CODE_DCL .text
0146 #define END_CODE_DCL
0147 #define BEGIN_DATA_DCL .data
0148 #define END_DATA_DCL
0149 #define BEGIN_CODE .text
0150 #define END_CODE
0151 #define BEGIN_DATA
0152 #define END_DATA
0153 #define BEGIN_BSS
0154 #define END_BSS
0155 #define END
0156
0157
0158
0159
0160
0161
0162 #define PUBLIC(sym) .globl SYM (sym)
0163 #define EXTERN(sym) .globl SYM (sym)
0164
0165 #define FUNCTION_THUMB_ENTRY(name) \
0166 .thumb; \
0167 .thumb_func; \
0168 .align 2; \
0169 .globl name; \
0170 .type name, %function; \
0171 name:
0172
0173 #define FUNCTION_ENTRY(name) \
0174 .align 2; \
0175 .globl name; \
0176 .type name, %function; \
0177 name:
0178
0179 #define FUNCTION_END(name) \
0180 .size name, . - name
0181
0182 #if defined(ARM_MULTILIB_ARCH_V7M)
0183 #define DEFINE_FUNCTION_ARM(name) \
0184 .thumb_func ; .globl name ; name:
0185 #elif defined(__thumb__)
0186 #define DEFINE_FUNCTION_ARM(name) \
0187 .thumb_func ; .globl name ; name: ; bx pc ; \
0188 .arm ; .globl name ## _arm ; name ## _arm:
0189 #else
0190 #define DEFINE_FUNCTION_ARM(name) \
0191 .globl name ; name: ; .globl name ## _arm ; name ## _arm:
0192 #endif
0193
0194 .macro SWITCH_FROM_THUMB_TO_ARM
0195 #ifdef __thumb__
0196 .align 2
0197 bx pc
0198 .arm
0199 #endif
0200 .endm
0201
0202 .macro SWITCH_FROM_ARM_TO_THUMB REG
0203 #ifdef __thumb__
0204 add \REG, pc, #1
0205 bx \REG
0206 .thumb
0207 #endif
0208 .endm
0209
0210 .macro SWITCH_FROM_THUMB_2_TO_ARM
0211 #ifdef __thumb2__
0212 .align 2
0213 bx pc
0214 .arm
0215 #endif
0216 .endm
0217
0218 .macro SWITCH_FROM_ARM_TO_THUMB_2 REG
0219 #ifdef __thumb2__
0220 add \REG, pc, #1
0221 bx \REG
0222 .thumb
0223 #endif
0224 .endm
0225
0226 .macro BLX_TO_THUMB_1 TARGET
0227 #if defined(__thumb__) && !defined(__thumb2__)
0228 add lr, pc, #1
0229 bx lr
0230 .thumb
0231 bl \TARGET
0232 .align 2
0233 bx pc
0234 .arm
0235 #else
0236 bl \TARGET
0237 #endif
0238 .endm
0239
0240 .macro GET_SELF_CPU_CONTROL REG
0241 #ifdef RTEMS_SMP
0242
0243 mrc p15, 0, \REG, c13, c0, 4
0244 #else
0245 ldr \REG, =_Per_CPU_Information
0246 #endif
0247 .endm
0248
0249
0250
0251 #endif