diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 000000000..3f5ed780f --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "mkrtos_user/lib/mkrtos-musl"] + path = mkrtos_user/lib/mkrtos-musl + url = https://gitee.com/IsYourGod/mkrtos-musl.git diff --git a/.vscode/settings.json b/.vscode/settings.json index 0285c1bb4..da38e018f 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,351 +1,10 @@ { "files.associations": { - ".*": ".cc", - "debug.h": "c", - "mpu_armv7.h": "c", - "core_cm3.h": "c", - "mpu.h": "c", - "gd32f10x.h": "c", - "mkrtos.h": "c", - "config.h": "c", - "assert.h": "c", - "dev_object.h": "c", - "sys.h": "c", - "gd32f10x_libopt.h": "c", - "delay.h": "c", - "gd32_sys.h": "c", - "stm32_sys.h": "c", - "stm32f2xx_conf.h": "c", - "sched.h": "c", - "stdio.h": "c", - "stm32f2xx.h": "c", - "tty.h": "c", - "fs.h": "c", - "system_stm32f2xx.h": "c", - "cpio.h": "c", - "dev.h": "c", - "knl_service.h": "c", - "sp.h": "c", - "fcntl.h": "c", - "stat.h": "c", "types.h": "c", - "paths.h": "c", - "endian.h": "c", - "dietfeatures.h": "c", - "stackgap-common.h": "c", "string.h": "c", - "features.h": "c", - "typeinfo": "c", - "embfeatures.h": "c", - "unistd.h": "c", - "fp_lib.h": "c", - "stdint.h": "c", - "int_math.h": "c", - "int_endianness.h": "c", - "cstdio": "c", - "math.h": "c", - "ieeefp.h": "c", - "int_lib.h": "c", - "cdefs.h": "c", - "softfloat.h": "c", - "sfp-machine.h": "c", - "soft-fp.h": "c", - "quad.h": "c", - "double.h": "c", - "*.inc": "c", - "half.h": "c", - "softfloat-for-gcc.h": "c", - "mkrtos_su.h": "c", - "array": "c", - "functional": "c", - "istream": "c", - "ostream": "c", - "tuple": "c", - "type_traits": "c", - "utility": "c", - "arch.h": "c", - "list.h": "c", - "typeindex": "c", - "mm.h": "c", - "atomic.h": "c", - "slist.h": "c", - "exec.h": "c", - "bitset": "c", - "knl_mutex.h": "c", - "knl_msg.h": "c", - "msg.h": "c", - "reboot.h": "c", - "random": "cpp", - "util.h": "c", - "factory.h": "c", - "prot.h": "c", - "ram_limit.h": "c", - "task.h": "c", - "mm_wrap.h": "c", - "ctype.h": "c", - "kobject.h": "c", - "misc.h": "c", - "cpulock.h": "c", - "init.h": "c", - "uart.h": "c", - "stdarg.h": "c", - "xprintf.h": "c", - "globals.h": "c", - "thread.h": "c", - "chrono": "c", - "ratio": "c", - "log.h": "c", - "syscall.h": "c", - "scheduler.h": "c", - "thread_armv7m.h": "c", - "printk.h": "c", - "obj_space.h": "c", - "u_types.h": "c", - "u_log.h": "c", - "u_prot.h": "c", - "u_arch.h": "c", - "errno.h": "c", - "crt_arch.h": "c", - "stdio_impl.h": "c", - "uio.h": "c", - "fs_backend.h": "c", - "mm_space.h": "c", - "mm_page.h": "c", - "u_task.h": "c", - "cpiofs.h": "c", - "u_factory.h": "c", - "u_thread.h": "c", - "u_app.h": "c", - "u_util.h": "c", - "u_mm.h": "c", - "u_ipc.h": "c", - "ref.h": "c", - "map.h": "c", - "ipc.h": "c", - "err.h": "c", - "diskio.h": "c", - "ff.h": "c", - "u_hd_man.h": "c", - "pthread.h": "c", - "*.in": "cpp", - "syscall_backend.h": "c", - "misc_backend.h": "c", - "queue.h": "c", - "irq.h": "c", - "irq_sender.h": "c", - "u_irq_sender.h": "c", - "u_env.h": "c", - "stddef.h": "c", - "u_rpc.h": "c", - "namespace.h": "c", - "u_rpc_svr.h": "c", - "rpc_prot.h": "c", - "ns_types.h": "c", - "ns_svr.h": "c", - "u_rpc_2.h": "c", - "ns_cli.h": "c", - "fs_cli.h": "c", - "u_rpc_1.h": "c", - "__config": "c", - "stm32f10x.h": "c", - "variant": "c", - "soft_iic.h": "c", - "sysinfo.h": "c", - "u_sleep.h": "c", - "hmi_user_uart.h": "c", - "usart3.h": "c", - "u_local_thread.h": "c", - "string": "c", - "string_view": "c", - "vector": "c", - "cstddef": "c", - "usart2.h": "c", - "hmi_lcd_process.h": "c", - "stdlib.h": "c", - "auto_close.h": "c", - "u_sys.h": "c", - "relay.h": "c", - "spi1.h": "c", - "led.h": "c", - "adc.h": "c", - "w25q64.h": "c", - "__bit_reference": "c", - "unordered_map": "c", - "__strerror.h": "c", - "sstream": "c", - "u_drv.h": "c", - "__node_handle": "c", - "__hash_table": "c", - "__tuple": "c", - "limits": "c", - "compare": "c", - "algorithm": "c", - "music_control.h": "c", - "__split_buffer": "c", - "initializer_list": "c", - "spi2.h": "c", - "wk2xx.h": "c", - "cwchar": "c", - "test.h": "c", - "uart5.h": "c", - "wk2xx_hw.h": "c", - "cstdlib": "c", - "locale": "c", - "uart4.h": "c", - "u_queue.h": "c", - "dirent.h": "c", - "iosfwd": "c", - "drv_adc.h": "c", - "mrboard.h": "c", - "mrapi.h": "c", - "device_port.h": "c", - "spi.h": "c", - "mr_board.h": "c", - "mr_config.h": "c", - "drv_svr.h": "c", - "drv_types.h": "c", - "ios": "c", - "mr_def.h": "c", - "drv_rpc.h": "c", - "rtdbg.h": "c", - "rtdevice.h": "c", - "rtthread.h": "c", - "driver.h": "c", - "char.h": "c", - "block.h": "c", - "graphic.h": "c", - "mtd.h": "c", - "net.h": "c", - "ringbuffer.h": "c", - "completion.h": "c", - "dataqueue.h": "c", - "workqueue.h": "c", - "waitqueue.h": "c", - "pipe.h": "c", - "ringblk_buf.h": "c", - "poll.h": "c", - "pin.h": "c", - "rtconfig.h": "c", - "bus.h": "c", - "dm.h": "c", - "platform.h": "c", - "rtdef.h": "c", - "rtc.h": "c", - "board.h": "c", - "drv_common.h": "c", - "drv_can.h": "c", - "drv_gpio.h": "c", - "drv_config.h": "c", - "dma_config.h": "c", - "drv_lptim.h": "c", - "uart_config.h": "c", - "drv_crypto.h": "c", - "drv_log.h": "c", - "drv_usart.h": "c", - "__locale": "c", - "__string": "c", - "limits.h": "c", - "ctime": "c", - "pthread_impl.h": "c", - "time.h": "c", - "u_thread_util.h": "c", - "__mutex_base": "c", - "mutex": "c", - "__threading_support": "c", - "spinlock.h": "c", - "mr_api.h": "c", - "u_app_loader.h": "c", - "process_manager.h": "c", - "fs_svr.h": "c", - "pm_svr.h": "c", - "cons_cli.h": "c", - "access.h": "c", - "shell.h": "c", - "shell_cfg.h": "c", - "__memory": "c", - "optional": "c", - "system_error": "c", - "__dirent.h": "c", - "shell_fs.h": "c", - "shell_passthrough.h": "c", - "u_slist.h": "c", - "atomic": "c", - "futex.h": "c", - "u_rpc_buf.h": "c", - "pm_cli.h": "c", - "u_sig.h": "c", - "u_err.h": "c", - "core_cmfunc.h": "c", - "stm32f4xx.h": "c", - "malloc.h": "c", - "ethernetif.h": "c", - "netif.h": "c", - "netconf.h": "c", - "dhcp.h": "c", - "u_intr.h": "c", - "etharp.h": "c", - "pbuf.h": "c", - "stm32f4x7_eth.h": "c", - "lan8270.h": "c", - "dm9000.h": "c", - "mk_sys.h": "c", - "sram.h": "c", - "semaphore.h": "c", - "libc.h": "c", - "printf.h": "c", - "printf_config.h": "c", - "net_drv_svr.h": "c", - "net_drv_types.h": "c", - "__tree": "c", - "filesystem": "c", - "u_share_mem.h": "c", - "fs_rpc.h": "c", - "net_drv_cli.h": "c", - "deque": "c", - "map": "c", - "regex": "c", - "set": "c", - "stack": "c", - "stm32f10x_conf.h": "c", - "system_swm341.h": "c", - "swm341.h": "c", - "mpu_armv8.h": "c", - "stm32f4xx_conf.h": "c", - "knl_misc.h": "c", - "dev_touch.h": "c", - "version.h": "c", - "tp_ft5206.h": "c", - "radio_button_widge.h": "c", - "x_types.h": "c", - "mem_dev.h": "c", - "group_widge.h": "c", - "xwindows.h": "c", - "color.h": "c", - "arm_math.h": "c", - "arm_const_structs.h": "c", - "arm_common_tables.h": "c", - "widget_define.h": "c", - "paint.h": "c", - "gui_interface_extern.h": "c", - "gui.h": "c", - "gui_timeout.h": "c", - "bitmap.h": "c", - "early_boot.h": "c", - "sysregs.h": "c", - "types_asm.h": "c", - "pager.h": "c", - "thread_arch.h": "c", - "aarch64_ptregs.h": "c", - "psci.h": "c", - "buddy.h": "c", - "atomics.h": "c", - "asm_config.h": "c", - "slab.h": "c", - "arm_local_reg.h": "c", - "timer.h": "c", - "arm_gicv2.h": "c", - "sched_arch.h": "c", - "thread_task_arch.h": "c" + "cpio.h": "c", + "elf64.h": "c", + "aarch64_ptregs.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/CMakeLists.txt b/CMakeLists.txt index 10fec5300..77ef62c19 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -33,6 +33,6 @@ set(compile_time "${DATE}\" \"${TIME}" CACHE STRING " " FORCE) add_subdirectory(mkrtos_bootstrap) add_subdirectory(mkrtos_knl) # add_subdirectory(mkrtos_img) -# add_subdirectory(mkrtos_user) +add_subdirectory(mkrtos_user) diff --git a/mkrtos_configs/aarch64_qemu_defconfig b/mkrtos_configs/aarch64_qemu_defconfig index 4c4cd30f3..9b2b50077 100644 --- a/mkrtos_configs/aarch64_qemu_defconfig +++ b/mkrtos_configs/aarch64_qemu_defconfig @@ -117,4 +117,4 @@ CONFIG_CPU=4 CONFIG_THREAD_BLOCK_SIZE=0x1000 CONFIG_PAGE_SHIFT=12 CONFIG_MMU=y -CONFIG_KNL_TEST=y +CONFIG_KNL_TEST=n diff --git a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h index 1437e032e..c80d84b69 100755 --- a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h +++ b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h @@ -11,9 +11,10 @@ #pragma once #include "types.h" -#include "arch.h" #include #include + +#define ARCH_WORD_SIZE 64 #define LOG_INTR_NO 37 // USART1_IRQn /// @brief 线程信息 diff --git a/mkrtos_knl/inc/knl/elf64.h b/mkrtos_knl/inc/knl/elf64.h new file mode 100644 index 000000000..2a2320392 --- /dev/null +++ b/mkrtos_knl/inc/knl/elf64.h @@ -0,0 +1,4 @@ +#pragma once + +#include +int elf_load(umword_t elf_data); \ No newline at end of file diff --git a/mkrtos_knl/inc/lib/cpio.h b/mkrtos_knl/inc/lib/cpio.h new file mode 100644 index 000000000..eafa7092a --- /dev/null +++ b/mkrtos_knl/inc/lib/cpio.h @@ -0,0 +1,34 @@ +#pragma once +#include +//! 26bytes +#pragma pack(1) +typedef struct cpio_fs +{ + char c_magic[6]; + char c_ino[8]; + char c_mode[8]; + char c_uid[8]; + char c_gid[8]; + char c_nlink[8]; + char c_mtime[8]; + char c_filesize[8]; + char c_devmajor[8]; + char c_devminor[8]; + char c_rdevmajor[8]; + char c_rdevminor[8]; + char c_namesize[8]; + char c_check[8]; +} cpio_fs_t; + +static inline int64_t check_magic(char *magic) +{ + if (magic[0] == '0' && magic[1] == '7' && magic[2] == '0' && + magic[3] == '7' && magic[4] == '0' && magic[5] == '1') + { + return 0; + } + return -1; +} + +int htoi(char *str, int len); +umword_t cpio_find_file(umword_t st, umword_t en, const char *name); diff --git a/mkrtos_knl/inc/lib/string.h b/mkrtos_knl/inc/lib/string.h index ac98f5c93..bb9b6089e 100755 --- a/mkrtos_knl/inc/lib/string.h +++ b/mkrtos_knl/inc/lib/string.h @@ -2,6 +2,7 @@ #include "types.h" +int memcmp(const void *vl, const void *vr, size_t n); void *memccpy(void *dst, const void *src, int c, size_t count); void memcpy(void *dst, void *src, size_t len); void *memset(void *dst, char s, size_t count); diff --git a/mkrtos_knl/knl/elf64.c b/mkrtos_knl/knl/elf64.c new file mode 100644 index 000000000..c9f9134c3 --- /dev/null +++ b/mkrtos_knl/knl/elf64.c @@ -0,0 +1,118 @@ + +#include +typedef uint16_t Elf64_Half; +typedef uint32_t Elf64_Word; +typedef uint64_t Elf64_Addr; +typedef uint64_t Elf64_Off; +typedef uint64_t Elf64_Xword; +#define EI_NIDENT (16) + +#pragma pack(1) +typedef struct +{ + unsigned char e_ident[EI_NIDENT]; /* 一个字节数组用来确认文件是否是一个ELF文件 */ + Elf64_Half e_type; /* 描述文件是,可执行文件elf=2,重定位so=3 */ + Elf64_Half e_machine; /* 目标主机架构 */ + Elf64_Word e_version; /* ELF文件格式的版本 */ + Elf64_Addr e_entry; /* 入口点虚拟地址 */ + Elf64_Off e_phoff; /* 程序头文件偏移 */ + Elf64_Off e_shoff; /* 节头表文件偏移 */ + Elf64_Word e_flags; /* ELF文件标志 */ + Elf64_Half e_ehsize; /* ELF头大小 */ + Elf64_Half e_phentsize; /* 程序头大小 */ + Elf64_Half e_phnum; /* 程序头表计数 */ + Elf64_Half e_shentsize; /* 节头表大小 */ + Elf64_Half e_shnum; /* 节头表计数 */ + Elf64_Half e_shstrndx; /* 字符串表索引节头 */ +} Elf64_Ehdr; +#pragma pack(1) +typedef struct +{ + Elf64_Word p_type; /* Segment type */ + Elf64_Word p_flags; /* Segment flags */ + Elf64_Off p_offset; /* Segment file offset */ + Elf64_Addr p_vaddr; /* Segment virtual address */ + Elf64_Addr p_paddr; /* Segment physical address */ + Elf64_Xword p_filesz; /* Segment size in file */ + Elf64_Xword p_memsz; /* Segment size in memory */ + Elf64_Xword p_align; /* Segment alignment */ +} Elf64_Phdr; +#define PT_NULL 0 /* Program header table entry unused */ +#define PT_LOAD 1 /* Loadable program segment */ +#define PT_DYNAMIC 2 /* Dynamic linking information */ +#define PT_INTERP 3 /* Program interpreter */ +#define PT_NOTE 4 /* Auxiliary information */ +#define PT_SHLIB 5 /* Reserved */ +#define PT_PHDR 6 /* Entry for header table itself */ +#define PT_TLS 7 /* Thread-local storage segment */ +#define PT_NUM 8 /* Number of defined types */ +#define PT_LOOS 0x60000000 /* Start of OS-specific */ +#define PT_GNU_EH_FRAME 0x6474e550 /* GCC .eh_frame_hdr segment */ +#define PT_GNU_STACK 0x6474e551 /* Indicates stack executability */ +#define PT_GNU_RELRO 0x6474e552 /* Read-only after relocation */ +#define PT_LOSUNW 0x6ffffffa +#define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */ +#define PT_SUNWSTACK 0x6ffffffb /* Stack segment */ +#define PT_HISUNW 0x6fffffff +#define PT_HIOS 0x6fffffff /* End of OS-specific */ +#define PT_LOPROC 0x70000000 /* Start of processor-specific */ +#define PT_HIPROC 0x7fffffff /* End of processor-specific */ + +#define ET_NONE 0 +#define ET_REL 1 +#define ET_EXEC 2 +#define ET_DYN 3 +#define ET_CORE 4 +#define ET_NUM 5 +#define ET_LOOS 0xfe00 +#define ET_HIOS 0xfeff +#define ET_LOPROC 0xff00 +#define ET_HIPROC 0xffff + +#define ELFMAG "\177ELF" +#define SELFMAG 4 +#include +#include +int elf_check(Elf64_Ehdr *ehdr) +{ + if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) + { + return -1; + } + + if (ehdr->e_type != ET_EXEC) + { + return -1; + } + /*TODO:check arch.*/ + + return 0; +} + +int elf_load(umword_t elf_data) +{ + int ret; + Elf64_Ehdr *elf_header; + + elf_header = (Elf64_Ehdr *)elf_data; + + ret = elf_check(elf_header); + if (ret != 0) + { + return ret; + } + int size = elf_header->e_phentsize; + Elf64_Phdr *elf_phdr = (Elf64_Phdr *)(elf_header->e_phoff + elf_data); + + for (int i = 0; i < elf_header->e_phnum; i++, elf_phdr++) + { + if (elf_phdr->p_type == PT_LOAD) + { + printk("[] paddr:0x%x vaddr:0x%x memsize:%d filesize:%d\n", + elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz, elf_phdr->p_filesz); + // 申请内存,拷贝数据,然后转移给ini_task + // memcpy((char *)elf_phdr->p_paddr, (char *)(elf_data + elf_phdr->p_offset), + // elf_phdr->p_filesz); + } + } +} diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 9373e90ac..721a34867 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -22,10 +22,14 @@ #include "mm_wrap.h" #include "thread_task_arch.h" #include "knl_misc.h" - +#include #if IS_ENABLED(CONFIG_KNL_TEST) #include #endif +#if ARCH_WORD_SIZE == 64 +#include +#endif +#include static uint8_t knl_msg_buf[THREAD_MSG_BUG_LEN]; static thread_t *knl_thread; @@ -101,7 +105,6 @@ static void knl_init_1(void) } INIT_STAGE1(knl_init_1); - /** * 初始化init线程 * 初始化用户态任务 @@ -115,33 +118,41 @@ static void knl_init_2(void) #if IS_ENABLED(CONFIG_KNL_TEST) knl_test(); #else - init_thread = thread_create(&root_factory_get()->limit); - assert(init_thread); - init_task = task_create(&root_factory_get()->limit, FALSE); - assert(init_task); - app_info_t *app = app_info_get((void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET)); - // 申请init的ram内存 - assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN) >= 0); - void *sp_addr = (char *)init_task->mm_space.mm_block + app->i.stack_offset - app->i.data_offset; - void *sp_addr_top = (char *)sp_addr + app->i.stack_size; - thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size); - thread_bind(init_thread, &init_task->kobj); - thread_user_pf_set(init_thread, (void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET), (void *)((umword_t)sp_addr_top - 8), - init_task->mm_space.mm_block, 0); - assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, THREAD_PROT))); - assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, TASK_PROT))); - for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++) - { - kobject_t *kobj = global_get_kobj(i); - if (kobj) - { - assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, i))); - } - } - init_thread->sche.prio = 2; - init_task->pid = 0; - thread_ready(init_thread, FALSE); + extern mword_t cpio_images; + + umword_t ret_addr; + + ret_addr = cpio_find_file(cpio_images, (umword_t)(-1), "init.elf"); + assert(ret_addr); + elf_load(ret_addr); + // init_thread = thread_create(&root_factory_get()->limit); + // assert(init_thread); + // init_task = task_create(&root_factory_get()->limit, FALSE); + // assert(init_task); + // app_info_t *app = app_info_get((void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET)); + // // 申请init的ram内存 + // assert(task_alloc_base_ram(init_task, &root_factory_get()->limit, app->i.ram_size + THREAD_MSG_BUG_LEN) >= 0); + // void *sp_addr = (char *)init_task->mm_space.mm_block + app->i.stack_offset - app->i.data_offset; + // void *sp_addr_top = (char *)sp_addr + app->i.stack_size; + + // thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size); + // thread_bind(init_thread, &init_task->kobj); + // thread_user_pf_set(init_thread, (void *)(CONFIG_KNL_TEXT_ADDR + CONFIG_INIT_TASK_OFFSET), (void *)((umword_t)sp_addr_top - 8), + // init_task->mm_space.mm_block, 0); + // assert(obj_map_root(&init_thread->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, THREAD_PROT))); + // assert(obj_map_root(&init_task->kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, TASK_PROT))); + // for (int i = FACTORY_PORT_START; i < FACTORY_PORT_END; i++) + // { + // kobject_t *kobj = global_get_kobj(i); + // if (kobj) + // { + // assert(obj_map_root(kobj, &init_task->obj_space, &root_factory_get()->limit, vpage_create3(KOBJ_ALL_RIGHTS, 0, i))); + // } + // } + // init_thread->sche.prio = 2; + // init_task->pid = 0; + // thread_ready(init_thread, FALSE); #endif } INIT_STAGE2(knl_init_2); diff --git a/mkrtos_knl/lib/cpio.c b/mkrtos_knl/lib/cpio.c new file mode 100644 index 000000000..2ed38e959 --- /dev/null +++ b/mkrtos_knl/lib/cpio.c @@ -0,0 +1,82 @@ +#include "mk_sys.h" +#include "cpio.h" +#include +#define MIN(a, b) ((a) < (b) ? (a) : (b)) //!< 最小值 +#define ALIGN(mem, align) (((mem) + ((align) - 1)) & (~((align) - 1))) //!< 向上对齐 + +umword_t cpio_find_file(umword_t st, umword_t en, const char *name) +{ + uint8_t rByte; + int32_t bk_inx; + cpio_fs_t *file_info; + + for (umword_t i = st; st < en;) + { + file_info = (cpio_fs_t *)i; + + if (check_magic((char *)file_info) < 0) + { + return 0; + } + int name_size = htoi(file_info->c_namesize, 8); + const char *f_name = (char *)(i + sizeof(cpio_fs_t)); + if (strcmp(f_name, name) == 0) + { + return (mword_t)(ALIGN(i + sizeof(cpio_fs_t) + name_size, 4)); + } + + if (strcmp("TRAILER!!!", f_name) == 0) + { + return 0; + } + int file_size = htoi(file_info->c_filesize, 8); + + i = ALIGN(ALIGN(i + sizeof(cpio_fs_t) + name_size, 4) + + file_size, + 4); + } + return 0; +} + +int htoi(char *str, int len) +{ + int n = 0; + int i = 0; + + if (str == NULL || len <= 0) + return -1; + for (i = 0; i < len; i++) + { + if (str[i] != '0') + { + break; + } + } + str += i; + while (1) + { + if (*str >= '0' && *str <= '9') + { + n = 16 * n + (*str - '0'); + } + else if (*str >= 'A' && *str <= 'F') // 十六进制还要判断字符是不是在A-F或者a-f之间 + { + n = 16 * n + (*str - 'A' + 10); + } + else if (*str >= 'a' && *str <= 'f') + { + n = 16 * n + (*str - 'a' + 10); + } + else + { + break; + } + str++; + i++; + if (i >= len) + { + break; + } + } + return n; +} diff --git a/mkrtos_knl/lib/string.c b/mkrtos_knl/lib/string.c index f3b2af3a0..484cf6fa2 100755 --- a/mkrtos_knl/lib/string.c +++ b/mkrtos_knl/lib/string.c @@ -1,6 +1,13 @@ #include "types.h" #include "string.h" + +int memcmp(const void *vl, const void *vr, size_t n) +{ + const unsigned char *l=vl, *r=vr; + for (; n && *l == *r; n--, l++, r++); + return n ? *l-*r : 0; +} void *memccpy(void *dst, const void *src, int c, size_t count) { char *a = dst; diff --git a/mkrtos_user/lib/CMakeLists.txt b/mkrtos_user/lib/CMakeLists.txt index ef46a2f05..0c525d0fd 100644 --- a/mkrtos_user/lib/CMakeLists.txt +++ b/mkrtos_user/lib/CMakeLists.txt @@ -1,22 +1,32 @@ cmake_minimum_required(VERSION 3.13) -# -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ --fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ -" ) -set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) -# add_subdirectory(dietlibc) + add_subdirectory(sys) -add_subdirectory(sys_util) -add_subdirectory(sys_svr) -add_subdirectory(modbus) -add_subdirectory(stm32f1_bsp) -add_subdirectory(libc_backend) -add_subdirectory(mlibc) -add_subdirectory(cpio) -add_subdirectory(util) -add_subdirectory(mr) -add_subdirectory(lwip) -add_subdirectory(printf) -add_subdirectory(letter-shell/demo/mkrtos) -# add_subdirectory(at_device) + +if (${CONFIG_ARCH} STREQUAL "cortex-m3" OR + ${CONFIG_ARCH} STREQUAL "cortex-m4" OR + ${CONFIG_ARCH} STREQUAL "cortex-m33" + ) + # -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ + -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ + " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ + -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ + " ) + # add_subdirectory(dietlibc) + add_subdirectory(sys_util) + add_subdirectory(sys_svr) + add_subdirectory(modbus) + add_subdirectory(stm32f1_bsp) + add_subdirectory(libc_backend) + add_subdirectory(mlibc) + add_subdirectory(cpio) + add_subdirectory(util) + add_subdirectory(mr) + add_subdirectory(lwip) + add_subdirectory(printf) + add_subdirectory(letter-shell/demo/mkrtos) + # add_subdirectory(at_device) +elseif(${CONFIG_ARCH} STREQUAL "aarch64") +#TODO: +endif() \ No newline at end of file diff --git a/mkrtos_user/lib/mkrtos-musl b/mkrtos_user/lib/mkrtos-musl new file mode 160000 index 000000000..7ada6dde6 --- /dev/null +++ b/mkrtos_user/lib/mkrtos-musl @@ -0,0 +1 @@ +Subproject commit 7ada6dde6f9dc6a2836c3d92c2f762d35fd229e0 diff --git a/mkrtos_user/lib/sys/CMakeLists.txt b/mkrtos_user/lib/sys/CMakeLists.txt index bcdf33df7..32ad5a939 100644 --- a/mkrtos_user/lib/sys/CMakeLists.txt +++ b/mkrtos_user/lib/sys/CMakeLists.txt @@ -1,14 +1,9 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ --fPIC -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ -" ) -set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) - - -file(GLOB_RECURSE deps *.c *.S) +file(GLOB deps src/*.c src/*.S) +file(GLOB deps_arch ${CONFIG_ARCH}/*.c ${CONFIG_ARCH}/*.S) +file(APPEND deps deps_arch) add_library( sys STATIC diff --git a/mkrtos_user/lib/sys/deps b/mkrtos_user/lib/sys/deps new file mode 100644 index 000000000..54082f381 --- /dev/null +++ b/mkrtos_user/lib/sys/deps @@ -0,0 +1 @@ +deps_archdeps_archdeps_archdeps_arch \ No newline at end of file diff --git a/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S b/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S new file mode 100644 index 000000000..69c854096 --- /dev/null +++ b/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S @@ -0,0 +1,10 @@ +.text + +/* +int mk_syscall(int nr, ...) +*/ +.global mk_syscall +.type mk_syscall, %function +mk_syscall: + hvc 0 + ret diff --git a/mkrtos_user/lib/sys/src/syscall.S b/mkrtos_user/lib/sys/src/cortex-m3/syscall_armv7_8m.S similarity index 100% rename from mkrtos_user/lib/sys/src/syscall.S rename to mkrtos_user/lib/sys/src/cortex-m3/syscall_armv7_8m.S diff --git a/mkrtos_user/lib/sys/src/cortex-m33/syscall_armv7_8m.S b/mkrtos_user/lib/sys/src/cortex-m33/syscall_armv7_8m.S new file mode 100644 index 000000000..fc8be995f --- /dev/null +++ b/mkrtos_user/lib/sys/src/cortex-m33/syscall_armv7_8m.S @@ -0,0 +1,19 @@ +.syntax unified +.text + +/* +int mk_syscall(int nr, ...) +*/ +.global mk_syscall +.type mk_syscall, %function +mk_syscall: + push {r4-r7} + mov r7, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + add r6, sp,#16 + ldmia r6,{r3-r5} + svc 128 + pop {r4-r7} + bx lr diff --git a/mkrtos_user/lib/sys/src/cortex-m4/syscall_armv7_8m.S b/mkrtos_user/lib/sys/src/cortex-m4/syscall_armv7_8m.S new file mode 100644 index 000000000..fc8be995f --- /dev/null +++ b/mkrtos_user/lib/sys/src/cortex-m4/syscall_armv7_8m.S @@ -0,0 +1,19 @@ +.syntax unified +.text + +/* +int mk_syscall(int nr, ...) +*/ +.global mk_syscall +.type mk_syscall, %function +mk_syscall: + push {r4-r7} + mov r7, r0 + mov r0, r1 + mov r1, r2 + mov r2, r3 + add r6, sp,#16 + ldmia r6,{r3-r5} + svc 128 + pop {r4-r7} + bx lr diff --git a/mkrtos_user/server/CMakeLists.txt b/mkrtos_user/server/CMakeLists.txt index bd19d04c4..b2c414b37 100644 --- a/mkrtos_user/server/CMakeLists.txt +++ b/mkrtos_user/server/CMakeLists.txt @@ -1,13 +1,16 @@ cmake_minimum_required(VERSION 3.13) - +if (${CONFIG_ARCH} STREQUAL "cortex-m3" OR + ${CONFIG_ARCH} STREQUAL "cortex-m4" OR + ${CONFIG_ARCH} STREQUAL "cortex-m33" + ) # -n -pie -fpie -fpic # -msingle-pic-base -mno-pic-data-is-text-relative set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} \ -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ - -D__dietlibc__ -D__arm__ -D__WORDSIZE=32 -D__ARM_ARCH_7M__ \ ") -set(CMAKE_ASM_FLAGS ${CMAKE_C_FLAGS}) - +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ +-fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ +" ) include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc ) @@ -22,3 +25,6 @@ add_subdirectory(test) # add_subdirectory(net) # add_subdirectory(tcc-0.9.27) add_subdirectory(tinycc-arm-thumb) +elseif(${CONFIG_ARCH} STREQUAL "aarch64" ) +#TODO: +endif() diff --git a/setting.cmake b/setting.cmake index c29ffd114..1f4870b3e 100755 --- a/setting.cmake +++ b/setting.cmake @@ -27,7 +27,10 @@ message(======="CPU_TYPE=${CONFIG_CPU_TYPE}") # -mfloat-abi=soft -u _printf_float -lc -lrdimon #-mfpu=fpv5-sp-d16 -if (${CONFIG_ARCH} STREQUAL "cortex-m3" OR ${CONFIG_ARCH} STREQUAL "cortex-m4") +if (${CONFIG_ARCH} STREQUAL "cortex-m3" OR + ${CONFIG_ARCH} STREQUAL "cortex-m4" OR + ${CONFIG_ARCH} STREQUAL "cortex-m33" + ) include(armv7_8.cmake) elseif(${CONFIG_ARCH} STREQUAL "aarch64" ) include(aarch64.cmake)