mbox series

[RESEND,v2,00/18] Add new board: Xen guest for ARM64

Message ID 20200806094301.4999-1-vicooodin@gmail.com
Headers show
Series Add new board: Xen guest for ARM64 | expand

Message

Anastasiia Lukianenko Aug. 6, 2020, 9:42 a.m. UTC
From: Anastasiia Lukianenko <anastasiia_lukianenko@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

Comments

Oleksandr Andrushchenko Aug. 13, 2020, 7:57 a.m. UTC | #1
Ping

On 8/6/20 12:42 PM, Anastasiia Lukianenko wrote:
> From: Anastasiia Lukianenko <anastasiia_lukianenko@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
>