From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from esa3.hgst.iphmx.com ([216.71.153.141]:44928 "EHLO esa3.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750726AbeCOQn4 (ORCPT ); Thu, 15 Mar 2018 12:43:56 -0400 From: Bart Van Assche Subject: Re: ZBC/FLEX FIO addition ideas Date: Thu, 15 Mar 2018 16:43:52 +0000 Message-ID: <1521132231.2834.4.camel@wdc.com> References: In-Reply-To: Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-ID: <8A077D3826613D40B52DA55D987EDE12@namprd04.prod.outlook.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: fio-owner@vger.kernel.org List-Id: fio@vger.kernel.org To: "sitsofe@gmail.com" , Kris Davis Cc: "fio@vger.kernel.org" , Jason Jorgensen , "phillip.a.chen@seagate.com" T24gVGh1LCAyMDE4LTAzLTE1IGF0IDE2OjMwICswMDAwLCBTaXRzb2ZlIFdoZWVsZXIgd3JvdGU6 DQo+IE9uIDE1IE1hcmNoIDIwMTggYXQgMTY6MTUsIEtyaXMgRGF2aXMgPEtyaXMuRGF2aXNAd2Rj LmNvbT4gd3JvdGU6DQo+ID4gRGVzcGl0ZSB0aGUgZGVzaXJlIHRvIGhhdmUgZmlvIHdvcmsgd2l0 aCBIb3N0IE1hbmFnZWQgZGV2aWNlcyBpbmRlcGVuZGVudCBvZiB0aGUgZW5naW5lLCBhIEhvc3Qg TWFuYWdlZCBkZXZpY2Ugb3BlcmF0aW9uIGlzIGRpZmZlcmVudCB0aGFuIGEgdHJhZGl0aW9uYWwg YmxvY2sgZGV2aWNlLCBhbmQgdGhlIGtlcm5lbCBhbHNvIGhhcyB0bw0KPiA+IG1hbmFnZSBpdCBk aWZmZXJlbnRseS4gVGh1cywgSSB3b3VsZCBzdGlsbCByZWNvbW1lbmQgY3JlYXRpbmcgYSBuZXcg SU8gZW5naW5lIGZvciB1c2Ugd2l0aCBIb3N0IE1hbmFnZWQgZGV2aWNlcywgd2Ugd291bGQgbm90 IHdhbnQgdGhlIGFkZGl0aW9uYWwgb3ZlcmhlYWQgYXNzb2NpYXRlZCB3aXRoIFNNUiB0byBpbXBh Y3QgdGhlDQo+ID4gc3RhbmRhcmQgYWlvIGVuZ2luZS4gIFdlIGhhdmUgbW9zdGx5IHVzZWQgdGhl IGZpbyBTRyBlbmdpbmUgYWxvbmcgd2l0aCBleHRlcm5hbCBvcGVyYXRpb25zIGluIHRlc3Rpbmcg b2YgU01SLg0KPiA+IA0KPiA+IEhlcmUgaXMgdGhlIHdheSB3ZSBlbnZpc2lvbiBhIG5ldyBmaW8g ZW5naW5lIG1pZ2h0IHdvcmsgd2l0aCBIb3N0IE1hbmFnZWQgZGV2aWNlczoNCj4gDQo+IEl0J3Mg ZGVmaW5pdGVseSBnb2luZyB0byBuZWVkIHNvbWV0aGluZyBzcGVjaWFsLiBJIHRoaW5rIGxhc3Qg dGltZQ0KPiByb3VuZCAoaHR0cHM6Ly93d3cuc3Bpbmljcy5uZXQvbGlzdHMvZmlvL21zZzA2NjQ2 Lmh0bWwgKSBJIHN1Z2dlc3RlZCBhDQo+IHByb2ZpbGUgYnV0IHBlcmhhcHMgdGhhdCB3b24ndCBi ZSBlbm91Z2guIEkgZG91YnQgYW4gaW9lbmdpbmUgd291bGQgYmUNCj4gZW5vdWdoIGJlY2F1c2Ug eW91J3JlIGdvaW5nIHRvIGhhdmUgaW50ZXJhY3Qgd2l0aCB0aGUgbmV4dCBvZmZzZXQgY29kZQ0K PiBldGMuIHVubGVzcyB5b3UncmUgZ29pbmcgdG8gZmFrZSBJL09zIGRvbmUgdG8gIndyb25nIiBy ZWdpb25zLi4uDQoNCkhlbGxvIFNpdHNvZmUsDQoNCkFkZGluZyBzdXBwb3J0IGZvciBaQkMgZHJp dmVzIGFzIGEgcHJvZmlsZSBoYXMgYSBzaWduaWZpY2FudCBkaXNhZHZhbnRhZ2UsDQpuYW1lbHkg dGhhdCB0aGUgZGlmZmVyZW50IEkvTyBwYXR0ZXJucyAoc2VxdWVudGlhbCByZWFkLCBzZXF1ZW50 aWFsIHdyaXRlLA0KcmFuZG9tIHJlYWQsIHJhbmRvbSB3cml0ZSwgLi4uKSBhbGwgaGF2ZSB0byBi ZSByZWltcGxlbWVudGVkLiBUaGF0J3Mgd2h5IEknbQ0KY29uc2lkZXJpbmcgdG8gYWRkIFpCQyBz dXBwb3J0IGJ5IG1vZGlmeWluZyB3aGF0IGdldF9uZXh0X2Jsb2NrKCkgcHJvZHVjZXMuDQpDYW4g eW91IGhhdmUgYSBsb29rIGF0IHRoZSAoYmFyZWx5IHRlc3RlZCkgcGF0Y2ggYmVsb3c/DQoNClRo YW5rcywNCg0KQmFydC4NCg0KDQpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQ0KaW5k ZXggOGY0ODcxYzYzNTI4Li40NGRkN2YzNDM5ZjYgMTAwNjQ0DQotLS0gYS9NYWtlZmlsZQ0KKysr IGIvTWFrZWZpbGUNCkBAIC0xNDUsNiArMTQ1LDkgQEAgZW5kaWYNCiBpZmRlZiBDT05GSUdfTElC UE1FTQ0KICAgU09VUkNFICs9IGVuZ2luZXMvbGlicG1lbS5jDQogZW5kaWYNCitpZmRlZiBIQVZF X0xJTlVYX0JMS1pPTkVEX0gNCisgIFNPVVJDRSArPSB6YmMuYw0KK2VuZGlmDQogDQogaWZlcSAo JChDT05GSUdfVEFSR0VUX09TKSwgTGludXgpDQogICBTT1VSQ0UgKz0gZGlza3V0aWwuYyBmaWZv LmMgYmxrdHJhY2UuYyBjZ3JvdXAuYyB0cmltLmMgZW5naW5lcy9zZy5jIFwNCmRpZmYgLS1naXQg YS9jb25maWd1cmUgYi9jb25maWd1cmUNCmluZGV4IDQ0NDJhMWNjMGQ3NS4uNjg4ZTg2MjAxMzIw IDEwMDc1NQ0KLS0tIGEvY29uZmlndXJlDQorKysgYi9jb25maWd1cmUNCkBAIC0yMTA0LDYgKzIx MDQsMjcgQEAgaWYgY29tcGlsZV9wcm9nICIiICIiICJ2YWxncmluZF9kZXYiOyB0aGVuDQogZmkN CiBwcmludF9jb25maWcgIlZhbGdyaW5kIGhlYWRlcnMiICIkdmFsZ3JpbmRfZGV2Ig0KIA0KKyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KKyMgPGxpbnV4L2Jsa3pv bmVkLmg+IHByb2JlDQoraWYgdGVzdCAiJGxpbnV4X2Jsa3pvbmVkX2giICE9ICJ5ZXMiIDsgdGhl bg0KKyAgbGludXhfYmxrem9uZWRfaD0ibm8iDQorZmkNCitjYXQgPiAkVE1QQyA8PCBFT0YNCisj aW5jbHVkZSA8bGludXgvYmxrem9uZWQuaD4NCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFy Z3YpDQorew0KKyAgcmV0dXJuIDA7DQorfQ0KK0VPRg0KK2lmIGNvbXBpbGVfcHJvZyAiIiAiIiAi bGludXhfYmxrem9uZWRfaCI7IHRoZW4NCisgIGxpbnV4X2Jsa3pvbmVkX2g9InllcyINCitmaQ0K K3ByaW50X2NvbmZpZyAiPGxpbnV4L2Jsa3pvbmVkLmg+IiAiJGxpbnV4X2Jsa3pvbmVkX2giDQor aWYgdGVzdCAiJGxpbnV4X2Jsa3pvbmVkX2giID0gInllcyIgOyB0aGVuDQorICBvdXRwdXRfc3lt ICJIQVZFX0xJTlVYX0JMS1pPTkVEX0giDQorZmkNCisNCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMNCiAjIGNoZWNrIG1hcmNoPWFybXY4LWErY3JjK2NyeXB0bw0K IGlmIHRlc3QgIiRtYXJjaF9hcm12OF9hX2NyY19jcnlwdG8iICE9ICJ5ZXMiIDsgdGhlbg0KICAg bWFyY2hfYXJtdjhfYV9jcmNfY3J5cHRvPSJubyINCmRpZmYgLS1naXQgYS9kZWJ1Zy5oIGIvZGVi dWcuaA0KaW5kZXggYjg3MThkZGMyMjVmLi5jNjljODA3OWJlZGEgMTAwNjQ0DQotLS0gYS9kZWJ1 Zy5oDQorKysgYi9kZWJ1Zy5oDQpAQCAtMjQsNiArMjQsNyBAQCBlbnVtIHsNCiAJRkRfQ09NUFJF U1MsDQogCUZEX1NURUFEWVNUQVRFLA0KIAlGRF9IRUxQRVJUSFJFQUQsDQorCUZEX1pCQywNCiAJ RkRfREVCVUdfTUFYLA0KIH07DQogDQpkaWZmIC0tZ2l0IGEvZmlsZS5oIGIvZmlsZS5oDQppbmRl eCA4ZmQzNGIxMzZjMjMuLjQyYjMwNDYyOTgyNCAxMDA2NDQNCi0tLSBhL2ZpbGUuaA0KKysrIGIv ZmlsZS5oDQpAQCAtMTAsNiArMTAsOSBAQA0KICNpbmNsdWRlICJsaWIvbGZzci5oIg0KICNpbmNs dWRlICJsaWIvZ2F1c3MuaCINCiANCisvKiBGb3J3YXJkIGRlY2xhcmF0aW9ucyAqLw0KK3N0cnVj dCB6b25lZF9ibG9ja19kZXZpY2VfaW5mbzsNCisNCiAvKg0KICAqIFRoZSB0eXBlIG9mIG9iamVj dCB3ZSBhcmUgd29ya2luZyBvbg0KICAqLw0KQEAgLTk3LDYgKzEwMCwxMSBAQCBzdHJ1Y3QgZmlv X2ZpbGUgew0KIAl1aW50NjRfdCBmaWxlX29mZnNldDsNCiAJdWludDY0X3QgaW9fc2l6ZTsNCiAN CisJLyoNCisJICogWm9uZWQgZGV2aWNlIGluZm9ybWF0aW9uDQorCSAqLw0KKwlzdHJ1Y3Qgem9u ZWRfYmxvY2tfZGV2aWNlX2luZm8gKnpiZF9pbmZvOw0KKw0KIAkvKg0KIAkgKiBUcmFjayBsYXN0 IGVuZCBhbmQgbGFzdCBzdGFydCBvZiBJTyBmb3IgYSBnaXZlbiBkYXRhIGRpcmVjdGlvbg0KIAkg Ki8NCmRpZmYgLS1naXQgYS9maWxlc2V0dXAuYyBiL2ZpbGVzZXR1cC5jDQppbmRleCA3Y2JjZTEz MjdmOGYuLmQ5ODFjNjFmNWI3ZiAxMDA2NDQNCi0tLSBhL2ZpbGVzZXR1cC5jDQorKysgYi9maWxl c2V0dXAuYw0KQEAgLTE2LDYgKzE2LDcgQEANCiAjaW5jbHVkZSAiaGFzaC5oIg0KICNpbmNsdWRl ICJsaWIvYXhtYXAuaCINCiAjaW5jbHVkZSAicndsb2NrLmgiDQorI2luY2x1ZGUgInpiYy5oIg0K IA0KICNpZmRlZiBDT05GSUdfTElOVVhfRkFMTE9DQVRFDQogI2luY2x1ZGUgPGxpbnV4L2ZhbGxv Yy5oPg0KQEAgLTc3Myw2ICs3NzQsOSBAQCBzdGF0aWMgaW50IGdldF9maWxlX3NpemVzKHN0cnVj dCB0aHJlYWRfZGF0YSAqdGQpDQogCQkgKi8NCiAJCWlmIChmLT5yZWFsX2ZpbGVfc2l6ZSA9PSAt MVVMTCAmJiB0ZC0+by5zaXplKQ0KIAkJCWYtPnJlYWxfZmlsZV9zaXplID0gdGQtPm8uc2l6ZSAv IHRkLT5vLm5yX2ZpbGVzOw0KKw0KKwkJaWYgKGYtPmZpbGV0eXBlID09IEZJT19UWVBFX0JMT0NL KQ0KKwkJCXpiY19pbml0X3pvbmVfaW5mbyhmKTsNCiAJfQ0KIA0KIAlyZXR1cm4gZXJyOw0KQEAg LTExNjUsNyArMTE2OSw5IEBAIGRvbmU6DQogCQl0ZC0+ZG9uZSA9IDE7DQogDQogCXRkX3Jlc3Rv cmVfcnVuc3RhdGUodGQsIG9sZF9zdGF0ZSk7DQotCXJldHVybiAwOw0KKw0KKwlyZXR1cm4gemJj X3ZlcmlmeV9vcHRpb25zKCk7DQorDQogZXJyX29mZnNldDoNCiAJbG9nX2VycigiJXM6IHlvdSBu ZWVkIHRvIHNwZWNpZnkgdmFsaWQgb2Zmc2V0PVxuIiwgby0+bmFtZSk7DQogZXJyX291dDoNCmRp ZmYgLS1naXQgYS9pbml0LmMgYi9pbml0LmMNCmluZGV4IGU0N2U1Mzg0MTE5Yi4uM2VhNWVhNTdl M2ExIDEwMDY0NA0KLS0tIGEvaW5pdC5jDQorKysgYi9pbml0LmMNCkBAIC0yMjY2LDYgKzIyNjYs MTAgQEAgY29uc3Qgc3RydWN0IGRlYnVnX2xldmVsIGRlYnVnX2xldmVsc1tdID0gew0KIAkgIC5o ZWxwID0gIkhlbHBlciB0aHJlYWQgbG9nZ2luZyIsDQogCSAgLnNoaWZ0ID0gRkRfSEVMUEVSVEhS RUFELA0KIAl9LA0KKwl7IC5uYW1lID0gInpiYyIsDQorCSAgLmhlbHAgPSAiWm9uZWQgQmxvY2sg RGV2aWNlIGxvZ2dpbmciLA0KKwkgIC5zaGlmdCA9IEZEX1pCQywNCisJfSwNCiAJeyAubmFtZSA9 IE5VTEwsIH0sDQogfTsNCiANCmRpZmYgLS1naXQgYS9pb191LmMgYi9pb191LmMNCmluZGV4IDAx YjM2OTM4ZDFiNS4uYmE0ZGJiOWQ4ZWNjIDEwMDY0NA0KLS0tIGEvaW9fdS5jDQorKysgYi9pb191 LmMNCkBAIC0xNCw2ICsxNCw3IEBADQogI2luY2x1ZGUgImVyci5oIg0KICNpbmNsdWRlICJsaWIv cG93Mi5oIg0KICNpbmNsdWRlICJtaW5tYXguaCINCisjaW5jbHVkZSAiemJjLmgiDQogDQogc3Ry dWN0IGlvX2NvbXBsZXRpb25fZGF0YSB7DQogCWludCBucjsJCQkJLyogaW5wdXQgKi8NCkBAIC01 NTgsNiArNTU5LDkgQEAgc3RhdGljIGludCBnZXRfbmV4dF9vZmZzZXQoc3RydWN0IHRocmVhZF9k YXRhICp0ZCwgc3RydWN0IGlvX3UgKmlvX3UsDQogCWlmIChnZXRfbmV4dF9ibG9jayh0ZCwgaW9f dSwgZGRpciwgcndfc2VxX2hpdCwgaXNfcmFuZG9tKSkNCiAJCXJldHVybiAxOw0KIA0KKwlpZiAo emJjX2FkanVzdF9ibG9jayh0ZCwgaW9fdSkpDQorCQlyZXR1cm4gMTsNCisNCiAJaWYgKGlvX3Ut Pm9mZnNldCA+PSBmLT5pb19zaXplKSB7DQogCQlkcHJpbnQoRkRfSU8sICJnZXRfbmV4dF9vZmZz ZXQ6IG9mZnNldCAlbGx1ID49IGlvX3NpemUgJWxsdVxuIiwNCiAJCQkJCSh1bnNpZ25lZCBsb25n IGxvbmcpIGlvX3UtPm9mZnNldCwNCmRpZmYgLS1naXQgYS9pb2VuZ2luZXMuYyBiL2lvZW5naW5l cy5jDQppbmRleCA5NjU1ODFhYTQxNTcuLmEwNGE5NzdjY2E5ZiAxMDA2NDQNCi0tLSBhL2lvZW5n aW5lcy5jDQorKysgYi9pb2VuZ2luZXMuYw0KQEAgLTE5LDYgKzE5LDcgQEANCiANCiAjaW5jbHVk ZSAiZmlvLmgiDQogI2luY2x1ZGUgImRpc2t1dGlsLmgiDQorI2luY2x1ZGUgInpiYy5oIg0KIA0K IHN0YXRpYyBGTElTVF9IRUFEKGVuZ2luZV9saXN0KTsNCiANCkBAIC0zMjAsNiArMzIxLDggQEAg aW50IHRkX2lvX3F1ZXVlKHN0cnVjdCB0aHJlYWRfZGF0YSAqdGQsIHN0cnVjdCBpb191ICppb191 KQ0KIAl9DQogDQogCXJldCA9IHRkLT5pb19vcHMtPnF1ZXVlKHRkLCBpb191KTsNCisJaWYgKHJl dCA8IEZJT19RX0JVU1kpDQorCQl6YmNfdXBkYXRlX3dwKHRkLCBpb191KTsNCiANCiAJdW5sb2Nr X2ZpbGUodGQsIGlvX3UtPmZpbGUpOw0KIA0KZGlmZiAtLWdpdCBhL3piYy5jIGIvemJjLmMNCm5l dyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLjU3ZTE5ODFlZTM1ZA0KLS0t IC9kZXYvbnVsbA0KKysrIGIvemJjLmMNCkBAIC0wLDAgKzEsNjA0IEBADQorLyoNCisgKiBDb3B5 cmlnaHQgKEMpIDIwMTggV2VzdGVybiBEaWdpdGFsIENvcnBvcmF0aW9uIG9yIGl0cyBhZmZpbGlh dGVzLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuDQorICov DQorDQorI2luY2x1ZGUgPGVycm5vLmg+DQorI2luY2x1ZGUgPHN0cmluZy5oPg0KKyNpbmNsdWRl IDxzdGRsaWIuaD4NCisjaW5jbHVkZSA8ZGlyZW50Lmg+DQorI2luY2x1ZGUgPGZjbnRsLmg+DQor I2luY2x1ZGUgPHN5cy9pb2N0bC5oPg0KKyNpbmNsdWRlIDx1bmlzdGQuaD4NCisjaW5jbHVkZSA8 bGludXgvYmxrem9uZWQuaD4NCisjaW5jbHVkZSAiZmlsZS5oIg0KKyNpbmNsdWRlICJmaW8uaCIN CisjaW5jbHVkZSAibG9nLmgiDQorI2luY2x1ZGUgInpiYy5oIg0KKw0KKy8qIFJldHVybiB0aGUg bmFtZSBvZiB0aGUgZmlyc3QgZW50cnkgaW4gYSBkaXJlY3RvcnkgKi8NCitzdGF0aWMgY2hhciAq Z2V0X2ZpcnN0X2RpcmVudChjb25zdCBjaGFyICpkaXJfcGF0aCkNCit7DQorCWNoYXIgKnJlcyA9 IE5VTEw7DQorCXN0cnVjdCBkaXJlbnQgKmU7DQorCURJUiAqZDsNCisNCisJZCA9IG9wZW5kaXIo ZGlyX3BhdGgpOw0KKwlpZiAoIWQpDQorCQlyZXR1cm4gTlVMTDsNCisJd2hpbGUgKChlID0gcmVh ZGRpcihkKSkpIHsNCisJCS8qIFNraXAgIi4iIGFuZCAiLi4iICovDQorCQlpZiAoZS0+ZF9uYW1l WzBdID09ICcuJykNCisJCQljb250aW51ZTsNCisJCXJlcyA9IHN0cmR1cChlLT5kX25hbWUpOw0K KwkJYnJlYWs7DQorCX0NCisJY2xvc2VkaXIoZCk7DQorDQorCXJldHVybiByZXM7DQorfQ0KKw0K Ky8qDQorICogQ29udmVydCBhIGJsb2NrIGRldmljZSBuYW1lIGludG8gYSBTQ1NJIGRldmljZSBw YXRoLCBlLmcuIC9kZXYvc2RjIGludG8NCisgKiAvc3lzL2NsYXNzL3Njc2lfZGV2aWNlLzA6MDow OjAuDQorICovDQorc3RhdGljIGludCBiZGV2X3RvX3Njc2koY2hhciAqKnNjc2lfaWQsIGNvbnN0 IGNoYXIgKmJkZXYpDQorew0KKwljaGFyICpiZGV2X3BhdGggPSBOVUxMLCAqYmRldjIgPSBOVUxM Ow0KKwlzdHJ1Y3QgZGlyZW50ICplOw0KKwlib29sIG1hdGNoZXM7DQorCURJUiAqZDsNCisJaW50 IHJlcyA9IDA7DQorDQorCWlmIChzdHJuY21wKGJkZXYsICIvZGV2LyIsIDUpICE9IDApDQorCQly ZXR1cm4gLUVJTlZBTDsNCisJZCA9IG9wZW5kaXIoIi9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UiKTsN CisJaWYgKCFkKQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorCXdoaWxlICgoZSA9IHJlYWRkaXIoZCkp KSB7DQorCQkvKiBTa2lwICIuIiBhbmQgIi4uIiAqLw0KKwkJaWYgKGUtPmRfbmFtZVswXSA9PSAn LicpDQorCQkJY29udGludWU7DQorCQlmcmVlKGJkZXZfcGF0aCk7DQorCQliZGV2X3BhdGggPSBO VUxMOw0KKwkJcmVzID0gLUVOT01FTTsNCisJCWlmIChhc3ByaW50ZigmYmRldl9wYXRoLA0KKwkJ CSAgICAgIi9zeXMvY2xhc3Mvc2NzaV9kZXZpY2UvJXMvZGV2aWNlL2Jsb2NrIiwNCisJCQkgICAg IGUtPmRfbmFtZSkgPCAwKQ0KKwkJCWJyZWFrOw0KKwkJYmRldjIgPSBnZXRfZmlyc3RfZGlyZW50 KGJkZXZfcGF0aCk7DQorCQltYXRjaGVzID0gYmRldjIgJiYgc3RyY21wKGJkZXYyLCBiZGV2ICsg NSkgPT0gMDsNCisJCWZyZWUoYmRldjIpOw0KKwkJaWYgKG1hdGNoZXMpIHsNCisJCQkqc2NzaV9p ZCA9IHN0cmR1cChlLT5kX25hbWUpOw0KKwkJCXJlcyA9IDA7DQorCQkJYnJlYWs7DQorCQl9DQor CQlyZXMgPSAtRU5PRU5UOw0KKwl9DQorCWNsb3NlZGlyKGQpOw0KKw0KKwlmcmVlKGJkZXZfcGF0 aCk7DQorDQorCXJldHVybiByZXM7DQorfQ0KKw0KKy8qDQorICogR2V0IHRoZSBTQ1NJIGRldmlj ZSB0eXBlIGZyb20gVlBEIHBhZ2UgMHg4MC4gVGhhdCBkZXZpY2UgdHlwZSBpcyBjYWxsZWQgdGhl DQorICogInBlcmlwaGVyYWwgZGV2aWNlIHR5cGUiIGluIHRoZSBTQ1NJIFNQQy01IHN0YW5kYXJk LiBSZXR1cm5zIC1FTlhJTyBpZiBhbmQNCisgKiBvbmx5IGlmIHRoZSBkZXZpY2UgaXMgbm90IGEg U0NTSSBkZXZpY2UuDQorICovDQorc3RhdGljIGludCBnZXRfc2NzaV9kZXZpY2VfdHlwZShjb25z dCBjaGFyICpiZGV2KQ0KK3sNCisJY2hhciAqc2NzaV9pZCA9IE5VTEwsICp2cGRfcGc4MF9wYXRo ID0gTlVMTDsNCisJdWludDhfdCB2cGRfcGc4MFs4XTsNCisJaW50IHZwZF9mZDsNCisJaW50IHJl dDsNCisNCisJcmV0ID0gYmRldl90b19zY3NpKCZzY3NpX2lkLCBiZGV2KTsNCisJaWYgKHJldCA8 IDAgJiYgcmV0ICE9IC1FTk9FTlQpDQorCQlyZXR1cm4gcmV0Ow0KKwlpZiAoc2NzaV9pZCA9PSBO VUxMKQ0KKwkJcmV0dXJuIC1FTlhJTzsNCisJZHByaW50KEZEX1pCQywgIkJsb2NrIGRldmljZSAl cyBoYXMgU0NTSSBJRCAlc1xuIiwgYmRldiwgc2NzaV9pZCk7DQorCXJldCA9IC1FTk9NRU07DQor CWlmIChhc3ByaW50ZigmdnBkX3BnODBfcGF0aCwNCisJCSAgICAgIi9zeXMvY2xhc3Mvc2NzaV9k ZXZpY2UvJXMvZGV2aWNlL3ZwZF9wZzgwIiwgc2NzaV9pZCkgPCAwKQ0KKwkJZ290byBvdXQ7DQor DQorCXZwZF9mZCA9IG9wZW4odnBkX3BnODBfcGF0aCwgT19SRE9OTFkpOw0KKwlpZiAodnBkX2Zk IDwgMCkNCisJCWdvdG8gb3V0Ow0KKwlyZXQgPSByZWFkKHZwZF9mZCwgdnBkX3BnODAsIHNpemVv Zih2cGRfcGc4MCkpOw0KKwljbG9zZSh2cGRfZmQpOw0KKwlpZiAocmV0IDwgc2l6ZW9mKHZwZF9w ZzgwKSkNCisJCWdvdG8gb3V0Ow0KKw0KKwlyZXQgPSB2cGRfcGc4MFswXSAmIDB4MWY7DQorDQor b3V0Og0KKwlmcmVlKHZwZF9wZzgwX3BhdGgpOw0KKwlmcmVlKHNjc2lfaWQpOw0KKwlyZXR1cm4g cmV0Ow0KK30NCisNCisvKioNCisgKiB6YmNfcmVzZXRfem9uZSAtIHJlc2V0IHRoZSB3cml0ZSBw b2ludGVyIG9mIG9uZSBvciBtb3JlIHpvbmVzDQorICogQGY6IEZJTyBmaWxlIGFzc29jaWF0ZWQg d2l0aCB0aGUgZGlzayBmb3Igd2hpY2ggdG8gcmVzZXQgd3JpdGUgcG9pbnRlcnMNCisgKiBAc2Vj dG9yOiBGaXJzdCBzZWN0b3IgZm9yIHdoaWNoIHRvIHJlc2V0IHRoZSB3cml0ZSBwb2ludGVyIGlu IHVuaXRzIG9mIDUxMg0KKyAqCWJ5dGVzLg0KKyAqIEBucl9zZWN0b3JzOiBOdW1iZXIgb2Ygc2Vj dG9ycyB0byByZXNldCB0aGUgd3JpdGUgcG9pbnRlciBvZi4NCisgKi8NCitzdGF0aWMgaW50IHpi Y19yZXNldF96b25lKGNvbnN0IHN0cnVjdCBmaW9fZmlsZSAqZiwgdWludDY0X3Qgc2VjdG9yLA0K KwkJCSAgdWludDY0X3QgbnJfc2VjdG9ycykNCit7DQorCXN0cnVjdCBibGtfem9uZV9yYW5nZSB6 ciA9IHsNCisJCS5zZWN0b3IgPSBzZWN0b3IsDQorCQkubnJfc2VjdG9ycyA9IG5yX3NlY3RvcnMN CisJfTsNCisJaW50IHJldDsNCisNCisJcmV0ID0gaW9jdGwoZi0+ZmQsIEJMS1JFU0VUWk9ORSwg JnpyKTsNCisJaWYgKHJldCA8IDApDQorCQlsb2dfZXJyKCIlczogcmVzZXR0aW5nIHdwIGZvciAl bHUgc2VjdG9ycyBhdCBzZWN0b3IgJWx1IGZhaWxlZCAoJWQpLlxuIiwNCisJCQlmLT5maWxlX25h bWUsIG5yX3NlY3RvcnMsIHNlY3RvciwgZXJybm8pOw0KKwlyZXR1cm4gcmV0Ow0KK30NCisNCisv Kg0KKyAqIFJlYWQgem9uZSBpbmZvcm1hdGlvbiBpbnRvIEBidWYgc3RhcnRpbmcgZnJvbSBzZWN0 b3IgQHN0YXJ0X3NlY3Rvci4NCisgKiBAZmQgaXMgYSBmaWxlIGRlc2NyaXB0b3IgdGhhdCByZWZl cnMgdG8gYSBibG9jayBkZXZpY2UgYW5kIEBidWZzeiBpcyB0aGUNCisgKiBzaXplIG9mIEBidWYu DQorICovDQorc3RhdGljIGludCByZWFkX3pvbmVfaW5mbyhpbnQgZmQsIHVpbnQ2NF90IHN0YXJ0 X3NlY3RvciwNCisJCQkgIHZvaWQgKmJ1ZiwgdW5zaWduZWQgaW50IGJ1ZnN6KQ0KK3sNCisJc3Ry dWN0IGJsa196b25lX3JlcG9ydCAqaGRyID0gYnVmOw0KKw0KKwlpZiAoYnVmc3ogPCBzaXplb2Yo KmhkcikpDQorCQlyZXR1cm4gLUVJTlZBTDsNCisNCisJbWVtc2V0KGhkciwgMCwgc2l6ZW9mKCpo ZHIpKTsNCisNCisJaGRyLT5ucl96b25lcyA9IChidWZzeiAtIHNpemVvZigqaGRyKSkgLyBzaXpl b2Yoc3RydWN0IGJsa196b25lKTsNCisJaGRyLT5zZWN0b3IgPSBzdGFydF9zZWN0b3I7DQorCXJl dHVybiBpb2N0bChmZCwgQkxLUkVQT1JUWk9ORSwgaGRyKTsNCit9DQorDQorLyoNCisgKiBJbml0 aWFsaXplIGYtPnpiZF9pbmZvLg0KKyAqLw0KK2ludCB6YmNfaW5pdF96b25lX2luZm8oc3RydWN0 IGZpb19maWxlICpmKQ0KK3sNCisJY29uc3QgdW5zaWduZWQgaW50IGJ1ZnN6ID0gc2l6ZW9mKHN0 cnVjdCBibGtfem9uZV9yZXBvcnQpICsNCisJCTMyNzY4ICogc2l6ZW9mKHN0cnVjdCBibGtfem9u ZSk7DQorCXVuc2lnbmVkIGludCBucl96b25lczsNCisJc3RydWN0IGJsa196b25lX3JlcG9ydCAq aGRyOw0KKwljb25zdCBzdHJ1Y3QgYmxrX3pvbmUgKno7DQorCXN0cnVjdCBmaW9fem9uZV9pbmZv ICpwOw0KKwl1aW50NjRfdCB6b25lX3NpemUsIHN0YXJ0X3NlY3RvcjsNCisJc3RydWN0IHpvbmVk X2Jsb2NrX2RldmljZV9pbmZvICp6YmRfaW5mbyA9IE5VTEw7DQorCXZvaWQgKmJ1ZjsNCisJaW50 IGZkLCBpLCBqLCByZXQgPSAtRU5PTUVNOw0KKw0KKwlyZXQgPSBnZXRfc2NzaV9kZXZpY2VfdHlw ZShmLT5maWxlX25hbWUpOw0KKwlpZiAocmV0ID09IC1FTlhJTykgew0KKwkJZHByaW50KEZEX1pC QywgIiVzOiBub3QgYSBTQ1NJIGRldmljZVxuIiwgZi0+ZmlsZV9uYW1lKTsNCisJCXJldCA9IDA7 DQorCQlnb3RvIG91dDsNCisJfQ0KKwlpZiAocmV0IDwgMCkNCisJCWxvZ19pbmZvKCJmaW86IHVu YWJsZSB0byBkZXRlcm1pbmUgZGV2aWNlIHR5cGUgZm9yICVzLlxuIiwNCisJCQkgZi0+ZmlsZV9u YW1lKTsNCisNCisJZHByaW50KEZEX1pCQywgIkJsb2NrIGRldmljZSAlcyBoYXMgU0NTSSBkZXZp Y2UgdHlwZSAlI3hcbiIsDQorCSAgICAgICBmLT5maWxlX25hbWUsIHJldCk7DQorDQorCWlmIChy ZXQgIT0gMHgxNCAvKiBaQkMgKi8pIHsNCisJCXJldCA9IDA7DQorCQlnb3RvIG91dDsNCisJfQ0K Kw0KKwlkcHJpbnQoRkRfWkJDLCAiUmVhZGluZyB6b25lIGluZm9ybWF0aW9uIGZvciBkZXZpY2Ug JXNcbiIsDQorCSAgICAgICBmLT5maWxlX25hbWUpOw0KKw0KKwlidWYgPSBtYWxsb2MoYnVmc3op Ow0KKwlpZiAoIWJ1ZikNCisJCWdvdG8gb3V0Ow0KKw0KKwlmZCA9IG9wZW4oZi0+ZmlsZV9uYW1l LCBPX1JET05MWSB8IE9fTEFSR0VGSUxFKTsNCisJaWYgKGZkIDwgMCkgew0KKwkJcmV0ID0gLWVy cm5vOw0KKwkJZ290byBmcmVlOw0KKwl9DQorDQorCXJldCA9IHJlYWRfem9uZV9pbmZvKGZkLCAw LCBidWYsIGJ1ZnN6KTsNCisJaWYgKHJldCA8IDApIHsNCisJCWxvZ19pbmZvKCJmaW86IEJMS1JF UE9SVFpPTkUoJWx1KSBmYWlsZWQgZm9yICVzICglZCkuXG4iLA0KKwkJCSAwVUwsIGYtPmZpbGVf bmFtZSwgZXJybm8pOw0KKwkJZ290byBjbG9zZTsNCisJfQ0KKwloZHIgPSBidWY7DQorCWlmICho ZHItPm5yX3pvbmVzIDwgMSkgew0KKwkJbG9nX2luZm8oImZpbzogJXMgaGFzIGludmFsaWQgem9u ZSBpbmZvcm1hdGlvbi5cbiIsDQorCQkJIGYtPmZpbGVfbmFtZSk7DQorCQlnb3RvIGNsb3NlOw0K Kwl9DQorCXogPSAodm9pZCAqKShoZHIgKyAxKTsNCisJem9uZV9zaXplID0gei0+bGVuOw0KKwlu cl96b25lcyA9IChmLT5yZWFsX2ZpbGVfc2l6ZSA+PiA5KSAvIHpvbmVfc2l6ZTsNCisNCisJZHBy aW50KEZEX1pCQywgIkRldmljZSAlcyBoYXMgJWQgem9uZXMgb2Ygc2l6ZSAlbHVcbiIsIGYtPmZp bGVfbmFtZSwNCisJICAgICAgIG5yX3pvbmVzLCB6b25lX3NpemUpOw0KKw0KKwl6YmRfaW5mbyA9 IGNhbGxvYygxLCBzaXplb2YoKnpiZF9pbmZvKSArDQorCQkJICAobnJfem9uZXMgKyAxKSAqIHNp emVvZih6YmRfaW5mby0+em9uZV9pbmZvWzBdKSk7DQorCXJldCA9IC1FTk9NRU07DQorCWlmICgh emJkX2luZm8pDQorCQlnb3RvIGNsb3NlOw0KKwlwID0gJnpiZF9pbmZvLT56b25lX2luZm9bMF07 DQorCWZvciAoc3RhcnRfc2VjdG9yID0gMCwgaiA9IDA7IGogPCBucl96b25lczspIHsNCisJCXog PSAodm9pZCAqKShoZHIgKyAxKTsNCisJCWZvciAoaSA9IDA7IGkgPCBoZHItPm5yX3pvbmVzOyBp KyssIGorKywgeisrLCBwKyspIHsNCisJCQlwLT5zdGFydCA9IHotPnN0YXJ0Ow0KKwkJCXAtPndw ID0gei0+d3A7DQorCQkJcC0+dHlwZSA9IHotPnR5cGU7DQorCQkJaWYgKGogPiAwICYmIHAtPnN0 YXJ0ICE9IHBbLTFdLnN0YXJ0ICsgem9uZV9zaXplKSB7DQorCQkJCWxvZ19pbmZvKCIlczogaW52 YWxpZCB6b25lIGRhdGFcbiIsDQorCQkJCQkgZi0+ZmlsZV9uYW1lKTsNCisJCQkJcmV0ID0gLUVJ TlZBTDsNCisJCQkJZ290byBjbG9zZTsNCisJCQl9DQorCQl9DQorCQl6LS07DQorCQlzdGFydF9z ZWN0b3IgPSB6LT5zdGFydCArIHotPmxlbjsNCisJCWlmIChqID49IG5yX3pvbmVzKQ0KKwkJCWJy ZWFrOw0KKwkJcmV0ID0gcmVhZF96b25lX2luZm8oZmQsIHN0YXJ0X3NlY3RvciwgYnVmLCBidWZz eik7DQorCQlpZiAocmV0IDwgMCkgew0KKwkJCWxvZ19pbmZvKCJmaW86IEJMS1JFUE9SVFpPTkUo JWx1KSBmYWlsZWQgZm9yICVzICglZCkuXG4iLA0KKwkJCQkgc3RhcnRfc2VjdG9yLCBmLT5maWxl X25hbWUsIGVycm5vKTsNCisJCQlnb3RvIGNsb3NlOw0KKwkJfQ0KKwl9DQorCS8qIGEgc2VudGlu ZWwgKi8NCisJemJkX2luZm8tPnpvbmVfaW5mb1tucl96b25lc10uc3RhcnQgPSBzdGFydF9zZWN0 b3I7DQorDQorCWYtPnpiZF9pbmZvID0gemJkX2luZm87DQorCWYtPnpiZF9pbmZvLT56b25lX3Np emUgPSB6b25lX3NpemU7DQorCWYtPnpiZF9pbmZvLT5ucl96b25lcyA9IG5yX3pvbmVzOw0KKwl6 YmRfaW5mbyA9IE5VTEw7DQorCXJldCA9IDA7DQorDQorY2xvc2U6DQorCWZyZWUoemJkX2luZm8p Ow0KKwljbG9zZShmZCk7DQorZnJlZToNCisJZnJlZShidWYpOw0KK291dDoNCisJcmV0dXJuIHJl dDsNCit9DQorDQorLyoqDQorICogemJjX3pvbmVfaWR4IC0gY29udmVydCBhbiBvZmZzZXQgaW50 byBhIHpvbmUgbnVtYmVyDQorICogQHRkOiB0aHJlYWQgZGF0YS4NCisgKiBAZjogZmlsZSBwb2lu dGVyLg0KKyAqIEBvZmZzZXQ6IG9mZnNldCBpbiBieXRlcy4gSWYgdGhpcyBvZmZzZXQgZXF1YWxz IHRoZSBkaXNrIHNpemUgdGhlbiB0aGUNCisgKgkgICAgaW5kZXggb2YgdGhlIHNlbnRpbmVsIGlz IHJldHVybmVkLg0KKyAqLw0KK3N0YXRpYyB1aW50MzJfdCB6YmNfem9uZV9pZHgoY29uc3Qgc3Ry dWN0IHRocmVhZF9kYXRhICp0ZCwNCisJCQkgICAgIGNvbnN0IHN0cnVjdCBmaW9fZmlsZSAqZiwg dWludDY0X3Qgb2Zmc2V0KQ0KK3sNCisJdWludDMyX3Qgem9uZV9pZHggPSAob2Zmc2V0ID4+IDkp IC8gZi0+emJkX2luZm8tPnpvbmVfc2l6ZTsNCisNCisJYXNzZXJ0KG9mZnNldCA8PSBmLT5yZWFs X2ZpbGVfc2l6ZSk7DQorCWFzc2VydCh6b25lX2lkeCA8PSBmLT56YmRfaW5mby0+bnJfem9uZXMp Ow0KKwlyZXR1cm4gem9uZV9pZHg7DQorfQ0KKw0KK3N0YXRpYyBib29sIHpvbmVfZnVsbChjb25z dCBzdHJ1Y3QgZmlvX2ZpbGUgKmYsIGNvbnN0IHN0cnVjdCBmaW9fem9uZV9pbmZvICp6KQ0KK3sN CisJcmV0dXJuIHotPndwID49IHotPnN0YXJ0ICsgZi0+emJkX2luZm8tPnpvbmVfc2l6ZTsNCit9 DQorDQorc3RhdGljIGJvb2wgaXNfdmFsaWRfb2Zmc2V0KGNvbnN0IHN0cnVjdCBmaW9fZmlsZSAq ZiwgdWludDY0X3Qgb2Zmc2V0KQ0KK3sNCisJcmV0dXJuICh1aW50NjRfdCkob2Zmc2V0IC0gZi0+ ZmlsZV9vZmZzZXQpIDwgZi0+aW9fc2l6ZTsNCit9DQorDQorLyogVmVyaWZ5IHdoZXRoZXIgZGly ZWN0IEkvTyBpcyB1c2VkIGZvciBhbGwgWkJDIGRyaXZlcy4gKi8NCitzdGF0aWMgYm9vbCB6YmNf dXNpbmdfZGlyZWN0X2lvKHZvaWQpDQorew0KKwlzdHJ1Y3QgdGhyZWFkX2RhdGEgKnRkOw0KKwlz dHJ1Y3QgZmlvX2ZpbGUgKmY7DQorCWludCBpLCBqOw0KKw0KKwlmb3JfZWFjaF90ZCh0ZCwgaSkg ew0KKwkJaWYgKHRkLT5vLm9kaXJlY3QpDQorCQkJY29udGludWU7DQorCQlmb3JfZWFjaF9maWxl KHRkLCBmLCBqKSB7DQorCQkJaWYgKGYtPnpiZF9pbmZvKQ0KKwkJCQlyZXR1cm4gZmFsc2U7DQor CQl9DQorCX0NCisNCisJcmV0dXJuIHRydWU7DQorfQ0KKw0KK3N0YXRpYyBib29sIG90aGVyX2pv Yl93cml0ZXNfdG8oc3RydWN0IHRocmVhZF9kYXRhICpjb25zdCB0ZCwNCisJCQkJc3RydWN0IGZp b19maWxlICpjb25zdCBmLA0KKwkJCQljb25zdCBpbnQgaSwgY29uc3QgaW50IGopDQorew0KKwlz dHJ1Y3QgdGhyZWFkX2RhdGEgKnRkMjsNCisJc3RydWN0IGZpb19maWxlICpmMjsNCisJaW50IGss IG07DQorDQorCWZvcl9lYWNoX3RkKHRkMiwgaykgew0KKwkJaWYgKCh0ZC0+by50ZF9kZGlyICYg KFREX0RESVJfV1JJVEUgfCBURF9ERElSX1RSSU0pKSA9PSAwKQ0KKwkJCWNvbnRpbnVlOw0KKwkJ Zm9yX2VhY2hfZmlsZSh0ZDIsIGYyLCBtKSB7DQorCQkJaWYgKGsgPT0gaSAmJiBtID09IGopDQor CQkJCWNvbnRpbnVlOw0KKwkJCWlmIChmMi0+emJkX2luZm8gJiYNCisJCQkgICAgc3RyY21wKGYt PmZpbGVfbmFtZSwgZjItPmZpbGVfbmFtZSkgPT0gMCkNCisJCQkJcmV0dXJuIHRydWU7DQorCQl9 DQorCX0NCisNCisJcmV0dXJuIGZhbHNlOw0KK30NCisNCisvKg0KKyAqIENoZWNrIHdoZXRoZXIg bXVsdGlwbGUgWkJDIHdyaXRlIG9yIHRyaW0gam9icyBoYXZlIGJlZW4gc3BlY2lmaWVkIGZvciB0 aGUNCisgKiBzYW1lIGRyaXZlLg0KKyAqDQorICogVG8gZG86IHJlZmluZSB0aGlzIGNvZGUgc3Vj aCB0aGF0IGxvY2tpbmcgaXMgb25seSByZXF1aXJlZCBpZiBtdWx0aXBsZQ0KKyAqIFpCQyB3cml0 ZSBvciB0cmltIGpvYnMgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIHNhbWUgZHJpdmUuDQor ICovDQorc3RhdGljIGJvb2wgemJjX211bHRpcGxlX3dyaXRlcnModm9pZCkNCit7DQorCXN0cnVj dCB0aHJlYWRfZGF0YSAqdGQ7DQorCXN0cnVjdCBmaW9fZmlsZSAqZjsNCisJaW50IGksIGo7DQor DQorCWZvcl9lYWNoX3RkKHRkLCBpKSB7DQorCQlpZiAoKHRkLT5vLnRkX2RkaXIgJiAoVERfRERJ Ul9XUklURSB8IFREX0RESVJfVFJJTSkpID09IDApDQorCQkJY29udGludWU7DQorCQlmb3JfZWFj aF9maWxlKHRkLCBmLCBqKQ0KKwkJCWlmIChmLT56YmRfaW5mbyAmJg0KKwkJCSAgICBvdGhlcl9q b2Jfd3JpdGVzX3RvKHRkLCBmLCBpLCBqKSkNCisJCQkJcmV0dXJuIHRydWU7DQorCX0NCisNCisJ cmV0dXJuIGZhbHNlOw0KK30NCisNCitzdGF0aWMgYm9vbCB6YmNfdmVyaWZ5X3NpemVzKHZvaWQp DQorew0KKwljb25zdCBzdHJ1Y3QgZmlvX3pvbmVfaW5mbyAqejsNCisJc3RydWN0IHRocmVhZF9k YXRhICp0ZDsNCisJc3RydWN0IGZpb19maWxlICpmOw0KKwl1aW50NjRfdCBuZXdfb2Zmc2V0LCBu ZXdfc3RhcnQ7DQorCXVpbnQzMl90IHpvbmVfaWR4Ow0KKwlpbnQgaSwgajsNCisNCisJZm9yX2Vh Y2hfdGQodGQsIGkpIHsNCisJCWZvcl9lYWNoX2ZpbGUodGQsIGYsIGopIHsNCisJCQlpZiAoIWYt PnpiZF9pbmZvKQ0KKwkJCQljb250aW51ZTsNCisJCQl6b25lX2lkeCA9IHpiY196b25lX2lkeCh0 ZCwgZiwgZi0+ZmlsZV9vZmZzZXQpOw0KKwkJCXogPSAmZi0+emJkX2luZm8tPnpvbmVfaW5mb1t6 b25lX2lkeF07DQorCQkJaWYgKCh6LT5zdGFydCA8PCA5KSAhPSBmLT5maWxlX29mZnNldCkgew0K KwkJCQluZXdfb2Zmc2V0ID0gKHotPnN0YXJ0ICsNCisJCQkJCSAgICAgIGYtPnpiZF9pbmZvLT56 b25lX3NpemUpIDw8IDk7DQorCQkJCWxvZ19pbmZvKCIlczogcm91bmRlZCB1cCBvZmZzZXQgZnJv bSAlbHUgdG8gJWx1XG4iLA0KKwkJCQkJIGYtPmZpbGVfbmFtZSwgZi0+ZmlsZV9vZmZzZXQsDQor CQkJCQkgbmV3X29mZnNldCk7DQorCQkJCWYtPmlvX3NpemUgLT0gKG5ld19vZmZzZXQgLSBmLT5m aWxlX29mZnNldCk7DQorCQkJCWYtPmZpbGVfb2Zmc2V0ID0gbmV3X29mZnNldDsNCisJCQl9DQor CQkJem9uZV9pZHggPSB6YmNfem9uZV9pZHgodGQsIGYsIGYtPmZpbGVfb2Zmc2V0ICsNCisJCQkJ CQlmLT5pb19zaXplKTsNCisJCQl6ID0gJmYtPnpiZF9pbmZvLT56b25lX2luZm9bem9uZV9pZHhd Ow0KKwkJCW5ld19zdGFydCA9IHotPnN0YXJ0IDw8IDk7DQorCQkJaWYgKGYtPmZpbGVfb2Zmc2V0 ICsgZi0+aW9fc2l6ZSAhPSBuZXdfc3RhcnQpIHsNCisJCQkJaWYgKG5ld19zdGFydCA9PSBmLT5m aWxlX29mZnNldCkgew0KKwkJCQkJbG9nX2luZm8oIiVzOiBpb19zaXplIG11c3QgYmUgYXQgbGVh c3Qgb25lIHpvbmVcbiIsDQorCQkJCQkJIGYtPmZpbGVfbmFtZSk7DQorCQkJCQlyZXR1cm4gZmFs c2U7DQorCQkJCX0NCisJCQkJbG9nX2luZm8oIiVzOiByb3VuZGVkIGRvd24gaW9fc2l6ZSBmcm9t ICVsdSB0byAlbHVcbiIsDQorCQkJCQkgZi0+ZmlsZV9uYW1lLCBmLT5pb19zaXplLCBuZXdfc3Rh cnQpOw0KKwkJCQlmLT5pb19zaXplID0gbmV3X3N0YXJ0Ow0KKwkJCX0NCisJCX0NCisJfQ0KKw0K KwlyZXR1cm4gdHJ1ZTsNCit9DQorDQoraW50IHpiY192ZXJpZnlfb3B0aW9ucyh2b2lkKQ0KK3sN CisJaWYgKCF6YmNfdXNpbmdfZGlyZWN0X2lvKCkpIHsNCisJCWxvZ19lcnIoIlVzaW5nIGRpcmVj dCBJL08gaXMgbWFuZGF0b3J5IGZvciBaQkMgZHJpdmVzXG5cbiIpOw0KKwkJcmV0dXJuIDE7DQor CX0NCisNCisJaWYgKHpiY19tdWx0aXBsZV93cml0ZXJzKCkpIHsNCisJCWxvZ19lcnIoIkNvbmN1 cnJlbnQgd3JpdGluZyB0byBaQkMgZGlza3MgaXMgbm90IHN1cHBvcnRlZFxuXG4iKTsNCisJCXJl dHVybiAxOw0KKwl9DQorDQorCWlmICghemJjX3ZlcmlmeV9zaXplcygpKQ0KKwkJcmV0dXJuIDE7 DQorDQorCXJldHVybiAwOw0KK30NCisNCisvKioNCisgKiB6YmNfYWRqdXN0X2Jsb2NrIC0gYWRq dXN0IHRoZSBvZmZzZXQgYW5kIGxlbmd0aCBhcyBuZWNlc3NhcnkgZm9yIFpCQyBkcml2ZXMNCisg KiBAdGQ6IEZJTyB0aHJlYWQgZGF0YS4NCisgKiBAaW9fdTogRklPIEkvTyB1bml0Lg0KKyAqDQor ICogUmV0dXJucyAwIGlmIHRoZSBJL08gdW5pdCBzaG91bGQgYmUgdXNlZCBhbmQgMSBpZiBub3Qu DQorICovDQoraW50IHpiY19hZGp1c3RfYmxvY2soY29uc3Qgc3RydWN0IHRocmVhZF9kYXRhICp0 ZCwgc3RydWN0IGlvX3UgKmlvX3UpDQorew0KKwljb25zdCBzdHJ1Y3QgZmlvX2ZpbGUgKmYgPSBp b191LT5maWxlOw0KKwl1aW50MzJfdCB6b25lX2lkeF9iLCB6b25lX2lkeF9lOw0KKwlzdHJ1Y3Qg ZmlvX3pvbmVfaW5mbyAqemIsICp6ZTsNCisJdWludDY0X3Qgb2Zmc2V0LCBvcmlnX28gPSBpb191 LT5vZmZzZXQ7DQorCXVpbnQzMl90IG9yaWdfbGVuID0gaW9fdS0+YnVmbGVuOw0KKwl1aW50NjRf dCBkZWx0YTsNCisNCisJaWYgKCFmLT56YmRfaW5mbykNCisJCXJldHVybiAwOw0KKw0KKwl6b25l X2lkeF9iID0gemJjX3pvbmVfaWR4KHRkLCBmLCBmLT5maWxlX29mZnNldCArIGlvX3UtPm9mZnNl dCk7DQorCXpvbmVfaWR4X2UgPSB6YmNfem9uZV9pZHgodGQsIGYsIGYtPmZpbGVfb2Zmc2V0ICsg aW9fdS0+b2Zmc2V0ICsNCisJCQkJICAoaW9fdS0+YnVmbGVuID8gaW9fdS0+YnVmbGVuIC0gMSA6 IDApKTsNCisJemIgPSAmZi0+emJkX2luZm8tPnpvbmVfaW5mb1t6b25lX2lkeF9iXTsNCisJemUg PSAmZi0+emJkX2luZm8tPnpvbmVfaW5mb1t6b25lX2lkeF9lXTsNCisNCisJc3dpdGNoIChpb191 LT5kZGlyKSB7DQorCWNhc2UgRERJUl9SRUFEOg0KKwkJLyoNCisJCSAqIEZyb20gdGhlIFpCQyBz cGVjOiBhIHJlYWQgb3BlcmF0aW9uIHBhc3QgdGhlIHdyaXRlIHBvaW50ZXINCisJCSAqIG9mIGEg em9uZSBzaGFsbCByZXR1cm4gbG9naWNhbCBibG9jayBkYXRhIHNldCB0byB0aGUgbGFzdA0KKwkJ ICogaW5pdGlhbGl6YXRpb24gcGF0dGVybiB0aGF0IHdhcyBzZXQgYXQgbWFudWZhY3R1cmUgdGlt ZSwNCisJCSAqIGJ5IHRoZSBGT1JNQVQgVU5JVCBjb21tYW5kIG9yIGJ5IHRoZSBtb3N0IHJlY2Vu dCBTQU5JVElaRQ0KKwkJICogY29tbWFuZCB3aXRoIHRoZSBzZXJ2aWNlIGFjdGlvbiBzZXQgdG8g T1ZFUldSSVRFLiBIZW5jZSwNCisJCSAqIGZvciByYW5kb20gSS9PLCBkbyBub3QgcmVhZCBwYXN0 IHRoZSB3cml0ZSBwb2ludGVyLg0KKwkJICovDQorCQlpZiAoIXRkX3JhbmRvbSh0ZCkpDQorCQkJ cmV0dXJuIDA7DQorCQlpZiAoaW9fdS0+YnVmbGVuID4gKCh6Yi0+d3AgLSB6Yi0+c3RhcnQpIDw8 IDkpKQ0KKwkJCXJldHVybiAxOw0KKwkJaWYgKGlvX3UtPm9mZnNldCArIGlvX3UtPmJ1ZmxlbiA+ ICh6Yi0+d3AgPDwgOSkpIHsNCisJCQlpb191LT5vZmZzZXQgPSAoemItPndwIDw8IDkpIC0gaW9f dS0+YnVmbGVuOw0KKwkJCWRwcmludChGRF9JTywNCisJCQkgICAgICAgImNoYW5nZWQgd3JpdGUg b2Zmc2V0IGZyb20gJWxkIGludG8gJWxsZFxuIiwNCisJCQkgICAgICAgb3JpZ19vLCBpb191LT5v ZmZzZXQpOw0KKwkJfQ0KKwkJcmV0dXJuIDA7DQorCWNhc2UgRERJUl9XUklURToNCisJCWlmICh6 Yi0+dHlwZSAhPSBCTEtfWk9ORV9UWVBFX1NFUVdSSVRFX1JFUSkNCisJCQlyZXR1cm4gMDsNCisJ CS8qIE1ha2Ugd3JpdGVzIG9jY3VyIGF0IHRoZSB3cml0ZSBwb2ludGVyICovDQorCQlpZiAoem9u ZV9mdWxsKGYsIHpiKSkgew0KKwkJCWlmICh6YmNfcmVzZXRfem9uZShmLCB6Yi0+c3RhcnQsDQor CQkJCQkgICBmLT56YmRfaW5mby0+em9uZV9zaXplKSA8IDApDQorCQkJCXJldHVybiAxOw0KKwkJ CXpiLT53cCA9IHpiLT5zdGFydDsNCisJCQlvZmZzZXQgPSB6Yi0+c3RhcnQgPDwgOTsNCisJCQlk cHJpbnQoRkRfSU8sDQorCQkJICAgICAgICJyZXNldCB6b25lIHdyaXRlIHBvaW50ZXIgYXQgb2Zm c2V0ICVsZFxuIiwNCisJCQkgICAgICAgb2Zmc2V0KTsNCisJCX0gZWxzZSB7DQorCQkJb2Zmc2V0 ID0gemItPndwIDw8IDk7DQorCQl9DQorCQlpZiAoIWlzX3ZhbGlkX29mZnNldChmLCBvZmZzZXQp KQ0KKwkJCXJldHVybiAxOw0KKwkJaW9fdS0+b2Zmc2V0ID0gb2Zmc2V0IC0gZi0+ZmlsZV9vZmZz ZXQ7DQorCQlpZiAob3JpZ19vICE9IGlvX3UtPm9mZnNldCkNCisJCQlkcHJpbnQoRkRfSU8sDQor CQkJICAgICAgICJjaGFuZ2VkIHdyaXRlIG9mZnNldCBmcm9tICVsZCBpbnRvICVsbGRcbiIsDQor CQkJICAgICAgIG9yaWdfbywgaW9fdS0+b2Zmc2V0KTsNCisJCS8qIFNocmluayB3cml0ZSByZXF1 ZXN0cyB0aGF0IGNyb3NzIHpvbmUgYm91bmRhcmllcy4gKi8NCisJCWlmICh6b25lX2lkeF9iICE9 IHpvbmVfaWR4X2UpIHsNCisJCQlpb191LT5idWZsZW4gPSAoKHpiLT5zdGFydCArIGYtPnpiZF9p bmZvLT56b25lX3NpemUpDQorCQkJCQk8PCA5KSAtIChpb191LT5vZmZzZXQgKyBmLT5maWxlX29m ZnNldCk7DQorCQkJZHByaW50KEZEX0lPLCAiQ2hhbmdlZCBsZW5ndGggZnJvbSAldSBpbnRvICVs dVxuIiwNCisJCQkgICAgICAgb3JpZ19sZW4sIGlvX3UtPmJ1Zmxlbik7DQorCQl9DQorCQlyZXR1 cm4gMDsNCisJY2FzZSBERElSX1RSSU06DQorCQkvKiBBbGlnbiB0cmltcyB0byB6b25lIGJvdW5k YXJpZXMuICovDQorCQlpZiAoem9uZV9pZHhfYiA9PSB6b25lX2lkeF9lKSB7DQorCQkJaWYgKHpi LT50eXBlID09IEJMS19aT05FX1RZUEVfU0VRV1JJVEVfUkVRICYmDQorCQkJICAgIGlvX3UtPmJ1 ZmxlbiA8IGYtPnpiZF9pbmZvLT56b25lX3NpemUpDQorCQkJCWlvX3UtPmJ1ZmxlbiA9IDA7DQor CQl9IGVsc2Ugew0KKwkJCWlmICh6Yi0+dHlwZSA9PSBCTEtfWk9ORV9UWVBFX1NFUVdSSVRFX1JF USkgew0KKwkJCQlkZWx0YSA9IGYtPnpiZF9pbmZvLT56b25lX3NpemUgLQ0KKwkJCQkJKGYtPmZp bGVfb2Zmc2V0ICsgaW9fdS0+b2Zmc2V0IC0NCisJCQkJCSAoemItPnN0YXJ0IDw8IDkpKTsNCisJ CQkJaW9fdS0+b2Zmc2V0ICs9IGRlbHRhOw0KKwkJCQlpb191LT5idWZsZW4gLT0gZGVsdGE7DQor CQkJfQ0KKwkJCWlmICh6ZS0+dHlwZSA9PSBCTEtfWk9ORV9UWVBFX1NFUVdSSVRFX1JFUSkNCisJ CQkJaW9fdS0+YnVmbGVuIC09IChmLT5maWxlX29mZnNldCArDQorCQkJCQkJIGlvX3UtPm9mZnNl dCArIGlvX3UtPmJ1ZmxlbikgLQ0KKwkJCQkJKHplLT5zdGFydCA8PCA5KTsNCisJCX0NCisJCWRw cmludChGRF9JTywgIkNoYW5nZWQgdHJpbSByYW5nZSBmcm9tICVsdSArICV1IGludG8gJWxsdSAr ICVsdSAoYWRqdXN0bWVudHM6IG9mZnNldCArICVsbHU7IGxlbiAtICVsdSlcbiIsDQorCQkgICAg ICAgb3JpZ19vLCBvcmlnX2xlbiwgaW9fdS0+b2Zmc2V0LCBpb191LT5idWZsZW4sDQorCQkgICAg ICAgaW9fdS0+b2Zmc2V0IC0gb3JpZ19vLCBvcmlnX2xlbiAtIGlvX3UtPmJ1Zmxlbik7DQorCQly ZXR1cm4gMDsNCisJY2FzZSBERElSX1NZTkM6DQorCWNhc2UgRERJUl9EQVRBU1lOQzoNCisJY2Fz ZSBERElSX1NZTkNfRklMRV9SQU5HRToNCisJY2FzZSBERElSX1dBSVQ6DQorCWNhc2UgRERJUl9M QVNUOg0KKwljYXNlIERESVJfSU5WQUw6DQorCQlyZXR1cm4gMDsNCisJfQ0KKw0KKwlhc3NlcnQo ZmFsc2UpOw0KKwlyZXR1cm4gMTsNCit9DQorDQorLyoqDQorICogemJjX3VwZGF0ZV93cCAtIHVw ZGF0ZSB0aGUgd3JpdGUgcG9pbnRlcg0KKyAqIEB0ZDogdGhyZWFkIGRhdGENCisgKiBAaW9fdTog SS9PIHVuaXQNCisgKg0KKyAqIEZvciB3cml0ZSBhbmQgdHJpbSBvcGVyYXRpb25zLCB1cGRhdGUg dGhlIHdyaXRlIHBvaW50ZXIgb2YgYWxsIGFmZmVjdGVkDQorICogem9uZXMuDQorICovDQordm9p ZCB6YmNfdXBkYXRlX3dwKHN0cnVjdCB0aHJlYWRfZGF0YSAqdGQsIGNvbnN0IHN0cnVjdCBpb191 ICppb191KQ0KK3sNCisJc3RydWN0IHpvbmVkX2Jsb2NrX2RldmljZV9pbmZvICp6YmRfaW5mbzsN CisJc3RydWN0IGZpb196b25lX2luZm8gKno7DQorCXVpbnQzMl90IHpvbmVfaWR4Ow0KKwl1aW50 NjRfdCBlbmQ7DQorDQorCWlmICghaW9fdS0+ZmlsZS0+emJkX2luZm8pDQorCQlyZXR1cm47DQor DQorCXN3aXRjaCAoaW9fdS0+ZGRpcikgew0KKwljYXNlIERESVJfUkVBRDoNCisJY2FzZSBERElS X1NZTkM6DQorCWNhc2UgRERJUl9EQVRBU1lOQzoNCisJY2FzZSBERElSX1NZTkNfRklMRV9SQU5H RToNCisJY2FzZSBERElSX1dBSVQ6DQorCWNhc2UgRERJUl9MQVNUOg0KKwljYXNlIERESVJfSU5W QUw6DQorCQlyZXR1cm47DQorCWNhc2UgRERJUl9XUklURToNCisJY2FzZSBERElSX1RSSU06DQor CQlicmVhazsNCisJfQ0KKw0KKwl6YmRfaW5mbyA9IGlvX3UtPmZpbGUtPnpiZF9pbmZvOw0KKwl6 b25lX2lkeCA9IHpiY196b25lX2lkeCh0ZCwgaW9fdS0+ZmlsZSwgaW9fdS0+b2Zmc2V0KTsNCisJ ZW5kID0gKGlvX3UtPm9mZnNldCArIGlvX3UtPmJ1ZmxlbikgPj4gOTsNCisJZm9yICh6ID0gJnpi ZF9pbmZvLT56b25lX2luZm9bem9uZV9pZHhdOyB6LT5zdGFydCA8IGVuZDsNCisJICAgICB6Kyss IHpvbmVfaWR4KyspIHsNCisJCWFzc2VydCh6b25lX2lkeCA8IHpiZF9pbmZvLT5ucl96b25lcyk7 DQorCQlpZiAoei0+dHlwZSAhPSBCTEtfWk9ORV9UWVBFX1NFUVdSSVRFX1JFUSkNCisJCQljb250 aW51ZTsNCisJCXN3aXRjaCAoaW9fdS0+ZGRpcikgew0KKwkJY2FzZSBERElSX1dSSVRFOg0KKwkJ CXotPndwID0gZW5kOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBERElSX1RSSU06DQorCQkJei0+d3Ag PSB6LT5zdGFydDsNCisJCQlicmVhazsNCisJCWRlZmF1bHQ6DQorCQkJYXNzZXJ0KGZhbHNlKTsN CisJCQlicmVhazsNCisJCX0NCisJfQ0KK30NCmRpZmYgLS1naXQgYS96YmMuaCBiL3piYy5oDQpu ZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi5kZTJhMzk1NTFjYTgNCi0t LSAvZGV2L251bGwNCisrKyBiL3piYy5oDQpAQCAtMCwwICsxLDY5IEBADQorLyoNCisgKiBDb3B5 cmlnaHQgKEMpIDIwMTggV2VzdGVybiBEaWdpdGFsIENvcnBvcmF0aW9uIG9yIGl0cyBhZmZpbGlh dGVzLg0KKyAqDQorICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwuDQorICov DQorDQorI2lmbmRlZiBGSU9fWkJDX0gNCisjZGVmaW5lIEZJT19aQkNfSA0KKw0KKyNpbmNsdWRl IDxpbnR0eXBlcy5oPg0KKw0KK3N0cnVjdCBmaW9fZmlsZTsNCisNCisvKioNCisgKiBzdHJ1Y3Qg ZmlvX3pvbmVfaW5mbyAtIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIFpCQyB6b25lDQorICog QHN0YXJ0OiB6b25lIHN0YXJ0IGluIDUxMiBieXRlIHVuaXRzDQorICogQHdwOiB6b25lIHdyaXRl IHBvaW50ZXIgbG9jYXRpb24gaW4gNTEyIGJ5dGUgdW5pdHMNCisgKiBAdHlwZTogem9uZSB0eXBl IGFzIGRlZmluZWQgYnkgZW51bSBibGtfem9uZV90eXBlDQorICovDQorc3RydWN0IGZpb196b25l X2luZm8gew0KKwl1aW50NjRfdAlzdGFydDsNCisJdWludDY0X3QJd3A7DQorCXVpbnQ4X3QJCXR5 cGU7DQorfTsNCisNCisvKioNCisgKiB6b25lZF9ibG9ja19kZXZpY2VfaW5mbyAtIHpvbmVkIGJs b2NrIGRldmljZSBjaGFyYWN0ZXJpc3RpY3MNCisgKiBAem9uZV9zaXplOiBzaXplIG9mIGEgc2lu Z2xlIHpvbmUgaW4gdW5pdHMgb2YgNTEyIGJ5dGVzDQorICogQG5yX3pvbmVzOiBudW1iZXIgb2Yg em9uZXMNCisgKiBAem9uZV9pbmZvOiBkZXNjcmlwdGlvbiBvZiB0aGUgaW5kaXZpZHVhbCB6b25l cw0KKyAqDQorICogT25seSBkZXZpY2VzIGZvciB3aGljaCBhbGwgem9uZXMgaGF2ZSB0aGUgc2Ft ZSBzaXplIGFyZSBzdXBwb3J0ZWQuDQorICogTm90ZTogaWYgdGhlIGNhcGFjaXR5IGlzIG5vdCBh IG11bHRpcGxlIG9mIHRoZSB6b25lIHNpemUgdGhlbiB0aGUgbGFzdCB6b25lDQorICogd2lsbCBi ZSBzbWFsbGVyIHRoYW4gJ3pvbmVfc2l6ZScuDQorICovDQorc3RydWN0IHpvbmVkX2Jsb2NrX2Rl dmljZV9pbmZvIHsNCisJdWludDY0X3QJCXpvbmVfc2l6ZTsNCisJdWludDY0X3QJCW5yX3pvbmVz Ow0KKwlzdHJ1Y3QgZmlvX3pvbmVfaW5mbwl6b25lX2luZm9bMF07DQorfTsNCisNCisjaWZkZWYg SEFWRV9MSU5VWF9CTEtaT05FRF9IDQoraW50IHpiY19pbml0X3pvbmVfaW5mbyhzdHJ1Y3QgZmlv X2ZpbGUgKmYpOw0KK2ludCB6YmNfdmVyaWZ5X29wdGlvbnModm9pZCk7DQoraW50IHpiY19hZGp1 c3RfYmxvY2soY29uc3Qgc3RydWN0IHRocmVhZF9kYXRhICp0ZCwgc3RydWN0IGlvX3UgKmlvX3Up Ow0KK3ZvaWQgemJjX3VwZGF0ZV93cChzdHJ1Y3QgdGhyZWFkX2RhdGEgKnRkLCBjb25zdCBzdHJ1 Y3QgaW9fdSAqaW9fdSk7DQorI2Vsc2UNCitzdGF0aWMgaW5saW5lIGludCB6YmNfaW5pdF96b25l X2luZm8oc3RydWN0IGZpb19maWxlICpmKQ0KK3sNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgaW50IHpiY192ZXJpZnlfb3B0aW9ucyh2b2lkKQ0KK3sNCisJcmV0dXJuIDA7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgaW50IHpiY19hZGp1c3RfYmxvY2soc3RydWN0IHRocmVhZF9k YXRhICp0ZCwgc3RydWN0IGlvX3UgKmlvX3UpDQorew0KKwlyZXR1cm4gMDsNCit9DQorDQorc3Rh dGljIGlubGluZSB2b2lkIHpiY191cGRhdGVfd3Aoc3RydWN0IHRocmVhZF9kYXRhICp0ZCwNCisJ CQkJIGNvbnN0IHN0cnVjdCBpb191ICppb191KQ0KK3sNCit9DQorI2VuZGlmDQorDQorI2VuZGlm IC8qIEZJT19aQkNfSCAqLw0KDQoNCg==