Zephyr API Documentation 4.0.0
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
thread_stack.h
Go to the documentation of this file.
1/*
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
11
12#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#define ARCH_THREAD_STACK_OBJ_ALIGN(size) Z_ARM64_STACK_BASE_ALIGN
56#define ARCH_THREAD_STACK_SIZE_ADJUST(size) \
57 ROUND_UP((size), Z_ARM64_STACK_SIZE_ALIGN)
58#define ARCH_THREAD_STACK_RESERVED CONFIG_PRIVILEGED_STACK_SIZE + \
59 Z_ARM64_STACK_GUARD_SIZE
60
61/* kernel stack */
62#define ARCH_KERNEL_STACK_RESERVED Z_ARM64_STACK_GUARD_SIZE
63#define ARCH_KERNEL_STACK_OBJ_ALIGN Z_ARM64_K_STACK_BASE_ALIGN
64
65#ifndef _ASMLANGUAGE
66
67struct 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_ */