diff --git a/.vscode/settings.json b/.vscode/settings.json index da38e018f..4794f5afe 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -4,7 +4,37 @@ "string.h": "c", "cpio.h": "c", "elf64.h": "c", - "aarch64_ptregs.h": "c" + "aarch64_ptregs.h": "c", + "condition_variable": "c", + "future": "c", + "u_arch.h": "c", + "u_util.h": "c", + "task.h": "c", + "assert.h": "c", + "mm_page.h": "c", + "util.h": "c", + "pager.h": "c", + "*.tcc": "c", + "slab.h": "c", + "array": "c", + "bitset": "c", + "string_view": "c", + "initializer_list": "c", + "regex": "c", + "utility": "c", + "crt_arch.h": "c", + "pthread_impl.h": "c", + "features.h": "c", + "futex_queue.h": "c", + "futex.h": "c", + "errno.h": "c", + "syscall_backend.h": "c", + "limits.h": "c", + "pthread.h": "c", + "u_sys.h": "c", + "arch.h": "c", + "*.in": "c", + "buddy.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/Kconfig b/Kconfig index 97a3e9270..888d4a02f 100644 --- a/Kconfig +++ b/Kconfig @@ -17,7 +17,9 @@ config ARCH config FLOAT_TYPE string "float type is soft or hard" default "soft" - +config ELF_LAUNCH + bool "elf app launch" + default n config RTT_DIR string "" default "./" diff --git a/mkrtos_bootstrap/bsp/AARCH64_QEMU/CMakeLists.txt b/mkrtos_bootstrap/bsp/AARCH64_QEMU/CMakeLists.txt index 114221744..c68bc2bd7 100755 --- a/mkrtos_bootstrap/bsp/AARCH64_QEMU/CMakeLists.txt +++ b/mkrtos_bootstrap/bsp/AARCH64_QEMU/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required(VERSION 3.13) file(GLOB_RECURSE deps *.S *.s *.C *.c) - +list(REMOVE_ITEM deps ${CMAKE_CURRENT_LIST_DIR}/link.lds.S) add_library(boot_bsp STATIC ${deps}) target_include_directories( boot_bsp @@ -12,3 +12,13 @@ target_include_directories( target_link_libraries(boot_bsp PRIVATE ) +add_custom_target( + bootstratp_link_file_dump ALL + COMMAND + ${CMAKE_C_COMPILER} + -include ${CMAKE_SOURCE_DIR}/build/autoconf.h + -E -P -<${CMAKE_CURRENT_LIST_DIR}/link.lds.S > + ${CMAKE_CURRENT_LIST_DIR}/link.lds +) + +add_dependencies(boot_bsp bootstratp_link_file_dump) \ No newline at end of file diff --git a/mkrtos_bootstrap/bsp/AARCH64_QEMU/aarch64_start.c b/mkrtos_bootstrap/bsp/AARCH64_QEMU/aarch64_start.c index 49392b85e..c8d00175b 100644 --- a/mkrtos_bootstrap/bsp/AARCH64_QEMU/aarch64_start.c +++ b/mkrtos_bootstrap/bsp/AARCH64_QEMU/aarch64_start.c @@ -3,17 +3,12 @@ #include #include #include "cpio.h" -__ALIGN__(16) -uint64_t stack[4096 / sizeof(uint64_t)]; - #define KERNEL_NAME "mkrtos.elf" -// 内核的启动地址,其它核跳转使用 -extern uint64_t knl_entry; -// #define KERNEL_NAME "mkrtos_smart.elf" -#define KERNEL_IMG_START_ADDR (0x40000000 + 0x01000000 + 0x4000) - +__ALIGN__(16) +uint64_t stack[4096 / sizeof(uint64_t)]; +extern uint64_t knl_entry; // 内核的启动地址,其它核跳转使用 typedef void (*main_func)(umword_t cpio_addr); void jump2kernel(addr_t cpio_start, addr_t cpio_end) diff --git a/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds b/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds old mode 100755 new mode 100644 index 99e150eba..0634f49c4 --- a/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds +++ b/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds @@ -1,70 +1,42 @@ -ENTRY(_start); - -SECTIONS -{ - /* - * 0x40000000 - * - * 这里“.”表示location counter,当前位置 - */ - . = 0x40000000 + 0x01000000; - /* - * text代码段 - */ - _text = .; - .text : - { - *(.text) - } - _etext = .; - - /* - * 只读数据段 - */ - - _rodata = .; - .rodata : - { - *(.rodata) - } - _erodata = .; - - - /* - * 数据段 - */ - _data = .; - .data : - { - *(.data) - - . = ALIGN(0x8); - _pre_cpu_data_start = .; - KEEP (*(.data.per_cpu)) - _pre_cpu_data_end = .; - } - _edata = .; - - /* - * bss段 - * - * ALIGN(8)表示8个字节对齐 - * bss_begin的起始地址以8字节对齐 - */ - . = ALIGN(0x8); - _bss = .; - bss_begin = .; - .bss : - { - *(.bss*) - } - bss_end = .; - _ebss = .; - - . = ALIGN(0x8); - .cpio : { - cpio_start = .; - *(.cpio*) - cpio_end = .; - } -} +ENTRY(_start); +SECTIONS +{ + . = 0x40000000 + 0x01000000; + _text = .; + .text : + { + *(.text) + } + _etext = .; + _rodata = .; + .rodata : + { + *(.rodata) + } + _erodata = .; + _data = .; + .data : + { + *(.data) + . = ALIGN(0x8); + _pre_cpu_data_start = .; + KEEP (*(.data.per_cpu)) + _pre_cpu_data_end = .; + } + _edata = .; + . = ALIGN(0x8); + _bss = .; + bss_begin = .; + .bss : + { + *(.bss*) + } + bss_end = .; + _ebss = .; + . = ALIGN(0x8); + .cpio : { + cpio_start = .; + *(.cpio*) + cpio_end = .; + } +} diff --git a/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds.S b/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds.S new file mode 100755 index 000000000..3a91cc4de --- /dev/null +++ b/mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds.S @@ -0,0 +1,70 @@ +ENTRY(_start); + +SECTIONS +{ + /* + * CONFIG_KNL_DATA_ADDR + * + * 这里“.”表示location counter,当前位置 + */ + . = CONFIG_KNL_DATA_ADDR + 0x01000000; + /* + * text代码段 + */ + _text = .; + .text : + { + *(.text) + } + _etext = .; + + /* + * 只读数据段 + */ + + _rodata = .; + .rodata : + { + *(.rodata) + } + _erodata = .; + + + /* + * 数据段 + */ + _data = .; + .data : + { + *(.data) + + . = ALIGN(0x8); + _pre_cpu_data_start = .; + KEEP (*(.data.per_cpu)) + _pre_cpu_data_end = .; + } + _edata = .; + + /* + * bss段 + * + * ALIGN(8)表示8个字节对齐 + * bss_begin的起始地址以8字节对齐 + */ + . = ALIGN(0x8); + _bss = .; + bss_begin = .; + .bss : + { + *(.bss*) + } + bss_end = .; + _ebss = .; + + . = ALIGN(0x8); + .cpio : { + cpio_start = .; + *(.cpio*) + cpio_end = .; + } +} diff --git a/mkrtos_configs/aarch64_qemu_defconfig b/mkrtos_configs/aarch64_qemu_defconfig index 9b2b50077..a51fde2f0 100644 --- a/mkrtos_configs/aarch64_qemu_defconfig +++ b/mkrtos_configs/aarch64_qemu_defconfig @@ -17,7 +17,7 @@ CONFIG_USER_ISR_START_NO=16 CONFIG_IRQ_REG_TAB_SIZE=80 CONFIG_REGION_NUM=8 CONFIG_OBJ_MAP_TAB_SIZE=32 -CONFIG_OBJ_MAP_ENTRY_SIZE=32 +CONFIG_OBJ_MAP_ENTRY_SIZE=170 CONFIG_PRINTK_CACHE_SIZE=128 # end of Knl config @@ -118,3 +118,4 @@ CONFIG_THREAD_BLOCK_SIZE=0x1000 CONFIG_PAGE_SHIFT=12 CONFIG_MMU=y CONFIG_KNL_TEST=n +CONFIG_ELF_LAUNCH=y diff --git a/mkrtos_knl/CMakeLists.txt b/mkrtos_knl/CMakeLists.txt index 350177af7..4e38858da 100755 --- a/mkrtos_knl/CMakeLists.txt +++ b/mkrtos_knl/CMakeLists.txt @@ -14,6 +14,7 @@ add_subdirectory(arch) add_subdirectory(drivers) add_subdirectory(knl) add_subdirectory(lib) +add_subdirectory(test) add_executable(mkrtos.elf ${deps} @@ -28,12 +29,14 @@ target_link_libraries( arch lib drv + test --no-whole-archive ) add_dependencies(mkrtos.elf arch) add_dependencies(mkrtos.elf drv) add_dependencies(mkrtos.elf knl) add_dependencies(mkrtos.elf lib) +add_dependencies(mkrtos.elf test) set_target_properties(mkrtos.elf PROPERTIES LINK_FLAGS "-T ${CMAKE_CURRENT_LIST_DIR}/arch/${CONFIG_ARCH}/link.lds -z max-page-size=0x1000 --gc-section ") diff --git a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h index c80d84b69..ecc84594c 100755 --- a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h +++ b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h @@ -13,7 +13,8 @@ #include "types.h" #include #include - +#include +#include #define ARCH_WORD_SIZE 64 #define LOG_INTR_NO 37 // USART1_IRQn diff --git a/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S b/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S index f7a4946e0..2170b4d3d 100755 --- a/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S +++ b/mkrtos_knl/arch/aarch64/aarch64_qemu/vector.S @@ -119,10 +119,10 @@ vectors: 当前系统运行在EL1时使用EL0的栈指针SP 这是一种异常错误的类型 */ - vtentry el1_sync_invalid - vtentry el1_irq_invalid - vtentry el1_fiq_invalid - vtentry el1_error_invalid + vtentry el2_sync_invalid + vtentry el2_irq_invalid + vtentry el2_fiq_invalid + vtentry el2_error_invalid /* Current EL with SPx 当前系统运行在EL1时使用EL1的栈指针SP @@ -131,45 +131,47 @@ vectors: Note: 我们暂时只实现IRQ中断 */ - vtentry el1_sync_invalid - vtentry el1_irq - vtentry el1_fiq_invalid - vtentry el1_error_invalid + vtentry el2_sync_invalid + vtentry el2_irq + vtentry el2_fiq_invalid + vtentry el2_error_invalid /* Lower EL using AArch64 在用户态的aarch64的程序发生了异常 */ - vtentry el1_sync_invalid + vtentry el1_sync vtentry el1_irq - vtentry el0_fiq_invalid - vtentry el0_error_invalid + vtentry el1_fiq_invalid + vtentry el1_error_invalid /* Lower EL using AArch32 在用户态的aarch32的程序发生了异常 */ - vtentry el0_sync_invalid - vtentry el0_irq_invalid - vtentry el0_fiq_invalid - vtentry el0_error_invalid -el1_sync_invalid: + vtentry el1_sync_invalid + vtentry el1_irq_invalid + vtentry el1_fiq_invalid + vtentry el1_error_invalid +el1_sync: kernel_entry 2 - //mrs x25, ESR_EL2 - //lsr x24, x25, 26 - //cmp x24, 0x16 - //b.eq el2_svc - //inv_entry 0, BAD_SYNC - //el2_svc: - // mov x0, sp - // bl el2_svc_handler bl thread_sync_entry b ret_to_user +el2_sync_invalid: + inv_entry 1, BAD_SYNC +el2_irq_invalid: + inv_entry 1, BAD_IRQ +el2_fiq_invalid: + inv_entry 1, BAD_FIQ +el2_error_invalid: + inv_entry 1, BAD_ERROR el1_irq_invalid: inv_entry 1, BAD_IRQ el1_fiq_invalid: inv_entry 1, BAD_FIQ el1_error_invalid: inv_entry 1, BAD_ERROR +el1_sync_invalid: + inv_entry 0, BAD_SYNC el0_sync_invalid: inv_entry 0, BAD_SYNC el0_irq_invalid: @@ -185,6 +187,7 @@ tsk .req x28 // current thread_info and \rd, \rd, #(~(4096 - 1)) // top of stack .endm el1_irq: +el2_irq: kernel_entry 2 bl entry_handler bl SysTick_Handler diff --git a/mkrtos_knl/arch/aarch64/early_boot.c b/mkrtos_knl/arch/aarch64/early_boot.c index 728d71da6..69ce3f650 100644 --- a/mkrtos_knl/arch/aarch64/early_boot.c +++ b/mkrtos_knl/arch/aarch64/early_boot.c @@ -145,7 +145,7 @@ static SECTION(TEXT_BOOT_SECTION) void boot_init_pageing(page_entry_t *kpdir, bo write_sysreg(0x00ff4400, mair_el2); if (init_pages) { - map_mm(kpdir, 0x40000000, 0x40000000, 30, 1, 0x709); + map_mm(kpdir, CONFIG_KNL_DATA_ADDR, CONFIG_KNL_DATA_ADDR, 30, 1, 0x709); // map_mm(kpdir, _text_boot, _text_boot, PAGE_SHIFT, ALIGN(_edata_boot - _text_boot, PAGE_SIZE) >> PAGE_SHIFT, 0x70b); // map_mm(kpdir, _text, _edata_boot, PAGE_SHIFT, ALIGN(_buddy_data_end - _text, PAGE_SIZE) >> PAGE_SHIFT, 0x70b); map_mm(kpdir, PBASE, PBASE, 21, DEVICE_SIZE >> 21, 0x709); diff --git a/mkrtos_knl/arch/aarch64/esr.h b/mkrtos_knl/arch/aarch64/esr.h new file mode 100644 index 000000000..1248ff848 --- /dev/null +++ b/mkrtos_knl/arch/aarch64/esr.h @@ -0,0 +1,12 @@ +#pragma once +#include "types.h" +static inline mword_t esr_get(void) +{ + mword_t esr; + + asm volatile("mrs %0, ESR_EL2" : "=r"(esr)); + return esr; +} + +#define arm_esr_ec(esr) ((esr) >> 26) + diff --git a/mkrtos_knl/arch/aarch64/link.lds b/mkrtos_knl/arch/aarch64/link.lds index b708ffa3b..cbfe2766d 100644 --- a/mkrtos_knl/arch/aarch64/link.lds +++ b/mkrtos_knl/arch/aarch64/link.lds @@ -1,7 +1,7 @@ ENTRY(_start); SECTIONS { - . = 0x40000000+0x1000; + . = 0x40000000 +0x1000; kernel_start = .; _text_boot = .; .text.boot : diff --git a/mkrtos_knl/arch/aarch64/link.lds.S b/mkrtos_knl/arch/aarch64/link.lds.S index bbcb5577c..cdb3d6732 100644 --- a/mkrtos_knl/arch/aarch64/link.lds.S +++ b/mkrtos_knl/arch/aarch64/link.lds.S @@ -3,11 +3,11 @@ ENTRY(_start); SECTIONS { /* - * 设置mkrtos的加载入口地址为0x80000 + * * * 这里“.”表示location counter,当前位置 */ - . = 0x40000000+0x1000; + . = CONFIG_KNL_DATA_ADDR+0x1000; kernel_start = .; /* * 这里是第一个段text.boot,起始地址就是0x80000 diff --git a/mkrtos_knl/arch/aarch64/thread_aarch64.c b/mkrtos_knl/arch/aarch64/thread_aarch64.c index 0aae6f05c..3f38d013a 100644 --- a/mkrtos_knl/arch/aarch64/thread_aarch64.c +++ b/mkrtos_knl/arch/aarch64/thread_aarch64.c @@ -37,8 +37,14 @@ void thread_knl_pf_set(thread_t *cur_th, void *pc) } void thread_user_pf_set(thread_t *cur_th, void *pc, void *user_sp, void *ram, umword_t stack) { - /*TODO:*/ - assert(0); + pf_t *pt = ((pf_t *)((char *)cur_th + THREAD_BLOCK_SIZE)) - 1; + + pt->pstate = PSR_MODE_EL1h; + pt->pc = (umword_t)pc; + cur_th->sp.x19 = 0; + cur_th->sp.x20 = 0 /*arg*/; + cur_th->sp.pc = (mword_t)ret_form_run; + cur_th->sp.sp = (umword_t)pt; } void task_knl_init(task_t *knl_tk) { diff --git a/mkrtos_knl/arch/aarch64/thread_armv8.c b/mkrtos_knl/arch/aarch64/thread_armv8.c index f97ba19ab..9efe1b40a 100644 --- a/mkrtos_knl/arch/aarch64/thread_armv8.c +++ b/mkrtos_knl/arch/aarch64/thread_armv8.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include umword_t thread_get_pfa(void) { umword_t a; @@ -12,10 +14,8 @@ umword_t thread_get_pfa(void) } void thread_sync_entry(entry_frame_t *regs) { - umword_t ec = 0; - // umword_t ec = arm_esr_ec(esr_get()); - // thread_t *th = thread_current(); - // task_t *tk = (task_t *)th->task; + umword_t ec = arm_esr_ec(esr_get()); + thread_t *th = thread_get_current(); switch (ec) { @@ -43,7 +43,7 @@ void thread_sync_entry(entry_frame_t *regs) case 0x11: case 0x15: case 0x16: - // svc_handler(regs); + syscall_entry(regs); return; case 0x00: return; diff --git a/mkrtos_knl/arch/cortex-m3/stm32f1/arch.h b/mkrtos_knl/arch/cortex-m3/stm32f1/arch.h index 44de21eb4..4b66b8967 100755 --- a/mkrtos_knl/arch/cortex-m3/stm32f1/arch.h +++ b/mkrtos_knl/arch/cortex-m3/stm32f1/arch.h @@ -25,7 +25,7 @@ typedef struct } pf_s_t; typedef struct pf { - umword_t rg1[8]; //!< r4-r11 + umword_t regs[8]; //!< r4-r11 pf_s_t pf_s; } pf_t; diff --git a/mkrtos_knl/arch/cortex-m3/stm32f2/arch.h b/mkrtos_knl/arch/cortex-m3/stm32f2/arch.h index caf7a761e..e3c8b25c6 100755 --- a/mkrtos_knl/arch/cortex-m3/stm32f2/arch.h +++ b/mkrtos_knl/arch/cortex-m3/stm32f2/arch.h @@ -25,7 +25,7 @@ typedef struct } pf_s_t; typedef struct pf { - umword_t rg1[8]; //!< r4-r11 + umword_t regs[8]; //!< r4-r11 pf_s_t pf_s; } pf_t; diff --git a/mkrtos_knl/arch/cortex-m4/stm32f4/arch.h b/mkrtos_knl/arch/cortex-m4/stm32f4/arch.h index ce5ff31df..570b702d6 100755 --- a/mkrtos_knl/arch/cortex-m4/stm32f4/arch.h +++ b/mkrtos_knl/arch/cortex-m4/stm32f4/arch.h @@ -25,7 +25,7 @@ typedef struct } pf_s_t; typedef struct pf { - umword_t rg1[8]; //!< r4-r11 + umword_t regs[8]; //!< r4-r11 pf_s_t pf_s; } pf_t; diff --git a/mkrtos_knl/inc/knl/elf64.h b/mkrtos_knl/inc/knl/elf64.h index 2a2320392..af49adbc2 100644 --- a/mkrtos_knl/inc/knl/elf64.h +++ b/mkrtos_knl/inc/knl/elf64.h @@ -1,4 +1,5 @@ #pragma once #include -int elf_load(umword_t elf_data); \ No newline at end of file +#include +int elf_load(task_t *task, umword_t elf_data, size_t size, addr_t *entry_addr); diff --git a/mkrtos_knl/inc/knl/kobject.h b/mkrtos_knl/inc/knl/kobject.h index 3d7904a6e..795c80094 100755 --- a/mkrtos_knl/inc/knl/kobject.h +++ b/mkrtos_knl/inc/knl/kobject.h @@ -101,7 +101,7 @@ static inline void kobject_invalidate(kobject_t *kobj) static inline void kobject_invoke(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame_t *f) { /*TODO:*/ - f->r[0] = msg_tag_init4(0, 0, 0, -ENOSYS).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -ENOSYS).raw; } static inline bool_t kobject_put(kobject_t *kobj) { diff --git a/mkrtos_knl/inc/knl/mm_space.h b/mkrtos_knl/inc/knl/mm_space.h index 0ff44ac25..ba61e7487 100644 --- a/mkrtos_knl/inc/knl/mm_space.h +++ b/mkrtos_knl/inc/knl/mm_space.h @@ -1,7 +1,7 @@ #pragma once #include "types.h" -#include "mm_page.h" +#include #include #include #if CONFIG_MK_MPU_CFG @@ -34,10 +34,6 @@ typedef struct mm_space size_t mm_block_size; //!< 私有内存块的大小 } mm_space_t; -static inline page_entry_t *mm_space_get_pdir(mm_space_t *sp) -{ - return &sp->mem_dir; -} enum region_rights { @@ -69,6 +65,11 @@ static inline void mm_space_del(mm_space_t *m_space, umword_t addr) void mm_space_init(mm_space_t *mm_space, int is_knl); bool_t mm_space_add(mm_space_t *m_space, umword_t addr, umword_t size, uint8_t attrs); void mm_space_del(mm_space_t *m_space, umword_t addr); + +static inline page_entry_t *mm_space_get_pdir(mm_space_t *sp) +{ + return &sp->mem_dir; +} #endif #endif diff --git a/mkrtos_knl/inc/knl/mm_wrap.h b/mkrtos_knl/inc/knl/mm_wrap.h index 8f7676087..922840a4e 100755 --- a/mkrtos_knl/inc/knl/mm_wrap.h +++ b/mkrtos_knl/inc/knl/mm_wrap.h @@ -1,7 +1,7 @@ #pragma once #include "ram_limit.h" - +#include void *mm_limit_alloc(ram_limit_t *limit, size_t size); void mm_limit_free(ram_limit_t *limit, void *mem); struct mem_heap *mm_get_free(struct mem_heap *next, @@ -10,3 +10,12 @@ void mm_trace(void); void *mm_limit_alloc_align(ram_limit_t *limit, size_t size, size_t align); void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size); void mm_info(size_t *total, size_t *free); + +#if IS_ENABLED(CONFIG_BUDDY_SLAB) +#include +void *mm_limit_alloc_buddy(ram_limit_t *limit, size_t size); +void mm_limit_free_buddy(ram_limit_t *limit, void *mem, size_t size); +#include +void *mm_limit_alloc_slab(slab_t *slab, ram_limit_t *limit); +void mm_limit_free_slab(slab_t *slab, ram_limit_t *limit, void *mem); +#endif diff --git a/mkrtos_knl/inc/knl/obj_space.h b/mkrtos_knl/inc/knl/obj_space.h index 263fea88b..d060df289 100755 --- a/mkrtos_knl/inc/knl/obj_space.h +++ b/mkrtos_knl/inc/knl/obj_space.h @@ -5,7 +5,7 @@ #include "assert.h" #include "types.h" #include "mm_wrap.h" - +#include // #define CONFIG_OBJ_MAP_TAB_SIZE 4 // #define CONFIG_OBJ_MAP_ENTRY_SIZE 8 diff --git a/mkrtos_knl/inc/knl/slab.h b/mkrtos_knl/inc/knl/slab.h index 154210b16..9100ed71f 100755 --- a/mkrtos_knl/inc/knl/slab.h +++ b/mkrtos_knl/inc/knl/slab.h @@ -38,6 +38,10 @@ typedef struct slab spinlock_t lock; } slab_t; +static inline size_t slab_get_item_size(slab_t *slab) +{ + return slab->align_size; +} slab_t *slab_create(size_t align_size, const char *name); void slab_release(slab_t *slab); void *slab_alloc(slab_t *slab); diff --git a/mkrtos_knl/inc/knl/syscall.h b/mkrtos_knl/inc/knl/syscall.h index 5e44812fc..56255e3a5 100755 --- a/mkrtos_knl/inc/knl/syscall.h +++ b/mkrtos_knl/inc/knl/syscall.h @@ -1,11 +1,9 @@ #pragma once #include "types.h" +#include -typedef struct entry_frame -{ - mword_t r[8]; -} entry_frame_t; +typedef pf_t entry_frame_t; -typedef void (*syscall_entry_func)(entry_frame_t entry); -void syscall_entry(entry_frame_t entry); +typedef void (*syscall_entry_func)(entry_frame_t *entry); +void syscall_entry(entry_frame_t *entry); diff --git a/mkrtos_knl/inc/lib/cpio.h b/mkrtos_knl/inc/lib/cpio.h index eafa7092a..c91ea2d68 100644 --- a/mkrtos_knl/inc/lib/cpio.h +++ b/mkrtos_knl/inc/lib/cpio.h @@ -31,4 +31,4 @@ static inline int64_t check_magic(char *magic) } int htoi(char *str, int len); -umword_t cpio_find_file(umword_t st, umword_t en, const char *name); +umword_t cpio_find_file(umword_t st, umword_t en, const char *name, size_t *size); diff --git a/mkrtos_knl/inc/test/buddy_slab_test.h b/mkrtos_knl/inc/test/buddy_slab_test.h new file mode 100644 index 000000000..6d7c0dbc1 --- /dev/null +++ b/mkrtos_knl/inc/test/buddy_slab_test.h @@ -0,0 +1,3 @@ +#pragma once + +void buddy_slab_init(void); diff --git a/mkrtos_knl/inc/test/knl_test.h b/mkrtos_knl/inc/test/knl_test.h new file mode 100644 index 000000000..a6067584c --- /dev/null +++ b/mkrtos_knl/inc/test/knl_test.h @@ -0,0 +1,4 @@ +#pragma once + + +void knl_test(void); diff --git a/mkrtos_knl/inc/test/kthread_test.h b/mkrtos_knl/inc/test/kthread_test.h new file mode 100644 index 000000000..eaa7404f7 --- /dev/null +++ b/mkrtos_knl/inc/test/kthread_test.h @@ -0,0 +1,3 @@ +#pragma once + +void kthread_test_init(void); diff --git a/mkrtos_knl/knl/elf64.c b/mkrtos_knl/knl/elf64.c index c9f9134c3..8bd9c8f21 100644 --- a/mkrtos_knl/knl/elf64.c +++ b/mkrtos_knl/knl/elf64.c @@ -1,5 +1,7 @@ #include +#include +#include typedef uint16_t Elf64_Half; typedef uint32_t Elf64_Word; typedef uint64_t Elf64_Addr; @@ -73,6 +75,8 @@ typedef struct #define SELFMAG 4 #include #include +#include +#include int elf_check(Elf64_Ehdr *ehdr) { if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG) != 0) @@ -89,30 +93,60 @@ int elf_check(Elf64_Ehdr *ehdr) return 0; } -int elf_load(umword_t elf_data) +int elf_load(task_t *task, umword_t elf_data, size_t size, addr_t *entry_addr) { int ret; Elf64_Ehdr *elf_header; + assert(entry_addr); elf_header = (Elf64_Ehdr *)elf_data; - ret = elf_check(elf_header); if (ret != 0) { return ret; } - int size = elf_header->e_phentsize; + // int size = elf_header->e_phentsize; Elf64_Phdr *elf_phdr = (Elf64_Phdr *)(elf_header->e_phoff + elf_data); + size_t mem_size = 0; + addr_t st_addr = 0; + addr_t end_addr = 0; + + *entry_addr = elf_header->e_entry; 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); + printk("[] paddr:0x%x vaddr:0x%x memsize:%d filesize:%d ofst:%d align:0x%x\n", + elf_phdr->p_vaddr, elf_phdr->p_paddr, elf_phdr->p_memsz, elf_phdr->p_filesz, + elf_phdr->p_offset, elf_phdr->p_align); + + if (i == 0) + { + st_addr = elf_phdr->p_vaddr; + } + + end_addr = ALIGN(elf_phdr->p_vaddr + elf_phdr->p_memsz, elf_phdr->p_align); } } + mem_size = end_addr - st_addr; + void *mem; + + mem = buddy_alloc(buddy_get_alloter(), mem_size); + assert(mem); + memset(mem, 0, mem_size); + mword_t offset = 0; + + 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) + { + memcpy((char *)mem + (elf_phdr->p_vaddr - st_addr), (void *)(elf_data + elf_phdr->p_offset), + elf_phdr->p_filesz); + offset += ALIGN(elf_phdr->p_memsz, elf_phdr->p_align); + } + } + map_mm(mm_space_get_pdir(&task->mm_space), st_addr, + (addr_t)mem, PAGE_SHIFT, mem_size / PAGE_SIZE, 0x7ff); } diff --git a/mkrtos_knl/knl/factory.c b/mkrtos_knl/knl/factory.c index c762619be..693275e9a 100755 --- a/mkrtos_knl/knl/factory.c +++ b/mkrtos_knl/knl/factory.c @@ -79,13 +79,13 @@ static kobject_t *factory_manu_kobj(kobject_t *kobj, ram_limit_t *lim, entry_fra { kobject_t *new_kobj = NULL; - if (f->r[1] < 0 || f->r[1] >= FACTORY_FUNC_MAX) + if (f->regs[1] < 0 || f->regs[1] >= FACTORY_FUNC_MAX) { return NULL; } - if (factory_func_list[f->r[1]]) + if (factory_func_list[f->regs[1]]) { - new_kobj = factory_func_list[f->r[1]](lim, f->r[3], f->r[4], f->r[5], f->r[6]); + new_kobj = factory_func_list[f->regs[1]](lim, f->regs[3], f->regs[4], f->regs[5], f->regs[6]); } return new_kobj; } @@ -99,7 +99,7 @@ static kobject_t *factory_manu_kobj(kobject_t *kobj, ram_limit_t *lim, entry_fra */ static msg_tag_t factory_create_map(kobject_t *kobj, task_t *tk, entry_frame_t *f) { - vpage_t page = vpage_create_raw(f->r[2]); + vpage_t page = vpage_create_raw(f->regs[2]); mword_t status = spinlock_lock(&tk->kobj.lock); if (status < 0) @@ -147,7 +147,7 @@ factory_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_f if (sys_p.prot != FACTORY_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } switch (sys_p.op) @@ -159,7 +159,7 @@ factory_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_f break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } /** * @brief factory对象的初始化函数 diff --git a/mkrtos_knl/knl/futex.c b/mkrtos_knl/knl/futex.c index 48e6b82dd..96a3068df 100644 --- a/mkrtos_knl/knl/futex.c +++ b/mkrtos_knl/knl/futex.c @@ -507,13 +507,13 @@ static void futex_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_ta if (sys_p.prot != FUTEX_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } msg = thread_get_msg_buf(th); if (msg == NULL) { - f->r[0] = msg_tag_init4(0, 0, 0, -ENOBUFS).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -ENOBUFS).raw; return; } switch (sys_p.op) @@ -534,7 +534,7 @@ static void futex_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_ta } break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } /** * @brief 在task结束时,需要删除某个task所关联的futex diff --git a/mkrtos_knl/knl/ipc.c b/mkrtos_knl/knl/ipc.c index 919bc147c..0ae858713 100755 --- a/mkrtos_knl/knl/ipc.c +++ b/mkrtos_knl/knl/ipc.c @@ -34,6 +34,24 @@ typedef struct ipc_wait_bind_entry thread_t *th; } ipc_wait_bind_entry_t; +#if IS_ENABLED(CONFIG_BUDDY_SLAB) +#include +static slab_t *ipc_slab; +#endif + +/** + * @brief 在系统初始化时调用,初始化task的内存 + * + */ +static void ipc_obj_slab_init(void) +{ +#if IS_ENABLED(CONFIG_BUDDY_SLAB) + ipc_slab = slab_create(sizeof(ipc_t), "ipc"); + assert(ipc_slab); +#endif +} +INIT_KOBJ_MEM(ipc_obj_slab_init); + int ipc_bind(ipc_t *ipc, obj_handler_t th_hd, umword_t user_id, thread_t *th_kobj) { int ret = -EINVAL; @@ -109,7 +127,7 @@ static void ipc_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, if (sys_p.prot != IPC_PROT && sys_p.prot != THREAD_PROT) { //!< ipc对象拥有代理thread消息的功能,所以这里对与thread协议进行放宽 - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } switch (sys_p.op) @@ -122,7 +140,7 @@ static void ipc_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, tag = msg_tag_init4(0, 0, 0, -EPROTO); break; } - ret = ipc_bind(ipc, f->r[0], f->r[1], NULL); + ret = ipc_bind(ipc, f->regs[0], f->regs[1], NULL); tag = msg_tag_init4(0, 0, 0, ret); } break; @@ -165,7 +183,7 @@ static void ipc_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, default: break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } static void ipc_release_stage1(kobject_t *kobj) { @@ -190,7 +208,11 @@ static void ipc_release_stage2(kobject_t *kobj) { ipc_t *ipc = container_of(kobj, ipc_t, kobj); +#if IS_ENABLED(CONFIG_BUDDY_SLAB) + mm_limit_free_slab(ipc_slab, ipc->lim, kobj); +#else mm_limit_free(ipc->lim, kobj); +#endif // printk("ipc release 0x%x\n", kobj); } static bool_t ipc_put(kobject_t *kobj) @@ -214,8 +236,13 @@ static void ipc_init(ipc_t *ipc, ram_limit_t *lim) } static ipc_t *ipc_create(ram_limit_t *lim) { - ipc_t *ipc = mm_limit_alloc(lim, sizeof(ipc_t)); + ipc_t *ipc; +#if IS_ENABLED(CONFIG_BUDDY_SLAB) + ipc = mm_limit_alloc_slab(ipc_slab, lim); +#else + ipc = mm_limit_alloc(lim, sizeof(ipc_t)); +#endif if (!ipc) { return NULL; diff --git a/mkrtos_knl/knl/irq_sender.c b/mkrtos_knl/knl/irq_sender.c index e82de6760..fd3fddfc7 100644 --- a/mkrtos_knl/knl/irq_sender.c +++ b/mkrtos_knl/knl/irq_sender.c @@ -124,7 +124,7 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, if (sys_p.prot != IRQ_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } @@ -132,7 +132,7 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, { case BIND_IRQ: { - umword_t irq_no = f->r[1]; + umword_t irq_no = f->regs[1]; if (irq_alloc(irq_no, irq, irq_tigger) == FALSE) { @@ -142,13 +142,13 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, } irq->irq_id = irq_no; //!< 设置绑定后的irq号 ref_counter_inc(&irq->ref); //!< 绑定后引用计数+1 - arch_set_enable_irq_prio(irq_no, f->r[2] & 0xffff, f->r[2] >> 16); //!< 绑定时设置优先级 + arch_set_enable_irq_prio(irq_no, f->regs[2] & 0xffff, f->regs[2] >> 16); //!< 绑定时设置优先级 tag = msg_tag_init4(0, 0, 0, 0); } break; case UNBIND_IRQ: { - umword_t irq_no = f->r[1]; + umword_t irq_no = f->regs[1]; bool_t suc = irq_sender_unbind(irq, irq_no); tag = msg_tag_init4(0, 0, 0, suc ? 0 : -EACCES); @@ -157,7 +157,7 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, case WAIT_IRQ: { ref_counter_inc(&th->ref); - int ret = irq_sender_wait(irq, th, f->r[1]); + int ret = irq_sender_wait(irq, th, f->regs[1]); ref_counter_dec_and_release(&th->ref, &irq->kobj); //! 引用计数+1 tag = msg_tag_init4(0, 0, 0, ret); } @@ -172,7 +172,7 @@ void irq_sender_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } static bool_t irq_sender_put(kobject_t *kobj) { diff --git a/mkrtos_knl/knl/log.c b/mkrtos_knl/knl/log.c index 004219945..f65996d4f 100755 --- a/mkrtos_knl/knl/log.c +++ b/mkrtos_knl/knl/log.c @@ -101,12 +101,12 @@ log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame { case WRITE_DATA: tag = log_write_data( - (log_t *)kobj, (const char *)(&f->r[1]), + (log_t *)kobj, (const char *)(&f->regs[1]), MIN(in_tag.msg_buf_len * WORD_BYTES, WORD_BYTES * 5)); break; case READ_DATA: { - int ret = log_read_data((log_t *)kobj, (uint8_t *)(&f->r[1]), MIN(f->r[1], WORD_BYTES * 5)); + int ret = log_read_data((log_t *)kobj, (uint8_t *)(&f->regs[1]), MIN(f->regs[1], WORD_BYTES * 5)); tag = msg_tag_init4(0, 0, 0, ret); } break; @@ -117,7 +117,7 @@ log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame tag = msg_tag_init4(0, 0, 0, -ENOSYS); break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } else if (sys_p.prot == IRQ_PROT) { @@ -125,7 +125,7 @@ log_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, entry_frame } else { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } return; diff --git a/mkrtos_knl/knl/mm_man.c b/mkrtos_knl/knl/mm_man.c index 0b926dbf9..28971922e 100644 --- a/mkrtos_knl/knl/mm_man.c +++ b/mkrtos_knl/knl/mm_man.c @@ -48,7 +48,7 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t if (sys_p.prot != MM_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } switch (sys_p.op) @@ -57,7 +57,7 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t { #if 0 addr_t ret_addr; - int ret = mm_pages_alloc_page(&cur_task->mm_space.mm_pages, cur_task->lim, f->r[1], &ret_addr, f->r[2]); + int ret = mm_pages_alloc_page(&cur_task->mm_space.mm_pages, cur_task->lim, f->regs[1], &ret_addr, f->regs[2]); if (ret < 0) { tag = msg_tag_init4(0, 0, 0, ret); @@ -65,10 +65,10 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t else { tag = msg_tag_init4(0, 0, 0, 0); - f->r[1] = ret_addr; + f->regs[1] = ret_addr; } #else - void *ret_mem = mm_limit_alloc(cur_task->lim, f->r[1]); + void *ret_mem = mm_limit_alloc(cur_task->lim, f->regs[1]); if (!ret_mem) { @@ -76,7 +76,7 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t } else { - f->r[1] = (umword_t)ret_mem; + f->regs[1] = (umword_t)ret_mem; tag = msg_tag_init4(0, 0, 0, 0); } #endif @@ -85,10 +85,10 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t case MM_FREE: { #if 0 - mm_pages_free_page(&cur_task->mm_space.mm_pages, cur_task->lim, f->r[1], f->r[2]); + mm_pages_free_page(&cur_task->mm_space.mm_pages, cur_task->lim, f->regs[1], f->regs[2]); tag = msg_tag_init4(0, 0, 0, 0); #else - mm_limit_free(cur_task->lim, (void *)(f->r[1])); + mm_limit_free(cur_task->lim, (void *)(f->regs[1])); tag = msg_tag_init4(0, 0, 0, 0); #endif } @@ -100,8 +100,8 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t if (regi_info) { - umword_t size = f->r[2]; - umword_t addr = f->r[1]; + umword_t size = f->regs[2]; + umword_t addr = f->regs[1]; #if CONFIG_MPU_VERSION == 1 if ((!is_power_of_2(size)) && ((addr & (~(size - 1))) != 0)) @@ -138,7 +138,7 @@ static void mm_man_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t tag = msg_tag_init4(0, 0, 0, -ENOSYS); break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } void mm_man_dump(void) { diff --git a/mkrtos_knl/knl/mm_wrap.c b/mkrtos_knl/knl/mm_wrap.c index e5fbd9d9a..1822cccee 100755 --- a/mkrtos_knl/knl/mm_wrap.c +++ b/mkrtos_knl/knl/mm_wrap.c @@ -80,4 +80,58 @@ void mm_limit_free_align(ram_limit_t *limit, void *mem, size_t size) } mem_free_align(mm_get_global(), (char *)mem); ram_limit_free(limit, size); -} \ No newline at end of file +} +#if IS_ENABLED(CONFIG_BUDDY_SLAB) +#include +void *mm_limit_alloc_buddy(ram_limit_t *limit, size_t size) +{ + if (ram_limit_alloc(limit, size) == FALSE) + { + return NULL; + } + void *new_mem = buddy_alloc(buddy_get_alloter(), size); + + if (!new_mem) + { + ram_limit_free(limit, size); + return NULL; + } + + return (char *)new_mem; +} +void mm_limit_free_buddy(ram_limit_t *limit, void *mem, size_t size) +{ + if (!mem) + { + return; + } + buddy_free(buddy_get_alloter(), (char *)mem); + ram_limit_free(limit, size); +} +#include +void *mm_limit_alloc_slab(slab_t *slab, ram_limit_t *limit) +{ + if (ram_limit_alloc(limit, slab_get_item_size(slab)) == FALSE) + { + return NULL; + } + void *new_mem = slab_alloc(slab); + + if (!new_mem) + { + ram_limit_free(limit, slab_get_item_size(slab)); + return NULL; + } + + return (char *)new_mem; +} +void mm_limit_free_slab(slab_t *slab, ram_limit_t *limit, void *mem) +{ + if (!mem) + { + return; + } + slab_free(slab, (char *)mem); + ram_limit_free(limit, slab_get_item_size(slab)); +} +#endif \ No newline at end of file diff --git a/mkrtos_knl/knl/obj_space.c b/mkrtos_knl/knl/obj_space.c index fcb594b6c..46d5673b2 100755 --- a/mkrtos_knl/knl/obj_space.c +++ b/mkrtos_knl/knl/obj_space.c @@ -12,6 +12,9 @@ #include "types.h" #include "mm_wrap.h" #include "string.h" +#if IS_ENABLED(CONFIG_BUDDY_SLAB) +#include +#endif void obj_space_init(obj_space_t *obj_space, ram_limit_t *ram) { for (int i = 0; i < CONFIG_OBJ_MAP_TAB_SIZE; i++) @@ -55,7 +58,12 @@ obj_map_entry_t *obj_space_insert(obj_space_t *obj_space, ram_limit_t *ram, kobj if (!obj_space->tab.tabs[tab_inx]) { - obj_space->tab.tabs[tab_inx] = mm_limit_alloc(ram, sizeof(obj_map_item_t)); + obj_space->tab.tabs[tab_inx] = +#if IS_ENABLED(CONFIG_BUDDY_SLAB) + buddy_alloc(buddy_get_alloter(), PAGE_SIZE); +#else + mm_limit_alloc(ram, sizeof(obj_map_item_t)); +#endif if (!obj_space->tab.tabs[tab_inx]) { return NULL; diff --git a/mkrtos_knl/knl/share_mem.c b/mkrtos_knl/knl/share_mem.c index 765acadf7..23d8e6525 100644 --- a/mkrtos_knl/knl/share_mem.c +++ b/mkrtos_knl/knl/share_mem.c @@ -135,7 +135,7 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i if (sys_p.prot != SHARE_MEM_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } switch (sys_p.op) @@ -144,7 +144,7 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i { uint8_t attr; - attr = f->r[0] & 0xff; + attr = f->regs[0] & 0xff; int map_ret = share_mem_map_task(sm); if (map_ret >= 0) @@ -165,8 +165,8 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i } } } - f->r[1] = (umword_t)sm->mem; - f->r[2] = sm->size; + f->regs[1] = (umword_t)sm->mem; + f->regs[2] = sm->size; tag = msg_tag_init4(0, 0, 0, map_ret); } break; @@ -183,7 +183,7 @@ static void share_mem_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } static void share_mem_unmap(obj_space_t *obj_space, kobject_t *kobj) { diff --git a/mkrtos_knl/knl/sys.c b/mkrtos_knl/knl/sys.c index 8ed463baf..244b0f2cb 100755 --- a/mkrtos_knl/knl/sys.c +++ b/mkrtos_knl/knl/sys.c @@ -48,16 +48,16 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, msg_tag_t tag = msg_tag_init4(0, 0, 0, -EINVAL); if (sys_p.prot != SYS_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } switch (sys_p.op) { case SYS_INFO_GET: { - f->r[1] = sys_tick_cnt_get(); - f->r[2] = CONFIG_KNL_TEXT_ADDR + CONFIG_BOOTFS_OFFSET; - f->r[3] = arch_get_sys_clk(); + f->regs[1] = sys_tick_cnt_get(); + f->regs[2] = CONFIG_KNL_TEXT_ADDR + CONFIG_BOOTFS_OFFSET; + f->regs[3] = arch_get_sys_clk(); tag = msg_tag_init4(0, 0, 0, 0); } break; @@ -74,14 +74,14 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, size_t free; mm_info(&total, &free); - f->r[1] = total; - f->r[2] = free; + f->regs[1] = total; + f->regs[2] = free; tag = msg_tag_init4(0, 0, 0, 0); } break; case DIS_IRQ: { - arch_disable_irq(f->r[0]); + arch_disable_irq(f->regs[0]); tag = msg_tag_init4(0, 0, 0, 0); } break; @@ -89,7 +89,7 @@ static void sys_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_tag, tag = msg_tag_init4(0, 0, 0, -ENOSYS); break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; return; } diff --git a/mkrtos_knl/knl/syscall.c b/mkrtos_knl/knl/syscall.c index 0a98fa190..84ba06cdf 100644 --- a/mkrtos_knl/knl/syscall.c +++ b/mkrtos_knl/knl/syscall.c @@ -1,12 +1,12 @@ /** * @file syscall.c * @author zhangzheng (1358745329@qq.com) - * @brief + * @brief * @version 0.1 * @date 2023-11-19 - * + * * @copyright Copyright (c) 2023 - * + * */ #include "types.h" #include "syscall.h" @@ -16,12 +16,12 @@ #include "err.h" #include "arch.h" #include "thread.h" -void syscall_entry(entry_frame_t entry) +void syscall_entry(entry_frame_t *entry) { msg_tag_t tag = msg_tag_init4(0, 0, 0, -1); thread_t *th = thread_get_current(); task_t *tk = thread_get_current_task(); - syscall_prot_t sys_p = syscall_prot_create_raw(entry.r[7]); + syscall_prot_t sys_p = syscall_prot_create_raw(entry->regs[7]); kobject_t *kobj = obj_space_lookup_kobj(&tk->obj_space, sys_p.obj_inx); @@ -34,21 +34,23 @@ void syscall_entry(entry_frame_t entry) } else { - entry.r[0] = msg_tag_init4(0, 0, 0, -ENOENT).raw; + entry->regs[0] = msg_tag_init4(0, 0, 0, -ENOENT).raw; goto end; } } if (kobj->invoke_func) { - kobj->invoke_func(kobj, sys_p, msg_tag_init(entry.r[0]), &entry); + kobj->invoke_func(kobj, sys_p, msg_tag_init(entry->regs[0]), entry); } end:; +#if !IS_ENABLED(CONFIG_MMU) addr_t u_sp = arch_get_user_sp(); pf_s_t *pf_a = (pf_s_t *)u_sp; - pf_a->rg0[0] = entry.r[0]; - pf_a->rg0[1] = entry.r[1]; - pf_a->rg0[2] = entry.r[2]; - pf_a->rg0[3] = entry.r[3]; + pf_a->rg0[0] = entry->r[0]; + pf_a->rg0[1] = entry->r[1]; + pf_a->rg0[2] = entry->r[2]; + pf_a->rg0[3] = entry->r[3]; +#endif } diff --git a/mkrtos_knl/knl/task.c b/mkrtos_knl/knl/task.c index c56393858..df7df794f 100755 --- a/mkrtos_knl/knl/task.c +++ b/mkrtos_knl/knl/task.c @@ -199,7 +199,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i if (sys_p.prot != TASK_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EINVAL).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EINVAL).raw; return; } @@ -213,7 +213,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, -EINVAL); break; } - kobject_t *source_kobj = obj_space_lookup_kobj(&cur_task->obj_space, f->r[1]); + kobject_t *source_kobj = obj_space_lookup_kobj(&cur_task->obj_space, f->regs[1]); if (!source_kobj) { @@ -221,7 +221,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, 0); break; } - f->r[1] = source_kobj->kobj_type; + f->regs[1] = source_kobj->kobj_type; spinlock_set(&tag_task->kobj.lock, status); tag = msg_tag_init4(0, 0, 0, 1); } @@ -239,8 +239,8 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i break; } int ret = obj_map_src_dst(&tag_task->obj_space, &cur_task->obj_space, - f->r[2], f->r[1], - tag_task->lim, f->r[3], &del); + f->regs[2], f->regs[1], + tag_task->lim, f->regs[3], &del); kobj_del_list_to_do(&del); task_unlock_2(&tag_task->kobj.lock, &cur_task->kobj.lock, st0, st1); tag = msg_tag_init4(0, 0, 0, ret); @@ -258,7 +258,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i break; } kobj_del_list_init(&kobj_list); - obj_unmap(&tag_task->obj_space, vpage_create_raw(f->r[1]), &kobj_list); + obj_unmap(&tag_task->obj_space, vpage_create_raw(f->regs[1]), &kobj_list); kobj_del_list_to_do(&kobj_list); spinlock_set(&tag_task->kobj.lock, status); tag = msg_tag_init4(0, 0, 0, 0); @@ -272,9 +272,9 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i tag = msg_tag_init4(0, 0, 0, -EINVAL); break; } - int ret = task_alloc_base_ram(tag_task, tag_task->lim, f->r[1]); + int ret = task_alloc_base_ram(tag_task, tag_task->lim, f->regs[1]); tag = msg_tag_init4(0, 0, 0, ret); - f->r[1] = (umword_t)(tag_task->mm_space.mm_block); + f->regs[1] = (umword_t)(tag_task->mm_space.mm_block); spinlock_set(&tag_task->kobj.lock, status); } break; @@ -283,8 +283,8 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i void *mem; size_t size; - umword_t st_addr = f->r[0]; - size_t cp_size = f->r[1]; + umword_t st_addr = f->regs[0]; + size_t cp_size = f->regs[1]; if (cp_size > THREAD_MSG_BUG_LEN) { @@ -305,12 +305,12 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i } case TASK_SET_PID: //!< 设置pid { - tag = msg_tag_init4(0, 0, 0, task_set_pid(tag_task, f->r[0])); + tag = msg_tag_init4(0, 0, 0, task_set_pid(tag_task, f->regs[0])); } break; case TASK_GET_PID: //!< 获取pid { - f->r[1] = tag_task->pid; + f->regs[1] = tag_task->pid; tag = msg_tag_init4(0, 0, 0, 0); } break; @@ -318,7 +318,7 @@ static void task_syscall_func(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t i break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } void task_init(task_t *task, ram_limit_t *ram, int is_knl) @@ -366,12 +366,20 @@ static void task_release_stage2(kobject_t *kobj) // task_t *cur_tk = thread_get_current_task(); obj_space_release(&tk->obj_space, tk->lim); + + if (tk->mm_space.mm_block) + { #if CONFIG_MK_MPU_CFG - mm_limit_free_align(tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size); + mm_limit_free_align(tk->lim, tk->mm_space.mm_block, tk->mm_space.mm_block_size); #else - mm_limit_free(tk->lim, tk->mm_space.mm_block); + mm_limit_free(tk->lim, tk->mm_space.mm_block); #endif + } +#if IS_ENABLED(CONFIG_BUDDY_SLAB) + mm_limit_free_slab(task_slab, tk->lim, tk); +#else mm_limit_free(tk->lim, tk); +#endif // if (cur_tk == tk) // { thread_sched(); @@ -391,7 +399,7 @@ task_t *task_create(ram_limit_t *lim, int is_knl) { task_t *tk = NULL; #if IS_ENABLED(CONFIG_BUDDY_SLAB) - tk = slab_alloc(task_slab); + tk = mm_limit_alloc_slab(task_slab, lim); #else tk = mm_limit_alloc(lim, sizeof(task_t)); #endif diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index 56e5a7695..dc99e4caf 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -189,8 +189,12 @@ static void thread_release_stage2(kobject_t *kobj) scheduler_reset(); thread_sched(); } +#if IS_ENABLED(CONFIG_BUDDY_SLAB) + mm_limit_free_buddy(th->lim, kobj, THREAD_BLOCK_SIZE); +#else mm_limit_free_align(th->lim, kobj, THREAD_BLOCK_SIZE); // mm_trace(); +#endif } /** @@ -329,7 +333,7 @@ thread_t *thread_create(ram_limit_t *ram) thread_t *th = NULL; #if IS_ENABLED(CONFIG_BUDDY_SLAB) - th = buddy_alloc(buddy_get_alloter(), PAGE_SIZE); + th = mm_limit_alloc_buddy(ram, PAGE_SIZE); #else th = mm_limit_alloc_align(ram, THREAD_BLOCK_SIZE, THREAD_BLOCK_SIZE); #endif @@ -685,7 +689,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id) task_t *cur_task = thread_get_current_task(); thread_t *cur_th = thread_get_current(); thread_t *to_th = (thread_t *)kobj; - umword_t ipc_type = f->r[1]; + umword_t ipc_type = f->regs[1]; obj_handler_t th_hd = 0; int ret = -EINVAL; @@ -693,13 +697,13 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id) { case IPC_CALL: { - msg_tag_t in_tag = msg_tag_init(f->r[0]); + msg_tag_t in_tag = msg_tag_init(f->regs[0]); msg_tag_t recv_tag; - th_hd = f->r[2]; - ipc_timeout_t ipc_tm_out = ipc_timeout_create(f->r[3]); + th_hd = f->regs[2]; + ipc_timeout_t ipc_tm_out = ipc_timeout_create(f->regs[3]); to_th->user_id = user_id; - ret = thread_ipc_call(to_th, in_tag, &recv_tag, ipc_tm_out, &f->r[1], TRUE); + ret = thread_ipc_call(to_th, in_tag, &recv_tag, ipc_tm_out, &f->regs[1], TRUE); if (ret < 0) { return msg_tag_init4(0, 0, 0, ret); @@ -708,7 +712,7 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id) } case IPC_REPLY: { - msg_tag_t in_tag = msg_tag_init(f->r[0]); + msg_tag_t in_tag = msg_tag_init(f->regs[0]); ret = thread_ipc_reply(in_tag); return msg_tag_init4(0, 0, 0, ret); @@ -717,10 +721,10 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id) case IPC_WAIT: { msg_tag_t ret_msg; - ipc_timeout_t ipc_tm_out = ipc_timeout_create(f->r[3]); - kobject_t *ipc_kobj = obj_space_lookup_kobj_cmp_type(&cur_task->obj_space, f->r[4], IPC_TYPE); + ipc_timeout_t ipc_tm_out = ipc_timeout_create(f->regs[3]); + kobject_t *ipc_kobj = obj_space_lookup_kobj_cmp_type(&cur_task->obj_space, f->regs[4], IPC_TYPE); - int ret = thread_ipc_recv(&ret_msg, ipc_tm_out, &f->r[1], (ipc_t *)ipc_kobj); + int ret = thread_ipc_recv(&ret_msg, ipc_tm_out, &f->regs[1], (ipc_t *)ipc_kobj); if (ret < 0) { return msg_tag_init4(0, 0, 0, ret); @@ -729,10 +733,10 @@ msg_tag_t thread_do_ipc(kobject_t *kobj, entry_frame_t *f, umword_t user_id) } case IPC_SEND: { - msg_tag_t in_tag = msg_tag_init(f->r[0]); + msg_tag_t in_tag = msg_tag_init(f->regs[0]); msg_tag_t recv_tag; - // th_hd = f->r[2]; - ipc_timeout_t ipc_tm_out = ipc_timeout_create(f->r[3]); + // th_hd = f->regs[2]; + ipc_timeout_t ipc_tm_out = ipc_timeout_create(f->regs[3]); to_th->user_id = user_id; ret = thread_ipc_call(to_th, in_tag, NULL, ipc_tm_out, NULL, FALSE); @@ -754,7 +758,7 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t if (sys_p.prot != THREAD_PROT) { - f->r[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -EPROTO).raw; return; } @@ -764,19 +768,19 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t { umword_t stack_bottom = 0; - if (f->r[4]) //!< cp_stack + if (f->regs[4]) //!< cp_stack { stack_bottom = (umword_t)(cur_th->msg.msg); } - thread_set_exc_regs(tag_th, f->r[1], f->r[2], f->r[3], stack_bottom); + thread_set_exc_regs(tag_th, f->regs[1], f->regs[2], f->regs[3], stack_bottom); tag = msg_tag_init4(0, 0, 0, 0); } break; case MSG_BUG_SET: { - if (is_rw_access(thread_get_bind_task(tag_th), (void *)(f->r[1]), THREAD_MSG_BUG_LEN, FALSE)) + if (is_rw_access(thread_get_bind_task(tag_th), (void *)(f->regs[1]), THREAD_MSG_BUG_LEN, FALSE)) { - thread_set_msg_bug(tag_th, (void *)(f->r[1])); + thread_set_msg_bug(tag_th, (void *)(f->regs[1])); tag = msg_tag_init4(0, 0, 0, 0); } else @@ -787,8 +791,8 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t } case MSG_BUG_GET: { - f->r[1] = (umword_t)(tag_th->msg.msg); - f->r[2] = THREAD_MSG_BUG_LEN; + f->regs[1] = (umword_t)(tag_th->msg.msg); + f->regs[2] = THREAD_MSG_BUG_LEN; if (tag_th->msg.msg == NULL) { tag = msg_tag_init4(0, 0, 0, -EACCES); @@ -816,13 +820,13 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t umword_t status = cpulock_lock(); if (!slist_in_list(&tag_th->sche.node)) { - tag_th->sche.prio = (f->r[1] >= PRIO_MAX ? PRIO_MAX - 1 : f->r[1]); + tag_th->sche.prio = (f->regs[1] >= PRIO_MAX ? PRIO_MAX - 1 : f->regs[1]); thread_ready(tag_th, TRUE); } else { thread_suspend(tag_th); - tag_th->sche.prio = (f->r[1] >= PRIO_MAX ? PRIO_MAX - 1 : f->r[1]); + tag_th->sche.prio = (f->regs[1] >= PRIO_MAX ? PRIO_MAX - 1 : f->regs[1]); thread_ready(tag_th, TRUE); } cpulock_set(status); @@ -831,15 +835,15 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t break; case BIND_TASK: { - kobject_t *task_kobj = obj_space_lookup_kobj_cmp_type(&task->obj_space, f->r[1], TASK_TYPE); + kobject_t *task_kobj = obj_space_lookup_kobj_cmp_type(&task->obj_space, f->regs[1], TASK_TYPE); if (task_kobj == NULL) { - f->r[0] = msg_tag_init4(0, 0, 0, -ENOENT).raw; + f->regs[0] = msg_tag_init4(0, 0, 0, -ENOENT).raw; return; } thread_bind(tag_th, task_kobj); tag = msg_tag_init4(0, 0, 0, 0); - // printk("thread bind to %d\n", f->r[1]); + // printk("thread bind to %d\n", f->regs[1]); } break; case YIELD: @@ -854,7 +858,7 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t } break; } - f->r[0] = tag.raw; + f->regs[0] = tag.raw; } /** diff --git a/mkrtos_knl/knl/thread_knl.c b/mkrtos_knl/knl/thread_knl.c index 721a34867..16597237d 100755 --- a/mkrtos_knl/knl/thread_knl.c +++ b/mkrtos_knl/knl/thread_knl.c @@ -122,37 +122,47 @@ static void knl_init_2(void) extern mword_t cpio_images; umword_t ret_addr; + size_t size; - ret_addr = cpio_find_file(cpio_images, (umword_t)(-1), "init.elf"); + init_thread = thread_create(&root_factory_get()->limit); + assert(init_thread); + init_task = task_create(&root_factory_get()->limit, FALSE); + assert(init_task); + +#if IS_ENABLED(CONFIG_ELF_LAUNCH) + addr_t entry; + + ret_addr = cpio_find_file(cpio_images, (umword_t)(-1), "init.elf", &size); 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; + elf_load(init_task, ret_addr, size, &entry); + thread_set_msg_bug(init_thread, NULL /*TODO:*/); + thread_user_pf_set(init_thread, (void *)(entry), NULL, + NULL, 0); +#else + 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); + thread_set_msg_bug(init_thread, (char *)(init_task->mm_space.mm_block) + app->i.ram_size); + 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); +#endif + thread_bind(init_thread, &init_task->kobj); + 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 index 2ed38e959..678790a6f 100644 --- a/mkrtos_knl/lib/cpio.c +++ b/mkrtos_knl/lib/cpio.c @@ -4,7 +4,7 @@ #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) +umword_t cpio_find_file(umword_t st, umword_t en, const char *name, size_t *size) { uint8_t rByte; int32_t bk_inx; @@ -22,6 +22,10 @@ umword_t cpio_find_file(umword_t st, umword_t en, const char *name) const char *f_name = (char *)(i + sizeof(cpio_fs_t)); if (strcmp(f_name, name) == 0) { + if (size) + { + *size = htoi(file_info->c_filesize, 8); + } return (mword_t)(ALIGN(i + sizeof(cpio_fs_t) + name_size, 4)); } diff --git a/mkrtos_knl/test/CMakeLists.txt b/mkrtos_knl/test/CMakeLists.txt new file mode 100755 index 000000000..b70bdf51f --- /dev/null +++ b/mkrtos_knl/test/CMakeLists.txt @@ -0,0 +1,19 @@ +cmake_minimum_required(VERSION 3.13) + + +file(GLOB_RECURSE deps *.c *.S) + +add_library(test STATIC ${deps}) + +target_include_directories( + test + PUBLIC + ${CMAKE_SOURCE_DIR}/mkrtos_knl/arch/${CONFIG_ARCH}/${CONFIG_CPU_TYPE} + ${CMAKE_SOURCE_DIR}/mkrtos_knl/arch/${CONFIG_ARCH}/ + + ${CMAKE_SOURCE_DIR}/mkrtos_knl/inc/lib + ${CMAKE_SOURCE_DIR}/mkrtos_knl/inc/knl + ${CMAKE_SOURCE_DIR}/mkrtos_knl/inc/test + ${CMAKE_SOURCE_DIR}/mkrtos_knl/arch/inc + ${CMAKE_SOURCE_DIR}/mkrtos_knl/inc/drv +) diff --git a/mkrtos_knl/test/buddy_slab_test.c b/mkrtos_knl/test/buddy_slab_test.c new file mode 100644 index 000000000..3c48808d0 --- /dev/null +++ b/mkrtos_knl/test/buddy_slab_test.c @@ -0,0 +1,17 @@ + +#include +#include +#include +#include +#include + +void buddy_slab_init(void) +{ +#define MEM_SIZE (128 * 1024) + void *mem = buddy_alloc(buddy_get_alloter(), MEM_SIZE); + + assert(mem); + memset(mem, 0, MEM_SIZE); + buddy_free(buddy_get_alloter(), mem); +#undef MEM_SIZE +} diff --git a/mkrtos_knl/test/knl_test.c b/mkrtos_knl/test/knl_test.c new file mode 100644 index 000000000..af388703b --- /dev/null +++ b/mkrtos_knl/test/knl_test.c @@ -0,0 +1,12 @@ + +#include +#include +#include +#include +#include +#include +void knl_test(void) +{ + kthread_test_init(); + buddy_slab_init(); +} diff --git a/mkrtos_knl/knl/knl_test.c b/mkrtos_knl/test/kthread_test.c similarity index 97% rename from mkrtos_knl/knl/knl_test.c rename to mkrtos_knl/test/kthread_test.c index a30b2b90e..0d3f37b68 100644 --- a/mkrtos_knl/knl/knl_test.c +++ b/mkrtos_knl/test/kthread_test.c @@ -3,6 +3,7 @@ #include #include #include + static void th_test(void *arg) { int a[20]; @@ -35,7 +36,7 @@ static void th_test2(void *arg) printk("\n"); } } -void knl_test(void) +void kthread_test_init(void) { thread_t *thread2; task_t *cur_tk = thread_get_current_task(); @@ -53,4 +54,4 @@ void knl_test(void) thread_bind(thread3, &cur_tk->kobj); thread_knl_pf_set(thread3, th_test2); thread_ready(thread3, FALSE); -} +} \ No newline at end of file diff --git a/mkrtos_script/build_f2.sh b/mkrtos_script/build_f2.sh index 8ad0adb41..67d53ec98 100755 --- a/mkrtos_script/build_f2.sh +++ b/mkrtos_script/build_f2.sh @@ -7,7 +7,7 @@ export TOOLCHAIN=/home/zhangzheng/gcc-arm/gcc-arm-none-eabi-10.3-2021.10/bin/ export TOOLCHAIN_LIB=/home/zhangzheng/gcc-arm/gcc-arm-none-eabi-10.3-2021.10/lib/gcc/arm-none-eabi/10.3.1/thumb/v7-m/nofp export BOARD=STM32F205 -export CROSS_COMPILER=arm-none-eabi- +export CROSS_COMPILE=arm-none-eabi- set -e cmake -G Ninja -B build/$KNL . diff --git a/mkrtos_script/build_qemu_aarch64.sh b/mkrtos_script/build_qemu_aarch64.sh index 9f8d0f2c3..f6a6b3e52 100755 --- a/mkrtos_script/build_qemu_aarch64.sh +++ b/mkrtos_script/build_qemu_aarch64.sh @@ -3,7 +3,7 @@ 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 BOARD=aarch64_qemu -export CROSS_COMPILER=aarch64-none-elf- +export CROSS_COMPILE_NAME=aarch64-none-elf- set -e cmake -G Ninja -B build/$KNL . diff --git a/mkrtos_user/CMakeLists.txt b/mkrtos_user/CMakeLists.txt index e817d876a..a3353edc2 100644 --- a/mkrtos_user/CMakeLists.txt +++ b/mkrtos_user/CMakeLists.txt @@ -1,5 +1,40 @@ 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 \ + " ) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} \ + -fPIC -fPIE -n -pie -fpie -fpic -msingle-pic-base -mno-pic-data-is-text-relative \ + " ) + + set(CORTEX_M_LINK_FLAGS "-pie") + set(LIBC_NAME "mulsc") + set(ARCH_NAME "armv7_8m") + + include_directories( + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include + ) + +elseif(${CONFIG_ARCH} STREQUAL "aarch64") + set(CORTEX_M_LINK_FLAGS " --gc-section -z max-page-size=0x1000 -z common-page-size=0x1000 ") + set(LIBC_NAME "c") + set(ARCH_NAME "aarch64") + + include_directories( + ${CMAKE_SOURCE_DIR}/build/libc/output/include + ) +endif() add_subdirectory(server) add_subdirectory(lib) diff --git a/mkrtos_user/lib/CMakeLists.txt b/mkrtos_user/lib/CMakeLists.txt index 0c525d0fd..8e0d29eae 100644 --- a/mkrtos_user/lib/CMakeLists.txt +++ b/mkrtos_user/lib/CMakeLists.txt @@ -1,32 +1,22 @@ cmake_minimum_required(VERSION 3.13) -add_subdirectory(sys) -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 \ - " ) +if (${ARCH_NAME} STREQUAL "armv7_8m") # 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 + add_subdirectory(mkrtos-musl) +endif() +add_subdirectory(sys) +add_subdirectory(sys_util) +add_subdirectory(util) +add_subdirectory(sys_svr) +add_subdirectory(libc_backend) +add_subdirectory(cpio) diff --git a/mkrtos_user/lib/cpio/CMakeLists.txt b/mkrtos_user/lib/cpio/CMakeLists.txt index 6802307a6..21b0d479c 100644 --- a/mkrtos_user/lib/cpio/CMakeLists.txt +++ b/mkrtos_user/lib/cpio/CMakeLists.txt @@ -1,13 +1,6 @@ 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) add_library( cpio @@ -19,20 +12,7 @@ target_include_directories( PUBLIC ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio/ ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc - - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc/${ARCH_NAME} ) -# target_link_libraries( -# cpio -# PUBLIC -# muslc -# ) -# add_dependencies(cpio muslc) diff --git a/mkrtos_user/lib/cutest b/mkrtos_user/lib/cutest deleted file mode 160000 index a0d4c6215..000000000 --- a/mkrtos_user/lib/cutest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a0d4c6215a1c08abf95bf5541db95d675d77fdb3 diff --git a/mkrtos_user/lib/libc_backend/CMakeLists.txt b/mkrtos_user/lib/libc_backend/CMakeLists.txt index 8c889c43b..912c9f661 100644 --- a/mkrtos_user/lib/libc_backend/CMakeLists.txt +++ b/mkrtos_user/lib/libc_backend/CMakeLists.txt @@ -1,38 +1,51 @@ cmake_minimum_required(VERSION 3.13) - -file(GLOB_RECURSE deps *.c *.S) +file(GLOB deps src/*.c src/*.S) +file(GLOB arch_src src/${ARCH_NAME}/*.c src/${ARCH_NAME}/*.S) +list(APPEND deps ${arch_src}) add_library( libc_be STATIC ${deps} ) -target_include_directories( - libc_be - PUBLIC - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_be/inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc +set_target_properties(libc_be PROPERTIES LINK_FLAGS ${CORTEX_M_LINK_FLAGS}) - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include -) -target_link_libraries( - libc_be - PUBLIC - muslc - sys - sys_svr -) -set_target_properties(libc_be PROPERTIES LINK_FLAGS "-pie ") - -add_dependencies(libc_be sys) +if (${ARCH_NAME} STREQUAL "armv7_8m") + target_include_directories( + libc_be + PUBLIC + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_be/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + ) + target_link_libraries( + libc_be + PUBLIC + muslc + sys + sys_svr + ) +elseif(${CONFIG_ARCH} STREQUAL "aarch64" ) + target_include_directories( + libc_be + PUBLIC + # ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mkrtos-musl/src/internal + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mkrtos-musl/arch/aarch64 + ) + target_link_libraries( + libc_be + PRIVATE + ${LIBC_NAME} + sys + sys_svr + ) +endif() +add_dependencies(libc_be sys sys_svr) diff --git a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h index ee770ea62..09ce81b73 100644 --- a/mkrtos_user/lib/libc_backend/inc/syscall_backend.h +++ b/mkrtos_user/lib/libc_backend/inc/syscall_backend.h @@ -71,14 +71,13 @@ umword_t be_mmap2(void *start, long _offset); long be_clock_gettime(clockid_t clk_id, struct timespec *tp); -umword_t sys_mmap2(va_list ap); +long sys_mmap2(va_list ap); long sys_set_tid_address(va_list ap); long sys_set_thread_area(va_list ap); void sys_exit(va_list ap); -umword_t sys_munmap(va_list ap); +long sys_munmap(va_list ap); int be_futex(uint32_t *uaddr, int futex_op, uint32_t val, const struct timespec *timeout, uint32_t uaddr2, uint32_t val3); - void pthread_cnt_inc(void); int pthread_cnt_dec(void); int pthread_get(void); diff --git a/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c b/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c new file mode 100644 index 000000000..fc6b1f4d3 --- /dev/null +++ b/mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c @@ -0,0 +1,42 @@ +#include "syscall_backend.h" +#include "misc_backend.h" +#include +#include + +typedef long (*sys_call_func)(va_list ap); + +static const sys_call_func sys_call_list[] = { + // TODO: add syscall func pointer. + // [SYS_munmap] = sys_munmap, + // [SYS_mmap2] = sys_mmap2, + [SYS_read] = sys_be_read, // + [SYS_write] = sys_be_write, // + [SYS_writev] = sys_be_writev, // + [SYS_ioctl] = sys_be_ioctl, // + [SYS_set_tid_address] = sys_set_tid_address, // + // [__ARM_NR_set_tls] = sys_set_thread_area, // + // [SYS_exit] = be_exit, +}; + +static const int sys_call_func_nr = sizeof(sys_call_list) / sizeof(sys_call_func); + +long syscall_backend(long sys_inx, ...) +{ + long ret = -ENOSYS; + if (sys_inx < 0 || sys_inx >= sys_call_func_nr) + { + return -ENOSYS; + } + + if (sys_call_list[sys_inx]) + { + + va_list ap; + + va_start(ap, sys_inx); + ret = sys_call_list[sys_inx](ap); + va_end(ap); + } + + return ret; +} diff --git a/mkrtos_user/lib/libc_backend/src/mm_backend.c b/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c similarity index 98% rename from mkrtos_user/lib/libc_backend/src/mm_backend.c rename to mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c index f80d1d9bf..918e6f8cd 100644 --- a/mkrtos_user/lib/libc_backend/src/mm_backend.c +++ b/mkrtos_user/lib/libc_backend/src/armv7_8m/mm_backend.c @@ -129,7 +129,7 @@ umword_t be_mmap2(void *start, } return addr; } -umword_t sys_mmap2(va_list ap) +long sys_mmap2(va_list ap) { void *start; size_t len; @@ -152,7 +152,7 @@ umword_t be_munmap(void *start, size_t len) // printf("munmap 0x%x, 0x%x.\n", start, len); mm_page_free(((umword_t)(start) - (umword_t)heap_addr) / PAGE_SIZE, len / PAGE_SIZE); } -umword_t sys_munmap(va_list ap) +long sys_munmap(va_list ap) { void *start; size_t len; diff --git a/mkrtos_user/lib/libc_backend/src/pthread_comp.S b/mkrtos_user/lib/libc_backend/src/armv7_8m/pthread_comp.S similarity index 100% rename from mkrtos_user/lib/libc_backend/src/pthread_comp.S rename to mkrtos_user/lib/libc_backend/src/armv7_8m/pthread_comp.S diff --git a/mkrtos_user/lib/libc_backend/src/syscall_backend.c b/mkrtos_user/lib/libc_backend/src/armv7_8m/syscall_backend.c similarity index 100% rename from mkrtos_user/lib/libc_backend/src/syscall_backend.c rename to mkrtos_user/lib/libc_backend/src/armv7_8m/syscall_backend.c diff --git a/mkrtos_user/lib/libc_backend/src/be_exit.c b/mkrtos_user/lib/libc_backend/src/be_exit.c index a68641576..529811055 100644 --- a/mkrtos_user/lib/libc_backend/src/be_exit.c +++ b/mkrtos_user/lib/libc_backend/src/be_exit.c @@ -11,7 +11,6 @@ #include "u_ipc.h" #include "u_sys.h" #include "u_futex.h" -#include #include #include #include @@ -19,13 +18,19 @@ #include #include #include +#include +#undef hidden +#undef weak +#define hidden +#include +#include #include #include #define FUTEX_WAKE_CLEAR 10 void be_exit(long exit_code) { - struct pthread *pt = __pthread_self(); + struct __pthread *pt = __pthread_self(); int th_hd = pt->hd; int *old_ctid = (int *)(pt->ctid); diff --git a/mkrtos_user/lib/libc_backend/src/futex_backend.c b/mkrtos_user/lib/libc_backend/src/futex_backend.c index a1e0da571..f54a75aaa 100644 --- a/mkrtos_user/lib/libc_backend/src/futex_backend.c +++ b/mkrtos_user/lib/libc_backend/src/futex_backend.c @@ -22,6 +22,11 @@ #include #include #include +#include +#include +#undef hidden +#undef weak +#define hidden #include #include #include diff --git a/mkrtos_user/lib/libc_backend/src/misc_backend.c b/mkrtos_user/lib/libc_backend/src/misc_backend.c index aea30dc69..836deff48 100644 --- a/mkrtos_user/lib/libc_backend/src/misc_backend.c +++ b/mkrtos_user/lib/libc_backend/src/misc_backend.c @@ -7,9 +7,13 @@ #include "u_log.h" #include "u_thread.h" #include "u_sys.h" -#include #include #include +#undef hidden +#undef weak +#define hidden +#include +#include long be_set_tid_address(int *val) { struct pthread *pt = pthread_self(); diff --git a/mkrtos_user/lib/libc_backend/src/pthread_backend.c b/mkrtos_user/lib/libc_backend/src/pthread_backend.c deleted file mode 100644 index e69de29bb..000000000 diff --git a/mkrtos_user/lib/libc_backend/src/sys_backend.c b/mkrtos_user/lib/libc_backend/src/sys_backend.c index 59d6fb076..b3fc76f47 100644 --- a/mkrtos_user/lib/libc_backend/src/sys_backend.c +++ b/mkrtos_user/lib/libc_backend/src/sys_backend.c @@ -30,9 +30,14 @@ #include #include #include +#undef hidden +#undef weak +#define hidden +#include #include #include static int pthread_cnt = 1; +#define PTHREAD_DONT_RUN 0x1 void pthread_cnt_inc(void) { diff --git a/mkrtos_user/lib/mkrtos-musl b/mkrtos_user/lib/mkrtos-musl index 7ada6dde6..1fb9f8403 160000 --- a/mkrtos_user/lib/mkrtos-musl +++ b/mkrtos_user/lib/mkrtos-musl @@ -1 +1 @@ -Subproject commit 7ada6dde6f9dc6a2836c3d92c2f762d35fd229e0 +Subproject commit 1fb9f8403397f87b646f23fb236fa96505e1d62f diff --git a/mkrtos_user/lib/sys/CMakeLists.txt b/mkrtos_user/lib/sys/CMakeLists.txt index 32ad5a939..baa14bef0 100644 --- a/mkrtos_user/lib/sys/CMakeLists.txt +++ b/mkrtos_user/lib/sys/CMakeLists.txt @@ -2,8 +2,9 @@ cmake_minimum_required(VERSION 3.13) file(GLOB deps src/*.c src/*.S) -file(GLOB deps_arch ${CONFIG_ARCH}/*.c ${CONFIG_ARCH}/*.S) -file(APPEND deps deps_arch) +file(GLOB deps_arch src/${ARCH_NAME}/*.c src/${ARCH_NAME}/*.S) +list(APPEND deps ${deps_arch}) +# message(======sys_list:${deps}) add_library( sys STATIC @@ -13,20 +14,6 @@ target_include_directories( sys PUBLIC ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc/${ARCH_NAME} - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include ) -# target_link_libraries( -# sys -# PUBLIC -# muslc -# ) -# add_dependencies(sys muslc) - - diff --git a/mkrtos_user/lib/sys/deps b/mkrtos_user/lib/sys/deps deleted file mode 100644 index 54082f381..000000000 --- a/mkrtos_user/lib/sys/deps +++ /dev/null @@ -1 +0,0 @@ -deps_archdeps_archdeps_archdeps_arch \ No newline at end of file diff --git a/mkrtos_user/lib/sys/inc/aarch64/u_arch_hard.h b/mkrtos_user/lib/sys/inc/aarch64/u_arch_hard.h new file mode 100644 index 000000000..e4ceb0d6d --- /dev/null +++ b/mkrtos_user/lib/sys/inc/aarch64/u_arch_hard.h @@ -0,0 +1,16 @@ +#pragma once + +#define TASK_RAM_BASE() \ + ({ \ + umword_t _val = 0; \ + _val; \ + }) + +#define ARCH_REG_0 "x0" +#define ARCH_REG_1 "x1" +#define ARCH_REG_2 "x2" +#define ARCH_REG_3 "x3" +#define ARCH_REG_4 "x4" +#define ARCH_REG_5 "x5" +#define ARCH_REG_6 "x6" +#define ARCH_REG_7 "x7" diff --git a/mkrtos_user/lib/sys/inc/armv7_8m/u_arch_hard.h b/mkrtos_user/lib/sys/inc/armv7_8m/u_arch_hard.h new file mode 100644 index 000000000..857db1827 --- /dev/null +++ b/mkrtos_user/lib/sys/inc/armv7_8m/u_arch_hard.h @@ -0,0 +1,21 @@ +#pragma once + +#define TASK_RAM_BASE() \ + ({ \ + umword_t _val; \ + __asm__ __volatile__( \ + "mov %0, r9\n" \ + : "=r"(_val) \ + : \ + :); \ + _val; \ + }) + +#define ARCH_REG_0 "r0" +#define ARCH_REG_1 "r1" +#define ARCH_REG_2 "r2" +#define ARCH_REG_3 "r3" +#define ARCH_REG_4 "r4" +#define ARCH_REG_5 "r5" +#define ARCH_REG_6 "r6" +#define ARCH_REG_7 "r7" diff --git a/mkrtos_user/lib/sys/inc/u_arch.h b/mkrtos_user/lib/sys/inc/u_arch.h index 63421c98f..08712d41f 100644 --- a/mkrtos_user/lib/sys/inc/u_arch.h +++ b/mkrtos_user/lib/sys/inc/u_arch.h @@ -1,21 +1,10 @@ #pragma once #include "u_types.h" -// #define CONFIG_SYS_SCHE_HZ 1000 //!< 系统调度频率 - -#define MK_PAGE_SIZE 512 +#include "u_arch_hard.h" +#define MK_PAGE_SIZE (1UL << CONFIG_PAGE_SHIFT) #define WORD_BYTES (sizeof(void *)) #define WORD_BITS (WORD_BYTES * 8) -#define TASK_RAM_BASE() \ - ({ \ - umword_t _val; \ - __asm__ __volatile__( \ - "mov %0, r9\n" \ - : "=r"(_val) \ - : \ - :); \ - _val; \ - }) static inline uint16_t swap_u16(uint16_t data) { diff --git a/mkrtos_user/lib/sys/inc/u_mm.h b/mkrtos_user/lib/sys/inc/u_mm.h index 42e0ff7ee..84777b5db 100644 --- a/mkrtos_user/lib/sys/inc/u_mm.h +++ b/mkrtos_user/lib/sys/inc/u_mm.h @@ -2,14 +2,13 @@ #include "u_types.h" #include "u_prot.h" - +#include "u_arch.h" enum region_rights { REGION_PRIV = 1, REGION_RO = 2, REGION_RWX = 3, }; -#define MK_PAGE_SIZE 512 void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs); void mm_free_page(obj_handler_t obj_inx, void *addr, umword_t pfn_nr); msg_tag_t mm_align_alloc(obj_handler_t obj_inx, void *addr, umword_t size); diff --git a/mkrtos_user/lib/sys/inc/u_types.h b/mkrtos_user/lib/sys/inc/u_types.h index 6c02ac4ff..ec28c0824 100755 --- a/mkrtos_user/lib/sys/inc/u_types.h +++ b/mkrtos_user/lib/sys/inc/u_types.h @@ -2,6 +2,8 @@ #pragma once #include +#include + #include "u_arch.h" #include "u_util.h" typedef unsigned long umword_t; @@ -32,9 +34,9 @@ typedef union mk_sd #define mk_sd_get_hd(sd) ((obj_handler_t)((sd).hd)) #define mk_sd_get_fd(sd) ((int)((sd).fd)) -#ifndef NULL -#define NULL ((void *)0) -#endif +// #ifndef NULL +// #define NULL ((void *)0) +// #endif #ifndef FALSE #define FALSE 0 diff --git a/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S b/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S index 69c854096..22fe352a2 100644 --- a/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S +++ b/mkrtos_user/lib/sys/src/aarch64/syscall_aarch64.S @@ -6,5 +6,12 @@ int mk_syscall(int nr, ...) .global mk_syscall .type mk_syscall, %function mk_syscall: + mov x7, x0 + mov x0, x1 + mov x1, x2 + mov x2, x3 + mov x3, x4 + mov x4, x5 + mov x5, x6 hvc 0 ret diff --git a/mkrtos_user/lib/sys/src/cortex-m3/syscall_armv7_8m.S b/mkrtos_user/lib/sys/src/armv7_8m/syscall_armv7_8m.S similarity index 100% rename from mkrtos_user/lib/sys/src/cortex-m3/syscall_armv7_8m.S rename to mkrtos_user/lib/sys/src/armv7_8m/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 deleted file mode 100644 index fc8be995f..000000000 --- a/mkrtos_user/lib/sys/src/cortex-m33/syscall_armv7_8m.S +++ /dev/null @@ -1,19 +0,0 @@ -.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 deleted file mode 100644 index fc8be995f..000000000 --- a/mkrtos_user/lib/sys/src/cortex-m4/syscall_armv7_8m.S +++ /dev/null @@ -1,19 +0,0 @@ -.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/u_factory.c b/mkrtos_user/lib/sys/src/u_factory.c index 2bf85b5a1..e121fafdc 100644 --- a/mkrtos_user/lib/sys/src/u_factory.c +++ b/mkrtos_user/lib/sys/src/u_factory.c @@ -9,7 +9,7 @@ enum }; msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, @@ -24,7 +24,7 @@ msg_tag_t factory_create_irq_sender(obj_handler_t obj, vpage_t vpage) } msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, @@ -39,7 +39,7 @@ msg_tag_t factory_create_thread(obj_handler_t obj, vpage_t vpage) } msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, @@ -54,7 +54,7 @@ msg_tag_t factory_create_task(obj_handler_t obj, vpage_t vpage) } msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, @@ -66,14 +66,14 @@ msg_tag_t factory_create_ipc(obj_handler_t obj, vpage_t vpage) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; } msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t size) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(FACTORY_CREATE_KOBJ, FACTORY_PROT, obj).raw, 0, @@ -85,7 +85,7 @@ msg_tag_t facotry_create_share_mem(obj_handler_t obj, vpage_t vpage, umword_t si asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; diff --git a/mkrtos_user/lib/sys/src/u_futex.c b/mkrtos_user/lib/sys/src/u_futex.c index ad7f25a8b..bdd6433af 100644 --- a/mkrtos_user/lib/sys/src/u_futex.c +++ b/mkrtos_user/lib/sys/src/u_futex.c @@ -28,7 +28,7 @@ msg_tag_t futex_ctrl(obj_handler_t obj, uint32_t *uaddr, int futex_op, uint32_t msg->msg_buf[5] = (umword_t)val3; msg->msg_buf[6] = (umword_t)tid; { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(FUTEX_CTRL, FUTEX_PROT, obj).raw, 0, 0, diff --git a/mkrtos_user/lib/sys/src/u_ipc.c b/mkrtos_user/lib/sys/src/u_ipc.c index 2b7a93771..e8575d51d 100644 --- a/mkrtos_user/lib/sys/src/u_ipc.c +++ b/mkrtos_user/lib/sys/src/u_ipc.c @@ -11,7 +11,7 @@ enum ipc_op }; msg_tag_t ipc_bind(obj_handler_t obj, obj_handler_t th_obj, umword_t user_obj) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(IPC_BIND, IPC_PROT, obj).raw, th_obj, @@ -23,7 +23,7 @@ msg_tag_t ipc_bind(obj_handler_t obj, obj_handler_t th_obj, umword_t user_obj) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; diff --git a/mkrtos_user/lib/sys/src/u_irq_sender.c b/mkrtos_user/lib/sys/src/u_irq_sender.c index 79415df65..9c6265ca2 100644 --- a/mkrtos_user/lib/sys/src/u_irq_sender.c +++ b/mkrtos_user/lib/sys/src/u_irq_sender.c @@ -22,7 +22,7 @@ enum irq_sender_op }; msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no, u_irq_prio_t prio_sub_pre) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(BIND_IRQ, IRQ_PROT, obj_inx).raw, 0, @@ -34,14 +34,14 @@ msg_tag_t uirq_bind(obj_handler_t obj_inx, umword_t irq_no, u_irq_prio_t prio_su asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; } msg_tag_t uirq_wait(obj_handler_t obj_inx, int flags) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(WAIT_IRQ, IRQ_PROT, obj_inx).raw, 0, @@ -53,14 +53,14 @@ msg_tag_t uirq_wait(obj_handler_t obj_inx, int flags) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; } msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(ACK_IRQ, IRQ_PROT, obj_inx).raw, 0, @@ -72,7 +72,7 @@ msg_tag_t uirq_ack(obj_handler_t obj_inx, umword_t irq_no) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; diff --git a/mkrtos_user/lib/sys/src/u_log.c b/mkrtos_user/lib/sys/src/u_log.c index 4070bf335..aebda1cc4 100644 --- a/mkrtos_user/lib/sys/src/u_log.c +++ b/mkrtos_user/lib/sys/src/u_log.c @@ -14,23 +14,23 @@ enum log_op }; static msg_tag_t ulog_read_bytes_raw(obj_handler_t obj_inx, umword_t data[5], int len) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); - register volatile umword_t r3 asm("r3"); - register volatile umword_t r4 asm("r4"); - register volatile umword_t r5 asm("r5"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); + register volatile umword_t r3 asm(ARCH_REG_3); + register volatile umword_t r4 asm(ARCH_REG_4); + register volatile umword_t r5 asm(ARCH_REG_5); mk_syscall(syscall_prot_create(READ_DATA, LOG_PROT, obj_inx).raw, - msg_tag_init4(0, 0, 0, 0).raw, - len, - 0, - 0, - 0, - 0); - asm __volatile__("" + msg_tag_init4(0, 0, 0, 0).raw, + len, + 0, + 0, + 0, + 0); + asm __volatile__("" : : - : "r0","r1","r2","r3","r4","r5"); + : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2, ARCH_REG_3, ARCH_REG_4, ARCH_REG_5); msg_tag_t tag = msg_tag_init(r0); { ((umword_t *)data)[0] = r1; @@ -73,12 +73,12 @@ void ulog_write_bytes(obj_handler_t obj_inx, const uint8_t *data, umword_t len) { umword_t *write_word_buf = (umword_t *)write_buf; mk_syscall(syscall_prot_create(WRITE_DATA, LOG_PROT, obj_inx).raw, - msg_tag_init4(0, ROUND_UP(i, WORD_BYTES), 0, 0).raw, - write_word_buf[0], - write_word_buf[1], - write_word_buf[2], - write_word_buf[3], - write_word_buf[4]); + msg_tag_init4(0, ROUND_UP(i, WORD_BYTES), 0, 0).raw, + write_word_buf[0], + write_word_buf[1], + write_word_buf[2], + write_word_buf[3], + write_word_buf[4]); } if (j >= len) { diff --git a/mkrtos_user/lib/sys/src/u_mm.c b/mkrtos_user/lib/sys/src/u_mm.c index 6d87c13a3..6a0af4c46 100644 --- a/mkrtos_user/lib/sys/src/u_mm.c +++ b/mkrtos_user/lib/sys/src/u_mm.c @@ -13,10 +13,10 @@ enum mm_op }; void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); - register volatile umword_t r3 asm("r3"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); + register volatile umword_t r3 asm(ARCH_REG_3); mk_syscall(syscall_prot_create(MM_ALLOC, MM_PROT, obj_inx).raw, 0, pnf_nr, @@ -27,7 +27,7 @@ void *mm_alloc_page(obj_handler_t obj_inx, umword_t pnf_nr, uint8_t attrs) asm __volatile__("" : : - : "r0", "r1", "r2", "r3"); + : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2, ARCH_REG_3); { msg_tag_t tag = msg_tag_init(r0); @@ -51,7 +51,7 @@ void mm_free_page(obj_handler_t obj_inx, void *addr, umword_t pfn_nr) } msg_tag_t mm_align_alloc(obj_handler_t obj_inx, void *addr, umword_t size) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(MM_ALIGN_ALLOC, MM_PROT, obj_inx).raw, 0, diff --git a/mkrtos_user/lib/sys/src/u_share_mem.c b/mkrtos_user/lib/sys/src/u_share_mem.c index 35ec52ab7..93795c4db 100644 --- a/mkrtos_user/lib/sys/src/u_share_mem.c +++ b/mkrtos_user/lib/sys/src/u_share_mem.c @@ -10,9 +10,9 @@ enum share_mem_op msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword_t *size) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); mk_syscall(syscall_prot_create4(SHARE_MEM_MAP, SHARE_MEM_PROT, obj, FALSE).raw, attrs, 0, @@ -23,7 +23,7 @@ msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword asm __volatile__("" : : - : "r0", "r1", "r2"); + : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2); if (addr) { *addr = r1; @@ -36,7 +36,7 @@ msg_tag_t share_mem_map(obj_handler_t obj, uint8_t attrs, umword_t *addr, umword } msg_tag_t share_mem_unmap(obj_handler_t obj) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create4(SHARE_MEM_UNMAP, SHARE_MEM_PROT, obj, FALSE).raw, 0, 0, @@ -47,6 +47,6 @@ msg_tag_t share_mem_unmap(obj_handler_t obj) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); return msg_tag_init(r0); } diff --git a/mkrtos_user/lib/sys/src/u_sys.c b/mkrtos_user/lib/sys/src/u_sys.c index b8ee8a385..872386c40 100644 --- a/mkrtos_user/lib/sys/src/u_sys.c +++ b/mkrtos_user/lib/sys/src/u_sys.c @@ -17,10 +17,10 @@ enum sys_op msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); - register volatile umword_t r3 asm("r3"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); + register volatile umword_t r3 asm(ARCH_REG_3); mk_syscall(syscall_prot_create(SYS_INFO_GET, SYS_PROT, obj).raw, 0, @@ -31,7 +31,7 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) 0); asm __volatile__("" : - : : "r0", "r1", "r2", "r3"); + : : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2, ARCH_REG_3); if (info) { info->sys_tick = r1; @@ -43,9 +43,9 @@ msg_tag_t sys_read_info(obj_handler_t obj, sys_info_t *info) } msg_tag_t sys_reboot(obj_handler_t obj) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); mk_syscall(syscall_prot_create(REBOOT, SYS_PROT, obj).raw, 0, @@ -58,15 +58,15 @@ msg_tag_t sys_reboot(obj_handler_t obj) asm __volatile__("" : - : : "r0", "r1", "r2"); + : : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2); return tag; } msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); mk_syscall(syscall_prot_create(MEM_INFO, SYS_PROT, obj).raw, 0, @@ -79,7 +79,7 @@ msg_tag_t sys_mem_info(obj_handler_t obj, umword_t *total, umword_t *free) asm __volatile__("" : - : : "r0", "r1", "r2"); + : : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2); if (total) { @@ -94,7 +94,7 @@ 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) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(DIS_IRQ, SYS_PROT, obj).raw, irq_inx, diff --git a/mkrtos_user/lib/sys/src/u_task.c b/mkrtos_user/lib/sys/src/u_task.c index 577f17a5c..7ab716807 100644 --- a/mkrtos_user/lib/sys/src/u_task.c +++ b/mkrtos_user/lib/sys/src/u_task.c @@ -14,7 +14,7 @@ enum task_op_code }; msg_tag_t task_set_pid(obj_handler_t dst_task, umword_t pid) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(TASK_SET_PID, TASK_PROT, dst_task).raw, pid, @@ -26,15 +26,15 @@ msg_tag_t task_set_pid(obj_handler_t dst_task, umword_t pid) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; } msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); mk_syscall(syscall_prot_create(TASK_GET_PID, TASK_PROT, dst_task).raw, 0, @@ -46,7 +46,7 @@ msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid) asm __volatile__("" : : - : "r0", "r1"); + : ARCH_REG_0, ARCH_REG_1); if (pid) { *pid = r1; @@ -56,8 +56,8 @@ msg_tag_t task_get_pid(obj_handler_t dst_task, umword_t *pid) } msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj_type) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); mk_syscall(syscall_prot_create(TASK_OBJ_VALID, TASK_PROT, dst_task).raw, 0, @@ -69,7 +69,7 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); if (obj_type) { *obj_type = r1; @@ -80,7 +80,7 @@ msg_tag_t task_obj_valid(obj_handler_t dst_task, obj_handler_t obj_inx, int *obj msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t dst_obj, uint8_t attrs) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(TASK_OBJ_MAP, TASK_PROT, dst_task).raw, 0, @@ -92,7 +92,7 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; @@ -100,7 +100,7 @@ msg_tag_t task_map(obj_handler_t dst_task, obj_handler_t src_obj, obj_handler_t msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(TASK_OBJ_UNMAP, TASK_PROT, task_han).raw, 0, @@ -115,8 +115,8 @@ msg_tag_t task_unmap(obj_handler_t task_han, vpage_t vpage) } msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *alloc_addr) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); mk_syscall(syscall_prot_create(TASK_ALLOC_RAM_BASE, TASK_PROT, task_han).raw, 0, @@ -128,7 +128,7 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all asm __volatile__("" : : - : "r0", "r1"); + : ARCH_REG_0, ARCH_REG_1); if (alloc_addr) { *alloc_addr = r1; @@ -138,7 +138,7 @@ msg_tag_t task_alloc_ram_base(obj_handler_t task_han, umword_t size, addr_t *all } msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(TASK_COPY_DATA, TASK_PROT, task_obj).raw, st_addr, @@ -150,7 +150,7 @@ msg_tag_t task_copy_data(obj_handler_t task_obj, void *st_addr, umword_t size) asm __volatile__("" : : - : "r0", "r1"); + : ARCH_REG_0, ARCH_REG_1); return msg_tag_init(r0); } diff --git a/mkrtos_user/lib/sys/src/u_thread.c b/mkrtos_user/lib/sys/src/u_thread.c index 53bfca001..89a580b0b 100644 --- a/mkrtos_user/lib/sys/src/u_thread.c +++ b/mkrtos_user/lib/sys/src/u_thread.c @@ -22,8 +22,8 @@ enum IPC_TYPE }; msg_tag_t thread_ipc_wait(ipc_timeout_t timeout, umword_t *obj, obj_handler_t ipc_obj) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); mk_syscall(syscall_prot_create4(DO_IPC, THREAD_PROT, -1, TRUE).raw, 0, IPC_WAIT, @@ -34,7 +34,7 @@ msg_tag_t thread_ipc_wait(ipc_timeout_t timeout, umword_t *obj, obj_handler_t ip asm __volatile__("" : : - : "r0", "r1"); + : ARCH_REG_0, ARCH_REG_1); if (obj) { *obj = r1; @@ -43,7 +43,7 @@ msg_tag_t thread_ipc_wait(ipc_timeout_t timeout, umword_t *obj, obj_handler_t ip } msg_tag_t thread_ipc_reply(msg_tag_t in_tag, ipc_timeout_t timeout) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create4(DO_IPC, THREAD_PROT, -1, TRUE).raw, in_tag.raw, IPC_REPLY, @@ -54,12 +54,12 @@ msg_tag_t thread_ipc_reply(msg_tag_t in_tag, ipc_timeout_t timeout) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); return msg_tag_init(r0); } msg_tag_t thread_ipc_send(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create4(DO_IPC, THREAD_PROT, target_th_obj, TRUE).raw, in_tag.raw, IPC_SEND, @@ -70,12 +70,12 @@ msg_tag_t thread_ipc_send(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_tim asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); return msg_tag_init(r0); } msg_tag_t thread_ipc_call(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create4(DO_IPC, THREAD_PROT, target_th_obj, TRUE).raw, in_tag.raw, IPC_CALL, @@ -86,12 +86,12 @@ msg_tag_t thread_ipc_call(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_tim asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); return msg_tag_init(r0); } msg_tag_t thread_yield(obj_handler_t obj) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create4(YIELD, THREAD_PROT, obj, TRUE).raw, 0, @@ -103,14 +103,14 @@ msg_tag_t thread_yield(obj_handler_t obj) asm __volatile__("" : : - : "r0", "r1", "r2"); + : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2); return msg_tag_init(r0); } msg_tag_t thread_msg_buf_set(obj_handler_t obj, void *msg) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); mk_syscall(syscall_prot_create(MSG_BUG_SET, THREAD_PROT, obj).raw, 0, @@ -122,14 +122,14 @@ msg_tag_t thread_msg_buf_set(obj_handler_t obj, void *msg) asm __volatile__("" : : - : "r0", "r1", "r2"); + : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2); return msg_tag_init(r0); } msg_tag_t thread_msg_buf_get(obj_handler_t obj, umword_t *msg, umword_t *len) { - register volatile umword_t r0 asm("r0"); - register volatile umword_t r1 asm("r1"); - register volatile umword_t r2 asm("r2"); + register volatile umword_t r0 asm(ARCH_REG_0); + register volatile umword_t r1 asm(ARCH_REG_1); + register volatile umword_t r2 asm(ARCH_REG_2); mk_syscall(syscall_prot_create4(MSG_BUG_GET, THREAD_PROT, obj, TRUE).raw, 0, @@ -141,7 +141,7 @@ msg_tag_t thread_msg_buf_get(obj_handler_t obj, umword_t *msg, umword_t *len) asm __volatile__("" : : - : "r0", "r1", "r2"); + : ARCH_REG_0, ARCH_REG_1, ARCH_REG_2); if (msg) { *msg = r1; @@ -155,7 +155,7 @@ msg_tag_t thread_msg_buf_get(obj_handler_t obj, umword_t *msg, umword_t *len) } msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t ram, umword_t cp_stack) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(SET_EXEC_REGS, THREAD_PROT, obj).raw, 0, @@ -167,14 +167,14 @@ msg_tag_t thread_exec_regs(obj_handler_t obj, umword_t pc, umword_t sp, umword_t asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; } msg_tag_t thread_run(obj_handler_t obj, uint8_t prio) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create4(RUN_THREAD, THREAD_PROT, obj, TRUE).raw, 0, @@ -189,7 +189,7 @@ msg_tag_t thread_run(obj_handler_t obj, uint8_t prio) } msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj) { - register volatile umword_t r0 asm("r0"); + register volatile umword_t r0 asm(ARCH_REG_0); mk_syscall(syscall_prot_create(BIND_TASK, THREAD_PROT, obj).raw, 0, @@ -200,7 +200,7 @@ msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj) asm __volatile__("" : : - : "r0"); + : ARCH_REG_0); msg_tag_t tag = msg_tag_init(r0); return tag; diff --git a/mkrtos_user/lib/sys_svr/CMakeLists.txt b/mkrtos_user/lib/sys_svr/CMakeLists.txt index 96010884b..7d868f0dd 100644 --- a/mkrtos_user/lib/sys_svr/CMakeLists.txt +++ b/mkrtos_user/lib/sys_svr/CMakeLists.txt @@ -1,13 +1,6 @@ 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) add_library( sys_svr @@ -21,24 +14,16 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc - - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include ) target_link_libraries( sys_svr PUBLIC sys - muslc + ${LIBC_NAME} cpio util ) add_dependencies(sys_svr sys) -add_dependencies(sys_svr muslc) +# add_dependencies(sys_svr muslc) diff --git a/mkrtos_user/lib/sys_util/CMakeLists.txt b/mkrtos_user/lib/sys_util/CMakeLists.txt index 4472748f5..ff04cdd77 100644 --- a/mkrtos_user/lib/sys_util/CMakeLists.txt +++ b/mkrtos_user/lib/sys_util/CMakeLists.txt @@ -1,13 +1,6 @@ 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) add_library( sys_util @@ -21,26 +14,19 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc - - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc ) target_link_libraries( sys_util PUBLIC sys - muslc + ${LIBC_NAME} cpio util ) -set_target_properties(sys_util PROPERTIES LINK_FLAGS "-pie ") +set_target_properties(sys_util PROPERTIES LINK_FLAGS ${CORTEX_M_LINK_FLAGS}) add_dependencies(sys_util sys) -add_dependencies(sys_util muslc) +# add_dependencies(sys_util ${LIBC_NAME}) add_dependencies(sys_util util) diff --git a/mkrtos_user/lib/util/CMakeLists.txt b/mkrtos_user/lib/util/CMakeLists.txt index 5cdd41494..612b6cb0b 100644 --- a/mkrtos_user/lib/util/CMakeLists.txt +++ b/mkrtos_user/lib/util/CMakeLists.txt @@ -1,9 +1,6 @@ cmake_minimum_required(VERSION 3.13) -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} " ) -set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ") - file(GLOB_RECURSE deps *.c *.S) add_library( util @@ -16,24 +13,18 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/util/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio + ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include ) target_link_libraries( util PUBLIC sys - muslc + ${LIBC_NAME} cpio ) set_target_properties(util PROPERTIES LINK_FLAGS "-pie ") add_dependencies(util sys) -add_dependencies(util muslc) +# add_dependencies(util muslc) diff --git a/mkrtos_user/server/CMakeLists.txt b/mkrtos_user/server/CMakeLists.txt index b2c414b37..d039e90bb 100644 --- a/mkrtos_user/server/CMakeLists.txt +++ b/mkrtos_user/server/CMakeLists.txt @@ -1,30 +1,37 @@ 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 \ -") -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 ) +if (${ARCH_NAME} STREQUAL "armv7_8m") + set(START_LIB muslc) -add_subdirectory(init) -add_subdirectory(shell) -# add_subdirectory(app) -add_subdirectory(fs) -add_subdirectory(hello) -add_subdirectory(drv) -add_subdirectory(test) -# add_subdirectory(net) -# add_subdirectory(tcc-0.9.27) -add_subdirectory(tinycc-arm-thumb) + add_subdirectory(init) + add_subdirectory(shell) + # add_subdirectory(app) + add_subdirectory(fs) + add_subdirectory(hello) + add_subdirectory(drv) + add_subdirectory(test) + # add_subdirectory(net) + # add_subdirectory(tcc-0.9.27) + add_subdirectory(tinycc-arm-thumb) elseif(${CONFIG_ARCH} STREQUAL "aarch64" ) -#TODO: + set( + START_LIB + "" + ) + set( + START_SRC + ${CMAKE_SOURCE_DIR}/build/libc/output/lib/crt1.o + ${CMAKE_SOURCE_DIR}/build/libc/output/lib/crti.o + ${CMAKE_SOURCE_DIR}/build/libc/output/lib/crtn.o + ) + set( + START_SRC_INIT + ${CMAKE_SOURCE_DIR}/build/libc/output/lib/crt1_init.o + ${CMAKE_SOURCE_DIR}/build/libc/output/lib/crti.o + ${CMAKE_SOURCE_DIR}/build/libc/output/lib/crtn.o + ) + add_subdirectory(init) endif() diff --git a/mkrtos_user/server/init/CMakeLists.txt b/mkrtos_user/server/init/CMakeLists.txt index 2a59729a3..f6e64a6ea 100644 --- a/mkrtos_user/server/init/CMakeLists.txt +++ b/mkrtos_user/server/init/CMakeLists.txt @@ -4,12 +4,15 @@ file(GLOB_RECURSE deps *.c *.S) add_executable(init.elf ${deps} + ${START_SRC_INIT} ) target_link_libraries(init.elf PUBLIC - start_init - muslc + -Bstatic + ${LIBC_NAME} + ${START_LIB} --whole-archive + libc_be sys sys_util sys_svr @@ -27,45 +30,33 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/cpio ${CMAKE_SOURCE_DIR}/mkrtos_user/server/init/src - - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/arm/ - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/arch/generic - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/src/internal - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/obj/include - ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/mlibc/include -) -add_dependencies(init.elf -muslc -util ) set_target_properties(init.elf PROPERTIES LINK_FLAGS -"-T ${CMAKE_CURRENT_LIST_DIR}/link.lds -pie --gc-section -no-dynamic-linker " +"-T ${CMAKE_CURRENT_LIST_DIR}/${ARCH_NAME}/link.lds ${CORTEX_M_LINK_FLAGS} --gc-section -no-dynamic-linker " #--no-warn-rwx-segments ) #-T ${CMAKE_CURRENT_LIST_DIR}/link.lds add_custom_target( init_dump ALL - COMMAND - ${CMAKE_OBJDUMP} -s -S init.elf > ${CMAKE_SOURCE_DIR}/build/output/init.S - COMMAND - ${CMAKE_READELF} -a init.elf > ${CMAKE_SOURCE_DIR}/build/output/init.txt - COMMAND - ${CMAKE_OBJCOPY} -O binary -S init.elf init.bin + # COMMAND + # ${CMAKE_OBJDUMP} -s -S init.elf > ${CMAKE_SOURCE_DIR}/build/output/init.S + # COMMAND + # ${CMAKE_READELF} -a init.elf > ${CMAKE_SOURCE_DIR}/build/output/init.txt + # COMMAND + # ${CMAKE_OBJCOPY} -O binary -S init.elf init.bin COMMAND ${CMAKE_SIZE} init.elf COMMAND mkdir -p ${CMAKE_SOURCE_DIR}/build/output + # COMMAND + # cp init.bin ${CMAKE_SOURCE_DIR}/build/output/init + # COMMAND + # cp init.elf ${CMAKE_SOURCE_DIR}/build/output/init.elf COMMAND - cp init.bin ${CMAKE_SOURCE_DIR}/build/output/init - COMMAND - cp init.elf ${CMAKE_SOURCE_DIR}/build/output/init.elf + cp init.elf ${CMAKE_SOURCE_DIR}/build/output/cpio/init.elf COMMAND cp ${CMAKE_CURRENT_LIST_DIR}/src/init.cfg ${CMAKE_SOURCE_DIR}/build/output/cpio/ ) add_dependencies(init_dump init.elf) -add_dependencies(init.elf muslc) - - \ No newline at end of file +add_dependencies(init.elf libc_be util) diff --git a/mkrtos_user/server/init/aarch64/link.lds b/mkrtos_user/server/init/aarch64/link.lds new file mode 100644 index 000000000..02b6f3347 --- /dev/null +++ b/mkrtos_user/server/init/aarch64/link.lds @@ -0,0 +1,229 @@ +/* Script for -z combreloc */ +/* Copyright (C) 2014-2021 Free Software Foundation, Inc. + Copying and distribution of this script, with or without modification, + are permitted in any medium without royalty provided the copyright + notice and this notice are preserved. */ +OUTPUT_FORMAT("elf64-littleaarch64", "elf64-bigaarch64", + "elf64-littleaarch64") +OUTPUT_ARCH(aarch64) +ENTRY(_start) +SEARCH_DIR("//aarch64-none-elf/lib"); +SECTIONS +{ + /* Read-only sections, merged into text segment: */ + PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x00400000)); . = SEGMENT_START("text-segment", 0x00400000); + .interp : { *(.interp) } + .note.gnu.build-id : { *(.note.gnu.build-id) } + .hash : { *(.hash) } + .gnu.hash : { *(.gnu.hash) } + .dynsym : { *(.dynsym) } + .dynstr : { *(.dynstr) } + .gnu.version : { *(.gnu.version) } + .gnu.version_d : { *(.gnu.version_d) } + .gnu.version_r : { *(.gnu.version_r) } + .rela.dyn : + { + *(.rela.init) + *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) + *(.rela.fini) + *(.rela.rodata .rela.rodata.* .rela.gnu.linkonce.r.*) + *(.rela.data .rela.data.* .rela.gnu.linkonce.d.*) + *(.rela.tdata .rela.tdata.* .rela.gnu.linkonce.td.*) + *(.rela.tbss .rela.tbss.* .rela.gnu.linkonce.tb.*) + *(.rela.ctors) + *(.rela.dtors) + *(.rela.got) + *(.rela.bss .rela.bss.* .rela.gnu.linkonce.b.*) + *(.rela.ifunc) + } + .rela.plt : + { + *(.rela.plt) + PROVIDE_HIDDEN (__rela_iplt_start = .); + *(.rela.iplt) + PROVIDE_HIDDEN (__rela_iplt_end = .); + } + .init : + { + KEEP (*(SORT_NONE(.init))) + } =0x1f2003d5 + .plt : { *(.plt) *(.iplt) } + .text : + { + *(.text.unlikely .text.*_unlikely .text.unlikely.*) + *(.text.exit .text.exit.*) + *(.text.startup .text.startup.*) + *(.text.hot .text.hot.*) + *(SORT(.text.sorted.*)) + *(.text .stub .text.* .gnu.linkonce.t.*) + /* .gnu.warning sections are handled specially by elf.em. */ + *(.gnu.warning) + } =0x1f2003d5 + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } =0x1f2003d5 + PROVIDE (__etext = .); + PROVIDE (_etext = .); + PROVIDE (etext = .); + .rodata : { *(.rodata .rodata.* .gnu.linkonce.r.*) } + .rodata1 : { *(.rodata1) } + .eh_frame_hdr : { *(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*) } + .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gcc_except_table : ONLY_IF_RO { *(.gcc_except_table .gcc_except_table.*) } + .gnu_extab : ONLY_IF_RO { *(.gnu_extab*) } + /* These sections are generated by the Sun/Oracle C++ compiler. */ + .exception_ranges : ONLY_IF_RO { *(.exception_ranges*) } + /* Adjust the address for the data segment. We want to adjust up to + the same address within the page on the next page up. */ + . = ALIGN(CONSTANT (MAXPAGESIZE)) + (. & (CONSTANT (MAXPAGESIZE) - 1)); + /* Exception handling */ + .eh_frame : ONLY_IF_RW { KEEP (*(.eh_frame)) *(.eh_frame.*) } + .gnu_extab : ONLY_IF_RW { *(.gnu_extab) } + .gcc_except_table : ONLY_IF_RW { *(.gcc_except_table .gcc_except_table.*) } + .exception_ranges : ONLY_IF_RW { *(.exception_ranges*) } + /* Thread Local Storage sections */ + .tdata : + { + PROVIDE_HIDDEN (__tdata_start = .); + *(.tdata .tdata.* .gnu.linkonce.td.*) + } + .tbss : { *(.tbss .tbss.* .gnu.linkonce.tb.*) *(.tcommon) } + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } + .jcr : { KEEP (*(.jcr)) } + .data.rel.ro : { *(.data.rel.ro.local* .gnu.linkonce.d.rel.ro.local.*) *(.data.rel.ro .data.rel.ro.* .gnu.linkonce.d.rel.ro.*) } + .dynamic : { *(.dynamic) } + .got : { *(.got) *(.igot) } + .got.plt : { *(.got.plt) *(.igot.plt) } + .data : + { + __data_start = .; + *(.data .data.* .gnu.linkonce.d.*) + SORT(CONSTRUCTORS) + } + .data1 : { *(.data1) } + _edata = .; PROVIDE (edata = .); + . = .; + __bss_start = .; + __bss_start__ = .; + .bss : + { + *(.dynbss) + *(.bss .bss.* .gnu.linkonce.b.*) + *(COMMON) + /* Align here to ensure that the .bss section occupies space up to + _end. Align after .bss to ensure correct alignment even if the + .bss section disappears because there are no input sections. + FIXME: Why do we need it? When there is no .bss section, we do not + pad the .data section. */ + . = ALIGN(. != 0 ? 64 / 8 : 1); + } + _bss_end__ = .; __bss_end__ = .; + . = ALIGN(64 / 8); + . = SEGMENT_START("ldata-segment", .); + . = ALIGN(64 / 8); + __end__ = .; + _end = .; PROVIDE (end = .); + .stack 0x80000 : + { + _stack = .; + *(.stack) + } + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + .gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) } + /* DWARF debug sections. + Symbols in the DWARF debugging sections are relative to the beginning + of the section so we begin them at 0. */ + /* DWARF 1. */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions. */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2. */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2. */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions. */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } + /* DWARF 3. */ + .debug_pubtypes 0 : { *(.debug_pubtypes) } + .debug_ranges 0 : { *(.debug_ranges) } + /* DWARF 5. */ + .debug_addr 0 : { *(.debug_addr) } + .debug_line_str 0 : { *(.debug_line_str) } + .debug_loclists 0 : { *(.debug_loclists) } + .debug_macro 0 : { *(.debug_macro) } + .debug_names 0 : { *(.debug_names) } + .debug_rnglists 0 : { *(.debug_rnglists) } + .debug_str_offsets 0 : { *(.debug_str_offsets) } + .debug_sup 0 : { *(.debug_sup) } + .ARM.attributes 0 : { KEEP (*(.ARM.attributes)) KEEP (*(.gnu.attributes)) } + .note.gnu.arm.ident 0 : { KEEP (*(.note.gnu.arm.ident)) } + /DISCARD/ : { *(.note.GNU-stack) *(.gnu_debuglink) *(.gnu.lto_*) } +} \ No newline at end of file diff --git a/mkrtos_user/server/init/link.lds b/mkrtos_user/server/init/armv7_8m/link.lds similarity index 100% rename from mkrtos_user/server/init/link.lds rename to mkrtos_user/server/init/armv7_8m/link.lds diff --git a/mkrtos_user/server/init/src/main.c b/mkrtos_user/server/init/src/main.c index ea90b6f63..cd357dd0d 100644 --- a/mkrtos_user/server/init/src/main.c +++ b/mkrtos_user/server/init/src/main.c @@ -62,6 +62,7 @@ int main(int argc, char *args[]) uenv_t *env; ulog_write_str(LOG_PROT, "init..\n"); + u_env_default_init(); env = u_get_global_env(); rpc_meta_init(THREAD_MAIN, &env->ns_hd); namespace_init(env->ns_hd); diff --git a/mkrtos_user/server/init/src/namespace.c b/mkrtos_user/server/init/src/namespace.c index 26e79400d..c8750c8d6 100644 --- a/mkrtos_user/server/init/src/namespace.c +++ b/mkrtos_user/server/init/src/namespace.c @@ -418,7 +418,7 @@ void fs_svr_close(int fd) int fs_svr_unlink(char *path) { ns_node_t *node; - int ret_inx; + size_t ret_inx; node = node_lookup(&ns.root_node, path, &ret_inx); if (!node) diff --git a/setting.cmake b/setting.cmake index 1f4870b3e..2b622d82d 100755 --- a/setting.cmake +++ b/setting.cmake @@ -1,5 +1,5 @@ set(CMAKE_TOOLCHAIN_PATH $ENV{TOOLCHAIN} CACHE STRING " " FORCE) -set(CROSS_COMPILE ${CMAKE_TOOLCHAIN_PATH}$ENV{CROSS_COMPILER} CACHE PATH "" FORCE) +set(CROSS_COMPILE ${CMAKE_TOOLCHAIN_PATH}$ENV{CROSS_COMPILE_NAME} CACHE PATH "" FORCE) set(GCC_LIB_PATH $ENV{TOOLCHAIN_LIB}) set(CMAKE_INSTALL_PATH "${CMAKE_BINARY_DIR}deploy" CACHE PATH "" FORCE) @@ -19,6 +19,7 @@ set(CMAKE_AR "${CROSS_COMPILE}ar" CACHE PATH "" FORCE) set(CMAKE_SIZE "${CROSS_COMPILE}size" CACHE PATH "" FORCE) set(PROJECT_BINARY_DIR ${CMAKE_SOURCE_DIR}/build) +# set(CMAKE_INCLUDE_CURRENT_DIR ON) set(BOARD $ENV{BOARD}) include(mkrtos_cmake/top.cmake) set(ARCH ${CONFIG_ARCH} CACHE STRING "" FORCE) @@ -34,6 +35,7 @@ if (${CONFIG_ARCH} STREQUAL "cortex-m3" OR include(armv7_8.cmake) elseif(${CONFIG_ARCH} STREQUAL "aarch64" ) include(aarch64.cmake) + link_directories(${CMAKE_SOURCE_DIR}/build/libc/output/lib) endif()