return status;
}
+NTSTATUS
+EventChannelReset(
+ VOID
+ )
+{
+ struct evtchn_reset op;
+ LONG_PTR rc;
+ NTSTATUS status;
+
+ op.dom = DOMID_SELF;
+
+ rc = EventChannelOp(EVTCHNOP_reset, &op);
+
+ if (rc < 0) {
+ ERRNO_TO_STATUS(-rc, status);
+ goto fail1;
+ }
+
+ return STATUS_SUCCESS;
+
+fail1:
+ LogError("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+EventChannelBindInterDomain(
+ IN USHORT RemoteDomain,
+ IN ULONG RemotePort,
+ OUT PULONG LocalPort
+ )
+{
+ struct evtchn_bind_interdomain op;
+ LONG_PTR rc;
+ NTSTATUS status;
+
+ op.remote_dom = RemoteDomain,
+ op.remote_port = RemotePort;
+
+ rc = EventChannelOp(EVTCHNOP_bind_interdomain, &op);
+
+ if (rc < 0) {
+ ERRNO_TO_STATUS(-rc, status);
+ goto fail1;
+ }
+
+ *LocalPort = op.local_port;
+
+ return STATUS_SUCCESS;
+
+fail1:
+ LogError("fail1 (%08x)\n", status);
+
+ return status;
+}
+
+NTSTATUS
+EventChannelQueryInterDomain(
+ IN ULONG LocalPort,
+ OUT PUSHORT RemoteDomain,
+ OUT PULONG RemotePort
+ )
+{
+ struct evtchn_status op;
+ LONG_PTR rc;
+ NTSTATUS status;
+
+ op.dom = DOMID_SELF;
+ op.port = LocalPort;
+
+ rc = EventChannelOp(EVTCHNOP_status, &op);
+
+ if (rc < 0) {
+ ERRNO_TO_STATUS(-rc, status);
+ goto fail1;
+ }
+
+ status = STATUS_INVALID_PARAMETER;
+ if (op.status != EVTCHNSTAT_interdomain)
+ goto fail2;
+
+ *RemoteDomain = op.u.interdomain.dom;
+ *RemotePort = op.u.interdomain.port;
+
+ return STATUS_SUCCESS;
+
+fail2:
+ LogError("fail2\n");
+
+fail1:
+ LogError("fail1 (%08x)\n", status);
+
+ return status;
+}
+
NTSTATUS
EventChannelAllocate(
IN ULONG Domain,
IN ULONG LocalPort
);
+NTSTATUS
+EventChannelReset(
+ VOID
+ );
+
+NTSTATUS
+EventChannelBindInterDomain(
+ IN USHORT RemoteDomain,
+ IN ULONG RemotePort,
+ OUT PULONG LocalPort
+ );
+
+NTSTATUS
+EventChannelQueryInterDomain(
+ IN ULONG LocalPort,
+ OUT PUSHORT RemoteDomain,
+ OUT PULONG RemotePort
+ );
+
NTSTATUS
EventChannelAllocate(
IN ULONG Domain,
StoreInitialize()
{
ULONGLONG Mfn;
- ULONGLONG Port;
+ ULONGLONG Value;
+ ULONG LocalPort;
+ ULONG RemotePort;
+ USHORT RemoteDomain;
PHYSICAL_ADDRESS PhysAddr;
NTSTATUS Status;
struct xenstore_domain_interface* StoreRingPtr;
InitializeListHead(&StoreContext.SubmittedList);
InitializeListHead(&StoreContext.PendingList);
- Status = HvmGetParameter(HVM_PARAM_STORE_EVTCHN, &Port);
+ Status = HvmGetParameter(HVM_PARAM_STORE_EVTCHN, &Value);
if (!NT_SUCCESS(Status))
goto fail1;
- LogVerbose("HVM_PARAM_STORE_EVTCHN = %08x\n", (ULONG)Port);
- StoreContext.Port = (evtchn_port_t)Port;
+ LocalPort = (ULONG)Value;
+
+ LogVerbose("OLD HVM_PARAM_STORE_EVTCHN = %08x\n", LocalPort);
+
+ Status = EventChannelQueryInterDomain(LocalPort,
+ &RemoteDomain,
+ &RemotePort);
+ LogTrace("EventChannelQueryInterDomain(&u) (%08x) %u:%u\n",
+ LocalPort, Status, RemoteDomain, RemotePort);
+
+ Status = EventChannelReset();
+ LogTrace("EventChannelReset() (%08x)\n", Status);
+
+ Status = EventChannelBindInterDomain(RemoteDomain,
+ RemotePort,
+ &LocalPort);
+ LogTrace("EventChannelBindInterDomain(%u:%u) (%08x) %u\n",
+ RemoteDomain, RemotePort, Status, LocalPort);
+
+ Value = LocalPort;
+ Status = HvmSetParameter(HVM_PARAM_STORE_EVTCHN, Value);
+ LogTrace("HvmSetParameter(STORE_EVTCHN, %u) (%08x)\n", Value, Status);
+
+ StoreContext.Port = (evtchn_port_t)LocalPort;
Status = HvmGetParameter(HVM_PARAM_STORE_PFN, &Mfn);
if (!NT_SUCCESS(Status))