diff --git a/auto_zvm.sh b/auto_zvm.sh index d67301e4f55d479d9ef0fcd4f790defe5730b652..c1cea2e0e57f712c5a72e3432def4230dfa59fc5 100755 --- a/auto_zvm.sh +++ b/auto_zvm.sh @@ -43,11 +43,8 @@ elif [ "$OPS" = "$ops_debug" ]; then -cpu max -m 4G -nographic -machine virt,virtualization=on,gic-version=3 \ -net none -pidfile qemu.pid -chardev stdio,id=con,mux=on \ -serial chardev:con -mon chardev=con,mode=readline -serial pty -serial pty -smp cpus=4 \ - -device loader,file=$(pwd)/zvm_config/qemu_platform/hub/zephyr.bin,addr=0xf2000000,force-raw=on \ - -device loader,file=$(pwd)/zvm_config/qemu_platform/hub/Image,addr=0xf3000000,force-raw=on \ - -device loader,file=$(pwd)/zvm_config/qemu_platform/hub/Image,addr=0xe0000000,force-raw=on \ - -device loader,file=$(pwd)/zvm_config/qemu_platform/hub/linux-qemu-virtio.dtb,addr=0xf2a00000 \ - -kernel $(pwd)/build/zephyr/zvm_host.elf + -device loader,file=$(pwd)/zvm_config/qemu_platform/hub/zephyr.elf,addr=0xf2000000,force-raw=on \ + -kernel $(pwd)/build/zephyr/zvm_host.elf -s -S ### using gdb to connect it: # gdb-multiarch -q -ex 'file ./build/zephyr/zvm_host.elf' -ex 'target remote localhost:1234' diff --git a/include/virtualization/tools/elfloader.h b/include/virtualization/tools/elfloader.h index 5e46878264db1b79e99535c6e1e4a908e9d1c047..5592f220ab6ed7703d54c41406358520aaeda8da 100644 --- a/include/virtualization/tools/elfloader.h +++ b/include/virtualization/tools/elfloader.h @@ -76,6 +76,6 @@ typedef struct { * @param vm_info : z_vm_info strcut. * @return int : return code. */ -int elf_loader(void *src_addr, void *dest_addr, struct z_vm_info *vm_info); +int elf_loader(void *p_src_addr,void *src_addr, void *dest_addr, struct z_vm_info *vm_info); #endif /* __ELFLOADER_H_ */ diff --git a/samples/_zvm/prj.conf b/samples/_zvm/prj.conf index de39c5e2438624701d59d419b86880400670fc57..4dcef13bec15556eb7f07e4f8ab24f0f52349dd7 100644 --- a/samples/_zvm/prj.conf +++ b/samples/_zvm/prj.conf @@ -4,7 +4,7 @@ # ZVM CONFIG_ZVM=y CONFIG_NO_OPTIMIZATIONS=y - +CONFIG_ZVM_ELF_LOADER=y # Shell CONFIG_SHELL=y CONFIG_SHELL_GETOPT=y diff --git a/soc/arm64/qemu_cortex_max/mmu_regions.c b/soc/arm64/qemu_cortex_max/mmu_regions.c index a7cd789cedf3f43cf9a3f40840a4b7a2d9938d53..434cd94d31062e437e2b4131a400b4e8b038cd13 100644 --- a/soc/arm64/qemu_cortex_max/mmu_regions.c +++ b/soc/arm64/qemu_cortex_max/mmu_regions.c @@ -26,8 +26,13 @@ static const struct arm_mmu_region mmu_regions[] = { DT_REG_SIZE(DT_INST(0, arm_pl011)), MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), + MMU_REGION_FLAT_ENTRY("ELF-Zephyr.elf", + DT_REG_ADDR(DT_NODELABEL(zephyr_ddr)), + DT_REG_SIZE(DT_NODELABEL(zephyr_ddr)), + MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), + #if defined(CONFIG_ZVM) - MMU_REGION_FLAT_ENTRY("UART1", + MMU_REGION_FLAT_ENTRY("UART1", DT_REG_ADDR(DT_INST(1, arm_pl011)), DT_REG_SIZE(DT_INST(1, arm_pl011)), MT_DEVICE_nGnRnE | MT_P_RW_U_NA | MT_DEFAULT_SECURE_STATE), diff --git a/subsys/virtualization/os/os.c b/subsys/virtualization/os/os.c index 565686329b4f55d45eb6efd8f142d99fe5ee5339..9efd12fcb660b48243d13477678b21634c1b8e7b 100644 --- a/subsys/virtualization/os/os.c +++ b/subsys/virtualization/os/os.c @@ -125,7 +125,7 @@ int get_os_info_by_id(struct getopt_state *state, struct z_vm_info *vm_info) #if defined(CONFIG_SOC_QEMU_CORTEX_MAX) #ifdef CONFIG_ZVM_ELF_LOADER - ret = elf_loader((void *)tmp_vm_info.vm_image_base, NULL, vm_info); + ret = elf_loader((void *)tmp_vm_info.vm_image_base,(void *)tmp_vm_info.vm_virt_base, NULL, vm_info); #else vm_info->entry_point = tmp_vm_info.entry_point; #endif /* CONFIG_ZVM_ELFLOADER */ @@ -171,7 +171,7 @@ out: #if defined(CONFIG_SOC_QEMU_CORTEX_MAX) #ifdef CONFIG_ZVM_ELF_LOADER - ret = elf_loader((void *)tmp_vm_info.vm_image_base, NULL, vm_info); + ret = elf_loader((void *)tmp_vm_info.vm_image_base,(void *)tmp_vm_info.vm_virt_base, NULL, vm_info); #else vm_info->entry_point = tmp_vm_info.entry_point; #endif /* CONFIG_ZVM_ELFLOADER */ diff --git a/subsys/virtualization/tools/elfloader.c b/subsys/virtualization/tools/elfloader.c index 1477022490c2dc4423669ef79f872b3f1539f5f3..74b10f27a55f9d0106032d2bce8093837ad7111c 100644 --- a/subsys/virtualization/tools/elfloader.c +++ b/subsys/virtualization/tools/elfloader.c @@ -171,7 +171,7 @@ static el_status elf_init(el_ctx *ctx, void *src) } -static el_status elf_load(el_ctx *ctx, el_alloc_cb alloc, void *src) +static el_status elf_load(el_ctx *ctx, el_alloc_cb alloc, void *p_src,void *src) { el_status rv = EL_OK; @@ -183,7 +183,7 @@ static el_status elf_load(el_ctx *ctx, el_alloc_cb alloc, void *src) Elf_Phdr ph; unsigned i = 0; for(;;) { - if ((rv = elf_findphdr(ctx, &ph, PT_LOAD, &i, src))){ + if ((rv = elf_findphdr(ctx, &ph, PT_LOAD, &i, p_src))){ return rv; } @@ -206,7 +206,7 @@ static el_status elf_load(el_ctx *ctx, el_alloc_cb alloc, void *src) } /* read loaded portion */ - if ((rv = el_pread(ctx, dest, src+ph.p_offset, ph.p_filesz))){ + if ((rv = el_pread(ctx, dest, p_src+ph.p_offset, ph.p_filesz))){ return rv; } @@ -346,7 +346,7 @@ static el_status elf_relocate(el_ctx *ctx, void *src) /** * @brief load vm's elf file for debug it's elf file */ -int elf_loader(void *src_addr, void *dest_addr, struct z_vm_info *vm_info) +int elf_loader(void *p_src_addr,void *src_addr, void *dest_addr, struct z_vm_info *vm_info) { ARG_UNUSED(dest_addr); @@ -357,7 +357,7 @@ int elf_loader(void *src_addr, void *dest_addr, struct z_vm_info *vm_info) ctx.pread = file_pread; /* Init elf struct */ - ret = elf_init(&ctx, src_addr); + ret = elf_init(&ctx, p_src_addr); if (ret) { ZVM_LOG_WARN("Elf_loader struct init error, status: %d", ret); return -ret; @@ -372,7 +372,7 @@ int elf_loader(void *src_addr, void *dest_addr, struct z_vm_info *vm_info) /* set base load addr for vm elf file */ ctx.base_load_vaddr = ctx.base_load_paddr = (uintptr_t) buf; - ret = elf_load(&ctx, alloccb, src_addr); + ret = elf_load(&ctx, alloccb, p_src_addr,src_addr); if (ret) { ZVM_LOG_WARN("Elf_loader addr load error, status: %d", ret); return -ret; @@ -396,7 +396,7 @@ int elf_loader(void *src_addr, void *dest_addr, struct z_vm_info *vm_info) /* k_free(buf); */ /* copy the block to aimed address */ - if (memcpy((void*)src_addr, buf, ctx.memsz - (uint64_t)src_addr)== NULL) { + if (memcpy((void*)p_src_addr, buf, ctx.memsz - (uint64_t)src_addr)== NULL) { return -1; } diff --git a/zvm_config/qemu_platform/Image b/zvm_config/qemu_platform/Image new file mode 100644 index 0000000000000000000000000000000000000000..f3bdb10527611f1a33f1abd0ab42179d6642ca7a Binary files /dev/null and b/zvm_config/qemu_platform/Image differ diff --git a/zvm_config/qemu_platform/Image:Zone.Identifier b/zvm_config/qemu_platform/Image:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/zvm_config/qemu_platform/linux-qemu-virtio.dtb b/zvm_config/qemu_platform/linux-qemu-virtio.dtb new file mode 100644 index 0000000000000000000000000000000000000000..ac801047ed44e9da383be2ac33dd77f08bd3031b Binary files /dev/null and b/zvm_config/qemu_platform/linux-qemu-virtio.dtb differ diff --git a/zvm_config/qemu_platform/linux-qemu-virtio.dtb:Zone.Identifier b/zvm_config/qemu_platform/linux-qemu-virtio.dtb:Zone.Identifier new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391