mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-11-04 05:25:45 +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
 | 
					  XenHypercallLib|Include/Library/XenHypercallLib.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ##  @libraryclass  Manage XenBus device path and I/O handles
 | 
				
			||||||
 | 
					  #
 | 
				
			||||||
 | 
					  XenIoMmioLib|Include/Library/XenIoMmioLib.h
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[Guids]
 | 
					[Guids]
 | 
				
			||||||
  gUefiOvmfPkgTokenSpaceGuid      = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}
 | 
					  gUefiOvmfPkgTokenSpaceGuid      = {0x93bb96af, 0xb9f2, 0x4eb8, {0x94, 0x62, 0xe0, 0xba, 0x74, 0x56, 0x42, 0x36}}
 | 
				
			||||||
  gEfiXenInfoGuid                 = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}}
 | 
					  gEfiXenInfoGuid                 = {0xd3b46f3b, 0xd441, 0x1244, {0x9a, 0x12, 0x0, 0x12, 0x27, 0x3f, 0xc1, 0x4d}}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user