source: rtems/cpukit/score/cpu/arm/include/rtems/score/armv7m.h @ e47a3b7

Last change on this file since e47a3b7 was e47a3b7, checked in by Joel Sherrill <joel@…>, on 02/16/22 at 22:54:29

score/cpu/arm: Change license to BSD-2

Updates #3053.

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