Merge branch 'jh7110_debug' into prepare_for_master

This commit is contained in:
songyanguang
2025-01-24 17:52:12 +08:00
97 changed files with 5617 additions and 31 deletions
@@ -143,6 +143,10 @@ uintptr_t* load_memspace(struct MemSpace* pmemspace, char* img_start)
}
/* copy kernel pagetable so that interrupt and syscall wont corrupt */
memcpy(pmemspace->pgdir.pd_addr, kern_pgdir.pd_addr, TOPLEVLE_PAGEDIR_SIZE);
#ifdef __riscv
xizi_pager.new_pgdir(&pmemspace->pgdir_riscv);
memcpy(pmemspace->pgdir_riscv.pd_addr, kern_pgdir.pd_addr, TOPLEVLE_PAGEDIR_SIZE);
#endif
// read elf file by (header, section)
uintptr_t load_size = 0;
@@ -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;