Merge branch 'jh7110_debug' into prepare_for_master
This commit is contained in:
@@ -136,12 +136,14 @@ int _task_return_sys_resources(struct Thread* ptask)
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef __riscv
|
||||
extern void trap_return(void);
|
||||
__attribute__((optimize("O0"))) void task_prepare_enter()
|
||||
{
|
||||
xizi_leave_kernel();
|
||||
trap_return();
|
||||
}
|
||||
#endif
|
||||
|
||||
/// @brief this function changes task list without locking, so it must be called inside a lock critical area
|
||||
/// @param task
|
||||
@@ -250,7 +252,11 @@ static struct Thread* _new_thread(struct MemSpace* pmemspace)
|
||||
task->thread_context.task = task;
|
||||
memset((void*)task->thread_context.kern_stack_addr, 0x00, USER_STACK_SIZE);
|
||||
/// stack bottom
|
||||
#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
|
||||
/// trapframe (user context)
|
||||
@@ -365,8 +371,15 @@ static void central_trans_task_state()
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef __riscv
|
||||
uintptr_t riscv_kernel_satp = 0;
|
||||
#endif
|
||||
struct Thread* next_task_emergency = NULL;
|
||||
#ifndef __riscv
|
||||
extern void context_switch(struct context**, struct context*);
|
||||
#else
|
||||
extern void context_switch(struct context*, struct context*);
|
||||
#endif
|
||||
static void _scheduler(struct SchedulerRightGroup right_group)
|
||||
{
|
||||
struct MmuCommonDone* p_mmu_driver = AchieveResource(&right_group.mmu_driver_tag);
|
||||
@@ -396,8 +409,14 @@ static void _scheduler(struct SchedulerRightGroup right_group)
|
||||
// DEBUG_PRINTF("Thread %s(%d) to RUNNING\n", next_task->name, next_task->tid);
|
||||
task_state_set_running(next_task);
|
||||
cpu->task = next_task;
|
||||
|
||||
#ifdef __riscv
|
||||
riscv_kernel_satp = PFN_DOWN((uintptr_t)V2P(next_task->memspace->pgdir_riscv.pd_addr)) | SATP_MODE;
|
||||
#endif
|
||||
|
||||
assert(next_task->memspace->pgdir.pd_addr != NULL);
|
||||
p_mmu_driver->LoadPgdir((uintptr_t)V2P(next_task->memspace->pgdir.pd_addr));
|
||||
|
||||
context_switch(&cpu->scheduler, next_task->thread_context.context);
|
||||
central_trans_task_state();
|
||||
cpu->task = NULL;
|
||||
|
||||
Reference in New Issue
Block a user