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

Re: [Xen-devel] [PATCH v2 02/18] OvmfPkg: Add basic skeleton for the XenBus bus driver.



On Thu, Sep 04, 2014 at 05:50:57PM +0100, Anthony PERARD wrote:
> This includes Component Name and Driver Binding.
> 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx>

Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>

> 
> ---
> Change in V2:
> - Simple support of controller name.
> - Cleaning up comments, files header.
> - Add Licenses
> - Rename XenbusDxe to XenBusDxe.
> ---
>  OvmfPkg/OvmfPkgX64.dsc            |   1 +
>  OvmfPkg/OvmfPkgX64.fdf            |   1 +
>  OvmfPkg/XenBusDxe/ComponentName.c | 190 +++++++++++++++++++++++
>  OvmfPkg/XenBusDxe/ComponentName.h | 110 +++++++++++++
>  OvmfPkg/XenBusDxe/DriverBinding.h | 144 +++++++++++++++++
>  OvmfPkg/XenBusDxe/XenBusDxe.c     | 317 
> ++++++++++++++++++++++++++++++++++++++
>  OvmfPkg/XenBusDxe/XenBusDxe.h     |  93 +++++++++++
>  OvmfPkg/XenBusDxe/XenBusDxe.inf   |  56 +++++++
>  8 files changed, 912 insertions(+)
>  create mode 100644 OvmfPkg/XenBusDxe/ComponentName.c
>  create mode 100644 OvmfPkg/XenBusDxe/ComponentName.h
>  create mode 100644 OvmfPkg/XenBusDxe/DriverBinding.h
>  create mode 100644 OvmfPkg/XenBusDxe/XenBusDxe.c
>  create mode 100644 OvmfPkg/XenBusDxe/XenBusDxe.h
>  create mode 100644 OvmfPkg/XenBusDxe/XenBusDxe.inf
> 
> diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
> index 73a6460..c52d5a4 100644
> --- a/OvmfPkg/OvmfPkgX64.dsc
> +++ b/OvmfPkg/OvmfPkgX64.dsc
> @@ -432,6 +432,7 @@
>    OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
>    OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
>    OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
> +  OvmfPkg/XenBusDxe/XenBusDxe.inf
>    OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {
>      <LibraryClasses>
>        PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf
> diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
> index 29382fb..6b556a2 100644
> --- a/OvmfPkg/OvmfPkgX64.fdf
> +++ b/OvmfPkg/OvmfPkgX64.fdf
> @@ -227,6 +227,7 @@ INF  OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
>  INF  OvmfPkg/QemuFlashFvbServicesRuntimeDxe/FvbServicesRuntimeDxe.inf
>  INF  OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
>  INF  MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
> +INF  OvmfPkg/XenBusDxe/XenBusDxe.inf
>  
>  !if $(SECURE_BOOT_ENABLE) == TRUE
>    INF  SecurityPkg/VariableAuthenticated/RuntimeDxe/VariableRuntimeDxe.inf
> diff --git a/OvmfPkg/XenBusDxe/ComponentName.c 
> b/OvmfPkg/XenBusDxe/ComponentName.c
> new file mode 100644
> index 0000000..bcf1e51
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/ComponentName.c
> @@ -0,0 +1,190 @@
> +/** @file
> +  Component Name functions implementation for XenBus Bus driver.
> +
> +  Copyright (C) 2014, Citrix Ltd.
> +
> +  Redistribution and use in source and binary forms, with or without
> +  modification, are permitted provided that the following conditions
> +  are met:
> +
> +  * Redistributions of source code must retain the above copyright
> +    notice, this list of conditions and the following disclaimer.
> +  * Redistributions in binary form must reproduce the above copyright
> +    notice, this list of conditions and the following disclaimer in
> +    the documentation and/or other materials provided with the
> +    distribution.
> +
> +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> +  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> +  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> +  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> +  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> +  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> +  POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +#include "XenBusDxe.h"
> +
> +///
> +/// Component Name Protocol instance
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED
> +EFI_COMPONENT_NAME_PROTOCOL  gXenBusDxeComponentName = {
> +  (EFI_COMPONENT_NAME_GET_DRIVER_NAME)    
> XenBusDxeComponentNameGetDriverName,
> +  
> (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)XenBusDxeComponentNameGetControllerName,
> +  "eng"
> +};
> +
> +///
> +/// Component Name 2 Protocol instance
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED
> +EFI_COMPONENT_NAME2_PROTOCOL  gXenBusDxeComponentName2 = {
> +  XenBusDxeComponentNameGetDriverName,
> +  XenBusDxeComponentNameGetControllerName,
> +  "en"
> +};
> +
> +///
> +/// Table of driver names
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED
> +EFI_UNICODE_STRING_TABLE mXenBusDxeDriverNameTable[] = {
> +  { "eng;en", (CHAR16 *)L"XenBus Bus Driver" },
> +  { NULL, NULL }
> +};
> +
> +///
> +/// Table of controller names
> +///
> +GLOBAL_REMOVE_IF_UNREFERENCED
> +EFI_UNICODE_STRING_TABLE mXenBusDxeControllerNameTable[] = {
> +  { "eng;en", (CHAR16 *)L"XenBus Controller" },
> +  { NULL, NULL }
> +};
> +
> +/**
> +  Retrieves a Unicode string that is the user-readable name of the EFI 
> Driver.
> +
> +  @param  This       A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
> +  @param  Language   A pointer to a three-character ISO 639-2 language 
> identifier.
> +                     This is the language of the driver name that that the 
> caller
> +                     is requesting, and it must match one of the languages 
> specified
> +                     in SupportedLanguages.  The number of languages 
> supported by a
> +                     driver is up to the driver writer.
> +  @param  DriverName A pointer to the Unicode string to return.  This 
> Unicode string
> +                     is the name of the driver specified by This in the 
> language
> +                     specified by Language.
> +
> +  @retval EFI_SUCCESS           The Unicode string for the Driver specified 
> by This
> +                                and the language specified by Language was 
> returned
> +                                in DriverName.
> +  @retval EFI_INVALID_PARAMETER Language is NULL.
> +  @retval EFI_INVALID_PARAMETER DriverName is NULL.
> +  @retval EFI_UNSUPPORTED       The driver specified by This does not 
> support the
> +                                language specified by Language.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeComponentNameGetDriverName (
> +  IN EFI_COMPONENT_NAME2_PROTOCOL  *This,
> +  IN  CHAR8                        *Language,
> +  OUT CHAR16                       **DriverName
> +  )
> +{
> +  return LookupUnicodeString2 (
> +           Language,
> +           This->SupportedLanguages,
> +           mXenBusDxeDriverNameTable,
> +           DriverName,
> +           (BOOLEAN)(This != &gXenBusDxeComponentName2)
> +           );
> +}
> +
> +/**
> +  Retrieves a Unicode string that is the user readable name of the controller
> +  that is being managed by an EFI Driver.
> +
> +  @param  This             A pointer to the EFI_COMPONENT_NAME_PROTOCOL 
> instance.
> +  @param  ControllerHandle The handle of a controller that the driver 
> specified by
> +                           This is managing.  This handle specifies the 
> controller
> +                           whose name is to be returned.
> +  @param  ChildHandle      The handle of the child controller to retrieve 
> the name
> +                           of.  This is an optional parameter that may be 
> NULL.  It
> +                           will be NULL for device drivers.  It will also be 
> NULL
> +                           for a bus drivers that wish to retrieve the name 
> of the
> +                           bus controller.  It will not be NULL for a bus 
> driver
> +                           that wishes to retrieve the name of a child 
> controller.
> +  @param  Language         A pointer to a three character ISO 639-2 language
> +                           identifier.  This is the language of the 
> controller name
> +                           that the caller is requesting, and it must match 
> one
> +                           of the languages specified in SupportedLanguages. 
>  The
> +                           number of languages supported by a driver is up 
> to the
> +                           driver writer.
> +  @param  ControllerName   A pointer to the Unicode string to return.  This 
> Unicode
> +                           string is the name of the controller specified by
> +                           ControllerHandle and ChildHandle in the language 
> specified
> +                           by Language, from the point of view of the driver 
> specified
> +                           by This.
> +
> +  @retval EFI_SUCCESS           The Unicode string for the user-readable 
> name in the
> +                                language specified by Language for the driver
> +                                specified by This was returned in DriverName.
> +  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
> +  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a 
> valid EFI_HANDLE.
> +  @retval EFI_INVALID_PARAMETER Language is NULL.
> +  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
> +  @retval EFI_UNSUPPORTED       The driver specified by This is not 
> currently managing
> +                                the controller specified by ControllerHandle 
> and
> +                                ChildHandle.
> +  @retval EFI_UNSUPPORTED       The driver specified by This does not 
> support the
> +                                language specified by Language.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeComponentNameGetControllerName (
> +  IN  EFI_COMPONENT_NAME2_PROTOCOL  *This,
> +  IN  EFI_HANDLE                    ControllerHandle,
> +  IN  EFI_HANDLE                    ChildHandle        OPTIONAL,
> +  IN  CHAR8                         *Language,
> +  OUT CHAR16                        **ControllerName
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  if (ChildHandle != NULL) {
> +    // TODO Get controller name for a child.
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  //
> +  // Make sure this driver is currently managing ControllerHandle
> +  //
> +  Status = EfiTestManagedDevice (
> +             ControllerHandle,
> +             gXenBusDxeDriverBinding.DriverBindingHandle,
> +             &gEfiPciIoProtocolGuid
> +             );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  //
> +  // Lookup name of controller specified by ControllerHandle
> +  //
> +  return LookupUnicodeString2 (
> +           Language,
> +           This->SupportedLanguages,
> +           mXenBusDxeControllerNameTable,
> +           ControllerName,
> +           (BOOLEAN)(This != &gXenBusDxeComponentName2)
> +           );
> +}
> diff --git a/OvmfPkg/XenBusDxe/ComponentName.h 
> b/OvmfPkg/XenBusDxe/ComponentName.h
> new file mode 100644
> index 0000000..dfafce6
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/ComponentName.h
> @@ -0,0 +1,110 @@
> +/** @file
> +  Component Name functions declaration for XenBus Bus driver.
> +
> +  Copyright (C) 2014, Citrix Ltd.
> +
> +  Redistribution and use in source and binary forms, with or without
> +  modification, are permitted provided that the following conditions
> +  are met:
> +
> +  * Redistributions of source code must retain the above copyright
> +    notice, this list of conditions and the following disclaimer.
> +  * Redistributions in binary form must reproduce the above copyright
> +    notice, this list of conditions and the following disclaimer in
> +    the documentation and/or other materials provided with the
> +    distribution.
> +
> +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> +  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> +  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> +  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> +  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> +  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> +  POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +/**
> +  Retrieves a Unicode string that is the user-readable name of the EFI 
> Driver.
> +
> +  @param  This       A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
> +  @param  Language   A pointer to a three-character ISO 639-2 language 
> identifier.
> +                     This is the language of the driver name that that the 
> caller
> +                     is requesting, and it must match one of the languages 
> specified
> +                     in SupportedLanguages.  The number of languages 
> supported by a
> +                     driver is up to the driver writer.
> +  @param  DriverName A pointer to the Unicode string to return.  This 
> Unicode string
> +                     is the name of the driver specified by This in the 
> language
> +                     specified by Language.
> +
> +  @retval EFI_SUCCESS           The Unicode string for the Driver specified 
> by This
> +                                and the language specified by Language was 
> returned
> +                                in DriverName.
> +  @retval EFI_INVALID_PARAMETER Language is NULL.
> +  @retval EFI_INVALID_PARAMETER DriverName is NULL.
> +  @retval EFI_UNSUPPORTED       The driver specified by This does not 
> support the
> +                                language specified by Language.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeComponentNameGetDriverName (
> +  IN EFI_COMPONENT_NAME2_PROTOCOL  *This,
> +  IN  CHAR8                        *Language,
> +  OUT CHAR16                       **DriverName
> +  );
> +
> +/**
> +  Retrieves a Unicode string that is the user readable name of the controller
> +  that is being managed by an EFI Driver.
> +
> +  @param  This             A pointer to the EFI_COMPONENT_NAME_PROTOCOL 
> instance.
> +  @param  ControllerHandle The handle of a controller that the driver 
> specified by
> +                           This is managing.  This handle specifies the 
> controller
> +                           whose name is to be returned.
> +  @param  ChildHandle      The handle of the child controller to retrieve 
> the name
> +                           of.  This is an optional parameter that may be 
> NULL.  It
> +                           will be NULL for device drivers.  It will also be 
> NULL
> +                           for a bus drivers that wish to retrieve the name 
> of the
> +                           bus controller.  It will not be NULL for a bus 
> driver
> +                           that wishes to retrieve the name of a child 
> controller.
> +  @param  Language         A pointer to a three character ISO 639-2 language
> +                           identifier.  This is the language of the 
> controller name
> +                           that the caller is requesting, and it must match 
> one
> +                           of the languages specified in SupportedLanguages. 
>  The
> +                           number of languages supported by a driver is up 
> to the
> +                           driver writer.
> +  @param  ControllerName   A pointer to the Unicode string to return.  This 
> Unicode
> +                           string is the name of the controller specified by
> +                           ControllerHandle and ChildHandle in the language 
> specified
> +                           by Language, from the point of view of the driver 
> specified
> +                           by This.
> +
> +  @retval EFI_SUCCESS           The Unicode string for the user-readable 
> name in the
> +                                language specified by Language for the driver
> +                                specified by This was returned in DriverName.
> +  @retval EFI_INVALID_PARAMETER ControllerHandle is NULL.
> +  @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a 
> valid EFI_HANDLE.
> +  @retval EFI_INVALID_PARAMETER Language is NULL.
> +  @retval EFI_INVALID_PARAMETER ControllerName is NULL.
> +  @retval EFI_UNSUPPORTED       The driver specified by This is not 
> currently managing
> +                                the controller specified by ControllerHandle 
> and
> +                                ChildHandle.
> +  @retval EFI_UNSUPPORTED       The driver specified by This does not 
> support the
> +                                language specified by Language.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeComponentNameGetControllerName (
> +  IN  EFI_COMPONENT_NAME2_PROTOCOL  *This,
> +  IN  EFI_HANDLE                    ControllerHandle,
> +  IN  EFI_HANDLE                    ChildHandle        OPTIONAL,
> +  IN  CHAR8                         *Language,
> +  OUT CHAR16                        **ControllerName
> +  );
> diff --git a/OvmfPkg/XenBusDxe/DriverBinding.h 
> b/OvmfPkg/XenBusDxe/DriverBinding.h
> new file mode 100644
> index 0000000..13e0a90
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/DriverBinding.h
> @@ -0,0 +1,144 @@
> +/** @file
> +  Driver Binding functions declaration for XenBus Bus driver.
> +
> +  Copyright (C) 2014, Citrix Ltd.
> +
> +  Redistribution and use in source and binary forms, with or without
> +  modification, are permitted provided that the following conditions
> +  are met:
> +
> +  * Redistributions of source code must retain the above copyright
> +    notice, this list of conditions and the following disclaimer.
> +  * Redistributions in binary form must reproduce the above copyright
> +    notice, this list of conditions and the following disclaimer in
> +    the documentation and/or other materials provided with the
> +    distribution.
> +
> +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> +  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> +  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> +  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> +  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> +  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> +  POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +/**
> +  Tests to see if this driver supports a given controller. If a child device 
> is provided,
> +  it further tests to see if this driver supports creating a handle for the 
> specified child device.
> +
> +  @param[in]  This                 A pointer to the 
> EFI_DRIVER_BINDING_PROTOCOL instance.
> +  @param[in]  ControllerHandle     The handle of the controller to test. 
> This handle
> +                                   must support a protocol interface that 
> supplies
> +                                   an I/O abstraction to the driver.
> +  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a 
> device path.  This
> +                                   parameter is ignored by device drivers, 
> and is optional for bus
> +                                   drivers. For bus drivers, if this 
> parameter is not NULL, then
> +                                   the bus driver must determine if the bus 
> controller specified
> +                                   by ControllerHandle and the child 
> controller specified
> +                                   by RemainingDevicePath are both supported 
> by this
> +                                   bus driver.
> +
> +  @retval EFI_SUCCESS              The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is supported by the 
> driver specified by This.
> +  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is already being 
> managed by the driver
> +                                   specified by This.
> +  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is already being 
> managed by a different
> +                                   driver or an application that requires 
> exclusive access.
> +                                   Currently not implemented.
> +  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is not supported by 
> the driver specified by This.
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverBindingSupported (
> +  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN EFI_HANDLE                   ControllerHandle,
> +  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> +  );
> +
> +/**
> +  Starts a device controller or a bus controller.
> +
> +  The Start() function is designed to be invoked from the EFI boot service 
> ConnectController().
> +  As a result, much of the error checking on the parameters to Start() has 
> been moved into this
> +  common boot service. It is legal to call Start() from other locations,
> +  but the following calling restrictions must be followed, or the system 
> behavior will not be deterministic.
> +  1. ControllerHandle must be a valid EFI_HANDLE.
> +  2. If RemainingDevicePath is not NULL, then it must be a pointer to a 
> naturally aligned
> +     EFI_DEVICE_PATH_PROTOCOL.
> +  3. Prior to calling Start(), the Supported() function for the driver 
> specified by This must
> +     have been called with the same calling parameters, and Supported() must 
> have returned EFI_SUCCESS.
> +
> +  @param[in]  This                 A pointer to the 
> EFI_DRIVER_BINDING_PROTOCOL instance.
> +  @param[in]  ControllerHandle     The handle of the controller to start. 
> This handle
> +                                   must support a protocol interface that 
> supplies
> +                                   an I/O abstraction to the driver.
> +  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a 
> device path.  This
> +                                   parameter is ignored by device drivers, 
> and is optional for bus
> +                                   drivers. For a bus driver, if this 
> parameter is NULL, then handles
> +                                   for all the children of Controller are 
> created by this driver.
> +                                   If this parameter is not NULL and the 
> first Device Path Node is
> +                                   not the End of Device Path Node, then 
> only the handle for the
> +                                   child device specified by the first 
> Device Path Node of
> +                                   RemainingDevicePath is created by this 
> driver.
> +                                   If the first Device Path Node of 
> RemainingDevicePath is
> +                                   the End of Device Path Node, no child 
> handle is created by this
> +                                   driver.
> +
> +  @retval EFI_SUCCESS              The device was started.
> +  @retval EFI_DEVICE_ERROR         The device could not be started due to a 
> device error.Currently not implemented.
> +  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to 
> a lack of resources.
> +  @retval Others                   The driver failded to start the device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverBindingStart (
> +  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN EFI_HANDLE                   ControllerHandle,
> +  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> +  );
> +
> +/**
> +  Stops a device controller or a bus controller.
> +
> +  The Stop() function is designed to be invoked from the EFI boot service 
> DisconnectController().
> +  As a result, much of the error checking on the parameters to Stop() has 
> been moved
> +  into this common boot service. It is legal to call Stop() from other 
> locations,
> +  but the following calling restrictions must be followed, or the system 
> behavior will not be deterministic.
> +  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous 
> call to this
> +     same driver's Start() function.
> +  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a 
> valid
> +     EFI_HANDLE. In addition, all of these handles must have been created in 
> this driver's
> +     Start() function, and the Start() function must have called 
> OpenProtocol() on
> +     ControllerHandle with an Attribute of 
> EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
> +
> +  @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL 
> instance.
> +  @param[in]  ControllerHandle  A handle to the device being stopped. The 
> handle must
> +                                support a bus specific I/O protocol for the 
> driver
> +                                to use to stop the device.
> +  @param[in]  NumberOfChildren  The number of child device handles in 
> ChildHandleBuffer.
> +  @param[in]  ChildHandleBuffer An array of child handles to be freed. May 
> be NULL
> +                                if NumberOfChildren is 0.
> +
> +  @retval EFI_SUCCESS           The device was stopped.
> +  @retval EFI_DEVICE_ERROR      The device could not be stopped due to a 
> device error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverBindingStop (
> +  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN  EFI_HANDLE                  ControllerHandle,
> +  IN  UINTN                       NumberOfChildren,
> +  IN  EFI_HANDLE                  *ChildHandleBuffer OPTIONAL
> +  );
> diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.c b/OvmfPkg/XenBusDxe/XenBusDxe.c
> new file mode 100644
> index 0000000..a272204
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/XenBusDxe.c
> @@ -0,0 +1,317 @@
> +/** @file
> +  This driver produces XenBus Protocol instances for each Xen PV devices.
> +
> +  This XenBus bus driver will first initialize differente services in order 
> to
> +  enumerate the ParaVirtualized devices available.
> +
> +  Those services are:
> +    - HyperCall
> +    - Event Channel
> +    - Grant Table
> +    - XenStore
> +    - XenBus
> +
> +  Copyright (C) 2014, Citrix Ltd.
> +
> +  Redistribution and use in source and binary forms, with or without
> +  modification, are permitted provided that the following conditions
> +  are met:
> +
> +  * Redistributions of source code must retain the above copyright
> +    notice, this list of conditions and the following disclaimer.
> +  * Redistributions in binary form must reproduce the above copyright
> +    notice, this list of conditions and the following disclaimer in
> +    the documentation and/or other materials provided with the
> +    distribution.
> +
> +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> +  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> +  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> +  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> +  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> +  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> +  POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +#include <IndustryStandard/Pci.h>
> +#include <IndustryStandard/Acpi.h>
> +#include <Library/DebugLib.h>
> +
> +#include "XenBusDxe.h"
> +
> +
> +///
> +/// Driver Binding Protocol instance
> +///
> +EFI_DRIVER_BINDING_PROTOCOL gXenBusDxeDriverBinding = {
> +  XenBusDxeDriverBindingSupported,
> +  XenBusDxeDriverBindingStart,
> +  XenBusDxeDriverBindingStop,
> +  XENBUS_DXE_VERSION,
> +  NULL,
> +  NULL
> +};
> +
> +
> +/**
> +  Unloads an image.
> +
> +  @param  ImageHandle           Handle that identifies the image to be 
> unloaded.
> +
> +  @retval EFI_SUCCESS           The image has been unloaded.
> +  @retval EFI_INVALID_PARAMETER ImageHandle is not a valid image handle.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeUnload (
> +  IN EFI_HANDLE  ImageHandle
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  EFI_HANDLE  *HandleBuffer;
> +  UINTN       HandleCount;
> +  UINTN       Index;
> +
> +  //
> +  // Retrieve array of all handles in the handle database
> +  //
> +  Status = gBS->LocateHandleBuffer (
> +                  AllHandles,
> +                  NULL,
> +                  NULL,
> +                  &HandleCount,
> +                  &HandleBuffer
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  //
> +  // Disconnect the current driver from handles in the handle database
> +  //
> +  for (Index = 0; Index < HandleCount; Index++) {
> +    gBS->DisconnectController (HandleBuffer[Index], gImageHandle, NULL);
> +  }
> +
> +  //
> +  // Free the array of handles
> +  //
> +  FreePool (HandleBuffer);
> +
> +
> +  //
> +  // Uninstall protocols installed in the driver entry point
> +  //
> +  Status = gBS->UninstallMultipleProtocolInterfaces (
> +                  ImageHandle,
> +                  &gEfiDriverBindingProtocolGuid, &gXenBusDxeDriverBinding,
> +                  &gEfiComponentNameProtocolGuid,  &gXenBusDxeComponentName,
> +                  &gEfiComponentName2ProtocolGuid, &gXenBusDxeComponentName2,
> +                  NULL
> +                  );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  This is the declaration of an EFI image entry point. This entry point is
> +  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
> +  both device drivers and bus drivers.
> +
> +  @param  ImageHandle           The firmware allocated handle for the UEFI 
> image.
> +  @param  SystemTable           A pointer to the EFI System Table.
> +
> +  @retval EFI_SUCCESS           The operation completed successfully.
> +  @retval Others                An unexpected error occurred.
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverEntryPoint (
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS  Status;
> +
> +  //
> +  // Install UEFI Driver Model protocol(s).
> +  //
> +  Status = EfiLibInstallDriverBindingComponentName2 (
> +             ImageHandle,
> +             SystemTable,
> +             &gXenBusDxeDriverBinding,
> +             ImageHandle,
> +             &gXenBusDxeComponentName,
> +             &gXenBusDxeComponentName2
> +             );
> +  ASSERT_EFI_ERROR (Status);
> +
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Tests to see if this driver supports a given controller. If a child device 
> is provided,
> +  it further tests to see if this driver supports creating a handle for the 
> specified child device.
> +
> +  @param[in]  This                 A pointer to the 
> EFI_DRIVER_BINDING_PROTOCOL instance.
> +  @param[in]  ControllerHandle     The handle of the controller to test. 
> This handle
> +                                   must support a protocol interface that 
> supplies
> +                                   an I/O abstraction to the driver.
> +  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a 
> device path.  This
> +                                   parameter is ignored by device drivers, 
> and is optional for bus
> +                                   drivers. For bus drivers, if this 
> parameter is not NULL, then
> +                                   the bus driver must determine if the bus 
> controller specified
> +                                   by ControllerHandle and the child 
> controller specified
> +                                   by RemainingDevicePath are both supported 
> by this
> +                                   bus driver.
> +
> +  @retval EFI_SUCCESS              The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is supported by the 
> driver specified by This.
> +  @retval EFI_ALREADY_STARTED      The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is already being 
> managed by the driver
> +                                   specified by This.
> +  @retval EFI_ACCESS_DENIED        The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is already being 
> managed by a different
> +                                   driver or an application that requires 
> exclusive access.
> +                                   Currently not implemented.
> +  @retval EFI_UNSUPPORTED          The device specified by ControllerHandle 
> and
> +                                   RemainingDevicePath is not supported by 
> the driver specified by This.
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverBindingSupported (
> +  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN EFI_HANDLE                   ControllerHandle,
> +  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> +  )
> +{
> +  EFI_STATUS          Status;
> +  EFI_PCI_IO_PROTOCOL *PciIo;
> +  PCI_TYPE00          Pci;
> +
> +  Status = gBS->OpenProtocol (
> +                     ControllerHandle,
> +                     &gEfiPciIoProtocolGuid,
> +                     (VOID **)&PciIo,
> +                     This->DriverBindingHandle,
> +                     ControllerHandle,
> +                     EFI_OPEN_PROTOCOL_BY_DRIVER
> +                     );
> +  if (EFI_ERROR (Status)) {
> +    return Status;
> +  }
> +
> +  Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, 0,
> +                            sizeof Pci / sizeof (UINT32), &Pci);
> +
> +  if (Status == EFI_SUCCESS) {
> +    if (Pci.Hdr.VendorId == PCI_VENDOR_ID_XEN &&
> +        Pci.Hdr.DeviceId == PCI_DEVICE_ID_XEN_PLATFORM) {
> +      Status = EFI_SUCCESS;
> +    } else {
> +      Status = EFI_UNSUPPORTED;
> +    }
> +  }
> +
> +  gBS->CloseProtocol (ControllerHandle, &gEfiPciIoProtocolGuid,
> +         This->DriverBindingHandle, ControllerHandle);
> +
> +  return Status;
> +}
> +
> +/**
> +  Starts a bus controller.
> +
> +  The Start() function is designed to be invoked from the EFI boot service 
> ConnectController().
> +  As a result, much of the error checking on the parameters to Start() has 
> been moved into this
> +  common boot service. It is legal to call Start() from other locations,
> +  but the following calling restrictions must be followed, or the system 
> behavior will not be deterministic.
> +  1. ControllerHandle must be a valid EFI_HANDLE.
> +  2. If RemainingDevicePath is not NULL, then it must be a pointer to a 
> naturally aligned
> +     EFI_DEVICE_PATH_PROTOCOL.
> +  3. Prior to calling Start(), the Supported() function for the driver 
> specified by This must
> +     have been called with the same calling parameters, and Supported() must 
> have returned EFI_SUCCESS.
> +
> +  @param[in]  This                 A pointer to the 
> EFI_DRIVER_BINDING_PROTOCOL instance.
> +  @param[in]  ControllerHandle     The handle of the controller to start. 
> This handle
> +                                   must support a protocol interface that 
> supplies
> +                                   an I/O abstraction to the driver.
> +  @param[in]  RemainingDevicePath  A pointer to the remaining portion of a 
> device path.  This
> +                                   parameter is ignored by device drivers, 
> and is optional for bus
> +                                   drivers. For a bus driver, if this 
> parameter is NULL, then handles
> +                                   for all the children of Controller are 
> created by this driver.
> +                                   If this parameter is not NULL and the 
> first Device Path Node is
> +                                   not the End of Device Path Node, then 
> only the handle for the
> +                                   child device specified by the first 
> Device Path Node of
> +                                   RemainingDevicePath is created by this 
> driver.
> +                                   If the first Device Path Node of 
> RemainingDevicePath is
> +                                   the End of Device Path Node, no child 
> handle is created by this
> +                                   driver.
> +
> +  @retval EFI_SUCCESS              The device was started.
> +  @retval EFI_DEVICE_ERROR         The device could not be started due to a 
> device error.Currently not implemented.
> +  @retval EFI_OUT_OF_RESOURCES     The request could not be completed due to 
> a lack of resources.
> +  @retval Others                   The driver failded to start the device.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverBindingStart (
> +  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN EFI_HANDLE                   ControllerHandle,
> +  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> +
> +/**
> +  Stops a bus controller.
> +
> +  The Stop() function is designed to be invoked from the EFI boot service 
> DisconnectController().
> +  As a result, much of the error checking on the parameters to Stop() has 
> been moved
> +  into this common boot service. It is legal to call Stop() from other 
> locations,
> +  but the following calling restrictions must be followed, or the system 
> behavior will not be deterministic.
> +  1. ControllerHandle must be a valid EFI_HANDLE that was used on a previous 
> call to this
> +     same driver's Start() function.
> +  2. The first NumberOfChildren handles of ChildHandleBuffer must all be a 
> valid
> +     EFI_HANDLE. In addition, all of these handles must have been created in 
> this driver's
> +     Start() function, and the Start() function must have called 
> OpenProtocol() on
> +     ControllerHandle with an Attribute of 
> EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER.
> +
> +  @param[in]  This              A pointer to the EFI_DRIVER_BINDING_PROTOCOL 
> instance.
> +  @param[in]  ControllerHandle  A handle to the device being stopped. The 
> handle must
> +                                support a bus specific I/O protocol for the 
> driver
> +                                to use to stop the device.
> +  @param[in]  NumberOfChildren  The number of child device handles in 
> ChildHandleBuffer.
> +  @param[in]  ChildHandleBuffer An array of child handles to be freed. May 
> be NULL
> +                                if NumberOfChildren is 0.
> +
> +  @retval EFI_SUCCESS           The device was stopped.
> +  @retval EFI_DEVICE_ERROR      The device could not be stopped due to a 
> device error.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +XenBusDxeDriverBindingStop (
> +  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
> +  IN EFI_HANDLE                   ControllerHandle,
> +  IN UINTN                        NumberOfChildren,
> +  IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL
> +  )
> +{
> +  return EFI_UNSUPPORTED;
> +}
> diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.h b/OvmfPkg/XenBusDxe/XenBusDxe.h
> new file mode 100644
> index 0000000..4c11f60
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/XenBusDxe.h
> @@ -0,0 +1,93 @@
> +/** @file
> +  Function declaration and internal data for XenBusDxe.
> +
> +  Copyright (C) 2014, Citrix Ltd.
> +
> +  Redistribution and use in source and binary forms, with or without
> +  modification, are permitted provided that the following conditions
> +  are met:
> +
> +  * Redistributions of source code must retain the above copyright
> +    notice, this list of conditions and the following disclaimer.
> +  * Redistributions in binary form must reproduce the above copyright
> +    notice, this list of conditions and the following disclaimer in
> +    the documentation and/or other materials provided with the
> +    distribution.
> +
> +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> +  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> +  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
> +  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
> +  COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
> +  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
> +  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
> +  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
> +  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> +  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
> +  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
> +  POSSIBILITY OF SUCH DAMAGE.
> +
> +**/
> +
> +#ifndef __EFI_XENBUS_DXE_H__
> +#define __EFI_XENBUS_DXE_H__
> +
> +#include <Uefi.h>
> +
> +//
> +// 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
> +//
> +
> +
> +//
> +// Driver Version
> +//
> +#define XENBUS_DXE_VERSION  0x00000000
> +
> +
> +//
> +// 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
> +//
> +#define PCI_VENDOR_ID_XEN                0x5853
> +#define PCI_DEVICE_ID_XEN_PLATFORM       0x0001
> +
> +
> +#endif
> diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.inf b/OvmfPkg/XenBusDxe/XenBusDxe.inf
> new file mode 100644
> index 0000000..b4d7551
> --- /dev/null
> +++ b/OvmfPkg/XenBusDxe/XenBusDxe.inf
> @@ -0,0 +1,56 @@
> +
> +## @file
> +#  TODO: Brief Description of UEFI Driver XenBusDxe
> +#
> +#  TODO: Detailed Description of UEFI Driver XenBusDxe
> +#
> +#  TODO: Copyright for UEFI Driver XenBusDxe
> +#
> +#  TODO: License for UEFI Driver XenBusDxe
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION               = 0x00010005
> +  BASE_NAME                 = XenBusDxe
> +  FILE_GUID                 = 565ec8ba-a484-11e3-802b-b8ac6f7d65e6
> +  MODULE_TYPE               = UEFI_DRIVER
> +
> +  VERSION_STRING            = 0.1
> +  ENTRY_POINT               = XenBusDxeDriverEntryPoint
> +  UNLOAD_IMAGE              = XenBusDxeUnload
> +
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  OvmfPkg/OvmfPkg.dec
> +
> +[Sources]
> +  XenBusDxe.h
> +  XenBusDxe.c
> +  DriverBinding.h
> +  ComponentName.c
> +  ComponentName.h
> +
> +[LibraryClasses]
> +  UefiDriverEntryPoint
> +  UefiBootServicesTableLib
> +  MemoryAllocationLib
> +  BaseMemoryLib
> +  BaseLib
> +  UefiLib
> +  DevicePathLib
> +  DebugLib
> +  HobLib
> +
> +
> +[Protocols]
> +  gEfiDriverBindingProtocolGuid
> +  gEfiPciIoProtocolGuid
> +  gEfiComponentName2ProtocolGuid
> +  gEfiComponentNameProtocolGuid
> +
> +
> +[Guids]
> +  gEfiXenInfoGuid
> +
> -- 
> Anthony PERARD
> 
> 
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel

_______________________________________________
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®.