1 /* 2 * Copyright (c) 2014-2016 Wind River Systems, Inc. 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 /** 8 * @file 9 * @brief Private kernel definitions 10 * 11 * This file contains private kernel structures definitions and various 12 * other definitions for the ARCv2 processor architecture. 13 * 14 * This file is also included by assembly language files which must #define 15 * _ASMLANGUAGE before including this header file. Note that kernel 16 * assembly source files obtains structure offset values via "absolute 17 * symbols" in the offsets.o module. 18 */ 19 20 #ifndef ZEPHYR_ARCH_ARC_INCLUDE_KERNEL_ARCH_DATA_H_ 21 #define ZEPHYR_ARCH_ARC_INCLUDE_KERNEL_ARCH_DATA_H_ 22 23 #include <zephyr/toolchain.h> 24 #include <zephyr/linker/sections.h> 25 #include <zephyr/arch/cpu.h> 26 #include <vector_table.h> 27 28 #ifndef _ASMLANGUAGE 29 #include <zephyr/kernel.h> 30 #include <zephyr/types.h> 31 #include <zephyr/sys/util.h> 32 #include <zephyr/sys/dlist.h> 33 34 #ifdef __cplusplus 35 extern "C" { 36 #endif 37 38 #ifdef CONFIG_ARC_HAS_SECURE 39 struct _irq_stack_frame { 40 #ifdef CONFIG_ARC_HAS_ZOL 41 uintptr_t lp_end; 42 uintptr_t lp_start; 43 uintptr_t lp_count; 44 #endif /* CONFIG_ARC_HAS_ZOL */ 45 #ifdef CONFIG_CODE_DENSITY 46 /* 47 * Currently unsupported. This is where those registers are 48 * automatically pushed on the stack by the CPU when taking a regular 49 * IRQ. 50 */ 51 uintptr_t ei_base; 52 uintptr_t ldi_base; 53 uintptr_t jli_base; 54 #endif 55 uintptr_t r0; 56 uintptr_t r1; 57 uintptr_t r2; 58 uintptr_t r3; 59 uintptr_t r4; 60 uintptr_t r5; 61 uintptr_t r6; 62 uintptr_t r7; 63 uintptr_t r8; 64 uintptr_t r9; 65 uintptr_t r10; 66 uintptr_t r11; 67 uintptr_t r12; 68 uintptr_t r13; 69 uintptr_t blink; 70 uintptr_t pc; 71 uintptr_t sec_stat; 72 uintptr_t status32; 73 }; 74 #else 75 struct _irq_stack_frame { 76 uintptr_t r0; 77 uintptr_t r1; 78 uintptr_t r2; 79 uintptr_t r3; 80 uintptr_t r4; 81 uintptr_t r5; 82 uintptr_t r6; 83 uintptr_t r7; 84 uintptr_t r8; 85 uintptr_t r9; 86 uintptr_t r10; 87 uintptr_t r11; 88 uintptr_t r12; 89 uintptr_t r13; 90 uintptr_t blink; 91 #ifdef CONFIG_ARC_HAS_ZOL 92 uintptr_t lp_end; 93 uintptr_t lp_start; 94 uintptr_t lp_count; 95 #endif /* CONFIG_ARC_HAS_ZOL */ 96 #ifdef CONFIG_CODE_DENSITY 97 /* 98 * Currently unsupported. This is where those registers are 99 * automatically pushed on the stack by the CPU when taking a regular 100 * IRQ. 101 */ 102 uintptr_t ei_base; 103 uintptr_t ldi_base; 104 uintptr_t jli_base; 105 #endif 106 uintptr_t pc; 107 uintptr_t status32; 108 }; 109 #endif 110 111 typedef struct _irq_stack_frame _isf_t; 112 113 114 115 /* callee-saved registers pushed on the stack, not in k_thread */ 116 struct _callee_saved_stack { 117 uintptr_t r13; 118 uintptr_t r14; 119 uintptr_t r15; 120 uintptr_t r16; 121 uintptr_t r17; 122 uintptr_t r18; 123 uintptr_t r19; 124 uintptr_t r20; 125 uintptr_t r21; 126 uintptr_t r22; 127 uintptr_t r23; 128 uintptr_t r24; 129 uintptr_t r25; 130 uintptr_t r26; 131 uintptr_t fp; /* r27 */ 132 133 #ifdef CONFIG_USERSPACE 134 #ifdef CONFIG_ARC_HAS_SECURE 135 uintptr_t user_sp; 136 uintptr_t kernel_sp; 137 #else 138 uintptr_t user_sp; 139 #endif 140 #endif 141 /* r28 is the stack pointer and saved separately */ 142 /* r29 is ILINK and does not need to be saved */ 143 uintptr_t r30; 144 145 #ifdef CONFIG_ARC_HAS_ACCL_REGS 146 uintptr_t r58; 147 #ifndef CONFIG_64BIT 148 uintptr_t r59; 149 #endif /* !CONFIG_64BIT */ 150 #endif 151 152 #ifdef CONFIG_FPU_SHARING 153 uintptr_t fpu_status; 154 uintptr_t fpu_ctrl; 155 #ifdef CONFIG_FP_FPU_DA 156 uintptr_t dpfp2h; 157 uintptr_t dpfp2l; 158 uintptr_t dpfp1h; 159 uintptr_t dpfp1l; 160 #endif 161 #endif 162 163 #ifdef CONFIG_DSP_SHARING 164 #ifdef CONFIG_ARC_DSP_BFLY_SHARING 165 uintptr_t dsp_fft_ctrl; 166 uintptr_t dsp_bfly0; 167 #endif 168 uintptr_t acc0_ghi; 169 uintptr_t acc0_glo; 170 uintptr_t dsp_ctrl; 171 #endif 172 173 #ifdef CONFIG_ARC_AGU_SHARING 174 uintptr_t agu_ap0; 175 uintptr_t agu_ap1; 176 uintptr_t agu_ap2; 177 uintptr_t agu_ap3; 178 uintptr_t agu_os0; 179 uintptr_t agu_os1; 180 uintptr_t agu_mod0; 181 uintptr_t agu_mod1; 182 uintptr_t agu_mod2; 183 uintptr_t agu_mod3; 184 #ifdef CONFIG_ARC_AGU_MEDIUM 185 uintptr_t agu_ap4; 186 uintptr_t agu_ap5; 187 uintptr_t agu_ap6; 188 uintptr_t agu_ap7; 189 uintptr_t agu_os2; 190 uintptr_t agu_os3; 191 uintptr_t agu_mod4; 192 uintptr_t agu_mod5; 193 uintptr_t agu_mod6; 194 uintptr_t agu_mod7; 195 uintptr_t agu_mod8; 196 uintptr_t agu_mod9; 197 uintptr_t agu_mod10; 198 uintptr_t agu_mod11; 199 #endif 200 #ifdef CONFIG_ARC_AGU_LARGE 201 uintptr_t agu_ap8; 202 uintptr_t agu_ap9; 203 uintptr_t agu_ap10; 204 uintptr_t agu_ap11; 205 uintptr_t agu_os4; 206 uintptr_t agu_os5; 207 uintptr_t agu_os6; 208 uintptr_t agu_os7; 209 uintptr_t agu_mod12; 210 uintptr_t agu_mod13; 211 uintptr_t agu_mod14; 212 uintptr_t agu_mod15; 213 uintptr_t agu_mod16; 214 uintptr_t agu_mod17; 215 uintptr_t agu_mod18; 216 uintptr_t agu_mod19; 217 uintptr_t agu_mod20; 218 uintptr_t agu_mod21; 219 uintptr_t agu_mod22; 220 uintptr_t agu_mod23; 221 #endif 222 #endif 223 /* 224 * No need to save r31 (blink), it's either already pushed as the pc or 225 * blink on an irq stack frame. 226 */ 227 }; 228 229 typedef struct _callee_saved_stack _callee_saved_stack_t; 230 231 #ifdef __cplusplus 232 } 233 #endif 234 235 #endif /* _ASMLANGUAGE */ 236 237 #endif /* ZEPHYR_ARCH_ARC_INCLUDE_KERNEL_ARCH_DATA_H_ */ 238