From 321f18d77cf855080c52987834d54799ad5438cd Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.comwq> Date: Wed, 10 Apr 2024 15:35:35 +0800 Subject: [PATCH] =?UTF-8?q?cpiofs=E8=83=BD=E5=A4=9F=E6=AD=A3=E5=B8=B8?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/launch.json | 6 +- .vscode/settings.json | 3 +- mkrtos_configs/aarch64_qemu_defconfig | 2 + mkrtos_knl/Kconfig | 8 +- mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h | 1 + mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S | 8 +- mkrtos_knl/inc/knl/globals.h | 3 +- mkrtos_knl/inc/knl/prot.h | 6 +- mkrtos_knl/inc/knl/thread.h | 4 +- mkrtos_knl/knl/mm/vma.c | 256 ++++++----------- mkrtos_knl/knl/sys.c | 67 +++-- mkrtos_knl/knl/thread_knl.c | 4 +- mkrtos_script/build_qemu_aarch64.sh | 8 +- .../lib/libc_backend/inc/syscall_backend.h | 5 + .../src/aarch64/syscall_backend.c | 4 + mkrtos_user/lib/libc_backend/src/fs_backend.c | 259 ++++++++---------- .../lib/libc_backend/src/futex_backend.c | 4 +- .../lib/libc_backend/src/misc_backend.c | 2 +- mkrtos_user/lib/sys/inc/u_prot.h | 6 +- mkrtos_user/lib/sys/inc/u_sys.h | 8 +- mkrtos_user/lib/sys/inc/u_thread.h | 6 +- mkrtos_user/lib/sys/src/u_sys.c | 4 +- mkrtos_user/lib/sys_util/src/u_app_loader.c | 2 +- mkrtos_user/lib/sys_util/src/u_elf_loader.c | 2 +- mkrtos_user/server/fs/cpiofs/fs_rpc.c | 128 ++++----- mkrtos_user/server/init/src/parse_cfg.c | 2 +- 26 files changed, 351 insertions(+), 457 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 51bf7fef4..9d676ec3d 100755 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -46,9 +46,9 @@ "environment": [], "externalConsole": false, // "miDebuggerPath": "/opt/homebrew/bin/arm-none-eabi-gdb", - "miDebuggerPath": "/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gdb", - // "miDebuggerPath": "/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb", - "miDebuggerServerAddress": "127.0.0.1:3333", + // "miDebuggerPath": "/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/aarch64-none-elf-gdb", + "miDebuggerPath": "/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/aarch64-none-elf-gdb", + "miDebuggerServerAddress": "127.0.0.1:33333", "MIMode": "gdb", "setupCommands": [ { diff --git a/.vscode/settings.json b/.vscode/settings.json index 47a36cbdc..c4a542192 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -67,7 +67,8 @@ "sche_arch.h": "c", "irq_sender.h": "c", "timer.h": "c", - "arm_local_reg.h": "c" + "arm_local_reg.h": "c", + "thread_task_arch.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/mkrtos_configs/aarch64_qemu_defconfig b/mkrtos_configs/aarch64_qemu_defconfig index 721fa0276..7a2a00410 100644 --- a/mkrtos_configs/aarch64_qemu_defconfig +++ b/mkrtos_configs/aarch64_qemu_defconfig @@ -120,5 +120,7 @@ CONFIG_MMU=y CONFIG_KNL_TEST=n CONFIG_ELF_LAUNCH=y CONFIG_THREAD_MSG_BUG_LEN=4096 +CONFIG_THREAD_IPC_MSG_LEN=1024 +CONFIG_THREAD_MAP_BUF_LEN=256 CONFIG_MSG_BUF_VADDR=0xE0000000 CONFIG_BOOT_FS_VADDR=0xE0001000 diff --git a/mkrtos_knl/Kconfig b/mkrtos_knl/Kconfig index e7814841a..43092199c 100644 --- a/mkrtos_knl/Kconfig +++ b/mkrtos_knl/Kconfig @@ -32,8 +32,14 @@ if SMP default 1 endif config THREAD_MSG_BUG_LEN - int "thread msg bud size" + int "thread msg buf size" default 128 + config THREAD_IPC_MSG_LEN + int "thread ipc msg max size" + default 96 + config THREAD_MAP_BUF_LEN + int "thread ipc map buf max size." + default 16 config BUDDY_SLAB bool "use BUDDY & SLAB" default n diff --git a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h index 15c048ad5..435228c17 100755 --- a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h +++ b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h @@ -61,6 +61,7 @@ typedef struct sp_info { mword_t sp; mword_t pc; mword_t u_sp; // user_sp + mword_t tpidr_el0; } sp_info_t; #define _barrier() __asm__ __volatile__("" : : : "memory") diff --git a/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S b/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S index d791f4279..b1b0f6025 100755 --- a/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S +++ b/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S @@ -243,7 +243,9 @@ cpu_switch_to: stp x27, x28, [x8], #16 stp x29, x9, [x8], #16 mrs x9, sp_el1 - stp lr, x9, [x8] + stp lr, x9, [x8], #16 + mrs x9, tpidr_el0 + str x9, [x8] mov x8, x1 ldp x19, x20, [x8], #16 @@ -254,6 +256,8 @@ cpu_switch_to: ldp x29, x9, [x8], #16 ldr lr, [x8], #8 mov sp, x9 - ldr x9, [x8] + ldr x9, [x8], #8 msr sp_el1, x9 + ldr x9, [x8] + msr tpidr_el0, x9 ret diff --git a/mkrtos_knl/inc/knl/globals.h b/mkrtos_knl/inc/knl/globals.h index 65e5b69a8..aa11b097e 100755 --- a/mkrtos_knl/inc/knl/globals.h +++ b/mkrtos_knl/inc/knl/globals.h @@ -10,14 +10,15 @@ */ #pragma once +#include "kobject.h" #include "mm.h" #include "types.h" -#include "kobject.h" extern char _sdata[]; extern char _edata[]; extern char _sbss[]; extern char _ebss[]; +extern mword_t cpio_images; mem_t *mm_get_global(void); void global_reg_kobj(kobject_t *kobj, int inx); diff --git a/mkrtos_knl/inc/knl/prot.h b/mkrtos_knl/inc/knl/prot.h index 2b97240a3..cf24fbcc6 100755 --- a/mkrtos_knl/inc/knl/prot.h +++ b/mkrtos_knl/inc/knl/prot.h @@ -42,9 +42,9 @@ typedef struct msg_tag struct { umword_t flags : 4; - umword_t msg_buf_len : 5; - umword_t map_buf_len : 2; - umword_t prot : WORD_BITS - 12; + umword_t msg_buf_len : 7; + umword_t map_buf_len : 5; + umword_t prot : WORD_BITS - 16; }; }; } msg_tag_t; diff --git a/mkrtos_knl/inc/knl/thread.h b/mkrtos_knl/inc/knl/thread.h index 41ac46d37..07103f56c 100755 --- a/mkrtos_knl/inc/knl/thread.h +++ b/mkrtos_knl/inc/knl/thread.h @@ -26,8 +26,8 @@ typedef struct thread thread_t; #define MSG_BUF_RECV_R_FLAGS 0x02U //!< 接收来自recv_th的消息 #define MSG_BUF_REPLY_FLAGS 0x04U //!< 回复消息给send_th -#define IPC_MSG_SIZE 96 -#define MAP_BUF_SIZE 16 +#define IPC_MSG_SIZE CONFIG_THREAD_IPC_MSG_LEN +#define MAP_BUF_SIZE CONFIG_THREAD_MAP_BUF_LEN #define IPC_USER_SIZE 12 #if (IPC_MSG_SIZE + MAP_BUF_SIZE + IPC_USER_SIZE) > THREAD_MSG_BUG_LEN diff --git a/mkrtos_knl/knl/mm/vma.c b/mkrtos_knl/knl/mm/vma.c index ebfa725b5..1e0e7aa19 100644 --- a/mkrtos_knl/knl/mm/vma.c +++ b/mkrtos_knl/knl/mm/vma.c @@ -1,18 +1,16 @@ -#include -#include #include -#include -#include -#include -#include #include -#include -#include -#include #include -#include +#include +#include +#include +#include +#include #include +#include +#include +#include static slab_t *vma_slab; static int vma_idl_tree_insert_cmp_handler(const void *key, const void *data); @@ -31,8 +29,7 @@ static vma_t *vma_alloc(void) { vma_t *pvma = slab_alloc(vma_slab); - if (!pvma) - { + if (!pvma) { return NULL; } memset(pvma, 0, sizeof(*pvma)); @@ -47,8 +44,7 @@ static mln_rbtree_node_t *vma_node_create(mln_rbtree_t *r_tree, vma_addr_t addr, mln_rbtree_node_t *node = NULL; vma_t *data_vma = vma_alloc(); - if (data_vma == NULL) - { + if (data_vma == NULL) { return NULL; } @@ -58,8 +54,7 @@ static mln_rbtree_node_t *vma_node_create(mln_rbtree_t *r_tree, vma_addr_t addr, node = mln_rbtree_node_new(r_tree, data_vma); - if (mln_rbtree_null(node, r_tree)) - { + if (mln_rbtree_null(node, r_tree)) { return NULL; } @@ -92,16 +87,14 @@ static mln_rbtree_node_t *task_vma_tree_find(mln_rbtree_t *tree, rbtree_cmp cmp, tree->cmp = cmp; rn = mln_rbtree_search(tree, &data); - if (mln_rbtree_null(rn, tree)) - { + if (mln_rbtree_null(rn, tree)) { return NULL; } return rn; } -typedef struct vma_idl_tree_insert_params -{ +typedef struct vma_idl_tree_insert_params { vaddr_t addr; size_t size; } vma_idl_tree_insert_params_t; @@ -116,17 +109,12 @@ static int vma_idl_tree_insert_cmp_handler(const void *key, const void *data) vma_t *key_p = (vma_t *)key; vma_t *data_p = (vma_t *)data; - if (vma_addr_get_addr(key_p->vaddr) + key_p->size <= vma_addr_get_addr(data_p->vaddr)) - { + if (vma_addr_get_addr(key_p->vaddr) + key_p->size <= vma_addr_get_addr(data_p->vaddr)) { return -1; - } - else if (vma_addr_get_addr(key_p->vaddr) >= vma_addr_get_addr(data_p->vaddr) && - (vma_addr_get_addr(key_p->vaddr) + key_p->size) <= vma_addr_get_addr(data_p->vaddr) + data_p->size) - { + } else if (vma_addr_get_addr(key_p->vaddr) >= vma_addr_get_addr(data_p->vaddr) && + (vma_addr_get_addr(key_p->vaddr) + key_p->size) <= vma_addr_get_addr(data_p->vaddr) + data_p->size) { return 0; - } - else - { + } else { return 1; } } @@ -141,22 +129,16 @@ static int vma_idl_tree_alloc_cmp_handler(const void *key, const void *data) vma_idl_tree_insert_params_t *key_p = (vma_idl_tree_insert_params_t *)key; vma_t *data_p = (vma_t *)data; - if (key_p->addr + key_p->size <= vma_addr_get_addr(data_p->vaddr)) - { + if (key_p->addr + key_p->size <= vma_addr_get_addr(data_p->vaddr)) { return -1; - } - else if (key_p->addr >= vma_addr_get_addr(data_p->vaddr) && - (key_p->addr + key_p->size) <= vma_addr_get_addr(data_p->vaddr) + data_p->size) - { + } else if (key_p->addr >= vma_addr_get_addr(data_p->vaddr) && + (key_p->addr + key_p->size) <= vma_addr_get_addr(data_p->vaddr) + data_p->size) { return 0; - } - else - { + } else { return 1; } } -typedef struct vma_idl_tree_iter_params -{ +typedef struct vma_idl_tree_iter_params { // vaddr_t addr; size_t size; @@ -174,10 +156,8 @@ static int rbtree_iterate_idle_tree_find(mln_rbtree_node_t *node, void *udata) vma_idl_tree_iter_params_t *param = udata; vma_t *node_data = mln_rbtree_node_data_get(node); - if (!(node_data->flags & VMA_USED_NODE)) - { - if (node_data->size >= param->size) - { + if (!(vma_node_get_used(node_data))) { + if (node_data->size >= param->size) { param->ret_node = node; return -1; } @@ -200,8 +180,7 @@ static mln_rbtree_node_t *task_vma_idle_tree_find(task_vma_t *task_vma, size_t s int ret; ret = mln_rbtree_iterate(&task_vma->idle_tree, rbtree_iterate_idle_tree_find, ¶m); - if (ret >= 0) - { + if (ret >= 0) { return NULL; } return param.ret_node; @@ -228,12 +207,9 @@ static int task_vma_node_split(mln_rbtree_t *r_tree, mln_rbtree_node_t *node, va addr + size <= vma_addr_get_addr(data->vaddr) + data->size); //!< 检查地址在合理的范围之内 - if (addr == vma_addr_get_addr(data->vaddr) && size == data->size) - { + if (addr == vma_addr_get_addr(data->vaddr) && size == data->size) { /*大小正好相等,则什么都不用做*/ - } - else if (addr == vma_addr_get_addr(data->vaddr)) - { + } else if (addr == vma_addr_get_addr(data->vaddr)) { //!< 左对齐 mln_rbtree_node_t *r_node; @@ -241,16 +217,13 @@ static int task_vma_node_split(mln_rbtree_t *r_tree, mln_rbtree_node_t *node, va vma_addr_create(data->vaddr.prot, data->vaddr.flags, vma_addr_get_addr(data->vaddr) + size), data->size - size, 0); - if (r_node == NULL) - { + if (r_node == NULL) { ret = -ENOMEM; goto err_ret; } r_tree->cmp = vma_idl_tree_insert_cmp_handler; mln_rbtree_insert(r_tree, r_node); - } - else if (addr + size == vma_addr_get_addr(data->vaddr) + data->size) - { + } else if (addr + size == vma_addr_get_addr(data->vaddr) + data->size) { //!< 右对齐 mln_rbtree_node_t *r_node; @@ -258,16 +231,13 @@ static int task_vma_node_split(mln_rbtree_t *r_tree, mln_rbtree_node_t *node, va vma_addr_create(data->vaddr.prot, data->vaddr.flags, vma_addr_get_addr(data->vaddr)), data->size - size, 0); - if (r_node == NULL) - { + if (r_node == NULL) { ret = -ENOMEM; goto err_ret; } r_tree->cmp = vma_idl_tree_insert_cmp_handler; mln_rbtree_insert(r_tree, r_node); - } - else - { + } else { // 在中间分割成两个 mln_rbtree_node_t *r_node; @@ -275,8 +245,7 @@ static int task_vma_node_split(mln_rbtree_t *r_tree, mln_rbtree_node_t *node, va vma_addr_create(data->vaddr.prot, data->vaddr.flags, vma_addr_get_addr(data->vaddr)), addr - vma_addr_get_addr(data->vaddr), 0); - if (r_node == NULL) - { + if (r_node == NULL) { ret = -ENOMEM; goto err_ret; } @@ -287,8 +256,7 @@ static int task_vma_node_split(mln_rbtree_t *r_tree, mln_rbtree_node_t *node, va vma_addr_create(data->vaddr.prot, data->vaddr.flags, addr + size), vma_addr_get_addr(data->vaddr) + data->size - (addr + size), 0); - if (l_node == NULL) - { + if (l_node == NULL) { vma_node_free(r_tree, r_node); ret = -ENOMEM; goto err_ret; @@ -317,8 +285,7 @@ mword_t task_vma_lock(task_vma_t *task_vma) task = container_of(container_of(task_vma, mm_space_t, mem_vma), task_t, mm_space); ret = spinlock_lock(&task->kobj.lock); - if (ret < 0) - { + if (ret < 0) { return ret; } return ret; @@ -338,8 +305,7 @@ mword_t task_vma_lock_two(task_vma_t *task_vma_0, task_vma_t *task_vma_1, mword_ assert(status1); status = task_vma_lock(task_vma_0); - if (status < 0) - { + if (status < 0) { return status; } *status0 = status; @@ -367,28 +333,22 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size, mword_t lock_status; vaddr_t alloc_addr; - if ((size & (PAGE_SIZE - 1)) != 0) - { + if ((size & (PAGE_SIZE - 1)) != 0) { return -EINVAL; } lock_status = task_vma_lock(task_vma); - if (lock_status < 0) - { + if (lock_status < 0) { return lock_status; } - if (vma_addr_get_addr(vaddr) == 0) - { + if (vma_addr_get_addr(vaddr) == 0) { node = task_vma_idle_tree_find(task_vma, size); - if (!node) - { + if (!node) { ret = -ENOMEM; goto end; } node_data = mln_rbtree_node_data_get(node); alloc_addr = vma_addr_get_addr(node_data->vaddr); - } - else - { + } else { alloc_addr = vma_addr_get_addr(vaddr); task_vma->idle_tree.cmp = vma_idl_tree_alloc_cmp_handler; @@ -398,13 +358,11 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size, .size = size, .addr = alloc_addr, }); //!< 查找是否存在 - if (mln_rbtree_null(node, &task_vma->idle_tree)) - { + if (mln_rbtree_null(node, &task_vma->idle_tree)) { ret = -ENOENT; goto end; } - if (vma_node_get_used(mln_rbtree_node_data_get(node))) - { + if (vma_node_get_used(mln_rbtree_node_data_get(node))) { ret = -EEXIST; goto end; } @@ -413,8 +371,7 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size, ret = task_vma_node_split(&task_vma->idle_tree, node, alloc_addr, size); - if (ret < 0) - { + if (ret < 0) { goto end; } //!< 设置当前节点是使用节点,设置属性等,并插入到树中 @@ -425,12 +382,11 @@ int task_vma_alloc(task_vma_t *task_vma, vma_addr_t vaddr, size_t size, task_vma->idle_tree.cmp = vma_idl_tree_insert_cmp_handler; mln_rbtree_insert(&task_vma->idle_tree, node); - if (ret_vaddr) - { + if (ret_vaddr) { //!< 设置分配后的地址 *ret_vaddr = alloc_addr; } - // printk("alloc:[0x%x 0x%x] size:0x%x\n", alloc_addr, alloc_addr + size - 1, size); + printk("alloc:[0x%x 0x%x] size:0x%x\n", alloc_addr, alloc_addr + size - 1, size); ret = 0; end: task_vma_unlock(task_vma, lock_status); @@ -448,22 +404,16 @@ static int vma_idl_tree_eq_cmp_handler(const void *key, const void *data) vma_idl_tree_insert_params_t *key_p = (vma_idl_tree_insert_params_t *)key; vma_t *data_p = (vma_t *)data; - if (key_p->addr + key_p->size <= vma_addr_get_addr(data_p->vaddr)) - { + if (key_p->addr + key_p->size <= vma_addr_get_addr(data_p->vaddr)) { return -1; - } - else if (key_p->addr == vma_addr_get_addr(data_p->vaddr) && - (key_p->addr + key_p->size) == vma_addr_get_addr(data_p->vaddr) + data_p->size) - { + } else if (key_p->addr == vma_addr_get_addr(data_p->vaddr) && + (key_p->addr + key_p->size) == vma_addr_get_addr(data_p->vaddr) + data_p->size) { return 0; - } - else - { + } else { return 1; } } -typedef struct vma_idl_tree_iter_grant_params -{ +typedef struct vma_idl_tree_iter_grant_params { vaddr_t addr; vaddr_t dst_addr; size_t size; @@ -489,8 +439,7 @@ static int rbtree_iterate_tree_grant(mln_rbtree_node_t *node, void *udata) // printk("[grant][0x%lx 0x%lx] [0x%lx:0x%lx]\n", vma_addr_get_addr(node_data->vaddr), vma_addr_get_addr(node_data->vaddr) + node_data->size, // param->addr, param->size); if (vma_addr_get_addr(node_data->vaddr) >= param->addr && - vma_addr_get_addr(node_data->vaddr) + node_data->size <= param->addr + param->size) - { + vma_addr_get_addr(node_data->vaddr) + node_data->size <= param->addr + param->size) { mm_space_t *src_mm_space = container_of(param->src_mm_vma, mm_space_t, mem_vma); mm_space_t *dst_mm_space = container_of(param->dst_mm_vma, mm_space_t, mem_vma); @@ -508,11 +457,10 @@ static int rbtree_iterate_tree_grant(mln_rbtree_node_t *node, void *udata) (addr_t)vma_node_get_paddr(node_data), PAGE_SHIFT, 1, vpage_attrs_to_page_attrs(vma_addr_get_prot(node_data->vaddr))); - if (ret >= 0) - { + if (ret >= 0) { param->grant_size += PAGE_SIZE; } - //printk("vaddr:0x%x grant vaddr:0x%x 0x%x\n", vma_addr_get_addr(node_data->vaddr), dst_addr, PAGE_SIZE); + // printk("vaddr:0x%x grant vaddr:0x%x 0x%x\n", vma_addr_get_addr(node_data->vaddr), dst_addr, PAGE_SIZE); vma_addr_set_addr(&node_data->vaddr, dst_addr); param->r_dst_tree->cmp = vma_idl_tree_insert_cmp_handler; mln_rbtree_insert(param->r_dst_tree, node); @@ -536,8 +484,7 @@ int task_vma_grant(task_vma_t *src_task_vma, task_vma_t *dst_task_vma, vaddr_t s { assert(src_task_vma); assert(dst_task_vma); - if ((size & (PAGE_SIZE - 1)) != 0) - { + if ((size & (PAGE_SIZE - 1)) != 0) { return -EINVAL; } mword_t lock_status; @@ -546,8 +493,7 @@ int task_vma_grant(task_vma_t *src_task_vma, task_vma_t *dst_task_vma, vaddr_t s int ret = -EINVAL; lock_status = task_vma_lock_two(src_task_vma, dst_task_vma, &lock_status0, &lock_status1); - if (lock_status < 0) - { + if (lock_status < 0) { return lock_status; } mln_rbtree_node_t *src_node; @@ -561,13 +507,11 @@ int task_vma_grant(task_vma_t *src_task_vma, task_vma_t *dst_task_vma, vaddr_t s .size = size, .addr = src_addr, }); //!< 查找是否存在 - if (mln_rbtree_null(src_node, &src_task_vma->idle_tree)) - { + if (mln_rbtree_null(src_node, &src_task_vma->idle_tree)) { ret = -ENOENT; goto end; } - if (!vma_node_get_used(mln_rbtree_node_data_get(src_node))) - { + if (!vma_node_get_used(mln_rbtree_node_data_get(src_node))) { ret = -ENOENT; goto end; } @@ -579,8 +523,7 @@ int task_vma_grant(task_vma_t *src_task_vma, task_vma_t *dst_task_vma, vaddr_t s .size = size, .addr = dst_addr, }); //!< 查找是否存在 - if (!mln_rbtree_null(dst_node, &dst_task_vma->idle_tree)) - { + if (!mln_rbtree_null(dst_node, &dst_task_vma->idle_tree)) { // vma_t *dst_node_dat = mln_rbtree_node_data_get(dst_node); // if (!vma_node_get_used(dst_node_dat)) @@ -611,6 +554,8 @@ int task_vma_grant(task_vma_t *src_task_vma, task_vma_t *dst_task_vma, vaddr_t s mln_rbtree_iterate(&src_task_vma->alloc_tree, rbtree_iterate_tree_grant, ¶ms); dst_task_vma->idle_tree.cmp = vma_idl_tree_insert_cmp_handler; + vma_addr_set_addr(&((vma_t *)mln_rbtree_node_data_get(src_node))->vaddr, + dst_addr); mln_rbtree_insert(&dst_task_vma->idle_tree, src_node); ret = params.grant_size; end: @@ -644,18 +589,14 @@ static int vma_node_merge(mln_rbtree_t *r_tree, mln_rbtree_node_t *node) data_node = mln_rbtree_node_data_get(node); mln_rbtree_delete(r_tree, node); - if (mln_rbtree_null(lnode, r_tree) && mln_rbtree_null(rnode, r_tree)) - { + if (mln_rbtree_null(lnode, r_tree) && mln_rbtree_null(rnode, r_tree)) { // 左右都是空的 return 0; - } - else if (mln_rbtree_null(lnode, r_tree)) - { + } else if (mln_rbtree_null(lnode, r_tree)) { // 左边是空的 r_datanode = mln_rbtree_node_data_get(rnode); - if (vma_node_get_used(r_datanode) != vma_node_get_used(data_node)) - { + if (vma_node_get_used(r_datanode) != vma_node_get_used(data_node)) { return 0; } data_node->size += r_datanode->size; @@ -663,14 +604,11 @@ static int vma_node_merge(mln_rbtree_t *r_tree, mln_rbtree_node_t *node) vma_node_free(r_tree, rnode); mln_rbtree_insert(r_tree, node); - } - else if (mln_rbtree_null(rnode, r_tree)) - { + } else if (mln_rbtree_null(rnode, r_tree)) { // 右边是空的 r_datanode = mln_rbtree_node_data_get(rnode); - if (vma_node_get_used(r_datanode) != vma_node_get_used(data_node)) - { + if (vma_node_get_used(r_datanode) != vma_node_get_used(data_node)) { return 0; } mln_rbtree_delete(r_tree, rnode); @@ -681,8 +619,7 @@ static int vma_node_merge(mln_rbtree_t *r_tree, mln_rbtree_node_t *node) } return 0; } -typedef struct vma_idl_tree_iter_del_params -{ +typedef struct vma_idl_tree_iter_del_params { vaddr_t addr; size_t size; mln_rbtree_t *r_tree; @@ -701,8 +638,7 @@ static int rbtree_iterate_alloc_tree_del(mln_rbtree_node_t *node, void *udata) vma_t *node_data = mln_rbtree_node_data_get(node); if (vma_addr_get_addr(node_data->vaddr) >= param->addr && - vma_addr_get_addr(node_data->vaddr) + node_data->size <= param->addr + param->size) - { + vma_addr_get_addr(node_data->vaddr) + node_data->size <= param->addr + param->size) { // 解除映射 unmap_mm(mm_space_get_pdir(param->mm_space), vma_addr_get_addr(node_data->vaddr), PAGE_SHIFT, 1); @@ -731,13 +667,11 @@ int task_vma_free(task_vma_t *task_vma, vaddr_t addr, size_t size) mword_t lock_status; assert(task_vma); - if ((size & (PAGE_SIZE - 1)) != 0) - { + if ((size & (PAGE_SIZE - 1)) != 0) { return -EINVAL; } lock_status = task_vma_lock(task_vma); - if (lock_status < 0) - { + if (lock_status < 0) { return lock_status; } task_vma->idle_tree.cmp = vma_idl_tree_eq_cmp_handler; @@ -747,8 +681,7 @@ int task_vma_free(task_vma_t *task_vma, vaddr_t addr, size_t size) .size = size, .addr = addr, }); //!< 查找是否存在 - if (mln_rbtree_null(find_node, &task_vma->idle_tree)) - { + if (mln_rbtree_null(find_node, &task_vma->idle_tree)) { ret = -ENOENT; goto end; } @@ -783,17 +716,12 @@ static int vma_idl_tree_wrap_cmp_handler(const void *key, const void *data) vma_idl_tree_insert_params_t *key_p = (vma_idl_tree_insert_params_t *)key; vma_t *data_p = (vma_t *)data; - if (key_p->addr + key_p->size <= vma_addr_get_addr(data_p->vaddr)) - { + if (key_p->addr + key_p->size <= vma_addr_get_addr(data_p->vaddr)) { return -1; - } - else if (key_p->addr >= vma_addr_get_addr(data_p->vaddr) && - (key_p->addr + key_p->size) <= vma_addr_get_addr(data_p->vaddr) + data_p->size) - { + } else if (key_p->addr >= vma_addr_get_addr(data_p->vaddr) && + (key_p->addr + key_p->size) <= vma_addr_get_addr(data_p->vaddr) + data_p->size) { return 0; - } - else - { + } else { return 1; } } @@ -817,12 +745,11 @@ int task_vma_page_fault(task_vma_t *task_vma, vaddr_t addr) assert(task_vma); lock_status = task_vma_lock(task_vma); - if (lock_status < 0) - { + if (lock_status < 0) { return lock_status; } - //printk("page fault:0x%x.\n", addr); - // 1.查找 + // printk("page fault:0x%x.\n", addr); + // 1.查找 task = container_of(container_of(task_vma, mm_space_t, mem_vma), task_t, mm_space); task_vma->idle_tree.cmp = vma_idl_tree_wrap_cmp_handler; find_node = mln_rbtree_search( @@ -831,8 +758,7 @@ int task_vma_page_fault(task_vma_t *task_vma, vaddr_t addr) .size = PAGE_SIZE, .addr = addr, }); //!< 查找是否存在 - if (mln_rbtree_null(find_node, &task_vma->idle_tree)) - { + if (mln_rbtree_null(find_node, &task_vma->idle_tree)) { ret = -ENOENT; goto end; } @@ -843,25 +769,18 @@ int task_vma_page_fault(task_vma_t *task_vma, vaddr_t addr) goto end; } // 2.申请物理内存 - if (vma_addr_get_flags(node_data->vaddr) & VMA_ADDR_RESV) - { - if (!vma_node_get_paddr(node_data)) - { + if (vma_addr_get_flags(node_data->vaddr) & VMA_ADDR_RESV) { + if (!vma_node_get_paddr(node_data)) { mem = NULL; - } - else - { + } else { mem = (void *)(addr - vma_addr_get_addr(node_data->vaddr) + vma_node_get_paddr(node_data)); } - } - else - { + } else { mem = buddy_alloc(buddy_get_alloter(), PAGE_SIZE); memset(mem, 0, PAGE_SIZE); } - if (!mem) - { + if (!mem) { ret = -ENOMEM; goto end; } @@ -872,10 +791,8 @@ int task_vma_page_fault(task_vma_t *task_vma, vaddr_t addr) vma_addr_create(vma_addr_get_prot(node_data->vaddr), vma_addr_get_flags(node_data->vaddr), addr), PAGE_SIZE, (paddr_t)mem); - if (alloc_node == NULL) - { - if (!(vma_addr_get_flags(node_data->vaddr) & VMA_ADDR_RESV)) - { + if (alloc_node == NULL) { + if (!(vma_addr_get_flags(node_data->vaddr) & VMA_ADDR_RESV)) { buddy_free(buddy_get_alloter(), mem); } ret = -ENOMEM; @@ -885,8 +802,7 @@ int task_vma_page_fault(task_vma_t *task_vma, vaddr_t addr) ret = map_mm(mm_space_get_pdir(&task->mm_space), addr, (addr_t)mem, PAGE_SHIFT, 1, vpage_attrs_to_page_attrs(vma_addr_get_prot(node_data->vaddr))); - if (ret < 0) - { + if (ret < 0) { vma_node_free(&task_vma->alloc_tree, alloc_node); ret = -ENOMEM; goto end; diff --git a/mkrtos_knl/knl/sys.c b/mkrtos_knl/knl/sys.c index 08a92bdb0..047292cf2 100755 --- a/mkrtos_knl/knl/sys.c +++ b/mkrtos_knl/knl/sys.c @@ -8,31 +8,37 @@ * @copyright Copyright (c) 2023 * */ -#include "log.h" +#include "arch.h" #include "factory.h" -#include "kobject.h" #include "globals.h" #include "init.h" +#include "kobject.h" +#include "log.h" +#include "mm_wrap.h" #include "printk.h" #include "types.h" #include "util.h" -#include "arch.h" -#include "mm_wrap.h" +#if IS_ENABLED(CONFIG_MMU) +#include +#endif +#include +#include +#include +#include -typedef struct sys -{ +typedef struct sys { kobject_t kobj; } sys_t; static sys_t sys_obj; -enum sys_op -{ +enum sys_op { SYS_INFO_GET, REBOOT, MEM_INFO, DIS_IRQ, }; +#define SYS_FLAGS_MAP_CPIO_FS 0x1 static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f); static void sys_reg(void) @@ -45,35 +51,39 @@ INIT_KOBJ(sys_reg); static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f) { + int ret = 0; msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL); - if (sys_p.prot != SYS_PROT) - { + if (sys_p.prot != SYS_PROT) { f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } - switch (sys_p.op) - { - case SYS_INFO_GET: - { + switch (sys_p.op) { + case SYS_INFO_GET: { + umword_t flags = f->regs[0]; + addr_t cpio_addr; + f->regs[1] = sys_tick_cnt_get(); #if IS_ENABLED(CONFIG_MMU) - f->regs[2] = CONFIG_BOOT_FS_VADDR; + if (flags & SYS_FLAGS_MAP_CPIO_FS) { + ret = task_vma_alloc(&(thread_get_current_task()->mm_space.mem_vma), + vma_addr_create(VPAGE_PROT_RO, VMA_ADDR_RESV, 0), + cpio_get_size(cpio_images), (paddr_t)cpio_images, &cpio_addr); + f->regs[2] = cpio_addr; + } else { + f->regs[2] = CONFIG_BOOT_FS_VADDR; + } #else f->regs[2] = CONFIG_KNL_TEXT_ADDR + CONFIG_BOOTFS_OFFSET; #endif f->regs[3] = arch_get_sys_clk(); - tag = msg_tag_init4(0, 0, 0, 0); - } - break; - case REBOOT: - { + tag = msg_tag_init4(0, 0, 0, ret); + } break; + case REBOOT: { printk("sys reboot.\n"); sys_reset(); tag = msg_tag_init4(0, 0, 0, 0); - } - break; - case MEM_INFO: - { + } break; + case MEM_INFO: { size_t total; size_t free; @@ -81,14 +91,11 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, f->regs[1] = total; f->regs[2] = free; tag = msg_tag_init4(0, 0, 0, 0); - } - break; - case DIS_IRQ: - { + } break; + case DIS_IRQ: { arch_disable_irq(f->regs[0]); tag = msg_tag_init4(0, 0, 0, 0); - } - break; + } break; default: tag = msg_tag_init4(0, 0, 0, -ENOSYS); break; diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 60afe2441..282a46d84 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -122,8 +122,6 @@ static void knl_init_2(void) knl_test(); #else - extern mword_t cpio_images; - umword_t ret_addr; size_t size; @@ -183,7 +181,7 @@ void task_knl_kill(thread_t *kill_thread, bool_t is_knl) task_t *task = container_of(kill_thread->task, task_t, kobj); if (!is_knl) { - printk("kill task:0x%x.\n", kill_thread->task); + printk("kill task:0x%x, pid:%d\n", task, task->pid); umword_t status2; thread_suspend(kill_thread); diff --git a/mkrtos_script/build_qemu_aarch64.sh b/mkrtos_script/build_qemu_aarch64.sh index 90282b775..ff4bd99c9 100755 --- a/mkrtos_script/build_qemu_aarch64.sh +++ b/mkrtos_script/build_qemu_aarch64.sh @@ -1,9 +1,9 @@ #!/bin/bash -export TOOLCHAIN=/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/ -export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/lib/gcc/aarch64-none-elf/10.3.1 -# export TOOLCHAIN=/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/ -# export TOOLCHAIN_LIB=/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/lib/gcc/aarch64-none-elf/10.3.1 +# export TOOLCHAIN=/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/bin/ +# export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm-10.3-2021.07-aarch64-aarch64-none-elf/lib/gcc/aarch64-none-elf/10.3.1 +export TOOLCHAIN=/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/bin/ +export TOOLCHAIN_LIB=/home/mkrtos-smart/toolchains/gcc-arm-10.3-2021.07-x86_64-aarch64-none-elf/lib/gcc/aarch64-none-elf/10.3.1 export BOARD=aarch64_qemu export CROSS_COMPILE_NAME=aarch64-none-elf- diff --git a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h index c52f450d5..cd9701a40 100644 --- a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h @@ -53,8 +53,13 @@ long syscall_backend(long sys_inx, ...); void fs_backend_init(void); long be_lseek(long fd, long offset, long whence); +long sys_be_lseek(va_list ap); int be_open(const char *path, int flags, mode_t mode); +long sys_be_open(va_list ap); +long sys_be_open_at(va_list ap); int be_close(int fd); +long sys_be_close(va_list ap); +long sys_be_getdents(va_list ap); long be_read(long fd, char *buf, long size); long be_write(long fd, char *buf, long size); long be_readv(long fd, const struct iovec *iov, long iovcnt); diff --git a/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c b/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c index 2f9070fb2..e3719a273 100644 --- a/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c +++ b/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c @@ -7,12 +7,16 @@ typedef long (*sys_call_func)(va_list ap); static const sys_call_func sys_call_list[] = { // TODO: add syscall func pointer. + [SYS_openat] = sys_be_open_at, + [SYS_close] = sys_be_close, [SYS_munmap] = sys_munmap, [SYS_mmap] = sys_mmap, [SYS_read] = sys_be_read, [SYS_write] = sys_be_write, [SYS_writev] = sys_be_writev, [SYS_ioctl] = sys_be_ioctl, + [SYS_lseek] = sys_be_lseek, + [SYS_getdents64] = sys_be_getdents, [SYS_set_tid_address] = sys_set_tid_address, // [__ARM_NR_set_tls] = sys_set_thread_area, // [SYS_exit] = be_exit, diff --git a/mkrtos_user/lib/libc_backend/src/fs_backend.c b/mkrtos_user/lib/libc_backend/src/fs_backend.c index 718f77b64..de7ebacdb 100644 --- a/mkrtos_user/lib/libc_backend/src/fs_backend.c +++ b/mkrtos_user/lib/libc_backend/src/fs_backend.c @@ -1,19 +1,19 @@ #include "fs_backend.h" -#include "syscall_backend.h" -#include "fs_cli.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include #include "fd_map.h" +#include "fs_cli.h" +#include "syscall_backend.h" #include "u_sleep.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include AUTO_CALL(101) void fs_backend_init(void) { @@ -25,71 +25,84 @@ int be_open(const char *path, int flags, mode_t mode) { int fd = fs_open(path, flags, mode); - if (fd < 0) - { + if (fd < 0) { return fd; } int user_fd = fd_map_alloc(0, fd, FD_FS); - if (user_fd < 0) - { + if (user_fd < 0) { be_close(user_fd); } return user_fd; } +long sys_be_open(va_list ap) +{ + void *path; + long flags; + long mode; + + ARG_3_BE(ap, path, void *, flags, long, mode, long); + + return be_open(path, flags, mode); +} +long sys_be_open_at(va_list ap) +{ + long resv; + void *path; + long flags; + long mode; + + ARG_4_BE(ap, resv, long, path, void *, flags, long, mode, long); + + return be_open(path, flags, mode); +} int be_close(int fd) { fd_map_entry_t u_fd; int ret = fd_map_free(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { - } - break; - case FD_FS: - { + switch (u_fd.type) { + case FD_TTY: { + } break; + case FD_FS: { return fs_close(u_fd.priv_fd); - } - break; + } break; default: return -ENOSYS; } return 0; } +long sys_be_close(va_list ap) +{ + long fd; + + ARG_1_BE(ap, fd, long); + + return be_close(fd); +} static int be_tty_read(char *buf, long size) { pid_t pid; int len; int r_len = 0; - if (size == 0) - { + if (size == 0) { return 0; } task_get_pid(TASK_THIS, (umword_t *)(&pid)); - while (r_len < size) - { - if (pid == 0) - { + while (r_len < size) { + if (pid == 0) { len = ulog_read_bytes(u_get_global_env()->log_hd, buf + r_len, size - r_len); - } - else - { + } else { len = cons_read(buf + r_len, size - r_len); } - if (len < 0) - { + if (len < 0) { return len; - } - else if (len == 0) - { + } else if (len == 0) { u_sleep_ms(10); continue; } @@ -103,22 +116,16 @@ long be_read(long fd, char *buf, long size) fd_map_entry_t u_fd; int ret = fd_map_get(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { + switch (u_fd.type) { + case FD_TTY: { return be_tty_read(buf, size); - } - break; - case FD_FS: - { + } break; + case FD_FS: { return fs_read(u_fd.priv_fd, buf, size); - } - break; + } break; default: return -ENOSYS; } @@ -130,33 +137,24 @@ long be_write(long fd, char *buf, long size) fd_map_entry_t u_fd; int ret = fd_map_get(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { + switch (u_fd.type) { + case FD_TTY: { pid_t pid; task_get_pid(TASK_THIS, (umword_t *)(&pid)); - if (pid == 0) - { + if (pid == 0) { ulog_write_bytes(u_get_global_env()->log_hd, buf, size); - } - else - { + } else { cons_write(buf, size); } return size; - } - break; - case FD_FS: - { + } break; + case FD_FS: { return fs_write(u_fd.priv_fd, buf, size); - } - break; + } break; default: return -ENOSYS; } @@ -165,51 +163,38 @@ long be_write(long fd, char *buf, long size) long be_readv(long fd, const struct iovec *iov, long iovcnt) { long wlen = 0; - for (int i = 0; i < iovcnt; i++) - { + for (int i = 0; i < iovcnt; i++) { fd_map_entry_t u_fd; int ret = fd_map_get(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { + switch (u_fd.type) { + case FD_TTY: { pid_t pid; int read_cn; task_get_pid(TASK_THIS, (umword_t *)(&pid)); - if (pid == 0) - { + if (pid == 0) { read_cn = ulog_read_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len); - } - else - { + } else { again_read: read_cn = cons_read(iov[i].iov_base, iov[i].iov_len); - if (read_cn < 0) - { + if (read_cn < 0) { return read_cn; - } - else if (read_cn == 0) - { + } else if (read_cn == 0) { u_sleep_ms(10); // TODO:改成信号量 goto again_read; } } wlen += read_cn; - } - break; - case FD_FS: - { + } break; + case FD_FS: { int rsize = fs_read(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len); wlen += rsize; - } - break; + } break; default: return -ENOSYS; } @@ -219,40 +204,30 @@ long be_readv(long fd, const struct iovec *iov, long iovcnt) long be_writev(long fd, const struct iovec *iov, long iovcnt) { long wlen = 0; - for (int i = 0; i < iovcnt; i++) - { + for (int i = 0; i < iovcnt; i++) { fd_map_entry_t u_fd; int ret = fd_map_get(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { + switch (u_fd.type) { + case FD_TTY: { pid_t pid; task_get_pid(TASK_THIS, (umword_t *)(&pid)); - if (pid == 0) - { + if (pid == 0) { ulog_write_bytes(u_get_global_env()->log_hd, iov[i].iov_base, iov[i].iov_len); - } - else - { - cons_write(iov[i].iov_base, iov[i].iov_len); + } else { + cons_write(iov[i].iov_base, iov[i].iov_len); } wlen += iov[i].iov_len; - } - break; - case FD_FS: - { + } break; + case FD_FS: { int wsize = fs_write(u_fd.priv_fd, iov[i].iov_base, iov[i].iov_len); wlen += wsize; - } - break; + } break; default: return -ENOSYS; } @@ -313,27 +288,30 @@ long be_lseek(long fd, long offset, long whence) fd_map_entry_t u_fd; int ret = fd_map_get(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { + switch (u_fd.type) { + case FD_TTY: { return -ENOSYS; - } - break; - case FD_FS: - { + } break; + case FD_FS: { return fs_lseek(u_fd.priv_fd, offset, whence); - } - break; + } break; default: return -ENOSYS; } return 0; } +long sys_be_lseek(va_list ap) +{ + long fd; + long offset; + long whence; + ARG_3_BE(ap, fd, long, offset, long, whence, long); + + return be_lseek(fd, offset, whence); +} long be_symlink(const char *src, const char *dst) { return fs_symlink(src, dst); @@ -343,24 +321,27 @@ long be_getdents(long fd, char *buf, size_t size) fd_map_entry_t u_fd; int ret = fd_map_get(fd, &u_fd); - if (ret < 0) - { + if (ret < 0) { return -EBADF; } - switch (u_fd.type) - { - case FD_TTY: - { + switch (u_fd.type) { + case FD_TTY: { return -ENOSYS; - } - break; - case FD_FS: - { + } break; + case FD_FS: { ret = fs_readdir(u_fd.priv_fd, (struct dirent *)buf); - } - break; + } break; default: return -ENOSYS; } return ret; } +long sys_be_getdents(va_list ap) +{ + long fd; + char *buf; + size_t size; + ARG_3_BE(ap, fd, long, buf, char *, size, long); + + return be_getdents(fd, buf, size); +} diff --git a/mkrtos_user/lib/libc_backend/src/futex_backend.c b/mkrtos_user/lib/libc_backend/src/futex_backend.c index f54a75aaa..2c7f108d1 100644 --- a/mkrtos_user/lib/libc_backend/src/futex_backend.c +++ b/mkrtos_user/lib/libc_backend/src/futex_backend.c @@ -47,14 +47,14 @@ int be_futex(uint32_t *uaddr, int futex_op, uint32_t val, } _try_again: - sys_read_info(SYS_PROT, &sys_info); + sys_read_info(SYS_PROT, &sys_info, 0); st_val = sys_info.sys_tick; tag = futex_ctrl(FUTEX_PROT, uaddr, futex_op, val, total, uaddr2, val3, pt->tid); if (msg_tag_get_val(tag) == -ETIMEDOUT) { umword_t en_val; - sys_read_info(SYS_PROT, &sys_info); + sys_read_info(SYS_PROT, &sys_info, 0); en_val = sys_info.sys_tick; if (en_val - st_val < total) { diff --git a/mkrtos_user/lib/libc_backend/src/misc_backend.c b/mkrtos_user/lib/libc_backend/src/misc_backend.c index 836deff48..433afa51f 100644 --- a/mkrtos_user/lib/libc_backend/src/misc_backend.c +++ b/mkrtos_user/lib/libc_backend/src/misc_backend.c @@ -121,7 +121,7 @@ long be_clock_gettime(clockid_t clk_id, struct timespec *tp) return -ENODEV; } sys_info_t info; - sys_read_info(SYS_PROT, &info); + sys_read_info(SYS_PROT, &info, 0); unsigned long ts = info.sys_tick; diff --git a/mkrtos_user/lib/sys/inc/u_prot.h b/mkrtos_user/lib/sys/inc/u_prot.h index 970578177..5a458d422 100644 --- a/mkrtos_user/lib/sys/inc/u_prot.h +++ b/mkrtos_user/lib/sys/inc/u_prot.h @@ -31,9 +31,9 @@ typedef union msg_tag struct { umword_t flags : 4; // 3bit:代表错误由内核报告 - umword_t msg_buf_len : 5; - umword_t map_buf_len : 2; - umword_t prot : WORD_BITS - 12; + umword_t msg_buf_len : 7; + umword_t map_buf_len : 5; + umword_t prot : WORD_BITS - 16; }; } msg_tag_t; diff --git a/mkrtos_user/lib/sys/inc/u_sys.h b/mkrtos_user/lib/sys/inc/u_sys.h index c891bf535..fcc5a76cd 100644 --- a/mkrtos_user/lib/sys/inc/u_sys.h +++ b/mkrtos_user/lib/sys/inc/u_sys.h @@ -9,7 +9,9 @@ typedef struct sys_info umword_t sys_clk; } sys_info_t; -msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info); +#define SYS_FLAGS_MAP_CPIO_FS 0x01 + +msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info, umword_t flags); msg_tag_t sys_reboot(obj_handler_t obj); msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free); msg_tag_t sys_dis_info(obj_handler_t obj, umword_t irq_inx); @@ -18,13 +20,13 @@ static inline umword_t sys_read_tick(void) { sys_info_t info; - sys_read_info(SYS_PROT, &info); + sys_read_info(SYS_PROT, &info, 0); return info.sys_tick; } static inline umword_t sys_read_clk(void) { sys_info_t info; - sys_read_info(SYS_PROT, &info); + sys_read_info(SYS_PROT, &info, 0); return info.sys_clk; } diff --git a/mkrtos_user/lib/sys/inc/u_thread.h b/mkrtos_user/lib/sys/inc/u_thread.h index 6c9c60d65..c455887c1 100644 --- a/mkrtos_user/lib/sys/inc/u_thread.h +++ b/mkrtos_user/lib/sys/inc/u_thread.h @@ -3,12 +3,12 @@ #include "u_types.h" #include "u_prot.h" -#define MSG_BUG_LEN 128 +#define MSG_BUG_LEN CONFIG_THREAD_MSG_BUG_LEN #define MSG_BUF_RECV_R_FLAGS 0x02U //!< 接收上次发送数据的接收者 #define MSG_BUF_REPLY_FLAGS 0x04U //!< -#define IPC_MSG_SIZE 96 //!< IPC消息大小 -#define MAP_BUF_SIZE 16 //!< 映射消息大小 +#define IPC_MSG_SIZE CONFIG_THREAD_IPC_MSG_LEN //!< IPC消息大小 +#define MAP_BUF_SIZE CONFIG_THREAD_MAP_BUF_LEN //!< 映射消息大小 #define IPC_USER_SIZE 12 //!< 用户态消息大小 typedef struct ipc_msg diff --git a/mkrtos_user/lib/sys/src/u_sys.c b/mkrtos_user/lib/sys/src/u_sys.c index 872386c40..7dcd66759 100644 --- a/mkrtos_user/lib/sys/src/u_sys.c +++ b/mkrtos_user/lib/sys/src/u_sys.c @@ -15,7 +15,7 @@ enum sys_op DIS_IRQ, }; -msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) +msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info, umword_t flags) { register volatile umword_t r0 asm(ARCH_REG_0); register volatile umword_t r1 asm(ARCH_REG_1); @@ -23,7 +23,7 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) register volatile umword_t r3 asm(ARCH_REG_3); mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw, - 0, + flags, 0, 0, 0, diff --git a/mkrtos_user/lib/sys_util/src/u_app_loader.c b/mkrtos_user/lib/sys_util/src/u_app_loader.c index c4ee08d11..47442da12 100644 --- a/mkrtos_user/lib/sys_util/src/u_app_loader.c +++ b/mkrtos_user/lib/sys_util/src/u_app_loader.c @@ -116,7 +116,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar msg_tag_t tag; sys_info_t sys_info; - tag = sys_read_info(SYS_PROT, &sys_info); + tag = sys_read_info(SYS_PROT, &sys_info, 0); if (msg_tag_get_val(tag) < 0) { return -ENOENT; diff --git a/mkrtos_user/lib/sys_util/src/u_elf_loader.c b/mkrtos_user/lib/sys_util/src/u_elf_loader.c index 8abe88d20..3e7c7b471 100644 --- a/mkrtos_user/lib/sys_util/src/u_elf_loader.c +++ b/mkrtos_user/lib/sys_util/src/u_elf_loader.c @@ -128,7 +128,7 @@ int app_load(const char *name, uenv_t *cur_env, pid_t *pid, char *argv[], int ar sys_info_t sys_info; int ret; - tag = sys_read_info(SYS_PROT, &sys_info); + tag = sys_read_info(SYS_PROT, &sys_info, 0); if (msg_tag_get_val(tag) < 0) { return -ENOENT; diff --git a/mkrtos_user/server/fs/cpiofs/fs_rpc.c b/mkrtos_user/server/fs/cpiofs/fs_rpc.c index b99ea8cc2..ded33389a 100644 --- a/mkrtos_user/server/fs/cpiofs/fs_rpc.c +++ b/mkrtos_user/server/fs/cpiofs/fs_rpc.c @@ -1,22 +1,21 @@ +#include "cons_cli.h" +#include "cpiofs.h" +#include "fs_svr.h" +#include "rpc_prot.h" +#include "u_env.h" +#include "u_log.h" #include "u_rpc.h" #include "u_rpc_svr.h" #include "u_sys.h" -#include "fs_svr.h" -#include "cons_cli.h" -#include "u_log.h" -#include "u_env.h" -#include -#include -#include #include -#include #include -#include "rpc_prot.h" -#include "cpiofs.h" +#include +#include +#include +#include static fs_t fs; -typedef struct file_desc -{ +typedef struct file_desc { pid_t pid; addr_t file_addr; size_t file_size; @@ -30,17 +29,14 @@ static file_desc_t fds[CPIO_FS_FD_NR]; static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset, int *fd, int type) { - for (int i = 0; i < CPIO_FS_FD_NR; i++) - { - if (fds[i].file_addr == 0) - { + for (int i = 0; i < CPIO_FS_FD_NR; i++) { + if (fds[i].file_addr == 0) { fds[i].pid = thread_get_src_pid(); fds[i].file_addr = file_addr; fds[i].file_size = file_size; fds[i].offset = offset; fds[i].type = type; - if (fd) - { + if (fd) { *fd = i; } return fds + i; @@ -50,80 +46,67 @@ static file_desc_t *fd_alloc(addr_t file_addr, size_t file_size, ssize_t offset, } static file_desc_t *fd_get(int fd) { - if (fd < 0 || fd >= CPIO_FS_FD_NR) - { + if (fd < 0 || fd >= CPIO_FS_FD_NR) { return NULL; } - if (fds[fd].file_addr == 0) - { + if (fds[fd].file_addr == 0) { return NULL; } - if (fds[fd].pid != thread_get_src_pid()) - { + if (fds[fd].pid != thread_get_src_pid()) { return NULL; } return &fds[fd]; } static void fd_free(int fd) { - if (fd < 0 || fd >= CPIO_FS_FD_NR) - { + if (fd < 0 || fd >= CPIO_FS_FD_NR) { return; } - if (fds[fd].file_addr) - { - if (fds[fd].pid == thread_get_src_pid()) - { + if (fds[fd].file_addr) { + if (fds[fd].pid == thread_get_src_pid()) { fds[fd].file_addr = 0; fds[fd].pid = -1; } } } - +static sys_info_t sys_info; void fs_svr_init(void) { + msg_tag_t tag; + fs_init(&fs); meta_reg_svr_obj(&fs.svr, FS_PROT); + tag = sys_read_info(SYS_PROT, &sys_info, SYS_FLAGS_MAP_CPIO_FS); + assert(msg_tag_get_val(tag) >= 0); } int fs_svr_open(const char *path, int flags, int mode) { msg_tag_t tag; - sys_info_t sys_info; char *o_path; - if (flags & O_RDWR) - { + if (flags & O_RDWR) { return -EACCES; } - if (flags & O_WRONLY) - { + if (flags & O_WRONLY) { return -EACCES; } - if (path[0] == '/') - { + if (path[0] == '/') { path++; } - tag = sys_read_info(SYS_PROT, &sys_info); - if (msg_tag_get_val(tag) < 0) - { - return -ENOENT; - } umword_t size; int type; umword_t addr; int ret = cpio_find_file((umword_t)sys_info.bootfs_start_addr, (umword_t)(-1), path, &size, &type, &addr); - if (ret < 0) - { + if (ret < 0) { return -ENOENT; } int fd; // 找到指定文件 file_desc_t *fdp = fd_alloc(addr, size, 0, &fd, type); - if (!fdp) - { + if (!fdp) { return -ENOMEM; } strncpy(fdp->open_name, path, 32); @@ -136,20 +119,17 @@ int fs_svr_read(int fd, void *buf, size_t len) { file_desc_t *fdp = fd_get(fd); - if (!fdp) - { + if (!fdp) { return -ENOENT; } - if (fdp->type != 0) - { + if (fdp->type != 0) { return -EACCES; } size_t remain_size = fdp->file_size - fdp->offset; size_t read_size = 0; read_size = MIN(remain_size, len); - if (read_size) - { + if (read_size) { memcpy(buf, (void *)(fdp->file_addr + fdp->offset), read_size); fdp->offset += read_size; } @@ -159,8 +139,7 @@ int fs_svr_write(int fd, void *buf, size_t len) { file_desc_t *fdp = fd_get(fd); - if (!fdp) - { + if (!fdp) { return -ENOENT; } return -EACCES; @@ -174,38 +153,29 @@ int fs_svr_lseek(int fd, int offs, int whence) file_desc_t *file = fd_get(fd); int new_offs = 0; - if (!file) - { + if (!file) { return -ENOENT; } - if (file->type != 0) - { + if (file->type != 0) { return -EACCES; } - switch (whence) - { + switch (whence) { case SEEK_SET: new_offs = offs; break; - case SEEK_END: - { + case SEEK_END: { new_offs = file->file_size + offs; - } - break; - case SEEK_CUR: - { + } break; + case SEEK_CUR: { new_offs = offs + file->offset; - } - break; + } break; default: return -EINVAL; } - if (new_offs > file->file_size) - { + if (new_offs > file->file_size) { new_offs = file->file_size; } - if (new_offs < 0) - { + if (new_offs < 0) { new_offs = 0; } file->offset = new_offs; @@ -225,12 +195,10 @@ int fs_svr_readdir(int fd, dirent_t *dir) file_desc_t *file = fd_get(fd); int new_offs = 0; - if (!file) - { + if (!file) { return -ENOENT; } - if (file->type != 1) - { + if (file->type != 1) { return -EACCES; } umword_t size; @@ -239,8 +207,7 @@ int fs_svr_readdir(int fd, dirent_t *dir) const char *next_path; int ret = cpio_find_next(file->file_addr, file->open_name, &size, &type, &next_addr, &next_path); - if (ret < 0) - { + if (ret < 0) { return -ENOENT; } file->file_addr = next_addr; @@ -267,8 +234,7 @@ int fs_svr_fstat(int fd, stat_t *stat) { file_desc_t *file = fd_get(fd); - if (!file) - { + if (!file) { return -ENOENT; } stat->st_size = file->file_size; diff --git a/mkrtos_user/server/init/src/parse_cfg.c b/mkrtos_user/server/init/src/parse_cfg.c index 4e35a7157..31dba34dc 100644 --- a/mkrtos_user/server/init/src/parse_cfg.c +++ b/mkrtos_user/server/init/src/parse_cfg.c @@ -37,7 +37,7 @@ int parse_cfg(const char *parse_cfg_file_name, uenv_t *env) msg_tag_t tag; sys_info_t sys_info; - tag = sys_read_info(SYS_PROT, &sys_info); + tag = sys_read_info(SYS_PROT, &sys_info, 0); if (msg_tag_get_val(tag) < 0) { printf("read info is errno.\n");