[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [XENBUS PATCH v2 5/7] Use EMULATED v3 to force activate Xenbus FDOs
Use EmulatedIsDevicePresent in FdoSetActive to determine FDO forced- activation status and set Fdo->Active + call ConfigSetActive as appropriate. Also use EmulatedIsDevicePresent in xenfilt!DriverIsActivePresent. Signed-off-by: Tu Dinh <ngoc-tu.dinh@xxxxxxxxxx> --- src/xenbus/fdo.c | 120 +++++++++++++++++++++++++++++++------------ src/xenfilt/driver.c | 16 ++++-- 2 files changed, 99 insertions(+), 37 deletions(-) diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c index 432e907..f867511 100644 --- a/src/xenbus/fdo.c +++ b/src/xenbus/fdo.c @@ -48,6 +48,7 @@ #include "thread.h" #include "high.h" #include "mutex.h" +#include "emulated_interface.h" #include "shared_info.h" #include "evtchn.h" #include "debug.h" @@ -134,6 +135,8 @@ struct _XENBUS_FDO { PCM_PARTIAL_RESOURCE_LIST RawResourceList; PCM_PARTIAL_RESOURCE_LIST TranslatedResourceList; + XENFILT_EMULATED_INTERFACE EmulatedInterface; + BOOLEAN Active; PXENBUS_SUSPEND_CONTEXT SuspendContext; @@ -746,6 +749,8 @@ FdoSetActive( PSTR InstanceID; PSTR ActiveDeviceID; PSTR LocationInformation; + BOOLEAN Present; + LONG IsForceActivated; NTSTATUS status; status = FdoQueryId(Fdo, @@ -766,6 +771,34 @@ FdoSetActive( if (!NT_SUCCESS(status)) goto fail3; + if (Fdo->EmulatedInterface.Interface.Context == NULL) + goto fallback; + + status = XENFILT_EMULATED(Acquire, &Fdo->EmulatedInterface); + if (!NT_SUCCESS(status)) + goto fallback; + + Present = XENFILT_EMULATED(IsDevicePresent, + &Fdo->EmulatedInterface, + DeviceID, + NULL, + &IsForceActivated); + BUG_ON(!Present); + + XENFILT_EMULATED(Release, &Fdo->EmulatedInterface); + + if (IsForceActivated == 0) + goto fallback; + + Fdo->Active = IsForceActivated > 0; + Info("FDO %s force %sactivated\n", DeviceID, Fdo->Active ? "" : "de"); + + if (Fdo->Active) + (VOID) ConfigSetActive(DeviceID, InstanceID, LocationInformation); + + goto done; + +fallback: status = ConfigGetActive("DeviceID", &ActiveDeviceID); if (NT_SUCCESS(status)) { Fdo->Active = (_stricmp(DeviceID, ActiveDeviceID) == 0) ? TRUE : FALSE; @@ -780,6 +813,7 @@ FdoSetActive( Fdo->Active = TRUE; } +done: ExFreePool(LocationInformation); ExFreePool(InstanceID); ExFreePool(DeviceID); @@ -5822,10 +5856,19 @@ FdoCreate( __FdoSetName(Fdo); - status = FdoSetActive(Fdo); + status = FDO_QUERY_INTERFACE(Fdo, + XENFILT, + EMULATED, + (PINTERFACE)&Fdo->EmulatedInterface, + sizeof (Fdo->EmulatedInterface), + TRUE); if (!NT_SUCCESS(status)) goto fail9; + status = FdoSetActive(Fdo); + if (!NT_SUCCESS(status)) + goto fail10; + if (!__FdoIsActive(Fdo)) goto done; @@ -5841,47 +5884,47 @@ FdoCreate( status = DebugInitialize(Fdo, &Fdo->DebugContext); if (!NT_SUCCESS(status)) - goto fail10; + goto fail11; status = SuspendInitialize(Fdo, &Fdo->SuspendContext); if (!NT_SUCCESS(status)) - goto fail11; + goto fail12; status = SharedInfoInitialize(Fdo, &Fdo->SharedInfoContext); if (!NT_SUCCESS(status)) - goto fail12; + goto fail13; status = EvtchnInitialize(Fdo, &Fdo->EvtchnContext); if (!NT_SUCCESS(status)) - goto fail13; + goto fail14; status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext); if (!NT_SUCCESS(status)) - goto fail14; + goto fail15; status = CacheInitialize(Fdo, &Fdo->CacheContext); if (!NT_SUCCESS(status)) - goto fail15; + goto fail16; status = GnttabInitialize(Fdo, &Fdo->GnttabContext); if (!NT_SUCCESS(status)) - goto fail16; + goto fail17; status = StoreInitialize(Fdo, &Fdo->StoreContext); if (!NT_SUCCESS(status)) - goto fail17; + goto fail18; status = ConsoleInitialize(Fdo, &Fdo->ConsoleContext); if (!NT_SUCCESS(status)) - goto fail18; + goto fail19; status = UnplugInitialize(Fdo, &Fdo->UnplugContext); if (!NT_SUCCESS(status)) - goto fail19; + goto fail20; status = FdoBalloonInitialize(Fdo); if (!NT_SUCCESS(status)) - goto fail20; + goto fail21; status = DebugGetInterface(__FdoGetDebugContext(Fdo), XENBUS_DEBUG_INTERFACE_VERSION_MAX, @@ -5950,68 +5993,68 @@ done: return STATUS_SUCCESS; -fail20: - Error("fail20\n"); +fail21: + Error("fail21\n"); UnplugTeardown(Fdo->UnplugContext); Fdo->UnplugContext = NULL; -fail19: - Error("fail19\n"); +fail20: + Error("fail20\n"); ConsoleTeardown(Fdo->ConsoleContext); Fdo->ConsoleContext = NULL; -fail18: - Error("fail18\n"); +fail19: + Error("fail19\n"); StoreTeardown(Fdo->StoreContext); Fdo->StoreContext = NULL; -fail17: - Error("fail17\n"); +fail18: + Error("fail18\n"); GnttabTeardown(Fdo->GnttabContext); Fdo->GnttabContext = NULL; -fail16: - Error("fail16\n"); +fail17: + Error("fail17\n"); CacheTeardown(Fdo->CacheContext); Fdo->CacheContext = NULL; -fail15: - Error("fail15\n"); +fail16: + Error("fail16\n"); RangeSetTeardown(Fdo->RangeSetContext); Fdo->RangeSetContext = NULL; -fail14: - Error("fail14\n"); +fail15: + Error("fail15\n"); EvtchnTeardown(Fdo->EvtchnContext); Fdo->EvtchnContext = NULL; -fail13: - Error("fail13\n"); +fail14: + Error("fail14\n"); SharedInfoTeardown(Fdo->SharedInfoContext); Fdo->SharedInfoContext = NULL; -fail12: - Error("fail12\n"); +fail13: + Error("fail13\n"); SuspendTeardown(Fdo->SuspendContext); Fdo->SuspendContext = NULL; -fail11: - Error("fail11\n"); +fail12: + Error("fail12\n"); DebugTeardown(Fdo->DebugContext); Fdo->DebugContext = NULL; -fail10: - Error("fail10\n"); +fail11: + Error("fail11\n"); Fdo->UseMemoryHole = 0; @@ -6021,6 +6064,12 @@ fail10: // Fdo->Active = FALSE; +fail10: + Error("fail10\n"); + + RtlZeroMemory(&Fdo->EmulatedInterface, + sizeof (Fdo->EmulatedInterface)); + fail9: Error("fail9\n"); @@ -6159,6 +6208,9 @@ FdoDestroy( FdoClearActive(Fdo); } + RtlZeroMemory(&Fdo->EmulatedInterface, + sizeof (Fdo->EmulatedInterface)); + RtlZeroMemory(Fdo->VendorName, MAXNAMELEN); FdoReleaseLowerBusInterface(Fdo); diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c index 8f39b8d..370ee6e 100644 --- a/src/xenfilt/driver.c +++ b/src/xenfilt/driver.c @@ -321,13 +321,20 @@ DriverIsActivePresent( { PSTR ActiveDeviceID; BOOLEAN Present; + LONG IsForceActivated; NTSTATUS status; status = XENFILT_EMULATED(Acquire, &Driver.EmulatedInterface); if (!NT_SUCCESS(status)) goto fail1; - Present = FALSE; + Present = XENFILT_EMULATED(IsDevicePresent, + &Driver.EmulatedInterface, + NULL, + NULL, + &IsForceActivated); + if (NT_SUCCESS(status) && Present) + goto done; status = __DriverGetActive("DeviceID", &ActiveDeviceID); @@ -337,14 +344,17 @@ DriverIsActivePresent( Present = XENFILT_EMULATED(IsDevicePresent, &Driver.EmulatedInterface, ActiveDeviceID, - NULL); + NULL, + &IsForceActivated); ExFreePool(ActiveDeviceID); done: XENFILT_EMULATED(Release, &Driver.EmulatedInterface); - Info("ACTIVE DEVICE %sPRESENT\n", (!Present) ? "NOT " : ""); + Info("ACTIVE DEVICE %sPRESENT%s\n", + (!Present) ? "NOT " : "", + IsForceActivated > 0 ? " (FORCED)" : ""); return Present; -- 2.50.1.windows.1 Ngoc Tu Dinh | Vates XCP-ng Developer XCP-ng & Xen Orchestra - Vates solutions web: https://vates.tech
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |