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>
This commit is contained in:
Rick Tsao 2024-06-04 10:01:58 +08:00 committed by Carles Cufí
commit e9ff0dc35e

View file

@ -51,19 +51,19 @@ static struct k_spinlock lists_lock; /* kobj dlist */
static struct k_spinlock objfree_lock; /* k_object_free */ static struct k_spinlock objfree_lock; /* k_object_free */
#ifdef CONFIG_GEN_PRIV_STACKS #ifdef CONFIG_GEN_PRIV_STACKS
/* On ARM & ARC MPU we may have two different alignment requirement /* On ARM & ARC MPU & RISC-V PMP we may have two different alignment requirement
* when dynamically allocating thread stacks, one for the privileged * when dynamically allocating thread stacks, one for the privileged
* stack and other for the user stack, so we need to account the * stack and other for the user stack, so we need to account the
* worst alignment scenario and reserve space for that. * worst alignment scenario and reserve space for that.
*/ */
#if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU) #if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU) || defined(CONFIG_RISCV_PMP)
#define STACK_ELEMENT_DATA_SIZE(size) \ #define STACK_ELEMENT_DATA_SIZE(size) \
(sizeof(struct z_stack_data) + CONFIG_PRIVILEGED_STACK_SIZE + \ (sizeof(struct z_stack_data) + CONFIG_PRIVILEGED_STACK_SIZE + \
Z_THREAD_STACK_OBJ_ALIGN(size) + K_THREAD_STACK_LEN(size)) Z_THREAD_STACK_OBJ_ALIGN(size) + K_THREAD_STACK_LEN(size))
#else #else
#define STACK_ELEMENT_DATA_SIZE(size) (sizeof(struct z_stack_data) + \ #define STACK_ELEMENT_DATA_SIZE(size) (sizeof(struct z_stack_data) + \
K_THREAD_STACK_LEN(size)) K_THREAD_STACK_LEN(size))
#endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU */ #endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU || CONFIG_RISCV_PMP */
#else #else
#define STACK_ELEMENT_DATA_SIZE(size) K_THREAD_STACK_LEN(size) #define STACK_ELEMENT_DATA_SIZE(size) K_THREAD_STACK_LEN(size)
#endif /* CONFIG_GEN_PRIV_STACKS */ #endif /* CONFIG_GEN_PRIV_STACKS */
@ -150,13 +150,13 @@ uint8_t *z_priv_stack_find(k_thread_stack_t *stack)
#endif /* ARCH_DYNAMIC_OBJ_K_THREAD_ALIGNMENT */ #endif /* ARCH_DYNAMIC_OBJ_K_THREAD_ALIGNMENT */
#ifdef CONFIG_DYNAMIC_THREAD_STACK_SIZE #ifdef CONFIG_DYNAMIC_THREAD_STACK_SIZE
#ifndef CONFIG_MPU_STACK_GUARD #if defined(CONFIG_MPU_STACK_GUARD) || defined(CONFIG_PMP_STACK_GUARD)
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_PRIVILEGED_STACK_SIZE)
#else
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \ #define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_DYNAMIC_THREAD_STACK_SIZE) Z_THREAD_STACK_OBJ_ALIGN(CONFIG_DYNAMIC_THREAD_STACK_SIZE)
#endif /* !CONFIG_MPU_STACK_GUARD */ #else
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
Z_THREAD_STACK_OBJ_ALIGN(CONFIG_PRIVILEGED_STACK_SIZE)
#endif /* CONFIG_MPU_STACK_GUARD || CONFIG_PMP_STACK_GUARD */
#else #else
#define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \ #define DYN_OBJ_DATA_ALIGN_K_THREAD_STACK \
Z_THREAD_STACK_OBJ_ALIGN(ARCH_STACK_PTR_ALIGN) 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
stack_data->priv = (uint8_t *)dyn->data; stack_data->priv = (uint8_t *)dyn->data;
stack_data->size = adjusted_size; stack_data->size = adjusted_size;
dyn->kobj.data.stack_data = stack_data; dyn->kobj.data.stack_data = stack_data;
#if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU) #if defined(CONFIG_ARM_MPU) || defined(CONFIG_ARC_MPU) || defined(CONFIG_RISCV_PMP)
dyn->kobj.name = (void *)ROUND_UP( dyn->kobj.name = (void *)ROUND_UP(
((uint8_t *)dyn->data + CONFIG_PRIVILEGED_STACK_SIZE), ((uint8_t *)dyn->data + CONFIG_PRIVILEGED_STACK_SIZE),
Z_THREAD_STACK_OBJ_ALIGN(size)); Z_THREAD_STACK_OBJ_ALIGN(size));
#else #else
dyn->kobj.name = dyn->data; dyn->kobj.name = dyn->data;
#endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU */ #endif /* CONFIG_ARM_MPU || CONFIG_ARC_MPU || CONFIG_RISCV_PMP */
#else #else
dyn->kobj.name = dyn->data; dyn->kobj.name = dyn->data;
dyn->kobj.data.stack_size = adjusted_size; dyn->kobj.data.stack_size = adjusted_size;