diff --git a/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.c b/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.c index f975d5aaf..a6fd43a4a 100644 --- a/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.c +++ b/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.c @@ -101,9 +101,18 @@ int show_cpu() return syscall(SYSCALL_SYS_STATE, SYS_STATE_SHOW_CPU_INFO, 0, 0, 0); } -int mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev) +uintptr_t mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev) { - return syscall(SYSCALL_MMAP, vaddr, paddr, (intptr_t)len, (intptr_t)is_dev); + uintptr_t vaddr_inner = vaddr, paddr_inner = paddr; + if (syscall(SYSCALL_MMAP, (intptr_t)&vaddr_inner, (intptr_t)&paddr_inner, (intptr_t)len, (intptr_t)is_dev) < 0) { + return (uintptr_t)NULL; + } + return vaddr_inner; +} + +int naive_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, bool is_dev) +{ + return syscall(SYSCALL_MMAP, (uintptr_t)vaddr, (intptr_t)paddr, (intptr_t)len, (intptr_t)is_dev); } int register_irq(int irq, int opcode) diff --git a/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.h b/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.h index ddb0cf0af..2ff0a2446 100644 --- a/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.h +++ b/Ubiquitous/XiZi_AIoT/services/lib/usyscall/usyscall.h @@ -44,6 +44,8 @@ typedef enum { SYS_STATE_SHOW_TASKS, SYS_STATE_SHOW_MEM_INFO, SYS_STATE_SHOW_CPU_INFO, + SYS_STATE_GET_CURRENT_TICK, + SYS_STATE_GET_CURRENT_SECOND, } sys_state_option; typedef enum { @@ -58,6 +60,8 @@ typedef union { uintptr_t memblock_end; } memblock_info; int priority; + uintptr_t current_tick; + uintptr_t current_second; } sys_state_info; typedef enum { @@ -85,7 +89,8 @@ int poll_session(struct Session* userland_session_arr, int arr_capacity); int close_session(struct Session* session); int register_irq(int irq, int opcode); -int mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev); +uintptr_t mmap(uintptr_t vaddr, uintptr_t paddr, int len, bool is_dev); +int naive_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, bool is_dev); int task_heap_base(); int get_memblock_info(sys_state_info* info); diff --git a/Ubiquitous/XiZi_AIoT/softkernel/include/syscall.h b/Ubiquitous/XiZi_AIoT/softkernel/include/syscall.h index 4e1ba2a7a..14e2ddc7e 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/include/syscall.h +++ b/Ubiquitous/XiZi_AIoT/softkernel/include/syscall.h @@ -64,6 +64,8 @@ typedef enum { SYS_STATE_SHOW_TASKS, SYS_STATE_SHOW_MEM_INFO, SYS_STATE_SHOW_CPU_INFO, + SYS_STATE_GET_CURRENT_TICK, + SYS_STATE_GET_CURRENT_SECOND, } sys_state_option; typedef enum { @@ -78,6 +80,8 @@ typedef union { uintptr_t memblock_end; } memblock_info; int priority; + uintptr_t current_tick; + uintptr_t current_second; } sys_state_info; typedef enum { @@ -102,7 +106,7 @@ int sys_close_session(struct Thread* task, struct Session* session); int sys_exec(char* img_start, char* name, char** argv); int sys_state(sys_state_option option, sys_state_info* info); -int sys_mmap(uintptr_t vaddr, uintptr_t paddr, int len, int is_dev); +int sys_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, int is_dev); int sys_register_irq(int irq_num, int irq_opcode); int sys_unbind_irq_all(struct Thread* task); diff --git a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_mmap.c b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_mmap.c index 1c94c1d5f..552e10263 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_mmap.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_mmap.c @@ -36,34 +36,36 @@ Modification: #include "syscall.h" #include "task.h" -int sys_mmap(uintptr_t vaddr, uintptr_t paddr, int len, int is_dev) +int sys_mmap(uintptr_t* vaddr, uintptr_t* paddr, int len, int is_dev) { struct Thread* cur_task = cur_cpu()->task; assert(cur_task != NULL); int true_len = ALIGNUP(len, PAGE_SIZE); - if (paddr != (uintptr_t)NULL) { - if (xizi_share_page_manager.task_map_pages(cur_task, vaddr, paddr, true_len / PAGE_SIZE, is_dev) == (uintptr_t)NULL) { + if (*paddr != (uintptr_t)NULL) { + if (xizi_share_page_manager.task_map_pages(cur_task, *vaddr, *paddr, true_len / PAGE_SIZE, is_dev) == (uintptr_t)NULL) { return -1; } } else { int load_len = 0; - uintptr_t load_vaddr = vaddr; + uintptr_t load_vaddr = *vaddr; while (load_len < true_len) { - char* paddr = raw_alloc(PAGE_SIZE); - if (paddr == NULL) { + char* new_paddr = raw_alloc(PAGE_SIZE); + if (new_paddr == NULL) { return -1; } - if (xizi_share_page_manager.task_map_pages(cur_task, load_vaddr, (uintptr_t)paddr, 1, false) == (uintptr_t)NULL) { - raw_free(paddr); + if (xizi_share_page_manager.task_map_pages(cur_task, load_vaddr, (uintptr_t)new_paddr, 1, false) == (uintptr_t)NULL) { + raw_free(new_paddr); return -1; } load_vaddr += PAGE_SIZE; load_len += PAGE_SIZE; + *paddr = (uintptr_t)new_paddr; } } cur_task->memspace->mem_size += true_len; - return vaddr + true_len; + *vaddr = *vaddr + true_len; + return 0; } \ No newline at end of file diff --git a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c index ddc3f5f69..67aea6b05 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/syscall/sys_state.c @@ -151,19 +151,39 @@ void show_cpu(void) int sys_state(sys_state_option option, sys_state_info* info) { - if (option == SYS_STATE_MEMBLOCK_INFO) { + switch (option) { + case SYS_STATE_MEMBLOCK_INFO: { info->memblock_info.memblock_start = (uintptr_t)V2P(_binary_fs_img_start); info->memblock_info.memblock_end = (uintptr_t)V2P(_binary_fs_img_end); - } else if (option == SYS_STATE_GET_HEAP_BASE) { + break; + } + case SYS_STATE_GET_HEAP_BASE: return cur_cpu()->task->memspace->heap_base; - } else if (option == SYS_STATE_SET_TASK_PRIORITY) { + case SYS_STATE_SET_TASK_PRIORITY: xizi_task_manager.set_cur_task_priority(info->priority); - } else if (option == SYS_STATE_SHOW_TASKS) { + break; + case SYS_STATE_SHOW_TASKS: show_tasks(); - } else if (option == SYS_STATE_SHOW_MEM_INFO) { + break; + case SYS_STATE_SHOW_MEM_INFO: show_mem(); - } else if (option == SYS_STATE_SHOW_CPU_INFO) { + break; + case SYS_STATE_SHOW_CPU_INFO: show_cpu(); + break; + case SYS_STATE_GET_CURRENT_TICK: { + extern void hw_current_tick(uintptr_t * tick); + hw_current_tick(&info->current_tick); + break; + } + case SYS_STATE_GET_CURRENT_SECOND: { + extern void hw_current_second(uintptr_t * tick); + hw_current_second(&info->current_second); + break; + } + case SYS_STATE_TEST: + default: + break; } return 0; diff --git a/Ubiquitous/XiZi_AIoT/softkernel/syscall/syscall.c b/Ubiquitous/XiZi_AIoT/softkernel/syscall/syscall.c index 4a15e6389..d3ae51f67 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/syscall/syscall.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/syscall/syscall.c @@ -69,7 +69,7 @@ int syscall(int sys_num, uintptr_t param1, uintptr_t param2, uintptr_t param3, u ret = sys_state(param1, (sys_state_info*)param2); break; case SYSCALL_MMAP: - ret = sys_mmap(param1, param2, (int)param3, (int)param4); + ret = sys_mmap((uintptr_t*)param1, (uintptr_t*)param2, (int)param3, (int)param4); break; case SYSCALL_REGISTER_IRQ: ret = sys_register_irq((int)param1, (int)param2); diff --git a/Ubiquitous/XiZi_AIoT/softkernel/trap/clock_irq_handler.c b/Ubiquitous/XiZi_AIoT/softkernel/trap/clock_irq_handler.c index 2fdbdf67f..eba875e07 100644 --- a/Ubiquitous/XiZi_AIoT/softkernel/trap/clock_irq_handler.c +++ b/Ubiquitous/XiZi_AIoT/softkernel/trap/clock_irq_handler.c @@ -44,6 +44,24 @@ bool clock_intr_handler_init(struct TraceTag* p_clock_driver_tag) return p_clock_driver != NULL; } +void hw_current_tick(uintptr_t* tick) +{ + if (p_clock_driver == NULL) { + *tick = 0; + return; + } + *tick = p_clock_driver->get_tick(); +} + +void hw_current_second(uintptr_t* second) +{ + if (p_clock_driver == NULL) { + *second = 0; + return; + } + *second = p_clock_driver->get_second(); +} + uint64_t global_tick = 0; int xizi_clock_handler(int irq, void* tf, void* arg) {