[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [win-pv-devel] [PATCH 2/3] Attempt to reset event channel ABI to 2-Layer
Signed-off-by: Owen Smith <owen.smith@xxxxxxxxxx> --- src/xencrsh/evtchn.c | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/xencrsh/evtchn.h | 19 +++++++++++ src/xencrsh/store.c | 33 +++++++++++++++--- 3 files changed, 144 insertions(+), 4 deletions(-) diff --git a/src/xencrsh/evtchn.c b/src/xencrsh/evtchn.c index b0b5b93..ecf100b 100644 --- a/src/xencrsh/evtchn.c +++ b/src/xencrsh/evtchn.c @@ -87,6 +87,102 @@ fail1: } 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, OUT PULONG LocalPort diff --git a/src/xencrsh/evtchn.h b/src/xencrsh/evtchn.h index 2fa3812..9540bd8 100644 --- a/src/xencrsh/evtchn.h +++ b/src/xencrsh/evtchn.h @@ -42,6 +42,25 @@ EventChannelSend( ); 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, OUT PULONG LocalPort diff --git a/src/xencrsh/store.c b/src/xencrsh/store.c index d474d5e..163dcc5 100644 --- a/src/xencrsh/store.c +++ b/src/xencrsh/store.c @@ -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)) -- 1.9.4.msysgit.1 _______________________________________________ win-pv-devel mailing list win-pv-devel@xxxxxxxxxxxxxxxxxxxx http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |