能够启动到init

This commit is contained in:
zhangzheng
2024-04-04 16:51:29 +00:00
parent 436c88f8ca
commit 8a6213adf4
99 changed files with 1211 additions and 632 deletions

32
.vscode/settings.json vendored
View File

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

View File

@@ -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 "./"

View File

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

View File

@@ -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
View 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 = .;

View 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_begin8
*/
. = ALIGN(0x8);
_bss = .;
bss_begin = .;
.bss :
{
*(.bss*)
}
bss_end = .;
_ebss = .;
. = ALIGN(0x8);
.cpio : {
cpio_start = .;
*(.cpio*)
cpio_end = .;
}
}

View File

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

View File

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

View File

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

View File

@@ -119,10 +119,10 @@ vectors:
EL1使EL0SP
*/
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使EL1SP
@@ -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

View File

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

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

View File

@@ -3,11 +3,11 @@ ENTRY(_start);
SECTIONS
{
/*
* mkrtos0x80000
*
*
* .location counter
*/
. = 0x40000000+0x1000;
. = CONFIG_KNL_DATA_ADDR+0x1000;
kernel_start = .;
/*
* text.boot0x80000

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -0,0 +1,3 @@
#pragma once
void buddy_slab_init(void);

View File

@@ -0,0 +1,4 @@
#pragma once
void knl_test(void);

View File

@@ -0,0 +1,3 @@
#pragma once
void kthread_test_init(void);

View File

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

View File

@@ -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对象的初始化函数

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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
}

View 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();
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1 +0,0 @@
deps_archdeps_archdeps_archdeps_arch

View 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"

View 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"

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View 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_*) }
}

View File

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

View File

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

View File

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