Support smp. TODO: delete all inner kernel locks.
This commit is contained in:
@@ -66,18 +66,15 @@ Modification:
|
||||
/// @param path path to elf file
|
||||
/// @param argv arguments giving to main
|
||||
/// @return
|
||||
int task_exec(struct TaskMicroDescriptor* task, struct Session* session, int fd, ipc_read_fn ipc_read, char* name, char** argv)
|
||||
int task_exec(struct TaskMicroDescriptor* task, char* img_start, char* name, char** argv)
|
||||
{
|
||||
/* load img to task */
|
||||
/* 1. load elf header */
|
||||
struct elfhdr elf;
|
||||
memcpy((void*)&elf, img_start, sizeof(elf));
|
||||
// pgdir for new task
|
||||
struct TopLevelPageDirectory pgdir;
|
||||
pgdir.pd_addr = NULL;
|
||||
|
||||
if (ipc_read(session, fd, (char*)&elf, 0, sizeof(elf)) < sizeof(elf) || elf.magic != ELF_MAGIC) {
|
||||
ERROR("invalide elf file.\n");
|
||||
goto error_exec;
|
||||
}
|
||||
|
||||
// pgdir for new task
|
||||
if (UNLIKELY(!xizi_pager.new_pgdir(&pgdir))) {
|
||||
ERROR("create new pgdir failed.\n");
|
||||
goto error_exec;
|
||||
@@ -88,10 +85,8 @@ int task_exec(struct TaskMicroDescriptor* task, struct Session* session, int fd,
|
||||
uintptr_t load_size = 0;
|
||||
struct proghdr ph;
|
||||
for (int sec_idx = 0, off = elf.phoff; sec_idx < elf.phnum; sec_idx++, off += sizeof(ph)) {
|
||||
if (ipc_read(session, fd, (char*)&ph, off, sizeof(ph)) != sizeof(ph)) {
|
||||
ERROR("Read elf header failed\n");
|
||||
goto error_exec;
|
||||
}
|
||||
// load proghdr
|
||||
memcpy((char*)&ph, img_start + off, sizeof(ph));
|
||||
|
||||
if (ph.type != ELF_PROG_LOAD)
|
||||
continue;
|
||||
@@ -114,10 +109,7 @@ int task_exec(struct TaskMicroDescriptor* task, struct Session* session, int fd,
|
||||
panic("copy elf file to unmapped addr");
|
||||
}
|
||||
uintptr_t read_size = (ph.filesz - addr_offset < PAGE_SIZE ? ph.filesz - addr_offset : PAGE_SIZE);
|
||||
if (read_size != ipc_read(session, fd, P2V(page_paddr), ph.off + addr_offset, read_size)) {
|
||||
ERROR("read size error, off: %d, read len: %d\n", ph.off + addr_offset, read_size);
|
||||
goto error_exec;
|
||||
}
|
||||
memcpy(P2V(page_paddr), img_start + (ph.off + addr_offset), read_size);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -193,7 +185,7 @@ error_exec:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int sys_exec(struct KernReadTool* read_tool, char* name, char** argv)
|
||||
int sys_exec(char* img_start, char* name, char** argv)
|
||||
{
|
||||
/// @todo find a source of mmu_driver_tag instead of requiring from root
|
||||
static struct TraceTag mmu_driver_tag;
|
||||
@@ -204,12 +196,8 @@ int sys_exec(struct KernReadTool* read_tool, char* name, char** argv)
|
||||
}
|
||||
|
||||
struct MmuCommonDone* p_mmu_driver = AchieveResource(&mmu_driver_tag);
|
||||
|
||||
struct TaskMicroDescriptor* current_task = cur_cpu()->task;
|
||||
struct Session* session = read_tool->session;
|
||||
int fd = read_tool->fd;
|
||||
ipc_read_fn ipc_read = read_tool->ipc_read;
|
||||
int ret = task_exec(current_task, session, fd, ipc_read, name, argv);
|
||||
int ret = task_exec(current_task, img_start, name, argv);
|
||||
if (ret >= 0) {
|
||||
spinlock_init(¤t_task->lock, current_task->name);
|
||||
p_mmu_driver->LoadPgdir((uintptr_t)V2P(current_task->pgdir.pd_addr));
|
||||
|
||||
@@ -33,8 +33,8 @@ Modification:
|
||||
#include "syscall.h"
|
||||
#include "task.h"
|
||||
|
||||
extern int task_exec(struct TaskMicroDescriptor* task, struct Session* session, int fd, ipc_read_fn ipc_read, char* name, char** argv);
|
||||
int sys_spawn(struct KernReadTool* read_tool, char* name, char** argv)
|
||||
extern int task_exec(struct TaskMicroDescriptor* task, char* img_start, char* name, char** argv);
|
||||
int sys_spawn(char* img_start, char* name, char** argv)
|
||||
{
|
||||
// alloc a new pcb
|
||||
struct TaskMicroDescriptor* new_task_cb = xizi_task_manager.new_task_cb();
|
||||
@@ -44,11 +44,7 @@ int sys_spawn(struct KernReadTool* read_tool, char* name, char** argv)
|
||||
}
|
||||
// init trapframe
|
||||
arch_init_trapframe(new_task_cb->main_thread.trapframe, 0, 0);
|
||||
|
||||
struct Session* session = read_tool->session;
|
||||
int fd = read_tool->fd;
|
||||
ipc_read_fn ipc_read = read_tool->ipc_read;
|
||||
if (UNLIKELY(task_exec(new_task_cb, session, fd, ipc_read, name, argv)) < 0) {
|
||||
if (UNLIKELY(task_exec(new_task_cb, img_start, name, argv)) < 0) {
|
||||
xizi_task_manager.free_pcb(new_task_cb);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -55,8 +55,17 @@ static inline void _padding(char* name)
|
||||
void show_tasks(void)
|
||||
{
|
||||
struct TaskMicroDescriptor* task = NULL;
|
||||
DEBUG_PRINTF("******************************************************\n");
|
||||
DEBUG_PRINTF("STAT ID TASK PRI LEFT_TICKS\n");
|
||||
LOG_PRINTF("******************************************************\n");
|
||||
for (int i = 0; i < NR_CPU; i++) {
|
||||
LOG_PRINTF("CPU %d: ", i);
|
||||
if (global_cpus[i].task != NULL) {
|
||||
LOG_PRINTF("%s\n", global_cpus[i].task->name);
|
||||
} else {
|
||||
LOG_PRINTF("NULL\n");
|
||||
}
|
||||
}
|
||||
LOG_PRINTF("******************************************************\n");
|
||||
LOG_PRINTF("STAT ID TASK PRI LEFT_TICKS\n");
|
||||
for (int i = 0; i < TASK_MAX_PRIORITY; i++) {
|
||||
if (IS_DOUBLE_LIST_EMPTY(&xizi_task_manager.task_list_head[i])) {
|
||||
continue;
|
||||
@@ -64,19 +73,19 @@ void show_tasks(void)
|
||||
DOUBLE_LIST_FOR_EACH_ENTRY(task, &xizi_task_manager.task_list_head[i], node)
|
||||
{
|
||||
if (task->state == INIT)
|
||||
DEBUG_PRINTF(" INIT ");
|
||||
LOG_PRINTF(" INIT ");
|
||||
else if (task->state == READY)
|
||||
DEBUG_PRINTF(" READY ");
|
||||
LOG_PRINTF(" READY ");
|
||||
else if (task->state == RUNNING)
|
||||
DEBUG_PRINTF("RUNNING ");
|
||||
LOG_PRINTF("RUNNING ");
|
||||
else if (task->state == DEAD)
|
||||
DEBUG_PRINTF(" DEAD ");
|
||||
LOG_PRINTF(" DEAD ");
|
||||
|
||||
_padding(task->name);
|
||||
DEBUG_PRINTF(" %d %s %d %d\n", task->pid, task->name, task->priority, task->remain_tick);
|
||||
LOG_PRINTF(" %d %s %d %d\n", task->pid, task->name, task->priority, task->remain_tick);
|
||||
}
|
||||
}
|
||||
DEBUG_PRINTF("******************************************************\n");
|
||||
LOG_PRINTF("******************************************************\n");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -85,8 +94,8 @@ extern struct KBuddy kern_virtmem_buddy;
|
||||
extern uint32_t kernel_data_end[];
|
||||
void show_mem(void)
|
||||
{
|
||||
DEBUG_PRINTF("*********************************************************\n");
|
||||
DEBUG_PRINTF(" TOTAL(KB) USED(KB) FREE(KB) \n");
|
||||
LOG_PRINTF("*********************************************************\n");
|
||||
LOG_PRINTF(" TOTAL(KB) USED(KB) FREE(KB) \n");
|
||||
|
||||
uint32_t total = (PHY_MEM_STOP - V2P(kernel_data_end)) >> 10;
|
||||
uint32_t used = 0;
|
||||
@@ -96,14 +105,14 @@ void show_mem(void)
|
||||
}
|
||||
used = used >> 10;
|
||||
|
||||
DEBUG_PRINTF(" %d %d %d\n", total, total - used, used);
|
||||
DEBUG_PRINTF("*********************************************************\n");
|
||||
LOG_PRINTF(" %d %d %d\n", total, total - used, used);
|
||||
LOG_PRINTF("*********************************************************\n");
|
||||
return;
|
||||
}
|
||||
|
||||
void show_cpu(void)
|
||||
{
|
||||
DEBUG_PRINTF("**********************************************************\n");
|
||||
LOG_PRINTF("**********************************************************\n");
|
||||
#ifdef ARCH_SMP
|
||||
/// @todo support smp
|
||||
KPrintf(" cpu VALUE \n");
|
||||
@@ -116,10 +125,10 @@ void show_cpu(void)
|
||||
|
||||
_padding(current_task->name);
|
||||
|
||||
DEBUG_PRINTF(" ID COMMAND USED_TICKS FREE_TICKS \n");
|
||||
DEBUG_PRINTF(" %d %s %d %d\n", cpu_id, current_task->name, TASK_CLOCK_TICK - current_task->remain_tick, current_task->remain_tick);
|
||||
LOG_PRINTF(" ID COMMAND USED_TICKS FREE_TICKS \n");
|
||||
LOG_PRINTF(" %d %s %d %d\n", cpu_id, current_task->name, TASK_CLOCK_TICK - current_task->remain_tick, current_task->remain_tick);
|
||||
|
||||
DEBUG_PRINTF("***********************************************************\n");
|
||||
LOG_PRINTF("***********************************************************\n");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, u
|
||||
ret = 0;
|
||||
break;
|
||||
case SYSCALL_SPAWN:
|
||||
ret = sys_spawn((struct KernReadTool*)param1, (char*)param2, (char**)param3);
|
||||
ret = sys_spawn((char*)param1, (char*)param2, (char**)param3);
|
||||
break;
|
||||
case SYSCALL_EXIT:
|
||||
ret = sys_exit();
|
||||
@@ -62,7 +62,7 @@ int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, u
|
||||
ret = sys_close_session((struct Session*)param1);
|
||||
break;
|
||||
case SYSCALL_EXEC:
|
||||
ret = sys_exec((struct KernReadTool*)param1, (char*)param2, (char**)param3);
|
||||
ret = sys_exec((char*)param1, (char*)param2, (char**)param3);
|
||||
break;
|
||||
case SYSCALL_SYS_STATE:
|
||||
ret = sys_state(param1, (sys_state_info*)param2);
|
||||
|
||||
Reference in New Issue
Block a user