Line data Source code
1 1 : /* 2 : * Copyright (c) 2017 Intel Corporation 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : /** 8 : * @file 9 : * @brief Per-arch thread definition 10 : * 11 : * This file contains definitions for 12 : * 13 : * struct _thread_arch 14 : * struct _callee_saved 15 : * 16 : * necessary to instantiate instances of struct k_thread. 17 : */ 18 : 19 : #ifndef ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_ 20 : #define ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_ 21 : 22 : #ifndef _ASMLANGUAGE 23 : #include <zephyr/types.h> 24 : 25 : struct _callee_saved { 26 : uint32_t v1; /* r4 */ 27 : uint32_t v2; /* r5 */ 28 : uint32_t v3; /* r6 */ 29 : uint32_t v4; /* r7 */ 30 : uint32_t v5; /* r8 */ 31 : uint32_t v6; /* r9 */ 32 : uint32_t v7; /* r10 */ 33 : uint32_t v8; /* r11 */ 34 : uint32_t psp; /* r13 */ 35 : #ifdef CONFIG_USE_SWITCH 36 : uint32_t lr; /* lr */ 37 : #endif 38 : }; 39 : 40 : typedef struct _callee_saved _callee_saved_t; 41 : 42 : #if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING) 43 : struct _preempt_float { 44 : float s16; 45 : float s17; 46 : float s18; 47 : float s19; 48 : float s20; 49 : float s21; 50 : float s22; 51 : float s23; 52 : float s24; 53 : float s25; 54 : float s26; 55 : float s27; 56 : float s28; 57 : float s29; 58 : float s30; 59 : float s31; 60 : }; 61 : #endif 62 : 63 : struct _thread_arch { 64 : 65 : /* interrupt locking key */ 66 : uint32_t basepri; 67 : 68 : /* r0 in stack frame cannot be written to reliably */ 69 : uint32_t swap_return_value; 70 : 71 : #if defined(CONFIG_FPU) && defined(CONFIG_FPU_SHARING) 72 : /* 73 : * No cooperative floating point register set structure exists for 74 : * the Cortex-M as it automatically saves the necessary registers 75 : * in its exception stack frame. 76 : */ 77 : struct _preempt_float preempt_float; 78 : #endif 79 : 80 : #if defined(CONFIG_CPU_AARCH32_CORTEX_A) || defined(CONFIG_CPU_AARCH32_CORTEX_R) 81 : int8_t exception_depth; 82 : #endif 83 : 84 : #if defined(CONFIG_ARM_STORE_EXC_RETURN) || defined(CONFIG_USERSPACE) 85 : /* 86 : * Status variable holding several thread status flags 87 : * as follows: 88 : * 89 : * byte 0 90 : * +-bits 4-7-----bit-3----------bit-2--------bit-1---+----bit-0------+ 91 : * : | | | | | 92 : * : reserved |<Guard FLOAT>| reserved | reserved | <priv mode> | 93 : * : bits | | | | CONTROL.nPRIV | 94 : * +------------------------------------------------------------------+ 95 : * 96 : * byte 1 97 : * +----------------------------bits 8-15-----------------------------+ 98 : * : Least significant byte of EXC_RETURN | 99 : * : bit 15| bit 14| bit 13 | bit 12| bit 11 | bit 10 | bit 9 | bit 8 | 100 : * : Res | S | DCRS | FType | Mode | SPSel | Res | ES | 101 : * +------------------------------------------------------------------+ 102 : * 103 : * Bit 0: thread's current privileged mode (Supervisor or User mode) 104 : * Mirrors CONTROL.nPRIV flag. 105 : * Bit 2: Deprecated in favor of FType. Note: FType = !CONTROL.FPCA. 106 : * indicating whether the thread has an active FP context. 107 : * Mirrors CONTROL.FPCA flag. 108 : * Bit 3: indicating whether the thread is applying the long (FLOAT) 109 : * or the default MPU stack guard size. 110 : * 111 : * Bits 8-15: Least significant octet of the EXC_RETURN value when a 112 : * thread is switched-out. The value is copied from LR when 113 : * entering the PendSV handler. When the thread is 114 : * switched in again, the value is restored to LR before 115 : * exiting the PendSV handler. 116 : */ 117 : union { 118 : uint32_t mode; 119 : 120 : #if defined(CONFIG_ARM_STORE_EXC_RETURN) 121 : struct { 122 : uint8_t mode_bits; 123 : uint8_t mode_exc_return; 124 : uint16_t mode_reserved2; 125 : }; 126 : #endif 127 : }; 128 : 129 : #if defined(CONFIG_USERSPACE) 130 : uint32_t priv_stack_start; 131 : #if defined(CONFIG_CPU_AARCH32_CORTEX_R) 132 : uint32_t priv_stack_end; 133 : uint32_t sp_usr; 134 : #endif 135 : #endif 136 : #endif 137 : }; 138 : 139 : #if defined(CONFIG_FPU_SHARING) && defined(CONFIG_MPU_STACK_GUARD) 140 : #define Z_ARM_MODE_MPU_GUARD_FLOAT_Msk (1 << 3) 141 : #endif 142 : typedef struct _thread_arch _thread_arch_t; 143 : 144 : #endif /* _ASMLANGUAGE */ 145 : 146 : #endif /* ZEPHYR_INCLUDE_ARCH_ARM_THREAD_H_ */