From 99e9092b23a07deb4e9191a6a8fe17ff080aa7f9 Mon Sep 17 00:00:00 2001 From: Yanyan Shen Date: Tue, 6 Aug 2019 16:52:44 +1000 Subject: [PATCH] riscv: Set up the idle threads' per-core stacks Use per-core stacks for idle thread stacks. --- src/arch/riscv/kernel/thread.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/arch/riscv/kernel/thread.c b/src/arch/riscv/kernel/thread.c index 1564ecf7a..01fb85897 100644 --- a/src/arch/riscv/kernel/thread.c +++ b/src/arch/riscv/kernel/thread.c @@ -16,6 +16,7 @@ * Copyright 2015, 2016 Hesham Almatary */ +#include #include #include #include @@ -36,7 +37,16 @@ BOOT_CODE void Arch_configureIdleThread(tcb_t *tcb) /* Enable interrupts and keep working in supervisor mode */ setRegister(tcb, SSTATUS, (word_t) SSTATUS_SPP | SSTATUS_SPIE); +#ifdef ENABLE_SMP_SUPPORT + for (int i = 0; i < CONFIG_MAX_NUM_NODES; i++) { + if (NODE_STATE_ON_CORE(ksIdleThread, i) == tcb) { + setRegister(tcb, SP, (word_t)kernel_stack_alloc + (i + 1) * BIT(CONFIG_KERNEL_STACK_BITS)); + break; + } + } +#else setRegister(tcb, SP, (word_t)kernel_stack_alloc + BIT(CONFIG_KERNEL_STACK_BITS)); +#endif } void Arch_switchToIdleThread(void)