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 1 : #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_ */
|