diff for duplicates of <1432156539.19618.135.camel@intel.com> diff --git a/a/1.txt b/N1/1.txt index ff5d956..f3653c5 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,478 +1,546 @@ -T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K -PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1 -YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50 -ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp -bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg -Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz -dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z -KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo -ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv -c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1 -Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K -SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu -IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf -aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg -ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp -dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg -Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp -ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv -bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx -MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+ -ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3 -ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq -ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+ -ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0 -OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN -Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg -IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp -YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl -ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl -dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1 -Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r -IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ -ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv -ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0 -XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh -dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1 -ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K -PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh -ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg -Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg -ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf -bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K -PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g -KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct -PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z -aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt -XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf -cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p -byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg -bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi -dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi -RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m -ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg -ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg -ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg -ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp -b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K -PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K -PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu -djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh -cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K -PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y -ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv -ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1 -IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v -ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp -b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr -IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv -ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg -ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K -PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp -Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg -IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp -bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np -emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw -MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg -c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg -KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg -KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg -ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg -Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg -cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g -KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m -ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc -biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf -b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg -ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg -ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g -ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z -aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg -ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+ -ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN -Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf -UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj -bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2 -NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf -UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9 -IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0 -ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg -ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs -DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1 -IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg -ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS -OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT -TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52 -NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1 -LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg -ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g -b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw -MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg -ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg -ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg -ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT -RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo -YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ -ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P -RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo -bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2 -NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg -ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs -bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz -NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls -cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu -dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg -ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg -dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg -PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg -ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1 -XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi -dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg -ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm -ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g -PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl -diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW -U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g -c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN -Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K -PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w -ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u -ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg -ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg -LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L -U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg -PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh -ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg -ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g -KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf -T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w -cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K -PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+ -IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl -diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp -Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg -ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g -b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS -UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs -NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi -X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+ -ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n -IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg -IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg -LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50 -ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu -ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g -LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg -ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC -QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg -KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh -cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf -YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ -ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi -YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m -ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T -QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y -bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg -ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl -ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50 -IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg -ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi -MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo -YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy -ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0 -ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg -IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g -ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf -YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg -ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg -ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+ -IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs -IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy -MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg -bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h -ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg -ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh -cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h -ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi -MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv -d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg -ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g -PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT -RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g -KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl -dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg -ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg -ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g -LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg -NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw -X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt -bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk -ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg -ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk -ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi -YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg -ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk -ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw -KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg -MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm -LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz -TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf -U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi -U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh -bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt -PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0 -ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy -X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy -X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg -ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN -Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0 -NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp -LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug -ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g -PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6 -IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy -X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht -bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi -YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg -ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg -ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4 -XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy -LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g -NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh -cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh -cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg -ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN -Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1 -TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks -ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g -PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg -ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp -dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo -MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh -bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p -byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg -bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ -IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K -PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp -Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf -T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB -UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g -b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K -PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp -dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo -MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+ -YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh -cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr -IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg -ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg -ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g -KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7 -DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G -RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0 -cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G -RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy -NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs -IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m -ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy -M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO -Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp -LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp -ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw -ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy -X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy -X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg -ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7 -DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS -NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl -diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs -c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy -NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf -b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t -aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh -cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg -ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g -ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs -bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl -ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf -YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf -YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg -ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K -PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY -TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks -ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K -PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj -dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg -aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+ -ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q -IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP -T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo -IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg -bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt -ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg -c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl -bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC -X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf -SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O -VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf -SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ -ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg -ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh -c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf -REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf -SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U -RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf -UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY -Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP -T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9 -DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv -KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn -aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp -cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+ -IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN -Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg -ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj -YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD -SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD -RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO -VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8 -PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN -Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN -Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0 -ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy -ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg -ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+ -ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU -MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g -PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg -ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz -ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E -RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J -RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF -TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q -U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6 -DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr -ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg -Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg -ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g -KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu -ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu -ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs -IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg -ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj -IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg -ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj -YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93 -IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+ -ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs -DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG -U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U -X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy -M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50 -ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug -ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s -aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy -Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg -LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg -ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+ -ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy -Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi -X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu -ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50 -ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf -aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh -cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U -X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG -U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg -ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg -ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw -eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4 -DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+ -ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl -ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg -U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q -QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY -TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P -RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU -ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg -ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg -IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw -MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+ -ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj -ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu -ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C -X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS -NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF -X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT -RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg -ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg -ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg -ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu -YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi -ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr -IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz -dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf -dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg -ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf -c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk -Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg -QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg -I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg -bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+ -ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk -YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0 -X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50 -Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y -dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ -ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu -a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso -Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg -SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93 -b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv -cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u -ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf -dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0 -NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq -c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+ -ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu -Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl -KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j -bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf -d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf -dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K -PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+ -IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry -dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso -dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z -cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg -ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0 -cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz -dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf -Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA -IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh -bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z -ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+ -IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl -dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0 -IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu -NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t -IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+ -IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g -TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t -aW5mby5odG1sDQo= +On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote: +> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote: +> > From: Dave Jiang <dave.jiang@intel.com> +> > +> > Signed-off-by: Dave Jiang <dave.jiang@intel.com> +> +> Needs a topic in the subject line and a changelog. +> +> It also seems to do a lot more than just checking device ID (I assume +> that's what "DID" means), so this should probably be split into +> several patches that each do one thing. I see at least: +> +> - cosmetic code restructuring +> - work_struct/tasklet_struct changes +> - new #defines and bar2_off() changes + +I think this patch got mangled with couple other patches. Allen? + +> +> > --- +> > drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++----------------- +> > drivers/ntb/hw/intel/ntb_hw_intel.h | 24 ++++- +> > drivers/ntb/ntb_transport.c | 16 +-- +> > 3 files changed, 133 insertions(+), 103 deletions(-) +> > +> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c +> > index d162f22..89fea50 100644 +> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c +> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c +> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > size_t buf_size; +> > ssize_t ret, off; +> > union { u64 v64; u32 v32; u16 v16; } u; +> > - unsigned long reg; +> > +> > ndev = filp->private_data; +> > mmio = ndev->self_mmio; +> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > +> > if (!ndev->reg->link_is_up(ndev)) { +> > off += scnprintf(buf + off, buf_size - off, +> > - "Link Satus -\t\tDown\n"); +> > + "Link Status -\t\tDown\n"); +> > } else { +> > off += scnprintf(buf + off, buf_size - off, +> > - "Link Satus -\t\tUp\n"); +> > + "Link Status -\t\tUp\n"); +> > off += scnprintf(buf + off, buf_size - off, +> > "Link Speed -\t\tPCI-E Gen %u\n", +> > NTB_LNK_STA_SPEED(ndev->lnk_sta)); +> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > off += scnprintf(buf + off, buf_size - off, +> > "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask); +> > +> > - reg = ndev->self_reg->db_mask; +> > - u.v64 = ndev_db_read(ndev, mmio + reg); +> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask); +> > off += scnprintf(buf + off, buf_size - off, +> > "Doorbell Mask -\t\t%#llx\n", u.v64); +> > +> > - reg = ndev->self_reg->db_bell; +> > - u.v64 = ndev_db_read(ndev, mmio + reg); +> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell); +> > off += scnprintf(buf + off, buf_size - off, +> > "Doorbell Bell -\t\t%#llx\n", u.v64); +> > +> > off += scnprintf(buf + off, buf_size - off, +> > "\nNTB Incoming XLAT:\n"); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2)); +> > off += scnprintf(buf + off, buf_size - off, +> > "XLAT23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4)); +> > off += scnprintf(buf + off, buf_size - off, +> > "XLAT45 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2)); +> > off += scnprintf(buf + off, buf_size - off, +> > "LMT23 -\t\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4)); +> > off += scnprintf(buf + off, buf_size - off, +> > "LMT45 -\t\t\t%#018llx\n", u.v64); +> > +> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > off += scnprintf(buf + off, buf_size - off, +> > "\nNTB Outgoing B2B XLAT:\n"); +> > +> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B XLAT23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B XLAT45 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B LMT23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B LMT45 -\t\t%#018llx\n", u.v64); +> > +> > off += scnprintf(buf + off, buf_size - off, +> > "\nNTB Secondary BAR:\n"); +> > +> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "SBAR01 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "SBAR23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "SBAR45 -\t\t%#018llx\n", u.v64); +> > } +> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > off += scnprintf(buf + off, buf_size - off, +> > "\nSNB NTB Statistics:\n"); +> > +> > - reg = SNB_USMEMMISS_OFFSET; +> > - u.v16 = ioread16(mmio + reg); +> > + u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "Upstream Memory Miss -\t%u\n", u.v16); +> > +> > off += scnprintf(buf + off, buf_size - off, +> > "\nSNB NTB Hardware Errors:\n"); +> > +> > - reg = SNB_DEVSTS_OFFSET; +> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16)) +> > + if (!pci_read_config_word(ndev->ntb.pdev, +> > + SNB_DEVSTS_OFFSET, &u.v16)) +> > off += scnprintf(buf + off, buf_size - off, +> > "DEVSTS -\t\t%#06x\n", u.v16); +> > +> > - reg = SNB_LINK_STATUS_OFFSET; +> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16)) +> > + if (!pci_read_config_word(ndev->ntb.pdev, +> > + SNB_LINK_STATUS_OFFSET, &u.v16)) +> > off += scnprintf(buf + off, buf_size - off, +> > "LNKSTS -\t\t%#06x\n", u.v16); +> > +> > - reg = SNB_UNCERRSTS_OFFSET; +> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32)) +> > + if (!pci_read_config_dword(ndev->ntb.pdev, +> > + SNB_UNCERRSTS_OFFSET, &u.v32)) +> > off += scnprintf(buf + off, buf_size - off, +> > "UNCERRSTS -\t\t%#06x\n", u.v32); +> > +> > - reg = SNB_CORERRSTS_OFFSET; +> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32)) +> > + if (!pci_read_config_dword(ndev->ntb.pdev, +> > + SNB_CORERRSTS_OFFSET, &u.v32)) +> > off += scnprintf(buf + off, buf_size - off, +> > "CORERRSTS -\t\t%#06x\n", u.v32); +> > } +> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > { +> > struct pci_dev *pdev; +> > void __iomem *mmio; +> > - unsigned long off; +> > resource_size_t bar_size; +> > phys_addr_t bar_addr; +> > int b2b_bar; +> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz); +> > } +> > +> > - /* setup incoming bar base addresses */ +> > - off = SNB_SBAR0BASE_OFFSET; +> > - +> > /* SBAR01 hit by first part of the b2b bar */ +> > if (b2b_bar == 0) { +> > bar_addr = addr->bar0_addr; +> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > } +> > +> > dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr); +> > - iowrite64(bar_addr, mmio + bar0_off(off, 0)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET); +> > +> > /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar. +> > * The b2b bar is either disabled above, or configured half-size, and +> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > */ +> > +> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar0_off(off, 2)); +> > - bar_addr = ioread64(mmio + bar0_off(off, 2)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr); +> > +> > if (!ndev->bar4_split) { +> > bar_addr = addr->bar4_addr64 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar0_off(off, 4)); +> > - bar_addr = ioread64(mmio + bar0_off(off, 4)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr); +> > } else { +> > bar_addr = addr->bar4_addr32 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar0_off(off, 4)); +> > - bar_addr = ioread32(mmio + bar0_off(off, 4)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr); +> > +> > bar_addr = addr->bar5_addr32 + +> > (b2b_bar == 5 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar0_off(off, 5)); +> > - bar_addr = ioread32(mmio + bar0_off(off, 5)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr); +> > } +> > +> > /* setup incoming bar limits == base addrs (zero length windows) */ +> > - off = SNB_SBAR2LMT_OFFSET; +> > +> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar2_off(off, 2)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 2)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr); +> > +> > if (!ndev->bar4_split) { +> > bar_addr = addr->bar4_addr64 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 4)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr); +> > } else { +> > bar_addr = addr->bar4_addr32 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 4)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr); +> > +> > bar_addr = addr->bar5_addr32 + +> > (b2b_bar == 5 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar2_off(off, 5)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 5)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr); +> > } +> > +> > /* zero incoming translation addrs */ +> > - off = SNB_SBAR2XLAT_OFFSET; +> > - +> > - iowrite64(0, mmio + bar2_off(off, 2)); +> > + iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET); +> > +> > if (!ndev->bar4_split) { +> > - iowrite64(0, mmio + bar2_off(off, 4)); +> > + iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET); +> > } else { +> > - iowrite32(0, mmio + bar2_off(off, 4)); +> > - iowrite32(0, mmio + bar2_off(off, 5)); +> > + iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET); +> > + iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET); +> > } +> > +> > /* zero outgoing translation limits (whole bar size windows) */ +> > - off = SNB_PBAR2LMT_OFFSET; +> > - iowrite64(0, mmio + bar2_off(off, 2)); +> > + iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET); +> > if (!ndev->bar4_split) { +> > - iowrite64(0, mmio + bar2_off(off, 4)); +> > + iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET); +> > } else { +> > - iowrite32(0, mmio + bar2_off(off, 4)); +> > - iowrite32(0, mmio + bar2_off(off, 5)); +> > + iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET); +> > + iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET); +> > } +> > +> > /* set outgoing translation offsets */ +> > - off = SNB_PBAR2XLAT_OFFSET; +> > - +> > bar_addr = peer_addr->bar2_addr64; +> > - iowrite64(bar_addr, mmio + bar2_off(off, 2)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 2)); +> > + iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr); +> > +> > if (!ndev->bar4_split) { +> > bar_addr = peer_addr->bar4_addr64; +> > - iowrite64(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 4)); +> > + iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr); +> > } else { +> > bar_addr = peer_addr->bar2_addr64; +> > - iowrite32(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 4)); +> > + iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr); +> > +> > bar_addr = peer_addr->bar2_addr64; +> > - iowrite32(bar_addr, mmio + bar2_off(off, 5)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 5)); +> > + iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr); +> > } +> > +> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev) +> > u8 ppd; +> > int rc, mem; +> > +> > + pdev = ndev_pdev(ndev); +> > + +> > + switch (pdev->device) { +> > /* There is a Xeon hardware errata related to writes to SDOORBELL or +> > * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space, +> > * which may hang the system. To workaround this use the second memory +> > * window to access the interrupt and scratch pad registers on the +> > * remote system. +> > */ +> > - ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP; +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: +> > + ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP; +> > + break; +> > + } +> > +> > + switch (pdev->device) { +> > /* There is a hardware errata related to accessing any register in +> > * SB01BASE in the presence of bidirectional traffic crossing the NTB. +> > */ +> > - ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP; +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: +> > + ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP; +> > + break; +> > + } +> > +> > + switch (pdev->device) { +> > /* HW Errata on bit 14 of b2bdoorbell register. Writes will not be +> > * mirrored to the remote system. Shrink the number of bits by one, +> > * since bit 14 is the last bit. +> > */ +> > - ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14; +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: +> > + ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14; +> > + break; +> > + } +> > +> > ndev->reg = &snb_reg; +> > +> > - pdev = ndev_pdev(ndev); +> > - +> > rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd); +> > if (rc) +> > return -EIO; +> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = { +> > * window by setting the limit equal to base, nor can it limit the size +> > * of the memory window by setting the limit to base + size. +> > */ +> > - .bar2_limit = SNB_PBAR2LMT_OFFSET, +> > - .bar2_xlat = SNB_PBAR2XLAT_OFFSET, +> > + .bar2_limit = SNB_PBAR23LMT_OFFSET, +> > + .bar2_xlat = SNB_PBAR23XLAT_OFFSET, +> > }; +> > +> > static const struct intel_ntb_xlat_reg snb_sec_xlat = { +> > .bar0_base = SNB_SBAR0BASE_OFFSET, +> > - .bar2_limit = SNB_SBAR2LMT_OFFSET, +> > - .bar2_xlat = SNB_SBAR2XLAT_OFFSET, +> > + .bar2_limit = SNB_SBAR23LMT_OFFSET, +> > + .bar2_xlat = SNB_SBAR23XLAT_OFFSET, +> > }; +> > +> > static const struct intel_b2b_addr snb_b2b_usd_addr = { +> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h +> > index 0224b1a..fec689d 100644 +> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h +> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h +> > @@ -70,11 +70,27 @@ +> > +> > /* SNB hardware (and JSF, IVT, HSX) */ +> > +> > -#define SNB_PBAR2LMT_OFFSET 0x0000 +> > -#define SNB_PBAR2XLAT_OFFSET 0x0010 +> > -#define SNB_SBAR2LMT_OFFSET 0x0020 +> > -#define SNB_SBAR2XLAT_OFFSET 0x0030 +> > +#define SNB_PBAR23LMT_OFFSET 0x0000 +> > +#define SNB_PBAR45LMT_OFFSET 0x0008 +> > +#define SNB_PBAR4LMT_OFFSET 0x0008 +> > +#define SNB_PBAR5LMT_OFFSET 0x000c +> > +#define SNB_PBAR23XLAT_OFFSET 0x0010 +> > +#define SNB_PBAR45XLAT_OFFSET 0x0018 +> > +#define SNB_PBAR4XLAT_OFFSET 0x0018 +> > +#define SNB_PBAR5XLAT_OFFSET 0x001c +> > +#define SNB_SBAR23LMT_OFFSET 0x0020 +> > +#define SNB_SBAR45LMT_OFFSET 0x0028 +> > +#define SNB_SBAR4LMT_OFFSET 0x0028 +> > +#define SNB_SBAR5LMT_OFFSET 0x002c +> > +#define SNB_SBAR23XLAT_OFFSET 0x0030 +> > +#define SNB_SBAR45XLAT_OFFSET 0x0038 +> > +#define SNB_SBAR4XLAT_OFFSET 0x0038 +> > +#define SNB_SBAR5XLAT_OFFSET 0x003c +> > #define SNB_SBAR0BASE_OFFSET 0x0040 +> > +#define SNB_SBAR23BASE_OFFSET 0x0048 +> > +#define SNB_SBAR45BASE_OFFSET 0x0050 +> > +#define SNB_SBAR4BASE_OFFSET 0x0050 +> > +#define SNB_SBAR5BASE_OFFSET 0x0054 +> > #define SNB_SBDF_OFFSET 0x005c +> > #define SNB_NTBCNTL_OFFSET 0x0058 +> > #define SNB_PDOORBELL_OFFSET 0x0060 +> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c +> > index f1ed1b7..bb2eb85 100644 +> > --- a/drivers/ntb/ntb_transport.c +> > +++ b/drivers/ntb/ntb_transport.c +> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx { +> > +> > bool link_is_up; +> > struct delayed_work link_work; +> > - struct work_struct db_work; +> > struct work_struct link_cleanup; +> > + struct tasklet_struct db_work; +> > }; +> > +> > enum { +> > @@ -241,7 +241,7 @@ enum { +> > #define NTB_QP_DEF_NUM_ENTRIES 100 +> > #define NTB_LINK_DOWN_TIMEOUT 10 +> > +> > -static void ntb_transport_doorbell_work(struct work_struct *ws); +> > +static void ntb_transport_doorbell_work(unsigned long data); +> > static const struct ntb_ctx_ops ntb_transport_ops; +> > static struct ntb_client ntb_transport_client; +> > +> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) +> > } +> > +> > INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); +> > - INIT_WORK(&nt->db_work, ntb_transport_doorbell_work); +> > INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work); +> > + tasklet_init(&nt->db_work, ntb_transport_doorbell_work, +> > + (unsigned long)nt); +> > +> > rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops); +> > if (rc) +> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev) +> > int i; +> > +> > ntb_transport_link_cleanup(nt); +> > - cancel_work_sync(&nt->db_work); +> > + tasklet_disable(&nt->db_work); +> > cancel_work_sync(&nt->link_cleanup); +> > cancel_delayed_work_sync(&nt->link_work); +> > +> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp) +> > } +> > EXPORT_SYMBOL_GPL(ntb_transport_max_size); +> > +> > -static void ntb_transport_doorbell_work(struct work_struct *work) +> > +static void ntb_transport_doorbell_work(unsigned long data) +> > { +> > - struct ntb_transport_ctx *nt = container_of(work, +> > - struct ntb_transport_ctx, db_work); +> > + struct ntb_transport_ctx *nt = (void *)data; +> > struct ntb_transport_qp *qp; +> > u64 db_mask, db_bits, db_again; +> > unsigned int qp_num; +> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector) +> > +> > ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev)); +> > +> > - schedule_work(&nt->db_work); +> > + tasklet_schedule(&nt->db_work); +> > } +> > +> > static const struct ntb_ctx_ops ntb_transport_ops = { +> > -- +> > 2.4.0.rc0.43.gcf8a8c6 +> > +> > -- +> > To unsubscribe from this list: send the line "unsubscribe linux-pci" in +> > the body of a message to majordomo@vger.kernel.org +> > More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/a/content_digest b/N1/content_digest index a1b7771..67d787e 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -12,483 +12,551 @@ " linux-ntb@googlegroups.com <linux-ntb@googlegroups.com>\0" "\00:1\0" "b\0" - "T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K\n" - "PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1\n" - "YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50\n" - "ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp\n" - "bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg\n" - "Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz\n" - "dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z\n" - "KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo\n" - "ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv\n" - "c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1\n" - "Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K\n" - "SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu\n" - "IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n" - "aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg\n" - "ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp\n" - "dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg\n" - "Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp\n" - "ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv\n" - "bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx\n" - "MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+\n" - "ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3\n" - "ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq\n" - "ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+\n" - "ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0\n" - "OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN\n" - "Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg\n" - "IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp\n" - "YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl\n" - "ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl\n" - "dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1\n" - "Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r\n" - "IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n" - "ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv\n" - "ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0\n" - "XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh\n" - "dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1\n" - "ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K\n" - "PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh\n" - "ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg\n" - "Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf\n" - "bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K\n" - "PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g\n" - "KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct\n" - "PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n" - "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt\n" - "XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf\n" - "cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p\n" - "byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg\n" - "bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n" - "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi\n" - "RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m\n" - "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg\n" - "ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg\n" - "ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp\n" - "b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K\n" - "PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K\n" - "PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu\n" - "djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh\n" - "cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K\n" - "PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y\n" - "ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv\n" - "ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1\n" - "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v\n" - "ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp\n" - "b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr\n" - "IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv\n" - "ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K\n" - "PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp\n" - "Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg\n" - "IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp\n" - "bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np\n" - "emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw\n" - "MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg\n" - "c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg\n" - "KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg\n" - "KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg\n" - "ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg\n" - "Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg\n" - "cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g\n" - "KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m\n" - "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc\n" - "biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf\n" - "b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg\n" - "ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg\n" - "ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n" - "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg\n" - "ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+\n" - "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN\n" - "Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n" - "UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj\n" - "bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2\n" - "NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf\n" - "UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9\n" - "IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0\n" - "ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs\n" - "DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1\n" - "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS\n" - "OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT\n" - "TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52\n" - "NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1\n" - "LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n" - "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw\n" - "MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg\n" - "ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg\n" - "ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg\n" - "ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT\n" - "RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo\n" - "YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+\n" - "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P\n" - "RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo\n" - "bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2\n" - "NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs\n" - "bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz\n" - "NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls\n" - "cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu\n" - "dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg\n" - "ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg\n" - "dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg\n" - "PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg\n" - "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1\n" - "XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n" - "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg\n" - "ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm\n" - "ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g\n" - "PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl\n" - "diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW\n" - "U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g\n" - "c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN\n" - "Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K\n" - "PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w\n" - "ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u\n" - "ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg\n" - "LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L\n" - "U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg\n" - "PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh\n" - "ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg\n" - "ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g\n" - "KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf\n" - "T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w\n" - "cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K\n" - "PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+\n" - "IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl\n" - "diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp\n" - "Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n" - "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS\n" - "UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs\n" - "NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi\n" - "X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+\n" - "ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n\n" - "IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg\n" - "IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg\n" - "LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50\n" - "ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu\n" - "ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g\n" - "LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg\n" - "ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC\n" - "QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg\n" - "KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh\n" - "cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf\n" - "YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+\n" - "ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi\n" - "YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m\n" - "ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T\n" - "QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y\n" - "bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg\n" - "ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl\n" - "ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50\n" - "IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg\n" - "ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi\n" - "MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo\n" - "YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy\n" - "ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0\n" - "ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg\n" - "IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g\n" - "ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf\n" - "YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg\n" - "ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+\n" - "IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs\n" - "IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy\n" - "MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg\n" - "bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h\n" - "ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n" - "ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh\n" - "cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h\n" - "ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi\n" - "MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv\n" - "d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg\n" - "ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g\n" - "PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT\n" - "RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g\n" - "KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl\n" - "dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg\n" - "ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g\n" - "LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg\n" - "NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw\n" - "X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt\n" - "bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk\n" - "ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg\n" - "ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk\n" - "ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi\n" - "YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg\n" - "ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk\n" - "ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw\n" - "KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg\n" - "MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm\n" - "LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz\n" - "TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n" - "U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi\n" - "U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n" - "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt\n" - "PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0\n" - "ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n" - "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n" - "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n" - "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN\n" - "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0\n" - "NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n" - "LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug\n" - "ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g\n" - "PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6\n" - "IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy\n" - "X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht\n" - "bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi\n" - "YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n" - "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg\n" - "ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4\n" - "XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy\n" - "LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g\n" - "NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n" - "cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh\n" - "cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg\n" - "ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN\n" - "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1\n" - "TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n" - "ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g\n" - "PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg\n" - "ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp\n" - "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n" - "MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n" - "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p\n" - "byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg\n" - "bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n" - "IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K\n" - "PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp\n" - "Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf\n" - "T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB\n" - "UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g\n" - "b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K\n" - "PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp\n" - "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n" - "MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+\n" - "YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh\n" - "cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr\n" - "IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg\n" - "ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg\n" - "ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g\n" - "KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7\n" - "DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G\n" - "RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0\n" - "cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G\n" - "RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n" - "NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs\n" - "IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m\n" - "ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy\n" - "M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO\n" - "Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n" - "LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp\n" - "ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw\n" - "ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n" - "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n" - "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n" - "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7\n" - "DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS\n" - "NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl\n" - "diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs\n" - "c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n" - "NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf\n" - "b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t\n" - "aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n" - "cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n" - "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g\n" - "ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs\n" - "bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl\n" - "ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf\n" - "YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf\n" - "YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg\n" - "ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K\n" - "PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY\n" - "TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n" - "ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K\n" - "PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj\n" - "dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg\n" - "aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+\n" - "ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q\n" - "IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP\n" - "T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo\n" - "IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg\n" - "bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt\n" - "ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg\n" - "c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl\n" - "bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC\n" - "X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf\n" - "SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O\n" - "VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf\n" - "SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+\n" - "ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg\n" - "ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh\n" - "c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf\n" - "REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf\n" - "SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U\n" - "RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf\n" - "UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY\n" - "Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP\n" - "T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9\n" - "DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv\n" - "KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn\n" - "aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp\n" - "cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+\n" - "IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN\n" - "Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg\n" - "ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj\n" - "YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD\n" - "SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD\n" - "RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO\n" - "VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8\n" - "PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN\n" - "Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN\n" - "Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0\n" - "ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy\n" - "ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg\n" - "ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+\n" - "ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU\n" - "MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g\n" - "PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg\n" - "ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz\n" - "ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E\n" - "RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J\n" - "RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF\n" - "TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q\n" - "U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6\n" - "DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr\n" - "ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg\n" - "Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg\n" - "ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g\n" - "KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu\n" - "ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu\n" - "ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs\n" - "IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg\n" - "ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj\n" - "IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg\n" - "ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj\n" - "YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93\n" - "IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+\n" - "ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs\n" - "DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG\n" - "U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U\n" - "X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy\n" - "M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50\n" - "ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug\n" - "ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s\n" - "aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy\n" - "Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg\n" - "LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg\n" - "ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+\n" - "ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy\n" - "Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi\n" - "X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu\n" - "ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50\n" - "ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n" - "aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh\n" - "cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U\n" - "X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG\n" - "U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg\n" - "ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg\n" - "ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw\n" - "eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4\n" - "DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+\n" - "ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl\n" - "ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg\n" - "U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q\n" - "QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY\n" - "TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P\n" - "RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU\n" - "ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg\n" - "ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg\n" - "IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw\n" - "MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+\n" - "ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj\n" - "ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu\n" - "ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C\n" - "X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS\n" - "NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF\n" - "X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT\n" - "RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg\n" - "ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg\n" - "ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg\n" - "ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu\n" - "YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi\n" - "ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr\n" - "IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz\n" - "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf\n" - "dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg\n" - "ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf\n" - "c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk\n" - "Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg\n" - "QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg\n" - "I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg\n" - "bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+\n" - "ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk\n" - "YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0\n" - "X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50\n" - "Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y\n" - "dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+\n" - "ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu\n" - "a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso\n" - "Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg\n" - "SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93\n" - "b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv\n" - "cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u\n" - "ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf\n" - "dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0\n" - "NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq\n" - "c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+\n" - "ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu\n" - "Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl\n" - "KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j\n" - "bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf\n" - "d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf\n" - "dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K\n" - "PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+\n" - "IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry\n" - "dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso\n" - "dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z\n" - "cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg\n" - "ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0\n" - "cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz\n" - "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf\n" - "Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA\n" - "IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh\n" - "bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z\n" - "ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+\n" - "IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl\n" - "dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0\n" - "IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu\n" - "NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t\n" - "IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+\n" - "IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g\n" - "TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t\n" - aW5mby5odG1sDQo= + "On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:\n" + "> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:\n" + "> > From: Dave Jiang <dave.jiang@intel.com>\n" + "> >\n" + "> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>\n" + "> \n" + "> Needs a topic in the subject line and a changelog.\n" + "> \n" + "> It also seems to do a lot more than just checking device ID (I assume\n" + "> that's what \"DID\" means), so this should probably be split into\n" + "> several patches that each do one thing. I see at least:\n" + "> \n" + "> - cosmetic code restructuring\n" + "> - work_struct/tasklet_struct changes\n" + "> - new #defines and bar2_off() changes\n" + "\n" + "I think this patch got mangled with couple other patches. Allen?\n" + "\n" + "> \n" + "> > ---\n" + "> > drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------\n" + "> > drivers/ntb/hw/intel/ntb_hw_intel.h | 24 ++++-\n" + "> > drivers/ntb/ntb_transport.c | 16 +--\n" + "> > 3 files changed, 133 insertions(+), 103 deletions(-)\n" + "> >\n" + "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c\n" + "> > index d162f22..89fea50 100644\n" + "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c\n" + "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c\n" + "> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > size_t buf_size;\n" + "> > ssize_t ret, off;\n" + "> > union { u64 v64; u32 v32; u16 v16; } u;\n" + "> > - unsigned long reg;\n" + "> >\n" + "> > ndev = filp->private_data;\n" + "> > mmio = ndev->self_mmio;\n" + "> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> >\n" + "> > if (!ndev->reg->link_is_up(ndev)) {\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > - \"Link Satus -\\t\\tDown\\n\");\n" + "> > + \"Link Status -\\t\\tDown\\n\");\n" + "> > } else {\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > - \"Link Satus -\\t\\tUp\\n\");\n" + "> > + \"Link Status -\\t\\tUp\\n\");\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Link Speed -\\t\\tPCI-E Gen %u\\n\",\n" + "> > NTB_LNK_STA_SPEED(ndev->lnk_sta));\n" + "> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Doorbell Mask Cached -\\t%#llx\\n\", ndev->db_mask);\n" + "> >\n" + "> > - reg = ndev->self_reg->db_mask;\n" + "> > - u.v64 = ndev_db_read(ndev, mmio + reg);\n" + "> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Doorbell Mask -\\t\\t%#llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = ndev->self_reg->db_bell;\n" + "> > - u.v64 = ndev_db_read(ndev, mmio + reg);\n" + "> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Doorbell Bell -\\t\\t%#llx\\n\", u.v64);\n" + "> >\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nNTB Incoming XLAT:\\n\");\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"LMT23 -\\t\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"LMT45 -\\t\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nNTB Outgoing B2B XLAT:\\n\");\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B LMT23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B LMT45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nNTB Secondary BAR:\\n\");\n" + "> >\n" + "> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"SBAR01 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"SBAR23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"SBAR45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> > }\n" + "> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nSNB NTB Statistics:\\n\");\n" + "> >\n" + "> > - reg = SNB_USMEMMISS_OFFSET;\n" + "> > - u.v16 = ioread16(mmio + reg);\n" + "> > + u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Upstream Memory Miss -\\t%u\\n\", u.v16);\n" + "> >\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nSNB NTB Hardware Errors:\\n\");\n" + "> >\n" + "> > - reg = SNB_DEVSTS_OFFSET;\n" + "> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n" + "> > + if (!pci_read_config_word(ndev->ntb.pdev,\n" + "> > + SNB_DEVSTS_OFFSET, &u.v16))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"DEVSTS -\\t\\t%#06x\\n\", u.v16);\n" + "> >\n" + "> > - reg = SNB_LINK_STATUS_OFFSET;\n" + "> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n" + "> > + if (!pci_read_config_word(ndev->ntb.pdev,\n" + "> > + SNB_LINK_STATUS_OFFSET, &u.v16))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"LNKSTS -\\t\\t%#06x\\n\", u.v16);\n" + "> >\n" + "> > - reg = SNB_UNCERRSTS_OFFSET;\n" + "> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n" + "> > + if (!pci_read_config_dword(ndev->ntb.pdev,\n" + "> > + SNB_UNCERRSTS_OFFSET, &u.v32))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"UNCERRSTS -\\t\\t%#06x\\n\", u.v32);\n" + "> >\n" + "> > - reg = SNB_CORERRSTS_OFFSET;\n" + "> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n" + "> > + if (!pci_read_config_dword(ndev->ntb.pdev,\n" + "> > + SNB_CORERRSTS_OFFSET, &u.v32))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"CORERRSTS -\\t\\t%#06x\\n\", u.v32);\n" + "> > }\n" + "> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > {\n" + "> > struct pci_dev *pdev;\n" + "> > void __iomem *mmio;\n" + "> > - unsigned long off;\n" + "> > resource_size_t bar_size;\n" + "> > phys_addr_t bar_addr;\n" + "> > int b2b_bar;\n" + "> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR5SZ %#x\\n\", bar_sz);\n" + "> > }\n" + "> >\n" + "> > - /* setup incoming bar base addresses */\n" + "> > - off = SNB_SBAR0BASE_OFFSET;\n" + "> > -\n" + "> > /* SBAR01 hit by first part of the b2b bar */\n" + "> > if (b2b_bar == 0) {\n" + "> > bar_addr = addr->bar0_addr;\n" + "> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > }\n" + "> >\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR01 %#018llx\\n\", bar_addr);\n" + "> > - iowrite64(bar_addr, mmio + bar0_off(off, 0));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);\n" + "> >\n" + "> > /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.\n" + "> > * The b2b bar is either disabled above, or configured half-size, and\n" + "> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > */\n" + "> >\n" + "> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar0_off(off, 2));\n" + "> > - bar_addr = ioread64(mmio + bar0_off(off, 2));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR23 %#018llx\\n\", bar_addr);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > bar_addr = addr->bar4_addr64 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar0_off(off, 4));\n" + "> > - bar_addr = ioread64(mmio + bar0_off(off, 4));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR45 %#018llx\\n\", bar_addr);\n" + "> > } else {\n" + "> > bar_addr = addr->bar4_addr32 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar0_off(off, 4));\n" + "> > - bar_addr = ioread32(mmio + bar0_off(off, 4));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR4 %#010llx\\n\", bar_addr);\n" + "> >\n" + "> > bar_addr = addr->bar5_addr32 +\n" + "> > (b2b_bar == 5 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar0_off(off, 5));\n" + "> > - bar_addr = ioread32(mmio + bar0_off(off, 5));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR5 %#010llx\\n\", bar_addr);\n" + "> > }\n" + "> >\n" + "> > /* setup incoming bar limits == base addrs (zero length windows) */\n" + "> > - off = SNB_SBAR2LMT_OFFSET;\n" + "> >\n" + "> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 2));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR23LMT %#018llx\\n\", bar_addr);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > bar_addr = addr->bar4_addr64 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 4));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR45LMT %#018llx\\n\", bar_addr);\n" + "> > } else {\n" + "> > bar_addr = addr->bar4_addr32 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 4));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR4LMT %#010llx\\n\", bar_addr);\n" + "> >\n" + "> > bar_addr = addr->bar5_addr32 +\n" + "> > (b2b_bar == 5 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 5));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR5LMT %#05llx\\n\", bar_addr);\n" + "> > }\n" + "> >\n" + "> > /* zero incoming translation addrs */\n" + "> > - off = SNB_SBAR2XLAT_OFFSET;\n" + "> > -\n" + "> > - iowrite64(0, mmio + bar2_off(off, 2));\n" + "> > + iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > - iowrite64(0, mmio + bar2_off(off, 4));\n" + "> > + iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);\n" + "> > } else {\n" + "> > - iowrite32(0, mmio + bar2_off(off, 4));\n" + "> > - iowrite32(0, mmio + bar2_off(off, 5));\n" + "> > + iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);\n" + "> > + iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);\n" + "> > }\n" + "> >\n" + "> > /* zero outgoing translation limits (whole bar size windows) */\n" + "> > - off = SNB_PBAR2LMT_OFFSET;\n" + "> > - iowrite64(0, mmio + bar2_off(off, 2));\n" + "> > + iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);\n" + "> > if (!ndev->bar4_split) {\n" + "> > - iowrite64(0, mmio + bar2_off(off, 4));\n" + "> > + iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);\n" + "> > } else {\n" + "> > - iowrite32(0, mmio + bar2_off(off, 4));\n" + "> > - iowrite32(0, mmio + bar2_off(off, 5));\n" + "> > + iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);\n" + "> > + iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);\n" + "> > }\n" + "> >\n" + "> > /* set outgoing translation offsets */\n" + "> > - off = SNB_PBAR2XLAT_OFFSET;\n" + "> > -\n" + "> > bar_addr = peer_addr->bar2_addr64;\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 2));\n" + "> > + iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR23XLAT %#018llx\\n\", bar_addr);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > bar_addr = peer_addr->bar4_addr64;\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 4));\n" + "> > + iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR45XLAT %#018llx\\n\", bar_addr);\n" + "> > } else {\n" + "> > bar_addr = peer_addr->bar2_addr64;\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 4));\n" + "> > + iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR4XLAT %#010llx\\n\", bar_addr);\n" + "> >\n" + "> > bar_addr = peer_addr->bar2_addr64;\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 5));\n" + "> > + iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR5XLAT %#010llx\\n\", bar_addr);\n" + "> > }\n" + "> >\n" + "> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)\n" + "> > u8 ppd;\n" + "> > int rc, mem;\n" + "> >\n" + "> > + pdev = ndev_pdev(ndev);\n" + "> > +\n" + "> > + switch (pdev->device) {\n" + "> > /* There is a Xeon hardware errata related to writes to SDOORBELL or\n" + "> > * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,\n" + "> > * which may hang the system. To workaround this use the second memory\n" + "> > * window to access the interrupt and scratch pad registers on the\n" + "> > * remote system.\n" + "> > */\n" + "> > - ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n" + "> > + ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n" + "> > + break;\n" + "> > + }\n" + "> >\n" + "> > + switch (pdev->device) {\n" + "> > /* There is a hardware errata related to accessing any register in\n" + "> > * SB01BASE in the presence of bidirectional traffic crossing the NTB.\n" + "> > */\n" + "> > - ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n" + "> > + ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n" + "> > + break;\n" + "> > + }\n" + "> >\n" + "> > + switch (pdev->device) {\n" + "> > /* HW Errata on bit 14 of b2bdoorbell register. Writes will not be\n" + "> > * mirrored to the remote system. Shrink the number of bits by one,\n" + "> > * since bit 14 is the last bit.\n" + "> > */\n" + "> > - ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n" + "> > + ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n" + "> > + break;\n" + "> > + }\n" + "> >\n" + "> > ndev->reg = &snb_reg;\n" + "> >\n" + "> > - pdev = ndev_pdev(ndev);\n" + "> > -\n" + "> > rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);\n" + "> > if (rc)\n" + "> > return -EIO;\n" + "> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {\n" + "> > * window by setting the limit equal to base, nor can it limit the size\n" + "> > * of the memory window by setting the limit to base + size.\n" + "> > */\n" + "> > - .bar2_limit = SNB_PBAR2LMT_OFFSET,\n" + "> > - .bar2_xlat = SNB_PBAR2XLAT_OFFSET,\n" + "> > + .bar2_limit = SNB_PBAR23LMT_OFFSET,\n" + "> > + .bar2_xlat = SNB_PBAR23XLAT_OFFSET,\n" + "> > };\n" + "> >\n" + "> > static const struct intel_ntb_xlat_reg snb_sec_xlat = {\n" + "> > .bar0_base = SNB_SBAR0BASE_OFFSET,\n" + "> > - .bar2_limit = SNB_SBAR2LMT_OFFSET,\n" + "> > - .bar2_xlat = SNB_SBAR2XLAT_OFFSET,\n" + "> > + .bar2_limit = SNB_SBAR23LMT_OFFSET,\n" + "> > + .bar2_xlat = SNB_SBAR23XLAT_OFFSET,\n" + "> > };\n" + "> >\n" + "> > static const struct intel_b2b_addr snb_b2b_usd_addr = {\n" + "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h\n" + "> > index 0224b1a..fec689d 100644\n" + "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h\n" + "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h\n" + "> > @@ -70,11 +70,27 @@\n" + "> >\n" + "> > /* SNB hardware (and JSF, IVT, HSX) */\n" + "> >\n" + "> > -#define SNB_PBAR2LMT_OFFSET 0x0000\n" + "> > -#define SNB_PBAR2XLAT_OFFSET 0x0010\n" + "> > -#define SNB_SBAR2LMT_OFFSET 0x0020\n" + "> > -#define SNB_SBAR2XLAT_OFFSET 0x0030\n" + "> > +#define SNB_PBAR23LMT_OFFSET 0x0000\n" + "> > +#define SNB_PBAR45LMT_OFFSET 0x0008\n" + "> > +#define SNB_PBAR4LMT_OFFSET 0x0008\n" + "> > +#define SNB_PBAR5LMT_OFFSET 0x000c\n" + "> > +#define SNB_PBAR23XLAT_OFFSET 0x0010\n" + "> > +#define SNB_PBAR45XLAT_OFFSET 0x0018\n" + "> > +#define SNB_PBAR4XLAT_OFFSET 0x0018\n" + "> > +#define SNB_PBAR5XLAT_OFFSET 0x001c\n" + "> > +#define SNB_SBAR23LMT_OFFSET 0x0020\n" + "> > +#define SNB_SBAR45LMT_OFFSET 0x0028\n" + "> > +#define SNB_SBAR4LMT_OFFSET 0x0028\n" + "> > +#define SNB_SBAR5LMT_OFFSET 0x002c\n" + "> > +#define SNB_SBAR23XLAT_OFFSET 0x0030\n" + "> > +#define SNB_SBAR45XLAT_OFFSET 0x0038\n" + "> > +#define SNB_SBAR4XLAT_OFFSET 0x0038\n" + "> > +#define SNB_SBAR5XLAT_OFFSET 0x003c\n" + "> > #define SNB_SBAR0BASE_OFFSET 0x0040\n" + "> > +#define SNB_SBAR23BASE_OFFSET 0x0048\n" + "> > +#define SNB_SBAR45BASE_OFFSET 0x0050\n" + "> > +#define SNB_SBAR4BASE_OFFSET 0x0050\n" + "> > +#define SNB_SBAR5BASE_OFFSET 0x0054\n" + "> > #define SNB_SBDF_OFFSET 0x005c\n" + "> > #define SNB_NTBCNTL_OFFSET 0x0058\n" + "> > #define SNB_PDOORBELL_OFFSET 0x0060\n" + "> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c\n" + "> > index f1ed1b7..bb2eb85 100644\n" + "> > --- a/drivers/ntb/ntb_transport.c\n" + "> > +++ b/drivers/ntb/ntb_transport.c\n" + "> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {\n" + "> >\n" + "> > bool link_is_up;\n" + "> > struct delayed_work link_work;\n" + "> > - struct work_struct db_work;\n" + "> > struct work_struct link_cleanup;\n" + "> > + struct tasklet_struct db_work;\n" + "> > };\n" + "> >\n" + "> > enum {\n" + "> > @@ -241,7 +241,7 @@ enum {\n" + "> > #define NTB_QP_DEF_NUM_ENTRIES 100\n" + "> > #define NTB_LINK_DOWN_TIMEOUT 10\n" + "> >\n" + "> > -static void ntb_transport_doorbell_work(struct work_struct *ws);\n" + "> > +static void ntb_transport_doorbell_work(unsigned long data);\n" + "> > static const struct ntb_ctx_ops ntb_transport_ops;\n" + "> > static struct ntb_client ntb_transport_client;\n" + "> >\n" + "> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)\n" + "> > }\n" + "> >\n" + "> > INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);\n" + "> > - INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);\n" + "> > INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);\n" + "> > + tasklet_init(&nt->db_work, ntb_transport_doorbell_work,\n" + "> > + (unsigned long)nt);\n" + "> >\n" + "> > rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);\n" + "> > if (rc)\n" + "> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)\n" + "> > int i;\n" + "> >\n" + "> > ntb_transport_link_cleanup(nt);\n" + "> > - cancel_work_sync(&nt->db_work);\n" + "> > + tasklet_disable(&nt->db_work);\n" + "> > cancel_work_sync(&nt->link_cleanup);\n" + "> > cancel_delayed_work_sync(&nt->link_work);\n" + "> >\n" + "> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)\n" + "> > }\n" + "> > EXPORT_SYMBOL_GPL(ntb_transport_max_size);\n" + "> >\n" + "> > -static void ntb_transport_doorbell_work(struct work_struct *work)\n" + "> > +static void ntb_transport_doorbell_work(unsigned long data)\n" + "> > {\n" + "> > - struct ntb_transport_ctx *nt = container_of(work,\n" + "> > - struct ntb_transport_ctx, db_work);\n" + "> > + struct ntb_transport_ctx *nt = (void *)data;\n" + "> > struct ntb_transport_qp *qp;\n" + "> > u64 db_mask, db_bits, db_again;\n" + "> > unsigned int qp_num;\n" + "> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)\n" + "> >\n" + "> > ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));\n" + "> >\n" + "> > - schedule_work(&nt->db_work);\n" + "> > + tasklet_schedule(&nt->db_work);\n" + "> > }\n" + "> >\n" + "> > static const struct ntb_ctx_ops ntb_transport_ops = {\n" + "> > --\n" + "> > 2.4.0.rc0.43.gcf8a8c6\n" + "> >\n" + "> > --\n" + "> > To unsubscribe from this list: send the line \"unsubscribe linux-pci\" in\n" + "> > the body of a message to majordomo@vger.kernel.org\n" + > > More majordomo info at http://vger.kernel.org/majordomo-info.html -2e582ad3e389f67386b7c982514fa3ccb20f0b7cbee3b1a559d58cced5bfbb25 +428118fc61f8d3266913a91d889cfc99ccab368f9f8d657847f6d26ed7d10ca0
diff --git a/a/1.txt b/N2/1.txt index ff5d956..3452aac 100644 --- a/a/1.txt +++ b/N2/1.txt @@ -1,478 +1,547 @@ -T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K -PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1 -YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50 -ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp -bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg -Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz -dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z -KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo -ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv -c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1 -Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K -SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu -IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf -aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg -ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp -dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg -Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp -ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv -bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx -MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+ -ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3 -ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq -ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+ -ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0 -OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN -Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg -IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp -YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl -ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl -dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1 -Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r -IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ -ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv -ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0 -XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh -dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1 -ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K -PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh -ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg -Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg -ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf -bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K -PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g -KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct -PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z -aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt -XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf -cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p -byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg -bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi -dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi -RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m -ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg -ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg -ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg -ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp -b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K -PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K -PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu -djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh -cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K -PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y -ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv -ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1 -IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v -ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp -b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr -IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv -ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg -ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K -PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp -Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg -IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp -bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np -emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw -MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg -c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg -KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg -KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg -ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg -Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg -cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g -KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m -ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc -biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf -b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg -ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg -ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g -ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z -aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg -IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg -ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+ -ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN -Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf -UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj -bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2 -NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf -UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9 -IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0 -ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg -ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs -DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1 -IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg -ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS -OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT -TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52 -NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1 -LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg -ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g -b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw -MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg -ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg -ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg -ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT -RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo -YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ -ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P -RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo -bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2 -NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg -ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs -bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz -NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls -cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu -dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg -ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg -dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg -PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg -ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1 -XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi -dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg -ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm -ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g -PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl -diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW -U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g -c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN -Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K -PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w -ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u -ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg -ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg -LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L -U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg -PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh -ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg -ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g -KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf -T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w -cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K -PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+ -IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl -diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp -Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg -ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg -ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g -b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS -UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs -NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi -X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+ -ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n -IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg -IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg -LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50 -ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu -ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g -LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg -ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC -QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg -KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh -cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf -YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ -ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi -YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m -ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T -QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y -bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg -ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl -ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50 -IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg -ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi -MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo -YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy -ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0 -ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg -IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g -ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf -YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg -ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg -ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+ -IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs -IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy -MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg -bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h -ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg -ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh -cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h -ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi -MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv -d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg -ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g -PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT -RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g -KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl -dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg -ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg -ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g -LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg -NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw -X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt -bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk -ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg -ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk -ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi -YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg -ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk -ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw -KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg -MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm -LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz -TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf -U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi -U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh -bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt -PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0 -ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy -X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy -X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg -ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN -Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0 -NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp -LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug -ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g -PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6 -IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy -X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht -bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi -YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg -ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg -ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4 -XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy -LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g -NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh -cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh -cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg -ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN -Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1 -TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks -ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g -PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg -ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp -dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo -MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh -bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p -byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg -bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+ -IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K -PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp -Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf -T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB -UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g -b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K -PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp -dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo -MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+ -YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh -cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr -IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg -ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg -ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g -KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7 -DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G -RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0 -cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G -RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy -NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs -IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m -ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy -M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO -Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp -LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp -ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw -ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy -X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy -X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg -ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7 -DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS -NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl -diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs -c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy -NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf -b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t -aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh -cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg -ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g -ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs -bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl -ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf -YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf -YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg -ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K -PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY -TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks -ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K -PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj -dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg -aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+ -ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q -IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP -T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo -IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg -bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt -ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg -c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl -bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC -X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf -SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O -VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf -SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ -ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg -ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh -c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf -REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf -SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U -RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf -UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY -Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP -T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9 -DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv -KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn -aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp -cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+ -IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN -Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg -ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj -YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD -SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD -RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO -VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8 -PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN -Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN -Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0 -ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy -ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg -ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+ -ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU -MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g -PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg -ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz -ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E -RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J -RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF -TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q -U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6 -DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr -ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg -Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg -ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g -KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu -ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu -ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs -IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg -ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj -IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg -ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj -YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93 -IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+ -ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs -DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG -U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U -X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy -M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50 -ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug -ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s -aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy -Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg -LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg -ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+ -ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy -Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi -X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu -ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50 -ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf -aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh -cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U -X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG -U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg -ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg -ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw -eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4 -DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+ -ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl -ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg -U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q -QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY -TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P -RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU -ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg -ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg -IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw -MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+ -ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj -ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu -ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C -X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS -NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF -X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT -RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg -ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg -ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg -ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu -YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi -ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr -IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz -dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf -dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg -ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf -c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk -Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg -QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg -I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg -bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+ -ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk -YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0 -X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50 -Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y -dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ -ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu -a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso -Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg -SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93 -b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv -cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u -ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf -dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0 -NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq -c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+ -ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu -Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl -KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j -bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf -d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf -dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K -PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+ -IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry -dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso -dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z -cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg -ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0 -cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz -dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf -Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA -IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh -bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z -ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+ -IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl -dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0 -IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu -NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t -IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+ -IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g -TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t -aW5mby5odG1sDQo= +On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote: +> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote: +> > From: Dave Jiang <dave.jiang@intel.com> +> > +> > Signed-off-by: Dave Jiang <dave.jiang@intel.com> +> +> Needs a topic in the subject line and a changelog. +> +> It also seems to do a lot more than just checking device ID (I assume +> that's what "DID" means), so this should probably be split into +> several patches that each do one thing. I see at least: +> +> - cosmetic code restructuring +> - work_struct/tasklet_struct changes +> - new #defines and bar2_off() changes + +I think this patch got mangled with couple other patches. Allen? + +> +> > --- +> > drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++----------------- +> > drivers/ntb/hw/intel/ntb_hw_intel.h | 24 ++++- +> > drivers/ntb/ntb_transport.c | 16 +-- +> > 3 files changed, 133 insertions(+), 103 deletions(-) +> > +> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c +> > index d162f22..89fea50 100644 +> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c +> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c +> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > size_t buf_size; +> > ssize_t ret, off; +> > union { u64 v64; u32 v32; u16 v16; } u; +> > - unsigned long reg; +> > +> > ndev = filp->private_data; +> > mmio = ndev->self_mmio; +> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > +> > if (!ndev->reg->link_is_up(ndev)) { +> > off += scnprintf(buf + off, buf_size - off, +> > - "Link Satus -\t\tDown\n"); +> > + "Link Status -\t\tDown\n"); +> > } else { +> > off += scnprintf(buf + off, buf_size - off, +> > - "Link Satus -\t\tUp\n"); +> > + "Link Status -\t\tUp\n"); +> > off += scnprintf(buf + off, buf_size - off, +> > "Link Speed -\t\tPCI-E Gen %u\n", +> > NTB_LNK_STA_SPEED(ndev->lnk_sta)); +> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > off += scnprintf(buf + off, buf_size - off, +> > "Doorbell Mask Cached -\t%#llx\n", ndev->db_mask); +> > +> > - reg = ndev->self_reg->db_mask; +> > - u.v64 = ndev_db_read(ndev, mmio + reg); +> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask); +> > off += scnprintf(buf + off, buf_size - off, +> > "Doorbell Mask -\t\t%#llx\n", u.v64); +> > +> > - reg = ndev->self_reg->db_bell; +> > - u.v64 = ndev_db_read(ndev, mmio + reg); +> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell); +> > off += scnprintf(buf + off, buf_size - off, +> > "Doorbell Bell -\t\t%#llx\n", u.v64); +> > +> > off += scnprintf(buf + off, buf_size - off, +> > "\nNTB Incoming XLAT:\n"); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2)); +> > off += scnprintf(buf + off, buf_size - off, +> > "XLAT23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4)); +> > off += scnprintf(buf + off, buf_size - off, +> > "XLAT45 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2)); +> > off += scnprintf(buf + off, buf_size - off, +> > "LMT23 -\t\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4)); +> > off += scnprintf(buf + off, buf_size - off, +> > "LMT45 -\t\t\t%#018llx\n", u.v64); +> > +> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > off += scnprintf(buf + off, buf_size - off, +> > "\nNTB Outgoing B2B XLAT:\n"); +> > +> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B XLAT23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B XLAT45 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B LMT23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "B2B LMT45 -\t\t%#018llx\n", u.v64); +> > +> > off += scnprintf(buf + off, buf_size - off, +> > "\nNTB Secondary BAR:\n"); +> > +> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "SBAR01 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "SBAR23 -\t\t%#018llx\n", u.v64); +> > +> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4); +> > - u.v64 = ioread64(mmio + reg); +> > + u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "SBAR45 -\t\t%#018llx\n", u.v64); +> > } +> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf, +> > off += scnprintf(buf + off, buf_size - off, +> > "\nSNB NTB Statistics:\n"); +> > +> > - reg = SNB_USMEMMISS_OFFSET; +> > - u.v16 = ioread16(mmio + reg); +> > + u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET); +> > off += scnprintf(buf + off, buf_size - off, +> > "Upstream Memory Miss -\t%u\n", u.v16); +> > +> > off += scnprintf(buf + off, buf_size - off, +> > "\nSNB NTB Hardware Errors:\n"); +> > +> > - reg = SNB_DEVSTS_OFFSET; +> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16)) +> > + if (!pci_read_config_word(ndev->ntb.pdev, +> > + SNB_DEVSTS_OFFSET, &u.v16)) +> > off += scnprintf(buf + off, buf_size - off, +> > "DEVSTS -\t\t%#06x\n", u.v16); +> > +> > - reg = SNB_LINK_STATUS_OFFSET; +> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16)) +> > + if (!pci_read_config_word(ndev->ntb.pdev, +> > + SNB_LINK_STATUS_OFFSET, &u.v16)) +> > off += scnprintf(buf + off, buf_size - off, +> > "LNKSTS -\t\t%#06x\n", u.v16); +> > +> > - reg = SNB_UNCERRSTS_OFFSET; +> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32)) +> > + if (!pci_read_config_dword(ndev->ntb.pdev, +> > + SNB_UNCERRSTS_OFFSET, &u.v32)) +> > off += scnprintf(buf + off, buf_size - off, +> > "UNCERRSTS -\t\t%#06x\n", u.v32); +> > +> > - reg = SNB_CORERRSTS_OFFSET; +> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32)) +> > + if (!pci_read_config_dword(ndev->ntb.pdev, +> > + SNB_CORERRSTS_OFFSET, &u.v32)) +> > off += scnprintf(buf + off, buf_size - off, +> > "CORERRSTS -\t\t%#06x\n", u.v32); +> > } +> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > { +> > struct pci_dev *pdev; +> > void __iomem *mmio; +> > - unsigned long off; +> > resource_size_t bar_size; +> > phys_addr_t bar_addr; +> > int b2b_bar; +> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > dev_dbg(ndev_dev(ndev), "SBAR5SZ %#x\n", bar_sz); +> > } +> > +> > - /* setup incoming bar base addresses */ +> > - off = SNB_SBAR0BASE_OFFSET; +> > - +> > /* SBAR01 hit by first part of the b2b bar */ +> > if (b2b_bar == 0) { +> > bar_addr = addr->bar0_addr; +> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > } +> > +> > dev_dbg(ndev_dev(ndev), "SBAR01 %#018llx\n", bar_addr); +> > - iowrite64(bar_addr, mmio + bar0_off(off, 0)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET); +> > +> > /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar. +> > * The b2b bar is either disabled above, or configured half-size, and +> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev, +> > */ +> > +> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar0_off(off, 2)); +> > - bar_addr = ioread64(mmio + bar0_off(off, 2)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR23 %#018llx\n", bar_addr); +> > +> > if (!ndev->bar4_split) { +> > bar_addr = addr->bar4_addr64 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar0_off(off, 4)); +> > - bar_addr = ioread64(mmio + bar0_off(off, 4)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR45 %#018llx\n", bar_addr); +> > } else { +> > bar_addr = addr->bar4_addr32 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar0_off(off, 4)); +> > - bar_addr = ioread32(mmio + bar0_off(off, 4)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR4 %#010llx\n", bar_addr); +> > +> > bar_addr = addr->bar5_addr32 + +> > (b2b_bar == 5 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar0_off(off, 5)); +> > - bar_addr = ioread32(mmio + bar0_off(off, 5)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR5 %#010llx\n", bar_addr); +> > } +> > +> > /* setup incoming bar limits == base addrs (zero length windows) */ +> > - off = SNB_SBAR2LMT_OFFSET; +> > +> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar2_off(off, 2)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 2)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR23LMT %#018llx\n", bar_addr); +> > +> > if (!ndev->bar4_split) { +> > bar_addr = addr->bar4_addr64 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite64(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 4)); +> > + iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR45LMT %#018llx\n", bar_addr); +> > } else { +> > bar_addr = addr->bar4_addr32 + +> > (b2b_bar == 4 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 4)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR4LMT %#010llx\n", bar_addr); +> > +> > bar_addr = addr->bar5_addr32 + +> > (b2b_bar == 5 ? ndev->b2b_off : 0); +> > - iowrite32(bar_addr, mmio + bar2_off(off, 5)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 5)); +> > + iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "SBAR5LMT %#05llx\n", bar_addr); +> > } +> > +> > /* zero incoming translation addrs */ +> > - off = SNB_SBAR2XLAT_OFFSET; +> > - +> > - iowrite64(0, mmio + bar2_off(off, 2)); +> > + iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET); +> > +> > if (!ndev->bar4_split) { +> > - iowrite64(0, mmio + bar2_off(off, 4)); +> > + iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET); +> > } else { +> > - iowrite32(0, mmio + bar2_off(off, 4)); +> > - iowrite32(0, mmio + bar2_off(off, 5)); +> > + iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET); +> > + iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET); +> > } +> > +> > /* zero outgoing translation limits (whole bar size windows) */ +> > - off = SNB_PBAR2LMT_OFFSET; +> > - iowrite64(0, mmio + bar2_off(off, 2)); +> > + iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET); +> > if (!ndev->bar4_split) { +> > - iowrite64(0, mmio + bar2_off(off, 4)); +> > + iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET); +> > } else { +> > - iowrite32(0, mmio + bar2_off(off, 4)); +> > - iowrite32(0, mmio + bar2_off(off, 5)); +> > + iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET); +> > + iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET); +> > } +> > +> > /* set outgoing translation offsets */ +> > - off = SNB_PBAR2XLAT_OFFSET; +> > - +> > bar_addr = peer_addr->bar2_addr64; +> > - iowrite64(bar_addr, mmio + bar2_off(off, 2)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 2)); +> > + iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR23XLAT %#018llx\n", bar_addr); +> > +> > if (!ndev->bar4_split) { +> > bar_addr = peer_addr->bar4_addr64; +> > - iowrite64(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread64(mmio + bar2_off(off, 4)); +> > + iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET); +> > + bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR45XLAT %#018llx\n", bar_addr); +> > } else { +> > bar_addr = peer_addr->bar2_addr64; +> > - iowrite32(bar_addr, mmio + bar2_off(off, 4)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 4)); +> > + iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR4XLAT %#010llx\n", bar_addr); +> > +> > bar_addr = peer_addr->bar2_addr64; +> > - iowrite32(bar_addr, mmio + bar2_off(off, 5)); +> > - bar_addr = ioread32(mmio + bar2_off(off, 5)); +> > + iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET); +> > + bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET); +> > dev_dbg(ndev_dev(ndev), "PBAR5XLAT %#010llx\n", bar_addr); +> > } +> > +> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev) +> > u8 ppd; +> > int rc, mem; +> > +> > + pdev = ndev_pdev(ndev); +> > + +> > + switch (pdev->device) { +> > /* There is a Xeon hardware errata related to writes to SDOORBELL or +> > * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space, +> > * which may hang the system. To workaround this use the second memory +> > * window to access the interrupt and scratch pad registers on the +> > * remote system. +> > */ +> > - ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP; +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: +> > + ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP; +> > + break; +> > + } +> > +> > + switch (pdev->device) { +> > /* There is a hardware errata related to accessing any register in +> > * SB01BASE in the presence of bidirectional traffic crossing the NTB. +> > */ +> > - ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP; +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: +> > + ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP; +> > + break; +> > + } +> > +> > + switch (pdev->device) { +> > /* HW Errata on bit 14 of b2bdoorbell register. Writes will not be +> > * mirrored to the remote system. Shrink the number of bits by one, +> > * since bit 14 is the last bit. +> > */ +> > - ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14; +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT: +> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX: +> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX: +> > + ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14; +> > + break; +> > + } +> > +> > ndev->reg = &snb_reg; +> > +> > - pdev = ndev_pdev(ndev); +> > - +> > rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd); +> > if (rc) +> > return -EIO; +> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = { +> > * window by setting the limit equal to base, nor can it limit the size +> > * of the memory window by setting the limit to base + size. +> > */ +> > - .bar2_limit = SNB_PBAR2LMT_OFFSET, +> > - .bar2_xlat = SNB_PBAR2XLAT_OFFSET, +> > + .bar2_limit = SNB_PBAR23LMT_OFFSET, +> > + .bar2_xlat = SNB_PBAR23XLAT_OFFSET, +> > }; +> > +> > static const struct intel_ntb_xlat_reg snb_sec_xlat = { +> > .bar0_base = SNB_SBAR0BASE_OFFSET, +> > - .bar2_limit = SNB_SBAR2LMT_OFFSET, +> > - .bar2_xlat = SNB_SBAR2XLAT_OFFSET, +> > + .bar2_limit = SNB_SBAR23LMT_OFFSET, +> > + .bar2_xlat = SNB_SBAR23XLAT_OFFSET, +> > }; +> > +> > static const struct intel_b2b_addr snb_b2b_usd_addr = { +> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h +> > index 0224b1a..fec689d 100644 +> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h +> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h +> > @@ -70,11 +70,27 @@ +> > +> > /* SNB hardware (and JSF, IVT, HSX) */ +> > +> > -#define SNB_PBAR2LMT_OFFSET 0x0000 +> > -#define SNB_PBAR2XLAT_OFFSET 0x0010 +> > -#define SNB_SBAR2LMT_OFFSET 0x0020 +> > -#define SNB_SBAR2XLAT_OFFSET 0x0030 +> > +#define SNB_PBAR23LMT_OFFSET 0x0000 +> > +#define SNB_PBAR45LMT_OFFSET 0x0008 +> > +#define SNB_PBAR4LMT_OFFSET 0x0008 +> > +#define SNB_PBAR5LMT_OFFSET 0x000c +> > +#define SNB_PBAR23XLAT_OFFSET 0x0010 +> > +#define SNB_PBAR45XLAT_OFFSET 0x0018 +> > +#define SNB_PBAR4XLAT_OFFSET 0x0018 +> > +#define SNB_PBAR5XLAT_OFFSET 0x001c +> > +#define SNB_SBAR23LMT_OFFSET 0x0020 +> > +#define SNB_SBAR45LMT_OFFSET 0x0028 +> > +#define SNB_SBAR4LMT_OFFSET 0x0028 +> > +#define SNB_SBAR5LMT_OFFSET 0x002c +> > +#define SNB_SBAR23XLAT_OFFSET 0x0030 +> > +#define SNB_SBAR45XLAT_OFFSET 0x0038 +> > +#define SNB_SBAR4XLAT_OFFSET 0x0038 +> > +#define SNB_SBAR5XLAT_OFFSET 0x003c +> > #define SNB_SBAR0BASE_OFFSET 0x0040 +> > +#define SNB_SBAR23BASE_OFFSET 0x0048 +> > +#define SNB_SBAR45BASE_OFFSET 0x0050 +> > +#define SNB_SBAR4BASE_OFFSET 0x0050 +> > +#define SNB_SBAR5BASE_OFFSET 0x0054 +> > #define SNB_SBDF_OFFSET 0x005c +> > #define SNB_NTBCNTL_OFFSET 0x0058 +> > #define SNB_PDOORBELL_OFFSET 0x0060 +> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c +> > index f1ed1b7..bb2eb85 100644 +> > --- a/drivers/ntb/ntb_transport.c +> > +++ b/drivers/ntb/ntb_transport.c +> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx { +> > +> > bool link_is_up; +> > struct delayed_work link_work; +> > - struct work_struct db_work; +> > struct work_struct link_cleanup; +> > + struct tasklet_struct db_work; +> > }; +> > +> > enum { +> > @@ -241,7 +241,7 @@ enum { +> > #define NTB_QP_DEF_NUM_ENTRIES 100 +> > #define NTB_LINK_DOWN_TIMEOUT 10 +> > +> > -static void ntb_transport_doorbell_work(struct work_struct *ws); +> > +static void ntb_transport_doorbell_work(unsigned long data); +> > static const struct ntb_ctx_ops ntb_transport_ops; +> > static struct ntb_client ntb_transport_client; +> > +> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev) +> > } +> > +> > INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work); +> > - INIT_WORK(&nt->db_work, ntb_transport_doorbell_work); +> > INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work); +> > + tasklet_init(&nt->db_work, ntb_transport_doorbell_work, +> > + (unsigned long)nt); +> > +> > rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops); +> > if (rc) +> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev) +> > int i; +> > +> > ntb_transport_link_cleanup(nt); +> > - cancel_work_sync(&nt->db_work); +> > + tasklet_disable(&nt->db_work); +> > cancel_work_sync(&nt->link_cleanup); +> > cancel_delayed_work_sync(&nt->link_work); +> > +> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp) +> > } +> > EXPORT_SYMBOL_GPL(ntb_transport_max_size); +> > +> > -static void ntb_transport_doorbell_work(struct work_struct *work) +> > +static void ntb_transport_doorbell_work(unsigned long data) +> > { +> > - struct ntb_transport_ctx *nt = container_of(work, +> > - struct ntb_transport_ctx, db_work); +> > + struct ntb_transport_ctx *nt = (void *)data; +> > struct ntb_transport_qp *qp; +> > u64 db_mask, db_bits, db_again; +> > unsigned int qp_num; +> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector) +> > +> > ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev)); +> > +> > - schedule_work(&nt->db_work); +> > + tasklet_schedule(&nt->db_work); +> > } +> > +> > static const struct ntb_ctx_ops ntb_transport_ops = { +> > -- +> > 2.4.0.rc0.43.gcf8a8c6 +> > +> > -- +> > To unsubscribe from this list: send the line "unsubscribe linux-pci" in +> > the body of a message to majordomo@vger.kernel.org +> > More majordomo info at http://vger.kernel.org/majordomo-info.html +ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥ diff --git a/a/content_digest b/N2/content_digest index a1b7771..99a128b 100644 --- a/a/content_digest +++ b/N2/content_digest @@ -12,483 +12,552 @@ " linux-ntb@googlegroups.com <linux-ntb@googlegroups.com>\0" "\00:1\0" "b\0" - "T24gV2VkLCAyMDE1LTA1LTIwIGF0IDE2OjExIC0wNTAwLCBCam9ybiBIZWxnYWFzIHdyb3RlOg0K\n" - "PiBPbiBXZWQsIE1heSAyMCwgMjAxNSBhdCAxMDo0MSBBTSwgQWxsZW4gSHViYmUgPEFsbGVuLkh1\n" - "YmJlQGVtYy5jb20+IHdyb3RlOg0KPiA+IEZyb206IERhdmUgSmlhbmcgPGRhdmUuamlhbmdAaW50\n" - "ZWwuY29tPg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogRGF2ZSBKaWFuZyA8ZGF2ZS5qaWFuZ0Bp\n" - "bnRlbC5jb20+DQo+IA0KPiBOZWVkcyBhIHRvcGljIGluIHRoZSBzdWJqZWN0IGxpbmUgYW5kIGEg\n" - "Y2hhbmdlbG9nLg0KPiANCj4gSXQgYWxzbyBzZWVtcyB0byBkbyBhIGxvdCBtb3JlIHRoYW4ganVz\n" - "dCBjaGVja2luZyBkZXZpY2UgSUQgKEkgYXNzdW1lDQo+IHRoYXQncyB3aGF0ICJESUQiIG1lYW5z\n" - "KSwgc28gdGhpcyBzaG91bGQgcHJvYmFibHkgYmUgc3BsaXQgaW50bw0KPiBzZXZlcmFsIHBhdGNo\n" - "ZXMgdGhhdCBlYWNoIGRvIG9uZSB0aGluZy4gIEkgc2VlIGF0IGxlYXN0Og0KPiANCj4gICAtIGNv\n" - "c21ldGljIGNvZGUgcmVzdHJ1Y3R1cmluZw0KPiAgIC0gd29ya19zdHJ1Y3QvdGFza2xldF9zdHJ1\n" - "Y3QgY2hhbmdlcw0KPiAgIC0gbmV3ICNkZWZpbmVzIGFuZCBiYXIyX29mZigpIGNoYW5nZXMNCg0K\n" - "SSB0aGluayB0aGlzIHBhdGNoIGdvdCBtYW5nbGVkIHdpdGggY291cGxlIG90aGVyIHBhdGNoZXMu\n" - "IEFsbGVuPw0KDQo+IA0KPiA+IC0tLQ0KPiA+ICBkcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n" - "aW50ZWwuYyB8IDE5NiArKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0tLS0tLS0NCj4gPiAg\n" - "ZHJpdmVycy9udGIvaHcvaW50ZWwvbnRiX2h3X2ludGVsLmggfCAgMjQgKysrKy0NCj4gPiAgZHJp\n" - "dmVycy9udGIvbnRiX3RyYW5zcG9ydC5jICAgICAgICAgfCAgMTYgKy0tDQo+ID4gIDMgZmlsZXMg\n" - "Y2hhbmdlZCwgMTMzIGluc2VydGlvbnMoKyksIDEwMyBkZWxldGlvbnMoLSkNCj4gPg0KPiA+IGRp\n" - "ZmYgLS1naXQgYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYyBiL2RyaXZlcnMv\n" - "bnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gaW5kZXggZDE2MmYyMi4uODlmZWE1MCAx\n" - "MDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuYw0KPiA+\n" - "ICsrKyBiL2RyaXZlcnMvbnRiL2h3L2ludGVsL250Yl9od19pbnRlbC5jDQo+ID4gQEAgLTUwMyw3\n" - "ICs1MDMsNiBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAq\n" - "ZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBzaXplX3QgYnVmX3NpemU7DQo+\n" - "ID4gICAgICAgICBzc2l6ZV90IHJldCwgb2ZmOw0KPiA+ICAgICAgICAgdW5pb24geyB1NjQgdjY0\n" - "OyB1MzIgdjMyOyB1MTYgdjE2OyB9IHU7DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25nIHJlZzsN\n" - "Cj4gPg0KPiA+ICAgICAgICAgbmRldiA9IGZpbHAtPnByaXZhdGVfZGF0YTsNCj4gPiAgICAgICAg\n" - "IG1taW8gPSBuZGV2LT5zZWxmX21taW87DQo+ID4gQEAgLTUzOCwxMCArNTM3LDEwIEBAIHN0YXRp\n" - "YyBzc2l6ZV90IG5kZXZfZGVidWdmc19yZWFkKHN0cnVjdCBmaWxlICpmaWxwLCBjaGFyIF9fdXNl\n" - "ciAqdWJ1ZiwNCj4gPg0KPiA+ICAgICAgICAgaWYgKCFuZGV2LT5yZWctPmxpbmtfaXNfdXAobmRl\n" - "dikpIHsNCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1\n" - "Zl9zaXplIC0gb2ZmLA0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJMaW5r\n" - "IFNhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgIkxpbmsgU3RhdHVzIC1cdFx0RG93blxuIik7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n" - "ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBv\n" - "ZmYsDQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU2F0dXMgLVx0\n" - "XHRVcFxuIik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxpbmsgU3Rh\n" - "dHVzIC1cdFx0VXBcbiIpOw0KPiA+ICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1\n" - "ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgIkxpbmsgU3BlZWQgLVx0XHRQQ0ktRSBHZW4gJXVcbiIsDQo+ID4gICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgTlRCX0xOS19TVEFfU1BFRUQobmRldi0+bG5rX3N0YSkpOw0K\n" - "PiA+IEBAIC01NjgsMzYgKzU2NywzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVh\n" - "ZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICBvZmYg\n" - "Kz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICJEb29yYmVsbCBNYXNrIENhY2hlZCAtXHQlI2xseFxuIiwgbmRldi0+ZGJf\n" - "bWFzayk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZfcmVnLT5kYl9tYXNrOw0K\n" - "PiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1pbyArIHJlZyk7DQo+ID4g\n" - "KyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsgbmRldi0+c2VsZl9yZWct\n" - "PmRiX21hc2spOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n" - "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiRG9vcmJlbGwgTWFzayAt\n" - "XHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgIHJlZyA9IG5kZXYtPnNlbGZf\n" - "cmVnLT5kYl9iZWxsOw0KPiA+IC0gICAgICAgdS52NjQgPSBuZGV2X2RiX3JlYWQobmRldiwgbW1p\n" - "byArIHJlZyk7DQo+ID4gKyAgICAgICB1LnY2NCA9IG5kZXZfZGJfcmVhZChuZGV2LCBtbWlvICsg\n" - "bmRldi0+c2VsZl9yZWctPmRiX2JlbGwpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n" - "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAi\n" - "RG9vcmJlbGwgQmVsbCAtXHRcdCUjbGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAgICAgICAgIG9m\n" - "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgIlxuTlRCIEluY29taW5nIFhMQVQ6XG4iKTsNCj4gPg0KPiA+IC0gICAg\n" - "ICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMik7DQo+ID4gLSAg\n" - "ICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgdS52NjQgPSBp\n" - "b3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfeGxhdCwgMikpOw0K\n" - "PiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0K\n" - "PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDIzIC1cdFx0JSMwMThsbHhcbiIsIHUu\n" - "djY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJh\n" - "cjJfeGxhdCwgNCk7DQo+ID4gLSAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0K\n" - "PiA+ICsgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYobmRldi0+eGxhdF9y\n" - "ZWctPmJhcjJfeGxhdCwgNCkpOw0KPiA+ICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBv\n" - "ZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAiWExBVDQ1\n" - "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgcmVnID0gYmFyMl9v\n" - "ZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDIpOw0KPiA+IC0gICAgICAgdS52NjQgPSBp\n" - "b3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyAr\n" - "IGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xpbWl0LCAyKSk7DQo+ID4gICAgICAgICBv\n" - "ZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICJMTVQyMyAtXHRcdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0K\n" - "PiA+IC0gICAgICAgcmVnID0gYmFyMl9vZmYobmRldi0+eGxhdF9yZWctPmJhcjJfbGltaXQsIDQp\n" - "Ow0KPiA+IC0gICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAg\n" - "IHUudjY0ID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG5kZXYtPnhsYXRfcmVnLT5iYXIyX2xp\n" - "bWl0LCA0KSk7DQo+ID4gICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3Np\n" - "emUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICJMTVQ0NSAtXHRcdFx0JSMw\n" - "MThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+IEBAIC02MDYsNDEgKzU5OSwzNCBAQCBzdGF0aWMg\n" - "c3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIg\n" - "KnVidWYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYg\n" - "KyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgIlxuTlRCIE91dGdvaW5nIEIyQiBYTEFUOlxuIik7DQo+ID4NCj4gPiAtICAg\n" - "ICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJfUEJBUjJYTEFUX09GRlNFVCwg\n" - "Mik7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsg\n" - "cmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8g\n" - "KyBTTkJfUEJBUjIzWExBVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9m\n" - "ZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCMkIgWExBVDIzIC1cdFx0JSMwMThsbHhc\n" - "biIsIHUudjY0KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IGJhcjJf\n" - "b2ZmKFNOQl9QQkFSMlhMQVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAg\n" - "ICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAg\n" - "ICAgIHUudjY0ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4g\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9z\n" - "aXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "IkIyQiBYTEFUNDUgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+ID4gLSAgICAgICAg\n" - "ICAgICAgICAgICAgICAgcmVnID0gYmFyMl9vZmYoU05CX1BCQVIyTE1UX09GRlNFVCwgMik7DQo+\n" - "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsN\n" - "Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n" - "UEJBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgb2ZmICs9IHNj\n" - "bnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgIkIyQiBMTVQyMyAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2\n" - "NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIyX29mZihTTkJf\n" - "UEJBUjJMTVRfT0ZGU0VULCA0KTsNCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICB1LnY2NCA9\n" - "IGlvcmVhZDY0KG1taW8gKyByZWcpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHUudjY0\n" - "ID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYs\n" - "DQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQjJCIExNVDQ1\n" - "IC1cdFx0JSMwMThsbHhcbiIsIHUudjY0KTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgIG9mZiArPSBzY25wcmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbk5UQiBTZWNvbmRhcnkgQkFS\n" - "OlxuIik7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICByZWcgPSBiYXIwX29mZihT\n" - "TkJfU0JBUjBCQVNFX09GRlNFVCwgMCk7DQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgdS52\n" - "NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1\n" - "LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjBCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n" - "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNCQVIw\n" - "MSAtXHRcdCUjMDE4bGx4XG4iLCB1LnY2NCk7DQo+ID4NCj4gPiAtICAgICAgICAgICAgICAgICAg\n" - "ICAgICByZWcgPSBiYXIwX29mZihTTkJfU0JBUjBCQVNFX09GRlNFVCwgMik7DQo+ID4gLSAgICAg\n" - "ICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2NChtbWlvICsgcmVnKTsNCj4gPiArICAg\n" - "ICAgICAgICAgICAgICAgICAgICB1LnY2NCA9IGlvcmVhZDY0KG1taW8gKyBTTkJfU0JBUjIzQkFT\n" - "RV9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmludGYo\n" - "YnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICJTQkFSMjMgLVx0XHQlIzAxOGxseFxuIiwgdS52NjQpOw0KPiA+DQo+\n" - "ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmVnID0gYmFyMF9vZmYoU05CX1NCQVIwQkFTRV9P\n" - "RkZTRVQsIDQpOw0KPiA+IC0gICAgICAgICAgICAgICAgICAgICAgIHUudjY0ID0gaW9yZWFkNjQo\n" - "bW1pbyArIHJlZyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdS52NjQgPSBpb3JlYWQ2\n" - "NChtbWlvICsgU05CX1NCQVI0NUJBU0VfT0ZGU0VUKTsNCj4gPiAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU0JBUjQ1IC1cdFx0JSMwMThs\n" - "bHhcbiIsIHUudjY0KTsNCj4gPiAgICAgICAgICAgICAgICAgfQ0KPiA+IEBAIC02NDgsMzEgKzYz\n" - "NCwzMCBAQCBzdGF0aWMgc3NpemVfdCBuZGV2X2RlYnVnZnNfcmVhZChzdHJ1Y3QgZmlsZSAqZmls\n" - "cCwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gICAgICAgICAgICAgICAgIG9mZiArPSBzY25wcmlu\n" - "dGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAiXG5TTkIgTlRCIFN0YXRpc3RpY3M6XG4iKTsNCj4gPg0KPiA+IC0gICAgICAg\n" - "ICAgICAgICByZWcgPSBTTkJfVVNNRU1NSVNTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAg\n" - "dS52MTYgPSBpb3JlYWQxNihtbWlvICsgcmVnKTsNCj4gPiArICAgICAgICAgICAgICAgdS52MTYg\n" - "PSBpb3JlYWQxNihtbWlvICsgU05CX1VTTUVNTUlTU19PRkZTRVQpOw0KPiA+ICAgICAgICAgICAg\n" - "ICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVwc3RyZWFtIE1lbW9yeSBNaXNzIC1cdCV1\n" - "XG4iLCB1LnYxNik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50Zihi\n" - "dWYgKyBvZmYsIGJ1Zl9zaXplIC0gb2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICJcblNOQiBOVEIgSGFyZHdhcmUgRXJyb3JzOlxuIik7DQo+ID4NCj4gPiAtICAgICAg\n" - "ICAgICAgICAgcmVnID0gU05CX0RFVlNUU19PRkZTRVQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlm\n" - "ICghcGNpX3JlYWRfY29uZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjE2KSkNCj4g\n" - "PiArICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfd29yZChuZGV2LT5udGIucGRl\n" - "diwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkJfREVW\n" - "U1RTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBvZmYgKz0g\n" - "c2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUgLSBvZmYsDQo+ID4gICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICAgICAiREVWU1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsN\n" - "Cj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcgPSBTTkJfTElOS19TVEFUVVNfT0ZGU0VUOw0K\n" - "PiA+IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ193b3JkKG5kZXYtPm50Yi5w\n" - "ZGV2LCByZWcsICZ1LnYxNikpDQo+ID4gKyAgICAgICAgICAgICAgIGlmICghcGNpX3JlYWRfY29u\n" - "ZmlnX3dvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgU05CX0xJTktfU1RBVFVTX09GRlNFVCwgJnUudjE2KSkNCj4gPiAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICBvZmYgKz0gc2NucHJpbnRmKGJ1ZiArIG9mZiwgYnVmX3NpemUg\n" - "LSBvZmYsDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTE5L\n" - "U1RTIC1cdFx0JSMwNnhcbiIsIHUudjE2KTsNCj4gPg0KPiA+IC0gICAgICAgICAgICAgICByZWcg\n" - "PSBTTkJfVU5DRVJSU1RTX09GRlNFVDsNCj4gPiAtICAgICAgICAgICAgICAgaWYgKCFwY2lfcmVh\n" - "ZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsIHJlZywgJnUudjMyKSkNCj4gPiArICAgICAg\n" - "ICAgICAgICAgaWYgKCFwY2lfcmVhZF9jb25maWdfZHdvcmQobmRldi0+bnRiLnBkZXYsDQo+ID4g\n" - "KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNOQl9VTkNFUlJTVFNf\n" - "T0ZGU0VULCAmdS52MzIpKQ0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIG9mZiArPSBzY25w\n" - "cmludGYoYnVmICsgb2ZmLCBidWZfc2l6ZSAtIG9mZiwNCj4gPiAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgICAgICJVTkNFUlJTVFMgLVx0XHQlIzA2eFxuIiwgdS52MzIpOw0K\n" - "PiA+DQo+ID4gLSAgICAgICAgICAgICAgIHJlZyA9IFNOQl9DT1JFUlJTVFNfT0ZGU0VUOw0KPiA+\n" - "IC0gICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZpZ19kd29yZChuZGV2LT5udGIucGRl\n" - "diwgcmVnLCAmdS52MzIpKQ0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIXBjaV9yZWFkX2NvbmZp\n" - "Z19kd29yZChuZGV2LT5udGIucGRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgU05CX0NPUkVSUlNUU19PRkZTRVQsICZ1LnYzMikpDQo+ID4gICAgICAg\n" - "ICAgICAgICAgICAgICAgICAgb2ZmICs9IHNjbnByaW50ZihidWYgKyBvZmYsIGJ1Zl9zaXplIC0g\n" - "b2ZmLA0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPUkVS\n" - "UlNUUyAtXHRcdCUjMDZ4XG4iLCB1LnYzMik7DQo+ID4gICAgICAgICB9DQo+ID4gQEAgLTEzODgs\n" - "NyArMTM3Myw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50ZWxfbnRi\n" - "X2RldiAqbmRldiwNCj4gPiAgew0KPiA+ICAgICAgICAgc3RydWN0IHBjaV9kZXYgKnBkZXY7DQo+\n" - "ID4gICAgICAgICB2b2lkIF9faW9tZW0gKm1taW87DQo+ID4gLSAgICAgICB1bnNpZ25lZCBsb25n\n" - "IG9mZjsNCj4gPiAgICAgICAgIHJlc291cmNlX3NpemVfdCBiYXJfc2l6ZTsNCj4gPiAgICAgICAg\n" - "IHBoeXNfYWRkcl90IGJhcl9hZGRyOw0KPiA+ICAgICAgICAgaW50IGIyYl9iYXI7DQo+ID4gQEAg\n" - "LTE0ODQsOSArMTQ2OCw2IEBAIHN0YXRpYyBpbnQgc25iX3NldHVwX2IyYl9tdyhzdHJ1Y3QgaW50\n" - "ZWxfbnRiX2RldiAqbmRldiwNCj4gPiAgICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2Rldihu\n" - "ZGV2KSwgIlNCQVI1U1ogJSN4XG4iLCBiYXJfc3opOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4g\n" - "LSAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBiYXIgYmFzZSBhZGRyZXNzZXMgKi8NCj4gPiAtICAg\n" - "ICAgIG9mZiA9IFNOQl9TQkFSMEJBU0VfT0ZGU0VUOw0KPiA+IC0NCj4gPiAgICAgICAgIC8qIFNC\n" - "QVIwMSBoaXQgYnkgZmlyc3QgcGFydCBvZiB0aGUgYjJiIGJhciAqLw0KPiA+ICAgICAgICAgaWYg\n" - "KGIyYl9iYXIgPT0gMCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJh\n" - "cjBfYWRkcjsNCj4gPiBAQCAtMTUwNCw3ICsxNDg1LDcgQEAgc3RhdGljIGludCBzbmJfc2V0dXBf\n" - "YjJiX213KHN0cnVjdCBpbnRlbF9udGJfZGV2ICpuZGV2LA0KPiA+ICAgICAgICAgfQ0KPiA+DQo+\n" - "ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjAxICUjMDE4bGx4XG4iLCBi\n" - "YXJfYWRkcik7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29m\n" - "ZihvZmYsIDApKTsNCj4gPiArICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9T\n" - "QkFSMEJBU0VfT0ZGU0VUKTsNCj4gPg0KPiA+ICAgICAgICAgLyogT3RoZXIgU0JBUiBhcmUgbm9y\n" - "bWFsbHkgaGl0IGJ5IHRoZSBQQkFSIHhsYXQsIGV4Y2VwdCBmb3IgYjJiIGJhci4NCj4gPiAgICAg\n" - "ICAgICAqIFRoZSBiMmIgYmFyIGlzIGVpdGhlciBkaXNhYmxlZCBhYm92ZSwgb3IgY29uZmlndXJl\n" - "ZCBoYWxmLXNpemUsIGFuZA0KPiA+IEBAIC0xNTEyLDEwMiArMTQ5Myw5NiBAQCBzdGF0aWMgaW50\n" - "IHNuYl9zZXR1cF9iMmJfbXcoc3RydWN0IGludGVsX250Yl9kZXYgKm5kZXYsDQo+ID4gICAgICAg\n" - "ICAgKi8NCj4gPg0KPiA+ICAgICAgICAgYmFyX2FkZHIgPSBhZGRyLT5iYXIyX2FkZHI2NCArIChi\n" - "MmJfYmFyID09IDIgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQo\n" - "YmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYsIDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRy\n" - "ID0gaW9yZWFkNjQobW1pbyArIGJhcjBfb2ZmKG9mZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0\n" - "ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVIyM0JBU0VfT0ZGU0VUKTsNCj4gPiArICAgICAg\n" - "IGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSMjNCQVNFX09GRlNFVCk7DQo+ID4g\n" - "ICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAiU0JBUjIzICUjMDE4bGx4XG4iLCBiYXJf\n" - "YWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICghbmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAg\n" - "ICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAg\n" - "ICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+\n" - "IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIwX29mZihvZmYs\n" - "IDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFy\n" - "MF9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwg\n" - "bW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9h\n" - "ZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9TQkFSNDVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAg\n" - "ICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNDUgJSMwMThsbHhcbiIsIGJh\n" - "cl9hZGRyKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gICAgICAgICAgICAgICAgIGJhcl9h\n" - "ZGRyID0gYWRkci0+YmFyNF9hZGRyMzIgKw0KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIChi\n" - "MmJfYmFyID09IDQgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4gLSAgICAgICAgICAgICAgIGlv\n" - "d3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAg\n" - "ICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIwX29mZihvZmYsIDQpKTsNCj4g\n" - "PiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1NCQVI0QkFT\n" - "RV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8g\n" - "KyBTTkJfU0JBUjRCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRl\n" - "dl9kZXYobmRldiksICJTQkFSNCAlIzAxMGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAg\n" - "ICAgICAgICAgICAgIGJhcl9hZGRyID0gYWRkci0+YmFyNV9hZGRyMzIgKw0KPiA+ICAgICAgICAg\n" - "ICAgICAgICAgICAgICAgIChiMmJfYmFyID09IDUgPyBuZGV2LT5iMmJfb2ZmIDogMCk7DQo+ID4g\n" - "LSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjBfb2ZmKG9mZiwg\n" - "NSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIw\n" - "X29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBt\n" - "bWlvICsgU05CX1NCQVI1QkFTRV9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAgICBiYXJfYWRk\n" - "ciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjVCQVNFX09GRlNFVCk7DQo+ID4gICAgICAgICAg\n" - "ICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJTQkFSNSAlIzAxMGxseFxuIiwgYmFyX2Fk\n" - "ZHIpOw0KPiA+ICAgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICAvKiBzZXR1cCBpbmNvbWluZyBi\n" - "YXIgbGltaXRzID09IGJhc2UgYWRkcnMgKHplcm8gbGVuZ3RoIHdpbmRvd3MpICovDQo+ID4gLSAg\n" - "ICAgICBvZmYgPSBTTkJfU0JBUjJMTVRfT0ZGU0VUOw0KPiA+DQo+ID4gICAgICAgICBiYXJfYWRk\n" - "ciA9IGFkZHItPmJhcjJfYWRkcjY0ICsgKGIyYl9iYXIgPT0gMiA/IG5kZXYtPmIyYl9vZmYgOiAw\n" - "KTsNCj4gPiAtICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwg\n" - "MikpOw0KPiA+IC0gICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2Zm\n" - "LCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjIz\n" - "TE1UX09GRlNFVCk7DQo+ID4gKyAgICAgICBiYXJfYWRkciA9IGlvcmVhZDY0KG1taW8gKyBTTkJf\n" - "U0JBUjIzTE1UX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYpLCAi\n" - "U0JBUjIzTE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n" - "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHIt\n" - "PmJhcjRfYWRkcjY0ICsNCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0\n" - "ID8gbmRldi0+YjJiX29mZiA6IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n" - "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n" - "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n" - "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNDVMTVRfT0ZGU0VUKTsN\n" - "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgU05CX1NCQVI0\n" - "NUxNVF9PRkZTRVQpOw0KPiA+ICAgICAgICAgICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n" - "LCAiU0JBUjQ1TE1UICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVsc2Ug\n" - "ew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IGFkZHItPmJhcjRfYWRkcjMyICsNCj4g\n" - "PiAgICAgICAgICAgICAgICAgICAgICAgICAoYjJiX2JhciA9PSA0ID8gbmRldi0+YjJiX29mZiA6\n" - "IDApOw0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBiYXIy\n" - "X29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMiht\n" - "bWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMihi\n" - "YXJfYWRkciwgbW1pbyArIFNOQl9TQkFSNExNVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n" - "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfU0JBUjRMTVRfT0ZGU0VUKTsNCj4gPiAg\n" - "ICAgICAgICAgICAgICAgZGV2X2RiZyhuZGV2X2RldihuZGV2KSwgIlNCQVI0TE1UICUjMDEwbGx4\n" - "XG4iLCBiYXJfYWRkcik7DQo+ID4NCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBhZGRy\n" - "LT5iYXI1X2FkZHIzMiArDQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKGIyYl9iYXIgPT0g\n" - "NSA/IG5kZXYtPmIyYl9vZmYgOiAwKTsNCj4gPiAtICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n" - "cl9hZGRyLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4gLSAgICAgICAgICAgICAgIGJh\n" - "cl9hZGRyID0gaW9yZWFkMzIobW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+ICsgICAgICAg\n" - "ICAgICAgICBpb3dyaXRlMzIoYmFyX2FkZHIsIG1taW8gKyBTTkJfU0JBUjVMTVRfT0ZGU0VUKTsN\n" - "Cj4gPiArICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBpb3JlYWQzMihtbWlvICsgU05CX1NCQVI1\n" - "TE1UX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n" - "ICJTQkFSNUxNVCAlIzA1bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9DQo+ID4NCj4g\n" - "PiAgICAgICAgIC8qIHplcm8gaW5jb21pbmcgdHJhbnNsYXRpb24gYWRkcnMgKi8NCj4gPiAtICAg\n" - "ICAgIG9mZiA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VUOw0KPiA+IC0NCj4gPiAtICAgICAgIGlvd3Jp\n" - "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n" - "MCwgbW1pbyArIFNOQl9TQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4NCj4gPiAgICAgICAgIGlmICgh\n" - "bmRldi0+YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1p\n" - "byArIGJhcjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwg\n" - "bW1pbyArIFNOQl9TQkFSNDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9IGVsc2Ugew0KPiA+\n" - "IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNCkpOw0K\n" - "PiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkp\n" - "Ow0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlMzIoMCwgbW1pbyArIFNOQl9TQkFSNFhMQVRf\n" - "T0ZGU0VUKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKDAsIG1taW8gKyBTTkJfU0JB\n" - "UjVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHplcm8g\n" - "b3V0Z29pbmcgdHJhbnNsYXRpb24gbGltaXRzICh3aG9sZSBiYXIgc2l6ZSB3aW5kb3dzKSAqLw0K\n" - "PiA+IC0gICAgICAgb2ZmID0gU05CX1BCQVIyTE1UX09GRlNFVDsNCj4gPiAtICAgICAgIGlvd3Jp\n" - "dGU2NCgwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCAyKSk7DQo+ID4gKyAgICAgICBpb3dyaXRlNjQo\n" - "MCwgbW1pbyArIFNOQl9QQkFSMjNMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIGlmICghbmRldi0+\n" - "YmFyNF9zcGxpdCkgew0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyArIGJh\n" - "cjJfb2ZmKG9mZiwgNCkpOw0KPiA+ICsgICAgICAgICAgICAgICBpb3dyaXRlNjQoMCwgbW1pbyAr\n" - "IFNOQl9QQkFSNDVMTVRfT0ZGU0VUKTsNCj4gPiAgICAgICAgIH0gZWxzZSB7DQo+ID4gLSAgICAg\n" - "ICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gLSAg\n" - "ICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgYmFyMl9vZmYob2ZmLCA1KSk7DQo+ID4g\n" - "KyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI0TE1UX09GRlNFVCk7\n" - "DQo+ID4gKyAgICAgICAgICAgICAgIGlvd3JpdGUzMigwLCBtbWlvICsgU05CX1BCQVI1TE1UX09G\n" - "RlNFVCk7DQo+ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIC8qIHNldCBvdXRnb2luZyB0\n" - "cmFuc2xhdGlvbiBvZmZzZXRzICovDQo+ID4gLSAgICAgICBvZmYgPSBTTkJfUEJBUjJYTEFUX09G\n" - "RlNFVDsNCj4gPiAtDQo+ID4gICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n" - "NjQ7DQo+ID4gLSAgICAgICBpb3dyaXRlNjQoYmFyX2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYs\n" - "IDIpKTsNCj4gPiAtICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIGJhcjJfb2ZmKG9m\n" - "ZiwgMikpOw0KPiA+ICsgICAgICAgaW93cml0ZTY0KGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVIy\n" - "M1hMQVRfT0ZGU0VUKTsNCj4gPiArICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNO\n" - "Ql9QQkFSMjNYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICBkZXZfZGJnKG5kZXZfZGV2KG5kZXYp\n" - "LCAiUEJBUjIzWExBVCAlIzAxOGxseFxuIiwgYmFyX2FkZHIpOw0KPiA+DQo+ID4gICAgICAgICBp\n" - "ZiAoIW5kZXYtPmJhcjRfc3BsaXQpIHsNCj4gPiAgICAgICAgICAgICAgICAgYmFyX2FkZHIgPSBw\n" - "ZWVyX2FkZHItPmJhcjRfYWRkcjY0Ow0KPiA+IC0gICAgICAgICAgICAgICBpb3dyaXRlNjQoYmFy\n" - "X2FkZHIsIG1taW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiAtICAgICAgICAgICAgICAgYmFy\n" - "X2FkZHIgPSBpb3JlYWQ2NChtbWlvICsgYmFyMl9vZmYob2ZmLCA0KSk7DQo+ID4gKyAgICAgICAg\n" - "ICAgICAgIGlvd3JpdGU2NChiYXJfYWRkciwgbW1pbyArIFNOQl9QQkFSNDVYTEFUX09GRlNFVCk7\n" - "DQo+ID4gKyAgICAgICAgICAgICAgIGJhcl9hZGRyID0gaW9yZWFkNjQobW1pbyArIFNOQl9QQkFS\n" - "NDVYTEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRl\n" - "diksICJQQkFSNDVYTEFUICUjMDE4bGx4XG4iLCBiYXJfYWRkcik7DQo+ID4gICAgICAgICB9IGVs\n" - "c2Ugew0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBlZXJfYWRkci0+YmFyMl9hZGRy\n" - "NjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJfYWRkciwgbW1pbyArIGJhcjJf\n" - "b2ZmKG9mZiwgNCkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1t\n" - "aW8gKyBiYXIyX29mZihvZmYsIDQpKTsNCj4gPiArICAgICAgICAgICAgICAgaW93cml0ZTMyKGJh\n" - "cl9hZGRyLCBtbWlvICsgU05CX1BCQVI0WExBVF9PRkZTRVQpOw0KPiA+ICsgICAgICAgICAgICAg\n" - "ICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjRYTEFUX09GRlNFVCk7DQo+ID4g\n" - "ICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiksICJQQkFSNFhMQVQgJSMwMTBs\n" - "bHhcbiIsIGJhcl9hZGRyKTsNCj4gPg0KPiA+ICAgICAgICAgICAgICAgICBiYXJfYWRkciA9IHBl\n" - "ZXJfYWRkci0+YmFyMl9hZGRyNjQ7DQo+ID4gLSAgICAgICAgICAgICAgIGlvd3JpdGUzMihiYXJf\n" - "YWRkciwgbW1pbyArIGJhcjJfb2ZmKG9mZiwgNSkpOw0KPiA+IC0gICAgICAgICAgICAgICBiYXJf\n" - "YWRkciA9IGlvcmVhZDMyKG1taW8gKyBiYXIyX29mZihvZmYsIDUpKTsNCj4gPiArICAgICAgICAg\n" - "ICAgICAgaW93cml0ZTMyKGJhcl9hZGRyLCBtbWlvICsgU05CX1BCQVI1WExBVF9PRkZTRVQpOw0K\n" - "PiA+ICsgICAgICAgICAgICAgICBiYXJfYWRkciA9IGlvcmVhZDMyKG1taW8gKyBTTkJfUEJBUjVY\n" - "TEFUX09GRlNFVCk7DQo+ID4gICAgICAgICAgICAgICAgIGRldl9kYmcobmRldl9kZXYobmRldiks\n" - "ICJQQkFSNVhMQVQgJSMwMTBsbHhcbiIsIGJhcl9hZGRyKTsNCj4gPiAgICAgICAgIH0NCj4gPg0K\n" - "PiA+IEBAIC0xNzQ3LDI5ICsxNzIyLDY4IEBAIHN0YXRpYyBpbnQgc25iX2luaXRfZGV2KHN0cnVj\n" - "dCBpbnRlbF9udGJfZGV2ICpuZGV2KQ0KPiA+ICAgICAgICAgdTggcHBkOw0KPiA+ICAgICAgICAg\n" - "aW50IHJjLCBtZW07DQo+ID4NCj4gPiArICAgICAgIHBkZXYgPSBuZGV2X3BkZXYobmRldik7DQo+\n" - "ID4gKw0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsNCj4gPiAgICAgICAgIC8q\n" - "IFRoZXJlIGlzIGEgWGVvbiBoYXJkd2FyZSBlcnJhdGEgcmVsYXRlZCB0byB3cml0ZXMgdG8gU0RP\n" - "T1JCRUxMIG9yDQo+ID4gICAgICAgICAgKiBCMkJET09SQkVMTCBpbiBjb25qdW5jdGlvbiB3aXRo\n" - "IGluYm91bmQgYWNjZXNzIHRvIE5UQiBNTUlPIFNwYWNlLA0KPiA+ICAgICAgICAgICogd2hpY2gg\n" - "bWF5IGhhbmcgdGhlIHN5c3RlbS4gIFRvIHdvcmthcm91bmQgdGhpcyB1c2UgdGhlIHNlY29uZCBt\n" - "ZW1vcnkNCj4gPiAgICAgICAgICAqIHdpbmRvdyB0byBhY2Nlc3MgdGhlIGludGVycnVwdCBhbmQg\n" - "c2NyYXRjaCBwYWQgcmVnaXN0ZXJzIG9uIHRoZQ0KPiA+ICAgICAgICAgICogcmVtb3RlIHN5c3Rl\n" - "bS4NCj4gPiAgICAgICAgICAqLw0KPiA+IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRC\n" - "X0hXRVJSX1NET09SQkVMTF9MT0NLVVA7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURf\n" - "SU5URUxfTlRCX1NTX0pTRjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9O\n" - "VEJfUFNfSlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJf\n" - "SlNGOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+\n" - "ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAg\n" - "ICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNh\n" - "c2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lf\n" - "REVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0Vf\n" - "SURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5U\n" - "RUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJf\n" - "UFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNY\n" - "Og0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfU0RP\n" - "T1JCRUxMX0xPQ0tVUDsNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICB9\n" - "DQo+ID4NCj4gPiArICAgICAgIHN3aXRjaCAocGRldi0+ZGV2aWNlKSB7DQo+ID4gICAgICAgICAv\n" - "KiBUaGVyZSBpcyBhIGhhcmR3YXJlIGVycmF0YSByZWxhdGVkIHRvIGFjY2Vzc2luZyBhbnkgcmVn\n" - "aXN0ZXIgaW4NCj4gPiAgICAgICAgICAqIFNCMDFCQVNFIGluIHRoZSBwcmVzZW5jZSBvZiBiaWRp\n" - "cmVjdGlvbmFsIHRyYWZmaWMgY3Jvc3NpbmcgdGhlIE5UQi4NCj4gPiAgICAgICAgICAqLw0KPiA+\n" - "IC0gICAgICAgbmRldi0+aHdlcnJfZmxhZ3MgfD0gTlRCX0hXRVJSX1NCMDFCQVNFX0xPQ0tVUDsN\n" - "Cj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfU1NfSVZUOg0KPiA+ICsg\n" - "ICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9QU19JVlQ6DQo+ID4gKyAgICAgICBj\n" - "YXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBD\n" - "SV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklD\n" - "RV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lO\n" - "VEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8\n" - "PSBOVEJfSFdFUlJfU0IwMUJBU0VfTE9DS1VQOw0KPiA+ICsgICAgICAgICAgICAgICBicmVhazsN\n" - "Cj4gPiArICAgICAgIH0NCj4gPg0KPiA+ICsgICAgICAgc3dpdGNoIChwZGV2LT5kZXZpY2UpIHsN\n" - "Cj4gPiAgICAgICAgIC8qIEhXIEVycmF0YSBvbiBiaXQgMTQgb2YgYjJiZG9vcmJlbGwgcmVnaXN0\n" - "ZXIuICBXcml0ZXMgd2lsbCBub3QgYmUNCj4gPiAgICAgICAgICAqIG1pcnJvcmVkIHRvIHRoZSBy\n" - "ZW1vdGUgc3lzdGVtLiAgU2hyaW5rIHRoZSBudW1iZXIgb2YgYml0cyBieSBvbmUsDQo+ID4gICAg\n" - "ICAgICAgKiBzaW5jZSBiaXQgMTQgaXMgdGhlIGxhc3QgYml0Lg0KPiA+ICAgICAgICAgICovDQo+\n" - "ID4gLSAgICAgICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklU\n" - "MTQ7DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0pTRjoNCj4g\n" - "PiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSlNGOg0KPiA+ICsgICAg\n" - "ICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSlNGOg0KPiA+ICsgICAgICAgY2Fz\n" - "ZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9TU19TTkI6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9E\n" - "RVZJQ0VfSURfSU5URUxfTlRCX1BTX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9J\n" - "RF9JTlRFTF9OVEJfQjJCX1NOQjoNCj4gPiArICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRF\n" - "TF9OVEJfU1NfSVZUOg0KPiA+ICsgICAgICAgY2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9Q\n" - "U19JVlQ6DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX0IyQl9JVlQ6\n" - "DQo+ID4gKyAgICAgICBjYXNlIFBDSV9ERVZJQ0VfSURfSU5URUxfTlRCX1NTX0hTWDoNCj4gPiAr\n" - "ICAgICAgIGNhc2UgUENJX0RFVklDRV9JRF9JTlRFTF9OVEJfUFNfSFNYOg0KPiA+ICsgICAgICAg\n" - "Y2FzZSBQQ0lfREVWSUNFX0lEX0lOVEVMX05UQl9CMkJfSFNYOg0KPiA+ICsgICAgICAgICAgICAg\n" - "ICBuZGV2LT5od2Vycl9mbGFncyB8PSBOVEJfSFdFUlJfQjJCRE9PUkJFTExfQklUMTQ7DQo+ID4g\n" - "KyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ICsgICAgICAgfQ0KPiA+DQo+ID4gICAgICAgICBu\n" - "ZGV2LT5yZWcgPSAmc25iX3JlZzsNCj4gPg0KPiA+IC0gICAgICAgcGRldiA9IG5kZXZfcGRldihu\n" - "ZGV2KTsNCj4gPiAtDQo+ID4gICAgICAgICByYyA9IHBjaV9yZWFkX2NvbmZpZ19ieXRlKHBkZXYs\n" - "IFNOQl9QUERfT0ZGU0VULCAmcHBkKTsNCj4gPiAgICAgICAgIGlmIChyYykNCj4gPiAgICAgICAg\n" - "ICAgICAgICAgcmV0dXJuIC1FSU87DQo+ID4gQEAgLTIwNjIsMTQgKzIwNzYsMTQgQEAgc3RhdGlj\n" - "IGNvbnN0IHN0cnVjdCBpbnRlbF9udGJfeGxhdF9yZWcgc25iX3ByaV94bGF0ID0gew0KPiA+ICAg\n" - "ICAgICAgICogd2luZG93IGJ5IHNldHRpbmcgdGhlIGxpbWl0IGVxdWFsIHRvIGJhc2UsIG5vciBj\n" - "YW4gaXQgbGltaXQgdGhlIHNpemUNCj4gPiAgICAgICAgICAqIG9mIHRoZSBtZW1vcnkgd2luZG93\n" - "IGJ5IHNldHRpbmcgdGhlIGxpbWl0IHRvIGJhc2UgKyBzaXplLg0KPiA+ICAgICAgICAgICovDQo+\n" - "ID4gLSAgICAgICAuYmFyMl9saW1pdCAgICAgICAgICAgICA9IFNOQl9QQkFSMkxNVF9PRkZTRVQs\n" - "DQo+ID4gLSAgICAgICAuYmFyMl94bGF0ICAgICAgICAgICAgICA9IFNOQl9QQkFSMlhMQVRfT0ZG\n" - "U0VULA0KPiA+ICsgICAgICAgLmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfUEJBUjIzTE1U\n" - "X09GRlNFVCwNCj4gPiArICAgICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1BCQVIy\n" - "M1hMQVRfT0ZGU0VULA0KPiA+ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50\n" - "ZWxfbnRiX3hsYXRfcmVnIHNuYl9zZWNfeGxhdCA9IHsNCj4gPiAgICAgICAgIC5iYXIwX2Jhc2Ug\n" - "ICAgICAgICAgICAgID0gU05CX1NCQVIwQkFTRV9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFyMl9s\n" - "aW1pdCAgICAgICAgICAgICA9IFNOQl9TQkFSMkxNVF9PRkZTRVQsDQo+ID4gLSAgICAgICAuYmFy\n" - "Ml94bGF0ICAgICAgICAgICAgICA9IFNOQl9TQkFSMlhMQVRfT0ZGU0VULA0KPiA+ICsgICAgICAg\n" - "LmJhcjJfbGltaXQgICAgICAgICAgICAgPSBTTkJfU0JBUjIzTE1UX09GRlNFVCwNCj4gPiArICAg\n" - "ICAgIC5iYXIyX3hsYXQgICAgICAgICAgICAgID0gU05CX1NCQVIyM1hMQVRfT0ZGU0VULA0KPiA+\n" - "ICB9Ow0KPiA+DQo+ID4gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZWxfYjJiX2FkZHIgc25iX2Iy\n" - "Yl91c2RfYWRkciA9IHsNCj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9udGIvaHcvaW50ZWwvbnRi\n" - "X2h3X2ludGVsLmggYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdfaW50ZWwuaA0KPiA+IGlu\n" - "ZGV4IDAyMjRiMWEuLmZlYzY4OWQgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvaHcvaW50\n" - "ZWwvbnRiX2h3X2ludGVsLmgNCj4gPiArKysgYi9kcml2ZXJzL250Yi9ody9pbnRlbC9udGJfaHdf\n" - "aW50ZWwuaA0KPiA+IEBAIC03MCwxMSArNzAsMjcgQEANCj4gPg0KPiA+ICAvKiBTTkIgaGFyZHdh\n" - "cmUgKGFuZCBKU0YsIElWVCwgSFNYKSAqLw0KPiA+DQo+ID4gLSNkZWZpbmUgU05CX1BCQVIyTE1U\n" - "X09GRlNFVCAgICAgICAgICAgIDB4MDAwMA0KPiA+IC0jZGVmaW5lIFNOQl9QQkFSMlhMQVRfT0ZG\n" - "U0VUICAgICAgICAgICAweDAwMTANCj4gPiAtI2RlZmluZSBTTkJfU0JBUjJMTVRfT0ZGU0VUICAg\n" - "ICAgICAgICAgMHgwMDIwDQo+ID4gLSNkZWZpbmUgU05CX1NCQVIyWExBVF9PRkZTRVQgICAgICAg\n" - "ICAgIDB4MDAzMA0KPiA+ICsjZGVmaW5lIFNOQl9QQkFSMjNMTVRfT0ZGU0VUICAgICAgICAgICAw\n" - "eDAwMDANCj4gPiArI2RlZmluZSBTTkJfUEJBUjQ1TE1UX09GRlNFVCAgICAgICAgICAgMHgwMDA4\n" - "DQo+ID4gKyNkZWZpbmUgU05CX1BCQVI0TE1UX09GRlNFVCAgICAgICAgICAgIDB4MDAwOA0KPiA+\n" - "ICsjZGVmaW5lIFNOQl9QQkFSNUxNVF9PRkZTRVQgICAgICAgICAgICAweDAwMGMNCj4gPiArI2Rl\n" - "ZmluZSBTTkJfUEJBUjIzWExBVF9PRkZTRVQgICAgICAgICAgMHgwMDEwDQo+ID4gKyNkZWZpbmUg\n" - "U05CX1BCQVI0NVhMQVRfT0ZGU0VUICAgICAgICAgIDB4MDAxOA0KPiA+ICsjZGVmaW5lIFNOQl9Q\n" - "QkFSNFhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwMTgNCj4gPiArI2RlZmluZSBTTkJfUEJBUjVY\n" - "TEFUX09GRlNFVCAgICAgICAgICAgMHgwMDFjDQo+ID4gKyNkZWZpbmUgU05CX1NCQVIyM0xNVF9P\n" - "RkZTRVQgICAgICAgICAgIDB4MDAyMA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSNDVMTVRfT0ZGU0VU\n" - "ICAgICAgICAgICAweDAwMjgNCj4gPiArI2RlZmluZSBTTkJfU0JBUjRMTVRfT0ZGU0VUICAgICAg\n" - "ICAgICAgMHgwMDI4DQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1TE1UX09GRlNFVCAgICAgICAgICAg\n" - "IDB4MDAyYw0KPiA+ICsjZGVmaW5lIFNOQl9TQkFSMjNYTEFUX09GRlNFVCAgICAgICAgICAweDAw\n" - "MzANCj4gPiArI2RlZmluZSBTTkJfU0JBUjQ1WExBVF9PRkZTRVQgICAgICAgICAgMHgwMDM4DQo+\n" - "ID4gKyNkZWZpbmUgU05CX1NCQVI0WExBVF9PRkZTRVQgICAgICAgICAgIDB4MDAzOA0KPiA+ICsj\n" - "ZGVmaW5lIFNOQl9TQkFSNVhMQVRfT0ZGU0VUICAgICAgICAgICAweDAwM2MNCj4gPiAgI2RlZmlu\n" - "ZSBTTkJfU0JBUjBCQVNFX09GRlNFVCAgICAgICAgICAgMHgwMDQwDQo+ID4gKyNkZWZpbmUgU05C\n" - "X1NCQVIyM0JBU0VfT0ZGU0VUICAgICAgICAgIDB4MDA0OA0KPiA+ICsjZGVmaW5lIFNOQl9TQkFS\n" - "NDVCQVNFX09GRlNFVCAgICAgICAgICAweDAwNTANCj4gPiArI2RlZmluZSBTTkJfU0JBUjRCQVNF\n" - "X09GRlNFVCAgICAgICAgICAgMHgwMDUwDQo+ID4gKyNkZWZpbmUgU05CX1NCQVI1QkFTRV9PRkZT\n" - "RVQgICAgICAgICAgIDB4MDA1NA0KPiA+ICAjZGVmaW5lIFNOQl9TQkRGX09GRlNFVCAgICAgICAg\n" - "ICAgICAgICAgICAgICAgIDB4MDA1Yw0KPiA+ICAjZGVmaW5lIFNOQl9OVEJDTlRMX09GRlNFVCAg\n" - "ICAgICAgICAgICAweDAwNTgNCj4gPiAgI2RlZmluZSBTTkJfUERPT1JCRUxMX09GRlNFVCAgICAg\n" - "ICAgICAgMHgwMDYwDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQu\n" - "YyBiL2RyaXZlcnMvbnRiL250Yl90cmFuc3BvcnQuYw0KPiA+IGluZGV4IGYxZWQxYjcuLmJiMmVi\n" - "ODUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gKysr\n" - "IGIvZHJpdmVycy9udGIvbnRiX3RyYW5zcG9ydC5jDQo+ID4gQEAgLTIwNCw4ICsyMDQsOCBAQCBz\n" - "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9jdHggew0KPiA+DQo+ID4gICAgICAgICBib29sIGxpbmtfaXNf\n" - "dXA7DQo+ID4gICAgICAgICBzdHJ1Y3QgZGVsYXllZF93b3JrIGxpbmtfd29yazsNCj4gPiAtICAg\n" - "ICAgIHN0cnVjdCB3b3JrX3N0cnVjdCBkYl93b3JrOw0KPiA+ICAgICAgICAgc3RydWN0IHdvcmtf\n" - "c3RydWN0IGxpbmtfY2xlYW51cDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrbGV0X3N0cnVjdCBk\n" - "Yl93b3JrOw0KPiA+ICB9Ow0KPiA+DQo+ID4gIGVudW0gew0KPiA+IEBAIC0yNDEsNyArMjQxLDcg\n" - "QEAgZW51bSB7DQo+ID4gICNkZWZpbmUgTlRCX1FQX0RFRl9OVU1fRU5UUklFUyAxMDANCj4gPiAg\n" - "I2RlZmluZSBOVEJfTElOS19ET1dOX1RJTUVPVVQgIDEwDQo+ID4NCj4gPiAtc3RhdGljIHZvaWQg\n" - "bnRiX3RyYW5zcG9ydF9kb29yYmVsbF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd3MpOw0KPiA+\n" - "ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsodW5zaWduZWQgbG9uZyBk\n" - "YXRhKTsNCj4gPiAgc3RhdGljIGNvbnN0IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0\n" - "X29wczsNCj4gPiAgc3RhdGljIHN0cnVjdCBudGJfY2xpZW50IG50Yl90cmFuc3BvcnRfY2xpZW50\n" - "Ow0KPiA+DQo+ID4gQEAgLTEwMDIsOCArMTAwMiw5IEBAIHN0YXRpYyBpbnQgbnRiX3RyYW5zcG9y\n" - "dF9wcm9iZShzdHJ1Y3QgbnRiX2NsaWVudCAqc2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+\n" - "ID4gICAgICAgICB9DQo+ID4NCj4gPiAgICAgICAgIElOSVRfREVMQVlFRF9XT1JLKCZudC0+bGlu\n" - "a193b3JrLCBudGJfdHJhbnNwb3J0X2xpbmtfd29yayk7DQo+ID4gLSAgICAgICBJTklUX1dPUkso\n" - "Jm50LT5kYl93b3JrLCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmspOw0KPiA+ICAgICAgICAg\n" - "SU5JVF9XT1JLKCZudC0+bGlua19jbGVhbnVwLCBudGJfdHJhbnNwb3J0X2xpbmtfY2xlYW51cF93\n" - "b3JrKTsNCj4gPiArICAgICAgIHRhc2tsZXRfaW5pdCgmbnQtPmRiX3dvcmssIG50Yl90cmFuc3Bv\n" - "cnRfZG9vcmJlbGxfd29yaywNCj4gPiArICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9u\n" - "ZyludCk7DQo+ID4NCj4gPiAgICAgICAgIHJjID0gbnRiX3NldF9jdHgobmRldiwgbnQsICZudGJf\n" - "dHJhbnNwb3J0X29wcyk7DQo+ID4gICAgICAgICBpZiAocmMpDQo+ID4gQEAgLTEwNDQsNyArMTA0\n" - "NSw3IEBAIHN0YXRpYyB2b2lkIG50Yl90cmFuc3BvcnRfZnJlZShzdHJ1Y3QgbnRiX2NsaWVudCAq\n" - "c2VsZiwgc3RydWN0IG50Yl9kZXYgKm5kZXYpDQo+ID4gICAgICAgICBpbnQgaTsNCj4gPg0KPiA+\n" - "ICAgICAgICAgbnRiX3RyYW5zcG9ydF9saW5rX2NsZWFudXAobnQpOw0KPiA+IC0gICAgICAgY2Fu\n" - "Y2VsX3dvcmtfc3luYygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xldF9kaXNhYmxl\n" - "KCZudC0+ZGJfd29yayk7DQo+ID4gICAgICAgICBjYW5jZWxfd29ya19zeW5jKCZudC0+bGlua19j\n" - "bGVhbnVwKTsNCj4gPiAgICAgICAgIGNhbmNlbF9kZWxheWVkX3dvcmtfc3luYygmbnQtPmxpbmtf\n" - "d29yayk7DQo+ID4NCj4gPiBAQCAtMTg1MCwxMCArMTg1MSw5IEBAIHVuc2lnbmVkIGludCBudGJf\n" - "dHJhbnNwb3J0X21heF9zaXplKHN0cnVjdCBudGJfdHJhbnNwb3J0X3FwICpxcCkNCj4gPiAgfQ0K\n" - "PiA+ICBFWFBPUlRfU1lNQk9MX0dQTChudGJfdHJhbnNwb3J0X21heF9zaXplKTsNCj4gPg0KPiA+\n" - "IC1zdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmsoc3RydWN0IHdvcmtfc3Ry\n" - "dWN0ICp3b3JrKQ0KPiA+ICtzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX3dvcmso\n" - "dW5zaWduZWQgbG9uZyBkYXRhKQ0KPiA+ICB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbnRiX3RyYW5z\n" - "cG9ydF9jdHggKm50ID0gY29udGFpbmVyX29mKHdvcmssDQo+ID4gLSAgICAgICAgICAgICAgICAg\n" - "ICAgICAgc3RydWN0IG50Yl90cmFuc3BvcnRfY3R4LCBkYl93b3JrKTsNCj4gPiArICAgICAgIHN0\n" - "cnVjdCBudGJfdHJhbnNwb3J0X2N0eCAqbnQgPSAodm9pZCAqKWRhdGE7DQo+ID4gICAgICAgICBz\n" - "dHJ1Y3QgbnRiX3RyYW5zcG9ydF9xcCAqcXA7DQo+ID4gICAgICAgICB1NjQgZGJfbWFzaywgZGJf\n" - "Yml0cywgZGJfYWdhaW47DQo+ID4gICAgICAgICB1bnNpZ25lZCBpbnQgcXBfbnVtOw0KPiA+IEBA\n" - "IC0xODkwLDcgKzE4OTAsNyBAQCBzdGF0aWMgdm9pZCBudGJfdHJhbnNwb3J0X2Rvb3JiZWxsX2Nh\n" - "bGxiYWNrKHZvaWQgKmRhdGEsIGludCB2ZWN0b3IpDQo+ID4NCj4gPiAgICAgICAgIG50Yl9kYl9z\n" - "ZXRfbWFzayhudC0+bmRldiwgbnRiX2RiX3ZhbGlkX21hc2sobnQtPm5kZXYpKTsNCj4gPg0KPiA+\n" - "IC0gICAgICAgc2NoZWR1bGVfd29yaygmbnQtPmRiX3dvcmspOw0KPiA+ICsgICAgICAgdGFza2xl\n" - "dF9zY2hlZHVsZSgmbnQtPmRiX3dvcmspOw0KPiA+ICB9DQo+ID4NCj4gPiAgc3RhdGljIGNvbnN0\n" - "IHN0cnVjdCBudGJfY3R4X29wcyBudGJfdHJhbnNwb3J0X29wcyA9IHsNCj4gPiAtLQ0KPiA+IDIu\n" - "NC4wLnJjMC40My5nY2Y4YThjNg0KPiA+DQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNjcmliZSBmcm9t\n" - "IHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtcGNpIiBpbg0KPiA+\n" - "IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+ID4g\n" - "TW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8t\n" - aW5mby5odG1sDQo= + "On Wed, 2015-05-20 at 16:11 -0500, Bjorn Helgaas wrote:\n" + "> On Wed, May 20, 2015 at 10:41 AM, Allen Hubbe <Allen.Hubbe@emc.com> wrote:\n" + "> > From: Dave Jiang <dave.jiang@intel.com>\n" + "> >\n" + "> > Signed-off-by: Dave Jiang <dave.jiang@intel.com>\n" + "> \n" + "> Needs a topic in the subject line and a changelog.\n" + "> \n" + "> It also seems to do a lot more than just checking device ID (I assume\n" + "> that's what \"DID\" means), so this should probably be split into\n" + "> several patches that each do one thing. I see at least:\n" + "> \n" + "> - cosmetic code restructuring\n" + "> - work_struct/tasklet_struct changes\n" + "> - new #defines and bar2_off() changes\n" + "\n" + "I think this patch got mangled with couple other patches. Allen?\n" + "\n" + "> \n" + "> > ---\n" + "> > drivers/ntb/hw/intel/ntb_hw_intel.c | 196 +++++++++++++++++++-----------------\n" + "> > drivers/ntb/hw/intel/ntb_hw_intel.h | 24 ++++-\n" + "> > drivers/ntb/ntb_transport.c | 16 +--\n" + "> > 3 files changed, 133 insertions(+), 103 deletions(-)\n" + "> >\n" + "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c b/drivers/ntb/hw/intel/ntb_hw_intel.c\n" + "> > index d162f22..89fea50 100644\n" + "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c\n" + "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c\n" + "> > @@ -503,7 +503,6 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > size_t buf_size;\n" + "> > ssize_t ret, off;\n" + "> > union { u64 v64; u32 v32; u16 v16; } u;\n" + "> > - unsigned long reg;\n" + "> >\n" + "> > ndev = filp->private_data;\n" + "> > mmio = ndev->self_mmio;\n" + "> > @@ -538,10 +537,10 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> >\n" + "> > if (!ndev->reg->link_is_up(ndev)) {\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > - \"Link Satus -\\t\\tDown\\n\");\n" + "> > + \"Link Status -\\t\\tDown\\n\");\n" + "> > } else {\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > - \"Link Satus -\\t\\tUp\\n\");\n" + "> > + \"Link Status -\\t\\tUp\\n\");\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Link Speed -\\t\\tPCI-E Gen %u\\n\",\n" + "> > NTB_LNK_STA_SPEED(ndev->lnk_sta));\n" + "> > @@ -568,36 +567,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Doorbell Mask Cached -\\t%#llx\\n\", ndev->db_mask);\n" + "> >\n" + "> > - reg = ndev->self_reg->db_mask;\n" + "> > - u.v64 = ndev_db_read(ndev, mmio + reg);\n" + "> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_mask);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Doorbell Mask -\\t\\t%#llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = ndev->self_reg->db_bell;\n" + "> > - u.v64 = ndev_db_read(ndev, mmio + reg);\n" + "> > + u.v64 = ndev_db_read(ndev, mmio + ndev->self_reg->db_bell);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Doorbell Bell -\\t\\t%#llx\\n\", u.v64);\n" + "> >\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nNTB Incoming XLAT:\\n\");\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 2));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_xlat, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_xlat, 4));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 2));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"LMT23 -\\t\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(ndev->xlat_reg->bar2_limit, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + bar2_off(ndev->xlat_reg->bar2_limit, 4));\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"LMT45 -\\t\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > @@ -606,41 +599,34 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nNTB Outgoing B2B XLAT:\\n\");\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B XLAT23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2XLAT_OFFSET, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B XLAT45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR23LMT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B LMT23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar2_off(SNB_PBAR2LMT_OFFSET, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_PBAR45LMT_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"B2B LMT45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nNTB Secondary BAR:\\n\");\n" + "> >\n" + "> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 0);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_SBAR0BASE_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"SBAR01 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 2);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"SBAR23 -\\t\\t%#018llx\\n\", u.v64);\n" + "> >\n" + "> > - reg = bar0_off(SNB_SBAR0BASE_OFFSET, 4);\n" + "> > - u.v64 = ioread64(mmio + reg);\n" + "> > + u.v64 = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"SBAR45 -\\t\\t%#018llx\\n\", u.v64);\n" + "> > }\n" + "> > @@ -648,31 +634,30 @@ static ssize_t ndev_debugfs_read(struct file *filp, char __user *ubuf,\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nSNB NTB Statistics:\\n\");\n" + "> >\n" + "> > - reg = SNB_USMEMMISS_OFFSET;\n" + "> > - u.v16 = ioread16(mmio + reg);\n" + "> > + u.v16 = ioread16(mmio + SNB_USMEMMISS_OFFSET);\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"Upstream Memory Miss -\\t%u\\n\", u.v16);\n" + "> >\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"\\nSNB NTB Hardware Errors:\\n\");\n" + "> >\n" + "> > - reg = SNB_DEVSTS_OFFSET;\n" + "> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n" + "> > + if (!pci_read_config_word(ndev->ntb.pdev,\n" + "> > + SNB_DEVSTS_OFFSET, &u.v16))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"DEVSTS -\\t\\t%#06x\\n\", u.v16);\n" + "> >\n" + "> > - reg = SNB_LINK_STATUS_OFFSET;\n" + "> > - if (!pci_read_config_word(ndev->ntb.pdev, reg, &u.v16))\n" + "> > + if (!pci_read_config_word(ndev->ntb.pdev,\n" + "> > + SNB_LINK_STATUS_OFFSET, &u.v16))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"LNKSTS -\\t\\t%#06x\\n\", u.v16);\n" + "> >\n" + "> > - reg = SNB_UNCERRSTS_OFFSET;\n" + "> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n" + "> > + if (!pci_read_config_dword(ndev->ntb.pdev,\n" + "> > + SNB_UNCERRSTS_OFFSET, &u.v32))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"UNCERRSTS -\\t\\t%#06x\\n\", u.v32);\n" + "> >\n" + "> > - reg = SNB_CORERRSTS_OFFSET;\n" + "> > - if (!pci_read_config_dword(ndev->ntb.pdev, reg, &u.v32))\n" + "> > + if (!pci_read_config_dword(ndev->ntb.pdev,\n" + "> > + SNB_CORERRSTS_OFFSET, &u.v32))\n" + "> > off += scnprintf(buf + off, buf_size - off,\n" + "> > \"CORERRSTS -\\t\\t%#06x\\n\", u.v32);\n" + "> > }\n" + "> > @@ -1388,7 +1373,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > {\n" + "> > struct pci_dev *pdev;\n" + "> > void __iomem *mmio;\n" + "> > - unsigned long off;\n" + "> > resource_size_t bar_size;\n" + "> > phys_addr_t bar_addr;\n" + "> > int b2b_bar;\n" + "> > @@ -1484,9 +1468,6 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR5SZ %#x\\n\", bar_sz);\n" + "> > }\n" + "> >\n" + "> > - /* setup incoming bar base addresses */\n" + "> > - off = SNB_SBAR0BASE_OFFSET;\n" + "> > -\n" + "> > /* SBAR01 hit by first part of the b2b bar */\n" + "> > if (b2b_bar == 0) {\n" + "> > bar_addr = addr->bar0_addr;\n" + "> > @@ -1504,7 +1485,7 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > }\n" + "> >\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR01 %#018llx\\n\", bar_addr);\n" + "> > - iowrite64(bar_addr, mmio + bar0_off(off, 0));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR0BASE_OFFSET);\n" + "> >\n" + "> > /* Other SBAR are normally hit by the PBAR xlat, except for b2b bar.\n" + "> > * The b2b bar is either disabled above, or configured half-size, and\n" + "> > @@ -1512,102 +1493,96 @@ static int snb_setup_b2b_mw(struct intel_ntb_dev *ndev,\n" + "> > */\n" + "> >\n" + "> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar0_off(off, 2));\n" + "> > - bar_addr = ioread64(mmio + bar0_off(off, 2));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR23BASE_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR23BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR23 %#018llx\\n\", bar_addr);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > bar_addr = addr->bar4_addr64 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar0_off(off, 4));\n" + "> > - bar_addr = ioread64(mmio + bar0_off(off, 4));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR45BASE_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR45BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR45 %#018llx\\n\", bar_addr);\n" + "> > } else {\n" + "> > bar_addr = addr->bar4_addr32 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar0_off(off, 4));\n" + "> > - bar_addr = ioread32(mmio + bar0_off(off, 4));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR4BASE_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR4BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR4 %#010llx\\n\", bar_addr);\n" + "> >\n" + "> > bar_addr = addr->bar5_addr32 +\n" + "> > (b2b_bar == 5 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar0_off(off, 5));\n" + "> > - bar_addr = ioread32(mmio + bar0_off(off, 5));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR5BASE_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR5BASE_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR5 %#010llx\\n\", bar_addr);\n" + "> > }\n" + "> >\n" + "> > /* setup incoming bar limits == base addrs (zero length windows) */\n" + "> > - off = SNB_SBAR2LMT_OFFSET;\n" + "> >\n" + "> > bar_addr = addr->bar2_addr64 + (b2b_bar == 2 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 2));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR23LMT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR23LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR23LMT %#018llx\\n\", bar_addr);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > bar_addr = addr->bar4_addr64 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 4));\n" + "> > + iowrite64(bar_addr, mmio + SNB_SBAR45LMT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_SBAR45LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR45LMT %#018llx\\n\", bar_addr);\n" + "> > } else {\n" + "> > bar_addr = addr->bar4_addr32 +\n" + "> > (b2b_bar == 4 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 4));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR4LMT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR4LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR4LMT %#010llx\\n\", bar_addr);\n" + "> >\n" + "> > bar_addr = addr->bar5_addr32 +\n" + "> > (b2b_bar == 5 ? ndev->b2b_off : 0);\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 5));\n" + "> > + iowrite32(bar_addr, mmio + SNB_SBAR5LMT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_SBAR5LMT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"SBAR5LMT %#05llx\\n\", bar_addr);\n" + "> > }\n" + "> >\n" + "> > /* zero incoming translation addrs */\n" + "> > - off = SNB_SBAR2XLAT_OFFSET;\n" + "> > -\n" + "> > - iowrite64(0, mmio + bar2_off(off, 2));\n" + "> > + iowrite64(0, mmio + SNB_SBAR23XLAT_OFFSET);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > - iowrite64(0, mmio + bar2_off(off, 4));\n" + "> > + iowrite64(0, mmio + SNB_SBAR45XLAT_OFFSET);\n" + "> > } else {\n" + "> > - iowrite32(0, mmio + bar2_off(off, 4));\n" + "> > - iowrite32(0, mmio + bar2_off(off, 5));\n" + "> > + iowrite32(0, mmio + SNB_SBAR4XLAT_OFFSET);\n" + "> > + iowrite32(0, mmio + SNB_SBAR5XLAT_OFFSET);\n" + "> > }\n" + "> >\n" + "> > /* zero outgoing translation limits (whole bar size windows) */\n" + "> > - off = SNB_PBAR2LMT_OFFSET;\n" + "> > - iowrite64(0, mmio + bar2_off(off, 2));\n" + "> > + iowrite64(0, mmio + SNB_PBAR23LMT_OFFSET);\n" + "> > if (!ndev->bar4_split) {\n" + "> > - iowrite64(0, mmio + bar2_off(off, 4));\n" + "> > + iowrite64(0, mmio + SNB_PBAR45LMT_OFFSET);\n" + "> > } else {\n" + "> > - iowrite32(0, mmio + bar2_off(off, 4));\n" + "> > - iowrite32(0, mmio + bar2_off(off, 5));\n" + "> > + iowrite32(0, mmio + SNB_PBAR4LMT_OFFSET);\n" + "> > + iowrite32(0, mmio + SNB_PBAR5LMT_OFFSET);\n" + "> > }\n" + "> >\n" + "> > /* set outgoing translation offsets */\n" + "> > - off = SNB_PBAR2XLAT_OFFSET;\n" + "> > -\n" + "> > bar_addr = peer_addr->bar2_addr64;\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 2));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 2));\n" + "> > + iowrite64(bar_addr, mmio + SNB_PBAR23XLAT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_PBAR23XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR23XLAT %#018llx\\n\", bar_addr);\n" + "> >\n" + "> > if (!ndev->bar4_split) {\n" + "> > bar_addr = peer_addr->bar4_addr64;\n" + "> > - iowrite64(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread64(mmio + bar2_off(off, 4));\n" + "> > + iowrite64(bar_addr, mmio + SNB_PBAR45XLAT_OFFSET);\n" + "> > + bar_addr = ioread64(mmio + SNB_PBAR45XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR45XLAT %#018llx\\n\", bar_addr);\n" + "> > } else {\n" + "> > bar_addr = peer_addr->bar2_addr64;\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 4));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 4));\n" + "> > + iowrite32(bar_addr, mmio + SNB_PBAR4XLAT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_PBAR4XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR4XLAT %#010llx\\n\", bar_addr);\n" + "> >\n" + "> > bar_addr = peer_addr->bar2_addr64;\n" + "> > - iowrite32(bar_addr, mmio + bar2_off(off, 5));\n" + "> > - bar_addr = ioread32(mmio + bar2_off(off, 5));\n" + "> > + iowrite32(bar_addr, mmio + SNB_PBAR5XLAT_OFFSET);\n" + "> > + bar_addr = ioread32(mmio + SNB_PBAR5XLAT_OFFSET);\n" + "> > dev_dbg(ndev_dev(ndev), \"PBAR5XLAT %#010llx\\n\", bar_addr);\n" + "> > }\n" + "> >\n" + "> > @@ -1747,29 +1722,68 @@ static int snb_init_dev(struct intel_ntb_dev *ndev)\n" + "> > u8 ppd;\n" + "> > int rc, mem;\n" + "> >\n" + "> > + pdev = ndev_pdev(ndev);\n" + "> > +\n" + "> > + switch (pdev->device) {\n" + "> > /* There is a Xeon hardware errata related to writes to SDOORBELL or\n" + "> > * B2BDOORBELL in conjunction with inbound access to NTB MMIO Space,\n" + "> > * which may hang the system. To workaround this use the second memory\n" + "> > * window to access the interrupt and scratch pad registers on the\n" + "> > * remote system.\n" + "> > */\n" + "> > - ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n" + "> > + ndev->hwerr_flags |= NTB_HWERR_SDOORBELL_LOCKUP;\n" + "> > + break;\n" + "> > + }\n" + "> >\n" + "> > + switch (pdev->device) {\n" + "> > /* There is a hardware errata related to accessing any register in\n" + "> > * SB01BASE in the presence of bidirectional traffic crossing the NTB.\n" + "> > */\n" + "> > - ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n" + "> > + ndev->hwerr_flags |= NTB_HWERR_SB01BASE_LOCKUP;\n" + "> > + break;\n" + "> > + }\n" + "> >\n" + "> > + switch (pdev->device) {\n" + "> > /* HW Errata on bit 14 of b2bdoorbell register. Writes will not be\n" + "> > * mirrored to the remote system. Shrink the number of bits by one,\n" + "> > * since bit 14 is the last bit.\n" + "> > */\n" + "> > - ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_JSF:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_SNB:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_IVT:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_SS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_PS_HSX:\n" + "> > + case PCI_DEVICE_ID_INTEL_NTB_B2B_HSX:\n" + "> > + ndev->hwerr_flags |= NTB_HWERR_B2BDOORBELL_BIT14;\n" + "> > + break;\n" + "> > + }\n" + "> >\n" + "> > ndev->reg = &snb_reg;\n" + "> >\n" + "> > - pdev = ndev_pdev(ndev);\n" + "> > -\n" + "> > rc = pci_read_config_byte(pdev, SNB_PPD_OFFSET, &ppd);\n" + "> > if (rc)\n" + "> > return -EIO;\n" + "> > @@ -2062,14 +2076,14 @@ static const struct intel_ntb_xlat_reg snb_pri_xlat = {\n" + "> > * window by setting the limit equal to base, nor can it limit the size\n" + "> > * of the memory window by setting the limit to base + size.\n" + "> > */\n" + "> > - .bar2_limit = SNB_PBAR2LMT_OFFSET,\n" + "> > - .bar2_xlat = SNB_PBAR2XLAT_OFFSET,\n" + "> > + .bar2_limit = SNB_PBAR23LMT_OFFSET,\n" + "> > + .bar2_xlat = SNB_PBAR23XLAT_OFFSET,\n" + "> > };\n" + "> >\n" + "> > static const struct intel_ntb_xlat_reg snb_sec_xlat = {\n" + "> > .bar0_base = SNB_SBAR0BASE_OFFSET,\n" + "> > - .bar2_limit = SNB_SBAR2LMT_OFFSET,\n" + "> > - .bar2_xlat = SNB_SBAR2XLAT_OFFSET,\n" + "> > + .bar2_limit = SNB_SBAR23LMT_OFFSET,\n" + "> > + .bar2_xlat = SNB_SBAR23XLAT_OFFSET,\n" + "> > };\n" + "> >\n" + "> > static const struct intel_b2b_addr snb_b2b_usd_addr = {\n" + "> > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.h b/drivers/ntb/hw/intel/ntb_hw_intel.h\n" + "> > index 0224b1a..fec689d 100644\n" + "> > --- a/drivers/ntb/hw/intel/ntb_hw_intel.h\n" + "> > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.h\n" + "> > @@ -70,11 +70,27 @@\n" + "> >\n" + "> > /* SNB hardware (and JSF, IVT, HSX) */\n" + "> >\n" + "> > -#define SNB_PBAR2LMT_OFFSET 0x0000\n" + "> > -#define SNB_PBAR2XLAT_OFFSET 0x0010\n" + "> > -#define SNB_SBAR2LMT_OFFSET 0x0020\n" + "> > -#define SNB_SBAR2XLAT_OFFSET 0x0030\n" + "> > +#define SNB_PBAR23LMT_OFFSET 0x0000\n" + "> > +#define SNB_PBAR45LMT_OFFSET 0x0008\n" + "> > +#define SNB_PBAR4LMT_OFFSET 0x0008\n" + "> > +#define SNB_PBAR5LMT_OFFSET 0x000c\n" + "> > +#define SNB_PBAR23XLAT_OFFSET 0x0010\n" + "> > +#define SNB_PBAR45XLAT_OFFSET 0x0018\n" + "> > +#define SNB_PBAR4XLAT_OFFSET 0x0018\n" + "> > +#define SNB_PBAR5XLAT_OFFSET 0x001c\n" + "> > +#define SNB_SBAR23LMT_OFFSET 0x0020\n" + "> > +#define SNB_SBAR45LMT_OFFSET 0x0028\n" + "> > +#define SNB_SBAR4LMT_OFFSET 0x0028\n" + "> > +#define SNB_SBAR5LMT_OFFSET 0x002c\n" + "> > +#define SNB_SBAR23XLAT_OFFSET 0x0030\n" + "> > +#define SNB_SBAR45XLAT_OFFSET 0x0038\n" + "> > +#define SNB_SBAR4XLAT_OFFSET 0x0038\n" + "> > +#define SNB_SBAR5XLAT_OFFSET 0x003c\n" + "> > #define SNB_SBAR0BASE_OFFSET 0x0040\n" + "> > +#define SNB_SBAR23BASE_OFFSET 0x0048\n" + "> > +#define SNB_SBAR45BASE_OFFSET 0x0050\n" + "> > +#define SNB_SBAR4BASE_OFFSET 0x0050\n" + "> > +#define SNB_SBAR5BASE_OFFSET 0x0054\n" + "> > #define SNB_SBDF_OFFSET 0x005c\n" + "> > #define SNB_NTBCNTL_OFFSET 0x0058\n" + "> > #define SNB_PDOORBELL_OFFSET 0x0060\n" + "> > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c\n" + "> > index f1ed1b7..bb2eb85 100644\n" + "> > --- a/drivers/ntb/ntb_transport.c\n" + "> > +++ b/drivers/ntb/ntb_transport.c\n" + "> > @@ -204,8 +204,8 @@ struct ntb_transport_ctx {\n" + "> >\n" + "> > bool link_is_up;\n" + "> > struct delayed_work link_work;\n" + "> > - struct work_struct db_work;\n" + "> > struct work_struct link_cleanup;\n" + "> > + struct tasklet_struct db_work;\n" + "> > };\n" + "> >\n" + "> > enum {\n" + "> > @@ -241,7 +241,7 @@ enum {\n" + "> > #define NTB_QP_DEF_NUM_ENTRIES 100\n" + "> > #define NTB_LINK_DOWN_TIMEOUT 10\n" + "> >\n" + "> > -static void ntb_transport_doorbell_work(struct work_struct *ws);\n" + "> > +static void ntb_transport_doorbell_work(unsigned long data);\n" + "> > static const struct ntb_ctx_ops ntb_transport_ops;\n" + "> > static struct ntb_client ntb_transport_client;\n" + "> >\n" + "> > @@ -1002,8 +1002,9 @@ static int ntb_transport_probe(struct ntb_client *self, struct ntb_dev *ndev)\n" + "> > }\n" + "> >\n" + "> > INIT_DELAYED_WORK(&nt->link_work, ntb_transport_link_work);\n" + "> > - INIT_WORK(&nt->db_work, ntb_transport_doorbell_work);\n" + "> > INIT_WORK(&nt->link_cleanup, ntb_transport_link_cleanup_work);\n" + "> > + tasklet_init(&nt->db_work, ntb_transport_doorbell_work,\n" + "> > + (unsigned long)nt);\n" + "> >\n" + "> > rc = ntb_set_ctx(ndev, nt, &ntb_transport_ops);\n" + "> > if (rc)\n" + "> > @@ -1044,7 +1045,7 @@ static void ntb_transport_free(struct ntb_client *self, struct ntb_dev *ndev)\n" + "> > int i;\n" + "> >\n" + "> > ntb_transport_link_cleanup(nt);\n" + "> > - cancel_work_sync(&nt->db_work);\n" + "> > + tasklet_disable(&nt->db_work);\n" + "> > cancel_work_sync(&nt->link_cleanup);\n" + "> > cancel_delayed_work_sync(&nt->link_work);\n" + "> >\n" + "> > @@ -1850,10 +1851,9 @@ unsigned int ntb_transport_max_size(struct ntb_transport_qp *qp)\n" + "> > }\n" + "> > EXPORT_SYMBOL_GPL(ntb_transport_max_size);\n" + "> >\n" + "> > -static void ntb_transport_doorbell_work(struct work_struct *work)\n" + "> > +static void ntb_transport_doorbell_work(unsigned long data)\n" + "> > {\n" + "> > - struct ntb_transport_ctx *nt = container_of(work,\n" + "> > - struct ntb_transport_ctx, db_work);\n" + "> > + struct ntb_transport_ctx *nt = (void *)data;\n" + "> > struct ntb_transport_qp *qp;\n" + "> > u64 db_mask, db_bits, db_again;\n" + "> > unsigned int qp_num;\n" + "> > @@ -1890,7 +1890,7 @@ static void ntb_transport_doorbell_callback(void *data, int vector)\n" + "> >\n" + "> > ntb_db_set_mask(nt->ndev, ntb_db_valid_mask(nt->ndev));\n" + "> >\n" + "> > - schedule_work(&nt->db_work);\n" + "> > + tasklet_schedule(&nt->db_work);\n" + "> > }\n" + "> >\n" + "> > static const struct ntb_ctx_ops ntb_transport_ops = {\n" + "> > --\n" + "> > 2.4.0.rc0.43.gcf8a8c6\n" + "> >\n" + "> > --\n" + "> > To unsubscribe from this list: send the line \"unsubscribe linux-pci\" in\n" + "> > the body of a message to majordomo@vger.kernel.org\n" + "> > More majordomo info at http://vger.kernel.org/majordomo-info.html\n" + "\303\277\303\264\303\250\302\272{.n\303\207+\302\211\302\267\302\237\302\256\302\211\302\255\302\206+%\302\212\303\213\303\277\302\261\303\251\303\235\302\266\027\302\245\302\212w\303\277\302\272{.n\303\207+\302\211\302\267\302\245\302\212{\302\261\303\276G\302\253\302\235\303\251\303\277\302\212{ay\302\272\035\303\212\302\207\303\232\302\231\303\253,j\a\302\255\302\242f\302\243\302\242\302\267h\302\232\302\217\303\257\302\201\303\252\303\277\302\221\303\252\303\247z_\303\250\302\256\003(\302\255\303\251\302\232\302\216\302\212\303\235\302\242j\"\302\235\303\272\032\302\266\033m\302\247\303\277\303\277\302\276\a\302\253\303\276G\302\253\302\235\303\251\303\277\302\242\302\270?\302\231\302\250\303\250\302\255\303\232&\302\243\303\270\302\247~\302\217\303\241\302\266iO\302\225\303\246\302\254z\302\267\302\232v\303\230^\024\004\032\302\266\033m\302\247\303\277\303\277\303\203\f\303\277\302\266\303\254\303\277\302\242\302\270?\302\226I\302\245" -2e582ad3e389f67386b7c982514fa3ccb20f0b7cbee3b1a559d58cced5bfbb25 +79ff4b3d03b77e20b9b1e6c828dffb945ccc7e41ead529d0523e8dc080fdb6c6
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.