From win-pv-devel-bounces@lists.xenproject.org Tue Dec 01 10:22:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 01 Dec 2015 10:22:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a3i56-0003XH-Rl; Tue, 01 Dec 2015 10:22:44 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=770a6c7bd=Paul.Durrant@citrix.com>)
	id 1a3i55-0003XC-Ih
	for win-pv-devel@lists.xenproject.org; Tue, 01 Dec 2015 10:22:43 +0000
Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id
	A1/FF-24494-2F47D565; Tue, 01 Dec 2015 10:22:42 +0000
X-Env-Sender: prvs=770a6c7bd=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-206.messagelabs.com!1448964997!7801683!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8284 invoked from network); 1 Dec 2015 10:16:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Dec 2015 10:16:38 -0000
X-IronPort-AV: E=Sophos;i="5.20,368,1444694400"; 
   d="scan'208";a="8922417"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Ian Campbell <Ian.Campbell@citrix.com>, Andrew Cooper
	<Andrew.Cooper3@citrix.com>, Ian Jackson <Ian.Jackson@citrix.com>
Thread-Topic: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping
	into libxenforeignmemory
Thread-Index: AQHRKTe7lSwDG6vubkG1wt5RSiVjhZ6wFH6AgAKvZYCAAYJrAIABp5XA
Date: Tue, 1 Dec 2015 10:16:36 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F69EF09@AMSPEX01CL01.citrite.net>
References: <1447070397.27774.11.camel@citrix.com>
	<1447070458-31104-1-git-send-email-ian.campbell@citrix.com>
	<1447070458-31104-14-git-send-email-ian.campbell@citrix.com>
	<22083.23332.222797.887453@mariner.uk.xensource.com>
	<1447428109.18450.188.camel@citrix.com>
	<22086.340.522438.701042@mariner.uk.xensource.com>
	<1448644706.13576.138.camel@citrix.com> <56589777.3000601@citrix.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F69D32F@AMSPEX01CL01.citrite.net>
	<1448877118.15768.11.camel@citrix.com>
In-Reply-To: <1448877118.15768.11.camel@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Wei Liu <wei.liu2@citrix.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [win-pv-devel] [PATCH XEN v5 13/23] tools: Refactor foreign
 memory mapping into libxenforeignmemory
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBJYW4gQ2FtcGJlbGwgW21haWx0
bzppYW4uY2FtcGJlbGxAY2l0cml4LmNvbV0NCj4gU2VudDogMzAgTm92ZW1iZXIgMjAxNSAwOTo1
Mg0KPiBUbzogUGF1bCBEdXJyYW50OyBBbmRyZXcgQ29vcGVyOyBJYW4gSmFja3Nvbg0KPiBDYzog
V2VpIExpdTsgeGVuLWRldmVsQGxpc3RzLnhlbi5vcmc7IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5w
cm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW1BBVENIIFhFTiB2NSAxMy8yM10gdG9vbHM6IFJl
ZmFjdG9yIGZvcmVpZ24gbWVtb3J5IG1hcHBpbmcNCj4gaW50byBsaWJ4ZW5mb3JlaWdubWVtb3J5
DQo+IA0KPiBPbiBTdW4sIDIwMTUtMTEtMjkgYXQgMDk6NTQgKzAwMDAsIFBhdWwgRHVycmFudCB3
cm90ZToNCj4gPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4gW3NuaXBdDQo+ID4g
PiA+IEM5OSB3YXMgMTYgeWVhcnMgYWdvIG5vdywgSSdtIHN0cnVnZ2xpbmcgdG8gdGhpbmsgb2Yg
YSByZWFzb24gbm90IHRvDQo+ID4gPiA+IG1vdmUNCj4gPiA+ID4gdGhlIGJhc2VsaW5lIGZvciB0
b29scyBzdHVmZiBhdCBsZWFzdCB0byB0aGF0Lg0KPiA+ID4gPg0KPiA+ID4gPiBodHRwczovL2Vu
Lndpa2lwZWRpYS5vcmcvd2lraS9WaXN1YWxfQyUyQiUyQiBtaWdodCBiZSBvbmUgc3VjaA0KPiBy
ZWFzb24NCj4gPiA+ID4gSQ0KPiA+ID4gPiBzdXBwb3NlLCBhbHRob3VnaCBJJ20gbm90IGNvbnZp
bmNlZCBhIGxpYnZjaGFuIHBvcnQgdG8gV2luZG93cywgZXZlbg0KPiA+ID4gPiBpZg0KPiA+ID4g
bm90DQo+ID4gPiA+IGVudGlyZWx5IGh5cG90aGV0aWNhbCwgd291bGQgYmUgdXNpbmcgYW55IG9m
IHhlbi5naXQvdG9vbHMvbGlicy8qDQo+ID4gPiA+IHJhdGhlcg0KPiA+ID4gPiB0aGFuIHRoZSBl
cXVpdmFsZW50IGZyYW1ld29ya3MgcHJvdmlkZWQgYnkgdGhlIFdpbmRvd3MgUFYgZHJpdmVycy4N
Cj4gPiA+DQo+ID4gPiBJdCB3b3VsZCBiZSBuaWNlIHRvIGF0IGxlYXN0IGJlIGFibGUgdG8gdXNl
IHRoZSBzYW1lIGhlYWRlciBmaWxlcywgZm9yDQo+ID4gPiBlYXNlIG9mIHBvcnRpbmcgdXNlcnNw
YWNlIHNvZnR3YXJlLg0KPiA+ID4NCj4gPg0KPiA+IEl0J3MgcG9zc2libGUgdGhhdCBsaWJ2Y2hh
biBvbiBXaW5kb3dzIHdpbGwgbWFrZSB1c2Ugb2YgdGhlIHRvb2xzL2xpYnMNCj4gPiBoZWFkZXJz
LiBBcyBBbmR5IHNheXMgaXQgd291bGQgZWFzZSBwb3J0aW5nIGNsaWVudCBzb2Z0d2FyZS4NCj4g
Pg0KPiA+ID4gSW4gdGhpcyBjYXNlLCBWTEFzIGFyZSBqdXN0IGJlaW5nIHVzZWQgYXMgYW4gYWlk
IGZvciB0aGUgY29tcGlsZXIgdG8NCj4gPiA+IHNwb3QgZXJyb3JzLsKgwqBJdCBkb2Vzbid0IGNo
YW5nZSB0aGUgQVBJL0FCSSwgYW5kIGNvdWxkIGJlICNpZmRlZidkDQo+ID4gPiBhcm91bmQsIGlm
IHdlIGNhcmUgYm90aCBmb3IgdXNpbmcgQzk5IGluIGdlbmVyYWwsIGFuZCBXaW5kb3dzIHN1cHBv
cnQuDQo+ID4gPg0KPiA+DQo+ID4gV2Ugc3RpbGwgY29tcGlsZSB3aXRoIFZTMjAxMiBpbiBDaXRy
aXggYW5kIFhlbiBQcm9qZWN0IHVzZXMgVlMyMDEzIHNvIHdlDQo+ID4gY2FuJ3QgcmVseSBvbiBD
OTkuIEEgI2lmZGVmIGhlcmUgZG9lcyBzZWVtIGxpa2UgdGhlIGJlc3Qgc29sdXRpb24uDQo+IA0K
PiBXb3VsZCB5b3UgZXhwZWN0IG5ldyBwcm9qZWN0cyAoaS5lLiBzdHVmZiBiYXNlZCBvbiB0b29s
cy9saWJzKSB0byBjb250aW51ZQ0KPiB0byBoYXZlIHJlcXVpcmVtZW50cyB0byBidWlsZCB3aXRo
IHRob3NlIG9sZGVyIHZlcnNpb25zPyAoQWx0aG91Z2ggd2l0aA0KPiBBbmR5J3MgbGluayBzYXlp
bmcgZXZlbiBWUzIwMTUgZG9lc24ndCBkbyBWTEFzIG1heWJlIGl0IGlzIGEgYml0IG1vb3QpLg0K
PiANCg0KSXQgd291bGQgY2VydGFpbmx5IGJlIHByZWZlcmFibGUgdG8gaGF2ZSBzb21ldGhpbmcg
dGhhdCBkaWQgYnVpbGQgdW5kZXIgYSBzdWZmaWNpZW50bHkgb2xkIEMgc3RhbmRhcmQgdG8gY292
ZXIgYXMgbWFueSBlbnZpcm9ubWVudHMgYXMgaXMgcmVhc29uYWJsZSwgYW5kIEkgdGhpbmsgYW55
IHN1cHBvcnRlZCBNU1ZDIGJ1aWxkIGVudmlyb25tZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0
aGF0IHNldCAoYWx0aG91Z2ggSSBoYXZlIG5vIHByb2JsZW0gdXNpbmcgI2lmZGVmcyB0byBhY2hp
ZXZlIHRoYXQpLg0KDQo+IEkgZG9uJ3QgdGhpbmsgdXNpbmcgVkxBIGhlcmUgaXMgd29ydGggYW4g
aWZkZWYsIGJ1dCBJIHRoaW5rIGl0IGlzIHdvcnRoDQo+IHJlb3JkZXJpbmcgdGhlIGFyZ3VtZW50
cyBzdWNoIHRoYXQgb25jZSB3ZSBlbmQgdXAgd2l0aCBhIG5ldyBlbm91Z2gNCj4gY29tcGlsZXIg
YmFzZWxpbmUgKGluICRkb25rZXlzIHllYXJzKSB3ZSBjYW4gc3dpdGNoIHdpdGhvdXQgY2hhbmdp
bmcgdGhlDQo+IEFCSSAoSSB0aGluayB0aGF0J3MgdGhlIGNhc2UpLg0KPiANCg0KSUlVQyBjb3Jy
ZWN0bHkgdGhlIHVzZSBvZiBWTEFzIGRvZXMgbm90IGNoYW5nZSB0aGUgY2FsbGluZyBjb252ZW50
aW9uIGluIGFueSB3YXksIHJpZ2h0PyBJdCB3b3VsZCBzdGlsbCBtZWFuIGEgcG9pbnRlciB0byBl
cnJfb3V0IGlzIHBhc3NlZCBhbmQgdGhlIHVzZSBvZiBhIFZMQSBpcyBzbyB0aGF0IGJvdW5kcyBj
aGVja2luZyBjYW4gYmUgcGVyZm9ybWVkPw0KSSBjZXJ0YWlubHkgZG9uJ3QgdGhpbmsgd2Ugc2hv
dWxkIGdldCBvdXJzZWx2ZXMgaW50byBhIHNpdHVhdGlvbiB3aGVyZSBhZGRpdGlvbnMgdG8gY29t
cGlsZXJzIG9yIEMgc3RhbmRhcmRzIGRvIGNhdXNlIGNoYW5nZXMgaW4gdGhlIEFCSSAoYW5kIHdl
IGFscmVhZHkgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggV2luZG93cyAzMi1iaXQgc2luY2UgaXQg
ZGVmYXVsdHMgdG8gcGFzY2FsIGNhbGxpbmcgY29udmVudGlvbikuDQoNCiAgUGF1bA0KDQo+IElh
bi4NCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK
aHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4t
cHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 01 10:22:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 01 Dec 2015 10:22:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a3i56-0003XH-Rl; Tue, 01 Dec 2015 10:22:44 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=770a6c7bd=Paul.Durrant@citrix.com>)
	id 1a3i55-0003XC-Ih
	for win-pv-devel@lists.xenproject.org; Tue, 01 Dec 2015 10:22:43 +0000
Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id
	A1/FF-24494-2F47D565; Tue, 01 Dec 2015 10:22:42 +0000
X-Env-Sender: prvs=770a6c7bd=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-206.messagelabs.com!1448964997!7801683!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8284 invoked from network); 1 Dec 2015 10:16:38 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Dec 2015 10:16:38 -0000
X-IronPort-AV: E=Sophos;i="5.20,368,1444694400"; 
   d="scan'208";a="8922417"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Ian Campbell <Ian.Campbell@citrix.com>, Andrew Cooper
	<Andrew.Cooper3@citrix.com>, Ian Jackson <Ian.Jackson@citrix.com>
Thread-Topic: [PATCH XEN v5 13/23] tools: Refactor foreign memory mapping
	into libxenforeignmemory
Thread-Index: AQHRKTe7lSwDG6vubkG1wt5RSiVjhZ6wFH6AgAKvZYCAAYJrAIABp5XA
Date: Tue, 1 Dec 2015 10:16:36 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F69EF09@AMSPEX01CL01.citrite.net>
References: <1447070397.27774.11.camel@citrix.com>
	<1447070458-31104-1-git-send-email-ian.campbell@citrix.com>
	<1447070458-31104-14-git-send-email-ian.campbell@citrix.com>
	<22083.23332.222797.887453@mariner.uk.xensource.com>
	<1447428109.18450.188.camel@citrix.com>
	<22086.340.522438.701042@mariner.uk.xensource.com>
	<1448644706.13576.138.camel@citrix.com> <56589777.3000601@citrix.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F69D32F@AMSPEX01CL01.citrite.net>
	<1448877118.15768.11.camel@citrix.com>
In-Reply-To: <1448877118.15768.11.camel@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Wei Liu <wei.liu2@citrix.com>,
	"xen-devel@lists.xen.org" <xen-devel@lists.xen.org>
Subject: Re: [win-pv-devel] [PATCH XEN v5 13/23] tools: Refactor foreign
 memory mapping into libxenforeignmemory
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBJYW4gQ2FtcGJlbGwgW21haWx0
bzppYW4uY2FtcGJlbGxAY2l0cml4LmNvbV0NCj4gU2VudDogMzAgTm92ZW1iZXIgMjAxNSAwOTo1
Mg0KPiBUbzogUGF1bCBEdXJyYW50OyBBbmRyZXcgQ29vcGVyOyBJYW4gSmFja3Nvbg0KPiBDYzog
V2VpIExpdTsgeGVuLWRldmVsQGxpc3RzLnhlbi5vcmc7IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5w
cm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW1BBVENIIFhFTiB2NSAxMy8yM10gdG9vbHM6IFJl
ZmFjdG9yIGZvcmVpZ24gbWVtb3J5IG1hcHBpbmcNCj4gaW50byBsaWJ4ZW5mb3JlaWdubWVtb3J5
DQo+IA0KPiBPbiBTdW4sIDIwMTUtMTEtMjkgYXQgMDk6NTQgKzAwMDAsIFBhdWwgRHVycmFudCB3
cm90ZToNCj4gPiA+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+ID4gW3NuaXBdDQo+ID4g
PiA+IEM5OSB3YXMgMTYgeWVhcnMgYWdvIG5vdywgSSdtIHN0cnVnZ2xpbmcgdG8gdGhpbmsgb2Yg
YSByZWFzb24gbm90IHRvDQo+ID4gPiA+IG1vdmUNCj4gPiA+ID4gdGhlIGJhc2VsaW5lIGZvciB0
b29scyBzdHVmZiBhdCBsZWFzdCB0byB0aGF0Lg0KPiA+ID4gPg0KPiA+ID4gPiBodHRwczovL2Vu
Lndpa2lwZWRpYS5vcmcvd2lraS9WaXN1YWxfQyUyQiUyQiBtaWdodCBiZSBvbmUgc3VjaA0KPiBy
ZWFzb24NCj4gPiA+ID4gSQ0KPiA+ID4gPiBzdXBwb3NlLCBhbHRob3VnaCBJJ20gbm90IGNvbnZp
bmNlZCBhIGxpYnZjaGFuIHBvcnQgdG8gV2luZG93cywgZXZlbg0KPiA+ID4gPiBpZg0KPiA+ID4g
bm90DQo+ID4gPiA+IGVudGlyZWx5IGh5cG90aGV0aWNhbCwgd291bGQgYmUgdXNpbmcgYW55IG9m
IHhlbi5naXQvdG9vbHMvbGlicy8qDQo+ID4gPiA+IHJhdGhlcg0KPiA+ID4gPiB0aGFuIHRoZSBl
cXVpdmFsZW50IGZyYW1ld29ya3MgcHJvdmlkZWQgYnkgdGhlIFdpbmRvd3MgUFYgZHJpdmVycy4N
Cj4gPiA+DQo+ID4gPiBJdCB3b3VsZCBiZSBuaWNlIHRvIGF0IGxlYXN0IGJlIGFibGUgdG8gdXNl
IHRoZSBzYW1lIGhlYWRlciBmaWxlcywgZm9yDQo+ID4gPiBlYXNlIG9mIHBvcnRpbmcgdXNlcnNw
YWNlIHNvZnR3YXJlLg0KPiA+ID4NCj4gPg0KPiA+IEl0J3MgcG9zc2libGUgdGhhdCBsaWJ2Y2hh
biBvbiBXaW5kb3dzIHdpbGwgbWFrZSB1c2Ugb2YgdGhlIHRvb2xzL2xpYnMNCj4gPiBoZWFkZXJz
LiBBcyBBbmR5IHNheXMgaXQgd291bGQgZWFzZSBwb3J0aW5nIGNsaWVudCBzb2Z0d2FyZS4NCj4g
Pg0KPiA+ID4gSW4gdGhpcyBjYXNlLCBWTEFzIGFyZSBqdXN0IGJlaW5nIHVzZWQgYXMgYW4gYWlk
IGZvciB0aGUgY29tcGlsZXIgdG8NCj4gPiA+IHNwb3QgZXJyb3JzLsKgwqBJdCBkb2Vzbid0IGNo
YW5nZSB0aGUgQVBJL0FCSSwgYW5kIGNvdWxkIGJlICNpZmRlZidkDQo+ID4gPiBhcm91bmQsIGlm
IHdlIGNhcmUgYm90aCBmb3IgdXNpbmcgQzk5IGluIGdlbmVyYWwsIGFuZCBXaW5kb3dzIHN1cHBv
cnQuDQo+ID4gPg0KPiA+DQo+ID4gV2Ugc3RpbGwgY29tcGlsZSB3aXRoIFZTMjAxMiBpbiBDaXRy
aXggYW5kIFhlbiBQcm9qZWN0IHVzZXMgVlMyMDEzIHNvIHdlDQo+ID4gY2FuJ3QgcmVseSBvbiBD
OTkuIEEgI2lmZGVmIGhlcmUgZG9lcyBzZWVtIGxpa2UgdGhlIGJlc3Qgc29sdXRpb24uDQo+IA0K
PiBXb3VsZCB5b3UgZXhwZWN0IG5ldyBwcm9qZWN0cyAoaS5lLiBzdHVmZiBiYXNlZCBvbiB0b29s
cy9saWJzKSB0byBjb250aW51ZQ0KPiB0byBoYXZlIHJlcXVpcmVtZW50cyB0byBidWlsZCB3aXRo
IHRob3NlIG9sZGVyIHZlcnNpb25zPyAoQWx0aG91Z2ggd2l0aA0KPiBBbmR5J3MgbGluayBzYXlp
bmcgZXZlbiBWUzIwMTUgZG9lc24ndCBkbyBWTEFzIG1heWJlIGl0IGlzIGEgYml0IG1vb3QpLg0K
PiANCg0KSXQgd291bGQgY2VydGFpbmx5IGJlIHByZWZlcmFibGUgdG8gaGF2ZSBzb21ldGhpbmcg
dGhhdCBkaWQgYnVpbGQgdW5kZXIgYSBzdWZmaWNpZW50bHkgb2xkIEMgc3RhbmRhcmQgdG8gY292
ZXIgYXMgbWFueSBlbnZpcm9ubWVudHMgYXMgaXMgcmVhc29uYWJsZSwgYW5kIEkgdGhpbmsgYW55
IHN1cHBvcnRlZCBNU1ZDIGJ1aWxkIGVudmlyb25tZW50IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0
aGF0IHNldCAoYWx0aG91Z2ggSSBoYXZlIG5vIHByb2JsZW0gdXNpbmcgI2lmZGVmcyB0byBhY2hp
ZXZlIHRoYXQpLg0KDQo+IEkgZG9uJ3QgdGhpbmsgdXNpbmcgVkxBIGhlcmUgaXMgd29ydGggYW4g
aWZkZWYsIGJ1dCBJIHRoaW5rIGl0IGlzIHdvcnRoDQo+IHJlb3JkZXJpbmcgdGhlIGFyZ3VtZW50
cyBzdWNoIHRoYXQgb25jZSB3ZSBlbmQgdXAgd2l0aCBhIG5ldyBlbm91Z2gNCj4gY29tcGlsZXIg
YmFzZWxpbmUgKGluICRkb25rZXlzIHllYXJzKSB3ZSBjYW4gc3dpdGNoIHdpdGhvdXQgY2hhbmdp
bmcgdGhlDQo+IEFCSSAoSSB0aGluayB0aGF0J3MgdGhlIGNhc2UpLg0KPiANCg0KSUlVQyBjb3Jy
ZWN0bHkgdGhlIHVzZSBvZiBWTEFzIGRvZXMgbm90IGNoYW5nZSB0aGUgY2FsbGluZyBjb252ZW50
aW9uIGluIGFueSB3YXksIHJpZ2h0PyBJdCB3b3VsZCBzdGlsbCBtZWFuIGEgcG9pbnRlciB0byBl
cnJfb3V0IGlzIHBhc3NlZCBhbmQgdGhlIHVzZSBvZiBhIFZMQSBpcyBzbyB0aGF0IGJvdW5kcyBj
aGVja2luZyBjYW4gYmUgcGVyZm9ybWVkPw0KSSBjZXJ0YWlubHkgZG9uJ3QgdGhpbmsgd2Ugc2hv
dWxkIGdldCBvdXJzZWx2ZXMgaW50byBhIHNpdHVhdGlvbiB3aGVyZSBhZGRpdGlvbnMgdG8gY29t
cGlsZXJzIG9yIEMgc3RhbmRhcmRzIGRvIGNhdXNlIGNoYW5nZXMgaW4gdGhlIEFCSSAoYW5kIHdl
IGFscmVhZHkgaGF2ZSB0byBiZSBjYXJlZnVsIHdpdGggV2luZG93cyAzMi1iaXQgc2luY2UgaXQg
ZGVmYXVsdHMgdG8gcGFzY2FsIGNhbGxpbmcgY29udmVudGlvbikuDQoNCiAgUGF1bA0KDQo+IElh
bi4NCg0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcK
aHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4t
cHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 01 11:37:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 01 Dec 2015 11:37:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a3jF2-0000Fh-V8; Tue, 01 Dec 2015 11:37:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=770a6c7bd=Paul.Durrant@citrix.com>)
	id 1a3jF2-0000FX-0j
	for win-pv-devel@lists.xenproject.org; Tue, 01 Dec 2015 11:37:04 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	C0/01-12889-F568D565; Tue, 01 Dec 2015 11:37:03 +0000
X-Env-Sender: prvs=770a6c7bd=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1448969822!7745642!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2518 invoked from network); 1 Dec 2015 11:37:02 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Dec 2015 11:37:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,368,1444694400"; 
   d="scan'208";a="8928604"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?=C9li=E1s_Tam=E1s?= <et@etit.hu>, "xen-users@lists.xen.org"
	<xen-users@lists.xen.org>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Windows 10 upgrade to new build with
	testsigning on	-> FAIL
Thread-Index: AQHRK1yb9RSyu6AhA0SK6hfGtDC0KJ62AVCQ
Date: Tue, 1 Dec 2015 11:36:59 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
References: <565C293A.5030705@etit.hu>
In-Reply-To: <565C293A.5030705@etit.hu>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Windows 10 upgrade to new build with testsigning
 on	-> FAIL
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of =C9li=E1s Tam=E1s
> Sent: 30 November 2015 10:47
> To: xen-users@lists.xen.org; win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] Windows 10 upgrade to new build with testsigning
> on -> FAIL
> =

> Dear all.
> =

> =

> I'm using several Windows 10 HVM DOMU-s with XEN4.6. I'm using
> xen-winpv-devel drivers (latest ones, from November). Previously on the
> xen-users and on the xen-winpv-development list several users inlcuding
> me was wishing for signed develoment drivers.
> =

> Now it seems, that the time has come to tell you, that it is now a
> blocking condition.
> =

> Upgrading windows 10 build to the latext 15xxx build automatically turns
> off testsigning: this cause that upon next reboot during the upgrade
> procedure, the windows 10 machines fail to start (due to xenbus is not
> signed). The F8 is offered, I can select "turn off the requirement for
> digital signature of the drivers", and reboot. Unfortunately the upgrade
> realizes, that "something did not go well", and immediately starts
> uninstalling the upgrade package.
> =

> And I'm stuck here. May I get any response about the signed drivers?
> Thank you!

I believe Lars is working on this. We intend to get an EV cert for Xen Proj=
ect and release-sign (not logo-sign) drivers through the new Windows 10 por=
tal. I have updated the staging-8.1 branches recently and re-tagged them wi=
th new rc numbers... I'll adjust the Jenkins projects today to deliver new =
builds of these branches to xenbits. My hope is that these are likely to be=
 the final rcs.

  Paul

> =

> --
> =

> =

> =C9li=E1s Tam=E1s
> Thomas Elias
> =

> ETIT[nwpro] KFT, =DCgyvezet=F5-H=E1l=F3zatbiztons=E1gi specialista
> ETIT[nwpro] Ltd, General Manager-Network security specialist
> =

> Tel. HU: +36/30-497-1626
> Tel. DE: +49/160-651-8723
> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
> =

> Okleveles m=E9rn=F6k-informatikus (MSC)
> Master of Science in Information Technology (MSC)
> =

> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
> Contact: http://etit.hu/index.php/en/contact
> Disclaimer: http://etit.hu/disclaimer-email-en.txt


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 01 11:37:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 01 Dec 2015 11:37:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a3jF2-0000Fh-V8; Tue, 01 Dec 2015 11:37:04 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=770a6c7bd=Paul.Durrant@citrix.com>)
	id 1a3jF2-0000FX-0j
	for win-pv-devel@lists.xenproject.org; Tue, 01 Dec 2015 11:37:04 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	C0/01-12889-F568D565; Tue, 01 Dec 2015 11:37:03 +0000
X-Env-Sender: prvs=770a6c7bd=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1448969822!7745642!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2518 invoked from network); 1 Dec 2015 11:37:02 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Dec 2015 11:37:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,368,1444694400"; 
   d="scan'208";a="8928604"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?=C9li=E1s_Tam=E1s?= <et@etit.hu>, "xen-users@lists.xen.org"
	<xen-users@lists.xen.org>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Windows 10 upgrade to new build with
	testsigning on	-> FAIL
Thread-Index: AQHRK1yb9RSyu6AhA0SK6hfGtDC0KJ62AVCQ
Date: Tue, 1 Dec 2015 11:36:59 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
References: <565C293A.5030705@etit.hu>
In-Reply-To: <565C293A.5030705@etit.hu>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Windows 10 upgrade to new build with testsigning
 on	-> FAIL
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of =C9li=E1s Tam=E1s
> Sent: 30 November 2015 10:47
> To: xen-users@lists.xen.org; win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] Windows 10 upgrade to new build with testsigning
> on -> FAIL
> =

> Dear all.
> =

> =

> I'm using several Windows 10 HVM DOMU-s with XEN4.6. I'm using
> xen-winpv-devel drivers (latest ones, from November). Previously on the
> xen-users and on the xen-winpv-development list several users inlcuding
> me was wishing for signed develoment drivers.
> =

> Now it seems, that the time has come to tell you, that it is now a
> blocking condition.
> =

> Upgrading windows 10 build to the latext 15xxx build automatically turns
> off testsigning: this cause that upon next reboot during the upgrade
> procedure, the windows 10 machines fail to start (due to xenbus is not
> signed). The F8 is offered, I can select "turn off the requirement for
> digital signature of the drivers", and reboot. Unfortunately the upgrade
> realizes, that "something did not go well", and immediately starts
> uninstalling the upgrade package.
> =

> And I'm stuck here. May I get any response about the signed drivers?
> Thank you!

I believe Lars is working on this. We intend to get an EV cert for Xen Proj=
ect and release-sign (not logo-sign) drivers through the new Windows 10 por=
tal. I have updated the staging-8.1 branches recently and re-tagged them wi=
th new rc numbers... I'll adjust the Jenkins projects today to deliver new =
builds of these branches to xenbits. My hope is that these are likely to be=
 the final rcs.

  Paul

> =

> --
> =

> =

> =C9li=E1s Tam=E1s
> Thomas Elias
> =

> ETIT[nwpro] KFT, =DCgyvezet=F5-H=E1l=F3zatbiztons=E1gi specialista
> ETIT[nwpro] Ltd, General Manager-Network security specialist
> =

> Tel. HU: +36/30-497-1626
> Tel. DE: +49/160-651-8723
> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
> =

> Okleveles m=E9rn=F6k-informatikus (MSC)
> Master of Science in Information Technology (MSC)
> =

> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
> Contact: http://etit.hu/index.php/en/contact
> Disclaimer: http://etit.hu/disclaimer-email-en.txt


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 01 17:07:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 01 Dec 2015 17:07:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a3oOW-0005aX-HT; Tue, 01 Dec 2015 17:07:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=770a6c7bd=Paul.Durrant@citrix.com>)
	id 1a3oOV-0005aR-PI
	for win-pv-devel@lists.xenproject.org; Tue, 01 Dec 2015 17:07:11 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	B7/63-32615-FB3DD565; Tue, 01 Dec 2015 17:07:11 +0000
X-Env-Sender: prvs=770a6c7bd=Paul.Durrant@citrix.com
X-Msg-Ref: server-16.tower-206.messagelabs.com!1448989141!7641761!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 40235 invoked from network); 1 Dec 2015 16:59:01 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-16.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Dec 2015 16:59:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,369,1444694400"; 
   d="scan'208";a="8962583"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: New builds of 8.1.0 drivers available
Thread-Index: AdEsWJeT8G/rniiJTQm7HGUap3gziA==
Date: Tue, 1 Dec 2015 16:53:09 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] New builds of 8.1.0 drivers available
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

All,

  I updated the Jenkins projects and re-built the 8.1.0 drivers from the latest rcs. The binary packages are now available for test at http://xenbits.xen.org/pvdrivers/win/8.1.0

  Cheers,

    Paul

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 01 17:07:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 01 Dec 2015 17:07:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a3oOW-0005aX-HT; Tue, 01 Dec 2015 17:07:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=770a6c7bd=Paul.Durrant@citrix.com>)
	id 1a3oOV-0005aR-PI
	for win-pv-devel@lists.xenproject.org; Tue, 01 Dec 2015 17:07:11 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	B7/63-32615-FB3DD565; Tue, 01 Dec 2015 17:07:11 +0000
X-Env-Sender: prvs=770a6c7bd=Paul.Durrant@citrix.com
X-Msg-Ref: server-16.tower-206.messagelabs.com!1448989141!7641761!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 40235 invoked from network); 1 Dec 2015 16:59:01 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-16.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	1 Dec 2015 16:59:01 -0000
X-IronPort-AV: E=Sophos;i="5.20,369,1444694400"; 
   d="scan'208";a="8962583"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: New builds of 8.1.0 drivers available
Thread-Index: AdEsWJeT8G/rniiJTQm7HGUap3gziA==
Date: Tue, 1 Dec 2015 16:53:09 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: [win-pv-devel] New builds of 8.1.0 drivers available
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

All,

  I updated the Jenkins projects and re-built the 8.1.0 drivers from the latest rcs. The binary packages are now available for test at http://xenbits.xen.org/pvdrivers/win/8.1.0

  Cheers,

    Paul

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 02 15:17:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 02 Dec 2015 15:17:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a499c-0007q0-Qy; Wed, 02 Dec 2015 15:17:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=771fbde0c=owen.smith@citrix.com>)
	id 1a499b-0007pv-3M
	for win-pv-devel@lists.xenproject.org; Wed, 02 Dec 2015 15:17:11 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	F6/0B-32615-67B0F565; Wed, 02 Dec 2015 15:17:10 +0000
X-Env-Sender: prvs=771fbde0c=owen.smith@citrix.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1449069428!7831432!1
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 55511 invoked from network); 2 Dec 2015 15:17:09 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Dec 2015 15:17:09 -0000
X-IronPort-AV: E=Sophos;i="5.20,373,1444694400"; d="scan'208";a="322040582"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Wed, 2 Dec 2015 15:16:49 +0000
Message-ID: <1449069409-35764-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding / BlockRingAbort
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The BlockRing Outstanding stat is duplicated by SubmittedReqs.Count.
Remove BlockRing.Outstanding and the BlockRingAbort function as the
stat is not useful, and can trigger ASSERTion failures when requests
are stuck outstanding on a broken ring that is being destroyed.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/blockring.c | 28 +---------------------------
 src/xenvbd/blockring.h |  6 ------
 src/xenvbd/pdo.c       |  4 +---
 3 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
index 6ca9cb2..e0275af 100644
--- a/src/xenvbd/blockring.c
+++ b/src/xenvbd/blockring.c
@@ -56,7 +56,6 @@ struct _XENVBD_BLOCKRING {
     ULONG                           DeviceId;
     ULONG                           Order;
     PVOID                           Grants[XENVBD_MAX_RING_PAGES];
-    ULONG                           Outstanding;
     ULONG                           Submitted;
     ULONG                           Received;
 };
@@ -235,7 +234,6 @@ __BlockRingInsert(
         break;
     }
     ++BlockRing->Submitted;
-    ++BlockRing->Outstanding;
 }
 
 NTSTATUS
@@ -432,7 +430,6 @@ BlockRingDisconnect(
     PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing->Frontend);
 
     ASSERT(BlockRing->Connected == TRUE);
-    ASSERT3U(BlockRing->Outstanding, ==, 0);
 
     BlockRing->Submitted = 0;
     BlockRing->Received = 0;
@@ -467,8 +464,7 @@ BlockRingDebugCallback(
     PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing->Frontend);
 
     XENBUS_DEBUG(Printf, Debug,
-                 "BLOCKRING: Requests  : %d / %d / %d\n",
-                 BlockRing->Outstanding,
+                 "BLOCKRING: Requests  : %d / %d\n",
                  BlockRing->Submitted,
                  BlockRing->Received);
 
@@ -543,7 +539,6 @@ BlockRingPoll(
 
             if (__BlockRingPutTag(BlockRing, Response->id, &Tag)) {
                 ++BlockRing->Received;
-                --BlockRing->Outstanding;
                 PdoCompleteResponse(Pdo, Tag, Response->status);
             }
 
@@ -589,24 +584,3 @@ BlockRingSubmit(
 
     return TRUE;
 }
-
-VOID
-BlockRingAbort(
-    IN  PXENVBD_BLOCKRING           BlockRing,
-    IN  PXENVBD_REQUEST             Request
-    )
-{
-    KIRQL               Irql;
-
-    UNREFERENCED_PARAMETER(Request);
-
-    KeAcquireSpinLock(&BlockRing->Lock, &Irql);
-
-    // Should check Request is present on the ring, but
-    // the shared page(s) may not contain any valid data,
-    // due to suspend/resume
-    ASSERT3U(BlockRing->Outstanding, >, 0);
-    --BlockRing->Outstanding;
-
-    KeReleaseSpinLock(&BlockRing->Lock, Irql);
-}
diff --git a/src/xenvbd/blockring.h b/src/xenvbd/blockring.h
index 4c94b6c..1117d73 100644
--- a/src/xenvbd/blockring.h
+++ b/src/xenvbd/blockring.h
@@ -94,10 +94,4 @@ BlockRingSubmit(
     IN  PXENVBD_REQUEST             Request
     );
 
-extern VOID
-BlockRingAbort(
-    IN  PXENVBD_BLOCKRING           BlockRing,
-    IN  PXENVBD_REQUEST             Request
-    );
-
 #endif // _XENVBD_BLOCKRING_H
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 154dd8a..488a74b 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -1578,8 +1578,7 @@ PdoPreResume(
     )
 {
     LIST_ENTRY          List;
-    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo->Frontend);
-    
+
     InitializeListHead(&List);
 
     // pop all submitted requests, cleanup and add associated SRB to a list
@@ -1592,7 +1591,6 @@ PdoPreResume(
         Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
         SrbExt = GetSrbExt(Request->Srb);
 
-        BlockRingAbort(BlockRing, Request);
         PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 02 15:17:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 02 Dec 2015 15:17:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a499c-0007q0-Qy; Wed, 02 Dec 2015 15:17:12 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=771fbde0c=owen.smith@citrix.com>)
	id 1a499b-0007pv-3M
	for win-pv-devel@lists.xenproject.org; Wed, 02 Dec 2015 15:17:11 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	F6/0B-32615-67B0F565; Wed, 02 Dec 2015 15:17:10 +0000
X-Env-Sender: prvs=771fbde0c=owen.smith@citrix.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1449069428!7831432!1
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 55511 invoked from network); 2 Dec 2015 15:17:09 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	2 Dec 2015 15:17:09 -0000
X-IronPort-AV: E=Sophos;i="5.20,373,1444694400"; d="scan'208";a="322040582"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Wed, 2 Dec 2015 15:16:49 +0000
Message-ID: <1449069409-35764-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding / BlockRingAbort
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The BlockRing Outstanding stat is duplicated by SubmittedReqs.Count.
Remove BlockRing.Outstanding and the BlockRingAbort function as the
stat is not useful, and can trigger ASSERTion failures when requests
are stuck outstanding on a broken ring that is being destroyed.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenvbd/blockring.c | 28 +---------------------------
 src/xenvbd/blockring.h |  6 ------
 src/xenvbd/pdo.c       |  4 +---
 3 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
index 6ca9cb2..e0275af 100644
--- a/src/xenvbd/blockring.c
+++ b/src/xenvbd/blockring.c
@@ -56,7 +56,6 @@ struct _XENVBD_BLOCKRING {
     ULONG                           DeviceId;
     ULONG                           Order;
     PVOID                           Grants[XENVBD_MAX_RING_PAGES];
-    ULONG                           Outstanding;
     ULONG                           Submitted;
     ULONG                           Received;
 };
@@ -235,7 +234,6 @@ __BlockRingInsert(
         break;
     }
     ++BlockRing->Submitted;
-    ++BlockRing->Outstanding;
 }
 
 NTSTATUS
@@ -432,7 +430,6 @@ BlockRingDisconnect(
     PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing->Frontend);
 
     ASSERT(BlockRing->Connected == TRUE);
-    ASSERT3U(BlockRing->Outstanding, ==, 0);
 
     BlockRing->Submitted = 0;
     BlockRing->Received = 0;
@@ -467,8 +464,7 @@ BlockRingDebugCallback(
     PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing->Frontend);
 
     XENBUS_DEBUG(Printf, Debug,
-                 "BLOCKRING: Requests  : %d / %d / %d\n",
-                 BlockRing->Outstanding,
+                 "BLOCKRING: Requests  : %d / %d\n",
                  BlockRing->Submitted,
                  BlockRing->Received);
 
@@ -543,7 +539,6 @@ BlockRingPoll(
 
             if (__BlockRingPutTag(BlockRing, Response->id, &Tag)) {
                 ++BlockRing->Received;
-                --BlockRing->Outstanding;
                 PdoCompleteResponse(Pdo, Tag, Response->status);
             }
 
@@ -589,24 +584,3 @@ BlockRingSubmit(
 
     return TRUE;
 }
-
-VOID
-BlockRingAbort(
-    IN  PXENVBD_BLOCKRING           BlockRing,
-    IN  PXENVBD_REQUEST             Request
-    )
-{
-    KIRQL               Irql;
-
-    UNREFERENCED_PARAMETER(Request);
-
-    KeAcquireSpinLock(&BlockRing->Lock, &Irql);
-
-    // Should check Request is present on the ring, but
-    // the shared page(s) may not contain any valid data,
-    // due to suspend/resume
-    ASSERT3U(BlockRing->Outstanding, >, 0);
-    --BlockRing->Outstanding;
-
-    KeReleaseSpinLock(&BlockRing->Lock, Irql);
-}
diff --git a/src/xenvbd/blockring.h b/src/xenvbd/blockring.h
index 4c94b6c..1117d73 100644
--- a/src/xenvbd/blockring.h
+++ b/src/xenvbd/blockring.h
@@ -94,10 +94,4 @@ BlockRingSubmit(
     IN  PXENVBD_REQUEST             Request
     );
 
-extern VOID
-BlockRingAbort(
-    IN  PXENVBD_BLOCKRING           BlockRing,
-    IN  PXENVBD_REQUEST             Request
-    );
-
 #endif // _XENVBD_BLOCKRING_H
diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
index 154dd8a..488a74b 100644
--- a/src/xenvbd/pdo.c
+++ b/src/xenvbd/pdo.c
@@ -1578,8 +1578,7 @@ PdoPreResume(
     )
 {
     LIST_ENTRY          List;
-    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo->Frontend);
-    
+
     InitializeListHead(&List);
 
     // pop all submitted requests, cleanup and add associated SRB to a list
@@ -1592,7 +1591,6 @@ PdoPreResume(
         Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
         SrbExt = GetSrbExt(Request->Srb);
 
-        BlockRingAbort(BlockRing, Request);
         PdoPutRequest(Pdo, Request);
 
         if (InterlockedDecrement(&SrbExt->Count) == 0) {
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 10:00:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 10:00:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4Qgq-0003H2-Lh; Thu, 03 Dec 2015 10:00:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=772d45f04=Paul.Durrant@citrix.com>)
	id 1a4Qgp-0003G1-70
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 10:00:39 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	76/8F-22142-6C210665; Thu, 03 Dec 2015 10:00:38 +0000
X-Env-Sender: prvs=772d45f04=Paul.Durrant@citrix.com
X-Msg-Ref: server-10.tower-206.messagelabs.com!1449136836!8233940!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26328 invoked from network); 3 Dec 2015 10:00:36 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-10.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Dec 2015 10:00:36 -0000
X-IronPort-AV: E=Sophos;i="5.20,377,1444694400"; 
   d="scan'208";a="9177438"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: New builds of 8.1.0 drivers available
Thread-Index: AdEsWJeT8G/rniiJTQm7HGUap3gziABWJT4A
Date: Thu, 3 Dec 2015 10:00:34 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A4A7F@AMSPEX01CL01.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] New builds of 8.1.0 drivers available
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> Sent: 01 December 2015 16:53
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] New builds of 8.1.0 drivers available
> 
> All,
> 
>   I updated the Jenkins projects and re-built the 8.1.0 drivers from the latest
> rcs. The binary packages are now available for test at
> http://xenbits.xen.org/pvdrivers/win/8.1.0
> 

It turns out that some serious breakage of support for the S3 and S4 power states had crept in and had not been caught be testing. I'm currently trying to find minimal fixes for this. I'll do any necessary re-tagging once new stricter tests pass.

  Paul

>   Cheers,
> 
>     Paul
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 10:00:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 10:00:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4Qgq-0003H2-Lh; Thu, 03 Dec 2015 10:00:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=772d45f04=Paul.Durrant@citrix.com>)
	id 1a4Qgp-0003G1-70
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 10:00:39 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	76/8F-22142-6C210665; Thu, 03 Dec 2015 10:00:38 +0000
X-Env-Sender: prvs=772d45f04=Paul.Durrant@citrix.com
X-Msg-Ref: server-10.tower-206.messagelabs.com!1449136836!8233940!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26328 invoked from network); 3 Dec 2015 10:00:36 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-10.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Dec 2015 10:00:36 -0000
X-IronPort-AV: E=Sophos;i="5.20,377,1444694400"; 
   d="scan'208";a="9177438"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: New builds of 8.1.0 drivers available
Thread-Index: AdEsWJeT8G/rniiJTQm7HGUap3gziABWJT4A
Date: Thu, 3 Dec 2015 10:00:34 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A4A7F@AMSPEX01CL01.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] New builds of 8.1.0 drivers available
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> Sent: 01 December 2015 16:53
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] New builds of 8.1.0 drivers available
> 
> All,
> 
>   I updated the Jenkins projects and re-built the 8.1.0 drivers from the latest
> rcs. The binary packages are now available for test at
> http://xenbits.xen.org/pvdrivers/win/8.1.0
> 

It turns out that some serious breakage of support for the S3 and S4 power states had crept in and had not been caught be testing. I'm currently trying to find minimal fixes for this. I'll do any necessary re-tagging once new stricter tests pass.

  Paul

>   Cheers,
> 
>     Paul
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 12:41:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 12:41:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TCN-0007JX-S6; Thu, 03 Dec 2015 12:41:23 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TCL-0007JS-R3
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 12:41:21 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	67/1A-10678-07830665; Thu, 03 Dec 2015 12:41:20 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-9.tower-31.messagelabs.com!1449146479!939536!1
X-Originating-IP: [209.85.160.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27052 invoked from network); 3 Dec 2015 12:41:20 -0000
Received: from mail-yk0-f176.google.com (HELO mail-yk0-f176.google.com)
	(209.85.160.176)
	by server-9.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 12:41:20 -0000
Received: by ykdr82 with SMTP id r82so83449521ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 04:41:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=TxAMQaWjxjrnQXIx4ZJegUQgBpfr/oRZ5m4acjrY2h8=;
	b=iZXVqFePTXxD/559i3r5JWG0aLaY1F1kvOg8QK77vCifVktTn2v7Vy25lrAXwk2Slj
	OpeE5aNCT1kcJlT2HdspX/08wSeIC0diPLTXNFG2HTI6tD3g/HwM6t/dcEat+Jn1LBuh
	QN5tynANTyutnX/LXeBNKsgDnwxIz3u9Pf+RMCJY1lJ+rTgelySRnitDp4ScPdluaEsY
	iJkwwHYtGVHCjSQCx2EtSt6ciJkYBZthMJSV3Hidqedanw/jWWfThxkisLneg0lL5WiM
	DpGQ3PYHoRkiZ7YKFH7UsJ1mLry0FBagMBBO3A9zwPRkQAeJlOwQlwegE8fEGaUzok4x
	Hz3g==
X-Received: by 10.129.111.3 with SMTP id k3mr6089531ywc.53.1449146479504;
	Thu, 03 Dec 2015 04:41:19 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id x7sm5377068ywf.35.2015.12.03.04.41.18
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 04:41:19 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 12:41:07 +0000
Message-Id: <1449146467-1480-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449146467-1480-1-git-send-email-paul.durrant@citrix.com>
References: <1449146467-1480-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1 2/2] Fix snafu on setting active
	device when no vendor device is set
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If XENBUS is built with no vendor device then the check for vendor device
presences was using NULL. This patch skips the check in that case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/driver.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index b1a5cb3..73625ef 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -292,15 +292,18 @@ DriverGetActive(
     return STATUS_SUCCESS;
 
 fail3:
-    Error("fail3\n");
+    if (status != STATUS_OBJECT_NAME_NOT_FOUND)
+        Error("fail3\n");
 
 fail2:
-    Error("fail2\n");
+    if (status != STATUS_OBJECT_NAME_NOT_FOUND)
+        Error("fail2\n");
 
     RegistryCloseKey(ActiveKey);
 
 fail1:
-    Error("fail1 (%08x)\n", status);
+    if (status != STATUS_OBJECT_NAME_NOT_FOUND)
+        Error("fail1 (%08x)\n", status);
 
     return status;
 }
@@ -346,6 +349,9 @@ __DriverIsVendorDevicePresent(
     BOOLEAN     Found;
     NTSTATUS    status;
 
+    if (DriverVendorDeviceID == NULL)
+        return FALSE;
+
     status = RegistryOpenSubKey(NULL,
                                 ENUM_PATH,
                                 KEY_READ,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 12:41:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 12:41:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TCN-0007JX-S6; Thu, 03 Dec 2015 12:41:23 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TCL-0007JS-R3
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 12:41:21 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	67/1A-10678-07830665; Thu, 03 Dec 2015 12:41:20 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-9.tower-31.messagelabs.com!1449146479!939536!1
X-Originating-IP: [209.85.160.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27052 invoked from network); 3 Dec 2015 12:41:20 -0000
Received: from mail-yk0-f176.google.com (HELO mail-yk0-f176.google.com)
	(209.85.160.176)
	by server-9.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 12:41:20 -0000
Received: by ykdr82 with SMTP id r82so83449521ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 04:41:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=TxAMQaWjxjrnQXIx4ZJegUQgBpfr/oRZ5m4acjrY2h8=;
	b=iZXVqFePTXxD/559i3r5JWG0aLaY1F1kvOg8QK77vCifVktTn2v7Vy25lrAXwk2Slj
	OpeE5aNCT1kcJlT2HdspX/08wSeIC0diPLTXNFG2HTI6tD3g/HwM6t/dcEat+Jn1LBuh
	QN5tynANTyutnX/LXeBNKsgDnwxIz3u9Pf+RMCJY1lJ+rTgelySRnitDp4ScPdluaEsY
	iJkwwHYtGVHCjSQCx2EtSt6ciJkYBZthMJSV3Hidqedanw/jWWfThxkisLneg0lL5WiM
	DpGQ3PYHoRkiZ7YKFH7UsJ1mLry0FBagMBBO3A9zwPRkQAeJlOwQlwegE8fEGaUzok4x
	Hz3g==
X-Received: by 10.129.111.3 with SMTP id k3mr6089531ywc.53.1449146479504;
	Thu, 03 Dec 2015 04:41:19 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id x7sm5377068ywf.35.2015.12.03.04.41.18
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 04:41:19 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 12:41:07 +0000
Message-Id: <1449146467-1480-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449146467-1480-1-git-send-email-paul.durrant@citrix.com>
References: <1449146467-1480-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1 2/2] Fix snafu on setting active
	device when no vendor device is set
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If XENBUS is built with no vendor device then the check for vendor device
presences was using NULL. This patch skips the check in that case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/driver.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index b1a5cb3..73625ef 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -292,15 +292,18 @@ DriverGetActive(
     return STATUS_SUCCESS;
 
 fail3:
-    Error("fail3\n");
+    if (status != STATUS_OBJECT_NAME_NOT_FOUND)
+        Error("fail3\n");
 
 fail2:
-    Error("fail2\n");
+    if (status != STATUS_OBJECT_NAME_NOT_FOUND)
+        Error("fail2\n");
 
     RegistryCloseKey(ActiveKey);
 
 fail1:
-    Error("fail1 (%08x)\n", status);
+    if (status != STATUS_OBJECT_NAME_NOT_FOUND)
+        Error("fail1 (%08x)\n", status);
 
     return status;
 }
@@ -346,6 +349,9 @@ __DriverIsVendorDevicePresent(
     BOOLEAN     Found;
     NTSTATUS    status;
 
+    if (DriverVendorDeviceID == NULL)
+        return FALSE;
+
     status = RegistryOpenSubKey(NULL,
                                 ENUM_PATH,
                                 KEY_READ,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 12:41:27 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 12:41:27 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TCQ-0007K5-VP; Thu, 03 Dec 2015 12:41:26 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TCO-0007Jb-JR
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 12:41:24 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	40/E1-31122-37830665; Thu, 03 Dec 2015 12:41:23 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1449146478!3396611!1
X-Originating-IP: [209.85.160.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3337 invoked from network); 3 Dec 2015 12:41:20 -0000
Received: from mail-yk0-f174.google.com (HELO mail-yk0-f174.google.com)
	(209.85.160.174)
	by server-14.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 12:41:20 -0000
Received: by ykba77 with SMTP id a77so83500272ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 04:41:18 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=1DUCpvGrhX9Ce/aJ/tVUgvH1FQsA4tM2KlJPAt3UcVw=;
	b=NexZrFlITFhWY5Oryzitip30V5dNGLnAvTLTai9ggGs5TC14ffejjjuRsXY/B6S1ys
	PJylm2SqFLGK+oy4lQTHeqF9TmWNYNT80R7URMph7BHh78xQYS8EcKZmRPFUinT9+mY0
	hqjD3vdMNe674HEMQC8GfwjBzRfhWDr/Yg8t0IvVhRt7dBCgLCfTFL9/c2lzzM1SgfvD
	ojAfg1t/P6z3DWMuW4KeM/MiMZnGf7c/lOBpIFoJuUt6mkW+a504b5O8m05EmKxp981B
	sGP9SnPSN3nROPwnExI6siPRQD7t7dJlqENGixsRGmEx93giiSauDc0Ua3yfm7cG0sz7
	0pNA==
X-Received: by 10.129.133.2 with SMTP id v2mr7104892ywf.76.1449146478403;
	Thu, 03 Dec 2015 04:41:18 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id x7sm5377068ywf.35.2015.12.03.04.41.17
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 04:41:17 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 12:41:06 +0000
Message-Id: <1449146467-1480-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1 1/2] Verify that all interfaces have
	been released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch adds BUG_ONs to ensure this is the case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/balloon.c     |  8 ++++++++
 src/xenbus/balloon.h     |  5 +++++
 src/xenbus/cache.c       |  8 ++++++++
 src/xenbus/cache.h       |  5 +++++
 src/xenbus/debug.c       |  9 ++++++++-
 src/xenbus/debug.h       |  5 +++++
 src/xenbus/evtchn.c      |  8 ++++++++
 src/xenbus/evtchn.h      |  5 +++++
 src/xenbus/fdo.c         | 11 +++++++++++
 src/xenbus/gnttab.c      |  8 ++++++++
 src/xenbus/gnttab.h      |  5 +++++
 src/xenbus/range_set.c   | 10 ++++++++--
 src/xenbus/range_set.h   |  5 +++++
 src/xenbus/shared_info.c |  9 ++++++++-
 src/xenbus/shared_info.h |  5 +++++
 src/xenbus/store.c       | 19 +++++++++++++++----
 src/xenbus/store.h       |  5 +++++
 src/xenbus/suspend.c     |  8 ++++++++
 src/xenbus/suspend.h     |  5 +++++
 src/xenbus/unplug.c      |  8 ++++++++
 src/xenbus/unplug.h      |  5 +++++
 21 files changed, 148 insertions(+), 8 deletions(-)

diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index 2dc4a6c..1b3f5fa 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -987,6 +987,14 @@ BalloonGetInterface(
     return status;
 }   
 
+ULONG
+BalloonGetReferences(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 BalloonTeardown(
     IN  PXENBUS_BALLOON_CONTEXT Context
diff --git a/src/xenbus/balloon.h b/src/xenbus/balloon.h
index cc47d7d..03570f3 100644
--- a/src/xenbus/balloon.h
+++ b/src/xenbus/balloon.h
@@ -54,6 +54,11 @@ BalloonGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+BalloonGetReferences(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    );
+
 extern VOID
 BalloonTeardown(
     IN  PXENBUS_BALLOON_CONTEXT Context
diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 83993ca..9727b14 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -1014,6 +1014,14 @@ CacheGetInterface(
     return status;
 }   
 
+ULONG
+CacheGetReferences(
+    IN  PXENBUS_CACHE_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 CacheTeardown(
     IN  PXENBUS_CACHE_CONTEXT   Context
diff --git a/src/xenbus/cache.h b/src/xenbus/cache.h
index 582c77d..be94973 100644
--- a/src/xenbus/cache.h
+++ b/src/xenbus/cache.h
@@ -54,6 +54,11 @@ CacheGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+CacheGetReferences(
+    IN  PXENBUS_CACHE_CONTEXT   Context
+    );
+
 extern VOID
 CacheTeardown(
     IN  PXENBUS_CACHE_CONTEXT   Context
diff --git a/src/xenbus/debug.c b/src/xenbus/debug.c
index bd62b51..7b2ec73 100644
--- a/src/xenbus/debug.c
+++ b/src/xenbus/debug.c
@@ -427,6 +427,14 @@ DebugGetInterface(
     return status;
 }   
 
+ULONG
+DebugGetReferences(
+    IN  PXENBUS_DEBUG_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 DebugTeardown(
     IN  PXENBUS_DEBUG_CONTEXT   Context
@@ -444,4 +452,3 @@ DebugTeardown(
 
     Trace("<====\n");
 }
-
diff --git a/src/xenbus/debug.h b/src/xenbus/debug.h
index 370f302..dd7ec08 100644
--- a/src/xenbus/debug.h
+++ b/src/xenbus/debug.h
@@ -54,6 +54,11 @@ DebugGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+DebugGetReferences(
+    IN  PXENBUS_DEBUG_CONTEXT   Context
+    );
+
 extern VOID
 DebugTeardown(
     IN  PXENBUS_DEBUG_CONTEXT   Context
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index 4a6ebd2..5769cf3 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -1880,6 +1880,14 @@ EvtchnGetInterface(
     return status;
 }   
 
+ULONG
+EvtchnGetReferences(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/evtchn.h b/src/xenbus/evtchn.h
index 69b557e..31250b2 100644
--- a/src/xenbus/evtchn.h
+++ b/src/xenbus/evtchn.h
@@ -54,6 +54,11 @@ EvtchnGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+EvtchnGetReferences(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    );
+
 extern VOID
 EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index ce4840c..e889871 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3206,6 +3206,17 @@ FdoS3ToS4(
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     ASSERT3U(__FdoGetSystemPowerState(Fdo), ==, PowerSystemSleeping3);
 
+    BUG_ON(SuspendGetReferences(Fdo->SuspendContext) != 0);
+    BUG_ON(SharedInfoGetReferences(Fdo->SharedInfoContext) != 0);
+    BUG_ON(EvtchnGetReferences(Fdo->EvtchnContext) != 0);
+    BUG_ON(DebugGetReferences(Fdo->DebugContext) != 0);
+    BUG_ON(StoreGetReferences(Fdo->StoreContext) != 0);
+    BUG_ON(RangeSetGetReferences(Fdo->RangeSetContext) != 0);
+    BUG_ON(CacheGetReferences(Fdo->CacheContext) != 0);
+    BUG_ON(GnttabGetReferences(Fdo->GnttabContext) != 0);
+    BUG_ON(UnplugGetReferences(Fdo->UnplugContext) != 0);
+    BUG_ON(BalloonGetReferences(Fdo->BalloonContext) != 0);
+
     __FdoSetSystemPowerState(Fdo, PowerSystemHibernate);
 
     Trace("<====\n");
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 9057eed..56158d8 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -1058,6 +1058,14 @@ GnttabGetInterface(
     return status;
 }   
 
+ULONG
+GnttabGetReferences(
+    IN  PXENBUS_GNTTAB_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 GnttabTeardown(
     IN  PXENBUS_GNTTAB_CONTEXT  Context
diff --git a/src/xenbus/gnttab.h b/src/xenbus/gnttab.h
index 0214a9e..a8cf409 100644
--- a/src/xenbus/gnttab.h
+++ b/src/xenbus/gnttab.h
@@ -54,6 +54,11 @@ GnttabGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+GnttabGetReferences(
+    IN  PXENBUS_GNTTAB_CONTEXT  Context
+    );
+
 extern VOID
 GnttabTeardown(
     IN  PXENBUS_GNTTAB_CONTEXT  Context
diff --git a/src/xenbus/range_set.c b/src/xenbus/range_set.c
index a0b1311..1ce113f 100644
--- a/src/xenbus/range_set.c
+++ b/src/xenbus/range_set.c
@@ -869,6 +869,14 @@ RangeSetGetInterface(
     return status;
 }   
 
+ULONG
+RangeSetGetReferences(
+    IN  PXENBUS_RANGE_SET_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 RangeSetTeardown(
     IN  PXENBUS_RANGE_SET_CONTEXT   Context
@@ -889,5 +897,3 @@ RangeSetTeardown(
 
     Trace("<====\n");
 }
-
-
diff --git a/src/xenbus/range_set.h b/src/xenbus/range_set.h
index 6af8f27..a150fda 100644
--- a/src/xenbus/range_set.h
+++ b/src/xenbus/range_set.h
@@ -54,6 +54,11 @@ RangeSetGetInterface(
     IN      ULONG                       Size
     );
 
+extern ULONG
+RangeSetGetReferences(
+    IN  PXENBUS_RANGE_SET_CONTEXT   Context
+    );
+
 extern VOID
 RangeSetTeardown(
     IN  PXENBUS_RANGE_SET_CONTEXT   Context
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 1279ac4..01621ac 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -794,6 +794,14 @@ SharedInfoGetInterface(
     return status;
 }   
 
+ULONG
+SharedInfoGetReferences(
+    IN  PXENBUS_SHARED_INFO_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 SharedInfoTeardown(
     IN  PXENBUS_SHARED_INFO_CONTEXT Context
@@ -816,4 +824,3 @@ SharedInfoTeardown(
 
     Trace("<====\n");
 }
-
diff --git a/src/xenbus/shared_info.h b/src/xenbus/shared_info.h
index 74d72b8..2d52576 100644
--- a/src/xenbus/shared_info.h
+++ b/src/xenbus/shared_info.h
@@ -54,6 +54,11 @@ SharedInfoGetInterface(
     IN      ULONG                       Size
     );
 
+extern ULONG
+SharedInfoGetReferences(
+    IN  PXENBUS_SHARED_INFO_CONTEXT Context
+    );
+
 extern VOID
 SharedInfoTeardown(
     IN  PXENBUS_SHARED_INFO_CONTEXT Context
diff --git a/src/xenbus/store.c b/src/xenbus/store.c
index dc4e7f3..dad0f39 100644
--- a/src/xenbus/store.c
+++ b/src/xenbus/store.c
@@ -2107,6 +2107,9 @@ StoreDisable(
     IN PXENBUS_STORE_CONTEXT    Context
     )
 {
+    LogPrintf(LOG_LEVEL_INFO,
+              "STORE: DISABLE\n");
+
     Context->Enabled = FALSE;
 
     XENBUS_EVTCHN(Close,
@@ -2129,10 +2132,6 @@ StoreEnable(
 
     Port = (ULONG)Value;
 
-    LogPrintf(LOG_LEVEL_INFO,
-              "STORE: EVTCHN %u\n",
-              Port);
-
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Context->EvtchnInterface,
                                      XENBUS_EVTCHN_TYPE_FIXED,
@@ -2149,6 +2148,10 @@ StoreEnable(
 
     Context->Enabled = TRUE;
 
+    LogPrintf(LOG_LEVEL_INFO,
+              "STORE: ENABLE (%u)\n",
+              Port);
+
     // Trigger an initial poll
     KeInsertQueueDpc(&Context->Dpc, NULL, NULL);
 }
@@ -2770,6 +2773,14 @@ StoreGetInterface(
     return status;
 }   
 
+ULONG
+StoreGetReferences(
+    IN  PXENBUS_STORE_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 StoreTeardown(
     IN  PXENBUS_STORE_CONTEXT   Context
diff --git a/src/xenbus/store.h b/src/xenbus/store.h
index 6455ca0..54fff9d 100644
--- a/src/xenbus/store.h
+++ b/src/xenbus/store.h
@@ -54,6 +54,11 @@ StoreGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+StoreGetReferences(
+    IN  PXENBUS_STORE_CONTEXT   Context
+    );
+
 extern VOID
 StoreTeardown(
     IN  PXENBUS_STORE_CONTEXT   Context
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index fad35e4..d272862 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -468,6 +468,14 @@ SuspendGetInterface(
     return status;
 }   
 
+ULONG
+SuspendGetReferences(
+    IN  PXENBUS_SUSPEND_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 SuspendTeardown(
     IN  PXENBUS_SUSPEND_CONTEXT Context
diff --git a/src/xenbus/suspend.h b/src/xenbus/suspend.h
index df0e185..4a36e07 100644
--- a/src/xenbus/suspend.h
+++ b/src/xenbus/suspend.h
@@ -54,6 +54,11 @@ SuspendGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+SuspendGetReferences(
+    IN  PXENBUS_SUSPEND_CONTEXT Context
+    );
+
 extern VOID
 SuspendTeardown(
     IN  PXENBUS_SUSPEND_CONTEXT Context
diff --git a/src/xenbus/unplug.c b/src/xenbus/unplug.c
index 0a1b27a..7414b0c 100644
--- a/src/xenbus/unplug.c
+++ b/src/xenbus/unplug.c
@@ -224,6 +224,14 @@ UnplugGetInterface(
     return status;
 }
 
+ULONG
+UnplugGetReferences(
+    IN  PXENBUS_UNPLUG_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 UnplugTeardown(
     IN  PXENBUS_UNPLUG_CONTEXT  Context
diff --git a/src/xenbus/unplug.h b/src/xenbus/unplug.h
index 416b2d4..6a2382d 100644
--- a/src/xenbus/unplug.h
+++ b/src/xenbus/unplug.h
@@ -54,6 +54,11 @@ UnplugGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+UnplugGetReferences(
+    IN  PXENBUS_UNPLUG_CONTEXT   Context
+    );
+
 extern VOID
 UnplugTeardown(
     IN  PXENBUS_UNPLUG_CONTEXT   Context
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 12:41:27 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 12:41:27 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TCQ-0007K5-VP; Thu, 03 Dec 2015 12:41:26 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TCO-0007Jb-JR
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 12:41:24 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	40/E1-31122-37830665; Thu, 03 Dec 2015 12:41:23 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1449146478!3396611!1
X-Originating-IP: [209.85.160.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3337 invoked from network); 3 Dec 2015 12:41:20 -0000
Received: from mail-yk0-f174.google.com (HELO mail-yk0-f174.google.com)
	(209.85.160.174)
	by server-14.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 12:41:20 -0000
Received: by ykba77 with SMTP id a77so83500272ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 04:41:18 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=1DUCpvGrhX9Ce/aJ/tVUgvH1FQsA4tM2KlJPAt3UcVw=;
	b=NexZrFlITFhWY5Oryzitip30V5dNGLnAvTLTai9ggGs5TC14ffejjjuRsXY/B6S1ys
	PJylm2SqFLGK+oy4lQTHeqF9TmWNYNT80R7URMph7BHh78xQYS8EcKZmRPFUinT9+mY0
	hqjD3vdMNe674HEMQC8GfwjBzRfhWDr/Yg8t0IvVhRt7dBCgLCfTFL9/c2lzzM1SgfvD
	ojAfg1t/P6z3DWMuW4KeM/MiMZnGf7c/lOBpIFoJuUt6mkW+a504b5O8m05EmKxp981B
	sGP9SnPSN3nROPwnExI6siPRQD7t7dJlqENGixsRGmEx93giiSauDc0Ua3yfm7cG0sz7
	0pNA==
X-Received: by 10.129.133.2 with SMTP id v2mr7104892ywf.76.1449146478403;
	Thu, 03 Dec 2015 04:41:18 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id x7sm5377068ywf.35.2015.12.03.04.41.17
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 04:41:17 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 12:41:06 +0000
Message-Id: <1449146467-1480-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1 1/2] Verify that all interfaces have
	been released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch adds BUG_ONs to ensure this is the case.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/balloon.c     |  8 ++++++++
 src/xenbus/balloon.h     |  5 +++++
 src/xenbus/cache.c       |  8 ++++++++
 src/xenbus/cache.h       |  5 +++++
 src/xenbus/debug.c       |  9 ++++++++-
 src/xenbus/debug.h       |  5 +++++
 src/xenbus/evtchn.c      |  8 ++++++++
 src/xenbus/evtchn.h      |  5 +++++
 src/xenbus/fdo.c         | 11 +++++++++++
 src/xenbus/gnttab.c      |  8 ++++++++
 src/xenbus/gnttab.h      |  5 +++++
 src/xenbus/range_set.c   | 10 ++++++++--
 src/xenbus/range_set.h   |  5 +++++
 src/xenbus/shared_info.c |  9 ++++++++-
 src/xenbus/shared_info.h |  5 +++++
 src/xenbus/store.c       | 19 +++++++++++++++----
 src/xenbus/store.h       |  5 +++++
 src/xenbus/suspend.c     |  8 ++++++++
 src/xenbus/suspend.h     |  5 +++++
 src/xenbus/unplug.c      |  8 ++++++++
 src/xenbus/unplug.h      |  5 +++++
 21 files changed, 148 insertions(+), 8 deletions(-)

diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index 2dc4a6c..1b3f5fa 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -987,6 +987,14 @@ BalloonGetInterface(
     return status;
 }   
 
+ULONG
+BalloonGetReferences(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 BalloonTeardown(
     IN  PXENBUS_BALLOON_CONTEXT Context
diff --git a/src/xenbus/balloon.h b/src/xenbus/balloon.h
index cc47d7d..03570f3 100644
--- a/src/xenbus/balloon.h
+++ b/src/xenbus/balloon.h
@@ -54,6 +54,11 @@ BalloonGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+BalloonGetReferences(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    );
+
 extern VOID
 BalloonTeardown(
     IN  PXENBUS_BALLOON_CONTEXT Context
diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 83993ca..9727b14 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -1014,6 +1014,14 @@ CacheGetInterface(
     return status;
 }   
 
+ULONG
+CacheGetReferences(
+    IN  PXENBUS_CACHE_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 CacheTeardown(
     IN  PXENBUS_CACHE_CONTEXT   Context
diff --git a/src/xenbus/cache.h b/src/xenbus/cache.h
index 582c77d..be94973 100644
--- a/src/xenbus/cache.h
+++ b/src/xenbus/cache.h
@@ -54,6 +54,11 @@ CacheGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+CacheGetReferences(
+    IN  PXENBUS_CACHE_CONTEXT   Context
+    );
+
 extern VOID
 CacheTeardown(
     IN  PXENBUS_CACHE_CONTEXT   Context
diff --git a/src/xenbus/debug.c b/src/xenbus/debug.c
index bd62b51..7b2ec73 100644
--- a/src/xenbus/debug.c
+++ b/src/xenbus/debug.c
@@ -427,6 +427,14 @@ DebugGetInterface(
     return status;
 }   
 
+ULONG
+DebugGetReferences(
+    IN  PXENBUS_DEBUG_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 DebugTeardown(
     IN  PXENBUS_DEBUG_CONTEXT   Context
@@ -444,4 +452,3 @@ DebugTeardown(
 
     Trace("<====\n");
 }
-
diff --git a/src/xenbus/debug.h b/src/xenbus/debug.h
index 370f302..dd7ec08 100644
--- a/src/xenbus/debug.h
+++ b/src/xenbus/debug.h
@@ -54,6 +54,11 @@ DebugGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+DebugGetReferences(
+    IN  PXENBUS_DEBUG_CONTEXT   Context
+    );
+
 extern VOID
 DebugTeardown(
     IN  PXENBUS_DEBUG_CONTEXT   Context
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index 4a6ebd2..5769cf3 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -1880,6 +1880,14 @@ EvtchnGetInterface(
     return status;
 }   
 
+ULONG
+EvtchnGetReferences(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/evtchn.h b/src/xenbus/evtchn.h
index 69b557e..31250b2 100644
--- a/src/xenbus/evtchn.h
+++ b/src/xenbus/evtchn.h
@@ -54,6 +54,11 @@ EvtchnGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+EvtchnGetReferences(
+    IN  PXENBUS_EVTCHN_CONTEXT  Context
+    );
+
 extern VOID
 EvtchnTeardown(
     IN  PXENBUS_EVTCHN_CONTEXT  Context
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index ce4840c..e889871 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3206,6 +3206,17 @@ FdoS3ToS4(
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     ASSERT3U(__FdoGetSystemPowerState(Fdo), ==, PowerSystemSleeping3);
 
+    BUG_ON(SuspendGetReferences(Fdo->SuspendContext) != 0);
+    BUG_ON(SharedInfoGetReferences(Fdo->SharedInfoContext) != 0);
+    BUG_ON(EvtchnGetReferences(Fdo->EvtchnContext) != 0);
+    BUG_ON(DebugGetReferences(Fdo->DebugContext) != 0);
+    BUG_ON(StoreGetReferences(Fdo->StoreContext) != 0);
+    BUG_ON(RangeSetGetReferences(Fdo->RangeSetContext) != 0);
+    BUG_ON(CacheGetReferences(Fdo->CacheContext) != 0);
+    BUG_ON(GnttabGetReferences(Fdo->GnttabContext) != 0);
+    BUG_ON(UnplugGetReferences(Fdo->UnplugContext) != 0);
+    BUG_ON(BalloonGetReferences(Fdo->BalloonContext) != 0);
+
     __FdoSetSystemPowerState(Fdo, PowerSystemHibernate);
 
     Trace("<====\n");
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 9057eed..56158d8 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -1058,6 +1058,14 @@ GnttabGetInterface(
     return status;
 }   
 
+ULONG
+GnttabGetReferences(
+    IN  PXENBUS_GNTTAB_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 GnttabTeardown(
     IN  PXENBUS_GNTTAB_CONTEXT  Context
diff --git a/src/xenbus/gnttab.h b/src/xenbus/gnttab.h
index 0214a9e..a8cf409 100644
--- a/src/xenbus/gnttab.h
+++ b/src/xenbus/gnttab.h
@@ -54,6 +54,11 @@ GnttabGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+GnttabGetReferences(
+    IN  PXENBUS_GNTTAB_CONTEXT  Context
+    );
+
 extern VOID
 GnttabTeardown(
     IN  PXENBUS_GNTTAB_CONTEXT  Context
diff --git a/src/xenbus/range_set.c b/src/xenbus/range_set.c
index a0b1311..1ce113f 100644
--- a/src/xenbus/range_set.c
+++ b/src/xenbus/range_set.c
@@ -869,6 +869,14 @@ RangeSetGetInterface(
     return status;
 }   
 
+ULONG
+RangeSetGetReferences(
+    IN  PXENBUS_RANGE_SET_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 RangeSetTeardown(
     IN  PXENBUS_RANGE_SET_CONTEXT   Context
@@ -889,5 +897,3 @@ RangeSetTeardown(
 
     Trace("<====\n");
 }
-
-
diff --git a/src/xenbus/range_set.h b/src/xenbus/range_set.h
index 6af8f27..a150fda 100644
--- a/src/xenbus/range_set.h
+++ b/src/xenbus/range_set.h
@@ -54,6 +54,11 @@ RangeSetGetInterface(
     IN      ULONG                       Size
     );
 
+extern ULONG
+RangeSetGetReferences(
+    IN  PXENBUS_RANGE_SET_CONTEXT   Context
+    );
+
 extern VOID
 RangeSetTeardown(
     IN  PXENBUS_RANGE_SET_CONTEXT   Context
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 1279ac4..01621ac 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -794,6 +794,14 @@ SharedInfoGetInterface(
     return status;
 }   
 
+ULONG
+SharedInfoGetReferences(
+    IN  PXENBUS_SHARED_INFO_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 SharedInfoTeardown(
     IN  PXENBUS_SHARED_INFO_CONTEXT Context
@@ -816,4 +824,3 @@ SharedInfoTeardown(
 
     Trace("<====\n");
 }
-
diff --git a/src/xenbus/shared_info.h b/src/xenbus/shared_info.h
index 74d72b8..2d52576 100644
--- a/src/xenbus/shared_info.h
+++ b/src/xenbus/shared_info.h
@@ -54,6 +54,11 @@ SharedInfoGetInterface(
     IN      ULONG                       Size
     );
 
+extern ULONG
+SharedInfoGetReferences(
+    IN  PXENBUS_SHARED_INFO_CONTEXT Context
+    );
+
 extern VOID
 SharedInfoTeardown(
     IN  PXENBUS_SHARED_INFO_CONTEXT Context
diff --git a/src/xenbus/store.c b/src/xenbus/store.c
index dc4e7f3..dad0f39 100644
--- a/src/xenbus/store.c
+++ b/src/xenbus/store.c
@@ -2107,6 +2107,9 @@ StoreDisable(
     IN PXENBUS_STORE_CONTEXT    Context
     )
 {
+    LogPrintf(LOG_LEVEL_INFO,
+              "STORE: DISABLE\n");
+
     Context->Enabled = FALSE;
 
     XENBUS_EVTCHN(Close,
@@ -2129,10 +2132,6 @@ StoreEnable(
 
     Port = (ULONG)Value;
 
-    LogPrintf(LOG_LEVEL_INFO,
-              "STORE: EVTCHN %u\n",
-              Port);
-
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Context->EvtchnInterface,
                                      XENBUS_EVTCHN_TYPE_FIXED,
@@ -2149,6 +2148,10 @@ StoreEnable(
 
     Context->Enabled = TRUE;
 
+    LogPrintf(LOG_LEVEL_INFO,
+              "STORE: ENABLE (%u)\n",
+              Port);
+
     // Trigger an initial poll
     KeInsertQueueDpc(&Context->Dpc, NULL, NULL);
 }
@@ -2770,6 +2773,14 @@ StoreGetInterface(
     return status;
 }   
 
+ULONG
+StoreGetReferences(
+    IN  PXENBUS_STORE_CONTEXT   Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 StoreTeardown(
     IN  PXENBUS_STORE_CONTEXT   Context
diff --git a/src/xenbus/store.h b/src/xenbus/store.h
index 6455ca0..54fff9d 100644
--- a/src/xenbus/store.h
+++ b/src/xenbus/store.h
@@ -54,6 +54,11 @@ StoreGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+StoreGetReferences(
+    IN  PXENBUS_STORE_CONTEXT   Context
+    );
+
 extern VOID
 StoreTeardown(
     IN  PXENBUS_STORE_CONTEXT   Context
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index fad35e4..d272862 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -468,6 +468,14 @@ SuspendGetInterface(
     return status;
 }   
 
+ULONG
+SuspendGetReferences(
+    IN  PXENBUS_SUSPEND_CONTEXT Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 SuspendTeardown(
     IN  PXENBUS_SUSPEND_CONTEXT Context
diff --git a/src/xenbus/suspend.h b/src/xenbus/suspend.h
index df0e185..4a36e07 100644
--- a/src/xenbus/suspend.h
+++ b/src/xenbus/suspend.h
@@ -54,6 +54,11 @@ SuspendGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+SuspendGetReferences(
+    IN  PXENBUS_SUSPEND_CONTEXT Context
+    );
+
 extern VOID
 SuspendTeardown(
     IN  PXENBUS_SUSPEND_CONTEXT Context
diff --git a/src/xenbus/unplug.c b/src/xenbus/unplug.c
index 0a1b27a..7414b0c 100644
--- a/src/xenbus/unplug.c
+++ b/src/xenbus/unplug.c
@@ -224,6 +224,14 @@ UnplugGetInterface(
     return status;
 }
 
+ULONG
+UnplugGetReferences(
+    IN  PXENBUS_UNPLUG_CONTEXT  Context
+    )
+{
+    return Context->References;
+}
+
 VOID
 UnplugTeardown(
     IN  PXENBUS_UNPLUG_CONTEXT  Context
diff --git a/src/xenbus/unplug.h b/src/xenbus/unplug.h
index 416b2d4..6a2382d 100644
--- a/src/xenbus/unplug.h
+++ b/src/xenbus/unplug.h
@@ -54,6 +54,11 @@ UnplugGetInterface(
     IN      ULONG                   Size
     );
 
+extern ULONG
+UnplugGetReferences(
+    IN  PXENBUS_UNPLUG_CONTEXT   Context
+    );
+
 extern VOID
 UnplugTeardown(
     IN  PXENBUS_UNPLUG_CONTEXT   Context
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 12:43:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 12:43:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TEH-0007RX-9k; Thu, 03 Dec 2015 12:43:21 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TEG-0007R8-Es
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 12:43:20 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	AE/F2-16870-7E830665; Thu, 03 Dec 2015 12:43:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1449146597!8333809!1
X-Originating-IP: [209.85.160.177]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 36199 invoked from network); 3 Dec 2015 12:43:18 -0000
Received: from mail-yk0-f177.google.com (HELO mail-yk0-f177.google.com)
	(209.85.160.177)
	by server-5.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 12:43:18 -0000
Received: by ykdr82 with SMTP id r82so83502403ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 04:43:17 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=5hW7vAWZ6kv3jVjv+MWjEJ0LiJmSIW+gcUnncGmh8fQ=;
	b=c7+Ukzw4zDhUJYkHur1aqiTd8vuS8aLN5ghBmoLGvHS9gBQp3wElK6UwyB1DA/reTg
	VQt8KPTCZVT5f4M6XO10m+/IMgKPue8OVrFZQqkdhEwbXivWSCh0807OLur9nCIcpiEV
	03iFV40PyX5lU83pHbS4ejW4eyviCjXOs3Q9qG1zRHsrJVOTf5Qq8tt93fKyX+GzqeUd
	G6bCBL6WRh76m+HZPXeTYPNA9mQCT8GChWhmGAl0+VW23yOpse9TTp15bYJwNmt/Qwr/
	Q9wWQ/eCfrREeIJ9ykD7CRMs41Bmzw1DlxVRN/1dqODJHA7UP+FnfHviNH7QX82hG5S0
	zTCQ==
X-Received: by 10.129.82.84 with SMTP id g81mr6062961ywb.335.1449146597387;
	Thu, 03 Dec 2015 04:43:17 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	c20sm5386161ywa.29.2015.12.03.04.43.16
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 04:43:17 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 12:42:56 +0000
Message-Id: <1449146576-15460-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1] Make sure XENBUS interfaces are
	released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch fixes code paths where this was not being done.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/receiver.c    | 249 +++++++++++++------------
 src/xenvif/transmitter.c | 461 +++++++++++++++++++++++------------------------
 src/xenvif/vif.c         | 138 ++++++++------
 3 files changed, 435 insertions(+), 413 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index abe617d..c6f64b5 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -2129,7 +2129,6 @@ __ReceiverRingInitialize(
     )
 {
     PXENVIF_FRONTEND            Frontend;
-    CHAR                        Name[MAXNAMELEN];
     NTSTATUS                    status;
 
     Frontend = Receiver->Frontend;
@@ -2153,86 +2152,14 @@ __ReceiverRingInitialize(
 
     KeInitializeDpc(&(*Ring)->Dpc, ReceiverRingDpc, *Ring);
 
-    status = RtlStringCbPrintfA(Name,
-                                sizeof (Name),
-                                "%s_receiver_packet",
-                                (*Ring)->Path);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    for (Index = 0; Name[Index] != '\0'; Index++)
-        if (Name[Index] == '/')
-            Name[Index] = '_';
-
-    status = XENBUS_CACHE(Create,
-                          &Receiver->CacheInterface,
-                          Name,
-                          sizeof (XENVIF_RECEIVER_PACKET),
-                          0,
-                          ReceiverPacketCtor,
-                          ReceiverPacketDtor,
-                          ReceiverRingAcquireLock,
-                          ReceiverRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->PacketCache);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    status = RtlStringCbPrintfA(Name,
-                                sizeof (Name),
-                                "%s_receiver_fragment",
-                                (*Ring)->Path);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
-    for (Index = 0; Name[Index] != '\0'; Index++)
-        if (Name[Index] == '/')
-            Name[Index] = '_';
-
-    status = XENBUS_CACHE(Create,
-                          &Receiver->CacheInterface,
-                          Name,
-                          sizeof (XENVIF_RECEIVER_FRAGMENT),
-                          0,
-                          ReceiverFragmentCtor,
-                          ReceiverFragmentDtor,
-                          ReceiverRingAcquireLock,
-                          ReceiverRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->FragmentCache);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
     status = ThreadCreate(ReceiverRingWatchdog,
                           *Ring,
                           &(*Ring)->WatchdogThread);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail3;
 
     return STATUS_SUCCESS;
 
-fail7:
-    Error("fail7\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 (*Ring)->FragmentCache);
-    (*Ring)->FragmentCache = NULL;
-
-fail6:
-    Error("fail6\n");
-
-fail5:
-    Error("fail5\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 (*Ring)->PacketCache);
-    (*Ring)->PacketCache = NULL;
-
-fail4:
-    Error("fail4\n");
-
 fail3:
     Error("fail3\n");
 
@@ -2279,7 +2206,7 @@ __ReceiverRingConnect(
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
-                                "%s_receiver",
+                                "%s_receiver_packet",
                                 Ring->Path);
     if (!NT_SUCCESS(status))
         goto fail1;
@@ -2288,6 +2215,56 @@ __ReceiverRingConnect(
         if (Name[Index] == '/')
             Name[Index] = '_';
 
+    status = XENBUS_CACHE(Create,
+                          &Receiver->CacheInterface,
+                          Name,
+                          sizeof (XENVIF_RECEIVER_PACKET),
+                          0,
+                          ReceiverPacketCtor,
+                          ReceiverPacketDtor,
+                          ReceiverRingAcquireLock,
+                          ReceiverRingReleaseLock,
+                          Ring,
+                          &Ring->PacketCache);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlStringCbPrintfA(Name,
+                                sizeof (Name),
+                                "%s_receiver_fragment",
+                                Ring->Path);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    for (Index = 0; Name[Index] != '\0'; Index++)
+        if (Name[Index] == '/')
+            Name[Index] = '_';
+
+    status = XENBUS_CACHE(Create,
+                          &Receiver->CacheInterface,
+                          Name,
+                          sizeof (XENVIF_RECEIVER_FRAGMENT),
+                          0,
+                          ReceiverFragmentCtor,
+                          ReceiverFragmentDtor,
+                          ReceiverRingAcquireLock,
+                          ReceiverRingReleaseLock,
+                          Ring,
+                          &Ring->FragmentCache);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    status = RtlStringCbPrintfA(Name,
+                                sizeof (Name),
+                                "%s_receiver",
+                                Ring->Path);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    for (Index = 0; Name[Index] != '\0'; Index++)
+        if (Name[Index] == '/')
+            Name[Index] = '_';
+
     status = XENBUS_GNTTAB(CreateCache,
                            &Receiver->GnttabInterface,
                            Name,
@@ -2297,13 +2274,13 @@ __ReceiverRingConnect(
                            Ring,
                            &Ring->GnttabCache);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail6;
 
     Ring->Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail3;
+        goto fail7;
 
     Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
     ASSERT(Ring->Shared != NULL);
@@ -2323,14 +2300,14 @@ __ReceiverRingConnect(
                            FALSE,
                            &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail8;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 __MODULE__ "|RECEIVER[%u]",
                                 Ring->Index);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail9;
 
     ASSERT(!Ring->Connected);
 
@@ -2344,7 +2321,7 @@ __ReceiverRingConnect(
 
     status = STATUS_UNSUCCESSFUL;
     if (Ring->Channel == NULL)
-        goto fail6;
+        goto fail10;
 
     status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
     ASSERT(NT_SUCCESS(status));
@@ -2371,12 +2348,12 @@ __ReceiverRingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail11;
 
     return STATUS_SUCCESS;
 
-fail7:
-    Error("fail7\n");
+fail11:
+    Error("fail11\n");
 
     Ring->Connected = FALSE;
 
@@ -2387,11 +2364,11 @@ fail7:
 
     Ring->Events = 0;
 
-fail6:
-    Error("fail6\n");
+fail10:
+    Error("fail10\n");
 
-fail5:
-    Error("fail5\n");
+fail9:
+    Error("fail9\n");
 
     (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
                          &Receiver->GnttabInterface,
@@ -2400,8 +2377,8 @@ fail5:
                          Ring->Entry);
     Ring->Entry = NULL;
 
-fail4:
-    Error("fail4\n");
+fail8:
+    Error("fail8\n");
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -2410,14 +2387,36 @@ fail4:
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
-fail3:
-    Error("fail3\n");
+fail7:
+    Error("fail7\n");
 
     XENBUS_GNTTAB(DestroyCache,
                   &Receiver->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
 
+fail6:
+    Error("fail6\n");
+
+fail5:
+    Error("fail5\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->PacketCache);
+    Ring->PacketCache = NULL;
+
 fail2:
     Error("fail2\n");
 
@@ -2590,6 +2589,16 @@ __ReceiverRingDisconnect(
                   &Receiver->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->PacketCache);
+    Ring->PacketCache = NULL;
 }
 
 static FORCEINLINE VOID
@@ -2613,16 +2622,6 @@ __ReceiverRingTeardown(
     ThreadJoin(Ring->WatchdogThread);
     Ring->WatchdogThread = NULL;
 
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 Ring->FragmentCache);
-    Ring->FragmentCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 Ring->PacketCache);
-    Ring->PacketCache = NULL;
-
     ASSERT(IsListEmpty(&Ring->PacketList));
     RtlZeroMemory(&Ring->PacketList, sizeof (LIST_ENTRY));
 
@@ -2778,17 +2777,13 @@ ReceiverInitialize(
 
     (*Receiver)->Frontend = Frontend;
 
-    status = XENBUS_CACHE(Acquire, &(*Receiver)->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     (*Receiver)->MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Receiver)->Ring = __ReceiverAllocate(sizeof (PXENVIF_RECEIVER_RING) *
                                            (*Receiver)->MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Receiver)->Ring == NULL)
-        goto fail3;
+        goto fail2;
 
     Index = 0;
     while (Index < (*Receiver)->MaxQueues) {
@@ -2796,7 +2791,7 @@ ReceiverInitialize(
 
         status = __ReceiverRingInitialize(*Receiver, Index, &Ring);
         if (!NT_SUCCESS(status))
-            goto fail4;
+            goto fail3;
 
         (*Receiver)->Ring[Index] = Ring;
         Index++;
@@ -2804,8 +2799,8 @@ ReceiverInitialize(
 
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
+fail3:
+    Error("fail3\n");
 
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = (*Receiver)->Ring[Index];
@@ -2815,18 +2810,13 @@ fail4:
     }
 
     __ReceiverFree((*Receiver)->Ring);
-    (*Receiver)->Ring = NULL;
-
-fail3:
-    Error("fail3\n");
-
-    (*Receiver)->MaxQueues = 0;
 
-    XENBUS_CACHE(Release, &(*Receiver)->CacheInterface);
+    (*Receiver)->Ring = NULL;
 
 fail2:
     Error("fail2\n");
 
+    (*Receiver)->MaxQueues = 0;
     (*Receiver)->Frontend = NULL;
 
     RtlZeroMemory(&(*Receiver)->EvtchnInterface,
@@ -2888,10 +2878,14 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = XENBUS_GNTTAB(Acquire, &Receiver->GnttabInterface);
+    status = XENBUS_CACHE(Acquire, &Receiver->CacheInterface);
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    status = XENBUS_GNTTAB(Acquire, &Receiver->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
     status = XENBUS_STORE(Read,
                           &Receiver->StoreInterface,
                           NULL,
@@ -2917,7 +2911,7 @@ ReceiverConnect(
 
         status = __ReceiverRingConnect(Ring);
         if (!NT_SUCCESS(status))
-            goto fail5;
+            goto fail6;
 
         Index++;
     }    
@@ -2929,18 +2923,18 @@ ReceiverConnect(
                           Receiver,
                           &Receiver->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
+fail7:
+    Error("fail7\n");
 
     Index = Receiver->NumQueues;
 
-fail5:
-    Error("fail5\n");
+fail6:
+    Error("fail6\n");
 
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
@@ -2952,6 +2946,11 @@ fail5:
 
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
+fail5:
+    Error("fail5\n");
+
+    XENBUS_CACHE(Release, &Receiver->CacheInterface);
+
 fail4:
     Error("fail4\n");
 
@@ -3230,6 +3229,8 @@ ReceiverDisconnect(
 
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
+    XENBUS_CACHE(Release, &Receiver->CacheInterface);
+
     XENBUS_EVTCHN(Release, &Receiver->EvtchnInterface);
 
     XENBUS_STORE(Release, &Receiver->StoreInterface);
@@ -3265,8 +3266,6 @@ ReceiverTeardown(
     Receiver->Ring = NULL;
     Receiver->MaxQueues = 0;
 
-    XENBUS_CACHE(Release, &Receiver->CacheInterface);
-
     Receiver->Frontend = NULL;
 
     RtlZeroMemory(&Receiver->EvtchnInterface,
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 8759be1..5f84eb5 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -3020,7 +3020,6 @@ __TransmitterRingInitialize(
     )
 {
     PXENVIF_FRONTEND                Frontend;
-    CHAR                            Name[MAXNAMELEN];
     NTSTATUS                        status;
 
     Frontend = Transmitter->Frontend;
@@ -3044,12 +3043,66 @@ __TransmitterRingInitialize(
 
     KeInitializeDpc(&(*Ring)->Dpc, TransmitterRingDpc, *Ring);
 
+    status = ThreadCreate(TransmitterRingWatchdog,
+                          *Ring,
+                          &(*Ring)->WatchdogThread);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+    RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC));
+
+    RtlZeroMemory(&(*Ring)->PacketComplete, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&(*Ring)->RequestQueue, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&(*Ring)->PacketQueue, sizeof (LIST_ENTRY));
+
+    FrontendFreePath(Frontend, (*Ring)->Path);
+    (*Ring)->Path = NULL;
+
+fail2:
+    Error("fail2\n");
+
+    (*Ring)->Index = 0;
+    (*Ring)->Transmitter = NULL;
+
+    ASSERT(IsZeroMemory(*Ring, sizeof (XENVIF_TRANSMITTER_RING)));
+    __TransmitterFree(*Ring);
+    *Ring = NULL;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static FORCEINLINE NTSTATUS
+__TransmitterRingConnect(
+    IN  PXENVIF_TRANSMITTER_RING    Ring
+    )
+{
+    PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
+    PFN_NUMBER                      Pfn;
+    CHAR                            Name[MAXNAMELEN];
+    ULONG                           Index;
+    PROCESSOR_NUMBER                ProcNumber;
+    NTSTATUS                        status;
+
+    ASSERT(!Ring->Connected);
+
+    Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
+
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_buffer",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail1;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3064,17 +3117,17 @@ __TransmitterRingInitialize(
                           TransmitterBufferDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->BufferCache);
+                          Ring,
+                          &Ring->BufferCache);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail2;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_multicast_control",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail3;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3089,17 +3142,17 @@ __TransmitterRingInitialize(
                           TransmitterMulticastControlDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->MulticastControlCache);
+                          Ring,
+                          &Ring->MulticastControlCache);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail4;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_req_id",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail5;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3108,24 +3161,24 @@ __TransmitterRingInitialize(
     status = XENBUS_RANGE_SET(Create,
                               &Transmitter->RangeSetInterface,
                               Name,
-                              &(*Ring)->RangeSet);
+                              &Ring->RangeSet);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail6;
 
     status = XENBUS_RANGE_SET(Put,
                               &Transmitter->RangeSetInterface,
-                              (*Ring)->RangeSet,
+                              Ring->RangeSet,
                               1,
                               XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail7;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_fragment",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail8;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3140,17 +3193,17 @@ __TransmitterRingInitialize(
                           TransmitterFragmentDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->FragmentCache);
+                          Ring,
+                          &Ring->FragmentCache);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail9;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_request",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail12;
+        goto fail10;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3165,135 +3218,17 @@ __TransmitterRingInitialize(
                           TransmitterRequestDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->RequestCache);
-    if (!NT_SUCCESS(status))
-        goto fail13;
-
-    status = ThreadCreate(TransmitterRingWatchdog,
-                          *Ring,
-                          &(*Ring)->WatchdogThread);
+                          Ring,
+                          &Ring->RequestCache);
     if (!NT_SUCCESS(status))
-        goto fail14;
-
-    return STATUS_SUCCESS;
-
-fail14:
-    Error("fail14\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->RequestCache);
-    (*Ring)->RequestCache = NULL;
-
-fail13:
-    Error("fail13\n");
-
-fail12:
-    Error("fail12\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->FragmentCache);
-    (*Ring)->FragmentCache = NULL;
-
-fail11:
-    Error("fail11\n");
-
-fail10:
-    Error("fail10\n");
-
-    (VOID) XENBUS_RANGE_SET(Get,
-                            &Transmitter->RangeSetInterface,
-                            (*Ring)->RangeSet,
-                            1,
-                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
-
-fail9:
-    Error("fail9\n");
-
-    XENBUS_RANGE_SET(Destroy,
-                     &Transmitter->RangeSetInterface,
-                     (*Ring)->RangeSet);
-    (*Ring)->RangeSet = NULL;
-
-fail8:
-    Error("fail8\n");
-
-fail7:
-    Error("fail7\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->MulticastControlCache);
-    (*Ring)->MulticastControlCache = NULL;
-
-fail6:
-    Error("fail6\n");
-
-fail5:
-    Error("fail5\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->BufferCache);
-    (*Ring)->BufferCache = NULL;
-
-fail4:
-    Error("fail4\n");
-
-fail3:
-    Error("fail3\n");
-
-    RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC));
-
-    RtlZeroMemory(&(*Ring)->PacketComplete, sizeof (LIST_ENTRY));
-    RtlZeroMemory(&(*Ring)->RequestQueue, sizeof (LIST_ENTRY));
-    RtlZeroMemory(&(*Ring)->PacketQueue, sizeof (LIST_ENTRY));
-
-    FrontendFreePath(Frontend, (*Ring)->Path);
-    (*Ring)->Path = NULL;
-
-fail2:
-    Error("fail2\n");
-
-    (*Ring)->Index = 0;
-    (*Ring)->Transmitter = NULL;
-
-    ASSERT(IsZeroMemory(*Ring, sizeof (XENVIF_TRANSMITTER_RING)));
-    __TransmitterFree(*Ring);
-    *Ring = NULL;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static FORCEINLINE NTSTATUS
-__TransmitterRingConnect(
-    IN  PXENVIF_TRANSMITTER_RING    Ring
-    )
-{
-    PXENVIF_TRANSMITTER             Transmitter;
-    PXENVIF_FRONTEND                Frontend;
-    PFN_NUMBER                      Pfn;
-    CHAR                            Name[MAXNAMELEN];
-    ULONG                           Index;
-    PROCESSOR_NUMBER                ProcNumber;
-    NTSTATUS                        status;
-
-    ASSERT(!Ring->Connected);
-
-    Transmitter = Ring->Transmitter;
-    Frontend = Transmitter->Frontend;
+        goto fail11;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter",
                                 Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail12;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3308,13 +3243,13 @@ __TransmitterRingConnect(
                            Ring,
                            &Ring->GnttabCache);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail13;
 
     Ring->Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail3;
+        goto fail14;
 
     Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
     ASSERT(Ring->Shared != NULL);
@@ -3334,14 +3269,14 @@ __TransmitterRingConnect(
                            FALSE,
                            &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail15;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 __MODULE__ "|TRANSMITTER[%u]",
                                 Ring->Index);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail16;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
@@ -3356,7 +3291,7 @@ __TransmitterRingConnect(
 
         status = STATUS_UNSUCCESSFUL;
         if (Ring->Channel == NULL)
-            goto fail6;
+            goto fail17;
 
         status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
         ASSERT(NT_SUCCESS(status));
@@ -3382,14 +3317,14 @@ __TransmitterRingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail18;
 
     Ring->Connected = TRUE;
 
     return STATUS_SUCCESS;
 
-fail7:
-    Error("fail7\n");
+fail18:
+    Error("fail18\n");
 
     XENBUS_EVTCHN(Close,
                   &Transmitter->EvtchnInterface,
@@ -3398,11 +3333,11 @@ fail7:
 
     Ring->Events = 0;
 
-fail6:
-    Error("fail6\n");
+fail17:
+    Error("fail17\n");
 
-fail5:
-    Error("fail5\n");
+fail16:
+    Error("fail16\n");
 
     (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
                          &Transmitter->GnttabInterface,
@@ -3411,8 +3346,8 @@ fail5:
                          Ring->Entry);
     Ring->Entry = NULL;
 
-fail4:
-    Error("fail4\n");
+fail15:
+    Error("fail15\n");
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -3421,14 +3356,78 @@ fail4:
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
-fail3:
-    Error("fail3\n");
+fail14:
+    Error("fail14\n");
 
     XENBUS_GNTTAB(DestroyCache,
                   &Transmitter->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
 
+fail13:
+    Error("fail13\n");
+
+fail12:
+    Error("fail12\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->RequestCache);
+    Ring->RequestCache = NULL;
+
+fail11:
+    Error("fail11\n");
+
+fail10:
+    Error("fail10\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+fail9:
+    Error("fail9\n");
+
+fail8:
+    Error("fail8\n");
+
+    (VOID) XENBUS_RANGE_SET(Get,
+                            &Transmitter->RangeSetInterface,
+                            Ring->RangeSet,
+                            1,
+                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
+
+fail7:
+    Error("fail7\n");
+
+    XENBUS_RANGE_SET(Destroy,
+                     &Transmitter->RangeSetInterface,
+                     Ring->RangeSet);
+    Ring->RangeSet = NULL;
+
+fail6:
+    Error("fail6\n");
+
+fail5:
+    Error("fail5\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->MulticastControlCache);
+    Ring->MulticastControlCache = NULL;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->BufferCache);
+    Ring->BufferCache = NULL;
+
 fail2:
     Error("fail2\n");
 
@@ -3660,6 +3659,37 @@ __TransmitterRingDisconnect(
                   &Transmitter->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->RequestCache);
+    Ring->RequestCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+    (VOID) XENBUS_RANGE_SET(Get,
+                            &Transmitter->RangeSetInterface,
+                            Ring->RangeSet,
+                            1,
+                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
+
+    XENBUS_RANGE_SET(Destroy,
+                     &Transmitter->RangeSetInterface,
+                     Ring->RangeSet);
+    Ring->RangeSet = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->MulticastControlCache);
+    Ring->MulticastControlCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->BufferCache);
+    Ring->BufferCache = NULL;
 }
 
 static FORCEINLINE VOID
@@ -3694,37 +3724,6 @@ __TransmitterRingTeardown(
     ThreadJoin(Ring->WatchdogThread);
     Ring->WatchdogThread = NULL;
 
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->RequestCache);
-    Ring->RequestCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->FragmentCache);
-    Ring->FragmentCache = NULL;
-
-    (VOID) XENBUS_RANGE_SET(Get,
-                            &Transmitter->RangeSetInterface,
-                            Ring->RangeSet,
-                            1,
-                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
-
-    XENBUS_RANGE_SET(Destroy,
-                     &Transmitter->RangeSetInterface,
-                     Ring->RangeSet);
-    Ring->RangeSet = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->MulticastControlCache);
-    Ring->MulticastControlCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->BufferCache);
-    Ring->BufferCache = NULL;
-
     ASSERT(IsListEmpty(&Ring->PacketComplete));
     RtlZeroMemory(&Ring->PacketComplete, sizeof (LIST_ENTRY));
 
@@ -4049,21 +4048,13 @@ TransmitterInitialize(
     (*Transmitter)->Frontend = Frontend;
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
-    status = XENBUS_RANGE_SET(Acquire, &(*Transmitter)->RangeSetInterface);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    status = XENBUS_CACHE(Acquire, &(*Transmitter)->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
     (*Transmitter)->MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Transmitter)->Ring = __TransmitterAllocate(sizeof (PXENVIF_TRANSMITTER_RING) *
                                                  (*Transmitter)->MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Transmitter)->Ring == NULL)
-        goto fail4;
+        goto fail2;
 
     Index = 0;
     while (Index < (*Transmitter)->MaxQueues) {
@@ -4071,7 +4062,7 @@ TransmitterInitialize(
 
         status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
         if (!NT_SUCCESS(status))
-            goto fail5;
+            goto fail3;
 
         (*Transmitter)->Ring[Index] = Ring;
         Index++;
@@ -4079,8 +4070,8 @@ TransmitterInitialize(
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail3:
+    Error("fail3\n");
 
     while (--Index > 0) {
         PXENVIF_TRANSMITTER_RING    Ring = (*Transmitter)->Ring[Index];
@@ -4092,21 +4083,11 @@ fail5:
     __TransmitterFree((*Transmitter)->Ring);
     (*Transmitter)->Ring = NULL;
 
-fail4:
-    Error("fail4\n");
-
-    (*Transmitter)->MaxQueues = 0;
-
-    XENBUS_CACHE(Release, &(*Transmitter)->CacheInterface);
-
-fail3:
-    Error("fail3\n");
-
-    XENBUS_RANGE_SET(Release, &(*Transmitter)->RangeSetInterface);
-
 fail2:
     Error("fail2\n");
 
+    (*Transmitter)->MaxQueues = 0;
+
     (*Transmitter)->Frontend = NULL;
 
     RtlZeroMemory(&(*Transmitter)->Lock,
@@ -4167,16 +4148,24 @@ TransmitterConnect(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = XENBUS_GNTTAB(Acquire, &Transmitter->GnttabInterface);
+    status = XENBUS_RANGE_SET(Acquire, &Transmitter->RangeSetInterface);
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    status = XENBUS_CACHE(Acquire, &Transmitter->CacheInterface);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    status = XENBUS_GNTTAB(Acquire, &Transmitter->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_packet",
                                 FrontendGetPath(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail7;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -4194,7 +4183,7 @@ TransmitterConnect(
                           Transmitter,
                           &Transmitter->PacketCache);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail8;
 
     status = XENBUS_STORE(Read,
                           &Transmitter->StoreInterface,
@@ -4237,7 +4226,7 @@ TransmitterConnect(
 
         status = __TransmitterRingConnect(Ring);
         if (!NT_SUCCESS(status))
-            goto fail7;
+            goto fail9;
 
         Index++;
     }    
@@ -4249,18 +4238,18 @@ TransmitterConnect(
                           Transmitter,
                           &Transmitter->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail10;
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail8:
-    Error("fail8\n");
+fail10:
+    Error("fail10\n");
 
     Index = Transmitter->NumQueues;
 
-fail7:
-    Error("fail7\n");
+fail9:
+    Error("fail9\n");
 
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring;
@@ -4277,13 +4266,23 @@ fail7:
                  Transmitter->PacketCache);
     Transmitter->PacketCache = NULL;
 
+fail8:
+    Error("fail8\n");
+
+fail7:
+    Error("fail7\n");
+
+    XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
+
 fail6:
     Error("fail6\n");
 
+    XENBUS_CACHE(Release, &Transmitter->CacheInterface);
+
 fail5:
     Error("fail5\n");
 
-    XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
+    XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
 
 fail4:
     Error("fail4\n");
@@ -4426,6 +4425,10 @@ TransmitterDisconnect(
 
     XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
 
+    XENBUS_CACHE(Release, &Transmitter->CacheInterface);
+
+    XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
+
     XENBUS_EVTCHN(Release, &Transmitter->EvtchnInterface);
 
     XENBUS_STORE(Release, &Transmitter->StoreInterface);
@@ -4457,10 +4460,6 @@ TransmitterTeardown(
     Transmitter->Ring = NULL;
     Transmitter->MaxQueues = 0;
 
-    XENBUS_CACHE(Release, &Transmitter->CacheInterface);
-
-    XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
-
     Transmitter->Frontend = NULL;
 
     RtlZeroMemory(&Transmitter->Lock,
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 556280b..ac4d454 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -115,6 +115,26 @@ VifMac(
     return STATUS_SUCCESS;
 }
 
+static DECLSPEC_NOINLINE VOID
+VifSuspendCallbackLate(
+    IN  PVOID           Argument
+    )
+{
+    PXENVIF_VIF_CONTEXT Context = Argument;
+    NTSTATUS            status;
+
+    if (!Context->Enabled)
+        return;
+
+    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
+    ASSERT(NT_SUCCESS(status));
+
+    // We do this three times to make sure switches take note
+    FrontendAdvertiseIpAddresses(Context->Frontend);
+    FrontendAdvertiseIpAddresses(Context->Frontend);
+    FrontendAdvertiseIpAddresses(Context->Frontend);
+}
+
 static NTSTATUS
 VifEnable(
     IN  PINTERFACE          Interface,
@@ -124,11 +144,13 @@ VifEnable(
 {
     PXENVIF_VIF_CONTEXT     Context = Interface->Context;
     KIRQL                   Irql;
+    BOOLEAN                 Exclusive;
     NTSTATUS                status;
 
     Trace("====>\n");
 
     AcquireMrswLockExclusive(&Context->Lock, &Irql);
+    Exclusive = TRUE;
 
     if (Context->Enabled)
         goto done;
@@ -140,24 +162,74 @@ VifEnable(
 
     KeMemoryBarrier();
 
-    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
+    status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_SUSPEND(Register,
+                            &Context->SuspendInterface,
+                            SUSPEND_CALLBACK_LATE,
+                            VifSuspendCallbackLate,
+                            Context,
+                            &Context->SuspendCallbackLate);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
 done:
+    ASSERT(Exclusive);
     ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
 
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
+fail3:
+    Error("fail3\n");
+
+    (VOID) FrontendSetState(Context->Frontend, FRONTEND_CONNECTED);
+
+    ReleaseMrswLockExclusive(&Context->Lock, Irql, TRUE);
+    Exclusive = FALSE;
+
+    ReceiverWaitForPackets(FrontendGetReceiver(Context->Frontend));
+    TransmitterAbortPackets(FrontendGetTransmitter(Context->Frontend));
+
+    Trace("waiting for mac thread..\n");
+
+    KeClearEvent(&Context->MacEvent);
+    ThreadWake(Context->MacThread);
+
+    (VOID) KeWaitForSingleObject(&Context->MacEvent,
+                                 Executive,
+                                 KernelMode,
+                                 FALSE,
+                                 NULL);
+
+    Trace("done\n");
+
+fail2:
+    Error("fail2\n");
+
+    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    Context->Enabled = FALSE;
+
+    KeMemoryBarrier();
+
     Context->Argument = NULL;
     Context->Callback = NULL;
 
-    ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
+    if (Exclusive)
+        ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
+    else
+        ReleaseMrswLockShared(&Context->Lock);
 
     return status;
 }
@@ -183,6 +255,11 @@ VifDisable(
 
     KeMemoryBarrier();
 
+    XENBUS_SUSPEND(Deregister,
+                   &Context->SuspendInterface,
+                   Context->SuspendCallbackLate);
+    Context->SuspendCallbackLate = NULL;
+
     (VOID) FrontendSetState(Context->Frontend, FRONTEND_CONNECTED);
 
     ReleaseMrswLockExclusive(&Context->Lock, Irql, TRUE);
@@ -203,6 +280,8 @@ VifDisable(
 
     Trace("done\n");
 
+    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
     Context->Argument = NULL;
     Context->Callback = NULL;
 
@@ -557,26 +636,6 @@ VifTransmitterQueryRingSize(
     ReleaseMrswLockShared(&Context->Lock);
 }
 
-static DECLSPEC_NOINLINE VOID
-VifSuspendCallbackLate(
-    IN  PVOID           Argument
-    )
-{
-    PXENVIF_VIF_CONTEXT Context = Argument;
-    NTSTATUS            status;
-
-    if (!Context->Enabled)
-        return;
-
-    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
-    ASSERT(NT_SUCCESS(status));
-
-    // We do this three times to make sure switches take note
-    FrontendAdvertiseIpAddresses(Context->Frontend);
-    FrontendAdvertiseIpAddresses(Context->Frontend);
-    FrontendAdvertiseIpAddresses(Context->Frontend);
-}
-
 static NTSTATUS
 VifAcquire(
     PINTERFACE              Interface
@@ -584,7 +643,6 @@ VifAcquire(
 {
     PXENVIF_VIF_CONTEXT     Context = Interface->Context;
     KIRQL                   Irql;
-    NTSTATUS                status;
 
     AcquireMrswLockExclusive(&Context->Lock, &Irql);
 
@@ -593,19 +651,6 @@ VifAcquire(
 
     Trace("====>\n");
 
-    status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
-    if (!NT_SUCCESS(status))
-        goto fail1;   
-
-    status = XENBUS_SUSPEND(Register,
-                            &Context->SuspendInterface,
-                            SUSPEND_CALLBACK_LATE,
-                            VifSuspendCallbackLate,
-                            Context,
-                            &Context->SuspendCallbackLate);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     Context->Frontend = PdoGetFrontend(Context->Pdo);
 
     Trace("<====\n");
@@ -614,20 +659,6 @@ done:
     ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
 
     return STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    --Context->References;
-    ASSERT3U(Context->References, ==, 0);
-    ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
-
-    return status;
 }
 
 VOID
@@ -649,13 +680,6 @@ VifRelease(
 
     Context->Frontend = NULL;
 
-    XENBUS_SUSPEND(Deregister,
-                   &Context->SuspendInterface,
-                   Context->SuspendCallbackLate);
-    Context->SuspendCallbackLate = NULL;
-
-    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
-
     Trace("<====\n");
 
 done:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 12:43:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 12:43:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TEH-0007RX-9k; Thu, 03 Dec 2015 12:43:21 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TEG-0007R8-Es
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 12:43:20 +0000
Received: from [85.158.139.211] by server-15.bemta-5.messagelabs.com id
	AE/F2-16870-7E830665; Thu, 03 Dec 2015 12:43:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-5.tower-206.messagelabs.com!1449146597!8333809!1
X-Originating-IP: [209.85.160.177]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 36199 invoked from network); 3 Dec 2015 12:43:18 -0000
Received: from mail-yk0-f177.google.com (HELO mail-yk0-f177.google.com)
	(209.85.160.177)
	by server-5.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 12:43:18 -0000
Received: by ykdr82 with SMTP id r82so83502403ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 04:43:17 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=5hW7vAWZ6kv3jVjv+MWjEJ0LiJmSIW+gcUnncGmh8fQ=;
	b=c7+Ukzw4zDhUJYkHur1aqiTd8vuS8aLN5ghBmoLGvHS9gBQp3wElK6UwyB1DA/reTg
	VQt8KPTCZVT5f4M6XO10m+/IMgKPue8OVrFZQqkdhEwbXivWSCh0807OLur9nCIcpiEV
	03iFV40PyX5lU83pHbS4ejW4eyviCjXOs3Q9qG1zRHsrJVOTf5Qq8tt93fKyX+GzqeUd
	G6bCBL6WRh76m+HZPXeTYPNA9mQCT8GChWhmGAl0+VW23yOpse9TTp15bYJwNmt/Qwr/
	Q9wWQ/eCfrREeIJ9ykD7CRMs41Bmzw1DlxVRN/1dqODJHA7UP+FnfHviNH7QX82hG5S0
	zTCQ==
X-Received: by 10.129.82.84 with SMTP id g81mr6062961ywb.335.1449146597387;
	Thu, 03 Dec 2015 04:43:17 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	c20sm5386161ywa.29.2015.12.03.04.43.16
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 04:43:17 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 12:42:56 +0000
Message-Id: <1449146576-15460-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1] Make sure XENBUS interfaces are
	released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch fixes code paths where this was not being done.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/receiver.c    | 249 +++++++++++++------------
 src/xenvif/transmitter.c | 461 +++++++++++++++++++++++------------------------
 src/xenvif/vif.c         | 138 ++++++++------
 3 files changed, 435 insertions(+), 413 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index abe617d..c6f64b5 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -2129,7 +2129,6 @@ __ReceiverRingInitialize(
     )
 {
     PXENVIF_FRONTEND            Frontend;
-    CHAR                        Name[MAXNAMELEN];
     NTSTATUS                    status;
 
     Frontend = Receiver->Frontend;
@@ -2153,86 +2152,14 @@ __ReceiverRingInitialize(
 
     KeInitializeDpc(&(*Ring)->Dpc, ReceiverRingDpc, *Ring);
 
-    status = RtlStringCbPrintfA(Name,
-                                sizeof (Name),
-                                "%s_receiver_packet",
-                                (*Ring)->Path);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    for (Index = 0; Name[Index] != '\0'; Index++)
-        if (Name[Index] == '/')
-            Name[Index] = '_';
-
-    status = XENBUS_CACHE(Create,
-                          &Receiver->CacheInterface,
-                          Name,
-                          sizeof (XENVIF_RECEIVER_PACKET),
-                          0,
-                          ReceiverPacketCtor,
-                          ReceiverPacketDtor,
-                          ReceiverRingAcquireLock,
-                          ReceiverRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->PacketCache);
-    if (!NT_SUCCESS(status))
-        goto fail4;
-
-    status = RtlStringCbPrintfA(Name,
-                                sizeof (Name),
-                                "%s_receiver_fragment",
-                                (*Ring)->Path);
-    if (!NT_SUCCESS(status))
-        goto fail5;
-
-    for (Index = 0; Name[Index] != '\0'; Index++)
-        if (Name[Index] == '/')
-            Name[Index] = '_';
-
-    status = XENBUS_CACHE(Create,
-                          &Receiver->CacheInterface,
-                          Name,
-                          sizeof (XENVIF_RECEIVER_FRAGMENT),
-                          0,
-                          ReceiverFragmentCtor,
-                          ReceiverFragmentDtor,
-                          ReceiverRingAcquireLock,
-                          ReceiverRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->FragmentCache);
-    if (!NT_SUCCESS(status))
-        goto fail6;
-
     status = ThreadCreate(ReceiverRingWatchdog,
                           *Ring,
                           &(*Ring)->WatchdogThread);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail3;
 
     return STATUS_SUCCESS;
 
-fail7:
-    Error("fail7\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 (*Ring)->FragmentCache);
-    (*Ring)->FragmentCache = NULL;
-
-fail6:
-    Error("fail6\n");
-
-fail5:
-    Error("fail5\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 (*Ring)->PacketCache);
-    (*Ring)->PacketCache = NULL;
-
-fail4:
-    Error("fail4\n");
-
 fail3:
     Error("fail3\n");
 
@@ -2279,7 +2206,7 @@ __ReceiverRingConnect(
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
-                                "%s_receiver",
+                                "%s_receiver_packet",
                                 Ring->Path);
     if (!NT_SUCCESS(status))
         goto fail1;
@@ -2288,6 +2215,56 @@ __ReceiverRingConnect(
         if (Name[Index] == '/')
             Name[Index] = '_';
 
+    status = XENBUS_CACHE(Create,
+                          &Receiver->CacheInterface,
+                          Name,
+                          sizeof (XENVIF_RECEIVER_PACKET),
+                          0,
+                          ReceiverPacketCtor,
+                          ReceiverPacketDtor,
+                          ReceiverRingAcquireLock,
+                          ReceiverRingReleaseLock,
+                          Ring,
+                          &Ring->PacketCache);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = RtlStringCbPrintfA(Name,
+                                sizeof (Name),
+                                "%s_receiver_fragment",
+                                Ring->Path);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    for (Index = 0; Name[Index] != '\0'; Index++)
+        if (Name[Index] == '/')
+            Name[Index] = '_';
+
+    status = XENBUS_CACHE(Create,
+                          &Receiver->CacheInterface,
+                          Name,
+                          sizeof (XENVIF_RECEIVER_FRAGMENT),
+                          0,
+                          ReceiverFragmentCtor,
+                          ReceiverFragmentDtor,
+                          ReceiverRingAcquireLock,
+                          ReceiverRingReleaseLock,
+                          Ring,
+                          &Ring->FragmentCache);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    status = RtlStringCbPrintfA(Name,
+                                sizeof (Name),
+                                "%s_receiver",
+                                Ring->Path);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    for (Index = 0; Name[Index] != '\0'; Index++)
+        if (Name[Index] == '/')
+            Name[Index] = '_';
+
     status = XENBUS_GNTTAB(CreateCache,
                            &Receiver->GnttabInterface,
                            Name,
@@ -2297,13 +2274,13 @@ __ReceiverRingConnect(
                            Ring,
                            &Ring->GnttabCache);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail6;
 
     Ring->Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail3;
+        goto fail7;
 
     Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
     ASSERT(Ring->Shared != NULL);
@@ -2323,14 +2300,14 @@ __ReceiverRingConnect(
                            FALSE,
                            &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail8;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 __MODULE__ "|RECEIVER[%u]",
                                 Ring->Index);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail9;
 
     ASSERT(!Ring->Connected);
 
@@ -2344,7 +2321,7 @@ __ReceiverRingConnect(
 
     status = STATUS_UNSUCCESSFUL;
     if (Ring->Channel == NULL)
-        goto fail6;
+        goto fail10;
 
     status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
     ASSERT(NT_SUCCESS(status));
@@ -2371,12 +2348,12 @@ __ReceiverRingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail11;
 
     return STATUS_SUCCESS;
 
-fail7:
-    Error("fail7\n");
+fail11:
+    Error("fail11\n");
 
     Ring->Connected = FALSE;
 
@@ -2387,11 +2364,11 @@ fail7:
 
     Ring->Events = 0;
 
-fail6:
-    Error("fail6\n");
+fail10:
+    Error("fail10\n");
 
-fail5:
-    Error("fail5\n");
+fail9:
+    Error("fail9\n");
 
     (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
                          &Receiver->GnttabInterface,
@@ -2400,8 +2377,8 @@ fail5:
                          Ring->Entry);
     Ring->Entry = NULL;
 
-fail4:
-    Error("fail4\n");
+fail8:
+    Error("fail8\n");
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_rx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -2410,14 +2387,36 @@ fail4:
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
-fail3:
-    Error("fail3\n");
+fail7:
+    Error("fail7\n");
 
     XENBUS_GNTTAB(DestroyCache,
                   &Receiver->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
 
+fail6:
+    Error("fail6\n");
+
+fail5:
+    Error("fail5\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->PacketCache);
+    Ring->PacketCache = NULL;
+
 fail2:
     Error("fail2\n");
 
@@ -2590,6 +2589,16 @@ __ReceiverRingDisconnect(
                   &Receiver->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Receiver->CacheInterface,
+                 Ring->PacketCache);
+    Ring->PacketCache = NULL;
 }
 
 static FORCEINLINE VOID
@@ -2613,16 +2622,6 @@ __ReceiverRingTeardown(
     ThreadJoin(Ring->WatchdogThread);
     Ring->WatchdogThread = NULL;
 
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 Ring->FragmentCache);
-    Ring->FragmentCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Receiver->CacheInterface,
-                 Ring->PacketCache);
-    Ring->PacketCache = NULL;
-
     ASSERT(IsListEmpty(&Ring->PacketList));
     RtlZeroMemory(&Ring->PacketList, sizeof (LIST_ENTRY));
 
@@ -2778,17 +2777,13 @@ ReceiverInitialize(
 
     (*Receiver)->Frontend = Frontend;
 
-    status = XENBUS_CACHE(Acquire, &(*Receiver)->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     (*Receiver)->MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Receiver)->Ring = __ReceiverAllocate(sizeof (PXENVIF_RECEIVER_RING) *
                                            (*Receiver)->MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Receiver)->Ring == NULL)
-        goto fail3;
+        goto fail2;
 
     Index = 0;
     while (Index < (*Receiver)->MaxQueues) {
@@ -2796,7 +2791,7 @@ ReceiverInitialize(
 
         status = __ReceiverRingInitialize(*Receiver, Index, &Ring);
         if (!NT_SUCCESS(status))
-            goto fail4;
+            goto fail3;
 
         (*Receiver)->Ring[Index] = Ring;
         Index++;
@@ -2804,8 +2799,8 @@ ReceiverInitialize(
 
     return STATUS_SUCCESS;
 
-fail4:
-    Error("fail4\n");
+fail3:
+    Error("fail3\n");
 
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = (*Receiver)->Ring[Index];
@@ -2815,18 +2810,13 @@ fail4:
     }
 
     __ReceiverFree((*Receiver)->Ring);
-    (*Receiver)->Ring = NULL;
-
-fail3:
-    Error("fail3\n");
-
-    (*Receiver)->MaxQueues = 0;
 
-    XENBUS_CACHE(Release, &(*Receiver)->CacheInterface);
+    (*Receiver)->Ring = NULL;
 
 fail2:
     Error("fail2\n");
 
+    (*Receiver)->MaxQueues = 0;
     (*Receiver)->Frontend = NULL;
 
     RtlZeroMemory(&(*Receiver)->EvtchnInterface,
@@ -2888,10 +2878,14 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = XENBUS_GNTTAB(Acquire, &Receiver->GnttabInterface);
+    status = XENBUS_CACHE(Acquire, &Receiver->CacheInterface);
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    status = XENBUS_GNTTAB(Acquire, &Receiver->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
     status = XENBUS_STORE(Read,
                           &Receiver->StoreInterface,
                           NULL,
@@ -2917,7 +2911,7 @@ ReceiverConnect(
 
         status = __ReceiverRingConnect(Ring);
         if (!NT_SUCCESS(status))
-            goto fail5;
+            goto fail6;
 
         Index++;
     }    
@@ -2929,18 +2923,18 @@ ReceiverConnect(
                           Receiver,
                           &Receiver->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail7;
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail6:
-    Error("fail6\n");
+fail7:
+    Error("fail7\n");
 
     Index = Receiver->NumQueues;
 
-fail5:
-    Error("fail5\n");
+fail6:
+    Error("fail6\n");
 
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
@@ -2952,6 +2946,11 @@ fail5:
 
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
+fail5:
+    Error("fail5\n");
+
+    XENBUS_CACHE(Release, &Receiver->CacheInterface);
+
 fail4:
     Error("fail4\n");
 
@@ -3230,6 +3229,8 @@ ReceiverDisconnect(
 
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
+    XENBUS_CACHE(Release, &Receiver->CacheInterface);
+
     XENBUS_EVTCHN(Release, &Receiver->EvtchnInterface);
 
     XENBUS_STORE(Release, &Receiver->StoreInterface);
@@ -3265,8 +3266,6 @@ ReceiverTeardown(
     Receiver->Ring = NULL;
     Receiver->MaxQueues = 0;
 
-    XENBUS_CACHE(Release, &Receiver->CacheInterface);
-
     Receiver->Frontend = NULL;
 
     RtlZeroMemory(&Receiver->EvtchnInterface,
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 8759be1..5f84eb5 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -3020,7 +3020,6 @@ __TransmitterRingInitialize(
     )
 {
     PXENVIF_FRONTEND                Frontend;
-    CHAR                            Name[MAXNAMELEN];
     NTSTATUS                        status;
 
     Frontend = Transmitter->Frontend;
@@ -3044,12 +3043,66 @@ __TransmitterRingInitialize(
 
     KeInitializeDpc(&(*Ring)->Dpc, TransmitterRingDpc, *Ring);
 
+    status = ThreadCreate(TransmitterRingWatchdog,
+                          *Ring,
+                          &(*Ring)->WatchdogThread);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    return STATUS_SUCCESS;
+
+fail3:
+    Error("fail3\n");
+
+    RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC));
+
+    RtlZeroMemory(&(*Ring)->PacketComplete, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&(*Ring)->RequestQueue, sizeof (LIST_ENTRY));
+    RtlZeroMemory(&(*Ring)->PacketQueue, sizeof (LIST_ENTRY));
+
+    FrontendFreePath(Frontend, (*Ring)->Path);
+    (*Ring)->Path = NULL;
+
+fail2:
+    Error("fail2\n");
+
+    (*Ring)->Index = 0;
+    (*Ring)->Transmitter = NULL;
+
+    ASSERT(IsZeroMemory(*Ring, sizeof (XENVIF_TRANSMITTER_RING)));
+    __TransmitterFree(*Ring);
+    *Ring = NULL;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static FORCEINLINE NTSTATUS
+__TransmitterRingConnect(
+    IN  PXENVIF_TRANSMITTER_RING    Ring
+    )
+{
+    PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
+    PFN_NUMBER                      Pfn;
+    CHAR                            Name[MAXNAMELEN];
+    ULONG                           Index;
+    PROCESSOR_NUMBER                ProcNumber;
+    NTSTATUS                        status;
+
+    ASSERT(!Ring->Connected);
+
+    Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
+
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_buffer",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail1;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3064,17 +3117,17 @@ __TransmitterRingInitialize(
                           TransmitterBufferDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->BufferCache);
+                          Ring,
+                          &Ring->BufferCache);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail2;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_multicast_control",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail3;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3089,17 +3142,17 @@ __TransmitterRingInitialize(
                           TransmitterMulticastControlDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->MulticastControlCache);
+                          Ring,
+                          &Ring->MulticastControlCache);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail4;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_req_id",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail5;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3108,24 +3161,24 @@ __TransmitterRingInitialize(
     status = XENBUS_RANGE_SET(Create,
                               &Transmitter->RangeSetInterface,
                               Name,
-                              &(*Ring)->RangeSet);
+                              &Ring->RangeSet);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail6;
 
     status = XENBUS_RANGE_SET(Put,
                               &Transmitter->RangeSetInterface,
-                              (*Ring)->RangeSet,
+                              Ring->RangeSet,
                               1,
                               XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail7;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_fragment",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail10;
+        goto fail8;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3140,17 +3193,17 @@ __TransmitterRingInitialize(
                           TransmitterFragmentDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->FragmentCache);
+                          Ring,
+                          &Ring->FragmentCache);
     if (!NT_SUCCESS(status))
-        goto fail11;
+        goto fail9;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_request",
-                                (*Ring)->Path);
+                                Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail12;
+        goto fail10;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3165,135 +3218,17 @@ __TransmitterRingInitialize(
                           TransmitterRequestDtor,
                           TransmitterRingAcquireLock,
                           TransmitterRingReleaseLock,
-                          *Ring,
-                          &(*Ring)->RequestCache);
-    if (!NT_SUCCESS(status))
-        goto fail13;
-
-    status = ThreadCreate(TransmitterRingWatchdog,
-                          *Ring,
-                          &(*Ring)->WatchdogThread);
+                          Ring,
+                          &Ring->RequestCache);
     if (!NT_SUCCESS(status))
-        goto fail14;
-
-    return STATUS_SUCCESS;
-
-fail14:
-    Error("fail14\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->RequestCache);
-    (*Ring)->RequestCache = NULL;
-
-fail13:
-    Error("fail13\n");
-
-fail12:
-    Error("fail12\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->FragmentCache);
-    (*Ring)->FragmentCache = NULL;
-
-fail11:
-    Error("fail11\n");
-
-fail10:
-    Error("fail10\n");
-
-    (VOID) XENBUS_RANGE_SET(Get,
-                            &Transmitter->RangeSetInterface,
-                            (*Ring)->RangeSet,
-                            1,
-                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
-
-fail9:
-    Error("fail9\n");
-
-    XENBUS_RANGE_SET(Destroy,
-                     &Transmitter->RangeSetInterface,
-                     (*Ring)->RangeSet);
-    (*Ring)->RangeSet = NULL;
-
-fail8:
-    Error("fail8\n");
-
-fail7:
-    Error("fail7\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->MulticastControlCache);
-    (*Ring)->MulticastControlCache = NULL;
-
-fail6:
-    Error("fail6\n");
-
-fail5:
-    Error("fail5\n");
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 (*Ring)->BufferCache);
-    (*Ring)->BufferCache = NULL;
-
-fail4:
-    Error("fail4\n");
-
-fail3:
-    Error("fail3\n");
-
-    RtlZeroMemory(&(*Ring)->Dpc, sizeof (KDPC));
-
-    RtlZeroMemory(&(*Ring)->PacketComplete, sizeof (LIST_ENTRY));
-    RtlZeroMemory(&(*Ring)->RequestQueue, sizeof (LIST_ENTRY));
-    RtlZeroMemory(&(*Ring)->PacketQueue, sizeof (LIST_ENTRY));
-
-    FrontendFreePath(Frontend, (*Ring)->Path);
-    (*Ring)->Path = NULL;
-
-fail2:
-    Error("fail2\n");
-
-    (*Ring)->Index = 0;
-    (*Ring)->Transmitter = NULL;
-
-    ASSERT(IsZeroMemory(*Ring, sizeof (XENVIF_TRANSMITTER_RING)));
-    __TransmitterFree(*Ring);
-    *Ring = NULL;
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return status;
-}
-
-static FORCEINLINE NTSTATUS
-__TransmitterRingConnect(
-    IN  PXENVIF_TRANSMITTER_RING    Ring
-    )
-{
-    PXENVIF_TRANSMITTER             Transmitter;
-    PXENVIF_FRONTEND                Frontend;
-    PFN_NUMBER                      Pfn;
-    CHAR                            Name[MAXNAMELEN];
-    ULONG                           Index;
-    PROCESSOR_NUMBER                ProcNumber;
-    NTSTATUS                        status;
-
-    ASSERT(!Ring->Connected);
-
-    Transmitter = Ring->Transmitter;
-    Frontend = Transmitter->Frontend;
+        goto fail11;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter",
                                 Ring->Path);
     if (!NT_SUCCESS(status))
-        goto fail1;
+        goto fail12;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -3308,13 +3243,13 @@ __TransmitterRingConnect(
                            Ring,
                            &Ring->GnttabCache);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail13;
 
     Ring->Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail3;
+        goto fail14;
 
     Ring->Shared = MmGetSystemAddressForMdlSafe(Ring->Mdl, NormalPagePriority);
     ASSERT(Ring->Shared != NULL);
@@ -3334,14 +3269,14 @@ __TransmitterRingConnect(
                            FALSE,
                            &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail15;
 
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 __MODULE__ "|TRANSMITTER[%u]",
                                 Ring->Index);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail16;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
@@ -3356,7 +3291,7 @@ __TransmitterRingConnect(
 
         status = STATUS_UNSUCCESSFUL;
         if (Ring->Channel == NULL)
-            goto fail6;
+            goto fail17;
 
         status = KeGetProcessorNumberFromIndex(Ring->Index, &ProcNumber);
         ASSERT(NT_SUCCESS(status));
@@ -3382,14 +3317,14 @@ __TransmitterRingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail18;
 
     Ring->Connected = TRUE;
 
     return STATUS_SUCCESS;
 
-fail7:
-    Error("fail7\n");
+fail18:
+    Error("fail18\n");
 
     XENBUS_EVTCHN(Close,
                   &Transmitter->EvtchnInterface,
@@ -3398,11 +3333,11 @@ fail7:
 
     Ring->Events = 0;
 
-fail6:
-    Error("fail6\n");
+fail17:
+    Error("fail17\n");
 
-fail5:
-    Error("fail5\n");
+fail16:
+    Error("fail16\n");
 
     (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
                          &Transmitter->GnttabInterface,
@@ -3411,8 +3346,8 @@ fail5:
                          Ring->Entry);
     Ring->Entry = NULL;
 
-fail4:
-    Error("fail4\n");
+fail15:
+    Error("fail15\n");
 
     RtlZeroMemory(&Ring->Front, sizeof (netif_tx_front_ring_t));
     RtlZeroMemory(Ring->Shared, PAGE_SIZE);
@@ -3421,14 +3356,78 @@ fail4:
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
-fail3:
-    Error("fail3\n");
+fail14:
+    Error("fail14\n");
 
     XENBUS_GNTTAB(DestroyCache,
                   &Transmitter->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
 
+fail13:
+    Error("fail13\n");
+
+fail12:
+    Error("fail12\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->RequestCache);
+    Ring->RequestCache = NULL;
+
+fail11:
+    Error("fail11\n");
+
+fail10:
+    Error("fail10\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+fail9:
+    Error("fail9\n");
+
+fail8:
+    Error("fail8\n");
+
+    (VOID) XENBUS_RANGE_SET(Get,
+                            &Transmitter->RangeSetInterface,
+                            Ring->RangeSet,
+                            1,
+                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
+
+fail7:
+    Error("fail7\n");
+
+    XENBUS_RANGE_SET(Destroy,
+                     &Transmitter->RangeSetInterface,
+                     Ring->RangeSet);
+    Ring->RangeSet = NULL;
+
+fail6:
+    Error("fail6\n");
+
+fail5:
+    Error("fail5\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->MulticastControlCache);
+    Ring->MulticastControlCache = NULL;
+
+fail4:
+    Error("fail4\n");
+
+fail3:
+    Error("fail3\n");
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->BufferCache);
+    Ring->BufferCache = NULL;
+
 fail2:
     Error("fail2\n");
 
@@ -3660,6 +3659,37 @@ __TransmitterRingDisconnect(
                   &Transmitter->GnttabInterface,
                   Ring->GnttabCache);
     Ring->GnttabCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->RequestCache);
+    Ring->RequestCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->FragmentCache);
+    Ring->FragmentCache = NULL;
+
+    (VOID) XENBUS_RANGE_SET(Get,
+                            &Transmitter->RangeSetInterface,
+                            Ring->RangeSet,
+                            1,
+                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
+
+    XENBUS_RANGE_SET(Destroy,
+                     &Transmitter->RangeSetInterface,
+                     Ring->RangeSet);
+    Ring->RangeSet = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->MulticastControlCache);
+    Ring->MulticastControlCache = NULL;
+
+    XENBUS_CACHE(Destroy,
+                 &Transmitter->CacheInterface,
+                 Ring->BufferCache);
+    Ring->BufferCache = NULL;
 }
 
 static FORCEINLINE VOID
@@ -3694,37 +3724,6 @@ __TransmitterRingTeardown(
     ThreadJoin(Ring->WatchdogThread);
     Ring->WatchdogThread = NULL;
 
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->RequestCache);
-    Ring->RequestCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->FragmentCache);
-    Ring->FragmentCache = NULL;
-
-    (VOID) XENBUS_RANGE_SET(Get,
-                            &Transmitter->RangeSetInterface,
-                            Ring->RangeSet,
-                            1,
-                            XENVIF_TRANSMITTER_MAXIMUM_FRAGMENT_ID);
-
-    XENBUS_RANGE_SET(Destroy,
-                     &Transmitter->RangeSetInterface,
-                     Ring->RangeSet);
-    Ring->RangeSet = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->MulticastControlCache);
-    Ring->MulticastControlCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 &Transmitter->CacheInterface,
-                 Ring->BufferCache);
-    Ring->BufferCache = NULL;
-
     ASSERT(IsListEmpty(&Ring->PacketComplete));
     RtlZeroMemory(&Ring->PacketComplete, sizeof (LIST_ENTRY));
 
@@ -4049,21 +4048,13 @@ TransmitterInitialize(
     (*Transmitter)->Frontend = Frontend;
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
-    status = XENBUS_RANGE_SET(Acquire, &(*Transmitter)->RangeSetInterface);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    status = XENBUS_CACHE(Acquire, &(*Transmitter)->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
     (*Transmitter)->MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Transmitter)->Ring = __TransmitterAllocate(sizeof (PXENVIF_TRANSMITTER_RING) *
                                                  (*Transmitter)->MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Transmitter)->Ring == NULL)
-        goto fail4;
+        goto fail2;
 
     Index = 0;
     while (Index < (*Transmitter)->MaxQueues) {
@@ -4071,7 +4062,7 @@ TransmitterInitialize(
 
         status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
         if (!NT_SUCCESS(status))
-            goto fail5;
+            goto fail3;
 
         (*Transmitter)->Ring[Index] = Ring;
         Index++;
@@ -4079,8 +4070,8 @@ TransmitterInitialize(
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail3:
+    Error("fail3\n");
 
     while (--Index > 0) {
         PXENVIF_TRANSMITTER_RING    Ring = (*Transmitter)->Ring[Index];
@@ -4092,21 +4083,11 @@ fail5:
     __TransmitterFree((*Transmitter)->Ring);
     (*Transmitter)->Ring = NULL;
 
-fail4:
-    Error("fail4\n");
-
-    (*Transmitter)->MaxQueues = 0;
-
-    XENBUS_CACHE(Release, &(*Transmitter)->CacheInterface);
-
-fail3:
-    Error("fail3\n");
-
-    XENBUS_RANGE_SET(Release, &(*Transmitter)->RangeSetInterface);
-
 fail2:
     Error("fail2\n");
 
+    (*Transmitter)->MaxQueues = 0;
+
     (*Transmitter)->Frontend = NULL;
 
     RtlZeroMemory(&(*Transmitter)->Lock,
@@ -4167,16 +4148,24 @@ TransmitterConnect(
     if (!NT_SUCCESS(status))
         goto fail3;
 
-    status = XENBUS_GNTTAB(Acquire, &Transmitter->GnttabInterface);
+    status = XENBUS_RANGE_SET(Acquire, &Transmitter->RangeSetInterface);
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    status = XENBUS_CACHE(Acquire, &Transmitter->CacheInterface);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
+    status = XENBUS_GNTTAB(Acquire, &Transmitter->GnttabInterface);
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
     status = RtlStringCbPrintfA(Name,
                                 sizeof (Name),
                                 "%s_transmitter_packet",
                                 FrontendGetPath(Frontend));
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail7;
 
     for (Index = 0; Name[Index] != '\0'; Index++)
         if (Name[Index] == '/')
@@ -4194,7 +4183,7 @@ TransmitterConnect(
                           Transmitter,
                           &Transmitter->PacketCache);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail8;
 
     status = XENBUS_STORE(Read,
                           &Transmitter->StoreInterface,
@@ -4237,7 +4226,7 @@ TransmitterConnect(
 
         status = __TransmitterRingConnect(Ring);
         if (!NT_SUCCESS(status))
-            goto fail7;
+            goto fail9;
 
         Index++;
     }    
@@ -4249,18 +4238,18 @@ TransmitterConnect(
                           Transmitter,
                           &Transmitter->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail8;
+        goto fail10;
 
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail8:
-    Error("fail8\n");
+fail10:
+    Error("fail10\n");
 
     Index = Transmitter->NumQueues;
 
-fail7:
-    Error("fail7\n");
+fail9:
+    Error("fail9\n");
 
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring;
@@ -4277,13 +4266,23 @@ fail7:
                  Transmitter->PacketCache);
     Transmitter->PacketCache = NULL;
 
+fail8:
+    Error("fail8\n");
+
+fail7:
+    Error("fail7\n");
+
+    XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
+
 fail6:
     Error("fail6\n");
 
+    XENBUS_CACHE(Release, &Transmitter->CacheInterface);
+
 fail5:
     Error("fail5\n");
 
-    XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
+    XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
 
 fail4:
     Error("fail4\n");
@@ -4426,6 +4425,10 @@ TransmitterDisconnect(
 
     XENBUS_GNTTAB(Release, &Transmitter->GnttabInterface);
 
+    XENBUS_CACHE(Release, &Transmitter->CacheInterface);
+
+    XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
+
     XENBUS_EVTCHN(Release, &Transmitter->EvtchnInterface);
 
     XENBUS_STORE(Release, &Transmitter->StoreInterface);
@@ -4457,10 +4460,6 @@ TransmitterTeardown(
     Transmitter->Ring = NULL;
     Transmitter->MaxQueues = 0;
 
-    XENBUS_CACHE(Release, &Transmitter->CacheInterface);
-
-    XENBUS_RANGE_SET(Release, &Transmitter->RangeSetInterface);
-
     Transmitter->Frontend = NULL;
 
     RtlZeroMemory(&Transmitter->Lock,
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 556280b..ac4d454 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -115,6 +115,26 @@ VifMac(
     return STATUS_SUCCESS;
 }
 
+static DECLSPEC_NOINLINE VOID
+VifSuspendCallbackLate(
+    IN  PVOID           Argument
+    )
+{
+    PXENVIF_VIF_CONTEXT Context = Argument;
+    NTSTATUS            status;
+
+    if (!Context->Enabled)
+        return;
+
+    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
+    ASSERT(NT_SUCCESS(status));
+
+    // We do this three times to make sure switches take note
+    FrontendAdvertiseIpAddresses(Context->Frontend);
+    FrontendAdvertiseIpAddresses(Context->Frontend);
+    FrontendAdvertiseIpAddresses(Context->Frontend);
+}
+
 static NTSTATUS
 VifEnable(
     IN  PINTERFACE          Interface,
@@ -124,11 +144,13 @@ VifEnable(
 {
     PXENVIF_VIF_CONTEXT     Context = Interface->Context;
     KIRQL                   Irql;
+    BOOLEAN                 Exclusive;
     NTSTATUS                status;
 
     Trace("====>\n");
 
     AcquireMrswLockExclusive(&Context->Lock, &Irql);
+    Exclusive = TRUE;
 
     if (Context->Enabled)
         goto done;
@@ -140,24 +162,74 @@ VifEnable(
 
     KeMemoryBarrier();
 
-    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
+    status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
     if (!NT_SUCCESS(status))
         goto fail1;
 
+    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_SUSPEND(Register,
+                            &Context->SuspendInterface,
+                            SUSPEND_CALLBACK_LATE,
+                            VifSuspendCallbackLate,
+                            Context,
+                            &Context->SuspendCallbackLate);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
 done:
+    ASSERT(Exclusive);
     ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
 
     Trace("<====\n");
 
     return STATUS_SUCCESS;
 
+fail3:
+    Error("fail3\n");
+
+    (VOID) FrontendSetState(Context->Frontend, FRONTEND_CONNECTED);
+
+    ReleaseMrswLockExclusive(&Context->Lock, Irql, TRUE);
+    Exclusive = FALSE;
+
+    ReceiverWaitForPackets(FrontendGetReceiver(Context->Frontend));
+    TransmitterAbortPackets(FrontendGetTransmitter(Context->Frontend));
+
+    Trace("waiting for mac thread..\n");
+
+    KeClearEvent(&Context->MacEvent);
+    ThreadWake(Context->MacThread);
+
+    (VOID) KeWaitForSingleObject(&Context->MacEvent,
+                                 Executive,
+                                 KernelMode,
+                                 FALSE,
+                                 NULL);
+
+    Trace("done\n");
+
+fail2:
+    Error("fail2\n");
+
+    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    Context->Enabled = FALSE;
+
+    KeMemoryBarrier();
+
     Context->Argument = NULL;
     Context->Callback = NULL;
 
-    ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
+    if (Exclusive)
+        ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
+    else
+        ReleaseMrswLockShared(&Context->Lock);
 
     return status;
 }
@@ -183,6 +255,11 @@ VifDisable(
 
     KeMemoryBarrier();
 
+    XENBUS_SUSPEND(Deregister,
+                   &Context->SuspendInterface,
+                   Context->SuspendCallbackLate);
+    Context->SuspendCallbackLate = NULL;
+
     (VOID) FrontendSetState(Context->Frontend, FRONTEND_CONNECTED);
 
     ReleaseMrswLockExclusive(&Context->Lock, Irql, TRUE);
@@ -203,6 +280,8 @@ VifDisable(
 
     Trace("done\n");
 
+    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
+
     Context->Argument = NULL;
     Context->Callback = NULL;
 
@@ -557,26 +636,6 @@ VifTransmitterQueryRingSize(
     ReleaseMrswLockShared(&Context->Lock);
 }
 
-static DECLSPEC_NOINLINE VOID
-VifSuspendCallbackLate(
-    IN  PVOID           Argument
-    )
-{
-    PXENVIF_VIF_CONTEXT Context = Argument;
-    NTSTATUS            status;
-
-    if (!Context->Enabled)
-        return;
-
-    status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
-    ASSERT(NT_SUCCESS(status));
-
-    // We do this three times to make sure switches take note
-    FrontendAdvertiseIpAddresses(Context->Frontend);
-    FrontendAdvertiseIpAddresses(Context->Frontend);
-    FrontendAdvertiseIpAddresses(Context->Frontend);
-}
-
 static NTSTATUS
 VifAcquire(
     PINTERFACE              Interface
@@ -584,7 +643,6 @@ VifAcquire(
 {
     PXENVIF_VIF_CONTEXT     Context = Interface->Context;
     KIRQL                   Irql;
-    NTSTATUS                status;
 
     AcquireMrswLockExclusive(&Context->Lock, &Irql);
 
@@ -593,19 +651,6 @@ VifAcquire(
 
     Trace("====>\n");
 
-    status = XENBUS_SUSPEND(Acquire, &Context->SuspendInterface);
-    if (!NT_SUCCESS(status))
-        goto fail1;   
-
-    status = XENBUS_SUSPEND(Register,
-                            &Context->SuspendInterface,
-                            SUSPEND_CALLBACK_LATE,
-                            VifSuspendCallbackLate,
-                            Context,
-                            &Context->SuspendCallbackLate);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
     Context->Frontend = PdoGetFrontend(Context->Pdo);
 
     Trace("<====\n");
@@ -614,20 +659,6 @@ done:
     ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
 
     return STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    --Context->References;
-    ASSERT3U(Context->References, ==, 0);
-    ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
-
-    return status;
 }
 
 VOID
@@ -649,13 +680,6 @@ VifRelease(
 
     Context->Frontend = NULL;
 
-    XENBUS_SUSPEND(Deregister,
-                   &Context->SuspendInterface,
-                   Context->SuspendCallbackLate);
-    Context->SuspendCallbackLate = NULL;
-
-    XENBUS_SUSPEND(Release, &Context->SuspendInterface);
-
     Trace("<====\n");
 
 done:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 13:07:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 13:07:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TbX-0001XX-OS; Thu, 03 Dec 2015 13:07:23 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TbV-0001X5-HY
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 13:07:22 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	29/B4-09834-88E30665; Thu, 03 Dec 2015 13:07:20 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1449148036!8218497!1
X-Originating-IP: [209.85.160.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7294 invoked from network); 3 Dec 2015 13:07:17 -0000
Received: from mail-yk0-f176.google.com (HELO mail-yk0-f176.google.com)
	(209.85.160.176)
	by server-3.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 13:07:17 -0000
Received: by ykba77 with SMTP id a77so84253747ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 05:07:16 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=gYVSfziU9Ibpibk0CoFIlVo7CtuXs9Yd7QinIRWG5+w=;
	b=qO9F6pBoRG3si1eKxfoAVTeiB114BRZ0F+r3tWSiBLyTNbS6rYjnIIqJsNrWsI5pp1
	XdyZ51CT693s69AVXkqCAcRjANvWLeRWeqS+SyygwV/BrXMra+X7ZdLFJ5Ruvwu7mSDT
	TmQhFG5dGDq+9HFUverLYTlu+LN2KlaccWKy2irIbXPbcOQ+4LMOkJdw2667uQPVgUB4
	4ARRZO6eeyaAHCqEHACix91KSvgu0uXEWrDHTHC+GeUcqlzvkBQwkSm93iUikKJBVwrf
	zC6CuDoh9ZGmwG+al6c9ioIAbaeh9j81G3mb9uJl8ehsqvQKXLQ+bFnJfFDGOJ47vc5E
	6meg==
X-Received: by 10.129.82.193 with SMTP id g184mr6560762ywb.313.1449148036217; 
	Thu, 03 Dec 2015 05:07:16 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	i12sm5443704ywg.40.2015.12.03.05.07.14
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 05:07:15 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 13:07:02 +0000
Message-Id: <1449148022-7436-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1] Make sure XENBUS interfaces are
	released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch fixes code paths where this was not being done. It also adds
some more logging during AdapterEnable/Disable and when moving between
D0 and D3.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xennet/adapter.c     | 2719 +++++++++++++++++++++++-----------------------
 src/xennet/adapter.h     |    2 +-
 src/xennet/miniport.c    |   21 +-
 src/xennet/receiver.c    |   18 +
 src/xennet/receiver.h    |   10 +
 src/xennet/transmitter.c |   63 +-
 src/xennet/transmitter.h |   10 +
 7 files changed, 1471 insertions(+), 1372 deletions(-)

diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index f9b3cf1..2c35636 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -1074,1576 +1074,1671 @@ AdapterGetReceiver(
     return Adapter->Receiver;
 }
 
-NDIS_STATUS
-AdapterEnable(
-    IN  PXENNET_ADAPTER     Adapter
+static FORCEINLINE PVOID
+__AdapterAllocate(
+    IN  ULONG   Length
     )
 {
-    NTSTATUS        status;
-
-    if (Adapter->Enabled)
-        return NDIS_STATUS_SUCCESS;
-
-    status = XENVIF_VIF(Enable,
-                        &Adapter->VifInterface,
-                        AdapterVifCallback,
-                        Adapter);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    Adapter->Enabled = TRUE;
-
-    return NDIS_STATUS_SUCCESS;
+    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
+}
 
-fail1:
-    return NDIS_STATUS_FAILURE;
+static FORCEINLINE VOID
+__AdapterFree(
+    IN  PVOID   Buffer
+    )
+{
+    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
 }
 
-BOOLEAN
-AdapterDisable(
-    IN  PXENNET_ADAPTER     Adapter
+static FORCEINLINE PANSI_STRING
+__AdapterMultiSzToUpcaseAnsi(
+    IN  PCHAR       Buffer
     )
 {
-    if (!Adapter->Enabled)
-        return FALSE;
+    PANSI_STRING    Ansi;
+    LONG            Index;
+    LONG            Count;
+    NTSTATUS        status;
 
-    XENVIF_VIF(Disable,
-               &Adapter->VifInterface);
+    Index = 0;
+    Count = 0;
+    for (;;) {
+        if (Buffer[Index] == '\0') {
+            Count++;
+            Index++;
 
-    AdapterMediaStateChange(Adapter);
+            // Check for double NUL
+            if (Buffer[Index] == '\0')
+                break;
+        } else {
+            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Index++;
+        }
+    }
 
-    Adapter->Enabled = FALSE;
+    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
 
-    return TRUE;
-}
+    status = STATUS_NO_MEMORY;
+    if (Ansi == NULL)
+        goto fail1;
 
-VOID
-AdapterMediaStateChange(
-    IN  PXENNET_ADAPTER     Adapter
-    )
-{
-    NDIS_LINK_STATE         LinkState;
-    NDIS_STATUS_INDICATION  StatusIndication;
+    for (Index = 0; Index < Count; Index++) {
+        ULONG   Length;
 
-    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
-    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
-    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
-    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
+        Length = (ULONG)strlen(Buffer);
+        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
+        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
 
-    XENVIF_VIF(MacQueryState,
-               &Adapter->VifInterface,
-               &LinkState.MediaConnectState,
-               &LinkState.RcvLinkSpeed,
-               &LinkState.MediaDuplexState);
+        status = STATUS_NO_MEMORY;
+        if (Ansi[Index].Buffer == NULL)
+            goto fail2;
 
-    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
-        Info("LINK: STATE UNKNOWN\n");
-    } else if (LinkState.MediaConnectState == MediaConnectStateDisconnected) {
-        Info("LINK: DOWN\n");
-    } else {
-        ASSERT3U(LinkState.MediaConnectState, ==, MediaConnectStateConnected);
+        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
+        Ansi[Index].Length = (USHORT)Length;
 
-        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
-            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n", LinkState.RcvLinkSpeed);
-        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
-            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n", LinkState.RcvLinkSpeed);
-        else
-            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n", LinkState.RcvLinkSpeed);
+        Buffer += Length + 1;
     }
 
-    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
+    return Ansi;
 
-    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
-    StatusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
-    StatusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
-    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
+fail2:
+    Error("fail2\n");
 
-    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
-    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
-    StatusIndication.StatusBuffer = &LinkState;
-    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
+    while (--Index >= 0)
+        __AdapterFree(Ansi[Index].Buffer);
 
-    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle, &StatusIndication);
+    __AdapterFree(Ansi);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return NULL;
 }
 
-NDIS_STATUS
-AdapterSetInformation(
-    IN  PXENNET_ADAPTER     Adapter,
-    IN  PNDIS_OID_REQUEST   Request
+static FORCEINLINE VOID
+__AdapterFreeAnsi(
+    IN  PANSI_STRING    Ansi
     )
 {
-    PVOID                   Buffer;
-    ULONG                   BufferLength;
-    ULONG                   BytesNeeded;
-    ULONG                   BytesRead;
-    BOOLEAN                 Warn;
-    NDIS_STATUS             ndisStatus;
+    ULONG               Index;
 
-    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
-    BufferLength = Request->DATA.SET_INFORMATION.InformationBufferLength;
-    BytesNeeded = BytesRead = 0;
-    Warn = TRUE;
-    ndisStatus = NDIS_STATUS_SUCCESS;
+    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
+        __AdapterFree(Ansi[Index].Buffer);
 
-    switch (Request->DATA.SET_INFORMATION.Oid) {
-    case OID_PNP_SET_POWER:
-        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
-        // do nothing
-        break;
+    __AdapterFree(Ansi);
+}
 
-    case OID_GEN_CURRENT_LOOKAHEAD:
-        BytesNeeded = sizeof(ULONG);
-        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
-        if (BufferLength == BytesNeeded) {
-            Adapter->CurrentLookahead = *(PULONG)Buffer;
-            BytesRead = sizeof(ULONG);
-        }
-        break;
+static FORCEINLINE BOOLEAN
+__AdapterMatchDistribution(
+    IN  PXENNET_ADAPTER Adapter,
+    IN  PCHAR           Buffer
+    )
+{
+    PCHAR               Vendor;
+    PCHAR               Product;
+    PCHAR               Context;
+    const CHAR          *Text;
+    BOOLEAN             Match;
+    ULONG               Index;
+    NTSTATUS            status;
 
-    case OID_GEN_CURRENT_PACKET_FILTER:
-        BytesNeeded = sizeof(ULONG);
-        if (BufferLength == BytesNeeded) {
-            ndisStatus = AdapterSetPacketFilter(Adapter,
-                                                (PULONG)Buffer);
-            BytesRead = sizeof(ULONG);
-        }
-        break;
+    UNREFERENCED_PARAMETER(Adapter);
 
-    case OID_802_3_MULTICAST_LIST:
-        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
-        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
-            ndisStatus = AdapterSetMulticastAddresses(Adapter,
-                                                      Buffer,
-                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = BufferLength;
-        } else {
-            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
-        }
-        break;
+    status = STATUS_INVALID_PARAMETER;
 
-    case OID_OFFLOAD_ENCAPSULATION:
-        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
-        if (BufferLength >= BytesNeeded) {
-            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
-                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
-        }
-        break;
+    Vendor = __strtok_r(Buffer, " ", &Context);
+    if (Vendor == NULL)
+        goto fail1;
 
-    case OID_TCP_OFFLOAD_PARAMETERS:
-        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
-        if (BufferLength >= BytesNeeded) {
-            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
-                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
-        }
-        break;
+    Product = __strtok_r(NULL, " ", &Context);
+    if (Product == NULL)
+        goto fail2;
 
-    case OID_GEN_HD_SPLIT_PARAMETERS:
-        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
-        if (BufferLength >= BytesNeeded) {
-            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
-                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
-        }
-        break;
+    Match = TRUE;
 
-    case OID_GEN_INTERRUPT_MODERATION:
-    case OID_GEN_MACHINE_NAME:
-        Warn = FALSE;
-        /*FALLTHRU*/
-    default:
-        if (Warn)
-            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
+    Text = VENDOR_NAME_STR;
 
-        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
-        break;
+    for (Index = 0; Text[Index] != 0; Index++) {
+        if (!isalnum((UCHAR)Text[Index])) {
+            if (Vendor[Index] != '_') {
+                Match = FALSE;
+                break;
+            }
+        } else {
+            if (Vendor[Index] != Text[Index]) {
+                Match = FALSE;
+                break;
+            }
+        }
     }
 
-    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
-    if (ndisStatus == NDIS_STATUS_SUCCESS)
-        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
+    Text = "XENNET";
 
-    return ndisStatus;
-}
+    if (_stricmp(Product, Text) != 0)
+        Match = FALSE;
 
-static FORCEINLINE NDIS_STATUS
-__CopyBuffer(
-    IN  PVOID   Destination,
-    IN  ULONG   DestinationLength,
-    IN  PVOID   Source,
-    IN  ULONG   SourceLength,
-    OUT PULONG  CopyLength
-    )
-{
-    *CopyLength = __min(SourceLength, DestinationLength);
-    RtlCopyMemory(Destination, Source, *CopyLength);
+    return Match;
 
-    return (DestinationLength >= SourceLength) ?
-           NDIS_STATUS_SUCCESS :
-           NDIS_STATUS_BUFFER_TOO_SHORT;
-}
+fail2:
+    Error("fail2\n");
 
-static FORCEINLINE NDIS_STATUS
-__SetUlong(
-    IN  PVOID   Destination,
-    IN  ULONG   DestinationLength,
-    IN  ULONG   Source,
-    OUT PULONG  CopyLength
-    )
-{
-    return __CopyBuffer(Destination,
-                        DestinationLength & ~3,
-                        &Source,
-                        sizeof (ULONG),
-                        CopyLength);
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return FALSE;
 }
 
-static FORCEINLINE NDIS_STATUS
-__SetUlong64(
-    IN  PVOID   Destination,
-    IN  ULONG   DestinationLength,
-    IN  ULONG64 Source,
-    OUT PULONG  CopyLength
+static FORCEINLINE VOID
+__AdapterClearDistribution(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    NDIS_STATUS ndisStatus;
+    PCHAR               Buffer;
+    PANSI_STRING        Distributions;
+    ULONG               Index;
+    NTSTATUS            status;
 
-    ndisStatus =  __CopyBuffer(Destination,
-                               DestinationLength & ~3,
-                               &Source,
-                               sizeof (ULONG64),
-                               CopyLength);
-    if (DestinationLength >= 4)
-        ndisStatus = NDIS_STATUS_SUCCESS;
+    Trace("====>\n");
 
-    return ndisStatus;
-}
+    status = XENBUS_STORE(Directory,
+                          &Adapter->StoreInterface,
+                          NULL,
+                          NULL,
+                          "drivers",
+                          &Buffer);
+    if (NT_SUCCESS(status)) {
+        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
 
-NDIS_STATUS
-AdapterQueryInformation(
-    IN  PXENNET_ADAPTER     Adapter,
-    IN  PNDIS_OID_REQUEST   Request
-    )
-{
-    PVOID                   Buffer;
-    ULONG                   BufferLength;
-    ULONG                   BytesNeeded;
-    ULONG                   BytesWritten;
-    ULONG                   Value32;
-    ULONGLONG               Value64;
-    ETHERNET_ADDRESS        EthernetAddress;
-    BOOLEAN                 Warn;
-    NDIS_STATUS             ndisStatus;
+        XENBUS_STORE(Free,
+                     &Adapter->StoreInterface,
+                     Buffer);
+    } else {
+        Distributions = NULL;
+    }
 
-    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
-    BufferLength = Request->DATA.QUERY_INFORMATION.InformationBufferLength;
-    BytesNeeded = BytesWritten = 0;
-    Warn = TRUE;
-    ndisStatus = NDIS_STATUS_SUCCESS;
+    if (Distributions == NULL)
+        goto done;
 
-    switch (Request->DATA.QUERY_INFORMATION.Oid) {
-    case OID_PNP_CAPABILITIES:
-        BytesNeeded = sizeof(Adapter->Capabilities);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &Adapter->Capabilities,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
+        PANSI_STRING    Distribution = &Distributions[Index];
 
-    case OID_PNP_QUERY_POWER:
-        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
-        BytesWritten = 0;
-        // do nothing
-        break;
+        status = XENBUS_STORE(Read,
+                              &Adapter->StoreInterface,
+                              NULL,
+                              "drivers",
+                              Distribution->Buffer,
+                              &Buffer);
+        if (!NT_SUCCESS(status))
+            continue;
 
-    case OID_GEN_SUPPORTED_LIST:
-        BytesNeeded = sizeof(XennetSupportedOids);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &XennetSupportedOids[0],
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+        if (__AdapterMatchDistribution(Adapter, Buffer))
+            (VOID) XENBUS_STORE(Remove,
+                                &Adapter->StoreInterface,
+                                NULL,
+                                "drivers",
+                                Distribution->Buffer);
 
-    case OID_GEN_HARDWARE_STATUS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                NdisHardwareStatusReady,
-                                &BytesWritten);
-        break;
+        XENBUS_STORE(Free,
+                     &Adapter->StoreInterface,
+                     Buffer);
+    }
 
-    case OID_GEN_MEDIA_SUPPORTED:
-    case OID_GEN_MEDIA_IN_USE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                XENNET_MEDIA_TYPE,
-                                &BytesWritten);
-        break;
+    __AdapterFreeAnsi(Distributions);
 
-    case OID_GEN_MAXIMUM_LOOKAHEAD:
-    case OID_GEN_TRANSMIT_BLOCK_SIZE:
-    case OID_GEN_RECEIVE_BLOCK_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->MaximumFrameSize,
-                                &BytesWritten);
-        break;
+done:
+    Trace("<====\n");
+}
 
-    case OID_GEN_TRANSMIT_BUFFER_SPACE:
-    case OID_GEN_RECEIVE_BUFFER_SPACE:
-        XENVIF_VIF(TransmitterQueryRingSize,
-                    &Adapter->VifInterface,
-                    (PULONG)&Value32);
-        Value32 *= Adapter->MaximumFrameSize;
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+#define MAXIMUM_INDEX   255
 
-    case OID_GEN_VENDOR_DESCRIPTION:
-        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  VENDOR_NAME_STR,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+static FORCEINLINE NTSTATUS
+__AdapterSetDistribution(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    ULONG               Index;
+    CHAR                Distribution[MAXNAMELEN];
+    CHAR                Vendor[MAXNAMELEN];
+    const CHAR          *Product;
+    NTSTATUS            status;
 
-    case OID_GEN_VENDOR_DRIVER_VERSION:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
-                                &BytesWritten);
-        break;
+    Trace("====>\n");
 
-    case OID_GEN_DRIVER_VERSION:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (6 << 8) | 0, // NDIS 6.0
-                                &BytesWritten);
-        break;
+    Index = 0;
+    while (Index <= MAXIMUM_INDEX) {
+        PCHAR   Buffer;
 
-    case OID_GEN_MAC_OPTIONS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                XENNET_MAC_OPTIONS,
-                                &BytesWritten);
-        break;
+        status = RtlStringCbPrintfA(Distribution,
+                                    MAXNAMELEN,
+                                    "%u",
+                                    Index);
+        ASSERT(NT_SUCCESS(status));
 
-    case OID_GEN_STATISTICS:
-        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
-        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
-                                                   (PNDIS_STATISTICS_INFO)Buffer,
-                                                   BufferLength,
-                                                   &BytesWritten);
-        break;
+        status = XENBUS_STORE(Read,
+                              &Adapter->StoreInterface,
+                              NULL,
+                              "drivers",
+                              Distribution,
+                              &Buffer);
+        if (!NT_SUCCESS(status)) {
+            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+                goto update;
 
-    case OID_802_3_MULTICAST_LIST:
-        ndisStatus = AdapterQueryMulticastList(Adapter,
-                                               Buffer,
-                                               BufferLength,
-                                               &BytesNeeded,
-                                               &BytesWritten);
-        break;
+            goto fail1;
+        }
 
-    case OID_802_3_PERMANENT_ADDRESS:
-        XENVIF_VIF(MacQueryPermanentAddress,
-                    &Adapter->VifInterface,
-                    &EthernetAddress);
-        BytesNeeded = sizeof(ETHERNET_ADDRESS);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &EthernetAddress,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+        XENBUS_STORE(Free,
+                     &Adapter->StoreInterface,
+                     Buffer);
 
-    case OID_802_3_CURRENT_ADDRESS:
-        XENVIF_VIF(MacQueryCurrentAddress,
-                    &Adapter->VifInterface,
-                    &EthernetAddress);
-        BytesNeeded = sizeof(ETHERNET_ADDRESS);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &EthernetAddress,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+        Index++;
+    }
 
-    case OID_GEN_MAXIMUM_FRAME_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->MaximumFrameSize -
-                                    sizeof(ETHERNET_TAGGED_HEADER),
-                                &BytesWritten);
-        break;
+    status = STATUS_UNSUCCESSFUL;
+    goto fail2;
 
-    case OID_GEN_MAXIMUM_TOTAL_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->MaximumFrameSize -
-                                    sizeof(ETHERNET_TAGGED_HEADER) +
-                                    sizeof (ETHERNET_UNTAGGED_HEADER),
-                                &BytesWritten);
-        break;
+update:
+    status = RtlStringCbPrintfA(Vendor,
+                                MAXNAMELEN,
+                                "%s",
+                                VENDOR_NAME_STR);
+    ASSERT(NT_SUCCESS(status));
 
-    case OID_GEN_CURRENT_LOOKAHEAD:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->CurrentLookahead,
-                                &BytesWritten);
-        break;
+    for (Index  = 0; Vendor[Index] != '\0'; Index++)
+        if (!isalnum((UCHAR)Vendor[Index]))
+            Vendor[Index] = '_';
 
-    case OID_GEN_VENDOR_ID:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                0x5853,
-                                &BytesWritten);
-        break;
+    Product = "XENNET";
 
-    case OID_GEN_LINK_SPEED:
-        XENVIF_VIF(MacQueryState,
-                   &Adapter->VifInterface,
-                   NULL,
-                   &Value64,
-                   NULL);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)(Value64 / 100),
-                                &BytesWritten);
-        break;
+#if DBG
+#define ATTRIBUTES   "(DEBUG)"
+#else
+#define ATTRIBUTES   ""
+#endif
 
-    case OID_GEN_MEDIA_CONNECT_STATUS:
-        XENVIF_VIF(MacQueryState,
-                    &Adapter->VifInterface,
-                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
-                    NULL,
-                    NULL);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+    (VOID) XENBUS_STORE(Printf,
+                        &Adapter->StoreInterface,
+                        NULL,
+                        "drivers",
+                        Distribution,
+                        "%s %s %u.%u.%u %s",
+                        Vendor,
+                        Product,
+                        MAJOR_VERSION,
+                        MINOR_VERSION,
+                        MICRO_VERSION,
+                        ATTRIBUTES
+                        );
 
-    case OID_GEN_MAXIMUM_SEND_PACKETS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                16,
-                                &BytesWritten);
-        break;
+#undef  ATTRIBUTES
 
-    case OID_GEN_CURRENT_PACKET_FILTER:
-        AdapterGetPacketFilter(Adapter, &Value32);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+    Trace("<====\n");
+    return STATUS_SUCCESS;
 
-    case OID_GEN_XMIT_OK:
-        AdapterGetXmitOk(Adapter, &Value64);
-        BytesNeeded = sizeof(ULONG64);
-        ndisStatus = __SetUlong64(Buffer,
-                                  BufferLength,
-                                  Value64,
-                                  &BytesWritten);
-        break;
+fail2:
+    Error("fail2\n");
 
-    case OID_GEN_RCV_OK:
-        AdapterGetRcvOk(Adapter, &Value64);
-        BytesNeeded = sizeof(ULONG64);
-        ndisStatus = __SetUlong64(Buffer,
-                                  BufferLength,
-                                  Value64,
-                                  &BytesWritten);
-        break;
+fail1:
+    Error("fail1 (%08x)\n", status);
 
-    case OID_GEN_XMIT_ERROR:
-        AdapterGetXmitError(Adapter, &Value32);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+    return status;
+}
 
-    case OID_GEN_RCV_ERROR:
-        AdapterGetRcvError(Adapter, &Value32);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+static DECLSPEC_NOINLINE VOID
+AdapterSuspendCallbackLate(
+    IN  PVOID       Argument
+    )
+{
+    PXENNET_ADAPTER Adapter = Argument;
 
-    case OID_GEN_RCV_NO_BUFFER:
-    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
-    case OID_GEN_RCV_CRC_ERROR:
-    case OID_802_3_RCV_ERROR_ALIGNMENT:
-    case OID_802_3_XMIT_ONE_COLLISION:
-    case OID_802_3_XMIT_MORE_COLLISIONS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                0,
-                                &BytesWritten);
-        break;
+    (VOID) __AdapterSetDistribution(Adapter);
+}
 
-    case OID_802_3_MAXIMUM_LIST_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                32,
-                                &BytesWritten);
-        break;
+static NTSTATUS
+AdapterSetDistribution(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    LONG                Count;
+    NTSTATUS            status;
 
-    case OID_GEN_DIRECTED_BYTES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    Trace("====>\n");
 
-    case OID_GEN_DIRECTED_FRAMES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    Count = InterlockedIncrement(&AdapterCount);
+    ASSERT(Count != 0);
 
-    case OID_GEN_MULTICAST_BYTES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    if (Count != 1)
+        goto done;
 
-    case OID_GEN_MULTICAST_FRAMES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    status = __AdapterSetDistribution(Adapter);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = XENBUS_SUSPEND(Register,
+                            &Adapter->SuspendInterface,
+                            SUSPEND_CALLBACK_LATE,
+                            AdapterSuspendCallbackLate,
+                            Adapter,
+                            &Adapter->SuspendCallbackLate);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+done:
+    Trace("<====\n");
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    __AdapterClearDistribution(Adapter);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static VOID
+AdapterClearDistribution(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    LONG                Count;
+
+    Trace("====>\n");
+
+    Count = InterlockedDecrement(&AdapterCount);
+
+    if (Count != 0)
+        goto done;
+
+    XENBUS_SUSPEND(Deregister,
+                   &Adapter->SuspendInterface,
+                   Adapter->SuspendCallbackLate);
+    Adapter->SuspendCallbackLate = NULL;
+
+    __AdapterClearDistribution(Adapter);
+
+done:
+    Trace("<====\n");
+}
+
+NDIS_STATUS
+AdapterEnable(
+    IN  PXENNET_ADAPTER     Adapter
+    )
+{
+    NTSTATUS                status;
+    NDIS_STATUS             ndisStatus;
+
+    ASSERT(!Adapter->Enabled);
+
+    status = XENBUS_CACHE(Acquire,
+                          &Adapter->CacheInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = XENBUS_STORE(Acquire,
+                          &Adapter->StoreInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_SUSPEND(Acquire,
+                            &Adapter->SuspendInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    (VOID) AdapterSetDistribution(Adapter);
+
+    ndisStatus = TransmitterEnable(Adapter->Transmitter);
+    if (ndisStatus != NDIS_STATUS_SUCCESS)
+        goto fail4;
+
+    ndisStatus = ReceiverEnable(Adapter->Receiver);
+    if (ndisStatus != NDIS_STATUS_SUCCESS)
+        goto fail5;
+
+    status = XENVIF_VIF(Enable,
+                        &Adapter->VifInterface,
+                        AdapterVifCallback,
+                        Adapter);
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    AdapterMediaStateChange(Adapter);
+
+    Adapter->Enabled = TRUE;
+
+    return NDIS_STATUS_SUCCESS;
+
+fail6:
+    ReceiverDisable(Adapter->Receiver);
+
+fail5:
+    TransmitterDisable(Adapter->Transmitter);
+
+fail4:
+    AdapterClearDistribution(Adapter);
+
+    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
+
+fail3:
+    XENBUS_STORE(Release, &Adapter->StoreInterface);
+
+fail2:
+    XENBUS_CACHE(Release, &Adapter->CacheInterface);
+
+fail1:
+    return NDIS_STATUS_FAILURE;
+}
 
-    case OID_GEN_BROADCAST_BYTES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+VOID
+AdapterDisable(
+    IN  PXENNET_ADAPTER     Adapter
+    )
+{
+    ASSERT(Adapter->Enabled);
+    Adapter->Enabled = FALSE;
 
-    case OID_GEN_BROADCAST_FRAMES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    XENVIF_VIF(Disable,
+               &Adapter->VifInterface);
 
-    case OID_GEN_DIRECTED_BYTES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_UNICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    AdapterMediaStateChange(Adapter);
 
-    case OID_GEN_DIRECTED_FRAMES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_UNICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    ReceiverDisable(Adapter->Receiver);
+    TransmitterDisable(Adapter->Transmitter);
 
-    case OID_GEN_MULTICAST_BYTES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_MULTICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    AdapterClearDistribution(Adapter);
 
-    case OID_GEN_MULTICAST_FRAMES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_MULTICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
+    XENBUS_STORE(Release, &Adapter->StoreInterface);
+    XENBUS_CACHE(Release, &Adapter->CacheInterface);
+}
 
-    case OID_GEN_BROADCAST_BYTES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_BROADCAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+VOID
+AdapterMediaStateChange(
+    IN  PXENNET_ADAPTER     Adapter
+    )
+{
+    NDIS_LINK_STATE         LinkState;
+    NDIS_STATUS_INDICATION  StatusIndication;
 
-    case OID_GEN_BROADCAST_FRAMES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_BROADCAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
+    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
+    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
+    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
 
-    case OID_GEN_INTERRUPT_MODERATION:
-        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
-        ndisStatus = AdapterInterruptModeration(Adapter,
-                                                (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
-                                                BufferLength,
-                                                &BytesWritten);
-        break;
+    XENVIF_VIF(MacQueryState,
+               &Adapter->VifInterface,
+               &LinkState.MediaConnectState,
+               &LinkState.RcvLinkSpeed,
+               &LinkState.MediaDuplexState);
 
-    case OID_IP4_OFFLOAD_STATS:
-    case OID_IP6_OFFLOAD_STATS:
-    case OID_GEN_SUPPORTED_GUIDS:
-        // We don't handle these since NDIS 6.0 is supposed to do this for us
-    case OID_GEN_MAC_ADDRESS:
-    case OID_GEN_MAX_LINK_SPEED:
-        // ignore these common unwanted OIDs
-	case OID_GEN_INIT_TIME_MS:
-	case OID_GEN_RESET_COUNTS:
-	case OID_GEN_MEDIA_SENSE_COUNTS:
-        Warn = FALSE;
-        /*FALLTHRU*/
-    default:
-        if (Warn)
-            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
+    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
+        Info("LINK: STATE UNKNOWN\n");
+    } else if (LinkState.MediaConnectState == MediaConnectStateDisconnected) {
+        Info("LINK: DOWN\n");
+    } else {
+        ASSERT3U(LinkState.MediaConnectState, ==, MediaConnectStateConnected);
 
-        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
-        break;
+        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
+            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n", LinkState.RcvLinkSpeed);
+        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
+            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n", LinkState.RcvLinkSpeed);
+        else
+            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n", LinkState.RcvLinkSpeed);
     }
 
-    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
-    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
+    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
 
-    return ndisStatus;
+    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
+    StatusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
+    StatusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
+    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
+
+    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
+    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
+    StatusIndication.StatusBuffer = &LinkState;
+    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
+
+    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle, &StatusIndication);
 }
 
-static NTSTATUS
-__QueryInterface(
-    IN  PDEVICE_OBJECT  DeviceObject,
-    IN  const GUID      *Guid,
-    IN  ULONG           Version,
-    OUT PINTERFACE      Interface,
-    IN  ULONG           Size,
-    IN  BOOLEAN         Optional
+NDIS_STATUS
+AdapterSetInformation(
+    IN  PXENNET_ADAPTER     Adapter,
+    IN  PNDIS_OID_REQUEST   Request
     )
 {
-    KEVENT              Event;
-    IO_STATUS_BLOCK     StatusBlock;
-    PIRP                Irp;
-    PIO_STACK_LOCATION  StackLocation;
-    NTSTATUS            status;
+    PVOID                   Buffer;
+    ULONG                   BufferLength;
+    ULONG                   BytesNeeded;
+    ULONG                   BytesRead;
+    BOOLEAN                 Warn;
+    NDIS_STATUS             ndisStatus;
 
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
+    BufferLength = Request->DATA.SET_INFORMATION.InformationBufferLength;
+    BytesNeeded = BytesRead = 0;
+    Warn = TRUE;
+    ndisStatus = NDIS_STATUS_SUCCESS;
 
-    KeInitializeEvent(&Event, NotificationEvent, FALSE);
-    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
+    switch (Request->DATA.SET_INFORMATION.Oid) {
+    case OID_PNP_SET_POWER:
+        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
+        if (BufferLength >= BytesNeeded) {
+            PNDIS_DEVICE_POWER_STATE PowerState;
 
-    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
-                                       DeviceObject,
-                                       NULL,
-                                       0,
-                                       NULL,
-                                       &Event,
-                                       &StatusBlock);
+            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
+            switch (*PowerState) {
+            case NdisDeviceStateD0:
+                Info("SET_POWER: D0\n");
+                break;
 
-    status = STATUS_UNSUCCESSFUL;
-    if (Irp == NULL)
-        goto fail1;
+            case NdisDeviceStateD1:
+                Info("SET_POWER: D1\n");
+                break;
 
-    StackLocation = IoGetNextIrpStackLocation(Irp);
-    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
+            case NdisDeviceStateD2:
+                Info("SET_POWER: D2\n");
+                break;
 
-    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
-    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
-    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
-    StackLocation->Parameters.QueryInterface.Interface = Interface;
+            case NdisDeviceStateD3:
+                Info("SET_POWER: D3\n");
+                break;
+            }
+        }
+        // do nothing
+        break;
 
-    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+    case OID_GEN_CURRENT_LOOKAHEAD:
+        BytesNeeded = sizeof(ULONG);
+        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
+        if (BufferLength == BytesNeeded) {
+            Adapter->CurrentLookahead = *(PULONG)Buffer;
+            BytesRead = sizeof(ULONG);
+        }
+        break;
 
-    status = IoCallDriver(DeviceObject, Irp);
-    if (status == STATUS_PENDING) {
-        (VOID) KeWaitForSingleObject(&Event,
-                                     Executive,
-                                     KernelMode,
-                                     FALSE,
-                                     NULL);
-        status = StatusBlock.Status;
-    }
+    case OID_GEN_CURRENT_PACKET_FILTER:
+        BytesNeeded = sizeof(ULONG);
+        if (BufferLength == BytesNeeded) {
+            ndisStatus = AdapterSetPacketFilter(Adapter,
+                                                (PULONG)Buffer);
+            BytesRead = sizeof(ULONG);
+        }
+        break;
 
-    if (!NT_SUCCESS(status)) {
-        if (status == STATUS_NOT_SUPPORTED && Optional)
-            goto done;
+    case OID_802_3_MULTICAST_LIST:
+        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
+        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
+            ndisStatus = AdapterSetMulticastAddresses(Adapter,
+                                                      Buffer,
+                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = BufferLength;
+        } else {
+            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
+        }
+        break;
 
-        goto fail2;
-    }
+    case OID_OFFLOAD_ENCAPSULATION:
+        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
+        if (BufferLength >= BytesNeeded) {
+            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
+                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
+        }
+        break;
 
-done:
-    return STATUS_SUCCESS;
+    case OID_TCP_OFFLOAD_PARAMETERS:
+        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
+        if (BufferLength >= BytesNeeded) {
+            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
+                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
+        }
+        break;
 
-fail2:
-    Error("fail2\n");
+    case OID_GEN_HD_SPLIT_PARAMETERS:
+        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
+        if (BufferLength >= BytesNeeded) {
+            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
+                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
+        }
+        break;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    case OID_GEN_INTERRUPT_MODERATION:
+    case OID_GEN_MACHINE_NAME:
+        Warn = FALSE;
+        /*FALLTHRU*/
+    default:
+        if (Warn)
+            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
 
-    return status;
-}
+        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
+        break;
+    }
 
-#pragma prefast(push)
-#pragma prefast(disable:6102)
+    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
+    if (ndisStatus == NDIS_STATUS_SUCCESS)
+        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
 
-#define READ_PROPERTY(field, name, defaultval, handle)  \
-    do {                                                \
-        NDIS_STATUS                     _Status;        \
-        NDIS_STRING                     _Value;         \
-        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
-        RtlInitUnicodeString(&_Value, name);            \
-        NdisReadConfiguration(&_Status, &_Data, handle, \
-                        &_Value, NdisParameterInteger); \
-        if (_Status == NDIS_STATUS_SUCCESS)             \
-            field = _Data->ParameterData.IntegerData;   \
-        else                                            \
-            field = defaultval;                         \
-    } while (FALSE);
+    return ndisStatus;
+}
 
-static NDIS_STATUS
-AdapterGetAdvancedSettings(
-    IN  PXENNET_ADAPTER Adapter
+static FORCEINLINE NDIS_STATUS
+__CopyBuffer(
+    IN  PVOID   Destination,
+    IN  ULONG   DestinationLength,
+    IN  PVOID   Source,
+    IN  ULONG   SourceLength,
+    OUT PULONG  CopyLength
     )
 {
-    NDIS_CONFIGURATION_OBJECT   Config;
-    NDIS_HANDLE                 Handle;
-    NDIS_STATUS                 ndisStatus;
-
-    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
-    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
-    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
-    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
-    Config.NdisHandle = Adapter->NdisAdapterHandle;
-    Config.Flags = 0;
-
-    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail1;
-
-    READ_PROPERTY(Adapter->Properties.ipv4_csum, L"*IPChecksumOffloadIPv4", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.tcpv4_csum, L"*TCPChecksumOffloadIPv4", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.udpv4_csum, L"*UDPChecksumOffloadIPv4", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.tcpv6_csum, L"*TCPChecksumOffloadIPv6", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.udpv6_csum, L"*UDPChecksumOffloadIPv6", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.need_csum_value, L"NeedChecksumValue", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.HeaderDataSplit, L"*HeaderDataSplit", 1, Handle);
-
-    NdisCloseConfiguration(Handle);
-
-    return NDIS_STATUS_SUCCESS;
+    *CopyLength = __min(SourceLength, DestinationLength);
+    RtlCopyMemory(Destination, Source, *CopyLength);
 
-fail1:
-    return NDIS_STATUS_FAILURE;
+    return (DestinationLength >= SourceLength) ?
+           NDIS_STATUS_SUCCESS :
+           NDIS_STATUS_BUFFER_TOO_SHORT;
 }
 
-#undef READ_PROPERTY
-
-#pragma prefast(pop)
-
-static NDIS_STATUS
-AdapterSetRegistrationAttributes(
-    IN  PXENNET_ADAPTER Adapter
+static FORCEINLINE NDIS_STATUS
+__SetUlong(
+    IN  PVOID   Destination,
+    IN  ULONG   DestinationLength,
+    IN  ULONG   Source,
+    OUT PULONG  CopyLength
     )
 {
-    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
-    NDIS_STATUS                                     ndisStatus;
+    return __CopyBuffer(Destination,
+                        DestinationLength & ~3,
+                        &Source,
+                        sizeof (ULONG),
+                        CopyLength);
+}
 
-    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
-    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
-    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
-                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
-    Attribs.CheckForHangTimeInSeconds = 0;
-    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
+static FORCEINLINE NDIS_STATUS
+__SetUlong64(
+    IN  PVOID   Destination,
+    IN  ULONG   DestinationLength,
+    IN  ULONG64 Source,
+    OUT PULONG  CopyLength
+    )
+{
+    NDIS_STATUS ndisStatus;
 
-    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    ndisStatus =  __CopyBuffer(Destination,
+                               DestinationLength & ~3,
+                               &Source,
+                               sizeof (ULONG64),
+                               CopyLength);
+    if (DestinationLength >= 4)
+        ndisStatus = NDIS_STATUS_SUCCESS;
 
     return ndisStatus;
 }
 
-static NDIS_STATUS
-AdapterSetGeneralAttributes(
-    IN  PXENNET_ADAPTER Adapter
+NDIS_STATUS
+AdapterQueryInformation(
+    IN  PXENNET_ADAPTER     Adapter,
+    IN  PNDIS_OID_REQUEST   Request
     )
 {
-    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
-    NDIS_STATUS                                 ndisStatus;
-
-    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
-    Attribs.MediaType = XENNET_MEDIA_TYPE;
-
-    XENVIF_VIF(MacQueryMaximumFrameSize,
-               &Adapter->VifInterface,
-               (PULONG)&Adapter->MaximumFrameSize);
-
-    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof (ETHERNET_TAGGED_HEADER);
-    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.MediaConnectState = MediaConnectStateConnected;
-    Attribs.MediaDuplexState = MediaDuplexStateFull;
-    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
-    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
-    Attribs.MacOptions = XENNET_MAC_OPTIONS;
-    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
-    Attribs.MaxMulticastListSize = 32;
-    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
-
-    XENVIF_VIF(MacQueryPermanentAddress,
-               &Adapter->VifInterface,
-               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
-    XENVIF_VIF(MacQueryCurrentAddress,
-               &Adapter->VifInterface,
-               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
+    PVOID                   Buffer;
+    ULONG                   BufferLength;
+    ULONG                   BytesNeeded;
+    ULONG                   BytesWritten;
+    ULONG                   Value32;
+    ULONGLONG               Value64;
+    ETHERNET_ADDRESS        EthernetAddress;
+    BOOLEAN                 Warn;
+    NDIS_STATUS             ndisStatus;
 
-    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
-    Attribs.RecvScaleCapabilities = NULL;
-    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
-    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
-    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
-    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
-    Attribs.IfConnectorPresent = TRUE;
-    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
-                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
-                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
-                      
-    Attribs.SupportedOidList = XennetSupportedOids;
-    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
+    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
+    BufferLength = Request->DATA.QUERY_INFORMATION.InformationBufferLength;
+    BytesNeeded = BytesWritten = 0;
+    Warn = TRUE;
+    ndisStatus = NDIS_STATUS_SUCCESS;
 
-    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    switch (Request->DATA.QUERY_INFORMATION.Oid) {
+    case OID_PNP_CAPABILITIES:
+        BytesNeeded = sizeof(Adapter->Capabilities);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &Adapter->Capabilities,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    return ndisStatus;
-}
+    case OID_PNP_QUERY_POWER:
+        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
 
-static NDIS_STATUS
-AdapterSetOffloadAttributes(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
-    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
-    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
-    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
-    NDIS_OFFLOAD                                Default;
-    NDIS_OFFLOAD                                Supported;
-    NDIS_STATUS                                 ndisStatus;
+        if (BufferLength >= BytesNeeded) {
+            PNDIS_DEVICE_POWER_STATE PowerState;
 
-    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
-    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
+            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
+            switch (*PowerState) {
+            case NdisDeviceStateD0:
+                Info("QUERY_POWER: D0\n");
+                break;
 
-    TxOptions->Value = 0;
-    TxOptions->OffloadTagManipulation = 1;
+            case NdisDeviceStateD1:
+                Info("QUERY_POWER: D1\n");
+                break;
 
-    RxOptions->Value = 0;
-    RxOptions->OffloadTagManipulation = 1;
+            case NdisDeviceStateD2:
+                Info("QUERY_POWER: D2\n");
+                break;
 
-    if (Adapter->Properties.need_csum_value)
-        RxOptions->NeedChecksumValue = 1;
+            case NdisDeviceStateD3:
+                Info("QUERY_POWER: D3\n");
+                break;
+            }
+        }
 
-    if (Adapter->Properties.lrov4) {
-        RxOptions->OffloadIpVersion4LargePacket = 1;
-        RxOptions->NeedLargePacketSplit = 1;
-    }
+        BytesWritten = 0;
+        // do nothing
+        break;
 
-    if (Adapter->Properties.lrov6) {
-        RxOptions->OffloadIpVersion6LargePacket = 1;
-        RxOptions->NeedLargePacketSplit = 1;
-    }
+    case OID_GEN_SUPPORTED_LIST:
+        BytesNeeded = sizeof(XennetSupportedOids);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &XennetSupportedOids[0],
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    XENVIF_VIF(ReceiverSetOffloadOptions,
-               &Adapter->VifInterface,
-               *RxOptions);
+    case OID_GEN_HARDWARE_STATUS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                NdisHardwareStatusReady,
+                                &BytesWritten);
+        break;
 
-    XENVIF_VIF(TransmitterQueryOffloadOptions,
-               &Adapter->VifInterface,
-               &Options);
+    case OID_GEN_MEDIA_SUPPORTED:
+    case OID_GEN_MEDIA_IN_USE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                XENNET_MEDIA_TYPE,
+                                &BytesWritten);
+        break;
 
-    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
-    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
-    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
-    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
+    case OID_GEN_MAXIMUM_LOOKAHEAD:
+    case OID_GEN_TRANSMIT_BLOCK_SIZE:
+    case OID_GEN_RECEIVE_BLOCK_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->MaximumFrameSize,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_GEN_TRANSMIT_BUFFER_SPACE:
+    case OID_GEN_RECEIVE_BUFFER_SPACE:
+        XENVIF_VIF(TransmitterQueryRingSize,
+                    &Adapter->VifInterface,
+                    (PULONG)&Value32);
+        Value32 *= Adapter->MaximumFrameSize;
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.IpChecksum = 1;
-    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
+    case OID_GEN_VENDOR_DESCRIPTION:
+        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  VENDOR_NAME_STR,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
-    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
+    case OID_GEN_VENDOR_DRIVER_VERSION:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
+    case OID_GEN_DRIVER_VERSION:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (6 << 8) | 0, // NDIS 6.0
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_GEN_MAC_OPTIONS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                XENNET_MAC_OPTIONS,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
+    case OID_GEN_STATISTICS:
+        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
+        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
+                                                   (PNDIS_STATISTICS_INFO)Buffer,
+                                                   BufferLength,
+                                                   &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
-    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
+    case OID_802_3_MULTICAST_LIST:
+        ndisStatus = AdapterQueryMulticastList(Adapter,
+                                               Buffer,
+                                               BufferLength,
+                                               &BytesNeeded,
+                                               &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
+    case OID_802_3_PERMANENT_ADDRESS:
+        XENVIF_VIF(MacQueryPermanentAddress,
+                    &Adapter->VifInterface,
+                    &EthernetAddress);
+        BytesNeeded = sizeof(ETHERNET_ADDRESS);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &EthernetAddress,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_802_3_CURRENT_ADDRESS:
+        XENVIF_VIF(MacQueryCurrentAddress,
+                    &Adapter->VifInterface,
+                    &EthernetAddress);
+        BytesNeeded = sizeof(ETHERNET_ADDRESS);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &EthernetAddress,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
+
+    case OID_GEN_MAXIMUM_FRAME_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->MaximumFrameSize -
+                                    sizeof(ETHERNET_TAGGED_HEADER),
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_MAXIMUM_TOTAL_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->MaximumFrameSize -
+                                    sizeof(ETHERNET_TAGGED_HEADER) +
+                                    sizeof (ETHERNET_UNTAGGED_HEADER),
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_CURRENT_LOOKAHEAD:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->CurrentLookahead,
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_VENDOR_ID:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                0x5853,
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_LINK_SPEED:
+        XENVIF_VIF(MacQueryState,
+                   &Adapter->VifInterface,
+                   NULL,
+                   &Value64,
+                   NULL);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)(Value64 / 100),
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_MEDIA_CONNECT_STATUS:
+        XENVIF_VIF(MacQueryState,
+                    &Adapter->VifInterface,
+                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
+                    NULL,
+                    NULL);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_MAXIMUM_SEND_PACKETS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                16,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4HeaderChecksum) {
-        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
-        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
-    }
+    case OID_GEN_CURRENT_PACKET_FILTER:
+        AdapterGetPacketFilter(Adapter, &Value32);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4TcpChecksum) {
-        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
-        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
-    }
+    case OID_GEN_XMIT_OK:
+        AdapterGetXmitOk(Adapter, &Value64);
+        BytesNeeded = sizeof(ULONG64);
+        ndisStatus = __SetUlong64(Buffer,
+                                  BufferLength,
+                                  Value64,
+                                  &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4UdpChecksum)
-        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
+    case OID_GEN_RCV_OK:
+        AdapterGetRcvOk(Adapter, &Value64);
+        BytesNeeded = sizeof(ULONG64);
+        ndisStatus = __SetUlong64(Buffer,
+                                  BufferLength,
+                                  Value64,
+                                  &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_GEN_XMIT_ERROR:
+        AdapterGetXmitError(Adapter, &Value32);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
+    case OID_GEN_RCV_ERROR:
+        AdapterGetRcvError(Adapter, &Value32);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion6TcpChecksum) {
-        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
-        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
-    }
+    case OID_GEN_RCV_NO_BUFFER:
+    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
+    case OID_GEN_RCV_CRC_ERROR:
+    case OID_802_3_RCV_ERROR_ALIGNMENT:
+    case OID_802_3_XMIT_ONE_COLLISION:
+    case OID_802_3_XMIT_MORE_COLLISIONS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                0,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion6UdpChecksum)
-        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
+    case OID_802_3_MAXIMUM_LIST_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                32,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4LargePacket) {
-        XENVIF_VIF(TransmitterQueryLargePacketSize,
+    case OID_GEN_DIRECTED_BYTES_XMIT:
+        XENVIF_VIF(QueryStatistic,
                    &Adapter->VifInterface,
-                   4,
-                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
-        Supported.LsoV2.IPv4.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
-        Supported.LsoV2.IPv4.MinSegmentCount = 2;
-    }
+                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion6LargePacket) {
-        XENVIF_VIF(TransmitterQueryLargePacketSize,
+    case OID_GEN_DIRECTED_FRAMES_XMIT:
+        XENVIF_VIF(QueryStatistic,
                    &Adapter->VifInterface,
-                   6,
-                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
-        Supported.LsoV2.IPv6.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
-        Supported.LsoV2.IPv6.MinSegmentCount = 2;
-        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
-        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
-    }
-
-    Default = Supported;
+                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.ipv4_csum & 2))
-        Default.Checksum.IPv4Receive.IpChecksum = 0;
+    case OID_GEN_MULTICAST_BYTES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv4_csum & 2))
-        Default.Checksum.IPv4Receive.TcpChecksum = 0;
+    case OID_GEN_MULTICAST_FRAMES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv4_csum & 2))
-        Default.Checksum.IPv4Receive.UdpChecksum = 0;
+    case OID_GEN_BROADCAST_BYTES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv6_csum & 2))
-        Default.Checksum.IPv6Receive.TcpChecksum = 0;
+    case OID_GEN_BROADCAST_FRAMES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv6_csum & 2))
-        Default.Checksum.IPv6Receive.UdpChecksum = 0;
+    case OID_GEN_DIRECTED_BYTES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_UNICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.ipv4_csum & 1))
-        Default.Checksum.IPv4Transmit.IpChecksum = 0;
+    case OID_GEN_DIRECTED_FRAMES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_UNICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv4_csum & 1))
-        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
+    case OID_GEN_MULTICAST_BYTES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_MULTICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv4_csum & 1))
-        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
+    case OID_GEN_MULTICAST_FRAMES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_MULTICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv6_csum & 1))
-        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
+    case OID_GEN_BROADCAST_BYTES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_BROADCAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv6_csum & 1))
-        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
+    case OID_GEN_BROADCAST_FRAMES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_BROADCAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.lsov4)) {
-        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
-        Default.LsoV2.IPv4.MinSegmentCount = 0;
-    }
+    case OID_GEN_INTERRUPT_MODERATION:
+        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
+        ndisStatus = AdapterInterruptModeration(Adapter,
+                                                (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
+                                                BufferLength,
+                                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.lsov6)) {
-        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
-        Default.LsoV2.IPv6.MinSegmentCount = 0;
-    }
+    case OID_IP4_OFFLOAD_STATS:
+    case OID_IP6_OFFLOAD_STATS:
+    case OID_GEN_SUPPORTED_GUIDS:
+        // We don't handle these since NDIS 6.0 is supposed to do this for us
+    case OID_GEN_MAC_ADDRESS:
+    case OID_GEN_MAX_LINK_SPEED:
+        // ignore these common unwanted OIDs
+	case OID_GEN_INIT_TIME_MS:
+	case OID_GEN_RESET_COUNTS:
+	case OID_GEN_MEDIA_SENSE_COUNTS:
+        Warn = FALSE;
+        /*FALLTHRU*/
+    default:
+        if (Warn)
+            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
 
-    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof (NDIS_OFFLOAD))) {
-        Adapter->Offload = Default;
-        DISPLAY_OFFLOAD(Default);
+        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
+        break;
     }
 
-    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = sizeof(Attribs);
-    Attribs.DefaultOffloadConfiguration = &Default;
-    Attribs.HardwareOffloadCapabilities = &Supported;
+    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
+    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
 
-    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
     return ndisStatus;
 }
 
-static NDIS_STATUS
-AdapterSetHeaderDataSplitAttributes(
-    IN  PXENNET_ADAPTER                                 Adapter
+static NTSTATUS
+__QueryInterface(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  const GUID      *Guid,
+    IN  ULONG           Version,
+    OUT PINTERFACE      Interface,
+    IN  ULONG           Size,
+    IN  BOOLEAN         Optional
     )
 {
-    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
-    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
-    NDIS_STATUS                                         NdisStatus;
-
-    RtlZeroMemory(&Attribs, sizeof(Attribs));
+    KEVENT              Event;
+    IO_STATUS_BLOCK     StatusBlock;
+    PIRP                Irp;
+    PIO_STACK_LOCATION  StackLocation;
+    NTSTATUS            status;
 
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
-    RtlZeroMemory(&Split, sizeof(Split));
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
 
-    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
-    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
-    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
-    Split.HardwareCapabilities =
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
+    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
+                                       DeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       &Event,
+                                       &StatusBlock);
 
-    if (Adapter->Properties.HeaderDataSplit != 0)
-        Split.CurrentCapabilities = Split.HardwareCapabilities;
+    status = STATUS_UNSUCCESSFUL;
+    if (Irp == NULL)
+        goto fail1;
 
-    Attribs.HDSplitAttributes = &Split;
+    StackLocation = IoGetNextIrpStackLocation(Irp);
+    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
 
-    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
-    if (NdisStatus != NDIS_STATUS_SUCCESS)
-        goto fail1;
+    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
+    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
+    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
+    StackLocation->Parameters.QueryInterface.Interface = Interface;
 
-    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
-        ASSERT(Split.CurrentCapabilities & NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
+    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
 
-        Info("BackfillSize = %u\n", Split.BackfillSize);
-        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
+    status = IoCallDriver(DeviceObject, Irp);
+    if (status == STATUS_PENDING) {
+        (VOID) KeWaitForSingleObject(&Event,
+                                     Executive,
+                                     KernelMode,
+                                     FALSE,
+                                     NULL);
+        status = StatusBlock.Status;
+    }
 
-        XENVIF_VIF(ReceiverSetBackfillSize,
-                   &Adapter->VifInterface,
-                   Split.BackfillSize);
+    if (!NT_SUCCESS(status)) {
+        if (status == STATUS_NOT_SUPPORTED && Optional)
+            goto done;
 
-        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
+        goto fail2;
     }
 
-    return NDIS_STATUS_SUCCESS;
+done:
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
 
 fail1:
-    Error("fail1 (%08x)\n", NdisStatus);
+    Error("fail1 (%08x)\n", status);
 
-    return NdisStatus;
+    return status;
 }
 
-static FORCEINLINE PVOID
-__AdapterAllocate(
-    IN  ULONG   Length
-    )
-{
-    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
-}
+#pragma prefast(push)
+#pragma prefast(disable:6102)
 
-static FORCEINLINE VOID
-__AdapterFree(
-    IN  PVOID   Buffer
-    )
-{
-    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
-}
+#define READ_PROPERTY(field, name, defaultval, handle)  \
+    do {                                                \
+        NDIS_STATUS                     _Status;        \
+        NDIS_STRING                     _Value;         \
+        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
+        RtlInitUnicodeString(&_Value, name);            \
+        NdisReadConfiguration(&_Status, &_Data, handle, \
+                        &_Value, NdisParameterInteger); \
+        if (_Status == NDIS_STATUS_SUCCESS)             \
+            field = _Data->ParameterData.IntegerData;   \
+        else                                            \
+            field = defaultval;                         \
+    } while (FALSE);
 
-static FORCEINLINE PANSI_STRING
-__AdapterMultiSzToUpcaseAnsi(
-    IN  PCHAR       Buffer
+static NDIS_STATUS
+AdapterGetAdvancedSettings(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    PANSI_STRING    Ansi;
-    LONG            Index;
-    LONG            Count;
-    NTSTATUS        status;
-
-    Index = 0;
-    Count = 0;
-    for (;;) {
-        if (Buffer[Index] == '\0') {
-            Count++;
-            Index++;
-
-            // Check for double NUL
-            if (Buffer[Index] == '\0')
-                break;
-        } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
-            Index++;
-        }
-    }
+    NDIS_CONFIGURATION_OBJECT   Config;
+    NDIS_HANDLE                 Handle;
+    NDIS_STATUS                 ndisStatus;
 
-    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
+    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
+    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
+    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
+    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
+    Config.NdisHandle = Adapter->NdisAdapterHandle;
+    Config.Flags = 0;
 
-    status = STATUS_NO_MEMORY;
-    if (Ansi == NULL)
+    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
+    if (ndisStatus != NDIS_STATUS_SUCCESS)
         goto fail1;
 
-    for (Index = 0; Index < Count; Index++) {
-        ULONG   Length;
-
-        Length = (ULONG)strlen(Buffer);
-        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
-        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
-
-        status = STATUS_NO_MEMORY;
-        if (Ansi[Index].Buffer == NULL)
-            goto fail2;
-
-        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
-        Ansi[Index].Length = (USHORT)Length;
-
-        Buffer += Length + 1;
-    }
-
-    return Ansi;
-
-fail2:
-    Error("fail2\n");
+    READ_PROPERTY(Adapter->Properties.ipv4_csum, L"*IPChecksumOffloadIPv4", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.tcpv4_csum, L"*TCPChecksumOffloadIPv4", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.udpv4_csum, L"*UDPChecksumOffloadIPv4", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.tcpv6_csum, L"*TCPChecksumOffloadIPv6", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.udpv6_csum, L"*UDPChecksumOffloadIPv6", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.need_csum_value, L"NeedChecksumValue", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.HeaderDataSplit, L"*HeaderDataSplit", 1, Handle);
 
-    while (--Index >= 0)
-        __AdapterFree(Ansi[Index].Buffer);
+    NdisCloseConfiguration(Handle);
 
-    __AdapterFree(Ansi);
+    return NDIS_STATUS_SUCCESS;
 
 fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
+    return NDIS_STATUS_FAILURE;
 }
 
-static FORCEINLINE VOID
-__AdapterFreeAnsi(
-    IN  PANSI_STRING    Ansi
+#undef READ_PROPERTY
+
+#pragma prefast(pop)
+
+static NDIS_STATUS
+AdapterSetRegistrationAttributes(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    ULONG               Index;
+    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
+    NDIS_STATUS                                     ndisStatus;
+
+    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
+    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
+    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
+                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
+    Attribs.CheckForHangTimeInSeconds = 0;
+    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
 
-    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
-        __AdapterFree(Ansi[Index].Buffer);
+    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
 
-    __AdapterFree(Ansi);
+    return ndisStatus;
 }
 
-static FORCEINLINE BOOLEAN
-__AdapterMatchDistribution(
-    IN  PXENNET_ADAPTER Adapter,
-    IN  PCHAR           Buffer
+static NDIS_STATUS
+AdapterSetGeneralAttributes(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    PCHAR               Vendor;
-    PCHAR               Product;
-    PCHAR               Context;
-    const CHAR          *Text;
-    BOOLEAN             Match;
-    ULONG               Index;
-    NTSTATUS            status;
+    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
+    NDIS_STATUS                                 ndisStatus;
 
-    UNREFERENCED_PARAMETER(Adapter);
+    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
+    Attribs.MediaType = XENNET_MEDIA_TYPE;
 
-    status = STATUS_INVALID_PARAMETER;
+    XENVIF_VIF(MacQueryMaximumFrameSize,
+               &Adapter->VifInterface,
+               (PULONG)&Adapter->MaximumFrameSize);
 
-    Vendor = __strtok_r(Buffer, " ", &Context);
-    if (Vendor == NULL)
-        goto fail1;
+    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof (ETHERNET_TAGGED_HEADER);
+    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.MediaConnectState = MediaConnectStateConnected;
+    Attribs.MediaDuplexState = MediaDuplexStateFull;
+    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
+    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
+    Attribs.MacOptions = XENNET_MAC_OPTIONS;
+    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
+    Attribs.MaxMulticastListSize = 32;
+    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
 
-    Product = __strtok_r(NULL, " ", &Context);
-    if (Product == NULL)
-        goto fail2;
+    XENVIF_VIF(MacQueryPermanentAddress,
+               &Adapter->VifInterface,
+               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
+    XENVIF_VIF(MacQueryCurrentAddress,
+               &Adapter->VifInterface,
+               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
 
-    Match = TRUE;
+    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
+    Attribs.RecvScaleCapabilities = NULL;
+    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
+    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
+    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
+    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
+    Attribs.IfConnectorPresent = TRUE;
+    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
+                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
+                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
+                      
+    Attribs.SupportedOidList = XennetSupportedOids;
+    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
 
-    Text = VENDOR_NAME_STR;
+    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
 
-    for (Index = 0; Text[Index] != 0; Index++) {
-        if (!isalnum((UCHAR)Text[Index])) {
-            if (Vendor[Index] != '_') {
-                Match = FALSE;
-                break;
-            }
-        } else {
-            if (Vendor[Index] != Text[Index]) {
-                Match = FALSE;
-                break;
-            }
-        }
-    }
+    return ndisStatus;
+}
 
-    Text = "XENNET";
+static NDIS_STATUS
+AdapterSetOffloadAttributes(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
+    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
+    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
+    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
+    NDIS_OFFLOAD                                Default;
+    NDIS_OFFLOAD                                Supported;
+    NDIS_STATUS                                 ndisStatus;
 
-    if (_stricmp(Product, Text) != 0)
-        Match = FALSE;
+    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
+    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
 
-    return Match;
+    TxOptions->Value = 0;
+    TxOptions->OffloadTagManipulation = 1;
 
-fail2:
-    Error("fail2\n");
+    RxOptions->Value = 0;
+    RxOptions->OffloadTagManipulation = 1;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    if (Adapter->Properties.need_csum_value)
+        RxOptions->NeedChecksumValue = 1;
 
-    return FALSE;
-}
+    if (Adapter->Properties.lrov4) {
+        RxOptions->OffloadIpVersion4LargePacket = 1;
+        RxOptions->NeedLargePacketSplit = 1;
+    }
 
-static FORCEINLINE VOID
-__AdapterClearDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    PCHAR               Buffer;
-    PANSI_STRING        Distributions;
-    ULONG               Index;
-    NTSTATUS            status;
+    if (Adapter->Properties.lrov6) {
+        RxOptions->OffloadIpVersion6LargePacket = 1;
+        RxOptions->NeedLargePacketSplit = 1;
+    }
 
-    Trace("====>\n");
+    XENVIF_VIF(ReceiverSetOffloadOptions,
+               &Adapter->VifInterface,
+               *RxOptions);
 
-    status = XENBUS_STORE(Directory,
-                          &Adapter->StoreInterface,
-                          NULL,
-                          NULL,
-                          "drivers",
-                          &Buffer);
-    if (NT_SUCCESS(status)) {
-        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
+    XENVIF_VIF(TransmitterQueryOffloadOptions,
+               &Adapter->VifInterface,
+               &Options);
 
-        XENBUS_STORE(Free,
-                     &Adapter->StoreInterface,
-                     Buffer);
-    } else {
-        Distributions = NULL;
-    }
+    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
+    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
+    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
+    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
 
-    if (Distributions == NULL)
-        goto done;
+    Supported.Checksum.IPv4Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
 
-    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
-        PANSI_STRING    Distribution = &Distributions[Index];
+    Supported.Checksum.IPv4Receive.IpChecksum = 1;
+    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
 
-        status = XENBUS_STORE(Read,
-                              &Adapter->StoreInterface,
-                              NULL,
-                              "drivers",
-                              Distribution->Buffer,
-                              &Buffer);
-        if (!NT_SUCCESS(status))
-            continue;
+    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
+    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
 
-        if (__AdapterMatchDistribution(Adapter, Buffer))
-            (VOID) XENBUS_STORE(Remove,
-                                &Adapter->StoreInterface,
-                                NULL,
-                                "drivers",
-                                Distribution->Buffer);
+    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
 
-        XENBUS_STORE(Free,
-                     &Adapter->StoreInterface,
-                     Buffer);
-    }
+    Supported.Checksum.IPv6Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
 
-    __AdapterFreeAnsi(Distributions);
+    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
 
-done:
-    Trace("<====\n");
-}
+    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
+    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
 
-#define MAXIMUM_INDEX   255
+    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
 
-static FORCEINLINE NTSTATUS
-__AdapterSetDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    ULONG               Index;
-    CHAR                Distribution[MAXNAMELEN];
-    CHAR                Vendor[MAXNAMELEN];
-    const CHAR          *Product;
-    NTSTATUS            status;
+    Supported.Checksum.IPv4Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
 
-    Trace("====>\n");
+    if (Options.OffloadIpVersion4HeaderChecksum) {
+        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
+        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
+    }
 
-    Index = 0;
-    while (Index <= MAXIMUM_INDEX) {
-        PCHAR   Buffer;
+    if (Options.OffloadIpVersion4TcpChecksum) {
+        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
+        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
+    }
 
-        status = RtlStringCbPrintfA(Distribution,
-                                    MAXNAMELEN,
-                                    "%u",
-                                    Index);
-        ASSERT(NT_SUCCESS(status));
+    if (Options.OffloadIpVersion4UdpChecksum)
+        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
 
-        status = XENBUS_STORE(Read,
-                              &Adapter->StoreInterface,
-                              NULL,
-                              "drivers",
-                              Distribution,
-                              &Buffer);
-        if (!NT_SUCCESS(status)) {
-            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
-                goto update;
+    Supported.Checksum.IPv6Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+
+    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
 
-            goto fail1;
-        }
+    if (Options.OffloadIpVersion6TcpChecksum) {
+        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
+        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
+    }
 
-        XENBUS_STORE(Free,
-                     &Adapter->StoreInterface,
-                     Buffer);
+    if (Options.OffloadIpVersion6UdpChecksum)
+        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
 
-        Index++;
+    if (Options.OffloadIpVersion4LargePacket) {
+        XENVIF_VIF(TransmitterQueryLargePacketSize,
+                   &Adapter->VifInterface,
+                   4,
+                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
+        Supported.LsoV2.IPv4.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+        Supported.LsoV2.IPv4.MinSegmentCount = 2;
     }
 
-    status = STATUS_UNSUCCESSFUL;
-    goto fail2;
+    if (Options.OffloadIpVersion6LargePacket) {
+        XENVIF_VIF(TransmitterQueryLargePacketSize,
+                   &Adapter->VifInterface,
+                   6,
+                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
+        Supported.LsoV2.IPv6.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+        Supported.LsoV2.IPv6.MinSegmentCount = 2;
+        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
+        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
+    }
 
-update:
-    status = RtlStringCbPrintfA(Vendor,
-                                MAXNAMELEN,
-                                "%s",
-                                VENDOR_NAME_STR);
-    ASSERT(NT_SUCCESS(status));
+    Default = Supported;
 
-    for (Index  = 0; Vendor[Index] != '\0'; Index++)
-        if (!isalnum((UCHAR)Vendor[Index]))
-            Vendor[Index] = '_';
+    if (!(Adapter->Properties.ipv4_csum & 2))
+        Default.Checksum.IPv4Receive.IpChecksum = 0;
 
-    Product = "XENNET";
+    if (!(Adapter->Properties.tcpv4_csum & 2))
+        Default.Checksum.IPv4Receive.TcpChecksum = 0;
 
-#if DBG
-#define ATTRIBUTES   "(DEBUG)"
-#else
-#define ATTRIBUTES   ""
-#endif
+    if (!(Adapter->Properties.udpv4_csum & 2))
+        Default.Checksum.IPv4Receive.UdpChecksum = 0;
 
-    (VOID) XENBUS_STORE(Printf,
-                        &Adapter->StoreInterface,
-                        NULL,
-                        "drivers",
-                        Distribution,
-                        "%s %s %u.%u.%u %s",
-                        Vendor,
-                        Product,
-                        MAJOR_VERSION,
-                        MINOR_VERSION,
-                        MICRO_VERSION,
-                        ATTRIBUTES
-                        );
+    if (!(Adapter->Properties.tcpv6_csum & 2))
+        Default.Checksum.IPv6Receive.TcpChecksum = 0;
 
-#undef  ATTRIBUTES
+    if (!(Adapter->Properties.udpv6_csum & 2))
+        Default.Checksum.IPv6Receive.UdpChecksum = 0;
 
-    Trace("<====\n");
-    return STATUS_SUCCESS;
+    if (!(Adapter->Properties.ipv4_csum & 1))
+        Default.Checksum.IPv4Transmit.IpChecksum = 0;
 
-fail2:
-    Error("fail2\n");
+    if (!(Adapter->Properties.tcpv4_csum & 1))
+        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    if (!(Adapter->Properties.udpv4_csum & 1))
+        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
 
-    return status;
-}
+    if (!(Adapter->Properties.tcpv6_csum & 1))
+        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
 
-static DECLSPEC_NOINLINE VOID
-AdapterSuspendCallbackLate(
-    IN  PVOID       Argument
-    )
-{
-    PXENNET_ADAPTER Adapter = Argument;
+    if (!(Adapter->Properties.udpv6_csum & 1))
+        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
 
-    (VOID) __AdapterSetDistribution(Adapter);
-}
+    if (!(Adapter->Properties.lsov4)) {
+        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
+        Default.LsoV2.IPv4.MinSegmentCount = 0;
+    }
 
-static NTSTATUS
-AdapterSetDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    LONG                Count;
-    NTSTATUS            status;
+    if (!(Adapter->Properties.lsov6)) {
+        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
+        Default.LsoV2.IPv6.MinSegmentCount = 0;
+    }
 
-    Trace("====>\n");
+    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof (NDIS_OFFLOAD))) {
+        Adapter->Offload = Default;
+        DISPLAY_OFFLOAD(Default);
+    }
 
-    Count = InterlockedIncrement(&AdapterCount);
-    ASSERT(Count != 0);
+    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = sizeof(Attribs);
+    Attribs.DefaultOffloadConfiguration = &Default;
+    Attribs.HardwareOffloadCapabilities = &Supported;
 
-    if (Count != 1)
-        goto done;
+    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    return ndisStatus;
+}
 
-    status = __AdapterSetDistribution(Adapter);
-    if (!NT_SUCCESS(status))
-        goto fail1;
+static NDIS_STATUS
+AdapterSetHeaderDataSplitAttributes(
+    IN  PXENNET_ADAPTER                                 Adapter
+    )
+{
+    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
+    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
+    NDIS_STATUS                                         NdisStatus;
 
-    status = XENBUS_SUSPEND(Register,
-                            &Adapter->SuspendInterface,
-                            SUSPEND_CALLBACK_LATE,
-                            AdapterSuspendCallbackLate,
-                            Adapter,
-                            &Adapter->SuspendCallbackLate);
-    if (!NT_SUCCESS(status))
-        goto fail2;
+    RtlZeroMemory(&Attribs, sizeof(Attribs));
 
-done:
-    Trace("<====\n");
-    return STATUS_SUCCESS;
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
 
-fail2:
-    Error("fail2\n");
+    RtlZeroMemory(&Split, sizeof(Split));
 
-    __AdapterClearDistribution(Adapter);
+    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
+    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
+    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
+    Split.HardwareCapabilities =
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    if (Adapter->Properties.HeaderDataSplit != 0)
+        Split.CurrentCapabilities = Split.HardwareCapabilities;
 
-    return status;
-}
+    Attribs.HDSplitAttributes = &Split;
 
-static VOID
-AdapterClearDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    LONG                Count;
+    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    if (NdisStatus != NDIS_STATUS_SUCCESS)
+        goto fail1;
 
-    Trace("====>\n");
+    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
+        ASSERT(Split.CurrentCapabilities & NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
 
-    Count = InterlockedDecrement(&AdapterCount);
+        Info("BackfillSize = %u\n", Split.BackfillSize);
+        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
 
-    if (Count != 0)
-        goto done;
+        XENVIF_VIF(ReceiverSetBackfillSize,
+                   &Adapter->VifInterface,
+                   Split.BackfillSize);
 
-    XENBUS_SUSPEND(Deregister,
-                   &Adapter->SuspendInterface,
-                   Adapter->SuspendCallbackLate);
-    Adapter->SuspendCallbackLate = NULL;
+        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
+    }
 
-    __AdapterClearDistribution(Adapter);
+    return NDIS_STATUS_SUCCESS;
 
-done:
-    Trace("<====\n");
+fail1:
+    Error("fail1 (%08x)\n", NdisStatus);
+
+    return NdisStatus;
 }
 
 NDIS_STATUS
@@ -2715,52 +2810,35 @@ AdapterInitialize(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = XENBUS_CACHE(Acquire,
-                          &(*Adapter)->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail7;
-
-    status = XENBUS_STORE(Acquire,
-                          &(*Adapter)->StoreInterface);
-    if (!NT_SUCCESS(status))
-        goto fail8;
-
-    status = XENBUS_SUSPEND(Acquire,
-                            &(*Adapter)->SuspendInterface);
-    if (!NT_SUCCESS(status))
-        goto fail9;
-
-    (VOID) AdapterSetDistribution(*Adapter);
-
     (*Adapter)->NdisAdapterHandle = Handle;
 
     ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail10;
+        goto fail7;
 
     ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail11;
+        goto fail8;
 
     ndisStatus = AdapterGetAdvancedSettings(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail12;
+        goto fail9;
 
     ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail13;
+        goto fail10;
 
     ndisStatus = AdapterSetGeneralAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail14;
+        goto fail11;
 
     ndisStatus = AdapterSetOffloadAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail15;
+        goto fail12;
 
     ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail16;
+        goto fail13;
 
     RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
     Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
@@ -2777,43 +2855,23 @@ AdapterInitialize(
     if (ndisStatus != NDIS_STATUS_SUCCESS)
         (*Adapter)->NdisDmaHandle = NULL;
 
-    ndisStatus = AdapterEnable(*Adapter);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail17;
-
     return NDIS_STATUS_SUCCESS;
 
-fail17:
-    if ((*Adapter)->NdisDmaHandle)
-        NdisMDeregisterScatterGatherDma((*Adapter)->NdisDmaHandle);
-    (*Adapter)->NdisDmaHandle = NULL;
-
-fail16:
-fail15:
-fail14:
 fail13:
 fail12:
+fail11:
+fail10:
+fail9:
     ReceiverTeardown((*Adapter)->Receiver);
     (*Adapter)->Receiver = NULL;
-fail11:
 
+fail8:
     TransmitterTeardown((*Adapter)->Transmitter);
     (*Adapter)->Transmitter = NULL;
 
-fail10:
+fail7:
     (*Adapter)->NdisAdapterHandle = NULL;
 
-    AdapterClearDistribution(*Adapter);
-
-    XENBUS_SUSPEND(Release, &(*Adapter)->SuspendInterface);
-
-fail9:
-    XENBUS_STORE(Release, &(*Adapter)->StoreInterface);
-
-fail8:
-    XENBUS_CACHE(Release, &(*Adapter)->CacheInterface);
-
-fail7:
     XENVIF_VIF(Release, &(*Adapter)->VifInterface);
 
 fail6:
@@ -2852,9 +2910,6 @@ AdapterTeardown(
 
     AdapterClearDistribution(Adapter);
 
-    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
-    XENBUS_STORE(Release, &Adapter->StoreInterface);
-    XENBUS_CACHE(Release, &Adapter->CacheInterface);
     XENVIF_VIF(Release, &Adapter->VifInterface);
 
     RtlZeroMemory(&Adapter->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
index 3cc1d90..5b2495a 100644
--- a/src/xennet/adapter.h
+++ b/src/xennet/adapter.h
@@ -99,7 +99,7 @@ AdapterEnable(
     IN  PXENNET_ADAPTER     Adapter
     );
 
-extern BOOLEAN
+extern VOID
 AdapterDisable(
     IN  PXENNET_ADAPTER     Adapter
     );
diff --git a/src/xennet/miniport.c b/src/xennet/miniport.c
index 5500418..1883db5 100644
--- a/src/xennet/miniport.c
+++ b/src/xennet/miniport.c
@@ -66,7 +66,7 @@ MiniportInitializeEx(
     PXENNET_ADAPTER                     Adapter;
     NDIS_STATUS                         NdisStatus;
 
-    Trace("====>\n");
+    Info("====>\n");
 
     UNREFERENCED_PARAMETER(MiniportDriverContext);
     UNREFERENCED_PARAMETER(MiniportInitParameters);
@@ -75,7 +75,7 @@ MiniportInitializeEx(
     if (NdisStatus != NDIS_STATUS_SUCCESS)
         goto fail1;
 
-    Trace("<====\n");
+    Info("<====\n");
 
     return NDIS_STATUS_SUCCESS;
 
@@ -97,16 +97,14 @@ MiniportHaltEx(
 
     UNREFERENCED_PARAMETER(HaltAction);
 
-    Trace("====>\n");
+    Info("====>\n");
 
     if (Adapter == NULL)
         return;
 
-    (VOID) AdapterDisable(Adapter);
-
     AdapterTeardown(Adapter);
 
-    Trace("<====\n");
+    Info("<====\n");
 }
 
 static
@@ -131,12 +129,11 @@ MiniportPause(
 
     UNREFERENCED_PARAMETER(MiniportPauseParameters);
 
-    Trace("====>\n");
+    Info("====>\n");
 
-    if (AdapterDisable(Adapter))
-        AdapterMediaStateChange(Adapter);
+    AdapterDisable(Adapter);
 
-    Trace("<====\n");
+    Info("<====\n");
 
     return NDIS_STATUS_SUCCESS;
 }
@@ -154,11 +151,11 @@ MiniportRestart(
 
     UNREFERENCED_PARAMETER(MiniportRestartParameters);
 
-    Trace("====>\n");
+    Info("====>\n");
 
     NdisStatus = AdapterEnable(Adapter);
 
-    Trace("<====\n");
+    Info("<====\n");
 
     return NdisStatus;
 }
diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 17ab27f..8bfc10b 100644
--- a/src/xennet/receiver.c
+++ b/src/xennet/receiver.c
@@ -359,6 +359,24 @@ fail1:
     return status;
 }
 
+NDIS_STATUS
+ReceiverEnable (
+    IN  PXENNET_RECEIVER    Receiver
+    )
+{
+    UNREFERENCED_PARAMETER(Receiver);
+
+    return NDIS_STATUS_SUCCESS;
+}
+
+VOID
+ReceiverDisable (
+    IN  PXENNET_RECEIVER    Receiver
+    )
+{
+    UNREFERENCED_PARAMETER(Receiver);
+}
+
 VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
index b2cc809..33701a9 100644
--- a/src/xennet/receiver.h
+++ b/src/xennet/receiver.h
@@ -43,6 +43,16 @@ ReceiverInitialize(
     OUT PXENNET_RECEIVER    *Receiver
     );
 
+extern NDIS_STATUS
+ReceiverEnable(
+    IN  PXENNET_RECEIVER    Receiver
+    );
+
+extern VOID
+ReceiverDisable(
+    IN  PXENNET_RECEIVER    Receiver
+    );
+
 extern VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
index a617b7d..8c80c7e 100644
--- a/src/xennet/transmitter.c
+++ b/src/xennet/transmitter.c
@@ -141,16 +141,10 @@ TransmitterInitialize (
     OUT PXENNET_TRANSMITTER *Transmitter
     )
 {
-    NTSTATUS                status;
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Adapter);
-
     *Transmitter = ExAllocatePoolWithTag(NonPagedPool,
                                          sizeof(XENNET_TRANSMITTER),
                                          TRANSMITTER_POOL_TAG);
 
-    status = STATUS_NO_MEMORY;
     if (*Transmitter == NULL)
         goto fail1;
 
@@ -160,6 +154,22 @@ TransmitterInitialize (
 
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
+    return NDIS_STATUS_SUCCESS;
+
+fail1:
+    return NDIS_STATUS_FAILURE;
+}
+
+NDIS_STATUS
+TransmitterEnable (
+    IN  PXENNET_TRANSMITTER Transmitter
+    )
+{
+    PXENBUS_CACHE_INTERFACE CacheInterface;
+    NTSTATUS                status;
+
+    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
+
     status = XENBUS_CACHE(Create,
                           CacheInterface,
                           "packet_cache",
@@ -169,10 +179,10 @@ TransmitterInitialize (
                           __TransmitterPacketDtor,
                           __TransmitterPacketAcquireLock,
                           __TransmitterPacketReleaseLock,
-                          *Transmitter,
-                          &(*Transmitter)->PacketCache);
+                          Transmitter,
+                          &Transmitter->PacketCache);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = XENBUS_CACHE(Create,
                           CacheInterface,
@@ -183,27 +193,20 @@ TransmitterInitialize (
                           __TransmitterBufferDtor,
                           __TransmitterBufferAcquireLock,
                           __TransmitterBufferReleaseLock,
-                          *Transmitter,
-                          &(*Transmitter)->BufferCache);
+                          Transmitter,
+                          &Transmitter->BufferCache);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     return NDIS_STATUS_SUCCESS;
 
-fail3:
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 (*Transmitter)->PacketCache);
-    (*Transmitter)->PacketCache = NULL;
-
 fail2:
     Error("fail2\n");
 
-    RtlZeroMemory(&(*Transmitter)->Lock, sizeof(KSPIN_LOCK));
-
-    ExFreePoolWithTag(*Transmitter, TRANSMITTER_POOL_TAG);
-
-    *Transmitter = NULL;
+    XENBUS_CACHE(Destroy,
+                 CacheInterface,
+                 Transmitter->PacketCache);
+    Transmitter->PacketCache = NULL;
 
 fail1:
     Error("fail1\n (%08x)", status);
@@ -212,7 +215,7 @@ fail1:
 }
 
 VOID
-TransmitterTeardown(
+TransmitterDisable (
     IN  PXENNET_TRANSMITTER Transmitter
     )
 {
@@ -220,9 +223,6 @@ TransmitterTeardown(
 
     CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
 
-    Transmitter->Adapter = NULL;
-    Transmitter->OffloadOptions.Value = 0;
-
     XENBUS_CACHE(Destroy,
                  CacheInterface,
                  Transmitter->BufferCache);
@@ -232,6 +232,15 @@ TransmitterTeardown(
                  CacheInterface,
                  Transmitter->PacketCache);
     Transmitter->PacketCache = NULL;
+}
+
+VOID
+TransmitterTeardown(
+    IN  PXENNET_TRANSMITTER Transmitter
+    )
+{
+    Transmitter->Adapter = NULL;
+    Transmitter->OffloadOptions.Value = 0;
 
     RtlZeroMemory(&Transmitter->Lock, sizeof(KSPIN_LOCK));
 
diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
index 0adebdc..363b91e 100644
--- a/src/xennet/transmitter.h
+++ b/src/xennet/transmitter.h
@@ -43,6 +43,16 @@ TransmitterInitialize(
     OUT PXENNET_TRANSMITTER *Transmitter
     );
 
+extern NDIS_STATUS
+TransmitterEnable(
+    IN  PXENNET_TRANSMITTER Transmitter
+    );
+
+extern VOID
+TransmitterDisable(
+    IN  PXENNET_TRANSMITTER Transmitter
+    );
+
 extern VOID
 TransmitterTeardown(
     IN  PXENNET_TRANSMITTER Transmitter
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 13:07:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 13:07:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4TbX-0001XX-OS; Thu, 03 Dec 2015 13:07:23 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4TbV-0001X5-HY
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 13:07:22 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	29/B4-09834-88E30665; Thu, 03 Dec 2015 13:07:20 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-3.tower-27.messagelabs.com!1449148036!8218497!1
X-Originating-IP: [209.85.160.176]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 7294 invoked from network); 3 Dec 2015 13:07:17 -0000
Received: from mail-yk0-f176.google.com (HELO mail-yk0-f176.google.com)
	(209.85.160.176)
	by server-3.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 13:07:17 -0000
Received: by ykba77 with SMTP id a77so84253747ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 05:07:16 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=gYVSfziU9Ibpibk0CoFIlVo7CtuXs9Yd7QinIRWG5+w=;
	b=qO9F6pBoRG3si1eKxfoAVTeiB114BRZ0F+r3tWSiBLyTNbS6rYjnIIqJsNrWsI5pp1
	XdyZ51CT693s69AVXkqCAcRjANvWLeRWeqS+SyygwV/BrXMra+X7ZdLFJ5Ruvwu7mSDT
	TmQhFG5dGDq+9HFUverLYTlu+LN2KlaccWKy2irIbXPbcOQ+4LMOkJdw2667uQPVgUB4
	4ARRZO6eeyaAHCqEHACix91KSvgu0uXEWrDHTHC+GeUcqlzvkBQwkSm93iUikKJBVwrf
	zC6CuDoh9ZGmwG+al6c9ioIAbaeh9j81G3mb9uJl8ehsqvQKXLQ+bFnJfFDGOJ47vc5E
	6meg==
X-Received: by 10.129.82.193 with SMTP id g184mr6560762ywb.313.1449148036217; 
	Thu, 03 Dec 2015 05:07:16 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	i12sm5443704ywg.40.2015.12.03.05.07.14
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 05:07:15 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 13:07:02 +0000
Message-Id: <1449148022-7436-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH for 8.1] Make sure XENBUS interfaces are
	released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Because a transition into and out of S4 means a new domain is built, it's
crucial that all XENBUS interfaces are released (so that things like
event channels, grant tables and the xenstore ring get re-constructed).

This patch fixes code paths where this was not being done. It also adds
some more logging during AdapterEnable/Disable and when moving between
D0 and D3.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xennet/adapter.c     | 2719 +++++++++++++++++++++++-----------------------
 src/xennet/adapter.h     |    2 +-
 src/xennet/miniport.c    |   21 +-
 src/xennet/receiver.c    |   18 +
 src/xennet/receiver.h    |   10 +
 src/xennet/transmitter.c |   63 +-
 src/xennet/transmitter.h |   10 +
 7 files changed, 1471 insertions(+), 1372 deletions(-)

diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index f9b3cf1..2c35636 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -1074,1576 +1074,1671 @@ AdapterGetReceiver(
     return Adapter->Receiver;
 }
 
-NDIS_STATUS
-AdapterEnable(
-    IN  PXENNET_ADAPTER     Adapter
+static FORCEINLINE PVOID
+__AdapterAllocate(
+    IN  ULONG   Length
     )
 {
-    NTSTATUS        status;
-
-    if (Adapter->Enabled)
-        return NDIS_STATUS_SUCCESS;
-
-    status = XENVIF_VIF(Enable,
-                        &Adapter->VifInterface,
-                        AdapterVifCallback,
-                        Adapter);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    Adapter->Enabled = TRUE;
-
-    return NDIS_STATUS_SUCCESS;
+    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
+}
 
-fail1:
-    return NDIS_STATUS_FAILURE;
+static FORCEINLINE VOID
+__AdapterFree(
+    IN  PVOID   Buffer
+    )
+{
+    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
 }
 
-BOOLEAN
-AdapterDisable(
-    IN  PXENNET_ADAPTER     Adapter
+static FORCEINLINE PANSI_STRING
+__AdapterMultiSzToUpcaseAnsi(
+    IN  PCHAR       Buffer
     )
 {
-    if (!Adapter->Enabled)
-        return FALSE;
+    PANSI_STRING    Ansi;
+    LONG            Index;
+    LONG            Count;
+    NTSTATUS        status;
 
-    XENVIF_VIF(Disable,
-               &Adapter->VifInterface);
+    Index = 0;
+    Count = 0;
+    for (;;) {
+        if (Buffer[Index] == '\0') {
+            Count++;
+            Index++;
 
-    AdapterMediaStateChange(Adapter);
+            // Check for double NUL
+            if (Buffer[Index] == '\0')
+                break;
+        } else {
+            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Index++;
+        }
+    }
 
-    Adapter->Enabled = FALSE;
+    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
 
-    return TRUE;
-}
+    status = STATUS_NO_MEMORY;
+    if (Ansi == NULL)
+        goto fail1;
 
-VOID
-AdapterMediaStateChange(
-    IN  PXENNET_ADAPTER     Adapter
-    )
-{
-    NDIS_LINK_STATE         LinkState;
-    NDIS_STATUS_INDICATION  StatusIndication;
+    for (Index = 0; Index < Count; Index++) {
+        ULONG   Length;
 
-    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
-    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
-    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
-    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
+        Length = (ULONG)strlen(Buffer);
+        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
+        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
 
-    XENVIF_VIF(MacQueryState,
-               &Adapter->VifInterface,
-               &LinkState.MediaConnectState,
-               &LinkState.RcvLinkSpeed,
-               &LinkState.MediaDuplexState);
+        status = STATUS_NO_MEMORY;
+        if (Ansi[Index].Buffer == NULL)
+            goto fail2;
 
-    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
-        Info("LINK: STATE UNKNOWN\n");
-    } else if (LinkState.MediaConnectState == MediaConnectStateDisconnected) {
-        Info("LINK: DOWN\n");
-    } else {
-        ASSERT3U(LinkState.MediaConnectState, ==, MediaConnectStateConnected);
+        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
+        Ansi[Index].Length = (USHORT)Length;
 
-        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
-            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n", LinkState.RcvLinkSpeed);
-        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
-            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n", LinkState.RcvLinkSpeed);
-        else
-            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n", LinkState.RcvLinkSpeed);
+        Buffer += Length + 1;
     }
 
-    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
+    return Ansi;
 
-    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
-    StatusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
-    StatusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
-    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
+fail2:
+    Error("fail2\n");
 
-    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
-    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
-    StatusIndication.StatusBuffer = &LinkState;
-    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
+    while (--Index >= 0)
+        __AdapterFree(Ansi[Index].Buffer);
 
-    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle, &StatusIndication);
+    __AdapterFree(Ansi);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return NULL;
 }
 
-NDIS_STATUS
-AdapterSetInformation(
-    IN  PXENNET_ADAPTER     Adapter,
-    IN  PNDIS_OID_REQUEST   Request
+static FORCEINLINE VOID
+__AdapterFreeAnsi(
+    IN  PANSI_STRING    Ansi
     )
 {
-    PVOID                   Buffer;
-    ULONG                   BufferLength;
-    ULONG                   BytesNeeded;
-    ULONG                   BytesRead;
-    BOOLEAN                 Warn;
-    NDIS_STATUS             ndisStatus;
+    ULONG               Index;
 
-    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
-    BufferLength = Request->DATA.SET_INFORMATION.InformationBufferLength;
-    BytesNeeded = BytesRead = 0;
-    Warn = TRUE;
-    ndisStatus = NDIS_STATUS_SUCCESS;
+    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
+        __AdapterFree(Ansi[Index].Buffer);
 
-    switch (Request->DATA.SET_INFORMATION.Oid) {
-    case OID_PNP_SET_POWER:
-        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
-        // do nothing
-        break;
+    __AdapterFree(Ansi);
+}
 
-    case OID_GEN_CURRENT_LOOKAHEAD:
-        BytesNeeded = sizeof(ULONG);
-        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
-        if (BufferLength == BytesNeeded) {
-            Adapter->CurrentLookahead = *(PULONG)Buffer;
-            BytesRead = sizeof(ULONG);
-        }
-        break;
+static FORCEINLINE BOOLEAN
+__AdapterMatchDistribution(
+    IN  PXENNET_ADAPTER Adapter,
+    IN  PCHAR           Buffer
+    )
+{
+    PCHAR               Vendor;
+    PCHAR               Product;
+    PCHAR               Context;
+    const CHAR          *Text;
+    BOOLEAN             Match;
+    ULONG               Index;
+    NTSTATUS            status;
 
-    case OID_GEN_CURRENT_PACKET_FILTER:
-        BytesNeeded = sizeof(ULONG);
-        if (BufferLength == BytesNeeded) {
-            ndisStatus = AdapterSetPacketFilter(Adapter,
-                                                (PULONG)Buffer);
-            BytesRead = sizeof(ULONG);
-        }
-        break;
+    UNREFERENCED_PARAMETER(Adapter);
 
-    case OID_802_3_MULTICAST_LIST:
-        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
-        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
-            ndisStatus = AdapterSetMulticastAddresses(Adapter,
-                                                      Buffer,
-                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = BufferLength;
-        } else {
-            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
-        }
-        break;
+    status = STATUS_INVALID_PARAMETER;
 
-    case OID_OFFLOAD_ENCAPSULATION:
-        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
-        if (BufferLength >= BytesNeeded) {
-            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
-                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
-        }
-        break;
+    Vendor = __strtok_r(Buffer, " ", &Context);
+    if (Vendor == NULL)
+        goto fail1;
 
-    case OID_TCP_OFFLOAD_PARAMETERS:
-        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
-        if (BufferLength >= BytesNeeded) {
-            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
-                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
-        }
-        break;
+    Product = __strtok_r(NULL, " ", &Context);
+    if (Product == NULL)
+        goto fail2;
 
-    case OID_GEN_HD_SPLIT_PARAMETERS:
-        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
-        if (BufferLength >= BytesNeeded) {
-            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
-                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
-            if (ndisStatus == NDIS_STATUS_SUCCESS)
-                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
-        }
-        break;
+    Match = TRUE;
 
-    case OID_GEN_INTERRUPT_MODERATION:
-    case OID_GEN_MACHINE_NAME:
-        Warn = FALSE;
-        /*FALLTHRU*/
-    default:
-        if (Warn)
-            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
+    Text = VENDOR_NAME_STR;
 
-        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
-        break;
+    for (Index = 0; Text[Index] != 0; Index++) {
+        if (!isalnum((UCHAR)Text[Index])) {
+            if (Vendor[Index] != '_') {
+                Match = FALSE;
+                break;
+            }
+        } else {
+            if (Vendor[Index] != Text[Index]) {
+                Match = FALSE;
+                break;
+            }
+        }
     }
 
-    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
-    if (ndisStatus == NDIS_STATUS_SUCCESS)
-        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
+    Text = "XENNET";
 
-    return ndisStatus;
-}
+    if (_stricmp(Product, Text) != 0)
+        Match = FALSE;
 
-static FORCEINLINE NDIS_STATUS
-__CopyBuffer(
-    IN  PVOID   Destination,
-    IN  ULONG   DestinationLength,
-    IN  PVOID   Source,
-    IN  ULONG   SourceLength,
-    OUT PULONG  CopyLength
-    )
-{
-    *CopyLength = __min(SourceLength, DestinationLength);
-    RtlCopyMemory(Destination, Source, *CopyLength);
+    return Match;
 
-    return (DestinationLength >= SourceLength) ?
-           NDIS_STATUS_SUCCESS :
-           NDIS_STATUS_BUFFER_TOO_SHORT;
-}
+fail2:
+    Error("fail2\n");
 
-static FORCEINLINE NDIS_STATUS
-__SetUlong(
-    IN  PVOID   Destination,
-    IN  ULONG   DestinationLength,
-    IN  ULONG   Source,
-    OUT PULONG  CopyLength
-    )
-{
-    return __CopyBuffer(Destination,
-                        DestinationLength & ~3,
-                        &Source,
-                        sizeof (ULONG),
-                        CopyLength);
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return FALSE;
 }
 
-static FORCEINLINE NDIS_STATUS
-__SetUlong64(
-    IN  PVOID   Destination,
-    IN  ULONG   DestinationLength,
-    IN  ULONG64 Source,
-    OUT PULONG  CopyLength
+static FORCEINLINE VOID
+__AdapterClearDistribution(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    NDIS_STATUS ndisStatus;
+    PCHAR               Buffer;
+    PANSI_STRING        Distributions;
+    ULONG               Index;
+    NTSTATUS            status;
 
-    ndisStatus =  __CopyBuffer(Destination,
-                               DestinationLength & ~3,
-                               &Source,
-                               sizeof (ULONG64),
-                               CopyLength);
-    if (DestinationLength >= 4)
-        ndisStatus = NDIS_STATUS_SUCCESS;
+    Trace("====>\n");
 
-    return ndisStatus;
-}
+    status = XENBUS_STORE(Directory,
+                          &Adapter->StoreInterface,
+                          NULL,
+                          NULL,
+                          "drivers",
+                          &Buffer);
+    if (NT_SUCCESS(status)) {
+        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
 
-NDIS_STATUS
-AdapterQueryInformation(
-    IN  PXENNET_ADAPTER     Adapter,
-    IN  PNDIS_OID_REQUEST   Request
-    )
-{
-    PVOID                   Buffer;
-    ULONG                   BufferLength;
-    ULONG                   BytesNeeded;
-    ULONG                   BytesWritten;
-    ULONG                   Value32;
-    ULONGLONG               Value64;
-    ETHERNET_ADDRESS        EthernetAddress;
-    BOOLEAN                 Warn;
-    NDIS_STATUS             ndisStatus;
+        XENBUS_STORE(Free,
+                     &Adapter->StoreInterface,
+                     Buffer);
+    } else {
+        Distributions = NULL;
+    }
 
-    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
-    BufferLength = Request->DATA.QUERY_INFORMATION.InformationBufferLength;
-    BytesNeeded = BytesWritten = 0;
-    Warn = TRUE;
-    ndisStatus = NDIS_STATUS_SUCCESS;
+    if (Distributions == NULL)
+        goto done;
 
-    switch (Request->DATA.QUERY_INFORMATION.Oid) {
-    case OID_PNP_CAPABILITIES:
-        BytesNeeded = sizeof(Adapter->Capabilities);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &Adapter->Capabilities,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
+        PANSI_STRING    Distribution = &Distributions[Index];
 
-    case OID_PNP_QUERY_POWER:
-        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
-        BytesWritten = 0;
-        // do nothing
-        break;
+        status = XENBUS_STORE(Read,
+                              &Adapter->StoreInterface,
+                              NULL,
+                              "drivers",
+                              Distribution->Buffer,
+                              &Buffer);
+        if (!NT_SUCCESS(status))
+            continue;
 
-    case OID_GEN_SUPPORTED_LIST:
-        BytesNeeded = sizeof(XennetSupportedOids);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &XennetSupportedOids[0],
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+        if (__AdapterMatchDistribution(Adapter, Buffer))
+            (VOID) XENBUS_STORE(Remove,
+                                &Adapter->StoreInterface,
+                                NULL,
+                                "drivers",
+                                Distribution->Buffer);
 
-    case OID_GEN_HARDWARE_STATUS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                NdisHardwareStatusReady,
-                                &BytesWritten);
-        break;
+        XENBUS_STORE(Free,
+                     &Adapter->StoreInterface,
+                     Buffer);
+    }
 
-    case OID_GEN_MEDIA_SUPPORTED:
-    case OID_GEN_MEDIA_IN_USE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                XENNET_MEDIA_TYPE,
-                                &BytesWritten);
-        break;
+    __AdapterFreeAnsi(Distributions);
 
-    case OID_GEN_MAXIMUM_LOOKAHEAD:
-    case OID_GEN_TRANSMIT_BLOCK_SIZE:
-    case OID_GEN_RECEIVE_BLOCK_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->MaximumFrameSize,
-                                &BytesWritten);
-        break;
+done:
+    Trace("<====\n");
+}
 
-    case OID_GEN_TRANSMIT_BUFFER_SPACE:
-    case OID_GEN_RECEIVE_BUFFER_SPACE:
-        XENVIF_VIF(TransmitterQueryRingSize,
-                    &Adapter->VifInterface,
-                    (PULONG)&Value32);
-        Value32 *= Adapter->MaximumFrameSize;
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+#define MAXIMUM_INDEX   255
 
-    case OID_GEN_VENDOR_DESCRIPTION:
-        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  VENDOR_NAME_STR,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+static FORCEINLINE NTSTATUS
+__AdapterSetDistribution(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    ULONG               Index;
+    CHAR                Distribution[MAXNAMELEN];
+    CHAR                Vendor[MAXNAMELEN];
+    const CHAR          *Product;
+    NTSTATUS            status;
 
-    case OID_GEN_VENDOR_DRIVER_VERSION:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
-                                &BytesWritten);
-        break;
+    Trace("====>\n");
 
-    case OID_GEN_DRIVER_VERSION:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (6 << 8) | 0, // NDIS 6.0
-                                &BytesWritten);
-        break;
+    Index = 0;
+    while (Index <= MAXIMUM_INDEX) {
+        PCHAR   Buffer;
 
-    case OID_GEN_MAC_OPTIONS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                XENNET_MAC_OPTIONS,
-                                &BytesWritten);
-        break;
+        status = RtlStringCbPrintfA(Distribution,
+                                    MAXNAMELEN,
+                                    "%u",
+                                    Index);
+        ASSERT(NT_SUCCESS(status));
 
-    case OID_GEN_STATISTICS:
-        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
-        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
-                                                   (PNDIS_STATISTICS_INFO)Buffer,
-                                                   BufferLength,
-                                                   &BytesWritten);
-        break;
+        status = XENBUS_STORE(Read,
+                              &Adapter->StoreInterface,
+                              NULL,
+                              "drivers",
+                              Distribution,
+                              &Buffer);
+        if (!NT_SUCCESS(status)) {
+            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
+                goto update;
 
-    case OID_802_3_MULTICAST_LIST:
-        ndisStatus = AdapterQueryMulticastList(Adapter,
-                                               Buffer,
-                                               BufferLength,
-                                               &BytesNeeded,
-                                               &BytesWritten);
-        break;
+            goto fail1;
+        }
 
-    case OID_802_3_PERMANENT_ADDRESS:
-        XENVIF_VIF(MacQueryPermanentAddress,
-                    &Adapter->VifInterface,
-                    &EthernetAddress);
-        BytesNeeded = sizeof(ETHERNET_ADDRESS);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &EthernetAddress,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+        XENBUS_STORE(Free,
+                     &Adapter->StoreInterface,
+                     Buffer);
 
-    case OID_802_3_CURRENT_ADDRESS:
-        XENVIF_VIF(MacQueryCurrentAddress,
-                    &Adapter->VifInterface,
-                    &EthernetAddress);
-        BytesNeeded = sizeof(ETHERNET_ADDRESS);
-        ndisStatus = __CopyBuffer(Buffer,
-                                  BufferLength,
-                                  &EthernetAddress,
-                                  BytesNeeded,
-                                  &BytesWritten);
-        break;
+        Index++;
+    }
 
-    case OID_GEN_MAXIMUM_FRAME_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->MaximumFrameSize -
-                                    sizeof(ETHERNET_TAGGED_HEADER),
-                                &BytesWritten);
-        break;
+    status = STATUS_UNSUCCESSFUL;
+    goto fail2;
 
-    case OID_GEN_MAXIMUM_TOTAL_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->MaximumFrameSize -
-                                    sizeof(ETHERNET_TAGGED_HEADER) +
-                                    sizeof (ETHERNET_UNTAGGED_HEADER),
-                                &BytesWritten);
-        break;
+update:
+    status = RtlStringCbPrintfA(Vendor,
+                                MAXNAMELEN,
+                                "%s",
+                                VENDOR_NAME_STR);
+    ASSERT(NT_SUCCESS(status));
 
-    case OID_GEN_CURRENT_LOOKAHEAD:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Adapter->CurrentLookahead,
-                                &BytesWritten);
-        break;
+    for (Index  = 0; Vendor[Index] != '\0'; Index++)
+        if (!isalnum((UCHAR)Vendor[Index]))
+            Vendor[Index] = '_';
 
-    case OID_GEN_VENDOR_ID:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                0x5853,
-                                &BytesWritten);
-        break;
+    Product = "XENNET";
 
-    case OID_GEN_LINK_SPEED:
-        XENVIF_VIF(MacQueryState,
-                   &Adapter->VifInterface,
-                   NULL,
-                   &Value64,
-                   NULL);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)(Value64 / 100),
-                                &BytesWritten);
-        break;
+#if DBG
+#define ATTRIBUTES   "(DEBUG)"
+#else
+#define ATTRIBUTES   ""
+#endif
 
-    case OID_GEN_MEDIA_CONNECT_STATUS:
-        XENVIF_VIF(MacQueryState,
-                    &Adapter->VifInterface,
-                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
-                    NULL,
-                    NULL);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+    (VOID) XENBUS_STORE(Printf,
+                        &Adapter->StoreInterface,
+                        NULL,
+                        "drivers",
+                        Distribution,
+                        "%s %s %u.%u.%u %s",
+                        Vendor,
+                        Product,
+                        MAJOR_VERSION,
+                        MINOR_VERSION,
+                        MICRO_VERSION,
+                        ATTRIBUTES
+                        );
 
-    case OID_GEN_MAXIMUM_SEND_PACKETS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                16,
-                                &BytesWritten);
-        break;
+#undef  ATTRIBUTES
 
-    case OID_GEN_CURRENT_PACKET_FILTER:
-        AdapterGetPacketFilter(Adapter, &Value32);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+    Trace("<====\n");
+    return STATUS_SUCCESS;
 
-    case OID_GEN_XMIT_OK:
-        AdapterGetXmitOk(Adapter, &Value64);
-        BytesNeeded = sizeof(ULONG64);
-        ndisStatus = __SetUlong64(Buffer,
-                                  BufferLength,
-                                  Value64,
-                                  &BytesWritten);
-        break;
+fail2:
+    Error("fail2\n");
 
-    case OID_GEN_RCV_OK:
-        AdapterGetRcvOk(Adapter, &Value64);
-        BytesNeeded = sizeof(ULONG64);
-        ndisStatus = __SetUlong64(Buffer,
-                                  BufferLength,
-                                  Value64,
-                                  &BytesWritten);
-        break;
+fail1:
+    Error("fail1 (%08x)\n", status);
 
-    case OID_GEN_XMIT_ERROR:
-        AdapterGetXmitError(Adapter, &Value32);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+    return status;
+}
 
-    case OID_GEN_RCV_ERROR:
-        AdapterGetRcvError(Adapter, &Value32);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                Value32,
-                                &BytesWritten);
-        break;
+static DECLSPEC_NOINLINE VOID
+AdapterSuspendCallbackLate(
+    IN  PVOID       Argument
+    )
+{
+    PXENNET_ADAPTER Adapter = Argument;
 
-    case OID_GEN_RCV_NO_BUFFER:
-    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
-    case OID_GEN_RCV_CRC_ERROR:
-    case OID_802_3_RCV_ERROR_ALIGNMENT:
-    case OID_802_3_XMIT_ONE_COLLISION:
-    case OID_802_3_XMIT_MORE_COLLISIONS:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                0,
-                                &BytesWritten);
-        break;
+    (VOID) __AdapterSetDistribution(Adapter);
+}
 
-    case OID_802_3_MAXIMUM_LIST_SIZE:
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                32,
-                                &BytesWritten);
-        break;
+static NTSTATUS
+AdapterSetDistribution(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    LONG                Count;
+    NTSTATUS            status;
 
-    case OID_GEN_DIRECTED_BYTES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    Trace("====>\n");
 
-    case OID_GEN_DIRECTED_FRAMES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    Count = InterlockedIncrement(&AdapterCount);
+    ASSERT(Count != 0);
 
-    case OID_GEN_MULTICAST_BYTES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    if (Count != 1)
+        goto done;
 
-    case OID_GEN_MULTICAST_FRAMES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    status = __AdapterSetDistribution(Adapter);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = XENBUS_SUSPEND(Register,
+                            &Adapter->SuspendInterface,
+                            SUSPEND_CALLBACK_LATE,
+                            AdapterSuspendCallbackLate,
+                            Adapter,
+                            &Adapter->SuspendCallbackLate);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+done:
+    Trace("<====\n");
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    __AdapterClearDistribution(Adapter);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+static VOID
+AdapterClearDistribution(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    LONG                Count;
+
+    Trace("====>\n");
+
+    Count = InterlockedDecrement(&AdapterCount);
+
+    if (Count != 0)
+        goto done;
+
+    XENBUS_SUSPEND(Deregister,
+                   &Adapter->SuspendInterface,
+                   Adapter->SuspendCallbackLate);
+    Adapter->SuspendCallbackLate = NULL;
+
+    __AdapterClearDistribution(Adapter);
+
+done:
+    Trace("<====\n");
+}
+
+NDIS_STATUS
+AdapterEnable(
+    IN  PXENNET_ADAPTER     Adapter
+    )
+{
+    NTSTATUS                status;
+    NDIS_STATUS             ndisStatus;
+
+    ASSERT(!Adapter->Enabled);
+
+    status = XENBUS_CACHE(Acquire,
+                          &Adapter->CacheInterface);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = XENBUS_STORE(Acquire,
+                          &Adapter->StoreInterface);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    status = XENBUS_SUSPEND(Acquire,
+                            &Adapter->SuspendInterface);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    (VOID) AdapterSetDistribution(Adapter);
+
+    ndisStatus = TransmitterEnable(Adapter->Transmitter);
+    if (ndisStatus != NDIS_STATUS_SUCCESS)
+        goto fail4;
+
+    ndisStatus = ReceiverEnable(Adapter->Receiver);
+    if (ndisStatus != NDIS_STATUS_SUCCESS)
+        goto fail5;
+
+    status = XENVIF_VIF(Enable,
+                        &Adapter->VifInterface,
+                        AdapterVifCallback,
+                        Adapter);
+    if (!NT_SUCCESS(status))
+        goto fail6;
+
+    AdapterMediaStateChange(Adapter);
+
+    Adapter->Enabled = TRUE;
+
+    return NDIS_STATUS_SUCCESS;
+
+fail6:
+    ReceiverDisable(Adapter->Receiver);
+
+fail5:
+    TransmitterDisable(Adapter->Transmitter);
+
+fail4:
+    AdapterClearDistribution(Adapter);
+
+    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
+
+fail3:
+    XENBUS_STORE(Release, &Adapter->StoreInterface);
+
+fail2:
+    XENBUS_CACHE(Release, &Adapter->CacheInterface);
+
+fail1:
+    return NDIS_STATUS_FAILURE;
+}
 
-    case OID_GEN_BROADCAST_BYTES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+VOID
+AdapterDisable(
+    IN  PXENNET_ADAPTER     Adapter
+    )
+{
+    ASSERT(Adapter->Enabled);
+    Adapter->Enabled = FALSE;
 
-    case OID_GEN_BROADCAST_FRAMES_XMIT:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    XENVIF_VIF(Disable,
+               &Adapter->VifInterface);
 
-    case OID_GEN_DIRECTED_BYTES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_UNICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    AdapterMediaStateChange(Adapter);
 
-    case OID_GEN_DIRECTED_FRAMES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_UNICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    ReceiverDisable(Adapter->Receiver);
+    TransmitterDisable(Adapter->Transmitter);
 
-    case OID_GEN_MULTICAST_BYTES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_MULTICAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    AdapterClearDistribution(Adapter);
 
-    case OID_GEN_MULTICAST_FRAMES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_MULTICAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
+    XENBUS_STORE(Release, &Adapter->StoreInterface);
+    XENBUS_CACHE(Release, &Adapter->CacheInterface);
+}
 
-    case OID_GEN_BROADCAST_BYTES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_BROADCAST_OCTETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+VOID
+AdapterMediaStateChange(
+    IN  PXENNET_ADAPTER     Adapter
+    )
+{
+    NDIS_LINK_STATE         LinkState;
+    NDIS_STATUS_INDICATION  StatusIndication;
 
-    case OID_GEN_BROADCAST_FRAMES_RCV:
-        XENVIF_VIF(QueryStatistic,
-                   &Adapter->VifInterface,
-                   XENVIF_RECEIVER_BROADCAST_PACKETS,
-                   &Value64);
-        BytesNeeded = sizeof(ULONG);
-        ndisStatus = __SetUlong(Buffer,
-                                BufferLength,
-                                (ULONG)Value64,
-                                &BytesWritten);
-        break;
+    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
+    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
+    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
+    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
 
-    case OID_GEN_INTERRUPT_MODERATION:
-        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
-        ndisStatus = AdapterInterruptModeration(Adapter,
-                                                (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
-                                                BufferLength,
-                                                &BytesWritten);
-        break;
+    XENVIF_VIF(MacQueryState,
+               &Adapter->VifInterface,
+               &LinkState.MediaConnectState,
+               &LinkState.RcvLinkSpeed,
+               &LinkState.MediaDuplexState);
 
-    case OID_IP4_OFFLOAD_STATS:
-    case OID_IP6_OFFLOAD_STATS:
-    case OID_GEN_SUPPORTED_GUIDS:
-        // We don't handle these since NDIS 6.0 is supposed to do this for us
-    case OID_GEN_MAC_ADDRESS:
-    case OID_GEN_MAX_LINK_SPEED:
-        // ignore these common unwanted OIDs
-	case OID_GEN_INIT_TIME_MS:
-	case OID_GEN_RESET_COUNTS:
-	case OID_GEN_MEDIA_SENSE_COUNTS:
-        Warn = FALSE;
-        /*FALLTHRU*/
-    default:
-        if (Warn)
-            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
+    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
+        Info("LINK: STATE UNKNOWN\n");
+    } else if (LinkState.MediaConnectState == MediaConnectStateDisconnected) {
+        Info("LINK: DOWN\n");
+    } else {
+        ASSERT3U(LinkState.MediaConnectState, ==, MediaConnectStateConnected);
 
-        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
-        break;
+        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
+            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n", LinkState.RcvLinkSpeed);
+        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
+            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n", LinkState.RcvLinkSpeed);
+        else
+            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n", LinkState.RcvLinkSpeed);
     }
 
-    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
-    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
+    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
 
-    return ndisStatus;
+    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
+    StatusIndication.Header.Type = NDIS_OBJECT_TYPE_STATUS_INDICATION;
+    StatusIndication.Header.Revision = NDIS_STATUS_INDICATION_REVISION_1;
+    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
+
+    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
+    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
+    StatusIndication.StatusBuffer = &LinkState;
+    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
+
+    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle, &StatusIndication);
 }
 
-static NTSTATUS
-__QueryInterface(
-    IN  PDEVICE_OBJECT  DeviceObject,
-    IN  const GUID      *Guid,
-    IN  ULONG           Version,
-    OUT PINTERFACE      Interface,
-    IN  ULONG           Size,
-    IN  BOOLEAN         Optional
+NDIS_STATUS
+AdapterSetInformation(
+    IN  PXENNET_ADAPTER     Adapter,
+    IN  PNDIS_OID_REQUEST   Request
     )
 {
-    KEVENT              Event;
-    IO_STATUS_BLOCK     StatusBlock;
-    PIRP                Irp;
-    PIO_STACK_LOCATION  StackLocation;
-    NTSTATUS            status;
+    PVOID                   Buffer;
+    ULONG                   BufferLength;
+    ULONG                   BytesNeeded;
+    ULONG                   BytesRead;
+    BOOLEAN                 Warn;
+    NDIS_STATUS             ndisStatus;
 
-    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
+    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
+    BufferLength = Request->DATA.SET_INFORMATION.InformationBufferLength;
+    BytesNeeded = BytesRead = 0;
+    Warn = TRUE;
+    ndisStatus = NDIS_STATUS_SUCCESS;
 
-    KeInitializeEvent(&Event, NotificationEvent, FALSE);
-    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
+    switch (Request->DATA.SET_INFORMATION.Oid) {
+    case OID_PNP_SET_POWER:
+        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
+        if (BufferLength >= BytesNeeded) {
+            PNDIS_DEVICE_POWER_STATE PowerState;
 
-    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
-                                       DeviceObject,
-                                       NULL,
-                                       0,
-                                       NULL,
-                                       &Event,
-                                       &StatusBlock);
+            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
+            switch (*PowerState) {
+            case NdisDeviceStateD0:
+                Info("SET_POWER: D0\n");
+                break;
 
-    status = STATUS_UNSUCCESSFUL;
-    if (Irp == NULL)
-        goto fail1;
+            case NdisDeviceStateD1:
+                Info("SET_POWER: D1\n");
+                break;
 
-    StackLocation = IoGetNextIrpStackLocation(Irp);
-    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
+            case NdisDeviceStateD2:
+                Info("SET_POWER: D2\n");
+                break;
 
-    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
-    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
-    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
-    StackLocation->Parameters.QueryInterface.Interface = Interface;
+            case NdisDeviceStateD3:
+                Info("SET_POWER: D3\n");
+                break;
+            }
+        }
+        // do nothing
+        break;
 
-    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
+    case OID_GEN_CURRENT_LOOKAHEAD:
+        BytesNeeded = sizeof(ULONG);
+        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
+        if (BufferLength == BytesNeeded) {
+            Adapter->CurrentLookahead = *(PULONG)Buffer;
+            BytesRead = sizeof(ULONG);
+        }
+        break;
 
-    status = IoCallDriver(DeviceObject, Irp);
-    if (status == STATUS_PENDING) {
-        (VOID) KeWaitForSingleObject(&Event,
-                                     Executive,
-                                     KernelMode,
-                                     FALSE,
-                                     NULL);
-        status = StatusBlock.Status;
-    }
+    case OID_GEN_CURRENT_PACKET_FILTER:
+        BytesNeeded = sizeof(ULONG);
+        if (BufferLength == BytesNeeded) {
+            ndisStatus = AdapterSetPacketFilter(Adapter,
+                                                (PULONG)Buffer);
+            BytesRead = sizeof(ULONG);
+        }
+        break;
 
-    if (!NT_SUCCESS(status)) {
-        if (status == STATUS_NOT_SUPPORTED && Optional)
-            goto done;
+    case OID_802_3_MULTICAST_LIST:
+        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
+        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
+            ndisStatus = AdapterSetMulticastAddresses(Adapter,
+                                                      Buffer,
+                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = BufferLength;
+        } else {
+            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
+        }
+        break;
 
-        goto fail2;
-    }
+    case OID_OFFLOAD_ENCAPSULATION:
+        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
+        if (BufferLength >= BytesNeeded) {
+            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
+                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
+        }
+        break;
 
-done:
-    return STATUS_SUCCESS;
+    case OID_TCP_OFFLOAD_PARAMETERS:
+        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
+        if (BufferLength >= BytesNeeded) {
+            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
+                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
+        }
+        break;
 
-fail2:
-    Error("fail2\n");
+    case OID_GEN_HD_SPLIT_PARAMETERS:
+        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
+        if (BufferLength >= BytesNeeded) {
+            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
+                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
+            if (ndisStatus == NDIS_STATUS_SUCCESS)
+                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
+        }
+        break;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    case OID_GEN_INTERRUPT_MODERATION:
+    case OID_GEN_MACHINE_NAME:
+        Warn = FALSE;
+        /*FALLTHRU*/
+    default:
+        if (Warn)
+            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
 
-    return status;
-}
+        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
+        break;
+    }
 
-#pragma prefast(push)
-#pragma prefast(disable:6102)
+    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
+    if (ndisStatus == NDIS_STATUS_SUCCESS)
+        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
 
-#define READ_PROPERTY(field, name, defaultval, handle)  \
-    do {                                                \
-        NDIS_STATUS                     _Status;        \
-        NDIS_STRING                     _Value;         \
-        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
-        RtlInitUnicodeString(&_Value, name);            \
-        NdisReadConfiguration(&_Status, &_Data, handle, \
-                        &_Value, NdisParameterInteger); \
-        if (_Status == NDIS_STATUS_SUCCESS)             \
-            field = _Data->ParameterData.IntegerData;   \
-        else                                            \
-            field = defaultval;                         \
-    } while (FALSE);
+    return ndisStatus;
+}
 
-static NDIS_STATUS
-AdapterGetAdvancedSettings(
-    IN  PXENNET_ADAPTER Adapter
+static FORCEINLINE NDIS_STATUS
+__CopyBuffer(
+    IN  PVOID   Destination,
+    IN  ULONG   DestinationLength,
+    IN  PVOID   Source,
+    IN  ULONG   SourceLength,
+    OUT PULONG  CopyLength
     )
 {
-    NDIS_CONFIGURATION_OBJECT   Config;
-    NDIS_HANDLE                 Handle;
-    NDIS_STATUS                 ndisStatus;
-
-    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
-    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
-    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
-    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
-    Config.NdisHandle = Adapter->NdisAdapterHandle;
-    Config.Flags = 0;
-
-    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail1;
-
-    READ_PROPERTY(Adapter->Properties.ipv4_csum, L"*IPChecksumOffloadIPv4", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.tcpv4_csum, L"*TCPChecksumOffloadIPv4", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.udpv4_csum, L"*UDPChecksumOffloadIPv4", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.tcpv6_csum, L"*TCPChecksumOffloadIPv6", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.udpv6_csum, L"*UDPChecksumOffloadIPv6", 3, Handle);
-    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.need_csum_value, L"NeedChecksumValue", 1, Handle);
-    READ_PROPERTY(Adapter->Properties.HeaderDataSplit, L"*HeaderDataSplit", 1, Handle);
-
-    NdisCloseConfiguration(Handle);
-
-    return NDIS_STATUS_SUCCESS;
+    *CopyLength = __min(SourceLength, DestinationLength);
+    RtlCopyMemory(Destination, Source, *CopyLength);
 
-fail1:
-    return NDIS_STATUS_FAILURE;
+    return (DestinationLength >= SourceLength) ?
+           NDIS_STATUS_SUCCESS :
+           NDIS_STATUS_BUFFER_TOO_SHORT;
 }
 
-#undef READ_PROPERTY
-
-#pragma prefast(pop)
-
-static NDIS_STATUS
-AdapterSetRegistrationAttributes(
-    IN  PXENNET_ADAPTER Adapter
+static FORCEINLINE NDIS_STATUS
+__SetUlong(
+    IN  PVOID   Destination,
+    IN  ULONG   DestinationLength,
+    IN  ULONG   Source,
+    OUT PULONG  CopyLength
     )
 {
-    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
-    NDIS_STATUS                                     ndisStatus;
+    return __CopyBuffer(Destination,
+                        DestinationLength & ~3,
+                        &Source,
+                        sizeof (ULONG),
+                        CopyLength);
+}
 
-    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
-    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
-    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
-                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
-    Attribs.CheckForHangTimeInSeconds = 0;
-    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
+static FORCEINLINE NDIS_STATUS
+__SetUlong64(
+    IN  PVOID   Destination,
+    IN  ULONG   DestinationLength,
+    IN  ULONG64 Source,
+    OUT PULONG  CopyLength
+    )
+{
+    NDIS_STATUS ndisStatus;
 
-    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    ndisStatus =  __CopyBuffer(Destination,
+                               DestinationLength & ~3,
+                               &Source,
+                               sizeof (ULONG64),
+                               CopyLength);
+    if (DestinationLength >= 4)
+        ndisStatus = NDIS_STATUS_SUCCESS;
 
     return ndisStatus;
 }
 
-static NDIS_STATUS
-AdapterSetGeneralAttributes(
-    IN  PXENNET_ADAPTER Adapter
+NDIS_STATUS
+AdapterQueryInformation(
+    IN  PXENNET_ADAPTER     Adapter,
+    IN  PNDIS_OID_REQUEST   Request
     )
 {
-    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
-    NDIS_STATUS                                 ndisStatus;
-
-    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
-    Attribs.MediaType = XENNET_MEDIA_TYPE;
-
-    XENVIF_VIF(MacQueryMaximumFrameSize,
-               &Adapter->VifInterface,
-               (PULONG)&Adapter->MaximumFrameSize);
-
-    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof (ETHERNET_TAGGED_HEADER);
-    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
-    Attribs.MediaConnectState = MediaConnectStateConnected;
-    Attribs.MediaDuplexState = MediaDuplexStateFull;
-    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
-    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
-    Attribs.MacOptions = XENNET_MAC_OPTIONS;
-    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
-    Attribs.MaxMulticastListSize = 32;
-    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
-
-    XENVIF_VIF(MacQueryPermanentAddress,
-               &Adapter->VifInterface,
-               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
-    XENVIF_VIF(MacQueryCurrentAddress,
-               &Adapter->VifInterface,
-               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
+    PVOID                   Buffer;
+    ULONG                   BufferLength;
+    ULONG                   BytesNeeded;
+    ULONG                   BytesWritten;
+    ULONG                   Value32;
+    ULONGLONG               Value64;
+    ETHERNET_ADDRESS        EthernetAddress;
+    BOOLEAN                 Warn;
+    NDIS_STATUS             ndisStatus;
 
-    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
-    Attribs.RecvScaleCapabilities = NULL;
-    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
-    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
-    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
-    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
-    Attribs.IfConnectorPresent = TRUE;
-    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
-                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
-                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
-                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED |
-                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
-                      
-    Attribs.SupportedOidList = XennetSupportedOids;
-    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
+    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
+    BufferLength = Request->DATA.QUERY_INFORMATION.InformationBufferLength;
+    BytesNeeded = BytesWritten = 0;
+    Warn = TRUE;
+    ndisStatus = NDIS_STATUS_SUCCESS;
 
-    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    switch (Request->DATA.QUERY_INFORMATION.Oid) {
+    case OID_PNP_CAPABILITIES:
+        BytesNeeded = sizeof(Adapter->Capabilities);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &Adapter->Capabilities,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    return ndisStatus;
-}
+    case OID_PNP_QUERY_POWER:
+        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
 
-static NDIS_STATUS
-AdapterSetOffloadAttributes(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
-    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
-    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
-    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
-    NDIS_OFFLOAD                                Default;
-    NDIS_OFFLOAD                                Supported;
-    NDIS_STATUS                                 ndisStatus;
+        if (BufferLength >= BytesNeeded) {
+            PNDIS_DEVICE_POWER_STATE PowerState;
 
-    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
-    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
+            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
+            switch (*PowerState) {
+            case NdisDeviceStateD0:
+                Info("QUERY_POWER: D0\n");
+                break;
 
-    TxOptions->Value = 0;
-    TxOptions->OffloadTagManipulation = 1;
+            case NdisDeviceStateD1:
+                Info("QUERY_POWER: D1\n");
+                break;
 
-    RxOptions->Value = 0;
-    RxOptions->OffloadTagManipulation = 1;
+            case NdisDeviceStateD2:
+                Info("QUERY_POWER: D2\n");
+                break;
 
-    if (Adapter->Properties.need_csum_value)
-        RxOptions->NeedChecksumValue = 1;
+            case NdisDeviceStateD3:
+                Info("QUERY_POWER: D3\n");
+                break;
+            }
+        }
 
-    if (Adapter->Properties.lrov4) {
-        RxOptions->OffloadIpVersion4LargePacket = 1;
-        RxOptions->NeedLargePacketSplit = 1;
-    }
+        BytesWritten = 0;
+        // do nothing
+        break;
 
-    if (Adapter->Properties.lrov6) {
-        RxOptions->OffloadIpVersion6LargePacket = 1;
-        RxOptions->NeedLargePacketSplit = 1;
-    }
+    case OID_GEN_SUPPORTED_LIST:
+        BytesNeeded = sizeof(XennetSupportedOids);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &XennetSupportedOids[0],
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    XENVIF_VIF(ReceiverSetOffloadOptions,
-               &Adapter->VifInterface,
-               *RxOptions);
+    case OID_GEN_HARDWARE_STATUS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                NdisHardwareStatusReady,
+                                &BytesWritten);
+        break;
 
-    XENVIF_VIF(TransmitterQueryOffloadOptions,
-               &Adapter->VifInterface,
-               &Options);
+    case OID_GEN_MEDIA_SUPPORTED:
+    case OID_GEN_MEDIA_IN_USE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                XENNET_MEDIA_TYPE,
+                                &BytesWritten);
+        break;
 
-    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
-    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
-    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
-    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
+    case OID_GEN_MAXIMUM_LOOKAHEAD:
+    case OID_GEN_TRANSMIT_BLOCK_SIZE:
+    case OID_GEN_RECEIVE_BLOCK_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->MaximumFrameSize,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_GEN_TRANSMIT_BUFFER_SPACE:
+    case OID_GEN_RECEIVE_BUFFER_SPACE:
+        XENVIF_VIF(TransmitterQueryRingSize,
+                    &Adapter->VifInterface,
+                    (PULONG)&Value32);
+        Value32 *= Adapter->MaximumFrameSize;
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.IpChecksum = 1;
-    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
+    case OID_GEN_VENDOR_DESCRIPTION:
+        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  VENDOR_NAME_STR,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
-    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
+    case OID_GEN_VENDOR_DRIVER_VERSION:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
+    case OID_GEN_DRIVER_VERSION:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (6 << 8) | 0, // NDIS 6.0
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_GEN_MAC_OPTIONS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                XENNET_MAC_OPTIONS,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
+    case OID_GEN_STATISTICS:
+        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
+        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
+                                                   (PNDIS_STATISTICS_INFO)Buffer,
+                                                   BufferLength,
+                                                   &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
-    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
+    case OID_802_3_MULTICAST_LIST:
+        ndisStatus = AdapterQueryMulticastList(Adapter,
+                                               Buffer,
+                                               BufferLength,
+                                               &BytesNeeded,
+                                               &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
+    case OID_802_3_PERMANENT_ADDRESS:
+        XENVIF_VIF(MacQueryPermanentAddress,
+                    &Adapter->VifInterface,
+                    &EthernetAddress);
+        BytesNeeded = sizeof(ETHERNET_ADDRESS);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &EthernetAddress,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv4Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_802_3_CURRENT_ADDRESS:
+        XENVIF_VIF(MacQueryCurrentAddress,
+                    &Adapter->VifInterface,
+                    &EthernetAddress);
+        BytesNeeded = sizeof(ETHERNET_ADDRESS);
+        ndisStatus = __CopyBuffer(Buffer,
+                                  BufferLength,
+                                  &EthernetAddress,
+                                  BytesNeeded,
+                                  &BytesWritten);
+        break;
+
+    case OID_GEN_MAXIMUM_FRAME_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->MaximumFrameSize -
+                                    sizeof(ETHERNET_TAGGED_HEADER),
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_MAXIMUM_TOTAL_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->MaximumFrameSize -
+                                    sizeof(ETHERNET_TAGGED_HEADER) +
+                                    sizeof (ETHERNET_UNTAGGED_HEADER),
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_CURRENT_LOOKAHEAD:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Adapter->CurrentLookahead,
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_VENDOR_ID:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                0x5853,
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_LINK_SPEED:
+        XENVIF_VIF(MacQueryState,
+                   &Adapter->VifInterface,
+                   NULL,
+                   &Value64,
+                   NULL);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)(Value64 / 100),
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_MEDIA_CONNECT_STATUS:
+        XENVIF_VIF(MacQueryState,
+                    &Adapter->VifInterface,
+                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
+                    NULL,
+                    NULL);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
+
+    case OID_GEN_MAXIMUM_SEND_PACKETS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                16,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4HeaderChecksum) {
-        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
-        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
-    }
+    case OID_GEN_CURRENT_PACKET_FILTER:
+        AdapterGetPacketFilter(Adapter, &Value32);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4TcpChecksum) {
-        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
-        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
-    }
+    case OID_GEN_XMIT_OK:
+        AdapterGetXmitOk(Adapter, &Value64);
+        BytesNeeded = sizeof(ULONG64);
+        ndisStatus = __SetUlong64(Buffer,
+                                  BufferLength,
+                                  Value64,
+                                  &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4UdpChecksum)
-        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
+    case OID_GEN_RCV_OK:
+        AdapterGetRcvOk(Adapter, &Value64);
+        BytesNeeded = sizeof(ULONG64);
+        ndisStatus = __SetUlong64(Buffer,
+                                  BufferLength,
+                                  Value64,
+                                  &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+    case OID_GEN_XMIT_ERROR:
+        AdapterGetXmitError(Adapter, &Value32);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
+    case OID_GEN_RCV_ERROR:
+        AdapterGetRcvError(Adapter, &Value32);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                Value32,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion6TcpChecksum) {
-        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
-        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
-    }
+    case OID_GEN_RCV_NO_BUFFER:
+    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
+    case OID_GEN_RCV_CRC_ERROR:
+    case OID_802_3_RCV_ERROR_ALIGNMENT:
+    case OID_802_3_XMIT_ONE_COLLISION:
+    case OID_802_3_XMIT_MORE_COLLISIONS:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                0,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion6UdpChecksum)
-        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
+    case OID_802_3_MAXIMUM_LIST_SIZE:
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                32,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion4LargePacket) {
-        XENVIF_VIF(TransmitterQueryLargePacketSize,
+    case OID_GEN_DIRECTED_BYTES_XMIT:
+        XENVIF_VIF(QueryStatistic,
                    &Adapter->VifInterface,
-                   4,
-                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
-        Supported.LsoV2.IPv4.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
-        Supported.LsoV2.IPv4.MinSegmentCount = 2;
-    }
+                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (Options.OffloadIpVersion6LargePacket) {
-        XENVIF_VIF(TransmitterQueryLargePacketSize,
+    case OID_GEN_DIRECTED_FRAMES_XMIT:
+        XENVIF_VIF(QueryStatistic,
                    &Adapter->VifInterface,
-                   6,
-                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
-        Supported.LsoV2.IPv6.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
-        Supported.LsoV2.IPv6.MinSegmentCount = 2;
-        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
-        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
-    }
-
-    Default = Supported;
+                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.ipv4_csum & 2))
-        Default.Checksum.IPv4Receive.IpChecksum = 0;
+    case OID_GEN_MULTICAST_BYTES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv4_csum & 2))
-        Default.Checksum.IPv4Receive.TcpChecksum = 0;
+    case OID_GEN_MULTICAST_FRAMES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv4_csum & 2))
-        Default.Checksum.IPv4Receive.UdpChecksum = 0;
+    case OID_GEN_BROADCAST_BYTES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv6_csum & 2))
-        Default.Checksum.IPv6Receive.TcpChecksum = 0;
+    case OID_GEN_BROADCAST_FRAMES_XMIT:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv6_csum & 2))
-        Default.Checksum.IPv6Receive.UdpChecksum = 0;
+    case OID_GEN_DIRECTED_BYTES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_UNICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.ipv4_csum & 1))
-        Default.Checksum.IPv4Transmit.IpChecksum = 0;
+    case OID_GEN_DIRECTED_FRAMES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_UNICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv4_csum & 1))
-        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
+    case OID_GEN_MULTICAST_BYTES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_MULTICAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv4_csum & 1))
-        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
+    case OID_GEN_MULTICAST_FRAMES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_MULTICAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.tcpv6_csum & 1))
-        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
+    case OID_GEN_BROADCAST_BYTES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_BROADCAST_OCTETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.udpv6_csum & 1))
-        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
+    case OID_GEN_BROADCAST_FRAMES_RCV:
+        XENVIF_VIF(QueryStatistic,
+                   &Adapter->VifInterface,
+                   XENVIF_RECEIVER_BROADCAST_PACKETS,
+                   &Value64);
+        BytesNeeded = sizeof(ULONG);
+        ndisStatus = __SetUlong(Buffer,
+                                BufferLength,
+                                (ULONG)Value64,
+                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.lsov4)) {
-        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
-        Default.LsoV2.IPv4.MinSegmentCount = 0;
-    }
+    case OID_GEN_INTERRUPT_MODERATION:
+        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
+        ndisStatus = AdapterInterruptModeration(Adapter,
+                                                (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
+                                                BufferLength,
+                                                &BytesWritten);
+        break;
 
-    if (!(Adapter->Properties.lsov6)) {
-        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
-        Default.LsoV2.IPv6.MinSegmentCount = 0;
-    }
+    case OID_IP4_OFFLOAD_STATS:
+    case OID_IP6_OFFLOAD_STATS:
+    case OID_GEN_SUPPORTED_GUIDS:
+        // We don't handle these since NDIS 6.0 is supposed to do this for us
+    case OID_GEN_MAC_ADDRESS:
+    case OID_GEN_MAX_LINK_SPEED:
+        // ignore these common unwanted OIDs
+	case OID_GEN_INIT_TIME_MS:
+	case OID_GEN_RESET_COUNTS:
+	case OID_GEN_MEDIA_SENSE_COUNTS:
+        Warn = FALSE;
+        /*FALLTHRU*/
+    default:
+        if (Warn)
+            Warning("UNSUPPORTED OID %08x\n", Request->DATA.QUERY_INFORMATION.Oid);
 
-    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof (NDIS_OFFLOAD))) {
-        Adapter->Offload = Default;
-        DISPLAY_OFFLOAD(Default);
+        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
+        break;
     }
 
-    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = sizeof(Attribs);
-    Attribs.DefaultOffloadConfiguration = &Default;
-    Attribs.HardwareOffloadCapabilities = &Supported;
+    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
+    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
 
-    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
     return ndisStatus;
 }
 
-static NDIS_STATUS
-AdapterSetHeaderDataSplitAttributes(
-    IN  PXENNET_ADAPTER                                 Adapter
+static NTSTATUS
+__QueryInterface(
+    IN  PDEVICE_OBJECT  DeviceObject,
+    IN  const GUID      *Guid,
+    IN  ULONG           Version,
+    OUT PINTERFACE      Interface,
+    IN  ULONG           Size,
+    IN  BOOLEAN         Optional
     )
 {
-    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
-    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
-    NDIS_STATUS                                         NdisStatus;
-
-    RtlZeroMemory(&Attribs, sizeof(Attribs));
+    KEVENT              Event;
+    IO_STATUS_BLOCK     StatusBlock;
+    PIRP                Irp;
+    PIO_STACK_LOCATION  StackLocation;
+    NTSTATUS            status;
 
-    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
-    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
-    Attribs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
+    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
 
-    RtlZeroMemory(&Split, sizeof(Split));
+    KeInitializeEvent(&Event, NotificationEvent, FALSE);
+    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
 
-    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
-    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
-    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
-    Split.HardwareCapabilities =
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
-        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
+    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
+                                       DeviceObject,
+                                       NULL,
+                                       0,
+                                       NULL,
+                                       &Event,
+                                       &StatusBlock);
 
-    if (Adapter->Properties.HeaderDataSplit != 0)
-        Split.CurrentCapabilities = Split.HardwareCapabilities;
+    status = STATUS_UNSUCCESSFUL;
+    if (Irp == NULL)
+        goto fail1;
 
-    Attribs.HDSplitAttributes = &Split;
+    StackLocation = IoGetNextIrpStackLocation(Irp);
+    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
 
-    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
-                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
-    if (NdisStatus != NDIS_STATUS_SUCCESS)
-        goto fail1;
+    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
+    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
+    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
+    StackLocation->Parameters.QueryInterface.Interface = Interface;
 
-    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
-        ASSERT(Split.CurrentCapabilities & NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
+    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
 
-        Info("BackfillSize = %u\n", Split.BackfillSize);
-        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
+    status = IoCallDriver(DeviceObject, Irp);
+    if (status == STATUS_PENDING) {
+        (VOID) KeWaitForSingleObject(&Event,
+                                     Executive,
+                                     KernelMode,
+                                     FALSE,
+                                     NULL);
+        status = StatusBlock.Status;
+    }
 
-        XENVIF_VIF(ReceiverSetBackfillSize,
-                   &Adapter->VifInterface,
-                   Split.BackfillSize);
+    if (!NT_SUCCESS(status)) {
+        if (status == STATUS_NOT_SUPPORTED && Optional)
+            goto done;
 
-        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
+        goto fail2;
     }
 
-    return NDIS_STATUS_SUCCESS;
+done:
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
 
 fail1:
-    Error("fail1 (%08x)\n", NdisStatus);
+    Error("fail1 (%08x)\n", status);
 
-    return NdisStatus;
+    return status;
 }
 
-static FORCEINLINE PVOID
-__AdapterAllocate(
-    IN  ULONG   Length
-    )
-{
-    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
-}
+#pragma prefast(push)
+#pragma prefast(disable:6102)
 
-static FORCEINLINE VOID
-__AdapterFree(
-    IN  PVOID   Buffer
-    )
-{
-    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
-}
+#define READ_PROPERTY(field, name, defaultval, handle)  \
+    do {                                                \
+        NDIS_STATUS                     _Status;        \
+        NDIS_STRING                     _Value;         \
+        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
+        RtlInitUnicodeString(&_Value, name);            \
+        NdisReadConfiguration(&_Status, &_Data, handle, \
+                        &_Value, NdisParameterInteger); \
+        if (_Status == NDIS_STATUS_SUCCESS)             \
+            field = _Data->ParameterData.IntegerData;   \
+        else                                            \
+            field = defaultval;                         \
+    } while (FALSE);
 
-static FORCEINLINE PANSI_STRING
-__AdapterMultiSzToUpcaseAnsi(
-    IN  PCHAR       Buffer
+static NDIS_STATUS
+AdapterGetAdvancedSettings(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    PANSI_STRING    Ansi;
-    LONG            Index;
-    LONG            Count;
-    NTSTATUS        status;
-
-    Index = 0;
-    Count = 0;
-    for (;;) {
-        if (Buffer[Index] == '\0') {
-            Count++;
-            Index++;
-
-            // Check for double NUL
-            if (Buffer[Index] == '\0')
-                break;
-        } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
-            Index++;
-        }
-    }
+    NDIS_CONFIGURATION_OBJECT   Config;
+    NDIS_HANDLE                 Handle;
+    NDIS_STATUS                 ndisStatus;
 
-    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
+    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
+    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
+    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
+    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
+    Config.NdisHandle = Adapter->NdisAdapterHandle;
+    Config.Flags = 0;
 
-    status = STATUS_NO_MEMORY;
-    if (Ansi == NULL)
+    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
+    if (ndisStatus != NDIS_STATUS_SUCCESS)
         goto fail1;
 
-    for (Index = 0; Index < Count; Index++) {
-        ULONG   Length;
-
-        Length = (ULONG)strlen(Buffer);
-        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
-        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
-
-        status = STATUS_NO_MEMORY;
-        if (Ansi[Index].Buffer == NULL)
-            goto fail2;
-
-        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
-        Ansi[Index].Length = (USHORT)Length;
-
-        Buffer += Length + 1;
-    }
-
-    return Ansi;
-
-fail2:
-    Error("fail2\n");
+    READ_PROPERTY(Adapter->Properties.ipv4_csum, L"*IPChecksumOffloadIPv4", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.tcpv4_csum, L"*TCPChecksumOffloadIPv4", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.udpv4_csum, L"*UDPChecksumOffloadIPv4", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.tcpv6_csum, L"*TCPChecksumOffloadIPv6", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.udpv6_csum, L"*UDPChecksumOffloadIPv6", 3, Handle);
+    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.need_csum_value, L"NeedChecksumValue", 1, Handle);
+    READ_PROPERTY(Adapter->Properties.HeaderDataSplit, L"*HeaderDataSplit", 1, Handle);
 
-    while (--Index >= 0)
-        __AdapterFree(Ansi[Index].Buffer);
+    NdisCloseConfiguration(Handle);
 
-    __AdapterFree(Ansi);
+    return NDIS_STATUS_SUCCESS;
 
 fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
+    return NDIS_STATUS_FAILURE;
 }
 
-static FORCEINLINE VOID
-__AdapterFreeAnsi(
-    IN  PANSI_STRING    Ansi
+#undef READ_PROPERTY
+
+#pragma prefast(pop)
+
+static NDIS_STATUS
+AdapterSetRegistrationAttributes(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    ULONG               Index;
+    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
+    NDIS_STATUS                                     ndisStatus;
+
+    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
+    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
+    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
+                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
+    Attribs.CheckForHangTimeInSeconds = 0;
+    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
 
-    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
-        __AdapterFree(Ansi[Index].Buffer);
+    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
 
-    __AdapterFree(Ansi);
+    return ndisStatus;
 }
 
-static FORCEINLINE BOOLEAN
-__AdapterMatchDistribution(
-    IN  PXENNET_ADAPTER Adapter,
-    IN  PCHAR           Buffer
+static NDIS_STATUS
+AdapterSetGeneralAttributes(
+    IN  PXENNET_ADAPTER Adapter
     )
 {
-    PCHAR               Vendor;
-    PCHAR               Product;
-    PCHAR               Context;
-    const CHAR          *Text;
-    BOOLEAN             Match;
-    ULONG               Index;
-    NTSTATUS            status;
+    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
+    NDIS_STATUS                                 ndisStatus;
 
-    UNREFERENCED_PARAMETER(Adapter);
+    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
+    Attribs.MediaType = XENNET_MEDIA_TYPE;
 
-    status = STATUS_INVALID_PARAMETER;
+    XENVIF_VIF(MacQueryMaximumFrameSize,
+               &Adapter->VifInterface,
+               (PULONG)&Adapter->MaximumFrameSize);
 
-    Vendor = __strtok_r(Buffer, " ", &Context);
-    if (Vendor == NULL)
-        goto fail1;
+    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof (ETHERNET_TAGGED_HEADER);
+    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
+    Attribs.MediaConnectState = MediaConnectStateConnected;
+    Attribs.MediaDuplexState = MediaDuplexStateFull;
+    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
+    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
+    Attribs.MacOptions = XENNET_MAC_OPTIONS;
+    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
+    Attribs.MaxMulticastListSize = 32;
+    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
 
-    Product = __strtok_r(NULL, " ", &Context);
-    if (Product == NULL)
-        goto fail2;
+    XENVIF_VIF(MacQueryPermanentAddress,
+               &Adapter->VifInterface,
+               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
+    XENVIF_VIF(MacQueryCurrentAddress,
+               &Adapter->VifInterface,
+               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
 
-    Match = TRUE;
+    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
+    Attribs.RecvScaleCapabilities = NULL;
+    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
+    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
+    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
+    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
+    Attribs.IfConnectorPresent = TRUE;
+    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
+                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
+                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
+                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED |
+                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
+                      
+    Attribs.SupportedOidList = XennetSupportedOids;
+    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
 
-    Text = VENDOR_NAME_STR;
+    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
 
-    for (Index = 0; Text[Index] != 0; Index++) {
-        if (!isalnum((UCHAR)Text[Index])) {
-            if (Vendor[Index] != '_') {
-                Match = FALSE;
-                break;
-            }
-        } else {
-            if (Vendor[Index] != Text[Index]) {
-                Match = FALSE;
-                break;
-            }
-        }
-    }
+    return ndisStatus;
+}
 
-    Text = "XENNET";
+static NDIS_STATUS
+AdapterSetOffloadAttributes(
+    IN  PXENNET_ADAPTER Adapter
+    )
+{
+    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
+    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
+    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
+    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
+    NDIS_OFFLOAD                                Default;
+    NDIS_OFFLOAD                                Supported;
+    NDIS_STATUS                                 ndisStatus;
 
-    if (_stricmp(Product, Text) != 0)
-        Match = FALSE;
+    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
+    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
 
-    return Match;
+    TxOptions->Value = 0;
+    TxOptions->OffloadTagManipulation = 1;
 
-fail2:
-    Error("fail2\n");
+    RxOptions->Value = 0;
+    RxOptions->OffloadTagManipulation = 1;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    if (Adapter->Properties.need_csum_value)
+        RxOptions->NeedChecksumValue = 1;
 
-    return FALSE;
-}
+    if (Adapter->Properties.lrov4) {
+        RxOptions->OffloadIpVersion4LargePacket = 1;
+        RxOptions->NeedLargePacketSplit = 1;
+    }
 
-static FORCEINLINE VOID
-__AdapterClearDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    PCHAR               Buffer;
-    PANSI_STRING        Distributions;
-    ULONG               Index;
-    NTSTATUS            status;
+    if (Adapter->Properties.lrov6) {
+        RxOptions->OffloadIpVersion6LargePacket = 1;
+        RxOptions->NeedLargePacketSplit = 1;
+    }
 
-    Trace("====>\n");
+    XENVIF_VIF(ReceiverSetOffloadOptions,
+               &Adapter->VifInterface,
+               *RxOptions);
 
-    status = XENBUS_STORE(Directory,
-                          &Adapter->StoreInterface,
-                          NULL,
-                          NULL,
-                          "drivers",
-                          &Buffer);
-    if (NT_SUCCESS(status)) {
-        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
+    XENVIF_VIF(TransmitterQueryOffloadOptions,
+               &Adapter->VifInterface,
+               &Options);
 
-        XENBUS_STORE(Free,
-                     &Adapter->StoreInterface,
-                     Buffer);
-    } else {
-        Distributions = NULL;
-    }
+    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
+    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
+    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
+    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
 
-    if (Distributions == NULL)
-        goto done;
+    Supported.Checksum.IPv4Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
 
-    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
-        PANSI_STRING    Distribution = &Distributions[Index];
+    Supported.Checksum.IPv4Receive.IpChecksum = 1;
+    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
 
-        status = XENBUS_STORE(Read,
-                              &Adapter->StoreInterface,
-                              NULL,
-                              "drivers",
-                              Distribution->Buffer,
-                              &Buffer);
-        if (!NT_SUCCESS(status))
-            continue;
+    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
+    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
 
-        if (__AdapterMatchDistribution(Adapter, Buffer))
-            (VOID) XENBUS_STORE(Remove,
-                                &Adapter->StoreInterface,
-                                NULL,
-                                "drivers",
-                                Distribution->Buffer);
+    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
 
-        XENBUS_STORE(Free,
-                     &Adapter->StoreInterface,
-                     Buffer);
-    }
+    Supported.Checksum.IPv6Receive.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
 
-    __AdapterFreeAnsi(Distributions);
+    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
 
-done:
-    Trace("<====\n");
-}
+    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
+    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
 
-#define MAXIMUM_INDEX   255
+    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
 
-static FORCEINLINE NTSTATUS
-__AdapterSetDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    ULONG               Index;
-    CHAR                Distribution[MAXNAMELEN];
-    CHAR                Vendor[MAXNAMELEN];
-    const CHAR          *Product;
-    NTSTATUS            status;
+    Supported.Checksum.IPv4Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
 
-    Trace("====>\n");
+    if (Options.OffloadIpVersion4HeaderChecksum) {
+        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
+        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
+    }
 
-    Index = 0;
-    while (Index <= MAXIMUM_INDEX) {
-        PCHAR   Buffer;
+    if (Options.OffloadIpVersion4TcpChecksum) {
+        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
+        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
+    }
 
-        status = RtlStringCbPrintfA(Distribution,
-                                    MAXNAMELEN,
-                                    "%u",
-                                    Index);
-        ASSERT(NT_SUCCESS(status));
+    if (Options.OffloadIpVersion4UdpChecksum)
+        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
 
-        status = XENBUS_STORE(Read,
-                              &Adapter->StoreInterface,
-                              NULL,
-                              "drivers",
-                              Distribution,
-                              &Buffer);
-        if (!NT_SUCCESS(status)) {
-            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
-                goto update;
+    Supported.Checksum.IPv6Transmit.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+
+    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
 
-            goto fail1;
-        }
+    if (Options.OffloadIpVersion6TcpChecksum) {
+        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
+        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
+    }
 
-        XENBUS_STORE(Free,
-                     &Adapter->StoreInterface,
-                     Buffer);
+    if (Options.OffloadIpVersion6UdpChecksum)
+        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
 
-        Index++;
+    if (Options.OffloadIpVersion4LargePacket) {
+        XENVIF_VIF(TransmitterQueryLargePacketSize,
+                   &Adapter->VifInterface,
+                   4,
+                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
+        Supported.LsoV2.IPv4.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+        Supported.LsoV2.IPv4.MinSegmentCount = 2;
     }
 
-    status = STATUS_UNSUCCESSFUL;
-    goto fail2;
+    if (Options.OffloadIpVersion6LargePacket) {
+        XENVIF_VIF(TransmitterQueryLargePacketSize,
+                   &Adapter->VifInterface,
+                   6,
+                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
+        Supported.LsoV2.IPv6.Encapsulation = NDIS_ENCAPSULATION_IEEE_802_3;
+        Supported.LsoV2.IPv6.MinSegmentCount = 2;
+        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
+        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
+    }
 
-update:
-    status = RtlStringCbPrintfA(Vendor,
-                                MAXNAMELEN,
-                                "%s",
-                                VENDOR_NAME_STR);
-    ASSERT(NT_SUCCESS(status));
+    Default = Supported;
 
-    for (Index  = 0; Vendor[Index] != '\0'; Index++)
-        if (!isalnum((UCHAR)Vendor[Index]))
-            Vendor[Index] = '_';
+    if (!(Adapter->Properties.ipv4_csum & 2))
+        Default.Checksum.IPv4Receive.IpChecksum = 0;
 
-    Product = "XENNET";
+    if (!(Adapter->Properties.tcpv4_csum & 2))
+        Default.Checksum.IPv4Receive.TcpChecksum = 0;
 
-#if DBG
-#define ATTRIBUTES   "(DEBUG)"
-#else
-#define ATTRIBUTES   ""
-#endif
+    if (!(Adapter->Properties.udpv4_csum & 2))
+        Default.Checksum.IPv4Receive.UdpChecksum = 0;
 
-    (VOID) XENBUS_STORE(Printf,
-                        &Adapter->StoreInterface,
-                        NULL,
-                        "drivers",
-                        Distribution,
-                        "%s %s %u.%u.%u %s",
-                        Vendor,
-                        Product,
-                        MAJOR_VERSION,
-                        MINOR_VERSION,
-                        MICRO_VERSION,
-                        ATTRIBUTES
-                        );
+    if (!(Adapter->Properties.tcpv6_csum & 2))
+        Default.Checksum.IPv6Receive.TcpChecksum = 0;
 
-#undef  ATTRIBUTES
+    if (!(Adapter->Properties.udpv6_csum & 2))
+        Default.Checksum.IPv6Receive.UdpChecksum = 0;
 
-    Trace("<====\n");
-    return STATUS_SUCCESS;
+    if (!(Adapter->Properties.ipv4_csum & 1))
+        Default.Checksum.IPv4Transmit.IpChecksum = 0;
 
-fail2:
-    Error("fail2\n");
+    if (!(Adapter->Properties.tcpv4_csum & 1))
+        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    if (!(Adapter->Properties.udpv4_csum & 1))
+        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
 
-    return status;
-}
+    if (!(Adapter->Properties.tcpv6_csum & 1))
+        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
 
-static DECLSPEC_NOINLINE VOID
-AdapterSuspendCallbackLate(
-    IN  PVOID       Argument
-    )
-{
-    PXENNET_ADAPTER Adapter = Argument;
+    if (!(Adapter->Properties.udpv6_csum & 1))
+        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
 
-    (VOID) __AdapterSetDistribution(Adapter);
-}
+    if (!(Adapter->Properties.lsov4)) {
+        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
+        Default.LsoV2.IPv4.MinSegmentCount = 0;
+    }
 
-static NTSTATUS
-AdapterSetDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    LONG                Count;
-    NTSTATUS            status;
+    if (!(Adapter->Properties.lsov6)) {
+        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
+        Default.LsoV2.IPv6.MinSegmentCount = 0;
+    }
 
-    Trace("====>\n");
+    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof (NDIS_OFFLOAD))) {
+        Adapter->Offload = Default;
+        DISPLAY_OFFLOAD(Default);
+    }
 
-    Count = InterlockedIncrement(&AdapterCount);
-    ASSERT(Count != 0);
+    RtlZeroMemory(&Attribs, sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = sizeof(Attribs);
+    Attribs.DefaultOffloadConfiguration = &Default;
+    Attribs.HardwareOffloadCapabilities = &Supported;
 
-    if (Count != 1)
-        goto done;
+    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    return ndisStatus;
+}
 
-    status = __AdapterSetDistribution(Adapter);
-    if (!NT_SUCCESS(status))
-        goto fail1;
+static NDIS_STATUS
+AdapterSetHeaderDataSplitAttributes(
+    IN  PXENNET_ADAPTER                                 Adapter
+    )
+{
+    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
+    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
+    NDIS_STATUS                                         NdisStatus;
 
-    status = XENBUS_SUSPEND(Register,
-                            &Adapter->SuspendInterface,
-                            SUSPEND_CALLBACK_LATE,
-                            AdapterSuspendCallbackLate,
-                            Adapter,
-                            &Adapter->SuspendCallbackLate);
-    if (!NT_SUCCESS(status))
-        goto fail2;
+    RtlZeroMemory(&Attribs, sizeof(Attribs));
 
-done:
-    Trace("<====\n");
-    return STATUS_SUCCESS;
+    Attribs.Header.Type = NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES;
+    Attribs.Header.Revision = NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
+    Attribs.Header.Size = NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
 
-fail2:
-    Error("fail2\n");
+    RtlZeroMemory(&Split, sizeof(Split));
 
-    __AdapterClearDistribution(Adapter);
+    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
+    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
+    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
+    Split.HardwareCapabilities =
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
+        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
 
-fail1:
-    Error("fail1 (%08x)\n", status);
+    if (Adapter->Properties.HeaderDataSplit != 0)
+        Split.CurrentCapabilities = Split.HardwareCapabilities;
 
-    return status;
-}
+    Attribs.HDSplitAttributes = &Split;
 
-static VOID
-AdapterClearDistribution(
-    IN  PXENNET_ADAPTER Adapter
-    )
-{
-    LONG                Count;
+    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
+                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
+    if (NdisStatus != NDIS_STATUS_SUCCESS)
+        goto fail1;
 
-    Trace("====>\n");
+    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
+        ASSERT(Split.CurrentCapabilities & NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
 
-    Count = InterlockedDecrement(&AdapterCount);
+        Info("BackfillSize = %u\n", Split.BackfillSize);
+        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
 
-    if (Count != 0)
-        goto done;
+        XENVIF_VIF(ReceiverSetBackfillSize,
+                   &Adapter->VifInterface,
+                   Split.BackfillSize);
 
-    XENBUS_SUSPEND(Deregister,
-                   &Adapter->SuspendInterface,
-                   Adapter->SuspendCallbackLate);
-    Adapter->SuspendCallbackLate = NULL;
+        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
+    }
 
-    __AdapterClearDistribution(Adapter);
+    return NDIS_STATUS_SUCCESS;
 
-done:
-    Trace("<====\n");
+fail1:
+    Error("fail1 (%08x)\n", NdisStatus);
+
+    return NdisStatus;
 }
 
 NDIS_STATUS
@@ -2715,52 +2810,35 @@ AdapterInitialize(
     if (!NT_SUCCESS(status))
         goto fail6;
 
-    status = XENBUS_CACHE(Acquire,
-                          &(*Adapter)->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail7;
-
-    status = XENBUS_STORE(Acquire,
-                          &(*Adapter)->StoreInterface);
-    if (!NT_SUCCESS(status))
-        goto fail8;
-
-    status = XENBUS_SUSPEND(Acquire,
-                            &(*Adapter)->SuspendInterface);
-    if (!NT_SUCCESS(status))
-        goto fail9;
-
-    (VOID) AdapterSetDistribution(*Adapter);
-
     (*Adapter)->NdisAdapterHandle = Handle;
 
     ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail10;
+        goto fail7;
 
     ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail11;
+        goto fail8;
 
     ndisStatus = AdapterGetAdvancedSettings(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail12;
+        goto fail9;
 
     ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail13;
+        goto fail10;
 
     ndisStatus = AdapterSetGeneralAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail14;
+        goto fail11;
 
     ndisStatus = AdapterSetOffloadAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail15;
+        goto fail12;
 
     ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail16;
+        goto fail13;
 
     RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
     Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
@@ -2777,43 +2855,23 @@ AdapterInitialize(
     if (ndisStatus != NDIS_STATUS_SUCCESS)
         (*Adapter)->NdisDmaHandle = NULL;
 
-    ndisStatus = AdapterEnable(*Adapter);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail17;
-
     return NDIS_STATUS_SUCCESS;
 
-fail17:
-    if ((*Adapter)->NdisDmaHandle)
-        NdisMDeregisterScatterGatherDma((*Adapter)->NdisDmaHandle);
-    (*Adapter)->NdisDmaHandle = NULL;
-
-fail16:
-fail15:
-fail14:
 fail13:
 fail12:
+fail11:
+fail10:
+fail9:
     ReceiverTeardown((*Adapter)->Receiver);
     (*Adapter)->Receiver = NULL;
-fail11:
 
+fail8:
     TransmitterTeardown((*Adapter)->Transmitter);
     (*Adapter)->Transmitter = NULL;
 
-fail10:
+fail7:
     (*Adapter)->NdisAdapterHandle = NULL;
 
-    AdapterClearDistribution(*Adapter);
-
-    XENBUS_SUSPEND(Release, &(*Adapter)->SuspendInterface);
-
-fail9:
-    XENBUS_STORE(Release, &(*Adapter)->StoreInterface);
-
-fail8:
-    XENBUS_CACHE(Release, &(*Adapter)->CacheInterface);
-
-fail7:
     XENVIF_VIF(Release, &(*Adapter)->VifInterface);
 
 fail6:
@@ -2852,9 +2910,6 @@ AdapterTeardown(
 
     AdapterClearDistribution(Adapter);
 
-    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
-    XENBUS_STORE(Release, &Adapter->StoreInterface);
-    XENBUS_CACHE(Release, &Adapter->CacheInterface);
     XENVIF_VIF(Release, &Adapter->VifInterface);
 
     RtlZeroMemory(&Adapter->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
index 3cc1d90..5b2495a 100644
--- a/src/xennet/adapter.h
+++ b/src/xennet/adapter.h
@@ -99,7 +99,7 @@ AdapterEnable(
     IN  PXENNET_ADAPTER     Adapter
     );
 
-extern BOOLEAN
+extern VOID
 AdapterDisable(
     IN  PXENNET_ADAPTER     Adapter
     );
diff --git a/src/xennet/miniport.c b/src/xennet/miniport.c
index 5500418..1883db5 100644
--- a/src/xennet/miniport.c
+++ b/src/xennet/miniport.c
@@ -66,7 +66,7 @@ MiniportInitializeEx(
     PXENNET_ADAPTER                     Adapter;
     NDIS_STATUS                         NdisStatus;
 
-    Trace("====>\n");
+    Info("====>\n");
 
     UNREFERENCED_PARAMETER(MiniportDriverContext);
     UNREFERENCED_PARAMETER(MiniportInitParameters);
@@ -75,7 +75,7 @@ MiniportInitializeEx(
     if (NdisStatus != NDIS_STATUS_SUCCESS)
         goto fail1;
 
-    Trace("<====\n");
+    Info("<====\n");
 
     return NDIS_STATUS_SUCCESS;
 
@@ -97,16 +97,14 @@ MiniportHaltEx(
 
     UNREFERENCED_PARAMETER(HaltAction);
 
-    Trace("====>\n");
+    Info("====>\n");
 
     if (Adapter == NULL)
         return;
 
-    (VOID) AdapterDisable(Adapter);
-
     AdapterTeardown(Adapter);
 
-    Trace("<====\n");
+    Info("<====\n");
 }
 
 static
@@ -131,12 +129,11 @@ MiniportPause(
 
     UNREFERENCED_PARAMETER(MiniportPauseParameters);
 
-    Trace("====>\n");
+    Info("====>\n");
 
-    if (AdapterDisable(Adapter))
-        AdapterMediaStateChange(Adapter);
+    AdapterDisable(Adapter);
 
-    Trace("<====\n");
+    Info("<====\n");
 
     return NDIS_STATUS_SUCCESS;
 }
@@ -154,11 +151,11 @@ MiniportRestart(
 
     UNREFERENCED_PARAMETER(MiniportRestartParameters);
 
-    Trace("====>\n");
+    Info("====>\n");
 
     NdisStatus = AdapterEnable(Adapter);
 
-    Trace("<====\n");
+    Info("<====\n");
 
     return NdisStatus;
 }
diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 17ab27f..8bfc10b 100644
--- a/src/xennet/receiver.c
+++ b/src/xennet/receiver.c
@@ -359,6 +359,24 @@ fail1:
     return status;
 }
 
+NDIS_STATUS
+ReceiverEnable (
+    IN  PXENNET_RECEIVER    Receiver
+    )
+{
+    UNREFERENCED_PARAMETER(Receiver);
+
+    return NDIS_STATUS_SUCCESS;
+}
+
+VOID
+ReceiverDisable (
+    IN  PXENNET_RECEIVER    Receiver
+    )
+{
+    UNREFERENCED_PARAMETER(Receiver);
+}
+
 VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
index b2cc809..33701a9 100644
--- a/src/xennet/receiver.h
+++ b/src/xennet/receiver.h
@@ -43,6 +43,16 @@ ReceiverInitialize(
     OUT PXENNET_RECEIVER    *Receiver
     );
 
+extern NDIS_STATUS
+ReceiverEnable(
+    IN  PXENNET_RECEIVER    Receiver
+    );
+
+extern VOID
+ReceiverDisable(
+    IN  PXENNET_RECEIVER    Receiver
+    );
+
 extern VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
index a617b7d..8c80c7e 100644
--- a/src/xennet/transmitter.c
+++ b/src/xennet/transmitter.c
@@ -141,16 +141,10 @@ TransmitterInitialize (
     OUT PXENNET_TRANSMITTER *Transmitter
     )
 {
-    NTSTATUS                status;
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Adapter);
-
     *Transmitter = ExAllocatePoolWithTag(NonPagedPool,
                                          sizeof(XENNET_TRANSMITTER),
                                          TRANSMITTER_POOL_TAG);
 
-    status = STATUS_NO_MEMORY;
     if (*Transmitter == NULL)
         goto fail1;
 
@@ -160,6 +154,22 @@ TransmitterInitialize (
 
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
+    return NDIS_STATUS_SUCCESS;
+
+fail1:
+    return NDIS_STATUS_FAILURE;
+}
+
+NDIS_STATUS
+TransmitterEnable (
+    IN  PXENNET_TRANSMITTER Transmitter
+    )
+{
+    PXENBUS_CACHE_INTERFACE CacheInterface;
+    NTSTATUS                status;
+
+    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
+
     status = XENBUS_CACHE(Create,
                           CacheInterface,
                           "packet_cache",
@@ -169,10 +179,10 @@ TransmitterInitialize (
                           __TransmitterPacketDtor,
                           __TransmitterPacketAcquireLock,
                           __TransmitterPacketReleaseLock,
-                          *Transmitter,
-                          &(*Transmitter)->PacketCache);
+                          Transmitter,
+                          &Transmitter->PacketCache);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = XENBUS_CACHE(Create,
                           CacheInterface,
@@ -183,27 +193,20 @@ TransmitterInitialize (
                           __TransmitterBufferDtor,
                           __TransmitterBufferAcquireLock,
                           __TransmitterBufferReleaseLock,
-                          *Transmitter,
-                          &(*Transmitter)->BufferCache);
+                          Transmitter,
+                          &Transmitter->BufferCache);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     return NDIS_STATUS_SUCCESS;
 
-fail3:
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 (*Transmitter)->PacketCache);
-    (*Transmitter)->PacketCache = NULL;
-
 fail2:
     Error("fail2\n");
 
-    RtlZeroMemory(&(*Transmitter)->Lock, sizeof(KSPIN_LOCK));
-
-    ExFreePoolWithTag(*Transmitter, TRANSMITTER_POOL_TAG);
-
-    *Transmitter = NULL;
+    XENBUS_CACHE(Destroy,
+                 CacheInterface,
+                 Transmitter->PacketCache);
+    Transmitter->PacketCache = NULL;
 
 fail1:
     Error("fail1\n (%08x)", status);
@@ -212,7 +215,7 @@ fail1:
 }
 
 VOID
-TransmitterTeardown(
+TransmitterDisable (
     IN  PXENNET_TRANSMITTER Transmitter
     )
 {
@@ -220,9 +223,6 @@ TransmitterTeardown(
 
     CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
 
-    Transmitter->Adapter = NULL;
-    Transmitter->OffloadOptions.Value = 0;
-
     XENBUS_CACHE(Destroy,
                  CacheInterface,
                  Transmitter->BufferCache);
@@ -232,6 +232,15 @@ TransmitterTeardown(
                  CacheInterface,
                  Transmitter->PacketCache);
     Transmitter->PacketCache = NULL;
+}
+
+VOID
+TransmitterTeardown(
+    IN  PXENNET_TRANSMITTER Transmitter
+    )
+{
+    Transmitter->Adapter = NULL;
+    Transmitter->OffloadOptions.Value = 0;
 
     RtlZeroMemory(&Transmitter->Lock, sizeof(KSPIN_LOCK));
 
diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
index 0adebdc..363b91e 100644
--- a/src/xennet/transmitter.h
+++ b/src/xennet/transmitter.h
@@ -43,6 +43,16 @@ TransmitterInitialize(
     OUT PXENNET_TRANSMITTER *Transmitter
     );
 
+extern NDIS_STATUS
+TransmitterEnable(
+    IN  PXENNET_TRANSMITTER Transmitter
+    );
+
+extern VOID
+TransmitterDisable(
+    IN  PXENNET_TRANSMITTER Transmitter
+    );
+
 extern VOID
 TransmitterTeardown(
     IN  PXENNET_TRANSMITTER Transmitter
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 17:21:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 17:21:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4XYy-0006eZ-As; Thu, 03 Dec 2015 17:21:00 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=772d45f04=Paul.Durrant@citrix.com>)
	id 1a4XYv-0006eR-Rw
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 17:20:58 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	A9/5F-21571-9F970665; Thu, 03 Dec 2015 17:20:57 +0000
X-Env-Sender: prvs=772d45f04=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1449163253!3457396!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 60315 invoked from network); 3 Dec 2015 17:20:54 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Dec 2015 17:20:54 -0000
X-IronPort-AV: E=Sophos;i="5.20,378,1444694400"; 
   d="scan'208";a="9228673"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <pdurrant@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [PATCH for 8.1] Make sure XENBUS interfaces are released when
	going into S4
Thread-Index: AQHRLcuVQgVsHxUVhUagbULR7IVhKp65gHXw
Date: Thu, 3 Dec 2015 17:18:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A5699@AMSPEX01CL01.citrite.net>
References: <1449148022-7436-1-git-send-email-paul.durrant@citrix.com>
In-Reply-To: <1449148022-7436-1-git-send-email-paul.durrant@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] [PATCH for 8.1] Make sure XENBUS interfaces are
 released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Paul Durrant [mailto:pdurrant@gmail.com]
> Sent: 03 December 2015 13:07
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: [PATCH for 8.1] Make sure XENBUS interfaces are released when
> going into S4
> 
> Because a transition into and out of S4 means a new domain is built, it's
> crucial that all XENBUS interfaces are released (so that things like
> event channels, grant tables and the xenstore ring get re-constructed).
> 
> This patch fixes code paths where this was not being done. It also adds
> some more logging during AdapterEnable/Disable and when moving
> between
> D0 and D3.
> 
> Signed-off-by: Paul Durrant <paul.durrant@citrix.com>

Note that this patch introduces a race between cache destruction and packet transmission which can lead to a NULL pointer dereference. The only sound solution I can see to this is to move hashing into XENVIF so that XENNET no longer needs to use caches and their lifecycle can then be protected by the MRSW VIF interface lock.
Since that's a significant amount of code change it's going to take a while and so I will not back-port this patch until then.

  Paul

> ---
>  src/xennet/adapter.c     | 2719 +++++++++++++++++++++++-------------------
> ----
>  src/xennet/adapter.h     |    2 +-
>  src/xennet/miniport.c    |   21 +-
>  src/xennet/receiver.c    |   18 +
>  src/xennet/receiver.h    |   10 +
>  src/xennet/transmitter.c |   63 +-
>  src/xennet/transmitter.h |   10 +
>  7 files changed, 1471 insertions(+), 1372 deletions(-)
> 
> diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
> index f9b3cf1..2c35636 100644
> --- a/src/xennet/adapter.c
> +++ b/src/xennet/adapter.c
> @@ -1074,1576 +1074,1671 @@ AdapterGetReceiver(
>      return Adapter->Receiver;
>  }
> 
> -NDIS_STATUS
> -AdapterEnable(
> -    IN  PXENNET_ADAPTER     Adapter
> +static FORCEINLINE PVOID
> +__AdapterAllocate(
> +    IN  ULONG   Length
>      )
>  {
> -    NTSTATUS        status;
> -
> -    if (Adapter->Enabled)
> -        return NDIS_STATUS_SUCCESS;
> -
> -    status = XENVIF_VIF(Enable,
> -                        &Adapter->VifInterface,
> -                        AdapterVifCallback,
> -                        Adapter);
> -    if (!NT_SUCCESS(status))
> -        goto fail1;
> -
> -    Adapter->Enabled = TRUE;
> -
> -    return NDIS_STATUS_SUCCESS;
> +    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
> +}
> 
> -fail1:
> -    return NDIS_STATUS_FAILURE;
> +static FORCEINLINE VOID
> +__AdapterFree(
> +    IN  PVOID   Buffer
> +    )
> +{
> +    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
>  }
> 
> -BOOLEAN
> -AdapterDisable(
> -    IN  PXENNET_ADAPTER     Adapter
> +static FORCEINLINE PANSI_STRING
> +__AdapterMultiSzToUpcaseAnsi(
> +    IN  PCHAR       Buffer
>      )
>  {
> -    if (!Adapter->Enabled)
> -        return FALSE;
> +    PANSI_STRING    Ansi;
> +    LONG            Index;
> +    LONG            Count;
> +    NTSTATUS        status;
> 
> -    XENVIF_VIF(Disable,
> -               &Adapter->VifInterface);
> +    Index = 0;
> +    Count = 0;
> +    for (;;) {
> +        if (Buffer[Index] == '\0') {
> +            Count++;
> +            Index++;
> 
> -    AdapterMediaStateChange(Adapter);
> +            // Check for double NUL
> +            if (Buffer[Index] == '\0')
> +                break;
> +        } else {
> +            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
> +            Index++;
> +        }
> +    }
> 
> -    Adapter->Enabled = FALSE;
> +    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
> 
> -    return TRUE;
> -}
> +    status = STATUS_NO_MEMORY;
> +    if (Ansi == NULL)
> +        goto fail1;
> 
> -VOID
> -AdapterMediaStateChange(
> -    IN  PXENNET_ADAPTER     Adapter
> -    )
> -{
> -    NDIS_LINK_STATE         LinkState;
> -    NDIS_STATUS_INDICATION  StatusIndication;
> +    for (Index = 0; Index < Count; Index++) {
> +        ULONG   Length;
> 
> -    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
> -    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
> -    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
> -    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
> +        Length = (ULONG)strlen(Buffer);
> +        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
> +        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
> 
> -    XENVIF_VIF(MacQueryState,
> -               &Adapter->VifInterface,
> -               &LinkState.MediaConnectState,
> -               &LinkState.RcvLinkSpeed,
> -               &LinkState.MediaDuplexState);
> +        status = STATUS_NO_MEMORY;
> +        if (Ansi[Index].Buffer == NULL)
> +            goto fail2;
> 
> -    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
> -        Info("LINK: STATE UNKNOWN\n");
> -    } else if (LinkState.MediaConnectState ==
> MediaConnectStateDisconnected) {
> -        Info("LINK: DOWN\n");
> -    } else {
> -        ASSERT3U(LinkState.MediaConnectState, ==,
> MediaConnectStateConnected);
> +        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
> +        Ansi[Index].Length = (USHORT)Length;
> 
> -        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
> -            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n",
> LinkState.RcvLinkSpeed);
> -        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
> -            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n", LinkState.RcvLinkSpeed);
> -        else
> -            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n",
> LinkState.RcvLinkSpeed);
> +        Buffer += Length + 1;
>      }
> 
> -    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
> +    return Ansi;
> 
> -    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
> -    StatusIndication.Header.Type =
> NDIS_OBJECT_TYPE_STATUS_INDICATION;
> -    StatusIndication.Header.Revision =
> NDIS_STATUS_INDICATION_REVISION_1;
> -    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
> +fail2:
> +    Error("fail2\n");
> 
> -    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
> -    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
> -    StatusIndication.StatusBuffer = &LinkState;
> -    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
> +    while (--Index >= 0)
> +        __AdapterFree(Ansi[Index].Buffer);
> 
> -    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle, &StatusIndication);
> +    __AdapterFree(Ansi);
> +
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return NULL;
>  }
> 
> -NDIS_STATUS
> -AdapterSetInformation(
> -    IN  PXENNET_ADAPTER     Adapter,
> -    IN  PNDIS_OID_REQUEST   Request
> +static FORCEINLINE VOID
> +__AdapterFreeAnsi(
> +    IN  PANSI_STRING    Ansi
>      )
>  {
> -    PVOID                   Buffer;
> -    ULONG                   BufferLength;
> -    ULONG                   BytesNeeded;
> -    ULONG                   BytesRead;
> -    BOOLEAN                 Warn;
> -    NDIS_STATUS             ndisStatus;
> +    ULONG               Index;
> 
> -    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
> -    BufferLength = Request-
> >DATA.SET_INFORMATION.InformationBufferLength;
> -    BytesNeeded = BytesRead = 0;
> -    Warn = TRUE;
> -    ndisStatus = NDIS_STATUS_SUCCESS;
> +    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
> +        __AdapterFree(Ansi[Index].Buffer);
> 
> -    switch (Request->DATA.SET_INFORMATION.Oid) {
> -    case OID_PNP_SET_POWER:
> -        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> -        // do nothing
> -        break;
> +    __AdapterFree(Ansi);
> +}
> 
> -    case OID_GEN_CURRENT_LOOKAHEAD:
> -        BytesNeeded = sizeof(ULONG);
> -        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
> -        if (BufferLength == BytesNeeded) {
> -            Adapter->CurrentLookahead = *(PULONG)Buffer;
> -            BytesRead = sizeof(ULONG);
> -        }
> -        break;
> +static FORCEINLINE BOOLEAN
> +__AdapterMatchDistribution(
> +    IN  PXENNET_ADAPTER Adapter,
> +    IN  PCHAR           Buffer
> +    )
> +{
> +    PCHAR               Vendor;
> +    PCHAR               Product;
> +    PCHAR               Context;
> +    const CHAR          *Text;
> +    BOOLEAN             Match;
> +    ULONG               Index;
> +    NTSTATUS            status;
> 
> -    case OID_GEN_CURRENT_PACKET_FILTER:
> -        BytesNeeded = sizeof(ULONG);
> -        if (BufferLength == BytesNeeded) {
> -            ndisStatus = AdapterSetPacketFilter(Adapter,
> -                                                (PULONG)Buffer);
> -            BytesRead = sizeof(ULONG);
> -        }
> -        break;
> +    UNREFERENCED_PARAMETER(Adapter);
> 
> -    case OID_802_3_MULTICAST_LIST:
> -        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
> -        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
> -            ndisStatus = AdapterSetMulticastAddresses(Adapter,
> -                                                      Buffer,
> -                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = BufferLength;
> -        } else {
> -            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
> -        }
> -        break;
> +    status = STATUS_INVALID_PARAMETER;
> 
> -    case OID_OFFLOAD_ENCAPSULATION:
> -        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> -        if (BufferLength >= BytesNeeded) {
> -            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
> -                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> -        }
> -        break;
> +    Vendor = __strtok_r(Buffer, " ", &Context);
> +    if (Vendor == NULL)
> +        goto fail1;
> 
> -    case OID_TCP_OFFLOAD_PARAMETERS:
> -        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
> -        if (BufferLength >= BytesNeeded) {
> -            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
> -                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
> -        }
> -        break;
> +    Product = __strtok_r(NULL, " ", &Context);
> +    if (Product == NULL)
> +        goto fail2;
> 
> -    case OID_GEN_HD_SPLIT_PARAMETERS:
> -        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> -        if (BufferLength >= BytesNeeded) {
> -            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
> -                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> -        }
> -        break;
> +    Match = TRUE;
> 
> -    case OID_GEN_INTERRUPT_MODERATION:
> -    case OID_GEN_MACHINE_NAME:
> -        Warn = FALSE;
> -        /*FALLTHRU*/
> -    default:
> -        if (Warn)
> -            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> +    Text = VENDOR_NAME_STR;
> 
> -        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> -        break;
> +    for (Index = 0; Text[Index] != 0; Index++) {
> +        if (!isalnum((UCHAR)Text[Index])) {
> +            if (Vendor[Index] != '_') {
> +                Match = FALSE;
> +                break;
> +            }
> +        } else {
> +            if (Vendor[Index] != Text[Index]) {
> +                Match = FALSE;
> +                break;
> +            }
> +        }
>      }
> 
> -    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
> -    if (ndisStatus == NDIS_STATUS_SUCCESS)
> -        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
> +    Text = "XENNET";
> 
> -    return ndisStatus;
> -}
> +    if (_stricmp(Product, Text) != 0)
> +        Match = FALSE;
> 
> -static FORCEINLINE NDIS_STATUS
> -__CopyBuffer(
> -    IN  PVOID   Destination,
> -    IN  ULONG   DestinationLength,
> -    IN  PVOID   Source,
> -    IN  ULONG   SourceLength,
> -    OUT PULONG  CopyLength
> -    )
> -{
> -    *CopyLength = __min(SourceLength, DestinationLength);
> -    RtlCopyMemory(Destination, Source, *CopyLength);
> +    return Match;
> 
> -    return (DestinationLength >= SourceLength) ?
> -           NDIS_STATUS_SUCCESS :
> -           NDIS_STATUS_BUFFER_TOO_SHORT;
> -}
> +fail2:
> +    Error("fail2\n");
> 
> -static FORCEINLINE NDIS_STATUS
> -__SetUlong(
> -    IN  PVOID   Destination,
> -    IN  ULONG   DestinationLength,
> -    IN  ULONG   Source,
> -    OUT PULONG  CopyLength
> -    )
> -{
> -    return __CopyBuffer(Destination,
> -                        DestinationLength & ~3,
> -                        &Source,
> -                        sizeof (ULONG),
> -                        CopyLength);
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return FALSE;
>  }
> 
> -static FORCEINLINE NDIS_STATUS
> -__SetUlong64(
> -    IN  PVOID   Destination,
> -    IN  ULONG   DestinationLength,
> -    IN  ULONG64 Source,
> -    OUT PULONG  CopyLength
> +static FORCEINLINE VOID
> +__AdapterClearDistribution(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    NDIS_STATUS ndisStatus;
> +    PCHAR               Buffer;
> +    PANSI_STRING        Distributions;
> +    ULONG               Index;
> +    NTSTATUS            status;
> 
> -    ndisStatus =  __CopyBuffer(Destination,
> -                               DestinationLength & ~3,
> -                               &Source,
> -                               sizeof (ULONG64),
> -                               CopyLength);
> -    if (DestinationLength >= 4)
> -        ndisStatus = NDIS_STATUS_SUCCESS;
> +    Trace("====>\n");
> 
> -    return ndisStatus;
> -}
> +    status = XENBUS_STORE(Directory,
> +                          &Adapter->StoreInterface,
> +                          NULL,
> +                          NULL,
> +                          "drivers",
> +                          &Buffer);
> +    if (NT_SUCCESS(status)) {
> +        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
> 
> -NDIS_STATUS
> -AdapterQueryInformation(
> -    IN  PXENNET_ADAPTER     Adapter,
> -    IN  PNDIS_OID_REQUEST   Request
> -    )
> -{
> -    PVOID                   Buffer;
> -    ULONG                   BufferLength;
> -    ULONG                   BytesNeeded;
> -    ULONG                   BytesWritten;
> -    ULONG                   Value32;
> -    ULONGLONG               Value64;
> -    ETHERNET_ADDRESS        EthernetAddress;
> -    BOOLEAN                 Warn;
> -    NDIS_STATUS             ndisStatus;
> +        XENBUS_STORE(Free,
> +                     &Adapter->StoreInterface,
> +                     Buffer);
> +    } else {
> +        Distributions = NULL;
> +    }
> 
> -    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
> -    BufferLength = Request-
> >DATA.QUERY_INFORMATION.InformationBufferLength;
> -    BytesNeeded = BytesWritten = 0;
> -    Warn = TRUE;
> -    ndisStatus = NDIS_STATUS_SUCCESS;
> +    if (Distributions == NULL)
> +        goto done;
> 
> -    switch (Request->DATA.QUERY_INFORMATION.Oid) {
> -    case OID_PNP_CAPABILITIES:
> -        BytesNeeded = sizeof(Adapter->Capabilities);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &Adapter->Capabilities,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
> +        PANSI_STRING    Distribution = &Distributions[Index];
> 
> -    case OID_PNP_QUERY_POWER:
> -        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> -        BytesWritten = 0;
> -        // do nothing
> -        break;
> +        status = XENBUS_STORE(Read,
> +                              &Adapter->StoreInterface,
> +                              NULL,
> +                              "drivers",
> +                              Distribution->Buffer,
> +                              &Buffer);
> +        if (!NT_SUCCESS(status))
> +            continue;
> 
> -    case OID_GEN_SUPPORTED_LIST:
> -        BytesNeeded = sizeof(XennetSupportedOids);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &XennetSupportedOids[0],
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +        if (__AdapterMatchDistribution(Adapter, Buffer))
> +            (VOID) XENBUS_STORE(Remove,
> +                                &Adapter->StoreInterface,
> +                                NULL,
> +                                "drivers",
> +                                Distribution->Buffer);
> 
> -    case OID_GEN_HARDWARE_STATUS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                NdisHardwareStatusReady,
> -                                &BytesWritten);
> -        break;
> +        XENBUS_STORE(Free,
> +                     &Adapter->StoreInterface,
> +                     Buffer);
> +    }
> 
> -    case OID_GEN_MEDIA_SUPPORTED:
> -    case OID_GEN_MEDIA_IN_USE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                XENNET_MEDIA_TYPE,
> -                                &BytesWritten);
> -        break;
> +    __AdapterFreeAnsi(Distributions);
> 
> -    case OID_GEN_MAXIMUM_LOOKAHEAD:
> -    case OID_GEN_TRANSMIT_BLOCK_SIZE:
> -    case OID_GEN_RECEIVE_BLOCK_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->MaximumFrameSize,
> -                                &BytesWritten);
> -        break;
> +done:
> +    Trace("<====\n");
> +}
> 
> -    case OID_GEN_TRANSMIT_BUFFER_SPACE:
> -    case OID_GEN_RECEIVE_BUFFER_SPACE:
> -        XENVIF_VIF(TransmitterQueryRingSize,
> -                    &Adapter->VifInterface,
> -                    (PULONG)&Value32);
> -        Value32 *= Adapter->MaximumFrameSize;
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +#define MAXIMUM_INDEX   255
> 
> -    case OID_GEN_VENDOR_DESCRIPTION:
> -        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  VENDOR_NAME_STR,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +static FORCEINLINE NTSTATUS
> +__AdapterSetDistribution(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    ULONG               Index;
> +    CHAR                Distribution[MAXNAMELEN];
> +    CHAR                Vendor[MAXNAMELEN];
> +    const CHAR          *Product;
> +    NTSTATUS            status;
> 
> -    case OID_GEN_VENDOR_DRIVER_VERSION:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
> -                                &BytesWritten);
> -        break;
> +    Trace("====>\n");
> 
> -    case OID_GEN_DRIVER_VERSION:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (6 << 8) | 0, // NDIS 6.0
> -                                &BytesWritten);
> -        break;
> +    Index = 0;
> +    while (Index <= MAXIMUM_INDEX) {
> +        PCHAR   Buffer;
> 
> -    case OID_GEN_MAC_OPTIONS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                XENNET_MAC_OPTIONS,
> -                                &BytesWritten);
> -        break;
> +        status = RtlStringCbPrintfA(Distribution,
> +                                    MAXNAMELEN,
> +                                    "%u",
> +                                    Index);
> +        ASSERT(NT_SUCCESS(status));
> 
> -    case OID_GEN_STATISTICS:
> -        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
> -        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
> -                                                   (PNDIS_STATISTICS_INFO)Buffer,
> -                                                   BufferLength,
> -                                                   &BytesWritten);
> -        break;
> +        status = XENBUS_STORE(Read,
> +                              &Adapter->StoreInterface,
> +                              NULL,
> +                              "drivers",
> +                              Distribution,
> +                              &Buffer);
> +        if (!NT_SUCCESS(status)) {
> +            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
> +                goto update;
> 
> -    case OID_802_3_MULTICAST_LIST:
> -        ndisStatus = AdapterQueryMulticastList(Adapter,
> -                                               Buffer,
> -                                               BufferLength,
> -                                               &BytesNeeded,
> -                                               &BytesWritten);
> -        break;
> +            goto fail1;
> +        }
> 
> -    case OID_802_3_PERMANENT_ADDRESS:
> -        XENVIF_VIF(MacQueryPermanentAddress,
> -                    &Adapter->VifInterface,
> -                    &EthernetAddress);
> -        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &EthernetAddress,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +        XENBUS_STORE(Free,
> +                     &Adapter->StoreInterface,
> +                     Buffer);
> 
> -    case OID_802_3_CURRENT_ADDRESS:
> -        XENVIF_VIF(MacQueryCurrentAddress,
> -                    &Adapter->VifInterface,
> -                    &EthernetAddress);
> -        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &EthernetAddress,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +        Index++;
> +    }
> 
> -    case OID_GEN_MAXIMUM_FRAME_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->MaximumFrameSize -
> -                                    sizeof(ETHERNET_TAGGED_HEADER),
> -                                &BytesWritten);
> -        break;
> +    status = STATUS_UNSUCCESSFUL;
> +    goto fail2;
> 
> -    case OID_GEN_MAXIMUM_TOTAL_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->MaximumFrameSize -
> -                                    sizeof(ETHERNET_TAGGED_HEADER) +
> -                                    sizeof (ETHERNET_UNTAGGED_HEADER),
> -                                &BytesWritten);
> -        break;
> +update:
> +    status = RtlStringCbPrintfA(Vendor,
> +                                MAXNAMELEN,
> +                                "%s",
> +                                VENDOR_NAME_STR);
> +    ASSERT(NT_SUCCESS(status));
> 
> -    case OID_GEN_CURRENT_LOOKAHEAD:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->CurrentLookahead,
> -                                &BytesWritten);
> -        break;
> +    for (Index  = 0; Vendor[Index] != '\0'; Index++)
> +        if (!isalnum((UCHAR)Vendor[Index]))
> +            Vendor[Index] = '_';
> 
> -    case OID_GEN_VENDOR_ID:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                0x5853,
> -                                &BytesWritten);
> -        break;
> +    Product = "XENNET";
> 
> -    case OID_GEN_LINK_SPEED:
> -        XENVIF_VIF(MacQueryState,
> -                   &Adapter->VifInterface,
> -                   NULL,
> -                   &Value64,
> -                   NULL);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)(Value64 / 100),
> -                                &BytesWritten);
> -        break;
> +#if DBG
> +#define ATTRIBUTES   "(DEBUG)"
> +#else
> +#define ATTRIBUTES   ""
> +#endif
> 
> -    case OID_GEN_MEDIA_CONNECT_STATUS:
> -        XENVIF_VIF(MacQueryState,
> -                    &Adapter->VifInterface,
> -                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
> -                    NULL,
> -                    NULL);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +    (VOID) XENBUS_STORE(Printf,
> +                        &Adapter->StoreInterface,
> +                        NULL,
> +                        "drivers",
> +                        Distribution,
> +                        "%s %s %u.%u.%u %s",
> +                        Vendor,
> +                        Product,
> +                        MAJOR_VERSION,
> +                        MINOR_VERSION,
> +                        MICRO_VERSION,
> +                        ATTRIBUTES
> +                        );
> 
> -    case OID_GEN_MAXIMUM_SEND_PACKETS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                16,
> -                                &BytesWritten);
> -        break;
> +#undef  ATTRIBUTES
> 
> -    case OID_GEN_CURRENT_PACKET_FILTER:
> -        AdapterGetPacketFilter(Adapter, &Value32);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +    Trace("<====\n");
> +    return STATUS_SUCCESS;
> 
> -    case OID_GEN_XMIT_OK:
> -        AdapterGetXmitOk(Adapter, &Value64);
> -        BytesNeeded = sizeof(ULONG64);
> -        ndisStatus = __SetUlong64(Buffer,
> -                                  BufferLength,
> -                                  Value64,
> -                                  &BytesWritten);
> -        break;
> +fail2:
> +    Error("fail2\n");
> 
> -    case OID_GEN_RCV_OK:
> -        AdapterGetRcvOk(Adapter, &Value64);
> -        BytesNeeded = sizeof(ULONG64);
> -        ndisStatus = __SetUlong64(Buffer,
> -                                  BufferLength,
> -                                  Value64,
> -                                  &BytesWritten);
> -        break;
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> 
> -    case OID_GEN_XMIT_ERROR:
> -        AdapterGetXmitError(Adapter, &Value32);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +    return status;
> +}
> 
> -    case OID_GEN_RCV_ERROR:
> -        AdapterGetRcvError(Adapter, &Value32);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +static DECLSPEC_NOINLINE VOID
> +AdapterSuspendCallbackLate(
> +    IN  PVOID       Argument
> +    )
> +{
> +    PXENNET_ADAPTER Adapter = Argument;
> 
> -    case OID_GEN_RCV_NO_BUFFER:
> -    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
> -    case OID_GEN_RCV_CRC_ERROR:
> -    case OID_802_3_RCV_ERROR_ALIGNMENT:
> -    case OID_802_3_XMIT_ONE_COLLISION:
> -    case OID_802_3_XMIT_MORE_COLLISIONS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                0,
> -                                &BytesWritten);
> -        break;
> +    (VOID) __AdapterSetDistribution(Adapter);
> +}
> 
> -    case OID_802_3_MAXIMUM_LIST_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                32,
> -                                &BytesWritten);
> -        break;
> +static NTSTATUS
> +AdapterSetDistribution(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    LONG                Count;
> +    NTSTATUS            status;
> 
> -    case OID_GEN_DIRECTED_BYTES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    Trace("====>\n");
> 
> -    case OID_GEN_DIRECTED_FRAMES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    Count = InterlockedIncrement(&AdapterCount);
> +    ASSERT(Count != 0);
> 
> -    case OID_GEN_MULTICAST_BYTES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    if (Count != 1)
> +        goto done;
> 
> -    case OID_GEN_MULTICAST_FRAMES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    status = __AdapterSetDistribution(Adapter);
> +    if (!NT_SUCCESS(status))
> +        goto fail1;
> +
> +    status = XENBUS_SUSPEND(Register,
> +                            &Adapter->SuspendInterface,
> +                            SUSPEND_CALLBACK_LATE,
> +                            AdapterSuspendCallbackLate,
> +                            Adapter,
> +                            &Adapter->SuspendCallbackLate);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +done:
> +    Trace("<====\n");
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    Error("fail2\n");
> +
> +    __AdapterClearDistribution(Adapter);
> +
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return status;
> +}
> +
> +static VOID
> +AdapterClearDistribution(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    LONG                Count;
> +
> +    Trace("====>\n");
> +
> +    Count = InterlockedDecrement(&AdapterCount);
> +
> +    if (Count != 0)
> +        goto done;
> +
> +    XENBUS_SUSPEND(Deregister,
> +                   &Adapter->SuspendInterface,
> +                   Adapter->SuspendCallbackLate);
> +    Adapter->SuspendCallbackLate = NULL;
> +
> +    __AdapterClearDistribution(Adapter);
> +
> +done:
> +    Trace("<====\n");
> +}
> +
> +NDIS_STATUS
> +AdapterEnable(
> +    IN  PXENNET_ADAPTER     Adapter
> +    )
> +{
> +    NTSTATUS                status;
> +    NDIS_STATUS             ndisStatus;
> +
> +    ASSERT(!Adapter->Enabled);
> +
> +    status = XENBUS_CACHE(Acquire,
> +                          &Adapter->CacheInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail1;
> +
> +    status = XENBUS_STORE(Acquire,
> +                          &Adapter->StoreInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = XENBUS_SUSPEND(Acquire,
> +                            &Adapter->SuspendInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    (VOID) AdapterSetDistribution(Adapter);
> +
> +    ndisStatus = TransmitterEnable(Adapter->Transmitter);
> +    if (ndisStatus != NDIS_STATUS_SUCCESS)
> +        goto fail4;
> +
> +    ndisStatus = ReceiverEnable(Adapter->Receiver);
> +    if (ndisStatus != NDIS_STATUS_SUCCESS)
> +        goto fail5;
> +
> +    status = XENVIF_VIF(Enable,
> +                        &Adapter->VifInterface,
> +                        AdapterVifCallback,
> +                        Adapter);
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    AdapterMediaStateChange(Adapter);
> +
> +    Adapter->Enabled = TRUE;
> +
> +    return NDIS_STATUS_SUCCESS;
> +
> +fail6:
> +    ReceiverDisable(Adapter->Receiver);
> +
> +fail5:
> +    TransmitterDisable(Adapter->Transmitter);
> +
> +fail4:
> +    AdapterClearDistribution(Adapter);
> +
> +    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
> +
> +fail3:
> +    XENBUS_STORE(Release, &Adapter->StoreInterface);
> +
> +fail2:
> +    XENBUS_CACHE(Release, &Adapter->CacheInterface);
> +
> +fail1:
> +    return NDIS_STATUS_FAILURE;
> +}
> 
> -    case OID_GEN_BROADCAST_BYTES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +VOID
> +AdapterDisable(
> +    IN  PXENNET_ADAPTER     Adapter
> +    )
> +{
> +    ASSERT(Adapter->Enabled);
> +    Adapter->Enabled = FALSE;
> 
> -    case OID_GEN_BROADCAST_FRAMES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    XENVIF_VIF(Disable,
> +               &Adapter->VifInterface);
> 
> -    case OID_GEN_DIRECTED_BYTES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_UNICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    AdapterMediaStateChange(Adapter);
> 
> -    case OID_GEN_DIRECTED_FRAMES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_UNICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    ReceiverDisable(Adapter->Receiver);
> +    TransmitterDisable(Adapter->Transmitter);
> 
> -    case OID_GEN_MULTICAST_BYTES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_MULTICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    AdapterClearDistribution(Adapter);
> 
> -    case OID_GEN_MULTICAST_FRAMES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_MULTICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
> +    XENBUS_STORE(Release, &Adapter->StoreInterface);
> +    XENBUS_CACHE(Release, &Adapter->CacheInterface);
> +}
> 
> -    case OID_GEN_BROADCAST_BYTES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_BROADCAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +VOID
> +AdapterMediaStateChange(
> +    IN  PXENNET_ADAPTER     Adapter
> +    )
> +{
> +    NDIS_LINK_STATE         LinkState;
> +    NDIS_STATUS_INDICATION  StatusIndication;
> 
> -    case OID_GEN_BROADCAST_FRAMES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_BROADCAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
> +    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
> +    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
> +    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
> 
> -    case OID_GEN_INTERRUPT_MODERATION:
> -        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
> -        ndisStatus = AdapterInterruptModeration(Adapter,
> -
> (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
> -                                                BufferLength,
> -                                                &BytesWritten);
> -        break;
> +    XENVIF_VIF(MacQueryState,
> +               &Adapter->VifInterface,
> +               &LinkState.MediaConnectState,
> +               &LinkState.RcvLinkSpeed,
> +               &LinkState.MediaDuplexState);
> 
> -    case OID_IP4_OFFLOAD_STATS:
> -    case OID_IP6_OFFLOAD_STATS:
> -    case OID_GEN_SUPPORTED_GUIDS:
> -        // We don't handle these since NDIS 6.0 is supposed to do this for us
> -    case OID_GEN_MAC_ADDRESS:
> -    case OID_GEN_MAX_LINK_SPEED:
> -        // ignore these common unwanted OIDs
> -	case OID_GEN_INIT_TIME_MS:
> -	case OID_GEN_RESET_COUNTS:
> -	case OID_GEN_MEDIA_SENSE_COUNTS:
> -        Warn = FALSE;
> -        /*FALLTHRU*/
> -    default:
> -        if (Warn)
> -            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> +    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
> +        Info("LINK: STATE UNKNOWN\n");
> +    } else if (LinkState.MediaConnectState ==
> MediaConnectStateDisconnected) {
> +        Info("LINK: DOWN\n");
> +    } else {
> +        ASSERT3U(LinkState.MediaConnectState, ==,
> MediaConnectStateConnected);
> 
> -        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> -        break;
> +        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
> +            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n",
> LinkState.RcvLinkSpeed);
> +        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
> +            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n",
> LinkState.RcvLinkSpeed);
> +        else
> +            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n",
> LinkState.RcvLinkSpeed);
>      }
> 
> -    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
> -    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
> +    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
> 
> -    return ndisStatus;
> +    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
> +    StatusIndication.Header.Type =
> NDIS_OBJECT_TYPE_STATUS_INDICATION;
> +    StatusIndication.Header.Revision =
> NDIS_STATUS_INDICATION_REVISION_1;
> +    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
> +
> +    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
> +    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
> +    StatusIndication.StatusBuffer = &LinkState;
> +    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
> +
> +    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle,
> &StatusIndication);
>  }
> 
> -static NTSTATUS
> -__QueryInterface(
> -    IN  PDEVICE_OBJECT  DeviceObject,
> -    IN  const GUID      *Guid,
> -    IN  ULONG           Version,
> -    OUT PINTERFACE      Interface,
> -    IN  ULONG           Size,
> -    IN  BOOLEAN         Optional
> +NDIS_STATUS
> +AdapterSetInformation(
> +    IN  PXENNET_ADAPTER     Adapter,
> +    IN  PNDIS_OID_REQUEST   Request
>      )
>  {
> -    KEVENT              Event;
> -    IO_STATUS_BLOCK     StatusBlock;
> -    PIRP                Irp;
> -    PIO_STACK_LOCATION  StackLocation;
> -    NTSTATUS            status;
> +    PVOID                   Buffer;
> +    ULONG                   BufferLength;
> +    ULONG                   BytesNeeded;
> +    ULONG                   BytesRead;
> +    BOOLEAN                 Warn;
> +    NDIS_STATUS             ndisStatus;
> 
> -    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
> +    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
> +    BufferLength = Request-
> >DATA.SET_INFORMATION.InformationBufferLength;
> +    BytesNeeded = BytesRead = 0;
> +    Warn = TRUE;
> +    ndisStatus = NDIS_STATUS_SUCCESS;
> 
> -    KeInitializeEvent(&Event, NotificationEvent, FALSE);
> -    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
> +    switch (Request->DATA.SET_INFORMATION.Oid) {
> +    case OID_PNP_SET_POWER:
> +        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> +        if (BufferLength >= BytesNeeded) {
> +            PNDIS_DEVICE_POWER_STATE PowerState;
> 
> -    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
> -                                       DeviceObject,
> -                                       NULL,
> -                                       0,
> -                                       NULL,
> -                                       &Event,
> -                                       &StatusBlock);
> +            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
> +            switch (*PowerState) {
> +            case NdisDeviceStateD0:
> +                Info("SET_POWER: D0\n");
> +                break;
> 
> -    status = STATUS_UNSUCCESSFUL;
> -    if (Irp == NULL)
> -        goto fail1;
> +            case NdisDeviceStateD1:
> +                Info("SET_POWER: D1\n");
> +                break;
> 
> -    StackLocation = IoGetNextIrpStackLocation(Irp);
> -    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
> +            case NdisDeviceStateD2:
> +                Info("SET_POWER: D2\n");
> +                break;
> 
> -    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
> -    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
> -    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
> -    StackLocation->Parameters.QueryInterface.Interface = Interface;
> +            case NdisDeviceStateD3:
> +                Info("SET_POWER: D3\n");
> +                break;
> +            }
> +        }
> +        // do nothing
> +        break;
> 
> -    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
> +    case OID_GEN_CURRENT_LOOKAHEAD:
> +        BytesNeeded = sizeof(ULONG);
> +        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
> +        if (BufferLength == BytesNeeded) {
> +            Adapter->CurrentLookahead = *(PULONG)Buffer;
> +            BytesRead = sizeof(ULONG);
> +        }
> +        break;
> 
> -    status = IoCallDriver(DeviceObject, Irp);
> -    if (status == STATUS_PENDING) {
> -        (VOID) KeWaitForSingleObject(&Event,
> -                                     Executive,
> -                                     KernelMode,
> -                                     FALSE,
> -                                     NULL);
> -        status = StatusBlock.Status;
> -    }
> +    case OID_GEN_CURRENT_PACKET_FILTER:
> +        BytesNeeded = sizeof(ULONG);
> +        if (BufferLength == BytesNeeded) {
> +            ndisStatus = AdapterSetPacketFilter(Adapter,
> +                                                (PULONG)Buffer);
> +            BytesRead = sizeof(ULONG);
> +        }
> +        break;
> 
> -    if (!NT_SUCCESS(status)) {
> -        if (status == STATUS_NOT_SUPPORTED && Optional)
> -            goto done;
> +    case OID_802_3_MULTICAST_LIST:
> +        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
> +        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
> +            ndisStatus = AdapterSetMulticastAddresses(Adapter,
> +                                                      Buffer,
> +                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = BufferLength;
> +        } else {
> +            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
> +        }
> +        break;
> 
> -        goto fail2;
> -    }
> +    case OID_OFFLOAD_ENCAPSULATION:
> +        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> +        if (BufferLength >= BytesNeeded) {
> +            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
> +                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> +        }
> +        break;
> 
> -done:
> -    return STATUS_SUCCESS;
> +    case OID_TCP_OFFLOAD_PARAMETERS:
> +        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
> +        if (BufferLength >= BytesNeeded) {
> +            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
> +                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
> +        }
> +        break;
> 
> -fail2:
> -    Error("fail2\n");
> +    case OID_GEN_HD_SPLIT_PARAMETERS:
> +        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> +        if (BufferLength >= BytesNeeded) {
> +            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
> +                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> +        }
> +        break;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    case OID_GEN_INTERRUPT_MODERATION:
> +    case OID_GEN_MACHINE_NAME:
> +        Warn = FALSE;
> +        /*FALLTHRU*/
> +    default:
> +        if (Warn)
> +            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> 
> -    return status;
> -}
> +        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> +        break;
> +    }
> 
> -#pragma prefast(push)
> -#pragma prefast(disable:6102)
> +    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
> +    if (ndisStatus == NDIS_STATUS_SUCCESS)
> +        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
> 
> -#define READ_PROPERTY(field, name, defaultval, handle)  \
> -    do {                                                \
> -        NDIS_STATUS                     _Status;        \
> -        NDIS_STRING                     _Value;         \
> -        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
> -        RtlInitUnicodeString(&_Value, name);            \
> -        NdisReadConfiguration(&_Status, &_Data, handle, \
> -                        &_Value, NdisParameterInteger); \
> -        if (_Status == NDIS_STATUS_SUCCESS)             \
> -            field = _Data->ParameterData.IntegerData;   \
> -        else                                            \
> -            field = defaultval;                         \
> -    } while (FALSE);
> +    return ndisStatus;
> +}
> 
> -static NDIS_STATUS
> -AdapterGetAdvancedSettings(
> -    IN  PXENNET_ADAPTER Adapter
> +static FORCEINLINE NDIS_STATUS
> +__CopyBuffer(
> +    IN  PVOID   Destination,
> +    IN  ULONG   DestinationLength,
> +    IN  PVOID   Source,
> +    IN  ULONG   SourceLength,
> +    OUT PULONG  CopyLength
>      )
>  {
> -    NDIS_CONFIGURATION_OBJECT   Config;
> -    NDIS_HANDLE                 Handle;
> -    NDIS_STATUS                 ndisStatus;
> -
> -    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
> -    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
> -    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
> -    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
> -    Config.NdisHandle = Adapter->NdisAdapterHandle;
> -    Config.Flags = 0;
> -
> -    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
> -    if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail1;
> -
> -    READ_PROPERTY(Adapter->Properties.ipv4_csum,
> L"*IPChecksumOffloadIPv4", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.tcpv4_csum,
> L"*TCPChecksumOffloadIPv4", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.udpv4_csum,
> L"*UDPChecksumOffloadIPv4", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.tcpv6_csum,
> L"*TCPChecksumOffloadIPv6", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.udpv6_csum,
> L"*UDPChecksumOffloadIPv6", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.need_csum_value,
> L"NeedChecksumValue", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.HeaderDataSplit,
> L"*HeaderDataSplit", 1, Handle);
> -
> -    NdisCloseConfiguration(Handle);
> -
> -    return NDIS_STATUS_SUCCESS;
> +    *CopyLength = __min(SourceLength, DestinationLength);
> +    RtlCopyMemory(Destination, Source, *CopyLength);
> 
> -fail1:
> -    return NDIS_STATUS_FAILURE;
> +    return (DestinationLength >= SourceLength) ?
> +           NDIS_STATUS_SUCCESS :
> +           NDIS_STATUS_BUFFER_TOO_SHORT;
>  }
> 
> -#undef READ_PROPERTY
> -
> -#pragma prefast(pop)
> -
> -static NDIS_STATUS
> -AdapterSetRegistrationAttributes(
> -    IN  PXENNET_ADAPTER Adapter
> +static FORCEINLINE NDIS_STATUS
> +__SetUlong(
> +    IN  PVOID   Destination,
> +    IN  ULONG   DestinationLength,
> +    IN  ULONG   Source,
> +    OUT PULONG  CopyLength
>      )
>  {
> -    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
> -    NDIS_STATUS                                     ndisStatus;
> +    return __CopyBuffer(Destination,
> +                        DestinationLength & ~3,
> +                        &Source,
> +                        sizeof (ULONG),
> +                        CopyLength);
> +}
> 
> -    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
> -    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
> -    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
> -                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
> -    Attribs.CheckForHangTimeInSeconds = 0;
> -    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
> +static FORCEINLINE NDIS_STATUS
> +__SetUlong64(
> +    IN  PVOID   Destination,
> +    IN  ULONG   DestinationLength,
> +    IN  ULONG64 Source,
> +    OUT PULONG  CopyLength
> +    )
> +{
> +    NDIS_STATUS ndisStatus;
> 
> -    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    ndisStatus =  __CopyBuffer(Destination,
> +                               DestinationLength & ~3,
> +                               &Source,
> +                               sizeof (ULONG64),
> +                               CopyLength);
> +    if (DestinationLength >= 4)
> +        ndisStatus = NDIS_STATUS_SUCCESS;
> 
>      return ndisStatus;
>  }
> 
> -static NDIS_STATUS
> -AdapterSetGeneralAttributes(
> -    IN  PXENNET_ADAPTER Adapter
> +NDIS_STATUS
> +AdapterQueryInformation(
> +    IN  PXENNET_ADAPTER     Adapter,
> +    IN  PNDIS_OID_REQUEST   Request
>      )
>  {
> -    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
> -    NDIS_STATUS                                 ndisStatus;
> -
> -    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
> -    Attribs.MediaType = XENNET_MEDIA_TYPE;
> -
> -    XENVIF_VIF(MacQueryMaximumFrameSize,
> -               &Adapter->VifInterface,
> -               (PULONG)&Adapter->MaximumFrameSize);
> -
> -    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof
> (ETHERNET_TAGGED_HEADER);
> -    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.MediaConnectState = MediaConnectStateConnected;
> -    Attribs.MediaDuplexState = MediaDuplexStateFull;
> -    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
> -    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
> -    Attribs.MacOptions = XENNET_MAC_OPTIONS;
> -    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
> -    Attribs.MaxMulticastListSize = 32;
> -    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
> -
> -    XENVIF_VIF(MacQueryPermanentAddress,
> -               &Adapter->VifInterface,
> -               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
> -    XENVIF_VIF(MacQueryCurrentAddress,
> -               &Adapter->VifInterface,
> -               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
> +    PVOID                   Buffer;
> +    ULONG                   BufferLength;
> +    ULONG                   BytesNeeded;
> +    ULONG                   BytesWritten;
> +    ULONG                   Value32;
> +    ULONGLONG               Value64;
> +    ETHERNET_ADDRESS        EthernetAddress;
> +    BOOLEAN                 Warn;
> +    NDIS_STATUS             ndisStatus;
> 
> -    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
> -    Attribs.RecvScaleCapabilities = NULL;
> -    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
> -    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
> -    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
> -    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
> -    Attribs.IfConnectorPresent = TRUE;
> -    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
> -                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
> -
> NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED
> |
> -
> NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
> -                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED
> |
> -                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED
> |
> -                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
> -
> -    Attribs.SupportedOidList = XennetSupportedOids;
> -    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
> +    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
> +    BufferLength = Request-
> >DATA.QUERY_INFORMATION.InformationBufferLength;
> +    BytesNeeded = BytesWritten = 0;
> +    Warn = TRUE;
> +    ndisStatus = NDIS_STATUS_SUCCESS;
> 
> -    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    switch (Request->DATA.QUERY_INFORMATION.Oid) {
> +    case OID_PNP_CAPABILITIES:
> +        BytesNeeded = sizeof(Adapter->Capabilities);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &Adapter->Capabilities,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    return ndisStatus;
> -}
> +    case OID_PNP_QUERY_POWER:
> +        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> 
> -static NDIS_STATUS
> -AdapterSetOffloadAttributes(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
> -    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
> -    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
> -    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
> -    NDIS_OFFLOAD                                Default;
> -    NDIS_OFFLOAD                                Supported;
> -    NDIS_STATUS                                 ndisStatus;
> +        if (BufferLength >= BytesNeeded) {
> +            PNDIS_DEVICE_POWER_STATE PowerState;
> 
> -    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
> -    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
> +            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
> +            switch (*PowerState) {
> +            case NdisDeviceStateD0:
> +                Info("QUERY_POWER: D0\n");
> +                break;
> 
> -    TxOptions->Value = 0;
> -    TxOptions->OffloadTagManipulation = 1;
> +            case NdisDeviceStateD1:
> +                Info("QUERY_POWER: D1\n");
> +                break;
> 
> -    RxOptions->Value = 0;
> -    RxOptions->OffloadTagManipulation = 1;
> +            case NdisDeviceStateD2:
> +                Info("QUERY_POWER: D2\n");
> +                break;
> 
> -    if (Adapter->Properties.need_csum_value)
> -        RxOptions->NeedChecksumValue = 1;
> +            case NdisDeviceStateD3:
> +                Info("QUERY_POWER: D3\n");
> +                break;
> +            }
> +        }
> 
> -    if (Adapter->Properties.lrov4) {
> -        RxOptions->OffloadIpVersion4LargePacket = 1;
> -        RxOptions->NeedLargePacketSplit = 1;
> -    }
> +        BytesWritten = 0;
> +        // do nothing
> +        break;
> 
> -    if (Adapter->Properties.lrov6) {
> -        RxOptions->OffloadIpVersion6LargePacket = 1;
> -        RxOptions->NeedLargePacketSplit = 1;
> -    }
> +    case OID_GEN_SUPPORTED_LIST:
> +        BytesNeeded = sizeof(XennetSupportedOids);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &XennetSupportedOids[0],
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    XENVIF_VIF(ReceiverSetOffloadOptions,
> -               &Adapter->VifInterface,
> -               *RxOptions);
> +    case OID_GEN_HARDWARE_STATUS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                NdisHardwareStatusReady,
> +                                &BytesWritten);
> +        break;
> 
> -    XENVIF_VIF(TransmitterQueryOffloadOptions,
> -               &Adapter->VifInterface,
> -               &Options);
> +    case OID_GEN_MEDIA_SUPPORTED:
> +    case OID_GEN_MEDIA_IN_USE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                XENNET_MEDIA_TYPE,
> +                                &BytesWritten);
> +        break;
> 
> -    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
> -    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
> -    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
> -    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
> +    case OID_GEN_MAXIMUM_LOOKAHEAD:
> +    case OID_GEN_TRANSMIT_BLOCK_SIZE:
> +    case OID_GEN_RECEIVE_BLOCK_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->MaximumFrameSize,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_GEN_TRANSMIT_BUFFER_SPACE:
> +    case OID_GEN_RECEIVE_BUFFER_SPACE:
> +        XENVIF_VIF(TransmitterQueryRingSize,
> +                    &Adapter->VifInterface,
> +                    (PULONG)&Value32);
> +        Value32 *= Adapter->MaximumFrameSize;
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.IpChecksum = 1;
> -    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
> +    case OID_GEN_VENDOR_DESCRIPTION:
> +        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  VENDOR_NAME_STR,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
> -    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
> +    case OID_GEN_VENDOR_DRIVER_VERSION:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
> +    case OID_GEN_DRIVER_VERSION:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (6 << 8) | 0, // NDIS 6.0
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_GEN_MAC_OPTIONS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                XENNET_MAC_OPTIONS,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
> +    case OID_GEN_STATISTICS:
> +        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
> +        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
> +                                                   (PNDIS_STATISTICS_INFO)Buffer,
> +                                                   BufferLength,
> +                                                   &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
> -    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
> +    case OID_802_3_MULTICAST_LIST:
> +        ndisStatus = AdapterQueryMulticastList(Adapter,
> +                                               Buffer,
> +                                               BufferLength,
> +                                               &BytesNeeded,
> +                                               &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
> +    case OID_802_3_PERMANENT_ADDRESS:
> +        XENVIF_VIF(MacQueryPermanentAddress,
> +                    &Adapter->VifInterface,
> +                    &EthernetAddress);
> +        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &EthernetAddress,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_802_3_CURRENT_ADDRESS:
> +        XENVIF_VIF(MacQueryCurrentAddress,
> +                    &Adapter->VifInterface,
> +                    &EthernetAddress);
> +        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &EthernetAddress,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MAXIMUM_FRAME_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->MaximumFrameSize -
> +                                    sizeof(ETHERNET_TAGGED_HEADER),
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MAXIMUM_TOTAL_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->MaximumFrameSize -
> +                                    sizeof(ETHERNET_TAGGED_HEADER) +
> +                                    sizeof (ETHERNET_UNTAGGED_HEADER),
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_CURRENT_LOOKAHEAD:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->CurrentLookahead,
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_VENDOR_ID:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                0x5853,
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_LINK_SPEED:
> +        XENVIF_VIF(MacQueryState,
> +                   &Adapter->VifInterface,
> +                   NULL,
> +                   &Value64,
> +                   NULL);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)(Value64 / 100),
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MEDIA_CONNECT_STATUS:
> +        XENVIF_VIF(MacQueryState,
> +                    &Adapter->VifInterface,
> +                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
> +                    NULL,
> +                    NULL);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MAXIMUM_SEND_PACKETS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                16,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4HeaderChecksum) {
> -        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
> -        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
> -    }
> +    case OID_GEN_CURRENT_PACKET_FILTER:
> +        AdapterGetPacketFilter(Adapter, &Value32);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4TcpChecksum) {
> -        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
> -        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
> -    }
> +    case OID_GEN_XMIT_OK:
> +        AdapterGetXmitOk(Adapter, &Value64);
> +        BytesNeeded = sizeof(ULONG64);
> +        ndisStatus = __SetUlong64(Buffer,
> +                                  BufferLength,
> +                                  Value64,
> +                                  &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4UdpChecksum)
> -        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
> +    case OID_GEN_RCV_OK:
> +        AdapterGetRcvOk(Adapter, &Value64);
> +        BytesNeeded = sizeof(ULONG64);
> +        ndisStatus = __SetUlong64(Buffer,
> +                                  BufferLength,
> +                                  Value64,
> +                                  &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_GEN_XMIT_ERROR:
> +        AdapterGetXmitError(Adapter, &Value32);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
> +    case OID_GEN_RCV_ERROR:
> +        AdapterGetRcvError(Adapter, &Value32);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion6TcpChecksum) {
> -        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
> -        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
> -    }
> +    case OID_GEN_RCV_NO_BUFFER:
> +    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
> +    case OID_GEN_RCV_CRC_ERROR:
> +    case OID_802_3_RCV_ERROR_ALIGNMENT:
> +    case OID_802_3_XMIT_ONE_COLLISION:
> +    case OID_802_3_XMIT_MORE_COLLISIONS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                0,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion6UdpChecksum)
> -        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
> +    case OID_802_3_MAXIMUM_LIST_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                32,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4LargePacket) {
> -        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +    case OID_GEN_DIRECTED_BYTES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
>                     &Adapter->VifInterface,
> -                   4,
> -                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
> -        Supported.LsoV2.IPv4.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> -        Supported.LsoV2.IPv4.MinSegmentCount = 2;
> -    }
> +                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion6LargePacket) {
> -        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +    case OID_GEN_DIRECTED_FRAMES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
>                     &Adapter->VifInterface,
> -                   6,
> -                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
> -        Supported.LsoV2.IPv6.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> -        Supported.LsoV2.IPv6.MinSegmentCount = 2;
> -        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
> -        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
> -    }
> -
> -    Default = Supported;
> +                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.ipv4_csum & 2))
> -        Default.Checksum.IPv4Receive.IpChecksum = 0;
> +    case OID_GEN_MULTICAST_BYTES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv4_csum & 2))
> -        Default.Checksum.IPv4Receive.TcpChecksum = 0;
> +    case OID_GEN_MULTICAST_FRAMES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv4_csum & 2))
> -        Default.Checksum.IPv4Receive.UdpChecksum = 0;
> +    case OID_GEN_BROADCAST_BYTES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv6_csum & 2))
> -        Default.Checksum.IPv6Receive.TcpChecksum = 0;
> +    case OID_GEN_BROADCAST_FRAMES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv6_csum & 2))
> -        Default.Checksum.IPv6Receive.UdpChecksum = 0;
> +    case OID_GEN_DIRECTED_BYTES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_UNICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.ipv4_csum & 1))
> -        Default.Checksum.IPv4Transmit.IpChecksum = 0;
> +    case OID_GEN_DIRECTED_FRAMES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_UNICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv4_csum & 1))
> -        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
> +    case OID_GEN_MULTICAST_BYTES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_MULTICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv4_csum & 1))
> -        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
> +    case OID_GEN_MULTICAST_FRAMES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_MULTICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv6_csum & 1))
> -        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
> +    case OID_GEN_BROADCAST_BYTES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_BROADCAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv6_csum & 1))
> -        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
> +    case OID_GEN_BROADCAST_FRAMES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_BROADCAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.lsov4)) {
> -        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
> -        Default.LsoV2.IPv4.MinSegmentCount = 0;
> -    }
> +    case OID_GEN_INTERRUPT_MODERATION:
> +        BytesNeeded =
> sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
> +        ndisStatus = AdapterInterruptModeration(Adapter,
> +
> (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
> +                                                BufferLength,
> +                                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.lsov6)) {
> -        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
> -        Default.LsoV2.IPv6.MinSegmentCount = 0;
> -    }
> +    case OID_IP4_OFFLOAD_STATS:
> +    case OID_IP6_OFFLOAD_STATS:
> +    case OID_GEN_SUPPORTED_GUIDS:
> +        // We don't handle these since NDIS 6.0 is supposed to do this for us
> +    case OID_GEN_MAC_ADDRESS:
> +    case OID_GEN_MAX_LINK_SPEED:
> +        // ignore these common unwanted OIDs
> +	case OID_GEN_INIT_TIME_MS:
> +	case OID_GEN_RESET_COUNTS:
> +	case OID_GEN_MEDIA_SENSE_COUNTS:
> +        Warn = FALSE;
> +        /*FALLTHRU*/
> +    default:
> +        if (Warn)
> +            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> 
> -    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof
> (NDIS_OFFLOAD))) {
> -        Adapter->Offload = Default;
> -        DISPLAY_OFFLOAD(Default);
> +        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> +        break;
>      }
> 
> -    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size = sizeof(Attribs);
> -    Attribs.DefaultOffloadConfiguration = &Default;
> -    Attribs.HardwareOffloadCapabilities = &Supported;
> +    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
> +    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
> 
> -    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
>      return ndisStatus;
>  }
> 
> -static NDIS_STATUS
> -AdapterSetHeaderDataSplitAttributes(
> -    IN  PXENNET_ADAPTER                                 Adapter
> +static NTSTATUS
> +__QueryInterface(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  const GUID      *Guid,
> +    IN  ULONG           Version,
> +    OUT PINTERFACE      Interface,
> +    IN  ULONG           Size,
> +    IN  BOOLEAN         Optional
>      )
>  {
> -    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
> -    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
> -    NDIS_STATUS                                         NdisStatus;
> -
> -    RtlZeroMemory(&Attribs, sizeof(Attribs));
> +    KEVENT              Event;
> +    IO_STATUS_BLOCK     StatusBlock;
> +    PIRP                Irp;
> +    PIO_STACK_LOCATION  StackLocation;
> +    NTSTATUS            status;
> 
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES
> ;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size =
> NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVI
> SION_1;
> +    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
> 
> -    RtlZeroMemory(&Split, sizeof(Split));
> +    KeInitializeEvent(&Event, NotificationEvent, FALSE);
> +    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
> 
> -    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
> -    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
> -    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
> -    Split.HardwareCapabilities =
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
> +    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
> +                                       DeviceObject,
> +                                       NULL,
> +                                       0,
> +                                       NULL,
> +                                       &Event,
> +                                       &StatusBlock);
> 
> -    if (Adapter->Properties.HeaderDataSplit != 0)
> -        Split.CurrentCapabilities = Split.HardwareCapabilities;
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Irp == NULL)
> +        goto fail1;
> 
> -    Attribs.HDSplitAttributes = &Split;
> +    StackLocation = IoGetNextIrpStackLocation(Irp);
> +    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
> 
> -    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> -    if (NdisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail1;
> +    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
> +    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
> +    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
> +    StackLocation->Parameters.QueryInterface.Interface = Interface;
> 
> -    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
> -        ASSERT(Split.CurrentCapabilities &
> NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
> +    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
> 
> -        Info("BackfillSize = %u\n", Split.BackfillSize);
> -        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
> +    status = IoCallDriver(DeviceObject, Irp);
> +    if (status == STATUS_PENDING) {
> +        (VOID) KeWaitForSingleObject(&Event,
> +                                     Executive,
> +                                     KernelMode,
> +                                     FALSE,
> +                                     NULL);
> +        status = StatusBlock.Status;
> +    }
> 
> -        XENVIF_VIF(ReceiverSetBackfillSize,
> -                   &Adapter->VifInterface,
> -                   Split.BackfillSize);
> +    if (!NT_SUCCESS(status)) {
> +        if (status == STATUS_NOT_SUPPORTED && Optional)
> +            goto done;
> 
> -        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
> +        goto fail2;
>      }
> 
> -    return NDIS_STATUS_SUCCESS;
> +done:
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    Error("fail2\n");
> 
>  fail1:
> -    Error("fail1 (%08x)\n", NdisStatus);
> +    Error("fail1 (%08x)\n", status);
> 
> -    return NdisStatus;
> +    return status;
>  }
> 
> -static FORCEINLINE PVOID
> -__AdapterAllocate(
> -    IN  ULONG   Length
> -    )
> -{
> -    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
> -}
> +#pragma prefast(push)
> +#pragma prefast(disable:6102)
> 
> -static FORCEINLINE VOID
> -__AdapterFree(
> -    IN  PVOID   Buffer
> -    )
> -{
> -    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
> -}
> +#define READ_PROPERTY(field, name, defaultval, handle)  \
> +    do {                                                \
> +        NDIS_STATUS                     _Status;        \
> +        NDIS_STRING                     _Value;         \
> +        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
> +        RtlInitUnicodeString(&_Value, name);            \
> +        NdisReadConfiguration(&_Status, &_Data, handle, \
> +                        &_Value, NdisParameterInteger); \
> +        if (_Status == NDIS_STATUS_SUCCESS)             \
> +            field = _Data->ParameterData.IntegerData;   \
> +        else                                            \
> +            field = defaultval;                         \
> +    } while (FALSE);
> 
> -static FORCEINLINE PANSI_STRING
> -__AdapterMultiSzToUpcaseAnsi(
> -    IN  PCHAR       Buffer
> +static NDIS_STATUS
> +AdapterGetAdvancedSettings(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    PANSI_STRING    Ansi;
> -    LONG            Index;
> -    LONG            Count;
> -    NTSTATUS        status;
> -
> -    Index = 0;
> -    Count = 0;
> -    for (;;) {
> -        if (Buffer[Index] == '\0') {
> -            Count++;
> -            Index++;
> -
> -            // Check for double NUL
> -            if (Buffer[Index] == '\0')
> -                break;
> -        } else {
> -            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
> -            Index++;
> -        }
> -    }
> +    NDIS_CONFIGURATION_OBJECT   Config;
> +    NDIS_HANDLE                 Handle;
> +    NDIS_STATUS                 ndisStatus;
> 
> -    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
> +    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
> +    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
> +    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
> +    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
> +    Config.NdisHandle = Adapter->NdisAdapterHandle;
> +    Config.Flags = 0;
> 
> -    status = STATUS_NO_MEMORY;
> -    if (Ansi == NULL)
> +    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
> +    if (ndisStatus != NDIS_STATUS_SUCCESS)
>          goto fail1;
> 
> -    for (Index = 0; Index < Count; Index++) {
> -        ULONG   Length;
> -
> -        Length = (ULONG)strlen(Buffer);
> -        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
> -        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
> -
> -        status = STATUS_NO_MEMORY;
> -        if (Ansi[Index].Buffer == NULL)
> -            goto fail2;
> -
> -        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
> -        Ansi[Index].Length = (USHORT)Length;
> -
> -        Buffer += Length + 1;
> -    }
> -
> -    return Ansi;
> -
> -fail2:
> -    Error("fail2\n");
> +    READ_PROPERTY(Adapter->Properties.ipv4_csum,
> L"*IPChecksumOffloadIPv4", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.tcpv4_csum,
> L"*TCPChecksumOffloadIPv4", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.udpv4_csum,
> L"*UDPChecksumOffloadIPv4", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.tcpv6_csum,
> L"*TCPChecksumOffloadIPv6", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.udpv6_csum,
> L"*UDPChecksumOffloadIPv6", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.need_csum_value,
> L"NeedChecksumValue", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.HeaderDataSplit,
> L"*HeaderDataSplit", 1, Handle);
> 
> -    while (--Index >= 0)
> -        __AdapterFree(Ansi[Index].Buffer);
> +    NdisCloseConfiguration(Handle);
> 
> -    __AdapterFree(Ansi);
> +    return NDIS_STATUS_SUCCESS;
> 
>  fail1:
> -    Error("fail1 (%08x)\n", status);
> -
> -    return NULL;
> +    return NDIS_STATUS_FAILURE;
>  }
> 
> -static FORCEINLINE VOID
> -__AdapterFreeAnsi(
> -    IN  PANSI_STRING    Ansi
> +#undef READ_PROPERTY
> +
> +#pragma prefast(pop)
> +
> +static NDIS_STATUS
> +AdapterSetRegistrationAttributes(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    ULONG               Index;
> +    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
> +    NDIS_STATUS                                     ndisStatus;
> +
> +    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
> +    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
> +    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
> +                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
> +    Attribs.CheckForHangTimeInSeconds = 0;
> +    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
> 
> -    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
> -        __AdapterFree(Ansi[Index].Buffer);
> +    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> 
> -    __AdapterFree(Ansi);
> +    return ndisStatus;
>  }
> 
> -static FORCEINLINE BOOLEAN
> -__AdapterMatchDistribution(
> -    IN  PXENNET_ADAPTER Adapter,
> -    IN  PCHAR           Buffer
> +static NDIS_STATUS
> +AdapterSetGeneralAttributes(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    PCHAR               Vendor;
> -    PCHAR               Product;
> -    PCHAR               Context;
> -    const CHAR          *Text;
> -    BOOLEAN             Match;
> -    ULONG               Index;
> -    NTSTATUS            status;
> +    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
> +    NDIS_STATUS                                 ndisStatus;
> 
> -    UNREFERENCED_PARAMETER(Adapter);
> +    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
> +    Attribs.MediaType = XENNET_MEDIA_TYPE;
> 
> -    status = STATUS_INVALID_PARAMETER;
> +    XENVIF_VIF(MacQueryMaximumFrameSize,
> +               &Adapter->VifInterface,
> +               (PULONG)&Adapter->MaximumFrameSize);
> 
> -    Vendor = __strtok_r(Buffer, " ", &Context);
> -    if (Vendor == NULL)
> -        goto fail1;
> +    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof
> (ETHERNET_TAGGED_HEADER);
> +    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.MediaConnectState = MediaConnectStateConnected;
> +    Attribs.MediaDuplexState = MediaDuplexStateFull;
> +    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
> +    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
> +    Attribs.MacOptions = XENNET_MAC_OPTIONS;
> +    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
> +    Attribs.MaxMulticastListSize = 32;
> +    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
> 
> -    Product = __strtok_r(NULL, " ", &Context);
> -    if (Product == NULL)
> -        goto fail2;
> +    XENVIF_VIF(MacQueryPermanentAddress,
> +               &Adapter->VifInterface,
> +               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
> +    XENVIF_VIF(MacQueryCurrentAddress,
> +               &Adapter->VifInterface,
> +               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
> 
> -    Match = TRUE;
> +    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
> +    Attribs.RecvScaleCapabilities = NULL;
> +    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
> +    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
> +    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
> +    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
> +    Attribs.IfConnectorPresent = TRUE;
> +    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
> +                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED
> |
> +                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
> +
> NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
> +                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED
> |
> +
> NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
> +                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
> +                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED
> |
> +                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
> +
> NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
> +
> +    Attribs.SupportedOidList = XennetSupportedOids;
> +    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
> 
> -    Text = VENDOR_NAME_STR;
> +    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> 
> -    for (Index = 0; Text[Index] != 0; Index++) {
> -        if (!isalnum((UCHAR)Text[Index])) {
> -            if (Vendor[Index] != '_') {
> -                Match = FALSE;
> -                break;
> -            }
> -        } else {
> -            if (Vendor[Index] != Text[Index]) {
> -                Match = FALSE;
> -                break;
> -            }
> -        }
> -    }
> +    return ndisStatus;
> +}
> 
> -    Text = "XENNET";
> +static NDIS_STATUS
> +AdapterSetOffloadAttributes(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
> +    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
> +    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
> +    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
> +    NDIS_OFFLOAD                                Default;
> +    NDIS_OFFLOAD                                Supported;
> +    NDIS_STATUS                                 ndisStatus;
> 
> -    if (_stricmp(Product, Text) != 0)
> -        Match = FALSE;
> +    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
> +    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
> 
> -    return Match;
> +    TxOptions->Value = 0;
> +    TxOptions->OffloadTagManipulation = 1;
> 
> -fail2:
> -    Error("fail2\n");
> +    RxOptions->Value = 0;
> +    RxOptions->OffloadTagManipulation = 1;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    if (Adapter->Properties.need_csum_value)
> +        RxOptions->NeedChecksumValue = 1;
> 
> -    return FALSE;
> -}
> +    if (Adapter->Properties.lrov4) {
> +        RxOptions->OffloadIpVersion4LargePacket = 1;
> +        RxOptions->NeedLargePacketSplit = 1;
> +    }
> 
> -static FORCEINLINE VOID
> -__AdapterClearDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    PCHAR               Buffer;
> -    PANSI_STRING        Distributions;
> -    ULONG               Index;
> -    NTSTATUS            status;
> +    if (Adapter->Properties.lrov6) {
> +        RxOptions->OffloadIpVersion6LargePacket = 1;
> +        RxOptions->NeedLargePacketSplit = 1;
> +    }
> 
> -    Trace("====>\n");
> +    XENVIF_VIF(ReceiverSetOffloadOptions,
> +               &Adapter->VifInterface,
> +               *RxOptions);
> 
> -    status = XENBUS_STORE(Directory,
> -                          &Adapter->StoreInterface,
> -                          NULL,
> -                          NULL,
> -                          "drivers",
> -                          &Buffer);
> -    if (NT_SUCCESS(status)) {
> -        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
> +    XENVIF_VIF(TransmitterQueryOffloadOptions,
> +               &Adapter->VifInterface,
> +               &Options);
> 
> -        XENBUS_STORE(Free,
> -                     &Adapter->StoreInterface,
> -                     Buffer);
> -    } else {
> -        Distributions = NULL;
> -    }
> +    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
> +    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
> +    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
> +    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
> 
> -    if (Distributions == NULL)
> -        goto done;
> +    Supported.Checksum.IPv4Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> 
> -    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
> -        PANSI_STRING    Distribution = &Distributions[Index];
> +    Supported.Checksum.IPv4Receive.IpChecksum = 1;
> +    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
> 
> -        status = XENBUS_STORE(Read,
> -                              &Adapter->StoreInterface,
> -                              NULL,
> -                              "drivers",
> -                              Distribution->Buffer,
> -                              &Buffer);
> -        if (!NT_SUCCESS(status))
> -            continue;
> +    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
> +    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
> 
> -        if (__AdapterMatchDistribution(Adapter, Buffer))
> -            (VOID) XENBUS_STORE(Remove,
> -                                &Adapter->StoreInterface,
> -                                NULL,
> -                                "drivers",
> -                                Distribution->Buffer);
> +    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
> 
> -        XENBUS_STORE(Free,
> -                     &Adapter->StoreInterface,
> -                     Buffer);
> -    }
> +    Supported.Checksum.IPv6Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> 
> -    __AdapterFreeAnsi(Distributions);
> +    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
> 
> -done:
> -    Trace("<====\n");
> -}
> +    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
> +    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
> 
> -#define MAXIMUM_INDEX   255
> +    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
> 
> -static FORCEINLINE NTSTATUS
> -__AdapterSetDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    ULONG               Index;
> -    CHAR                Distribution[MAXNAMELEN];
> -    CHAR                Vendor[MAXNAMELEN];
> -    const CHAR          *Product;
> -    NTSTATUS            status;
> +    Supported.Checksum.IPv4Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> 
> -    Trace("====>\n");
> +    if (Options.OffloadIpVersion4HeaderChecksum) {
> +        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
> +        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
> +    }
> 
> -    Index = 0;
> -    while (Index <= MAXIMUM_INDEX) {
> -        PCHAR   Buffer;
> +    if (Options.OffloadIpVersion4TcpChecksum) {
> +        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
> +        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
> +    }
> 
> -        status = RtlStringCbPrintfA(Distribution,
> -                                    MAXNAMELEN,
> -                                    "%u",
> -                                    Index);
> -        ASSERT(NT_SUCCESS(status));
> +    if (Options.OffloadIpVersion4UdpChecksum)
> +        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
> 
> -        status = XENBUS_STORE(Read,
> -                              &Adapter->StoreInterface,
> -                              NULL,
> -                              "drivers",
> -                              Distribution,
> -                              &Buffer);
> -        if (!NT_SUCCESS(status)) {
> -            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
> -                goto update;
> +    Supported.Checksum.IPv6Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +
> +    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
> 
> -            goto fail1;
> -        }
> +    if (Options.OffloadIpVersion6TcpChecksum) {
> +        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
> +        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
> +    }
> 
> -        XENBUS_STORE(Free,
> -                     &Adapter->StoreInterface,
> -                     Buffer);
> +    if (Options.OffloadIpVersion6UdpChecksum)
> +        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
> 
> -        Index++;
> +    if (Options.OffloadIpVersion4LargePacket) {
> +        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +                   &Adapter->VifInterface,
> +                   4,
> +                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
> +        Supported.LsoV2.IPv4.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +        Supported.LsoV2.IPv4.MinSegmentCount = 2;
>      }
> 
> -    status = STATUS_UNSUCCESSFUL;
> -    goto fail2;
> +    if (Options.OffloadIpVersion6LargePacket) {
> +        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +                   &Adapter->VifInterface,
> +                   6,
> +                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
> +        Supported.LsoV2.IPv6.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +        Supported.LsoV2.IPv6.MinSegmentCount = 2;
> +        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
> +        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
> +    }
> 
> -update:
> -    status = RtlStringCbPrintfA(Vendor,
> -                                MAXNAMELEN,
> -                                "%s",
> -                                VENDOR_NAME_STR);
> -    ASSERT(NT_SUCCESS(status));
> +    Default = Supported;
> 
> -    for (Index  = 0; Vendor[Index] != '\0'; Index++)
> -        if (!isalnum((UCHAR)Vendor[Index]))
> -            Vendor[Index] = '_';
> +    if (!(Adapter->Properties.ipv4_csum & 2))
> +        Default.Checksum.IPv4Receive.IpChecksum = 0;
> 
> -    Product = "XENNET";
> +    if (!(Adapter->Properties.tcpv4_csum & 2))
> +        Default.Checksum.IPv4Receive.TcpChecksum = 0;
> 
> -#if DBG
> -#define ATTRIBUTES   "(DEBUG)"
> -#else
> -#define ATTRIBUTES   ""
> -#endif
> +    if (!(Adapter->Properties.udpv4_csum & 2))
> +        Default.Checksum.IPv4Receive.UdpChecksum = 0;
> 
> -    (VOID) XENBUS_STORE(Printf,
> -                        &Adapter->StoreInterface,
> -                        NULL,
> -                        "drivers",
> -                        Distribution,
> -                        "%s %s %u.%u.%u %s",
> -                        Vendor,
> -                        Product,
> -                        MAJOR_VERSION,
> -                        MINOR_VERSION,
> -                        MICRO_VERSION,
> -                        ATTRIBUTES
> -                        );
> +    if (!(Adapter->Properties.tcpv6_csum & 2))
> +        Default.Checksum.IPv6Receive.TcpChecksum = 0;
> 
> -#undef  ATTRIBUTES
> +    if (!(Adapter->Properties.udpv6_csum & 2))
> +        Default.Checksum.IPv6Receive.UdpChecksum = 0;
> 
> -    Trace("<====\n");
> -    return STATUS_SUCCESS;
> +    if (!(Adapter->Properties.ipv4_csum & 1))
> +        Default.Checksum.IPv4Transmit.IpChecksum = 0;
> 
> -fail2:
> -    Error("fail2\n");
> +    if (!(Adapter->Properties.tcpv4_csum & 1))
> +        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    if (!(Adapter->Properties.udpv4_csum & 1))
> +        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
> 
> -    return status;
> -}
> +    if (!(Adapter->Properties.tcpv6_csum & 1))
> +        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
> 
> -static DECLSPEC_NOINLINE VOID
> -AdapterSuspendCallbackLate(
> -    IN  PVOID       Argument
> -    )
> -{
> -    PXENNET_ADAPTER Adapter = Argument;
> +    if (!(Adapter->Properties.udpv6_csum & 1))
> +        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
> 
> -    (VOID) __AdapterSetDistribution(Adapter);
> -}
> +    if (!(Adapter->Properties.lsov4)) {
> +        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
> +        Default.LsoV2.IPv4.MinSegmentCount = 0;
> +    }
> 
> -static NTSTATUS
> -AdapterSetDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    LONG                Count;
> -    NTSTATUS            status;
> +    if (!(Adapter->Properties.lsov6)) {
> +        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
> +        Default.LsoV2.IPv6.MinSegmentCount = 0;
> +    }
> 
> -    Trace("====>\n");
> +    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof
> (NDIS_OFFLOAD))) {
> +        Adapter->Offload = Default;
> +        DISPLAY_OFFLOAD(Default);
> +    }
> 
> -    Count = InterlockedIncrement(&AdapterCount);
> -    ASSERT(Count != 0);
> +    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size = sizeof(Attribs);
> +    Attribs.DefaultOffloadConfiguration = &Default;
> +    Attribs.HardwareOffloadCapabilities = &Supported;
> 
> -    if (Count != 1)
> -        goto done;
> +    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    return ndisStatus;
> +}
> 
> -    status = __AdapterSetDistribution(Adapter);
> -    if (!NT_SUCCESS(status))
> -        goto fail1;
> +static NDIS_STATUS
> +AdapterSetHeaderDataSplitAttributes(
> +    IN  PXENNET_ADAPTER                                 Adapter
> +    )
> +{
> +    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
> +    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
> +    NDIS_STATUS                                         NdisStatus;
> 
> -    status = XENBUS_SUSPEND(Register,
> -                            &Adapter->SuspendInterface,
> -                            SUSPEND_CALLBACK_LATE,
> -                            AdapterSuspendCallbackLate,
> -                            Adapter,
> -                            &Adapter->SuspendCallbackLate);
> -    if (!NT_SUCCESS(status))
> -        goto fail2;
> +    RtlZeroMemory(&Attribs, sizeof(Attribs));
> 
> -done:
> -    Trace("<====\n");
> -    return STATUS_SUCCESS;
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES
> ;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size =
> NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVI
> SION_1;
> 
> -fail2:
> -    Error("fail2\n");
> +    RtlZeroMemory(&Split, sizeof(Split));
> 
> -    __AdapterClearDistribution(Adapter);
> +    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
> +    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
> +    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
> +    Split.HardwareCapabilities =
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    if (Adapter->Properties.HeaderDataSplit != 0)
> +        Split.CurrentCapabilities = Split.HardwareCapabilities;
> 
> -    return status;
> -}
> +    Attribs.HDSplitAttributes = &Split;
> 
> -static VOID
> -AdapterClearDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    LONG                Count;
> +    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    if (NdisStatus != NDIS_STATUS_SUCCESS)
> +        goto fail1;
> 
> -    Trace("====>\n");
> +    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
> +        ASSERT(Split.CurrentCapabilities &
> NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
> 
> -    Count = InterlockedDecrement(&AdapterCount);
> +        Info("BackfillSize = %u\n", Split.BackfillSize);
> +        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
> 
> -    if (Count != 0)
> -        goto done;
> +        XENVIF_VIF(ReceiverSetBackfillSize,
> +                   &Adapter->VifInterface,
> +                   Split.BackfillSize);
> 
> -    XENBUS_SUSPEND(Deregister,
> -                   &Adapter->SuspendInterface,
> -                   Adapter->SuspendCallbackLate);
> -    Adapter->SuspendCallbackLate = NULL;
> +        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
> +    }
> 
> -    __AdapterClearDistribution(Adapter);
> +    return NDIS_STATUS_SUCCESS;
> 
> -done:
> -    Trace("<====\n");
> +fail1:
> +    Error("fail1 (%08x)\n", NdisStatus);
> +
> +    return NdisStatus;
>  }
> 
>  NDIS_STATUS
> @@ -2715,52 +2810,35 @@ AdapterInitialize(
>      if (!NT_SUCCESS(status))
>          goto fail6;
> 
> -    status = XENBUS_CACHE(Acquire,
> -                          &(*Adapter)->CacheInterface);
> -    if (!NT_SUCCESS(status))
> -        goto fail7;
> -
> -    status = XENBUS_STORE(Acquire,
> -                          &(*Adapter)->StoreInterface);
> -    if (!NT_SUCCESS(status))
> -        goto fail8;
> -
> -    status = XENBUS_SUSPEND(Acquire,
> -                            &(*Adapter)->SuspendInterface);
> -    if (!NT_SUCCESS(status))
> -        goto fail9;
> -
> -    (VOID) AdapterSetDistribution(*Adapter);
> -
>      (*Adapter)->NdisAdapterHandle = Handle;
> 
>      ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail10;
> +        goto fail7;
> 
>      ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail11;
> +        goto fail8;
> 
>      ndisStatus = AdapterGetAdvancedSettings(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail12;
> +        goto fail9;
> 
>      ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail13;
> +        goto fail10;
> 
>      ndisStatus = AdapterSetGeneralAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail14;
> +        goto fail11;
> 
>      ndisStatus = AdapterSetOffloadAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail15;
> +        goto fail12;
> 
>      ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail16;
> +        goto fail13;
> 
>      RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
>      Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
> @@ -2777,43 +2855,23 @@ AdapterInitialize(
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
>          (*Adapter)->NdisDmaHandle = NULL;
> 
> -    ndisStatus = AdapterEnable(*Adapter);
> -    if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail17;
> -
>      return NDIS_STATUS_SUCCESS;
> 
> -fail17:
> -    if ((*Adapter)->NdisDmaHandle)
> -        NdisMDeregisterScatterGatherDma((*Adapter)->NdisDmaHandle);
> -    (*Adapter)->NdisDmaHandle = NULL;
> -
> -fail16:
> -fail15:
> -fail14:
>  fail13:
>  fail12:
> +fail11:
> +fail10:
> +fail9:
>      ReceiverTeardown((*Adapter)->Receiver);
>      (*Adapter)->Receiver = NULL;
> -fail11:
> 
> +fail8:
>      TransmitterTeardown((*Adapter)->Transmitter);
>      (*Adapter)->Transmitter = NULL;
> 
> -fail10:
> +fail7:
>      (*Adapter)->NdisAdapterHandle = NULL;
> 
> -    AdapterClearDistribution(*Adapter);
> -
> -    XENBUS_SUSPEND(Release, &(*Adapter)->SuspendInterface);
> -
> -fail9:
> -    XENBUS_STORE(Release, &(*Adapter)->StoreInterface);
> -
> -fail8:
> -    XENBUS_CACHE(Release, &(*Adapter)->CacheInterface);
> -
> -fail7:
>      XENVIF_VIF(Release, &(*Adapter)->VifInterface);
> 
>  fail6:
> @@ -2852,9 +2910,6 @@ AdapterTeardown(
> 
>      AdapterClearDistribution(Adapter);
> 
> -    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
> -    XENBUS_STORE(Release, &Adapter->StoreInterface);
> -    XENBUS_CACHE(Release, &Adapter->CacheInterface);
>      XENVIF_VIF(Release, &Adapter->VifInterface);
> 
>      RtlZeroMemory(&Adapter->SuspendInterface,
> sizeof(XENBUS_SUSPEND_INTERFACE));
> diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
> index 3cc1d90..5b2495a 100644
> --- a/src/xennet/adapter.h
> +++ b/src/xennet/adapter.h
> @@ -99,7 +99,7 @@ AdapterEnable(
>      IN  PXENNET_ADAPTER     Adapter
>      );
> 
> -extern BOOLEAN
> +extern VOID
>  AdapterDisable(
>      IN  PXENNET_ADAPTER     Adapter
>      );
> diff --git a/src/xennet/miniport.c b/src/xennet/miniport.c
> index 5500418..1883db5 100644
> --- a/src/xennet/miniport.c
> +++ b/src/xennet/miniport.c
> @@ -66,7 +66,7 @@ MiniportInitializeEx(
>      PXENNET_ADAPTER                     Adapter;
>      NDIS_STATUS                         NdisStatus;
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
>      UNREFERENCED_PARAMETER(MiniportDriverContext);
>      UNREFERENCED_PARAMETER(MiniportInitParameters);
> @@ -75,7 +75,7 @@ MiniportInitializeEx(
>      if (NdisStatus != NDIS_STATUS_SUCCESS)
>          goto fail1;
> 
> -    Trace("<====\n");
> +    Info("<====\n");
> 
>      return NDIS_STATUS_SUCCESS;
> 
> @@ -97,16 +97,14 @@ MiniportHaltEx(
> 
>      UNREFERENCED_PARAMETER(HaltAction);
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
>      if (Adapter == NULL)
>          return;
> 
> -    (VOID) AdapterDisable(Adapter);
> -
>      AdapterTeardown(Adapter);
> 
> -    Trace("<====\n");
> +    Info("<====\n");
>  }
> 
>  static
> @@ -131,12 +129,11 @@ MiniportPause(
> 
>      UNREFERENCED_PARAMETER(MiniportPauseParameters);
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
> -    if (AdapterDisable(Adapter))
> -        AdapterMediaStateChange(Adapter);
> +    AdapterDisable(Adapter);
> 
> -    Trace("<====\n");
> +    Info("<====\n");
> 
>      return NDIS_STATUS_SUCCESS;
>  }
> @@ -154,11 +151,11 @@ MiniportRestart(
> 
>      UNREFERENCED_PARAMETER(MiniportRestartParameters);
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
>      NdisStatus = AdapterEnable(Adapter);
> 
> -    Trace("<====\n");
> +    Info("<====\n");
> 
>      return NdisStatus;
>  }
> diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
> index 17ab27f..8bfc10b 100644
> --- a/src/xennet/receiver.c
> +++ b/src/xennet/receiver.c
> @@ -359,6 +359,24 @@ fail1:
>      return status;
>  }
> 
> +NDIS_STATUS
> +ReceiverEnable (
> +    IN  PXENNET_RECEIVER    Receiver
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Receiver);
> +
> +    return NDIS_STATUS_SUCCESS;
> +}
> +
> +VOID
> +ReceiverDisable (
> +    IN  PXENNET_RECEIVER    Receiver
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Receiver);
> +}
> +
>  VOID
>  ReceiverTeardown(
>      IN  PXENNET_RECEIVER    Receiver
> diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
> index b2cc809..33701a9 100644
> --- a/src/xennet/receiver.h
> +++ b/src/xennet/receiver.h
> @@ -43,6 +43,16 @@ ReceiverInitialize(
>      OUT PXENNET_RECEIVER    *Receiver
>      );
> 
> +extern NDIS_STATUS
> +ReceiverEnable(
> +    IN  PXENNET_RECEIVER    Receiver
> +    );
> +
> +extern VOID
> +ReceiverDisable(
> +    IN  PXENNET_RECEIVER    Receiver
> +    );
> +
>  extern VOID
>  ReceiverTeardown(
>      IN  PXENNET_RECEIVER    Receiver
> diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
> index a617b7d..8c80c7e 100644
> --- a/src/xennet/transmitter.c
> +++ b/src/xennet/transmitter.c
> @@ -141,16 +141,10 @@ TransmitterInitialize (
>      OUT PXENNET_TRANSMITTER *Transmitter
>      )
>  {
> -    NTSTATUS                status;
> -    PXENBUS_CACHE_INTERFACE CacheInterface;
> -
> -    CacheInterface = AdapterGetCacheInterface(Adapter);
> -
>      *Transmitter = ExAllocatePoolWithTag(NonPagedPool,
>                                           sizeof(XENNET_TRANSMITTER),
>                                           TRANSMITTER_POOL_TAG);
> 
> -    status = STATUS_NO_MEMORY;
>      if (*Transmitter == NULL)
>          goto fail1;
> 
> @@ -160,6 +154,22 @@ TransmitterInitialize (
> 
>      KeInitializeSpinLock(&(*Transmitter)->Lock);
> 
> +    return NDIS_STATUS_SUCCESS;
> +
> +fail1:
> +    return NDIS_STATUS_FAILURE;
> +}
> +
> +NDIS_STATUS
> +TransmitterEnable (
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    )
> +{
> +    PXENBUS_CACHE_INTERFACE CacheInterface;
> +    NTSTATUS                status;
> +
> +    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
> +
>      status = XENBUS_CACHE(Create,
>                            CacheInterface,
>                            "packet_cache",
> @@ -169,10 +179,10 @@ TransmitterInitialize (
>                            __TransmitterPacketDtor,
>                            __TransmitterPacketAcquireLock,
>                            __TransmitterPacketReleaseLock,
> -                          *Transmitter,
> -                          &(*Transmitter)->PacketCache);
> +                          Transmitter,
> +                          &Transmitter->PacketCache);
>      if (!NT_SUCCESS(status))
> -        goto fail2;
> +        goto fail1;
> 
>      status = XENBUS_CACHE(Create,
>                            CacheInterface,
> @@ -183,27 +193,20 @@ TransmitterInitialize (
>                            __TransmitterBufferDtor,
>                            __TransmitterBufferAcquireLock,
>                            __TransmitterBufferReleaseLock,
> -                          *Transmitter,
> -                          &(*Transmitter)->BufferCache);
> +                          Transmitter,
> +                          &Transmitter->BufferCache);
>      if (!NT_SUCCESS(status))
> -        goto fail3;
> +        goto fail2;
> 
>      return NDIS_STATUS_SUCCESS;
> 
> -fail3:
> -    XENBUS_CACHE(Destroy,
> -                 CacheInterface,
> -                 (*Transmitter)->PacketCache);
> -    (*Transmitter)->PacketCache = NULL;
> -
>  fail2:
>      Error("fail2\n");
> 
> -    RtlZeroMemory(&(*Transmitter)->Lock, sizeof(KSPIN_LOCK));
> -
> -    ExFreePoolWithTag(*Transmitter, TRANSMITTER_POOL_TAG);
> -
> -    *Transmitter = NULL;
> +    XENBUS_CACHE(Destroy,
> +                 CacheInterface,
> +                 Transmitter->PacketCache);
> +    Transmitter->PacketCache = NULL;
> 
>  fail1:
>      Error("fail1\n (%08x)", status);
> @@ -212,7 +215,7 @@ fail1:
>  }
> 
>  VOID
> -TransmitterTeardown(
> +TransmitterDisable (
>      IN  PXENNET_TRANSMITTER Transmitter
>      )
>  {
> @@ -220,9 +223,6 @@ TransmitterTeardown(
> 
>      CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
> 
> -    Transmitter->Adapter = NULL;
> -    Transmitter->OffloadOptions.Value = 0;
> -
>      XENBUS_CACHE(Destroy,
>                   CacheInterface,
>                   Transmitter->BufferCache);
> @@ -232,6 +232,15 @@ TransmitterTeardown(
>                   CacheInterface,
>                   Transmitter->PacketCache);
>      Transmitter->PacketCache = NULL;
> +}
> +
> +VOID
> +TransmitterTeardown(
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    )
> +{
> +    Transmitter->Adapter = NULL;
> +    Transmitter->OffloadOptions.Value = 0;
> 
>      RtlZeroMemory(&Transmitter->Lock, sizeof(KSPIN_LOCK));
> 
> diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
> index 0adebdc..363b91e 100644
> --- a/src/xennet/transmitter.h
> +++ b/src/xennet/transmitter.h
> @@ -43,6 +43,16 @@ TransmitterInitialize(
>      OUT PXENNET_TRANSMITTER *Transmitter
>      );
> 
> +extern NDIS_STATUS
> +TransmitterEnable(
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    );
> +
> +extern VOID
> +TransmitterDisable(
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    );
> +
>  extern VOID
>  TransmitterTeardown(
>      IN  PXENNET_TRANSMITTER Transmitter
> --
> 2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 17:21:01 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 17:21:01 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4XYy-0006eZ-As; Thu, 03 Dec 2015 17:21:00 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=772d45f04=Paul.Durrant@citrix.com>)
	id 1a4XYv-0006eR-Rw
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 17:20:58 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	A9/5F-21571-9F970665; Thu, 03 Dec 2015 17:20:57 +0000
X-Env-Sender: prvs=772d45f04=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-21.messagelabs.com!1449163253!3457396!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 60315 invoked from network); 3 Dec 2015 17:20:54 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Dec 2015 17:20:54 -0000
X-IronPort-AV: E=Sophos;i="5.20,378,1444694400"; 
   d="scan'208";a="9228673"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <pdurrant@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [PATCH for 8.1] Make sure XENBUS interfaces are released when
	going into S4
Thread-Index: AQHRLcuVQgVsHxUVhUagbULR7IVhKp65gHXw
Date: Thu, 3 Dec 2015 17:18:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A5699@AMSPEX01CL01.citrite.net>
References: <1449148022-7436-1-git-send-email-paul.durrant@citrix.com>
In-Reply-To: <1449148022-7436-1-git-send-email-paul.durrant@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] [PATCH for 8.1] Make sure XENBUS interfaces are
 released when going into S4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Paul Durrant [mailto:pdurrant@gmail.com]
> Sent: 03 December 2015 13:07
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant
> Subject: [PATCH for 8.1] Make sure XENBUS interfaces are released when
> going into S4
> 
> Because a transition into and out of S4 means a new domain is built, it's
> crucial that all XENBUS interfaces are released (so that things like
> event channels, grant tables and the xenstore ring get re-constructed).
> 
> This patch fixes code paths where this was not being done. It also adds
> some more logging during AdapterEnable/Disable and when moving
> between
> D0 and D3.
> 
> Signed-off-by: Paul Durrant <paul.durrant@citrix.com>

Note that this patch introduces a race between cache destruction and packet transmission which can lead to a NULL pointer dereference. The only sound solution I can see to this is to move hashing into XENVIF so that XENNET no longer needs to use caches and their lifecycle can then be protected by the MRSW VIF interface lock.
Since that's a significant amount of code change it's going to take a while and so I will not back-port this patch until then.

  Paul

> ---
>  src/xennet/adapter.c     | 2719 +++++++++++++++++++++++-------------------
> ----
>  src/xennet/adapter.h     |    2 +-
>  src/xennet/miniport.c    |   21 +-
>  src/xennet/receiver.c    |   18 +
>  src/xennet/receiver.h    |   10 +
>  src/xennet/transmitter.c |   63 +-
>  src/xennet/transmitter.h |   10 +
>  7 files changed, 1471 insertions(+), 1372 deletions(-)
> 
> diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
> index f9b3cf1..2c35636 100644
> --- a/src/xennet/adapter.c
> +++ b/src/xennet/adapter.c
> @@ -1074,1576 +1074,1671 @@ AdapterGetReceiver(
>      return Adapter->Receiver;
>  }
> 
> -NDIS_STATUS
> -AdapterEnable(
> -    IN  PXENNET_ADAPTER     Adapter
> +static FORCEINLINE PVOID
> +__AdapterAllocate(
> +    IN  ULONG   Length
>      )
>  {
> -    NTSTATUS        status;
> -
> -    if (Adapter->Enabled)
> -        return NDIS_STATUS_SUCCESS;
> -
> -    status = XENVIF_VIF(Enable,
> -                        &Adapter->VifInterface,
> -                        AdapterVifCallback,
> -                        Adapter);
> -    if (!NT_SUCCESS(status))
> -        goto fail1;
> -
> -    Adapter->Enabled = TRUE;
> -
> -    return NDIS_STATUS_SUCCESS;
> +    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
> +}
> 
> -fail1:
> -    return NDIS_STATUS_FAILURE;
> +static FORCEINLINE VOID
> +__AdapterFree(
> +    IN  PVOID   Buffer
> +    )
> +{
> +    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
>  }
> 
> -BOOLEAN
> -AdapterDisable(
> -    IN  PXENNET_ADAPTER     Adapter
> +static FORCEINLINE PANSI_STRING
> +__AdapterMultiSzToUpcaseAnsi(
> +    IN  PCHAR       Buffer
>      )
>  {
> -    if (!Adapter->Enabled)
> -        return FALSE;
> +    PANSI_STRING    Ansi;
> +    LONG            Index;
> +    LONG            Count;
> +    NTSTATUS        status;
> 
> -    XENVIF_VIF(Disable,
> -               &Adapter->VifInterface);
> +    Index = 0;
> +    Count = 0;
> +    for (;;) {
> +        if (Buffer[Index] == '\0') {
> +            Count++;
> +            Index++;
> 
> -    AdapterMediaStateChange(Adapter);
> +            // Check for double NUL
> +            if (Buffer[Index] == '\0')
> +                break;
> +        } else {
> +            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
> +            Index++;
> +        }
> +    }
> 
> -    Adapter->Enabled = FALSE;
> +    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
> 
> -    return TRUE;
> -}
> +    status = STATUS_NO_MEMORY;
> +    if (Ansi == NULL)
> +        goto fail1;
> 
> -VOID
> -AdapterMediaStateChange(
> -    IN  PXENNET_ADAPTER     Adapter
> -    )
> -{
> -    NDIS_LINK_STATE         LinkState;
> -    NDIS_STATUS_INDICATION  StatusIndication;
> +    for (Index = 0; Index < Count; Index++) {
> +        ULONG   Length;
> 
> -    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
> -    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
> -    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
> -    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
> +        Length = (ULONG)strlen(Buffer);
> +        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
> +        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
> 
> -    XENVIF_VIF(MacQueryState,
> -               &Adapter->VifInterface,
> -               &LinkState.MediaConnectState,
> -               &LinkState.RcvLinkSpeed,
> -               &LinkState.MediaDuplexState);
> +        status = STATUS_NO_MEMORY;
> +        if (Ansi[Index].Buffer == NULL)
> +            goto fail2;
> 
> -    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
> -        Info("LINK: STATE UNKNOWN\n");
> -    } else if (LinkState.MediaConnectState ==
> MediaConnectStateDisconnected) {
> -        Info("LINK: DOWN\n");
> -    } else {
> -        ASSERT3U(LinkState.MediaConnectState, ==,
> MediaConnectStateConnected);
> +        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
> +        Ansi[Index].Length = (USHORT)Length;
> 
> -        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
> -            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n",
> LinkState.RcvLinkSpeed);
> -        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
> -            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n", LinkState.RcvLinkSpeed);
> -        else
> -            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n",
> LinkState.RcvLinkSpeed);
> +        Buffer += Length + 1;
>      }
> 
> -    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
> +    return Ansi;
> 
> -    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
> -    StatusIndication.Header.Type =
> NDIS_OBJECT_TYPE_STATUS_INDICATION;
> -    StatusIndication.Header.Revision =
> NDIS_STATUS_INDICATION_REVISION_1;
> -    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
> +fail2:
> +    Error("fail2\n");
> 
> -    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
> -    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
> -    StatusIndication.StatusBuffer = &LinkState;
> -    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
> +    while (--Index >= 0)
> +        __AdapterFree(Ansi[Index].Buffer);
> 
> -    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle, &StatusIndication);
> +    __AdapterFree(Ansi);
> +
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return NULL;
>  }
> 
> -NDIS_STATUS
> -AdapterSetInformation(
> -    IN  PXENNET_ADAPTER     Adapter,
> -    IN  PNDIS_OID_REQUEST   Request
> +static FORCEINLINE VOID
> +__AdapterFreeAnsi(
> +    IN  PANSI_STRING    Ansi
>      )
>  {
> -    PVOID                   Buffer;
> -    ULONG                   BufferLength;
> -    ULONG                   BytesNeeded;
> -    ULONG                   BytesRead;
> -    BOOLEAN                 Warn;
> -    NDIS_STATUS             ndisStatus;
> +    ULONG               Index;
> 
> -    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
> -    BufferLength = Request-
> >DATA.SET_INFORMATION.InformationBufferLength;
> -    BytesNeeded = BytesRead = 0;
> -    Warn = TRUE;
> -    ndisStatus = NDIS_STATUS_SUCCESS;
> +    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
> +        __AdapterFree(Ansi[Index].Buffer);
> 
> -    switch (Request->DATA.SET_INFORMATION.Oid) {
> -    case OID_PNP_SET_POWER:
> -        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> -        // do nothing
> -        break;
> +    __AdapterFree(Ansi);
> +}
> 
> -    case OID_GEN_CURRENT_LOOKAHEAD:
> -        BytesNeeded = sizeof(ULONG);
> -        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
> -        if (BufferLength == BytesNeeded) {
> -            Adapter->CurrentLookahead = *(PULONG)Buffer;
> -            BytesRead = sizeof(ULONG);
> -        }
> -        break;
> +static FORCEINLINE BOOLEAN
> +__AdapterMatchDistribution(
> +    IN  PXENNET_ADAPTER Adapter,
> +    IN  PCHAR           Buffer
> +    )
> +{
> +    PCHAR               Vendor;
> +    PCHAR               Product;
> +    PCHAR               Context;
> +    const CHAR          *Text;
> +    BOOLEAN             Match;
> +    ULONG               Index;
> +    NTSTATUS            status;
> 
> -    case OID_GEN_CURRENT_PACKET_FILTER:
> -        BytesNeeded = sizeof(ULONG);
> -        if (BufferLength == BytesNeeded) {
> -            ndisStatus = AdapterSetPacketFilter(Adapter,
> -                                                (PULONG)Buffer);
> -            BytesRead = sizeof(ULONG);
> -        }
> -        break;
> +    UNREFERENCED_PARAMETER(Adapter);
> 
> -    case OID_802_3_MULTICAST_LIST:
> -        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
> -        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
> -            ndisStatus = AdapterSetMulticastAddresses(Adapter,
> -                                                      Buffer,
> -                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = BufferLength;
> -        } else {
> -            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
> -        }
> -        break;
> +    status = STATUS_INVALID_PARAMETER;
> 
> -    case OID_OFFLOAD_ENCAPSULATION:
> -        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> -        if (BufferLength >= BytesNeeded) {
> -            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
> -                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> -        }
> -        break;
> +    Vendor = __strtok_r(Buffer, " ", &Context);
> +    if (Vendor == NULL)
> +        goto fail1;
> 
> -    case OID_TCP_OFFLOAD_PARAMETERS:
> -        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
> -        if (BufferLength >= BytesNeeded) {
> -            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
> -                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
> -        }
> -        break;
> +    Product = __strtok_r(NULL, " ", &Context);
> +    if (Product == NULL)
> +        goto fail2;
> 
> -    case OID_GEN_HD_SPLIT_PARAMETERS:
> -        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> -        if (BufferLength >= BytesNeeded) {
> -            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
> -                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
> -            if (ndisStatus == NDIS_STATUS_SUCCESS)
> -                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> -        }
> -        break;
> +    Match = TRUE;
> 
> -    case OID_GEN_INTERRUPT_MODERATION:
> -    case OID_GEN_MACHINE_NAME:
> -        Warn = FALSE;
> -        /*FALLTHRU*/
> -    default:
> -        if (Warn)
> -            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> +    Text = VENDOR_NAME_STR;
> 
> -        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> -        break;
> +    for (Index = 0; Text[Index] != 0; Index++) {
> +        if (!isalnum((UCHAR)Text[Index])) {
> +            if (Vendor[Index] != '_') {
> +                Match = FALSE;
> +                break;
> +            }
> +        } else {
> +            if (Vendor[Index] != Text[Index]) {
> +                Match = FALSE;
> +                break;
> +            }
> +        }
>      }
> 
> -    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
> -    if (ndisStatus == NDIS_STATUS_SUCCESS)
> -        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
> +    Text = "XENNET";
> 
> -    return ndisStatus;
> -}
> +    if (_stricmp(Product, Text) != 0)
> +        Match = FALSE;
> 
> -static FORCEINLINE NDIS_STATUS
> -__CopyBuffer(
> -    IN  PVOID   Destination,
> -    IN  ULONG   DestinationLength,
> -    IN  PVOID   Source,
> -    IN  ULONG   SourceLength,
> -    OUT PULONG  CopyLength
> -    )
> -{
> -    *CopyLength = __min(SourceLength, DestinationLength);
> -    RtlCopyMemory(Destination, Source, *CopyLength);
> +    return Match;
> 
> -    return (DestinationLength >= SourceLength) ?
> -           NDIS_STATUS_SUCCESS :
> -           NDIS_STATUS_BUFFER_TOO_SHORT;
> -}
> +fail2:
> +    Error("fail2\n");
> 
> -static FORCEINLINE NDIS_STATUS
> -__SetUlong(
> -    IN  PVOID   Destination,
> -    IN  ULONG   DestinationLength,
> -    IN  ULONG   Source,
> -    OUT PULONG  CopyLength
> -    )
> -{
> -    return __CopyBuffer(Destination,
> -                        DestinationLength & ~3,
> -                        &Source,
> -                        sizeof (ULONG),
> -                        CopyLength);
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return FALSE;
>  }
> 
> -static FORCEINLINE NDIS_STATUS
> -__SetUlong64(
> -    IN  PVOID   Destination,
> -    IN  ULONG   DestinationLength,
> -    IN  ULONG64 Source,
> -    OUT PULONG  CopyLength
> +static FORCEINLINE VOID
> +__AdapterClearDistribution(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    NDIS_STATUS ndisStatus;
> +    PCHAR               Buffer;
> +    PANSI_STRING        Distributions;
> +    ULONG               Index;
> +    NTSTATUS            status;
> 
> -    ndisStatus =  __CopyBuffer(Destination,
> -                               DestinationLength & ~3,
> -                               &Source,
> -                               sizeof (ULONG64),
> -                               CopyLength);
> -    if (DestinationLength >= 4)
> -        ndisStatus = NDIS_STATUS_SUCCESS;
> +    Trace("====>\n");
> 
> -    return ndisStatus;
> -}
> +    status = XENBUS_STORE(Directory,
> +                          &Adapter->StoreInterface,
> +                          NULL,
> +                          NULL,
> +                          "drivers",
> +                          &Buffer);
> +    if (NT_SUCCESS(status)) {
> +        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
> 
> -NDIS_STATUS
> -AdapterQueryInformation(
> -    IN  PXENNET_ADAPTER     Adapter,
> -    IN  PNDIS_OID_REQUEST   Request
> -    )
> -{
> -    PVOID                   Buffer;
> -    ULONG                   BufferLength;
> -    ULONG                   BytesNeeded;
> -    ULONG                   BytesWritten;
> -    ULONG                   Value32;
> -    ULONGLONG               Value64;
> -    ETHERNET_ADDRESS        EthernetAddress;
> -    BOOLEAN                 Warn;
> -    NDIS_STATUS             ndisStatus;
> +        XENBUS_STORE(Free,
> +                     &Adapter->StoreInterface,
> +                     Buffer);
> +    } else {
> +        Distributions = NULL;
> +    }
> 
> -    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
> -    BufferLength = Request-
> >DATA.QUERY_INFORMATION.InformationBufferLength;
> -    BytesNeeded = BytesWritten = 0;
> -    Warn = TRUE;
> -    ndisStatus = NDIS_STATUS_SUCCESS;
> +    if (Distributions == NULL)
> +        goto done;
> 
> -    switch (Request->DATA.QUERY_INFORMATION.Oid) {
> -    case OID_PNP_CAPABILITIES:
> -        BytesNeeded = sizeof(Adapter->Capabilities);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &Adapter->Capabilities,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
> +        PANSI_STRING    Distribution = &Distributions[Index];
> 
> -    case OID_PNP_QUERY_POWER:
> -        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> -        BytesWritten = 0;
> -        // do nothing
> -        break;
> +        status = XENBUS_STORE(Read,
> +                              &Adapter->StoreInterface,
> +                              NULL,
> +                              "drivers",
> +                              Distribution->Buffer,
> +                              &Buffer);
> +        if (!NT_SUCCESS(status))
> +            continue;
> 
> -    case OID_GEN_SUPPORTED_LIST:
> -        BytesNeeded = sizeof(XennetSupportedOids);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &XennetSupportedOids[0],
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +        if (__AdapterMatchDistribution(Adapter, Buffer))
> +            (VOID) XENBUS_STORE(Remove,
> +                                &Adapter->StoreInterface,
> +                                NULL,
> +                                "drivers",
> +                                Distribution->Buffer);
> 
> -    case OID_GEN_HARDWARE_STATUS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                NdisHardwareStatusReady,
> -                                &BytesWritten);
> -        break;
> +        XENBUS_STORE(Free,
> +                     &Adapter->StoreInterface,
> +                     Buffer);
> +    }
> 
> -    case OID_GEN_MEDIA_SUPPORTED:
> -    case OID_GEN_MEDIA_IN_USE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                XENNET_MEDIA_TYPE,
> -                                &BytesWritten);
> -        break;
> +    __AdapterFreeAnsi(Distributions);
> 
> -    case OID_GEN_MAXIMUM_LOOKAHEAD:
> -    case OID_GEN_TRANSMIT_BLOCK_SIZE:
> -    case OID_GEN_RECEIVE_BLOCK_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->MaximumFrameSize,
> -                                &BytesWritten);
> -        break;
> +done:
> +    Trace("<====\n");
> +}
> 
> -    case OID_GEN_TRANSMIT_BUFFER_SPACE:
> -    case OID_GEN_RECEIVE_BUFFER_SPACE:
> -        XENVIF_VIF(TransmitterQueryRingSize,
> -                    &Adapter->VifInterface,
> -                    (PULONG)&Value32);
> -        Value32 *= Adapter->MaximumFrameSize;
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +#define MAXIMUM_INDEX   255
> 
> -    case OID_GEN_VENDOR_DESCRIPTION:
> -        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  VENDOR_NAME_STR,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +static FORCEINLINE NTSTATUS
> +__AdapterSetDistribution(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    ULONG               Index;
> +    CHAR                Distribution[MAXNAMELEN];
> +    CHAR                Vendor[MAXNAMELEN];
> +    const CHAR          *Product;
> +    NTSTATUS            status;
> 
> -    case OID_GEN_VENDOR_DRIVER_VERSION:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
> -                                &BytesWritten);
> -        break;
> +    Trace("====>\n");
> 
> -    case OID_GEN_DRIVER_VERSION:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (6 << 8) | 0, // NDIS 6.0
> -                                &BytesWritten);
> -        break;
> +    Index = 0;
> +    while (Index <= MAXIMUM_INDEX) {
> +        PCHAR   Buffer;
> 
> -    case OID_GEN_MAC_OPTIONS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                XENNET_MAC_OPTIONS,
> -                                &BytesWritten);
> -        break;
> +        status = RtlStringCbPrintfA(Distribution,
> +                                    MAXNAMELEN,
> +                                    "%u",
> +                                    Index);
> +        ASSERT(NT_SUCCESS(status));
> 
> -    case OID_GEN_STATISTICS:
> -        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
> -        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
> -                                                   (PNDIS_STATISTICS_INFO)Buffer,
> -                                                   BufferLength,
> -                                                   &BytesWritten);
> -        break;
> +        status = XENBUS_STORE(Read,
> +                              &Adapter->StoreInterface,
> +                              NULL,
> +                              "drivers",
> +                              Distribution,
> +                              &Buffer);
> +        if (!NT_SUCCESS(status)) {
> +            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
> +                goto update;
> 
> -    case OID_802_3_MULTICAST_LIST:
> -        ndisStatus = AdapterQueryMulticastList(Adapter,
> -                                               Buffer,
> -                                               BufferLength,
> -                                               &BytesNeeded,
> -                                               &BytesWritten);
> -        break;
> +            goto fail1;
> +        }
> 
> -    case OID_802_3_PERMANENT_ADDRESS:
> -        XENVIF_VIF(MacQueryPermanentAddress,
> -                    &Adapter->VifInterface,
> -                    &EthernetAddress);
> -        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &EthernetAddress,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +        XENBUS_STORE(Free,
> +                     &Adapter->StoreInterface,
> +                     Buffer);
> 
> -    case OID_802_3_CURRENT_ADDRESS:
> -        XENVIF_VIF(MacQueryCurrentAddress,
> -                    &Adapter->VifInterface,
> -                    &EthernetAddress);
> -        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> -        ndisStatus = __CopyBuffer(Buffer,
> -                                  BufferLength,
> -                                  &EthernetAddress,
> -                                  BytesNeeded,
> -                                  &BytesWritten);
> -        break;
> +        Index++;
> +    }
> 
> -    case OID_GEN_MAXIMUM_FRAME_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->MaximumFrameSize -
> -                                    sizeof(ETHERNET_TAGGED_HEADER),
> -                                &BytesWritten);
> -        break;
> +    status = STATUS_UNSUCCESSFUL;
> +    goto fail2;
> 
> -    case OID_GEN_MAXIMUM_TOTAL_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->MaximumFrameSize -
> -                                    sizeof(ETHERNET_TAGGED_HEADER) +
> -                                    sizeof (ETHERNET_UNTAGGED_HEADER),
> -                                &BytesWritten);
> -        break;
> +update:
> +    status = RtlStringCbPrintfA(Vendor,
> +                                MAXNAMELEN,
> +                                "%s",
> +                                VENDOR_NAME_STR);
> +    ASSERT(NT_SUCCESS(status));
> 
> -    case OID_GEN_CURRENT_LOOKAHEAD:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Adapter->CurrentLookahead,
> -                                &BytesWritten);
> -        break;
> +    for (Index  = 0; Vendor[Index] != '\0'; Index++)
> +        if (!isalnum((UCHAR)Vendor[Index]))
> +            Vendor[Index] = '_';
> 
> -    case OID_GEN_VENDOR_ID:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                0x5853,
> -                                &BytesWritten);
> -        break;
> +    Product = "XENNET";
> 
> -    case OID_GEN_LINK_SPEED:
> -        XENVIF_VIF(MacQueryState,
> -                   &Adapter->VifInterface,
> -                   NULL,
> -                   &Value64,
> -                   NULL);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)(Value64 / 100),
> -                                &BytesWritten);
> -        break;
> +#if DBG
> +#define ATTRIBUTES   "(DEBUG)"
> +#else
> +#define ATTRIBUTES   ""
> +#endif
> 
> -    case OID_GEN_MEDIA_CONNECT_STATUS:
> -        XENVIF_VIF(MacQueryState,
> -                    &Adapter->VifInterface,
> -                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
> -                    NULL,
> -                    NULL);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +    (VOID) XENBUS_STORE(Printf,
> +                        &Adapter->StoreInterface,
> +                        NULL,
> +                        "drivers",
> +                        Distribution,
> +                        "%s %s %u.%u.%u %s",
> +                        Vendor,
> +                        Product,
> +                        MAJOR_VERSION,
> +                        MINOR_VERSION,
> +                        MICRO_VERSION,
> +                        ATTRIBUTES
> +                        );
> 
> -    case OID_GEN_MAXIMUM_SEND_PACKETS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                16,
> -                                &BytesWritten);
> -        break;
> +#undef  ATTRIBUTES
> 
> -    case OID_GEN_CURRENT_PACKET_FILTER:
> -        AdapterGetPacketFilter(Adapter, &Value32);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +    Trace("<====\n");
> +    return STATUS_SUCCESS;
> 
> -    case OID_GEN_XMIT_OK:
> -        AdapterGetXmitOk(Adapter, &Value64);
> -        BytesNeeded = sizeof(ULONG64);
> -        ndisStatus = __SetUlong64(Buffer,
> -                                  BufferLength,
> -                                  Value64,
> -                                  &BytesWritten);
> -        break;
> +fail2:
> +    Error("fail2\n");
> 
> -    case OID_GEN_RCV_OK:
> -        AdapterGetRcvOk(Adapter, &Value64);
> -        BytesNeeded = sizeof(ULONG64);
> -        ndisStatus = __SetUlong64(Buffer,
> -                                  BufferLength,
> -                                  Value64,
> -                                  &BytesWritten);
> -        break;
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> 
> -    case OID_GEN_XMIT_ERROR:
> -        AdapterGetXmitError(Adapter, &Value32);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +    return status;
> +}
> 
> -    case OID_GEN_RCV_ERROR:
> -        AdapterGetRcvError(Adapter, &Value32);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                Value32,
> -                                &BytesWritten);
> -        break;
> +static DECLSPEC_NOINLINE VOID
> +AdapterSuspendCallbackLate(
> +    IN  PVOID       Argument
> +    )
> +{
> +    PXENNET_ADAPTER Adapter = Argument;
> 
> -    case OID_GEN_RCV_NO_BUFFER:
> -    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
> -    case OID_GEN_RCV_CRC_ERROR:
> -    case OID_802_3_RCV_ERROR_ALIGNMENT:
> -    case OID_802_3_XMIT_ONE_COLLISION:
> -    case OID_802_3_XMIT_MORE_COLLISIONS:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                0,
> -                                &BytesWritten);
> -        break;
> +    (VOID) __AdapterSetDistribution(Adapter);
> +}
> 
> -    case OID_802_3_MAXIMUM_LIST_SIZE:
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                32,
> -                                &BytesWritten);
> -        break;
> +static NTSTATUS
> +AdapterSetDistribution(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    LONG                Count;
> +    NTSTATUS            status;
> 
> -    case OID_GEN_DIRECTED_BYTES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    Trace("====>\n");
> 
> -    case OID_GEN_DIRECTED_FRAMES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    Count = InterlockedIncrement(&AdapterCount);
> +    ASSERT(Count != 0);
> 
> -    case OID_GEN_MULTICAST_BYTES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    if (Count != 1)
> +        goto done;
> 
> -    case OID_GEN_MULTICAST_FRAMES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    status = __AdapterSetDistribution(Adapter);
> +    if (!NT_SUCCESS(status))
> +        goto fail1;
> +
> +    status = XENBUS_SUSPEND(Register,
> +                            &Adapter->SuspendInterface,
> +                            SUSPEND_CALLBACK_LATE,
> +                            AdapterSuspendCallbackLate,
> +                            Adapter,
> +                            &Adapter->SuspendCallbackLate);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +done:
> +    Trace("<====\n");
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    Error("fail2\n");
> +
> +    __AdapterClearDistribution(Adapter);
> +
> +fail1:
> +    Error("fail1 (%08x)\n", status);
> +
> +    return status;
> +}
> +
> +static VOID
> +AdapterClearDistribution(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    LONG                Count;
> +
> +    Trace("====>\n");
> +
> +    Count = InterlockedDecrement(&AdapterCount);
> +
> +    if (Count != 0)
> +        goto done;
> +
> +    XENBUS_SUSPEND(Deregister,
> +                   &Adapter->SuspendInterface,
> +                   Adapter->SuspendCallbackLate);
> +    Adapter->SuspendCallbackLate = NULL;
> +
> +    __AdapterClearDistribution(Adapter);
> +
> +done:
> +    Trace("<====\n");
> +}
> +
> +NDIS_STATUS
> +AdapterEnable(
> +    IN  PXENNET_ADAPTER     Adapter
> +    )
> +{
> +    NTSTATUS                status;
> +    NDIS_STATUS             ndisStatus;
> +
> +    ASSERT(!Adapter->Enabled);
> +
> +    status = XENBUS_CACHE(Acquire,
> +                          &Adapter->CacheInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail1;
> +
> +    status = XENBUS_STORE(Acquire,
> +                          &Adapter->StoreInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail2;
> +
> +    status = XENBUS_SUSPEND(Acquire,
> +                            &Adapter->SuspendInterface);
> +    if (!NT_SUCCESS(status))
> +        goto fail3;
> +
> +    (VOID) AdapterSetDistribution(Adapter);
> +
> +    ndisStatus = TransmitterEnable(Adapter->Transmitter);
> +    if (ndisStatus != NDIS_STATUS_SUCCESS)
> +        goto fail4;
> +
> +    ndisStatus = ReceiverEnable(Adapter->Receiver);
> +    if (ndisStatus != NDIS_STATUS_SUCCESS)
> +        goto fail5;
> +
> +    status = XENVIF_VIF(Enable,
> +                        &Adapter->VifInterface,
> +                        AdapterVifCallback,
> +                        Adapter);
> +    if (!NT_SUCCESS(status))
> +        goto fail6;
> +
> +    AdapterMediaStateChange(Adapter);
> +
> +    Adapter->Enabled = TRUE;
> +
> +    return NDIS_STATUS_SUCCESS;
> +
> +fail6:
> +    ReceiverDisable(Adapter->Receiver);
> +
> +fail5:
> +    TransmitterDisable(Adapter->Transmitter);
> +
> +fail4:
> +    AdapterClearDistribution(Adapter);
> +
> +    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
> +
> +fail3:
> +    XENBUS_STORE(Release, &Adapter->StoreInterface);
> +
> +fail2:
> +    XENBUS_CACHE(Release, &Adapter->CacheInterface);
> +
> +fail1:
> +    return NDIS_STATUS_FAILURE;
> +}
> 
> -    case OID_GEN_BROADCAST_BYTES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +VOID
> +AdapterDisable(
> +    IN  PXENNET_ADAPTER     Adapter
> +    )
> +{
> +    ASSERT(Adapter->Enabled);
> +    Adapter->Enabled = FALSE;
> 
> -    case OID_GEN_BROADCAST_FRAMES_XMIT:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    XENVIF_VIF(Disable,
> +               &Adapter->VifInterface);
> 
> -    case OID_GEN_DIRECTED_BYTES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_UNICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    AdapterMediaStateChange(Adapter);
> 
> -    case OID_GEN_DIRECTED_FRAMES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_UNICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    ReceiverDisable(Adapter->Receiver);
> +    TransmitterDisable(Adapter->Transmitter);
> 
> -    case OID_GEN_MULTICAST_BYTES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_MULTICAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    AdapterClearDistribution(Adapter);
> 
> -    case OID_GEN_MULTICAST_FRAMES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_MULTICAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
> +    XENBUS_STORE(Release, &Adapter->StoreInterface);
> +    XENBUS_CACHE(Release, &Adapter->CacheInterface);
> +}
> 
> -    case OID_GEN_BROADCAST_BYTES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_BROADCAST_OCTETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +VOID
> +AdapterMediaStateChange(
> +    IN  PXENNET_ADAPTER     Adapter
> +    )
> +{
> +    NDIS_LINK_STATE         LinkState;
> +    NDIS_STATUS_INDICATION  StatusIndication;
> 
> -    case OID_GEN_BROADCAST_FRAMES_RCV:
> -        XENVIF_VIF(QueryStatistic,
> -                   &Adapter->VifInterface,
> -                   XENVIF_RECEIVER_BROADCAST_PACKETS,
> -                   &Value64);
> -        BytesNeeded = sizeof(ULONG);
> -        ndisStatus = __SetUlong(Buffer,
> -                                BufferLength,
> -                                (ULONG)Value64,
> -                                &BytesWritten);
> -        break;
> +    RtlZeroMemory(&LinkState, sizeof (NDIS_LINK_STATE));
> +    LinkState.Header.Revision = NDIS_LINK_STATE_REVISION_1;
> +    LinkState.Header.Type = NDIS_OBJECT_TYPE_DEFAULT;
> +    LinkState.Header.Size = sizeof(NDIS_LINK_STATE);
> 
> -    case OID_GEN_INTERRUPT_MODERATION:
> -        BytesNeeded = sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
> -        ndisStatus = AdapterInterruptModeration(Adapter,
> -
> (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
> -                                                BufferLength,
> -                                                &BytesWritten);
> -        break;
> +    XENVIF_VIF(MacQueryState,
> +               &Adapter->VifInterface,
> +               &LinkState.MediaConnectState,
> +               &LinkState.RcvLinkSpeed,
> +               &LinkState.MediaDuplexState);
> 
> -    case OID_IP4_OFFLOAD_STATS:
> -    case OID_IP6_OFFLOAD_STATS:
> -    case OID_GEN_SUPPORTED_GUIDS:
> -        // We don't handle these since NDIS 6.0 is supposed to do this for us
> -    case OID_GEN_MAC_ADDRESS:
> -    case OID_GEN_MAX_LINK_SPEED:
> -        // ignore these common unwanted OIDs
> -	case OID_GEN_INIT_TIME_MS:
> -	case OID_GEN_RESET_COUNTS:
> -	case OID_GEN_MEDIA_SENSE_COUNTS:
> -        Warn = FALSE;
> -        /*FALLTHRU*/
> -    default:
> -        if (Warn)
> -            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> +    if (LinkState.MediaConnectState == MediaConnectStateUnknown) {
> +        Info("LINK: STATE UNKNOWN\n");
> +    } else if (LinkState.MediaConnectState ==
> MediaConnectStateDisconnected) {
> +        Info("LINK: DOWN\n");
> +    } else {
> +        ASSERT3U(LinkState.MediaConnectState, ==,
> MediaConnectStateConnected);
> 
> -        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> -        break;
> +        if (LinkState.MediaDuplexState == MediaDuplexStateHalf)
> +            Info("LINK: UP: SPEED=%u DUPLEX=HALF\n",
> LinkState.RcvLinkSpeed);
> +        else if (LinkState.MediaDuplexState == MediaDuplexStateFull)
> +            Info("LINK: UP: SPEED=%u DUPLEX=FULL\n",
> LinkState.RcvLinkSpeed);
> +        else
> +            Info("LINK: UP: SPEED=%u DUPLEX=UNKNOWN\n",
> LinkState.RcvLinkSpeed);
>      }
> 
> -    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
> -    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
> +    LinkState.XmitLinkSpeed = LinkState.RcvLinkSpeed;
> 
> -    return ndisStatus;
> +    RtlZeroMemory(&StatusIndication, sizeof (NDIS_STATUS_INDICATION));
> +    StatusIndication.Header.Type =
> NDIS_OBJECT_TYPE_STATUS_INDICATION;
> +    StatusIndication.Header.Revision =
> NDIS_STATUS_INDICATION_REVISION_1;
> +    StatusIndication.Header.Size = sizeof (NDIS_STATUS_INDICATION);
> +
> +    StatusIndication.SourceHandle = Adapter->NdisAdapterHandle;
> +    StatusIndication.StatusCode = NDIS_STATUS_LINK_STATE;
> +    StatusIndication.StatusBuffer = &LinkState;
> +    StatusIndication.StatusBufferSize = sizeof (NDIS_LINK_STATE);
> +
> +    NdisMIndicateStatusEx(Adapter->NdisAdapterHandle,
> &StatusIndication);
>  }
> 
> -static NTSTATUS
> -__QueryInterface(
> -    IN  PDEVICE_OBJECT  DeviceObject,
> -    IN  const GUID      *Guid,
> -    IN  ULONG           Version,
> -    OUT PINTERFACE      Interface,
> -    IN  ULONG           Size,
> -    IN  BOOLEAN         Optional
> +NDIS_STATUS
> +AdapterSetInformation(
> +    IN  PXENNET_ADAPTER     Adapter,
> +    IN  PNDIS_OID_REQUEST   Request
>      )
>  {
> -    KEVENT              Event;
> -    IO_STATUS_BLOCK     StatusBlock;
> -    PIRP                Irp;
> -    PIO_STACK_LOCATION  StackLocation;
> -    NTSTATUS            status;
> +    PVOID                   Buffer;
> +    ULONG                   BufferLength;
> +    ULONG                   BytesNeeded;
> +    ULONG                   BytesRead;
> +    BOOLEAN                 Warn;
> +    NDIS_STATUS             ndisStatus;
> 
> -    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
> +    Buffer = Request->DATA.SET_INFORMATION.InformationBuffer;
> +    BufferLength = Request-
> >DATA.SET_INFORMATION.InformationBufferLength;
> +    BytesNeeded = BytesRead = 0;
> +    Warn = TRUE;
> +    ndisStatus = NDIS_STATUS_SUCCESS;
> 
> -    KeInitializeEvent(&Event, NotificationEvent, FALSE);
> -    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
> +    switch (Request->DATA.SET_INFORMATION.Oid) {
> +    case OID_PNP_SET_POWER:
> +        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> +        if (BufferLength >= BytesNeeded) {
> +            PNDIS_DEVICE_POWER_STATE PowerState;
> 
> -    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
> -                                       DeviceObject,
> -                                       NULL,
> -                                       0,
> -                                       NULL,
> -                                       &Event,
> -                                       &StatusBlock);
> +            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
> +            switch (*PowerState) {
> +            case NdisDeviceStateD0:
> +                Info("SET_POWER: D0\n");
> +                break;
> 
> -    status = STATUS_UNSUCCESSFUL;
> -    if (Irp == NULL)
> -        goto fail1;
> +            case NdisDeviceStateD1:
> +                Info("SET_POWER: D1\n");
> +                break;
> 
> -    StackLocation = IoGetNextIrpStackLocation(Irp);
> -    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
> +            case NdisDeviceStateD2:
> +                Info("SET_POWER: D2\n");
> +                break;
> 
> -    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
> -    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
> -    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
> -    StackLocation->Parameters.QueryInterface.Interface = Interface;
> +            case NdisDeviceStateD3:
> +                Info("SET_POWER: D3\n");
> +                break;
> +            }
> +        }
> +        // do nothing
> +        break;
> 
> -    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
> +    case OID_GEN_CURRENT_LOOKAHEAD:
> +        BytesNeeded = sizeof(ULONG);
> +        Adapter->CurrentLookahead = Adapter->MaximumFrameSize;
> +        if (BufferLength == BytesNeeded) {
> +            Adapter->CurrentLookahead = *(PULONG)Buffer;
> +            BytesRead = sizeof(ULONG);
> +        }
> +        break;
> 
> -    status = IoCallDriver(DeviceObject, Irp);
> -    if (status == STATUS_PENDING) {
> -        (VOID) KeWaitForSingleObject(&Event,
> -                                     Executive,
> -                                     KernelMode,
> -                                     FALSE,
> -                                     NULL);
> -        status = StatusBlock.Status;
> -    }
> +    case OID_GEN_CURRENT_PACKET_FILTER:
> +        BytesNeeded = sizeof(ULONG);
> +        if (BufferLength == BytesNeeded) {
> +            ndisStatus = AdapterSetPacketFilter(Adapter,
> +                                                (PULONG)Buffer);
> +            BytesRead = sizeof(ULONG);
> +        }
> +        break;
> 
> -    if (!NT_SUCCESS(status)) {
> -        if (status == STATUS_NOT_SUPPORTED && Optional)
> -            goto done;
> +    case OID_802_3_MULTICAST_LIST:
> +        BytesNeeded = ETHERNET_ADDRESS_LENGTH;
> +        if (BufferLength % ETHERNET_ADDRESS_LENGTH == 0) {
> +            ndisStatus = AdapterSetMulticastAddresses(Adapter,
> +                                                      Buffer,
> +                                                      BufferLength / ETHERNET_ADDRESS_LENGTH);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = BufferLength;
> +        } else {
> +            ndisStatus = NDIS_STATUS_INVALID_LENGTH;
> +        }
> +        break;
> 
> -        goto fail2;
> -    }
> +    case OID_OFFLOAD_ENCAPSULATION:
> +        BytesNeeded = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> +        if (BufferLength >= BytesNeeded) {
> +            ndisStatus = AdapterGetOffloadEncapsulation(Adapter,
> +                                                        (PNDIS_OFFLOAD_ENCAPSULATION)Buffer);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = sizeof(NDIS_OFFLOAD_ENCAPSULATION);
> +        }
> +        break;
> 
> -done:
> -    return STATUS_SUCCESS;
> +    case OID_TCP_OFFLOAD_PARAMETERS:
> +        BytesNeeded = sizeof(NDIS_OFFLOAD_PARAMETERS);
> +        if (BufferLength >= BytesNeeded) {
> +            ndisStatus = AdapterGetTcpOffloadParameters(Adapter,
> +                                                        (PNDIS_OFFLOAD_PARAMETERS)Buffer);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = sizeof(NDIS_OFFLOAD_PARAMETERS);
> +        }
> +        break;
> 
> -fail2:
> -    Error("fail2\n");
> +    case OID_GEN_HD_SPLIT_PARAMETERS:
> +        BytesNeeded = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> +        if (BufferLength >= BytesNeeded) {
> +            ndisStatus = AdapterGetHeaderDataSplitParameters(Adapter,
> +                                                             (PNDIS_HD_SPLIT_PARAMETERS)Buffer);
> +            if (ndisStatus == NDIS_STATUS_SUCCESS)
> +                BytesRead = sizeof(NDIS_HD_SPLIT_PARAMETERS);
> +        }
> +        break;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    case OID_GEN_INTERRUPT_MODERATION:
> +    case OID_GEN_MACHINE_NAME:
> +        Warn = FALSE;
> +        /*FALLTHRU*/
> +    default:
> +        if (Warn)
> +            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> 
> -    return status;
> -}
> +        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> +        break;
> +    }
> 
> -#pragma prefast(push)
> -#pragma prefast(disable:6102)
> +    Request->DATA.SET_INFORMATION.BytesNeeded = BytesNeeded;
> +    if (ndisStatus == NDIS_STATUS_SUCCESS)
> +        Request->DATA.SET_INFORMATION.BytesRead = BytesRead;
> 
> -#define READ_PROPERTY(field, name, defaultval, handle)  \
> -    do {                                                \
> -        NDIS_STATUS                     _Status;        \
> -        NDIS_STRING                     _Value;         \
> -        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
> -        RtlInitUnicodeString(&_Value, name);            \
> -        NdisReadConfiguration(&_Status, &_Data, handle, \
> -                        &_Value, NdisParameterInteger); \
> -        if (_Status == NDIS_STATUS_SUCCESS)             \
> -            field = _Data->ParameterData.IntegerData;   \
> -        else                                            \
> -            field = defaultval;                         \
> -    } while (FALSE);
> +    return ndisStatus;
> +}
> 
> -static NDIS_STATUS
> -AdapterGetAdvancedSettings(
> -    IN  PXENNET_ADAPTER Adapter
> +static FORCEINLINE NDIS_STATUS
> +__CopyBuffer(
> +    IN  PVOID   Destination,
> +    IN  ULONG   DestinationLength,
> +    IN  PVOID   Source,
> +    IN  ULONG   SourceLength,
> +    OUT PULONG  CopyLength
>      )
>  {
> -    NDIS_CONFIGURATION_OBJECT   Config;
> -    NDIS_HANDLE                 Handle;
> -    NDIS_STATUS                 ndisStatus;
> -
> -    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
> -    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
> -    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
> -    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
> -    Config.NdisHandle = Adapter->NdisAdapterHandle;
> -    Config.Flags = 0;
> -
> -    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
> -    if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail1;
> -
> -    READ_PROPERTY(Adapter->Properties.ipv4_csum,
> L"*IPChecksumOffloadIPv4", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.tcpv4_csum,
> L"*TCPChecksumOffloadIPv4", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.udpv4_csum,
> L"*UDPChecksumOffloadIPv4", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.tcpv6_csum,
> L"*TCPChecksumOffloadIPv6", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.udpv6_csum,
> L"*UDPChecksumOffloadIPv6", 3, Handle);
> -    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.need_csum_value,
> L"NeedChecksumValue", 1, Handle);
> -    READ_PROPERTY(Adapter->Properties.HeaderDataSplit,
> L"*HeaderDataSplit", 1, Handle);
> -
> -    NdisCloseConfiguration(Handle);
> -
> -    return NDIS_STATUS_SUCCESS;
> +    *CopyLength = __min(SourceLength, DestinationLength);
> +    RtlCopyMemory(Destination, Source, *CopyLength);
> 
> -fail1:
> -    return NDIS_STATUS_FAILURE;
> +    return (DestinationLength >= SourceLength) ?
> +           NDIS_STATUS_SUCCESS :
> +           NDIS_STATUS_BUFFER_TOO_SHORT;
>  }
> 
> -#undef READ_PROPERTY
> -
> -#pragma prefast(pop)
> -
> -static NDIS_STATUS
> -AdapterSetRegistrationAttributes(
> -    IN  PXENNET_ADAPTER Adapter
> +static FORCEINLINE NDIS_STATUS
> +__SetUlong(
> +    IN  PVOID   Destination,
> +    IN  ULONG   DestinationLength,
> +    IN  ULONG   Source,
> +    OUT PULONG  CopyLength
>      )
>  {
> -    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
> -    NDIS_STATUS                                     ndisStatus;
> +    return __CopyBuffer(Destination,
> +                        DestinationLength & ~3,
> +                        &Source,
> +                        sizeof (ULONG),
> +                        CopyLength);
> +}
> 
> -    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
> -    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
> -    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
> -                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
> -    Attribs.CheckForHangTimeInSeconds = 0;
> -    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
> +static FORCEINLINE NDIS_STATUS
> +__SetUlong64(
> +    IN  PVOID   Destination,
> +    IN  ULONG   DestinationLength,
> +    IN  ULONG64 Source,
> +    OUT PULONG  CopyLength
> +    )
> +{
> +    NDIS_STATUS ndisStatus;
> 
> -    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    ndisStatus =  __CopyBuffer(Destination,
> +                               DestinationLength & ~3,
> +                               &Source,
> +                               sizeof (ULONG64),
> +                               CopyLength);
> +    if (DestinationLength >= 4)
> +        ndisStatus = NDIS_STATUS_SUCCESS;
> 
>      return ndisStatus;
>  }
> 
> -static NDIS_STATUS
> -AdapterSetGeneralAttributes(
> -    IN  PXENNET_ADAPTER Adapter
> +NDIS_STATUS
> +AdapterQueryInformation(
> +    IN  PXENNET_ADAPTER     Adapter,
> +    IN  PNDIS_OID_REQUEST   Request
>      )
>  {
> -    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
> -    NDIS_STATUS                                 ndisStatus;
> -
> -    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
> -    Attribs.MediaType = XENNET_MEDIA_TYPE;
> -
> -    XENVIF_VIF(MacQueryMaximumFrameSize,
> -               &Adapter->VifInterface,
> -               (PULONG)&Adapter->MaximumFrameSize);
> -
> -    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof
> (ETHERNET_TAGGED_HEADER);
> -    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> -    Attribs.MediaConnectState = MediaConnectStateConnected;
> -    Attribs.MediaDuplexState = MediaDuplexStateFull;
> -    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
> -    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
> -    Attribs.MacOptions = XENNET_MAC_OPTIONS;
> -    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
> -    Attribs.MaxMulticastListSize = 32;
> -    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
> -
> -    XENVIF_VIF(MacQueryPermanentAddress,
> -               &Adapter->VifInterface,
> -               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
> -    XENVIF_VIF(MacQueryCurrentAddress,
> -               &Adapter->VifInterface,
> -               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
> +    PVOID                   Buffer;
> +    ULONG                   BufferLength;
> +    ULONG                   BytesNeeded;
> +    ULONG                   BytesWritten;
> +    ULONG                   Value32;
> +    ULONGLONG               Value64;
> +    ETHERNET_ADDRESS        EthernetAddress;
> +    BOOLEAN                 Warn;
> +    NDIS_STATUS             ndisStatus;
> 
> -    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
> -    Attribs.RecvScaleCapabilities = NULL;
> -    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
> -    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
> -    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
> -    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
> -    Attribs.IfConnectorPresent = TRUE;
> -    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
> -                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
> -
> NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED
> |
> -
> NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
> -                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
> -                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED
> |
> -                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
> -                                  NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED
> |
> -                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
> -
> -    Attribs.SupportedOidList = XennetSupportedOids;
> -    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
> +    Buffer = Request->DATA.QUERY_INFORMATION.InformationBuffer;
> +    BufferLength = Request-
> >DATA.QUERY_INFORMATION.InformationBufferLength;
> +    BytesNeeded = BytesWritten = 0;
> +    Warn = TRUE;
> +    ndisStatus = NDIS_STATUS_SUCCESS;
> 
> -    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    switch (Request->DATA.QUERY_INFORMATION.Oid) {
> +    case OID_PNP_CAPABILITIES:
> +        BytesNeeded = sizeof(Adapter->Capabilities);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &Adapter->Capabilities,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    return ndisStatus;
> -}
> +    case OID_PNP_QUERY_POWER:
> +        BytesNeeded = sizeof(NDIS_DEVICE_POWER_STATE);
> 
> -static NDIS_STATUS
> -AdapterSetOffloadAttributes(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
> -    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
> -    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
> -    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
> -    NDIS_OFFLOAD                                Default;
> -    NDIS_OFFLOAD                                Supported;
> -    NDIS_STATUS                                 ndisStatus;
> +        if (BufferLength >= BytesNeeded) {
> +            PNDIS_DEVICE_POWER_STATE PowerState;
> 
> -    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
> -    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
> +            PowerState = (PNDIS_DEVICE_POWER_STATE)Buffer;
> +            switch (*PowerState) {
> +            case NdisDeviceStateD0:
> +                Info("QUERY_POWER: D0\n");
> +                break;
> 
> -    TxOptions->Value = 0;
> -    TxOptions->OffloadTagManipulation = 1;
> +            case NdisDeviceStateD1:
> +                Info("QUERY_POWER: D1\n");
> +                break;
> 
> -    RxOptions->Value = 0;
> -    RxOptions->OffloadTagManipulation = 1;
> +            case NdisDeviceStateD2:
> +                Info("QUERY_POWER: D2\n");
> +                break;
> 
> -    if (Adapter->Properties.need_csum_value)
> -        RxOptions->NeedChecksumValue = 1;
> +            case NdisDeviceStateD3:
> +                Info("QUERY_POWER: D3\n");
> +                break;
> +            }
> +        }
> 
> -    if (Adapter->Properties.lrov4) {
> -        RxOptions->OffloadIpVersion4LargePacket = 1;
> -        RxOptions->NeedLargePacketSplit = 1;
> -    }
> +        BytesWritten = 0;
> +        // do nothing
> +        break;
> 
> -    if (Adapter->Properties.lrov6) {
> -        RxOptions->OffloadIpVersion6LargePacket = 1;
> -        RxOptions->NeedLargePacketSplit = 1;
> -    }
> +    case OID_GEN_SUPPORTED_LIST:
> +        BytesNeeded = sizeof(XennetSupportedOids);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &XennetSupportedOids[0],
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    XENVIF_VIF(ReceiverSetOffloadOptions,
> -               &Adapter->VifInterface,
> -               *RxOptions);
> +    case OID_GEN_HARDWARE_STATUS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                NdisHardwareStatusReady,
> +                                &BytesWritten);
> +        break;
> 
> -    XENVIF_VIF(TransmitterQueryOffloadOptions,
> -               &Adapter->VifInterface,
> -               &Options);
> +    case OID_GEN_MEDIA_SUPPORTED:
> +    case OID_GEN_MEDIA_IN_USE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                XENNET_MEDIA_TYPE,
> +                                &BytesWritten);
> +        break;
> 
> -    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
> -    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
> -    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
> -    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
> +    case OID_GEN_MAXIMUM_LOOKAHEAD:
> +    case OID_GEN_TRANSMIT_BLOCK_SIZE:
> +    case OID_GEN_RECEIVE_BLOCK_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->MaximumFrameSize,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_GEN_TRANSMIT_BUFFER_SPACE:
> +    case OID_GEN_RECEIVE_BUFFER_SPACE:
> +        XENVIF_VIF(TransmitterQueryRingSize,
> +                    &Adapter->VifInterface,
> +                    (PULONG)&Value32);
> +        Value32 *= Adapter->MaximumFrameSize;
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.IpChecksum = 1;
> -    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
> +    case OID_GEN_VENDOR_DESCRIPTION:
> +        BytesNeeded = (ULONG)strlen(VENDOR_NAME_STR) + 1;
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  VENDOR_NAME_STR,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
> -    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
> +    case OID_GEN_VENDOR_DRIVER_VERSION:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                ((MAJOR_VERSION << 8) | MINOR_VERSION) << 8,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
> +    case OID_GEN_DRIVER_VERSION:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (6 << 8) | 0, // NDIS 6.0
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_GEN_MAC_OPTIONS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                XENNET_MAC_OPTIONS,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
> +    case OID_GEN_STATISTICS:
> +        BytesNeeded = sizeof(NDIS_STATISTICS_INFO);
> +        ndisStatus = AdapterQueryGeneralStatistics(Adapter,
> +                                                   (PNDIS_STATISTICS_INFO)Buffer,
> +                                                   BufferLength,
> +                                                   &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
> -    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
> +    case OID_802_3_MULTICAST_LIST:
> +        ndisStatus = AdapterQueryMulticastList(Adapter,
> +                                               Buffer,
> +                                               BufferLength,
> +                                               &BytesNeeded,
> +                                               &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
> +    case OID_802_3_PERMANENT_ADDRESS:
> +        XENVIF_VIF(MacQueryPermanentAddress,
> +                    &Adapter->VifInterface,
> +                    &EthernetAddress);
> +        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &EthernetAddress,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv4Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_802_3_CURRENT_ADDRESS:
> +        XENVIF_VIF(MacQueryCurrentAddress,
> +                    &Adapter->VifInterface,
> +                    &EthernetAddress);
> +        BytesNeeded = sizeof(ETHERNET_ADDRESS);
> +        ndisStatus = __CopyBuffer(Buffer,
> +                                  BufferLength,
> +                                  &EthernetAddress,
> +                                  BytesNeeded,
> +                                  &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MAXIMUM_FRAME_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->MaximumFrameSize -
> +                                    sizeof(ETHERNET_TAGGED_HEADER),
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MAXIMUM_TOTAL_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->MaximumFrameSize -
> +                                    sizeof(ETHERNET_TAGGED_HEADER) +
> +                                    sizeof (ETHERNET_UNTAGGED_HEADER),
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_CURRENT_LOOKAHEAD:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Adapter->CurrentLookahead,
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_VENDOR_ID:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                0x5853,
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_LINK_SPEED:
> +        XENVIF_VIF(MacQueryState,
> +                   &Adapter->VifInterface,
> +                   NULL,
> +                   &Value64,
> +                   NULL);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)(Value64 / 100),
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MEDIA_CONNECT_STATUS:
> +        XENVIF_VIF(MacQueryState,
> +                    &Adapter->VifInterface,
> +                    (PNET_IF_MEDIA_CONNECT_STATE)&Value32,
> +                    NULL,
> +                    NULL);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> +
> +    case OID_GEN_MAXIMUM_SEND_PACKETS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                16,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4HeaderChecksum) {
> -        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
> -        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
> -    }
> +    case OID_GEN_CURRENT_PACKET_FILTER:
> +        AdapterGetPacketFilter(Adapter, &Value32);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4TcpChecksum) {
> -        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
> -        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
> -    }
> +    case OID_GEN_XMIT_OK:
> +        AdapterGetXmitOk(Adapter, &Value64);
> +        BytesNeeded = sizeof(ULONG64);
> +        ndisStatus = __SetUlong64(Buffer,
> +                                  BufferLength,
> +                                  Value64,
> +                                  &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4UdpChecksum)
> -        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
> +    case OID_GEN_RCV_OK:
> +        AdapterGetRcvOk(Adapter, &Value64);
> +        BytesNeeded = sizeof(ULONG64);
> +        ndisStatus = __SetUlong64(Buffer,
> +                                  BufferLength,
> +                                  Value64,
> +                                  &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +    case OID_GEN_XMIT_ERROR:
> +        AdapterGetXmitError(Adapter, &Value32);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
> +    case OID_GEN_RCV_ERROR:
> +        AdapterGetRcvError(Adapter, &Value32);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                Value32,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion6TcpChecksum) {
> -        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
> -        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
> -    }
> +    case OID_GEN_RCV_NO_BUFFER:
> +    case OID_GEN_TRANSMIT_QUEUE_LENGTH:
> +    case OID_GEN_RCV_CRC_ERROR:
> +    case OID_802_3_RCV_ERROR_ALIGNMENT:
> +    case OID_802_3_XMIT_ONE_COLLISION:
> +    case OID_802_3_XMIT_MORE_COLLISIONS:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                0,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion6UdpChecksum)
> -        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
> +    case OID_802_3_MAXIMUM_LIST_SIZE:
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                32,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion4LargePacket) {
> -        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +    case OID_GEN_DIRECTED_BYTES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
>                     &Adapter->VifInterface,
> -                   4,
> -                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
> -        Supported.LsoV2.IPv4.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> -        Supported.LsoV2.IPv4.MinSegmentCount = 2;
> -    }
> +                   XENVIF_TRANSMITTER_UNICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (Options.OffloadIpVersion6LargePacket) {
> -        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +    case OID_GEN_DIRECTED_FRAMES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
>                     &Adapter->VifInterface,
> -                   6,
> -                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
> -        Supported.LsoV2.IPv6.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> -        Supported.LsoV2.IPv6.MinSegmentCount = 2;
> -        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
> -        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
> -    }
> -
> -    Default = Supported;
> +                   XENVIF_TRANSMITTER_UNICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.ipv4_csum & 2))
> -        Default.Checksum.IPv4Receive.IpChecksum = 0;
> +    case OID_GEN_MULTICAST_BYTES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_MULTICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv4_csum & 2))
> -        Default.Checksum.IPv4Receive.TcpChecksum = 0;
> +    case OID_GEN_MULTICAST_FRAMES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_MULTICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv4_csum & 2))
> -        Default.Checksum.IPv4Receive.UdpChecksum = 0;
> +    case OID_GEN_BROADCAST_BYTES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_BROADCAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv6_csum & 2))
> -        Default.Checksum.IPv6Receive.TcpChecksum = 0;
> +    case OID_GEN_BROADCAST_FRAMES_XMIT:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_TRANSMITTER_BROADCAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv6_csum & 2))
> -        Default.Checksum.IPv6Receive.UdpChecksum = 0;
> +    case OID_GEN_DIRECTED_BYTES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_UNICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.ipv4_csum & 1))
> -        Default.Checksum.IPv4Transmit.IpChecksum = 0;
> +    case OID_GEN_DIRECTED_FRAMES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_UNICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv4_csum & 1))
> -        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
> +    case OID_GEN_MULTICAST_BYTES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_MULTICAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv4_csum & 1))
> -        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
> +    case OID_GEN_MULTICAST_FRAMES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_MULTICAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.tcpv6_csum & 1))
> -        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
> +    case OID_GEN_BROADCAST_BYTES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_BROADCAST_OCTETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.udpv6_csum & 1))
> -        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
> +    case OID_GEN_BROADCAST_FRAMES_RCV:
> +        XENVIF_VIF(QueryStatistic,
> +                   &Adapter->VifInterface,
> +                   XENVIF_RECEIVER_BROADCAST_PACKETS,
> +                   &Value64);
> +        BytesNeeded = sizeof(ULONG);
> +        ndisStatus = __SetUlong(Buffer,
> +                                BufferLength,
> +                                (ULONG)Value64,
> +                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.lsov4)) {
> -        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
> -        Default.LsoV2.IPv4.MinSegmentCount = 0;
> -    }
> +    case OID_GEN_INTERRUPT_MODERATION:
> +        BytesNeeded =
> sizeof(NDIS_INTERRUPT_MODERATION_PARAMETERS);
> +        ndisStatus = AdapterInterruptModeration(Adapter,
> +
> (PNDIS_INTERRUPT_MODERATION_PARAMETERS)Buffer,
> +                                                BufferLength,
> +                                                &BytesWritten);
> +        break;
> 
> -    if (!(Adapter->Properties.lsov6)) {
> -        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
> -        Default.LsoV2.IPv6.MinSegmentCount = 0;
> -    }
> +    case OID_IP4_OFFLOAD_STATS:
> +    case OID_IP6_OFFLOAD_STATS:
> +    case OID_GEN_SUPPORTED_GUIDS:
> +        // We don't handle these since NDIS 6.0 is supposed to do this for us
> +    case OID_GEN_MAC_ADDRESS:
> +    case OID_GEN_MAX_LINK_SPEED:
> +        // ignore these common unwanted OIDs
> +	case OID_GEN_INIT_TIME_MS:
> +	case OID_GEN_RESET_COUNTS:
> +	case OID_GEN_MEDIA_SENSE_COUNTS:
> +        Warn = FALSE;
> +        /*FALLTHRU*/
> +    default:
> +        if (Warn)
> +            Warning("UNSUPPORTED OID %08x\n", Request-
> >DATA.QUERY_INFORMATION.Oid);
> 
> -    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof
> (NDIS_OFFLOAD))) {
> -        Adapter->Offload = Default;
> -        DISPLAY_OFFLOAD(Default);
> +        ndisStatus = NDIS_STATUS_NOT_SUPPORTED;
> +        break;
>      }
> 
> -    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size = sizeof(Attribs);
> -    Attribs.DefaultOffloadConfiguration = &Default;
> -    Attribs.HardwareOffloadCapabilities = &Supported;
> +    Request->DATA.QUERY_INFORMATION.BytesWritten = BytesWritten;
> +    Request->DATA.QUERY_INFORMATION.BytesNeeded = BytesNeeded;
> 
> -    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
>      return ndisStatus;
>  }
> 
> -static NDIS_STATUS
> -AdapterSetHeaderDataSplitAttributes(
> -    IN  PXENNET_ADAPTER                                 Adapter
> +static NTSTATUS
> +__QueryInterface(
> +    IN  PDEVICE_OBJECT  DeviceObject,
> +    IN  const GUID      *Guid,
> +    IN  ULONG           Version,
> +    OUT PINTERFACE      Interface,
> +    IN  ULONG           Size,
> +    IN  BOOLEAN         Optional
>      )
>  {
> -    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
> -    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
> -    NDIS_STATUS                                         NdisStatus;
> -
> -    RtlZeroMemory(&Attribs, sizeof(Attribs));
> +    KEVENT              Event;
> +    IO_STATUS_BLOCK     StatusBlock;
> +    PIRP                Irp;
> +    PIO_STACK_LOCATION  StackLocation;
> +    NTSTATUS            status;
> 
> -    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES
> ;
> -    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
> -    Attribs.Header.Size =
> NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVI
> SION_1;
> +    ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
> 
> -    RtlZeroMemory(&Split, sizeof(Split));
> +    KeInitializeEvent(&Event, NotificationEvent, FALSE);
> +    RtlZeroMemory(&StatusBlock, sizeof(IO_STATUS_BLOCK));
> 
> -    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
> -    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
> -    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
> -    Split.HardwareCapabilities =
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
> -        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
> +    Irp = IoBuildSynchronousFsdRequest(IRP_MJ_PNP,
> +                                       DeviceObject,
> +                                       NULL,
> +                                       0,
> +                                       NULL,
> +                                       &Event,
> +                                       &StatusBlock);
> 
> -    if (Adapter->Properties.HeaderDataSplit != 0)
> -        Split.CurrentCapabilities = Split.HardwareCapabilities;
> +    status = STATUS_UNSUCCESSFUL;
> +    if (Irp == NULL)
> +        goto fail1;
> 
> -    Attribs.HDSplitAttributes = &Split;
> +    StackLocation = IoGetNextIrpStackLocation(Irp);
> +    StackLocation->MinorFunction = IRP_MN_QUERY_INTERFACE;
> 
> -    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> -                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> -    if (NdisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail1;
> +    StackLocation->Parameters.QueryInterface.InterfaceType = Guid;
> +    StackLocation->Parameters.QueryInterface.Size = (USHORT)Size;
> +    StackLocation->Parameters.QueryInterface.Version = (USHORT)Version;
> +    StackLocation->Parameters.QueryInterface.Interface = Interface;
> 
> -    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
> -        ASSERT(Split.CurrentCapabilities &
> NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
> +    Irp->IoStatus.Status = STATUS_NOT_SUPPORTED;
> 
> -        Info("BackfillSize = %u\n", Split.BackfillSize);
> -        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
> +    status = IoCallDriver(DeviceObject, Irp);
> +    if (status == STATUS_PENDING) {
> +        (VOID) KeWaitForSingleObject(&Event,
> +                                     Executive,
> +                                     KernelMode,
> +                                     FALSE,
> +                                     NULL);
> +        status = StatusBlock.Status;
> +    }
> 
> -        XENVIF_VIF(ReceiverSetBackfillSize,
> -                   &Adapter->VifInterface,
> -                   Split.BackfillSize);
> +    if (!NT_SUCCESS(status)) {
> +        if (status == STATUS_NOT_SUPPORTED && Optional)
> +            goto done;
> 
> -        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
> +        goto fail2;
>      }
> 
> -    return NDIS_STATUS_SUCCESS;
> +done:
> +    return STATUS_SUCCESS;
> +
> +fail2:
> +    Error("fail2\n");
> 
>  fail1:
> -    Error("fail1 (%08x)\n", NdisStatus);
> +    Error("fail1 (%08x)\n", status);
> 
> -    return NdisStatus;
> +    return status;
>  }
> 
> -static FORCEINLINE PVOID
> -__AdapterAllocate(
> -    IN  ULONG   Length
> -    )
> -{
> -    return __AllocateNonPagedPoolWithTag(Length, ADAPTER_POOL_TAG);
> -}
> +#pragma prefast(push)
> +#pragma prefast(disable:6102)
> 
> -static FORCEINLINE VOID
> -__AdapterFree(
> -    IN  PVOID   Buffer
> -    )
> -{
> -    __FreePoolWithTag(Buffer, ADAPTER_POOL_TAG);
> -}
> +#define READ_PROPERTY(field, name, defaultval, handle)  \
> +    do {                                                \
> +        NDIS_STATUS                     _Status;        \
> +        NDIS_STRING                     _Value;         \
> +        PNDIS_CONFIGURATION_PARAMETER   _Data;          \
> +        RtlInitUnicodeString(&_Value, name);            \
> +        NdisReadConfiguration(&_Status, &_Data, handle, \
> +                        &_Value, NdisParameterInteger); \
> +        if (_Status == NDIS_STATUS_SUCCESS)             \
> +            field = _Data->ParameterData.IntegerData;   \
> +        else                                            \
> +            field = defaultval;                         \
> +    } while (FALSE);
> 
> -static FORCEINLINE PANSI_STRING
> -__AdapterMultiSzToUpcaseAnsi(
> -    IN  PCHAR       Buffer
> +static NDIS_STATUS
> +AdapterGetAdvancedSettings(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    PANSI_STRING    Ansi;
> -    LONG            Index;
> -    LONG            Count;
> -    NTSTATUS        status;
> -
> -    Index = 0;
> -    Count = 0;
> -    for (;;) {
> -        if (Buffer[Index] == '\0') {
> -            Count++;
> -            Index++;
> -
> -            // Check for double NUL
> -            if (Buffer[Index] == '\0')
> -                break;
> -        } else {
> -            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
> -            Index++;
> -        }
> -    }
> +    NDIS_CONFIGURATION_OBJECT   Config;
> +    NDIS_HANDLE                 Handle;
> +    NDIS_STATUS                 ndisStatus;
> 
> -    Ansi = __AdapterAllocate(sizeof (ANSI_STRING) * (Count + 1));
> +    RtlZeroMemory(&Config, sizeof(NDIS_CONFIGURATION_OBJECT));
> +    Config.Header.Type = NDIS_OBJECT_TYPE_CONFIGURATION_OBJECT;
> +    Config.Header.Revision = NDIS_CONFIGURATION_OBJECT_REVISION_1;
> +    Config.Header.Size = sizeof(NDIS_CONFIGURATION_OBJECT);
> +    Config.NdisHandle = Adapter->NdisAdapterHandle;
> +    Config.Flags = 0;
> 
> -    status = STATUS_NO_MEMORY;
> -    if (Ansi == NULL)
> +    ndisStatus = NdisOpenConfigurationEx(&Config, &Handle);
> +    if (ndisStatus != NDIS_STATUS_SUCCESS)
>          goto fail1;
> 
> -    for (Index = 0; Index < Count; Index++) {
> -        ULONG   Length;
> -
> -        Length = (ULONG)strlen(Buffer);
> -        Ansi[Index].MaximumLength = (USHORT)(Length + 1);
> -        Ansi[Index].Buffer = __AdapterAllocate(Ansi[Index].MaximumLength);
> -
> -        status = STATUS_NO_MEMORY;
> -        if (Ansi[Index].Buffer == NULL)
> -            goto fail2;
> -
> -        RtlCopyMemory(Ansi[Index].Buffer, Buffer, Length);
> -        Ansi[Index].Length = (USHORT)Length;
> -
> -        Buffer += Length + 1;
> -    }
> -
> -    return Ansi;
> -
> -fail2:
> -    Error("fail2\n");
> +    READ_PROPERTY(Adapter->Properties.ipv4_csum,
> L"*IPChecksumOffloadIPv4", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.tcpv4_csum,
> L"*TCPChecksumOffloadIPv4", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.udpv4_csum,
> L"*UDPChecksumOffloadIPv4", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.tcpv6_csum,
> L"*TCPChecksumOffloadIPv6", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.udpv6_csum,
> L"*UDPChecksumOffloadIPv6", 3, Handle);
> +    READ_PROPERTY(Adapter->Properties.lsov4, L"*LSOv2IPv4", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.lsov6, L"*LSOv2IPv6", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.lrov4, L"LROIPv4", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.lrov6, L"LROIPv6", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.need_csum_value,
> L"NeedChecksumValue", 1, Handle);
> +    READ_PROPERTY(Adapter->Properties.HeaderDataSplit,
> L"*HeaderDataSplit", 1, Handle);
> 
> -    while (--Index >= 0)
> -        __AdapterFree(Ansi[Index].Buffer);
> +    NdisCloseConfiguration(Handle);
> 
> -    __AdapterFree(Ansi);
> +    return NDIS_STATUS_SUCCESS;
> 
>  fail1:
> -    Error("fail1 (%08x)\n", status);
> -
> -    return NULL;
> +    return NDIS_STATUS_FAILURE;
>  }
> 
> -static FORCEINLINE VOID
> -__AdapterFreeAnsi(
> -    IN  PANSI_STRING    Ansi
> +#undef READ_PROPERTY
> +
> +#pragma prefast(pop)
> +
> +static NDIS_STATUS
> +AdapterSetRegistrationAttributes(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    ULONG               Index;
> +    NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES   Attribs;
> +    NDIS_STATUS                                     ndisStatus;
> +
> +    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES));
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_REGISTRATION_ATTRIBUTES);
> +    Attribs.MiniportAdapterContext = (NDIS_HANDLE)Adapter;
> +    Attribs.AttributeFlags = NDIS_MINIPORT_ATTRIBUTES_BUS_MASTER |
> +                             NDIS_MINIPORT_ATTRIBUTES_NO_HALT_ON_SUSPEND;
> +    Attribs.CheckForHangTimeInSeconds = 0;
> +    Attribs.InterfaceType = XENNET_INTERFACE_TYPE;
> 
> -    for (Index = 0; Ansi[Index].Buffer != NULL; Index++)
> -        __AdapterFree(Ansi[Index].Buffer);
> +    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> 
> -    __AdapterFree(Ansi);
> +    return ndisStatus;
>  }
> 
> -static FORCEINLINE BOOLEAN
> -__AdapterMatchDistribution(
> -    IN  PXENNET_ADAPTER Adapter,
> -    IN  PCHAR           Buffer
> +static NDIS_STATUS
> +AdapterSetGeneralAttributes(
> +    IN  PXENNET_ADAPTER Adapter
>      )
>  {
> -    PCHAR               Vendor;
> -    PCHAR               Product;
> -    PCHAR               Context;
> -    const CHAR          *Text;
> -    BOOLEAN             Match;
> -    ULONG               Index;
> -    NTSTATUS            status;
> +    NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES    Attribs;
> +    NDIS_STATUS                                 ndisStatus;
> 
> -    UNREFERENCED_PARAMETER(Adapter);
> +    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES));
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size =
> sizeof(NDIS_MINIPORT_ADAPTER_GENERAL_ATTRIBUTES);
> +    Attribs.MediaType = XENNET_MEDIA_TYPE;
> 
> -    status = STATUS_INVALID_PARAMETER;
> +    XENVIF_VIF(MacQueryMaximumFrameSize,
> +               &Adapter->VifInterface,
> +               (PULONG)&Adapter->MaximumFrameSize);
> 
> -    Vendor = __strtok_r(Buffer, " ", &Context);
> -    if (Vendor == NULL)
> -        goto fail1;
> +    Attribs.MtuSize = Adapter->MaximumFrameSize - sizeof
> (ETHERNET_TAGGED_HEADER);
> +    Attribs.MaxXmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.MaxRcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.XmitLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.RcvLinkSpeed = XENNET_MEDIA_MAX_SPEED;
> +    Attribs.MediaConnectState = MediaConnectStateConnected;
> +    Attribs.MediaDuplexState = MediaDuplexStateFull;
> +    Attribs.LookaheadSize = Adapter->MaximumFrameSize;
> +    Attribs.PowerManagementCapabilities = &Adapter->Capabilities;
> +    Attribs.MacOptions = XENNET_MAC_OPTIONS;
> +    Attribs.SupportedPacketFilters = XENNET_SUPPORTED_PACKET_FILTERS;
> +    Attribs.MaxMulticastListSize = 32;
> +    Attribs.MacAddressLength = ETHERNET_ADDRESS_LENGTH;
> 
> -    Product = __strtok_r(NULL, " ", &Context);
> -    if (Product == NULL)
> -        goto fail2;
> +    XENVIF_VIF(MacQueryPermanentAddress,
> +               &Adapter->VifInterface,
> +               (PETHERNET_ADDRESS)&Attribs.PermanentMacAddress);
> +    XENVIF_VIF(MacQueryCurrentAddress,
> +               &Adapter->VifInterface,
> +               (PETHERNET_ADDRESS)&Attribs.CurrentMacAddress);
> 
> -    Match = TRUE;
> +    Attribs.PhysicalMediumType = NdisPhysicalMedium802_3;
> +    Attribs.RecvScaleCapabilities = NULL;
> +    Attribs.AccessType = NET_IF_ACCESS_BROADCAST;
> +    Attribs.DirectionType = NET_IF_DIRECTION_SENDRECEIVE;
> +    Attribs.ConnectionType = NET_IF_CONNECTION_DEDICATED;
> +    Attribs.IfType = IF_TYPE_ETHERNET_CSMACD;
> +    Attribs.IfConnectorPresent = TRUE;
> +    Attribs.SupportedStatistics = NDIS_STATISTICS_XMIT_OK_SUPPORTED |
> +                                  NDIS_STATISTICS_XMIT_ERROR_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_BYTES_XMIT_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_FRAMES_XMIT_SUPPORTED
> |
> +                                  NDIS_STATISTICS_MULTICAST_BYTES_XMIT_SUPPORTED |
> +
> NDIS_STATISTICS_MULTICAST_FRAMES_XMIT_SUPPORTED |
> +                                  NDIS_STATISTICS_BROADCAST_BYTES_XMIT_SUPPORTED
> |
> +
> NDIS_STATISTICS_BROADCAST_FRAMES_XMIT_SUPPORTED |
> +                                  NDIS_STATISTICS_RCV_OK_SUPPORTED |
> +                                  NDIS_STATISTICS_RCV_ERROR_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_BYTES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_DIRECTED_FRAMES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_MULTICAST_BYTES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_MULTICAST_FRAMES_RCV_SUPPORTED
> |
> +                                  NDIS_STATISTICS_BROADCAST_BYTES_RCV_SUPPORTED |
> +
> NDIS_STATISTICS_BROADCAST_FRAMES_RCV_SUPPORTED |
> +                                  NDIS_STATISTICS_GEN_STATISTICS_SUPPORTED;
> +
> +    Attribs.SupportedOidList = XennetSupportedOids;
> +    Attribs.SupportedOidListLength = sizeof(XennetSupportedOids);
> 
> -    Text = VENDOR_NAME_STR;
> +    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> 
> -    for (Index = 0; Text[Index] != 0; Index++) {
> -        if (!isalnum((UCHAR)Text[Index])) {
> -            if (Vendor[Index] != '_') {
> -                Match = FALSE;
> -                break;
> -            }
> -        } else {
> -            if (Vendor[Index] != Text[Index]) {
> -                Match = FALSE;
> -                break;
> -            }
> -        }
> -    }
> +    return ndisStatus;
> +}
> 
> -    Text = "XENNET";
> +static NDIS_STATUS
> +AdapterSetOffloadAttributes(
> +    IN  PXENNET_ADAPTER Adapter
> +    )
> +{
> +    NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES    Attribs;
> +    XENVIF_VIF_OFFLOAD_OPTIONS                  Options;
> +    PXENVIF_VIF_OFFLOAD_OPTIONS                 RxOptions;
> +    PXENVIF_VIF_OFFLOAD_OPTIONS                 TxOptions;
> +    NDIS_OFFLOAD                                Default;
> +    NDIS_OFFLOAD                                Supported;
> +    NDIS_STATUS                                 ndisStatus;
> 
> -    if (_stricmp(Product, Text) != 0)
> -        Match = FALSE;
> +    TxOptions = TransmitterOffloadOptions(Adapter->Transmitter);
> +    RxOptions = ReceiverOffloadOptions(Adapter->Receiver);
> 
> -    return Match;
> +    TxOptions->Value = 0;
> +    TxOptions->OffloadTagManipulation = 1;
> 
> -fail2:
> -    Error("fail2\n");
> +    RxOptions->Value = 0;
> +    RxOptions->OffloadTagManipulation = 1;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    if (Adapter->Properties.need_csum_value)
> +        RxOptions->NeedChecksumValue = 1;
> 
> -    return FALSE;
> -}
> +    if (Adapter->Properties.lrov4) {
> +        RxOptions->OffloadIpVersion4LargePacket = 1;
> +        RxOptions->NeedLargePacketSplit = 1;
> +    }
> 
> -static FORCEINLINE VOID
> -__AdapterClearDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    PCHAR               Buffer;
> -    PANSI_STRING        Distributions;
> -    ULONG               Index;
> -    NTSTATUS            status;
> +    if (Adapter->Properties.lrov6) {
> +        RxOptions->OffloadIpVersion6LargePacket = 1;
> +        RxOptions->NeedLargePacketSplit = 1;
> +    }
> 
> -    Trace("====>\n");
> +    XENVIF_VIF(ReceiverSetOffloadOptions,
> +               &Adapter->VifInterface,
> +               *RxOptions);
> 
> -    status = XENBUS_STORE(Directory,
> -                          &Adapter->StoreInterface,
> -                          NULL,
> -                          NULL,
> -                          "drivers",
> -                          &Buffer);
> -    if (NT_SUCCESS(status)) {
> -        Distributions = __AdapterMultiSzToUpcaseAnsi(Buffer);
> +    XENVIF_VIF(TransmitterQueryOffloadOptions,
> +               &Adapter->VifInterface,
> +               &Options);
> 
> -        XENBUS_STORE(Free,
> -                     &Adapter->StoreInterface,
> -                     Buffer);
> -    } else {
> -        Distributions = NULL;
> -    }
> +    RtlZeroMemory(&Supported, sizeof(NDIS_OFFLOAD));
> +    Supported.Header.Type = NDIS_OBJECT_TYPE_OFFLOAD;
> +    Supported.Header.Revision = NDIS_OFFLOAD_REVISION_1;
> +    Supported.Header.Size = sizeof(NDIS_OFFLOAD);
> 
> -    if (Distributions == NULL)
> -        goto done;
> +    Supported.Checksum.IPv4Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> 
> -    for (Index = 0; Distributions[Index].Buffer != NULL; Index++) {
> -        PANSI_STRING    Distribution = &Distributions[Index];
> +    Supported.Checksum.IPv4Receive.IpChecksum = 1;
> +    Supported.Checksum.IPv4Receive.IpOptionsSupported = 1;
> 
> -        status = XENBUS_STORE(Read,
> -                              &Adapter->StoreInterface,
> -                              NULL,
> -                              "drivers",
> -                              Distribution->Buffer,
> -                              &Buffer);
> -        if (!NT_SUCCESS(status))
> -            continue;
> +    Supported.Checksum.IPv4Receive.TcpChecksum = 1;
> +    Supported.Checksum.IPv4Receive.TcpOptionsSupported = 1;
> 
> -        if (__AdapterMatchDistribution(Adapter, Buffer))
> -            (VOID) XENBUS_STORE(Remove,
> -                                &Adapter->StoreInterface,
> -                                NULL,
> -                                "drivers",
> -                                Distribution->Buffer);
> +    Supported.Checksum.IPv4Receive.UdpChecksum = 1;
> 
> -        XENBUS_STORE(Free,
> -                     &Adapter->StoreInterface,
> -                     Buffer);
> -    }
> +    Supported.Checksum.IPv6Receive.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> 
> -    __AdapterFreeAnsi(Distributions);
> +    Supported.Checksum.IPv6Receive.IpExtensionHeadersSupported = 1;
> 
> -done:
> -    Trace("<====\n");
> -}
> +    Supported.Checksum.IPv6Receive.TcpChecksum = 1;
> +    Supported.Checksum.IPv6Receive.TcpOptionsSupported = 1;
> 
> -#define MAXIMUM_INDEX   255
> +    Supported.Checksum.IPv6Receive.UdpChecksum = 1;
> 
> -static FORCEINLINE NTSTATUS
> -__AdapterSetDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    ULONG               Index;
> -    CHAR                Distribution[MAXNAMELEN];
> -    CHAR                Vendor[MAXNAMELEN];
> -    const CHAR          *Product;
> -    NTSTATUS            status;
> +    Supported.Checksum.IPv4Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> 
> -    Trace("====>\n");
> +    if (Options.OffloadIpVersion4HeaderChecksum) {
> +        Supported.Checksum.IPv4Transmit.IpChecksum = 1;
> +        Supported.Checksum.IPv4Transmit.IpOptionsSupported = 1;
> +    }
> 
> -    Index = 0;
> -    while (Index <= MAXIMUM_INDEX) {
> -        PCHAR   Buffer;
> +    if (Options.OffloadIpVersion4TcpChecksum) {
> +        Supported.Checksum.IPv4Transmit.TcpChecksum = 1;
> +        Supported.Checksum.IPv4Transmit.TcpOptionsSupported = 1;
> +    }
> 
> -        status = RtlStringCbPrintfA(Distribution,
> -                                    MAXNAMELEN,
> -                                    "%u",
> -                                    Index);
> -        ASSERT(NT_SUCCESS(status));
> +    if (Options.OffloadIpVersion4UdpChecksum)
> +        Supported.Checksum.IPv4Transmit.UdpChecksum = 1;
> 
> -        status = XENBUS_STORE(Read,
> -                              &Adapter->StoreInterface,
> -                              NULL,
> -                              "drivers",
> -                              Distribution,
> -                              &Buffer);
> -        if (!NT_SUCCESS(status)) {
> -            if (status == STATUS_OBJECT_NAME_NOT_FOUND)
> -                goto update;
> +    Supported.Checksum.IPv6Transmit.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +
> +    Supported.Checksum.IPv6Transmit.IpExtensionHeadersSupported = 1;
> 
> -            goto fail1;
> -        }
> +    if (Options.OffloadIpVersion6TcpChecksum) {
> +        Supported.Checksum.IPv6Transmit.TcpChecksum = 1;
> +        Supported.Checksum.IPv6Transmit.TcpOptionsSupported = 1;
> +    }
> 
> -        XENBUS_STORE(Free,
> -                     &Adapter->StoreInterface,
> -                     Buffer);
> +    if (Options.OffloadIpVersion6UdpChecksum)
> +        Supported.Checksum.IPv6Transmit.UdpChecksum = 1;
> 
> -        Index++;
> +    if (Options.OffloadIpVersion4LargePacket) {
> +        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +                   &Adapter->VifInterface,
> +                   4,
> +                   &Supported.LsoV2.IPv4.MaxOffLoadSize);
> +        Supported.LsoV2.IPv4.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +        Supported.LsoV2.IPv4.MinSegmentCount = 2;
>      }
> 
> -    status = STATUS_UNSUCCESSFUL;
> -    goto fail2;
> +    if (Options.OffloadIpVersion6LargePacket) {
> +        XENVIF_VIF(TransmitterQueryLargePacketSize,
> +                   &Adapter->VifInterface,
> +                   6,
> +                   &Supported.LsoV2.IPv6.MaxOffLoadSize);
> +        Supported.LsoV2.IPv6.Encapsulation =
> NDIS_ENCAPSULATION_IEEE_802_3;
> +        Supported.LsoV2.IPv6.MinSegmentCount = 2;
> +        Supported.LsoV2.IPv6.IpExtensionHeadersSupported = 1;
> +        Supported.LsoV2.IPv6.TcpOptionsSupported = 1;
> +    }
> 
> -update:
> -    status = RtlStringCbPrintfA(Vendor,
> -                                MAXNAMELEN,
> -                                "%s",
> -                                VENDOR_NAME_STR);
> -    ASSERT(NT_SUCCESS(status));
> +    Default = Supported;
> 
> -    for (Index  = 0; Vendor[Index] != '\0'; Index++)
> -        if (!isalnum((UCHAR)Vendor[Index]))
> -            Vendor[Index] = '_';
> +    if (!(Adapter->Properties.ipv4_csum & 2))
> +        Default.Checksum.IPv4Receive.IpChecksum = 0;
> 
> -    Product = "XENNET";
> +    if (!(Adapter->Properties.tcpv4_csum & 2))
> +        Default.Checksum.IPv4Receive.TcpChecksum = 0;
> 
> -#if DBG
> -#define ATTRIBUTES   "(DEBUG)"
> -#else
> -#define ATTRIBUTES   ""
> -#endif
> +    if (!(Adapter->Properties.udpv4_csum & 2))
> +        Default.Checksum.IPv4Receive.UdpChecksum = 0;
> 
> -    (VOID) XENBUS_STORE(Printf,
> -                        &Adapter->StoreInterface,
> -                        NULL,
> -                        "drivers",
> -                        Distribution,
> -                        "%s %s %u.%u.%u %s",
> -                        Vendor,
> -                        Product,
> -                        MAJOR_VERSION,
> -                        MINOR_VERSION,
> -                        MICRO_VERSION,
> -                        ATTRIBUTES
> -                        );
> +    if (!(Adapter->Properties.tcpv6_csum & 2))
> +        Default.Checksum.IPv6Receive.TcpChecksum = 0;
> 
> -#undef  ATTRIBUTES
> +    if (!(Adapter->Properties.udpv6_csum & 2))
> +        Default.Checksum.IPv6Receive.UdpChecksum = 0;
> 
> -    Trace("<====\n");
> -    return STATUS_SUCCESS;
> +    if (!(Adapter->Properties.ipv4_csum & 1))
> +        Default.Checksum.IPv4Transmit.IpChecksum = 0;
> 
> -fail2:
> -    Error("fail2\n");
> +    if (!(Adapter->Properties.tcpv4_csum & 1))
> +        Default.Checksum.IPv4Transmit.TcpChecksum = 0;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    if (!(Adapter->Properties.udpv4_csum & 1))
> +        Default.Checksum.IPv4Transmit.UdpChecksum = 0;
> 
> -    return status;
> -}
> +    if (!(Adapter->Properties.tcpv6_csum & 1))
> +        Default.Checksum.IPv6Transmit.TcpChecksum = 0;
> 
> -static DECLSPEC_NOINLINE VOID
> -AdapterSuspendCallbackLate(
> -    IN  PVOID       Argument
> -    )
> -{
> -    PXENNET_ADAPTER Adapter = Argument;
> +    if (!(Adapter->Properties.udpv6_csum & 1))
> +        Default.Checksum.IPv6Transmit.UdpChecksum = 0;
> 
> -    (VOID) __AdapterSetDistribution(Adapter);
> -}
> +    if (!(Adapter->Properties.lsov4)) {
> +        Default.LsoV2.IPv4.MaxOffLoadSize = 0;
> +        Default.LsoV2.IPv4.MinSegmentCount = 0;
> +    }
> 
> -static NTSTATUS
> -AdapterSetDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    LONG                Count;
> -    NTSTATUS            status;
> +    if (!(Adapter->Properties.lsov6)) {
> +        Default.LsoV2.IPv6.MaxOffLoadSize = 0;
> +        Default.LsoV2.IPv6.MinSegmentCount = 0;
> +    }
> 
> -    Trace("====>\n");
> +    if (!RtlEqualMemory(&Adapter->Offload, &Default, sizeof
> (NDIS_OFFLOAD))) {
> +        Adapter->Offload = Default;
> +        DISPLAY_OFFLOAD(Default);
> +    }
> 
> -    Count = InterlockedIncrement(&AdapterCount);
> -    ASSERT(Count != 0);
> +    RtlZeroMemory(&Attribs,
> sizeof(NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES));
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_OFFLOAD_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size = sizeof(Attribs);
> +    Attribs.DefaultOffloadConfiguration = &Default;
> +    Attribs.HardwareOffloadCapabilities = &Supported;
> 
> -    if (Count != 1)
> -        goto done;
> +    ndisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    return ndisStatus;
> +}
> 
> -    status = __AdapterSetDistribution(Adapter);
> -    if (!NT_SUCCESS(status))
> -        goto fail1;
> +static NDIS_STATUS
> +AdapterSetHeaderDataSplitAttributes(
> +    IN  PXENNET_ADAPTER                                 Adapter
> +    )
> +{
> +    NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES    Attribs;
> +    NDIS_HD_SPLIT_ATTRIBUTES                            Split;
> +    NDIS_STATUS                                         NdisStatus;
> 
> -    status = XENBUS_SUSPEND(Register,
> -                            &Adapter->SuspendInterface,
> -                            SUSPEND_CALLBACK_LATE,
> -                            AdapterSuspendCallbackLate,
> -                            Adapter,
> -                            &Adapter->SuspendCallbackLate);
> -    if (!NT_SUCCESS(status))
> -        goto fail2;
> +    RtlZeroMemory(&Attribs, sizeof(Attribs));
> 
> -done:
> -    Trace("<====\n");
> -    return STATUS_SUCCESS;
> +    Attribs.Header.Type =
> NDIS_OBJECT_TYPE_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES
> ;
> +    Attribs.Header.Revision =
> NDIS_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVISION_1;
> +    Attribs.Header.Size =
> NDIS_SIZEOF_MINIPORT_ADAPTER_HARDWARE_ASSIST_ATTRIBUTES_REVI
> SION_1;
> 
> -fail2:
> -    Error("fail2\n");
> +    RtlZeroMemory(&Split, sizeof(Split));
> 
> -    __AdapterClearDistribution(Adapter);
> +    Split.Header.Type = NDIS_OBJECT_TYPE_HD_SPLIT_ATTRIBUTES;
> +    Split.Header.Revision = NDIS_HD_SPLIT_ATTRIBUTES_REVISION_1;
> +    Split.Header.Size = NDIS_SIZEOF_HD_SPLIT_ATTRIBUTES_REVISION_1;
> +    Split.HardwareCapabilities =
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT |
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV4_OPTIONS |
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_IPV6_EXTENSION_HEADERS |
> +        NDIS_HD_SPLIT_CAPS_SUPPORTS_TCP_OPTIONS;
> 
> -fail1:
> -    Error("fail1 (%08x)\n", status);
> +    if (Adapter->Properties.HeaderDataSplit != 0)
> +        Split.CurrentCapabilities = Split.HardwareCapabilities;
> 
> -    return status;
> -}
> +    Attribs.HDSplitAttributes = &Split;
> 
> -static VOID
> -AdapterClearDistribution(
> -    IN  PXENNET_ADAPTER Adapter
> -    )
> -{
> -    LONG                Count;
> +    NdisStatus = NdisMSetMiniportAttributes(Adapter->NdisAdapterHandle,
> +                                            (PNDIS_MINIPORT_ADAPTER_ATTRIBUTES)&Attribs);
> +    if (NdisStatus != NDIS_STATUS_SUCCESS)
> +        goto fail1;
> 
> -    Trace("====>\n");
> +    if (Split.HDSplitFlags == NDIS_HD_SPLIT_ENABLE_HEADER_DATA_SPLIT) {
> +        ASSERT(Split.CurrentCapabilities &
> NDIS_HD_SPLIT_CAPS_SUPPORTS_HEADER_DATA_SPLIT);
> 
> -    Count = InterlockedDecrement(&AdapterCount);
> +        Info("BackfillSize = %u\n", Split.BackfillSize);
> +        Info("MaxHeaderSize = %u\n", Split.MaxHeaderSize);
> 
> -    if (Count != 0)
> -        goto done;
> +        XENVIF_VIF(ReceiverSetBackfillSize,
> +                   &Adapter->VifInterface,
> +                   Split.BackfillSize);
> 
> -    XENBUS_SUSPEND(Deregister,
> -                   &Adapter->SuspendInterface,
> -                   Adapter->SuspendCallbackLate);
> -    Adapter->SuspendCallbackLate = NULL;
> +        ReceiverSplitHeaderData(Adapter->Receiver, Split.MaxHeaderSize);
> +    }
> 
> -    __AdapterClearDistribution(Adapter);
> +    return NDIS_STATUS_SUCCESS;
> 
> -done:
> -    Trace("<====\n");
> +fail1:
> +    Error("fail1 (%08x)\n", NdisStatus);
> +
> +    return NdisStatus;
>  }
> 
>  NDIS_STATUS
> @@ -2715,52 +2810,35 @@ AdapterInitialize(
>      if (!NT_SUCCESS(status))
>          goto fail6;
> 
> -    status = XENBUS_CACHE(Acquire,
> -                          &(*Adapter)->CacheInterface);
> -    if (!NT_SUCCESS(status))
> -        goto fail7;
> -
> -    status = XENBUS_STORE(Acquire,
> -                          &(*Adapter)->StoreInterface);
> -    if (!NT_SUCCESS(status))
> -        goto fail8;
> -
> -    status = XENBUS_SUSPEND(Acquire,
> -                            &(*Adapter)->SuspendInterface);
> -    if (!NT_SUCCESS(status))
> -        goto fail9;
> -
> -    (VOID) AdapterSetDistribution(*Adapter);
> -
>      (*Adapter)->NdisAdapterHandle = Handle;
> 
>      ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail10;
> +        goto fail7;
> 
>      ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail11;
> +        goto fail8;
> 
>      ndisStatus = AdapterGetAdvancedSettings(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail12;
> +        goto fail9;
> 
>      ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail13;
> +        goto fail10;
> 
>      ndisStatus = AdapterSetGeneralAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail14;
> +        goto fail11;
> 
>      ndisStatus = AdapterSetOffloadAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail15;
> +        goto fail12;
> 
>      ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail16;
> +        goto fail13;
> 
>      RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
>      Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
> @@ -2777,43 +2855,23 @@ AdapterInitialize(
>      if (ndisStatus != NDIS_STATUS_SUCCESS)
>          (*Adapter)->NdisDmaHandle = NULL;
> 
> -    ndisStatus = AdapterEnable(*Adapter);
> -    if (ndisStatus != NDIS_STATUS_SUCCESS)
> -        goto fail17;
> -
>      return NDIS_STATUS_SUCCESS;
> 
> -fail17:
> -    if ((*Adapter)->NdisDmaHandle)
> -        NdisMDeregisterScatterGatherDma((*Adapter)->NdisDmaHandle);
> -    (*Adapter)->NdisDmaHandle = NULL;
> -
> -fail16:
> -fail15:
> -fail14:
>  fail13:
>  fail12:
> +fail11:
> +fail10:
> +fail9:
>      ReceiverTeardown((*Adapter)->Receiver);
>      (*Adapter)->Receiver = NULL;
> -fail11:
> 
> +fail8:
>      TransmitterTeardown((*Adapter)->Transmitter);
>      (*Adapter)->Transmitter = NULL;
> 
> -fail10:
> +fail7:
>      (*Adapter)->NdisAdapterHandle = NULL;
> 
> -    AdapterClearDistribution(*Adapter);
> -
> -    XENBUS_SUSPEND(Release, &(*Adapter)->SuspendInterface);
> -
> -fail9:
> -    XENBUS_STORE(Release, &(*Adapter)->StoreInterface);
> -
> -fail8:
> -    XENBUS_CACHE(Release, &(*Adapter)->CacheInterface);
> -
> -fail7:
>      XENVIF_VIF(Release, &(*Adapter)->VifInterface);
> 
>  fail6:
> @@ -2852,9 +2910,6 @@ AdapterTeardown(
> 
>      AdapterClearDistribution(Adapter);
> 
> -    XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
> -    XENBUS_STORE(Release, &Adapter->StoreInterface);
> -    XENBUS_CACHE(Release, &Adapter->CacheInterface);
>      XENVIF_VIF(Release, &Adapter->VifInterface);
> 
>      RtlZeroMemory(&Adapter->SuspendInterface,
> sizeof(XENBUS_SUSPEND_INTERFACE));
> diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
> index 3cc1d90..5b2495a 100644
> --- a/src/xennet/adapter.h
> +++ b/src/xennet/adapter.h
> @@ -99,7 +99,7 @@ AdapterEnable(
>      IN  PXENNET_ADAPTER     Adapter
>      );
> 
> -extern BOOLEAN
> +extern VOID
>  AdapterDisable(
>      IN  PXENNET_ADAPTER     Adapter
>      );
> diff --git a/src/xennet/miniport.c b/src/xennet/miniport.c
> index 5500418..1883db5 100644
> --- a/src/xennet/miniport.c
> +++ b/src/xennet/miniport.c
> @@ -66,7 +66,7 @@ MiniportInitializeEx(
>      PXENNET_ADAPTER                     Adapter;
>      NDIS_STATUS                         NdisStatus;
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
>      UNREFERENCED_PARAMETER(MiniportDriverContext);
>      UNREFERENCED_PARAMETER(MiniportInitParameters);
> @@ -75,7 +75,7 @@ MiniportInitializeEx(
>      if (NdisStatus != NDIS_STATUS_SUCCESS)
>          goto fail1;
> 
> -    Trace("<====\n");
> +    Info("<====\n");
> 
>      return NDIS_STATUS_SUCCESS;
> 
> @@ -97,16 +97,14 @@ MiniportHaltEx(
> 
>      UNREFERENCED_PARAMETER(HaltAction);
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
>      if (Adapter == NULL)
>          return;
> 
> -    (VOID) AdapterDisable(Adapter);
> -
>      AdapterTeardown(Adapter);
> 
> -    Trace("<====\n");
> +    Info("<====\n");
>  }
> 
>  static
> @@ -131,12 +129,11 @@ MiniportPause(
> 
>      UNREFERENCED_PARAMETER(MiniportPauseParameters);
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
> -    if (AdapterDisable(Adapter))
> -        AdapterMediaStateChange(Adapter);
> +    AdapterDisable(Adapter);
> 
> -    Trace("<====\n");
> +    Info("<====\n");
> 
>      return NDIS_STATUS_SUCCESS;
>  }
> @@ -154,11 +151,11 @@ MiniportRestart(
> 
>      UNREFERENCED_PARAMETER(MiniportRestartParameters);
> 
> -    Trace("====>\n");
> +    Info("====>\n");
> 
>      NdisStatus = AdapterEnable(Adapter);
> 
> -    Trace("<====\n");
> +    Info("<====\n");
> 
>      return NdisStatus;
>  }
> diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
> index 17ab27f..8bfc10b 100644
> --- a/src/xennet/receiver.c
> +++ b/src/xennet/receiver.c
> @@ -359,6 +359,24 @@ fail1:
>      return status;
>  }
> 
> +NDIS_STATUS
> +ReceiverEnable (
> +    IN  PXENNET_RECEIVER    Receiver
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Receiver);
> +
> +    return NDIS_STATUS_SUCCESS;
> +}
> +
> +VOID
> +ReceiverDisable (
> +    IN  PXENNET_RECEIVER    Receiver
> +    )
> +{
> +    UNREFERENCED_PARAMETER(Receiver);
> +}
> +
>  VOID
>  ReceiverTeardown(
>      IN  PXENNET_RECEIVER    Receiver
> diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
> index b2cc809..33701a9 100644
> --- a/src/xennet/receiver.h
> +++ b/src/xennet/receiver.h
> @@ -43,6 +43,16 @@ ReceiverInitialize(
>      OUT PXENNET_RECEIVER    *Receiver
>      );
> 
> +extern NDIS_STATUS
> +ReceiverEnable(
> +    IN  PXENNET_RECEIVER    Receiver
> +    );
> +
> +extern VOID
> +ReceiverDisable(
> +    IN  PXENNET_RECEIVER    Receiver
> +    );
> +
>  extern VOID
>  ReceiverTeardown(
>      IN  PXENNET_RECEIVER    Receiver
> diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
> index a617b7d..8c80c7e 100644
> --- a/src/xennet/transmitter.c
> +++ b/src/xennet/transmitter.c
> @@ -141,16 +141,10 @@ TransmitterInitialize (
>      OUT PXENNET_TRANSMITTER *Transmitter
>      )
>  {
> -    NTSTATUS                status;
> -    PXENBUS_CACHE_INTERFACE CacheInterface;
> -
> -    CacheInterface = AdapterGetCacheInterface(Adapter);
> -
>      *Transmitter = ExAllocatePoolWithTag(NonPagedPool,
>                                           sizeof(XENNET_TRANSMITTER),
>                                           TRANSMITTER_POOL_TAG);
> 
> -    status = STATUS_NO_MEMORY;
>      if (*Transmitter == NULL)
>          goto fail1;
> 
> @@ -160,6 +154,22 @@ TransmitterInitialize (
> 
>      KeInitializeSpinLock(&(*Transmitter)->Lock);
> 
> +    return NDIS_STATUS_SUCCESS;
> +
> +fail1:
> +    return NDIS_STATUS_FAILURE;
> +}
> +
> +NDIS_STATUS
> +TransmitterEnable (
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    )
> +{
> +    PXENBUS_CACHE_INTERFACE CacheInterface;
> +    NTSTATUS                status;
> +
> +    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
> +
>      status = XENBUS_CACHE(Create,
>                            CacheInterface,
>                            "packet_cache",
> @@ -169,10 +179,10 @@ TransmitterInitialize (
>                            __TransmitterPacketDtor,
>                            __TransmitterPacketAcquireLock,
>                            __TransmitterPacketReleaseLock,
> -                          *Transmitter,
> -                          &(*Transmitter)->PacketCache);
> +                          Transmitter,
> +                          &Transmitter->PacketCache);
>      if (!NT_SUCCESS(status))
> -        goto fail2;
> +        goto fail1;
> 
>      status = XENBUS_CACHE(Create,
>                            CacheInterface,
> @@ -183,27 +193,20 @@ TransmitterInitialize (
>                            __TransmitterBufferDtor,
>                            __TransmitterBufferAcquireLock,
>                            __TransmitterBufferReleaseLock,
> -                          *Transmitter,
> -                          &(*Transmitter)->BufferCache);
> +                          Transmitter,
> +                          &Transmitter->BufferCache);
>      if (!NT_SUCCESS(status))
> -        goto fail3;
> +        goto fail2;
> 
>      return NDIS_STATUS_SUCCESS;
> 
> -fail3:
> -    XENBUS_CACHE(Destroy,
> -                 CacheInterface,
> -                 (*Transmitter)->PacketCache);
> -    (*Transmitter)->PacketCache = NULL;
> -
>  fail2:
>      Error("fail2\n");
> 
> -    RtlZeroMemory(&(*Transmitter)->Lock, sizeof(KSPIN_LOCK));
> -
> -    ExFreePoolWithTag(*Transmitter, TRANSMITTER_POOL_TAG);
> -
> -    *Transmitter = NULL;
> +    XENBUS_CACHE(Destroy,
> +                 CacheInterface,
> +                 Transmitter->PacketCache);
> +    Transmitter->PacketCache = NULL;
> 
>  fail1:
>      Error("fail1\n (%08x)", status);
> @@ -212,7 +215,7 @@ fail1:
>  }
> 
>  VOID
> -TransmitterTeardown(
> +TransmitterDisable (
>      IN  PXENNET_TRANSMITTER Transmitter
>      )
>  {
> @@ -220,9 +223,6 @@ TransmitterTeardown(
> 
>      CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
> 
> -    Transmitter->Adapter = NULL;
> -    Transmitter->OffloadOptions.Value = 0;
> -
>      XENBUS_CACHE(Destroy,
>                   CacheInterface,
>                   Transmitter->BufferCache);
> @@ -232,6 +232,15 @@ TransmitterTeardown(
>                   CacheInterface,
>                   Transmitter->PacketCache);
>      Transmitter->PacketCache = NULL;
> +}
> +
> +VOID
> +TransmitterTeardown(
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    )
> +{
> +    Transmitter->Adapter = NULL;
> +    Transmitter->OffloadOptions.Value = 0;
> 
>      RtlZeroMemory(&Transmitter->Lock, sizeof(KSPIN_LOCK));
> 
> diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
> index 0adebdc..363b91e 100644
> --- a/src/xennet/transmitter.h
> +++ b/src/xennet/transmitter.h
> @@ -43,6 +43,16 @@ TransmitterInitialize(
>      OUT PXENNET_TRANSMITTER *Transmitter
>      );
> 
> +extern NDIS_STATUS
> +TransmitterEnable(
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    );
> +
> +extern VOID
> +TransmitterDisable(
> +    IN  PXENNET_TRANSMITTER Transmitter
> +    );
> +
>  extern VOID
>  TransmitterTeardown(
>      IN  PXENNET_TRANSMITTER Transmitter
> --
> 2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 17:21:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 17:21:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4XZI-0006ip-Jm; Thu, 03 Dec 2015 17:21:20 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=772d45f04=Paul.Durrant@citrix.com>)
	id 1a4XZH-0006if-Tg
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 17:21:20 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	60/CF-21571-F0A70665; Thu, 03 Dec 2015 17:21:19 +0000
X-Env-Sender: prvs=772d45f04=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1449163277!3586099!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3650 invoked from network); 3 Dec 2015 17:21:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Dec 2015 17:21:18 -0000
X-IronPort-AV: E=Sophos;i="5.20,378,1444694400"; 
   d="scan'208";a="9228763"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding /
	BlockRingAbort
Thread-Index: AQHRLRTJ7P1Z33RKx0+OwGufDRP9LZ65gyOw
Date: Thu, 3 Dec 2015 17:19:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A56AC@AMSPEX01CL01.citrite.net>
References: <1449069409-35764-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1449069409-35764-1-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding /
 BlockRingAbort
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 02 December 2015 15:17
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding /
> BlockRingAbort
> 
> The BlockRing Outstanding stat is duplicated by SubmittedReqs.Count.
> Remove BlockRing.Outstanding and the BlockRingAbort function as the
> stat is not useful, and can trigger ASSERTion failures when requests
> are stuck outstanding on a broken ring that is being destroyed.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

I will also back-port this to 8.1.

> ---
>  src/xenvbd/blockring.c | 28 +---------------------------
>  src/xenvbd/blockring.h |  6 ------
>  src/xenvbd/pdo.c       |  4 +---
>  3 files changed, 2 insertions(+), 36 deletions(-)
> 
> diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
> index 6ca9cb2..e0275af 100644
> --- a/src/xenvbd/blockring.c
> +++ b/src/xenvbd/blockring.c
> @@ -56,7 +56,6 @@ struct _XENVBD_BLOCKRING {
>      ULONG                           DeviceId;
>      ULONG                           Order;
>      PVOID                           Grants[XENVBD_MAX_RING_PAGES];
> -    ULONG                           Outstanding;
>      ULONG                           Submitted;
>      ULONG                           Received;
>  };
> @@ -235,7 +234,6 @@ __BlockRingInsert(
>          break;
>      }
>      ++BlockRing->Submitted;
> -    ++BlockRing->Outstanding;
>  }
> 
>  NTSTATUS
> @@ -432,7 +430,6 @@ BlockRingDisconnect(
>      PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing-
> >Frontend);
> 
>      ASSERT(BlockRing->Connected == TRUE);
> -    ASSERT3U(BlockRing->Outstanding, ==, 0);
> 
>      BlockRing->Submitted = 0;
>      BlockRing->Received = 0;
> @@ -467,8 +464,7 @@ BlockRingDebugCallback(
>      PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing-
> >Frontend);
> 
>      XENBUS_DEBUG(Printf, Debug,
> -                 "BLOCKRING: Requests  : %d / %d / %d\n",
> -                 BlockRing->Outstanding,
> +                 "BLOCKRING: Requests  : %d / %d\n",
>                   BlockRing->Submitted,
>                   BlockRing->Received);
> 
> @@ -543,7 +539,6 @@ BlockRingPoll(
> 
>              if (__BlockRingPutTag(BlockRing, Response->id, &Tag)) {
>                  ++BlockRing->Received;
> -                --BlockRing->Outstanding;
>                  PdoCompleteResponse(Pdo, Tag, Response->status);
>              }
> 
> @@ -589,24 +584,3 @@ BlockRingSubmit(
> 
>      return TRUE;
>  }
> -
> -VOID
> -BlockRingAbort(
> -    IN  PXENVBD_BLOCKRING           BlockRing,
> -    IN  PXENVBD_REQUEST             Request
> -    )
> -{
> -    KIRQL               Irql;
> -
> -    UNREFERENCED_PARAMETER(Request);
> -
> -    KeAcquireSpinLock(&BlockRing->Lock, &Irql);
> -
> -    // Should check Request is present on the ring, but
> -    // the shared page(s) may not contain any valid data,
> -    // due to suspend/resume
> -    ASSERT3U(BlockRing->Outstanding, >, 0);
> -    --BlockRing->Outstanding;
> -
> -    KeReleaseSpinLock(&BlockRing->Lock, Irql);
> -}
> diff --git a/src/xenvbd/blockring.h b/src/xenvbd/blockring.h
> index 4c94b6c..1117d73 100644
> --- a/src/xenvbd/blockring.h
> +++ b/src/xenvbd/blockring.h
> @@ -94,10 +94,4 @@ BlockRingSubmit(
>      IN  PXENVBD_REQUEST             Request
>      );
> 
> -extern VOID
> -BlockRingAbort(
> -    IN  PXENVBD_BLOCKRING           BlockRing,
> -    IN  PXENVBD_REQUEST             Request
> -    );
> -
>  #endif // _XENVBD_BLOCKRING_H
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 154dd8a..488a74b 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -1578,8 +1578,7 @@ PdoPreResume(
>      )
>  {
>      LIST_ENTRY          List;
> -    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo-
> >Frontend);
> -
> +
>      InitializeListHead(&List);
> 
>      // pop all submitted requests, cleanup and add associated SRB to a list
> @@ -1592,7 +1591,6 @@ PdoPreResume(
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
>          SrbExt = GetSrbExt(Request->Srb);
> 
> -        BlockRingAbort(BlockRing, Request);
>          PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 17:21:20 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 17:21:20 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4XZI-0006ip-Jm; Thu, 03 Dec 2015 17:21:20 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=772d45f04=Paul.Durrant@citrix.com>)
	id 1a4XZH-0006if-Tg
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 17:21:20 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	60/CF-21571-F0A70665; Thu, 03 Dec 2015 17:21:19 +0000
X-Env-Sender: prvs=772d45f04=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-21.messagelabs.com!1449163277!3586099!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3650 invoked from network); 3 Dec 2015 17:21:18 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	3 Dec 2015 17:21:18 -0000
X-IronPort-AV: E=Sophos;i="5.20,378,1444694400"; 
   d="scan'208";a="9228763"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding /
	BlockRingAbort
Thread-Index: AQHRLRTJ7P1Z33RKx0+OwGufDRP9LZ65gyOw
Date: Thu, 3 Dec 2015 17:19:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A56AC@AMSPEX01CL01.citrite.net>
References: <1449069409-35764-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1449069409-35764-1-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding /
 BlockRingAbort
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 02 December 2015 15:17
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH] Remove BlockRing.Outstanding /
> BlockRingAbort
> 
> The BlockRing Outstanding stat is duplicated by SubmittedReqs.Count.
> Remove BlockRing.Outstanding and the BlockRingAbort function as the
> stat is not useful, and can trigger ASSERTion failures when requests
> are stuck outstanding on a broken ring that is being destroyed.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

I will also back-port this to 8.1.

> ---
>  src/xenvbd/blockring.c | 28 +---------------------------
>  src/xenvbd/blockring.h |  6 ------
>  src/xenvbd/pdo.c       |  4 +---
>  3 files changed, 2 insertions(+), 36 deletions(-)
> 
> diff --git a/src/xenvbd/blockring.c b/src/xenvbd/blockring.c
> index 6ca9cb2..e0275af 100644
> --- a/src/xenvbd/blockring.c
> +++ b/src/xenvbd/blockring.c
> @@ -56,7 +56,6 @@ struct _XENVBD_BLOCKRING {
>      ULONG                           DeviceId;
>      ULONG                           Order;
>      PVOID                           Grants[XENVBD_MAX_RING_PAGES];
> -    ULONG                           Outstanding;
>      ULONG                           Submitted;
>      ULONG                           Received;
>  };
> @@ -235,7 +234,6 @@ __BlockRingInsert(
>          break;
>      }
>      ++BlockRing->Submitted;
> -    ++BlockRing->Outstanding;
>  }
> 
>  NTSTATUS
> @@ -432,7 +430,6 @@ BlockRingDisconnect(
>      PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing-
> >Frontend);
> 
>      ASSERT(BlockRing->Connected == TRUE);
> -    ASSERT3U(BlockRing->Outstanding, ==, 0);
> 
>      BlockRing->Submitted = 0;
>      BlockRing->Received = 0;
> @@ -467,8 +464,7 @@ BlockRingDebugCallback(
>      PXENVBD_GRANTER Granter = FrontendGetGranter(BlockRing-
> >Frontend);
> 
>      XENBUS_DEBUG(Printf, Debug,
> -                 "BLOCKRING: Requests  : %d / %d / %d\n",
> -                 BlockRing->Outstanding,
> +                 "BLOCKRING: Requests  : %d / %d\n",
>                   BlockRing->Submitted,
>                   BlockRing->Received);
> 
> @@ -543,7 +539,6 @@ BlockRingPoll(
> 
>              if (__BlockRingPutTag(BlockRing, Response->id, &Tag)) {
>                  ++BlockRing->Received;
> -                --BlockRing->Outstanding;
>                  PdoCompleteResponse(Pdo, Tag, Response->status);
>              }
> 
> @@ -589,24 +584,3 @@ BlockRingSubmit(
> 
>      return TRUE;
>  }
> -
> -VOID
> -BlockRingAbort(
> -    IN  PXENVBD_BLOCKRING           BlockRing,
> -    IN  PXENVBD_REQUEST             Request
> -    )
> -{
> -    KIRQL               Irql;
> -
> -    UNREFERENCED_PARAMETER(Request);
> -
> -    KeAcquireSpinLock(&BlockRing->Lock, &Irql);
> -
> -    // Should check Request is present on the ring, but
> -    // the shared page(s) may not contain any valid data,
> -    // due to suspend/resume
> -    ASSERT3U(BlockRing->Outstanding, >, 0);
> -    --BlockRing->Outstanding;
> -
> -    KeReleaseSpinLock(&BlockRing->Lock, Irql);
> -}
> diff --git a/src/xenvbd/blockring.h b/src/xenvbd/blockring.h
> index 4c94b6c..1117d73 100644
> --- a/src/xenvbd/blockring.h
> +++ b/src/xenvbd/blockring.h
> @@ -94,10 +94,4 @@ BlockRingSubmit(
>      IN  PXENVBD_REQUEST             Request
>      );
> 
> -extern VOID
> -BlockRingAbort(
> -    IN  PXENVBD_BLOCKRING           BlockRing,
> -    IN  PXENVBD_REQUEST             Request
> -    );
> -
>  #endif // _XENVBD_BLOCKRING_H
> diff --git a/src/xenvbd/pdo.c b/src/xenvbd/pdo.c
> index 154dd8a..488a74b 100644
> --- a/src/xenvbd/pdo.c
> +++ b/src/xenvbd/pdo.c
> @@ -1578,8 +1578,7 @@ PdoPreResume(
>      )
>  {
>      LIST_ENTRY          List;
> -    PXENVBD_BLOCKRING   BlockRing = FrontendGetBlockRing(Pdo-
> >Frontend);
> -
> +
>      InitializeListHead(&List);
> 
>      // pop all submitted requests, cleanup and add associated SRB to a list
> @@ -1592,7 +1591,6 @@ PdoPreResume(
>          Request = CONTAINING_RECORD(Entry, XENVBD_REQUEST, Entry);
>          SrbExt = GetSrbExt(Request->Srb);
> 
> -        BlockRingAbort(BlockRing, Request);
>          PdoPutRequest(Pdo, Request);
> 
>          if (InterlockedDecrement(&SrbExt->Count) == 0) {
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 17:21:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 17:21:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4XZJ-0006jB-MV; Thu, 03 Dec 2015 17:21:21 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4XZI-0006if-Cj
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 17:21:20 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	D3/CF-21571-F0A70665; Thu, 03 Dec 2015 17:21:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1449163279!3460122!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 58803 invoked from network); 3 Dec 2015 17:21:19 -0000
Received: from mail-wm0-f45.google.com (HELO mail-wm0-f45.google.com)
	(74.125.82.45)
	by server-4.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 17:21:19 -0000
Received: by wmvv187 with SMTP id v187so38032295wmv.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 09:21:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=cqvxX5gAB/2A6Avp2vqamNEpgrS6sM8G4oJjzhHo7zo=;
	b=XMzyo/ObeUCkU82mDmiGktCDnVTKXUwiWUs6T6jsZBBLz7xxFsXbYPN93AZZI8idjM
	Ggh5VHKrmvJmHsbhf/YBOBJWFcHsnN/p2iezf+D/qKzLZ0h7ykSWbr8c3/UCvJbYTD4h
	wKw5gphotVO55N7uGtH456WYtGKUkus1zbe9NXgBqUsxbphyBl8QFIV+kOxNIKZvMAr8
	KC2oV3aO/PegokTv1EnqkellaQlnijdjNv7RYuP+WvOoEBzRNc+KAk9jlk4tspwfjAmQ
	775ghc5D3BeiA4i9R+tOOSzS7XCIcfxmRYUIr6NFpw3PDO9l46tp9gWjsqIoQ4oMsVLh
	9z1A==
X-Received: by 10.28.186.67 with SMTP id k64mr53851158wmf.56.1449163279163;
	Thu, 03 Dec 2015 09:21:19 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jj3sm8394552wjb.13.2015.12.03.09.21.18
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 09:21:18 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 17:21:00 +0000
Message-Id: <1449163260-19920-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] NULL the SuspendCallback context when going
	to D3...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...otherwise going back to D0 will hit an ASSERTion failure.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/fdo.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 4a72a12..eac0584 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1483,6 +1483,7 @@ FdoD0ToD3(
 
     // remove suspend callback
     XENBUS_SUSPEND(Deregister, &Fdo->Suspend, Fdo->SuspendCallback);
+    Fdo->SuspendCallback = NULL;
 
     __FdoD0ToD3(Fdo);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 03 17:21:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 03 Dec 2015 17:21:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4XZJ-0006jB-MV; Thu, 03 Dec 2015 17:21:21 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4XZI-0006if-Cj
	for win-pv-devel@lists.xenproject.org; Thu, 03 Dec 2015 17:21:20 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	D3/CF-21571-F0A70665; Thu, 03 Dec 2015 17:21:19 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1449163279!3460122!1
X-Originating-IP: [74.125.82.45]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 58803 invoked from network); 3 Dec 2015 17:21:19 -0000
Received: from mail-wm0-f45.google.com (HELO mail-wm0-f45.google.com)
	(74.125.82.45)
	by server-4.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 3 Dec 2015 17:21:19 -0000
Received: by wmvv187 with SMTP id v187so38032295wmv.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 03 Dec 2015 09:21:19 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=cqvxX5gAB/2A6Avp2vqamNEpgrS6sM8G4oJjzhHo7zo=;
	b=XMzyo/ObeUCkU82mDmiGktCDnVTKXUwiWUs6T6jsZBBLz7xxFsXbYPN93AZZI8idjM
	Ggh5VHKrmvJmHsbhf/YBOBJWFcHsnN/p2iezf+D/qKzLZ0h7ykSWbr8c3/UCvJbYTD4h
	wKw5gphotVO55N7uGtH456WYtGKUkus1zbe9NXgBqUsxbphyBl8QFIV+kOxNIKZvMAr8
	KC2oV3aO/PegokTv1EnqkellaQlnijdjNv7RYuP+WvOoEBzRNc+KAk9jlk4tspwfjAmQ
	775ghc5D3BeiA4i9R+tOOSzS7XCIcfxmRYUIr6NFpw3PDO9l46tp9gWjsqIoQ4oMsVLh
	9z1A==
X-Received: by 10.28.186.67 with SMTP id k64mr53851158wmf.56.1449163279163;
	Thu, 03 Dec 2015 09:21:19 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jj3sm8394552wjb.13.2015.12.03.09.21.18
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 03 Dec 2015 09:21:18 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu,  3 Dec 2015 17:21:00 +0000
Message-Id: <1449163260-19920-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] NULL the SuspendCallback context when going
	to D3...
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

...otherwise going back to D0 will hit an ASSERTion failure.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/fdo.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index 4a72a12..eac0584 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1483,6 +1483,7 @@ FdoD0ToD3(
 
     // remove suspend callback
     XENBUS_SUSPEND(Deregister, &Fdo->Suspend, Fdo->SuspendCallback);
+    Fdo->SuspendCallback = NULL;
 
     __FdoD0ToD3(Fdo);
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:40:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:40:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pfO-0001TA-7S; Fri, 04 Dec 2015 12:40:50 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pfM-0001Sw-E0
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:40:48 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	DD/50-16618-FC981665; Fri, 04 Dec 2015 12:40:47 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1449232845!5002590!1
X-Originating-IP: [209.85.160.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23109 invoked from network); 4 Dec 2015 12:40:46 -0000
Received: from mail-yk0-f174.google.com (HELO mail-yk0-f174.google.com)
	(209.85.160.174)
	by server-8.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:40:46 -0000
Received: by ykba77 with SMTP id a77so121852781ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:40:45 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=I8P1SOqNKb9l4rWKhLMHfMPZ8H0FTLtVvjC/KIqcAmk=;
	b=WLk0A7CK7ac0WtvvrIzwd7rpywIKdhvmzgktoe4Fq+PMpU6Fvfid0u53ljvG5kBZgo
	D2PoxypQlu6m98FvAMskhNNghdqeG5sUNtvvRgMawLpa3Nin0H0nGbqmqF2Vd2xPlfhZ
	Spmi+aGqmeFEixQluc6lnlhQPyGqeUkr25pLwgjFulRy7wfkah8S1UvrnpvY3pUfu9jz
	2o3GpS98MjmxEn64Rfqh3Ts3kYOQ84QTmg4ZW3i+K02fNQKcV57jOW3yRj0z6NgbiAty
	/D5TZ8lnTNAovYSPiZZT6MZb4vm4Ldn9VwiTXKSQTnVxoJ7lNGH1C4efiyNmUiWyG0NX
	gMFg==
X-Received: by 10.13.229.3 with SMTP id o3mr10706422ywe.341.1449232845659;
	Fri, 04 Dec 2015 04:40:45 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	q63sm8823610ywf.16.2015.12.04.04.40.44
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:40:45 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:40:30 +0000
Message-Id: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/3] Move check for split event channels into
	Frontend module
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Reduce code duplication and efficiency a little by checking the xenstore
key once in Frontend and then providing a function with Transmitter and
Receiver can use to grab the value.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c    | 49 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/xenvif/frontend.h    |  5 +++++
 src/xenvif/receiver.c    | 20 ++------------------
 src/xenvif/transmitter.c | 36 +++++++++++++++--------------------
 4 files changed, 70 insertions(+), 40 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 98efee5..b066d0b 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -70,6 +70,7 @@ struct _XENVIF_FRONTEND {
     USHORT                      BackendDomain;
     ULONG                       MaxQueues;
     ULONG                       NumQueues;
+    BOOLEAN                     Split;
 
     PXENVIF_MAC                 Mac;
     PXENVIF_RECEIVER            Receiver;
@@ -1674,7 +1675,8 @@ FrontendSetNumQueues(
         BackendMaxQueues = 1;
     }
 
-    Frontend->NumQueues = __min(Frontend->MaxQueues, BackendMaxQueues);
+    Frontend->NumQueues = __min(__FrontendGetMaxQueues(Frontend),
+                                BackendMaxQueues);
 
     Info("%s: %u\n", __FrontendGetPath(Frontend), Frontend->NumQueues);
 }
@@ -1695,6 +1697,50 @@ FrontendGetNumQueues(
     return __FrontendGetNumQueues(Frontend);
 }
 
+static VOID
+FrontendSetSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    PCHAR                   Buffer;
+    NTSTATUS                status;
+
+    status = XENBUS_STORE(Read,
+                          &Frontend->StoreInterface,
+                          NULL,
+                          __FrontendGetBackendPath(Frontend),
+                          "feature-split-event-channels",
+                          &Buffer);
+    if (NT_SUCCESS(status)) {
+        Frontend->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
+
+        XENBUS_STORE(Free,
+                     &Frontend->StoreInterface,
+                     Buffer);
+    } else {
+        Frontend->Split = FALSE;
+    }
+
+    Info("%s: %s\n", __FrontendGetPath(Frontend),
+         (Frontend->Split) ? "TRUE" : "FALSE");
+}
+
+static FORCEINLINE BOOLEAN
+__FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    return Frontend->Split;
+}
+
+BOOLEAN
+FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    return __FrontendIsSplit(Frontend);
+}
+
 static NTSTATUS
 FrontendConnect(
     IN  PXENVIF_FRONTEND    Frontend
@@ -1731,6 +1777,7 @@ FrontendConnect(
         goto fail4;
 
     FrontendSetNumQueues(Frontend);
+    FrontendSetSplit(Frontend);
 
     status = ReceiverConnect(__FrontendGetReceiver(Frontend));
     if (!NT_SUCCESS(status))
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index bd39767..eda9e3d 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -122,6 +122,11 @@ FrontendGetNumQueues(
     IN  PXENVIF_FRONTEND    Frontend
     );
 
+extern BOOLEAN
+FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    );
+
 extern PCHAR
 FrontendFormatPath(
     IN  PXENVIF_FRONTEND    Frontend,
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index c6f64b5..36557b7 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -2859,7 +2859,6 @@ ReceiverConnect(
 {
     PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
-    PCHAR                   Buffer;
     NTSTATUS                status;
 
     Trace("====>\n");
@@ -2886,21 +2885,7 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = XENBUS_STORE(Read,
-                          &Receiver->StoreInterface,
-                          NULL,
-                          FrontendGetBackendPath(Frontend),
-                          "feature-split-event-channels",
-                          &Buffer);
-    if (!NT_SUCCESS(status)) {
-        Receiver->Split = FALSE;
-    } else {
-        Receiver->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
-
-        XENBUS_STORE(Free,
-                     &Receiver->StoreInterface,
-                     Buffer);
-    }
+    Receiver->Split = FrontendIsSplit(Frontend);
 
     Receiver->NumQueues = FrontendGetNumQueues(Frontend);
     ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues);
@@ -3211,8 +3196,6 @@ ReceiverDisconnect(
 
     Frontend = Receiver->Frontend;
 
-    Receiver->Split = FALSE;
-
     XENBUS_DEBUG(Deregister,
                  &Receiver->DebugInterface,
                  Receiver->DebugCallback);
@@ -3226,6 +3209,7 @@ ReceiverDisconnect(
     }
 
     Receiver->NumQueues = 0;
+    Receiver->Split = FALSE;
 
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 5f84eb5..615d2d0 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -710,6 +710,15 @@ TransmitterRingDebugCallback(
                  Ring->PacketsUnprepared,
                  Ring->PacketsSent,
                  Ring->PacketsCompleted);
+
+    if (Transmitter->Split) {
+        // Dump event channel
+        XENBUS_DEBUG(Printf,
+                     &Transmitter->DebugInterface,
+                     "Events = %lu Dpcs = %lu\n",
+                     Ring->Events,
+                     Ring->Dpcs);
+    }
 }
 
 static BOOLEAN
@@ -3618,8 +3627,6 @@ __TransmitterRingDisconnect(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    Transmitter->Split = FALSE;
-
     if (Ring->Channel != NULL) {
         XENBUS_EVTCHN(Close,
                       &Transmitter->EvtchnInterface,
@@ -4189,22 +4196,6 @@ TransmitterConnect(
                           &Transmitter->StoreInterface,
                           NULL,
                           FrontendGetBackendPath(Frontend),
-                          "feature-split-event-channels",
-                          &Buffer);
-    if (!NT_SUCCESS(status)) {
-        Transmitter->Split = FALSE;
-    } else {
-        Transmitter->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
-
-        XENBUS_STORE(Free,
-                     &Transmitter->StoreInterface,
-                     Buffer);
-    }
-
-    status = XENBUS_STORE(Read,
-                          &Transmitter->StoreInterface,
-                          NULL,
-                          FrontendGetBackendPath(Frontend),
                           "feature-multicast-control",
                           &Buffer);
     if (!NT_SUCCESS(status)) {
@@ -4217,6 +4208,8 @@ TransmitterConnect(
                      Buffer);
     }
 
+    Transmitter->Split = FrontendIsSplit(Frontend);
+
     Transmitter->NumQueues = FrontendGetNumQueues(Frontend);
     ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues);
 
@@ -4260,6 +4253,8 @@ fail9:
     }
 
     Transmitter->NumQueues = 0;
+    Transmitter->Split = FALSE;
+    Transmitter->MulticastControl = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
@@ -4401,9 +4396,6 @@ TransmitterDisconnect(
 
     Frontend = Transmitter->Frontend;
 
-    Transmitter->MulticastControl = FALSE;
-    Transmitter->Split = FALSE;
-
     XENBUS_DEBUG(Deregister,
                  &Transmitter->DebugInterface,
                  Transmitter->DebugCallback);
@@ -4417,6 +4409,8 @@ TransmitterDisconnect(
     }
 
     Transmitter->NumQueues = 0;
+    Transmitter->MulticastControl = FALSE;
+    Transmitter->Split = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:40:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:40:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pfO-0001TA-7S; Fri, 04 Dec 2015 12:40:50 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pfM-0001Sw-E0
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:40:48 +0000
Received: from [193.109.254.147] by server-6.bemta-14.messagelabs.com id
	DD/50-16618-FC981665; Fri, 04 Dec 2015 12:40:47 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1449232845!5002590!1
X-Originating-IP: [209.85.160.174]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23109 invoked from network); 4 Dec 2015 12:40:46 -0000
Received: from mail-yk0-f174.google.com (HELO mail-yk0-f174.google.com)
	(209.85.160.174)
	by server-8.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:40:46 -0000
Received: by ykba77 with SMTP id a77so121852781ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:40:45 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=I8P1SOqNKb9l4rWKhLMHfMPZ8H0FTLtVvjC/KIqcAmk=;
	b=WLk0A7CK7ac0WtvvrIzwd7rpywIKdhvmzgktoe4Fq+PMpU6Fvfid0u53ljvG5kBZgo
	D2PoxypQlu6m98FvAMskhNNghdqeG5sUNtvvRgMawLpa3Nin0H0nGbqmqF2Vd2xPlfhZ
	Spmi+aGqmeFEixQluc6lnlhQPyGqeUkr25pLwgjFulRy7wfkah8S1UvrnpvY3pUfu9jz
	2o3GpS98MjmxEn64Rfqh3Ts3kYOQ84QTmg4ZW3i+K02fNQKcV57jOW3yRj0z6NgbiAty
	/D5TZ8lnTNAovYSPiZZT6MZb4vm4Ldn9VwiTXKSQTnVxoJ7lNGH1C4efiyNmUiWyG0NX
	gMFg==
X-Received: by 10.13.229.3 with SMTP id o3mr10706422ywe.341.1449232845659;
	Fri, 04 Dec 2015 04:40:45 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	q63sm8823610ywf.16.2015.12.04.04.40.44
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:40:45 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:40:30 +0000
Message-Id: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/3] Move check for split event channels into
	Frontend module
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Reduce code duplication and efficiency a little by checking the xenstore
key once in Frontend and then providing a function with Transmitter and
Receiver can use to grab the value.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/frontend.c    | 49 +++++++++++++++++++++++++++++++++++++++++++++++-
 src/xenvif/frontend.h    |  5 +++++
 src/xenvif/receiver.c    | 20 ++------------------
 src/xenvif/transmitter.c | 36 +++++++++++++++--------------------
 4 files changed, 70 insertions(+), 40 deletions(-)

diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index 98efee5..b066d0b 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -70,6 +70,7 @@ struct _XENVIF_FRONTEND {
     USHORT                      BackendDomain;
     ULONG                       MaxQueues;
     ULONG                       NumQueues;
+    BOOLEAN                     Split;
 
     PXENVIF_MAC                 Mac;
     PXENVIF_RECEIVER            Receiver;
@@ -1674,7 +1675,8 @@ FrontendSetNumQueues(
         BackendMaxQueues = 1;
     }
 
-    Frontend->NumQueues = __min(Frontend->MaxQueues, BackendMaxQueues);
+    Frontend->NumQueues = __min(__FrontendGetMaxQueues(Frontend),
+                                BackendMaxQueues);
 
     Info("%s: %u\n", __FrontendGetPath(Frontend), Frontend->NumQueues);
 }
@@ -1695,6 +1697,50 @@ FrontendGetNumQueues(
     return __FrontendGetNumQueues(Frontend);
 }
 
+static VOID
+FrontendSetSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    PCHAR                   Buffer;
+    NTSTATUS                status;
+
+    status = XENBUS_STORE(Read,
+                          &Frontend->StoreInterface,
+                          NULL,
+                          __FrontendGetBackendPath(Frontend),
+                          "feature-split-event-channels",
+                          &Buffer);
+    if (NT_SUCCESS(status)) {
+        Frontend->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
+
+        XENBUS_STORE(Free,
+                     &Frontend->StoreInterface,
+                     Buffer);
+    } else {
+        Frontend->Split = FALSE;
+    }
+
+    Info("%s: %s\n", __FrontendGetPath(Frontend),
+         (Frontend->Split) ? "TRUE" : "FALSE");
+}
+
+static FORCEINLINE BOOLEAN
+__FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    return Frontend->Split;
+}
+
+BOOLEAN
+FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    )
+{
+    return __FrontendIsSplit(Frontend);
+}
+
 static NTSTATUS
 FrontendConnect(
     IN  PXENVIF_FRONTEND    Frontend
@@ -1731,6 +1777,7 @@ FrontendConnect(
         goto fail4;
 
     FrontendSetNumQueues(Frontend);
+    FrontendSetSplit(Frontend);
 
     status = ReceiverConnect(__FrontendGetReceiver(Frontend));
     if (!NT_SUCCESS(status))
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index bd39767..eda9e3d 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -122,6 +122,11 @@ FrontendGetNumQueues(
     IN  PXENVIF_FRONTEND    Frontend
     );
 
+extern BOOLEAN
+FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    );
+
 extern PCHAR
 FrontendFormatPath(
     IN  PXENVIF_FRONTEND    Frontend,
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index c6f64b5..36557b7 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -2859,7 +2859,6 @@ ReceiverConnect(
 {
     PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
-    PCHAR                   Buffer;
     NTSTATUS                status;
 
     Trace("====>\n");
@@ -2886,21 +2885,7 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    status = XENBUS_STORE(Read,
-                          &Receiver->StoreInterface,
-                          NULL,
-                          FrontendGetBackendPath(Frontend),
-                          "feature-split-event-channels",
-                          &Buffer);
-    if (!NT_SUCCESS(status)) {
-        Receiver->Split = FALSE;
-    } else {
-        Receiver->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
-
-        XENBUS_STORE(Free,
-                     &Receiver->StoreInterface,
-                     Buffer);
-    }
+    Receiver->Split = FrontendIsSplit(Frontend);
 
     Receiver->NumQueues = FrontendGetNumQueues(Frontend);
     ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues);
@@ -3211,8 +3196,6 @@ ReceiverDisconnect(
 
     Frontend = Receiver->Frontend;
 
-    Receiver->Split = FALSE;
-
     XENBUS_DEBUG(Deregister,
                  &Receiver->DebugInterface,
                  Receiver->DebugCallback);
@@ -3226,6 +3209,7 @@ ReceiverDisconnect(
     }
 
     Receiver->NumQueues = 0;
+    Receiver->Split = FALSE;
 
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 5f84eb5..615d2d0 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -710,6 +710,15 @@ TransmitterRingDebugCallback(
                  Ring->PacketsUnprepared,
                  Ring->PacketsSent,
                  Ring->PacketsCompleted);
+
+    if (Transmitter->Split) {
+        // Dump event channel
+        XENBUS_DEBUG(Printf,
+                     &Transmitter->DebugInterface,
+                     "Events = %lu Dpcs = %lu\n",
+                     Ring->Events,
+                     Ring->Dpcs);
+    }
 }
 
 static BOOLEAN
@@ -3618,8 +3627,6 @@ __TransmitterRingDisconnect(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    Transmitter->Split = FALSE;
-
     if (Ring->Channel != NULL) {
         XENBUS_EVTCHN(Close,
                       &Transmitter->EvtchnInterface,
@@ -4189,22 +4196,6 @@ TransmitterConnect(
                           &Transmitter->StoreInterface,
                           NULL,
                           FrontendGetBackendPath(Frontend),
-                          "feature-split-event-channels",
-                          &Buffer);
-    if (!NT_SUCCESS(status)) {
-        Transmitter->Split = FALSE;
-    } else {
-        Transmitter->Split = (BOOLEAN)strtol(Buffer, NULL, 2);
-
-        XENBUS_STORE(Free,
-                     &Transmitter->StoreInterface,
-                     Buffer);
-    }
-
-    status = XENBUS_STORE(Read,
-                          &Transmitter->StoreInterface,
-                          NULL,
-                          FrontendGetBackendPath(Frontend),
                           "feature-multicast-control",
                           &Buffer);
     if (!NT_SUCCESS(status)) {
@@ -4217,6 +4208,8 @@ TransmitterConnect(
                      Buffer);
     }
 
+    Transmitter->Split = FrontendIsSplit(Frontend);
+
     Transmitter->NumQueues = FrontendGetNumQueues(Frontend);
     ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues);
 
@@ -4260,6 +4253,8 @@ fail9:
     }
 
     Transmitter->NumQueues = 0;
+    Transmitter->Split = FALSE;
+    Transmitter->MulticastControl = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
@@ -4401,9 +4396,6 @@ TransmitterDisconnect(
 
     Frontend = Transmitter->Frontend;
 
-    Transmitter->MulticastControl = FALSE;
-    Transmitter->Split = FALSE;
-
     XENBUS_DEBUG(Deregister,
                  &Transmitter->DebugInterface,
                  Transmitter->DebugCallback);
@@ -4417,6 +4409,8 @@ TransmitterDisconnect(
     }
 
     Transmitter->NumQueues = 0;
+    Transmitter->MulticastControl = FALSE;
+    Transmitter->Split = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:40:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:40:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pfP-0001TI-Ah; Fri, 04 Dec 2015 12:40:51 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pfN-0001T3-Ht
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:40:49 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	DA/A3-09570-0D981665; Fri, 04 Dec 2015 12:40:48 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-31.messagelabs.com!1449232847!1330750!1
X-Originating-IP: [209.85.160.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 48119 invoked from network); 4 Dec 2015 12:40:47 -0000
Received: from mail-yk0-f169.google.com (HELO mail-yk0-f169.google.com)
	(209.85.160.169)
	by server-16.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:40:47 -0000
Received: by ykdr82 with SMTP id r82so121781975ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:40:46 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=Kkz/vomWOfFVWa2OkXN7o98hq6DPFNWBkrBrBXmmbWU=;
	b=08EvJ/eXZfA3ZUvFO8fB8oAyC0Wukc6a9Bk9wojGiHxS2DyO1RIm04gh+aoILAGU0p
	gZaWbDhqxoATrSElqx4Jk7iTvg3lcNzR06uIyeH+u/ybeHGPqzYC+8YtTJEiA7W7QoTp
	JUyOqHAaQHqQDDikOOvdrz16M60bo24h6Fwh5i0kZlCO2fX5HJ9uQw7iEEiFRiwtFS0I
	zawL1car+yVklwF3ewcwRbOIsrvTKT+oKiB1bdH4mQCEsN27XPkkVFK6MdaMXLDvdsBU
	IGHfv5aad/9tDLHeQvFC3unCfACace/95rOvvEDBx7Glnhns31VQSplTRQaD5yRdOw9h
	QL8A==
X-Received: by 10.129.74.6 with SMTP id x6mr10575718ywa.316.1449232846866;
	Fri, 04 Dec 2015 04:40:46 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	q63sm8823610ywf.16.2015.12.04.04.40.45
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:40:46 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:40:31 +0000
Message-Id: <1449232832-20628-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
References: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/3] Stop caching MaxQueues,
	NumQueues and Split in Transmitter and Receiver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Just call the Frontend accessor when the values are required.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/receiver.c    | 72 +++++++++++++++++++++++---------------------
 src/xenvif/transmitter.c | 77 +++++++++++++++++++++++++-----------------------
 2 files changed, 79 insertions(+), 70 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 36557b7..030f84f 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -111,9 +111,6 @@ struct _XENVIF_RECEIVER {
     XENBUS_GNTTAB_INTERFACE GnttabInterface;
     XENBUS_EVTCHN_INTERFACE EvtchnInterface;
     PXENVIF_RECEIVER_RING   *Ring;
-    LONG                    MaxQueues;
-    LONG                    NumQueues;
-    BOOLEAN                 Split;
     LONG                    Loaned;
     LONG                    Returned;
     KEVENT                  Event;
@@ -1737,10 +1734,12 @@ ReceiverRingDebugCallback(
 {
     PXENVIF_RECEIVER_RING       Ring = Argument;
     PXENVIF_RECEIVER            Receiver;
+    PXENVIF_FRONTEND            Frontend;
 
     UNREFERENCED_PARAMETER(Crashing);
 
     Receiver = Ring->Receiver;
+    Frontend = Receiver->Frontend;
 
     XENBUS_DEBUG(Printf,
                  &Receiver->DebugInterface,
@@ -1779,7 +1778,7 @@ ReceiverRingDebugCallback(
     XENBUS_DEBUG(Printf,
                  &Receiver->DebugInterface,
                  "[%s]: Events = %lu Dpcs = %lu\n",
-                 Receiver->Split ? "RX" : "COMBINED",
+                 FrontendIsSplit(Frontend) ? "RX" : "COMBINED",
                  Ring->Events,
                  Ring->Dpcs);
 }
@@ -2014,7 +2013,7 @@ ReceiverRingDpc(
 
     if (Ring->Enabled) {
         __ReceiverRingNotify(Ring);
-        if (!Receiver->Split)
+        if (!FrontendIsSplit(Frontend))
             TransmitterNotify(FrontendGetTransmitter(Frontend),
                               Ring->Index);
     }
@@ -2441,7 +2440,7 @@ __ReceiverRingStoreWrite(
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
-    Path = (Receiver->NumQueues == 1) ?
+    Path = (FrontendGetNumQueues(Frontend) == 1) ?
            FrontendGetPath(Frontend) :
            Ring->Path;
 
@@ -2465,7 +2464,7 @@ __ReceiverRingStoreWrite(
                           &Receiver->StoreInterface,
                           Transaction,
                           Path,
-                          Receiver->Split ? "event-channel-rx" : "event-channel",
+                          FrontendIsSplit(Frontend) ? "event-channel-rx" : "event-channel",
                           "%u",
                           Port);
     if (!NT_SUCCESS(status))
@@ -2695,6 +2694,7 @@ ReceiverInitialize(
     )
 {
     HANDLE                  ParametersKey;
+    LONG                    MaxQueues;
     LONG                    Index;
     NTSTATUS                status;
 
@@ -2777,16 +2777,16 @@ ReceiverInitialize(
 
     (*Receiver)->Frontend = Frontend;
 
-    (*Receiver)->MaxQueues = FrontendGetMaxQueues(Frontend);
+    MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Receiver)->Ring = __ReceiverAllocate(sizeof (PXENVIF_RECEIVER_RING) *
-                                           (*Receiver)->MaxQueues);
+                                           MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Receiver)->Ring == NULL)
         goto fail2;
 
     Index = 0;
-    while (Index < (*Receiver)->MaxQueues) {
+    while (Index < MaxQueues) {
         PXENVIF_RECEIVER_RING   Ring;
 
         status = __ReceiverRingInitialize(*Receiver, Index, &Ring);
@@ -2816,7 +2816,6 @@ fail3:
 fail2:
     Error("fail2\n");
 
-    (*Receiver)->MaxQueues = 0;
     (*Receiver)->Frontend = NULL;
 
     RtlZeroMemory(&(*Receiver)->EvtchnInterface,
@@ -2885,13 +2884,8 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    Receiver->Split = FrontendIsSplit(Frontend);
-
-    Receiver->NumQueues = FrontendGetNumQueues(Frontend);
-    ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues);
-
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingConnect(Ring);
@@ -2916,7 +2910,7 @@ ReceiverConnect(
 fail7:
     Error("fail7\n");
 
-    Index = Receiver->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
 
 fail6:
     Error("fail6\n");
@@ -2927,8 +2921,6 @@ fail6:
         __ReceiverRingDisconnect(Ring);
     }
 
-    Receiver->NumQueues = 0;
-
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
 fail5:
@@ -3092,7 +3084,7 @@ ReceiverStoreWrite(
         goto fail5;
 
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingStoreWrite(Ring, Transaction);
@@ -3130,13 +3122,16 @@ ReceiverEnable(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
     NTSTATUS                status;
 
     Trace("====>\n");
 
+    Frontend = Receiver->Frontend;
+
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingEnable(Ring);
@@ -3170,11 +3165,14 @@ ReceiverDisable(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
     Trace("====>\n");
 
-    Index = Receiver->NumQueues;
+    Frontend = Receiver->Frontend;
+
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
@@ -3201,16 +3199,13 @@ ReceiverDisconnect(
                  Receiver->DebugCallback);
     Receiver->DebugCallback = NULL;
 
-    Index = Receiver->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         __ReceiverRingDisconnect(Ring);
     }
 
-    Receiver->NumQueues = 0;
-    Receiver->Split = FALSE;
-
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
     XENBUS_CACHE(Release, &Receiver->CacheInterface);
@@ -3229,8 +3224,11 @@ ReceiverTeardown(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
+    Frontend = Receiver->Frontend;
+
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     KeFlushQueuedDpcs();
 
@@ -3238,7 +3236,7 @@ ReceiverTeardown(
     Receiver->Loaned = 0;
     Receiver->Returned = 0;
 
-    Index = Receiver->MaxQueues;
+    Index = FrontendGetMaxQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
@@ -3248,7 +3246,6 @@ ReceiverTeardown(
 
     __ReceiverFree(Receiver->Ring);
     Receiver->Ring = NULL;
-    Receiver->MaxQueues = 0;
 
     Receiver->Frontend = NULL;
 
@@ -3286,15 +3283,20 @@ ReceiverSetOffloadOptions(
     IN  XENVIF_VIF_OFFLOAD_OPTIONS  Options
     )
 {
+    PXENVIF_FRONTEND                Frontend;
     LONG                            Index;
 
+    Frontend = Receiver->Frontend;
+
     if (Receiver->AllowGsoPackets == 0) {
         Warning("RECEIVER GSO DISALLOWED\n");
         Options.OffloadIpVersion4LargePacket = 0;
         Options.OffloadIpVersion6LargePacket = 0;
     }
 
-    for (Index = 0; Index < Receiver->MaxQueues; ++Index) {
+    for (Index = 0;
+         Index < (LONG)FrontendGetMaxQueues(Frontend);
+         ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
         Ring = Receiver->Ring[Index];
@@ -3311,11 +3313,16 @@ ReceiverSetBackfillSize(
     IN  ULONG               Size
     )
 {
-    LONG                    Index;
+    PXENVIF_FRONTEND                Frontend;
+    LONG                            Index;
+
+    Frontend = Receiver->Frontend;
 
     ASSERT3U(Size, <, PAGE_SIZE);
 
-    for (Index = 0; Index < Receiver->MaxQueues; ++Index) {
+    for (Index = 0;
+         Index < (LONG)FrontendGetMaxQueues(Frontend);
+         ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
         Ring = Receiver->Ring[Index];
@@ -3419,7 +3426,6 @@ ReceiverSend(
 {
     PXENVIF_RECEIVER_RING   Ring;
 
-    ASSERT3U(Index, <, (ULONG)Receiver->NumQueues);
     Ring = Receiver->Ring[Index];
 
     __ReceiverRingSend(Ring, FALSE);
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 615d2d0..35ec80a 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -199,9 +199,6 @@ struct _XENVIF_TRANSMITTER {
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
     XENBUS_EVTCHN_INTERFACE     EvtchnInterface;
     PXENVIF_TRANSMITTER_RING    *Ring;
-    LONG                        MaxQueues;
-    LONG                        NumQueues;
-    BOOLEAN                     Split;
     BOOLEAN                     MulticastControl;
     ULONG                       DisableIpVersion4Gso;
     ULONG                       DisableIpVersion6Gso;
@@ -645,10 +642,12 @@ TransmitterRingDebugCallback(
 {
     PXENVIF_TRANSMITTER_RING    Ring = Argument;
     PXENVIF_TRANSMITTER         Transmitter;
+    PXENVIF_FRONTEND            Frontend;
 
     UNREFERENCED_PARAMETER(Crashing);
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     XENBUS_DEBUG(Printf,
                  &Transmitter->DebugInterface,
@@ -711,7 +710,7 @@ TransmitterRingDebugCallback(
                  Ring->PacketsSent,
                  Ring->PacketsCompleted);
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         // Dump event channel
         XENBUS_DEBUG(Printf,
                      &Transmitter->DebugInterface,
@@ -2498,13 +2497,15 @@ __TransmitterRingSend(
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     if (!Ring->Connected)
         return;
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         ASSERT(Ring->Channel != NULL);
 
         (VOID) XENBUS_EVTCHN(Send,
@@ -2918,7 +2919,6 @@ TransmitterRingDpc(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
-    ASSERT(Transmitter->Split);
 
     if (Ring->Enabled)
         __TransmitterRingNotify(Ring);
@@ -2942,7 +2942,6 @@ TransmitterRingEvtchnCallback(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
-    ASSERT(Transmitter->Split);
 
     Ring->Events++;
 
@@ -3289,7 +3288,7 @@ __TransmitterRingConnect(
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         Ring->Channel = XENBUS_EVTCHN(Open,
                                       &Transmitter->EvtchnInterface,
                                       XENBUS_EVTCHN_TYPE_UNBOUND,
@@ -3461,7 +3460,7 @@ __TransmitterRingStoreWrite(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    Path = (Transmitter->NumQueues == 1) ?
+    Path = (FrontendGetNumQueues(Frontend) == 1) ?
            FrontendGetPath(Frontend) :
            Ring->Path;
 
@@ -3477,7 +3476,7 @@ __TransmitterRingStoreWrite(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    if (!Transmitter->Split)
+    if (!FrontendIsSplit(Frontend))
         goto done;
 
     Port = XENBUS_EVTCHN(GetPort,
@@ -3512,15 +3511,17 @@ __TransmitterRingEnable(
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     __TransmitterRingAcquireLock(Ring);
 
     ASSERT(!Ring->Enabled);
     Ring->Enabled = TRUE;
 
-    if (Transmitter->Split &&
+    if (FrontendIsSplit(Frontend) &&
         KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
         Ring->Dpcs++;
 
@@ -3995,6 +3996,7 @@ TransmitterInitialize(
     )
 {
     HANDLE                  ParametersKey;
+    LONG                    MaxQueues;
     LONG                    Index;
     NTSTATUS                status;
 
@@ -4055,16 +4057,16 @@ TransmitterInitialize(
     (*Transmitter)->Frontend = Frontend;
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
-    (*Transmitter)->MaxQueues = FrontendGetMaxQueues(Frontend);
+    MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Transmitter)->Ring = __TransmitterAllocate(sizeof (PXENVIF_TRANSMITTER_RING) *
-                                                 (*Transmitter)->MaxQueues);
+                                                 MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Transmitter)->Ring == NULL)
         goto fail2;
 
     Index = 0;
-    while (Index < (*Transmitter)->MaxQueues) {
+    while (Index < MaxQueues) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
         status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
@@ -4093,8 +4095,6 @@ fail3:
 fail2:
     Error("fail2\n");
 
-    (*Transmitter)->MaxQueues = 0;
-
     (*Transmitter)->Frontend = NULL;
 
     RtlZeroMemory(&(*Transmitter)->Lock,
@@ -4208,13 +4208,8 @@ TransmitterConnect(
                      Buffer);
     }
 
-    Transmitter->Split = FrontendIsSplit(Frontend);
-
-    Transmitter->NumQueues = FrontendGetNumQueues(Frontend);
-    ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues);
-
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         status = __TransmitterRingConnect(Ring);
@@ -4239,7 +4234,7 @@ TransmitterConnect(
 fail10:
     Error("fail10\n");
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
 
 fail9:
     Error("fail9\n");
@@ -4252,8 +4247,6 @@ fail9:
         __TransmitterRingDisconnect(Ring);
     }
 
-    Transmitter->NumQueues = 0;
-    Transmitter->Split = FALSE;
     Transmitter->MulticastControl = FALSE;
 
     XENBUS_CACHE(Destroy,
@@ -4323,7 +4316,7 @@ TransmitterStoreWrite(
         goto fail1;
 
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         status = __TransmitterRingStoreWrite(Ring, Transaction);
@@ -4349,12 +4342,15 @@ TransmitterEnable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
     Trace("====>\n");
 
+    Frontend = Transmitter->Frontend;
+
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         __TransmitterRingEnable(Ring);
@@ -4370,11 +4366,14 @@ TransmitterDisable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND       Frontend;
     LONG                   Index;
 
     Trace("====>\n");
 
-    Index = Transmitter->NumQueues;
+    Frontend = Transmitter->Frontend;
+
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4401,16 +4400,14 @@ TransmitterDisconnect(
                  Transmitter->DebugCallback);
     Transmitter->DebugCallback = NULL;
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         __TransmitterRingDisconnect(Ring);
     }
 
-    Transmitter->NumQueues = 0;
     Transmitter->MulticastControl = FALSE;
-    Transmitter->Split = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
@@ -4437,12 +4434,15 @@ TransmitterTeardown(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
+    Frontend = Transmitter->Frontend;
+
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     KeFlushQueuedDpcs();
 
-    Index = Transmitter->MaxQueues;
+    Index = FrontendGetMaxQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4452,7 +4452,6 @@ TransmitterTeardown(
 
     __TransmitterFree(Transmitter->Ring);
     Transmitter->Ring = NULL;
-    Transmitter->MaxQueues = 0;
 
     Transmitter->Frontend = NULL;
 
@@ -4583,10 +4582,12 @@ TransmitterQueuePackets(
 {
     PXENVIF_TRANSMITTER_RING    Ring;
     PXENVIF_FRONTEND            Frontend;
+    LONG                        NumQueues;
 
     Frontend = Transmitter->Frontend;
+    NumQueues = FrontendGetNumQueues(Frontend);
 
-    if (Transmitter->NumQueues == 1) {
+    if (NumQueues == 1) {
         Ring = Transmitter->Ring[0];
 
         __TransmitterRingQueuePackets(Ring, List);
@@ -4610,7 +4611,7 @@ TransmitterQueuePackets(
 
                 Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
 
-                Hash = Packet->Value % Transmitter->NumQueues;
+                Hash = Packet->Value % NumQueues;
                 if (Hash != Index) {
                     if (!IsListEmpty(&HashList)) {
                         Ring = Transmitter->Ring[Index];
@@ -4644,12 +4645,15 @@ TransmitterAbortPackets(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     KIRQL                   Irql;
     LONG                    Index;
 
+    Frontend = Transmitter->Frontend;
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4712,7 +4716,6 @@ TransmitterNotify(
 {
     PXENVIF_TRANSMITTER_RING    Ring;
 
-    ASSERT3U(Index, <, (ULONG)Transmitter->NumQueues);
     Ring = Transmitter->Ring[Index];
 
     __TransmitterRingNotify(Ring);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:40:51 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:40:51 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pfP-0001TI-Ah; Fri, 04 Dec 2015 12:40:51 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pfN-0001T3-Ht
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:40:49 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	DA/A3-09570-0D981665; Fri, 04 Dec 2015 12:40:48 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-31.messagelabs.com!1449232847!1330750!1
X-Originating-IP: [209.85.160.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 48119 invoked from network); 4 Dec 2015 12:40:47 -0000
Received: from mail-yk0-f169.google.com (HELO mail-yk0-f169.google.com)
	(209.85.160.169)
	by server-16.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:40:47 -0000
Received: by ykdr82 with SMTP id r82so121781975ykd.3
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:40:46 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=Kkz/vomWOfFVWa2OkXN7o98hq6DPFNWBkrBrBXmmbWU=;
	b=08EvJ/eXZfA3ZUvFO8fB8oAyC0Wukc6a9Bk9wojGiHxS2DyO1RIm04gh+aoILAGU0p
	gZaWbDhqxoATrSElqx4Jk7iTvg3lcNzR06uIyeH+u/ybeHGPqzYC+8YtTJEiA7W7QoTp
	JUyOqHAaQHqQDDikOOvdrz16M60bo24h6Fwh5i0kZlCO2fX5HJ9uQw7iEEiFRiwtFS0I
	zawL1car+yVklwF3ewcwRbOIsrvTKT+oKiB1bdH4mQCEsN27XPkkVFK6MdaMXLDvdsBU
	IGHfv5aad/9tDLHeQvFC3unCfACace/95rOvvEDBx7Glnhns31VQSplTRQaD5yRdOw9h
	QL8A==
X-Received: by 10.129.74.6 with SMTP id x6mr10575718ywa.316.1449232846866;
	Fri, 04 Dec 2015 04:40:46 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	q63sm8823610ywf.16.2015.12.04.04.40.45
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:40:46 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:40:31 +0000
Message-Id: <1449232832-20628-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
References: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/3] Stop caching MaxQueues,
	NumQueues and Split in Transmitter and Receiver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Just call the Frontend accessor when the values are required.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/receiver.c    | 72 +++++++++++++++++++++++---------------------
 src/xenvif/transmitter.c | 77 +++++++++++++++++++++++++-----------------------
 2 files changed, 79 insertions(+), 70 deletions(-)

diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 36557b7..030f84f 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -111,9 +111,6 @@ struct _XENVIF_RECEIVER {
     XENBUS_GNTTAB_INTERFACE GnttabInterface;
     XENBUS_EVTCHN_INTERFACE EvtchnInterface;
     PXENVIF_RECEIVER_RING   *Ring;
-    LONG                    MaxQueues;
-    LONG                    NumQueues;
-    BOOLEAN                 Split;
     LONG                    Loaned;
     LONG                    Returned;
     KEVENT                  Event;
@@ -1737,10 +1734,12 @@ ReceiverRingDebugCallback(
 {
     PXENVIF_RECEIVER_RING       Ring = Argument;
     PXENVIF_RECEIVER            Receiver;
+    PXENVIF_FRONTEND            Frontend;
 
     UNREFERENCED_PARAMETER(Crashing);
 
     Receiver = Ring->Receiver;
+    Frontend = Receiver->Frontend;
 
     XENBUS_DEBUG(Printf,
                  &Receiver->DebugInterface,
@@ -1779,7 +1778,7 @@ ReceiverRingDebugCallback(
     XENBUS_DEBUG(Printf,
                  &Receiver->DebugInterface,
                  "[%s]: Events = %lu Dpcs = %lu\n",
-                 Receiver->Split ? "RX" : "COMBINED",
+                 FrontendIsSplit(Frontend) ? "RX" : "COMBINED",
                  Ring->Events,
                  Ring->Dpcs);
 }
@@ -2014,7 +2013,7 @@ ReceiverRingDpc(
 
     if (Ring->Enabled) {
         __ReceiverRingNotify(Ring);
-        if (!Receiver->Split)
+        if (!FrontendIsSplit(Frontend))
             TransmitterNotify(FrontendGetTransmitter(Frontend),
                               Ring->Index);
     }
@@ -2441,7 +2440,7 @@ __ReceiverRingStoreWrite(
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
-    Path = (Receiver->NumQueues == 1) ?
+    Path = (FrontendGetNumQueues(Frontend) == 1) ?
            FrontendGetPath(Frontend) :
            Ring->Path;
 
@@ -2465,7 +2464,7 @@ __ReceiverRingStoreWrite(
                           &Receiver->StoreInterface,
                           Transaction,
                           Path,
-                          Receiver->Split ? "event-channel-rx" : "event-channel",
+                          FrontendIsSplit(Frontend) ? "event-channel-rx" : "event-channel",
                           "%u",
                           Port);
     if (!NT_SUCCESS(status))
@@ -2695,6 +2694,7 @@ ReceiverInitialize(
     )
 {
     HANDLE                  ParametersKey;
+    LONG                    MaxQueues;
     LONG                    Index;
     NTSTATUS                status;
 
@@ -2777,16 +2777,16 @@ ReceiverInitialize(
 
     (*Receiver)->Frontend = Frontend;
 
-    (*Receiver)->MaxQueues = FrontendGetMaxQueues(Frontend);
+    MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Receiver)->Ring = __ReceiverAllocate(sizeof (PXENVIF_RECEIVER_RING) *
-                                           (*Receiver)->MaxQueues);
+                                           MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Receiver)->Ring == NULL)
         goto fail2;
 
     Index = 0;
-    while (Index < (*Receiver)->MaxQueues) {
+    while (Index < MaxQueues) {
         PXENVIF_RECEIVER_RING   Ring;
 
         status = __ReceiverRingInitialize(*Receiver, Index, &Ring);
@@ -2816,7 +2816,6 @@ fail3:
 fail2:
     Error("fail2\n");
 
-    (*Receiver)->MaxQueues = 0;
     (*Receiver)->Frontend = NULL;
 
     RtlZeroMemory(&(*Receiver)->EvtchnInterface,
@@ -2885,13 +2884,8 @@ ReceiverConnect(
     if (!NT_SUCCESS(status))
         goto fail5;
 
-    Receiver->Split = FrontendIsSplit(Frontend);
-
-    Receiver->NumQueues = FrontendGetNumQueues(Frontend);
-    ASSERT3U(Receiver->NumQueues, <=, Receiver->MaxQueues);
-
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingConnect(Ring);
@@ -2916,7 +2910,7 @@ ReceiverConnect(
 fail7:
     Error("fail7\n");
 
-    Index = Receiver->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
 
 fail6:
     Error("fail6\n");
@@ -2927,8 +2921,6 @@ fail6:
         __ReceiverRingDisconnect(Ring);
     }
 
-    Receiver->NumQueues = 0;
-
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
 fail5:
@@ -3092,7 +3084,7 @@ ReceiverStoreWrite(
         goto fail5;
 
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingStoreWrite(Ring, Transaction);
@@ -3130,13 +3122,16 @@ ReceiverEnable(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
     NTSTATUS                status;
 
     Trace("====>\n");
 
+    Frontend = Receiver->Frontend;
+
     Index = 0;
-    while (Index < Receiver->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         status = __ReceiverRingEnable(Ring);
@@ -3170,11 +3165,14 @@ ReceiverDisable(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
     Trace("====>\n");
 
-    Index = Receiver->NumQueues;
+    Frontend = Receiver->Frontend;
+
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
@@ -3201,16 +3199,13 @@ ReceiverDisconnect(
                  Receiver->DebugCallback);
     Receiver->DebugCallback = NULL;
 
-    Index = Receiver->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
         __ReceiverRingDisconnect(Ring);
     }
 
-    Receiver->NumQueues = 0;
-    Receiver->Split = FALSE;
-
     XENBUS_GNTTAB(Release, &Receiver->GnttabInterface);
 
     XENBUS_CACHE(Release, &Receiver->CacheInterface);
@@ -3229,8 +3224,11 @@ ReceiverTeardown(
     IN  PXENVIF_RECEIVER    Receiver
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
+    Frontend = Receiver->Frontend;
+
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     KeFlushQueuedDpcs();
 
@@ -3238,7 +3236,7 @@ ReceiverTeardown(
     Receiver->Loaned = 0;
     Receiver->Returned = 0;
 
-    Index = Receiver->MaxQueues;
+    Index = FrontendGetMaxQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_RECEIVER_RING   Ring = Receiver->Ring[Index];
 
@@ -3248,7 +3246,6 @@ ReceiverTeardown(
 
     __ReceiverFree(Receiver->Ring);
     Receiver->Ring = NULL;
-    Receiver->MaxQueues = 0;
 
     Receiver->Frontend = NULL;
 
@@ -3286,15 +3283,20 @@ ReceiverSetOffloadOptions(
     IN  XENVIF_VIF_OFFLOAD_OPTIONS  Options
     )
 {
+    PXENVIF_FRONTEND                Frontend;
     LONG                            Index;
 
+    Frontend = Receiver->Frontend;
+
     if (Receiver->AllowGsoPackets == 0) {
         Warning("RECEIVER GSO DISALLOWED\n");
         Options.OffloadIpVersion4LargePacket = 0;
         Options.OffloadIpVersion6LargePacket = 0;
     }
 
-    for (Index = 0; Index < Receiver->MaxQueues; ++Index) {
+    for (Index = 0;
+         Index < (LONG)FrontendGetMaxQueues(Frontend);
+         ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
         Ring = Receiver->Ring[Index];
@@ -3311,11 +3313,16 @@ ReceiverSetBackfillSize(
     IN  ULONG               Size
     )
 {
-    LONG                    Index;
+    PXENVIF_FRONTEND                Frontend;
+    LONG                            Index;
+
+    Frontend = Receiver->Frontend;
 
     ASSERT3U(Size, <, PAGE_SIZE);
 
-    for (Index = 0; Index < Receiver->MaxQueues; ++Index) {
+    for (Index = 0;
+         Index < (LONG)FrontendGetMaxQueues(Frontend);
+         ++Index) {
         PXENVIF_RECEIVER_RING   Ring;
 
         Ring = Receiver->Ring[Index];
@@ -3419,7 +3426,6 @@ ReceiverSend(
 {
     PXENVIF_RECEIVER_RING   Ring;
 
-    ASSERT3U(Index, <, (ULONG)Receiver->NumQueues);
     Ring = Receiver->Ring[Index];
 
     __ReceiverRingSend(Ring, FALSE);
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 615d2d0..35ec80a 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -199,9 +199,6 @@ struct _XENVIF_TRANSMITTER {
     XENBUS_RANGE_SET_INTERFACE  RangeSetInterface;
     XENBUS_EVTCHN_INTERFACE     EvtchnInterface;
     PXENVIF_TRANSMITTER_RING    *Ring;
-    LONG                        MaxQueues;
-    LONG                        NumQueues;
-    BOOLEAN                     Split;
     BOOLEAN                     MulticastControl;
     ULONG                       DisableIpVersion4Gso;
     ULONG                       DisableIpVersion6Gso;
@@ -645,10 +642,12 @@ TransmitterRingDebugCallback(
 {
     PXENVIF_TRANSMITTER_RING    Ring = Argument;
     PXENVIF_TRANSMITTER         Transmitter;
+    PXENVIF_FRONTEND            Frontend;
 
     UNREFERENCED_PARAMETER(Crashing);
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     XENBUS_DEBUG(Printf,
                  &Transmitter->DebugInterface,
@@ -711,7 +710,7 @@ TransmitterRingDebugCallback(
                  Ring->PacketsSent,
                  Ring->PacketsCompleted);
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         // Dump event channel
         XENBUS_DEBUG(Printf,
                      &Transmitter->DebugInterface,
@@ -2498,13 +2497,15 @@ __TransmitterRingSend(
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     if (!Ring->Connected)
         return;
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         ASSERT(Ring->Channel != NULL);
 
         (VOID) XENBUS_EVTCHN(Send,
@@ -2918,7 +2919,6 @@ TransmitterRingDpc(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
-    ASSERT(Transmitter->Split);
 
     if (Ring->Enabled)
         __TransmitterRingNotify(Ring);
@@ -2942,7 +2942,6 @@ TransmitterRingEvtchnCallback(
     ASSERT(Ring != NULL);
 
     Transmitter = Ring->Transmitter;
-    ASSERT(Transmitter->Split);
 
     Ring->Events++;
 
@@ -3289,7 +3288,7 @@ __TransmitterRingConnect(
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
-    if (Transmitter->Split) {
+    if (FrontendIsSplit(Frontend)) {
         Ring->Channel = XENBUS_EVTCHN(Open,
                                       &Transmitter->EvtchnInterface,
                                       XENBUS_EVTCHN_TYPE_UNBOUND,
@@ -3461,7 +3460,7 @@ __TransmitterRingStoreWrite(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    Path = (Transmitter->NumQueues == 1) ?
+    Path = (FrontendGetNumQueues(Frontend) == 1) ?
            FrontendGetPath(Frontend) :
            Ring->Path;
 
@@ -3477,7 +3476,7 @@ __TransmitterRingStoreWrite(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    if (!Transmitter->Split)
+    if (!FrontendIsSplit(Frontend))
         goto done;
 
     Port = XENBUS_EVTCHN(GetPort,
@@ -3512,15 +3511,17 @@ __TransmitterRingEnable(
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
+    PXENVIF_FRONTEND                Frontend;
 
     Transmitter = Ring->Transmitter;
+    Frontend = Transmitter->Frontend;
 
     __TransmitterRingAcquireLock(Ring);
 
     ASSERT(!Ring->Enabled);
     Ring->Enabled = TRUE;
 
-    if (Transmitter->Split &&
+    if (FrontendIsSplit(Frontend) &&
         KeInsertQueueDpc(&Ring->Dpc, NULL, NULL))
         Ring->Dpcs++;
 
@@ -3995,6 +3996,7 @@ TransmitterInitialize(
     )
 {
     HANDLE                  ParametersKey;
+    LONG                    MaxQueues;
     LONG                    Index;
     NTSTATUS                status;
 
@@ -4055,16 +4057,16 @@ TransmitterInitialize(
     (*Transmitter)->Frontend = Frontend;
     KeInitializeSpinLock(&(*Transmitter)->Lock);
 
-    (*Transmitter)->MaxQueues = FrontendGetMaxQueues(Frontend);
+    MaxQueues = FrontendGetMaxQueues(Frontend);
     (*Transmitter)->Ring = __TransmitterAllocate(sizeof (PXENVIF_TRANSMITTER_RING) *
-                                                 (*Transmitter)->MaxQueues);
+                                                 MaxQueues);
 
     status = STATUS_NO_MEMORY;
     if ((*Transmitter)->Ring == NULL)
         goto fail2;
 
     Index = 0;
-    while (Index < (*Transmitter)->MaxQueues) {
+    while (Index < MaxQueues) {
         PXENVIF_TRANSMITTER_RING    Ring;
 
         status = __TransmitterRingInitialize(*Transmitter, Index, &Ring);
@@ -4093,8 +4095,6 @@ fail3:
 fail2:
     Error("fail2\n");
 
-    (*Transmitter)->MaxQueues = 0;
-
     (*Transmitter)->Frontend = NULL;
 
     RtlZeroMemory(&(*Transmitter)->Lock,
@@ -4208,13 +4208,8 @@ TransmitterConnect(
                      Buffer);
     }
 
-    Transmitter->Split = FrontendIsSplit(Frontend);
-
-    Transmitter->NumQueues = FrontendGetNumQueues(Frontend);
-    ASSERT3U(Transmitter->NumQueues, <=, Transmitter->MaxQueues);
-
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         status = __TransmitterRingConnect(Ring);
@@ -4239,7 +4234,7 @@ TransmitterConnect(
 fail10:
     Error("fail10\n");
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
 
 fail9:
     Error("fail9\n");
@@ -4252,8 +4247,6 @@ fail9:
         __TransmitterRingDisconnect(Ring);
     }
 
-    Transmitter->NumQueues = 0;
-    Transmitter->Split = FALSE;
     Transmitter->MulticastControl = FALSE;
 
     XENBUS_CACHE(Destroy,
@@ -4323,7 +4316,7 @@ TransmitterStoreWrite(
         goto fail1;
 
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         status = __TransmitterRingStoreWrite(Ring, Transaction);
@@ -4349,12 +4342,15 @@ TransmitterEnable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
     Trace("====>\n");
 
+    Frontend = Transmitter->Frontend;
+
     Index = 0;
-    while (Index < Transmitter->NumQueues) {
+    while (Index < (LONG)FrontendGetNumQueues(Frontend)) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         __TransmitterRingEnable(Ring);
@@ -4370,11 +4366,14 @@ TransmitterDisable(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND       Frontend;
     LONG                   Index;
 
     Trace("====>\n");
 
-    Index = Transmitter->NumQueues;
+    Frontend = Transmitter->Frontend;
+
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4401,16 +4400,14 @@ TransmitterDisconnect(
                  Transmitter->DebugCallback);
     Transmitter->DebugCallback = NULL;
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
         __TransmitterRingDisconnect(Ring);
     }
 
-    Transmitter->NumQueues = 0;
     Transmitter->MulticastControl = FALSE;
-    Transmitter->Split = FALSE;
 
     XENBUS_CACHE(Destroy,
                  &Transmitter->CacheInterface,
@@ -4437,12 +4434,15 @@ TransmitterTeardown(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     LONG                    Index;
 
+    Frontend = Transmitter->Frontend;
+
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     KeFlushQueuedDpcs();
 
-    Index = Transmitter->MaxQueues;
+    Index = FrontendGetMaxQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4452,7 +4452,6 @@ TransmitterTeardown(
 
     __TransmitterFree(Transmitter->Ring);
     Transmitter->Ring = NULL;
-    Transmitter->MaxQueues = 0;
 
     Transmitter->Frontend = NULL;
 
@@ -4583,10 +4582,12 @@ TransmitterQueuePackets(
 {
     PXENVIF_TRANSMITTER_RING    Ring;
     PXENVIF_FRONTEND            Frontend;
+    LONG                        NumQueues;
 
     Frontend = Transmitter->Frontend;
+    NumQueues = FrontendGetNumQueues(Frontend);
 
-    if (Transmitter->NumQueues == 1) {
+    if (NumQueues == 1) {
         Ring = Transmitter->Ring[0];
 
         __TransmitterRingQueuePackets(Ring, List);
@@ -4610,7 +4611,7 @@ TransmitterQueuePackets(
 
                 Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
 
-                Hash = Packet->Value % Transmitter->NumQueues;
+                Hash = Packet->Value % NumQueues;
                 if (Hash != Index) {
                     if (!IsListEmpty(&HashList)) {
                         Ring = Transmitter->Ring[Index];
@@ -4644,12 +4645,15 @@ TransmitterAbortPackets(
     IN  PXENVIF_TRANSMITTER Transmitter
     )
 {
+    PXENVIF_FRONTEND        Frontend;
     KIRQL                   Irql;
     LONG                    Index;
 
+    Frontend = Transmitter->Frontend;
+
     KeRaiseIrql(DISPATCH_LEVEL, &Irql);
 
-    Index = Transmitter->NumQueues;
+    Index = FrontendGetNumQueues(Frontend);
     while (--Index >= 0) {
         PXENVIF_TRANSMITTER_RING    Ring = Transmitter->Ring[Index];
 
@@ -4712,7 +4716,6 @@ TransmitterNotify(
 {
     PXENVIF_TRANSMITTER_RING    Ring;
 
-    ASSERT3U(Index, <, (ULONG)Transmitter->NumQueues);
     Ring = Transmitter->Ring[Index];
 
     __TransmitterRingNotify(Ring);
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:40:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:40:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pfR-0001UJ-FK; Fri, 04 Dec 2015 12:40:53 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pfQ-0001TY-1N
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:40:52 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	AF/32-22142-3D981665; Fri, 04 Dec 2015 12:40:51 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1449232848!8260694!1
X-Originating-IP: [209.85.160.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9431 invoked from network); 4 Dec 2015 12:40:49 -0000
Received: from mail-yk0-f169.google.com (HELO mail-yk0-f169.google.com)
	(209.85.160.169)
	by server-14.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:40:49 -0000
Received: by ykdv3 with SMTP id v3so122060140ykd.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:40:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=jcZQXlFKX+wygHOE0ytUCUew44WELfCXDBAGZ8R5Cp4=;
	b=QihC3Sokq4D/6evv4qVe+yCwx7T/k7AmN/5MN658tszVEPBSYpFXXGPDkmlEhKpVmr
	qa2hLGvMvxttudG4PqlUfVtLdlOUqbcaoevwAcqLcwvAYUbIXmNfhcazL0Qa80UH+udl
	cSFuhXefnY73A8KQsglD7CJ5lTs15ZGBat+vZ0liSGWmPhjj0Af12EOoDYQ2zkTqB3US
	mLyO/URcQbyLFDoEKxV4/mq88j6tZU2VyIuWPj7j0TntkKrDibqvtDwmDtzrrxdYpCil
	BpKbcROyIF6iQG8RrVkyG/MKY0oqEX8QOgoSr6tUPnIP5H5PKa7WV0K6aUaS5rtMHcKM
	5Q7A==
X-Received: by 10.13.217.79 with SMTP id b76mr12596891ywe.339.1449232848253;
	Fri, 04 Dec 2015 04:40:48 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	q63sm8823610ywf.16.2015.12.04.04.40.46
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:40:47 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:40:32 +0000
Message-Id: <1449232832-20628-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
References: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/3] Introduce VIF interface version 4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This greatly simplifies the interface with XENNET by queuing single packets
on both the transmit and receive side, negating the need for a shared packet
structures and bringing static hash calculation into XENVIF.
Crucially this also means that XENNET no longer needs to use the
XENBUS_CACHE interface which allows it to be patched to avoid the race
introduced by commit 026aa32c "Make sure XENBUS interfaces are released when
going into S4".

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h       |   5 +-
 include/vif_interface.h  | 243 ++++++++++-------
 src/xenvif/frontend.c    |   3 +
 src/xenvif/frontend.h    |   5 +
 src/xenvif/receiver.c    | 295 ++++++++++++++-------
 src/xenvif/receiver.h    |   8 +-
 src/xenvif/transmitter.c | 660 ++++++++++++++++++++++++++++++++---------------
 src/xenvif/transmitter.h |  27 +-
 src/xenvif/vif.c         | 211 ++++++++++++---
 src/xenvif/vif.h         |  24 +-
 10 files changed, 1041 insertions(+), 440 deletions(-)

diff --git a/include/revision.h b/include/revision.h
index 77d1405..eda8871 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -42,6 +42,9 @@
 #define DEFINE_REVISION_TABLE                       \
     DEFINE_REVISION(0x08000002,  1,  2,  0,  0),    \
     DEFINE_REVISION(0x08000003,  1,  3,  0,  0),    \
-    DEFINE_REVISION(0x08000004,  1,  3,  2,  1)
+    DEFINE_REVISION(0x08000004,  1,  3,  2,  1),    \
+    DEFINE_REVISION(0x08000006,  1,  4,  2,  1)
+
+// Revision 0x08000005 is already in use in the staging-8.1 branch.
 
 #endif  // _REVISION_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index f6b6298..27c5d2d 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -43,6 +43,28 @@
 #include <ifdef.h>
 #include <ethernet.h>
 
+/*! \enum _XENVIF_PACKET_HASH_ALGORITHM
+    \brief Hash algorithm
+*/
+typedef enum _XENVIF_PACKET_HASH_ALGORITHM {
+    /*! None (value should be ignored) */
+    XENVIF_PACKET_HASH_ALGORITHM_NONE = 0,
+    /*! Unspecified hash (value can be used) */
+    XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED
+} XENVIF_PACKET_HASH_ALGORITHM, *PXENVIF_PACKET_HASH_ALGORITHM;
+
+/*! \struct _XENVIF_PACKET_HASH_V1
+    \brief Hash information
+*/
+struct _XENVIF_PACKET_HASH_V1 {
+    /*! Hash algorithm used to calculate value */
+    XENVIF_PACKET_HASH_ALGORITHM    Algorithm;
+    /*! Calculated value */
+    ULONG                           Value;
+};
+
+typedef struct _XENVIF_PACKET_HASH_V1 XENVIF_PACKET_HASH, *PXENVIF_PACKET_HASH;
+
 /*! \struct _XENVIF_PACKET_HEADER_V1
     \brief Packet header information
 */
@@ -53,14 +75,25 @@ struct  _XENVIF_PACKET_HEADER_V1 {
     ULONG   Length;
 };
 
-/*! \struct _XENVIF_PACKET_INFO_V1
+struct _XENVIF_PACKET_INFO_V1 {
+    ULONG                           Length;
+    USHORT                          TagControlInformation;
+    BOOLEAN                         IsAFragment;
+    struct _XENVIF_PACKET_HEADER_V1 EthernetHeader;
+    struct _XENVIF_PACKET_HEADER_V1 LLCSnapHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 TcpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 TcpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
+};
+
+/*! \struct _XENVIF_PACKET_INFO_V2
     \brief Packet information
 */
-struct _XENVIF_PACKET_INFO_V1 {
+struct _XENVIF_PACKET_INFO_V2 {
     /*! Total length of all headers */
     ULONG                           Length;
-    /*! VLAN TCI if present (0 indicates not present) */
-    USHORT                          TagControlInformation;
     /*! TRUE if the packet is an IP fragment */
     BOOLEAN                         IsAFragment;
     /*! Ethernet header (stripped of any VLAN tag) */
@@ -79,7 +112,7 @@ struct _XENVIF_PACKET_INFO_V1 {
     struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
 };
 
-typedef struct _XENVIF_PACKET_INFO_V1   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
+typedef struct _XENVIF_PACKET_INFO_V2   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
 
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
@@ -120,32 +153,18 @@ typedef struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 XENVIF_PACKET_CHECKSUM_FLAGS, *P
 
 #pragma warning(pop)
 
-/*! \struct _XENVIF_RECEIVER_PACKET_V1
-    \brief Receive-side packet structure
-*/
 struct _XENVIF_RECEIVER_PACKET_V1 {
-    /*! List entry used for chaining packets together */
     LIST_ENTRY                              ListEntry;
-    /*! Pointer to packet information */
     struct _XENVIF_PACKET_INFO_V1           *Info;
-    /*! Offset of start of packet in MDL */
     ULONG                                   Offset;
-    /*! Total length of packet */
     ULONG                                   Length;
-    /*! Checksum flags */
     struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 Flags;
-    /*! TCP MSS if the packet contains a TCP large segment */
     USHORT                                  MaximumSegmentSize;
-    /*! Opaque cookie used to store context information for packet return */
     PVOID                                   Cookie;
-    /*! MDL referencing the initial buffer of the packet */
     MDL                                     Mdl;
-    /*! PFN information, which must always follow an MDL */
     PFN_NUMBER                              __Pfn;
 };
 
-typedef struct _XENVIF_RECEIVER_PACKET_V1 XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET;
-
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
 #pragma warning(disable:4201)   // nonstandard extension used : nameless struct/union
@@ -190,32 +209,18 @@ typedef struct _XENVIF_VIF_OFFLOAD_OPTIONS_V1 XENVIF_VIF_OFFLOAD_OPTIONS, *PXENV
 
 #pragma pack(push, 1) 
 
-/*! \struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1
-    \brief Packet information passed from subscriber to provider on
-    transmit side packet send
-
-    To fit into the reserved space in NDIS_PACKET and NET_BUFFER structures
-    this structure must be at most the size of 3 pointer types.
-*/
 struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 {
-    /*! Offload options for this packet */
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
-    /*! TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set) */
     USHORT                      MaximumSegmentSize;
-    /*! VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set) */
     USHORT                      TagControlInformation;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 XENVIF_TRANSMITTER_PACKET_SEND_INFO, *PXENVIF_TRANSMITTER_PACKET_SEND_INFO;
-
 /*! \enum _XENVIF_TRANSMITTER_PACKET_STATUS
     \brief Transmit-side packet status
 */
 typedef enum _XENVIF_TRANSMITTER_PACKET_STATUS {
-    /*! Packet was queued for the backend */
-    XENVIF_TRANSMITTER_PACKET_PENDING = 1,
     /*! Packet has been successfully processed by the backend */
-    XENVIF_TRANSMITTER_PACKET_OK,
+    XENVIF_TRANSMITTER_PACKET_OK = 2,
     /*! Packet was dropped */
     XENVIF_TRANSMITTER_PACKET_DROPPED,
     /*! There was a problem handling the packet */
@@ -244,30 +249,17 @@ typedef struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 XENVIF_TRANSMITTER_
 
 #pragma pack(pop) 
 
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V2
-    \brief Transmit-side packet structure (v2)
-*/
 struct _XENVIF_TRANSMITTER_PACKET_V2 {
-    /*! List entry used for chaining packets together */
-    LIST_ENTRY                                  ListEntry;
-    /*! Opaque cookie used to store context information for packet return */
-    PVOID                                       Cookie;
-    /*! Hash value set by subscriber */
-    ULONG                                       Value;
-    /*! Packet information passed from subscriber to provider */
-    XENVIF_TRANSMITTER_PACKET_SEND_INFO         Send;
-    /*! Packet information passed from provider to subscriber on packet return */
-    XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
-    /*! Packet data MDL */
-    PMDL                                        Mdl;
-    /*! Offset into MDL to start of packet */
-    ULONG                                       Offset;
-    /*! Packet length */
-    ULONG                                       Length;
+    LIST_ENTRY                                              ListEntry;
+    PVOID                                                   Cookie;
+    ULONG                                                   Value;
+    struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1          Send;
+    struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1    Completion;
+    PMDL                                                    Mdl;
+    ULONG                                                   Offset;
+    ULONG                                                   Length;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_V2 XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
-
 /*! \enum _XENVIF_VIF_STATISTIC
     \brief Interface statistics
 */
@@ -327,10 +319,10 @@ typedef enum _XENVIF_MAC_FILTER_LEVEL {
     \brief Type of callback (see \ref XENVIF_VIF_CALLBACK)
 */
 typedef enum _XENVIF_VIF_CALLBACK_TYPE {
-    /*! Return transmit side packets to the subscriber */
-    XENVIF_TRANSMITTER_RETURN_PACKETS = 0,
-    /*! Queue receive side packets at the subscriber */
-    XENVIF_RECEIVER_QUEUE_PACKETS,
+    /*! Return a transmit side packet to the subscriber */
+    XENVIF_TRANSMITTER_RETURN_PACKET = 0,
+    /*! Queue a receive side packet at the subscriber */
+    XENVIF_RECEIVER_QUEUE_PACKET,
     /*! Notify the subscriber of a MAC (link) state has change */
     XENVIF_MAC_STATE_CHANGE
 } XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
@@ -362,11 +354,19 @@ typedef VOID
     \param Type The callback type
     \param ... Additional paramaters required by \a Type
 
-    \b XENVIF_TRANSMITTER_RETURN_PACKETS:
-    \param Head The head of a chain of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_TRANSMITTER_RETURN_PACKET:
+    \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+    \param Completion Packet completion information
 
-    \b XENVIF_RECEIVER_QUEUE_PACKETS:
-    \param List List of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_RECEIVER_QUEUE_PACKET:
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param Flags Packet checksum flags
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Info Header information for the packet
+    \param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
 
     \b XENVIF_MAC_STATE_CHANGE:
     No additional arguments
@@ -427,47 +427,65 @@ typedef NTSTATUS
     OUT PULONGLONG              Value
     );
 
-/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKETS
-    \brief Return packets queues for receive by \ref XENVIF_VIF_CALLBACK
-    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKETS)
-
-    \param Interface The interface header
-    \param List List of \ref _XENVIF_RECEIVER_PACKET_V1
-*/
 typedef VOID
-(*XENVIF_VIF_RECEIVER_RETURN_PACKETS)(
+(*XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1)(
     IN  PINTERFACE  Interface,
     IN  PLIST_ENTRY List
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
-    \brief Get the packet headers into supplied buffer
+/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKET
+    \brief Return packets queued for receive by \ref XENVIF_VIF_CALLBACK
+    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKET)
 
     \param Interface The interface header
-    \param Packet The packet to acquire headers for.
-    \param Headers The buffer to receive headers.
-    \param Info The offsets into Headers for relevant headers
+    \param Cookie Cookie passed to XENVIF_RECEIVER_QUEUE_PACKET callback
 */
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)(
-    IN  PINTERFACE                  Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+typedef VOID
+(*XENVIF_VIF_RECEIVER_RETURN_PACKET)(
+    IN  PINTERFACE  Interface,
+    IN  PVOID       Cookie
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS
-    \brief Queue transmit side packets at the provider
+typedef NTSTATUS
+(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2)(
+    IN  PINTERFACE                              Interface,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
+    );
 
-    \param Interface The interface header
-    \param List List of XENVIF_TRANSMITTER_PACKET
-*/
 typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS)(
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
     IN  PINTERFACE  Interface,
     IN  PLIST_ENTRY List
     );
 
+/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKET
+    \brief Queue a packet at the provider's transmit side
+
+    \param Interface The interface header
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param OffloadOptions The requested offload options for this packet
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Hash Hash information for the packet
+    \param Cookie A cookie specified by the caller that will be passed to the XENVIF_TRANSMITTER_RETURN_PACKET callback
+*/
+typedef VOID
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET)(
+    IN  PINTERFACE                  Interface,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    );
+
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
     \brief Query the available set of transmit side offload options
 
@@ -524,7 +542,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE
     \brief Query the maximum number of transmit side packets that can
-    be queued in the shared ring between frontend and backend
+    be queued in each shared ring between frontend and backend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -537,7 +555,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_RECEIVER_QUERY_RING_SIZE
     \brief Query the maximum number of receive side packets that can
-    be queued in the shared ring between backend and frontend
+    be queued in each shared ring between backend and frontend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -685,11 +703,11 @@ struct _XENVIF_VIF_INTERFACE_V2 {
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS            TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -714,12 +732,41 @@ struct _XENVIF_VIF_INTERFACE_V3 {
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
+    XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
+    XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
+    XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
+    XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
+    XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
+    XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
+    XENVIF_VIF_MAC_QUERY_STATE                      MacQueryState;
+    XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE         MacQueryMaximumFrameSize;
+    XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS          MacQueryPermanentAddress;
+    XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS            MacQueryCurrentAddress;
+    XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES        MacQueryMulticastAddresses;
+    XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES          MacSetMulticastAddresses;
+    XENVIF_VIF_MAC_SET_FILTER_LEVEL                 MacSetFilterLevel;
+    XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
+};
+
+/*! \struct _XENVIF_VIF_INTERFACE_V4
+    \brief VIF interface version 4
+    \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V4 {
+    INTERFACE                                       Interface;
+    XENVIF_VIF_ACQUIRE                              Acquire;
+    XENVIF_VIF_RELEASE                              Release;
+    XENVIF_VIF_ENABLE                               Enable;
+    XENVIF_VIF_DISABLE                              Disable;
+    XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
+    XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS            TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKET             TransmitterQueuePacket;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -733,7 +780,7 @@ struct _XENVIF_VIF_INTERFACE_V3 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V4 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
 
 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -744,6 +791,6 @@ typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER
 #endif  // _WINDLL
 
 #define XENVIF_VIF_INTERFACE_VERSION_MIN    2
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    3
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    4
 
 #endif  // _XENVIF_INTERFACE_H
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index b066d0b..a43a534 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -56,6 +56,7 @@ typedef struct _XENVIF_FRONTEND_STATISTICS {
     ULONGLONG   Value[XENVIF_VIF_STATISTIC_COUNT];
 } XENVIF_FRONTEND_STATISTICS, *PXENVIF_FRONTEND_STATISTICS;
 
+
 struct _XENVIF_FRONTEND {
     PXENVIF_PDO                 Pdo;
     PCHAR                       Path;
@@ -1898,6 +1899,7 @@ fail5:
 
     MacDisconnect(__FrontendGetMac(Frontend));
 
+    Frontend->Split = FALSE;
     Frontend->NumQueues = 0;
 
 fail4:
@@ -1938,6 +1940,7 @@ FrontendDisconnect(
     ReceiverDisconnect(__FrontendGetReceiver(Frontend));
     MacDisconnect(__FrontendGetMac(Frontend));
 
+    Frontend->Split = FALSE;
     Frontend->NumQueues = 0;
 
     XENBUS_DEBUG(Deregister,
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index eda9e3d..d90f977 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -127,6 +127,11 @@ FrontendIsSplit(
     IN  PXENVIF_FRONTEND    Frontend
     );
 
+extern BOOLEAN
+FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    );
+
 extern PCHAR
 FrontendFormatPath(
     IN  PXENVIF_FRONTEND    Frontend,
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 030f84f..53f322f 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -105,6 +105,19 @@ typedef struct _XENVIF_RECEIVER_RING {
     LIST_ENTRY                  PacketList;
 } XENVIF_RECEIVER_RING, *PXENVIF_RECEIVER_RING;
 
+typedef struct _XENVIF_RECEIVER_PACKET {
+    LIST_ENTRY                      ListEntry;
+    XENVIF_PACKET_INFO              Info;
+    ULONG                           Offset;
+    ULONG                           Length;
+    XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+    USHORT                          MaximumSegmentSize;
+    USHORT                          TagControlInformation;
+    PXENVIF_RECEIVER_RING           Ring;
+    MDL                             Mdl;
+    PFN_NUMBER                      __Pfn;
+} XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET;
+
 struct _XENVIF_RECEIVER {
     PXENVIF_FRONTEND        Frontend;
     XENBUS_CACHE_INTERFACE  CacheInterface;
@@ -149,29 +162,19 @@ ReceiverPacketCtor(
     IN  PVOID               Object
     )
 {
+    PXENVIF_RECEIVER_RING   Ring = Argument;
     PXENVIF_RECEIVER_PACKET Packet = Object;
-    PXENVIF_PACKET_INFO     Info;
-    PMDL		            Mdl;
-    PUCHAR  		        StartVa;
-    NTSTATUS		        status;
-
-    UNREFERENCED_PARAMETER(Argument);
+    PMDL                    Mdl;
+    PUCHAR                  StartVa;
+    NTSTATUS                status;
 
     ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_RECEIVER_PACKET)));
 
-    Info = __ReceiverAllocate(sizeof (XENVIF_PACKET_INFO));
-
-    status = STATUS_NO_MEMORY;
-    if (Info == NULL)
-        goto fail1;
-
-    Packet->Info = Info;
-
     Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Mdl == NULL)
-        goto fail2;
+        goto fail1;
 
     StartVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
     ASSERT(StartVa != NULL);
@@ -186,13 +189,9 @@ ReceiverPacketCtor(
 
     ExFreePool(Mdl);
 
-    return STATUS_SUCCESS;
+    Packet->Ring = Ring;
 
-fail2:
-    Error("fail2\n");
-
-    __ReceiverFree(Info);
-    Packet->Info = NULL;
+    return STATUS_SUCCESS;
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -208,11 +207,12 @@ ReceiverPacketDtor(
     IN  PVOID               Object
     )
 {
+    PXENVIF_RECEIVER_RING   Ring = Argument;
     PXENVIF_RECEIVER_PACKET Packet = Object;
     PMDL                    Mdl;
-    PXENVIF_PACKET_INFO     Info;
 
-    UNREFERENCED_PARAMETER(Argument);
+    ASSERT3P(Packet->Ring, ==, Ring);
+    Packet->Ring = NULL;
 
     Mdl = &Packet->Mdl;
 
@@ -222,11 +222,6 @@ ReceiverPacketDtor(
 
     RtlZeroMemory(Mdl, sizeof (MDL) + sizeof (PFN_NUMBER));
 
-    Info = Packet->Info;
-
-    __ReceiverFree(Info);
-    Packet->Info = NULL;
-
     ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_RECEIVER_PACKET)));
 }
 
@@ -248,7 +243,7 @@ __ReceiverRingGetPacket(
                           Ring->PacketCache,
                           Locked);
 
-    ASSERT(IsZeroMemory(Packet->Info, sizeof (XENVIF_PACKET_INFO)));
+    ASSERT(IsZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO)));
 
     return Packet;
 }
@@ -273,9 +268,9 @@ __ReceiverRingPutPacket(
     Packet->Length = 0;
     Packet->Flags.Value = 0;
     Packet->MaximumSegmentSize = 0;
-    Packet->Cookie = NULL;
+    Packet->TagControlInformation = 0;
 
-    RtlZeroMemory(Packet->Info, sizeof (XENVIF_PACKET_INFO));
+    RtlZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO));
 
     Mdl->MappedSystemVa = Mdl->StartVa;
     Mdl->ByteOffset = 0;
@@ -395,7 +390,7 @@ ReceiverRingProcessTag(
     PETHERNET_HEADER             EthernetHeader;
     ULONG                        Offset;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     PayloadLength = Packet->Length - Info->Length;
 
@@ -410,7 +405,7 @@ ReceiverRingProcessTag(
         Ring->OffloadOptions.OffloadTagManipulation == 0)
         return;
 
-    Info->TagControlInformation = NTOHS(EthernetHeader->Tagged.Tag.ControlInformation);
+    Packet->TagControlInformation = NTOHS(EthernetHeader->Tagged.Tag.ControlInformation);
 
     Offset = FIELD_OFFSET(ETHERNET_TAGGED_HEADER, Tag);
     RtlMoveMemory((PUCHAR)EthernetHeader + sizeof (ETHERNET_TAG),
@@ -464,7 +459,7 @@ ReceiverRingProcessChecksum(
 
     Receiver = Ring->Receiver;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     Payload.Mdl = &Packet->Mdl;
     Payload.Offset = Packet->Offset + Info->Length;
@@ -478,8 +473,8 @@ ReceiverRingProcessChecksum(
         Payload.Offset = 0;
     }
 
-    flags = (uint16_t)(ULONG_PTR)Packet->Cookie;
-    ASSERT3U(Packet->Flags.Value, ==, 0);
+    flags = (uint16_t)Packet->Flags.Value;
+    Packet->Flags.Value = 0;
 
     if (Info->IpHeader.Length == 0)
         return;
@@ -743,7 +738,7 @@ __ReceiverRingBuildSegment(
 
     Receiver = Ring->Receiver;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     InfoVa = MmGetSystemAddressForMdlSafe(&Packet->Mdl, NormalPagePriority);
     ASSERT(InfoVa != NULL);
@@ -755,7 +750,11 @@ __ReceiverRingBuildSegment(
     if (Segment == NULL)
         goto fail1;
 
+    Segment->Info = Packet->Info;
     Segment->Offset = Packet->Offset;
+    Segment->Flags = Packet->Flags;
+    Segment->MaximumSegmentSize = Packet->MaximumSegmentSize;
+    Segment->TagControlInformation = Packet->TagControlInformation;
 
     Mdl = &Segment->Mdl;
 
@@ -769,9 +768,6 @@ __ReceiverRingBuildSegment(
     RtlCopyMemory(StartVa, InfoVa, Info->Length);
     Mdl->ByteCount += Info->Length;
 
-    *Segment->Info = *Packet->Info;
-    Segment->Cookie = Packet->Cookie;
-
     // Adjust the info for the next segment
     IpHeader = (PIP_HEADER)(InfoVa + Info->IpHeader.Offset);
     if (IpHeader->Version == 4) {
@@ -916,11 +912,11 @@ ReceiverRingProcessLargePacket(
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
     ASSERT(Info->IpHeader.Offset != 0);
     ASSERT(Info->TcpHeader.Offset != 0);
     
-    flags = (uint16_t)(ULONG_PTR)Packet->Cookie;
+    flags = (uint16_t)Packet->Flags.Value;
     ASSERT(flags & NETRXF_csum_blank);
     ASSERT(flags & NETRXF_data_validated);
 
@@ -1089,7 +1085,7 @@ ReceiverRingProcessStandardPacket(
     Frontend = Receiver->Frontend;
     Mac = FrontendGetMac(Frontend);
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     Payload.Mdl = Packet->Mdl.Next;
     Payload.Offset = 0;
@@ -1177,24 +1173,24 @@ fail1:
 
 static VOID
 ReceiverRingProcessPacket(
-    IN  PXENVIF_RECEIVER_RING   Ring,
-    IN  PXENVIF_RECEIVER_PACKET Packet,
-    OUT PLIST_ENTRY             List
+    IN  PXENVIF_RECEIVER_RING       Ring,
+    IN  PXENVIF_RECEIVER_PACKET     Packet,
+    OUT PLIST_ENTRY                 List
     )
 {
-    PXENVIF_RECEIVER            Receiver;
-    PXENVIF_FRONTEND            Frontend;
-    PXENVIF_MAC                 Mac;
-    ULONG                       Length;
-    USHORT                      MaximumSegmentSize;
-    PVOID                       Cookie;
-    XENVIF_PACKET_PAYLOAD       Payload;
-    PXENVIF_PACKET_INFO         Info;
-    PUCHAR                      StartVa;
-    PETHERNET_HEADER            EthernetHeader;
-    PETHERNET_ADDRESS           DestinationAddress;
-    ETHERNET_ADDRESS_TYPE       Type;
-    NTSTATUS                    status;
+    PXENVIF_RECEIVER                Receiver;
+    PXENVIF_FRONTEND                Frontend;
+    PXENVIF_MAC                     Mac;
+    ULONG                           Length;
+    XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+    USHORT                          MaximumSegmentSize;
+    XENVIF_PACKET_PAYLOAD           Payload;
+    PXENVIF_PACKET_INFO             Info;
+    PUCHAR                          StartVa;
+    PETHERNET_HEADER                EthernetHeader;
+    PETHERNET_ADDRESS               DestinationAddress;
+    ETHERNET_ADDRESS_TYPE           Type;
+    NTSTATUS                        status;
 
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
@@ -1202,8 +1198,9 @@ ReceiverRingProcessPacket(
 
     ASSERT3U(Packet->Offset, ==, 0);
     Length = Packet->Length;
+    Flags = Packet->Flags;
     MaximumSegmentSize = Packet->MaximumSegmentSize;
-    Cookie = Packet->Cookie;
+    ASSERT3U(Packet->TagControlInformation, ==, 0);
 
     Payload.Mdl = &Packet->Mdl;
     Payload.Offset = 0;
@@ -1223,8 +1220,8 @@ ReceiverRingProcessPacket(
     // Copy in the extracted metadata
     Packet->Offset = Receiver->IpAlignOffset;
     Packet->Length = Length;
+    Packet->Flags = Flags;
     Packet->MaximumSegmentSize = MaximumSegmentSize;
-    Packet->Cookie = Cookie;
 
     StartVa = MmGetSystemAddressForMdlSafe(&Packet->Mdl, NormalPagePriority);
     ASSERT(StartVa != NULL);
@@ -1232,7 +1229,7 @@ ReceiverRingProcessPacket(
 
     Packet->Mdl.ByteCount = Packet->Offset;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     status = ParsePacket(StartVa, ReceiverRingPullup, Ring, &Payload, Info);
     if (!NT_SUCCESS(status)) {
@@ -1361,8 +1358,6 @@ ReceiverRingProcessPackets(
         ReceiverRingProcessTag(Ring, Packet);
         ReceiverRingProcessChecksum(Ring, Packet);
 
-        Packet->Cookie = Ring;
-
         (*Count)++;
     }
 }
@@ -1378,6 +1373,79 @@ __ReceiverRingAcquireLock(
     KeAcquireSpinLockAtDpcLevel(&Ring->Lock);
 }
 
+static FORCEINLINE VOID
+__ReceiverQueuePacketVersion1(
+    IN  PXENVIF_RECEIVER                Receiver,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
+    )
+{
+    struct _XENVIF_PACKET_INFO_V1       *InfoVersion1;
+    struct _XENVIF_RECEIVER_PACKET_V1   *PacketVersion1;
+    PXENVIF_FRONTEND                    Frontend;
+    PXENVIF_VIF_CONTEXT                 Context;
+    LIST_ENTRY                          List;
+    NTSTATUS                            status;
+
+    InfoVersion1 = __ReceiverAllocate(sizeof (struct _XENVIF_PACKET_INFO_V1));
+
+    status = STATUS_NO_MEMORY;
+    if (InfoVersion1 == NULL)
+        goto fail1;
+
+    InfoVersion1->Length = Info->Length;
+    InfoVersion1->TagControlInformation = TagControlInformation;
+    InfoVersion1->IsAFragment = Info->IsAFragment;
+    InfoVersion1->EthernetHeader = Info->EthernetHeader;
+    InfoVersion1->LLCSnapHeader = Info->LLCSnapHeader;
+    InfoVersion1->IpHeader = Info->IpHeader;
+    InfoVersion1->IpOptions = Info->IpOptions;
+    InfoVersion1->TcpHeader = Info->TcpHeader;
+    InfoVersion1->TcpOptions = Info->TcpOptions;
+    InfoVersion1->UdpHeader = Info->UdpHeader;
+
+    PacketVersion1 = __ReceiverAllocate(sizeof (struct _XENVIF_RECEIVER_PACKET_V1));
+
+    status = STATUS_NO_MEMORY;
+    if (PacketVersion1 == NULL)
+        goto fail2;
+
+    PacketVersion1->Info = InfoVersion1;
+    PacketVersion1->Offset = Offset;
+    PacketVersion1->Length = Length;
+    PacketVersion1->Flags = Flags;
+    PacketVersion1->MaximumSegmentSize = MaximumSegmentSize;
+    PacketVersion1->Cookie = Cookie;
+    PacketVersion1->Mdl = *Mdl;
+    PacketVersion1->__Pfn = MmGetMdlPfnArray(Mdl)[0];
+
+    Frontend = Receiver->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+
+    InitializeListHead(&List);
+
+    InsertTailList(&List, &PacketVersion1->ListEntry);
+
+    VifReceiverQueuePacketsVersion1(Context, &List);
+    ASSERT(IsListEmpty(&List));
+
+    return;
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    ReceiverReturnPacket(Receiver, Cookie);
+}
+
 static DECLSPEC_NOINLINE VOID
 ReceiverRingAcquireLock(
     IN  PXENVIF_RECEIVER_RING   Ring
@@ -1393,12 +1461,18 @@ __ReceiverRingReleaseLock(
     )
 {
     PXENVIF_RECEIVER            Receiver;
+    PXENVIF_FRONTEND            Frontend;
+    PXENVIF_VIF_CONTEXT         Context;
+    ULONG                       Version;
     LIST_ENTRY                  List;
     ULONG                       Count;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
     Receiver = Ring->Receiver;
+    Frontend = Receiver->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+    Version = VifGetVersion(Context);
 
     InitializeListHead(&List);
     Count = 0;
@@ -1415,13 +1489,39 @@ __ReceiverRingReleaseLock(
 #pragma prefast(disable:26110)
     KeReleaseSpinLockFromDpcLevel(&Ring->Lock);
 
-    if (!IsListEmpty(&List)) {
-        PXENVIF_FRONTEND    Frontend;
+    while (!IsListEmpty(&List)) {
+        PLIST_ENTRY             ListEntry;
+        PXENVIF_RECEIVER_PACKET Packet;
 
-        Frontend = Receiver->Frontend;
+        ListEntry = RemoveHeadList(&List);
+        ASSERT3P(ListEntry, !=, &List);
 
-        VifReceiverQueuePackets(PdoGetVifContext(FrontendGetPdo(Frontend)),
-                                &List);
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        Packet = CONTAINING_RECORD(ListEntry,
+                                   XENVIF_RECEIVER_PACKET,
+                                   ListEntry);
+
+        if (Version < 4)
+            __ReceiverQueuePacketVersion1(Receiver,
+                                          &Packet->Mdl,
+                                          Packet->Offset,
+                                          Packet->Length,
+                                          Packet->Flags,
+                                          Packet->MaximumSegmentSize,
+                                          Packet->TagControlInformation,
+                                          &Packet->Info,
+                                          Packet);
+        else
+            VifReceiverQueuePacket(Context,
+                                   &Packet->Mdl,
+                                   Packet->Offset,
+                                   Packet->Length,
+                                   Packet->Flags,
+                                   Packet->MaximumSegmentSize,
+                                   Packet->TagControlInformation,
+                                   &Packet->Info,
+                                   Packet);
     }
 
     ASSERT(IsListEmpty(&List));
@@ -1902,7 +2002,6 @@ ReceiverRingPoll(
 
             if (~rsp->flags & NETRXF_more_data) {  // EOP
                 ASSERT(Packet != NULL);
-                ASSERT3P(Packet->Cookie, ==, NULL);
 
                 if (Error) {
                     FrontendIncrementStatistic(Frontend,
@@ -1916,7 +2015,7 @@ ReceiverRingPoll(
                         Packet->MaximumSegmentSize = MaximumSegmentSize;
                     }
 
-                    Packet->Cookie = (PVOID)(flags & (NETRXF_csum_blank | NETRXF_data_validated));
+                    Packet->Flags.Value = flags & (NETRXF_csum_blank | NETRXF_data_validated);
 
                     ASSERT(IsZeroMemory(&Packet->ListEntry, sizeof (LIST_ENTRY)));
                     InsertTailList(&Ring->PacketList, &Packet->ListEntry);
@@ -3345,35 +3444,21 @@ ReceiverQueryRingSize(
 }
 
 VOID
-ReceiverReturnPackets(
+ReceiverReturnPacket(
     IN  PXENVIF_RECEIVER    Receiver,
-    IN  PLIST_ENTRY         List
+    IN  PVOID               Cookie
     )
 {
-    ULONG                   Count;
+    PXENVIF_RECEIVER_PACKET Packet = Cookie;
+    PXENVIF_RECEIVER_RING   Ring;
     LONG                    Loaned;
     LONG                    Returned;
 
-    Count = 0;
-    while (!IsListEmpty(List)) {
-        PLIST_ENTRY             ListEntry;
-        PXENVIF_RECEIVER_PACKET Packet;
-        PXENVIF_RECEIVER_RING   Ring;
-
-        ListEntry = RemoveHeadList(List);
-        ASSERT3P(ListEntry, !=, List);
-
-        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
-
-        Packet = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_PACKET, ListEntry);
-
-        Ring = Packet->Cookie;
+    Ring = Packet->Ring;
 
-        __ReceiverRingReturnPacket(Ring, Packet, FALSE);
-        Count++;
-    }
+    __ReceiverRingReturnPacket(Ring, Packet, FALSE);
 
-    Returned = __InterlockedAdd(&Receiver->Returned, Count);
+    Returned = InterlockedIncrement(&Receiver->Returned);
 
     // Make sure Loaned is not sampled before Returned
     KeMemoryBarrier();
@@ -3386,6 +3471,32 @@ ReceiverReturnPackets(
 }
 
 VOID
+ReceiverReturnPacketsVersion1(
+    IN  PXENVIF_RECEIVER    Receiver,
+    IN  PLIST_ENTRY         List
+    )
+{
+    while (!IsListEmpty(List)) {
+        PLIST_ENTRY                         ListEntry;
+        struct _XENVIF_RECEIVER_PACKET_V1   *PacketVersion1;
+
+        ListEntry = RemoveHeadList(List);
+        ASSERT3P(ListEntry, !=, List);
+
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        PacketVersion1 = CONTAINING_RECORD(ListEntry,
+                                           struct _XENVIF_RECEIVER_PACKET_V1,
+                                           ListEntry);
+
+        ReceiverReturnPacket(Receiver, PacketVersion1->Cookie);
+
+        __ReceiverFree(PacketVersion1->Info);
+        __ReceiverFree(PacketVersion1);
+    }
+}
+
+VOID
 ReceiverWaitForPackets(
     IN  PXENVIF_RECEIVER    Receiver
     )
diff --git a/src/xenvif/receiver.h b/src/xenvif/receiver.h
index e4ab7a7..042e1da 100644
--- a/src/xenvif/receiver.h
+++ b/src/xenvif/receiver.h
@@ -101,12 +101,18 @@ ReceiverSetBackfillSize(
     );
 
 extern VOID
-ReceiverReturnPackets(
+ReceiverReturnPacketsVersion1(
     IN  PXENVIF_RECEIVER    Receiver,
     IN  PLIST_ENTRY         List
     );
 
 extern VOID
+ReceiverReturnPacket(
+    IN  PXENVIF_RECEIVER    Receiver,
+    IN  PVOID               Cookie
+    );
+
+extern VOID
 ReceiverSend(
     IN  PXENVIF_RECEIVER    Receiver,
     IN  ULONG               Index
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 35ec80a..75bf5fe 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -64,6 +64,24 @@
 
 #define MAXNAMELEN  128
 
+#define XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH    512
+
+typedef struct _XENVIF_TRANSMITTER_PACKET {
+    LIST_ENTRY                                  ListEntry;
+    PVOID                                       Cookie;
+    ULONG                                       Reference;
+    XENVIF_VIF_OFFLOAD_OPTIONS                  OffloadOptions;
+    USHORT                                      MaximumSegmentSize;
+    USHORT                                      TagControlInformation;
+    XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
+    PMDL                                        Mdl;
+    ULONG                                       Offset;
+    ULONG                                       Length;
+    PUCHAR                                      Header;
+    XENVIF_PACKET_INFO                          Info;
+    XENVIF_PACKET_PAYLOAD                       Payload;
+} XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
+
 typedef struct _XENVIF_TRANSMITTER_REQUEST_ARP_PARAMETERS {
     IPV4_ADDRESS    Address;
 } XENVIF_TRANSMITTER_REQUEST_ARP_PARAMETERS, *PXENVIF_TRANSMITTER_REQUEST_ARP_PARAMETERS;
@@ -139,10 +157,6 @@ typedef struct _XENVIF_TRANSMITTER_FRAGMENT {
 
 typedef struct _XENVIF_TRANSMITTER_STATE {
     PXENVIF_TRANSMITTER_PACKET          Packet;
-    XENVIF_TRANSMITTER_PACKET_SEND_INFO Send;
-    PUCHAR                              StartVa;
-    XENVIF_PACKET_INFO                  Info;
-    XENVIF_PACKET_PAYLOAD               Payload;
     LIST_ENTRY                          List;
     ULONG                               Count;
 } XENVIF_TRANSMITTER_STATE, *PXENVIF_TRANSMITTER_STATE;
@@ -252,24 +266,54 @@ TransmitterPacketReleaseLock(
 
 static NTSTATUS
 TransmitterPacketCtor(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
+    IN  PVOID                   Argument,
+    IN  PVOID                   Object
     )
 {
+    PXENVIF_TRANSMITTER_PACKET  Packet = Object;
+    PUCHAR                      Header;
+    NTSTATUS                    status;
+
     UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
+
+    ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_TRANSMITTER_PACKET)));
+
+    Header = __TransmitterAllocate(XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH);
+
+    status = STATUS_NO_MEMORY;
+    if (Header == NULL)
+        goto fail1;
+
+    Packet->Header = Header;
 
     return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_TRANSMITTER_PACKET)));
+
+    return status;
 }
 
 static VOID
 TransmitterPacketDtor(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
+    IN  PVOID                   Argument,
+    IN  PVOID                   Object
     )
 {
+    PXENVIF_TRANSMITTER_PACKET  Packet = Object;
+    PUCHAR                      Header;
+
     UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
+
+    Header = Packet->Header;
+    Packet->Header = NULL;
+
+    ASSERT(IsZeroMemory(Header, XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH));
+    __TransmitterFree(Header);
+
+    ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_TRANSMITTER_PACKET)));
 }
 
 static FORCEINLINE PXENVIF_TRANSMITTER_PACKET
@@ -289,7 +333,21 @@ __TransmitterPutPacket(
     IN  PXENVIF_TRANSMITTER_PACKET  Packet
     )
 {
-    RtlZeroMemory(Packet, sizeof(XENVIF_TRANSMITTER_PACKET));
+    ASSERT(IsZeroMemory(&Packet->ListEntry, sizeof (LIST_ENTRY)));
+    ASSERT3U(Packet->Reference, ==, 0);
+
+    Packet->Mdl = NULL;
+    Packet->Offset = 0;
+    Packet->Length = 0;
+    Packet->OffloadOptions.Value = 0;
+    Packet->MaximumSegmentSize = 0;
+    Packet->TagControlInformation = 0;
+    RtlZeroMemory(&Packet->Completion, sizeof (XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO));
+    Packet->Cookie = NULL;
+
+    RtlZeroMemory(Packet->Header, XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH);
+    RtlZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO));
+    RtlZeroMemory(&Packet->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
 
     XENBUS_CACHE(Put,
                  &Transmitter->CacheInterface,
@@ -721,7 +779,7 @@ TransmitterRingDebugCallback(
 }
 
 static BOOLEAN
-TransmitterRingPullup(
+TransmitterPullup(
     IN      PVOID                   Argument,
     IN      PUCHAR                  DestinationVa,
     IN OUT  PXENVIF_PACKET_PAYLOAD  Payload,
@@ -800,10 +858,10 @@ __TransmitterRingCopyPayload(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = State->Payload;
+    Payload = Packet->Payload;
 
     ASSERT(Packet != NULL);
-    ASSERT3U(Packet->Value, ==, 1);
+    ASSERT3U(Packet->Reference, ==, 1);
 
     while (Payload.Length != 0) {
         PMDL        Mdl;
@@ -818,14 +876,14 @@ __TransmitterRingCopyPayload(
             goto fail1;
 
         Buffer->Context = Packet;
-        Packet->Value++;
+        Packet->Reference++;
 
         Mdl = Buffer->Mdl;
 
         Length = __min(Payload.Length, PAGE_SIZE);
 
         MdlMappedSystemVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
-        TransmitterRingPullup(Ring, MdlMappedSystemVa, &Payload, Length);
+        (VOID) TransmitterPullup(Transmitter, MdlMappedSystemVa, &Payload, Length);
 
         Mdl->ByteCount = Length;
 
@@ -884,14 +942,14 @@ fail2:
     ASSERT3P(Buffer->Context, ==, Packet);
     Buffer->Context = NULL;        
 
-    Packet->Value--;
+    --Packet->Reference;
 
     __TransmitterPutBuffer(Ring, Buffer);
 
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    while (Packet->Value != 1) {
+    while (Packet->Reference != 1) {
         PLIST_ENTRY         ListEntry;
 
         ASSERT(State->Count != 0);
@@ -927,7 +985,7 @@ fail1:
         ASSERT3P(Buffer->Context, ==, Packet);
         Buffer->Context = NULL;        
 
-        Packet->Value--;
+        --Packet->Reference;
 
         __TransmitterPutBuffer(Ring, Buffer);
     }
@@ -956,10 +1014,10 @@ __TransmitterRingGrantPayload(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = &State->Payload;
+    Payload = &Packet->Payload;
 
     ASSERT(Packet != NULL);
-    ASSERT3U(Packet->Value, ==, 1);
+    ASSERT3U(Packet->Reference, ==, 1);
 
     Mdl = Payload->Mdl;
     Offset = Payload->Offset;
@@ -988,7 +1046,7 @@ __TransmitterRingGrantPayload(
 
             Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_PACKET;
             Fragment->Context = Packet;
-            Packet->Value++;
+            Packet->Reference++;
 
             Pfn = MmGetMdlPfnArray(Mdl)[MdlOffset / PAGE_SIZE];
             PageOffset = MdlOffset & (PAGE_SIZE - 1);
@@ -1045,7 +1103,7 @@ fail2:
         Fragment->Context = NULL;
         Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_INVALID;
 
-        Packet->Value--;
+        --Packet->Reference;
 
         __TransmitterPutFragment(Ring, Fragment);
     }
@@ -1056,7 +1114,7 @@ fail1:
 
     ASSERT3P(Fragment, ==, NULL);
 
-    while (Packet->Value != 1) {
+    while (Packet->Reference != 1) {
         PLIST_ENTRY         ListEntry;
 
         ASSERT(State->Count != 0);
@@ -1083,7 +1141,7 @@ fail1:
         Fragment->Context = NULL;
         Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_INVALID;
 
-        Packet->Value--;
+        --Packet->Reference;
 
         __TransmitterPutFragment(Ring, Fragment);
     }
@@ -1117,10 +1175,11 @@ __TransmitterRingPrepareHeader(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = &State->Payload;
-    Info = &State->Info;
 
-    ASSERT3U(Packet->Value, ==, 0);
+    Payload = &Packet->Payload;
+    Info = &Packet->Info;
+
+    ASSERT3U(Packet->Reference, ==, 0);
 
     Buffer = __TransmitterGetBuffer(Ring);
 
@@ -1129,18 +1188,14 @@ __TransmitterRingPrepareHeader(
         goto fail1;
 
     Buffer->Context = Packet;
-    Packet->Value++;
+    Packet->Reference++;
 
     Mdl = Buffer->Mdl;
 
     StartVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
     ASSERT(StartVa != NULL);
 
-    status = ParsePacket(StartVa, TransmitterRingPullup, Ring, Payload, Info);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    State->StartVa = StartVa;
+    RtlCopyMemory(StartVa, Packet->Header, Info->Length);
 
     Mdl->ByteCount = Info->Length;
 
@@ -1148,7 +1203,7 @@ __TransmitterRingPrepareHeader(
 
     status = STATUS_NO_MEMORY;
     if (Fragment == NULL)
-        goto fail3;
+        goto fail2;
 
     Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_BUFFER;
     Fragment->Context = Buffer;
@@ -1166,7 +1221,7 @@ __TransmitterRingPrepareHeader(
                            TRUE,
                            &Fragment->Entry);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail3;
 
     Fragment->Offset = 0;
     Fragment->Length = Mdl->ByteCount + Payload->Length;
@@ -1178,7 +1233,7 @@ __TransmitterRingPrepareHeader(
     ASSERT(Info->EthernetHeader.Length != 0);
     EthernetHeader = (PETHERNET_HEADER)(StartVa + Info->EthernetHeader.Offset);        
 
-    if (State->Send.OffloadOptions.OffloadTagManipulation) {
+    if (Packet->OffloadOptions.OffloadTagManipulation) {
         ULONG   Offset;
 
         Offset = FIELD_OFFSET(ETHERNET_TAGGED_HEADER, Tag);
@@ -1189,9 +1244,10 @@ __TransmitterRingPrepareHeader(
 
         // Insert the tag
         EthernetHeader->Tagged.Tag.ProtocolID = HTONS(ETHERTYPE_TPID);
-        EthernetHeader->Tagged.Tag.ControlInformation = HTONS(State->Send.TagControlInformation);
+        EthernetHeader->Tagged.Tag.ControlInformation = HTONS(Packet->TagControlInformation);
         ASSERT(ETHERNET_HEADER_IS_TAGGED(EthernetHeader));
 
+        Packet->Length += sizeof (ETHERNET_TAG);
         Mdl->ByteCount += sizeof (ETHERNET_TAG);
         Fragment->Length += sizeof (ETHERNET_TAG);
 
@@ -1215,7 +1271,7 @@ __TransmitterRingPrepareHeader(
             Info->TcpOptions.Offset += sizeof (ETHERNET_TAG);
     }
 
-    if (State->Send.OffloadOptions.OffloadIpVersion4LargePacket) {
+    if (Packet->OffloadOptions.OffloadIpVersion4LargePacket) {
         PIP_HEADER  IpHeader;
         PTCP_HEADER TcpHeader;
         ULONG       Length;
@@ -1242,20 +1298,20 @@ __TransmitterRingPrepareHeader(
         IpHeader->Version4.PacketLength = HTONS((USHORT)Length);
 
         // IP checksum calulcation must be offloaded for large packets
-        State->Send.OffloadOptions.OffloadIpVersion4HeaderChecksum = 1;
+        Packet->OffloadOptions.OffloadIpVersion4HeaderChecksum = 1;
 
         // TCP checksum calulcation must be offloaded for large packets
         TcpHeader->Checksum = ChecksumPseudoHeader(StartVa, Info);
-        State->Send.OffloadOptions.OffloadIpVersion4TcpChecksum = 1;
+        Packet->OffloadOptions.OffloadIpVersion4TcpChecksum = 1;
 
         // If the MSS is such that the payload would constitute only a single fragment then
         // we no longer need trate the packet as a large packet.
-        ASSERT3U(State->Send.MaximumSegmentSize, <=, Payload->Length);
-        if (State->Send.MaximumSegmentSize == Payload->Length)
-            State->Send.OffloadOptions.OffloadIpVersion4LargePacket = 0;
+        ASSERT3U(Packet->MaximumSegmentSize, <=, Payload->Length);
+        if (Packet->MaximumSegmentSize == Payload->Length)
+            Packet->OffloadOptions.OffloadIpVersion4LargePacket = 0;
     }
     
-    if (State->Send.OffloadOptions.OffloadIpVersion6LargePacket) {
+    if (Packet->OffloadOptions.OffloadIpVersion6LargePacket) {
         PIP_HEADER  IpHeader;
         PTCP_HEADER TcpHeader;
         ULONG       Length;
@@ -1282,29 +1338,29 @@ __TransmitterRingPrepareHeader(
 
         // TCP checksum calulcation must be offloaded for large packets
         TcpHeader->Checksum = ChecksumPseudoHeader(StartVa, Info);
-        State->Send.OffloadOptions.OffloadIpVersion6TcpChecksum = 1;
+        Packet->OffloadOptions.OffloadIpVersion6TcpChecksum = 1;
 
         // If the MSS is such that the payload would constitute only a single fragment then
         // we no longer need treat the packet as a large packet.
-        ASSERT3U(State->Send.MaximumSegmentSize, <=, Payload->Length);
-        if (State->Send.MaximumSegmentSize == Payload->Length)
-            State->Send.OffloadOptions.OffloadIpVersion6LargePacket = 0;
+        ASSERT3U(Packet->MaximumSegmentSize, <=, Payload->Length);
+        if (Packet->MaximumSegmentSize == Payload->Length)
+            Packet->OffloadOptions.OffloadIpVersion6LargePacket = 0;
     }
 
     // Non-GSO packets must not exceed MTU
-    if (!State->Send.OffloadOptions.OffloadIpVersion4LargePacket &&
-        !State->Send.OffloadOptions.OffloadIpVersion6LargePacket) {
+    if (!Packet->OffloadOptions.OffloadIpVersion4LargePacket &&
+        !Packet->OffloadOptions.OffloadIpVersion6LargePacket) {
         ULONG   MaximumFrameSize;
 
         MacQueryMaximumFrameSize(Mac, &MaximumFrameSize);
         
         if (Fragment->Length > MaximumFrameSize) {
             status = STATUS_INVALID_PARAMETER;
-            goto fail5;
+            goto fail4;
         }
     }
 
-    if (State->Send.OffloadOptions.OffloadIpVersion4HeaderChecksum) {
+    if (Packet->OffloadOptions.OffloadIpVersion4HeaderChecksum) {
         PIP_HEADER  IpHeader;
 
         ASSERT(Info->IpHeader.Length != 0);
@@ -1316,8 +1372,8 @@ __TransmitterRingPrepareHeader(
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail4:
+    Error("fail4\n");
 
     ASSERT(State->Count != 0);
     --State->Count;
@@ -1335,8 +1391,8 @@ fail5:
                          Fragment->Entry);
     Fragment->Entry = NULL;
 
-fail4:
-    Error("fail4\n");
+fail3:
+    Error("fail3\n");
 
     Fragment->Context = NULL;
     Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_INVALID;
@@ -1346,15 +1402,10 @@ fail4:
 
     __TransmitterPutFragment(Ring, Fragment);
 
-fail3:
-    Error("fail3\n");
-
-    Mdl->ByteCount = 0;
-
 fail2:
     Error("fail2\n");
 
-    Packet->Value--;
+    --Packet->Reference;
     Buffer->Context = NULL;
 
     __TransmitterPutBuffer(Ring, Buffer);
@@ -1362,7 +1413,7 @@ fail2:
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    ASSERT3U(Packet->Value, ==, 0);
+    ASSERT3U(Packet->Reference, ==, 0);
 
     return status;
 }
@@ -1461,7 +1512,7 @@ __TransmitterRingUnprepareFragments(
         }
 
         if (Packet != NULL)
-            Packet->Value--;
+            --Packet->Reference;
 
         __TransmitterPutFragment(Ring, Fragment);
     }
@@ -1478,11 +1529,6 @@ __TransmitterRingUnprepareFragments(
     if (Packet != NULL) {
         Ring->PacketsUnprepared++;
 
-        RtlZeroMemory(&State->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
-
-        Packet->Send = State->Send;
-        RtlZeroMemory(&State->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
-
         State->Packet = NULL;
     }
 
@@ -1493,8 +1539,8 @@ __TransmitterRingUnprepareFragments(
 
 static FORCEINLINE NTSTATUS
 __TransmitterRingPreparePacket(
-    IN  PXENVIF_TRANSMITTER_RING        Ring,
-    IN  PXENVIF_TRANSMITTER_PACKET      Packet
+    IN  PXENVIF_TRANSMITTER_RING    Ring,
+    IN  PXENVIF_TRANSMITTER_PACKET  Packet
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
@@ -1511,14 +1557,6 @@ __TransmitterRingPreparePacket(
 
     State->Packet = Packet;
 
-    State->Send = Packet->Send;
-    RtlZeroMemory(&Packet->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
-
-    Payload = &State->Payload;
-    Payload->Mdl = Packet->Mdl;
-    Payload->Offset = Packet->Offset;
-    Payload->Length = Packet->Length;
-
     InitializeListHead(&State->List);
     ASSERT3U(State->Count, ==, 0);
 
@@ -1526,9 +1564,10 @@ __TransmitterRingPreparePacket(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    ASSERT3U(State->Count, ==, Packet->Value);
+    ASSERT3U(State->Count, ==, Packet->Reference);
 
-    Info = &State->Info;
+    Info = &Packet->Info;
+    Payload = &Packet->Payload;
 
     // Is the packet too short?
     if (Info->Length + Payload->Length < ETHERNET_MIN) {
@@ -1584,7 +1623,7 @@ __TransmitterRingPreparePacket(
 
         if (Transmitter->AlwaysCopy != 0 ||
             (!NT_SUCCESS(status) && status == STATUS_BUFFER_OVERFLOW)) {
-            ASSERT3U(State->Count, ==, Packet->Value);
+            ASSERT3U(State->Count, ==, Packet->Reference);
 
             status = __TransmitterRingCopyPayload(Ring);
         }
@@ -1593,7 +1632,7 @@ __TransmitterRingPreparePacket(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    ASSERT3U(State->Count, ==, Packet->Value);
+    ASSERT3U(State->Count, ==, Packet->Reference);
 
     Ring->PacketsPrepared++;
     return STATUS_SUCCESS;
@@ -1606,17 +1645,9 @@ fail2:
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    State->StartVa = NULL;
-    RtlZeroMemory(&State->Info, sizeof (XENVIF_PACKET_INFO));
-
     ASSERT(IsListEmpty(&State->List));
     RtlZeroMemory(&State->List, sizeof (LIST_ENTRY));
 
-    RtlZeroMemory(&State->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
-
-    Packet->Send = State->Send;
-    RtlZeroMemory(&State->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
-
     State->Packet = NULL;
 
     ASSERT(IsZeroMemory(&Ring->State, sizeof (XENVIF_TRANSMITTER_STATE)));
@@ -2002,11 +2033,10 @@ __TransmitterRingPostFragments(
     PXENVIF_FRONTEND                Frontend;
     PXENVIF_TRANSMITTER_STATE       State;
     PXENVIF_TRANSMITTER_PACKET      Packet;
-    PXENVIF_PACKET_PAYLOAD          Payload;
+    XENVIF_VIF_OFFLOAD_OPTIONS      OffloadOptions;
     RING_IDX                        req_prod;
     RING_IDX                        rsp_cons;
     ULONG                           Extra;
-    ULONG                           PacketLength;
     BOOLEAN                         FirstRequest;
     PLIST_ENTRY                     ListEntry;
     PXENVIF_TRANSMITTER_FRAGMENT    Fragment;
@@ -2018,12 +2048,15 @@ __TransmitterRingPostFragments(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = &State->Payload;
+
+    if (Packet != NULL)
+        OffloadOptions = Packet->OffloadOptions;
+    else
+        OffloadOptions.Value = 0;
 
     ASSERT(!IsListEmpty(&State->List));
     ASSERT(State->Count != 0);
     ASSERT3U(State->Count, <=, XEN_NETIF_NR_SLOTS_MIN);
-    ASSERT(IMPLY(Packet != NULL, State->Count == Packet->Value));
 
     req_prod = Ring->Front.req_prod_pvt;
     rsp_cons = Ring->Front.rsp_cons;
@@ -2033,8 +2066,8 @@ __TransmitterRingPostFragments(
                                  XENVIF_TRANSMITTER_FRAGMENT,
                                  ListEntry);
 
-    Extra = (State->Send.OffloadOptions.OffloadIpVersion4LargePacket ||
-             State->Send.OffloadOptions.OffloadIpVersion6LargePacket ||
+    Extra = (OffloadOptions.OffloadIpVersion4LargePacket ||
+             OffloadOptions.OffloadIpVersion6LargePacket ||
              Fragment->Type == XENVIF_TRANSMITTER_FRAGMENT_TYPE_MULTICAST_CONTROL) ?
             1 :
             0;
@@ -2048,7 +2081,6 @@ __TransmitterRingPostFragments(
     req = NULL;
 
     FirstRequest = TRUE;
-    PacketLength = 0;
     while (State->Count != 0) {
         --State->Count;
 
@@ -2078,14 +2110,14 @@ __TransmitterRingPostFragments(
         if (FirstRequest) {
             FirstRequest = FALSE;
 
-            if (State->Send.OffloadOptions.OffloadIpVersion4TcpChecksum ||
-                State->Send.OffloadOptions.OffloadIpVersion4UdpChecksum ||
-                State->Send.OffloadOptions.OffloadIpVersion6TcpChecksum ||
-                State->Send.OffloadOptions.OffloadIpVersion6UdpChecksum)
+            if (OffloadOptions.OffloadIpVersion4TcpChecksum ||
+                OffloadOptions.OffloadIpVersion4UdpChecksum ||
+                OffloadOptions.OffloadIpVersion6TcpChecksum ||
+                OffloadOptions.OffloadIpVersion6UdpChecksum)
                 req->flags |= NETTXF_csum_blank | NETTXF_data_validated;
 
-            if (State->Send.OffloadOptions.OffloadIpVersion4LargePacket ||
-                State->Send.OffloadOptions.OffloadIpVersion6LargePacket ||
+            if (OffloadOptions.OffloadIpVersion4LargePacket ||
+                OffloadOptions.OffloadIpVersion6LargePacket ||
                 Fragment->Type == XENVIF_TRANSMITTER_FRAGMENT_TYPE_MULTICAST_CONTROL) {
                 struct netif_extra_info *extra;
 
@@ -2096,17 +2128,17 @@ __TransmitterRingPostFragments(
                 req_prod++;
                 Ring->RequestsPosted++;
 
-                if (State->Send.OffloadOptions.OffloadIpVersion4LargePacket ||
-                    State->Send.OffloadOptions.OffloadIpVersion6LargePacket) {
-                    ASSERT(State->Send.MaximumSegmentSize != 0);
+                if (OffloadOptions.OffloadIpVersion4LargePacket ||
+                    OffloadOptions.OffloadIpVersion6LargePacket) {
+                    ASSERT(Packet->MaximumSegmentSize != 0);
 
                     extra->type = XEN_NETIF_EXTRA_TYPE_GSO;
                     extra->flags = 0;
 
-                    extra->u.gso.type = (State->Send.OffloadOptions.OffloadIpVersion4LargePacket) ?
+                    extra->u.gso.type = (OffloadOptions.OffloadIpVersion4LargePacket) ?
                                         XEN_NETIF_GSO_TYPE_TCPV4 :
-                                        XEN_NETIF_GSO_TYPE_TCPV6;;
-                    extra->u.gso.size = State->Send.MaximumSegmentSize;
+                                        XEN_NETIF_GSO_TYPE_TCPV6;
+                    extra->u.gso.size = Packet->MaximumSegmentSize;
                     extra->u.gso.pad = 0;
                     extra->u.gso.features = 0;
 
@@ -2129,9 +2161,6 @@ __TransmitterRingPostFragments(
 
                 req->flags |= NETTXF_extra_info;
             }
-
-            // The first fragment length is the length of the entire packet
-            PacketLength = Fragment->Length;
         }
 
         // Store a copy of the request in case we need to fake a response ourselves
@@ -2151,14 +2180,14 @@ __TransmitterRingPostFragments(
 
     // Set the initial completion information
     if (Packet != NULL) {
-        PUCHAR              StartVa;
-        PXENVIF_PACKET_INFO Info;
-        PETHERNET_HEADER    Header;
+        PUCHAR                  StartVa;
+        PXENVIF_PACKET_INFO     Info;
+        PXENVIF_PACKET_PAYLOAD  Payload;
+        PETHERNET_HEADER        Header;
 
-        ASSERT(PacketLength != 0);
-
-        StartVa = State->StartVa;
-        Info = &State->Info;
+        StartVa = Packet->Header;
+        Info = &Packet->Info;
+        Payload = &Packet->Payload;
 
         ASSERT(IsZeroMemory(&Packet->Completion, sizeof (XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO)));
 
@@ -2166,14 +2195,9 @@ __TransmitterRingPostFragments(
         Header = (PETHERNET_HEADER)(StartVa + Info->EthernetHeader.Offset);
 
         Packet->Completion.Type = GET_ETHERNET_ADDRESS_TYPE(&Header->Untagged.DestinationAddress);
-        Packet->Completion.Status = XENVIF_TRANSMITTER_PACKET_PENDING;
-        Packet->Completion.PacketLength = (USHORT)PacketLength;
+        Packet->Completion.PacketLength = (USHORT)Packet->Length;
         Packet->Completion.PayloadLength = (USHORT)Payload->Length;
 
-        State->StartVa = NULL;
-        RtlZeroMemory(&State->Info, sizeof (XENVIF_PACKET_INFO));
-        RtlZeroMemory(&State->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
-        RtlZeroMemory(&State->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
         State->Packet = NULL;
 
         Ring->PacketsSent++;
@@ -2268,7 +2292,7 @@ __TransmitterRingCompletePacket(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    ASSERT(Packet->Completion.Status != XENVIF_TRANSMITTER_PACKET_PENDING);
+    ASSERT(Packet->Completion.Status != 0);
 
     if (Packet->Completion.Status != XENVIF_TRANSMITTER_PACKET_OK) {
         FrontendIncrementStatistic(Frontend,
@@ -2447,10 +2471,10 @@ TransmitterRingPoll(
                 continue;
             }
 
-            Packet->Value--;
+            --Packet->Reference;
 
             if (rsp->status != NETIF_RSP_OKAY &&
-                Packet->Completion.Status == XENVIF_TRANSMITTER_PACKET_PENDING) {
+                Packet->Completion.Status == 0) {
                 switch (rsp->status) {
                 case NETIF_RSP_DROPPED:
                     Packet->Completion.Status = XENVIF_TRANSMITTER_PACKET_DROPPED;
@@ -2468,10 +2492,10 @@ TransmitterRingPoll(
 
             RtlZeroMemory(rsp, sizeof (netif_tx_response_t));
 
-            if (Packet->Value != 0)
+            if (Packet->Reference != 0)
                 continue;
 
-            if (Packet->Completion.Status == XENVIF_TRANSMITTER_PACKET_PENDING)
+            if (Packet->Completion.Status == 0)
                 Packet->Completion.Status = XENVIF_TRANSMITTER_PACKET_OK;
 
             __TransmitterRingCompletePacket(Ring, Packet);
@@ -2589,11 +2613,12 @@ TransmitterRingSwizzle(
         ListEntry = NextEntry;
     }
 
-    ListEntry = List.Flink;
     if (!IsListEmpty(&List)) {
+        ListEntry = List.Flink;
+
         RemoveEntryList(&List);
-        InitializeListHead(&List);
         AppendTailList(&Ring->PacketQueue, ListEntry);
+
         Ring->PacketsQueued += Count;
     }
 }
@@ -2632,6 +2657,8 @@ TransmitterRingSchedule(
             PXENVIF_TRANSMITTER_REQUEST Request;
 
             ListEntry = RemoveHeadList(&Ring->RequestQueue);
+            ASSERT3P(ListEntry, !=, &Ring->RequestQueue);
+
             RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
             Request = CONTAINING_RECORD(ListEntry,
@@ -2669,13 +2696,15 @@ TransmitterRingSchedule(
             PXENVIF_TRANSMITTER_PACKET  Packet;
 
             ListEntry = RemoveHeadList(&Ring->PacketQueue);
+            ASSERT3P(ListEntry, !=, &Ring->PacketQueue);
+
             RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
             Packet = CONTAINING_RECORD(ListEntry,
                                        XENVIF_TRANSMITTER_PACKET,
                                        ListEntry);
 
-            Packet->Value = 0;
+            Packet->Reference = 0;
 
             status = __TransmitterRingPreparePacket(Ring, Packet);
             if (!NT_SUCCESS(status)) {
@@ -2712,20 +2741,70 @@ TransmitterRingSchedule(
 }
 
 static FORCEINLINE VOID
+__TransmitterReturnPacketVersion2(
+    IN  PXENVIF_TRANSMITTER                         Transmitter,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
+    )
+{
+    struct _XENVIF_TRANSMITTER_PACKET_V2            *PacketVersion2;
+    PXENVIF_FRONTEND                                Frontend;
+    PXENVIF_VIF_CONTEXT                             Context;
+    LIST_ENTRY                                      List;
+
+    PacketVersion2 = Cookie;
+    PacketVersion2->Completion = *Completion;
+
+    Frontend = Transmitter->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+
+    InitializeListHead(&List);
+
+    ASSERT(IsZeroMemory(&PacketVersion2->ListEntry, sizeof (LIST_ENTRY)));
+    InsertTailList(&List, &PacketVersion2->ListEntry);
+
+    VifTransmitterReturnPacketsVersion2(Context, &List);
+    ASSERT(IsListEmpty(&List));
+}
+
+static FORCEINLINE VOID
 __TransmitterReturnPackets(
     IN  PXENVIF_TRANSMITTER Transmitter,
     IN  PLIST_ENTRY         List
     )
 {
     PXENVIF_FRONTEND        Frontend;
-
-    if (IsListEmpty(List))
-        return;
+    PXENVIF_VIF_CONTEXT     Context;
+    ULONG                   Version;
 
     Frontend = Transmitter->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+    Version = VifGetVersion(Context);
+
+    while (!IsListEmpty(List)) {
+        PLIST_ENTRY                 ListEntry;
+        PXENVIF_TRANSMITTER_PACKET  Packet;
 
-    VifTransmitterReturnPackets(PdoGetVifContext(FrontendGetPdo(Frontend)),
-                                List);
+        ListEntry = RemoveHeadList(List);
+        ASSERT3P(ListEntry, !=, List);
+
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        Packet = CONTAINING_RECORD(ListEntry,
+                                   XENVIF_TRANSMITTER_PACKET,
+                                   ListEntry);
+
+        if  (Version < 4)
+            __TransmitterReturnPacketVersion2(Transmitter,
+                                              Packet->Cookie,
+                                              &Packet->Completion);
+        else
+            VifTransmitterReturnPacket(Context,
+                                       Packet->Cookie,
+                                       &Packet->Completion);
+
+        __TransmitterPutPacket(Transmitter, Packet);
+    }
 }
 
 static FORCEINLINE BOOLEAN
@@ -2837,13 +2916,12 @@ __TransmitterRingReleaseLock(
     // thread could be simuntaneously adding to the list.
 
     do {
-        PLIST_ENTRY     ListEntry;
-
         TransmitterRingSwizzle(Ring);
         TransmitterRingSchedule(Ring);
 
-        ListEntry = Ring->PacketComplete.Flink;
         if (!IsListEmpty(&Ring->PacketComplete)) {
+            PLIST_ENTRY     ListEntry = Ring->PacketComplete.Flink;
+
             RemoveEntryList(&Ring->PacketComplete);
             InitializeListHead(&Ring->PacketComplete);
             AppendTailList(&List, ListEntry);
@@ -3752,21 +3830,24 @@ __TransmitterRingTeardown(
 }
 
 static FORCEINLINE VOID
-__TransmitterRingQueuePackets(
+__TransmitterRingQueuePacket(
     IN  PXENVIF_TRANSMITTER_RING    Ring,
-    IN  PLIST_ENTRY                 List
+    IN  PXENVIF_TRANSMITTER_PACKET  Packet
     )
 {
+    PLIST_ENTRY                     ListEntry;
     ULONG_PTR                       Old;
     ULONG_PTR                       LockBit;
     ULONG_PTR                       New;
 
+    ListEntry = &Packet->ListEntry;
+
     do {
         Old = (ULONG_PTR)Ring->Lock;
         LockBit = Old & XENVIF_TRANSMITTER_LOCK_BIT;
 
-        List->Flink->Blink = (PVOID)(Old & ~XENVIF_TRANSMITTER_LOCK_BIT);
-        New = (ULONG_PTR)List->Blink;
+        ListEntry->Blink = (PVOID)(Old & ~XENVIF_TRANSMITTER_LOCK_BIT);
+        New = (ULONG_PTR)ListEntry;
         ASSERT((New & XENVIF_TRANSMITTER_LOCK_BIT) == 0);
         New |= LockBit;
     } while ((ULONG_PTR)InterlockedCompareExchangePointer(&Ring->Lock, (PVOID)New, (PVOID)Old) != Old);
@@ -4485,7 +4566,7 @@ TransmitterTeardown(
 }
 
 static BOOLEAN
-__TransmitterGetPacketHeadersPullup(
+TransmitterGetPacketHeadersVersion2Pullup(
     IN      PVOID                   Argument,
     IN      PUCHAR                  DestinationVa,
     IN OUT  PXENVIF_PACKET_PAYLOAD  Payload,
@@ -4546,22 +4627,22 @@ fail1:
 }
 
 NTSTATUS
-TransmitterGetPacketHeaders(
-    IN  PXENVIF_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+TransmitterGetPacketHeadersVersion2(
+    IN  PXENVIF_TRANSMITTER                     Transmitter,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *PacketVersion2,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     )
 {
-    XENVIF_PACKET_PAYLOAD           Payload;
-    NTSTATUS                        status;
+    XENVIF_PACKET_PAYLOAD                       Payload;
+    NTSTATUS                                    status;
 
-    Payload.Mdl = Packet->Mdl;
-    Payload.Offset = Packet->Offset;
-    Payload.Length = Packet->Length;
+    Payload.Mdl = PacketVersion2->Mdl;
+    Payload.Offset = PacketVersion2->Offset;
+    Payload.Length = PacketVersion2->Length;
 
     status = ParsePacket(Headers,
-                         __TransmitterGetPacketHeadersPullup,
+                         TransmitterGetPacketHeadersVersion2Pullup,
                          Transmitter,
                          &Payload,
                          Info);
@@ -4574,70 +4655,241 @@ fail1:
     return status;
 }
 
-VOID
-TransmitterQueuePackets(
-    IN  PXENVIF_TRANSMITTER     Transmitter,
-    IN  PLIST_ENTRY             List
+static FORCEINLINE VOID
+__TransmitterHashAccumulate(
+    IN OUT  PULONG  Accumulator,
+    IN      PUCHAR  Array,
+    IN      ULONG   Length
     )
 {
-    PXENVIF_TRANSMITTER_RING    Ring;
-    PXENVIF_FRONTEND            Frontend;
-    LONG                        NumQueues;
+    ULONG           Current;
+    ULONG           Index;
 
-    Frontend = Transmitter->Frontend;
-    NumQueues = FrontendGetNumQueues(Frontend);
+    Current = *Accumulator;
+
+    for (Index = 0; Index < Length; Index++) {
+        ULONG   Overflow;
+
+        Current = (Current << 4) + Array[Index];
+
+        Overflow = Current & 0x000fff00;
+        if (Overflow != 0) {
+            Current ^= Overflow >> 8;
+            Current ^= Overflow;
+        }
+    }
+
+    *Accumulator = Current;
+}
+
+static FORCEINLINE ULONG
+__TransmitterHashPacket(
+    IN  PXENVIF_TRANSMITTER_PACKET  Packet
+    )
+{
+    PUCHAR                          StartVa;
+    PXENVIF_PACKET_INFO             Info;
+    PIP_HEADER                      IpHeader;
+    ULONG                           Value;
+
+    Value = 0;
+
+    StartVa = Packet->Header;
+    Info = &Packet->Info;
+
+    if (Info->TcpHeader.Length == 0 && Info->UdpHeader.Length == 0)
+        goto done;
+
+    ASSERT(Info->IpHeader.Length != 0);
+    IpHeader = (PIP_HEADER)(StartVa + Info->IpHeader.Offset);
 
-    if (NumQueues == 1) {
-        Ring = Transmitter->Ring[0];
+    if (IpHeader->Version == 4) {
+        PIPV4_HEADER    Version4 = &IpHeader->Version4;
 
-        __TransmitterRingQueuePackets(Ring, List);
+        __TransmitterHashAccumulate(&Value,
+                                    Version4->SourceAddress.Byte,
+                                    IPV4_ADDRESS_LENGTH);
+        __TransmitterHashAccumulate(&Value,
+                                    Version4->DestinationAddress.Byte,
+                                    IPV4_ADDRESS_LENGTH);
     } else {
-        while (!IsListEmpty(List)) {
-            PXENVIF_TRANSMITTER_PACKET  Packet;
-            LIST_ENTRY                  HashList;
-            ULONG                       Index;
+        PIPV6_HEADER    Version6 = &IpHeader->Version6;
 
-            InitializeListHead(&HashList);
-            Index = 0;
+        ASSERT3U(IpHeader->Version, ==, 6);
 
-            while (!IsListEmpty(List)) {
-                PLIST_ENTRY ListEntry;
-                ULONG       Hash;
+        __TransmitterHashAccumulate(&Value,
+                                    Version6->SourceAddress.Byte,
+                                    IPV6_ADDRESS_LENGTH);
+        __TransmitterHashAccumulate(&Value,
+                                    Version6->DestinationAddress.Byte,
+                                    IPV6_ADDRESS_LENGTH);
+    }
 
-                ListEntry = RemoveHeadList(List);
-                ASSERT3P(ListEntry, !=, List);
+    if (Info->TcpHeader.Length != 0) {
+        PTCP_HEADER TcpHeader;
 
-                RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+        TcpHeader = (PTCP_HEADER)(StartVa + Info->TcpHeader.Offset);
 
-                Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&TcpHeader->SourcePort,
+                                    sizeof (USHORT));
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&TcpHeader->DestinationPort,
+                                    sizeof (USHORT));
+    } else {
+        PUDP_HEADER UdpHeader;
 
-                Hash = Packet->Value % NumQueues;
-                if (Hash != Index) {
-                    if (!IsListEmpty(&HashList)) {
-                        Ring = Transmitter->Ring[Index];
-                        ASSERT3P(Ring, !=, NULL);
+        ASSERT(Info->UdpHeader.Length != 0);
 
-                        __TransmitterRingQueuePackets(Ring, &HashList);
-                        InitializeListHead(&HashList);
-                    }
+        UdpHeader = (PUDP_HEADER)(StartVa + Info->UdpHeader.Offset);
 
-                    Index = Hash;
-                }
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&UdpHeader->SourcePort,
+                                    sizeof (USHORT));
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&UdpHeader->DestinationPort,
+                                    sizeof (USHORT));
+    }
 
-                InsertTailList(&HashList, ListEntry);
-            }
+done:
+    return Value;
+}
+
+NTSTATUS
+TransmitterQueuePacket(
+    IN  PXENVIF_TRANSMITTER         Transmitter,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    )
+{
+    PXENVIF_FRONTEND                Frontend;
+    PXENVIF_TRANSMITTER_PACKET      Packet;
+    PUCHAR                          StartVa;
+    PXENVIF_PACKET_PAYLOAD          Payload;
+    PXENVIF_PACKET_INFO             Info;
+    ULONG                           Index;
+    PXENVIF_TRANSMITTER_RING        Ring;
+    NTSTATUS                        status;
 
-            if (!IsListEmpty(&HashList)) {
-                Ring = Transmitter->Ring[Index];
-                ASSERT3P(Ring, !=, NULL);
+    Frontend = Transmitter->Frontend;
 
-                __TransmitterRingQueuePackets(Ring, &HashList);
-                InitializeListHead(&HashList);
-            }
+    Packet = __TransmitterGetPacket(Transmitter);
 
-            ASSERT(IsListEmpty(&HashList));
-        }
+    status = STATUS_NO_MEMORY;
+    if (Packet == NULL)
+        goto fail1;
+
+    Packet->Mdl = Mdl;
+    Packet->Offset = Offset;
+    Packet->Length = Length;
+    Packet->OffloadOptions = OffloadOptions;
+    Packet->MaximumSegmentSize = MaximumSegmentSize;
+    Packet->TagControlInformation = TagControlInformation;
+    Packet->Cookie = Cookie;
+
+    StartVa = Packet->Header;
+
+    Payload = &Packet->Payload;
+    Payload->Mdl = Packet->Mdl;
+    Payload->Offset = Packet->Offset;
+    Payload->Length = Packet->Length;
+
+    Info = &Packet->Info;
+
+    status = ParsePacket(StartVa, TransmitterPullup, Transmitter, Payload, Info);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    switch (Hash->Algorithm) {
+    case XENVIF_PACKET_HASH_ALGORITHM_NONE:
+        Index = __TransmitterHashPacket(Packet);
+        break;
+
+    case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
+        Index = Hash->Value;
+        break;
+
+    default:
+        ASSERT(FALSE);
+        Index = 0;
+        break;
+    }
+
+    Index %= FrontendGetNumQueues(Frontend);
+    Ring = Transmitter->Ring[Index];
+
+    __TransmitterRingQueuePacket(Ring, Packet);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    __TransmitterPutPacket(Transmitter, Packet);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+TransmitterQueuePacketsVersion2(
+    IN  PXENVIF_TRANSMITTER     Transmitter,
+    IN  PLIST_ENTRY             List
+    )
+{
+    LIST_ENTRY                  Reject;
+
+    InitializeListHead(&Reject);
+
+    while (!IsListEmpty(List)) {
+        PLIST_ENTRY                             ListEntry;
+        struct _XENVIF_TRANSMITTER_PACKET_V2    *PacketVersion2;
+        XENVIF_PACKET_HASH                      Hash;
+        NTSTATUS                                status;
+
+        ListEntry = RemoveHeadList(List);
+        ASSERT3P(ListEntry, !=, List);
+
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        PacketVersion2 = CONTAINING_RECORD(ListEntry,
+                                           struct _XENVIF_TRANSMITTER_PACKET_V2,
+                                           ListEntry);
+
+        Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED;
+        Hash.Value = PacketVersion2->Value;
+
+        status = TransmitterQueuePacket(Transmitter,
+                                        PacketVersion2->Mdl,
+                                        PacketVersion2->Offset,
+                                        PacketVersion2->Length,
+                                        PacketVersion2->Send.OffloadOptions,
+                                        PacketVersion2->Send.MaximumSegmentSize,
+                                        PacketVersion2->Send.TagControlInformation,
+                                        &Hash,
+                                        PacketVersion2);
+        if (!NT_SUCCESS(status))
+            InsertTailList(&Reject, &PacketVersion2->ListEntry);
+    }
+
+    ASSERT(IsListEmpty(List));
+
+    if (!IsListEmpty(&Reject)) {
+        PLIST_ENTRY ListEntry = Reject.Flink;
+
+        RemoveEntryList(&Reject);
+        AppendTailList(List, ListEntry);
     }
+
+    return (IsListEmpty(List)) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
 }
 
 VOID
diff --git a/src/xenvif/transmitter.h b/src/xenvif/transmitter.h
index 04f1f6e..0b7f654 100644
--- a/src/xenvif/transmitter.h
+++ b/src/xenvif/transmitter.h
@@ -115,8 +115,21 @@ TransmitterQueryRingSize(
     OUT PULONG              Size
     );
 
-extern VOID
-TransmitterQueuePackets(
+extern NTSTATUS
+TransmitterQueuePacket(
+    IN  PXENVIF_TRANSMITTER         Transmitter,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    );
+
+extern NTSTATUS
+TransmitterQueuePacketsVersion2(
     IN  PXENVIF_TRANSMITTER Transmitter,
     IN  PLIST_ENTRY         List
     );
@@ -135,11 +148,11 @@ TransmitterQueryLargePacketSize(
     );
 
 extern NTSTATUS
-TransmitterGetPacketHeaders(
-    IN  PXENVIF_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+TransmitterGetPacketHeadersVersion2(
+    IN  PXENVIF_TRANSMITTER                     Transmitter,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     );
 
 #endif  // _XENVIF_TRANSMITTER_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index ac4d454..76365d2 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -317,7 +317,7 @@ done:
 }
 
 static VOID
-VifReceiverReturnPackets( 
+VifReceiverReturnPacketsVersion1(
     IN  PINTERFACE      Interface,
     IN  PLIST_ENTRY     List
     )
@@ -326,30 +326,45 @@ VifReceiverReturnPackets(
 
     AcquireMrswLockShared(&Context->Lock);
 
-    ReceiverReturnPackets(FrontendGetReceiver(Context->Frontend),
-                          List);
+    ReceiverReturnPacketsVersion1(FrontendGetReceiver(Context->Frontend),
+                                  List);
+
+    ReleaseMrswLockShared(&Context->Lock);
+}
+
+static VOID
+VifReceiverReturnPacket(
+    IN  PINTERFACE      Interface,
+    IN  PVOID           Cookie
+    )
+{
+    PXENVIF_VIF_CONTEXT Context = Interface->Context;
+
+    AcquireMrswLockShared(&Context->Lock);
+
+    ReceiverReturnPacket(FrontendGetReceiver(Context->Frontend),
+                         Cookie);
 
     ReleaseMrswLockShared(&Context->Lock);
 }
 
 static NTSTATUS
-VifTransmitterGetPacketHeaders(
-    IN  PINTERFACE                      Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET      Packet,
-    OUT PVOID                           Headers,
-    OUT PXENVIF_PACKET_INFO             Info
+VifTransmitterGetPacketHeadersVersion2(
+    IN  PINTERFACE                              Interface,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     )
 {
-    PXENVIF_VIF_CONTEXT                 Context = Interface->Context;
-    NTSTATUS                            status;
+    PXENVIF_VIF_CONTEXT                         Context = Interface->Context;
+    NTSTATUS                                    status;
 
     AcquireMrswLockShared(&Context->Lock);
 
-    ASSERT3U(VifGetVersion(Context), >=, 2);
-    status = TransmitterGetPacketHeaders(FrontendGetTransmitter(Context->Frontend),
-                                         Packet,
-                                         Headers,
-                                         Info);
+    status = TransmitterGetPacketHeadersVersion2(FrontendGetTransmitter(Context->Frontend),
+                                                 Packet,
+                                                 Headers,
+                                                 Info);
 
     ReleaseMrswLockShared(&Context->Lock);
 
@@ -357,7 +372,7 @@ VifTransmitterGetPacketHeaders(
 }
 
 static NTSTATUS
-VifTransmitterQueuePackets(
+VifTransmitterQueuePacketsVersion2(
     IN  PINTERFACE      Interface,
     IN  PLIST_ENTRY     List
     )
@@ -369,20 +384,64 @@ VifTransmitterQueuePackets(
 
     status = STATUS_UNSUCCESSFUL;
     if (Context->Enabled == FALSE)
-        goto fail1;
+        goto done;
 
-    ASSERT3U(VifGetVersion(Context), >=, 2);
-    TransmitterQueuePackets(FrontendGetTransmitter(Context->Frontend),
-                            List);
+    status = TransmitterQueuePacketsVersion2(FrontendGetTransmitter(Context->Frontend),
+                                             List);
 
+done:
     ReleaseMrswLockShared(&Context->Lock);
 
-    return STATUS_SUCCESS;
+    return status;
+}
 
-fail1:
+static VOID
+VifTransmitterQueuePacket(
+    IN  PINTERFACE                  Interface,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    )
+{
+    PXENVIF_VIF_CONTEXT             Context = Interface->Context;
+    NTSTATUS                        status;
+
+    AcquireMrswLockShared(&Context->Lock);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->Enabled == FALSE)
+        goto done;
+
+    ASSERT3U(VifGetVersion(Context), >=, 4);
+    status = TransmitterQueuePacket(FrontendGetTransmitter(Context->Frontend),
+                                    Mdl,
+                                    Offset,
+                                    Length,
+                                    OffloadOptions,
+                                    MaximumSegmentSize,
+                                    TagControlInformation,
+                                    Hash,
+                                    Cookie);
+
+done:
     ReleaseMrswLockShared(&Context->Lock);
 
-    return status;
+    if (!NT_SUCCESS(status)) {
+        XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
+
+        RtlZeroMemory(&Completion, sizeof (XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO));
+
+        Completion.Status = XENVIF_TRANSMITTER_PACKET_DROPPED;
+
+        VifTransmitterReturnPacket(Context,
+                                   Cookie,
+                                   &Completion);
+    }
 }
 
 static VOID
@@ -652,6 +711,7 @@ VifAcquire(
     Trace("====>\n");
 
     Context->Frontend = PdoGetFrontend(Context->Pdo);
+    Context->Version = Interface->Version;
 
     Trace("<====\n");
 
@@ -678,6 +738,7 @@ VifRelease(
 
     ASSERT(!Context->Enabled);
 
+    Context->Version = 0;
     Context->Frontend = NULL;
 
     Trace("<====\n");
@@ -693,11 +754,11 @@ static struct _XENVIF_VIF_INTERFACE_V2 VifInterfaceVersion2 = {
     VifEnable,
     VifDisable,
     VifQueryStatistic,
-    VifReceiverReturnPackets,
+    VifReceiverReturnPacketsVersion1,
     VifReceiverSetOffloadOptions,
     VifReceiverQueryRingSize,
-    VifTransmitterGetPacketHeaders,
-    VifTransmitterQueuePackets,
+    VifTransmitterGetPacketHeadersVersion2,
+    VifTransmitterQueuePacketsVersion2,
     VifTransmitterQueryOffloadOptions,
     VifTransmitterQueryLargePacketSize,
     VifTransmitterQueryRingSize,
@@ -718,12 +779,37 @@ static struct _XENVIF_VIF_INTERFACE_V3 VifInterfaceVersion3 = {
     VifEnable,
     VifDisable,
     VifQueryStatistic,
-    VifReceiverReturnPackets,
+    VifReceiverReturnPacketsVersion1,
     VifReceiverSetOffloadOptions,
     VifReceiverSetBackfillSize,
     VifReceiverQueryRingSize,
-    VifTransmitterGetPacketHeaders,
-    VifTransmitterQueuePackets,
+    VifTransmitterGetPacketHeadersVersion2,
+    VifTransmitterQueuePacketsVersion2,
+    VifTransmitterQueryOffloadOptions,
+    VifTransmitterQueryLargePacketSize,
+    VifTransmitterQueryRingSize,
+    VifMacQueryState,
+    VifMacQueryMaximumFrameSize,
+    VifMacQueryPermanentAddress,
+    VifMacQueryCurrentAddress,
+    VifMacQueryMulticastAddresses,
+    VifMacSetMulticastAddresses,
+    VifMacSetFilterLevel,
+    VifMacQueryFilterLevel
+};
+
+static struct _XENVIF_VIF_INTERFACE_V4 VifInterfaceVersion4 = {
+    { sizeof (struct _XENVIF_VIF_INTERFACE_V4), 4, NULL, NULL, NULL },
+    VifAcquire,
+    VifRelease,
+    VifEnable,
+    VifDisable,
+    VifQueryStatistic,
+    VifReceiverReturnPacket,
+    VifReceiverSetOffloadOptions,
+    VifReceiverSetBackfillSize,
+    VifReceiverQueryRingSize,
+    VifTransmitterQueuePacket,
     VifTransmitterQueryOffloadOptions,
     VifTransmitterQueryLargePacketSize,
     VifTransmitterQueryRingSize,
@@ -835,13 +921,28 @@ VifGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 4: {
+        struct _XENVIF_VIF_INTERFACE_V4 *VifInterface;
+
+        VifInterface = (struct _XENVIF_VIF_INTERFACE_V4 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V4))
+            break;
+
+        *VifInterface = VifInterfaceVersion4;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;
     }
 
-    Context->Version = Version;
-
     return status;
 }   
 
@@ -873,18 +974,43 @@ VifTeardown(
 }
 
 VOID
-VifReceiverQueuePackets(
+VifReceiverQueuePacketsVersion1(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     )
 {
     Context->Callback(Context->Argument,
-                      XENVIF_RECEIVER_QUEUE_PACKETS,
+                      XENVIF_RECEIVER_QUEUE_PACKET,
                       List);
 }
 
 VOID
-VifTransmitterReturnPackets(
+VifReceiverQueuePacket(
+    IN  PXENVIF_VIF_CONTEXT             Context,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
+    )
+{
+    Context->Callback(Context->Argument,
+                      XENVIF_RECEIVER_QUEUE_PACKET,
+                      Mdl,
+                      Offset,
+                      Length,
+                      Flags,
+                      MaximumSegmentSize,
+                      TagControlInformation,
+                      Info,
+                      Cookie);
+}
+
+VOID
+VifTransmitterReturnPacketsVersion2(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     )
@@ -892,10 +1018,25 @@ VifTransmitterReturnPackets(
     ASSERT3U(VifGetVersion(Context), >=, 2);
 
     Context->Callback(Context->Argument,
-                      XENVIF_TRANSMITTER_RETURN_PACKETS,
+                      XENVIF_TRANSMITTER_RETURN_PACKET,
                       List);
 }
 
+VOID
+VifTransmitterReturnPacket(
+    IN  PXENVIF_VIF_CONTEXT                         Context,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
+    )
+{
+    ASSERT3U(VifGetVersion(Context), >=, 4);
+
+    Context->Callback(Context->Argument,
+                      XENVIF_TRANSMITTER_RETURN_PACKET,
+                      Cookie,
+                      Completion);
+}
+
 PXENVIF_THREAD
 VifGetMacThread(
     IN  PXENVIF_VIF_CONTEXT Context
diff --git a/src/xenvif/vif.h b/src/xenvif/vif.h
index a842b79..ebb4337 100644
--- a/src/xenvif/vif.h
+++ b/src/xenvif/vif.h
@@ -63,17 +63,37 @@ VifTeardown(
 // CALLBACKS
 
 extern VOID
-VifReceiverQueuePackets(
+VifReceiverQueuePacketsVersion1(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     );
 
 extern VOID
-VifTransmitterReturnPackets(
+VifReceiverQueuePacket(
+    IN  PXENVIF_VIF_CONTEXT             Context,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
+    );
+
+extern VOID
+VifTransmitterReturnPacketsVersion2(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     );
 
+extern VOID
+VifTransmitterReturnPacket(
+    IN  PXENVIF_VIF_CONTEXT                         Context,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
+    );
+
 extern PXENVIF_THREAD
 VifGetMacThread(
     IN  PXENVIF_VIF_CONTEXT Context
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:40:53 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:40:53 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pfR-0001UJ-FK; Fri, 04 Dec 2015 12:40:53 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pfQ-0001TY-1N
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:40:52 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	AF/32-22142-3D981665; Fri, 04 Dec 2015 12:40:51 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1449232848!8260694!1
X-Originating-IP: [209.85.160.169]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9431 invoked from network); 4 Dec 2015 12:40:49 -0000
Received: from mail-yk0-f169.google.com (HELO mail-yk0-f169.google.com)
	(209.85.160.169)
	by server-14.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:40:49 -0000
Received: by ykdv3 with SMTP id v3so122060140ykd.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:40:48 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=jcZQXlFKX+wygHOE0ytUCUew44WELfCXDBAGZ8R5Cp4=;
	b=QihC3Sokq4D/6evv4qVe+yCwx7T/k7AmN/5MN658tszVEPBSYpFXXGPDkmlEhKpVmr
	qa2hLGvMvxttudG4PqlUfVtLdlOUqbcaoevwAcqLcwvAYUbIXmNfhcazL0Qa80UH+udl
	cSFuhXefnY73A8KQsglD7CJ5lTs15ZGBat+vZ0liSGWmPhjj0Af12EOoDYQ2zkTqB3US
	mLyO/URcQbyLFDoEKxV4/mq88j6tZU2VyIuWPj7j0TntkKrDibqvtDwmDtzrrxdYpCil
	BpKbcROyIF6iQG8RrVkyG/MKY0oqEX8QOgoSr6tUPnIP5H5PKa7WV0K6aUaS5rtMHcKM
	5Q7A==
X-Received: by 10.13.217.79 with SMTP id b76mr12596891ywe.339.1449232848253;
	Fri, 04 Dec 2015 04:40:48 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	q63sm8823610ywf.16.2015.12.04.04.40.46
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:40:47 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:40:32 +0000
Message-Id: <1449232832-20628-3-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
References: <1449232832-20628-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 3/3] Introduce VIF interface version 4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This greatly simplifies the interface with XENNET by queuing single packets
on both the transmit and receive side, negating the need for a shared packet
structures and bringing static hash calculation into XENVIF.
Crucially this also means that XENNET no longer needs to use the
XENBUS_CACHE interface which allows it to be patched to avoid the race
introduced by commit 026aa32c "Make sure XENBUS interfaces are released when
going into S4".

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/revision.h       |   5 +-
 include/vif_interface.h  | 243 ++++++++++-------
 src/xenvif/frontend.c    |   3 +
 src/xenvif/frontend.h    |   5 +
 src/xenvif/receiver.c    | 295 ++++++++++++++-------
 src/xenvif/receiver.h    |   8 +-
 src/xenvif/transmitter.c | 660 ++++++++++++++++++++++++++++++++---------------
 src/xenvif/transmitter.h |  27 +-
 src/xenvif/vif.c         | 211 ++++++++++++---
 src/xenvif/vif.h         |  24 +-
 10 files changed, 1041 insertions(+), 440 deletions(-)

diff --git a/include/revision.h b/include/revision.h
index 77d1405..eda8871 100644
--- a/include/revision.h
+++ b/include/revision.h
@@ -42,6 +42,9 @@
 #define DEFINE_REVISION_TABLE                       \
     DEFINE_REVISION(0x08000002,  1,  2,  0,  0),    \
     DEFINE_REVISION(0x08000003,  1,  3,  0,  0),    \
-    DEFINE_REVISION(0x08000004,  1,  3,  2,  1)
+    DEFINE_REVISION(0x08000004,  1,  3,  2,  1),    \
+    DEFINE_REVISION(0x08000006,  1,  4,  2,  1)
+
+// Revision 0x08000005 is already in use in the staging-8.1 branch.
 
 #endif  // _REVISION_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index f6b6298..27c5d2d 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -43,6 +43,28 @@
 #include <ifdef.h>
 #include <ethernet.h>
 
+/*! \enum _XENVIF_PACKET_HASH_ALGORITHM
+    \brief Hash algorithm
+*/
+typedef enum _XENVIF_PACKET_HASH_ALGORITHM {
+    /*! None (value should be ignored) */
+    XENVIF_PACKET_HASH_ALGORITHM_NONE = 0,
+    /*! Unspecified hash (value can be used) */
+    XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED
+} XENVIF_PACKET_HASH_ALGORITHM, *PXENVIF_PACKET_HASH_ALGORITHM;
+
+/*! \struct _XENVIF_PACKET_HASH_V1
+    \brief Hash information
+*/
+struct _XENVIF_PACKET_HASH_V1 {
+    /*! Hash algorithm used to calculate value */
+    XENVIF_PACKET_HASH_ALGORITHM    Algorithm;
+    /*! Calculated value */
+    ULONG                           Value;
+};
+
+typedef struct _XENVIF_PACKET_HASH_V1 XENVIF_PACKET_HASH, *PXENVIF_PACKET_HASH;
+
 /*! \struct _XENVIF_PACKET_HEADER_V1
     \brief Packet header information
 */
@@ -53,14 +75,25 @@ struct  _XENVIF_PACKET_HEADER_V1 {
     ULONG   Length;
 };
 
-/*! \struct _XENVIF_PACKET_INFO_V1
+struct _XENVIF_PACKET_INFO_V1 {
+    ULONG                           Length;
+    USHORT                          TagControlInformation;
+    BOOLEAN                         IsAFragment;
+    struct _XENVIF_PACKET_HEADER_V1 EthernetHeader;
+    struct _XENVIF_PACKET_HEADER_V1 LLCSnapHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 TcpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 TcpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
+};
+
+/*! \struct _XENVIF_PACKET_INFO_V2
     \brief Packet information
 */
-struct _XENVIF_PACKET_INFO_V1 {
+struct _XENVIF_PACKET_INFO_V2 {
     /*! Total length of all headers */
     ULONG                           Length;
-    /*! VLAN TCI if present (0 indicates not present) */
-    USHORT                          TagControlInformation;
     /*! TRUE if the packet is an IP fragment */
     BOOLEAN                         IsAFragment;
     /*! Ethernet header (stripped of any VLAN tag) */
@@ -79,7 +112,7 @@ struct _XENVIF_PACKET_INFO_V1 {
     struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
 };
 
-typedef struct _XENVIF_PACKET_INFO_V1   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
+typedef struct _XENVIF_PACKET_INFO_V2   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
 
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
@@ -120,32 +153,18 @@ typedef struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 XENVIF_PACKET_CHECKSUM_FLAGS, *P
 
 #pragma warning(pop)
 
-/*! \struct _XENVIF_RECEIVER_PACKET_V1
-    \brief Receive-side packet structure
-*/
 struct _XENVIF_RECEIVER_PACKET_V1 {
-    /*! List entry used for chaining packets together */
     LIST_ENTRY                              ListEntry;
-    /*! Pointer to packet information */
     struct _XENVIF_PACKET_INFO_V1           *Info;
-    /*! Offset of start of packet in MDL */
     ULONG                                   Offset;
-    /*! Total length of packet */
     ULONG                                   Length;
-    /*! Checksum flags */
     struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 Flags;
-    /*! TCP MSS if the packet contains a TCP large segment */
     USHORT                                  MaximumSegmentSize;
-    /*! Opaque cookie used to store context information for packet return */
     PVOID                                   Cookie;
-    /*! MDL referencing the initial buffer of the packet */
     MDL                                     Mdl;
-    /*! PFN information, which must always follow an MDL */
     PFN_NUMBER                              __Pfn;
 };
 
-typedef struct _XENVIF_RECEIVER_PACKET_V1 XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET;
-
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
 #pragma warning(disable:4201)   // nonstandard extension used : nameless struct/union
@@ -190,32 +209,18 @@ typedef struct _XENVIF_VIF_OFFLOAD_OPTIONS_V1 XENVIF_VIF_OFFLOAD_OPTIONS, *PXENV
 
 #pragma pack(push, 1) 
 
-/*! \struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1
-    \brief Packet information passed from subscriber to provider on
-    transmit side packet send
-
-    To fit into the reserved space in NDIS_PACKET and NET_BUFFER structures
-    this structure must be at most the size of 3 pointer types.
-*/
 struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 {
-    /*! Offload options for this packet */
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
-    /*! TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set) */
     USHORT                      MaximumSegmentSize;
-    /*! VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set) */
     USHORT                      TagControlInformation;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 XENVIF_TRANSMITTER_PACKET_SEND_INFO, *PXENVIF_TRANSMITTER_PACKET_SEND_INFO;
-
 /*! \enum _XENVIF_TRANSMITTER_PACKET_STATUS
     \brief Transmit-side packet status
 */
 typedef enum _XENVIF_TRANSMITTER_PACKET_STATUS {
-    /*! Packet was queued for the backend */
-    XENVIF_TRANSMITTER_PACKET_PENDING = 1,
     /*! Packet has been successfully processed by the backend */
-    XENVIF_TRANSMITTER_PACKET_OK,
+    XENVIF_TRANSMITTER_PACKET_OK = 2,
     /*! Packet was dropped */
     XENVIF_TRANSMITTER_PACKET_DROPPED,
     /*! There was a problem handling the packet */
@@ -244,30 +249,17 @@ typedef struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 XENVIF_TRANSMITTER_
 
 #pragma pack(pop) 
 
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V2
-    \brief Transmit-side packet structure (v2)
-*/
 struct _XENVIF_TRANSMITTER_PACKET_V2 {
-    /*! List entry used for chaining packets together */
-    LIST_ENTRY                                  ListEntry;
-    /*! Opaque cookie used to store context information for packet return */
-    PVOID                                       Cookie;
-    /*! Hash value set by subscriber */
-    ULONG                                       Value;
-    /*! Packet information passed from subscriber to provider */
-    XENVIF_TRANSMITTER_PACKET_SEND_INFO         Send;
-    /*! Packet information passed from provider to subscriber on packet return */
-    XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
-    /*! Packet data MDL */
-    PMDL                                        Mdl;
-    /*! Offset into MDL to start of packet */
-    ULONG                                       Offset;
-    /*! Packet length */
-    ULONG                                       Length;
+    LIST_ENTRY                                              ListEntry;
+    PVOID                                                   Cookie;
+    ULONG                                                   Value;
+    struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1          Send;
+    struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1    Completion;
+    PMDL                                                    Mdl;
+    ULONG                                                   Offset;
+    ULONG                                                   Length;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_V2 XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
-
 /*! \enum _XENVIF_VIF_STATISTIC
     \brief Interface statistics
 */
@@ -327,10 +319,10 @@ typedef enum _XENVIF_MAC_FILTER_LEVEL {
     \brief Type of callback (see \ref XENVIF_VIF_CALLBACK)
 */
 typedef enum _XENVIF_VIF_CALLBACK_TYPE {
-    /*! Return transmit side packets to the subscriber */
-    XENVIF_TRANSMITTER_RETURN_PACKETS = 0,
-    /*! Queue receive side packets at the subscriber */
-    XENVIF_RECEIVER_QUEUE_PACKETS,
+    /*! Return a transmit side packet to the subscriber */
+    XENVIF_TRANSMITTER_RETURN_PACKET = 0,
+    /*! Queue a receive side packet at the subscriber */
+    XENVIF_RECEIVER_QUEUE_PACKET,
     /*! Notify the subscriber of a MAC (link) state has change */
     XENVIF_MAC_STATE_CHANGE
 } XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
@@ -362,11 +354,19 @@ typedef VOID
     \param Type The callback type
     \param ... Additional paramaters required by \a Type
 
-    \b XENVIF_TRANSMITTER_RETURN_PACKETS:
-    \param Head The head of a chain of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_TRANSMITTER_RETURN_PACKET:
+    \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+    \param Completion Packet completion information
 
-    \b XENVIF_RECEIVER_QUEUE_PACKETS:
-    \param List List of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_RECEIVER_QUEUE_PACKET:
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param Flags Packet checksum flags
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Info Header information for the packet
+    \param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
 
     \b XENVIF_MAC_STATE_CHANGE:
     No additional arguments
@@ -427,47 +427,65 @@ typedef NTSTATUS
     OUT PULONGLONG              Value
     );
 
-/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKETS
-    \brief Return packets queues for receive by \ref XENVIF_VIF_CALLBACK
-    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKETS)
-
-    \param Interface The interface header
-    \param List List of \ref _XENVIF_RECEIVER_PACKET_V1
-*/
 typedef VOID
-(*XENVIF_VIF_RECEIVER_RETURN_PACKETS)(
+(*XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1)(
     IN  PINTERFACE  Interface,
     IN  PLIST_ENTRY List
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
-    \brief Get the packet headers into supplied buffer
+/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKET
+    \brief Return packets queued for receive by \ref XENVIF_VIF_CALLBACK
+    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKET)
 
     \param Interface The interface header
-    \param Packet The packet to acquire headers for.
-    \param Headers The buffer to receive headers.
-    \param Info The offsets into Headers for relevant headers
+    \param Cookie Cookie passed to XENVIF_RECEIVER_QUEUE_PACKET callback
 */
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)(
-    IN  PINTERFACE                  Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+typedef VOID
+(*XENVIF_VIF_RECEIVER_RETURN_PACKET)(
+    IN  PINTERFACE  Interface,
+    IN  PVOID       Cookie
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS
-    \brief Queue transmit side packets at the provider
+typedef NTSTATUS
+(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2)(
+    IN  PINTERFACE                              Interface,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
+    );
 
-    \param Interface The interface header
-    \param List List of XENVIF_TRANSMITTER_PACKET
-*/
 typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS)(
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
     IN  PINTERFACE  Interface,
     IN  PLIST_ENTRY List
     );
 
+/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKET
+    \brief Queue a packet at the provider's transmit side
+
+    \param Interface The interface header
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param OffloadOptions The requested offload options for this packet
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Hash Hash information for the packet
+    \param Cookie A cookie specified by the caller that will be passed to the XENVIF_TRANSMITTER_RETURN_PACKET callback
+*/
+typedef VOID
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET)(
+    IN  PINTERFACE                  Interface,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    );
+
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
     \brief Query the available set of transmit side offload options
 
@@ -524,7 +542,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE
     \brief Query the maximum number of transmit side packets that can
-    be queued in the shared ring between frontend and backend
+    be queued in each shared ring between frontend and backend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -537,7 +555,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_RECEIVER_QUERY_RING_SIZE
     \brief Query the maximum number of receive side packets that can
-    be queued in the shared ring between backend and frontend
+    be queued in each shared ring between backend and frontend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -685,11 +703,11 @@ struct _XENVIF_VIF_INTERFACE_V2 {
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS            TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -714,12 +732,41 @@ struct _XENVIF_VIF_INTERFACE_V3 {
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
+    XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
+    XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
+    XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
+    XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
+    XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
+    XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
+    XENVIF_VIF_MAC_QUERY_STATE                      MacQueryState;
+    XENVIF_VIF_MAC_QUERY_MAXIMUM_FRAME_SIZE         MacQueryMaximumFrameSize;
+    XENVIF_VIF_MAC_QUERY_PERMANENT_ADDRESS          MacQueryPermanentAddress;
+    XENVIF_VIF_MAC_QUERY_CURRENT_ADDRESS            MacQueryCurrentAddress;
+    XENVIF_VIF_MAC_QUERY_MULTICAST_ADDRESSES        MacQueryMulticastAddresses;
+    XENVIF_VIF_MAC_SET_MULTICAST_ADDRESSES          MacSetMulticastAddresses;
+    XENVIF_VIF_MAC_SET_FILTER_LEVEL                 MacSetFilterLevel;
+    XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
+};
+
+/*! \struct _XENVIF_VIF_INTERFACE_V4
+    \brief VIF interface version 4
+    \ingroup interfaces
+*/
+struct _XENVIF_VIF_INTERFACE_V4 {
+    INTERFACE                                       Interface;
+    XENVIF_VIF_ACQUIRE                              Acquire;
+    XENVIF_VIF_RELEASE                              Release;
+    XENVIF_VIF_ENABLE                               Enable;
+    XENVIF_VIF_DISABLE                              Disable;
+    XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
+    XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS            TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKET             TransmitterQueuePacket;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -733,7 +780,7 @@ struct _XENVIF_VIF_INTERFACE_V3 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V4 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
 
 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -744,6 +791,6 @@ typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER
 #endif  // _WINDLL
 
 #define XENVIF_VIF_INTERFACE_VERSION_MIN    2
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    3
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    4
 
 #endif  // _XENVIF_INTERFACE_H
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index b066d0b..a43a534 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -56,6 +56,7 @@ typedef struct _XENVIF_FRONTEND_STATISTICS {
     ULONGLONG   Value[XENVIF_VIF_STATISTIC_COUNT];
 } XENVIF_FRONTEND_STATISTICS, *PXENVIF_FRONTEND_STATISTICS;
 
+
 struct _XENVIF_FRONTEND {
     PXENVIF_PDO                 Pdo;
     PCHAR                       Path;
@@ -1898,6 +1899,7 @@ fail5:
 
     MacDisconnect(__FrontendGetMac(Frontend));
 
+    Frontend->Split = FALSE;
     Frontend->NumQueues = 0;
 
 fail4:
@@ -1938,6 +1940,7 @@ FrontendDisconnect(
     ReceiverDisconnect(__FrontendGetReceiver(Frontend));
     MacDisconnect(__FrontendGetMac(Frontend));
 
+    Frontend->Split = FALSE;
     Frontend->NumQueues = 0;
 
     XENBUS_DEBUG(Deregister,
diff --git a/src/xenvif/frontend.h b/src/xenvif/frontend.h
index eda9e3d..d90f977 100644
--- a/src/xenvif/frontend.h
+++ b/src/xenvif/frontend.h
@@ -127,6 +127,11 @@ FrontendIsSplit(
     IN  PXENVIF_FRONTEND    Frontend
     );
 
+extern BOOLEAN
+FrontendIsSplit(
+    IN  PXENVIF_FRONTEND    Frontend
+    );
+
 extern PCHAR
 FrontendFormatPath(
     IN  PXENVIF_FRONTEND    Frontend,
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 030f84f..53f322f 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -105,6 +105,19 @@ typedef struct _XENVIF_RECEIVER_RING {
     LIST_ENTRY                  PacketList;
 } XENVIF_RECEIVER_RING, *PXENVIF_RECEIVER_RING;
 
+typedef struct _XENVIF_RECEIVER_PACKET {
+    LIST_ENTRY                      ListEntry;
+    XENVIF_PACKET_INFO              Info;
+    ULONG                           Offset;
+    ULONG                           Length;
+    XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+    USHORT                          MaximumSegmentSize;
+    USHORT                          TagControlInformation;
+    PXENVIF_RECEIVER_RING           Ring;
+    MDL                             Mdl;
+    PFN_NUMBER                      __Pfn;
+} XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET;
+
 struct _XENVIF_RECEIVER {
     PXENVIF_FRONTEND        Frontend;
     XENBUS_CACHE_INTERFACE  CacheInterface;
@@ -149,29 +162,19 @@ ReceiverPacketCtor(
     IN  PVOID               Object
     )
 {
+    PXENVIF_RECEIVER_RING   Ring = Argument;
     PXENVIF_RECEIVER_PACKET Packet = Object;
-    PXENVIF_PACKET_INFO     Info;
-    PMDL		            Mdl;
-    PUCHAR  		        StartVa;
-    NTSTATUS		        status;
-
-    UNREFERENCED_PARAMETER(Argument);
+    PMDL                    Mdl;
+    PUCHAR                  StartVa;
+    NTSTATUS                status;
 
     ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_RECEIVER_PACKET)));
 
-    Info = __ReceiverAllocate(sizeof (XENVIF_PACKET_INFO));
-
-    status = STATUS_NO_MEMORY;
-    if (Info == NULL)
-        goto fail1;
-
-    Packet->Info = Info;
-
     Mdl = __AllocatePage();
 
     status = STATUS_NO_MEMORY;
     if (Mdl == NULL)
-        goto fail2;
+        goto fail1;
 
     StartVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
     ASSERT(StartVa != NULL);
@@ -186,13 +189,9 @@ ReceiverPacketCtor(
 
     ExFreePool(Mdl);
 
-    return STATUS_SUCCESS;
+    Packet->Ring = Ring;
 
-fail2:
-    Error("fail2\n");
-
-    __ReceiverFree(Info);
-    Packet->Info = NULL;
+    return STATUS_SUCCESS;
 
 fail1:
     Error("fail1 (%08x)\n", status);
@@ -208,11 +207,12 @@ ReceiverPacketDtor(
     IN  PVOID               Object
     )
 {
+    PXENVIF_RECEIVER_RING   Ring = Argument;
     PXENVIF_RECEIVER_PACKET Packet = Object;
     PMDL                    Mdl;
-    PXENVIF_PACKET_INFO     Info;
 
-    UNREFERENCED_PARAMETER(Argument);
+    ASSERT3P(Packet->Ring, ==, Ring);
+    Packet->Ring = NULL;
 
     Mdl = &Packet->Mdl;
 
@@ -222,11 +222,6 @@ ReceiverPacketDtor(
 
     RtlZeroMemory(Mdl, sizeof (MDL) + sizeof (PFN_NUMBER));
 
-    Info = Packet->Info;
-
-    __ReceiverFree(Info);
-    Packet->Info = NULL;
-
     ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_RECEIVER_PACKET)));
 }
 
@@ -248,7 +243,7 @@ __ReceiverRingGetPacket(
                           Ring->PacketCache,
                           Locked);
 
-    ASSERT(IsZeroMemory(Packet->Info, sizeof (XENVIF_PACKET_INFO)));
+    ASSERT(IsZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO)));
 
     return Packet;
 }
@@ -273,9 +268,9 @@ __ReceiverRingPutPacket(
     Packet->Length = 0;
     Packet->Flags.Value = 0;
     Packet->MaximumSegmentSize = 0;
-    Packet->Cookie = NULL;
+    Packet->TagControlInformation = 0;
 
-    RtlZeroMemory(Packet->Info, sizeof (XENVIF_PACKET_INFO));
+    RtlZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO));
 
     Mdl->MappedSystemVa = Mdl->StartVa;
     Mdl->ByteOffset = 0;
@@ -395,7 +390,7 @@ ReceiverRingProcessTag(
     PETHERNET_HEADER             EthernetHeader;
     ULONG                        Offset;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     PayloadLength = Packet->Length - Info->Length;
 
@@ -410,7 +405,7 @@ ReceiverRingProcessTag(
         Ring->OffloadOptions.OffloadTagManipulation == 0)
         return;
 
-    Info->TagControlInformation = NTOHS(EthernetHeader->Tagged.Tag.ControlInformation);
+    Packet->TagControlInformation = NTOHS(EthernetHeader->Tagged.Tag.ControlInformation);
 
     Offset = FIELD_OFFSET(ETHERNET_TAGGED_HEADER, Tag);
     RtlMoveMemory((PUCHAR)EthernetHeader + sizeof (ETHERNET_TAG),
@@ -464,7 +459,7 @@ ReceiverRingProcessChecksum(
 
     Receiver = Ring->Receiver;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     Payload.Mdl = &Packet->Mdl;
     Payload.Offset = Packet->Offset + Info->Length;
@@ -478,8 +473,8 @@ ReceiverRingProcessChecksum(
         Payload.Offset = 0;
     }
 
-    flags = (uint16_t)(ULONG_PTR)Packet->Cookie;
-    ASSERT3U(Packet->Flags.Value, ==, 0);
+    flags = (uint16_t)Packet->Flags.Value;
+    Packet->Flags.Value = 0;
 
     if (Info->IpHeader.Length == 0)
         return;
@@ -743,7 +738,7 @@ __ReceiverRingBuildSegment(
 
     Receiver = Ring->Receiver;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     InfoVa = MmGetSystemAddressForMdlSafe(&Packet->Mdl, NormalPagePriority);
     ASSERT(InfoVa != NULL);
@@ -755,7 +750,11 @@ __ReceiverRingBuildSegment(
     if (Segment == NULL)
         goto fail1;
 
+    Segment->Info = Packet->Info;
     Segment->Offset = Packet->Offset;
+    Segment->Flags = Packet->Flags;
+    Segment->MaximumSegmentSize = Packet->MaximumSegmentSize;
+    Segment->TagControlInformation = Packet->TagControlInformation;
 
     Mdl = &Segment->Mdl;
 
@@ -769,9 +768,6 @@ __ReceiverRingBuildSegment(
     RtlCopyMemory(StartVa, InfoVa, Info->Length);
     Mdl->ByteCount += Info->Length;
 
-    *Segment->Info = *Packet->Info;
-    Segment->Cookie = Packet->Cookie;
-
     // Adjust the info for the next segment
     IpHeader = (PIP_HEADER)(InfoVa + Info->IpHeader.Offset);
     if (IpHeader->Version == 4) {
@@ -916,11 +912,11 @@ ReceiverRingProcessLargePacket(
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
     ASSERT(Info->IpHeader.Offset != 0);
     ASSERT(Info->TcpHeader.Offset != 0);
     
-    flags = (uint16_t)(ULONG_PTR)Packet->Cookie;
+    flags = (uint16_t)Packet->Flags.Value;
     ASSERT(flags & NETRXF_csum_blank);
     ASSERT(flags & NETRXF_data_validated);
 
@@ -1089,7 +1085,7 @@ ReceiverRingProcessStandardPacket(
     Frontend = Receiver->Frontend;
     Mac = FrontendGetMac(Frontend);
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     Payload.Mdl = Packet->Mdl.Next;
     Payload.Offset = 0;
@@ -1177,24 +1173,24 @@ fail1:
 
 static VOID
 ReceiverRingProcessPacket(
-    IN  PXENVIF_RECEIVER_RING   Ring,
-    IN  PXENVIF_RECEIVER_PACKET Packet,
-    OUT PLIST_ENTRY             List
+    IN  PXENVIF_RECEIVER_RING       Ring,
+    IN  PXENVIF_RECEIVER_PACKET     Packet,
+    OUT PLIST_ENTRY                 List
     )
 {
-    PXENVIF_RECEIVER            Receiver;
-    PXENVIF_FRONTEND            Frontend;
-    PXENVIF_MAC                 Mac;
-    ULONG                       Length;
-    USHORT                      MaximumSegmentSize;
-    PVOID                       Cookie;
-    XENVIF_PACKET_PAYLOAD       Payload;
-    PXENVIF_PACKET_INFO         Info;
-    PUCHAR                      StartVa;
-    PETHERNET_HEADER            EthernetHeader;
-    PETHERNET_ADDRESS           DestinationAddress;
-    ETHERNET_ADDRESS_TYPE       Type;
-    NTSTATUS                    status;
+    PXENVIF_RECEIVER                Receiver;
+    PXENVIF_FRONTEND                Frontend;
+    PXENVIF_MAC                     Mac;
+    ULONG                           Length;
+    XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+    USHORT                          MaximumSegmentSize;
+    XENVIF_PACKET_PAYLOAD           Payload;
+    PXENVIF_PACKET_INFO             Info;
+    PUCHAR                          StartVa;
+    PETHERNET_HEADER                EthernetHeader;
+    PETHERNET_ADDRESS               DestinationAddress;
+    ETHERNET_ADDRESS_TYPE           Type;
+    NTSTATUS                        status;
 
     Receiver = Ring->Receiver;
     Frontend = Receiver->Frontend;
@@ -1202,8 +1198,9 @@ ReceiverRingProcessPacket(
 
     ASSERT3U(Packet->Offset, ==, 0);
     Length = Packet->Length;
+    Flags = Packet->Flags;
     MaximumSegmentSize = Packet->MaximumSegmentSize;
-    Cookie = Packet->Cookie;
+    ASSERT3U(Packet->TagControlInformation, ==, 0);
 
     Payload.Mdl = &Packet->Mdl;
     Payload.Offset = 0;
@@ -1223,8 +1220,8 @@ ReceiverRingProcessPacket(
     // Copy in the extracted metadata
     Packet->Offset = Receiver->IpAlignOffset;
     Packet->Length = Length;
+    Packet->Flags = Flags;
     Packet->MaximumSegmentSize = MaximumSegmentSize;
-    Packet->Cookie = Cookie;
 
     StartVa = MmGetSystemAddressForMdlSafe(&Packet->Mdl, NormalPagePriority);
     ASSERT(StartVa != NULL);
@@ -1232,7 +1229,7 @@ ReceiverRingProcessPacket(
 
     Packet->Mdl.ByteCount = Packet->Offset;
 
-    Info = Packet->Info;
+    Info = &Packet->Info;
 
     status = ParsePacket(StartVa, ReceiverRingPullup, Ring, &Payload, Info);
     if (!NT_SUCCESS(status)) {
@@ -1361,8 +1358,6 @@ ReceiverRingProcessPackets(
         ReceiverRingProcessTag(Ring, Packet);
         ReceiverRingProcessChecksum(Ring, Packet);
 
-        Packet->Cookie = Ring;
-
         (*Count)++;
     }
 }
@@ -1378,6 +1373,79 @@ __ReceiverRingAcquireLock(
     KeAcquireSpinLockAtDpcLevel(&Ring->Lock);
 }
 
+static FORCEINLINE VOID
+__ReceiverQueuePacketVersion1(
+    IN  PXENVIF_RECEIVER                Receiver,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
+    )
+{
+    struct _XENVIF_PACKET_INFO_V1       *InfoVersion1;
+    struct _XENVIF_RECEIVER_PACKET_V1   *PacketVersion1;
+    PXENVIF_FRONTEND                    Frontend;
+    PXENVIF_VIF_CONTEXT                 Context;
+    LIST_ENTRY                          List;
+    NTSTATUS                            status;
+
+    InfoVersion1 = __ReceiverAllocate(sizeof (struct _XENVIF_PACKET_INFO_V1));
+
+    status = STATUS_NO_MEMORY;
+    if (InfoVersion1 == NULL)
+        goto fail1;
+
+    InfoVersion1->Length = Info->Length;
+    InfoVersion1->TagControlInformation = TagControlInformation;
+    InfoVersion1->IsAFragment = Info->IsAFragment;
+    InfoVersion1->EthernetHeader = Info->EthernetHeader;
+    InfoVersion1->LLCSnapHeader = Info->LLCSnapHeader;
+    InfoVersion1->IpHeader = Info->IpHeader;
+    InfoVersion1->IpOptions = Info->IpOptions;
+    InfoVersion1->TcpHeader = Info->TcpHeader;
+    InfoVersion1->TcpOptions = Info->TcpOptions;
+    InfoVersion1->UdpHeader = Info->UdpHeader;
+
+    PacketVersion1 = __ReceiverAllocate(sizeof (struct _XENVIF_RECEIVER_PACKET_V1));
+
+    status = STATUS_NO_MEMORY;
+    if (PacketVersion1 == NULL)
+        goto fail2;
+
+    PacketVersion1->Info = InfoVersion1;
+    PacketVersion1->Offset = Offset;
+    PacketVersion1->Length = Length;
+    PacketVersion1->Flags = Flags;
+    PacketVersion1->MaximumSegmentSize = MaximumSegmentSize;
+    PacketVersion1->Cookie = Cookie;
+    PacketVersion1->Mdl = *Mdl;
+    PacketVersion1->__Pfn = MmGetMdlPfnArray(Mdl)[0];
+
+    Frontend = Receiver->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+
+    InitializeListHead(&List);
+
+    InsertTailList(&List, &PacketVersion1->ListEntry);
+
+    VifReceiverQueuePacketsVersion1(Context, &List);
+    ASSERT(IsListEmpty(&List));
+
+    return;
+
+fail2:
+    Error("fail2\n");
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    ReceiverReturnPacket(Receiver, Cookie);
+}
+
 static DECLSPEC_NOINLINE VOID
 ReceiverRingAcquireLock(
     IN  PXENVIF_RECEIVER_RING   Ring
@@ -1393,12 +1461,18 @@ __ReceiverRingReleaseLock(
     )
 {
     PXENVIF_RECEIVER            Receiver;
+    PXENVIF_FRONTEND            Frontend;
+    PXENVIF_VIF_CONTEXT         Context;
+    ULONG                       Version;
     LIST_ENTRY                  List;
     ULONG                       Count;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
 
     Receiver = Ring->Receiver;
+    Frontend = Receiver->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+    Version = VifGetVersion(Context);
 
     InitializeListHead(&List);
     Count = 0;
@@ -1415,13 +1489,39 @@ __ReceiverRingReleaseLock(
 #pragma prefast(disable:26110)
     KeReleaseSpinLockFromDpcLevel(&Ring->Lock);
 
-    if (!IsListEmpty(&List)) {
-        PXENVIF_FRONTEND    Frontend;
+    while (!IsListEmpty(&List)) {
+        PLIST_ENTRY             ListEntry;
+        PXENVIF_RECEIVER_PACKET Packet;
 
-        Frontend = Receiver->Frontend;
+        ListEntry = RemoveHeadList(&List);
+        ASSERT3P(ListEntry, !=, &List);
 
-        VifReceiverQueuePackets(PdoGetVifContext(FrontendGetPdo(Frontend)),
-                                &List);
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        Packet = CONTAINING_RECORD(ListEntry,
+                                   XENVIF_RECEIVER_PACKET,
+                                   ListEntry);
+
+        if (Version < 4)
+            __ReceiverQueuePacketVersion1(Receiver,
+                                          &Packet->Mdl,
+                                          Packet->Offset,
+                                          Packet->Length,
+                                          Packet->Flags,
+                                          Packet->MaximumSegmentSize,
+                                          Packet->TagControlInformation,
+                                          &Packet->Info,
+                                          Packet);
+        else
+            VifReceiverQueuePacket(Context,
+                                   &Packet->Mdl,
+                                   Packet->Offset,
+                                   Packet->Length,
+                                   Packet->Flags,
+                                   Packet->MaximumSegmentSize,
+                                   Packet->TagControlInformation,
+                                   &Packet->Info,
+                                   Packet);
     }
 
     ASSERT(IsListEmpty(&List));
@@ -1902,7 +2002,6 @@ ReceiverRingPoll(
 
             if (~rsp->flags & NETRXF_more_data) {  // EOP
                 ASSERT(Packet != NULL);
-                ASSERT3P(Packet->Cookie, ==, NULL);
 
                 if (Error) {
                     FrontendIncrementStatistic(Frontend,
@@ -1916,7 +2015,7 @@ ReceiverRingPoll(
                         Packet->MaximumSegmentSize = MaximumSegmentSize;
                     }
 
-                    Packet->Cookie = (PVOID)(flags & (NETRXF_csum_blank | NETRXF_data_validated));
+                    Packet->Flags.Value = flags & (NETRXF_csum_blank | NETRXF_data_validated);
 
                     ASSERT(IsZeroMemory(&Packet->ListEntry, sizeof (LIST_ENTRY)));
                     InsertTailList(&Ring->PacketList, &Packet->ListEntry);
@@ -3345,35 +3444,21 @@ ReceiverQueryRingSize(
 }
 
 VOID
-ReceiverReturnPackets(
+ReceiverReturnPacket(
     IN  PXENVIF_RECEIVER    Receiver,
-    IN  PLIST_ENTRY         List
+    IN  PVOID               Cookie
     )
 {
-    ULONG                   Count;
+    PXENVIF_RECEIVER_PACKET Packet = Cookie;
+    PXENVIF_RECEIVER_RING   Ring;
     LONG                    Loaned;
     LONG                    Returned;
 
-    Count = 0;
-    while (!IsListEmpty(List)) {
-        PLIST_ENTRY             ListEntry;
-        PXENVIF_RECEIVER_PACKET Packet;
-        PXENVIF_RECEIVER_RING   Ring;
-
-        ListEntry = RemoveHeadList(List);
-        ASSERT3P(ListEntry, !=, List);
-
-        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
-
-        Packet = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_PACKET, ListEntry);
-
-        Ring = Packet->Cookie;
+    Ring = Packet->Ring;
 
-        __ReceiverRingReturnPacket(Ring, Packet, FALSE);
-        Count++;
-    }
+    __ReceiverRingReturnPacket(Ring, Packet, FALSE);
 
-    Returned = __InterlockedAdd(&Receiver->Returned, Count);
+    Returned = InterlockedIncrement(&Receiver->Returned);
 
     // Make sure Loaned is not sampled before Returned
     KeMemoryBarrier();
@@ -3386,6 +3471,32 @@ ReceiverReturnPackets(
 }
 
 VOID
+ReceiverReturnPacketsVersion1(
+    IN  PXENVIF_RECEIVER    Receiver,
+    IN  PLIST_ENTRY         List
+    )
+{
+    while (!IsListEmpty(List)) {
+        PLIST_ENTRY                         ListEntry;
+        struct _XENVIF_RECEIVER_PACKET_V1   *PacketVersion1;
+
+        ListEntry = RemoveHeadList(List);
+        ASSERT3P(ListEntry, !=, List);
+
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        PacketVersion1 = CONTAINING_RECORD(ListEntry,
+                                           struct _XENVIF_RECEIVER_PACKET_V1,
+                                           ListEntry);
+
+        ReceiverReturnPacket(Receiver, PacketVersion1->Cookie);
+
+        __ReceiverFree(PacketVersion1->Info);
+        __ReceiverFree(PacketVersion1);
+    }
+}
+
+VOID
 ReceiverWaitForPackets(
     IN  PXENVIF_RECEIVER    Receiver
     )
diff --git a/src/xenvif/receiver.h b/src/xenvif/receiver.h
index e4ab7a7..042e1da 100644
--- a/src/xenvif/receiver.h
+++ b/src/xenvif/receiver.h
@@ -101,12 +101,18 @@ ReceiverSetBackfillSize(
     );
 
 extern VOID
-ReceiverReturnPackets(
+ReceiverReturnPacketsVersion1(
     IN  PXENVIF_RECEIVER    Receiver,
     IN  PLIST_ENTRY         List
     );
 
 extern VOID
+ReceiverReturnPacket(
+    IN  PXENVIF_RECEIVER    Receiver,
+    IN  PVOID               Cookie
+    );
+
+extern VOID
 ReceiverSend(
     IN  PXENVIF_RECEIVER    Receiver,
     IN  ULONG               Index
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index 35ec80a..75bf5fe 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -64,6 +64,24 @@
 
 #define MAXNAMELEN  128
 
+#define XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH    512
+
+typedef struct _XENVIF_TRANSMITTER_PACKET {
+    LIST_ENTRY                                  ListEntry;
+    PVOID                                       Cookie;
+    ULONG                                       Reference;
+    XENVIF_VIF_OFFLOAD_OPTIONS                  OffloadOptions;
+    USHORT                                      MaximumSegmentSize;
+    USHORT                                      TagControlInformation;
+    XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
+    PMDL                                        Mdl;
+    ULONG                                       Offset;
+    ULONG                                       Length;
+    PUCHAR                                      Header;
+    XENVIF_PACKET_INFO                          Info;
+    XENVIF_PACKET_PAYLOAD                       Payload;
+} XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
+
 typedef struct _XENVIF_TRANSMITTER_REQUEST_ARP_PARAMETERS {
     IPV4_ADDRESS    Address;
 } XENVIF_TRANSMITTER_REQUEST_ARP_PARAMETERS, *PXENVIF_TRANSMITTER_REQUEST_ARP_PARAMETERS;
@@ -139,10 +157,6 @@ typedef struct _XENVIF_TRANSMITTER_FRAGMENT {
 
 typedef struct _XENVIF_TRANSMITTER_STATE {
     PXENVIF_TRANSMITTER_PACKET          Packet;
-    XENVIF_TRANSMITTER_PACKET_SEND_INFO Send;
-    PUCHAR                              StartVa;
-    XENVIF_PACKET_INFO                  Info;
-    XENVIF_PACKET_PAYLOAD               Payload;
     LIST_ENTRY                          List;
     ULONG                               Count;
 } XENVIF_TRANSMITTER_STATE, *PXENVIF_TRANSMITTER_STATE;
@@ -252,24 +266,54 @@ TransmitterPacketReleaseLock(
 
 static NTSTATUS
 TransmitterPacketCtor(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
+    IN  PVOID                   Argument,
+    IN  PVOID                   Object
     )
 {
+    PXENVIF_TRANSMITTER_PACKET  Packet = Object;
+    PUCHAR                      Header;
+    NTSTATUS                    status;
+
     UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
+
+    ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_TRANSMITTER_PACKET)));
+
+    Header = __TransmitterAllocate(XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH);
+
+    status = STATUS_NO_MEMORY;
+    if (Header == NULL)
+        goto fail1;
+
+    Packet->Header = Header;
 
     return STATUS_SUCCESS;
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_TRANSMITTER_PACKET)));
+
+    return status;
 }
 
 static VOID
 TransmitterPacketDtor(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
+    IN  PVOID                   Argument,
+    IN  PVOID                   Object
     )
 {
+    PXENVIF_TRANSMITTER_PACKET  Packet = Object;
+    PUCHAR                      Header;
+
     UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
+
+    Header = Packet->Header;
+    Packet->Header = NULL;
+
+    ASSERT(IsZeroMemory(Header, XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH));
+    __TransmitterFree(Header);
+
+    ASSERT(IsZeroMemory(Packet, sizeof (XENVIF_TRANSMITTER_PACKET)));
 }
 
 static FORCEINLINE PXENVIF_TRANSMITTER_PACKET
@@ -289,7 +333,21 @@ __TransmitterPutPacket(
     IN  PXENVIF_TRANSMITTER_PACKET  Packet
     )
 {
-    RtlZeroMemory(Packet, sizeof(XENVIF_TRANSMITTER_PACKET));
+    ASSERT(IsZeroMemory(&Packet->ListEntry, sizeof (LIST_ENTRY)));
+    ASSERT3U(Packet->Reference, ==, 0);
+
+    Packet->Mdl = NULL;
+    Packet->Offset = 0;
+    Packet->Length = 0;
+    Packet->OffloadOptions.Value = 0;
+    Packet->MaximumSegmentSize = 0;
+    Packet->TagControlInformation = 0;
+    RtlZeroMemory(&Packet->Completion, sizeof (XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO));
+    Packet->Cookie = NULL;
+
+    RtlZeroMemory(Packet->Header, XENVIF_TRANSMITTER_MAXIMUM_HEADER_LENGTH);
+    RtlZeroMemory(&Packet->Info, sizeof (XENVIF_PACKET_INFO));
+    RtlZeroMemory(&Packet->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
 
     XENBUS_CACHE(Put,
                  &Transmitter->CacheInterface,
@@ -721,7 +779,7 @@ TransmitterRingDebugCallback(
 }
 
 static BOOLEAN
-TransmitterRingPullup(
+TransmitterPullup(
     IN      PVOID                   Argument,
     IN      PUCHAR                  DestinationVa,
     IN OUT  PXENVIF_PACKET_PAYLOAD  Payload,
@@ -800,10 +858,10 @@ __TransmitterRingCopyPayload(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = State->Payload;
+    Payload = Packet->Payload;
 
     ASSERT(Packet != NULL);
-    ASSERT3U(Packet->Value, ==, 1);
+    ASSERT3U(Packet->Reference, ==, 1);
 
     while (Payload.Length != 0) {
         PMDL        Mdl;
@@ -818,14 +876,14 @@ __TransmitterRingCopyPayload(
             goto fail1;
 
         Buffer->Context = Packet;
-        Packet->Value++;
+        Packet->Reference++;
 
         Mdl = Buffer->Mdl;
 
         Length = __min(Payload.Length, PAGE_SIZE);
 
         MdlMappedSystemVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
-        TransmitterRingPullup(Ring, MdlMappedSystemVa, &Payload, Length);
+        (VOID) TransmitterPullup(Transmitter, MdlMappedSystemVa, &Payload, Length);
 
         Mdl->ByteCount = Length;
 
@@ -884,14 +942,14 @@ fail2:
     ASSERT3P(Buffer->Context, ==, Packet);
     Buffer->Context = NULL;        
 
-    Packet->Value--;
+    --Packet->Reference;
 
     __TransmitterPutBuffer(Ring, Buffer);
 
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    while (Packet->Value != 1) {
+    while (Packet->Reference != 1) {
         PLIST_ENTRY         ListEntry;
 
         ASSERT(State->Count != 0);
@@ -927,7 +985,7 @@ fail1:
         ASSERT3P(Buffer->Context, ==, Packet);
         Buffer->Context = NULL;        
 
-        Packet->Value--;
+        --Packet->Reference;
 
         __TransmitterPutBuffer(Ring, Buffer);
     }
@@ -956,10 +1014,10 @@ __TransmitterRingGrantPayload(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = &State->Payload;
+    Payload = &Packet->Payload;
 
     ASSERT(Packet != NULL);
-    ASSERT3U(Packet->Value, ==, 1);
+    ASSERT3U(Packet->Reference, ==, 1);
 
     Mdl = Payload->Mdl;
     Offset = Payload->Offset;
@@ -988,7 +1046,7 @@ __TransmitterRingGrantPayload(
 
             Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_PACKET;
             Fragment->Context = Packet;
-            Packet->Value++;
+            Packet->Reference++;
 
             Pfn = MmGetMdlPfnArray(Mdl)[MdlOffset / PAGE_SIZE];
             PageOffset = MdlOffset & (PAGE_SIZE - 1);
@@ -1045,7 +1103,7 @@ fail2:
         Fragment->Context = NULL;
         Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_INVALID;
 
-        Packet->Value--;
+        --Packet->Reference;
 
         __TransmitterPutFragment(Ring, Fragment);
     }
@@ -1056,7 +1114,7 @@ fail1:
 
     ASSERT3P(Fragment, ==, NULL);
 
-    while (Packet->Value != 1) {
+    while (Packet->Reference != 1) {
         PLIST_ENTRY         ListEntry;
 
         ASSERT(State->Count != 0);
@@ -1083,7 +1141,7 @@ fail1:
         Fragment->Context = NULL;
         Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_INVALID;
 
-        Packet->Value--;
+        --Packet->Reference;
 
         __TransmitterPutFragment(Ring, Fragment);
     }
@@ -1117,10 +1175,11 @@ __TransmitterRingPrepareHeader(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = &State->Payload;
-    Info = &State->Info;
 
-    ASSERT3U(Packet->Value, ==, 0);
+    Payload = &Packet->Payload;
+    Info = &Packet->Info;
+
+    ASSERT3U(Packet->Reference, ==, 0);
 
     Buffer = __TransmitterGetBuffer(Ring);
 
@@ -1129,18 +1188,14 @@ __TransmitterRingPrepareHeader(
         goto fail1;
 
     Buffer->Context = Packet;
-    Packet->Value++;
+    Packet->Reference++;
 
     Mdl = Buffer->Mdl;
 
     StartVa = MmGetSystemAddressForMdlSafe(Mdl, NormalPagePriority);
     ASSERT(StartVa != NULL);
 
-    status = ParsePacket(StartVa, TransmitterRingPullup, Ring, Payload, Info);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    State->StartVa = StartVa;
+    RtlCopyMemory(StartVa, Packet->Header, Info->Length);
 
     Mdl->ByteCount = Info->Length;
 
@@ -1148,7 +1203,7 @@ __TransmitterRingPrepareHeader(
 
     status = STATUS_NO_MEMORY;
     if (Fragment == NULL)
-        goto fail3;
+        goto fail2;
 
     Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_BUFFER;
     Fragment->Context = Buffer;
@@ -1166,7 +1221,7 @@ __TransmitterRingPrepareHeader(
                            TRUE,
                            &Fragment->Entry);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail3;
 
     Fragment->Offset = 0;
     Fragment->Length = Mdl->ByteCount + Payload->Length;
@@ -1178,7 +1233,7 @@ __TransmitterRingPrepareHeader(
     ASSERT(Info->EthernetHeader.Length != 0);
     EthernetHeader = (PETHERNET_HEADER)(StartVa + Info->EthernetHeader.Offset);        
 
-    if (State->Send.OffloadOptions.OffloadTagManipulation) {
+    if (Packet->OffloadOptions.OffloadTagManipulation) {
         ULONG   Offset;
 
         Offset = FIELD_OFFSET(ETHERNET_TAGGED_HEADER, Tag);
@@ -1189,9 +1244,10 @@ __TransmitterRingPrepareHeader(
 
         // Insert the tag
         EthernetHeader->Tagged.Tag.ProtocolID = HTONS(ETHERTYPE_TPID);
-        EthernetHeader->Tagged.Tag.ControlInformation = HTONS(State->Send.TagControlInformation);
+        EthernetHeader->Tagged.Tag.ControlInformation = HTONS(Packet->TagControlInformation);
         ASSERT(ETHERNET_HEADER_IS_TAGGED(EthernetHeader));
 
+        Packet->Length += sizeof (ETHERNET_TAG);
         Mdl->ByteCount += sizeof (ETHERNET_TAG);
         Fragment->Length += sizeof (ETHERNET_TAG);
 
@@ -1215,7 +1271,7 @@ __TransmitterRingPrepareHeader(
             Info->TcpOptions.Offset += sizeof (ETHERNET_TAG);
     }
 
-    if (State->Send.OffloadOptions.OffloadIpVersion4LargePacket) {
+    if (Packet->OffloadOptions.OffloadIpVersion4LargePacket) {
         PIP_HEADER  IpHeader;
         PTCP_HEADER TcpHeader;
         ULONG       Length;
@@ -1242,20 +1298,20 @@ __TransmitterRingPrepareHeader(
         IpHeader->Version4.PacketLength = HTONS((USHORT)Length);
 
         // IP checksum calulcation must be offloaded for large packets
-        State->Send.OffloadOptions.OffloadIpVersion4HeaderChecksum = 1;
+        Packet->OffloadOptions.OffloadIpVersion4HeaderChecksum = 1;
 
         // TCP checksum calulcation must be offloaded for large packets
         TcpHeader->Checksum = ChecksumPseudoHeader(StartVa, Info);
-        State->Send.OffloadOptions.OffloadIpVersion4TcpChecksum = 1;
+        Packet->OffloadOptions.OffloadIpVersion4TcpChecksum = 1;
 
         // If the MSS is such that the payload would constitute only a single fragment then
         // we no longer need trate the packet as a large packet.
-        ASSERT3U(State->Send.MaximumSegmentSize, <=, Payload->Length);
-        if (State->Send.MaximumSegmentSize == Payload->Length)
-            State->Send.OffloadOptions.OffloadIpVersion4LargePacket = 0;
+        ASSERT3U(Packet->MaximumSegmentSize, <=, Payload->Length);
+        if (Packet->MaximumSegmentSize == Payload->Length)
+            Packet->OffloadOptions.OffloadIpVersion4LargePacket = 0;
     }
     
-    if (State->Send.OffloadOptions.OffloadIpVersion6LargePacket) {
+    if (Packet->OffloadOptions.OffloadIpVersion6LargePacket) {
         PIP_HEADER  IpHeader;
         PTCP_HEADER TcpHeader;
         ULONG       Length;
@@ -1282,29 +1338,29 @@ __TransmitterRingPrepareHeader(
 
         // TCP checksum calulcation must be offloaded for large packets
         TcpHeader->Checksum = ChecksumPseudoHeader(StartVa, Info);
-        State->Send.OffloadOptions.OffloadIpVersion6TcpChecksum = 1;
+        Packet->OffloadOptions.OffloadIpVersion6TcpChecksum = 1;
 
         // If the MSS is such that the payload would constitute only a single fragment then
         // we no longer need treat the packet as a large packet.
-        ASSERT3U(State->Send.MaximumSegmentSize, <=, Payload->Length);
-        if (State->Send.MaximumSegmentSize == Payload->Length)
-            State->Send.OffloadOptions.OffloadIpVersion6LargePacket = 0;
+        ASSERT3U(Packet->MaximumSegmentSize, <=, Payload->Length);
+        if (Packet->MaximumSegmentSize == Payload->Length)
+            Packet->OffloadOptions.OffloadIpVersion6LargePacket = 0;
     }
 
     // Non-GSO packets must not exceed MTU
-    if (!State->Send.OffloadOptions.OffloadIpVersion4LargePacket &&
-        !State->Send.OffloadOptions.OffloadIpVersion6LargePacket) {
+    if (!Packet->OffloadOptions.OffloadIpVersion4LargePacket &&
+        !Packet->OffloadOptions.OffloadIpVersion6LargePacket) {
         ULONG   MaximumFrameSize;
 
         MacQueryMaximumFrameSize(Mac, &MaximumFrameSize);
         
         if (Fragment->Length > MaximumFrameSize) {
             status = STATUS_INVALID_PARAMETER;
-            goto fail5;
+            goto fail4;
         }
     }
 
-    if (State->Send.OffloadOptions.OffloadIpVersion4HeaderChecksum) {
+    if (Packet->OffloadOptions.OffloadIpVersion4HeaderChecksum) {
         PIP_HEADER  IpHeader;
 
         ASSERT(Info->IpHeader.Length != 0);
@@ -1316,8 +1372,8 @@ __TransmitterRingPrepareHeader(
 
     return STATUS_SUCCESS;
 
-fail5:
-    Error("fail5\n");
+fail4:
+    Error("fail4\n");
 
     ASSERT(State->Count != 0);
     --State->Count;
@@ -1335,8 +1391,8 @@ fail5:
                          Fragment->Entry);
     Fragment->Entry = NULL;
 
-fail4:
-    Error("fail4\n");
+fail3:
+    Error("fail3\n");
 
     Fragment->Context = NULL;
     Fragment->Type = XENVIF_TRANSMITTER_FRAGMENT_TYPE_INVALID;
@@ -1346,15 +1402,10 @@ fail4:
 
     __TransmitterPutFragment(Ring, Fragment);
 
-fail3:
-    Error("fail3\n");
-
-    Mdl->ByteCount = 0;
-
 fail2:
     Error("fail2\n");
 
-    Packet->Value--;
+    --Packet->Reference;
     Buffer->Context = NULL;
 
     __TransmitterPutBuffer(Ring, Buffer);
@@ -1362,7 +1413,7 @@ fail2:
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    ASSERT3U(Packet->Value, ==, 0);
+    ASSERT3U(Packet->Reference, ==, 0);
 
     return status;
 }
@@ -1461,7 +1512,7 @@ __TransmitterRingUnprepareFragments(
         }
 
         if (Packet != NULL)
-            Packet->Value--;
+            --Packet->Reference;
 
         __TransmitterPutFragment(Ring, Fragment);
     }
@@ -1478,11 +1529,6 @@ __TransmitterRingUnprepareFragments(
     if (Packet != NULL) {
         Ring->PacketsUnprepared++;
 
-        RtlZeroMemory(&State->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
-
-        Packet->Send = State->Send;
-        RtlZeroMemory(&State->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
-
         State->Packet = NULL;
     }
 
@@ -1493,8 +1539,8 @@ __TransmitterRingUnprepareFragments(
 
 static FORCEINLINE NTSTATUS
 __TransmitterRingPreparePacket(
-    IN  PXENVIF_TRANSMITTER_RING        Ring,
-    IN  PXENVIF_TRANSMITTER_PACKET      Packet
+    IN  PXENVIF_TRANSMITTER_RING    Ring,
+    IN  PXENVIF_TRANSMITTER_PACKET  Packet
     )
 {
     PXENVIF_TRANSMITTER             Transmitter;
@@ -1511,14 +1557,6 @@ __TransmitterRingPreparePacket(
 
     State->Packet = Packet;
 
-    State->Send = Packet->Send;
-    RtlZeroMemory(&Packet->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
-
-    Payload = &State->Payload;
-    Payload->Mdl = Packet->Mdl;
-    Payload->Offset = Packet->Offset;
-    Payload->Length = Packet->Length;
-
     InitializeListHead(&State->List);
     ASSERT3U(State->Count, ==, 0);
 
@@ -1526,9 +1564,10 @@ __TransmitterRingPreparePacket(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    ASSERT3U(State->Count, ==, Packet->Value);
+    ASSERT3U(State->Count, ==, Packet->Reference);
 
-    Info = &State->Info;
+    Info = &Packet->Info;
+    Payload = &Packet->Payload;
 
     // Is the packet too short?
     if (Info->Length + Payload->Length < ETHERNET_MIN) {
@@ -1584,7 +1623,7 @@ __TransmitterRingPreparePacket(
 
         if (Transmitter->AlwaysCopy != 0 ||
             (!NT_SUCCESS(status) && status == STATUS_BUFFER_OVERFLOW)) {
-            ASSERT3U(State->Count, ==, Packet->Value);
+            ASSERT3U(State->Count, ==, Packet->Reference);
 
             status = __TransmitterRingCopyPayload(Ring);
         }
@@ -1593,7 +1632,7 @@ __TransmitterRingPreparePacket(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    ASSERT3U(State->Count, ==, Packet->Value);
+    ASSERT3U(State->Count, ==, Packet->Reference);
 
     Ring->PacketsPrepared++;
     return STATUS_SUCCESS;
@@ -1606,17 +1645,9 @@ fail2:
 fail1:
     Error("fail1 (%08x)\n", status);
 
-    State->StartVa = NULL;
-    RtlZeroMemory(&State->Info, sizeof (XENVIF_PACKET_INFO));
-
     ASSERT(IsListEmpty(&State->List));
     RtlZeroMemory(&State->List, sizeof (LIST_ENTRY));
 
-    RtlZeroMemory(&State->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
-
-    Packet->Send = State->Send;
-    RtlZeroMemory(&State->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
-
     State->Packet = NULL;
 
     ASSERT(IsZeroMemory(&Ring->State, sizeof (XENVIF_TRANSMITTER_STATE)));
@@ -2002,11 +2033,10 @@ __TransmitterRingPostFragments(
     PXENVIF_FRONTEND                Frontend;
     PXENVIF_TRANSMITTER_STATE       State;
     PXENVIF_TRANSMITTER_PACKET      Packet;
-    PXENVIF_PACKET_PAYLOAD          Payload;
+    XENVIF_VIF_OFFLOAD_OPTIONS      OffloadOptions;
     RING_IDX                        req_prod;
     RING_IDX                        rsp_cons;
     ULONG                           Extra;
-    ULONG                           PacketLength;
     BOOLEAN                         FirstRequest;
     PLIST_ENTRY                     ListEntry;
     PXENVIF_TRANSMITTER_FRAGMENT    Fragment;
@@ -2018,12 +2048,15 @@ __TransmitterRingPostFragments(
 
     State = &Ring->State;
     Packet = State->Packet;
-    Payload = &State->Payload;
+
+    if (Packet != NULL)
+        OffloadOptions = Packet->OffloadOptions;
+    else
+        OffloadOptions.Value = 0;
 
     ASSERT(!IsListEmpty(&State->List));
     ASSERT(State->Count != 0);
     ASSERT3U(State->Count, <=, XEN_NETIF_NR_SLOTS_MIN);
-    ASSERT(IMPLY(Packet != NULL, State->Count == Packet->Value));
 
     req_prod = Ring->Front.req_prod_pvt;
     rsp_cons = Ring->Front.rsp_cons;
@@ -2033,8 +2066,8 @@ __TransmitterRingPostFragments(
                                  XENVIF_TRANSMITTER_FRAGMENT,
                                  ListEntry);
 
-    Extra = (State->Send.OffloadOptions.OffloadIpVersion4LargePacket ||
-             State->Send.OffloadOptions.OffloadIpVersion6LargePacket ||
+    Extra = (OffloadOptions.OffloadIpVersion4LargePacket ||
+             OffloadOptions.OffloadIpVersion6LargePacket ||
              Fragment->Type == XENVIF_TRANSMITTER_FRAGMENT_TYPE_MULTICAST_CONTROL) ?
             1 :
             0;
@@ -2048,7 +2081,6 @@ __TransmitterRingPostFragments(
     req = NULL;
 
     FirstRequest = TRUE;
-    PacketLength = 0;
     while (State->Count != 0) {
         --State->Count;
 
@@ -2078,14 +2110,14 @@ __TransmitterRingPostFragments(
         if (FirstRequest) {
             FirstRequest = FALSE;
 
-            if (State->Send.OffloadOptions.OffloadIpVersion4TcpChecksum ||
-                State->Send.OffloadOptions.OffloadIpVersion4UdpChecksum ||
-                State->Send.OffloadOptions.OffloadIpVersion6TcpChecksum ||
-                State->Send.OffloadOptions.OffloadIpVersion6UdpChecksum)
+            if (OffloadOptions.OffloadIpVersion4TcpChecksum ||
+                OffloadOptions.OffloadIpVersion4UdpChecksum ||
+                OffloadOptions.OffloadIpVersion6TcpChecksum ||
+                OffloadOptions.OffloadIpVersion6UdpChecksum)
                 req->flags |= NETTXF_csum_blank | NETTXF_data_validated;
 
-            if (State->Send.OffloadOptions.OffloadIpVersion4LargePacket ||
-                State->Send.OffloadOptions.OffloadIpVersion6LargePacket ||
+            if (OffloadOptions.OffloadIpVersion4LargePacket ||
+                OffloadOptions.OffloadIpVersion6LargePacket ||
                 Fragment->Type == XENVIF_TRANSMITTER_FRAGMENT_TYPE_MULTICAST_CONTROL) {
                 struct netif_extra_info *extra;
 
@@ -2096,17 +2128,17 @@ __TransmitterRingPostFragments(
                 req_prod++;
                 Ring->RequestsPosted++;
 
-                if (State->Send.OffloadOptions.OffloadIpVersion4LargePacket ||
-                    State->Send.OffloadOptions.OffloadIpVersion6LargePacket) {
-                    ASSERT(State->Send.MaximumSegmentSize != 0);
+                if (OffloadOptions.OffloadIpVersion4LargePacket ||
+                    OffloadOptions.OffloadIpVersion6LargePacket) {
+                    ASSERT(Packet->MaximumSegmentSize != 0);
 
                     extra->type = XEN_NETIF_EXTRA_TYPE_GSO;
                     extra->flags = 0;
 
-                    extra->u.gso.type = (State->Send.OffloadOptions.OffloadIpVersion4LargePacket) ?
+                    extra->u.gso.type = (OffloadOptions.OffloadIpVersion4LargePacket) ?
                                         XEN_NETIF_GSO_TYPE_TCPV4 :
-                                        XEN_NETIF_GSO_TYPE_TCPV6;;
-                    extra->u.gso.size = State->Send.MaximumSegmentSize;
+                                        XEN_NETIF_GSO_TYPE_TCPV6;
+                    extra->u.gso.size = Packet->MaximumSegmentSize;
                     extra->u.gso.pad = 0;
                     extra->u.gso.features = 0;
 
@@ -2129,9 +2161,6 @@ __TransmitterRingPostFragments(
 
                 req->flags |= NETTXF_extra_info;
             }
-
-            // The first fragment length is the length of the entire packet
-            PacketLength = Fragment->Length;
         }
 
         // Store a copy of the request in case we need to fake a response ourselves
@@ -2151,14 +2180,14 @@ __TransmitterRingPostFragments(
 
     // Set the initial completion information
     if (Packet != NULL) {
-        PUCHAR              StartVa;
-        PXENVIF_PACKET_INFO Info;
-        PETHERNET_HEADER    Header;
+        PUCHAR                  StartVa;
+        PXENVIF_PACKET_INFO     Info;
+        PXENVIF_PACKET_PAYLOAD  Payload;
+        PETHERNET_HEADER        Header;
 
-        ASSERT(PacketLength != 0);
-
-        StartVa = State->StartVa;
-        Info = &State->Info;
+        StartVa = Packet->Header;
+        Info = &Packet->Info;
+        Payload = &Packet->Payload;
 
         ASSERT(IsZeroMemory(&Packet->Completion, sizeof (XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO)));
 
@@ -2166,14 +2195,9 @@ __TransmitterRingPostFragments(
         Header = (PETHERNET_HEADER)(StartVa + Info->EthernetHeader.Offset);
 
         Packet->Completion.Type = GET_ETHERNET_ADDRESS_TYPE(&Header->Untagged.DestinationAddress);
-        Packet->Completion.Status = XENVIF_TRANSMITTER_PACKET_PENDING;
-        Packet->Completion.PacketLength = (USHORT)PacketLength;
+        Packet->Completion.PacketLength = (USHORT)Packet->Length;
         Packet->Completion.PayloadLength = (USHORT)Payload->Length;
 
-        State->StartVa = NULL;
-        RtlZeroMemory(&State->Info, sizeof (XENVIF_PACKET_INFO));
-        RtlZeroMemory(&State->Payload, sizeof (XENVIF_PACKET_PAYLOAD));
-        RtlZeroMemory(&State->Send, sizeof (XENVIF_TRANSMITTER_PACKET_SEND_INFO));
         State->Packet = NULL;
 
         Ring->PacketsSent++;
@@ -2268,7 +2292,7 @@ __TransmitterRingCompletePacket(
     Transmitter = Ring->Transmitter;
     Frontend = Transmitter->Frontend;
 
-    ASSERT(Packet->Completion.Status != XENVIF_TRANSMITTER_PACKET_PENDING);
+    ASSERT(Packet->Completion.Status != 0);
 
     if (Packet->Completion.Status != XENVIF_TRANSMITTER_PACKET_OK) {
         FrontendIncrementStatistic(Frontend,
@@ -2447,10 +2471,10 @@ TransmitterRingPoll(
                 continue;
             }
 
-            Packet->Value--;
+            --Packet->Reference;
 
             if (rsp->status != NETIF_RSP_OKAY &&
-                Packet->Completion.Status == XENVIF_TRANSMITTER_PACKET_PENDING) {
+                Packet->Completion.Status == 0) {
                 switch (rsp->status) {
                 case NETIF_RSP_DROPPED:
                     Packet->Completion.Status = XENVIF_TRANSMITTER_PACKET_DROPPED;
@@ -2468,10 +2492,10 @@ TransmitterRingPoll(
 
             RtlZeroMemory(rsp, sizeof (netif_tx_response_t));
 
-            if (Packet->Value != 0)
+            if (Packet->Reference != 0)
                 continue;
 
-            if (Packet->Completion.Status == XENVIF_TRANSMITTER_PACKET_PENDING)
+            if (Packet->Completion.Status == 0)
                 Packet->Completion.Status = XENVIF_TRANSMITTER_PACKET_OK;
 
             __TransmitterRingCompletePacket(Ring, Packet);
@@ -2589,11 +2613,12 @@ TransmitterRingSwizzle(
         ListEntry = NextEntry;
     }
 
-    ListEntry = List.Flink;
     if (!IsListEmpty(&List)) {
+        ListEntry = List.Flink;
+
         RemoveEntryList(&List);
-        InitializeListHead(&List);
         AppendTailList(&Ring->PacketQueue, ListEntry);
+
         Ring->PacketsQueued += Count;
     }
 }
@@ -2632,6 +2657,8 @@ TransmitterRingSchedule(
             PXENVIF_TRANSMITTER_REQUEST Request;
 
             ListEntry = RemoveHeadList(&Ring->RequestQueue);
+            ASSERT3P(ListEntry, !=, &Ring->RequestQueue);
+
             RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
             Request = CONTAINING_RECORD(ListEntry,
@@ -2669,13 +2696,15 @@ TransmitterRingSchedule(
             PXENVIF_TRANSMITTER_PACKET  Packet;
 
             ListEntry = RemoveHeadList(&Ring->PacketQueue);
+            ASSERT3P(ListEntry, !=, &Ring->PacketQueue);
+
             RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
 
             Packet = CONTAINING_RECORD(ListEntry,
                                        XENVIF_TRANSMITTER_PACKET,
                                        ListEntry);
 
-            Packet->Value = 0;
+            Packet->Reference = 0;
 
             status = __TransmitterRingPreparePacket(Ring, Packet);
             if (!NT_SUCCESS(status)) {
@@ -2712,20 +2741,70 @@ TransmitterRingSchedule(
 }
 
 static FORCEINLINE VOID
+__TransmitterReturnPacketVersion2(
+    IN  PXENVIF_TRANSMITTER                         Transmitter,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
+    )
+{
+    struct _XENVIF_TRANSMITTER_PACKET_V2            *PacketVersion2;
+    PXENVIF_FRONTEND                                Frontend;
+    PXENVIF_VIF_CONTEXT                             Context;
+    LIST_ENTRY                                      List;
+
+    PacketVersion2 = Cookie;
+    PacketVersion2->Completion = *Completion;
+
+    Frontend = Transmitter->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+
+    InitializeListHead(&List);
+
+    ASSERT(IsZeroMemory(&PacketVersion2->ListEntry, sizeof (LIST_ENTRY)));
+    InsertTailList(&List, &PacketVersion2->ListEntry);
+
+    VifTransmitterReturnPacketsVersion2(Context, &List);
+    ASSERT(IsListEmpty(&List));
+}
+
+static FORCEINLINE VOID
 __TransmitterReturnPackets(
     IN  PXENVIF_TRANSMITTER Transmitter,
     IN  PLIST_ENTRY         List
     )
 {
     PXENVIF_FRONTEND        Frontend;
-
-    if (IsListEmpty(List))
-        return;
+    PXENVIF_VIF_CONTEXT     Context;
+    ULONG                   Version;
 
     Frontend = Transmitter->Frontend;
+    Context = PdoGetVifContext(FrontendGetPdo(Frontend));
+    Version = VifGetVersion(Context);
+
+    while (!IsListEmpty(List)) {
+        PLIST_ENTRY                 ListEntry;
+        PXENVIF_TRANSMITTER_PACKET  Packet;
 
-    VifTransmitterReturnPackets(PdoGetVifContext(FrontendGetPdo(Frontend)),
-                                List);
+        ListEntry = RemoveHeadList(List);
+        ASSERT3P(ListEntry, !=, List);
+
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        Packet = CONTAINING_RECORD(ListEntry,
+                                   XENVIF_TRANSMITTER_PACKET,
+                                   ListEntry);
+
+        if  (Version < 4)
+            __TransmitterReturnPacketVersion2(Transmitter,
+                                              Packet->Cookie,
+                                              &Packet->Completion);
+        else
+            VifTransmitterReturnPacket(Context,
+                                       Packet->Cookie,
+                                       &Packet->Completion);
+
+        __TransmitterPutPacket(Transmitter, Packet);
+    }
 }
 
 static FORCEINLINE BOOLEAN
@@ -2837,13 +2916,12 @@ __TransmitterRingReleaseLock(
     // thread could be simuntaneously adding to the list.
 
     do {
-        PLIST_ENTRY     ListEntry;
-
         TransmitterRingSwizzle(Ring);
         TransmitterRingSchedule(Ring);
 
-        ListEntry = Ring->PacketComplete.Flink;
         if (!IsListEmpty(&Ring->PacketComplete)) {
+            PLIST_ENTRY     ListEntry = Ring->PacketComplete.Flink;
+
             RemoveEntryList(&Ring->PacketComplete);
             InitializeListHead(&Ring->PacketComplete);
             AppendTailList(&List, ListEntry);
@@ -3752,21 +3830,24 @@ __TransmitterRingTeardown(
 }
 
 static FORCEINLINE VOID
-__TransmitterRingQueuePackets(
+__TransmitterRingQueuePacket(
     IN  PXENVIF_TRANSMITTER_RING    Ring,
-    IN  PLIST_ENTRY                 List
+    IN  PXENVIF_TRANSMITTER_PACKET  Packet
     )
 {
+    PLIST_ENTRY                     ListEntry;
     ULONG_PTR                       Old;
     ULONG_PTR                       LockBit;
     ULONG_PTR                       New;
 
+    ListEntry = &Packet->ListEntry;
+
     do {
         Old = (ULONG_PTR)Ring->Lock;
         LockBit = Old & XENVIF_TRANSMITTER_LOCK_BIT;
 
-        List->Flink->Blink = (PVOID)(Old & ~XENVIF_TRANSMITTER_LOCK_BIT);
-        New = (ULONG_PTR)List->Blink;
+        ListEntry->Blink = (PVOID)(Old & ~XENVIF_TRANSMITTER_LOCK_BIT);
+        New = (ULONG_PTR)ListEntry;
         ASSERT((New & XENVIF_TRANSMITTER_LOCK_BIT) == 0);
         New |= LockBit;
     } while ((ULONG_PTR)InterlockedCompareExchangePointer(&Ring->Lock, (PVOID)New, (PVOID)Old) != Old);
@@ -4485,7 +4566,7 @@ TransmitterTeardown(
 }
 
 static BOOLEAN
-__TransmitterGetPacketHeadersPullup(
+TransmitterGetPacketHeadersVersion2Pullup(
     IN      PVOID                   Argument,
     IN      PUCHAR                  DestinationVa,
     IN OUT  PXENVIF_PACKET_PAYLOAD  Payload,
@@ -4546,22 +4627,22 @@ fail1:
 }
 
 NTSTATUS
-TransmitterGetPacketHeaders(
-    IN  PXENVIF_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+TransmitterGetPacketHeadersVersion2(
+    IN  PXENVIF_TRANSMITTER                     Transmitter,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *PacketVersion2,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     )
 {
-    XENVIF_PACKET_PAYLOAD           Payload;
-    NTSTATUS                        status;
+    XENVIF_PACKET_PAYLOAD                       Payload;
+    NTSTATUS                                    status;
 
-    Payload.Mdl = Packet->Mdl;
-    Payload.Offset = Packet->Offset;
-    Payload.Length = Packet->Length;
+    Payload.Mdl = PacketVersion2->Mdl;
+    Payload.Offset = PacketVersion2->Offset;
+    Payload.Length = PacketVersion2->Length;
 
     status = ParsePacket(Headers,
-                         __TransmitterGetPacketHeadersPullup,
+                         TransmitterGetPacketHeadersVersion2Pullup,
                          Transmitter,
                          &Payload,
                          Info);
@@ -4574,70 +4655,241 @@ fail1:
     return status;
 }
 
-VOID
-TransmitterQueuePackets(
-    IN  PXENVIF_TRANSMITTER     Transmitter,
-    IN  PLIST_ENTRY             List
+static FORCEINLINE VOID
+__TransmitterHashAccumulate(
+    IN OUT  PULONG  Accumulator,
+    IN      PUCHAR  Array,
+    IN      ULONG   Length
     )
 {
-    PXENVIF_TRANSMITTER_RING    Ring;
-    PXENVIF_FRONTEND            Frontend;
-    LONG                        NumQueues;
+    ULONG           Current;
+    ULONG           Index;
 
-    Frontend = Transmitter->Frontend;
-    NumQueues = FrontendGetNumQueues(Frontend);
+    Current = *Accumulator;
+
+    for (Index = 0; Index < Length; Index++) {
+        ULONG   Overflow;
+
+        Current = (Current << 4) + Array[Index];
+
+        Overflow = Current & 0x000fff00;
+        if (Overflow != 0) {
+            Current ^= Overflow >> 8;
+            Current ^= Overflow;
+        }
+    }
+
+    *Accumulator = Current;
+}
+
+static FORCEINLINE ULONG
+__TransmitterHashPacket(
+    IN  PXENVIF_TRANSMITTER_PACKET  Packet
+    )
+{
+    PUCHAR                          StartVa;
+    PXENVIF_PACKET_INFO             Info;
+    PIP_HEADER                      IpHeader;
+    ULONG                           Value;
+
+    Value = 0;
+
+    StartVa = Packet->Header;
+    Info = &Packet->Info;
+
+    if (Info->TcpHeader.Length == 0 && Info->UdpHeader.Length == 0)
+        goto done;
+
+    ASSERT(Info->IpHeader.Length != 0);
+    IpHeader = (PIP_HEADER)(StartVa + Info->IpHeader.Offset);
 
-    if (NumQueues == 1) {
-        Ring = Transmitter->Ring[0];
+    if (IpHeader->Version == 4) {
+        PIPV4_HEADER    Version4 = &IpHeader->Version4;
 
-        __TransmitterRingQueuePackets(Ring, List);
+        __TransmitterHashAccumulate(&Value,
+                                    Version4->SourceAddress.Byte,
+                                    IPV4_ADDRESS_LENGTH);
+        __TransmitterHashAccumulate(&Value,
+                                    Version4->DestinationAddress.Byte,
+                                    IPV4_ADDRESS_LENGTH);
     } else {
-        while (!IsListEmpty(List)) {
-            PXENVIF_TRANSMITTER_PACKET  Packet;
-            LIST_ENTRY                  HashList;
-            ULONG                       Index;
+        PIPV6_HEADER    Version6 = &IpHeader->Version6;
 
-            InitializeListHead(&HashList);
-            Index = 0;
+        ASSERT3U(IpHeader->Version, ==, 6);
 
-            while (!IsListEmpty(List)) {
-                PLIST_ENTRY ListEntry;
-                ULONG       Hash;
+        __TransmitterHashAccumulate(&Value,
+                                    Version6->SourceAddress.Byte,
+                                    IPV6_ADDRESS_LENGTH);
+        __TransmitterHashAccumulate(&Value,
+                                    Version6->DestinationAddress.Byte,
+                                    IPV6_ADDRESS_LENGTH);
+    }
 
-                ListEntry = RemoveHeadList(List);
-                ASSERT3P(ListEntry, !=, List);
+    if (Info->TcpHeader.Length != 0) {
+        PTCP_HEADER TcpHeader;
 
-                RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+        TcpHeader = (PTCP_HEADER)(StartVa + Info->TcpHeader.Offset);
 
-                Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&TcpHeader->SourcePort,
+                                    sizeof (USHORT));
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&TcpHeader->DestinationPort,
+                                    sizeof (USHORT));
+    } else {
+        PUDP_HEADER UdpHeader;
 
-                Hash = Packet->Value % NumQueues;
-                if (Hash != Index) {
-                    if (!IsListEmpty(&HashList)) {
-                        Ring = Transmitter->Ring[Index];
-                        ASSERT3P(Ring, !=, NULL);
+        ASSERT(Info->UdpHeader.Length != 0);
 
-                        __TransmitterRingQueuePackets(Ring, &HashList);
-                        InitializeListHead(&HashList);
-                    }
+        UdpHeader = (PUDP_HEADER)(StartVa + Info->UdpHeader.Offset);
 
-                    Index = Hash;
-                }
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&UdpHeader->SourcePort,
+                                    sizeof (USHORT));
+        __TransmitterHashAccumulate(&Value,
+                                    (PUCHAR)&UdpHeader->DestinationPort,
+                                    sizeof (USHORT));
+    }
 
-                InsertTailList(&HashList, ListEntry);
-            }
+done:
+    return Value;
+}
+
+NTSTATUS
+TransmitterQueuePacket(
+    IN  PXENVIF_TRANSMITTER         Transmitter,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    )
+{
+    PXENVIF_FRONTEND                Frontend;
+    PXENVIF_TRANSMITTER_PACKET      Packet;
+    PUCHAR                          StartVa;
+    PXENVIF_PACKET_PAYLOAD          Payload;
+    PXENVIF_PACKET_INFO             Info;
+    ULONG                           Index;
+    PXENVIF_TRANSMITTER_RING        Ring;
+    NTSTATUS                        status;
 
-            if (!IsListEmpty(&HashList)) {
-                Ring = Transmitter->Ring[Index];
-                ASSERT3P(Ring, !=, NULL);
+    Frontend = Transmitter->Frontend;
 
-                __TransmitterRingQueuePackets(Ring, &HashList);
-                InitializeListHead(&HashList);
-            }
+    Packet = __TransmitterGetPacket(Transmitter);
 
-            ASSERT(IsListEmpty(&HashList));
-        }
+    status = STATUS_NO_MEMORY;
+    if (Packet == NULL)
+        goto fail1;
+
+    Packet->Mdl = Mdl;
+    Packet->Offset = Offset;
+    Packet->Length = Length;
+    Packet->OffloadOptions = OffloadOptions;
+    Packet->MaximumSegmentSize = MaximumSegmentSize;
+    Packet->TagControlInformation = TagControlInformation;
+    Packet->Cookie = Cookie;
+
+    StartVa = Packet->Header;
+
+    Payload = &Packet->Payload;
+    Payload->Mdl = Packet->Mdl;
+    Payload->Offset = Packet->Offset;
+    Payload->Length = Packet->Length;
+
+    Info = &Packet->Info;
+
+    status = ParsePacket(StartVa, TransmitterPullup, Transmitter, Payload, Info);
+    if (!NT_SUCCESS(status))
+        goto fail2;
+
+    switch (Hash->Algorithm) {
+    case XENVIF_PACKET_HASH_ALGORITHM_NONE:
+        Index = __TransmitterHashPacket(Packet);
+        break;
+
+    case XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED:
+        Index = Hash->Value;
+        break;
+
+    default:
+        ASSERT(FALSE);
+        Index = 0;
+        break;
+    }
+
+    Index %= FrontendGetNumQueues(Frontend);
+    Ring = Transmitter->Ring[Index];
+
+    __TransmitterRingQueuePacket(Ring, Packet);
+
+    return STATUS_SUCCESS;
+
+fail2:
+    Error("fail2\n");
+
+    __TransmitterPutPacket(Transmitter, Packet);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return status;
+}
+
+NTSTATUS
+TransmitterQueuePacketsVersion2(
+    IN  PXENVIF_TRANSMITTER     Transmitter,
+    IN  PLIST_ENTRY             List
+    )
+{
+    LIST_ENTRY                  Reject;
+
+    InitializeListHead(&Reject);
+
+    while (!IsListEmpty(List)) {
+        PLIST_ENTRY                             ListEntry;
+        struct _XENVIF_TRANSMITTER_PACKET_V2    *PacketVersion2;
+        XENVIF_PACKET_HASH                      Hash;
+        NTSTATUS                                status;
+
+        ListEntry = RemoveHeadList(List);
+        ASSERT3P(ListEntry, !=, List);
+
+        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
+
+        PacketVersion2 = CONTAINING_RECORD(ListEntry,
+                                           struct _XENVIF_TRANSMITTER_PACKET_V2,
+                                           ListEntry);
+
+        Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED;
+        Hash.Value = PacketVersion2->Value;
+
+        status = TransmitterQueuePacket(Transmitter,
+                                        PacketVersion2->Mdl,
+                                        PacketVersion2->Offset,
+                                        PacketVersion2->Length,
+                                        PacketVersion2->Send.OffloadOptions,
+                                        PacketVersion2->Send.MaximumSegmentSize,
+                                        PacketVersion2->Send.TagControlInformation,
+                                        &Hash,
+                                        PacketVersion2);
+        if (!NT_SUCCESS(status))
+            InsertTailList(&Reject, &PacketVersion2->ListEntry);
+    }
+
+    ASSERT(IsListEmpty(List));
+
+    if (!IsListEmpty(&Reject)) {
+        PLIST_ENTRY ListEntry = Reject.Flink;
+
+        RemoveEntryList(&Reject);
+        AppendTailList(List, ListEntry);
     }
+
+    return (IsListEmpty(List)) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
 }
 
 VOID
diff --git a/src/xenvif/transmitter.h b/src/xenvif/transmitter.h
index 04f1f6e..0b7f654 100644
--- a/src/xenvif/transmitter.h
+++ b/src/xenvif/transmitter.h
@@ -115,8 +115,21 @@ TransmitterQueryRingSize(
     OUT PULONG              Size
     );
 
-extern VOID
-TransmitterQueuePackets(
+extern NTSTATUS
+TransmitterQueuePacket(
+    IN  PXENVIF_TRANSMITTER         Transmitter,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    );
+
+extern NTSTATUS
+TransmitterQueuePacketsVersion2(
     IN  PXENVIF_TRANSMITTER Transmitter,
     IN  PLIST_ENTRY         List
     );
@@ -135,11 +148,11 @@ TransmitterQueryLargePacketSize(
     );
 
 extern NTSTATUS
-TransmitterGetPacketHeaders(
-    IN  PXENVIF_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+TransmitterGetPacketHeadersVersion2(
+    IN  PXENVIF_TRANSMITTER                     Transmitter,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     );
 
 #endif  // _XENVIF_TRANSMITTER_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index ac4d454..76365d2 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -317,7 +317,7 @@ done:
 }
 
 static VOID
-VifReceiverReturnPackets( 
+VifReceiverReturnPacketsVersion1(
     IN  PINTERFACE      Interface,
     IN  PLIST_ENTRY     List
     )
@@ -326,30 +326,45 @@ VifReceiverReturnPackets(
 
     AcquireMrswLockShared(&Context->Lock);
 
-    ReceiverReturnPackets(FrontendGetReceiver(Context->Frontend),
-                          List);
+    ReceiverReturnPacketsVersion1(FrontendGetReceiver(Context->Frontend),
+                                  List);
+
+    ReleaseMrswLockShared(&Context->Lock);
+}
+
+static VOID
+VifReceiverReturnPacket(
+    IN  PINTERFACE      Interface,
+    IN  PVOID           Cookie
+    )
+{
+    PXENVIF_VIF_CONTEXT Context = Interface->Context;
+
+    AcquireMrswLockShared(&Context->Lock);
+
+    ReceiverReturnPacket(FrontendGetReceiver(Context->Frontend),
+                         Cookie);
 
     ReleaseMrswLockShared(&Context->Lock);
 }
 
 static NTSTATUS
-VifTransmitterGetPacketHeaders(
-    IN  PINTERFACE                      Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET      Packet,
-    OUT PVOID                           Headers,
-    OUT PXENVIF_PACKET_INFO             Info
+VifTransmitterGetPacketHeadersVersion2(
+    IN  PINTERFACE                              Interface,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     )
 {
-    PXENVIF_VIF_CONTEXT                 Context = Interface->Context;
-    NTSTATUS                            status;
+    PXENVIF_VIF_CONTEXT                         Context = Interface->Context;
+    NTSTATUS                                    status;
 
     AcquireMrswLockShared(&Context->Lock);
 
-    ASSERT3U(VifGetVersion(Context), >=, 2);
-    status = TransmitterGetPacketHeaders(FrontendGetTransmitter(Context->Frontend),
-                                         Packet,
-                                         Headers,
-                                         Info);
+    status = TransmitterGetPacketHeadersVersion2(FrontendGetTransmitter(Context->Frontend),
+                                                 Packet,
+                                                 Headers,
+                                                 Info);
 
     ReleaseMrswLockShared(&Context->Lock);
 
@@ -357,7 +372,7 @@ VifTransmitterGetPacketHeaders(
 }
 
 static NTSTATUS
-VifTransmitterQueuePackets(
+VifTransmitterQueuePacketsVersion2(
     IN  PINTERFACE      Interface,
     IN  PLIST_ENTRY     List
     )
@@ -369,20 +384,64 @@ VifTransmitterQueuePackets(
 
     status = STATUS_UNSUCCESSFUL;
     if (Context->Enabled == FALSE)
-        goto fail1;
+        goto done;
 
-    ASSERT3U(VifGetVersion(Context), >=, 2);
-    TransmitterQueuePackets(FrontendGetTransmitter(Context->Frontend),
-                            List);
+    status = TransmitterQueuePacketsVersion2(FrontendGetTransmitter(Context->Frontend),
+                                             List);
 
+done:
     ReleaseMrswLockShared(&Context->Lock);
 
-    return STATUS_SUCCESS;
+    return status;
+}
 
-fail1:
+static VOID
+VifTransmitterQueuePacket(
+    IN  PINTERFACE                  Interface,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
+    )
+{
+    PXENVIF_VIF_CONTEXT             Context = Interface->Context;
+    NTSTATUS                        status;
+
+    AcquireMrswLockShared(&Context->Lock);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (Context->Enabled == FALSE)
+        goto done;
+
+    ASSERT3U(VifGetVersion(Context), >=, 4);
+    status = TransmitterQueuePacket(FrontendGetTransmitter(Context->Frontend),
+                                    Mdl,
+                                    Offset,
+                                    Length,
+                                    OffloadOptions,
+                                    MaximumSegmentSize,
+                                    TagControlInformation,
+                                    Hash,
+                                    Cookie);
+
+done:
     ReleaseMrswLockShared(&Context->Lock);
 
-    return status;
+    if (!NT_SUCCESS(status)) {
+        XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
+
+        RtlZeroMemory(&Completion, sizeof (XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO));
+
+        Completion.Status = XENVIF_TRANSMITTER_PACKET_DROPPED;
+
+        VifTransmitterReturnPacket(Context,
+                                   Cookie,
+                                   &Completion);
+    }
 }
 
 static VOID
@@ -652,6 +711,7 @@ VifAcquire(
     Trace("====>\n");
 
     Context->Frontend = PdoGetFrontend(Context->Pdo);
+    Context->Version = Interface->Version;
 
     Trace("<====\n");
 
@@ -678,6 +738,7 @@ VifRelease(
 
     ASSERT(!Context->Enabled);
 
+    Context->Version = 0;
     Context->Frontend = NULL;
 
     Trace("<====\n");
@@ -693,11 +754,11 @@ static struct _XENVIF_VIF_INTERFACE_V2 VifInterfaceVersion2 = {
     VifEnable,
     VifDisable,
     VifQueryStatistic,
-    VifReceiverReturnPackets,
+    VifReceiverReturnPacketsVersion1,
     VifReceiverSetOffloadOptions,
     VifReceiverQueryRingSize,
-    VifTransmitterGetPacketHeaders,
-    VifTransmitterQueuePackets,
+    VifTransmitterGetPacketHeadersVersion2,
+    VifTransmitterQueuePacketsVersion2,
     VifTransmitterQueryOffloadOptions,
     VifTransmitterQueryLargePacketSize,
     VifTransmitterQueryRingSize,
@@ -718,12 +779,37 @@ static struct _XENVIF_VIF_INTERFACE_V3 VifInterfaceVersion3 = {
     VifEnable,
     VifDisable,
     VifQueryStatistic,
-    VifReceiverReturnPackets,
+    VifReceiverReturnPacketsVersion1,
     VifReceiverSetOffloadOptions,
     VifReceiverSetBackfillSize,
     VifReceiverQueryRingSize,
-    VifTransmitterGetPacketHeaders,
-    VifTransmitterQueuePackets,
+    VifTransmitterGetPacketHeadersVersion2,
+    VifTransmitterQueuePacketsVersion2,
+    VifTransmitterQueryOffloadOptions,
+    VifTransmitterQueryLargePacketSize,
+    VifTransmitterQueryRingSize,
+    VifMacQueryState,
+    VifMacQueryMaximumFrameSize,
+    VifMacQueryPermanentAddress,
+    VifMacQueryCurrentAddress,
+    VifMacQueryMulticastAddresses,
+    VifMacSetMulticastAddresses,
+    VifMacSetFilterLevel,
+    VifMacQueryFilterLevel
+};
+
+static struct _XENVIF_VIF_INTERFACE_V4 VifInterfaceVersion4 = {
+    { sizeof (struct _XENVIF_VIF_INTERFACE_V4), 4, NULL, NULL, NULL },
+    VifAcquire,
+    VifRelease,
+    VifEnable,
+    VifDisable,
+    VifQueryStatistic,
+    VifReceiverReturnPacket,
+    VifReceiverSetOffloadOptions,
+    VifReceiverSetBackfillSize,
+    VifReceiverQueryRingSize,
+    VifTransmitterQueuePacket,
     VifTransmitterQueryOffloadOptions,
     VifTransmitterQueryLargePacketSize,
     VifTransmitterQueryRingSize,
@@ -835,13 +921,28 @@ VifGetInterface(
         status = STATUS_SUCCESS;
         break;
     }
+    case 4: {
+        struct _XENVIF_VIF_INTERFACE_V4 *VifInterface;
+
+        VifInterface = (struct _XENVIF_VIF_INTERFACE_V4 *)Interface;
+
+        status = STATUS_BUFFER_OVERFLOW;
+        if (Size < sizeof (struct _XENVIF_VIF_INTERFACE_V4))
+            break;
+
+        *VifInterface = VifInterfaceVersion4;
+
+        ASSERT3U(Interface->Version, ==, Version);
+        Interface->Context = Context;
+
+        status = STATUS_SUCCESS;
+        break;
+    }
     default:
         status = STATUS_NOT_SUPPORTED;
         break;
     }
 
-    Context->Version = Version;
-
     return status;
 }   
 
@@ -873,18 +974,43 @@ VifTeardown(
 }
 
 VOID
-VifReceiverQueuePackets(
+VifReceiverQueuePacketsVersion1(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     )
 {
     Context->Callback(Context->Argument,
-                      XENVIF_RECEIVER_QUEUE_PACKETS,
+                      XENVIF_RECEIVER_QUEUE_PACKET,
                       List);
 }
 
 VOID
-VifTransmitterReturnPackets(
+VifReceiverQueuePacket(
+    IN  PXENVIF_VIF_CONTEXT             Context,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
+    )
+{
+    Context->Callback(Context->Argument,
+                      XENVIF_RECEIVER_QUEUE_PACKET,
+                      Mdl,
+                      Offset,
+                      Length,
+                      Flags,
+                      MaximumSegmentSize,
+                      TagControlInformation,
+                      Info,
+                      Cookie);
+}
+
+VOID
+VifTransmitterReturnPacketsVersion2(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     )
@@ -892,10 +1018,25 @@ VifTransmitterReturnPackets(
     ASSERT3U(VifGetVersion(Context), >=, 2);
 
     Context->Callback(Context->Argument,
-                      XENVIF_TRANSMITTER_RETURN_PACKETS,
+                      XENVIF_TRANSMITTER_RETURN_PACKET,
                       List);
 }
 
+VOID
+VifTransmitterReturnPacket(
+    IN  PXENVIF_VIF_CONTEXT                         Context,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
+    )
+{
+    ASSERT3U(VifGetVersion(Context), >=, 4);
+
+    Context->Callback(Context->Argument,
+                      XENVIF_TRANSMITTER_RETURN_PACKET,
+                      Cookie,
+                      Completion);
+}
+
 PXENVIF_THREAD
 VifGetMacThread(
     IN  PXENVIF_VIF_CONTEXT Context
diff --git a/src/xenvif/vif.h b/src/xenvif/vif.h
index a842b79..ebb4337 100644
--- a/src/xenvif/vif.h
+++ b/src/xenvif/vif.h
@@ -63,17 +63,37 @@ VifTeardown(
 // CALLBACKS
 
 extern VOID
-VifReceiverQueuePackets(
+VifReceiverQueuePacketsVersion1(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     );
 
 extern VOID
-VifTransmitterReturnPackets(
+VifReceiverQueuePacket(
+    IN  PXENVIF_VIF_CONTEXT             Context,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
+    );
+
+extern VOID
+VifTransmitterReturnPacketsVersion2(
     IN  PXENVIF_VIF_CONTEXT Context,
     IN  PLIST_ENTRY         List
     );
 
+extern VOID
+VifTransmitterReturnPacket(
+    IN  PXENVIF_VIF_CONTEXT                         Context,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
+    );
+
 extern PXENVIF_THREAD
 VifGetMacThread(
     IN  PXENVIF_VIF_CONTEXT Context
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:41:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:41:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pgR-0001XW-PI; Fri, 04 Dec 2015 12:41:55 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pgP-0001XR-GH
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:41:53 +0000
Received: from [85.158.137.68] by server-8.bemta-3.messagelabs.com id
	DA/06-31069-01A81665; Fri, 04 Dec 2015 12:41:52 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1449232910!8568816!1
X-Originating-IP: [209.85.160.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9577 invoked from network); 4 Dec 2015 12:41:50 -0000
Received: from mail-yk0-f170.google.com (HELO mail-yk0-f170.google.com)
	(209.85.160.170)
	by server-4.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:41:50 -0000
Received: by ykdv3 with SMTP id v3so122086211ykd.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:41:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=o5KTNfeT7eyoqI+P9Sf914tijJONVsIjk+E8B678bH0=;
	b=e+k225zLfydfvk/J/Y5Si5DSwCdJ6hpsJs4K6FQDpS0cz92PeIHtGyeZ5BJQNP5wXK
	znDWz3CxDDuX7d2mx8TYPoAyAKCnU3Z0FAlXF6DrNFX621bJm/wlQHocGZJWA6GNljQt
	Ehf1tdNeN+dDzfJulY/+PjhPab5NfAtk1yC3fVApTOfyfbzf79y9ckRJQm1WsJdGlFt/
	8v9NiZeKibgK4FbtvnYvMUVbOPWCPd/YUWFtbeimgsaaGrxiCq2L70GUw+9LbpJ4pD+8
	rj/OlFf9we1hmVybN/MiovXTSpffIF7egEGoiGmU4oSOLptoht8YTfqFzeW0II5RYzYE
	F5Rw==
X-Received: by 10.13.241.199 with SMTP id a190mr10589469ywf.296.1449232909815; 
	Fri, 04 Dec 2015 04:41:49 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h83sm8854486ywc.6.2015.12.04.04.41.48
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:41:49 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:41:35 +0000
Message-Id: <1449232895-21160-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Move to XENVIF VIF interface version 4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This means we can remove a lot of complexity and crucially we no longer
need to use the XENBUS_CACHE interface, which means we can avoid the race
introduced by commit 026aa32c "Make sure XENBUS interfaces are released
when going into S4".

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/cache_interface.h | 233 -----------------------
 include/vif_interface.h   | 300 +++++++++++++-----------------
 src/coinst/coinst.c       |   1 -
 src/xennet.inf            |   6 +-
 src/xennet/adapter.c      | 136 ++++++--------
 src/xennet/adapter.h      |   6 -
 src/xennet/receiver.c     | 242 ++++++++++--------------
 src/xennet/receiver.h     |  23 +--
 src/xennet/transmitter.c  | 456 +++++-----------------------------------------
 src/xennet/transmitter.h  |  17 +-
 10 files changed, 332 insertions(+), 1088 deletions(-)
 delete mode 100644 include/cache_interface.h

diff --git a/include/cache_interface.h b/include/cache_interface.h
deleted file mode 100644
index ac50a82..0000000
--- a/include/cache_interface.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
- * that the following conditions are met:
- *
- * *   Redistributions of source code must retain the above
- *     copyright notice, this list of conditions and the
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above
- *     copyright notice, this list of conditions and the
- *     following disclaimer in the documentation and/or other
- *     materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*! \file cache_interface.h
-    \brief XENBUS CACHE Interface
-
-    This interface provides access to XENBUS's object cache
-    implementation.
-*/
-
-#ifndef _XENBUS_CACHE_INTERFACE_H
-#define _XENBUS_CACHE_INTERFACE_H
-
-#ifndef _WINDLL
-
-/*! \typedef XENBUS_CACHE
-    \brief Cache handle
-*/
-typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
-
-/*! \typedef XENBUS_CACHE_ACQUIRE
-    \brief Acquire a reference to the CACHE interface
-
-    \param Interface The interface header
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_ACQUIRE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENBUS_CACHE_RELEASE
-    \brief Release a reference to the CACHE interface
-
-    \param Interface The interface header
-*/
-typedef VOID
-(*XENBUS_CACHE_RELEASE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENBUS_CACHE_CTOR
-    \brief Object creator callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-    \param Object Newly allocated object
-
-    This callback is invoked just after a new object is allocated and may
-    be used to initialize any object data prior to its insertion into the
-    cache.
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_CTOR)(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
-    );
-
-/*! \typedef XENBUS_CACHE_DTOR
-    \brief Object destructor callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-    \param Object Object about to be freed
-
-    This callback is invoked just after an object is removed from the
-    cache and before it is freed and may be used to tear down any object data.
-*/
-typedef VOID
-(*XENBUS_CACHE_DTOR)(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
-    );
-
-/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
-    \brief Cache lock callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-
-    This callback is invoked if the cache implementation requires mutual
-    exclusion.
-*/
-typedef VOID
-(*XENBUS_CACHE_ACQUIRE_LOCK)(
-    IN  PVOID   Argument
-    );
-
-/*! \typedef XENBUS_CACHE_RELEASE_LOCK
-    \brief Cache unlock callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-
-    This callback is invoked to release the mutual exclusion lock acquired
-    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
-*/
-typedef VOID
-(*XENBUS_CACHE_RELEASE_LOCK)(
-    IN  PVOID   Argument
-    );
-
-/*! \typedef XENBUS_CACHE_CREATE
-    \brief Create a cache of objects of the given \a Size
-
-    \param Interface The interface header
-    \param Name A name for the cache which will be used in debug output
-    \param Size The size of each object in bytes
-    \param Reservation The target minimum population of the cache
-    \param Ctor A callback which is invoked when a new object created
-    \param Dtor A callback which is invoked when an object is destroyed
-    \param AcquireLock A callback invoked to acquire a spinlock
-    \param ReleaseLock A callback invoked to release the spinlock
-    \param Argument An optional context argument passed to the callbacks
-    \param Cache A pointer to a cache handle to be initialized
-
-    If a non-zero \a Reservation is specified then this method will fail
-    unless that number of objects can be immediately created.
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_CREATE)(
-    IN  PINTERFACE                  Interface,
-    IN  const CHAR                  *Name,
-    IN  ULONG                       Size,
-    IN  ULONG                       Reservation,
-    IN  XENBUS_CACHE_CTOR           Ctor,
-    IN  XENBUS_CACHE_DTOR           Dtor,
-    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
-    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
-    IN  PVOID                       Argument OPTIONAL,
-    OUT PXENBUS_CACHE               *Cache
-    );
-
-/*! \typedef XENBUS_CACHE_GET
-    \brief Get an object from a \a Cache
-
-    \param Interface The interface header
-    \param Cache The cache handle
-    \param Locked If mutually exclusive access to the cache is already
-    guaranteed then set this to TRUE
-*/
-typedef PVOID
-(*XENBUS_CACHE_GET)(
-    IN  PINTERFACE      Interface,
-    IN  PXENBUS_CACHE   Cache,
-    IN  BOOLEAN         Locked
-    );
-
-/*! \typedef XENBUS_CACHE_PUT
-    \brief Return an object to a \a Cache
-
-    \param Interface The interface header
-    \param Cache The cache handle
-    \param Locked If mutually exclusive access to the cache is already
-    guaranteed then set this to TRUE
-*/
-typedef VOID
-(*XENBUS_CACHE_PUT)(
-    IN  PINTERFACE      Interface,
-    IN  PXENBUS_CACHE   Cache,
-    IN  PVOID           Object,
-    IN  BOOLEAN         Locked
-    );
-
-/*! \typedef XENBUS_CACHE_DESTROY
-    \brief Destroy a \a Cache
-
-    \param Interface The interface header
-    \param Cache The cache handle
-
-    All objects must have been returned to the cache prior to destruction
-*/
-typedef VOID
-(*XENBUS_CACHE_DESTROY)(
-    IN  PINTERFACE      Interface,
-    IN  PXENBUS_CACHE   Cache
-    );
-
-// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
-DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
-0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
-
-/*! \struct _XENBUS_CACHE_INTERFACE_V1
-    \brief CACHE interface version 1
-    \ingroup interfaces
-*/
-struct _XENBUS_CACHE_INTERFACE_V1 {
-    INTERFACE               Interface;
-    XENBUS_CACHE_ACQUIRE    CacheAcquire;
-    XENBUS_CACHE_RELEASE    CacheRelease;
-    XENBUS_CACHE_CREATE     CacheCreate;
-    XENBUS_CACHE_GET        CacheGet;
-    XENBUS_CACHE_PUT        CachePut;
-    XENBUS_CACHE_DESTROY    CacheDestroy;
-};
-
-typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
-
-/*! \def XENBUS_CACHE
-    \brief Macro at assist in method invocation
-*/
-#define XENBUS_CACHE(_Method, _Interface, ...)    \
-    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
-
-#endif  // _WINDLL
-
-#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
-#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
-
-#endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index e5f8534..27c5d2d 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -43,6 +43,28 @@
 #include <ifdef.h>
 #include <ethernet.h>
 
+/*! \enum _XENVIF_PACKET_HASH_ALGORITHM
+    \brief Hash algorithm
+*/
+typedef enum _XENVIF_PACKET_HASH_ALGORITHM {
+    /*! None (value should be ignored) */
+    XENVIF_PACKET_HASH_ALGORITHM_NONE = 0,
+    /*! Unspecified hash (value can be used) */
+    XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED
+} XENVIF_PACKET_HASH_ALGORITHM, *PXENVIF_PACKET_HASH_ALGORITHM;
+
+/*! \struct _XENVIF_PACKET_HASH_V1
+    \brief Hash information
+*/
+struct _XENVIF_PACKET_HASH_V1 {
+    /*! Hash algorithm used to calculate value */
+    XENVIF_PACKET_HASH_ALGORITHM    Algorithm;
+    /*! Calculated value */
+    ULONG                           Value;
+};
+
+typedef struct _XENVIF_PACKET_HASH_V1 XENVIF_PACKET_HASH, *PXENVIF_PACKET_HASH;
+
 /*! \struct _XENVIF_PACKET_HEADER_V1
     \brief Packet header information
 */
@@ -53,14 +75,25 @@ struct  _XENVIF_PACKET_HEADER_V1 {
     ULONG   Length;
 };
 
-/*! \struct _XENVIF_PACKET_INFO_V1
+struct _XENVIF_PACKET_INFO_V1 {
+    ULONG                           Length;
+    USHORT                          TagControlInformation;
+    BOOLEAN                         IsAFragment;
+    struct _XENVIF_PACKET_HEADER_V1 EthernetHeader;
+    struct _XENVIF_PACKET_HEADER_V1 LLCSnapHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 TcpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 TcpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
+};
+
+/*! \struct _XENVIF_PACKET_INFO_V2
     \brief Packet information
 */
-struct _XENVIF_PACKET_INFO_V1 {
+struct _XENVIF_PACKET_INFO_V2 {
     /*! Total length of all headers */
     ULONG                           Length;
-    /*! VLAN TCI if present (0 indicates not present) */
-    USHORT                          TagControlInformation;
     /*! TRUE if the packet is an IP fragment */
     BOOLEAN                         IsAFragment;
     /*! Ethernet header (stripped of any VLAN tag) */
@@ -79,7 +112,7 @@ struct _XENVIF_PACKET_INFO_V1 {
     struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
 };
 
-typedef struct _XENVIF_PACKET_INFO_V1   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
+typedef struct _XENVIF_PACKET_INFO_V2   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
 
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
@@ -120,32 +153,18 @@ typedef struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 XENVIF_PACKET_CHECKSUM_FLAGS, *P
 
 #pragma warning(pop)
 
-/*! \struct _XENVIF_RECEIVER_PACKET_V1
-    \brief Receive-side packet structure
-*/
 struct _XENVIF_RECEIVER_PACKET_V1 {
-    /*! List entry used for chaining packets together */
     LIST_ENTRY                              ListEntry;
-    /*! Pointer to packet information */
     struct _XENVIF_PACKET_INFO_V1           *Info;
-    /*! Offset of start of packet in MDL */
     ULONG                                   Offset;
-    /*! Total length of packet */
     ULONG                                   Length;
-    /*! Checksum flags */
     struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 Flags;
-    /*! TCP MSS if the packet contains a TCP large segment */
     USHORT                                  MaximumSegmentSize;
-    /*! Opaque cookie used to store context information for packet return */
     PVOID                                   Cookie;
-    /*! MDL referencing the initial buffer of the packet */
     MDL                                     Mdl;
-    /*! PFN information, which must always follow an MDL */
     PFN_NUMBER                              __Pfn;
 };
 
-typedef struct _XENVIF_RECEIVER_PACKET_V1 XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET;
-
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
 #pragma warning(disable:4201)   // nonstandard extension used : nameless struct/union
@@ -190,32 +209,18 @@ typedef struct _XENVIF_VIF_OFFLOAD_OPTIONS_V1 XENVIF_VIF_OFFLOAD_OPTIONS, *PXENV
 
 #pragma pack(push, 1) 
 
-/*! \struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1
-    \brief Packet information passed from subscriber to provider on
-    transmit side packet send
-
-    To fit into the reserved space in NDIS_PACKET and NET_BUFFER structures
-    this structure must be at most the size of 3 pointer types.
-*/
 struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 {
-    /*! Offload options for this packet */
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
-    /*! TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set) */
     USHORT                      MaximumSegmentSize;
-    /*! VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set) */
     USHORT                      TagControlInformation;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 XENVIF_TRANSMITTER_PACKET_SEND_INFO, *PXENVIF_TRANSMITTER_PACKET_SEND_INFO;
-
 /*! \enum _XENVIF_TRANSMITTER_PACKET_STATUS
     \brief Transmit-side packet status
 */
 typedef enum _XENVIF_TRANSMITTER_PACKET_STATUS {
-    /*! Packet was queued for the backend */
-    XENVIF_TRANSMITTER_PACKET_PENDING = 1,
     /*! Packet has been successfully processed by the backend */
-    XENVIF_TRANSMITTER_PACKET_OK,
+    XENVIF_TRANSMITTER_PACKET_OK = 2,
     /*! Packet was dropped */
     XENVIF_TRANSMITTER_PACKET_DROPPED,
     /*! There was a problem handling the packet */
@@ -242,73 +247,19 @@ struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 {
 
 typedef struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO, *PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO;
 
-#pragma warning(push)
-#pragma warning(disable:4201)   // nonstandard extension used : nameless struct/union
-
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V1
-    \brief Transmit-side packet structure
-*/
-struct _XENVIF_TRANSMITTER_PACKET_V1 {
-    /*! Pointer used for chaining packets together */
-    struct _XENVIF_TRANSMITTER_PACKET_V1                        *Next;
-    union {
-        struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1          Send;
-        struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1    Completion;
-    };
-};
-
-typedef struct _XENVIF_TRANSMITTER_PACKET_V1 XENVIF_TRANSMITTER_PACKET_V1, *PXENVIF_TRANSMITTER_PACKET_V1;
-
-#pragma warning(pop)
-
 #pragma pack(pop) 
 
-C_ASSERT(sizeof (struct _XENVIF_TRANSMITTER_PACKET_V1) <= (3 * sizeof (PVOID)));
-
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V2
-    \brief Transmit-side packet structure (v2)
-*/
 struct _XENVIF_TRANSMITTER_PACKET_V2 {
-    /*! List entry used for chaining packets together */
-    LIST_ENTRY                                  ListEntry;
-    /*! Opaque cookie used to store context information for packet return */
-    PVOID                                       Cookie;
-    /*! Hash value set by subscriber */
-    ULONG                                       Value;
-    /*! Packet information passed from subscriber to provider */
-    XENVIF_TRANSMITTER_PACKET_SEND_INFO         Send;
-    /*! Packet information passed from provider to subscriber on packet return */
-    XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
-    /*! Packet data MDL */
-    PMDL                                        Mdl;
-    /*! Offset into MDL to start of packet */
-    ULONG                                       Offset;
-    /*! Packet length */
-    ULONG                                       Length;
+    LIST_ENTRY                                              ListEntry;
+    PVOID                                                   Cookie;
+    ULONG                                                   Value;
+    struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1          Send;
+    struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1    Completion;
+    PMDL                                                    Mdl;
+    ULONG                                                   Offset;
+    ULONG                                                   Length;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_V2 XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
-
-/*! \enum _XENVIF_TRANSMITTER_PACKET_OFFSET
-    \brief Offsets of packet metadata relative to
-    XENVIF_TRANSMITTER_PACKET pointer
-
-    Because the transmit side packet structure is limited to 3 pointer
-    types in size, not all information about the packet can be passed in
-    the structure. Other information can, however, be found by applying
-    these byte offsets to the structure pointer and then dereferencing the
-    specified type.
-*/
-typedef enum _XENVIF_TRANSMITTER_PACKET_OFFSET {
-    /*! The offset of the start of the packet within the MDL (type ULONG) */
-    XENVIF_TRANSMITTER_PACKET_OFFSET_OFFSET = 0,
-    /*! The total length of the packet (type ULONG) */
-    XENVIF_TRANSMITTER_PACKET_LENGTH_OFFSET,
-    /*! MDL referencing the initial buffer of the packet (type PMDL) */
-    XENVIF_TRANSMITTER_PACKET_MDL_OFFSET,
-    XENVIF_TRANSMITTER_PACKET_OFFSET_COUNT
-} XENVIF_TRANSMITTER_PACKET_OFFSET, *PXENVIF_TRANSMITTER_PACKET_OFFSET;
-
 /*! \enum _XENVIF_VIF_STATISTIC
     \brief Interface statistics
 */
@@ -368,10 +319,10 @@ typedef enum _XENVIF_MAC_FILTER_LEVEL {
     \brief Type of callback (see \ref XENVIF_VIF_CALLBACK)
 */
 typedef enum _XENVIF_VIF_CALLBACK_TYPE {
-    /*! Return transmit side packets to the subscriber */
-    XENVIF_TRANSMITTER_RETURN_PACKETS = 0,
-    /*! Queue receive side packets at the subscriber */
-    XENVIF_RECEIVER_QUEUE_PACKETS,
+    /*! Return a transmit side packet to the subscriber */
+    XENVIF_TRANSMITTER_RETURN_PACKET = 0,
+    /*! Queue a receive side packet at the subscriber */
+    XENVIF_RECEIVER_QUEUE_PACKET,
     /*! Notify the subscriber of a MAC (link) state has change */
     XENVIF_MAC_STATE_CHANGE
 } XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
@@ -403,11 +354,19 @@ typedef VOID
     \param Type The callback type
     \param ... Additional paramaters required by \a Type
 
-    \b XENVIF_TRANSMITTER_RETURN_PACKETS:
-    \param Head The head of a chain of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_TRANSMITTER_RETURN_PACKET:
+    \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+    \param Completion Packet completion information
 
-    \b XENVIF_RECEIVER_QUEUE_PACKETS:
-    \param List List of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_RECEIVER_QUEUE_PACKET:
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param Flags Packet checksum flags
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Info Header information for the packet
+    \param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
 
     \b XENVIF_MAC_STATE_CHANGE:
     No additional arguments
@@ -468,74 +427,63 @@ typedef NTSTATUS
     OUT PULONGLONG              Value
     );
 
-/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKETS
-    \brief Return packets queues for receive by \ref XENVIF_VIF_CALLBACK
-    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKETS)
-
-    \param Interface The interface header
-    \param List List of \ref _XENVIF_RECEIVER_PACKET_V1
-*/
 typedef VOID
-(*XENVIF_VIF_RECEIVER_RETURN_PACKETS)(
+(*XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1)(
     IN  PINTERFACE  Interface,
     IN  PLIST_ENTRY List
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET
-    \brief Set byte offset of packet information relative to
-    XENVIF_TRANSMITTER_PACKET pointer.
-
-    See \ref _XENVIF_TRANSMITTER_PACKET_OFFSET.
+/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKET
+    \brief Return packets queued for receive by \ref XENVIF_VIF_CALLBACK
+    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKET)
 
     \param Interface The interface header
-    \param Type The offset type
-    \param Value The offset value
+    \param Cookie Cookie passed to XENVIF_RECEIVER_QUEUE_PACKET callback
 */
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET)(
-    IN  PINTERFACE                          Interface,
-    IN  XENVIF_TRANSMITTER_PACKET_OFFSET    Type,
-    IN  LONG_PTR                            Value
+typedef VOID
+(*XENVIF_VIF_RECEIVER_RETURN_PACKET)(
+    IN  PINTERFACE  Interface,
+    IN  PVOID       Cookie
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
-    \brief Get the packet headers into supplied buffer
-
-    \param Interface The interface header
-    \param Packet The packet to acquire headers for.
-    \param Headers The buffer to receive headers.
-    \param Info The offsets into Headers for relevant headers
-*/
 typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)(
-    IN  PINTERFACE                  Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2)(
+    IN  PINTERFACE                              Interface,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS
-    \brief Queue transmit side packets at the provider
-
-    \param Interface The interface header
-    \param Head The head of a chain of _XENVIF_TRANSMITTER_PACKET_V1
-*/
 typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS)(
-    IN  PINTERFACE                      Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET_V1   Head
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
+    IN  PINTERFACE  Interface,
+    IN  PLIST_ENTRY List
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2
-    \brief Queue transmit side packets at the provider
+/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKET
+    \brief Queue a packet at the provider's transmit side
 
     \param Interface The interface header
-    \param List List of _XENVIF_TRANSMITTER_PACKET_V2
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param OffloadOptions The requested offload options for this packet
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Hash Hash information for the packet
+    \param Cookie A cookie specified by the caller that will be passed to the XENVIF_TRANSMITTER_RETURN_PACKET callback
 */
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
-    IN  PINTERFACE  Interface,
-    IN  PLIST_ENTRY List
+typedef VOID
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET)(
+    IN  PINTERFACE                  Interface,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
     );
 
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
@@ -594,7 +542,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE
     \brief Query the maximum number of transmit side packets that can
-    be queued in the shared ring between frontend and backend
+    be queued in each shared ring between frontend and backend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -607,7 +555,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_RECEIVER_QUERY_RING_SIZE
     \brief Query the maximum number of receive side packets that can
-    be queued in the shared ring between backend and frontend
+    be queued in each shared ring between backend and frontend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -744,22 +692,22 @@ typedef NTSTATUS
 DEFINE_GUID(GUID_XENVIF_VIF_INTERFACE, 
 0x76f279cd, 0xca11, 0x418b, 0x92, 0xe8, 0xc5, 0x7f, 0x77, 0xde, 0xe, 0x2e);
 
-/*! \struct _XENVIF_VIF_INTERFACE_V1
-    \brief VIF interface version 1
+/*! \struct _XENVIF_VIF_INTERFACE_V2
+    \brief VIF interface version 2
     \ingroup interfaces
 */
-struct _XENVIF_VIF_INTERFACE_V1 {
+struct _XENVIF_VIF_INTERFACE_V2 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET        TransmitterSetPacketOffset;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS            TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -773,22 +721,23 @@ struct _XENVIF_VIF_INTERFACE_V1 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-/*! \struct _XENVIF_VIF_INTERFACE_V2
-    \brief VIF interface version 2
+/*! \struct _XENVIF_VIF_INTERFACE_V3
+    \brief VIF interface version 3
     \ingroup interfaces
 */
-struct _XENVIF_VIF_INTERFACE_V2 {
+struct _XENVIF_VIF_INTERFACE_V3 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
+    XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -802,23 +751,22 @@ struct _XENVIF_VIF_INTERFACE_V2 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-/*! \struct _XENVIF_VIF_INTERFACE_V3
-    \brief VIF interface version 3
+/*! \struct _XENVIF_VIF_INTERFACE_V4
+    \brief VIF interface version 4
     \ingroup interfaces
 */
-struct _XENVIF_VIF_INTERFACE_V3 {
+struct _XENVIF_VIF_INTERFACE_V4 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKET             TransmitterQueuePacket;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -832,7 +780,7 @@ struct _XENVIF_VIF_INTERFACE_V3 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V4 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
 
 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -842,7 +790,7 @@ typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER
 
 #endif  // _WINDLL
 
-#define XENVIF_VIF_INTERFACE_VERSION_MIN    1
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    3
+#define XENVIF_VIF_INTERFACE_VERSION_MIN    2
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    4
 
 #endif  // _XENVIF_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index f60aa43..345b0c6 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -45,7 +45,6 @@
 #include <stdarg.h>
 #include <assert.h>
 #include <vif_interface.h>
-#include <cache_interface.h>
 
 #include <tcpip.h>
 #include <version.h>
diff --git a/src/xennet.inf b/src/xennet.inf
index 6c4c457..88aaac4 100644
--- a/src/xennet.inf
+++ b/src/xennet.inf
@@ -61,9 +61,9 @@ xennet_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_NET&REV_08000004
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0001&DEV_NET&REV_08000004
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0002&DEV_NET&REV_08000004
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_NET&REV_08000006
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0001&DEV_NET&REV_08000006
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0002&DEV_NET&REV_08000006
 
 [XenNet_Inst] 
 Characteristics=0x84
diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index 2c35636..52c7b58 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -37,7 +37,6 @@
 #include <version.h>
 
 #include <vif_interface.h>
-#include <cache_interface.h>
 #include <store_interface.h>
 #include <suspend_interface.h>
 
@@ -66,7 +65,6 @@ typedef struct _PROPERTIES {
 
 struct _XENNET_ADAPTER {
     XENVIF_VIF_INTERFACE        VifInterface;
-    XENBUS_CACHE_INTERFACE      CacheInterface;
     XENBUS_STORE_INTERFACE      StoreInterface;
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
 
@@ -195,20 +193,46 @@ AdapterVifCallback(
     va_start(Arguments, Type);
 
     switch (Type) {
-    case XENVIF_TRANSMITTER_RETURN_PACKETS: {
-        PLIST_ENTRY List;
+    case XENVIF_TRANSMITTER_RETURN_PACKET: {
+        PVOID                                       Cookie;
+        PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion;
 
-        List = va_arg(Arguments, PLIST_ENTRY);
+        Cookie = va_arg(Arguments, PVOID);
+        Completion = va_arg(Arguments, PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO);
 
-        TransmitterCompletePackets(Adapter->Transmitter, List);
+        TransmitterReturnPacket(Adapter->Transmitter,
+                                Cookie,
+                                Completion);
         break;
     }
-    case XENVIF_RECEIVER_QUEUE_PACKETS: {
-        PLIST_ENTRY List;
-
-        List = va_arg(Arguments, PLIST_ENTRY);
-
-        ReceiverReceivePackets(Adapter->Receiver, List);
+    case XENVIF_RECEIVER_QUEUE_PACKET: {
+        PMDL                            Mdl;
+        ULONG                           Offset;
+        ULONG                           Length;
+        XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+        USHORT                          MaximumSegmentSize;
+        USHORT                          TagControlInformation;
+        PXENVIF_PACKET_INFO             Info;
+        PVOID                           Cookie;
+
+        Mdl = va_arg(Arguments, PMDL);
+        Offset = va_arg(Arguments, ULONG);
+        Length = va_arg(Arguments, ULONG);
+        Flags = va_arg(Arguments, XENVIF_PACKET_CHECKSUM_FLAGS);
+        MaximumSegmentSize = va_arg(Arguments, USHORT);
+        TagControlInformation = va_arg(Arguments, USHORT);
+        Info = va_arg(Arguments, PXENVIF_PACKET_INFO);
+        Cookie = va_arg(Arguments, PVOID);
+
+        ReceiverQueuePacket(Adapter->Receiver,
+                            Mdl,
+                            Offset,
+                            Length,
+                            Flags,
+                            MaximumSegmentSize,
+                            TagControlInformation,
+                            Info,
+                            Cookie);
         break;
     }
     case XENVIF_MAC_STATE_CHANGE: {
@@ -1050,14 +1074,6 @@ AdapterGetVifInterface(
     return &Adapter->VifInterface;
 }
 
-PXENBUS_CACHE_INTERFACE
-AdapterGetCacheInterface(
-    IN  PXENNET_ADAPTER     Adapter
-    )
-{
-    return &Adapter->CacheInterface;
-}
-
 PXENNET_TRANSMITTER
 AdapterGetTransmitter(
     IN  PXENNET_ADAPTER     Adapter
@@ -1469,41 +1485,27 @@ AdapterEnable(
     )
 {
     NTSTATUS                status;
-    NDIS_STATUS             ndisStatus;
 
     ASSERT(!Adapter->Enabled);
 
-    status = XENBUS_CACHE(Acquire,
-                          &Adapter->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = XENBUS_STORE(Acquire,
                           &Adapter->StoreInterface);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = XENBUS_SUSPEND(Acquire,
                             &Adapter->SuspendInterface);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     (VOID) AdapterSetDistribution(Adapter);
 
-    ndisStatus = TransmitterEnable(Adapter->Transmitter);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail4;
-
-    ndisStatus = ReceiverEnable(Adapter->Receiver);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail5;
-
     status = XENVIF_VIF(Enable,
                         &Adapter->VifInterface,
                         AdapterVifCallback,
                         Adapter);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail3;
 
     AdapterMediaStateChange(Adapter);
 
@@ -1511,22 +1513,13 @@ AdapterEnable(
 
     return NDIS_STATUS_SUCCESS;
 
-fail6:
-    ReceiverDisable(Adapter->Receiver);
-
-fail5:
-    TransmitterDisable(Adapter->Transmitter);
-
-fail4:
+fail3:
     AdapterClearDistribution(Adapter);
 
     XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
 
-fail3:
-    XENBUS_STORE(Release, &Adapter->StoreInterface);
-
 fail2:
-    XENBUS_CACHE(Release, &Adapter->CacheInterface);
+    XENBUS_STORE(Release, &Adapter->StoreInterface);
 
 fail1:
     return NDIS_STATUS_FAILURE;
@@ -1545,14 +1538,10 @@ AdapterDisable(
 
     AdapterMediaStateChange(Adapter);
 
-    ReceiverDisable(Adapter->Receiver);
-    TransmitterDisable(Adapter->Transmitter);
-
     AdapterClearDistribution(Adapter);
 
     XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
     XENBUS_STORE(Release, &Adapter->StoreInterface);
-    XENBUS_CACHE(Release, &Adapter->CacheInterface);
 }
 
 VOID
@@ -2779,22 +2768,13 @@ AdapterInitialize(
         goto fail2;
 
     status = __QueryInterface(DeviceObject,
-                              &GUID_XENBUS_CACHE_INTERFACE,
-                              XENBUS_CACHE_INTERFACE_VERSION_MAX,
-                              (PINTERFACE)&(*Adapter)->CacheInterface,
-                              sizeof(XENBUS_CACHE_INTERFACE),
-                              FALSE);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    status = __QueryInterface(DeviceObject,
                               &GUID_XENBUS_STORE_INTERFACE,
                               XENBUS_STORE_INTERFACE_VERSION_MAX,
                               (PINTERFACE)&(*Adapter)->StoreInterface,
                               sizeof(XENBUS_STORE_INTERFACE),
                               FALSE);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail3;
 
     status = __QueryInterface(DeviceObject,
                               &GUID_XENBUS_SUSPEND_INTERFACE,
@@ -2803,42 +2783,42 @@ AdapterInitialize(
                               sizeof(XENBUS_SUSPEND_INTERFACE),
                               FALSE);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     status = XENVIF_VIF(Acquire,
                         &(*Adapter)->VifInterface);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     (*Adapter)->NdisAdapterHandle = Handle;
 
     ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail7;
+        goto fail6;
 
     ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail8;
+        goto fail7;
 
     ndisStatus = AdapterGetAdvancedSettings(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail9;
+        goto fail8;
 
     ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail10;
+        goto fail9;
 
     ndisStatus = AdapterSetGeneralAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail11;
+        goto fail10;
 
     ndisStatus = AdapterSetOffloadAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail12;
+        goto fail11;
 
     ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail13;
+        goto fail12;
 
     RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
     Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
@@ -2857,31 +2837,28 @@ AdapterInitialize(
 
     return NDIS_STATUS_SUCCESS;
 
-fail13:
 fail12:
 fail11:
 fail10:
 fail9:
+fail8:
     ReceiverTeardown((*Adapter)->Receiver);
     (*Adapter)->Receiver = NULL;
 
-fail8:
+fail7:
     TransmitterTeardown((*Adapter)->Transmitter);
     (*Adapter)->Transmitter = NULL;
 
-fail7:
+fail6:
     (*Adapter)->NdisAdapterHandle = NULL;
 
     XENVIF_VIF(Release, &(*Adapter)->VifInterface);
 
-fail6:
-    RtlZeroMemory(&(*Adapter)->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
-
 fail5:
-    RtlZeroMemory(&(*Adapter)->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
+    RtlZeroMemory(&(*Adapter)->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
 
 fail4:
-    RtlZeroMemory(&(*Adapter)->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE));
+    RtlZeroMemory(&(*Adapter)->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
 
 fail3:
     RtlZeroMemory(&(*Adapter)->VifInterface, sizeof(XENVIF_VIF_INTERFACE));
@@ -2914,7 +2891,6 @@ AdapterTeardown(
 
     RtlZeroMemory(&Adapter->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
     RtlZeroMemory(&Adapter->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
-    RtlZeroMemory(&Adapter->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE));
     RtlZeroMemory(&Adapter->VifInterface, sizeof(XENVIF_VIF_INTERFACE));
 
     __AdapterFree(Adapter);
diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
index 5b2495a..5b0b338 100644
--- a/src/xennet/adapter.h
+++ b/src/xennet/adapter.h
@@ -76,12 +76,6 @@ AdapterGetVifInterface(
     IN  PXENNET_ADAPTER     Adapter
     );
 
-#include <cache_interface.h>
-extern PXENBUS_CACHE_INTERFACE
-AdapterGetCacheInterface(
-    IN  PXENNET_ADAPTER     Adapter
-    );
-
 #include "transmitter.h"
 extern PXENNET_TRANSMITTER
 AdapterGetTransmitter(
diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 8bfc10b..4a408c4 100644
--- a/src/xennet/receiver.c
+++ b/src/xennet/receiver.c
@@ -53,15 +53,23 @@ struct _XENNET_RECEIVER {
 #define RECEIVER_POOL_TAG       'RteN'
 #define IN_NDIS_MAX             1024
 
+typedef struct _NET_BUFFER_LIST_RESERVED {
+    PVOID   Cookie;
+} NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED;
+
+C_ASSERT(sizeof (NET_BUFFER_LIST_RESERVED) <= RTL_FIELD_SIZE(NET_BUFFER_LIST, MiniportReserved));
+
 static PNET_BUFFER_LIST
 __ReceiverAllocateNetBufferList(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PMDL                Mdl,
-    IN  ULONG               Offset,
-    IN  ULONG               Length
+    IN  PXENNET_RECEIVER        Receiver,
+    IN  PMDL                    Mdl,
+    IN  ULONG                   Offset,
+    IN  ULONG                   Length,
+    IN  PVOID                   Cookie
     )
 {
-    PNET_BUFFER_LIST        NetBufferList;
+    PNET_BUFFER_LIST            NetBufferList;
+    PNET_BUFFER_LIST_RESERVED   ListReserved;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
     KeAcquireSpinLockAtDpcLevel(&Receiver->Lock);
@@ -94,16 +102,27 @@ __ReceiverAllocateNetBufferList(
 
     KeReleaseSpinLockFromDpcLevel(&Receiver->Lock);
 
+    ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
+    ASSERT3P(ListReserved->Cookie, ==, NULL);
+    ListReserved->Cookie = Cookie;
+
     return NetBufferList;
 }        
 
-static VOID
+static PVOID
 __ReceiverReleaseNetBufferList(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PNET_BUFFER_LIST    NetBufferList,
-    IN  BOOLEAN             Cache
+    IN  PXENNET_RECEIVER        Receiver,
+    IN  PNET_BUFFER_LIST        NetBufferList,
+    IN  BOOLEAN                 Cache
     )
 {
+    PNET_BUFFER_LIST_RESERVED   ListReserved;
+    PVOID                       Cookie;
+
+    ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
+    Cookie = ListReserved->Cookie;
+    ListReserved->Cookie = NULL;
+
     if (Cache) {
         PNET_BUFFER_LIST    Old;
         PNET_BUFFER_LIST    New;
@@ -119,53 +138,29 @@ __ReceiverReleaseNetBufferList(
     } else {
         NdisFreeNetBufferList(NetBufferList);
     }
+
+    return Cookie;
 }
 
-static FORCEINLINE ULONG
-__ReceiverReturnNetBufferLists(
+static FORCEINLINE VOID
+__ReceiverReturnNetBufferList(
     IN  PXENNET_RECEIVER    Receiver,
     IN  PNET_BUFFER_LIST    NetBufferList,
     IN  BOOLEAN             Cache
     )
 {
     PXENVIF_VIF_INTERFACE   VifInterface;
-    LIST_ENTRY              List;
-    ULONG                   Count;
+    PVOID                   Cookie;
 
     VifInterface = AdapterGetVifInterface(Receiver->Adapter);
-    InitializeListHead(&List);
-
-    Count = 0;
-    while (NetBufferList != NULL) {
-        PNET_BUFFER_LIST        Next;
-        PNET_BUFFER             NetBuffer;
-        PMDL                    Mdl;
-        PXENVIF_RECEIVER_PACKET Packet;
 
-        Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
-        NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
-
-        NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
-        ASSERT3P(NET_BUFFER_NEXT_NB(NetBuffer), ==, NULL);
+    Cookie = __ReceiverReleaseNetBufferList(Receiver, NetBufferList, Cache);
 
-        Mdl = NET_BUFFER_FIRST_MDL(NetBuffer);
+    XENVIF_VIF(ReceiverReturnPacket,
+               VifInterface,
+               Cookie);
 
-        __ReceiverReleaseNetBufferList(Receiver, NetBufferList, Cache);
-
-        Packet = CONTAINING_RECORD(Mdl, XENVIF_RECEIVER_PACKET, Mdl);
-
-        InsertTailList(&List, &Packet->ListEntry);
-
-        Count++;
-        NetBufferList = Next;
-    }
-
-    if (Count != 0)
-        XENVIF_VIF(ReceiverReturnPackets,
-                   VifInterface,
-                   &List);
-
-    return Count;
+    (VOID) InterlockedIncrement(&Receiver->InNDIS);
 }
 
 static PNET_BUFFER_LIST
@@ -175,17 +170,23 @@ __ReceiverReceivePacket(
     IN  ULONG                                   Offset,
     IN  ULONG                                   Length,
     IN  XENVIF_PACKET_CHECKSUM_FLAGS            Flags,
-    IN  PXENVIF_PACKET_INFO                     Info
+    IN  USHORT                                  MaximumSegmentSize,
+    IN  USHORT                                  TagControlInformation,
+    IN  PXENVIF_PACKET_INFO                     Info,
+    IN  PVOID                                   Cookie
     )
 {
     PNET_BUFFER_LIST                            NetBufferList;
     PNET_BUFFER                                 NetBuffer;
     NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO   csumInfo;
 
+    UNREFERENCED_PARAMETER(MaximumSegmentSize);
+
     NetBufferList = __ReceiverAllocateNetBufferList(Receiver,
                                                     Mdl,
                                                     Offset,
-                                                    Length);
+                                                    Length,
+                                                    Cookie);
     if (NetBufferList == NULL)
         goto fail1;
 
@@ -206,10 +207,10 @@ __ReceiverReceivePacket(
 
     NET_BUFFER_LIST_INFO(NetBufferList, TcpIpChecksumNetBufferListInfo) = (PVOID)(ULONG_PTR)csumInfo.Value;
 
-    if (Info->TagControlInformation != 0) {
+    if (TagControlInformation != 0) {
         NDIS_NET_BUFFER_LIST_8021Q_INFO Ieee8021QInfo;
 
-        UNPACK_TAG_CONTROL_INFORMATION(Info->TagControlInformation,
+        UNPACK_TAG_CONTROL_INFORMATION(TagControlInformation,
                                        Ieee8021QInfo.TagHeader.UserPriority,
                                        Ieee8021QInfo.TagHeader.CanonicalFormatId,
                                        Ieee8021QInfo.TagHeader.VlanId);
@@ -265,31 +266,26 @@ __ReceiverReceivePacket(
     return NetBufferList;
 
 fail2:
-    __ReceiverReleaseNetBufferList(Receiver, NetBufferList, TRUE);
+    (VOID) __ReceiverReleaseNetBufferList(Receiver, NetBufferList, TRUE);
 
 fail1:
     return NULL;
 }
 
 static VOID
-__ReceiverPushPackets(
+__ReceiverPushPacket(
     IN  PXENNET_RECEIVER    Receiver,
-    IN  PNET_BUFFER_LIST    NetBufferList,
-    IN  ULONG               Count,
-    IN  BOOLEAN             LowResources
+    IN  PNET_BUFFER_LIST    NetBufferList
     )
 {
     ULONG                   Flags;
     LONG                    InNDIS;
 
-    InNDIS = Receiver->InNDIS;
+    InNDIS = InterlockedIncrement(&Receiver->InNDIS);
 
     Flags = NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL;
-    if (LowResources) {
+    if (InNDIS > IN_NDIS_MAX)
         Flags |= NDIS_RECEIVE_FLAGS_RESOURCES;
-    } else {
-        InNDIS = __InterlockedAdd(&Receiver->InNDIS, Count);
-    }
 
     for (;;) {
         LONG    InNDISMax;
@@ -307,11 +303,11 @@ __ReceiverPushPackets(
     NdisMIndicateReceiveNetBufferLists(AdapterGetHandle(Receiver->Adapter),
                                        NetBufferList,
                                        NDIS_DEFAULT_PORT_NUMBER,
-                                       Count,
+                                       1,
                                        Flags);
 
-    if (LowResources)
-        (VOID) __ReceiverReturnNetBufferLists(Receiver, NetBufferList, FALSE);
+    if (Flags & NDIS_RECEIVE_FLAGS_RESOURCES)
+        (VOID) __ReceiverReturnNetBufferList(Receiver, NetBufferList, FALSE);
 }
 
 NDIS_STATUS
@@ -359,24 +355,6 @@ fail1:
     return status;
 }
 
-NDIS_STATUS
-ReceiverEnable (
-    IN  PXENNET_RECEIVER    Receiver
-    )
-{
-    UNREFERENCED_PARAMETER(Receiver);
-
-    return NDIS_STATUS_SUCCESS;
-}
-
-VOID
-ReceiverDisable (
-    IN  PXENNET_RECEIVER    Receiver
-    )
-{
-    UNREFERENCED_PARAMETER(Receiver);
-}
-
 VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
@@ -425,88 +403,54 @@ ReceiverReturnNetBufferLists(
     IN  ULONG               ReturnFlags
     )
 {
-    ULONG                   Count;
-
     UNREFERENCED_PARAMETER(ReturnFlags);
 
-    Count = __ReceiverReturnNetBufferLists(Receiver, NetBufferList, TRUE);
-    (VOID) __InterlockedSubtract(&Receiver->InNDIS, Count);
+    while (NetBufferList != NULL) {
+        PNET_BUFFER_LIST        Next;
+
+        Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
+        NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
+
+        __ReceiverReturnNetBufferList(Receiver, NetBufferList, TRUE);
+
+        NetBufferList = Next;
+    }
 }
 
 VOID
-ReceiverReceivePackets(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PLIST_ENTRY         List
+ReceiverQueuePacket(
+    IN  PXENNET_RECEIVER                Receiver,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
     )
 {
-    PXENVIF_VIF_INTERFACE   VifInterface;
-    PNET_BUFFER_LIST        HeadNetBufferList;
-    PNET_BUFFER_LIST        *TailNetBufferList;
-    ULONG                   Count;
-    BOOLEAN                 LowResources;
+    PXENVIF_VIF_INTERFACE               VifInterface;
+    PNET_BUFFER_LIST                    NetBufferList;
 
     VifInterface = AdapterGetVifInterface(Receiver->Adapter);
-    LowResources = FALSE;
-
-again:
-    HeadNetBufferList = NULL;
-    TailNetBufferList = &HeadNetBufferList;
-    Count = 0;
-
-    while (!IsListEmpty(List)) {
-        PLIST_ENTRY                     ListEntry;
-        PXENVIF_RECEIVER_PACKET         Packet;
-        PXENVIF_PACKET_INFO             Info;
-        PMDL                            Mdl;
-        ULONG                           Offset;
-        ULONG                           Length;
-        XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
-        PNET_BUFFER_LIST                NetBufferList;
-
-        if (!LowResources &&
-            Receiver->InNDIS + Count > IN_NDIS_MAX)
-            break;
-
-        ListEntry = RemoveHeadList(List);
-        ASSERT(ListEntry != List);
-
-        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
-
-        Packet = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_PACKET, ListEntry);
-        Mdl = &Packet->Mdl;
-        Offset = Packet->Offset;
-        Length = Packet->Length;
-        Flags = Packet->Flags;
-        Info = Packet->Info;
-
-        NetBufferList = __ReceiverReceivePacket(Receiver, Mdl, Offset, Length, Flags, Info);
-
-        if (NetBufferList != NULL) {
-            *TailNetBufferList = NetBufferList;
-            TailNetBufferList = &NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
-            Count++;
-        } else {
-            LIST_ENTRY  PacketList;
 
-            InitializeListHead(&PacketList);
-            InsertTailList(&PacketList, &Packet->ListEntry);
+    NetBufferList = __ReceiverReceivePacket(Receiver,
+                                            Mdl,
+                                            Offset,
+                                            Length,
+                                            Flags,
+                                            MaximumSegmentSize,
+                                            TagControlInformation,
+                                            Info,
+                                            Cookie);
 
-            XENVIF_VIF(ReceiverReturnPackets,
-                       VifInterface,
-                       &PacketList);
-        }
-    }
-
-    if (Count != 0) {
-        ASSERT(HeadNetBufferList != NULL);
-
-        __ReceiverPushPackets(Receiver, HeadNetBufferList, Count, LowResources);
-    }
-
-    if (!IsListEmpty(List)) {
-        ASSERT(!LowResources);
-        LowResources = TRUE;
-        goto again;
+    if (NetBufferList != NULL) {
+        __ReceiverPushPacket(Receiver, NetBufferList);
+    } else {
+        XENVIF_VIF(ReceiverReturnPacket,
+                   VifInterface,
+                   Cookie);
     }
 }
 
diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
index 33701a9..fbc0151 100644
--- a/src/xennet/receiver.h
+++ b/src/xennet/receiver.h
@@ -43,16 +43,6 @@ ReceiverInitialize(
     OUT PXENNET_RECEIVER    *Receiver
     );
 
-extern NDIS_STATUS
-ReceiverEnable(
-    IN  PXENNET_RECEIVER    Receiver
-    );
-
-extern VOID
-ReceiverDisable(
-    IN  PXENNET_RECEIVER    Receiver
-    );
-
 extern VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
@@ -66,9 +56,16 @@ ReceiverReturnNetBufferLists(
     );
 
 extern VOID
-ReceiverReceivePackets(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PLIST_ENTRY         List
+ReceiverQueuePacket(
+    IN  PXENNET_RECEIVER                Receiver,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
     );
 
 extern PXENVIF_VIF_OFFLOAD_OPTIONS
diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
index 8c80c7e..5574b9c 100644
--- a/src/xennet/transmitter.c
+++ b/src/xennet/transmitter.c
@@ -33,7 +33,6 @@
 #include "transmitter.h"
 #include "adapter.h"
 #include <vif_interface.h>
-#include <cache_interface.h>
 #include <tcpip.h>
 #include "dbg_print.h"
 #include "assert.h"
@@ -42,98 +41,9 @@ struct _XENNET_TRANSMITTER {
     PXENNET_ADAPTER             Adapter;
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
     KSPIN_LOCK                  Lock;
-    PXENBUS_CACHE               PacketCache;
-    PXENBUS_CACHE               BufferCache;
 };
 
-#define XENNET_PACKET_CACHE_MIN     32
 #define TRANSMITTER_POOL_TAG        'TteN'
-#define BUFFER_CACHE_ITEM_SIZE      512
-#define MAX_HEADERS_LENGTH          (sizeof(IP_ADDRESS) + sizeof(IP_ADDRESS) + sizeof(USHORT) + sizeof(USHORT))
-
-static NTSTATUS
-__TransmitterPacketCtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-    return STATUS_SUCCESS;
-}
-
-static VOID
-__TransmitterPacketDtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-}
-
-static VOID
-__TransmitterPacketAcquireLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-    KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock);
-}
-
-static VOID
-__TransmitterPacketReleaseLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-#pragma prefast(suppress:26110)
-    KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock);
-}
-
-static NTSTATUS
-__TransmitterBufferCtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-    return STATUS_SUCCESS;
-}
-
-static VOID
-__TransmitterBufferDtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-}
-
-static VOID
-__TransmitterBufferAcquireLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-    KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock);
-}
-
-static VOID
-__TransmitterBufferReleaseLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-#pragma prefast(suppress:26110)
-    KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock);
-}
 
 NDIS_STATUS
 TransmitterInitialize (
@@ -141,10 +51,13 @@ TransmitterInitialize (
     OUT PXENNET_TRANSMITTER *Transmitter
     )
 {
+    NTSTATUS                status;
+
     *Transmitter = ExAllocatePoolWithTag(NonPagedPool,
                                          sizeof(XENNET_TRANSMITTER),
                                          TRANSMITTER_POOL_TAG);
 
+    status = STATUS_NO_MEMORY;
     if (*Transmitter == NULL)
         goto fail1;
 
@@ -157,84 +70,12 @@ TransmitterInitialize (
     return NDIS_STATUS_SUCCESS;
 
 fail1:
-    return NDIS_STATUS_FAILURE;
-}
-
-NDIS_STATUS
-TransmitterEnable (
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-    NTSTATUS                status;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    status = XENBUS_CACHE(Create,
-                          CacheInterface,
-                          "packet_cache",
-                          sizeof(XENVIF_TRANSMITTER_PACKET),
-                          XENNET_PACKET_CACHE_MIN,
-                          __TransmitterPacketCtor,
-                          __TransmitterPacketDtor,
-                          __TransmitterPacketAcquireLock,
-                          __TransmitterPacketReleaseLock,
-                          Transmitter,
-                          &Transmitter->PacketCache);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    status = XENBUS_CACHE(Create,
-                          CacheInterface,
-                          "buffer_cache",
-                          BUFFER_CACHE_ITEM_SIZE,
-                          0,
-                          __TransmitterBufferCtor,
-                          __TransmitterBufferDtor,
-                          __TransmitterBufferAcquireLock,
-                          __TransmitterBufferReleaseLock,
-                          Transmitter,
-                          &Transmitter->BufferCache);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    return NDIS_STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 Transmitter->PacketCache);
-    Transmitter->PacketCache = NULL;
-
-fail1:
     Error("fail1\n (%08x)", status);
 
     return NDIS_STATUS_FAILURE;
 }
 
 VOID
-TransmitterDisable (
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 Transmitter->BufferCache);
-    Transmitter->BufferCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 Transmitter->PacketCache);
-    Transmitter->PacketCache = NULL;
-}
-
-VOID
 TransmitterTeardown(
     IN  PXENNET_TRANSMITTER Transmitter
     )
@@ -247,74 +88,6 @@ TransmitterTeardown(
     ExFreePoolWithTag(Transmitter, TRANSMITTER_POOL_TAG);
 }
 
-static FORCEINLINE PXENVIF_TRANSMITTER_PACKET
-__TransmitterGetPacket(
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    return XENBUS_CACHE(Get,
-                        CacheInterface,
-                        Transmitter->PacketCache,
-                        FALSE);
-}
-
-static FORCEINLINE VOID
-__TransmitterPutPacket(
-    IN  PXENNET_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    RtlZeroMemory(Packet, sizeof(XENVIF_TRANSMITTER_PACKET));
-
-    XENBUS_CACHE(Put,
-                 CacheInterface,
-                 Transmitter->PacketCache,
-                 Packet,
-                 FALSE);
-}
-
-static FORCEINLINE PVOID
-__TransmitterGetBuffer(
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    return XENBUS_CACHE(Get,
-                        CacheInterface,
-                        Transmitter->BufferCache,
-                        FALSE);
-}
-
-static FORCEINLINE VOID
-__TransmitterPutBuffer(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PVOID               Buffer
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    RtlZeroMemory(Buffer, BUFFER_CACHE_ITEM_SIZE);
-
-    XENBUS_CACHE(Put,
-                 CacheInterface,
-                 Transmitter->BufferCache,
-                 Buffer,
-                 FALSE);
-}
-
 typedef struct _NET_BUFFER_LIST_RESERVED {
     LONG    Reference;
 } NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED;
@@ -348,34 +121,22 @@ __TransmitterCompleteNetBufferList(
 }
 
 static VOID
-__TransmitterCompletePackets(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PLIST_ENTRY         List,
-    IN  NDIS_STATUS         Status
+__TransmitterReturnPacket(
+    IN  PXENNET_TRANSMITTER     Transmitter,
+    IN  PVOID                   Cookie,
+    IN  NDIS_STATUS             Status
     )
 {
-    while (!IsListEmpty(List)) {
-        PLIST_ENTRY                 ListEntry;
-        PXENVIF_TRANSMITTER_PACKET  Packet;
-        PNET_BUFFER_LIST            NetBufferList;
-        PNET_BUFFER_LIST_RESERVED   ListReserved;
+    PNET_BUFFER_LIST            NetBufferList = Cookie;
+    PNET_BUFFER_LIST_RESERVED   ListReserved;
 
-        ListEntry = RemoveHeadList(List);
-        ASSERT3P(ListEntry, !=, List);
+    ASSERT(NetBufferList != NULL);
 
-        Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
+    ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
 
-        NetBufferList = Packet->Cookie;
-        ASSERT(NetBufferList != NULL);
-
-        ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
-
-        ASSERT(ListReserved->Reference != 0);
-        if (InterlockedDecrement(&ListReserved->Reference) == 0)
-            __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, Status);
-
-        __TransmitterPutPacket(Transmitter, Packet);
-    }
+    ASSERT(ListReserved->Reference != 0);
+    if (InterlockedDecrement(&ListReserved->Reference) == 0)
+        __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, Status);
 }
 
 static VOID
@@ -444,127 +205,6 @@ __TransmitterOffloadOptions(
     }
 }
 
-static ULONG
-__Hash(
-    IN  PVOID                       Buffer,
-    IN  ULONG                       Length
-    )
-{
-    PUCHAR                          Array = (PUCHAR)Buffer;
-    ULONG                           Accumulator;
-    ULONG                           Index;
-
-    Accumulator = 0;
-
-    for (Index = 0; Index < Length; ++Index) {
-        ULONG   Overflow;
-
-        Accumulator = (Accumulator << 4) + Array[Index];
-
-        Overflow = Accumulator & 0x00000f00;
-        if (Overflow != 0) {
-            Accumulator ^= Overflow >> 8;
-            Accumulator ^= Overflow;
-        }
-    }
-
-    return Accumulator;
-}
-
-static ULONG
-__TransmitterCalculateHash(
-    IN  PVOID                       Buffer,
-    IN  PXENVIF_PACKET_INFO         Info
-    )
-{
-    UCHAR       Headers[MAX_HEADERS_LENGTH];
-    PUCHAR      Ptr;
-
-    Ptr = (PUCHAR)Headers;
-
-    if (Info->IpHeader.Length) {
-        PIP_HEADER  Ip = (PIP_HEADER)((PUCHAR)Buffer + Info->IpHeader.Offset);
-
-        switch (Ip->Version) {
-        case 4:
-            RtlCopyMemory(Ptr, &Ip->Version4.SourceAddress, sizeof(IPV4_ADDRESS));
-            Ptr += sizeof(IPV4_ADDRESS);
-            RtlCopyMemory(Ptr, &Ip->Version4.DestinationAddress, sizeof(IPV4_ADDRESS));
-            Ptr += sizeof(IPV4_ADDRESS);
-            break;
-        case 6:
-            RtlCopyMemory(Ptr, &Ip->Version6.SourceAddress, sizeof(IPV6_ADDRESS));
-            Ptr += sizeof(IPV6_ADDRESS);
-            RtlCopyMemory(Ptr, &Ip->Version6.DestinationAddress, sizeof(IPV6_ADDRESS));
-            Ptr += sizeof(IPV6_ADDRESS);
-            break;
-        default:
-            break;
-        }
-    }
-
-    if (Info->TcpHeader.Length) {
-        PTCP_HEADER Tcp = (PTCP_HEADER)((PUCHAR)Buffer + Info->TcpHeader.Offset);
-
-        RtlCopyMemory(Ptr, &Tcp->SourcePort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-        RtlCopyMemory(Ptr, &Tcp->DestinationPort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-    } else if (Info->UdpHeader.Length) {
-        PUDP_HEADER Udp = (PUDP_HEADER)((PUCHAR)Buffer + Info->UdpHeader.Offset);
-
-        RtlCopyMemory(Ptr, &Udp->SourcePort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-        RtlCopyMemory(Ptr, &Udp->DestinationPort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-    }
-
-    if (Ptr == (PUCHAR)Headers)
-        return 0;
-
-    return __Hash(Headers, (ULONG)((ULONG_PTR)Ptr - (ULONG_PTR)Headers));
-}
-
-static ULONG
-__TransmitterGetHash(
-    IN  PXENNET_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet
-    )
-{
-    PXENVIF_VIF_INTERFACE           VifInterface;
-    ULONG                           Hash;
-    XENVIF_PACKET_INFO              Info;
-    PVOID                           Buffer;
-    NTSTATUS                        status;
-
-    Hash = 0;
-    VifInterface = AdapterGetVifInterface(Transmitter->Adapter);
-
-    Buffer = __TransmitterGetBuffer(Transmitter);
-    if (Buffer == NULL)
-        goto fail1;
-
-    RtlZeroMemory(&Info, sizeof(XENVIF_PACKET_INFO));
-
-    status = XENVIF_VIF(TransmitterGetPacketHeaders,
-                        VifInterface,
-                        Packet,
-                        Buffer,
-                        &Info);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    Hash = __TransmitterCalculateHash(Buffer, &Info);
-
-    __TransmitterPutBuffer(Transmitter, Buffer);
-    return Hash;
-
-fail2:
-    __TransmitterPutBuffer(Transmitter, Buffer);
-fail1:
-    return 0;
-}
-
 VOID
 TransmitterSendNetBufferLists(
     IN  PXENNET_TRANSMITTER     Transmitter,
@@ -603,41 +243,30 @@ TransmitterSendNetBufferLists(
                                     &TagControlInformation,
                                     &MaximumSegmentSize);
 
+        OffloadOptions.Value &= Transmitter->OffloadOptions.Value;
+
         ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
         RtlZeroMemory(ListReserved, sizeof (NET_BUFFER_LIST_RESERVED));
 
         NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
         while (NetBuffer != NULL) {
-            PXENVIF_TRANSMITTER_PACKET  Packet;
-
-            Packet = __TransmitterGetPacket(Transmitter);
-            if (Packet == NULL) {
-                while (ListReserved->Reference--) {
-                    PLIST_ENTRY     ListEntry;
-
-                    ListEntry = RemoveTailList(&List);
-                    ASSERT3P(ListEntry, !=, &List);
-
-                    Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
-
-                    __TransmitterPutPacket(Transmitter, Packet);
-                }
-                __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, NDIS_STATUS_NOT_ACCEPTED);
-                break;
-            }
+            PVOID               Cookie = NetBufferList;
+            XENVIF_PACKET_HASH  Hash;
 
             ListReserved->Reference++;
 
-            Packet->Cookie = NetBufferList;
-            Packet->Send.OffloadOptions.Value = OffloadOptions.Value & Transmitter->OffloadOptions.Value;
-            Packet->Send.MaximumSegmentSize = MaximumSegmentSize;
-            Packet->Send.TagControlInformation = TagControlInformation;
-            Packet->Mdl = NET_BUFFER_CURRENT_MDL(NetBuffer);
-            Packet->Length = NET_BUFFER_DATA_LENGTH(NetBuffer);
-            Packet->Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);
-            Packet->Value = __TransmitterGetHash(Transmitter, Packet);
+            Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_NONE;
 
-            InsertTailList(&List, &Packet->ListEntry);
+            XENVIF_VIF(TransmitterQueuePacket,
+                       AdapterGetVifInterface(Transmitter->Adapter),
+                       NET_BUFFER_CURRENT_MDL(NetBuffer),
+                       NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer),
+                       NET_BUFFER_DATA_LENGTH(NetBuffer),
+                       OffloadOptions,
+                       MaximumSegmentSize,
+                       TagControlInformation,
+                       &Hash,
+                       Cookie);
 
             NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer);
         }
@@ -645,26 +274,25 @@ TransmitterSendNetBufferLists(
         NetBufferList = ListNext;
     }
 
-    if (!IsListEmpty(&List)) {
-        NTSTATUS    status; 
-
-        status = XENVIF_VIF(TransmitterQueuePackets,
-                            AdapterGetVifInterface(Transmitter->Adapter),
-                            &List);
-        if (!NT_SUCCESS(status))
-            __TransmitterCompletePackets(Transmitter, &List, NDIS_STATUS_NOT_ACCEPTED);
-    }
-
     NDIS_LOWER_IRQL(Irql, DISPATCH_LEVEL);
 }
 
 VOID
-TransmitterCompletePackets(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PLIST_ENTRY         List
+TransmitterReturnPacket(
+    IN  PXENNET_TRANSMITTER                         Transmitter,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
     )
 {
-    __TransmitterCompletePackets(Transmitter, List, NDIS_STATUS_SUCCESS);
+    NDIS_STATUS                                     Status;
+
+    UNREFERENCED_PARAMETER(Completion);
+
+    Status = (Completion->Status == XENVIF_TRANSMITTER_PACKET_OK) ?
+             NDIS_STATUS_SUCCESS :
+             NDIS_STATUS_NOT_ACCEPTED;
+
+    __TransmitterReturnPacket(Transmitter, Cookie, Status);
 }
 
 PXENVIF_VIF_OFFLOAD_OPTIONS
diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
index 363b91e..585c5ac 100644
--- a/src/xennet/transmitter.h
+++ b/src/xennet/transmitter.h
@@ -43,16 +43,6 @@ TransmitterInitialize(
     OUT PXENNET_TRANSMITTER *Transmitter
     );
 
-extern NDIS_STATUS
-TransmitterEnable(
-    IN  PXENNET_TRANSMITTER Transmitter
-    );
-
-extern VOID
-TransmitterDisable(
-    IN  PXENNET_TRANSMITTER Transmitter
-    );
-
 extern VOID
 TransmitterTeardown(
     IN  PXENNET_TRANSMITTER Transmitter
@@ -67,9 +57,10 @@ TransmitterSendNetBufferLists (
     );
 
 extern VOID
-TransmitterCompletePackets(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PLIST_ENTRY         List
+TransmitterReturnPacket(
+    IN  PXENNET_TRANSMITTER                         Transmitter,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
     );
 
 extern PXENVIF_VIF_OFFLOAD_OPTIONS
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 12:41:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 12:41:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4pgR-0001XW-PI; Fri, 04 Dec 2015 12:41:55 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4pgP-0001XR-GH
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 12:41:53 +0000
Received: from [85.158.137.68] by server-8.bemta-3.messagelabs.com id
	DA/06-31069-01A81665; Fri, 04 Dec 2015 12:41:52 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-31.messagelabs.com!1449232910!8568816!1
X-Originating-IP: [209.85.160.170]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 9577 invoked from network); 4 Dec 2015 12:41:50 -0000
Received: from mail-yk0-f170.google.com (HELO mail-yk0-f170.google.com)
	(209.85.160.170)
	by server-4.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 12:41:50 -0000
Received: by ykdv3 with SMTP id v3so122086211ykd.0
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 04:41:49 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=o5KTNfeT7eyoqI+P9Sf914tijJONVsIjk+E8B678bH0=;
	b=e+k225zLfydfvk/J/Y5Si5DSwCdJ6hpsJs4K6FQDpS0cz92PeIHtGyeZ5BJQNP5wXK
	znDWz3CxDDuX7d2mx8TYPoAyAKCnU3Z0FAlXF6DrNFX621bJm/wlQHocGZJWA6GNljQt
	Ehf1tdNeN+dDzfJulY/+PjhPab5NfAtk1yC3fVApTOfyfbzf79y9ckRJQm1WsJdGlFt/
	8v9NiZeKibgK4FbtvnYvMUVbOPWCPd/YUWFtbeimgsaaGrxiCq2L70GUw+9LbpJ4pD+8
	rj/OlFf9we1hmVybN/MiovXTSpffIF7egEGoiGmU4oSOLptoht8YTfqFzeW0II5RYzYE
	F5Rw==
X-Received: by 10.13.241.199 with SMTP id a190mr10589469ywf.296.1449232909815; 
	Fri, 04 Dec 2015 04:41:49 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id h83sm8854486ywc.6.2015.12.04.04.41.48
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 04:41:49 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 12:41:35 +0000
Message-Id: <1449232895-21160-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Move to XENVIF VIF interface version 4
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

This means we can remove a lot of complexity and crucially we no longer
need to use the XENBUS_CACHE interface, which means we can avoid the race
introduced by commit 026aa32c "Make sure XENBUS interfaces are released
when going into S4".

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/cache_interface.h | 233 -----------------------
 include/vif_interface.h   | 300 +++++++++++++-----------------
 src/coinst/coinst.c       |   1 -
 src/xennet.inf            |   6 +-
 src/xennet/adapter.c      | 136 ++++++--------
 src/xennet/adapter.h      |   6 -
 src/xennet/receiver.c     | 242 ++++++++++--------------
 src/xennet/receiver.h     |  23 +--
 src/xennet/transmitter.c  | 456 +++++-----------------------------------------
 src/xennet/transmitter.h  |  17 +-
 10 files changed, 332 insertions(+), 1088 deletions(-)
 delete mode 100644 include/cache_interface.h

diff --git a/include/cache_interface.h b/include/cache_interface.h
deleted file mode 100644
index ac50a82..0000000
--- a/include/cache_interface.h
+++ /dev/null
@@ -1,233 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms,
- * with or without modification, are permitted provided
- * that the following conditions are met:
- *
- * *   Redistributions of source code must retain the above
- *     copyright notice, this list of conditions and the
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above
- *     copyright notice, this list of conditions and the
- *     following disclaimer in the documentation and/or other
- *     materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- */
-
-/*! \file cache_interface.h
-    \brief XENBUS CACHE Interface
-
-    This interface provides access to XENBUS's object cache
-    implementation.
-*/
-
-#ifndef _XENBUS_CACHE_INTERFACE_H
-#define _XENBUS_CACHE_INTERFACE_H
-
-#ifndef _WINDLL
-
-/*! \typedef XENBUS_CACHE
-    \brief Cache handle
-*/
-typedef struct _XENBUS_CACHE    XENBUS_CACHE, *PXENBUS_CACHE;
-
-/*! \typedef XENBUS_CACHE_ACQUIRE
-    \brief Acquire a reference to the CACHE interface
-
-    \param Interface The interface header
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_ACQUIRE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENBUS_CACHE_RELEASE
-    \brief Release a reference to the CACHE interface
-
-    \param Interface The interface header
-*/
-typedef VOID
-(*XENBUS_CACHE_RELEASE)(
-    IN  PINTERFACE  Interface
-    );
-
-/*! \typedef XENBUS_CACHE_CTOR
-    \brief Object creator callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-    \param Object Newly allocated object
-
-    This callback is invoked just after a new object is allocated and may
-    be used to initialize any object data prior to its insertion into the
-    cache.
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_CTOR)(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
-    );
-
-/*! \typedef XENBUS_CACHE_DTOR
-    \brief Object destructor callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-    \param Object Object about to be freed
-
-    This callback is invoked just after an object is removed from the
-    cache and before it is freed and may be used to tear down any object data.
-*/
-typedef VOID
-(*XENBUS_CACHE_DTOR)(
-    IN  PVOID   Argument,
-    IN  PVOID   Object
-    );
-
-/*! \typedef XENBUS_CACHE_ACQUIRE_LOCK
-    \brief Cache lock callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-
-    This callback is invoked if the cache implementation requires mutual
-    exclusion.
-*/
-typedef VOID
-(*XENBUS_CACHE_ACQUIRE_LOCK)(
-    IN  PVOID   Argument
-    );
-
-/*! \typedef XENBUS_CACHE_RELEASE_LOCK
-    \brief Cache unlock callback
-
-    \param Argument Context \a Argument supplied to \a XENBUS_CACHE_CREATE
-
-    This callback is invoked to release the mutual exclusion lock acquired
-    by a previous invocation of \a XENBUS_CACHE_ACQUIRE_LOCK.
-*/
-typedef VOID
-(*XENBUS_CACHE_RELEASE_LOCK)(
-    IN  PVOID   Argument
-    );
-
-/*! \typedef XENBUS_CACHE_CREATE
-    \brief Create a cache of objects of the given \a Size
-
-    \param Interface The interface header
-    \param Name A name for the cache which will be used in debug output
-    \param Size The size of each object in bytes
-    \param Reservation The target minimum population of the cache
-    \param Ctor A callback which is invoked when a new object created
-    \param Dtor A callback which is invoked when an object is destroyed
-    \param AcquireLock A callback invoked to acquire a spinlock
-    \param ReleaseLock A callback invoked to release the spinlock
-    \param Argument An optional context argument passed to the callbacks
-    \param Cache A pointer to a cache handle to be initialized
-
-    If a non-zero \a Reservation is specified then this method will fail
-    unless that number of objects can be immediately created.
-*/
-typedef NTSTATUS
-(*XENBUS_CACHE_CREATE)(
-    IN  PINTERFACE                  Interface,
-    IN  const CHAR                  *Name,
-    IN  ULONG                       Size,
-    IN  ULONG                       Reservation,
-    IN  XENBUS_CACHE_CTOR           Ctor,
-    IN  XENBUS_CACHE_DTOR           Dtor,
-    IN  XENBUS_CACHE_ACQUIRE_LOCK   AcquireLock,
-    IN  XENBUS_CACHE_RELEASE_LOCK   ReleaseLock,
-    IN  PVOID                       Argument OPTIONAL,
-    OUT PXENBUS_CACHE               *Cache
-    );
-
-/*! \typedef XENBUS_CACHE_GET
-    \brief Get an object from a \a Cache
-
-    \param Interface The interface header
-    \param Cache The cache handle
-    \param Locked If mutually exclusive access to the cache is already
-    guaranteed then set this to TRUE
-*/
-typedef PVOID
-(*XENBUS_CACHE_GET)(
-    IN  PINTERFACE      Interface,
-    IN  PXENBUS_CACHE   Cache,
-    IN  BOOLEAN         Locked
-    );
-
-/*! \typedef XENBUS_CACHE_PUT
-    \brief Return an object to a \a Cache
-
-    \param Interface The interface header
-    \param Cache The cache handle
-    \param Locked If mutually exclusive access to the cache is already
-    guaranteed then set this to TRUE
-*/
-typedef VOID
-(*XENBUS_CACHE_PUT)(
-    IN  PINTERFACE      Interface,
-    IN  PXENBUS_CACHE   Cache,
-    IN  PVOID           Object,
-    IN  BOOLEAN         Locked
-    );
-
-/*! \typedef XENBUS_CACHE_DESTROY
-    \brief Destroy a \a Cache
-
-    \param Interface The interface header
-    \param Cache The cache handle
-
-    All objects must have been returned to the cache prior to destruction
-*/
-typedef VOID
-(*XENBUS_CACHE_DESTROY)(
-    IN  PINTERFACE      Interface,
-    IN  PXENBUS_CACHE   Cache
-    );
-
-// {A98DFD78-416A-4949-92A5-E084F2F4B44E}
-DEFINE_GUID(GUID_XENBUS_CACHE_INTERFACE,
-0xa98dfd78, 0x416a, 0x4949, 0x92, 0xa5, 0xe0, 0x84, 0xf2, 0xf4, 0xb4, 0x4e);
-
-/*! \struct _XENBUS_CACHE_INTERFACE_V1
-    \brief CACHE interface version 1
-    \ingroup interfaces
-*/
-struct _XENBUS_CACHE_INTERFACE_V1 {
-    INTERFACE               Interface;
-    XENBUS_CACHE_ACQUIRE    CacheAcquire;
-    XENBUS_CACHE_RELEASE    CacheRelease;
-    XENBUS_CACHE_CREATE     CacheCreate;
-    XENBUS_CACHE_GET        CacheGet;
-    XENBUS_CACHE_PUT        CachePut;
-    XENBUS_CACHE_DESTROY    CacheDestroy;
-};
-
-typedef struct _XENBUS_CACHE_INTERFACE_V1 XENBUS_CACHE_INTERFACE, *PXENBUS_CACHE_INTERFACE;
-
-/*! \def XENBUS_CACHE
-    \brief Macro at assist in method invocation
-*/
-#define XENBUS_CACHE(_Method, _Interface, ...)    \
-    (_Interface)->Cache ## _Method((PINTERFACE)(_Interface), __VA_ARGS__)
-
-#endif  // _WINDLL
-
-#define XENBUS_CACHE_INTERFACE_VERSION_MIN  1
-#define XENBUS_CACHE_INTERFACE_VERSION_MAX  1
-
-#endif  // _XENBUS_CACHE_INTERFACE_H
diff --git a/include/vif_interface.h b/include/vif_interface.h
index e5f8534..27c5d2d 100644
--- a/include/vif_interface.h
+++ b/include/vif_interface.h
@@ -43,6 +43,28 @@
 #include <ifdef.h>
 #include <ethernet.h>
 
+/*! \enum _XENVIF_PACKET_HASH_ALGORITHM
+    \brief Hash algorithm
+*/
+typedef enum _XENVIF_PACKET_HASH_ALGORITHM {
+    /*! None (value should be ignored) */
+    XENVIF_PACKET_HASH_ALGORITHM_NONE = 0,
+    /*! Unspecified hash (value can be used) */
+    XENVIF_PACKET_HASH_ALGORITHM_UNSPECIFIED
+} XENVIF_PACKET_HASH_ALGORITHM, *PXENVIF_PACKET_HASH_ALGORITHM;
+
+/*! \struct _XENVIF_PACKET_HASH_V1
+    \brief Hash information
+*/
+struct _XENVIF_PACKET_HASH_V1 {
+    /*! Hash algorithm used to calculate value */
+    XENVIF_PACKET_HASH_ALGORITHM    Algorithm;
+    /*! Calculated value */
+    ULONG                           Value;
+};
+
+typedef struct _XENVIF_PACKET_HASH_V1 XENVIF_PACKET_HASH, *PXENVIF_PACKET_HASH;
+
 /*! \struct _XENVIF_PACKET_HEADER_V1
     \brief Packet header information
 */
@@ -53,14 +75,25 @@ struct  _XENVIF_PACKET_HEADER_V1 {
     ULONG   Length;
 };
 
-/*! \struct _XENVIF_PACKET_INFO_V1
+struct _XENVIF_PACKET_INFO_V1 {
+    ULONG                           Length;
+    USHORT                          TagControlInformation;
+    BOOLEAN                         IsAFragment;
+    struct _XENVIF_PACKET_HEADER_V1 EthernetHeader;
+    struct _XENVIF_PACKET_HEADER_V1 LLCSnapHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 IpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 TcpHeader;
+    struct _XENVIF_PACKET_HEADER_V1 TcpOptions;
+    struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
+};
+
+/*! \struct _XENVIF_PACKET_INFO_V2
     \brief Packet information
 */
-struct _XENVIF_PACKET_INFO_V1 {
+struct _XENVIF_PACKET_INFO_V2 {
     /*! Total length of all headers */
     ULONG                           Length;
-    /*! VLAN TCI if present (0 indicates not present) */
-    USHORT                          TagControlInformation;
     /*! TRUE if the packet is an IP fragment */
     BOOLEAN                         IsAFragment;
     /*! Ethernet header (stripped of any VLAN tag) */
@@ -79,7 +112,7 @@ struct _XENVIF_PACKET_INFO_V1 {
     struct _XENVIF_PACKET_HEADER_V1 UdpHeader;
 };
 
-typedef struct _XENVIF_PACKET_INFO_V1   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
+typedef struct _XENVIF_PACKET_INFO_V2   XENVIF_PACKET_INFO, *PXENVIF_PACKET_INFO;
 
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
@@ -120,32 +153,18 @@ typedef struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 XENVIF_PACKET_CHECKSUM_FLAGS, *P
 
 #pragma warning(pop)
 
-/*! \struct _XENVIF_RECEIVER_PACKET_V1
-    \brief Receive-side packet structure
-*/
 struct _XENVIF_RECEIVER_PACKET_V1 {
-    /*! List entry used for chaining packets together */
     LIST_ENTRY                              ListEntry;
-    /*! Pointer to packet information */
     struct _XENVIF_PACKET_INFO_V1           *Info;
-    /*! Offset of start of packet in MDL */
     ULONG                                   Offset;
-    /*! Total length of packet */
     ULONG                                   Length;
-    /*! Checksum flags */
     struct _XENVIF_PACKET_CHECKSUM_FLAGS_V1 Flags;
-    /*! TCP MSS if the packet contains a TCP large segment */
     USHORT                                  MaximumSegmentSize;
-    /*! Opaque cookie used to store context information for packet return */
     PVOID                                   Cookie;
-    /*! MDL referencing the initial buffer of the packet */
     MDL                                     Mdl;
-    /*! PFN information, which must always follow an MDL */
     PFN_NUMBER                              __Pfn;
 };
 
-typedef struct _XENVIF_RECEIVER_PACKET_V1 XENVIF_RECEIVER_PACKET, *PXENVIF_RECEIVER_PACKET;
-
 #pragma warning(push)
 #pragma warning(disable:4214)   // nonstandard extension used : bit field types other than int
 #pragma warning(disable:4201)   // nonstandard extension used : nameless struct/union
@@ -190,32 +209,18 @@ typedef struct _XENVIF_VIF_OFFLOAD_OPTIONS_V1 XENVIF_VIF_OFFLOAD_OPTIONS, *PXENV
 
 #pragma pack(push, 1) 
 
-/*! \struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1
-    \brief Packet information passed from subscriber to provider on
-    transmit side packet send
-
-    To fit into the reserved space in NDIS_PACKET and NET_BUFFER structures
-    this structure must be at most the size of 3 pointer types.
-*/
 struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 {
-    /*! Offload options for this packet */
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
-    /*! TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set) */
     USHORT                      MaximumSegmentSize;
-    /*! VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set) */
     USHORT                      TagControlInformation;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1 XENVIF_TRANSMITTER_PACKET_SEND_INFO, *PXENVIF_TRANSMITTER_PACKET_SEND_INFO;
-
 /*! \enum _XENVIF_TRANSMITTER_PACKET_STATUS
     \brief Transmit-side packet status
 */
 typedef enum _XENVIF_TRANSMITTER_PACKET_STATUS {
-    /*! Packet was queued for the backend */
-    XENVIF_TRANSMITTER_PACKET_PENDING = 1,
     /*! Packet has been successfully processed by the backend */
-    XENVIF_TRANSMITTER_PACKET_OK,
+    XENVIF_TRANSMITTER_PACKET_OK = 2,
     /*! Packet was dropped */
     XENVIF_TRANSMITTER_PACKET_DROPPED,
     /*! There was a problem handling the packet */
@@ -242,73 +247,19 @@ struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 {
 
 typedef struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1 XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO, *PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO;
 
-#pragma warning(push)
-#pragma warning(disable:4201)   // nonstandard extension used : nameless struct/union
-
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V1
-    \brief Transmit-side packet structure
-*/
-struct _XENVIF_TRANSMITTER_PACKET_V1 {
-    /*! Pointer used for chaining packets together */
-    struct _XENVIF_TRANSMITTER_PACKET_V1                        *Next;
-    union {
-        struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1          Send;
-        struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1    Completion;
-    };
-};
-
-typedef struct _XENVIF_TRANSMITTER_PACKET_V1 XENVIF_TRANSMITTER_PACKET_V1, *PXENVIF_TRANSMITTER_PACKET_V1;
-
-#pragma warning(pop)
-
 #pragma pack(pop) 
 
-C_ASSERT(sizeof (struct _XENVIF_TRANSMITTER_PACKET_V1) <= (3 * sizeof (PVOID)));
-
-/*! \struct _XENVIF_TRANSMITTER_PACKET_V2
-    \brief Transmit-side packet structure (v2)
-*/
 struct _XENVIF_TRANSMITTER_PACKET_V2 {
-    /*! List entry used for chaining packets together */
-    LIST_ENTRY                                  ListEntry;
-    /*! Opaque cookie used to store context information for packet return */
-    PVOID                                       Cookie;
-    /*! Hash value set by subscriber */
-    ULONG                                       Value;
-    /*! Packet information passed from subscriber to provider */
-    XENVIF_TRANSMITTER_PACKET_SEND_INFO         Send;
-    /*! Packet information passed from provider to subscriber on packet return */
-    XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO   Completion;
-    /*! Packet data MDL */
-    PMDL                                        Mdl;
-    /*! Offset into MDL to start of packet */
-    ULONG                                       Offset;
-    /*! Packet length */
-    ULONG                                       Length;
+    LIST_ENTRY                                              ListEntry;
+    PVOID                                                   Cookie;
+    ULONG                                                   Value;
+    struct _XENVIF_TRANSMITTER_PACKET_SEND_INFO_V1          Send;
+    struct _XENVIF_TRANSMITTER_PACKET_COMPLETION_INFO_V1    Completion;
+    PMDL                                                    Mdl;
+    ULONG                                                   Offset;
+    ULONG                                                   Length;
 };
 
-typedef struct _XENVIF_TRANSMITTER_PACKET_V2 XENVIF_TRANSMITTER_PACKET, *PXENVIF_TRANSMITTER_PACKET;
-
-/*! \enum _XENVIF_TRANSMITTER_PACKET_OFFSET
-    \brief Offsets of packet metadata relative to
-    XENVIF_TRANSMITTER_PACKET pointer
-
-    Because the transmit side packet structure is limited to 3 pointer
-    types in size, not all information about the packet can be passed in
-    the structure. Other information can, however, be found by applying
-    these byte offsets to the structure pointer and then dereferencing the
-    specified type.
-*/
-typedef enum _XENVIF_TRANSMITTER_PACKET_OFFSET {
-    /*! The offset of the start of the packet within the MDL (type ULONG) */
-    XENVIF_TRANSMITTER_PACKET_OFFSET_OFFSET = 0,
-    /*! The total length of the packet (type ULONG) */
-    XENVIF_TRANSMITTER_PACKET_LENGTH_OFFSET,
-    /*! MDL referencing the initial buffer of the packet (type PMDL) */
-    XENVIF_TRANSMITTER_PACKET_MDL_OFFSET,
-    XENVIF_TRANSMITTER_PACKET_OFFSET_COUNT
-} XENVIF_TRANSMITTER_PACKET_OFFSET, *PXENVIF_TRANSMITTER_PACKET_OFFSET;
-
 /*! \enum _XENVIF_VIF_STATISTIC
     \brief Interface statistics
 */
@@ -368,10 +319,10 @@ typedef enum _XENVIF_MAC_FILTER_LEVEL {
     \brief Type of callback (see \ref XENVIF_VIF_CALLBACK)
 */
 typedef enum _XENVIF_VIF_CALLBACK_TYPE {
-    /*! Return transmit side packets to the subscriber */
-    XENVIF_TRANSMITTER_RETURN_PACKETS = 0,
-    /*! Queue receive side packets at the subscriber */
-    XENVIF_RECEIVER_QUEUE_PACKETS,
+    /*! Return a transmit side packet to the subscriber */
+    XENVIF_TRANSMITTER_RETURN_PACKET = 0,
+    /*! Queue a receive side packet at the subscriber */
+    XENVIF_RECEIVER_QUEUE_PACKET,
     /*! Notify the subscriber of a MAC (link) state has change */
     XENVIF_MAC_STATE_CHANGE
 } XENVIF_VIF_CALLBACK_TYPE, *PXENVIF_VIF_CALLBACK_TYPE;
@@ -403,11 +354,19 @@ typedef VOID
     \param Type The callback type
     \param ... Additional paramaters required by \a Type
 
-    \b XENVIF_TRANSMITTER_RETURN_PACKETS:
-    \param Head The head of a chain of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_TRANSMITTER_RETURN_PACKET:
+    \param Cookie Cookie supplied to XENVIF_TRANSMITTER_QUEUE_PACKET
+    \param Completion Packet completion information
 
-    \b XENVIF_RECEIVER_QUEUE_PACKETS:
-    \param List List of XENVIF_TRANSMITTER_PACKET
+    \b XENVIF_RECEIVER_QUEUE_PACKET:
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param Flags Packet checksum flags
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Info Header information for the packet
+    \param Cookie Cookie that should be passed to XENVIF_RECEIVER_RETURN_PACKET method
 
     \b XENVIF_MAC_STATE_CHANGE:
     No additional arguments
@@ -468,74 +427,63 @@ typedef NTSTATUS
     OUT PULONGLONG              Value
     );
 
-/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKETS
-    \brief Return packets queues for receive by \ref XENVIF_VIF_CALLBACK
-    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKETS)
-
-    \param Interface The interface header
-    \param List List of \ref _XENVIF_RECEIVER_PACKET_V1
-*/
 typedef VOID
-(*XENVIF_VIF_RECEIVER_RETURN_PACKETS)(
+(*XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1)(
     IN  PINTERFACE  Interface,
     IN  PLIST_ENTRY List
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET
-    \brief Set byte offset of packet information relative to
-    XENVIF_TRANSMITTER_PACKET pointer.
-
-    See \ref _XENVIF_TRANSMITTER_PACKET_OFFSET.
+/*! \typedef XENVIF_VIF_RECEIVER_RETURN_PACKET
+    \brief Return packets queued for receive by \ref XENVIF_VIF_CALLBACK
+    (Type = \ref XENVIF_RECEIVER_QUEUE_PACKET)
 
     \param Interface The interface header
-    \param Type The offset type
-    \param Value The offset value
+    \param Cookie Cookie passed to XENVIF_RECEIVER_QUEUE_PACKET callback
 */
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET)(
-    IN  PINTERFACE                          Interface,
-    IN  XENVIF_TRANSMITTER_PACKET_OFFSET    Type,
-    IN  LONG_PTR                            Value
+typedef VOID
+(*XENVIF_VIF_RECEIVER_RETURN_PACKET)(
+    IN  PINTERFACE  Interface,
+    IN  PVOID       Cookie
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS
-    \brief Get the packet headers into supplied buffer
-
-    \param Interface The interface header
-    \param Packet The packet to acquire headers for.
-    \param Headers The buffer to receive headers.
-    \param Info The offsets into Headers for relevant headers
-*/
 typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS)(
-    IN  PINTERFACE                  Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet,
-    OUT PVOID                       Headers,
-    OUT PXENVIF_PACKET_INFO         Info
+(*XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2)(
+    IN  PINTERFACE                              Interface,
+    IN  struct _XENVIF_TRANSMITTER_PACKET_V2    *Packet,
+    OUT PVOID                                   Headers,
+    OUT PXENVIF_PACKET_INFO                     Info
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS
-    \brief Queue transmit side packets at the provider
-
-    \param Interface The interface header
-    \param Head The head of a chain of _XENVIF_TRANSMITTER_PACKET_V1
-*/
 typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS)(
-    IN  PINTERFACE                      Interface,
-    IN  PXENVIF_TRANSMITTER_PACKET_V1   Head
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
+    IN  PINTERFACE  Interface,
+    IN  PLIST_ENTRY List
     );
 
-/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2
-    \brief Queue transmit side packets at the provider
+/*! \typedef XENVIF_VIF_TRANSMITTER_QUEUE_PACKET
+    \brief Queue a packet at the provider's transmit side
 
     \param Interface The interface header
-    \param List List of _XENVIF_TRANSMITTER_PACKET_V2
+    \param Mdl The initial MDL of the packet
+    \param Offset The offset of the packet data in the initial MDL
+    \param Length The total length of the packet
+    \param OffloadOptions The requested offload options for this packet
+    \param MaximumSegmentSize The TCP MSS (used only if OffloadOptions.OffloadIpVersion[4|6]LargePacket is set)
+    \param TagControlInformation The VLAN TCI (used only if OffloadOptions.OffloadTagManipulation is set)
+    \param Hash Hash information for the packet
+    \param Cookie A cookie specified by the caller that will be passed to the XENVIF_TRANSMITTER_RETURN_PACKET callback
 */
-typedef NTSTATUS
-(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2)(
-    IN  PINTERFACE  Interface,
-    IN  PLIST_ENTRY List
+typedef VOID
+(*XENVIF_VIF_TRANSMITTER_QUEUE_PACKET)(
+    IN  PINTERFACE                  Interface,
+    IN  PMDL                        Mdl,
+    IN  ULONG                       Offset,
+    IN  ULONG                       Length,
+    IN  XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions,
+    IN  USHORT                      MaximumSegmentSize,
+    IN  USHORT                      TagControlInformation,
+    IN  PXENVIF_PACKET_HASH         Hash,
+    IN  PVOID                       Cookie
     );
 
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS
@@ -594,7 +542,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE
     \brief Query the maximum number of transmit side packets that can
-    be queued in the shared ring between frontend and backend
+    be queued in each shared ring between frontend and backend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -607,7 +555,7 @@ typedef VOID
 
 /*! \typedef XENVIF_VIF_RECEIVER_QUERY_RING_SIZE
     \brief Query the maximum number of receive side packets that can
-    be queued in the shared ring between backend and frontend
+    be queued in each shared ring between backend and frontend
 
     \param Interface The interface header
     \param Size Buffer to receive the maximum number of packets
@@ -744,22 +692,22 @@ typedef NTSTATUS
 DEFINE_GUID(GUID_XENVIF_VIF_INTERFACE, 
 0x76f279cd, 0xca11, 0x418b, 0x92, 0xe8, 0xc5, 0x7f, 0x77, 0xde, 0xe, 0x2e);
 
-/*! \struct _XENVIF_VIF_INTERFACE_V1
-    \brief VIF interface version 1
+/*! \struct _XENVIF_VIF_INTERFACE_V2
+    \brief VIF interface version 2
     \ingroup interfaces
 */
-struct _XENVIF_VIF_INTERFACE_V1 {
+struct _XENVIF_VIF_INTERFACE_V2 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_SET_PACKET_OFFSET        TransmitterSetPacketOffset;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS            TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -773,22 +721,23 @@ struct _XENVIF_VIF_INTERFACE_V1 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-/*! \struct _XENVIF_VIF_INTERFACE_V2
-    \brief VIF interface version 2
+/*! \struct _XENVIF_VIF_INTERFACE_V3
+    \brief VIF interface version 3
     \ingroup interfaces
 */
-struct _XENVIF_VIF_INTERFACE_V2 {
+struct _XENVIF_VIF_INTERFACE_V3 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKETS_V1           ReceiverReturnPacketsVersion1;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
+    XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS_V2    TransmitterGetPacketHeadersVersion2;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePacketsVersion2;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -802,23 +751,22 @@ struct _XENVIF_VIF_INTERFACE_V2 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-/*! \struct _XENVIF_VIF_INTERFACE_V3
-    \brief VIF interface version 3
+/*! \struct _XENVIF_VIF_INTERFACE_V4
+    \brief VIF interface version 4
     \ingroup interfaces
 */
-struct _XENVIF_VIF_INTERFACE_V3 {
+struct _XENVIF_VIF_INTERFACE_V4 {
     INTERFACE                                       Interface;
     XENVIF_VIF_ACQUIRE                              Acquire;
     XENVIF_VIF_RELEASE                              Release;
     XENVIF_VIF_ENABLE                               Enable;
     XENVIF_VIF_DISABLE                              Disable;
     XENVIF_VIF_QUERY_STATISTIC                      QueryStatistic;
-    XENVIF_VIF_RECEIVER_RETURN_PACKETS              ReceiverReturnPackets;
+    XENVIF_VIF_RECEIVER_RETURN_PACKET               ReceiverReturnPacket;
     XENVIF_VIF_RECEIVER_SET_OFFLOAD_OPTIONS         ReceiverSetOffloadOptions;
     XENVIF_VIF_RECEIVER_SET_BACKFILL_SIZE           ReceiverSetBackfillSize;
     XENVIF_VIF_RECEIVER_QUERY_RING_SIZE             ReceiverQueryRingSize;
-    XENVIF_VIF_TRANSMITTER_GET_PACKET_HEADERS       TransmitterGetPacketHeaders;
-    XENVIF_VIF_TRANSMITTER_QUEUE_PACKETS_V2         TransmitterQueuePackets;
+    XENVIF_VIF_TRANSMITTER_QUEUE_PACKET             TransmitterQueuePacket;
     XENVIF_VIF_TRANSMITTER_QUERY_OFFLOAD_OPTIONS    TransmitterQueryOffloadOptions;
     XENVIF_VIF_TRANSMITTER_QUERY_LARGE_PACKET_SIZE  TransmitterQueryLargePacketSize;
     XENVIF_VIF_TRANSMITTER_QUERY_RING_SIZE          TransmitterQueryRingSize;
@@ -832,7 +780,7 @@ struct _XENVIF_VIF_INTERFACE_V3 {
     XENVIF_VIF_MAC_QUERY_FILTER_LEVEL               MacQueryFilterLevel;
 };
 
-typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
+typedef struct _XENVIF_VIF_INTERFACE_V4 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTERFACE;
 
 /*! \def XENVIF_VIF
     \brief Macro at assist in method invocation
@@ -842,7 +790,7 @@ typedef struct _XENVIF_VIF_INTERFACE_V3 XENVIF_VIF_INTERFACE, *PXENVIF_VIF_INTER
 
 #endif  // _WINDLL
 
-#define XENVIF_VIF_INTERFACE_VERSION_MIN    1
-#define XENVIF_VIF_INTERFACE_VERSION_MAX    3
+#define XENVIF_VIF_INTERFACE_VERSION_MIN    2
+#define XENVIF_VIF_INTERFACE_VERSION_MAX    4
 
 #endif  // _XENVIF_INTERFACE_H
diff --git a/src/coinst/coinst.c b/src/coinst/coinst.c
index f60aa43..345b0c6 100644
--- a/src/coinst/coinst.c
+++ b/src/coinst/coinst.c
@@ -45,7 +45,6 @@
 #include <stdarg.h>
 #include <assert.h>
 #include <vif_interface.h>
-#include <cache_interface.h>
 
 #include <tcpip.h>
 #include <version.h>
diff --git a/src/xennet.inf b/src/xennet.inf
index 6c4c457..88aaac4 100644
--- a/src/xennet.inf
+++ b/src/xennet.inf
@@ -61,9 +61,9 @@ xennet_coinst_@MAJOR_VERSION@_@MINOR_VERSION@_@MICRO_VERSION@_@BUILD_NUMBER@.dll
 ; DisplayName		Section		DeviceID
 ; -----------		-------		--------
 
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_NET&REV_08000004
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0001&DEV_NET&REV_08000004
-%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0002&DEV_NET&REV_08000004
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@@VENDOR_DEVICE_ID@&DEV_NET&REV_08000006
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0001&DEV_NET&REV_08000006
+%XenNetDesc%		=XenNet_Inst,	XENVIF\VEN_@VENDOR_PREFIX@0002&DEV_NET&REV_08000006
 
 [XenNet_Inst] 
 Characteristics=0x84
diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index 2c35636..52c7b58 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -37,7 +37,6 @@
 #include <version.h>
 
 #include <vif_interface.h>
-#include <cache_interface.h>
 #include <store_interface.h>
 #include <suspend_interface.h>
 
@@ -66,7 +65,6 @@ typedef struct _PROPERTIES {
 
 struct _XENNET_ADAPTER {
     XENVIF_VIF_INTERFACE        VifInterface;
-    XENBUS_CACHE_INTERFACE      CacheInterface;
     XENBUS_STORE_INTERFACE      StoreInterface;
     XENBUS_SUSPEND_INTERFACE    SuspendInterface;
 
@@ -195,20 +193,46 @@ AdapterVifCallback(
     va_start(Arguments, Type);
 
     switch (Type) {
-    case XENVIF_TRANSMITTER_RETURN_PACKETS: {
-        PLIST_ENTRY List;
+    case XENVIF_TRANSMITTER_RETURN_PACKET: {
+        PVOID                                       Cookie;
+        PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion;
 
-        List = va_arg(Arguments, PLIST_ENTRY);
+        Cookie = va_arg(Arguments, PVOID);
+        Completion = va_arg(Arguments, PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO);
 
-        TransmitterCompletePackets(Adapter->Transmitter, List);
+        TransmitterReturnPacket(Adapter->Transmitter,
+                                Cookie,
+                                Completion);
         break;
     }
-    case XENVIF_RECEIVER_QUEUE_PACKETS: {
-        PLIST_ENTRY List;
-
-        List = va_arg(Arguments, PLIST_ENTRY);
-
-        ReceiverReceivePackets(Adapter->Receiver, List);
+    case XENVIF_RECEIVER_QUEUE_PACKET: {
+        PMDL                            Mdl;
+        ULONG                           Offset;
+        ULONG                           Length;
+        XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
+        USHORT                          MaximumSegmentSize;
+        USHORT                          TagControlInformation;
+        PXENVIF_PACKET_INFO             Info;
+        PVOID                           Cookie;
+
+        Mdl = va_arg(Arguments, PMDL);
+        Offset = va_arg(Arguments, ULONG);
+        Length = va_arg(Arguments, ULONG);
+        Flags = va_arg(Arguments, XENVIF_PACKET_CHECKSUM_FLAGS);
+        MaximumSegmentSize = va_arg(Arguments, USHORT);
+        TagControlInformation = va_arg(Arguments, USHORT);
+        Info = va_arg(Arguments, PXENVIF_PACKET_INFO);
+        Cookie = va_arg(Arguments, PVOID);
+
+        ReceiverQueuePacket(Adapter->Receiver,
+                            Mdl,
+                            Offset,
+                            Length,
+                            Flags,
+                            MaximumSegmentSize,
+                            TagControlInformation,
+                            Info,
+                            Cookie);
         break;
     }
     case XENVIF_MAC_STATE_CHANGE: {
@@ -1050,14 +1074,6 @@ AdapterGetVifInterface(
     return &Adapter->VifInterface;
 }
 
-PXENBUS_CACHE_INTERFACE
-AdapterGetCacheInterface(
-    IN  PXENNET_ADAPTER     Adapter
-    )
-{
-    return &Adapter->CacheInterface;
-}
-
 PXENNET_TRANSMITTER
 AdapterGetTransmitter(
     IN  PXENNET_ADAPTER     Adapter
@@ -1469,41 +1485,27 @@ AdapterEnable(
     )
 {
     NTSTATUS                status;
-    NDIS_STATUS             ndisStatus;
 
     ASSERT(!Adapter->Enabled);
 
-    status = XENBUS_CACHE(Acquire,
-                          &Adapter->CacheInterface);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
     status = XENBUS_STORE(Acquire,
                           &Adapter->StoreInterface);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
     status = XENBUS_SUSPEND(Acquire,
                             &Adapter->SuspendInterface);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail2;
 
     (VOID) AdapterSetDistribution(Adapter);
 
-    ndisStatus = TransmitterEnable(Adapter->Transmitter);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail4;
-
-    ndisStatus = ReceiverEnable(Adapter->Receiver);
-    if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail5;
-
     status = XENVIF_VIF(Enable,
                         &Adapter->VifInterface,
                         AdapterVifCallback,
                         Adapter);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail3;
 
     AdapterMediaStateChange(Adapter);
 
@@ -1511,22 +1513,13 @@ AdapterEnable(
 
     return NDIS_STATUS_SUCCESS;
 
-fail6:
-    ReceiverDisable(Adapter->Receiver);
-
-fail5:
-    TransmitterDisable(Adapter->Transmitter);
-
-fail4:
+fail3:
     AdapterClearDistribution(Adapter);
 
     XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
 
-fail3:
-    XENBUS_STORE(Release, &Adapter->StoreInterface);
-
 fail2:
-    XENBUS_CACHE(Release, &Adapter->CacheInterface);
+    XENBUS_STORE(Release, &Adapter->StoreInterface);
 
 fail1:
     return NDIS_STATUS_FAILURE;
@@ -1545,14 +1538,10 @@ AdapterDisable(
 
     AdapterMediaStateChange(Adapter);
 
-    ReceiverDisable(Adapter->Receiver);
-    TransmitterDisable(Adapter->Transmitter);
-
     AdapterClearDistribution(Adapter);
 
     XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
     XENBUS_STORE(Release, &Adapter->StoreInterface);
-    XENBUS_CACHE(Release, &Adapter->CacheInterface);
 }
 
 VOID
@@ -2779,22 +2768,13 @@ AdapterInitialize(
         goto fail2;
 
     status = __QueryInterface(DeviceObject,
-                              &GUID_XENBUS_CACHE_INTERFACE,
-                              XENBUS_CACHE_INTERFACE_VERSION_MAX,
-                              (PINTERFACE)&(*Adapter)->CacheInterface,
-                              sizeof(XENBUS_CACHE_INTERFACE),
-                              FALSE);
-    if (!NT_SUCCESS(status))
-        goto fail3;
-
-    status = __QueryInterface(DeviceObject,
                               &GUID_XENBUS_STORE_INTERFACE,
                               XENBUS_STORE_INTERFACE_VERSION_MAX,
                               (PINTERFACE)&(*Adapter)->StoreInterface,
                               sizeof(XENBUS_STORE_INTERFACE),
                               FALSE);
     if (!NT_SUCCESS(status))
-        goto fail4;
+        goto fail3;
 
     status = __QueryInterface(DeviceObject,
                               &GUID_XENBUS_SUSPEND_INTERFACE,
@@ -2803,42 +2783,42 @@ AdapterInitialize(
                               sizeof(XENBUS_SUSPEND_INTERFACE),
                               FALSE);
     if (!NT_SUCCESS(status))
-        goto fail5;
+        goto fail4;
 
     status = XENVIF_VIF(Acquire,
                         &(*Adapter)->VifInterface);
     if (!NT_SUCCESS(status))
-        goto fail6;
+        goto fail5;
 
     (*Adapter)->NdisAdapterHandle = Handle;
 
     ndisStatus = TransmitterInitialize(*Adapter, &(*Adapter)->Transmitter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail7;
+        goto fail6;
 
     ndisStatus = ReceiverInitialize(*Adapter, &(*Adapter)->Receiver);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail8;
+        goto fail7;
 
     ndisStatus = AdapterGetAdvancedSettings(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail9;
+        goto fail8;
 
     ndisStatus = AdapterSetRegistrationAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail10;
+        goto fail9;
 
     ndisStatus = AdapterSetGeneralAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail11;
+        goto fail10;
 
     ndisStatus = AdapterSetOffloadAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail12;
+        goto fail11;
 
     ndisStatus = AdapterSetHeaderDataSplitAttributes(*Adapter);
     if (ndisStatus != NDIS_STATUS_SUCCESS)
-        goto fail13;
+        goto fail12;
 
     RtlZeroMemory(&Dma, sizeof(NDIS_SG_DMA_DESCRIPTION));
     Dma.Header.Type = NDIS_OBJECT_TYPE_SG_DMA_DESCRIPTION;
@@ -2857,31 +2837,28 @@ AdapterInitialize(
 
     return NDIS_STATUS_SUCCESS;
 
-fail13:
 fail12:
 fail11:
 fail10:
 fail9:
+fail8:
     ReceiverTeardown((*Adapter)->Receiver);
     (*Adapter)->Receiver = NULL;
 
-fail8:
+fail7:
     TransmitterTeardown((*Adapter)->Transmitter);
     (*Adapter)->Transmitter = NULL;
 
-fail7:
+fail6:
     (*Adapter)->NdisAdapterHandle = NULL;
 
     XENVIF_VIF(Release, &(*Adapter)->VifInterface);
 
-fail6:
-    RtlZeroMemory(&(*Adapter)->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
-
 fail5:
-    RtlZeroMemory(&(*Adapter)->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
+    RtlZeroMemory(&(*Adapter)->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
 
 fail4:
-    RtlZeroMemory(&(*Adapter)->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE));
+    RtlZeroMemory(&(*Adapter)->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
 
 fail3:
     RtlZeroMemory(&(*Adapter)->VifInterface, sizeof(XENVIF_VIF_INTERFACE));
@@ -2914,7 +2891,6 @@ AdapterTeardown(
 
     RtlZeroMemory(&Adapter->SuspendInterface, sizeof(XENBUS_SUSPEND_INTERFACE));
     RtlZeroMemory(&Adapter->StoreInterface, sizeof(XENBUS_STORE_INTERFACE));
-    RtlZeroMemory(&Adapter->CacheInterface, sizeof(XENBUS_CACHE_INTERFACE));
     RtlZeroMemory(&Adapter->VifInterface, sizeof(XENVIF_VIF_INTERFACE));
 
     __AdapterFree(Adapter);
diff --git a/src/xennet/adapter.h b/src/xennet/adapter.h
index 5b2495a..5b0b338 100644
--- a/src/xennet/adapter.h
+++ b/src/xennet/adapter.h
@@ -76,12 +76,6 @@ AdapterGetVifInterface(
     IN  PXENNET_ADAPTER     Adapter
     );
 
-#include <cache_interface.h>
-extern PXENBUS_CACHE_INTERFACE
-AdapterGetCacheInterface(
-    IN  PXENNET_ADAPTER     Adapter
-    );
-
 #include "transmitter.h"
 extern PXENNET_TRANSMITTER
 AdapterGetTransmitter(
diff --git a/src/xennet/receiver.c b/src/xennet/receiver.c
index 8bfc10b..4a408c4 100644
--- a/src/xennet/receiver.c
+++ b/src/xennet/receiver.c
@@ -53,15 +53,23 @@ struct _XENNET_RECEIVER {
 #define RECEIVER_POOL_TAG       'RteN'
 #define IN_NDIS_MAX             1024
 
+typedef struct _NET_BUFFER_LIST_RESERVED {
+    PVOID   Cookie;
+} NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED;
+
+C_ASSERT(sizeof (NET_BUFFER_LIST_RESERVED) <= RTL_FIELD_SIZE(NET_BUFFER_LIST, MiniportReserved));
+
 static PNET_BUFFER_LIST
 __ReceiverAllocateNetBufferList(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PMDL                Mdl,
-    IN  ULONG               Offset,
-    IN  ULONG               Length
+    IN  PXENNET_RECEIVER        Receiver,
+    IN  PMDL                    Mdl,
+    IN  ULONG                   Offset,
+    IN  ULONG                   Length,
+    IN  PVOID                   Cookie
     )
 {
-    PNET_BUFFER_LIST        NetBufferList;
+    PNET_BUFFER_LIST            NetBufferList;
+    PNET_BUFFER_LIST_RESERVED   ListReserved;
 
     ASSERT3U(KeGetCurrentIrql(), ==, DISPATCH_LEVEL);
     KeAcquireSpinLockAtDpcLevel(&Receiver->Lock);
@@ -94,16 +102,27 @@ __ReceiverAllocateNetBufferList(
 
     KeReleaseSpinLockFromDpcLevel(&Receiver->Lock);
 
+    ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
+    ASSERT3P(ListReserved->Cookie, ==, NULL);
+    ListReserved->Cookie = Cookie;
+
     return NetBufferList;
 }        
 
-static VOID
+static PVOID
 __ReceiverReleaseNetBufferList(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PNET_BUFFER_LIST    NetBufferList,
-    IN  BOOLEAN             Cache
+    IN  PXENNET_RECEIVER        Receiver,
+    IN  PNET_BUFFER_LIST        NetBufferList,
+    IN  BOOLEAN                 Cache
     )
 {
+    PNET_BUFFER_LIST_RESERVED   ListReserved;
+    PVOID                       Cookie;
+
+    ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
+    Cookie = ListReserved->Cookie;
+    ListReserved->Cookie = NULL;
+
     if (Cache) {
         PNET_BUFFER_LIST    Old;
         PNET_BUFFER_LIST    New;
@@ -119,53 +138,29 @@ __ReceiverReleaseNetBufferList(
     } else {
         NdisFreeNetBufferList(NetBufferList);
     }
+
+    return Cookie;
 }
 
-static FORCEINLINE ULONG
-__ReceiverReturnNetBufferLists(
+static FORCEINLINE VOID
+__ReceiverReturnNetBufferList(
     IN  PXENNET_RECEIVER    Receiver,
     IN  PNET_BUFFER_LIST    NetBufferList,
     IN  BOOLEAN             Cache
     )
 {
     PXENVIF_VIF_INTERFACE   VifInterface;
-    LIST_ENTRY              List;
-    ULONG                   Count;
+    PVOID                   Cookie;
 
     VifInterface = AdapterGetVifInterface(Receiver->Adapter);
-    InitializeListHead(&List);
-
-    Count = 0;
-    while (NetBufferList != NULL) {
-        PNET_BUFFER_LIST        Next;
-        PNET_BUFFER             NetBuffer;
-        PMDL                    Mdl;
-        PXENVIF_RECEIVER_PACKET Packet;
 
-        Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
-        NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
-
-        NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
-        ASSERT3P(NET_BUFFER_NEXT_NB(NetBuffer), ==, NULL);
+    Cookie = __ReceiverReleaseNetBufferList(Receiver, NetBufferList, Cache);
 
-        Mdl = NET_BUFFER_FIRST_MDL(NetBuffer);
+    XENVIF_VIF(ReceiverReturnPacket,
+               VifInterface,
+               Cookie);
 
-        __ReceiverReleaseNetBufferList(Receiver, NetBufferList, Cache);
-
-        Packet = CONTAINING_RECORD(Mdl, XENVIF_RECEIVER_PACKET, Mdl);
-
-        InsertTailList(&List, &Packet->ListEntry);
-
-        Count++;
-        NetBufferList = Next;
-    }
-
-    if (Count != 0)
-        XENVIF_VIF(ReceiverReturnPackets,
-                   VifInterface,
-                   &List);
-
-    return Count;
+    (VOID) InterlockedIncrement(&Receiver->InNDIS);
 }
 
 static PNET_BUFFER_LIST
@@ -175,17 +170,23 @@ __ReceiverReceivePacket(
     IN  ULONG                                   Offset,
     IN  ULONG                                   Length,
     IN  XENVIF_PACKET_CHECKSUM_FLAGS            Flags,
-    IN  PXENVIF_PACKET_INFO                     Info
+    IN  USHORT                                  MaximumSegmentSize,
+    IN  USHORT                                  TagControlInformation,
+    IN  PXENVIF_PACKET_INFO                     Info,
+    IN  PVOID                                   Cookie
     )
 {
     PNET_BUFFER_LIST                            NetBufferList;
     PNET_BUFFER                                 NetBuffer;
     NDIS_TCP_IP_CHECKSUM_NET_BUFFER_LIST_INFO   csumInfo;
 
+    UNREFERENCED_PARAMETER(MaximumSegmentSize);
+
     NetBufferList = __ReceiverAllocateNetBufferList(Receiver,
                                                     Mdl,
                                                     Offset,
-                                                    Length);
+                                                    Length,
+                                                    Cookie);
     if (NetBufferList == NULL)
         goto fail1;
 
@@ -206,10 +207,10 @@ __ReceiverReceivePacket(
 
     NET_BUFFER_LIST_INFO(NetBufferList, TcpIpChecksumNetBufferListInfo) = (PVOID)(ULONG_PTR)csumInfo.Value;
 
-    if (Info->TagControlInformation != 0) {
+    if (TagControlInformation != 0) {
         NDIS_NET_BUFFER_LIST_8021Q_INFO Ieee8021QInfo;
 
-        UNPACK_TAG_CONTROL_INFORMATION(Info->TagControlInformation,
+        UNPACK_TAG_CONTROL_INFORMATION(TagControlInformation,
                                        Ieee8021QInfo.TagHeader.UserPriority,
                                        Ieee8021QInfo.TagHeader.CanonicalFormatId,
                                        Ieee8021QInfo.TagHeader.VlanId);
@@ -265,31 +266,26 @@ __ReceiverReceivePacket(
     return NetBufferList;
 
 fail2:
-    __ReceiverReleaseNetBufferList(Receiver, NetBufferList, TRUE);
+    (VOID) __ReceiverReleaseNetBufferList(Receiver, NetBufferList, TRUE);
 
 fail1:
     return NULL;
 }
 
 static VOID
-__ReceiverPushPackets(
+__ReceiverPushPacket(
     IN  PXENNET_RECEIVER    Receiver,
-    IN  PNET_BUFFER_LIST    NetBufferList,
-    IN  ULONG               Count,
-    IN  BOOLEAN             LowResources
+    IN  PNET_BUFFER_LIST    NetBufferList
     )
 {
     ULONG                   Flags;
     LONG                    InNDIS;
 
-    InNDIS = Receiver->InNDIS;
+    InNDIS = InterlockedIncrement(&Receiver->InNDIS);
 
     Flags = NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL;
-    if (LowResources) {
+    if (InNDIS > IN_NDIS_MAX)
         Flags |= NDIS_RECEIVE_FLAGS_RESOURCES;
-    } else {
-        InNDIS = __InterlockedAdd(&Receiver->InNDIS, Count);
-    }
 
     for (;;) {
         LONG    InNDISMax;
@@ -307,11 +303,11 @@ __ReceiverPushPackets(
     NdisMIndicateReceiveNetBufferLists(AdapterGetHandle(Receiver->Adapter),
                                        NetBufferList,
                                        NDIS_DEFAULT_PORT_NUMBER,
-                                       Count,
+                                       1,
                                        Flags);
 
-    if (LowResources)
-        (VOID) __ReceiverReturnNetBufferLists(Receiver, NetBufferList, FALSE);
+    if (Flags & NDIS_RECEIVE_FLAGS_RESOURCES)
+        (VOID) __ReceiverReturnNetBufferList(Receiver, NetBufferList, FALSE);
 }
 
 NDIS_STATUS
@@ -359,24 +355,6 @@ fail1:
     return status;
 }
 
-NDIS_STATUS
-ReceiverEnable (
-    IN  PXENNET_RECEIVER    Receiver
-    )
-{
-    UNREFERENCED_PARAMETER(Receiver);
-
-    return NDIS_STATUS_SUCCESS;
-}
-
-VOID
-ReceiverDisable (
-    IN  PXENNET_RECEIVER    Receiver
-    )
-{
-    UNREFERENCED_PARAMETER(Receiver);
-}
-
 VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
@@ -425,88 +403,54 @@ ReceiverReturnNetBufferLists(
     IN  ULONG               ReturnFlags
     )
 {
-    ULONG                   Count;
-
     UNREFERENCED_PARAMETER(ReturnFlags);
 
-    Count = __ReceiverReturnNetBufferLists(Receiver, NetBufferList, TRUE);
-    (VOID) __InterlockedSubtract(&Receiver->InNDIS, Count);
+    while (NetBufferList != NULL) {
+        PNET_BUFFER_LIST        Next;
+
+        Next = NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
+        NET_BUFFER_LIST_NEXT_NBL(NetBufferList) = NULL;
+
+        __ReceiverReturnNetBufferList(Receiver, NetBufferList, TRUE);
+
+        NetBufferList = Next;
+    }
 }
 
 VOID
-ReceiverReceivePackets(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PLIST_ENTRY         List
+ReceiverQueuePacket(
+    IN  PXENNET_RECEIVER                Receiver,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
     )
 {
-    PXENVIF_VIF_INTERFACE   VifInterface;
-    PNET_BUFFER_LIST        HeadNetBufferList;
-    PNET_BUFFER_LIST        *TailNetBufferList;
-    ULONG                   Count;
-    BOOLEAN                 LowResources;
+    PXENVIF_VIF_INTERFACE               VifInterface;
+    PNET_BUFFER_LIST                    NetBufferList;
 
     VifInterface = AdapterGetVifInterface(Receiver->Adapter);
-    LowResources = FALSE;
-
-again:
-    HeadNetBufferList = NULL;
-    TailNetBufferList = &HeadNetBufferList;
-    Count = 0;
-
-    while (!IsListEmpty(List)) {
-        PLIST_ENTRY                     ListEntry;
-        PXENVIF_RECEIVER_PACKET         Packet;
-        PXENVIF_PACKET_INFO             Info;
-        PMDL                            Mdl;
-        ULONG                           Offset;
-        ULONG                           Length;
-        XENVIF_PACKET_CHECKSUM_FLAGS    Flags;
-        PNET_BUFFER_LIST                NetBufferList;
-
-        if (!LowResources &&
-            Receiver->InNDIS + Count > IN_NDIS_MAX)
-            break;
-
-        ListEntry = RemoveHeadList(List);
-        ASSERT(ListEntry != List);
-
-        RtlZeroMemory(ListEntry, sizeof (LIST_ENTRY));
-
-        Packet = CONTAINING_RECORD(ListEntry, XENVIF_RECEIVER_PACKET, ListEntry);
-        Mdl = &Packet->Mdl;
-        Offset = Packet->Offset;
-        Length = Packet->Length;
-        Flags = Packet->Flags;
-        Info = Packet->Info;
-
-        NetBufferList = __ReceiverReceivePacket(Receiver, Mdl, Offset, Length, Flags, Info);
-
-        if (NetBufferList != NULL) {
-            *TailNetBufferList = NetBufferList;
-            TailNetBufferList = &NET_BUFFER_LIST_NEXT_NBL(NetBufferList);
-            Count++;
-        } else {
-            LIST_ENTRY  PacketList;
 
-            InitializeListHead(&PacketList);
-            InsertTailList(&PacketList, &Packet->ListEntry);
+    NetBufferList = __ReceiverReceivePacket(Receiver,
+                                            Mdl,
+                                            Offset,
+                                            Length,
+                                            Flags,
+                                            MaximumSegmentSize,
+                                            TagControlInformation,
+                                            Info,
+                                            Cookie);
 
-            XENVIF_VIF(ReceiverReturnPackets,
-                       VifInterface,
-                       &PacketList);
-        }
-    }
-
-    if (Count != 0) {
-        ASSERT(HeadNetBufferList != NULL);
-
-        __ReceiverPushPackets(Receiver, HeadNetBufferList, Count, LowResources);
-    }
-
-    if (!IsListEmpty(List)) {
-        ASSERT(!LowResources);
-        LowResources = TRUE;
-        goto again;
+    if (NetBufferList != NULL) {
+        __ReceiverPushPacket(Receiver, NetBufferList);
+    } else {
+        XENVIF_VIF(ReceiverReturnPacket,
+                   VifInterface,
+                   Cookie);
     }
 }
 
diff --git a/src/xennet/receiver.h b/src/xennet/receiver.h
index 33701a9..fbc0151 100644
--- a/src/xennet/receiver.h
+++ b/src/xennet/receiver.h
@@ -43,16 +43,6 @@ ReceiverInitialize(
     OUT PXENNET_RECEIVER    *Receiver
     );
 
-extern NDIS_STATUS
-ReceiverEnable(
-    IN  PXENNET_RECEIVER    Receiver
-    );
-
-extern VOID
-ReceiverDisable(
-    IN  PXENNET_RECEIVER    Receiver
-    );
-
 extern VOID
 ReceiverTeardown(
     IN  PXENNET_RECEIVER    Receiver
@@ -66,9 +56,16 @@ ReceiverReturnNetBufferLists(
     );
 
 extern VOID
-ReceiverReceivePackets(
-    IN  PXENNET_RECEIVER    Receiver,
-    IN  PLIST_ENTRY         List
+ReceiverQueuePacket(
+    IN  PXENNET_RECEIVER                Receiver,
+    IN  PMDL                            Mdl,
+    IN  ULONG                           Offset,
+    IN  ULONG                           Length,
+    IN  XENVIF_PACKET_CHECKSUM_FLAGS    Flags,
+    IN  USHORT                          MaximumSegmentSize,
+    IN  USHORT                          TagControlInformation,
+    IN  PXENVIF_PACKET_INFO             Info,
+    IN  PVOID                           Cookie
     );
 
 extern PXENVIF_VIF_OFFLOAD_OPTIONS
diff --git a/src/xennet/transmitter.c b/src/xennet/transmitter.c
index 8c80c7e..5574b9c 100644
--- a/src/xennet/transmitter.c
+++ b/src/xennet/transmitter.c
@@ -33,7 +33,6 @@
 #include "transmitter.h"
 #include "adapter.h"
 #include <vif_interface.h>
-#include <cache_interface.h>
 #include <tcpip.h>
 #include "dbg_print.h"
 #include "assert.h"
@@ -42,98 +41,9 @@ struct _XENNET_TRANSMITTER {
     PXENNET_ADAPTER             Adapter;
     XENVIF_VIF_OFFLOAD_OPTIONS  OffloadOptions;
     KSPIN_LOCK                  Lock;
-    PXENBUS_CACHE               PacketCache;
-    PXENBUS_CACHE               BufferCache;
 };
 
-#define XENNET_PACKET_CACHE_MIN     32
 #define TRANSMITTER_POOL_TAG        'TteN'
-#define BUFFER_CACHE_ITEM_SIZE      512
-#define MAX_HEADERS_LENGTH          (sizeof(IP_ADDRESS) + sizeof(IP_ADDRESS) + sizeof(USHORT) + sizeof(USHORT))
-
-static NTSTATUS
-__TransmitterPacketCtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-    return STATUS_SUCCESS;
-}
-
-static VOID
-__TransmitterPacketDtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-}
-
-static VOID
-__TransmitterPacketAcquireLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-    KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock);
-}
-
-static VOID
-__TransmitterPacketReleaseLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-#pragma prefast(suppress:26110)
-    KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock);
-}
-
-static NTSTATUS
-__TransmitterBufferCtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-    return STATUS_SUCCESS;
-}
-
-static VOID
-__TransmitterBufferDtor(
-    IN  PVOID       Argument,
-    IN  PVOID       Object
-    )
-{
-    UNREFERENCED_PARAMETER(Argument);
-    UNREFERENCED_PARAMETER(Object);
-}
-
-static VOID
-__TransmitterBufferAcquireLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-    KeAcquireSpinLockAtDpcLevel(&Transmitter->Lock);
-}
-
-static VOID
-__TransmitterBufferReleaseLock(
-    IN  PVOID           Argument
-    )
-{
-    PXENNET_TRANSMITTER Transmitter = Argument;
-
-#pragma prefast(suppress:26110)
-    KeReleaseSpinLockFromDpcLevel(&Transmitter->Lock);
-}
 
 NDIS_STATUS
 TransmitterInitialize (
@@ -141,10 +51,13 @@ TransmitterInitialize (
     OUT PXENNET_TRANSMITTER *Transmitter
     )
 {
+    NTSTATUS                status;
+
     *Transmitter = ExAllocatePoolWithTag(NonPagedPool,
                                          sizeof(XENNET_TRANSMITTER),
                                          TRANSMITTER_POOL_TAG);
 
+    status = STATUS_NO_MEMORY;
     if (*Transmitter == NULL)
         goto fail1;
 
@@ -157,84 +70,12 @@ TransmitterInitialize (
     return NDIS_STATUS_SUCCESS;
 
 fail1:
-    return NDIS_STATUS_FAILURE;
-}
-
-NDIS_STATUS
-TransmitterEnable (
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-    NTSTATUS                status;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    status = XENBUS_CACHE(Create,
-                          CacheInterface,
-                          "packet_cache",
-                          sizeof(XENVIF_TRANSMITTER_PACKET),
-                          XENNET_PACKET_CACHE_MIN,
-                          __TransmitterPacketCtor,
-                          __TransmitterPacketDtor,
-                          __TransmitterPacketAcquireLock,
-                          __TransmitterPacketReleaseLock,
-                          Transmitter,
-                          &Transmitter->PacketCache);
-    if (!NT_SUCCESS(status))
-        goto fail1;
-
-    status = XENBUS_CACHE(Create,
-                          CacheInterface,
-                          "buffer_cache",
-                          BUFFER_CACHE_ITEM_SIZE,
-                          0,
-                          __TransmitterBufferCtor,
-                          __TransmitterBufferDtor,
-                          __TransmitterBufferAcquireLock,
-                          __TransmitterBufferReleaseLock,
-                          Transmitter,
-                          &Transmitter->BufferCache);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    return NDIS_STATUS_SUCCESS;
-
-fail2:
-    Error("fail2\n");
-
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 Transmitter->PacketCache);
-    Transmitter->PacketCache = NULL;
-
-fail1:
     Error("fail1\n (%08x)", status);
 
     return NDIS_STATUS_FAILURE;
 }
 
 VOID
-TransmitterDisable (
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 Transmitter->BufferCache);
-    Transmitter->BufferCache = NULL;
-
-    XENBUS_CACHE(Destroy,
-                 CacheInterface,
-                 Transmitter->PacketCache);
-    Transmitter->PacketCache = NULL;
-}
-
-VOID
 TransmitterTeardown(
     IN  PXENNET_TRANSMITTER Transmitter
     )
@@ -247,74 +88,6 @@ TransmitterTeardown(
     ExFreePoolWithTag(Transmitter, TRANSMITTER_POOL_TAG);
 }
 
-static FORCEINLINE PXENVIF_TRANSMITTER_PACKET
-__TransmitterGetPacket(
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    return XENBUS_CACHE(Get,
-                        CacheInterface,
-                        Transmitter->PacketCache,
-                        FALSE);
-}
-
-static FORCEINLINE VOID
-__TransmitterPutPacket(
-    IN  PXENNET_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    RtlZeroMemory(Packet, sizeof(XENVIF_TRANSMITTER_PACKET));
-
-    XENBUS_CACHE(Put,
-                 CacheInterface,
-                 Transmitter->PacketCache,
-                 Packet,
-                 FALSE);
-}
-
-static FORCEINLINE PVOID
-__TransmitterGetBuffer(
-    IN  PXENNET_TRANSMITTER Transmitter
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    return XENBUS_CACHE(Get,
-                        CacheInterface,
-                        Transmitter->BufferCache,
-                        FALSE);
-}
-
-static FORCEINLINE VOID
-__TransmitterPutBuffer(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PVOID               Buffer
-    )
-{
-    PXENBUS_CACHE_INTERFACE CacheInterface;
-
-    CacheInterface = AdapterGetCacheInterface(Transmitter->Adapter);
-
-    RtlZeroMemory(Buffer, BUFFER_CACHE_ITEM_SIZE);
-
-    XENBUS_CACHE(Put,
-                 CacheInterface,
-                 Transmitter->BufferCache,
-                 Buffer,
-                 FALSE);
-}
-
 typedef struct _NET_BUFFER_LIST_RESERVED {
     LONG    Reference;
 } NET_BUFFER_LIST_RESERVED, *PNET_BUFFER_LIST_RESERVED;
@@ -348,34 +121,22 @@ __TransmitterCompleteNetBufferList(
 }
 
 static VOID
-__TransmitterCompletePackets(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PLIST_ENTRY         List,
-    IN  NDIS_STATUS         Status
+__TransmitterReturnPacket(
+    IN  PXENNET_TRANSMITTER     Transmitter,
+    IN  PVOID                   Cookie,
+    IN  NDIS_STATUS             Status
     )
 {
-    while (!IsListEmpty(List)) {
-        PLIST_ENTRY                 ListEntry;
-        PXENVIF_TRANSMITTER_PACKET  Packet;
-        PNET_BUFFER_LIST            NetBufferList;
-        PNET_BUFFER_LIST_RESERVED   ListReserved;
+    PNET_BUFFER_LIST            NetBufferList = Cookie;
+    PNET_BUFFER_LIST_RESERVED   ListReserved;
 
-        ListEntry = RemoveHeadList(List);
-        ASSERT3P(ListEntry, !=, List);
+    ASSERT(NetBufferList != NULL);
 
-        Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
+    ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
 
-        NetBufferList = Packet->Cookie;
-        ASSERT(NetBufferList != NULL);
-
-        ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
-
-        ASSERT(ListReserved->Reference != 0);
-        if (InterlockedDecrement(&ListReserved->Reference) == 0)
-            __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, Status);
-
-        __TransmitterPutPacket(Transmitter, Packet);
-    }
+    ASSERT(ListReserved->Reference != 0);
+    if (InterlockedDecrement(&ListReserved->Reference) == 0)
+        __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, Status);
 }
 
 static VOID
@@ -444,127 +205,6 @@ __TransmitterOffloadOptions(
     }
 }
 
-static ULONG
-__Hash(
-    IN  PVOID                       Buffer,
-    IN  ULONG                       Length
-    )
-{
-    PUCHAR                          Array = (PUCHAR)Buffer;
-    ULONG                           Accumulator;
-    ULONG                           Index;
-
-    Accumulator = 0;
-
-    for (Index = 0; Index < Length; ++Index) {
-        ULONG   Overflow;
-
-        Accumulator = (Accumulator << 4) + Array[Index];
-
-        Overflow = Accumulator & 0x00000f00;
-        if (Overflow != 0) {
-            Accumulator ^= Overflow >> 8;
-            Accumulator ^= Overflow;
-        }
-    }
-
-    return Accumulator;
-}
-
-static ULONG
-__TransmitterCalculateHash(
-    IN  PVOID                       Buffer,
-    IN  PXENVIF_PACKET_INFO         Info
-    )
-{
-    UCHAR       Headers[MAX_HEADERS_LENGTH];
-    PUCHAR      Ptr;
-
-    Ptr = (PUCHAR)Headers;
-
-    if (Info->IpHeader.Length) {
-        PIP_HEADER  Ip = (PIP_HEADER)((PUCHAR)Buffer + Info->IpHeader.Offset);
-
-        switch (Ip->Version) {
-        case 4:
-            RtlCopyMemory(Ptr, &Ip->Version4.SourceAddress, sizeof(IPV4_ADDRESS));
-            Ptr += sizeof(IPV4_ADDRESS);
-            RtlCopyMemory(Ptr, &Ip->Version4.DestinationAddress, sizeof(IPV4_ADDRESS));
-            Ptr += sizeof(IPV4_ADDRESS);
-            break;
-        case 6:
-            RtlCopyMemory(Ptr, &Ip->Version6.SourceAddress, sizeof(IPV6_ADDRESS));
-            Ptr += sizeof(IPV6_ADDRESS);
-            RtlCopyMemory(Ptr, &Ip->Version6.DestinationAddress, sizeof(IPV6_ADDRESS));
-            Ptr += sizeof(IPV6_ADDRESS);
-            break;
-        default:
-            break;
-        }
-    }
-
-    if (Info->TcpHeader.Length) {
-        PTCP_HEADER Tcp = (PTCP_HEADER)((PUCHAR)Buffer + Info->TcpHeader.Offset);
-
-        RtlCopyMemory(Ptr, &Tcp->SourcePort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-        RtlCopyMemory(Ptr, &Tcp->DestinationPort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-    } else if (Info->UdpHeader.Length) {
-        PUDP_HEADER Udp = (PUDP_HEADER)((PUCHAR)Buffer + Info->UdpHeader.Offset);
-
-        RtlCopyMemory(Ptr, &Udp->SourcePort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-        RtlCopyMemory(Ptr, &Udp->DestinationPort, sizeof(USHORT));
-        Ptr += sizeof(USHORT);
-    }
-
-    if (Ptr == (PUCHAR)Headers)
-        return 0;
-
-    return __Hash(Headers, (ULONG)((ULONG_PTR)Ptr - (ULONG_PTR)Headers));
-}
-
-static ULONG
-__TransmitterGetHash(
-    IN  PXENNET_TRANSMITTER         Transmitter,
-    IN  PXENVIF_TRANSMITTER_PACKET  Packet
-    )
-{
-    PXENVIF_VIF_INTERFACE           VifInterface;
-    ULONG                           Hash;
-    XENVIF_PACKET_INFO              Info;
-    PVOID                           Buffer;
-    NTSTATUS                        status;
-
-    Hash = 0;
-    VifInterface = AdapterGetVifInterface(Transmitter->Adapter);
-
-    Buffer = __TransmitterGetBuffer(Transmitter);
-    if (Buffer == NULL)
-        goto fail1;
-
-    RtlZeroMemory(&Info, sizeof(XENVIF_PACKET_INFO));
-
-    status = XENVIF_VIF(TransmitterGetPacketHeaders,
-                        VifInterface,
-                        Packet,
-                        Buffer,
-                        &Info);
-    if (!NT_SUCCESS(status))
-        goto fail2;
-
-    Hash = __TransmitterCalculateHash(Buffer, &Info);
-
-    __TransmitterPutBuffer(Transmitter, Buffer);
-    return Hash;
-
-fail2:
-    __TransmitterPutBuffer(Transmitter, Buffer);
-fail1:
-    return 0;
-}
-
 VOID
 TransmitterSendNetBufferLists(
     IN  PXENNET_TRANSMITTER     Transmitter,
@@ -603,41 +243,30 @@ TransmitterSendNetBufferLists(
                                     &TagControlInformation,
                                     &MaximumSegmentSize);
 
+        OffloadOptions.Value &= Transmitter->OffloadOptions.Value;
+
         ListReserved = (PNET_BUFFER_LIST_RESERVED)NET_BUFFER_LIST_MINIPORT_RESERVED(NetBufferList);
         RtlZeroMemory(ListReserved, sizeof (NET_BUFFER_LIST_RESERVED));
 
         NetBuffer = NET_BUFFER_LIST_FIRST_NB(NetBufferList);
         while (NetBuffer != NULL) {
-            PXENVIF_TRANSMITTER_PACKET  Packet;
-
-            Packet = __TransmitterGetPacket(Transmitter);
-            if (Packet == NULL) {
-                while (ListReserved->Reference--) {
-                    PLIST_ENTRY     ListEntry;
-
-                    ListEntry = RemoveTailList(&List);
-                    ASSERT3P(ListEntry, !=, &List);
-
-                    Packet = CONTAINING_RECORD(ListEntry, XENVIF_TRANSMITTER_PACKET, ListEntry);
-
-                    __TransmitterPutPacket(Transmitter, Packet);
-                }
-                __TransmitterCompleteNetBufferList(Transmitter, NetBufferList, NDIS_STATUS_NOT_ACCEPTED);
-                break;
-            }
+            PVOID               Cookie = NetBufferList;
+            XENVIF_PACKET_HASH  Hash;
 
             ListReserved->Reference++;
 
-            Packet->Cookie = NetBufferList;
-            Packet->Send.OffloadOptions.Value = OffloadOptions.Value & Transmitter->OffloadOptions.Value;
-            Packet->Send.MaximumSegmentSize = MaximumSegmentSize;
-            Packet->Send.TagControlInformation = TagControlInformation;
-            Packet->Mdl = NET_BUFFER_CURRENT_MDL(NetBuffer);
-            Packet->Length = NET_BUFFER_DATA_LENGTH(NetBuffer);
-            Packet->Offset = NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer);
-            Packet->Value = __TransmitterGetHash(Transmitter, Packet);
+            Hash.Algorithm = XENVIF_PACKET_HASH_ALGORITHM_NONE;
 
-            InsertTailList(&List, &Packet->ListEntry);
+            XENVIF_VIF(TransmitterQueuePacket,
+                       AdapterGetVifInterface(Transmitter->Adapter),
+                       NET_BUFFER_CURRENT_MDL(NetBuffer),
+                       NET_BUFFER_CURRENT_MDL_OFFSET(NetBuffer),
+                       NET_BUFFER_DATA_LENGTH(NetBuffer),
+                       OffloadOptions,
+                       MaximumSegmentSize,
+                       TagControlInformation,
+                       &Hash,
+                       Cookie);
 
             NetBuffer = NET_BUFFER_NEXT_NB(NetBuffer);
         }
@@ -645,26 +274,25 @@ TransmitterSendNetBufferLists(
         NetBufferList = ListNext;
     }
 
-    if (!IsListEmpty(&List)) {
-        NTSTATUS    status; 
-
-        status = XENVIF_VIF(TransmitterQueuePackets,
-                            AdapterGetVifInterface(Transmitter->Adapter),
-                            &List);
-        if (!NT_SUCCESS(status))
-            __TransmitterCompletePackets(Transmitter, &List, NDIS_STATUS_NOT_ACCEPTED);
-    }
-
     NDIS_LOWER_IRQL(Irql, DISPATCH_LEVEL);
 }
 
 VOID
-TransmitterCompletePackets(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PLIST_ENTRY         List
+TransmitterReturnPacket(
+    IN  PXENNET_TRANSMITTER                         Transmitter,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
     )
 {
-    __TransmitterCompletePackets(Transmitter, List, NDIS_STATUS_SUCCESS);
+    NDIS_STATUS                                     Status;
+
+    UNREFERENCED_PARAMETER(Completion);
+
+    Status = (Completion->Status == XENVIF_TRANSMITTER_PACKET_OK) ?
+             NDIS_STATUS_SUCCESS :
+             NDIS_STATUS_NOT_ACCEPTED;
+
+    __TransmitterReturnPacket(Transmitter, Cookie, Status);
 }
 
 PXENVIF_VIF_OFFLOAD_OPTIONS
diff --git a/src/xennet/transmitter.h b/src/xennet/transmitter.h
index 363b91e..585c5ac 100644
--- a/src/xennet/transmitter.h
+++ b/src/xennet/transmitter.h
@@ -43,16 +43,6 @@ TransmitterInitialize(
     OUT PXENNET_TRANSMITTER *Transmitter
     );
 
-extern NDIS_STATUS
-TransmitterEnable(
-    IN  PXENNET_TRANSMITTER Transmitter
-    );
-
-extern VOID
-TransmitterDisable(
-    IN  PXENNET_TRANSMITTER Transmitter
-    );
-
 extern VOID
 TransmitterTeardown(
     IN  PXENNET_TRANSMITTER Transmitter
@@ -67,9 +57,10 @@ TransmitterSendNetBufferLists (
     );
 
 extern VOID
-TransmitterCompletePackets(
-    IN  PXENNET_TRANSMITTER Transmitter,
-    IN  PLIST_ENTRY         List
+TransmitterReturnPacket(
+    IN  PXENNET_TRANSMITTER                         Transmitter,
+    IN  PVOID                                       Cookie,
+    IN  PXENVIF_TRANSMITTER_PACKET_COMPLETION_INFO  Completion
     );
 
 extern PXENVIF_VIF_OFFLOAD_OPTIONS
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 16:08:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 16:08:12 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4su2-00057j-1N; Fri, 04 Dec 2015 16:08:10 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4su1-00057e-49
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 16:08:09 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	AD/F7-28791-86AB1665; Fri, 04 Dec 2015 16:08:08 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1449245286!8735818!1
X-Originating-IP: [209.85.160.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30132 invoked from network); 4 Dec 2015 16:08:07 -0000
Received: from mail-yk0-f181.google.com (HELO mail-yk0-f181.google.com)
	(209.85.160.181)
	by server-16.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 16:08:07 -0000
Received: by ykba77 with SMTP id a77so128760618ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 08:08:06 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=N3RL2OL+sLCmL8CuZtVyZQr8tbn3w5GZg/dj+T1B2QE=;
	b=HWliPgSKv7qqoVlK7VtGNF2CY7kuz1B0AoY5cE5WmA8gb4KOz0jFNnjb08sXJRN7Ni
	POfeV6qVaRPpb+x+AQUwULhz2E1Lj4L15BL2IBMKy2EfPb9TiXojo5s+Pn29dhT0Ps+N
	gZBcHcgdU9+ohE0bgy7/2bHbBZA4ziofKkzhOqpW6X6AmCAKQeo6rlYxGxizVd8LIYfF
	D0fzkXxsi9u+c0ocoURGcNP6kB9bogzDqxsaDRnl7j4zFfcHu2jh8V6tInbi/5Ogu+qP
	2nVaICtMFsmIH89ce97116ciRCmf1EcioF7lxUaABrKZuD5RTmfF38DImt5x9kmnypkD
	9g8g==
X-Received: by 10.129.31.195 with SMTP id f186mr11423788ywf.204.1449245286467; 
	Fri, 04 Dec 2015 08:08:06 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	z133sm9352317ywz.14.2015.12.04.08.08.05
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 08:08:05 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 16:07:51 +0000
Message-Id: <1449245271-6540-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Skip interface checks on non-active FDO
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If the non-active FDO powers down before the active one then we end up
with the BUG_ONs firing erroneously.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index e889871..00801c9 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3206,6 +3206,9 @@ FdoS3ToS4(
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     ASSERT3U(__FdoGetSystemPowerState(Fdo), ==, PowerSystemSleeping3);
 
+    if (!__FdoIsActive(Fdo))
+        goto not_active;
+
     BUG_ON(SuspendGetReferences(Fdo->SuspendContext) != 0);
     BUG_ON(SharedInfoGetReferences(Fdo->SharedInfoContext) != 0);
     BUG_ON(EvtchnGetReferences(Fdo->EvtchnContext) != 0);
@@ -3217,6 +3220,7 @@ FdoS3ToS4(
     BUG_ON(UnplugGetReferences(Fdo->UnplugContext) != 0);
     BUG_ON(BalloonGetReferences(Fdo->BalloonContext) != 0);
 
+not_active:
     __FdoSetSystemPowerState(Fdo, PowerSystemHibernate);
 
     Trace("<====\n");
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 16:08:12 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 16:08:12 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4su2-00057j-1N; Fri, 04 Dec 2015 16:08:10 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a4su1-00057e-49
	for win-pv-devel@lists.xenproject.org; Fri, 04 Dec 2015 16:08:09 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	AD/F7-28791-86AB1665; Fri, 04 Dec 2015 16:08:08 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1449245286!8735818!1
X-Originating-IP: [209.85.160.181]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 30132 invoked from network); 4 Dec 2015 16:08:07 -0000
Received: from mail-yk0-f181.google.com (HELO mail-yk0-f181.google.com)
	(209.85.160.181)
	by server-16.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 16:08:07 -0000
Received: by ykba77 with SMTP id a77so128760618ykb.2
	for <win-pv-devel@lists.xenproject.org>;
	Fri, 04 Dec 2015 08:08:06 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=N3RL2OL+sLCmL8CuZtVyZQr8tbn3w5GZg/dj+T1B2QE=;
	b=HWliPgSKv7qqoVlK7VtGNF2CY7kuz1B0AoY5cE5WmA8gb4KOz0jFNnjb08sXJRN7Ni
	POfeV6qVaRPpb+x+AQUwULhz2E1Lj4L15BL2IBMKy2EfPb9TiXojo5s+Pn29dhT0Ps+N
	gZBcHcgdU9+ohE0bgy7/2bHbBZA4ziofKkzhOqpW6X6AmCAKQeo6rlYxGxizVd8LIYfF
	D0fzkXxsi9u+c0ocoURGcNP6kB9bogzDqxsaDRnl7j4zFfcHu2jh8V6tInbi/5Ogu+qP
	2nVaICtMFsmIH89ce97116ciRCmf1EcioF7lxUaABrKZuD5RTmfF38DImt5x9kmnypkD
	9g8g==
X-Received: by 10.129.31.195 with SMTP id f186mr11423788ywf.204.1449245286467; 
	Fri, 04 Dec 2015 08:08:06 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	z133sm9352317ywz.14.2015.12.04.08.08.05
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Fri, 04 Dec 2015 08:08:05 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Fri,  4 Dec 2015 16:07:51 +0000
Message-Id: <1449245271-6540-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Skip interface checks on non-active FDO
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

If the non-active FDO powers down before the active one then we end up
with the BUG_ONs firing erroneously.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/fdo.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index e889871..00801c9 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3206,6 +3206,9 @@ FdoS3ToS4(
     ASSERT3U(KeGetCurrentIrql(), ==, PASSIVE_LEVEL);
     ASSERT3U(__FdoGetSystemPowerState(Fdo), ==, PowerSystemSleeping3);
 
+    if (!__FdoIsActive(Fdo))
+        goto not_active;
+
     BUG_ON(SuspendGetReferences(Fdo->SuspendContext) != 0);
     BUG_ON(SharedInfoGetReferences(Fdo->SharedInfoContext) != 0);
     BUG_ON(EvtchnGetReferences(Fdo->EvtchnContext) != 0);
@@ -3217,6 +3220,7 @@ FdoS3ToS4(
     BUG_ON(UnplugGetReferences(Fdo->UnplugContext) != 0);
     BUG_ON(BalloonGetReferences(Fdo->BalloonContext) != 0);
 
+not_active:
     __FdoSetSystemPowerState(Fdo, PowerSystemHibernate);
 
     Trace("<====\n");
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 18:03:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 18:03:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4uhD-0002Kz-LH; Fri, 04 Dec 2015 18:03:03 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <lars.kurth.xen@gmail.com>)
	id 1a4uhC-0002Kl-Pj; Fri, 04 Dec 2015 18:03:02 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	4D/90-10715-555D1665; Fri, 04 Dec 2015 18:03:01 +0000
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1449252180!7927255!1
X-Originating-IP: [74.125.82.50]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2371 invoked from network); 4 Dec 2015 18:03:01 -0000
Received: from mail-wm0-f50.google.com (HELO mail-wm0-f50.google.com)
	(74.125.82.50)
	by server-4.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 18:03:01 -0000
Received: by wmuu63 with SMTP id u63so71978207wmu.0;
	Fri, 04 Dec 2015 10:03:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:content-type:content-transfer-encoding:subject:message-id:date
	:to:mime-version;
	bh=F0EoSnLTgIxLpMBHCuNugwngcM7uuZQxAtavut0+C8U=;
	b=vX2GqqHr52hS30GFeGxmGWHBj0Xq8VlxQt9kVSiEx2GHASKfXmzHcI12Wbn7Y1MIW+
	cKX3XISkeuFc2O33yjkjTYQFVFd2XRF4cSjJBhabmeVwtWCyx3s2FE9ds5GLwNDBtEPM
	yw9YXp+PeZYVceRWlqIK7AErrmkI9u3XLJLvcs52qegZjyaPIPbIC7BHdDNJKKax4rjH
	FOgYgGoQM2FHsS/LaxLcxkLstzmBtKNE9XckoN6aQCN0ED9sxaNWHpykBkq6hhW4meMo
	l7d8A+Ueu4Btrt4rtdZ+8ff14FGXxml/gpkAqCEVnss2q3rGD5NQ52Gv+Nyx6hIFWaOd
	FYGg==
X-Received: by 10.28.87.84 with SMTP id l81mr6959581wmb.22.1449252180492;
	Fri, 04 Dec 2015 10:03:00 -0800 (PST)
Received: from [192.168.0.9] (97e5a080.skybroadband.com. [151.229.160.128])
	by smtp.gmail.com with ESMTPSA id 67sm4530930wmm.6.2015.12.04.10.02.59
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 04 Dec 2015 10:02:59 -0800 (PST)
From: Lars Kurth <lars.kurth.xen@gmail.com>
Message-Id: <38DCD10E-1999-4E9B-8D96-AF4E54A233E8@gmail.com>
Date: Fri, 4 Dec 2015 18:02:58 +0000
To: Xen-devel <xen-devel@lists.xenproject.org>, mirageos-devel@xenproject.org,
	xen-api@lists.xenproject.org, Win-pv-devel@lists.xenproject.org,
	embedded-pv-devel@lists.xenproject.org
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
X-Mailer: Apple Mail (2.2104)
Subject: [win-pv-devel] Save the Date: Xen Project Hackathon 2016 (Location:
	Cambridge UK, Dates 18-19 April 2016)
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi everyone,
I am pleased to inform you that ARM will host the 2016 Hackathon at their site in Cambridge, UK. The Hackathon will take place April 18 & 19. I will put together more information (wiki, blog posts, ...) in the new year!
Best Regards
Lars
_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Fri Dec 04 18:03:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Fri, 04 Dec 2015 18:03:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a4uhD-0002Kz-LH; Fri, 04 Dec 2015 18:03:03 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <lars.kurth.xen@gmail.com>)
	id 1a4uhC-0002Kl-Pj; Fri, 04 Dec 2015 18:03:02 +0000
Received: from [193.109.254.147] by server-4.bemta-14.messagelabs.com id
	4D/90-10715-555D1665; Fri, 04 Dec 2015 18:03:01 +0000
X-Env-Sender: lars.kurth.xen@gmail.com
X-Msg-Ref: server-4.tower-27.messagelabs.com!1449252180!7927255!1
X-Originating-IP: [74.125.82.50]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 2371 invoked from network); 4 Dec 2015 18:03:01 -0000
Received: from mail-wm0-f50.google.com (HELO mail-wm0-f50.google.com)
	(74.125.82.50)
	by server-4.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 4 Dec 2015 18:03:01 -0000
Received: by wmuu63 with SMTP id u63so71978207wmu.0;
	Fri, 04 Dec 2015 10:03:00 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:content-type:content-transfer-encoding:subject:message-id:date
	:to:mime-version;
	bh=F0EoSnLTgIxLpMBHCuNugwngcM7uuZQxAtavut0+C8U=;
	b=vX2GqqHr52hS30GFeGxmGWHBj0Xq8VlxQt9kVSiEx2GHASKfXmzHcI12Wbn7Y1MIW+
	cKX3XISkeuFc2O33yjkjTYQFVFd2XRF4cSjJBhabmeVwtWCyx3s2FE9ds5GLwNDBtEPM
	yw9YXp+PeZYVceRWlqIK7AErrmkI9u3XLJLvcs52qegZjyaPIPbIC7BHdDNJKKax4rjH
	FOgYgGoQM2FHsS/LaxLcxkLstzmBtKNE9XckoN6aQCN0ED9sxaNWHpykBkq6hhW4meMo
	l7d8A+Ueu4Btrt4rtdZ+8ff14FGXxml/gpkAqCEVnss2q3rGD5NQ52Gv+Nyx6hIFWaOd
	FYGg==
X-Received: by 10.28.87.84 with SMTP id l81mr6959581wmb.22.1449252180492;
	Fri, 04 Dec 2015 10:03:00 -0800 (PST)
Received: from [192.168.0.9] (97e5a080.skybroadband.com. [151.229.160.128])
	by smtp.gmail.com with ESMTPSA id 67sm4530930wmm.6.2015.12.04.10.02.59
	(version=TLSv1/SSLv3 cipher=OTHER);
	Fri, 04 Dec 2015 10:02:59 -0800 (PST)
From: Lars Kurth <lars.kurth.xen@gmail.com>
Message-Id: <38DCD10E-1999-4E9B-8D96-AF4E54A233E8@gmail.com>
Date: Fri, 4 Dec 2015 18:02:58 +0000
To: Xen-devel <xen-devel@lists.xenproject.org>, mirageos-devel@xenproject.org,
	xen-api@lists.xenproject.org, Win-pv-devel@lists.xenproject.org,
	embedded-pv-devel@lists.xenproject.org
Mime-Version: 1.0 (Mac OS X Mail 8.2 \(2104\))
X-Mailer: Apple Mail (2.2104)
Subject: [win-pv-devel] Save the Date: Xen Project Hackathon 2016 (Location:
	Cambridge UK, Dates 18-19 April 2016)
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi everyone,
I am pleased to inform you that ARM will host the 2016 Hackathon at their site in Cambridge, UK. The Hackathon will take place April 18 & 19. I will put together more information (wiki, blog posts, ...) in the new year!
Best Regards
Lars
_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Dec 07 16:01:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 07 Dec 2015 16:01:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a5yEX-000835-7d; Mon, 07 Dec 2015 16:01:49 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=776fe3f0d=Paul.Durrant@citrix.com>)
	id 1a5yEW-00082y-2a
	for win-pv-devel@lists.xenproject.org; Mon, 07 Dec 2015 16:01:48 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	7E/07-22142-B6DA5665; Mon, 07 Dec 2015 16:01:47 +0000
X-Env-Sender: prvs=776fe3f0d=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1449504105!9073907!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18476 invoked from network); 7 Dec 2015 16:01:46 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Dec 2015 16:01:46 -0000
X-IronPort-AV: E=Sophos;i="5.20,395,1444694400"; 
   d="scan'208";a="9465667"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: New builds of 8.1.0 drivers available
Thread-Index: AdEsWJeT8G/rniiJTQm7HGUap3gziABWJT4AANWFzxA=
Date: Mon, 7 Dec 2015 15:54:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6C244D@AMSPEX01CL03.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6A4A7F@AMSPEX01CL01.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A4A7F@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] New builds of 8.1.0 drivers available
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Paul Durrant
> Sent: 03 December 2015 10:01
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Subject: RE: New builds of 8.1.0 drivers available
> 
> > -----Original Message-----
> > From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> > bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> > Sent: 01 December 2015 16:53
> > To: win-pv-devel@lists.xenproject.org
> > Subject: [win-pv-devel] New builds of 8.1.0 drivers available
> >
> > All,
> >
> >   I updated the Jenkins projects and re-built the 8.1.0 drivers from the latest
> > rcs. The binary packages are now available for test at
> > http://xenbits.xen.org/pvdrivers/win/8.1.0
> >
> 
> It turns out that some serious breakage of support for the S3 and S4 power
> states had crept in and had not been caught be testing. I'm currently trying to
> find minimal fixes for this. I'll do any necessary re-tagging once new stricter
> tests pass.
> 

Tests are now passing and I have manually verified hibernation. All affected drivers now have new tags and the latest builds have been posted to xenbits. Since the modifications to XENVIF and XENNET were fairly major I am now setting up HCK tests to check for regressions.

  Paul

>   Paul
> 
> >   Cheers,
> >
> >     Paul
> >
> > _______________________________________________
> > win-pv-devel mailing list
> > win-pv-devel@lists.xenproject.org
> > http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Dec 07 16:01:50 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 07 Dec 2015 16:01:50 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a5yEX-000835-7d; Mon, 07 Dec 2015 16:01:49 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=776fe3f0d=Paul.Durrant@citrix.com>)
	id 1a5yEW-00082y-2a
	for win-pv-devel@lists.xenproject.org; Mon, 07 Dec 2015 16:01:48 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	7E/07-22142-B6DA5665; Mon, 07 Dec 2015 16:01:47 +0000
X-Env-Sender: prvs=776fe3f0d=Paul.Durrant@citrix.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1449504105!9073907!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18476 invoked from network); 7 Dec 2015 16:01:46 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-4.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	7 Dec 2015 16:01:46 -0000
X-IronPort-AV: E=Sophos;i="5.20,395,1444694400"; 
   d="scan'208";a="9465667"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: New builds of 8.1.0 drivers available
Thread-Index: AdEsWJeT8G/rniiJTQm7HGUap3gziABWJT4AANWFzxA=
Date: Mon, 7 Dec 2015 15:54:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6C244D@AMSPEX01CL03.citrite.net>
References: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A15A9@AMSPEX01CL01.citrite.net>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6A4A7F@AMSPEX01CL01.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6A4A7F@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] New builds of 8.1.0 drivers available
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Paul Durrant
> Sent: 03 December 2015 10:01
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Subject: RE: New builds of 8.1.0 drivers available
> 
> > -----Original Message-----
> > From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> > bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> > Sent: 01 December 2015 16:53
> > To: win-pv-devel@lists.xenproject.org
> > Subject: [win-pv-devel] New builds of 8.1.0 drivers available
> >
> > All,
> >
> >   I updated the Jenkins projects and re-built the 8.1.0 drivers from the latest
> > rcs. The binary packages are now available for test at
> > http://xenbits.xen.org/pvdrivers/win/8.1.0
> >
> 
> It turns out that some serious breakage of support for the S3 and S4 power
> states had crept in and had not been caught be testing. I'm currently trying to
> find minimal fixes for this. I'll do any necessary re-tagging once new stricter
> tests pass.
> 

Tests are now passing and I have manually verified hibernation. All affected drivers now have new tags and the latest builds have been posted to xenbits. Since the modifications to XENVIF and XENNET were fairly major I am now setting up HCK tests to check for regressions.

  Paul

>   Paul
> 
> >   Cheers,
> >
> >     Paul
> >
> > _______________________________________________
> > win-pv-devel mailing list
> > win-pv-devel@lists.xenproject.org
> > http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 08 15:20:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 08 Dec 2015 15:20:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6K4J-0005kB-MQ; Tue, 08 Dec 2015 15:20:43 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6K4I-0005k6-Vo
	for win-pv-devel@lists.xenproject.org; Tue, 08 Dec 2015 15:20:43 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	D7/83-06091-A45F6665; Tue, 08 Dec 2015 15:20:42 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1449588038!9329591!1
X-Originating-IP: [209.85.213.45]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32611 invoked from network); 8 Dec 2015 15:20:39 -0000
Received: from mail-vk0-f45.google.com (HELO mail-vk0-f45.google.com)
	(209.85.213.45)
	by server-4.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 8 Dec 2015 15:20:39 -0000
Received: by vkha189 with SMTP id a189so15534122vkh.2
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 08 Dec 2015 07:20:38 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=09c+ifyJDCURjMvI7ifq5dpPYnBw68zNEuKxVBRQf7U=;
	b=0Ai6XhpFMZdTN3scu6R9UIweFgdJZ/9+E0D+uTzB+vCb7ZsQOO7TPzC46hMyzbExX+
	xAWUEHt7ICPbS6ySF9VTdeIE2chLLqik0lp2sPBvlopyC2qIEY6puY4UnrKhO5cPzYWi
	AkdG/0Z641n57CTBLk0m2T05EROdjM3oi2bqe0X/czw6LvInuU1GknZsNL5gqvMmIYnf
	Ed8+Ir1ek0lXTe1YdoJNsz+lz9R3mnRcOfdivgRoQMFR0X/2EdFBwliwRs7IBeO6dXHb
	UOu/rwacjhkhzDXa+abwmDmVy9Cc82ctN/zvFYWs6RvfuLxNBzDoepl/bLZsI27Af0Wl
	wcdQ==
X-Received: by 10.129.111.134 with SMTP id k128mr2350595ywc.30.1449588038345; 
	Tue, 08 Dec 2015 07:20:38 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	e67sm2483964ywf.15.2015.12.08.07.20.37
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 08 Dec 2015 07:20:37 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue,  8 Dec 2015 15:20:25 +0000
Message-Id: <1449588025-23184-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't get XENBUS_SUSPEND callback
	registration on AdapterCount
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Instances will not necessarily come and go in order so we can't know that
the last instance to go will be the one the registered the callback.
Instead register a callback for every instance and just use AdapterCount to
decide which instance writes distribution information to xenstore.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xennet/adapter.c | 50 ++++++++++++++++++++++++++------------------------
 1 file changed, 26 insertions(+), 24 deletions(-)

diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index f105724..0b262d5 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -1380,8 +1380,15 @@ AdapterSuspendCallbackLate(
     )
 {
     PXENNET_ADAPTER Adapter = Argument;
+    LONG            Count;
+
+    (VOID) InterlockedDecrement(&AdapterCount);
+
+    Count = InterlockedIncrement(&AdapterCount);
+    ASSERT(Count != 0);
 
-    (VOID) __AdapterSetDistribution(Adapter);
+    if (Count == 1)
+        (VOID) __AdapterSetDistribution(Adapter);
 }
 
 static NTSTATUS
@@ -1397,12 +1404,8 @@ AdapterSetDistribution(
     Count = InterlockedIncrement(&AdapterCount);
     ASSERT(Count != 0);
 
-    if (Count != 1)
-        goto done;
-
-    status = __AdapterSetDistribution(Adapter);
-    if (!NT_SUCCESS(status))
-        goto fail1;
+    if (Count == 1)
+        (VOID) __AdapterSetDistribution(Adapter);
 
     status = XENBUS_SUSPEND(Register,
                             &Adapter->SuspendInterface,
@@ -1411,20 +1414,19 @@ AdapterSetDistribution(
                             Adapter,
                             &Adapter->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
-done:
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail2:
-    Error("fail2\n");
-
-    __AdapterClearDistribution(Adapter);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    Count = InterlockedDecrement(&AdapterCount);
+
+    if (Count == 0)
+        __AdapterClearDistribution(Adapter);
+
     return status;
 }
 
@@ -1437,19 +1439,16 @@ AdapterClearDistribution(
 
     Trace("====>\n");
 
-    Count = InterlockedDecrement(&AdapterCount);
-
-    if (Count != 0)
-        goto done;
-
     XENBUS_SUSPEND(Deregister,
                    &Adapter->SuspendInterface,
                    Adapter->SuspendCallbackLate);
     Adapter->SuspendCallbackLate = NULL;
 
-    __AdapterClearDistribution(Adapter);
+    Count = InterlockedDecrement(&AdapterCount);
+
+    if (Count == 0)
+        __AdapterClearDistribution(Adapter);
 
-done:
     Trace("<====\n");
 }
 
@@ -1472,14 +1471,16 @@ AdapterEnable(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    (VOID) AdapterSetDistribution(Adapter);
+    status = AdapterSetDistribution(Adapter);
+    if (!NT_SUCCESS(status))
+        goto fail3;
 
     status = XENVIF_VIF(Enable,
                         &Adapter->VifInterface,
                         AdapterVifCallback,
                         Adapter);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     AdapterMediaStateChange(Adapter);
 
@@ -1487,9 +1488,10 @@ AdapterEnable(
 
     return NDIS_STATUS_SUCCESS;
 
-fail3:
+fail4:
     AdapterClearDistribution(Adapter);
 
+fail3:
     XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
 
 fail2:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 08 15:20:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 08 Dec 2015 15:20:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6K4J-0005kB-MQ; Tue, 08 Dec 2015 15:20:43 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6K4I-0005k6-Vo
	for win-pv-devel@lists.xenproject.org; Tue, 08 Dec 2015 15:20:43 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	D7/83-06091-A45F6665; Tue, 08 Dec 2015 15:20:42 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1449588038!9329591!1
X-Originating-IP: [209.85.213.45]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32611 invoked from network); 8 Dec 2015 15:20:39 -0000
Received: from mail-vk0-f45.google.com (HELO mail-vk0-f45.google.com)
	(209.85.213.45)
	by server-4.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 8 Dec 2015 15:20:39 -0000
Received: by vkha189 with SMTP id a189so15534122vkh.2
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 08 Dec 2015 07:20:38 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=09c+ifyJDCURjMvI7ifq5dpPYnBw68zNEuKxVBRQf7U=;
	b=0Ai6XhpFMZdTN3scu6R9UIweFgdJZ/9+E0D+uTzB+vCb7ZsQOO7TPzC46hMyzbExX+
	xAWUEHt7ICPbS6ySF9VTdeIE2chLLqik0lp2sPBvlopyC2qIEY6puY4UnrKhO5cPzYWi
	AkdG/0Z641n57CTBLk0m2T05EROdjM3oi2bqe0X/czw6LvInuU1GknZsNL5gqvMmIYnf
	Ed8+Ir1ek0lXTe1YdoJNsz+lz9R3mnRcOfdivgRoQMFR0X/2EdFBwliwRs7IBeO6dXHb
	UOu/rwacjhkhzDXa+abwmDmVy9Cc82ctN/zvFYWs6RvfuLxNBzDoepl/bLZsI27Af0Wl
	wcdQ==
X-Received: by 10.129.111.134 with SMTP id k128mr2350595ywc.30.1449588038345; 
	Tue, 08 Dec 2015 07:20:38 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	e67sm2483964ywf.15.2015.12.08.07.20.37
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Tue, 08 Dec 2015 07:20:37 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Tue,  8 Dec 2015 15:20:25 +0000
Message-Id: <1449588025-23184-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't get XENBUS_SUSPEND callback
	registration on AdapterCount
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Instances will not necessarily come and go in order so we can't know that
the last instance to go will be the one the registered the callback.
Instead register a callback for every instance and just use AdapterCount to
decide which instance writes distribution information to xenstore.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xennet/adapter.c | 50 ++++++++++++++++++++++++++------------------------
 1 file changed, 26 insertions(+), 24 deletions(-)

diff --git a/src/xennet/adapter.c b/src/xennet/adapter.c
index f105724..0b262d5 100644
--- a/src/xennet/adapter.c
+++ b/src/xennet/adapter.c
@@ -1380,8 +1380,15 @@ AdapterSuspendCallbackLate(
     )
 {
     PXENNET_ADAPTER Adapter = Argument;
+    LONG            Count;
+
+    (VOID) InterlockedDecrement(&AdapterCount);
+
+    Count = InterlockedIncrement(&AdapterCount);
+    ASSERT(Count != 0);
 
-    (VOID) __AdapterSetDistribution(Adapter);
+    if (Count == 1)
+        (VOID) __AdapterSetDistribution(Adapter);
 }
 
 static NTSTATUS
@@ -1397,12 +1404,8 @@ AdapterSetDistribution(
     Count = InterlockedIncrement(&AdapterCount);
     ASSERT(Count != 0);
 
-    if (Count != 1)
-        goto done;
-
-    status = __AdapterSetDistribution(Adapter);
-    if (!NT_SUCCESS(status))
-        goto fail1;
+    if (Count == 1)
+        (VOID) __AdapterSetDistribution(Adapter);
 
     status = XENBUS_SUSPEND(Register,
                             &Adapter->SuspendInterface,
@@ -1411,20 +1414,19 @@ AdapterSetDistribution(
                             Adapter,
                             &Adapter->SuspendCallbackLate);
     if (!NT_SUCCESS(status))
-        goto fail2;
+        goto fail1;
 
-done:
     Trace("<====\n");
     return STATUS_SUCCESS;
 
-fail2:
-    Error("fail2\n");
-
-    __AdapterClearDistribution(Adapter);
-
 fail1:
     Error("fail1 (%08x)\n", status);
 
+    Count = InterlockedDecrement(&AdapterCount);
+
+    if (Count == 0)
+        __AdapterClearDistribution(Adapter);
+
     return status;
 }
 
@@ -1437,19 +1439,16 @@ AdapterClearDistribution(
 
     Trace("====>\n");
 
-    Count = InterlockedDecrement(&AdapterCount);
-
-    if (Count != 0)
-        goto done;
-
     XENBUS_SUSPEND(Deregister,
                    &Adapter->SuspendInterface,
                    Adapter->SuspendCallbackLate);
     Adapter->SuspendCallbackLate = NULL;
 
-    __AdapterClearDistribution(Adapter);
+    Count = InterlockedDecrement(&AdapterCount);
+
+    if (Count == 0)
+        __AdapterClearDistribution(Adapter);
 
-done:
     Trace("<====\n");
 }
 
@@ -1472,14 +1471,16 @@ AdapterEnable(
     if (!NT_SUCCESS(status))
         goto fail2;
 
-    (VOID) AdapterSetDistribution(Adapter);
+    status = AdapterSetDistribution(Adapter);
+    if (!NT_SUCCESS(status))
+        goto fail3;
 
     status = XENVIF_VIF(Enable,
                         &Adapter->VifInterface,
                         AdapterVifCallback,
                         Adapter);
     if (!NT_SUCCESS(status))
-        goto fail3;
+        goto fail4;
 
     AdapterMediaStateChange(Adapter);
 
@@ -1487,9 +1488,10 @@ AdapterEnable(
 
     return NDIS_STATUS_SUCCESS;
 
-fail3:
+fail4:
     AdapterClearDistribution(Adapter);
 
+fail3:
     XENBUS_SUSPEND(Release, &Adapter->SuspendInterface);
 
 fail2:
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 10:19:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 10:19:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6bqJ-0006TC-OE; Wed, 09 Dec 2015 10:19:27 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a6bqI-0006T3-2v
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 10:19:26 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	28/24-06091-D2008665; Wed, 09 Dec 2015 10:19:25 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1449656363!9227519!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 45824 invoked from network); 9 Dec 2015 10:19:24 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-7.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 9 Dec 2015 10:19:24 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id B2F7B20648
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 05:19:22 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Wed, 09 Dec 2015 05:19:22 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=dK+1QXsrxZDhgqt6pQPLdD4LyDs=; b=Wpdh30
	5ubvyPqLHFPQLJCxicoXJ/thF0IP5/FSCE+1I0NHVgCq/76kfZDpnJdzrI217jmS
	o7uubK7VLGbBy9h/TY+lFqVPQE9NsO5T0cXPa/13uW953o8pN2q1hayqgaJLyZv4
	5jx2/bOhL3rp8tilnYlRCZ5Z4aAF4KUdxdsCs=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=dK+1QXsrxZDhgqt6pQPLdD4LyDs=; b=XpS4k
	Pk2mquU+4jB1w94ku3JnEXMQ+XH9QbQG8yVZgrmSJeFNrrwf38LeNBCCE77b+k4a
	b8+pc/6v9mKZxWFisA2+CEYi/axx+8tMW67LJEzxzrtQOPzx1UXfRrN8m88dDAzl
	yPM+FpKH50dcbtG0PIuy4agmPaUiVUq1LPr5e8=
X-Sasl-enc: TCw6L90qGu2zsliD09kmF710faNK1xkTCyTQcPPg1MWZ 1449656362
Received: from [10.137.2.8] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 21464C016D5
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 05:19:21 -0500 (EST)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <56680027.4080604@invisiblethingslab.com>
Date: Wed, 9 Dec 2015 11:19:19 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.1.0
MIME-Version: 1.0
Content-Length:1322
Subject: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SGksCgpJIGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4ZW5pZmFjZSB0
aGF0IEknbSBub3Qgc3VyZSBob3cKdG8gcHJvcGVybHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1
cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZvciBhCnBhcnRpY3VsYXIgY2hhbm5lbCBjYW4g
YmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWduYWxzIHRoZQpjYWxsZXIt
cHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJbiBzdWNoIGNhc2UgdGhlIGludGVycnVwdCBjYWxs
YmFjawpmYWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwg
cG90ZW50aWFsbHkgY2F1c2luZwphIHZjaGFuICJkZWFkbG9jayIgZG93biB0aGUgd2F5LgoKQW55
IGFkdmljZSBvbiBob3cgdG8gYXBwcm9hY2ggdGhpcz8gVGhlIGludGVycnVwdCBjYWxsYmFjayBy
dW5zIGF0CkhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5j
aHJvbml6YXRpb24gd2l0aCBzb21lCm90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Yg
c3VjaCAicGVuZGluZyIgZXZlbnRzLgoKQWxzbyBJIHdvbmRlciBpZiB0aGUga2VybmVsIGRpZmZl
cmVudGlhdGVzIERQQ3Mgb25seSBieSB0aGVpciBLRFBDCmFkZHJlc3MsIG9yIGFsc28gYnkgYXJn
dW1lbnRzIHBhc3NlZCB0byBLZUluc2VydFF1ZXVlRHBjKCk/CgotLSAKUmFmYcWCIFdvamR5xYJh
ClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4t
cHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo
dHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1w
di1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 10:19:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 10:19:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6bqJ-0006TC-OE; Wed, 09 Dec 2015 10:19:27 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a6bqI-0006T3-2v
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 10:19:26 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	28/24-06091-D2008665; Wed, 09 Dec 2015 10:19:25 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1449656363!9227519!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 45824 invoked from network); 9 Dec 2015 10:19:24 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-7.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 9 Dec 2015 10:19:24 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id B2F7B20648
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 05:19:22 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Wed, 09 Dec 2015 05:19:22 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=dK+1QXsrxZDhgqt6pQPLdD4LyDs=; b=Wpdh30
	5ubvyPqLHFPQLJCxicoXJ/thF0IP5/FSCE+1I0NHVgCq/76kfZDpnJdzrI217jmS
	o7uubK7VLGbBy9h/TY+lFqVPQE9NsO5T0cXPa/13uW953o8pN2q1hayqgaJLyZv4
	5jx2/bOhL3rp8tilnYlRCZ5Z4aAF4KUdxdsCs=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:message-id:mime-version:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=dK+1QXsrxZDhgqt6pQPLdD4LyDs=; b=XpS4k
	Pk2mquU+4jB1w94ku3JnEXMQ+XH9QbQG8yVZgrmSJeFNrrwf38LeNBCCE77b+k4a
	b8+pc/6v9mKZxWFisA2+CEYi/axx+8tMW67LJEzxzrtQOPzx1UXfRrN8m88dDAzl
	yPM+FpKH50dcbtG0PIuy4agmPaUiVUq1LPr5e8=
X-Sasl-enc: TCw6L90qGu2zsliD09kmF710faNK1xkTCyTQcPPg1MWZ 1449656362
Received: from [10.137.2.8] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 21464C016D5
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 05:19:21 -0500 (EST)
To: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1010
Message-ID: <56680027.4080604@invisiblethingslab.com>
Date: Wed, 9 Dec 2015 11:19:19 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.1.0
MIME-Version: 1.0
Content-Length:1322
Subject: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SGksCgpJIGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4ZW5pZmFjZSB0
aGF0IEknbSBub3Qgc3VyZSBob3cKdG8gcHJvcGVybHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1
cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZvciBhCnBhcnRpY3VsYXIgY2hhbm5lbCBjYW4g
YmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWduYWxzIHRoZQpjYWxsZXIt
cHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJbiBzdWNoIGNhc2UgdGhlIGludGVycnVwdCBjYWxs
YmFjawpmYWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwg
cG90ZW50aWFsbHkgY2F1c2luZwphIHZjaGFuICJkZWFkbG9jayIgZG93biB0aGUgd2F5LgoKQW55
IGFkdmljZSBvbiBob3cgdG8gYXBwcm9hY2ggdGhpcz8gVGhlIGludGVycnVwdCBjYWxsYmFjayBy
dW5zIGF0CkhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5j
aHJvbml6YXRpb24gd2l0aCBzb21lCm90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Yg
c3VjaCAicGVuZGluZyIgZXZlbnRzLgoKQWxzbyBJIHdvbmRlciBpZiB0aGUga2VybmVsIGRpZmZl
cmVudGlhdGVzIERQQ3Mgb25seSBieSB0aGVpciBLRFBDCmFkZHJlc3MsIG9yIGFsc28gYnkgYXJn
dW1lbnRzIHBhc3NlZCB0byBLZUluc2VydFF1ZXVlRHBjKCk/CgotLSAKUmFmYcWCIFdvamR5xYJh
ClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5v
cmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4t
cHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpo
dHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1w
di1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 10:45:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 10:45:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6cFF-0008Hk-KD; Wed, 09 Dec 2015 10:45:13 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6cFE-0008HT-Fk
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 10:45:12 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	A0/6A-30270-73608665; Wed, 09 Dec 2015 10:45:11 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1449657905!9170222!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20381 invoked from network); 9 Dec 2015 10:45:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 10:45:05 -0000
X-IronPort-AV: E=Sophos;i="5.20,403,1444694400"; 
   d="scan'208";a="9630423"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA
Date: Wed, 9 Dec 2015 10:44:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
In-Reply-To: <56680027.4080604@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MDkgRGVjZW1iZXIgMjAxNSAxMDoxOQ0KPiBUbzogd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2pl
Y3Qub3JnDQo+IFN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJy
dXB0IGhhbmRsaW5nDQo+IA0KPiBIaSwNCj4gDQo+IEkgZm91bmQgYW4gaXNzdWUgaW4gbXkgZXZ0
Y2huIGhhbmRsaW5nIGluIHhlbmlmYWNlIHRoYXQgSSdtIG5vdCBzdXJlIGhvdw0KPiB0byBwcm9w
ZXJseSBmaXguIE5hbWVseSwgdGhlIGludGVycnVwdCBjYWxsYmFjayB0aGF0J3MgYXNzaWduZWQg
Zm9yIGENCj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBxdWV1
ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlDQo+IGNhbGxlci1wcm92aWRlZCBldmVudCkgZmluaXNo
ZXMuIEluIHN1Y2ggY2FzZSB0aGUgaW50ZXJydXB0IGNhbGxiYWNrDQo+IGZhaWxzIHRvIGluc2Vy
dCB0aGUgRFBDIGFnYWluIGFuZCBhbiBldmVudCBpcyBsb3N0LCBwb3RlbnRpYWxseSBjYXVzaW5n
DQo+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+IA0KDQpIaSBSYWZhbCwNCg0K
VGhhdCBzaG91bGRuJ3QgYmUgdGhlIGNhc2UuIFdpbmRvd3MgZGUtcXVldWVzIGEgRFBDIGJlZm9y
ZSBydW5uaW5nIGZvciBwcmVjaXNlbHkgdGhpcyBraW5kIG9mIHJlYXNvbi4gSS5lLiBqdXN0IGJl
Y2F1c2UgeW91ciBEUEMgaXMgcnVubmluZywgaXQgc2hvdWxkIG5vdCBzdG9wIGFub3RoZXIgZnJv
bSBiZWluZyBxdWV1ZWQuIEFyZSB5b3UgZGVmaW5pdGVseSBzZWVpbmcgYSBmYWlsdXJlIHRvIHF1
ZXVlIGV2ZW4gd2hlbiBubyBEUEMgaXMgYWN0dWFsbHkgcXVldWVkPyBXaGF0IHlvdSBtYXkgYWN0
dWFsbHkgYmUgZ2V0dGluZyBjYXVnaHQgYnkgaXMgZXZ0Y2huIGF1dG8tbWFza2luZy4gSWYgeW91
IGhhdmUgZW5hYmxlZCBhdXRvLW1hc2tpbmcgdGhlbiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVu
bWFzayBhdCB0aGUgZW5kIG9mIHlvdXIgRFBDLiAoVGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZl
ciByaW5nIERQQ3MgaW4gWEVOVklGIGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCg0KQ2hl
ZXJzLA0KDQogIFBhdWwNCg0KPiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBU
aGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gSElHSF9MRVZFTCB3aGljaCBpcyBhbiBp
c3N1ZSB3aGVuIGl0IGNvbWVzIHRvIHN5bmNocm9uaXphdGlvbiB3aXRoIHNvbWUNCj4gb3RoZXIg
Y29kZSB0aGF0IGNvdWxkIHRha2UgY2FyZSBvZiBzdWNoICJwZW5kaW5nIiBldmVudHMuDQo+IA0K
PiBBbHNvIEkgd29uZGVyIGlmIHRoZSBrZXJuZWwgZGlmZmVyZW50aWF0ZXMgRFBDcyBvbmx5IGJ5
IHRoZWlyIEtEUEMNCj4gYWRkcmVzcywgb3IgYWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtl
SW5zZXJ0UXVldWVEcGMoKT8NCj4gDQo+IC0tDQo+IFJhZmHFgiBXb2pkecWCYQ0KPiBRdWJlcyBU
b29scyBmb3IgV2luZG93cyBkZXZlbG9wZXINCj4gaHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLw0K
PiANCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj4g
d2luLXB2LWRldmVsIG1haWxpbmcgbGlzdA0KPiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0
aW5mby93aW4tcHYtZGV2ZWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4v
bGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 10:45:14 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 10:45:14 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6cFF-0008Hk-KD; Wed, 09 Dec 2015 10:45:13 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6cFE-0008HT-Fk
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 10:45:12 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	A0/6A-30270-73608665; Wed, 09 Dec 2015 10:45:11 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-14.tower-206.messagelabs.com!1449657905!9170222!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 20381 invoked from network); 9 Dec 2015 10:45:05 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-14.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 10:45:05 -0000
X-IronPort-AV: E=Sophos;i="5.20,403,1444694400"; 
   d="scan'208";a="9630423"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA
Date: Wed, 9 Dec 2015 10:44:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
In-Reply-To: <56680027.4080604@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MDkgRGVjZW1iZXIgMjAxNSAxMDoxOQ0KPiBUbzogd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2pl
Y3Qub3JnDQo+IFN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJy
dXB0IGhhbmRsaW5nDQo+IA0KPiBIaSwNCj4gDQo+IEkgZm91bmQgYW4gaXNzdWUgaW4gbXkgZXZ0
Y2huIGhhbmRsaW5nIGluIHhlbmlmYWNlIHRoYXQgSSdtIG5vdCBzdXJlIGhvdw0KPiB0byBwcm9w
ZXJseSBmaXguIE5hbWVseSwgdGhlIGludGVycnVwdCBjYWxsYmFjayB0aGF0J3MgYXNzaWduZWQg
Zm9yIGENCj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBxdWV1
ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlDQo+IGNhbGxlci1wcm92aWRlZCBldmVudCkgZmluaXNo
ZXMuIEluIHN1Y2ggY2FzZSB0aGUgaW50ZXJydXB0IGNhbGxiYWNrDQo+IGZhaWxzIHRvIGluc2Vy
dCB0aGUgRFBDIGFnYWluIGFuZCBhbiBldmVudCBpcyBsb3N0LCBwb3RlbnRpYWxseSBjYXVzaW5n
DQo+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+IA0KDQpIaSBSYWZhbCwNCg0K
VGhhdCBzaG91bGRuJ3QgYmUgdGhlIGNhc2UuIFdpbmRvd3MgZGUtcXVldWVzIGEgRFBDIGJlZm9y
ZSBydW5uaW5nIGZvciBwcmVjaXNlbHkgdGhpcyBraW5kIG9mIHJlYXNvbi4gSS5lLiBqdXN0IGJl
Y2F1c2UgeW91ciBEUEMgaXMgcnVubmluZywgaXQgc2hvdWxkIG5vdCBzdG9wIGFub3RoZXIgZnJv
bSBiZWluZyBxdWV1ZWQuIEFyZSB5b3UgZGVmaW5pdGVseSBzZWVpbmcgYSBmYWlsdXJlIHRvIHF1
ZXVlIGV2ZW4gd2hlbiBubyBEUEMgaXMgYWN0dWFsbHkgcXVldWVkPyBXaGF0IHlvdSBtYXkgYWN0
dWFsbHkgYmUgZ2V0dGluZyBjYXVnaHQgYnkgaXMgZXZ0Y2huIGF1dG8tbWFza2luZy4gSWYgeW91
IGhhdmUgZW5hYmxlZCBhdXRvLW1hc2tpbmcgdGhlbiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVu
bWFzayBhdCB0aGUgZW5kIG9mIHlvdXIgRFBDLiAoVGhlIHRyYW5zbWl0dGVyIGFuZCByZWNlaXZl
ciByaW5nIERQQ3MgaW4gWEVOVklGIGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCg0KQ2hl
ZXJzLA0KDQogIFBhdWwNCg0KPiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBU
aGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gSElHSF9MRVZFTCB3aGljaCBpcyBhbiBp
c3N1ZSB3aGVuIGl0IGNvbWVzIHRvIHN5bmNocm9uaXphdGlvbiB3aXRoIHNvbWUNCj4gb3RoZXIg
Y29kZSB0aGF0IGNvdWxkIHRha2UgY2FyZSBvZiBzdWNoICJwZW5kaW5nIiBldmVudHMuDQo+IA0K
PiBBbHNvIEkgd29uZGVyIGlmIHRoZSBrZXJuZWwgZGlmZmVyZW50aWF0ZXMgRFBDcyBvbmx5IGJ5
IHRoZWlyIEtEUEMNCj4gYWRkcmVzcywgb3IgYWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtl
SW5zZXJ0UXVldWVEcGMoKT8NCj4gDQo+IC0tDQo+IFJhZmHFgiBXb2pkecWCYQ0KPiBRdWJlcyBU
b29scyBmb3IgV2luZG93cyBkZXZlbG9wZXINCj4gaHR0cHM6Ly93d3cucXViZXMtb3Mub3JnLw0K
PiANCj4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18NCj4g
d2luLXB2LWRldmVsIG1haWxpbmcgbGlzdA0KPiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcNCj4gaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0
aW5mby93aW4tcHYtZGV2ZWwNCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4v
bGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 11:08:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 11:08:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6cbg-000160-E9; Wed, 09 Dec 2015 11:08:24 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a6cbf-00015v-Kz
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 11:08:23 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	5C/C3-09834-6AB08665; Wed, 09 Dec 2015 11:08:22 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1449659301!9790117!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25110 invoked from network); 9 Dec 2015 11:08:22 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 9 Dec 2015 11:08:22 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 6D81D2029B
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 06:08:21 -0500 (EST)
Received: from frontend2 ([10.202.2.161])
	by compute2.internal (MEProxy); Wed, 09 Dec 2015 06:08:21 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=UkhDJCel94m2oNjR
	z1/wbUYd0fE=; b=LjT6isBdNRNsWNL6+/pgaKZl/ic0g7PkeF6BoCyDylETrMJx
	LIly0+yDv8i02ud5tAWMH2nkuhXt51i7N6hDzwCzsIvQkwr8ZbeRuHBCUxIRYfey
	5fBywXD0l19mCC3l1A4RlLCIW+nWg2N9WX/KX1+ktv3bDg9XESzuU6ZZCik=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=UkhDJCel94m2oNj
	Rz1/wbUYd0fE=; b=RF/VMBFOo0d49k/aXkCPXVDmYzUmUWPevh1+dtoeHazONdj
	XXUQLljAkijsGFoAIUvzzalWlP83pJtJq1Herz6WpCeFLBnyamAALS3dBi2yWOf7
	gLPdXMyHgYt3QnI96DVdEHClTem1c1FgzQfeopZstYVvjGxBY9RMlFe5sfXo=
X-Sasl-enc: sQ4aJEZWZ2Z7w8J7oOWI05CPdZ+eiCbK06EepMgKdozw 1449659301
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id C33EB6801CF;
	Wed,  9 Dec 2015 06:08:20 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Message-ID: <56680BA2.4060104@invisiblethingslab.com>
Date: Wed, 9 Dec 2015 12:08:18 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
Content-Length: 3101
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMjAxNS0xMi0wOSAxMTo0NCwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDkgRGVjZW1iZXIgMjAx
NSAxMDoxOQo+PiBUbzogd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCj4+IFN1Ympl
Y3Q6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nCj4+
Cj4+IEhpLAo+Pgo+PiBJIGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4
ZW5pZmFjZSB0aGF0IEknbSBub3Qgc3VyZSBob3cKPj4gdG8gcHJvcGVybHkgZml4LiBOYW1lbHks
IHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZvciBhCj4+IHBhcnRpY3Vs
YXIgY2hhbm5lbCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWdu
YWxzIHRoZQo+PiBjYWxsZXItcHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJbiBzdWNoIGNhc2Ug
dGhlIGludGVycnVwdCBjYWxsYmFjawo+PiBmYWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBh
bmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50aWFsbHkgY2F1c2luZwo+PiBhIHZjaGFuICJkZWFk
bG9jayIgZG93biB0aGUgd2F5Lgo+Pgo+IAo+IEhpIFJhZmFsLAo+IAo+IFRoYXQgc2hvdWxkbid0
IGJlIHRoZSBjYXNlLiBXaW5kb3dzIGRlLXF1ZXVlcyBhIERQQyBiZWZvcmUgcnVubmluZyBmb3Ig
cHJlY2lzZWx5IHRoaXMga2luZCBvZiByZWFzb24uIEkuZS4ganVzdCBiZWNhdXNlIHlvdXIgRFBD
IGlzIHJ1bm5pbmcsIGl0IHNob3VsZCBub3Qgc3RvcCBhbm90aGVyIGZyb20gYmVpbmcgcXVldWVk
LiBBcmUgeW91IGRlZmluaXRlbHkgc2VlaW5nIGEgZmFpbHVyZSB0byBxdWV1ZSBldmVuIHdoZW4g
bm8gRFBDIGlzIGFjdHVhbGx5IHF1ZXVlZD8gV2hhdCB5b3UgbWF5IGFjdHVhbGx5IGJlIGdldHRp
bmcgY2F1Z2h0IGJ5IGlzIGV2dGNobiBhdXRvLW1hc2tpbmcuIElmIHlvdSBoYXZlIGVuYWJsZWQg
YXV0by1tYXNraW5nIHRoZW4geW91IG5lZWQgdG8gZXhwbGljaXRseSB1bm1hc2sgYXQgdGhlIGVu
ZCBvZiB5b3VyIERQQy4gKFRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgcmluZyBEUENzIGlu
IFhFTlZJRiBhcmUgYSBnb29kIGV4YW1wbGUgb2YgdGhpcykuCj4gCj4gQ2hlZXJzLAo+IAo+ICAg
UGF1bAo+IApIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoKaHR0cDovL3hlbmJpdHMueGVuLm9yZy9n
aXR3ZWIvP3A9cHZkcml2ZXJzL3dpbi94ZW5pZmFjZS5naXQ7YT1ibG9iO2Y9c3JjL3hlbmlmYWNl
L2lvY3RsX2V2dGNobi5jO2g9OWM1YWYxOWUwMGE5MWEwOGY2OGRhMGM2MzA3MDljYmFhNmU4NDEz
ZDtoYj1IRUFEI2w2NgoKSSBjaGVjayB0aGUgcmVzdWx0IG9mIEtlSW5zZXJ0UXVldWVEcGMoKSBh
bmQgSSBkZWZpbml0ZWx5IHNlZSBpdCBmYWlsCnNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZNIG9u
bHkgaGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlIGNoYW5uZWwKYWZ0ZXIgc2V0dGluZyBh
biBldmVudCBzbyB0aGlzIHNob3VsZG4ndCBiZSB0aGUgcmVhc29uLgoKPj4gQW55IGFkdmljZSBv
biBob3cgdG8gYXBwcm9hY2ggdGhpcz8gVGhlIGludGVycnVwdCBjYWxsYmFjayBydW5zIGF0Cj4+
IEhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5jaHJvbml6
YXRpb24gd2l0aCBzb21lCj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Ygc3Vj
aCAicGVuZGluZyIgZXZlbnRzLgo+Pgo+PiBBbHNvIEkgd29uZGVyIGlmIHRoZSBrZXJuZWwgZGlm
ZmVyZW50aWF0ZXMgRFBDcyBvbmx5IGJ5IHRoZWlyIEtEUEMKPj4gYWRkcmVzcywgb3IgYWxzbyBi
eSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVldWVEcGMoKT8KPj4KLS0gClJhZmHFgiBX
b2pkecWCYQpRdWJlcyBUb29scyBmb3IgV2luZG93cyBkZXZlbG9wZXIKaHR0cHM6Ly93d3cucXVi
ZXMtb3Mub3JnLwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5m
by93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 11:08:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 11:08:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6cbg-000160-E9; Wed, 09 Dec 2015 11:08:24 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a6cbf-00015v-Kz
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 11:08:23 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	5C/C3-09834-6AB08665; Wed, 09 Dec 2015 11:08:22 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1449659301!9790117!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25110 invoked from network); 9 Dec 2015 11:08:22 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-7.tower-27.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 9 Dec 2015 11:08:22 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 6D81D2029B
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 06:08:21 -0500 (EST)
Received: from frontend2 ([10.202.2.161])
	by compute2.internal (MEProxy); Wed, 09 Dec 2015 06:08:21 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=UkhDJCel94m2oNjR
	z1/wbUYd0fE=; b=LjT6isBdNRNsWNL6+/pgaKZl/ic0g7PkeF6BoCyDylETrMJx
	LIly0+yDv8i02ud5tAWMH2nkuhXt51i7N6hDzwCzsIvQkwr8ZbeRuHBCUxIRYfey
	5fBywXD0l19mCC3l1A4RlLCIW+nWg2N9WX/KX1+ktv3bDg9XESzuU6ZZCik=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=UkhDJCel94m2oNj
	Rz1/wbUYd0fE=; b=RF/VMBFOo0d49k/aXkCPXVDmYzUmUWPevh1+dtoeHazONdj
	XXUQLljAkijsGFoAIUvzzalWlP83pJtJq1Herz6WpCeFLBnyamAALS3dBi2yWOf7
	gLPdXMyHgYt3QnI96DVdEHClTem1c1FgzQfeopZstYVvjGxBY9RMlFe5sfXo=
X-Sasl-enc: sQ4aJEZWZ2Z7w8J7oOWI05CPdZ+eiCbK06EepMgKdozw 1449659301
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id C33EB6801CF;
	Wed,  9 Dec 2015 06:08:20 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Message-ID: <56680BA2.4060104@invisiblethingslab.com>
Date: Wed, 9 Dec 2015 12:08:18 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
Content-Length: 3101
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMjAxNS0xMi0wOSAxMTo0NCwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDkgRGVjZW1iZXIgMjAx
NSAxMDoxOQo+PiBUbzogd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCj4+IFN1Ympl
Y3Q6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nCj4+
Cj4+IEhpLAo+Pgo+PiBJIGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4
ZW5pZmFjZSB0aGF0IEknbSBub3Qgc3VyZSBob3cKPj4gdG8gcHJvcGVybHkgZml4LiBOYW1lbHks
IHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZvciBhCj4+IHBhcnRpY3Vs
YXIgY2hhbm5lbCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWdu
YWxzIHRoZQo+PiBjYWxsZXItcHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJbiBzdWNoIGNhc2Ug
dGhlIGludGVycnVwdCBjYWxsYmFjawo+PiBmYWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBh
bmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50aWFsbHkgY2F1c2luZwo+PiBhIHZjaGFuICJkZWFk
bG9jayIgZG93biB0aGUgd2F5Lgo+Pgo+IAo+IEhpIFJhZmFsLAo+IAo+IFRoYXQgc2hvdWxkbid0
IGJlIHRoZSBjYXNlLiBXaW5kb3dzIGRlLXF1ZXVlcyBhIERQQyBiZWZvcmUgcnVubmluZyBmb3Ig
cHJlY2lzZWx5IHRoaXMga2luZCBvZiByZWFzb24uIEkuZS4ganVzdCBiZWNhdXNlIHlvdXIgRFBD
IGlzIHJ1bm5pbmcsIGl0IHNob3VsZCBub3Qgc3RvcCBhbm90aGVyIGZyb20gYmVpbmcgcXVldWVk
LiBBcmUgeW91IGRlZmluaXRlbHkgc2VlaW5nIGEgZmFpbHVyZSB0byBxdWV1ZSBldmVuIHdoZW4g
bm8gRFBDIGlzIGFjdHVhbGx5IHF1ZXVlZD8gV2hhdCB5b3UgbWF5IGFjdHVhbGx5IGJlIGdldHRp
bmcgY2F1Z2h0IGJ5IGlzIGV2dGNobiBhdXRvLW1hc2tpbmcuIElmIHlvdSBoYXZlIGVuYWJsZWQg
YXV0by1tYXNraW5nIHRoZW4geW91IG5lZWQgdG8gZXhwbGljaXRseSB1bm1hc2sgYXQgdGhlIGVu
ZCBvZiB5b3VyIERQQy4gKFRoZSB0cmFuc21pdHRlciBhbmQgcmVjZWl2ZXIgcmluZyBEUENzIGlu
IFhFTlZJRiBhcmUgYSBnb29kIGV4YW1wbGUgb2YgdGhpcykuCj4gCj4gQ2hlZXJzLAo+IAo+ICAg
UGF1bAo+IApIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoKaHR0cDovL3hlbmJpdHMueGVuLm9yZy9n
aXR3ZWIvP3A9cHZkcml2ZXJzL3dpbi94ZW5pZmFjZS5naXQ7YT1ibG9iO2Y9c3JjL3hlbmlmYWNl
L2lvY3RsX2V2dGNobi5jO2g9OWM1YWYxOWUwMGE5MWEwOGY2OGRhMGM2MzA3MDljYmFhNmU4NDEz
ZDtoYj1IRUFEI2w2NgoKSSBjaGVjayB0aGUgcmVzdWx0IG9mIEtlSW5zZXJ0UXVldWVEcGMoKSBh
bmQgSSBkZWZpbml0ZWx5IHNlZSBpdCBmYWlsCnNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZNIG9u
bHkgaGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlIGNoYW5uZWwKYWZ0ZXIgc2V0dGluZyBh
biBldmVudCBzbyB0aGlzIHNob3VsZG4ndCBiZSB0aGUgcmVhc29uLgoKPj4gQW55IGFkdmljZSBv
biBob3cgdG8gYXBwcm9hY2ggdGhpcz8gVGhlIGludGVycnVwdCBjYWxsYmFjayBydW5zIGF0Cj4+
IEhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5jaHJvbml6
YXRpb24gd2l0aCBzb21lCj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Ygc3Vj
aCAicGVuZGluZyIgZXZlbnRzLgo+Pgo+PiBBbHNvIEkgd29uZGVyIGlmIHRoZSBrZXJuZWwgZGlm
ZmVyZW50aWF0ZXMgRFBDcyBvbmx5IGJ5IHRoZWlyIEtEUEMKPj4gYWRkcmVzcywgb3IgYWxzbyBi
eSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVldWVEcGMoKT8KPj4KLS0gClJhZmHFgiBX
b2pkecWCYQpRdWJlcyBUb29scyBmb3IgV2luZG93cyBkZXZlbG9wZXIKaHR0cHM6Ly93d3cucXVi
ZXMtb3Mub3JnLwoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5m
by93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 13:03:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 13:03:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6eP2-0008Vc-Md; Wed, 09 Dec 2015 13:03:28 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6eP0-0008VS-Qr
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 13:03:26 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	84/EE-10678-E9628665; Wed, 09 Dec 2015 13:03:26 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1449666204!9664062!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32358 invoked from network); 9 Dec 2015 13:03:25 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 13:03:25 -0000
X-IronPort-AV: E=Sophos;i="5.20,403,1444694400"; 
   d="scan'208";a="9639828"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4A==
Date: Wed, 9 Dec 2015 13:02:13 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
In-Reply-To: <56680BA2.4060104@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21h
aWx0bzpvbWVnQGludmlzaWJsZXRoaW5nc2xhYi5jb21dDQo+IFNlbnQ6IDA5IERlY2VtYmVyIDIw
MTUgMTE6MDgNCj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2pl
Y3Qub3JnDQo+IFN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBBZHZpY2Ugb24gZXZ0Y2huIGlu
dGVycnVwdCBoYW5kbGluZw0KPiANCj4gT24gMjAxNS0xMi0wOSAxMTo0NCwgUGF1bCBEdXJyYW50
IHdyb3RlOg0KPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+PiBGcm9tOiB3aW4t
cHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZl
bC0NCj4gPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFs
IFdvamR5bGENCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxMDoxOQ0KPiA+PiBUbzogd2lu
LXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+IFN1YmplY3Q6IFt3aW4tcHYtZGV2
ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+ID4+DQo+ID4+IEhpLA0K
PiA+Pg0KPiA+PiBJIGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4ZW5p
ZmFjZSB0aGF0IEknbSBub3Qgc3VyZSBob3cNCj4gPj4gdG8gcHJvcGVybHkgZml4LiBOYW1lbHks
IHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZvciBhDQo+ID4+IHBhcnRp
Y3VsYXIgY2hhbm5lbCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBz
aWduYWxzIHRoZQ0KPiA+PiBjYWxsZXItcHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJbiBzdWNo
IGNhc2UgdGhlIGludGVycnVwdCBjYWxsYmFjaw0KPiA+PiBmYWlscyB0byBpbnNlcnQgdGhlIERQ
QyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50aWFsbHkgY2F1c2luZw0KPiA+PiBh
IHZjaGFuICJkZWFkbG9jayIgZG93biB0aGUgd2F5Lg0KPiA+Pg0KPiA+DQo+ID4gSGkgUmFmYWws
DQo+ID4NCj4gPiBUaGF0IHNob3VsZG4ndCBiZSB0aGUgY2FzZS4gV2luZG93cyBkZS1xdWV1ZXMg
YSBEUEMgYmVmb3JlIHJ1bm5pbmcgZm9yDQo+IHByZWNpc2VseSB0aGlzIGtpbmQgb2YgcmVhc29u
LiBJLmUuIGp1c3QgYmVjYXVzZSB5b3VyIERQQyBpcyBydW5uaW5nLCBpdCBzaG91bGQNCj4gbm90
IHN0b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWlu
ZyBhIGZhaWx1cmUgdG8NCj4gcXVldWUgZXZlbiB3aGVuIG5vIERQQyBpcyBhY3R1YWxseSBxdWV1
ZWQ/IFdoYXQgeW91IG1heSBhY3R1YWxseSBiZQ0KPiBnZXR0aW5nIGNhdWdodCBieSBpcyBldnRj
aG4gYXV0by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFibGVkIGF1dG8tbWFza2luZw0KPiB0aGVu
IHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgdW5tYXNrIGF0IHRoZSBlbmQgb2YgeW91ciBEUEMuIChU
aGUgdHJhbnNtaXR0ZXINCj4gYW5kIHJlY2VpdmVyIHJpbmcgRFBDcyBpbiBYRU5WSUYgYXJlIGEg
Z29vZCBleGFtcGxlIG9mIHRoaXMpLg0KPiA+DQo+ID4gQ2hlZXJzLA0KPiA+DQo+ID4gICBQYXVs
DQo+ID4NCj4gSGVyZSdzIHRoZSByZWxldmFudCBiaXQ6DQo+IGh0dHA6Ly94ZW5iaXRzLnhlbi5v
cmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVuaWZhY2UuZ2l0O2E9YmxvYjtmPXNyYy94DQo+
IGVuaWZhY2UvaW9jdGxfZXZ0Y2huLmM7aD05YzVhZjE5ZTAwYTkxYTA4ZjY4ZGEwYzYzMDcwOWNi
YWE2ZTg0MTNkO2hiPQ0KPiBIRUFEI2w2Ng0KPiANCj4gSSBjaGVjayB0aGUgcmVzdWx0IG9mIEtl
SW5zZXJ0UXVldWVEcGMoKSBhbmQgSSBkZWZpbml0ZWx5IHNlZSBpdCBmYWlsDQo+IHNvbWV0aW1l
cywgZXZlbiBpZiB0aGUgSFZNIG9ubHkgaGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlIGNo
YW5uZWwNCj4gYWZ0ZXIgc2V0dGluZyBhbiBldmVudCBzbyB0aGlzIHNob3VsZG4ndCBiZSB0aGUg
cmVhc29uLg0KPiANCg0KVGhlIGFydGljbGUgYXQgaHR0cHM6Ly93d3cub3Nyb25saW5lLmNvbS9h
cnRpY2xlLmNmbT9hcnRpY2xlPTUyOSBpcyB3b3J0aCByZWFkaW5nLiBUaGUgY29tbWVudCBsYWJl
bGxlZCAiRFBDIFJlZW50cmFuY3kiIHBvaW50cyBvdXQgdGhhdCBEUENzIGFyZSBkZS1xdWV1ZWQg
YmVmb3JlIGJlaW5nIGV4ZWN1dGVkLiBTbyByZWFsbHkgeW91IHNob3VsZCBub3Qgc2VlIGEgcXVl
dWVpbmcgZmFpbHVyZSB1bmxlc3MgZWl0aGVyIHRoZW4gdW5tYXNraW5nIGlzIG5vdCB3b3JraW5n
IGNvcnJlY3RseSBvciB0aGVyZSdzIGEgYnVnIGluIFdpbmRvd3MgaXRzZWxmLg0KQXJlIHlvdSBy
dW5uaW5nIG9uIGEgWGVuIHdpdGggRklGTyBldmVudHMgb3IgaXMgaXQgb2xkIGVub3VnaCB0byBv
bmx5IGJlIDJMPw0KDQogIFBhdWwNCg0KPiA+PiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2Fj
aCB0aGlzPyBUaGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPj4gSElHSF9MRVZFTCB3
aGljaCBpcyBhbiBpc3N1ZSB3aGVuIGl0IGNvbWVzIHRvIHN5bmNocm9uaXphdGlvbiB3aXRoDQo+
IHNvbWUNCj4gPj4gb3RoZXIgY29kZSB0aGF0IGNvdWxkIHRha2UgY2FyZSBvZiBzdWNoICJwZW5k
aW5nIiBldmVudHMuDQo+ID4+DQo+ID4+IEFsc28gSSB3b25kZXIgaWYgdGhlIGtlcm5lbCBkaWZm
ZXJlbnRpYXRlcyBEUENzIG9ubHkgYnkgdGhlaXIgS0RQQw0KPiA+PiBhZGRyZXNzLCBvciBhbHNv
IGJ5IGFyZ3VtZW50cyBwYXNzZWQgdG8gS2VJbnNlcnRRdWV1ZURwYygpPw0KPiA+Pg0KPiAtLQ0K
PiBSYWZhxYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyDQo+
IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmlu
L21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 13:03:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 13:03:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6eP2-0008Vc-Md; Wed, 09 Dec 2015 13:03:28 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6eP0-0008VS-Qr
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 13:03:26 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	84/EE-10678-E9628665; Wed, 09 Dec 2015 13:03:26 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1449666204!9664062!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32358 invoked from network); 9 Dec 2015 13:03:25 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 13:03:25 -0000
X-IronPort-AV: E=Sophos;i="5.20,403,1444694400"; 
   d="scan'208";a="9639828"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4A==
Date: Wed, 9 Dec 2015 13:02:13 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
In-Reply-To: <56680BA2.4060104@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21h
aWx0bzpvbWVnQGludmlzaWJsZXRoaW5nc2xhYi5jb21dDQo+IFNlbnQ6IDA5IERlY2VtYmVyIDIw
MTUgMTE6MDgNCj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2pl
Y3Qub3JnDQo+IFN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBBZHZpY2Ugb24gZXZ0Y2huIGlu
dGVycnVwdCBoYW5kbGluZw0KPiANCj4gT24gMjAxNS0xMi0wOSAxMTo0NCwgUGF1bCBEdXJyYW50
IHdyb3RlOg0KPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+PiBGcm9tOiB3aW4t
cHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZl
bC0NCj4gPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFs
IFdvamR5bGENCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxMDoxOQ0KPiA+PiBUbzogd2lu
LXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+IFN1YmplY3Q6IFt3aW4tcHYtZGV2
ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+ID4+DQo+ID4+IEhpLA0K
PiA+Pg0KPiA+PiBJIGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4ZW5p
ZmFjZSB0aGF0IEknbSBub3Qgc3VyZSBob3cNCj4gPj4gdG8gcHJvcGVybHkgZml4LiBOYW1lbHks
IHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZvciBhDQo+ID4+IHBhcnRp
Y3VsYXIgY2hhbm5lbCBjYW4gYmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBz
aWduYWxzIHRoZQ0KPiA+PiBjYWxsZXItcHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJbiBzdWNo
IGNhc2UgdGhlIGludGVycnVwdCBjYWxsYmFjaw0KPiA+PiBmYWlscyB0byBpbnNlcnQgdGhlIERQ
QyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50aWFsbHkgY2F1c2luZw0KPiA+PiBh
IHZjaGFuICJkZWFkbG9jayIgZG93biB0aGUgd2F5Lg0KPiA+Pg0KPiA+DQo+ID4gSGkgUmFmYWws
DQo+ID4NCj4gPiBUaGF0IHNob3VsZG4ndCBiZSB0aGUgY2FzZS4gV2luZG93cyBkZS1xdWV1ZXMg
YSBEUEMgYmVmb3JlIHJ1bm5pbmcgZm9yDQo+IHByZWNpc2VseSB0aGlzIGtpbmQgb2YgcmVhc29u
LiBJLmUuIGp1c3QgYmVjYXVzZSB5b3VyIERQQyBpcyBydW5uaW5nLCBpdCBzaG91bGQNCj4gbm90
IHN0b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWlu
ZyBhIGZhaWx1cmUgdG8NCj4gcXVldWUgZXZlbiB3aGVuIG5vIERQQyBpcyBhY3R1YWxseSBxdWV1
ZWQ/IFdoYXQgeW91IG1heSBhY3R1YWxseSBiZQ0KPiBnZXR0aW5nIGNhdWdodCBieSBpcyBldnRj
aG4gYXV0by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFibGVkIGF1dG8tbWFza2luZw0KPiB0aGVu
IHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgdW5tYXNrIGF0IHRoZSBlbmQgb2YgeW91ciBEUEMuIChU
aGUgdHJhbnNtaXR0ZXINCj4gYW5kIHJlY2VpdmVyIHJpbmcgRFBDcyBpbiBYRU5WSUYgYXJlIGEg
Z29vZCBleGFtcGxlIG9mIHRoaXMpLg0KPiA+DQo+ID4gQ2hlZXJzLA0KPiA+DQo+ID4gICBQYXVs
DQo+ID4NCj4gSGVyZSdzIHRoZSByZWxldmFudCBiaXQ6DQo+IGh0dHA6Ly94ZW5iaXRzLnhlbi5v
cmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVuaWZhY2UuZ2l0O2E9YmxvYjtmPXNyYy94DQo+
IGVuaWZhY2UvaW9jdGxfZXZ0Y2huLmM7aD05YzVhZjE5ZTAwYTkxYTA4ZjY4ZGEwYzYzMDcwOWNi
YWE2ZTg0MTNkO2hiPQ0KPiBIRUFEI2w2Ng0KPiANCj4gSSBjaGVjayB0aGUgcmVzdWx0IG9mIEtl
SW5zZXJ0UXVldWVEcGMoKSBhbmQgSSBkZWZpbml0ZWx5IHNlZSBpdCBmYWlsDQo+IHNvbWV0aW1l
cywgZXZlbiBpZiB0aGUgSFZNIG9ubHkgaGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlIGNo
YW5uZWwNCj4gYWZ0ZXIgc2V0dGluZyBhbiBldmVudCBzbyB0aGlzIHNob3VsZG4ndCBiZSB0aGUg
cmVhc29uLg0KPiANCg0KVGhlIGFydGljbGUgYXQgaHR0cHM6Ly93d3cub3Nyb25saW5lLmNvbS9h
cnRpY2xlLmNmbT9hcnRpY2xlPTUyOSBpcyB3b3J0aCByZWFkaW5nLiBUaGUgY29tbWVudCBsYWJl
bGxlZCAiRFBDIFJlZW50cmFuY3kiIHBvaW50cyBvdXQgdGhhdCBEUENzIGFyZSBkZS1xdWV1ZWQg
YmVmb3JlIGJlaW5nIGV4ZWN1dGVkLiBTbyByZWFsbHkgeW91IHNob3VsZCBub3Qgc2VlIGEgcXVl
dWVpbmcgZmFpbHVyZSB1bmxlc3MgZWl0aGVyIHRoZW4gdW5tYXNraW5nIGlzIG5vdCB3b3JraW5n
IGNvcnJlY3RseSBvciB0aGVyZSdzIGEgYnVnIGluIFdpbmRvd3MgaXRzZWxmLg0KQXJlIHlvdSBy
dW5uaW5nIG9uIGEgWGVuIHdpdGggRklGTyBldmVudHMgb3IgaXMgaXQgb2xkIGVub3VnaCB0byBv
bmx5IGJlIDJMPw0KDQogIFBhdWwNCg0KPiA+PiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2Fj
aCB0aGlzPyBUaGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPj4gSElHSF9MRVZFTCB3
aGljaCBpcyBhbiBpc3N1ZSB3aGVuIGl0IGNvbWVzIHRvIHN5bmNocm9uaXphdGlvbiB3aXRoDQo+
IHNvbWUNCj4gPj4gb3RoZXIgY29kZSB0aGF0IGNvdWxkIHRha2UgY2FyZSBvZiBzdWNoICJwZW5k
aW5nIiBldmVudHMuDQo+ID4+DQo+ID4+IEFsc28gSSB3b25kZXIgaWYgdGhlIGtlcm5lbCBkaWZm
ZXJlbnRpYXRlcyBEUENzIG9ubHkgYnkgdGhlaXIgS0RQQw0KPiA+PiBhZGRyZXNzLCBvciBhbHNv
IGJ5IGFyZ3VtZW50cyBwYXNzZWQgdG8gS2VJbnNlcnRRdWV1ZURwYygpPw0KPiA+Pg0KPiAtLQ0K
PiBSYWZhxYIgV29qZHnFgmENCj4gUXViZXMgVG9vbHMgZm9yIFdpbmRvd3MgZGV2ZWxvcGVyDQo+
IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fCndpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QKd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnCmh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmlu
L21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVs

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 13:32:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 13:32:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6erD-0001R2-Ts; Wed, 09 Dec 2015 13:32:35 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6erC-0001Qx-NQ
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 13:32:34 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	2C/F0-22142-27D28665; Wed, 09 Dec 2015 13:32:34 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1449667952!9270395!1
X-Originating-IP: [209.85.192.51]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23208 invoked from network); 9 Dec 2015 13:32:33 -0000
Received: from mail-qg0-f51.google.com (HELO mail-qg0-f51.google.com)
	(209.85.192.51)
	by server-13.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 9 Dec 2015 13:32:33 -0000
Received: by qgea14 with SMTP id a14so79127615qge.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 09 Dec 2015 05:32:32 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=x3Os40z3ghBTHLKHDKVxDBvZe83RtaL8YHqZaFyK1ns=;
	b=LrQCAFrs/WlCghgJASvtr7/VqBDy7yo80tv8byH/44ysb7QMwKLfHdYDVvgwPQwT6S
	RFQpEWrrw2JYlwhihplikqKrCxvda1LXRLwuTkmnBu9iCroI/uG84bdJNcbkTu7qtDQl
	4DRISRbKcqT0Hpx99IwnO0ReOOe4mvRjSjb1GsiOyEWQ/0m7i5T8gWpGQTN766LG9ipN
	Hfn9zpbpcDJTz8pXTxSXcCMOhjmN066ShLsoaqzSzYpoJJyxK/G/LHKVZt+pr64lO4Hu
	A8h7/IQj50i5KU68Uo/2sz5pwMn8zIRXdgZC/dzeC/C6kgTtaQyFdXtCLlOewAcPeUFm
	QAGw==
X-Received: by 10.13.222.70 with SMTP id h67mr358717ywe.185.1449667952634;
	Wed, 09 Dec 2015 05:32:32 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	b126sm5716767ywd.3.2015.12.09.05.32.31
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 09 Dec 2015 05:32:31 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  9 Dec 2015 13:32:17 +0000
Message-Id: <1449667937-2164-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Fix assertion failure in WLK Hot Add Device
	Test
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SystemProcessorChangeCallback needs to whitelist another processor state
change.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xen/system.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/xen/system.c b/src/xen/system.c
index 1934011..3905273 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -692,6 +692,9 @@ SystemProcessorChangeCallback(
                                      NULL);
         break;
     }
+    case KeProcessorAddFailureNotify:
+        break;
+
     default:
         ASSERT(FALSE);
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 13:32:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 13:32:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6erD-0001R2-Ts; Wed, 09 Dec 2015 13:32:35 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6erC-0001Qx-NQ
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 13:32:34 +0000
Received: from [85.158.139.211] by server-14.bemta-5.messagelabs.com id
	2C/F0-22142-27D28665; Wed, 09 Dec 2015 13:32:34 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1449667952!9270395!1
X-Originating-IP: [209.85.192.51]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23208 invoked from network); 9 Dec 2015 13:32:33 -0000
Received: from mail-qg0-f51.google.com (HELO mail-qg0-f51.google.com)
	(209.85.192.51)
	by server-13.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 9 Dec 2015 13:32:33 -0000
Received: by qgea14 with SMTP id a14so79127615qge.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 09 Dec 2015 05:32:32 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=x3Os40z3ghBTHLKHDKVxDBvZe83RtaL8YHqZaFyK1ns=;
	b=LrQCAFrs/WlCghgJASvtr7/VqBDy7yo80tv8byH/44ysb7QMwKLfHdYDVvgwPQwT6S
	RFQpEWrrw2JYlwhihplikqKrCxvda1LXRLwuTkmnBu9iCroI/uG84bdJNcbkTu7qtDQl
	4DRISRbKcqT0Hpx99IwnO0ReOOe4mvRjSjb1GsiOyEWQ/0m7i5T8gWpGQTN766LG9ipN
	Hfn9zpbpcDJTz8pXTxSXcCMOhjmN066ShLsoaqzSzYpoJJyxK/G/LHKVZt+pr64lO4Hu
	A8h7/IQj50i5KU68Uo/2sz5pwMn8zIRXdgZC/dzeC/C6kgTtaQyFdXtCLlOewAcPeUFm
	QAGw==
X-Received: by 10.13.222.70 with SMTP id h67mr358717ywe.185.1449667952634;
	Wed, 09 Dec 2015 05:32:32 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	b126sm5716767ywd.3.2015.12.09.05.32.31
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 09 Dec 2015 05:32:31 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  9 Dec 2015 13:32:17 +0000
Message-Id: <1449667937-2164-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Fix assertion failure in WLK Hot Add Device
	Test
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

SystemProcessorChangeCallback needs to whitelist another processor state
change.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xen/system.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/xen/system.c b/src/xen/system.c
index 1934011..3905273 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -692,6 +692,9 @@ SystemProcessorChangeCallback(
                                      NULL);
         break;
     }
+    case KeProcessorAddFailureNotify:
+        break;
+
     default:
         ASSERT(FALSE);
         break;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 14:05:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 14:05:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6fNF-0003Ys-Gt; Wed, 09 Dec 2015 14:05:41 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a6fNE-0003Yl-3k
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 14:05:40 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	88/CC-21901-33538665; Wed, 09 Dec 2015 14:05:39 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1449669935!9557180!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12752 invoked from network); 9 Dec 2015 14:05:36 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-4.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 9 Dec 2015 14:05:36 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 621A62087A
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 09:05:35 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute6.internal (MEProxy); Wed, 09 Dec 2015 09:05:35 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=6us95kq6Dbp2+ZEq
	rJQEOpy8SB8=; b=oM89caCxgddXdEm5gLytrKeYzCABbDtwGfh92eAvJa4teKEG
	j8SqRn6OjFRr2ZRFZgxp6ZBssG9EP7YMsFNGrOPiRGnVd/6+ueiB7FnpY5fkyz+a
	YEeYWhe7GyPYg/PW8wLmVUkekUhi1Ryp+8oXnY7fsHuSpJ1gVroBpR5zygw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=6us95kq6Dbp2+ZE
	qrJQEOpy8SB8=; b=CCMoM/1M0HdoO2D9/5tdbe7QCh8Lv+gjoPEGj4Zs/a8cPhP
	ihNqziEY1ky4ifWfRsXsd68aSFAPgdsypt/cXoc2s9ecI2RPITdyYkqHnJVqXdDH
	wkakdcvEn7QRhoVyxR+oW4e/h/FewsIp/T1hVIKLIrCdqyHaGKfDobcevszM=
X-Sasl-enc: UvpiEWlHtJ0koZHWCkxdauYy1aOHaGLGy/sQFot4gy0M 1449669935
Received: from [10.137.2.8] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id C0FB8C016C4;
	Wed,  9 Dec 2015 09:05:34 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <5668352B.6080909@invisiblethingslab.com>
Date: Wed, 9 Dec 2015 15:05:31 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.1.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
Content-Length: 4410
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMTIvMDkvMjAxNSAwMjowMiBQTSwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdp
bmFsIE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21haWx0bzpvbWVnQGlu
dmlzaWJsZXRoaW5nc2xhYi5jb21dCj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTE6MDgKPj4g
VG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCj4+IFN1
YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBBZHZpY2Ugb24gZXZ0Y2huIGludGVycnVwdCBoYW5k
bGluZwo+Pgo+PiBPbiAyMDE1LTEyLTA5IDExOjQ0LCBQYXVsIER1cnJhbnQgd3JvdGU6Cj4+Pj4g
LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4+PiBib3VuY2Vz
QGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQo+Pj4+IFNl
bnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkKPj4+PiBUbzogd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCj4+Pj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gQWR2aWNlIG9uIGV2dGNo
biBpbnRlcnJ1cHQgaGFuZGxpbmcKPj4+Pgo+Pj4+IEhpLAo+Pj4+Cj4+Pj4gSSBmb3VuZCBhbiBp
c3N1ZSBpbiBteSBldnRjaG4gaGFuZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUg
aG93Cj4+Pj4gdG8gcHJvcGVybHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sg
dGhhdCdzIGFzc2lnbmVkIGZvciBhCj4+Pj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxs
ZWQgYmVmb3JlIGl0cyBxdWV1ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlCj4+Pj4gY2FsbGVyLXBy
b3ZpZGVkIGV2ZW50KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJh
Y2sKPj4+PiBmYWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9z
dCwgcG90ZW50aWFsbHkgY2F1c2luZwo+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3
YXkuCj4+Pj4KPj4+Cj4+PiBIaSBSYWZhbCwKPj4+Cj4+PiBUaGF0IHNob3VsZG4ndCBiZSB0aGUg
Y2FzZS4gV2luZG93cyBkZS1xdWV1ZXMgYSBEUEMgYmVmb3JlIHJ1bm5pbmcgZm9yCj4+IHByZWNp
c2VseSB0aGlzIGtpbmQgb2YgcmVhc29uLiBJLmUuIGp1c3QgYmVjYXVzZSB5b3VyIERQQyBpcyBy
dW5uaW5nLCBpdCBzaG91bGQKPj4gbm90IHN0b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4g
QXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUgdG8KPj4gcXVldWUgZXZlbiB3aGVu
IG5vIERQQyBpcyBhY3R1YWxseSBxdWV1ZWQ/IFdoYXQgeW91IG1heSBhY3R1YWxseSBiZQo+PiBn
ZXR0aW5nIGNhdWdodCBieSBpcyBldnRjaG4gYXV0by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFi
bGVkIGF1dG8tbWFza2luZwo+PiB0aGVuIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgdW5tYXNrIGF0
IHRoZSBlbmQgb2YgeW91ciBEUEMuIChUaGUgdHJhbnNtaXR0ZXIKPj4gYW5kIHJlY2VpdmVyIHJp
bmcgRFBDcyBpbiBYRU5WSUYgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMpLgo+Pj4KPj4+IENo
ZWVycywKPj4+Cj4+PiAgIFBhdWwKPj4+Cj4+IEhlcmUncyB0aGUgcmVsZXZhbnQgYml0Ogo+PiBo
dHRwOi8veGVuYml0cy54ZW4ub3JnL2dpdHdlYi8/cD1wdmRyaXZlcnMvd2luL3hlbmlmYWNlLmdp
dDthPWJsb2I7Zj1zcmMveAo+PiBlbmlmYWNlL2lvY3RsX2V2dGNobi5jO2g9OWM1YWYxOWUwMGE5
MWEwOGY2OGRhMGM2MzA3MDljYmFhNmU4NDEzZDtoYj0KPj4gSEVBRCNsNjYKPj4KPj4gSSBjaGVj
ayB0aGUgcmVzdWx0IG9mIEtlSW5zZXJ0UXVldWVEcGMoKSBhbmQgSSBkZWZpbml0ZWx5IHNlZSBp
dCBmYWlsCj4+IHNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZNIG9ubHkgaGFzIDEgdmNwdS4gTXkg
RFBDIHVubWFza3MgdGhlIGNoYW5uZWwKPj4gYWZ0ZXIgc2V0dGluZyBhbiBldmVudCBzbyB0aGlz
IHNob3VsZG4ndCBiZSB0aGUgcmVhc29uLgo+Pgo+IAo+IFRoZSBhcnRpY2xlIGF0IGh0dHBzOi8v
d3d3Lm9zcm9ubGluZS5jb20vYXJ0aWNsZS5jZm0/YXJ0aWNsZT01MjkgaXMgd29ydGggcmVhZGlu
Zy4gVGhlIGNvbW1lbnQgbGFiZWxsZWQgIkRQQyBSZWVudHJhbmN5IiBwb2ludHMgb3V0IHRoYXQg
RFBDcyBhcmUgZGUtcXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlvdSBz
aG91bGQgbm90IHNlZSBhIHF1ZXVlaW5nIGZhaWx1cmUgdW5sZXNzIGVpdGhlciB0aGVuIHVubWFz
a2luZyBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkgb3IgdGhlcmUncyBhIGJ1ZyBpbiBXaW5kb3dz
IGl0c2VsZi4KClllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3
aGV0aGVyIEknbSBtaXNzaW5nCnNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2
aW9yIEkgc2VlLgoKPiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2ZW50cyBv
ciBpcyBpdCBvbGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/Cj4gCj4gICBQYXVsCgpXZSdyZSB1c2lu
ZyA0LjQuMyByaWdodCBub3cuCgo+IAo+Pj4+IEFueSBhZHZpY2Ugb24gaG93IHRvIGFwcHJvYWNo
IHRoaXM/IFRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgcnVucyBhdAo+Pj4+IEhJR0hfTEVWRUwgd2hp
Y2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5jaHJvbml6YXRpb24gd2l0aAo+PiBz
b21lCj4+Pj4gb3RoZXIgY29kZSB0aGF0IGNvdWxkIHRha2UgY2FyZSBvZiBzdWNoICJwZW5kaW5n
IiBldmVudHMuCj4+Pj4KPj4+PiBBbHNvIEkgd29uZGVyIGlmIHRoZSBrZXJuZWwgZGlmZmVyZW50
aWF0ZXMgRFBDcyBvbmx5IGJ5IHRoZWlyIEtEUEMKPj4+PiBhZGRyZXNzLCBvciBhbHNvIGJ5IGFy
Z3VtZW50cyBwYXNzZWQgdG8gS2VJbnNlcnRRdWV1ZURwYygpPwo+Pj4+CgotLSAKUmFmYcWCIFdv
amR5xYJhClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJl
cy1vcy5vcmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Xwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZv
L3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 14:05:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 14:05:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6fNF-0003Ys-Gt; Wed, 09 Dec 2015 14:05:41 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a6fNE-0003Yl-3k
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 14:05:40 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	88/CC-21901-33538665; Wed, 09 Dec 2015 14:05:39 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-4.tower-206.messagelabs.com!1449669935!9557180!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12752 invoked from network); 9 Dec 2015 14:05:36 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-4.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 9 Dec 2015 14:05:36 -0000
Received: from compute6.internal (compute6.nyi.internal [10.202.2.46])
	by mailout.nyi.internal (Postfix) with ESMTP id 621A62087A
	for <win-pv-devel@lists.xenproject.org>;
	Wed,  9 Dec 2015 09:05:35 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute6.internal (MEProxy); Wed, 09 Dec 2015 09:05:35 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=6us95kq6Dbp2+ZEq
	rJQEOpy8SB8=; b=oM89caCxgddXdEm5gLytrKeYzCABbDtwGfh92eAvJa4teKEG
	j8SqRn6OjFRr2ZRFZgxp6ZBssG9EP7YMsFNGrOPiRGnVd/6+ueiB7FnpY5fkyz+a
	YEeYWhe7GyPYg/PW8wLmVUkekUhi1Ryp+8oXnY7fsHuSpJ1gVroBpR5zygw=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=6us95kq6Dbp2+ZE
	qrJQEOpy8SB8=; b=CCMoM/1M0HdoO2D9/5tdbe7QCh8Lv+gjoPEGj4Zs/a8cPhP
	ihNqziEY1ky4ifWfRsXsd68aSFAPgdsypt/cXoc2s9ecI2RPITdyYkqHnJVqXdDH
	wkakdcvEn7QRhoVyxR+oW4e/h/FewsIp/T1hVIKLIrCdqyHaGKfDobcevszM=
X-Sasl-enc: UvpiEWlHtJ0koZHWCkxdauYy1aOHaGLGy/sQFot4gy0M 1449669935
Received: from [10.137.2.8] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id C0FB8C016C4;
	Wed,  9 Dec 2015 09:05:34 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <5668352B.6080909@invisiblethingslab.com>
Date: Wed, 9 Dec 2015 15:05:31 +0100
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101
	Thunderbird/38.1.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
Content-Length: 4410
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMTIvMDkvMjAxNSAwMjowMiBQTSwgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdp
bmFsIE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21haWx0bzpvbWVnQGlu
dmlzaWJsZXRoaW5nc2xhYi5jb21dCj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTE6MDgKPj4g
VG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCj4+IFN1
YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBBZHZpY2Ugb24gZXZ0Y2huIGludGVycnVwdCBoYW5k
bGluZwo+Pgo+PiBPbiAyMDE1LTEyLTA5IDExOjQ0LCBQYXVsIER1cnJhbnQgd3JvdGU6Cj4+Pj4g
LS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0KPj4+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4+PiBib3VuY2Vz
QGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQo+Pj4+IFNl
bnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkKPj4+PiBUbzogd2luLXB2LWRldmVsQGxpc3RzLnhl
bnByb2plY3Qub3JnCj4+Pj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gQWR2aWNlIG9uIGV2dGNo
biBpbnRlcnJ1cHQgaGFuZGxpbmcKPj4+Pgo+Pj4+IEhpLAo+Pj4+Cj4+Pj4gSSBmb3VuZCBhbiBp
c3N1ZSBpbiBteSBldnRjaG4gaGFuZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUg
aG93Cj4+Pj4gdG8gcHJvcGVybHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sg
dGhhdCdzIGFzc2lnbmVkIGZvciBhCj4+Pj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxs
ZWQgYmVmb3JlIGl0cyBxdWV1ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlCj4+Pj4gY2FsbGVyLXBy
b3ZpZGVkIGV2ZW50KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJh
Y2sKPj4+PiBmYWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9z
dCwgcG90ZW50aWFsbHkgY2F1c2luZwo+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3
YXkuCj4+Pj4KPj4+Cj4+PiBIaSBSYWZhbCwKPj4+Cj4+PiBUaGF0IHNob3VsZG4ndCBiZSB0aGUg
Y2FzZS4gV2luZG93cyBkZS1xdWV1ZXMgYSBEUEMgYmVmb3JlIHJ1bm5pbmcgZm9yCj4+IHByZWNp
c2VseSB0aGlzIGtpbmQgb2YgcmVhc29uLiBJLmUuIGp1c3QgYmVjYXVzZSB5b3VyIERQQyBpcyBy
dW5uaW5nLCBpdCBzaG91bGQKPj4gbm90IHN0b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4g
QXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUgdG8KPj4gcXVldWUgZXZlbiB3aGVu
IG5vIERQQyBpcyBhY3R1YWxseSBxdWV1ZWQ/IFdoYXQgeW91IG1heSBhY3R1YWxseSBiZQo+PiBn
ZXR0aW5nIGNhdWdodCBieSBpcyBldnRjaG4gYXV0by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFi
bGVkIGF1dG8tbWFza2luZwo+PiB0aGVuIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgdW5tYXNrIGF0
IHRoZSBlbmQgb2YgeW91ciBEUEMuIChUaGUgdHJhbnNtaXR0ZXIKPj4gYW5kIHJlY2VpdmVyIHJp
bmcgRFBDcyBpbiBYRU5WSUYgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMpLgo+Pj4KPj4+IENo
ZWVycywKPj4+Cj4+PiAgIFBhdWwKPj4+Cj4+IEhlcmUncyB0aGUgcmVsZXZhbnQgYml0Ogo+PiBo
dHRwOi8veGVuYml0cy54ZW4ub3JnL2dpdHdlYi8/cD1wdmRyaXZlcnMvd2luL3hlbmlmYWNlLmdp
dDthPWJsb2I7Zj1zcmMveAo+PiBlbmlmYWNlL2lvY3RsX2V2dGNobi5jO2g9OWM1YWYxOWUwMGE5
MWEwOGY2OGRhMGM2MzA3MDljYmFhNmU4NDEzZDtoYj0KPj4gSEVBRCNsNjYKPj4KPj4gSSBjaGVj
ayB0aGUgcmVzdWx0IG9mIEtlSW5zZXJ0UXVldWVEcGMoKSBhbmQgSSBkZWZpbml0ZWx5IHNlZSBp
dCBmYWlsCj4+IHNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZNIG9ubHkgaGFzIDEgdmNwdS4gTXkg
RFBDIHVubWFza3MgdGhlIGNoYW5uZWwKPj4gYWZ0ZXIgc2V0dGluZyBhbiBldmVudCBzbyB0aGlz
IHNob3VsZG4ndCBiZSB0aGUgcmVhc29uLgo+Pgo+IAo+IFRoZSBhcnRpY2xlIGF0IGh0dHBzOi8v
d3d3Lm9zcm9ubGluZS5jb20vYXJ0aWNsZS5jZm0/YXJ0aWNsZT01MjkgaXMgd29ydGggcmVhZGlu
Zy4gVGhlIGNvbW1lbnQgbGFiZWxsZWQgIkRQQyBSZWVudHJhbmN5IiBwb2ludHMgb3V0IHRoYXQg
RFBDcyBhcmUgZGUtcXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlvdSBz
aG91bGQgbm90IHNlZSBhIHF1ZXVlaW5nIGZhaWx1cmUgdW5sZXNzIGVpdGhlciB0aGVuIHVubWFz
a2luZyBpcyBub3Qgd29ya2luZyBjb3JyZWN0bHkgb3IgdGhlcmUncyBhIGJ1ZyBpbiBXaW5kb3dz
IGl0c2VsZi4KClllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3
aGV0aGVyIEknbSBtaXNzaW5nCnNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2
aW9yIEkgc2VlLgoKPiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2ZW50cyBv
ciBpcyBpdCBvbGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/Cj4gCj4gICBQYXVsCgpXZSdyZSB1c2lu
ZyA0LjQuMyByaWdodCBub3cuCgo+IAo+Pj4+IEFueSBhZHZpY2Ugb24gaG93IHRvIGFwcHJvYWNo
IHRoaXM/IFRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgcnVucyBhdAo+Pj4+IEhJR0hfTEVWRUwgd2hp
Y2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5jaHJvbml6YXRpb24gd2l0aAo+PiBz
b21lCj4+Pj4gb3RoZXIgY29kZSB0aGF0IGNvdWxkIHRha2UgY2FyZSBvZiBzdWNoICJwZW5kaW5n
IiBldmVudHMuCj4+Pj4KPj4+PiBBbHNvIEkgd29uZGVyIGlmIHRoZSBrZXJuZWwgZGlmZmVyZW50
aWF0ZXMgRFBDcyBvbmx5IGJ5IHRoZWlyIEtEUEMKPj4+PiBhZGRyZXNzLCBvciBhbHNvIGJ5IGFy
Z3VtZW50cyBwYXNzZWQgdG8gS2VJbnNlcnRRdWV1ZURwYygpPwo+Pj4+CgotLSAKUmFmYcWCIFdv
amR5xYJhClF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJl
cy1vcy5vcmcvCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
Xwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZv
L3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 14:52:31 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 14:52:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6g6Z-0008Kn-Dn; Wed, 09 Dec 2015 14:52:31 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6g6X-0008Kc-7n
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 14:52:29 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	1E/16-14900-C2048665; Wed, 09 Dec 2015 14:52:28 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1449672747!2229348!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 33241 invoked from network); 9 Dec 2015 14:52:27 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 14:52:27 -0000
X-IronPort-AV: E=Sophos;i="5.20,404,1444694400"; 
   d="scan'208";a="9650787"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAAdZdA=
Date: Wed, 9 Dec 2015 14:52:24 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB33D@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
In-Reply-To: <5668352B.6080909@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MDkgRGVjZW1iZXIgMjAxNSAxNDowNg0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmlj
ZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+IA0KPiBPbiAxMi8wOS8yMDE1IDAyOjAy
IFBNLCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t
DQo+ID4+IEZyb206IFJhZmHFgiBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdz
bGFiLmNvbV0NCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxMTowOA0KPiA+PiBUbzogUGF1
bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4gU3ViamVj
dDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5n
DQo+ID4+DQo+ID4+IE9uIDIwMTUtMTItMDkgMTE6NDQsIFBhdWwgRHVycmFudCB3cm90ZToNCj4g
Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+IEZyb206IHdpbi1wdi1kZXZl
bC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LQ0KPiBkZXZlbC0N
Cj4gPj4+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwg
V29qZHlsYQ0KPiA+Pj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkNCj4gPj4+PiBUbzog
d2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+Pj4gU3ViamVjdDogW3dpbi1w
di1kZXZlbF0gQWR2aWNlIG9uIGV2dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gPj4+Pg0KPiA+
Pj4+IEhpLA0KPiA+Pj4+DQo+ID4+Pj4gSSBmb3VuZCBhbiBpc3N1ZSBpbiBteSBldnRjaG4gaGFu
ZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUgaG93DQo+ID4+Pj4gdG8gcHJvcGVy
bHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZv
ciBhDQo+ID4+Pj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBx
dWV1ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlDQo+ID4+Pj4gY2FsbGVyLXByb3ZpZGVkIGV2ZW50
KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sNCj4gPj4+PiBm
YWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50
aWFsbHkgY2F1c2luZw0KPiA+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+
ID4+Pj4NCj4gPj4+DQo+ID4+PiBIaSBSYWZhbCwNCj4gPj4+DQo+ID4+PiBUaGF0IHNob3VsZG4n
dCBiZSB0aGUgY2FzZS4gV2luZG93cyBkZS1xdWV1ZXMgYSBEUEMgYmVmb3JlIHJ1bm5pbmcNCj4g
Zm9yDQo+ID4+IHByZWNpc2VseSB0aGlzIGtpbmQgb2YgcmVhc29uLiBJLmUuIGp1c3QgYmVjYXVz
ZSB5b3VyIERQQyBpcyBydW5uaW5nLCBpdA0KPiBzaG91bGQNCj4gPj4gbm90IHN0b3AgYW5vdGhl
ciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUg
dG8NCj4gPj4gcXVldWUgZXZlbiB3aGVuIG5vIERQQyBpcyBhY3R1YWxseSBxdWV1ZWQ/IFdoYXQg
eW91IG1heSBhY3R1YWxseSBiZQ0KPiA+PiBnZXR0aW5nIGNhdWdodCBieSBpcyBldnRjaG4gYXV0
by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFibGVkIGF1dG8tDQo+IG1hc2tpbmcNCj4gPj4gdGhl
biB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlvdXIgRFBDLiAo
VGhlDQo+IHRyYW5zbWl0dGVyDQo+ID4+IGFuZCByZWNlaXZlciByaW5nIERQQ3MgaW4gWEVOVklG
IGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCj4gPj4+DQo+ID4+PiBDaGVlcnMsDQo+ID4+
Pg0KPiA+Pj4gICBQYXVsDQo+ID4+Pg0KPiA+PiBIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoNCj4g
Pj4NCj4gaHR0cDovL3hlbmJpdHMueGVuLm9yZy9naXR3ZWIvP3A9cHZkcml2ZXJzL3dpbi94ZW5p
ZmFjZS5naXQ7YT1ibG9iO2Y9c3JjL3gNCj4gPj4NCj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYzto
PTljNWFmMTllMDBhOTFhMDhmNjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9DQo+ID4+IEhFQUQj
bDY2DQo+ID4+DQo+ID4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkg
YW5kIEkgZGVmaW5pdGVseSBzZWUgaXQgZmFpbA0KPiA+PiBzb21ldGltZXMsIGV2ZW4gaWYgdGhl
IEhWTSBvbmx5IGhhcyAxIHZjcHUuIE15IERQQyB1bm1hc2tzIHRoZQ0KPiBjaGFubmVsDQo+ID4+
IGFmdGVyIHNldHRpbmcgYW4gZXZlbnQgc28gdGhpcyBzaG91bGRuJ3QgYmUgdGhlIHJlYXNvbi4N
Cj4gPj4NCj4gPg0KPiA+IFRoZSBhcnRpY2xlIGF0IGh0dHBzOi8vd3d3Lm9zcm9ubGluZS5jb20v
YXJ0aWNsZS5jZm0/YXJ0aWNsZT01MjkgaXMgd29ydGgNCj4gcmVhZGluZy4gVGhlIGNvbW1lbnQg
bGFiZWxsZWQgIkRQQyBSZWVudHJhbmN5IiBwb2ludHMgb3V0IHRoYXQgRFBDcyBhcmUNCj4gZGUt
cXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlvdSBzaG91bGQgbm90IHNl
ZSBhIHF1ZXVlaW5nDQo+IGZhaWx1cmUgdW5sZXNzIGVpdGhlciB0aGVuIHVubWFza2luZyBpcyBu
b3Qgd29ya2luZyBjb3JyZWN0bHkgb3IgdGhlcmUncyBhIGJ1Zw0KPiBpbiBXaW5kb3dzIGl0c2Vs
Zi4NCj4gDQo+IFllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3
aGV0aGVyIEknbSBtaXNzaW5nDQo+IHNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJl
aGF2aW9yIEkgc2VlLg0KPiANCj4gPiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZP
IGV2ZW50cyBvciBpcyBpdCBvbGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/DQo+ID4NCj4gPiAgIFBh
dWwNCj4gDQo+IFdlJ3JlIHVzaW5nIDQuNC4zIHJpZ2h0IG5vdy4NCj4gDQoNCkknZCBoYXZlIHRv
IGNoZWNrLCBidXQgdGhhdCBtYXkgd2VsbCBtZWFuIHlvdSBvbmx5IGhhdmUgMkwuLi4gSSB3b25k
ZXIgaWYgdGhlcmUncyBhIGJ1ZyBpbiB1bm1hc2sgdGhlbi4uLiBwb3NzaWJseSB0aGUgaHlwZXJj
YWxsIHdhcyBub3QgaW1wbGVtZW50ZWQuIEknbGwgaGF2ZSBhIGxvb2suDQoNCiAgUGF1bA0KDQo+
ID4NCj4gPj4+PiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJy
dXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPj4+PiBISUdIX0xFVkVMIHdoaWNoIGlzIGFuIGlzc3Vl
IHdoZW4gaXQgY29tZXMgdG8gc3luY2hyb25pemF0aW9uIHdpdGgNCj4gPj4gc29tZQ0KPiA+Pj4+
IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Ygc3VjaCAicGVuZGluZyIgZXZlbnRz
Lg0KPiA+Pj4+DQo+ID4+Pj4gQWxzbyBJIHdvbmRlciBpZiB0aGUga2VybmVsIGRpZmZlcmVudGlh
dGVzIERQQ3Mgb25seSBieSB0aGVpciBLRFBDDQo+ID4+Pj4gYWRkcmVzcywgb3IgYWxzbyBieSBh
cmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVldWVEcGMoKT8NCj4gPj4+Pg0KPiANCj4gLS0N
Cj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0K
PiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQo+IA0KPiBfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXw0KPiB3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0DQo+
IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBodHRwOi8vbGlzdHMueGVucHJv
amVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA0KX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxp
bmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhl
bnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 14:52:31 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 14:52:31 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6g6Z-0008Kn-Dn; Wed, 09 Dec 2015 14:52:31 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6g6X-0008Kc-7n
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 14:52:29 +0000
Received: from [85.158.137.68] by server-12.bemta-3.messagelabs.com id
	1E/16-14900-C2048665; Wed, 09 Dec 2015 14:52:28 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1449672747!2229348!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 33241 invoked from network); 9 Dec 2015 14:52:27 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 14:52:27 -0000
X-IronPort-AV: E=Sophos;i="5.20,404,1444694400"; 
   d="scan'208";a="9650787"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAAdZdA=
Date: Wed, 9 Dec 2015 14:52:24 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB33D@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
In-Reply-To: <5668352B.6080909@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MDkgRGVjZW1iZXIgMjAxNSAxNDowNg0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmlj
ZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+IA0KPiBPbiAxMi8wOS8yMDE1IDAyOjAy
IFBNLCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t
DQo+ID4+IEZyb206IFJhZmHFgiBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdz
bGFiLmNvbV0NCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxMTowOA0KPiA+PiBUbzogUGF1
bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4gU3ViamVj
dDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5n
DQo+ID4+DQo+ID4+IE9uIDIwMTUtMTItMDkgMTE6NDQsIFBhdWwgRHVycmFudCB3cm90ZToNCj4g
Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+IEZyb206IHdpbi1wdi1kZXZl
bC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LQ0KPiBkZXZlbC0N
Cj4gPj4+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwg
V29qZHlsYQ0KPiA+Pj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkNCj4gPj4+PiBUbzog
d2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+Pj4gU3ViamVjdDogW3dpbi1w
di1kZXZlbF0gQWR2aWNlIG9uIGV2dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gPj4+Pg0KPiA+
Pj4+IEhpLA0KPiA+Pj4+DQo+ID4+Pj4gSSBmb3VuZCBhbiBpc3N1ZSBpbiBteSBldnRjaG4gaGFu
ZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUgaG93DQo+ID4+Pj4gdG8gcHJvcGVy
bHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZv
ciBhDQo+ID4+Pj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBx
dWV1ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlDQo+ID4+Pj4gY2FsbGVyLXByb3ZpZGVkIGV2ZW50
KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sNCj4gPj4+PiBm
YWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50
aWFsbHkgY2F1c2luZw0KPiA+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+
ID4+Pj4NCj4gPj4+DQo+ID4+PiBIaSBSYWZhbCwNCj4gPj4+DQo+ID4+PiBUaGF0IHNob3VsZG4n
dCBiZSB0aGUgY2FzZS4gV2luZG93cyBkZS1xdWV1ZXMgYSBEUEMgYmVmb3JlIHJ1bm5pbmcNCj4g
Zm9yDQo+ID4+IHByZWNpc2VseSB0aGlzIGtpbmQgb2YgcmVhc29uLiBJLmUuIGp1c3QgYmVjYXVz
ZSB5b3VyIERQQyBpcyBydW5uaW5nLCBpdA0KPiBzaG91bGQNCj4gPj4gbm90IHN0b3AgYW5vdGhl
ciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUg
dG8NCj4gPj4gcXVldWUgZXZlbiB3aGVuIG5vIERQQyBpcyBhY3R1YWxseSBxdWV1ZWQ/IFdoYXQg
eW91IG1heSBhY3R1YWxseSBiZQ0KPiA+PiBnZXR0aW5nIGNhdWdodCBieSBpcyBldnRjaG4gYXV0
by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFibGVkIGF1dG8tDQo+IG1hc2tpbmcNCj4gPj4gdGhl
biB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlvdXIgRFBDLiAo
VGhlDQo+IHRyYW5zbWl0dGVyDQo+ID4+IGFuZCByZWNlaXZlciByaW5nIERQQ3MgaW4gWEVOVklG
IGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCj4gPj4+DQo+ID4+PiBDaGVlcnMsDQo+ID4+
Pg0KPiA+Pj4gICBQYXVsDQo+ID4+Pg0KPiA+PiBIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoNCj4g
Pj4NCj4gaHR0cDovL3hlbmJpdHMueGVuLm9yZy9naXR3ZWIvP3A9cHZkcml2ZXJzL3dpbi94ZW5p
ZmFjZS5naXQ7YT1ibG9iO2Y9c3JjL3gNCj4gPj4NCj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYzto
PTljNWFmMTllMDBhOTFhMDhmNjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9DQo+ID4+IEhFQUQj
bDY2DQo+ID4+DQo+ID4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkg
YW5kIEkgZGVmaW5pdGVseSBzZWUgaXQgZmFpbA0KPiA+PiBzb21ldGltZXMsIGV2ZW4gaWYgdGhl
IEhWTSBvbmx5IGhhcyAxIHZjcHUuIE15IERQQyB1bm1hc2tzIHRoZQ0KPiBjaGFubmVsDQo+ID4+
IGFmdGVyIHNldHRpbmcgYW4gZXZlbnQgc28gdGhpcyBzaG91bGRuJ3QgYmUgdGhlIHJlYXNvbi4N
Cj4gPj4NCj4gPg0KPiA+IFRoZSBhcnRpY2xlIGF0IGh0dHBzOi8vd3d3Lm9zcm9ubGluZS5jb20v
YXJ0aWNsZS5jZm0/YXJ0aWNsZT01MjkgaXMgd29ydGgNCj4gcmVhZGluZy4gVGhlIGNvbW1lbnQg
bGFiZWxsZWQgIkRQQyBSZWVudHJhbmN5IiBwb2ludHMgb3V0IHRoYXQgRFBDcyBhcmUNCj4gZGUt
cXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlvdSBzaG91bGQgbm90IHNl
ZSBhIHF1ZXVlaW5nDQo+IGZhaWx1cmUgdW5sZXNzIGVpdGhlciB0aGVuIHVubWFza2luZyBpcyBu
b3Qgd29ya2luZyBjb3JyZWN0bHkgb3IgdGhlcmUncyBhIGJ1Zw0KPiBpbiBXaW5kb3dzIGl0c2Vs
Zi4NCj4gDQo+IFllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3
aGV0aGVyIEknbSBtaXNzaW5nDQo+IHNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJl
aGF2aW9yIEkgc2VlLg0KPiANCj4gPiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZP
IGV2ZW50cyBvciBpcyBpdCBvbGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/DQo+ID4NCj4gPiAgIFBh
dWwNCj4gDQo+IFdlJ3JlIHVzaW5nIDQuNC4zIHJpZ2h0IG5vdy4NCj4gDQoNCkknZCBoYXZlIHRv
IGNoZWNrLCBidXQgdGhhdCBtYXkgd2VsbCBtZWFuIHlvdSBvbmx5IGhhdmUgMkwuLi4gSSB3b25k
ZXIgaWYgdGhlcmUncyBhIGJ1ZyBpbiB1bm1hc2sgdGhlbi4uLiBwb3NzaWJseSB0aGUgaHlwZXJj
YWxsIHdhcyBub3QgaW1wbGVtZW50ZWQuIEknbGwgaGF2ZSBhIGxvb2suDQoNCiAgUGF1bA0KDQo+
ID4NCj4gPj4+PiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJy
dXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPj4+PiBISUdIX0xFVkVMIHdoaWNoIGlzIGFuIGlzc3Vl
IHdoZW4gaXQgY29tZXMgdG8gc3luY2hyb25pemF0aW9uIHdpdGgNCj4gPj4gc29tZQ0KPiA+Pj4+
IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Ygc3VjaCAicGVuZGluZyIgZXZlbnRz
Lg0KPiA+Pj4+DQo+ID4+Pj4gQWxzbyBJIHdvbmRlciBpZiB0aGUga2VybmVsIGRpZmZlcmVudGlh
dGVzIERQQ3Mgb25seSBieSB0aGVpciBLRFBDDQo+ID4+Pj4gYWRkcmVzcywgb3IgYWxzbyBieSBh
cmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVldWVEcGMoKT8NCj4gPj4+Pg0KPiANCj4gLS0N
Cj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRvb2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0K
PiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQo+IA0KPiBfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXw0KPiB3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0DQo+
IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBodHRwOi8vbGlzdHMueGVucHJv
amVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA0KX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVsIG1haWxp
bmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhl
bnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 14:58:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 14:58:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6gCQ-0000CB-Gv; Wed, 09 Dec 2015 14:58:34 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6gCP-0000C6-DW
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 14:58:33 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	05/C0-32615-89148665; Wed, 09 Dec 2015 14:58:32 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-10.tower-206.messagelabs.com!1449673111!9533269!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29568 invoked from network); 9 Dec 2015 14:58:31 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-10.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 14:58:31 -0000
X-IronPort-AV: E=Sophos;i="5.20,404,1444694400"; 
   d="scan'208";a="9651385"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>, =?utf-8?B?UmFmYcWCIFdvamR5xYJh?=
	<omeg@invisiblethingslab.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAAdZdCAAAHvEA==
Date: Wed, 9 Dec 2015 14:58:29 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB381@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB33D@AMSPEX01CL01.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB33D@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFBhdWwgRHVycmFudA0KPiBTZW50OiAw
OSBEZWNlbWJlciAyMDE1IDE0OjUyDQo+IFRvOiBSYWZhxYIgV29qZHnFgmE7IHdpbi1wdi1kZXZl
bEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1kZXZlbF0gQWR2
aWNlIG9uIGV2dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gDQo+ID4gLS0tLS1PcmlnaW5hbCBN
ZXNzYWdlLS0tLS0NCj4gPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gPiBib3VuY2VzQGxpc3RzLnhlbnByb2pl
Y3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQ0KPiA+IFNlbnQ6IDA5IERlY2VtYmVy
IDIwMTUgMTQ6MDYNCj4gPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVu
cHJvamVjdC5vcmcNCj4gPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1kZXZlbF0gQWR2aWNlIG9uIGV2
dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gPg0KPiA+IE9uIDEyLzA5LzIwMTUgMDI6MDIgUE0s
IFBhdWwgRHVycmFudCB3cm90ZToNCj4gPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K
PiA+ID4+IEZyb206IFJhZmHFgiBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdz
bGFiLmNvbV0NCj4gPiA+PiBTZW50OiAwOSBEZWNlbWJlciAyMDE1IDExOjA4DQo+ID4gPj4gVG86
IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4gPj4g
U3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhh
bmRsaW5nDQo+ID4gPj4NCj4gPiA+PiBPbiAyMDE1LTEyLTA5IDExOjQ0LCBQYXVsIER1cnJhbnQg
d3JvdGU6DQo+ID4gPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+ID4+Pj4gRnJv
bTogd2luLXB2LWRldmVsLWJvdW5jZXNAbGlzdHMueGVucHJvamVjdC5vcmcgW21haWx0bzp3aW4t
cHYtDQo+ID4gZGV2ZWwtDQo+ID4gPj4+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBP
biBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQ0KPiA+ID4+Pj4gU2VudDogMDkgRGVjZW1iZXIgMjAx
NSAxMDoxOQ0KPiA+ID4+Pj4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0K
PiA+ID4+Pj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gQWR2aWNlIG9uIGV2dGNobiBpbnRlcnJ1
cHQgaGFuZGxpbmcNCj4gPiA+Pj4+DQo+ID4gPj4+PiBIaSwNCj4gPiA+Pj4+DQo+ID4gPj4+PiBJ
IGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4ZW5pZmFjZSB0aGF0IEkn
bSBub3Qgc3VyZQ0KPiBob3cNCj4gPiA+Pj4+IHRvIHByb3Blcmx5IGZpeC4gTmFtZWx5LCB0aGUg
aW50ZXJydXB0IGNhbGxiYWNrIHRoYXQncyBhc3NpZ25lZCBmb3IgYQ0KPiA+ID4+Pj4gcGFydGlj
dWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBxdWV1ZWQgRFBDICh0aGF0IHNp
Z25hbHMNCj4gdGhlDQo+ID4gPj4+PiBjYWxsZXItcHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJ
biBzdWNoIGNhc2UgdGhlIGludGVycnVwdCBjYWxsYmFjaw0KPiA+ID4+Pj4gZmFpbHMgdG8gaW5z
ZXJ0IHRoZSBEUEMgYWdhaW4gYW5kIGFuIGV2ZW50IGlzIGxvc3QsIHBvdGVudGlhbGx5IGNhdXNp
bmcNCj4gPiA+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+ID4gPj4+Pg0K
PiA+ID4+Pg0KPiA+ID4+PiBIaSBSYWZhbCwNCj4gPiA+Pj4NCj4gPiA+Pj4gVGhhdCBzaG91bGRu
J3QgYmUgdGhlIGNhc2UuIFdpbmRvd3MgZGUtcXVldWVzIGEgRFBDIGJlZm9yZSBydW5uaW5nDQo+
ID4gZm9yDQo+ID4gPj4gcHJlY2lzZWx5IHRoaXMga2luZCBvZiByZWFzb24uIEkuZS4ganVzdCBi
ZWNhdXNlIHlvdXIgRFBDIGlzIHJ1bm5pbmcsIGl0DQo+ID4gc2hvdWxkDQo+ID4gPj4gbm90IHN0
b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBh
IGZhaWx1cmUNCj4gdG8NCj4gPiA+PiBxdWV1ZSBldmVuIHdoZW4gbm8gRFBDIGlzIGFjdHVhbGx5
IHF1ZXVlZD8gV2hhdCB5b3UgbWF5IGFjdHVhbGx5IGJlDQo+ID4gPj4gZ2V0dGluZyBjYXVnaHQg
YnkgaXMgZXZ0Y2huIGF1dG8tbWFza2luZy4gSWYgeW91IGhhdmUgZW5hYmxlZCBhdXRvLQ0KPiA+
IG1hc2tpbmcNCj4gPiA+PiB0aGVuIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgdW5tYXNrIGF0IHRo
ZSBlbmQgb2YgeW91ciBEUEMuIChUaGUNCj4gPiB0cmFuc21pdHRlcg0KPiA+ID4+IGFuZCByZWNl
aXZlciByaW5nIERQQ3MgaW4gWEVOVklGIGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCj4g
PiA+Pj4NCj4gPiA+Pj4gQ2hlZXJzLA0KPiA+ID4+Pg0KPiA+ID4+PiAgIFBhdWwNCj4gPiA+Pj4N
Cj4gPiA+PiBIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoNCj4gPiA+Pg0KPiA+DQo+IGh0dHA6Ly94
ZW5iaXRzLnhlbi5vcmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVuaWZhY2UuZ2l0O2E9Ymxv
YjtmPXNyYy94DQo+ID4gPj4NCj4gPg0KPiBlbmlmYWNlL2lvY3RsX2V2dGNobi5jO2g9OWM1YWYx
OWUwMGE5MWEwOGY2OGRhMGM2MzA3MDljYmFhNmU4NDEzZDtoYj0NCj4gPiA+PiBIRUFEI2w2Ng0K
PiA+ID4+DQo+ID4gPj4gSSBjaGVjayB0aGUgcmVzdWx0IG9mIEtlSW5zZXJ0UXVldWVEcGMoKSBh
bmQgSSBkZWZpbml0ZWx5IHNlZSBpdCBmYWlsDQo+ID4gPj4gc29tZXRpbWVzLCBldmVuIGlmIHRo
ZSBIVk0gb25seSBoYXMgMSB2Y3B1LiBNeSBEUEMgdW5tYXNrcyB0aGUNCj4gPiBjaGFubmVsDQo+
ID4gPj4gYWZ0ZXIgc2V0dGluZyBhbiBldmVudCBzbyB0aGlzIHNob3VsZG4ndCBiZSB0aGUgcmVh
c29uLg0KPiA+ID4+DQo+ID4gPg0KPiA+ID4gVGhlIGFydGljbGUgYXQgaHR0cHM6Ly93d3cub3Ny
b25saW5lLmNvbS9hcnRpY2xlLmNmbT9hcnRpY2xlPTUyOSBpcyB3b3J0aA0KPiA+IHJlYWRpbmcu
IFRoZSBjb21tZW50IGxhYmVsbGVkICJEUEMgUmVlbnRyYW5jeSIgcG9pbnRzIG91dCB0aGF0IERQ
Q3MgYXJlDQo+ID4gZGUtcXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlv
dSBzaG91bGQgbm90IHNlZSBhDQo+IHF1ZXVlaW5nDQo+ID4gZmFpbHVyZSB1bmxlc3MgZWl0aGVy
IHRoZW4gdW5tYXNraW5nIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSBvciB0aGVyZSdzIGENCj4g
YnVnDQo+ID4gaW4gV2luZG93cyBpdHNlbGYuDQo+ID4NCj4gPiBZZWFoLCBJJ3ZlIHJlYWQgdGhh
dCBiZWZvcmUgYW5kIHdhcyB3b25kZXJpbmcgd2hldGhlciBJJ20gbWlzc2luZw0KPiA+IHNvbWV0
aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2aW9yIEkgc2VlLg0KPiA+DQo+ID4gPiBB
cmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2ZW50cyBvciBpcyBpdCBvbGQgZW5v
dWdoIHRvIG9ubHkgYmUNCj4gMkw/DQo+ID4gPg0KPiA+ID4gICBQYXVsDQo+ID4NCj4gPiBXZSdy
ZSB1c2luZyA0LjQuMyByaWdodCBub3cuDQo+ID4NCj4gDQo+IEknZCBoYXZlIHRvIGNoZWNrLCBi
dXQgdGhhdCBtYXkgd2VsbCBtZWFuIHlvdSBvbmx5IGhhdmUgMkwuLi4gSSB3b25kZXIgaWYNCj4g
dGhlcmUncyBhIGJ1ZyBpbiB1bm1hc2sgdGhlbi4uLiBwb3NzaWJseSB0aGUgaHlwZXJjYWxsIHdh
cyBub3QgaW1wbGVtZW50ZWQuDQo+IEknbGwgaGF2ZSBhIGxvb2suDQoNCk5vLCBGSUZPIGlzIHRo
ZXJlIGluIDQuNC4zIGFuZCBzbyBpcyBFVlRDSE5PUF91bm1hc2ssIHNvIGl0IHNob3VsZCBhbGwg
d29yayBhcyBpbnRlbmRlZC4NCg0KICBQYXVsDQoNCj4gDQo+ICAgUGF1bA0KPiANCj4gPiA+DQo+
ID4gPj4+PiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJydXB0
IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPiA+Pj4+IEhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUg
d2hlbiBpdCBjb21lcyB0byBzeW5jaHJvbml6YXRpb24gd2l0aA0KPiA+ID4+IHNvbWUNCj4gPiA+
Pj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Ygc3VjaCAicGVuZGluZyIgZXZl
bnRzLg0KPiA+ID4+Pj4NCj4gPiA+Pj4+IEFsc28gSSB3b25kZXIgaWYgdGhlIGtlcm5lbCBkaWZm
ZXJlbnRpYXRlcyBEUENzIG9ubHkgYnkgdGhlaXIgS0RQQw0KPiA+ID4+Pj4gYWRkcmVzcywgb3Ig
YWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVldWVEcGMoKT8NCj4gPiA+Pj4+
DQo+ID4NCj4gPiAtLQ0KPiA+IFJhZmHFgiBXb2pkecWCYQ0KPiA+IFF1YmVzIFRvb2xzIGZvciBX
aW5kb3dzIGRldmVsb3Blcg0KPiA+IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCj4gPg0KPiA+
IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+ID4gd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdA0KPiA+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZw0KPiA+IGh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlz
dGluZm8vd2luLXB2LWRldmVsDQo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4gd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2kt
YmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVsDQpfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1w
di1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcv
Y2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 14:58:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 14:58:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6gCQ-0000CB-Gv; Wed, 09 Dec 2015 14:58:34 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7788b8ed3=Paul.Durrant@citrix.com>)
	id 1a6gCP-0000C6-DW
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 14:58:33 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	05/C0-32615-89148665; Wed, 09 Dec 2015 14:58:32 +0000
X-Env-Sender: prvs=7788b8ed3=Paul.Durrant@citrix.com
X-Msg-Ref: server-10.tower-206.messagelabs.com!1449673111!9533269!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29568 invoked from network); 9 Dec 2015 14:58:31 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-10.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	9 Dec 2015 14:58:31 -0000
X-IronPort-AV: E=Sophos;i="5.20,404,1444694400"; 
   d="scan'208";a="9651385"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <Paul.Durrant@citrix.com>, =?utf-8?B?UmFmYcWCIFdvamR5xYJh?=
	<omeg@invisiblethingslab.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAAdZdCAAAHvEA==
Date: Wed, 9 Dec 2015 14:58:29 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB381@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB33D@AMSPEX01CL01.citrite.net>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DB33D@AMSPEX01CL01.citrite.net>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFBhdWwgRHVycmFudA0KPiBTZW50OiAw
OSBEZWNlbWJlciAyMDE1IDE0OjUyDQo+IFRvOiBSYWZhxYIgV29qZHnFgmE7IHdpbi1wdi1kZXZl
bEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0KPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1kZXZlbF0gQWR2
aWNlIG9uIGV2dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gDQo+ID4gLS0tLS1PcmlnaW5hbCBN
ZXNzYWdlLS0tLS0NCj4gPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gPiBib3VuY2VzQGxpc3RzLnhlbnByb2pl
Y3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQ0KPiA+IFNlbnQ6IDA5IERlY2VtYmVy
IDIwMTUgMTQ6MDYNCj4gPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVu
cHJvamVjdC5vcmcNCj4gPiBTdWJqZWN0OiBSZTogW3dpbi1wdi1kZXZlbF0gQWR2aWNlIG9uIGV2
dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gPg0KPiA+IE9uIDEyLzA5LzIwMTUgMDI6MDIgUE0s
IFBhdWwgRHVycmFudCB3cm90ZToNCj4gPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K
PiA+ID4+IEZyb206IFJhZmHFgiBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdz
bGFiLmNvbV0NCj4gPiA+PiBTZW50OiAwOSBEZWNlbWJlciAyMDE1IDExOjA4DQo+ID4gPj4gVG86
IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4gPj4g
U3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhh
bmRsaW5nDQo+ID4gPj4NCj4gPiA+PiBPbiAyMDE1LTEyLTA5IDExOjQ0LCBQYXVsIER1cnJhbnQg
d3JvdGU6DQo+ID4gPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+ID4+Pj4gRnJv
bTogd2luLXB2LWRldmVsLWJvdW5jZXNAbGlzdHMueGVucHJvamVjdC5vcmcgW21haWx0bzp3aW4t
cHYtDQo+ID4gZGV2ZWwtDQo+ID4gPj4+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBP
biBCZWhhbGYgT2YgUmFmYWwgV29qZHlsYQ0KPiA+ID4+Pj4gU2VudDogMDkgRGVjZW1iZXIgMjAx
NSAxMDoxOQ0KPiA+ID4+Pj4gVG86IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZw0K
PiA+ID4+Pj4gU3ViamVjdDogW3dpbi1wdi1kZXZlbF0gQWR2aWNlIG9uIGV2dGNobiBpbnRlcnJ1
cHQgaGFuZGxpbmcNCj4gPiA+Pj4+DQo+ID4gPj4+PiBIaSwNCj4gPiA+Pj4+DQo+ID4gPj4+PiBJ
IGZvdW5kIGFuIGlzc3VlIGluIG15IGV2dGNobiBoYW5kbGluZyBpbiB4ZW5pZmFjZSB0aGF0IEkn
bSBub3Qgc3VyZQ0KPiBob3cNCj4gPiA+Pj4+IHRvIHByb3Blcmx5IGZpeC4gTmFtZWx5LCB0aGUg
aW50ZXJydXB0IGNhbGxiYWNrIHRoYXQncyBhc3NpZ25lZCBmb3IgYQ0KPiA+ID4+Pj4gcGFydGlj
dWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBxdWV1ZWQgRFBDICh0aGF0IHNp
Z25hbHMNCj4gdGhlDQo+ID4gPj4+PiBjYWxsZXItcHJvdmlkZWQgZXZlbnQpIGZpbmlzaGVzLiBJ
biBzdWNoIGNhc2UgdGhlIGludGVycnVwdCBjYWxsYmFjaw0KPiA+ID4+Pj4gZmFpbHMgdG8gaW5z
ZXJ0IHRoZSBEUEMgYWdhaW4gYW5kIGFuIGV2ZW50IGlzIGxvc3QsIHBvdGVudGlhbGx5IGNhdXNp
bmcNCj4gPiA+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+ID4gPj4+Pg0K
PiA+ID4+Pg0KPiA+ID4+PiBIaSBSYWZhbCwNCj4gPiA+Pj4NCj4gPiA+Pj4gVGhhdCBzaG91bGRu
J3QgYmUgdGhlIGNhc2UuIFdpbmRvd3MgZGUtcXVldWVzIGEgRFBDIGJlZm9yZSBydW5uaW5nDQo+
ID4gZm9yDQo+ID4gPj4gcHJlY2lzZWx5IHRoaXMga2luZCBvZiByZWFzb24uIEkuZS4ganVzdCBi
ZWNhdXNlIHlvdXIgRFBDIGlzIHJ1bm5pbmcsIGl0DQo+ID4gc2hvdWxkDQo+ID4gPj4gbm90IHN0
b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBh
IGZhaWx1cmUNCj4gdG8NCj4gPiA+PiBxdWV1ZSBldmVuIHdoZW4gbm8gRFBDIGlzIGFjdHVhbGx5
IHF1ZXVlZD8gV2hhdCB5b3UgbWF5IGFjdHVhbGx5IGJlDQo+ID4gPj4gZ2V0dGluZyBjYXVnaHQg
YnkgaXMgZXZ0Y2huIGF1dG8tbWFza2luZy4gSWYgeW91IGhhdmUgZW5hYmxlZCBhdXRvLQ0KPiA+
IG1hc2tpbmcNCj4gPiA+PiB0aGVuIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgdW5tYXNrIGF0IHRo
ZSBlbmQgb2YgeW91ciBEUEMuIChUaGUNCj4gPiB0cmFuc21pdHRlcg0KPiA+ID4+IGFuZCByZWNl
aXZlciByaW5nIERQQ3MgaW4gWEVOVklGIGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCj4g
PiA+Pj4NCj4gPiA+Pj4gQ2hlZXJzLA0KPiA+ID4+Pg0KPiA+ID4+PiAgIFBhdWwNCj4gPiA+Pj4N
Cj4gPiA+PiBIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoNCj4gPiA+Pg0KPiA+DQo+IGh0dHA6Ly94
ZW5iaXRzLnhlbi5vcmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVuaWZhY2UuZ2l0O2E9Ymxv
YjtmPXNyYy94DQo+ID4gPj4NCj4gPg0KPiBlbmlmYWNlL2lvY3RsX2V2dGNobi5jO2g9OWM1YWYx
OWUwMGE5MWEwOGY2OGRhMGM2MzA3MDljYmFhNmU4NDEzZDtoYj0NCj4gPiA+PiBIRUFEI2w2Ng0K
PiA+ID4+DQo+ID4gPj4gSSBjaGVjayB0aGUgcmVzdWx0IG9mIEtlSW5zZXJ0UXVldWVEcGMoKSBh
bmQgSSBkZWZpbml0ZWx5IHNlZSBpdCBmYWlsDQo+ID4gPj4gc29tZXRpbWVzLCBldmVuIGlmIHRo
ZSBIVk0gb25seSBoYXMgMSB2Y3B1LiBNeSBEUEMgdW5tYXNrcyB0aGUNCj4gPiBjaGFubmVsDQo+
ID4gPj4gYWZ0ZXIgc2V0dGluZyBhbiBldmVudCBzbyB0aGlzIHNob3VsZG4ndCBiZSB0aGUgcmVh
c29uLg0KPiA+ID4+DQo+ID4gPg0KPiA+ID4gVGhlIGFydGljbGUgYXQgaHR0cHM6Ly93d3cub3Ny
b25saW5lLmNvbS9hcnRpY2xlLmNmbT9hcnRpY2xlPTUyOSBpcyB3b3J0aA0KPiA+IHJlYWRpbmcu
IFRoZSBjb21tZW50IGxhYmVsbGVkICJEUEMgUmVlbnRyYW5jeSIgcG9pbnRzIG91dCB0aGF0IERQ
Q3MgYXJlDQo+ID4gZGUtcXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlv
dSBzaG91bGQgbm90IHNlZSBhDQo+IHF1ZXVlaW5nDQo+ID4gZmFpbHVyZSB1bmxlc3MgZWl0aGVy
IHRoZW4gdW5tYXNraW5nIGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSBvciB0aGVyZSdzIGENCj4g
YnVnDQo+ID4gaW4gV2luZG93cyBpdHNlbGYuDQo+ID4NCj4gPiBZZWFoLCBJJ3ZlIHJlYWQgdGhh
dCBiZWZvcmUgYW5kIHdhcyB3b25kZXJpbmcgd2hldGhlciBJJ20gbWlzc2luZw0KPiA+IHNvbWV0
aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2aW9yIEkgc2VlLg0KPiA+DQo+ID4gPiBB
cmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2ZW50cyBvciBpcyBpdCBvbGQgZW5v
dWdoIHRvIG9ubHkgYmUNCj4gMkw/DQo+ID4gPg0KPiA+ID4gICBQYXVsDQo+ID4NCj4gPiBXZSdy
ZSB1c2luZyA0LjQuMyByaWdodCBub3cuDQo+ID4NCj4gDQo+IEknZCBoYXZlIHRvIGNoZWNrLCBi
dXQgdGhhdCBtYXkgd2VsbCBtZWFuIHlvdSBvbmx5IGhhdmUgMkwuLi4gSSB3b25kZXIgaWYNCj4g
dGhlcmUncyBhIGJ1ZyBpbiB1bm1hc2sgdGhlbi4uLiBwb3NzaWJseSB0aGUgaHlwZXJjYWxsIHdh
cyBub3QgaW1wbGVtZW50ZWQuDQo+IEknbGwgaGF2ZSBhIGxvb2suDQoNCk5vLCBGSUZPIGlzIHRo
ZXJlIGluIDQuNC4zIGFuZCBzbyBpcyBFVlRDSE5PUF91bm1hc2ssIHNvIGl0IHNob3VsZCBhbGwg
d29yayBhcyBpbnRlbmRlZC4NCg0KICBQYXVsDQoNCj4gDQo+ICAgUGF1bA0KPiANCj4gPiA+DQo+
ID4gPj4+PiBBbnkgYWR2aWNlIG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJydXB0
IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPiA+Pj4+IEhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUg
d2hlbiBpdCBjb21lcyB0byBzeW5jaHJvbml6YXRpb24gd2l0aA0KPiA+ID4+IHNvbWUNCj4gPiA+
Pj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNhcmUgb2Ygc3VjaCAicGVuZGluZyIgZXZl
bnRzLg0KPiA+ID4+Pj4NCj4gPiA+Pj4+IEFsc28gSSB3b25kZXIgaWYgdGhlIGtlcm5lbCBkaWZm
ZXJlbnRpYXRlcyBEUENzIG9ubHkgYnkgdGhlaXIgS0RQQw0KPiA+ID4+Pj4gYWRkcmVzcywgb3Ig
YWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVldWVEcGMoKT8NCj4gPiA+Pj4+
DQo+ID4NCj4gPiAtLQ0KPiA+IFJhZmHFgiBXb2pkecWCYQ0KPiA+IFF1YmVzIFRvb2xzIGZvciBX
aW5kb3dzIGRldmVsb3Blcg0KPiA+IGh0dHBzOi8vd3d3LnF1YmVzLW9zLm9yZy8NCj4gPg0KPiA+
IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fDQo+ID4gd2lu
LXB2LWRldmVsIG1haWxpbmcgbGlzdA0KPiA+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZw0KPiA+IGh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2ktYmluL21haWxtYW4vbGlz
dGluZm8vd2luLXB2LWRldmVsDQo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fDQo+IHdpbi1wdi1kZXZlbCBtYWlsaW5nIGxpc3QNCj4gd2luLXB2LWRldmVs
QGxpc3RzLnhlbnByb2plY3Qub3JnDQo+IGh0dHA6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9jZ2kt
YmluL21haWxtYW4vbGlzdGluZm8vd2luLXB2LWRldmVsDQpfX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0Cndpbi1w
di1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcv
Y2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 17:19:17 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 17:19:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6iOb-0002wp-Mp; Wed, 09 Dec 2015 17:19:17 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6iOZ-0002wc-OH
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 17:19:15 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	4F/AA-18316-39268665; Wed, 09 Dec 2015 17:19:15 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1449681554!4488226!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25435 invoked from network); 9 Dec 2015 17:19:14 -0000
Received: from mail-wm0-f53.google.com (HELO mail-wm0-f53.google.com)
	(74.125.82.53)
	by server-14.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 9 Dec 2015 17:19:14 -0000
Received: by wmvv187 with SMTP id v187so272900558wmv.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 09 Dec 2015 09:19:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=lB21fKorFwgM+jCNeAJfBnp6FOxdDBC5fhGUk+TETEY=;
	b=yxAn2EBMnC5mzo9ESi9ZUlBHcwtGvIBcxqq0xRUWAMTXCS3qac6faEbYAYqL2Mg+Ld
	KtHZy9ezuEJZwfHb6bE1Gb2x8dH77OC5Ry2/Tmtch3ijBFL3QwjiGXyvxW40oL2pFwN6
	ZKPSMTAjPiE3a89MwqBFUYhlB01qfXqVmJ4v+vad5g+ou6fhtw/FviW/g2HQYiCCJUAw
	oZMUzKq7xr/gfoHYWoLfLr4iZNgPqvxzdNEWA456W6M5Nj4CADcXC5sXtr81zfhDZJwY
	vzEYYmQ9t8AmJ8xZyKX6SJ3sb2poiuy1QFvHMYB04qBL8xCE2H9Twv3dGpOKiethfmMv
	sv/A==
X-Received: by 10.28.53.130 with SMTP id c124mr12135824wma.16.1449681554263;
	Wed, 09 Dec 2015 09:19:14 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jz1sm8570019wjc.27.2015.12.09.09.19.13
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 09 Dec 2015 09:19:13 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  9 Dec 2015 17:19:02 +0000
Message-Id: <1449681542-21820-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449681542-21820-1-git-send-email-paul.durrant@citrix.com>
References: <1449681542-21820-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Use new SystemProcessorCount() function
	for XENBUS_EVTCHN initialization
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Since it's necessary in a few places in the EVTCHN code to map processor
number to vcpu_id, the available processors should be limited to that for
which such a mapping exists.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/xen.h            |  9 ++++++++-
 src/xen/system.c         | 37 ++++++++++++++++++++++++++++++++++---
 src/xenbus/evtchn.c      | 17 ++++++++++++-----
 src/xenbus/evtchn_2l.c   | 16 +++++++++++++---
 src/xenbus/evtchn_fifo.c | 27 ++++++++++++++++++++-------
 src/xenbus/shared_info.c | 23 ++++++++++++++++++-----
 6 files changed, 105 insertions(+), 24 deletions(-)

diff --git a/include/xen.h b/include/xen.h
index 23c7ac0..f03635f 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -401,8 +401,15 @@ LogPrintf(
 
 XEN_API
 ULONG
+SystemProcessorCount(
+    VOID
+    );
+
+XEN_API
+NTSTATUS
 SystemVirtualCpuIndex(
-    IN  ULONG   Index
+    IN  ULONG           Index,
+    OUT unsigned int    *vcpu_id
     );
 
 #endif  // _XEN_H
diff --git a/src/xen/system.c b/src/xen/system.c
index 3905273..65c9d0e 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -666,6 +666,8 @@ SystemProcessorChangeCallback(
         }
 
         Context->Processor = Processor;
+        KeMemoryBarrier();
+
         Context->ProcessorCount = ProcessorCount;
         break;
     }
@@ -972,18 +974,47 @@ fail1:
     return status;
 }
 
+static FORCEINLINE ULONG
+__SystemProcessorCount(
+    VOID
+    )
+{
+    PSYSTEM_CONTEXT     Context = &SystemContext;
+
+    KeMemoryBarrier();
+
+    return Context->ProcessorCount;
+}
+
 XEN_API
 ULONG
+SystemProcessorCount(
+    VOID
+    )
+{
+    return __SystemProcessorCount();
+}
+
+XEN_API
+NTSTATUS
 SystemVirtualCpuIndex(
-    IN  ULONG           Index
+    IN  ULONG           Index,
+    OUT unsigned int    *vcpu_id
     )
 {
     PSYSTEM_CONTEXT     Context = &SystemContext;
     PSYSTEM_PROCESSOR   Processor = &Context->Processor[Index];
+    NTSTATUS            status;
 
-    ASSERT3U(Index, <, Context->ProcessorCount);
+    status = STATUS_UNSUCCESSFUL;
+    if (Index >= __SystemProcessorCount())
+        goto fail1;
+
+    *vcpu_id = Processor->ProcessorID;
+    return STATUS_SUCCESS;
 
-    return Processor->ProcessorID;
+fail1:
+    return status;
 }
 
 VOID
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index 5769cf3..c5c97e4 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -699,7 +699,9 @@ EvtchnBind(
         goto done;
 
     LocalPort = Channel->LocalPort;
-    vcpu_id = SystemVirtualCpuIndex(Index);
+
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    ASSERT(NT_SUCCESS(status));
 
     status = EventChannelBindVirtualCpu(LocalPort, vcpu_id);
     if (!NT_SUCCESS(status))
@@ -1155,7 +1157,9 @@ EvtchnInterruptEnable(
         if (Processor->Interrupt == NULL)
             continue;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
+
         Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt);
 
         status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
@@ -1211,7 +1215,8 @@ EvtchnInterruptDisable(
         if (!Processor->UpcallEnabled)
             continue;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
 
         (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
         Processor->UpcallEnabled = FALSE;
@@ -1434,7 +1439,7 @@ EvtchnAcquire(
     if (Context->Interrupt == NULL)
         goto fail8;
 
-    Context->ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    Context->ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
     Context->Processor = __EvtchnAllocate(sizeof (XENBUS_EVTCHN_PROCESSOR) * Context->ProcessorCount);
 
     status = STATUS_NO_MEMORY;
@@ -1460,7 +1465,9 @@ EvtchnAcquire(
                                                     ProcNumber.Number,
                                                     EvtchnInterruptCallback,
                                                     Context);
-        ASSERT(Processor->Interrupt != NULL);
+
+        if (Processor->Interrupt == NULL)
+            continue;
 
         InitializeListHead(&Processor->PendingList);
 
diff --git a/src/xenbus/evtchn_2l.c b/src/xenbus/evtchn_2l.c
index 249543d..913160f 100644
--- a/src/xenbus/evtchn_2l.c
+++ b/src/xenbus/evtchn_2l.c
@@ -67,13 +67,23 @@ __EvtchnTwoLevelFree(
 
 static BOOLEAN
 EvtchnTwoLevelIsProcessorEnabled(
-    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
-    IN  ULONG                           Index
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  _Context,
+    IN  ULONG                       Index
     )
 {
+    unsigned int                    vcpu_id;
+    NTSTATUS                        status;
+
     UNREFERENCED_PARAMETER(_Context);
 
-    return (SystemVirtualCpuIndex(Index) == 0) ? TRUE : FALSE;
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        return FALSE;
+
+    if (vcpu_id != 0)
+        return FALSE;
+
+    return TRUE;
 }
 
 static BOOLEAN
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index 98ea0fa..91cbd76 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -285,7 +285,12 @@ EvtchnFifoIsProcessorEnabled(
     )
 {
     PXENBUS_EVTCHN_FIFO_CONTEXT     Context = (PVOID)_Context;
-    unsigned int                    vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                    vcpu_id;
+    NTSTATUS                        status;
+    
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        return FALSE;
 
     return (Context->ControlBlockMdl[vcpu_id] != NULL) ? TRUE : FALSE;
 }
@@ -348,16 +353,21 @@ EvtchnFifoPoll(
     )
 {
     PXENBUS_EVTCHN_FIFO_CONTEXT     Context = (PVOID)_Context;
-    unsigned int                    vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                    vcpu_id;
     PMDL                            Mdl;
     evtchn_fifo_control_block_t     *ControlBlock;
     ULONG                           Ready;
     ULONG                           Priority;
     BOOLEAN                         DoneSomething;
-
-    Mdl = Context->ControlBlockMdl[vcpu_id];
+    NTSTATUS                        status;
 
     DoneSomething = FALSE;
+
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        goto done;
+
+    Mdl = Context->ControlBlockMdl[vcpu_id];
     if (Mdl == NULL)
         goto done;
 
@@ -488,7 +498,7 @@ EvtchnFifoAcquire(
     Trace("====>\n");
 
     Index = 0;
-    while (Index < (LONG)KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS)) {
+    while (Index < (LONG)SystemProcessorCount()) {
         unsigned int        vcpu_id;
         PFN_NUMBER          Pfn;
         PHYSICAL_ADDRESS    Address;
@@ -499,7 +509,9 @@ EvtchnFifoAcquire(
         if (Mdl == NULL)
             goto fail1;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
+
         Pfn = MmGetMdlPfnArray(Mdl)[0];
 
         status = EventChannelInitControl(Pfn, vcpu_id);
@@ -537,7 +549,8 @@ fail1:
     while (--Index >= 0) {
         unsigned int    vcpu_id;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
 
         Mdl = Context->ControlBlockMdl[vcpu_id];
         Context->ControlBlockMdl[vcpu_id] = NULL;
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 01621ac..9d8bf11 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -161,8 +161,13 @@ SharedInfoUpcallPending(
 {
     PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context;
     shared_info_t               *Shared = Context->Shared;
-    int                         vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                vcpu_id;
     UCHAR                       Pending;
+    NTSTATUS                    status;
+
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        return FALSE;
 
     KeMemoryBarrier();
 
@@ -181,13 +186,18 @@ SharedInfoEvtchnPoll(
 {
     PXENBUS_SHARED_INFO_CONTEXT     Context = Interface->Context;
     shared_info_t                   *Shared = Context->Shared;
-    int                             vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                    vcpu_id;
     ULONG                           Port;
     ULONG_PTR                       SelectorMask;
     BOOLEAN                         DoneSomething;
+    NTSTATUS                        status;
 
     DoneSomething = FALSE;
 
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        goto done;
+
     KeMemoryBarrier();
 
     SelectorMask = (ULONG_PTR)InterlockedExchangePointer((PVOID *)&Shared->vcpu_info[vcpu_id].evtchn_pending_sel, (PVOID)0);
@@ -233,6 +243,7 @@ SharedInfoEvtchnPoll(
 
     Context->Port = Port;
 
+done:
     return DoneSomething;
 }
 
@@ -469,14 +480,16 @@ SharedInfoDebugCallback(
              Index < KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
              Index++) {
             PROCESSOR_NUMBER    ProcNumber;
-            int                 vcpu_id;
+            unsigned int        vcpu_id;
             NTSTATUS            status;
 
+            status = SystemVirtualCpuIndex(Index, &vcpu_id);
+            if (!NT_SUCCESS(status))
+                continue;
+
             status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
             ASSERT(NT_SUCCESS(status));
 
-            vcpu_id = SystemVirtualCpuIndex(Index);
-
             XENBUS_DEBUG(Printf,
                          &Context->DebugInterface,
                          "CPU %u:%u: PENDING: %s\n",
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 17:19:17 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 17:19:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6iOa-0002wl-Ow; Wed, 09 Dec 2015 17:19:16 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6iOZ-0002wb-8Z
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 17:19:15 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	E6/28-25435-29268665; Wed, 09 Dec 2015 17:19:14 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1449681553!9888759!1
X-Originating-IP: [74.125.82.46]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 37645 invoked from network); 9 Dec 2015 17:19:13 -0000
Received: from mail-wm0-f46.google.com (HELO mail-wm0-f46.google.com)
	(74.125.82.46)
	by server-10.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 9 Dec 2015 17:19:13 -0000
Received: by wmec201 with SMTP id c201so271609758wme.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 09 Dec 2015 09:19:13 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=/mJNx41YW8K6ws25EUF/6pKcGKjnZyEBiilJfHZQfC4=;
	b=JczooDowkRz+yxvy/V/LWNypNMJ9kauit9YFfkF55qXaS8RbeAINoKgiBnkJ1vmgil
	Ac4sDkvPRjAt0epgyprdQ5jFr31otXkw6AI7cuyojHxf3w6mMQFvlQUr2l6Bye0rKBYg
	X5Cmc+tAbzNY1q7BCGLobO0qqlx4D2KXM+wHhQjol3a/h8qH8u2d4snYhXEDM/3q20OT
	xyJSefhBLxkt2gJQ53MdNTZ2eFB+sE9vi7zo8auajJ998Eyp3R2tk40Iecn4jatSxZZQ
	laXfb5RHJ/ByJO82wfln7i+PfoleLziMghOMMYsS6t/Wz9/8x9KWv9TuBjyaUq6wdW0a
	yoUg==
X-Received: by 10.194.104.130 with SMTP id ge2mr7155744wjb.111.1449681553503; 
	Wed, 09 Dec 2015 09:19:13 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jz1sm8570019wjc.27.2015.12.09.09.19.12
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 09 Dec 2015 09:19:12 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  9 Dec 2015 17:19:01 +0000
Message-Id: <1449681542-21820-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Size XENBUS_CACHE Magazine array to
	maximum processor count
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Sizing to active processor count means that the array will be too small if
a processor is onlined after cache creation.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/cache.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 9727b14..5a14411 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -617,7 +617,7 @@ CacheCreate(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    (*Cache)->MagazineCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    (*Cache)->MagazineCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
     (*Cache)->Magazine = __CacheAllocate(sizeof (XENBUS_CACHE_MAGAZINE) * (*Cache)->MagazineCount);
 
     status = STATUS_NO_MEMORY;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 17:19:17 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 17:19:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6iOb-0002wp-Mp; Wed, 09 Dec 2015 17:19:17 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6iOZ-0002wc-OH
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 17:19:15 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	4F/AA-18316-39268665; Wed, 09 Dec 2015 17:19:15 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-14.tower-21.messagelabs.com!1449681554!4488226!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 25435 invoked from network); 9 Dec 2015 17:19:14 -0000
Received: from mail-wm0-f53.google.com (HELO mail-wm0-f53.google.com)
	(74.125.82.53)
	by server-14.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 9 Dec 2015 17:19:14 -0000
Received: by wmvv187 with SMTP id v187so272900558wmv.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 09 Dec 2015 09:19:14 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=lB21fKorFwgM+jCNeAJfBnp6FOxdDBC5fhGUk+TETEY=;
	b=yxAn2EBMnC5mzo9ESi9ZUlBHcwtGvIBcxqq0xRUWAMTXCS3qac6faEbYAYqL2Mg+Ld
	KtHZy9ezuEJZwfHb6bE1Gb2x8dH77OC5Ry2/Tmtch3ijBFL3QwjiGXyvxW40oL2pFwN6
	ZKPSMTAjPiE3a89MwqBFUYhlB01qfXqVmJ4v+vad5g+ou6fhtw/FviW/g2HQYiCCJUAw
	oZMUzKq7xr/gfoHYWoLfLr4iZNgPqvxzdNEWA456W6M5Nj4CADcXC5sXtr81zfhDZJwY
	vzEYYmQ9t8AmJ8xZyKX6SJ3sb2poiuy1QFvHMYB04qBL8xCE2H9Twv3dGpOKiethfmMv
	sv/A==
X-Received: by 10.28.53.130 with SMTP id c124mr12135824wma.16.1449681554263;
	Wed, 09 Dec 2015 09:19:14 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jz1sm8570019wjc.27.2015.12.09.09.19.13
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 09 Dec 2015 09:19:13 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  9 Dec 2015 17:19:02 +0000
Message-Id: <1449681542-21820-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449681542-21820-1-git-send-email-paul.durrant@citrix.com>
References: <1449681542-21820-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Use new SystemProcessorCount() function
	for XENBUS_EVTCHN initialization
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Since it's necessary in a few places in the EVTCHN code to map processor
number to vcpu_id, the available processors should be limited to that for
which such a mapping exists.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/xen.h            |  9 ++++++++-
 src/xen/system.c         | 37 ++++++++++++++++++++++++++++++++++---
 src/xenbus/evtchn.c      | 17 ++++++++++++-----
 src/xenbus/evtchn_2l.c   | 16 +++++++++++++---
 src/xenbus/evtchn_fifo.c | 27 ++++++++++++++++++++-------
 src/xenbus/shared_info.c | 23 ++++++++++++++++++-----
 6 files changed, 105 insertions(+), 24 deletions(-)

diff --git a/include/xen.h b/include/xen.h
index 23c7ac0..f03635f 100644
--- a/include/xen.h
+++ b/include/xen.h
@@ -401,8 +401,15 @@ LogPrintf(
 
 XEN_API
 ULONG
+SystemProcessorCount(
+    VOID
+    );
+
+XEN_API
+NTSTATUS
 SystemVirtualCpuIndex(
-    IN  ULONG   Index
+    IN  ULONG           Index,
+    OUT unsigned int    *vcpu_id
     );
 
 #endif  // _XEN_H
diff --git a/src/xen/system.c b/src/xen/system.c
index 3905273..65c9d0e 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -666,6 +666,8 @@ SystemProcessorChangeCallback(
         }
 
         Context->Processor = Processor;
+        KeMemoryBarrier();
+
         Context->ProcessorCount = ProcessorCount;
         break;
     }
@@ -972,18 +974,47 @@ fail1:
     return status;
 }
 
+static FORCEINLINE ULONG
+__SystemProcessorCount(
+    VOID
+    )
+{
+    PSYSTEM_CONTEXT     Context = &SystemContext;
+
+    KeMemoryBarrier();
+
+    return Context->ProcessorCount;
+}
+
 XEN_API
 ULONG
+SystemProcessorCount(
+    VOID
+    )
+{
+    return __SystemProcessorCount();
+}
+
+XEN_API
+NTSTATUS
 SystemVirtualCpuIndex(
-    IN  ULONG           Index
+    IN  ULONG           Index,
+    OUT unsigned int    *vcpu_id
     )
 {
     PSYSTEM_CONTEXT     Context = &SystemContext;
     PSYSTEM_PROCESSOR   Processor = &Context->Processor[Index];
+    NTSTATUS            status;
 
-    ASSERT3U(Index, <, Context->ProcessorCount);
+    status = STATUS_UNSUCCESSFUL;
+    if (Index >= __SystemProcessorCount())
+        goto fail1;
+
+    *vcpu_id = Processor->ProcessorID;
+    return STATUS_SUCCESS;
 
-    return Processor->ProcessorID;
+fail1:
+    return status;
 }
 
 VOID
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index 5769cf3..c5c97e4 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -699,7 +699,9 @@ EvtchnBind(
         goto done;
 
     LocalPort = Channel->LocalPort;
-    vcpu_id = SystemVirtualCpuIndex(Index);
+
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    ASSERT(NT_SUCCESS(status));
 
     status = EventChannelBindVirtualCpu(LocalPort, vcpu_id);
     if (!NT_SUCCESS(status))
@@ -1155,7 +1157,9 @@ EvtchnInterruptEnable(
         if (Processor->Interrupt == NULL)
             continue;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
+
         Vector = FdoGetInterruptVector(Context->Fdo, Processor->Interrupt);
 
         status = HvmSetEvtchnUpcallVector(vcpu_id, Vector);
@@ -1211,7 +1215,8 @@ EvtchnInterruptDisable(
         if (!Processor->UpcallEnabled)
             continue;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
 
         (VOID) HvmSetEvtchnUpcallVector(vcpu_id, 0);
         Processor->UpcallEnabled = FALSE;
@@ -1434,7 +1439,7 @@ EvtchnAcquire(
     if (Context->Interrupt == NULL)
         goto fail8;
 
-    Context->ProcessorCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    Context->ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
     Context->Processor = __EvtchnAllocate(sizeof (XENBUS_EVTCHN_PROCESSOR) * Context->ProcessorCount);
 
     status = STATUS_NO_MEMORY;
@@ -1460,7 +1465,9 @@ EvtchnAcquire(
                                                     ProcNumber.Number,
                                                     EvtchnInterruptCallback,
                                                     Context);
-        ASSERT(Processor->Interrupt != NULL);
+
+        if (Processor->Interrupt == NULL)
+            continue;
 
         InitializeListHead(&Processor->PendingList);
 
diff --git a/src/xenbus/evtchn_2l.c b/src/xenbus/evtchn_2l.c
index 249543d..913160f 100644
--- a/src/xenbus/evtchn_2l.c
+++ b/src/xenbus/evtchn_2l.c
@@ -67,13 +67,23 @@ __EvtchnTwoLevelFree(
 
 static BOOLEAN
 EvtchnTwoLevelIsProcessorEnabled(
-    IN  PXENBUS_EVTCHN_ABI_CONTEXT      _Context,
-    IN  ULONG                           Index
+    IN  PXENBUS_EVTCHN_ABI_CONTEXT  _Context,
+    IN  ULONG                       Index
     )
 {
+    unsigned int                    vcpu_id;
+    NTSTATUS                        status;
+
     UNREFERENCED_PARAMETER(_Context);
 
-    return (SystemVirtualCpuIndex(Index) == 0) ? TRUE : FALSE;
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        return FALSE;
+
+    if (vcpu_id != 0)
+        return FALSE;
+
+    return TRUE;
 }
 
 static BOOLEAN
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index 98ea0fa..91cbd76 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -285,7 +285,12 @@ EvtchnFifoIsProcessorEnabled(
     )
 {
     PXENBUS_EVTCHN_FIFO_CONTEXT     Context = (PVOID)_Context;
-    unsigned int                    vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                    vcpu_id;
+    NTSTATUS                        status;
+    
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        return FALSE;
 
     return (Context->ControlBlockMdl[vcpu_id] != NULL) ? TRUE : FALSE;
 }
@@ -348,16 +353,21 @@ EvtchnFifoPoll(
     )
 {
     PXENBUS_EVTCHN_FIFO_CONTEXT     Context = (PVOID)_Context;
-    unsigned int                    vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                    vcpu_id;
     PMDL                            Mdl;
     evtchn_fifo_control_block_t     *ControlBlock;
     ULONG                           Ready;
     ULONG                           Priority;
     BOOLEAN                         DoneSomething;
-
-    Mdl = Context->ControlBlockMdl[vcpu_id];
+    NTSTATUS                        status;
 
     DoneSomething = FALSE;
+
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        goto done;
+
+    Mdl = Context->ControlBlockMdl[vcpu_id];
     if (Mdl == NULL)
         goto done;
 
@@ -488,7 +498,7 @@ EvtchnFifoAcquire(
     Trace("====>\n");
 
     Index = 0;
-    while (Index < (LONG)KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS)) {
+    while (Index < (LONG)SystemProcessorCount()) {
         unsigned int        vcpu_id;
         PFN_NUMBER          Pfn;
         PHYSICAL_ADDRESS    Address;
@@ -499,7 +509,9 @@ EvtchnFifoAcquire(
         if (Mdl == NULL)
             goto fail1;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
+
         Pfn = MmGetMdlPfnArray(Mdl)[0];
 
         status = EventChannelInitControl(Pfn, vcpu_id);
@@ -537,7 +549,8 @@ fail1:
     while (--Index >= 0) {
         unsigned int    vcpu_id;
 
-        vcpu_id = SystemVirtualCpuIndex(Index);
+        status = SystemVirtualCpuIndex(Index, &vcpu_id);
+        ASSERT(NT_SUCCESS(status));
 
         Mdl = Context->ControlBlockMdl[vcpu_id];
         Context->ControlBlockMdl[vcpu_id] = NULL;
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 01621ac..9d8bf11 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -161,8 +161,13 @@ SharedInfoUpcallPending(
 {
     PXENBUS_SHARED_INFO_CONTEXT Context = Interface->Context;
     shared_info_t               *Shared = Context->Shared;
-    int                         vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                vcpu_id;
     UCHAR                       Pending;
+    NTSTATUS                    status;
+
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        return FALSE;
 
     KeMemoryBarrier();
 
@@ -181,13 +186,18 @@ SharedInfoEvtchnPoll(
 {
     PXENBUS_SHARED_INFO_CONTEXT     Context = Interface->Context;
     shared_info_t                   *Shared = Context->Shared;
-    int                             vcpu_id = SystemVirtualCpuIndex(Index);
+    unsigned int                    vcpu_id;
     ULONG                           Port;
     ULONG_PTR                       SelectorMask;
     BOOLEAN                         DoneSomething;
+    NTSTATUS                        status;
 
     DoneSomething = FALSE;
 
+    status = SystemVirtualCpuIndex(Index, &vcpu_id);
+    if (!NT_SUCCESS(status))
+        goto done;
+
     KeMemoryBarrier();
 
     SelectorMask = (ULONG_PTR)InterlockedExchangePointer((PVOID *)&Shared->vcpu_info[vcpu_id].evtchn_pending_sel, (PVOID)0);
@@ -233,6 +243,7 @@ SharedInfoEvtchnPoll(
 
     Context->Port = Port;
 
+done:
     return DoneSomething;
 }
 
@@ -469,14 +480,16 @@ SharedInfoDebugCallback(
              Index < KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
              Index++) {
             PROCESSOR_NUMBER    ProcNumber;
-            int                 vcpu_id;
+            unsigned int        vcpu_id;
             NTSTATUS            status;
 
+            status = SystemVirtualCpuIndex(Index, &vcpu_id);
+            if (!NT_SUCCESS(status))
+                continue;
+
             status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
             ASSERT(NT_SUCCESS(status));
 
-            vcpu_id = SystemVirtualCpuIndex(Index);
-
             XENBUS_DEBUG(Printf,
                          &Context->DebugInterface,
                          "CPU %u:%u: PENDING: %s\n",
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 09 17:19:17 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 09 Dec 2015 17:19:17 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6iOa-0002wl-Ow; Wed, 09 Dec 2015 17:19:16 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6iOZ-0002wb-8Z
	for win-pv-devel@lists.xenproject.org; Wed, 09 Dec 2015 17:19:15 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	E6/28-25435-29268665; Wed, 09 Dec 2015 17:19:14 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1449681553!9888759!1
X-Originating-IP: [74.125.82.46]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 37645 invoked from network); 9 Dec 2015 17:19:13 -0000
Received: from mail-wm0-f46.google.com (HELO mail-wm0-f46.google.com)
	(74.125.82.46)
	by server-10.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 9 Dec 2015 17:19:13 -0000
Received: by wmec201 with SMTP id c201so271609758wme.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 09 Dec 2015 09:19:13 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=/mJNx41YW8K6ws25EUF/6pKcGKjnZyEBiilJfHZQfC4=;
	b=JczooDowkRz+yxvy/V/LWNypNMJ9kauit9YFfkF55qXaS8RbeAINoKgiBnkJ1vmgil
	Ac4sDkvPRjAt0epgyprdQ5jFr31otXkw6AI7cuyojHxf3w6mMQFvlQUr2l6Bye0rKBYg
	X5Cmc+tAbzNY1q7BCGLobO0qqlx4D2KXM+wHhQjol3a/h8qH8u2d4snYhXEDM/3q20OT
	xyJSefhBLxkt2gJQ53MdNTZ2eFB+sE9vi7zo8auajJ998Eyp3R2tk40Iecn4jatSxZZQ
	laXfb5RHJ/ByJO82wfln7i+PfoleLziMghOMMYsS6t/Wz9/8x9KWv9TuBjyaUq6wdW0a
	yoUg==
X-Received: by 10.194.104.130 with SMTP id ge2mr7155744wjb.111.1449681553503; 
	Wed, 09 Dec 2015 09:19:13 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jz1sm8570019wjc.27.2015.12.09.09.19.12
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Wed, 09 Dec 2015 09:19:12 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Wed,  9 Dec 2015 17:19:01 +0000
Message-Id: <1449681542-21820-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Size XENBUS_CACHE Magazine array to
	maximum processor count
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Sizing to active processor count means that the array will be too small if
a processor is onlined after cache creation.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenbus/cache.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 9727b14..5a14411 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -617,7 +617,7 @@ CacheCreate(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    (*Cache)->MagazineCount = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);
+    (*Cache)->MagazineCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
     (*Cache)->Magazine = __CacheAllocate(sizeof (XENBUS_CACHE_MAGAZINE) * (*Cache)->MagazineCount);
 
     status = STATUS_NO_MEMORY;
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:26:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:26:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zMu-0000BZ-GA; Thu, 10 Dec 2015 11:26:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zMt-0000BO-Lj
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:26:39 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	89/8A-30270-E6169665; Thu, 10 Dec 2015 11:26:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1449746797!9810001!1
X-Originating-IP: [209.85.192.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3536 invoked from network); 10 Dec 2015 11:26:38 -0000
Received: from mail-qg0-f53.google.com (HELO mail-qg0-f53.google.com)
	(209.85.192.53)
	by server-2.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:26:38 -0000
Received: by qgcc31 with SMTP id c31so136430963qgc.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:26:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=oUR6+MVkgYcVphxXG7tqb8ycZUPVbUsPRRgSCAJcPsI=;
	b=YFA14M0SrT4Q7Zdmb0z3YWcoAj6iK3o9hNy8VnxLocrxv/xv1pGnhgE+e0h/XfttR+
	9IeTU7iITZIjgAzYqdJb9blzvdQuqSfCFfqwoLSdKbiH/QoSiFnHtOawYjRST8TitsI6
	G2mz/E8n8fngMRm78J5H7fyKZlWOsO9YZZMCzaTjE2+7GGCa1GYArnl/hYu5nVGmabLV
	sp4xqsbauywrSUbOxBMz4uRr1ceh4ifk0wJZ5ek1ob/wIWyMZWjHpCm0+eaBkaQUTqbB
	ib7wCAwxrd9Nej2NzuLD5A+Ywx7j5RoAMBY6/hj+0x9/Lm60MqS4oIG7CxSIhxOYPGtB
	dEIw==
X-Received: by 10.13.230.68 with SMTP id p65mr4065072ywe.43.1449746797204;
	Thu, 10 Dec 2015 03:26:37 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	g66sm8920019ywd.56.2015.12.10.03.26.36
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:26:36 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:26:24 +0000
Message-Id: <1449746784-9320-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449746784-9320-1-git-send-email-paul.durrant@citrix.com>
References: <1449746784-9320-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Introduce __FreePoolWithTag()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Being able to interpose on memory allocation can be useful during
debugging. We already have __AllocatePoolWithTag() so this patch matches
it with __FreePoolWithTag().

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/registry.c    | 2 +-
 src/common/util.h        | 9 +++++++++
 src/xen/acpi.c           | 2 +-
 src/xen/module.c         | 2 +-
 src/xen/system.c         | 2 +-
 src/xen/unplug.c         | 2 +-
 src/xenbus/balloon.c     | 2 +-
 src/xenbus/bus.c         | 2 +-
 src/xenbus/cache.c       | 2 +-
 src/xenbus/debug.c       | 2 +-
 src/xenbus/dma.c         | 2 +-
 src/xenbus/driver.c      | 2 +-
 src/xenbus/evtchn.c      | 2 +-
 src/xenbus/evtchn_2l.c   | 2 +-
 src/xenbus/evtchn_fifo.c | 2 +-
 src/xenbus/fdo.c         | 2 +-
 src/xenbus/filters.c     | 2 +-
 src/xenbus/gnttab.c      | 2 +-
 src/xenbus/hash_table.c  | 2 +-
 src/xenbus/pdo.c         | 2 +-
 src/xenbus/range_set.c   | 2 +-
 src/xenbus/shared_info.c | 2 +-
 src/xenbus/store.c       | 2 +-
 src/xenbus/suspend.c     | 2 +-
 src/xenbus/thread.c      | 2 +-
 src/xenbus/unplug.c      | 2 +-
 src/xenfilt/driver.c     | 2 +-
 src/xenfilt/emulated.c   | 2 +-
 src/xenfilt/fdo.c        | 2 +-
 src/xenfilt/pdo.c        | 2 +-
 src/xenfilt/thread.c     | 2 +-
 31 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/src/common/registry.c b/src/common/registry.c
index 9e9f79a..d994e13 100644
--- a/src/common/registry.c
+++ b/src/common/registry.c
@@ -52,7 +52,7 @@ __RegistryFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, REGISTRY_TAG);
+    __FreePoolWithTag(Buffer, REGISTRY_TAG);
 }
 
 NTSTATUS
diff --git a/src/common/util.h b/src/common/util.h
index c772b1e..7798ebd 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -158,6 +158,15 @@ __AllocatePoolWithTag(
     return Buffer;
 }
 
+static FORCEINLINE VOID
+__FreePoolWithTag(
+    IN  PVOID   Buffer,
+    IN  ULONG   Tag
+    )
+{
+    ExFreePoolWithTag(Buffer, Tag);
+}
+
 static FORCEINLINE PMDL
 __AllocatePage(
     VOID
diff --git a/src/xen/acpi.c b/src/xen/acpi.c
index ebf8024..5defd7d 100644
--- a/src/xen/acpi.c
+++ b/src/xen/acpi.c
@@ -56,7 +56,7 @@ __AcpiFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_ACPI_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_ACPI_TAG);
 }
 
 static BOOLEAN
diff --git a/src/xen/module.c b/src/xen/module.c
index a5bf3c7..584a63d 100644
--- a/src/xen/module.c
+++ b/src/xen/module.c
@@ -72,7 +72,7 @@ __ModuleFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, MODULE_TAG);
+    __FreePoolWithTag(Buffer, MODULE_TAG);
 }
 
 static VOID
diff --git a/src/xen/system.c b/src/xen/system.c
index 65c9d0e..0dc7e14 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -79,7 +79,7 @@ __SystemFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XEN_SYSTEM_TAG);
+    __FreePoolWithTag(Buffer, XEN_SYSTEM_TAG);
 }
 
 static FORCEINLINE const CHAR *
diff --git a/src/xen/unplug.c b/src/xen/unplug.c
index 77b6b8e..2043591 100644
--- a/src/xen/unplug.c
+++ b/src/xen/unplug.c
@@ -71,7 +71,7 @@ __UnplugFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, UNPLUG_TAG);
+    __FreePoolWithTag(Buffer, UNPLUG_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index 1b3f5fa..e697722 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -80,7 +80,7 @@ __BalloonFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_BALLOON_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_BALLOON_TAG);
 }
 
 #define SWAP_NODES(_PfnArray, _X, _Y)       \
diff --git a/src/xenbus/bus.c b/src/xenbus/bus.c
index d82fe0a..6443281 100644
--- a/src/xenbus/bus.c
+++ b/src/xenbus/bus.c
@@ -64,7 +64,7 @@ __BusFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, BUS_TAG);
+    __FreePoolWithTag(Buffer, BUS_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 5a14411..e3073f5 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -114,7 +114,7 @@ __CacheFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, CACHE_TAG);
+    __FreePoolWithTag(Buffer, CACHE_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/debug.c b/src/xenbus/debug.c
index 7b2ec73..794a432 100644
--- a/src/xenbus/debug.c
+++ b/src/xenbus/debug.c
@@ -77,7 +77,7 @@ __DebugFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_DEBUG_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_DEBUG_TAG);
 }
 
 extern USHORT
diff --git a/src/xenbus/dma.c b/src/xenbus/dma.c
index 3969778..7531f8b 100644
--- a/src/xenbus/dma.c
+++ b/src/xenbus/dma.c
@@ -208,7 +208,7 @@ __DmaFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, DMA_TAG);
+    __FreePoolWithTag(Buffer, DMA_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 73625ef..cd22a72 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -74,7 +74,7 @@ __DriverFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_DRIVER_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_DRIVER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index c5c97e4..afb5219 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -133,7 +133,7 @@ __EvtchnFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_EVTCHN_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/evtchn_2l.c b/src/xenbus/evtchn_2l.c
index 913160f..0982b00 100644
--- a/src/xenbus/evtchn_2l.c
+++ b/src/xenbus/evtchn_2l.c
@@ -62,7 +62,7 @@ __EvtchnTwoLevelFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TWO_LEVEL_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_EVTCHN_TWO_LEVEL_TAG);
 }
 
 static BOOLEAN
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index 91cbd76..c0456e0 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -68,7 +68,7 @@ __EvtchnFifoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_FIFO_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_EVTCHN_FIFO_TAG);
 }
 
 static event_word_t *
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index d079928..9c9e380 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -155,7 +155,7 @@ __FdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_FDO_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_FDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/filters.c b/src/xenbus/filters.c
index 8eb836b..dfea119 100644
--- a/src/xenbus/filters.c
+++ b/src/xenbus/filters.c
@@ -57,7 +57,7 @@ __FiltersFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_FILTERS_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_FILTERS_TAG);
 }
 
 #define CLASS_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Class"
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 56158d8..f3fcc7c 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -107,7 +107,7 @@ __GnttabFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_GNTTAB_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_GNTTAB_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/hash_table.c b/src/xenbus/hash_table.c
index b271abd..75206e4 100644
--- a/src/xenbus/hash_table.c
+++ b/src/xenbus/hash_table.c
@@ -71,7 +71,7 @@ __HashTableFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_HASH_TABLE_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_HASH_TABLE_TAG);
 }
 
 static ULONG
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 88c82a7..3a8540e 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -88,7 +88,7 @@ __PdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, PDO_TAG);
+    __FreePoolWithTag(Buffer, PDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/range_set.c b/src/xenbus/range_set.c
index 1ce113f..eaf3f10 100644
--- a/src/xenbus/range_set.c
+++ b/src/xenbus/range_set.c
@@ -81,7 +81,7 @@ __RangeSetFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, RANGE_SET_TAG);
+    __FreePoolWithTag(Buffer, RANGE_SET_TAG);
 }
 
 static FORCEINLINE BOOLEAN
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 9d8bf11..d6babcf 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -70,7 +70,7 @@ __SharedInfoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_SHARED_INFO_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_SHARED_INFO_TAG);
 }
 
 static BOOLEAN
diff --git a/src/xenbus/store.c b/src/xenbus/store.c
index dad0f39..6bca5e9 100644
--- a/src/xenbus/store.c
+++ b/src/xenbus/store.c
@@ -165,7 +165,7 @@ __StoreFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_STORE_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_STORE_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index d272862..18cae1b 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -73,7 +73,7 @@ __SuspendFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_SUSPEND_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_SUSPEND_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/thread.c b/src/xenbus/thread.c
index 9048e4f..23b6e71 100644
--- a/src/xenbus/thread.c
+++ b/src/xenbus/thread.c
@@ -60,7 +60,7 @@ __ThreadFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, THREAD_TAG);
+    __FreePoolWithTag(Buffer, THREAD_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/unplug.c b/src/xenbus/unplug.c
index 7414b0c..3c68c7f 100644
--- a/src/xenbus/unplug.c
+++ b/src/xenbus/unplug.c
@@ -63,7 +63,7 @@ __UnplugFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_UNPLUG_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_UNPLUG_TAG);
 }
 
 static VOID
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index bfc96ee..d46630f 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -78,7 +78,7 @@ __DriverFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENFILT_DRIVER_TAG);
+    __FreePoolWithTag(Buffer, XENFILT_DRIVER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index 9cb656a..7eb4054 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -86,7 +86,7 @@ __EmulatedFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENFILT_EMULATED_TAG);
+    __FreePoolWithTag(Buffer, XENFILT_EMULATED_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 037f892..f41288e 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -86,7 +86,7 @@ __FdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, FDO_TAG);
+    __FreePoolWithTag(Buffer, FDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 6be7a76..6b09578 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -82,7 +82,7 @@ __PdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, PDO_TAG);
+    __FreePoolWithTag(Buffer, PDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenfilt/thread.c b/src/xenfilt/thread.c
index 7ec0ac8..a834129 100644
--- a/src/xenfilt/thread.c
+++ b/src/xenfilt/thread.c
@@ -60,7 +60,7 @@ __ThreadFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, THREAD_TAG);
+    __FreePoolWithTag(Buffer, THREAD_TAG);
 }
 
 static FORCEINLINE VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:26:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:26:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zMu-0000BU-Ek; Thu, 10 Dec 2015 11:26:40 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zMs-0000BJ-R8
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:26:38 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	D7/74-28791-E6169665; Thu, 10 Dec 2015 11:26:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1449746796!10028982!1
X-Originating-IP: [209.85.192.41]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 40681 invoked from network); 10 Dec 2015 11:26:37 -0000
Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com)
	(209.85.192.41)
	by server-16.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:26:37 -0000
Received: by qgeb1 with SMTP id b1so136522992qge.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:26:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=g86oBIG6uQaVMg/4RJO6GM48lHWiMLVCxoBsIod+VN4=;
	b=Cn4CtUe7xrOYvq+XtzarORWZeZjxLdnBMYBjx9lOsl6e+x5ElbbAdi7iJxOLhIth75
	ozM7ZnTPvFLrf15aql+rcjljVGA7W4DopXggv+Gi0HCEI122pvAt8V2ImlnnOdMKQp8p
	IgSO4GwrfZ43AeznUvMTk9Icj8PWiIYlXPuy1EVDMpmiYzdc4ODyY+9qn/PBgmJu+EGE
	wCa22gSKAtoWPtSQ5xYGt5Ew7DHJoI4CBSPuTxzgRZRyGPDSUzwo/ugm4z1J5VZq8qSC
	X8DCMQxBng5k8JpY1NIsWV+2oPWLrrxm3qhVWhOge/VLhud9wTq7WyGwqBbtDuE2ZpNo
	438Q==
X-Received: by 10.13.222.70 with SMTP id h67mr4081376ywe.185.1449746796196;
	Thu, 10 Dec 2015 03:26:36 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	g66sm8920019ywd.56.2015.12.10.03.26.35
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:26:35 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:26:23 +0000
Message-Id: <1449746784-9320-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Don't use C runtime versions of
	toupper() and tolower()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It seems that, despite their trivial functionality, the runtime
implementation insists on converting to Unicode! This means those functions
are actually only safe at PASSIVE_LEVEL.
This patch implements __toupper() and __tolower() as replacements with
no such hidden nastiness and modifies callers to use those.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/util.h | 22 ++++++++++++++++++++++
 src/xen/module.c  |  2 +-
 src/xenbus/fdo.c  |  2 +-
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/common/util.h b/src/common/util.h
index 1a2bb86..c772b1e 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -278,4 +278,26 @@ __strtok_r(
     return Token;
 }
 
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
+static FORCEINLINE CHAR
+__tolower(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'A' || Character > 'Z')
+        return Character;
+
+    return 'a' + Character - 'A';
+}
+
 #endif  // _COMMON_UTIL_H
diff --git a/src/xen/module.c b/src/xen/module.c
index ed8838a..a5bf3c7 100644
--- a/src/xen/module.c
+++ b/src/xen/module.c
@@ -155,7 +155,7 @@ ModuleAdd(
         if (Name[Index] == '\0')
             break;
 
-        New->Name[Index] = (CHAR)tolower(Name[Index]);
+        New->Name[Index] = __tolower(Name[Index]);
     }
 
     New->Start = Start;
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 00801c9..d079928 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -1129,7 +1129,7 @@ FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:26:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:26:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zMu-0000BZ-GA; Thu, 10 Dec 2015 11:26:40 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zMt-0000BO-Lj
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:26:39 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	89/8A-30270-E6169665; Thu, 10 Dec 2015 11:26:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1449746797!9810001!1
X-Originating-IP: [209.85.192.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3536 invoked from network); 10 Dec 2015 11:26:38 -0000
Received: from mail-qg0-f53.google.com (HELO mail-qg0-f53.google.com)
	(209.85.192.53)
	by server-2.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:26:38 -0000
Received: by qgcc31 with SMTP id c31so136430963qgc.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:26:37 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=oUR6+MVkgYcVphxXG7tqb8ycZUPVbUsPRRgSCAJcPsI=;
	b=YFA14M0SrT4Q7Zdmb0z3YWcoAj6iK3o9hNy8VnxLocrxv/xv1pGnhgE+e0h/XfttR+
	9IeTU7iITZIjgAzYqdJb9blzvdQuqSfCFfqwoLSdKbiH/QoSiFnHtOawYjRST8TitsI6
	G2mz/E8n8fngMRm78J5H7fyKZlWOsO9YZZMCzaTjE2+7GGCa1GYArnl/hYu5nVGmabLV
	sp4xqsbauywrSUbOxBMz4uRr1ceh4ifk0wJZ5ek1ob/wIWyMZWjHpCm0+eaBkaQUTqbB
	ib7wCAwxrd9Nej2NzuLD5A+Ywx7j5RoAMBY6/hj+0x9/Lm60MqS4oIG7CxSIhxOYPGtB
	dEIw==
X-Received: by 10.13.230.68 with SMTP id p65mr4065072ywe.43.1449746797204;
	Thu, 10 Dec 2015 03:26:37 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	g66sm8920019ywd.56.2015.12.10.03.26.36
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:26:36 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:26:24 +0000
Message-Id: <1449746784-9320-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449746784-9320-1-git-send-email-paul.durrant@citrix.com>
References: <1449746784-9320-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Introduce __FreePoolWithTag()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Being able to interpose on memory allocation can be useful during
debugging. We already have __AllocatePoolWithTag() so this patch matches
it with __FreePoolWithTag().

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/registry.c    | 2 +-
 src/common/util.h        | 9 +++++++++
 src/xen/acpi.c           | 2 +-
 src/xen/module.c         | 2 +-
 src/xen/system.c         | 2 +-
 src/xen/unplug.c         | 2 +-
 src/xenbus/balloon.c     | 2 +-
 src/xenbus/bus.c         | 2 +-
 src/xenbus/cache.c       | 2 +-
 src/xenbus/debug.c       | 2 +-
 src/xenbus/dma.c         | 2 +-
 src/xenbus/driver.c      | 2 +-
 src/xenbus/evtchn.c      | 2 +-
 src/xenbus/evtchn_2l.c   | 2 +-
 src/xenbus/evtchn_fifo.c | 2 +-
 src/xenbus/fdo.c         | 2 +-
 src/xenbus/filters.c     | 2 +-
 src/xenbus/gnttab.c      | 2 +-
 src/xenbus/hash_table.c  | 2 +-
 src/xenbus/pdo.c         | 2 +-
 src/xenbus/range_set.c   | 2 +-
 src/xenbus/shared_info.c | 2 +-
 src/xenbus/store.c       | 2 +-
 src/xenbus/suspend.c     | 2 +-
 src/xenbus/thread.c      | 2 +-
 src/xenbus/unplug.c      | 2 +-
 src/xenfilt/driver.c     | 2 +-
 src/xenfilt/emulated.c   | 2 +-
 src/xenfilt/fdo.c        | 2 +-
 src/xenfilt/pdo.c        | 2 +-
 src/xenfilt/thread.c     | 2 +-
 31 files changed, 39 insertions(+), 30 deletions(-)

diff --git a/src/common/registry.c b/src/common/registry.c
index 9e9f79a..d994e13 100644
--- a/src/common/registry.c
+++ b/src/common/registry.c
@@ -52,7 +52,7 @@ __RegistryFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, REGISTRY_TAG);
+    __FreePoolWithTag(Buffer, REGISTRY_TAG);
 }
 
 NTSTATUS
diff --git a/src/common/util.h b/src/common/util.h
index c772b1e..7798ebd 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -158,6 +158,15 @@ __AllocatePoolWithTag(
     return Buffer;
 }
 
+static FORCEINLINE VOID
+__FreePoolWithTag(
+    IN  PVOID   Buffer,
+    IN  ULONG   Tag
+    )
+{
+    ExFreePoolWithTag(Buffer, Tag);
+}
+
 static FORCEINLINE PMDL
 __AllocatePage(
     VOID
diff --git a/src/xen/acpi.c b/src/xen/acpi.c
index ebf8024..5defd7d 100644
--- a/src/xen/acpi.c
+++ b/src/xen/acpi.c
@@ -56,7 +56,7 @@ __AcpiFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_ACPI_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_ACPI_TAG);
 }
 
 static BOOLEAN
diff --git a/src/xen/module.c b/src/xen/module.c
index a5bf3c7..584a63d 100644
--- a/src/xen/module.c
+++ b/src/xen/module.c
@@ -72,7 +72,7 @@ __ModuleFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, MODULE_TAG);
+    __FreePoolWithTag(Buffer, MODULE_TAG);
 }
 
 static VOID
diff --git a/src/xen/system.c b/src/xen/system.c
index 65c9d0e..0dc7e14 100644
--- a/src/xen/system.c
+++ b/src/xen/system.c
@@ -79,7 +79,7 @@ __SystemFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XEN_SYSTEM_TAG);
+    __FreePoolWithTag(Buffer, XEN_SYSTEM_TAG);
 }
 
 static FORCEINLINE const CHAR *
diff --git a/src/xen/unplug.c b/src/xen/unplug.c
index 77b6b8e..2043591 100644
--- a/src/xen/unplug.c
+++ b/src/xen/unplug.c
@@ -71,7 +71,7 @@ __UnplugFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, UNPLUG_TAG);
+    __FreePoolWithTag(Buffer, UNPLUG_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index 1b3f5fa..e697722 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -80,7 +80,7 @@ __BalloonFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_BALLOON_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_BALLOON_TAG);
 }
 
 #define SWAP_NODES(_PfnArray, _X, _Y)       \
diff --git a/src/xenbus/bus.c b/src/xenbus/bus.c
index d82fe0a..6443281 100644
--- a/src/xenbus/bus.c
+++ b/src/xenbus/bus.c
@@ -64,7 +64,7 @@ __BusFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, BUS_TAG);
+    __FreePoolWithTag(Buffer, BUS_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/cache.c b/src/xenbus/cache.c
index 5a14411..e3073f5 100644
--- a/src/xenbus/cache.c
+++ b/src/xenbus/cache.c
@@ -114,7 +114,7 @@ __CacheFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, CACHE_TAG);
+    __FreePoolWithTag(Buffer, CACHE_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/debug.c b/src/xenbus/debug.c
index 7b2ec73..794a432 100644
--- a/src/xenbus/debug.c
+++ b/src/xenbus/debug.c
@@ -77,7 +77,7 @@ __DebugFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_DEBUG_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_DEBUG_TAG);
 }
 
 extern USHORT
diff --git a/src/xenbus/dma.c b/src/xenbus/dma.c
index 3969778..7531f8b 100644
--- a/src/xenbus/dma.c
+++ b/src/xenbus/dma.c
@@ -208,7 +208,7 @@ __DmaFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, DMA_TAG);
+    __FreePoolWithTag(Buffer, DMA_TAG);
 }
 
 static VOID
diff --git a/src/xenbus/driver.c b/src/xenbus/driver.c
index 73625ef..cd22a72 100644
--- a/src/xenbus/driver.c
+++ b/src/xenbus/driver.c
@@ -74,7 +74,7 @@ __DriverFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_DRIVER_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_DRIVER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/evtchn.c b/src/xenbus/evtchn.c
index c5c97e4..afb5219 100644
--- a/src/xenbus/evtchn.c
+++ b/src/xenbus/evtchn.c
@@ -133,7 +133,7 @@ __EvtchnFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_EVTCHN_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/evtchn_2l.c b/src/xenbus/evtchn_2l.c
index 913160f..0982b00 100644
--- a/src/xenbus/evtchn_2l.c
+++ b/src/xenbus/evtchn_2l.c
@@ -62,7 +62,7 @@ __EvtchnTwoLevelFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_TWO_LEVEL_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_EVTCHN_TWO_LEVEL_TAG);
 }
 
 static BOOLEAN
diff --git a/src/xenbus/evtchn_fifo.c b/src/xenbus/evtchn_fifo.c
index 91cbd76..c0456e0 100644
--- a/src/xenbus/evtchn_fifo.c
+++ b/src/xenbus/evtchn_fifo.c
@@ -68,7 +68,7 @@ __EvtchnFifoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_EVTCHN_FIFO_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_EVTCHN_FIFO_TAG);
 }
 
 static event_word_t *
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index d079928..9c9e380 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -155,7 +155,7 @@ __FdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_FDO_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_FDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/filters.c b/src/xenbus/filters.c
index 8eb836b..dfea119 100644
--- a/src/xenbus/filters.c
+++ b/src/xenbus/filters.c
@@ -57,7 +57,7 @@ __FiltersFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_FILTERS_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_FILTERS_TAG);
 }
 
 #define CLASS_PATH "\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\Class"
diff --git a/src/xenbus/gnttab.c b/src/xenbus/gnttab.c
index 56158d8..f3fcc7c 100644
--- a/src/xenbus/gnttab.c
+++ b/src/xenbus/gnttab.c
@@ -107,7 +107,7 @@ __GnttabFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_GNTTAB_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_GNTTAB_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/hash_table.c b/src/xenbus/hash_table.c
index b271abd..75206e4 100644
--- a/src/xenbus/hash_table.c
+++ b/src/xenbus/hash_table.c
@@ -71,7 +71,7 @@ __HashTableFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_HASH_TABLE_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_HASH_TABLE_TAG);
 }
 
 static ULONG
diff --git a/src/xenbus/pdo.c b/src/xenbus/pdo.c
index 88c82a7..3a8540e 100644
--- a/src/xenbus/pdo.c
+++ b/src/xenbus/pdo.c
@@ -88,7 +88,7 @@ __PdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, PDO_TAG);
+    __FreePoolWithTag(Buffer, PDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/range_set.c b/src/xenbus/range_set.c
index 1ce113f..eaf3f10 100644
--- a/src/xenbus/range_set.c
+++ b/src/xenbus/range_set.c
@@ -81,7 +81,7 @@ __RangeSetFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, RANGE_SET_TAG);
+    __FreePoolWithTag(Buffer, RANGE_SET_TAG);
 }
 
 static FORCEINLINE BOOLEAN
diff --git a/src/xenbus/shared_info.c b/src/xenbus/shared_info.c
index 9d8bf11..d6babcf 100644
--- a/src/xenbus/shared_info.c
+++ b/src/xenbus/shared_info.c
@@ -70,7 +70,7 @@ __SharedInfoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_SHARED_INFO_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_SHARED_INFO_TAG);
 }
 
 static BOOLEAN
diff --git a/src/xenbus/store.c b/src/xenbus/store.c
index dad0f39..6bca5e9 100644
--- a/src/xenbus/store.c
+++ b/src/xenbus/store.c
@@ -165,7 +165,7 @@ __StoreFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_STORE_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_STORE_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/suspend.c b/src/xenbus/suspend.c
index d272862..18cae1b 100644
--- a/src/xenbus/suspend.c
+++ b/src/xenbus/suspend.c
@@ -73,7 +73,7 @@ __SuspendFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_SUSPEND_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_SUSPEND_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenbus/thread.c b/src/xenbus/thread.c
index 9048e4f..23b6e71 100644
--- a/src/xenbus/thread.c
+++ b/src/xenbus/thread.c
@@ -60,7 +60,7 @@ __ThreadFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, THREAD_TAG);
+    __FreePoolWithTag(Buffer, THREAD_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenbus/unplug.c b/src/xenbus/unplug.c
index 7414b0c..3c68c7f 100644
--- a/src/xenbus/unplug.c
+++ b/src/xenbus/unplug.c
@@ -63,7 +63,7 @@ __UnplugFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENBUS_UNPLUG_TAG);
+    __FreePoolWithTag(Buffer, XENBUS_UNPLUG_TAG);
 }
 
 static VOID
diff --git a/src/xenfilt/driver.c b/src/xenfilt/driver.c
index bfc96ee..d46630f 100644
--- a/src/xenfilt/driver.c
+++ b/src/xenfilt/driver.c
@@ -78,7 +78,7 @@ __DriverFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENFILT_DRIVER_TAG);
+    __FreePoolWithTag(Buffer, XENFILT_DRIVER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenfilt/emulated.c b/src/xenfilt/emulated.c
index 9cb656a..7eb4054 100644
--- a/src/xenfilt/emulated.c
+++ b/src/xenfilt/emulated.c
@@ -86,7 +86,7 @@ __EmulatedFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, XENFILT_EMULATED_TAG);
+    __FreePoolWithTag(Buffer, XENFILT_EMULATED_TAG);
 }
 
 static NTSTATUS
diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 037f892..f41288e 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -86,7 +86,7 @@ __FdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, FDO_TAG);
+    __FreePoolWithTag(Buffer, FDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index 6be7a76..6b09578 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -82,7 +82,7 @@ __PdoFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, PDO_TAG);
+    __FreePoolWithTag(Buffer, PDO_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenfilt/thread.c b/src/xenfilt/thread.c
index 7ec0ac8..a834129 100644
--- a/src/xenfilt/thread.c
+++ b/src/xenfilt/thread.c
@@ -60,7 +60,7 @@ __ThreadFree(
     IN  PVOID   Buffer
     )
 {
-    ExFreePoolWithTag(Buffer, THREAD_TAG);
+    __FreePoolWithTag(Buffer, THREAD_TAG);
 }
 
 static FORCEINLINE VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:26:42 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:26:42 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zMu-0000BU-Ek; Thu, 10 Dec 2015 11:26:40 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zMs-0000BJ-R8
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:26:38 +0000
Received: from [193.109.254.147] by server-1.bemta-14.messagelabs.com id
	D7/74-28791-E6169665; Thu, 10 Dec 2015 11:26:38 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1449746796!10028982!1
X-Originating-IP: [209.85.192.41]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 40681 invoked from network); 10 Dec 2015 11:26:37 -0000
Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com)
	(209.85.192.41)
	by server-16.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:26:37 -0000
Received: by qgeb1 with SMTP id b1so136522992qge.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:26:36 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=g86oBIG6uQaVMg/4RJO6GM48lHWiMLVCxoBsIod+VN4=;
	b=Cn4CtUe7xrOYvq+XtzarORWZeZjxLdnBMYBjx9lOsl6e+x5ElbbAdi7iJxOLhIth75
	ozM7ZnTPvFLrf15aql+rcjljVGA7W4DopXggv+Gi0HCEI122pvAt8V2ImlnnOdMKQp8p
	IgSO4GwrfZ43AeznUvMTk9Icj8PWiIYlXPuy1EVDMpmiYzdc4ODyY+9qn/PBgmJu+EGE
	wCa22gSKAtoWPtSQ5xYGt5Ew7DHJoI4CBSPuTxzgRZRyGPDSUzwo/ugm4z1J5VZq8qSC
	X8DCMQxBng5k8JpY1NIsWV+2oPWLrrxm3qhVWhOge/VLhud9wTq7WyGwqBbtDuE2ZpNo
	438Q==
X-Received: by 10.13.222.70 with SMTP id h67mr4081376ywe.185.1449746796196;
	Thu, 10 Dec 2015 03:26:36 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	g66sm8920019ywd.56.2015.12.10.03.26.35
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:26:35 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:26:23 +0000
Message-Id: <1449746784-9320-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Don't use C runtime versions of
	toupper() and tolower()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It seems that, despite their trivial functionality, the runtime
implementation insists on converting to Unicode! This means those functions
are actually only safe at PASSIVE_LEVEL.
This patch implements __toupper() and __tolower() as replacements with
no such hidden nastiness and modifies callers to use those.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/common/util.h | 22 ++++++++++++++++++++++
 src/xen/module.c  |  2 +-
 src/xenbus/fdo.c  |  2 +-
 3 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/common/util.h b/src/common/util.h
index 1a2bb86..c772b1e 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -278,4 +278,26 @@ __strtok_r(
     return Token;
 }
 
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
+static FORCEINLINE CHAR
+__tolower(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'A' || Character > 'Z')
+        return Character;
+
+    return 'a' + Character - 'A';
+}
+
 #endif  // _COMMON_UTIL_H
diff --git a/src/xen/module.c b/src/xen/module.c
index ed8838a..a5bf3c7 100644
--- a/src/xen/module.c
+++ b/src/xen/module.c
@@ -155,7 +155,7 @@ ModuleAdd(
         if (Name[Index] == '\0')
             break;
 
-        New->Name[Index] = (CHAR)tolower(Name[Index]);
+        New->Name[Index] = __tolower(Name[Index]);
     }
 
     New->Start = Start;
diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 00801c9..d079928 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -1129,7 +1129,7 @@ FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:27:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:27:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zNx-0000Ec-NO; Thu, 10 Dec 2015 11:27:45 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zNw-0000EW-JS
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:27:44 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	A5/FD-06091-FA169665; Thu, 10 Dec 2015 11:27:43 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1449746862!9506634!1
X-Originating-IP: [209.85.192.44]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 48001 invoked from network); 10 Dec 2015 11:27:42 -0000
Received: from mail-qg0-f44.google.com (HELO mail-qg0-f44.google.com)
	(209.85.192.44)
	by server-13.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:27:42 -0000
Received: by qgcc31 with SMTP id c31so136479503qgc.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:27:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=j9zXQKSs7TR6kMdwFX/s3i5xjSrkv3RCqoTzzqrrPP8=;
	b=DEDsC4ZTiOR6HrG7VL7htTzjDdyOPCx0u79w93dBiSllmzzSRZcEJh97uUgNMo+eRk
	X2uWzPzjR17RvtYN/vWk0/c4kQInmb17YUoiHBAoXbzyMcn7JY/2iuYfcTChphl+kJxE
	Yj+S5A7lNAzgyJUK56FsMzZa8aGngCTZE37ZMbZ1TardcLKP61eGX0irATMjSakYhSTX
	R964805Wt8+ntsSKQEYfDpDomVp3Qqzr6V+NoAuFwD3s6a1wTSVmy4F7WKs61yuatR+M
	Y3FbvpmfiB3LIio2SJrOU5lBuTnAHYtmNy0OIb1E7x6f8GQ+NIe8NHDMQruD1ixST09L
	OYdg==
X-Received: by 10.129.124.130 with SMTP id x124mr4351641ywc.34.1449746861781; 
	Thu, 10 Dec 2015 03:27:41 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id u63sm8988676ywf.4.2015.12.10.03.27.40
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:27:41 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:27:31 +0000
Message-Id: <1449746852-1360-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Re-synchronize util.h with XENBUS and
	use __toupper()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A recent patch introduced __tolower() and __toupper() into util.h as
replacements for tolower() and toupper() respectively as the latter do
a hidden conversion to Unicode which make then unsafe at any IRQL other
than PASSIVE_LEVEL.
This patch imports util.h from XENBUS and fixes other code to be compatible.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/bus.c         |   2 +-
 src/xenvif/fdo.c         |   4 +-
 src/xenvif/frontend.c    |   2 +-
 src/xenvif/link.c        |   2 +-
 src/xenvif/mac.c         |   2 +-
 src/xenvif/pdo.c         |   2 +-
 src/xenvif/receiver.c    |   2 +-
 src/xenvif/registry.c    |   2 +-
 src/xenvif/settings.c    |   2 +-
 src/xenvif/thread.c      |   2 +-
 src/xenvif/transmitter.c |   2 +-
 src/xenvif/util.h        | 105 +++++++++++++++++------------------------------
 src/xenvif/vif.c         |   2 +-
 13 files changed, 50 insertions(+), 81 deletions(-)

diff --git a/src/xenvif/bus.c b/src/xenvif/bus.c
index 9190535..d3796e3 100644
--- a/src/xenvif/bus.c
+++ b/src/xenvif/bus.c
@@ -53,7 +53,7 @@ __BusAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, BUS_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, BUS_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index 82c3fd2..dae1ad8 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -112,7 +112,7 @@ __FdoAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, FDO_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, FDO_POOL);
 }
 
 static FORCEINLINE VOID
@@ -857,7 +857,7 @@ __FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index a43a534..9500a58 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -126,7 +126,7 @@ __FrontendAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, FRONTEND_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, FRONTEND_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/link.c b/src/xenvif/link.c
index 5161159..a9b75b3 100644
--- a/src/xenvif/link.c
+++ b/src/xenvif/link.c
@@ -45,7 +45,7 @@ __LinkAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, LINK_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, LINK_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/mac.c b/src/xenvif/mac.c
index 0a771a4..3d04670 100644
--- a/src/xenvif/mac.c
+++ b/src/xenvif/mac.c
@@ -73,7 +73,7 @@ __MacAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_MAC_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_MAC_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 07cf23a..bda8925 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -100,7 +100,7 @@ __PdoAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, PDO_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, PDO_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 53f322f..d3073e1 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -145,7 +145,7 @@ __ReceiverAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_RECEIVER_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_RECEIVER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 23b948b..9a7472b 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -45,7 +45,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
index 3ce4771..5cb9984 100644
--- a/src/xenvif/settings.c
+++ b/src/xenvif/settings.c
@@ -45,7 +45,7 @@ __SettingsAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, SETTINGS_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, SETTINGS_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/thread.c b/src/xenvif/thread.c
index 2fa0c1c..1357473 100644
--- a/src/xenvif/thread.c
+++ b/src/xenvif/thread.c
@@ -52,7 +52,7 @@ __ThreadAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, THREAD_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, THREAD_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index f01fc40..a8b0162 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -232,7 +232,7 @@ __TransmitterAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_TRANSMITTER_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_TRANSMITTER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/util.h b/src/xenvif/util.h
index 5fec116..6d140b0 100644
--- a/src/xenvif/util.h
+++ b/src/xenvif/util.h
@@ -29,8 +29,8 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _UTIL_H
-#define _UTIL_H
+#ifndef _XENVIF_UTIL_H
+#define _XENVIF_UTIL_H
 
 #include <ntddk.h>
 
@@ -138,85 +138,32 @@ __InterlockedSubtract(
     return New;
 }
 
-typedef struct _NON_PAGED_BUFFER_HEADER {
-    SIZE_T  Length;
-    ULONG   Tag;
-} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
-
-typedef struct _NON_PAGED_BUFFER_TRAILER {
-    ULONG   Tag;
-} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
-
 static FORCEINLINE PVOID
-__AllocateNonPagedPoolWithTag(
-    IN  SIZE_T                  Length,
-    IN  ULONG                   Tag
+__AllocatePoolWithTag(
+    IN  POOL_TYPE   PoolType,
+    IN  SIZE_T      NumberOfBytes,
+    IN  ULONG       Tag
     )
 {
-    PUCHAR                      Buffer;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
+    PUCHAR          Buffer;
 
-    ASSERT(Length != 0);
+    __analysis_assume(PoolType == NonPagedPool ||
+                      PoolType == PagedPool);
 
-    Buffer = ExAllocatePoolWithTag(NonPagedPool,
-                                   sizeof (NON_PAGED_BUFFER_HEADER) +
-                                   Length +
-                                   sizeof (NON_PAGED_BUFFER_TRAILER),
-                                   Tag);
+    Buffer = ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
     if (Buffer == NULL)
-        goto done;
-
-    RtlZeroMemory(Buffer,
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER));
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    Header->Length = Length;
-    Header->Tag = Tag;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    Trailer->Tag = Tag;
+        return NULL;
 
-done:
+    RtlZeroMemory(Buffer, NumberOfBytes);
     return Buffer;
 }
 
 static FORCEINLINE VOID
 __FreePoolWithTag(
-    IN  PVOID                   _Buffer,
-    IN  ULONG                   Tag
+    IN  PVOID   Buffer,
+    IN  ULONG   Tag
     )
 {
-    PUCHAR                      Buffer = _Buffer;
-    SIZE_T                      Length;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Buffer != NULL);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    ASSERT3U(Tag, ==, Header->Tag);
-    Length = Header->Length;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    ASSERT3U(Tag, ==, Trailer->Tag);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    RtlFillMemory(Buffer,
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER),
-                  0xAA);
-
     ExFreePoolWithTag(Buffer, Tag);
 }
 
@@ -340,4 +287,26 @@ __strtok_r(
     return Token;
 }
 
-#endif  // _UTIL_H
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
+static FORCEINLINE CHAR
+__tolower(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'A' || Character > 'Z')
+        return Character;
+
+    return 'a' + Character - 'A';
+}
+
+#endif  // _XENVIF_UTIL_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 76365d2..cd8aafc 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -64,7 +64,7 @@ __VifAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_VIF_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_VIF_TAG);
 }
 
 static FORCEINLINE VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:27:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:27:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zNx-0000Ec-NO; Thu, 10 Dec 2015 11:27:45 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zNw-0000EW-JS
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:27:44 +0000
Received: from [85.158.139.211] by server-13.bemta-5.messagelabs.com id
	A5/FD-06091-FA169665; Thu, 10 Dec 2015 11:27:43 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1449746862!9506634!1
X-Originating-IP: [209.85.192.44]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 48001 invoked from network); 10 Dec 2015 11:27:42 -0000
Received: from mail-qg0-f44.google.com (HELO mail-qg0-f44.google.com)
	(209.85.192.44)
	by server-13.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:27:42 -0000
Received: by qgcc31 with SMTP id c31so136479503qgc.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:27:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=j9zXQKSs7TR6kMdwFX/s3i5xjSrkv3RCqoTzzqrrPP8=;
	b=DEDsC4ZTiOR6HrG7VL7htTzjDdyOPCx0u79w93dBiSllmzzSRZcEJh97uUgNMo+eRk
	X2uWzPzjR17RvtYN/vWk0/c4kQInmb17YUoiHBAoXbzyMcn7JY/2iuYfcTChphl+kJxE
	Yj+S5A7lNAzgyJUK56FsMzZa8aGngCTZE37ZMbZ1TardcLKP61eGX0irATMjSakYhSTX
	R964805Wt8+ntsSKQEYfDpDomVp3Qqzr6V+NoAuFwD3s6a1wTSVmy4F7WKs61yuatR+M
	Y3FbvpmfiB3LIio2SJrOU5lBuTnAHYtmNy0OIb1E7x6f8GQ+NIe8NHDMQruD1ixST09L
	OYdg==
X-Received: by 10.129.124.130 with SMTP id x124mr4351641ywc.34.1449746861781; 
	Thu, 10 Dec 2015 03:27:41 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id u63sm8988676ywf.4.2015.12.10.03.27.40
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:27:41 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:27:31 +0000
Message-Id: <1449746852-1360-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 1/2] Re-synchronize util.h with XENBUS and
	use __toupper()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A recent patch introduced __tolower() and __toupper() into util.h as
replacements for tolower() and toupper() respectively as the latter do
a hidden conversion to Unicode which make then unsafe at any IRQL other
than PASSIVE_LEVEL.
This patch imports util.h from XENBUS and fixes other code to be compatible.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/bus.c         |   2 +-
 src/xenvif/fdo.c         |   4 +-
 src/xenvif/frontend.c    |   2 +-
 src/xenvif/link.c        |   2 +-
 src/xenvif/mac.c         |   2 +-
 src/xenvif/pdo.c         |   2 +-
 src/xenvif/receiver.c    |   2 +-
 src/xenvif/registry.c    |   2 +-
 src/xenvif/settings.c    |   2 +-
 src/xenvif/thread.c      |   2 +-
 src/xenvif/transmitter.c |   2 +-
 src/xenvif/util.h        | 105 +++++++++++++++++------------------------------
 src/xenvif/vif.c         |   2 +-
 13 files changed, 50 insertions(+), 81 deletions(-)

diff --git a/src/xenvif/bus.c b/src/xenvif/bus.c
index 9190535..d3796e3 100644
--- a/src/xenvif/bus.c
+++ b/src/xenvif/bus.c
@@ -53,7 +53,7 @@ __BusAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, BUS_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, BUS_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/fdo.c b/src/xenvif/fdo.c
index 82c3fd2..dae1ad8 100644
--- a/src/xenvif/fdo.c
+++ b/src/xenvif/fdo.c
@@ -112,7 +112,7 @@ __FdoAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, FDO_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, FDO_POOL);
 }
 
 static FORCEINLINE VOID
@@ -857,7 +857,7 @@ __FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
diff --git a/src/xenvif/frontend.c b/src/xenvif/frontend.c
index a43a534..9500a58 100644
--- a/src/xenvif/frontend.c
+++ b/src/xenvif/frontend.c
@@ -126,7 +126,7 @@ __FrontendAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, FRONTEND_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, FRONTEND_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/link.c b/src/xenvif/link.c
index 5161159..a9b75b3 100644
--- a/src/xenvif/link.c
+++ b/src/xenvif/link.c
@@ -45,7 +45,7 @@ __LinkAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, LINK_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, LINK_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/mac.c b/src/xenvif/mac.c
index 0a771a4..3d04670 100644
--- a/src/xenvif/mac.c
+++ b/src/xenvif/mac.c
@@ -73,7 +73,7 @@ __MacAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_MAC_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_MAC_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/pdo.c b/src/xenvif/pdo.c
index 07cf23a..bda8925 100644
--- a/src/xenvif/pdo.c
+++ b/src/xenvif/pdo.c
@@ -100,7 +100,7 @@ __PdoAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, PDO_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, PDO_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/receiver.c b/src/xenvif/receiver.c
index 53f322f..d3073e1 100644
--- a/src/xenvif/receiver.c
+++ b/src/xenvif/receiver.c
@@ -145,7 +145,7 @@ __ReceiverAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_RECEIVER_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_RECEIVER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 23b948b..9a7472b 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -45,7 +45,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/settings.c b/src/xenvif/settings.c
index 3ce4771..5cb9984 100644
--- a/src/xenvif/settings.c
+++ b/src/xenvif/settings.c
@@ -45,7 +45,7 @@ __SettingsAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, SETTINGS_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, SETTINGS_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/thread.c b/src/xenvif/thread.c
index 2fa0c1c..1357473 100644
--- a/src/xenvif/thread.c
+++ b/src/xenvif/thread.c
@@ -52,7 +52,7 @@ __ThreadAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, THREAD_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, THREAD_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/transmitter.c b/src/xenvif/transmitter.c
index f01fc40..a8b0162 100644
--- a/src/xenvif/transmitter.c
+++ b/src/xenvif/transmitter.c
@@ -232,7 +232,7 @@ __TransmitterAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_TRANSMITTER_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_TRANSMITTER_TAG);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xenvif/util.h b/src/xenvif/util.h
index 5fec116..6d140b0 100644
--- a/src/xenvif/util.h
+++ b/src/xenvif/util.h
@@ -29,8 +29,8 @@
  * SUCH DAMAGE.
  */
 
-#ifndef _UTIL_H
-#define _UTIL_H
+#ifndef _XENVIF_UTIL_H
+#define _XENVIF_UTIL_H
 
 #include <ntddk.h>
 
@@ -138,85 +138,32 @@ __InterlockedSubtract(
     return New;
 }
 
-typedef struct _NON_PAGED_BUFFER_HEADER {
-    SIZE_T  Length;
-    ULONG   Tag;
-} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
-
-typedef struct _NON_PAGED_BUFFER_TRAILER {
-    ULONG   Tag;
-} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
-
 static FORCEINLINE PVOID
-__AllocateNonPagedPoolWithTag(
-    IN  SIZE_T                  Length,
-    IN  ULONG                   Tag
+__AllocatePoolWithTag(
+    IN  POOL_TYPE   PoolType,
+    IN  SIZE_T      NumberOfBytes,
+    IN  ULONG       Tag
     )
 {
-    PUCHAR                      Buffer;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
+    PUCHAR          Buffer;
 
-    ASSERT(Length != 0);
+    __analysis_assume(PoolType == NonPagedPool ||
+                      PoolType == PagedPool);
 
-    Buffer = ExAllocatePoolWithTag(NonPagedPool,
-                                   sizeof (NON_PAGED_BUFFER_HEADER) +
-                                   Length +
-                                   sizeof (NON_PAGED_BUFFER_TRAILER),
-                                   Tag);
+    Buffer = ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
     if (Buffer == NULL)
-        goto done;
-
-    RtlZeroMemory(Buffer,
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER));
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    Header->Length = Length;
-    Header->Tag = Tag;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    Trailer->Tag = Tag;
+        return NULL;
 
-done:
+    RtlZeroMemory(Buffer, NumberOfBytes);
     return Buffer;
 }
 
 static FORCEINLINE VOID
 __FreePoolWithTag(
-    IN  PVOID                   _Buffer,
-    IN  ULONG                   Tag
+    IN  PVOID   Buffer,
+    IN  ULONG   Tag
     )
 {
-    PUCHAR                      Buffer = _Buffer;
-    SIZE_T                      Length;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Buffer != NULL);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    ASSERT3U(Tag, ==, Header->Tag);
-    Length = Header->Length;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    ASSERT3U(Tag, ==, Trailer->Tag);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    RtlFillMemory(Buffer,
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER),
-                  0xAA);
-
     ExFreePoolWithTag(Buffer, Tag);
 }
 
@@ -340,4 +287,26 @@ __strtok_r(
     return Token;
 }
 
-#endif  // _UTIL_H
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
+static FORCEINLINE CHAR
+__tolower(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'A' || Character > 'Z')
+        return Character;
+
+    return 'a' + Character - 'A';
+}
+
+#endif  // _XENVIF_UTIL_H
diff --git a/src/xenvif/vif.c b/src/xenvif/vif.c
index 76365d2..cd8aafc 100644
--- a/src/xenvif/vif.c
+++ b/src/xenvif/vif.c
@@ -64,7 +64,7 @@ __VifAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, XENVIF_VIF_TAG);
+    return __AllocatePoolWithTag(NonPagedPool, Length, XENVIF_VIF_TAG);
 }
 
 static FORCEINLINE VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:27:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:27:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zNy-0000F2-Q6; Thu, 10 Dec 2015 11:27:46 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zNx-0000Eb-Nm
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:27:45 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	57/AF-01748-0B169665; Thu, 10 Dec 2015 11:27:44 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1449746863!9856398!1
X-Originating-IP: [209.85.192.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 57939 invoked from network); 10 Dec 2015 11:27:44 -0000
Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com)
	(209.85.192.54)
	by server-10.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:27:44 -0000
Received: by qgec40 with SMTP id c40so135253639qge.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:27:43 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=F7qb8Z2XT6j06uSOdeznH6NAaDdFg5697NE/8t4lyag=;
	b=rc8M95Y0tQB2VLXrg5RkFpgJ+psJxWbAiT/WrEGSRbp+ezK4MXWYKrmQi6O/D+1MO/
	EVcgFeVP4q2iM/6r3lDvvwncYhKMyWXquKs6KrzUz5Yc7O2SbBWs9sHqkW9v0wXhwl/C
	tsmd57c9u7BuUrrt/GEpK2RW/kMGXkDlUgp5t5xj+R6aaqDRZoRF0FU408FE2kSbY3w+
	jfasreTzm0uVF+R8Ycdesv8yAXnHfgoczG5duzoXhRTMwziGgt9hRHuKUV1uXugdgAxz
	pUetbBORyi8ytAbuEecoTH1wXo0pvEJ1Gw4OEALOLr4Xoa2N0Y9stKm6DhSfaHHe6P+k
	mJRw==
X-Received: by 10.129.51.17 with SMTP id z17mr4102249ywz.148.1449746862857;
	Thu, 10 Dec 2015 03:27:42 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id u63sm8988676ywf.4.2015.12.10.03.27.41
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:27:42 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:27:32 +0000
Message-Id: <1449746852-1360-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449746852-1360-1-git-send-email-paul.durrant@citrix.com>
References: <1449746852-1360-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Re-synchrinize registry.c with XENBUS
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The registry code in XENBUS has some fixes that are not present in the
XENVIF copy, so import the updated code from XENBUS.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 79 +++++++++++++++++++++++++++++++++++++++------------
 src/xenvif/registry.h | 13 +++++++++
 2 files changed, 74 insertions(+), 18 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 9a7472b..d994e13 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -30,13 +30,12 @@
  */
 
 #include <ntddk.h>
-#include <stdlib.h>
 
 #include "registry.h"
 #include "assert.h"
 #include "util.h"
 
-#define REGISTRY_POOL 'GERX'
+#define REGISTRY_TAG 'GERX'
 
 static UNICODE_STRING   RegistryPath;
 
@@ -45,7 +44,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
 }
 
 static FORCEINLINE VOID
@@ -53,7 +52,7 @@ __RegistryFree(
     IN  PVOID   Buffer
     )
 {
-    __FreePoolWithTag(Buffer, REGISTRY_POOL);
+    __FreePoolWithTag(Buffer, REGISTRY_TAG);
 }
 
 NTSTATUS
@@ -117,6 +116,40 @@ fail1:
 }
 
 NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    )
+{
+    OBJECT_ATTRIBUTES   Attributes;
+    NTSTATUS            status;
+
+    InitializeObjectAttributes(&Attributes,
+                               Path,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               Parent,
+                               NULL);
+
+    status = ZwCreateKey(Key,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         Options,
+                         NULL
+                         );
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
     OUT PHANDLE         Key
@@ -126,6 +159,14 @@ RegistryOpenServiceKey(
 }
 
 NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE         Key
+    )
+{
+    return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, Key);
+}
+
+NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -331,6 +372,8 @@ RegistryDeleteSubKey(
 
     ZwClose(SubKey);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -569,6 +612,8 @@ RegistryDeleteValue(
 
     RtlFreeUnicodeString(&Unicode);
 
+    (VOID) ZwFlushKey(Key);
+
     return STATUS_SUCCESS;
 
 fail2:
@@ -689,6 +734,8 @@ RegistryUpdateDwordValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -938,30 +985,25 @@ RegistryQueryBinaryValue(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    *Buffer = NULL;
-
     switch (Partial->Type) {
     case REG_BINARY:
-        *Length = Partial->DataLength;
-
-        if (*Length == 0)
-            break;
-
         *Buffer = __RegistryAllocate(Partial->DataLength);
 
         status = STATUS_NO_MEMORY;
         if (*Buffer == NULL)
             break;
 
+        *Length = Partial->DataLength;
         RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
         break;
 
     default:
         status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
         break;
     }
 
-    if (!NT_SUCCESS(status))
+    if (*Buffer == NULL)
         goto fail5;
 
     __RegistryFree(Partial);
@@ -1002,7 +1044,7 @@ RegistryUpdateBinaryValue(
         goto fail1;
 
     Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
-                                 __min(Length, 1));
+                                 Length);
 
     status = STATUS_NO_MEMORY;
     if (Partial == NULL)
@@ -1010,11 +1052,8 @@ RegistryUpdateBinaryValue(
 
     Partial->TitleIndex = 0;
     Partial->Type = REG_BINARY;
-
-    if (Length != 0) {
-        Partial->DataLength = Length;
-        RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
-    }
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
 
     status = ZwSetValueKey(Key,
                            &Unicode,
@@ -1027,6 +1066,8 @@ RegistryUpdateBinaryValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -1317,6 +1358,8 @@ RegistryUpdateSzValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index e39ccb5..faa6c71 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
     );
 
 extern NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    );
+
+extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
 extern NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE     Key
+    );
+
+extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:27:46 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:27:46 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zNy-0000F2-Q6; Thu, 10 Dec 2015 11:27:46 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zNx-0000Eb-Nm
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:27:45 +0000
Received: from [85.158.137.68] by server-5.bemta-3.messagelabs.com id
	57/AF-01748-0B169665; Thu, 10 Dec 2015 11:27:44 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1449746863!9856398!1
X-Originating-IP: [209.85.192.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 57939 invoked from network); 10 Dec 2015 11:27:44 -0000
Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com)
	(209.85.192.54)
	by server-10.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:27:44 -0000
Received: by qgec40 with SMTP id c40so135253639qge.2
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:27:43 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id:in-reply-to:references;
	bh=F7qb8Z2XT6j06uSOdeznH6NAaDdFg5697NE/8t4lyag=;
	b=rc8M95Y0tQB2VLXrg5RkFpgJ+psJxWbAiT/WrEGSRbp+ezK4MXWYKrmQi6O/D+1MO/
	EVcgFeVP4q2iM/6r3lDvvwncYhKMyWXquKs6KrzUz5Yc7O2SbBWs9sHqkW9v0wXhwl/C
	tsmd57c9u7BuUrrt/GEpK2RW/kMGXkDlUgp5t5xj+R6aaqDRZoRF0FU408FE2kSbY3w+
	jfasreTzm0uVF+R8Ycdesv8yAXnHfgoczG5duzoXhRTMwziGgt9hRHuKUV1uXugdgAxz
	pUetbBORyi8ytAbuEecoTH1wXo0pvEJ1Gw4OEALOLr4Xoa2N0Y9stKm6DhSfaHHe6P+k
	mJRw==
X-Received: by 10.129.51.17 with SMTP id z17mr4102249ywz.148.1449746862857;
	Thu, 10 Dec 2015 03:27:42 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id u63sm8988676ywf.4.2015.12.10.03.27.41
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:27:42 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:27:32 +0000
Message-Id: <1449746852-1360-2-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
In-Reply-To: <1449746852-1360-1-git-send-email-paul.durrant@citrix.com>
References: <1449746852-1360-1-git-send-email-paul.durrant@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH 2/2] Re-synchrinize registry.c with XENBUS
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The registry code in XENBUS has some fixes that are not present in the
XENVIF copy, so import the updated code from XENBUS.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvif/registry.c | 79 +++++++++++++++++++++++++++++++++++++++------------
 src/xenvif/registry.h | 13 +++++++++
 2 files changed, 74 insertions(+), 18 deletions(-)

diff --git a/src/xenvif/registry.c b/src/xenvif/registry.c
index 9a7472b..d994e13 100644
--- a/src/xenvif/registry.c
+++ b/src/xenvif/registry.c
@@ -30,13 +30,12 @@
  */
 
 #include <ntddk.h>
-#include <stdlib.h>
 
 #include "registry.h"
 #include "assert.h"
 #include "util.h"
 
-#define REGISTRY_POOL 'GERX'
+#define REGISTRY_TAG 'GERX'
 
 static UNICODE_STRING   RegistryPath;
 
@@ -45,7 +44,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
 }
 
 static FORCEINLINE VOID
@@ -53,7 +52,7 @@ __RegistryFree(
     IN  PVOID   Buffer
     )
 {
-    __FreePoolWithTag(Buffer, REGISTRY_POOL);
+    __FreePoolWithTag(Buffer, REGISTRY_TAG);
 }
 
 NTSTATUS
@@ -117,6 +116,40 @@ fail1:
 }
 
 NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    )
+{
+    OBJECT_ATTRIBUTES   Attributes;
+    NTSTATUS            status;
+
+    InitializeObjectAttributes(&Attributes,
+                               Path,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               Parent,
+                               NULL);
+
+    status = ZwCreateKey(Key,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         Options,
+                         NULL
+                         );
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
     OUT PHANDLE         Key
@@ -126,6 +159,14 @@ RegistryOpenServiceKey(
 }
 
 NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE         Key
+    )
+{
+    return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, Key);
+}
+
+NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -331,6 +372,8 @@ RegistryDeleteSubKey(
 
     ZwClose(SubKey);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -569,6 +612,8 @@ RegistryDeleteValue(
 
     RtlFreeUnicodeString(&Unicode);
 
+    (VOID) ZwFlushKey(Key);
+
     return STATUS_SUCCESS;
 
 fail2:
@@ -689,6 +734,8 @@ RegistryUpdateDwordValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -938,30 +985,25 @@ RegistryQueryBinaryValue(
     if (!NT_SUCCESS(status))
         goto fail4;
 
-    *Buffer = NULL;
-
     switch (Partial->Type) {
     case REG_BINARY:
-        *Length = Partial->DataLength;
-
-        if (*Length == 0)
-            break;
-
         *Buffer = __RegistryAllocate(Partial->DataLength);
 
         status = STATUS_NO_MEMORY;
         if (*Buffer == NULL)
             break;
 
+        *Length = Partial->DataLength;
         RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
         break;
 
     default:
         status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
         break;
     }
 
-    if (!NT_SUCCESS(status))
+    if (*Buffer == NULL)
         goto fail5;
 
     __RegistryFree(Partial);
@@ -1002,7 +1044,7 @@ RegistryUpdateBinaryValue(
         goto fail1;
 
     Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
-                                 __min(Length, 1));
+                                 Length);
 
     status = STATUS_NO_MEMORY;
     if (Partial == NULL)
@@ -1010,11 +1052,8 @@ RegistryUpdateBinaryValue(
 
     Partial->TitleIndex = 0;
     Partial->Type = REG_BINARY;
-
-    if (Length != 0) {
-        Partial->DataLength = Length;
-        RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
-    }
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
 
     status = ZwSetValueKey(Key,
                            &Unicode,
@@ -1027,6 +1066,8 @@ RegistryUpdateBinaryValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -1317,6 +1358,8 @@ RegistryUpdateSzValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
diff --git a/src/xenvif/registry.h b/src/xenvif/registry.h
index e39ccb5..faa6c71 100644
--- a/src/xenvif/registry.h
+++ b/src/xenvif/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
     );
 
 extern NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    );
+
+extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
 extern NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE     Key
+    );
+
+extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:42:47 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:42:47 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zcU-0000wy-Vu; Thu, 10 Dec 2015 11:42:46 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zcS-0000vu-JS
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:42:45 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	29/99-13475-33569665; Thu, 10 Dec 2015 11:42:43 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1449747762!10034125!1
X-Originating-IP: [209.85.192.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29922 invoked from network); 10 Dec 2015 11:42:43 -0000
Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com)
	(209.85.192.54)
	by server-16.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:42:43 -0000
Received: by qgea14 with SMTP id a14so137316527qge.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:42:42 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=rAk9yweYOap81w7QDo/e2CcI1A+FJl3iU3Mg8m8HMzs=;
	b=UykiuWUuCieb/jKkOHpvky3l3wGKlXZM0G7oVlP/F+TbSLm5kSiHDbItx4dzQprLPy
	waPxmYoqwZSr9Ne86QrhvHLzfEka8P/d6NAyDaUKUyFeHWCIRZFcvAsf/MkBp0BfHeuN
	bigj5NvDd2B8GRdU8EdpMwyxY1eYCjGsrnrIHUoBZTULCiQFNumO82pP+S7lfvbTdAJ3
	kN5svJGRGuRsr3y4GhyM3hXE/aFK4WvapABJGITle2NQVtBgmWKZfG7n7S0Ec7+Zl++E
	wUBPuQxE2R1Nyuf3MpNOR8S9hf3OBRJUcrDeEP/T8c2PHixTMSvgMXzlXywmG9t4kBBc
	EVRA==
X-Received: by 10.13.243.132 with SMTP id c126mr1411761ywf.118.1449747762174; 
	Thu, 10 Dec 2015 03:42:42 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	204sm8956692ywr.32.2015.12.10.03.42.41
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:42:41 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:42:30 +0000
Message-Id: <1449747750-9516-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't use C runtime version of toupper()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It seems that, despite its trivial functionality, the runtime implementation
insists on converting to Unicode! This means the function is actually only
safe at PASSIVE_LEVEL.
This patch implements __toupper() as a replacement with no such hidden
nastiness and modifies callers to use that.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/fdo.c  |  2 +-
 src/xenvbd/util.h | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index eac0584..aa92fe4 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1015,7 +1015,7 @@ __FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
diff --git a/src/xenvbd/util.h b/src/xenvbd/util.h
index eb02e34..f55fb78 100644
--- a/src/xenvbd/util.h
+++ b/src/xenvbd/util.h
@@ -266,4 +266,15 @@ __strtok_r(
     return Token;
 }
 
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
 #endif  // _UTIL_H
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:42:47 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:42:47 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zcU-0000wy-Vu; Thu, 10 Dec 2015 11:42:46 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zcS-0000vu-JS
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:42:45 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	29/99-13475-33569665; Thu, 10 Dec 2015 11:42:43 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-27.messagelabs.com!1449747762!10034125!1
X-Originating-IP: [209.85.192.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 29922 invoked from network); 10 Dec 2015 11:42:43 -0000
Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com)
	(209.85.192.54)
	by server-16.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:42:43 -0000
Received: by qgea14 with SMTP id a14so137316527qge.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:42:42 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=rAk9yweYOap81w7QDo/e2CcI1A+FJl3iU3Mg8m8HMzs=;
	b=UykiuWUuCieb/jKkOHpvky3l3wGKlXZM0G7oVlP/F+TbSLm5kSiHDbItx4dzQprLPy
	waPxmYoqwZSr9Ne86QrhvHLzfEka8P/d6NAyDaUKUyFeHWCIRZFcvAsf/MkBp0BfHeuN
	bigj5NvDd2B8GRdU8EdpMwyxY1eYCjGsrnrIHUoBZTULCiQFNumO82pP+S7lfvbTdAJ3
	kN5svJGRGuRsr3y4GhyM3hXE/aFK4WvapABJGITle2NQVtBgmWKZfG7n7S0Ec7+Zl++E
	wUBPuQxE2R1Nyuf3MpNOR8S9hf3OBRJUcrDeEP/T8c2PHixTMSvgMXzlXywmG9t4kBBc
	EVRA==
X-Received: by 10.13.243.132 with SMTP id c126mr1411761ywf.118.1449747762174; 
	Thu, 10 Dec 2015 03:42:42 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	204sm8956692ywr.32.2015.12.10.03.42.41
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:42:41 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:42:30 +0000
Message-Id: <1449747750-9516-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Don't use C runtime version of toupper()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

It seems that, despite its trivial functionality, the runtime implementation
insists on converting to Unicode! This means the function is actually only
safe at PASSIVE_LEVEL.
This patch implements __toupper() as a replacement with no such hidden
nastiness and modifies callers to use that.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xenvbd/fdo.c  |  2 +-
 src/xenvbd/util.h | 11 +++++++++++
 2 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/src/xenvbd/fdo.c b/src/xenvbd/fdo.c
index eac0584..aa92fe4 100644
--- a/src/xenvbd/fdo.c
+++ b/src/xenvbd/fdo.c
@@ -1015,7 +1015,7 @@ __FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
diff --git a/src/xenvbd/util.h b/src/xenvbd/util.h
index eb02e34..f55fb78 100644
--- a/src/xenvbd/util.h
+++ b/src/xenvbd/util.h
@@ -266,4 +266,15 @@ __strtok_r(
     return Token;
 }
 
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
 #endif  // _UTIL_H
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:43:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:43:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zdA-00013G-5q; Thu, 10 Dec 2015 11:43:28 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zd8-00012l-Ew
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:43:26 +0000
Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id
	F7/C2-24494-D5569665; Thu, 10 Dec 2015 11:43:25 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-206.messagelabs.com!1449747804!9499327!1
X-Originating-IP: [209.85.192.41]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11254 invoked from network); 10 Dec 2015 11:43:24 -0000
Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com)
	(209.85.192.41)
	by server-16.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:43:24 -0000
Received: by qgcc31 with SMTP id c31so137155785qgc.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:43:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=IfOTVp2CvRcF2eF/yiE4KB4cbyH7S2IxdimTWCW+k0k=;
	b=oUtwYj7HVQxc8KHQ8biLWwcZki2esZZSwhEKor9OkoTn5UQIG/87LpWrxhPvPxCagz
	Y6SwcGoYvEMLfwSPHVX6HE3GNTldsslOBrZC0ElGUiXvy1HCN9Kmxe+BrM3D+yssuvGq
	Vcfbvb9P32O9Bw8PbVT8+ecCHDn65Mzc1G5bF3x8mnnQm1vtAjv2EgmULvWIcLyi+Zz6
	k8U3dLuBqd+LhKVMO4oEre6Wo1DFRdWreSTwpE6HbXW3RmsbO8bR33SsdnvpfEaNaPYJ
	iaL9Z78Z4bfe8gOEY3uY/iBP22uBaQWhLXZYdra28K+VeW5RkC1OwbaVi2t9n8SUMMuf
	s5iA==
X-Received: by 10.129.86.131 with SMTP id k125mr4148162ywb.17.1449747803573;
	Thu, 10 Dec 2015 03:43:23 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id 205sm8990588ywg.7.2015.12.10.03.43.22
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:43:23 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:43:13 +0000
Message-Id: <1449747793-10904-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Re-synchronize util.h with XENBUS and use
	__toupper()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A recent patch introduced __tolower() and __toupper() into util.h as
replacements for tolower() and toupper() respectively as the latter do
a hidden conversion to Unicode which make then unsafe at any IRQL other
than PASSIVE_LEVEL.
This patch imports util.h from XENBUS and fixes other code to be compatible.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/util.h          | 317 ------------------------------------------------
 src/xeniface/fdo.c      |   4 +-
 src/xeniface/registry.c |   4 +-
 src/xeniface/thread.c   |   4 +-
 src/xeniface/util.h     | 312 +++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 318 insertions(+), 323 deletions(-)
 delete mode 100644 include/util.h
 create mode 100644 src/xeniface/util.h

diff --git a/include/util.h b/include/util.h
deleted file mode 100644
index 10e5414..0000000
--- a/include/util.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#ifndef _UTIL_H
-#define _UTIL_H
-
-#include <ntddk.h>
-
-#include "assert.h"
-
-#define	P2ROUNDUP(_x, _a)   \
-        (-(-(_x) & -(_a)))
-
-static FORCEINLINE LONG
-__ffs(
-    IN  unsigned long long  mask
-    )
-{
-    unsigned char           *array = (unsigned char *)&mask;
-    unsigned int            byte;
-    unsigned int            bit;
-    unsigned char           val;
-
-    val = 0;
-
-    byte = 0;
-    while (byte < 8) {
-        val = array[byte];
-
-        if (val != 0)
-            break;
-
-        byte++;
-    }
-    if (byte == 8)
-        return -1;
-
-    bit = 0;
-    while (bit < 8) {
-        if (val & 0x01)
-            break;
-
-        val >>= 1;
-        bit++;
-    }
-
-    return (byte * 8) + bit;
-}
-
-#define __ffu(_mask)  \
-        __ffs(~(_mask))
-
-static FORCEINLINE LONG
-__InterlockedAdd(
-    IN  LONG    *Value,
-    IN  LONG    Delta
-    )
-{
-    LONG        New;
-    LONG        Old;
-
-    do {
-        Old = *Value;
-        New = Old + Delta;
-    } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
-    return New;
-}
-
-static FORCEINLINE LONG
-__InterlockedSubtract(
-    IN  LONG    *Value,
-    IN  LONG    Delta
-    )
-{
-    LONG        New;
-    LONG        Old;
-
-    do {
-        Old = *Value;
-        New = Old - Delta;
-    } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
-    return New;
-}
-
-typedef struct _NON_PAGED_BUFFER_HEADER {
-    SIZE_T  Length;
-    ULONG   Tag;
-} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
-
-typedef struct _NON_PAGED_BUFFER_TRAILER {
-    ULONG   Tag;
-} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
-
-static FORCEINLINE PVOID
-__AllocateNonPagedPoolWithTag(
-    IN  SIZE_T                  Length,
-    IN  ULONG                   Tag
-    )
-{
-    PUCHAR                      Buffer;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Length != 0);
-
-    Buffer = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool,
-                                   sizeof (NON_PAGED_BUFFER_HEADER) +
-                                   Length +
-                                   sizeof (NON_PAGED_BUFFER_TRAILER),
-                                   Tag);
-    if (Buffer == NULL)
-        goto done;
-
-    RtlZeroMemory(Buffer, 
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER));
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    Header->Length = Length;
-    Header->Tag = Tag;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    Trailer->Tag = Tag;
-
-done:
-    return Buffer;
-}
-
-static FORCEINLINE VOID
-__FreePoolWithTag(
-    IN  PVOID                   _Buffer,
-    IN  ULONG                   Tag
-    )
-{
-    PUCHAR                      Buffer = (PUCHAR)_Buffer;
-    SIZE_T                      Length;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Buffer != NULL);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    ASSERT3U(Tag, ==, Header->Tag);
-    Length = Header->Length;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    ASSERT3U(Tag, ==, Trailer->Tag);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    RtlFillMemory(Buffer, 
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER),
-                  0xAA);
-
-    ExFreePoolWithTag(Buffer, Tag);
-}
-
-static FORCEINLINE PMDL
-__AllocatePage(
-    VOID
-    )
-{
-    PHYSICAL_ADDRESS    LowAddress;
-    PHYSICAL_ADDRESS    HighAddress;
-    LARGE_INTEGER       SkipBytes;
-    SIZE_T              TotalBytes;
-    PMDL                Mdl;
-    PUCHAR              MdlMappedSystemVa;
-    NTSTATUS            status;
-
-    LowAddress.QuadPart = 0ull;
-    HighAddress.QuadPart = ~0ull;
-    SkipBytes.QuadPart = 0ull;
-    TotalBytes = (SIZE_T)PAGE_SIZE;
-
-    Mdl = MmAllocatePagesForMdlEx(LowAddress,
-                                  HighAddress,
-                                  SkipBytes,
-                                  TotalBytes,
-                                  MmCached,
-                                  0);
-
-    status = STATUS_NO_MEMORY;
-    if (Mdl == NULL)
-        goto fail1;
-
-    ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
-                             MDL_PARTIAL_HAS_BEEN_MAPPED |
-                             MDL_PARTIAL |
-                             MDL_PARENT_MAPPED_SYSTEM_VA |
-                             MDL_SOURCE_IS_NONPAGED_POOL |
-                             MDL_IO_SPACE)) == 0);
-
-    MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
-                                                     KernelMode,
-                                                     MmCached,
-                                                     NULL,
-                                                     FALSE,
-                                                     NormalPagePriority);
-
-    status = STATUS_UNSUCCESSFUL;
-    if (MdlMappedSystemVa == NULL)
-        goto fail2;
-
-    ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
-
-    RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
-
-    return Mdl;
-
-fail2:
-    Error("fail2\n");
-
-    MmFreePagesFromMdl(Mdl);
-    ExFreePool(Mdl);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
-}
-
-static FORCEINLINE VOID
-__FreePage(
-    IN	PMDL	Mdl
-    )
-{
-    PUCHAR	MdlMappedSystemVa;
-
-    ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
-    MdlMappedSystemVa = Mdl->MappedSystemVa;
-
-    RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
-    
-    MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
-
-    MmFreePagesFromMdl(Mdl);
-}
-
-static FORCEINLINE PCHAR
-__strtok_r(
-    IN      PCHAR   Buffer,
-    IN      PCHAR   Delimiter,
-    IN OUT  PCHAR   *Context
-    )
-{
-    PCHAR           Token;
-    PCHAR           End;
-
-    if (Buffer != NULL)
-        *Context = Buffer;
-
-    Token = *Context;
-
-    if (Token == NULL)
-        return NULL;
-
-    while (*Token != L'\0' &&
-           strchr(Delimiter, *Token) != NULL)
-        Token++;
-
-    if (*Token == L'\0')
-        return NULL;
-
-    End = Token + 1;
-    while (*End != L'\0' &&
-           strchr(Delimiter, *End) == NULL)
-        End++;
-
-    if (*End != L'\0')
-        *End++ = L'\0';
-
-    *Context = End;
-
-    return Token;
-}
-
-#endif  // _UTIL_H
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 6eea3ab..b23832d 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -187,7 +187,7 @@ __FdoAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, FDO_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, FDO_POOL);
 }
 
 static FORCEINLINE VOID
@@ -591,7 +591,7 @@ __FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index 519d3f6..136502c 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -30,9 +30,9 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 
 #include "registry.h"
+#include "util.h"
 #include "assert.h"
 
 #define REGISTRY_POOL 'GERX'
@@ -44,7 +44,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xeniface/thread.c b/src/xeniface/thread.c
index f008834..386bba7 100644
--- a/src/xeniface/thread.c
+++ b/src/xeniface/thread.c
@@ -30,9 +30,9 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 
 #include "thread.h"
+#include "util.h"
 #include "log.h"
 #include "assert.h"
 
@@ -52,7 +52,7 @@ __ThreadAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, THREAD_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, THREAD_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xeniface/util.h b/src/xeniface/util.h
new file mode 100644
index 0000000..13a6734
--- /dev/null
+++ b/src/xeniface/util.h
@@ -0,0 +1,312 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENIFACE_UTIL_H
+#define _XENIFACE_UTIL_H
+
+#include <ntddk.h>
+
+#include "assert.h"
+
+#define	P2ROUNDUP(_x, _a)   \
+        (-(-(_x) & -(_a)))
+
+static FORCEINLINE LONG
+__ffs(
+    IN  unsigned long long  mask
+    )
+{
+    unsigned char           *array = (unsigned char *)&mask;
+    unsigned int            byte;
+    unsigned int            bit;
+    unsigned char           val;
+
+    val = 0;
+
+    byte = 0;
+    while (byte < 8) {
+        val = array[byte];
+
+        if (val != 0)
+            break;
+
+        byte++;
+    }
+    if (byte == 8)
+        return -1;
+
+    bit = 0;
+    while (bit < 8) {
+        if (val & 0x01)
+            break;
+
+        val >>= 1;
+        bit++;
+    }
+
+    return (byte * 8) + bit;
+}
+
+#define __ffu(_mask)  \
+        __ffs(~(_mask))
+
+static FORCEINLINE VOID
+__CpuId(
+    IN  ULONG   Leaf,
+    OUT PULONG  EAX OPTIONAL,
+    OUT PULONG  EBX OPTIONAL,
+    OUT PULONG  ECX OPTIONAL,
+    OUT PULONG  EDX OPTIONAL
+    )
+{
+    ULONG       Value[4] = {0};
+
+    __cpuid(Value, Leaf);
+
+    if (EAX)
+        *EAX = Value[0];
+
+    if (EBX)
+        *EBX = Value[1];
+
+    if (ECX)
+        *ECX = Value[2];
+
+    if (EDX)
+        *EDX = Value[3];
+}
+
+static FORCEINLINE LONG
+__InterlockedAdd(
+    IN  LONG    *Value,
+    IN  LONG    Delta
+    )
+{
+    LONG        New;
+    LONG        Old;
+
+    do {
+        Old = *Value;
+        New = Old + Delta;
+    } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+    return New;
+}
+
+static FORCEINLINE LONG
+__InterlockedSubtract(
+    IN  LONG    *Value,
+    IN  LONG    Delta
+    )
+{
+    LONG        New;
+    LONG        Old;
+
+    do {
+        Old = *Value;
+        New = Old - Delta;
+    } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+    return New;
+}
+
+static FORCEINLINE PVOID
+__AllocatePoolWithTag(
+    IN  POOL_TYPE   PoolType,
+    IN  SIZE_T      NumberOfBytes,
+    IN  ULONG       Tag
+    )
+{
+    PUCHAR          Buffer;
+
+    __analysis_assume(PoolType == NonPagedPool ||
+                      PoolType == PagedPool);
+
+    Buffer = ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
+    if (Buffer == NULL)
+        return NULL;
+
+    RtlZeroMemory(Buffer, NumberOfBytes);
+    return Buffer;
+}
+
+static FORCEINLINE VOID
+__FreePoolWithTag(
+    IN  PVOID   Buffer,
+    IN  ULONG   Tag
+    )
+{
+    ExFreePoolWithTag(Buffer, Tag);
+}
+
+static FORCEINLINE PMDL
+__AllocatePage(
+    VOID
+    )
+{
+    PHYSICAL_ADDRESS    LowAddress;
+    PHYSICAL_ADDRESS    HighAddress;
+    LARGE_INTEGER       SkipBytes;
+    SIZE_T              TotalBytes;
+    PMDL                Mdl;
+    PUCHAR              MdlMappedSystemVa;
+    NTSTATUS            status;
+
+    LowAddress.QuadPart = 0ull;
+    HighAddress.QuadPart = ~0ull;
+    SkipBytes.QuadPart = 0ull;
+    TotalBytes = (SIZE_T)PAGE_SIZE;
+
+    Mdl = MmAllocatePagesForMdlEx(LowAddress,
+                                  HighAddress,
+                                  SkipBytes,
+                                  TotalBytes,
+                                  MmCached,
+                                  0);
+
+    status = STATUS_NO_MEMORY;
+    if (Mdl == NULL)
+        goto fail1;
+
+    ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
+                             MDL_PARTIAL_HAS_BEEN_MAPPED |
+                             MDL_PARTIAL |
+                             MDL_PARENT_MAPPED_SYSTEM_VA |
+                             MDL_SOURCE_IS_NONPAGED_POOL |
+                             MDL_IO_SPACE)) == 0);
+
+    MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
+                                                     KernelMode,
+						                             MmCached,
+						                             NULL,
+						                             FALSE,
+						                             NormalPagePriority);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (MdlMappedSystemVa == NULL)
+        goto fail2;
+
+    ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
+
+    RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
+
+    return Mdl;
+
+fail2:
+    Error("fail2\n");
+
+    MmFreePagesFromMdl(Mdl);
+    ExFreePool(Mdl);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return NULL;
+}
+
+static FORCEINLINE VOID
+__FreePage(
+    IN	PMDL	Mdl
+    )
+{
+    PUCHAR	MdlMappedSystemVa;
+
+    ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+    MdlMappedSystemVa = Mdl->MappedSystemVa;
+
+    RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
+
+    MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
+
+    MmFreePagesFromMdl(Mdl);
+}
+
+static FORCEINLINE PCHAR
+__strtok_r(
+    IN      PCHAR   Buffer,
+    IN      PCHAR   Delimiter,
+    IN OUT  PCHAR   *Context
+    )
+{
+    PCHAR           Token;
+    PCHAR           End;
+
+    if (Buffer != NULL)
+        *Context = Buffer;
+
+    Token = *Context;
+
+    if (Token == NULL)
+        return NULL;
+
+    while (*Token != L'\0' &&
+           strchr(Delimiter, *Token) != NULL)
+        Token++;
+
+    if (*Token == L'\0')
+        return NULL;
+
+    End = Token + 1;
+    while (*End != L'\0' &&
+           strchr(Delimiter, *End) == NULL)
+        End++;
+
+    if (*End != L'\0')
+        *End++ = L'\0';
+
+    *Context = End;
+
+    return Token;
+}
+
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
+static FORCEINLINE CHAR
+__tolower(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'A' || Character > 'Z')
+        return Character;
+
+    return 'a' + Character - 'A';
+}
+
+#endif  // _XENIFACE_UTIL_H
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:43:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:43:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zdA-00013G-5q; Thu, 10 Dec 2015 11:43:28 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zd8-00012l-Ew
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:43:26 +0000
Received: from [85.158.139.211] by server-11.bemta-5.messagelabs.com id
	F7/C2-24494-D5569665; Thu, 10 Dec 2015 11:43:25 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-16.tower-206.messagelabs.com!1449747804!9499327!1
X-Originating-IP: [209.85.192.41]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 11254 invoked from network); 10 Dec 2015 11:43:24 -0000
Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com)
	(209.85.192.41)
	by server-16.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:43:24 -0000
Received: by qgcc31 with SMTP id c31so137155785qgc.3
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:43:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=IfOTVp2CvRcF2eF/yiE4KB4cbyH7S2IxdimTWCW+k0k=;
	b=oUtwYj7HVQxc8KHQ8biLWwcZki2esZZSwhEKor9OkoTn5UQIG/87LpWrxhPvPxCagz
	Y6SwcGoYvEMLfwSPHVX6HE3GNTldsslOBrZC0ElGUiXvy1HCN9Kmxe+BrM3D+yssuvGq
	Vcfbvb9P32O9Bw8PbVT8+ecCHDn65Mzc1G5bF3x8mnnQm1vtAjv2EgmULvWIcLyi+Zz6
	k8U3dLuBqd+LhKVMO4oEre6Wo1DFRdWreSTwpE6HbXW3RmsbO8bR33SsdnvpfEaNaPYJ
	iaL9Z78Z4bfe8gOEY3uY/iBP22uBaQWhLXZYdra28K+VeW5RkC1OwbaVi2t9n8SUMMuf
	s5iA==
X-Received: by 10.129.86.131 with SMTP id k125mr4148162ywb.17.1449747803573;
	Thu, 10 Dec 2015 03:43:23 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id 205sm8990588ywg.7.2015.12.10.03.43.22
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:43:23 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:43:13 +0000
Message-Id: <1449747793-10904-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Re-synchronize util.h with XENBUS and use
	__toupper()
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

A recent patch introduced __tolower() and __toupper() into util.h as
replacements for tolower() and toupper() respectively as the latter do
a hidden conversion to Unicode which make then unsafe at any IRQL other
than PASSIVE_LEVEL.
This patch imports util.h from XENBUS and fixes other code to be compatible.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 include/util.h          | 317 ------------------------------------------------
 src/xeniface/fdo.c      |   4 +-
 src/xeniface/registry.c |   4 +-
 src/xeniface/thread.c   |   4 +-
 src/xeniface/util.h     | 312 +++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 318 insertions(+), 323 deletions(-)
 delete mode 100644 include/util.h
 create mode 100644 src/xeniface/util.h

diff --git a/include/util.h b/include/util.h
deleted file mode 100644
index 10e5414..0000000
--- a/include/util.h
+++ /dev/null
@@ -1,317 +0,0 @@
-/* Copyright (c) Citrix Systems Inc.
- * All rights reserved.
- * 
- * Redistribution and use in source and binary forms, 
- * with or without modification, are permitted provided 
- * that the following conditions are met:
- * 
- * *   Redistributions of source code must retain the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer.
- * *   Redistributions in binary form must reproduce the above 
- *     copyright notice, this list of conditions and the 
- *     following disclaimer in the documentation and/or other 
- *     materials provided with the distribution.
- * 
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND 
- * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 
- * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
- * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
- * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 
- * SUCH DAMAGE.
- */
-
-#ifndef _UTIL_H
-#define _UTIL_H
-
-#include <ntddk.h>
-
-#include "assert.h"
-
-#define	P2ROUNDUP(_x, _a)   \
-        (-(-(_x) & -(_a)))
-
-static FORCEINLINE LONG
-__ffs(
-    IN  unsigned long long  mask
-    )
-{
-    unsigned char           *array = (unsigned char *)&mask;
-    unsigned int            byte;
-    unsigned int            bit;
-    unsigned char           val;
-
-    val = 0;
-
-    byte = 0;
-    while (byte < 8) {
-        val = array[byte];
-
-        if (val != 0)
-            break;
-
-        byte++;
-    }
-    if (byte == 8)
-        return -1;
-
-    bit = 0;
-    while (bit < 8) {
-        if (val & 0x01)
-            break;
-
-        val >>= 1;
-        bit++;
-    }
-
-    return (byte * 8) + bit;
-}
-
-#define __ffu(_mask)  \
-        __ffs(~(_mask))
-
-static FORCEINLINE LONG
-__InterlockedAdd(
-    IN  LONG    *Value,
-    IN  LONG    Delta
-    )
-{
-    LONG        New;
-    LONG        Old;
-
-    do {
-        Old = *Value;
-        New = Old + Delta;
-    } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
-    return New;
-}
-
-static FORCEINLINE LONG
-__InterlockedSubtract(
-    IN  LONG    *Value,
-    IN  LONG    Delta
-    )
-{
-    LONG        New;
-    LONG        Old;
-
-    do {
-        Old = *Value;
-        New = Old - Delta;
-    } while (InterlockedCompareExchange(Value, New, Old) != Old);
-
-    return New;
-}
-
-typedef struct _NON_PAGED_BUFFER_HEADER {
-    SIZE_T  Length;
-    ULONG   Tag;
-} NON_PAGED_BUFFER_HEADER, *PNON_PAGED_BUFFER_HEADER;
-
-typedef struct _NON_PAGED_BUFFER_TRAILER {
-    ULONG   Tag;
-} NON_PAGED_BUFFER_TRAILER, *PNON_PAGED_BUFFER_TRAILER;
-
-static FORCEINLINE PVOID
-__AllocateNonPagedPoolWithTag(
-    IN  SIZE_T                  Length,
-    IN  ULONG                   Tag
-    )
-{
-    PUCHAR                      Buffer;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Length != 0);
-
-    Buffer = (PUCHAR)ExAllocatePoolWithTag(NonPagedPool,
-                                   sizeof (NON_PAGED_BUFFER_HEADER) +
-                                   Length +
-                                   sizeof (NON_PAGED_BUFFER_TRAILER),
-                                   Tag);
-    if (Buffer == NULL)
-        goto done;
-
-    RtlZeroMemory(Buffer, 
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER));
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    Header->Length = Length;
-    Header->Tag = Tag;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    Trailer->Tag = Tag;
-
-done:
-    return Buffer;
-}
-
-static FORCEINLINE VOID
-__FreePoolWithTag(
-    IN  PVOID                   _Buffer,
-    IN  ULONG                   Tag
-    )
-{
-    PUCHAR                      Buffer = (PUCHAR)_Buffer;
-    SIZE_T                      Length;
-    PNON_PAGED_BUFFER_HEADER    Header;
-    PNON_PAGED_BUFFER_TRAILER   Trailer;
-
-    ASSERT(Buffer != NULL);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Header = (PNON_PAGED_BUFFER_HEADER)Buffer;
-    ASSERT3U(Tag, ==, Header->Tag);
-    Length = Header->Length;
-
-    Buffer += sizeof (NON_PAGED_BUFFER_HEADER);
-
-    Trailer = (PNON_PAGED_BUFFER_TRAILER)(Buffer + Length);
-    ASSERT3U(Tag, ==, Trailer->Tag);
-
-    Buffer -= sizeof (NON_PAGED_BUFFER_HEADER);
-
-    RtlFillMemory(Buffer, 
-                  sizeof (NON_PAGED_BUFFER_HEADER) +
-                  Length +
-                  sizeof (NON_PAGED_BUFFER_TRAILER),
-                  0xAA);
-
-    ExFreePoolWithTag(Buffer, Tag);
-}
-
-static FORCEINLINE PMDL
-__AllocatePage(
-    VOID
-    )
-{
-    PHYSICAL_ADDRESS    LowAddress;
-    PHYSICAL_ADDRESS    HighAddress;
-    LARGE_INTEGER       SkipBytes;
-    SIZE_T              TotalBytes;
-    PMDL                Mdl;
-    PUCHAR              MdlMappedSystemVa;
-    NTSTATUS            status;
-
-    LowAddress.QuadPart = 0ull;
-    HighAddress.QuadPart = ~0ull;
-    SkipBytes.QuadPart = 0ull;
-    TotalBytes = (SIZE_T)PAGE_SIZE;
-
-    Mdl = MmAllocatePagesForMdlEx(LowAddress,
-                                  HighAddress,
-                                  SkipBytes,
-                                  TotalBytes,
-                                  MmCached,
-                                  0);
-
-    status = STATUS_NO_MEMORY;
-    if (Mdl == NULL)
-        goto fail1;
-
-    ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
-                             MDL_PARTIAL_HAS_BEEN_MAPPED |
-                             MDL_PARTIAL |
-                             MDL_PARENT_MAPPED_SYSTEM_VA |
-                             MDL_SOURCE_IS_NONPAGED_POOL |
-                             MDL_IO_SPACE)) == 0);
-
-    MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
-                                                     KernelMode,
-                                                     MmCached,
-                                                     NULL,
-                                                     FALSE,
-                                                     NormalPagePriority);
-
-    status = STATUS_UNSUCCESSFUL;
-    if (MdlMappedSystemVa == NULL)
-        goto fail2;
-
-    ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
-
-    RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
-
-    return Mdl;
-
-fail2:
-    Error("fail2\n");
-
-    MmFreePagesFromMdl(Mdl);
-    ExFreePool(Mdl);
-
-fail1:
-    Error("fail1 (%08x)\n", status);
-
-    return NULL;
-}
-
-static FORCEINLINE VOID
-__FreePage(
-    IN	PMDL	Mdl
-    )
-{
-    PUCHAR	MdlMappedSystemVa;
-
-    ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
-    MdlMappedSystemVa = Mdl->MappedSystemVa;
-
-    RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
-    
-    MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
-
-    MmFreePagesFromMdl(Mdl);
-}
-
-static FORCEINLINE PCHAR
-__strtok_r(
-    IN      PCHAR   Buffer,
-    IN      PCHAR   Delimiter,
-    IN OUT  PCHAR   *Context
-    )
-{
-    PCHAR           Token;
-    PCHAR           End;
-
-    if (Buffer != NULL)
-        *Context = Buffer;
-
-    Token = *Context;
-
-    if (Token == NULL)
-        return NULL;
-
-    while (*Token != L'\0' &&
-           strchr(Delimiter, *Token) != NULL)
-        Token++;
-
-    if (*Token == L'\0')
-        return NULL;
-
-    End = Token + 1;
-    while (*End != L'\0' &&
-           strchr(Delimiter, *End) == NULL)
-        End++;
-
-    if (*End != L'\0')
-        *End++ = L'\0';
-
-    *Context = End;
-
-    return Token;
-}
-
-#endif  // _UTIL_H
diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index 6eea3ab..b23832d 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -187,7 +187,7 @@ __FdoAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, FDO_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, FDO_POOL);
 }
 
 static FORCEINLINE VOID
@@ -591,7 +591,7 @@ __FdoMultiSzToUpcaseAnsi(
             if (Buffer[Index] == '\0')
                 break;
         } else {
-            Buffer[Index] = (CHAR)toupper(Buffer[Index]);
+            Buffer[Index] = __toupper(Buffer[Index]);
             Index++;
         }
     }
diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index 519d3f6..136502c 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -30,9 +30,9 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 
 #include "registry.h"
+#include "util.h"
 #include "assert.h"
 
 #define REGISTRY_POOL 'GERX'
@@ -44,7 +44,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xeniface/thread.c b/src/xeniface/thread.c
index f008834..386bba7 100644
--- a/src/xeniface/thread.c
+++ b/src/xeniface/thread.c
@@ -30,9 +30,9 @@
  */
 
 #include <ntddk.h>
-#include <util.h>
 
 #include "thread.h"
+#include "util.h"
 #include "log.h"
 #include "assert.h"
 
@@ -52,7 +52,7 @@ __ThreadAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocateNonPagedPoolWithTag(Length, THREAD_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, THREAD_POOL);
 }
 
 static FORCEINLINE VOID
diff --git a/src/xeniface/util.h b/src/xeniface/util.h
new file mode 100644
index 0000000..13a6734
--- /dev/null
+++ b/src/xeniface/util.h
@@ -0,0 +1,312 @@
+/* Copyright (c) Citrix Systems Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms,
+ * with or without modification, are permitted provided
+ * that the following conditions are met:
+ *
+ * *   Redistributions of source code must retain the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer.
+ * *   Redistributions in binary form must reproduce the above
+ *     copyright notice, this list of conditions and the
+ *     following disclaimer in the documentation and/or other
+ *     materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
+ * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _XENIFACE_UTIL_H
+#define _XENIFACE_UTIL_H
+
+#include <ntddk.h>
+
+#include "assert.h"
+
+#define	P2ROUNDUP(_x, _a)   \
+        (-(-(_x) & -(_a)))
+
+static FORCEINLINE LONG
+__ffs(
+    IN  unsigned long long  mask
+    )
+{
+    unsigned char           *array = (unsigned char *)&mask;
+    unsigned int            byte;
+    unsigned int            bit;
+    unsigned char           val;
+
+    val = 0;
+
+    byte = 0;
+    while (byte < 8) {
+        val = array[byte];
+
+        if (val != 0)
+            break;
+
+        byte++;
+    }
+    if (byte == 8)
+        return -1;
+
+    bit = 0;
+    while (bit < 8) {
+        if (val & 0x01)
+            break;
+
+        val >>= 1;
+        bit++;
+    }
+
+    return (byte * 8) + bit;
+}
+
+#define __ffu(_mask)  \
+        __ffs(~(_mask))
+
+static FORCEINLINE VOID
+__CpuId(
+    IN  ULONG   Leaf,
+    OUT PULONG  EAX OPTIONAL,
+    OUT PULONG  EBX OPTIONAL,
+    OUT PULONG  ECX OPTIONAL,
+    OUT PULONG  EDX OPTIONAL
+    )
+{
+    ULONG       Value[4] = {0};
+
+    __cpuid(Value, Leaf);
+
+    if (EAX)
+        *EAX = Value[0];
+
+    if (EBX)
+        *EBX = Value[1];
+
+    if (ECX)
+        *ECX = Value[2];
+
+    if (EDX)
+        *EDX = Value[3];
+}
+
+static FORCEINLINE LONG
+__InterlockedAdd(
+    IN  LONG    *Value,
+    IN  LONG    Delta
+    )
+{
+    LONG        New;
+    LONG        Old;
+
+    do {
+        Old = *Value;
+        New = Old + Delta;
+    } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+    return New;
+}
+
+static FORCEINLINE LONG
+__InterlockedSubtract(
+    IN  LONG    *Value,
+    IN  LONG    Delta
+    )
+{
+    LONG        New;
+    LONG        Old;
+
+    do {
+        Old = *Value;
+        New = Old - Delta;
+    } while (InterlockedCompareExchange(Value, New, Old) != Old);
+
+    return New;
+}
+
+static FORCEINLINE PVOID
+__AllocatePoolWithTag(
+    IN  POOL_TYPE   PoolType,
+    IN  SIZE_T      NumberOfBytes,
+    IN  ULONG       Tag
+    )
+{
+    PUCHAR          Buffer;
+
+    __analysis_assume(PoolType == NonPagedPool ||
+                      PoolType == PagedPool);
+
+    Buffer = ExAllocatePoolWithTag(PoolType, NumberOfBytes, Tag);
+    if (Buffer == NULL)
+        return NULL;
+
+    RtlZeroMemory(Buffer, NumberOfBytes);
+    return Buffer;
+}
+
+static FORCEINLINE VOID
+__FreePoolWithTag(
+    IN  PVOID   Buffer,
+    IN  ULONG   Tag
+    )
+{
+    ExFreePoolWithTag(Buffer, Tag);
+}
+
+static FORCEINLINE PMDL
+__AllocatePage(
+    VOID
+    )
+{
+    PHYSICAL_ADDRESS    LowAddress;
+    PHYSICAL_ADDRESS    HighAddress;
+    LARGE_INTEGER       SkipBytes;
+    SIZE_T              TotalBytes;
+    PMDL                Mdl;
+    PUCHAR              MdlMappedSystemVa;
+    NTSTATUS            status;
+
+    LowAddress.QuadPart = 0ull;
+    HighAddress.QuadPart = ~0ull;
+    SkipBytes.QuadPart = 0ull;
+    TotalBytes = (SIZE_T)PAGE_SIZE;
+
+    Mdl = MmAllocatePagesForMdlEx(LowAddress,
+                                  HighAddress,
+                                  SkipBytes,
+                                  TotalBytes,
+                                  MmCached,
+                                  0);
+
+    status = STATUS_NO_MEMORY;
+    if (Mdl == NULL)
+        goto fail1;
+
+    ASSERT((Mdl->MdlFlags & (MDL_MAPPED_TO_SYSTEM_VA |
+                             MDL_PARTIAL_HAS_BEEN_MAPPED |
+                             MDL_PARTIAL |
+                             MDL_PARENT_MAPPED_SYSTEM_VA |
+                             MDL_SOURCE_IS_NONPAGED_POOL |
+                             MDL_IO_SPACE)) == 0);
+
+    MdlMappedSystemVa = MmMapLockedPagesSpecifyCache(Mdl,
+                                                     KernelMode,
+						                             MmCached,
+						                             NULL,
+						                             FALSE,
+						                             NormalPagePriority);
+
+    status = STATUS_UNSUCCESSFUL;
+    if (MdlMappedSystemVa == NULL)
+        goto fail2;
+
+    ASSERT3P(MdlMappedSystemVa, ==, Mdl->MappedSystemVa);
+
+    RtlZeroMemory(MdlMappedSystemVa, PAGE_SIZE);
+
+    return Mdl;
+
+fail2:
+    Error("fail2\n");
+
+    MmFreePagesFromMdl(Mdl);
+    ExFreePool(Mdl);
+
+fail1:
+    Error("fail1 (%08x)\n", status);
+
+    return NULL;
+}
+
+static FORCEINLINE VOID
+__FreePage(
+    IN	PMDL	Mdl
+    )
+{
+    PUCHAR	MdlMappedSystemVa;
+
+    ASSERT(Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
+    MdlMappedSystemVa = Mdl->MappedSystemVa;
+
+    RtlFillMemory(MdlMappedSystemVa, PAGE_SIZE, 0xAA);
+
+    MmUnmapLockedPages(MdlMappedSystemVa, Mdl);
+
+    MmFreePagesFromMdl(Mdl);
+}
+
+static FORCEINLINE PCHAR
+__strtok_r(
+    IN      PCHAR   Buffer,
+    IN      PCHAR   Delimiter,
+    IN OUT  PCHAR   *Context
+    )
+{
+    PCHAR           Token;
+    PCHAR           End;
+
+    if (Buffer != NULL)
+        *Context = Buffer;
+
+    Token = *Context;
+
+    if (Token == NULL)
+        return NULL;
+
+    while (*Token != L'\0' &&
+           strchr(Delimiter, *Token) != NULL)
+        Token++;
+
+    if (*Token == L'\0')
+        return NULL;
+
+    End = Token + 1;
+    while (*End != L'\0' &&
+           strchr(Delimiter, *End) == NULL)
+        End++;
+
+    if (*End != L'\0')
+        *End++ = L'\0';
+
+    *Context = End;
+
+    return Token;
+}
+
+static FORCEINLINE CHAR
+__toupper(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'a' || Character > 'z')
+        return Character;
+
+    return 'A' + Character - 'a';
+}
+
+static FORCEINLINE CHAR
+__tolower(
+    IN  CHAR    Character
+    )
+{
+    if (Character < 'A' || Character > 'Z')
+        return Character;
+
+    return 'a' + Character - 'A';
+}
+
+#endif  // _XENIFACE_UTIL_H
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:55:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:55:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zol-0002O3-5n; Thu, 10 Dec 2015 11:55:27 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zok-0002Ny-CP
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:55:26 +0000
Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id
	B4/85-19110-D2869665; Thu, 10 Dec 2015 11:55:25 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1449748524!6361661!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 46938 invoked from network); 10 Dec 2015 11:55:24 -0000
Received: from mail-wm0-f53.google.com (HELO mail-wm0-f53.google.com)
	(74.125.82.53)
	by server-8.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:55:24 -0000
Received: by mail-wm0-f53.google.com with SMTP id c201so29180031wme.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:55:24 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=xAlKZHaE16iaC68+nnAvXX/zPo9iK2dafDQwnehVoaw=;
	b=uuaqkWLRrjEQJnIoncaAzs4GTMpGkBHqR9rY5svK3uRFdCJZM03rhmPQ8t+LLsQS5R
	0ivaxSlIcNfkX2ZfGxIqtiiBF8ec/jugiuezOWBvQ8FJPs3V1h3WQKRX9V/qM78UvdH7
	MISogA/8NPefNARqTFHF56A2BHWci1aHDkf72PuV4vO0DxImvJOvq3Kvy9I9iAWewJYS
	gJ4YiBr5k28MF2byoWgYO0WUa43j3jG2njDdCu2evyME/bezqN0WeRYwQfHEYMbSGaoM
	667D48BFs/h3oGzEFONz91GNl1qbJe9w4UErCuyIgyN4Yje3Ay1kQrBArV+zAXJr6I6X
	+Z4A==
X-Received: by 10.28.175.135 with SMTP id y129mr18376168wme.24.1449748524096; 
	Thu, 10 Dec 2015 03:55:24 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	hp9sm12086151wjb.43.2015.12.10.03.55.23
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:55:23 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:55:15 +0000
Message-Id: <1449748515-12144-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Re-synchronize registry.c with XENBUS
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The registry code in XENBUS has some fixes that are not present in the
XENIFACE copy, so import the updated code from XENBUS.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xeniface/registry.c | 263 ++++++++++++++++++++++++++++++++++++++++++------
 src/xeniface/registry.h |  41 +++++++-
 2 files changed, 268 insertions(+), 36 deletions(-)

diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index 136502c..d994e13 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -32,10 +32,10 @@
 #include <ntddk.h>
 
 #include "registry.h"
-#include "util.h"
 #include "assert.h"
+#include "util.h"
 
-#define REGISTRY_POOL 'GERX'
+#define REGISTRY_TAG 'GERX'
 
 static UNICODE_STRING   RegistryPath;
 
@@ -44,7 +44,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
 }
 
 static FORCEINLINE VOID
@@ -52,7 +52,7 @@ __RegistryFree(
     IN  PVOID   Buffer
     )
 {
-    __FreePoolWithTag(Buffer, REGISTRY_POOL);
+    __FreePoolWithTag(Buffer, REGISTRY_TAG);
 }
 
 NTSTATUS
@@ -116,6 +116,40 @@ fail1:
 }
 
 NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    )
+{
+    OBJECT_ATTRIBUTES   Attributes;
+    NTSTATUS            status;
+
+    InitializeObjectAttributes(&Attributes,
+                               Path,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               Parent,
+                               NULL);
+
+    status = ZwCreateKey(Key,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         Options,
+                         NULL
+                         );
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
     OUT PHANDLE         Key
@@ -125,6 +159,14 @@ RegistryOpenServiceKey(
 }
 
 NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE         Key
+    )
+{
+    return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, Key);
+}
+
+NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -330,6 +372,8 @@ RegistryDeleteSubKey(
 
     ZwClose(SubKey);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -347,7 +391,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
-    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID               Context
     )
 {
@@ -390,6 +434,7 @@ RegistryEnumerateSubKeys(
         goto fail4;
 
     for (Index = 0; Index < Full->SubKeys; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -398,7 +443,7 @@ RegistryEnumerateSubKeys(
                                 KeyBasicInformation,
                                 Basic,
                                 Size,
-                                &Size);
+                                &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -418,7 +463,7 @@ RegistryEnumerateSubKeys(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi);
 
         __RegistryFree(Ansi.Buffer);
         Ansi.Buffer = NULL;
@@ -450,7 +495,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
-    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID                       Context
     )
 {
@@ -493,6 +538,7 @@ RegistryEnumerateValues(
         goto fail4;
 
     for (Index = 0; Index < Full->Values; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -501,7 +547,7 @@ RegistryEnumerateValues(
                                      KeyValueBasicInformation,
                                      Basic,
                                      Size,
-                                     &Size);
+                                     &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -517,7 +563,7 @@ RegistryEnumerateValues(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi, Basic->Type);
 
         __RegistryFree(Ansi.Buffer);
 
@@ -566,6 +612,8 @@ RegistryDeleteValue(
 
     RtlFreeUnicodeString(&Unicode);
 
+    (VOID) ZwFlushKey(Key);
+
     return STATUS_SUCCESS;
 
 fail2:
@@ -686,6 +734,8 @@ RegistryUpdateDwordValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -806,6 +856,7 @@ NTSTATUS
 RegistryQuerySzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
+    OUT PULONG                      Type OPTIONAL,
     OUT PANSI_STRING                *Array
     )
 {
@@ -867,6 +918,9 @@ RegistryQuerySzValue(
     if (*Array == NULL)
         goto fail5;
 
+    if (Type != NULL)
+        *Type = Value->Type;
+
     __RegistryFree(Value);
 
     RtlFreeUnicodeString(&Unicode);
@@ -886,6 +940,150 @@ fail1:
 }
 
 NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    OUT PVOID                       *Buffer,
+    OUT PULONG                      Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ULONG                           Size;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             NULL,
+                             0,
+                             &Size);
+    if (status != STATUS_BUFFER_OVERFLOW &&
+        status != STATUS_BUFFER_TOO_SMALL)
+        goto fail2;
+
+#pragma prefast(suppress:6102)
+    Partial = __RegistryAllocate(Size);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail3;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             Partial,
+                             Size,
+                             &Size);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    switch (Partial->Type) {
+    case REG_BINARY:
+        *Buffer = __RegistryAllocate(Partial->DataLength);
+
+        status = STATUS_NO_MEMORY;
+        if (*Buffer == NULL)
+            break;
+
+        *Length = Partial->DataLength;
+        RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
+        break;
+
+    default:
+        status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
+        break;
+    }
+
+    if (*Buffer == NULL)
+        goto fail5;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail5:
+fail4:
+    __RegistryFree(Partial);
+
+fail3:
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    IN  PVOID                       Buffer,
+    IN  ULONG                       Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
+                                 Length);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail2;
+
+    Partial->TitleIndex = 0;
+    Partial->Type = REG_BINARY;
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    status = ZwSetValueKey(Key,
+                           &Unicode,
+                           Partial->TitleIndex,
+                           Partial->Type,
+                           Partial->Data,
+                           Partial->DataLength);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __RegistryFree(Partial);
+
+    (VOID) ZwFlushKey(Key);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    __RegistryFree(Partial);
+
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+    return status;
+}
+
+NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -960,7 +1158,7 @@ RegistryQuerySystemStartOption(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = RegistryQuerySzValue(Key, "SystemStartOptions", &Ansi);
+    status = RegistryQuerySzValue(Key, "SystemStartOptions", NULL, &Ansi);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -969,13 +1167,13 @@ RegistryQuerySystemStartOption(
     Length = (ULONG)strlen(Prefix);
 
     Option = __strtok_r(Ansi[0].Buffer, " ", &Context);
-    if (strncmp(Prefix, Option, Length) == 0)
-        goto found;
-
-    while ((Option = __strtok_r(NULL, " ", &Context)) != NULL)
+    while (Option != NULL) {
         if (strncmp(Prefix, Option, Length) == 0)
             goto found;
 
+        Option = __strtok_r(NULL, " ", &Context);
+    }
+
     status = STATUS_OBJECT_NAME_NOT_FOUND;
     goto fail3;
 
@@ -1115,12 +1313,11 @@ RegistryUpdateSzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
     IN  ULONG                       Type,
-    ...
+    IN  PANSI_STRING                Array
     )
 {
     ANSI_STRING                     Ansi;
     UNICODE_STRING                  Unicode;
-    va_list                         Arguments;
     PKEY_VALUE_PARTIAL_INFORMATION  Partial;
     NTSTATUS                        status;
 
@@ -1129,33 +1326,23 @@ RegistryUpdateSzValue(
     status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
     if (!NT_SUCCESS(status))
         goto fail1;
-        
-    va_start(Arguments, Type);
-    switch (Type) {
-    case REG_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    switch (Type) {
+    case REG_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToSz(Argument);        
+        Partial = RegistryAnsiToSz(Array);
         break;
-    }
-    case REG_MULTI_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    case REG_MULTI_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToMultiSz(Argument);        
+        Partial = RegistryAnsiToMultiSz(Array);
         break;
-    }
+
     default:
         status = STATUS_INVALID_PARAMETER;
         Partial = NULL;
         break;
     }
-    va_end(Arguments);
 
     if (Partial == NULL)
         goto fail2;
@@ -1171,6 +1358,8 @@ RegistryUpdateSzValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -1202,6 +1391,14 @@ RegistryFreeSzValue(
 }
 
 VOID
+RegistryFreeBinaryValue(
+    IN  PVOID   Buffer
+    )
+{
+    __RegistryFree(Buffer);
+}
+
+VOID
 RegistryCloseKey(
     IN  HANDLE  Key
     )
diff --git a/src/xeniface/registry.h b/src/xeniface/registry.h
index 7a89804..92aa7b6 100644
--- a/src/xeniface/registry.h
+++ b/src/xeniface/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
     );
 
 extern NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    );
+
+extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
 extern NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE     Key
+    );
+
+extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -97,14 +110,14 @@ RegistryDeleteSubKey(
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID       Context
     );
 
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID       Context
     );
 
@@ -132,10 +145,27 @@ extern NTSTATUS
 RegistryQuerySzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
+    OUT PULONG          Type OPTIONAL,
     OUT PANSI_STRING    *Array
     );
 
 extern NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    OUT PVOID           *Buffer,
+    OUT PULONG          Length
+    );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    IN  PVOID           Buffer,
+    IN  ULONG           Length
+    );
+
+extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -152,12 +182,17 @@ RegistryFreeSzValue(
     IN  PANSI_STRING    Array
     );
 
+extern VOID
+RegistryFreeBinaryValue(
+    IN  PVOID           Buffer
+    );
+
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
     IN  ULONG           Type,
-    ...
+    IN  PANSI_STRING    Array
     );
 
 extern VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 11:55:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 11:55:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a6zol-0002O3-5n; Thu, 10 Dec 2015 11:55:27 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a6zok-0002Ny-CP
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 11:55:26 +0000
Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id
	B4/85-19110-D2869665; Thu, 10 Dec 2015 11:55:25 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1449748524!6361661!1
X-Originating-IP: [74.125.82.53]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 46938 invoked from network); 10 Dec 2015 11:55:24 -0000
Received: from mail-wm0-f53.google.com (HELO mail-wm0-f53.google.com)
	(74.125.82.53)
	by server-8.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 11:55:24 -0000
Received: by mail-wm0-f53.google.com with SMTP id c201so29180031wme.0
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 03:55:24 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=xAlKZHaE16iaC68+nnAvXX/zPo9iK2dafDQwnehVoaw=;
	b=uuaqkWLRrjEQJnIoncaAzs4GTMpGkBHqR9rY5svK3uRFdCJZM03rhmPQ8t+LLsQS5R
	0ivaxSlIcNfkX2ZfGxIqtiiBF8ec/jugiuezOWBvQ8FJPs3V1h3WQKRX9V/qM78UvdH7
	MISogA/8NPefNARqTFHF56A2BHWci1aHDkf72PuV4vO0DxImvJOvq3Kvy9I9iAWewJYS
	gJ4YiBr5k28MF2byoWgYO0WUa43j3jG2njDdCu2evyME/bezqN0WeRYwQfHEYMbSGaoM
	667D48BFs/h3oGzEFONz91GNl1qbJe9w4UErCuyIgyN4Yje3Ay1kQrBArV+zAXJr6I6X
	+Z4A==
X-Received: by 10.28.175.135 with SMTP id y129mr18376168wme.24.1449748524096; 
	Thu, 10 Dec 2015 03:55:24 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	hp9sm12086151wjb.43.2015.12.10.03.55.23
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 03:55:23 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 11:55:15 +0000
Message-Id: <1449748515-12144-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>
Subject: [win-pv-devel] [PATCH] Re-synchronize registry.c with XENBUS
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The registry code in XENBUS has some fixes that are not present in the
XENIFACE copy, so import the updated code from XENBUS.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
---
 src/xeniface/registry.c | 263 ++++++++++++++++++++++++++++++++++++++++++------
 src/xeniface/registry.h |  41 +++++++-
 2 files changed, 268 insertions(+), 36 deletions(-)

diff --git a/src/xeniface/registry.c b/src/xeniface/registry.c
index 136502c..d994e13 100644
--- a/src/xeniface/registry.c
+++ b/src/xeniface/registry.c
@@ -32,10 +32,10 @@
 #include <ntddk.h>
 
 #include "registry.h"
-#include "util.h"
 #include "assert.h"
+#include "util.h"
 
-#define REGISTRY_POOL 'GERX'
+#define REGISTRY_TAG 'GERX'
 
 static UNICODE_STRING   RegistryPath;
 
@@ -44,7 +44,7 @@ __RegistryAllocate(
     IN  ULONG   Length
     )
 {
-    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_POOL);
+    return __AllocatePoolWithTag(NonPagedPool, Length, REGISTRY_TAG);
 }
 
 static FORCEINLINE VOID
@@ -52,7 +52,7 @@ __RegistryFree(
     IN  PVOID   Buffer
     )
 {
-    __FreePoolWithTag(Buffer, REGISTRY_POOL);
+    __FreePoolWithTag(Buffer, REGISTRY_TAG);
 }
 
 NTSTATUS
@@ -116,6 +116,40 @@ fail1:
 }
 
 NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    )
+{
+    OBJECT_ATTRIBUTES   Attributes;
+    NTSTATUS            status;
+
+    InitializeObjectAttributes(&Attributes,
+                               Path,
+                               OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,
+                               Parent,
+                               NULL);
+
+    status = ZwCreateKey(Key,
+                         KEY_ALL_ACCESS,
+                         &Attributes,
+                         0,
+                         NULL,
+                         Options,
+                         NULL
+                         );
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    return STATUS_SUCCESS;
+
+fail1:
+    return status;
+}
+
+NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK     DesiredAccess,
     OUT PHANDLE         Key
@@ -125,6 +159,14 @@ RegistryOpenServiceKey(
 }
 
 NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE         Key
+    )
+{
+    return RegistryCreateKey(NULL, &RegistryPath, REG_OPTION_NON_VOLATILE, Key);
+}
+
+NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -330,6 +372,8 @@ RegistryDeleteSubKey(
 
     ZwClose(SubKey);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -347,7 +391,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE              Key,
-    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS            (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID               Context
     )
 {
@@ -390,6 +434,7 @@ RegistryEnumerateSubKeys(
         goto fail4;
 
     for (Index = 0; Index < Full->SubKeys; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -398,7 +443,7 @@ RegistryEnumerateSubKeys(
                                 KeyBasicInformation,
                                 Basic,
                                 Size,
-                                &Size);
+                                &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -418,7 +463,7 @@ RegistryEnumerateSubKeys(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi);
 
         __RegistryFree(Ansi.Buffer);
         Ansi.Buffer = NULL;
@@ -450,7 +495,7 @@ fail1:
 NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE                      Key,
-    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS                    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID                       Context
     )
 {
@@ -493,6 +538,7 @@ RegistryEnumerateValues(
         goto fail4;
 
     for (Index = 0; Index < Full->Values; Index++) {
+        ULONG           Ignore;
         UNICODE_STRING  Unicode;
         ANSI_STRING     Ansi;
 
@@ -501,7 +547,7 @@ RegistryEnumerateValues(
                                      KeyValueBasicInformation,
                                      Basic,
                                      Size,
-                                     &Size);
+                                     &Ignore);
         if (!NT_SUCCESS(status))
             goto fail5;
 
@@ -517,7 +563,7 @@ RegistryEnumerateValues(
 
         Ansi.Length = (USHORT)(strlen(Ansi.Buffer) * sizeof (CHAR));        
 
-        status = Callback(Context, Key, Ansi.Buffer);
+        status = Callback(Context, Key, &Ansi, Basic->Type);
 
         __RegistryFree(Ansi.Buffer);
 
@@ -566,6 +612,8 @@ RegistryDeleteValue(
 
     RtlFreeUnicodeString(&Unicode);
 
+    (VOID) ZwFlushKey(Key);
+
     return STATUS_SUCCESS;
 
 fail2:
@@ -686,6 +734,8 @@ RegistryUpdateDwordValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -806,6 +856,7 @@ NTSTATUS
 RegistryQuerySzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
+    OUT PULONG                      Type OPTIONAL,
     OUT PANSI_STRING                *Array
     )
 {
@@ -867,6 +918,9 @@ RegistryQuerySzValue(
     if (*Array == NULL)
         goto fail5;
 
+    if (Type != NULL)
+        *Type = Value->Type;
+
     __RegistryFree(Value);
 
     RtlFreeUnicodeString(&Unicode);
@@ -886,6 +940,150 @@ fail1:
 }
 
 NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    OUT PVOID                       *Buffer,
+    OUT PULONG                      Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    ULONG                           Size;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             NULL,
+                             0,
+                             &Size);
+    if (status != STATUS_BUFFER_OVERFLOW &&
+        status != STATUS_BUFFER_TOO_SMALL)
+        goto fail2;
+
+#pragma prefast(suppress:6102)
+    Partial = __RegistryAllocate(Size);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail3;
+
+    status = ZwQueryValueKey(Key,
+                             &Unicode,
+                             KeyValuePartialInformation,
+                             Partial,
+                             Size,
+                             &Size);
+    if (!NT_SUCCESS(status))
+        goto fail4;
+
+    switch (Partial->Type) {
+    case REG_BINARY:
+        *Buffer = __RegistryAllocate(Partial->DataLength);
+
+        status = STATUS_NO_MEMORY;
+        if (*Buffer == NULL)
+            break;
+
+        *Length = Partial->DataLength;
+        RtlCopyMemory(*Buffer, Partial->Data, Partial->DataLength);
+        break;
+
+    default:
+        status = STATUS_INVALID_PARAMETER;
+        *Buffer = NULL;
+        break;
+    }
+
+    if (*Buffer == NULL)
+        goto fail5;
+
+    __RegistryFree(Partial);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail5:
+fail4:
+    __RegistryFree(Partial);
+
+fail3:
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+    return status;
+}
+
+NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE                      Key,
+    IN  PCHAR                       Name,
+    IN  PVOID                       Buffer,
+    IN  ULONG                       Length
+    )
+{
+    ANSI_STRING                     Ansi;
+    UNICODE_STRING                  Unicode;
+    PKEY_VALUE_PARTIAL_INFORMATION  Partial;
+    NTSTATUS                        status;
+
+    RtlInitAnsiString(&Ansi, Name);
+
+    status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
+    if (!NT_SUCCESS(status))
+        goto fail1;
+
+    Partial = __RegistryAllocate(FIELD_OFFSET(KEY_VALUE_PARTIAL_INFORMATION, Data) +
+                                 Length);
+
+    status = STATUS_NO_MEMORY;
+    if (Partial == NULL)
+        goto fail2;
+
+    Partial->TitleIndex = 0;
+    Partial->Type = REG_BINARY;
+    Partial->DataLength = Length;
+    RtlCopyMemory(Partial->Data, Buffer, Partial->DataLength);
+
+    status = ZwSetValueKey(Key,
+                           &Unicode,
+                           Partial->TitleIndex,
+                           Partial->Type,
+                           Partial->Data,
+                           Partial->DataLength);
+    if (!NT_SUCCESS(status))
+        goto fail3;
+
+    __RegistryFree(Partial);
+
+    (VOID) ZwFlushKey(Key);
+
+    RtlFreeUnicodeString(&Unicode);
+
+    return STATUS_SUCCESS;
+
+fail3:
+    __RegistryFree(Partial);
+
+fail2:
+    RtlFreeUnicodeString(&Unicode);
+
+fail1:
+
+    return status;
+}
+
+NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -960,7 +1158,7 @@ RegistryQuerySystemStartOption(
     if (!NT_SUCCESS(status))
         goto fail1;
 
-    status = RegistryQuerySzValue(Key, "SystemStartOptions", &Ansi);
+    status = RegistryQuerySzValue(Key, "SystemStartOptions", NULL, &Ansi);
     if (!NT_SUCCESS(status))
         goto fail2;
 
@@ -969,13 +1167,13 @@ RegistryQuerySystemStartOption(
     Length = (ULONG)strlen(Prefix);
 
     Option = __strtok_r(Ansi[0].Buffer, " ", &Context);
-    if (strncmp(Prefix, Option, Length) == 0)
-        goto found;
-
-    while ((Option = __strtok_r(NULL, " ", &Context)) != NULL)
+    while (Option != NULL) {
         if (strncmp(Prefix, Option, Length) == 0)
             goto found;
 
+        Option = __strtok_r(NULL, " ", &Context);
+    }
+
     status = STATUS_OBJECT_NAME_NOT_FOUND;
     goto fail3;
 
@@ -1115,12 +1313,11 @@ RegistryUpdateSzValue(
     IN  HANDLE                      Key,
     IN  PCHAR                       Name,
     IN  ULONG                       Type,
-    ...
+    IN  PANSI_STRING                Array
     )
 {
     ANSI_STRING                     Ansi;
     UNICODE_STRING                  Unicode;
-    va_list                         Arguments;
     PKEY_VALUE_PARTIAL_INFORMATION  Partial;
     NTSTATUS                        status;
 
@@ -1129,33 +1326,23 @@ RegistryUpdateSzValue(
     status = RtlAnsiStringToUnicodeString(&Unicode, &Ansi, TRUE);
     if (!NT_SUCCESS(status))
         goto fail1;
-        
-    va_start(Arguments, Type);
-    switch (Type) {
-    case REG_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    switch (Type) {
+    case REG_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToSz(Argument);        
+        Partial = RegistryAnsiToSz(Array);
         break;
-    }
-    case REG_MULTI_SZ: {
-        PANSI_STRING    Argument;
-
-        Argument = va_arg(Arguments, PANSI_STRING);
 
+    case REG_MULTI_SZ:
         status = STATUS_NO_MEMORY;
-        Partial = RegistryAnsiToMultiSz(Argument);        
+        Partial = RegistryAnsiToMultiSz(Array);
         break;
-    }
+
     default:
         status = STATUS_INVALID_PARAMETER;
         Partial = NULL;
         break;
     }
-    va_end(Arguments);
 
     if (Partial == NULL)
         goto fail2;
@@ -1171,6 +1358,8 @@ RegistryUpdateSzValue(
 
     __RegistryFree(Partial);
 
+    (VOID) ZwFlushKey(Key);
+
     RtlFreeUnicodeString(&Unicode);
 
     return STATUS_SUCCESS;
@@ -1202,6 +1391,14 @@ RegistryFreeSzValue(
 }
 
 VOID
+RegistryFreeBinaryValue(
+    IN  PVOID   Buffer
+    )
+{
+    __RegistryFree(Buffer);
+}
+
+VOID
 RegistryCloseKey(
     IN  HANDLE  Key
     )
diff --git a/src/xeniface/registry.h b/src/xeniface/registry.h
index 7a89804..92aa7b6 100644
--- a/src/xeniface/registry.h
+++ b/src/xeniface/registry.h
@@ -53,12 +53,25 @@ RegistryOpenKey(
     );
 
 extern NTSTATUS
+RegistryCreateKey(
+    IN  HANDLE          Parent,
+    IN  PUNICODE_STRING Path,
+    IN  ULONG           Options,
+    OUT PHANDLE         Key
+    );
+
+extern NTSTATUS
 RegistryOpenServiceKey(
     IN  ACCESS_MASK DesiredAccess,
     OUT PHANDLE     Key
     );
 
 extern NTSTATUS
+RegistryCreateServiceKey(
+    OUT PHANDLE     Key
+    );
+
+extern NTSTATUS
 RegistryOpenSoftwareKey(
     IN  PDEVICE_OBJECT  DeviceObject,
     IN  ACCESS_MASK     DesiredAccess,
@@ -97,14 +110,14 @@ RegistryDeleteSubKey(
 extern NTSTATUS
 RegistryEnumerateSubKeys(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING),
     IN  PVOID       Context
     );
 
 extern NTSTATUS
 RegistryEnumerateValues(
     IN  HANDLE      Key,
-    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PCHAR),
+    IN  NTSTATUS    (*Callback)(PVOID, HANDLE, PANSI_STRING, ULONG),
     IN  PVOID       Context
     );
 
@@ -132,10 +145,27 @@ extern NTSTATUS
 RegistryQuerySzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
+    OUT PULONG          Type OPTIONAL,
     OUT PANSI_STRING    *Array
     );
 
 extern NTSTATUS
+RegistryQueryBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    OUT PVOID           *Buffer,
+    OUT PULONG          Length
+    );
+
+extern NTSTATUS
+RegistryUpdateBinaryValue(
+    IN  HANDLE          Key,
+    IN  PCHAR           Name,
+    IN  PVOID           Buffer,
+    IN  ULONG           Length
+    );
+
+extern NTSTATUS
 RegistryQueryKeyName(
     IN  HANDLE              Key,
     OUT PANSI_STRING        *Array
@@ -152,12 +182,17 @@ RegistryFreeSzValue(
     IN  PANSI_STRING    Array
     );
 
+extern VOID
+RegistryFreeBinaryValue(
+    IN  PVOID           Buffer
+    );
+
 extern NTSTATUS
 RegistryUpdateSzValue(
     IN  HANDLE          Key,
     IN  PCHAR           Name,
     IN  ULONG           Type,
-    ...
+    IN  PANSI_STRING    Array
     );
 
 extern VOID
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:27:48 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:27:48 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70K2-0005Es-VI; Thu, 10 Dec 2015 12:27:46 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=779ddce85=Paul.Durrant@citrix.com>)
	id 1a70K1-0005Em-Fh
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:27:45 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	34/CE-29649-0CF69665; Thu, 10 Dec 2015 12:27:44 +0000
X-Env-Sender: prvs=779ddce85=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1449750459!9885506!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32684 invoked from network); 10 Dec 2015 12:27:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Dec 2015 12:27:40 -0000
X-IronPort-AV: E=Sophos;i="5.20,408,1444694400"; 
   d="scan'208";a="9738535"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAGG3ZA=
Date: Thu, 10 Dec 2015 12:27:37 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
In-Reply-To: <5668352B.6080909@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MDkgRGVjZW1iZXIgMjAxNSAxNDowNg0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmlj
ZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+IA0KPiBPbiAxMi8wOS8yMDE1IDAyOjAy
IFBNLCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t
DQo+ID4+IEZyb206IFJhZmHFgiBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdz
bGFiLmNvbV0NCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxMTowOA0KPiA+PiBUbzogUGF1
bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4gU3ViamVj
dDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5n
DQo+ID4+DQo+ID4+IE9uIDIwMTUtMTItMDkgMTE6NDQsIFBhdWwgRHVycmFudCB3cm90ZToNCj4g
Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+IEZyb206IHdpbi1wdi1kZXZl
bC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LQ0KPiBkZXZlbC0N
Cj4gPj4+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwg
V29qZHlsYQ0KPiA+Pj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkNCj4gPj4+PiBUbzog
d2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+Pj4gU3ViamVjdDogW3dpbi1w
di1kZXZlbF0gQWR2aWNlIG9uIGV2dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gPj4+Pg0KPiA+
Pj4+IEhpLA0KPiA+Pj4+DQo+ID4+Pj4gSSBmb3VuZCBhbiBpc3N1ZSBpbiBteSBldnRjaG4gaGFu
ZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUgaG93DQo+ID4+Pj4gdG8gcHJvcGVy
bHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZv
ciBhDQo+ID4+Pj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBx
dWV1ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlDQo+ID4+Pj4gY2FsbGVyLXByb3ZpZGVkIGV2ZW50
KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sNCj4gPj4+PiBm
YWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50
aWFsbHkgY2F1c2luZw0KPiA+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+
ID4+Pj4NCj4gPj4+DQo+ID4+PiBIaSBSYWZhbCwNCj4gPj4+DQo+ID4+PiBUaGF0IHNob3VsZG4n
dCBiZSB0aGUgY2FzZS4gV2luZG93cyBkZS1xdWV1ZXMgYSBEUEMgYmVmb3JlIHJ1bm5pbmcNCj4g
Zm9yDQo+ID4+IHByZWNpc2VseSB0aGlzIGtpbmQgb2YgcmVhc29uLiBJLmUuIGp1c3QgYmVjYXVz
ZSB5b3VyIERQQyBpcyBydW5uaW5nLCBpdA0KPiBzaG91bGQNCj4gPj4gbm90IHN0b3AgYW5vdGhl
ciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUg
dG8NCj4gPj4gcXVldWUgZXZlbiB3aGVuIG5vIERQQyBpcyBhY3R1YWxseSBxdWV1ZWQ/IFdoYXQg
eW91IG1heSBhY3R1YWxseSBiZQ0KPiA+PiBnZXR0aW5nIGNhdWdodCBieSBpcyBldnRjaG4gYXV0
by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFibGVkIGF1dG8tDQo+IG1hc2tpbmcNCj4gPj4gdGhl
biB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlvdXIgRFBDLiAo
VGhlDQo+IHRyYW5zbWl0dGVyDQo+ID4+IGFuZCByZWNlaXZlciByaW5nIERQQ3MgaW4gWEVOVklG
IGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCj4gPj4+DQo+ID4+PiBDaGVlcnMsDQo+ID4+
Pg0KPiA+Pj4gICBQYXVsDQo+ID4+Pg0KPiA+PiBIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoNCj4g
Pj4NCj4gaHR0cDovL3hlbmJpdHMueGVuLm9yZy9naXR3ZWIvP3A9cHZkcml2ZXJzL3dpbi94ZW5p
ZmFjZS5naXQ7YT1ibG9iO2Y9c3JjL3gNCj4gPj4NCj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYzto
PTljNWFmMTllMDBhOTFhMDhmNjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9DQo+ID4+IEhFQUQj
bDY2DQo+ID4+DQo+ID4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkg
YW5kIEkgZGVmaW5pdGVseSBzZWUgaXQgZmFpbA0KPiA+PiBzb21ldGltZXMsIGV2ZW4gaWYgdGhl
IEhWTSBvbmx5IGhhcyAxIHZjcHUuIE15IERQQyB1bm1hc2tzIHRoZQ0KPiBjaGFubmVsDQo+ID4+
IGFmdGVyIHNldHRpbmcgYW4gZXZlbnQgc28gdGhpcyBzaG91bGRuJ3QgYmUgdGhlIHJlYXNvbi4N
Cj4gPj4NCj4gPg0KPiA+IFRoZSBhcnRpY2xlIGF0IGh0dHBzOi8vd3d3Lm9zcm9ubGluZS5jb20v
YXJ0aWNsZS5jZm0/YXJ0aWNsZT01MjkgaXMgd29ydGgNCj4gcmVhZGluZy4gVGhlIGNvbW1lbnQg
bGFiZWxsZWQgIkRQQyBSZWVudHJhbmN5IiBwb2ludHMgb3V0IHRoYXQgRFBDcyBhcmUNCj4gZGUt
cXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlvdSBzaG91bGQgbm90IHNl
ZSBhIHF1ZXVlaW5nDQo+IGZhaWx1cmUgdW5sZXNzIGVpdGhlciB0aGVuIHVubWFza2luZyBpcyBu
b3Qgd29ya2luZyBjb3JyZWN0bHkgb3IgdGhlcmUncyBhIGJ1Zw0KPiBpbiBXaW5kb3dzIGl0c2Vs
Zi4NCj4gDQo+IFllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3
aGV0aGVyIEknbSBtaXNzaW5nDQo+IHNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJl
aGF2aW9yIEkgc2VlLg0KDQpBY3R1YWxseSwgbG9va2luZyBtb3JlIGNsb3NlbHkgYXQgdGhlIGNv
ZGUgdG9kYXkgSSBkbyBzZWUgYSBwcm9ibGVtLi4uDQoNCllvdSBoYXZlIGEgRFBDIHBlciBDUFUg
c28sIGlmIHlvdSBoYXZlIHR3byBzZXBhcmF0ZSBldmVudCBjaGFubmVscyBib3VuZCB0byB0aGUg
c2FtZSBDUFUgeW91J3JlIGdvbm5hIGhpdCBwcm9ibGVtcy4gRS5nLiBhbiBldmVudCBjb21lcyBp
biBvbiB0aGUgZmlyc3QgY2hhbm5lbCBzbyB5b3Ugc2NoZWR1bGUgYSBEUEMgdG8gaGFuZGxlIGl0
LiBOb3csIGFuIGV2ZW50IGNvbWVzIGluIG9uIHRoZSBzZWNvbmQgY2hhbm5lbCBhbmQgeW91IGNh
bid0IHNjaGVkdWxlIHRoZSBEUEMgYmVjYXVzZSBpdOKAmXMgc3RpbGwgcXVldWVkIGZvciB0aGUg
Zmlyc3QgZXZlbnQuIFlvdSBuZWVkIGEgRFBDIHBlciBjaGFubmVsLg0KDQogIFBhdWwNCg0KPiAN
Cj4gPiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2ZW50cyBvciBpcyBpdCBv
bGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/DQo+ID4NCj4gPiAgIFBhdWwNCj4gDQo+IFdlJ3JlIHVz
aW5nIDQuNC4zIHJpZ2h0IG5vdy4NCj4gDQo+ID4NCj4gPj4+PiBBbnkgYWR2aWNlIG9uIGhvdyB0
byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPj4+PiBI
SUdIX0xFVkVMIHdoaWNoIGlzIGFuIGlzc3VlIHdoZW4gaXQgY29tZXMgdG8gc3luY2hyb25pemF0
aW9uIHdpdGgNCj4gPj4gc29tZQ0KPiA+Pj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNh
cmUgb2Ygc3VjaCAicGVuZGluZyIgZXZlbnRzLg0KPiA+Pj4+DQo+ID4+Pj4gQWxzbyBJIHdvbmRl
ciBpZiB0aGUga2VybmVsIGRpZmZlcmVudGlhdGVzIERQQ3Mgb25seSBieSB0aGVpciBLRFBDDQo+
ID4+Pj4gYWRkcmVzcywgb3IgYWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVl
dWVEcGMoKT8NCj4gPj4+Pg0KPiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRv
b2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQo+
IA0KPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KPiB3
aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0DQo+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZw0KPiBodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3Rp
bmZvL3dpbi1wdi1kZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVu
cHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9s
aXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:27:48 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:27:48 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70K2-0005Es-VI; Thu, 10 Dec 2015 12:27:46 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=779ddce85=Paul.Durrant@citrix.com>)
	id 1a70K1-0005Em-Fh
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:27:45 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	34/CE-29649-0CF69665; Thu, 10 Dec 2015 12:27:44 +0000
X-Env-Sender: prvs=779ddce85=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1449750459!9885506!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32684 invoked from network); 10 Dec 2015 12:27:40 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Dec 2015 12:27:40 -0000
X-IronPort-AV: E=Sophos;i="5.20,408,1444694400"; 
   d="scan'208";a="9738535"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAGG3ZA=
Date: Thu, 10 Dec 2015 12:27:37 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
In-Reply-To: <5668352B.6080909@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNl
c0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0NCj4gYm91bmNlc0Bs
aXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGENCj4gU2VudDog
MDkgRGVjZW1iZXIgMjAxNSAxNDowNg0KPiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxA
bGlzdHMueGVucHJvamVjdC5vcmcNCj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmlj
ZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+IA0KPiBPbiAxMi8wOS8yMDE1IDAyOjAy
IFBNLCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0t
DQo+ID4+IEZyb206IFJhZmHFgiBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdz
bGFiLmNvbV0NCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxMTowOA0KPiA+PiBUbzogUGF1
bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4gU3ViamVj
dDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5n
DQo+ID4+DQo+ID4+IE9uIDIwMTUtMTItMDkgMTE6NDQsIFBhdWwgRHVycmFudCB3cm90ZToNCj4g
Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+IEZyb206IHdpbi1wdi1kZXZl
bC1ib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnIFttYWlsdG86d2luLXB2LQ0KPiBkZXZlbC0N
Cj4gPj4+PiBib3VuY2VzQGxpc3RzLnhlbnByb2plY3Qub3JnXSBPbiBCZWhhbGYgT2YgUmFmYWwg
V29qZHlsYQ0KPiA+Pj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkNCj4gPj4+PiBUbzog
d2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+Pj4gU3ViamVjdDogW3dpbi1w
di1kZXZlbF0gQWR2aWNlIG9uIGV2dGNobiBpbnRlcnJ1cHQgaGFuZGxpbmcNCj4gPj4+Pg0KPiA+
Pj4+IEhpLA0KPiA+Pj4+DQo+ID4+Pj4gSSBmb3VuZCBhbiBpc3N1ZSBpbiBteSBldnRjaG4gaGFu
ZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUgaG93DQo+ID4+Pj4gdG8gcHJvcGVy
bHkgZml4LiBOYW1lbHksIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sgdGhhdCdzIGFzc2lnbmVkIGZv
ciBhDQo+ID4+Pj4gcGFydGljdWxhciBjaGFubmVsIGNhbiBiZSBjYWxsZWQgYmVmb3JlIGl0cyBx
dWV1ZWQgRFBDICh0aGF0IHNpZ25hbHMgdGhlDQo+ID4+Pj4gY2FsbGVyLXByb3ZpZGVkIGV2ZW50
KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1cHQgY2FsbGJhY2sNCj4gPj4+PiBm
YWlscyB0byBpbnNlcnQgdGhlIERQQyBhZ2FpbiBhbmQgYW4gZXZlbnQgaXMgbG9zdCwgcG90ZW50
aWFsbHkgY2F1c2luZw0KPiA+Pj4+IGEgdmNoYW4gImRlYWRsb2NrIiBkb3duIHRoZSB3YXkuDQo+
ID4+Pj4NCj4gPj4+DQo+ID4+PiBIaSBSYWZhbCwNCj4gPj4+DQo+ID4+PiBUaGF0IHNob3VsZG4n
dCBiZSB0aGUgY2FzZS4gV2luZG93cyBkZS1xdWV1ZXMgYSBEUEMgYmVmb3JlIHJ1bm5pbmcNCj4g
Zm9yDQo+ID4+IHByZWNpc2VseSB0aGlzIGtpbmQgb2YgcmVhc29uLiBJLmUuIGp1c3QgYmVjYXVz
ZSB5b3VyIERQQyBpcyBydW5uaW5nLCBpdA0KPiBzaG91bGQNCj4gPj4gbm90IHN0b3AgYW5vdGhl
ciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUg
dG8NCj4gPj4gcXVldWUgZXZlbiB3aGVuIG5vIERQQyBpcyBhY3R1YWxseSBxdWV1ZWQ/IFdoYXQg
eW91IG1heSBhY3R1YWxseSBiZQ0KPiA+PiBnZXR0aW5nIGNhdWdodCBieSBpcyBldnRjaG4gYXV0
by1tYXNraW5nLiBJZiB5b3UgaGF2ZSBlbmFibGVkIGF1dG8tDQo+IG1hc2tpbmcNCj4gPj4gdGhl
biB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlvdXIgRFBDLiAo
VGhlDQo+IHRyYW5zbWl0dGVyDQo+ID4+IGFuZCByZWNlaXZlciByaW5nIERQQ3MgaW4gWEVOVklG
IGFyZSBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzKS4NCj4gPj4+DQo+ID4+PiBDaGVlcnMsDQo+ID4+
Pg0KPiA+Pj4gICBQYXVsDQo+ID4+Pg0KPiA+PiBIZXJlJ3MgdGhlIHJlbGV2YW50IGJpdDoNCj4g
Pj4NCj4gaHR0cDovL3hlbmJpdHMueGVuLm9yZy9naXR3ZWIvP3A9cHZkcml2ZXJzL3dpbi94ZW5p
ZmFjZS5naXQ7YT1ibG9iO2Y9c3JjL3gNCj4gPj4NCj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYzto
PTljNWFmMTllMDBhOTFhMDhmNjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9DQo+ID4+IEhFQUQj
bDY2DQo+ID4+DQo+ID4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkg
YW5kIEkgZGVmaW5pdGVseSBzZWUgaXQgZmFpbA0KPiA+PiBzb21ldGltZXMsIGV2ZW4gaWYgdGhl
IEhWTSBvbmx5IGhhcyAxIHZjcHUuIE15IERQQyB1bm1hc2tzIHRoZQ0KPiBjaGFubmVsDQo+ID4+
IGFmdGVyIHNldHRpbmcgYW4gZXZlbnQgc28gdGhpcyBzaG91bGRuJ3QgYmUgdGhlIHJlYXNvbi4N
Cj4gPj4NCj4gPg0KPiA+IFRoZSBhcnRpY2xlIGF0IGh0dHBzOi8vd3d3Lm9zcm9ubGluZS5jb20v
YXJ0aWNsZS5jZm0/YXJ0aWNsZT01MjkgaXMgd29ydGgNCj4gcmVhZGluZy4gVGhlIGNvbW1lbnQg
bGFiZWxsZWQgIkRQQyBSZWVudHJhbmN5IiBwb2ludHMgb3V0IHRoYXQgRFBDcyBhcmUNCj4gZGUt
cXVldWVkIGJlZm9yZSBiZWluZyBleGVjdXRlZC4gU28gcmVhbGx5IHlvdSBzaG91bGQgbm90IHNl
ZSBhIHF1ZXVlaW5nDQo+IGZhaWx1cmUgdW5sZXNzIGVpdGhlciB0aGVuIHVubWFza2luZyBpcyBu
b3Qgd29ya2luZyBjb3JyZWN0bHkgb3IgdGhlcmUncyBhIGJ1Zw0KPiBpbiBXaW5kb3dzIGl0c2Vs
Zi4NCj4gDQo+IFllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3
aGV0aGVyIEknbSBtaXNzaW5nDQo+IHNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJl
aGF2aW9yIEkgc2VlLg0KDQpBY3R1YWxseSwgbG9va2luZyBtb3JlIGNsb3NlbHkgYXQgdGhlIGNv
ZGUgdG9kYXkgSSBkbyBzZWUgYSBwcm9ibGVtLi4uDQoNCllvdSBoYXZlIGEgRFBDIHBlciBDUFUg
c28sIGlmIHlvdSBoYXZlIHR3byBzZXBhcmF0ZSBldmVudCBjaGFubmVscyBib3VuZCB0byB0aGUg
c2FtZSBDUFUgeW91J3JlIGdvbm5hIGhpdCBwcm9ibGVtcy4gRS5nLiBhbiBldmVudCBjb21lcyBp
biBvbiB0aGUgZmlyc3QgY2hhbm5lbCBzbyB5b3Ugc2NoZWR1bGUgYSBEUEMgdG8gaGFuZGxlIGl0
LiBOb3csIGFuIGV2ZW50IGNvbWVzIGluIG9uIHRoZSBzZWNvbmQgY2hhbm5lbCBhbmQgeW91IGNh
bid0IHNjaGVkdWxlIHRoZSBEUEMgYmVjYXVzZSBpdOKAmXMgc3RpbGwgcXVldWVkIGZvciB0aGUg
Zmlyc3QgZXZlbnQuIFlvdSBuZWVkIGEgRFBDIHBlciBjaGFubmVsLg0KDQogIFBhdWwNCg0KPiAN
Cj4gPiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2ZW50cyBvciBpcyBpdCBv
bGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/DQo+ID4NCj4gPiAgIFBhdWwNCj4gDQo+IFdlJ3JlIHVz
aW5nIDQuNC4zIHJpZ2h0IG5vdy4NCj4gDQo+ID4NCj4gPj4+PiBBbnkgYWR2aWNlIG9uIGhvdyB0
byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQNCj4gPj4+PiBI
SUdIX0xFVkVMIHdoaWNoIGlzIGFuIGlzc3VlIHdoZW4gaXQgY29tZXMgdG8gc3luY2hyb25pemF0
aW9uIHdpdGgNCj4gPj4gc29tZQ0KPiA+Pj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0YWtlIGNh
cmUgb2Ygc3VjaCAicGVuZGluZyIgZXZlbnRzLg0KPiA+Pj4+DQo+ID4+Pj4gQWxzbyBJIHdvbmRl
ciBpZiB0aGUga2VybmVsIGRpZmZlcmVudGlhdGVzIERQQ3Mgb25seSBieSB0aGVpciBLRFBDDQo+
ID4+Pj4gYWRkcmVzcywgb3IgYWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0UXVl
dWVEcGMoKT8NCj4gPj4+Pg0KPiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRv
b2xzIGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQo+
IA0KPiBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXw0KPiB3
aW4tcHYtZGV2ZWwgbWFpbGluZyBsaXN0DQo+IHdpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0
Lm9yZw0KPiBodHRwOi8vbGlzdHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3Rp
bmZvL3dpbi1wdi1kZXZlbA0KX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX18Kd2luLXB2LWRldmVsIG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVu
cHJvamVjdC5vcmcKaHR0cDovL2xpc3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9s
aXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:45:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:45:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70au-0006nq-FO; Thu, 10 Dec 2015 12:45:12 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a70at-0006nl-Nx
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:45:11 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	8A/47-29649-6D379665; Thu, 10 Dec 2015 12:45:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1449751510!9885006!1
X-Originating-IP: [74.125.82.41]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 50330 invoked from network); 10 Dec 2015 12:45:10 -0000
Received: from mail-wm0-f41.google.com (HELO mail-wm0-f41.google.com)
	(74.125.82.41)
	by server-10.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 12:45:10 -0000
Received: by mail-wm0-f41.google.com with SMTP id v187so31281038wmv.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 04:45:10 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=rxiYacOoGJhW0OeBu7SazpcfCJs40bsUJENibhANss4=;
	b=wXC1OfKTIA+jWlWwV7oz6k3c9ehzTyC1P2j5phVsq9IxtVBRc6RBLZjqsIRvKIUtTb
	TN+3UsdeUwfQoSZiccM9abbxo3qjlowOuU7LQPveqvmu+rBU6e6uGEFA961qnGiFO4Qd
	EMaHX+KydmxkjihuW1/iwZ533mB4KDWUPkvlRtQwQoDLThxVtholmOICsWzfzD7kyyRh
	zoaY3s/Wjxd1Fd5SyzvvNNQJ+EuIzRg3KNDLR08htfWe5qvWn9Eleq17dT2DxUaOtDEw
	TKL74lvzVrV0PkN6o8XMN4m93E6udPV5fsoH6gVxTkln5yKLAEBmLJU+KwdFbQ0dG62F
	GB4g==
X-Received: by 10.28.228.138 with SMTP id b132mr43937830wmh.46.1449751510163; 
	Thu, 10 Dec 2015 04:45:10 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jz1sm12264121wjc.27.2015.12.10.04.45.09
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 04:45:09 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 12:45:00 +0000
Message-Id: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>,
	Rafal Wojdyla <omeg@invisiblethingslab.com>
Subject: [win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT for
	signalling to user space
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The scheme of using a DPC per CPU will not work when multiple event channels
are in use since events may be lost when channels bound to the same CPU
are simultaneously pending. The problem is avoided by simply having
separate DPCs for each channel.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/fdo.c          | 37 ++-----------------------------------
 src/xeniface/fdo.h          |  1 -
 src/xeniface/ioctl_evtchn.c | 12 +++++++++---
 src/xeniface/ioctls.h       |  1 +
 4 files changed, 12 insertions(+), 39 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b23832d..fa14b5b 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -2435,13 +2435,11 @@ FdoCreate(
     )
 {
     PDEVICE_OBJECT      FunctionDeviceObject;
-    PXENIFACE_DX          Dx;
-    PXENIFACE_FDO         Fdo;
+    PXENIFACE_DX        Dx;
+    PXENIFACE_FDO       Fdo;
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
-    ULONG               ProcessorCount;
-    ULONG               Index;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2587,25 +2585,6 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail15;
 
-    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
-
-    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
-
-    status = STATUS_NO_MEMORY;
-    if (Fdo->EvtchnDpc == NULL)
-        goto fail16;
-
-    for (Index = 0; Index < ProcessorCount; Index++) {
-        PROCESSOR_NUMBER ProcNumber;
-
-        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
-        ASSERT(NT_SUCCESS(status));
-
-        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
-        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], &ProcNumber);
-        ASSERT(NT_SUCCESS(status));
-    }
-
     Info("%p (%s)\n",
          FunctionDeviceObject,
          __FdoGetName(Fdo));
@@ -2615,11 +2594,6 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-fail16:
-    Error("fail6\n");
-
-    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
-
 fail15:
     Error("fail15\n");
 
@@ -2731,7 +2705,6 @@ FdoDestroy(
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
     PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
-    ULONG                 ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2745,12 +2718,6 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
-    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
-
-    __FdoFree(Fdo->EvtchnDpc);
-    Fdo->EvtchnDpc = NULL;
-
     RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
     ASSERT(IsListEmpty(&Fdo->IrpList));
     RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 781b1cc..6cd628c 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -89,7 +89,6 @@ typedef struct _XENIFACE_FDO {
 
     KSPIN_LOCK                      EvtchnLock;
     LIST_ENTRY                      EvtchnList;
-    PKDPC                           EvtchnDpc;
 
     KSPIN_LOCK                      GnttabCacheLock;
 
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 9c5af19..84b4871 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -47,10 +47,10 @@ EvtchnNotificationDpc(
     __in_opt  PVOID Argument2
     )
 {
-    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
+    PXENIFACE_EVTCHN_CONTEXT Context = _Context;
 
     UNREFERENCED_PARAMETER(Dpc);
-    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument1);
     UNREFERENCED_PARAMETER(Argument2);
 
     ASSERT(Context != NULL);
@@ -78,11 +78,13 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
+
     ASSERT(Context != NULL);
 
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
-    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) {
+
+    if (!KeInsertQueueDpc(&Context->Dpc, Context, NULL)) {
         XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, Cpu %lu\n",
                            Context, Context->LocalPort, Context->FileObject, ProcIndex);
     }
@@ -189,6 +191,8 @@ IoctlEvtchnBindUnbound(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
+
     status = STATUS_UNSUCCESSFUL;
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Fdo->EvtchnInterface,
@@ -280,6 +284,8 @@ IoctlEvtchnBindInterdomain(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
+
     status = STATUS_UNSUCCESSFUL;
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Fdo->EvtchnInterface,
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 225ed7f..da273ce 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -59,6 +59,7 @@ typedef struct _XENIFACE_EVTCHN_CONTEXT {
     ULONG                  LocalPort;
     PKEVENT                Event;
     PXENIFACE_FDO          Fdo;
+    KDPC                   Dpc;
     PVOID                  FileObject;
 } XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:45:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:45:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70au-0006nq-FO; Thu, 10 Dec 2015 12:45:12 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <pdurrant@gmail.com>) id 1a70at-0006nl-Nx
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:45:11 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	8A/47-29649-6D379665; Thu, 10 Dec 2015 12:45:10 +0000
X-Env-Sender: pdurrant@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1449751510!9885006!1
X-Originating-IP: [74.125.82.41]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 50330 invoked from network); 10 Dec 2015 12:45:10 -0000
Received: from mail-wm0-f41.google.com (HELO mail-wm0-f41.google.com)
	(74.125.82.41)
	by server-10.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 10 Dec 2015 12:45:10 -0000
Received: by mail-wm0-f41.google.com with SMTP id v187so31281038wmv.1
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 04:45:10 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=from:to:cc:subject:date:message-id;
	bh=rxiYacOoGJhW0OeBu7SazpcfCJs40bsUJENibhANss4=;
	b=wXC1OfKTIA+jWlWwV7oz6k3c9ehzTyC1P2j5phVsq9IxtVBRc6RBLZjqsIRvKIUtTb
	TN+3UsdeUwfQoSZiccM9abbxo3qjlowOuU7LQPveqvmu+rBU6e6uGEFA961qnGiFO4Qd
	EMaHX+KydmxkjihuW1/iwZ533mB4KDWUPkvlRtQwQoDLThxVtholmOICsWzfzD7kyyRh
	zoaY3s/Wjxd1Fd5SyzvvNNQJ+EuIzRg3KNDLR08htfWe5qvWn9Eleq17dT2DxUaOtDEw
	TKL74lvzVrV0PkN6o8XMN4m93E6udPV5fsoH6gVxTkln5yKLAEBmLJU+KwdFbQ0dG62F
	GB4g==
X-Received: by 10.28.228.138 with SMTP id b132mr43937830wmh.46.1449751510163; 
	Thu, 10 Dec 2015 04:45:10 -0800 (PST)
Received: from localhost.localdomain ([185.25.64.249])
	by smtp.gmail.com with ESMTPSA id
	jz1sm12264121wjc.27.2015.12.10.04.45.09
	(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
	Thu, 10 Dec 2015 04:45:09 -0800 (PST)
From: Paul Durrant <pdurrant@gmail.com>
X-Google-Original-From: Paul Durrant <paul.durrant@citrix.com>
To: win-pv-devel@lists.xenproject.org
Date: Thu, 10 Dec 2015 12:45:00 +0000
Message-Id: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
X-Mailer: git-send-email 2.1.1
Cc: Paul Durrant <paul.durrant@citrix.com>,
	Rafal Wojdyla <omeg@invisiblethingslab.com>
Subject: [win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT for
	signalling to user space
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
MIME-Version: 1.0
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

The scheme of using a DPC per CPU will not work when multiple event channels
are in use since events may be lost when channels bound to the same CPU
are simultaneously pending. The problem is avoided by simply having
separate DPCs for each channel.

Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
---
 src/xeniface/fdo.c          | 37 ++-----------------------------------
 src/xeniface/fdo.h          |  1 -
 src/xeniface/ioctl_evtchn.c | 12 +++++++++---
 src/xeniface/ioctls.h       |  1 +
 4 files changed, 12 insertions(+), 39 deletions(-)

diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
index b23832d..fa14b5b 100644
--- a/src/xeniface/fdo.c
+++ b/src/xeniface/fdo.c
@@ -2435,13 +2435,11 @@ FdoCreate(
     )
 {
     PDEVICE_OBJECT      FunctionDeviceObject;
-    PXENIFACE_DX          Dx;
-    PXENIFACE_FDO         Fdo;
+    PXENIFACE_DX        Dx;
+    PXENIFACE_FDO       Fdo;
     WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
     ULONG               Size;
     NTSTATUS            status;
-    ULONG               ProcessorCount;
-    ULONG               Index;
 
 #pragma prefast(suppress:28197) // Possibly leaking memory 'FunctionDeviceObject'
     status = IoCreateDevice(DriverObject,
@@ -2587,25 +2585,6 @@ FdoCreate(
     if (!NT_SUCCESS(status))
         goto fail15;
 
-    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
-
-    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
-
-    status = STATUS_NO_MEMORY;
-    if (Fdo->EvtchnDpc == NULL)
-        goto fail16;
-
-    for (Index = 0; Index < ProcessorCount; Index++) {
-        PROCESSOR_NUMBER ProcNumber;
-
-        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
-        ASSERT(NT_SUCCESS(status));
-
-        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
-        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index], &ProcNumber);
-        ASSERT(NT_SUCCESS(status));
-    }
-
     Info("%p (%s)\n",
          FunctionDeviceObject,
          __FdoGetName(Fdo));
@@ -2615,11 +2594,6 @@ FdoCreate(
 
     return STATUS_SUCCESS;
 
-fail16:
-    Error("fail6\n");
-
-    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
-
 fail15:
     Error("fail15\n");
 
@@ -2731,7 +2705,6 @@ FdoDestroy(
 {
     PXENIFACE_DX          Dx = Fdo->Dx;
     PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
-    ULONG                 ProcessorCount;
 
     ASSERT(IsListEmpty(&Dx->ListEntry));
     ASSERT3U(Fdo->References, ==, 0);
@@ -2745,12 +2718,6 @@ FdoDestroy(
 
     Dx->Fdo = NULL;
 
-    ProcessorCount = KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
-    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
-
-    __FdoFree(Fdo->EvtchnDpc);
-    Fdo->EvtchnDpc = NULL;
-
     RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
     ASSERT(IsListEmpty(&Fdo->IrpList));
     RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
index 781b1cc..6cd628c 100644
--- a/src/xeniface/fdo.h
+++ b/src/xeniface/fdo.h
@@ -89,7 +89,6 @@ typedef struct _XENIFACE_FDO {
 
     KSPIN_LOCK                      EvtchnLock;
     LIST_ENTRY                      EvtchnList;
-    PKDPC                           EvtchnDpc;
 
     KSPIN_LOCK                      GnttabCacheLock;
 
diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
index 9c5af19..84b4871 100644
--- a/src/xeniface/ioctl_evtchn.c
+++ b/src/xeniface/ioctl_evtchn.c
@@ -47,10 +47,10 @@ EvtchnNotificationDpc(
     __in_opt  PVOID Argument2
     )
 {
-    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
+    PXENIFACE_EVTCHN_CONTEXT Context = _Context;
 
     UNREFERENCED_PARAMETER(Dpc);
-    UNREFERENCED_PARAMETER(_Context);
+    UNREFERENCED_PARAMETER(Argument1);
     UNREFERENCED_PARAMETER(Argument2);
 
     ASSERT(Context != NULL);
@@ -78,11 +78,13 @@ EvtchnInterruptHandler(
     ULONG ProcIndex;
 
     UNREFERENCED_PARAMETER(Interrupt);
+
     ASSERT(Context != NULL);
 
     KeGetCurrentProcessorNumberEx(&ProcNumber);
     ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
-    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context, NULL)) {
+
+    if (!KeInsertQueueDpc(&Context->Dpc, Context, NULL)) {
         XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO %p, Cpu %lu\n",
                            Context, Context->LocalPort, Context->FileObject, ProcIndex);
     }
@@ -189,6 +191,8 @@ IoctlEvtchnBindUnbound(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
+
     status = STATUS_UNSUCCESSFUL;
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Fdo->EvtchnInterface,
@@ -280,6 +284,8 @@ IoctlEvtchnBindInterdomain(
     if (!NT_SUCCESS(status))
         goto fail3;
 
+    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
+
     status = STATUS_UNSUCCESSFUL;
     Context->Channel = XENBUS_EVTCHN(Open,
                                      &Fdo->EvtchnInterface,
diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
index 225ed7f..da273ce 100644
--- a/src/xeniface/ioctls.h
+++ b/src/xeniface/ioctls.h
@@ -59,6 +59,7 @@ typedef struct _XENIFACE_EVTCHN_CONTEXT {
     ULONG                  LocalPort;
     PKEVENT                Event;
     PXENIFACE_FDO          Fdo;
+    KDPC                   Dpc;
     PVOID                  FileObject;
 } XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
 
-- 
2.1.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:48:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:48:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70di-0006qs-SI; Thu, 10 Dec 2015 12:48:06 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=779ddce85=Paul.Durrant@citrix.com>)
	id 1a70di-0006qn-3m
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:48:06 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	B3/F6-09834-58479665; Thu, 10 Dec 2015 12:48:05 +0000
X-Env-Sender: prvs=779ddce85=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1449751684!10126045!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1890 invoked from network); 10 Dec 2015 12:48:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Dec 2015 12:48:04 -0000
X-IronPort-AV: E=Sophos;i="5.20,408,1444694400"; 
   d="scan'208";a="9739676"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <pdurrant@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT
	for	signalling to user space
Thread-Index: AQHRM0imjmjdPA5YPECgsWdSSnnSPJ7EKzyQ
Date: Thu, 10 Dec 2015 12:48:02 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF8A5@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
In-Reply-To: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT
 for	signalling to user space
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> Sent: 10 December 2015 12:45
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant; Rafal Wojdyla
> Subject: [win-pv-devel] [PATCH] Use a DPC per
> XENIFACE_EVTCHN_CONTEXT for signalling to user space
> 
> The scheme of using a DPC per CPU will not work when multiple event
> channels
> are in use since events may be lost when channels bound to the same CPU
> are simultaneously pending. The problem is avoided by simply having
> separate DPCs for each channel.
> 
> Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
> Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
> ---
>  src/xeniface/fdo.c          | 37 ++-----------------------------------
>  src/xeniface/fdo.h          |  1 -
>  src/xeniface/ioctl_evtchn.c | 12 +++++++++---
>  src/xeniface/ioctls.h       |  1 +
>  4 files changed, 12 insertions(+), 39 deletions(-)
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index b23832d..fa14b5b 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -2435,13 +2435,11 @@ FdoCreate(
>      )
>  {
>      PDEVICE_OBJECT      FunctionDeviceObject;
> -    PXENIFACE_DX          Dx;
> -    PXENIFACE_FDO         Fdo;
> +    PXENIFACE_DX        Dx;
> +    PXENIFACE_FDO       Fdo;
>      WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
>      ULONG               Size;
>      NTSTATUS            status;
> -    ULONG               ProcessorCount;
> -    ULONG               Index;
> 
>  #pragma prefast(suppress:28197) // Possibly leaking memory
> 'FunctionDeviceObject'
>      status = IoCreateDevice(DriverObject,
> @@ -2587,25 +2585,6 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail15;
> 
> -    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> -
> -    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
> -
> -    status = STATUS_NO_MEMORY;
> -    if (Fdo->EvtchnDpc == NULL)
> -        goto fail16;
> -
> -    for (Index = 0; Index < ProcessorCount; Index++) {
> -        PROCESSOR_NUMBER ProcNumber;
> -
> -        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
> -        ASSERT(NT_SUCCESS(status));
> -
> -        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
> -        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index],
> &ProcNumber);
> -        ASSERT(NT_SUCCESS(status));
> -    }
> -
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
>           __FdoGetName(Fdo));
> @@ -2615,11 +2594,6 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> -fail16:
> -    Error("fail6\n");
> -
> -    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
> -
>  fail15:
>      Error("fail15\n");
> 
> @@ -2731,7 +2705,6 @@ FdoDestroy(
>  {
>      PXENIFACE_DX          Dx = Fdo->Dx;
>      PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
> -    ULONG                 ProcessorCount;
> 
>      ASSERT(IsListEmpty(&Dx->ListEntry));
>      ASSERT3U(Fdo->References, ==, 0);
> @@ -2745,12 +2718,6 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> -    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> -    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
> -
> -    __FdoFree(Fdo->EvtchnDpc);
> -    Fdo->EvtchnDpc = NULL;
> -
>      RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
>      ASSERT(IsListEmpty(&Fdo->IrpList));
>      RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 781b1cc..6cd628c 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -89,7 +89,6 @@ typedef struct _XENIFACE_FDO {
> 
>      KSPIN_LOCK                      EvtchnLock;
>      LIST_ENTRY                      EvtchnList;
> -    PKDPC                           EvtchnDpc;
> 
>      KSPIN_LOCK                      GnttabCacheLock;
> 
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> index 9c5af19..84b4871 100644
> --- a/src/xeniface/ioctl_evtchn.c
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -47,10 +47,10 @@ EvtchnNotificationDpc(
>      __in_opt  PVOID Argument2
>      )
>  {
> -    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
> +    PXENIFACE_EVTCHN_CONTEXT Context = _Context;
> 
>      UNREFERENCED_PARAMETER(Dpc);
> -    UNREFERENCED_PARAMETER(_Context);
> +    UNREFERENCED_PARAMETER(Argument1);
>      UNREFERENCED_PARAMETER(Argument2);
> 
>      ASSERT(Context != NULL);
> @@ -78,11 +78,13 @@ EvtchnInterruptHandler(
>      ULONG ProcIndex;
> 
>      UNREFERENCED_PARAMETER(Interrupt);
> +
>      ASSERT(Context != NULL);
> 
>      KeGetCurrentProcessorNumberEx(&ProcNumber);
>      ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> -    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL)) {
> +
> +    if (!KeInsertQueueDpc(&Context->Dpc, Context, NULL)) {

Actually, I realise that arg1 can be NULL now too.

  Paul

>          XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO
> %p, Cpu %lu\n",
>                             Context, Context->LocalPort, Context->FileObject, ProcIndex);
>      }
> @@ -189,6 +191,8 @@ IoctlEvtchnBindUnbound(
>      if (!NT_SUCCESS(status))
>          goto fail3;
> 
> +    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
> +
>      status = STATUS_UNSUCCESSFUL;
>      Context->Channel = XENBUS_EVTCHN(Open,
>                                       &Fdo->EvtchnInterface,
> @@ -280,6 +284,8 @@ IoctlEvtchnBindInterdomain(
>      if (!NT_SUCCESS(status))
>          goto fail3;
> 
> +    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
> +
>      status = STATUS_UNSUCCESSFUL;
>      Context->Channel = XENBUS_EVTCHN(Open,
>                                       &Fdo->EvtchnInterface,
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 225ed7f..da273ce 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -59,6 +59,7 @@ typedef struct _XENIFACE_EVTCHN_CONTEXT {
>      ULONG                  LocalPort;
>      PKEVENT                Event;
>      PXENIFACE_FDO          Fdo;
> +    KDPC                   Dpc;
>      PVOID                  FileObject;
>  } XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
> 
> --
> 2.1.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:48:07 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:48:07 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70di-0006qs-SI; Thu, 10 Dec 2015 12:48:06 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=779ddce85=Paul.Durrant@citrix.com>)
	id 1a70di-0006qn-3m
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:48:06 +0000
Received: from [193.109.254.147] by server-12.bemta-14.messagelabs.com id
	B3/F6-09834-58479665; Thu, 10 Dec 2015 12:48:05 +0000
X-Env-Sender: prvs=779ddce85=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-27.messagelabs.com!1449751684!10126045!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 1890 invoked from network); 10 Dec 2015 12:48:04 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Dec 2015 12:48:04 -0000
X-IronPort-AV: E=Sophos;i="5.20,408,1444694400"; 
   d="scan'208";a="9739676"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Paul Durrant <pdurrant@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT
	for	signalling to user space
Thread-Index: AQHRM0imjmjdPA5YPECgsWdSSnnSPJ7EKzyQ
Date: Thu, 10 Dec 2015 12:48:02 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF8A5@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
In-Reply-To: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Use a DPC per XENIFACE_EVTCHN_CONTEXT
 for	signalling to user space
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Paul Durrant
> Sent: 10 December 2015 12:45
> To: win-pv-devel@lists.xenproject.org
> Cc: Paul Durrant; Rafal Wojdyla
> Subject: [win-pv-devel] [PATCH] Use a DPC per
> XENIFACE_EVTCHN_CONTEXT for signalling to user space
> 
> The scheme of using a DPC per CPU will not work when multiple event
> channels
> are in use since events may be lost when channels bound to the same CPU
> are simultaneously pending. The problem is avoided by simply having
> separate DPCs for each channel.
> 
> Signed-off-by: Paul Durrant <paul.durrant@citrix.com>
> Cc: Rafal Wojdyla <omeg@invisiblethingslab.com>
> ---
>  src/xeniface/fdo.c          | 37 ++-----------------------------------
>  src/xeniface/fdo.h          |  1 -
>  src/xeniface/ioctl_evtchn.c | 12 +++++++++---
>  src/xeniface/ioctls.h       |  1 +
>  4 files changed, 12 insertions(+), 39 deletions(-)
> 
> diff --git a/src/xeniface/fdo.c b/src/xeniface/fdo.c
> index b23832d..fa14b5b 100644
> --- a/src/xeniface/fdo.c
> +++ b/src/xeniface/fdo.c
> @@ -2435,13 +2435,11 @@ FdoCreate(
>      )
>  {
>      PDEVICE_OBJECT      FunctionDeviceObject;
> -    PXENIFACE_DX          Dx;
> -    PXENIFACE_FDO         Fdo;
> +    PXENIFACE_DX        Dx;
> +    PXENIFACE_FDO       Fdo;
>      WCHAR               Name[MAXNAMELEN * sizeof (WCHAR)];
>      ULONG               Size;
>      NTSTATUS            status;
> -    ULONG               ProcessorCount;
> -    ULONG               Index;
> 
>  #pragma prefast(suppress:28197) // Possibly leaking memory
> 'FunctionDeviceObject'
>      status = IoCreateDevice(DriverObject,
> @@ -2587,25 +2585,6 @@ FdoCreate(
>      if (!NT_SUCCESS(status))
>          goto fail15;
> 
> -    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> -
> -    Fdo->EvtchnDpc = __FdoAllocate(sizeof (KDPC) * ProcessorCount);
> -
> -    status = STATUS_NO_MEMORY;
> -    if (Fdo->EvtchnDpc == NULL)
> -        goto fail16;
> -
> -    for (Index = 0; Index < ProcessorCount; Index++) {
> -        PROCESSOR_NUMBER ProcNumber;
> -
> -        status = KeGetProcessorNumberFromIndex(Index, &ProcNumber);
> -        ASSERT(NT_SUCCESS(status));
> -
> -        KeInitializeDpc(&Fdo->EvtchnDpc[Index], EvtchnNotificationDpc, NULL);
> -        status = KeSetTargetProcessorDpcEx(&Fdo->EvtchnDpc[Index],
> &ProcNumber);
> -        ASSERT(NT_SUCCESS(status));
> -    }
> -
>      Info("%p (%s)\n",
>           FunctionDeviceObject,
>           __FdoGetName(Fdo));
> @@ -2615,11 +2594,6 @@ FdoCreate(
> 
>      return STATUS_SUCCESS;
> 
> -fail16:
> -    Error("fail6\n");
> -
> -    RtlZeroMemory(&Fdo->IrpQueue, sizeof (IO_CSQ));
> -
>  fail15:
>      Error("fail15\n");
> 
> @@ -2731,7 +2705,6 @@ FdoDestroy(
>  {
>      PXENIFACE_DX          Dx = Fdo->Dx;
>      PDEVICE_OBJECT        FunctionDeviceObject = Dx->DeviceObject;
> -    ULONG                 ProcessorCount;
> 
>      ASSERT(IsListEmpty(&Dx->ListEntry));
>      ASSERT3U(Fdo->References, ==, 0);
> @@ -2745,12 +2718,6 @@ FdoDestroy(
> 
>      Dx->Fdo = NULL;
> 
> -    ProcessorCount =
> KeQueryMaximumProcessorCountEx(ALL_PROCESSOR_GROUPS);
> -    RtlZeroMemory(Fdo->EvtchnDpc, sizeof (KDPC) * ProcessorCount);
> -
> -    __FdoFree(Fdo->EvtchnDpc);
> -    Fdo->EvtchnDpc = NULL;
> -
>      RtlZeroMemory(&Fdo->GnttabCacheLock, sizeof (KSPIN_LOCK));
>      ASSERT(IsListEmpty(&Fdo->IrpList));
>      RtlZeroMemory(&Fdo->IrpList, sizeof (LIST_ENTRY));
> diff --git a/src/xeniface/fdo.h b/src/xeniface/fdo.h
> index 781b1cc..6cd628c 100644
> --- a/src/xeniface/fdo.h
> +++ b/src/xeniface/fdo.h
> @@ -89,7 +89,6 @@ typedef struct _XENIFACE_FDO {
> 
>      KSPIN_LOCK                      EvtchnLock;
>      LIST_ENTRY                      EvtchnList;
> -    PKDPC                           EvtchnDpc;
> 
>      KSPIN_LOCK                      GnttabCacheLock;
> 
> diff --git a/src/xeniface/ioctl_evtchn.c b/src/xeniface/ioctl_evtchn.c
> index 9c5af19..84b4871 100644
> --- a/src/xeniface/ioctl_evtchn.c
> +++ b/src/xeniface/ioctl_evtchn.c
> @@ -47,10 +47,10 @@ EvtchnNotificationDpc(
>      __in_opt  PVOID Argument2
>      )
>  {
> -    PXENIFACE_EVTCHN_CONTEXT Context = Argument1;
> +    PXENIFACE_EVTCHN_CONTEXT Context = _Context;
> 
>      UNREFERENCED_PARAMETER(Dpc);
> -    UNREFERENCED_PARAMETER(_Context);
> +    UNREFERENCED_PARAMETER(Argument1);
>      UNREFERENCED_PARAMETER(Argument2);
> 
>      ASSERT(Context != NULL);
> @@ -78,11 +78,13 @@ EvtchnInterruptHandler(
>      ULONG ProcIndex;
> 
>      UNREFERENCED_PARAMETER(Interrupt);
> +
>      ASSERT(Context != NULL);
> 
>      KeGetCurrentProcessorNumberEx(&ProcNumber);
>      ProcIndex = KeGetProcessorIndexFromNumber(&ProcNumber);
> -    if (!KeInsertQueueDpc(&Context->Fdo->EvtchnDpc[ProcIndex], Context,
> NULL)) {
> +
> +    if (!KeInsertQueueDpc(&Context->Dpc, Context, NULL)) {

Actually, I realise that arg1 can be NULL now too.

  Paul

>          XenIfaceDebugPrint(TRACE, "NOT INSERTED: Context %p, Port %lu, FO
> %p, Cpu %lu\n",
>                             Context, Context->LocalPort, Context->FileObject, ProcIndex);
>      }
> @@ -189,6 +191,8 @@ IoctlEvtchnBindUnbound(
>      if (!NT_SUCCESS(status))
>          goto fail3;
> 
> +    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
> +
>      status = STATUS_UNSUCCESSFUL;
>      Context->Channel = XENBUS_EVTCHN(Open,
>                                       &Fdo->EvtchnInterface,
> @@ -280,6 +284,8 @@ IoctlEvtchnBindInterdomain(
>      if (!NT_SUCCESS(status))
>          goto fail3;
> 
> +    KeInitializeDpc(&Context->Dpc, EvtchnNotificationDpc, Context);
> +
>      status = STATUS_UNSUCCESSFUL;
>      Context->Channel = XENBUS_EVTCHN(Open,
>                                       &Fdo->EvtchnInterface,
> diff --git a/src/xeniface/ioctls.h b/src/xeniface/ioctls.h
> index 225ed7f..da273ce 100644
> --- a/src/xeniface/ioctls.h
> +++ b/src/xeniface/ioctls.h
> @@ -59,6 +59,7 @@ typedef struct _XENIFACE_EVTCHN_CONTEXT {
>      ULONG                  LocalPort;
>      PKEVENT                Event;
>      PXENIFACE_FDO          Fdo;
> +    KDPC                   Dpc;
>      PVOID                  FileObject;
>  } XENIFACE_EVTCHN_CONTEXT, *PXENIFACE_EVTCHN_CONTEXT;
> 
> --
> 2.1.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:56:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:56:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70lj-0007Iw-Ki; Thu, 10 Dec 2015 12:56:23 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a70li-0007Ir-NX
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:56:23 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	47/94-21571-67679665; Thu, 10 Dec 2015 12:56:22 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1449752178!4664991!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 49882 invoked from network); 10 Dec 2015 12:56:21 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 10 Dec 2015 12:56:21 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id E1408208A5
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 07:56:17 -0500 (EST)
Received: from frontend2 ([10.202.2.161])
	by compute2.internal (MEProxy); Thu, 10 Dec 2015 07:56:17 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=cPgWTE+ubS39yFhk
	uGAt5qVJfl4=; b=c8iNqh3mJlx3kQS9V8vJdIW7AHH2X7FwjykxhfNIgcvdZ0Iq
	v6/Y90BBg8RebIY/Wyd6eS7eKR7M2kdfEhXiz9mAjlIVwgNBx8o4GnTcxFBwQ/y6
	WIHE7xMSGczxYd8IgRBu1sp/Norp7BRVKdb4wOJN32IWuhn72x/1jo05r6Y=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=cPgWTE+ubS39yFh
	kuGAt5qVJfl4=; b=GY/aMaq9JI933bvK47n+/zigDKFdgcZensOhMn0PgwnGHm6
	BSxTpEze4+UfuIko+2ikT7QPGDp3X7irpvJazMu64XPURF+Dazwm8nvXVPPQfqi4
	aPCVIGafFDzobya9YkJRpmJAleh7y3Qz9BiiHgH6qZXm1Mv+6xpTLq5AF680=
X-Sasl-enc: fFMnWzFifuFJBszvD3VQTqSXnWbss5luYCCAAhDw/7IJ 1449752177
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 274016800C2;
	Thu, 10 Dec 2015 07:56:16 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <56697670.7030601@invisiblethingslab.com>
Date: Thu, 10 Dec 2015 13:56:16 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
Content-Length: 5994
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMjAxNS0xMi0xMCAxMzoyNywgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDkgRGVjZW1iZXIgMjAx
NSAxNDowNgo+PiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKPj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50
ZXJydXB0IGhhbmRsaW5nCj4+Cj4+IE9uIDEyLzA5LzIwMTUgMDI6MDIgUE0sIFBhdWwgRHVycmFu
dCB3cm90ZToKPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+Pj4+IEZyb206IFJhZmHF
giBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdzbGFiLmNvbV0KPj4+PiBTZW50
OiAwOSBEZWNlbWJlciAyMDE1IDExOjA4Cj4+Pj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRl
dmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCj4+Pj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxd
IEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nCj4+Pj4KPj4+PiBPbiAyMDE1LTEy
LTA5IDExOjQ0LCBQYXVsIER1cnJhbnQgd3JvdGU6Cj4+Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3Nh
Z2UtLS0tLQo+Pj4+Pj4gRnJvbTogd2luLXB2LWRldmVsLWJvdW5jZXNAbGlzdHMueGVucHJvamVj
dC5vcmcgW21haWx0bzp3aW4tcHYtCj4+IGRldmVsLQo+Pj4+Pj4gYm91bmNlc0BsaXN0cy54ZW5w
cm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4+Pj4+IFNlbnQ6IDA5IERl
Y2VtYmVyIDIwMTUgMTA6MTkKPj4+Pj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKPj4+Pj4+IFN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50
ZXJydXB0IGhhbmRsaW5nCj4+Pj4+Pgo+Pj4+Pj4gSGksCj4+Pj4+Pgo+Pj4+Pj4gSSBmb3VuZCBh
biBpc3N1ZSBpbiBteSBldnRjaG4gaGFuZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1
cmUgaG93Cj4+Pj4+PiB0byBwcm9wZXJseSBmaXguIE5hbWVseSwgdGhlIGludGVycnVwdCBjYWxs
YmFjayB0aGF0J3MgYXNzaWduZWQgZm9yIGEKPj4+Pj4+IHBhcnRpY3VsYXIgY2hhbm5lbCBjYW4g
YmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWduYWxzIHRoZQo+Pj4+Pj4g
Y2FsbGVyLXByb3ZpZGVkIGV2ZW50KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1
cHQgY2FsbGJhY2sKPj4+Pj4+IGZhaWxzIHRvIGluc2VydCB0aGUgRFBDIGFnYWluIGFuZCBhbiBl
dmVudCBpcyBsb3N0LCBwb3RlbnRpYWxseSBjYXVzaW5nCj4+Pj4+PiBhIHZjaGFuICJkZWFkbG9j
ayIgZG93biB0aGUgd2F5Lgo+Pj4+Pj4KPj4+Pj4KPj4+Pj4gSGkgUmFmYWwsCj4+Pj4+Cj4+Pj4+
IFRoYXQgc2hvdWxkbid0IGJlIHRoZSBjYXNlLiBXaW5kb3dzIGRlLXF1ZXVlcyBhIERQQyBiZWZv
cmUgcnVubmluZwo+PiBmb3IKPj4+PiBwcmVjaXNlbHkgdGhpcyBraW5kIG9mIHJlYXNvbi4gSS5l
LiBqdXN0IGJlY2F1c2UgeW91ciBEUEMgaXMgcnVubmluZywgaXQKPj4gc2hvdWxkCj4+Pj4gbm90
IHN0b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWlu
ZyBhIGZhaWx1cmUgdG8KPj4+PiBxdWV1ZSBldmVuIHdoZW4gbm8gRFBDIGlzIGFjdHVhbGx5IHF1
ZXVlZD8gV2hhdCB5b3UgbWF5IGFjdHVhbGx5IGJlCj4+Pj4gZ2V0dGluZyBjYXVnaHQgYnkgaXMg
ZXZ0Y2huIGF1dG8tbWFza2luZy4gSWYgeW91IGhhdmUgZW5hYmxlZCBhdXRvLQo+PiBtYXNraW5n
Cj4+Pj4gdGhlbiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlv
dXIgRFBDLiAoVGhlCj4+IHRyYW5zbWl0dGVyCj4+Pj4gYW5kIHJlY2VpdmVyIHJpbmcgRFBDcyBp
biBYRU5WSUYgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMpLgo+Pj4+Pgo+Pj4+PiBDaGVlcnMs
Cj4+Pj4+Cj4+Pj4+ICAgUGF1bAo+Pj4+Pgo+Pj4+IEhlcmUncyB0aGUgcmVsZXZhbnQgYml0Ogo+
Pj4+Cj4+IGh0dHA6Ly94ZW5iaXRzLnhlbi5vcmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVu
aWZhY2UuZ2l0O2E9YmxvYjtmPXNyYy94Cj4+Pj4KPj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYzto
PTljNWFmMTllMDBhOTFhMDhmNjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9Cj4+Pj4gSEVBRCNs
NjYKPj4+Pgo+Pj4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkgYW5k
IEkgZGVmaW5pdGVseSBzZWUgaXQgZmFpbAo+Pj4+IHNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZN
IG9ubHkgaGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlCj4+IGNoYW5uZWwKPj4+PiBhZnRl
ciBzZXR0aW5nIGFuIGV2ZW50IHNvIHRoaXMgc2hvdWxkbid0IGJlIHRoZSByZWFzb24uCj4+Pj4K
Pj4+Cj4+PiBUaGUgYXJ0aWNsZSBhdCBodHRwczovL3d3dy5vc3JvbmxpbmUuY29tL2FydGljbGUu
Y2ZtP2FydGljbGU9NTI5IGlzIHdvcnRoCj4+IHJlYWRpbmcuIFRoZSBjb21tZW50IGxhYmVsbGVk
ICJEUEMgUmVlbnRyYW5jeSIgcG9pbnRzIG91dCB0aGF0IERQQ3MgYXJlCj4+IGRlLXF1ZXVlZCBi
ZWZvcmUgYmVpbmcgZXhlY3V0ZWQuIFNvIHJlYWxseSB5b3Ugc2hvdWxkIG5vdCBzZWUgYSBxdWV1
ZWluZwo+PiBmYWlsdXJlIHVubGVzcyBlaXRoZXIgdGhlbiB1bm1hc2tpbmcgaXMgbm90IHdvcmtp
bmcgY29ycmVjdGx5IG9yIHRoZXJlJ3MgYSBidWcKPj4gaW4gV2luZG93cyBpdHNlbGYuCj4+Cj4+
IFllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3aGV0aGVyIEkn
bSBtaXNzaW5nCj4+IHNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2aW9yIEkg
c2VlLgo+IAo+IEFjdHVhbGx5LCBsb29raW5nIG1vcmUgY2xvc2VseSBhdCB0aGUgY29kZSB0b2Rh
eSBJIGRvIHNlZSBhIHByb2JsZW0uLi4KPiAKPiBZb3UgaGF2ZSBhIERQQyBwZXIgQ1BVIHNvLCBp
ZiB5b3UgaGF2ZSB0d28gc2VwYXJhdGUgZXZlbnQgY2hhbm5lbHMgYm91bmQgdG8gdGhlIHNhbWUg
Q1BVIHlvdSdyZSBnb25uYSBoaXQgcHJvYmxlbXMuIEUuZy4gYW4gZXZlbnQgY29tZXMgaW4gb24g
dGhlIGZpcnN0IGNoYW5uZWwgc28geW91IHNjaGVkdWxlIGEgRFBDIHRvIGhhbmRsZSBpdC4gTm93
LCBhbiBldmVudCBjb21lcyBpbiBvbiB0aGUgc2Vjb25kIGNoYW5uZWwgYW5kIHlvdSBjYW4ndCBz
Y2hlZHVsZSB0aGUgRFBDIGJlY2F1c2UgaXTigJlzIHN0aWxsIHF1ZXVlZCBmb3IgdGhlIGZpcnN0
IGV2ZW50LiBZb3UgbmVlZCBhIERQQyBwZXIgY2hhbm5lbC4KPiAKPiAgIFBhdWwKPiAKSGEsIHRo
YXQncyBleGFjdGx5IHdoYXQgSSBmb3VuZCBhcyB3ZWxsLiBJIGltcGxlbWVudGVkIGEgc2ltaWxh
ciBjaGFuZ2UKeWVzdGVyZGF5IGFuZCBldmVyeXRoaW5nIHNlZW1lZCBmaW5lIGR1cmluZyBteSB0
ZXN0cy4gVGhhbmtzIGZvciB0aGUKY29uZmlybWF0aW9uIC0gSSB0aGluayB5b3UgY2FuIGFwcGx5
IHRoZSBwYXRjaC4KCj4+Cj4+PiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2
ZW50cyBvciBpcyBpdCBvbGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/Cj4+Pgo+Pj4gICBQYXVsCj4+
Cj4+IFdlJ3JlIHVzaW5nIDQuNC4zIHJpZ2h0IG5vdy4KPj4KPj4+Cj4+Pj4+PiBBbnkgYWR2aWNl
IG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQK
Pj4+Pj4+IEhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5j
aHJvbml6YXRpb24gd2l0aAo+Pj4+IHNvbWUKPj4+Pj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0
YWtlIGNhcmUgb2Ygc3VjaCAicGVuZGluZyIgZXZlbnRzLgo+Pj4+Pj4KPj4+Pj4+IEFsc28gSSB3
b25kZXIgaWYgdGhlIGtlcm5lbCBkaWZmZXJlbnRpYXRlcyBEUENzIG9ubHkgYnkgdGhlaXIgS0RQ
Qwo+Pj4+Pj4gYWRkcmVzcywgb3IgYWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0
UXVldWVEcGMoKT8KPj4+Pj4+CgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBX
aW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBs
aXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJv
amVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:56:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:56:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70lj-0007Iw-Ki; Thu, 10 Dec 2015 12:56:23 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1a70li-0007Ir-NX
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:56:23 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	47/94-21571-67679665; Thu, 10 Dec 2015 12:56:22 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1449752178!4664991!1
X-Originating-IP: [66.111.4.28]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 49882 invoked from network); 10 Dec 2015 12:56:21 -0000
Received: from out4-smtp.messagingengine.com (HELO
	out4-smtp.messagingengine.com) (66.111.4.28)
	by server-6.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 10 Dec 2015 12:56:21 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id E1408208A5
	for <win-pv-devel@lists.xenproject.org>;
	Thu, 10 Dec 2015 07:56:17 -0500 (EST)
Received: from frontend2 ([10.202.2.161])
	by compute2.internal (MEProxy); Thu, 10 Dec 2015 07:56:17 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=cPgWTE+ubS39yFhk
	uGAt5qVJfl4=; b=c8iNqh3mJlx3kQS9V8vJdIW7AHH2X7FwjykxhfNIgcvdZ0Iq
	v6/Y90BBg8RebIY/Wyd6eS7eKR7M2kdfEhXiz9mAjlIVwgNBx8o4GnTcxFBwQ/y6
	WIHE7xMSGczxYd8IgRBu1sp/Norp7BRVKdb4wOJN32IWuhn72x/1jo05r6Y=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=cPgWTE+ubS39yFh
	kuGAt5qVJfl4=; b=GY/aMaq9JI933bvK47n+/zigDKFdgcZensOhMn0PgwnGHm6
	BSxTpEze4+UfuIko+2ikT7QPGDp3X7irpvJazMu64XPURF+Dazwm8nvXVPPQfqi4
	aPCVIGafFDzobya9YkJRpmJAleh7y3Qz9BiiHgH6qZXm1Mv+6xpTLq5AF680=
X-Sasl-enc: fFMnWzFifuFJBszvD3VQTqSXnWbss5luYCCAAhDw/7IJ 1449752177
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 274016800C2;
	Thu, 10 Dec 2015 07:56:16 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <56697670.7030601@invisiblethingslab.com>
Date: Thu, 10 Dec 2015 13:56:16 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
Content-Length: 5994
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

T24gMjAxNS0xMi0xMCAxMzoyNywgUGF1bCBEdXJyYW50IHdyb3RlOgo+PiAtLS0tLU9yaWdpbmFs
IE1lc3NhZ2UtLS0tLQo+PiBGcm9tOiB3aW4tcHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9q
ZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZlbC0KPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0
Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4gU2VudDogMDkgRGVjZW1iZXIgMjAx
NSAxNDowNgo+PiBUbzogUGF1bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKPj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50
ZXJydXB0IGhhbmRsaW5nCj4+Cj4+IE9uIDEyLzA5LzIwMTUgMDI6MDIgUE0sIFBhdWwgRHVycmFu
dCB3cm90ZToKPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQo+Pj4+IEZyb206IFJhZmHF
giBXb2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdzbGFiLmNvbV0KPj4+PiBTZW50
OiAwOSBEZWNlbWJlciAyMDE1IDExOjA4Cj4+Pj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRl
dmVsQGxpc3RzLnhlbnByb2plY3Qub3JnCj4+Pj4gU3ViamVjdDogUmU6IFt3aW4tcHYtZGV2ZWxd
IEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nCj4+Pj4KPj4+PiBPbiAyMDE1LTEy
LTA5IDExOjQ0LCBQYXVsIER1cnJhbnQgd3JvdGU6Cj4+Pj4+PiAtLS0tLU9yaWdpbmFsIE1lc3Nh
Z2UtLS0tLQo+Pj4+Pj4gRnJvbTogd2luLXB2LWRldmVsLWJvdW5jZXNAbGlzdHMueGVucHJvamVj
dC5vcmcgW21haWx0bzp3aW4tcHYtCj4+IGRldmVsLQo+Pj4+Pj4gYm91bmNlc0BsaXN0cy54ZW5w
cm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdvamR5bGEKPj4+Pj4+IFNlbnQ6IDA5IERl
Y2VtYmVyIDIwMTUgMTA6MTkKPj4+Pj4+IFRvOiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVj
dC5vcmcKPj4+Pj4+IFN1YmplY3Q6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50
ZXJydXB0IGhhbmRsaW5nCj4+Pj4+Pgo+Pj4+Pj4gSGksCj4+Pj4+Pgo+Pj4+Pj4gSSBmb3VuZCBh
biBpc3N1ZSBpbiBteSBldnRjaG4gaGFuZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1
cmUgaG93Cj4+Pj4+PiB0byBwcm9wZXJseSBmaXguIE5hbWVseSwgdGhlIGludGVycnVwdCBjYWxs
YmFjayB0aGF0J3MgYXNzaWduZWQgZm9yIGEKPj4+Pj4+IHBhcnRpY3VsYXIgY2hhbm5lbCBjYW4g
YmUgY2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWduYWxzIHRoZQo+Pj4+Pj4g
Y2FsbGVyLXByb3ZpZGVkIGV2ZW50KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRlcnJ1
cHQgY2FsbGJhY2sKPj4+Pj4+IGZhaWxzIHRvIGluc2VydCB0aGUgRFBDIGFnYWluIGFuZCBhbiBl
dmVudCBpcyBsb3N0LCBwb3RlbnRpYWxseSBjYXVzaW5nCj4+Pj4+PiBhIHZjaGFuICJkZWFkbG9j
ayIgZG93biB0aGUgd2F5Lgo+Pj4+Pj4KPj4+Pj4KPj4+Pj4gSGkgUmFmYWwsCj4+Pj4+Cj4+Pj4+
IFRoYXQgc2hvdWxkbid0IGJlIHRoZSBjYXNlLiBXaW5kb3dzIGRlLXF1ZXVlcyBhIERQQyBiZWZv
cmUgcnVubmluZwo+PiBmb3IKPj4+PiBwcmVjaXNlbHkgdGhpcyBraW5kIG9mIHJlYXNvbi4gSS5l
LiBqdXN0IGJlY2F1c2UgeW91ciBEUEMgaXMgcnVubmluZywgaXQKPj4gc2hvdWxkCj4+Pj4gbm90
IHN0b3AgYW5vdGhlciBmcm9tIGJlaW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWlu
ZyBhIGZhaWx1cmUgdG8KPj4+PiBxdWV1ZSBldmVuIHdoZW4gbm8gRFBDIGlzIGFjdHVhbGx5IHF1
ZXVlZD8gV2hhdCB5b3UgbWF5IGFjdHVhbGx5IGJlCj4+Pj4gZ2V0dGluZyBjYXVnaHQgYnkgaXMg
ZXZ0Y2huIGF1dG8tbWFza2luZy4gSWYgeW91IGhhdmUgZW5hYmxlZCBhdXRvLQo+PiBtYXNraW5n
Cj4+Pj4gdGhlbiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlv
dXIgRFBDLiAoVGhlCj4+IHRyYW5zbWl0dGVyCj4+Pj4gYW5kIHJlY2VpdmVyIHJpbmcgRFBDcyBp
biBYRU5WSUYgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMpLgo+Pj4+Pgo+Pj4+PiBDaGVlcnMs
Cj4+Pj4+Cj4+Pj4+ICAgUGF1bAo+Pj4+Pgo+Pj4+IEhlcmUncyB0aGUgcmVsZXZhbnQgYml0Ogo+
Pj4+Cj4+IGh0dHA6Ly94ZW5iaXRzLnhlbi5vcmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVu
aWZhY2UuZ2l0O2E9YmxvYjtmPXNyYy94Cj4+Pj4KPj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYzto
PTljNWFmMTllMDBhOTFhMDhmNjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9Cj4+Pj4gSEVBRCNs
NjYKPj4+Pgo+Pj4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkgYW5k
IEkgZGVmaW5pdGVseSBzZWUgaXQgZmFpbAo+Pj4+IHNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZN
IG9ubHkgaGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlCj4+IGNoYW5uZWwKPj4+PiBhZnRl
ciBzZXR0aW5nIGFuIGV2ZW50IHNvIHRoaXMgc2hvdWxkbid0IGJlIHRoZSByZWFzb24uCj4+Pj4K
Pj4+Cj4+PiBUaGUgYXJ0aWNsZSBhdCBodHRwczovL3d3dy5vc3JvbmxpbmUuY29tL2FydGljbGUu
Y2ZtP2FydGljbGU9NTI5IGlzIHdvcnRoCj4+IHJlYWRpbmcuIFRoZSBjb21tZW50IGxhYmVsbGVk
ICJEUEMgUmVlbnRyYW5jeSIgcG9pbnRzIG91dCB0aGF0IERQQ3MgYXJlCj4+IGRlLXF1ZXVlZCBi
ZWZvcmUgYmVpbmcgZXhlY3V0ZWQuIFNvIHJlYWxseSB5b3Ugc2hvdWxkIG5vdCBzZWUgYSBxdWV1
ZWluZwo+PiBmYWlsdXJlIHVubGVzcyBlaXRoZXIgdGhlbiB1bm1hc2tpbmcgaXMgbm90IHdvcmtp
bmcgY29ycmVjdGx5IG9yIHRoZXJlJ3MgYSBidWcKPj4gaW4gV2luZG93cyBpdHNlbGYuCj4+Cj4+
IFllYWgsIEkndmUgcmVhZCB0aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3aGV0aGVyIEkn
bSBtaXNzaW5nCj4+IHNvbWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2aW9yIEkg
c2VlLgo+IAo+IEFjdHVhbGx5LCBsb29raW5nIG1vcmUgY2xvc2VseSBhdCB0aGUgY29kZSB0b2Rh
eSBJIGRvIHNlZSBhIHByb2JsZW0uLi4KPiAKPiBZb3UgaGF2ZSBhIERQQyBwZXIgQ1BVIHNvLCBp
ZiB5b3UgaGF2ZSB0d28gc2VwYXJhdGUgZXZlbnQgY2hhbm5lbHMgYm91bmQgdG8gdGhlIHNhbWUg
Q1BVIHlvdSdyZSBnb25uYSBoaXQgcHJvYmxlbXMuIEUuZy4gYW4gZXZlbnQgY29tZXMgaW4gb24g
dGhlIGZpcnN0IGNoYW5uZWwgc28geW91IHNjaGVkdWxlIGEgRFBDIHRvIGhhbmRsZSBpdC4gTm93
LCBhbiBldmVudCBjb21lcyBpbiBvbiB0aGUgc2Vjb25kIGNoYW5uZWwgYW5kIHlvdSBjYW4ndCBz
Y2hlZHVsZSB0aGUgRFBDIGJlY2F1c2UgaXTigJlzIHN0aWxsIHF1ZXVlZCBmb3IgdGhlIGZpcnN0
IGV2ZW50LiBZb3UgbmVlZCBhIERQQyBwZXIgY2hhbm5lbC4KPiAKPiAgIFBhdWwKPiAKSGEsIHRo
YXQncyBleGFjdGx5IHdoYXQgSSBmb3VuZCBhcyB3ZWxsLiBJIGltcGxlbWVudGVkIGEgc2ltaWxh
ciBjaGFuZ2UKeWVzdGVyZGF5IGFuZCBldmVyeXRoaW5nIHNlZW1lZCBmaW5lIGR1cmluZyBteSB0
ZXN0cy4gVGhhbmtzIGZvciB0aGUKY29uZmlybWF0aW9uIC0gSSB0aGluayB5b3UgY2FuIGFwcGx5
IHRoZSBwYXRjaC4KCj4+Cj4+PiBBcmUgeW91IHJ1bm5pbmcgb24gYSBYZW4gd2l0aCBGSUZPIGV2
ZW50cyBvciBpcyBpdCBvbGQgZW5vdWdoIHRvIG9ubHkgYmUgMkw/Cj4+Pgo+Pj4gICBQYXVsCj4+
Cj4+IFdlJ3JlIHVzaW5nIDQuNC4zIHJpZ2h0IG5vdy4KPj4KPj4+Cj4+Pj4+PiBBbnkgYWR2aWNl
IG9uIGhvdyB0byBhcHByb2FjaCB0aGlzPyBUaGUgaW50ZXJydXB0IGNhbGxiYWNrIHJ1bnMgYXQK
Pj4+Pj4+IEhJR0hfTEVWRUwgd2hpY2ggaXMgYW4gaXNzdWUgd2hlbiBpdCBjb21lcyB0byBzeW5j
aHJvbml6YXRpb24gd2l0aAo+Pj4+IHNvbWUKPj4+Pj4+IG90aGVyIGNvZGUgdGhhdCBjb3VsZCB0
YWtlIGNhcmUgb2Ygc3VjaCAicGVuZGluZyIgZXZlbnRzLgo+Pj4+Pj4KPj4+Pj4+IEFsc28gSSB3
b25kZXIgaWYgdGhlIGtlcm5lbCBkaWZmZXJlbnRpYXRlcyBEUENzIG9ubHkgYnkgdGhlaXIgS0RQ
Qwo+Pj4+Pj4gYWRkcmVzcywgb3IgYWxzbyBieSBhcmd1bWVudHMgcGFzc2VkIHRvIEtlSW5zZXJ0
UXVldWVEcGMoKT8KPj4+Pj4+CgotLSAKUmFmYcWCIFdvamR5xYJhClF1YmVzIFRvb2xzIGZvciBX
aW5kb3dzIGRldmVsb3BlcgpodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvCgpfX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwgbWFpbGluZyBs
aXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlzdHMueGVucHJv
amVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:57:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:57:52 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70n9-0007KX-TV; Thu, 10 Dec 2015 12:57:51 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=779ddce85=Paul.Durrant@citrix.com>)
	id 1a70n8-0007KS-VF
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:57:51 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	C1/0D-10678-EC679665; Thu, 10 Dec 2015 12:57:50 +0000
X-Env-Sender: prvs=779ddce85=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1449752269!9891799!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 38327 invoked from network); 10 Dec 2015 12:57:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Dec 2015 12:57:49 -0000
X-IronPort-AV: E=Sophos;i="5.20,408,1444694400"; 
   d="scan'208";a="9740364"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAGG3ZD///geAIAAERTQ
Date: Thu, 10 Dec 2015 12:57:47 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF948@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
	<56697670.7030601@invisiblethingslab.com>
In-Reply-To: <56697670.7030601@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21h
aWx0bzpvbWVnQGludmlzaWJsZXRoaW5nc2xhYi5jb21dDQo+IFNlbnQ6IDEwIERlY2VtYmVyIDIw
MTUgMTI6NTYNCj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2pl
Y3Qub3JnDQo+IFN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBBZHZpY2Ugb24gZXZ0Y2huIGlu
dGVycnVwdCBoYW5kbGluZw0KPiANCj4gT24gMjAxNS0xMi0xMCAxMzoyNywgUGF1bCBEdXJyYW50
IHdyb3RlOg0KPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+PiBGcm9tOiB3aW4t
cHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZl
bC0NCj4gPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFs
IFdvamR5bGENCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxNDowNg0KPiA+PiBUbzogUGF1
bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4gU3ViamVj
dDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5n
DQo+ID4+DQo+ID4+IE9uIDEyLzA5LzIwMTUgMDI6MDIgUE0sIFBhdWwgRHVycmFudCB3cm90ZToN
Cj4gPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+IEZyb206IFJhZmHFgiBX
b2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdzbGFiLmNvbV0NCj4gPj4+PiBTZW50
OiAwOSBEZWNlbWJlciAyMDE1IDExOjA4DQo+ID4+Pj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2
LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+Pj4gU3ViamVjdDogUmU6IFt3aW4tcHYt
ZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+ID4+Pj4NCj4gPj4+
PiBPbiAyMDE1LTEyLTA5IDExOjQ0LCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+Pj4+PiAtLS0t
LU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+Pj4gRnJvbTogd2luLXB2LWRldmVsLWJvdW5j
ZXNAbGlzdHMueGVucHJvamVjdC5vcmcgW21haWx0bzp3aW4tcHYtDQo+ID4+IGRldmVsLQ0KPiA+
Pj4+Pj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdv
amR5bGENCj4gPj4+Pj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkNCj4gPj4+Pj4+IFRv
OiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4+Pj4+IFN1YmplY3Q6IFt3
aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+ID4+Pj4+
Pg0KPiA+Pj4+Pj4gSGksDQo+ID4+Pj4+Pg0KPiA+Pj4+Pj4gSSBmb3VuZCBhbiBpc3N1ZSBpbiBt
eSBldnRjaG4gaGFuZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUNCj4gaG93DQo+
ID4+Pj4+PiB0byBwcm9wZXJseSBmaXguIE5hbWVseSwgdGhlIGludGVycnVwdCBjYWxsYmFjayB0
aGF0J3MgYXNzaWduZWQgZm9yIGENCj4gPj4+Pj4+IHBhcnRpY3VsYXIgY2hhbm5lbCBjYW4gYmUg
Y2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWduYWxzDQo+IHRoZQ0KPiA+Pj4+
Pj4gY2FsbGVyLXByb3ZpZGVkIGV2ZW50KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRl
cnJ1cHQgY2FsbGJhY2sNCj4gPj4+Pj4+IGZhaWxzIHRvIGluc2VydCB0aGUgRFBDIGFnYWluIGFu
ZCBhbiBldmVudCBpcyBsb3N0LCBwb3RlbnRpYWxseSBjYXVzaW5nDQo+ID4+Pj4+PiBhIHZjaGFu
ICJkZWFkbG9jayIgZG93biB0aGUgd2F5Lg0KPiA+Pj4+Pj4NCj4gPj4+Pj4NCj4gPj4+Pj4gSGkg
UmFmYWwsDQo+ID4+Pj4+DQo+ID4+Pj4+IFRoYXQgc2hvdWxkbid0IGJlIHRoZSBjYXNlLiBXaW5k
b3dzIGRlLXF1ZXVlcyBhIERQQyBiZWZvcmUgcnVubmluZw0KPiA+PiBmb3INCj4gPj4+PiBwcmVj
aXNlbHkgdGhpcyBraW5kIG9mIHJlYXNvbi4gSS5lLiBqdXN0IGJlY2F1c2UgeW91ciBEUEMgaXMg
cnVubmluZywgaXQNCj4gPj4gc2hvdWxkDQo+ID4+Pj4gbm90IHN0b3AgYW5vdGhlciBmcm9tIGJl
aW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUNCj4gdG8NCj4g
Pj4+PiBxdWV1ZSBldmVuIHdoZW4gbm8gRFBDIGlzIGFjdHVhbGx5IHF1ZXVlZD8gV2hhdCB5b3Ug
bWF5IGFjdHVhbGx5DQo+IGJlDQo+ID4+Pj4gZ2V0dGluZyBjYXVnaHQgYnkgaXMgZXZ0Y2huIGF1
dG8tbWFza2luZy4gSWYgeW91IGhhdmUgZW5hYmxlZCBhdXRvLQ0KPiA+PiBtYXNraW5nDQo+ID4+
Pj4gdGhlbiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlvdXIg
RFBDLiAoVGhlDQo+ID4+IHRyYW5zbWl0dGVyDQo+ID4+Pj4gYW5kIHJlY2VpdmVyIHJpbmcgRFBD
cyBpbiBYRU5WSUYgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMpLg0KPiA+Pj4+Pg0KPiA+Pj4+
PiBDaGVlcnMsDQo+ID4+Pj4+DQo+ID4+Pj4+ICAgUGF1bA0KPiA+Pj4+Pg0KPiA+Pj4+IEhlcmUn
cyB0aGUgcmVsZXZhbnQgYml0Og0KPiA+Pj4+DQo+ID4+DQo+IGh0dHA6Ly94ZW5iaXRzLnhlbi5v
cmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVuaWZhY2UuZ2l0O2E9YmxvYjtmPXNyYy94DQo+
ID4+Pj4NCj4gPj4NCj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYztoPTljNWFmMTllMDBhOTFhMDhm
NjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9DQo+ID4+Pj4gSEVBRCNsNjYNCj4gPj4+Pg0KPiA+
Pj4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkgYW5kIEkgZGVmaW5p
dGVseSBzZWUgaXQgZmFpbA0KPiA+Pj4+IHNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZNIG9ubHkg
aGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlDQo+ID4+IGNoYW5uZWwNCj4gPj4+PiBhZnRl
ciBzZXR0aW5nIGFuIGV2ZW50IHNvIHRoaXMgc2hvdWxkbid0IGJlIHRoZSByZWFzb24uDQo+ID4+
Pj4NCj4gPj4+DQo+ID4+PiBUaGUgYXJ0aWNsZSBhdCBodHRwczovL3d3dy5vc3JvbmxpbmUuY29t
L2FydGljbGUuY2ZtP2FydGljbGU9NTI5IGlzDQo+IHdvcnRoDQo+ID4+IHJlYWRpbmcuIFRoZSBj
b21tZW50IGxhYmVsbGVkICJEUEMgUmVlbnRyYW5jeSIgcG9pbnRzIG91dCB0aGF0IERQQ3MNCj4g
YXJlDQo+ID4+IGRlLXF1ZXVlZCBiZWZvcmUgYmVpbmcgZXhlY3V0ZWQuIFNvIHJlYWxseSB5b3Ug
c2hvdWxkIG5vdCBzZWUgYQ0KPiBxdWV1ZWluZw0KPiA+PiBmYWlsdXJlIHVubGVzcyBlaXRoZXIg
dGhlbiB1bm1hc2tpbmcgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5IG9yIHRoZXJlJ3MgYQ0KPiBi
dWcNCj4gPj4gaW4gV2luZG93cyBpdHNlbGYuDQo+ID4+DQo+ID4+IFllYWgsIEkndmUgcmVhZCB0
aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3aGV0aGVyIEknbSBtaXNzaW5nDQo+ID4+IHNv
bWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2aW9yIEkgc2VlLg0KPiA+DQo+ID4g
QWN0dWFsbHksIGxvb2tpbmcgbW9yZSBjbG9zZWx5IGF0IHRoZSBjb2RlIHRvZGF5IEkgZG8gc2Vl
IGEgcHJvYmxlbS4uLg0KPiA+DQo+ID4gWW91IGhhdmUgYSBEUEMgcGVyIENQVSBzbywgaWYgeW91
IGhhdmUgdHdvIHNlcGFyYXRlIGV2ZW50IGNoYW5uZWxzDQo+IGJvdW5kIHRvIHRoZSBzYW1lIENQ
VSB5b3UncmUgZ29ubmEgaGl0IHByb2JsZW1zLiBFLmcuIGFuIGV2ZW50IGNvbWVzIGluIG9uDQo+
IHRoZSBmaXJzdCBjaGFubmVsIHNvIHlvdSBzY2hlZHVsZSBhIERQQyB0byBoYW5kbGUgaXQuIE5v
dywgYW4gZXZlbnQgY29tZXMgaW4NCj4gb24gdGhlIHNlY29uZCBjaGFubmVsIGFuZCB5b3UgY2Fu
J3Qgc2NoZWR1bGUgdGhlIERQQyBiZWNhdXNlIGl04oCZcyBzdGlsbA0KPiBxdWV1ZWQgZm9yIHRo
ZSBmaXJzdCBldmVudC4gWW91IG5lZWQgYSBEUEMgcGVyIGNoYW5uZWwuDQo+ID4NCj4gPiAgIFBh
dWwNCj4gPg0KPiBIYSwgdGhhdCdzIGV4YWN0bHkgd2hhdCBJIGZvdW5kIGFzIHdlbGwuIEkgaW1w
bGVtZW50ZWQgYSBzaW1pbGFyIGNoYW5nZQ0KPiB5ZXN0ZXJkYXkgYW5kIGV2ZXJ5dGhpbmcgc2Vl
bWVkIGZpbmUgZHVyaW5nIG15IHRlc3RzLiBUaGFua3MgZm9yIHRoZQ0KPiBjb25maXJtYXRpb24g
LSBJIHRoaW5rIHlvdSBjYW4gYXBwbHkgdGhlIHBhdGNoLg0KPiANCg0KQ29vbC4gVGhhbmtzIDot
KQ0KDQogIFBhdWwNCg0KPiA+Pg0KPiA+Pj4gQXJlIHlvdSBydW5uaW5nIG9uIGEgWGVuIHdpdGgg
RklGTyBldmVudHMgb3IgaXMgaXQgb2xkIGVub3VnaCB0byBvbmx5IGJlDQo+IDJMPw0KPiA+Pj4N
Cj4gPj4+ICAgUGF1bA0KPiA+Pg0KPiA+PiBXZSdyZSB1c2luZyA0LjQuMyByaWdodCBub3cuDQo+
ID4+DQo+ID4+Pg0KPiA+Pj4+Pj4gQW55IGFkdmljZSBvbiBob3cgdG8gYXBwcm9hY2ggdGhpcz8g
VGhlIGludGVycnVwdCBjYWxsYmFjayBydW5zIGF0DQo+ID4+Pj4+PiBISUdIX0xFVkVMIHdoaWNo
IGlzIGFuIGlzc3VlIHdoZW4gaXQgY29tZXMgdG8gc3luY2hyb25pemF0aW9uIHdpdGgNCj4gPj4+
PiBzb21lDQo+ID4+Pj4+PiBvdGhlciBjb2RlIHRoYXQgY291bGQgdGFrZSBjYXJlIG9mIHN1Y2gg
InBlbmRpbmciIGV2ZW50cy4NCj4gPj4+Pj4+DQo+ID4+Pj4+PiBBbHNvIEkgd29uZGVyIGlmIHRo
ZSBrZXJuZWwgZGlmZmVyZW50aWF0ZXMgRFBDcyBvbmx5IGJ5IHRoZWlyIEtEUEMNCj4gPj4+Pj4+
IGFkZHJlc3MsIG9yIGFsc28gYnkgYXJndW1lbnRzIHBhc3NlZCB0byBLZUluc2VydFF1ZXVlRHBj
KCk/DQo+ID4+Pj4+Pg0KPiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRvb2xz
IGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQpfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwg
bWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlz
dHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Thu Dec 10 12:57:52 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Thu, 10 Dec 2015 12:57:52 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a70n9-0007KX-TV; Thu, 10 Dec 2015 12:57:51 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=779ddce85=Paul.Durrant@citrix.com>)
	id 1a70n8-0007KS-VF
	for win-pv-devel@lists.xenproject.org; Thu, 10 Dec 2015 12:57:51 +0000
Received: from [85.158.137.68] by server-9.bemta-3.messagelabs.com id
	C1/0D-10678-EC679665; Thu, 10 Dec 2015 12:57:50 +0000
X-Env-Sender: prvs=779ddce85=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-31.messagelabs.com!1449752269!9891799!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 38327 invoked from network); 10 Dec 2015 12:57:49 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	10 Dec 2015 12:57:49 -0000
X-IronPort-AV: E=Sophos;i="5.20,408,1444694400"; 
   d="scan'208";a="9740364"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Advice on evtchn interrupt handling
Thread-Index: AQHRMmspDMxH1ygApEyn3ALTrW2sVp7CdpfA///3nwCAACyZ4IAABOuAgAGG3ZD///geAIAAERTQ
Date: Thu, 10 Dec 2015 12:57:47 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF948@AMSPEX01CL01.citrite.net>
References: <56680027.4080604@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6D9BCE@AMSPEX01CL01.citrite.net>
	<56680BA2.4060104@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DAF48@AMSPEX01CL01.citrite.net>
	<5668352B.6080909@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6DF82A@AMSPEX01CL01.citrite.net>
	<56697670.7030601@invisiblethingslab.com>
In-Reply-To: <56697670.7030601@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] Advice on evtchn interrupt handling
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiBGcm9tOiBSYWZhxYIgV29qZHnFgmEgW21h
aWx0bzpvbWVnQGludmlzaWJsZXRoaW5nc2xhYi5jb21dDQo+IFNlbnQ6IDEwIERlY2VtYmVyIDIw
MTUgMTI6NTYNCj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2LWRldmVsQGxpc3RzLnhlbnByb2pl
Y3Qub3JnDQo+IFN1YmplY3Q6IFJlOiBbd2luLXB2LWRldmVsXSBBZHZpY2Ugb24gZXZ0Y2huIGlu
dGVycnVwdCBoYW5kbGluZw0KPiANCj4gT24gMjAxNS0xMi0xMCAxMzoyNywgUGF1bCBEdXJyYW50
IHdyb3RlOg0KPiA+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+PiBGcm9tOiB3aW4t
cHYtZGV2ZWwtYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZyBbbWFpbHRvOndpbi1wdi1kZXZl
bC0NCj4gPj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFs
IFdvamR5bGENCj4gPj4gU2VudDogMDkgRGVjZW1iZXIgMjAxNSAxNDowNg0KPiA+PiBUbzogUGF1
bCBEdXJyYW50OyB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4gU3ViamVj
dDogUmU6IFt3aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5n
DQo+ID4+DQo+ID4+IE9uIDEyLzA5LzIwMTUgMDI6MDIgUE0sIFBhdWwgRHVycmFudCB3cm90ZToN
Cj4gPj4+PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+IEZyb206IFJhZmHFgiBX
b2pkecWCYSBbbWFpbHRvOm9tZWdAaW52aXNpYmxldGhpbmdzbGFiLmNvbV0NCj4gPj4+PiBTZW50
OiAwOSBEZWNlbWJlciAyMDE1IDExOjA4DQo+ID4+Pj4gVG86IFBhdWwgRHVycmFudDsgd2luLXB2
LWRldmVsQGxpc3RzLnhlbnByb2plY3Qub3JnDQo+ID4+Pj4gU3ViamVjdDogUmU6IFt3aW4tcHYt
ZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+ID4+Pj4NCj4gPj4+
PiBPbiAyMDE1LTEyLTA5IDExOjQ0LCBQYXVsIER1cnJhbnQgd3JvdGU6DQo+ID4+Pj4+PiAtLS0t
LU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KPiA+Pj4+Pj4gRnJvbTogd2luLXB2LWRldmVsLWJvdW5j
ZXNAbGlzdHMueGVucHJvamVjdC5vcmcgW21haWx0bzp3aW4tcHYtDQo+ID4+IGRldmVsLQ0KPiA+
Pj4+Pj4gYm91bmNlc0BsaXN0cy54ZW5wcm9qZWN0Lm9yZ10gT24gQmVoYWxmIE9mIFJhZmFsIFdv
amR5bGENCj4gPj4+Pj4+IFNlbnQ6IDA5IERlY2VtYmVyIDIwMTUgMTA6MTkNCj4gPj4+Pj4+IFRv
OiB3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcNCj4gPj4+Pj4+IFN1YmplY3Q6IFt3
aW4tcHYtZGV2ZWxdIEFkdmljZSBvbiBldnRjaG4gaW50ZXJydXB0IGhhbmRsaW5nDQo+ID4+Pj4+
Pg0KPiA+Pj4+Pj4gSGksDQo+ID4+Pj4+Pg0KPiA+Pj4+Pj4gSSBmb3VuZCBhbiBpc3N1ZSBpbiBt
eSBldnRjaG4gaGFuZGxpbmcgaW4geGVuaWZhY2UgdGhhdCBJJ20gbm90IHN1cmUNCj4gaG93DQo+
ID4+Pj4+PiB0byBwcm9wZXJseSBmaXguIE5hbWVseSwgdGhlIGludGVycnVwdCBjYWxsYmFjayB0
aGF0J3MgYXNzaWduZWQgZm9yIGENCj4gPj4+Pj4+IHBhcnRpY3VsYXIgY2hhbm5lbCBjYW4gYmUg
Y2FsbGVkIGJlZm9yZSBpdHMgcXVldWVkIERQQyAodGhhdCBzaWduYWxzDQo+IHRoZQ0KPiA+Pj4+
Pj4gY2FsbGVyLXByb3ZpZGVkIGV2ZW50KSBmaW5pc2hlcy4gSW4gc3VjaCBjYXNlIHRoZSBpbnRl
cnJ1cHQgY2FsbGJhY2sNCj4gPj4+Pj4+IGZhaWxzIHRvIGluc2VydCB0aGUgRFBDIGFnYWluIGFu
ZCBhbiBldmVudCBpcyBsb3N0LCBwb3RlbnRpYWxseSBjYXVzaW5nDQo+ID4+Pj4+PiBhIHZjaGFu
ICJkZWFkbG9jayIgZG93biB0aGUgd2F5Lg0KPiA+Pj4+Pj4NCj4gPj4+Pj4NCj4gPj4+Pj4gSGkg
UmFmYWwsDQo+ID4+Pj4+DQo+ID4+Pj4+IFRoYXQgc2hvdWxkbid0IGJlIHRoZSBjYXNlLiBXaW5k
b3dzIGRlLXF1ZXVlcyBhIERQQyBiZWZvcmUgcnVubmluZw0KPiA+PiBmb3INCj4gPj4+PiBwcmVj
aXNlbHkgdGhpcyBraW5kIG9mIHJlYXNvbi4gSS5lLiBqdXN0IGJlY2F1c2UgeW91ciBEUEMgaXMg
cnVubmluZywgaXQNCj4gPj4gc2hvdWxkDQo+ID4+Pj4gbm90IHN0b3AgYW5vdGhlciBmcm9tIGJl
aW5nIHF1ZXVlZC4gQXJlIHlvdSBkZWZpbml0ZWx5IHNlZWluZyBhIGZhaWx1cmUNCj4gdG8NCj4g
Pj4+PiBxdWV1ZSBldmVuIHdoZW4gbm8gRFBDIGlzIGFjdHVhbGx5IHF1ZXVlZD8gV2hhdCB5b3Ug
bWF5IGFjdHVhbGx5DQo+IGJlDQo+ID4+Pj4gZ2V0dGluZyBjYXVnaHQgYnkgaXMgZXZ0Y2huIGF1
dG8tbWFza2luZy4gSWYgeW91IGhhdmUgZW5hYmxlZCBhdXRvLQ0KPiA+PiBtYXNraW5nDQo+ID4+
Pj4gdGhlbiB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHVubWFzayBhdCB0aGUgZW5kIG9mIHlvdXIg
RFBDLiAoVGhlDQo+ID4+IHRyYW5zbWl0dGVyDQo+ID4+Pj4gYW5kIHJlY2VpdmVyIHJpbmcgRFBD
cyBpbiBYRU5WSUYgYXJlIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMpLg0KPiA+Pj4+Pg0KPiA+Pj4+
PiBDaGVlcnMsDQo+ID4+Pj4+DQo+ID4+Pj4+ICAgUGF1bA0KPiA+Pj4+Pg0KPiA+Pj4+IEhlcmUn
cyB0aGUgcmVsZXZhbnQgYml0Og0KPiA+Pj4+DQo+ID4+DQo+IGh0dHA6Ly94ZW5iaXRzLnhlbi5v
cmcvZ2l0d2ViLz9wPXB2ZHJpdmVycy93aW4veGVuaWZhY2UuZ2l0O2E9YmxvYjtmPXNyYy94DQo+
ID4+Pj4NCj4gPj4NCj4gZW5pZmFjZS9pb2N0bF9ldnRjaG4uYztoPTljNWFmMTllMDBhOTFhMDhm
NjhkYTBjNjMwNzA5Y2JhYTZlODQxM2Q7aGI9DQo+ID4+Pj4gSEVBRCNsNjYNCj4gPj4+Pg0KPiA+
Pj4+IEkgY2hlY2sgdGhlIHJlc3VsdCBvZiBLZUluc2VydFF1ZXVlRHBjKCkgYW5kIEkgZGVmaW5p
dGVseSBzZWUgaXQgZmFpbA0KPiA+Pj4+IHNvbWV0aW1lcywgZXZlbiBpZiB0aGUgSFZNIG9ubHkg
aGFzIDEgdmNwdS4gTXkgRFBDIHVubWFza3MgdGhlDQo+ID4+IGNoYW5uZWwNCj4gPj4+PiBhZnRl
ciBzZXR0aW5nIGFuIGV2ZW50IHNvIHRoaXMgc2hvdWxkbid0IGJlIHRoZSByZWFzb24uDQo+ID4+
Pj4NCj4gPj4+DQo+ID4+PiBUaGUgYXJ0aWNsZSBhdCBodHRwczovL3d3dy5vc3JvbmxpbmUuY29t
L2FydGljbGUuY2ZtP2FydGljbGU9NTI5IGlzDQo+IHdvcnRoDQo+ID4+IHJlYWRpbmcuIFRoZSBj
b21tZW50IGxhYmVsbGVkICJEUEMgUmVlbnRyYW5jeSIgcG9pbnRzIG91dCB0aGF0IERQQ3MNCj4g
YXJlDQo+ID4+IGRlLXF1ZXVlZCBiZWZvcmUgYmVpbmcgZXhlY3V0ZWQuIFNvIHJlYWxseSB5b3Ug
c2hvdWxkIG5vdCBzZWUgYQ0KPiBxdWV1ZWluZw0KPiA+PiBmYWlsdXJlIHVubGVzcyBlaXRoZXIg
dGhlbiB1bm1hc2tpbmcgaXMgbm90IHdvcmtpbmcgY29ycmVjdGx5IG9yIHRoZXJlJ3MgYQ0KPiBi
dWcNCj4gPj4gaW4gV2luZG93cyBpdHNlbGYuDQo+ID4+DQo+ID4+IFllYWgsIEkndmUgcmVhZCB0
aGF0IGJlZm9yZSBhbmQgd2FzIHdvbmRlcmluZyB3aGV0aGVyIEknbSBtaXNzaW5nDQo+ID4+IHNv
bWV0aGluZyB0aGF0IHdvdWxkIGV4cGxhaW4gdGhlIGJlaGF2aW9yIEkgc2VlLg0KPiA+DQo+ID4g
QWN0dWFsbHksIGxvb2tpbmcgbW9yZSBjbG9zZWx5IGF0IHRoZSBjb2RlIHRvZGF5IEkgZG8gc2Vl
IGEgcHJvYmxlbS4uLg0KPiA+DQo+ID4gWW91IGhhdmUgYSBEUEMgcGVyIENQVSBzbywgaWYgeW91
IGhhdmUgdHdvIHNlcGFyYXRlIGV2ZW50IGNoYW5uZWxzDQo+IGJvdW5kIHRvIHRoZSBzYW1lIENQ
VSB5b3UncmUgZ29ubmEgaGl0IHByb2JsZW1zLiBFLmcuIGFuIGV2ZW50IGNvbWVzIGluIG9uDQo+
IHRoZSBmaXJzdCBjaGFubmVsIHNvIHlvdSBzY2hlZHVsZSBhIERQQyB0byBoYW5kbGUgaXQuIE5v
dywgYW4gZXZlbnQgY29tZXMgaW4NCj4gb24gdGhlIHNlY29uZCBjaGFubmVsIGFuZCB5b3UgY2Fu
J3Qgc2NoZWR1bGUgdGhlIERQQyBiZWNhdXNlIGl04oCZcyBzdGlsbA0KPiBxdWV1ZWQgZm9yIHRo
ZSBmaXJzdCBldmVudC4gWW91IG5lZWQgYSBEUEMgcGVyIGNoYW5uZWwuDQo+ID4NCj4gPiAgIFBh
dWwNCj4gPg0KPiBIYSwgdGhhdCdzIGV4YWN0bHkgd2hhdCBJIGZvdW5kIGFzIHdlbGwuIEkgaW1w
bGVtZW50ZWQgYSBzaW1pbGFyIGNoYW5nZQ0KPiB5ZXN0ZXJkYXkgYW5kIGV2ZXJ5dGhpbmcgc2Vl
bWVkIGZpbmUgZHVyaW5nIG15IHRlc3RzLiBUaGFua3MgZm9yIHRoZQ0KPiBjb25maXJtYXRpb24g
LSBJIHRoaW5rIHlvdSBjYW4gYXBwbHkgdGhlIHBhdGNoLg0KPiANCg0KQ29vbC4gVGhhbmtzIDot
KQ0KDQogIFBhdWwNCg0KPiA+Pg0KPiA+Pj4gQXJlIHlvdSBydW5uaW5nIG9uIGEgWGVuIHdpdGgg
RklGTyBldmVudHMgb3IgaXMgaXQgb2xkIGVub3VnaCB0byBvbmx5IGJlDQo+IDJMPw0KPiA+Pj4N
Cj4gPj4+ICAgUGF1bA0KPiA+Pg0KPiA+PiBXZSdyZSB1c2luZyA0LjQuMyByaWdodCBub3cuDQo+
ID4+DQo+ID4+Pg0KPiA+Pj4+Pj4gQW55IGFkdmljZSBvbiBob3cgdG8gYXBwcm9hY2ggdGhpcz8g
VGhlIGludGVycnVwdCBjYWxsYmFjayBydW5zIGF0DQo+ID4+Pj4+PiBISUdIX0xFVkVMIHdoaWNo
IGlzIGFuIGlzc3VlIHdoZW4gaXQgY29tZXMgdG8gc3luY2hyb25pemF0aW9uIHdpdGgNCj4gPj4+
PiBzb21lDQo+ID4+Pj4+PiBvdGhlciBjb2RlIHRoYXQgY291bGQgdGFrZSBjYXJlIG9mIHN1Y2gg
InBlbmRpbmciIGV2ZW50cy4NCj4gPj4+Pj4+DQo+ID4+Pj4+PiBBbHNvIEkgd29uZGVyIGlmIHRo
ZSBrZXJuZWwgZGlmZmVyZW50aWF0ZXMgRFBDcyBvbmx5IGJ5IHRoZWlyIEtEUEMNCj4gPj4+Pj4+
IGFkZHJlc3MsIG9yIGFsc28gYnkgYXJndW1lbnRzIHBhc3NlZCB0byBLZUluc2VydFF1ZXVlRHBj
KCk/DQo+ID4+Pj4+Pg0KPiANCj4gLS0NCj4gUmFmYcWCIFdvamR5xYJhDQo+IFF1YmVzIFRvb2xz
IGZvciBXaW5kb3dzIGRldmVsb3Blcg0KPiBodHRwczovL3d3dy5xdWJlcy1vcy5vcmcvDQpfX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwp3aW4tcHYtZGV2ZWwg
bWFpbGluZyBsaXN0Cndpbi1wdi1kZXZlbEBsaXN0cy54ZW5wcm9qZWN0Lm9yZwpodHRwOi8vbGlz
dHMueGVucHJvamVjdC5vcmcvY2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3dpbi1wdi1kZXZlbA==

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 01:37:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 01:37:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8eYB-0005Jv-Gs; Tue, 15 Dec 2015 01:37:11 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a8eYA-0005Jq-4E
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 01:37:10 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	15/3E-31122-5CE6F665; Tue, 15 Dec 2015 01:37:09 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1450143426!5385473!1
X-Originating-IP: [209.85.220.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14772 invoked from network); 15 Dec 2015 01:37:07 -0000
Received: from mail-qk0-f172.google.com (HELO mail-qk0-f172.google.com)
	(209.85.220.172)
	by server-15.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 01:37:07 -0000
Received: by qkfb125 with SMTP id b125so165610524qkf.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 14 Dec 2015 17:37:06 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:subject:in-reply-to:references:mime-version
	:content-type:content-transfer-encoding;
	bh=XlcOeu7CFEnH4D4vV+NjUoe6UEP853DbU9Ill85t7Fg=;
	b=XCxcFh5jk+B6f9jRxWYwaJSFF7MmB0m8OgBNiwEahdyxAPR3sebNTxy3pPPBBsiIpR
	uyZ3LNM+9Hvpr5xqSCsEq/xSyTTUvgT9nCAonkIjpe97MNNmJGu9ufc2hflpkwSs+KHP
	MPWmu9DrJR9WP6q5umFoAIlO50hG19EMh2MQ0qd3CExE8gF2p4JcZlGkkp0bW4y8gxp/
	ntNlJiGAq7F+G7ZS+KtatMzVKIp2aSTzY6K/+YVl+sfL6aozh5Kjg3OW9a2BvVHGz/dp
	h431oz/5wz0eCKSApXSuuS5a9nxIcDo4fiPOg8vSrYdwJV7IzfVNZcCKgPw/4CGq6cQA
	c0gg==
X-Received: by 10.55.80.194 with SMTP id e185mr46760755qkb.68.1450143425991;
	Mon, 14 Dec 2015 17:37:05 -0800 (PST)
Received: from smartin-envy.nemo.cl ([186.37.23.255])
	by smtp.gmail.com with ESMTPSA id 207sm300088qhy.47.2015.12.14.17.37.04
	for <win-pv-devel@lists.xenproject.org>
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 14 Dec 2015 17:37:05 -0800 (PST)
Date: Mon, 14 Dec 2015 22:37:02 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1677432642.20151214223702@gmail.com>
To: win-pv-devel@lists.xenproject.org
In-Reply-To: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
MIME-Version: 1.0
Subject: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi all,

First mail to this list. I need to push USB hub devices through to a
Windows HVM. It seems that the USB driver in the old GPLPV drivers has
been deprecated so I am wondering how to achieve this.

Is anyone working on a PV USB driver?

Can we achieve this via qemu?

Regards.

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 01:37:13 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 01:37:13 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8eYB-0005Jv-Gs; Tue, 15 Dec 2015 01:37:11 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a8eYA-0005Jq-4E
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 01:37:10 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	15/3E-31122-5CE6F665; Tue, 15 Dec 2015 01:37:09 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-15.tower-21.messagelabs.com!1450143426!5385473!1
X-Originating-IP: [209.85.220.172]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 14772 invoked from network); 15 Dec 2015 01:37:07 -0000
Received: from mail-qk0-f172.google.com (HELO mail-qk0-f172.google.com)
	(209.85.220.172)
	by server-15.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 01:37:07 -0000
Received: by qkfb125 with SMTP id b125so165610524qkf.2
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 14 Dec 2015 17:37:06 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:subject:in-reply-to:references:mime-version
	:content-type:content-transfer-encoding;
	bh=XlcOeu7CFEnH4D4vV+NjUoe6UEP853DbU9Ill85t7Fg=;
	b=XCxcFh5jk+B6f9jRxWYwaJSFF7MmB0m8OgBNiwEahdyxAPR3sebNTxy3pPPBBsiIpR
	uyZ3LNM+9Hvpr5xqSCsEq/xSyTTUvgT9nCAonkIjpe97MNNmJGu9ufc2hflpkwSs+KHP
	MPWmu9DrJR9WP6q5umFoAIlO50hG19EMh2MQ0qd3CExE8gF2p4JcZlGkkp0bW4y8gxp/
	ntNlJiGAq7F+G7ZS+KtatMzVKIp2aSTzY6K/+YVl+sfL6aozh5Kjg3OW9a2BvVHGz/dp
	h431oz/5wz0eCKSApXSuuS5a9nxIcDo4fiPOg8vSrYdwJV7IzfVNZcCKgPw/4CGq6cQA
	c0gg==
X-Received: by 10.55.80.194 with SMTP id e185mr46760755qkb.68.1450143425991;
	Mon, 14 Dec 2015 17:37:05 -0800 (PST)
Received: from smartin-envy.nemo.cl ([186.37.23.255])
	by smtp.gmail.com with ESMTPSA id 207sm300088qhy.47.2015.12.14.17.37.04
	for <win-pv-devel@lists.xenproject.org>
	(version=TLSv1/SSLv3 cipher=OTHER);
	Mon, 14 Dec 2015 17:37:05 -0800 (PST)
Date: Mon, 14 Dec 2015 22:37:02 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1677432642.20151214223702@gmail.com>
To: win-pv-devel@lists.xenproject.org
In-Reply-To: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
MIME-Version: 1.0
Subject: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hi all,

First mail to this list. I need to push USB hub devices through to a
Windows HVM. It seems that the USB driver in the old GPLPV drivers has
been deprecated so I am wondering how to achieve this.

Is anyone working on a PV USB driver?

Can we achieve this via qemu?

Regards.

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 09:45:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 09:45:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8mAN-0001tY-SG; Tue, 15 Dec 2015 09:45:07 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=784ebad35=Paul.Durrant@citrix.com>)
	id 1a8mAN-0001tL-7f
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 09:45:07 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	68/5E-01753-221EF665; Tue, 15 Dec 2015 09:45:06 +0000
X-Env-Sender: prvs=784ebad35=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1450172700!10731198!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28667 invoked from network); 15 Dec 2015 09:45:02 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 09:45:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="10075404"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Simon Martin <furryfuttock@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] USB driver
Thread-Index: AQHRNtk1U2LmeMaTc0updl5I8+IWiZ7LyIAQ
Date: Tue, 15 Dec 2015 09:44:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
In-Reply-To: <1677432642.20151214223702@gmail.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Simon Martin
> Sent: 15 December 2015 01:37
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] USB driver
> 
> Hi all,
> 
> First mail to this list. I need to push USB hub devices through to a
> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
> been deprecated so I am wondering how to achieve this.
> 
> Is anyone working on a PV USB driver?
> 

Unfortunately I don't believe anyone is working on a PV USB driver. I would certainly welcome it if someone did though... 

> Can we achieve this via qemu?
> 

Maybe. Documentation suggests that the -usbdevice option can be used to assign a host USB device to a guest.

  Paul

> Regards.
> 
> --
> Best regards,
>  Simon                            mailto:furryfuttock@gmail.com
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 09:45:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 09:45:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8mAN-0001tY-SG; Tue, 15 Dec 2015 09:45:07 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=784ebad35=Paul.Durrant@citrix.com>)
	id 1a8mAN-0001tL-7f
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 09:45:07 +0000
Received: from [85.158.137.68] by server-3.bemta-3.messagelabs.com id
	68/5E-01753-221EF665; Tue, 15 Dec 2015 09:45:06 +0000
X-Env-Sender: prvs=784ebad35=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1450172700!10731198!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 28667 invoked from network); 15 Dec 2015 09:45:02 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 09:45:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="10075404"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Simon Martin <furryfuttock@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] USB driver
Thread-Index: AQHRNtk1U2LmeMaTc0updl5I8+IWiZ7LyIAQ
Date: Tue, 15 Dec 2015 09:44:54 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
In-Reply-To: <1677432642.20151214223702@gmail.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Simon Martin
> Sent: 15 December 2015 01:37
> To: win-pv-devel@lists.xenproject.org
> Subject: [win-pv-devel] USB driver
> 
> Hi all,
> 
> First mail to this list. I need to push USB hub devices through to a
> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
> been deprecated so I am wondering how to achieve this.
> 
> Is anyone working on a PV USB driver?
> 

Unfortunately I don't believe anyone is working on a PV USB driver. I would certainly welcome it if someone did though... 

> Can we achieve this via qemu?
> 

Maybe. Documentation suggests that the -usbdevice option can be used to assign a host USB device to a guest.

  Paul

> Regards.
> 
> --
> Best regards,
>  Simon                            mailto:furryfuttock@gmail.com
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:19:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:19:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8ndY-00073z-DT; Tue, 15 Dec 2015 11:19:20 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a8ndX-00073r-6H
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:19:19 +0000
Received: from [85.158.137.68] by server-17.bemta-3.messagelabs.com id
	66/F5-02940-637FF665; Tue, 15 Dec 2015 11:19:18 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1450178355!3264489!1
X-Originating-IP: [209.85.220.195]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 53165 invoked from network); 15 Dec 2015 11:19:16 -0000
Received: from mail-qk0-f195.google.com (HELO mail-qk0-f195.google.com)
	(209.85.220.195)
	by server-7.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 11:19:16 -0000
Received: by mail-qk0-f195.google.com with SMTP id t125so697342qkh.2
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 03:19:16 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:subject:in-reply-to:references:mime-version
	:content-type:content-transfer-encoding;
	bh=fLxmpnGIOBr2Fu1hjN7kAWrOTSM3TGezXmJw+5wBMDs=;
	b=JAwXtILvwyK8KTZqyQG48GqHT8PUwoBidS1YASyMkuDqS4ZdP8d03ggxU3P8RSqSKl
	+HQRrRsZphPcu4e3XRU/GAYUh6sSAdDibg9ciSiznmZi/f/jEosQgURufhR6s4+PTNrd
	gq/j1zwbnCNQq5kAEQoNCfykLWldgA9M7kEJNSLMZuSd3UH/VoH662KSv2xZBhSNaWoe
	HwQ0KYQhgKBlJNr5fEm+p2vjHijmwTtlOBlBkH4x7ZEJUGD2NFLvoK/aV+rdEYfXFBLm
	8bXac0tfqQTbWU0FruLjY0nKXCvk+KSkeBVNnfbCFk+PQofH10fHy7E0GWhkYEwJ/5QS
	XnMQ==
X-Received: by 10.55.78.78 with SMTP id c75mr50007332qkb.71.1450178350674;
	Tue, 15 Dec 2015 03:19:10 -0800 (PST)
Received: from smartin-envy.nemo.cl ([186.37.113.140])
	by smtp.gmail.com with ESMTPSA id f66sm280840qkb.5.2015.12.15.03.19.04
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 03:19:10 -0800 (PST)
Date: Tue, 15 Dec 2015 08:18:52 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1556964289.20151215081852@gmail.com>
To: Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com> 
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
MIME-Version: 1.0
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Paul,

Tuesday, December 15, 2015, 6:44:54 AM, you wrote:

<snip>
>> Is anyone working on a PV USB driver?
>> 

> Unfortunately I don't believe anyone is working on a PV USB driver.
> I would certainly welcome it if someone did though... 

>> Can we achieve this via qemu?
>> 

> Maybe. Documentation suggests that the -usbdevice option can be
> used to assign a host USB device to a guest.

<snip>

As far as I can see from the QEMU documentation, we can push through a
USB  device  (telephone,  etc), but not the USB hub itself. This means
that  I would have to have a process running in Dom0 monitoring device
insertion  and  hot-configuring  QEMU.  Not  sure  if  QEMU allows hot
configuring.

I'll  pull  down  the  old GPLPV drivers and see what I can get out of
there.  Supposedly  splice  protocol allows USB forwarding, has anyone
tried it?

Regards.

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:19:21 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:19:21 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8ndY-00073z-DT; Tue, 15 Dec 2015 11:19:20 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a8ndX-00073r-6H
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:19:19 +0000
Received: from [85.158.137.68] by server-17.bemta-3.messagelabs.com id
	66/F5-02940-637FF665; Tue, 15 Dec 2015 11:19:18 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-7.tower-31.messagelabs.com!1450178355!3264489!1
X-Originating-IP: [209.85.220.195]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 53165 invoked from network); 15 Dec 2015 11:19:16 -0000
Received: from mail-qk0-f195.google.com (HELO mail-qk0-f195.google.com)
	(209.85.220.195)
	by server-7.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 11:19:16 -0000
Received: by mail-qk0-f195.google.com with SMTP id t125so697342qkh.2
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 03:19:16 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:subject:in-reply-to:references:mime-version
	:content-type:content-transfer-encoding;
	bh=fLxmpnGIOBr2Fu1hjN7kAWrOTSM3TGezXmJw+5wBMDs=;
	b=JAwXtILvwyK8KTZqyQG48GqHT8PUwoBidS1YASyMkuDqS4ZdP8d03ggxU3P8RSqSKl
	+HQRrRsZphPcu4e3XRU/GAYUh6sSAdDibg9ciSiznmZi/f/jEosQgURufhR6s4+PTNrd
	gq/j1zwbnCNQq5kAEQoNCfykLWldgA9M7kEJNSLMZuSd3UH/VoH662KSv2xZBhSNaWoe
	HwQ0KYQhgKBlJNr5fEm+p2vjHijmwTtlOBlBkH4x7ZEJUGD2NFLvoK/aV+rdEYfXFBLm
	8bXac0tfqQTbWU0FruLjY0nKXCvk+KSkeBVNnfbCFk+PQofH10fHy7E0GWhkYEwJ/5QS
	XnMQ==
X-Received: by 10.55.78.78 with SMTP id c75mr50007332qkb.71.1450178350674;
	Tue, 15 Dec 2015 03:19:10 -0800 (PST)
Received: from smartin-envy.nemo.cl ([186.37.113.140])
	by smtp.gmail.com with ESMTPSA id f66sm280840qkb.5.2015.12.15.03.19.04
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 03:19:10 -0800 (PST)
Date: Tue, 15 Dec 2015 08:18:52 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1556964289.20151215081852@gmail.com>
To: Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com> 
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
MIME-Version: 1.0
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Paul,

Tuesday, December 15, 2015, 6:44:54 AM, you wrote:

<snip>
>> Is anyone working on a PV USB driver?
>> 

> Unfortunately I don't believe anyone is working on a PV USB driver.
> I would certainly welcome it if someone did though... 

>> Can we achieve this via qemu?
>> 

> Maybe. Documentation suggests that the -usbdevice option can be
> used to assign a host USB device to a guest.

<snip>

As far as I can see from the QEMU documentation, we can push through a
USB  device  (telephone,  etc), but not the USB hub itself. This means
that  I would have to have a process running in Dom0 monitoring device
insertion  and  hot-configuring  QEMU.  Not  sure  if  QEMU allows hot
configuring.

I'll  pull  down  the  old GPLPV drivers and see what I can get out of
there.  Supposedly  splice  protocol allows USB forwarding, has anyone
tried it?

Regards.

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:34:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:34:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8nrs-0007i9-0U; Tue, 15 Dec 2015 11:34:08 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=78418cd26=owen.smith@citrix.com>)
	id 1a8nrq-0007hf-Lf
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:34:06 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	F7/47-31122-EAAFF665; Tue, 15 Dec 2015 11:34:06 +0000
X-Env-Sender: prvs=78418cd26=owen.smith@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1450179229!5471973!2
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26052 invoked from network); 15 Dec 2015 11:34:05 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 11:34:05 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="325130818"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 15 Dec 2015 11:30:19 +0000
Message-ID: <1450179020-9864-2-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions to
	Inflate/Deflate calls
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenbus/balloon.c | 53 ++++++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index e697722..e2ce8de 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -572,6 +572,25 @@ done:
 }
 
 static BOOLEAN
+BalloonLowMemory(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    )
+{
+    LARGE_INTEGER               Timeout;
+    NTSTATUS                    status;
+
+    Timeout.QuadPart = 0;
+
+    status = KeWaitForSingleObject(Context->LowMemoryEvent,
+                                   Executive,
+                                   KernelMode,
+                                   FALSE,
+                                   &Timeout);
+
+    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
+}
+
+static BOOLEAN
 BalloonDeflate(
     IN  PXENBUS_BALLOON_CONTEXT Context,
     IN  ULONGLONG               Requested
@@ -583,6 +602,9 @@ BalloonDeflate(
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    if (Context->FIST.Deflation)
+        return TRUE;
+
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
@@ -627,6 +649,11 @@ BalloonInflate(
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    if (Context->FIST.Inflation)
+        return TRUE;
+    if (BalloonLowMemory(Context))
+        return TRUE;
+
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
@@ -673,25 +700,6 @@ BalloonInflate(
     return Abort;
 }
 
-static BOOLEAN
-BalloonLowMemory(
-    IN  PXENBUS_BALLOON_CONTEXT Context
-    )
-{
-    LARGE_INTEGER               Timeout;
-    NTSTATUS                    status;
-
-    Timeout.QuadPart = 0;
-
-    status = KeWaitForSingleObject(Context->LowMemoryEvent,
-                                   Executive,
-                                   KernelMode,
-                                   FALSE,
-                                   &Timeout);
-
-    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
-}
-
 static VOID
 BalloonGetFISTEntries(
     IN  PXENBUS_BALLOON_CONTEXT Context
@@ -758,12 +766,9 @@ BalloonAdjust(
 
     while (Context->Size != Size && !Abort) {
         if (Size > Context->Size)
-            Abort = Context->FIST.Inflation ||
-                    BalloonLowMemory(Context) ||
-                    BalloonInflate(Context, Size - Context->Size);
+            Abort = BalloonInflate(Context, Size - Context->Size);
         else if (Size < Context->Size)
-            Abort = Context->FIST.Deflation ||
-                    BalloonDeflate(Context, Context->Size - Size);
+            Abort = BalloonDeflate(Context, Context->Size - Size);
     }
 
     Info("<==== (%llu page(s))%s\n",
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:34:08 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:34:08 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8nrs-0007i9-0U; Tue, 15 Dec 2015 11:34:08 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=78418cd26=owen.smith@citrix.com>)
	id 1a8nrq-0007hf-Lf
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:34:06 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	F7/47-31122-EAAFF665; Tue, 15 Dec 2015 11:34:06 +0000
X-Env-Sender: prvs=78418cd26=owen.smith@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1450179229!5471973!2
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26052 invoked from network); 15 Dec 2015 11:34:05 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 11:34:05 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="325130818"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 15 Dec 2015 11:30:19 +0000
Message-ID: <1450179020-9864-2-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions to
	Inflate/Deflate calls
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenbus/balloon.c | 53 ++++++++++++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 24 deletions(-)

diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index e697722..e2ce8de 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -572,6 +572,25 @@ done:
 }
 
 static BOOLEAN
+BalloonLowMemory(
+    IN  PXENBUS_BALLOON_CONTEXT Context
+    )
+{
+    LARGE_INTEGER               Timeout;
+    NTSTATUS                    status;
+
+    Timeout.QuadPart = 0;
+
+    status = KeWaitForSingleObject(Context->LowMemoryEvent,
+                                   Executive,
+                                   KernelMode,
+                                   FALSE,
+                                   &Timeout);
+
+    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
+}
+
+static BOOLEAN
 BalloonDeflate(
     IN  PXENBUS_BALLOON_CONTEXT Context,
     IN  ULONGLONG               Requested
@@ -583,6 +602,9 @@ BalloonDeflate(
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    if (Context->FIST.Deflation)
+        return TRUE;
+
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
@@ -627,6 +649,11 @@ BalloonInflate(
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    if (Context->FIST.Inflation)
+        return TRUE;
+    if (BalloonLowMemory(Context))
+        return TRUE;
+
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
@@ -673,25 +700,6 @@ BalloonInflate(
     return Abort;
 }
 
-static BOOLEAN
-BalloonLowMemory(
-    IN  PXENBUS_BALLOON_CONTEXT Context
-    )
-{
-    LARGE_INTEGER               Timeout;
-    NTSTATUS                    status;
-
-    Timeout.QuadPart = 0;
-
-    status = KeWaitForSingleObject(Context->LowMemoryEvent,
-                                   Executive,
-                                   KernelMode,
-                                   FALSE,
-                                   &Timeout);
-
-    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
-}
-
 static VOID
 BalloonGetFISTEntries(
     IN  PXENBUS_BALLOON_CONTEXT Context
@@ -758,12 +766,9 @@ BalloonAdjust(
 
     while (Context->Size != Size && !Abort) {
         if (Size > Context->Size)
-            Abort = Context->FIST.Inflation ||
-                    BalloonLowMemory(Context) ||
-                    BalloonInflate(Context, Size - Context->Size);
+            Abort = BalloonInflate(Context, Size - Context->Size);
         else if (Size < Context->Size)
-            Abort = Context->FIST.Deflation ||
-                    BalloonDeflate(Context, Context->Size - Size);
+            Abort = BalloonDeflate(Context, Context->Size - Size);
     }
 
     Info("<==== (%llu page(s))%s\n",
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:34:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:34:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8nru-0007il-3R; Tue, 15 Dec 2015 11:34:10 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=78418cd26=owen.smith@citrix.com>)
	id 1a8nrs-0007hf-97
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:34:08 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	C1/57-31122-0BAFF665; Tue, 15 Dec 2015 11:34:08 +0000
X-Env-Sender: prvs=78418cd26=owen.smith@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1450179229!5471973!3
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27661 invoked from network); 15 Dec 2015 11:34:06 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 11:34:06 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="325130819"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 15 Dec 2015 11:30:20 +0000
Message-ID: <1450179020-9864-3-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 3/3] Return more error codes from
	Inflate/Deflate
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenbus/balloon.c | 69 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 45 insertions(+), 24 deletions(-)

diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index e2ce8de..5ef30a1 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -590,7 +590,7 @@ BalloonLowMemory(
     return (status == STATUS_SUCCESS) ? TRUE : FALSE;
 }
 
-static BOOLEAN
+static NTSTATUS
 BalloonDeflate(
     IN  PXENBUS_BALLOON_CONTEXT Context,
     IN  ULONGLONG               Requested
@@ -598,28 +598,29 @@ BalloonDeflate(
 {
     LARGE_INTEGER               Start;
     LARGE_INTEGER               End;
-    BOOLEAN                     Abort;
+    NTSTATUS                    status;
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    status = STATUS_UNSUCCESSFUL;
     if (Context->FIST.Deflation)
-        return TRUE;
+        goto done;
 
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
 
     Count = 0;
-    Abort = FALSE;
+    status = STATUS_SUCCESS;
 
-    while (Count < Requested && !Abort) {
+    while (Count < Requested && NT_SUCCESS(status)) {
         ULONG   ThisTime = (ULONG)__min(Requested - Count, XENBUS_BALLOON_PFN_ARRAY_SIZE);
         ULONG   Populated;
         ULONG   Freed;
 
         Populated = BalloonPopulatePfnArray(Context, ThisTime);
         if (Populated < ThisTime)
-            Abort = TRUE;
+            status = STATUS_RETRY;
 
         Freed = BalloonFreePfnArray(Context, Populated, TRUE);
         ASSERT(Freed == Populated);
@@ -634,10 +635,11 @@ BalloonDeflate(
     Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
     Context->Size -= Count;
 
-    return Abort;
+done:
+    return status;
 }
 
-static BOOLEAN
+static NTSTATUS
 BalloonInflate(
     IN  PXENBUS_BALLOON_CONTEXT Context,
     IN  ULONGLONG               Requested
@@ -645,23 +647,26 @@ BalloonInflate(
 {
     LARGE_INTEGER               Start;
     LARGE_INTEGER               End;
-    BOOLEAN                     Abort;
+    NTSTATUS                    status;
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    status = STATUS_UNSUCCESSFUL;
     if (Context->FIST.Inflation)
-        return TRUE;
+        goto done;
+
+    status = STATUS_NO_MEMORY;
     if (BalloonLowMemory(Context))
-        return TRUE;
+        goto done;
 
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
 
     Count = 0;
-    Abort = FALSE;
+    status = STATUS_SUCCESS;
 
-    while (Count < Requested && !Abort) {
+    while (Count < Requested && NT_SUCCESS(status)) {
         ULONG   ThisTime = (ULONG)__min(Requested - Count, XENBUS_BALLOON_PFN_ARRAY_SIZE);
         ULONG   Allocated;
         BOOLEAN Slow;
@@ -669,7 +674,7 @@ BalloonInflate(
 
         Allocated = BalloonAllocatePfnArray(Context, ThisTime, &Slow);
         if (Allocated < ThisTime || Slow)
-            Abort = TRUE;
+            status = STATUS_RETRY;
 
         Released = BalloonReleasePfnArray(Context, Allocated);
 
@@ -685,7 +690,7 @@ BalloonInflate(
         }
 
         if (Released == 0)
-            Abort = TRUE;
+            status = STATUS_RETRY;
 
         Count += Released;
     }
@@ -697,7 +702,8 @@ BalloonInflate(
     Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
     Context->Size += Count;
 
-    return Abort;
+done:
+    return status;
 }
 
 static VOID
@@ -747,6 +753,20 @@ BalloonGetFISTEntries(
         Warning("deflation disallowed\n");
 }
 
+static FORCEINLINE PCHAR
+__BalloonStatus(
+    IN  NTSTATUS    status
+    )
+{
+    switch (status) {
+    case STATUS_SUCCESS:        return "";
+    case STATUS_UNSUCCESSFUL:   return " [FIST]";
+    case STATUS_RETRY:          return " [RETRY]";
+    case STATUS_NO_MEMORY:      return " [LOW_MEM]";
+    default:                    return " [UNKNOWN]";
+    }
+}
+
 NTSTATUS
 BalloonAdjust(
     IN  PINTERFACE          Interface,
@@ -754,28 +774,29 @@ BalloonAdjust(
     )
 {
     PXENBUS_BALLOON_CONTEXT Context = Interface->Context;
-    BOOLEAN                 Abort;
+    NTSTATUS                status;
 
     ASSERT3U(KeGetCurrentIrql(), <, DISPATCH_LEVEL);
 
     Info("====> (%llu page(s))\n", Context->Size);
 
-    Abort = FALSE;
+    status = STATUS_SUCCESS;
 
     BalloonGetFISTEntries(Context);
 
-    while (Context->Size != Size && !Abort) {
+    while (Context->Size != Size && NT_SUCCESS(status)) {
         if (Size > Context->Size)
-            Abort = BalloonInflate(Context, Size - Context->Size);
+            status = BalloonInflate(Context, Size - Context->Size);
         else if (Size < Context->Size)
-            Abort = BalloonDeflate(Context, Context->Size - Size);
+            status = BalloonDeflate(Context, Context->Size - Size);
     }
 
-    Info("<==== (%llu page(s))%s\n",
+    Info("<==== (%llu page(s))%s%s\n",
          Context->Size,
-         (Abort) ? " [ABORTED]" : "");
+         NT_SUCCESS(status) ? "" : " [ABORTED]",
+         __BalloonStatus(status));
 
-    return (Abort) ? STATUS_RETRY : STATUS_SUCCESS;
+    return status;
 }
 
 ULONGLONG
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:34:10 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:34:10 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8nru-0007il-3R; Tue, 15 Dec 2015 11:34:10 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=78418cd26=owen.smith@citrix.com>)
	id 1a8nrs-0007hf-97
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:34:08 +0000
Received: from [85.158.143.35] by server-3.bemta-4.messagelabs.com id
	C1/57-31122-0BAFF665; Tue, 15 Dec 2015 11:34:08 +0000
X-Env-Sender: prvs=78418cd26=owen.smith@citrix.com
X-Msg-Ref: server-4.tower-21.messagelabs.com!1450179229!5471973!3
X-Originating-IP: [66.165.176.63]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27661 invoked from network); 15 Dec 2015 11:34:06 -0000
Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63)
	by server-4.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 11:34:06 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="325130819"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 15 Dec 2015 11:30:20 +0000
Message-ID: <1450179020-9864-3-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
In-Reply-To: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 3/3] Return more error codes from
	Inflate/Deflate
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenbus/balloon.c | 69 ++++++++++++++++++++++++++++++++++------------------
 1 file changed, 45 insertions(+), 24 deletions(-)

diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
index e2ce8de..5ef30a1 100644
--- a/src/xenbus/balloon.c
+++ b/src/xenbus/balloon.c
@@ -590,7 +590,7 @@ BalloonLowMemory(
     return (status == STATUS_SUCCESS) ? TRUE : FALSE;
 }
 
-static BOOLEAN
+static NTSTATUS
 BalloonDeflate(
     IN  PXENBUS_BALLOON_CONTEXT Context,
     IN  ULONGLONG               Requested
@@ -598,28 +598,29 @@ BalloonDeflate(
 {
     LARGE_INTEGER               Start;
     LARGE_INTEGER               End;
-    BOOLEAN                     Abort;
+    NTSTATUS                    status;
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    status = STATUS_UNSUCCESSFUL;
     if (Context->FIST.Deflation)
-        return TRUE;
+        goto done;
 
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
 
     Count = 0;
-    Abort = FALSE;
+    status = STATUS_SUCCESS;
 
-    while (Count < Requested && !Abort) {
+    while (Count < Requested && NT_SUCCESS(status)) {
         ULONG   ThisTime = (ULONG)__min(Requested - Count, XENBUS_BALLOON_PFN_ARRAY_SIZE);
         ULONG   Populated;
         ULONG   Freed;
 
         Populated = BalloonPopulatePfnArray(Context, ThisTime);
         if (Populated < ThisTime)
-            Abort = TRUE;
+            status = STATUS_RETRY;
 
         Freed = BalloonFreePfnArray(Context, Populated, TRUE);
         ASSERT(Freed == Populated);
@@ -634,10 +635,11 @@ BalloonDeflate(
     Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
     Context->Size -= Count;
 
-    return Abort;
+done:
+    return status;
 }
 
-static BOOLEAN
+static NTSTATUS
 BalloonInflate(
     IN  PXENBUS_BALLOON_CONTEXT Context,
     IN  ULONGLONG               Requested
@@ -645,23 +647,26 @@ BalloonInflate(
 {
     LARGE_INTEGER               Start;
     LARGE_INTEGER               End;
-    BOOLEAN                     Abort;
+    NTSTATUS                    status;
     ULONGLONG                   Count;
     ULONGLONG                   TimeDelta;
 
+    status = STATUS_UNSUCCESSFUL;
     if (Context->FIST.Inflation)
-        return TRUE;
+        goto done;
+
+    status = STATUS_NO_MEMORY;
     if (BalloonLowMemory(Context))
-        return TRUE;
+        goto done;
 
     Info("====> %llu page(s)\n", Requested);
 
     KeQuerySystemTime(&Start);
 
     Count = 0;
-    Abort = FALSE;
+    status = STATUS_SUCCESS;
 
-    while (Count < Requested && !Abort) {
+    while (Count < Requested && NT_SUCCESS(status)) {
         ULONG   ThisTime = (ULONG)__min(Requested - Count, XENBUS_BALLOON_PFN_ARRAY_SIZE);
         ULONG   Allocated;
         BOOLEAN Slow;
@@ -669,7 +674,7 @@ BalloonInflate(
 
         Allocated = BalloonAllocatePfnArray(Context, ThisTime, &Slow);
         if (Allocated < ThisTime || Slow)
-            Abort = TRUE;
+            status = STATUS_RETRY;
 
         Released = BalloonReleasePfnArray(Context, Allocated);
 
@@ -685,7 +690,7 @@ BalloonInflate(
         }
 
         if (Released == 0)
-            Abort = TRUE;
+            status = STATUS_RETRY;
 
         Count += Released;
     }
@@ -697,7 +702,8 @@ BalloonInflate(
     Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
     Context->Size += Count;
 
-    return Abort;
+done:
+    return status;
 }
 
 static VOID
@@ -747,6 +753,20 @@ BalloonGetFISTEntries(
         Warning("deflation disallowed\n");
 }
 
+static FORCEINLINE PCHAR
+__BalloonStatus(
+    IN  NTSTATUS    status
+    )
+{
+    switch (status) {
+    case STATUS_SUCCESS:        return "";
+    case STATUS_UNSUCCESSFUL:   return " [FIST]";
+    case STATUS_RETRY:          return " [RETRY]";
+    case STATUS_NO_MEMORY:      return " [LOW_MEM]";
+    default:                    return " [UNKNOWN]";
+    }
+}
+
 NTSTATUS
 BalloonAdjust(
     IN  PINTERFACE          Interface,
@@ -754,28 +774,29 @@ BalloonAdjust(
     )
 {
     PXENBUS_BALLOON_CONTEXT Context = Interface->Context;
-    BOOLEAN                 Abort;
+    NTSTATUS                status;
 
     ASSERT3U(KeGetCurrentIrql(), <, DISPATCH_LEVEL);
 
     Info("====> (%llu page(s))\n", Context->Size);
 
-    Abort = FALSE;
+    status = STATUS_SUCCESS;
 
     BalloonGetFISTEntries(Context);
 
-    while (Context->Size != Size && !Abort) {
+    while (Context->Size != Size && NT_SUCCESS(status)) {
         if (Size > Context->Size)
-            Abort = BalloonInflate(Context, Size - Context->Size);
+            status = BalloonInflate(Context, Size - Context->Size);
         else if (Size < Context->Size)
-            Abort = BalloonDeflate(Context, Context->Size - Size);
+            status = BalloonDeflate(Context, Context->Size - Size);
     }
 
-    Info("<==== (%llu page(s))%s\n",
+    Info("<==== (%llu page(s))%s%s\n",
          Context->Size,
-         (Abort) ? " [ABORTED]" : "");
+         NT_SUCCESS(status) ? "" : " [ABORTED]",
+         __BalloonStatus(status));
 
-    return (Abort) ? STATUS_RETRY : STATUS_SUCCESS;
+    return status;
 }
 
 ULONGLONG
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:46:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:46:00 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8o3L-0000Bi-Sc; Tue, 15 Dec 2015 11:45:59 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=78418cd26=owen.smith@citrix.com>)
	id 1a8o3K-0000BP-I1
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:45:58 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	18/F0-14715-57DFF665; Tue, 15 Dec 2015 11:45:57 +0000
X-Env-Sender: prvs=78418cd26=owen.smith@citrix.com
X-Msg-Ref: server-9.tower-31.messagelabs.com!1450179952!1437113!2
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8577 invoked from network); 15 Dec 2015 11:45:57 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-9.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 11:45:57 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="318948788"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 15 Dec 2015 11:30:18 +0000
Message-ID: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has not
	completed within 20 minutes
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Since there is no way of reporting balloon failures to the toolstack,
the only way of stopping a VM from attempting to balloon indefinitely
is to BSOD after a large timeout.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenbus/fdo.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 9c9e380..722a4b3 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3356,29 +3356,31 @@ not_active:
         goto fail8;
 
     if (Fdo->BalloonInterface.Interface.Context != NULL) {
-        BOOLEAN Warned;
+        LARGE_INTEGER   Timeout;
 
         ASSERT(__FdoIsActive(Fdo));
 
-        Warned = FALSE;
+        // Balloon should complete within 10s
+        Timeout.QuadPart = TIME_RELATIVE(TIME_S(10));
 
-        for (;;) {
-            LARGE_INTEGER   Timeout;
+        status = KeWaitForSingleObject(&Fdo->BalloonEvent,
+                                        Executive,
+                                        KernelMode,
+                                        FALSE,
+                                        &Timeout);
+        if (status == STATUS_TIMEOUT) {
+            Warning("waiting for balloon\n");
 
-            Timeout.QuadPart = TIME_RELATIVE(TIME_S(BALLOON_PAUSE));
+            // Wait for up to 20mins (total) before BSOD
+            Timeout.QuadPart = TIME_RELATIVE(TIME_S(1190ll));
 
             status = KeWaitForSingleObject(&Fdo->BalloonEvent,
-                                           Executive,
-                                           KernelMode,
-                                           FALSE,
-                                           &Timeout);
-            if (status != STATUS_TIMEOUT)
-                break;
-
-            if (!Warned) {
-                Warning("waiting for balloon\n");
-                Warned = TRUE;
-            }
+                                            Executive,
+                                            KernelMode,
+                                            FALSE,
+                                            &Timeout);
+            Error("Waited for Balloon (%08x)\n", status);
+            BUG_ON(status == STATUS_TIMEOUT);
         }
     }
 
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 11:46:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 11:46:00 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8o3L-0000Bi-Sc; Tue, 15 Dec 2015 11:45:59 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=78418cd26=owen.smith@citrix.com>)
	id 1a8o3K-0000BP-I1
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 11:45:58 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	18/F0-14715-57DFF665; Tue, 15 Dec 2015 11:45:57 +0000
X-Env-Sender: prvs=78418cd26=owen.smith@citrix.com
X-Msg-Ref: server-9.tower-31.messagelabs.com!1450179952!1437113!2
X-Originating-IP: [66.165.176.89]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 8577 invoked from network); 15 Dec 2015 11:45:57 -0000
Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89)
	by server-9.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 11:45:57 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="318948788"
From: Owen Smith <owen.smith@citrix.com>
To: <win-pv-devel@lists.xenproject.org>
Date: Tue, 15 Dec 2015 11:30:18 +0000
Message-ID: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
X-Mailer: git-send-email 1.9.4.msysgit.1
MIME-Version: 1.0
X-DLP: MIA1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has not
	completed within 20 minutes
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Since there is no way of reporting balloon failures to the toolstack,
the only way of stopping a VM from attempting to balloon indefinitely
is to BSOD after a large timeout.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
---
 src/xenbus/fdo.c | 34 ++++++++++++++++++----------------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
index 9c9e380..722a4b3 100644
--- a/src/xenbus/fdo.c
+++ b/src/xenbus/fdo.c
@@ -3356,29 +3356,31 @@ not_active:
         goto fail8;
 
     if (Fdo->BalloonInterface.Interface.Context != NULL) {
-        BOOLEAN Warned;
+        LARGE_INTEGER   Timeout;
 
         ASSERT(__FdoIsActive(Fdo));
 
-        Warned = FALSE;
+        // Balloon should complete within 10s
+        Timeout.QuadPart = TIME_RELATIVE(TIME_S(10));
 
-        for (;;) {
-            LARGE_INTEGER   Timeout;
+        status = KeWaitForSingleObject(&Fdo->BalloonEvent,
+                                        Executive,
+                                        KernelMode,
+                                        FALSE,
+                                        &Timeout);
+        if (status == STATUS_TIMEOUT) {
+            Warning("waiting for balloon\n");
 
-            Timeout.QuadPart = TIME_RELATIVE(TIME_S(BALLOON_PAUSE));
+            // Wait for up to 20mins (total) before BSOD
+            Timeout.QuadPart = TIME_RELATIVE(TIME_S(1190ll));
 
             status = KeWaitForSingleObject(&Fdo->BalloonEvent,
-                                           Executive,
-                                           KernelMode,
-                                           FALSE,
-                                           &Timeout);
-            if (status != STATUS_TIMEOUT)
-                break;
-
-            if (!Warned) {
-                Warning("waiting for balloon\n");
-                Warned = TRUE;
-            }
+                                            Executive,
+                                            KernelMode,
+                                            FALSE,
+                                            &Timeout);
+            Error("Waited for Balloon (%08x)\n", status);
+            BUG_ON(status == STATUS_TIMEOUT);
         }
     }
 
-- 
1.9.4.msysgit.1


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 12:12:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 12:12:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8oSu-0002NS-Tb; Tue, 15 Dec 2015 12:12:24 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=784ebad35=Paul.Durrant@citrix.com>)
	id 1a8oSt-0002NK-MQ
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 12:12:23 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	04/6E-21901-7A300765; Tue, 15 Dec 2015 12:12:23 +0000
X-Env-Sender: prvs=784ebad35=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1450181542!10523191!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18883 invoked from network); 15 Dec 2015 12:12:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 12:12:22 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="10084538"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Simon Martin <furryfuttock@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] USB driver
Thread-Index: AQHRNtk1U2LmeMaTc0updl5I8+IWiZ7LyIAQgAANywCAABf6MA==
Date: Tue, 15 Dec 2015 11:52:02 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1556964289.20151215081852@gmail.com>
In-Reply-To: <1556964289.20151215081852@gmail.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "Fabio Fantoni \(fabio.fantoni@m2r.biz\)" <fabio.fantoni@m2r.biz>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
[snip]
> >> Can we achieve this via qemu?
> >>
> 
> > Maybe. Documentation suggests that the -usbdevice option can be
> > used to assign a host USB device to a guest.
> 
> <snip>
> 
> As far as I can see from the QEMU documentation, we can push through a
> USB  device  (telephone,  etc), but not the USB hub itself. This means
> that  I would have to have a process running in Dom0 monitoring device
> insertion  and  hot-configuring  QEMU.  Not  sure  if  QEMU allows hot
> configuring.
> 

It should do. You can use QMP to add devices dynamically, I believe.

> I'll  pull  down  the  old GPLPV drivers and see what I can get out of
> there.  Supposedly  splice  protocol allows USB forwarding, has anyone
> tried it?
> 

I assume you mean 'spice' rather than 'splice'? Googling around suggests that spice itself does not handle USB but there's a related 'usbredir' protocol that does. Not tried spice myself but I believe Fabio Fantoni (cc-ed) has had some success.

  Paul

> Regards.
> 
> --
> Best regards,
>  Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 12:12:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 12:12:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8oSu-0002NS-Tb; Tue, 15 Dec 2015 12:12:24 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=784ebad35=Paul.Durrant@citrix.com>)
	id 1a8oSt-0002NK-MQ
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 12:12:23 +0000
Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id
	04/6E-21901-7A300765; Tue, 15 Dec 2015 12:12:23 +0000
X-Env-Sender: prvs=784ebad35=Paul.Durrant@citrix.com
X-Msg-Ref: server-15.tower-206.messagelabs.com!1450181542!10523191!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 18883 invoked from network); 15 Dec 2015 12:12:22 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-15.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 12:12:22 -0000
X-IronPort-AV: E=Sophos;i="5.20,431,1444694400"; d="scan'208";a="10084538"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Simon Martin <furryfuttock@gmail.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] USB driver
Thread-Index: AQHRNtk1U2LmeMaTc0updl5I8+IWiZ7LyIAQgAANywCAABf6MA==
Date: Tue, 15 Dec 2015 11:52:02 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1556964289.20151215081852@gmail.com>
In-Reply-To: <1556964289.20151215081852@gmail.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "Fabio Fantoni \(fabio.fantoni@m2r.biz\)" <fabio.fantoni@m2r.biz>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
[snip]
> >> Can we achieve this via qemu?
> >>
> 
> > Maybe. Documentation suggests that the -usbdevice option can be
> > used to assign a host USB device to a guest.
> 
> <snip>
> 
> As far as I can see from the QEMU documentation, we can push through a
> USB  device  (telephone,  etc), but not the USB hub itself. This means
> that  I would have to have a process running in Dom0 monitoring device
> insertion  and  hot-configuring  QEMU.  Not  sure  if  QEMU allows hot
> configuring.
> 

It should do. You can use QMP to add devices dynamically, I believe.

> I'll  pull  down  the  old GPLPV drivers and see what I can get out of
> there.  Supposedly  splice  protocol allows USB forwarding, has anyone
> tried it?
> 

I assume you mean 'spice' rather than 'splice'? Googling around suggests that spice itself does not handle USB but there's a related 'usbredir' protocol that does. Not tried spice myself but I believe Fabio Fantoni (cc-ed) has had some success.

  Paul

> Regards.
> 
> --
> Best regards,
>  Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 14:12:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 14:12:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8qL6-0006be-Bx; Tue, 15 Dec 2015 14:12:28 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1a8qL4-0006bQ-Sc
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 14:12:27 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	03/4F-21571-ACF10765; Tue, 15 Dec 2015 14:12:26 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-8.tower-21.messagelabs.com!1450188731!5487225!1
X-Originating-IP: [74.125.82.43]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 52706 invoked from network); 15 Dec 2015 14:12:23 -0000
Received: from mail-wm0-f43.google.com (HELO mail-wm0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 14:12:23 -0000
Received: by mail-wm0-f43.google.com with SMTP id n186so166828864wmn.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 06:12:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r-biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=1IkLbsC5pQ7xVCI79CNJ9OdQ3uIpAwwM7kvtYyi/8Bo=;
	b=ia2sjtwaUIaQV0sengGD3YHpWFyFHOobAFzNWLkLD0ySI/HgMK/jedC6KGj98rlbmX
	sPb9s5OMt9v1bVYSHnMlANSR+mcttNUZLuXLVD9b/y8afHyVkR9ryX9ryjIQQfDqA/aG
	74Tp5WFHaL8BSiiyLnxmc1pUBl82niUrgY0K/WfK5arSvQuvwgQp7D/nehHM2eXns0dD
	EuDNUTWr7gLArVPlNEF8vNVEO6ghyxo43JfFAH/5ph0vl9yNNlOtegW2cVnkDBi/VZHL
	/DKO+9c7/gxH2jB8WLauQWhGEYjZhlbvOlS9H6IMxw1EW82XRtAeRveW+MiCpEB28EqI
	YinQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:subject:to:references:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=1IkLbsC5pQ7xVCI79CNJ9OdQ3uIpAwwM7kvtYyi/8Bo=;
	b=GIjWlgHHOi781I71ihC4xuHm84/L81mBa8nsLIQultz6ZK43bclLx2w6Xn2rM0UeRQ
	egwRDYGGcI559rw+fvgBYTl+7E+2xy7fz9WUthyR3bZs9d7Uw7S6XlWF9shnHwyeuS+l
	Ivq6y4Bs7cCCDBGo3C1/knz5ZZvsuevlBpOgW9xTFi0cO1EHLQe6TPf0m8F3XodwUy5c
	rChtmSC7pST1Fifex1s4lVddxpD9xp3mkTMz7K4bkJC/CAkNblWWLNwGWeMupNC9me6P
	NqQcW7NTjshh0fUs+dzdg0KDpjw55VfMGcLbChAS/1rg4yCLawwWimkaZxeYd5NVbdkq
	AJyg==
X-Gm-Message-State: ALoCoQndNdMA947SWBmFPsAPCgjsFm9nsXoZeHq70LytLoZLrq3rNwKAbafcL/kd/36Wmx3fkykdrKT5h7ywD9lnGW7YF17b5w==
X-Received: by 10.28.212.21 with SMTP id l21mr5073421wmg.91.1450188254133;
	Tue, 15 Dec 2015 06:04:14 -0800 (PST)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	b82sm21221204wmf.9.2015.12.15.06.04.12
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 06:04:13 -0800 (PST)
To: Paul Durrant <Paul.Durrant@citrix.com>, =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?=
	<et@etit.hu>, "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <565C293A.5030705@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56701DDF.4000008@m2r.biz>
Date: Tue, 15 Dec 2015 15:04:15 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
Content-Length: 2869
Subject: Re: [win-pv-devel] Windows 10 upgrade to new build with testsigning
 on -> FAIL
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="iso-8859-2"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Il 01/12/2015 12:36, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of =C9li=E1s Tam=E1s
>> Sent: 30 November 2015 10:47
>> To: xen-users@lists.xen.org; win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] Windows 10 upgrade to new build with testsigning
>> on -> FAIL
>>
>> Dear all.
>>
>>
>> I'm using several Windows 10 HVM DOMU-s with XEN4.6. I'm using
>> xen-winpv-devel drivers (latest ones, from November). Previously on the
>> xen-users and on the xen-winpv-development list several users inlcuding
>> me was wishing for signed develoment drivers.
>>
>> Now it seems, that the time has come to tell you, that it is now a
>> blocking condition.
>>
>> Upgrading windows 10 build to the latext 15xxx build automatically turns
>> off testsigning: this cause that upon next reboot during the upgrade
>> procedure, the windows 10 machines fail to start (due to xenbus is not
>> signed). The F8 is offered, I can select "turn off the requirement for
>> digital signature of the drivers", and reboot. Unfortunately the upgrade
>> realizes, that "something did not go well", and immediately starts
>> uninstalling the upgrade package.
>>
>> And I'm stuck here. May I get any response about the signed drivers?
>> Thank you!
> I believe Lars is working on this. We intend to get an EV cert for Xen Pr=
oject and release-sign (not logo-sign) drivers through the new Windows 10 p=
ortal. I have updated the staging-8.1 branches recently and re-tagged them =
with new rc numbers... I'll adjust the Jenkins projects today to deliver ne=
w builds of these branches to xenbits. My hope is that these are likely to =
be the final rcs.
>
>    Paul

Sorry for bother you, is there any news about the signed builds please?

Thanks for any reply and sorry for my bad english.

>
>> --
>>
>>
>> =C9li=E1s Tam=E1s
>> Thomas Elias
>>
>> ETIT[nwpro] KFT, =DCgyvezet=F5-H=E1l=F3zatbiztons=E1gi specialista
>> ETIT[nwpro] Ltd, General Manager-Network security specialist
>>
>> Tel. HU: +36/30-497-1626
>> Tel. DE: +49/160-651-8723
>> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
>>
>> Okleveles m=E9rn=F6k-informatikus (MSC)
>> Master of Science in Information Technology (MSC)
>>
>> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
>> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
>> Contact: http://etit.hu/index.php/en/contact
>> Disclaimer: http://etit.hu/disclaimer-email-en.txt
>
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 14:12:29 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 14:12:29 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8qL6-0006be-Bx; Tue, 15 Dec 2015 14:12:28 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1a8qL4-0006bQ-Sc
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 14:12:27 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	03/4F-21571-ACF10765; Tue, 15 Dec 2015 14:12:26 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-8.tower-21.messagelabs.com!1450188731!5487225!1
X-Originating-IP: [74.125.82.43]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 52706 invoked from network); 15 Dec 2015 14:12:23 -0000
Received: from mail-wm0-f43.google.com (HELO mail-wm0-f43.google.com)
	(74.125.82.43)
	by server-8.tower-21.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 14:12:23 -0000
Received: by mail-wm0-f43.google.com with SMTP id n186so166828864wmn.1
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 06:12:23 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r-biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=1IkLbsC5pQ7xVCI79CNJ9OdQ3uIpAwwM7kvtYyi/8Bo=;
	b=ia2sjtwaUIaQV0sengGD3YHpWFyFHOobAFzNWLkLD0ySI/HgMK/jedC6KGj98rlbmX
	sPb9s5OMt9v1bVYSHnMlANSR+mcttNUZLuXLVD9b/y8afHyVkR9ryX9ryjIQQfDqA/aG
	74Tp5WFHaL8BSiiyLnxmc1pUBl82niUrgY0K/WfK5arSvQuvwgQp7D/nehHM2eXns0dD
	EuDNUTWr7gLArVPlNEF8vNVEO6ghyxo43JfFAH/5ph0vl9yNNlOtegW2cVnkDBi/VZHL
	/DKO+9c7/gxH2jB8WLauQWhGEYjZhlbvOlS9H6IMxw1EW82XRtAeRveW+MiCpEB28EqI
	YinQ==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:subject:to:references:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=1IkLbsC5pQ7xVCI79CNJ9OdQ3uIpAwwM7kvtYyi/8Bo=;
	b=GIjWlgHHOi781I71ihC4xuHm84/L81mBa8nsLIQultz6ZK43bclLx2w6Xn2rM0UeRQ
	egwRDYGGcI559rw+fvgBYTl+7E+2xy7fz9WUthyR3bZs9d7Uw7S6XlWF9shnHwyeuS+l
	Ivq6y4Bs7cCCDBGo3C1/knz5ZZvsuevlBpOgW9xTFi0cO1EHLQe6TPf0m8F3XodwUy5c
	rChtmSC7pST1Fifex1s4lVddxpD9xp3mkTMz7K4bkJC/CAkNblWWLNwGWeMupNC9me6P
	NqQcW7NTjshh0fUs+dzdg0KDpjw55VfMGcLbChAS/1rg4yCLawwWimkaZxeYd5NVbdkq
	AJyg==
X-Gm-Message-State: ALoCoQndNdMA947SWBmFPsAPCgjsFm9nsXoZeHq70LytLoZLrq3rNwKAbafcL/kd/36Wmx3fkykdrKT5h7ywD9lnGW7YF17b5w==
X-Received: by 10.28.212.21 with SMTP id l21mr5073421wmg.91.1450188254133;
	Tue, 15 Dec 2015 06:04:14 -0800 (PST)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	b82sm21221204wmf.9.2015.12.15.06.04.12
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 06:04:13 -0800 (PST)
To: Paul Durrant <Paul.Durrant@citrix.com>, =?UTF-8?B?w4lsacOhcyBUYW3DoXM=?=
	<et@etit.hu>, "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <565C293A.5030705@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56701DDF.4000008@m2r.biz>
Date: Tue, 15 Dec 2015 15:04:15 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
Content-Length: 2869
Subject: Re: [win-pv-devel] Windows 10 upgrade to new build with testsigning
 on -> FAIL
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="iso-8859-2"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Il 01/12/2015 12:36, Paul Durrant ha scritto:
>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of =C9li=E1s Tam=E1s
>> Sent: 30 November 2015 10:47
>> To: xen-users@lists.xen.org; win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] Windows 10 upgrade to new build with testsigning
>> on -> FAIL
>>
>> Dear all.
>>
>>
>> I'm using several Windows 10 HVM DOMU-s with XEN4.6. I'm using
>> xen-winpv-devel drivers (latest ones, from November). Previously on the
>> xen-users and on the xen-winpv-development list several users inlcuding
>> me was wishing for signed develoment drivers.
>>
>> Now it seems, that the time has come to tell you, that it is now a
>> blocking condition.
>>
>> Upgrading windows 10 build to the latext 15xxx build automatically turns
>> off testsigning: this cause that upon next reboot during the upgrade
>> procedure, the windows 10 machines fail to start (due to xenbus is not
>> signed). The F8 is offered, I can select "turn off the requirement for
>> digital signature of the drivers", and reboot. Unfortunately the upgrade
>> realizes, that "something did not go well", and immediately starts
>> uninstalling the upgrade package.
>>
>> And I'm stuck here. May I get any response about the signed drivers?
>> Thank you!
> I believe Lars is working on this. We intend to get an EV cert for Xen Pr=
oject and release-sign (not logo-sign) drivers through the new Windows 10 p=
ortal. I have updated the staging-8.1 branches recently and re-tagged them =
with new rc numbers... I'll adjust the Jenkins projects today to deliver ne=
w builds of these branches to xenbits. My hope is that these are likely to =
be the final rcs.
>
>    Paul

Sorry for bother you, is there any news about the signed builds please?

Thanks for any reply and sorry for my bad english.

>
>> --
>>
>>
>> =C9li=E1s Tam=E1s
>> Thomas Elias
>>
>> ETIT[nwpro] KFT, =DCgyvezet=F5-H=E1l=F3zatbiztons=E1gi specialista
>> ETIT[nwpro] Ltd, General Manager-Network security specialist
>>
>> Tel. HU: +36/30-497-1626
>> Tel. DE: +49/160-651-8723
>> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
>>
>> Okleveles m=E9rn=F6k-informatikus (MSC)
>> Master of Science in Information Technology (MSC)
>>
>> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
>> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
>> Contact: http://etit.hu/index.php/en/contact
>> Disclaimer: http://etit.hu/disclaimer-email-en.txt
>
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 14:34:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 14:34:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8qgZ-000082-3C; Tue, 15 Dec 2015 14:34:39 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a8qgX-00007p-So
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 14:34:38 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	75/AB-29649-DF420765; Tue, 15 Dec 2015 14:34:37 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-9.tower-31.messagelabs.com!1450190074!1483729!1
X-Originating-IP: [209.85.220.193]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32157 invoked from network); 15 Dec 2015 14:34:36 -0000
Received: from mail-qk0-f193.google.com (HELO mail-qk0-f193.google.com)
	(209.85.220.193)
	by server-9.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 14:34:36 -0000
Received: by mail-qk0-f193.google.com with SMTP id t187so1511569qkd.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 06:34:34 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:subject:in-reply-to:references:mime-version
	:content-type:content-transfer-encoding;
	bh=0WiCIHN6Za5n/6165wlyryHfls/KHOgbpezhgrXzFhA=;
	b=R5ZuSq8E6CSmo3PQcJg4vP01MR+0hIxAX+SdXA3lBY5XhtgPhYzqomoY3tEfpgd1f0
	PXSqZqc6xaBHko56KX1hiaRdhLV/Qx6u/wHlDgksyl7TdwwnhLMDwF2ZDMbZXyPE1sPA
	eIKtRCK6VeH8FyPzRaoJmrGmadw3BmdntzCdw6SnwpRdWSpl+P0CVcxJUadwihpO9/Wq
	ZDuwH6KDvjZslWwgK3+/Zb5VSapmzXL2hqlgB1lcSufx5dbNFItxaDgj3FmHl64o7lYy
	+L0/45V9D7DCsn/K/VmCle+ZfiIESBaqPruorUBAxSKaqMboCdg73Qql17YllpRe3t5F
	kycQ==
X-Received: by 10.55.52.7 with SMTP id b7mr50804273qka.29.1450190064847;
	Tue, 15 Dec 2015 06:34:24 -0800 (PST)
Received: from smartin-envy.nemo.cl ([186.37.113.140])
	by smtp.gmail.com with ESMTPSA id t1sm569487qki.44.2015.12.15.06.34.23
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 06:34:24 -0800 (PST)
Date: Tue, 15 Dec 2015 11:34:22 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1985698918.20151215113422@gmail.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>, 
	Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
In-Reply-To: <56701939.4050506@m2r.biz>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com> 
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1556964289.20151215081852@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
	<56701939.4050506@m2r.biz>
MIME-Version: 1.0
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Fabio,

Tuesday, December 15, 2015, 10:44:25 AM, you wrote:

<snip>
> If you need use usb passthrough from dom0 working now without wait new
> patches in development (that support will also hotplug) you can use 
> these parameters in domU xl cfg instead usb=1 and usbdevice:

Have you tried the new support?

When I upgraded to Debian Jessie I went back to the Debian build of
Xen. I was looking at going back to the bleeding edge to get this
support.

> Sorry for my bad english.

English is very good actually.

>>
>>> Regards.
>>>
>>> --
>>> Best regards,
>>>   Simon                            mailto:furryfuttock@gmail.com




-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 14:34:40 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 14:34:40 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8qgZ-000082-3C; Tue, 15 Dec 2015 14:34:39 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a8qgX-00007p-So
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 14:34:38 +0000
Received: from [85.158.137.68] by server-6.bemta-3.messagelabs.com id
	75/AB-29649-DF420765; Tue, 15 Dec 2015 14:34:37 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-9.tower-31.messagelabs.com!1450190074!1483729!1
X-Originating-IP: [209.85.220.193]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 32157 invoked from network); 15 Dec 2015 14:34:36 -0000
Received: from mail-qk0-f193.google.com (HELO mail-qk0-f193.google.com)
	(209.85.220.193)
	by server-9.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 14:34:36 -0000
Received: by mail-qk0-f193.google.com with SMTP id t187so1511569qkd.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 06:34:34 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:subject:in-reply-to:references:mime-version
	:content-type:content-transfer-encoding;
	bh=0WiCIHN6Za5n/6165wlyryHfls/KHOgbpezhgrXzFhA=;
	b=R5ZuSq8E6CSmo3PQcJg4vP01MR+0hIxAX+SdXA3lBY5XhtgPhYzqomoY3tEfpgd1f0
	PXSqZqc6xaBHko56KX1hiaRdhLV/Qx6u/wHlDgksyl7TdwwnhLMDwF2ZDMbZXyPE1sPA
	eIKtRCK6VeH8FyPzRaoJmrGmadw3BmdntzCdw6SnwpRdWSpl+P0CVcxJUadwihpO9/Wq
	ZDuwH6KDvjZslWwgK3+/Zb5VSapmzXL2hqlgB1lcSufx5dbNFItxaDgj3FmHl64o7lYy
	+L0/45V9D7DCsn/K/VmCle+ZfiIESBaqPruorUBAxSKaqMboCdg73Qql17YllpRe3t5F
	kycQ==
X-Received: by 10.55.52.7 with SMTP id b7mr50804273qka.29.1450190064847;
	Tue, 15 Dec 2015 06:34:24 -0800 (PST)
Received: from smartin-envy.nemo.cl ([186.37.113.140])
	by smtp.gmail.com with ESMTPSA id t1sm569487qki.44.2015.12.15.06.34.23
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 06:34:24 -0800 (PST)
Date: Tue, 15 Dec 2015 11:34:22 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1985698918.20151215113422@gmail.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>, 
	Paul Durrant <Paul.Durrant@citrix.com>, 
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
In-Reply-To: <56701939.4050506@m2r.biz>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com> 
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1556964289.20151215081852@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
	<56701939.4050506@m2r.biz>
MIME-Version: 1.0
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Fabio,

Tuesday, December 15, 2015, 10:44:25 AM, you wrote:

<snip>
> If you need use usb passthrough from dom0 working now without wait new
> patches in development (that support will also hotplug) you can use 
> these parameters in domU xl cfg instead usb=1 and usbdevice:

Have you tried the new support?

When I upgraded to Debian Jessie I went back to the Debian build of
Xen. I was looking at going back to the bleeding edge to get this
support.

> Sorry for my bad english.

English is very good actually.

>>
>>> Regards.
>>>
>>> --
>>> Best regards,
>>>   Simon                            mailto:furryfuttock@gmail.com




-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 14:56:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 14:56:00 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8r1D-0001I2-Dr; Tue, 15 Dec 2015 14:55:59 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1a8r1B-0001Hl-HE
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 14:55:57 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	61/60-22089-CF920765; Tue, 15 Dec 2015 14:55:56 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-13.tower-206.messagelabs.com!1450191341!10568264!1
X-Originating-IP: [74.125.82.54]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12086 invoked from network); 15 Dec 2015 14:55:41 -0000
Received: from mail-wm0-f54.google.com (HELO mail-wm0-f54.google.com)
	(74.125.82.54)
	by server-13.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 14:55:41 -0000
Received: by mail-wm0-f54.google.com with SMTP id n186so98208212wmn.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 06:55:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r-biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=lViXm5DgtDidj4or+aRlstDwLhWywrDJlVRFYDUGTGw=;
	b=n2sLWlJbHv27DDtet+cjQTvRj/j0q4wi8nmlao/wvyP5yRT96a0xJuachISTdjaxks
	/PbEhwTerTChhFs9pn865TIYZL+uoqPa/GG2IfXtelV2k5oDMKm3CjHzTioANMeoCOxq
	Q8iB7Aa0ibOVz/5GATTAC+JvESCRN0REf/up/T4KONxUmC0BxSHRiK6cLA3dJWNbSvia
	Us4vs4BfUDYN/ZSrt579D3/PTY/W58jUiyL7vkyukT1l3zA5Gb5a8uGyhod3Ju8i9qzs
	Qd+jRHN2l1z63DwHfmRm8fJ93QOn5gwjJnOkuJtXo59OuNbpoYs2Rn3HUfRqD+uZ99zR
	IBPg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:subject:to:references:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=lViXm5DgtDidj4or+aRlstDwLhWywrDJlVRFYDUGTGw=;
	b=EqYeesUA9GIeGw1NaoAzHzhPXwnDhrxLn1W6NzhZ0aZtRoVSh4LskbRwzIMsjoBbfQ
	PzhQRCzEln2YYZltM1rg2jCkoTFXR3X3ggjRCbbjNFQh2W1HuNd9pLaKwWESuBJtRQoO
	/DRRoJ9w/8zhSWfFZCDLtApQXI/vZ5zMvDz22iqikUH8xXnCaFpoa1DeA/lytTHz54Kf
	iEvE5eWL9rFRvLpTFECccFDA3fxM8d9UWEQ2LCErkPbL8pADp9A6itvVEnHGqX59IjT5
	W52rI4xtGh6pZVNsuUm36y5SJT1XVVjcR/D4mzpJrFQiTHXD5h5OPOph9OpoZevnm6g5
	ZJQw==
X-Gm-Message-State: ALoCoQk5Z9AQhhaPDcr9ZVJKegS+mdDwU9dUnWvxtHKJ45eFMJz1asYiZY3IjpDOW/D+g/zvBhlCGn+oE8MQsU8/DIl/PtbKgg==
X-Received: by 10.28.64.131 with SMTP id n125mr4932696wma.103.1450187065672;
	Tue, 15 Dec 2015 05:44:25 -0800 (PST)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	197sm21147510wmt.19.2015.12.15.05.44.23
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 05:44:24 -0800 (PST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1556964289.20151215081852@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56701939.4050506@m2r.biz>
Date: Tue, 15 Dec 2015 14:44:25 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Il 15/12/2015 12:52, Paul Durrant ha scritto:
>> -----Original Message-----
> [snip]
>>>> Can we achieve this via qemu?
>>>>
>>> Maybe. Documentation suggests that the -usbdevice option can be
>>> used to assign a host USB device to a guest.
>> <snip>
>>
>> As far as I can see from the QEMU documentation, we can push through a
>> USB  device  (telephone,  etc), but not the USB hub itself. This means
>> that  I would have to have a process running in Dom0 monitoring device
>> insertion  and  hot-configuring  QEMU.  Not  sure  if  QEMU allows hot
>> configuring.
>>
> It should do. You can use QMP to add devices dynamically, I believe.
>
>> I'll  pull  down  the  old GPLPV drivers and see what I can get out of
>> there.  Supposedly  splice  protocol allows USB forwarding, has anyone
>> tried it?
>>
> I assume you mean 'spice' rather than 'splice'? Googling around suggests that spice itself does not handle USB but there's a related 'usbredir' protocol that does. Not tried spice myself but I believe Fabio Fantoni (cc-ed) has had some success.
>
>    Paul

Spice usbredirection is upstream and working, I use it in production for 
over a year on dozens of thin clients.
With it you can share up to 4 usb devices from spice client to the domU, 
I added support of usb1/usb2/usb3 controller, tested and working on all.
One exception (not caused by usbredir itself): on recent windows 
versions usb1 controller is not working, same with old usb passthrough 
from dom0.
Old usb passthrough support only usb1 and is only for share sub device 
connected from dom0, spice usbredirection instead from any client when 
you connect (also on wan if connection is not bad), you can share 
devices already connected before and also after spice client start and 
it is faster/easy to use that xen usb passthrough.

If you want use spice usbredirection (xen >=4.4, spice and usbredir 
required) added this in domU xl cfg:
spiceusbredirection=4 (for share up to four usb device)
usbversion=2 (this is optional, the default is usb2 controller 
automatically added with spice usbredirection enabled but you can 
specify usb1 or usb3)


If you need use usb passthrough from dom0 working now without wait new 
patches in development (that support will also hotplug) you can use 
these parameters in domU xl cfg instead usb=1 and usbdevice:

usbversion=2 (for emulated usb2 controller working also on recent windows)
and
device_model_args=["-device","usb-host,vendorid=0x058f,productid=0x6387"]
or
device_model_args=["-device","usb-host,hostbus=001,hostaddr=005"]
(replacing the value with the right of what you want share watching)

tested from xen 4.4 to 4.6


Sorry for my bad english.

>
>> Regards.
>>
>> --
>> Best regards,
>>   Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 14:56:00 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 14:56:00 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8r1D-0001I2-Dr; Tue, 15 Dec 2015 14:55:59 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <fabio.fantoni@m2r.biz>) id 1a8r1B-0001Hl-HE
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 14:55:57 +0000
Received: from [85.158.139.211] by server-6.bemta-5.messagelabs.com id
	61/60-22089-CF920765; Tue, 15 Dec 2015 14:55:56 +0000
X-Env-Sender: fabio.fantoni@m2r.biz
X-Msg-Ref: server-13.tower-206.messagelabs.com!1450191341!10568264!1
X-Originating-IP: [74.125.82.54]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 12086 invoked from network); 15 Dec 2015 14:55:41 -0000
Received: from mail-wm0-f54.google.com (HELO mail-wm0-f54.google.com)
	(74.125.82.54)
	by server-13.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 15 Dec 2015 14:55:41 -0000
Received: by mail-wm0-f54.google.com with SMTP id n186so98208212wmn.0
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 15 Dec 2015 06:55:41 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=m2r-biz.20150623.gappssmtp.com; s=20150623;
	h=subject:to:references:from:message-id:date:user-agent:mime-version
	:in-reply-to:content-type:content-transfer-encoding;
	bh=lViXm5DgtDidj4or+aRlstDwLhWywrDJlVRFYDUGTGw=;
	b=n2sLWlJbHv27DDtet+cjQTvRj/j0q4wi8nmlao/wvyP5yRT96a0xJuachISTdjaxks
	/PbEhwTerTChhFs9pn865TIYZL+uoqPa/GG2IfXtelV2k5oDMKm3CjHzTioANMeoCOxq
	Q8iB7Aa0ibOVz/5GATTAC+JvESCRN0REf/up/T4KONxUmC0BxSHRiK6cLA3dJWNbSvia
	Us4vs4BfUDYN/ZSrt579D3/PTY/W58jUiyL7vkyukT1l3zA5Gb5a8uGyhod3Ju8i9qzs
	Qd+jRHN2l1z63DwHfmRm8fJ93QOn5gwjJnOkuJtXo59OuNbpoYs2Rn3HUfRqD+uZ99zR
	IBPg==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
	d=1e100.net; s=20130820;
	h=x-gm-message-state:subject:to:references:from:message-id:date
	:user-agent:mime-version:in-reply-to:content-type
	:content-transfer-encoding;
	bh=lViXm5DgtDidj4or+aRlstDwLhWywrDJlVRFYDUGTGw=;
	b=EqYeesUA9GIeGw1NaoAzHzhPXwnDhrxLn1W6NzhZ0aZtRoVSh4LskbRwzIMsjoBbfQ
	PzhQRCzEln2YYZltM1rg2jCkoTFXR3X3ggjRCbbjNFQh2W1HuNd9pLaKwWESuBJtRQoO
	/DRRoJ9w/8zhSWfFZCDLtApQXI/vZ5zMvDz22iqikUH8xXnCaFpoa1DeA/lytTHz54Kf
	iEvE5eWL9rFRvLpTFECccFDA3fxM8d9UWEQ2LCErkPbL8pADp9A6itvVEnHGqX59IjT5
	W52rI4xtGh6pZVNsuUm36y5SJT1XVVjcR/D4mzpJrFQiTHXD5h5OPOph9OpoZevnm6g5
	ZJQw==
X-Gm-Message-State: ALoCoQk5Z9AQhhaPDcr9ZVJKegS+mdDwU9dUnWvxtHKJ45eFMJz1asYiZY3IjpDOW/D+g/zvBhlCGn+oE8MQsU8/DIl/PtbKgg==
X-Received: by 10.28.64.131 with SMTP id n125mr4932696wma.103.1450187065672;
	Tue, 15 Dec 2015 05:44:25 -0800 (PST)
Received: from [192.168.1.37] (ip-73-126.sn2.eutelia.it. [83.211.73.126])
	by smtp.googlemail.com with ESMTPSA id
	197sm21147510wmt.19.2015.12.15.05.44.23
	(version=TLSv1/SSLv3 cipher=OTHER);
	Tue, 15 Dec 2015 05:44:24 -0800 (PST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1556964289.20151215081852@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
From: Fabio Fantoni <fabio.fantoni@m2r.biz>
Message-ID: <56701939.4050506@m2r.biz>
Date: Tue, 15 Dec 2015 14:44:25 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E97BC@AMSPEX01CL01.citrite.net>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Il 15/12/2015 12:52, Paul Durrant ha scritto:
>> -----Original Message-----
> [snip]
>>>> Can we achieve this via qemu?
>>>>
>>> Maybe. Documentation suggests that the -usbdevice option can be
>>> used to assign a host USB device to a guest.
>> <snip>
>>
>> As far as I can see from the QEMU documentation, we can push through a
>> USB  device  (telephone,  etc), but not the USB hub itself. This means
>> that  I would have to have a process running in Dom0 monitoring device
>> insertion  and  hot-configuring  QEMU.  Not  sure  if  QEMU allows hot
>> configuring.
>>
> It should do. You can use QMP to add devices dynamically, I believe.
>
>> I'll  pull  down  the  old GPLPV drivers and see what I can get out of
>> there.  Supposedly  splice  protocol allows USB forwarding, has anyone
>> tried it?
>>
> I assume you mean 'spice' rather than 'splice'? Googling around suggests that spice itself does not handle USB but there's a related 'usbredir' protocol that does. Not tried spice myself but I believe Fabio Fantoni (cc-ed) has had some success.
>
>    Paul

Spice usbredirection is upstream and working, I use it in production for 
over a year on dozens of thin clients.
With it you can share up to 4 usb devices from spice client to the domU, 
I added support of usb1/usb2/usb3 controller, tested and working on all.
One exception (not caused by usbredir itself): on recent windows 
versions usb1 controller is not working, same with old usb passthrough 
from dom0.
Old usb passthrough support only usb1 and is only for share sub device 
connected from dom0, spice usbredirection instead from any client when 
you connect (also on wan if connection is not bad), you can share 
devices already connected before and also after spice client start and 
it is faster/easy to use that xen usb passthrough.

If you want use spice usbredirection (xen >=4.4, spice and usbredir 
required) added this in domU xl cfg:
spiceusbredirection=4 (for share up to four usb device)
usbversion=2 (this is optional, the default is usb2 controller 
automatically added with spice usbredirection enabled but you can 
specify usb1 or usb3)


If you need use usb passthrough from dom0 working now without wait new 
patches in development (that support will also hotplug) you can use 
these parameters in domU xl cfg instead usb=1 and usbdevice:

usbversion=2 (for emulated usb2 controller working also on recent windows)
and
device_model_args=["-device","usb-host,vendorid=0x058f,productid=0x6387"]
or
device_model_args=["-device","usb-host,hostbus=001,hostaddr=005"]
(replacing the value with the right of what you want share watching)

tested from xen 4.4 to 4.6


Sorry for my bad english.

>
>> Regards.
>>
>> --
>> Best regards,
>>   Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 15:15:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 15:15:11 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8rJm-0002oE-03; Tue, 15 Dec 2015 15:15:10 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=784ebad35=Paul.Durrant@citrix.com>)
	id 1a8rJk-0002nq-FB
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 15:15:08 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	18/EB-18316-B7E20765; Tue, 15 Dec 2015 15:15:07 +0000
X-Env-Sender: prvs=784ebad35=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1450192491!5499198!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 37384 invoked from network); 15 Dec 2015 15:15:07 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 15:15:07 -0000
X-IronPort-AV: E=Sophos;i="5.20,432,1444694400"; d="scan'208";a="10100245"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>, =?iso-8859-2?Q?=C9li=E1s_Tam=E1s?=
	<et@etit.hu>, "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Windows 10 upgrade to new build with
	testsigning on -> FAIL
Thread-Index: AQHRN0GdA7LRrQqBE0yh1/tD1ldGRZ7MFQ3Q
Date: Tue, 15 Dec 2015 14:49:57 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9CE3@AMSPEX01CL01.citrite.net>
References: <565C293A.5030705@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
	<56701DDF.4000008@m2r.biz>
In-Reply-To: <56701DDF.4000008@m2r.biz>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "Lars Kurth \(lars.kurth@xen.org\)" <lars.kurth@xen.org>
Subject: Re: [win-pv-devel] Windows 10 upgrade to new build with testsigning
 on -> FAIL
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
[snip]
> > I believe Lars is working on this. We intend to get an EV cert for Xen =
Project
> and release-sign (not logo-sign) drivers through the new Windows 10 porta=
l. I
> have updated the staging-8.1 branches recently and re-tagged them with
> new rc numbers... I'll adjust the Jenkins projects today to deliver new b=
uilds
> of these branches to xenbits. My hope is that these are likely to be the =
final
> rcs.
> >
> >    Paul
> =

> Sorry for bother you, is there any news about the signed builds please?
> =


Fabio,

  I believe Lars now has Advisory Board approval to purchase the EV cert an=
d I hope this means we should be able to acquire it immediately after the h=
oliday season.
  As for the code, I have just re-tagged the staging-8.1 branches after som=
e more fixes for issues found in testing (new builds are available on xenbi=
ts) and I'm not anticipating any more tags now. Once we have the EV cert, I=
 will sign the builds via the Microsoft portal and formally release version=
 8.1.0 of all drivers.

  Cheers,

    Paul

> Thanks for any reply and sorry for my bad english.
> =

> >
> >> --
> >>
> >>
> >> =C9li=E1s Tam=E1s
> >> Thomas Elias
> >>
> >> ETIT[nwpro] KFT, =DCgyvezet=F5-H=E1l=F3zatbiztons=E1gi specialista
> >> ETIT[nwpro] Ltd, General Manager-Network security specialist
> >>
> >> Tel. HU: +36/30-497-1626
> >> Tel. DE: +49/160-651-8723
> >> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
> >>
> >> Okleveles m=E9rn=F6k-informatikus (MSC)
> >> Master of Science in Information Technology (MSC)
> >>
> >> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
> >> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
> >> Contact: http://etit.hu/index.php/en/contact
> >> Disclaimer: http://etit.hu/disclaimer-email-en.txt
> >
> > _______________________________________________
> > win-pv-devel mailing list
> > win-pv-devel@lists.xenproject.org
> > http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 15 15:15:11 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 15 Dec 2015 15:15:11 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a8rJm-0002oE-03; Tue, 15 Dec 2015 15:15:10 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=784ebad35=Paul.Durrant@citrix.com>)
	id 1a8rJk-0002nq-FB
	for win-pv-devel@lists.xenproject.org; Tue, 15 Dec 2015 15:15:08 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	18/EB-18316-B7E20765; Tue, 15 Dec 2015 15:15:07 +0000
X-Env-Sender: prvs=784ebad35=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1450192491!5499198!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 37384 invoked from network); 15 Dec 2015 15:15:07 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	15 Dec 2015 15:15:07 -0000
X-IronPort-AV: E=Sophos;i="5.20,432,1444694400"; d="scan'208";a="10100245"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Fabio Fantoni <fabio.fantoni@m2r.biz>, =?iso-8859-2?Q?=C9li=E1s_Tam=E1s?=
	<et@etit.hu>, "xen-users@lists.xen.org" <xen-users@lists.xen.org>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] Windows 10 upgrade to new build with
	testsigning on -> FAIL
Thread-Index: AQHRN0GdA7LRrQqBE0yh1/tD1ldGRZ7MFQ3Q
Date: Tue, 15 Dec 2015 14:49:57 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9CE3@AMSPEX01CL01.citrite.net>
References: <565C293A.5030705@etit.hu>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F69F9FD@AMSPEX01CL01.citrite.net>
	<56701DDF.4000008@m2r.biz>
In-Reply-To: <56701DDF.4000008@m2r.biz>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "Lars Kurth \(lars.kurth@xen.org\)" <lars.kurth@xen.org>
Subject: Re: [win-pv-devel] Windows 10 upgrade to new build with testsigning
 on -> FAIL
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
[snip]
> > I believe Lars is working on this. We intend to get an EV cert for Xen =
Project
> and release-sign (not logo-sign) drivers through the new Windows 10 porta=
l. I
> have updated the staging-8.1 branches recently and re-tagged them with
> new rc numbers... I'll adjust the Jenkins projects today to deliver new b=
uilds
> of these branches to xenbits. My hope is that these are likely to be the =
final
> rcs.
> >
> >    Paul
> =

> Sorry for bother you, is there any news about the signed builds please?
> =


Fabio,

  I believe Lars now has Advisory Board approval to purchase the EV cert an=
d I hope this means we should be able to acquire it immediately after the h=
oliday season.
  As for the code, I have just re-tagged the staging-8.1 branches after som=
e more fixes for issues found in testing (new builds are available on xenbi=
ts) and I'm not anticipating any more tags now. Once we have the EV cert, I=
 will sign the builds via the Microsoft portal and formally release version=
 8.1.0 of all drivers.

  Cheers,

    Paul

> Thanks for any reply and sorry for my bad english.
> =

> >
> >> --
> >>
> >>
> >> =C9li=E1s Tam=E1s
> >> Thomas Elias
> >>
> >> ETIT[nwpro] KFT, =DCgyvezet=F5-H=E1l=F3zatbiztons=E1gi specialista
> >> ETIT[nwpro] Ltd, General Manager-Network security specialist
> >>
> >> Tel. HU: +36/30-497-1626
> >> Tel. DE: +49/160-651-8723
> >> OpenPGP pubkey: http://etit.hu/doc/et-pub.asc
> >>
> >> Okleveles m=E9rn=F6k-informatikus (MSC)
> >> Master of Science in Information Technology (MSC)
> >>
> >> Kapcsolat: http://etit.hu/index.php/hu/kapcsolat
> >> Jogi nyilatkozat: http://etit.hu/disclaimer-email-hu.txt
> >> Contact: http://etit.hu/index.php/en/contact
> >> Disclaimer: http://etit.hu/disclaimer-email-en.txt
> >
> > _______________________________________________
> > win-pv-devel mailing list
> > win-pv-devel@lists.xenproject.org
> > http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 11:25:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 11:25:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9ACx-0001Mm-VN; Wed, 16 Dec 2015 11:25:23 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9ACw-0001Mh-Iy
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 11:25:22 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	9E/85-03235-12A41765; Wed, 16 Dec 2015 11:25:21 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1450265121!10809334!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 41924 invoked from network); 16 Dec 2015 11:25:21 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 11:25:21 -0000
X-IronPort-AV: E=Sophos;i="5.20,436,1444694400"; d="scan'208";a="10405073"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has
	not	completed within 20 minutes
Thread-Index: AQHRNy49bL6wrxVDz0ivkhyu60BKgp7NehpA
Date: Wed, 16 Dec 2015 11:25:19 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EB5CF@AMSPEX01CL01.citrite.net>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has
 not	completed within 20 minutes
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 15 December 2015 11:30
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has not
> completed within 20 minutes
> 
> Since there is no way of reporting balloon failures to the toolstack,
> the only way of stopping a VM from attempting to balloon indefinitely
> is to BSOD after a large timeout.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenbus/fdo.c | 34 ++++++++++++++++++----------------
>  1 file changed, 18 insertions(+), 16 deletions(-)
> 
> diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
> index 9c9e380..722a4b3 100644
> --- a/src/xenbus/fdo.c
> +++ b/src/xenbus/fdo.c
> @@ -3356,29 +3356,31 @@ not_active:
>          goto fail8;
> 
>      if (Fdo->BalloonInterface.Interface.Context != NULL) {
> -        BOOLEAN Warned;
> +        LARGE_INTEGER   Timeout;
> 
>          ASSERT(__FdoIsActive(Fdo));
> 
> -        Warned = FALSE;
> +        // Balloon should complete within 10s
> +        Timeout.QuadPart = TIME_RELATIVE(TIME_S(10));
> 
> -        for (;;) {
> -            LARGE_INTEGER   Timeout;
> +        status = KeWaitForSingleObject(&Fdo->BalloonEvent,
> +                                        Executive,
> +                                        KernelMode,
> +                                        FALSE,
> +                                        &Timeout);
> +        if (status == STATUS_TIMEOUT) {
> +            Warning("waiting for balloon\n");
> 
> -            Timeout.QuadPart = TIME_RELATIVE(TIME_S(BALLOON_PAUSE));
> +            // Wait for up to 20mins (total) before BSOD
> +            Timeout.QuadPart = TIME_RELATIVE(TIME_S(1190ll));
> 
>              status = KeWaitForSingleObject(&Fdo->BalloonEvent,
> -                                           Executive,
> -                                           KernelMode,
> -                                           FALSE,
> -                                           &Timeout);
> -            if (status != STATUS_TIMEOUT)
> -                break;
> -
> -            if (!Warned) {
> -                Warning("waiting for balloon\n");
> -                Warned = TRUE;
> -            }
> +                                            Executive,
> +                                            KernelMode,
> +                                            FALSE,
> +                                            &Timeout);
> +            Error("Waited for Balloon (%08x)\n", status);
> +            BUG_ON(status == STATUS_TIMEOUT);
>          }
>      }
> 
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 11:25:25 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 11:25:25 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9ACx-0001Mm-VN; Wed, 16 Dec 2015 11:25:23 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9ACw-0001Mh-Iy
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 11:25:22 +0000
Received: from [85.158.139.211] by server-5.bemta-5.messagelabs.com id
	9E/85-03235-12A41765; Wed, 16 Dec 2015 11:25:21 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-13.tower-206.messagelabs.com!1450265121!10809334!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 41924 invoked from network); 16 Dec 2015 11:25:21 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-13.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 11:25:21 -0000
X-IronPort-AV: E=Sophos;i="5.20,436,1444694400"; d="scan'208";a="10405073"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has
	not	completed within 20 minutes
Thread-Index: AQHRNy49bL6wrxVDz0ivkhyu60BKgp7NehpA
Date: Wed, 16 Dec 2015 11:25:19 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EB5CF@AMSPEX01CL01.citrite.net>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has
 not	completed within 20 minutes
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 15 December 2015 11:30
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 1/3] BSOD if initial balloon thread has not
> completed within 20 minutes
> 
> Since there is no way of reporting balloon failures to the toolstack,
> the only way of stopping a VM from attempting to balloon indefinitely
> is to BSOD after a large timeout.
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> ---
>  src/xenbus/fdo.c | 34 ++++++++++++++++++----------------
>  1 file changed, 18 insertions(+), 16 deletions(-)
> 
> diff --git a/src/xenbus/fdo.c b/src/xenbus/fdo.c
> index 9c9e380..722a4b3 100644
> --- a/src/xenbus/fdo.c
> +++ b/src/xenbus/fdo.c
> @@ -3356,29 +3356,31 @@ not_active:
>          goto fail8;
> 
>      if (Fdo->BalloonInterface.Interface.Context != NULL) {
> -        BOOLEAN Warned;
> +        LARGE_INTEGER   Timeout;
> 
>          ASSERT(__FdoIsActive(Fdo));
> 
> -        Warned = FALSE;
> +        // Balloon should complete within 10s
> +        Timeout.QuadPart = TIME_RELATIVE(TIME_S(10));
> 
> -        for (;;) {
> -            LARGE_INTEGER   Timeout;
> +        status = KeWaitForSingleObject(&Fdo->BalloonEvent,
> +                                        Executive,
> +                                        KernelMode,
> +                                        FALSE,
> +                                        &Timeout);
> +        if (status == STATUS_TIMEOUT) {
> +            Warning("waiting for balloon\n");
> 
> -            Timeout.QuadPart = TIME_RELATIVE(TIME_S(BALLOON_PAUSE));
> +            // Wait for up to 20mins (total) before BSOD
> +            Timeout.QuadPart = TIME_RELATIVE(TIME_S(1190ll));
> 
>              status = KeWaitForSingleObject(&Fdo->BalloonEvent,
> -                                           Executive,
> -                                           KernelMode,
> -                                           FALSE,
> -                                           &Timeout);
> -            if (status != STATUS_TIMEOUT)
> -                break;
> -
> -            if (!Warned) {
> -                Warning("waiting for balloon\n");
> -                Warned = TRUE;
> -            }
> +                                            Executive,
> +                                            KernelMode,
> +                                            FALSE,
> +                                            &Timeout);
> +            Error("Waited for Balloon (%08x)\n", status);
> +            BUG_ON(status == STATUS_TIMEOUT);
>          }
>      }
> 
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 11:28:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 11:28:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9AFd-0001Uu-95; Wed, 16 Dec 2015 11:28:09 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9AFc-0001Ug-Hr
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 11:28:08 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	3B/EE-30270-3CA41765; Wed, 16 Dec 2015 11:28:03 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-206.messagelabs.com!1450265282!11086765!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 41976 invoked from network); 16 Dec 2015 11:28:02 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 11:28:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,436,1444694400"; d="scan'208";a="10406014"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions to
	Inflate/Deflate calls
Thread-Index: AQHRNyy7N35NAGV1akKA08BEx387Op7Neuyg
Date: Wed, 16 Dec 2015 11:28:01 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EB5F2@AMSPEX01CL01.citrite.net>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
	<1450179020-9864-2-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1450179020-9864-2-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions
	to	Inflate/Deflate calls
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 15 December 2015 11:30
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions to
> Inflate/Deflate calls
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>  src/xenbus/balloon.c | 53 ++++++++++++++++++++++++++++----------------
> --------
>  1 file changed, 29 insertions(+), 24 deletions(-)
> 
> diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
> index e697722..e2ce8de 100644
> --- a/src/xenbus/balloon.c
> +++ b/src/xenbus/balloon.c
> @@ -572,6 +572,25 @@ done:
>  }
> 
>  static BOOLEAN
> +BalloonLowMemory(
> +    IN  PXENBUS_BALLOON_CONTEXT Context
> +    )
> +{
> +    LARGE_INTEGER               Timeout;
> +    NTSTATUS                    status;
> +
> +    Timeout.QuadPart = 0;
> +
> +    status = KeWaitForSingleObject(Context->LowMemoryEvent,
> +                                   Executive,
> +                                   KernelMode,
> +                                   FALSE,
> +                                   &Timeout);
> +
> +    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
> +}
> +
> +static BOOLEAN
>  BalloonDeflate(
>      IN  PXENBUS_BALLOON_CONTEXT Context,
>      IN  ULONGLONG               Requested
> @@ -583,6 +602,9 @@ BalloonDeflate(
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    if (Context->FIST.Deflation)
> +        return TRUE;
> +
>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> @@ -627,6 +649,11 @@ BalloonInflate(
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    if (Context->FIST.Inflation)
> +        return TRUE;
> +    if (BalloonLowMemory(Context))
> +        return TRUE;
> +

I think these conditions can just be ||ed together into a single if. I'll do that when I commit.

Acked-by: Paul Durrant <paul.durrant@citrix.com>

>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> @@ -673,25 +700,6 @@ BalloonInflate(
>      return Abort;
>  }
> 
> -static BOOLEAN
> -BalloonLowMemory(
> -    IN  PXENBUS_BALLOON_CONTEXT Context
> -    )
> -{
> -    LARGE_INTEGER               Timeout;
> -    NTSTATUS                    status;
> -
> -    Timeout.QuadPart = 0;
> -
> -    status = KeWaitForSingleObject(Context->LowMemoryEvent,
> -                                   Executive,
> -                                   KernelMode,
> -                                   FALSE,
> -                                   &Timeout);
> -
> -    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
> -}
> -
>  static VOID
>  BalloonGetFISTEntries(
>      IN  PXENBUS_BALLOON_CONTEXT Context
> @@ -758,12 +766,9 @@ BalloonAdjust(
> 
>      while (Context->Size != Size && !Abort) {
>          if (Size > Context->Size)
> -            Abort = Context->FIST.Inflation ||
> -                    BalloonLowMemory(Context) ||
> -                    BalloonInflate(Context, Size - Context->Size);
> +            Abort = BalloonInflate(Context, Size - Context->Size);
>          else if (Size < Context->Size)
> -            Abort = Context->FIST.Deflation ||
> -                    BalloonDeflate(Context, Context->Size - Size);
> +            Abort = BalloonDeflate(Context, Context->Size - Size);
>      }
> 
>      Info("<==== (%llu page(s))%s\n",
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 11:28:09 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 11:28:09 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9AFd-0001Uu-95; Wed, 16 Dec 2015 11:28:09 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9AFc-0001Ug-Hr
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 11:28:08 +0000
Received: from [85.158.139.211] by server-9.bemta-5.messagelabs.com id
	3B/EE-30270-3CA41765; Wed, 16 Dec 2015 11:28:03 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-9.tower-206.messagelabs.com!1450265282!11086765!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 41976 invoked from network); 16 Dec 2015 11:28:02 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-9.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 11:28:02 -0000
X-IronPort-AV: E=Sophos;i="5.20,436,1444694400"; d="scan'208";a="10406014"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions to
	Inflate/Deflate calls
Thread-Index: AQHRNyy7N35NAGV1akKA08BEx387Op7Neuyg
Date: Wed, 16 Dec 2015 11:28:01 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EB5F2@AMSPEX01CL01.citrite.net>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
	<1450179020-9864-2-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1450179020-9864-2-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions
	to	Inflate/Deflate calls
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 15 December 2015 11:30
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 2/3] Move balloon failure conditions to
> Inflate/Deflate calls
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>  src/xenbus/balloon.c | 53 ++++++++++++++++++++++++++++----------------
> --------
>  1 file changed, 29 insertions(+), 24 deletions(-)
> 
> diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
> index e697722..e2ce8de 100644
> --- a/src/xenbus/balloon.c
> +++ b/src/xenbus/balloon.c
> @@ -572,6 +572,25 @@ done:
>  }
> 
>  static BOOLEAN
> +BalloonLowMemory(
> +    IN  PXENBUS_BALLOON_CONTEXT Context
> +    )
> +{
> +    LARGE_INTEGER               Timeout;
> +    NTSTATUS                    status;
> +
> +    Timeout.QuadPart = 0;
> +
> +    status = KeWaitForSingleObject(Context->LowMemoryEvent,
> +                                   Executive,
> +                                   KernelMode,
> +                                   FALSE,
> +                                   &Timeout);
> +
> +    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
> +}
> +
> +static BOOLEAN
>  BalloonDeflate(
>      IN  PXENBUS_BALLOON_CONTEXT Context,
>      IN  ULONGLONG               Requested
> @@ -583,6 +602,9 @@ BalloonDeflate(
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    if (Context->FIST.Deflation)
> +        return TRUE;
> +
>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> @@ -627,6 +649,11 @@ BalloonInflate(
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    if (Context->FIST.Inflation)
> +        return TRUE;
> +    if (BalloonLowMemory(Context))
> +        return TRUE;
> +

I think these conditions can just be ||ed together into a single if. I'll do that when I commit.

Acked-by: Paul Durrant <paul.durrant@citrix.com>

>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> @@ -673,25 +700,6 @@ BalloonInflate(
>      return Abort;
>  }
> 
> -static BOOLEAN
> -BalloonLowMemory(
> -    IN  PXENBUS_BALLOON_CONTEXT Context
> -    )
> -{
> -    LARGE_INTEGER               Timeout;
> -    NTSTATUS                    status;
> -
> -    Timeout.QuadPart = 0;
> -
> -    status = KeWaitForSingleObject(Context->LowMemoryEvent,
> -                                   Executive,
> -                                   KernelMode,
> -                                   FALSE,
> -                                   &Timeout);
> -
> -    return (status == STATUS_SUCCESS) ? TRUE : FALSE;
> -}
> -
>  static VOID
>  BalloonGetFISTEntries(
>      IN  PXENBUS_BALLOON_CONTEXT Context
> @@ -758,12 +766,9 @@ BalloonAdjust(
> 
>      while (Context->Size != Size && !Abort) {
>          if (Size > Context->Size)
> -            Abort = Context->FIST.Inflation ||
> -                    BalloonLowMemory(Context) ||
> -                    BalloonInflate(Context, Size - Context->Size);
> +            Abort = BalloonInflate(Context, Size - Context->Size);
>          else if (Size < Context->Size)
> -            Abort = Context->FIST.Deflation ||
> -                    BalloonDeflate(Context, Context->Size - Size);
> +            Abort = BalloonDeflate(Context, Context->Size - Size);
>      }
> 
>      Info("<==== (%llu page(s))%s\n",
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 11:33:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 11:33:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9AKh-0001gi-Fe; Wed, 16 Dec 2015 11:33:23 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9AKf-0001gT-PV
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 11:33:22 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	B0/D6-09570-10C41765; Wed, 16 Dec 2015 11:33:21 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1450265599!11072921!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 39540 invoked from network); 16 Dec 2015 11:33:20 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 11:33:20 -0000
X-IronPort-AV: E=Sophos;i="5.20,436,1444694400"; d="scan'208";a="10407765"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/3] Return more error codes from
	Inflate/Deflate
Thread-Index: AQHRNy0k+FI6dUa3DUuBh7VtEkLxs57Ne4vw
Date: Wed, 16 Dec 2015 11:33:00 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EB62A@AMSPEX01CL01.citrite.net>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
	<1450179020-9864-3-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1450179020-9864-3-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 3/3] Return more error codes
	from	Inflate/Deflate
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 15 December 2015 11:30
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 3/3] Return more error codes from
> Inflate/Deflate
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>  src/xenbus/balloon.c | 69 ++++++++++++++++++++++++++++++++++-------
> -----------
>  1 file changed, 45 insertions(+), 24 deletions(-)
> 
> diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
> index e2ce8de..5ef30a1 100644
> --- a/src/xenbus/balloon.c
> +++ b/src/xenbus/balloon.c
> @@ -590,7 +590,7 @@ BalloonLowMemory(
>      return (status == STATUS_SUCCESS) ? TRUE : FALSE;
>  }
> 
> -static BOOLEAN
> +static NTSTATUS
>  BalloonDeflate(
>      IN  PXENBUS_BALLOON_CONTEXT Context,
>      IN  ULONGLONG               Requested
> @@ -598,28 +598,29 @@ BalloonDeflate(
>  {
>      LARGE_INTEGER               Start;
>      LARGE_INTEGER               End;
> -    BOOLEAN                     Abort;
> +    NTSTATUS                    status;
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    status = STATUS_UNSUCCESSFUL;
>      if (Context->FIST.Deflation)
> -        return TRUE;
> +        goto done;
> 
>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> 
>      Count = 0;
> -    Abort = FALSE;
> +    status = STATUS_SUCCESS;
> 
> -    while (Count < Requested && !Abort) {
> +    while (Count < Requested && NT_SUCCESS(status)) {
>          ULONG   ThisTime = (ULONG)__min(Requested - Count,
> XENBUS_BALLOON_PFN_ARRAY_SIZE);
>          ULONG   Populated;
>          ULONG   Freed;
> 
>          Populated = BalloonPopulatePfnArray(Context, ThisTime);
>          if (Populated < ThisTime)
> -            Abort = TRUE;
> +            status = STATUS_RETRY;
> 
>          Freed = BalloonFreePfnArray(Context, Populated, TRUE);
>          ASSERT(Freed == Populated);
> @@ -634,10 +635,11 @@ BalloonDeflate(
>      Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
>      Context->Size -= Count;
> 
> -    return Abort;
> +done:
> +    return status;
>  }
> 
> -static BOOLEAN
> +static NTSTATUS
>  BalloonInflate(
>      IN  PXENBUS_BALLOON_CONTEXT Context,
>      IN  ULONGLONG               Requested
> @@ -645,23 +647,26 @@ BalloonInflate(
>  {
>      LARGE_INTEGER               Start;
>      LARGE_INTEGER               End;
> -    BOOLEAN                     Abort;
> +    NTSTATUS                    status;
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    status = STATUS_UNSUCCESSFUL;
>      if (Context->FIST.Inflation)
> -        return TRUE;
> +        goto done;
> +
> +    status = STATUS_NO_MEMORY;
>      if (BalloonLowMemory(Context))
> -        return TRUE;
> +        goto done;

Ah. Forget my comment on patch #2 then.

> 
>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> 
>      Count = 0;
> -    Abort = FALSE;
> +    status = STATUS_SUCCESS;
> 
> -    while (Count < Requested && !Abort) {
> +    while (Count < Requested && NT_SUCCESS(status)) {
>          ULONG   ThisTime = (ULONG)__min(Requested - Count,
> XENBUS_BALLOON_PFN_ARRAY_SIZE);
>          ULONG   Allocated;
>          BOOLEAN Slow;
> @@ -669,7 +674,7 @@ BalloonInflate(
> 
>          Allocated = BalloonAllocatePfnArray(Context, ThisTime, &Slow);
>          if (Allocated < ThisTime || Slow)
> -            Abort = TRUE;
> +            status = STATUS_RETRY;
> 
>          Released = BalloonReleasePfnArray(Context, Allocated);
> 
> @@ -685,7 +690,7 @@ BalloonInflate(
>          }
> 
>          if (Released == 0)
> -            Abort = TRUE;
> +            status = STATUS_RETRY;
> 
>          Count += Released;
>      }
> @@ -697,7 +702,8 @@ BalloonInflate(
>      Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
>      Context->Size += Count;
> 
> -    return Abort;
> +done:
> +    return status;
>  }
> 
>  static VOID
> @@ -747,6 +753,20 @@ BalloonGetFISTEntries(
>          Warning("deflation disallowed\n");
>  }
> 
> +static FORCEINLINE PCHAR

Should be 'const CHAR *'

> +__BalloonStatus(
> +    IN  NTSTATUS    status
> +    )
> +{
> +    switch (status) {
> +    case STATUS_SUCCESS:        return "";
> +    case STATUS_UNSUCCESSFUL:   return " [FIST]";
> +    case STATUS_RETRY:          return " [RETRY]";
> +    case STATUS_NO_MEMORY:      return " [LOW_MEM]";
> +    default:                    return " [UNKNOWN]";
> +    }

I generally dislike putting things on a single line like this, but I can fix that up.

> +}
> +
>  NTSTATUS
>  BalloonAdjust(
>      IN  PINTERFACE          Interface,
> @@ -754,28 +774,29 @@ BalloonAdjust(
>      )
>  {
>      PXENBUS_BALLOON_CONTEXT Context = Interface->Context;
> -    BOOLEAN                 Abort;
> +    NTSTATUS                status;
> 
>      ASSERT3U(KeGetCurrentIrql(), <, DISPATCH_LEVEL);
> 
>      Info("====> (%llu page(s))\n", Context->Size);
> 
> -    Abort = FALSE;
> +    status = STATUS_SUCCESS;
> 
>      BalloonGetFISTEntries(Context);
> 
> -    while (Context->Size != Size && !Abort) {
> +    while (Context->Size != Size && NT_SUCCESS(status)) {
>          if (Size > Context->Size)
> -            Abort = BalloonInflate(Context, Size - Context->Size);
> +            status = BalloonInflate(Context, Size - Context->Size);
>          else if (Size < Context->Size)
> -            Abort = BalloonDeflate(Context, Context->Size - Size);
> +            status = BalloonDeflate(Context, Context->Size - Size);
>      }
> 
> -    Info("<==== (%llu page(s))%s\n",
> +    Info("<==== (%llu page(s))%s%s\n",
>           Context->Size,
> -         (Abort) ? " [ABORTED]" : "");
> +         NT_SUCCESS(status) ? "" : " [ABORTED]",
> +         __BalloonStatus(status));

We don't really need [ABORTED] any more since __BalloonStatus() will now provide a more specific message. I'll get rid of it.

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> 
> -    return (Abort) ? STATUS_RETRY : STATUS_SUCCESS;
> +    return status;
>  }
> 
>  ULONGLONG
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 11:33:24 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 11:33:24 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9AKh-0001gi-Fe; Wed, 16 Dec 2015 11:33:23 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9AKf-0001gT-PV
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 11:33:22 +0000
Received: from [85.158.137.68] by server-4.bemta-3.messagelabs.com id
	B0/D6-09570-10C41765; Wed, 16 Dec 2015 11:33:21 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-3.tower-31.messagelabs.com!1450265599!11072921!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=UPPERCASE_25_50,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 39540 invoked from network); 16 Dec 2015 11:33:20 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-3.tower-31.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 11:33:20 -0000
X-IronPort-AV: E=Sophos;i="5.20,436,1444694400"; d="scan'208";a="10407765"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Owen Smith <owen.smith@citrix.com>, "win-pv-devel@lists.xenproject.org"
	<win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH 3/3] Return more error codes from
	Inflate/Deflate
Thread-Index: AQHRNy0k+FI6dUa3DUuBh7VtEkLxs57Ne4vw
Date: Wed, 16 Dec 2015 11:33:00 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EB62A@AMSPEX01CL01.citrite.net>
References: <1450179020-9864-1-git-send-email-owen.smith@citrix.com>
	<1450179020-9864-3-git-send-email-owen.smith@citrix.com>
In-Reply-To: <1450179020-9864-3-git-send-email-owen.smith@citrix.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Owen Smith <owen.smith@citrix.com>
Subject: Re: [win-pv-devel] [PATCH 3/3] Return more error codes
	from	Inflate/Deflate
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> bounces@lists.xenproject.org] On Behalf Of Owen Smith
> Sent: 15 December 2015 11:30
> To: win-pv-devel@lists.xenproject.org
> Cc: Owen Smith
> Subject: [win-pv-devel] [PATCH 3/3] Return more error codes from
> Inflate/Deflate
> 
> Signed-off-by: Owen Smith <owen.smith@citrix.com>
> ---
>  src/xenbus/balloon.c | 69 ++++++++++++++++++++++++++++++++++-------
> -----------
>  1 file changed, 45 insertions(+), 24 deletions(-)
> 
> diff --git a/src/xenbus/balloon.c b/src/xenbus/balloon.c
> index e2ce8de..5ef30a1 100644
> --- a/src/xenbus/balloon.c
> +++ b/src/xenbus/balloon.c
> @@ -590,7 +590,7 @@ BalloonLowMemory(
>      return (status == STATUS_SUCCESS) ? TRUE : FALSE;
>  }
> 
> -static BOOLEAN
> +static NTSTATUS
>  BalloonDeflate(
>      IN  PXENBUS_BALLOON_CONTEXT Context,
>      IN  ULONGLONG               Requested
> @@ -598,28 +598,29 @@ BalloonDeflate(
>  {
>      LARGE_INTEGER               Start;
>      LARGE_INTEGER               End;
> -    BOOLEAN                     Abort;
> +    NTSTATUS                    status;
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    status = STATUS_UNSUCCESSFUL;
>      if (Context->FIST.Deflation)
> -        return TRUE;
> +        goto done;
> 
>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> 
>      Count = 0;
> -    Abort = FALSE;
> +    status = STATUS_SUCCESS;
> 
> -    while (Count < Requested && !Abort) {
> +    while (Count < Requested && NT_SUCCESS(status)) {
>          ULONG   ThisTime = (ULONG)__min(Requested - Count,
> XENBUS_BALLOON_PFN_ARRAY_SIZE);
>          ULONG   Populated;
>          ULONG   Freed;
> 
>          Populated = BalloonPopulatePfnArray(Context, ThisTime);
>          if (Populated < ThisTime)
> -            Abort = TRUE;
> +            status = STATUS_RETRY;
> 
>          Freed = BalloonFreePfnArray(Context, Populated, TRUE);
>          ASSERT(Freed == Populated);
> @@ -634,10 +635,11 @@ BalloonDeflate(
>      Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
>      Context->Size -= Count;
> 
> -    return Abort;
> +done:
> +    return status;
>  }
> 
> -static BOOLEAN
> +static NTSTATUS
>  BalloonInflate(
>      IN  PXENBUS_BALLOON_CONTEXT Context,
>      IN  ULONGLONG               Requested
> @@ -645,23 +647,26 @@ BalloonInflate(
>  {
>      LARGE_INTEGER               Start;
>      LARGE_INTEGER               End;
> -    BOOLEAN                     Abort;
> +    NTSTATUS                    status;
>      ULONGLONG                   Count;
>      ULONGLONG                   TimeDelta;
> 
> +    status = STATUS_UNSUCCESSFUL;
>      if (Context->FIST.Inflation)
> -        return TRUE;
> +        goto done;
> +
> +    status = STATUS_NO_MEMORY;
>      if (BalloonLowMemory(Context))
> -        return TRUE;
> +        goto done;

Ah. Forget my comment on patch #2 then.

> 
>      Info("====> %llu page(s)\n", Requested);
> 
>      KeQuerySystemTime(&Start);
> 
>      Count = 0;
> -    Abort = FALSE;
> +    status = STATUS_SUCCESS;
> 
> -    while (Count < Requested && !Abort) {
> +    while (Count < Requested && NT_SUCCESS(status)) {
>          ULONG   ThisTime = (ULONG)__min(Requested - Count,
> XENBUS_BALLOON_PFN_ARRAY_SIZE);
>          ULONG   Allocated;
>          BOOLEAN Slow;
> @@ -669,7 +674,7 @@ BalloonInflate(
> 
>          Allocated = BalloonAllocatePfnArray(Context, ThisTime, &Slow);
>          if (Allocated < ThisTime || Slow)
> -            Abort = TRUE;
> +            status = STATUS_RETRY;
> 
>          Released = BalloonReleasePfnArray(Context, Allocated);
> 
> @@ -685,7 +690,7 @@ BalloonInflate(
>          }
> 
>          if (Released == 0)
> -            Abort = TRUE;
> +            status = STATUS_RETRY;
> 
>          Count += Released;
>      }
> @@ -697,7 +702,8 @@ BalloonInflate(
>      Info("<==== %llu page(s) in %llums\n", Count, TimeDelta);
>      Context->Size += Count;
> 
> -    return Abort;
> +done:
> +    return status;
>  }
> 
>  static VOID
> @@ -747,6 +753,20 @@ BalloonGetFISTEntries(
>          Warning("deflation disallowed\n");
>  }
> 
> +static FORCEINLINE PCHAR

Should be 'const CHAR *'

> +__BalloonStatus(
> +    IN  NTSTATUS    status
> +    )
> +{
> +    switch (status) {
> +    case STATUS_SUCCESS:        return "";
> +    case STATUS_UNSUCCESSFUL:   return " [FIST]";
> +    case STATUS_RETRY:          return " [RETRY]";
> +    case STATUS_NO_MEMORY:      return " [LOW_MEM]";
> +    default:                    return " [UNKNOWN]";
> +    }

I generally dislike putting things on a single line like this, but I can fix that up.

> +}
> +
>  NTSTATUS
>  BalloonAdjust(
>      IN  PINTERFACE          Interface,
> @@ -754,28 +774,29 @@ BalloonAdjust(
>      )
>  {
>      PXENBUS_BALLOON_CONTEXT Context = Interface->Context;
> -    BOOLEAN                 Abort;
> +    NTSTATUS                status;
> 
>      ASSERT3U(KeGetCurrentIrql(), <, DISPATCH_LEVEL);
> 
>      Info("====> (%llu page(s))\n", Context->Size);
> 
> -    Abort = FALSE;
> +    status = STATUS_SUCCESS;
> 
>      BalloonGetFISTEntries(Context);
> 
> -    while (Context->Size != Size && !Abort) {
> +    while (Context->Size != Size && NT_SUCCESS(status)) {
>          if (Size > Context->Size)
> -            Abort = BalloonInflate(Context, Size - Context->Size);
> +            status = BalloonInflate(Context, Size - Context->Size);
>          else if (Size < Context->Size)
> -            Abort = BalloonDeflate(Context, Context->Size - Size);
> +            status = BalloonDeflate(Context, Context->Size - Size);
>      }
> 
> -    Info("<==== (%llu page(s))%s\n",
> +    Info("<==== (%llu page(s))%s%s\n",
>           Context->Size,
> -         (Abort) ? " [ABORTED]" : "");
> +         NT_SUCCESS(status) ? "" : " [ABORTED]",
> +         __BalloonStatus(status));

We don't really need [ABORTED] any more since __BalloonStatus() will now provide a more specific message. I'll get rid of it.

Acked-by: Paul Durrant <paul.durrant@citrix.com>

> 
> -    return (Abort) ? STATUS_RETRY : STATUS_SUCCESS;
> +    return status;
>  }
> 
>  ULONGLONG
> --
> 1.9.4.msysgit.1
> 
> 
> _______________________________________________
> win-pv-devel mailing list
> win-pv-devel@lists.xenproject.org
> http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 16:47:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 16:47:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9FEc-0007jV-8R; Wed, 16 Dec 2015 16:47:26 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <persaur@gmail.com>) id 1a9FEa-0007jQ-Ob
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 16:47:24 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	A0/3C-13475-C9591765; Wed, 16 Dec 2015 16:47:24 +0000
X-Env-Sender: persaur@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1450284442!11474394!1
X-Originating-IP: [209.85.192.47]
X-SpamReason: No, hits=0.7 required=7.0 tests=BODY_RANDOM_LONG,
	MIME_QP_LONG_LINE
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24444 invoked from network); 16 Dec 2015 16:47:23 -0000
Received: from mail-qg0-f47.google.com (HELO mail-qg0-f47.google.com)
	(209.85.192.47)
	by server-10.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 16:47:23 -0000
Received: by mail-qg0-f47.google.com with SMTP id 21so38662051qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 08:47:22 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=content-type:mime-version:subject:from:in-reply-to:date:cc
	:content-transfer-encoding:message-id:references:to;
	bh=cvrmqoFO5PzWgb+arouPzjZSbC898kq8+h6HldmDrc0=;
	b=nz8SIbhg2x1pfk8eTXd+kbEU+1+n4Ey7iBHf6L4UMXQzIUbJF01MiI5ajjza005S4P
	BV4lXrMYJ14K6QdltBvD4TkmvPLP1izFVm6516X9z3t+cFDjjGEI7wJyCs+Rsg/KMean
	EQZKT1oaE8VVeY/0Z5I5Sf18iREtLdvr4UTXR1dhw35RRcl/ll4kzvto5+tYxj7nk4du
	eEjKJCKukZ2aXaRuIulpb7J6FapzQijpr/0fhGoGP18mIXrOdIPp+JdyPw/AKHKDM9tj
	pKpIBl6Cx3Dv3IeIOwXoK7ohVNHZRm4K7X+bDjV2QpCEE4mrkq1X1HCsAUeD9xzmfec8
	TTFA==
X-Received: by 10.140.220.136 with SMTP id q130mr54439158qhb.24.1450284442074; 
	Wed, 16 Dec 2015 08:47:22 -0800 (PST)
Received: from [192.168.30.60] (cpe-67-244-87-116.nyc.res.rr.com.
	[67.244.87.116])
	by smtp.gmail.com with ESMTPSA id b7sm1450479qga.10.2015.12.16.08.47.20
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 08:47:21 -0800 (PST)
Mime-Version: 1.0 (1.0)
From: Rich Persaud <persaur@gmail.com>
X-Mailer: iPad Mail (13C75)
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
Date: Wed, 16 Dec 2015 11:47:20 -0500
Message-Id: <1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:

>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of Simon Martin
>> Sent: 15 December 2015 01:37
>> To: win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] USB driver
>> 
>> Hi all,
>> 
>> First mail to this list. I need to push USB hub devices through to a
>> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
>> been deprecated so I am wondering how to achieve this.
>> 
>> Is anyone working on a PV USB driver?
> 
> Unfortunately I don't believe anyone is working on a PV USB driver. I would certainly welcome it if someone did though...

OpenXT has a PV USB implementation for Windows and Linux.  There has been some discussion about future OpenXT support for upstream PV drivers.  Development assistance with this migration would be helpful.

Rich

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 16:47:28 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 16:47:28 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9FEc-0007jV-8R; Wed, 16 Dec 2015 16:47:26 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <persaur@gmail.com>) id 1a9FEa-0007jQ-Ob
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 16:47:24 +0000
Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id
	A0/3C-13475-C9591765; Wed, 16 Dec 2015 16:47:24 +0000
X-Env-Sender: persaur@gmail.com
X-Msg-Ref: server-10.tower-27.messagelabs.com!1450284442!11474394!1
X-Originating-IP: [209.85.192.47]
X-SpamReason: No, hits=0.7 required=7.0 tests=BODY_RANDOM_LONG,
	MIME_QP_LONG_LINE
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 24444 invoked from network); 16 Dec 2015 16:47:23 -0000
Received: from mail-qg0-f47.google.com (HELO mail-qg0-f47.google.com)
	(209.85.192.47)
	by server-10.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 16:47:23 -0000
Received: by mail-qg0-f47.google.com with SMTP id 21so38662051qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 08:47:22 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=content-type:mime-version:subject:from:in-reply-to:date:cc
	:content-transfer-encoding:message-id:references:to;
	bh=cvrmqoFO5PzWgb+arouPzjZSbC898kq8+h6HldmDrc0=;
	b=nz8SIbhg2x1pfk8eTXd+kbEU+1+n4Ey7iBHf6L4UMXQzIUbJF01MiI5ajjza005S4P
	BV4lXrMYJ14K6QdltBvD4TkmvPLP1izFVm6516X9z3t+cFDjjGEI7wJyCs+Rsg/KMean
	EQZKT1oaE8VVeY/0Z5I5Sf18iREtLdvr4UTXR1dhw35RRcl/ll4kzvto5+tYxj7nk4du
	eEjKJCKukZ2aXaRuIulpb7J6FapzQijpr/0fhGoGP18mIXrOdIPp+JdyPw/AKHKDM9tj
	pKpIBl6Cx3Dv3IeIOwXoK7ohVNHZRm4K7X+bDjV2QpCEE4mrkq1X1HCsAUeD9xzmfec8
	TTFA==
X-Received: by 10.140.220.136 with SMTP id q130mr54439158qhb.24.1450284442074; 
	Wed, 16 Dec 2015 08:47:22 -0800 (PST)
Received: from [192.168.30.60] (cpe-67-244-87-116.nyc.res.rr.com.
	[67.244.87.116])
	by smtp.gmail.com with ESMTPSA id b7sm1450479qga.10.2015.12.16.08.47.20
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 08:47:21 -0800 (PST)
Mime-Version: 1.0 (1.0)
From: Rich Persaud <persaur@gmail.com>
X-Mailer: iPad Mail (13C75)
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
Date: Wed, 16 Dec 2015 11:47:20 -0500
Message-Id: <1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:

>> -----Original Message-----
>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>> bounces@lists.xenproject.org] On Behalf Of Simon Martin
>> Sent: 15 December 2015 01:37
>> To: win-pv-devel@lists.xenproject.org
>> Subject: [win-pv-devel] USB driver
>> 
>> Hi all,
>> 
>> First mail to this list. I need to push USB hub devices through to a
>> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
>> been deprecated so I am wondering how to achieve this.
>> 
>> Is anyone working on a PV USB driver?
> 
> Unfortunately I don't believe anyone is working on a PV USB driver. I would certainly welcome it if someone did though...

OpenXT has a PV USB implementation for Windows and Linux.  There has been some discussion about future OpenXT support for upstream PV drivers.  Development assistance with this migration would be helpful.

Rich

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 16:49:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 16:49:32 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9FGd-0007lg-GD; Wed, 16 Dec 2015 16:49:31 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9FGc-0007lb-KA
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 16:49:30 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	AB/AF-32615-91691765; Wed, 16 Dec 2015 16:49:29 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1450284567!10923526!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 48572 invoked from network); 16 Dec 2015 16:49:28 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 16:49:28 -0000
X-IronPort-AV: E=Sophos;i="5.20,437,1444694400"; d="scan'208";a="10473721"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Rich Persaud <persaur@gmail.com>
Thread-Topic: [win-pv-devel] USB driver
Thread-Index: AQHRNtk1U2LmeMaTc0updl5I8+IWiZ7LyIAQgAH75QCAABEf0A==
Date: Wed, 16 Dec 2015 16:49:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
In-Reply-To: <1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Rich Persaud [mailto:persaur@gmail.com]
> Sent: 16 December 2015 16:47
> To: Paul Durrant
> Cc: Simon Martin; win-pv-devel@lists.xenproject.org; Ross Philipson
> Subject: Re: [win-pv-devel] USB driver
> 
> On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:
> 
> >> -----Original Message-----
> >> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> >> bounces@lists.xenproject.org] On Behalf Of Simon Martin
> >> Sent: 15 December 2015 01:37
> >> To: win-pv-devel@lists.xenproject.org
> >> Subject: [win-pv-devel] USB driver
> >>
> >> Hi all,
> >>
> >> First mail to this list. I need to push USB hub devices through to a
> >> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
> >> been deprecated so I am wondering how to achieve this.
> >>
> >> Is anyone working on a PV USB driver?
> >
> > Unfortunately I don't believe anyone is working on a PV USB driver. I would
> certainly welcome it if someone did though...
> 
> OpenXT has a PV USB implementation for Windows and Linux.  There has
> been some discussion about future OpenXT support for upstream PV drivers.
> Development assistance with this migration would be helpful.
> 

Rich,

  Could you provide a URL for the code for the Windows driver?

  Paul

> Rich

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 16:49:32 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 16:49:32 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9FGd-0007lg-GD; Wed, 16 Dec 2015 16:49:31 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7852997cf=Paul.Durrant@citrix.com>)
	id 1a9FGc-0007lb-KA
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 16:49:30 +0000
Received: from [85.158.139.211] by server-1.bemta-5.messagelabs.com id
	AB/AF-32615-91691765; Wed, 16 Dec 2015 16:49:29 +0000
X-Env-Sender: prvs=7852997cf=Paul.Durrant@citrix.com
X-Msg-Ref: server-7.tower-206.messagelabs.com!1450284567!10923526!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG,
	received_headers: No Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 48572 invoked from network); 16 Dec 2015 16:49:28 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-7.tower-206.messagelabs.com with RC4-SHA encrypted SMTP;
	16 Dec 2015 16:49:28 -0000
X-IronPort-AV: E=Sophos;i="5.20,437,1444694400"; d="scan'208";a="10473721"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: Rich Persaud <persaur@gmail.com>
Thread-Topic: [win-pv-devel] USB driver
Thread-Index: AQHRNtk1U2LmeMaTc0updl5I8+IWiZ7LyIAQgAH75QCAABEf0A==
Date: Wed, 16 Dec 2015 16:49:17 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
In-Reply-To: <1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Rich Persaud [mailto:persaur@gmail.com]
> Sent: 16 December 2015 16:47
> To: Paul Durrant
> Cc: Simon Martin; win-pv-devel@lists.xenproject.org; Ross Philipson
> Subject: Re: [win-pv-devel] USB driver
> 
> On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:
> 
> >> -----Original Message-----
> >> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
> >> bounces@lists.xenproject.org] On Behalf Of Simon Martin
> >> Sent: 15 December 2015 01:37
> >> To: win-pv-devel@lists.xenproject.org
> >> Subject: [win-pv-devel] USB driver
> >>
> >> Hi all,
> >>
> >> First mail to this list. I need to push USB hub devices through to a
> >> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
> >> been deprecated so I am wondering how to achieve this.
> >>
> >> Is anyone working on a PV USB driver?
> >
> > Unfortunately I don't believe anyone is working on a PV USB driver. I would
> certainly welcome it if someone did though...
> 
> OpenXT has a PV USB implementation for Windows and Linux.  There has
> been some discussion about future OpenXT support for upstream PV drivers.
> Development assistance with this migration would be helpful.
> 

Rich,

  Could you provide a URL for the code for the Windows driver?

  Paul

> Rich

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 17:53:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 17:53:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9GGe-0004d5-Mn; Wed, 16 Dec 2015 17:53:36 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <persaur@gmail.com>) id 1a9GGd-0004cm-2Y
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 17:53:35 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	5D/6C-25435-E15A1765; Wed, 16 Dec 2015 17:53:34 +0000
X-Env-Sender: persaur@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1450288412!7699271!1
X-Originating-IP: [209.85.192.41]
X-SpamReason: No, hits=0.7 required=7.0 tests=BODY_RANDOM_LONG,
	MIME_QP_LONG_LINE
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 50338 invoked from network); 16 Dec 2015 17:53:33 -0000
Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com)
	(209.85.192.41)
	by server-8.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 17:53:33 -0000
Received: by mail-qg0-f41.google.com with SMTP id 21so40479918qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 09:53:33 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=content-type:mime-version:subject:from:in-reply-to:date:cc
	:content-transfer-encoding:message-id:references:to;
	bh=JC60JWmqAKyj/o+L2Im0tY5RM1U9GO9BKhRs4PiBR5A=;
	b=OWU0nfHFYT87fSQVE7JvT5livuK4ZlxpLCpHsOXE+rKV64lQPJRA8qXca2jDdDgZJ9
	+RFrkL1ffNXDprySmxs7HioaKPzxiJxyDKyC41JaitZbZ6I4zhq8ebiuvbKAgzi4eA6s
	s8aZMgbgP9hVOXmZi25FDKLA8r1CDTbOevS57drjFzQQTCLKZI4XR4Bwp5QcpBUYejfk
	8iATfGAPTokK3W8+QAujxo+z2TNuvSJLw0Eqozjnl+wnjrTDwLfd6BbTRKQuaVTsYkpC
	9EFXOsYnk1zf2qpGraVmMITsts/gwqpmU+JY3S8jLfee7TTO8QhuXAVBq639FkKADsPR
	dhkQ==
X-Received: by 10.141.28.80 with SMTP id f77mr54820520qhe.66.1450288412102;
	Wed, 16 Dec 2015 09:53:32 -0800 (PST)
Received: from [192.168.30.60] (cpe-67-244-87-116.nyc.res.rr.com.
	[67.244.87.116]) by smtp.gmail.com with ESMTPSA id
	c67sm2991207qgd.29.2015.12.16.09.53.31
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 09:53:31 -0800 (PST)
Mime-Version: 1.0 (1.0)
From: Rich Persaud <persaur@gmail.com>
X-Mailer: iPad Mail (13C75)
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
Date: Wed, 16 Dec 2015 12:53:30 -0500
Message-Id: <2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:

>> -----Original Message-----
>> From: Rich Persaud [mailto:persaur@gmail.com]
>> Sent: 16 December 2015 16:47
>> To: Paul Durrant
>> Cc: Simon Martin; win-pv-devel@lists.xenproject.org; Ross Philipson
>> Subject: Re: [win-pv-devel] USB driver
>> 
>> On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>> 
>>>> -----Original Message-----
>>>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>>>> bounces@lists.xenproject.org] On Behalf Of Simon Martin
>>>> Sent: 15 December 2015 01:37
>>>> To: win-pv-devel@lists.xenproject.org
>>>> Subject: [win-pv-devel] USB driver
>>>> 
>>>> Hi all,
>>>> 
>>>> First mail to this list. I need to push USB hub devices through to a
>>>> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
>>>> been deprecated so I am wondering how to achieve this.
>>>> 
>>>> Is anyone working on a PV USB driver?
>>> 
>>> Unfortunately I don't believe anyone is working on a PV USB driver. I would
>> certainly welcome it if someone did though...
>> 
>> OpenXT has a PV USB implementation for Windows and Linux.  There has
>> been some discussion about future OpenXT support for upstream PV drivers.
>> Development assistance with this migration would be helpful.
> 
> Rich,
> 
> Could you provide a URL for the code for the Windows driver?

Paul,

Here is the Windows driver code:  

 https://github.com/OpenXT/xc-vusb
 https://github.com/OpenXT/xc-windows

dom0 policy daemon:

 https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
 https://github.com/OpenXT/vusb-daemon

Rich
_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 17:53:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 17:53:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9GGe-0004d5-Mn; Wed, 16 Dec 2015 17:53:36 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <persaur@gmail.com>) id 1a9GGd-0004cm-2Y
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 17:53:35 +0000
Received: from [193.109.254.147] by server-3.bemta-14.messagelabs.com id
	5D/6C-25435-E15A1765; Wed, 16 Dec 2015 17:53:34 +0000
X-Env-Sender: persaur@gmail.com
X-Msg-Ref: server-8.tower-27.messagelabs.com!1450288412!7699271!1
X-Originating-IP: [209.85.192.41]
X-SpamReason: No, hits=0.7 required=7.0 tests=BODY_RANDOM_LONG,
	MIME_QP_LONG_LINE
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 50338 invoked from network); 16 Dec 2015 17:53:33 -0000
Received: from mail-qg0-f41.google.com (HELO mail-qg0-f41.google.com)
	(209.85.192.41)
	by server-8.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 17:53:33 -0000
Received: by mail-qg0-f41.google.com with SMTP id 21so40479918qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 09:53:33 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=content-type:mime-version:subject:from:in-reply-to:date:cc
	:content-transfer-encoding:message-id:references:to;
	bh=JC60JWmqAKyj/o+L2Im0tY5RM1U9GO9BKhRs4PiBR5A=;
	b=OWU0nfHFYT87fSQVE7JvT5livuK4ZlxpLCpHsOXE+rKV64lQPJRA8qXca2jDdDgZJ9
	+RFrkL1ffNXDprySmxs7HioaKPzxiJxyDKyC41JaitZbZ6I4zhq8ebiuvbKAgzi4eA6s
	s8aZMgbgP9hVOXmZi25FDKLA8r1CDTbOevS57drjFzQQTCLKZI4XR4Bwp5QcpBUYejfk
	8iATfGAPTokK3W8+QAujxo+z2TNuvSJLw0Eqozjnl+wnjrTDwLfd6BbTRKQuaVTsYkpC
	9EFXOsYnk1zf2qpGraVmMITsts/gwqpmU+JY3S8jLfee7TTO8QhuXAVBq639FkKADsPR
	dhkQ==
X-Received: by 10.141.28.80 with SMTP id f77mr54820520qhe.66.1450288412102;
	Wed, 16 Dec 2015 09:53:32 -0800 (PST)
Received: from [192.168.30.60] (cpe-67-244-87-116.nyc.res.rr.com.
	[67.244.87.116]) by smtp.gmail.com with ESMTPSA id
	c67sm2991207qgd.29.2015.12.16.09.53.31
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 09:53:31 -0800 (PST)
Mime-Version: 1.0 (1.0)
From: Rich Persaud <persaur@gmail.com>
X-Mailer: iPad Mail (13C75)
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
Date: Wed, 16 Dec 2015 12:53:30 -0500
Message-Id: <2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
To: Paul Durrant <Paul.Durrant@citrix.com>
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:

>> -----Original Message-----
>> From: Rich Persaud [mailto:persaur@gmail.com]
>> Sent: 16 December 2015 16:47
>> To: Paul Durrant
>> Cc: Simon Martin; win-pv-devel@lists.xenproject.org; Ross Philipson
>> Subject: Re: [win-pv-devel] USB driver
>> 
>> On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>> 
>>>> -----Original Message-----
>>>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>>>> bounces@lists.xenproject.org] On Behalf Of Simon Martin
>>>> Sent: 15 December 2015 01:37
>>>> To: win-pv-devel@lists.xenproject.org
>>>> Subject: [win-pv-devel] USB driver
>>>> 
>>>> Hi all,
>>>> 
>>>> First mail to this list. I need to push USB hub devices through to a
>>>> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
>>>> been deprecated so I am wondering how to achieve this.
>>>> 
>>>> Is anyone working on a PV USB driver?
>>> 
>>> Unfortunately I don't believe anyone is working on a PV USB driver. I would
>> certainly welcome it if someone did though...
>> 
>> OpenXT has a PV USB implementation for Windows and Linux.  There has
>> been some discussion about future OpenXT support for upstream PV drivers.
>> Development assistance with this migration would be helpful.
> 
> Rich,
> 
> Could you provide a URL for the code for the Windows driver?

Paul,

Here is the Windows driver code:  

 https://github.com/OpenXT/xc-vusb
 https://github.com/OpenXT/xc-windows

dom0 policy daemon:

 https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
 https://github.com/OpenXT/vusb-daemon

Rich
_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 18:29:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 18:29:02 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9Gow-0006Zq-CL; Wed, 16 Dec 2015 18:29:02 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <ross.philipson@gmail.com>) id 1a9Gou-0006Zh-HI
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 18:29:00 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	B1/41-14715-B6DA1765; Wed, 16 Dec 2015 18:28:59 +0000
X-Env-Sender: ross.philipson@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1450290538!11155582!1
X-Originating-IP: [209.85.192.46]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 35045 invoked from network); 16 Dec 2015 18:28:58 -0000
Received: from mail-qg0-f46.google.com (HELO mail-qg0-f46.google.com)
	(209.85.192.46)
	by server-10.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 18:28:58 -0000
Received: by mail-qg0-f46.google.com with SMTP id 21so41432418qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 10:28:58 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=N9B1jwS5pivoyS8YxT3OQN4niDT4Q05k6fiOTAyzYQc=;
	b=EbrPRQ08WSOxMrEzNgOTj3aAacfZS48Su7zjSF4daEMGy+dZASamB8yfJlv3ysB4km
	7MtSXBlNhbITzSDJmykeUCuusOsu8H2i+X2N0CTqfy2GYaKWuXJQ6ot/2y6/MFnPS8GV
	bd8mSG0I6CPFfAfm3Tsr+1YJX5Ro9wNjZzKMKfoedaIN1cvC7ZBs1bfZ3CC8QVIpA8tB
	x1rKyOsn0PmEC15n6X1wiLxxBq3UhF/vN7eKMIfxO/3dKzC47mWAQmUHRp2BMlf5B+dA
	sfmlC8CKNovX4IqCWpM2WfXa5NbExBytK5tE/eUQ5CCrWWeyZwBu+ao0SQ2bKag30bCQ
	qdkQ==
X-Received: by 10.140.39.179 with SMTP id v48mr29930061qgv.98.1450290537904;
	Wed, 16 Dec 2015 10:28:57 -0800 (PST)
Received: from [192.168.2.11]
	(70-88-247-169-ma-nh-me-ne.hfc.comcastbusiness.net. [70.88.247.169])
	by smtp.googlemail.com with ESMTPSA id
	d69sm3052667qkb.45.2015.12.16.10.28.57
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 10:28:57 -0800 (PST)
Message-ID: <5671AD3B.1070700@gmail.com>
Date: Wed, 16 Dec 2015 13:28:11 -0500
From: Ross Philipson <ross.philipson@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Icedove/31.8.0
MIME-Version: 1.0
To: Rich Persaud <persaur@gmail.com>, Paul Durrant <Paul.Durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
In-Reply-To: <2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 12/16/2015 12:53 PM, Rich Persaud wrote:
> On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>
>>> -----Original Message-----
>>> From: Rich Persaud [mailto:persaur@gmail.com]
>>> Sent: 16 December 2015 16:47
>>> To: Paul Durrant
>>> Cc: Simon Martin; win-pv-devel@lists.xenproject.org; Ross Philipson
>>> Subject: Re: [win-pv-devel] USB driver
>>>
>>> On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>>>
>>>>> -----Original Message-----
>>>>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>>>>> bounces@lists.xenproject.org] On Behalf Of Simon Martin
>>>>> Sent: 15 December 2015 01:37
>>>>> To: win-pv-devel@lists.xenproject.org
>>>>> Subject: [win-pv-devel] USB driver
>>>>>
>>>>> Hi all,
>>>>>
>>>>> First mail to this list. I need to push USB hub devices through to a
>>>>> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
>>>>> been deprecated so I am wondering how to achieve this.
>>>>>
>>>>> Is anyone working on a PV USB driver?
>>>>
>>>> Unfortunately I don't believe anyone is working on a PV USB driver. I would
>>> certainly welcome it if someone did though...
>>>
>>> OpenXT has a PV USB implementation for Windows and Linux.  There has
>>> been some discussion about future OpenXT support for upstream PV drivers.
>>> Development assistance with this migration would be helpful.
>>
>> Rich,
>>
>> Could you provide a URL for the code for the Windows driver?
>
> Paul,
>
> Here is the Windows driver code:
>
>   https://github.com/OpenXT/xc-vusb
>   https://github.com/OpenXT/xc-windows
>
> dom0 policy daemon:
>
>   https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
>   https://github.com/OpenXT/vusb-daemon
>
> Rich
>

I will expand on what Rich has said. The OpenXT project currently 
contains the PV USB stack that originated in the Citrix XenClient 
Enterprise project and was open sourced in the over all open source 
effort making the former Citrix XenClient XT project into OpenXT.

The original pieces were the Xen usbback driver component and the 
Windows front end driver:

https://github.com/OpenXT/xenclient-oe/blob/master/recipes-kernel/linux/3.18/patches/usbback-base.patch

https://github.com/OpenXT/xc-vusb

I then wrote a Linux front end for this:

https://github.com/OpenXT/pv-linux-drivers/tree/master/xc-vusb

And a colleague of ours wrote a new daemon to control USB policy, 
assignment and xenbus device management:

https://github.com/OpenXT/vusb-daemon


-- 
Ross Philipson

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 18:29:02 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 18:29:02 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9Gow-0006Zq-CL; Wed, 16 Dec 2015 18:29:02 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <ross.philipson@gmail.com>) id 1a9Gou-0006Zh-HI
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 18:29:00 +0000
Received: from [85.158.137.68] by server-1.bemta-3.messagelabs.com id
	B1/41-14715-B6DA1765; Wed, 16 Dec 2015 18:28:59 +0000
X-Env-Sender: ross.philipson@gmail.com
X-Msg-Ref: server-10.tower-31.messagelabs.com!1450290538!11155582!1
X-Originating-IP: [209.85.192.46]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 35045 invoked from network); 16 Dec 2015 18:28:58 -0000
Received: from mail-qg0-f46.google.com (HELO mail-qg0-f46.google.com)
	(209.85.192.46)
	by server-10.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 18:28:58 -0000
Received: by mail-qg0-f46.google.com with SMTP id 21so41432418qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 10:28:58 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=N9B1jwS5pivoyS8YxT3OQN4niDT4Q05k6fiOTAyzYQc=;
	b=EbrPRQ08WSOxMrEzNgOTj3aAacfZS48Su7zjSF4daEMGy+dZASamB8yfJlv3ysB4km
	7MtSXBlNhbITzSDJmykeUCuusOsu8H2i+X2N0CTqfy2GYaKWuXJQ6ot/2y6/MFnPS8GV
	bd8mSG0I6CPFfAfm3Tsr+1YJX5Ro9wNjZzKMKfoedaIN1cvC7ZBs1bfZ3CC8QVIpA8tB
	x1rKyOsn0PmEC15n6X1wiLxxBq3UhF/vN7eKMIfxO/3dKzC47mWAQmUHRp2BMlf5B+dA
	sfmlC8CKNovX4IqCWpM2WfXa5NbExBytK5tE/eUQ5CCrWWeyZwBu+ao0SQ2bKag30bCQ
	qdkQ==
X-Received: by 10.140.39.179 with SMTP id v48mr29930061qgv.98.1450290537904;
	Wed, 16 Dec 2015 10:28:57 -0800 (PST)
Received: from [192.168.2.11]
	(70-88-247-169-ma-nh-me-ne.hfc.comcastbusiness.net. [70.88.247.169])
	by smtp.googlemail.com with ESMTPSA id
	d69sm3052667qkb.45.2015.12.16.10.28.57
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 10:28:57 -0800 (PST)
Message-ID: <5671AD3B.1070700@gmail.com>
Date: Wed, 16 Dec 2015 13:28:11 -0500
From: Ross Philipson <ross.philipson@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Icedove/31.8.0
MIME-Version: 1.0
To: Rich Persaud <persaur@gmail.com>, Paul Durrant <Paul.Durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
In-Reply-To: <2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
Cc: Simon Martin <furryfuttock@gmail.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 12/16/2015 12:53 PM, Rich Persaud wrote:
> On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>
>>> -----Original Message-----
>>> From: Rich Persaud [mailto:persaur@gmail.com]
>>> Sent: 16 December 2015 16:47
>>> To: Paul Durrant
>>> Cc: Simon Martin; win-pv-devel@lists.xenproject.org; Ross Philipson
>>> Subject: Re: [win-pv-devel] USB driver
>>>
>>> On Dec 15, 2015, at 04:44, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>>>
>>>>> -----Original Message-----
>>>>> From: win-pv-devel-bounces@lists.xenproject.org [mailto:win-pv-devel-
>>>>> bounces@lists.xenproject.org] On Behalf Of Simon Martin
>>>>> Sent: 15 December 2015 01:37
>>>>> To: win-pv-devel@lists.xenproject.org
>>>>> Subject: [win-pv-devel] USB driver
>>>>>
>>>>> Hi all,
>>>>>
>>>>> First mail to this list. I need to push USB hub devices through to a
>>>>> Windows HVM. It seems that the USB driver in the old GPLPV drivers has
>>>>> been deprecated so I am wondering how to achieve this.
>>>>>
>>>>> Is anyone working on a PV USB driver?
>>>>
>>>> Unfortunately I don't believe anyone is working on a PV USB driver. I would
>>> certainly welcome it if someone did though...
>>>
>>> OpenXT has a PV USB implementation for Windows and Linux.  There has
>>> been some discussion about future OpenXT support for upstream PV drivers.
>>> Development assistance with this migration would be helpful.
>>
>> Rich,
>>
>> Could you provide a URL for the code for the Windows driver?
>
> Paul,
>
> Here is the Windows driver code:
>
>   https://github.com/OpenXT/xc-vusb
>   https://github.com/OpenXT/xc-windows
>
> dom0 policy daemon:
>
>   https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
>   https://github.com/OpenXT/vusb-daemon
>
> Rich
>

I will expand on what Rich has said. The OpenXT project currently 
contains the PV USB stack that originated in the Citrix XenClient 
Enterprise project and was open sourced in the over all open source 
effort making the former Citrix XenClient XT project into OpenXT.

The original pieces were the Xen usbback driver component and the 
Windows front end driver:

https://github.com/OpenXT/xenclient-oe/blob/master/recipes-kernel/linux/3.18/patches/usbback-base.patch

https://github.com/OpenXT/xc-vusb

I then wrote a Linux front end for this:

https://github.com/OpenXT/pv-linux-drivers/tree/master/xc-vusb

And a colleague of ours wrote a new daemon to control USB policy, 
assignment and xenbus device management:

https://github.com/OpenXT/vusb-daemon


-- 
Ross Philipson

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 19:00:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 19:00:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9HJn-0000Q3-0q; Wed, 16 Dec 2015 19:00:55 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a9HJm-0000Pv-4a
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 19:00:54 +0000
Received: from [85.158.139.211] by server-2.bemta-5.messagelabs.com id
	68/EA-31450-5E4B1765; Wed, 16 Dec 2015 19:00:53 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1450292452!10941341!1
X-Originating-IP: [209.85.192.44]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26215 invoked from network); 16 Dec 2015 19:00:52 -0000
Received: from mail-qg0-f44.google.com (HELO mail-qg0-f44.google.com)
	(209.85.192.44)
	by server-8.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 19:00:52 -0000
Received: by mail-qg0-f44.google.com with SMTP id k90so9101022qge.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 11:00:52 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:cc:subject:in-reply-to:references
	:mime-version:content-type:content-transfer-encoding;
	bh=4Amw02ALTM4PB587/rQ4paxZlfnOtzXQcOChpw5d4kw=;
	b=Ye72hnqOD5CqJjL5dAwqNFj9LxGO85WbQAJCG/ZIlVEwtZawAQ17MaERmezAnFj2OZ
	uuKIDEKpbdQfZzN5nlfoJ1RMQlt+dZO16lQLQ2rgwM1drjP3GTzVALDqlViy74sG+Abj
	YuPtutytlNhGm0XhBbC4CGi0MYK+sWwiVdnf/MhSq4KbXlZeSWMN4Cl0SVc41ZunKRB3
	UfQzLkSLxSrFPWtxBkks9WiZwaklwbYMem/DIff+yUU+CsnxMhD+RfpC8HdJN+VD5k/o
	tVzUjNrRd8MuRDuN4PvqgbDHsW5TLjP24UfGRLFQDzRacPqLyuk2YmuIcCVeAonUop2G
	0V5g==
X-Received: by 10.140.101.130 with SMTP id u2mr16526530qge.71.1450292451749;
	Wed, 16 Dec 2015 11:00:51 -0800 (PST)
Received: from smartin-envy.nemo.cl ([181.43.17.237])
	by smtp.gmail.com with ESMTPSA id
	p84sm3081471qhp.45.2015.12.16.11.00.50
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 11:00:51 -0800 (PST)
Date: Wed, 16 Dec 2015 16:00:49 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1769587658.20151216160049@gmail.com>
To: Rich Persaud <persaur@gmail.com>, Paul Durrant <Paul.Durrant@citrix.com>
In-Reply-To: <2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com> 
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
MIME-Version: 1.0
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Rich,

Wednesday, December 16, 2015, 2:53:30 PM, you wrote:

> On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:

<snip>

>> Rich,
>> 
>> Could you provide a URL for the code for the Windows driver?

> Paul,

> Here is the Windows driver code:  

>  https://github.com/OpenXT/xc-vusb
>  https://github.com/OpenXT/xc-windows

> dom0 policy daemon:

>  https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
>  https://github.com/OpenXT/vusb-daemon

> Rich

Looking at the code here it looks like xc-windows should be replaced
by the existing xenbus implementation, just port xc-vusb to this
infrastructure.

vusb-daemon should interface directly with Xen in Dom0.

Do you understand the same thing?

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 19:00:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 19:00:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9HJn-0000Q3-0q; Wed, 16 Dec 2015 19:00:55 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a9HJm-0000Pv-4a
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 19:00:54 +0000
Received: from [85.158.139.211] by server-2.bemta-5.messagelabs.com id
	68/EA-31450-5E4B1765; Wed, 16 Dec 2015 19:00:53 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-8.tower-206.messagelabs.com!1450292452!10941341!1
X-Originating-IP: [209.85.192.44]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 26215 invoked from network); 16 Dec 2015 19:00:52 -0000
Received: from mail-qg0-f44.google.com (HELO mail-qg0-f44.google.com)
	(209.85.192.44)
	by server-8.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 19:00:52 -0000
Received: by mail-qg0-f44.google.com with SMTP id k90so9101022qge.0
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 11:00:52 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:cc:subject:in-reply-to:references
	:mime-version:content-type:content-transfer-encoding;
	bh=4Amw02ALTM4PB587/rQ4paxZlfnOtzXQcOChpw5d4kw=;
	b=Ye72hnqOD5CqJjL5dAwqNFj9LxGO85WbQAJCG/ZIlVEwtZawAQ17MaERmezAnFj2OZ
	uuKIDEKpbdQfZzN5nlfoJ1RMQlt+dZO16lQLQ2rgwM1drjP3GTzVALDqlViy74sG+Abj
	YuPtutytlNhGm0XhBbC4CGi0MYK+sWwiVdnf/MhSq4KbXlZeSWMN4Cl0SVc41ZunKRB3
	UfQzLkSLxSrFPWtxBkks9WiZwaklwbYMem/DIff+yUU+CsnxMhD+RfpC8HdJN+VD5k/o
	tVzUjNrRd8MuRDuN4PvqgbDHsW5TLjP24UfGRLFQDzRacPqLyuk2YmuIcCVeAonUop2G
	0V5g==
X-Received: by 10.140.101.130 with SMTP id u2mr16526530qge.71.1450292451749;
	Wed, 16 Dec 2015 11:00:51 -0800 (PST)
Received: from smartin-envy.nemo.cl ([181.43.17.237])
	by smtp.gmail.com with ESMTPSA id
	p84sm3081471qhp.45.2015.12.16.11.00.50
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 11:00:51 -0800 (PST)
Date: Wed, 16 Dec 2015 16:00:49 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <1769587658.20151216160049@gmail.com>
To: Rich Persaud <persaur@gmail.com>, Paul Durrant <Paul.Durrant@citrix.com>
In-Reply-To: <2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com> 
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
MIME-Version: 1.0
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	Ross Philipson <ross.philipson@gmail.com>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Rich,

Wednesday, December 16, 2015, 2:53:30 PM, you wrote:

> On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:

<snip>

>> Rich,
>> 
>> Could you provide a URL for the code for the Windows driver?

> Paul,

> Here is the Windows driver code:  

>  https://github.com/OpenXT/xc-vusb
>  https://github.com/OpenXT/xc-windows

> dom0 policy daemon:

>  https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
>  https://github.com/OpenXT/vusb-daemon

> Rich

Looking at the code here it looks like xc-windows should be replaced
by the existing xenbus implementation, just port xc-vusb to this
infrastructure.

vusb-daemon should interface directly with Xen in Dom0.

Do you understand the same thing?

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 19:14:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 19:14:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9HX8-0001qP-EF; Wed, 16 Dec 2015 19:14:42 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <ross.philipson@gmail.com>) id 1a9HX7-0001qK-LW
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 19:14:41 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	01/7C-31443-028B1765; Wed, 16 Dec 2015 19:14:40 +0000
X-Env-Sender: ross.philipson@gmail.com
X-Msg-Ref: server-16.tower-31.messagelabs.com!1450293279!3695071!1
X-Originating-IP: [209.85.192.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27583 invoked from network); 16 Dec 2015 19:14:39 -0000
Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com)
	(209.85.192.54)
	by server-16.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 19:14:39 -0000
Received: by mail-qg0-f54.google.com with SMTP id 21so42640370qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 11:14:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=PWtk5RkMqtqbUuNCoTzgsB6y5v1xdZIsI0BugKeWFSw=;
	b=mRCyP4CWn8WDoJN1JbdkAON1yEEXxZGC/jw00DhvaKiEJni+fvpycBHXu+WNncaz4w
	eruQQfwwFyrYoFAqx1SqemKUh1rXt0mKmJbC2sGhb2jfTuyQZPc6OZ9ttSiTkn0aMS0k
	v7jh4DWb1nlaQSmd71gDJLrGxP9Hh0tjUfFNH3qlQG/ybSdrJ3L00a2OSSy3k++2tpy9
	NbTqZ4ABEhiJh3+hleNVxu9nCgo6t06NXALv15tPRIRCMlxBc54GSdhEr2ODUNxyBteZ
	d7QaPCbK8E22YvCBoh4Jy6NtqwJm18zX+hoRxVqLlIlSD/MIbtFus9kLeig1UvNtDrx6
	5WlQ==
X-Received: by 10.140.229.72 with SMTP id z69mr30795210qhb.104.1450293278888; 
	Wed, 16 Dec 2015 11:14:38 -0800 (PST)
Received: from [192.168.2.11]
	(70-88-247-169-ma-nh-me-ne.hfc.comcastbusiness.net. [70.88.247.169])
	by smtp.googlemail.com with ESMTPSA id
	f7sm3116501qhf.7.2015.12.16.11.14.38
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 11:14:38 -0800 (PST)
Message-ID: <5671B7F0.4090307@gmail.com>
Date: Wed, 16 Dec 2015 14:13:52 -0500
From: Ross Philipson <ross.philipson@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Icedove/31.8.0
MIME-Version: 1.0
To: Simon Martin <furryfuttock@gmail.com>, Rich Persaud <persaur@gmail.com>,
	Paul Durrant <Paul.Durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
	<1769587658.20151216160049@gmail.com>
In-Reply-To: <1769587658.20151216160049@gmail.com>
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 12/16/2015 02:00 PM, Simon Martin wrote:
> Hello Rich,
>
> Wednesday, December 16, 2015, 2:53:30 PM, you wrote:
>
>> On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>
> <snip>
>
>>> Rich,
>>>
>>> Could you provide a URL for the code for the Windows driver?
>
>> Paul,
>
>> Here is the Windows driver code:
>
>>   https://github.com/OpenXT/xc-vusb
>>   https://github.com/OpenXT/xc-windows
>
>> dom0 policy daemon:
>
>>   https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
>>   https://github.com/OpenXT/vusb-daemon
>
>> Rich
>
> Looking at the code here it looks like xc-windows should be replaced
> by the existing xenbus implementation, just port xc-vusb to this
> infrastructure.

Yes we are moving OpenXT away from these old pv drivers and towards the 
upstream ones. xc-vusb will be ported to they new xenbus.

>
> vusb-daemon should interface directly with Xen in Dom0.

I am not sure exactly what you mean by this; can you clarify?

>
> Do you understand the same thing?
>


-- 
Ross Philipson

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 19:14:43 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 19:14:43 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9HX8-0001qP-EF; Wed, 16 Dec 2015 19:14:42 +0000
Received: from mail6.bemta3.messagelabs.com ([195.245.230.39])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <ross.philipson@gmail.com>) id 1a9HX7-0001qK-LW
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 19:14:41 +0000
Received: from [85.158.137.68] by server-13.bemta-3.messagelabs.com id
	01/7C-31443-028B1765; Wed, 16 Dec 2015 19:14:40 +0000
X-Env-Sender: ross.philipson@gmail.com
X-Msg-Ref: server-16.tower-31.messagelabs.com!1450293279!3695071!1
X-Originating-IP: [209.85.192.54]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 27583 invoked from network); 16 Dec 2015 19:14:39 -0000
Received: from mail-qg0-f54.google.com (HELO mail-qg0-f54.google.com)
	(209.85.192.54)
	by server-16.tower-31.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 19:14:39 -0000
Received: by mail-qg0-f54.google.com with SMTP id 21so42640370qgx.1
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 11:14:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=PWtk5RkMqtqbUuNCoTzgsB6y5v1xdZIsI0BugKeWFSw=;
	b=mRCyP4CWn8WDoJN1JbdkAON1yEEXxZGC/jw00DhvaKiEJni+fvpycBHXu+WNncaz4w
	eruQQfwwFyrYoFAqx1SqemKUh1rXt0mKmJbC2sGhb2jfTuyQZPc6OZ9ttSiTkn0aMS0k
	v7jh4DWb1nlaQSmd71gDJLrGxP9Hh0tjUfFNH3qlQG/ybSdrJ3L00a2OSSy3k++2tpy9
	NbTqZ4ABEhiJh3+hleNVxu9nCgo6t06NXALv15tPRIRCMlxBc54GSdhEr2ODUNxyBteZ
	d7QaPCbK8E22YvCBoh4Jy6NtqwJm18zX+hoRxVqLlIlSD/MIbtFus9kLeig1UvNtDrx6
	5WlQ==
X-Received: by 10.140.229.72 with SMTP id z69mr30795210qhb.104.1450293278888; 
	Wed, 16 Dec 2015 11:14:38 -0800 (PST)
Received: from [192.168.2.11]
	(70-88-247-169-ma-nh-me-ne.hfc.comcastbusiness.net. [70.88.247.169])
	by smtp.googlemail.com with ESMTPSA id
	f7sm3116501qhf.7.2015.12.16.11.14.38
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 11:14:38 -0800 (PST)
Message-ID: <5671B7F0.4090307@gmail.com>
Date: Wed, 16 Dec 2015 14:13:52 -0500
From: Ross Philipson <ross.philipson@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Icedove/31.8.0
MIME-Version: 1.0
To: Simon Martin <furryfuttock@gmail.com>, Rich Persaud <persaur@gmail.com>,
	Paul Durrant <Paul.Durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
	<1769587658.20151216160049@gmail.com>
In-Reply-To: <1769587658.20151216160049@gmail.com>
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 12/16/2015 02:00 PM, Simon Martin wrote:
> Hello Rich,
>
> Wednesday, December 16, 2015, 2:53:30 PM, you wrote:
>
>> On Dec 16, 2015, at 11:49, Paul Durrant <Paul.Durrant@citrix.com> wrote:
>
> <snip>
>
>>> Rich,
>>>
>>> Could you provide a URL for the code for the Windows driver?
>
>> Paul,
>
>> Here is the Windows driver code:
>
>>   https://github.com/OpenXT/xc-vusb
>>   https://github.com/OpenXT/xc-windows
>
>> dom0 policy daemon:
>
>>   https://openxt.atlassian.net/wiki/display/OD/vUSB+Daemon
>>   https://github.com/OpenXT/vusb-daemon
>
>> Rich
>
> Looking at the code here it looks like xc-windows should be replaced
> by the existing xenbus implementation, just port xc-vusb to this
> infrastructure.

Yes we are moving OpenXT away from these old pv drivers and towards the 
upstream ones. xc-vusb will be ported to they new xenbus.

>
> vusb-daemon should interface directly with Xen in Dom0.

I am not sure exactly what you mean by this; can you clarify?

>
> Do you understand the same thing?
>


-- 
Ross Philipson

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 19:40:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 19:40:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9HwV-0003KU-PT; Wed, 16 Dec 2015 19:40:55 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a9HwU-0003KP-C7
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 19:40:54 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	22/50-28221-54EB1765; Wed, 16 Dec 2015 19:40:53 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1450294852!11498162!1
X-Originating-IP: [209.85.192.51]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3463 invoked from network); 16 Dec 2015 19:40:52 -0000
Received: from mail-qg0-f51.google.com (HELO mail-qg0-f51.google.com)
	(209.85.192.51)
	by server-5.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 19:40:52 -0000
Received: by mail-qg0-f51.google.com with SMTP id 103so43278230qgi.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 11:40:52 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:cc:subject:in-reply-to:references
	:mime-version:content-type:content-transfer-encoding;
	bh=d7GE2k5odRWuWCiAHsY+FN86fk6DcuHFwtdnJ2MAh00=;
	b=pJywBjS5bEsiWI3987b4S33vw73aIYNfahtTBaqxJO+nhPVu6+J+DIG5wfpMSpzDwM
	Hkq0vGz5ASwyKXp508OaVsC+SxILAPl/B4oviGpFiMb1HUWEmxcZwQRoPGVYkyy4VDhz
	NdXhsFx8/ehHgwUeG5lRyzfn7Ew3y7ujgW1WbPrQQ4wEezMNW7D90iRHhuac0wc5NYk8
	I7IFF8aWGw5sZDo3nCQnqsGb33kNrBpMJW00hytggsJTRUlgCSKSjP52ij72y+NWsoaV
	f20tCCpfjnJaj1b1Me3mUEQ2FlZZBvK+F7CXoPly2+cbijnkpM8gegJo8K6UsvwhyUXt
	gu+w==
X-Received: by 10.140.20.144 with SMTP id 16mr64415066qgj.45.1450294851715;
	Wed, 16 Dec 2015 11:40:51 -0800 (PST)
Received: from smartin-envy.nemo.cl ([181.43.17.237])
	by smtp.gmail.com with ESMTPSA id
	i141sm3166188qhc.18.2015.12.16.11.40.49
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 11:40:51 -0800 (PST)
Date: Wed, 16 Dec 2015 16:40:48 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <923314899.20151216164048@gmail.com>
To: Ross Philipson <ross.philipson@gmail.com>, Rich Persaud <persaur@gmail.com>,
	Paul Durrant <Paul.Durrant@citrix.com>
In-Reply-To: <5671B7F0.4090307@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>   
	<1677432642.20151214223702@gmail.com> 
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net> 
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com> 
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net> 
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
	<1769587658.20151216160049@gmail.com> <5671B7F0.4090307@gmail.com>
MIME-Version: 1.0
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Ross,

Wednesday, December 16, 2015, 4:13:52 PM, you wrote:

<snip>
>> Looking at the code here it looks like xc-windows should be replaced
>> by the existing xenbus implementation, just port xc-vusb to this
>> infrastructure.

> Yes we are moving OpenXT away from these old pv drivers and towards the
> upstream ones. xc-vusb will be ported to they new xenbus.

>>
>> vusb-daemon should interface directly with Xen in Dom0.

> I am not sure exactly what you mean by this; can you clarify?

>From what I can see vusb-daemon monitors USB events and should
interact with the xen usbback driver to make the plugged/unplugged
device available to the xc-vusb frontend driver.

However Fabio Fantoni said that the Xen usb passthrough currently in
development will also support hotplug, so not sure about this.

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 19:40:56 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 19:40:56 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9HwV-0003KU-PT; Wed, 16 Dec 2015 19:40:55 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <furryfuttock@gmail.com>) id 1a9HwU-0003KP-C7
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 19:40:54 +0000
Received: from [193.109.254.147] by server-7.bemta-14.messagelabs.com id
	22/50-28221-54EB1765; Wed, 16 Dec 2015 19:40:53 +0000
X-Env-Sender: furryfuttock@gmail.com
X-Msg-Ref: server-5.tower-27.messagelabs.com!1450294852!11498162!1
X-Originating-IP: [209.85.192.51]
X-SpamReason: No, hits=0.0 required=7.0 tests=
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 3463 invoked from network); 16 Dec 2015 19:40:52 -0000
Received: from mail-qg0-f51.google.com (HELO mail-qg0-f51.google.com)
	(209.85.192.51)
	by server-5.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 19:40:52 -0000
Received: by mail-qg0-f51.google.com with SMTP id 103so43278230qgi.3
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 11:40:52 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=date:from:message-id:to:cc:subject:in-reply-to:references
	:mime-version:content-type:content-transfer-encoding;
	bh=d7GE2k5odRWuWCiAHsY+FN86fk6DcuHFwtdnJ2MAh00=;
	b=pJywBjS5bEsiWI3987b4S33vw73aIYNfahtTBaqxJO+nhPVu6+J+DIG5wfpMSpzDwM
	Hkq0vGz5ASwyKXp508OaVsC+SxILAPl/B4oviGpFiMb1HUWEmxcZwQRoPGVYkyy4VDhz
	NdXhsFx8/ehHgwUeG5lRyzfn7Ew3y7ujgW1WbPrQQ4wEezMNW7D90iRHhuac0wc5NYk8
	I7IFF8aWGw5sZDo3nCQnqsGb33kNrBpMJW00hytggsJTRUlgCSKSjP52ij72y+NWsoaV
	f20tCCpfjnJaj1b1Me3mUEQ2FlZZBvK+F7CXoPly2+cbijnkpM8gegJo8K6UsvwhyUXt
	gu+w==
X-Received: by 10.140.20.144 with SMTP id 16mr64415066qgj.45.1450294851715;
	Wed, 16 Dec 2015 11:40:51 -0800 (PST)
Received: from smartin-envy.nemo.cl ([181.43.17.237])
	by smtp.gmail.com with ESMTPSA id
	i141sm3166188qhc.18.2015.12.16.11.40.49
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 11:40:51 -0800 (PST)
Date: Wed, 16 Dec 2015 16:40:48 -0300
From: Simon Martin <furryfuttock@gmail.com>
X-Priority: 3 (Normal)
Message-ID: <923314899.20151216164048@gmail.com>
To: Ross Philipson <ross.philipson@gmail.com>, Rich Persaud <persaur@gmail.com>,
	Paul Durrant <Paul.Durrant@citrix.com>
In-Reply-To: <5671B7F0.4090307@gmail.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>   
	<1677432642.20151214223702@gmail.com> 
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net> 
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com> 
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net> 
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
	<1769587658.20151216160049@gmail.com> <5671B7F0.4090307@gmail.com>
MIME-Version: 1.0
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="us-ascii"
Content-Transfer-Encoding: 7bit
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

Hello Ross,

Wednesday, December 16, 2015, 4:13:52 PM, you wrote:

<snip>
>> Looking at the code here it looks like xc-windows should be replaced
>> by the existing xenbus implementation, just port xc-vusb to this
>> infrastructure.

> Yes we are moving OpenXT away from these old pv drivers and towards the
> upstream ones. xc-vusb will be ported to they new xenbus.

>>
>> vusb-daemon should interface directly with Xen in Dom0.

> I am not sure exactly what you mean by this; can you clarify?

>From what I can see vusb-daemon monitors USB events and should
interact with the xen usbback driver to make the plugged/unplugged
device available to the xc-vusb frontend driver.

However Fabio Fantoni said that the Xen usb passthrough currently in
development will also support hotplug, so not sure about this.

-- 
Best regards,
 Simon                            mailto:furryfuttock@gmail.com


_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 20:09:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 20:09:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9INk-0004zj-8Y; Wed, 16 Dec 2015 20:09:04 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <ross.philipson@gmail.com>) id 1a9INX-0004z8-OM
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 20:09:03 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	BF/5F-12831-8C4C1765; Wed, 16 Dec 2015 20:08:40 +0000
X-Env-Sender: ross.philipson@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1450296519!11230525!1
X-Originating-IP: [209.85.192.51]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 60896 invoked from network); 16 Dec 2015 20:08:39 -0000
Received: from mail-qg0-f51.google.com (HELO mail-qg0-f51.google.com)
	(209.85.192.51)
	by server-2.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 20:08:39 -0000
Received: by mail-qg0-f51.google.com with SMTP id i91so36694090qgf.2
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 12:08:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=rzlB4d4dWy9oiZXCtooCaVfWUY1PccBZEPuGemS56O8=;
	b=sYmNBj7FHEHAAEIkZSjvMzxS47+OeZS3UCaU11ZnmwZ1EatGmzBXYc7TBKHoXocTDY
	qj4af5yYzLTbXOfISnB53/Ja3Gvjla8MiHVreMH9AjeHK21yMA4NyVRvh2IyCDzysxi1
	p9ycewUrUuLOB/3KMH9RcNEdsKcmce1Xlplt8v6CE+6B7GirqLPUoK8f9YArPXgWhVaL
	6zm5OjMuh3a25lxeKnjDqffXfi+UOzLtPMAe+Fe2BHL+X6CVix0bVE5sTEjjp2C3XaCm
	WXlep6wP+8LUjQFjo4zwIi9rwWxt/aMYmCiUzcmXMXskvKMk+lH1FS8/Twwq3nvEo7yw
	G5tg==
X-Received: by 10.140.154.130 with SMTP id a124mr10922669qha.100.1450296518901;
	Wed, 16 Dec 2015 12:08:38 -0800 (PST)
Received: from [192.168.2.11]
	(70-88-247-169-ma-nh-me-ne.hfc.comcastbusiness.net. [70.88.247.169])
	by smtp.googlemail.com with ESMTPSA id
	c190sm3220354qka.21.2015.12.16.12.08.38
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 12:08:38 -0800 (PST)
Message-ID: <5671C498.3090201@gmail.com>
Date: Wed, 16 Dec 2015 15:07:52 -0500
From: Ross Philipson <ross.philipson@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Icedove/31.8.0
MIME-Version: 1.0
To: Simon Martin <furryfuttock@gmail.com>, Rich Persaud <persaur@gmail.com>,
	Paul Durrant <Paul.Durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
	<1769587658.20151216160049@gmail.com> <5671B7F0.4090307@gmail.com>
	<923314899.20151216164048@gmail.com>
In-Reply-To: <923314899.20151216164048@gmail.com>
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 12/16/2015 02:40 PM, Simon Martin wrote:
> Hello Ross,
>
> Wednesday, December 16, 2015, 4:13:52 PM, you wrote:
>
> <snip>
>>> Looking at the code here it looks like xc-windows should be replaced
>>> by the existing xenbus implementation, just port xc-vusb to this
>>> infrastructure.
>
>> Yes we are moving OpenXT away from these old pv drivers and towards the
>> upstream ones. xc-vusb will be ported to they new xenbus.
>
>>>
>>> vusb-daemon should interface directly with Xen in Dom0.
>
>> I am not sure exactly what you mean by this; can you clarify?
>
>  From what I can see vusb-daemon monitors USB events and should
> interact with the xen usbback driver to make the plugged/unplugged
> device available to the xc-vusb frontend driver.
>
> However Fabio Fantoni said that the Xen usb passthrough currently in
> development will also support hotplug, so not sure about this.
>

Your summary of what the vusb-daemon does is basically accurate. It 
monitors udev events, applies policy to the types of devices it sees and 
assigns (or not) devices to VMs. The assignment process is basically 
writing the xenstore nodes that tell the front-back pair to start the 
standard xenbus handshake. The usbback driver internally takes control 
of the assigned USB device's configurations and interfaces.

By hot-plugged I take it you mean hot-plugged into and out of VMs. If so 
then yes, this PV USB stack fully supports that.

-- 
Ross Philipson

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 16 20:09:06 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 16 Dec 2015 20:09:06 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1a9INk-0004zj-8Y; Wed, 16 Dec 2015 20:09:04 +0000
Received: from mail6.bemta5.messagelabs.com ([195.245.231.135])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <ross.philipson@gmail.com>) id 1a9INX-0004z8-OM
	for win-pv-devel@lists.xenproject.org; Wed, 16 Dec 2015 20:09:03 +0000
Received: from [85.158.139.211] by server-12.bemta-5.messagelabs.com id
	BF/5F-12831-8C4C1765; Wed, 16 Dec 2015 20:08:40 +0000
X-Env-Sender: ross.philipson@gmail.com
X-Msg-Ref: server-2.tower-206.messagelabs.com!1450296519!11230525!1
X-Originating-IP: [209.85.192.51]
X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 60896 invoked from network); 16 Dec 2015 20:08:39 -0000
Received: from mail-qg0-f51.google.com (HELO mail-qg0-f51.google.com)
	(209.85.192.51)
	by server-2.tower-206.messagelabs.com with AES128-GCM-SHA256 encrypted
	SMTP; 16 Dec 2015 20:08:39 -0000
Received: by mail-qg0-f51.google.com with SMTP id i91so36694090qgf.2
	for <win-pv-devel@lists.xenproject.org>;
	Wed, 16 Dec 2015 12:08:39 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113;
	h=message-id:date:from:user-agent:mime-version:to:cc:subject
	:references:in-reply-to:content-type:content-transfer-encoding;
	bh=rzlB4d4dWy9oiZXCtooCaVfWUY1PccBZEPuGemS56O8=;
	b=sYmNBj7FHEHAAEIkZSjvMzxS47+OeZS3UCaU11ZnmwZ1EatGmzBXYc7TBKHoXocTDY
	qj4af5yYzLTbXOfISnB53/Ja3Gvjla8MiHVreMH9AjeHK21yMA4NyVRvh2IyCDzysxi1
	p9ycewUrUuLOB/3KMH9RcNEdsKcmce1Xlplt8v6CE+6B7GirqLPUoK8f9YArPXgWhVaL
	6zm5OjMuh3a25lxeKnjDqffXfi+UOzLtPMAe+Fe2BHL+X6CVix0bVE5sTEjjp2C3XaCm
	WXlep6wP+8LUjQFjo4zwIi9rwWxt/aMYmCiUzcmXMXskvKMk+lH1FS8/Twwq3nvEo7yw
	G5tg==
X-Received: by 10.140.154.130 with SMTP id a124mr10922669qha.100.1450296518901;
	Wed, 16 Dec 2015 12:08:38 -0800 (PST)
Received: from [192.168.2.11]
	(70-88-247-169-ma-nh-me-ne.hfc.comcastbusiness.net. [70.88.247.169])
	by smtp.googlemail.com with ESMTPSA id
	c190sm3220354qka.21.2015.12.16.12.08.38
	(version=TLSv1/SSLv3 cipher=OTHER);
	Wed, 16 Dec 2015 12:08:38 -0800 (PST)
Message-ID: <5671C498.3090201@gmail.com>
Date: Wed, 16 Dec 2015 15:07:52 -0500
From: Ross Philipson <ross.philipson@gmail.com>
User-Agent: Mozilla/5.0 (X11; Linux x86_64;
	rv:31.0) Gecko/20100101 Icedove/31.8.0
MIME-Version: 1.0
To: Simon Martin <furryfuttock@gmail.com>, Rich Persaud <persaur@gmail.com>,
	Paul Durrant <Paul.Durrant@citrix.com>
References: <1449751500-4796-1-git-send-email-paul.durrant@citrix.com>
	<1677432642.20151214223702@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6E9359@AMSPEX01CL01.citrite.net>
	<1D8CA89F-5F31-4840-B51B-9A1ADD82F65F@gmail.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F6EC18E@AMSPEX01CL01.citrite.net>
	<2B3E5EAF-5ED3-411F-B8F9-2CEE6F84BBAD@gmail.com>
	<1769587658.20151216160049@gmail.com> <5671B7F0.4090307@gmail.com>
	<923314899.20151216164048@gmail.com>
In-Reply-To: <923314899.20151216164048@gmail.com>
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Subject: Re: [win-pv-devel] USB driver
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Transfer-Encoding: 7bit
Content-Type: text/plain; charset="us-ascii"; Format="flowed"
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

On 12/16/2015 02:40 PM, Simon Martin wrote:
> Hello Ross,
>
> Wednesday, December 16, 2015, 4:13:52 PM, you wrote:
>
> <snip>
>>> Looking at the code here it looks like xc-windows should be replaced
>>> by the existing xenbus implementation, just port xc-vusb to this
>>> infrastructure.
>
>> Yes we are moving OpenXT away from these old pv drivers and towards the
>> upstream ones. xc-vusb will be ported to they new xenbus.
>
>>>
>>> vusb-daemon should interface directly with Xen in Dom0.
>
>> I am not sure exactly what you mean by this; can you clarify?
>
>  From what I can see vusb-daemon monitors USB events and should
> interact with the xen usbback driver to make the plugged/unplugged
> device available to the xc-vusb frontend driver.
>
> However Fabio Fantoni said that the Xen usb passthrough currently in
> development will also support hotplug, so not sure about this.
>

Your summary of what the vusb-daemon does is basically accurate. It 
monitors udev events, applies policy to the types of devices it sees and 
assigns (or not) devices to VMs. The assignment process is basically 
writing the xenstore nodes that tell the front-back pair to start the 
standard xenbus handshake. The usbback driver internally takes control 
of the assigned USB device's configurations and interfaces.

By hot-plugged I take it you mean hot-plugged into and out of VMs. If so 
then yes, this PV USB stack fully supports that.

-- 
Ross Philipson

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Dec 21 22:29:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 21 Dec 2015 22:29:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aB8xo-0008R2-GU; Mon, 21 Dec 2015 22:29:56 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1aB8xn-0008Qx-EH
	for win-pv-devel@lists.xenproject.org; Mon, 21 Dec 2015 22:29:55 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	C2/C4-21571-26D78765; Mon, 21 Dec 2015 22:29:54 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1450736993!6562605!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22221 invoked from network); 21 Dec 2015 22:29:54 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 21 Dec 2015 22:29:54 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 2DC4120B62
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 21 Dec 2015 17:29:53 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Mon, 21 Dec 2015 17:29:53 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:content-transfer-encoding
	:content-type:date:from:in-reply-to:message-id:mime-version
	:references:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=+Di8H
	4jGkJwaKQ5AtCubgoV3RIg=; b=OnvY5OIhBJWGsqk/l2SPvk60fuKOWIVC8j8vm
	3ltOCTxTs6jfkv1dNDOLcS0vu2zLE1SweEqWwxlfMhDeBeLpubNhvwQGQtxPoK9l
	CXscXE6xqtPnu8QLS7bnfzIwmrJfl8rAUUkhDmC48qNvc4cVZ3ExBnIAgUSTFBY2
	4tPG6Q=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=+Di8H4jGkJwaKQ5
	AtCubgoV3RIg=; b=IfBQUkez73mQEE6ujW/7SqXIFZweGO1Ljovq6lfqflRLZS+
	XtkVdLeLSnyGZlf40iLjBNX6d6V1uaijAQagGbMLAuuZ193dupm2FzQFiTK4EV5d
	6nIRcMJAQGpzlFHXSD8UX0CfC2qw/unObkIZ5mYZzf4x54FelBThUfFTNqOw=
X-Sasl-enc: bhH1BJ3ivHHSVil01c7ne/G8D3qm3MW1qudlRRf8XWsX 1450736992
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 310CAC016F3;
	Mon, 21 Dec 2015 17:29:52 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <56787D61.9040203@invisiblethingslab.com>
Date: Mon, 21 Dec 2015 23:29:53 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <563BC62A.60203@invisiblethingslab.com>
Content-Length: 3967
Cc: =?UTF-8?Q?Marek_Marczykowski-G=c3=b3recki?=
	<marmarek@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2015-11-05 22:12, Rafa=B3 Wojdy=B3a wrote:
> On 2015-11-05 17:55, Paul Durrant wrote:
>>> -----Original Message----- From:
>>> win-pv-devel-bounces@lists.xenproject.org
>>> [mailto:win-pv-devel- bounces@lists.xenproject.org] On Behalf
>>> Of Rafal Wojdyla Sent: 05 November 2015 14:22 To:
>>> win-pv-devel@lists.xenproject.org Subject: [win-pv-devel]
>>> [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
>>> =

>>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com> --- =

>>> include/xencontrol.h                         | 342 ++++++++++ =

>>> src/xencontrol/xencontrol.c                  | 915 =

>>> +++++++++++++++++++++++++++ src/xencontrol/xencontrol.rc
>>> |  24 + src/xencontrol/xencontrol_private.h          |  49 ++ =

>>> vs2013/xencontrol.props                      |  84 +++ =

>>> vs2013/xencontrol/xencontrol.vcxproj         |  62 ++ =

>>> vs2013/xencontrol/xencontrol.vcxproj.filters |  13 + =

>>> vs2013/xeniface.sln                          |  38 ++ 8 files
>>> changed, 1527 insertions(+) create mode 100644
>>> include/xencontrol.h create mode 100644
>>> src/xencontrol/xencontrol.c create mode 100644
>>> src/xencontrol/xencontrol.rc create mode 100644
>>> src/xencontrol/xencontrol_private.h create mode 100644
>>> vs2013/xencontrol.props create mode 100644
>>> vs2013/xencontrol/xencontrol.vcxproj create mode 100644
>>> vs2013/xencontrol/xencontrol.vcxproj.filters
>>> =

>> =

>> I also notice that there's no update to the xeniface package to
>> deliver the new DLL. Did you omit that for a reason? (I have no
>> objection to you adding the DLL to the package... I'm happy to
>> fix up the VS2012 vcxproj files if you don't have the older tools
>> to hand).
>> =

>> Paul
>> =

> Yeah, that's another thing I forgot about since I don't have VS2012
> at hand.
> =

I got sidetracked a bit lately but would like to finish "upstreaming"
this if possible. I have a new discussion point though, regarding code
duplication with the Linux xenvchan implementation.

It turns out that my xenvchan implementation has a subtle bug that was
fixed some time ago in the Xen implementation. I had based my version
off the current Linux xenvchan which has the bug fixed, but in the
process of making it MSVC compatible I reintroduced the bug. My
colleague Marek (cc) suggested that we maybe could somehow use the
original Linux source with just some patches that make it Windows
compatible. I think you already pull some Xen sources (mainly
includes) for pvdrivers, so maybe it's possible.

This would require that the usermode xeniface bindings were as close
to Linux libxc as possible. I'm not liking the idea that a Windows DLL
would only export Linux-flavored APIs, but I could easily make
additional exports that look mostly like libxc. The main difference is
that Linux APIs don't use event objects like Windows, and use
different return values.

I admit I have some concerns that identically named functions *will*
be different at least in some places (Linux libxc vs Windows). We
can't make the API 100% identical due to fundamental OS differences,
but I agree with Marek that code duplication is an issue and should be
avoided when possible. Thoughts? :)

- -- =

Rafa=B3 Wojdy=B3a
Qubes Tools for Windows developer
https://www.qubes-os.org/
-----BEGIN PGP SIGNATURE-----

iQEcBAEBAgAGBQJWeH1hAAoJEIWi9rB2GrW7ulYH/1K2ylCHxSGwBAzWkbG5ZW4e
RK6a9Q164jYq7++SDekfK43wddtniXJv91Ie3RYcIiHJZRi0XORVVsOQcJ+9YK03
eBtGvQqj73ptVbiIPXlldx+SDTXyEbCLwIwoYHQ/wamq/qJDklmbs3g97NT7ossf
aNhG4sRdM/Kwr1t7pHTlnFdHSeZnoWonwlopWZwnaoPkr6Qh0/gvF5Zd8unMI19T
yT3jQutcxRes6h+HbrItty0J//TQe/GwWHVBPLWeWXzOPSbAKfrk7bXdBnpjYX18
0t1jHqaEEZ+9H+/xLQYUd84nYGt5OP6/Ny5dbBByCo4equpONFxDOd69n2+yAlI=3D
=3D7tr2
-----END PGP SIGNATURE-----

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Mon Dec 21 22:29:59 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Mon, 21 Dec 2015 22:29:59 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aB8xo-0008R2-GU; Mon, 21 Dec 2015 22:29:56 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <omeg@invisiblethingslab.com>) id 1aB8xn-0008Qx-EH
	for win-pv-devel@lists.xenproject.org; Mon, 21 Dec 2015 22:29:55 +0000
Received: from [85.158.143.35] by server-1.bemta-4.messagelabs.com id
	C2/C4-21571-26D78765; Mon, 21 Dec 2015 22:29:54 +0000
X-Env-Sender: omeg@invisiblethingslab.com
X-Msg-Ref: server-11.tower-21.messagelabs.com!1450736993!6562605!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 22221 invoked from network); 21 Dec 2015 22:29:54 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-11.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 21 Dec 2015 22:29:54 -0000
Received: from compute2.internal (compute2.nyi.internal [10.202.2.42])
	by mailout.nyi.internal (Postfix) with ESMTP id 2DC4120B62
	for <win-pv-devel@lists.xenproject.org>;
	Mon, 21 Dec 2015 17:29:53 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute2.internal (MEProxy); Mon, 21 Dec 2015 17:29:53 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:content-transfer-encoding
	:content-type:date:from:in-reply-to:message-id:mime-version
	:references:subject:to:x-sasl-enc:x-sasl-enc; s=mesmtp; bh=+Di8H
	4jGkJwaKQ5AtCubgoV3RIg=; b=OnvY5OIhBJWGsqk/l2SPvk60fuKOWIVC8j8vm
	3ltOCTxTs6jfkv1dNDOLcS0vu2zLE1SweEqWwxlfMhDeBeLpubNhvwQGQtxPoK9l
	CXscXE6xqtPnu8QLS7bnfzIwmrJfl8rAUUkhDmC48qNvc4cVZ3ExBnIAgUSTFBY2
	4tPG6Q=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:content-transfer-encoding:content-type
	:date:from:in-reply-to:message-id:mime-version:references
	:subject:to:x-sasl-enc:x-sasl-enc; s=smtpout; bh=+Di8H4jGkJwaKQ5
	AtCubgoV3RIg=; b=IfBQUkez73mQEE6ujW/7SqXIFZweGO1Ljovq6lfqflRLZS+
	XtkVdLeLSnyGZlf40iLjBNX6d6V1uaijAQagGbMLAuuZ193dupm2FzQFiTK4EV5d
	6nIRcMJAQGpzlFHXSD8UX0CfC2qw/unObkIZ5mYZzf4x54FelBThUfFTNqOw=
X-Sasl-enc: bhH1BJ3ivHHSVil01c7ne/G8D3qm3MW1qudlRRf8XWsX 1450736992
Received: from [192.168.0.3] (89-72-164-138.dynamic.chello.pl [89.72.164.138])
	by mail.messagingengine.com (Postfix) with ESMTPA id 310CAC016F3;
	Mon, 21 Dec 2015 17:29:52 -0500 (EST)
To: Paul Durrant <Paul.Durrant@citrix.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
From: =?UTF-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
X-Enigmail-Draft-Status: N1110
Message-ID: <56787D61.9040203@invisiblethingslab.com>
Date: Mon, 21 Dec 2015 23:29:53 +0100
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:38.0) Gecko/20100101
	Thunderbird/38.4.0
MIME-Version: 1.0
In-Reply-To: <563BC62A.60203@invisiblethingslab.com>
Content-Length: 3967
Cc: =?UTF-8?Q?Marek_Marczykowski-G=c3=b3recki?=
	<marmarek@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

On 2015-11-05 22:12, Rafa=B3 Wojdy=B3a wrote:
> On 2015-11-05 17:55, Paul Durrant wrote:
>>> -----Original Message----- From:
>>> win-pv-devel-bounces@lists.xenproject.org
>>> [mailto:win-pv-devel- bounces@lists.xenproject.org] On Behalf
>>> Of Rafal Wojdyla Sent: 05 November 2015 14:22 To:
>>> win-pv-devel@lists.xenproject.org Subject: [win-pv-devel]
>>> [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
>>> =

>>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com> --- =

>>> include/xencontrol.h                         | 342 ++++++++++ =

>>> src/xencontrol/xencontrol.c                  | 915 =

>>> +++++++++++++++++++++++++++ src/xencontrol/xencontrol.rc
>>> |  24 + src/xencontrol/xencontrol_private.h          |  49 ++ =

>>> vs2013/xencontrol.props                      |  84 +++ =

>>> vs2013/xencontrol/xencontrol.vcxproj         |  62 ++ =

>>> vs2013/xencontrol/xencontrol.vcxproj.filters |  13 + =

>>> vs2013/xeniface.sln                          |  38 ++ 8 files
>>> changed, 1527 insertions(+) create mode 100644
>>> include/xencontrol.h create mode 100644
>>> src/xencontrol/xencontrol.c create mode 100644
>>> src/xencontrol/xencontrol.rc create mode 100644
>>> src/xencontrol/xencontrol_private.h create mode 100644
>>> vs2013/xencontrol.props create mode 100644
>>> vs2013/xencontrol/xencontrol.vcxproj create mode 100644
>>> vs2013/xencontrol/xencontrol.vcxproj.filters
>>> =

>> =

>> I also notice that there's no update to the xeniface package to
>> deliver the new DLL. Did you omit that for a reason? (I have no
>> objection to you adding the DLL to the package... I'm happy to
>> fix up the VS2012 vcxproj files if you don't have the older tools
>> to hand).
>> =

>> Paul
>> =

> Yeah, that's another thing I forgot about since I don't have VS2012
> at hand.
> =

I got sidetracked a bit lately but would like to finish "upstreaming"
this if possible. I have a new discussion point though, regarding code
duplication with the Linux xenvchan implementation.

It turns out that my xenvchan implementation has a subtle bug that was
fixed some time ago in the Xen implementation. I had based my version
off the current Linux xenvchan which has the bug fixed, but in the
process of making it MSVC compatible I reintroduced the bug. My
colleague Marek (cc) suggested that we maybe could somehow use the
original Linux source with just some patches that make it Windows
compatible. I think you already pull some Xen sources (mainly
includes) for pvdrivers, so maybe it's possible.

This would require that the usermode xeniface bindings were as close
to Linux libxc as possible. I'm not liking the idea that a Windows DLL
would only export Linux-flavored APIs, but I could easily make
additional exports that look mostly like libxc. The main difference is
that Linux APIs don't use event objects like Windows, and use
different return values.

I admit I have some concerns that identically named functions *will*
be different at least in some places (Linux libxc vs Windows). We
can't make the API 100% identical due to fundamental OS differences,
but I agree with Marek that code duplication is an issue and should be
avoided when possible. Thoughts? :)

- -- =

Rafa=B3 Wojdy=B3a
Qubes Tools for Windows developer
https://www.qubes-os.org/
-----BEGIN PGP SIGNATURE-----

iQEcBAEBAgAGBQJWeH1hAAoJEIWi9rB2GrW7ulYH/1K2ylCHxSGwBAzWkbG5ZW4e
RK6a9Q164jYq7++SDekfK43wddtniXJv91Ie3RYcIiHJZRi0XORVVsOQcJ+9YK03
eBtGvQqj73ptVbiIPXlldx+SDTXyEbCLwIwoYHQ/wamq/qJDklmbs3g97NT7ossf
aNhG4sRdM/Kwr1t7pHTlnFdHSeZnoWonwlopWZwnaoPkr6Qh0/gvF5Zd8unMI19T
yT3jQutcxRes6h+HbrItty0J//TQe/GwWHVBPLWeWXzOPSbAKfrk7bXdBnpjYX18
0t1jHqaEEZ+9H+/xLQYUd84nYGt5OP6/Ny5dbBByCo4equpONFxDOd69n2+yAlI=3D
=3D7tr2
-----END PGP SIGNATURE-----

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 22 09:02:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 22 Dec 2015 09:02:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aBIq3-0005Bx-5c; Tue, 22 Dec 2015 09:02:35 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=791d4016b=Paul.Durrant@citrix.com>)
	id 1aBIq2-0005Bs-D0
	for win-pv-devel@lists.xenproject.org; Tue, 22 Dec 2015 09:02:34 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	76/56-12889-9A119765; Tue, 22 Dec 2015 09:02:33 +0000
X-Env-Sender: prvs=791d4016b=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1450774952!12563281!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23858 invoked from network); 22 Dec 2015 09:02:32 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Dec 2015 09:02:32 -0000
X-IronPort-AV: E=Sophos;i="5.20,463,1444694400"; d="scan'208";a="10847980"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Add a user mode library wrapper for
	XENIFACE IOCTLs
Thread-Index: AQHRGA+lHYPEmX2uKECNPnQ/gQgPnp7WPVaAgAC+JdA=
Date: Tue, 22 Dec 2015 09:02:28 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
	<56787D61.9040203@invisiblethingslab.com>
In-Reply-To: <56787D61.9040203@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: =?iso-8859-2?Q?Marek_Marczykowski-G=F3recki?=
	<marmarek@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Rafa=B3 Wojdy=B3a [mailto:omeg@invisiblethingslab.com]
> Sent: 21 December 2015 22:30
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Marek Marczykowski-G=F3recki
> Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
> XENIFACE IOCTLs
> =

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> =

> On 2015-11-05 22:12, Rafa=B3 Wojdy=B3a wrote:
> > On 2015-11-05 17:55, Paul Durrant wrote:
> >>> -----Original Message----- From:
> >>> win-pv-devel-bounces@lists.xenproject.org
> >>> [mailto:win-pv-devel- bounces@lists.xenproject.org] On Behalf
> >>> Of Rafal Wojdyla Sent: 05 November 2015 14:22 To:
> >>> win-pv-devel@lists.xenproject.org Subject: [win-pv-devel]
> >>> [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
> >>>
> >>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com> ---
> >>> include/xencontrol.h                         | 342 ++++++++++
> >>> src/xencontrol/xencontrol.c                  | 915
> >>> +++++++++++++++++++++++++++ src/xencontrol/xencontrol.rc
> >>> |  24 + src/xencontrol/xencontrol_private.h          |  49 ++
> >>> vs2013/xencontrol.props                      |  84 +++
> >>> vs2013/xencontrol/xencontrol.vcxproj         |  62 ++
> >>> vs2013/xencontrol/xencontrol.vcxproj.filters |  13 +
> >>> vs2013/xeniface.sln                          |  38 ++ 8 files
> >>> changed, 1527 insertions(+) create mode 100644
> >>> include/xencontrol.h create mode 100644
> >>> src/xencontrol/xencontrol.c create mode 100644
> >>> src/xencontrol/xencontrol.rc create mode 100644
> >>> src/xencontrol/xencontrol_private.h create mode 100644
> >>> vs2013/xencontrol.props create mode 100644
> >>> vs2013/xencontrol/xencontrol.vcxproj create mode 100644
> >>> vs2013/xencontrol/xencontrol.vcxproj.filters
> >>>
> >>
> >> I also notice that there's no update to the xeniface package to
> >> deliver the new DLL. Did you omit that for a reason? (I have no
> >> objection to you adding the DLL to the package... I'm happy to
> >> fix up the VS2012 vcxproj files if you don't have the older tools
> >> to hand).
> >>
> >> Paul
> >>
> > Yeah, that's another thing I forgot about since I don't have VS2012
> > at hand.
> >
> I got sidetracked a bit lately but would like to finish "upstreaming"
> this if possible. I have a new discussion point though, regarding code
> duplication with the Linux xenvchan implementation.
> =

> It turns out that my xenvchan implementation has a subtle bug that was
> fixed some time ago in the Xen implementation. I had based my version
> off the current Linux xenvchan which has the bug fixed, but in the
> process of making it MSVC compatible I reintroduced the bug. My
> colleague Marek (cc) suggested that we maybe could somehow use the
> original Linux source with just some patches that make it Windows
> compatible. I think you already pull some Xen sources (mainly
> includes) for pvdrivers, so maybe it's possible.
> =


Hi Rafal,

  I only pull public includes from Xen. They require post-processing (to su=
bstitute 'long' for 'LONG_PTR' mainly) but no hand editing. I think that pu=
lling in actual source modules would be a lot harder (and you'd probably ha=
ve to turn the warning level in MSVC way down to make it happy with all the=
 implicit type conversion that usually goes on in Linux source code).

> This would require that the usermode xeniface bindings were as close
> to Linux libxc as possible. I'm not liking the idea that a Windows DLL
> would only export Linux-flavored APIs, but I could easily make
> additional exports that look mostly like libxc. The main difference is
> that Linux APIs don't use event objects like Windows, and use
> different return values.
> =

> I admit I have some concerns that identically named functions *will*
> be different at least in some places (Linux libxc vs Windows). We
> can't make the API 100% identical due to fundamental OS differences,
> but I agree with Marek that code duplication is an issue and should be
> avoided when possible. Thoughts? :)

  It's a tricky one. There's already way more code duplication than I would=
 like between the drivers themselves (e.g. a lot of the PnP code is complet=
ely identical between XENBUS and XENVIF but I keep it separate since the dr=
ivers do need to be able to evolve separately) so code duplication between =
different OS implementations of an API/protocol is something that I think w=
e just have to live with. There is definitely merit in keeping the Windows =
and Linux APIs 'aligned' for familiarity when porting an application but, a=
s you say, the OS are fundamentally different and trying to use common sour=
ce is probably going to end up mean too much abstraction away from both OS.

  Cheers,

    Paul

> =

> - --
> Rafa=B3 Wojdy=B3a
> Qubes Tools for Windows developer
> https://www.qubes-os.org/
> -----BEGIN PGP SIGNATURE-----
> =

> iQEcBAEBAgAGBQJWeH1hAAoJEIWi9rB2GrW7ulYH/1K2ylCHxSGwBAzWkbG5
> ZW4e
> RK6a9Q164jYq7++SDekfK43wddtniXJv91Ie3RYcIiHJZRi0XORVVsOQcJ+9YK03
> eBtGvQqj73ptVbiIPXlldx+SDTXyEbCLwIwoYHQ/wamq/qJDklmbs3g97NT7ossf
> aNhG4sRdM/Kwr1t7pHTlnFdHSeZnoWonwlopWZwnaoPkr6Qh0/gvF5Zd8un
> MI19T
> yT3jQutcxRes6h+HbrItty0J//TQe/GwWHVBPLWeWXzOPSbAKfrk7bXdBnpjYX
> 18
> 0t1jHqaEEZ+9H+/xLQYUd84nYGt5OP6/Ny5dbBByCo4equpONFxDOd69n2+yA
> lI=3D
> =3D7tr2
> -----END PGP SIGNATURE-----

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 22 09:02:36 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 22 Dec 2015 09:02:36 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aBIq3-0005Bx-5c; Tue, 22 Dec 2015 09:02:35 +0000
Received: from mail6.bemta14.messagelabs.com ([193.109.254.103])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=791d4016b=Paul.Durrant@citrix.com>)
	id 1aBIq2-0005Bs-D0
	for win-pv-devel@lists.xenproject.org; Tue, 22 Dec 2015 09:02:34 +0000
Received: from [193.109.254.147] by server-2.bemta-14.messagelabs.com id
	76/56-12889-9A119765; Tue, 22 Dec 2015 09:02:33 +0000
X-Env-Sender: prvs=791d4016b=Paul.Durrant@citrix.com
X-Msg-Ref: server-12.tower-27.messagelabs.com!1450774952!12563281!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 23858 invoked from network); 22 Dec 2015 09:02:32 -0000
Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-12.tower-27.messagelabs.com with RC4-SHA encrypted SMTP;
	22 Dec 2015 09:02:32 -0000
X-IronPort-AV: E=Sophos;i="5.20,463,1444694400"; d="scan'208";a="10847980"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?iso-8859-2?Q?Rafa=B3_Wojdy=B3a?= <omeg@invisiblethingslab.com>,
	"win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>
Thread-Topic: [win-pv-devel] [PATCH] Add a user mode library wrapper for
	XENIFACE IOCTLs
Thread-Index: AQHRGA+lHYPEmX2uKECNPnQ/gQgPnp7WPVaAgAC+JdA=
Date: Tue, 22 Dec 2015 09:02:28 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
	<56787D61.9040203@invisiblethingslab.com>
In-Reply-To: <56787D61.9040203@invisiblethingslab.com>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: =?iso-8859-2?Q?Marek_Marczykowski-G=F3recki?=
	<marmarek@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="iso-8859-2"
Content-Transfer-Encoding: quoted-printable
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

> -----Original Message-----
> From: Rafa=B3 Wojdy=B3a [mailto:omeg@invisiblethingslab.com]
> Sent: 21 December 2015 22:30
> To: Paul Durrant; win-pv-devel@lists.xenproject.org
> Cc: Marek Marczykowski-G=F3recki
> Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
> XENIFACE IOCTLs
> =

> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> =

> On 2015-11-05 22:12, Rafa=B3 Wojdy=B3a wrote:
> > On 2015-11-05 17:55, Paul Durrant wrote:
> >>> -----Original Message----- From:
> >>> win-pv-devel-bounces@lists.xenproject.org
> >>> [mailto:win-pv-devel- bounces@lists.xenproject.org] On Behalf
> >>> Of Rafal Wojdyla Sent: 05 November 2015 14:22 To:
> >>> win-pv-devel@lists.xenproject.org Subject: [win-pv-devel]
> >>> [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
> >>>
> >>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com> ---
> >>> include/xencontrol.h                         | 342 ++++++++++
> >>> src/xencontrol/xencontrol.c                  | 915
> >>> +++++++++++++++++++++++++++ src/xencontrol/xencontrol.rc
> >>> |  24 + src/xencontrol/xencontrol_private.h          |  49 ++
> >>> vs2013/xencontrol.props                      |  84 +++
> >>> vs2013/xencontrol/xencontrol.vcxproj         |  62 ++
> >>> vs2013/xencontrol/xencontrol.vcxproj.filters |  13 +
> >>> vs2013/xeniface.sln                          |  38 ++ 8 files
> >>> changed, 1527 insertions(+) create mode 100644
> >>> include/xencontrol.h create mode 100644
> >>> src/xencontrol/xencontrol.c create mode 100644
> >>> src/xencontrol/xencontrol.rc create mode 100644
> >>> src/xencontrol/xencontrol_private.h create mode 100644
> >>> vs2013/xencontrol.props create mode 100644
> >>> vs2013/xencontrol/xencontrol.vcxproj create mode 100644
> >>> vs2013/xencontrol/xencontrol.vcxproj.filters
> >>>
> >>
> >> I also notice that there's no update to the xeniface package to
> >> deliver the new DLL. Did you omit that for a reason? (I have no
> >> objection to you adding the DLL to the package... I'm happy to
> >> fix up the VS2012 vcxproj files if you don't have the older tools
> >> to hand).
> >>
> >> Paul
> >>
> > Yeah, that's another thing I forgot about since I don't have VS2012
> > at hand.
> >
> I got sidetracked a bit lately but would like to finish "upstreaming"
> this if possible. I have a new discussion point though, regarding code
> duplication with the Linux xenvchan implementation.
> =

> It turns out that my xenvchan implementation has a subtle bug that was
> fixed some time ago in the Xen implementation. I had based my version
> off the current Linux xenvchan which has the bug fixed, but in the
> process of making it MSVC compatible I reintroduced the bug. My
> colleague Marek (cc) suggested that we maybe could somehow use the
> original Linux source with just some patches that make it Windows
> compatible. I think you already pull some Xen sources (mainly
> includes) for pvdrivers, so maybe it's possible.
> =


Hi Rafal,

  I only pull public includes from Xen. They require post-processing (to su=
bstitute 'long' for 'LONG_PTR' mainly) but no hand editing. I think that pu=
lling in actual source modules would be a lot harder (and you'd probably ha=
ve to turn the warning level in MSVC way down to make it happy with all the=
 implicit type conversion that usually goes on in Linux source code).

> This would require that the usermode xeniface bindings were as close
> to Linux libxc as possible. I'm not liking the idea that a Windows DLL
> would only export Linux-flavored APIs, but I could easily make
> additional exports that look mostly like libxc. The main difference is
> that Linux APIs don't use event objects like Windows, and use
> different return values.
> =

> I admit I have some concerns that identically named functions *will*
> be different at least in some places (Linux libxc vs Windows). We
> can't make the API 100% identical due to fundamental OS differences,
> but I agree with Marek that code duplication is an issue and should be
> avoided when possible. Thoughts? :)

  It's a tricky one. There's already way more code duplication than I would=
 like between the drivers themselves (e.g. a lot of the PnP code is complet=
ely identical between XENBUS and XENVIF but I keep it separate since the dr=
ivers do need to be able to evolve separately) so code duplication between =
different OS implementations of an API/protocol is something that I think w=
e just have to live with. There is definitely merit in keeping the Windows =
and Linux APIs 'aligned' for familiarity when porting an application but, a=
s you say, the OS are fundamentally different and trying to use common sour=
ce is probably going to end up mean too much abstraction away from both OS.

  Cheers,

    Paul

> =

> - --
> Rafa=B3 Wojdy=B3a
> Qubes Tools for Windows developer
> https://www.qubes-os.org/
> -----BEGIN PGP SIGNATURE-----
> =

> iQEcBAEBAgAGBQJWeH1hAAoJEIWi9rB2GrW7ulYH/1K2ylCHxSGwBAzWkbG5
> ZW4e
> RK6a9Q164jYq7++SDekfK43wddtniXJv91Ie3RYcIiHJZRi0XORVVsOQcJ+9YK03
> eBtGvQqj73ptVbiIPXlldx+SDTXyEbCLwIwoYHQ/wamq/qJDklmbs3g97NT7ossf
> aNhG4sRdM/Kwr1t7pHTlnFdHSeZnoWonwlopWZwnaoPkr6Qh0/gvF5Zd8un
> MI19T
> yT3jQutcxRes6h+HbrItty0J//TQe/GwWHVBPLWeWXzOPSbAKfrk7bXdBnpjYX
> 18
> 0t1jHqaEEZ+9H+/xLQYUd84nYGt5OP6/Ny5dbBByCo4equpONFxDOd69n2+yA
> lI=3D
> =3D7tr2
> -----END PGP SIGNATURE-----

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

From win-pv-devel-bounces@lists.xenproject.org Tue Dec 22 13:00:34 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 22 Dec 2015 13:00:34 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aBMYK-0002CV-NS; Tue, 22 Dec 2015 13:00:32 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <marmarek@invisiblethingslab.com>) id 1aBMAE-0000W8-DE
	for win-pv-devel@lists.xenproject.org; Tue, 22 Dec 2015 12:35:38 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	8B/1B-18316-99349765; Tue, 22 Dec 2015 12:35:37 +0000
X-Env-Sender: marmarek@invisiblethingslab.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1450787734!6806834!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 37430 invoked from network); 22 Dec 2015 12:35:36 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 22 Dec 2015 12:35:36 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 766DD2091A
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 22 Dec 2015 07:35:34 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Tue, 22 Dec 2015 07:35:34 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:content-type:date:from:in-reply-to
	:message-id:mime-version:references:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=g+k0a9+yA5wOOFNc8qcRQqn3yu8=; b=aU6K8Y
	k3keQeMW1RQqg136KOgqO2MPuAgcFMe+0qBQSErfrxbFMKtMjyhr862FZ/8id/z/
	2f9tt7a7XQb6p5NFco6JCaYrIvLo6PN3N5yDiPVhqqj1g5Su6EjG5VeANTbUWuyL
	GJ7F5W61NTtU7P5xPBlZBtt0gZIIJy4p2HhkA=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:content-type:date:from:in-reply-to
	:message-id:mime-version:references:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=g+k0a9+yA5wOOFNc8qcRQqn3yu8=; b=s38je
	cibyA+bfG3ft654cnP3eKTJxuV3K26gOfmYcjNM452OtSmpEPhzPt7rF/Hqcwmub
	BNzTUHeU0NpfsG32i5GvwJ9dP01TkqmLdLlR/IO13KZNHTAmsgYcDOfO2t7WLOqw
	cNK0Bt9yCIf8xy5eWg+TCs2OIaVP42aHJajZTg=
X-Sasl-enc: +OiC301v4LZpq6PA4kR5Ah2zl3QPccX5FzWlRkk361hS 1450787733
Received: from mail-itl (89-70-93-48.dynamic.chello.pl [89.70.93.48])
	by mail.messagingengine.com (Postfix) with ESMTPA id 885A7C016C4;
	Tue, 22 Dec 2015 07:35:33 -0500 (EST)
Date: Tue, 22 Dec 2015 13:35:30 +0100
From: Marek =?utf-8?Q?Marczykowski-G=C3=B3recki?=
	<marmarek@invisiblethingslab.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Message-ID: <20151222123530.GH945@mail-itl>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
	<56787D61.9040203@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
User-Agent: Mutt/1.5.23 (2014-03-12)
X-Mailman-Approved-At: Tue, 22 Dec 2015 13:00:31 +0000
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	=?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============5761002651995023886=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org


--===============5761002651995023886==
Content-Type: multipart/signed; micalg=pgp-sha256;
	protocol="application/pgp-signature"; boundary="xjamM5M9kpPM/bcu"
Content-Disposition: inline


--xjamM5M9kpPM/bcu
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Dec 22, 2015 at 09:02:28AM +0000, Paul Durrant wrote:
> > -----Original Message-----
> > From: Rafa=C5=82 Wojdy=C5=82a [mailto:omeg@invisiblethingslab.com]
> > Sent: 21 December 2015 22:30
> > To: Paul Durrant; win-pv-devel@lists.xenproject.org
> > Cc: Marek Marczykowski-G=C3=B3recki
> > Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
> > XENIFACE IOCTLs
> >=20
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >=20
> > On 2015-11-05 22:12, Rafa=C5=82 Wojdy=C5=82a wrote:
> > > On 2015-11-05 17:55, Paul Durrant wrote:
> > >>> -----Original Message----- From:
> > >>> win-pv-devel-bounces@lists.xenproject.org
> > >>> [mailto:win-pv-devel- bounces@lists.xenproject.org] On Behalf
> > >>> Of Rafal Wojdyla Sent: 05 November 2015 14:22 To:
> > >>> win-pv-devel@lists.xenproject.org Subject: [win-pv-devel]
> > >>> [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
> > >>>
> > >>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com> ---
> > >>> include/xencontrol.h                         | 342 ++++++++++
> > >>> src/xencontrol/xencontrol.c                  | 915
> > >>> +++++++++++++++++++++++++++ src/xencontrol/xencontrol.rc
> > >>> |  24 + src/xencontrol/xencontrol_private.h          |  49 ++
> > >>> vs2013/xencontrol.props                      |  84 +++
> > >>> vs2013/xencontrol/xencontrol.vcxproj         |  62 ++
> > >>> vs2013/xencontrol/xencontrol.vcxproj.filters |  13 +
> > >>> vs2013/xeniface.sln                          |  38 ++ 8 files
> > >>> changed, 1527 insertions(+) create mode 100644
> > >>> include/xencontrol.h create mode 100644
> > >>> src/xencontrol/xencontrol.c create mode 100644
> > >>> src/xencontrol/xencontrol.rc create mode 100644
> > >>> src/xencontrol/xencontrol_private.h create mode 100644
> > >>> vs2013/xencontrol.props create mode 100644
> > >>> vs2013/xencontrol/xencontrol.vcxproj create mode 100644
> > >>> vs2013/xencontrol/xencontrol.vcxproj.filters
> > >>>
> > >>
> > >> I also notice that there's no update to the xeniface package to
> > >> deliver the new DLL. Did you omit that for a reason? (I have no
> > >> objection to you adding the DLL to the package... I'm happy to
> > >> fix up the VS2012 vcxproj files if you don't have the older tools
> > >> to hand).
> > >>
> > >> Paul
> > >>
> > > Yeah, that's another thing I forgot about since I don't have VS2012
> > > at hand.
> > >
> > I got sidetracked a bit lately but would like to finish "upstreaming"
> > this if possible. I have a new discussion point though, regarding code
> > duplication with the Linux xenvchan implementation.
> >=20
> > It turns out that my xenvchan implementation has a subtle bug that was
> > fixed some time ago in the Xen implementation. I had based my version
> > off the current Linux xenvchan which has the bug fixed, but in the
> > process of making it MSVC compatible I reintroduced the bug. My
> > colleague Marek (cc) suggested that we maybe could somehow use the
> > original Linux source with just some patches that make it Windows
> > compatible. I think you already pull some Xen sources (mainly
> > includes) for pvdrivers, so maybe it's possible.
> >=20
>=20
> Hi Rafal,
>=20
>   I only pull public includes from Xen. They require post-processing (to =
substitute 'long' for 'LONG_PTR' mainly) but no hand editing. I think that =
pulling in actual source modules would be a lot harder (and you'd probably =
have to turn the warning level in MSVC way down to make it happy with all t=
he implicit type conversion that usually goes on in Linux source code).

In previous version of this library (based on old PV drivers) we had
exactly the same vchan library compiling for both Linux and Windows.
There were few #ifdefs for vchan initialization, but that's all.

The current upstream version is almost good enough (besides
initialization). Yes, some implicit type conversions needs fixing, but
it isn't that bad. Basically this commit:
https://github.com/QubesOS/qubes-vmm-xen-windows-pvdrivers/commit/c5ead5656=
8677fbeae130ae070610db060935c7e

And I think it would be accepted upstream.

That old vchan version, which worked in both Linux and Windows (and also
mini-os in stubdomain) is here:
https://github.com/QubesOS/qubes-core-vchan-xen/tree/release2/vchan

> > This would require that the usermode xeniface bindings were as close
> > to Linux libxc as possible. I'm not liking the idea that a Windows DLL
> > would only export Linux-flavored APIs, but I could easily make
> > additional exports that look mostly like libxc. The main difference is
> > that Linux APIs don't use event objects like Windows, and use
> > different return values.
> >=20
> > I admit I have some concerns that identically named functions *will*
> > be different at least in some places (Linux libxc vs Windows). We
> > can't make the API 100% identical due to fundamental OS differences,
> > but I agree with Marek that code duplication is an issue and should be
> > avoided when possible. Thoughts? :)
>=20
>   It's a tricky one. There's already way more code duplication than I wou=
ld like between the drivers themselves (e.g. a lot of the PnP code is compl=
etely identical between XENBUS and XENVIF but I keep it separate since the =
drivers do need to be able to evolve separately) so code duplication betwee=
n different OS implementations of an API/protocol is something that I think=
 we just have to live with. There is definitely merit in keeping the Window=
s and Linux APIs 'aligned' for familiarity when porting an application but,=
 as you say, the OS are fundamentally different and trying to use common so=
urce is probably going to end up mean too much abstraction away from both O=
S.

Yes, in some cases keeping the same code for different OSes is hard, but
I think it worth some effort, because managing duplicated code is much
more pain. For every commit you need to think about whether it should be
also included in the other copy/copies or not (and also know about
existence of all the copies!). And surely you will forget about it
sometimes. The case Rafa=C5=82 mentioned was a security bug!

The upstream libxc library already have an abstraction for os-specific
code. Not sure if that is flexible enough to use also for Windows, but
IMHO it worth consideration. For example places which return FD for
select/poll could return Event object etc.
If not possible to use exactly this one (which would make API 100%
compatible), IMO it worth pursuing the state where as few functions as
possible are different. Then, in case of vchan, it would mean separate
initialization functions (for example init_gnt_evt_posix,
init_evt_srv_windows), but most of the other code would be the same.

Some another idea would be to plug the current interface library into
libxc OS abstraction. So Windows build of libxc would use (be a wrapper
of) the current xencontrol library. But still, it would be good idea to
design the API that way to make it as easy as possible.

--=20
Best Regards,
Marek Marczykowski-G=C3=B3recki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?

--xjamM5M9kpPM/bcu
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJWeUOTAAoJENuP0xzK19cspcAH/1bUNqnh/9ZRbZbP1/UcSMh6
QE0K6uqT17MYst2kNRAC6iJZXSCHq6VppNaAE/wKrFDUHlERRHR8SrbDZlRBrWqB
iir2dAJaIyhH/Wty5tfGpWUnmePlCDieBV2WMALLNmtZnv37YmcPkbiQBThj/Nj1
4DsjPgaak8JT7OwvJ1muaThCIvuPN2g8EAZ+PaWCcuxkGMaR63y0PNL3nlJN2HiN
/3tD0ZQhUXNSDcQ67WucPSJmAmYknReQdebw/MuZ9eE3/IWH0+KOeEfEGbCj+iTI
YRCuVvceIZBMSJ7tCDheRyyJ1DHPnkWallDuVihyZdnNAA4lh0370jCuuYOjbhU=
=Epwt
-----END PGP SIGNATURE-----

--xjamM5M9kpPM/bcu--


--===============5761002651995023886==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
--===============5761002651995023886==--


From win-pv-devel-bounces@lists.xenproject.org Tue Dec 22 13:00:34 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Tue, 22 Dec 2015 13:00:34 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aBMYK-0002CV-NS; Tue, 22 Dec 2015 13:00:32 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <marmarek@invisiblethingslab.com>) id 1aBMAE-0000W8-DE
	for win-pv-devel@lists.xenproject.org; Tue, 22 Dec 2015 12:35:38 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	8B/1B-18316-99349765; Tue, 22 Dec 2015 12:35:37 +0000
X-Env-Sender: marmarek@invisiblethingslab.com
X-Msg-Ref: server-7.tower-21.messagelabs.com!1450787734!6806834!1
X-Originating-IP: [66.111.4.27]
X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: 
	VHJ1c3RlZCBJUDogNjYuMTExLjQuMjcgPT4gODQ2Mw==\n
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 37430 invoked from network); 22 Dec 2015 12:35:36 -0000
Received: from out3-smtp.messagingengine.com (HELO
	out3-smtp.messagingengine.com) (66.111.4.27)
	by server-7.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384
	encrypted SMTP; 22 Dec 2015 12:35:36 -0000
Received: from compute5.internal (compute5.nyi.internal [10.202.2.45])
	by mailout.nyi.internal (Postfix) with ESMTP id 766DD2091A
	for <win-pv-devel@lists.xenproject.org>;
	Tue, 22 Dec 2015 07:35:34 -0500 (EST)
Received: from frontend1 ([10.202.2.160])
	by compute5.internal (MEProxy); Tue, 22 Dec 2015 07:35:34 -0500
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	invisiblethingslab.com; h=cc:content-type:date:from:in-reply-to
	:message-id:mime-version:references:subject:to:x-sasl-enc
	:x-sasl-enc; s=mesmtp; bh=g+k0a9+yA5wOOFNc8qcRQqn3yu8=; b=aU6K8Y
	k3keQeMW1RQqg136KOgqO2MPuAgcFMe+0qBQSErfrxbFMKtMjyhr862FZ/8id/z/
	2f9tt7a7XQb6p5NFco6JCaYrIvLo6PN3N5yDiPVhqqj1g5Su6EjG5VeANTbUWuyL
	GJ7F5W61NTtU7P5xPBlZBtt0gZIIJy4p2HhkA=
DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=
	messagingengine.com; h=cc:content-type:date:from:in-reply-to
	:message-id:mime-version:references:subject:to:x-sasl-enc
	:x-sasl-enc; s=smtpout; bh=g+k0a9+yA5wOOFNc8qcRQqn3yu8=; b=s38je
	cibyA+bfG3ft654cnP3eKTJxuV3K26gOfmYcjNM452OtSmpEPhzPt7rF/Hqcwmub
	BNzTUHeU0NpfsG32i5GvwJ9dP01TkqmLdLlR/IO13KZNHTAmsgYcDOfO2t7WLOqw
	cNK0Bt9yCIf8xy5eWg+TCs2OIaVP42aHJajZTg=
X-Sasl-enc: +OiC301v4LZpq6PA4kR5Ah2zl3QPccX5FzWlRkk361hS 1450787733
Received: from mail-itl (89-70-93-48.dynamic.chello.pl [89.70.93.48])
	by mail.messagingengine.com (Postfix) with ESMTPA id 885A7C016C4;
	Tue, 22 Dec 2015 07:35:33 -0500 (EST)
Date: Tue, 22 Dec 2015 13:35:30 +0100
From: Marek =?utf-8?Q?Marczykowski-G=C3=B3recki?=
	<marmarek@invisiblethingslab.com>
To: Paul Durrant <Paul.Durrant@citrix.com>
Message-ID: <20151222123530.GH945@mail-itl>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
	<56787D61.9040203@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
MIME-Version: 1.0
In-Reply-To: <9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
User-Agent: Mutt/1.5.23 (2014-03-12)
X-Mailman-Approved-At: Tue, 22 Dec 2015 13:00:31 +0000
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	=?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: multipart/mixed; boundary="===============5761002651995023886=="
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org


--===============5761002651995023886==
Content-Type: multipart/signed; micalg=pgp-sha256;
	protocol="application/pgp-signature"; boundary="xjamM5M9kpPM/bcu"
Content-Disposition: inline


--xjamM5M9kpPM/bcu
Content-Type: text/plain; charset=utf-8
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Tue, Dec 22, 2015 at 09:02:28AM +0000, Paul Durrant wrote:
> > -----Original Message-----
> > From: Rafa=C5=82 Wojdy=C5=82a [mailto:omeg@invisiblethingslab.com]
> > Sent: 21 December 2015 22:30
> > To: Paul Durrant; win-pv-devel@lists.xenproject.org
> > Cc: Marek Marczykowski-G=C3=B3recki
> > Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
> > XENIFACE IOCTLs
> >=20
> > -----BEGIN PGP SIGNED MESSAGE-----
> > Hash: SHA1
> >=20
> > On 2015-11-05 22:12, Rafa=C5=82 Wojdy=C5=82a wrote:
> > > On 2015-11-05 17:55, Paul Durrant wrote:
> > >>> -----Original Message----- From:
> > >>> win-pv-devel-bounces@lists.xenproject.org
> > >>> [mailto:win-pv-devel- bounces@lists.xenproject.org] On Behalf
> > >>> Of Rafal Wojdyla Sent: 05 November 2015 14:22 To:
> > >>> win-pv-devel@lists.xenproject.org Subject: [win-pv-devel]
> > >>> [PATCH] Add a user mode library wrapper for XENIFACE IOCTLs
> > >>>
> > >>> Signed-off-by: Rafal Wojdyla <omeg@invisiblethingslab.com> ---
> > >>> include/xencontrol.h                         | 342 ++++++++++
> > >>> src/xencontrol/xencontrol.c                  | 915
> > >>> +++++++++++++++++++++++++++ src/xencontrol/xencontrol.rc
> > >>> |  24 + src/xencontrol/xencontrol_private.h          |  49 ++
> > >>> vs2013/xencontrol.props                      |  84 +++
> > >>> vs2013/xencontrol/xencontrol.vcxproj         |  62 ++
> > >>> vs2013/xencontrol/xencontrol.vcxproj.filters |  13 +
> > >>> vs2013/xeniface.sln                          |  38 ++ 8 files
> > >>> changed, 1527 insertions(+) create mode 100644
> > >>> include/xencontrol.h create mode 100644
> > >>> src/xencontrol/xencontrol.c create mode 100644
> > >>> src/xencontrol/xencontrol.rc create mode 100644
> > >>> src/xencontrol/xencontrol_private.h create mode 100644
> > >>> vs2013/xencontrol.props create mode 100644
> > >>> vs2013/xencontrol/xencontrol.vcxproj create mode 100644
> > >>> vs2013/xencontrol/xencontrol.vcxproj.filters
> > >>>
> > >>
> > >> I also notice that there's no update to the xeniface package to
> > >> deliver the new DLL. Did you omit that for a reason? (I have no
> > >> objection to you adding the DLL to the package... I'm happy to
> > >> fix up the VS2012 vcxproj files if you don't have the older tools
> > >> to hand).
> > >>
> > >> Paul
> > >>
> > > Yeah, that's another thing I forgot about since I don't have VS2012
> > > at hand.
> > >
> > I got sidetracked a bit lately but would like to finish "upstreaming"
> > this if possible. I have a new discussion point though, regarding code
> > duplication with the Linux xenvchan implementation.
> >=20
> > It turns out that my xenvchan implementation has a subtle bug that was
> > fixed some time ago in the Xen implementation. I had based my version
> > off the current Linux xenvchan which has the bug fixed, but in the
> > process of making it MSVC compatible I reintroduced the bug. My
> > colleague Marek (cc) suggested that we maybe could somehow use the
> > original Linux source with just some patches that make it Windows
> > compatible. I think you already pull some Xen sources (mainly
> > includes) for pvdrivers, so maybe it's possible.
> >=20
>=20
> Hi Rafal,
>=20
>   I only pull public includes from Xen. They require post-processing (to =
substitute 'long' for 'LONG_PTR' mainly) but no hand editing. I think that =
pulling in actual source modules would be a lot harder (and you'd probably =
have to turn the warning level in MSVC way down to make it happy with all t=
he implicit type conversion that usually goes on in Linux source code).

In previous version of this library (based on old PV drivers) we had
exactly the same vchan library compiling for both Linux and Windows.
There were few #ifdefs for vchan initialization, but that's all.

The current upstream version is almost good enough (besides
initialization). Yes, some implicit type conversions needs fixing, but
it isn't that bad. Basically this commit:
https://github.com/QubesOS/qubes-vmm-xen-windows-pvdrivers/commit/c5ead5656=
8677fbeae130ae070610db060935c7e

And I think it would be accepted upstream.

That old vchan version, which worked in both Linux and Windows (and also
mini-os in stubdomain) is here:
https://github.com/QubesOS/qubes-core-vchan-xen/tree/release2/vchan

> > This would require that the usermode xeniface bindings were as close
> > to Linux libxc as possible. I'm not liking the idea that a Windows DLL
> > would only export Linux-flavored APIs, but I could easily make
> > additional exports that look mostly like libxc. The main difference is
> > that Linux APIs don't use event objects like Windows, and use
> > different return values.
> >=20
> > I admit I have some concerns that identically named functions *will*
> > be different at least in some places (Linux libxc vs Windows). We
> > can't make the API 100% identical due to fundamental OS differences,
> > but I agree with Marek that code duplication is an issue and should be
> > avoided when possible. Thoughts? :)
>=20
>   It's a tricky one. There's already way more code duplication than I wou=
ld like between the drivers themselves (e.g. a lot of the PnP code is compl=
etely identical between XENBUS and XENVIF but I keep it separate since the =
drivers do need to be able to evolve separately) so code duplication betwee=
n different OS implementations of an API/protocol is something that I think=
 we just have to live with. There is definitely merit in keeping the Window=
s and Linux APIs 'aligned' for familiarity when porting an application but,=
 as you say, the OS are fundamentally different and trying to use common so=
urce is probably going to end up mean too much abstraction away from both O=
S.

Yes, in some cases keeping the same code for different OSes is hard, but
I think it worth some effort, because managing duplicated code is much
more pain. For every commit you need to think about whether it should be
also included in the other copy/copies or not (and also know about
existence of all the copies!). And surely you will forget about it
sometimes. The case Rafa=C5=82 mentioned was a security bug!

The upstream libxc library already have an abstraction for os-specific
code. Not sure if that is flexible enough to use also for Windows, but
IMHO it worth consideration. For example places which return FD for
select/poll could return Event object etc.
If not possible to use exactly this one (which would make API 100%
compatible), IMO it worth pursuing the state where as few functions as
possible are different. Then, in case of vchan, it would mean separate
initialization functions (for example init_gnt_evt_posix,
init_evt_srv_windows), but most of the other code would be the same.

Some another idea would be to plug the current interface library into
libxc OS abstraction. So Windows build of libxc would use (be a wrapper
of) the current xencontrol library. But still, it would be good idea to
design the API that way to make it as easy as possible.

--=20
Best Regards,
Marek Marczykowski-G=C3=B3recki
Invisible Things Lab
A: Because it messes up the order in which people normally read text.
Q: Why is top-posting such a bad thing?

--xjamM5M9kpPM/bcu
Content-Type: application/pgp-signature

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJWeUOTAAoJENuP0xzK19cspcAH/1bUNqnh/9ZRbZbP1/UcSMh6
QE0K6uqT17MYst2kNRAC6iJZXSCHq6VppNaAE/wKrFDUHlERRHR8SrbDZlRBrWqB
iir2dAJaIyhH/Wty5tfGpWUnmePlCDieBV2WMALLNmtZnv37YmcPkbiQBThj/Nj1
4DsjPgaak8JT7OwvJ1muaThCIvuPN2g8EAZ+PaWCcuxkGMaR63y0PNL3nlJN2HiN
/3tD0ZQhUXNSDcQ67WucPSJmAmYknReQdebw/MuZ9eE3/IWH0+KOeEfEGbCj+iTI
YRCuVvceIZBMSJ7tCDheRyyJ1DHPnkWallDuVihyZdnNAA4lh0370jCuuYOjbhU=
=Epwt
-----END PGP SIGNATURE-----

--xjamM5M9kpPM/bcu--


--===============5761002651995023886==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

_______________________________________________
win-pv-devel mailing list
win-pv-devel@lists.xenproject.org
http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel
--===============5761002651995023886==--


From win-pv-devel-bounces@lists.xenproject.org Wed Dec 23 11:42:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 23 Dec 2015 11:42:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aBhoS-00012p-KG; Wed, 23 Dec 2015 11:42:36 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7929e83f2=Paul.Durrant@citrix.com>)
	id 1aBhoR-00012k-4C
	for win-pv-devel@lists.xenproject.org; Wed, 23 Dec 2015 11:42:35 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	0F/8A-18316-AA88A765; Wed, 23 Dec 2015 11:42:34 +0000
X-Env-Sender: prvs=7929e83f2=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1450870951!6861854!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 47984 invoked from network); 23 Dec 2015 11:42:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Dec 2015 11:42:32 -0000
X-IronPort-AV: E=Sophos;i="5.20,468,1444694400"; d="scan'208";a="10934895"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?TWFyZWsgTWFyY3p5a293c2tpLUfDs3JlY2tp?=
	<marmarek@invisiblethingslab.com>
Thread-Topic: [win-pv-devel] [PATCH] Add a user mode library wrapper for
	XENIFACE IOCTLs
Thread-Index: AQHRGA+lHYPEmX2uKECNPnQ/gQgPnp7WPVaAgAC+JdCAAC4eAIABkpyg
Date: Wed, 23 Dec 2015 11:42:30 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F70B229@AMSPEX01CL01.citrite.net>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
	<56787D61.9040203@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
	<20151222123530.GH945@mail-itl>
In-Reply-To: <20151222123530.GH945@mail-itl>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	=?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KW3NuaXBdDQo+ID4gICBJdCdzIGEgdHJpY2t5
IG9uZS4gVGhlcmUncyBhbHJlYWR5IHdheSBtb3JlIGNvZGUgZHVwbGljYXRpb24gdGhhbiBJIHdv
dWxkDQo+IGxpa2UgYmV0d2VlbiB0aGUgZHJpdmVycyB0aGVtc2VsdmVzIChlLmcuIGEgbG90IG9m
IHRoZSBQblAgY29kZSBpcyBjb21wbGV0ZWx5DQo+IGlkZW50aWNhbCBiZXR3ZWVuIFhFTkJVUyBh
bmQgWEVOVklGIGJ1dCBJIGtlZXAgaXQgc2VwYXJhdGUgc2luY2UgdGhlDQo+IGRyaXZlcnMgZG8g
bmVlZCB0byBiZSBhYmxlIHRvIGV2b2x2ZSBzZXBhcmF0ZWx5KSBzbyBjb2RlIGR1cGxpY2F0aW9u
DQo+IGJldHdlZW4gZGlmZmVyZW50IE9TIGltcGxlbWVudGF0aW9ucyBvZiBhbiBBUEkvcHJvdG9j
b2wgaXMgc29tZXRoaW5nIHRoYXQNCj4gSSB0aGluayB3ZSBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRo
LiBUaGVyZSBpcyBkZWZpbml0ZWx5IG1lcml0IGluIGtlZXBpbmcgdGhlDQo+IFdpbmRvd3MgYW5k
IExpbnV4IEFQSXMgJ2FsaWduZWQnIGZvciBmYW1pbGlhcml0eSB3aGVuIHBvcnRpbmcgYW4gYXBw
bGljYXRpb24NCj4gYnV0LCBhcyB5b3Ugc2F5LCB0aGUgT1MgYXJlIGZ1bmRhbWVudGFsbHkgZGlm
ZmVyZW50IGFuZCB0cnlpbmcgdG8gdXNlDQo+IGNvbW1vbiBzb3VyY2UgaXMgcHJvYmFibHkgZ29p
bmcgdG8gZW5kIHVwIG1lYW4gdG9vIG11Y2ggYWJzdHJhY3Rpb24gYXdheQ0KPiBmcm9tIGJvdGgg
T1MuDQo+IA0KPiBZZXMsIGluIHNvbWUgY2FzZXMga2VlcGluZyB0aGUgc2FtZSBjb2RlIGZvciBk
aWZmZXJlbnQgT1NlcyBpcyBoYXJkLCBidXQNCj4gSSB0aGluayBpdCB3b3J0aCBzb21lIGVmZm9y
dCwgYmVjYXVzZSBtYW5hZ2luZyBkdXBsaWNhdGVkIGNvZGUgaXMgbXVjaA0KPiBtb3JlIHBhaW4u
IEZvciBldmVyeSBjb21taXQgeW91IG5lZWQgdG8gdGhpbmsgYWJvdXQgd2hldGhlciBpdCBzaG91
bGQgYmUNCj4gYWxzbyBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgY29weS9jb3BpZXMgb3Igbm90IChh
bmQgYWxzbyBrbm93IGFib3V0DQo+IGV4aXN0ZW5jZSBvZiBhbGwgdGhlIGNvcGllcyEpLiBBbmQg
c3VyZWx5IHlvdSB3aWxsIGZvcmdldCBhYm91dCBpdA0KPiBzb21ldGltZXMuIFRoZSBjYXNlIFJh
ZmHFgiBtZW50aW9uZWQgd2FzIGEgc2VjdXJpdHkgYnVnIQ0KDQpJbmRlZWQsIGl0IGlzIGEgd29y
dGh5IGdvYWwuIEJ1dCB0aGUgcGFpbiBvZiBrZWVwaW5nIHRoaW5ncyBpbiBzeW5jIGhhcyB0byBi
ZSB0cmFkZWQgb2ZmIGFnYWluc3QgdGhlIGNvbXBsZXhpdHkgb2YgbWFraW5nIHRoZSBjb2RlIGNv
bW1vbi4NCg0KPiANCj4gVGhlIHVwc3RyZWFtIGxpYnhjIGxpYnJhcnkgYWxyZWFkeSBoYXZlIGFu
IGFic3RyYWN0aW9uIGZvciBvcy1zcGVjaWZpYw0KPiBjb2RlLiBOb3Qgc3VyZSBpZiB0aGF0IGlz
IGZsZXhpYmxlIGVub3VnaCB0byB1c2UgYWxzbyBmb3IgV2luZG93cywgYnV0DQo+IElNSE8gaXQg
d29ydGggY29uc2lkZXJhdGlvbi4gRm9yIGV4YW1wbGUgcGxhY2VzIHdoaWNoIHJldHVybiBGRCBm
b3INCj4gc2VsZWN0L3BvbGwgY291bGQgcmV0dXJuIEV2ZW50IG9iamVjdCBldGMuDQoNCkl0J3Mg
d29ydGggaW52ZXN0aWdhdGluZyB0aGUgZmVhc2liaWxpdHkgb2YgdGhhdCBpZiB0aGVyZSBpcyB0
aW1lIHRvIGRvIHNvLiBJIGd1ZXNzIHVsdGltYXRlbHkgTVNWQyB2Y3hwcm9qIGFuZCBzbG4gZmls
ZXMgY291bGQgYWxzbyBiZSB1cHN0cmVhbWVkIGludG8gdGhlIHNvdXJjZSBiYXNlIGlmIGl0IGNh
biBiZSBtYWRlIHRvIHdvcmsuDQoNCj4gSWYgbm90IHBvc3NpYmxlIHRvIHVzZSBleGFjdGx5IHRo
aXMgb25lICh3aGljaCB3b3VsZCBtYWtlIEFQSSAxMDAlDQo+IGNvbXBhdGlibGUpLCBJTU8gaXQg
d29ydGggcHVyc3VpbmcgdGhlIHN0YXRlIHdoZXJlIGFzIGZldyBmdW5jdGlvbnMgYXMNCj4gcG9z
c2libGUgYXJlIGRpZmZlcmVudC4gVGhlbiwgaW4gY2FzZSBvZiB2Y2hhbiwgaXQgd291bGQgbWVh
biBzZXBhcmF0ZQ0KPiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKGZvciBleGFtcGxlIGluaXRf
Z250X2V2dF9wb3NpeCwNCj4gaW5pdF9ldnRfc3J2X3dpbmRvd3MpLCBidXQgbW9zdCBvZiB0aGUg
b3RoZXIgY29kZSB3b3VsZCBiZSB0aGUgc2FtZS4NCj4gDQoNCklmIHRoYXQgaXMgcGFsYXRhYmxl
IHRvIHRoZSBtYWludGFpbmVycyB0aGVuIGl0IHNvdW5kcyBwbGF1c2libGUuDQoNCj4gU29tZSBh
bm90aGVyIGlkZWEgd291bGQgYmUgdG8gcGx1ZyB0aGUgY3VycmVudCBpbnRlcmZhY2UgbGlicmFy
eSBpbnRvDQo+IGxpYnhjIE9TIGFic3RyYWN0aW9uLiBTbyBXaW5kb3dzIGJ1aWxkIG9mIGxpYnhj
IHdvdWxkIHVzZSAoYmUgYSB3cmFwcGVyDQo+IG9mKSB0aGUgY3VycmVudCB4ZW5jb250cm9sIGxp
YnJhcnkuIEJ1dCBzdGlsbCwgaXQgd291bGQgYmUgZ29vZCBpZGVhIHRvDQo+IGRlc2lnbiB0aGUg
QVBJIHRoYXQgd2F5IHRvIG1ha2UgaXQgYXMgZWFzeSBhcyBwb3NzaWJsZS4NCg0KWWVzIGluZGVl
ZC4NCg0KQ2hlZXJzLA0KDQogIFBhdWwNCg0KPiANCj4gLS0NCj4gQmVzdCBSZWdhcmRzLA0KPiBN
YXJlayBNYXJjenlrb3dza2ktR8OzcmVja2kNCj4gSW52aXNpYmxlIFRoaW5ncyBMYWINCj4gQTog
QmVjYXVzZSBpdCBtZXNzZXMgdXAgdGhlIG9yZGVyIGluIHdoaWNoIHBlb3BsZSBub3JtYWxseSBy
ZWFkIHRleHQuDQo+IFE6IFdoeSBpcyB0b3AtcG9zdGluZyBzdWNoIGEgYmFkIHRoaW5nPw0KX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVs
IG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xp
c3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

From win-pv-devel-bounces@lists.xenproject.org Wed Dec 23 11:42:38 2015
Return-path: <win-pv-devel-bounces@lists.xenproject.org>
Envelope-to: archives@lists.xenproject.org
Delivery-date: Wed, 23 Dec 2015 11:42:38 +0000
Received: from localhost ([127.0.0.1] helo=lists.xen.org)
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <win-pv-devel-bounces@lists.xenproject.org>)
	id 1aBhoS-00012p-KG; Wed, 23 Dec 2015 11:42:36 +0000
Received: from mail6.bemta4.messagelabs.com ([85.158.143.247])
	by lists.xen.org with esmtp (Exim 4.72)
	(envelope-from <prvs=7929e83f2=Paul.Durrant@citrix.com>)
	id 1aBhoR-00012k-4C
	for win-pv-devel@lists.xenproject.org; Wed, 23 Dec 2015 11:42:35 +0000
Received: from [85.158.143.35] by server-2.bemta-4.messagelabs.com id
	0F/8A-18316-AA88A765; Wed, 23 Dec 2015 11:42:34 +0000
X-Env-Sender: prvs=7929e83f2=Paul.Durrant@citrix.com
X-Msg-Ref: server-6.tower-21.messagelabs.com!1450870951!6861854!1
X-Originating-IP: [185.25.65.24]
X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No 
	Received headers
X-StarScan-Received: 
X-StarScan-Version: 7.35.1; banners=-,-,-
X-VirusChecked: Checked
Received: (qmail 47984 invoked from network); 23 Dec 2015 11:42:32 -0000
Received: from smtp.ctxuk.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24)
	by server-6.tower-21.messagelabs.com with RC4-SHA encrypted SMTP;
	23 Dec 2015 11:42:32 -0000
X-IronPort-AV: E=Sophos;i="5.20,468,1444694400"; d="scan'208";a="10934895"
From: Paul Durrant <Paul.Durrant@citrix.com>
To: =?utf-8?B?TWFyZWsgTWFyY3p5a293c2tpLUfDs3JlY2tp?=
	<marmarek@invisiblethingslab.com>
Thread-Topic: [win-pv-devel] [PATCH] Add a user mode library wrapper for
	XENIFACE IOCTLs
Thread-Index: AQHRGA+lHYPEmX2uKECNPnQ/gQgPnp7WPVaAgAC+JdCAAC4eAIABkpyg
Date: Wed, 23 Dec 2015 11:42:30 +0000
Message-ID: <9AAE0902D5BC7E449B7C8E4E778ABCD02F70B229@AMSPEX01CL01.citrite.net>
References: <563B65F1.2020606@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F661441@AMSPEX01CL01.citrite.net>
	<563BC62A.60203@invisiblethingslab.com>
	<56787D61.9040203@invisiblethingslab.com>
	<9AAE0902D5BC7E449B7C8E4E778ABCD02F707BB4@AMSPEX01CL01.citrite.net>
	<20151222123530.GH945@mail-itl>
In-Reply-To: <20151222123530.GH945@mail-itl>
Accept-Language: en-GB, en-US
Content-Language: en-US
X-MS-Has-Attach: 
X-MS-TNEF-Correlator: 
MIME-Version: 1.0
X-DLP: AMS1
Cc: "win-pv-devel@lists.xenproject.org" <win-pv-devel@lists.xenproject.org>,
	=?utf-8?B?UmFmYcWCIFdvamR5xYJh?= <omeg@invisiblethingslab.com>
Subject: Re: [win-pv-devel] [PATCH] Add a user mode library wrapper for
 XENIFACE IOCTLs
X-BeenThere: win-pv-devel@lists.xenproject.org
X-Mailman-Version: 2.1.13
Precedence: list
List-Id: Developer list for the Windows PV Drivers subproject
	<win-pv-devel.lists.xenproject.org>
List-Unsubscribe: <http://lists.xenproject.org/cgi-bin/mailman/options/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=unsubscribe>
List-Post: <mailto:win-pv-devel@lists.xenproject.org>
List-Help: <mailto:win-pv-devel-request@lists.xenproject.org?subject=help>
List-Subscribe: <http://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel>,
	<mailto:win-pv-devel-request@lists.xenproject.org?subject=subscribe>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Sender: win-pv-devel-bounces@lists.xenproject.org
Errors-To: win-pv-devel-bounces@lists.xenproject.org

PiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KW3NuaXBdDQo+ID4gICBJdCdzIGEgdHJpY2t5
IG9uZS4gVGhlcmUncyBhbHJlYWR5IHdheSBtb3JlIGNvZGUgZHVwbGljYXRpb24gdGhhbiBJIHdv
dWxkDQo+IGxpa2UgYmV0d2VlbiB0aGUgZHJpdmVycyB0aGVtc2VsdmVzIChlLmcuIGEgbG90IG9m
IHRoZSBQblAgY29kZSBpcyBjb21wbGV0ZWx5DQo+IGlkZW50aWNhbCBiZXR3ZWVuIFhFTkJVUyBh
bmQgWEVOVklGIGJ1dCBJIGtlZXAgaXQgc2VwYXJhdGUgc2luY2UgdGhlDQo+IGRyaXZlcnMgZG8g
bmVlZCB0byBiZSBhYmxlIHRvIGV2b2x2ZSBzZXBhcmF0ZWx5KSBzbyBjb2RlIGR1cGxpY2F0aW9u
DQo+IGJldHdlZW4gZGlmZmVyZW50IE9TIGltcGxlbWVudGF0aW9ucyBvZiBhbiBBUEkvcHJvdG9j
b2wgaXMgc29tZXRoaW5nIHRoYXQNCj4gSSB0aGluayB3ZSBqdXN0IGhhdmUgdG8gbGl2ZSB3aXRo
LiBUaGVyZSBpcyBkZWZpbml0ZWx5IG1lcml0IGluIGtlZXBpbmcgdGhlDQo+IFdpbmRvd3MgYW5k
IExpbnV4IEFQSXMgJ2FsaWduZWQnIGZvciBmYW1pbGlhcml0eSB3aGVuIHBvcnRpbmcgYW4gYXBw
bGljYXRpb24NCj4gYnV0LCBhcyB5b3Ugc2F5LCB0aGUgT1MgYXJlIGZ1bmRhbWVudGFsbHkgZGlm
ZmVyZW50IGFuZCB0cnlpbmcgdG8gdXNlDQo+IGNvbW1vbiBzb3VyY2UgaXMgcHJvYmFibHkgZ29p
bmcgdG8gZW5kIHVwIG1lYW4gdG9vIG11Y2ggYWJzdHJhY3Rpb24gYXdheQ0KPiBmcm9tIGJvdGgg
T1MuDQo+IA0KPiBZZXMsIGluIHNvbWUgY2FzZXMga2VlcGluZyB0aGUgc2FtZSBjb2RlIGZvciBk
aWZmZXJlbnQgT1NlcyBpcyBoYXJkLCBidXQNCj4gSSB0aGluayBpdCB3b3J0aCBzb21lIGVmZm9y
dCwgYmVjYXVzZSBtYW5hZ2luZyBkdXBsaWNhdGVkIGNvZGUgaXMgbXVjaA0KPiBtb3JlIHBhaW4u
IEZvciBldmVyeSBjb21taXQgeW91IG5lZWQgdG8gdGhpbmsgYWJvdXQgd2hldGhlciBpdCBzaG91
bGQgYmUNCj4gYWxzbyBpbmNsdWRlZCBpbiB0aGUgb3RoZXIgY29weS9jb3BpZXMgb3Igbm90IChh
bmQgYWxzbyBrbm93IGFib3V0DQo+IGV4aXN0ZW5jZSBvZiBhbGwgdGhlIGNvcGllcyEpLiBBbmQg
c3VyZWx5IHlvdSB3aWxsIGZvcmdldCBhYm91dCBpdA0KPiBzb21ldGltZXMuIFRoZSBjYXNlIFJh
ZmHFgiBtZW50aW9uZWQgd2FzIGEgc2VjdXJpdHkgYnVnIQ0KDQpJbmRlZWQsIGl0IGlzIGEgd29y
dGh5IGdvYWwuIEJ1dCB0aGUgcGFpbiBvZiBrZWVwaW5nIHRoaW5ncyBpbiBzeW5jIGhhcyB0byBi
ZSB0cmFkZWQgb2ZmIGFnYWluc3QgdGhlIGNvbXBsZXhpdHkgb2YgbWFraW5nIHRoZSBjb2RlIGNv
bW1vbi4NCg0KPiANCj4gVGhlIHVwc3RyZWFtIGxpYnhjIGxpYnJhcnkgYWxyZWFkeSBoYXZlIGFu
IGFic3RyYWN0aW9uIGZvciBvcy1zcGVjaWZpYw0KPiBjb2RlLiBOb3Qgc3VyZSBpZiB0aGF0IGlz
IGZsZXhpYmxlIGVub3VnaCB0byB1c2UgYWxzbyBmb3IgV2luZG93cywgYnV0DQo+IElNSE8gaXQg
d29ydGggY29uc2lkZXJhdGlvbi4gRm9yIGV4YW1wbGUgcGxhY2VzIHdoaWNoIHJldHVybiBGRCBm
b3INCj4gc2VsZWN0L3BvbGwgY291bGQgcmV0dXJuIEV2ZW50IG9iamVjdCBldGMuDQoNCkl0J3Mg
d29ydGggaW52ZXN0aWdhdGluZyB0aGUgZmVhc2liaWxpdHkgb2YgdGhhdCBpZiB0aGVyZSBpcyB0
aW1lIHRvIGRvIHNvLiBJIGd1ZXNzIHVsdGltYXRlbHkgTVNWQyB2Y3hwcm9qIGFuZCBzbG4gZmls
ZXMgY291bGQgYWxzbyBiZSB1cHN0cmVhbWVkIGludG8gdGhlIHNvdXJjZSBiYXNlIGlmIGl0IGNh
biBiZSBtYWRlIHRvIHdvcmsuDQoNCj4gSWYgbm90IHBvc3NpYmxlIHRvIHVzZSBleGFjdGx5IHRo
aXMgb25lICh3aGljaCB3b3VsZCBtYWtlIEFQSSAxMDAlDQo+IGNvbXBhdGlibGUpLCBJTU8gaXQg
d29ydGggcHVyc3VpbmcgdGhlIHN0YXRlIHdoZXJlIGFzIGZldyBmdW5jdGlvbnMgYXMNCj4gcG9z
c2libGUgYXJlIGRpZmZlcmVudC4gVGhlbiwgaW4gY2FzZSBvZiB2Y2hhbiwgaXQgd291bGQgbWVh
biBzZXBhcmF0ZQ0KPiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgKGZvciBleGFtcGxlIGluaXRf
Z250X2V2dF9wb3NpeCwNCj4gaW5pdF9ldnRfc3J2X3dpbmRvd3MpLCBidXQgbW9zdCBvZiB0aGUg
b3RoZXIgY29kZSB3b3VsZCBiZSB0aGUgc2FtZS4NCj4gDQoNCklmIHRoYXQgaXMgcGFsYXRhYmxl
IHRvIHRoZSBtYWludGFpbmVycyB0aGVuIGl0IHNvdW5kcyBwbGF1c2libGUuDQoNCj4gU29tZSBh
bm90aGVyIGlkZWEgd291bGQgYmUgdG8gcGx1ZyB0aGUgY3VycmVudCBpbnRlcmZhY2UgbGlicmFy
eSBpbnRvDQo+IGxpYnhjIE9TIGFic3RyYWN0aW9uLiBTbyBXaW5kb3dzIGJ1aWxkIG9mIGxpYnhj
IHdvdWxkIHVzZSAoYmUgYSB3cmFwcGVyDQo+IG9mKSB0aGUgY3VycmVudCB4ZW5jb250cm9sIGxp
YnJhcnkuIEJ1dCBzdGlsbCwgaXQgd291bGQgYmUgZ29vZCBpZGVhIHRvDQo+IGRlc2lnbiB0aGUg
QVBJIHRoYXQgd2F5IHRvIG1ha2UgaXQgYXMgZWFzeSBhcyBwb3NzaWJsZS4NCg0KWWVzIGluZGVl
ZC4NCg0KQ2hlZXJzLA0KDQogIFBhdWwNCg0KPiANCj4gLS0NCj4gQmVzdCBSZWdhcmRzLA0KPiBN
YXJlayBNYXJjenlrb3dza2ktR8OzcmVja2kNCj4gSW52aXNpYmxlIFRoaW5ncyBMYWINCj4gQTog
QmVjYXVzZSBpdCBtZXNzZXMgdXAgdGhlIG9yZGVyIGluIHdoaWNoIHBlb3BsZSBub3JtYWxseSBy
ZWFkIHRleHQuDQo+IFE6IFdoeSBpcyB0b3AtcG9zdGluZyBzdWNoIGEgYmFkIHRoaW5nPw0KX19f
X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18Kd2luLXB2LWRldmVs
IG1haWxpbmcgbGlzdAp3aW4tcHYtZGV2ZWxAbGlzdHMueGVucHJvamVjdC5vcmcKaHR0cDovL2xp
c3RzLnhlbnByb2plY3Qub3JnL2NnaS1iaW4vbWFpbG1hbi9saXN0aW5mby93aW4tcHYtZGV2ZWw=

