Anthony PERARD 86d968e05e OvmfPkg/XenBusDxe: Introduce XenBus support itself.
This is a bus-like on top of XenStore. It will look for advertised
ParaVirtualized devices and initialize them by producing XenBus
protocol.

Change in V4:
- Replace the license by the commonly used file header text.
- Clean XenBus.h header (remove copyright that does not belong to the
  file anymore; and rewrite the brief description of the file)
- Fix description on the function

Change in V3:
- Insert to ChildList later, once populated.
- Remove XENBUS_XENSTORE_NODE macro.
- add comment to XenBusAddDevice and XenBusEnumerateBus about
  concurrency calls.
- Add a description to the introduced member to the protocol.

Change in V2:
- comment, file header
- Fix comment style
- Error handling in the main init function
- coding style
- Fix error path in add device.

Origin: FreeBSD 10.0
License: This patch adds XenBus.c which is under the MIT licence.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Acked-by: Jordan Justen <jordan.l.justen@intel.com>

git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16270 6f19259b-4bc3-4df7-8a09-765794883524
2014-10-29 06:51:18 +00:00

144 lines
3.3 KiB
C

/** @file
Function declaration and internal data for XenBusDxe.
Copyright (C) 2014, Citrix Ltd.
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 __EFI_XENBUS_DXE_H__
#define __EFI_XENBUS_DXE_H__
#include <Uefi.h>
//
// Xen interface version used
//
#define __XEN_INTERFACE_VERSION__ 0x00040400
//
// Libraries
//
#include <Library/UefiBootServicesTableLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/BaseLib.h>
#include <Library/UefiLib.h>
#include <Library/DevicePathLib.h>
#include <Library/DebugLib.h>
//
// UEFI Driver Model Protocols
//
#include <Protocol/DriverBinding.h>
//
// Consumed Protocols
//
#include <Protocol/PciIo.h>
//
// Produced Protocols
//
#include <Protocol/XenBus.h>
//
// Driver Version
//
#define XENBUS_DXE_VERSION 0x00000010
//
// Protocol instances
//
extern EFI_DRIVER_BINDING_PROTOCOL gXenBusDxeDriverBinding;
extern EFI_COMPONENT_NAME2_PROTOCOL gXenBusDxeComponentName2;
extern EFI_COMPONENT_NAME_PROTOCOL gXenBusDxeComponentName;
//
// Include files with function prototypes
//
#include "DriverBinding.h"
#include "ComponentName.h"
//
// Other stuff
//
#include <IndustryStandard/Xen/xen.h>
#define PCI_VENDOR_ID_XEN 0x5853
#define PCI_DEVICE_ID_XEN_PLATFORM 0x0001
typedef struct _XENBUS_DEVICE_PATH XENBUS_DEVICE_PATH;
typedef struct _XENBUS_DEVICE XENBUS_DEVICE;
// Have the state of the driver.
#define XENBUS_DEVICE_SIGNATURE SIGNATURE_32 ('X','B','s','t')
struct _XENBUS_DEVICE {
UINT32 Signature;
EFI_DRIVER_BINDING_PROTOCOL *This;
EFI_HANDLE ControllerHandle;
EFI_PCI_IO_PROTOCOL *PciIo;
EFI_EVENT ExitBootEvent;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
LIST_ENTRY ChildList;
VOID *Hyperpage;
shared_info_t *SharedInfo;
};
// There is one of this struct allocated for every child.
#define XENBUS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('X', 'B', 'p', 'd')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
EFI_HANDLE Handle;
XENBUS_PROTOCOL XenBusIo;
XENBUS_DEVICE *Dev;
XENBUS_DEVICE_PATH *DevicePath;
} XENBUS_PRIVATE_DATA;
#define XENBUS_PRIVATE_DATA_FROM_THIS(a) \
CR (a, XENBUS_PRIVATE_DATA, XenBusIo, XENBUS_PRIVATE_DATA_SIGNATURE)
#define XENBUS_PRIVATE_DATA_FROM_LINK(a) \
CR (a, XENBUS_PRIVATE_DATA, Link, XENBUS_PRIVATE_DATA_SIGNATURE)
/*
* Helpers
*/
/**
Atomically test and clear a bit.
@param Bit Bit index to test in *Address
@param Address The Address to the buffer that contain the bit to test.
@return Value of the Bit before it was cleared.
**/
INT32
EFIAPI
TestAndClearBit (
IN INT32 Bit,
IN volatile VOID *Address
);
CHAR8*
AsciiStrDup (
IN CONST CHAR8* Str
);
#endif