From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ard Biesheuvel Subject: [PATCH v3 00/27] Xen/ARM guest support Date: Tue, 3 Feb 2015 19:19:45 +0000 Message-ID: <1422991212-9257-1-git-send-email-ard.biesheuvel@linaro.org> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: edk2-devel@lists.sourceforge.net, lersek@redhat.com, olivier.martin@arm.com, roy.franz@linaro.org, leif.lindholm@linaro.org, stefano.stabellini@eu.citrix.com, ian.campbell@citrix.com, anthony.perard@citrix.com, christoffer.dall@linaro.org, xen-devel@lists.xen.org, ilias.biris@linaro.org, julien.grall@linaro.org Cc: Ard Biesheuvel List-Id: xen-devel@lists.xenproject.org This series implements support for executing Tianocore inside a Xen guest domain on 64-bit ARM systems (AArch64) The first part addresses ARM platform specifics, primarily to allow a Tianocore binary image to be runtime relocatable, and execute from DRAM. The second part refactors the XenBus support, and adds some missing device drivers that are needed to execute on ARM: a Xen PV console and a real time clock driver. Finally, patch #27 wraps it all together and implements the .dsc and .fdf platform descriptions that can be used to build the binary image. NOTES: - the Xen RTC driver is a dummy implementation, as it is a Runtime driver which is callable through Runtime Services from the OS, and this is currently not supportable under Xen, due to the need to share the shared info page between the OS and the firmware - UEFI maps the entire physical memory space as cached, and relies on Xen to use the correct stage2 mappings for regions that are backed by devices, such as the GIC or device passthrough. The reason is that the I/O console ring and grant table are backed by RAM that Xen maps as cached, which means that UEFI *must* maps those as cached as well. Instead of discovering those regions early on (i.e., before enabling the MMU) it is much easier to rely on the architecturally mandated behavior that stage2 device mappings supersede stage1 cached mappings for the same region. - this code is not yet tested on x86 (still only build tested for v3) Changes since v2: - rebased onto latest upstream containing Laszlo's ARM generic timer changes, with Olivier's pending GICv3 patches applied on top; - moved the relocatable PrePi to a completely separate module, and dropped patches changing the original ARM PrePi code: all required changes have been incorporated directly into the split off version - dropped the ARM BDS entirely, only Intel BDS supported as of now - added a constructor to XenConsoleSerialPortLib, otherwise there is no output from the release build; - implemented all review comments regarding style and correctness, including cleaning up the DSC in the final patch - added acks and R-b's Changes since v1: - move to PatchableInModule PCDs for the runtime self-relocating PrePi: this is semantically more correct, and will make the build system help us spot if there are remaining instances of FixedPcdGetXX() which need attention - split some prepi and xen patches to make it easier on the reviewers - split off the PCI support from XenBusDxe instead of the frankenstein DXE from v1 - implemented review comments regarding moving of files, splitting of libraries and some EDK2 optimizations suggested by Laszlo (casting, use of specific types etc) - added some acks and R-b's Ard Biesheuvel (27): ArmPkg: allow HYP timer interrupt to be omitted ArmPkg: allow patchable PCDs for memory, FD and FV addresses ArmPlatformPkg: allow patchable PCD for FD base address ArmVirtualizationPkg: add GICv3 detection to VirtFdtDxe ArmVirtualizationPkg: allow patchable PCD for device tree base address ArmVirtualizationPkg: move early UART discovery to PlatformPeim ArmVirtualizationPkg: use a HOB to store device tree blob ArmVirtualizationPkg: add padding to FDT allocation ArmVirtualizationPkg: add a relocatable version of PrePi ArmVirtualizationPkg: implement custom MemoryInitPeiLib ArmVirtualizationPkg: allow patchable PCD for FV and DT base addresses ArmVirtualizationPkg: Xen/PV relocatable platformlib instance Ovmf/Xen: move Xen interface version to Ovmf/Xen: fix pointer to int cast in XenBusDxe Ovmf/Xen: refactor XenBusDxe hypercall implementation Ovmf/Xen: move XenBusDxe hypercall code to separate library Ovmf/Xen: introduce XENIO_PROTOCOL Ovmf/Xen: add separate driver for Xen PCI device Ovmf/Xen: move XenBusDxe to abstract XENIO_PROTOCOL Ovmf/Xen: implement XenHypercallLib for ARM Ovmf/Xen: add ARM and AArch64 support to XenBusDxe Ovmf/Xen: add Xen PV console SerialPortLib driver Ovmf/Xen: implement dummy RealTimeClockLib for Xen Ovfm/Xen: add a Vendor Hardware device path GUID for the XenBus root ArmVirtualizationPkg: add XenIoMmioLib ArmVirtualizationPkg/VirtFdtDxe: wire up XenBusDxe to "xen,xen" DT node ArmVirtualizationPkg: add platform description for Xen guests ArmPkg/ArmPkg.dec | 25 +- ArmPkg/Drivers/TimerDxe/TimerDxe.c | 14 +- .../ArmVirtualizationPkg/ArmVirtualization.dsc.inc | 2 + .../ArmVirtualizationPkg/ArmVirtualizationPkg.dec | 10 +- .../ArmVirtualizationPkg/ArmVirtualizationQemu.dsc | 4 +- .../ArmVirtualizationPkg/ArmVirtualizationXen.dsc | 218 +++++++++++ .../ArmVirtualizationPkg/ArmVirtualizationXen.fdf | 302 ++++++++++++++ .../ArmVirtualizationMemoryInitPeiLib.c | 91 +++++ .../ArmVirtualizationMemoryInitPeiLib.inf | 66 ++++ .../ArmVirtualizationPlatformLib.inf | 6 +- .../Library/ArmVirtualizationPlatformLib/Virt.c | 48 +-- .../AARCH64/MemnodeParser.S | 232 +++++++++++ .../AARCH64/RelocatableVirtHelper.S | 161 ++++++++ .../ArmXenRelocatablePlatformLib.inf | 59 +++ .../ArmXenRelocatablePlatformLib/RelocatableVirt.c | 71 ++++ .../ArmXenRelocatablePlatformLib/XenVirtMem.c | 83 ++++ .../Library/PlatformPeiLib/PlatformPeiLib.c | 65 ++- .../Library/PlatformPeiLib/PlatformPeiLib.inf | 10 +- .../XenRealTimeClockLib/XenRealTimeClockLib.c | 196 +++++++++ .../XenRealTimeClockLib/XenRealTimeClockLib.inf | 38 ++ .../ArmVirtualizationPkg/PrePi/AArch64/ArchPrePi.c | 33 ++ .../PrePi/AArch64/ModuleEntryPoint.S | 170 ++++++++ .../PrePi/ArmVirtPrePiUniCoreRelocatable.inf | 107 +++++ .../ArmVirtualizationPkg/PrePi/LzmaDecompress.h | 103 +++++ ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c | 203 ++++++++++ ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.h | 77 ++++ .../PrePi/Scripts/PrePi-PIE.lds | 28 ++ .../ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c | 70 +++- .../ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf | 5 +- .../PrePi/PrePiArmPlatformGlobalVariableLib.inf | 2 +- EmbeddedPkg/EmbeddedPkg.dec | 2 + EmbeddedPkg/Include/Guid/FdtHob.h | 26 ++ OvmfPkg/Include/Guid/XenBusRootDevice.h | 24 ++ .../Include/IndustryStandard/Xen/arch-arm/xen.h | 436 +++++++++++++++++++++ OvmfPkg/Include/IndustryStandard/Xen/io/console.h | 51 +++ OvmfPkg/Include/IndustryStandard/Xen/xen.h | 7 +- .../Library/XenHypercallLib.h} | 44 +-- OvmfPkg/Include/Library/XenIoMmioLib.h | 64 +++ OvmfPkg/Include/Protocol/XenIo.h | 48 +++ .../XenConsoleSerialPortLib.c | 156 ++++++++ .../XenConsoleSerialPortLib.inf | 35 ++ .../Library/XenHypercallLib/Aarch64/Hypercall.S | 26 ++ OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S | 25 ++ .../XenHypercallLib}/Ia32/hypercall.nasm | 6 +- .../XenHypercallLib}/X64/hypercall.nasm | 6 +- OvmfPkg/Library/XenHypercallLib/XenHypercall.c | 63 +++ .../Library/XenHypercallLib/XenHypercallIntel.c | 77 ++++ .../Library/XenHypercallLib/XenHypercallLibArm.inf | 40 ++ .../XenHypercallLib/XenHypercallLibIntel.inf | 52 +++ OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c | 166 ++++++++ OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf | 39 ++ OvmfPkg/OvmfPkg.dec | 10 + OvmfPkg/OvmfPkgIa32.dsc | 2 + OvmfPkg/OvmfPkgIa32.fdf | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 2 + OvmfPkg/OvmfPkgIa32X64.fdf | 1 + OvmfPkg/OvmfPkgX64.dsc | 2 + OvmfPkg/OvmfPkgX64.fdf | 1 + OvmfPkg/XenBusDxe/AtomicsGcc.c | 44 +++ OvmfPkg/XenBusDxe/ComponentName.c | 2 +- OvmfPkg/XenBusDxe/EventChannel.c | 14 +- OvmfPkg/XenBusDxe/GrantTable.c | 15 +- OvmfPkg/XenBusDxe/GrantTable.h | 3 +- OvmfPkg/XenBusDxe/XenBus.c | 6 +- OvmfPkg/XenBusDxe/XenBusDxe.c | 106 ++--- OvmfPkg/XenBusDxe/XenBusDxe.h | 14 +- OvmfPkg/XenBusDxe/XenBusDxe.inf | 16 +- OvmfPkg/XenBusDxe/XenHypercall.c | 118 ------ OvmfPkg/XenBusDxe/XenStore.c | 6 +- OvmfPkg/XenIoPciDxe/XenIoPciDxe.c | 367 +++++++++++++++++ OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf | 45 +++ OvmfPkg/XenPvBlkDxe/XenPvBlkDxe.h | 4 - 72 files changed, 4318 insertions(+), 353 deletions(-) create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.fdf create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/AARCH64/MemnodeParser.S create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/AARCH64/RelocatableVirtHelper.S create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/ArmXenRelocatablePlatformLib.inf create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/RelocatableVirt.c create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/XenVirtMem.c create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.c create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/AArch64/ArchPrePi.c create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/AArch64/ModuleEntryPoint.S create mode 100755 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/LzmaDecompress.h create mode 100755 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.h create mode 100644 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/Scripts/PrePi-PIE.lds create mode 100644 EmbeddedPkg/Include/Guid/FdtHob.h create mode 100644 OvmfPkg/Include/Guid/XenBusRootDevice.h create mode 100644 OvmfPkg/Include/IndustryStandard/Xen/arch-arm/xen.h create mode 100644 OvmfPkg/Include/IndustryStandard/Xen/io/console.h rename OvmfPkg/{XenBusDxe/XenHypercall.h => Include/Library/XenHypercallLib.h} (59%) create mode 100644 OvmfPkg/Include/Library/XenIoMmioLib.h create mode 100644 OvmfPkg/Include/Protocol/XenIo.h create mode 100644 OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c create mode 100644 OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.inf create mode 100644 OvmfPkg/Library/XenHypercallLib/Aarch64/Hypercall.S create mode 100644 OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S rename OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/Ia32/hypercall.nasm (81%) rename OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/X64/hypercall.nasm (78%) create mode 100644 OvmfPkg/Library/XenHypercallLib/XenHypercall.c create mode 100644 OvmfPkg/Library/XenHypercallLib/XenHypercallIntel.c create mode 100644 OvmfPkg/Library/XenHypercallLib/XenHypercallLibArm.inf create mode 100644 OvmfPkg/Library/XenHypercallLib/XenHypercallLibIntel.inf create mode 100644 OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c create mode 100644 OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf create mode 100644 OvmfPkg/XenBusDxe/AtomicsGcc.c delete mode 100644 OvmfPkg/XenBusDxe/XenHypercall.c create mode 100644 OvmfPkg/XenIoPciDxe/XenIoPciDxe.c create mode 100644 OvmfPkg/XenIoPciDxe/XenIoPciDxe.inf -- 1.8.3.2