RTEMS 7.0-rc1
Loading...
Searching...
No Matches
armv7m.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-2-Clause */
2
12/*
13 * Copyright (c) 2011-2014 Sebastian Huber. All rights reserved.
14 *
15 * Redistribution and use in source and binary forms, with or without
16 * modification, are permitted provided that the following conditions
17 * are met:
18 * 1. Redistributions of source code must retain the above copyright
19 * notice, this list of conditions and the following disclaimer.
20 * 2. Redistributions in binary form must reproduce the above copyright
21 * notice, this list of conditions and the following disclaimer in the
22 * documentation and/or other materials provided with the distribution.
23 *
24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
28 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
31 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
32 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 * POSSIBILITY OF SUCH DAMAGE.
35 */
36
37#ifndef RTEMS_SCORE_ARMV7M_H
38#define RTEMS_SCORE_ARMV7M_H
39
40#include <rtems/score/cpu.h>
41#ifndef ASM
42#include <rtems/score/assert.h>
43#endif
44
45#ifdef __cplusplus
46extern "C" {
47#endif /* __cplusplus */
48
49#ifdef ARM_MULTILIB_ARCH_V7M
50
51/* Coprocessor Access Control Register, CPACR */
52#define ARMV7M_CPACR 0xe000ed88
53
54#ifndef ASM
55
56typedef struct {
57 uint32_t reserved_0;
58 uint32_t ictr;
59 uint32_t actlr;
60 uint32_t reserved_1;
61} ARMV7M_ICTAC;
62
63typedef void (*ARMV7M_Exception_handler)(void);
64
65typedef struct {
66 uint32_t register_r0;
67 uint32_t register_r1;
68 uint32_t register_r2;
69 uint32_t register_r3;
70 uint32_t register_r12;
71 void *register_lr;
72 void *register_pc;
73 uint32_t register_xpsr;
74#ifdef ARM_MULTILIB_VFP
75 uint32_t register_s0;
76 uint32_t register_s1;
77 uint32_t register_s2;
78 uint32_t register_s3;
79 uint32_t register_s4;
80 uint32_t register_s5;
81 uint32_t register_s6;
82 uint32_t register_s7;
83 uint32_t register_s8;
84 uint32_t register_s9;
85 uint32_t register_s10;
86 uint32_t register_s11;
87 uint32_t register_s12;
88 uint32_t register_s13;
89 uint32_t register_s14;
90 uint32_t register_s15;
91 uint32_t register_fpscr;
92 uint32_t reserved;
93#endif
94} ARMV7M_Exception_frame;
95
96typedef struct {
97 uint32_t comp;
98 uint32_t mask;
99 uint32_t function;
100 uint32_t reserved;
101} ARMV7M_DWT_comparator;
102
103typedef struct {
104#define ARMV7M_DWT_CTRL_NOCYCCNT (1U << 25)
105#define ARMV7M_DWT_CTRL_CYCCNTENA (1U << 0)
106 uint32_t ctrl;
107 uint32_t cyccnt;
108 uint32_t cpicnt;
109 uint32_t exccnt;
110 uint32_t sleepcnt;
111 uint32_t lsucnt;
112 uint32_t foldcnt;
113 uint32_t pcsr;
114 ARMV7M_DWT_comparator comparator[249];
115#define ARMV7M_DWT_LAR_UNLOCK_MAGIC 0xc5acce55U
116 uint32_t lar;
117 uint32_t lsr;
118} ARMV7M_DWT;
119
120typedef struct {
121 uint32_t cpuid;
122
123#define ARMV7M_SCB_ICSR_NMIPENDSET (1U << 31)
124#define ARMV7M_SCB_ICSR_PENDSVSET (1U << 28)
125#define ARMV7M_SCB_ICSR_PENDSVCLR (1U << 27)
126#define ARMV7M_SCB_ICSR_PENDSTSET (1U << 26)
127#define ARMV7M_SCB_ICSR_PENDSTCLR (1U << 25)
128#define ARMV7M_SCB_ICSR_ISRPREEMPT (1U << 23)
129#define ARMV7M_SCB_ICSR_ISRPENDING (1U << 22)
130#define ARMV7M_SCB_ICSR_VECTPENDING_GET(reg) (((reg) >> 12) & 0x1ffU)
131#define ARMV7M_SCB_ICSR_RETTOBASE (1U << 11)
132#define ARMV7M_SCB_ICSR_VECTACTIVE_GET(reg) ((reg) & 0x1ffU)
133 uint32_t icsr;
134
135 ARMV7M_Exception_handler *vtor;
136
137#define ARMV7M_SCB_AIRCR_VECTKEY (0x05fa << 16)
138#define ARMV7M_SCB_AIRCR_ENDIANESS (1U << 15)
139#define ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT 8
140#define ARMV7M_SCB_AIRCR_PRIGROUP_MASK \
141 ((0x7U) << ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT)
142#define ARMV7M_SCB_AIRCR_PRIGROUP(val) \
143 (((val) << ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT) & ARMV7M_SCB_AIRCR_PRIGROUP_MASK)
144#define ARMV7M_SCB_AIRCR_PRIGROUP_GET(reg) \
145 (((val) & ARMV7M_SCB_AIRCR_PRIGROUP_MASK) >> ARMV7M_SCB_AIRCR_PRIGROUP_SHIFT)
146#define ARMV7M_SCB_AIRCR_PRIGROUP_SET(reg, val) \
147 (((reg) & ~ARMV7M_SCB_AIRCR_PRIGROUP_MASK) | ARMV7M_SCB_AIRCR_PRIGROUP(val))
148#define ARMV7M_SCB_AIRCR_SYSRESETREQ (1U << 2)
149#define ARMV7M_SCB_AIRCR_VECTCLRACTIVE (1U << 1)
150#define ARMV7M_SCB_AIRCR_VECTRESET (1U << 0)
151 uint32_t aircr;
152
153 uint32_t scr;
154 uint32_t ccr;
155 uint8_t shpr [12];
156
157#define ARMV7M_SCB_SHCSR_USGFAULTENA (1U << 18)
158#define ARMV7M_SCB_SHCSR_BUSFAULTENA (1U << 17)
159#define ARMV7M_SCB_SHCSR_MEMFAULTENA (1U << 16)
160 uint32_t shcsr;
161
162#define ARMV7M_SCB_CFSR_MMFSR_MASK 0xff
163#define ARMV7M_SCB_CFSR_MMFSR_GET(n) (n & ARMV7M_SCB_CFSR_MMFSR_MASK)
164#define ARMV7M_SCB_CFSR_BFSR_MASK 0xff00
165#define ARMV7M_SCB_CFSR_BFSR_GET(n) (n & ARMV7M_SCB_CFSR_BFSR_MASK)
166#define ARMV7M_SCB_CFSR_UFSR_MASK 0xffff0000
167#define ARMV7M_SCB_CFSR_UFSR_GET(n) (n & ARMV7M_SCB_CFSR_UFSR_MASK)
168 uint32_t cfsr;
169
170#define ARMV7M_SCB_HFSR_VECTTBL_MASK 0x2
171#define ARMV7M_SCB_HFSR_FORCED_MASK (1U << 30)
172#define ARMV7M_SCB_HFSR_DEBUGEVT_MASK (1U << 31)
173 uint32_t hfsr;
174
175 uint32_t dfsr;
176 uint32_t mmfar;
177 uint32_t bfar;
178 uint32_t afsr;
179 uint32_t reserved_e000ed40[18];
180 uint32_t cpacr;
181 uint32_t reserved_e000ed8c[106];
182 uint32_t fpccr;
183 uint32_t fpcar;
184 uint32_t fpdscr;
185 uint32_t mvfr0;
186 uint32_t mvfr1;
187} ARMV7M_SCB;
188
189typedef struct {
190#define ARMV7M_SYSTICK_CSR_COUNTFLAG (1U << 16)
191#define ARMV7M_SYSTICK_CSR_CLKSOURCE (1U << 2)
192#define ARMV7M_SYSTICK_CSR_TICKINT (1U << 1)
193#define ARMV7M_SYSTICK_CSR_ENABLE (1U << 0)
194 uint32_t csr;
195
196 uint32_t rvr;
197 uint32_t cvr;
198
199#define ARMV7M_SYSTICK_CALIB_NOREF (1U << 31)
200#define ARMV7M_SYSTICK_CALIB_SKEW (1U << 30)
201#define ARMV7M_SYSTICK_CALIB_TENMS_GET(reg) ((reg) & 0xffffffU)
202 uint32_t calib;
203} ARMV7M_Systick;
204
205typedef struct {
206 uint32_t iser [16];
207 uint32_t reserved_0 [16];
208 uint32_t icer [16];
209 uint32_t reserved_1 [16];
210 uint32_t ispr [16];
211 uint32_t reserved_2 [16];
212 uint32_t icpr [16];
213 uint32_t reserved_3 [16];
214 uint32_t iabr [16];
215#if __ARM_ARCH >= 8
216 uint32_t reserved_4 [16];
217 uint32_t itns [16];
218 uint32_t reserved_5 [16];
219 uint8_t ipr [496];
220 uint32_t reserved_6 [580];
221#else /* __ARM_ARCH < 8 */
222 uint32_t reserved_4 [48];
223 uint8_t ipr [240];
224 uint32_t reserved_5 [644];
225#endif
226 uint32_t stir;
227} ARMV7M_NVIC;
228
229typedef struct {
230#define ARMV7M_MPU_TYPE_IREGION_GET(reg) (((reg) >> 16) & 0xffU)
231#define ARMV7M_MPU_TYPE_DREGION_GET(reg) (((reg) >> 8) & 0xffU)
232#define ARMV7M_MPU_TYPE_SEPARATE (1U << 0)
233 uint32_t type;
234
235#define ARMV7M_MPU_CTRL_PRIVDEFENA (1U << 2)
236#define ARMV7M_MPU_CTRL_HFNMIENA (1U << 1)
237#define ARMV7M_MPU_CTRL_ENABLE (1U << 0)
238 uint32_t ctrl;
239
240 uint32_t rnr;
241
242#define ARMV7M_MPU_RBAR_ADDR_SHIFT 5
243#define ARMV7M_MPU_RBAR_ADDR_MASK \
244 ((0x7ffffffU) << ARMV7M_MPU_RBAR_ADDR_SHIFT)
245#define ARMV7M_MPU_RBAR_ADDR(val) \
246 (((val) << ARMV7M_MPU_RBAR_ADDR_SHIFT) & ARMV7M_MPU_RBAR_ADDR_MASK)
247#define ARMV7M_MPU_RBAR_ADDR_GET(reg) \
248 (((val) & ARMV7M_MPU_RBAR_ADDR_MASK) >> ARMV7M_MPU_RBAR_ADDR_SHIFT)
249#define ARMV7M_MPU_RBAR_ADDR_SET(reg, val) \
250 (((reg) & ~ARMV7M_MPU_RBAR_ADDR_MASK) | ARMV7M_MPU_RBAR_ADDR(val))
251#define ARMV7M_MPU_RBAR_VALID (1U << 4)
252#define ARMV7M_MPU_RBAR_REGION_SHIFT 0
253#define ARMV7M_MPU_RBAR_REGION_MASK \
254 ((0xfU) << ARMV7M_MPU_RBAR_REGION_SHIFT)
255#define ARMV7M_MPU_RBAR_REGION(val) \
256 (((val) << ARMV7M_MPU_RBAR_REGION_SHIFT) & ARMV7M_MPU_RBAR_REGION_MASK)
257#define ARMV7M_MPU_RBAR_REGION_GET(reg) \
258 (((val) & ARMV7M_MPU_RBAR_REGION_MASK) >> ARMV7M_MPU_RBAR_REGION_SHIFT)
259#define ARMV7M_MPU_RBAR_REGION_SET(reg, val) \
260 (((reg) & ~ARMV7M_MPU_RBAR_REGION_MASK) | ARMV7M_MPU_RBAR_REGION(val))
261 uint32_t rbar;
262
263#define ARMV7M_MPU_RASR_XN (1U << 28)
264#define ARMV7M_MPU_RASR_AP_SHIFT 24
265#define ARMV7M_MPU_RASR_AP_MASK \
266 ((0x7U) << ARMV7M_MPU_RASR_AP_SHIFT)
267#define ARMV7M_MPU_RASR_AP(val) \
268 (((val) << ARMV7M_MPU_RASR_AP_SHIFT) & ARMV7M_MPU_RASR_AP_MASK)
269#define ARMV7M_MPU_RASR_AP_GET(reg) \
270 (((val) & ARMV7M_MPU_RASR_AP_MASK) >> ARMV7M_MPU_RASR_AP_SHIFT)
271#define ARMV7M_MPU_RASR_AP_SET(reg, val) \
272 (((reg) & ~ARMV7M_MPU_RASR_AP_MASK) | ARMV7M_MPU_RASR_AP(val))
273#define ARMV7M_MPU_RASR_TEX_SHIFT 19
274#define ARMV7M_MPU_RASR_TEX_MASK \
275 ((0x7U) << ARMV7M_MPU_RASR_TEX_SHIFT)
276#define ARMV7M_MPU_RASR_TEX(val) \
277 (((val) << ARMV7M_MPU_RASR_TEX_SHIFT) & ARMV7M_MPU_RASR_TEX_MASK)
278#define ARMV7M_MPU_RASR_TEX_GET(reg) \
279 (((val) & ARMV7M_MPU_RASR_TEX_MASK) >> ARMV7M_MPU_RASR_TEX_SHIFT)
280#define ARMV7M_MPU_RASR_TEX_SET(reg, val) \
281 (((reg) & ~ARMV7M_MPU_RASR_TEX_MASK) | ARMV7M_MPU_RASR_TEX(val))
282#define ARMV7M_MPU_RASR_S (1U << 18)
283#define ARMV7M_MPU_RASR_C (1U << 17)
284#define ARMV7M_MPU_RASR_B (1U << 16)
285#define ARMV7M_MPU_RASR_SRD_SHIFT 8
286#define ARMV7M_MPU_RASR_SRD_MASK \
287 ((0xffU) << ARMV7M_MPU_RASR_SRD_SHIFT)
288#define ARMV7M_MPU_RASR_SRD(val) \
289 (((val) << ARMV7M_MPU_RASR_SRD_SHIFT) & ARMV7M_MPU_RASR_SRD_MASK)
290#define ARMV7M_MPU_RASR_SRD_GET(reg) \
291 (((val) & ARMV7M_MPU_RASR_SRD_MASK) >> ARMV7M_MPU_RASR_SRD_SHIFT)
292#define ARMV7M_MPU_RASR_SRD_SET(reg, val) \
293 (((reg) & ~ARMV7M_MPU_RASR_SRD_MASK) | ARMV7M_MPU_RASR_SRD(val))
294#define ARMV7M_MPU_RASR_SIZE_SHIFT 1
295#define ARMV7M_MPU_RASR_SIZE_MASK \
296 ((0x1fU) << ARMV7M_MPU_RASR_SIZE_SHIFT)
297#define ARMV7M_MPU_RASR_SIZE(val) \
298 (((val) << ARMV7M_MPU_RASR_SIZE_SHIFT) & ARMV7M_MPU_RASR_SIZE_MASK)
299#define ARMV7M_MPU_RASR_SIZE_GET(reg) \
300 (((val) & ARMV7M_MPU_RASR_SIZE_MASK) >> ARMV7M_MPU_RASR_SIZE_SHIFT)
301#define ARMV7M_MPU_RASR_SIZE_SET(reg, val) \
302 (((reg) & ~ARMV7M_MPU_RASR_SIZE_MASK) | ARMV7M_MPU_RASR_SIZE(val))
303#define ARMV7M_MPU_RASR_ENABLE (1U << 0)
304 uint32_t rasr;
305
306 uint32_t rbar_a1;
307 uint32_t rasr_a1;
308 uint32_t rbar_a2;
309 uint32_t rasr_a2;
310 uint32_t rbar_a3;
311 uint32_t rasr_a3;
312} ARMV7M_MPU;
313
314typedef enum {
315 ARMV7M_MPU_AP_PRIV_NO_USER_NO,
316 ARMV7M_MPU_AP_PRIV_RW_USER_NO,
317 ARMV7M_MPU_AP_PRIV_RW_USER_RO,
318 ARMV7M_MPU_AP_PRIV_RW_USER_RW,
319 ARMV7M_MPU_AP_PRIV_RO_USER_NO = 0x5,
320 ARMV7M_MPU_AP_PRIV_RO_USER_RO,
321} ARMV7M_MPU_Access_permissions;
322
323typedef enum {
324 ARMV7M_MPU_ATTR_R = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RO_USER_NO)
325 | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_XN,
326 ARMV7M_MPU_ATTR_RW = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
327 | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_XN | ARMV7M_MPU_RASR_B,
328 ARMV7M_MPU_ATTR_RWX = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
329 | ARMV7M_MPU_RASR_C | ARMV7M_MPU_RASR_B,
330 ARMV7M_MPU_ATTR_X = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_NO_USER_NO)
331 | ARMV7M_MPU_RASR_C,
332 ARMV7M_MPU_ATTR_RX = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RO_USER_NO)
333 | ARMV7M_MPU_RASR_C,
334 ARMV7M_MPU_ATTR_IO = ARMV7M_MPU_RASR_AP(ARMV7M_MPU_AP_PRIV_RW_USER_NO)
335 | ARMV7M_MPU_RASR_XN,
336} ARMV7M_MPU_Attributes;
337
338typedef enum {
339 ARMV7M_MPU_SIZE_32_B = 0x4,
340 ARMV7M_MPU_SIZE_64_B,
341 ARMV7M_MPU_SIZE_128_B,
342 ARMV7M_MPU_SIZE_256_B,
343 ARMV7M_MPU_SIZE_512_B,
344 ARMV7M_MPU_SIZE_1_KB,
345 ARMV7M_MPU_SIZE_2_KB,
346 ARMV7M_MPU_SIZE_4_KB,
347 ARMV7M_MPU_SIZE_8_KB,
348 ARMV7M_MPU_SIZE_16_KB,
349 ARMV7M_MPU_SIZE_32_KB,
350 ARMV7M_MPU_SIZE_64_KB,
351 ARMV7M_MPU_SIZE_128_KB,
352 ARMV7M_MPU_SIZE_256_KB,
353 ARMV7M_MPU_SIZE_512_KB,
354 ARMV7M_MPU_SIZE_1_MB,
355 ARMV7M_MPU_SIZE_2_MB,
356 ARMV7M_MPU_SIZE_4_MB,
357 ARMV7M_MPU_SIZE_8_MB,
358 ARMV7M_MPU_SIZE_16_MB,
359 ARMV7M_MPU_SIZE_32_MB,
360 ARMV7M_MPU_SIZE_64_MB,
361 ARMV7M_MPU_SIZE_128_MB,
362 ARMV7M_MPU_SIZE_256_MB,
363 ARMV7M_MPU_SIZE_512_MB,
364 ARMV7M_MPU_SIZE_1_GB,
365 ARMV7M_MPU_SIZE_2_GB,
366 ARMV7M_MPU_SIZE_4_GB
367} ARMV7M_MPU_Size;
368
369typedef struct {
370 uint32_t rbar;
371 uint32_t rasr;
372} ARMV7M_MPU_Region;
373
374#define ARMV7M_MPU_REGION_INITIALIZER(idx, addr, size, attr) \
375 { \
376 ((addr) & ARMV7M_MPU_RBAR_ADDR_MASK) \
377 | ARMV7M_MPU_RBAR_VALID \
378 | ARMV7M_MPU_RBAR_REGION(idx), \
379 ARMV7M_MPU_RASR_SIZE(size) | (attr) | ARMV7M_MPU_RASR_ENABLE \
380 }
381
382#define ARMV7M_MPU_REGION_DISABLED_INITIALIZER(idx) \
383 { \
384 ARMV7M_MPU_RBAR_VALID | ARMV7M_MPU_RBAR_REGION(idx), \
385 0 \
386 }
387
400typedef struct {
401 const void *begin;
402 const void *end;
403 uint32_t rasr;
404} ARMV7M_MPU_Region_config;
405
406typedef struct {
407 uint32_t dhcsr;
408 uint32_t dcrsr;
409 uint32_t dcrdr;
410#define ARMV7M_DEBUG_DEMCR_VC_CORERESET (1U << 0)
411#define ARMV7M_DEBUG_DEMCR_VC_MMERR (1U << 4)
412#define ARMV7M_DEBUG_DEMCR_VC_NOCPERR (1U << 5)
413#define ARMV7M_DEBUG_DEMCR_VC_CHKERR (1U << 6)
414#define ARMV7M_DEBUG_DEMCR_VC_STATERR (1U << 7)
415#define ARMV7M_DEBUG_DEMCR_VC_BUSERR (1U << 8)
416#define ARMV7M_DEBUG_DEMCR_VC_INTERR (1U << 9)
417#define ARMV7M_DEBUG_DEMCR_VC_HARDERR (1U << 10)
418#define ARMV7M_DEBUG_DEMCR_MON_EN (1U << 16)
419#define ARMV7M_DEBUG_DEMCR_MON_PEND (1U << 17)
420#define ARMV7M_DEBUG_DEMCR_MON_STEP (1U << 18)
421#define ARMV7M_DEBUG_DEMCR_MON_REQ (1U << 19)
422#define ARMV7M_DEBUG_DEMCR_TRCENA (1U << 24)
423 uint32_t demcr;
424} ARMV7M_DEBUG;
425
426#define ARMV7M_DWT_BASE 0xe0001000
427#define ARMV7M_SCS_BASE 0xe000e000
428#define ARMV7M_ICTAC_BASE (ARMV7M_SCS_BASE + 0x0)
429#define ARMV7M_SYSTICK_BASE (ARMV7M_SCS_BASE + 0x10)
430#define ARMV7M_NVIC_BASE (ARMV7M_SCS_BASE + 0x100)
431#define ARMV7M_SCB_BASE (ARMV7M_SCS_BASE + 0xd00)
432#define ARMV7M_MPU_BASE (ARMV7M_SCS_BASE + 0xd90)
433#define ARMV7M_DEBUG_BASE (ARMV7M_SCS_BASE + 0xdf0)
434
435#define _ARMV7M_DWT \
436 ((volatile ARMV7M_DWT *) ARMV7M_DWT_BASE)
437#define _ARMV7M_ICTAC \
438 ((volatile ARMV7M_ICTAC *) ARMV7M_ICTAC_BASE)
439#define _ARMV7M_SCB \
440 ((volatile ARMV7M_SCB *) ARMV7M_SCB_BASE)
441#define _ARMV7M_Systick \
442 ((volatile ARMV7M_Systick *) ARMV7M_SYSTICK_BASE)
443#define _ARMV7M_NVIC \
444 ((volatile ARMV7M_NVIC *) ARMV7M_NVIC_BASE)
445#define _ARMV7M_MPU \
446 ((volatile ARMV7M_MPU *) ARMV7M_MPU_BASE)
447#define _ARMV7M_DEBUG \
448 ((volatile ARMV7M_DEBUG *) ARMV7M_DEBUG_BASE)
449
450#define ARMV7M_VECTOR_MSP 0
451#define ARMV7M_VECTOR_RESET 1
452#define ARMV7M_VECTOR_NMI 2
453#define ARMV7M_VECTOR_HARD_FAULT 3
454#define ARMV7M_VECTOR_MEM_MANAGE 4
455#define ARMV7M_VECTOR_BUS_FAULT 5
456#define ARMV7M_VECTOR_USAGE_FAULT 6
457#define ARMV7M_VECTOR_SVC 11
458#define ARMV7M_VECTOR_DEBUG_MONITOR 12
459#define ARMV7M_VECTOR_PENDSV 14
460#define ARMV7M_VECTOR_SYSTICK 15
461#define ARMV7M_VECTOR_IRQ(n) ((n) + 16)
462#define ARMV7M_IRQ_OF_VECTOR(n) ((n) - 16)
463
464#define ARMV7M_EXCEPTION_PRIORITY_LOWEST 255
465
466static inline bool _ARMV7M_Is_vector_an_irq( int vector )
467{
468 /* External (i.e. non-system) IRQs start after the SysTick vector. */
469 return vector > ARMV7M_VECTOR_SYSTICK;
470}
471
472static inline uint32_t _ARMV7M_Get_basepri(void)
473{
474 uint32_t val;
475 __asm__ volatile ("mrs %[val], basepri\n" : [val] "=&r" (val));
476 return val;
477}
478
479static inline void _ARMV7M_Set_basepri(uint32_t val)
480{
481 __asm__ volatile ("msr basepri, %[val]\n" : : [val] "r" (val));
482}
483
484static inline uint32_t _ARMV7M_Get_primask(void)
485{
486 uint32_t val;
487 __asm__ volatile ("mrs %[val], primask\n" : [val] "=&r" (val));
488 return val;
489}
490
491static inline void _ARMV7M_Set_primask(uint32_t val)
492{
493 __asm__ volatile ("msr primask, %[val]\n" : : [val] "r" (val));
494}
495
496static inline uint32_t _ARMV7M_Get_faultmask(void)
497{
498 uint32_t val;
499 __asm__ volatile ("mrs %[val], faultmask\n" : [val] "=&r" (val));
500 return val;
501}
502
503static inline void _ARMV7M_Set_faultmask(uint32_t val)
504{
505 __asm__ volatile ("msr faultmask, %[val]\n" : : [val] "r" (val));
506}
507
508static inline uint32_t _ARMV7M_Get_control(void)
509{
510 uint32_t val;
511 __asm__ volatile ("mrs %[val], control\n" : [val] "=&r" (val));
512 return val;
513}
514
515static inline void _ARMV7M_Set_control(uint32_t val)
516{
517 __asm__ volatile ("msr control, %[val]\n" : : [val] "r" (val));
518}
519
520static inline uint32_t _ARMV7M_Get_MSP(void)
521{
522 uint32_t val;
523 __asm__ volatile ("mrs %[val], msp\n" : [val] "=&r" (val));
524 return val;
525}
526
527static inline void _ARMV7M_Set_MSP(uint32_t val)
528{
529 __asm__ volatile ("msr msp, %[val]\n" : : [val] "r" (val));
530}
531
532static inline uint32_t _ARMV7M_Get_PSP(void)
533{
534 uint32_t val;
535 __asm__ volatile ("mrs %[val], psp\n" : [val] "=&r" (val));
536 return val;
537}
538
539static inline void _ARMV7M_Set_PSP(uint32_t val)
540{
541 __asm__ volatile ("msr psp, %[val]\n" : : [val] "r" (val));
542}
543
544static inline uint32_t _ARMV7M_Get_XPSR(void)
545{
546 uint32_t val;
547 __asm__ volatile ("mrs %[val], xpsr\n" : [val] "=&r" (val));
548 return val;
549}
550
551static inline bool _ARMV7M_NVIC_Is_enabled( int irq )
552{
553 int index = irq >> 5;
554 uint32_t bit = 1U << (irq & 0x1f);
555
556 return (_ARMV7M_NVIC->iser [index] & bit) != 0;
557}
558
559static inline void _ARMV7M_NVIC_Set_enable( int irq )
560{
561 int index = irq >> 5;
562 uint32_t bit = 1U << (irq & 0x1f);
563
564 _ARMV7M_NVIC->iser [index] = bit;
565}
566
567static inline void _ARMV7M_NVIC_Clear_enable( int irq )
568{
569 int index = irq >> 5;
570 uint32_t bit = 1U << (irq & 0x1f);
571
572 _ARMV7M_NVIC->icer [index] = bit;
573}
574
575static inline bool _ARMV7M_NVIC_Is_pending( int irq )
576{
577 int index = irq >> 5;
578 uint32_t bit = 1U << (irq & 0x1f);
579
580 return (_ARMV7M_NVIC->ispr [index] & bit) != 0;
581}
582
583static inline void _ARMV7M_NVIC_Set_pending( int irq )
584{
585 int index = irq >> 5;
586 uint32_t bit = 1U << (irq & 0x1f);
587
588 _ARMV7M_NVIC->ispr [index] = bit;
589}
590
591static inline void _ARMV7M_NVIC_Clear_pending( int irq )
592{
593 int index = irq >> 5;
594 uint32_t bit = 1U << (irq & 0x1f);
595
596 _ARMV7M_NVIC->icpr [index] = bit;
597}
598
599static inline bool _ARMV7M_NVIC_Is_active( int irq )
600{
601 int index = irq >> 5;
602 uint32_t bit = 1U << (irq & 0x1f);
603
604 return (_ARMV7M_NVIC->iabr [index] & bit) != 0;
605}
606
607static inline void _ARMV7M_NVIC_Set_priority( int irq, int priority )
608{
609 _ARMV7M_NVIC->ipr [irq] = (uint8_t) priority;
610}
611
612static inline int _ARMV7M_NVIC_Get_priority( int irq )
613{
614 return _ARMV7M_NVIC->ipr [irq];
615}
616
617static inline bool _ARMV7M_DWT_Enable_CYCCNT( void )
618{
619 uint32_t demcr;
620 uint32_t dwt_ctrl;
621
622 demcr = _ARMV7M_DEBUG->demcr;
623 _ARMV7M_DEBUG->demcr = demcr | ARMV7M_DEBUG_DEMCR_TRCENA;
624 _ARM_Data_synchronization_barrier();
625
626 dwt_ctrl = _ARMV7M_DWT->ctrl;
627 if ((dwt_ctrl & ARMV7M_DWT_CTRL_NOCYCCNT) == 0) {
628 _ARMV7M_DWT->lar = ARMV7M_DWT_LAR_UNLOCK_MAGIC;
629 _ARM_Data_synchronization_barrier();
630 _ARMV7M_DWT->ctrl = dwt_ctrl | ARMV7M_DWT_CTRL_CYCCNTENA;
631 return true;
632 } else {
633 _ARMV7M_DEBUG->demcr = demcr;
634 return false;
635 }
636}
637
638int _ARMV7M_Get_exception_priority( int vector );
639
640void _ARMV7M_Set_exception_priority( int vector, int priority );
641
642ARMV7M_Exception_handler _ARMV7M_Get_exception_handler( int index );
643
644void _ARMV7M_Set_exception_handler(
645 int index,
646 ARMV7M_Exception_handler handler
647);
648
652void _ARMV7M_Set_exception_priority_and_handler(
653 int index,
654 int priority,
655 ARMV7M_Exception_handler handler
656);
657
658void _ARMV7M_Exception_default( void );
659
660void _ARMV7M_Interrupt_service_enter( void );
661
662void _ARMV7M_Interrupt_service_leave( void );
663
664void _ARMV7M_Pendable_service_call( void );
665
666void _ARMV7M_Supervisor_call( void );
667
668void _ARMV7M_Clock_handler( void );
669
670static inline uint32_t _ARMV7M_MPU_Get_region_size(uintptr_t size)
671{
672 if ((size & (size - 1)) == 0) {
673 return ARMV7M_MPU_RASR_SIZE(30 - __builtin_clz(size));
674 } else {
675 return ARMV7M_MPU_RASR_SIZE(31 - __builtin_clz(size));
676 }
677}
678
679static inline void _ARMV7M_MPU_Set_region(
680 volatile ARMV7M_MPU *mpu,
681 uint32_t region,
682 uint32_t rasr,
683 const void *begin,
684 const void *end
685)
686{
687 uintptr_t size;
688 uint32_t rbar;
689
692 size = (uintptr_t) end - (uintptr_t) begin;
693
694 if ( (uintptr_t) end > (uintptr_t) begin ) {
695 rbar = (uintptr_t) begin | region | ARMV7M_MPU_RBAR_VALID;
696 rasr |= _ARMV7M_MPU_Get_region_size(size);
697 } else {
698 rbar = ARMV7M_MPU_RBAR_VALID | region;
699 rasr = 0;
700 }
701
702 mpu->rbar = rbar;
703 mpu->rasr = rasr;
704}
705
706static inline void _ARMV7M_MPU_Disable_region(
707 volatile ARMV7M_MPU *mpu,
708 uint32_t region
709)
710{
711 mpu->rbar = ARMV7M_MPU_RBAR_VALID | region;
712 mpu->rasr = 0;
713}
714
715static inline void _ARMV7M_MPU_Setup(
716 uint32_t ctrl,
717 const ARMV7M_MPU_Region_config *cfg,
718 size_t cfg_count
719)
720{
721 volatile ARMV7M_MPU *mpu;
722 volatile ARMV7M_SCB *scb;
723 uint32_t region_count;
724 uint32_t region;
725
726 mpu = _ARMV7M_MPU;
727 scb = _ARMV7M_SCB;
728
729 mpu->ctrl = 0;
730
731 _ARM_Data_synchronization_barrier();
732 _ARM_Instruction_synchronization_barrier();
733
734 region_count = ARMV7M_MPU_TYPE_DREGION_GET(mpu->type);
735
736 _Assert(cfg_count <= region_count);
737
738 for (region = 0; region < cfg_count; ++region) {
739 _ARMV7M_MPU_Set_region(
740 mpu,
741 region,
742 cfg[region].rasr,
743 cfg[region].begin,
744 cfg[region].end
745 );
746 }
747
748 for (region = cfg_count; region < region_count; ++region) {
749 _ARMV7M_MPU_Disable_region(mpu, region);
750 }
751
752 mpu->ctrl = ctrl;
753 scb->shcsr |= ARMV7M_SCB_SHCSR_MEMFAULTENA;
754
755 _ARM_Data_synchronization_barrier();
756 _ARM_Instruction_synchronization_barrier();
757}
758
759#endif /* ASM */
760
761#endif /* ARM_MULTILIB_ARCH_V7M */
762
763#ifdef __cplusplus
764}
765#endif /* __cplusplus */
766
767#endif /* RTEMS_SCORE_ARMV7M_H */
This header file provides the interfaces of the Assert Handler.
#define RTEMS_OBFUSCATE_VARIABLE(_var)
Obfuscates the variable so that the compiler cannot perform optimizations based on the variable value...
Definition: basedefs.h:715
#define _Assert(_e)
Assertion similar to assert() controlled via RTEMS_DEBUG instead of NDEBUG and static analysis runs.
Definition: assert.h:96