From 6f84378c8dc05ad5d716bae5deb8b049868163b5 Mon Sep 17 00:00:00 2001 From: zhangzheng <1358745329@qq.com> Date: Sat, 8 Jun 2024 02:53:33 +0000 Subject: [PATCH] try boot a guest os. --- .vscode/settings.json | 4 +- mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h | 2 + mkrtos_knl/arch/aarch64/sche_arch.c | 2 + mkrtos_knl/arch/aarch64/thread_aarch64.c | 1 + mkrtos_knl/arch/aarch64/thread_armv8.c | 60 +++++++++++-- mkrtos_knl/inc/knl/task.h | 1 + mkrtos_knl/knl/thread.c | 19 ++++- mkrtos_user/lib/mkrtos-musl | 2 +- mkrtos_user/lib/sys/inc/u_thread.h | 9 +- mkrtos_user/lib/sys/src/u_thread.c | 21 ++++- mkrtos_user/server/hello/CMakeLists.txt | 8 +- mkrtos_user/server/hello/src/benos.bin | Bin 0 -> 25816 bytes mkrtos_user/server/hello/src/guest_os.c | 80 ++++++++++++++++++ mkrtos_user/server/hello/src/guest_os.h | 16 ++++ mkrtos_user/server/hello/src/heap_stack.c | 3 + mkrtos_user/server/hello/src/ipa_exeception.c | 75 ++++++++++++++++ mkrtos_user/server/hello/src/ipa_exeception.h | 3 + mkrtos_user/server/hello/src/main.c | 11 +++ mkrtos_user/server/hello/src/os_test.S | 4 + mkrtos_user/server/init/src/cons.c | 2 +- mkrtos_user/server/init/src/init.cfg | 4 +- mkrtos_user/server/init/src/main.c | 2 +- mkrtos_user/server/net/CMakeLists.txt | 2 +- 23 files changed, 306 insertions(+), 25 deletions(-) create mode 100755 mkrtos_user/server/hello/src/benos.bin create mode 100644 mkrtos_user/server/hello/src/guest_os.c create mode 100644 mkrtos_user/server/hello/src/guest_os.h create mode 100644 mkrtos_user/server/hello/src/ipa_exeception.c create mode 100644 mkrtos_user/server/hello/src/ipa_exeception.h create mode 100644 mkrtos_user/server/hello/src/os_test.S diff --git a/.vscode/settings.json b/.vscode/settings.json index 601526008..f4fdab80e 100755 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -83,7 +83,9 @@ "spinlock.h": "c", "stdlib.h": "c", "cpulock.h": "c", - "u_task.h": "c" + "u_task.h": "c", + "ipa_exeception.h": "c", + "guest_os.h": "c" }, "cortex-debug.showRTOS": false, "cortex-debug.variableUseNaturalFormat": false, diff --git a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h index d6c41c069..574786f3f 100755 --- a/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h +++ b/mkrtos_knl/arch/aarch64/aarch64_qemu/arch.h @@ -70,6 +70,8 @@ typedef struct sysregs umword_t contextidr_el1; umword_t tpidrro_el0; + umword_t vmpidr_el2; + // 32bits sysregs. umword_t spsr_abt; umword_t spsr_und; diff --git a/mkrtos_knl/arch/aarch64/sche_arch.c b/mkrtos_knl/arch/aarch64/sche_arch.c index 9e83b9bcb..e4f0ecef3 100644 --- a/mkrtos_knl/arch/aarch64/sche_arch.c +++ b/mkrtos_knl/arch/aarch64/sche_arch.c @@ -95,6 +95,7 @@ static void hype_sche_arch_sw_sysregs(thread_t *cur_th, thread_t *next_th) if (cur_th->is_vcpu) { cur_th->sp.sysregs.hstr_el2 = read_sysreg(hstr_el2); + cur_th->sp.sysregs.vmpidr_el2 = read_sysreg(vmpidr_el2); cur_th->sp.sysregs.sp_el0 = read_sysreg(sp_el0); cur_th->sp.sysregs.sctlr_el1 = read_sysreg(sctlr_el1); cur_th->sp.sysregs.ttbr0_el1 = read_sysreg(ttbr0_el1); @@ -121,6 +122,7 @@ static void hype_sche_arch_sw_sysregs(thread_t *cur_th, thread_t *next_th) if (next_th->is_vcpu) { write_sysreg(next_th->sp.sysregs.hstr_el2, hstr_el2); + write_sysreg(next_th->sp.sysregs.vmpidr_el2, vmpidr_el2); write_sysreg(next_th->sp.sysregs.sp_el0, sp_el0); write_sysreg(next_th->sp.sysregs.sctlr_el1, sctlr_el1); write_sysreg(next_th->sp.sysregs.ttbr0_el1, ttbr0_el1); diff --git a/mkrtos_knl/arch/aarch64/thread_aarch64.c b/mkrtos_knl/arch/aarch64/thread_aarch64.c index 5c5808a27..f60b4a2c1 100644 --- a/mkrtos_knl/arch/aarch64/thread_aarch64.c +++ b/mkrtos_knl/arch/aarch64/thread_aarch64.c @@ -50,6 +50,7 @@ void thread_arch_init(thread_t *th, umword_t flags) // asm volatile("msr HSTR_EL2, %x0" : : "r"(Hstr_vm)); th->sp.hyp.hcr_el2 = 0x30023f | (1UL << 10) | (3UL << 13) | (1UL << 31); // read_sysreg(hcr_el2);0x30023f|(1UL<<10) |(3UL<<13) th->sp.sysregs.hstr_el2 = Hstr_vm; // read_sysreg(hstr_el2); + th->sp.sysregs.vmpidr_el2 = 0; // TODO:虚拟mpidr_el1寄存器 th->sp.sysregs.sp_el0 = read_sysreg(sp_el0); th->sp.sysregs.sctlr_el1 = read_sysreg(sctlr_el1); th->sp.sysregs.ttbr0_el1 = read_sysreg(ttbr0_el1); diff --git a/mkrtos_knl/arch/aarch64/thread_armv8.c b/mkrtos_knl/arch/aarch64/thread_armv8.c index 86a5eb311..8e15df8af 100644 --- a/mkrtos_knl/arch/aarch64/thread_armv8.c +++ b/mkrtos_knl/arch/aarch64/thread_armv8.c @@ -9,9 +9,23 @@ #include umword_t thread_get_pfa(void) { + thread_t *th = thread_get_current(); umword_t a; + umword_t far_el2; + asm volatile("mrs %0, far_el2" : "=r"(far_el2)); - asm volatile("mrs %0, far_el2" : "=r"(a)); + if (th->is_vcpu) + { + asm volatile("mrs %0, hpfar_el2" : "=r"(a)); + a >>= 4; + a <<= CONFIG_PAGE_SHIFT; + + a |= far_el2 & ((1 << CONFIG_PAGE_SHIFT) - 1); + } + else + { + a = far_el2; + } return a; } static void dump_stack(umword_t pc, umword_t x29) @@ -30,11 +44,12 @@ static void dump_stack(umword_t pc, umword_t x29) x29 = *(umword_t *)(knl_addr); } } - printk("knl pf stack: 0x%x,0x%x,0x%x,0x%x,0x%x\n", result[0], result[1], result[2], result[3], result[4]); + printk("knl pf stack: 0x%lx,0x%lx,0x%lx,0x%lx,0x%lx\n", result[0], result[1], result[2], result[3], result[4]); } void thread_sync_entry(entry_frame_t *regs) { - umword_t ec = arm_esr_ec(esr_get()); + umword_t esr = esr_get(); + umword_t ec = arm_esr_ec(esr); thread_t *th = thread_get_current(); task_t *tk = thread_get_bind_task(th); // printk("user:0x%x ec:0x%x\n", !ec, ec); @@ -47,9 +62,24 @@ void thread_sync_entry(entry_frame_t *regs) if (task_vma_page_fault(&tk->mm_space.mem_vma, ALIGN_DOWN(addr, PAGE_SIZE)) < 0) { - printk("[knl]0x20 pfa:0x%x\n", addr); + printk("[knl]0x20 pfa:0x%lx\n", addr); dump_stack(regs->pc, regs->regs[29]); - task_knl_kill(th, FALSE); + ipc_msg_t *msg; + msg_tag_t ret_tag; + umword_t user_id; + + msg = thread_get_kmsg_buf((thread_t *)(th)); + msg->msg_buf[0] = esr; + msg->msg_buf[1] = addr; + int ret = thread_ipc_call((thread_t *)(tk->exec_th), msg_tag_init4(0, 2, 0, 0), + &ret_tag, ipc_timeout_create2(0, 0), + &user_id, TRUE); + + if (ret < 0) + { + task_knl_kill(th, FALSE); + } + printk("%s:%d ret:%d\n", __func__, __LINE__, ret); } } return; @@ -59,9 +89,25 @@ void thread_sync_entry(entry_frame_t *regs) if (task_vma_page_fault(&tk->mm_space.mem_vma, ALIGN_DOWN(addr, PAGE_SIZE)) < 0) { - printk("[knl]0x24 pfa:0x%x\n", addr); + printk("[knl]0x24 esr:0x%lx pfa:0x%lx\n", esr, addr); dump_stack(regs->pc, regs->regs[29]); - task_knl_kill(th, FALSE); + msg_tag_t ret_tag; + umword_t user_id; + ipc_msg_t *msg; + + msg = thread_get_kmsg_buf((thread_t *)(th)); + msg->msg_buf[0] = esr; + msg->msg_buf[1] = addr; + int ret = thread_ipc_call((thread_t *)(tk->exec_th), msg_tag_init4(0, 2, 0, 0), + &ret_tag, ipc_timeout_create2(0, 0), + &user_id, TRUE); + + if (ret < 0) + { + task_knl_kill(th, FALSE); + } + printk("%s:%d pc:0x%lx ret:%d\n", __func__, __LINE__, regs->pc, ret); + regs->pc += 4; } } return; diff --git a/mkrtos_knl/inc/knl/task.h b/mkrtos_knl/inc/knl/task.h index f09504673..4e4250b7d 100755 --- a/mkrtos_knl/inc/knl/task.h +++ b/mkrtos_knl/inc/knl/task.h @@ -15,6 +15,7 @@ typedef struct task obj_space_t obj_space; mm_space_t mm_space; ram_limit_t *lim; + kobject_t *exec_th; ref_counter_t ref_cn; slist_head_t del_node; pid_t pid; diff --git a/mkrtos_knl/knl/thread.c b/mkrtos_knl/knl/thread.c index ce21b12ef..312dee1cb 100755 --- a/mkrtos_knl/knl/thread.c +++ b/mkrtos_knl/knl/thread.c @@ -42,6 +42,7 @@ enum thread_op MSG_BUG_SET, YIELD, DO_IPC = 6, //!< 与ipc对象中的额IPC_DO一致 + SET_EXEC, //!< 设置异常处理 }; enum IPC_TYPE { @@ -114,7 +115,7 @@ void thread_init(thread_t *th, ram_limit_t *lim, umword_t flags) ref_counter_init(&th->ref); ref_counter_inc(&th->ref); thread_arch_init(th, flags); - th->cpu = 0; + th->cpu = arch_get_current_cpu_id(); th->lim = lim; th->kobj.invoke_func = thread_syscall; th->kobj.put_func = thread_put; @@ -976,6 +977,7 @@ __attribute__((optimize(0))) int thread_ipc_call(thread_t *to_th, msg_tag_t in_t ret = 0; end: spinlock_set(&to_th->kobj.lock, lock_stats); + return ret; } /** @@ -1251,6 +1253,19 @@ static void thread_syscall(kobject_t *kobj, syscall_prot_t sys_p, msg_tag_t in_t tag = thread_do_ipc(kobj, f, 0); } break; + case SET_EXEC: + { + kobject_t *th_kobj = obj_space_lookup_kobj_cmp_type(&task->obj_space, f->regs[0], THREAD_TYPE); + if (th_kobj == NULL) + { + f->regs[0] = msg_tag_init4(0, 0, 0, -EINVAL).raw; + return; + } + ref_counter_inc(&((thread_t *)th_kobj)->ref); + task->exec_th = th_kobj; + tag = msg_tag_init4(0, 0, 0, 0); + } + break; } f->regs[0] = tag.raw; } @@ -1269,7 +1284,7 @@ static kobject_t *thread_create_func(ram_limit_t *lim, umword_t arg0, umword_t a umword_t arg2, umword_t arg3) { kobject_t *kobj; - + kobj = (kobject_t *)thread_create(lim, arg0); if (!kobj) { diff --git a/mkrtos_user/lib/mkrtos-musl b/mkrtos_user/lib/mkrtos-musl index 4b102a28a..763f333ed 160000 --- a/mkrtos_user/lib/mkrtos-musl +++ b/mkrtos_user/lib/mkrtos-musl @@ -1 +1 @@ -Subproject commit 4b102a28ae3228464f70527ea091ad759a8a8e5b +Subproject commit 763f333ed7c6b7920b457bc00577cc327820ab68 diff --git a/mkrtos_user/lib/sys/inc/u_thread.h b/mkrtos_user/lib/sys/inc/u_thread.h index 8ae794307..1c7595a53 100644 --- a/mkrtos_user/lib/sys/inc/u_thread.h +++ b/mkrtos_user/lib/sys/inc/u_thread.h @@ -7,9 +7,9 @@ #define MSG_BUF_RECV_R_FLAGS 0x02U //!< 接收上次发送数据的接收者 #define MSG_BUF_REPLY_FLAGS 0x04U //!< -#define IPC_MSG_SIZE CONFIG_THREAD_IPC_MSG_LEN //!< IPC消息大小 -#define MAP_BUF_SIZE CONFIG_THREAD_MAP_BUF_LEN //!< 映射消息大小 -#define IPC_USER_SIZE 12 //!< 用户态消息大小 +#define IPC_MSG_SIZE CONFIG_THREAD_IPC_MSG_LEN //!< IPC消息大小 +#define MAP_BUF_SIZE CONFIG_THREAD_MAP_BUF_LEN //!< 映射消息大小 +#define IPC_USER_SIZE 12 //!< 用户态消息大小 typedef struct ipc_msg { @@ -61,11 +61,12 @@ static inline msg_tag_t thread_run(obj_handler_t obj, uint8_t prio) return thread_run_cpu(obj, prio, -1); } msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj); +msg_tag_t thread_set_exec(obj_handler_t obj, obj_handler_t exec_th); msg_tag_t thread_ipc_wait(ipc_timeout_t timeout, umword_t *obj, obj_handler_t ipc_obj); msg_tag_t thread_ipc_reply(msg_tag_t in_tag, ipc_timeout_t timeout); msg_tag_t thread_ipc_send(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout); - __attribute__((optimize(0))) msg_tag_t thread_ipc_call(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout); +__attribute__((optimize(0))) msg_tag_t thread_ipc_call(msg_tag_t in_tag, obj_handler_t target_th_obj, ipc_timeout_t timeout); static inline ipc_msg_t *thread_get_cur_ipc_msg(void) { diff --git a/mkrtos_user/lib/sys/src/u_thread.c b/mkrtos_user/lib/sys/src/u_thread.c index afc78c4e1..204973ab7 100644 --- a/mkrtos_user/lib/sys/src/u_thread.c +++ b/mkrtos_user/lib/sys/src/u_thread.c @@ -11,6 +11,7 @@ enum thread_op MSG_BUG_SET, YIELD, DO_IPC, + SET_EXEC, }; enum IPC_TYPE { @@ -208,4 +209,22 @@ msg_tag_t thread_bind_task(obj_handler_t obj, obj_handler_t tk_obj) msg_tag_t tag = msg_tag_init(r0); return tag; -} \ No newline at end of file +} +msg_tag_t thread_set_exec(obj_handler_t obj, obj_handler_t exec_th) +{ + register volatile umword_t r0 asm(ARCH_REG_0); + + mk_syscall(syscall_prot_create(SET_EXEC, THREAD_PROT, obj).raw, + exec_th, + 0, + 0, + 0, + 0, 0); + asm __volatile__("" + : + : + : ARCH_REG_0); + msg_tag_t tag = msg_tag_init(r0); + + return tag; +} diff --git a/mkrtos_user/server/hello/CMakeLists.txt b/mkrtos_user/server/hello/CMakeLists.txt index 161778b85..bd1dbbc76 100644 --- a/mkrtos_user/server/hello/CMakeLists.txt +++ b/mkrtos_user/server/hello/CMakeLists.txt @@ -10,7 +10,10 @@ target_link_libraries(hello.elf PUBLIC -Bstatic ${LIBC_NAME} + --whole-archive ${START_LIB} + libc_be + --no-whole-archive printf sys sys_util @@ -23,10 +26,7 @@ target_include_directories( ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_util/inc ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/sys_svr/inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/hello/src/test - - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/hello/bsp/core_inc - ${CMAKE_SOURCE_DIR}/mkrtos_user/server/hello/bsp/inc + ${CMAKE_SOURCE_DIR}/mkrtos_user/server/hello/src ${CMAKE_SOURCE_DIR}/mkrtos_user/lib/printf/src/printf ) diff --git a/mkrtos_user/server/hello/src/benos.bin b/mkrtos_user/server/hello/src/benos.bin new file mode 100755 index 0000000000000000000000000000000000000000..74619422b4c31bf9b41cb4b34cd8e178616aebe4 GIT binary patch literal 25816 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 +#include +#include +#include +#include +#include +#include +#include +#include "guest_os.h" +#include "ipa_exeception.h" +// #define STACK_SIZE 4096 +// static __attribute__((aligned(8))) uint8_t stack0[STACK_SIZE]; +#define VCPU_DEFAULT_PRIO 2 + +int guest_os_create(guest_os_t *gos, void *entry) +{ + msg_tag_t tag; + + obj_handler_t th1_hd; + umword_t msg_buf_addr; + int ret; + + th1_hd = handler_alloc(); + if (th1_hd == HANDLER_INVALID) + { + return -ENOENT; + } + tag = factory_create_thread_vcpu(FACTORY_PROT, vpage_create_raw3(KOBJ_ALL_RIGHTS, 0, th1_hd)); + if (msg_tag_get_prot(tag) < 0) + { + handler_free(th1_hd); + return msg_tag_get_prot(tag); + } + tag = u_vmam_alloc(VMA_PROT, vma_addr_create(VPAGE_PROT_RW, 0, 0), + PAGE_SIZE, 0, (addr_t *)(&msg_buf_addr)); + if (msg_tag_get_val(tag) < 0) + { + ret = msg_tag_get_val(tag); + goto end; + } + memset((void *)msg_buf_addr, 0, PAGE_SIZE); + + tag = thread_exec_regs(th1_hd, (umword_t)entry, + 0, TASK_RAM_BASE(), 0); + if (msg_tag_get_prot(tag) < 0) + { + ret = msg_tag_get_prot(tag); + goto end_free_mm; + } + tag = thread_bind_task(th1_hd, TASK_THIS); + if (msg_tag_get_prot(tag) < 0) + { + goto end_free_mm; + } + tag = thread_msg_buf_set(th1_hd, (void *)msg_buf_addr); + if (msg_tag_get_prot(tag) < 0) + { + goto end_free_mm; + } + ret = ipc_execetion_create(gos); + if (ret < 0) + { + goto end_free_mm; + } + thread_set_exec(th1_hd, gos->ipa_execption_ipc); + gos->msg_buf = (void *)msg_buf_addr; + gos->prio = VCPU_DEFAULT_PRIO; + gos->vcpu_id = 0; // TODO:需要设置内核的寄存器 + gos->vcpu_th = th1_hd; + thread_run(th1_hd, VCPU_DEFAULT_PRIO); // 优先级默认为2 + ret = 0; + goto end_ok; +end_free_mm: + u_vmam_free(VMA_PROT, msg_buf_addr, PAGE_SIZE); +end: + handler_free_umap(th1_hd); +end_ok: + return ret; +} diff --git a/mkrtos_user/server/hello/src/guest_os.h b/mkrtos_user/server/hello/src/guest_os.h new file mode 100644 index 000000000..46053dc0e --- /dev/null +++ b/mkrtos_user/server/hello/src/guest_os.h @@ -0,0 +1,16 @@ +#pragma once +#include +#include +typedef struct guest_os +{ + obj_handler_t vcpu_th; //!< TODO:暂时只支持一个cpu + void *msg_buf; //!< 消息传递的buf + int prio; //!< 优先级 + int vcpu_id; //!< cpu id + pthread_t ipa_exeception_hd; + obj_handler_t ipa_execption_ipc; + // vgic_t gic; //! +#ifndef IS_ENABLED(CONFIG_MMU) #define HEAP_SIZE 512 #define STACK_SIZE 1024 @@ -15,3 +17,4 @@ __attribute__((used)) HEAP_ATTR static char _____heap_____[HEAP_SIZE]; __attribute__((used)) STACK_ATTR static char _____stack_____[STACK_SIZE]; +#endif diff --git a/mkrtos_user/server/hello/src/ipa_exeception.c b/mkrtos_user/server/hello/src/ipa_exeception.c new file mode 100644 index 000000000..d0d704ddb --- /dev/null +++ b/mkrtos_user/server/hello/src/ipa_exeception.c @@ -0,0 +1,75 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include "guest_os.h" +#include "u_sleep.h" +static void *ipc_execetion_thread_handler(void *arg) +{ + msg_tag_t tag; + guest_os_t *gos = arg; + ipc_msg_t *msg; + printf("%s:%d\n", __func__, __LINE__); + while (1) + { + tag = thread_ipc_wait(ipc_timeout_create2(0, 0), NULL, -1); + if (msg_tag_get_val(tag) < 0) + { + continue; + } + thread_msg_buf_get(pthread_hd_get(pthread_self()), (umword_t *)(&msg), NULL); + if (msg->msg_buf[0] >> 26 != 0x24) + { + tag = msg_tag_init4(0, 0, 0, -1); + } + else + { + umword_t ipa_addr = msg->msg_buf[1]; + + if ((msg->msg_buf[0] >> 6) & 0x1) + { + // write. + } + else + { + // read. + } + tag = msg_tag_init4(0, 0, 0, 0); + } + // printf("%s:%d\n", __func__, __LINE__); + thread_ipc_reply(tag, ipc_timeout_create2(0, 0)); + } + return NULL; +} + +int ipc_execetion_create(guest_os_t *gos) +{ + int ret = 0; + assert(gos); + ret = pthread_create(&gos->ipa_exeception_hd, NULL, ipc_execetion_thread_handler, gos); + if (ret) + { + return ret; + } + // obj_handler_t ipa_execption_ipc; + + // ipa_execption_ipc = handler_alloc(); + // if (ipa_execption_ipc == HANDLER_INVALID) + // { + // return -ENOENT; + // } + // msg_tag_t tag; + // tag = factory_create_ipc(FACTORY_PROT, vpage_create_raw3(0, 0, ipa_execption_ipc)); + // if (msg_tag_get_val(tag) < 0) + // { + // return ret; + // } + gos->ipa_execption_ipc = pthread_hd_get(gos->ipa_exeception_hd); + u_sleep_ms(100); + return 0; +} diff --git a/mkrtos_user/server/hello/src/ipa_exeception.h b/mkrtos_user/server/hello/src/ipa_exeception.h new file mode 100644 index 000000000..ea366a493 --- /dev/null +++ b/mkrtos_user/server/hello/src/ipa_exeception.h @@ -0,0 +1,3 @@ +#pragma once +#include "guest_os.h" +int ipc_execetion_create(guest_os_t *gos); diff --git a/mkrtos_user/server/hello/src/main.c b/mkrtos_user/server/hello/src/main.c index dbaf14d92..4827fa8f1 100644 --- a/mkrtos_user/server/hello/src/main.c +++ b/mkrtos_user/server/hello/src/main.c @@ -1,8 +1,19 @@ #include #include +#include +#include "guest_os.h" +extern umword_t os_bin; +guest_os_t gos; int main(int argc, char *args[]) { + + mk_printf("guest os entry addr:0x%lx\n", &os_bin); + guest_os_create(&gos, &os_bin); + while (1) + { + sleep(1); + } mk_printf("print test0.\n"); mk_printf("print test1.\n"); mk_printf("print test2.\n"); diff --git a/mkrtos_user/server/hello/src/os_test.S b/mkrtos_user/server/hello/src/os_test.S new file mode 100644 index 000000000..7fd5dd49b --- /dev/null +++ b/mkrtos_user/server/hello/src/os_test.S @@ -0,0 +1,4 @@ +.global os_bin +.align 12 +os_bin: +.incbin "/home/zhangzheng/mkrtos-real/mkrtos_user/server/hello/src/benos.bin" diff --git a/mkrtos_user/server/init/src/cons.c b/mkrtos_user/server/init/src/cons.c index f95fefb1c..c11541244 100644 --- a/mkrtos_user/server/init/src/cons.c +++ b/mkrtos_user/server/init/src/cons.c @@ -102,7 +102,7 @@ int console_read(uint8_t *data, size_t len) } else { - memcpy(data, "1234\r\n", 6); + pthread_spin_lock(&cons_obj.r_lock); if (q_queue_len(&cons_obj.r_queue) == 0) { diff --git a/mkrtos_user/server/init/src/init.cfg b/mkrtos_user/server/init/src/init.cfg index db16708a1..69e3c8fa0 100644 --- a/mkrtos_user/server/init/src/init.cfg +++ b/mkrtos_user/server/init/src/init.cfg @@ -4,5 +4,5 @@ # dm9000_drv # net # lcd_drv -# cpiofs -# sh \ No newline at end of file +cpiofs +sh \ No newline at end of file diff --git a/mkrtos_user/server/init/src/main.c b/mkrtos_user/server/init/src/main.c index e84321dd0..39b7741de 100644 --- a/mkrtos_user/server/init/src/main.c +++ b/mkrtos_user/server/init/src/main.c @@ -35,8 +35,8 @@ static void test(void) { - thread_vcpu_test(); #if 0 + thread_vcpu_test(); pthread_lock_test(); pthread_cond_lock_test(); thread_cpu_test(); diff --git a/mkrtos_user/server/net/CMakeLists.txt b/mkrtos_user/server/net/CMakeLists.txt index 4344edd6a..954f7c248 100644 --- a/mkrtos_user/server/net/CMakeLists.txt +++ b/mkrtos_user/server/net/CMakeLists.txt @@ -52,7 +52,7 @@ if ((DEFINED CONFIG_ELF_LAUNCH) AND (CONFIG_ELF_LAUNCH STREQUAL "y")) COMMAND cp net.elf ${CMAKE_SOURCE_DIR}/build/output/cpio/net ) - add_dependencies(net_dump_elf shell_dump) + add_dependencies(net_dump_elf net_dump) endif() add_dependencies(net_dump net.elf) add_dependencies(net.elf sys)