return DoneSomething;
}
+VOID
+EvtchnReset(
+ VOID
+ )
+{
+ ULONGLONG Value;
+ XENBUS_EVTCHN_CHANNEL Store;
+ XENBUS_EVTCHN_CHANNEL Console;
+ NTSTATUS status;
+
+ //
+ // When we reset the event channel ABI we will lose our
+ // binding to the any event channel which was set up
+ // by the toolstack during domain build.
+ // We need to get the binding back, so we must query the
+ // remote domain and port, and then re-bind after the
+ // reset.
+ //
+
+ RtlZeroMemory(&Store, sizeof (Store));
+ RtlZeroMemory(&Console, sizeof (Console));
+
+ status = HvmGetParam(HVM_PARAM_STORE_EVTCHN, &Value);
+ if (NT_SUCCESS(status))
+ Store.LocalPort = (ULONG)Value;
+
+ status = HvmGetParam(HVM_PARAM_CONSOLE_EVTCHN, &Value);
+ if (NT_SUCCESS(status))
+ Console.LocalPort = (ULONG)Value;
+
+ if (Store.LocalPort != 0) {
+ domid_t RemoteDomain;
+ evtchn_port_t RemotePort;
+
+ status = EventChannelQueryInterDomain(Store.LocalPort,
+ &RemoteDomain,
+ &RemotePort);
+ ASSERT(NT_SUCCESS(status));
+
+ Store.Parameters.InterDomain.RemoteDomain = RemoteDomain;
+ Store.Parameters.InterDomain.RemotePort = RemotePort;
+
+ LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: STORE (%u) -> (%u:%u)\n",
+ Store.LocalPort,
+ RemoteDomain,
+ RemotePort);
+ }
+
+ if (Console.LocalPort != 0) {
+ domid_t RemoteDomain;
+ evtchn_port_t RemotePort;
+
+ status = EventChannelQueryInterDomain(Console.LocalPort,
+ &RemoteDomain,
+ &RemotePort);
+ ASSERT(NT_SUCCESS(status));
+
+ Console.Parameters.InterDomain.RemoteDomain = RemoteDomain;
+ Console.Parameters.InterDomain.RemotePort = RemotePort;
+
+ LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: CONSOLE (%u) -> (%u:%u)\n",
+ Console.LocalPort,
+ RemoteDomain,
+ RemotePort);
+ }
+
+ (VOID) EventChannelReset();
+ LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: RESET\n");
+
+ if (Store.LocalPort != 0) {
+ domid_t RemoteDomain;
+ evtchn_port_t RemotePort;
+
+ RemoteDomain = Store.Parameters.InterDomain.RemoteDomain;
+ RemotePort = Store.Parameters.InterDomain.RemotePort;
+
+ status = EventChannelBindInterDomain(RemoteDomain,
+ RemotePort,
+ &Store.LocalPort);
+ ASSERT(NT_SUCCESS(status));
+
+ status = HvmSetParam(HVM_PARAM_STORE_EVTCHN, Store.LocalPort);
+ ASSERT(NT_SUCCESS(status));
+
+ LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: STORE (%u:%u) -> %u\n",
+ RemoteDomain,
+ RemotePort,
+ Store.LocalPort);
+ }
+
+ if (Console.LocalPort != 0) {
+ domid_t RemoteDomain;
+ evtchn_port_t RemotePort;
+
+ RemoteDomain = Console.Parameters.InterDomain.RemoteDomain;
+ RemotePort = Console.Parameters.InterDomain.RemotePort;
+
+ status = EventChannelBindInterDomain(RemoteDomain,
+ RemotePort,
+ &Console.LocalPort);
+ ASSERT(NT_SUCCESS(status));
+
+ status = HvmSetParam(HVM_PARAM_CONSOLE_EVTCHN, Console.LocalPort);
+ ASSERT(NT_SUCCESS(status));
+
+ LogPrintf(LOG_LEVEL_INFO, "EVTCHN_RESET: CONSOLE (%u:%u) -> %u\n",
+ RemoteDomain,
+ RemotePort,
+ Console.LocalPort);
+ }
+}
+
+
+
static NTSTATUS
EvtchnAbiAcquire(
IN PXENBUS_EVTCHN_CONTEXT Context
EvtchnFifoPortMask(_Context, Port);
}
-static VOID
-EvtchnFifoReset(
- IN PXENBUS_EVTCHN_FIFO_CONTEXT Context
- )
-{
- ULONGLONG Value;
- ULONG LocalPort;
- ULONG RemotePort;
- USHORT RemoteDomain;
- NTSTATUS status;
-
- UNREFERENCED_PARAMETER(Context);
-
- status = HvmGetParam(HVM_PARAM_STORE_EVTCHN, &Value);
- ASSERT(NT_SUCCESS(status));
-
- LocalPort = (LONG)Value;
-
- //
- // When we reset the event channel ABI we will lose our
- // binding to the STORE event channel, which was set up
- // by the toolstack during domain build.
- // We need to get the binding back, so we must query the
- // remote domain and port, and then re-bind after the
- // reset.
- //
-
- status = EventChannelQueryInterDomain(LocalPort,
- &RemoteDomain,
- &RemotePort);
- ASSERT(NT_SUCCESS(status));
-
- LogPrintf(LOG_LEVEL_INFO, "EVTCHN_FIFO: RESET\n");
- (VOID) EventChannelReset();
-
- status = EventChannelBindInterDomain(RemoteDomain,
- RemotePort,
- &LocalPort);
- ASSERT(NT_SUCCESS(status));
-
- Value = LocalPort;
-
- status = HvmSetParam(HVM_PARAM_STORE_EVTCHN, Value);
- ASSERT(NT_SUCCESS(status));
-}
-
static NTSTATUS
EvtchnFifoAcquire(
IN PXENBUS_EVTCHN_ABI_CONTEXT _Context
fail1:
Error("fail1 (%08x)\n", status);
- (VOID) EventChannelReset();
+ EvtchnReset();
while (--Index >= 0) {
unsigned int vcpu_id;
Trace("====>\n");
- EvtchnFifoReset(Context);
+ EvtchnReset();
EvtchnFifoContract(Context);