21 #ifndef RTEMS_SCORE_ARMV7M_H 22 #define RTEMS_SCORE_ARMV7M_H 24 #include <rtems/score/cpu.h> 30 #ifdef ARM_MULTILIB_ARCH_V7M 33 #define ARMV7M_CPACR 0xe000ed88 44 typedef void (*ARMV7M_Exception_handler)(void);
51 uint32_t register_r12;
54 uint32_t register_xpsr;
55 #ifdef ARM_MULTILIB_VFP 66 uint32_t register_s10;
67 uint32_t register_s11;
68 uint32_t register_s12;
69 uint32_t register_s13;
70 uint32_t register_s14;
71 uint32_t register_s15;
72 uint32_t register_fpscr;
75 } ARMV7M_Exception_frame;
80 #define ARMV7M_SCB_ICSR_NMIPENDSET (1U << 31) 81 #define ARMV7M_SCB_ICSR_PENDSVSET (1U << 28) 82 #define ARMV7M_SCB_ICSR_PENDSVCLR (1U << 27) 83 #define ARMV7M_SCB_ICSR_PENDSTSET (1U << 26) 84 #define ARMV7M_SCB_ICSR_PENDSTCLR (1U << 25) 85 #define ARMV7M_SCB_ICSR_ISRPREEMPT (1U << 23) 86 #define ARMV7M_SCB_ICSR_ISRPENDING (1U << 22) 87 #define ARMV7M_SCB_ICSR_VECTPENDING_GET(reg) (((reg) >> 12) & 0x1ffU) 88 #define ARMV7M_SCB_ICSR_RETTOBASE (1U << 11) 89 #define ARMV7M_SCB_ICSR_VECTACTIVE_GET(reg) ((reg) & 0x1ffU) 92 ARMV7M_Exception_handler *vtor;
94 #define ARMV7M_SCB_AIRCR_VECTKEY (0x05fa << 16) 95 #define ARMV7M_SCB_AIRCR_ENDIANESS (1U << 15) 96 #define ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT 8 97 #define ARMV7M_SCB_AIRCR_PRIGROUP_MASK \ 98 ((0x7U) << ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT) 99 #define ARMV7M_SCB_AIRCR_PRIGROUP(val) \ 100 (((val) << ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT) & ARMV7M_SCB_AIRCR_PRIGROUP_MASK) 101 #define ARMV7M_SCB_AIRCR_PRIGROUP_GET(reg) \ 102 (((val) & ARMV7M_SCB_AIRCR_PRIGROUP_MASK) >> ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT) 103 #define ARMV7M_SCB_AIRCR_PRIGROUP_SET(reg, val) \ 104 (((reg) & ~ARMV7M_SCB_AIRCR_PRIGROUP_MASK) | ARMV7M_SCB_AIRCR_PRIGROUP(val)) 105 #define ARMV7M_SCB_AIRCR_SYSRESETREQ (1U << 2) 106 #define ARMV7M_SCB_AIRCR_VECTCLRACTIVE (1U << 1) 107 #define ARMV7M_SCB_AIRCR_VECTRESET (1U << 0) 114 #define ARMV7M_SCB_SHCSR_USGFAULTENA (1U << 18) 115 #define ARMV7M_SCB_SHCSR_BUSFAULTENA (1U << 17) 116 #define ARMV7M_SCB_SHCSR_MEMFAULTENA (1U << 16) 125 uint32_t reserved_e000ed40[18];
127 uint32_t reserved_e000ed8c[106];
136 #define ARMV7M_SYSTICK_CSR_COUNTFLAG (1U << 16) 137 #define ARMV7M_SYSTICK_CSR_CLKSOURCE (1U << 2) 138 #define ARMV7M_SYSTICK_CSR_TICKINT (1U << 1) 139 #define ARMV7M_SYSTICK_CSR_ENABLE (1U << 0) 145 #define ARMV7M_SYSTICK_CALIB_NOREF (1U << 31) 146 #define ARMV7M_SYSTICK_CALIB_SKEW (1U << 30) 147 #define ARMV7M_SYSTICK_CALIB_TENMS_GET(reg) ((reg) & 0xffffffU) 153 uint32_t reserved_0 [24];
155 uint32_t reserved_1 [24];
157 uint32_t reserved_2 [24];
159 uint32_t reserved_3 [24];
161 uint32_t reserved_4 [56];
163 uint32_t reserved_5 [644];
168 #define ARMV7M_MPU_TYPE_IREGION_GET(reg) (((reg) >> 16) & 0xffU) 169 #define ARMV7M_MPU_TYPE_DREGION_GET(reg) (((reg) >> 8) & 0xffU) 170 #define ARMV7M_MPU_TYPE_SEPARATE (1U << 0) 173 #define ARMV7M_MPU_CTRL_PRIVDEFENA (1U << 2) 174 #define ARMV7M_MPU_CTRL_HFNMIENA (1U << 1) 175 #define ARMV7M_MPU_CTRL_ENABLE (1U << 0) 180 #define ARMV7M_MPU_RBAR_ADDR_SHIFT 5 181 #define ARMV7M_MPU_RBAR_ADDR_MASK \ 182 ((0x7ffffffU) << ARMV7M_MPU_RBAR_ADDR_SHIFT) 183 #define ARMV7M_MPU_RBAR_ADDR(val) \ 184 (((val) << ARMV7M_MPU_RBAR_ADDR_SHIFT) & ARMV7M_MPU_RBAR_ADDR_MASK) 185 #define ARMV7M_MPU_RBAR_ADDR_GET(reg) \ 186 (((val) & ARMV7M_MPU_RBAR_ADDR_MASK) >> ARMV7M_MPU_RBAR_ADDR_SHIFT) 187 #define ARMV7M_MPU_RBAR_ADDR_SET(reg, val) \ 188 (((reg) & ~ARMV7M_MPU_RBAR_ADDR_MASK) | ARMV7M_MPU_RBAR_ADDR(val)) 189 #define ARMV7M_MPU_RBAR_VALID (1U << 4) 190 #define ARMV7M_MPU_RBAR_REGION_SHIFT 0 191 #define ARMV7M_MPU_RBAR_REGION_MASK \ 192 ((0xfU) << ARMV7M_MPU_RBAR_REGION_SHIFT) 193 #define ARMV7M_MPU_RBAR_REGION(val) \ 194 (((val) << ARMV7M_MPU_RBAR_REGION_SHIFT) & ARMV7M_MPU_RBAR_REGION_MASK) 195 #define ARMV7M_MPU_RBAR_REGION_GET(reg) \ 196 (((val) & ARMV7M_MPU_RBAR_REGION_MASK) >> ARMV7M_MPU_RBAR_REGION_SHIFT) 197 #define ARMV7M_MPU_RBAR_REGION_SET(reg, val) \ 198 (((reg) & ~ARMV7M_MPU_RBAR_REGION_MASK) | ARMV7M_MPU_RBAR_REGION(val)) 201 #define ARMV7M_MPU_RASR_XN (1U << 28) 202 #define ARMV7M_MPU_RASR_AP_SHIFT 24 203 #define ARMV7M_MPU_RASR_AP_MASK \ 204 ((0x7U) << ARMV7M_MPU_RASR_AP_SHIFT) 205 #define ARMV7M_MPU_RASR_AP(val) \ 206 (((val) << ARMV7M_MPU_RASR_AP_SHIFT) & ARMV7M_MPU_RASR_AP_MASK) 207 #define ARMV7M_MPU_RASR_AP_GET(reg) \ 208 (((val) & ARMV7M_MPU_RASR_AP_MASK) >> ARMV7M_MPU_RASR_AP_SHIFT) 209 #define ARMV7M_MPU_RASR_AP_SET(reg, val) \ 210 (((reg) & ~ARMV7M_MPU_RASR_AP_MASK) | ARMV7M_MPU_RASR_AP(val)) 211 #define ARMV7M_MPU_RASR_TEX_SHIFT 19 212 #define ARMV7M_MPU_RASR_TEX_MASK \ 213 ((0x7U) << ARMV7M_MPU_RASR_TEX_SHIFT) 214 #define ARMV7M_MPU_RASR_TEX(val) \ 215 (((val) << ARMV7M_MPU_RASR_TEX_SHIFT) & ARMV7M_MPU_RASR_TEX_MASK) 216 #define ARMV7M_MPU_RASR_TEX_GET(reg) \ 217 (((val) & ARMV7M_MPU_RASR_TEX_MASK) >> ARMV7M_MPU_RASR_TEX_SHIFT) 218 #define ARMV7M_MPU_RASR_TEX_SET(reg, val) \ 219 (((reg) & ~ARMV7M_MPU_RASR_TEX_MASK) | ARMV7M_MPU_RASR_TEX(val)) 220 #define ARMV7M_MPU_RASR_S (1U << 18) 221 #define ARMV7M_MPU_RASR_C (1U << 17) 222 #define ARMV7M_MPU_RASR_B (1U << 16) 223 #define ARMV7M_MPU_RASR_SRD_SHIFT 8 224 #define ARMV7M_MPU_RASR_SRD_MASK \ 225 ((0xffU) << ARMV7M_MPU_RASR_SRD_SHIFT) 226 #define ARMV7M_MPU_RASR_SRD(val) \ 227 (((val) << ARMV7M_MPU_RASR_SRD_SHIFT) & ARMV7M_MPU_RASR_SRD_MASK) 228 #define ARMV7M_MPU_RASR_SRD_GET(reg) \ 229 (((val) & ARMV7M_MPU_RASR_SRD_MASK) >> ARMV7M_MPU_RASR_SRD_SHIFT) 230 #define ARMV7M_MPU_RASR_SRD_SET(reg, val) \ 231 (((reg) & ~ARMV7M_MPU_RASR_SRD_MASK) | ARMV7M_MPU_RASR_SRD(val)) 232 #define ARMV7M_MPU_RASR_SIZE_SHIFT 1 233 #define ARMV7M_MPU_RASR_SIZE_MASK \ 234 ((0x1fU) << ARMV7M_MPU_RASR_SIZE_SHIFT) 235 #define ARMV7M_MPU_RASR_SIZE(val) \ 236 (((val) << ARMV7M_MPU_RASR_SIZE_SHIFT) & ARMV7M_MPU_RASR_SIZE_MASK) 237 #define ARMV7M_MPU_RASR_SIZE_GET(reg) \ 238 (((val) & ARMV7M_MPU_RASR_SIZE_MASK) >> ARMV7M_MPU_RASR_SIZE_SHIFT) 239 #define ARMV7M_MPU_RASR_SIZE_SET(reg, val) \ 240 (((reg) & ~ARMV7M_MPU_RASR_SIZE_MASK) | ARMV7M_MPU_RASR_SIZE(val)) 241 #define ARMV7M_MPU_RASR_ENABLE (1U << 0) 253 ARMV7M_MPU_AP_PRIV_NO_USER_NO,
254 ARMV7M_MPU_AP_PRIV_RW_USER_NO,
255 ARMV7M_MPU_AP_PRIV_RW_USER_RO,
256 ARMV7M_MPU_AP_PRIV_RW_USER_RW,
257 ARMV7M_MPU_AP_PRIV_RO_USER_NO = 0x5,
258 ARMV7M_MPU_AP_PRIV_RO_USER_RO,
259 } ARMV7M_MPU_Access_permissions;
262 ARMV7M_MPU_ATTR_R = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RO_USER_NO)
263 | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_XN,
264 ARMV7M_MPU_ATTR_RW = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
265 | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_XN | ARMV7M_MPU_RASR_B,
266 ARMV7M_MPU_ATTR_RWX = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
267 | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_B,
268 ARMV7M_MPU_ATTR_X = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_NO_USER_NO)
270 ARMV7M_MPU_ATTR_RX = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RO_USER_NO)
272 ARMV7M_MPU_ATTR_IO = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
273 | ARMV7M_MPU_RASR_XN,
274 } ARMV7M_MPU_Attributes;
277 ARMV7M_MPU_SIZE_32_B = 0x4,
278 ARMV7M_MPU_SIZE_64_B,
279 ARMV7M_MPU_SIZE_128_B,
280 ARMV7M_MPU_SIZE_256_B,
281 ARMV7M_MPU_SIZE_512_B,
282 ARMV7M_MPU_SIZE_1_KB,
283 ARMV7M_MPU_SIZE_2_KB,
284 ARMV7M_MPU_SIZE_4_KB,
285 ARMV7M_MPU_SIZE_8_KB,
286 ARMV7M_MPU_SIZE_16_KB,
287 ARMV7M_MPU_SIZE_32_KB,
288 ARMV7M_MPU_SIZE_64_KB,
289 ARMV7M_MPU_SIZE_128_KB,
290 ARMV7M_MPU_SIZE_256_KB,
291 ARMV7M_MPU_SIZE_512_KB,
292 ARMV7M_MPU_SIZE_1_MB,
293 ARMV7M_MPU_SIZE_2_MB,
294 ARMV7M_MPU_SIZE_4_MB,
295 ARMV7M_MPU_SIZE_8_MB,
296 ARMV7M_MPU_SIZE_16_MB,
297 ARMV7M_MPU_SIZE_32_MB,
298 ARMV7M_MPU_SIZE_64_MB,
299 ARMV7M_MPU_SIZE_128_MB,
300 ARMV7M_MPU_SIZE_256_MB,
301 ARMV7M_MPU_SIZE_512_MB,
302 ARMV7M_MPU_SIZE_1_GB,
303 ARMV7M_MPU_SIZE_2_GB,
312 #define ARMV7M_MPU_REGION_INITIALIZER(idx, addr, size, attr) \ 314 ((addr) & ARMV7M_MPU_RBAR_ADDR_MASK) \ 315 | ARMV7M_MPU_RBAR_VALID \ 316 | ARMV7M_MPU_RBAR_REGION(idx), \ 317 ARMV7M_MPU_RASR_SIZE(size) | (attr) | ARMV7M_MPU_RASR_ENABLE \ 320 #define ARMV7M_MPU_REGION_DISABLED_INITIALIZER(idx) \ 322 ARMV7M_MPU_RBAR_VALID | ARMV7M_MPU_RBAR_REGION(idx), \ 326 #define ARMV7M_SCS_BASE 0xe000e000 327 #define ARMV7M_ICTAC_BASE (ARMV7M_SCS_BASE + 0x0) 328 #define ARMV7M_SYSTICK_BASE (ARMV7M_SCS_BASE + 0x10) 329 #define ARMV7M_NVIC_BASE (ARMV7M_SCS_BASE + 0x100) 330 #define ARMV7M_SCB_BASE (ARMV7M_SCS_BASE + 0xd00) 331 #define ARMV7M_MPU_BASE (ARMV7M_SCS_BASE + 0xd90) 333 #define _ARMV7M_ICTAC \ 334 ((volatile ARMV7M_ICTAC *) ARMV7M_ICTAC_BASE) 335 #define _ARMV7M_SCB \ 336 ((volatile ARMV7M_SCB *) ARMV7M_SCB_BASE) 337 #define _ARMV7M_Systick \ 338 ((volatile ARMV7M_Systick *) ARMV7M_SYSTICK_BASE) 339 #define _ARMV7M_NVIC \ 340 ((volatile ARMV7M_NVIC *) ARMV7M_NVIC_BASE) 341 #define _ARMV7M_MPU \ 342 ((volatile ARMV7M_MPU *) ARMV7M_MPU_BASE) 344 #define ARMV7M_VECTOR_MSP 0 345 #define ARMV7M_VECTOR_RESET 1 346 #define ARMV7M_VECTOR_NMI 2 347 #define ARMV7M_VECTOR_HARD_FAULT 3 348 #define ARMV7M_VECTOR_MEM_MANAGE 4 349 #define ARMV7M_VECTOR_BUS_FAULT 5 350 #define ARMV7M_VECTOR_USAGE_FAULT 6 351 #define ARMV7M_VECTOR_SVC 11 352 #define ARMV7M_VECTOR_DEBUG_MONITOR 12 353 #define ARMV7M_VECTOR_PENDSV 14 354 #define ARMV7M_VECTOR_SYSTICK 15 355 #define ARMV7M_VECTOR_IRQ(n) ((n) + 16) 356 #define ARMV7M_IRQ_OF_VECTOR(n) ((n) - 16) 358 #define ARMV7M_EXCEPTION_PRIORITY_LOWEST 255 360 static inline bool _ARMV7M_Is_vector_an_irq(
int vector )
365 static inline uint32_t _ARMV7M_Get_basepri(
void)
368 __asm__ volatile (
"mrs %[val], basepri\n" : [val]
"=&r" (val));
372 static inline void _ARMV7M_Set_basepri(uint32_t val)
374 __asm__ volatile (
"msr basepri, %[val]\n" : : [val]
"r" (val));
377 static inline uint32_t _ARMV7M_Get_primask(
void)
380 __asm__ volatile (
"mrs %[val], primask\n" : [val]
"=&r" (val));
384 static inline void _ARMV7M_Set_primask(uint32_t val)
386 __asm__ volatile (
"msr primask, %[val]\n" : : [val]
"r" (val));
389 static inline uint32_t _ARMV7M_Get_faultmask(
void)
392 __asm__ volatile (
"mrs %[val], faultmask\n" : [val]
"=&r" (val));
396 static inline void _ARMV7M_Set_faultmask(uint32_t val)
398 __asm__ volatile (
"msr faultmask, %[val]\n" : : [val]
"r" (val));
401 static inline uint32_t _ARMV7M_Get_control(
void)
404 __asm__ volatile (
"mrs %[val], control\n" : [val]
"=&r" (val));
408 static inline void _ARMV7M_Set_control(uint32_t val)
410 __asm__ volatile (
"msr control, %[val]\n" : : [val]
"r" (val));
413 static inline uint32_t _ARMV7M_Get_MSP(
void)
416 __asm__ volatile (
"mrs %[val], msp\n" : [val]
"=&r" (val));
420 static inline void _ARMV7M_Set_MSP(uint32_t val)
422 __asm__ volatile (
"msr msp, %[val]\n" : : [val]
"r" (val));
425 static inline uint32_t _ARMV7M_Get_PSP(
void)
428 __asm__ volatile (
"mrs %[val], psp\n" : [val]
"=&r" (val));
432 static inline void _ARMV7M_Set_PSP(uint32_t val)
434 __asm__ volatile (
"msr psp, %[val]\n" : : [val]
"r" (val));
437 static inline uint32_t _ARMV7M_Get_XPSR(
void)
440 __asm__ volatile (
"mrs %[val], xpsr\n" : [val]
"=&r" (val));
444 static inline bool _ARMV7M_NVIC_Is_enabled(
int irq )
446 int index = irq >> 5;
447 uint32_t bit = 1U << (irq & 0x1f);
449 return (_ARMV7M_NVIC->iser [index] & bit) != 0;
452 static inline void _ARMV7M_NVIC_Set_enable(
int irq )
454 int index = irq >> 5;
455 uint32_t bit = 1U << (irq & 0x1f);
457 _ARMV7M_NVIC->iser [index] = bit;
460 static inline void _ARMV7M_NVIC_Clear_enable(
int irq )
462 int index = irq >> 5;
463 uint32_t bit = 1U << (irq & 0x1f);
465 _ARMV7M_NVIC->icer [index] = bit;
468 static inline bool _ARMV7M_NVIC_Is_pending(
int irq )
470 int index = irq >> 5;
471 uint32_t bit = 1U << (irq & 0x1f);
473 return (_ARMV7M_NVIC->ispr [index] & bit) != 0;
476 static inline void _ARMV7M_NVIC_Set_pending(
int irq )
478 int index = irq >> 5;
479 uint32_t bit = 1U << (irq & 0x1f);
481 _ARMV7M_NVIC->ispr [index] = bit;
484 static inline void _ARMV7M_NVIC_Clear_pending(
int irq )
486 int index = irq >> 5;
487 uint32_t bit = 1U << (irq & 0x1f);
489 _ARMV7M_NVIC->icpr [index] = bit;
492 static inline bool _ARMV7M_NVIC_Is_active(
int irq )
494 int index = irq >> 5;
495 uint32_t bit = 1U << (irq & 0x1f);
497 return (_ARMV7M_NVIC->iabr [index] & bit) != 0;
500 static inline void _ARMV7M_NVIC_Set_priority(
int irq,
int priority )
502 _ARMV7M_NVIC->ipr [irq] = (uint8_t) priority;
505 static inline int _ARMV7M_NVIC_Get_priority(
int irq )
507 return _ARMV7M_NVIC->ipr [irq];
510 int _ARMV7M_Get_exception_priority(
int vector );
512 void _ARMV7M_Set_exception_priority(
int vector,
int priority );
514 ARMV7M_Exception_handler _ARMV7M_Get_exception_handler(
int index );
516 void _ARMV7M_Set_exception_handler(
518 ARMV7M_Exception_handler handler
524 void _ARMV7M_Set_exception_priority_and_handler(
527 ARMV7M_Exception_handler handler
530 void _ARMV7M_Exception_default(
void );
532 void _ARMV7M_Interrupt_service_enter(
void );
534 void _ARMV7M_Interrupt_service_leave(
void );
536 void _ARMV7M_Pendable_service_call(
void );
538 void _ARMV7M_Supervisor_call(
void );
register struct Per_CPU_Control *_SPARC_Per_CPU_current __asm__("g6")
The pointer to the current per-CPU control is available via register g6.