diff --git a/.oebuild/features/zvm.yaml b/.oebuild/features/zvm.yaml new file mode 100644 index 0000000000000000000000000000000000000000..cbbb326be84bc9eebd66b1987d7ed78fcf88b0d4 --- /dev/null +++ b/.oebuild/features/zvm.yaml @@ -0,0 +1,7 @@ +type: feature + +support: qemu-aarch64 + +local_conf: | + MCS_FEATURES:append = " zvm" + DISTRO_FEATURES_NATIVE:append = " mcs" diff --git a/docs/image/mcs/zvm/zvm_new_run_os.png b/docs/image/mcs/zvm/zvm_new_run_os.png new file mode 100644 index 0000000000000000000000000000000000000000..07b5ebb7b181f1c198eeb1abb65c0b48b7a667ea Binary files /dev/null and b/docs/image/mcs/zvm/zvm_new_run_os.png differ diff --git a/docs/image/mcs/zvm/zvm_screen_openeuler_zephyr.png b/docs/image/mcs/zvm/zvm_screen_openeuler_zephyr.png new file mode 100644 index 0000000000000000000000000000000000000000..d726e3e6c94ccbbb64faaded8cc8100acb131708 Binary files /dev/null and b/docs/image/mcs/zvm/zvm_screen_openeuler_zephyr.png differ diff --git a/docs/source/features/index.rst b/docs/source/features/index.rst index c5a380be30ec262fa6b333bed2eb452b0de08219..5360cd76cd4dde927e6552de3e951f5c2767264c 100644 --- a/docs/source/features/index.rst +++ b/docs/source/features/index.rst @@ -23,3 +23,4 @@ container/index.rst kernelversions.rst software_package_description.rst + zvm.rst diff --git a/docs/source/features/zvm.rst b/docs/source/features/zvm.rst new file mode 100644 index 0000000000000000000000000000000000000000..fc1c39507ff31d3fd579e8468032bcc0f2916b52 --- /dev/null +++ b/docs/source/features/zvm.rst @@ -0,0 +1,130 @@ +嵌入式实时虚拟机ZVM +########################## + +总体介绍 +======== + + ZVM(Zephyr-based Virtual Machine)是基于开源微内核实时操作系统 Zephyr RTOS(由Linux基金会托管) 开发的一款 + 虚拟机管理器(Hypervisor),能在单一硬件平台上启动多个操作系统,以构建安全隔离的多内核混合部署系统。 + + 目前以终端控制方式加入openEuler-mcs特性 + +____ + +ZVM 构建指导 +================== + +使用 oebuild 构建 +------------------------- + 目前提供预编译zvm和zephyr镜像,支持在 qemu-aarch64 上运行 zvm,可同时部署Zephyr RTOS和openEuler + + 预编译Image已经集成到openeuler-image-mcs构建过程中,由bitbake构建过程中自动加载到相应的目录 + + openEuler和对应的dtb、根文件系统则由bitbake在构建过程中进行编译和生成。 + + .. note:: + zvm启动的两个OS的虚拟终端通过screen连接,为qemu增加的uart补丁也已经包含在构建过程中 + + 1. 根据 :ref:`mcs镜像构建指导 `,使用 oebuild 初始化编译环境。 + + 2. 进入oebuild工作目录,创建编译配置文件 ``compile.yaml`` : + + .. code-block:: console + + # 使用qemu-aarch64平台、包含mcs和zvm特性、此处构建目录名为zvm + oebuild generate -p qemu-aarch64 -f openeuler-mcs -f zvm -d zvm + + 3. 进入 ``build_zvm`` 目录使用oebuild容器构建: + + .. code-block:: console + + oebuild bitbake + # 进入容器后 + bitbake openeuler-image-mcs + + 4. 最终启动依赖的文件位于 ``build/zvm/tmp/deploy/images/qemu-aarch64`` : + + - zvm_host.elf + - zephyr.bin + - zvm-openeuler-Image + - zvm-openeuler.cpio.gz + - zvm-openeuler.dtb + +____ + +ZVM 使用指导 +================== + + 1. 构建完成后使用qemu启动: + + .. note:: + 构建过程中自动编译了带有补丁的qemu,位于: + + ./tmp/work/x86_64-linux/qemu-helper-native/1.0-r1/recipe-sysroot-native/usr/bin/qemu-system-aarch64 + + .. code-block:: console + + $ qemu-system-aarch64 -machine virt,gic-version=3 -machine virtualization=true -cpu max -smp 4 -m 4096 \ + -chardev stdio,id=con,mux=on -mon chardev=con,mode=readline -serial chardev:con \ + -serial pty -serial pty -nographic -net none -pidfile qemu.pid \ + -device loader,file=/home/openeuler/build/zvm/tmp/deploy/images/qemu-aarch64/zephyr.bin,addr=0xc8000000,force-raw=on \ + -device loader,file=/home/openeuler/build/zvm/tmp/deploy/images/qemu-aarch64/zvm-openeuler-Image,addr=0xe0000000,force-raw=on \ + -device loader,file=/home/openeuler/build/zvm/tmp/deploy/images/qemu-aarch64/zvm-openeuler.cpio.gz,addr=0xe4000000,force-raw=on \ + -device loader,file=/home/openeuler/build/zvm/tmp/deploy/images/qemu-aarch64/zvm-openeuler.dtb,addr=0xf2a00000 \ + -kernel /home/openeuler/build/zvm/tmp/deploy/images/qemu-aarch64/zvm_host.elf + + .. note:: + 支持通过runqemu脚本启动,但会默认为启动过程追加一些目前不需要的配置 + + 2. runqemu 脚本启动 + + 修改内容为 ``src/yocto-poky/scripts/runqemu:1418``: + + .. code-block:: python + + self.qemu_opt += ""#" -serial mon:stdio" + + 因为启动ZVM使用的配置是: + + .. code-block:: console + + -chardev stdio,id=con,mux=on -mon chardev=con,mode=readline -serial chardev:con + + 这与-serial mon:stdio冲突 + + 3. 连接虚拟终端 + + 查看zvm终端输出信息,如: + + .. code-block:: console + + char device redirected to /dev/pts/2 (label serial1) + char device redirected to /dev/pts/3 (label serial2) + + .. code-block:: console + + # 在同构建目录下,另外启动进入两个oebuild 容器,分别使用screen连接 + $ screen /dev/pts/2 + $ screen /dev/pts/3 + + 4. 启动Zephyr虚拟机 + + .. code-block:: console + + zvm_host:~# zvm new -t zephyr + zvm_host:~# zvm run -n 0 + + 如下图所示: + + .. image:: ../../image/mcs/zvm/zvm_new_run_os.png + + 5. 启动Linux虚拟机 + + .. code-block:: console + + zvm_host:~# zvm new -t linux + zvm_host:~# zvm run -n 1 + + 6. 最终连接到2个虚拟机如下图所示: + + .. image:: ../../image/mcs/zvm/zvm_screen_openeuler_zephyr.png diff --git a/meta-openeuler/classes/qemuboot-zvm-defaults.bbclass b/meta-openeuler/classes/qemuboot-zvm-defaults.bbclass new file mode 100644 index 0000000000000000000000000000000000000000..47de4547808ad4c5b981a04e8a2e79fc176d652c --- /dev/null +++ b/meta-openeuler/classes/qemuboot-zvm-defaults.bbclass @@ -0,0 +1,96 @@ +# Usually, the runqemu startup method uses Linux openeuler as the kernel, +# and depends on the corresponding rootfs file and dtb. +# However, under the zvm-host feature, runqemu startup uses zvm-host as the kernel, +# with openeuler running on zvm. +# Some qemu boot configurations need to be changed. +# During startup, the image rootfs and dtb will be directly loaded to the specified memory addresses. + +# zvm start linux-openeuler by Image +KERNEL_IMAGETYPE = "Image" +ZVM_VLINUX_IMAGE_NAME = "zvm-openeuler" + + +QB_DEFAULT_KERNEL = "zvm_host.elf" + +QB_CPU = "-cpu max" +QB_SMP = "-smp 4" +QB_MEM = "-m 4096" +QB_KERNEL_CMDLINE_APPEND = "maxcpus=4" +QB_MACHINE= "-machine virt,gic-version=3 -machine virtualization=true" + +QB_OPT_APPEND:append:qemu-aarch64= " \ + -chardev stdio,id=con,mux=on \ + -mon chardev=con,mode=readline \ + -serial chardev:con \ + -serial pty \ + -serial pty \ + " +ZEPHYR_ADDR = "0xc8000000" +LINUX_ADDR = "0xe0000000" +LINUX_ROOTFS_ADDR = "0xe4000000" +VLINUX_DTB_ADDR = "0xf2a00000" +VLINUX_DTB = "zvm-openeuler.dtb" +ZVM_VLINUX_IMAGE_NAME = "zvm-openeuler" + +QB_OPT_APPEND:append:qemu-aarch64= " \ + -nographic -net none -pidfile qemu.pid \ + -device loader,file=${DEPLOY_DIR_IMAGE}/zephyr.bin,addr=${ZEPHYR_ADDR},force-raw=on \ + -device loader,file=${DEPLOY_DIR_IMAGE}/${ZVM_VLINUX_IMAGE_NAME}-${KERNEL_IMAGETYPE},addr=${LINUX_ADDR},force-raw=on \ + -device loader,file=${DEPLOY_DIR_IMAGE}/${ZVM_VLINUX_IMAGE_NAME}.cpio.gz,addr=${LINUX_ROOTFS_ADDR},force-raw=on \ + -device loader,file=${DEPLOY_DIR_IMAGE}/${VLINUX_DTB},addr=${VLINUX_DTB_ADDR} \ + " + +RDEPENDS:append = " \ + zvm \ + zvm-openeuler-dtb \ + " + +# make install or nologin when using busybox-inittab +set_permissions_from_rootfs:append() { + cd "${IMAGE_ROOTFS}" + if [ -e ./etc/inittab ];then + sed -i "s#respawn:/sbin/getty.*#respawn:-/bin/sh#g" ./etc/inittab + fi + cd - +} +# modify the atsk:copy_openeuler_distro +IMAGE_POSTPROCESS_COMMAND:remove = "copy_openeuler_distro;" +copy_openeuler_distro() { + set -x + test -d "${OUTPUT_DIR}" || mkdir -p "${OUTPUT_DIR}" + + # Copy rootfs image to OUTPUT + for IMAGETYPE in ${IMAGE_FSTYPES} + do + if [ -f ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX%.rootfs}.*${IMAGETYPE} ];then + rm -f "${OUTPUT_DIR}"/${IMAGE_NAME}${IMAGE_NAME_SUFFIX%.rootfs}.*${IMAGETYPE} + cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX%.rootfs}.*${IMAGETYPE} "${OUTPUT_DIR}"/ + cp -fp ${IMGDEPLOYDIR}/${IMAGE_NAME}${IMAGE_NAME_SUFFIX}.${IMAGETYPE} "${IMGDEPLOYDIR}"/${ZVM_VLINUX_IMAGE_NAME}.${IMAGETYPE} + fi + done + + # Copy kernel image to OUTPUT with new naming format + for kernel_img in zImage bzImage uImage Image zboot.img boot.img vmlinux; do + if [ -f "${DEPLOY_DIR_IMAGE}/${kernel_img}" ]; then + cp -fp "${DEPLOY_DIR_IMAGE}/${kernel_img}" "${OUTPUT_DIR}/zvm-openeuler-${kernel_img}" + cp -fp "${DEPLOY_DIR_IMAGE}/${kernel_img}" "${DEPLOY_DIR_IMAGE}/zvm-openeuler-${kernel_img}" + fi + done + set +x +} + +IMAGE_POSTPROCESS_COMMAND:append = "copy_openeuler_distro;" + +# Remove QEMU opt +QB_DTB = "" +QB_DTB_LINK = "" +QB_CMDLINE_IP_SLIRP = "" +QB_CMDLINE_IP_TAP = "" +QB_GRAPHICS = "" +QB_NETWORK_DEVICE = "" +QB_RNG = "" +QB_ROOTFS_EXTRA_OPT = "" +QB_TAP_OPT = "" +QB_TCPSERIAL_OPT = "" +QB_ROOTFS_OPT = "" +QB_SERIAL_OPT = "" diff --git a/meta-openeuler/recipes-core/images/openeuler-image-mcs.bb b/meta-openeuler/recipes-core/images/openeuler-image-mcs.bb index b961b464f25a08eadddc8ae5721a7647c4b39598..c99bdc0d16320d2c409b2d1ddaab94ca8d1ed804 100644 --- a/meta-openeuler/recipes-core/images/openeuler-image-mcs.bb +++ b/meta-openeuler/recipes-core/images/openeuler-image-mcs.bb @@ -10,6 +10,7 @@ REQUIRED_DISTRO_FEATURES = "mcs" QB_QEMU_CLASSES = "" QB_QEMU_CLASSES:append:qemuall = "${@bb.utils.contains('DISTRO_FEATURES', 'xen', ' qemuboot-xen-defaults qemuboot-xen-dtb', '', d)}" QB_QEMU_CLASSES:append:qemuall = "${@bb.utils.contains('MCS_FEATURES', 'openamp', ' qemuboot-mcs-dtb', '', d)}" +QB_QEMU_CLASSES:append:qemuall = "${@bb.utils.contains('MCS_FEATURES', 'zvm', ' qemuboot-zvm-defaults', '', d)}" QB_MEM = "-m 1048" inherit ${QB_QEMU_CLASSES} @@ -23,6 +24,12 @@ packagegroup-kernel-modules \ packagegroup-openssh \ packagegroup-mcs \ " +# ZVM currently support simple kernel +IMAGE_INSTALL:remove = " \ + ${@bb.utils.contains('MCS_FEATURES', 'zvm', ' \ + packagegroup-kernel-modules \ + packagegroup-openssh \ + ', '', d)}" python () { machine = d.getVar('MACHINE').split() diff --git a/meta-openeuler/recipes-devtools/qemu/files/add_extra_uart_for_mcs_feature.patch b/meta-openeuler/recipes-devtools/qemu/files/add_extra_uart_for_mcs_feature.patch new file mode 100644 index 0000000000000000000000000000000000000000..3aff0ebb2554a6fa16acaffda51c2935c56710cf --- /dev/null +++ b/meta-openeuler/recipes-devtools/qemu/files/add_extra_uart_for_mcs_feature.patch @@ -0,0 +1,97 @@ +Upstream-Status: Inappropriate [Local configuration] +Reason: Patch applied to meet zvm-specific requirements, not suitable for upstream as it caters to local configuration needs. + +--- qemu-6.2.0/hw/arm/virt.c 2021-12-15 04:42:02.000000000 +0800 ++++ qemu-6.2.0/hw/arm/virt.c 2023-01-10 10:26:05.097333085 +0800 +@@ -162,6 +162,10 @@ static const MemMapEntry base_memmap[] = + [VIRT_PCIE_ECAM] = { 0x3f000000, 0x01000000 }, + /* Actual RAM size depends on initial RAM and device memory settings */ + [VIRT_MEM] = { GiB, LEGACY_RAMLIMIT_BYTES }, ++ [VIRT_RESERVED] = { 0xc0000000, 0x00a00000 }, ++ [VIRT_UART1] = { 0x09001000, 0x00001000 }, ++ [VIRT_UART2] = { 0x09002000, 0x00001000 }, ++ [VIRT_RESERVED2] = { 0xd0000000, 0x00100000 }, + }; + + /* +@@ -189,6 +193,8 @@ static const int a15irqmap[] = { + [VIRT_GPIO] = 7, + [VIRT_SECURE_UART] = 8, + [VIRT_ACPI_GED] = 9, ++ [VIRT_UART1] = 10, ++ [VIRT_UART2] = 11, + [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */ + [VIRT_GIC_V2M] = 48, /* ...to 48 + NUM_GICV2M_SPIS - 1 */ + [VIRT_SMMU] = 74, /* ...to 74 + NUM_SMMU_IRQS - 1 */ +@@ -841,6 +847,8 @@ static void create_uart(const VirtMachin + qemu_fdt_setprop(ms->fdt, nodename, "clock-names", + clocknames, sizeof(clocknames)); + ++ if(uart == VIRT_UART1){} else ++ if(uart == VIRT_UART2){} else + if (uart == VIRT_UART) { + qemu_fdt_setprop_string(ms->fdt, "/chosen", "stdout-path", nodename); + } else { +@@ -1892,12 +1900,15 @@ static void machvirt_init(MachineState * + MemoryRegion *secure_sysmem = NULL; + MemoryRegion *tag_sysmem = NULL; + MemoryRegion *secure_tag_sysmem = NULL; ++ MemoryRegion *reserved_ram = g_new(MemoryRegion, 1); ++ MemoryRegion *reserved_ram2 = g_new(MemoryRegion, 1); + int n, virt_max_cpus; + bool firmware_loaded; + bool aarch64 = true; + bool has_ged = !vmc->no_ged; + unsigned int smp_cpus = machine->smp.cpus; + unsigned int max_cpus = machine->smp.max_cpus; ++ unsigned int vm_uart_count = 0; + + /* + * In accelerated mode, the memory map is computed earlier in kvm_type() +@@ -2112,13 +2123,29 @@ static void machvirt_init(MachineState * + + fdt_add_pmu_nodes(vms); + +- create_uart(vms, VIRT_UART, sysmem, serial_hd(0)); ++ create_uart(vms, VIRT_UART, sysmem, serial_hd(vm_uart_count++)); ++ ++ if (serial_hd(vm_uart_count)) { ++ create_uart(vms, VIRT_UART1, sysmem, serial_hd(vm_uart_count++)); ++ } ++ ++ ++ if (serial_hd(vm_uart_count)) { ++ create_uart(vms, VIRT_UART2, sysmem, serial_hd(vm_uart_count++)); ++ } ++ + + if (vms->secure) { + create_secure_ram(vms, secure_sysmem, secure_tag_sysmem); +- create_uart(vms, VIRT_SECURE_UART, secure_sysmem, serial_hd(1)); ++ create_uart(vms, VIRT_SECURE_UART, secure_sysmem, serial_hd(vm_uart_count++)); + } + ++ memory_region_init_ram(reserved_ram, NULL, "mach-virt.reserved_ram", vms->memmap[VIRT_RESERVED].size, NULL); ++ memory_region_add_subregion(sysmem, vms->memmap[VIRT_RESERVED].base, reserved_ram); ++ memory_region_init_ram(reserved_ram2, NULL, "mach-virt.reserved_ram2", vms->memmap[VIRT_RESERVED2].size, NULL); ++ memory_region_add_subregion(sysmem, vms->memmap[VIRT_RESERVED2].base, reserved_ram2); ++ ++ + if (tag_sysmem) { + create_tag_ram(tag_sysmem, vms->memmap[VIRT_MEM].base, + machine->ram_size, "mach-virt.tag"); + + +--- qemu-6.2.0/include/hw/arm/virt.h 2021-12-15 04:42:02.000000000 +0800 ++++ qemu-6.2.0/include/hw/arm/virt.h 2023-01-10 10:24:18.039171547 +0800 +@@ -86,6 +86,10 @@ enum { + VIRT_ACPI_GED, + VIRT_NVDIMM_ACPI, + VIRT_PVTIME, ++ VIRT_RESERVED, ++ VIRT_RESERVED2, ++ VIRT_UART1, ++ VIRT_UART2, + VIRT_LOWMEMMAP_LAST, + }; + diff --git a/meta-openeuler/recipes-devtools/qemu/qemu-system-native_%.bbappend b/meta-openeuler/recipes-devtools/qemu/qemu-system-native_%.bbappend index 06aa7601a40eebd64cd3855bc487d3c48ed6ddd2..c460c5bc0543711ee662c3282f38d1ea529418f1 100644 --- a/meta-openeuler/recipes-devtools/qemu/qemu-system-native_%.bbappend +++ b/meta-openeuler/recipes-devtools/qemu/qemu-system-native_%.bbappend @@ -2,3 +2,11 @@ SRC_URI:prepend = " file://${BP}.tar.xz " PACKAGECONFIG:remove = " virglrenderer epoxy " + +FILESEXTRAPATHS:prepend := "${THISDIR}/files/:" + +SRC_URI:append = " \ + ${@bb.utils.contains('DISTRO_FEATURES', 'mcs', ' \ + file://add_extra_uart_for_mcs_feature.patch \ + ' ,'', d)} \ +" diff --git a/meta-openeuler/recipes-kernel/linux/files/meta-data/features/zvm/zvm.cfg b/meta-openeuler/recipes-kernel/linux/files/meta-data/features/zvm/zvm.cfg new file mode 100644 index 0000000000000000000000000000000000000000..506a6b4df4cf5a1f9115b2717190105ac39154f2 --- /dev/null +++ b/meta-openeuler/recipes-kernel/linux/files/meta-data/features/zvm/zvm.cfg @@ -0,0 +1,100 @@ +CONFIG_LOCALVERSION_AUTO=y +# CONFIG_GENERIC_IRQ_MULTI_HANDLER is not set +CONFIG_GENERIC_IRQ_CHIP=y +CONFIG_IRQ_FASTEOI_HIERARCHY_HANDLERS=y +CONFIG_HAVE_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y +CONFIG_NO_HZ_IDLE=y + +# CONFIG_NO_HZ_FULL is not set +# CONFIG_CONTEXT_TRACKING is not set + +CONFIG_TICK_CPU_ACCOUNTING=y +# CONFIG_TASKSTATS is not set +# CONFIG_VIRT_CPU_ACCOUNTING is not set +# CONFIG_VIRT_CPU_ACCOUNTING_GEN is not set + +# CONFIG_RCU_EXPERT is not set +# CONFIG_RCU_FANOUT is not set +# CONFIG_RCU_NOCB_CPU is not set + +CONFIG_IKCONFIG=y +CONFIG_IKCONFIG_PROC=y + +CONFIG_LOG_BUF_SHIFT=17 +CONFIG_LOG_CPU_MAX_BUF_SHIFT=12 +CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13 + + +# CONFIG_CFS_BANDWIDTH is not set +# CONFIG_RT_GROUP_SCHED is not set +CONFIG_CGROUP_PIDS=y +# CONFIG_CGROUP_DEBUG is not set +CONFIG_TIME_NS=y +CONFIG_SCHED_AUTOGROUP=y + +CONFIG_RD_BZIP2=y +CONFIG_RD_LZO=y +CONFIG_RD_LZ4=y +CONFIG_RD_ZSTD=y +CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE=y + +# CONFIG_EXPERT is not set + +CONFIG_IO_URING=y +# CONFIG_PRINTK_NMI is not set + +# CONFIG_EMBEDDED is not set + +CONFIG_KCMP=y +CONFIG_RSEQ=y +# CONFIG_PERF_USE_VMALLOC is not set + +# CONFIG_DEBUG_PERF_USE_VMALLOC is not set + +CONFIG_SLAB_MERGE_DEFAULT=y +# CONFIG_SLAB_FREELIST_RANDOM is not set +# CONFIG_SLAB_FREELIST_HARDENED is not set +# CONFIG_SHUFFLE_PAGE_ALLOCATOR is not set +CONFIG_SYSTEM_DATA_VERIFICATION=y + +# CONFIG_TRACEPOINTS is not set +# CONFIG_KABI_RESERVE is not set +# CONFIG_KABI_SIZE_ALIGN_CHECKS is not set + +CONFIG_ARCH_MMAP_RND_BITS_MAX=33 + + +CONFIG_PGTABLE_LEVELS=4 + +# CONFIG_LIVEPATCH is not set + +CONFIG_AS_HAS_LDAPR=y + +# CONFIG_ARM64_PTR_AUTH is not set + + +# CONFIG_ARM64_E0PD is not set + +CONFIG_ARM_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE=y +CONFIG_ARM_PSCI_CPUIDLE_DOMAIN=y + +CONFIG_ARM64_CRYPTO=y + +CONFIG_PACKET=y +# CONFIG_NET_KEY is not set +CONFIG_IPV6=y +CONFIG_NF_DEFRAG_IPV4=y +CONFIG_NF_REJECT_IPV6=y +CONFIG_CAN_DEV=y + +# CONFIG_UIO is not set +# CONFIG_ARM_CCI_PMU is not set +# CONFIG_ARM_CCN is not set +# CONFIG_DAX is not set +# CONFIG_FSCACHE is not set +# CONFIG_ISO9660_FS is not set +# CONFIG_NLS_UTF8 is not set +# CONFIG_PANIC_ON_OOPS is not set +# CONFIG_SCHED_DEBUG is not set diff --git a/meta-openeuler/recipes-kernel/linux/files/meta-data/features/zvm/zvm.scc b/meta-openeuler/recipes-kernel/linux/files/meta-data/features/zvm/zvm.scc new file mode 100644 index 0000000000000000000000000000000000000000..7ed252158225318e7871c0c1df290451151f2e62 --- /dev/null +++ b/meta-openeuler/recipes-kernel/linux/files/meta-data/features/zvm/zvm.scc @@ -0,0 +1,4 @@ +define KFEATURE_DESCRIPTION "zvm Kernel Support" +define KFEATURE_COMPATIBILITY arch + +kconf non-hardware zvm.cfg diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.inc b/meta-openeuler/recipes-kernel/linux/linux-openeuler.inc index e3817d988e75fed88144d9531977922822423613..967e8d943c083f3df6d81befd4fbeab67e5f1a3b 100644 --- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.inc +++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.inc @@ -98,6 +98,9 @@ KERNEL_FEATURES:append:x86-64 = " \ # xen kernel support KERNEL_FEATURES:append = "${@bb.utils.contains('DISTRO_FEATURES', 'xen', ' features/xen/xen.scc', '', d)}" +# zvm kernel support +KERNEL_FEATURES:append = "${@bb.utils.contains('MCS_FEATURES', 'zvm', ' features/zvm/zvm.scc', '', d)}" + KERNEL_FEATURES:append = " \ ${@bb.utils.contains('DISTRO_FEATURES', 'kubeedge', 'features/kubeedge/kubeedge.scc', '', d)} \ " diff --git a/meta-openeuler/recipes-mcs/zvm/files/zephyr.bin b/meta-openeuler/recipes-mcs/zvm/files/zephyr.bin new file mode 100755 index 0000000000000000000000000000000000000000..436818ef5e09835f7a26f757b59fe1e54f1808cc Binary files /dev/null and b/meta-openeuler/recipes-mcs/zvm/files/zephyr.bin differ diff --git a/meta-openeuler/recipes-mcs/zvm/files/zvm-openeuler.dts b/meta-openeuler/recipes-mcs/zvm/files/zvm-openeuler.dts new file mode 100644 index 0000000000000000000000000000000000000000..02cbdc6ae54e762a150c4d87885881e1cecb63ab --- /dev/null +++ b/meta-openeuler/recipes-mcs/zvm/files/zvm-openeuler.dts @@ -0,0 +1,138 @@ +/dts-v1/; + +/ { + interrupt-parent = <0x8002>; + #size-cells = <0x02>; + #address-cells = <0x02>; + compatible = "linux,dummy-virt"; + + psci { + migrate = <0xc4000005>; + cpu_on = <0xc4000003>; + cpu_off = <0x84000002>; + cpu_suspend = <0xc4000001>; + method = "smc"; + compatible = "arm,psci-0.2\0arm,psci"; + }; + + memory@40000000 { + reg = <0x00 0x40000000 0x00 0x40000000>; + device_type = "memory"; + }; + + virtio_mmio@a000000 { + dma-coherent; + interrupts = <0x00 0x10 0x04>; + reg = <0x00 0xa000000 0x00 0x1000>; + compatible = "virtio,mmio"; + }; + + pl011@9000000 { + clock-names = "uartclk\0apb_pclk"; + clocks = <0x8000 0x8000>; + interrupts = <0x00 0x01 0x04>; + reg = <0x00 0x9000000 0x00 0x1000>; + compatible = "arm,pl011\0arm,primecell"; + }; + + pmu { + interrupts = <0x01 0x07 0x104>; + compatible = "arm,armv8-pmuv3"; + }; + + intc@8000000 { + phandle = <0x8002>; + interrupts = <0x01 0x09 0x04>; + reg = <0x00 0x8000000 0x00 0x10000 0x00 0x80a0000 0x00 0xf60000>; + #redistributor-regions = <0x01>; + compatible = "arm,gic-v3"; + ranges; + #size-cells = <0x02>; + #address-cells = <0x02>; + interrupt-controller; + #interrupt-cells = <0x03>; + + its@8080000 { + phandle = <0x8003>; + reg = <0x00 0x8080000 0x00 0x20000>; + msi-controller; + compatible = "arm,gic-v3-its"; + }; + }; + + cpus { + #size-cells = <0x00>; + #address-cells = <0x01>; + + cpu-map { + + socket0 { + + cluster0 { + + core0 { + cpu = <0x8001>; + }; + }; + }; + }; + + cpu@0 { + phandle = <0x8001>; + reg = <0x00>; + compatible = "arm,cortex-a57"; + device_type = "cpu"; + }; + }; + + timer { + interrupts = <0x01 0x0d 0x104 0x01 0x0e 0x104 0x01 0x0b 0x104 0x01 0x0a 0x104>; + always-on; + compatible = "arm,armv8-timer\0arm,armv7-timer"; + }; + + apb-pclk { + phandle = <0x8000>; + clock-output-names = "clk24mhz"; + clock-frequency = <0x16e3600>; + #clock-cells = <0x00>; + compatible = "fixed-clock"; + }; + + chosen { + bootargs = "console=ttyAMA0,115200 earlyprintk=pl011,0x9000000 root=/dev/ram0 init=/sbin/init ramdisk_size=10000000 rootfstype=cpio rw"; + stdout-path = "/pl011@9000000"; + linux,initrd-start = <0x45000000>; + linux,initrd-end = <0x4FA75E3D>; + kaslr-seed = <0xfe5f4802 0xd861995f>; + }; + + reserved-memory { + #address-cells = <0x02>; + #size-cells = <0x02>; + ranges; + + ivshmem_pci@6fffc000 { + reg = <0x00 0x6fffc000 0x00 0x4000>; + no-map; + }; + + client_os_reserved@7a000000 { + reg = <0x00 0x7a000000 0x00 0x4000000>; + no-map; + phandle = <0x02>; + }; + + client_os-dma-memory@70000000 { + compatible = "shared-dma-pool"; + reg = <0x00 0x70000000 0x00 0x100000>; + no-map; + phandle = <0x01>; + }; + }; + + mcs-remoteproc { + compatible = "oe,mcs_remoteproc"; + memory-region = <0x01 0x02>; + }; +}; diff --git a/meta-openeuler/recipes-mcs/zvm/files/zvm_host.elf b/meta-openeuler/recipes-mcs/zvm/files/zvm_host.elf new file mode 100755 index 0000000000000000000000000000000000000000..ea86f5b95dc176833b42644f5d26e7f3f0ded33a Binary files /dev/null and b/meta-openeuler/recipes-mcs/zvm/files/zvm_host.elf differ diff --git a/meta-openeuler/recipes-mcs/zvm/zvm-openeuler-dtb_1.0.bb b/meta-openeuler/recipes-mcs/zvm/zvm-openeuler-dtb_1.0.bb new file mode 100644 index 0000000000000000000000000000000000000000..447be6ee3e367c338539f41bdb56c8743cf96189 --- /dev/null +++ b/meta-openeuler/recipes-mcs/zvm/zvm-openeuler-dtb_1.0.bb @@ -0,0 +1,27 @@ +# Although the dtb has been generated by qemuboot-mcs-dtb.bbclass, it is for qemu. +# If we want to run OpenEuler on ZVM, a specific dtb should be used instead. +SUMMARY = "compile openeuler dtb" + +PACKAGE_ARCH = "${MACHINE_ARCH}" +PACKAGE = "${PN}" +PV = "1.0" + +DEPENDS += " dtc-native " + +SRC_URI += " \ + file://zvm-openeuler.dts \ + " +LICENSE = "Apache-2.0" + +do_populate_lic[noexec] = "1" + +do_generate_zvm_openeuler_dtb() { + dtc -I dts -O dtb ${WORKDIR}/"zvm-openeuler.dts" -o ${WORKDIR}/"zvm-openeuler.dtb" +} + +do_install:append() { + install -d ${DEPLOY_DIR_IMAGE} + install -m 0644 ${WORKDIR}/"zvm-openeuler.dtb" ${DEPLOY_DIR_IMAGE} + install -m 0644 ${WORKDIR}/"zvm-openeuler.dts" ${DEPLOY_DIR_IMAGE} +} +addtask generate_zvm_openeuler_dtb after do_fetch before do_install diff --git a/meta-openeuler/recipes-mcs/zvm/zvm.bb b/meta-openeuler/recipes-mcs/zvm/zvm.bb new file mode 100644 index 0000000000000000000000000000000000000000..025e3602e3b0835805b6b1c6182877daa38176ef --- /dev/null +++ b/meta-openeuler/recipes-mcs/zvm/zvm.bb @@ -0,0 +1,22 @@ +#Currently, we only use the compiled ZVM and Zephyr images. +SUMMARY = "ZVM Base Package" +DESCRIPTION = "Copy ZVM images" + +PACKAGE_ARCH = "${MACHINE_ARCH}" +PACKAGE = "${PN}" +PV = "1.0" + +SRC_URI += " \ + file://zvm_host.elf \ + file://zephyr.bin \ + " +LICENSE = "Apache-2.0" + +do_populate_lic[noexec] = "1" +# The do_install function to copy files to the deployment directory +do_install:append() { + install -d ${DEPLOY_DIR_IMAGE} + + install -m 0644 ${WORKDIR}/zephyr.bin ${DEPLOY_DIR_IMAGE} + install -m 0644 ${WORKDIR}/zvm_host.elf ${DEPLOY_DIR_IMAGE} +}