mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-31 03:03:46 +01:00 
			
		
		
		
	ArmVirtualizationPkg: add XenIoMmioLib
This adds a XenIoMmioLib declaration and implementation that can be invoked to install the XENIO_PROTOCOL and a corresponding grant table address on a EFI handle. Contributed-under: TianoCore Contribution Agreement 1.0 Reviewed-by: Laszlo Ersek <lersek@redhat.com> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org> Signed-off-by: Laszlo Ersek <lersek@redhat.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16979 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									b0022ab871
								
							
						
					
					
						commit
						0169352eaa
					
				
							
								
								
									
										64
									
								
								OvmfPkg/Include/Library/XenIoMmioLib.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								OvmfPkg/Include/Library/XenIoMmioLib.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| /** @file
 | ||||
| *  Manage XenBus device path and I/O handles | ||||
| * | ||||
| *  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR> | ||||
| * | ||||
| *  This program and the accompanying materials are | ||||
| *  licensed and made available under the terms and conditions of the BSD License | ||||
| *  which accompanies this distribution.  The full text of the license may be found at | ||||
| *  http://opensource.org/licenses/bsd-license.php
 | ||||
| * | ||||
| *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| * | ||||
| **/ | ||||
| 
 | ||||
| #ifndef _XENIO_MMIO_DEVICE_LIB_H_ | ||||
| #define _XENIO_MMIO_DEVICE_LIB_H_ | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|   Install the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols on | ||||
|   the handle pointed to by @Handle, or on a new handle if it points to | ||||
|   NULL | ||||
| 
 | ||||
|   @param  Handle                Pointer to the handle to install the protocols | ||||
|                                 on, may point to a NULL handle. | ||||
| 
 | ||||
|   @param  GrantTableAddress     The address of the Xen grant table | ||||
| 
 | ||||
|   @retval EFI_SUCCESS           Protocols were installed successfully | ||||
| 
 | ||||
|   @retval EFI_OUT_OF_RESOURCES  The function failed to allocate memory required | ||||
|                                 by the XenIo MMIO and device path protocols | ||||
| 
 | ||||
|   @return                       Status code returned by the boot service | ||||
|                                 InstallMultipleProtocolInterfaces () | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| XenIoMmioInstall ( | ||||
|   IN OUT   EFI_HANDLE              *Handle, | ||||
|   IN       EFI_PHYSICAL_ADDRESS    GrantTableAddress | ||||
|   ); | ||||
| 
 | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|   Uninstall the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols | ||||
| 
 | ||||
|   @param  Handle          Handle onto which the protocols have been installed | ||||
|                           earlier by XenIoMmioInstall () | ||||
| 
 | ||||
|   @retval EFI_SUCCESS     Protocols were uninstalled successfully | ||||
| 
 | ||||
|   @return                 Status code returned by the boot service | ||||
|                           UninstallMultipleProtocolInterfaces () | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| XenIoMmioUninstall ( | ||||
|   IN       EFI_HANDLE              Handle | ||||
|   ); | ||||
| 
 | ||||
| #endif | ||||
							
								
								
									
										166
									
								
								OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,166 @@ | ||||
| /** @file
 | ||||
| *  Manage XenBus device path and I/O handles | ||||
| * | ||||
| *  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR> | ||||
| * | ||||
| *  This program and the accompanying materials are | ||||
| *  licensed and made available under the terms and conditions of the BSD License | ||||
| *  which accompanies this distribution.  The full text of the license may be found at | ||||
| *  http://opensource.org/licenses/bsd-license.php
 | ||||
| * | ||||
| *  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| *  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| * | ||||
| **/ | ||||
| 
 | ||||
| #include <Library/BaseLib.h> | ||||
| #include <Library/UefiBootServicesTableLib.h> | ||||
| #include <Library/DebugLib.h> | ||||
| #include <Library/UefiLib.h> | ||||
| #include <Library/BaseMemoryLib.h> | ||||
| #include <Library/MemoryAllocationLib.h> | ||||
| #include <Library/DevicePathLib.h> | ||||
| #include <Library/XenIoMmioLib.h> | ||||
| 
 | ||||
| #include <Protocol/XenIo.h> | ||||
| #include <Guid/XenBusRootDevice.h> | ||||
| 
 | ||||
| #pragma pack (1) | ||||
| typedef struct { | ||||
|   VENDOR_DEVICE_PATH                  Vendor; | ||||
|   EFI_PHYSICAL_ADDRESS                GrantTableAddress; | ||||
|   EFI_DEVICE_PATH_PROTOCOL            End; | ||||
| } XENBUS_ROOT_DEVICE_PATH; | ||||
| #pragma pack () | ||||
| 
 | ||||
| STATIC CONST XENBUS_ROOT_DEVICE_PATH mXenBusRootDevicePathTemplate = { | ||||
|   { | ||||
|     { | ||||
|       HARDWARE_DEVICE_PATH, | ||||
|       HW_VENDOR_DP, | ||||
|       { sizeof (VENDOR_DEVICE_PATH) + sizeof (EFI_PHYSICAL_ADDRESS), 0 } | ||||
|     }, | ||||
|     XENBUS_ROOT_DEVICE_GUID, | ||||
|   }, | ||||
|   0, | ||||
|   { | ||||
|     END_DEVICE_PATH_TYPE, | ||||
|     END_ENTIRE_DEVICE_PATH_SUBTYPE, | ||||
|     { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } | ||||
|   } | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|   Install the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols on | ||||
|   the handle pointed to by @Handle, or on a new handle if it points to | ||||
|   NULL | ||||
| 
 | ||||
|   @param  Handle                Pointer to the handle to install the protocols | ||||
|                                 on, may point to a NULL handle. | ||||
| 
 | ||||
|   @param  GrantTableAddress     The address of the Xen grant table | ||||
| 
 | ||||
|   @retval EFI_SUCCESS           Protocols were installed successfully | ||||
| 
 | ||||
|   @retval EFI_OUT_OF_RESOURCES  The function failed to allocate memory required | ||||
|                                 by the XenIo MMIO and device path protocols | ||||
| 
 | ||||
|   @return                       Status code returned by the boot service | ||||
|                                 InstallMultipleProtocolInterfaces () | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| XenIoMmioInstall ( | ||||
|   IN OUT   EFI_HANDLE              *Handle, | ||||
|   IN       EFI_PHYSICAL_ADDRESS    GrantTableAddress | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS                     Status; | ||||
|   XENIO_PROTOCOL                 *XenIo; | ||||
|   XENBUS_ROOT_DEVICE_PATH        *XenBusDevicePath; | ||||
|   EFI_HANDLE                     OutHandle; | ||||
| 
 | ||||
|   ASSERT (Handle != NULL); | ||||
| 
 | ||||
|   OutHandle = *Handle; | ||||
| 
 | ||||
|   XenIo = AllocateZeroPool (sizeof *XenIo); | ||||
|   if (!XenIo) { | ||||
|     return EFI_OUT_OF_RESOURCES; | ||||
|   } | ||||
|   XenIo->GrantTableAddress = GrantTableAddress; | ||||
| 
 | ||||
|   XenBusDevicePath = AllocateCopyPool (sizeof *XenBusDevicePath, | ||||
|                        &mXenBusRootDevicePathTemplate); | ||||
|   if (!XenBusDevicePath) { | ||||
|     DEBUG ((EFI_D_ERROR, "%a: Out of memory\n", __FUNCTION__)); | ||||
|     Status = EFI_OUT_OF_RESOURCES; | ||||
|     goto FreeXenIo; | ||||
|   } | ||||
|   XenBusDevicePath->GrantTableAddress = GrantTableAddress; | ||||
| 
 | ||||
|   Status = gBS->InstallMultipleProtocolInterfaces (&OutHandle, | ||||
|                   &gEfiDevicePathProtocolGuid, XenBusDevicePath, | ||||
|                   &gXenIoProtocolGuid, XenIo, | ||||
|                   NULL); | ||||
|   if (!EFI_ERROR (Status)) { | ||||
|     *Handle = OutHandle; | ||||
|     return EFI_SUCCESS; | ||||
|   } | ||||
|    | ||||
|   DEBUG ((EFI_D_ERROR, "%a: Failed to install the EFI_DEVICE_PATH and " | ||||
|     "XENIO_PROTOCOL protocols on handle %p (Status == %r)\n", | ||||
|     __FUNCTION__, OutHandle, Status)); | ||||
| 
 | ||||
|   FreePool (XenBusDevicePath); | ||||
| 
 | ||||
| FreeXenIo: | ||||
|   FreePool (XenIo); | ||||
|   return Status; | ||||
| } | ||||
| 
 | ||||
| /**
 | ||||
| 
 | ||||
|   Uninstall the XENBUS_ROOT_DEVICE_PATH and XENIO_PROTOCOL protocols | ||||
| 
 | ||||
|   @param  Handle          Handle onto which the protocols have been installed | ||||
|                           earlier by XenIoMmioInstall () | ||||
| 
 | ||||
|   @retval EFI_SUCCESS     Protocols were uninstalled successfully | ||||
| 
 | ||||
|   @return                 Status code returned by the boot service | ||||
|                           UninstallMultipleProtocolInterfaces () | ||||
| 
 | ||||
| **/ | ||||
| EFI_STATUS | ||||
| XenIoMmioUninstall ( | ||||
|   IN       EFI_HANDLE              Handle | ||||
|   ) | ||||
| { | ||||
|   EFI_STATUS    Status; | ||||
|   VOID          *XenIo; | ||||
|   VOID          *XenBusDevicePath; | ||||
| 
 | ||||
|   XenBusDevicePath = NULL; | ||||
|   gBS->OpenProtocol (Handle, &gEfiDevicePathProtocolGuid, &XenBusDevicePath, | ||||
|          NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); | ||||
| 
 | ||||
|   XenIo = NULL; | ||||
|   gBS->OpenProtocol (Handle, &gXenIoProtocolGuid, &XenIo, | ||||
|          NULL, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); | ||||
| 
 | ||||
|   Status = gBS->UninstallMultipleProtocolInterfaces (Handle, | ||||
|                   &gEfiDevicePathProtocolGuid, XenBusDevicePath, | ||||
|                   &gXenIoProtocolGuid, XenIo, | ||||
|                   NULL); | ||||
| 
 | ||||
|   if (EFI_ERROR (Status)) { | ||||
|     return Status; | ||||
|   } | ||||
| 
 | ||||
|   FreePool (XenBusDevicePath); | ||||
|   FreePool (XenIo); | ||||
| 
 | ||||
|   return EFI_SUCCESS; | ||||
| } | ||||
							
								
								
									
										39
									
								
								OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								OvmfPkg/Library/XenIoMmioLib/XenIoMmioLib.inf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,39 @@ | ||||
| ## @file | ||||
| #  Manage XenBus device path and I/O handles | ||||
| # | ||||
| #  Copyright (c) 2015, Linaro Ltd. All rights reserved.<BR> | ||||
| # | ||||
| #  This program and the accompanying materials | ||||
| #  are licensed and made available under the terms and conditions of the BSD License | ||||
| #  which accompanies this distribution. The full text of the license may be found at | ||||
| #  http://opensource.org/licenses/bsd-license.php. | ||||
| #  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | ||||
| #  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | ||||
| # | ||||
| # | ||||
| ## | ||||
| 
 | ||||
| [Defines] | ||||
|   INF_VERSION                    = 0x00010005 | ||||
|   BASE_NAME                      = XenIoMmioLib | ||||
|   FILE_GUID                      = de9bdc19-8434-47bb-be3c-7f28f2101fd0 | ||||
|   MODULE_TYPE                    = DXE_DRIVER | ||||
|   VERSION_STRING                 = 1.0 | ||||
|   LIBRARY_CLASS                  = XenIoMmioLib | ||||
| 
 | ||||
| [Sources] | ||||
|   XenIoMmioLib.c | ||||
| 
 | ||||
| [Packages] | ||||
|   MdePkg/MdePkg.dec | ||||
|   OvmfPkg/OvmfPkg.dec | ||||
| 
 | ||||
| [LibraryClasses] | ||||
|   BaseMemoryLib | ||||
| 
 | ||||
| [Guids] | ||||
|   gXenBusRootDeviceGuid | ||||
| 
 | ||||
| [Protocols] | ||||
|   gEfiDevicePathProtocolGuid | ||||
|   gXenIoProtocolGuid | ||||
| @ -48,6 +48,10 @@ | ||||
|   # | ||||
|   XenHypercallLib|Include/Library/XenHypercallLib.h | ||||
| 
 | ||||
|   ##  @libraryclass  Manage XenBus device path and I/O handles | ||||
|   # | ||||
|   XenIoMmioLib|Include/Library/XenIoMmioLib.h | ||||
| 
 | ||||
| [Guids] | ||||
|   gUefiOvmfPkgTokenSpaceGuid      = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}} | ||||
|   gEfiXenInfoGuid                 = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user