Line data Source code
1 0 : /* 2 : * Copyright (c) 2020 Carlo Caione <ccaione@baylibre.com> 3 : * 4 : * SPDX-License-Identifier: Apache-2.0 5 : */ 6 : 7 : #ifndef ZEPHYR_INCLUDE_ARCH_ARM64_THREAD_STACK_H_ 8 : #define ZEPHYR_INCLUDE_ARCH_ARM64_THREAD_STACK_H_ 9 : 10 : #include <zephyr/arch/arm64/mm.h> 11 : 12 0 : #define ARCH_STACK_PTR_ALIGN 16 13 : 14 : #if defined(CONFIG_USERSPACE) || defined(CONFIG_ARM64_STACK_PROTECTION) 15 : #define Z_ARM64_STACK_BASE_ALIGN MEM_DOMAIN_ALIGN_AND_SIZE 16 : #define Z_ARM64_STACK_SIZE_ALIGN MEM_DOMAIN_ALIGN_AND_SIZE 17 : #else 18 : #define Z_ARM64_STACK_BASE_ALIGN ARCH_STACK_PTR_ALIGN 19 : #define Z_ARM64_STACK_SIZE_ALIGN ARCH_STACK_PTR_ALIGN 20 : #endif 21 : 22 : #if defined(CONFIG_ARM64_STACK_PROTECTION) 23 : #define Z_ARM64_STACK_GUARD_SIZE MEM_DOMAIN_ALIGN_AND_SIZE 24 : #define Z_ARM64_K_STACK_BASE_ALIGN MEM_DOMAIN_ALIGN_AND_SIZE 25 : #else 26 : #define Z_ARM64_STACK_GUARD_SIZE 0 27 : #define Z_ARM64_K_STACK_BASE_ALIGN ARCH_STACK_PTR_ALIGN 28 : #endif 29 : 30 : /* 31 : * [ see also comments in arch/arm64/core/thread.c ] 32 : * 33 : * High memory addresses 34 : * 35 : * +-------------------+ <- thread.stack_info.start + thread.stack_info.size 36 : * | TLS | 37 : * +-------------------+ <- initial sp (computable with thread.stack_info.delta) 38 : * | | 39 : * | Used stack | 40 : * | | 41 : * +...................+ <- thread's current stack pointer 42 : * | | 43 : * | Unused stack | 44 : * | | 45 : * +-------------------+ <- thread.stack_info.start 46 : * | Privileged stack | } K_(THREAD|KERNEL)_STACK_RESERVED 47 : * +-------------------+ <- thread stack limit (update on every context switch) 48 : * | Stack guard | } Z_ARM64_STACK_GUARD_SIZE (protected by MMU/MPU) 49 : * +-------------------+ <- thread.stack_obj 50 : * 51 : * Low Memory addresses 52 : */ 53 : 54 : /* thread stack */ 55 0 : #define ARCH_THREAD_STACK_OBJ_ALIGN(size) Z_ARM64_STACK_BASE_ALIGN 56 0 : #define ARCH_THREAD_STACK_SIZE_ADJUST(size) \ 57 : ROUND_UP((size), Z_ARM64_STACK_SIZE_ALIGN) 58 0 : #define ARCH_THREAD_STACK_RESERVED CONFIG_PRIVILEGED_STACK_SIZE + \ 59 : Z_ARM64_STACK_GUARD_SIZE 60 : 61 : /* kernel stack */ 62 0 : #define ARCH_KERNEL_STACK_RESERVED Z_ARM64_STACK_GUARD_SIZE 63 0 : #define ARCH_KERNEL_STACK_OBJ_ALIGN Z_ARM64_K_STACK_BASE_ALIGN 64 : 65 : #ifndef _ASMLANGUAGE 66 : 67 : struct z_arm64_thread_stack_header { 68 : char privilege_stack[CONFIG_PRIVILEGED_STACK_SIZE]; 69 : } __packed __aligned(Z_ARM64_STACK_BASE_ALIGN); 70 : 71 : #endif /* _ASMLANGUAGE */ 72 : 73 : #endif /* ZEPHYR_INCLUDE_ARCH_ARM64_THREAD_STACK_H_ */