Skip to content

Commit e9ff0dc

Browse files
Rick Tsaocarlescufi
authored andcommitted
kernel: userspace: Fix dynamic thread stack allocation for RISC-V
RISC-V use the same logic for dynamic thread stacks allocation as ARM. This fixup reuses ARM code. Signed-off-by: Rick Tsao <rick592@andestech.com>
1 parent 8974c24 commit e9ff0dc

File tree

1 file changed

+9
-9
lines changed

1 file changed

+9
-9
lines changed

kernel/userspace.c

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,19 +51,19 @@ static struct k_spinlock lists_lock; /* kobj dlist */
5151
static struct k_spinlock objfree_lock; /* k_object_free */
5252

5353
#ifdef CONFIG_GEN_PRIV_STACKS
54-
/* On ARM & ARC MPU we may have two different alignment requirement
54+
/* On ARM & ARC MPU & RISC-V PMP we may have two different alignment requirement
5555
* when dynamically allocating thread stacks, one for the privileged
5656
* stack and other for the user stack, so we need to account the
5757
* worst alignment scenario and reserve space for that.
5858
*/
59-
#if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU)
59+
#if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU) || defined(CONFIG_RISCV_PMP)
6060
#define STACK_ELEMENT_DATA_SIZE(size) \
6161
(sizeof(struct z_stack_data) + CONFIG_PRIVILEGED_STACK_SIZE + \
6262
Z_THREAD_STACK_OBJ_ALIGN(size) + K_THREAD_STACK_LEN(size))
6363
#else
6464
#define STACK_ELEMENT_DATA_SIZE(size) (sizeof(struct z_stack_data) + \
6565
K_THREAD_STACK_LEN(size))
66-
#endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU */
66+
#endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU || CONFIG_RISCV_PMP */
6767
#else
6868
#define STACK_ELEMENT_DATA_SIZE(size) K_THREAD_STACK_LEN(size)
6969
#endif /* CONFIG_GEN_PRIV_STACKS */
@@ -150,13 +150,13 @@ uint8_t *z_priv_stack_find(k_thread_stack_t *stack)
150150
#endif /* ARCH_DYNAMIC_OBJ_K_THREAD_ALIGNMENT */
151151

152152
#ifdef CONFIG_DYNAMIC_THREAD_STACK_SIZE
153-
#ifndef CONFIG_MPU_STACK_GUARD
153+
#if defined(CONFIG_MPU_STACK_GUARD) || defined(CONFIG_PMP_STACK_GUARD)
154154
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
155-
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_PRIVILEGED_STACK_SIZE)
155+
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_DYNAMIC_THREAD_STACK_SIZE)
156156
#else
157157
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
158-
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_DYNAMIC_THREAD_STACK_SIZE)
159-
#endif /* !CONFIG_MPU_STACK_GUARD */
158+
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_PRIVILEGED_STACK_SIZE)
159+
#endif /* CONFIG_MPU_STACK_GUARD || CONFIG_PMP_STACK_GUARD */
160160
#else
161161
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
162162
Z_THREAD_STACK_OBJ_ALIGN(ARCH_STACK_PTR_ALIGN)
@@ -349,13 +349,13 @@ static struct k_object *dynamic_object_create(enum k_objects otype, size_t align
349349
stack_data->priv = (uint8_t *)dyn->data;
350350
stack_data->size = adjusted_size;
351351
dyn->kobj.data.stack_data = stack_data;
352-
#if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU)
352+
#if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU) || defined(CONFIG_RISCV_PMP)
353353
dyn->kobj.name = (void *)ROUND_UP(
354354
((uint8_t *)dyn->data + CONFIG_PRIVILEGED_STACK_SIZE),
355355
Z_THREAD_STACK_OBJ_ALIGN(size));
356356
#else
357357
dyn->kobj.name = dyn->data;
358-
#endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU */
358+
#endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU || CONFIG_RISCV_PMP */
359359
#else
360360
dyn->kobj.name = dyn->data;
361361
dyn->kobj.data.stack_size = adjusted_size;

0 commit comments

Comments
 (0)