PXENBUS_EVTCHN_CHANNEL Channel;
ULONG Events;
ULONG Dpcs;
+ XENBUS_GNTTAB_INTERFACE GnttabInterface;
XENBUS_EVTCHN_INTERFACE EvtchnInterface;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
XENBUS_DEBUG_INTERFACE DebugInterface;
- PXENBUS_SUSPEND_CALLBACK SuspendCallbackEarly;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
PXENBUS_DEBUG_CALLBACK DebugCallback;
BOOLEAN Enabled;
Context->Dpcs++;
}
-static PHYSICAL_ADDRESS
+static
ConsoleGetAddress(
- PXENBUS_CONSOLE_CONTEXT Context
+ IN PXENBUS_CONSOLE_CONTEXT Context,
+ OUT PPHYSICAL_ADDRESS Address
)
{
- PHYSICAL_ADDRESS Address;
- NTSTATUS status;
-
- UNREFERENCED_PARAMETER(Context);
+ PFN_NUMBER Pfn;
+ NTSTATUS status;
- status = HvmGetParam(HVM_PARAM_CONSOLE_PFN,
- (PULONGLONG)&Address.QuadPart);
- ASSERT(NT_SUCCESS(status));
+ status = XENBUS_GNTTAB(QueryReference,
+ &Context->GnttabInterface,
+ XENBUS_GNTTAB_CONSOLE_REFERENCE,
+ &Pfn,
+ NULL);
+ if (!NT_SUCCESS(status))
+ goto fail1;
- Address.QuadPart <<= PAGE_SHIFT;
+ Address->QuadPart = Pfn << PAGE_SHIFT;
LogPrintf(LOG_LEVEL_INFO,
"CONSOLE: PAGE @ %08x.%08x\n",
- Address.HighPart,
- Address.LowPart);
+ Address->HighPart,
+ Address->LowPart);
- return Address;
-}
+ return STATUS_SUCCESS;
-static VOID
-ConsoleSuspendCallbackEarly(
- IN PVOID Argument
- )
-{
- PXENBUS_CONSOLE_CONTEXT Context = Argument;
- PHYSICAL_ADDRESS Address;
+fail1:
+ Error("fail1 (%08x)\n", status);
- Address = ConsoleGetAddress(Context);
- ASSERT3U(Address.QuadPart, ==, Context->Address.QuadPart);
+ return status;
}
static VOID
PXENBUS_CONSOLE_CONTEXT Context = Argument;
struct xencons_interface *Shared;
KIRQL Irql;
+ PHYSICAL_ADDRESS Address;
+ NTSTATUS status;
+
+ status = ConsoleGetAddress(Context, &Address);
+ ASSERT3U(Address.QuadPart, ==, Context->Address.QuadPart);
Shared = Context->Shared;
{
PXENBUS_CONSOLE_CONTEXT Context = Interface->Context;
KIRQL Irql;
+ PHYSICAL_ADDRESS Address;
NTSTATUS status;
KeAcquireSpinLock(&Context->Lock, &Irql);
Trace("====>\n");
- Context->Address = ConsoleGetAddress(Context);
+ status = XENBUS_GNTTAB(Acquire, &Context->GnttabInterface);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = ConsoleGetAddress(Context, &Address);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Context->Address = Address;
Context->Shared = (struct xencons_interface *)MmMapIoSpace(Context->Address,
PAGE_SIZE,
MmCached);
status = STATUS_UNSUCCESSFUL;
if (Context->Shared == NULL)
- goto fail1;
+ goto fail3;
status = XENBUS_EVTCHN(Acquire, &Context->EvtchnInterface);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail4;
ConsoleEnable(Context);
status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
if (!NT_SUCCESS(status))
- goto fail3;
-
- status = XENBUS_SUSPEND(Register,
- &Context->SuspendInterface,
- SUSPEND_CALLBACK_EARLY,
- ConsoleSuspendCallbackEarly,
- Context,
- &Context->SuspendCallbackEarly);
- if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail5;
status = XENBUS_SUSPEND(Register,
&Context->SuspendInterface,
Context,
&Context->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail6;
status = XENBUS_DEBUG(Acquire, &Context->DebugInterface);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail7;
status = XENBUS_DEBUG(Register,
&Context->DebugInterface,
Context,
&Context->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail8;
Trace("<====\n");
return STATUS_SUCCESS;
-fail7:
- Error("fail7\n");
+fail8:
+ Error("fail8\n");
XENBUS_DEBUG(Release, &Context->DebugInterface);
-fail6:
- Error("fail6\n");
+fail7:
+ Error("fail7\n");
XENBUS_SUSPEND(Deregister,
&Context->SuspendInterface,
Context->SuspendCallbackLate);
Context->SuspendCallbackLate = NULL;
+fail6:
+ Error("fail6\n");
+
+ XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
fail5:
Error("fail5\n");
- XENBUS_SUSPEND(Deregister,
- &Context->SuspendInterface,
- Context->SuspendCallbackEarly);
- Context->SuspendCallbackEarly = NULL;
+ ConsoleDisable(Context);
+
+ XENBUS_EVTCHN(Release, &Context->EvtchnInterface);
fail4:
Error("fail4\n");
- XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+ MmUnmapIoSpace(Context->Shared, PAGE_SIZE);
+ Context->Shared = NULL;
fail3:
Error("fail3\n");
- ConsoleDisable(Context);
-
- XENBUS_EVTCHN(Release, &Context->EvtchnInterface);
+ Context->Address.QuadPart = 0;
fail2:
Error("fail2\n");
- MmUnmapIoSpace(Context->Shared, PAGE_SIZE);
- Context->Shared = NULL;
+ XENBUS_GNTTAB(Release, &Context->GnttabInterface);
fail1:
Error("fail1 (%08x)\n", status);
Context->SuspendCallbackLate);
Context->SuspendCallbackLate = NULL;
- XENBUS_SUSPEND(Deregister,
- &Context->SuspendInterface,
- Context->SuspendCallbackEarly);
- Context->SuspendCallbackEarly = NULL;
-
XENBUS_SUSPEND(Release, &Context->SuspendInterface);
ConsoleDisable(Context);
Context->Address.QuadPart = 0;
+ XENBUS_GNTTAB(Release, &Context->GnttabInterface);
+
Trace("<====\n");
done:
if (*Context == NULL)
goto fail1;
+ status = GnttabGetInterface(FdoGetGnttabContext(Fdo),
+ XENBUS_GNTTAB_INTERFACE_VERSION_MAX,
+ (PINTERFACE)&(*Context)->GnttabInterface,
+ sizeof ((*Context)->GnttabInterface));
+ ASSERT(NT_SUCCESS(status));
+ ASSERT((*Context)->GnttabInterface.Interface.Context != NULL);
+
status = EvtchnGetInterface(FdoGetEvtchnContext(Fdo),
XENBUS_EVTCHN_INTERFACE_VERSION_MAX,
(PINTERFACE)&(*Context)->EvtchnInterface,
RtlZeroMemory(&Context->EvtchnInterface,
sizeof (XENBUS_EVTCHN_INTERFACE));
+ RtlZeroMemory(&Context->GnttabInterface,
+ sizeof (XENBUS_GNTTAB_INTERFACE));
+
ASSERT(IsZeroMemory(Context, sizeof (XENBUS_CONSOLE_CONTEXT)));
__ConsoleFree(Context);
if (!NT_SUCCESS(status))
goto fail12;
- status = StoreInitialize(Fdo, &Fdo->StoreContext);
+ status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
if (!NT_SUCCESS(status))
goto fail13;
- status = ConsoleInitialize(Fdo, &Fdo->ConsoleContext);
+ status = CacheInitialize(Fdo, &Fdo->CacheContext);
if (!NT_SUCCESS(status))
goto fail14;
- status = RangeSetInitialize(Fdo, &Fdo->RangeSetContext);
+ status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
if (!NT_SUCCESS(status))
goto fail15;
- status = CacheInitialize(Fdo, &Fdo->CacheContext);
+ status = StoreInitialize(Fdo, &Fdo->StoreContext);
if (!NT_SUCCESS(status))
goto fail16;
- status = GnttabInitialize(Fdo, &Fdo->GnttabContext);
+ status = ConsoleInitialize(Fdo, &Fdo->ConsoleContext);
if (!NT_SUCCESS(status))
goto fail17;
ASSERT(NT_SUCCESS(status));
ASSERT(Fdo->EvtchnInterface.Interface.Context != NULL);
+ status = RangeSetGetInterface(__FdoGetRangeSetContext(Fdo),
+ XENBUS_RANGE_SET_INTERFACE_VERSION_MAX,
+ (PINTERFACE)&Fdo->RangeSetInterface,
+ sizeof (Fdo->RangeSetInterface));
+ ASSERT(NT_SUCCESS(status));
+ ASSERT(Fdo->RangeSetInterface.Interface.Context != NULL);
+
status = StoreGetInterface(__FdoGetStoreContext(Fdo),
XENBUS_STORE_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->StoreInterface,
ASSERT(NT_SUCCESS(status));
ASSERT(Fdo->ConsoleInterface.Interface.Context != NULL);
- status = RangeSetGetInterface(__FdoGetRangeSetContext(Fdo),
- XENBUS_RANGE_SET_INTERFACE_VERSION_MAX,
- (PINTERFACE)&Fdo->RangeSetInterface,
- sizeof (Fdo->RangeSetInterface));
- ASSERT(NT_SUCCESS(status));
- ASSERT(Fdo->RangeSetInterface.Interface.Context != NULL);
-
status = BalloonGetInterface(__FdoGetBalloonContext(Fdo),
XENBUS_BALLOON_INTERFACE_VERSION_MAX,
(PINTERFACE)&Fdo->BalloonInterface,
fail18:
Error("fail18\n");
- GnttabTeardown(Fdo->GnttabContext);
- Fdo->GnttabContext = NULL;
+ ConsoleTeardown(Fdo->ConsoleContext);
+ Fdo->ConsoleContext = NULL;
fail17:
Error("fail17\n");
- CacheTeardown(Fdo->CacheContext);
- Fdo->CacheContext = NULL;
+ StoreTeardown(Fdo->StoreContext);
+ Fdo->StoreContext = NULL;
fail16:
Error("fail16\n");
- RangeSetTeardown(Fdo->RangeSetContext);
- Fdo->RangeSetContext = NULL;
+ GnttabTeardown(Fdo->GnttabContext);
+ Fdo->GnttabContext = NULL;
fail15:
Error("fail15\n");
- ConsoleTeardown(Fdo->ConsoleContext);
- Fdo->ConsoleContext = NULL;
+ CacheTeardown(Fdo->CacheContext);
+ Fdo->CacheContext = NULL;
fail14:
Error("fail14\n");
- StoreTeardown(Fdo->StoreContext);
- Fdo->StoreContext = NULL;
+ RangeSetTeardown(Fdo->RangeSetContext);
+ Fdo->RangeSetContext = NULL;
fail13:
Error("fail13\n");
RtlZeroMemory(&Fdo->BalloonInterface,
sizeof (XENBUS_BALLOON_INTERFACE));
- RtlZeroMemory(&Fdo->RangeSetInterface,
- sizeof (XENBUS_RANGE_SET_INTERFACE));
-
RtlZeroMemory(&Fdo->ConsoleInterface,
sizeof (XENBUS_CONSOLE_INTERFACE));
RtlZeroMemory(&Fdo->StoreInterface,
sizeof (XENBUS_STORE_INTERFACE));
+ RtlZeroMemory(&Fdo->RangeSetInterface,
+ sizeof (XENBUS_RANGE_SET_INTERFACE));
+
RtlZeroMemory(&Fdo->EvtchnInterface,
sizeof (XENBUS_EVTCHN_INTERFACE));
UnplugTeardown(Fdo->UnplugContext);
Fdo->UnplugContext = NULL;
+ ConsoleTeardown(Fdo->ConsoleContext);
+ Fdo->ConsoleContext = NULL;
+
+ StoreTeardown(Fdo->StoreContext);
+ Fdo->StoreContext = NULL;
+
GnttabTeardown(Fdo->GnttabContext);
Fdo->GnttabContext = NULL;
RangeSetTeardown(Fdo->RangeSetContext);
Fdo->RangeSetContext = NULL;
- ConsoleTeardown(Fdo->ConsoleContext);
- Fdo->ConsoleContext = NULL;
-
- StoreTeardown(Fdo->StoreContext);
- Fdo->StoreContext = NULL;
-
EvtchnTeardown(Fdo->EvtchnContext);
Fdo->EvtchnContext = NULL;
PXENBUS_EVTCHN_CHANNEL Channel;
XENBUS_SUSPEND_INTERFACE SuspendInterface;
XENBUS_DEBUG_INTERFACE DebugInterface;
+ XENBUS_GNTTAB_INTERFACE GnttabInterface;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackEarly;
PXENBUS_SUSPEND_CALLBACK SuspendCallbackLate;
PXENBUS_DEBUG_CALLBACK DebugCallback;
Context->Dpcs++;
}
-static PHYSICAL_ADDRESS
+static
StoreGetAddress(
- PXENBUS_STORE_CONTEXT Context
+ IN PXENBUS_STORE_CONTEXT Context,
+ OUT PPHYSICAL_ADDRESS Address
)
{
- PHYSICAL_ADDRESS Address;
- NTSTATUS status;
-
- UNREFERENCED_PARAMETER(Context);
+ PFN_NUMBER Pfn;
+ NTSTATUS status;
- status = HvmGetParam(HVM_PARAM_STORE_PFN,
- (PULONGLONG)&Address.QuadPart);
- ASSERT(NT_SUCCESS(status));
+ status = XENBUS_GNTTAB(QueryReference,
+ &Context->GnttabInterface,
+ XENBUS_GNTTAB_STORE_REFERENCE,
+ &Pfn,
+ NULL);
+ if (!NT_SUCCESS(status))
+ goto fail1;
- Address.QuadPart <<= PAGE_SHIFT;
+ Address->QuadPart = Pfn << PAGE_SHIFT;
LogPrintf(LOG_LEVEL_INFO,
"STORE: PAGE @ %08x.%08x\n",
- Address.HighPart,
- Address.LowPart);
+ Address->HighPart,
+ Address->LowPart);
+
+ return STATUS_SUCCESS;
- return Address;
+fail1:
+ Error("fail1 (%08x)\n", status);
+
+ return status;
}
static VOID
{
PXENBUS_STORE_CONTEXT Context = Argument;
PLIST_ENTRY ListEntry;
- PHYSICAL_ADDRESS Address;
-
- Address = StoreGetAddress(Context);
- ASSERT3U(Address.QuadPart, ==, Context->Address.QuadPart);
for (ListEntry = Context->TransactionList.Flink;
ListEntry != &(Context->TransactionList);
)
{
PXENBUS_STORE_CONTEXT Context = Argument;
- struct xenstore_domain_interface *Shared;
PLIST_ENTRY ListEntry;
KIRQL Irql;
-
- Shared = Context->Shared;
+ PHYSICAL_ADDRESS Address;
+ NTSTATUS status;
KeAcquireSpinLock(&Context->Lock, &Irql);
+ status = StoreGetAddress(Context, &Address);
+ ASSERT(NT_SUCCESS(status));
+ ASSERT3U(Address.QuadPart, ==, Context->Address.QuadPart);
+
StoreDisable(Context);
StoreResetResponse(Context);
StoreEnable(Context);
Context->Address.LowPart);
if (!Crashing) {
- struct xenstore_domain_interface *Shared;
+ struct xenstore_domain_interface *Shared;
Shared = Context->Shared;
{
PXENBUS_STORE_CONTEXT Context = Interface->Context;
KIRQL Irql;
+ PHYSICAL_ADDRESS Address;
NTSTATUS status;
KeAcquireSpinLock(&Context->Lock, &Irql);
Trace("====>\n");
- Context->Address = StoreGetAddress(Context);
+ status = XENBUS_GNTTAB(Acquire, &Context->GnttabInterface);
+ if (!NT_SUCCESS(status))
+ goto fail1;
+
+ status = StoreGetAddress(Context, &Address);
+ if (!NT_SUCCESS(status))
+ goto fail2;
+
+ Context->Address = Address;
Context->Shared = (struct xenstore_domain_interface *)MmMapIoSpace(Context->Address,
PAGE_SIZE,
MmCached);
status = STATUS_UNSUCCESSFUL;
if (Context->Shared == NULL)
- goto fail1;
+ goto fail3;
status = XENBUS_EVTCHN(Acquire, &Context->EvtchnInterface);
if (!NT_SUCCESS(status))
- goto fail2;
+ goto fail4;
StoreResetResponse(Context);
StoreEnable(Context);
status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
if (!NT_SUCCESS(status))
- goto fail3;
+ goto fail5;
status = XENBUS_SUSPEND(Register,
&Context->SuspendInterface,
Context,
&Context->SuspendCallbackEarly);
if (!NT_SUCCESS(status))
- goto fail4;
+ goto fail6;
status = XENBUS_SUSPEND(Register,
&Context->SuspendInterface,
Context,
&Context->SuspendCallbackLate);
if (!NT_SUCCESS(status))
- goto fail5;
+ goto fail7;
status = XENBUS_DEBUG(Acquire, &Context->DebugInterface);
if (!NT_SUCCESS(status))
- goto fail6;
+ goto fail8;
status = XENBUS_DEBUG(Register,
&Context->DebugInterface,
Context,
&Context->DebugCallback);
if (!NT_SUCCESS(status))
- goto fail7;
+ goto fail9;
Trace("<====\n");
return STATUS_SUCCESS;
-fail7:
- Error("fail7\n");
+fail9:
+ Error("fail9\n");
XENBUS_DEBUG(Release, &Context->DebugInterface);
-fail6:
- Error("fail6\n");
+fail8:
+ Error("fail8\n");
XENBUS_SUSPEND(Deregister,
&Context->SuspendInterface,
Context->SuspendCallbackLate);
Context->SuspendCallbackLate = NULL;
-fail5:
- Error("fail5\n");
+fail7:
+ Error("fail7\n");
XENBUS_SUSPEND(Deregister,
&Context->SuspendInterface,
Context->SuspendCallbackEarly);
Context->SuspendCallbackEarly = NULL;
-fail4:
- Error("fail4\n");
+fail6:
+ Error("fail6\n");
XENBUS_SUSPEND(Release, &Context->SuspendInterface);
-fail3:
- Error("fail3\n");
+fail5:
+ Error("fail5\n");
StoreDisable(Context);
RtlZeroMemory(&Context->Response, sizeof (XENBUS_STORE_RESPONSE));
XENBUS_EVTCHN(Release, &Context->EvtchnInterface);
-fail2:
- Error("fail2\n");
+fail4:
+ Error("fail4\n");
MmUnmapIoSpace(Context->Shared, PAGE_SIZE);
Context->Shared = NULL;
+fail3:
+ Error("fail3\n");
+
+ Context->Address.QuadPart = 0;
+
+fail2:
+ Error("fail2\n");
+
+ XENBUS_GNTTAB(Release, &Context->GnttabInterface);
+
fail1:
Error("fail1 (%08x)\n", status);
Context->Address.QuadPart = 0;
+ XENBUS_GNTTAB(Release, &Context->GnttabInterface);
+
Trace("<====\n");
done:
if (*Context == NULL)
goto fail1;
+ status = GnttabGetInterface(FdoGetGnttabContext(Fdo),
+ XENBUS_GNTTAB_INTERFACE_VERSION_MAX,
+ (PINTERFACE)&(*Context)->GnttabInterface,
+ sizeof ((*Context)->GnttabInterface));
+ ASSERT(NT_SUCCESS(status));
+ ASSERT((*Context)->GnttabInterface.Interface.Context != NULL);
+
status = EvtchnGetInterface(FdoGetEvtchnContext(Fdo),
XENBUS_EVTCHN_INTERFACE_VERSION_MAX,
(PINTERFACE)&(*Context)->EvtchnInterface,
RtlZeroMemory(&(*Context)->EvtchnInterface,
sizeof (XENBUS_EVTCHN_INTERFACE));
+ RtlZeroMemory(&(*Context)->GnttabInterface,
+ sizeof (XENBUS_GNTTAB_INTERFACE));
+
ASSERT(IsZeroMemory(*Context, sizeof (XENBUS_STORE_CONTEXT)));
__StoreFree(*Context);
RtlZeroMemory(&Context->EvtchnInterface,
sizeof (XENBUS_EVTCHN_INTERFACE));
+ RtlZeroMemory(&Context->GnttabInterface,
+ sizeof (XENBUS_GNTTAB_INTERFACE));
+
ASSERT(IsZeroMemory(Context, sizeof (XENBUS_STORE_CONTEXT)));
__StoreFree(Context);