mirror of https://github.com/acidanthera/audk.git
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
|
@ -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
|
|
@ -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;
|
||||
}
|
|
@ -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…
Reference in New Issue