diff --git a/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/core.h b/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/core.h index 146367454..d52b8dafb 100644 --- a/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/core.h +++ b/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/core.h @@ -72,10 +72,11 @@ Modification: #include #include "cortex.h" +#include "asm/csr.h" + #define NR_CPU 1 // maximum number of CPUs -#define SSTATUS_SPP (1L << 8) // Previous mode, 1=Supervisor, 0=User __attribute__((always_inline)) static inline uint64_t EL0_mode() // Set ARM mode to EL0 { @@ -113,10 +114,14 @@ struct context { /// @brief init task context, set return address to trap return /// @param ctx extern void task_prepare_enter(void); -__attribute__((__always_inline__)) static inline void arch_init_context(struct context* ctx, unsigned long sp) +__attribute__((__always_inline__)) static inline void arch_init_context(struct context* ctx) { memset(ctx, 0, sizeof(*ctx)); ctx->ra = (uintptr_t)(task_prepare_enter); +} + +__attribute__((__always_inline__)) static inline void arch_context_set_sp(struct context* ctx, unsigned long sp) +{ ctx->sp = sp; } @@ -171,7 +176,7 @@ __attribute__((__always_inline__)) static inline void arch_init_trapframe(struct memset(tf, 0, sizeof(*tf)); tf->sp = sp; tf->epc = pc; - tf->status &= ~SSTATUS_SPP; // clear SPP to 0 for user mode + tf->status = SR_PIE; } /// @brief set pc and sp to trapframe @@ -218,6 +223,16 @@ __attribute__((__always_inline__)) static inline void arch_set_return(struct tra tf->a0 = (uint64_t)ret; } +// TODO: refer to jh7110 Linux +struct thread_info { + unsigned long flags; /* low level flags */ + int preempt_count; /* 0=>preemptible, <0=>BUG */ + long kernel_sp; /* Kernel stack pointer */ + long user_sp; /* User stack pointer */ + int cpu; +}; + + void cpu_start_secondary(uint8_t cpu_id); void start_smp_cache_broadcast(int cpu_id); #endif diff --git a/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/preboot_for_jh7110/boot.S b/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/preboot_for_jh7110/boot.S index 7936bc59f..089df000e 100644 --- a/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/preboot_for_jh7110/boot.S +++ b/Ubiquitous/XiZi_AIoT/hardkernel/arch/riscv/rv64gc/preboot_for_jh7110/boot.S @@ -44,6 +44,7 @@ clear_bss: blt a3, a4, clear_bss clear_bss_done: + li a0, 1 la a2, boot_cpu_hartid sd a0, (a2) @@ -58,10 +59,14 @@ clear_bss_done: call _debug_uart_init + /* Restore C environment */ + la tp, init_thread_info + sw zero, TASK_TI_CPU(tp) + la sp, init_thread_union + THREAD_SIZE + /* Start the kernel */ tail bootmain - relocate_enable_mmu: /* Relocate return address */ la a1, kernel_map diff --git a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_thread.c b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_thread.c index f98ed1c81..7560f8afa 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_thread.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_thread.c @@ -53,6 +53,10 @@ int sys_new_thread(struct MemSpace* pmemspace, struct Thread* task, uintptr_t en arch_trapframe_set_sp_pc(task->thread_context.trapframe, loaded_sp.user_sp, (uintptr_t)entry); arch_set_main_params(task->thread_context.trapframe, loaded_sp.argc, loaded_sp.user_sp); +#ifdef __riscv + arch_context_set_sp(task->thread_context.context, (uintptr_t)task->thread_context.trapframe); +#endif + // init thread name char* last = NULL; for (last = name; *name; name++) { diff --git a/Ubiquitous/XiZi_AIoT/softkernel/task/task.c b/Ubiquitous/XiZi_AIoT/softkernel/task/task.c index 4696a2c42..06354eb99 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/task/task.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/task/task.c @@ -207,6 +207,7 @@ static void _dealloc_task_cb(struct Thread* task) slab_free(&xizi_task_manager.task_allocator, (void*)task); } +#ifndef __riscv /* alloc a new task with init */ extern void trap_return(void); __attribute__((optimize("O0"))) void task_prepare_enter() @@ -215,6 +216,7 @@ __attribute__((optimize("O0"))) void task_prepare_enter() xizi_leave_kernel(); trap_return(); } +#endif static struct Thread* _new_task_cb(struct MemSpace* pmemspace) { @@ -251,7 +253,11 @@ static struct Thread* _new_task_cb(struct MemSpace* pmemspace) /* set context of main thread stack */ /// stack bottom memset((void*)task->thread_context.kern_stack_addr, 0x00, USER_STACK_SIZE); +#ifndef __riscv char* sp = (char*)task->thread_context.kern_stack_addr + USER_STACK_SIZE - 4; +#else + char* sp = (char*)task->thread_context.kern_stack_addr + USER_STACK_SIZE; +#endif /// 1. trap frame into stack, for process to nomally return by trap_return sp -= sizeof(*task->thread_context.trapframe); @@ -260,11 +266,7 @@ static struct Thread* _new_task_cb(struct MemSpace* pmemspace) /// 2. context into stack sp -= sizeof(*task->thread_context.context); task->thread_context.context = (struct context*)sp; -#ifndef __riscv arch_init_context(task->thread_context.context); -#else - arch_init_context(task->thread_context.context, task->thread_context.kern_stack_addr); -#endif return task; }