Support naive_mmap; Support get_tick in sys_state.

This commit is contained in:
tuyuyang 2024-07-01 00:47:10 +08:00
parent 99899900a1
commit 247541173f
7 changed files with 78 additions and 20 deletions

View File

@ -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)

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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);

View File

@ -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)
{