Modify context and trapframe init
This commit is contained in:
parent
ee49e0d71c
commit
1631e60baa
|
@ -72,10 +72,11 @@ Modification:
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "cortex.h"
|
#include "cortex.h"
|
||||||
|
#include "asm/csr.h"
|
||||||
|
|
||||||
|
|
||||||
#define NR_CPU 1 // maximum number of CPUs
|
#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
|
__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
|
/// @brief init task context, set return address to trap return
|
||||||
/// @param ctx
|
/// @param ctx
|
||||||
extern void task_prepare_enter(void);
|
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));
|
memset(ctx, 0, sizeof(*ctx));
|
||||||
ctx->ra = (uintptr_t)(task_prepare_enter);
|
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;
|
ctx->sp = sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,7 +176,7 @@ __attribute__((__always_inline__)) static inline void arch_init_trapframe(struct
|
||||||
memset(tf, 0, sizeof(*tf));
|
memset(tf, 0, sizeof(*tf));
|
||||||
tf->sp = sp;
|
tf->sp = sp;
|
||||||
tf->epc = pc;
|
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
|
/// @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;
|
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 cpu_start_secondary(uint8_t cpu_id);
|
||||||
void start_smp_cache_broadcast(int cpu_id);
|
void start_smp_cache_broadcast(int cpu_id);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -44,6 +44,7 @@ clear_bss:
|
||||||
blt a3, a4, clear_bss
|
blt a3, a4, clear_bss
|
||||||
clear_bss_done:
|
clear_bss_done:
|
||||||
|
|
||||||
|
li a0, 1
|
||||||
la a2, boot_cpu_hartid
|
la a2, boot_cpu_hartid
|
||||||
sd a0, (a2)
|
sd a0, (a2)
|
||||||
|
|
||||||
|
@ -58,10 +59,14 @@ clear_bss_done:
|
||||||
|
|
||||||
call _debug_uart_init
|
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 */
|
/* Start the kernel */
|
||||||
tail bootmain
|
tail bootmain
|
||||||
|
|
||||||
|
|
||||||
relocate_enable_mmu:
|
relocate_enable_mmu:
|
||||||
/* Relocate return address */
|
/* Relocate return address */
|
||||||
la a1, kernel_map
|
la a1, kernel_map
|
||||||
|
|
|
@ -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_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);
|
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
|
// init thread name
|
||||||
char* last = NULL;
|
char* last = NULL;
|
||||||
for (last = name; *name; name++) {
|
for (last = name; *name; name++) {
|
||||||
|
|
|
@ -207,6 +207,7 @@ static void _dealloc_task_cb(struct Thread* task)
|
||||||
slab_free(&xizi_task_manager.task_allocator, (void*)task);
|
slab_free(&xizi_task_manager.task_allocator, (void*)task);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef __riscv
|
||||||
/* alloc a new task with init */
|
/* alloc a new task with init */
|
||||||
extern void trap_return(void);
|
extern void trap_return(void);
|
||||||
__attribute__((optimize("O0"))) void task_prepare_enter()
|
__attribute__((optimize("O0"))) void task_prepare_enter()
|
||||||
|
@ -215,6 +216,7 @@ __attribute__((optimize("O0"))) void task_prepare_enter()
|
||||||
xizi_leave_kernel();
|
xizi_leave_kernel();
|
||||||
trap_return();
|
trap_return();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct Thread* _new_task_cb(struct MemSpace* pmemspace)
|
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 */
|
/* set context of main thread stack */
|
||||||
/// stack bottom
|
/// stack bottom
|
||||||
memset((void*)task->thread_context.kern_stack_addr, 0x00, USER_STACK_SIZE);
|
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;
|
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
|
/// 1. trap frame into stack, for process to nomally return by trap_return
|
||||||
sp -= sizeof(*task->thread_context.trapframe);
|
sp -= sizeof(*task->thread_context.trapframe);
|
||||||
|
@ -260,11 +266,7 @@ static struct Thread* _new_task_cb(struct MemSpace* pmemspace)
|
||||||
/// 2. context into stack
|
/// 2. context into stack
|
||||||
sp -= sizeof(*task->thread_context.context);
|
sp -= sizeof(*task->thread_context.context);
|
||||||
task->thread_context.context = (struct context*)sp;
|
task->thread_context.context = (struct context*)sp;
|
||||||
#ifndef __riscv
|
|
||||||
arch_init_context(task->thread_context.context);
|
arch_init_context(task->thread_context.context);
|
||||||
#else
|
|
||||||
arch_init_context(task->thread_context.context, task->thread_context.kern_stack_addr);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return task;
|
return task;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue