Ping
On 8/6/20 12:42 PM, Anastasiia Lukianenko wrote: > From: Anastasiia Lukianenko <anastasiia_lukiane...@epam.com> > > This work introduces Xen [1] guest ARM64 board support in U-Boot with > para-virtualized (PV) [2] block and serial drivers: xenguest_arm64. > > This board is to be run as a virtual Xen guest with U-boot as its > primary bootloader. The rationale behind introducing this board is a > better and simpler decoupling of the guest from the initial > privileged domain which starts a guest’s virtual machine: there are > cross dependencies between the guest OS and initial privileged domain > (Domain-0) such as Domain-0 needs guest's kernel and may need its > device tree to boot it. These dependencies interfere if the kernel or > guest OS needs to be updated, thus having a unified bootloader in > Domain-0 allows resolving this: > 1. U-boot boot scripts, which are stored on the guest’s virtual disk, > are guest specific, so any change in the guest’s configuration can be > handled by the guest itself. > 2. Guest OS’ kernel can be updated if OS’ needs that without any help > from Domain-0. > 3. Using the Device Tree Overlay mechanism it is possible to customize > the device tree entries yet at bootloader stage inside the guest > itself, so the base device tree provided by Xen can be customized. > > Xen support for U-boot was implemented by introducing a new Xen guest > ARM64 board and porting essential drivers from MiniOS [3] as well as > some of the work previously done by NXP [4]: > 1. PV block device front driver with XenStore based device > enumeration, new UCLASS_PVBLOCK; > 2. PV serial console device front driver; > 3. Xen hypervisor support with minimal set of the essential headers > adapted from Linux kernel; > 4. grant table support; > 5. event channel support, without IRQ support, but polling; > 6. xenbus support; > 7. dynamic RAM size as defined in the device tree instead of > statically defined values; > 8. position-independent pre-relocation code is used as we cannot > statically define any start addresses at compile time which is up to > Xen to choose at run-time; > 9. new defconfig introduced: xenguest_arm64_defconfig. > > Please note, that due to the fact that para-virtualized serial driver > requires some of the Xen functionality available late not all the > printouts are available at the very start including U-Boot banner, > memory size etc. > > All the above was tested with block driver related commands > (info/part/read/write), FAT and ext4 operations work properly, the > Linux kernel can start. > > Thank you in advance, > Anastasiia Lukianenko, > Oleksandr Andrushchenko > > Changes since v1: > ================= > > 1. Added test for new lib sscanf function > 2. Fixed data cache maintenance process > 3. Added more comments and explanations > 4. Removed unnecessary code, which is not related to ARM64 architecture > 5. Added board documentation > 6. Coding style cleanup > 7. Added MIT License > > Anastasiia Lukianenko (7): > Add MIT License > xen: pvblock: Add initial support for para-virtualized block driver > xen: pvblock: Enumerate virtual block devices > xen: pvblock: Read XenStore configuration and initialize > xen: pvblock: Implement front-back protocol and do IO > xen: pvblock: Print found devices indices > doc: xen: Add Xen guest ARM64 board documentation > > Andrii Anisov (2): > board: Introduce xenguest_arm64 board > lib: sscanf: add sscanf implementation > > Oleksandr Andrushchenko (7): > xen: Add essential and required interface headers > xen: Port Xen hypervizor related code from mini-os > xen: Port Xen event channel driver from mini-os > linux/compat.h: Add wait_event_timeout macro > xen: Port Xen bus driver from mini-os > xen: Port Xen grant table driver from mini-os > board: xen: De-initialize before jumping to Linux > > Peng Fan (2): > Kconfig: Introduce CONFIG_XEN > serial: serial_xen: Add Xen PV serial driver > > Kconfig | 18 + > Licenses/README | 1 + > Licenses/mit.txt | 20 + > arch/arm/Kconfig | 9 + > arch/arm/cpu/armv8/Makefile | 1 + > arch/arm/cpu/armv8/xen/Makefile | 6 + > arch/arm/cpu/armv8/xen/hypercall.S | 79 ++ > arch/arm/cpu/armv8/xen/lowlevel_init.S | 33 + > arch/arm/include/asm/io.h | 4 + > arch/arm/include/asm/xen.h | 7 + > arch/arm/include/asm/xen/hypercall.h | 22 + > arch/arm/include/asm/xen/system.h | 88 +++ > board/xen/xenguest_arm64/Kconfig | 12 + > board/xen/xenguest_arm64/Makefile | 5 + > board/xen/xenguest_arm64/xenguest_arm64.c | 202 +++++ > cmd/Kconfig | 7 + > cmd/Makefile | 1 + > cmd/pvblock.c | 30 + > common/board_r.c | 27 + > configs/xenguest_arm64_defconfig | 60 ++ > disk/part.c | 4 + > doc/board/index.rst | 1 + > doc/board/xen/index.rst | 9 + > doc/board/xen/xenguest_arm64.rst | 81 ++ > drivers/Kconfig | 2 + > drivers/Makefile | 1 + > drivers/block/blk-uclass.c | 2 + > drivers/serial/Kconfig | 7 + > drivers/serial/Makefile | 1 + > drivers/serial/serial_xen.c | 182 +++++ > drivers/xen/Kconfig | 10 + > drivers/xen/Makefile | 10 + > drivers/xen/events.c | 199 +++++ > drivers/xen/gnttab.c | 216 ++++++ > drivers/xen/hypervisor.c | 252 +++++++ > drivers/xen/pvblock.c | 867 ++++++++++++++++++++++ > drivers/xen/xenbus.c | 557 ++++++++++++++ > include/blk.h | 1 + > include/configs/xenguest_arm64.h | 52 ++ > include/dm/uclass-id.h | 1 + > include/linux/compat.h | 54 ++ > include/pvblock.h | 17 + > include/vsprintf.h | 8 + > include/xen.h | 24 + > include/xen/arm/interface.h | 88 +++ > include/xen/events.h | 42 ++ > include/xen/gnttab.h | 24 + > include/xen/hvm.h | 27 + > include/xen/interface/event_channel.h | 279 +++++++ > include/xen/interface/grant_table.h | 565 ++++++++++++++ > include/xen/interface/hvm/hvm_op.h | 55 ++ > include/xen/interface/hvm/params.h | 116 +++ > include/xen/interface/io/blkif.h | 701 +++++++++++++++++ > include/xen/interface/io/console.h | 39 + > include/xen/interface/io/protocols.h | 28 + > include/xen/interface/io/ring.h | 462 ++++++++++++ > include/xen/interface/io/xenbus.h | 64 ++ > include/xen/interface/io/xs_wire.h | 134 ++++ > include/xen/interface/memory.h | 332 +++++++++ > include/xen/interface/sched.h | 171 +++++ > include/xen/interface/xen.h | 208 ++++++ > include/xen/xenbus.h | 116 +++ > lib/Kconfig | 4 + > lib/Makefile | 1 + > lib/sscanf.c | 823 ++++++++++++++++++++ > test/lib/Makefile | 1 + > test/lib/sscanf.c | 174 +++++ > 67 files changed, 7644 insertions(+) > create mode 100644 Licenses/mit.txt > create mode 100644 arch/arm/cpu/armv8/xen/Makefile > create mode 100644 arch/arm/cpu/armv8/xen/hypercall.S > create mode 100644 arch/arm/cpu/armv8/xen/lowlevel_init.S > create mode 100644 arch/arm/include/asm/xen.h > create mode 100644 arch/arm/include/asm/xen/hypercall.h > create mode 100644 arch/arm/include/asm/xen/system.h > create mode 100644 board/xen/xenguest_arm64/Kconfig > create mode 100644 board/xen/xenguest_arm64/Makefile > create mode 100644 board/xen/xenguest_arm64/xenguest_arm64.c > create mode 100644 cmd/pvblock.c > create mode 100644 configs/xenguest_arm64_defconfig > create mode 100644 doc/board/xen/index.rst > create mode 100644 doc/board/xen/xenguest_arm64.rst > create mode 100644 drivers/serial/serial_xen.c > create mode 100644 drivers/xen/Kconfig > create mode 100644 drivers/xen/Makefile > create mode 100644 drivers/xen/events.c > create mode 100644 drivers/xen/gnttab.c > create mode 100644 drivers/xen/hypervisor.c > create mode 100644 drivers/xen/pvblock.c > create mode 100644 drivers/xen/xenbus.c > create mode 100644 include/configs/xenguest_arm64.h > create mode 100644 include/pvblock.h > create mode 100644 include/xen.h > create mode 100644 include/xen/arm/interface.h > create mode 100644 include/xen/events.h > create mode 100644 include/xen/gnttab.h > create mode 100644 include/xen/hvm.h > create mode 100644 include/xen/interface/event_channel.h > create mode 100644 include/xen/interface/grant_table.h > create mode 100644 include/xen/interface/hvm/hvm_op.h > create mode 100644 include/xen/interface/hvm/params.h > create mode 100644 include/xen/interface/io/blkif.h > create mode 100644 include/xen/interface/io/console.h > create mode 100644 include/xen/interface/io/protocols.h > create mode 100644 include/xen/interface/io/ring.h > create mode 100644 include/xen/interface/io/xenbus.h > create mode 100644 include/xen/interface/io/xs_wire.h > create mode 100644 include/xen/interface/memory.h > create mode 100644 include/xen/interface/sched.h > create mode 100644 include/xen/interface/xen.h > create mode 100644 include/xen/xenbus.h > create mode 100644 lib/sscanf.c > create mode 100644 test/lib/sscanf.c >