Zephyr API Documentation 4.1.99
A Scalable Open Source RTOS
 4.1.99
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
arch.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2019-2020 Cobham Gaisler AB
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
16#ifndef ZEPHYR_INCLUDE_ARCH_SPARC_ARCH_H_
17#define ZEPHYR_INCLUDE_ARCH_SPARC_ARCH_H_
18
25
26#include <zephyr/irq.h>
27#include <zephyr/sw_isr_table.h>
28#include <soc.h>
29#include <zephyr/devicetree.h>
30
31/* stacks, for SPARC architecture stack shall be 8byte-aligned */
32#define ARCH_STACK_PTR_ALIGN 8
33
34/*
35 * Software trap numbers.
36 * Assembly usage: "ta SPARC_SW_TRAP_<TYPE>"
37 */
38#define SPARC_SW_TRAP_FLUSH_WINDOWS 0x03
39#define SPARC_SW_TRAP_SET_PIL 0x09
40#define SPARC_SW_TRAP_EXCEPT 0x0F
41
42#ifndef _ASMLANGUAGE
43#include <zephyr/sys/util.h>
44
45#ifdef __cplusplus
46extern "C" {
47#endif
48
49#define STACK_ROUND_UP(x) ROUND_UP(x, ARCH_STACK_PTR_ALIGN)
50
51/*
52 * SOC specific function to translate from processor interrupt request level
53 * (1..15) to logical interrupt source number. For example by probing the
54 * interrupt controller.
55 */
56int z_sparc_int_get_source(int irl);
57void z_irq_spurious(const void *unused);
58
59
60#define ARCH_IRQ_CONNECT(irq_p, priority_p, isr_p, isr_param_p, flags_p) \
61 { \
62 Z_ISR_DECLARE(irq_p, 0, isr_p, isr_param_p); \
63 }
64
65
66static ALWAYS_INLINE unsigned int z_sparc_set_pil_inline(unsigned int newpil)
67{
68 register uint32_t oldpil __asm__ ("o0") = newpil;
69
70 __asm__ volatile (
71 "ta %1\nnop\n" :
72 "=r" (oldpil) :
73 "i" (SPARC_SW_TRAP_SET_PIL), "r" (oldpil) :
74 "memory"
75 );
76 return oldpil;
77}
78
79static ALWAYS_INLINE unsigned int arch_irq_lock(void)
80{
81 return z_sparc_set_pil_inline(15);
82}
83
84static ALWAYS_INLINE void arch_irq_unlock(unsigned int key)
85{
86 z_sparc_set_pil_inline(key);
87}
88
89static ALWAYS_INLINE bool arch_irq_unlocked(unsigned int key)
90{
91 return key == 0;
92}
93
94static ALWAYS_INLINE void arch_nop(void)
95{
96 __asm__ volatile ("nop");
97}
98
100
101static inline uint32_t arch_k_cycle_get_32(void)
102{
103 return sys_clock_cycle_get_32();
104}
105
107
108static inline uint64_t arch_k_cycle_get_64(void)
109{
110 return sys_clock_cycle_get_64();
111}
112
113#define ARCH_EXCEPT(reason_p) \
114do { \
115 register uint32_t _g1 __asm__("g1") = reason_p; \
116 \
117 __asm__ volatile ( \
118 "ta %[vector]\n\t" \
119 : \
120 : [vector] "i" (SPARC_SW_TRAP_EXCEPT), "r" (_g1) \
121 : "memory" \
122 ); \
123 CODE_UNREACHABLE; \
124} while (false)
125
126#ifdef __cplusplus
127}
128#endif
129
130#endif /*_ASMLANGUAGE */
131
132#endif /* ZEPHYR_INCLUDE_ARCH_SPARC_ARCH_H_ */
static ALWAYS_INLINE void arch_nop(void)
Definition arch.h:348
Per-arch thread definition.
Devicetree main header.
#define ALWAYS_INLINE
Definition common.h:160
Public interface for configuring interrupts.
static ALWAYS_INLINE unsigned int arch_irq_lock(void)
Definition arch.h:72
static ALWAYS_INLINE void arch_irq_unlock(unsigned int key)
Definition arch.h:83
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:108
static uint64_t arch_k_cycle_get_64(void)
Definition arch.h:115
static ALWAYS_INLINE bool arch_irq_unlocked(unsigned int key)
Definition arch.h:96
#define SPARC_SW_TRAP_SET_PIL
Definition arch.h:39
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT64_TYPE__ uint64_t
Definition stdint.h:91
Software-managed ISR table.
Misc utilities.