能够启动到init
This commit is contained in:
32
.vscode/settings.json
vendored
32
.vscode/settings.json
vendored
@@ -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,
|
||||
|
||||
4
Kconfig
4
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 "./"
|
||||
|
||||
@@ -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)
|
||||
@@ -3,17 +3,12 @@
|
||||
#include <elf_loader.h>
|
||||
#include <uart.h>
|
||||
#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)
|
||||
|
||||
28
mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds
Executable file → Normal file
28
mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds
Executable file → Normal file
@@ -1,56 +1,29 @@
|
||||
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 = .;
|
||||
@@ -60,7 +33,6 @@ SECTIONS
|
||||
}
|
||||
bss_end = .;
|
||||
_ebss = .;
|
||||
|
||||
. = ALIGN(0x8);
|
||||
.cpio : {
|
||||
cpio_start = .;
|
||||
|
||||
70
mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds.S
Executable file
70
mkrtos_bootstrap/bsp/AARCH64_QEMU/link.lds.S
Executable file
@@ -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 = .;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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 ")
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
#include "types.h"
|
||||
#include <thread_arch.h>
|
||||
#include <aarch64_ptregs.h>
|
||||
|
||||
#include <asm/mm.h>
|
||||
#include <early_boot.h>
|
||||
#define ARCH_WORD_SIZE 64
|
||||
#define LOG_INTR_NO 37 // USART1_IRQn
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
12
mkrtos_knl/arch/aarch64/esr.h
Normal file
12
mkrtos_knl/arch/aarch64/esr.h
Normal file
@@ -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)
|
||||
|
||||
@@ -3,11 +3,11 @@ ENTRY(_start);
|
||||
SECTIONS
|
||||
{
|
||||
/*
|
||||
* 设置mkrtos的加载入口地址为0x80000
|
||||
*
|
||||
*
|
||||
* 这里“.”表示location counter,当前位置
|
||||
*/
|
||||
. = 0x40000000+0x1000;
|
||||
. = CONFIG_KNL_DATA_ADDR+0x1000;
|
||||
kernel_start = .;
|
||||
/*
|
||||
* 这里是第一个段text.boot,起始地址就是0x80000
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#include <types.h>
|
||||
#include <task.h>
|
||||
#include <thread.h>
|
||||
#include <esr.h>
|
||||
#include <syscall.h>
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#pragma once
|
||||
|
||||
#include <types.h>
|
||||
int elf_load(umword_t elf_data);
|
||||
#include <task.h>
|
||||
int elf_load(task_t *task, umword_t elf_data, size_t size, addr_t *entry_addr);
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
#include "mm_page.h"
|
||||
#include <mm_page.h>
|
||||
#include <assert.h>
|
||||
#include <util.h>
|
||||
#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
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include "ram_limit.h"
|
||||
|
||||
#include <util.h>
|
||||
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 <buddy.h>
|
||||
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 <slab.h>
|
||||
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
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
#include "assert.h"
|
||||
#include "types.h"
|
||||
#include "mm_wrap.h"
|
||||
|
||||
#include <arch.h>
|
||||
// #define CONFIG_OBJ_MAP_TAB_SIZE 4
|
||||
// #define CONFIG_OBJ_MAP_ENTRY_SIZE 8
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -1,11 +1,9 @@
|
||||
#pragma once
|
||||
|
||||
#include "types.h"
|
||||
#include <arch.h>
|
||||
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
3
mkrtos_knl/inc/test/buddy_slab_test.h
Normal file
3
mkrtos_knl/inc/test/buddy_slab_test.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
void buddy_slab_init(void);
|
||||
4
mkrtos_knl/inc/test/knl_test.h
Normal file
4
mkrtos_knl/inc/test/knl_test.h
Normal file
@@ -0,0 +1,4 @@
|
||||
#pragma once
|
||||
|
||||
|
||||
void knl_test(void);
|
||||
3
mkrtos_knl/inc/test/kthread_test.h
Normal file
3
mkrtos_knl/inc/test/kthread_test.h
Normal file
@@ -0,0 +1,3 @@
|
||||
#pragma once
|
||||
|
||||
void kthread_test_init(void);
|
||||
@@ -1,5 +1,7 @@
|
||||
|
||||
#include <types.h>
|
||||
#include <thread.h>
|
||||
#include <task.h>
|
||||
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 <string.h>
|
||||
#include <printk.h>
|
||||
#include <buddy.h>
|
||||
#include <arch.h>
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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对象的初始化函数
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 <slab.h>
|
||||
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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -81,3 +81,57 @@ 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);
|
||||
}
|
||||
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
|
||||
#include <buddy.h>
|
||||
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 <slab.h>
|
||||
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
|
||||
@@ -12,6 +12,9 @@
|
||||
#include "types.h"
|
||||
#include "mm_wrap.h"
|
||||
#include "string.h"
|
||||
#if IS_ENABLED(CONFIG_BUDDY_SLAB)
|
||||
#include <buddy.h>
|
||||
#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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
#else
|
||||
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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
|
||||
19
mkrtos_knl/test/CMakeLists.txt
Executable file
19
mkrtos_knl/test/CMakeLists.txt
Executable file
@@ -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
|
||||
)
|
||||
17
mkrtos_knl/test/buddy_slab_test.c
Normal file
17
mkrtos_knl/test/buddy_slab_test.c
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
#include <buddy.h>
|
||||
#include <slab.h>
|
||||
#include <arch.h>
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
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
|
||||
}
|
||||
12
mkrtos_knl/test/knl_test.c
Normal file
12
mkrtos_knl/test/knl_test.c
Normal file
@@ -0,0 +1,12 @@
|
||||
|
||||
#include <task.h>
|
||||
#include <thread.h>
|
||||
#include <factory.h>
|
||||
#include <thread_task_arch.h>
|
||||
#include <kthread_test.h>
|
||||
#include <buddy_slab_test.h>
|
||||
void knl_test(void)
|
||||
{
|
||||
kthread_test_init();
|
||||
buddy_slab_init();
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <thread.h>
|
||||
#include <factory.h>
|
||||
#include <thread_task_arch.h>
|
||||
|
||||
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();
|
||||
@@ -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 .
|
||||
|
||||
@@ -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 .
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
Submodule mkrtos_user/lib/cutest deleted from a0d4c6215a
@@ -1,12 +1,16 @@
|
||||
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}
|
||||
)
|
||||
set_target_properties(libc_be PROPERTIES LINK_FLAGS ${CORTEX_M_LINK_FLAGS})
|
||||
|
||||
if (${ARCH_NAME} STREQUAL "armv7_8m")
|
||||
target_include_directories(
|
||||
libc_be
|
||||
PUBLIC
|
||||
@@ -16,13 +20,6 @@ target_include_directories(
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/libc_backend/inc
|
||||
${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/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(
|
||||
libc_be
|
||||
@@ -31,8 +28,24 @@ target_link_libraries(
|
||||
sys
|
||||
sys_svr
|
||||
)
|
||||
set_target_properties(libc_be PROPERTIES LINK_FLAGS "-pie ")
|
||||
|
||||
add_dependencies(libc_be sys)
|
||||
|
||||
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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
42
mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c
Normal file
42
mkrtos_user/lib/libc_backend/src/aarch64/syscall_backend.c
Normal file
@@ -0,0 +1,42 @@
|
||||
#include "syscall_backend.h"
|
||||
#include "misc_backend.h"
|
||||
#include <errno.h>
|
||||
#include <syscall.h>
|
||||
|
||||
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;
|
||||
}
|
||||
@@ -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;
|
||||
@@ -11,7 +11,6 @@
|
||||
#include "u_ipc.h"
|
||||
#include "u_sys.h"
|
||||
#include "u_futex.h"
|
||||
#include <futex.h>
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
#include <pthread.h>
|
||||
@@ -19,13 +18,19 @@
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <syscall_backend.h>
|
||||
#undef hidden
|
||||
#undef weak
|
||||
#define hidden
|
||||
#include <features.h>
|
||||
#include <futex.h>
|
||||
#include <pthread_impl.h>
|
||||
#include <atomic.h>
|
||||
#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);
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@
|
||||
#include <futex.h>
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
#include <syscall_backend.h>
|
||||
#include <features.h>
|
||||
#undef hidden
|
||||
#undef weak
|
||||
#define hidden
|
||||
#include <pthread_impl.h>
|
||||
#include <time.h>
|
||||
#include <errno.h>
|
||||
|
||||
@@ -7,9 +7,13 @@
|
||||
#include "u_log.h"
|
||||
#include "u_thread.h"
|
||||
#include "u_sys.h"
|
||||
#include <pthread_impl.h>
|
||||
#include <errno.h>
|
||||
#include <u_sleep.h>
|
||||
#undef hidden
|
||||
#undef weak
|
||||
#define hidden
|
||||
#include <features.h>
|
||||
#include <pthread_impl.h>
|
||||
long be_set_tid_address(int *val)
|
||||
{
|
||||
struct pthread *pt = pthread_self();
|
||||
|
||||
@@ -30,9 +30,14 @@
|
||||
#include <unistd.h>
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#undef hidden
|
||||
#undef weak
|
||||
#define hidden
|
||||
#include <features.h>
|
||||
#include <pthread_impl.h>
|
||||
#include <atomic.h>
|
||||
static int pthread_cnt = 1;
|
||||
#define PTHREAD_DONT_RUN 0x1
|
||||
|
||||
void pthread_cnt_inc(void)
|
||||
{
|
||||
|
||||
Submodule mkrtos_user/lib/mkrtos-musl updated: 7ada6dde6f...1fb9f84033
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
deps_archdeps_archdeps_archdeps_arch
|
||||
16
mkrtos_user/lib/sys/inc/aarch64/u_arch_hard.h
Normal file
16
mkrtos_user/lib/sys/inc/aarch64/u_arch_hard.h
Normal file
@@ -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"
|
||||
21
mkrtos_user/lib/sys/inc/armv7_8m/u_arch_hard.h
Normal file
21
mkrtos_user/lib/sys/inc/armv7_8m/u_arch_hard.h
Normal file
@@ -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"
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -14,12 +14,12 @@ 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,
|
||||
@@ -30,7 +30,7 @@ static msg_tag_t ulog_read_bytes_raw(obj_handler_t obj_inx, umword_t data[5], in
|
||||
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;
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
|
||||
@@ -1,19 +1,10 @@
|
||||
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)
|
||||
@@ -26,5 +17,21 @@ add_subdirectory(test)
|
||||
# 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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
add_dependencies(init.elf libc_be util)
|
||||
|
||||
229
mkrtos_user/server/init/aarch64/link.lds
Normal file
229
mkrtos_user/server/init/aarch64/link.lds
Normal file
@@ -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_*) }
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user