]> xenbits.xensource.com Git - pvdrivers/win/xenvbd.git/commitdiff
Attempt to reset event channel ABI to 2-Layer
authorOwen Smith <owen.smith@citrix.com>
Wed, 25 Feb 2015 15:05:11 +0000 (15:05 +0000)
committerPaul Durrant <paul.durrant@citrix.com>
Wed, 25 Feb 2015 15:21:29 +0000 (15:21 +0000)
Signed-off-by: Owen Smith <owen.smith@citrix.com>
src/xencrsh/evtchn.c
src/xencrsh/evtchn.h
src/xencrsh/store.c

index b0b5b93b855671f99c5877bff7dde975eb1ef5d7..ecf100b5ecaac7782999234a113541720c9273b0 100644 (file)
@@ -86,6 +86,102 @@ fail1:
     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,
index 2fa3812c66e47b1fa63d2df1b3218ce0c1c6c860..9540bd854dc2c4058ec46a40459b790e69e844f9 100644 (file)
@@ -41,6 +41,25 @@ EventChannelSend(
     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,
index d474d5e92670a66291ff6aefd267148280b28c43..04051bdb59d99c0dfad2f23fb7ec14cc92fcf815 100644 (file)
@@ -1063,7 +1063,10 @@ NTSTATUS
 StoreInitialize()
 {
     ULONGLONG                   Mfn;
-    ULONGLONG                   Port;
+    ULONGLONG                   Value;
+    ULONG                       LocalPort;
+    ULONG                       RemotePort;
+    USHORT                      RemoteDomain;
     PHYSICAL_ADDRESS            PhysAddr;
     NTSTATUS                    Status;
     struct xenstore_domain_interface*  StoreRingPtr;
@@ -1071,12 +1074,34 @@ StoreInitialize()
     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))