From b07065d3f325d1d6a0def9ce7f57876ed959a178 Mon Sep 17 00:00:00 2001 From: Volodymyr Babchuk Date: Fri, 20 Nov 2020 17:39:46 +0200 Subject: [PATCH] arm: aarch64: add Xen virtual machine support This commit adds minimal support for running zephyr as Xen guest. It does not use xen PV console, which is somewhat hard to implement, as it depends on xenbus infrastructure. Instead SBSA-compatible PL011 uart is used. Signed-off-by: Volodymyr Babchuk --- boards/arm/xenvm/Kconfig.board | 7 + boards/arm/xenvm/Kconfig.defconfig | 12 ++ boards/arm/xenvm/doc/index.rst | 179 ++++++++++++++++++++++ boards/arm/xenvm/doc/xen_project_logo.png | Bin 0 -> 67960 bytes boards/arm/xenvm/xenvm.dts | 89 +++++++++++ boards/arm/xenvm/xenvm_defconfig | 20 +++ soc/arm/xenvm/CMakeLists.txt | 3 + soc/arm/xenvm/Kconfig.defconfig | 17 ++ soc/arm/xenvm/Kconfig.soc | 10 ++ soc/arm/xenvm/linker.ld | 8 + soc/arm/xenvm/mmu_regions.c | 31 ++++ soc/arm/xenvm/soc.h | 19 +++ 12 files changed, 395 insertions(+) create mode 100644 boards/arm/xenvm/Kconfig.board create mode 100644 boards/arm/xenvm/Kconfig.defconfig create mode 100644 boards/arm/xenvm/doc/index.rst create mode 100644 boards/arm/xenvm/doc/xen_project_logo.png create mode 100644 boards/arm/xenvm/xenvm.dts create mode 100644 boards/arm/xenvm/xenvm_defconfig create mode 100644 soc/arm/xenvm/CMakeLists.txt create mode 100644 soc/arm/xenvm/Kconfig.defconfig create mode 100644 soc/arm/xenvm/Kconfig.soc create mode 100644 soc/arm/xenvm/linker.ld create mode 100644 soc/arm/xenvm/mmu_regions.c create mode 100644 soc/arm/xenvm/soc.h diff --git a/boards/arm/xenvm/Kconfig.board b/boards/arm/xenvm/Kconfig.board new file mode 100644 index 0000000000..a967e98216 --- /dev/null +++ b/boards/arm/xenvm/Kconfig.board @@ -0,0 +1,7 @@ +# Copyright (c) 2020 EPAM Systems +# SPDX-License-Identifier: Apache-2.0 + +config BOARD_XENVM + bool "Xen Virtual Machine" + depends on SOC_XENVM + select ARM64 diff --git a/boards/arm/xenvm/Kconfig.defconfig b/boards/arm/xenvm/Kconfig.defconfig new file mode 100644 index 0000000000..2e8d48bc8f --- /dev/null +++ b/boards/arm/xenvm/Kconfig.defconfig @@ -0,0 +1,12 @@ +# Copyright (c) 2020 EPAM Systems +# SPDX-License-Identifier: Apache-2.0 + +if BOARD_XENVM + +config BUILD_OUTPUT_BIN + default y + +config BOARD + default "xenvm" + +endif # BOARD_XENVM diff --git a/boards/arm/xenvm/doc/index.rst b/boards/arm/xenvm/doc/index.rst new file mode 100644 index 0000000000..3a1d6330fa --- /dev/null +++ b/boards/arm/xenvm/doc/index.rst @@ -0,0 +1,179 @@ +.. xenvm: + +ARMv8 Xen Virtual Machine Example +################################# + +Overview +******** + +This board allows to run Zephyr as Xen guest on any ARMv8 board that supports +ARM Virtualization Extensions. This is example configuration, as almost any VM +configuration is unique in many aspects. + +.. figure:: xen_project_logo.png + :align: center + :alt: XenVM + + Xen virtual Guest (Credit: Xen Project) + +It provides minimal set of devices: + +* ARM Generic timer +* GICv2 +* SBSA (subset of PL011) UART controller + + +Hardware +******** +Supported Features +================== + +The following hardware features are supported: + ++--------------+-------------+----------------------+ +| Interface | Controller | Driver/Component | ++==============+=============+======================+ +| GIC | virtualized | interrupt controller | ++--------------+-------------+----------------------+ +| SBSA UART | emulated | serial port | ++--------------+-------------+----------------------+ +| ARM TIMER | virtualized | system clock | ++--------------+-------------+----------------------+ + +The kernel currently does not support other hardware features on this platform. + +Devices +======== +System Clock +------------ + +This board configuration uses a system clock frequency of 8.32 MHz. This is the +default value, which should be corrected for user's actual hardware. + +You can determine clock frequency of your ARM Generic Timer by inspecting Xen +boot log: + +:: + + (XEN) [ 0.147541] Generic Timer IRQ: phys=30 hyp=26 virt=27 Freq: 8320 KHz + +Serial Port +----------- + +This board configuration uses a single serial communication channel using SBSA +UART. This is a minimal UART implementation provided by Xen. Xen PV Console is +not supported at this moment. + +Interrupt Controller +-------------------- + +By default, GICv2 is selected. If your hardware is based on GICv3, you can +configure Zephyr to use it, by amending device tree and Kconfig +option in "xenvm" SoC as well as guest configuration file. + +CPU Core type +------------- + +Default core in this configuration is Cortex A72. Depending on yours actual +hardware you might want to change this option in the same way as Interrupt +Controller configuration. + +Known Problems or Limitations +============================== + +Xen configures guests in runtime by providing device tree that describes guest +environment. On other hand, Zephyr uses static configuration that should be know +at build time. So there are chances, that Zephyr image created with default +configuration would not boot on your hardware. In this case you need to update +configuration by altering device tree and Kconfig options. This will be covered +in detail in next section. + +No Xen-specific features are supported at the moment. This includes: + +* Xen Enlighten memory page +* XenBus +* Xen event channels +* Xen grant tables +* Xen PV drivers (including PV console) + +Building and Running +******************** + +Use this configuration to run basic Zephyr applications and kernel tests as Xen +guest, for example, with the :ref:`synchronization_sample`: + + +.. code-block:: + + $ west build -b xenvm samples/synchronization + +This will build an image with the synchronization sample app. Next, you need to +create guest configuration file :code:`zephyr.conf`. There is example: + +.. code-block:: + + kernel="zephyr.bin" + name="zephyr" + vcpus=1 + memory=16 + gic_version="v2" + on_crash="preserve" + vuart="sbsa_uart" + +You need to upload both :code:`zephyr.bin` and :code:`zephyr.conf` to your Dom0 +and then you can run Zephyr by issuing + +.. code-block:: + + $ xl create zephyr.conf + +Next you need to attach to SBSA virtual console: + +.. code-block:: + + $ xl console -t vuart zephyr + +You will see Zephyr output: + +.. code-block:: console + + *** Booting Zephyr OS build zephyr-v2.4.0-1137-g5803ee1e8183 *** + thread_a: Hello World from cpu 0 on xenvm! + thread_b: Hello World from cpu 0 on xenvm! + thread_a: Hello World from cpu 0 on xenvm! + thread_b: Hello World from cpu 0 on xenvm! + thread_a: Hello World from cpu 0 on xenvm! + +Exit xen virtual console by pressing :kbd:`CTRL+[` + +Updating configuration +********************** + +As was said earlier, Xen describes hardware using device tree and expects that +guest will parse device tree in runtime. On other hand, Zephyr supports only +static, build time configuration. While provided configuration should work on +almost any ARMv8 host running in aarch64 mode, there is no guarantee, that Xen +will not change some values (like RAM base address) in the future. + +Also, frequency of system timer is board specific and should be updated when running +Zephyr xenvm image on new hardware. + +One can make Xen to dump generated DTB by using :code:`LIBXL_DEBUG_DUMP_DTB` +environment variable, like so: + +.. code-block:: + + $ LIBXL_DEBUG_DUMP_DTB=domu-libxl.dtb xl create zephyr.conf + +Then, generated "domu-libxl.dtb" file can be de-compiled using "dtc" tool. + +Use information from de-compiled DTB file to update all related entries in +provided "xenvm.dts" file. If memory layout is also changed, you may need to +update :code:`CONFIG_SRAM_BASE_ADDRESS` as well. + +References +********** + +`Xen ARM with Virtualization Extensions `_ + +`xl.conf (guest configuration file) manual `_ diff --git a/boards/arm/xenvm/doc/xen_project_logo.png b/boards/arm/xenvm/doc/xen_project_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..379268aebc74962efd1b990e32cee6b05b8554e4 GIT binary patch literal 67960 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≥S2Y4NhJs!GmXIL{w9 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 +#include +#include + +/ { + model = "XENVM-4.15"; + compatible = "xen,xenvm-4.15", "xen,xenvm"; + interrupt-parent = <&gic>; + #address-cells = <0x02>; + #size-cells = <0x02>; + + chosen { + zephyr,console = &sbsa; + zephyr,shell-uart = &sbsa; + zephyr,sram = &ram; + }; + + cpus { + #address-cells = <0x01>; + #size-cells = <0x00>; + + cpu@0 { + device_type = "cpu"; + compatible = "arm,armv8"; + enable-method = "psci"; + reg = <0x00>; + }; + }; + + psci { + compatible = "arm,psci-1.0", "arm,psci-0.2", "arm,psci"; + method = "hvc"; + label = "PSCI"; + }; + + ram: memory@40000000 { + device_type = "mmio-sram"; + reg = <0x00 0x40000000 0x00 DT_SIZE_M(16)>; + }; + + gic: interrupt-controller@3001000 { + compatible = "arm,gic"; + label = "GIC"; + #interrupt-cells = <0x04>; + #address-cells = <0x00>; + interrupt-controller; + reg = <0x00 0x3001000 0x00 0x1000 0x00 0x3002000 0x00 0x2000>; + }; + + timer { + compatible = "arm,arm-timer"; + interrupts = ; + interrupt-parent = <&gic>; + label = "arch_timer"; + }; + + hypervisor: hypervisor@38000000 { + compatible = "xen,xen-4.15", "xen,xen"; + reg = <0x00 0x38000000 0x00 0x1000000>; + interrupts = ; + interrupt-parent = <&gic>; + }; + + sbsa: sbsa-pl011@22000000 { + compatible = "arm,sbsa-uart"; + reg = <0x00 0x22000000 0x00 0x1000>; + interrupts = ; + interrupt-parent = <&gic>; + current-speed = <0x1c200>; + label = "UART"; + }; +}; diff --git a/boards/arm/xenvm/xenvm_defconfig b/boards/arm/xenvm/xenvm_defconfig new file mode 100644 index 0000000000..25e402bfc3 --- /dev/null +++ b/boards/arm/xenvm/xenvm_defconfig @@ -0,0 +1,20 @@ +CONFIG_SOC_XENVM=y +CONFIG_BOARD_XENVM=y + +# Enable UART driver +CONFIG_SERIAL=y + +CONFIG_XIP=n +CONFIG_FLASH_BASE_ADDRESS=0x0 +CONFIG_FLASH_SIZE=0 +CONFIG_AARCH64_IMAGE_HEADER=y +CONFIG_MAX_XLAT_TABLES=10 + +# Enable console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +# Enable serial port +CONFIG_UART_PL011=y +CONFIG_UART_PL011_SBSA=y +CONFIG_UART_INTERRUPT_DRIVEN=n diff --git a/soc/arm/xenvm/CMakeLists.txt b/soc/arm/xenvm/CMakeLists.txt new file mode 100644 index 0000000000..ac596106c2 --- /dev/null +++ b/soc/arm/xenvm/CMakeLists.txt @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library_sources_ifdef(CONFIG_ARM_MMU mmu_regions.c) diff --git a/soc/arm/xenvm/Kconfig.defconfig b/soc/arm/xenvm/Kconfig.defconfig new file mode 100644 index 0000000000..9d8d6847e2 --- /dev/null +++ b/soc/arm/xenvm/Kconfig.defconfig @@ -0,0 +1,17 @@ +# Copyright 2020 EPAM Systems +# SPDX-License-Identifier: Apache-2.0 + +if SOC_XENVM + +config SOC + default "xenvm" + +config NUM_IRQS + int + default 500 + +config SYS_CLOCK_HW_CYCLES_PER_SEC + int + default 8320000 + +endif diff --git a/soc/arm/xenvm/Kconfig.soc b/soc/arm/xenvm/Kconfig.soc new file mode 100644 index 0000000000..05e8183750 --- /dev/null +++ b/soc/arm/xenvm/Kconfig.soc @@ -0,0 +1,10 @@ +# Copyright 2020 EPAM Systems +# SPDX-License-Identifier: Apache-2.0 + +config SOC_XENVM + bool "Xen virtual machine on aarch64" + select ARM + select ARM64 + select ARM_ARCH_TIMER + select GIC_V2 + select CPU_CORTEX_A72 diff --git a/soc/arm/xenvm/linker.ld b/soc/arm/xenvm/linker.ld new file mode 100644 index 0000000000..2dffeeb65d --- /dev/null +++ b/soc/arm/xenvm/linker.ld @@ -0,0 +1,8 @@ +/* + * Copyright 2020 EPAM Systems + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include diff --git a/soc/arm/xenvm/mmu_regions.c b/soc/arm/xenvm/mmu_regions.c new file mode 100644 index 0000000000..fb8188f965 --- /dev/null +++ b/soc/arm/xenvm/mmu_regions.c @@ -0,0 +1,31 @@ +/* + * Copyright 2020 EPAM Systems + * + * SPDX-License-Identifier: Apache-2.0 + */ +#include +#include +#include + +static const struct arm_mmu_region mmu_regions[] = { + + MMU_REGION_FLAT_ENTRY("GIC", + DT_REG_ADDR_BY_IDX(DT_INST(0, arm_gic), 0), + DT_REG_SIZE_BY_IDX(DT_INST(0, arm_gic), 0), + MT_DEVICE_nGnRnE | MT_P_RW_U_RW | MT_NS), + + MMU_REGION_FLAT_ENTRY("GIC", + DT_REG_ADDR_BY_IDX(DT_INST(0, arm_gic), 1), + DT_REG_SIZE_BY_IDX(DT_INST(0, arm_gic), 1), + MT_DEVICE_nGnRnE | MT_P_RW_U_RW | MT_NS), + + MMU_REGION_FLAT_ENTRY("UART", + DT_REG_ADDR(DT_INST(0, arm_sbsa_uart)), + DT_REG_SIZE(DT_INST(0, arm_sbsa_uart)), + MT_DEVICE_nGnRnE | MT_P_RW_U_RW | MT_NS), +}; + +const struct arm_mmu_config mmu_config = { + .num_regions = ARRAY_SIZE(mmu_regions), + .mmu_regions = mmu_regions, +}; diff --git a/soc/arm/xenvm/soc.h b/soc/arm/xenvm/soc.h new file mode 100644 index 0000000000..405074371d --- /dev/null +++ b/soc/arm/xenvm/soc.h @@ -0,0 +1,19 @@ +/* + * Copyright (c) 2020 EPAM Systems + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +#ifndef _SOC_H_ +#define _SOC_H_ + +#include + +#ifndef _ASMLANGUAGE + +#include + +#endif /* !_ASMLANGUAGE */ + +#endif /* _SOC_H_ */