[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH v4 00/29] Xen/ARM guest support



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 #29 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* map 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 v4)

Changes since v3:
- rebased onto Olivier's pending GICv3 patches
- moved InterlockedCompareExchange16 () to BaseSynchronizationLib
- reimplemented XenBusDxe's TestAndClearBit () using
  InterlockedCompareExchange16 () so that XenBusDxe itself is now completely
  architecture agnostic
- various minor style and comment changes based on review feedback from
  Laszlo and Olivier
- added acks and R-b's

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 (29):
  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
  MdePkg/BaseSynchronizationLib: Added proper support for ARM
    architecture
  MdePkg/BaseSynchronizationLib: implement 16-bit compare-exchange
  Ovmf/Xen: move Xen interface version to <xen.h>
  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: port XenBusDxe to other architectures
  Ovmf/Xen: add Xen PV console SerialPortLib driver
  ArmVirtualizationPkg: 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 +-
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualization.dsc.inc                  
                                   |   2 +
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationPkg.dec                   
                                   |  10 +-
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationQemu.dsc                  
                                   |   4 +-
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.dsc                   
                                   | 218 +++++++++++++++++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/ArmVirtualizationXen.fdf                   
                                   | 302 
++++++++++++++++++++++++++++++++++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.c
 |  91 ++++++++++++
 
.../ArmVirtualizationPkg/Library/ArmVirtualizationMemoryInitPeiLib/ArmVirtualizationMemoryInitPeiLib.inf
          |  66 +++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/ArmVirtualizationPlatformLib.inf
         |   6 +-
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmVirtualizationPlatformLib/Virt.c 
                                  |  48 +------
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/AARCH64/MemnodeParser.S
                  | 237 +++++++++++++++++++++++++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/AARCH64/RelocatableVirtHelper.S
          | 167 ++++++++++++++++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/ArmXenRelocatablePlatformLib.inf
         |  59 ++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/RelocatableVirt.c
                        |  71 ++++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/ArmXenRelocatablePlatformLib/XenVirtMem.c
                             |  83 +++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c    
                                   |  65 ++++++++-
 ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.inf  
                                   |  10 +-
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.c
                             | 196 ++++++++++++++++++++++++++
 
ArmPlatformPkg/ArmVirtualizationPkg/Library/XenRealTimeClockLib/XenRealTimeClockLib.inf
                           |  38 +++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/AArch64/ArchPrePi.c                  
                                   |  33 +++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/AArch64/ModuleEntryPoint.S           
                                   | 180 ++++++++++++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/ArmVirtPrePiUniCoreRelocatable.inf   
                                   | 108 +++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/LzmaDecompress.h                     
                                   | 103 ++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.c                              
                                   | 203 +++++++++++++++++++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/PrePi.h                              
                                   |  77 +++++++++++
 ArmPlatformPkg/ArmVirtualizationPkg/PrePi/Scripts/PrePi-PIE.lds                
                                   |  42 ++++++
 ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.c                    
                                   |  73 +++++++++-
 ArmPlatformPkg/ArmVirtualizationPkg/VirtFdtDxe/VirtFdtDxe.inf                  
                                   |   5 +-
 
ArmPlatformPkg/Library/ArmPlatformGlobalVariableLib/PrePi/PrePiArmPlatformGlobalVariableLib.inf
                   |   2 +-
 EmbeddedPkg/EmbeddedPkg.dec                                                    
                                   |   2 +
 EmbeddedPkg/Include/Guid/FdtHob.h                                              
                                   |  26 ++++
 MdePkg/Include/Library/SynchronizationLib.h                                    
                                   |  26 ++++
 MdePkg/Library/BaseSynchronizationLib/AArch64/Synchronization.S                
                                   | 203 +++++++++++++++++++++++++++
 MdePkg/Library/BaseSynchronizationLib/AArch64/Synchronization.c                
                                   | 115 ----------------
 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.S                    
                                   | 211 ++++++++++++++++++++++++++++
 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.asm                  
                                   | 212 ++++++++++++++++++++++++++++
 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.c                    
                                   | 115 ----------------
 MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf               
                                   |  10 +-
 MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLibInternals.h        
                                   |  26 ++++
 MdePkg/Library/BaseSynchronizationLib/Ebc/Synchronization.c                    
                                   |  31 +++++
 MdePkg/Library/BaseSynchronizationLib/Ia32/GccInline.c                         
                                   |  42 ++++++
 .../Library/BaseSynchronizationLib/Ia32/InterlockedCompareExchange16.asm       
                                   |  88 ++++++------
 .../InterlockedCompareExchange16.h => 
MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedCompareExchange16.c   |  
89 +++++++-----
 MdePkg/Library/BaseSynchronizationLib/Ipf/InterlockedCompareExchange16.s       
                                   |  30 ++++
 MdePkg/Library/BaseSynchronizationLib/Synchronization.c                        
                                   |  31 +++++
 MdePkg/Library/BaseSynchronizationLib/X64/GccInline.c                          
                                   |  44 ++++++
 .../Library/BaseSynchronizationLib/X64/InterlockedCompareExchange16.asm        
                                   |  83 +++++------
 MdePkg/Library/BaseSynchronizationLib/X64/InterlockedCompareExchange16.c       
                                   |  54 ++++++++
 OvmfPkg/Include/Guid/XenBusRootDevice.h                                        
                                   |  24 ++++
 OvmfPkg/Include/IndustryStandard/Xen/arch-arm/xen.h                            
                                   | 436 
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 OvmfPkg/Include/IndustryStandard/Xen/io/console.h                              
                                   |  51 +++++++
 OvmfPkg/Include/IndustryStandard/Xen/xen.h                                     
                                   |   7 +-
 OvmfPkg/{XenBusDxe/XenHypercall.h => Include/Library/XenHypercallLib.h}        
                                   |  44 +-----
 OvmfPkg/Include/Library/XenIoMmioLib.h                                         
                                   |  64 +++++++++
 OvmfPkg/Include/Protocol/XenIo.h                                               
                                   |  48 +++++++
 OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.c              
                                   | 156 +++++++++++++++++++++
 OvmfPkg/Library/XenConsoleSerialPortLib/XenConsoleSerialPortLib.inf            
                                   |  35 +++++
 OvmfPkg/Library/XenHypercallLib/Aarch64/Hypercall.S                            
                                   |  26 ++++
 OvmfPkg/Library/XenHypercallLib/Arm/Hypercall.S                                
                                   |  25 ++++
 OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/Ia32/hypercall.nasm             
                                   |   6 +-
 OvmfPkg/{XenBusDxe => Library/XenHypercallLib}/X64/hypercall.nasm              
                                   |   6 +-
 OvmfPkg/Library/XenHypercallLib/XenHypercall.c                                 
                                   |  63 +++++++++
 OvmfPkg/Library/XenHypercallLib/XenHypercallIntel.c                            
                                   |  77 +++++++++++
 OvmfPkg/Library/XenHypercallLib/XenHypercallLibArm.inf                         
                                   |  40 ++++++
 OvmfPkg/Library/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/ComponentName.c                                              
                                   |   2 +-
 OvmfPkg/XenBusDxe/EventChannel.c                                               
                                   |  14 +-
 OvmfPkg/XenBusDxe/GrantTable.c                                                 
                                   |  17 ++-
 OvmfPkg/XenBusDxe/GrantTable.h                                                 
                                   |   3 +-
 OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm                                    
                                   |  16 ---
 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c                               
                                   |  33 -----
 OvmfPkg/XenBusDxe/TestAndClearBit.c                                            
                                   |  46 +++++++
 OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm                                     
                                   |  15 --
 OvmfPkg/XenBusDxe/XenBus.c                                                     
                                   |   6 +-
 OvmfPkg/XenBusDxe/XenBusDxe.c                                                  
                                   | 106 +++++++-------
 OvmfPkg/XenBusDxe/XenBusDxe.h                                                  
                                   |  16 +--
 OvmfPkg/XenBusDxe/XenBusDxe.inf                                                
                                   |  25 +---
 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 -
 92 files changed, 5417 insertions(+), 782 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 
MdePkg/Library/BaseSynchronizationLib/AArch64/Synchronization.S
 delete mode 100644 
MdePkg/Library/BaseSynchronizationLib/AArch64/Synchronization.c
 create mode 100644 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.S
 create mode 100644 
MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.asm
 delete mode 100644 MdePkg/Library/BaseSynchronizationLib/Arm/Synchronization.c
 mode change 100644 => 100755 
MdePkg/Library/BaseSynchronizationLib/BaseSynchronizationLib.inf
 rename OvmfPkg/XenBusDxe/Ia32/InterlockedCompareExchange16.nasm => 
MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedCompareExchange16.asm 
(86%)
 rename OvmfPkg/XenBusDxe/InterlockedCompareExchange16.h => 
MdePkg/Library/BaseSynchronizationLib/Ia32/InterlockedCompareExchange16.c (52%)
 create mode 100644 
MdePkg/Library/BaseSynchronizationLib/Ipf/InterlockedCompareExchange16.s
 rename OvmfPkg/XenBusDxe/X64/InterlockedCompareExchange16.nasm => 
MdePkg/Library/BaseSynchronizationLib/X64/InterlockedCompareExchange16.asm (88%)
 create mode 100644 
MdePkg/Library/BaseSynchronizationLib/X64/InterlockedCompareExchange16.c
 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
 delete mode 100644 OvmfPkg/XenBusDxe/Ia32/TestAndClearBit.nasm
 delete mode 100644 OvmfPkg/XenBusDxe/InterlockedCompareExchange16.c
 create mode 100644 OvmfPkg/XenBusDxe/TestAndClearBit.c
 delete mode 100644 OvmfPkg/XenBusDxe/X64/TestAndClearBit.nasm
 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


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.