From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH v2 03/18] OvmfPkg/XenBusDxe: Add device state struct and create an ExitBoot services event. Date: Wed, 10 Sep 2014 15:58:16 -0400 Message-ID: <20140910195816.GD3556@laptop.dumpdata.com> References: <1409849473-9268-1-git-send-email-anthony.perard@citrix.com> <1409849473-9268-4-git-send-email-anthony.perard@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Content-Disposition: inline In-Reply-To: <1409849473-9268-4-git-send-email-anthony.perard@citrix.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Anthony PERARD Cc: EDK2 devel , Xen Devel List-Id: xen-devel@lists.xenproject.org On Thu, Sep 04, 2014 at 05:50:58PM +0100, Anthony PERARD wrote: > The ExitBoot event is used to disconnect from the device before the > next operating system start using them. > > Contributed-under: TianoCore Contribution Agreement 1.0 > Signed-off-by: Anthony PERARD > --- > OvmfPkg/XenBusDxe/XenBusDxe.c | 38 ++++++++++++++++++++++++++++++++++++-- > OvmfPkg/XenBusDxe/XenBusDxe.h | 11 +++++++++++ > 2 files changed, 47 insertions(+), 2 deletions(-) > > diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.c b/OvmfPkg/XenBusDxe/XenBusDxe.c > index a272204..e125ed7 100644 > --- a/OvmfPkg/XenBusDxe/XenBusDxe.c > +++ b/OvmfPkg/XenBusDxe/XenBusDxe.c > @@ -59,6 +59,8 @@ EFI_DRIVER_BINDING_PROTOCOL gXenBusDxeDriverBinding = { > }; > > > +XENBUS_DEVICE *mMyDevice; > + > /** > Unloads an image. > > @@ -232,6 +234,19 @@ XenBusDxeDriverBindingSupported ( > return Status; > } > > +VOID > +EFIAPI > +NotifyExitBoot ( > + IN EFI_EVENT Event, > + IN VOID *Context > + ) > +{ > + XENBUS_DEVICE *Dev = Context; > + > + gBS->DisconnectController(Dev->ControllerHandle, > + Dev->This->DriverBindingHandle, NULL); > +} > + > /** > Starts a bus controller. > > @@ -275,7 +290,22 @@ XenBusDxeDriverBindingStart ( > IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL > ) > { > - return EFI_UNSUPPORTED; > + EFI_STATUS Status; > + XENBUS_DEVICE *Dev; > + > + Dev = AllocateZeroPool (sizeof (*Dev)); > + Dev->Signature = XENBUS_DEVICE_SIGNATURE; > + Dev->This = This; > + Dev->ControllerHandle = ControllerHandle; > + > + Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_CALLBACK, > + NotifyExitBoot, > + (VOID*) Dev, > + &Dev->ExitBootEvent); > + ASSERT_EFI_ERROR (Status); > + > + mMyDevice = Dev; > + return EFI_SUCCESS; > } > > /** > @@ -313,5 +343,9 @@ XenBusDxeDriverBindingStop ( > IN EFI_HANDLE *ChildHandleBuffer OPTIONAL > ) > { > - return EFI_UNSUPPORTED; > + XENBUS_DEVICE *Dev = mMyDevice; > + > + gBS->CloseEvent (Dev->ExitBootEvent); > + Don't want: mMyDevice = NULL; Not that it matters much, but more of a helper in case somebody does try to use 'myDevice' during shutdown/cleanup. > + return EFI_SUCCESS; > } > diff --git a/OvmfPkg/XenBusDxe/XenBusDxe.h b/OvmfPkg/XenBusDxe/XenBusDxe.h > index 4c11f60..9e4860a 100644 > --- a/OvmfPkg/XenBusDxe/XenBusDxe.h > +++ b/OvmfPkg/XenBusDxe/XenBusDxe.h > @@ -90,4 +90,15 @@ extern EFI_COMPONENT_NAME_PROTOCOL gXenBusDxeComponentName; > #define PCI_DEVICE_ID_XEN_PLATFORM 0x0001 > > > +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_EVENT ExitBootEvent; > +}; > + > #endif > -- > Anthony PERARD > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel