]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/XenBusDxe: Add device state struct and create an ExitBoot services event.
authorAnthony PERARD <anthony.perard@citrix.com>
Wed, 29 Oct 2014 06:48:59 +0000 (06:48 +0000)
committerjljusten <jljusten@Edk2>
Wed, 29 Oct 2014 06:48:59 +0000 (06:48 +0000)
The ExitBoot event is used to disconnect from the device before the
next operating system start using them.

Change in V3:
- use the variable mMyDevice to prevent the driver from
  starting twice (if there is two different PCI devices).
- free(dev) on exit

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16259 6f19259b-4bc3-4df7-8a09-765794883524

OvmfPkg/XenBusDxe/XenBusDxe.c
OvmfPkg/XenBusDxe/XenBusDxe.h

index 7f297bdeaea35308c98ce25a45d55ca5f0ae24f7..f3c74e1fbe00337d8654408a246c5bce98073935 100644 (file)
@@ -43,6 +43,9 @@ EFI_DRIVER_BINDING_PROTOCOL gXenBusDxeDriverBinding = {
 };\r
 \r
 \r
+STATIC EFI_LOCK       mMyDeviceLock = EFI_INITIALIZE_LOCK_VARIABLE (TPL_CALLBACK);\r
+STATIC XENBUS_DEVICE *mMyDevice = NULL;\r
+\r
 /**\r
   Unloads an image.\r
 \r
@@ -216,6 +219,19 @@ XenBusDxeDriverBindingSupported (
   return Status;\r
 }\r
 \r
+VOID\r
+EFIAPI\r
+NotifyExitBoot (\r
+  IN EFI_EVENT Event,\r
+  IN VOID *Context\r
+  )\r
+{\r
+  XENBUS_DEVICE *Dev = Context;\r
+\r
+  gBS->DisconnectController(Dev->ControllerHandle,\r
+                            Dev->This->DriverBindingHandle, NULL);\r
+}\r
+\r
 /**\r
   Starts a bus controller.\r
 \r
@@ -259,7 +275,37 @@ XenBusDxeDriverBindingStart (
   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  EFI_STATUS Status;\r
+  XENBUS_DEVICE *Dev;\r
+\r
+  Dev = AllocateZeroPool (sizeof (*Dev));\r
+  Dev->Signature = XENBUS_DEVICE_SIGNATURE;\r
+  Dev->This = This;\r
+  Dev->ControllerHandle = ControllerHandle;\r
+\r
+  EfiAcquireLock (&mMyDeviceLock);\r
+  if (mMyDevice != NULL) {\r
+    EfiReleaseLock (&mMyDeviceLock);\r
+    //\r
+    // There is already a XenBus running, only one can be used at a time.\r
+    //\r
+    Status = EFI_ALREADY_STARTED;\r
+    goto ErrorAllocated;\r
+  }\r
+  mMyDevice = Dev;\r
+  EfiReleaseLock (&mMyDeviceLock);\r
+\r
+  Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_CALLBACK,\r
+                             NotifyExitBoot,\r
+                             (VOID*) Dev,\r
+                             &Dev->ExitBootEvent);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return EFI_SUCCESS;\r
+\r
+ErrorAllocated:\r
+  FreePool (Dev);\r
+  return Status;\r
 }\r
 \r
 /**\r
@@ -297,5 +343,11 @@ XenBusDxeDriverBindingStop (
   IN EFI_HANDLE                   *ChildHandleBuffer OPTIONAL\r
   )\r
 {\r
-  return EFI_UNSUPPORTED;\r
+  XENBUS_DEVICE *Dev = mMyDevice;\r
+\r
+  gBS->CloseEvent (Dev->ExitBootEvent);\r
+\r
+  mMyDevice = NULL;\r
+  FreePool (Dev);\r
+  return EFI_SUCCESS;\r
 }\r
index bcd9f3cef361607614708518453d525c0a38621c..d7537f3fe5ea9f153adc85640797d794f7e37ae7 100644 (file)
@@ -74,4 +74,15 @@ extern EFI_COMPONENT_NAME_PROTOCOL  gXenBusDxeComponentName;
 #define PCI_DEVICE_ID_XEN_PLATFORM       0x0001\r
 \r
 \r
+typedef struct _XENBUS_DEVICE XENBUS_DEVICE;\r
+\r
+// Have the state of the driver.\r
+#define XENBUS_DEVICE_SIGNATURE SIGNATURE_32 ('X','B','s','t')\r
+struct _XENBUS_DEVICE {\r
+  UINT32                        Signature;\r
+  EFI_DRIVER_BINDING_PROTOCOL   *This;\r
+  EFI_HANDLE                    ControllerHandle;\r
+  EFI_EVENT                     ExitBootEvent;\r
+};\r
+\r
 #endif\r