Zephyr Project API 4.1.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
arch.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2016 Cadence Design Systems, Inc.
3 * SPDX-License-Identifier: Apache-2.0
4 */
5
13#ifndef ZEPHYR_INCLUDE_ARCH_XTENSA_ARCH_H_
14#define ZEPHYR_INCLUDE_ARCH_XTENSA_ARCH_H_
15
16#include <zephyr/irq.h>
17
18#include <zephyr/devicetree.h>
19#if !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__)
20#include <zephyr/types.h>
21#include <zephyr/toolchain.h>
25#include <zephyr/sw_isr_table.h>
29#include <xtensa/config/core.h>
32#include <zephyr/debug/sparse.h>
34#include <zephyr/sys/slist.h>
35
37
38#ifdef CONFIG_XTENSA_MMU
40#endif
41
42#ifdef CONFIG_XTENSA_MPU
44#endif
45
59
60#ifdef __cplusplus
61extern "C" {
62#endif
63
64struct arch_mem_domain {
65#ifdef CONFIG_XTENSA_MMU
67 uint8_t asid;
68 bool dirty;
69
70 /* Following are used to program registers when changing page tables. */
71 uint32_t reg_asid;
72 uint32_t reg_ptevaddr;
73 uint32_t reg_ptepin_as;
74 uint32_t reg_ptepin_at;
75 uint32_t reg_vecpin_as;
76 uint32_t reg_vecpin_at;
77#endif
78#ifdef CONFIG_XTENSA_MPU
79 struct xtensa_mpu_map mpu_map;
80#endif
82};
83
85
93void xtensa_arch_except(int reason_p);
94
103void xtensa_arch_kernel_oops(int reason_p, void *ssf);
104
105#ifdef CONFIG_USERSPACE
106
107#define ARCH_EXCEPT(reason_p) do { \
108 if (k_is_user_context()) { \
109 arch_syscall_invoke1(reason_p, \
110 K_SYSCALL_XTENSA_USER_FAULT); \
111 } else { \
112 xtensa_arch_except(reason_p); \
113 } \
114 CODE_UNREACHABLE; \
115} while (false)
116
117#else
118
119#define ARCH_EXCEPT(reason_p) do { \
120 xtensa_arch_except(reason_p); \
121 CODE_UNREACHABLE; \
122 } while (false)
123
124#endif
125
126__syscall void xtensa_user_fault(unsigned int reason);
127
128#include <zephyr/syscalls/arch.h>
129
130/* internal routine documented in C file, needed by IRQ_CONNECT() macro */
131void z_irq_priority_set(uint32_t irq, uint32_t prio, uint32_t flags);
132
133#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
134 { \
135 Z_ISR_DECLARE(irq_p, flags_p, isr_p, isr_param_p); \
136 }
137
139static inline uint32_t arch_k_cycle_get_32(void)
140{
141 return sys_clock_cycle_get_32();
142}
143
145static inline uint64_t arch_k_cycle_get_64(void)
146{
147 return sys_clock_cycle_get_64();
148}
149
151static ALWAYS_INLINE void arch_nop(void)
152{
153 __asm__ volatile("nop");
154}
155
165{
166 int vecbase;
167
168 __asm__ volatile("rsr.vecbase %0" : "=r" (vecbase));
169 __asm__ volatile("wsr.vecbase %0; rsync" : : "r" (vecbase | 1));
170}
171
172#if defined(CONFIG_XTENSA_RPO_CACHE) || defined(__DOXYGEN__)
173#if defined(CONFIG_ARCH_HAS_COHERENCE) || defined(__DOXYGEN__)
175static inline bool arch_mem_coherent(void *ptr)
176{
177 size_t addr = (size_t) ptr;
178
179 return (addr >> 29) == CONFIG_XTENSA_UNCACHED_REGION;
180}
181#endif
182
183
184/* Utility to generate an unrolled and optimal[1] code sequence to set
185 * the RPO TLB registers (contra the HAL cacheattr macros, which
186 * generate larger code and can't be called from C), based on the
187 * KERNEL_COHERENCE configuration in use. Selects RPO attribute "2"
188 * for regions (including MMIO registers in region zero) which want to
189 * bypass L1, "4" for the cached region which wants writeback, and
190 * "15" (invalid) elsewhere.
191 *
192 * Note that on cores that have the "translation" option set, we need
193 * to put an identity mapping in the high bits. Also per spec
194 * changing the current code region (by definition cached) requires
195 * that WITLB be followed by an ISYNC and that both instructions live
196 * in the same cache line (two 3-byte instructions fit in an 8-byte
197 * aligned region, so that's guaranteed not to cross a cache line
198 * boundary).
199 *
200 * [1] With the sole exception of gcc's infuriating insistence on
201 * emitting a precomputed literal for addr + addrincr instead of
202 * computing it with a single ADD instruction from values it already
203 * has in registers. Explicitly assigning the variables to registers
204 * via an attribute works, but then emits needless MOV instructions
205 * instead. I tell myself it's just 32 bytes of .text, but... Sigh.
206 */
207#define _REGION_ATTR(r) \
208 ((r) == 0 ? 2 : \
209 ((r) == CONFIG_XTENSA_CACHED_REGION ? 4 : \
210 ((r) == CONFIG_XTENSA_UNCACHED_REGION ? 2 : 15)))
211
212#define _SET_ONE_TLB(region) do { \
213 uint32_t attr = _REGION_ATTR(region); \
214 if (XCHAL_HAVE_XLT_CACHEATTR) { \
215 attr |= addr; /* RPO with translation */ \
216 } \
217 if (region != CONFIG_XTENSA_CACHED_REGION) { \
218 __asm__ volatile("wdtlb %0, %1; witlb %0, %1" \
219 :: "r"(attr), "r"(addr)); \
220 } else { \
221 __asm__ volatile("wdtlb %0, %1" \
222 :: "r"(attr), "r"(addr)); \
223 __asm__ volatile("j 1f; .align 8; 1:"); \
224 __asm__ volatile("witlb %0, %1; isync" \
225 :: "r"(attr), "r"(addr)); \
226 } \
227 addr += addrincr; \
228} while (0)
229
233#define ARCH_XTENSA_SET_RPO_TLB() \
234 do { \
235 register uint32_t addr = 0, addrincr = 0x20000000; \
236 FOR_EACH(_SET_ONE_TLB, (;), 0, 1, 2, 3, 4, 5, 6, 7); \
237 } while (0)
238#endif /* CONFIG_XTENSA_RPO_CACHE */
239
240#if defined(CONFIG_XTENSA_MMU) || defined(__DOXYGEN__)
251void arch_xtensa_mmu_post_init(bool is_core0);
252#endif
253
254#ifdef __cplusplus
255}
256#endif
257
258#endif /* !defined(_ASMLANGUAGE) && !defined(__ASSEMBLER__) */
259
260#endif /* ZEPHYR_INCLUDE_ARCH_XTENSA_ARCH_H_ */
static ALWAYS_INLINE void arch_nop(void)
Definition arch.h:348
Xtensa specific syscall header.
Devicetree main header.
struct _snode sys_snode_t
Single-linked list node structure.
Definition slist.h:39
#define ALWAYS_INLINE
Definition common.h:161
Public interface for configuring interrupts.
uint64_t sys_clock_cycle_get_64(void)
uint32_t sys_clock_cycle_get_32(void)
static uint32_t arch_k_cycle_get_32(void)
Definition arch.h:99
static uint64_t arch_k_cycle_get_64(void)
Definition arch.h:106
flags
Definition parser.h:97
Size of off_t must be equal or less than size of size_t
Definition retained_mem.h:28
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
Definition arch.h:46
sys_snode_t node
Definition arch.h:50
pentry_t * ptables
Definition mmustructs.h:89
Struct to hold foreground MPU map and its entries.
Definition mpu.h:186
Software-managed ISR table.
Timer driver API.
Macros to abstract toolchain specific capabilities.
void xtensa_user_fault(unsigned int reason)
void xtensa_arch_kernel_oops(int reason_p, void *ssf)
Generate kernel oops.
void xtensa_arch_except(int reason_p)
Generate hardware exception.
static bool arch_mem_coherent(void *ptr)
Implementation of arch_mem_coherent.
Definition arch.h:175
void arch_xtensa_mmu_post_init(bool is_core0)
Perform additional steps after MMU initialization.
static ALWAYS_INLINE void xtensa_vecbase_lock(void)
Lock VECBASE if supported by hardware.
Definition arch.h:164
Xtensa public exception handling.