* [PATCH v7] Add new mac80211 driver mwlwifi. @ 2015-11-12 3:51 David Lin 2015-11-12 19:47 ` Jes Sorensen ` (6 more replies) 0 siblings, 7 replies; 26+ messages in thread From: David Lin @ 2015-11-12 3:51 UTC (permalink / raw) To: Kalle Valo; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh VGhpcyBwYXRjaCBwcm92aWRlcyB0aGUgbXdsd2lmaSBkcml2ZXIgZm9yIE1hcnZlbGwgODg2Mywg ODg2NCBhbmQgODg5Nw0KY2hpcHNldHMuDQpUaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIGFzIHBh cnQgb2YgdGhlIG9wZW53cnQub3JnIHByb2plY3QgdG8gc3VwcG9ydA0KTGlua3N5cyBXUlQxOTAw QUMgYW5kIGlzIG1haW50YWluZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2thbG96L213bHdpZmku DQoNClRoZSBtd2x3aWZpIGRyaXZlciBkaWZmZXJzIGZyb20gZXhpc3RpbmcgbXdpZmlleCBkcml2 ZXI6DQpvIG13bHdpZmkgaXMgYSAic29mdG1hYyBkcml2ZXIiIHVzaW5nIHRoZSBrZXJuZWw/7qiD IG1hYzgwMi4xMSBzdWJzeXN0ZW0NCnRvIHByb3ZpZGUgZnVsbCBBUC9XaXJlbGVzcyBCcmlkZ2Ug ZnVuY3Rpb25hbGl0eSAocm91dGVycykuDQpvIG13aWZpZXggaXMgYSAiZnVsbG1hYyBkcml2ZXIi IHdoaWNoIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQgb2YNCmNsaWVudCBmdW5jdGlvbnMg KGxhcHRvcHMvZW1iZWRkZWQgZGV2aWNlcykNCm8gb25seSBtd2x3aWZpIHN1cHBvcnRzIE1hcnZl bGwgQVAgY2hpcCA4ODZYIHNlcmllcw0KDQpOT1RFOiBVc2VycyB3aXRoIE1hcnZlbGwgODhXODg5 NyBjaGlwc2V0cyBjdXJyZW50bHkgc2hvdWxkIGVuYWJsZQ0KKENPTkZJRz1ZIG9yIE0pIGVpdGhl ciBDT05GSUdfTVdJRklFWCBvciBDT05GSUdfTVdMV0lGSSwgTk9UIEJPVEguDQoNCm13bHdpZmkg ZHJpdmVyIGxldmVyYWdlZCBjb2RlIGZyb20gZXhpc3RpbmcgTVdMOEsgZHJpdmVyIGluIHRoZQ0K Zm9sbG93aW5nIGFyZWFzOg0KLSA4MDIuMTFuIHNldHRpbmcgZm9yIG1hYzgwMjExDQotIEZ1bmN0 aW9ucyBuZWVkZWQgdG8gaG9vayB1cCB0byBtYWM4MDIxMQ0KLSBJbnRlcmFjdGlvbnMgd2l0aCBt YWM4MDIxMSB0byBlc3RhYmxpc2ggQkEgc3RyZWFtcw0KLSBQYXJ0aWFsIGZpcm13YXJlIEFQSXMs IHNvbWUgZGF0YSBmaWVsZHMNCi0gTWV0aG9kIHRvIHBhc3MgUnggcGFja2V0cyB0byBtYWM4MDIx MSBleGNlcHQgMTFhYyByYXRlcw0KDQpJbiBhZGRpdGlvbiwgbXdsd2lmaSBkcml2ZXIgc3VwcG9y dHM6DQotIGZ1dHVyZSBzY2FsYWJpbGl0eSBhbmQgZnV0dXJlIGRldmVsb3BtZW50IChyZWZhY3Rv cmVkIHNvdXJjZSBjb2RlKQ0KLSBNYXJ2ZWxsIDgwMi4xMWFjIGNoaXBzZXRzLCBpbmNsdWRpbmcg Y29tYm8gQlQgZGV2aWNlcw0KLSA4MDIuMTFhYyByZWxhdGVkIHNldHRpbmdzIGFuZCBmdW5jdGlv bnMNCi0gY29uY3VycmVudCBBUCtTVEEgZnVuY3Rpb25hbGl0aWVzIHdpdGggc2luZ2xlIGZpcm13 YXJlIHBlciBjaGlwDQotIGZpcm13YXJlIEFQSXMgZm9yIHRoZSBzdXBwb3J0ZWQgY2hpcHNldA0K LSBjb21tdW5pY2F0aW5nIG5ldyBtYWM4MDIxMSBzZXR0aW5ncyB0byBmaXJtd2FyZQ0KLSBEaWZm ZXJlbnQgVFgvUlggZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KLSBBLU1TRFUgYW5kIEEtTVBE VQ0KLSBtYWM4MDIxMS1iYXNlZCBNRVNIICh3b3JrIGluIHByb2dyZXNzKQ0KLSBSZWZpbmVkIHRo ZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQoNCk5PVEU6IE1XTFdJRkkgd2lsbCBiZSBv cmdhbml6ZWQgdW5kZXIgbmV3IHZlbmRvciBzcGVjaWZpYyBmb2xkZXIvbWFydmVsbCwNCmFzIHBl ciByZXF1ZXN0IG9mIHRoZSBnYXRlIGtlZXBlciBhbmQgY29tbXVuaXR5Lg0KDQpTaWduZWQtb2Zm LWJ5OiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5jb20+DQotLS0NCiBNQUlOVEFJTkVSUyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDYgKw0KIGRyaXZlcnMvbmV0L3dp cmVsZXNzL0tjb25maWcgICAgICAgICAgICAgICAgICAgIHwgICAgMSArDQogZHJpdmVycy9uZXQv d2lyZWxlc3MvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgfCAgICAyICsNCiBkcml2ZXJzL25l dC93aXJlbGVzcy9tYXJ2ZWxsL0tjb25maWcgICAgICAgICAgICB8ICAgIDggKw0KIGRyaXZlcnMv bmV0L3dpcmVsZXNzL21hcnZlbGwvTWFrZWZpbGUgICAgICAgICAgIHwgICAgMSArDQogZHJpdmVy cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL0tjb25maWcgICAgfCAgIDIzICsNCiBkcml2 ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvTWFrZWZpbGUgICB8ICAgMTIgKw0KIGRy aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9kZWJ1Z2ZzLmMgIHwgIDQzMyArKysr DQogZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuaCAgfCAgIDI0 ICsNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZGV2LmggICAgICB8ICA0 NzcgKysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZndjbWQuYyAg ICB8IDI0MjEgKysrKysrKysrKysrKysrKysrKysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9t YXJ2ZWxsL213bHdpZmkvZndjbWQuaCAgICB8ICAxOTggKysNCiBkcml2ZXJzL25ldC93aXJlbGVz cy9tYXJ2ZWxsL213bHdpZmkvZndkbC5jICAgICB8ICAxOTkgKysNCiBkcml2ZXJzL25ldC93aXJl bGVzcy9tYXJ2ZWxsL213bHdpZmkvZndkbC5oICAgICB8ICAgMjUgKw0KIGRyaXZlcnMvbmV0L3dp cmVsZXNzL21hcnZlbGwvbXdsd2lmaS9ob3N0Y21kLmggIHwgIDc4NiArKysrKysrKw0KIGRyaXZl cnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3IuYyAgICAgIHwgIDE1MCArKw0KIGRy aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3IuaCAgICAgIHwgICAyNiArDQog ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21hYzgwMjExLmMgfCAgNjk5ICsr KysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvbWFpbi5jICAgICB8 ICA3MzkgKysrKysrKw0KIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9yeC5j ICAgICAgIHwgIDYyNCArKysrKysNCiBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp ZmkvcnguaCAgICAgICB8ICAgMjUgKw0KIGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds d2lmaS9zeXNhZHB0LmggIHwgICA3MyArDQogZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t d2x3aWZpL3R4LmMgICAgICAgfCAxMjUxICsrKysrKysrKysrKw0KIGRyaXZlcnMvbmV0L3dpcmVs ZXNzL21hcnZlbGwvbXdsd2lmaS90eC5oICAgICAgIHwgICAzNiArDQogMjQgZmlsZXMgY2hhbmdl ZCwgODIzOSBpbnNlcnRpb25zKCspDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dp cmVsZXNzL21hcnZlbGwvS2NvbmZpZw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93 aXJlbGVzcy9tYXJ2ZWxsL01ha2VmaWxlDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0 L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9NYWtlZmlsZQ0KIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZGVidWdmcy5jDQog Y3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9k ZWJ1Z2ZzLmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs bC9td2x3aWZpL2Rldi5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNz L21hcnZlbGwvbXdsd2lmaS9md2NtZC5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0 L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9md2NtZC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9md2RsLmMNCiBjcmVhdGUgbW9kZSAx MDA2NDQgZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2Z3ZGwuaA0KIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaG9zdGNt ZC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds d2lmaS9pc3IuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2 ZWxsL213bHdpZmkvaXNyLmgNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9uZXQvd2lyZWxl c3MvbWFydmVsbC9td2x3aWZpL21hYzgwMjExLmMNCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21haW4uYw0KIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvcnguYw0KIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvcnguaA0KIGNyZWF0 ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvc3lzYWRw dC5oDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds d2lmaS90eC5jDQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl bGwvbXdsd2lmaS90eC5oDQoNCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJT DQppbmRleCAyN2IyN2MwLi43YzMyZjBhIDEwMDY0NA0KLS0tIGEvTUFJTlRBSU5FUlMNCisrKyBi L01BSU5UQUlORVJTDQpAQCAtNjYyOSw2ICs2NjI5LDEyIEBAIEw6CWxpbnV4LXdpcmVsZXNzQHZn ZXIua2VybmVsLm9yZw0KIFM6CU9kZCBGaXhlcw0KIEY6CWRyaXZlcnMvbmV0L3dpcmVsZXNzL213 bDhrLmMNCiANCitNQVJWRUxMIE1XTFdJRkkgV0lSRUxFU1MgRFJJVkVSDQorTToJRGF2aWQgTGlu IDxkbGluQG1hcnZlbGwuY29tPg0KK0w6CWxpbnV4LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZw0K K1M6CU1haW50YWluZWQNCitGOglkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkN CisNCiBNQVJWRUxMIFNPQyBNTUMvU0QvU0RJTyBDT05UUk9MTEVSIERSSVZFUg0KIE06CU5pY29s YXMgUGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+DQogUzoJT2RkIEZpeGVzDQpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL0tjb25m aWcNCmluZGV4IGY5Zjk0MjIuLmQ1OTliMzUgMTAwNjQ0DQotLS0gYS9kcml2ZXJzL25ldC93aXJl bGVzcy9LY29uZmlnDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnDQpAQCAtMjg1 LDUgKzI4NSw2IEBAIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvemQxMjExcncvS2NvbmZp ZyINCiBzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL213aWZpZXgvS2NvbmZpZyINCiBzb3Vy Y2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL2N3MTIwMC9LY29uZmlnIg0KIHNvdXJjZSAiZHJpdmVy cy9uZXQvd2lyZWxlc3MvcnNpL0tjb25maWciDQorc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVz cy9tYXJ2ZWxsL0tjb25maWciDQogDQogZW5kaWYgIyBXTEFODQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQ0K aW5kZXggNzQwZmRkMy4uNzE1MDRhNyAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvbmV0L3dpcmVsZXNz L01ha2VmaWxlDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9NYWtlZmlsZQ0KQEAgLTYwLDMg KzYwLDUgQEAgb2JqLSQoQ09ORklHX0JSQ01TTUFDKQkrPSBicmNtODAyMTEvDQogDQogb2JqLSQo Q09ORklHX0NXMTIwMCkJKz0gY3cxMjAwLw0KIG9iai0kKENPTkZJR19SU0lfOTFYKQkrPSByc2kv DQorDQorb2JqLSQoQ09ORklHX1dMX01BUlZFTEwpCSs9IG1hcnZlbGwvDQpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9LY29uZmlnIGIvZHJpdmVycy9uZXQvd2lyZWxl c3MvbWFydmVsbC9LY29uZmlnDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4u ZDczZTY0Mg0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs bC9LY29uZmlnDQpAQCAtMCwwICsxLDggQEANCittZW51Y29uZmlnIFdMX01BUlZFTEwNCisJYm9v bCAiTWFydmVsbCBXaXJlbGVzcyBMQU4gc3VwcG9ydCINCisJLS0taGVscC0tLQ0KKwkgIEVuYWJs ZSBjb21tdW5pdHkgZHJpdmVycyBmb3IgTWFydmVsbCBXaS1GaSBkZXZpY2VzLg0KKw0KK2lmIFdM X01BUlZFTEwNCitzb3VyY2UgImRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9L Y29uZmlnIg0KK2VuZGlmICMgV0xfTUFSVkVMTA0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dp cmVsZXNzL21hcnZlbGwvTWFrZWZpbGUgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL01h a2VmaWxlDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uNzBkMWIzZg0KLS0t IC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9NYWtlZmlsZQ0K QEAgLTAsMCArMSBAQA0KK29iai0kKENPTkZJR19NV0xXSUZJKQkrPSBtd2x3aWZpLw0KZGlmZiAt LWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnIGIvZHJp dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL0tjb25maWcNCm5ldyBmaWxlIG1vZGUg MTAwNjQ0DQppbmRleCAwMDAwMDAwLi5hOWJjYjljDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2 ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvS2NvbmZpZw0KQEAgLTAsMCArMSwyMyBA QA0KK2NvbmZpZyBNV0xXSUZJDQorCXRyaXN0YXRlICJNYXJ2ZWxsIEF2YXN0YXIgODhXODg2NC84 OFc4ODk3IFBDSWUgZHJpdmVyIChtYWM4MDIxMSBjb21wYXRpYmxlKSINCisJZGVwZW5kcyBvbiBQ Q0kgJiYgTUFDODAyMTENCisJc2VsZWN0IEZXX0xPQURFUg0KKwktLS1oZWxwLS0tDQorCQlTZWxl Y3QgdG8gYnVpbGQgdGhlIGRyaXZlciBzdXBwb3J0aW5nIHRoZToNCisNCisJCU1hcnZlbGwgV2ly ZWxlc3MgV2ktRmkgODhXODg2NCBtb2R1bGVzDQorCQlNYXJ2ZWxsIFdpcmVsZXNzIFdpLUZpIDg4 Vzg4OTcgbW9kdWxlcw0KKw0KKwkJVGhpcyBkcml2ZXIgdXNlcyB0aGUga2VybmVsJ3MgbWFjODAy MTEgc3Vic3lzdGVtLg0KKw0KKwkJSWYgeW91IHdhbnQgdG8gY29tcGlsZSB0aGUgZHJpdmVyIGFz IGEgbW9kdWxlICg9IGNvZGUgd2hpY2ggY2FuIGJlDQorCQlpbnNlcnRlZCBpbiBhbmQgcmVtb3Zl ZCBmcm9tIHRoZSBydW5uaW5nIGtlcm5lbCB3aGVuZXZlciB5b3Ugd2FudCksDQorCQlzYXkgTSBo ZXJlIGFuZCByZWFkIDxmaWxlOkRvY3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIFRo ZQ0KKwkJbW9kdWxlIHdpbGwgYmUgY2FsbGVkIG13bHdpZmkuDQorDQorCQlOT1RFOiBTZWxlY3Rp bmcgdGhpcyBkcml2ZXIgbWF5IGNhdXNlIGNvbmZsaWN0IHdpdGggTVdJRklFWCBkcml2ZXINCisJ CXRoYXQgYWxzbyBvcGVyYXRlcyBvbiB0aGUgc2FtZSBwYXJ0IG51bWJlciA4OFc4ODk3LiBVc2Vy cyBzaG91bGQNCisJCXNlbGVjdCBlaXRoZXIgTVdJRklFWCBvciBNV0xXSUZJLCBub3QgYm90aC4g TVdJRklFWCBpcyBmdWxsbWFjLA0KKwkJc3VwcG9ydGluZyBtb3JlIGNvbXByZWhlbnNpdmUgY2xp ZW50IGZ1bmN0aW9ucyBmb3IgbGFwdG9wcy9lbWJlZGRlZA0KKwkJZGV2aWNlcy4gTVdMV0lGSSBp cyBtYWM4MDIxMS1iYXNlZCBmb3IgZnVsbCBBUC9XaXJlbGVzcyBCcmlkZ2UuDQorDQpkaWZmIC0t Z2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01ha2VmaWxlIGIvZHJp dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01ha2VmaWxlDQpuZXcgZmlsZSBtb2Rl IDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uODhmN2VmZA0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJp dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01ha2VmaWxlDQpAQCAtMCwwICsxLDEy IEBADQorb2JqLSQoQ09ORklHX01XTFdJRkkpCSs9IG13bHdpZmkubw0KKw0KK213bHdpZmktb2Jq cwkJKz0gbWFpbi5vDQorbXdsd2lmaS1vYmpzCQkrPSBtYWM4MDIxMS5vDQorbXdsd2lmaS1vYmpz CQkrPSBmd2RsLm8NCittd2x3aWZpLW9ianMJCSs9IGZ3Y21kLm8NCittd2x3aWZpLW9ianMJCSs9 IHR4Lm8NCittd2x3aWZpLW9ianMJCSs9IHJ4Lm8NCittd2x3aWZpLW9ianMJCSs9IGlzci5vDQor bXdsd2lmaS0kKENPTkZJR19ERUJVR19GUykgKz0gZGVidWdmcy5vDQorDQorY2NmbGFncy15ICs9 IC1EX19DSEVDS19FTkRJQU5fXw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h cnZlbGwvbXdsd2lmaS9kZWJ1Z2ZzLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213 bHdpZmkvZGVidWdmcy5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uOTk3 NDYxYQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t d2x3aWZpL2RlYnVnZnMuYw0KQEAgLTAsMCArMSw0MzMgQEANCisvKg0KKyAqIENvcHlyaWdodCAo QykgMjAwNi0yMDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBz b2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVy bmF0aW9uYWwNCisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZ b3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICog YWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwg YSBjb3B5IG9mIHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVU RUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBM SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2Ug cHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNj bGFpbWVyLg0KKyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMg ZGVidWcgZnMgcmVsYXRlZCBmdW5jdGlvbnMuICovDQorDQorI2luY2x1ZGUgPGxpbnV4L2RlYnVn ZnMuaD4NCisNCisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisjaW5j bHVkZSAiaG9zdGNtZC5oIg0KKyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJkZWJ1Z2Zz LmgiDQorDQorI2RlZmluZSBNV0xXSUZJX0RFQlVHRlNfQUREX0ZJTEUobmFtZSkgZG8geyBcDQor CWlmICghZGVidWdmc19jcmVhdGVfZmlsZSgjbmFtZSwgMDY0NCwgcHJpdi0+ZGVidWdmc19waHks IFwNCisJCQkJIHByaXYsICZtd2xfZGVidWdmc18jI25hbWUjI19mb3BzKSkgXA0KKwkJcmV0dXJu OyBcDQorfSB3aGlsZSAoMCkNCisNCisjZGVmaW5lIE1XTFdJRklfREVCVUdGU19GSUxFX09QUyhu YW1lKSBcDQorc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbXdsX2RlYnVnZnNf IyNuYW1lIyNfZm9wcyA9IHsgXA0KKwkucmVhZCA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3JlYWQs IFwNCisJLndyaXRlID0gbXdsX2RlYnVnZnNfIyNuYW1lIyNfd3JpdGUsIFwNCisJLm9wZW4gPSBz aW1wbGVfb3BlbiwgXA0KK30NCisNCisjZGVmaW5lIE1XTFdJRklfREVCVUdGU19GSUxFX1JFQURf T1BTKG5hbWUpIFwNCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBtd2xfZGVi dWdmc18jI25hbWUjI19mb3BzID0geyBcDQorCS5yZWFkID0gbXdsX2RlYnVnZnNfIyNuYW1lIyNf cmVhZCwgXA0KKwkub3BlbiA9IHNpbXBsZV9vcGVuLCBcDQorfQ0KKw0KKyNkZWZpbmUgTVdMV0lG SV9ERUJVR0ZTX0ZJTEVfV1JJVEVfT1BTKG5hbWUpIFwNCitzdGF0aWMgY29uc3Qgc3RydWN0IGZp bGVfb3BlcmF0aW9ucyBtd2xfZGVidWdmc18jI25hbWUjI19mb3BzID0geyBcDQorCS53cml0ZSA9 IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3dyaXRlLCBcDQorCS5vcGVuID0gc2ltcGxlX29wZW4sIFwN Cit9DQorDQorc3RhdGljIGludCBwcmludF9tYWNfYWRkcihjaGFyICpwLCB1OCAqbWFjX2FkZHIp DQorew0KKwlpbnQgaTsNCisJY2hhciAqc3RyID0gcDsNCisNCisJc3RyICs9IHNwcmludGYoc3Ry LCAibWFjIGFkZHJlc3M6ICUwMngiLCBtYWNfYWRkclswXSk7DQorCWZvciAoaSA9IDE7IGkgPCBF VEhfQUxFTjsgaSsrKQ0KKwkJc3RyICs9IHNwcmludGYoc3RyLCAiOiUwMngiLCBtYWNfYWRkcltp XSk7DQorCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQorDQorCXJldHVybiAoc3RyIC0gcCk7 DQorfQ0KKw0KK3N0YXRpYyBpbnQgZHVtcF9kYXRhKGNoYXIgKnAsIHU4ICpkYXRhLCBpbnQgbGVu LCBjaGFyICp0aXRsZSkNCit7DQorCWNoYXIgKnN0ciA9IHA7DQorCWludCBjdXJfYnl0ZSA9IDA7 DQorCWludCBpOw0KKw0KKwlzdHIgKz0gc3ByaW50ZihzdHIsICIlc1xuIiwgdGl0bGUpOw0KKwlm b3IgKGN1cl9ieXRlID0gMDsgY3VyX2J5dGUgPCBsZW47IGN1cl9ieXRlICs9IDgpIHsNCisJCWlm ICgoY3VyX2J5dGUgKyA4KSA8IGxlbikgew0KKwkJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspDQor CQkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIjB4JTAyeCAiLA0KKwkJCQkJICAgICAgICooZGF0YSAr IGN1cl9ieXRlICsgaSkpOw0KKwkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQorCQl9IGVs c2Ugew0KKwkJCWZvciAoaSA9IDA7IGkgPCAobGVuIC0gY3VyX2J5dGUpOyBpKyspDQorCQkJCXN0 ciArPSBzcHJpbnRmKHN0ciwgIjB4JTAyeCAiLA0KKwkJCQkJICAgICAgICooZGF0YSArIGN1cl9i eXRlICsgaSkpOw0KKwkJCXN0ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQorCQkJYnJlYWs7DQor CQl9DQorCX0NCisNCisJcmV0dXJuIChzdHIgLSBwKTsNCit9DQorDQorc3RhdGljIHNzaXplX3Qg bXdsX2RlYnVnZnNfaW5mb19yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1 ZiwNCisJCQkJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykNCit7DQorCXN0cnVjdCBt d2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgbXdsX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7DQor CXVuc2lnbmVkIGxvbmcgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsNCisJY2hh ciAqcCA9IChjaGFyICopcGFnZTsNCisJc3NpemVfdCByZXQ7DQorDQorCWlmICghcCkNCisJCXJl dHVybiAtRU5PTUVNOw0KKw0KKwlwICs9IHNwcmludGYocCwgIlxuIik7DQorCXAgKz0gc3ByaW50 ZihwLCAiZHJpdmVyIG5hbWU6ICVzXG4iLCBNV0xfRFJWX05BTUUpOw0KKwlwICs9IHNwcmludGYo cCwgImNoaXAgdHlwZTogJXNcbiIsDQorCQkgICAgIChwcml2LT5jaGlwX3R5cGUgPT0gTVdMODg2 NCkgPyAiODhXODg2NCIgOiAiODhXODg5NyIpOw0KKwlwICs9IHNwcmludGYocCwgImh3IHZlcnNp b246ICVYXG4iLCBwcml2LT5od19kYXRhLmh3X3ZlcnNpb24pOw0KKwlwICs9IHNwcmludGYocCwg ImRyaXZlciB2ZXJzaW9uOiAlc1xuIiwgTVdMX0RSVl9WRVJTSU9OKTsNCisJcCArPSBzcHJpbnRm KHAsICJmaXJtd2FyZSB2ZXJzaW9uOiAweCUwOHhcbiIsDQorCQkgICAgIHByaXYtPmh3X2RhdGEu ZndfcmVsZWFzZV9udW0pOw0KKwlwICs9IHByaW50X21hY19hZGRyKHAsIHByaXYtPmh3X2RhdGEu bWFjX2FkZHIpOw0KKwlwICs9IHNwcmludGYocCwgIjJnOiAlc1xuIiwgcHJpdi0+ZGlzYWJsZV8y ZyA/ICJkaXNhYmxlIiA6ICJlbmFibGUiKTsNCisJcCArPSBzcHJpbnRmKHAsICI1ZzogJXNcbiIs IHByaXYtPmRpc2FibGVfNWcgPyAiZGlzYWJsZSIgOiAiZW5hYmxlIik7DQorCXAgKz0gc3ByaW50 ZihwLCAiYW50ZW5uYTogJWQgJWRcbiIsDQorCQkgICAgIChwcml2LT5hbnRlbm5hX3R4ID09IEFO VEVOTkFfVFhfNF9BVVRPKSA/IDQgOiAyLA0KKwkJICAgICAocHJpdi0+YW50ZW5uYV9yeCA9PSBB TlRFTk5BX1RYXzRfQVVUTykgPyA0IDogMik7DQorCXAgKz0gc3ByaW50ZihwLCAiaXJxIG51bWJl cjogJWRcbiIsIHByaXYtPmlycSk7DQorCXAgKz0gc3ByaW50ZihwLCAiaW9iYXNlMDogJXBcbiIs IHByaXYtPmlvYmFzZTApOw0KKwlwICs9IHNwcmludGYocCwgImlvYmFzZTE6ICVwXG4iLCBwcml2 LT5pb2Jhc2UxKTsNCisJcCArPSBzcHJpbnRmKHAsICJ0eCBsaW1pdDogJWRcbiIsIHByaXYtPnR4 cV9saW1pdCk7DQorCXAgKz0gc3ByaW50ZihwLCAicnggbGltaXQ6ICVkXG4iLCBwcml2LT5yZWN2 X2xpbWl0KTsNCisJcCArPSBzcHJpbnRmKHAsICJhcCBtYWNpZCBzdXBwb3J0OiAlMDh4XG4iLA0K KwkJICAgICBwcml2LT5hcF9tYWNpZHNfc3VwcG9ydGVkKTsNCisJcCArPSBzcHJpbnRmKHAsICJz dGEgbWFjaWQgc3VwcG9ydDogJTA4eFxuIiwNCisJCSAgICAgcHJpdi0+c3RhX21hY2lkc19zdXBw b3J0ZWQpOw0KKwlwICs9IHNwcmludGYocCwgIm1hY2lkIHVzZWQ6ICUwOHhcbiIsIHByaXYtPm1h Y2lkc191c2VkKTsNCisJcCArPSBzcHJpbnRmKHAsICJtZmcgbW9kZTogJXNcbiIsIHByaXYtPm1m Z19tb2RlID8gInRydWUiIDogImZhbHNlIik7DQorCXAgKz0gc3ByaW50ZihwLCAiXG4iKTsNCisN CisJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBwb3MsIChjaGFy ICopcGFnZSwNCisJCQkJICAgICAgKHVuc2lnbmVkIGxvbmcpcCAtIHBhZ2UpOw0KKwlmcmVlX3Bh Z2UocGFnZSk7DQorDQorCXJldHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyBzc2l6ZV90IG13bF9k ZWJ1Z2ZzX3ZpZl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwNCisJ CQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQ0KK3sNCisJc3RydWN0IG13bF9wcml2 ICpwcml2ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsNCisJdW5zaWdu ZWQgbG9uZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KKwljaGFyICpwID0g KGNoYXIgKilwYWdlOw0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3RydWN0IGllZWU4 MDIxMV92aWYgKnZpZjsNCisJY2hhciBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJRF9MRU4gKyAxXTsN CisJc3NpemVfdCByZXQ7DQorDQorCWlmICghcCkNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlw ICs9IHNwcmludGYocCwgIlxuIik7DQorCXNwaW5fbG9ja19iaCgmcHJpdi0+dmlmX2xvY2spOw0K KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG13bF92aWYsICZwcml2LT52aWZfbGlzdCwgbGlzdCkgew0K KwkJdmlmID0gY29udGFpbmVyX29mKChjaGFyICopbXdsX3ZpZiwgc3RydWN0IGllZWU4MDIxMV92 aWYsDQorCQkJCSAgIGRydl9wcml2WzBdKTsNCisJCXAgKz0gc3ByaW50ZihwLCAibWFjaWQ6ICVk XG4iLCBtd2xfdmlmLT5tYWNpZCk7DQorCQlzd2l0Y2ggKHZpZi0+dHlwZSkgew0KKwkJY2FzZSBO TDgwMjExX0lGVFlQRV9BUDoNCisJCQlwICs9IHNwcmludGYocCwgInR5cGU6IGFwXG4iKTsNCisJ CQltZW1jcHkoc3NpZCwgdmlmLT5ic3NfY29uZi5zc2lkLA0KKwkJCSAgICAgICB2aWYtPmJzc19j b25mLnNzaWRfbGVuKTsNCisJCQlzc2lkW3ZpZi0+YnNzX2NvbmYuc3NpZF9sZW5dID0gMDsNCisJ CQlwICs9IHNwcmludGYocCwgInNzaWQ6ICVzXG4iLCBzc2lkKTsNCisJCQlwICs9IHByaW50X21h Y19hZGRyKHAsIG13bF92aWYtPmJzc2lkKTsNCisJCQlicmVhazsNCisJCWNhc2UgTkw4MDIxMV9J RlRZUEVfTUVTSF9QT0lOVDoNCisJCQlwICs9IHNwcmludGYocCwgInR5cGU6IG1lc2hcbiIpOw0K KwkJCXAgKz0gcHJpbnRfbWFjX2FkZHIocCwgbXdsX3ZpZi0+YnNzaWQpOw0KKwkJCWJyZWFrOw0K KwkJY2FzZSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OOg0KKwkJCXAgKz0gc3ByaW50ZihwLCAidHlw ZTogc3RhXG4iKTsNCisJCQlwICs9IHByaW50X21hY19hZGRyKHAsIG13bF92aWYtPnN0YV9tYWMp Ow0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlwICs9IHNwcmludGYocCwgInR5cGU6IHVu a25vd25cbiIpOw0KKwkJCWJyZWFrOw0KKwkJfQ0KKwkJcCArPSBzcHJpbnRmKHAsICJod19jcnlw dG9fZW5hYmxlZDogJXNcbiIsDQorCQkJICAgICBtd2xfdmlmLT5pc19od19jcnlwdG9fZW5hYmxl ZCA/ICJ0cnVlIiA6ICJmYWxzZSIpOw0KKwkJcCArPSBzcHJpbnRmKHAsICJrZXkgaWR4OiAlZFxu IiwgbXdsX3ZpZi0+a2V5aWR4KTsNCisJCXAgKz0gc3ByaW50ZihwLCAiSVY6ICUwOHglMDR4XG4i LCBtd2xfdmlmLT5pdjMyLCBtd2xfdmlmLT5pdjE2KTsNCisJCXAgKz0gZHVtcF9kYXRhKHAsIG13 bF92aWYtPmJlYWNvbl9pbmZvLmllX3dtbV9wdHIsDQorCQkJICAgICAgIG13bF92aWYtPmJlYWNv bl9pbmZvLmllX3dtbV9sZW4sICJXTU06Iik7DQorCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlm LT5iZWFjb25faW5mby5pZV9yc25fcHRyLA0KKwkJCSAgICAgICBtd2xfdmlmLT5iZWFjb25faW5m by5pZV9yc25fbGVuLCAiUlNOOiIpOw0KKwkJcCArPSBkdW1wX2RhdGEocCwgbXdsX3ZpZi0+YmVh Y29uX2luZm8uaWVfcnNuNDhfcHRyLA0KKwkJCSAgICAgICBtd2xfdmlmLT5iZWFjb25faW5mby5p ZV9yc240OF9sZW4sICJSU040ODoiKTsNCisJCXAgKz0gZHVtcF9kYXRhKHAsIG13bF92aWYtPmJl YWNvbl9pbmZvLmllX2h0X3B0ciwNCisJCQkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVf aHRfbGVuLCAiSFQ6Iik7DQorCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlmLT5iZWFjb25faW5m by5pZV92aHRfcHRyLA0KKwkJCSAgICAgICBtd2xfdmlmLT5iZWFjb25faW5mby5pZV92aHRfbGVu LCAiVkhUOiIpOw0KKwkJcCArPSBzcHJpbnRmKHAsICJcbiIpOw0KKwl9DQorCXNwaW5fdW5sb2Nr X2JoKCZwcml2LT52aWZfbG9jayk7DQorDQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVy KHVidWYsIGNvdW50LCBwcG9zLCAoY2hhciAqKXBhZ2UsDQorCQkJCSAgICAgICh1bnNpZ25lZCBs b25nKXAgLSBwYWdlKTsNCisJZnJlZV9wYWdlKHBhZ2UpOw0KKw0KKwlyZXR1cm4gcmV0Ow0KK30N CisNCitzdGF0aWMgc3NpemVfdCBtd2xfZGVidWdmc19zdGFfcmVhZChzdHJ1Y3QgZmlsZSAqZmls ZSwgY2hhciBfX3VzZXIgKnVidWYsDQorCQkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBv cykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IChzdHJ1Y3QgbXdsX3ByaXYgKilmaWxl LT5wcml2YXRlX2RhdGE7DQorCXVuc2lnbmVkIGxvbmcgcGFnZSA9IGdldF96ZXJvZWRfcGFnZShH RlBfS0VSTkVMKTsNCisJY2hhciAqcCA9IChjaGFyICopcGFnZTsNCisJc3RydWN0IG13bF9zdGEg KnN0YV9pbmZvOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhOw0KKwlzc2l6ZV90IHJldDsN CisNCisJaWYgKCFwKQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorDQorCXAgKz0gc3ByaW50ZihwLCAi XG4iKTsNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7DQorCWxpc3RfZm9yX2VhY2hf ZW50cnkoc3RhX2luZm8sICZwcml2LT5zdGFfbGlzdCwgbGlzdCkgew0KKwkJc3RhID0gY29udGFp bmVyX29mKChjaGFyICopc3RhX2luZm8sIHN0cnVjdCBpZWVlODAyMTFfc3RhLA0KKwkJCQkgICBk cnZfcHJpdlswXSk7DQorCQlwICs9IHByaW50X21hY19hZGRyKHAsIHN0YS0+YWRkcik7DQorCQlw ICs9IHNwcmludGYocCwgImFpZDogJXVcbiIsIHN0YS0+YWlkKTsNCisJCXAgKz0gc3ByaW50Zihw LCAiYW1wZHU6ICVzXG4iLA0KKwkJCSAgICAgc3RhX2luZm8tPmlzX2FtcGR1X2FsbG93ZWQgPyAi dHJ1ZSIgOiAiZmFsc2UiKTsNCisJCXAgKz0gc3ByaW50ZihwLCAiYW1zZHU6ICVzXG4iLA0KKwkJ CSAgICAgc3RhX2luZm8tPmlzX2Ftc2R1X2FsbG93ZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsNCisJ CWlmIChzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCkgew0KKwkJCXAgKz0gc3ByaW50ZihwLCAi YW1zZHUgY2FwOiAweCUwMnhcbiIsDQorCQkJCSAgICAgc3RhX2luZm8tPmFtc2R1X2N0cmwuY2Fw KTsNCisJCX0NCisJCXAgKz0gc3ByaW50ZihwLCAiSVY6ICUwOHglMDR4XG4iLA0KKwkJCSAgICAg c3RhX2luZm8tPml2MzIsIHN0YV9pbmZvLT5pdjE2KTsNCisJCXAgKz0gc3ByaW50ZihwLCAiXG4i KTsNCisJfQ0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RhX2xvY2spOw0KKw0KKwlyZXQgPSBz aW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjb3VudCwgcHBvcywgKGNoYXIgKilwYWdlLA0K KwkJCQkgICAgICAodW5zaWduZWQgbG9uZylwIC0gcGFnZSk7DQorCWZyZWVfcGFnZShwYWdlKTsN CisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3RhdGljIHNzaXplX3QgbXdsX2RlYnVnZnNfYW1w ZHVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsDQorCQkJCSAgICAg IHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2 ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsNCisJdW5zaWduZWQgbG9u ZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KKwljaGFyICpwID0gKGNoYXIg KilwYWdlOw0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtOw0KKwlpbnQgaTsNCisJ c3NpemVfdCByZXQ7DQorDQorCWlmICghcCkNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlwICs9 IHNwcmludGYocCwgIlxuIik7DQorCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0K Kwlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9BTVBEVV9RVUVVRVM7IGkrKykgew0KKwkJc3Ry ZWFtID0gJnByaXYtPmFtcGR1W2ldOw0KKwkJcCArPSBzcHJpbnRmKHAsICJzdHJlYW06ICVkXG4i LCBpKTsNCisJCXAgKz0gc3ByaW50ZihwLCAiaWR4OiAldVxuIiwgc3RyZWFtLT5pZHgpOw0KKwkJ cCArPSBzcHJpbnRmKHAsICJzdGF0ZTogJXVcbiIsIHN0cmVhbS0+c3RhdGUpOw0KKwkJaWYgKHN0 cmVhbS0+c3RhKSB7DQorCQkJcCArPSBwcmludF9tYWNfYWRkcihwLCBzdHJlYW0tPnN0YS0+YWRk cik7DQorCQkJcCArPSBzcHJpbnRmKHAsICJ0aWQ6ICV1XG4iLCBzdHJlYW0tPnRpZCk7DQorCQl9 DQorCX0NCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCisJcCArPSBzcHJp bnRmKHAsICJcbiIpOw0KKw0KKwlyZXQgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBj b3VudCwgcHBvcywgKGNoYXIgKilwYWdlLA0KKwkJCQkgICAgICAodW5zaWduZWQgbG9uZylwIC0g cGFnZSk7DQorCWZyZWVfcGFnZShwYWdlKTsNCisNCisJcmV0dXJuIHJldDsNCit9DQorDQorc3Rh dGljIGludCBtd2xfZGVidWdmc19yZWdfYWNjZXNzKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwgYm9v bCB3cml0ZSkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcHJpdi0+aHc7DQorCXU4 IHNldDsNCisJdTMyICphZGRyX3ZhbDsNCisJaW50IHJldCA9IDA7DQorDQorCXNldCA9IHdyaXRl ID8gV0xfU0VUIDogV0xfR0VUOw0KKw0KKwlzd2l0Y2ggKHByaXYtPnJlZ190eXBlKSB7DQorCWNh c2UgTVdMX0FDQ0VTU19BRERSMDoNCisJCWlmIChzZXQgPT0gV0xfR0VUKQ0KKwkJCXByaXYtPnJl Z192YWx1ZSA9DQorCQkJCXJlYWRsKHByaXYtPmlvYmFzZTAgKyBwcml2LT5yZWdfb2Zmc2V0KTsN CisJCWVsc2UNCisJCQl3cml0ZWwocHJpdi0+cmVnX3ZhbHVlLA0KKwkJCSAgICAgICBwcml2LT5p b2Jhc2UwICsgcHJpdi0+cmVnX29mZnNldCk7DQorCQlicmVhazsNCisJY2FzZSBNV0xfQUNDRVNT X0FERFIxOg0KKwkJaWYgKHNldCA9PSBXTF9HRVQpDQorCQkJcHJpdi0+cmVnX3ZhbHVlID0NCisJ CQkJcmVhZGwocHJpdi0+aW9iYXNlMSArIHByaXYtPnJlZ19vZmZzZXQpOw0KKwkJZWxzZQ0KKwkJ CXdyaXRlbChwcml2LT5yZWdfdmFsdWUsDQorCQkJICAgICAgIHByaXYtPmlvYmFzZTEgKyBwcml2 LT5yZWdfb2Zmc2V0KTsNCisJCWJyZWFrOw0KKwljYXNlIE1XTF9BQ0NFU1NfQUREUjoNCisJCWFk ZHJfdmFsID0ga21hbGxvYyg2NCAqIHNpemVvZih1MzIpLCBHRlBfS0VSTkVMKTsNCisJCWlmIChh ZGRyX3ZhbCkgew0KKwkJCW1lbXNldChhZGRyX3ZhbCwgMCwgNjQgKiBzaXplb2YodTMyKSk7DQor CQkJYWRkcl92YWxbMF0gPSBwcml2LT5yZWdfdmFsdWU7DQorCQkJcmV0ID0gbXdsX2Z3Y21kX2dl dF9hZGRyX3ZhbHVlKGh3LCBwcml2LT5yZWdfb2Zmc2V0LA0KKwkJCQkJCSAgICAgICA0LCBhZGRy X3ZhbCwgc2V0KTsNCisJCQlpZiAoKCFyZXQpICYmIChzZXQgPT0gV0xfR0VUKSkNCisJCQkJcHJp di0+cmVnX3ZhbHVlID0gYWRkcl92YWxbMF07DQorCQkJa2ZyZWUoYWRkcl92YWwpOw0KKwkJfSBl bHNlIHsNCisJCQlyZXQgPSAtRU5PTUVNOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQor CQlyZXQgPSAtRUlOVkFMOw0KKwkJYnJlYWs7DQorCX0NCisNCisJcmV0dXJuIHJldDsNCit9DQor DQorc3RhdGljIHNzaXplX3QgbXdsX2RlYnVnZnNfcmVncmR3cl9yZWFkKHN0cnVjdCBmaWxlICpm aWxlLCBjaGFyIF9fdXNlciAqdWJ1ZiwNCisJCQkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9z KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUt PnByaXZhdGVfZGF0YTsNCisJdW5zaWduZWQgbG9uZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdG UF9LRVJORUwpOw0KKwljaGFyICpidWYgPSAoY2hhciAqKWFkZHI7DQorCWludCBwb3MgPSAwLCBy ZXQgPSAwOw0KKw0KKwlpZiAoIWJ1ZikNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlpZiAoIXBy aXYtPnJlZ190eXBlKSB7DQorCQkvKiBObyBjb21tYW5kIGhhcyBiZWVuIGdpdmVuICovDQorCQlw b3MgKz0gc25wcmludGYoYnVmLCBQQUdFX1NJWkUsICIwIik7DQorCQlnb3RvIG5vbmU7DQorCX0N CisNCisJLyogU2V0IGNvbW1hbmQgaGFzIGJlZW4gZ2l2ZW4gKi8NCisJaWYgKHByaXYtPnJlZ192 YWx1ZSAhPSBVSU5UX01BWCkgew0KKwkJcmV0ID0gbXdsX2RlYnVnZnNfcmVnX2FjY2Vzcyhwcml2 LCB0cnVlKTsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKwkvKiBHZXQgY29tbWFuZCBoYXMgYmVlbiBn aXZlbiAqLw0KKwlyZXQgPSBtd2xfZGVidWdmc19yZWdfYWNjZXNzKHByaXYsIGZhbHNlKTsNCisN Citkb25lOg0KKwlpZiAoIXJldCkNCisJCXBvcyArPSBzbnByaW50ZihidWYsIFBBR0VfU0laRSwg IiV1IDB4JTA4eCAweCUwOHhcbiIsDQorCQkJCXByaXYtPnJlZ190eXBlLCBwcml2LT5yZWdfb2Zm c2V0LA0KKwkJCQlwcml2LT5yZWdfdmFsdWUpOw0KKwllbHNlDQorCQlwb3MgKz0gc25wcmludGYo YnVmLCBQQUdFX1NJWkUsICJlcnJvcjogJWQoJXUgMHglMDh4IDB4JTA4eClcbiIsDQorCQkJCXJl dCwgcHJpdi0+cmVnX3R5cGUsIHByaXYtPnJlZ19vZmZzZXQsDQorCQkJCXByaXYtPnJlZ192YWx1 ZSk7DQorDQorCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNvdW50LCBwcG9z LCBidWYsIHBvcyk7DQorDQorbm9uZToNCisNCisJZnJlZV9wYWdlKGFkZHIpOw0KKwlyZXR1cm4g cmV0Ow0KK30NCisNCitzdGF0aWMgc3NpemVfdCBtd2xfZGVidWdmc19yZWdyZHdyX3dyaXRlKHN0 cnVjdCBmaWxlICpmaWxlLA0KKwkJCQkJIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLA0KKwkJCQkJ IHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2 ID0gKHN0cnVjdCBtd2xfcHJpdiAqKWZpbGUtPnByaXZhdGVfZGF0YTsNCisJdW5zaWduZWQgbG9u ZyBhZGRyID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KKwljaGFyICpidWYgPSAoY2hh ciAqKWFkZHI7DQorCXNpemVfdCBidWZfc2l6ZSA9IG1pbl90KHNpemVfdCwgY291bnQsIFBBR0Vf U0laRSAtIDEpOw0KKwlpbnQgcmV0Ow0KKwl1MzIgcmVnX3R5cGUgPSAwLCByZWdfb2Zmc2V0ID0g MCwgcmVnX3ZhbHVlID0gVUlOVF9NQVg7DQorDQorCWlmICghYnVmKQ0KKwkJcmV0dXJuIC1FTk9N RU07DQorDQorCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVidWYsIGJ1Zl9zaXplKSkgew0KKwkJ cmV0ID0gLUVGQVVMVDsNCisJCWdvdG8gZG9uZTsNCisJfQ0KKw0KKwlyZXQgPSBzc2NhbmYoYnVm LCAiJXUgJXggJXgiLCAmcmVnX3R5cGUsICZyZWdfb2Zmc2V0LCAmcmVnX3ZhbHVlKTsNCisNCisJ aWYgKCFyZWdfdHlwZSkgew0KKwkJcmV0ID0gLUVJTlZBTDsNCisJCWdvdG8gZG9uZTsNCisJfSBl bHNlIHsNCisJCXByaXYtPnJlZ190eXBlID0gcmVnX3R5cGU7DQorCQlwcml2LT5yZWdfb2Zmc2V0 ID0gcmVnX29mZnNldDsNCisJCXByaXYtPnJlZ192YWx1ZSA9IHJlZ192YWx1ZTsNCisJCXJldCA9 IGNvdW50Ow0KKwl9DQorZG9uZToNCisNCisJZnJlZV9wYWdlKGFkZHIpOw0KKwlyZXR1cm4gcmV0 Ow0KK30NCisNCitNV0xXSUZJX0RFQlVHRlNfRklMRV9SRUFEX09QUyhpbmZvKTsNCitNV0xXSUZJ X0RFQlVHRlNfRklMRV9SRUFEX09QUyh2aWYpOw0KK01XTFdJRklfREVCVUdGU19GSUxFX1JFQURf T1BTKHN0YSk7DQorTVdMV0lGSV9ERUJVR0ZTX0ZJTEVfUkVBRF9PUFMoYW1wZHUpOw0KK01XTFdJ RklfREVCVUdGU19GSUxFX09QUyhyZWdyZHdyKTsNCisNCit2b2lkIG13bF9kZWJ1Z2ZzX2luaXQo c3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBo dy0+cHJpdjsNCisNCisJaWYgKCFwcml2LT5kZWJ1Z2ZzX3BoeSkNCisJCXByaXYtPmRlYnVnZnNf cGh5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJtd2x3aWZpIiwNCisJCQkJCQkgICAgICAgaHctPndp cGh5LT5kZWJ1Z2ZzZGlyKTsNCisNCisJaWYgKCFwcml2LT5kZWJ1Z2ZzX3BoeSkNCisJCXJldHVy bjsNCisNCisJTVdMV0lGSV9ERUJVR0ZTX0FERF9GSUxFKGluZm8pOw0KKwlNV0xXSUZJX0RFQlVH RlNfQUREX0ZJTEUodmlmKTsNCisJTVdMV0lGSV9ERUJVR0ZTX0FERF9GSUxFKHN0YSk7DQorCU1X TFdJRklfREVCVUdGU19BRERfRklMRShhbXBkdSk7DQorCU1XTFdJRklfREVCVUdGU19BRERfRklM RShyZWdyZHdyKTsNCit9DQorDQordm9pZCBtd2xfZGVidWdmc19yZW1vdmUoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisN CisJZGVidWdmc19yZW1vdmUocHJpdi0+ZGVidWdmc19waHkpOw0KKwlwcml2LT5kZWJ1Z2ZzX3Bo eSA9IE5VTEw7DQorfQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv bXdsd2lmaS9kZWJ1Z2ZzLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv ZGVidWdmcy5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZGZjMmEzYw0K LS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZp L2RlYnVnZnMuaA0KQEAgLTAsMCArMSwyNCBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2 LTIwMTUsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJl IGZpbGUgKHRoZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25h bA0KKyAqIEx0ZC4gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkg dXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRh bmNlIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkg b2Ygd2hpY2gNCisgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2Fy ZSBGb3VuZGF0aW9uLCBJbmMuDQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1J UywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FS UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UNCisgKiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRl cyBhZGRpdGlvbmFsIGRldGFpbHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIu DQorICovDQorDQorLyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyBkZWJ1ZyBmcyBy ZWxhdGVkIGZ1bmN0aW9ucy4gKi8NCisNCisjaWZuZGVmIF9kZWJ1Z2ZzX2hfDQorI2RlZmluZSBf ZGVidWdmc19oXw0KKw0KK3ZvaWQgbXdsX2RlYnVnZnNfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodyk7DQordm9pZCBtd2xfZGVidWdmc19yZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcp Ow0KKw0KKyNlbmRpZiAvKiBfZGVidWdmc19oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0 L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9kZXYuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h cnZlbGwvbXdsd2lmaS9kZXYuaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAu LjM3MGQzYzANCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl bGwvbXdsd2lmaS9kZXYuaA0KQEAgLTAsMCArMSw0NzcgQEANCisvKg0KKyAqIENvcHlyaWdodCAo QykgMjAwNi0yMDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBz b2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVy bmF0aW9uYWwNCisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZ b3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICog YWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwg YSBjb3B5IG9mIHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUg U29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVU RUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBM SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2Ug cHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNj bGFpbWVyLg0KKyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZGV2 aWNlIHJlbGF0ZWQgaW5mb3JtYXRpb24uICovDQorDQorI2lmbmRlZiBfZGV2X2hfDQorI2RlZmlu ZSBfZGV2X2hfDQorDQorI2luY2x1ZGUgPGxpbnV4L3ZlcnNpb24uaD4NCisjaW5jbHVkZSA8bGlu dXgvaW50ZXJydXB0Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPg0KKyNpbmNsdWRlIDxsaW51 eC9maXJtd2FyZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPg0KKyNpbmNsdWRlIDxsaW51 eC9iaXRvcHMuaD4NCisjaW5jbHVkZSA8bmV0L21hYzgwMjExLmg+DQorDQorI2RlZmluZSBNV0xf RFJWX05BTUUgICAgIEtCVUlMRF9NT0ROQU1FDQorI2RlZmluZSBNV0xfRFJWX1ZFUlNJT04JICIx MC4zLjAuMTQiDQorDQorLyogTWFwIHRvIDB4ODAwMDAwMDAgKEJ1cyBjb250cm9sKSBvbiBCQVIw ICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0gyQV9JTlRFUlJVUFRfRVZFTlRTICAgICAgMHgwMDAw MEMxOCAvKiAoRnJvbSBob3N0IHRvIEFSTSkgKi8NCisjZGVmaW5lIE1BQ1JFR19SRUdfSDJBX0lO VEVSUlVQVF9DQVVTRSAgICAgICAweDAwMDAwQzFDIC8qIChGcm9tIGhvc3QgdG8gQVJNKSAqLw0K KyNkZWZpbmUgTUFDUkVHX1JFR19IMkFfSU5URVJSVVBUX01BU0sgICAgICAgIDB4MDAwMDBDMjAg LyogKEZyb20gaG9zdCB0byBBUk0pICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0gyQV9JTlRFUlJV UFRfQ0xFQVJfU0VMICAgMHgwMDAwMEMyNCAvKiAoRnJvbSBob3N0IHRvIEFSTSkgKi8NCisjZGVm aW5lIE1BQ1JFR19SRUdfSDJBX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyAweDAwMDAwQzI4IC8qIChG cm9tIGhvc3QgdG8gQVJNKSAqLw0KKw0KKyNkZWZpbmUgTUFDUkVHX1JFR19BMkhfSU5URVJSVVBU X0VWRU5UUyAgICAgIDB4MDAwMDBDMkMgLyogKEZyb20gQVJNIHRvIGhvc3QpICovDQorI2RlZmlu ZSBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0FVU0UgICAgICAgMHgwMDAwMEMzMCAvKiAoRnJv bSBBUk0gdG8gaG9zdCkgKi8NCisjZGVmaW5lIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNL ICAgICAgICAweDAwMDAwQzM0IC8qIChGcm9tIEFSTSB0byBob3N0KSAqLw0KKyNkZWZpbmUgTUFD UkVHX1JFR19BMkhfSU5URVJSVVBUX0NMRUFSX1NFTCAgIDB4MDAwMDBDMzggLyogKEZyb20gQVJN IHRvIGhvc3QpICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfU1RBVFVTX01B U0sgMHgwMDAwMEMzQyAvKiAoRnJvbSBBUk0gdG8gaG9zdCkgKi8NCisNCisvKiBNYXAgdG8gMHg4 MDAwMDAwMCBvbiBCQVIxICovDQorI2RlZmluZSBNQUNSRUdfUkVHX0dFTl9QVFIgICAgICAgICAg ICAgICAgICAweDAwMDAwQzEwDQorI2RlZmluZSBNQUNSRUdfUkVHX0lOVF9DT0RFICAgICAgICAg ICAgICAgICAweDAwMDAwQzE0DQorDQorLyogQml0IGRlZmluaXRpb24gZm9yIE1BQ1JFR19SRUdf QTJIX0lOVEVSUlVQVF9DQVVTRSAoQTJIUklDKSAqLw0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19C SVRfVFhfRE9ORSAgICAgICAgICAgQklUKDApDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9S WF9SRFkgICAgICAgICAgICBCSVQoMSkNCisjZGVmaW5lIE1BQ1JFR19BMkhSSUNfQklUX09QQ19E T05FICAgICAgICAgIEJJVCgyKQ0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfTUFDX0VWRU5U ICAgICAgICAgQklUKDMpDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9SWF9QUk9CTEVNICAg ICAgICBCSVQoNCkNCisjZGVmaW5lIE1BQ1JFR19BMkhSSUNfQklUX1JBRElPX09GRiAgICAgICAg IEJJVCg1KQ0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfUkFESU9fT04gICAgICAgICAgQklU KDYpDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9SQURBUl9ERVRFQ1QgICAgICBCSVQoNykN CisjZGVmaW5lIE1BQ1JFR19BMkhSSUNfQklUX0lDVl9FUlJPUiAgICAgICAgIEJJVCg4KQ0KKyNk ZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfV0VBS0lWX0VSUk9SICAgICAgQklUKDkpDQorI2RlZmlu ZSBNQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1QVFkgICAgICAgICBCSVQoMTApDQorI2RlZmluZSBN QUNSRUdfQTJIUklDX0JJVF9RVUVfRlVMTCAgICAgICAgICBCSVQoMTEpDQorI2RlZmluZSBNQUNS RUdfQTJIUklDX0JJVF9DSEFOX1NXSVRDSCAgICAgICBCSVQoMTIpDQorI2RlZmluZSBNQUNSRUdf QTJIUklDX0JJVF9UWF9XQVRDSERPRyAgICAgICBCSVQoMTMpDQorI2RlZmluZSBNQUNSRUdfQTJI UklDX0JBX1dBVENIRE9HICAgICAgICAgICBCSVQoMTQpDQorLyogMTUgdGFrZW4gYnkgSVNSX1RY QUNLICovDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0JJVF9TU1VfRE9ORSAgICAgICAgICBCSVQo MTYpDQorI2RlZmluZSBNQUNSRUdfQTJIUklDX0NPTlNFQ19UWEZBSUwgICAgICAgICBCSVQoMTcp DQorDQorI2RlZmluZSBJU1JfU1JDX0JJVFMgICAgICAgIChNQUNSRUdfQTJIUklDX0JJVF9SWF9S RFkgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJVF9UWF9ET05FIHwgXA0KKwkJCSAgICAg TUFDUkVHX0EySFJJQ19CSVRfT1BDX0RPTkUgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJ VF9NQUNfRVZFTlQgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJVF9XRUFLSVZfRVJST1Ig fCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklDX0JJVF9JQ1ZfRVJST1IgfCBcDQorCQkJICAgICBN QUNSRUdfQTJIUklDX0JJVF9TU1VfRE9ORSB8IFwNCisJCQkgICAgIE1BQ1JFR19BMkhSSUNfQklU X1JBREFSX0RFVEVDVCB8IFwNCisJCQkgICAgIE1BQ1JFR19BMkhSSUNfQklUX0NIQU5fU1dJVENI IHwgXA0KKwkJCSAgICAgTUFDUkVHX0EySFJJQ19CSVRfVFhfV0FUQ0hET0cgfCBcDQorCQkJICAg ICBNQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1QVFkgfCBcDQorCQkJICAgICBNQUNSRUdfQTJIUklD X0JBX1dBVENIRE9HIHwgXA0KKwkJCSAgICAgTUFDUkVHX0EySFJJQ19DT05TRUNfVFhGQUlMKQ0K Kw0KKyNkZWZpbmUgTUFDUkVHX0EySFJJQ19CSVRfTUFTSyAgICAgIElTUl9TUkNfQklUUw0KKw0K Ky8qIEJpdCBkZWZpbml0aW9uIGZvciBNQUNSRUdfUkVHX0gyQV9JTlRFUlJVUFRfQ0FVU0UgKEgy QVJJQykgKi8NCisjZGVmaW5lIE1BQ1JFR19IMkFSSUNfQklUX1BQQV9SRUFEWSAgICAgICAgIEJJ VCgwKQ0KKyNkZWZpbmUgTUFDUkVHX0gyQVJJQ19CSVRfRE9PUl9CRUxMICAgICAgICAgQklUKDEp DQorI2RlZmluZSBNQUNSRUdfSDJBUklDX0JJVF9QUyAgICAgICAgICAgICAgICBCSVQoMikNCisj ZGVmaW5lIE1BQ1JFR19IMkFSSUNfQklUX1BTUE9MTCAgICAgICAgICAgIEJJVCgzKQ0KKyNkZWZp bmUgSVNSX1JFU0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgQklUKDE1KQ0KKyNkZWZpbmUg SVNSX1JFU0VUX0FQMzMgICAgICAgICAgICAgICAgICAgICAgQklUKDI2KQ0KKw0KKy8qIERhdGEg ZGVzY3JpcHRvciByZWxhdGVkIGNvbnN0YW50cyAqLw0KKyNkZWZpbmUgRUFHTEVfUlhEX0NUUkxf RFJJVkVSX09XTiAgICAgICAgICAgMHgwMA0KKyNkZWZpbmUgRUFHTEVfUlhEX0NUUkxfRE1BX09X TiAgICAgICAgICAgICAgMHg4MA0KKw0KKyNkZWZpbmUgRUFHTEVfUlhEX1NUQVRVU19PSyAgICAg ICAgICAgICAgICAgMHgwMQ0KKw0KKyNkZWZpbmUgRUFHTEVfVFhEX1NUQVRVU19JRExFICAgICAg ICAgICAgICAgMHgwMDAwMDAwMA0KKyNkZWZpbmUgRUFHTEVfVFhEX1NUQVRVU19PSyAgICAgICAg ICAgICAgICAgMHgwMDAwMDAwMQ0KKyNkZWZpbmUgRUFHTEVfVFhEX1NUQVRVU19GV19PV05FRCAg ICAgICAgICAgMHg4MDAwMDAwMA0KKw0KKy8qIEFudGVubmEgY29udHJvbCAqLw0KKyNkZWZpbmUg QU5URU5OQV9UWF80X0FVVE8gICAgICAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgQU5URU5OQV9U WF8yICAgICAgICAgICAgICAgICAgICAgICAgMw0KKyNkZWZpbmUgQU5URU5OQV9SWF80X0FVVE8g ICAgICAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgQU5URU5OQV9SWF8yICAgICAgICAgICAgICAg ICAgICAgICAgMg0KKw0KKy8qIEJhbmQgcmVsYXRlZCBjb25zdGFudHMgKi8NCisjZGVmaW5lIEJB TkRfMjRfQ0hBTk5FTF9OVU0gICAgICAgICAgICAgICAgIDE0DQorI2RlZmluZSBCQU5EXzI0X1JB VEVfTlVNICAgICAgICAgICAgICAgICAgICAxMw0KKyNkZWZpbmUgQkFORF81MF9DSEFOTkVMX05V TSAgICAgICAgICAgICAgICAgMjQNCisjZGVmaW5lIEJBTkRfNTBfUkFURV9OVU0gICAgICAgICAg ICAgICAgICAgIDgNCisNCisvKiB2aWYgYW5kIHN0YXRpb24gKi8NCisjZGVmaW5lIE5VTV9XRVBf S0VZUyAgICAgICAgICAgICAgICAgICAgICAgIDQNCisjZGVmaW5lIE1XTF9NQVhfVElEICAgICAg ICAgICAgICAgICAgICAgICAgIDgNCisjZGVmaW5lIE1XTF9BTVNEVV9TSVpFXzRLICAgICAgICAg ICAgICAgICAgIDANCisjZGVmaW5lIE1XTF9BTVNEVV9TSVpFXzhLICAgICAgICAgICAgICAgICAg IDENCisNCisvKiBwb3dlciBpbml0ICovDQorI2RlZmluZSBNV0xfUE9XRVJfSU5JVF8xICAgICAg ICAgICAgICAgICAgICAxDQorI2RlZmluZSBNV0xfUE9XRVJfSU5JVF8yICAgICAgICAgICAgICAg ICAgICAyDQorDQorZW51bSB7DQorCU1XTDg4NjQgPSAwLA0KKwlNV0w4ODk3LA0KKwlNV0xVTktO T1dOLA0KK307DQorDQorZW51bSB7DQorCUFQX01PREVfMTFBQyA9IDB4MTAsICAgICAgICAgLyog Z2VuZXJpYyAxMWFjIGluZGljYXRpb24gbW9kZSAqLw0KKwlBUF9NT0RFXzJfNEdIWl8xMUFDX01J WEVEID0gMHgxNywNCit9Ow0KKw0KK2VudW0gew0KKwlBTVBEVV9OT19TVFJFQU0sDQorCUFNUERV X1NUUkVBTV9ORVcsDQorCUFNUERVX1NUUkVBTV9JTl9QUk9HUkVTUywNCisJQU1QRFVfU1RSRUFN X0FDVElWRSwNCit9Ow0KKw0KK3N0cnVjdCBtd2xfY2hpcF9pbmZvIHsNCisJY29uc3QgY2hhciAq cGFydF9uYW1lOw0KKwljb25zdCBjaGFyICpmd19pbWFnZTsNCisJaW50IGFudGVubmFfdHg7DQor CWludCBhbnRlbm5hX3J4Ow0KK307DQorDQorc3RydWN0IG13bF90eF9wd3JfdGJsIHsNCisJdTgg Y2hhbm5lbDsNCisJdTggc2V0Y2FwOw0KKwl1MTYgdHhhbnRlbm5hMjsNCisJdTE2IHR4X3Bvd2Vy W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOw0KKwlib29sIGNkZDsNCit9Ow0KKw0KK3N0 cnVjdCBtd2xfaHdfZGF0YSB7DQorCXUzMiBmd19yZWxlYXNlX251bTsgICAgICAgICAgLyogTWFq TmJyOk1pbk5icjpTdWJNaW46UGF0Y2hMZXZlbCAqLw0KKwl1OCBod192ZXJzaW9uOyAgICAgICAg ICAgICAgIC8qIHBsYWluIG51bWJlciBpbmRpY2F0aW5nIHZlcnNpb24gKi8NCisJdTggaG9zdF9p bnRlcmZhY2U7ICAgICAgICAgICAvKiBwbGFpbiBudW1iZXIgb2YgaW50ZXJmYWNlICAgICAgICov DQorCXUxNiBtYXhfbnVtX3R4X2Rlc2M7ICAgICAgICAgLyogbWF4IG51bWJlciBvZiBUWCBkZXNj cmlwdG9ycyAgICAqLw0KKwl1MTYgbWF4X251bV9tY19hZGRyOyAgICAgICAgIC8qIG1heCBudW1i ZXIgbXVsdGljYXN0IGFkZHJlc3NlcyAgKi8NCisJdTE2IG51bV9hbnRlbm5hczsgICAgICAgICAg ICAvKiBudW1iZXIgYW50ZW5uYXMgdXNlZCAgICAgICAgICAgICovDQorCXUxNiByZWdpb25fY29k ZTsgICAgICAgICAgICAgLyogcmVnaW9uIChlZy4gMHgxMCBmb3IgVVNBIEZDQykgICAqLw0KKwl1 bnNpZ25lZCBjaGFyIG1hY19hZGRyW0VUSF9BTEVOXTsgLyogd2VsbCBrbm93biAtPiBBQTpCQjpD QzpERDpFRTpGRiAqLw0KK307DQorDQorI2RlZmluZSBNV0xfVFhfUkFURV9GT1JNQVRfTUFTSyAg ICAgICAweDAwMDAwMDAzDQorI2RlZmluZSBNV0xfVFhfUkFURV9CQU5EV0lEVEhfTUFTSyAgICAw eDAwMDAwMDMwDQorI2RlZmluZSBNV0xfVFhfUkFURV9CQU5EV0lEVEhfU0hJRlQgICA0DQorI2Rl ZmluZSBNV0xfVFhfUkFURV9TSE9SVEdJX01BU0sgICAgICAweDAwMDAwMDQwDQorI2RlZmluZSBN V0xfVFhfUkFURV9TSE9SVEdJX1NISUZUICAgICA2DQorI2RlZmluZSBNV0xfVFhfUkFURV9SQVRF SURNQ1NfTUFTSyAgICAweDAwMDA3RjAwDQorI2RlZmluZSBNV0xfVFhfUkFURV9SQVRFSURNQ1Nf U0hJRlQgICA4DQorDQorc3RydWN0IG13bF90eF9kZXNjIHsNCisJdTggZGF0YV9yYXRlOw0KKwl1 OCB0eF9wcmlvcml0eTsNCisJX19sZTE2IHFvc19jdHJsOw0KKwlfX2xlMzIgcGt0X3B0cjsNCisJ X19sZTE2IHBrdF9sZW47DQorCXU4IGRlc3RfYWRkcltFVEhfQUxFTl07DQorCV9fbGUzMiBwcGh5 c19uZXh0Ow0KKwlfX2xlMzIgc2FwX3BrdF9pbmZvOw0KKwlfX2xlMzIgcmF0ZV9pbmZvOw0KKwl1 OCB0eXBlOw0KKwl1OCB4bWl0X2NvbnRyb2w7ICAgICAvKiBiaXQgMDogdXNlIHJhdGVpbmZvLCBi aXQgMTogZGlzYWJsZSBhbXBkdSAqLw0KKwlfX2xlMTYgcmVzZXJ2ZWQ7DQorCV9fbGUzMiB0Y3Bh Y2tfc247DQorCV9fbGUzMiB0Y3BhY2tfc3JjX2RzdDsNCisJX19sZTMyIHJlc2VydmVkMTsNCisJ X19sZTMyIHJlc2VydmVkMjsNCisJdTggcmVzZXJ2ZWQzWzJdOw0KKwl1OCBwYWNrZXRfaW5mbzsN CisJdTggcGFja2V0X2lkOw0KKwlfX2xlMTYgcGFja2V0X2xlbl9hbmRfcmV0cnk7DQorCV9fbGUx NiBwYWNrZXRfcmF0ZV9pbmZvOw0KKwlfX2xlMzIgcmVzZXJ2ZWQ0Ow0KKwlfX2xlMzIgc3RhdHVz Ow0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IG13bF90eF9obmRsIHsNCisJc3RydWN0IHNrX2J1 ZmYgKnBza19idWZmOw0KKwlzdHJ1Y3QgbXdsX3R4X2Rlc2MgKnBkZXNjOw0KKwlzdHJ1Y3QgbXds X3R4X2huZGwgKnBuZXh0Ow0KK307DQorDQorI2RlZmluZSBNV0xfUlhfUkFURV9GT1JNQVRfTUFT SyAgICAgICAweDAwMDcNCisjZGVmaW5lIE1XTF9SWF9SQVRFX05TU19NQVNLICAgICAgICAgIDB4 MDAxOA0KKyNkZWZpbmUgTVdMX1JYX1JBVEVfTlNTX1NISUZUICAgICAgICAgMw0KKyNkZWZpbmUg TVdMX1JYX1JBVEVfQldfTUFTSyAgICAgICAgICAgMHgwMDYwDQorI2RlZmluZSBNV0xfUlhfUkFU RV9CV19TSElGVCAgICAgICAgICA1DQorI2RlZmluZSBNV0xfUlhfUkFURV9HSV9NQVNLICAgICAg ICAgICAweDAwODANCisjZGVmaW5lIE1XTF9SWF9SQVRFX0dJX1NISUZUICAgICAgICAgIDcNCisj ZGVmaW5lIE1XTF9SWF9SQVRFX1JUX01BU0sgICAgICAgICAgIDB4RkYwMA0KKyNkZWZpbmUgTVdM X1JYX1JBVEVfUlRfU0hJRlQgICAgICAgICAgOA0KKw0KK3N0cnVjdCBtd2xfcnhfZGVzYyB7DQor CV9fbGUxNiBwa3RfbGVuOyAgICAgICAgICAgICAgLyogdG90YWwgbGVuZ3RoIG9mIHJlY2VpdmVk IGRhdGEgICAgICAqLw0KKwlfX2xlMTYgcmF0ZTsgICAgICAgICAgICAgICAgIC8qIHJlY2VpdmUg cmF0ZSBpbmZvcm1hdGlvbiAgICAgICAgICAgKi8NCisJX19sZTMyIHBwaHlzX2J1ZmZfZGF0YTsg ICAgICAvKiBwaHlzaWNhbCBhZGRyZXNzIG9mIHBheWxvYWQgZGF0YSAgICovDQorCV9fbGUzMiBw cGh5c19uZXh0OyAgICAgICAgICAgLyogcGh5c2ljYWwgYWRkcmVzcyBvZiBuZXh0IFJYIGRlc2Mg ICAqLw0KKwlfX2xlMTYgcW9zX2N0cmw7ICAgICAgICAgICAgIC8qIHJlY2VpdmVkIFFvc0N0cmwg ZmllbGQgdmFyaWFibGUgICAgKi8NCisJX19sZTE2IGh0X3NpZzI7ICAgICAgICAgICAgICAvKiBs aWtlIG5hbWUgc3RhdGVzICAgICAgICAgICAgICAgICAgICovDQorCV9fbGUzMiBod19yc3NpX2lu Zm87DQorCV9fbGUzMiBod19ub2lzZV9mbG9vcl9pbmZvOw0KKwl1OCBub2lzZV9mbG9vcjsNCisJ dTggcmVzZXJ2ZWRbM107DQorCXU4IHJzc2k7ICAgICAgICAgICAgICAgICAgICAgLyogcmVjZWl2 ZWQgc2lnbmFsIHN0cmVuZ3QgaW5kaWNhdGlvbiAqLw0KKwl1OCBzdGF0dXM7ICAgICAgICAgICAg ICAgICAgIC8qIHN0YXR1cyBmaWVsZCBjb250YWluaW5nIFVTRUQgYml0ICAgKi8NCisJdTggY2hh bm5lbDsgICAgICAgICAgICAgICAgICAvKiBjaGFubmVsIHRoaXMgcGt0IHdhcyByZWNlaXZlZCBv biAgICovDQorCXU4IHJ4X2NvbnRyb2w7ICAgICAgICAgICAgICAgLyogdGhlIGNvbnRyb2wgZWxl bWVudCBvZiB0aGUgZGVzYyAgICAqLw0KKwlfX2xlMzIgcmVzZXJ2ZWQxWzNdOw0KK30gX19wYWNr ZWQ7DQorDQorc3RydWN0IG13bF9yeF9obmRsIHsNCisJc3RydWN0IHNrX2J1ZmYgKnBza19idWZm OyAgICAvKiBhc3NvY2lhdGVkIHNrX2J1ZmYgZm9yIExpbnV4ICAgICAgICovDQorCXN0cnVjdCBt d2xfcnhfZGVzYyAqcGRlc2M7DQorCXN0cnVjdCBtd2xfcnhfaG5kbCAqcG5leHQ7DQorfTsNCisN CitzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSB7DQorCWRtYV9hZGRyX3QgcHBoeXNfdHhfcmluZzsgICAg ICAgICAgLyogcHRyIHRvIGZpcnN0IFRYIGRlc2MgKHBoeXMuKSAgICAqLw0KKwlzdHJ1Y3QgbXds X3R4X2Rlc2MgKnB0eF9yaW5nOyAgICAgIC8qIHB0ciB0byBmaXJzdCBUWCBkZXNjICh2aXJ0Likg ICAgKi8NCisJc3RydWN0IG13bF90eF9obmRsICp0eF9obmRsOw0KKwlzdHJ1Y3QgbXdsX3R4X2hu ZGwgKnBuZXh0X3R4X2huZGw7IC8qIG5leHQgVFggaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgKi8N CisJc3RydWN0IG13bF90eF9obmRsICpwc3RhbGVfdHhfaG5kbDsvKiB0aGUgc3RhbGVkIFRYIGhh bmRsZSAgICAgICAgICAgICovDQorCWRtYV9hZGRyX3QgcHBoeXNfcnhfcmluZzsgICAgICAgICAg LyogcHRyIHRvIGZpcnN0IFJYIGRlc2MgKHBoeXMuKSAgICAqLw0KKwlzdHJ1Y3QgbXdsX3J4X2Rl c2MgKnByeF9yaW5nOyAgICAgIC8qIHB0ciB0byBmaXJzdCBSWCBkZXNjICh2aXJ0LikgICAgKi8N CisJc3RydWN0IG13bF9yeF9obmRsICpyeF9obmRsOw0KKwlzdHJ1Y3QgbXdsX3J4X2huZGwgKnBu ZXh0X3J4X2huZGw7IC8qIG5leHQgUlggaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgKi8NCisJdTMy IHdjYl9iYXNlOyAgICAgICAgICAgICAgICAgICAgICAvKiBGVyBiYXNlIG9mZnNldCBmb3IgcmVn aXN0ZXJzICAgICovDQorCXUzMiByeF9kZXNjX3dyaXRlOyAgICAgICAgICAgICAgICAgLyogRlcg ZGVzY3JpcHRvciB3cml0ZSBwb3NpdGlvbiAgICAqLw0KKwl1MzIgcnhfZGVzY19yZWFkOyAgICAg ICAgICAgICAgICAgIC8qIEZXIGRlc2NyaXB0b3IgcmVhZCBwb3NpdGlvbiAgICAgKi8NCisJdTMy IHJ4X2J1Zl9zaXplOyAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgdGhlIFJYIGJ1ZmZl cnMgICAgICAgICovDQorfTsNCisNCitzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSB7DQorCXN0cnVj dCBpZWVlODAyMTFfc3RhICpzdGE7DQorCXU4IHRpZDsNCisJdTggc3RhdGU7DQorCXU4IGlkeDsN Cit9Ow0KKw0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMNCisjZGVmaW5lIE1BQ19SRUdfQUREUl9Q Q0kob2Zmc2V0KSAgICAgICgocHJpdi0+aW9iYXNlMSArIDB4QTAwMCkgKyBvZmZzZXQpDQorDQor I2RlZmluZSBNV0xfQUNDRVNTX01BQyAgICAgICAgICAgICAgICAxDQorI2RlZmluZSBNV0xfQUND RVNTX1JGICAgICAgICAgICAgICAgICAyDQorI2RlZmluZSBNV0xfQUNDRVNTX0JCUCAgICAgICAg ICAgICAgICAzDQorI2RlZmluZSBNV0xfQUNDRVNTX0NBVSAgICAgICAgICAgICAgICA0DQorI2Rl ZmluZSBNV0xfQUNDRVNTX0FERFIwICAgICAgICAgICAgICA1DQorI2RlZmluZSBNV0xfQUNDRVNT X0FERFIxICAgICAgICAgICAgICA2DQorI2RlZmluZSBNV0xfQUNDRVNTX0FERFIgICAgICAgICAg ICAgICA3DQorI2VuZGlmDQorDQorc3RydWN0IG13bF9wcml2IHsNCisJc3RydWN0IGllZWU4MDIx MV9odyAqaHc7DQorCXN0cnVjdCBmaXJtd2FyZSAqZndfdWNvZGU7DQorCWludCBjaGlwX3R5cGU7 DQorDQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqZHRfbm9kZTsNCisJc3RydWN0IGRldmljZV9ub2Rl ICpwd3Jfbm9kZTsNCisJYm9vbCBkaXNhYmxlXzJnOw0KKwlib29sIGRpc2FibGVfNWc7DQorCWlu dCBhbnRlbm5hX3R4Ow0KKwlpbnQgYW50ZW5uYV9yeDsNCisNCisJc3RydWN0IG13bF90eF9wd3Jf dGJsIHR4X3B3cl90YmxbU1lTQURQVF9NQVhfTlVNX0NIQU5ORUxTXTsNCisJYm9vbCBjZGQ7DQor CXUxNiB0eGFudGVubmEyOw0KKwl1OCBwb3dpbml0ZWQ7DQorCXUxNiBtYXhfdHhfcG93W1NZU0FE UFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOyAvKiBtYXggdHggcG93ZXIgKGRCbSkgKi8NCisJdTE2 IHRhcmdldF9wb3dlcnNbU1lTQURQVF9UWF9QT1dFUl9MRVZFTF9UT1RBTF07IC8qIHRhcmdldCBw b3dlcnMgICAqLw0KKwl1OCBjYWxfdGJsWzIwMF07DQorDQorCXN0cnVjdCBwY2lfZGV2ICpwZGV2 Ow0KKwl2b2lkIF9faW9tZW0gKmlvYmFzZTA7IC8qIE1FTSBCYXNlIEFkZHJlc3MgUmVnaXN0ZXIg MCAgKi8NCisJdm9pZCBfX2lvbWVtICppb2Jhc2UxOyAvKiBNRU0gQmFzZSBBZGRyZXNzIFJlZ2lz dGVyIDEgICovDQorCXUzMiBuZXh0X2Jhcl9udW07DQorDQorCXNwaW5sb2NrX3QgZndjbWRfbG9j azsgICAgICAgLyogZm9yIGZpcm13YXJlIGNvbW1hbmQgICAgICAgICAqLw0KKwl1bnNpZ25lZCBz aG9ydCAqcGNtZF9idWY7ICAgIC8qIHBvaW50ZXIgdG8gQ21kQnVmICh2aXJ0dWFsKSAgKi8NCisJ ZG1hX2FkZHJfdCBwcGh5c19jbWRfYnVmOyAgICAvKiBwb2ludGVyIHRvIENtZEJ1ZiAocGh5c2lj YWwpICovDQorCWJvb2wgaW5fc2VuZF9jbWQ7DQorDQorCWludCBpcnE7DQorCXN0cnVjdCBtd2xf aHdfZGF0YSBod19kYXRhOyAgLyogQWRhcHRlciBIVyBzcGVjaWZpYyBpbmZvICAgICAqLw0KKw0K KwkvKiB2YXJpb3VzIGRlc2NyaXB0b3IgZGF0YSAqLw0KKwlzcGlubG9ja190IHR4X2Rlc2NfbG9j azsgICAgIC8qIGZvciB0eCBkZXNjcmlwdG9yIGRhdGEgICAgICAgKi8NCisJc3BpbmxvY2tfdCBy eF9kZXNjX2xvY2s7ICAgICAvKiBmb3IgcnggZGVzY3JpcHRvciBkYXRhICAgICAgICovDQorCXN0 cnVjdCBtd2xfZGVzY19kYXRhIGRlc2NfZGF0YVtTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEFdOw0K KwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIHR4cVtTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEFdOw0KKwlz dHJ1Y3Qgc2tfYnVmZl9oZWFkIGRlbGF5X3E7DQorCS8qIG51bWJlciBvZiBkZXNjcmlwdG9ycyBv d25lZCBieSBmdyBhdCBhbnkgb25lIHRpbWUgKi8NCisJaW50IGZ3X2Rlc2NfY250W1NZU0FEUFRf TlVNX09GX0RFU0NfREFUQV07DQorDQorCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCB0eF90YXNrOw0K KwlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgcnhfdGFzazsNCisJc3RydWN0IHRhc2tsZXRfc3RydWN0 IHFlX3Rhc2s7DQorCWludCB0eHFfbGltaXQ7DQorCWJvb2wgaXNfdHhfc2NoZWR1bGU7DQorCWlu dCByZWN2X2xpbWl0Ow0KKwlib29sIGlzX3J4X3NjaGVkdWxlOw0KKwlib29sIGlzX3FlX3NjaGVk dWxlOw0KKwlzOCBub2lzZTsgICAgICAgICAgICAgICAgICAgIC8qIE1vc3QgcmVjZW50bHkgcmVw b3J0ZWQgbm9pc2UgaW4gZEJtICovDQorCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQg YmFuZF8yNDsNCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzXzI0W0JBTkRfMjRf Q0hBTk5FTF9OVU1dOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNfMjRbQkFORF8yNF9S QVRFX05VTV07DQorCXN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgYmFuZF81MDsNCisJ c3RydWN0IGllZWU4MDIxMV9jaGFubmVsIGNoYW5uZWxzXzUwW0JBTkRfNTBfQ0hBTk5FTF9OVU1d Ow0KKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgcmF0ZXNfNTBbQkFORF81MF9SQVRFX05VTV07DQor DQorCXUzMiBhcF9tYWNpZHNfc3VwcG9ydGVkOw0KKwl1MzIgc3RhX21hY2lkc19zdXBwb3J0ZWQ7 DQorCXUzMiBtYWNpZHNfdXNlZDsNCisJc3BpbmxvY2tfdCB2aWZfbG9jazsgICAgICAgICAvKiBm b3IgcHJpdmF0ZSBpbnRlcmZhY2UgaW5mbyAgICovDQorCXN0cnVjdCBsaXN0X2hlYWQgdmlmX2xp c3Q7ICAgLyogTGlzdCBvZiBpbnRlcmZhY2VzLiAgICAgICAgICAqLw0KKwl1MzIgcnVubmluZ19i c3NlczsgICAgICAgICAgIC8qIGJpdG1hcCBvZiBydW5uaW5nIEJTU2VzICAgICAgKi8NCisNCisJ c3BpbmxvY2tfdCBzdGFfbG9jazsgICAgICAgICAvKiBmb3IgcHJpdmF0ZSBzdGEgaW5mbyAgICAg ICAgICovDQorCXN0cnVjdCBsaXN0X2hlYWQgc3RhX2xpc3Q7ICAgLyogTGlzdCBvZiBzdGF0aW9u cyAgICAgICAgICAgICAqLw0KKw0KKwlib29sIHJhZGlvX29uOw0KKwlib29sIHJhZGlvX3Nob3J0 X3ByZWFtYmxlOw0KKwlib29sIHdtbV9lbmFibGVkOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X3F1 ZXVlX3BhcmFtcyB3bW1fcGFyYW1zW1NZU0FEUFRfVFhfV01NX1FVRVVFU107DQorDQorCS8qIEFt cGR1IHN0cmVhbSBpbmZvcm1hdGlvbiAqLw0KKwl1OCBudW1fYW1wZHVfcXVldWVzOw0KKwlzcGlu bG9ja190IHN0cmVhbV9sb2NrOyAgICAgIC8qIGZvciBhbXBkdSBzdHJlYW0gICAgICAgICAgICAg Ki8NCisJc3RydWN0IG13bF9hbXBkdV9zdHJlYW0gYW1wZHVbU1lTQURQVF9UWF9BTVBEVV9RVUVV RVNdOw0KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3Qgd2F0Y2hkb2dfYmFfaGFuZGxlOw0KKw0KKwlib29s IG1mZ19tb2RlOw0KKw0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMNCisJc3RydWN0IGRlbnRyeSAq ZGVidWdmc19waHk7DQorCXUzMiByZWdfdHlwZTsNCisJdTMyIHJlZ19vZmZzZXQ7DQorCXUzMiBy ZWdfdmFsdWU7DQorI2VuZGlmDQorfTsNCisNCitzdHJ1Y3QgYmVhY29uX2luZm8gew0KKwlib29s IHZhbGlkOw0KKwl1MTYgY2FwX2luZm87DQorCXU4IGJfcmF0ZV9zZXRbU1lTQURQVF9NQVhfREFU QV9SQVRFU19HXTsNCisJdTggb3BfcmF0ZV9zZXRbU1lTQURQVF9NQVhfREFUQV9SQVRFU19HXTsN CisJdTggaWVfbGlzdF9odFsxNDhdOw0KKwl1OCBpZV9saXN0X3ZodFsyNF07DQorCXU4ICppZV93 bW1fcHRyOw0KKwl1OCAqaWVfcnNuX3B0cjsNCisJdTggKmllX3JzbjQ4X3B0cjsNCisJdTggKmll X2h0X3B0cjsNCisJdTggKmllX3ZodF9wdHI7DQorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNI DQorCXU4ICppZV9tZXNoaWRfcHRyOw0KKwl1OCAqaWVfbWVzaGNmZ19wdHI7DQorCXU4ICppZV9t ZXNoY2hzd19wdHI7DQorI2VuZGlmDQorCXU4IGllX3dtbV9sZW47DQorCXU4IGllX3Jzbl9sZW47 DQorCXU4IGllX3JzbjQ4X2xlbjsNCisJdTggaWVfaHRfbGVuOw0KKwl1OCBpZV92aHRfbGVuOw0K KyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSA0KKwl1OCBpZV9tZXNoaWRfbGVuOw0KKwl1OCBp ZV9tZXNoY2ZnX2xlbjsNCisJdTggaWVfbWVzaGNoc3dfbGVuOw0KKyNlbmRpZg0KK307DQorDQor c3RydWN0IG13bF92aWYgew0KKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQorCWludCBtYWNpZDsg ICAgICAgLyogRmlybXdhcmUgbWFjaWQgZm9yIHRoaXMgdmlmLiAgKi8NCisJdTE2IHNlcW5vOyAg ICAgICAvKiBOb24gQU1QRFUgc2VxdWVuY2UgbnVtYmVyIGFzc2lnbmVkIGJ5IGRyaXZlci4gICov DQorCXN0cnVjdCB7ICAgICAgICAgLyogU2F2ZWQgV0VQIGtleXMgKi8NCisJCXU4IGVuYWJsZWQ7 DQorCQl1OCBrZXlbc2l6ZW9mKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYpICsgV0xBTl9LRVlf TEVOX1dFUDEwNF07DQorCX0gd2VwX2tleV9jb25mW05VTV9XRVBfS0VZU107DQorCXU4IGJzc2lk W0VUSF9BTEVOXTsgICAgICAgICAgLyogQlNTSUQgKi8NCisJdTggc3RhX21hY1tFVEhfQUxFTl07 ICAgICAgICAvKiBTdGF0aW9uIG1hYyBhZGRyZXNzICovDQorCS8qIEEgZmxhZyB0byBpbmRpY2F0 ZSBpcyBIVyBjcnlwdG8gaXMgZW5hYmxlZCBmb3IgdGhpcyBic3NpZCAqLw0KKwlib29sIGlzX2h3 X2NyeXB0b19lbmFibGVkOw0KKwkvKiBJbmRpY2F0ZSBpZiB0aGlzIGlzIHN0YXRpb24gbW9kZSAq Lw0KKwlzdHJ1Y3QgYmVhY29uX2luZm8gYmVhY29uX2luZm87DQorCXUxNiBpdjE2Ow0KKwl1MzIg aXYzMjsNCisJczgga2V5aWR4Ow0KK307DQorDQorc3RydWN0IG13bF90eF9pbmZvIHsNCisJdW5z aWduZWQgbG9uZyBzdGFydF90aW1lOw0KKwl1MzIgcGt0czsNCit9Ow0KKw0KK3N0cnVjdCBtd2xf YW1zZHVfZnJhZyB7DQorCXN0cnVjdCBza19idWZmICpza2I7DQorCXU4ICpjdXJfcG9zOw0KKwl1 bnNpZ25lZCBsb25nIGppZmZpZXM7DQorCXU4IHBhZDsNCisJdTggbnVtOw0KK307DQorDQorc3Ry dWN0IG13bF9hbXNkdV9jdHJsIHsNCisJc3RydWN0IG13bF9hbXNkdV9mcmFnIGZyYWdbU1lTQURQ VF9UWF9XTU1fUVVFVUVTXTsNCisJdTggY2FwOw0KK307DQorDQorc3RydWN0IG13bF9zdGEgew0K KwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7DQorCWJvb2wgaXNfbWVzaF9ub2RlOw0KKwlib29sIGlz X2FtcGR1X2FsbG93ZWQ7DQorCXN0cnVjdCBtd2xfdHhfaW5mbyB0eF9zdGF0c1tNV0xfTUFYX1RJ RF07DQorCWJvb2wgaXNfYW1zZHVfYWxsb3dlZDsNCisJc3BpbmxvY2tfdCBhbXNkdV9sb2NrOyAg ICAgIC8qIGZvciBhbXNkdSBhZ2dyZWdhdGlvbiAgICAgICAqLw0KKwlzdHJ1Y3QgbXdsX2Ftc2R1 X2N0cmwgYW1zZHVfY3RybDsNCisJdTE2IGl2MTY7DQorCXUzMiBpdjMyOw0KK307DQorDQorLyog RE1BIGhlYWRlciB1c2VkIGJ5IGZpcm13YXJlIGFuZCBoYXJkd2FyZS4gKi8NCitzdHJ1Y3QgbXds X2RtYV9kYXRhIHsNCisJX19sZTE2IGZ3bGVuOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2hkciB3aDsN CisJY2hhciBkYXRhWzBdOw0KK30gX19wYWNrZWQ7DQorDQorLyogVHJhbnNtaXNzaW9uIGluZm9y bWF0aW9uIHRvIHRyYW5zbWl0IGEgc29ja2V0IGJ1ZmZlci4gKi8NCitzdHJ1Y3QgbXdsX3R4X2N0 cmwgew0KKwl2b2lkICp2aWY7DQorCXZvaWQgKnN0YTsNCisJdm9pZCAqa19jb25mOw0KKwl2b2lk ICphbXNkdV9wa3RzOw0KKwl1OCB0eF9wcmlvcml0eTsNCisJdTggdHlwZTsNCisJdTE2IHFvc19j dHJsOw0KKwl1OCB4bWl0X2NvbnRyb2w7DQorfTsNCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBt d2xfdmlmICptd2xfZGV2X2dldF92aWYoY29uc3Qgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZikN Cit7DQorCXJldHVybiAoc3RydWN0IG13bF92aWYgKikmdmlmLT5kcnZfcHJpdjsNCit9DQorDQor c3RhdGljIGlubGluZSBzdHJ1Y3QgbXdsX3N0YSAqbXdsX2Rldl9nZXRfc3RhKGNvbnN0IHN0cnVj dCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlyZXR1cm4gKHN0cnVjdCBtd2xfc3RhICopJnN0 YS0+ZHJ2X3ByaXY7DQorfQ0KKw0KKy8qIERlZmluZWQgaW4gbWFjODAyMTEuYy4gKi8NCitleHRl cm4gY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgbXdsX21hYzgwMjExX29wczsNCisNCisjZW5k aWYgLyogX2Rldl9oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl bGwvbXdsd2lmaS9md2NtZC5jIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZp L2Z3Y21kLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi45M2MwYTAzDQot LS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv ZndjbWQuYw0KQEAgLTAsMCArMSwyNDIxIEBADQorLyoNCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYt MjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMgc29mdHdhcmUg ZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRlcm5hdGlvbmFs DQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAgWW91IG1heSB1 c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAqIGFjY29yZGFu Y2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBv ZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJVVEVEIEFTLUlT LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1QTElFRCBXQVJS QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNlIHByb3ZpZGVz IGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4N CisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGZpcm13YXJl IGhvc3QgY29tbWFuZCByZWxhdGVkDQorICogZnVuY3Rpb25zLg0KKyAqLw0KKw0KKyNpbmNsdWRl IDxsaW51eC9ldGhlcmRldmljZS5oPg0KKw0KKyNpbmNsdWRlICJzeXNhZHB0LmgiDQorI2luY2x1 ZGUgImRldi5oIg0KKyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJob3N0Y21kLmgiDQor DQorI2RlZmluZSBNQVhfV0FJVF9GV19DT01QTEVURV9JVEVSQVRJT05TICAgICAgICAgMjAwMA0K KyNkZWZpbmUgTUFYX1dBSVRfR0VUX0hXX1NQRUNTX0lURVJBVE9OUyAgICAgICAgIDMNCisNCitz dHJ1Y3QgY21kX2hlYWRlciB7DQorCV9fbGUxNiBjb21tYW5kOw0KKwlfX2xlMTYgbGVuOw0KK30g X19wYWNrZWQ7DQorDQorc3RhdGljIGJvb2wgbXdsX2Z3Y21kX2Noa19hZGFwdGVyKHN0cnVjdCBt d2xfcHJpdiAqcHJpdikNCit7DQorCXUzMiByZWd2YWw7DQorDQorCXJlZ3ZhbCA9IHJlYWRsKHBy aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsNCisNCisJaWYgKHJlZ3ZhbCA9PSAw eGZmZmZmZmZmKSB7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiYWRhcHRlciBkb2Vz IG5vdCBleGlzdFxuIik7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCisJcmV0dXJuIHRydWU7 DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9md2NtZF9zZW5kX2NtZChzdHJ1Y3QgbXdsX3ByaXYg KnByaXYpDQorew0KKwlpZiAocHJpdi0+bWZnX21vZGUpIHsNCisJCXN0cnVjdCBjbWRfaGVhZGVy ICpjbWRfaGRyID0NCisJCQkoc3RydWN0IGNtZF9oZWFkZXIgKikmcHJpdi0+cGNtZF9idWZbMl07 DQorCQl1MTYgbGVuID0gbGUxNl90b19jcHUoY21kX2hkci0+bGVuKTsNCisNCisJCXdyaXRlbChw cml2LT5wcGh5c19jbWRfYnVmLCBwcml2LT5pb2Jhc2UxICsgMHhjZDApOw0KKwkJd3JpdGVsKDB4 MDAsIHByaXYtPmlvYmFzZTEgKyAweGNkNCk7DQorCQl3cml0ZWwoMHgwMCwgcHJpdi0+aW9iYXNl MSArIE1BQ1JFR19SRUdfSU5UX0NPREUpOw0KKwkJd3JpdGVsKGxlbiArIDQsIHByaXYtPmlvYmFz ZTEgKyAweGM0MCk7DQorCX0NCisJd3JpdGVsKHByaXYtPnBwaHlzX2NtZF9idWYsIHByaXYtPmlv YmFzZTEgKyBNQUNSRUdfUkVHX0dFTl9QVFIpOw0KKwl3cml0ZWwoTUFDUkVHX0gyQVJJQ19CSVRf RE9PUl9CRUxMLA0KKwkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfSDJBX0lOVEVS UlVQVF9FVkVOVFMpOw0KK30NCisNCitzdGF0aWMgY2hhciAqbXdsX2Z3Y21kX2dldF9jbWRfc3Ry aW5nKHVuc2lnbmVkIHNob3J0IGNtZCkNCit7DQorCWludCBtYXhfZW50cmllcyA9IDA7DQorCWlu dCBjdXJyX2NtZCA9IDA7DQorDQorCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgew0KKwkJdTE2IGNtZDsN CisJCWNoYXIgKmNtZF9zdHJpbmc7DQorCX0gY21kc1tdID0gew0KKwkJeyBIT1NUQ01EX0NNRF9H RVRfSFdfU1BFQywgIkdldEh3U3BlY2lmaWNhdGlvbnMiIH0sDQorCQl7IEhPU1RDTURfQ01EX1NF VF9IV19TUEVDLCAiU2V0SHdTZXBjaWZpY2F0aW9ucyIgfSwNCisJCXsgSE9TVENNRF9DTURfODAy XzExX0dFVF9TVEFULCAiODAyMTFHZXRTdGF0IiB9LA0KKwkJeyBIT1NUQ01EX0NNRF84MDJfMTFf UkFESU9fQ09OVFJPTCwgIjgwMjExUmFkaW9Db250cm9sIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF9N RU1fQUREUl9BQ0NFU1MsICJNRU1BZGRyQWNjZXNzIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF84MDJf MTFfVFhfUE9XRVIsICI4MDIxMVR4UG93ZXIiIH0sDQorCQl7IEhPU1RDTURfQ01EXzgwMl8xMV9S Rl9BTlRFTk5BLCAiODAyMTFSZkFudGVubmEiIH0sDQorCQl7IEhPU1RDTURfQ01EX0JST0FEQ0FT VF9TU0lEX0VOQUJMRSwgImJyb2FkY2FzdF9zc2lkX2VuYWJsZSIgfSwNCisJCXsgSE9TVENNRF9D TURfU0VUX1JGX0NIQU5ORUwsICJTZXRSZkNoYW5uZWwiIH0sDQorCQl7IEhPU1RDTURfQ01EX1NF VF9BSUQsICJTZXRBaWQiIH0sDQorCQl7IEhPU1RDTURfQ01EX1NFVF9JTkZSQV9NT0RFLCAiU2V0 SW5mcmFNb2RlIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF84MDJfMTFfUlRTX1RIU0QsICI4MDIxMVJ0 c1RocmVzaG9sZCIgfSwNCisJCXsgSE9TVENNRF9DTURfU0VUX0VEQ0FfUEFSQU1TLCAiU2V0RURD QVBhcmFtcyIgfSwNCisJCXsgSE9TVENNRF9DTURfU0VUX1dNTV9NT0RFLCAiU2V0V01NTW9kZSIg fSwNCisJCXsgSE9TVENNRF9DTURfSFRfR1VBUkRfSU5URVJWQUwsICJIdEd1YXJkSW50ZXJ2YWwi IH0sDQorCQl7IEhPU1RDTURfQ01EX1NFVF9GSVhFRF9SQVRFLCAiU2V0Rml4ZWRSYXRlIiB9LA0K KwkJeyBIT1NUQ01EX0NNRF9TRVRfSUVTLCAiU2V0SW5mb3JtYXRpb25FbGVtZW50cyIgfSwNCisJ CXsgSE9TVENNRF9DTURfU0VUX0xJTktBREFQVF9DU19NT0RFLCAiTGlua0FkYXB0Q3NNb2RlIiB9 LA0KKwkJeyBIT1NUQ01EX0NNRF9TRVRfTUFDX0FERFIsICJTZXRNYWNBZGRyIiB9LA0KKwkJeyBI T1NUQ01EX0NNRF9TRVRfUkFURV9BREFQVF9NT0RFLCAiU2V0UmF0ZUFkYXB0YXRpb25Nb2RlIiB9 LA0KKwkJeyBIT1NUQ01EX0NNRF9HRVRfV0FUQ0hET0dfQklUTUFQLCAiR2V0V2F0Y2hkb2dCaXRN YXAiIH0sDQorCQl7IEhPU1RDTURfQ01EX0RFTF9NQUNfQUREUiwgIkRlbE1hY0FkZHIiIH0sDQor CQl7IEhPU1RDTURfQ01EX0JTU19TVEFSVCwgIkJzc1N0YXJ0IiB9LA0KKwkJeyBIT1NUQ01EX0NN RF9BUF9CRUFDT04sICJTZXRBcEJlYWNvbiIgfSwNCisJCXsgSE9TVENNRF9DTURfU0VUX05FV19T VE4sICJTZXROZXdTdGF0aW9uIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF9TRVRfQVBNT0RFLCAiU2V0 QXBNb2RlIiB9LA0KKwkJeyBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTiwgIlVwZGF0ZUVu Y3J5cHRpb24iIH0sDQorCQl7IEhPU1RDTURfQ01EX0JBU1RSRUFNLCAiQkFTdHJlYW0iIH0sDQor CQl7IEhPU1RDTURfQ01EX1NFVF9PUFRJTUlaQVRJT05fTEVWRUwsICJTZXRPcHRpbWl6YXRpb25M ZXZlbCJ9LA0KKwkJeyBIT1NUQ01EX0NNRF9EV0RTX0VOQUJMRSwgIkR3ZHNFbmFibGUiIH0sDQor CQl7IEhPU1RDTURfQ01EX0ZXX0ZMVVNIX1RJTUVSLCAiRndGbHVzaFRpbWVyIiB9LA0KKwkJeyBI T1NUQ01EX0NNRF9TRVRfQ0RELCAiU2V0Q0REIiB9LA0KKwl9Ow0KKw0KKwltYXhfZW50cmllcyA9 IEFSUkFZX1NJWkUoY21kcyk7DQorDQorCWZvciAoY3Vycl9jbWQgPSAwOyBjdXJyX2NtZCA8IG1h eF9lbnRyaWVzOyBjdXJyX2NtZCsrKQ0KKwkJaWYgKChjbWQgJiAweDdmZmYpID09IGNtZHNbY3Vy cl9jbWRdLmNtZCkNCisJCQlyZXR1cm4gY21kc1tjdXJyX2NtZF0uY21kX3N0cmluZzsNCisNCisJ cmV0dXJuICJ1bmtub3duIjsNCit9DQorDQorc3RhdGljIGludCBtd2xfZndjbWRfd2FpdF9jb21w bGV0ZShzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHVuc2lnbmVkIHNob3J0IGNtZCkNCit7DQorCXVu c2lnbmVkIGludCBjdXJyX2l0ZXJhdGlvbiA9IE1BWF9XQUlUX0ZXX0NPTVBMRVRFX0lURVJBVElP TlM7DQorCXVuc2lnbmVkIHNob3J0IGludF9jb2RlID0gMDsNCisNCisJZG8gew0KKwkJaWYgKHBy aXYtPm1mZ19tb2RlKQ0KKwkJCWludF9jb2RlID0gbGUxNl90b19jcHUoKigoX19sZTE2ICopJnBy aXYtPnBjbWRfYnVmWzJdKSk7DQorCQllbHNlDQorCQkJaW50X2NvZGUgPSBsZTE2X3RvX2NwdSgq KChfX2xlMTYgKikmcHJpdi0+cGNtZF9idWZbMF0pKTsNCisJCW1kZWxheSgxKTsNCisJfSB3aGls ZSAoKGludF9jb2RlICE9IGNtZCkgJiYgKC0tY3Vycl9pdGVyYXRpb24pKTsNCisNCisJaWYgKGN1 cnJfaXRlcmF0aW9uID09IDApIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjbWQg MHglMDR4PSVzIHRpbWVkIG91dFxuIiwNCisJCQkgIGNtZCwgbXdsX2Z3Y21kX2dldF9jbWRfc3Ry aW5nKGNtZCkpOw0KKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgInJldHVybiBjb2RlOiAw eCUwNHhcbiIsIGludF9jb2RlKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCW1kZWxheSgz KTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX2Z3Y21kX2V4ZWNfY21k KHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwgdW5zaWduZWQgc2hvcnQgY21kKQ0KK3sNCisJYm9vbCBi dXN5ID0gZmFsc2U7DQorDQorCWlmICghbXdsX2Z3Y21kX2Noa19hZGFwdGVyKHByaXYpKSB7DQor CQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiYWRhcHRlciBkb2VzIG5vdCBleGlzdFxuIik7 DQorCQlwcml2LT5pbl9zZW5kX2NtZCA9IGZhbHNlOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisN CisJaWYgKCFwcml2LT5pbl9zZW5kX2NtZCkgew0KKwkJcHJpdi0+aW5fc2VuZF9jbWQgPSB0cnVl Ow0KKwkJbXdsX2Z3Y21kX3NlbmRfY21kKHByaXYpOw0KKwkJaWYgKG13bF9md2NtZF93YWl0X2Nv bXBsZXRlKHByaXYsIDB4ODAwMCB8IGNtZCkpIHsNCisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndp cGh5LCAidGltZW91dDogMHglMDR4XG4iLCBjbWQpOw0KKwkJCXByaXYtPmluX3NlbmRfY21kID0g ZmFsc2U7DQorCQkJcmV0dXJuIC1FSU87DQorCQl9DQorCX0gZWxzZSB7DQorCQl3aXBoeV93YXJu KHByaXYtPmh3LT53aXBoeSwNCisJCQkgICAicHJldmlvdXMgY29tbWFuZCBpcyBzdGlsbCBydW5u aW5nXG4iKTsNCisJCWJ1c3kgPSB0cnVlOw0KKwl9DQorDQorCWlmICghYnVzeSkNCisJCXByaXYt PmluX3NlbmRfY21kID0gZmFsc2U7DQorDQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50 IG13bF9md2NtZF84MDJfMTFfcmFkaW9fY29udHJvbChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsDQor CQkJCQkgIGJvb2wgZW5hYmxlLCBib29sIGZvcmNlKQ0KK3sNCisJc3RydWN0IGhvc3RjbWRfY21k XzgwMl8xMV9yYWRpb19jb250cm9sICpwY21kOw0KKw0KKwlpZiAoZW5hYmxlID09IHByaXYtPnJh ZGlvX29uICYmICFmb3JjZSkNCisJCXJldHVybiAwOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0 Y21kX2NtZF84MDJfMTFfcmFkaW9fY29udHJvbCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJ c3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAs IHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RD TURfQ01EXzgwMl8xMV9SQURJT19DT05UUk9MKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVf dG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoV0xf U0VUKTsNCisJcGNtZC0+Y29udHJvbCA9IGNwdV90b19sZTE2KHByaXYtPnJhZGlvX3Nob3J0X3By ZWFtYmxlID8NCisJCVdMX0FVVE9fUFJFQU1CTEUgOiBXTF9MT05HX1BSRUFNQkxFKTsNCisJcGNt ZC0+cmFkaW9fb24gPSBjcHVfdG9fbGUxNihlbmFibGUgPyBXTF9FTkFCTEUgOiBXTF9ESVNBQkxF KTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF84MDJfMTFf UkFESU9fQ09OVFJPTCkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN CisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJ CXJldHVybiAtRUlPOw0KKwl9DQorDQorCXByaXYtPnJhZGlvX29uID0gZW5hYmxlOw0KKw0KKwlz cGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisN CitzdGF0aWMgaW50IG13bF9md2NtZF9nZXRfdHhfcG93ZXJzKHN0cnVjdCBtd2xfcHJpdiAqcHJp diwgdTE2ICpwb3dsaXN0LCB1MTYgY2gsDQorCQkJCSAgIHUxNiBiYW5kLCB1MTYgd2lkdGgsIHUx NiBzdWJfY2gpDQorew0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX3R4X3Bvd2VyICpwY21k Ow0KKwlpbnQgaTsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX3R4X3Bv d2VyICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfODAyXzExX1RYX1BPV0VSKTsN CisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNt ZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSE9TVENNRF9BQ1RfR0VOX0dFVF9MSVNUKTsNCisJcGNt ZC0+Y2ggPSBjcHVfdG9fbGUxNihjaCk7DQorCXBjbWQtPmJ3ID0gY3B1X3RvX2xlMTYod2lkdGgp Ow0KKwlwY21kLT5iYW5kID0gY3B1X3RvX2xlMTYoYmFuZCk7DQorCXBjbWQtPnN1Yl9jaCA9IGNw dV90b19sZTE2KHN1Yl9jaCk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9T VENNRF9DTURfODAyXzExX1RYX1BPV0VSKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3 Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRp b25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IFNZU0FE UFRfVFhfUE9XRVJfTEVWRUxfVE9UQUw7IGkrKykNCisJCXBvd2xpc3RbaV0gPSBsZTE2X3RvX2Nw dShwY21kLT5wb3dlcl9sZXZlbF9saXN0W2ldKTsNCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYt PmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIGludCBtd2xfZndj bWRfc2V0X3R4X3Bvd2VycyhzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHUxNiB0eHBvd1tdLA0KKwkJ CQkgICB1OCBhY3Rpb24sIHUxNiBjaCwgdTE2IGJhbmQsDQorCQkJCSAgIHUxNiB3aWR0aCwgdTE2 IHN1Yl9jaCkNCit7DQorCXN0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfdHhfcG93ZXIgKnBjbWQ7 DQorCWludCBpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfdHhfcG93 ZXIgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ZndjbWRf bG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+ Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84MDJfMTFfVFhfUE9XRVIpOw0K KwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21k LT5hY3Rpb24gPSBjcHVfdG9fbGUxNihhY3Rpb24pOw0KKwlwY21kLT5jaCA9IGNwdV90b19sZTE2 KGNoKTsNCisJcGNtZC0+YncgPSBjcHVfdG9fbGUxNih3aWR0aCk7DQorCXBjbWQtPmJhbmQgPSBj cHVfdG9fbGUxNihiYW5kKTsNCisJcGNtZC0+c3ViX2NoID0gY3B1X3RvX2xlMTYoc3ViX2NoKTsN CisNCisJZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUw7IGkrKykN CisJCXBjbWQtPnBvd2VyX2xldmVsX2xpc3RbaV0gPSBjcHVfdG9fbGUxNih0eHBvd1tpXSk7DQor DQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfODAyXzExX1RYX1BP V0VSKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlf ZXJyKHByaXYtPmh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1F SU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwly ZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHU4IG13bF9md2NtZF9nZXRfODBtX3ByaV9jaG5sX29m ZnNldCh1OCBjaGFubmVsKQ0KK3sNCisJdTggYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFO XzA7DQorDQorCXN3aXRjaCAoY2hhbm5lbCkgew0KKwljYXNlIDM2Og0KKwkJYWN0X3ByaW1hcnkg PSBBQ1RfUFJJTUFSWV9DSEFOXzA7DQorCQlicmVhazsNCisJY2FzZSA0MDoNCisJCWFjdF9wcmlt YXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8xOw0KKwkJYnJlYWs7DQorCWNhc2UgNDQ6DQorCQlhY3Rf cHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMjsNCisJCWJyZWFrOw0KKwljYXNlIDQ4Og0KKwkJ YWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzM7DQorCQlicmVhazsNCisJY2FzZSA1MjoN CisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJYnJlYWs7DQorCWNhc2Ug NTY6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMTsNCisJCWJyZWFrOw0KKwlj YXNlIDYwOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzI7DQorCQlicmVhazsN CisJY2FzZSA2NDoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8zOw0KKwkJYnJl YWs7DQorCWNhc2UgMTAwOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzA7DQor CQlicmVhazsNCisJY2FzZSAxMDQ6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5f MTsNCisJCWJyZWFrOw0KKwljYXNlIDEwODoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllf Q0hBTl8yOw0KKwkJYnJlYWs7DQorCWNhc2UgMTEyOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJ TUFSWV9DSEFOXzM7DQorCQlicmVhazsNCisJY2FzZSAxMTY6DQorCQlhY3RfcHJpbWFyeSA9IEFD VF9QUklNQVJZX0NIQU5fMDsNCisJCWJyZWFrOw0KKwljYXNlIDEyMDoNCisJCWFjdF9wcmltYXJ5 ID0gQUNUX1BSSU1BUllfQ0hBTl8xOw0KKwkJYnJlYWs7DQorCWNhc2UgMTI0Og0KKwkJYWN0X3By aW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzI7DQorCQlicmVhazsNCisJY2FzZSAxMjg6DQorCQlh Y3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMzsNCisJCWJyZWFrOw0KKwljYXNlIDEzMjoN CisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJYnJlYWs7DQorCWNhc2Ug MTM2Og0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzE7DQorCQlicmVhazsNCisJ Y2FzZSAxNDA6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NIQU5fMjsNCisJCWJyZWFr Ow0KKwljYXNlIDE0NDoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8zOw0KKwkJ YnJlYWs7DQorCWNhc2UgMTQ5Og0KKwkJYWN0X3ByaW1hcnkgPSBBQ1RfUFJJTUFSWV9DSEFOXzA7 DQorCQlicmVhazsNCisJY2FzZSAxNTM6DQorCQlhY3RfcHJpbWFyeSA9IEFDVF9QUklNQVJZX0NI QU5fMTsNCisJCWJyZWFrOw0KKwljYXNlIDE1NzoNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1B UllfQ0hBTl8yOw0KKwkJYnJlYWs7DQorCWNhc2UgMTYxOg0KKwkJYWN0X3ByaW1hcnkgPSBBQ1Rf UFJJTUFSWV9DSEFOXzM7DQorCQlicmVhazsNCisJfQ0KKw0KKwlyZXR1cm4gYWN0X3ByaW1hcnk7 DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9md2NtZF9wYXJzZV9iZWFjb24oc3RydWN0IG13bF9w cml2ICpwcml2LA0KKwkJCQkgICBzdHJ1Y3QgbXdsX3ZpZiAqdmlmLCB1OCAqYmVhY29uLCBpbnQg bGVuKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9tZ210ICptZ210Ow0KKwlzdHJ1Y3QgYmVhY29u X2luZm8gKmJlYWNvbl9pbmZvOw0KKwlpbnQgYmFzZWxlbjsNCisJdTggKnBvczsNCisJc2l6ZV90 IGxlZnQ7DQorCWJvb2wgZWxlbV9wYXJzZV9mYWlsZWQ7DQorDQorCW1nbXQgPSAoc3RydWN0IGll ZWU4MDIxMV9tZ210ICopYmVhY29uOw0KKw0KKwliYXNlbGVuID0gKHU4ICopbWdtdC0+dS5iZWFj b24udmFyaWFibGUgLSAodTggKiltZ210Ow0KKwlpZiAoYmFzZWxlbiA+IGxlbikNCisJCXJldHVy bjsNCisNCisJYmVhY29uX2luZm8gPSAmdmlmLT5iZWFjb25faW5mbzsNCisJbWVtc2V0KGJlYWNv bl9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlYWNvbl9pbmZvKSk7DQorCWJlYWNvbl9pbmZvLT52 YWxpZCA9IGZhbHNlOw0KKwliZWFjb25faW5mby0+aWVfaHRfcHRyID0gJmJlYWNvbl9pbmZvLT5p ZV9saXN0X2h0WzBdOw0KKwliZWFjb25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+ aWVfbGlzdF92aHRbMF07DQorDQorCWJlYWNvbl9pbmZvLT5jYXBfaW5mbyA9IGxlMTZfdG9fY3B1 KG1nbXQtPnUuYmVhY29uLmNhcGFiX2luZm8pOw0KKw0KKwlwb3MgPSAodTggKiltZ210LT51LmJl YWNvbi52YXJpYWJsZTsNCisJbGVmdCA9IGxlbiAtIGJhc2VsZW47DQorDQorCWVsZW1fcGFyc2Vf ZmFpbGVkID0gZmFsc2U7DQorDQorCXdoaWxlIChsZWZ0ID49IDIpIHsNCisJCXU4IGlkLCBlbGVu Ow0KKw0KKwkJaWQgPSAqcG9zKys7DQorCQllbGVuID0gKnBvcysrOw0KKwkJbGVmdCAtPSAyOw0K Kw0KKwkJaWYgKGVsZW4gPiBsZWZ0KSB7DQorCQkJZWxlbV9wYXJzZV9mYWlsZWQgPSB0cnVlOw0K KwkJCWJyZWFrOw0KKwkJfQ0KKw0KKwkJc3dpdGNoIChpZCkgew0KKwkJY2FzZSBXTEFOX0VJRF9T VVBQX1JBVEVTOg0KKwkJY2FzZSBXTEFOX0VJRF9FWFRfU1VQUF9SQVRFUzoNCisJCQl7DQorCQkJ aW50IGlkeCwgYmksIG9pOw0KKwkJCXU4IHJhdGU7DQorDQorCQkJZm9yIChiaSA9IDA7IGJpIDwg U1lTQURQVF9NQVhfREFUQV9SQVRFU19HOw0KKwkJCSAgICAgYmkrKykgew0KKwkJCQlpZiAoYmVh Y29uX2luZm8tPmJfcmF0ZV9zZXRbYmldID09IDApDQorCQkJCQlicmVhazsNCisJCQl9DQorDQor CQkJZm9yIChvaSA9IDA7IG9pIDwgU1lTQURQVF9NQVhfREFUQV9SQVRFU19HOw0KKwkJCSAgICAg b2krKykgew0KKwkJCQlpZiAoYmVhY29uX2luZm8tPm9wX3JhdGVfc2V0W29pXSA9PSAwKQ0KKwkJ CQkJYnJlYWs7DQorCQkJfQ0KKw0KKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgZWxlbjsgaWR4Kysp IHsNCisJCQkJcmF0ZSA9IHBvc1tpZHhdOw0KKwkJCQlpZiAoKHJhdGUgJiAweDgwKSAhPSAwKSB7 DQorCQkJCQlpZiAoYmkgPCBTWVNBRFBUX01BWF9EQVRBX1JBVEVTX0cpDQorCQkJCQkJYmVhY29u X2luZm8tPmJfcmF0ZV9zZXRbYmkrK10NCisJCQkJCQkJPSByYXRlICYgMHg3ZjsNCisJCQkJCWVs c2Ugew0KKwkJCQkJCWVsZW1fcGFyc2VfZmFpbGVkID0gdHJ1ZTsNCisJCQkJCQlicmVhazsNCisJ CQkJCX0NCisJCQkJfQ0KKwkJCQlpZiAob2kgPCBTWVNBRFBUX01BWF9EQVRBX1JBVEVTX0cpDQor CQkJCQliZWFjb25faW5mby0+b3BfcmF0ZV9zZXRbb2krK10gPQ0KKwkJCQkJCXJhdGUgJiAweDdm Ow0KKwkJCQllbHNlIHsNCisJCQkJCWVsZW1fcGFyc2VfZmFpbGVkID0gdHJ1ZTsNCisJCQkJCWJy ZWFrOw0KKwkJCQl9DQorCQkJfQ0KKwkJCX0NCisJCQlicmVhazsNCisJCWNhc2UgV0xBTl9FSURf UlNOOg0KKwkJCWJlYWNvbl9pbmZvLT5pZV9yc240OF9sZW4gPSAoZWxlbiArIDIpOw0KKwkJCWJl YWNvbl9pbmZvLT5pZV9yc240OF9wdHIgPSAocG9zIC0gMik7DQorCQkJYnJlYWs7DQorCQljYXNl IFdMQU5fRUlEX0hUX0NBUEFCSUxJVFk6DQorCQljYXNlIFdMQU5fRUlEX0hUX09QRVJBVElPTjoN CisJCWNhc2UgV0xBTl9FSURfT1ZFUkxBUF9CU1NfU0NBTl9QQVJBTToNCisJCWNhc2UgV0xBTl9F SURfRVhUX0NBUEFCSUxJVFk6DQorCQkJYmVhY29uX2luZm8tPmllX2h0X2xlbiArPSAoZWxlbiAr IDIpOw0KKwkJCWlmIChiZWFjb25faW5mby0+aWVfaHRfbGVuID4NCisJCQkgICAgc2l6ZW9mKGJl YWNvbl9pbmZvLT5pZV9saXN0X2h0KSkgew0KKwkJCQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7 DQorCQkJfSBlbHNlIHsNCisJCQkJKmJlYWNvbl9pbmZvLT5pZV9odF9wdHIrKyA9IGlkOw0KKwkJ CQkqYmVhY29uX2luZm8tPmllX2h0X3B0cisrID0gZWxlbjsNCisJCQkJbWVtY3B5KGJlYWNvbl9p bmZvLT5pZV9odF9wdHIsIHBvcywgZWxlbik7DQorCQkJCWJlYWNvbl9pbmZvLT5pZV9odF9wdHIg Kz0gZWxlbjsNCisJCQl9DQorCQkJYnJlYWs7DQorI2lmZGVmIENPTkZJR19NQUM4MDIxMV9NRVNI DQorCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOg0KKwkJCWJlYWNvbl9pbmZvLT5pZV9tZXNo Y2ZnX2xlbiA9IChlbGVuICsgMik7DQorCQkJYmVhY29uX2luZm8tPmllX21lc2hjZmdfcHRyID0g KHBvcyAtIDIpOw0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXTEFOX0VJRF9NRVNIX0lEOg0KKwkJCWJl YWNvbl9pbmZvLT5pZV9tZXNoaWRfbGVuID0gKGVsZW4gKyAyKTsNCisJCQliZWFjb25faW5mby0+ aWVfbWVzaGlkX3B0ciA9IChwb3MgLSAyKTsNCisJCQlicmVhazsNCisJCWNhc2UgV0xBTl9FSURf Q0hBTl9TV0lUQ0hfUEFSQU06DQorCQkJYmVhY29uX2luZm8tPmllX21lc2hjaHN3X2xlbiA9IChl bGVuICsgMik7DQorCQkJYmVhY29uX2luZm8tPmllX21lc2hjaHN3X3B0ciA9IChwb3MgLSAyKTsN CisJCQlicmVhazsNCisjZW5kaWYNCisJCWNhc2UgV0xBTl9FSURfVkhUX0NBUEFCSUxJVFk6DQor CQljYXNlIFdMQU5fRUlEX1ZIVF9PUEVSQVRJT046DQorCQljYXNlIFdMQU5fRUlEX09QTU9ERV9O T1RJRjoNCisJCQliZWFjb25faW5mby0+aWVfdmh0X2xlbiArPSAoZWxlbiArIDIpOw0KKwkJCWlm IChiZWFjb25faW5mby0+aWVfdmh0X2xlbiA+DQorCQkJICAgIHNpemVvZihiZWFjb25faW5mby0+ aWVfbGlzdF92aHQpKSB7DQorCQkJCWVsZW1fcGFyc2VfZmFpbGVkID0gdHJ1ZTsNCisJCQl9IGVs c2Ugew0KKwkJCQkqYmVhY29uX2luZm8tPmllX3ZodF9wdHIrKyA9IGlkOw0KKwkJCQkqYmVhY29u X2luZm8tPmllX3ZodF9wdHIrKyA9IGVsZW47DQorCQkJCW1lbWNweShiZWFjb25faW5mby0+aWVf dmh0X3B0ciwgcG9zLCBlbGVuKTsNCisJCQkJYmVhY29uX2luZm8tPmllX3ZodF9wdHIgKz0gZWxl bjsNCisJCQl9DQorCQkJYnJlYWs7DQorCQljYXNlIFdMQU5fRUlEX1ZFTkRPUl9TUEVDSUZJQzoN CisJCQlpZiAoKHBvc1swXSA9PSAweDAwKSAmJiAocG9zWzFdID09IDB4NTApICYmDQorCQkJICAg IChwb3NbMl0gPT0gMHhmMikpIHsNCisJCQkJaWYgKHBvc1szXSA9PSAweDAxKSB7DQorCQkJCQli ZWFjb25faW5mby0+aWVfcnNuX2xlbiA9IChlbGVuICsgMik7DQorCQkJCQliZWFjb25faW5mby0+ aWVfcnNuX3B0ciA9IChwb3MgLSAyKTsNCisJCQkJfQ0KKw0KKwkJCQlpZiAocG9zWzNdID09IDB4 MDIpIHsNCisJCQkJCWJlYWNvbl9pbmZvLT5pZV93bW1fbGVuID0gKGVsZW4gKyAyKTsNCisJCQkJ CWJlYWNvbl9pbmZvLT5pZV93bW1fcHRyID0gKHBvcyAtIDIpOw0KKwkJCQl9DQorCQkJfQ0KKwkJ CWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlicmVhazsNCisJCX0NCisNCisJCWxlZnQgLT0gZWxl bjsNCisJCXBvcyArPSBlbGVuOw0KKwl9DQorDQorCWlmICghZWxlbV9wYXJzZV9mYWlsZWQpIHsN CisJCWJlYWNvbl9pbmZvLT5pZV9odF9wdHIgPSAmYmVhY29uX2luZm8tPmllX2xpc3RfaHRbMF07 DQorCQliZWFjb25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF92aHRb MF07DQorCQliZWFjb25faW5mby0+dmFsaWQgPSB0cnVlOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBp bnQgbXdsX2Z3Y21kX3NldF9pZXMoc3RydWN0IG13bF9wcml2ICpwcml2LCBzdHJ1Y3QgbXdsX3Zp ZiAqbXdsX3ZpZikNCit7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaWVzICpwY21kOw0KKwlz dHJ1Y3QgYmVhY29uX2luZm8gKmJlYWNvbiA9ICZtd2xfdmlmLT5iZWFjb25faW5mbzsNCisJdTE2 IGllX2xpc3RfbGVuX3Byb3ByaWV0YXJ5ID0gMDsNCisNCisJaWYgKCFiZWFjb24tPnZhbGlkKQ0K KwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWlmIChiZWFjb24tPmllX2h0X2xlbiA+IHNpemVvZihw Y21kLT5pZV9saXN0X2h0KSkNCisJCWdvdG8gZWludmFsOw0KKw0KKwlpZiAoYmVhY29uLT5pZV92 aHRfbGVuID4gc2l6ZW9mKHBjbWQtPmllX2xpc3Rfdmh0KSkNCisJCWdvdG8gZWludmFsOw0KKw0K KwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaWVzICopJnByaXYtPnBjbWRfYnVmWzBd Ow0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNt ZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xl MTYoSE9TVENNRF9DTURfU0VUX0lFUyk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xl MTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIubWFjaWQgPSBtd2xfdmlmLT5tYWNp ZDsNCisNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSE9TVENNRF9BQ1RfR0VOX1NFVCk7 DQorDQorCW1lbWNweShwY21kLT5pZV9saXN0X2h0LCBiZWFjb24tPmllX2h0X3B0ciwgYmVhY29u LT5pZV9odF9sZW4pOw0KKwlwY21kLT5pZV9saXN0X2xlbl9odCA9IGNwdV90b19sZTE2KGJlYWNv bi0+aWVfaHRfbGVuKTsNCisNCisJbWVtY3B5KHBjbWQtPmllX2xpc3Rfdmh0LCBiZWFjb24tPmll X3ZodF9wdHIsIGJlYWNvbi0+aWVfdmh0X2xlbik7DQorCXBjbWQtPmllX2xpc3RfbGVuX3ZodCA9 IGNwdV90b19sZTE2KGJlYWNvbi0+aWVfdmh0X2xlbik7DQorDQorI2lmZGVmIENPTkZJR19NQUM4 MDIxMV9NRVNIDQorCW1lbWNweShwY21kLT5pZV9saXN0X3Byb3ByaWV0YXJ5LCBiZWFjb24tPmll X21lc2hpZF9wdHIsDQorCSAgICAgICBiZWFjb24tPmllX21lc2hpZF9sZW4pOw0KKwlpZV9saXN0 X2xlbl9wcm9wcmlldGFyeSA9IGJlYWNvbi0+aWVfbWVzaGlkX2xlbjsNCisJbWVtY3B5KHBjbWQt PmllX2xpc3RfcHJvcHJpZXRhcnkgKyBpZV9saXN0X2xlbl9wcm9wcmlldGFyeSwNCisJICAgICAg IGJlYWNvbi0+aWVfbWVzaGNmZ19wdHIsIGJlYWNvbi0+aWVfbWVzaGNmZ19sZW4pOw0KKwlpZV9s aXN0X2xlbl9wcm9wcmlldGFyeSArPSBiZWFjb24tPmllX21lc2hjZmdfbGVuOw0KKwltZW1jcHko cGNtZC0+aWVfbGlzdF9wcm9wcmlldGFyeSArIGllX2xpc3RfbGVuX3Byb3ByaWV0YXJ5LA0KKwkg ICAgICAgYmVhY29uLT5pZV9tZXNoY2hzd19wdHIsIGJlYWNvbi0+aWVfbWVzaGNoc3dfbGVuKTsN CisJaWVfbGlzdF9sZW5fcHJvcHJpZXRhcnkgKz0gYmVhY29uLT5pZV9tZXNoY2hzd19sZW47DQor I2VuZGlmDQorDQorCWlmIChwcml2LT5jaGlwX3R5cGUgPT0gTVdMODg5Nykgew0KKwkJbWVtY3B5 KHBjbWQtPmllX2xpc3RfcHJvcHJpZXRhcnkgKyBpZV9saXN0X2xlbl9wcm9wcmlldGFyeSwNCisJ CSAgICAgICBiZWFjb24tPmllX3dtbV9wdHIsIGJlYWNvbi0+aWVfd21tX2xlbik7DQorCQlpZV9s aXN0X2xlbl9wcm9wcmlldGFyeSArPSBtd2xfdmlmLT5iZWFjb25faW5mby5pZV93bW1fbGVuOw0K Kwl9DQorDQorCXBjbWQtPmllX2xpc3RfbGVuX3Byb3ByaWV0YXJ5ID0gY3B1X3RvX2xlMTYoaWVf bGlzdF9sZW5fcHJvcHJpZXRhcnkpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYs IEhPU1RDTURfQ01EX1NFVF9JRVMpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRf bG9jayk7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxu Iik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+Zndj bWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KKw0KK2VpbnZhbDoNCisNCisJd2lwaHlfZXJyKHBy aXYtPmh3LT53aXBoeSwgImxlbmd0aCBvZiBJRSBpcyB0b28gbG9uZ1xuIik7DQorDQorCXJldHVy biAtRUlOVkFMOw0KK30NCisNCitzdGF0aWMgaW50IG13bF9md2NtZF9zZXRfYXBfYmVhY29uKHN0 cnVjdCBtd2xfcHJpdiAqcHJpdiwNCisJCQkJICAgc3RydWN0IG13bF92aWYgKm13bF92aWYsDQor CQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfYnNzX2NvbmYgKmJzc19jb25mKQ0KK3sNCisJc3RydWN0 IGhvc3RjbWRfY21kX2FwX2JlYWNvbiAqcGNtZDsNCisJc3RydWN0IGRzX3BhcmFtcyAqcGh5X2Rz X3BhcmFtX3NldDsNCisNCisJaWYgKCFtd2xfdmlmLT5iZWFjb25faW5mby52YWxpZCkNCisJCXJl dHVybiAtRUlOVkFMOw0KKw0KKwkvKiB3bW0gc3RydWN0dXJlIG9mIHN0YXJ0IGNvbW1hbmQgaXMg ZGVmaW5lZCBsZXNzIG9uZSBieXRlLA0KKwkgKiBkdWUgdG8gZm9sbG93aW5nIGZpZWxkIGNvdW50 cnkgaXMgbm90IHVzZWQsIGFkZCBieXRlIG9uZQ0KKwkgKiB0byBieXBhc3MgdGhlIGNoZWNrLg0K KwkgKi8NCisJaWYgKG13bF92aWYtPmJlYWNvbl9pbmZvLmllX3dtbV9sZW4gPg0KKwkgICAgKHNp emVvZihwY21kLT5zdGFydF9jbWQud21tX3BhcmFtKSArIDEpKQ0KKwkJZ290byBpZWxlbmVycjsN CisNCisJaWYgKG13bF92aWYtPmJlYWNvbl9pbmZvLmllX3Jzbl9sZW4gPiBzaXplb2YocGNtZC0+ c3RhcnRfY21kLnJzbl9pZSkpDQorCQlnb3RvIGllbGVuZXJyOw0KKw0KKwlpZiAobXdsX3ZpZi0+ YmVhY29uX2luZm8uaWVfcnNuNDhfbGVuID4NCisJICAgIHNpemVvZihwY21kLT5zdGFydF9jbWQu cnNuNDhfaWUpKQ0KKwkJZ290byBpZWxlbmVycjsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt ZF9jbWRfYXBfYmVhY29uICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgo JnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21k KSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfQVBfQkVB Q09OKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsN CisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKw0KKwlldGhlcl9hZGRy X2NvcHkocGNtZC0+c3RhcnRfY21kLnN0YV9tYWNfYWRkciwgbXdsX3ZpZi0+YnNzaWQpOw0KKwlt ZW1jcHkocGNtZC0+c3RhcnRfY21kLnNzaWQsIGJzc19jb25mLT5zc2lkLCBic3NfY29uZi0+c3Np ZF9sZW4pOw0KKwlwY21kLT5zdGFydF9jbWQuYnNzX3R5cGUgPSAxOw0KKwlwY21kLT5zdGFydF9j bWQuYmNuX3BlcmlvZCAgPSBjcHVfdG9fbGUxNihic3NfY29uZi0+YmVhY29uX2ludCk7DQorCXBj bWQtPnN0YXJ0X2NtZC5kdGltX3BlcmlvZCA9IGJzc19jb25mLT5kdGltX3BlcmlvZDsgLyogOGJp dCAqLw0KKw0KKwlwaHlfZHNfcGFyYW1fc2V0ID0gJnBjbWQtPnN0YXJ0X2NtZC5waHlfcGFyYW1f c2V0LmRzX3BhcmFtX3NldDsNCisJcGh5X2RzX3BhcmFtX3NldC0+ZWxlbV9pZCA9IFdMQU5fRUlE X0RTX1BBUkFNUzsNCisJcGh5X2RzX3BhcmFtX3NldC0+bGVuID0gc2l6ZW9mKHBoeV9kc19wYXJh bV9zZXQtPmN1cnJlbnRfY2hubCk7DQorCXBoeV9kc19wYXJhbV9zZXQtPmN1cnJlbnRfY2hubCA9 IGJzc19jb25mLT5jaGFuZGVmLmNoYW4tPmh3X3ZhbHVlOw0KKw0KKwlwY21kLT5zdGFydF9jbWQu cHJvYmVfZGVsYXkgPSBjcHVfdG9fbGUxNigxMCk7DQorCXBjbWQtPnN0YXJ0X2NtZC5jYXBfaW5m byA9IGNwdV90b19sZTE2KG13bF92aWYtPmJlYWNvbl9pbmZvLmNhcF9pbmZvKTsNCisNCisJbWVt Y3B5KCZwY21kLT5zdGFydF9jbWQud21tX3BhcmFtLCBtd2xfdmlmLT5iZWFjb25faW5mby5pZV93 bW1fcHRyLA0KKwkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVfd21tX2xlbik7DQorDQor CW1lbWNweSgmcGNtZC0+c3RhcnRfY21kLnJzbl9pZSwgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVf cnNuX3B0ciwNCisJICAgICAgIG13bF92aWYtPmJlYWNvbl9pbmZvLmllX3Jzbl9sZW4pOw0KKw0K KwltZW1jcHkoJnBjbWQtPnN0YXJ0X2NtZC5yc240OF9pZSwgbXdsX3ZpZi0+YmVhY29uX2luZm8u aWVfcnNuNDhfcHRyLA0KKwkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8uaWVfcnNuNDhfbGVu KTsNCisNCisJbWVtY3B5KHBjbWQtPnN0YXJ0X2NtZC5iX3JhdGVfc2V0LCBtd2xfdmlmLT5iZWFj b25faW5mby5iX3JhdGVfc2V0LA0KKwkgICAgICAgU1lTQURQVF9NQVhfREFUQV9SQVRFU19HKTsN CisNCisJbWVtY3B5KHBjbWQtPnN0YXJ0X2NtZC5vcF9yYXRlX3NldCwgbXdsX3ZpZi0+YmVhY29u X2luZm8ub3BfcmF0ZV9zZXQsDQorCSAgICAgICBTWVNBRFBUX01BWF9EQVRBX1JBVEVTX0cpOw0K Kw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0FQX0JFQUNPTikp IHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihw cml2LT5ody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0K Kwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJu IDA7DQorDQoraWVsZW5lcnI6DQorDQorCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJsZW5n dGggb2YgSUUgaXMgdG9vIGxvbmdcbiIpOw0KKw0KKwlyZXR1cm4gLUVJTlZBTDsNCit9DQorDQor c3RhdGljIGludCBtd2xfZndjbWRfZW5jcnlwdGlvbl9zZXRfY21kX2luZm8oc3RydWN0IGhvc3Rj bWRfY21kX3NldF9rZXkgKmNtZCwNCisJCQkJCSAgICAgdTggKmFkZHIsDQorCQkJCQkgICAgIHN0 cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkNCit7DQorCWNtZC0+Y21kX2hkci5jbWQgPSBj cHVfdG9fbGUxNihIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTik7DQorCWNtZC0+Y21kX2hk ci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKmNtZCkpOw0KKwljbWQtPmtleV9wYXJhbS5sZW5n dGggPSBjcHVfdG9fbGUxNihzaXplb2YoKmNtZCkgLQ0KKwkJb2Zmc2V0b2Yoc3RydWN0IGhvc3Rj bWRfY21kX3NldF9rZXksIGtleV9wYXJhbSkpOw0KKwljbWQtPmtleV9wYXJhbS5rZXlfaW5kZXgg PSBjcHVfdG9fbGUzMihrZXktPmtleWlkeCk7DQorCWNtZC0+a2V5X3BhcmFtLmtleV9sZW4gPSBj cHVfdG9fbGUxNihrZXktPmtleWxlbik7DQorCWV0aGVyX2FkZHJfY29weShjbWQtPmtleV9wYXJh bS5tYWNfYWRkciwgYWRkcik7DQorDQorCXN3aXRjaCAoa2V5LT5jaXBoZXIpIHsNCisJY2FzZSBX TEFOX0NJUEhFUl9TVUlURV9XRVA0MDoNCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6 DQorCQljbWQtPmtleV9wYXJhbS5rZXlfdHlwZV9pZCA9IGNwdV90b19sZTE2KEtFWV9UWVBFX0lE X1dFUCk7DQorCQlpZiAoa2V5LT5rZXlpZHggPT0gMCkNCisJCQljbWQtPmtleV9wYXJhbS5rZXlf aW5mbyA9DQorCQkJCWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfV0VQX1RYS0VZKTsNCisJCWJy ZWFrOw0KKwljYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX1RLSVA6DQorCQljbWQtPmtleV9wYXJhbS5r ZXlfdHlwZV9pZCA9IGNwdV90b19sZTE2KEtFWV9UWVBFX0lEX1RLSVApOw0KKwkJY21kLT5rZXlf cGFyYW0ua2V5X2luZm8gPQ0KKwkJCShrZXktPmZsYWdzICYgSUVFRTgwMjExX0tFWV9GTEFHX1BB SVJXSVNFKSA/DQorCQkJY3B1X3RvX2xlMzIoRU5DUl9LRVlfRkxBR19QQUlSV0lTRSkgOg0KKwkJ CWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfVFhHUk9VUEtFWSk7DQorCQljbWQtPmtleV9wYXJh bS5rZXlfaW5mbyB8PQ0KKwkJCWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfTUlDS0VZX1ZBTElE IHwNCisJCQkJICAgICAgRU5DUl9LRVlfRkxBR19UU0NfVkFMSUQpOw0KKwkJYnJlYWs7DQorCWNh c2UgV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUDoNCisJCWNtZC0+a2V5X3BhcmFtLmtleV90eXBlX2lk ID0gY3B1X3RvX2xlMTYoS0VZX1RZUEVfSURfQUVTKTsNCisJCWNtZC0+a2V5X3BhcmFtLmtleV9p bmZvID0NCisJCQkoa2V5LT5mbGFncyAmIElFRUU4MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkgPw0K KwkJCWNwdV90b19sZTMyKEVOQ1JfS0VZX0ZMQUdfUEFJUldJU0UpIDoNCisJCQljcHVfdG9fbGUz MihFTkNSX0tFWV9GTEFHX1RYR1JPVVBLRVkpOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQly ZXR1cm4gLUVOT1RTVVBQOw0KKwl9DQorDQorCXJldHVybiAwOw0KK30NCisNCit2b2lkIG13bF9m d2NtZF9yZXNldChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJp diAqcHJpdiA9IGh3LT5wcml2Ow0KKw0KKwlpZiAobXdsX2Z3Y21kX2Noa19hZGFwdGVyKHByaXYp KQ0KKwkJd3JpdGVsKElTUl9SRVNFVCwNCisJCSAgICAgICBwcml2LT5pb2Jhc2UxICsgTUFDUkVH X1JFR19IMkFfSU5URVJSVVBUX0VWRU5UUyk7DQorfQ0KKw0KK3ZvaWQgbXdsX2Z3Y21kX2ludF9l bmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnBy aXYgPSBody0+cHJpdjsNCisNCisJaWYgKG13bF9md2NtZF9jaGtfYWRhcHRlcihwcml2KSkgew0K KwkJd3JpdGVsKDB4MDAsDQorCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJI X0lOVEVSUlVQVF9NQVNLKTsNCisJCXdyaXRlbCgoTUFDUkVHX0EySFJJQ19CSVRfTUFTSyksDQor CQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNLKTsN CisJfQ0KK30NCisNCit2b2lkIG13bF9md2NtZF9pbnRfZGlzYWJsZShzdHJ1Y3QgaWVlZTgwMjEx X2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKw0KKwlp ZiAobXdsX2Z3Y21kX2Noa19hZGFwdGVyKHByaXYpKQ0KKwkJd3JpdGVsKDB4MDAsDQorCQkgICAg ICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNLKTsNCit9DQor DQoraW50IG13bF9md2NtZF9nZXRfaHdfc3BlY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQor ew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3RjbWRf Y21kX2dldF9od19zcGVjICpwY21kOw0KKwlpbnQgcmV0cnk7DQorCWludCBpOw0KKw0KKwlpZiAo cHJpdi0+bWZnX21vZGUpDQorCQlyZXR1cm4gMDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt ZF9jbWRfZ2V0X2h3X3NwZWMgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19i aCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXdpcGh5X2RlYnVnKGh3LT53aXBoeSwgInBjbWQg PSAlcFxuIiwgcGNtZCk7DQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJ ZXRoX2Jyb2FkY2FzdF9hZGRyKHBjbWQtPnBlcm1hbmVudF9hZGRyKTsNCisJcGNtZC0+Y21kX2hk ci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9HRVRfSFdfU1BFQyk7DQorCXBjbWQtPmNt ZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmZ3X2F3YWtl X2Nvb2tpZSA9IGNwdV90b19sZTMyKHByaXYtPnBwaHlzX2NtZF9idWYgKyAyMDQ4KTsNCisNCisJ cmV0cnkgPSAwOw0KKwl3aGlsZSAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01E X0dFVF9IV19TUEVDKSkgew0KKwkJaWYgKHJldHJ5KysgPiBNQVhfV0FJVF9HRVRfSFdfU1BFQ1Nf SVRFUkFUT05TKSB7DQorCQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImNhbid0IGdldCBodyBzcGVj c1xuIik7DQorCQkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJCXJldHVy biAtRUlPOw0KKwkJfQ0KKw0KKwkJbWRlbGF5KDEwMDApOw0KKwkJd2lwaHlfZGVidWcoaHctPndp cGh5LA0KKwkJCSAgICAicmVwZWF0IGNvbW1hbmQgPSAlcFxuIiwgcGNtZCk7DQorCX0NCisNCisJ ZXRoZXJfYWRkcl9jb3B5KCZwcml2LT5od19kYXRhLm1hY19hZGRyWzBdLCBwY21kLT5wZXJtYW5l bnRfYWRkcik7DQorCXByaXYtPmRlc2NfZGF0YVswXS53Y2JfYmFzZSA9DQorCQlsZTMyX3RvX2Nw dShwY21kLT53Y2JfYmFzZTApICYgMHgwMDAwZmZmZjsNCisJZm9yIChpID0gMTsgaSA8IFNZU0FE UFRfVE9UQUxfVFhfUVVFVUVTOyBpKyspDQorCQlwcml2LT5kZXNjX2RhdGFbaV0ud2NiX2Jhc2Ug PQ0KKwkJCWxlMzJfdG9fY3B1KHBjbWQtPndjYl9iYXNlW2kgLSAxXSkgJiAweDAwMDBmZmZmOw0K Kwlwcml2LT5kZXNjX2RhdGFbMF0ucnhfZGVzY19yZWFkID0NCisJCWxlMzJfdG9fY3B1KHBjbWQt PnJ4cGRfcmRfcHRyKSAmIDB4MDAwMGZmZmY7DQorCXByaXYtPmRlc2NfZGF0YVswXS5yeF9kZXNj X3dyaXRlID0NCisJCWxlMzJfdG9fY3B1KHBjbWQtPnJ4cGRfd3JfcHRyKSAmIDB4MDAwMGZmZmY7 DQorCXByaXYtPmh3X2RhdGEucmVnaW9uX2NvZGUgPSBsZTE2X3RvX2NwdShwY21kLT5yZWdpb25f Y29kZSkgJiAweDAwZmY7DQorCXByaXYtPmh3X2RhdGEuZndfcmVsZWFzZV9udW0gPSBsZTMyX3Rv X2NwdShwY21kLT5md19yZWxlYXNlX251bSk7DQorCXByaXYtPmh3X2RhdGEubWF4X251bV90eF9k ZXNjID0gbGUxNl90b19jcHUocGNtZC0+bnVtX3djYik7DQorCXByaXYtPmh3X2RhdGEubWF4X251 bV9tY19hZGRyID0gbGUxNl90b19jcHUocGNtZC0+bnVtX21jYXN0X2FkZHIpOw0KKwlwcml2LT5o d19kYXRhLm51bV9hbnRlbm5hcyA9IGxlMTZfdG9fY3B1KHBjbWQtPm51bV9hbnRlbm5hKTsNCisJ cHJpdi0+aHdfZGF0YS5od192ZXJzaW9uID0gcGNtZC0+dmVyc2lvbjsNCisJcHJpdi0+aHdfZGF0 YS5ob3N0X2ludGVyZmFjZSA9IHBjbWQtPmhvc3RfaWY7DQorDQorCXNwaW5fdW5sb2NrX2JoKCZw cml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf c2V0X2h3X3NwZWNzKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9w cml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaHdfc3BlYyAq cGNtZDsNCisJaW50IGk7DQorDQorCWlmIChwcml2LT5tZmdfbW9kZSkNCisJCXJldHVybiAwOw0K Kw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaHdfc3BlYyAqKSZwcml2LT5wY21k X2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVt c2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNw dV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9IV19TUEVDKTsNCisJcGNtZC0+Y21kX2hkci5sZW4g PSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+d2NiX2Jhc2VbMF0gPSBjcHVf dG9fbGUzMihwcml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfdHhfcmluZyk7DQorCWZvciAoaSA9IDE7 IGkgPCBTWVNBRFBUX1RPVEFMX1RYX1FVRVVFUzsgaSsrKQ0KKwkJcGNtZC0+d2NiX2Jhc2VbaV0g PQ0KKwkJCWNwdV90b19sZTMyKHByaXYtPmRlc2NfZGF0YVtpXS5wcGh5c190eF9yaW5nKTsNCisJ cGNtZC0+dHhfd2NiX251bV9wZXJfcXVldWUgPSBjcHVfdG9fbGUzMihTWVNBRFBUX01BWF9OVU1f VFhfREVTQyk7DQorCXBjbWQtPm51bV90eF9xdWV1ZXMgPSBjcHVfdG9fbGUzMihTWVNBRFBUX05V TV9PRl9ERVNDX0RBVEEpOw0KKwlwY21kLT50b3RhbF9yeF93Y2IgPSBjcHVfdG9fbGUzMihTWVNB RFBUX01BWF9OVU1fUlhfREVTQyk7DQorCXBjbWQtPnJ4cGRfd3JfcHRyID0gY3B1X3RvX2xlMzIo cHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3J4X3JpbmcpOw0KKwlwY21kLT5mZWF0dXJlcyA9IDA7 DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfU0VUX0hXX1NQ RUMpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9l cnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJ fQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAw Ow0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2dldF9zdGF0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 LA0KKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfbG93X2xldmVsX3N0YXRzICpzdGF0cykNCit7 DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9j bWRfODAyXzExX2dldF9zdGF0ICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2Nt ZF84MDJfMTFfZ2V0X3N0YXQgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19i aCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBj bWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84MDJf MTFfR0VUX1NUQVQpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigq cGNtZCkpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EXzgw Ml8xMV9HRVRfU1RBVCkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN CisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVy biAtRUlPOw0KKwl9DQorDQorCXN0YXRzLT5kb3QxMUFDS0ZhaWx1cmVDb3VudCA9DQorCQlsZTMy X3RvX2NwdShwY21kLT5hY2tfZmFpbHVyZXMpOw0KKwlzdGF0cy0+ZG90MTFSVFNGYWlsdXJlQ291 bnQgPQ0KKwkJbGUzMl90b19jcHUocGNtZC0+cnRzX2ZhaWx1cmVzKTsNCisJc3RhdHMtPmRvdDEx RkNTRXJyb3JDb3VudCA9DQorCQlsZTMyX3RvX2NwdShwY21kLT5yeF9mY3NfZXJyb3JzKTsNCisJ c3RhdHMtPmRvdDExUlRTU3VjY2Vzc0NvdW50ID0NCisJCWxlMzJfdG9fY3B1KHBjbWQtPnJ0c19z dWNjZXNzZXMpOw0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQor CXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodykNCit7DQorCXJldHVybiBtd2xfZndjbWRfODAyXzExX3JhZGlvX2NvbnRy b2woaHctPnByaXYsIHRydWUsIGZhbHNlKTsNCit9DQorDQoraW50IG13bF9md2NtZF9yYWRpb19k aXNhYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJcmV0dXJuIG13bF9md2NtZF84 MDJfMTFfcmFkaW9fY29udHJvbChody0+cHJpdiwgZmFsc2UsIGZhbHNlKTsNCit9DQorDQoraW50 IG13bF9md2NtZF9zZXRfcmFkaW9fcHJlYW1ibGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIGJv b2wgc2hvcnRfcHJlYW1ibGUpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJp djsNCisJaW50IHJjOw0KKw0KKwlpZiAocHJpdi0+bWZnX21vZGUpDQorCQlyZXR1cm4gMDsNCisN CisJcHJpdi0+cmFkaW9fc2hvcnRfcHJlYW1ibGUgPSBzaG9ydF9wcmVhbWJsZTsNCisJcmMgPSBt d2xfZndjbWRfODAyXzExX3JhZGlvX2NvbnRyb2wocHJpdiwgdHJ1ZSwgdHJ1ZSk7DQorDQorCXJl dHVybiByYzsNCit9DQorDQoraW50IG13bF9md2NtZF9nZXRfYWRkcl92YWx1ZShzdHJ1Y3QgaWVl ZTgwMjExX2h3ICpodywgdTMyIGFkZHIsIHUzMiBsZW4sDQorCQkJICAgICB1MzIgKnZhbCwgdTE2 IHNldCkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3Qg aG9zdGNtZF9jbWRfbWVtX2FkZHJfYWNjZXNzICpwY21kOw0KKwlpbnQgaTsNCisNCisJcGNtZCA9 IChzdHJ1Y3QgaG9zdGNtZF9jbWRfbWVtX2FkZHJfYWNjZXNzICopJnByaXYtPnBjbWRfYnVmWzBd Ow0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNt ZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xl MTYoSE9TVENNRF9DTURfTUVNX0FERFJfQUNDRVNTKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+YWRkcmVzcyA9IGNwdV90b19sZTMy KGFkZHIpOw0KKwlwY21kLT5sZW5ndGggPSBjcHVfdG9fbGUxNihsZW4pOw0KKwlwY21kLT52YWx1 ZVswXSA9IGNwdV90b19sZTMyKCp2YWwpOw0KKwlwY21kLT5yZXNlcnZlZCA9IGNwdV90b19sZTE2 KHNldCk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfTUVN X0FERFJfQUNDRVNTKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K KwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJu IC1FSU87DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQ0KKwkJdmFsW2ldID0g bGUzMl90b19jcHUocGNtZC0+dmFsdWVbaV0pOw0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX21heF90 eF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICBzdHJ1Y3QgaWVlZTgwMjEx X2NvbmYgKmNvbmYsIHU4IGZyYWN0aW9uKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVs ICpjaGFubmVsID0gY29uZi0+Y2hhbmRlZi5jaGFuOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYg PSBody0+cHJpdjsNCisJaW50IHJlZHVjZV92YWwgPSAwOw0KKwl1MTYgYmFuZCA9IDAsIHdpZHRo ID0gMCwgc3ViX2NoID0gMDsNCisJdTE2IG1heHR4cG93W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxf VE9UQUxdOw0KKwlpbnQgaSwgdG1wOw0KKwlpbnQgcmM7DQorDQorCXN3aXRjaCAoZnJhY3Rpb24p IHsNCisJY2FzZSAwOg0KKwkJcmVkdWNlX3ZhbCA9IDA7ICAgIC8qIE1heCAqLw0KKwkJYnJlYWs7 DQorCWNhc2UgMToNCisJCXJlZHVjZV92YWwgPSAyOyAgICAvKiA3NSUgLTEuMjVkYiAqLw0KKwkJ YnJlYWs7DQorCWNhc2UgMjoNCisJCXJlZHVjZV92YWwgPSAzOyAgICAvKiA1MCUgLTNkYiAqLw0K KwkJYnJlYWs7DQorCWNhc2UgMzoNCisJCXJlZHVjZV92YWwgPSA2OyAgICAvKiAyNSUgLTZkYiAq Lw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQkvKiBsYXJnZXIgdGhhbiBjYXNlIDMsICBwQ21k LT5NYXhQb3dlckxldmVsIGlzIG1pbiAqLw0KKwkJcmVkdWNlX3ZhbCA9IDB4ZmY7DQorCQlicmVh azsNCisJfQ0KKw0KKwlpZiAoY2hhbm5lbC0+YmFuZCA9PSBJRUVFODAyMTFfQkFORF8yR0haKQ0K KwkJYmFuZCA9IEZSRVFfQkFORF8yRE9UNEdIWjsNCisJZWxzZSBpZiAoY2hhbm5lbC0+YmFuZCA9 PSBJRUVFODAyMTFfQkFORF81R0haKQ0KKwkJYmFuZCA9IEZSRVFfQkFORF81R0haOw0KKw0KKwlz d2l0Y2ggKGNvbmYtPmNoYW5kZWYud2lkdGgpIHsNCisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhf MjBfTk9IVDoNCisJY2FzZSBOTDgwMjExX0NIQU5fV0lEVEhfMjA6DQorCQl3aWR0aCA9IENIXzIw X01IWl9XSURUSDsNCisJCXN1Yl9jaCA9IE5PX0VYVF9DSEFOTkVMOw0KKwkJYnJlYWs7DQorCWNh c2UgTkw4MDIxMV9DSEFOX1dJRFRIXzQwOg0KKwkJd2lkdGggPSBDSF80MF9NSFpfV0lEVEg7DQor CQlpZiAoY29uZi0+Y2hhbmRlZi5jZW50ZXJfZnJlcTEgPiBjaGFubmVsLT5jZW50ZXJfZnJlcSkN CisJCQlzdWJfY2ggPSBFWFRfQ0hfQUJPVkVfQ1RSTF9DSDsNCisJCWVsc2UNCisJCQlzdWJfY2gg PSBFWFRfQ0hfQkVMT1dfQ1RSTF9DSDsNCisJCWJyZWFrOw0KKwljYXNlIE5MODAyMTFfQ0hBTl9X SURUSF84MDoNCisJCXdpZHRoID0gQ0hfODBfTUhaX1dJRFRIOw0KKwkJaWYgKGNvbmYtPmNoYW5k ZWYuY2VudGVyX2ZyZXExID4gY2hhbm5lbC0+Y2VudGVyX2ZyZXEpDQorCQkJc3ViX2NoID0gRVhU X0NIX0FCT1ZFX0NUUkxfQ0g7DQorCQllbHNlDQorCQkJc3ViX2NoID0gRVhUX0NIX0JFTE9XX0NU UkxfQ0g7DQorCQlicmVhazsNCisJZGVmYXVsdDoNCisJCXJldHVybiAtRUlOVkFMOw0KKwl9DQor DQorCWlmICgocHJpdi0+cG93aW5pdGVkICYgTVdMX1BPV0VSX0lOSVRfMikgPT0gMCkgew0KKwkJ bXdsX2Z3Y21kX2dldF90eF9wb3dlcnMocHJpdiwgcHJpdi0+bWF4X3R4X3BvdywNCisJCQkJCWNo YW5uZWwtPmh3X3ZhbHVlLCBiYW5kLCB3aWR0aCwgc3ViX2NoKTsNCisJCXByaXYtPnBvd2luaXRl ZCB8PSBNV0xfUE9XRVJfSU5JVF8yOw0KKwl9DQorDQorCWlmICgocHJpdi0+cG93aW5pdGVkICYg TVdMX1BPV0VSX0lOSVRfMSkgPT0gMCkgew0KKwkJbXdsX2Z3Y21kX2dldF90eF9wb3dlcnMocHJp diwgcHJpdi0+dGFyZ2V0X3Bvd2VycywNCisJCQkJCWNoYW5uZWwtPmh3X3ZhbHVlLCBiYW5kLCB3 aWR0aCwgc3ViX2NoKTsNCisJCXByaXYtPnBvd2luaXRlZCB8PSBNV0xfUE9XRVJfSU5JVF8xOw0K Kwl9DQorDQorCWZvciAoaSA9IDA7IGkgPCBTWVNBRFBUX1RYX1BPV0VSX0xFVkVMX1RPVEFMOyBp KyspIHsNCisJCWlmIChwcml2LT50YXJnZXRfcG93ZXJzW2ldID4gcHJpdi0+bWF4X3R4X3Bvd1tp XSkNCisJCQl0bXAgPSBwcml2LT5tYXhfdHhfcG93W2ldOw0KKwkJZWxzZQ0KKwkJCXRtcCA9IHBy aXYtPnRhcmdldF9wb3dlcnNbaV07DQorCQltYXh0eHBvd1tpXSA9ICgodG1wIC0gcmVkdWNlX3Zh bCkgPiAwKSA/ICh0bXAgLSByZWR1Y2VfdmFsKSA6IDA7DQorCX0NCisNCisJcmMgPSBtd2xfZndj bWRfc2V0X3R4X3Bvd2Vycyhwcml2LCBtYXh0eHBvdywgSE9TVENNRF9BQ1RfR0VOX1NFVCwNCisJ CQkJICAgICBjaGFubmVsLT5od192YWx1ZSwgYmFuZCwgd2lkdGgsIHN1Yl9jaCk7DQorDQorCXJl dHVybiByYzsNCit9DQorDQoraW50IG13bF9md2NtZF90eF9wb3dlcihzdHJ1Y3QgaWVlZTgwMjEx X2h3ICpodywNCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYsIHU4IGZyYWN0 aW9uKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9jaGFubmVsICpjaGFubmVsID0gY29uZi0+Y2hh bmRlZi5jaGFuOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJaW50IHJl ZHVjZV92YWwgPSAwOw0KKwl1MTYgYmFuZCA9IDAsIHdpZHRoID0gMCwgc3ViX2NoID0gMDsNCisJ dTE2IHR4cG93W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOw0KKwlpbnQgaW5kZXgsIGZv dW5kID0gMDsNCisJaW50IGksIHRtcDsNCisJaW50IHJjOw0KKw0KKwlzd2l0Y2ggKGZyYWN0aW9u KSB7DQorCWNhc2UgMDoNCisJCXJlZHVjZV92YWwgPSAwOyAgICAvKiBNYXggKi8NCisJCWJyZWFr Ow0KKwljYXNlIDE6DQorCQlyZWR1Y2VfdmFsID0gMjsgICAgLyogNzUlIC0xLjI1ZGIgKi8NCisJ CWJyZWFrOw0KKwljYXNlIDI6DQorCQlyZWR1Y2VfdmFsID0gMzsgICAgLyogNTAlIC0zZGIgKi8N CisJCWJyZWFrOw0KKwljYXNlIDM6DQorCQlyZWR1Y2VfdmFsID0gNjsgICAgLyogMjUlIC02ZGIg Ki8NCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJLyogbGFyZ2VyIHRoYW4gY2FzZSAzLCAgcENt ZC0+TWF4UG93ZXJMZXZlbCBpcyBtaW4gKi8NCisJCXJlZHVjZV92YWwgPSAweGZmOw0KKwkJYnJl YWs7DQorCX0NCisNCisJaWYgKGNoYW5uZWwtPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikN CisJCWJhbmQgPSBGUkVRX0JBTkRfMkRPVDRHSFo7DQorCWVsc2UgaWYgKGNoYW5uZWwtPmJhbmQg PT0gSUVFRTgwMjExX0JBTkRfNUdIWikNCisJCWJhbmQgPSBGUkVRX0JBTkRfNUdIWjsNCisNCisJ c3dpdGNoIChjb25mLT5jaGFuZGVmLndpZHRoKSB7DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRI XzIwX05PSFQ6DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzIwOg0KKwkJd2lkdGggPSBDSF8y MF9NSFpfV0lEVEg7DQorCQlzdWJfY2ggPSBOT19FWFRfQ0hBTk5FTDsNCisJCWJyZWFrOw0KKwlj YXNlIE5MODAyMTFfQ0hBTl9XSURUSF80MDoNCisJCXdpZHRoID0gQ0hfNDBfTUhaX1dJRFRIOw0K KwkJaWYgKGNvbmYtPmNoYW5kZWYuY2VudGVyX2ZyZXExID4gY2hhbm5lbC0+Y2VudGVyX2ZyZXEp DQorCQkJc3ViX2NoID0gRVhUX0NIX0FCT1ZFX0NUUkxfQ0g7DQorCQllbHNlDQorCQkJc3ViX2No ID0gRVhUX0NIX0JFTE9XX0NUUkxfQ0g7DQorCQlicmVhazsNCisJY2FzZSBOTDgwMjExX0NIQU5f V0lEVEhfODA6DQorCQl3aWR0aCA9IENIXzgwX01IWl9XSURUSDsNCisJCWlmIChjb25mLT5jaGFu ZGVmLmNlbnRlcl9mcmVxMSA+IGNoYW5uZWwtPmNlbnRlcl9mcmVxKQ0KKwkJCXN1Yl9jaCA9IEVY VF9DSF9BQk9WRV9DVFJMX0NIOw0KKwkJZWxzZQ0KKwkJCXN1Yl9jaCA9IEVYVF9DSF9CRUxPV19D VFJMX0NIOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0K Kw0KKwkvKiBzZWFyY2ggdHggcG93ZXIgdGFibGUgaWYgZXhpc3QgKi8NCisJZm9yIChpbmRleCA9 IDA7IGluZGV4IDwgU1lTQURQVF9NQVhfTlVNX0NIQU5ORUxTOyBpbmRleCsrKSB7DQorCQlzdHJ1 Y3QgbXdsX3R4X3B3cl90YmwgKnR4X3B3cjsNCisNCisJCXR4X3B3ciA9ICZwcml2LT50eF9wd3Jf dGJsW2luZGV4XTsNCisNCisJCS8qIGRvIG5vdGhpbmcgaWYgdGFibGUgaXMgbm90IGxvYWRlZCAq Lw0KKwkJaWYgKHR4X3B3ci0+Y2hhbm5lbCA9PSAwKQ0KKwkJCWJyZWFrOw0KKw0KKwkJaWYgKHR4 X3B3ci0+Y2hhbm5lbCA9PSBjaGFubmVsLT5od192YWx1ZSkgew0KKwkJCXByaXYtPmNkZCA9IHR4 X3B3ci0+Y2RkOw0KKwkJCXByaXYtPnR4YW50ZW5uYTIgPSB0eF9wd3ItPnR4YW50ZW5uYTI7DQor DQorCQkJaWYgKHR4X3B3ci0+c2V0Y2FwKQ0KKwkJCQlwcml2LT5wb3dpbml0ZWQgPSBNV0xfUE9X RVJfSU5JVF8xOw0KKwkJCWVsc2UNCisJCQkJcHJpdi0+cG93aW5pdGVkID0gTVdMX1BPV0VSX0lO SVRfMjsNCisNCisJCQlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9QT1dFUl9MRVZFTF9UT1RB TDsgaSsrKSB7DQorCQkJCWlmICh0eF9wd3ItPnNldGNhcCkNCisJCQkJCXByaXYtPm1heF90eF9w b3dbaV0gPQ0KKwkJCQkJCXR4X3B3ci0+dHhfcG93ZXJbaV07DQorCQkJCWVsc2UNCisJCQkJCXBy aXYtPnRhcmdldF9wb3dlcnNbaV0gPQ0KKwkJCQkJCXR4X3B3ci0+dHhfcG93ZXJbaV07DQorCQkJ fQ0KKw0KKwkJCWZvdW5kID0gMTsNCisJCQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwlpZiAoKHBy aXYtPnBvd2luaXRlZCAmIE1XTF9QT1dFUl9JTklUXzIpID09IDApIHsNCisJCW13bF9md2NtZF9n ZXRfdHhfcG93ZXJzKHByaXYsIHByaXYtPm1heF90eF9wb3csDQorCQkJCQljaGFubmVsLT5od192 YWx1ZSwgYmFuZCwgd2lkdGgsIHN1Yl9jaCk7DQorDQorCQlwcml2LT5wb3dpbml0ZWQgfD0gTVdM X1BPV0VSX0lOSVRfMjsNCisJfQ0KKw0KKwlpZiAoKHByaXYtPnBvd2luaXRlZCAmIE1XTF9QT1dF Ul9JTklUXzEpID09IDApIHsNCisJCW13bF9md2NtZF9nZXRfdHhfcG93ZXJzKHByaXYsIHByaXYt PnRhcmdldF9wb3dlcnMsDQorCQkJCQljaGFubmVsLT5od192YWx1ZSwgYmFuZCwgd2lkdGgsIHN1 Yl9jaCk7DQorDQorCQlwcml2LT5wb3dpbml0ZWQgfD0gTVdMX1BPV0VSX0lOSVRfMTsNCisJfQ0K Kw0KKwlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9QT1dFUl9MRVZFTF9UT1RBTDsgaSsrKSB7 DQorCQlpZiAoZm91bmQpIHsNCisJCQlpZiAoKHByaXYtPnR4X3B3cl90YmxbaW5kZXhdLnNldGNh cCkgJiYNCisJCQkgICAgKHByaXYtPnR4X3B3cl90YmxbaW5kZXhdLnR4X3Bvd2VyW2ldID4NCisJ CQkgICAgcHJpdi0+bWF4X3R4X3Bvd1tpXSkpDQorCQkJCXRtcCA9IHByaXYtPm1heF90eF9wb3db aV07DQorCQkJZWxzZQ0KKwkJCQl0bXAgPSBwcml2LT50eF9wd3JfdGJsW2luZGV4XS50eF9wb3dl cltpXTsNCisJCX0gZWxzZSB7DQorCQkJaWYgKHByaXYtPnRhcmdldF9wb3dlcnNbaV0gPiBwcml2 LT5tYXhfdHhfcG93W2ldKQ0KKwkJCQl0bXAgPSBwcml2LT5tYXhfdHhfcG93W2ldOw0KKwkJCWVs c2UNCisJCQkJdG1wID0gcHJpdi0+dGFyZ2V0X3Bvd2Vyc1tpXTsNCisJCX0NCisNCisJCXR4cG93 W2ldID0gKCh0bXAgLSByZWR1Y2VfdmFsKSA+IDApID8gKHRtcCAtIHJlZHVjZV92YWwpIDogMDsN CisJfQ0KKw0KKwlyYyA9IG13bF9md2NtZF9zZXRfdHhfcG93ZXJzKHByaXYsIHR4cG93LCBIT1NU Q01EX0FDVF9HRU5fU0VUX0xJU1QsDQorCQkJCSAgICAgY2hhbm5lbC0+aHdfdmFsdWUsIGJhbmQs IHdpZHRoLCBzdWJfY2gpOw0KKw0KKwlyZXR1cm4gcmM7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf cmZfYW50ZW5uYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IGRpciwgaW50IGFudGVubmEp DQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3Rj bWRfY21kXzgwMl8xMV9yZl9hbnRlbm5hICpwY21kOw0KKw0KKwlpZiAocHJpdi0+bWZnX21vZGUp DQorCQlyZXR1cm4gMDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX3Jm X2FudGVubmEgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJ cGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84MDJfMTFfUkZfQU5U RU5OQSk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7 DQorDQorCXBjbWQtPmFjdGlvbiA9IGNwdV90b19sZTE2KGRpcik7DQorDQorCWlmIChkaXIgPT0g V0xfQU5URU5OQVRZUEVfUlgpIHsNCisJCXU4IHJ4X2FudGVubmEgPSA0OyAvKiBpZiBhdXRvLCBz ZXQgNCByeCBhbnRlbm5hcyBpbiBTQzIgKi8NCisNCisJCWlmIChhbnRlbm5hICE9IDApDQorCQkJ cGNtZC0+YW50ZW5uYV9tb2RlID0gY3B1X3RvX2xlMTYoYW50ZW5uYSk7DQorCQllbHNlDQorCQkJ cGNtZC0+YW50ZW5uYV9tb2RlID0gY3B1X3RvX2xlMTYocnhfYW50ZW5uYSk7DQorCX0gZWxzZSB7 DQorCQl1OCB0eF9hbnRlbm5hID0gMHhmOyAvKiBpZiBhdXRvLCBzZXQgNCB0eCBhbnRlbm5hcyBp biBTQzIgKi8NCisNCisJCWlmIChhbnRlbm5hICE9IDApDQorCQkJcGNtZC0+YW50ZW5uYV9tb2Rl ID0gY3B1X3RvX2xlMTYoYW50ZW5uYSk7DQorCQllbHNlDQorCQkJcGNtZC0+YW50ZW5uYV9tb2Rl ID0gY3B1X3RvX2xlMTYodHhfYW50ZW5uYSk7DQorCX0NCisNCisJaWYgKG13bF9md2NtZF9leGVj X2NtZChwcml2LCBIT1NUQ01EX0NNRF84MDJfMTFfUkZfQU5URU5OQSkpIHsNCisJCXNwaW5fdW5s b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWls ZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2Nr X2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xf ZndjbWRfYnJvYWRjYXN0X3NzaWRfZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJ CQkgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgYm9vbCBlbmFibGUpDQorew0KKwlzdHJ1 Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7 DQorCXN0cnVjdCBob3N0Y21kX2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUgKnBjbWQ7DQorDQor CW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9z dGNtZF9jbWRfYnJvYWRjYXN0X3NzaWRfZW5hYmxlICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0K KwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgw MCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9T VENNRF9DTURfQlJPQURDQVNUX1NTSURfRU5BQkxFKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92 aWYtPm1hY2lkOw0KKwlwY21kLT5lbmFibGUgPSBjcHVfdG9fbGUzMihlbmFibGUpOw0KKw0KKwlp ZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0JST0FEQ0FTVF9TU0lEX0VO QUJMRSkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5 X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0K Kwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJu IDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X3JmX2NoYW5uZWwoc3RydWN0IGllZWU4MDIx MV9odyAqaHcsDQorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2NvbmYgKmNvbmYpDQorew0KKwlz dHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKmNoYW5uZWwgPSBjb25mLT5jaGFuZGVmLmNoYW47DQor CXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRf c2V0X3JmX2NoYW5uZWwgKnBjbWQ7DQorCXUzMiBjaG5sX2ZsYWdzLCBmcmVxX2JhbmQsIGNobmxf d2lkdGgsIGFjdF9wcmltYXJ5Ow0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRf cmZfY2hhbm5lbCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2 LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0K KwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9SRl9DSEFO TkVMKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsN CisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoV0xfU0VUKTsNCisJcGNtZC0+Y3Vycl9jaG5s ID0gY2hhbm5lbC0+aHdfdmFsdWU7DQorDQorCWlmIChjaGFubmVsLT5iYW5kID09IElFRUU4MDIx MV9CQU5EXzJHSFopIHsNCisJCWZyZXFfYmFuZCA9IEZSRVFfQkFORF8yRE9UNEdIWjsNCisJfSBl bHNlIGlmIChjaGFubmVsLT5iYW5kID09IElFRUU4MDIxMV9CQU5EXzVHSFopIHsNCisJCWZyZXFf YmFuZCA9IEZSRVFfQkFORF81R0haOw0KKwl9IGVsc2Ugew0KKwkJc3Bpbl91bmxvY2tfYmgoJnBy aXYtPmZ3Y21kX2xvY2spOw0KKwkJcmV0dXJuIC1FSU5WQUw7DQorCX0NCisNCisJc3dpdGNoIChj b25mLT5jaGFuZGVmLndpZHRoKSB7DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzIwX05PSFQ6 DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzIwOg0KKwkJY2hubF93aWR0aCA9IENIXzIwX01I Wl9XSURUSDsNCisJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJYnJlYWs7 DQorCWNhc2UgTkw4MDIxMV9DSEFOX1dJRFRIXzQwOg0KKwkJY2hubF93aWR0aCA9IENIXzQwX01I Wl9XSURUSDsNCisJCWlmIChjb25mLT5jaGFuZGVmLmNlbnRlcl9mcmVxMSA+IGNoYW5uZWwtPmNl bnRlcl9mcmVxKQ0KKwkJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8wOw0KKwkJZWxz ZQ0KKwkJCWFjdF9wcmltYXJ5ID0gQUNUX1BSSU1BUllfQ0hBTl8xOw0KKwkJYnJlYWs7DQorCWNh c2UgTkw4MDIxMV9DSEFOX1dJRFRIXzgwOg0KKwkJY2hubF93aWR0aCA9IENIXzgwX01IWl9XSURU SDsNCisJCWFjdF9wcmltYXJ5ID0NCisJCQltd2xfZndjbWRfZ2V0XzgwbV9wcmlfY2hubF9vZmZz ZXQocGNtZC0+Y3Vycl9jaG5sKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJc3Bpbl91bmxv Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJcmV0dXJuIC1FSU5WQUw7DQorCX0NCisNCisJ Y2hubF9mbGFncyA9IChmcmVxX2JhbmQgJiBGUkVRX0JBTkRfTUFTSykgfA0KKwkJKChjaG5sX3dp ZHRoIDw8IENITkxfV0lEVEhfU0hJRlQpICYgQ0hOTF9XSURUSF9NQVNLKSB8DQorCQkoKGFjdF9w cmltYXJ5IDw8IEFDVF9QUklNQVJZX1NISUZUKSAmIEFDVF9QUklNQVJZX01BU0spOw0KKw0KKwlw Y21kLT5jaG5sX2ZsYWdzID0gY3B1X3RvX2xlMzIoY2hubF9mbGFncyk7DQorDQorCWlmIChtd2xf ZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfU0VUX1JGX0NIQU5ORUwpKSB7DQorCQlz cGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5 LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGlu X3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitp bnQgbXdsX2Z3Y21kX3NldF9haWQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICBz dHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqYnNzaWQsIHUxNiBhaWQpDQorew0KKwlzdHJ1 Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7 DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfYWlkICpwY21kOw0KKw0KKwltd2xfdmlmID0gbXds X2Rldl9nZXRfdmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3NldF9h aWQgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ZndjbWRf bG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+ Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfQUlEKTsNCisJcGNtZC0+ Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hk ci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKwlwY21kLT5haWQgPSBjcHVfdG9fbGUxNihhaWQp Ow0KKwlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIGJzc2lkKTsNCisNCisJaWYgKG13 bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfQUlEKSkgew0KKwkJc3Bpbl91 bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZh aWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxv Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13 bF9md2NtZF9zZXRfaW5mcmFfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICAg IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYg PSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21k X2NtZF9zZXRfaW5mcmFfbW9kZSAqcGNtZDsNCisNCisJbXdsX3ZpZiA9IG13bF9kZXZfZ2V0X3Zp Zih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfaW5mcmFfbW9kZSAq KSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2Nr KTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRf aGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9JTkZSQV9NT0RFKTsNCisJcGNt ZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21k X2hkci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21k KHByaXYsIEhPU1RDTURfQ01EX1NFVF9JTkZSQV9NT0RFKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgo JnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVj dXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnBy aXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9z ZXRfcnRzX3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgaW50IHRocmVzaG9sZCkN Cit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNt ZF9jbWRfODAyXzExX3J0c190aHNkICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21k X2NtZF84MDJfMTFfcnRzX3Roc2QgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9j a19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2Yo KnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF84 MDJfMTFfUlRTX1RIU0QpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVv ZigqcGNtZCkpOw0KKwlwY21kLT5hY3Rpb24gID0gY3B1X3RvX2xlMTYoV0xfU0VUKTsNCisJcGNt ZC0+dGhyZXNob2xkID0gY3B1X3RvX2xlMTYodGhyZXNob2xkKTsNCisNCisJaWYgKG13bF9md2Nt ZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF84MDJfMTFfUlRTX1RIU0QpKSB7DQorCQlzcGlu X3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAi ZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3Vu bG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQg bXdsX2Z3Y21kX3NldF9lZGNhX3BhcmFtcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggaW5k ZXgsDQorCQkJICAgICAgdTE2IGN3X21pbiwgdTE2IGN3X21heCwgdTggYWlmcywgdTE2IHR4b3Ap DQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3Rj bWRfY21kX3NldF9lZGNhX3BhcmFtcyAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt ZF9jbWRfc2V0X2VkY2FfcGFyYW1zICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xv Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9m KCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURf U0VUX0VEQ0FfUEFSQU1TKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXpl b2YoKnBjbWQpKTsNCisNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsNCisJ cGNtZC0+dHhvcCA9IGNwdV90b19sZTE2KHR4b3ApOw0KKwlwY21kLT5jd19tYXggPSBjcHVfdG9f bGUzMihpbG9nMihjd19tYXggKyAxKSk7DQorCXBjbWQtPmN3X21pbiA9IGNwdV90b19sZTMyKGls b2cyKGN3X21pbiArIDEpKTsNCisJcGNtZC0+YWlmc24gPSBhaWZzOw0KKwlwY21kLT50eHFfbnVt ID0gaW5kZXg7DQorDQorCS8qIFRoZSBhcnJheSBpbmRleCBkZWZpbmVkIGluIHFvcy5oIGhhcyBh IHJldmVyc2VkIGJrIGFuZCBiZS4NCisJICogVGhlIEhXIHF1ZXVlIHdhcyBub3QgdXNlZCB0aGlz IHdheTsgdGhlIHFvcyBjb2RlIG5lZWRzIHRvDQorCSAqIGJlIGNoYW5nZWQgb3IgY2hlY2tlZA0K KwkgKi8NCisJaWYgKGluZGV4ID09IDApDQorCQlwY21kLT50eHFfbnVtID0gMTsNCisJZWxzZSBp ZiAoaW5kZXggPT0gMSkNCisJCXBjbWQtPnR4cV9udW0gPSAwOw0KKw0KKwlpZiAobXdsX2Z3Y21k X2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9FRENBX1BBUkFNUykpIHsNCisJCXNwaW5f dW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJm YWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5s b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBt d2xfZndjbWRfc2V0X3dtbV9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJs ZSkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9z dGNtZF9jbWRfc2V0X3dtbV9tb2RlICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21k X2NtZF9zZXRfd21tX21vZGUgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19i aCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBj bWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRf V01NX01PREUpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNt ZCkpOw0KKwlwY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihlbmFibGUgPyBXTF9FTkFCTEUgOiBX TF9ESVNBQkxFKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NN RF9TRVRfV01NX01PREUpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7 DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1 cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQor DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2h0X2d1YXJkX2ludGVydmFsKHN0 cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgZ2lfdHlwZSkNCit7DQorCXN0cnVjdCBtd2xfcHJp diAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfaHRfZ3VhcmRfaW50ZXJ2 YWwgKnBjbWQ7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2h0X2d1YXJkX2ludGVy dmFsICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfSFRfR1VBUkRfSU5URVJWQUwp Ow0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlw Y21kLT5hY3Rpb24gPSBjcHVfdG9fbGUzMihXTF9TRVQpOw0KKwlwY21kLT5naV90eXBlID0gY3B1 X3RvX2xlMzIoZ2lfdHlwZSk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9T VENNRF9DTURfSFRfR1VBUkRfSU5URVJWQUwpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxu Iik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+Zndj bWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3VzZV9maXhl ZF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgbWNhc3QsIGludCBtZ210KQ0KK3sN CisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBob3N0Y21kX2Nt ZF9zZXRfZml4ZWRfcmF0ZSAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRf c2V0X2ZpeGVkX3JhdGUgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgm cHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQp KTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfRklY RURfUkFURSk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21k KSk7DQorDQorCXBjbWQtPmFjdGlvbiA9IGNwdV90b19sZTMyKEhPU1RDTURfQUNUX05PVF9VU0Vf RklYRURfUkFURSk7DQorCXBjbWQtPm11bHRpY2FzdF9yYXRlID0gbWNhc3Q7DQorCXBjbWQtPm1h bmFnZW1lbnRfcmF0ZSA9IG1nbXQ7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwg SE9TVENNRF9DTURfU0VUX0ZJWEVEX1JBVEUpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxu Iik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+Zndj bWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3NldF9saW5r YWRhcHRfY3NfbW9kZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTE2IGNzX21vZGUpDQorew0K KwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IGhvc3RjbWRfY21k X3NldF9saW5rYWRhcHRfY3NfbW9kZSAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt ZF9jbWRfc2V0X2xpbmthZGFwdF9jc19tb2RlICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlz cGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwg c2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENN RF9DTURfU0VUX0xJTktBREFQVF9DU19NT0RFKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVf dG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+YWN0aW9uICA9IGNwdV90b19sZTE2KEhP U1RDTURfQUNUX0dFTl9TRVQpOw0KKwlwY21kLT5jc19tb2RlID0gY3B1X3RvX2xlMTYoY3NfbW9k ZSk7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURfU0VUX0xJ TktBREFQVF9DU19NT0RFKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2sp Ow0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0 dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K Kw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfcmF0ZV9hZGFwdF9tb2Rl KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MTYgbW9kZSkNCit7DQorCXN0cnVjdCBtd2xfcHJp diAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X3JhdGVfYWRhcHRf bW9kZSAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X3JhdGVfYWRh cHRfbW9kZSAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5m d2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlw Y21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9SQVRFX0FEQVBU X01PREUpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkp Ow0KKwlwY21kLT5hY3Rpb24gPSBjcHVfdG9fbGUxNihXTF9TRVQpOw0KKwlwY21kLT5yYXRlX2Fk YXB0X21vZGUgPSBjcHVfdG9fbGUxNihtb2RlKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2Nt ZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfUkFURV9BREFQVF9NT0RFKSkgew0KKwkJc3Bpbl91bmxv Y2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxl ZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tf YmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9m d2NtZF9zZXRfbWFjX2FkZHJfY2xpZW50KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkg IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICptYWNfYWRkcikNCit7DQorCXN0cnVjdCBt d2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJ c3RydWN0IGhvc3RjbWRfY21kX3NldF9tYWNfYWRkciAqcGNtZDsNCisNCisJbXdsX3ZpZiA9IG13 bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRf bWFjX2FkZHIgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ ZndjbWRfbG9jayk7DQorDQorCW1lbXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJ cGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfTUFDX0FERFIp Ow0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlw Y21kLT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorCXBjbWQtPm1hY190eXBlID0g Y3B1X3RvX2xlMTYoV0xfTUFDX1RZUEVfU0VDT05EQVJZX0NMSUVOVCk7DQorCWV0aGVyX2FkZHJf Y29weShwY21kLT5tYWNfYWRkciwgbWFjX2FkZHIpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNf Y21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9NQUNfQUREUikpIHsNCisJCXNwaW5fdW5sb2NrX2Jo KCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhl Y3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZw cml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf Z2V0X3dhdGNoZG9nX2JpdG1hcChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggKmJpdG1hcCkN Cit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNt ZF9jbWRfZ2V0X3dhdGNoZG9nX2JpdG1hcCAqcGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9z dGNtZF9jbWRfZ2V0X3dhdGNoZG9nX2JpdG1hcCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJ c3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAs IHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RD TURfQ01EX0dFVF9XQVRDSERPR19CSVRNQVApOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90 b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYs IEhPU1RDTURfQ01EX0dFVF9XQVRDSERPR19CSVRNQVApKSB7DQorCQlzcGluX3VubG9ja19iaCgm cHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1 dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwkqYml0bWFwID0gcGNtZC0+d2F0 Y2hkb2dfYml0bWFwOw0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQor DQorCXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3JlbW92ZV9tYWNfYWRkcihzdHJ1 Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm LCB1OCAqbWFjX2FkZHIpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsN CisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfbWFj X2FkZHIgKnBjbWQ7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsNCisNCisJ cGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X21hY19hZGRyICopJnByaXYtPnBjbWRfYnVm WzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQo cGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3Rv X2xlMTYoSE9TVENNRF9DTURfREVMX01BQ19BRERSKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92 aWYtPm1hY2lkOw0KKwlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIG1hY19hZGRyKTsN CisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9ERUxfTUFDX0FE RFIpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9l cnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJ fQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAw Ow0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2Jzc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo dywNCisJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGVuYWJsZSkNCit7DQorCXN0 cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3Zp ZjsNCisJc3RydWN0IGhvc3RjbWRfY21kX2Jzc19zdGFydCAqcGNtZDsNCisNCisJbXdsX3ZpZiA9 IG13bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlpZiAoZW5hYmxlICYmIChwcml2LT5ydW5uaW5n X2Jzc2VzICYgKDEgPDwgbXdsX3ZpZi0+bWFjaWQpKSkNCisJCXJldHVybiAwOw0KKw0KKwlpZiAo IWVuYWJsZSAmJiAhKHByaXYtPnJ1bm5pbmdfYnNzZXMgJiAoMSA8PCBtd2xfdmlmLT5tYWNpZCkp KQ0KKwkJcmV0dXJuIDA7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2Jzc19zdGFy dCAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9s b2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5j bWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX0JTU19TVEFSVCk7DQorCXBjbWQt PmNtZF9oZHIubGVuID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9o ZHIubWFjaWQgPSBtd2xfdmlmLT5tYWNpZDsNCisNCisJaWYgKGVuYWJsZSkgew0KKwkJcGNtZC0+ ZW5hYmxlID0gY3B1X3RvX2xlMzIoV0xfRU5BQkxFKTsNCisJfSBlbHNlIHsNCisJCWlmIChtd2xf dmlmLT5tYWNpZCA9PSAwKQ0KKwkJCXBjbWQtPmVuYWJsZSA9IGNwdV90b19sZTMyKFdMX0RJU0FC TEUpOw0KKwkJZWxzZQ0KKwkJCXBjbWQtPmVuYWJsZSA9IGNwdV90b19sZTMyKFdMX0RJU0FCTEVf Vk1BQyk7DQorCX0NCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NN RF9CU1NfU1RBUlQpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQor CQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4g LUVJTzsNCisJfQ0KKw0KKwlpZiAoZW5hYmxlKQ0KKwkJcHJpdi0+cnVubmluZ19ic3NlcyB8PSAo MSA8PCBtd2xfdmlmLT5tYWNpZCk7DQorCWVsc2UNCisJCXByaXYtPnJ1bm5pbmdfYnNzZXMgJj0g figxIDw8IG13bF92aWYtPm1hY2lkKTsNCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21k X2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfYmVhY29u KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm LCB1OCAqYmVhY29uLCBpbnQgbGVuKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct PnByaXY7DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rl dl9nZXRfdmlmKHZpZik7DQorDQorCW13bF9md2NtZF9wYXJzZV9iZWFjb24ocHJpdiwgbXdsX3Zp ZiwgYmVhY29uLCBsZW4pOw0KKw0KKwlpZiAobXdsX2Z3Y21kX3NldF9pZXMocHJpdiwgbXdsX3Zp ZikpDQorCQlnb3RvIGVycjsNCisNCisJaWYgKG13bF9md2NtZF9zZXRfYXBfYmVhY29uKHByaXYs IG13bF92aWYsICZ2aWYtPmJzc19jb25mKSkNCisJCWdvdG8gZXJyOw0KKw0KKwltd2xfdmlmLT5i ZWFjb25faW5mby52YWxpZCA9IGZhbHNlOw0KKw0KKwlyZXR1cm4gMDsNCisNCitlcnI6DQorDQor CW13bF92aWYtPmJlYWNvbl9pbmZvLnZhbGlkID0gZmFsc2U7DQorDQorCXJldHVybiAtRUlPOw0K K30NCisNCitpbnQgbXdsX2Z3Y21kX3NldF9uZXdfc3RuX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3 ICpodywNCisJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCSAgICAgIHN0 cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBo dy0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21kX2Nt ZF9zZXRfbmV3X3N0biAqcGNtZDsNCisJdTMyIHJhdGVzOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rl dl9nZXRfdmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3NldF9uZXdf c3RuICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfU0VUX05FV19TVE4pOw0KKwlw Y21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5j bWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorDQorCXBjbWQtPmFjdGlvbiA9IGNwdV90 b19sZTE2KEhPU1RDTURfQUNUX1NUQV9BQ1RJT05fQUREKTsNCisJaWYgKHZpZi0+dHlwZSA9PSBO TDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7DQorCQlwY21kLT5haWQgPSAwOw0KKwkJcGNtZC0+c3Ru X2lkID0gMDsNCisJfSBlbHNlIHsNCisJCXBjbWQtPmFpZCA9IGNwdV90b19sZTE2KHN0YS0+YWlk KTsNCisJCXBjbWQtPnN0bl9pZCA9IGNwdV90b19sZTE2KHN0YS0+YWlkKTsNCisJfQ0KKwlldGhl cl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIHN0YS0+YWRkcik7DQorDQorCWlmIChody0+Y29u Zi5jaGFuZGVmLmNoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfMkdIWikNCisJCXJhdGVzID0g c3RhLT5zdXBwX3JhdGVzW0lFRUU4MDIxMV9CQU5EXzJHSFpdOw0KKwllbHNlDQorCQlyYXRlcyA9 IHN0YS0+c3VwcF9yYXRlc1tJRUVFODAyMTFfQkFORF81R0haXSA8PCA1Ow0KKwlwY21kLT5wZWVy X2luZm8ubGVnYWN5X3JhdGVfYml0bWFwID0gY3B1X3RvX2xlMzIocmF0ZXMpOw0KKw0KKwlpZiAo c3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7DQorCQlwY21kLT5wZWVyX2luZm8uaHRfcmF0ZXNb MF0gPSBzdGEtPmh0X2NhcC5tY3MucnhfbWFza1swXTsNCisJCXBjbWQtPnBlZXJfaW5mby5odF9y YXRlc1sxXSA9IHN0YS0+aHRfY2FwLm1jcy5yeF9tYXNrWzFdOw0KKwkJcGNtZC0+cGVlcl9pbmZv Lmh0X3JhdGVzWzJdID0gc3RhLT5odF9jYXAubWNzLnJ4X21hc2tbMl07DQorCQlwY21kLT5wZWVy X2luZm8uaHRfcmF0ZXNbM10gPSBzdGEtPmh0X2NhcC5tY3MucnhfbWFza1szXTsNCisJCXBjbWQt PnBlZXJfaW5mby5odF9jYXBfaW5mbyA9IGNwdV90b19sZTE2KHN0YS0+aHRfY2FwLmNhcCk7DQor CQlwY21kLT5wZWVyX2luZm8ubWFjX2h0X3BhcmFtX2luZm8gPQ0KKwkJCShzdGEtPmh0X2NhcC5h bXBkdV9mYWN0b3IgJiAzKSB8DQorCQkJKChzdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5ICYgNykg PDwgMik7DQorCX0NCisNCisJaWYgKHN0YS0+dmh0X2NhcC52aHRfc3VwcG9ydGVkKSB7DQorCQlw Y21kLT5wZWVyX2luZm8udmh0X21heF9yeF9tY3MgPQ0KKwkJCWNwdV90b19sZTMyKCooKHUzMiAq KQ0KKwkJCSZzdGEtPnZodF9jYXAudmh0X21jcy5yeF9tY3NfbWFwKSk7DQorCQlwY21kLT5wZWVy X2luZm8udmh0X2NhcCA9IGNwdV90b19sZTMyKHN0YS0+dmh0X2NhcC5jYXApOw0KKwkJcGNtZC0+ cGVlcl9pbmZvLnZodF9yeF9jaGFubmVsX3dpZHRoID0gc3RhLT5iYW5kd2lkdGg7DQorCX0NCisN CisJcGNtZC0+aXNfcW9zX3N0YSA9IHN0YS0+d21lOw0KKwlwY21kLT5xb3NfaW5mbyA9ICgoc3Rh LT51YXBzZF9xdWV1ZXMgPDwgNCkgfCAoc3RhLT5tYXhfc3AgPDwgMSkpOw0KKw0KKwlpZiAobXds X2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9ORVdfU1ROKSkgew0KKwkJc3Bp bl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwg ImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJaWYgKHZp Zi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7DQorCQlldGhlcl9hZGRyX2NvcHko cGNtZC0+bWFjX2FkZHIsIG13bF92aWYtPnN0YV9tYWMpOw0KKw0KKwkJaWYgKG13bF9md2NtZF9l eGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfTkVXX1NUTikpIHsNCisJCQlzcGluX3VubG9j a19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxl ZCBleGVjdXRpb25cbiIpOw0KKwkJCXJldHVybiAtRUlPOw0KKwkJfQ0KKwl9DQorDQorCXNwaW5f dW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2lu dCBtd2xfZndjbWRfc2V0X25ld19zdG5fYWRkX3NlbGYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcs DQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3By aXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVj dCBob3N0Y21kX2NtZF9zZXRfbmV3X3N0biAqcGNtZDsNCisNCisJbXdsX3ZpZiA9IG13bF9kZXZf Z2V0X3ZpZih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfbmV3X3N0 biAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9s b2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5j bWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX1NFVF9ORVdfU1ROKTsNCisJcGNt ZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21k X2hkci5tYWNpZCA9IG13bF92aWYtPm1hY2lkOw0KKw0KKwlwY21kLT5hY3Rpb24gPSBjcHVfdG9f bGUxNihIT1NUQ01EX0FDVF9TVEFfQUNUSU9OX0FERCk7DQorCWV0aGVyX2FkZHJfY29weShwY21k LT5tYWNfYWRkciwgdmlmLT5hZGRyKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2 LCBIT1NUQ01EX0NNRF9TRVRfTkVXX1NUTikpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5m d2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4i KTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2Nt ZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X25ld19z dG5fZGVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAgIHN0cnVjdCBpZWVlODAy MTFfdmlmICp2aWYsIHU4ICphZGRyKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct PnByaXY7DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRf c2V0X25ld19zdG4gKnBjbWQ7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsN CisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X25ld19zdG4gKikmcHJpdi0+cGNt ZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCW1l bXNldChwY21kLCAweDAwLCBzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5jbWQgPSBj cHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRfTkVXX1NUTik7DQorCXBjbWQtPmNtZF9oZHIubGVu ID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIubWFjaWQgPSBt d2xfdmlmLT5tYWNpZDsNCisNCisJcGNtZC0+YWN0aW9uID0gY3B1X3RvX2xlMTYoSE9TVENNRF9B Q1RfU1RBX0FDVElPTl9SRU1PVkUpOw0KKwlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIs IGFkZHIpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NF VF9ORVdfU1ROKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJ d2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1F SU87DQorCX0NCisNCisJaWYgKHZpZi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7 DQorCQlldGhlcl9hZGRyX2NvcHkocGNtZC0+bWFjX2FkZHIsIG13bF92aWYtPnN0YV9tYWMpOw0K Kw0KKwkJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfTkVXX1NU TikpIHsNCisJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQkJd2lwaHlf ZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJCXJldHVybiAtRUlPOw0K KwkJfQ0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJ cmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X2FwbW9kZShzdHJ1Y3QgaWVlZTgw MjExX2h3ICpodywgdTggYXBtb2RlKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct PnByaXY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfYXBtb2RlICpwY21kOw0KKw0KKwlwY21k ID0gKHN0cnVjdCBob3N0Y21kX2NtZF9zZXRfYXBtb2RlICopJnByaXYtPnBjbWRfYnVmWzBdOw0K Kw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwg MHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYo SE9TVENNRF9DTURfU0VUX0FQTU9ERSk7DQorCXBjbWQtPmNtZF9oZHIubGVuID0gY3B1X3RvX2xl MTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmFwbW9kZSA9IGFwbW9kZTsNCisNCisJaWYgKG13 bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRfQVBNT0RFKSkgew0KKwkJc3Bp bl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwg ImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91 bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50 IG13bF9md2NtZF91cGRhdGVfZW5jcnlwdGlvbl9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAq aHcsDQorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkgICAgICAg dTggKmFkZHIsIHU4IGVuY3JfdHlwZSkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3 LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3RydWN0IGhvc3RjbWRfY21k X3VwZGF0ZV9lbmNyeXB0aW9uICpwY21kOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rldl9nZXRfdmlm KHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3VwZGF0ZV9lbmNyeXB0aW9u ICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xv Y2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNt ZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfVVBEQVRFX0VOQ1JZUFRJT04pOw0K KwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21k LT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorDQorCXBjbWQtPmFjdGlvbl90eXBl ID0gY3B1X3RvX2xlMzIoRU5DUl9BQ1RJT05fRU5BQkxFX0hXX0VOQ1IpOw0KKwlldGhlcl9hZGRy X2NvcHkocGNtZC0+bWFjX2FkZHIsIGFkZHIpOw0KKwlwY21kLT5hY3Rpb25fZGF0YVswXSA9IGVu Y3JfdHlwZTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9V UERBVEVfRU5DUllQVElPTikpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2Nr KTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJl dHVybiAtRUlPOw0KKwl9DQorDQorCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RB VElPTikgew0KKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwobXdsX3ZpZi0+YnNzaWQsIGFkZHIpKQ0K KwkJCWV0aGVyX2FkZHJfY29weShwY21kLT5tYWNfYWRkciwgbXdsX3ZpZi0+c3RhX21hYyk7DQor CQllbHNlDQorCQkJZXRoZXJfYWRkcl9jb3B5KHBjbWQtPm1hY19hZGRyLCBtd2xfdmlmLT5ic3Np ZCk7DQorDQorCQlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1VQREFU RV9FTkNSWVBUSU9OKSkgew0KKwkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN CisJCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQkJcmV0 dXJuIC1FSU87DQorCQl9DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xv Y2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9lbmNyeXB0aW9uX3Nl dF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmLCB1OCAqYWRkciwNCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSkN Cit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3Zp ZiAqbXdsX3ZpZjsNCisJc3RydWN0IGhvc3RjbWRfY21kX3NldF9rZXkgKnBjbWQ7DQorCWludCBy YzsNCisJaW50IGtleW1sZW47DQorCXUzMiBhY3Rpb247DQorCXU4IGlkeDsNCisNCisJbXdsX3Zp ZiA9IG13bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0Y21kX2Nt ZF9zZXRfa2V5ICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYt PmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQor CXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfVVBEQVRFX0VOQ1JZ UFRJT04pOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkp Ow0KKwlwY21kLT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorDQorCXJjID0gbXds X2Z3Y21kX2VuY3J5cHRpb25fc2V0X2NtZF9pbmZvKHBjbWQsIGFkZHIsIGtleSk7DQorCWlmIChy Yykgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJy KGh3LT53aXBoeSwgImVuY3J5cHRpb24gbm90IHN1cHBvcnRcbiIpOw0KKwkJcmV0dXJuIHJjOw0K Kwl9DQorDQorCWlkeCA9IGtleS0+a2V5aWR4Ow0KKw0KKwlpZiAoa2V5LT5mbGFncyAmIElFRUU4 MDIxMV9LRVlfRkxBR19QQUlSV0lTRSkNCisJCWFjdGlvbiA9IEVOQ1JfQUNUSU9OX1RZUEVfU0VU X0tFWTsNCisJZWxzZQ0KKwkJYWN0aW9uID0gRU5DUl9BQ1RJT05fVFlQRV9TRVRfR1JPVVBfS0VZ Ow0KKw0KKwlzd2l0Y2ggKGtleS0+Y2lwaGVyKSB7DQorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVf V0VQNDA6DQorCWNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0Og0KKwkJaWYgKCFtd2xfdmlm LT53ZXBfa2V5X2NvbmZbaWR4XS5lbmFibGVkKSB7DQorCQkJbWVtY3B5KG13bF92aWYtPndlcF9r ZXlfY29uZltpZHhdLmtleSwga2V5LA0KKwkJCSAgICAgICBzaXplb2YoKmtleSkgKyBrZXktPmtl eWxlbik7DQorCQkJbXdsX3ZpZi0+d2VwX2tleV9jb25mW2lkeF0uZW5hYmxlZCA9IDE7DQorCQl9 DQorDQorCQlrZXltbGVuID0ga2V5LT5rZXlsZW47DQorCQlhY3Rpb24gPSBFTkNSX0FDVElPTl9U WVBFX1NFVF9LRVk7DQorCQlicmVhazsNCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9US0lQOg0K KwkJa2V5bWxlbiA9IE1BWF9FTkNSX0tFWV9MRU5HVEggKyAyICogTUlDX0tFWV9MRU5HVEg7DQor CQlicmVhazsNCisJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9DQ01QOg0KKwkJa2V5bWxlbiA9IGtl eS0+a2V5bGVuOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlzcGluX3VubG9ja19iaCgmcHJp di0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZW5jcnlwdGlvbiBub3Qg c3VwcG9ydFxuIik7DQorCQlyZXR1cm4gLUVOT1RTVVBQOw0KKwl9DQorDQorCW1lbWNweSgodm9p ZCAqKSZwY21kLT5rZXlfcGFyYW0ua2V5LCBrZXktPmtleSwga2V5bWxlbik7DQorCXBjbWQtPmFj dGlvbl90eXBlID0gY3B1X3RvX2xlMzIoYWN0aW9uKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVj X2NtZChwcml2LCBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTikpIHsNCisJCXNwaW5fdW5s b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWls ZWQgZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCWlmICh2aWYtPnR5 cGUgPT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikgew0KKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwo bXdsX3ZpZi0+YnNzaWQsIGFkZHIpKQ0KKwkJCWV0aGVyX2FkZHJfY29weShwY21kLT5rZXlfcGFy YW0ubWFjX2FkZHIsDQorCQkJCQltd2xfdmlmLT5zdGFfbWFjKTsNCisJCWVsc2UNCisJCQlldGhl cl9hZGRyX2NvcHkocGNtZC0+a2V5X3BhcmFtLm1hY19hZGRyLA0KKwkJCQkJbXdsX3ZpZi0+YnNz aWQpOw0KKw0KKwkJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9VUERB VEVfRU5DUllQVElPTikpIHsNCisJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7 DQorCQkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJCXJl dHVybiAtRUlPOw0KKwkJfQ0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9s b2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfZW5jcnlwdGlvbl9y ZW1vdmVfa2V5KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkgICAgc3RydWN0IGllZWU4 MDIxMV92aWYgKnZpZiwgdTggKmFkZHIsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX2tleV9j b25mICprZXkpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3Ry dWN0IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBob3N0Y21kX2NtZF9zZXRfa2V5ICpwY21k Ow0KKwlpbnQgcmM7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlmKTsNCisNCisJ cGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2tleSAqKSZwcml2LT5wY21kX2J1ZlswXTsN CisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQs IDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2 KEhPU1RDTURfQ01EX1VQREFURV9FTkNSWVBUSU9OKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBj cHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsNCisJcGNtZC0+Y21kX2hkci5tYWNpZCA9IG13bF92 aWYtPm1hY2lkOw0KKw0KKwlyYyA9IG13bF9md2NtZF9lbmNyeXB0aW9uX3NldF9jbWRfaW5mbyhw Y21kLCBhZGRyLCBrZXkpOw0KKwlpZiAocmMpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5m d2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJlbmNyeXB0aW9uIG5vdCBzdXBw b3J0XG4iKTsNCisJCXJldHVybiByYzsNCisJfQ0KKw0KKwlwY21kLT5hY3Rpb25fdHlwZSA9IGNw dV90b19sZTMyKEVOQ1JfQUNUSU9OX1RZUEVfUkVNT1ZFX0tFWSk7DQorDQorCWlmIChrZXktPmNp cGhlciA9PSBXTEFOX0NJUEhFUl9TVUlURV9XRVA0MCB8fA0KKwkgICAga2V5LT5jaXBoZXIgPT0g V0xBTl9DSVBIRVJfU1VJVEVfV0VQMTA0KQ0KKwkJbXdsX3ZpZi0+d2VwX2tleV9jb25mW2tleS0+ a2V5aWR4XS5lbmFibGVkID0gMDsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBI T1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTikpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2 LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhlY3V0aW9u XG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5m d2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfY2hlY2tf YmEoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICAgc3RydWN0IG13bF9hbXBkdV9z dHJlYW0gKnN0cmVhbSwNCisJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmKQ0KK3sN CisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBtd2xfdmlmICpt d2xfdmlmOw0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfYmFzdHJlYW0gKnBjbWQ7DQorCXUzMiBiYV9m bGFncywgYmFfdHlwZSwgYmFfZGlyZWN0aW9uOw0KKw0KKwltd2xfdmlmID0gbXdsX2Rldl9nZXRf dmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2Jhc3RyZWFtICopJnBy aXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K Kw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIu Y21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfQkFTVFJFQU0pOw0KKwlwY21kLT5jbWRfaGRy LmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLm1hY2lk ID0gbXdsX3ZpZi0+bWFjaWQ7DQorCXBjbWQtPmNtZF9oZHIucmVzdWx0ID0gY3B1X3RvX2xlMTYo MHhmZmZmKTsNCisNCisJcGNtZC0+YWN0aW9uX3R5cGUgPSBjcHVfdG9fbGUzMihCQV9DSEVDS19T VFJFQU0pOw0KKwlldGhlcl9hZGRyX2NvcHkoJnBjbWQtPmJhX2luZm8uY3JlYXRlX3BhcmFtcy5w ZWVyX21hY19hZGRyWzBdLA0KKwkJCXN0cmVhbS0+c3RhLT5hZGRyKTsNCisJcGNtZC0+YmFfaW5m by5jcmVhdGVfcGFyYW1zLnRpZCA9IHN0cmVhbS0+dGlkOw0KKwliYV90eXBlID0gQkFTVFJFQU1f RkxBR19JTU1FRElBVEVfVFlQRTsNCisJYmFfZGlyZWN0aW9uID0gQkFTVFJFQU1fRkxBR19ESVJF Q1RJT05fVVBTVFJFQU07DQorCWJhX2ZsYWdzID0gKGJhX3R5cGUgJiBCQV9UWVBFX01BU0spIHwN CisJCSgoYmFfZGlyZWN0aW9uIDw8IEJBX0RJUkVDVElPTl9TSElGVCkgJiBCQV9ESVJFQ1RJT05f TUFTSyk7DQorCXBjbWQtPmJhX2luZm8uY3JlYXRlX3BhcmFtcy5mbGFncyA9IGNwdV90b19sZTMy KGJhX2ZsYWdzKTsNCisJcGNtZC0+YmFfaW5mby5jcmVhdGVfcGFyYW1zLnF1ZXVlX2lkID0gc3Ry ZWFtLT5pZHg7DQorDQorCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwgSE9TVENNRF9DTURf QkFTVFJFQU0pKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3 aXBoeV9lcnIoaHctPndpcGh5LCAiY2hlY2sgYmEgZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQly ZXR1cm4gLUVJTzsNCisJfQ0KKw0KKwlpZiAocGNtZC0+Y21kX2hkci5yZXN1bHQgIT0gMCkgew0K KwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53 aXBoeSwgImNoZWNrIGJhIHJlc3VsdCBlcnJvciAlZFxuIiwNCisJCQkgIGxlMTZfdG9fY3B1KHBj bWQtPmNtZF9oZHIucmVzdWx0KSk7DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0KKw0KKwlzcGlu X3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitp bnQgbXdsX2Z3Y21kX2NyZWF0ZV9iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQlzdHJ1 Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtLA0KKwkJCXU4IGJ1Zl9zaXplLCBzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7 DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfYmFzdHJl YW0gKnBjbWQ7DQorCXUzMiBiYV9mbGFncywgYmFfdHlwZSwgYmFfZGlyZWN0aW9uOw0KKw0KKwlt d2xfdmlmID0gbXdsX2Rldl9nZXRfdmlmKHZpZik7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3Rj bWRfY21kX2Jhc3RyZWFtICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgo JnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21k KSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfQkFTVFJF QU0pOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0K KwlwY21kLT5jbWRfaGRyLm1hY2lkID0gbXdsX3ZpZi0+bWFjaWQ7DQorCXBjbWQtPmNtZF9oZHIu cmVzdWx0ID0gY3B1X3RvX2xlMTYoMHhmZmZmKTsNCisNCisJcGNtZC0+YWN0aW9uX3R5cGUgPSBj cHVfdG9fbGUzMihCQV9DUkVBVEVfU1RSRUFNKTsNCisJcGNtZC0+YmFfaW5mby5jcmVhdGVfcGFy YW1zLmJhcl90aHJzID0gY3B1X3RvX2xlMzIoYnVmX3NpemUpOw0KKwlwY21kLT5iYV9pbmZvLmNy ZWF0ZV9wYXJhbXMud2luZG93X3NpemUgPSBjcHVfdG9fbGUzMihidWZfc2l6ZSk7DQorCWV0aGVy X2FkZHJfY29weSgmcGNtZC0+YmFfaW5mby5jcmVhdGVfcGFyYW1zLnBlZXJfbWFjX2FkZHJbMF0s DQorCQkJc3RyZWFtLT5zdGEtPmFkZHIpOw0KKwlwY21kLT5iYV9pbmZvLmNyZWF0ZV9wYXJhbXMu dGlkID0gc3RyZWFtLT50aWQ7DQorCWJhX3R5cGUgPSBCQVNUUkVBTV9GTEFHX0lNTUVESUFURV9U WVBFOw0KKwliYV9kaXJlY3Rpb24gPSBCQVNUUkVBTV9GTEFHX0RJUkVDVElPTl9VUFNUUkVBTTsN CisJYmFfZmxhZ3MgPSAoYmFfdHlwZSAmIEJBX1RZUEVfTUFTSykgfA0KKwkJKChiYV9kaXJlY3Rp b24gPDwgQkFfRElSRUNUSU9OX1NISUZUKSAmIEJBX0RJUkVDVElPTl9NQVNLKTsNCisJcGNtZC0+ YmFfaW5mby5jcmVhdGVfcGFyYW1zLmZsYWdzID0gY3B1X3RvX2xlMzIoYmFfZmxhZ3MpOw0KKwlw Y21kLT5iYV9pbmZvLmNyZWF0ZV9wYXJhbXMucXVldWVfaWQgPSBzdHJlYW0tPmlkeDsNCisJcGNt ZC0+YmFfaW5mby5jcmVhdGVfcGFyYW1zLnBhcmFtX2luZm8gPQ0KKwkJKHN0cmVhbS0+c3RhLT5o dF9jYXAuYW1wZHVfZmFjdG9yICYNCisJCSBJRUVFODAyMTFfSFRfQU1QRFVfUEFSTV9GQUNUT1Ip IHwNCisJCSgoc3RyZWFtLT5zdGEtPmh0X2NhcC5hbXBkdV9kZW5zaXR5IDw8IDIpICYNCisJCSBJ RUVFODAyMTFfSFRfQU1QRFVfUEFSTV9ERU5TSVRZKTsNCisJcGNtZC0+YmFfaW5mby5jcmVhdGVf cGFyYW1zLnJlc2V0X3NlcV9ubyA9IDE7DQorCXBjbWQtPmJhX2luZm8uY3JlYXRlX3BhcmFtcy5j dXJyZW50X3NlcSA9IGNwdV90b19sZTE2KDApOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21k KHByaXYsIEhPU1RDTURfQ01EX0JBU1RSRUFNKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYt PmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImNyZWF0ZSBiYSBmYWlsZWQg ZXhlY3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCWlmIChwY21kLT5jbWRf aGRyLnJlc3VsdCAhPSAwKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7 DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY3JlYXRlIGJhIHJlc3VsdCBlcnJvciAlZFxuIiwN CisJCQkgIGxlMTZfdG9fY3B1KHBjbWQtPmNtZF9oZHIucmVzdWx0KSk7DQorCQlyZXR1cm4gLUVJ TlZBTDsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQor CXJldHVybiAwOw0KK30NCisNCitpbnQgbXdsX2Z3Y21kX2Rlc3Ryb3lfYmEoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcsDQorCQkJIHU4IGlkeCkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9 IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfYmFzdHJlYW0gKnBjbWQ7DQorCXUzMiBi YV9mbGFncywgYmFfdHlwZSwgYmFfZGlyZWN0aW9uOw0KKw0KKwlwY21kID0gKHN0cnVjdCBob3N0 Y21kX2NtZF9iYXN0cmVhbSAqKSZwcml2LT5wY21kX2J1ZlswXTsNCisNCisJc3Bpbl9sb2NrX2Jo KCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNt ZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19sZTE2KEhPU1RDTURfQ01EX0JBU1RS RUFNKTsNCisJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXplb2YoKnBjbWQpKTsN CisNCisJcGNtZC0+YWN0aW9uX3R5cGUgPSBjcHVfdG9fbGUzMihCQV9ERVNUUk9ZX1NUUkVBTSk7 DQorCWJhX3R5cGUgPSBCQVNUUkVBTV9GTEFHX0lNTUVESUFURV9UWVBFOw0KKwliYV9kaXJlY3Rp b24gPSBCQVNUUkVBTV9GTEFHX0RJUkVDVElPTl9VUFNUUkVBTTsNCisJYmFfZmxhZ3MgPSAoYmFf dHlwZSAmIEJBX1RZUEVfTUFTSykgfA0KKwkJKChiYV9kaXJlY3Rpb24gPDwgQkFfRElSRUNUSU9O X1NISUZUKSAmIEJBX0RJUkVDVElPTl9NQVNLKTsNCisJcGNtZC0+YmFfaW5mby5kZXN0cm95X3Bh cmFtcy5mbGFncyA9IGNwdV90b19sZTMyKGJhX2ZsYWdzKTsNCisJcGNtZC0+YmFfaW5mby5kZXN0 cm95X3BhcmFtcy5md19iYV9jb250ZXh0LmNvbnRleHQgPSBjcHVfdG9fbGUzMihpZHgpOw0KKw0K KwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0JBU1RSRUFNKSkgew0K KwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53 aXBoeSwgImRlc3Ryb3kgYmEgZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsN CisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVy biAwOw0KK30NCisNCisvKiBjYWxsZXIgbXVzdCBob2xkIHByaXYtPnN0cmVhbV9sb2NrIHdoZW4g Y2FsbGluZyB0aGUgc3RyZWFtIGZ1bmN0aW9ucyAqLw0KK3N0cnVjdCBtd2xfYW1wZHVfc3RyZWFt ICptd2xfZndjbWRfYWRkX3N0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJCSAg ICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsDQorCQkJCQkgICAgICB1OCB0aWQpDQorew0K KwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJc3RydWN0IG13bF9hbXBkdV9z dHJlYW0gKnN0cmVhbTsNCisJaW50IGk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBTWVNBRFBUX1RY X0FNUERVX1FVRVVFUzsgaSsrKSB7DQorCQlzdHJlYW0gPSAmcHJpdi0+YW1wZHVbaV07DQorDQor CQlpZiAoc3RyZWFtLT5zdGF0ZSA9PSBBTVBEVV9OT19TVFJFQU0pIHsNCisJCQlzdHJlYW0tPnN0 YSA9IHN0YTsNCisJCQlzdHJlYW0tPnN0YXRlID0gQU1QRFVfU1RSRUFNX05FVzsNCisJCQlzdHJl YW0tPnRpZCA9IHRpZDsNCisJCQlzdHJlYW0tPmlkeCA9IGk7DQorCQkJcmV0dXJuIHN0cmVhbTsN CisJCX0NCisJfQ0KKw0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQordm9pZCBtd2xfZndjbWRfZGVs X3N0YV9zdHJlYW1zKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAgICBzdHJ1Y3Qg aWVlZTgwMjExX3N0YSAqc3RhKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnBy aXY7DQorCXN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtICpzdHJlYW07DQorCWludCBpOw0KKw0KKwlm b3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9BTVBEVV9RVUVVRVM7IGkrKykgew0KKwkJc3RyZWFt ID0gJnByaXYtPmFtcGR1W2ldOw0KKw0KKwkJaWYgKHN0cmVhbS0+c3RhID09IHN0YSkgew0KKwkJ CW13bF9md2NtZF9kZXN0cm95X2JhKGh3LCBzdHJlYW0tPmlkeCk7DQorCQkJbXdsX2Z3Y21kX3Jl bW92ZV9zdHJlYW0oaHcsIHN0cmVhbSk7DQorCQl9DQorCX0NCit9DQorDQoraW50IG13bF9md2Nt ZF9zdGFydF9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgc3RydWN0IG13 bF9hbXBkdV9zdHJlYW0gKnN0cmVhbSkNCit7DQorCS8qIGlmIHRoZSBzdHJlYW0gaGFzIGFscmVh ZHkgYmVlbiBzdGFydGVkLCBkb24ndCBzdGFydCBpdCBhZ2FpbiAqLw0KKwlpZiAoc3RyZWFtLT5z dGF0ZSAhPSBBTVBEVV9TVFJFQU1fTkVXKQ0KKwkJcmV0dXJuIDA7DQorDQorCXJldHVybiBpZWVl ODAyMTFfc3RhcnRfdHhfYmFfc2Vzc2lvbihzdHJlYW0tPnN0YSwgc3RyZWFtLT50aWQsIDApOw0K K30NCisNCit2b2lkIG13bF9md2NtZF9yZW1vdmVfc3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LA0KKwkJCSAgICAgc3RydWN0IG13bF9hbXBkdV9zdHJlYW0gKnN0cmVhbSkNCit7DQorCW1l bXNldChzdHJlYW0sIDAsIHNpemVvZigqc3RyZWFtKSk7DQorfQ0KKw0KK3N0cnVjdCBtd2xfYW1w ZHVfc3RyZWFtICptd2xfZndjbWRfbG9va3VwX3N0cmVhbShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo dywNCisJCQkJCQkgdTggKmFkZHIsIHU4IHRpZCkNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJp diA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtOw0KKwlpbnQg aTsNCisNCisJZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfVFhfQU1QRFVfUVVFVUVTOyBpKyspIHsN CisJCXN0cmVhbSA9ICZwcml2LT5hbXBkdVtpXTsNCisNCisJCWlmIChzdHJlYW0tPnN0YXRlID09 IEFNUERVX05PX1NUUkVBTSkNCisJCQljb250aW51ZTsNCisNCisJCWlmIChldGhlcl9hZGRyX2Vx dWFsKHN0cmVhbS0+c3RhLT5hZGRyLCBhZGRyKSAmJg0KKwkJICAgIHN0cmVhbS0+dGlkID09IHRp ZCkNCisJCQlyZXR1cm4gc3RyZWFtOw0KKwl9DQorDQorCXJldHVybiBOVUxMOw0KK30NCisNCiti b29sIG13bF9md2NtZF9hbXBkdV9hbGxvd2VkKHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4 IHRpZCkNCit7DQorCXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCisJc3RydWN0IG13bF90eF9p bmZvICp0eF9zdGF0czsNCisNCisJaWYgKFdBUk5fT04odGlkID49IFNZU0FEUFRfTUFYX1RJRCkp DQorCQlyZXR1cm4gZmFsc2U7DQorDQorCXN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7 DQorDQorCXR4X3N0YXRzID0gJnN0YV9pbmZvLT50eF9zdGF0c1t0aWRdOw0KKw0KKwlyZXR1cm4g KHN0YV9pbmZvLT5pc19hbXBkdV9hbGxvd2VkICYmDQorCQl0eF9zdGF0cy0+cGt0cyA+IFNZU0FE UFRfQU1QRFVfUEFDS0VUX1RIUkVTSE9MRCk7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRfc2V0X29w dGltaXphdGlvbl9sZXZlbChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggb3B0X2xldmVsKQ0K K3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQorCXN0cnVjdCBob3N0Y21k X2NtZF9zZXRfb3B0aW1pemF0aW9uX2xldmVsICpwY21kOw0KKw0KKwlwY21kID0gKHN0cnVjdCBo b3N0Y21kX2NtZF9zZXRfb3B0aW1pemF0aW9uX2xldmVsICopJnByaXYtPnBjbWRfYnVmWzBdOw0K Kw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwg MHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYo SE9TVENNRF9DTURfU0VUX09QVElNSVpBVElPTl9MRVZFTCk7DQorCXBjbWQtPmNtZF9oZHIubGVu ID0gY3B1X3RvX2xlMTYoc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPm9wdF9sZXZlbCA9IG9wdF9s ZXZlbDsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2NtZChwcml2LCBIT1NUQ01EX0NNRF9TRVRf T1BUSU1JWkFUSU9OX0xFVkVMKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xv Y2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0KKwkJ cmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2sp Ow0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfZHdkc19zdGFtb2Rl KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBib29sIGVuYWJsZSkNCit7DQorCXN0cnVjdCBtd2xf cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfZHdkc19lbmFibGUg KnBjbWQ7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2R3ZHNfZW5hYmxlICopJnBy aXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0K Kw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQtPmNtZF9oZHIu Y21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfRFdEU19FTkFCTEUpOw0KKwlwY21kLT5jbWRf aGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5lbmFibGUgPSBj cHVfdG9fbGUzMihlbmFibGUpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhP U1RDTURfQ01EX0RXRFNfRU5BQkxFKSkgew0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21k X2xvY2spOw0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZhaWxlZCBleGVjdXRpb25cbiIpOw0K KwkJcmV0dXJuIC1FSU87DQorCX0NCisNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xv Y2spOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50IG13bF9md2NtZF9zZXRfZndfZmx1c2hf dGltZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSkNCit7DQorCXN0cnVjdCBt d2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfZndfZmx1c2hf dGltZXIgKnBjbWQ7DQorDQorCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX2Z3X2ZsdXNoX3Rp bWVyICopJnByaXYtPnBjbWRfYnVmWzBdOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPmZ3Y21k X2xvY2spOw0KKw0KKwltZW1zZXQocGNtZCwgMHgwMCwgc2l6ZW9mKCpwY21kKSk7DQorCXBjbWQt PmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURfRldfRkxVU0hfVElNRVIpOw0K KwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21k LT52YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsNCisNCisJaWYgKG13bF9md2NtZF9leGVjX2Nt ZChwcml2LCBIT1NUQ01EX0NNRF9GV19GTFVTSF9USU1FUikpIHsNCisJCXNwaW5fdW5sb2NrX2Jo KCZwcml2LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJmYWlsZWQgZXhl Y3V0aW9uXG4iKTsNCisJCXJldHVybiAtRUlPOw0KKwl9DQorDQorCXNwaW5fdW5sb2NrX2JoKCZw cml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK2ludCBtd2xfZndjbWRf c2V0X2NkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAq cHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2NkZCAqcGNtZDsNCisN CisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2NkZCAqKSZwcml2LT5wY21kX2J1Zlsw XTsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJbWVtc2V0KHBj bWQsIDB4MDAsIHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5jbWRfaGRyLmNtZCA9IGNwdV90b19s ZTE2KEhPU1RDTURfQ01EX1NFVF9DREQpOw0KKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19s ZTE2KHNpemVvZigqcGNtZCkpOw0KKwlwY21kLT5lbmFibGUgPSBjcHVfdG9fbGUzMihwcml2LT5j ZGQpOw0KKw0KKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX1NFVF9D REQpKSB7DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorCQl3aXBoeV9l cnIoaHctPndpcGh5LCAiZmFpbGVkIGV4ZWN1dGlvblxuIik7DQorCQlyZXR1cm4gLUVJTzsNCisJ fQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQorDQorCXJldHVybiAw Ow0KK30NCisNCitpbnQgbXdsX2Z3Y21kX3NlbmRfbWZnX2NtZChzdHJ1Y3QgbXdsX3ByaXYgKnBy aXYsIGNoYXIgKm1mZ2NtZCkNCit7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciAqcGNtZDsNCisJ c3RydWN0IGNtZF9oZWFkZXIgKmNtZF9oZCA9IChzdHJ1Y3QgY21kX2hlYWRlciAqKShtZmdjbWQg KyA0KTsNCisJdTE2IGxlbjsNCisJdTE2IGNtZDsNCisNCisJcGNtZCA9IChzdHJ1Y3QgaG9zdGNt ZF9oZWFkZXIgKikmcHJpdi0+cGNtZF9idWZbMF07DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+ ZndjbWRfbG9jayk7DQorDQorCWxlbiA9IGxlMTZfdG9fY3B1KGNtZF9oZC0+bGVuKTsNCisJbWVt c2V0KHBjbWQsIDB4MDAsIGxlbiArIDQpOw0KKwltZW1jcHkoKGNoYXIgKilwY21kLCBtZmdjbWQs IGxlbiArIDQpOw0KKwljbWQgPSBsZTE2X3RvX2NwdShjbWRfaGQtPmNvbW1hbmQpOw0KKwlpZiAo bXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIGNtZCkpIHsNCisJCXNwaW5fdW5sb2NrX2JoKCZwcml2 LT5md2NtZF9sb2NrKTsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJmYWlsZWQgZXhl Y3V0aW9uIik7DQorCQlyZXR1cm4gLUVJTzsNCisJfQ0KKwljbWRfaGQgPSAoc3RydWN0IGNtZF9o ZWFkZXIgKikmcHJpdi0+cGNtZF9idWZbMl07DQorCWxlbiA9IGxlMTZfdG9fY3B1KGNtZF9oZC0+ bGVuKTsNCisJbWVtY3B5KG1mZ2NtZCwgKGNoYXIgKikmcHJpdi0+cGNtZF9idWZbMl0sIGxlbik7 DQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQor fQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9md2Nt ZC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2Z3Y21kLmgNCm5ldyBm aWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi43MjZiMTY5DQotLS0gL2Rldi9udWxsDQor KysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvZndjbWQuaA0KQEAgLTAs MCArMSwxOTggQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2ZWxsIElu dGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUi KSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQuIHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBK dW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRl IGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJt cyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQorICogaXMg YXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j Lg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFO VFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB TlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICogQVJFIEVY UFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRh aWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0KKy8qIERl c2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZmlybXdhcmUgaG9zdCBjb21tYW5kIHJlbGF0 ZWQNCisgKiBmdW5jdGlvbnMuDQorICovDQorDQorI2lmbmRlZiBfZndjbWRfaF8NCisjZGVmaW5l IF9md2NtZF9oXw0KKw0KKy8qICBEZWZpbmUgT3BNb2RlIGZvciBTb2Z0QVAvU3RhdGlvbiBtb2Rl DQorICoNCisgKiAgVGhlIGZvbGxvd2luZyBtb2RlIHNpZ25hdHVyZSBoYXMgdG8gYmUgd3JpdHRl biB0byBQQ0kgc2NyYXRjaCByZWdpc3RlciMwDQorICogIHJpZ2h0IGFmdGVyIHN1Y2Nlc3NmdWxs eSBkb3dubG9hZGluZyB0aGUgbGFzdCBibG9jayBvZiBmaXJtd2FyZSBhbmQNCisgKiAgYmVmb3Jl IHdhaXRpbmcgZm9yIGZpcm13YXJlIHJlYWR5IHNpZ25hdHVyZQ0KKyAqLw0KKw0KKyNkZWZpbmUg SE9TVENNRF9TVEFfTU9ERSAgICAgICAgICAgICAgICAweDVBDQorI2RlZmluZSBIT1NUQ01EX1NP RlRBUF9NT0RFICAgICAgICAgICAgIDB4QTUNCisNCisjZGVmaW5lIEhPU1RDTURfU1RBX0ZXUkRZ X1NJR05BVFVSRSAgICAgMHhGMEYxRjJGNA0KKyNkZWZpbmUgSE9TVENNRF9TT0ZUQVBfRldSRFlf U0lHTkFUVVJFICAweEYxRjJGNEE1DQorDQorI2RlZmluZSBHVUFSRF9JTlRFUlZBTF9TVEFOREFS RCAgICAgICAgIDENCisjZGVmaW5lIEdVQVJEX0lOVEVSVkFMX1NIT1JUICAgICAgICAgICAgMg0K KyNkZWZpbmUgR1VBUkRfSU5URVJWQUxfQVVUTyAgICAgICAgICAgICAzDQorDQorI2RlZmluZQlM SU5LX0NTX1NUQVRFX0NPTlNFUlYgICAgICAgICAgIDANCisjZGVmaW5lCUxJTktfQ1NfU1RBVEVf QUdHUiAgICAgICAgICAgICAgMQ0KKyNkZWZpbmUJTElOS19DU19TVEFURV9BVVRPICAgICAgICAg ICAgICAyDQorI2RlZmluZQlMSU5LX0NTX1NUQVRFX0FVVE9fRElTQUJMRUQgICAgIDMNCisNCitl bnVtIHsNCisJV0xfQU5URU5OQVRZUEVfUlggPSAxLA0KKwlXTF9BTlRFTk5BVFlQRV9UWCA9IDIs DQorfTsNCisNCitlbnVtIGVuY3JfdHlwZSB7DQorCUVOQ1JfVFlQRV9XRVAgPSAwLA0KKwlFTkNS X1RZUEVfRElTQUJMRSA9IDEsDQorCUVOQ1JfVFlQRV9US0lQID0gNCwNCisJRU5DUl9UWVBFX0FF UyA9IDYsDQorCUVOQ1JfVFlQRV9NSVggPSA3LA0KK307DQorDQordm9pZCBtd2xfZndjbWRfcmVz ZXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KK3ZvaWQgbXdsX2Z3Y21kX2ludF9lbmFi bGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KK3ZvaWQgbXdsX2Z3Y21kX2ludF9kaXNh YmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCisNCitpbnQgbXdsX2Z3Y21kX2dldF9od19z cGVjcyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7DQorDQoraW50IG13bF9md2NtZF9zZXRfaHdf c3BlY3Moc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KK2ludCBtd2xfZndjbWRfZ2V0X3N0 YXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICAgc3RydWN0IGllZWU4MDIxMV9s b3dfbGV2ZWxfc3RhdHMgKnN0YXRzKTsNCisNCitpbnQgbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShz dHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7DQorDQoraW50IG13bF9md2NtZF9yYWRpb19kaXNhYmxl KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF9yYWRpb19w cmVhbWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJIGJvb2wgc2hvcnRfcHJlYW1i bGUpOw0KKw0KK2ludCBtd2xfZndjbWRfZ2V0X2FkZHJfdmFsdWUoc3RydWN0IGllZWU4MDIxMV9o dyAqaHcsIHUzMiBhZGRyLCB1MzIgbGVuLA0KKwkJCSAgICAgdTMyICp2YWwsIHUxNiBzZXQpOw0K Kw0KK2ludCBtd2xfZndjbWRfbWF4X3R4X3Bvd2VyKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0K KwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiwgdTggZnJhY3Rpb24pOw0KKw0KK2lu dCBtd2xfZndjbWRfdHhfcG93ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkgICAgICAg c3RydWN0IGllZWU4MDIxMV9jb25mICpjb25mLCB1OCBmcmFjdGlvbik7DQorDQoraW50IG13bF9m d2NtZF9yZl9hbnRlbm5hKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCBpbnQgZGlyLCBpbnQgYW50 ZW5uYSk7DQorDQoraW50IG13bF9md2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29s IGVuYWJsZSk7DQorDQoraW50IG13bF9md2NtZF9zZXRfcmZfY2hhbm5lbChzdHJ1Y3QgaWVlZTgw MjExX2h3ICpodywNCisJCQkgICAgIHN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZik7DQorDQor aW50IG13bF9md2NtZF9zZXRfYWlkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJICAgICAg c3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKmJzc2lkLCB1MTYgYWlkKTsNCisNCitpbnQg bXdsX2Z3Y21kX3NldF9pbmZyYV9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAg ICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZik7DQorDQoraW50IG13bF9md2NtZF9zZXRfcnRz X3RocmVzaG9sZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJaW50IHRocmVzaG9sZCk7 DQorDQoraW50IG13bF9md2NtZF9zZXRfZWRjYV9wYXJhbXMoc3RydWN0IGllZWU4MDIxMV9odyAq aHcsIHU4IGluZGV4LA0KKwkJCSAgICAgIHUxNiBjd19taW4sIHUxNiBjd19tYXgsIHU4IGFpZnMs IHUxNiB0eG9wKTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF93bW1fbW9kZShzdHJ1Y3QgaWVlZTgw MjExX2h3ICpodywgYm9vbCBlbmFibGUpOw0KKw0KK2ludCBtd2xfZndjbWRfaHRfZ3VhcmRfaW50 ZXJ2YWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiBnaV90eXBlKTsNCisNCitpbnQgbXds X2Z3Y21kX3VzZV9maXhlZF9yYXRlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAg aW50IG1jYXN0LCBpbnQgbWdtdCk7DQorDQoraW50IG13bF9md2NtZF9zZXRfbGlua2FkYXB0X2Nz X21vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgICB1MTYgY3NfbW9kZSk7DQor DQoraW50IG13bF9md2NtZF9zZXRfcmF0ZV9hZGFwdF9tb2RlKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LA0KKwkJCQkgIHUxNiBtb2RlKTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF9tYWNfYWRkcl9j bGllbnQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgc3RydWN0IGllZWU4MDIxMV92 aWYgKnZpZiwgdTggKm1hY19hZGRyKTsNCisNCitpbnQgbXdsX2Z3Y21kX2dldF93YXRjaGRvZ19i aXRtYXAoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgdTggKmJpdG1hcCk7DQorDQor aW50IG13bF9md2NtZF9yZW1vdmVfbWFjX2FkZHIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQor CQkJICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwgdTggKm1hY19hZGRyKTsNCisNCitp bnQgbXdsX2Z3Y21kX2Jzc19zdGFydChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQlzdHJ1 Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCBib29sIGVuYWJsZSk7DQorDQoraW50IG13bF9md2NtZF9z ZXRfYmVhY29uKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSBzdHJ1Y3QgaWVlZTgwMjEx X3ZpZiAqdmlmLCB1OCAqYmVhY29uLCBpbnQgbGVuKTsNCisNCitpbnQgbXdsX2Z3Y21kX3NldF9u ZXdfc3RuX2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgICAgICBzdHJ1Y3QgaWVl ZTgwMjExX3ZpZiAqdmlmLA0KKwkJCSAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOw0K Kw0KK2ludCBtd2xfZndjbWRfc2V0X25ld19zdG5fYWRkX3NlbGYoc3RydWN0IGllZWU4MDIxMV9o dyAqaHcsDQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOw0KKw0KK2ludCBtd2xf ZndjbWRfc2V0X25ld19zdG5fZGVsKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAg IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYsIHU4ICphZGRyKTsNCisNCitpbnQgbXdsX2Z3Y21k X3NldF9hcG1vZGUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IGFwbW9kZSk7DQorDQoraW50 IG13bF9md2NtZF91cGRhdGVfZW5jcnlwdGlvbl9lbmFibGUoc3RydWN0IGllZWU4MDIxMV9odyAq aHcsDQorCQkJCSAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkgICAgICAg dTggKmFkZHIsIHU4IGVuY3JfdHlwZSk7DQorDQoraW50IG13bF9md2NtZF9lbmNyeXB0aW9uX3Nl dF9rZXkoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSBzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmLCB1OCAqYWRkciwNCisJCQkJIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7 DQorDQoraW50IG13bF9md2NtZF9lbmNyeXB0aW9uX3JlbW92ZV9rZXkoc3RydWN0IGllZWU4MDIx MV9odyAqaHcsDQorCQkJCSAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLCB1OCAqYWRkciwN CisJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtleSk7DQorDQoraW50IG13bF9m d2NtZF9jaGVja19iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCSAgICAgICBzdHJ1Y3Qg bXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtLA0KKwkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdmlm ICp2aWYpOw0KKw0KK2ludCBtd2xfZndjbWRfY3JlYXRlX2JhKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LA0KKwkJCXN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtICpzdHJlYW0sDQorCQkJdTggYnVmX3Np emUsIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpOw0KKw0KK2ludCBtd2xfZndjbWRfZGVzdHJv eV9iYShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkgdTggaWR4KTsNCisNCitzdHJ1Y3Qg bXdsX2FtcGR1X3N0cmVhbSAqbXdsX2Z3Y21kX2FkZF9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9o dyAqaHcsDQorCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLA0KKwkJCQkJICAg ICAgdTggdGlkKTsNCisNCit2b2lkIG13bF9md2NtZF9kZWxfc3RhX3N0cmVhbXMoc3RydWN0IGll ZWU4MDIxMV9odyAqaHcsDQorCQkJICAgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpOw0K Kw0KK2ludCBtd2xfZndjbWRfc3RhcnRfc3RyZWFtKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0K KwkJCSAgIHN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtICpzdHJlYW0pOw0KKw0KK3ZvaWQgbXdsX2Z3 Y21kX3JlbW92ZV9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgICBzdHJ1 Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtKTsNCisNCitzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVh bSAqbXdsX2Z3Y21kX2xvb2t1cF9zdHJlYW0oc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJ CQkJIHU4ICphZGRyLCB1OCB0aWQpOw0KKw0KK2Jvb2wgbXdsX2Z3Y21kX2FtcGR1X2FsbG93ZWQo c3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggdGlkKTsNCisNCitpbnQgbXdsX2Z3Y21kX3Nl dF9vcHRpbWl6YXRpb25fbGV2ZWwoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHU4IG9wdF9sZXZl bCk7DQorDQoraW50IG13bF9md2NtZF9zZXRfZHdkc19zdGFtb2RlKHN0cnVjdCBpZWVlODAyMTFf aHcgKmh3LCBib29sIGVuYWJsZSk7DQorDQoraW50IG13bF9md2NtZF9zZXRfZndfZmx1c2hfdGlt ZXIoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiB2YWx1ZSk7DQorDQoraW50IG13bF9md2Nt ZF9zZXRfY2RkKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCisNCitpbnQgbXdsX2Z3Y21kX3Nl bmRfbWZnX2NtZChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIGNoYXIgKm1mZ2NtZCk7DQorDQorI2Vu ZGlmIC8qIF9md2NtZF9oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h cnZlbGwvbXdsd2lmaS9md2RsLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp ZmkvZndkbC5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZWM0NGFhNA0K LS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZp L2Z3ZGwuYw0KQEAgLTAsMCArMSwxOTkgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0y MDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBm aWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwN CisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVz ZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5j ZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9m IHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUg Rm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMs IFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJB TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMg YWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0K KyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMgZmlybXdhcmUg ZG93bmxvYWQgcmVsYXRlZA0KKyAqIGZ1bmN0aW9ucy4NCisgKi8NCisNCisjaW5jbHVkZSA8bGlu dXgvaW8uaD4NCisNCisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisj aW5jbHVkZSAiZndjbWQuaCINCisjaWZkZWYgQ09ORklHX1NVUFBPUlRfTUZHDQorI2luY2x1ZGUg Im1mZy5oIg0KKyNlbmRpZg0KKyNpbmNsdWRlICJmd2RsLmgiDQorDQorI2RlZmluZSBGV19ET1dO TE9BRF9CTE9DS19TSVpFICAgICAgICAgIDI1Ng0KKyNkZWZpbmUgRldfQ0hFQ0tfTVNFQ1MgICAg ICAgICAgICAgICAgICAzDQorDQorI2RlZmluZSBGV19NQVhfTlVNX0NIRUNLUyAgICAgICAgICAg ICAgIDB4ZmZmZg0KKw0KK3N0YXRpYyB2b2lkIG13bF9md2RsX3RyaWdfcGNpY21kKHN0cnVjdCBt d2xfcHJpdiAqcHJpdikNCit7DQorCXdyaXRlbChwcml2LT5wcGh5c19jbWRfYnVmLCBwcml2LT5p b2Jhc2UxICsgTUFDUkVHX1JFR19HRU5fUFRSKTsNCisNCisJd3JpdGVsKDB4MDAsIHByaXYtPmlv YmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsNCisNCisJd3JpdGVsKE1BQ1JFR19IMkFSSUNf QklUX0RPT1JfQkVMTCwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0gyQV9J TlRFUlJVUFRfRVZFTlRTKTsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX2Z3ZGxfdHJpZ19wY2lj bWRfYm9vdGNvZGUoc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJd3JpdGVsKHByaXYtPnBw aHlzX2NtZF9idWYsIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0dFTl9QVFIpOw0KKw0KKwl3 cml0ZWwoMHgwMCwgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfSU5UX0NPREUpOw0KKw0KKwl3 cml0ZWwoTUFDUkVHX0gyQVJJQ19CSVRfRE9PUl9CRUxMLA0KKwkgICAgICAgcHJpdi0+aW9iYXNl MSArIE1BQ1JFR19SRUdfSDJBX0lOVEVSUlVQVF9FVkVOVFMpOw0KK30NCisNCitpbnQgbXdsX2Z3 ZGxfZG93bmxvYWRfZmlybXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1 Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJY29uc3Qgc3RydWN0IGZpcm13YXJlICpm dzsNCisJdTMyIGN1cnJfaXRlcmF0aW9uID0gMDsNCisJdTMyIHNpemVfZndfZG93bmxvYWRlZCA9 IDA7DQorCXUzMiBpbnRfY29kZSA9IDA7DQorCXUzMiBsZW4gPSAwOw0KKyNpZmRlZiBDT05GSUdf U1VQUE9SVF9NRkcNCisJdTMyIGZ3cmVhZHlzaWduYXR1cmUgPSBwcml2LT5tZmdfbW9kZSA/DQor CQlNRkdfRldfUkVBRFlfU0lHTkFUVVJFIDogSE9TVENNRF9TT0ZUQVBfRldSRFlfU0lHTkFUVVJF Ow0KKyNlbHNlDQorCXUzMiBmd3JlYWR5c2lnbmF0dXJlID0gSE9TVENNRF9TT0ZUQVBfRldSRFlf U0lHTkFUVVJFOw0KKyNlbmRpZg0KKw0KKwlmdyA9IHByaXYtPmZ3X3Vjb2RlOw0KKw0KKwltd2xf ZndjbWRfcmVzZXQoaHcpOw0KKw0KKwkvKiBGVyBiZWZvcmUganVtcGluZyB0byBib290IHJvbSwg aXQgd2lsbCBlbmFibGUgUENJZSB0cmFuc2FjdGlvbiByZXRyeSwNCisJICogd2FpdCBmb3IgYm9v dCBjb2RlIHRvIHN0b3AgaXQuDQorCSAqLw0KKwltZGVsYXkoRldfQ0hFQ0tfTVNFQ1MpOw0KKw0K Kwl3cml0ZWwoTUFDUkVHX0EySFJJQ19CSVRfTUFTSywNCisJICAgICAgIHByaXYtPmlvYmFzZTEg KyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0xFQVJfU0VMKTsNCisJd3JpdGVsKDB4MDAsIHBy aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0FVU0UpOw0KKwl3cml0ZWwo MHgwMCwgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9NQVNLKTsNCisJ d3JpdGVsKE1BQ1JFR19BMkhSSUNfQklUX01BU0ssDQorCSAgICAgICBwcml2LT5pb2Jhc2UxICsg TUFDUkVHX1JFR19BMkhfSU5URVJSVVBUX1NUQVRVU19NQVNLKTsNCisNCisJLyogdGhpcyByb3V0 aW5lIGludGVyYWN0cyB3aXRoIFNDMiBib290cm9tIHRvIGRvd25sb2FkIGZpcm13YXJlIGJpbmFy eQ0KKwkgKiB0byB0aGUgZGV2aWNlLiBBZnRlciBETUEnZCB0byBTQzIsIHRoZSBmaXJtd2FyZSBj b3VsZCBiZSBkZWZsYXRlZCB0bw0KKwkgKiByZXNpZGUgb24gaXRzIHJlc3BlY3RpdmUgYmxvY2tz IHN1Y2ggYXMgSVRDTSwgRFRDTSwgU1FSQU0sDQorCSAqIChvciBldmVuIEREUiwgQUZURVIgRERS IGlzIGluaXQnZCBiZWZvcmUgZncgZG93bmxvYWQNCisJICovDQorCXdpcGh5X2luZm8oaHctPndp cGh5LCAiZncgZG93bmxvYWQgc3RhcnQgODhcbiIpOw0KKw0KKwkvKiBEaXNhYmxlIFBGVSBiZWZv cmUgRldETCAqLw0KKwl3cml0ZWwoMHgxMDAsIHByaXYtPmlvYmFzZTEgKyAweEUwRTQpOw0KKw0K KwkvKiBtYWtlIHN1cmUgU0NSQVRDSDIgQzQwIGlzIGNsZWFyLCBpbiBjYXNlIHdlIGFyZSB0b28g cXVpY2sgKi8NCisJd2hpbGUgKHJlYWRsKHByaXYtPmlvYmFzZTEgKyAweGM0MCkgPT0gMCkNCisJ CTsNCisNCisJd2hpbGUgKHNpemVfZndfZG93bmxvYWRlZCA8IGZ3LT5zaXplKSB7DQorCQlsZW4g PSByZWFkbChwcml2LT5pb2Jhc2UxICsgMHhjNDApOw0KKw0KKwkJaWYgKCFsZW4pDQorCQkJYnJl YWs7DQorDQorCQkvKiB0aGlzIGNvcGllcyB0aGUgbmV4dCBjaHVuayBvZiBmdyBiaW5hcnkgdG8g YmUgZGVsaXZlcmVkICovDQorCQltZW1jcHkoKGNoYXIgKikmcHJpdi0+cGNtZF9idWZbMF0sDQor CQkgICAgICAgKGZ3LT5kYXRhICsgc2l6ZV9md19kb3dubG9hZGVkKSwgbGVuKTsNCisNCisJCS8q IHRoaXMgZnVuY3Rpb24gd3JpdGVzIHBkYXRhIHRvIGMxMCwgdGhlbiB3cml0ZSAyIHRvIGMxOCAq Lw0KKwkJbXdsX2Z3ZGxfdHJpZ19wY2ljbWRfYm9vdGNvZGUocHJpdik7DQorDQorCQkvKiB0aGlz IGlzIGFyYml0cmFyeSBwZXIgeW91ciBwbGF0Zm9ybTsgd2UgdXNlIDB4ZmZmZiAqLw0KKwkJY3Vy cl9pdGVyYXRpb24gPSBGV19NQVhfTlVNX0NIRUNLUzsNCisNCisJCS8qIE5PVEU6IHRoZSBmb2xs b3dpbmcgYmFjayB0byBiYWNrIGNoZWNrcyBvbiBDMUMgaXMgdGltZQ0KKwkJICogc2Vuc2l0aXZl LCBoZW5jZSBtYXkgbmVlZCB0byBiZSB0d2Vha2VkIGRlcGVuZGVudCBvbiBob3N0DQorCQkgKiBw cm9jZXNzb3IuIFRpbWUgZm9yIFNDMiB0byBnbyBmcm9tIHRoZSB3cml0ZSBvZiBldmVudCAyIHRv DQorCQkgKiBDMUMgPT0gMiBpcyB+MTMwMCBuU2VjLiBIZW5jZSB0aGUgY2hlY2tpbmdzIG9uIGhv c3QgaGFzIHRvDQorCQkgKiBjb25zaWRlciBob3cgZWZmaWNpZW50IHlvdXIgY29kZSBjYW4gYmUg dG8gbWVldCB0aGlzIHRpbWluZywNCisJCSAqIG9yIHlvdSBjYW4gYWx0ZXJuYXRpdmVseSB0d2Vh ayB0aGlzIHJvdXRpbmVzIHRvIGZpdCB5b3VyDQorCQkgKiBwbGF0Zm9ybQ0KKwkJICovDQorCQlk byB7DQorCQkJaW50X2NvZGUgPSByZWFkbChwcml2LT5pb2Jhc2UxICsgMHhjMWMpOw0KKwkJCWlm IChpbnRfY29kZSAhPSAwKQ0KKwkJCQlicmVhazsNCisJCQljdXJyX2l0ZXJhdGlvbi0tOw0KKwkJ fSB3aGlsZSAoY3Vycl9pdGVyYXRpb24pOw0KKw0KKwkJZG8gew0KKwkJCWludF9jb2RlID0gcmVh ZGwocHJpdi0+aW9iYXNlMSArIDB4YzFjKTsNCisJCQlpZiAoKGludF9jb2RlICYgTUFDUkVHX0gy QVJJQ19CSVRfRE9PUl9CRUxMKSAhPQ0KKwkJCSAgICBNQUNSRUdfSDJBUklDX0JJVF9ET09SX0JF TEwpDQorCQkJCWJyZWFrOw0KKwkJCWN1cnJfaXRlcmF0aW9uLS07DQorCQl9IHdoaWxlIChjdXJy X2l0ZXJhdGlvbik7DQorDQorCQlpZiAoY3Vycl9pdGVyYXRpb24gPT0gMCkgew0KKwkJCS8qIFRo aXMgbGltaXRlZCBsb29wIGNoZWNrIGFsbG93cyB5b3UgdG8gZXhpdCBncmFjZWZ1bGx5DQorCQkJ ICogd2l0aG91dCBsb2NraW5nIHVwIHlvdXIgZW50aXJlIHN5c3RlbSBqdXN0IGJlY2F1c2UgZncN CisJCQkgKiBkb3dubG9hZCBmYWlsZWQNCisJCQkgKi8NCisJCQl3aXBoeV9lcnIoaHctPndpcGh5 LA0KKwkJCQkgICJFeGhhdXN0ZWQgY3Vycl9pdGVyYXRpb24gZm9yIGZ3IGRvd25sb2FkXG4iKTsN CisJCQlnb3RvIGVycl9kb3dubG9hZDsNCisJCX0NCisNCisJCXNpemVfZndfZG93bmxvYWRlZCAr PSBsZW47DQorCX0NCisNCisJd2lwaHlfaW5mbyhody0+d2lwaHksDQorCQkgICAiRndTaXplID0g JWQgZG93bmxvYWRlZCBTaXplID0gJWQgY3Vycl9pdGVyYXRpb24gJWRcbiIsDQorCQkgICAoaW50 KWZ3LT5zaXplLCBzaXplX2Z3X2Rvd25sb2FkZWQsIGN1cnJfaXRlcmF0aW9uKTsNCisNCisJLyog Tm93IGZpcndhcmUgaXMgZG93bmxvYWRlZCBzdWNjZXNzZnVsbHksIHNvIHRoaXMgcGFydCBpcyB0 byBjaGVjaw0KKwkgKiB3aGV0aGVyIGZ3IGNhbiBwcm9wZXJseSBleGVjdXRlIHRvIGFuIGV4dGVu dCB0aGF0IHdyaXRlIGJhY2sNCisJICogc2lnbmF0dXJlIHRvIGluZGljYXRlIGl0cyByZWFkaW5l c3MgdG8gdGhlIGhvc3QuIE5PVEU6IGlmIHlvdXINCisJICogZG93bmxvYWRlZCBmdyBjcmFzaGVz LCB0aGlzIHNpZ25hdHVyZSBjaGVja2luZyB3aWxsIGZhaWwuIFRoaXMNCisJICogcGFydCBpcyBz aW1pbGFyIGFzIFNDMQ0KKwkgKi8NCisJKigodTMyICopJnByaXYtPnBjbWRfYnVmWzFdKSA9IDA7 DQorCW13bF9md2RsX3RyaWdfcGNpY21kKHByaXYpOw0KKwljdXJyX2l0ZXJhdGlvbiA9IEZXX01B WF9OVU1fQ0hFQ0tTOw0KKwlpZiAocHJpdi0+bWZnX21vZGUpDQorCQl3cml0ZWwoZndyZWFkeXNp Z25hdHVyZSwgcHJpdi0+aW9iYXNlMSArIDB4Y2YwKTsNCisJZG8gew0KKwkJY3Vycl9pdGVyYXRp b24tLTsNCisJCWlmICghcHJpdi0+bWZnX21vZGUpIHsNCisJCQl3cml0ZWwoSE9TVENNRF9TT0ZU QVBfTU9ERSwNCisJCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdfR0VOX1BUUik7 DQorCQkJbWRlbGF5KEZXX0NIRUNLX01TRUNTKTsNCisJCQlpbnRfY29kZSA9IHJlYWRsKHByaXYt PmlvYmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsNCisJCX0gZWxzZSB7DQorCQkJbWRlbGF5 KEZXX0NIRUNLX01TRUNTKTsNCisJCQlpbnRfY29kZSA9IHJlYWRsKHByaXYtPmlvYmFzZTEgKyAw eGM0NCk7DQorCQl9DQorCQlpZiAoIShjdXJyX2l0ZXJhdGlvbiAlIDB4ZmYpKQ0KKwkJCXdpcGh5 X2Vycihody0+d2lwaHksICIleDsiLCBpbnRfY29kZSk7DQorCX0gd2hpbGUgKChjdXJyX2l0ZXJh dGlvbikgJiYNCisJCSAoaW50X2NvZGUgIT0gZndyZWFkeXNpZ25hdHVyZSkpOw0KKw0KKwlpZiAo Y3Vycl9pdGVyYXRpb24gPT0gMCkgew0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwNCisJCQkgICJF eGhhdXN0ZWQgY3Vycl9pdGVyYXRpb24gZm9yIGZ3IHNpZ25hdHVyZVxuIik7DQorCQlnb3RvIGVy cl9kb3dubG9hZDsNCisJfQ0KKw0KKwl3aXBoeV9pbmZvKGh3LT53aXBoeSwgImNvbXBsZXRlXG4i KTsNCisJd3JpdGVsKDB4MDAsIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0lOVF9DT0RFKTsN CisNCisJcmV0dXJuIDA7DQorDQorZXJyX2Rvd25sb2FkOg0KKw0KKwltd2xfZndjbWRfcmVzZXQo aHcpOw0KKw0KKwlyZXR1cm4gLUVJTzsNCit9DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2ly ZWxlc3MvbWFydmVsbC9td2x3aWZpL2Z3ZGwuaCBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl bGwvbXdsd2lmaS9md2RsLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5i MTE3MTQyDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxs L213bHdpZmkvZndkbC5oDQpAQCAtMCwwICsxLDI1IEBADQorLyoNCisgKiBDb3B5cmlnaHQgKEMp IDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMgc29m dHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRlcm5h dGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAgWW91 IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAqIGFj Y29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEg Y29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJVVEVE IEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1QTElF RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM QVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNlIHBy b3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlzY2xh aW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBkZWZpbmVzIGZpcm13 YXJlIGRvd25sb2FkIHJlbGF0ZWQNCisgKiBmdW5jdGlvbnMuDQorICovDQorDQorI2lmbmRlZiBf ZndkbF9oXw0KKyNkZWZpbmUgX2Z3ZGxfaF8NCisNCitpbnQgbXdsX2Z3ZGxfZG93bmxvYWRfZmly bXdhcmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KKw0KKyNlbmRpZiAvKiBfZndkbF9oXyAq Lw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9ob3N0 Y21kLmggYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaG9zdGNtZC5oDQpu ZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uMWZkNGJkZg0KLS0tIC9kZXYvbnVs bA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2hvc3RjbWQuaA0K QEAgLTAsMCArMSw3ODYgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2 ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUg IkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQu IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lv biAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0 cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRo ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQor ICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQg V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICog QVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25h bCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0K Ky8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZmlybXdhcmUgaG9zdCBjb21tYW5k IHJlbGF0ZWQNCisgKiBzdHJ1Y3R1cmUuDQorICovDQorDQorI2lmbmRlZiBfaG9zdGNtZF9oXw0K KyNkZWZpbmUgX2hvc3RjbWRfaF8NCisNCisvKiAxNiBiaXQgaG9zdCBjb21tYW5kIGNvZGUgKi8N CisjZGVmaW5lIEhPU1RDTURfQ01EX0dFVF9IV19TUEVDICAgICAgICAgICAgICAgICAweDAwMDMN CisjZGVmaW5lIEhPU1RDTURfQ01EX1NFVF9IV19TUEVDICAgICAgICAgICAgICAgICAweDAwMDQN CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9HRVRfU1RBVCAgICAgICAgICAgICAweDAwMTQN CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9SQURJT19DT05UUk9MICAgICAgICAweDAwMWMN CisjZGVmaW5lIEhPU1RDTURfQ01EX01FTV9BRERSX0FDQ0VTUyAgICAgICAgICAgICAweDAwMWQN CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9UWF9QT1dFUiAgICAgICAgICAgICAweDAwMWYN CisjZGVmaW5lIEhPU1RDTURfQ01EXzgwMl8xMV9SRl9BTlRFTk5BICAgICAgICAgICAweDAwMjAN CisjZGVmaW5lIEhPU1RDTURfQ01EX0JST0FEQ0FTVF9TU0lEX0VOQUJMRSAgICAgICAweDAwNTAg LyogcGVyLXZpZiAqLw0KKyNkZWZpbmUgSE9TVENNRF9DTURfU0VUX1JGX0NIQU5ORUwgICAgICAg ICAgICAgIDB4MDEwYQ0KKyNkZWZpbmUgSE9TVENNRF9DTURfU0VUX0FJRCAgICAgICAgICAgICAg ICAgICAgIDB4MDEwZCAvKiBwZXItdmlmICovDQorI2RlZmluZSBIT1NUQ01EX0NNRF9TRVRfSU5G UkFfTU9ERSAgICAgICAgICAgICAgMHgwMTBlIC8qIHBlci12aWYgKi8NCisjZGVmaW5lIEhPU1RD TURfQ01EXzgwMl8xMV9SVFNfVEhTRCAgICAgICAgICAgICAweDAxMTMNCisjZGVmaW5lIEhPU1RD TURfQ01EX1NFVF9FRENBX1BBUkFNUyAgICAgICAgICAgICAweDAxMTUNCisjZGVmaW5lIEhPU1RD TURfQ01EX1NFVF9XTU1fTU9ERSAgICAgICAgICAgICAgICAweDAxMjMNCisjZGVmaW5lIEhPU1RD TURfQ01EX0hUX0dVQVJEX0lOVEVSVkFMICAgICAgICAgICAweDAxMjQNCisjZGVmaW5lIEhPU1RD TURfQ01EX1NFVF9GSVhFRF9SQVRFICAgICAgICAgICAgICAweDAxMjYNCisjZGVmaW5lIEhPU1RD TURfQ01EX1NFVF9JRVMgICAgICAgICAgICAgICAgICAgICAweDAxMjcNCisjZGVmaW5lIEhPU1RD TURfQ01EX1NFVF9MSU5LQURBUFRfQ1NfTU9ERSAgICAgICAweDAxMjkNCisjZGVmaW5lIEhPU1RD TURfQ01EX1NFVF9NQUNfQUREUiAgICAgICAgICAgICAgICAweDAyMDIgLyogcGVyLXZpZiAqLw0K KyNkZWZpbmUgSE9TVENNRF9DTURfU0VUX1JBVEVfQURBUFRfTU9ERSAgICAgICAgIDB4MDIwMw0K KyNkZWZpbmUgSE9TVENNRF9DTURfR0VUX1dBVENIRE9HX0JJVE1BUCAgICAgICAgIDB4MDIwNQ0K KyNkZWZpbmUgSE9TVENNRF9DTURfREVMX01BQ19BRERSICAgICAgICAgICAgICAgIDB4MDIwNiAv KiBwZXItdmlmICovDQorI2RlZmluZSBIT1NUQ01EX0NNRF9CU1NfU1RBUlQgICAgICAgICAgICAg ICAgICAgMHgxMTAwIC8qIHBlci12aWYgKi8NCisjZGVmaW5lIEhPU1RDTURfQ01EX0FQX0JFQUNP TiAgICAgICAgICAgICAgICAgICAweDExMDEgLyogcGVyLXZpZiAqLw0KKyNkZWZpbmUgSE9TVENN RF9DTURfU0VUX05FV19TVE4gICAgICAgICAgICAgICAgIDB4MTExMSAvKiBwZXItdmlmICovDQor I2RlZmluZSBIT1NUQ01EX0NNRF9TRVRfQVBNT0RFICAgICAgICAgICAgICAgICAgMHgxMTE0DQor I2RlZmluZSBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElPTiAgICAgICAgICAgMHgxMTIyIC8q IHBlci12aWYgKi8NCisjZGVmaW5lIEhPU1RDTURfQ01EX0JBU1RSRUFNICAgICAgICAgICAgICAg ICAgICAweDExMjUNCisjZGVmaW5lIEhPU1RDTURfQ01EX1NFVF9PUFRJTUlaQVRJT05fTEVWRUwg ICAgICAweDExMzMNCisjZGVmaW5lIEhPU1RDTURfQ01EX0RXRFNfRU5BQkxFICAgICAgICAgICAg ICAgICAweDExNDQNCisjZGVmaW5lIEhPU1RDTURfQ01EX0ZXX0ZMVVNIX1RJTUVSICAgICAgICAg ICAgICAweDExNDgNCisjZGVmaW5lIEhPU1RDTURfQ01EX1NFVF9DREQgICAgICAgICAgICAgICAg ICAgICAweDExNTANCisNCisvKiBEZWZpbmUgZ2VuZXJhbCByZXN1bHQgY29kZSBmb3IgZWFjaCBj b21tYW5kICovDQorI2RlZmluZSBIT1NUQ01EX1JFU1VMVF9PSyAgICAgICAgICAgICAgICAgICAg ICAgMHgwMDAwDQorLyogR2VuZXJhbCBlcnJvciAqLw0KKyNkZWZpbmUgSE9TVENNRF9SRVNVTFRf RVJST1IgICAgICAgICAgICAgICAgICAgIDB4MDAwMQ0KKy8qIENvbW1hbmQgaXMgbm90IHZhbGlk ICovDQorI2RlZmluZSBIT1NUQ01EX1JFU1VMVF9OT1RfU1VQUE9SVCAgICAgICAgICAgICAgMHgw MDAyDQorLyogQ29tbWFuZCBpcyBwZW5kaW5nICh3aWxsIGJlIHByb2Nlc3NlZCkgKi8NCisjZGVm aW5lIEhPU1RDTURfUkVTVUxUX1BFTkRJTkcgICAgICAgICAgICAgICAgICAweDAwMDMNCisvKiBT eXN0ZW0gaXMgYnVzeSAoY29tbWFuZCBpZ25vcmVkKSAqLw0KKyNkZWZpbmUgSE9TVENNRF9SRVNV TFRfQlVTWSAgICAgICAgICAgICAgICAgICAgIDB4MDAwNA0KKy8qIERhdGEgYnVmZmVyIGlzIG5v dCBiaWcgZW5vdWdoICovDQorI2RlZmluZSBIT1NUQ01EX1JFU1VMVF9QQVJUSUFMX0RBVEEgICAg ICAgICAgICAgMHgwMDA1DQorDQorLyogRGVmaW5lIGNoYW5uZWwgcmVsYXRlZCBjb25zdGFudHMg Ki8NCisjZGVmaW5lIEZSRVFfQkFORF8yRE9UNEdIWiAgICAgICAgICAgICAgICAgICAgICAweDEN CisjZGVmaW5lIEZSRVFfQkFORF80RE9UOUdIWiAgICAgICAgICAgICAgICAgICAgICAweDINCisj ZGVmaW5lIEZSRVFfQkFORF81R0haICAgICAgICAgICAgICAgICAgICAgICAgICAweDQNCisjZGVm aW5lIEZSRVFfQkFORF81RE9UMkdIWiAgICAgICAgICAgICAgICAgICAgICAweDgNCisjZGVmaW5l IENIX0FVVE9fV0lEVEgJICAgICAgICAgICAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgQ0hfMTBf TUhaX1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQ0KKyNkZWZpbmUgQ0hfMjBfTUha X1dJRFRIICAgICAgICAgICAgICAgICAgICAgICAgIDB4Mg0KKyNkZWZpbmUgQ0hfNDBfTUhaX1dJ RFRIICAgICAgICAgICAgICAgICAgICAgICAgIDB4NA0KKyNkZWZpbmUgQ0hfODBfTUhaX1dJRFRI ICAgICAgICAgICAgICAgICAgICAgICAgIDB4NQ0KKyNkZWZpbmUgRVhUX0NIX0FCT1ZFX0NUUkxf Q0ggICAgICAgICAgICAgICAgICAgIDB4MQ0KKyNkZWZpbmUgRVhUX0NIX0FVVE8gICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDB4Mg0KKyNkZWZpbmUgRVhUX0NIX0JFTE9XX0NUUkxfQ0ggICAg ICAgICAgICAgICAgICAgIDB4Mw0KKyNkZWZpbmUgTk9fRVhUX0NIQU5ORUwgICAgICAgICAgICAg ICAgICAgICAgICAgIDB4MA0KKw0KKyNkZWZpbmUgQUNUX1BSSU1BUllfQ0hBTl8wICAgICAgICAg ICAgICAgICAgICAgIDANCisjZGVmaW5lIEFDVF9QUklNQVJZX0NIQU5fMSAgICAgICAgICAgICAg ICAgICAgICAxDQorI2RlZmluZSBBQ1RfUFJJTUFSWV9DSEFOXzIgICAgICAgICAgICAgICAgICAg ICAgMg0KKyNkZWZpbmUgQUNUX1BSSU1BUllfQ0hBTl8zICAgICAgICAgICAgICAgICAgICAgIDMN CisNCisvKiBEZWZpbmUgcmF0ZSByZWxhdGVkIGNvbnN0YW50cyAqLw0KKyNkZWZpbmUgSE9TVENN RF9BQ1RfTk9UX1VTRV9GSVhFRF9SQVRFICAgICAgICAgIDB4MDAwMg0KKw0KKy8qIERlZmluZSBz dGF0aW9uIHJlbGF0ZWQgY29uc3RhbnRzICovDQorI2RlZmluZSBIT1NUQ01EX0FDVF9TVEFfQUNU SU9OX0FERCAgICAgICAgICAgICAgMA0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfU1RBX0FDVElPTl9S RU1PVkUgICAgICAgICAgIDINCisNCisvKiBEZWZpbmUga2V5IHJlbGF0ZWQgY29uc3RhbnRzICov DQorI2RlZmluZSBNQVhfRU5DUl9LRVlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgMTYNCisj ZGVmaW5lIE1JQ19LRVlfTEVOR1RIICAgICAgICAgICAgICAgICAgICAgICAgICA4DQorDQorI2Rl ZmluZSBLRVlfVFlQRV9JRF9XRVAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMA0KKyNkZWZp bmUgS0VZX1RZUEVfSURfVEtJUCAgICAgICAgICAgICAgICAgICAgICAgIDB4MDENCisjZGVmaW5l IEtFWV9UWVBFX0lEX0FFUwkgICAgICAgICAgICAgICAgICAgICAgICAweDAyDQorDQorI2RlZmlu ZSBFTkNSX0tFWV9GTEFHX1RYR1JPVVBLRVkgICAgICAgICAgICAgICAgMHgwMDAwMDAwNA0KKyNk ZWZpbmUgRU5DUl9LRVlfRkxBR19QQUlSV0lTRSAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDgN CisjZGVmaW5lIEVOQ1JfS0VZX0ZMQUdfVFNDX1ZBTElEICAgICAgICAgICAgICAgICAweDAwMDAw MDQwDQorI2RlZmluZSBFTkNSX0tFWV9GTEFHX1dFUF9UWEtFWSAgICAgICAgICAgICAgICAgMHgw MTAwMDAwMA0KKyNkZWZpbmUgRU5DUl9LRVlfRkxBR19NSUNLRVlfVkFMSUQgICAgICAgICAgICAg IDB4MDIwMDAwMDANCisNCisvKiBEZWZpbmUgYmxvY2sgYWNrIHJlbGF0ZWQgY29uc3RhbnRzICov DQorI2RlZmluZSBCQVNUUkVBTV9GTEFHX0lNTUVESUFURV9UWVBFICAgICAgICAgICAgMQ0KKyNk ZWZpbmUgQkFTVFJFQU1fRkxBR19ESVJFQ1RJT05fVVBTVFJFQU0gICAgICAgIDANCisNCisvKiBE ZWZpbmUgZ2VuZXJhbCBwdXJwb3NlIGFjdGlvbiAqLw0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfR0VO X1NFVCAgICAgICAgICAgICAgICAgICAgIDB4MDAwMQ0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfR0VO X1NFVF9MSVNUICAgICAgICAgICAgICAgIDB4MDAwMg0KKyNkZWZpbmUgSE9TVENNRF9BQ1RfR0VO X0dFVF9MSVNUICAgICAgICAgICAgICAgIDB4MDAwMw0KKw0KKy8qIE1pc2MgKi8NCisjZGVmaW5l IE1BWF9FTkNSX0tFWV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAxNg0KKyNkZWZpbmUgTUlD X0tFWV9MRU5HVEggICAgICAgICAgICAgICAgICAgICAgICAgIDgNCisNCitlbnVtIHsNCisJV0xf RElTQUJMRSA9IDAsDQorCVdMX0VOQUJMRSA9IDEsDQorCVdMX0RJU0FCTEVfVk1BQyA9IDB4ODAs DQorfTsNCisNCitlbnVtIHsNCisJV0xfR0VUID0gMCwNCisJV0xfU0VUID0gMSwNCisJV0xfUkVT RVQgPSAyLA0KK307DQorDQorZW51bSB7DQorCVdMX0xPTkdfUFJFQU1CTEUgPSAxLA0KKwlXTF9T SE9SVF9QUkVBTUJMRSA9IDMsDQorCVdMX0FVVE9fUFJFQU1CTEUgPSA1LA0KK307DQorDQorZW51 bSBlbmNyX2FjdGlvbl90eXBlIHsNCisJLyogcmVxdWVzdCB0byBlbmFibGUvZGlzYWJsZSBIVyBl bmNyeXB0aW9uICovDQorCUVOQ1JfQUNUSU9OX0VOQUJMRV9IV19FTkNSLA0KKwkvKiByZXF1ZXN0 IHRvIHNldCBlbmNyeXB0aW9uIGtleSAqLw0KKwlFTkNSX0FDVElPTl9UWVBFX1NFVF9LRVksDQor CS8qIHJlcXVlc3QgdG8gcmVtb3ZlIG9uZSBvciBtb3JlIGtleXMgKi8NCisJRU5DUl9BQ1RJT05f VFlQRV9SRU1PVkVfS0VZLA0KKwlFTkNSX0FDVElPTl9UWVBFX1NFVF9HUk9VUF9LRVksDQorfTsN CisNCitlbnVtIGJhX2FjdGlvbl90eXBlIHsNCisJQkFfQ1JFQVRFX1NUUkVBTSwNCisJQkFfVVBE QVRFX1NUUkVBTSwNCisJQkFfREVTVFJPWV9TVFJFQU0sDQorCUJBX0ZMVVNIX1NUUkVBTSwNCisJ QkFfQ0hFQ0tfU1RSRUFNLA0KK307DQorDQorZW51bSBtYWNfdHlwZSB7DQorCVdMX01BQ19UWVBF X1BSSU1BUllfQ0xJRU5ULA0KKwlXTF9NQUNfVFlQRV9TRUNPTkRBUllfQ0xJRU5ULA0KKwlXTF9N QUNfVFlQRV9QUklNQVJZX0FQLA0KKwlXTF9NQUNfVFlQRV9TRUNPTkRBUllfQVAsDQorfTsNCisN CisvKiBHZW5lcmFsIGhvc3QgY29tbWFuZCBoZWFkZXIgKi8NCitzdHJ1Y3QgaG9zdGNtZF9oZWFk ZXIgew0KKwlfX2xlMTYgY21kOw0KKwlfX2xlMTYgbGVuOw0KKwl1OCBzZXFfbnVtOw0KKwl1OCBt YWNpZDsNCisJX19sZTE2IHJlc3VsdDsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01E X0dFVF9IV19TUEVDICovDQorc3RydWN0IGhvc3RjbWRfY21kX2dldF9od19zcGVjIHsNCisJc3Ry dWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCXU4IHZlcnNpb247ICAgICAgICAgICAgICAg ICAgLyogdmVyc2lvbiBvZiB0aGUgSFcgICAgICAgICAgICAgICAgICAgICovDQorCXU4IGhvc3Rf aWY7ICAgICAgICAgICAgICAgICAgLyogaG9zdCBpbnRlcmZhY2UgICAgICAgICAgICAgICAgICAg ICAgICovDQorCV9fbGUxNiBudW1fd2NiOyAgICAgICAgICAgICAgLyogTWF4LiBudW1iZXIgb2Yg V0NCIEZXIGNhbiBoYW5kbGUgICAgICovDQorCV9fbGUxNiBudW1fbWNhc3RfYWRkcjsgICAgICAg LyogTWF4TmJyIG9mIE1DIGFkZHJlc3NlcyBGVyBjYW4gaGFuZGxlICovDQorCXU4IHBlcm1hbmVu dF9hZGRyW0VUSF9BTEVOXTsgLyogTUFDIGFkZHJlc3MgcHJvZ3JhbW1lZCBpbiBIVyAgICAgICAg ICovDQorCV9fbGUxNiByZWdpb25fY29kZTsNCisJX19sZTE2IG51bV9hbnRlbm5hOyAgICAgICAg ICAvKiBOdW1iZXIgb2YgYW50ZW5uYSB1c2VkICAgICAgKi8NCisJX19sZTMyIGZ3X3JlbGVhc2Vf bnVtOyAgICAgICAvKiA0IGJ5dGUgb2YgRlcgcmVsZWFzZSBudW1iZXIgKi8NCisJX19sZTMyIHdj Yl9iYXNlMDsNCisJX19sZTMyIHJ4cGRfd3JfcHRyOw0KKwlfX2xlMzIgcnhwZF9yZF9wdHI7DQor CV9fbGUzMiBmd19hd2FrZV9jb29raWU7DQorCV9fbGUzMiB3Y2JfYmFzZVtTWVNBRFBUX1RPVEFM X1RYX1FVRVVFUyAtIDFdOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9DTURfU0VUX0hX X1NQRUMgKi8NCitzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X2h3X3NwZWMgew0KKwlzdHJ1Y3QgaG9z dGNtZF9oZWFkZXIgY21kX2hkcjsNCisJLyogSFcgcmV2aXNpb24gKi8NCisJdTggdmVyc2lvbjsN CisJLyogSG9zdCBpbnRlcmZhY2UgKi8NCisJdTggaG9zdF9pZjsNCisJLyogTWF4LiBudW1iZXIg b2YgTXVsdGljYXN0IGFkZHJlc3MgRlcgY2FuIGhhbmRsZSAqLw0KKwlfX2xlMTYgbnVtX21jYXN0 X2FkZHI7DQorCS8qIE1BQyBhZGRyZXNzICovDQorCXU4IHBlcm1hbmVudF9hZGRyW0VUSF9BTEVO XTsNCisJLyogUmVnaW9uIENvZGUgKi8NCisJX19sZTE2IHJlZ2lvbl9jb2RlOw0KKwkvKiA0IGJ5 dGUgb2YgRlcgcmVsZWFzZSBudW1iZXIsIGV4YW1wbGUgMHgxMjM0PTEuMi4zLjQgKi8NCisJX19s ZTMyIGZ3X3JlbGVhc2VfbnVtOw0KKwkvKiBGaXJtd2FyZSBhd2FrZSBjb29raWUgLSB1c2VkIHRv IGVuc3VyZSB0aGF0IHRoZSBkZXZpY2UNCisJICogaXMgbm90IGluIHNsZWVwIG1vZGUNCisJICov DQorCV9fbGUzMiBmd19hd2FrZV9jb29raWU7DQorCS8qIERldmljZSBjYXBhYmlsaXRpZXMgKHNl ZSBhYm92ZSkgKi8NCisJX19sZTMyIGRldmljZV9jYXBzOw0KKwkvKiBSeCBzaGFyZWQgbWVtb3J5 IHF1ZXVlICovDQorCV9fbGUzMiByeHBkX3dyX3B0cjsNCisJLyogQWN0dWFsIG51bWJlciBvZiBU WCBxdWV1ZXMgaW4gV2NiQmFzZSBhcnJheSAqLw0KKwlfX2xlMzIgbnVtX3R4X3F1ZXVlczsNCisJ LyogVFggV0NCIFJpbmdzICovDQorCV9fbGUzMiB3Y2JfYmFzZVtTWVNBRFBUX05VTV9PRl9ERVND X0RBVEFdOw0KKwkvKiBNYXggQU1TRFUgc2l6ZSAoMDAgLSBBTVNEVSBEaXNhYmxlZCwNCisJICog MDEgLSA0SywgMTAgLSA4SywgMTEgLSBub3QgZGVmaW5lZCkNCisJICovDQorCV9fbGUzMiBmZWF0 dXJlczsNCisJX19sZTMyIHR4X3djYl9udW1fcGVyX3F1ZXVlOw0KKwlfX2xlMzIgdG90YWxfcnhf d2NiOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9DTURfODAyXzExX0dFVF9TVEFUICov DQorc3RydWN0IGhvc3RjbWRfY21kXzgwMl8xMV9nZXRfc3RhdCB7DQorCXN0cnVjdCBob3N0Y21k X2hlYWRlciBjbWRfaGRyOw0KKwlfX2xlMzIgdHhfcmV0cnlfc3VjY2Vzc2VzOw0KKwlfX2xlMzIg dHhfbXVsdGlwbGVfcmV0cnlfc3VjY2Vzc2VzOw0KKwlfX2xlMzIgdHhfZmFpbHVyZXM7DQorCV9f bGUzMiBydHNfc3VjY2Vzc2VzOw0KKwlfX2xlMzIgcnRzX2ZhaWx1cmVzOw0KKwlfX2xlMzIgYWNr X2ZhaWx1cmVzOw0KKwlfX2xlMzIgcnhfZHVwbGljYXRlX2ZyYW1lczsNCisJX19sZTMyIHJ4X2Zj c19lcnJvcnM7DQorCV9fbGUzMiB0eF93YXRjaGRvZ190aW1lb3V0czsNCisJX19sZTMyIHJ4X292 ZXJmbG93czsNCisJX19sZTMyIHJ4X2ZyYWdfZXJyb3JzOw0KKwlfX2xlMzIgcnhfbWVtX2Vycm9y czsNCisJX19sZTMyIHBvaW50ZXJfZXJyb3JzOw0KKwlfX2xlMzIgdHhfdW5kZXJmbG93czsNCisJ X19sZTMyIHR4X2RvbmU7DQorCV9fbGUzMiB0eF9kb25lX2J1Zl90cnlfcHV0Ow0KKwlfX2xlMzIg dHhfZG9uZV9idWZfcHV0Ow0KKwkvKiBQdXQgc2l6ZSBvZiByZXF1ZXN0ZWQgYnVmZmVyIGluIGhl cmUgKi8NCisJX19sZTMyIHdhaXRfZm9yX3R4X2J1ZjsNCisJX19sZTMyIHR4X2F0dGVtcHRzOw0K KwlfX2xlMzIgdHhfc3VjY2Vzc2VzOw0KKwlfX2xlMzIgdHhfZnJhZ21lbnRzOw0KKwlfX2xlMzIg dHhfbXVsdGljYXN0czsNCisJX19sZTMyIHJ4X25vbl9jdGxfcGt0czsNCisJX19sZTMyIHJ4X211 bHRpY2FzdHM7DQorCV9fbGUzMiByeF91bmRlY3J5cHRhYmxlX2ZyYW1lczsNCisJX19sZTMyIHJ4 X2ljdl9lcnJvcnM7DQorCV9fbGUzMiByeF9leGNsdWRlZF9mcmFtZXM7DQorCV9fbGUzMiByeF93 ZWFrX2l2X2NvdW50Ow0KKwlfX2xlMzIgcnhfdW5pY2FzdHM7DQorCV9fbGUzMiByeF9ieXRlczsN CisJX19sZTMyIHJ4X2Vycm9yczsNCisJX19sZTMyIHJ4X3J0c19jb3VudDsNCisJX19sZTMyIHR4 X2N0c19jb3VudDsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EXzgwMl8xMV9SQURJ T19DT05UUk9MICovDQorc3RydWN0IGhvc3RjbWRfY21kXzgwMl8xMV9yYWRpb19jb250cm9sIHsN CisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247DQorCS8q IEBiaXQwOiAxLzAsb24vb2ZmLCBAYml0MTogMS8wLCBsb25nL3Nob3J0IEBiaXQyOiAxLzAsYXV0 by9maXggKi8NCisJX19sZTE2IGNvbnRyb2w7DQorCV9fbGUxNiByYWRpb19vbjsNCit9IF9fcGFj a2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX01FTV9BRERSX0FDQ0VTUyAqLw0KK3N0cnVjdCBob3N0 Y21kX2NtZF9tZW1fYWRkcl9hY2Nlc3Mgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hk cjsNCisJX19sZTMyIGFkZHJlc3M7DQorCV9fbGUxNiBsZW5ndGg7DQorCV9fbGUxNiByZXNlcnZl ZDsNCisJX19sZTMyIHZhbHVlWzY0XTsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01E XzgwMl8xMV9UWF9QT1dFUiAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfdHhfcG93ZXIg ew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTE2IGFjdGlvbjsNCisJ X19sZTE2IGJhbmQ7DQorCV9fbGUxNiBjaDsNCisJX19sZTE2IGJ3Ow0KKwlfX2xlMTYgc3ViX2No Ow0KKwlfX2xlMTYgcG93ZXJfbGV2ZWxfbGlzdFtTWVNBRFBUX1RYX1BPV0VSX0xFVkVMX1RPVEFM XTsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EXzgwMl8xMV9SRl9BTlRFTk5BICov DQorc3RydWN0IGhvc3RjbWRfY21kXzgwMl8xMV9yZl9hbnRlbm5hIHsNCisJc3RydWN0IGhvc3Rj bWRfaGVhZGVyIGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247DQorCV9fbGUxNiBhbnRlbm5hX21v ZGU7ICAgICAvKiBOdW1iZXIgb2YgYW50ZW5uYXMgb3IgMHhmZmZmKGRpdmVyc2l0eSkgKi8NCit9 IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX0JST0FEQ0FTVF9TU0lEX0VOQUJMRSAqLw0K K3N0cnVjdCBob3N0Y21kX2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUgew0KKwlzdHJ1Y3QgaG9z dGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTMyIGVuYWJsZTsNCit9IF9fcGFja2VkOw0KKw0K Ky8qIEhPU1RDTURfQ01EX1NFVF9SRl9DSEFOTkVMICovDQorI2RlZmluZSBGUkVRX0JBTkRfTUFT SyAgICAgMHgwMDAwMDAzZg0KKyNkZWZpbmUgQ0hOTF9XSURUSF9NQVNLICAgIDB4MDAwMDA3YzAN CisjZGVmaW5lIENITkxfV0lEVEhfU0hJRlQgICA2DQorI2RlZmluZSBBQ1RfUFJJTUFSWV9NQVNL ICAgMHgwMDAwMzgwMA0KKyNkZWZpbmUgQUNUX1BSSU1BUllfU0hJRlQgIDExDQorDQorc3RydWN0 IGhvc3RjbWRfY21kX3NldF9yZl9jaGFubmVsIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNt ZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247DQorCXU4IGN1cnJfY2hubDsNCisJX19sZTMyIGNobmxf ZmxhZ3M7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfQUlEICovDQorc3Ry dWN0IGhvc3RjbWRfY21kX3NldF9haWQgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hk cjsNCisJX19sZTE2IGFpZDsNCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOyAgICAgICAvKiBBUCdz IE1hYyBBZGRyZXNzKEJTU0lEKSAqLw0KKwlfX2xlMzIgZ3Byb3RlY3Q7DQorCXU4IGFwX3JhdGVz W1NZU0FEUFRfTUFYX0RBVEFfUkFURVNfR107DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01E X0NNRF9TRVRfSU5GUkFfTU9ERSAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRfaW5mcmFfbW9k ZSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KK30gX19wYWNrZWQ7DQorDQor LyogSE9TVENNRF9DTURfODAyXzExX1JUU19USFNEICovDQorc3RydWN0IGhvc3RjbWRfY21kXzgw Ml8xMV9ydHNfdGhzZCB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwlfX2xl MTYgYWN0aW9uOw0KKwlfX2xlMTYJdGhyZXNob2xkOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9T VENNRF9DTURfU0VUX0VEQ0FfUEFSQU1TICovDQorc3RydWN0IGhvc3RjbWRfY21kX3NldF9lZGNh X3BhcmFtcyB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkvKiAwID0gZ2V0 IGFsbCwgMHgxID1zZXQgQ1dNaW4vTWF4LCAgMHgyID0gc2V0IFRYT1AgLCAweDQgPXNldCBBSUZT TiAqLw0KKwlfX2xlMTYgYWN0aW9uOw0KKwlfX2xlMTYgdHhvcDsgICAgICAgICAgICAgICAgIC8q IGluIHVuaXQgb2YgMzIgdXMgKi8NCisJX19sZTMyIGN3X21heDsgICAgICAgICAgICAgICAvKiAw fjE1ICovDQorCV9fbGUzMiBjd19taW47ICAgICAgICAgICAgICAgLyogMH4xNSAqLw0KKwl1OCBh aWZzbjsNCisJdTggdHhxX251bTsgICAgICAgICAgICAgICAgICAvKiBUeCBRdWV1ZSBudW1iZXIu ICovDQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfV01NX01PREUgKi8NCitz dHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X3dtbV9tb2RlIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVy IGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247ICAgICAgICAgICAgICAgLyogMC0+dW5zZXQsIDEt PnNldCAqLw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9DTURfSFRfR1VBUkRfSU5URVJW QUwgKi8NCitzdHJ1Y3QgaG9zdGNtZF9jbWRfaHRfZ3VhcmRfaW50ZXJ2YWwgew0KKwlzdHJ1Y3Qg aG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTMyIGFjdGlvbjsNCisJX19sZTMyIGdpX3R5 cGU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfRklYRURfUkFURSAqLw0K K3N0cnVjdCBmaXhfcmF0ZV9mbGFnIHsgICAgICAgICAgIC8qIGxvd2VyIHJhdGUgYWZ0ZXIgdGhl IHJldHJ5IGNvdW50ICovDQorCS8qIDA6IGxlZ2FjeSwgMTogSFQgKi8NCisJX19sZTMyIGZpeF9y YXRlX3R5cGU7DQorCS8qIDA6IHJldHJ5IGNvdW50IGlzIG5vdCB2YWxpZCwgMTogdXNlIHJldHJ5 IGNvdW50IHNwZWNpZmllZCAqLw0KKwlfX2xlMzIgcmV0cnlfY291bnRfdmFsaWQ7DQorfSBfX3Bh Y2tlZDsNCisNCitzdHJ1Y3QgZml4X3JhdGVfZW50cnkgew0KKwlzdHJ1Y3QgZml4X3JhdGVfZmxh ZyBmaXhfcmF0ZV90eXBlX2ZsYWdzOw0KKwkvKiBkZXBlbmRpbmcgb24gdGhlIGZsYWdzIGFib3Zl LCB0aGlzIGNhbiBiZSBlaXRoZXIgYSBsZWdhY3kNCisJICogcmF0ZShub3QgaW5kZXgpIG9yIGFu IE1DUyBjb2RlLg0KKwkgKi8NCisJX19sZTMyIGZpeGVkX3JhdGU7DQorCV9fbGUzMiByZXRyeV9j b3VudDsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRfZml4ZWRfcmF0 ZSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkvKiBIT1NUQ01EX0FDVF9O T1RfVVNFX0ZJWEVEX1JBVEUgMHgwMDAyICovDQorCV9fbGUzMiBhY3Rpb247DQorCS8qIHVzZSBm aXhlZCByYXRlIHNwZWNpZmllZCBidXQgZmlybXdhcmUgY2FuIGRyb3AgdG8gKi8NCisJX19sZTMy IGFsbG93X3JhdGVfZHJvcDsNCisJX19sZTMyIGVudHJ5X2NvdW50Ow0KKwlzdHJ1Y3QgZml4X3Jh dGVfZW50cnkgZml4ZWRfcmF0ZV90YWJsZVs0XTsNCisJdTggbXVsdGljYXN0X3JhdGU7DQorCXU4 IG11bHRpX3JhdGVfdHhfdHlwZTsNCisJdTggbWFuYWdlbWVudF9yYXRlOw0KK30gX19wYWNrZWQ7 DQorDQorLyogSE9TVENNRF9DTURfU0VUX0lFUyAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRf aWVzIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCV9fbGUxNiBhY3Rpb247 ICAgICAgICAgICAgICAgLyogMC0+dW5zZXQsIDEtPnNldCAqLw0KKwlfX2xlMTYgaWVfbGlzdF9s ZW5faHQ7DQorCV9fbGUxNiBpZV9saXN0X2xlbl92aHQ7DQorCV9fbGUxNiBpZV9saXN0X2xlbl9w cm9wcmlldGFyeTsNCisJLypCdWZmZXIgc2l6ZSBzYW1lIGFzIEdlbmVyaWNfQmVhY29uKi8NCisJ dTggaWVfbGlzdF9odFsxNDhdOw0KKwl1OCBpZV9saXN0X3ZodFsyNF07DQorCXU4IGllX2xpc3Rf cHJvcHJpZXRhcnlbMTEyXTsNCit9IF9fcGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX1NFVF9M SU5LQURBUFRfQ1NfTU9ERSAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9zZXRfbGlua2FkYXB0X2Nz X21vZGUgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTE2IGFjdGlv bjsNCisJX19sZTE2IGNzX21vZGU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9T RVRfTUFDX0FERFIsIEhPU1RDTURfQ01EX0RFTF9NQUNfQUREUiAqLw0KK3N0cnVjdCBob3N0Y21k X2NtZF9zZXRfbWFjX2FkZHIgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJ X19sZTE2IG1hY190eXBlOw0KKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07DQorfSBfX3BhY2tlZDsN CisNCisvKiBIT1NUQ01EX0NNRF9TRVRfUkFURV9BREFQVF9NT0RFICovDQorc3RydWN0IGhvc3Rj bWRfY21kX3NldF9yYXRlX2FkYXB0X21vZGUgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21k X2hkcjsNCisJX19sZTE2IGFjdGlvbjsNCisJX19sZTE2IHJhdGVfYWRhcHRfbW9kZTsgICAgICAv KiAwOkluZG9vciwgMTpPdXRkb29yICovDQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NN RF9HRVRfV0FUQ0hET0dfQklUTUFQICovDQorc3RydWN0IGhvc3RjbWRfY21kX2dldF93YXRjaGRv Z19iaXRtYXAgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJdTggd2F0Y2hk b2dfYml0bWFwOyAgICAgICAgICAvKiBmb3IgU1cvQkEgKi8NCit9IF9fcGFja2VkOw0KKw0KKy8q IEhPU1RDTURfQ01EX0JTU19TVEFSVCAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9ic3Nfc3RhcnQg ew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJX19sZTMyIGVuYWJsZTsgICAg ICAgICAgICAgICAgICAvKiBGQUxTRTogRGlzYWJsZSBvciBUUlVFOiBFbmFibGUgKi8NCit9IF9f cGFja2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX0FQX0JFQUNPTiAqLw0KK3N0cnVjdCBjZl9wYXJh bXMgew0KKwl1OCBlbGVtX2lkOw0KKwl1OCBsZW47DQorCXU4IGNmcF9jbnQ7DQorCXU4IGNmcF9w ZXJpb2Q7DQorCV9fbGUxNiBjZnBfbWF4X2R1cmF0aW9uOw0KKwlfX2xlMTYgY2ZwX2R1cmF0aW9u X3JlbWFpbmluZzsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBpYnNzX3BhcmFtcyB7DQorCXU4 IGVsZW1faWQ7DQorCXU4IGxlbjsNCisJX19sZTE2CWF0aW1fd2luZG93Ow0KK30gX19wYWNrZWQ7 DQorDQordW5pb24gc3NfcGFyYW1zIHsNCisJc3RydWN0IGNmX3BhcmFtcyBjZl9wYXJhbV9zZXQ7 DQorCXN0cnVjdCBpYnNzX3BhcmFtcyBpYnNzX3BhcmFtX3NldDsNCit9IF9fcGFja2VkOw0KKw0K K3N0cnVjdCBmaF9wYXJhbXMgew0KKwl1OCBlbGVtX2lkOw0KKwl1OCBsZW47DQorCV9fbGUxNiBk d2VsbF90aW1lOw0KKwl1OCBob3Bfc2V0Ow0KKwl1OCBob3BfcGF0dGVybjsNCisJdTggaG9wX2lu ZGV4Ow0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IGRzX3BhcmFtcyB7DQorCXU4IGVsZW1faWQ7 DQorCXU4IGxlbjsNCisJdTggY3VycmVudF9jaG5sOw0KK30gX19wYWNrZWQ7DQorDQordW5pb24g cGh5X3BhcmFtcyB7DQorCXN0cnVjdCBmaF9wYXJhbXMgZmhfcGFyYW1fc2V0Ow0KKwlzdHJ1Y3Qg ZHNfcGFyYW1zIGRzX3BhcmFtX3NldDsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCByc25faWUg ew0KKwl1OCBlbGVtX2lkOw0KKwl1OCBsZW47DQorCXU4IG91aV90eXBlWzRdOyAgICAgICAgICAg ICAgLyogMDA6NTA6ZjI6MDEgKi8NCisJdTggdmVyWzJdOw0KKwl1OCBncnBfa2V5X2NpcGhlcls0 XTsNCisJdTggcHdzX2tleV9jbnRbMl07DQorCXU4IHB3c19rZXlfY2lwaGVyX2xpc3RbNF07DQor CXU4IGF1dGhfa2V5X2NudFsyXTsNCisJdTggYXV0aF9rZXlfbGlzdFs0XTsNCit9IF9fcGFja2Vk Ow0KKw0KK3N0cnVjdCByc240OF9pZSB7DQorCXU4IGVsZW1faWQ7DQorCXU4IGxlbjsNCisJdTgg dmVyWzJdOw0KKwl1OCBncnBfa2V5X2NpcGhlcls0XTsNCisJdTggcHdzX2tleV9jbnRbMl07DQor CXU4IHB3c19rZXlfY2lwaGVyX2xpc3RbNF07DQorCXU4IGF1dGhfa2V5X2NudFsyXTsNCisJdTgg YXV0aF9rZXlfbGlzdFs0XTsNCisJdTggcnNuX2NhcFsyXTsNCisJdTggcG1rX2lkX2NudFsyXTsN CisJdTggcG1rX2lkX2xpc3RbMTZdOyAgICAgICAgICAvKiBTaG91bGQgbW9kaWZ5IHRvIDE2ICog UyAqLw0KKwl1OCByZXNlcnZlZFs4XTsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBhY19wYXJh bV9yY2Qgew0KKwl1OCBhY2lfYWlmc247DQorCXU4IGVjd19taW5fbWF4Ow0KKwlfX2xlMTYgdHhv cF9saW07DQorfSBfX3BhY2tlZDsNCisNCitzdHJ1Y3Qgd21tX3BhcmFtX2VsZW0gew0KKwl1OCBl bGVtX2lkOw0KKwl1OCBsZW47DQorCXU4IG91aVszXTsNCisJdTggdHlwZTsNCisJdTggc3ViX3R5 cGU7DQorCXU4IHZlcnNpb247DQorCXU4IHJzdmQ7DQorCXN0cnVjdCBhY19wYXJhbV9yY2QgYWNf YmU7DQorCXN0cnVjdCBhY19wYXJhbV9yY2QgYWNfYms7DQorCXN0cnVjdCBhY19wYXJhbV9yY2Qg YWNfdmk7DQorCXN0cnVjdCBhY19wYXJhbV9yY2QgYWNfdm87DQorfSBfX3BhY2tlZDsNCisNCitz dHJ1Y3QgY2hhbm5lbF9pbmZvIHsNCisJdTggZmlyc3RfY2hhbm5lbF9udW07DQorCXU4IG51bV9j aGFubmVsczsNCisJdTggbWF4X3R4X3B3cl9sZXZlbDsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVj dCBjb3VudHJ5IHsNCisJdTggZWxlbV9pZDsNCisJdTggbGVuOw0KKwl1OCBjb3VudHJ5X3N0clsz XTsNCisJc3RydWN0IGNoYW5uZWxfaW5mbyBjaGFubmVsX2luZm9bNDBdOw0KK30gX19wYWNrZWQ7 DQorDQorc3RydWN0IHN0YXJ0X2NtZCB7DQorCXU4IHN0YV9tYWNfYWRkcltFVEhfQUxFTl07DQor CXU4IHNzaWRbSUVFRTgwMjExX01BWF9TU0lEX0xFTl07DQorCXU4IGJzc190eXBlOw0KKwlfX2xl MTYgYmNuX3BlcmlvZDsNCisJdTggZHRpbV9wZXJpb2Q7DQorCXVuaW9uIHNzX3BhcmFtcyBzc19w YXJhbV9zZXQ7DQorCXVuaW9uIHBoeV9wYXJhbXMgcGh5X3BhcmFtX3NldDsNCisJX19sZTE2IHBy b2JlX2RlbGF5Ow0KKwlfX2xlMTYgY2FwX2luZm87DQorCXU4IGJfcmF0ZV9zZXRbU1lTQURQVF9N QVhfREFUQV9SQVRFU19HXTsNCisJdTggb3BfcmF0ZV9zZXRbU1lTQURQVF9NQVhfREFUQV9SQVRF U19HXTsNCisJc3RydWN0IHJzbl9pZSByc25faWU7DQorCXN0cnVjdCByc240OF9pZSByc240OF9p ZTsNCisJc3RydWN0IHdtbV9wYXJhbV9lbGVtIHdtbV9wYXJhbTsNCisJc3RydWN0IGNvdW50cnkg Y291bnRyeTsNCisJX19sZTMyIGFwX3JmX3R5cGU7ICAgICAgICAgICAvKiAwLT5CLCAxLT5HLCAy LT5NaXhlZCwgMy0+QSwgNC0+MTFKICovDQorfSBfX3BhY2tlZDsNCisNCitzdHJ1Y3QgaG9zdGNt ZF9jbWRfYXBfYmVhY29uIHsNCisJc3RydWN0IGhvc3RjbWRfaGVhZGVyIGNtZF9oZHI7DQorCXN0 cnVjdCBzdGFydF9jbWQgc3RhcnRfY21kOw0KK30gX19wYWNrZWQ7DQorDQorLyogSE9TVENNRF9D TURfU0VUX05FV19TVE4gKi8NCitzdHJ1Y3QgYWRkX2h0X2luZm8gew0KKwl1OCBjb250cm9sX2No bmw7DQorCXU4IGFkZF9jaG5sOw0KKwlfX2xlMTYgb3BfbW9kZTsNCisJX19sZTE2IHN0YmM7DQor fSBfX3BhY2tlZDsNCisNCitzdHJ1Y3QgcGVlcl9pbmZvIHsNCisJX19sZTMyIGxlZ2FjeV9yYXRl X2JpdG1hcDsNCisJdTggaHRfcmF0ZXNbNF07DQorCV9fbGUxNiBjYXBfaW5mbzsNCisJX19sZTE2 IGh0X2NhcF9pbmZvOw0KKwl1OCBtYWNfaHRfcGFyYW1faW5mbzsNCisJdTggbXJ2bF9zdGE7DQor CXN0cnVjdCBhZGRfaHRfaW5mbyBhZGRfaHRfaW5mbzsNCisJX19sZTMyIHR4X2JmX2NhcGFiaWxp dGllczsgICAvKiBFWEJGX1NVUFBPUlQgKi8NCisJX19sZTMyIHZodF9tYXhfcnhfbWNzOw0KKwlf X2xlMzIgdmh0X2NhcDsNCisJLyogMDoyME1oeiwgMTo0ME1oeiwgMjo4ME1oeiwgMzoxNjAgb3Ig ODArODBNaHogKi8NCisJdTggdmh0X3J4X2NoYW5uZWxfd2lkdGg7DQorfSBfX3BhY2tlZDsNCisN CitzdHJ1Y3QgaG9zdGNtZF9jbWRfc2V0X25ld19zdG4gew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFk ZXIgY21kX2hkcjsNCisJX19sZTE2IGFpZDsNCisJdTggbWFjX2FkZHJbRVRIX0FMRU5dOw0KKwlf X2xlMTYgc3RuX2lkOw0KKwlfX2xlMTYgYWN0aW9uOw0KKwlfX2xlMTYgcmVzZXJ2ZWQ7DQorCXN0 cnVjdCBwZWVyX2luZm8gcGVlcl9pbmZvOw0KKwkvKiBVQVBTRF9TVVBQT1JUICovDQorCXU4IHFv c19pbmZvOw0KKwl1OCBpc19xb3Nfc3RhOw0KKwlfX2xlMzIgZndfc3RhX3B0cjsNCit9IF9fcGFj a2VkOw0KKw0KKy8qIEhPU1RDTURfQ01EX1NFVF9BUE1PREUgKi8NCitzdHJ1Y3QgaG9zdGNtZF9j bWRfc2V0X2FwbW9kZSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwl1OCBh cG1vZGU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9VUERBVEVfRU5DUllQVElP TiAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF91cGRhdGVfZW5jcnlwdGlvbiB7DQorCXN0cnVjdCBo b3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkvKiBBY3Rpb24gdHlwZSAtIHNlZSBlbmNyX2FjdGlv bl90eXBlICovDQorCV9fbGUzMiBhY3Rpb25fdHlwZTsgICAgICAgICAgLyogZW5jcl9hY3Rpb25f dHlwZSAqLw0KKwkvKiBzaXplIG9mIHRoZSBkYXRhIGJ1ZmZlciBhdHRhY2hlZC4gKi8NCisJX19s ZTMyIGRhdGFfbGVuZ3RoOw0KKwl1OCBtYWNfYWRkcltFVEhfQUxFTl07DQorCXU4IGFjdGlvbl9k YXRhWzFdOw0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IHdlcF90eXBlX2tleSB7DQorCS8qIFdF UCBrZXkgbWF0ZXJpYWwgKG1heCAxMjhiaXQpICovDQorCXU4IGtleV9tYXRlcmlhbFtNQVhfRU5D Ul9LRVlfTEVOR1RIXTsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBlbmNyX3RraXBfc2VxY250 IHsNCisJX19sZTE2IGxvdzsNCisJX19sZTMyIGhpZ2g7DQorfSBfX3BhY2tlZDsNCisNCitzdHJ1 Y3QgdGtpcF90eXBlX2tleSB7DQorCS8qIFRLSVAgS2V5IG1hdGVyaWFsLiBLZXkgdHlwZSAoZ3Jv dXAgb3IgcGFpcndpc2Uga2V5KSBpcw0KKwkgKiBkZXRlcm1pbmVkIGJ5IGZsYWdzDQorCSAqLw0K KwkvKiBpbiBLRVlfUEFSQU1fU0VUIHN0cnVjdHVyZS4gKi8NCisJdTgga2V5X21hdGVyaWFsW01B WF9FTkNSX0tFWV9MRU5HVEhdOw0KKwkvKiBNSUMga2V5cyAqLw0KKwl1OCB0a2lwX3R4X21pY19r ZXlbTUlDX0tFWV9MRU5HVEhdOw0KKwl1OCB0a2lwX3J4X21pY19rZXlbTUlDX0tFWV9MRU5HVEhd Ow0KKwlzdHJ1Y3QgZW5jcl90a2lwX3NlcWNudAl0a2lwX3JzYzsNCisJc3RydWN0IGVuY3JfdGtp cF9zZXFjbnQJdGtpcF90c2M7DQorfSBfX3BhY2tlZDsNCisNCitzdHJ1Y3QgYWVzX3R5cGVfa2V5 IHsNCisJLyogQUVTIEtleSBtYXRlcmlhbCAqLw0KKwl1OCBrZXlfbWF0ZXJpYWxbTUFYX0VOQ1Jf S0VZX0xFTkdUSF07DQorfSBfX3BhY2tlZDsNCisNCit1bmlvbiBtd2xfa2V5X3R5cGUgew0KKwlz dHJ1Y3Qgd2VwX3R5cGVfa2V5ICB3ZXBfa2V5Ow0KKwlzdHJ1Y3QgdGtpcF90eXBlX2tleSB0a2lw X2tleTsNCisJc3RydWN0IGFlc190eXBlX2tleSAgYWVzX2tleTsNCit9IF9fcGFja2VkOw0KKw0K K3N0cnVjdCBrZXlfcGFyYW1fc2V0IHsNCisJLyogVG90YWwgbGVuZ3RoIG9mIHRoaXMgc3RydWN0 dXJlIChLZXkgaXMgdmFyaWFibGUgc2l6ZSBhcnJheSkgKi8NCisJX19sZTE2IGxlbmd0aDsNCisJ LyogS2V5IHR5cGUgLSBXRVAsIFRLSVAgb3IgQUVTLUNDTVAuICovDQorCS8qIFNlZSBkZWZpbml0 aW9ucyBhYm92ZSAqLw0KKwlfX2xlMTYga2V5X3R5cGVfaWQ7DQorCS8qIGtleSBmbGFncyAoRU5D Ul9LRVlfRkxBR19YWFhfICovDQorCV9fbGUzMiBrZXlfaW5mbzsNCisJLyogRm9yIFdFUCBvbmx5 IC0gYWN0dWFsIGtleSBpbmRleCAqLw0KKwlfX2xlMzIga2V5X2luZGV4Ow0KKwkvKiBTaXplIG9m IHRoZSBrZXkgKi8NCisJX19sZTE2IGtleV9sZW47DQorCS8qIEtleSBtYXRlcmlhbCAodmFyaWFi bGUgc2l6ZSBhcnJheSkgKi8NCisJdW5pb24gbXdsX2tleV90eXBlIGtleTsNCisJdTggbWFjX2Fk ZHJbRVRIX0FMRU5dOw0KK30gX19wYWNrZWQ7DQorDQorc3RydWN0IGhvc3RjbWRfY21kX3NldF9r ZXkgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIgY21kX2hkcjsNCisJLyogQWN0aW9uIHR5cGUg LSBzZWUgZW5jcl9hY3Rpb25fdHlwZSAqLw0KKwlfX2xlMzIgYWN0aW9uX3R5cGU7ICAgICAgICAg IC8qIGVuY3JfYWN0aW9uX3R5cGUgKi8NCisJLyogc2l6ZSBvZiB0aGUgZGF0YSBidWZmZXIgYXR0 YWNoZWQuICovDQorCV9fbGUzMiBkYXRhX2xlbmd0aDsNCisJLyogZGF0YSBidWZmZXIgLSBtYXBz IHRvIG9uZSBLRVlfUEFSQU1fU0VUIHN0cnVjdHVyZSAqLw0KKwlzdHJ1Y3Qga2V5X3BhcmFtX3Nl dCBrZXlfcGFyYW07DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9CQVNUUkVBTSAq Lw0KKyNkZWZpbmUgQkFfVFlQRV9NQVNLICAgICAgIDB4MDAwMDAwMDENCisjZGVmaW5lIEJBX0RJ UkVDVElPTl9NQVNLICAweDAwMDAwMDA2DQorI2RlZmluZSBCQV9ESVJFQ1RJT05fU0hJRlQgMQ0K Kw0KK3N0cnVjdCBiYV9jb250ZXh0IHsNCisJX19sZTMyIGNvbnRleHQ7DQorfSBfX3BhY2tlZDsN CisNCisvKiBwYXJhbWV0ZXJzIGZvciBibG9jayBhY2sgY3JlYXRpb24gKi8NCitzdHJ1Y3QgY3Jl YXRlX2JhX3BhcmFtcyB7DQorCS8qIEJBIENyZWF0aW9uIGZsYWdzIC0gc2VlIGFib3ZlICovDQor CV9fbGUzMiBmbGFnczsNCisJLyogaWRsZSB0aHJlc2hvbGQgKi8NCisJX19sZTMyIGlkbGVfdGhy czsNCisJLyogYmxvY2sgYWNrIHRyYW5zbWl0IHRocmVzaG9sZCAoYWZ0ZXIgaG93IG1hbnkgcGt0 cyBzaG91bGQgd2UNCisJICogc2VuZCBCQVI/KQ0KKwkgKi8NCisJX19sZTMyIGJhcl90aHJzOw0K KwkvKiByZWNlaXZlciB3aW5kb3cgc2l6ZSAqLw0KKwlfX2xlMzIgd2luZG93X3NpemU7DQorCS8q IE1BQyBBZGRyZXNzIG9mIHRoZSBCQSBwYXJ0bmVyICovDQorCXU4IHBlZXJfbWFjX2FkZHJbRVRI X0FMRU5dOw0KKwkvKiBEaWFsb2cgVG9rZW4gKi8NCisJdTggZGlhbG9nX3Rva2VuOw0KKwkvKiBU SUQgZm9yIHRoZSB0cmFmZmljIHN0cmVhbSBpbiB0aGlzIEJBICovDQorCXU4IHRpZDsNCisJLyog c2hhcmVkIG1lbW9yeSBxdWV1ZSBJRCAobm90IHN1cmUgaWYgdGhpcyBpcyByZXF1aXJlZCkgKi8N CisJdTggcXVldWVfaWQ7DQorCXU4IHBhcmFtX2luZm87DQorCS8qIHJldHVybmVkIGJ5IGZpcm13 YXJlIC0gZmlybXdhcmUgY29udGV4dCBwb2ludGVyLiAqLw0KKwkvKiB0aGlzIGNvbnRleHQgcG9p bnRlciB3aWxsIGJlIHBhc3NlZCB0byBmaXJtd2FyZSBmb3IgYWxsDQorCSAqIGZ1dHVyZSBjb21t YW5kcy4NCisJICovDQorCXN0cnVjdCBiYV9jb250ZXh0IGZ3X2JhX2NvbnRleHQ7DQorCXU4IHJl c2V0X3NlcV9ubzsgICAgICAgICAgICAgLyoqIDAgb3IgMSoqLw0KKwlfX2xlMTYgY3VycmVudF9z ZXE7DQorCS8qIFRoaXMgaXMgZm9yIHZpcnR1YWwgc3RhdGlvbiBpbiBTdGEgcHJveHkgbW9kZSBm b3IgVjZGVyAqLw0KKwl1OCBzdGFfc3JjX21hY19hZGRyW0VUSF9BTEVOXTsNCit9IF9fcGFja2Vk Ow0KKw0KKy8qIG5ldyB0cmFuc21pdCBzZXF1ZW5jZSBudW1iZXIgaW5mb3JtYXRpb24gKi8NCitz dHJ1Y3QgYmFfdXBkYXRlX3NlcV9udW0gew0KKwkvKiBCQSBmbGFncyAtIHNlZSBhYm92ZSAqLw0K KwlfX2xlMzIgZmxhZ3M7DQorCS8qIHJldHVybmVkIGJ5IGZpcm13YXJlIGluIHRoZSBjcmVhdGUg YmEgc3RyZWFtIHJlc3BvbnNlICovDQorCXN0cnVjdCBiYV9jb250ZXh0IGZ3X2JhX2NvbnRleHQ7 DQorCS8qIG5ldyBzZXF1ZW5jZSBudW1iZXIgZm9yIHRoaXMgYmxvY2sgYWNrIHN0cmVhbSAqLw0K KwlfX2xlMTYgYmFfc2VxX251bTsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBiYV9zdHJlYW1f Y29udGV4dCB7DQorCS8qIEJBIFN0cmVhbSBmbGFncyAqLw0KKwlfX2xlMzIgZmxhZ3M7DQorCS8q IHJldHVybmVkIGJ5IGZpcm13YXJlIGluIHRoZSBjcmVhdGUgYmEgc3RyZWFtIHJlc3BvbnNlICov DQorCXN0cnVjdCBiYV9jb250ZXh0IGZ3X2JhX2NvbnRleHQ7DQorfSBfX3BhY2tlZDsNCisNCit1 bmlvbiBiYV9pbmZvIHsNCisJLyogaW5mb3JtYXRpb24gcmVxdWlyZWQgdG8gY3JlYXRlIEJBIFN0 cmVhbS4uLiAqLw0KKwlzdHJ1Y3QgY3JlYXRlX2JhX3BhcmFtcwljcmVhdGVfcGFyYW1zOw0KKwkv KiB1cGRhdGUgc3RhcnRpbmcvbmV3IHNlcXVlbmNlIG51bWJlciBldGMuICovDQorCXN0cnVjdCBi YV91cGRhdGVfc2VxX251bSB1cGR0X3NlcV9udW07DQorCS8qIGRlc3Ryb3kgYW4gZXhpc3Rpbmcg c3RyZWFtLi4uICovDQorCXN0cnVjdCBiYV9zdHJlYW1fY29udGV4dCBkZXN0cm95X3BhcmFtczsN CisJLyogZGVzdHJveSBhbiBleGlzdGluZyBzdHJlYW0uLi4gKi8NCisJc3RydWN0IGJhX3N0cmVh bV9jb250ZXh0IGZsdXNoX3BhcmFtczsNCit9IF9fcGFja2VkOw0KKw0KK3N0cnVjdCBob3N0Y21k X2NtZF9iYXN0cmVhbSB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwlfX2xl MzIgYWN0aW9uX3R5cGU7DQorCXVuaW9uIGJhX2luZm8gYmFfaW5mbzsNCit9IF9fcGFja2VkOw0K Kw0KKy8qIEhPU1RDTURfQ01EX1NFVF9PUFRJTUlaQVRJT05fTEVWRUwgKi8NCitzdHJ1Y3QgaG9z dGNtZF9jbWRfc2V0X29wdGltaXphdGlvbl9sZXZlbCB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRl ciBjbWRfaGRyOw0KKwl1OCBvcHRfbGV2ZWw7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01E X0NNRF9EV0RTX0VOQUJMRSAqLw0KK3N0cnVjdCBob3N0Y21kX2NtZF9kd2RzX2VuYWJsZSB7DQor CXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwlfX2xlMzIgZW5hYmxlOyAgICAgICAg ICAgICAgIC8qIDAgLS0gRGlzYWJsZS4gb3IgMSAtLSBFbmFibGUuICovDQorfSBfX3BhY2tlZDsN CisNCisvKiBIT1NUQ01EX0NNRF9GV19GTFVTSF9USU1FUiAqLw0KK3N0cnVjdCBob3N0Y21kX2Nt ZF9md19mbHVzaF90aW1lciB7DQorCXN0cnVjdCBob3N0Y21kX2hlYWRlciBjbWRfaGRyOw0KKwkv KiAwIC0tIERpc2FibGUuID4gMCAtLSBob2xkcyB0aW1lIHZhbHVlIGluIHVzZWNzLiAqLw0KKwlf X2xlMzIgdmFsdWU7DQorfSBfX3BhY2tlZDsNCisNCisvKiBIT1NUQ01EX0NNRF9TRVRfQ0REICov DQorc3RydWN0IGhvc3RjbWRfY21kX3NldF9jZGQgew0KKwlzdHJ1Y3QgaG9zdGNtZF9oZWFkZXIg Y21kX2hkcjsNCisJX19sZTMyIGVuYWJsZTsNCit9IF9fcGFja2VkOw0KKw0KKyNlbmRpZiAvKiBf aG9zdGNtZF9oXyAqLw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv bXdsd2lmaS9pc3IuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3Iu Yw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjIwYjYwODgNCi0tLSAvZGV2 L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9pc3IuYw0K QEAgLTAsMCArMSwxNTAgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2 ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUg IkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQu IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lv biAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0 cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRo ZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQor ICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv biwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQg V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICog QVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25h bCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0K Ky8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMgaW50ZXJydXB0IHJlbGF0ZWQg ZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNsdWRlICJzeXNhZHB0LmgiDQorI2luY2x1ZGUgImRldi5o Ig0KKyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJpc3IuaCINCisNCisjZGVmaW5lIElO VkFMSURfV0FUQ0hET0cgMHhBQQ0KKw0KK2lycXJldHVybl90IG13bF9pc3IoaW50IGlycSwgdm9p ZCAqZGV2X2lkKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9odyAqaHcgPSBkZXZfaWQ7DQorCXN0 cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwl2b2lkIF9faW9tZW0gKmludF9zdGF0 dXNfbWFzazsNCisJdW5zaWduZWQgaW50IGludF9zdGF0dXMsIGNscl9zdGF0dXM7DQorCXUzMiBz dGF0dXM7DQorDQorCWludF9zdGF0dXNfbWFzayA9IHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVH X0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0s7DQorDQorCWludF9zdGF0dXMgPSByZWFkbChwcml2 LT5pb2Jhc2UxICsgTUFDUkVHX1JFR19BMkhfSU5URVJSVVBUX0NBVVNFKTsNCisNCisJaWYgKGlu dF9zdGF0dXMgPT0gMHgwMDAwMDAwMCkNCisJCXJldHVybiBJUlFfTk9ORTsNCisNCisJaWYgKGlu dF9zdGF0dXMgPT0gMHhmZmZmZmZmZikgew0KKwkJd2lwaHlfd2Fybihody0+d2lwaHksICJjYXJk IHVucGx1Z2dlZD9cbiIpOw0KKwl9IGVsc2Ugew0KKwkJY2xyX3N0YXR1cyA9IGludF9zdGF0dXM7 DQorDQorCQlpZiAoaW50X3N0YXR1cyAmIE1BQ1JFR19BMkhSSUNfQklUX1RYX0RPTkUpIHsNCisJ CQlpbnRfc3RhdHVzICY9IH5NQUNSRUdfQTJIUklDX0JJVF9UWF9ET05FOw0KKw0KKwkJCWlmICgh cHJpdi0+aXNfdHhfc2NoZWR1bGUpIHsNCisJCQkJc3RhdHVzID0gcmVhZGwoaW50X3N0YXR1c19t YXNrKTsNCisJCQkJd3JpdGVsKChzdGF0dXMgJiB+TUFDUkVHX0EySFJJQ19CSVRfVFhfRE9ORSks DQorCQkJCSAgICAgICBpbnRfc3RhdHVzX21hc2spOw0KKwkJCQl0YXNrbGV0X3NjaGVkdWxlKCZw cml2LT50eF90YXNrKTsNCisJCQkJcHJpdi0+aXNfdHhfc2NoZWR1bGUgPSB0cnVlOw0KKwkJCX0N CisJCX0NCisNCisJCWlmIChpbnRfc3RhdHVzICYgTUFDUkVHX0EySFJJQ19CSVRfUlhfUkRZKSB7 DQorCQkJaW50X3N0YXR1cyAmPSB+TUFDUkVHX0EySFJJQ19CSVRfUlhfUkRZOw0KKw0KKwkJCWlm ICghcHJpdi0+aXNfcnhfc2NoZWR1bGUpIHsNCisJCQkJc3RhdHVzID0gcmVhZGwoaW50X3N0YXR1 c19tYXNrKTsNCisJCQkJd3JpdGVsKChzdGF0dXMgJiB+TUFDUkVHX0EySFJJQ19CSVRfUlhfUkRZ KSwNCisJCQkJICAgICAgIGludF9zdGF0dXNfbWFzayk7DQorCQkJCXRhc2tsZXRfc2NoZWR1bGUo JnByaXYtPnJ4X3Rhc2spOw0KKwkJCQlwcml2LT5pc19yeF9zY2hlZHVsZSA9IHRydWU7DQorCQkJ fQ0KKwkJfQ0KKw0KKwkJaWYgKGludF9zdGF0dXMgJiBNQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1Q VFkpIHsNCisJCQlpbnRfc3RhdHVzICY9IH5NQUNSRUdfQTJIUklDX0JJVF9RVUVfRU1QVFk7DQor DQorCQkJaWYgKCFwcml2LT5pc19xZV9zY2hlZHVsZSkgew0KKwkJCQlzdGF0dXMgPSByZWFkbChp bnRfc3RhdHVzX21hc2spOw0KKwkJCQl3cml0ZWwoKHN0YXR1cyAmIH5NQUNSRUdfQTJIUklDX0JJ VF9RVUVfRU1QVFkpLA0KKwkJCQkgICAgICAgaW50X3N0YXR1c19tYXNrKTsNCisJCQkJdGFza2xl dF9zY2hlZHVsZSgmcHJpdi0+cWVfdGFzayk7DQorCQkJCXByaXYtPmlzX3FlX3NjaGVkdWxlID0g dHJ1ZTsNCisJCQl9DQorCQl9DQorDQorCQlpZiAoaW50X3N0YXR1cyAmIE1BQ1JFR19BMkhSSUNf QkFfV0FUQ0hET0cpIHsNCisJCQlzdGF0dXMgPSByZWFkbChpbnRfc3RhdHVzX21hc2spOw0KKwkJ CXdyaXRlbCgoc3RhdHVzICYgfk1BQ1JFR19BMkhSSUNfQkFfV0FUQ0hET0cpLA0KKwkJCSAgICAg ICBpbnRfc3RhdHVzX21hc2spOw0KKwkJCWludF9zdGF0dXMgJj0gfk1BQ1JFR19BMkhSSUNfQkFf V0FUQ0hET0c7DQorCQkJaWVlZTgwMjExX3F1ZXVlX3dvcmsoaHcsICZwcml2LT53YXRjaGRvZ19i YV9oYW5kbGUpOw0KKwkJfQ0KKw0KKwkJd3JpdGVsKH5jbHJfc3RhdHVzLA0KKwkJICAgICAgIHBy aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfQ0FVU0UpOw0KKwl9DQorDQor CXJldHVybiBJUlFfSEFORExFRDsNCit9DQorDQordm9pZCBtd2xfd2F0Y2hkb2dfYmFfZXZlbnRz KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykNCit7DQorCWludCByYzsNCisJdTggYml0bWFwID0g MCwgc3RyZWFtX2luZGV4Ow0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtczsNCisJ c3RydWN0IG13bF9wcml2ICpwcml2ID0NCisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgbXds X3ByaXYsIHdhdGNoZG9nX2JhX2hhbmRsZSk7DQorCXUzMiBzdGF0dXM7DQorDQorCXJjID0gbXds X2Z3Y21kX2dldF93YXRjaGRvZ19iaXRtYXAocHJpdi0+aHcsICZiaXRtYXApOw0KKw0KKwlpZiAo cmMpDQorCQlnb3RvIGRvbmU7DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2sp Ow0KKw0KKwkvKiB0aGUgYml0bWFwIGlzIHRoZSBodyBxdWV1ZSBudW1iZXIuICBNYXAgaXQgdG8g dGhlIGFtcGR1IHF1ZXVlLiAqLw0KKwlpZiAoYml0bWFwICE9IElOVkFMSURfV0FUQ0hET0cpIHsN CisJCWlmIChiaXRtYXAgPT0gU1lTQURQVF9UWF9BTVBEVV9RVUVVRVMpDQorCQkJc3RyZWFtX2lu ZGV4ID0gMDsNCisJCWVsc2UgaWYgKGJpdG1hcCA+IFNZU0FEUFRfVFhfQU1QRFVfUVVFVUVTKQ0K KwkJCXN0cmVhbV9pbmRleCA9IGJpdG1hcCAtIFNZU0FEUFRfVFhfQU1QRFVfUVVFVUVTOw0KKwkJ ZWxzZQ0KKwkJCXN0cmVhbV9pbmRleCA9IGJpdG1hcCArIDM7IC8qKiBxdWV1ZSAwIGlzIHN0cmVh bSAzKi8NCisNCisJCWlmIChiaXRtYXAgIT0gMHhGRikgew0KKwkJCS8qIENoZWNrIGlmIHRoZSBz dHJlYW0gaXMgaW4gdXNlIGJlZm9yZSBkaXNhYmxpbmcgaXQgKi8NCisJCQlzdHJlYW1zID0gJnBy aXYtPmFtcGR1W3N0cmVhbV9pbmRleF07DQorDQorCQkJaWYgKHN0cmVhbXMtPnN0YXRlID09IEFN UERVX1NUUkVBTV9BQ1RJVkUpDQorCQkJCWllZWU4MDIxMV9zdG9wX3R4X2JhX3Nlc3Npb24oc3Ry ZWFtcy0+c3RhLA0KKwkJCQkJCQkgICAgIHN0cmVhbXMtPnRpZCk7DQorCQl9IGVsc2Ugew0KKwkJ CWZvciAoc3RyZWFtX2luZGV4ID0gMDsNCisJCQkgICAgIHN0cmVhbV9pbmRleCA8IFNZU0FEUFRf VFhfQU1QRFVfUVVFVUVTOw0KKwkJCSAgICAgc3RyZWFtX2luZGV4KyspIHsNCisJCQkJc3RyZWFt cyA9ICZwcml2LT5hbXBkdVtzdHJlYW1faW5kZXhdOw0KKw0KKwkJCQlpZiAoc3RyZWFtcy0+c3Rh dGUgIT0gQU1QRFVfU1RSRUFNX0FDVElWRSkNCisJCQkJCWNvbnRpbnVlOw0KKw0KKwkJCQlpZWVl ODAyMTFfc3RvcF90eF9iYV9zZXNzaW9uKHN0cmVhbXMtPnN0YSwNCisJCQkJCQkJICAgICBzdHJl YW1zLT50aWQpOw0KKwkJCX0NCisJCX0NCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+ c3RyZWFtX2xvY2spOw0KKw0KK2RvbmU6DQorDQorCXN0YXR1cyA9IHJlYWRsKHByaXYtPmlvYmFz ZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0spOw0KKwl3cml0ZWwoc3Rh dHVzIHwgTUFDUkVHX0EySFJJQ19CQV9XQVRDSERPRywNCisJICAgICAgIHByaXYtPmlvYmFzZTEg KyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0spOw0KK30NCmRpZmYgLS1naXQg YS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaXNyLmggYi9kcml2ZXJzL25l dC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaXNyLmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQpp bmRleCAwMDAwMDAwLi4yNTk4MTE1DQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93 aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvaXNyLmgNCkBAIC0wLDAgKzEsMjYgQEANCisvKg0KKyAq IENvcHlyaWdodCAoQykgMjAwNi0yMDE1LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAq DQorICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBN YXJ2ZWxsIEludGVybmF0aW9uYWwNCisgKiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJM aWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBG aWxlIGluDQorICogYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0 aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdoaWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcg dG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUg SVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBU SEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1Mg Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFDQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAg VGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3 YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAqLw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxl IGRlZmluZXMgaW50ZXJydXB0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KKw0KKyNpZm5kZWYgX2lz cl9oXw0KKyNkZWZpbmUgX2lzcl9oXw0KKw0KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4N CisNCitpcnFyZXR1cm5fdCBtd2xfaXNyKGludCBpcnEsIHZvaWQgKmRldl9pZCk7DQordm9pZCBt d2xfd2F0Y2hkb2dfYmFfZXZlbnRzKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7DQorDQorI2Vu ZGlmIC8qIF9pc3JfaF8gKi8NCmRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2 ZWxsL213bHdpZmkvbWFjODAyMTEuYyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds d2lmaS9tYWM4MDIxMS5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZmY5 MzM1Nw0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9t d2x3aWZpL21hYzgwMjExLmMNCkBAIC0wLDAgKzEsNjk5IEBADQorLyoNCisgKiBDb3B5cmlnaHQg KEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMg c29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRl cm5hdGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAg WW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAq IGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2Us IGEgY29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJV VEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNl IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlz Y2xhaW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRz IG1hYzgwMjExIHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNsdWRlIDxsaW51eC9ldGhl cmRldmljZS5oPg0KKw0KKyNpbmNsdWRlICJzeXNhZHB0LmgiDQorI2luY2x1ZGUgImRldi5oIg0K KyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJ0eC5oIg0KKw0KKyNkZWZpbmUgTVdMX0RS Vl9OQU1FICAgICAgICBLQlVJTERfTU9ETkFNRQ0KKw0KKyNkZWZpbmUgTUFYX0FNUERVX0FUVEVN UFRTICA1DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfcmF0ZSBtd2xfcmF0ZXNf MjRbXSA9IHsNCisJeyAuYml0cmF0ZSA9IDEwLCAuaHdfdmFsdWUgPSAyLCB9LA0KKwl7IC5iaXRy YXRlID0gMjAsIC5od192YWx1ZSA9IDQsIH0sDQorCXsgLmJpdHJhdGUgPSA1NSwgLmh3X3ZhbHVl ID0gMTEsIH0sDQorCXsgLmJpdHJhdGUgPSAxMTAsIC5od192YWx1ZSA9IDIyLCB9LA0KKwl7IC5i aXRyYXRlID0gMjIwLCAuaHdfdmFsdWUgPSA0NCwgfSwNCisJeyAuYml0cmF0ZSA9IDYwLCAuaHdf dmFsdWUgPSAxMiwgfSwNCisJeyAuYml0cmF0ZSA9IDkwLCAuaHdfdmFsdWUgPSAxOCwgfSwNCisJ eyAuYml0cmF0ZSA9IDEyMCwgLmh3X3ZhbHVlID0gMjQsIH0sDQorCXsgLmJpdHJhdGUgPSAxODAs IC5od192YWx1ZSA9IDM2LCB9LA0KKwl7IC5iaXRyYXRlID0gMjQwLCAuaHdfdmFsdWUgPSA0OCwg fSwNCisJeyAuYml0cmF0ZSA9IDM2MCwgLmh3X3ZhbHVlID0gNzIsIH0sDQorCXsgLmJpdHJhdGUg PSA0ODAsIC5od192YWx1ZSA9IDk2LCB9LA0KKwl7IC5iaXRyYXRlID0gNTQwLCAuaHdfdmFsdWUg PSAxMDgsIH0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4MDIxMV9yYXRlIG13 bF9yYXRlc181MFtdID0gew0KKwl7IC5iaXRyYXRlID0gNjAsIC5od192YWx1ZSA9IDEyLCB9LA0K Kwl7IC5iaXRyYXRlID0gOTAsIC5od192YWx1ZSA9IDE4LCB9LA0KKwl7IC5iaXRyYXRlID0gMTIw LCAuaHdfdmFsdWUgPSAyNCwgfSwNCisJeyAuYml0cmF0ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMzYs IH0sDQorCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1ZSA9IDQ4LCB9LA0KKwl7IC5iaXRyYXRl ID0gMzYwLCAuaHdfdmFsdWUgPSA3MiwgfSwNCisJeyAuYml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVl ID0gOTYsIH0sDQorCXsgLmJpdHJhdGUgPSA1NDAsIC5od192YWx1ZSA9IDEwOCwgfSwNCit9Ow0K Kw0KK3N0YXRpYyB2b2lkIG13bF9tYWM4MDIxMV90eChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywN CisJCQkgICAgc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250cm9sLA0KKwkJCSAgICBz dHJ1Y3Qgc2tfYnVmZiAqc2tiKQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnBy aXY7DQorDQorCWlmICghcHJpdi0+cmFkaW9fb24pIHsNCisJCXdpcGh5X3dhcm4oaHctPndpcGh5 LA0KKwkJCSAgICJkcm9wcGVkIFRYIGZyYW1lIHNpbmNlIHJhZGlvIGlzIGRpc2FibGVkXG4iKTsN CisJCWRldl9rZnJlZV9za2JfYW55KHNrYik7DQorCQlyZXR1cm47DQorCX0NCisNCisJbXdsX3R4 X3htaXQoaHcsIGNvbnRyb2wsIHNrYik7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjEx X3N0YXJ0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpw cml2ID0gaHctPnByaXY7DQorCWludCByYzsNCisNCisJLyogRW5hYmxlIFRYIHJlY2xhaW0gYW5k IFJYIHRhc2tsZXRzLiAqLw0KKwl0YXNrbGV0X2VuYWJsZSgmcHJpdi0+dHhfdGFzayk7DQorCXRh c2tsZXRfZW5hYmxlKCZwcml2LT5yeF90YXNrKTsNCisJdGFza2xldF9lbmFibGUoJnByaXYtPnFl X3Rhc2spOw0KKw0KKwkvKiBFbmFibGUgaW50ZXJydXB0cyAqLw0KKwltd2xfZndjbWRfaW50X2Vu YWJsZShodyk7DQorDQorCXJjID0gbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShodyk7DQorCWlmIChy YykNCisJCWdvdG8gZndjbWRfZmFpbDsNCisJcmMgPSBtd2xfZndjbWRfc2V0X3JhdGVfYWRhcHRf bW9kZShodywgMCk7DQorCWlmIChyYykNCisJCWdvdG8gZndjbWRfZmFpbDsNCisJcmMgPSBtd2xf ZndjbWRfc2V0X3dtbV9tb2RlKGh3LCB0cnVlKTsNCisJaWYgKHJjKQ0KKwkJZ290byBmd2NtZF9m YWlsOw0KKwlyYyA9IG13bF9md2NtZF9odF9ndWFyZF9pbnRlcnZhbChodywgR1VBUkRfSU5URVJW QUxfQVVUTyk7DQorCWlmIChyYykNCisJCWdvdG8gZndjbWRfZmFpbDsNCisJcmMgPSBtd2xfZndj bWRfc2V0X2R3ZHNfc3RhbW9kZShodywgdHJ1ZSk7DQorCWlmIChyYykNCisJCWdvdG8gZndjbWRf ZmFpbDsNCisJcmMgPSBtd2xfZndjbWRfc2V0X2Z3X2ZsdXNoX3RpbWVyKGh3LCBTWVNBRFBUX0FN U0RVX0ZMVVNIX1RJTUUpOw0KKwlpZiAocmMpDQorCQlnb3RvIGZ3Y21kX2ZhaWw7DQorCXJjID0g bXdsX2Z3Y21kX3NldF9vcHRpbWl6YXRpb25fbGV2ZWwoaHcsIDEpOw0KKwlpZiAocmMpDQorCQln b3RvIGZ3Y21kX2ZhaWw7DQorDQorCWllZWU4MDIxMV93YWtlX3F1ZXVlcyhodyk7DQorCXJldHVy biAwOw0KKw0KK2Z3Y21kX2ZhaWw6DQorCW13bF9md2NtZF9pbnRfZGlzYWJsZShodyk7DQorCXRh c2tsZXRfZGlzYWJsZSgmcHJpdi0+dHhfdGFzayk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+ cnhfdGFzayk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+cWVfdGFzayk7DQorDQorCXJldHVy biByYzsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX21hYzgwMjExX3N0b3Aoc3RydWN0IGllZWU4 MDIxMV9odyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisN CisJbXdsX2Z3Y21kX3JhZGlvX2Rpc2FibGUoaHcpOw0KKw0KKwlpZWVlODAyMTFfc3RvcF9xdWV1 ZXMoaHcpOw0KKw0KKwkvKiBEaXNhYmxlIGludGVycnVwdHMgKi8NCisJbXdsX2Z3Y21kX2ludF9k aXNhYmxlKGh3KTsNCisNCisJLyogRGlzYWJsZSBUWCByZWNsYWltIGFuZCBSWCB0YXNrbGV0cy4g Ki8NCisJdGFza2xldF9kaXNhYmxlKCZwcml2LT50eF90YXNrKTsNCisJdGFza2xldF9kaXNhYmxl KCZwcml2LT5yeF90YXNrKTsNCisJdGFza2xldF9kaXNhYmxlKCZwcml2LT5xZV90YXNrKTsNCisN CisJLyogUmV0dXJuIGFsbCBza2JzIHRvIG1hYzgwMjExICovDQorCW13bF90eF9kb25lKCh1bnNp Z25lZCBsb25nKWh3KTsNCit9DQorDQorc3RhdGljIGludCBtd2xfbWFjODAyMTFfYWRkX2ludGVy ZmFjZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJICAgICAgc3RydWN0IGllZWU4MDIx MV92aWYgKnZpZikNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlz dHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJdTMyIG1hY2lkc19zdXBwb3J0ZWQ7DQorCWludCBt YWNpZDsNCisNCisJc3dpdGNoICh2aWYtPnR5cGUpIHsNCisJY2FzZSBOTDgwMjExX0lGVFlQRV9B UDoNCisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOg0KKwkJbWFjaWRzX3N1cHBvcnRl ZCA9IHByaXYtPmFwX21hY2lkc19zdXBwb3J0ZWQ7DQorCQlicmVhazsNCisJY2FzZSBOTDgwMjEx X0lGVFlQRV9TVEFUSU9OOg0KKwkJbWFjaWRzX3N1cHBvcnRlZCA9IHByaXYtPnN0YV9tYWNpZHNf c3VwcG9ydGVkOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQorCQlyZXR1cm4gLUVJTlZBTDsNCisJ fQ0KKw0KKwltYWNpZCA9IGZmcyhtYWNpZHNfc3VwcG9ydGVkICYgfnByaXYtPm1hY2lkc191c2Vk KTsNCisNCisJaWYgKCFtYWNpZCkgew0KKwkJd2lwaHlfd2Fybihody0+d2lwaHksICJubyBtYWNp ZCBjYW4gYmUgYWxsb2NhdGVkXG4iKTsNCisJCXJldHVybiAtRUJVU1k7DQorCX0NCisJbWFjaWQt LTsNCisNCisJLyogU2V0dXAgZHJpdmVyIHByaXZhdGUgYXJlYS4gKi8NCisJbXdsX3ZpZiA9IG13 bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKwltZW1zZXQobXdsX3ZpZiwgMCwgc2l6ZW9mKCptd2xfdmlm KSk7DQorCW13bF92aWYtPm1hY2lkID0gbWFjaWQ7DQorCW13bF92aWYtPnNlcW5vID0gMDsNCisJ bXdsX3ZpZi0+aXNfaHdfY3J5cHRvX2VuYWJsZWQgPSBmYWxzZTsNCisJbXdsX3ZpZi0+YmVhY29u X2luZm8udmFsaWQgPSBmYWxzZTsNCisJbXdsX3ZpZi0+aXYxNiA9IDE7DQorCW13bF92aWYtPml2 MzIgPSAwOw0KKwltd2xfdmlmLT5rZXlpZHggPSAwOw0KKw0KKwlzd2l0Y2ggKHZpZi0+dHlwZSkg ew0KKwljYXNlIE5MODAyMTFfSUZUWVBFX0FQOg0KKwkJZXRoZXJfYWRkcl9jb3B5KG13bF92aWYt PmJzc2lkLCB2aWYtPmFkZHIpOw0KKwkJbXdsX2Z3Y21kX3NldF9uZXdfc3RuX2FkZF9zZWxmKGh3 LCB2aWYpOw0KKwkJYnJlYWs7DQorCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoNCisJ CWV0aGVyX2FkZHJfY29weShtd2xfdmlmLT5ic3NpZCwgdmlmLT5hZGRyKTsNCisJCW13bF9md2Nt ZF9zZXRfbmV3X3N0bl9hZGRfc2VsZihodywgdmlmKTsNCisJCWJyZWFrOw0KKwljYXNlIE5MODAy MTFfSUZUWVBFX1NUQVRJT046DQorCQlldGhlcl9hZGRyX2NvcHkobXdsX3ZpZi0+c3RhX21hYywg dmlmLT5hZGRyKTsNCisJCW13bF9md2NtZF9ic3Nfc3RhcnQoaHcsIHZpZiwgdHJ1ZSk7DQorCQlt d2xfZndjbWRfc2V0X2luZnJhX21vZGUoaHcsIHZpZik7DQorCQltd2xfZndjbWRfc2V0X21hY19h ZGRyX2NsaWVudChodywgdmlmLCB2aWYtPmFkZHIpOw0KKwkJYnJlYWs7DQorCWRlZmF1bHQ6DQor CQlyZXR1cm4gLUVJTlZBTDsNCisJfQ0KKw0KKwlwcml2LT5tYWNpZHNfdXNlZCB8PSAxIDw8IG13 bF92aWYtPm1hY2lkOw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCisJbGlzdF9h ZGRfdGFpbCgmbXdsX3ZpZi0+bGlzdCwgJnByaXYtPnZpZl9saXN0KTsNCisJc3Bpbl91bmxvY2tf YmgoJnByaXYtPnZpZl9sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyB2b2lk IG13bF9tYWM4MDIxMV9yZW1vdmVfdmlmKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCisJCQkJICAg IHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3Zp ZiA9IG13bF9kZXZfZ2V0X3ZpZih2aWYpOw0KKw0KKwlpZiAoIXByaXYtPm1hY2lkc191c2VkKQ0K KwkJcmV0dXJuOw0KKw0KKwltd2xfdHhfZGVsX3BrdHNfdmlhX3ZpZihwcml2LT5odywgdmlmKTsN CisNCisJcHJpdi0+bWFjaWRzX3VzZWQgJj0gfigxIDw8IG13bF92aWYtPm1hY2lkKTsNCisJc3Bp bl9sb2NrX2JoKCZwcml2LT52aWZfbG9jayk7DQorCWxpc3RfZGVsKCZtd2xfdmlmLT5saXN0KTsN CisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCit9DQorDQorc3RhdGljIHZvaWQg bXdsX21hYzgwMjExX3JlbW92ZV9pbnRlcmZhY2Uoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQor CQkJCQkgIHN0cnVjdCBpZWVlODAyMTFfdmlmICp2aWYpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYg KnByaXYgPSBody0+cHJpdjsNCisNCisJc3dpdGNoICh2aWYtPnR5cGUpIHsNCisJY2FzZSBOTDgw MjExX0lGVFlQRV9BUDoNCisJY2FzZSBOTDgwMjExX0lGVFlQRV9NRVNIX1BPSU5UOg0KKwkJbXds X2Z3Y21kX3NldF9uZXdfc3RuX2RlbChodywgdmlmLCB2aWYtPmFkZHIpOw0KKwkJYnJlYWs7DQor CWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoNCisJCW13bF9md2NtZF9yZW1vdmVfbWFjX2Fk ZHIoaHcsIHZpZiwgdmlmLT5hZGRyKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJYnJlYWs7 DQorCX0NCisNCisJbXdsX21hYzgwMjExX3JlbW92ZV92aWYocHJpdiwgdmlmKTsNCit9DQorDQor c3RhdGljIGludCBtd2xfbWFjODAyMTFfY29uZmlnKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0K KwkJCSAgICAgICB1MzIgY2hhbmdlZCkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29u ZiA9ICZody0+Y29uZjsNCisJaW50IHJjOw0KKw0KKwl3aXBoeV9kZWJ1Zyhody0+d2lwaHksICJj aGFuZ2U6IDB4JXhcbiIsIGNoYW5nZWQpOw0KKw0KKwlpZiAoY29uZi0+ZmxhZ3MgJiBJRUVFODAy MTFfQ09ORl9JRExFKQ0KKwkJcmMgPSBtd2xfZndjbWRfcmFkaW9fZGlzYWJsZShodyk7DQorCWVs c2UNCisJCXJjID0gbXdsX2Z3Y21kX3JhZGlvX2VuYWJsZShodyk7DQorDQorCWlmIChyYykNCisJ CWdvdG8gb3V0Ow0KKw0KKwlpZiAoY2hhbmdlZCAmIElFRUU4MDIxMV9DT05GX0NIQU5HRV9DSEFO TkVMKSB7DQorCQlpbnQgcmF0ZSA9IDA7DQorDQorCQlpZiAoY29uZi0+Y2hhbmRlZi5jaGFuLT5i YW5kID09IElFRUU4MDIxMV9CQU5EXzJHSFopIHsNCisJCQltd2xfZndjbWRfc2V0X2FwbW9kZSho dywgQVBfTU9ERV8yXzRHSFpfMTFBQ19NSVhFRCk7DQorCQkJbXdsX2Z3Y21kX3NldF9saW5rYWRh cHRfY3NfbW9kZShodywNCisJCQkJCQkJTElOS19DU19TVEFURV9DT05TRVJWKTsNCisJCQlyYXRl ID0gbXdsX3JhdGVzXzI0WzBdLmh3X3ZhbHVlOw0KKwkJfSBlbHNlIGlmIChjb25mLT5jaGFuZGVm LmNoYW4tPmJhbmQgPT0gSUVFRTgwMjExX0JBTkRfNUdIWikgew0KKwkJCW13bF9md2NtZF9zZXRf YXBtb2RlKGh3LCBBUF9NT0RFXzExQUMpOw0KKwkJCW13bF9md2NtZF9zZXRfbGlua2FkYXB0X2Nz X21vZGUoaHcsDQorCQkJCQkJCUxJTktfQ1NfU1RBVEVfQVVUTyk7DQorCQkJcmF0ZSA9IG13bF9y YXRlc181MFswXS5od192YWx1ZTsNCisJCX0NCisNCisJCXJjID0gbXdsX2Z3Y21kX3NldF9yZl9j aGFubmVsKGh3LCBjb25mKTsNCisJCWlmIChyYykNCisJCQlnb3RvIG91dDsNCisJCXJjID0gbXds X2Z3Y21kX3VzZV9maXhlZF9yYXRlKGh3LCByYXRlLCByYXRlKTsNCisJCWlmIChyYykNCisJCQln b3RvIG91dDsNCisJCXJjID0gbXdsX2Z3Y21kX21heF90eF9wb3dlcihodywgY29uZiwgMCk7DQor CQlpZiAocmMpDQorCQkJZ290byBvdXQ7DQorCQlyYyA9IG13bF9md2NtZF90eF9wb3dlcihodywg Y29uZiwgMCk7DQorCQlpZiAocmMpDQorCQkJZ290byBvdXQ7DQorCQlyYyA9IG13bF9md2NtZF9z ZXRfY2RkKGh3KTsNCisJfQ0KKw0KK291dDoNCisNCisJcmV0dXJuIHJjOw0KK30NCisNCitzdGF0 aWMgdm9pZCBtd2xfbWFjODAyMTFfYnNzX2luZm9fY2hhbmdlZF9zdGEoc3RydWN0IGllZWU4MDIx MV9odyAqaHcsDQorCQkJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkJ ICAgICAgc3RydWN0IGllZWU4MDIxMV9ic3NfY29uZiAqaW5mbywNCisJCQkJCSAgICAgIHUzMiBj aGFuZ2VkKQ0KK3sNCisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9FUlBfUFJFQU1CTEUpDQor CQltd2xfZndjbWRfc2V0X3JhZGlvX3ByZWFtYmxlKGh3LA0KKwkJCQkJICAgICB2aWYtPmJzc19j b25mLnVzZV9zaG9ydF9wcmVhbWJsZSk7DQorDQorCWlmICgoY2hhbmdlZCAmIEJTU19DSEFOR0VE X0FTU09DKSAmJiB2aWYtPmJzc19jb25mLmFzc29jKQ0KKwkJbXdsX2Z3Y21kX3NldF9haWQoaHcs IHZpZiwgKHU4ICopdmlmLT5ic3NfY29uZi5ic3NpZCwNCisJCQkJICB2aWYtPmJzc19jb25mLmFp ZCk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2VkX2Fw KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3Zp ZiAqdmlmLA0KKwkJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX2Jzc19jb25mICppbmZvLA0KKwkJ CQkJICAgICB1MzIgY2hhbmdlZCkNCit7DQorCWlmIChjaGFuZ2VkICYgQlNTX0NIQU5HRURfRVJQ X1BSRUFNQkxFKQ0KKwkJbXdsX2Z3Y21kX3NldF9yYWRpb19wcmVhbWJsZShodywNCisJCQkJCSAg ICAgdmlmLT5ic3NfY29uZi51c2Vfc2hvcnRfcHJlYW1ibGUpOw0KKw0KKwlpZiAoY2hhbmdlZCAm IEJTU19DSEFOR0VEX0JBU0lDX1JBVEVTKSB7DQorCQlpbnQgaWR4Ow0KKwkJaW50IHJhdGU7DQor DQorCQkvKiBVc2UgbG93ZXN0IHN1cHBvcnRlZCBiYXNpYyByYXRlIGZvciBtdWx0aWNhc3RzDQor CQkgKiBhbmQgbWFuYWdlbWVudCBmcmFtZXMgKHN1Y2ggYXMgcHJvYmUgcmVzcG9uc2VzIC0tDQor CQkgKiBiZWFjb25zIHdpbGwgYWx3YXlzIGdvIG91dCBhdCAxIE1iL3MpLg0KKwkJICovDQorCQlp ZHggPSBmZnModmlmLT5ic3NfY29uZi5iYXNpY19yYXRlcyk7DQorCQlpZiAoaWR4KQ0KKwkJCWlk eC0tOw0KKw0KKwkJaWYgKGh3LT5jb25mLmNoYW5kZWYuY2hhbi0+YmFuZCA9PSBJRUVFODAyMTFf QkFORF8yR0haKQ0KKwkJCXJhdGUgPSBtd2xfcmF0ZXNfMjRbaWR4XS5od192YWx1ZTsNCisJCWVs c2UNCisJCQlyYXRlID0gbXdsX3JhdGVzXzUwW2lkeF0uaHdfdmFsdWU7DQorDQorCQltd2xfZndj bWRfdXNlX2ZpeGVkX3JhdGUoaHcsIHJhdGUsIHJhdGUpOw0KKwl9DQorDQorCWlmIChjaGFuZ2Vk ICYgKEJTU19DSEFOR0VEX0JFQUNPTl9JTlQgfCBCU1NfQ0hBTkdFRF9CRUFDT04pKSB7DQorCQlz dHJ1Y3Qgc2tfYnVmZiAqc2tiOw0KKw0KKwkJc2tiID0gaWVlZTgwMjExX2JlYWNvbl9nZXQoaHcs IHZpZik7DQorDQorCQlpZiAoc2tiKSB7DQorCQkJbXdsX2Z3Y21kX3NldF9iZWFjb24oaHcsIHZp Ziwgc2tiLT5kYXRhLCBza2ItPmxlbik7DQorCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisJ CX0NCisNCisJCWlmICgoaW5mby0+c3NpZFswXSAhPSAnXDAnKSAmJg0KKwkJICAgIChpbmZvLT5z c2lkX2xlbiAhPSAwKSAmJg0KKwkJICAgICghaW5mby0+aGlkZGVuX3NzaWQpKQ0KKwkJCW13bF9m d2NtZF9icm9hZGNhc3Rfc3NpZF9lbmFibGUoaHcsIHZpZiwgdHJ1ZSk7DQorCQllbHNlDQorCQkJ bXdsX2Z3Y21kX2Jyb2FkY2FzdF9zc2lkX2VuYWJsZShodywgdmlmLCBmYWxzZSk7DQorCX0NCisN CisJaWYgKGNoYW5nZWQgJiBCU1NfQ0hBTkdFRF9CRUFDT05fRU5BQkxFRCkNCisJCW13bF9md2Nt ZF9ic3Nfc3RhcnQoaHcsIHZpZiwgaW5mby0+ZW5hYmxlX2JlYWNvbik7DQorfQ0KKw0KK3N0YXRp YyB2b2lkIG13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2VkKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LA0KKwkJCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkJICBzdHJ1Y3Qg aWVlZTgwMjExX2Jzc19jb25mICppbmZvLA0KKwkJCQkJICB1MzIgY2hhbmdlZCkNCit7DQorCXN3 aXRjaCAodmlmLT50eXBlKSB7DQorCWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6DQorCWNhc2UgTkw4 MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoNCisJCW13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2Vk X2FwKGh3LCB2aWYsIGluZm8sIGNoYW5nZWQpOw0KKwkJYnJlYWs7DQorCWNhc2UgTkw4MDIxMV9J RlRZUEVfU1RBVElPTjoNCisJCW13bF9tYWM4MDIxMV9ic3NfaW5mb19jaGFuZ2VkX3N0YShodywg dmlmLCBpbmZvLCBjaGFuZ2VkKTsNCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJYnJlYWs7DQor CX0NCit9DQorDQorc3RhdGljIHZvaWQgbXdsX21hYzgwMjExX2NvbmZpZ3VyZV9maWx0ZXIoc3Ry dWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCQkgIHVuc2lnbmVkIGludCBjaGFuZ2VkX2ZsYWdz LA0KKwkJCQkJICB1bnNpZ25lZCBpbnQgKnRvdGFsX2ZsYWdzLA0KKwkJCQkJICB1NjQgbXVsdGlj YXN0KQ0KK3sNCisJLyogQVAgZmlybXdhcmUgZG9lc24ndCBhbGxvdyBmaW5lLWdyYWluZWQgY29u dHJvbCBvdmVyDQorCSAqIHRoZSByZWNlaXZlIGZpbHRlci4NCisJICovDQorCSp0b3RhbF9mbGFn cyAmPSBGSUZfQUxMTVVMVEkgfCBGSUZfQkNOX1BSQlJFU1BfUFJPTUlTQzsNCit9DQorDQorc3Rh dGljIGludCBtd2xfbWFjODAyMTFfc2V0X2tleShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJ CQkJZW51bSBzZXRfa2V5X2NtZCBjbWRfcGFyYW0sDQorCQkJCXN0cnVjdCBpZWVlODAyMTFfdmlm ICp2aWYsDQorCQkJCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsDQorCQkJCXN0cnVjdCBpZWVl ODAyMTFfa2V5X2NvbmYgKmtleSkNCit7DQorCXN0cnVjdCBtd2xfdmlmICptd2xfdmlmOw0KKwlp bnQgcmMgPSAwOw0KKwl1OCBlbmNyX3R5cGU7DQorCXU4ICphZGRyOw0KKw0KKwltd2xfdmlmID0g bXdsX2Rldl9nZXRfdmlmKHZpZik7DQorDQorCWlmICghc3RhKSB7DQorCQlhZGRyID0gdmlmLT5h ZGRyOw0KKwl9IGVsc2Ugew0KKwkJYWRkciA9IHN0YS0+YWRkcjsNCisJCWlmICh2aWYtPnR5cGUg PT0gTkw4MDIxMV9JRlRZUEVfU1RBVElPTikNCisJCQlldGhlcl9hZGRyX2NvcHkobXdsX3ZpZi0+ YnNzaWQsIGFkZHIpOw0KKwl9DQorDQorCWlmIChjbWRfcGFyYW0gPT0gU0VUX0tFWSkgew0KKwkJ cmMgPSBtd2xfZndjbWRfZW5jcnlwdGlvbl9zZXRfa2V5KGh3LCB2aWYsIGFkZHIsIGtleSk7DQor DQorCQlpZiAocmMpDQorCQkJZ290byBvdXQ7DQorDQorCQlpZiAoKGtleS0+Y2lwaGVyID09IFdM QU5fQ0lQSEVSX1NVSVRFX1dFUDQwKSB8fA0KKwkJICAgIChrZXktPmNpcGhlciA9PSBXTEFOX0NJ UEhFUl9TVUlURV9XRVAxMDQpKSB7DQorCQkJZW5jcl90eXBlID0gRU5DUl9UWVBFX1dFUDsNCisJ CX0gZWxzZSBpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVfQ0NNUCkgew0KKwkJ CWVuY3JfdHlwZSA9IEVOQ1JfVFlQRV9BRVM7DQorCQkJaWYgKChrZXktPmZsYWdzICYgSUVFRTgw MjExX0tFWV9GTEFHX1BBSVJXSVNFKSA9PSAwKSB7DQorCQkJCWlmICh2aWYtPnR5cGUgIT0gTkw4 MDIxMV9JRlRZUEVfU1RBVElPTikNCisJCQkJCW13bF92aWYtPmtleWlkeCA9IGtleS0+a2V5aWR4 Ow0KKwkJCX0NCisJCX0gZWxzZSBpZiAoa2V5LT5jaXBoZXIgPT0gV0xBTl9DSVBIRVJfU1VJVEVf VEtJUCkgew0KKwkJCWVuY3JfdHlwZSA9IEVOQ1JfVFlQRV9US0lQOw0KKwkJfSBlbHNlIHsNCisJ CQllbmNyX3R5cGUgPSBFTkNSX1RZUEVfRElTQUJMRTsNCisJCX0NCisNCisJCXJjID0gbXdsX2Z3 Y21kX3VwZGF0ZV9lbmNyeXB0aW9uX2VuYWJsZShodywgdmlmLCBhZGRyLA0KKwkJCQkJCQllbmNy X3R5cGUpOw0KKwkJaWYgKHJjKQ0KKwkJCWdvdG8gb3V0Ow0KKw0KKwkJbXdsX3ZpZi0+aXNfaHdf Y3J5cHRvX2VuYWJsZWQgPSB0cnVlOw0KKwl9IGVsc2Ugew0KKwkJcmMgPSBtd2xfZndjbWRfZW5j cnlwdGlvbl9yZW1vdmVfa2V5KGh3LCB2aWYsIGFkZHIsIGtleSk7DQorCQlpZiAocmMpDQorCQkJ Z290byBvdXQ7DQorCX0NCisNCitvdXQ6DQorDQorCXJldHVybiByYzsNCit9DQorDQorc3RhdGlj IGludCBtd2xfbWFjODAyMTFfc2V0X3J0c190aHJlc2hvbGQoc3RydWN0IGllZWU4MDIxMV9odyAq aHcsDQorCQkJCQkgIHUzMiB2YWx1ZSkNCit7DQorCXJldHVybiBtd2xfZndjbWRfc2V0X3J0c190 aHJlc2hvbGQoaHcsIHZhbHVlKTsNCit9DQorDQorc3RhdGljIGludCBtd2xfbWFjODAyMTFfc3Rh X2FkZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJc3RydWN0IGllZWU4MDIxMV92aWYg KnZpZiwNCisJCQkJc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSkNCit7DQorCXN0cnVjdCBtd2xf cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3Ry dWN0IG13bF9zdGEgKnN0YV9pbmZvOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2tleV9jb25mICprZXk7 DQorCWludCByYzsNCisJaW50IGk7DQorDQorCW13bF92aWYgPSBtd2xfZGV2X2dldF92aWYodmlm KTsNCisJc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisNCisJbWVtc2V0KHN0YV9p bmZvLCAwLCBzaXplb2YoKnN0YV9pbmZvKSk7DQorCWlmICh2aWYtPnR5cGUgPT0gTkw4MDIxMV9J RlRZUEVfTUVTSF9QT0lOVCkNCisJCXN0YV9pbmZvLT5pc19tZXNoX25vZGUgPSB0cnVlOw0KKwlp ZiAoc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkKSB7DQorCQlzdGFfaW5mby0+aXNfYW1wZHVfYWxs b3dlZCA9IHRydWU7DQorCQlzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCA9IGZhbHNlOw0KKwkJ aWYgKHN0YS0+aHRfY2FwLmNhcCAmIElFRUU4MDIxMV9IVF9DQVBfTUFYX0FNU0RVKQ0KKwkJCXN0 YV9pbmZvLT5hbXNkdV9jdHJsLmNhcCA9IE1XTF9BTVNEVV9TSVpFXzhLOw0KKwkJZWxzZQ0KKwkJ CXN0YV9pbmZvLT5hbXNkdV9jdHJsLmNhcCA9IE1XTF9BTVNEVV9TSVpFXzRLOw0KKwl9DQorCXN0 YV9pbmZvLT5pdjE2ID0gMTsNCisJc3RhX2luZm8tPml2MzIgPSAwOw0KKwlzcGluX2xvY2tfaW5p dCgmc3RhX2luZm8tPmFtc2R1X2xvY2spOw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2Nr KTsNCisJbGlzdF9hZGRfdGFpbCgmc3RhX2luZm8tPmxpc3QsICZwcml2LT5zdGFfbGlzdCk7DQor CXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7DQorDQorCWlmICh2aWYtPnR5cGUgPT0g Tkw4MDIxMV9JRlRZUEVfU1RBVElPTikNCisJCW13bF9md2NtZF9zZXRfbmV3X3N0bl9kZWwoaHcs IHZpZiwgc3RhLT5hZGRyKTsNCisNCisJcmMgPSBtd2xfZndjbWRfc2V0X25ld19zdG5fYWRkKGh3 LCB2aWYsIHN0YSk7DQorDQorCWZvciAoaSA9IDA7IGkgPCBOVU1fV0VQX0tFWVM7IGkrKykgew0K KwkJa2V5ID0gKHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKiltd2xfdmlmLT53ZXBfa2V5X2Nv bmZbaV0ua2V5Ow0KKw0KKwkJaWYgKG13bF92aWYtPndlcF9rZXlfY29uZltpXS5lbmFibGVkKQ0K KwkJCW13bF9tYWM4MDIxMV9zZXRfa2V5KGh3LCBTRVRfS0VZLCB2aWYsIHN0YSwga2V5KTsNCisJ fQ0KKw0KKwlyZXR1cm4gcmM7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX3N0YV9y ZW1vdmUoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFf dmlmICp2aWYsDQorCQkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlzdHJ1 Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJaW50IHJjOw0KKwlzdHJ1Y3QgbXdsX3N0 YSAqc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisNCisJbXdsX3R4X2RlbF9zdGFf YW1zZHVfcGt0cyhzdGEpOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsN CisJbXdsX2Z3Y21kX2RlbF9zdGFfc3RyZWFtcyhodywgc3RhKTsNCisJc3Bpbl91bmxvY2tfYmgo JnByaXYtPnN0cmVhbV9sb2NrKTsNCisNCisJbXdsX3R4X2RlbF9wa3RzX3ZpYV9zdGEoaHcsIHN0 YSk7DQorDQorCXJjID0gbXdsX2Z3Y21kX3NldF9uZXdfc3RuX2RlbChodywgdmlmLCBzdGEtPmFk ZHIpOw0KKw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCisJbGlzdF9kZWwoJnN0 YV9pbmZvLT5saXN0KTsNCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCisNCisJ cmV0dXJuIHJjOw0KK30NCisNCitzdGF0aWMgaW50IG13bF9tYWM4MDIxMV9jb25mX3R4KHN0cnVj dCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCQlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJ CQl1MTYgcXVldWUsDQorCQkJCWNvbnN0IHN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1z ICpwYXJhbXMpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJaW50 IHJjID0gMDsNCisNCisJaWYgKFdBUk5fT04ocXVldWUgPiBTWVNBRFBUX1RYX1dNTV9RVUVVRVMg LSAxKSkNCisJCXJldHVybiAtRUlOVkFMOw0KKw0KKwltZW1jcHkoJnByaXYtPndtbV9wYXJhbXNb cXVldWVdLCBwYXJhbXMsIHNpemVvZigqcGFyYW1zKSk7DQorDQorCWlmICghcHJpdi0+d21tX2Vu YWJsZWQpIHsNCisJCXJjID0gbXdsX2Z3Y21kX3NldF93bW1fbW9kZShodywgdHJ1ZSk7DQorCQlw cml2LT53bW1fZW5hYmxlZCA9IHRydWU7DQorCX0NCisNCisJaWYgKCFyYykgew0KKwkJaW50IHEg PSBTWVNBRFBUX1RYX1dNTV9RVUVVRVMgLSAxIC0gcXVldWU7DQorDQorCQlyYyA9IG13bF9md2Nt ZF9zZXRfZWRjYV9wYXJhbXMoaHcsIHEsDQorCQkJCQkgICAgICAgcGFyYW1zLT5jd19taW4sIHBh cmFtcy0+Y3dfbWF4LA0KKwkJCQkJICAgICAgIHBhcmFtcy0+YWlmcywgcGFyYW1zLT50eG9wKTsN CisJfQ0KKw0KKwlyZXR1cm4gcmM7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX2dl dF9zdGF0cyhzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCQkJICBzdHJ1Y3QgaWVlZTgwMjEx X2xvd19sZXZlbF9zdGF0cyAqc3RhdHMpDQorew0KKwlyZXR1cm4gbXdsX2Z3Y21kX2dldF9zdGF0 KGh3LCBzdGF0cyk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX2dldF9zdXJ2ZXko c3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJCSAgIGludCBpZHgsDQorCQkJCSAgIHN0cnVj dCBzdXJ2ZXlfaW5mbyAqc3VydmV5KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct PnByaXY7DQorCXN0cnVjdCBpZWVlODAyMTFfY29uZiAqY29uZiA9ICZody0+Y29uZjsNCisNCisJ aWYgKGlkeCAhPSAwKQ0KKwkJcmV0dXJuIC1FTk9FTlQ7DQorDQorCXN1cnZleS0+Y2hhbm5lbCA9 IGNvbmYtPmNoYW5kZWYuY2hhbjsNCisJc3VydmV5LT5maWxsZWQgPSBTVVJWRVlfSU5GT19OT0lT RV9EQk07DQorCXN1cnZleS0+bm9pc2UgPSBwcml2LT5ub2lzZTsNCisNCisJcmV0dXJuIDA7DQor fQ0KKw0KK3N0YXRpYyBpbnQgbXdsX21hYzgwMjExX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgw MjExX2h3ICpodywNCisJCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmLA0KKwkJCQkg ICAgIGVudW0gaWVlZTgwMjExX2FtcGR1X21sbWVfYWN0aW9uIGFjdGlvbiwNCisJCQkJICAgICBz dHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLA0KKwkJCQkgICAgIHUxNiB0aWQsIHUxNiAqc3NuLCB1 OCBidWZfc2l6ZSwgYm9vbCBhbXNkdSkNCit7DQorCWludCByYyA9IDA7DQorCXN0cnVjdCBtd2xf cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFt Ow0KKwl1OCAqYWRkciA9IHN0YS0+YWRkciwgaWR4Ow0KKwlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2lu Zm87DQorDQorCXN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7DQorDQorCXNwaW5fbG9j a19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKw0KKwlzdHJlYW0gPSBtd2xfZndjbWRfbG9va3Vw X3N0cmVhbShodywgYWRkciwgdGlkKTsNCisNCisJc3dpdGNoIChhY3Rpb24pIHsNCisJY2FzZSBJ RUVFODAyMTFfQU1QRFVfUlhfU1RBUlQ6DQorCWNhc2UgSUVFRTgwMjExX0FNUERVX1JYX1NUT1A6 DQorCQlicmVhazsNCisJY2FzZSBJRUVFODAyMTFfQU1QRFVfVFhfU1RBUlQ6DQorCQlpZiAoIXN0 YV9pbmZvLT5pc19hbXBkdV9hbGxvd2VkKSB7DQorCQkJd2lwaHlfd2Fybihody0+d2lwaHksICJh bXBkdSBub3QgYWxsb3dlZFxuIik7DQorCQkJcmMgPSAtRVBFUk07DQorCQkJYnJlYWs7DQorCQl9 DQorDQorCQlpZiAoIXN0cmVhbSkgew0KKwkJCXN0cmVhbSA9IG13bF9md2NtZF9hZGRfc3RyZWFt KGh3LCBzdGEsIHRpZCk7DQorCQkJaWYgKCFzdHJlYW0pIHsNCisJCQkJd2lwaHlfd2Fybihody0+ d2lwaHksICJubyBzdHJlYW0gZm91bmRcbiIpOw0KKwkJCQlyYyA9IC1FUEVSTTsNCisJCQkJYnJl YWs7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2Nr KTsNCisJCXJjID0gbXdsX2Z3Y21kX2NoZWNrX2JhKGh3LCBzdHJlYW0sIHZpZik7DQorCQlzcGlu X2xvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCisJCWlmIChyYykgew0KKwkJCW13bF9md2Nt ZF9yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOw0KKwkJCXdpcGh5X2Vycihody0+d2lwaHksDQor CQkJCSAgImFtcGR1IHN0YXJ0IGVycm9yIGNvZGU6ICVkXG4iLCByYyk7DQorCQkJcmMgPSAtRVBF Uk07DQorCQkJYnJlYWs7DQorCQl9DQorCQlzdHJlYW0tPnN0YXRlID0gQU1QRFVfU1RSRUFNX0lO X1BST0dSRVNTOw0KKwkJKnNzbiA9IDA7DQorCQlpZWVlODAyMTFfc3RhcnRfdHhfYmFfY2JfaXJx c2FmZSh2aWYsIGFkZHIsIHRpZCk7DQorCQlicmVhazsNCisJY2FzZSBJRUVFODAyMTFfQU1QRFVf VFhfU1RPUF9DT05UOg0KKwljYXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIOg0KKwlj YXNlIElFRUU4MDIxMV9BTVBEVV9UWF9TVE9QX0ZMVVNIX0NPTlQ6DQorCQlpZiAoc3RyZWFtKSB7 DQorCQkJaWYgKHN0cmVhbS0+c3RhdGUgPT0gQU1QRFVfU1RSRUFNX0FDVElWRSkgew0KKwkJCQlt d2xfdHhfZGVsX2FtcGR1X3BrdHMoaHcsIHN0YSwgdGlkKTsNCisJCQkJaWR4ID0gc3RyZWFtLT5p ZHg7DQorCQkJCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdHJlYW1fbG9jayk7DQorCQkJCW13bF9m d2NtZF9kZXN0cm95X2JhKGh3LCBpZHgpOw0KKwkJCQlzcGluX2xvY2tfYmgoJnByaXYtPnN0cmVh bV9sb2NrKTsNCisJCQl9DQorDQorCQkJbXdsX2Z3Y21kX3JlbW92ZV9zdHJlYW0oaHcsIHN0cmVh bSk7DQorCQkJaWVlZTgwMjExX3N0b3BfdHhfYmFfY2JfaXJxc2FmZSh2aWYsIGFkZHIsIHRpZCk7 DQorCQl9IGVsc2Ugew0KKwkJCXJjID0gLUVQRVJNOw0KKwkJfQ0KKwkJYnJlYWs7DQorCWNhc2Ug SUVFRTgwMjExX0FNUERVX1RYX09QRVJBVElPTkFMOg0KKwkJaWYgKHN0cmVhbSkgew0KKwkJCWlm IChXQVJOX09OKHN0cmVhbS0+c3RhdGUgIT0NCisJCQkJICAgIEFNUERVX1NUUkVBTV9JTl9QUk9H UkVTUykpIHsNCisJCQkJcmMgPSAtRVBFUk07DQorCQkJCWJyZWFrOw0KKwkJCX0NCisJCQlzcGlu X3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKwkJCXJjID0gbXdsX2Z3Y21kX2NyZWF0 ZV9iYShodywgc3RyZWFtLCBidWZfc2l6ZSwgdmlmKTsNCisJCQlzcGluX2xvY2tfYmgoJnByaXYt PnN0cmVhbV9sb2NrKTsNCisNCisJCQlpZiAoIXJjKSB7DQorCQkJCXN0cmVhbS0+c3RhdGUgPSBB TVBEVV9TVFJFQU1fQUNUSVZFOw0KKwkJCX0gZWxzZSB7DQorCQkJCWlkeCA9IHN0cmVhbS0+aWR4 Ow0KKwkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKwkJCQltd2xfZndj bWRfZGVzdHJveV9iYShodywgaWR4KTsNCisJCQkJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdHJlYW1f bG9jayk7DQorCQkJCW13bF9md2NtZF9yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOw0KKwkJCQl3 aXBoeV9lcnIoaHctPndpcGh5LA0KKwkJCQkJICAiYW1wZHUgb3BlcmF0aW9uIGVycm9yIGNvZGU6 ICVkXG4iLA0KKwkJCQkJICByYyk7DQorCQkJfQ0KKwkJfSBlbHNlIHsNCisJCQlyYyA9IC1FUEVS TTsNCisJCX0NCisJCWJyZWFrOw0KKwlkZWZhdWx0Og0KKwkJcmMgPSAtRU5PVFNVUFA7DQorCQli cmVhazsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKw0K KwlyZXR1cm4gcmM7DQorfQ0KKw0KK2NvbnN0IHN0cnVjdCBpZWVlODAyMTFfb3BzIG13bF9tYWM4 MDIxMV9vcHMgPSB7DQorCS50eCAgICAgICAgICAgICAgICAgPSBtd2xfbWFjODAyMTFfdHgsDQor CS5zdGFydCAgICAgICAgICAgICAgPSBtd2xfbWFjODAyMTFfc3RhcnQsDQorCS5zdG9wICAgICAg ICAgICAgICAgPSBtd2xfbWFjODAyMTFfc3RvcCwNCisJLmFkZF9pbnRlcmZhY2UgICAgICA9IG13 bF9tYWM4MDIxMV9hZGRfaW50ZXJmYWNlLA0KKwkucmVtb3ZlX2ludGVyZmFjZSAgID0gbXdsX21h YzgwMjExX3JlbW92ZV9pbnRlcmZhY2UsDQorCS5jb25maWcgICAgICAgICAgICAgPSBtd2xfbWFj ODAyMTFfY29uZmlnLA0KKwkuYnNzX2luZm9fY2hhbmdlZCAgID0gbXdsX21hYzgwMjExX2Jzc19p bmZvX2NoYW5nZWQsDQorCS5jb25maWd1cmVfZmlsdGVyICAgPSBtd2xfbWFjODAyMTFfY29uZmln dXJlX2ZpbHRlciwNCisJLnNldF9rZXkgICAgICAgICAgICA9IG13bF9tYWM4MDIxMV9zZXRfa2V5 LA0KKwkuc2V0X3J0c190aHJlc2hvbGQgID0gbXdsX21hYzgwMjExX3NldF9ydHNfdGhyZXNob2xk LA0KKwkuc3RhX2FkZCAgICAgICAgICAgID0gbXdsX21hYzgwMjExX3N0YV9hZGQsDQorCS5zdGFf cmVtb3ZlICAgICAgICAgPSBtd2xfbWFjODAyMTFfc3RhX3JlbW92ZSwNCisJLmNvbmZfdHggICAg ICAgICAgICA9IG13bF9tYWM4MDIxMV9jb25mX3R4LA0KKwkuZ2V0X3N0YXRzICAgICAgICAgID0g bXdsX21hYzgwMjExX2dldF9zdGF0cywNCisJLmdldF9zdXJ2ZXkgICAgICAgICA9IG13bF9tYWM4 MDIxMV9nZXRfc3VydmV5LA0KKwkuYW1wZHVfYWN0aW9uICAgICAgID0gbXdsX21hYzgwMjExX2Ft cGR1X2FjdGlvbiwNCit9Ow0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZl bGwvbXdsd2lmaS9tYWluLmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv bWFpbi5jDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uZGM3NTlkMw0KLS0t IC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21h aW4uYw0KQEAgLTAsMCArMSw3MzkgQEANCisvKg0KKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDE1 LCBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLg0KKyAqDQorICogVGhpcyBzb2Z0d2FyZSBmaWxl ICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBieSBNYXJ2ZWxsIEludGVybmF0aW9uYWwNCisg KiBMdGQuIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug VmVyc2lvbiAyLCBKdW5lIDE5OTENCisgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwg cmVkaXN0cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcyBGaWxlIGluDQorICogYWNjb3JkYW5jZSB3 aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mIHdo aWNoDQorICogaXMgYXZhaWxhYmxlIGJ5IHdyaXRpbmcgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbiwgSW5jLg0KKyAqDQorICogVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJ VEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJ RVMgT0YgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF DQorICogQVJFIEVYUFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRk aXRpb25hbCBkZXRhaWxzIGFib3V0DQorICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KKyAq Lw0KKw0KKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGltcGxlbWVudHMgbWFpbiBmdW5jdGlv bnMgb2YgdGhpcyBtb2R1bGUuICovDQorDQorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPg0KKyNp ZmRlZiBDT05GSUdfT0YNCisjaW5jbHVkZSA8bGludXgvb2YuaD4NCisjZW5kaWYNCisNCisjaW5j bHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisjaW5jbHVkZSAiZndkbC5oIg0K KyNpbmNsdWRlICJmd2NtZC5oIg0KKyNpbmNsdWRlICJ0eC5oIg0KKyNpbmNsdWRlICJyeC5oIg0K KyNpbmNsdWRlICJpc3IuaCINCisjaWZkZWYgQ09ORklHX1NVUFBPUlRfTUZHDQorI2luY2x1ZGUg Im1mZy5oIg0KKyNlbmRpZg0KKyNpZmRlZiBDT05GSUdfREVCVUdfRlMNCisjaW5jbHVkZSAiZGVi dWdmcy5oIg0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgTVdMX0RFU0MgICAgICAgICAiTWFydmVsbCA4 MDIuMTFhYyBXaXJlbGVzcyBOZXR3b3JrIERyaXZlciINCisjZGVmaW5lIE1XTF9ERVZfTkFNRSAg ICAgIk1hcnZlbGwgODAyLjExYWMgQWRhcHRlciINCisNCisjZGVmaW5lIEZJTEVfUEFUSF9MRU4g ICAgNjQNCisjZGVmaW5lIENNRF9CVUZfU0laRSAgICAgMHg0MDAwDQorDQorc3RhdGljIHN0cnVj dCBwY2lfZGV2aWNlX2lkIG13bF9wY2lfaWRfdGJsW10gPSB7DQorCXsgUENJX1ZERVZJQ0UoTUFS VkVMTCwgMHgyYTU1KSwgLmRyaXZlcl9kYXRhID0gTVdMODg2NCwgfSwNCisJeyBQQ0lfVkRFVklD RShNQVJWRUxMLCAweDJiMzgpLCAuZHJpdmVyX2RhdGEgPSBNV0w4ODk3LCB9LA0KKwl7IH0sDQor fTsNCisNCitzdGF0aWMgc3RydWN0IG13bF9jaGlwX2luZm8gbXdsX2NoaXBfdGJsW10gPSB7DQor CVtNV0w4ODY0XSA9IHsNCisJCS5wYXJ0X25hbWUJPSAiODhXODg2NCIsDQorCQkuZndfaW1hZ2UJ PSAibXdsd2lmaS84OFc4ODY0LmJpbiIsDQorCQkuYW50ZW5uYV90eAk9IEFOVEVOTkFfVFhfNF9B VVRPLA0KKwkJLmFudGVubmFfcngJPSBBTlRFTk5BX1JYXzRfQVVUTywNCisJfSwNCisJW01XTDg4 OTddID0gew0KKwkJLnBhcnRfbmFtZQk9ICI4OFc4ODk3IiwNCisJCS5md19pbWFnZQk9ICJtd2x3 aWZpLzg4Vzg4OTcuYmluIiwNCisJCS5hbnRlbm5hX3R4CT0gQU5URU5OQV9UWF8yLA0KKwkJLmFu dGVubmFfcngJPSBBTlRFTk5BX1JYXzIsDQorCX0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3Ry dWN0IGllZWU4MDIxMV9jaGFubmVsIG13bF9jaGFubmVsc18yNFtdID0gew0KKwl7IC5iYW5kID0g SUVFRTgwMjExX0JBTkRfMkdIWiwgLmNlbnRlcl9mcmVxID0gMjQxMiwgLmh3X3ZhbHVlID0gMSwg fSwNCisJeyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0MTcs IC5od192YWx1ZSA9IDIsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLCAuY2Vu dGVyX2ZyZXEgPSAyNDIyLCAuaHdfdmFsdWUgPSAzLCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjEx X0JBTkRfMkdIWiwgLmNlbnRlcl9mcmVxID0gMjQyNywgLmh3X3ZhbHVlID0gNCwgfSwNCisJeyAu YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0MzIsIC5od192YWx1 ZSA9IDUsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLCAuY2VudGVyX2ZyZXEg PSAyNDM3LCAuaHdfdmFsdWUgPSA2LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdI WiwgLmNlbnRlcl9mcmVxID0gMjQ0MiwgLmh3X3ZhbHVlID0gNywgfSwNCisJeyAuYmFuZCA9IElF RUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0NDcsIC5od192YWx1ZSA9IDgsIH0s DQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8yR0haLCAuY2VudGVyX2ZyZXEgPSAyNDUyLCAu aHdfdmFsdWUgPSA5LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwgLmNlbnRl cl9mcmVxID0gMjQ1NywgLmh3X3ZhbHVlID0gMTAsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFf QkFORF8yR0haLCAuY2VudGVyX2ZyZXEgPSAyNDYyLCAuaHdfdmFsdWUgPSAxMSwgfSwNCisJeyAu YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJHSFosIC5jZW50ZXJfZnJlcSA9IDI0NjcsIC5od192YWx1 ZSA9IDEyLCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfMkdIWiwgLmNlbnRlcl9mcmVx ID0gMjQ3MiwgLmh3X3ZhbHVlID0gMTMsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF8y R0haLCAuY2VudGVyX2ZyZXEgPSAyNDg0LCAuaHdfdmFsdWUgPSAxNCwgfSwNCit9Ow0KKw0KK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjExX3JhdGUgbXdsX3JhdGVzXzI0W10gPSB7DQorCXsg LmJpdHJhdGUgPSAxMCwgLmh3X3ZhbHVlID0gMiwgfSwNCisJeyAuYml0cmF0ZSA9IDIwLCAuaHdf dmFsdWUgPSA0LCB9LA0KKwl7IC5iaXRyYXRlID0gNTUsIC5od192YWx1ZSA9IDExLCB9LA0KKwl7 IC5iaXRyYXRlID0gMTEwLCAuaHdfdmFsdWUgPSAyMiwgfSwNCisJeyAuYml0cmF0ZSA9IDIyMCwg Lmh3X3ZhbHVlID0gNDQsIH0sDQorCXsgLmJpdHJhdGUgPSA2MCwgLmh3X3ZhbHVlID0gMTIsIH0s DQorCXsgLmJpdHJhdGUgPSA5MCwgLmh3X3ZhbHVlID0gMTgsIH0sDQorCXsgLmJpdHJhdGUgPSAx MjAsIC5od192YWx1ZSA9IDI0LCB9LA0KKwl7IC5iaXRyYXRlID0gMTgwLCAuaHdfdmFsdWUgPSAz NiwgfSwNCisJeyAuYml0cmF0ZSA9IDI0MCwgLmh3X3ZhbHVlID0gNDgsIH0sDQorCXsgLmJpdHJh dGUgPSAzNjAsIC5od192YWx1ZSA9IDcyLCB9LA0KKwl7IC5iaXRyYXRlID0gNDgwLCAuaHdfdmFs dWUgPSA5NiwgfSwNCisJeyAuYml0cmF0ZSA9IDU0MCwgLmh3X3ZhbHVlID0gMTA4LCB9LA0KK307 DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBpZWVlODAyMTFfY2hhbm5lbCBtd2xfY2hhbm5lbHNf NTBbXSA9IHsNCisJeyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIC5jZW50ZXJfZnJlcSA9 IDUxODAsIC5od192YWx1ZSA9IDM2LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdI WiwgLmNlbnRlcl9mcmVxID0gNTIwMCwgLmh3X3ZhbHVlID0gNDAsIH0sDQorCXsgLmJhbmQgPSBJ RUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1MjIwLCAuaHdfdmFsdWUgPSA0NCwg fSwNCisJeyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIC5jZW50ZXJfZnJlcSA9IDUyNDAs IC5od192YWx1ZSA9IDQ4LCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWiwgLmNl bnRlcl9mcmVxID0gNTI2MCwgLmh3X3ZhbHVlID0gNTIsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAy MTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1MjgwLCAuaHdfdmFsdWUgPSA1NiwgfSwNCisJ eyAuYmFuZCA9IElFRUU4MDIxMV9CQU5EXzVHSFosIC5jZW50ZXJfZnJlcSA9IDUzMDAsIC5od192 YWx1ZSA9IDYwLCB9LA0KKwl7IC5iYW5kID0gSUVFRTgwMjExX0JBTkRfNUdIWiwgLmNlbnRlcl9m cmVxID0gNTMyMCwgLmh3X3ZhbHVlID0gNjQsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFO RF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NTAwLCAuaHdfdmFsdWUgPSAxMDAsIH0sDQorCXsgLmJh bmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NTIwLCAuaHdfdmFsdWUg PSAxMDQsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEg PSA1NTQwLCAuaHdfdmFsdWUgPSAxMDgsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81 R0haLCAuY2VudGVyX2ZyZXEgPSA1NTYwLCAuaHdfdmFsdWUgPSAxMTIsIH0sDQorCXsgLmJhbmQg PSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NTgwLCAuaHdfdmFsdWUgPSAx MTYsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1 NjAwLCAuaHdfdmFsdWUgPSAxMjAsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0ha LCAuY2VudGVyX2ZyZXEgPSA1NjIwLCAuaHdfdmFsdWUgPSAxMjQsIH0sDQorCXsgLmJhbmQgPSBJ RUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NjQwLCAuaHdfdmFsdWUgPSAxMjgs IH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NjYw LCAuaHdfdmFsdWUgPSAxMzIsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAu Y2VudGVyX2ZyZXEgPSA1NjgwLCAuaHdfdmFsdWUgPSAxMzYsIH0sDQorCXsgLmJhbmQgPSBJRUVF ODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NzAwLCAuaHdfdmFsdWUgPSAxNDAsIH0s DQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NzIwLCAu aHdfdmFsdWUgPSAxNDQsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2Vu dGVyX2ZyZXEgPSA1NzQ1LCAuaHdfdmFsdWUgPSAxNDksIH0sDQorCXsgLmJhbmQgPSBJRUVFODAy MTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1NzY1LCAuaHdfdmFsdWUgPSAxNTMsIH0sDQor CXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVyX2ZyZXEgPSA1Nzg1LCAuaHdf dmFsdWUgPSAxNTcsIH0sDQorCXsgLmJhbmQgPSBJRUVFODAyMTFfQkFORF81R0haLCAuY2VudGVy X2ZyZXEgPSA1ODA1LCAuaHdfdmFsdWUgPSAxNjEsIH0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qg c3RydWN0IGllZWU4MDIxMV9yYXRlIG13bF9yYXRlc181MFtdID0gew0KKwl7IC5iaXRyYXRlID0g NjAsIC5od192YWx1ZSA9IDEyLCB9LA0KKwl7IC5iaXRyYXRlID0gOTAsIC5od192YWx1ZSA9IDE4 LCB9LA0KKwl7IC5iaXRyYXRlID0gMTIwLCAuaHdfdmFsdWUgPSAyNCwgfSwNCisJeyAuYml0cmF0 ZSA9IDE4MCwgLmh3X3ZhbHVlID0gMzYsIH0sDQorCXsgLmJpdHJhdGUgPSAyNDAsIC5od192YWx1 ZSA9IDQ4LCB9LA0KKwl7IC5iaXRyYXRlID0gMzYwLCAuaHdfdmFsdWUgPSA3MiwgfSwNCisJeyAu Yml0cmF0ZSA9IDQ4MCwgLmh3X3ZhbHVlID0gOTYsIH0sDQorCXsgLmJpdHJhdGUgPSA1NDAsIC5o d192YWx1ZSA9IDEwOCwgfSwNCit9Ow0KKw0KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaWVlZTgwMjEx X2lmYWNlX2xpbWl0IGFwX2lmX2xpbWl0c1tdID0gew0KKwl7IC5tYXggPSBTWVNBRFBUX05VTV9P Rl9BUCwJLnR5cGVzID0gQklUKE5MODAyMTFfSUZUWVBFX0FQKSB9LA0KKyNpZmRlZiBDT05GSUdf TUFDODAyMTFfTUVTSA0KKwl7IC5tYXggPSAxLAkudHlwZXMgPSBCSVQoTkw4MDIxMV9JRlRZUEVf TUVTSF9QT0lOVCkgfSwNCisjZW5kaWYNCisJeyAubWF4ID0gMSwJLnR5cGVzID0gQklUKE5MODAy MTFfSUZUWVBFX1NUQVRJT04pIH0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qgc3RydWN0IGllZWU4 MDIxMV9pZmFjZV9jb21iaW5hdGlvbiBhcF9pZl9jb21iID0gew0KKwkubGltaXRzID0gYXBfaWZf bGltaXRzLA0KKwkubl9saW1pdHMgPSBBUlJBWV9TSVpFKGFwX2lmX2xpbWl0cyksDQorCS5tYXhf aW50ZXJmYWNlcyA9IFNZU0FEUFRfTlVNX09GX0FQLA0KKwkubnVtX2RpZmZlcmVudF9jaGFubmVs cyA9IDEsDQorfTsNCisNCitzdGF0aWMgaW50IG13bF9hbGxvY19wY2lfcmVzb3VyY2Uoc3RydWN0 IG13bF9wcml2ICpwcml2KQ0KK3sNCisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBwcml2LT5wZGV2 Ow0KKwl2b2lkIF9faW9tZW0gKmFkZHI7DQorDQorCXByaXYtPm5leHRfYmFyX251bSA9IDE7CS8q IDMyLWJpdCAqLw0KKwlpZiAocGNpX3Jlc291cmNlX2ZsYWdzKHBkZXYsIDApICYgMHgwNCkNCisJ CXByaXYtPm5leHRfYmFyX251bSA9IDI7CS8qIDY0LWJpdCAqLw0KKw0KKwlhZGRyID0gZGV2bV9p b3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsICZwZGV2LT5yZXNvdXJjZVswXSk7DQorCWlmIChJ U19FUlIoYWRkcikpIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksDQorCQkJICAiJXM6 IGNhbm5vdCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uIDBcbiIsDQorCQkJICBNV0xfRFJWX05B TUUpOw0KKwkJZ290byBlcnI7DQorCX0NCisJcHJpdi0+aW9iYXNlMCA9IGFkZHI7DQorCXdpcGh5 X2RlYnVnKHByaXYtPmh3LT53aXBoeSwgInByaXYtPmlvYmFzZTAgPSAlcFxuIiwgcHJpdi0+aW9i YXNlMCk7DQorDQorCWFkZHIgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwNCisJ CQkJICAgICAmcGRldi0+cmVzb3VyY2VbcHJpdi0+bmV4dF9iYXJfbnVtXSk7DQorCWlmIChJU19F UlIoYWRkcikpIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksDQorCQkJICAiJXM6IGNh bm5vdCByZXNlcnZlIFBDSSBtZW1vcnkgcmVnaW9uIDFcbiIsDQorCQkJICBNV0xfRFJWX05BTUUp Ow0KKwkJZ290byBlcnI7DQorCX0NCisJcHJpdi0+aW9iYXNlMSA9IGFkZHI7DQorCXdpcGh5X2Rl YnVnKHByaXYtPmh3LT53aXBoeSwgInByaXYtPmlvYmFzZTEgPSAlcFxuIiwgcHJpdi0+aW9iYXNl MSk7DQorDQorCXByaXYtPnBjbWRfYnVmID0NCisJCSh1bnNpZ25lZCBzaG9ydCAqKWRtYW1fYWxs b2NfY29oZXJlbnQoJnByaXYtPnBkZXYtPmRldiwNCisJCQkJCQkgICAgICBDTURfQlVGX1NJWkUs DQorCQkJCQkJICAgICAgJnByaXYtPnBwaHlzX2NtZF9idWYsDQorCQkJCQkJICAgICAgR0ZQX0tF Uk5FTCk7DQorCWlmICghcHJpdi0+cGNtZF9idWYpIHsNCisJCXdpcGh5X2Vycihwcml2LT5ody0+ d2lwaHksDQorCQkJICAiJXM6IGNhbm5vdCBhbGxvYyBtZW1vcnkgZm9yIGNvbW1hbmQgYnVmZmVy XG4iLA0KKwkJCSAgTVdMX0RSVl9OQU1FKTsNCisJCWdvdG8gZXJyOw0KKwl9DQorCXdpcGh5X2Rl YnVnKHByaXYtPmh3LT53aXBoeSwNCisJCSAgICAicHJpdi0+cGNtZF9idWYgPSAlcCAgcHJpdi0+ cHBoeXNfY21kX2J1ZiA9ICVwXG4iLA0KKwkJICAgIHByaXYtPnBjbWRfYnVmLA0KKwkJICAgICh2 b2lkICopcHJpdi0+cHBoeXNfY21kX2J1Zik7DQorCW1lbXNldChwcml2LT5wY21kX2J1ZiwgMHgw MCwgQ01EX0JVRl9TSVpFKTsNCisNCisJcmV0dXJuIDA7DQorDQorZXJyOg0KKwl3aXBoeV9lcnIo cHJpdi0+aHctPndpcGh5LCAicGNpIGFsbG9jIGZhaWxcbiIpOw0KKw0KKwlyZXR1cm4gLUVJTzsN Cit9DQorDQorc3RhdGljIGludCBtd2xfaW5pdF9maXJtd2FyZShzdHJ1Y3QgbXdsX3ByaXYgKnBy aXYsIGNvbnN0IGNoYXIgKmZ3X25hbWUpDQorew0KKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsNCisJ aW50IHJjID0gMDsNCisNCisJcGRldiA9IHByaXYtPnBkZXY7DQorDQorI2lmZGVmIENPTkZJR19T VVBQT1JUX01GRw0KKwlpZiAocHJpdi0+bWZnX21vZGUpDQorCQlyYyA9IG13bF9tZmdfcmVxdWVz dF9maXJtd2FyZShwcml2KTsNCisJZWxzZQ0KKyNlbmRpZg0KKwkJcmMgPSByZXF1ZXN0X2Zpcm13 YXJlKChjb25zdCBzdHJ1Y3QgZmlybXdhcmUgKiopJnByaXYtPmZ3X3Vjb2RlLA0KKwkJCQkgICAg ICBmd19uYW1lLCAmcHJpdi0+cGRldi0+ZGV2KTsNCisNCisJaWYgKHJjKSB7DQorCQlpZiAocHJp di0+bWZnX21vZGUpDQorCQkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImNhbm5vdCBmaW5k IGZpcm13YXJlXG4iKTsNCisJCWVsc2UNCisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LA0K KwkJCQkgICIlczogY2Fubm90IGZpbmQgZmlybXdhcmUgaW1hZ2UgPCVzPlxuIiwNCisJCQkJICBN V0xfRFJWX05BTUUsIGZ3X25hbWUpOw0KKwkJZ290byBlcnJfbG9hZF9mdzsNCisJfQ0KKw0KKwly YyA9IG13bF9md2RsX2Rvd25sb2FkX2Zpcm13YXJlKHByaXYtPmh3KTsNCisJaWYgKHJjKSB7DQor CQlpZiAocHJpdi0+bWZnX21vZGUpDQorCQkJd2lwaHlfZXJyKHByaXYtPmh3LT53aXBoeSwgImRv d25sb2FkIGZpcm13YXJlIGZhaWxcbiIpOw0KKwkJZWxzZQ0KKwkJCXdpcGh5X2Vycihwcml2LT5o dy0+d2lwaHksDQorCQkJCSAgIiVzOiBjYW5ub3QgZG93bmxvYWQgZmlybXdhcmUgaW1hZ2UgPCVz PlxuIiwNCisJCQkJICBNV0xfRFJWX05BTUUsIGZ3X25hbWUpOw0KKwkJZ290byBlcnJfZG93bmxv YWRfZnc7DQorCX0NCisNCisJcmV0dXJuIHJjOw0KKw0KK2Vycl9kb3dubG9hZF9mdzoNCisNCisj aWZkZWYgQ09ORklHX1NVUFBPUlRfTUZHDQorCWlmIChwcml2LT5tZmdfbW9kZSkNCisJCW13bF9t ZmdfcmVsZWFzZV9maXJtd2FyZShwcml2KTsNCisJZWxzZQ0KKyNlbmRpZg0KKwkJcmVsZWFzZV9m aXJtd2FyZShwcml2LT5md191Y29kZSk7DQorDQorZXJyX2xvYWRfZnc6DQorDQorCXdpcGh5X2Vy cihwcml2LT5ody0+d2lwaHksICJmaXJtd2FyZSBpbml0IGZhaWxcbiIpOw0KKw0KKwlyZXR1cm4g cmM7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9wcm9jZXNzX29mX2R0cyhzdHJ1Y3QgbXdsX3By aXYgKnByaXYpDQorew0KKyNpZmRlZiBDT05GSUdfT0YNCisJc3RydWN0IHByb3BlcnR5ICpwcm9w Ow0KKwl1MzIgcHJvcF92YWx1ZTsNCisNCisJcHJpdi0+ZHRfbm9kZSA9DQorCQlvZl9maW5kX25v ZGVfYnlfbmFtZShwY2lfYnVzX3RvX09GX25vZGUocHJpdi0+cGRldi0+YnVzKSwNCisJCQkJICAg ICAibXdsd2lmaSIpOw0KKwlpZiAoIXByaXYtPmR0X25vZGUpDQorCQlyZXR1cm47DQorDQorCS8q IGxvb2sgZm9yIGFsbCBtYXRjaGluZyBwcm9wZXJ0eSBuYW1lcyAqLw0KKwlmb3JfZWFjaF9wcm9w ZXJ0eV9vZl9ub2RlKHByaXYtPmR0X25vZGUsIHByb3ApIHsNCisJCWlmIChzdHJjbXAocHJvcC0+ bmFtZSwgIm1hcnZlbGwsMmdoeiIpID09IDApDQorCQkJcHJpdi0+ZGlzYWJsZV8yZyA9IHRydWU7 DQorCQlpZiAoc3RyY21wKHByb3AtPm5hbWUsICJtYXJ2ZWxsLDVnaHoiKSA9PSAwKQ0KKwkJCXBy aXYtPmRpc2FibGVfNWcgPSB0cnVlOw0KKwkJaWYgKHN0cmNtcChwcm9wLT5uYW1lLCAibWFydmVs bCxjaGFpbm1hc2siKSA9PSAwKSB7DQorCQkJcHJvcF92YWx1ZSA9IGJlMzJfdG9fY3B1KCooKF9f YmUzMiAqKXByb3AtPnZhbHVlKSk7DQorCQkJaWYgKHByb3BfdmFsdWUgPT0gMikNCisJCQkJcHJp di0+YW50ZW5uYV90eCA9IEFOVEVOTkFfVFhfMjsNCisNCisJCQlwcm9wX3ZhbHVlID0gYmUzMl90 b19jcHUoKigoX19iZTMyICopDQorCQkJCQkJIChwcm9wLT52YWx1ZSArIDQpKSk7DQorCQkJaWYg KHByb3BfdmFsdWUgPT0gMikNCisJCQkJcHJpdi0+YW50ZW5uYV9yeCA9IEFOVEVOTkFfUlhfMjsN CisJCX0NCisJfQ0KKw0KKwlwcml2LT5wd3Jfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHBy aXYtPmR0X25vZGUsDQorCQkJCQkgICAgICAibWFydmVsbCxwb3dlcnRhYmxlIik7DQorI2VuZGlm DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9zZXRfaHRfY2FwcyhzdHJ1Y3QgbXdsX3ByaXYgKnBy aXYsDQorCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfc3VwcG9ydGVkX2JhbmQgKmJhbmQpDQorew0K KwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsNCisNCisJaHcgPSBwcml2LT5odzsNCisNCisJYmFu ZC0+aHRfY2FwLmh0X3N1cHBvcnRlZCA9IDE7DQorDQorCWJhbmQtPmh0X2NhcC5jYXAgfD0gSUVF RTgwMjExX0hUX0NBUF9MRFBDX0NPRElORzsNCisJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAy MTFfSFRfQ0FQX1NVUF9XSURUSF8yMF80MDsNCisJYmFuZC0+aHRfY2FwLmNhcCB8PSBJRUVFODAy MTFfSFRfQ0FQX1NNX1BTOw0KKwliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBf U0dJXzIwOw0KKwliYW5kLT5odF9jYXAuY2FwIHw9IElFRUU4MDIxMV9IVF9DQVBfU0dJXzQwOw0K Kw0KKwlpZWVlODAyMTFfaHdfc2V0KGh3LCBBTVBEVV9BR0dSRUdBVElPTik7DQorCWJhbmQtPmh0 X2NhcC5hbXBkdV9mYWN0b3IgPSBJRUVFODAyMTFfSFRfTUFYX0FNUERVXzY0SzsNCisJYmFuZC0+ aHRfY2FwLmFtcGR1X2RlbnNpdHkgPSBJRUVFODAyMTFfSFRfTVBEVV9ERU5TSVRZXzQ7DQorDQor CWJhbmQtPmh0X2NhcC5tY3MucnhfbWFza1swXSA9IDB4ZmY7DQorCWJhbmQtPmh0X2NhcC5tY3Mu cnhfbWFza1sxXSA9IDB4ZmY7DQorCWlmIChwcml2LT5hbnRlbm5hX3J4ID09IEFOVEVOTkFfUlhf NF9BVVRPKQ0KKwkJYmFuZC0+aHRfY2FwLm1jcy5yeF9tYXNrWzJdID0gMHhmZjsNCisJYmFuZC0+ aHRfY2FwLm1jcy5yeF9tYXNrWzRdID0gMHgwMTsNCisNCisJYmFuZC0+aHRfY2FwLm1jcy50eF9w YXJhbXMgPSBJRUVFODAyMTFfSFRfTUNTX1RYX0RFRklORUQ7DQorfQ0KKw0KK3N0YXRpYyB2b2lk IG13bF9zZXRfdmh0X2NhcHMoc3RydWN0IG13bF9wcml2ICpwcml2LA0KKwkJCSAgICAgc3RydWN0 IGllZWU4MDIxMV9zdXBwb3J0ZWRfYmFuZCAqYmFuZCkNCit7DQorCWJhbmQtPnZodF9jYXAudmh0 X3N1cHBvcnRlZCA9IDE7DQorDQorCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRf Q0FQX01BWF9NUERVX0xFTkdUSF83OTkxOw0KKwliYW5kLT52aHRfY2FwLmNhcCB8PSBJRUVFODAy MTFfVkhUX0NBUF9SWExEUEM7DQorCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRf Q0FQX1NIT1JUX0dJXzgwOw0KKwliYW5kLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhUX0NB UF9SWFNUQkNfMTsNCisJYmFuZC0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfU1Vf QkVBTUZPUk1FUl9DQVBBQkxFOw0KKwliYW5kLT52aHRfY2FwLmNhcCB8PSBJRUVFODAyMTFfVkhU X0NBUF9TVV9CRUFNRk9STUVFX0NBUEFCTEU7DQorCWJhbmQtPnZodF9jYXAuY2FwIHw9IElFRUU4 MDIxMV9WSFRfQ0FQX01BWF9BX01QRFVfTEVOR1RIX0VYUE9ORU5UX01BU0s7DQorCWJhbmQtPnZo dF9jYXAuY2FwIHw9IElFRUU4MDIxMV9WSFRfQ0FQX1JYX0FOVEVOTkFfUEFUVEVSTjsNCisJYmFu ZC0+dmh0X2NhcC5jYXAgfD0gSUVFRTgwMjExX1ZIVF9DQVBfVFhfQU5URU5OQV9QQVRURVJOOw0K Kw0KKwlpZiAocHJpdi0+YW50ZW5uYV9yeCA9PSBBTlRFTk5BX1JYXzIpDQorCQliYW5kLT52aHRf Y2FwLnZodF9tY3MucnhfbWNzX21hcCA9IGNwdV90b19sZTE2KDB4ZmZmYSk7DQorCWVsc2UNCisJ CWJhbmQtPnZodF9jYXAudmh0X21jcy5yeF9tY3NfbWFwID0gY3B1X3RvX2xlMTYoMHhmZmVhKTsN CisNCisJaWYgKHByaXYtPmFudGVubmFfdHggPT0gQU5URU5OQV9UWF8yKQ0KKwkJYmFuZC0+dmh0 X2NhcC52aHRfbWNzLnR4X21jc19tYXAgPSBjcHVfdG9fbGUxNigweGZmZmEpOw0KKwllbHNlDQor CQliYW5kLT52aHRfY2FwLnZodF9tY3MudHhfbWNzX21hcCA9IGNwdV90b19sZTE2KDB4ZmZlYSk7 DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9zZXRfY2FwcyhzdHJ1Y3QgbXdsX3ByaXYgKnByaXYp DQorew0KKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsNCisNCisJaHcgPSBwcml2LT5odzsNCisN CisJLyogc2V0IHVwIGJhbmQgaW5mb3JtYXRpb24gZm9yIDIuNEcgKi8NCisJaWYgKCFwcml2LT5k aXNhYmxlXzJnKSB7DQorCQlCVUlMRF9CVUdfT04oc2l6ZW9mKHByaXYtPmNoYW5uZWxzXzI0KSAh PQ0KKwkJCSAgICAgc2l6ZW9mKG13bF9jaGFubmVsc18yNCkpOw0KKwkJbWVtY3B5KHByaXYtPmNo YW5uZWxzXzI0LCBtd2xfY2hhbm5lbHNfMjQsDQorCQkgICAgICAgc2l6ZW9mKG13bF9jaGFubmVs c18yNCkpOw0KKw0KKwkJQlVJTERfQlVHX09OKHNpemVvZihwcml2LT5yYXRlc18yNCkgIT0gc2l6 ZW9mKG13bF9yYXRlc18yNCkpOw0KKwkJbWVtY3B5KHByaXYtPnJhdGVzXzI0LCBtd2xfcmF0ZXNf MjQsIHNpemVvZihtd2xfcmF0ZXNfMjQpKTsNCisNCisJCXByaXYtPmJhbmRfMjQuYmFuZCA9IElF RUU4MDIxMV9CQU5EXzJHSFo7DQorCQlwcml2LT5iYW5kXzI0LmNoYW5uZWxzID0gcHJpdi0+Y2hh bm5lbHNfMjQ7DQorCQlwcml2LT5iYW5kXzI0Lm5fY2hhbm5lbHMgPSBBUlJBWV9TSVpFKG13bF9j aGFubmVsc18yNCk7DQorCQlwcml2LT5iYW5kXzI0LmJpdHJhdGVzID0gcHJpdi0+cmF0ZXNfMjQ7 DQorCQlwcml2LT5iYW5kXzI0Lm5fYml0cmF0ZXMgPSBBUlJBWV9TSVpFKG13bF9yYXRlc18yNCk7 DQorDQorCQltd2xfc2V0X2h0X2NhcHMocHJpdiwgJnByaXYtPmJhbmRfMjQpOw0KKwkJbXdsX3Nl dF92aHRfY2Fwcyhwcml2LCAmcHJpdi0+YmFuZF8yNCk7DQorDQorCQlody0+d2lwaHktPmJhbmRz W0lFRUU4MDIxMV9CQU5EXzJHSFpdID0gJnByaXYtPmJhbmRfMjQ7DQorCX0NCisNCisJLyogc2V0 IHVwIGJhbmQgaW5mb3JtYXRpb24gZm9yIDVHICovDQorCWlmICghcHJpdi0+ZGlzYWJsZV81Zykg ew0KKwkJQlVJTERfQlVHX09OKHNpemVvZihwcml2LT5jaGFubmVsc181MCkgIT0NCisJCQkgICAg IHNpemVvZihtd2xfY2hhbm5lbHNfNTApKTsNCisJCW1lbWNweShwcml2LT5jaGFubmVsc181MCwg bXdsX2NoYW5uZWxzXzUwLA0KKwkJICAgICAgIHNpemVvZihtd2xfY2hhbm5lbHNfNTApKTsNCisN CisJCUJVSUxEX0JVR19PTihzaXplb2YocHJpdi0+cmF0ZXNfNTApICE9IHNpemVvZihtd2xfcmF0 ZXNfNTApKTsNCisJCW1lbWNweShwcml2LT5yYXRlc181MCwgbXdsX3JhdGVzXzUwLCBzaXplb2Yo bXdsX3JhdGVzXzUwKSk7DQorDQorCQlwcml2LT5iYW5kXzUwLmJhbmQgPSBJRUVFODAyMTFfQkFO RF81R0haOw0KKwkJcHJpdi0+YmFuZF81MC5jaGFubmVscyA9IHByaXYtPmNoYW5uZWxzXzUwOw0K KwkJcHJpdi0+YmFuZF81MC5uX2NoYW5uZWxzID0gQVJSQVlfU0laRShtd2xfY2hhbm5lbHNfNTAp Ow0KKwkJcHJpdi0+YmFuZF81MC5iaXRyYXRlcyA9IHByaXYtPnJhdGVzXzUwOw0KKwkJcHJpdi0+ YmFuZF81MC5uX2JpdHJhdGVzID0gQVJSQVlfU0laRShtd2xfcmF0ZXNfNTApOw0KKw0KKwkJbXds X3NldF9odF9jYXBzKHByaXYsICZwcml2LT5iYW5kXzUwKTsNCisJCW13bF9zZXRfdmh0X2NhcHMo cHJpdiwgJnByaXYtPmJhbmRfNTApOw0KKw0KKwkJaHctPndpcGh5LT5iYW5kc1tJRUVFODAyMTFf QkFORF81R0haXSA9ICZwcml2LT5iYW5kXzUwOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXds X3dsX2luaXQoc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9o dyAqaHc7DQorCWludCByYzsNCisJaW50IGk7DQorDQorCWh3ID0gcHJpdi0+aHc7DQorDQorCWh3 LT5leHRyYV90eF9oZWFkcm9vbSA9IFNZU0FEUFRfTUlOX0JZVEVTX0hFQURST09NOw0KKwlody0+ cXVldWVzID0gU1lTQURQVF9UWF9XTU1fUVVFVUVTOw0KKw0KKwkvKiBTZXQgcnNzaSB2YWx1ZXMg dG8gZEJtICovDQorCWllZWU4MDIxMV9od19zZXQoaHcsIFNJR05BTF9EQk0pOw0KKwlpZWVlODAy MTFfaHdfc2V0KGh3LCBIQVNfUkFURV9DT05UUk9MKTsNCisNCisJLyogQXNrIG1hYzgwMjExIG5v dCB0byB0cmlnZ2VyIFBTIG1vZGUNCisJICogYmFzZWQgb24gUE0gYml0IG9mIGluY29taW5nIGZy YW1lcy4NCisJICovDQorCWllZWU4MDIxMV9od19zZXQoaHcsIEFQX0xJTktfUFMpOw0KKw0KKwlo dy0+dmlmX2RhdGFfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgbXdsX3ZpZik7DQorCWh3LT5zdGFfZGF0 YV9zaXplID0gc2l6ZW9mKHN0cnVjdCBtd2xfc3RhKTsNCisNCisJcHJpdi0+YXBfbWFjaWRzX3N1 cHBvcnRlZCA9IDB4MDAwMGZmZmY7DQorCXByaXYtPnN0YV9tYWNpZHNfc3VwcG9ydGVkID0gMHgw MDAxMDAwMDsNCisJcHJpdi0+bWFjaWRzX3VzZWQgPSAwOw0KKwlJTklUX0xJU1RfSEVBRCgmcHJp di0+dmlmX2xpc3QpOw0KKwlJTklUX0xJU1RfSEVBRCgmcHJpdi0+c3RhX2xpc3QpOw0KKw0KKwkv KiBTZXQgZGVmYXVsdCByYWRpbyBzdGF0ZSwgcHJlYW1ibGUgYW5kIHdtbSAqLw0KKwlwcml2LT5y YWRpb19vbiA9IGZhbHNlOw0KKwlwcml2LT5yYWRpb19zaG9ydF9wcmVhbWJsZSA9IGZhbHNlOw0K Kwlwcml2LT53bW1fZW5hYmxlZCA9IGZhbHNlOw0KKw0KKwlwcml2LT5wb3dpbml0ZWQgPSAwOw0K Kw0KKwkvKiBIYW5kbGUgd2F0Y2hkb2cgYmEgZXZlbnRzICovDQorCUlOSVRfV09SSygmcHJpdi0+ d2F0Y2hkb2dfYmFfaGFuZGxlLCBtd2xfd2F0Y2hkb2dfYmFfZXZlbnRzKTsNCisNCisJdGFza2xl dF9pbml0KCZwcml2LT50eF90YXNrLCAodm9pZCAqKW13bF90eF9kb25lLCAodW5zaWduZWQgbG9u Zylodyk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+dHhfdGFzayk7DQorCXRhc2tsZXRfaW5p dCgmcHJpdi0+cnhfdGFzaywgKHZvaWQgKiltd2xfcnhfcmVjdiwgKHVuc2lnbmVkIGxvbmcpaHcp Ow0KKwl0YXNrbGV0X2Rpc2FibGUoJnByaXYtPnJ4X3Rhc2spOw0KKwl0YXNrbGV0X2luaXQoJnBy aXYtPnFlX3Rhc2ssDQorCQkgICAgICh2b2lkICopbXdsX3R4X2ZsdXNoX2Ftc2R1LCAodW5zaWdu ZWQgbG9uZylodyk7DQorCXRhc2tsZXRfZGlzYWJsZSgmcHJpdi0+cWVfdGFzayk7DQorCXByaXYt PnR4cV9saW1pdCA9IFNZU0FEUFRfVFhfUVVFVUVfTElNSVQ7DQorCXByaXYtPmlzX3R4X3NjaGVk dWxlID0gZmFsc2U7DQorCXByaXYtPnJlY3ZfbGltaXQgPSBTWVNBRFBUX1JFQ0VJVkVfTElNSVQ7 DQorCXByaXYtPmlzX3J4X3NjaGVkdWxlID0gZmFsc2U7DQorCXByaXYtPmlzX3FlX3NjaGVkdWxl ID0gZmFsc2U7DQorDQorCXNwaW5fbG9ja19pbml0KCZwcml2LT50eF9kZXNjX2xvY2spOw0KKwlz cGluX2xvY2tfaW5pdCgmcHJpdi0+cnhfZGVzY19sb2NrKTsNCisJc3Bpbl9sb2NrX2luaXQoJnBy aXYtPmZ3Y21kX2xvY2spOw0KKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+dmlmX2xvY2spOw0KKwlz cGluX2xvY2tfaW5pdCgmcHJpdi0+c3RhX2xvY2spOw0KKwlzcGluX2xvY2tfaW5pdCgmcHJpdi0+ c3RyZWFtX2xvY2spOw0KKw0KKwlyYyA9IG13bF90eF9pbml0KGh3KTsNCisJaWYgKHJjKSB7DQor CQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGZhaWwgdG8gaW5pdGlhbGl6ZSBUWFxuIiwNCisJ CQkgIE1XTF9EUlZfTkFNRSk7DQorCQlnb3RvIGVycl9td2xfdHhfaW5pdDsNCisJfQ0KKw0KKwly YyA9IG13bF9yeF9pbml0KGh3KTsNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5 LCAiJXM6IGZhaWwgdG8gaW5pdGlhbGl6ZSBSWFxuIiwNCisJCQkgIE1XTF9EUlZfTkFNRSk7DQor CQlnb3RvIGVycl9td2xfcnhfaW5pdDsNCisJfQ0KKw0KKwlyYyA9IG13bF9md2NtZF9nZXRfaHdf c3BlY3MoaHcpOw0KKwlpZiAocmMpIHsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICIlczogZmFp bCB0byBnZXQgSFcgc3BlY2lmaWNhdGlvbnNcbiIsDQorCQkJICBNV0xfRFJWX05BTUUpOw0KKwkJ Z290byBlcnJfZ2V0X2h3X3NwZWNzOw0KKwl9DQorDQorCVNFVF9JRUVFODAyMTFfUEVSTV9BRERS KGh3LCBwcml2LT5od19kYXRhLm1hY19hZGRyKTsNCisNCisJd3JpdGVsKHByaXYtPmRlc2NfZGF0 YVswXS5wcGh5c190eF9yaW5nLA0KKwkgICAgICAgcHJpdi0+aW9iYXNlMCArIHByaXYtPmRlc2Nf ZGF0YVswXS53Y2JfYmFzZSk7DQorCWZvciAoaSA9IDE7IGkgPCBTWVNBRFBUX1RPVEFMX1RYX1FV RVVFUzsgaSsrKQ0KKwkJd3JpdGVsKHByaXYtPmRlc2NfZGF0YVtpXS5wcGh5c190eF9yaW5nLA0K KwkJICAgICAgIHByaXYtPmlvYmFzZTAgKyBwcml2LT5kZXNjX2RhdGFbaV0ud2NiX2Jhc2UpOw0K Kwl3cml0ZWwocHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3J4X3JpbmcsDQorCSAgICAgICBwcml2 LT5pb2Jhc2UwICsgcHJpdi0+ZGVzY19kYXRhWzBdLnJ4X2Rlc2NfcmVhZCk7DQorCXdyaXRlbChw cml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfcnhfcmluZywNCisJICAgICAgIHByaXYtPmlvYmFzZTAg KyBwcml2LT5kZXNjX2RhdGFbMF0ucnhfZGVzY193cml0ZSk7DQorDQorCXJjID0gbXdsX2Z3Y21k X3NldF9od19zcGVjcyhodyk7DQorCWlmIChyYykgew0KKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwg IiVzOiBmYWlsIHRvIHNldCBIVyBzcGVjaWZpY2F0aW9uc1xuIiwNCisJCQkgIE1XTF9EUlZfTkFN RSk7DQorCQlnb3RvIGVycl9zZXRfaHdfc3BlY3M7DQorCX0NCisNCisJd2lwaHlfaW5mbyhody0+ d2lwaHksDQorCQkgICAiZmlybXdhcmUgdmVyc2lvbjogMHgleFxuIiwgcHJpdi0+aHdfZGF0YS5m d19yZWxlYXNlX251bSk7DQorDQorCW13bF9md2NtZF9yYWRpb19kaXNhYmxlKGh3KTsNCisNCisJ bXdsX2Z3Y21kX3JmX2FudGVubmEoaHcsIFdMX0FOVEVOTkFUWVBFX1RYLCBwcml2LT5hbnRlbm5h X3R4KTsNCisNCisJbXdsX2Z3Y21kX3JmX2FudGVubmEoaHcsIFdMX0FOVEVOTkFUWVBFX1JYLCBw cml2LT5hbnRlbm5hX3J4KTsNCisNCisJaHctPndpcGh5LT5pbnRlcmZhY2VfbW9kZXMgPSAwOw0K Kwlody0+d2lwaHktPmludGVyZmFjZV9tb2RlcyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfQVApOw0K KyNpZmRlZiBDT05GSUdfTUFDODAyMTFfTUVTSA0KKwlody0+d2lwaHktPmludGVyZmFjZV9tb2Rl cyB8PSBCSVQoTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVCk7DQorI2VuZGlmDQorCWh3LT53aXBo eS0+aW50ZXJmYWNlX21vZGVzIHw9IEJJVChOTDgwMjExX0lGVFlQRV9TVEFUSU9OKTsNCisJaHct PndpcGh5LT5pZmFjZV9jb21iaW5hdGlvbnMgPSAmYXBfaWZfY29tYjsNCisJaHctPndpcGh5LT5u X2lmYWNlX2NvbWJpbmF0aW9ucyA9IDE7DQorDQorCW13bF9zZXRfY2Fwcyhwcml2KTsNCisNCisJ cmMgPSBpZWVlODAyMTFfcmVnaXN0ZXJfaHcoaHcpOw0KKwlpZiAocmMpIHsNCisJCXdpcGh5X2Vy cihody0+d2lwaHksICIlczogZmFpbCB0byByZWdpc3RlciBkZXZpY2VcbiIsDQorCQkJICBNV0xf RFJWX05BTUUpOw0KKwkJZ290byBlcnJfcmVnaXN0ZXJfaHc7DQorCX0NCisNCisJcmMgPSByZXF1 ZXN0X2lycShwcml2LT5wZGV2LT5pcnEsIG13bF9pc3IsDQorCQkJIElSUUZfU0hBUkVELCBNV0xf RFJWX05BTUUsIGh3KTsNCisJaWYgKHJjKSB7DQorCQlwcml2LT5pcnEgPSAtMTsNCisJCXdpcGh5 X2Vycihody0+d2lwaHksICJmYWlsIHRvIHJlZ2lzdGVyIElSUSBoYW5kbGVyXG4iKTsNCisJCWdv dG8gZXJyX3JlZ2lzdGVyX2lycTsNCisJfQ0KKwlwcml2LT5pcnEgPSBwcml2LT5wZGV2LT5pcnE7 DQorDQorCXJldHVybiByYzsNCisNCitlcnJfcmVnaXN0ZXJfaXJxOg0KK2Vycl9yZWdpc3Rlcl9o dzoNCitlcnJfc2V0X2h3X3NwZWNzOg0KK2Vycl9nZXRfaHdfc3BlY3M6DQorDQorCW13bF9yeF9k ZWluaXQoaHcpOw0KKw0KK2Vycl9td2xfcnhfaW5pdDoNCisNCisJbXdsX3R4X2RlaW5pdChodyk7 DQorDQorZXJyX213bF90eF9pbml0Og0KKw0KKwl3aXBoeV9lcnIoaHctPndpcGh5LCAiaW5pdCBm YWlsXG4iKTsNCisNCisJcmV0dXJuIHJjOw0KK30NCisNCitzdGF0aWMgdm9pZCBtd2xfd2xfZGVp bml0KHN0cnVjdCBtd2xfcHJpdiAqcHJpdikNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 Ow0KKw0KKwlodyA9IHByaXYtPmh3Ow0KKw0KKwlpZiAocHJpdi0+aXJxICE9IC0xKSB7DQorCQlm cmVlX2lycShwcml2LT5wZGV2LT5pcnEsIGh3KTsNCisJCXByaXYtPmlycSA9IC0xOw0KKwl9DQor DQorCWllZWU4MDIxMV91bnJlZ2lzdGVyX2h3KGh3KTsNCisJbXdsX3J4X2RlaW5pdChodyk7DQor CW13bF90eF9kZWluaXQoaHcpOw0KKwl0YXNrbGV0X2tpbGwoJnByaXYtPnFlX3Rhc2spOw0KKwl0 YXNrbGV0X2tpbGwoJnByaXYtPnJ4X3Rhc2spOw0KKwl0YXNrbGV0X2tpbGwoJnByaXYtPnR4X3Rh c2spOw0KKwljYW5jZWxfd29ya19zeW5jKCZwcml2LT53YXRjaGRvZ19iYV9oYW5kbGUpOw0KKwlt d2xfZndjbWRfcmVzZXQoaHcpOw0KK30NCisNCitzdGF0aWMgaW50IG13bF9wcm9iZShzdHJ1Y3Qg cGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkKQ0KK3sNCisJc3Rh dGljIGJvb2wgcHJpbnRlZF92ZXJzaW9uOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodzsNCisJ c3RydWN0IG13bF9wcml2ICpwcml2Ow0KKwljb25zdCBjaGFyICpmd19uYW1lOw0KKwlpbnQgcmMg PSAwOw0KKw0KKwlpZiAoaWQtPmRyaXZlcl9kYXRhID49IE1XTFVOS05PV04pDQorCQlyZXR1cm4g LUVOT0RFVjsNCisNCisJaWYgKCFwcmludGVkX3ZlcnNpb24pIHsNCisJCXByX2luZm8oIjw8JXMg dmVyc2lvbiAlcz4+IiwNCisJCQlNV0xfREVTQywgTVdMX0RSVl9WRVJTSU9OKTsNCisJCXByaW50 ZWRfdmVyc2lvbiA9IHRydWU7DQorCX0NCisNCisJcmMgPSBwY2lfZW5hYmxlX2RldmljZShwZGV2 KTsNCisJaWYgKHJjKSB7DQorCQlwcl9lcnIoIiVzOiBjYW5ub3QgZW5hYmxlIG5ldyBQQ0kgZGV2 aWNlIiwNCisJCSAgICAgICBNV0xfRFJWX05BTUUpOw0KKwkJcmV0dXJuIHJjOw0KKwl9DQorDQor CXJjID0gcGNpX3NldF9kbWFfbWFzayhwZGV2LCBETUFfQklUX01BU0soMzIpKTsNCisJaWYgKHJj KSB7DQorCQlwcl9lcnIoIiVzOiAzMi1iaXQgUENJIERNQSBub3Qgc3VwcG9ydGVkIiwNCisJCSAg ICAgICBNV0xfRFJWX05BTUUpOw0KKwkJZ290byBlcnJfcGNpX2Rpc2FibGVfZGV2aWNlOw0KKwl9 DQorDQorCXBjaV9zZXRfbWFzdGVyKHBkZXYpOw0KKw0KKwlodyA9IGllZWU4MDIxMV9hbGxvY19o dyhzaXplb2YoKnByaXYpLCAmbXdsX21hYzgwMjExX29wcyk7DQorCWlmICghaHcpIHsNCisJCXBy X2VycigiJXM6IGllZWU4MDIxMSBhbGxvYyBmYWlsZWQiLA0KKwkJICAgICAgIE1XTF9EUlZfTkFN RSk7DQorCQlyYyA9IC1FTk9NRU07DQorCQlnb3RvIGVycl9wY2lfZGlzYWJsZV9kZXZpY2U7DQor CX0NCisNCisJU0VUX0lFRUU4MDIxMV9ERVYoaHcsICZwZGV2LT5kZXYpOw0KKwlwY2lfc2V0X2Ry dmRhdGEocGRldiwgaHcpOw0KKw0KKwlwcml2ID0gaHctPnByaXY7DQorCXByaXYtPmh3ID0gaHc7 DQorCXByaXYtPnBkZXYgPSBwZGV2Ow0KKwlwcml2LT5jaGlwX3R5cGUgPSBpZC0+ZHJpdmVyX2Rh dGE7DQorCXByaXYtPmRpc2FibGVfMmcgPSBmYWxzZTsNCisJcHJpdi0+ZGlzYWJsZV81ZyA9IGZh bHNlOw0KKwlwcml2LT5hbnRlbm5hX3R4ID0gbXdsX2NoaXBfdGJsW3ByaXYtPmNoaXBfdHlwZV0u YW50ZW5uYV90eDsNCisJcHJpdi0+YW50ZW5uYV9yeCA9IG13bF9jaGlwX3RibFtwcml2LT5jaGlw X3R5cGVdLmFudGVubmFfcng7DQorDQorCXJjID0gbXdsX2FsbG9jX3BjaV9yZXNvdXJjZShwcml2 KTsNCisJaWYgKHJjKQ0KKwkJZ290byBlcnJfYWxsb2NfcGNpX3Jlc291cmNlOw0KKw0KKwlmd19u YW1lID0gbXdsX2NoaXBfdGJsW3ByaXYtPmNoaXBfdHlwZV0uZndfaW1hZ2U7DQorDQorI2lmZGVm IENPTkZJR19TVVBQT1JUX01GRw0KKwlpZiAobWZnX21vZGUpDQorCQltd2xfbWZnX2hhbmRsZXJf aW5pdChwcml2KTsNCisjZW5kaWYNCisNCisJcmMgPSBtd2xfaW5pdF9maXJtd2FyZShwcml2LCBm d19uYW1lKTsNCisNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGZh aWwgdG8gaW5pdGlhbGl6ZSBmaXJtd2FyZVxuIiwNCisJCQkgIE1XTF9EUlZfTkFNRSk7DQorCQln b3RvIGVycl9pbml0X2Zpcm13YXJlOw0KKwl9DQorDQorCS8qIGZpcm13YXJlIGlzIGxvYWRlZCB0 byBIL1csIGl0IGNhbiBiZSByZWxlYXNlZCBub3cgKi8NCisjaWZkZWYgQ09ORklHX1NVUFBPUlRf TUZHDQorCWlmIChwcml2LT5tZmdfbW9kZSkNCisJCW13bF9tZmdfcmVsZWFzZV9maXJtd2FyZShw cml2KTsNCisJZWxzZQ0KKyNlbmRpZg0KKwkJcmVsZWFzZV9maXJtd2FyZShwcml2LT5md191Y29k ZSk7DQorDQorCW13bF9wcm9jZXNzX29mX2R0cyhwcml2KTsNCisNCisJcmMgPSBtd2xfd2xfaW5p dChwcml2KTsNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiJXM6IGZhaWwg dG8gaW5pdGlhbGl6ZSB3aXJlbGVzcyBsYW5cbiIsDQorCQkJICBNV0xfRFJWX05BTUUpOw0KKwkJ Z290byBlcnJfd2xfaW5pdDsNCisJfQ0KKw0KKwl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwN CisJCSAgICIyRzogJXNcbiIsIHByaXYtPmRpc2FibGVfMmcgPyAiZGlzYWJsZSIgOiAiZW5hYmxl Iik7DQorCXdpcGh5X2luZm8ocHJpdi0+aHctPndpcGh5LA0KKwkJICAgIjVHOiAlc1xuIiwgcHJp di0+ZGlzYWJsZV81ZyA/ICJkaXNhYmxlIiA6ICJlbmFibGUiKTsNCisNCisJaWYgKHByaXYtPmFu dGVubmFfdHggPT0gQU5URU5OQV9UWF80X0FVVE8pDQorCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53 aXBoeSwgIlRYOiA0IGFudGVubmFzXG4iKTsNCisJZWxzZSBpZiAocHJpdi0+YW50ZW5uYV90eCA9 PSBBTlRFTk5BX1RYXzIpDQorCQl3aXBoeV9pbmZvKHByaXYtPmh3LT53aXBoeSwgIlRYOiAyIGFu dGVubmFzXG4iKTsNCisJZWxzZQ0KKwkJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJUWDog dW5rbm93blxuIik7DQorCWlmIChwcml2LT5hbnRlbm5hX3J4ID09IEFOVEVOTkFfUlhfNF9BVVRP KQ0KKwkJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJSWDogNCBhbnRlbm5hc1xuIik7DQor CWVsc2UgaWYgKHByaXYtPmFudGVubmFfcnggPT0gQU5URU5OQV9SWF8yKQ0KKwkJd2lwaHlfaW5m byhwcml2LT5ody0+d2lwaHksICJSWDogMiBhbnRlbm5hc1xuIik7DQorCWVsc2UNCisJCXdpcGh5 X2luZm8ocHJpdi0+aHctPndpcGh5LCAiUlg6IHVua25vd25cbiIpOw0KKw0KKyNpZmRlZiBDT05G SUdfREVCVUdfRlMNCisJbXdsX2RlYnVnZnNfaW5pdChodyk7DQorI2VuZGlmDQorDQorCXJldHVy biByYzsNCisNCitlcnJfd2xfaW5pdDoNCitlcnJfaW5pdF9maXJtd2FyZToNCisNCisJbXdsX2Z3 Y21kX3Jlc2V0KGh3KTsNCisNCitlcnJfYWxsb2NfcGNpX3Jlc291cmNlOg0KKw0KKwlwY2lfc2V0 X2RydmRhdGEocGRldiwgTlVMTCk7DQorCWllZWU4MDIxMV9mcmVlX2h3KGh3KTsNCisNCitlcnJf cGNpX2Rpc2FibGVfZGV2aWNlOg0KKw0KKwlwY2lfZGlzYWJsZV9kZXZpY2UocGRldik7DQorDQor CXJldHVybiByYzsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX3JlbW92ZShzdHJ1Y3QgcGNpX2Rl diAqcGRldikNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gcGNpX2dldF9kcnZkYXRh KHBkZXYpOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXY7DQorDQorCWlmICghaHcpDQorCQlyZXR1 cm47DQorDQorCXByaXYgPSBody0+cHJpdjsNCisNCisJbXdsX3dsX2RlaW5pdChwcml2KTsNCisJ cGNpX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOw0KKwlpZWVlODAyMTFfZnJlZV9odyhodyk7DQor CXBjaV9kaXNhYmxlX2RldmljZShwZGV2KTsNCisNCisjaWZkZWYgQ09ORklHX0RFQlVHX0ZTDQor CW13bF9kZWJ1Z2ZzX3JlbW92ZShodyk7DQorI2VuZGlmDQorfQ0KKw0KK3N0YXRpYyBzdHJ1Y3Qg cGNpX2RyaXZlciBtd2xfcGNpX2RyaXZlciA9IHsNCisJLm5hbWUgICAgID0gTVdMX0RSVl9OQU1F LA0KKwkuaWRfdGFibGUgPSBtd2xfcGNpX2lkX3RibCwNCisJLnByb2JlICAgID0gbXdsX3Byb2Jl LA0KKwkucmVtb3ZlICAgPSBtd2xfcmVtb3ZlDQorfTsNCisNCittb2R1bGVfcGNpX2RyaXZlciht d2xfcGNpX2RyaXZlcik7DQorDQorTU9EVUxFX0RFU0NSSVBUSU9OKE1XTF9ERVNDKTsNCitNT0RV TEVfVkVSU0lPTihNV0xfRFJWX1ZFUlNJT04pOw0KK01PRFVMRV9BVVRIT1IoIk1hcnZlbGwgU2Vt aWNvbmR1Y3RvciwgSW5jLiIpOw0KK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsNCitNT0RVTEVf U1VQUE9SVEVEX0RFVklDRShNV0xfREVWX05BTUUpOw0KK01PRFVMRV9ERVZJQ0VfVEFCTEUocGNp LCBtd2xfcGNpX2lkX3RibCk7DQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFy dmVsbC9td2x3aWZpL3J4LmMgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv cnguYw0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAwMDAuLjQzMDgxMDcNCi0tLSAv ZGV2L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9yeC5j DQpAQCAtMCwwICsxLDYyNCBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1h cnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRo ZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbA0KKyAqIEx0 ZC4gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJz aW9uIDIsIEp1bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCByZWRp c3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRhbmNlIHdpdGgg dGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2gN CisgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uLCBJbmMuDQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9V VCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisg KiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlv bmFsIGRldGFpbHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuDQorICovDQor DQorLyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgaW1wbGVtZW50cyByZWNlaXZlIHJlbGF0ZWQg ZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPg0KKyNpbmNs dWRlIDxsaW51eC9za2J1ZmYuaD4NCisNCisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRl ICJkZXYuaCINCisjaW5jbHVkZSAicnguaCINCisNCisjZGVmaW5lIE1BWF9OVU1fUlhfUklOR19C WVRFUyAgKFNZU0FEUFRfTUFYX05VTV9SWF9ERVNDICogXA0KKwkJCQlzaXplb2Yoc3RydWN0IG13 bF9yeF9kZXNjKSkNCisNCisjZGVmaW5lIE1BWF9OVU1fUlhfSE5ETF9CWVRFUyAgKFNZU0FEUFRf TUFYX05VTV9SWF9ERVNDICogXA0KKwkJCQlzaXplb2Yoc3RydWN0IG13bF9yeF9obmRsKSkNCisN CisjZGVmaW5lIERFQ1JZUFRfRVJSX01BU0sgICAgICAgIDB4ODANCisjZGVmaW5lIEdFTkVSQUxf REVDUllQVF9FUlIgICAgIDB4RkYNCisjZGVmaW5lIFRLSVBfREVDUllQVF9NSUNfRVJSICAgIDB4 MDINCisjZGVmaW5lIFdFUF9ERUNSWVBUX0lDVl9FUlIgICAgIDB4MDQNCisjZGVmaW5lIFRLSVBf REVDUllQVF9JQ1ZfRVJSICAgIDB4MDgNCisNCisjZGVmaW5lIFc4MzZYX1JTU0lfT0ZGU0VUICAg ICAgIDgNCisNCisvKiBSZWNlaXZlIHJhdGUgaW5mb3JtYXRpb24gY29uc3RhbnRzICovDQorI2Rl ZmluZSBSWF9SQVRFX0lORk9fRk9STUFUXzExQSAgICAgICAwDQorI2RlZmluZSBSWF9SQVRFX0lO Rk9fRk9STUFUXzExQiAgICAgICAxDQorI2RlZmluZSBSWF9SQVRFX0lORk9fRk9STUFUXzExTiAg ICAgICAyDQorI2RlZmluZSBSWF9SQVRFX0lORk9fRk9STUFUXzExQUMgICAgICA0DQorDQorI2Rl ZmluZSBSWF9SQVRFX0lORk9fSFQyMCAgICAgICAgICAgICAwDQorI2RlZmluZSBSWF9SQVRFX0lO Rk9fSFQ0MCAgICAgICAgICAgICAxDQorI2RlZmluZSBSWF9SQVRFX0lORk9fSFQ4MCAgICAgICAg ICAgICAyDQorDQorI2RlZmluZSBSWF9SQVRFX0lORk9fTE9OR19JTlRFUlZBTCAgICAwDQorI2Rl ZmluZSBSWF9SQVRFX0lORk9fU0hPUlRfSU5URVJWQUwgICAxDQorDQorc3RhdGljIGludCBtd2xf cnhfcmluZ19hbGxvYyhzdHJ1Y3QgbXdsX3ByaXYgKnByaXYpDQorew0KKwlzdHJ1Y3QgbXdsX2Rl c2NfZGF0YSAqZGVzYzsNCisNCisJZGVzYyA9ICZwcml2LT5kZXNjX2RhdGFbMF07DQorDQorCWRl c2MtPnByeF9yaW5nID0gKHN0cnVjdCBtd2xfcnhfZGVzYyAqKQ0KKwkJZG1hX2FsbG9jX2NvaGVy ZW50KCZwcml2LT5wZGV2LT5kZXYsDQorCQkJCSAgIE1BWF9OVU1fUlhfUklOR19CWVRFUywNCisJ CQkJICAgJmRlc2MtPnBwaHlzX3J4X3JpbmcsDQorCQkJCSAgIEdGUF9LRVJORUwpOw0KKw0KKwlp ZiAoIWRlc2MtPnByeF9yaW5nKSB7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAiY2Fu bm90IGFsbG9jIG1lbVxuIik7DQorCQlyZXR1cm4gLUVOT01FTTsNCisJfQ0KKw0KKwltZW1zZXQo ZGVzYy0+cHJ4X3JpbmcsIDB4MDAsIE1BWF9OVU1fUlhfUklOR19CWVRFUyk7DQorDQorCWRlc2Mt PnJ4X2huZGwgPSBrbWFsbG9jKE1BWF9OVU1fUlhfSE5ETF9CWVRFUywgR0ZQX0tFUk5FTCk7DQor DQorCWlmICghZGVzYy0+cnhfaG5kbCkgew0KKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYtPnBk ZXYtPmRldiwNCisJCQkJICBNQVhfTlVNX1JYX1JJTkdfQllURVMsDQorCQkJCSAgZGVzYy0+cHJ4 X3JpbmcsDQorCQkJCSAgZGVzYy0+cHBoeXNfcnhfcmluZyk7DQorCQlyZXR1cm4gLUVOT01FTTsN CisJfQ0KKw0KKwltZW1zZXQoZGVzYy0+cnhfaG5kbCwgMHgwMCwgTUFYX05VTV9SWF9ITkRMX0JZ VEVTKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX3J4X3JpbmdfaW5p dChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYpDQorew0KKwlzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSAqZGVz YzsNCisJaW50IGk7DQorCXN0cnVjdCBtd2xfcnhfaG5kbCAqcnhfaG5kbDsNCisJZG1hX2FkZHJf dCBkbWE7DQorCXUzMiB2YWw7DQorDQorCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKw0K KwlpZiAoZGVzYy0+cHJ4X3JpbmcpIHsNCisJCWRlc2MtPnJ4X2J1Zl9zaXplID0gU1lTQURQVF9N QVhfQUdHUl9TSVpFOw0KKw0KKwkJZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfTUFYX05VTV9SWF9E RVNDOyBpKyspIHsNCisJCQlyeF9obmRsID0gJmRlc2MtPnJ4X2huZGxbaV07DQorCQkJcnhfaG5k bC0+cHNrX2J1ZmYgPQ0KKwkJCQlkZXZfYWxsb2Nfc2tiKGRlc2MtPnJ4X2J1Zl9zaXplKTsNCisN CisJCQlpZiAoIXJ4X2huZGwtPnBza19idWZmKSB7DQorCQkJCXdpcGh5X2Vycihwcml2LT5ody0+ d2lwaHksDQorCQkJCQkgICJyeGRlc2MgJWk6IG5vIHNrYnVmZiBhdmFpbGFibGVcbiIsDQorCQkJ CQkgIGkpOw0KKwkJCQlyZXR1cm4gLUVOT01FTTsNCisJCQl9DQorDQorCQkJc2tiX3Jlc2VydmUo cnhfaG5kbC0+cHNrX2J1ZmYsDQorCQkJCSAgICBTWVNBRFBUX01JTl9CWVRFU19IRUFEUk9PTSk7 DQorCQkJZGVzYy0+cHJ4X3JpbmdbaV0ucnhfY29udHJvbCA9DQorCQkJCUVBR0xFX1JYRF9DVFJM X0RSSVZFUl9PV047DQorCQkJZGVzYy0+cHJ4X3JpbmdbaV0uc3RhdHVzID0gRUFHTEVfUlhEX1NU QVRVU19PSzsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5xb3NfY3RybCA9IDB4MDAwMDsNCisJCQlk ZXNjLT5wcnhfcmluZ1tpXS5jaGFubmVsID0gMHgwMDsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5y c3NpID0gMHgwMDsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5wa3RfbGVuID0NCisJCQkJY3B1X3Rv X2xlMTYoU1lTQURQVF9NQVhfQUdHUl9TSVpFKTsNCisJCQlkbWEgPSBwY2lfbWFwX3NpbmdsZShw cml2LT5wZGV2LA0KKwkJCQkJICAgICByeF9obmRsLT5wc2tfYnVmZi0+ZGF0YSwNCisJCQkJCSAg ICAgZGVzYy0+cnhfYnVmX3NpemUsDQorCQkJCQkgICAgIFBDSV9ETUFfRlJPTURFVklDRSk7DQor CQkJaWYgKHBjaV9kbWFfbWFwcGluZ19lcnJvcihwcml2LT5wZGV2LCBkbWEpKSB7DQorCQkJCXdp cGh5X2Vycihwcml2LT5ody0+d2lwaHksDQorCQkJCQkgICJmYWlsZWQgdG8gbWFwIHBjaSBtZW1v cnkhXG4iKTsNCisJCQkJcmV0dXJuIC1FTk9NRU07DQorCQkJfQ0KKwkJCWRlc2MtPnByeF9yaW5n W2ldLnBwaHlzX2J1ZmZfZGF0YSA9IGNwdV90b19sZTMyKGRtYSk7DQorCQkJdmFsID0gKHUzMilk ZXNjLT5wcGh5c19yeF9yaW5nICsNCisJCQkgICAgICAoKGkgKyAxKSAqIHNpemVvZihzdHJ1Y3Qg bXdsX3J4X2Rlc2MpKTsNCisJCQlkZXNjLT5wcnhfcmluZ1tpXS5wcGh5c19uZXh0ID0gY3B1X3Rv X2xlMzIodmFsKTsNCisJCQlyeF9obmRsLT5wZGVzYyA9ICZkZXNjLT5wcnhfcmluZ1tpXTsNCisJ CQlpZiAoaSA8IChTWVNBRFBUX01BWF9OVU1fUlhfREVTQyAtIDEpKQ0KKwkJCQlyeF9obmRsLT5w bmV4dCA9ICZkZXNjLT5yeF9obmRsW2kgKyAxXTsNCisJCX0NCisJCWRlc2MtPnByeF9yaW5nW1NZ U0FEUFRfTUFYX05VTV9SWF9ERVNDIC0gMV0ucHBoeXNfbmV4dCA9DQorCQkJY3B1X3RvX2xlMzIo KHUzMilkZXNjLT5wcGh5c19yeF9yaW5nKTsNCisJCWRlc2MtPnJ4X2huZGxbU1lTQURQVF9NQVhf TlVNX1JYX0RFU0MgLSAxXS5wbmV4dCA9DQorCQkJJmRlc2MtPnJ4X2huZGxbMF07DQorCQlkZXNj LT5wbmV4dF9yeF9obmRsID0gJmRlc2MtPnJ4X2huZGxbMF07DQorDQorCQlyZXR1cm4gMDsNCisJ fQ0KKw0KKwl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAibm8gdmFsaWQgUlggbWVtXG4iKTsN CisNCisJcmV0dXJuIC1FTk9NRU07DQorfQ0KKw0KK3N0YXRpYyB2b2lkIG13bF9yeF9yaW5nX2Ns ZWFudXAoc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJc3RydWN0IG13bF9kZXNjX2RhdGEg KmRlc2M7DQorCWludCBpOw0KKwlzdHJ1Y3QgbXdsX3J4X2huZGwgKnJ4X2huZGw7DQorDQorCWRl c2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKw0KKwlpZiAoZGVzYy0+cHJ4X3JpbmcpIHsNCisJ CWZvciAoaSA9IDA7IGkgPCBTWVNBRFBUX01BWF9OVU1fUlhfREVTQzsgaSsrKSB7DQorCQkJcnhf aG5kbCA9ICZkZXNjLT5yeF9obmRsW2ldOw0KKwkJCWlmICghcnhfaG5kbC0+cHNrX2J1ZmYpDQor CQkJCWNvbnRpbnVlOw0KKw0KKwkJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+cGRldiwNCisJCQkJ CSBsZTMyX3RvX2NwdQ0KKwkJCQkJIChyeF9obmRsLT5wZGVzYy0+cHBoeXNfYnVmZl9kYXRhKSwN CisJCQkJCSBkZXNjLT5yeF9idWZfc2l6ZSwNCisJCQkJCSBQQ0lfRE1BX0ZST01ERVZJQ0UpOw0K Kw0KKwkJCWRldl9rZnJlZV9za2JfYW55KHJ4X2huZGwtPnBza19idWZmKTsNCisNCisJCQl3aXBo eV9pbmZvKHByaXYtPmh3LT53aXBoeSwNCisJCQkJICAgInVubWFwcGVkK2ZyZWUnZCAlaSAweCVw IDB4JXggJWlcbiIsDQorCQkJCSAgIGksIHJ4X2huZGwtPnBza19idWZmLT5kYXRhLA0KKwkJCQkg ICBsZTMyX3RvX2NwdShyeF9obmRsLT5wZGVzYy0+cHBoeXNfYnVmZl9kYXRhKSwNCisJCQkJICAg ZGVzYy0+cnhfYnVmX3NpemUpOw0KKw0KKwkJCXJ4X2huZGwtPnBza19idWZmID0gTlVMTDsNCisJ CX0NCisJfQ0KK30NCisNCitzdGF0aWMgdm9pZCBtd2xfcnhfcmluZ19mcmVlKHN0cnVjdCBtd2xf cHJpdiAqcHJpdikNCit7DQorCXN0cnVjdCBtd2xfZGVzY19kYXRhICpkZXNjOw0KKw0KKwlkZXNj ID0gJnByaXYtPmRlc2NfZGF0YVswXTsNCisNCisJaWYgKGRlc2MtPnByeF9yaW5nKSB7DQorCQlt d2xfcnhfcmluZ19jbGVhbnVwKHByaXYpOw0KKw0KKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnByaXYt PnBkZXYtPmRldiwNCisJCQkJICBNQVhfTlVNX1JYX1JJTkdfQllURVMsDQorCQkJCSAgZGVzYy0+ cHJ4X3JpbmcsDQorCQkJCSAgZGVzYy0+cHBoeXNfcnhfcmluZyk7DQorDQorCQlkZXNjLT5wcnhf cmluZyA9IE5VTEw7DQorCX0NCisNCisJa2ZyZWUoZGVzYy0+cnhfaG5kbCk7DQorDQorCWRlc2Mt PnBuZXh0X3J4X2huZGwgPSBOVUxMOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3J4 X3ByZXBhcmVfc3RhdHVzKHN0cnVjdCBtd2xfcnhfZGVzYyAqcGRlc2MsDQorCQkJCQkgc3RydWN0 IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cykNCit7DQorCXUxNiByYXRlLCBmb3JtYXQsIG5z cywgYncsIGdpLCBydDsNCisNCisJbWVtc2V0KHN0YXR1cywgMCwgc2l6ZW9mKCpzdGF0dXMpKTsN CisNCisJc3RhdHVzLT5zaWduYWwgPSAtKHBkZXNjLT5yc3NpICsgVzgzNlhfUlNTSV9PRkZTRVQp Ow0KKw0KKwlyYXRlID0gbGUxNl90b19jcHUocGRlc2MtPnJhdGUpOw0KKwlmb3JtYXQgPSByYXRl ICYgTVdMX1JYX1JBVEVfRk9STUFUX01BU0s7DQorCW5zcyA9IChyYXRlICYgTVdMX1JYX1JBVEVf TlNTX01BU0spID4+IE1XTF9SWF9SQVRFX05TU19TSElGVDsNCisJYncgPSAocmF0ZSAmIE1XTF9S WF9SQVRFX0JXX01BU0spID4+IE1XTF9SWF9SQVRFX0JXX1NISUZUOw0KKwlnaSA9IChyYXRlICYg TVdMX1JYX1JBVEVfR0lfTUFTSykgPj4gTVdMX1JYX1JBVEVfR0lfU0hJRlQ7DQorCXJ0ID0gKHJh dGUgJiBNV0xfUlhfUkFURV9SVF9NQVNLKSA+PiBNV0xfUlhfUkFURV9SVF9TSElGVDsNCisNCisJ c3dpdGNoIChmb3JtYXQpIHsNCisJY2FzZSBSWF9SQVRFX0lORk9fRk9STUFUXzExTjoNCisJCXN0 YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX0hUOw0KKwkJaWYgKGJ3ID09IFJYX1JBVEVfSU5GT19IVDQw KQ0KKwkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHXzQwTUhaOw0KKwkJaWYgKGdpID09IFJYX1JB VEVfSU5GT19TSE9SVF9JTlRFUlZBTCkNCisJCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR19TSE9S VF9HSTsNCisJCWJyZWFrOw0KKwljYXNlIFJYX1JBVEVfSU5GT19GT1JNQVRfMTFBQzoNCisJCXN0 YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX1ZIVDsNCisJCWlmIChidyA9PSBSWF9SQVRFX0lORk9fSFQ0 MCkNCisJCQlzdGF0dXMtPmZsYWcgfD0gUlhfRkxBR180ME1IWjsNCisJCWlmIChidyA9PSBSWF9S QVRFX0lORk9fSFQ4MCkNCisJCQlzdGF0dXMtPnZodF9mbGFnIHw9IFJYX1ZIVF9GTEFHXzgwTUha Ow0KKwkJaWYgKGdpID09IFJYX1JBVEVfSU5GT19TSE9SVF9JTlRFUlZBTCkNCisJCQlzdGF0dXMt PmZsYWcgfD0gUlhfRkxBR19TSE9SVF9HSTsNCisJCXN0YXR1cy0+dmh0X25zcyA9IChuc3MgKyAx KTsNCisJCWJyZWFrOw0KKwl9DQorDQorCXN0YXR1cy0+cmF0ZV9pZHggPSBydDsNCisNCisJaWYg KHBkZXNjLT5jaGFubmVsID4gQkFORF8yNF9DSEFOTkVMX05VTSkgew0KKwkJc3RhdHVzLT5iYW5k ID0gSUVFRTgwMjExX0JBTkRfNUdIWjsNCisJCWlmICgoIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFH X0hUKSkgJiYNCisJCSAgICAoIShzdGF0dXMtPmZsYWcgJiBSWF9GTEFHX1ZIVCkpKSB7DQorCQkJ c3RhdHVzLT5yYXRlX2lkeCAtPSA1Ow0KKwkJCWlmIChzdGF0dXMtPnJhdGVfaWR4ID49IEJBTkRf NTBfUkFURV9OVU0pDQorCQkJCXN0YXR1cy0+cmF0ZV9pZHggPSBCQU5EXzUwX1JBVEVfTlVNIC0g MTsNCisJCX0NCisJfSBlbHNlIHsNCisJCXN0YXR1cy0+YmFuZCA9IElFRUU4MDIxMV9CQU5EXzJH SFo7DQorCQlpZiAoKCEoc3RhdHVzLT5mbGFnICYgUlhfRkxBR19IVCkpICYmDQorCQkgICAgKCEo c3RhdHVzLT5mbGFnICYgUlhfRkxBR19WSFQpKSkgew0KKwkJCWlmIChzdGF0dXMtPnJhdGVfaWR4 ID49IEJBTkRfMjRfUkFURV9OVU0pDQorCQkJCXN0YXR1cy0+cmF0ZV9pZHggPSBCQU5EXzI0X1JB VEVfTlVNIC0gMTsNCisJCX0NCisJfQ0KKw0KKwlzdGF0dXMtPmZyZXEgPSBpZWVlODAyMTFfY2hh bm5lbF90b19mcmVxdWVuY3kocGRlc2MtPmNoYW5uZWwsDQorCQkJCQkJICAgICAgc3RhdHVzLT5i YW5kKTsNCisNCisJLyogY2hlY2sgaWYgc3RhdHVzIGhhcyBhIHNwZWNpZmljIGVycm9yIGJpdCAo Yml0IDcpIHNldCBvciBpbmRpY2F0ZXMNCisJICogYSBnZW5lcmFsIGRlY3J5cHQgZXJyb3INCisJ ICovDQorCWlmICgocGRlc2MtPnN0YXR1cyA9PSBHRU5FUkFMX0RFQ1JZUFRfRVJSKSB8fA0KKwkg ICAgKHBkZXNjLT5zdGF0dXMgJiBERUNSWVBUX0VSUl9NQVNLKSkgew0KKwkJLyogY2hlY2sgaWYg c3RhdHVzIGlzIG5vdCBlcXVhbCB0byAweEZGDQorCQkgKiB0aGUgMHhGRiBjaGVjayBpcyBmb3Ig YmFja3dhcmQgY29tcGF0aWJpbGl0eQ0KKwkJICovDQorCQlpZiAocGRlc2MtPnN0YXR1cyAhPSBH RU5FUkFMX0RFQ1JZUFRfRVJSKSB7DQorCQkJaWYgKCgocGRlc2MtPnN0YXR1cyAmICh+REVDUllQ VF9FUlJfTUFTSykpICYNCisJCQkgICAgVEtJUF9ERUNSWVBUX01JQ19FUlIpICYmICEoKHBkZXNj LT5zdGF0dXMgJg0KKwkJCSAgICAoV0VQX0RFQ1JZUFRfSUNWX0VSUiB8IFRLSVBfREVDUllQVF9J Q1ZfRVJSKSkpKSB7DQorCQkJCXN0YXR1cy0+ZmxhZyB8PSBSWF9GTEFHX01NSUNfRVJST1I7DQor CQkJfQ0KKwkJfQ0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfcnhfZW5hYmxl X3N0YV9hbXNkdShzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsDQorCQkJCQkgICB1OCAqc3RhX2FkZHIp DQorew0KKwlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2luZm87DQorCXN0cnVjdCBpZWVlODAyMTFfc3Rh ICpzdGE7DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+c3RhX2xvY2spOw0KKwlsaXN0X2Zvcl9l YWNoX2VudHJ5KHN0YV9pbmZvLCAmcHJpdi0+c3RhX2xpc3QsIGxpc3QpIHsNCisJCXN0YSA9IGNv bnRhaW5lcl9vZigoY2hhciAqKXN0YV9pbmZvLCBzdHJ1Y3QgaWVlZTgwMjExX3N0YSwNCisJCQkJ ICAgZHJ2X3ByaXZbMF0pOw0KKwkJaWYgKGV0aGVyX2FkZHJfZXF1YWwoc3RhLT5hZGRyLCBzdGFf YWRkcikpIHsNCisJCQlzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCA9IHRydWU7DQorCQkJYnJl YWs7DQorCQl9DQorCX0NCisJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCit9DQor DQorc3RhdGljIGlubGluZSBzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3J4X2ZpbmRfdmlmX2JzcyhzdHJ1 Y3QgbXdsX3ByaXYgKnByaXYsDQorCQkJCQkJICB1OCAqYnNzaWQpDQorew0KKwlzdHJ1Y3QgbXds X3ZpZiAqbXdsX3ZpZjsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT52aWZfbG9jayk7DQorCWxp c3RfZm9yX2VhY2hfZW50cnkobXdsX3ZpZiwgJnByaXYtPnZpZl9saXN0LCBsaXN0KSB7DQorCQlp ZiAoZXRoZXJfYWRkcl9lcXVhbChic3NpZCwgbXdsX3ZpZi0+YnNzaWQpKSB7DQorCQkJc3Bpbl91 bmxvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCisJCQlyZXR1cm4gbXdsX3ZpZjsNCisJCX0NCisJ fQ0KKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dmlmX2xvY2spOw0KKw0KKwlyZXR1cm4gTlVMTDsN Cit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG13bF9yeF9yZW1vdmVfZG1hX2hlYWRlcihzdHJ1 Y3Qgc2tfYnVmZiAqc2tiLCBfX2xlMTYgcW9zKQ0KK3sNCisJc3RydWN0IG13bF9kbWFfZGF0YSAq dHI7DQorCWludCBoZHJsZW47DQorDQorCXRyID0gKHN0cnVjdCBtd2xfZG1hX2RhdGEgKilza2It PmRhdGE7DQorCWhkcmxlbiA9IGllZWU4MDIxMV9oZHJsZW4odHItPndoLmZyYW1lX2NvbnRyb2wp Ow0KKw0KKwlpZiAoaGRybGVuICE9IHNpemVvZih0ci0+d2gpKSB7DQorCQlpZiAoaWVlZTgwMjEx X2lzX2RhdGFfcW9zKHRyLT53aC5mcmFtZV9jb250cm9sKSkgew0KKwkJCW1lbW1vdmUodHItPmRh dGEgLSBoZHJsZW4sICZ0ci0+d2gsIGhkcmxlbiAtIDIpOw0KKwkJCSooKF9fbGUxNiAqKSh0ci0+ ZGF0YSAtIDIpKSA9IHFvczsNCisJCX0gZWxzZSB7DQorCQkJbWVtbW92ZSh0ci0+ZGF0YSAtIGhk cmxlbiwgJnRyLT53aCwgaGRybGVuKTsNCisJCX0NCisJfQ0KKw0KKwlpZiAoaGRybGVuICE9IHNp emVvZigqdHIpKQ0KKwkJc2tiX3B1bGwoc2tiLCBzaXplb2YoKnRyKSAtIGhkcmxlbik7DQorfQ0K Kw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBtd2xfcnhfcHJvY2Vzc19tZXNoX2Ftc2R1KHN0cnVjdCBt d2xfcHJpdiAqcHJpdiwNCisJCQkJCSAgICAgc3RydWN0IHNrX2J1ZmYgKnNrYiwNCisJCQkJCSAg ICAgc3RydWN0IGllZWU4MDIxMV9yeF9zdGF0dXMgKnN0YXR1cykNCit7DQorCXN0cnVjdCBpZWVl ODAyMTFfaGRyICp3aDsNCisJc3RydWN0IG13bF9zdGEgKnN0YV9pbmZvOw0KKwlzdHJ1Y3QgaWVl ZTgwMjExX3N0YSAqc3RhOw0KKwl1OCAqcWM7DQorCWludCB3aF9sZW47DQorCWludCBsZW47DQor CXU4IHBhZDsNCisJdTggKmRhdGE7DQorCXUxNiBmcmFtZV9sZW47DQorCXN0cnVjdCBza19idWZm ICpuZXdza2I7DQorDQorCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOw0K Kw0KKwlzcGluX2xvY2tfYmgoJnByaXYtPnN0YV9sb2NrKTsNCisJbGlzdF9mb3JfZWFjaF9lbnRy eShzdGFfaW5mbywgJnByaXYtPnN0YV9saXN0LCBsaXN0KSB7DQorCQlzdGEgPSBjb250YWluZXJf b2YoKGNoYXIgKilzdGFfaW5mbywgc3RydWN0IGllZWU4MDIxMV9zdGEsDQorCQkJCSAgIGRydl9w cml2WzBdKTsNCisJCWlmIChldGhlcl9hZGRyX2VxdWFsKHN0YS0+YWRkciwgd2gtPmFkZHIyKSkg ew0KKwkJCWlmICghc3RhX2luZm8tPmlzX21lc2hfbm9kZSkgew0KKwkJCQlzcGluX3VubG9ja19i aCgmcHJpdi0+c3RhX2xvY2spOw0KKwkJCQlyZXR1cm4gZmFsc2U7DQorCQkJfQ0KKwkJfQ0KKwl9 DQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT5zdGFfbG9jayk7DQorDQorCXFjID0gaWVlZTgwMjEx X2dldF9xb3NfY3RsKHdoKTsNCisJKnFjICY9IH5JRUVFODAyMTFfUU9TX0NUTF9BX01TRFVfUFJF U0VOVDsNCisNCisJd2hfbGVuID0gaWVlZTgwMjExX2hkcmxlbih3aC0+ZnJhbWVfY29udHJvbCk7 DQorCWxlbiA9IHdoX2xlbjsNCisJZGF0YSA9IHNrYi0+ZGF0YTsNCisNCisJd2hpbGUgKGxlbiA8 IHNrYi0+bGVuKSB7DQorCQlmcmFtZV9sZW4gPSAqKHU4ICopKGRhdGEgKyBsZW4gKyBFVEhfSExF TiAtIDEpIHwNCisJCQkoKih1OCAqKShkYXRhICsgbGVuICsgRVRIX0hMRU4gLSAyKSA8PCA4KTsN CisNCisJCWlmICgobGVuICsgRVRIX0hMRU4gKyBmcmFtZV9sZW4pID4gc2tiLT5sZW4pDQorCQkJ YnJlYWs7DQorDQorCQluZXdza2IgPSBkZXZfYWxsb2Nfc2tiKHdoX2xlbiArIGZyYW1lX2xlbik7 DQorCQlpZiAoIW5ld3NrYikNCisJCQlicmVhazsNCisNCisJCWV0aGVyX2FkZHJfY29weSh3aC0+ YWRkcjMsIGRhdGEgKyBsZW4pOw0KKwkJZXRoZXJfYWRkcl9jb3B5KHdoLT5hZGRyNCwgZGF0YSAr IGxlbiArIEVUSF9BTEVOKTsNCisJCW1lbWNweShuZXdza2ItPmRhdGEsIHdoLCB3aF9sZW4pOw0K KwkJbWVtY3B5KG5ld3NrYi0+ZGF0YSArIHdoX2xlbiwgZGF0YSArIGxlbiArIEVUSF9ITEVOLCBm cmFtZV9sZW4pOw0KKwkJc2tiX3B1dChuZXdza2IsIHdoX2xlbiArIGZyYW1lX2xlbik7DQorDQor CQlwYWQgPSAoKEVUSF9ITEVOICsgZnJhbWVfbGVuKSAlIDQpID8NCisJCQkoNCAtIChFVEhfSExF TiArIGZyYW1lX2xlbikgJSA0KSA6IDA7DQorCQlsZW4gKz0gKEVUSF9ITEVOICsgZnJhbWVfbGVu ICsgcGFkKTsNCisJCWlmIChsZW4gPCBza2ItPmxlbikNCisJCQlzdGF0dXMtPmZsYWcgfD0gUlhf RkxBR19BTVNEVV9NT1JFOw0KKwkJZWxzZQ0KKwkJCXN0YXR1cy0+ZmxhZyAmPSB+UlhfRkxBR19B TVNEVV9NT1JFOw0KKwkJbWVtY3B5KElFRUU4MDIxMV9TS0JfUlhDQihuZXdza2IpLCBzdGF0dXMs IHNpemVvZigqc3RhdHVzKSk7DQorCQlpZWVlODAyMTFfcngocHJpdi0+aHcsIG5ld3NrYik7DQor CX0NCisNCisJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisNCisJcmV0dXJuIHRydWU7DQorfQ0K Kw0KK3N0YXRpYyBpbnQgbXdsX3J4X3JlZmlsbChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHN0cnVj dCBtd2xfcnhfaG5kbCAqcnhfaG5kbCkNCit7DQorCXN0cnVjdCBtd2xfZGVzY19kYXRhICpkZXNj Ow0KKwlkbWFfYWRkcl90IGRtYTsNCisNCisJZGVzYyA9ICZwcml2LT5kZXNjX2RhdGFbMF07DQor DQorCXJ4X2huZGwtPnBza19idWZmID0gZGV2X2FsbG9jX3NrYihkZXNjLT5yeF9idWZfc2l6ZSk7 DQorDQorCWlmICghcnhfaG5kbC0+cHNrX2J1ZmYpDQorCQlyZXR1cm4gLUVOT01FTTsNCisNCisJ c2tiX3Jlc2VydmUocnhfaG5kbC0+cHNrX2J1ZmYsIFNZU0FEUFRfTUlOX0JZVEVTX0hFQURST09N KTsNCisNCisJcnhfaG5kbC0+cGRlc2MtPnN0YXR1cyA9IEVBR0xFX1JYRF9TVEFUVVNfT0s7DQor CXJ4X2huZGwtPnBkZXNjLT5xb3NfY3RybCA9IDB4MDAwMDsNCisJcnhfaG5kbC0+cGRlc2MtPmNo YW5uZWwgPSAweDAwOw0KKwlyeF9obmRsLT5wZGVzYy0+cnNzaSA9IDB4MDA7DQorCXJ4X2huZGwt PnBkZXNjLT5wa3RfbGVuID0gY3B1X3RvX2xlMTYoZGVzYy0+cnhfYnVmX3NpemUpOw0KKw0KKwlk bWEgPSBwY2lfbWFwX3NpbmdsZShwcml2LT5wZGV2LA0KKwkJCSAgICAgcnhfaG5kbC0+cHNrX2J1 ZmYtPmRhdGEsDQorCQkJICAgICBkZXNjLT5yeF9idWZfc2l6ZSwNCisJCQkgICAgIFBDSV9ETUFf RlJPTURFVklDRSk7DQorCWlmIChwY2lfZG1hX21hcHBpbmdfZXJyb3IocHJpdi0+cGRldiwgZG1h KSkgew0KKwkJZGV2X2tmcmVlX3NrYl9hbnkocnhfaG5kbC0+cHNrX2J1ZmYpOw0KKwkJd2lwaHlf ZXJyKHByaXYtPmh3LT53aXBoeSwNCisJCQkgICJmYWlsZWQgdG8gbWFwIHBjaSBtZW1vcnkhXG4i KTsNCisJCXJldHVybiAtRU5PTUVNOw0KKwl9DQorDQorCXJ4X2huZGwtPnBkZXNjLT5wcGh5c19i dWZmX2RhdGEgPSBjcHVfdG9fbGUzMihkbWEpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQoraW50 IG13bF9yeF9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9w cml2ICpwcml2ID0gaHctPnByaXY7DQorCWludCByYzsNCisNCisJcmMgPSBtd2xfcnhfcmluZ19h bGxvYyhwcml2KTsNCisJaWYgKHJjKSB7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiYWxsb2Nh dGluZyBSWCByaW5nIGZhaWxlZFxuIik7DQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisJcmMgPSBt d2xfcnhfcmluZ19pbml0KHByaXYpOw0KKwlpZiAocmMpIHsNCisJCW13bF9yeF9yaW5nX2ZyZWUo cHJpdik7DQorCQl3aXBoeV9lcnIoaHctPndpcGh5LA0KKwkJCSAgImluaXRpYWxpemluZyBSWCBy aW5nIGZhaWxlZFxuIik7DQorCQlyZXR1cm4gcmM7DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0K Kw0KK3ZvaWQgbXdsX3J4X2RlaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0 cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKw0KKwltd2xfcnhfcmluZ19jbGVhbnVw KHByaXYpOw0KKwltd2xfcnhfcmluZ19mcmVlKHByaXYpOw0KK30NCisNCit2b2lkIG13bF9yeF9y ZWN2KHVuc2lnbmVkIGxvbmcgZGF0YSkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0g KHN0cnVjdCBpZWVlODAyMTFfaHcgKilkYXRhOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBo dy0+cHJpdjsNCisJc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorCXN0cnVjdCBtd2xfcnhf aG5kbCAqY3Vycl9obmRsOw0KKwlpbnQgd29ya19kb25lID0gMDsNCisJc3RydWN0IHNrX2J1ZmYg KnByeF9za2IgPSBOVUxMOw0KKwlpbnQgcGt0X2xlbjsNCisJc3RydWN0IGllZWU4MDIxMV9yeF9z dGF0dXMgc3RhdHVzOw0KKwlzdHJ1Y3QgbXdsX3ZpZiAqbXdsX3ZpZiA9IE5VTEw7DQorCXN0cnVj dCBpZWVlODAyMTFfaGRyICp3aDsNCisJdTMyIHN0YXR1c19tYXNrOw0KKw0KKwlzcGluX2xvY2so JnByaXYtPnJ4X2Rlc2NfbG9jayk7DQorCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKwlj dXJyX2huZGwgPSBkZXNjLT5wbmV4dF9yeF9obmRsOw0KKw0KKwlpZiAoIWN1cnJfaG5kbCkgew0K KwkJc3RhdHVzX21hc2sgPSByZWFkbChwcml2LT5pb2Jhc2UxICsNCisJCQkJICAgIE1BQ1JFR19S RUdfQTJIX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorCQl3cml0ZWwoc3RhdHVzX21hc2sgfCBN QUNSRUdfQTJIUklDX0JJVF9SWF9SRFksDQorCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JF R19SRUdfQTJIX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorDQorCQlwcml2LT5pc19yeF9zY2hl ZHVsZSA9IGZhbHNlOw0KKwkJd2lwaHlfd2Fybihody0+d2lwaHksICJidXN5IG9yIG5vIHJlY2Vp dmluZyBwYWNrZXRzXG4iKTsNCisJCXNwaW5fdW5sb2NrKCZwcml2LT5yeF9kZXNjX2xvY2spOw0K KwkJcmV0dXJuOw0KKwl9DQorDQorCXdoaWxlICgoY3Vycl9obmRsLT5wZGVzYy0+cnhfY29udHJv bCA9PSBFQUdMRV9SWERfQ1RSTF9ETUFfT1dOKSAmJg0KKwkgICAgICAgKHdvcmtfZG9uZSA8IHBy aXYtPnJlY3ZfbGltaXQpKSB7DQorCQlwcnhfc2tiID0gY3Vycl9obmRsLT5wc2tfYnVmZjsNCisJ CWlmICghcHJ4X3NrYikNCisJCQlnb3RvIG91dDsNCisJCXBjaV91bm1hcF9zaW5nbGUocHJpdi0+ cGRldiwNCisJCQkJIGxlMzJfdG9fY3B1KGN1cnJfaG5kbC0+cGRlc2MtPnBwaHlzX2J1ZmZfZGF0 YSksDQorCQkJCSBkZXNjLT5yeF9idWZfc2l6ZSwNCisJCQkJIFBDSV9ETUFfRlJPTURFVklDRSk7 DQorCQlwa3RfbGVuID0gbGUxNl90b19jcHUoY3Vycl9obmRsLT5wZGVzYy0+cGt0X2xlbik7DQor DQorCQlpZiAoc2tiX3RhaWxyb29tKHByeF9za2IpIDwgcGt0X2xlbikgew0KKwkJCWRldl9rZnJl ZV9za2JfYW55KHByeF9za2IpOw0KKwkJCWdvdG8gb3V0Ow0KKwkJfQ0KKw0KKwkJaWYgKGN1cnJf aG5kbC0+cGRlc2MtPmNoYW5uZWwgIT0NCisJCSAgICBody0+Y29uZi5jaGFuZGVmLmNoYW4tPmh3 X3ZhbHVlKSB7DQorCQkJZGV2X2tmcmVlX3NrYl9hbnkocHJ4X3NrYik7DQorCQkJZ290byBvdXQ7 DQorCQl9DQorDQorCQltd2xfcnhfcHJlcGFyZV9zdGF0dXMoY3Vycl9obmRsLT5wZGVzYywgJnN0 YXR1cyk7DQorDQorCQlwcml2LT5ub2lzZSA9IC1jdXJyX2huZGwtPnBkZXNjLT5ub2lzZV9mbG9v cjsNCisNCisJCXdoID0gJigoc3RydWN0IG13bF9kbWFfZGF0YSAqKXByeF9za2ItPmRhdGEpLT53 aDsNCisNCisJCWlmIChpZWVlODAyMTFfaGFzX3Byb3RlY3RlZCh3aC0+ZnJhbWVfY29udHJvbCkp IHsNCisJCQkvKiBDaGVjayBpZiBodyBjcnlwdG8gaGFzIGJlZW4gZW5hYmxlZCBmb3INCisJCQkg KiB0aGlzIGJzcy4gSWYgeWVzLCBzZXQgdGhlIHN0YXR1cyBmbGFncw0KKwkJCSAqIGFjY29yZGlu Z2x5DQorCQkJICovDQorCQkJaWYgKGllZWU4MDIxMV9oYXNfdG9kcyh3aC0+ZnJhbWVfY29udHJv bCkpDQorCQkJCW13bF92aWYgPSBtd2xfcnhfZmluZF92aWZfYnNzKHByaXYsIHdoLT5hZGRyMSk7 DQorCQkJZWxzZQ0KKwkJCQltd2xfdmlmID0gbXdsX3J4X2ZpbmRfdmlmX2Jzcyhwcml2LCB3aC0+ YWRkcjIpOw0KKw0KKwkJCWlmIChtd2xfdmlmICYmIG13bF92aWYtPmlzX2h3X2NyeXB0b19lbmFi bGVkKSB7DQorCQkJCS8qIFdoZW4gTU1JQyBFUlJPUiBpcyBlbmNvdW50ZXJlZA0KKwkJCQkgKiBi eSB0aGUgZmlybXdhcmUsIHBheWxvYWQgaXMNCisJCQkJICogZHJvcHBlZCBhbmQgb25seSAzMiBi eXRlcyBvZg0KKwkJCQkgKiBtd2x3aWZpIEZpcm13YXJlIGhlYWRlciBpcyBzZW50DQorCQkJCSAq IHRvIHRoZSBob3N0Lg0KKwkJCQkgKg0KKwkJCQkgKiBXZSBuZWVkIHRvIGFkZCBmb3VyIGJ5dGVz IG9mDQorCQkJCSAqIGtleSBpbmZvcm1hdGlvbi4gIEluIGl0DQorCQkJCSAqIE1BQzgwMjExIGV4 cGVjdHMga2V5aWR4IHNldCB0bw0KKwkJCQkgKiAwIGZvciB0cmlnZ2VyaW5nIENvdW50ZXINCisJ CQkJICogTWVhc3VyZSBvZiBNTUlDIGZhaWx1cmUuDQorCQkJCSAqLw0KKwkJCQlpZiAoc3RhdHVz LmZsYWcgJiBSWF9GTEFHX01NSUNfRVJST1IpIHsNCisJCQkJCXN0cnVjdCBtd2xfZG1hX2RhdGEg KnRyOw0KKw0KKwkJCQkJdHIgPSAoc3RydWN0IG13bF9kbWFfZGF0YSAqKQ0KKwkJCQkJICAgICBw cnhfc2tiLT5kYXRhOw0KKwkJCQkJbWVtc2V0KCh2b2lkICopJnRyLT5kYXRhLCAwLCA0KTsNCisJ CQkJCXBrdF9sZW4gKz0gNDsNCisJCQkJfQ0KKw0KKwkJCQlpZiAoIWllZWU4MDIxMV9pc19hdXRo KHdoLT5mcmFtZV9jb250cm9sKSkNCisJCQkJCXN0YXR1cy5mbGFnIHw9IFJYX0ZMQUdfSVZfU1RS SVBQRUQgfA0KKwkJCQkJCSAgICAgICBSWF9GTEFHX0RFQ1JZUFRFRCB8DQorCQkJCQkJICAgICAg IFJYX0ZMQUdfTU1JQ19TVFJJUFBFRDsNCisJCQl9DQorCQl9DQorDQorCQlza2JfcHV0KHByeF9z a2IsIHBrdF9sZW4pOw0KKwkJbXdsX3J4X3JlbW92ZV9kbWFfaGVhZGVyKHByeF9za2IsIGN1cnJf aG5kbC0+cGRlc2MtPnFvc19jdHJsKTsNCisNCisJCXdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRy ICopcHJ4X3NrYi0+ZGF0YTsNCisNCisJCWlmIChpZWVlODAyMTFfaXNfbWdtdCh3aC0+ZnJhbWVf Y29udHJvbCkpIHsNCisJCQlzdHJ1Y3QgaWVlZTgwMjExX21nbXQgKm1nbXQ7DQorCQkJX19sZTE2 IGNhcGFiOw0KKw0KKwkJCW1nbXQgPSAoc3RydWN0IGllZWU4MDIxMV9tZ210ICopcHJ4X3NrYi0+ ZGF0YTsNCisNCisJCQlpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJhbWVf Y29udHJvbCkgJiYNCisJCQkJICAgICBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PQ0KKwkJCQkg ICAgIFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KKwkJCQkgICAgIG1nbXQtPnUuYWN0aW9uLnUuYWRk YmFfcmVzcC5hY3Rpb25fY29kZSA9PQ0KKwkJCQkgICAgIFdMQU5fQUNUSU9OX0FEREJBX1JFU1Ap KSB7DQorCQkJCWNhcGFiID0gbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiOw0KKwkJ CQlpZiAobGUxNl90b19jcHUoY2FwYWIpICYgMSkNCisJCQkJCW13bF9yeF9lbmFibGVfc3RhX2Ft c2R1KHByaXYsIG1nbXQtPnNhKTsNCisJCQl9DQorCQl9DQorDQorCQlpZiAoaWVlZTgwMjExX2lz X2RhdGFfcW9zKHdoLT5mcmFtZV9jb250cm9sKSAmJg0KKwkJICAgIGllZWU4MDIxMV9oYXNfYTQo d2gtPmZyYW1lX2NvbnRyb2wpKSB7DQorCQkJdTggKnFjID0gaWVlZTgwMjExX2dldF9xb3NfY3Rs KHdoKTsNCisNCisJCQlpZiAoKnFjICYgSUVFRTgwMjExX1FPU19DVExfQV9NU0RVX1BSRVNFTlQp DQorCQkJCWlmIChtd2xfcnhfcHJvY2Vzc19tZXNoX2Ftc2R1KHByaXYsIHByeF9za2IsDQorCQkJ CQkJCSAgICAgICZzdGF0dXMpKQ0KKwkJCQkJZ290byBvdXQ7DQorCQl9DQorDQorCQltZW1jcHko SUVFRTgwMjExX1NLQl9SWENCKHByeF9za2IpLCAmc3RhdHVzLCBzaXplb2Yoc3RhdHVzKSk7DQor CQlpZWVlODAyMTFfcngoaHcsIHByeF9za2IpOw0KK291dDoNCisJCW13bF9yeF9yZWZpbGwocHJp diwgY3Vycl9obmRsKTsNCisJCWN1cnJfaG5kbC0+cGRlc2MtPnJ4X2NvbnRyb2wgPSBFQUdMRV9S WERfQ1RSTF9EUklWRVJfT1dOOw0KKwkJY3Vycl9obmRsLT5wZGVzYy0+cW9zX2N0cmwgPSAwOw0K KwkJY3Vycl9obmRsID0gY3Vycl9obmRsLT5wbmV4dDsNCisJCXdvcmtfZG9uZSsrOw0KKwl9DQor DQorCWRlc2MtPnBuZXh0X3J4X2huZGwgPSBjdXJyX2huZGw7DQorDQorCXN0YXR1c19tYXNrID0g cmVhZGwocHJpdi0+aW9iYXNlMSArDQorCQkJICAgIE1BQ1JFR19SRUdfQTJIX0lOVEVSUlVQVF9T VEFUVVNfTUFTSyk7DQorCXdyaXRlbChzdGF0dXNfbWFzayB8IE1BQ1JFR19BMkhSSUNfQklUX1JY X1JEWSwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRf U1RBVFVTX01BU0spOw0KKw0KKwlwcml2LT5pc19yeF9zY2hlZHVsZSA9IGZhbHNlOw0KKw0KKwlz cGluX3VubG9jaygmcHJpdi0+cnhfZGVzY19sb2NrKTsNCit9DQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3J4LmggYi9kcml2ZXJzL25ldC93aXJlbGVz cy9tYXJ2ZWxsL213bHdpZmkvcnguaA0KbmV3IGZpbGUgbW9kZSAxMDA2NDQNCmluZGV4IDAwMDAw MDAuLmQzMmM1NTgNCi0tLSAvZGV2L251bGwNCisrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21h cnZlbGwvbXdsd2lmaS9yeC5oDQpAQCAtMCwwICsxLDI1IEBADQorLyoNCisgKiBDb3B5cmlnaHQg KEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCisgKg0KKyAqIFRoaXMg c29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQgYnkgTWFydmVsbCBJbnRl cm5hdGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRoZSAiTGljZW5zZSIpLiAg WW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoaXMgRmlsZSBpbg0KKyAq IGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2Us IGEgY29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBGSUxFIElTIERJU1RSSUJV VEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQgVEhFDQorICogSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1FRC4gIFRoZSBMaWNlbnNl IHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRoaXMgd2FycmFudHkgZGlz Y2xhaW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBkZWZpbmVzIHJl Y2VpdmUgcmVsYXRlZCBmdW5jdGlvbnMuICovDQorDQorI2lmbmRlZiBfcnhfaF8NCisjZGVmaW5l IF9yeF9oXw0KKw0KK2ludCBtd2xfcnhfaW5pdChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodyk7DQor dm9pZCBtd2xfcnhfZGVpbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCit2b2lkIG13bF9y eF9yZWN2KHVuc2lnbmVkIGxvbmcgZGF0YSk7DQorDQorI2VuZGlmIC8qIF9yeF9oXyAqLw0KZGlm ZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9zeXNhZHB0Lmgg Yi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvc3lzYWRwdC5oDQpuZXcgZmls ZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMC4uOGExNzA2YQ0KLS0tIC9kZXYvbnVsbA0KKysr IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3N5c2FkcHQuaA0KQEAgLTAs MCArMSw3MyBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1hcnZlbGwgSW50 ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGZpbGUgKHRoZSAiRmlsZSIp IGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbA0KKyAqIEx0ZC4gdW5kZXIg dGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1 bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCByZWRpc3RyaWJ1dGUg YW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRhbmNlIHdpdGggdGhlIHRlcm1z IGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hpY2gNCisgKiBpcyBh dmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu DQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO VEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisgKiBBUkUgRVhQ UkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFp bHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuDQorICovDQorDQorLyogRGVz Y3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyBzeXN0ZW0gYWRhcHRhdGlvbiByZWxhdGVkIGlu Zm9ybWF0aW9uLiAqLw0KKw0KKyNpZm5kZWYgX213bF9zeXNhZHB0X2hfDQorI2RlZmluZSBfbXds X3N5c2FkcHRfaF8NCisNCisjZGVmaW5lIFNZU0FEUFRfTUFYX05VTV9DSEFOTkVMUyAgICAgICA2 NA0KKw0KKyNkZWZpbmUgU1lTQURQVF9NQVhfREFUQV9SQVRFU19HICAgICAgIDE0DQorDQorI2Rl ZmluZSBTWVNBRFBUX1RYX1BPV0VSX0xFVkVMX1RPVEFMICAgMTYNCisNCisjZGVmaW5lIFNZU0FE UFRfVFhfV01NX1FVRVVFUyAgICAgICAgICA0DQorDQorI2RlZmluZSBTWVNBRFBUX1RYX0FNUERV X1FVRVVFUyAgICAgICAgNA0KKw0KKyNkZWZpbmUgU1lTQURQVF9OVU1fT0ZfQVAgICAgICAgICAg ICAgIDE2DQorDQorI2RlZmluZSBTWVNBRFBUX1RPVEFMX1RYX1FVRVVFUyAgICAgICAgKFNZU0FE UFRfVFhfV01NX1FVRVVFUyArIFwNCisJCQkJCVNZU0FEUFRfTlVNX09GX0FQKQ0KKw0KKyNkZWZp bmUgU1lTQURQVF9UT1RBTF9IV19RVUVVRVMgICAgICAgIChTWVNBRFBUX1RYX1dNTV9RVUVVRVMg KyBcDQorCQkJCQlTWVNBRFBUX1RYX0FNUERVX1FVRVVFUykNCisNCisjZGVmaW5lIFNZU0FEUFRf TlVNX09GX0RFU0NfREFUQSAgICAgICAoNCArIFNZU0FEUFRfTlVNX09GX0FQKQ0KKw0KKyNkZWZp bmUgU1lTQURQVF9NQVhfTlVNX1RYX0RFU0MgICAgICAgIDI1Ng0KKw0KKyNkZWZpbmUgU1lTQURQ VF9UWF9RVUVVRV9MSU1JVCAgICAgICAgICgzICogU1lTQURQVF9NQVhfTlVNX1RYX0RFU0MpDQor DQorI2RlZmluZSBTWVNBRFBUX1RYX1dBS0VfUV9USFJFU0hPTEQgICAgKDIgKiBTWVNBRFBUX01B WF9OVU1fVFhfREVTQykNCisNCisjZGVmaW5lIFNZU0FEUFRfREVMQVlfRlJFRV9RX0xJTUlUICAg ICBTWVNBRFBUX01BWF9OVU1fVFhfREVTQw0KKw0KKyNkZWZpbmUgU1lTQURQVF9NQVhfTlVNX1JY X0RFU0MgICAgICAgIDI1Ng0KKw0KKyNkZWZpbmUgU1lTQURQVF9SRUNFSVZFX0xJTUlUICAgICAg ICAgIDY0DQorDQorI2RlZmluZSBTWVNBRFBUX01BWF9BR0dSX1NJWkUgICAgICAgICAgODE5Mg0K Kw0KKyNkZWZpbmUgU1lTQURQVF9NSU5fQllURVNfSEVBRFJPT00gICAgIDY0DQorDQorI2RlZmlu ZSBTWVNBRFBUX0FNUERVX1BBQ0tFVF9USFJFU0hPTEQgNjQNCisNCisjZGVmaW5lIFNZU0FEUFRf QU1TRFVfRldfTUFYX1NJWkUgICAgICAzMzAwDQorDQorI2RlZmluZSBTWVNBRFBUX0FNU0RVXzRL X01BWF9TSVpFICAgICAgU1lTQURQVF9BTVNEVV9GV19NQVhfU0laRQ0KKw0KKyNkZWZpbmUgU1lT QURQVF9BTVNEVV84S19NQVhfU0laRSAgICAgIFNZU0FEUFRfQU1TRFVfRldfTUFYX1NJWkUNCisN CisjZGVmaW5lIFNZU0FEUFRfQU1TRFVfQUxMT1dfU0laRSAgICAgICAxNjAwDQorDQorI2RlZmlu ZSBTWVNBRFBUX0FNU0RVX0ZMVVNIX1RJTUUgICAgICAgNTAwDQorDQorI2RlZmluZSBTWVNBRFBU X0FNU0RVX1BBQ0tFVF9USFJFU0hPTEQgMTANCisNCisjZGVmaW5lIFNZU0FEUFRfTUFYX1RJRCAg ICAgICAgICAgICAgICA4DQorDQorI2VuZGlmIC8qIF9td2xfc3lzYWRwdF9oXyAqLw0KZGlmZiAt LWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS90eC5jIGIvZHJpdmVy cy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3R4LmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 DQppbmRleCAwMDAwMDAwLi42OGE5OTRkDQotLS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25l dC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvdHguYw0KQEAgLTAsMCArMSwxMjUxIEBADQorLyoN CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4N CisgKg0KKyAqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQg YnkgTWFydmVsbCBJbnRlcm5hdGlvbmFsDQorICogTHRkLiB1bmRlciB0aGUgdGVybXMgb2YgdGhl IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwgSnVuZSAxOTkxDQorICogKHRo ZSAiTGljZW5zZSIpLiAgWW91IG1heSB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRo aXMgRmlsZSBpbg0KKyAqIGFjY29yZGFuY2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMg b2YgdGhlIExpY2Vuc2UsIGEgY29weSBvZiB3aGljaA0KKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0 aW5nIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCisgKg0KKyAqIFRIRSBG SUxFIElTIERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBB TkQgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBFWFBSRVNTTFkgRElTQ0xBSU1F RC4gIFRoZSBMaWNlbnNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgZGV0YWlscyBhYm91dA0KKyAqIHRo aXMgd2FycmFudHkgZGlzY2xhaW1lci4NCisgKi8NCisNCisvKiBEZXNjcmlwdGlvbjogIFRoaXMg ZmlsZSBpbXBsZW1lbnRzIHRyYW5zbWl0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KKw0KKyNpbmNs dWRlIDxsaW51eC9ldGhlcmRldmljZS5oPg0KKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4NCisN CisjaW5jbHVkZSAic3lzYWRwdC5oIg0KKyNpbmNsdWRlICJkZXYuaCINCisjaW5jbHVkZSAiZndj bWQuaCINCisjaW5jbHVkZSAidHguaCINCisNCisjZGVmaW5lIE1BWF9OVU1fVFhfUklOR19CWVRF UyAgKFNZU0FEUFRfTUFYX05VTV9UWF9ERVNDICogXA0KKwkJCQlzaXplb2Yoc3RydWN0IG13bF90 eF9kZXNjKSkNCisNCisjZGVmaW5lIE1BWF9OVU1fVFhfSE5ETF9CWVRFUyAgIChTWVNBRFBUX01B WF9OVU1fVFhfREVTQyAqIFwNCisJCQkJc2l6ZW9mKHN0cnVjdCBtd2xfdHhfaG5kbCkpDQorDQor I2RlZmluZSBFQUdMRV9UWERfWE1JVENUUkxfVVNFX01DX1JBVEUgICAgIDB4OCAgICAgLyogVXNl IG11bHRpY2FzdCBkYXRhIHJhdGUgKi8NCisNCisjZGVmaW5lIE1XTF9RT1NfQUNLX1BPTElDWV9N QVNLCSAgICAgICAgICAgMHgwMDYwDQorI2RlZmluZSBNV0xfUU9TX0FDS19QT0xJQ1lfTk9STUFM ICAgICAgICAgIDB4MDAwMA0KKyNkZWZpbmUgTVdMX1FPU19BQ0tfUE9MSUNZX0JMT0NLQUNLICAg ICAgICAweDAwNjANCisNCisjZGVmaW5lIEVYVF9JViAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgMHgyMA0KKyNkZWZpbmUgSU5DUkVBU0VfSVYoaXYxNiwgaXYzMikgXA0KK3sgXA0KKwkoaXYx NikrKzsgXA0KKwlpZiAoKGl2MTYpID09IDApIFwNCisJCShpdjMyKSsrOyBcDQorfQ0KKw0KKy8q IFRyYW5zbWl0IHJhdGUgaW5mb3JtYXRpb24gY29uc3RhbnRzICovDQorI2RlZmluZSBUWF9SQVRF X0ZPUk1BVF9MRUdBQ1kgICAgICAgICAwDQorI2RlZmluZSBUWF9SQVRFX0ZPUk1BVF8xMU4gICAg ICAgICAgICAxDQorI2RlZmluZSBUWF9SQVRFX0ZPUk1BVF8xMUFDICAgICAgICAgICAyDQorDQor I2RlZmluZSBUWF9SQVRFX0JBTkRXSURUSF8yMCAgICAgICAgICAwDQorI2RlZmluZSBUWF9SQVRF X0JBTkRXSURUSF80MCAgICAgICAgICAxDQorI2RlZmluZSBUWF9SQVRFX0JBTkRXSURUSF84MCAg ICAgICAgICAyDQorDQorI2RlZmluZSBUWF9SQVRFX0lORk9fU1REX0dJICAgICAgICAgICAwDQor I2RlZmluZSBUWF9SQVRFX0lORk9fU0hPUlRfR0kgICAgICAgICAxDQorDQorZW51bSB7DQorCUlF RUVfVFlQRV9NQU5BR0VNRU5UID0gMCwNCisJSUVFRV9UWVBFX0NPTlRST0wsDQorCUlFRUVfVFlQ RV9EQVRBDQorfTsNCisNCitzdHJ1Y3QgY2NtcF9oZHIgew0KKwlfX2xlMTYgaXYxNjsNCisJdTgg cnN2ZDsNCisJdTgga2V5X2lkOw0KKwlfX2xlMzIgaXYzMjsNCit9IF9fcGFja2VkOw0KKw0KK3N0 YXRpYyBpbnQgbXdsX3R4X3JpbmdfYWxsb2Moc3RydWN0IG13bF9wcml2ICpwcml2KQ0KK3sNCisJ c3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorCWludCBudW07DQorCXU4ICptZW07DQorDQor CWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhWzBdOw0KKw0KKwltZW0gPSBkbWFfYWxsb2NfY29oZXJl bnQoJnByaXYtPnBkZXYtPmRldiwNCisJCQkJIE1BWF9OVU1fVFhfUklOR19CWVRFUyAqDQorCQkJ CSBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEEsDQorCQkJCSAmZGVzYy0+cHBoeXNfdHhfcmluZywN CisJCQkJIEdGUF9LRVJORUwpOw0KKw0KKwlpZiAoIW1lbSkgew0KKwkJd2lwaHlfZXJyKHByaXYt Pmh3LT53aXBoeSwgImNhbm5vdCBhbGxvYyBtZW1cbiIpOw0KKwkJcmV0dXJuIC1FTk9NRU07DQor CX0NCisNCisJZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7IG51 bSsrKSB7DQorCQlkZXNjID0gJnByaXYtPmRlc2NfZGF0YVtudW1dOw0KKw0KKwkJZGVzYy0+cHR4 X3JpbmcgPSAoc3RydWN0IG13bF90eF9kZXNjICopDQorCQkJKG1lbSArIG51bSAqIE1BWF9OVU1f VFhfUklOR19CWVRFUyk7DQorDQorCQlkZXNjLT5wcGh5c190eF9yaW5nID0gKGRtYV9hZGRyX3Qp DQorCQkJKCh1MzIpcHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3R4X3JpbmcgKw0KKwkJCW51bSAq IE1BWF9OVU1fVFhfUklOR19CWVRFUyk7DQorDQorCQltZW1zZXQoZGVzYy0+cHR4X3JpbmcsIDB4 MDAsDQorCQkgICAgICAgTUFYX05VTV9UWF9SSU5HX0JZVEVTKTsNCisJfQ0KKw0KKwltZW0gPSBr bWFsbG9jKE1BWF9OVU1fVFhfSE5ETF9CWVRFUyAqIFNZU0FEUFRfTlVNX09GX0RFU0NfREFUQSwN CisJCSAgICAgIEdGUF9LRVJORUwpOw0KKw0KKwlpZiAoIW1lbSkgew0KKwkJd2lwaHlfZXJyKHBy aXYtPmh3LT53aXBoeSwgImNhbm5vdCBhbGxvYyBtZW1cbiIpOw0KKwkJZG1hX2ZyZWVfY29oZXJl bnQoJnByaXYtPnBkZXYtPmRldiwNCisJCQkJICBNQVhfTlVNX1RYX1JJTkdfQllURVMgKg0KKwkJ CQkgIFNZU0FEUFRfTlVNX09GX0RFU0NfREFUQSwNCisJCQkJICBwcml2LT5kZXNjX2RhdGFbMF0u cHR4X3JpbmcsDQorCQkJCSAgcHJpdi0+ZGVzY19kYXRhWzBdLnBwaHlzX3R4X3JpbmcpOw0KKwkJ cmV0dXJuIC1FTk9NRU07DQorCX0NCisNCisJZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05V TV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQorCQlkZXNjID0gJnByaXYtPmRlc2NfZGF0YVtudW1d Ow0KKw0KKwkJZGVzYy0+dHhfaG5kbCA9IChzdHJ1Y3QgbXdsX3R4X2huZGwgKikNCisJCQkobWVt ICsgbnVtICogTUFYX05VTV9UWF9ITkRMX0JZVEVTKTsNCisNCisJCW1lbXNldChkZXNjLT50eF9o bmRsLCAweDAwLA0KKwkJICAgICAgIE1BWF9OVU1fVFhfSE5ETF9CWVRFUyk7DQorCX0NCisNCisJ cmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgbXdsX3R4X3JpbmdfaW5pdChzdHJ1Y3QgbXds X3ByaXYgKnByaXYpDQorew0KKwlpbnQgbnVtLCBpOw0KKwlzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSAq ZGVzYzsNCisNCisJZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7 IG51bSsrKSB7DQorCQlza2JfcXVldWVfaGVhZF9pbml0KCZwcml2LT50eHFbbnVtXSk7DQorCQlw cml2LT5md19kZXNjX2NudFtudW1dID0gMDsNCisNCisJCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRh W251bV07DQorDQorCQlpZiAoZGVzYy0+cHR4X3JpbmcpIHsNCisJCQlmb3IgKGkgPSAwOyBpIDwg U1lTQURQVF9NQVhfTlVNX1RYX0RFU0M7IGkrKykgew0KKwkJCQlkZXNjLT5wdHhfcmluZ1tpXS5z dGF0dXMgPQ0KKwkJCQkJY3B1X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRVU19JRExFKTsNCisJCQkJ ZGVzYy0+cHR4X3JpbmdbaV0ucHBoeXNfbmV4dCA9DQorCQkJCQljcHVfdG9fbGUzMigodTMyKWRl c2MtPnBwaHlzX3R4X3JpbmcgKw0KKwkJCQkJKChpICsgMSkgKiBzaXplb2Yoc3RydWN0IG13bF90 eF9kZXNjKSkpOw0KKwkJCQlkZXNjLT50eF9obmRsW2ldLnBkZXNjID0NCisJCQkJCSZkZXNjLT5w dHhfcmluZ1tpXTsNCisJCQkJaWYgKGkgPCBTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAtIDEpDQor CQkJCQlkZXNjLT50eF9obmRsW2ldLnBuZXh0ID0NCisJCQkJCQkmZGVzYy0+dHhfaG5kbFtpICsg MV07DQorCQkJfQ0KKwkJCWRlc2MtPnB0eF9yaW5nW1NZU0FEUFRfTUFYX05VTV9UWF9ERVNDIC0g MV0ucHBoeXNfbmV4dCA9DQorCQkJCWNwdV90b19sZTMyKCh1MzIpZGVzYy0+cHBoeXNfdHhfcmlu Zyk7DQorCQkJZGVzYy0+dHhfaG5kbFtTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAtIDFdLnBuZXh0 ID0NCisJCQkJJmRlc2MtPnR4X2huZGxbMF07DQorDQorCQkJZGVzYy0+cHN0YWxlX3R4X2huZGwg PSAmZGVzYy0+dHhfaG5kbFswXTsNCisJCQlkZXNjLT5wbmV4dF90eF9obmRsICA9ICZkZXNjLT50 eF9obmRsWzBdOw0KKwkJfSBlbHNlIHsNCisJCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LCAi bm8gdmFsaWQgVFggbWVtXG4iKTsNCisJCQlyZXR1cm4gLUVOT01FTTsNCisJCX0NCisJfQ0KKw0K KwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHZvaWQgbXdsX3R4X3JpbmdfY2xlYW51cChzdHJ1 Y3QgbXdsX3ByaXYgKnByaXYpDQorew0KKwlpbnQgY2xlYW5lZF90eF9kZXNjID0gMDsNCisJaW50 IG51bSwgaTsNCisJc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorDQorCWZvciAobnVtID0g MDsgbnVtIDwgU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBOyBudW0rKykgew0KKwkJc2tiX3F1ZXVl X3B1cmdlKCZwcml2LT50eHFbbnVtXSk7DQorCQlwcml2LT5md19kZXNjX2NudFtudW1dID0gMDsN CisNCisJCWRlc2MgPSAmcHJpdi0+ZGVzY19kYXRhW251bV07DQorDQorCQlpZiAoZGVzYy0+cHR4 X3JpbmcpIHsNCisJCQlmb3IgKGkgPSAwOyBpIDwgU1lTQURQVF9NQVhfTlVNX1RYX0RFU0M7IGkr Kykgew0KKwkJCQlpZiAoIWRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYpDQorCQkJCQljb250aW51 ZTsNCisNCisJCQkJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksDQorCQkJCQkgICAidW5tYXBw ZWQgYW5kIGZyZWUnZCAlaSAweCVwIDB4JXhcbiIsDQorCQkJCQkgICBpLA0KKwkJCQkJICAgZGVz Yy0+dHhfaG5kbFtpXS5wc2tfYnVmZi0+ZGF0YSwNCisJCQkJCSAgIGxlMzJfdG9fY3B1KA0KKwkJ CQkJICAgZGVzYy0+cHR4X3JpbmdbaV0ucGt0X3B0cikpOw0KKwkJCQlwY2lfdW5tYXBfc2luZ2xl KHByaXYtPnBkZXYsDQorCQkJCQkJIGxlMzJfdG9fY3B1KA0KKwkJCQkJCSBkZXNjLT5wdHhfcmlu Z1tpXS5wa3RfcHRyKSwNCisJCQkJCQkgZGVzYy0+dHhfaG5kbFtpXS5wc2tfYnVmZi0+bGVuLA0K KwkJCQkJCSBQQ0lfRE1BX1RPREVWSUNFKTsNCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoZGVzYy0+ dHhfaG5kbFtpXS5wc2tfYnVmZik7DQorCQkJCWRlc2MtPnB0eF9yaW5nW2ldLnN0YXR1cyA9DQor CQkJCQljcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0lETEUpOw0KKwkJCQlkZXNjLT5wdHhf cmluZ1tpXS5wa3RfcHRyID0gMDsNCisJCQkJZGVzYy0+cHR4X3JpbmdbaV0ucGt0X2xlbiA9IDA7 DQorCQkJCWRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYgPSBOVUxMOw0KKwkJCQljbGVhbmVkX3R4 X2Rlc2MrKzsNCisJCQl9DQorCQl9DQorCX0NCisNCisJd2lwaHlfaW5mbyhwcml2LT5ody0+d2lw aHksICJjbGVhbmVkICVpIFRYIGRlc2NyXG4iLCBjbGVhbmVkX3R4X2Rlc2MpOw0KK30NCisNCitz dGF0aWMgdm9pZCBtd2xfdHhfcmluZ19mcmVlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdikNCit7DQor CWludCBudW07DQorDQorCWlmIChwcml2LT5kZXNjX2RhdGFbMF0ucHR4X3JpbmcpIHsNCisJCWRt YV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5kZXYsDQorCQkJCSAgTUFYX05VTV9UWF9SSU5H X0JZVEVTICoNCisJCQkJICBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEEsDQorCQkJCSAgcHJpdi0+ ZGVzY19kYXRhWzBdLnB0eF9yaW5nLA0KKwkJCQkgIHByaXYtPmRlc2NfZGF0YVswXS5wcGh5c190 eF9yaW5nKTsNCisJfQ0KKw0KKwlmb3IgKG51bSA9IDA7IG51bSA8IFNZU0FEUFRfTlVNX09GX0RF U0NfREFUQTsgbnVtKyspIHsNCisJCWlmIChwcml2LT5kZXNjX2RhdGFbbnVtXS5wdHhfcmluZykN CisJCQlwcml2LT5kZXNjX2RhdGFbbnVtXS5wdHhfcmluZyA9IE5VTEw7DQorCQlwcml2LT5kZXNj X2RhdGFbbnVtXS5wc3RhbGVfdHhfaG5kbCA9IE5VTEw7DQorCQlwcml2LT5kZXNjX2RhdGFbbnVt XS5wbmV4dF90eF9obmRsID0gTlVMTDsNCisJfQ0KKw0KKwlrZnJlZShwcml2LT5kZXNjX2RhdGFb MF0udHhfaG5kbCk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfYWRkX2RtYV9o ZWFkZXIoc3RydWN0IG13bF9wcml2ICpwcml2LA0KKwkJCQkJIHN0cnVjdCBza19idWZmICpza2Is DQorCQkJCQkgaW50IGhlYWRfcGFkLA0KKwkJCQkJIGludCB0YWlsX3BhZCkNCit7DQorCXN0cnVj dCBpZWVlODAyMTFfaGRyICp3aDsNCisJaW50IGhkcmxlbjsNCisJaW50IHJlcWRfaGRybGVuOw0K KwlzdHJ1Y3QgbXdsX2RtYV9kYXRhICp0cjsNCisNCisJLyogQWRkIGEgZmlybXdhcmUgRE1BIGhl YWRlcjsgdGhlIGZpcm13YXJlIHJlcXVpcmVzIHRoYXQgd2UNCisJICogcHJlc2VudCBhIDItYnl0 ZSBwYXlsb2FkIGxlbmd0aCBmb2xsb3dlZCBieSBhIDQtYWRkcmVzcw0KKwkgKiBoZWFkZXIgKHdp dGhvdXQgUW9TIGZpZWxkKSwgZm9sbG93ZWQgKG9wdGlvbmFsbHkpIGJ5IGFueQ0KKwkgKiBXRVAv RXh0SVYgaGVhZGVyIChidXQgb25seSBmaWxsZWQgaW4gZm9yIENDTVApLg0KKwkgKi8NCisJd2gg PSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilza2ItPmRhdGE7DQorDQorCWhkcmxlbiA9IGllZWU4 MDIxMV9oZHJsZW4od2gtPmZyYW1lX2NvbnRyb2wpOw0KKw0KKwlyZXFkX2hkcmxlbiA9IHNpemVv ZigqdHIpICsgaGVhZF9wYWQ7DQorDQorCWlmIChoZHJsZW4gIT0gcmVxZF9oZHJsZW4pDQorCQlz a2JfcHVzaChza2IsIHJlcWRfaGRybGVuIC0gaGRybGVuKTsNCisNCisJaWYgKGllZWU4MDIxMV9p c19kYXRhX3Fvcyh3aC0+ZnJhbWVfY29udHJvbCkpDQorCQloZHJsZW4gLT0gSUVFRTgwMjExX1FP U19DVExfTEVOOw0KKw0KKwl0ciA9IChzdHJ1Y3QgbXdsX2RtYV9kYXRhICopc2tiLT5kYXRhOw0K Kw0KKwlpZiAod2ggIT0gJnRyLT53aCkNCisJCW1lbW1vdmUoJnRyLT53aCwgd2gsIGhkcmxlbik7 DQorDQorCWlmIChoZHJsZW4gIT0gc2l6ZW9mKHRyLT53aCkpDQorCQltZW1zZXQoKCh2b2lkICop JnRyLT53aCkgKyBoZHJsZW4sIDAsIHNpemVvZih0ci0+d2gpIC0gaGRybGVuKTsNCisNCisJLyog RmlybXdhcmUgbGVuZ3RoIGlzIHRoZSBsZW5ndGggb2YgdGhlIGZ1bGx5IGZvcm1lZCAiODAyLjEx DQorCSAqIHBheWxvYWQiLiAgVGhhdCBpcywgZXZlcnl0aGluZyBleGNlcHQgZm9yIHRoZSA4MDIu MTEgaGVhZGVyLg0KKwkgKiBUaGlzIGluY2x1ZGVzIGFsbCBjcnlwdG8gbWF0ZXJpYWwgaW5jbHVk aW5nIHRoZSBNSUMuDQorCSAqLw0KKwl0ci0+ZndsZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAt IHNpemVvZigqdHIpICsgdGFpbF9wYWQpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXds X3R4X2VuY2Fwc3VsYXRlX2ZyYW1lKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCisJCQkJCSAgICBz dHJ1Y3Qgc2tfYnVmZiAqc2tiLA0KKwkJCQkJICAgIHN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYg KmtfY29uZiwNCisJCQkJCSAgICBib29sICpjY21wKQ0KK3sNCisJaW50IGhlYWRfcGFkID0gMDsN CisJaW50IGRhdGFfcGFkID0gMDsNCisNCisJLyogTWFrZSBzdXJlIHRoZSBwYWNrZXQgaGVhZGVy IGlzIGluIHRoZSBETUEgaGVhZGVyIGZvcm1hdCAoNC1hZGRyZXNzDQorCSAqIHdpdGhvdXQgUW9T KSwgYW5kIGFkZCBoZWFkICYgdGFpbCBwYWRkaW5nIHdoZW4gSFcgY3J5cHRvIGlzIGVuYWJsZWQu DQorCSAqDQorCSAqIFdlIGhhdmUgdGhlIGZvbGxvd2luZyB0cmFpbGVyIHBhZGRpbmcgcmVxdWly ZW1lbnRzOg0KKwkgKiAtIFdFUDogNCB0cmFpbGVyIGJ5dGVzIChJQ1YpDQorCSAqIC0gVEtJUDog MTIgdHJhaWxlciBieXRlcyAoOCBNSUMgKyA0IElDVikNCisJICogLSBDQ01QOiA4IHRyYWlsZXIg Ynl0ZXMgKE1JQykNCisJICovDQorDQorCWlmIChrX2NvbmYpIHsNCisJCWhlYWRfcGFkID0ga19j b25mLT5pdl9sZW47DQorDQorCQlzd2l0Y2ggKGtfY29uZi0+Y2lwaGVyKSB7DQorCQljYXNlIFdM QU5fQ0lQSEVSX1NVSVRFX1dFUDQwOg0KKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlURV9XRVAxMDQ6 DQorCQkJZGF0YV9wYWQgPSA0Ow0KKwkJCWJyZWFrOw0KKwkJY2FzZSBXTEFOX0NJUEhFUl9TVUlU RV9US0lQOg0KKwkJCWRhdGFfcGFkID0gMTI7DQorCQkJYnJlYWs7DQorCQljYXNlIFdMQU5fQ0lQ SEVSX1NVSVRFX0NDTVA6DQorCQkJZGF0YV9wYWQgPSA4Ow0KKwkJCSpjY21wID0gdHJ1ZTsNCisJ CQlicmVhazsNCisJCX0NCisJfQ0KKw0KKwltd2xfdHhfYWRkX2RtYV9oZWFkZXIocHJpdiwgc2ti LCBoZWFkX3BhZCwgZGF0YV9wYWQpOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4 X2luc2VydF9jY21wX2hkcih1OCAqcGNjbXBfaGRyLA0KKwkJCQkJICB1OCBrZXlfaWQsIHUxNiBp djE2LCB1MzIgaXYzMikNCit7DQorCXN0cnVjdCBjY21wX2hkciAqY2NtcF9oID0gKHN0cnVjdCBj Y21wX2hkciAqKXBjY21wX2hkcjsNCisNCisJY2NtcF9oLT5pdjE2ID0gY3B1X3RvX2xlMTYoaXYx Nik7DQorCWNjbXBfaC0+cnN2ZCA9IDA7DQorCWNjbXBfaC0+a2V5X2lkID0gRVhUX0lWIHwgKGtl eV9pZCA8PCA2KTsNCisJY2NtcF9oLT5pdjMyID0gY3B1X3RvX2xlMzIoaXYzMik7DQorfQ0KKw0K K3N0YXRpYyBpbmxpbmUgaW50IG13bF90eF90aWRfcXVldWVfbWFwcGluZyh1OCB0aWQpDQorew0K Kwlzd2l0Y2ggKHRpZCkgew0KKwljYXNlIDA6DQorCWNhc2UgMzoNCisJCXJldHVybiBJRUVFODAy MTFfQUNfQkU7DQorCWNhc2UgMToNCisJY2FzZSAyOg0KKwkJcmV0dXJuIElFRUU4MDIxMV9BQ19C SzsNCisJY2FzZSA0Og0KKwljYXNlIDU6DQorCQlyZXR1cm4gSUVFRTgwMjExX0FDX1ZJOw0KKwlj YXNlIDY6DQorCWNhc2UgNzoNCisJCXJldHVybiBJRUVFODAyMTFfQUNfVk87DQorCWRlZmF1bHQ6 DQorCQlicmVhazsNCisJfQ0KKw0KKwlyZXR1cm4gLTE7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUg dm9pZCBtd2xfdHhfY291bnRfcGFja2V0KHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHRp ZCkNCit7DQorCXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCisJc3RydWN0IG13bF90eF9pbmZv ICp0eF9zdGF0czsNCisNCisJaWYgKFdBUk5fT04odGlkID49IFNZU0FEUFRfTUFYX1RJRCkpDQor CQlyZXR1cm47DQorDQorCXN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7DQorDQorCXR4 X3N0YXRzID0gJnN0YV9pbmZvLT50eF9zdGF0c1t0aWRdOw0KKw0KKwlpZiAodHhfc3RhdHMtPnN0 YXJ0X3RpbWUgPT0gMCkNCisJCXR4X3N0YXRzLT5zdGFydF90aW1lID0gamlmZmllczsNCisNCisJ LyogcmVzZXQgdGhlIHBhY2tldCBjb3VudCBhZnRlciBlYWNoIHNlY29uZCBlbGFwc2VzLiAgSWYg dGhlIG51bWJlciBvZg0KKwkgKiBwYWNrZXRzIGV2ZXIgZXhjZWVkcyB0aGUgYW1wZHVfbWluX3Ry YWZmaWMgdGhyZXNob2xkLCB3ZSB3aWxsIGFsbG93DQorCSAqIGFuIGFtcGR1IHN0cmVhbSB0byBi ZSBzdGFydGVkLg0KKwkgKi8NCisJaWYgKGppZmZpZXMgLSB0eF9zdGF0cy0+c3RhcnRfdGltZSA+ IEhaKSB7DQorCQl0eF9zdGF0cy0+cGt0cyA9IDA7DQorCQl0eF9zdGF0cy0+c3RhcnRfdGltZSA9 IDA7DQorCX0gZWxzZSB7DQorCQl0eF9zdGF0cy0+cGt0cysrOw0KKwl9DQorfQ0KKw0KK3N0YXRp YyBpbmxpbmUgYm9vbCBtd2xfdHhfYXZhaWxhYmxlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwgaW50 IGRlc2NfbnVtKQ0KK3sNCisJc3RydWN0IG13bF90eF9obmRsICp0eF9obmRsOw0KKw0KKwl0eF9o bmRsID0gcHJpdi0+ZGVzY19kYXRhW2Rlc2NfbnVtXS5wbmV4dF90eF9obmRsOw0KKw0KKwlpZiAo IXR4X2huZGwtPnBkZXNjKQ0KKwkJcmV0dXJuIGZhbHNlOw0KKw0KKwlpZiAodHhfaG5kbC0+cGRl c2MtPnN0YXR1cyAhPSBFQUdMRV9UWERfU1RBVFVTX0lETEUpIHsNCisJCS8qIEludGVycnVwdCBG L1cgYW55d2F5ICovDQorCQlpZiAodHhfaG5kbC0+cGRlc2MtPnN0YXR1cyAmDQorCQkgICAgY3B1 X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRVU19GV19PV05FRCkpDQorCQkJd3JpdGVsKE1BQ1JFR19I MkFSSUNfQklUX1BQQV9SRUFEWSwNCisJCQkgICAgICAgcHJpdi0+aW9iYXNlMSArDQorCQkJICAg ICAgIE1BQ1JFR19SRUdfSDJBX0lOVEVSUlVQVF9FVkVOVFMpOw0KKwkJcmV0dXJuIGZhbHNlOw0K Kwl9DQorDQorCXJldHVybiB0cnVlOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4 X3NrYihzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIGludCBkZXNjX251bSwNCisJCQkgICAgICBzdHJ1 Y3Qgc2tfYnVmZiAqdHhfc2tiKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9p bmZvOw0KKwlzdHJ1Y3QgbXdsX3R4X2N0cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBtd2xfdHhfaG5k bCAqdHhfaG5kbDsNCisJc3RydWN0IG13bF90eF9kZXNjICp0eF9kZXNjOw0KKwlzdHJ1Y3QgaWVl ZTgwMjExX3N0YSAqc3RhOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOw0KKwlzdHJ1Y3Qg bXdsX3ZpZiAqbXdsX3ZpZjsNCisJc3RydWN0IGllZWU4MDIxMV9rZXlfY29uZiAqa19jb25mOw0K Kwlib29sIGNjbXAgPSBmYWxzZTsNCisJc3RydWN0IG13bF9kbWFfZGF0YSAqZG1hX2RhdGE7DQor CXN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCisJZG1hX2FkZHJfdCBkbWE7DQorDQorCWlmIChX QVJOX09OKCF0eF9za2IpKQ0KKwkJcmV0dXJuOw0KKw0KKwl0eF9pbmZvID0gSUVFRTgwMjExX1NL Ql9DQih0eF9za2IpOw0KKwl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZv LT5zdGF0dXM7DQorCXN0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqKXR4X2N0cmwtPnN0YTsN CisJdmlmID0gKHN0cnVjdCBpZWVlODAyMTFfdmlmICopdHhfY3RybC0+dmlmOw0KKwltd2xfdmlm ID0gbXdsX2Rldl9nZXRfdmlmKHZpZik7DQorCWtfY29uZiA9IChzdHJ1Y3QgaWVlZTgwMjExX2tl eV9jb25mICopdHhfY3RybC0+a19jb25mOw0KKw0KKwltd2xfdHhfZW5jYXBzdWxhdGVfZnJhbWUo cHJpdiwgdHhfc2tiLCBrX2NvbmYsICZjY21wKTsNCisNCisJZG1hX2RhdGEgPSAoc3RydWN0IG13 bF9kbWFfZGF0YSAqKXR4X3NrYi0+ZGF0YTsNCisJd2ggPSAmZG1hX2RhdGEtPndoOw0KKw0KKwlp ZiAoaWVlZTgwMjExX2lzX2RhdGEod2gtPmZyYW1lX2NvbnRyb2wpKSB7DQorCQlpZiAoaXNfbXVs dGljYXN0X2V0aGVyX2FkZHIod2gtPmFkZHIxKSkgew0KKwkJCWlmIChjY21wKSB7DQorCQkJCW13 bF90eF9pbnNlcnRfY2NtcF9oZHIoZG1hX2RhdGEtPmRhdGEsDQorCQkJCQkJICAgICAgIG13bF92 aWYtPmtleWlkeCwNCisJCQkJCQkgICAgICAgbXdsX3ZpZi0+aXYxNiwNCisJCQkJCQkgICAgICAg bXdsX3ZpZi0+aXYzMik7DQorCQkJCUlOQ1JFQVNFX0lWKG13bF92aWYtPml2MTYsIG13bF92aWYt Pml2MzIpOw0KKwkJCX0NCisJCX0gZWxzZSB7DQorCQkJaWYgKGNjbXApIHsNCisJCQkJaWYgKHZp Zi0+dHlwZSA9PSBOTDgwMjExX0lGVFlQRV9TVEFUSU9OKSB7DQorCQkJCQltd2xfdHhfaW5zZXJ0 X2NjbXBfaGRyKGRtYV9kYXRhLT5kYXRhLA0KKwkJCQkJCQkgICAgICAgbXdsX3ZpZi0+a2V5aWR4 LA0KKwkJCQkJCQkgICAgICAgbXdsX3ZpZi0+aXYxNiwNCisJCQkJCQkJICAgICAgIG13bF92aWYt Pml2MzIpOw0KKwkJCQkJSU5DUkVBU0VfSVYobXdsX3ZpZi0+aXYxNiwNCisJCQkJCQkgICAgbXds X3ZpZi0+aXYzMik7DQorCQkJCX0gZWxzZSB7DQorCQkJCQlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2lu Zm87DQorDQorCQkJCQlzdGFfaW5mbyA9IG13bF9kZXZfZ2V0X3N0YShzdGEpOw0KKw0KKwkJCQkJ bXdsX3R4X2luc2VydF9jY21wX2hkcihkbWFfZGF0YS0+ZGF0YSwNCisJCQkJCQkJICAgICAgIDAs DQorCQkJCQkJCSAgICAgICBzdGFfaW5mby0+aXYxNiwNCisJCQkJCQkJICAgICAgIHN0YV9pbmZv LT5pdjMyKTsNCisJCQkJCUlOQ1JFQVNFX0lWKHN0YV9pbmZvLT5pdjE2LA0KKwkJCQkJCSAgICBz dGFfaW5mby0+aXYzMik7DQorCQkJCX0NCisJCQl9DQorCQl9DQorCX0NCisNCisJdHhfaG5kbCA9 IHByaXYtPmRlc2NfZGF0YVtkZXNjX251bV0ucG5leHRfdHhfaG5kbDsNCisJdHhfaG5kbC0+cHNr X2J1ZmYgPSB0eF9za2I7DQorCXR4X2Rlc2MgPSB0eF9obmRsLT5wZGVzYzsNCisJdHhfZGVzYy0+ dHhfcHJpb3JpdHkgPSB0eF9jdHJsLT50eF9wcmlvcml0eTsNCisJdHhfZGVzYy0+cW9zX2N0cmwg PSBjcHVfdG9fbGUxNih0eF9jdHJsLT5xb3NfY3RybCk7DQorCXR4X2Rlc2MtPnBrdF9sZW4gPSBj cHVfdG9fbGUxNih0eF9za2ItPmxlbik7DQorCXR4X2Rlc2MtPnBhY2tldF9pbmZvID0gMDsNCisJ dHhfZGVzYy0+ZGF0YV9yYXRlID0gMDsNCisJdHhfZGVzYy0+dHlwZSA9IHR4X2N0cmwtPnR5cGU7 DQorCXR4X2Rlc2MtPnhtaXRfY29udHJvbCA9IHR4X2N0cmwtPnhtaXRfY29udHJvbDsNCisJdHhf ZGVzYy0+c2FwX3BrdF9pbmZvID0gMDsNCisJZG1hID0gcGNpX21hcF9zaW5nbGUocHJpdi0+cGRl diwgdHhfc2tiLT5kYXRhLA0KKwkJCSAgICAgdHhfc2tiLT5sZW4sIFBDSV9ETUFfVE9ERVZJQ0Up Ow0KKwlpZiAocGNpX2RtYV9tYXBwaW5nX2Vycm9yKHByaXYtPnBkZXYsIGRtYSkpIHsNCisJCWRl dl9rZnJlZV9za2JfYW55KHR4X3NrYik7DQorCQl3aXBoeV9lcnIocHJpdi0+aHctPndpcGh5LA0K KwkJCSAgImZhaWxlZCB0byBtYXAgcGNpIG1lbW9yeSFcbiIpOw0KKwkJcmV0dXJuOw0KKwl9DQor CXR4X2Rlc2MtPnBrdF9wdHIgPSBjcHVfdG9fbGUzMihkbWEpOw0KKwl0eF9kZXNjLT5zdGF0dXMg PSBjcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0ZXX09XTkVEKTsNCisJLyogbWFrZSBzdXJl IGFsbCB0aGUgbWVtb3J5IHRyYW5zYWN0aW9ucyBkb25lIGJ5IGNwdSB3ZXJlIGNvbXBsZXRlZCAq Lw0KKwl3bWIoKTsJLypEYXRhIE1lbW9yeSBCYXJyaWVyKi8NCisJd3JpdGVsKE1BQ1JFR19IMkFS SUNfQklUX1BQQV9SRUFEWSwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0gy QV9JTlRFUlJVUFRfRVZFTlRTKTsNCisJcHJpdi0+ZGVzY19kYXRhW2Rlc2NfbnVtXS5wbmV4dF90 eF9obmRsID0gdHhfaG5kbC0+cG5leHQ7DQorCXByaXYtPmZ3X2Rlc2NfY250W2Rlc2NfbnVtXSsr Ow0KK30NCisNCitzdGF0aWMgaW5saW5lIHN0cnVjdCBza19idWZmICptd2xfdHhfZG9fYW1zZHUo c3RydWN0IG13bF9wcml2ICpwcml2LA0KKwkJCQkJICAgICAgaW50IGRlc2NfbnVtLA0KKwkJCQkJ ICAgICAgc3RydWN0IHNrX2J1ZmYgKnR4X3NrYiwNCisJCQkJCSAgICAgIHN0cnVjdCBpZWVlODAy MTFfdHhfaW5mbyAqdHhfaW5mbykNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGE7DQor CXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCisJc3RydWN0IG13bF90eF9jdHJsICp0eF9jdHJs ID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0dXM7DQorCXN0cnVjdCBpZWVl ODAyMTFfdHhfaW5mbyAqYW1zZHVfaW5mbzsNCisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqYW1zZHVf cGt0czsNCisJc3RydWN0IG13bF9hbXNkdV9mcmFnICphbXNkdTsNCisJaW50IGFtc2R1X2FsbG93 X3NpemU7DQorCXN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCisJaW50IHdoX2xlbjsNCisJdTE2 IGxlbjsNCisJdTggKmRhdGE7DQorDQorCXN0YSA9IChzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqKXR4 X2N0cmwtPnN0YTsNCisJc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisNCisJaWYg KCFzdGFfaW5mby0+aXNfYW1zZHVfYWxsb3dlZCkNCisJCXJldHVybiB0eF9za2I7DQorDQorCXdo ID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfc2tiLT5kYXRhOw0KKwlpZiAoc3RhX2luZm8t PmlzX21lc2hfbm9kZSAmJiBpc19tdWx0aWNhc3RfZXRoZXJfYWRkcih3aC0+YWRkcjMpKQ0KKwkJ cmV0dXJuIHR4X3NrYjsNCisNCisJaWYgKHN0YV9pbmZvLT5hbXNkdV9jdHJsLmNhcCA9PSBNV0xf QU1TRFVfU0laRV80SykNCisJCWFtc2R1X2FsbG93X3NpemUgPSBTWVNBRFBUX0FNU0RVXzRLX01B WF9TSVpFOw0KKwllbHNlIGlmIChzdGFfaW5mby0+YW1zZHVfY3RybC5jYXAgPT0gTVdMX0FNU0RV X1NJWkVfOEspDQorCQlhbXNkdV9hbGxvd19zaXplID0gU1lTQURQVF9BTVNEVV84S19NQVhfU0la RTsNCisJZWxzZQ0KKwkJcmV0dXJuIHR4X3NrYjsNCisNCisJc3Bpbl9sb2NrX2JoKCZzdGFfaW5m by0+YW1zZHVfbG9jayk7DQorCWFtc2R1ID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdbZGVz Y19udW1dOw0KKw0KKwlpZiAodHhfc2tiLT5sZW4gPiBTWVNBRFBUX0FNU0RVX0FMTE9XX1NJWkUp IHsNCisJCWlmIChhbXNkdS0+bnVtKSB7DQorCQkJbXdsX3R4X3NrYihwcml2LCBkZXNjX251bSwg YW1zZHUtPnNrYik7DQorCQkJYW1zZHUtPm51bSA9IDA7DQorCQkJYW1zZHUtPmN1cl9wb3MgPSBO VUxMOw0KKw0KKwkJCWlmICghbXdsX3R4X2F2YWlsYWJsZShwcml2LCBkZXNjX251bSkpIHsNCisJ CQkJc2tiX3F1ZXVlX2hlYWQoJnByaXYtPnR4cVtkZXNjX251bV0sIHR4X3NrYik7DQorCQkJCXNw aW5fdW5sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQorCQkJCXJldHVybiBOVUxMOw0K KwkJCX0NCisJCX0NCisJCXNwaW5fdW5sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQor CQlyZXR1cm4gdHhfc2tiOw0KKwl9DQorDQorCS8qIHBvdGVudGlhbCBhbXNkdSBzaXplLCBzaG91 bGQgYWRkIGFtc2R1IGhlYWRlciAxNCBieXRlcyArDQorCSAqIG1heGltdW0gcGFkZGluZyAzLg0K KwkgKi8NCisJd2hfbGVuID0gaWVlZTgwMjExX2hkcmxlbih3aC0+ZnJhbWVfY29udHJvbCk7DQor CWxlbiA9IHR4X3NrYi0+bGVuIC0gd2hfbGVuICsgMTc7DQorDQorCWlmIChhbXNkdS0+bnVtKSB7 DQorCQlpZiAoKGFtc2R1LT5za2ItPmxlbiArIGxlbikgPiBhbXNkdV9hbGxvd19zaXplKSB7DQor CQkJbXdsX3R4X3NrYihwcml2LCBkZXNjX251bSwgYW1zZHUtPnNrYik7DQorCQkJYW1zZHUtPm51 bSA9IDA7DQorCQkJYW1zZHUtPmN1cl9wb3MgPSBOVUxMOw0KKwkJfQ0KKwl9DQorDQorCWFtc2R1 LT5qaWZmaWVzID0gamlmZmllczsNCisJbGVuID0gdHhfc2tiLT5sZW4gLSB3aF9sZW47DQorDQor CWlmIChhbXNkdS0+bnVtID09IDApIHsNCisJCXN0cnVjdCBza19idWZmICpuZXdza2I7DQorDQor CQlhbXNkdV9wa3RzID0gKHN0cnVjdCBza19idWZmX2hlYWQgKikNCisJCQlrbWFsbG9jKHNpemVv ZigqYW1zZHVfcGt0cyksIEdGUF9LRVJORUwpOw0KKwkJaWYgKCFhbXNkdV9wa3RzKSB7DQorCQkJ c3Bpbl91bmxvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJCQlyZXR1cm4gdHhfc2ti Ow0KKwkJfQ0KKwkJbmV3c2tiID0gZGV2X2FsbG9jX3NrYihhbXNkdV9hbGxvd19zaXplICsNCisJ CQkJICAgICAgIFNZU0FEUFRfTUlOX0JZVEVTX0hFQURST09NKTsNCisJCWlmICghbmV3c2tiKSB7 DQorCQkJc3Bpbl91bmxvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJCQlrZnJlZShh bXNkdV9wa3RzKTsNCisJCQlyZXR1cm4gdHhfc2tiOw0KKwkJfQ0KKw0KKwkJZGF0YSA9IG5ld3Nr Yi0+ZGF0YTsNCisJCW1lbWNweShkYXRhLCB0eF9za2ItPmRhdGEsIHdoX2xlbik7DQorCQlpZiAo c3RhX2luZm8tPmlzX21lc2hfbm9kZSkgew0KKwkJCWV0aGVyX2FkZHJfY29weShkYXRhICsgd2hf bGVuLCB3aC0+YWRkcjMpOw0KKwkJCWV0aGVyX2FkZHJfY29weShkYXRhICsgd2hfbGVuICsgRVRI X0FMRU4sIHdoLT5hZGRyNCk7DQorCQl9IGVsc2Ugew0KKwkJCWV0aGVyX2FkZHJfY29weShkYXRh ICsgd2hfbGVuLA0KKwkJCQkJaWVlZTgwMjExX2dldF9EQSh3aCkpOw0KKwkJCWV0aGVyX2FkZHJf Y29weShkYXRhICsgd2hfbGVuICsgRVRIX0FMRU4sDQorCQkJCQlpZWVlODAyMTFfZ2V0X1NBKHdo KSk7DQorCQl9DQorCQkqKHU4ICopKGRhdGEgKyB3aF9sZW4gKyBFVEhfSExFTiAtIDEpID0gbGVu ICYgMHhmZjsNCisJCSoodTggKikoZGF0YSArIHdoX2xlbiArIEVUSF9ITEVOIC0gMikgPSAobGVu ID4+IDgpICYgMHhmZjsNCisJCW1lbWNweShkYXRhICsgd2hfbGVuICsgRVRIX0hMRU4sIHR4X3Nr Yi0+ZGF0YSArIHdoX2xlbiwgbGVuKTsNCisNCisJCXNrYl9wdXQobmV3c2tiLCB0eF9za2ItPmxl biArIEVUSF9ITEVOKTsNCisJCXR4X2N0cmwtPnFvc19jdHJsIHw9IElFRUU4MDIxMV9RT1NfQ1RM X0FfTVNEVV9QUkVTRU5UOw0KKwkJYW1zZHVfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IobmV3c2ti KTsNCisJCW1lbWNweShhbXNkdV9pbmZvLCB0eF9pbmZvLCBzaXplb2YoKnR4X2luZm8pKTsNCisJ CXNrYl9xdWV1ZV9oZWFkX2luaXQoYW1zZHVfcGt0cyk7DQorCQkoKHN0cnVjdCBtd2xfdHhfY3Ry bCAqKSZhbXNkdV9pbmZvLT5zdGF0dXMpLT5hbXNkdV9wa3RzID0NCisJCQkodm9pZCAqKWFtc2R1 X3BrdHM7DQorCQlhbXNkdS0+c2tiID0gbmV3c2tiOw0KKwl9IGVsc2Ugew0KKwkJYW1zZHUtPmN1 cl9wb3MgKz0gYW1zZHUtPnBhZDsNCisJCWRhdGEgPSBhbXNkdS0+Y3VyX3BvczsNCisNCisJCWlm IChzdGFfaW5mby0+aXNfbWVzaF9ub2RlKSB7DQorCQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEsIHdo LT5hZGRyMyk7DQorCQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEgKyBFVEhfQUxFTiwgd2gtPmFkZHI0 KTsNCisJCX0gZWxzZSB7DQorCQkJZXRoZXJfYWRkcl9jb3B5KGRhdGEsIGllZWU4MDIxMV9nZXRf REEod2gpKTsNCisJCQlldGhlcl9hZGRyX2NvcHkoZGF0YSArIEVUSF9BTEVOLCBpZWVlODAyMTFf Z2V0X1NBKHdoKSk7DQorCQl9DQorCQkqKHU4ICopKGRhdGEgKyBFVEhfSExFTiAtIDEpID0gbGVu ICYgMHhmZjsNCisJCSoodTggKikoZGF0YSArIEVUSF9ITEVOIC0gMikgPSAobGVuID4+IDgpICYg MHhmZjsNCisJCW1lbWNweShkYXRhICsgRVRIX0hMRU4sIHR4X3NrYi0+ZGF0YSArIHdoX2xlbiwg bGVuKTsNCisNCisJCXNrYl9wdXQoYW1zZHUtPnNrYiwgbGVuICsgRVRIX0hMRU4gKyBhbXNkdS0+ cGFkKTsNCisJCWFtc2R1X2luZm8gPSBJRUVFODAyMTFfU0tCX0NCKGFtc2R1LT5za2IpOw0KKwkJ YW1zZHVfcGt0cyA9IChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICopDQorCQkJKChzdHJ1Y3QgbXdsX3R4 X2N0cmwgKikmYW1zZHVfaW5mby0+c3RhdHVzKS0+YW1zZHVfcGt0czsNCisJfQ0KKw0KKwlhbXNk dS0+bnVtKys7DQorCWFtc2R1LT5wYWQgPSAoKGxlbiArIEVUSF9ITEVOKSAlIDQpID8gKDQgLSAo bGVuICsgRVRIX0hMRU4pICUgNCkgOiAwOw0KKwlhbXNkdS0+Y3VyX3BvcyA9IGFtc2R1LT5za2It PmRhdGEgKyBhbXNkdS0+c2tiLT5sZW47DQorCXNrYl9xdWV1ZV90YWlsKGFtc2R1X3BrdHMsIHR4 X3NrYik7DQorDQorCWlmIChhbXNkdS0+bnVtID4gU1lTQURQVF9BTVNEVV9QQUNLRVRfVEhSRVNI T0xEKSB7DQorCQlhbXNkdS0+bnVtID0gMDsNCisJCWFtc2R1LT5jdXJfcG9zID0gTlVMTDsNCisJ CXNwaW5fdW5sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQorCQlyZXR1cm4gYW1zZHUt PnNrYjsNCisJfQ0KKw0KKwlzcGluX3VubG9ja19iaCgmc3RhX2luZm8tPmFtc2R1X2xvY2spOw0K KwlyZXR1cm4gTlVMTDsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIG13bF90eF9za2JzKHN0 cnVjdCBpZWVlODAyMTFfaHcgKmh3KQ0KK3sNCisJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHct PnByaXY7DQorCWludCBudW0gPSBTWVNBRFBUX1RYX1dNTV9RVUVVRVM7DQorCXN0cnVjdCBza19i dWZmICp0eF9za2I7DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+dHhfZGVzY19sb2NrKTsNCisJ d2hpbGUgKG51bS0tKSB7DQorCQl3aGlsZSAoc2tiX3F1ZXVlX2xlbigmcHJpdi0+dHhxW251bV0p ID4gMCkgew0KKwkJCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCisJCQlzdHJ1 Y3QgbXdsX3R4X2N0cmwgKnR4X2N0cmw7DQorDQorCQkJaWYgKCFtd2xfdHhfYXZhaWxhYmxlKHBy aXYsIG51bSkpDQorCQkJCWJyZWFrOw0KKw0KKwkJCXR4X3NrYiA9IHNrYl9kZXF1ZXVlKCZwcml2 LT50eHFbbnVtXSk7DQorCQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IodHhfc2tiKTsNCisJ CQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0dXM7DQorDQor CQkJaWYgKCh0eF9za2ItPnByb3RvY29sICE9IGNwdV90b19iZTE2KEVUSF9QX1BBRSkpICYmDQor CQkJICAgICh0eF9jdHJsLT50eF9wcmlvcml0eSA+PSBTWVNBRFBUX1RYX1dNTV9RVUVVRVMpKSB7 DQorCQkJCXR4X3NrYiA9IG13bF90eF9kb19hbXNkdShwcml2LCBudW0sDQorCQkJCQkJCSB0eF9z a2IsIHR4X2luZm8pOw0KKwkJCX0NCisNCisJCQlpZiAodHhfc2tiKQ0KKwkJCQltd2xfdHhfc2ti KHByaXYsIG51bSwgdHhfc2tiKTsNCisJCX0NCisNCisJCWlmIChza2JfcXVldWVfbGVuKCZwcml2 LT50eHFbbnVtXSkgPA0KKwkJICAgIFNZU0FEUFRfVFhfV0FLRV9RX1RIUkVTSE9MRCkgew0KKwkJ CWludCBxdWV1ZTsNCisNCisJCQlxdWV1ZSA9IFNZU0FEUFRfVFhfV01NX1FVRVVFUyAtIG51bSAt IDE7DQorCQkJaWYgKGllZWU4MDIxMV9xdWV1ZV9zdG9wcGVkKGh3LCBxdWV1ZSkpDQorCQkJCWll ZWU4MDIxMV93YWtlX3F1ZXVlKGh3LCBxdWV1ZSk7DQorCQl9DQorCX0NCisJc3Bpbl91bmxvY2tf YmgoJnByaXYtPnR4X2Rlc2NfbG9jayk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xf dHhfcHJlcGFyZV9pbmZvKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LCB1MzIgcmF0ZSwNCisJCQkJ ICAgICAgIHN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqaW5mbykNCit7DQorCXUzMiBmb3JtYXQs IGJhbmR3aWR0aCwgc2hvcnRfZ2ksIHJhdGVfaWQ7DQorDQorCWllZWU4MDIxMV90eF9pbmZvX2Ns ZWFyX3N0YXR1cyhpbmZvKTsNCisNCisJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmlkeCA9IC0xOw0K KwlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSAwOw0KKwlpbmZvLT5zdGF0dXMucmF0ZXNb MF0uZmxhZ3MgPSAwOw0KKw0KKwlpZiAocmF0ZSkgew0KKwkJLyogUHJlcGFyZSByYXRlIGluZm9y bWF0aW9uICovDQorCQlmb3JtYXQgPSByYXRlICYgTVdMX1RYX1JBVEVfRk9STUFUX01BU0s7DQor CQliYW5kd2lkdGggPQ0KKwkJCShyYXRlICYgTVdMX1RYX1JBVEVfQkFORFdJRFRIX01BU0spID4+ DQorCQkJTVdMX1RYX1JBVEVfQkFORFdJRFRIX1NISUZUOw0KKwkJc2hvcnRfZ2kgPSAocmF0ZSAm IE1XTF9UWF9SQVRFX1NIT1JUR0lfTUFTSykgPj4NCisJCQlNV0xfVFhfUkFURV9TSE9SVEdJX1NI SUZUOw0KKwkJcmF0ZV9pZCA9IChyYXRlICYgTVdMX1RYX1JBVEVfUkFURUlETUNTX01BU0spID4+ DQorCQkJTVdMX1RYX1JBVEVfUkFURUlETUNTX1NISUZUOw0KKw0KKwkJaW5mby0+c3RhdHVzLnJh dGVzWzBdLmlkeCA9IHJhdGVfaWQ7DQorCQlpZiAoZm9ybWF0ID09IFRYX1JBVEVfRk9STUFUX0xF R0FDWSkgew0KKwkJCWlmIChody0+Y29uZi5jaGFuZGVmLmNoYW4tPmh3X3ZhbHVlID4NCisJCQkg ICAgQkFORF8yNF9DSEFOTkVMX05VTSkgew0KKwkJCQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uaWR4 IC09IDU7DQorCQkJfQ0KKwkJfQ0KKwkJaWYgKGZvcm1hdCA9PSBUWF9SQVRFX0ZPUk1BVF8xMU4p DQorCQkJaW5mby0+c3RhdHVzLnJhdGVzWzBdLmZsYWdzIHw9DQorCQkJCUlFRUU4MDIxMV9UWF9S Q19NQ1M7DQorCQlpZiAoZm9ybWF0ID09IFRYX1JBVEVfRk9STUFUXzExQUMpDQorCQkJaW5mby0+ c3RhdHVzLnJhdGVzWzBdLmZsYWdzIHw9DQorCQkJCUlFRUU4MDIxMV9UWF9SQ19WSFRfTUNTOw0K KwkJaWYgKGJhbmR3aWR0aCA9PSBUWF9SQVRFX0JBTkRXSURUSF80MCkNCisJCQlpbmZvLT5zdGF0 dXMucmF0ZXNbMF0uZmxhZ3MgfD0NCisJCQkJSUVFRTgwMjExX1RYX1JDXzQwX01IWl9XSURUSDsN CisJCWlmIChiYW5kd2lkdGggPT0gVFhfUkFURV9CQU5EV0lEVEhfODApDQorCQkJaW5mby0+c3Rh dHVzLnJhdGVzWzBdLmZsYWdzIHw9DQorCQkJCUlFRUU4MDIxMV9UWF9SQ184MF9NSFpfV0lEVEg7 DQorCQlpZiAoc2hvcnRfZ2kgPT0gVFhfUkFURV9JTkZPX1NIT1JUX0dJKQ0KKwkJCWluZm8tPnN0 YXR1cy5yYXRlc1swXS5mbGFncyB8PQ0KKwkJCQlJRUVFODAyMTFfVFhfUkNfU0hPUlRfR0k7DQor CQlpbmZvLT5zdGF0dXMucmF0ZXNbMF0uY291bnQgPSAxOw0KKwkJaW5mby0+c3RhdHVzLnJhdGVz WzFdLmlkeCA9IC0xOw0KKwl9DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfYWNr X2Ftc2R1X3BrdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsIHUzMiByYXRlLA0KKwkJCQkJIHN0 cnVjdCBza19idWZmX2hlYWQgKmFtc2R1X3BrdHMpDQorew0KKwlzdHJ1Y3Qgc2tfYnVmZiAqYW1z ZHVfcGt0Ow0KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2luZm8gKmluZm87DQorDQorCXdoaWxlIChz a2JfcXVldWVfbGVuKGFtc2R1X3BrdHMpID4gMCkgew0KKwkJYW1zZHVfcGt0ID0gc2tiX2RlcXVl dWUoYW1zZHVfcGt0cyk7DQorCQlpbmZvID0gSUVFRTgwMjExX1NLQl9DQihhbXNkdV9wa3QpOw0K KwkJbXdsX3R4X3ByZXBhcmVfaW5mbyhodywgcmF0ZSwgaW5mbyk7DQorCQlpbmZvLT5mbGFncyAm PSB+SUVFRTgwMjExX1RYX0NUTF9BTVBEVTsNCisJCWluZm8tPmZsYWdzIHw9IElFRUU4MDIxMV9U WF9TVEFUX0FDSzsNCisJCWllZWU4MDIxMV90eF9zdGF0dXMoaHcsIGFtc2R1X3BrdCk7DQorCX0N CisNCisJa2ZyZWUoYW1zZHVfcGt0cyk7DQorfQ0KKw0KK2ludCBtd2xfdHhfaW5pdChzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodykNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2 Ow0KKwlpbnQgcmM7DQorDQorCXNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPmRlbGF5X3EpOw0K Kw0KKwlyYyA9IG13bF90eF9yaW5nX2FsbG9jKHByaXYpOw0KKwlpZiAocmMpIHsNCisJCXdpcGh5 X2Vycihody0+d2lwaHksICJhbGxvY2F0aW5nIFRYIHJpbmcgZmFpbGVkXG4iKTsNCisJCXJldHVy biByYzsNCisJfQ0KKw0KKwlyYyA9IG13bF90eF9yaW5nX2luaXQocHJpdik7DQorCWlmIChyYykg ew0KKwkJbXdsX3R4X3JpbmdfZnJlZShwcml2KTsNCisJCXdpcGh5X2Vycihody0+d2lwaHksICJp bml0aWFsaXppbmcgVFggcmluZyBmYWlsZWRcbiIpOw0KKwkJcmV0dXJuIHJjOw0KKwl9DQorDQor CXJldHVybiAwOw0KK30NCisNCit2b2lkIG13bF90eF9kZWluaXQoc3RydWN0IGllZWU4MDIxMV9o dyAqaHcpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisNCisJc2ti X3F1ZXVlX3B1cmdlKCZwcml2LT5kZWxheV9xKTsNCisNCisJbXdsX3R4X3JpbmdfY2xlYW51cChw cml2KTsNCisJbXdsX3R4X3JpbmdfZnJlZShwcml2KTsNCit9DQorDQordm9pZCBtd2xfdHhfeG1p dChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJCSBzdHJ1Y3QgaWVlZTgwMjExX3R4X2NvbnRy b2wgKmNvbnRyb2wsDQorCQkgc3RydWN0IHNrX2J1ZmYgKnNrYikNCit7DQorCXN0cnVjdCBtd2xf cHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlpbnQgaW5kZXg7DQorCXN0cnVjdCBpZWVlODAyMTFf c3RhICpzdGE7DQorCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCisJc3RydWN0 IG13bF92aWYgKm13bF92aWY7DQorCXN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCisJdTggeG1p dGNvbnRyb2w7DQorCXUxNiBxb3M7DQorCWludCB0eHByaW9yaXR5Ow0KKwl1OCB0aWQgPSAwOw0K KwlzdHJ1Y3QgbXdsX2FtcGR1X3N0cmVhbSAqc3RyZWFtID0gTlVMTDsNCisJYm9vbCBzdGFydF9i YV9zZXNzaW9uID0gZmFsc2U7DQorCWJvb2wgbWdtdGZyYW1lID0gZmFsc2U7DQorCXN0cnVjdCBp ZWVlODAyMTFfbWdtdCAqbWdtdDsNCisJYm9vbCBlYXBvbF9mcmFtZSA9IGZhbHNlOw0KKwlzdHJ1 Y3QgbXdsX3R4X2N0cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBpZWVlODAyMTFfa2V5X2NvbmYgKmtf Y29uZiA9IE5VTEw7DQorDQorCWluZGV4ID0gc2tiX2dldF9xdWV1ZV9tYXBwaW5nKHNrYik7DQor CXN0YSA9IGNvbnRyb2wtPnN0YTsNCisNCisJd2ggPSAoc3RydWN0IGllZWU4MDIxMV9oZHIgKilz a2ItPmRhdGE7DQorDQorCWlmIChpZWVlODAyMTFfaXNfZGF0YV9xb3Mod2gtPmZyYW1lX2NvbnRy b2wpKQ0KKwkJcW9zID0gKigodTE2ICopaWVlZTgwMjExX2dldF9xb3NfY3RsKHdoKSk7DQorCWVs c2UNCisJCXFvcyA9IDA7DQorDQorCWlmIChza2ItPnByb3RvY29sID09IGNwdV90b19iZTE2KEVU SF9QX1BBRSkpIHsNCisJCWluZGV4ID0gSUVFRTgwMjExX0FDX1ZPOw0KKwkJZWFwb2xfZnJhbWUg PSB0cnVlOw0KKwl9DQorDQorCWlmIChpZWVlODAyMTFfaXNfbWdtdCh3aC0+ZnJhbWVfY29udHJv bCkpIHsNCisJCW1nbXRmcmFtZSA9IHRydWU7DQorCQltZ210ID0gKHN0cnVjdCBpZWVlODAyMTFf bWdtdCAqKXNrYi0+ZGF0YTsNCisJfQ0KKw0KKwl0eF9pbmZvID0gSUVFRTgwMjExX1NLQl9DQihz a2IpOw0KKwltd2xfdmlmID0gbXdsX2Rldl9nZXRfdmlmKHR4X2luZm8tPmNvbnRyb2wudmlmKTsN CisNCisJaWYgKHR4X2luZm8tPmZsYWdzICYgSUVFRTgwMjExX1RYX0NUTF9BU1NJR05fU0VRKSB7 DQorCQl3aC0+c2VxX2N0cmwgJj0gY3B1X3RvX2xlMTYoSUVFRTgwMjExX1NDVExfRlJBRyk7DQor CQl3aC0+c2VxX2N0cmwgfD0gY3B1X3RvX2xlMTYobXdsX3ZpZi0+c2Vxbm8pOw0KKwkJbXdsX3Zp Zi0+c2Vxbm8gKz0gMHgxMDsNCisJfQ0KKw0KKwkvKiBTZXR1cCBmaXJtd2FyZSBjb250cm9sIGJp dCBmaWVsZHMgZm9yIGVhY2ggZnJhbWUgdHlwZS4gKi8NCisJeG1pdGNvbnRyb2wgPSAwOw0KKw0K KwlpZiAobWdtdGZyYW1lIHx8IGllZWU4MDIxMV9pc19jdGwod2gtPmZyYW1lX2NvbnRyb2wpKSB7 DQorCQlxb3MgPSAwOw0KKwl9IGVsc2UgaWYgKGllZWU4MDIxMV9pc19kYXRhKHdoLT5mcmFtZV9j b250cm9sKSkgew0KKwkJcW9zICY9IH5NV0xfUU9TX0FDS19QT0xJQ1lfTUFTSzsNCisNCisJCWlm ICh0eF9pbmZvLT5mbGFncyAmIElFRUU4MDIxMV9UWF9DVExfQU1QRFUpIHsNCisJCQl4bWl0Y29u dHJvbCAmPSAweGZiOw0KKwkJCXFvcyB8PSBNV0xfUU9TX0FDS19QT0xJQ1lfQkxPQ0tBQ0s7DQor CQl9IGVsc2Ugew0KKwkJCXhtaXRjb250cm9sIHw9IDB4NDsNCisJCQlxb3MgfD0gTVdMX1FPU19B Q0tfUE9MSUNZX05PUk1BTDsNCisJCX0NCisNCisJCWlmIChpc19tdWx0aWNhc3RfZXRoZXJfYWRk cih3aC0+YWRkcjEpKQ0KKwkJCXhtaXRjb250cm9sIHw9IEVBR0xFX1RYRF9YTUlUQ1RSTF9VU0Vf TUNfUkFURTsNCisNCisJCWtfY29uZiA9IHR4X2luZm8tPmNvbnRyb2wuaHdfa2V5Ow0KKwl9DQor DQorCS8qIFF1ZXVlIEFEREJBIHJlcXVlc3QgaW4gdGhlIHJlc3BlY3RpdmUgZGF0YSBxdWV1ZS4g IFdoaWxlIHNldHRpbmcgdXANCisJICogdGhlIGFtcGR1IHN0cmVhbSwgbWFjODAyMTEgcXVldWVz IGZ1cnRoZXIgcGFja2V0cyBmb3IgdGhhdA0KKwkgKiBwYXJ0aWN1bGFyIHJhL3RpZCBwYWlyLiAg SG93ZXZlciwgcGFja2V0cyBwaWxlZCB1cCBpbiB0aGUgaGFyZHdhcmUNCisJICogZm9yIHRoYXQg cmEvdGlkIHBhaXIgd2lsbCBzdGlsbCBnbyBvdXQuIEFEREJBIHJlcXVlc3QgYW5kIHRoZQ0KKwkg KiByZWxhdGVkIGRhdGEgcGFja2V0cyBnb2luZyBvdXQgZnJvbSBkaWZmZXJlbnQgcXVldWVzIGFz eW5jaHJvbm91c2x5DQorCSAqIHdpbGwgY2F1c2UgYSBzaGlmdCBpbiB0aGUgcmVjZWl2ZXIgd2lu ZG93IHdoaWNoIG1pZ2h0IHJlc3VsdCBpbg0KKwkgKiBhbXBkdSBwYWNrZXRzIGdldHRpbmcgZHJv cHBlZCBhdCB0aGUgcmVjZWl2ZXIgYWZ0ZXIgdGhlIHN0cmVhbSBoYXMNCisJICogYmVlbiBzZXR1 cC4NCisJICovDQorCWlmIChtZ210ZnJhbWUpIHsNCisJCXUxNiBjYXBhYjsNCisNCisJCWlmICh1 bmxpa2VseShpZWVlODAyMTFfaXNfYWN0aW9uKHdoLT5mcmFtZV9jb250cm9sKSAmJg0KKwkJCSAg ICAgbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPT0gV0xBTl9DQVRFR09SWV9CQUNLICYmDQorCQkJ ICAgICBtZ210LT51LmFjdGlvbi51LmFkZGJhX3JlcS5hY3Rpb25fY29kZSA9PQ0KKwkJCSAgICAg V0xBTl9BQ1RJT05fQUREQkFfUkVRKSkgew0KKwkJCWNhcGFiID0gbGUxNl90b19jcHUobWdtdC0+ dS5hY3Rpb24udS5hZGRiYV9yZXEuY2FwYWIpOw0KKwkJCXRpZCA9IChjYXBhYiAmIElFRUU4MDIx MV9BRERCQV9QQVJBTV9USURfTUFTSykgPj4gMjsNCisJCQlpbmRleCA9IG13bF90eF90aWRfcXVl dWVfbWFwcGluZyh0aWQpOw0KKwkJCWNhcGFiIHw9IDE7DQorCQkJbWdtdC0+dS5hY3Rpb24udS5h ZGRiYV9yZXEuY2FwYWIgPSBjcHVfdG9fbGUxNihjYXBhYik7DQorCQl9DQorDQorCQlpZiAodW5s aWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJhbWVfY29udHJvbCkgJiYNCisJCQkgICAg IG1nbXQtPnUuYWN0aW9uLmNhdGVnb3J5ID09IFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KKwkJCSAg ICAgbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmFjdGlvbl9jb2RlID09DQorCQkJICAgICBX TEFOX0FDVElPTl9BRERCQV9SRVNQKSkgew0KKwkJCWNhcGFiID0gbGUxNl90b19jcHUobWdtdC0+ dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiKTsNCisJCQljYXBhYiB8PSAxOw0KKwkJCW1nbXQt PnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5jYXBhYiA9IGNwdV90b19sZTE2KGNhcGFiKTsNCisJCX0N CisJfQ0KKw0KKwlpbmRleCA9IFNZU0FEUFRfVFhfV01NX1FVRVVFUyAtIGluZGV4IC0gMTsNCisJ dHhwcmlvcml0eSA9IGluZGV4Ow0KKw0KKwlpZiAoc3RhICYmIHN0YS0+aHRfY2FwLmh0X3N1cHBv cnRlZCAmJiAhZWFwb2xfZnJhbWUgJiYNCisJICAgIGllZWU4MDIxMV9pc19kYXRhX3Fvcyh3aC0+ ZnJhbWVfY29udHJvbCkpIHsNCisJCXRpZCA9IHFvcyAmIDB4ZjsNCisJCW13bF90eF9jb3VudF9w YWNrZXQoc3RhLCB0aWQpOw0KKw0KKwkJc3Bpbl9sb2NrX2JoKCZwcml2LT5zdHJlYW1fbG9jayk7 DQorCQlzdHJlYW0gPSBtd2xfZndjbWRfbG9va3VwX3N0cmVhbShodywgc3RhLT5hZGRyLCB0aWQp Ow0KKw0KKwkJaWYgKHN0cmVhbSkgew0KKwkJCWlmIChzdHJlYW0tPnN0YXRlID09IEFNUERVX1NU UkVBTV9BQ1RJVkUpIHsNCisJCQkJaWYgKFdBUk5fT04oIShxb3MgJg0KKwkJCQkJICAgIE1XTF9R T1NfQUNLX1BPTElDWV9CTE9DS0FDSykpKSB7DQorCQkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+ c3RyZWFtX2xvY2spOw0KKwkJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisJCQkJCXJldHVy bjsNCisJCQkJfQ0KKw0KKwkJCQl0eHByaW9yaXR5ID0NCisJCQkJCShTWVNBRFBUX1RYX1dNTV9R VUVVRVMgKyBzdHJlYW0tPmlkeCkgJQ0KKwkJCQkJU1lTQURQVF9UT1RBTF9IV19RVUVVRVM7DQor CQkJfSBlbHNlIGlmIChzdHJlYW0tPnN0YXRlID09IEFNUERVX1NUUkVBTV9ORVcpIHsNCisJCQkJ LyogV2UgZ2V0IGhlcmUgaWYgdGhlIGRyaXZlciBzZW5kcyB1cyBwYWNrZXRzDQorCQkJCSAqIGFm dGVyIHdlJ3ZlIGluaXRpYXRlZCBhIHN0cmVhbSwgYnV0IGJlZm9yZQ0KKwkJCQkgKiBvdXIgYW1w ZHVfYWN0aW9uIHJvdXRpbmUgaGFzIGJlZW4gY2FsbGVkDQorCQkJCSAqIHdpdGggSUVFRTgwMjEx X0FNUERVX1RYX1NUQVJUIHRvIGdldCB0aGUgU1NODQorCQkJCSAqIGZvciB0aGUgQUREQkEgcmVx dWVzdC4gIFNvIHRoaXMgcGFja2V0IGNhbg0KKwkJCQkgKiBnbyBvdXQgd2l0aCBubyByaXNrIG9m IHNlcXVlbmNlIG51bWJlcg0KKwkJCQkgKiBtaXNtYXRjaC4gIE5vIHNwZWNpYWwgaGFuZGxpbmcg aXMgcmVxdWlyZWQuDQorCQkJCSAqLw0KKwkJCX0gZWxzZSB7DQorCQkJCS8qIERyb3AgcGFja2V0 cyB0aGF0IHdvdWxkIGdvIG91dCBhZnRlciB0aGUNCisJCQkJICogQUREQkEgcmVxdWVzdCB3YXMg c2VudCBidXQgYmVmb3JlIHRoZSBBRERCQQ0KKwkJCQkgKiByZXNwb25zZSBpcyByZWNlaXZlZC4g IElmIHdlIGRvbid0IGRvIHRoaXMsDQorCQkJCSAqIHRoZSByZWNpcGllbnQgd291bGQgcHJvYmFi bHkgcmVjZWl2ZSBpdA0KKwkJCQkgKiBhZnRlciB0aGUgQUREQkEgcmVxdWVzdCB3aXRoIFNTTiAw LiAgVGhpcw0KKwkJCQkgKiB3aWxsIGNhdXNlIHRoZSByZWNpcGllbnQncyBCQSByZWNlaXZlIHdp bmRvdw0KKwkJCQkgKiB0byBzaGlmdCwgd2hpY2ggd291bGQgY2F1c2UgdGhlIHN1YnNlcXVlbnQN CisJCQkJICogcGFja2V0cyBpbiB0aGUgQkEgc3RyZWFtIHRvIGJlIGRpc2NhcmRlZC4NCisJCQkJ ICogbWFjODAyMTEgcXVldWVzIG91ciBwYWNrZXRzIGZvciB1cyBpbiB0aGlzDQorCQkJCSAqIGNh c2UsIHNvIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYWZldHkgY2hlY2suDQorCQkJCSAqLw0KKwkJ CQl3aXBoeV93YXJuKGh3LT53aXBoeSwNCisJCQkJCSAgICJjYW4ndCBzZW5kIHBhY2tldCBkdXJp bmcgQUREQkFcbiIpOw0KKwkJCQlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0K KwkJCQlkZXZfa2ZyZWVfc2tiX2FueShza2IpOw0KKwkJCQlyZXR1cm47DQorCQkJfQ0KKwkJfSBl bHNlIHsNCisJCQlpZiAobXdsX2Z3Y21kX2FtcGR1X2FsbG93ZWQoc3RhLCB0aWQpKSB7DQorCQkJ CXN0cmVhbSA9IG13bF9md2NtZF9hZGRfc3RyZWFtKGh3LCBzdGEsIHRpZCk7DQorDQorCQkJCWlm IChzdHJlYW0pDQorCQkJCQlzdGFydF9iYV9zZXNzaW9uID0gdHJ1ZTsNCisJCQl9DQorCQl9DQor DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KKwl9IGVsc2Ugew0KKwkJ cW9zICY9IH5NV0xfUU9TX0FDS19QT0xJQ1lfTUFTSzsNCisJCXFvcyB8PSBNV0xfUU9TX0FDS19Q T0xJQ1lfTk9STUFMOw0KKwl9DQorDQorCXR4X2N0cmwgPSAoc3RydWN0IG13bF90eF9jdHJsICop JnR4X2luZm8tPnN0YXR1czsNCisJdHhfY3RybC0+dmlmID0gKHZvaWQgKil0eF9pbmZvLT5jb250 cm9sLnZpZjsNCisJdHhfY3RybC0+c3RhID0gKHZvaWQgKilzdGE7DQorCXR4X2N0cmwtPmtfY29u ZiA9ICh2b2lkICopa19jb25mOw0KKwl0eF9jdHJsLT5hbXNkdV9wa3RzID0gTlVMTDsNCisJdHhf Y3RybC0+dHhfcHJpb3JpdHkgPSB0eHByaW9yaXR5Ow0KKwl0eF9jdHJsLT50eXBlID0gKG1nbXRm cmFtZSA/IElFRUVfVFlQRV9NQU5BR0VNRU5UIDogSUVFRV9UWVBFX0RBVEEpOw0KKwl0eF9jdHJs LT5xb3NfY3RybCA9IHFvczsNCisJdHhfY3RybC0+eG1pdF9jb250cm9sID0geG1pdGNvbnRyb2w7 DQorDQorCWlmIChza2JfcXVldWVfbGVuKCZwcml2LT50eHFbaW5kZXhdKSA+IHByaXYtPnR4cV9s aW1pdCkNCisJCWllZWU4MDIxMV9zdG9wX3F1ZXVlKGh3LCBTWVNBRFBUX1RYX1dNTV9RVUVVRVMg LSBpbmRleCAtIDEpOw0KKw0KKwlza2JfcXVldWVfdGFpbCgmcHJpdi0+dHhxW2luZGV4XSwgc2ti KTsNCisNCisJbXdsX3R4X3NrYnMoaHcpOw0KKw0KKwkvKiBJbml0aWF0ZSB0aGUgYW1wZHUgc2Vz c2lvbiBoZXJlICovDQorCWlmIChzdGFydF9iYV9zZXNzaW9uKSB7DQorCQlzcGluX2xvY2tfYmgo JnByaXYtPnN0cmVhbV9sb2NrKTsNCisJCWlmIChtd2xfZndjbWRfc3RhcnRfc3RyZWFtKGh3LCBz dHJlYW0pKQ0KKwkJCW13bF9md2NtZF9yZW1vdmVfc3RyZWFtKGh3LCBzdHJlYW0pOw0KKwkJc3Bp bl91bmxvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCisJfQ0KK30NCisNCit2b2lkIG13bF90 eF9kZWxfcGt0c192aWFfdmlmKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3LA0KKwkJCSAgICAgc3Ry dWN0IGllZWU4MDIxMV92aWYgKnZpZikNCit7DQorCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3 LT5wcml2Ow0KKwlpbnQgbnVtOw0KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOw0KKwlzdHJ1 Y3QgaWVlZTgwMjExX3R4X2luZm8gKnR4X2luZm87DQorCXN0cnVjdCBtd2xfdHhfY3RybCAqdHhf Y3RybDsNCisJc3RydWN0IHNrX2J1ZmZfaGVhZCAqYW1zZHVfcGt0czsNCisNCisJZm9yIChudW0g PSAxOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQorCQlzcGluX2xv Y2tfYmgoJnByaXYtPnR4cVtudW1dLmxvY2spOw0KKwkJc2tiX3F1ZXVlX3dhbGtfc2FmZSgmcHJp di0+dHhxW251bV0sIHNrYiwgdG1wKSB7DQorCQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Io c2tiKTsNCisJCQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0 dXM7DQorCQkJaWYgKHR4X2N0cmwtPnZpZiA9PSB2aWYpIHsNCisJCQkJYW1zZHVfcGt0cyA9IChz dHJ1Y3Qgc2tfYnVmZl9oZWFkICopDQorCQkJCQl0eF9jdHJsLT5hbXNkdV9wa3RzOw0KKwkJCQlp ZiAoYW1zZHVfcGt0cykgew0KKwkJCQkJc2tiX3F1ZXVlX3B1cmdlKGFtc2R1X3BrdHMpOw0KKwkJ CQkJa2ZyZWUoYW1zZHVfcGt0cyk7DQorCQkJCX0NCisJCQkJX19za2JfdW5saW5rKHNrYiwgJnBy aXYtPnR4cVtudW1dKTsNCisJCQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiKTsNCisJCQl9DQorCQl9 DQorCQlzcGluX3VubG9ja19iaCgmcHJpdi0+dHhxW251bV0ubG9jayk7DQorCX0NCit9DQorDQor dm9pZCBtd2xfdHhfZGVsX3BrdHNfdmlhX3N0YShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCisJ CQkgICAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEpDQorew0KKwlzdHJ1Y3QgbXdsX3ByaXYg KnByaXYgPSBody0+cHJpdjsNCisJaW50IG51bTsNCisJc3RydWN0IHNrX2J1ZmYgKnNrYiwgKnRt cDsNCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICp0eF9pbmZvOw0KKwlzdHJ1Y3QgbXdsX3R4 X2N0cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBza19idWZmX2hlYWQgKmFtc2R1X3BrdHM7DQorDQor CWZvciAobnVtID0gMTsgbnVtIDwgU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBOyBudW0rKykgew0K KwkJc3Bpbl9sb2NrX2JoKCZwcml2LT50eHFbbnVtXS5sb2NrKTsNCisJCXNrYl9xdWV1ZV93YWxr X3NhZmUoJnByaXYtPnR4cVtudW1dLCBza2IsIHRtcCkgew0KKwkJCXR4X2luZm8gPSBJRUVFODAy MTFfU0tCX0NCKHNrYik7DQorCQkJdHhfY3RybCA9IChzdHJ1Y3QgbXdsX3R4X2N0cmwgKikmdHhf aW5mby0+c3RhdHVzOw0KKwkJCWlmICh0eF9jdHJsLT5zdGEgPT0gc3RhKSB7DQorCQkJCWFtc2R1 X3BrdHMgPSAoc3RydWN0IHNrX2J1ZmZfaGVhZCAqKQ0KKwkJCQkJdHhfY3RybC0+YW1zZHVfcGt0 czsNCisJCQkJaWYgKGFtc2R1X3BrdHMpIHsNCisJCQkJCXNrYl9xdWV1ZV9wdXJnZShhbXNkdV9w a3RzKTsNCisJCQkJCWtmcmVlKGFtc2R1X3BrdHMpOw0KKwkJCQl9DQorCQkJCV9fc2tiX3VubGlu ayhza2IsICZwcml2LT50eHFbbnVtXSk7DQorCQkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7DQor CQkJfQ0KKwkJfQ0KKwkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPnR4cVtudW1dLmxvY2spOw0KKwl9 DQorfQ0KKw0KK3ZvaWQgbXdsX3R4X2RlbF9hbXBkdV9wa3RzKHN0cnVjdCBpZWVlODAyMTFfaHcg Kmh3LA0KKwkJCSAgIHN0cnVjdCBpZWVlODAyMTFfc3RhICpzdGEsIHU4IHRpZCkNCit7DQorCXN0 cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5wcml2Ow0KKwlzdHJ1Y3QgbXdsX3N0YSAqc3RhX2lu Zm8gPSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCisJaW50IGRlc2NfbnVtID0gU1lTQURQVF9UWF9X TU1fUVVFVUVTIC0gdGlkIC0gMTsNCisJc3RydWN0IG13bF9hbXNkdV9mcmFnICphbXNkdV9mcmFn Ow0KKwlzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCAqdG1wOw0KKwlzdHJ1Y3QgaWVlZTgwMjExX3R4X2lu Zm8gKnR4X2luZm87DQorCXN0cnVjdCBtd2xfdHhfY3RybCAqdHhfY3RybDsNCisJc3RydWN0IHNr X2J1ZmZfaGVhZCAqYW1zZHVfcGt0czsNCisNCisJc3Bpbl9sb2NrX2JoKCZwcml2LT50eHFbZGVz Y19udW1dLmxvY2spOw0KKwlza2JfcXVldWVfd2Fsa19zYWZlKCZwcml2LT50eHFbZGVzY19udW1d LCBza2IsIHRtcCkgew0KKwkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0Ioc2tiKTsNCisJCXR4 X2N0cmwgPSAoc3RydWN0IG13bF90eF9jdHJsICopJnR4X2luZm8tPnN0YXR1czsNCisJCWlmICh0 eF9jdHJsLT5zdGEgPT0gc3RhKSB7DQorCQkJYW1zZHVfcGt0cyA9IChzdHJ1Y3Qgc2tfYnVmZl9o ZWFkICopDQorCQkJCXR4X2N0cmwtPmFtc2R1X3BrdHM7DQorCQkJaWYgKGFtc2R1X3BrdHMpIHsN CisJCQkJc2tiX3F1ZXVlX3B1cmdlKGFtc2R1X3BrdHMpOw0KKwkJCQlrZnJlZShhbXNkdV9wa3Rz KTsNCisJCQl9DQorCQkJX19za2JfdW5saW5rKHNrYiwgJnByaXYtPnR4cVtkZXNjX251bV0pOw0K KwkJCWRldl9rZnJlZV9za2JfYW55KHNrYik7DQorCQl9DQorCX0NCisJc3Bpbl91bmxvY2tfYmgo JnByaXYtPnR4cVtkZXNjX251bV0ubG9jayk7DQorDQorCXNwaW5fbG9ja19iaCgmc3RhX2luZm8t PmFtc2R1X2xvY2spOw0KKwlhbXNkdV9mcmFnID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdb ZGVzY19udW1dOw0KKwlpZiAoYW1zZHVfZnJhZy0+bnVtKSB7DQorCQlhbXNkdV9mcmFnLT5udW0g PSAwOw0KKwkJYW1zZHVfZnJhZy0+Y3VyX3BvcyA9IE5VTEw7DQorCQlpZiAoYW1zZHVfZnJhZy0+ c2tiKSB7DQorCQkJdHhfaW5mbyA9IElFRUU4MDIxMV9TS0JfQ0IoYW1zZHVfZnJhZy0+c2tiKTsN CisJCQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhfY3RybCAqKSZ0eF9pbmZvLT5zdGF0dXM7DQor CQkJYW1zZHVfcGt0cyA9IChzdHJ1Y3Qgc2tfYnVmZl9oZWFkICopDQorCQkJCXR4X2N0cmwtPmFt c2R1X3BrdHM7DQorCQkJaWYgKGFtc2R1X3BrdHMpIHsNCisJCQkJc2tiX3F1ZXVlX3B1cmdlKGFt c2R1X3BrdHMpOw0KKwkJCQlrZnJlZShhbXNkdV9wa3RzKTsNCisJCQl9DQorCQkJZGV2X2tmcmVl X3NrYl9hbnkoYW1zZHVfZnJhZy0+c2tiKTsNCisJCX0NCisJfQ0KKwlzcGluX3VubG9ja19iaCgm c3RhX2luZm8tPmFtc2R1X2xvY2spOw0KK30NCisNCit2b2lkIG13bF90eF9kb25lKHVuc2lnbmVk IGxvbmcgZGF0YSkNCit7DQorCXN0cnVjdCBpZWVlODAyMTFfaHcgKmh3ID0gKHN0cnVjdCBpZWVl ODAyMTFfaHcgKilkYXRhOw0KKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCisJ aW50IG51bTsNCisJc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQorCXN0cnVjdCBtd2xfdHhf aG5kbCAqdHhfaG5kbDsNCisJc3RydWN0IG13bF90eF9kZXNjICp0eF9kZXNjOw0KKwlzdHJ1Y3Qg c2tfYnVmZiAqZG9uZV9za2I7DQorCXUzMiByYXRlOw0KKwlzdHJ1Y3QgbXdsX2RtYV9kYXRhICp0 cjsNCisJc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICppbmZvOw0KKwlzdHJ1Y3QgbXdsX3R4X2N0 cmwgKnR4X2N0cmw7DQorCXN0cnVjdCBza19idWZmX2hlYWQgKmFtc2R1X3BrdHM7DQorCWludCBo ZHJsZW47DQorDQorCXNwaW5fbG9ja19iaCgmcHJpdi0+dHhfZGVzY19sb2NrKTsNCisJZm9yIChu dW0gPSAwOyBudW0gPCBTWVNBRFBUX1RYX1dNTV9RVUVVRVM7IG51bSsrKSB7DQorCQlkZXNjID0g JnByaXYtPmRlc2NfZGF0YVtudW1dOw0KKwkJdHhfaG5kbCA9IGRlc2MtPnBzdGFsZV90eF9obmRs Ow0KKwkJdHhfZGVzYyA9IHR4X2huZGwtPnBkZXNjOw0KKw0KKwkJd2hpbGUgKHR4X2huZGwgJiYN CisJCSAgICAgICAodHhfZGVzYy0+c3RhdHVzICYgY3B1X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRV U19PSykpICYmDQorCQkgICAgICAgKCEodHhfZGVzYy0+c3RhdHVzICYNCisJCSAgICAgICBjcHVf dG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0ZXX09XTkVEKSkpKSB7DQorCQkJcGNpX3VubWFwX3Np bmdsZShwcml2LT5wZGV2LA0KKwkJCQkJIGxlMzJfdG9fY3B1KHR4X2Rlc2MtPnBrdF9wdHIpLA0K KwkJCQkJIGxlMTZfdG9fY3B1KHR4X2Rlc2MtPnBrdF9sZW4pLA0KKwkJCQkJIFBDSV9ETUFfVE9E RVZJQ0UpOw0KKwkJCWRvbmVfc2tiID0gdHhfaG5kbC0+cHNrX2J1ZmY7DQorCQkJcmF0ZSA9IGxl MzJfdG9fY3B1KHR4X2Rlc2MtPnJhdGVfaW5mbyk7DQorCQkJdHhfZGVzYy0+cGt0X2xlbiA9IDA7 DQorCQkJdHhfZGVzYy0+c3RhdHVzID0NCisJCQkJY3B1X3RvX2xlMzIoRUFHTEVfVFhEX1NUQVRV U19JRExFKTsNCisJCQl0eF9obmRsLT5wc2tfYnVmZiA9IE5VTEw7DQorCQkJd21iKCk7IC8qIG1l bW9yeSBiYXJyaWVyICovDQorDQorCQkJc2tiX2dldChkb25lX3NrYik7DQorCQkJc2tiX3F1ZXVl X3RhaWwoJnByaXYtPmRlbGF5X3EsIGRvbmVfc2tiKTsNCisJCQlpZiAoc2tiX3F1ZXVlX2xlbigm cHJpdi0+ZGVsYXlfcSkgPg0KKwkJCSAgICBTWVNBRFBUX0RFTEFZX0ZSRUVfUV9MSU1JVCkNCisJ CQkJZGV2X2tmcmVlX3NrYl9hbnkoc2tiX2RlcXVldWUoJnByaXYtPmRlbGF5X3EpKTsNCisNCisJ CQl0ciA9IChzdHJ1Y3QgbXdsX2RtYV9kYXRhICopZG9uZV9za2ItPmRhdGE7DQorCQkJaW5mbyA9 IElFRUU4MDIxMV9TS0JfQ0IoZG9uZV9za2IpOw0KKw0KKwkJCWlmIChpZWVlODAyMTFfaXNfZGF0 YSh0ci0+d2guZnJhbWVfY29udHJvbCkgfHwNCisJCQkgICAgaWVlZTgwMjExX2lzX2RhdGFfcW9z KHRyLT53aC5mcmFtZV9jb250cm9sKSkgew0KKwkJCQl0eF9jdHJsID0gKHN0cnVjdCBtd2xfdHhf Y3RybCAqKSZpbmZvLT5zdGF0dXM7DQorCQkJCWFtc2R1X3BrdHMgPSAoc3RydWN0IHNrX2J1ZmZf aGVhZCAqKQ0KKwkJCQkJdHhfY3RybC0+YW1zZHVfcGt0czsNCisJCQkJaWYgKGFtc2R1X3BrdHMp IHsNCisJCQkJCW13bF90eF9hY2tfYW1zZHVfcGt0cyhodywgcmF0ZSwNCisJCQkJCQkJICAgICAg YW1zZHVfcGt0cyk7DQorCQkJCQlkZXZfa2ZyZWVfc2tiX2FueShkb25lX3NrYik7DQorCQkJCQlk b25lX3NrYiA9IE5VTEw7DQorCQkJCX0gZWxzZSB7DQorCQkJCQltd2xfdHhfcHJlcGFyZV9pbmZv KGh3LCByYXRlLCBpbmZvKTsNCisJCQkJfQ0KKwkJCX0gZWxzZSB7DQorCQkJCW13bF90eF9wcmVw YXJlX2luZm8oaHcsIDAsIGluZm8pOw0KKwkJCX0NCisNCisJCQlpZiAoZG9uZV9za2IpIHsNCisJ CQkJLyogUmVtb3ZlIEgvVyBkbWEgaGVhZGVyICovDQorCQkJCWhkcmxlbiA9IGllZWU4MDIxMV9o ZHJsZW4odHItPndoLmZyYW1lX2NvbnRyb2wpOw0KKwkJCQltZW1tb3ZlKHRyLT5kYXRhIC0gaGRy bGVuLCAmdHItPndoLCBoZHJsZW4pOw0KKwkJCQlza2JfcHVsbChkb25lX3NrYiwgc2l6ZW9mKCp0 cikgLSBoZHJsZW4pOw0KKwkJCQlpbmZvLT5mbGFncyAmPSB+SUVFRTgwMjExX1RYX0NUTF9BTVBE VTsNCisJCQkJaW5mby0+ZmxhZ3MgfD0gSUVFRTgwMjExX1RYX1NUQVRfQUNLOw0KKwkJCQlpZWVl ODAyMTFfdHhfc3RhdHVzKGh3LCBkb25lX3NrYik7DQorCQkJfQ0KKw0KKwkJCXR4X2huZGwgPSB0 eF9obmRsLT5wbmV4dDsNCisJCQl0eF9kZXNjID0gdHhfaG5kbC0+cGRlc2M7DQorCQkJcHJpdi0+ ZndfZGVzY19jbnRbbnVtXS0tOw0KKwkJfQ0KKw0KKwkJZGVzYy0+cHN0YWxlX3R4X2huZGwgPSB0 eF9obmRsOw0KKwl9DQorCXNwaW5fdW5sb2NrX2JoKCZwcml2LT50eF9kZXNjX2xvY2spOw0KKw0K KwlpZiAocHJpdi0+aXJxICE9IC0xKSB7DQorCQl1MzIgc3RhdHVzX21hc2s7DQorDQorCQlzdGF0 dXNfbWFzayA9IHJlYWRsKHByaXYtPmlvYmFzZTEgKw0KKwkJCQkgICAgTUFDUkVHX1JFR19BMkhf SU5URVJSVVBUX1NUQVRVU19NQVNLKTsNCisJCXdyaXRlbChzdGF0dXNfbWFzayB8IE1BQ1JFR19B MkhSSUNfQklUX1RYX0RPTkUsDQorCQkgICAgICAgcHJpdi0+aW9iYXNlMSArIE1BQ1JFR19SRUdf QTJIX0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorDQorCQltd2xfdHhfc2ticyhodyk7DQorCX0N CisNCisJcHJpdi0+aXNfdHhfc2NoZWR1bGUgPSBmYWxzZTsNCit9DQorDQordm9pZCBtd2xfdHhf Zmx1c2hfYW1zZHUodW5zaWduZWQgbG9uZyBkYXRhKQ0KK3sNCisJc3RydWN0IGllZWU4MDIxMV9o dyAqaHcgPSAoc3RydWN0IGllZWU4MDIxMV9odyAqKWRhdGE7DQorCXN0cnVjdCBtd2xfcHJpdiAq cHJpdiA9IGh3LT5wcml2Ow0KKwl1MzIgc3RhdHVzX21hc2s7DQorCXN0cnVjdCBtd2xfc3RhICpz dGFfaW5mbzsNCisJaW50IGk7DQorCXN0cnVjdCBtd2xfYW1zZHVfZnJhZyAqYW1zZHVfZnJhZzsN CisNCisJc3Bpbl9sb2NrKCZwcml2LT5zdGFfbG9jayk7DQorCWxpc3RfZm9yX2VhY2hfZW50cnko c3RhX2luZm8sICZwcml2LT5zdGFfbGlzdCwgbGlzdCkgew0KKwkJc3Bpbl9sb2NrKCZwcml2LT50 eF9kZXNjX2xvY2spOw0KKwkJc3Bpbl9sb2NrKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQorCQlm b3IgKGkgPSAwOyBpIDwgU1lTQURQVF9UWF9XTU1fUVVFVUVTOyBpKyspIHsNCisJCQlhbXNkdV9m cmFnID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdbaV07DQorCQkJaWYgKGFtc2R1X2ZyYWct Pm51bSkgew0KKwkJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLA0KKwkJCQkJICAgICAgIChhbXNk dV9mcmFnLT5qaWZmaWVzICsgMSkpKSB7DQorCQkJCQlpZiAobXdsX3R4X2F2YWlsYWJsZShwcml2 LCBpKSkgew0KKwkJCQkJCW13bF90eF9za2IocHJpdiwgaSwNCisJCQkJCQkJICAgYW1zZHVfZnJh Zy0+c2tiKTsNCisJCQkJCQlhbXNkdV9mcmFnLT5udW0gPSAwOw0KKwkJCQkJCWFtc2R1X2ZyYWct PmN1cl9wb3MgPSBOVUxMOw0KKwkJCQkJfQ0KKwkJCQl9DQorCQkJfQ0KKwkJfQ0KKwkJc3Bpbl91 bmxvY2soJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJCXNwaW5fdW5sb2NrKCZwcml2LT50eF9k ZXNjX2xvY2spOw0KKwl9DQorCXNwaW5fdW5sb2NrKCZwcml2LT5zdGFfbG9jayk7DQorDQorCXN0 YXR1c19tYXNrID0gcmVhZGwocHJpdi0+aW9iYXNlMSArDQorCQkJICAgIE1BQ1JFR19SRUdfQTJI X0lOVEVSUlVQVF9TVEFUVVNfTUFTSyk7DQorCXdyaXRlbChzdGF0dXNfbWFzayB8IE1BQ1JFR19B MkhSSUNfQklUX1FVRV9FTVBUWSwNCisJICAgICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVH X0EySF9JTlRFUlJVUFRfU1RBVFVTX01BU0spOw0KKw0KKwlwcml2LT5pc19xZV9zY2hlZHVsZSA9 IGZhbHNlOw0KK30NCisNCit2b2lkIG13bF90eF9kZWxfc3RhX2Ftc2R1X3BrdHMoc3RydWN0IGll ZWU4MDIxMV9zdGEgKnN0YSkNCit7DQorCXN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbyA9IG13bF9k ZXZfZ2V0X3N0YShzdGEpOw0KKwlpbnQgbnVtOw0KKwlzdHJ1Y3QgbXdsX2Ftc2R1X2ZyYWcgKmFt c2R1X2ZyYWc7DQorCXN0cnVjdCBpZWVlODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCisJc3RydWN0 IG13bF90eF9jdHJsICp0eF9jdHJsOw0KKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkICphbXNkdV9wa3Rz Ow0KKw0KKwlzcGluX2xvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCisJZm9yIChudW0g PSAwOyBudW0gPCBTWVNBRFBUX1RYX1dNTV9RVUVVRVM7IG51bSsrKSB7DQorCQlhbXNkdV9mcmFn ID0gJnN0YV9pbmZvLT5hbXNkdV9jdHJsLmZyYWdbbnVtXTsNCisJCWlmIChhbXNkdV9mcmFnLT5u dW0pIHsNCisJCQlhbXNkdV9mcmFnLT5udW0gPSAwOw0KKwkJCWFtc2R1X2ZyYWctPmN1cl9wb3Mg PSBOVUxMOw0KKwkJCWlmIChhbXNkdV9mcmFnLT5za2IpIHsNCisJCQkJdHhfaW5mbyA9IElFRUU4 MDIxMV9TS0JfQ0IoYW1zZHVfZnJhZy0+c2tiKTsNCisJCQkJdHhfY3RybCA9IChzdHJ1Y3QgbXds X3R4X2N0cmwgKikNCisJCQkJCSZ0eF9pbmZvLT5zdGF0dXM7DQorCQkJCWFtc2R1X3BrdHMgPSAo c3RydWN0IHNrX2J1ZmZfaGVhZCAqKQ0KKwkJCQkJdHhfY3RybC0+YW1zZHVfcGt0czsNCisJCQkJ aWYgKGFtc2R1X3BrdHMpIHsNCisJCQkJCXNrYl9xdWV1ZV9wdXJnZShhbXNkdV9wa3RzKTsNCisJ CQkJCWtmcmVlKGFtc2R1X3BrdHMpOw0KKwkJCQl9DQorCQkJCWRldl9rZnJlZV9za2JfYW55KGFt c2R1X2ZyYWctPnNrYik7DQorCQkJfQ0KKwkJfQ0KKwl9DQorCXNwaW5fdW5sb2NrX2JoKCZzdGFf aW5mby0+YW1zZHVfbG9jayk7DQorfQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNz L21hcnZlbGwvbXdsd2lmaS90eC5oIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3 aWZpL3R4LmgNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwLi5lZjFjN2M1DQot LS0gL2Rldi9udWxsDQorKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkv dHguaA0KQEAgLTAsMCArMSwzNiBAQA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMTUs IE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQorICoNCisgKiBUaGlzIHNvZnR3YXJlIGZpbGUg KHRoZSAiRmlsZSIpIGlzIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwgSW50ZXJuYXRpb25hbA0KKyAq IEx0ZC4gdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBW ZXJzaW9uIDIsIEp1bmUgMTk5MQ0KKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCBy ZWRpc3RyaWJ1dGUgYW5kL29yIG1vZGlmeSB0aGlzIEZpbGUgaW4NCisgKiBhY2NvcmRhbmNlIHdp dGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBMaWNlbnNlLCBhIGNvcHkgb2Ygd2hp Y2gNCisgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uLCBJbmMuDQorICoNCisgKiBUSEUgRklMRSBJUyBESVNUUklCVVRFRCBBUy1JUywgV0lU SE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgQU5EIFRIRQ0KKyAqIElNUExJRUQgV0FSUkFOVElF UyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UN CisgKiBBUkUgRVhQUkVTU0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRp dGlvbmFsIGRldGFpbHMgYWJvdXQNCisgKiB0aGlzIHdhcnJhbnR5IGRpc2NsYWltZXIuDQorICov DQorDQorLyogRGVzY3JpcHRpb246ICBUaGlzIGZpbGUgZGVmaW5lcyB0cmFuc21pdCByZWxhdGVk IGZ1bmN0aW9ucy4gKi8NCisNCisjaWZuZGVmIF90eF9oXw0KKyNkZWZpbmUgX3R4X2hfDQorDQor aW50IG13bF90eF9pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KTsNCit2b2lkIG13bF90eF9k ZWluaXQoc3RydWN0IGllZWU4MDIxMV9odyAqaHcpOw0KK3ZvaWQgbXdsX3R4X3htaXQoc3RydWN0 IGllZWU4MDIxMV9odyAqaHcsDQorCQkgc3RydWN0IGllZWU4MDIxMV90eF9jb250cm9sICpjb250 cm9sLA0KKwkJIHN0cnVjdCBza19idWZmICpza2IpOw0KK3ZvaWQgbXdsX3R4X2RlbF9wa3RzX3Zp YV92aWYoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgICBzdHJ1Y3QgaWVlZTgwMjEx X3ZpZiAqdmlmKTsNCit2b2lkIG13bF90eF9kZWxfcGt0c192aWFfc3RhKHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3LA0KKwkJCSAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YSk7DQordm9pZCBt d2xfdHhfZGVsX2FtcGR1X3BrdHMoc3RydWN0IGllZWU4MDIxMV9odyAqaHcsDQorCQkJICAgc3Ry dWN0IGllZWU4MDIxMV9zdGEgKnN0YSwgdTggdGlkKTsNCit2b2lkIG13bF90eF9kb25lKHVuc2ln bmVkIGxvbmcgZGF0YSk7DQordm9pZCBtd2xfdHhfZmx1c2hfYW1zZHUodW5zaWduZWQgbG9uZyBk YXRhKTsNCit2b2lkIG13bF90eF9kZWxfc3RhX2Ftc2R1X3BrdHMoc3RydWN0IGllZWU4MDIxMV9z dGEgKnN0YSk7DQorDQorI2VuZGlmIC8qIF90eF9oXyAqLw0KLS0gDQoxLjkuMQ0KDQo= ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin @ 2015-11-12 19:47 ` Jes Sorensen 2015-11-26 8:34 ` David Lin 2015-11-20 11:22 ` Johannes Berg ` (5 subsequent siblings) 6 siblings, 1 reply; 26+ messages in thread From: Jes Sorensen @ 2015-11-12 19:47 UTC (permalink / raw) To: David Lin Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh David Lin <dlin@marvell.com> writes: > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897 > chipsets. > This driver was developed as part of the openwrt.org project to support > Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi. > > The mwlwifi driver differs from existing mwifiex driver: > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem > to provide full AP/Wireless Bridge functionality (routers). > o mwifiex is a "fullmac driver" which provides a comprehensive set of > client functions (laptops/embedded devices) > o only mwlwifi supports Marvell AP chip 886X series > > NOTE: Users with Marvell 88W8897 chipsets currently should enable > (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH. I didn't get very far reading through this - but there was a few bits that stood out like a sore thumb. > mwlwifi driver leveraged code from existing MWL8K driver in the > following areas: > - 802.11n setting for mac80211 > - Functions needed to hook up to mac80211 > - Interactions with mac80211 to establish BA streams > - Partial firmware APIs, some data fields > - Method to pass Rx packets to mac80211 except 11ac rates > > In addition, mwlwifi driver supports: > - future scalability and future development (refactored source code) > - Marvell 802.11ac chipsets, including combo BT devices > - 802.11ac related settings and functions > - concurrent AP+STA functionalities with single firmware per chip > - firmware APIs for the supported chipset > - communicating new mac80211 settings to firmware > - Different TX/RX datapath where applicable > - A-MSDU and A-MPDU > - mac80211-based MESH (work in progress) > - Refined the code to establish BA streams > > NOTE: MWLWIFI will be organized under new vendor specific folder/marvell, > as per request of the gate keeper and community. > > Signed-off-by: David Lin <dlin@marvell.com> > --- > > diff --git a/MAINTAINERS b/MAINTAINERS > index 27b27c0..7c32f0a 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -6629,6 +6629,12 @@ L: linux-wireless@vger.kernel.org > S: Odd Fixes > F: drivers/net/wireless/mwl8k.c > > +MARVELL MWLWIFI WIRELESS DRIVER > +M: David Lin <dlin@marvell.com> > +L: linux-wireless@vger.kernel.org > +S: Maintained > +F: drivers/net/wireless/marvell/mwlwifi > + > MARVELL SOC MMC/SD/SDIO CONTROLLER DRIVER > M: Nicolas Pitre <nico@fluxnic.net> > S: Odd Fixes > diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig > index f9f9422..d599b35 100644 > --- a/drivers/net/wireless/Kconfig > +++ b/drivers/net/wireless/Kconfig > @@ -285,5 +285,6 @@ source "drivers/net/wireless/zd1211rw/Kconfig" > source "drivers/net/wireless/mwifiex/Kconfig" > source "drivers/net/wireless/cw1200/Kconfig" > source "drivers/net/wireless/rsi/Kconfig" > +source "drivers/net/wireless/marvell/Kconfig" > > endif # WLAN > diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile > index 740fdd3..71504a7 100644 > --- a/drivers/net/wireless/Makefile > +++ b/drivers/net/wireless/Makefile > @@ -60,3 +60,5 @@ obj-$(CONFIG_BRCMSMAC) += brcm80211/ > > obj-$(CONFIG_CW1200) += cw1200/ > obj-$(CONFIG_RSI_91X) += rsi/ > + > +obj-$(CONFIG_WL_MARVELL) += marvell/ > diff --git a/drivers/net/wireless/marvell/Kconfig > b/drivers/net/wireless/marvell/Kconfig > new file mode 100644 > index 0000000..d73e642 > --- /dev/null > +++ b/drivers/net/wireless/marvell/Kconfig > @@ -0,0 +1,8 @@ > +menuconfig WL_MARVELL > + bool "Marvell Wireless LAN support" > + ---help--- > + Enable community drivers for Marvell Wi-Fi devices. > + > +if WL_MARVELL > +source "drivers/net/wireless/marvell/mwlwifi/Kconfig" > +endif # WL_MARVELL > diff --git a/drivers/net/wireless/marvell/Makefile > b/drivers/net/wireless/marvell/Makefile > new file mode 100644 > index 0000000..70d1b3f > --- /dev/null > +++ b/drivers/net/wireless/marvell/Makefile > @@ -0,0 +1 @@ > +obj-$(CONFIG_MWLWIFI) += mwlwifi/ > diff --git a/drivers/net/wireless/marvell/mwlwifi/Kconfig > b/drivers/net/wireless/marvell/mwlwifi/Kconfig > new file mode 100644 > index 0000000..a9bcb9c > --- /dev/null > +++ b/drivers/net/wireless/marvell/mwlwifi/Kconfig > @@ -0,0 +1,23 @@ > +config MWLWIFI > + tristate "Marvell Avastar 88W8864/88W8897 PCIe driver (mac80211 > compatible)" > + depends on PCI && MAC80211 > + select FW_LOADER > + ---help--- > + Select to build the driver supporting the: > + > + Marvell Wireless Wi-Fi 88W8864 modules > + Marvell Wireless Wi-Fi 88W8897 modules > + > + This driver uses the kernel's mac80211 subsystem. > + > + If you want to compile the driver as a module (= code which can be > + inserted in and removed from the running kernel whenever you want), > + say M here and read <file:Documentation/kbuild/modules.txt>. The > + module will be called mwlwifi. > + > + NOTE: Selecting this driver may cause conflict with MWIFIEX driver > + that also operates on the same part number 88W8897. Users should > + select either MWIFIEX or MWLWIFI, not both. MWIFIEX is fullmac, > + supporting more comprehensive client functions for laptops/embedded > + devices. MWLWIFI is mac80211-based for full AP/Wireless Bridge. > + > diff --git a/drivers/net/wireless/marvell/mwlwifi/Makefile > b/drivers/net/wireless/marvell/mwlwifi/Makefile > new file mode 100644 > index 0000000..88f7efd > --- /dev/null > +++ b/drivers/net/wireless/marvell/mwlwifi/Makefile > @@ -0,0 +1,12 @@ > +obj-$(CONFIG_MWLWIFI) += mwlwifi.o > + > +mwlwifi-objs += main.o > +mwlwifi-objs += mac80211.o > +mwlwifi-objs += fwdl.o > +mwlwifi-objs += fwcmd.o > +mwlwifi-objs += tx.o > +mwlwifi-objs += rx.o > +mwlwifi-objs += isr.o > +mwlwifi-$(CONFIG_DEBUG_FS) += debugfs.o > + > +ccflags-y += -D__CHECK_ENDIAN__ > diff --git a/drivers/net/wireless/marvell/mwlwifi/debugfs.c > b/drivers/net/wireless/marvell/mwlwifi/debugfs.c > new file mode 100644 > index 0000000..997461a > --- /dev/null > +++ b/drivers/net/wireless/marvell/mwlwifi/debugfs.c > @@ -0,0 +1,433 @@ > +/* > + * Copyright (C) 2006-2015, Marvell International Ltd. > + * > + * This software file (the "File") is distributed by Marvell International > + * Ltd. under the terms of the GNU General Public License Version 2, June 1991 > + * (the "License"). You may use, redistribute and/or modify this File in > + * accordance with the terms and conditions of the License, a copy of which > + * is available by writing to the Free Software Foundation, Inc. > + * > + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE > + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about > + * this warranty disclaimer. > + */ > + > +/* Description: This file implements debug fs related functions. */ > + > +#include <linux/debugfs.h> > + > +#include "sysadpt.h" > +#include "dev.h" > +#include "hostcmd.h" > +#include "fwcmd.h" > +#include "debugfs.h" > + > +#define MWLWIFI_DEBUGFS_ADD_FILE(name) do { \ > + if (!debugfs_create_file(#name, 0644, priv->debugfs_phy, \ > + priv, &mwl_debugfs_##name##_fops)) \ > + return; \ > +} while (0) This macros relies on implicit arguments which is just bad and doesn't really do anything except for obfuscating the code. > +#define MWLWIFI_DEBUGFS_FILE_OPS(name) \ > +static const struct file_operations mwl_debugfs_##name##_fops = { \ > + .read = mwl_debugfs_##name##_read, \ > + .write = mwl_debugfs_##name##_write, \ > + .open = simple_open, \ > +} > + > +#define MWLWIFI_DEBUGFS_FILE_READ_OPS(name) \ > +static const struct file_operations mwl_debugfs_##name##_fops = { \ > + .read = mwl_debugfs_##name##_read, \ > + .open = simple_open, \ > +} > + > +#define MWLWIFI_DEBUGFS_FILE_WRITE_OPS(name) \ > +static const struct file_operations mwl_debugfs_##name##_fops = { \ > + .write = mwl_debugfs_##name##_write, \ > + .open = simple_open, \ > +} Again here - you use thiese wrappers once, just declare the structs explicitly rather than this macro wrapping dance. > +static int print_mac_addr(char *p, u8 *mac_addr) > +{ > + int i; > + char *str = p; > + > + str += sprintf(str, "mac address: %02x", mac_addr[0]); > + for (i = 1; i < ETH_ALEN; i++) > + str += sprintf(str, ":%02x", mac_addr[i]); > + str += sprintf(str, "\n"); > + > + return (str - p); > +} > + > +static int dump_data(char *p, u8 *data, int len, char *title) > +{ > + char *str = p; > + int cur_byte = 0; > + int i; > + > + str += sprintf(str, "%s\n", title); > + for (cur_byte = 0; cur_byte < len; cur_byte += 8) { > + if ((cur_byte + 8) < len) { > + for (i = 0; i < 8; i++) > + str += sprintf(str, "0x%02x ", > + *(data + cur_byte + i)); > + str += sprintf(str, "\n"); > + } else { > + for (i = 0; i < (len - cur_byte); i++) > + str += sprintf(str, "0x%02x ", > + *(data + cur_byte + i)); > + str += sprintf(str, "\n"); > + break; > + } > + } > + > + return (str - p); > +} > + > +static ssize_t mwl_debugfs_info_read(struct file *file, char __user *ubuf, > + size_t count, loff_t *ppos) > +{ > + struct mwl_priv *priv = (struct mwl_priv *)file->private_data; > + unsigned long page = get_zeroed_page(GFP_KERNEL); > + char *p = (char *)page; > + ssize_t ret; > + > + if (!p) > + return -ENOMEM; > + > + p += sprintf(p, "\n"); > + p += sprintf(p, "driver name: %s\n", MWL_DRV_NAME); > + p += sprintf(p, "chip type: %s\n", > + (priv->chip_type == MWL8864) ? "88W8864" : "88W8897"); > + p += sprintf(p, "hw version: %X\n", priv->hw_data.hw_version); > + p += sprintf(p, "driver version: %s\n", MWL_DRV_VERSION); > + p += sprintf(p, "firmware version: 0x%08x\n", > + priv->hw_data.fw_release_num); > + p += print_mac_addr(p, priv->hw_data.mac_addr); > + p += sprintf(p, "2g: %s\n", priv->disable_2g ? "disable" : "enable"); > + p += sprintf(p, "5g: %s\n", priv->disable_5g ? "disable" : "enable"); > + p += sprintf(p, "antenna: %d %d\n", > + (priv->antenna_tx == ANTENNA_TX_4_AUTO) ? 4 : 2, > + (priv->antenna_rx == ANTENNA_TX_4_AUTO) ? 4 : 2); > + p += sprintf(p, "irq number: %d\n", priv->irq); > + p += sprintf(p, "iobase0: %p\n", priv->iobase0); > + p += sprintf(p, "iobase1: %p\n", priv->iobase1); > + p += sprintf(p, "tx limit: %d\n", priv->txq_limit); > + p += sprintf(p, "rx limit: %d\n", priv->recv_limit); > + p += sprintf(p, "ap macid support: %08x\n", > + priv->ap_macids_supported); > + p += sprintf(p, "sta macid support: %08x\n", > + priv->sta_macids_supported); > + p += sprintf(p, "macid used: %08x\n", priv->macids_used); > + p += sprintf(p, "mfg mode: %s\n", priv->mfg_mode ? "true" : "false"); > + p += sprintf(p, "\n"); > + > + ret = simple_read_from_buffer(ubuf, count, ppos, (char *)page, > + (unsigned long)p - page); > + free_page(page); > + > + return ret; > +} > + > +static ssize_t mwl_debugfs_vif_read(struct file *file, char __user *ubuf, > + size_t count, loff_t *ppos) > +{ > + struct mwl_priv *priv = (struct mwl_priv *)file->private_data; > + unsigned long page = get_zeroed_page(GFP_KERNEL); > + char *p = (char *)page; > + struct mwl_vif *mwl_vif; > + struct ieee80211_vif *vif; > + char ssid[IEEE80211_MAX_SSID_LEN + 1]; > + ssize_t ret; > + > + if (!p) > + return -ENOMEM; > + > + p += sprintf(p, "\n"); > + spin_lock_bh(&priv->vif_lock); > + list_for_each_entry(mwl_vif, &priv->vif_list, list) { > + vif = container_of((char *)mwl_vif, struct ieee80211_vif, > + drv_priv[0]); > + p += sprintf(p, "macid: %d\n", mwl_vif->macid); > + switch (vif->type) { > + case NL80211_IFTYPE_AP: > + p += sprintf(p, "type: ap\n"); > + memcpy(ssid, vif->bss_conf.ssid, > + vif->bss_conf.ssid_len); > + ssid[vif->bss_conf.ssid_len] = 0; > + p += sprintf(p, "ssid: %s\n", ssid); > + p += print_mac_addr(p, mwl_vif->bssid); > + break; > + case NL80211_IFTYPE_MESH_POINT: > + p += sprintf(p, "type: mesh\n"); > + p += print_mac_addr(p, mwl_vif->bssid); > + break; > + case NL80211_IFTYPE_STATION: > + p += sprintf(p, "type: sta\n"); > + p += print_mac_addr(p, mwl_vif->sta_mac); > + break; > + default: > + p += sprintf(p, "type: unknown\n"); > + break; > + } > + p += sprintf(p, "hw_crypto_enabled: %s\n", > + mwl_vif->is_hw_crypto_enabled ? "true" : "false"); > + p += sprintf(p, "key idx: %d\n", mwl_vif->keyidx); > + p += sprintf(p, "IV: %08x%04x\n", mwl_vif->iv32, mwl_vif->iv16); > + p += dump_data(p, mwl_vif->beacon_info.ie_wmm_ptr, > + mwl_vif->beacon_info.ie_wmm_len, "WMM:"); > + p += dump_data(p, mwl_vif->beacon_info.ie_rsn_ptr, > + mwl_vif->beacon_info.ie_rsn_len, "RSN:"); > + p += dump_data(p, mwl_vif->beacon_info.ie_rsn48_ptr, > + mwl_vif->beacon_info.ie_rsn48_len, "RSN48:"); > + p += dump_data(p, mwl_vif->beacon_info.ie_ht_ptr, > + mwl_vif->beacon_info.ie_ht_len, "HT:"); > + p += dump_data(p, mwl_vif->beacon_info.ie_vht_ptr, > + mwl_vif->beacon_info.ie_vht_len, "VHT:"); > + p += sprintf(p, "\n"); > + } > + spin_unlock_bh(&priv->vif_lock); I hope there is no way that the number of vifs can get to the point where you overflow the page allocated since there is no cap on the sprintf() usage in dump_data(). > + > +MWLWIFI_DEBUGFS_FILE_READ_OPS(info); > +MWLWIFI_DEBUGFS_FILE_READ_OPS(vif); > +MWLWIFI_DEBUGFS_FILE_READ_OPS(sta); > +MWLWIFI_DEBUGFS_FILE_READ_OPS(ampdu); > +MWLWIFI_DEBUGFS_FILE_OPS(regrdwr); > + > +void mwl_debugfs_init(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + > + if (!priv->debugfs_phy) > + priv->debugfs_phy = debugfs_create_dir("mwlwifi", > + hw->wiphy->debugfsdir); > + > + if (!priv->debugfs_phy) > + return; > + > + MWLWIFI_DEBUGFS_ADD_FILE(info); > + MWLWIFI_DEBUGFS_ADD_FILE(vif); > + MWLWIFI_DEBUGFS_ADD_FILE(sta); > + MWLWIFI_DEBUGFS_ADD_FILE(ampdu); > + MWLWIFI_DEBUGFS_ADD_FILE(regrdwr); > +} > + > +void mwl_debugfs_remove(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + > + debugfs_remove(priv->debugfs_phy); > + priv->debugfs_phy = NULL; > +} > diff --git a/drivers/net/wireless/marvell/mwlwifi/debugfs.h > b/drivers/net/wireless/marvell/mwlwifi/debugfs.h > new file mode 100644 > index 0000000..dfc2a3c > --- /dev/null > +++ b/drivers/net/wireless/marvell/mwlwifi/debugfs.h > @@ -0,0 +1,24 @@ > +/* > + * Copyright (C) 2006-2015, Marvell International Ltd. > + * > + * This software file (the "File") is distributed by Marvell International > + * Ltd. under the terms of the GNU General Public License Version 2, June 1991 > + * (the "License"). You may use, redistribute and/or modify this File in > + * accordance with the terms and conditions of the License, a copy of which > + * is available by writing to the Free Software Foundation, Inc. > + * > + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE > + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about > + * this warranty disclaimer. > + */ > + > +/* Description: This file defines debug fs related functions. */ > + > +#ifndef _debugfs_h_ > +#define _debugfs_h_ The general convention is to user upper-case for the these - not a biggie though. > +struct mwl_priv { > + struct ieee80211_hw *hw; > + struct firmware *fw_ucode; > + int chip_type; > + > + struct device_node *dt_node; > + struct device_node *pwr_node; > + bool disable_2g; > + bool disable_5g; > + int antenna_tx; > + int antenna_rx; > + > + struct mwl_tx_pwr_tbl tx_pwr_tbl[SYSADPT_MAX_NUM_CHANNELS]; > + bool cdd; > + u16 txantenna2; > + u8 powinited; > + u16 max_tx_pow[SYSADPT_TX_POWER_LEVEL_TOTAL]; /* max tx power (dBm) */ > + u16 target_powers[SYSADPT_TX_POWER_LEVEL_TOTAL]; /* target powers */ > + u8 cal_tbl[200]; > + > + struct pci_dev *pdev; > + void __iomem *iobase0; /* MEM Base Address Register 0 */ > + void __iomem *iobase1; /* MEM Base Address Register 1 */ > + u32 next_bar_num; > + > + spinlock_t fwcmd_lock; /* for firmware command */ > + unsigned short *pcmd_buf; /* pointer to CmdBuf (virtual) */ > + dma_addr_t pphys_cmd_buf; /* pointer to CmdBuf (physical) */ > + bool in_send_cmd; > + > + int irq; > + struct mwl_hw_data hw_data; /* Adapter HW specific info */ > + > + /* various descriptor data */ > + spinlock_t tx_desc_lock; /* for tx descriptor data */ > + spinlock_t rx_desc_lock; /* for rx descriptor data */ You probably don't want to declare these two right next to each other, if you expect the RX and TX paths of the code to be able to run in parallel. Spin locks are not guaranteed to be cache line aligned or cache line sized, so you can end up with cache line ping pongs between CPUs in this case. > + struct mwl_desc_data desc_data[SYSADPT_NUM_OF_DESC_DATA]; > + struct sk_buff_head txq[SYSADPT_NUM_OF_DESC_DATA]; > + struct sk_buff_head delay_q; > + /* number of descriptors owned by fw at any one time */ > + int fw_desc_cnt[SYSADPT_NUM_OF_DESC_DATA]; > + > + struct tasklet_struct tx_task; > + struct tasklet_struct rx_task; > + struct tasklet_struct qe_task; > + int txq_limit; > + bool is_tx_schedule; > + int recv_limit; > + bool is_rx_schedule; > + bool is_qe_schedule; > + s8 noise; /* Most recently reported noise in dBm */ > + struct ieee80211_supported_band band_24; > + struct ieee80211_channel channels_24[BAND_24_CHANNEL_NUM]; > + struct ieee80211_rate rates_24[BAND_24_RATE_NUM]; > + struct ieee80211_supported_band band_50; > + struct ieee80211_channel channels_50[BAND_50_CHANNEL_NUM]; > + struct ieee80211_rate rates_50[BAND_50_RATE_NUM]; > + > + u32 ap_macids_supported; > + u32 sta_macids_supported; > + u32 macids_used; > + spinlock_t vif_lock; /* for private interface info */ > + struct list_head vif_list; /* List of interfaces. */ > + u32 running_bsses; /* bitmap of running BSSes */ > + > + spinlock_t sta_lock; /* for private sta info */ > + struct list_head sta_list; /* List of stations */ These two are awfully close together too. You might just get away with it on x86_64, given list_head is 16 bytes, but the x86_64 packing rules are odd, so I am never quite sure. On x86_32 it will certainly bite you - provided vif_lock and sta_lock can get taken from two different paths. > + > + bool radio_on; > + bool radio_short_preamble; > + bool wmm_enabled; > + struct ieee80211_tx_queue_params wmm_params[SYSADPT_TX_WMM_QUEUES]; > + > + /* Ampdu stream information */ > + u8 num_ampdu_queues; > + spinlock_t stream_lock; /* for ampdu stream */ > + struct mwl_ampdu_stream ampdu[SYSADPT_TX_AMPDU_QUEUES]; > + struct work_struct watchdog_ba_handle; > + > + bool mfg_mode; > + > +#ifdef CONFIG_DEBUG_FS > + struct dentry *debugfs_phy; > + u32 reg_type; > + u32 reg_offset; > + u32 reg_value; > +#endif > +}; [snip] > +static void mwl_fwcmd_parse_beacon(struct mwl_priv *priv, > + struct mwl_vif *vif, u8 *beacon, int len) > +{ > + struct ieee80211_mgmt *mgmt; > + struct beacon_info *beacon_info; > + int baselen; > + u8 *pos; > + size_t left; > + bool elem_parse_failed; > + > + mgmt = (struct ieee80211_mgmt *)beacon; > + > + baselen = (u8 *)mgmt->u.beacon.variable - (u8 *)mgmt; > + if (baselen > len) > + return; > + > + beacon_info = &vif->beacon_info; > + memset(beacon_info, 0, sizeof(struct beacon_info)); > + beacon_info->valid = false; > + beacon_info->ie_ht_ptr = &beacon_info->ie_list_ht[0]; > + beacon_info->ie_vht_ptr = &beacon_info->ie_list_vht[0]; > + > + beacon_info->cap_info = le16_to_cpu(mgmt->u.beacon.capab_info); > + > + pos = (u8 *)mgmt->u.beacon.variable; > + left = len - baselen; > + > + elem_parse_failed = false; > + > + while (left >= 2) { > + u8 id, elen; > + > + id = *pos++; > + elen = *pos++; > + left -= 2; > + > + if (elen > left) { > + elem_parse_failed = true; > + break; > + } > + > + switch (id) { > + case WLAN_EID_SUPP_RATES: > + case WLAN_EID_EXT_SUPP_RATES: > + { > + int idx, bi, oi; > + u8 rate; > + > + for (bi = 0; bi < SYSADPT_MAX_DATA_RATES_G; > + bi++) { > + if (beacon_info->b_rate_set[bi] == 0) > + break; > + } > + > + for (oi = 0; oi < SYSADPT_MAX_DATA_RATES_G; > + oi++) { > + if (beacon_info->op_rate_set[oi] == 0) > + break; > + } > + > + for (idx = 0; idx < elen; idx++) { > + rate = pos[idx]; > + if ((rate & 0x80) != 0) { > + if (bi < SYSADPT_MAX_DATA_RATES_G) > + beacon_info->b_rate_set[bi++] > + = rate & 0x7f; > + else { > + elem_parse_failed = true; > + break; > + } > + } > + if (oi < SYSADPT_MAX_DATA_RATES_G) > + beacon_info->op_rate_set[oi++] = > + rate & 0x7f; > + else { > + elem_parse_failed = true; > + break; > + } > + } > + } > + break; > + case WLAN_EID_RSN: > + beacon_info->ie_rsn48_len = (elen + 2); > + beacon_info->ie_rsn48_ptr = (pos - 2); > + break; > + case WLAN_EID_HT_CAPABILITY: > + case WLAN_EID_HT_OPERATION: > + case WLAN_EID_OVERLAP_BSS_SCAN_PARAM: > + case WLAN_EID_EXT_CAPABILITY: > + beacon_info->ie_ht_len += (elen + 2); > + if (beacon_info->ie_ht_len > > + sizeof(beacon_info->ie_list_ht)) { > + elem_parse_failed = true; > + } else { > + *beacon_info->ie_ht_ptr++ = id; > + *beacon_info->ie_ht_ptr++ = elen; > + memcpy(beacon_info->ie_ht_ptr, pos, elen); > + beacon_info->ie_ht_ptr += elen; > + } > + break; > +#ifdef CONFIG_MAC80211_MESH > + case WLAN_EID_MESH_CONFIG: > + beacon_info->ie_meshcfg_len = (elen + 2); > + beacon_info->ie_meshcfg_ptr = (pos - 2); > + break; > + case WLAN_EID_MESH_ID: > + beacon_info->ie_meshid_len = (elen + 2); > + beacon_info->ie_meshid_ptr = (pos - 2); > + break; > + case WLAN_EID_CHAN_SWITCH_PARAM: > + beacon_info->ie_meshchsw_len = (elen + 2); > + beacon_info->ie_meshchsw_ptr = (pos - 2); > + break; > +#endif > + case WLAN_EID_VHT_CAPABILITY: > + case WLAN_EID_VHT_OPERATION: > + case WLAN_EID_OPMODE_NOTIF: > + beacon_info->ie_vht_len += (elen + 2); > + if (beacon_info->ie_vht_len > > + sizeof(beacon_info->ie_list_vht)) { > + elem_parse_failed = true; > + } else { > + *beacon_info->ie_vht_ptr++ = id; > + *beacon_info->ie_vht_ptr++ = elen; > + memcpy(beacon_info->ie_vht_ptr, pos, elen); > + beacon_info->ie_vht_ptr += elen; > + } > + break; > + case WLAN_EID_VENDOR_SPECIFIC: > + if ((pos[0] == 0x00) && (pos[1] == 0x50) && > + (pos[2] == 0xf2)) { > + if (pos[3] == 0x01) { > + beacon_info->ie_rsn_len = (elen + 2); > + beacon_info->ie_rsn_ptr = (pos - 2); > + } > + > + if (pos[3] == 0x02) { > + beacon_info->ie_wmm_len = (elen + 2); > + beacon_info->ie_wmm_ptr = (pos - 2); > + } > + } > + break; > + default: > + break; > + } > + > + left -= elen; > + pos += elen; > + } > + > + if (!elem_parse_failed) { > + beacon_info->ie_ht_ptr = &beacon_info->ie_list_ht[0]; > + beacon_info->ie_vht_ptr = &beacon_info->ie_list_vht[0]; > + beacon_info->valid = true; > + } > +} Any reason you're not using cfg80211_find_ie() here? Seems to be re-inventing the wheel to me. > +void mwl_fwcmd_reset(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + > + if (mwl_fwcmd_chk_adapter(priv)) > + writel(ISR_RESET, > + priv->iobase1 + MACREG_REG_H2A_INTERRUPT_EVENTS); > +} > + > +void mwl_fwcmd_int_enable(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + > + if (mwl_fwcmd_chk_adapter(priv)) { > + writel(0x00, > + priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK); > + writel((MACREG_A2HRIC_BIT_MASK), > + priv->iobase1 + MACREG_REG_A2H_INTERRUPT_MASK); Please avoid superfluous use of parentheses. > +int mwl_fwcmd_get_hw_specs(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + struct hostcmd_cmd_get_hw_spec *pcmd; > + int retry; > + int i; > + > + if (priv->mfg_mode) > + return 0; > + > + pcmd = (struct hostcmd_cmd_get_hw_spec *)&priv->pcmd_buf[0]; > + > + spin_lock_bh(&priv->fwcmd_lock); > + > + wiphy_debug(hw->wiphy, "pcmd = %p\n", pcmd); > + memset(pcmd, 0x00, sizeof(*pcmd)); > + eth_broadcast_addr(pcmd->permanent_addr); > + pcmd->cmd_hdr.cmd = cpu_to_le16(HOSTCMD_CMD_GET_HW_SPEC); > + pcmd->cmd_hdr.len = cpu_to_le16(sizeof(*pcmd)); > + pcmd->fw_awake_cookie = cpu_to_le32(priv->pphys_cmd_buf + 2048); > + > + retry = 0; > + while (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_GET_HW_SPEC)) { > + if (retry++ > MAX_WAIT_GET_HW_SPECS_ITERATONS) { > + wiphy_err(hw->wiphy, "can't get hw specs\n"); > + spin_unlock_bh(&priv->fwcmd_lock); > + return -EIO; > + } > + > + mdelay(1000); > + wiphy_debug(hw->wiphy, > + "repeat command = %p\n", pcmd); > + } *cough* mdelay(1000) while holding a spin lock and within in a while() *loop? *cough* This needs a little cleaning up. Please have a look at Documentation/timers/timers-howto.txt > + > + ether_addr_copy(&priv->hw_data.mac_addr[0], pcmd->permanent_addr); > + priv->desc_data[0].wcb_base = > + le32_to_cpu(pcmd->wcb_base0) & 0x0000ffff; > + for (i = 1; i < SYSADPT_TOTAL_TX_QUEUES; i++) > + priv->desc_data[i].wcb_base = > + le32_to_cpu(pcmd->wcb_base[i - 1]) & 0x0000ffff; > + priv->desc_data[0].rx_desc_read = > + le32_to_cpu(pcmd->rxpd_rd_ptr) & 0x0000ffff; > + priv->desc_data[0].rx_desc_write = > + le32_to_cpu(pcmd->rxpd_wr_ptr) & 0x0000ffff; > + priv->hw_data.region_code = le16_to_cpu(pcmd->region_code) & 0x00ff; > + priv->hw_data.fw_release_num = le32_to_cpu(pcmd->fw_release_num); > + priv->hw_data.max_num_tx_desc = le16_to_cpu(pcmd->num_wcb); > + priv->hw_data.max_num_mc_addr = le16_to_cpu(pcmd->num_mcast_addr); > + priv->hw_data.num_antennas = le16_to_cpu(pcmd->num_antenna); > + priv->hw_data.hw_version = pcmd->version; > + priv->hw_data.host_interface = pcmd->host_if; > + > + spin_unlock_bh(&priv->fwcmd_lock); > + > + return 0; > +} > + > +int mwl_fwcmd_set_hw_specs(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + struct hostcmd_cmd_set_hw_spec *pcmd; > + int i; > + > + if (priv->mfg_mode) > + return 0; > + > + pcmd = (struct hostcmd_cmd_set_hw_spec *)&priv->pcmd_buf[0]; > + > + spin_lock_bh(&priv->fwcmd_lock); > + > + memset(pcmd, 0x00, sizeof(*pcmd)); > + pcmd->cmd_hdr.cmd = cpu_to_le16(HOSTCMD_CMD_SET_HW_SPEC); > + pcmd->cmd_hdr.len = cpu_to_le16(sizeof(*pcmd)); > + pcmd->wcb_base[0] = cpu_to_le32(priv->desc_data[0].pphys_tx_ring); > + for (i = 1; i < SYSADPT_TOTAL_TX_QUEUES; i++) > + pcmd->wcb_base[i] = > + cpu_to_le32(priv->desc_data[i].pphys_tx_ring); > + pcmd->tx_wcb_num_per_queue = cpu_to_le32(SYSADPT_MAX_NUM_TX_DESC); > + pcmd->num_tx_queues = cpu_to_le32(SYSADPT_NUM_OF_DESC_DATA); > + pcmd->total_rx_wcb = cpu_to_le32(SYSADPT_MAX_NUM_RX_DESC); > + pcmd->rxpd_wr_ptr = cpu_to_le32(priv->desc_data[0].pphys_rx_ring); > + pcmd->features = 0; > + > + if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_SET_HW_SPEC)) { > + spin_unlock_bh(&priv->fwcmd_lock); > + wiphy_err(hw->wiphy, "failed execution\n"); > + return -EIO; > + } > + > + spin_unlock_bh(&priv->fwcmd_lock); > + > + return 0; > +} It looks like fwcmd_lock() is used in this way in every instance. Could you not allocate a pool of command buffers, put them on a list, and only take the lock while you pull them out and reinsert them back into the list? If you need to hold a lock during firmware command execution, you probably should switch to a mutex mechanism rather than spin locks. > + > +int mwl_fwcmd_get_stat(struct ieee80211_hw *hw, > + struct ieee80211_low_level_stats *stats) > +{ > + struct mwl_priv *priv = hw->priv; > + struct hostcmd_cmd_802_11_get_stat *pcmd; > + > + pcmd = (struct hostcmd_cmd_802_11_get_stat *)&priv->pcmd_buf[0]; > + > + spin_lock_bh(&priv->fwcmd_lock); > + > + memset(pcmd, 0x00, sizeof(*pcmd)); > + pcmd->cmd_hdr.cmd = cpu_to_le16(HOSTCMD_CMD_802_11_GET_STAT); > + pcmd->cmd_hdr.len = cpu_to_le16(sizeof(*pcmd)); > + > + if (mwl_fwcmd_exec_cmd(priv, HOSTCMD_CMD_802_11_GET_STAT)) { > + spin_unlock_bh(&priv->fwcmd_lock); > + wiphy_err(hw->wiphy, "failed execution\n"); > + return -EIO; > + } > + > + stats->dot11ACKFailureCount = > + le32_to_cpu(pcmd->ack_failures); > + stats->dot11RTSFailureCount = > + le32_to_cpu(pcmd->rts_failures); > + stats->dot11FCSErrorCount = > + le32_to_cpu(pcmd->rx_fcs_errors); > + stats->dot11RTSSuccessCount = > + le32_to_cpu(pcmd->rts_successes); > + > + spin_unlock_bh(&priv->fwcmd_lock); > + > + return 0; > +} > + > +int mwl_fwcmd_radio_enable(struct ieee80211_hw *hw) > +{ > + return mwl_fwcmd_802_11_radio_control(hw->priv, true, false); > +} > + > +int mwl_fwcmd_radio_disable(struct ieee80211_hw *hw) > +{ > + return mwl_fwcmd_802_11_radio_control(hw->priv, false, false); > +} These last two makes me think you only use the spin lock for buffer management and not the command execution itself? I am out of time for today, I'll try to see if I can find more time later - please look into fixing the above. Jes ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 19:47 ` Jes Sorensen @ 2015-11-26 8:34 ` David Lin 0 siblings, 0 replies; 26+ messages in thread From: David Lin @ 2015-11-26 8:34 UTC (permalink / raw) To: Jes Sorensen Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh PiBPbiBOb3ZlbWJlciAxMywgMjAxNSAzOjQ4IEFNLCBKZXMgU29yZW5zZW4gd3JvdGU6DQo+IA0K PiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5jb20+IHdyaXRlczoNCj4gPiBUaGlzIHBhdGNoIHBy b3ZpZGVzIHRoZSBtd2x3aWZpIGRyaXZlciBmb3IgTWFydmVsbCA4ODYzLCA4ODY0IGFuZCA4ODk3 DQo+ID4gY2hpcHNldHMuDQo+ID4gVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BlZCBhcyBwYXJ0IG9m IHRoZSBvcGVud3J0Lm9yZyBwcm9qZWN0IHRvDQo+ID4gc3VwcG9ydCBMaW5rc3lzIFdSVDE5MDBB QyBhbmQgaXMgbWFpbnRhaW5lZCBvbg0KPiBodHRwczovL2dpdGh1Yi5jb20va2Fsb3ovbXdsd2lm aS4NCj4gPg0KPiA+IFRoZSBtd2x3aWZpIGRyaXZlciBkaWZmZXJzIGZyb20gZXhpc3RpbmcgbXdp ZmlleCBkcml2ZXI6DQo+ID4gbyBtd2x3aWZpIGlzIGEgInNvZnRtYWMgZHJpdmVyIiB1c2luZyB0 aGUga2VybmVsP+6ogyBtYWM4MDIuMTEgc3Vic3lzdGVtDQo+ID4gdG8gcHJvdmlkZSBmdWxsIEFQ L1dpcmVsZXNzIEJyaWRnZSBmdW5jdGlvbmFsaXR5IChyb3V0ZXJzKS4NCj4gPiBvIG13aWZpZXgg aXMgYSAiZnVsbG1hYyBkcml2ZXIiIHdoaWNoIHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQg b2YNCj4gPiBjbGllbnQgZnVuY3Rpb25zIChsYXB0b3BzL2VtYmVkZGVkIGRldmljZXMpIG8gb25s eSBtd2x3aWZpIHN1cHBvcnRzDQo+ID4gTWFydmVsbCBBUCBjaGlwIDg4Nlggc2VyaWVzDQo+ID4N Cj4gPiBOT1RFOiBVc2VycyB3aXRoIE1hcnZlbGwgODhXODg5NyBjaGlwc2V0cyBjdXJyZW50bHkg c2hvdWxkIGVuYWJsZQ0KPiA+IChDT05GSUc9WSBvciBNKSBlaXRoZXIgQ09ORklHX01XSUZJRVgg b3IgQ09ORklHX01XTFdJRkksIE5PVA0KPiBCT1RILg0KPiANCj4gSSBkaWRuJ3QgZ2V0IHZlcnkg ZmFyIHJlYWRpbmcgdGhyb3VnaCB0aGlzIC0gYnV0IHRoZXJlIHdhcyBhIGZldyBiaXRzIHRoYXQg c3Rvb2QNCj4gb3V0IGxpa2UgYSBzb3JlIHRodW1iLg0KPiANCj4gPiBtd2x3aWZpIGRyaXZlciBs ZXZlcmFnZWQgY29kZSBmcm9tIGV4aXN0aW5nIE1XTDhLIGRyaXZlciBpbiB0aGUNCj4gPiBmb2xs b3dpbmcgYXJlYXM6DQo+ID4gLSA4MDIuMTFuIHNldHRpbmcgZm9yIG1hYzgwMjExDQo+ID4gLSBG dW5jdGlvbnMgbmVlZGVkIHRvIGhvb2sgdXAgdG8gbWFjODAyMTENCj4gPiAtIEludGVyYWN0aW9u cyB3aXRoIG1hYzgwMjExIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4gLSBQYXJ0aWFsIGZp cm13YXJlIEFQSXMsIHNvbWUgZGF0YSBmaWVsZHMNCj4gPiAtIE1ldGhvZCB0byBwYXNzIFJ4IHBh Y2tldHMgdG8gbWFjODAyMTEgZXhjZXB0IDExYWMgcmF0ZXMNCj4gPg0KPiA+IEluIGFkZGl0aW9u LCBtd2x3aWZpIGRyaXZlciBzdXBwb3J0czoNCj4gPiAtIGZ1dHVyZSBzY2FsYWJpbGl0eSBhbmQg ZnV0dXJlIGRldmVsb3BtZW50IChyZWZhY3RvcmVkIHNvdXJjZSBjb2RlKQ0KPiA+IC0gTWFydmVs bCA4MDIuMTFhYyBjaGlwc2V0cywgaW5jbHVkaW5nIGNvbWJvIEJUIGRldmljZXMNCj4gPiAtIDgw Mi4xMWFjIHJlbGF0ZWQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucw0KPiA+IC0gY29uY3VycmVudCBB UCtTVEEgZnVuY3Rpb25hbGl0aWVzIHdpdGggc2luZ2xlIGZpcm13YXJlIHBlciBjaGlwDQo+ID4g LSBmaXJtd2FyZSBBUElzIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQNCj4gPiAtIGNvbW11bmlj YXRpbmcgbmV3IG1hYzgwMjExIHNldHRpbmdzIHRvIGZpcm13YXJlDQo+ID4gLSBEaWZmZXJlbnQg VFgvUlggZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KPiA+IC0gQS1NU0RVIGFuZCBBLU1QRFUN Cj4gPiAtIG1hYzgwMjExLWJhc2VkIE1FU0ggKHdvcmsgaW4gcHJvZ3Jlc3MpDQo+ID4gLSBSZWZp bmVkIHRoZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4NCj4gPiBOT1RFOiBNV0xX SUZJIHdpbGwgYmUgb3JnYW5pemVkIHVuZGVyIG5ldyB2ZW5kb3Igc3BlY2lmaWMNCj4gPiBmb2xk ZXIvbWFydmVsbCwgYXMgcGVyIHJlcXVlc3Qgb2YgdGhlIGdhdGUga2VlcGVyIGFuZCBjb21tdW5p dHkuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5jb20+ DQo+ID4gLS0tDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvTUFJTlRBSU5FUlMgYi9NQUlOVEFJTkVS UyBpbmRleCAyN2IyN2MwLi43YzMyZjBhIDEwMDY0NA0KPiA+IC0tLSBhL01BSU5UQUlORVJTDQo+ ID4gKysrIGIvTUFJTlRBSU5FUlMNCj4gPiBAQCAtNjYyOSw2ICs2NjI5LDEyIEBAIEw6CWxpbnV4 LXdpcmVsZXNzQHZnZXIua2VybmVsLm9yZw0KPiA+ICBTOglPZGQgRml4ZXMNCj4gPiAgRjoJZHJp dmVycy9uZXQvd2lyZWxlc3MvbXdsOGsuYw0KPiA+DQo+ID4gK01BUlZFTEwgTVdMV0lGSSBXSVJF TEVTUyBEUklWRVINCj4gPiArTToJRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPg0KPiA+ICtM OglsaW51eC13aXJlbGVzc0B2Z2VyLmtlcm5lbC5vcmcNCj4gPiArUzoJTWFpbnRhaW5lZA0KPiA+ ICtGOglkcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkNCj4gPiArDQo+ID4gIE1B UlZFTEwgU09DIE1NQy9TRC9TRElPIENPTlRST0xMRVIgRFJJVkVSDQo+ID4gIE06CU5pY29sYXMg UGl0cmUgPG5pY29AZmx1eG5pYy5uZXQ+DQo+ID4gIFM6CU9kZCBGaXhlcw0KPiA+IGRpZmYgLS1n aXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9LY29uZmlnDQo+ID4gYi9kcml2ZXJzL25ldC93aXJl bGVzcy9LY29uZmlnIGluZGV4IGY5Zjk0MjIuLmQ1OTliMzUgMTAwNjQ0DQo+ID4gLS0tIGEvZHJp dmVycy9uZXQvd2lyZWxlc3MvS2NvbmZpZw0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNz L0tjb25maWcNCj4gPiBAQCAtMjg1LDUgKzI4NSw2IEBAIHNvdXJjZSAiZHJpdmVycy9uZXQvd2ly ZWxlc3MvemQxMjExcncvS2NvbmZpZyINCj4gPiAgc291cmNlICJkcml2ZXJzL25ldC93aXJlbGVz cy9td2lmaWV4L0tjb25maWciDQo+ID4gIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvY3cx MjAwL0tjb25maWciDQo+ID4gIHNvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvcnNpL0tjb25m aWciDQo+ID4gK3NvdXJjZSAiZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9LY29uZmlnIg0K PiA+DQo+ID4gIGVuZGlmICMgV0xBTg0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJl bGVzcy9NYWtlZmlsZQ0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvTWFrZWZpbGUgaW5kZXgg NzQwZmRkMy4uNzE1MDRhNyAxMDA2NDQNCj4gPiAtLS0gYS9kcml2ZXJzL25ldC93aXJlbGVzcy9N YWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL01ha2VmaWxlDQo+ID4gQEAg LTYwLDMgKzYwLDUgQEAgb2JqLSQoQ09ORklHX0JSQ01TTUFDKQkrPSBicmNtODAyMTEvDQo+ID4N Cj4gPiAgb2JqLSQoQ09ORklHX0NXMTIwMCkJKz0gY3cxMjAwLw0KPiA+ICBvYmotJChDT05GSUdf UlNJXzkxWCkJKz0gcnNpLw0KPiA+ICsNCj4gPiArb2JqLSQoQ09ORklHX1dMX01BUlZFTEwpCSs9 IG1hcnZlbGwvDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwv S2NvbmZpZw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9LY29uZmlnDQo+ID4g bmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi5kNzNlNjQyDQo+ID4gLS0t IC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvS2NvbmZp Zw0KPiA+IEBAIC0wLDAgKzEsOCBAQA0KPiA+ICttZW51Y29uZmlnIFdMX01BUlZFTEwNCj4gPiAr CWJvb2wgIk1hcnZlbGwgV2lyZWxlc3MgTEFOIHN1cHBvcnQiDQo+ID4gKwktLS1oZWxwLS0tDQo+ ID4gKwkgIEVuYWJsZSBjb21tdW5pdHkgZHJpdmVycyBmb3IgTWFydmVsbCBXaS1GaSBkZXZpY2Vz Lg0KPiA+ICsNCj4gPiAraWYgV0xfTUFSVkVMTA0KPiA+ICtzb3VyY2UgImRyaXZlcnMvbmV0L3dp cmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnIg0KPiA+ICtlbmRpZiAjIFdMX01BUlZFTEwN Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9NYWtlZmlsZQ0K PiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9NYWtlZmlsZQ0KPiA+IG5ldyBmaWxl IG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uNzBkMWIzZg0KPiA+IC0tLSAvZGV2L251 bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL01ha2VmaWxlDQo+ID4g QEAgLTAsMCArMSBAQA0KPiA+ICtvYmotJChDT05GSUdfTVdMV0lGSSkJKz0gbXdsd2lmaS8NCj4g PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL0tjb25m aWcNCj4gPiBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9LY29uZmlnDQo+ ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi5hOWJjYjljDQo+ID4g LS0tIC9kZXYvbnVsbA0KPiA+ICsrKyBiL2RyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXds d2lmaS9LY29uZmlnDQo+ID4gQEAgLTAsMCArMSwyMyBAQA0KPiA+ICtjb25maWcgTVdMV0lGSQ0K PiA+ICsgdHJpc3RhdGUgIk1hcnZlbGwgQXZhc3RhciA4OFc4ODY0Lzg4Vzg4OTcgUENJZSBkcml2 ZXIgKG1hYzgwMjExDQo+ID4gY29tcGF0aWJsZSkiDQo+ID4gKwlkZXBlbmRzIG9uIFBDSSAmJiBN QUM4MDIxMQ0KPiA+ICsJc2VsZWN0IEZXX0xPQURFUg0KPiA+ICsJLS0taGVscC0tLQ0KPiA+ICsJ CVNlbGVjdCB0byBidWlsZCB0aGUgZHJpdmVyIHN1cHBvcnRpbmcgdGhlOg0KPiA+ICsNCj4gPiAr CQlNYXJ2ZWxsIFdpcmVsZXNzIFdpLUZpIDg4Vzg4NjQgbW9kdWxlcw0KPiA+ICsJCU1hcnZlbGwg V2lyZWxlc3MgV2ktRmkgODhXODg5NyBtb2R1bGVzDQo+ID4gKw0KPiA+ICsJCVRoaXMgZHJpdmVy IHVzZXMgdGhlIGtlcm5lbCdzIG1hYzgwMjExIHN1YnN5c3RlbS4NCj4gPiArDQo+ID4gKyBJZiB5 b3Ugd2FudCB0byBjb21waWxlIHRoZSBkcml2ZXIgYXMgYSBtb2R1bGUgKD0gY29kZSB3aGljaCBj YW4gYmUNCj4gPiAraW5zZXJ0ZWQgaW4gYW5kIHJlbW92ZWQgZnJvbSB0aGUgcnVubmluZyBrZXJu ZWwgd2hlbmV2ZXIgeW91IHdhbnQpLA0KPiA+ICtzYXkgTSBoZXJlIGFuZCByZWFkIDxmaWxlOkRv Y3VtZW50YXRpb24va2J1aWxkL21vZHVsZXMudHh0Pi4gIFRoZQ0KPiA+ICsJCW1vZHVsZSB3aWxs IGJlIGNhbGxlZCBtd2x3aWZpLg0KPiA+ICsNCj4gPiArIE5PVEU6IFNlbGVjdGluZyB0aGlzIGRy aXZlciBtYXkgY2F1c2UgY29uZmxpY3Qgd2l0aCBNV0lGSUVYIGRyaXZlcg0KPiA+ICsJCXRoYXQg YWxzbyBvcGVyYXRlcyBvbiB0aGUgc2FtZSBwYXJ0IG51bWJlciA4OFc4ODk3LiBVc2VycyBzaG91 bGQNCj4gPiArCQlzZWxlY3QgZWl0aGVyIE1XSUZJRVggb3IgTVdMV0lGSSwgbm90IGJvdGguIE1X SUZJRVggaXMgZnVsbG1hYywNCj4gPiArc3VwcG9ydGluZyBtb3JlIGNvbXByZWhlbnNpdmUgY2xp ZW50IGZ1bmN0aW9ucyBmb3IgbGFwdG9wcy9lbWJlZGRlZA0KPiA+ICsJCWRldmljZXMuIE1XTFdJ RkkgaXMgbWFjODAyMTEtYmFzZWQgZm9yIGZ1bGwgQVAvV2lyZWxlc3MgQnJpZGdlLg0KPiA+ICsN Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL01h a2VmaWxlDQo+ID4gYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvTWFrZWZp bGUNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLjg4ZjdlZmQN Cj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs bC9td2x3aWZpL01ha2VmaWxlDQo+ID4gQEAgLTAsMCArMSwxMiBAQA0KPiA+ICtvYmotJChDT05G SUdfTVdMV0lGSSkJKz0gbXdsd2lmaS5vDQo+ID4gKw0KPiA+ICttd2x3aWZpLW9ianMJCSs9IG1h aW4ubw0KPiA+ICttd2x3aWZpLW9ianMJCSs9IG1hYzgwMjExLm8NCj4gPiArbXdsd2lmaS1vYmpz CQkrPSBmd2RsLm8NCj4gPiArbXdsd2lmaS1vYmpzCQkrPSBmd2NtZC5vDQo+ID4gK213bHdpZmkt b2JqcwkJKz0gdHgubw0KPiA+ICttd2x3aWZpLW9ianMJCSs9IHJ4Lm8NCj4gPiArbXdsd2lmaS1v YmpzCQkrPSBpc3Iubw0KPiA+ICttd2x3aWZpLSQoQ09ORklHX0RFQlVHX0ZTKSArPSBkZWJ1Z2Zz Lm8NCj4gPiArDQo+ID4gK2NjZmxhZ3MteSArPSAtRF9fQ0hFQ0tfRU5ESUFOX18NCj4gPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuYw0K PiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuYw0KPiA+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uOTk3NDYxYQ0KPiA+IC0t LSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp ZmkvZGVidWdmcy5jDQo+ID4gQEAgLTAsMCArMSw0MzMgQEANCj4gPiArLyoNCj4gPiArICogQ29w eXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQo+ID4gKyAq DQo+ID4gKyAqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0ZWQg YnkgTWFydmVsbA0KPiA+ICtJbnRlcm5hdGlvbmFsDQo+ID4gKyAqIEx0ZC4gdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsDQo+ID4gK0p1 bmUgMTk5MQ0KPiA+ICsgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0cmli dXRlIGFuZC9vciBtb2RpZnkgdGhpcw0KPiA+ICtGaWxlIGluDQo+ID4gKyAqIGFjY29yZGFuY2Ug d2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBvZg0K PiA+ICt3aGljaA0KPiA+ICsgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+ID4gKyAqDQo+ID4gKyAqIFRIRSBGSUxFIElTIERJ U1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQNCj4gPiAr VEhFDQo+ID4gKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklU TkVTUyBGT1IgQQ0KPiBQQVJUSUNVTEFSDQo+ID4gK1BVUlBPU0UNCj4gPiArICogQVJFIEVYUFJF U1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxz DQo+ID4gK2Fib3V0DQo+ID4gKyAqIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4NCj4gPiArICov DQo+ID4gKw0KPiA+ICsvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGRlYnVn IGZzIHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4L2Rl YnVnZnMuaD4NCj4gPiArDQo+ID4gKyNpbmNsdWRlICJzeXNhZHB0LmgiDQo+ID4gKyNpbmNsdWRl ICJkZXYuaCINCj4gPiArI2luY2x1ZGUgImhvc3RjbWQuaCINCj4gPiArI2luY2x1ZGUgImZ3Y21k LmgiDQo+ID4gKyNpbmNsdWRlICJkZWJ1Z2ZzLmgiDQo+ID4gKw0KPiA+ICsjZGVmaW5lIE1XTFdJ RklfREVCVUdGU19BRERfRklMRShuYW1lKSBkbyB7IFwNCj4gPiArCWlmICghZGVidWdmc19jcmVh dGVfZmlsZSgjbmFtZSwgMDY0NCwgcHJpdi0+ZGVidWdmc19waHksIFwNCj4gPiArCQkJCSBwcml2 LCAmbXdsX2RlYnVnZnNfIyNuYW1lIyNfZm9wcykpIFwNCj4gPiArCQlyZXR1cm47IFwNCj4gPiAr fSB3aGlsZSAoMCkNCj4gDQo+IFRoaXMgbWFjcm9zIHJlbGllcyBvbiBpbXBsaWNpdCBhcmd1bWVu dHMgd2hpY2ggaXMganVzdCBiYWQgYW5kIGRvZXNuJ3QgcmVhbGx5DQo+IGRvIGFueXRoaW5nIGV4 Y2VwdCBmb3Igb2JmdXNjYXRpbmcgdGhlIGNvZGUuDQo+IA0KDQpUaGFua3MgZm9yIGZlZWRiYWNr LiBUaGVzZSBjb2RlcyBhcmUgbGV2ZXJhZ2VkIGZyb20gZXhpc3RpbmcgbXdpZmlleCBkcml2ZXIg Zm9yIGNvbnNpc3RlbmN5LiBQbGVhc2Uga2luZGx5IGFjY2VwdCBpdCBhcyBpcyBub3csIGFuZCBJ IHdpbGwgaW5pdGlhdGUgYSB0YXNrIHRvIGRpc2N1c3Mgd2l0aCBtd2lmaWV4IG1haW50YWluZXIg YWJvdXQgdGhpcyBjb21tZW50LiBUaGVuIHdlIHdpbGwgY29tZSBiYWNrIHdpdGggc3VnZ2VzdGlv bi9jaGFuZ2UuDQoNCj4gPiArI2RlZmluZSBNV0xXSUZJX0RFQlVHRlNfRklMRV9PUFMobmFtZSkg XCBzdGF0aWMgY29uc3Qgc3RydWN0DQo+ID4gK2ZpbGVfb3BlcmF0aW9ucyBtd2xfZGVidWdmc18j I25hbWUjI19mb3BzID0geyBcDQo+ID4gKwkucmVhZCA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3Jl YWQsIFwNCj4gPiArCS53cml0ZSA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3dyaXRlLCBcDQo+ID4g Kwkub3BlbiA9IHNpbXBsZV9vcGVuLCBcDQo+ID4gK30NCj4gPiArDQo+ID4gKyNkZWZpbmUgTVdM V0lGSV9ERUJVR0ZTX0ZJTEVfUkVBRF9PUFMobmFtZSkgXCBzdGF0aWMgY29uc3Qgc3RydWN0DQo+ ID4gK2ZpbGVfb3BlcmF0aW9ucyBtd2xfZGVidWdmc18jI25hbWUjI19mb3BzID0geyBcDQo+ID4g KwkucmVhZCA9IG13bF9kZWJ1Z2ZzXyMjbmFtZSMjX3JlYWQsIFwNCj4gPiArCS5vcGVuID0gc2lt cGxlX29wZW4sIFwNCj4gPiArfQ0KPiA+ICsNCj4gPiArI2RlZmluZSBNV0xXSUZJX0RFQlVHRlNf RklMRV9XUklURV9PUFMobmFtZSkgXCBzdGF0aWMgY29uc3Qgc3RydWN0DQo+ID4gK2ZpbGVfb3Bl cmF0aW9ucyBtd2xfZGVidWdmc18jI25hbWUjI19mb3BzID0geyBcDQo+ID4gKwkud3JpdGUgPSBt d2xfZGVidWdmc18jI25hbWUjI193cml0ZSwgXA0KPiA+ICsJLm9wZW4gPSBzaW1wbGVfb3Blbiwg XA0KPiA+ICt9DQo+IA0KPiBBZ2FpbiBoZXJlIC0geW91IHVzZSB0aGllc2Ugd3JhcHBlcnMgb25j ZSwganVzdCBkZWNsYXJlIHRoZSBzdHJ1Y3RzIGV4cGxpY2l0bHkNCj4gcmF0aGVyIHRoYW4gdGhp cyBtYWNybyB3cmFwcGluZyBkYW5jZS4NCj4gDQoNClRoYW5rcyBmb3IgZmVlZGJhY2suIFRoZXNl IGNvZGVzIGFyZSBsZXZlcmFnZWQgZnJvbSBleGlzdGluZyBtd2lmaWV4IGRyaXZlciBmb3IgY29u c2lzdGVuY3kuIFBsZWFzZSBraW5kbHkgYWNjZXB0IGl0IGFzIGlzIG5vdywgYW5kIEkgd2lsbCBp bml0aWF0ZSBhIHRhc2sgdG8gZGlzY3VzcyB3aXRoIG13aWZpZXggbWFpbnRhaW5lciBhYm91dCB0 aGlzIGNvbW1lbnQuIFRoZW4gd2Ugd2lsbCBjb21lIGJhY2sgd2l0aCBzdWdnZXN0aW9uL2NoYW5n ZS4NCg0KPiA+ICtzdGF0aWMgaW50IHByaW50X21hY19hZGRyKGNoYXIgKnAsIHU4ICptYWNfYWRk cikgew0KPiA+ICsJaW50IGk7DQo+ID4gKwljaGFyICpzdHIgPSBwOw0KPiA+ICsNCj4gPiArCXN0 ciArPSBzcHJpbnRmKHN0ciwgIm1hYyBhZGRyZXNzOiAlMDJ4IiwgbWFjX2FkZHJbMF0pOw0KPiA+ ICsJZm9yIChpID0gMTsgaSA8IEVUSF9BTEVOOyBpKyspDQo+ID4gKwkJc3RyICs9IHNwcmludGYo c3RyLCAiOiUwMngiLCBtYWNfYWRkcltpXSk7DQo+ID4gKwlzdHIgKz0gc3ByaW50ZihzdHIsICJc biIpOw0KPiA+ICsNCj4gPiArCXJldHVybiAoc3RyIC0gcCk7DQo+ID4gK30NCj4gPiArDQo+ID4g K3N0YXRpYyBpbnQgZHVtcF9kYXRhKGNoYXIgKnAsIHU4ICpkYXRhLCBpbnQgbGVuLCBjaGFyICp0 aXRsZSkgew0KPiA+ICsJY2hhciAqc3RyID0gcDsNCj4gPiArCWludCBjdXJfYnl0ZSA9IDA7DQo+ ID4gKwlpbnQgaTsNCj4gPiArDQo+ID4gKwlzdHIgKz0gc3ByaW50ZihzdHIsICIlc1xuIiwgdGl0 bGUpOw0KPiA+ICsJZm9yIChjdXJfYnl0ZSA9IDA7IGN1cl9ieXRlIDwgbGVuOyBjdXJfYnl0ZSAr PSA4KSB7DQo+ID4gKwkJaWYgKChjdXJfYnl0ZSArIDgpIDwgbGVuKSB7DQo+ID4gKwkJCWZvciAo aSA9IDA7IGkgPCA4OyBpKyspDQo+ID4gKwkJCQlzdHIgKz0gc3ByaW50ZihzdHIsICIweCUwMngg IiwNCj4gPiArCQkJCQkgICAgICAgKihkYXRhICsgY3VyX2J5dGUgKyBpKSk7DQo+ID4gKwkJCXN0 ciArPSBzcHJpbnRmKHN0ciwgIlxuIik7DQo+ID4gKwkJfSBlbHNlIHsNCj4gPiArCQkJZm9yIChp ID0gMDsgaSA8IChsZW4gLSBjdXJfYnl0ZSk7IGkrKykNCj4gPiArCQkJCXN0ciArPSBzcHJpbnRm KHN0ciwgIjB4JTAyeCAiLA0KPiA+ICsJCQkJCSAgICAgICAqKGRhdGEgKyBjdXJfYnl0ZSArIGkp KTsNCj4gPiArCQkJc3RyICs9IHNwcmludGYoc3RyLCAiXG4iKTsNCj4gPiArCQkJYnJlYWs7DQo+ ID4gKwkJfQ0KPiA+ICsJfQ0KPiA+ICsNCj4gPiArCXJldHVybiAoc3RyIC0gcCk7DQo+ID4gK30N Cj4gPiArDQo+ID4gK3N0YXRpYyBzc2l6ZV90IG13bF9kZWJ1Z2ZzX2luZm9fcmVhZChzdHJ1Y3Qg ZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gKwkJCQkgICAgIHNpemVfdCBjb3Vu dCwgbG9mZl90ICpwcG9zKQ0KPiA+ICt7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSAo c3RydWN0IG13bF9wcml2ICopZmlsZS0+cHJpdmF0ZV9kYXRhOw0KPiA+ICsJdW5zaWduZWQgbG9u ZyBwYWdlID0gZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOw0KPiA+ICsJY2hhciAqcCA9IChj aGFyICopcGFnZTsNCj4gPiArCXNzaXplX3QgcmV0Ow0KPiA+ICsNCj4gPiArCWlmICghcCkNCj4g PiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKwlwICs9IHNwcmludGYocCwgIlxuIik7 DQo+ID4gKwlwICs9IHNwcmludGYocCwgImRyaXZlciBuYW1lOiAlc1xuIiwgTVdMX0RSVl9OQU1F KTsNCj4gPiArCXAgKz0gc3ByaW50ZihwLCAiY2hpcCB0eXBlOiAlc1xuIiwNCj4gPiArCQkgICAg IChwcml2LT5jaGlwX3R5cGUgPT0gTVdMODg2NCkgPyAiODhXODg2NCIgOiAiODhXODg5NyIpOw0K PiA+ICsJcCArPSBzcHJpbnRmKHAsICJodyB2ZXJzaW9uOiAlWFxuIiwgcHJpdi0+aHdfZGF0YS5o d192ZXJzaW9uKTsNCj4gPiArCXAgKz0gc3ByaW50ZihwLCAiZHJpdmVyIHZlcnNpb246ICVzXG4i LCBNV0xfRFJWX1ZFUlNJT04pOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAsICJmaXJtd2FyZSB2ZXJz aW9uOiAweCUwOHhcbiIsDQo+ID4gKwkJICAgICBwcml2LT5od19kYXRhLmZ3X3JlbGVhc2VfbnVt KTsNCj4gPiArCXAgKz0gcHJpbnRfbWFjX2FkZHIocCwgcHJpdi0+aHdfZGF0YS5tYWNfYWRkcik7 DQo+ID4gKwlwICs9IHNwcmludGYocCwgIjJnOiAlc1xuIiwgcHJpdi0+ZGlzYWJsZV8yZyA/ICJk aXNhYmxlIiA6ICJlbmFibGUiKTsNCj4gPiArCXAgKz0gc3ByaW50ZihwLCAiNWc6ICVzXG4iLCBw cml2LT5kaXNhYmxlXzVnID8gImRpc2FibGUiIDogImVuYWJsZSIpOw0KPiA+ICsJcCArPSBzcHJp bnRmKHAsICJhbnRlbm5hOiAlZCAlZFxuIiwNCj4gPiArCQkgICAgIChwcml2LT5hbnRlbm5hX3R4 ID09IEFOVEVOTkFfVFhfNF9BVVRPKSA/IDQgOiAyLA0KPiA+ICsJCSAgICAgKHByaXYtPmFudGVu bmFfcnggPT0gQU5URU5OQV9UWF80X0FVVE8pID8gNCA6IDIpOw0KPiA+ICsJcCArPSBzcHJpbnRm KHAsICJpcnEgbnVtYmVyOiAlZFxuIiwgcHJpdi0+aXJxKTsNCj4gPiArCXAgKz0gc3ByaW50Zihw LCAiaW9iYXNlMDogJXBcbiIsIHByaXYtPmlvYmFzZTApOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAs ICJpb2Jhc2UxOiAlcFxuIiwgcHJpdi0+aW9iYXNlMSk7DQo+ID4gKwlwICs9IHNwcmludGYocCwg InR4IGxpbWl0OiAlZFxuIiwgcHJpdi0+dHhxX2xpbWl0KTsNCj4gPiArCXAgKz0gc3ByaW50Zihw LCAicnggbGltaXQ6ICVkXG4iLCBwcml2LT5yZWN2X2xpbWl0KTsNCj4gPiArCXAgKz0gc3ByaW50 ZihwLCAiYXAgbWFjaWQgc3VwcG9ydDogJTA4eFxuIiwNCj4gPiArCQkgICAgIHByaXYtPmFwX21h Y2lkc19zdXBwb3J0ZWQpOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAsICJzdGEgbWFjaWQgc3VwcG9y dDogJTA4eFxuIiwNCj4gPiArCQkgICAgIHByaXYtPnN0YV9tYWNpZHNfc3VwcG9ydGVkKTsNCj4g PiArCXAgKz0gc3ByaW50ZihwLCAibWFjaWQgdXNlZDogJTA4eFxuIiwgcHJpdi0+bWFjaWRzX3Vz ZWQpOw0KPiA+ICsJcCArPSBzcHJpbnRmKHAsICJtZmcgbW9kZTogJXNcbiIsIHByaXYtPm1mZ19t b2RlID8gInRydWUiIDogImZhbHNlIik7DQo+ID4gKwlwICs9IHNwcmludGYocCwgIlxuIik7DQo+ ID4gKw0KPiA+ICsJcmV0ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBw b3MsIChjaGFyICopcGFnZSwNCj4gPiArCQkJCSAgICAgICh1bnNpZ25lZCBsb25nKXAgLSBwYWdl KTsNCj4gPiArCWZyZWVfcGFnZShwYWdlKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gcmV0Ow0KPiA+ ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgc3NpemVfdCBtd2xfZGVidWdmc192aWZfcmVhZChzdHJ1 Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKnVidWYsDQo+ID4gKwkJCQkgICAgc2l6ZV90IGNv dW50LCBsb2ZmX3QgKnBwb3MpDQo+ID4gK3sNCj4gPiArCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9 IChzdHJ1Y3QgbXdsX3ByaXYgKilmaWxlLT5wcml2YXRlX2RhdGE7DQo+ID4gKwl1bnNpZ25lZCBs b25nIHBhZ2UgPSBnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7DQo+ID4gKwljaGFyICpwID0g KGNoYXIgKilwYWdlOw0KPiA+ICsJc3RydWN0IG13bF92aWYgKm13bF92aWY7DQo+ID4gKwlzdHJ1 Y3QgaWVlZTgwMjExX3ZpZiAqdmlmOw0KPiA+ICsJY2hhciBzc2lkW0lFRUU4MDIxMV9NQVhfU1NJ RF9MRU4gKyAxXTsNCj4gPiArCXNzaXplX3QgcmV0Ow0KPiA+ICsNCj4gPiArCWlmICghcCkNCj4g PiArCQlyZXR1cm4gLUVOT01FTTsNCj4gPiArDQo+ID4gKwlwICs9IHNwcmludGYocCwgIlxuIik7 DQo+ID4gKwlzcGluX2xvY2tfYmgoJnByaXYtPnZpZl9sb2NrKTsNCj4gPiArCWxpc3RfZm9yX2Vh Y2hfZW50cnkobXdsX3ZpZiwgJnByaXYtPnZpZl9saXN0LCBsaXN0KSB7DQo+ID4gKwkJdmlmID0g Y29udGFpbmVyX29mKChjaGFyICopbXdsX3ZpZiwgc3RydWN0IGllZWU4MDIxMV92aWYsDQo+ID4g KwkJCQkgICBkcnZfcHJpdlswXSk7DQo+ID4gKwkJcCArPSBzcHJpbnRmKHAsICJtYWNpZDogJWRc biIsIG13bF92aWYtPm1hY2lkKTsNCj4gPiArCQlzd2l0Y2ggKHZpZi0+dHlwZSkgew0KPiA+ICsJ CWNhc2UgTkw4MDIxMV9JRlRZUEVfQVA6DQo+ID4gKwkJCXAgKz0gc3ByaW50ZihwLCAidHlwZTog YXBcbiIpOw0KPiA+ICsJCQltZW1jcHkoc3NpZCwgdmlmLT5ic3NfY29uZi5zc2lkLA0KPiA+ICsJ CQkgICAgICAgdmlmLT5ic3NfY29uZi5zc2lkX2xlbik7DQo+ID4gKwkJCXNzaWRbdmlmLT5ic3Nf Y29uZi5zc2lkX2xlbl0gPSAwOw0KPiA+ICsJCQlwICs9IHNwcmludGYocCwgInNzaWQ6ICVzXG4i LCBzc2lkKTsNCj4gPiArCQkJcCArPSBwcmludF9tYWNfYWRkcihwLCBtd2xfdmlmLT5ic3NpZCk7 DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJCWNhc2UgTkw4MDIxMV9JRlRZUEVfTUVTSF9QT0lOVDoN Cj4gPiArCQkJcCArPSBzcHJpbnRmKHAsICJ0eXBlOiBtZXNoXG4iKTsNCj4gPiArCQkJcCArPSBw cmludF9tYWNfYWRkcihwLCBtd2xfdmlmLT5ic3NpZCk7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsJ CWNhc2UgTkw4MDIxMV9JRlRZUEVfU1RBVElPTjoNCj4gPiArCQkJcCArPSBzcHJpbnRmKHAsICJ0 eXBlOiBzdGFcbiIpOw0KPiA+ICsJCQlwICs9IHByaW50X21hY19hZGRyKHAsIG13bF92aWYtPnN0 YV9tYWMpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQlkZWZhdWx0Og0KPiA+ICsJCQlwICs9IHNw cmludGYocCwgInR5cGU6IHVua25vd25cbiIpOw0KPiA+ICsJCQlicmVhazsNCj4gPiArCQl9DQo+ ID4gKwkJcCArPSBzcHJpbnRmKHAsICJod19jcnlwdG9fZW5hYmxlZDogJXNcbiIsDQo+ID4gKwkJ CSAgICAgbXdsX3ZpZi0+aXNfaHdfY3J5cHRvX2VuYWJsZWQgPyAidHJ1ZSIgOiAiZmFsc2UiKTsN Cj4gPiArCQlwICs9IHNwcmludGYocCwgImtleSBpZHg6ICVkXG4iLCBtd2xfdmlmLT5rZXlpZHgp Ow0KPiA+ICsJCXAgKz0gc3ByaW50ZihwLCAiSVY6ICUwOHglMDR4XG4iLCBtd2xfdmlmLT5pdjMy LCBtd2xfdmlmLT5pdjE2KTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlmLT5iZWFj b25faW5mby5pZV93bW1fcHRyLA0KPiA+ICsJCQkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2luZm8u aWVfd21tX2xlbiwgIldNTToiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlmLT5i ZWFjb25faW5mby5pZV9yc25fcHRyLA0KPiA+ICsJCQkgICAgICAgbXdsX3ZpZi0+YmVhY29uX2lu Zm8uaWVfcnNuX2xlbiwgIlJTTjoiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShwLCBtd2xfdmlm LT5iZWFjb25faW5mby5pZV9yc240OF9wdHIsDQo+ID4gKwkJCSAgICAgICBtd2xfdmlmLT5iZWFj b25faW5mby5pZV9yc240OF9sZW4sICJSU040ODoiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShw LCBtd2xfdmlmLT5iZWFjb25faW5mby5pZV9odF9wdHIsDQo+ID4gKwkJCSAgICAgICBtd2xfdmlm LT5iZWFjb25faW5mby5pZV9odF9sZW4sICJIVDoiKTsNCj4gPiArCQlwICs9IGR1bXBfZGF0YShw LCBtd2xfdmlmLT5iZWFjb25faW5mby5pZV92aHRfcHRyLA0KPiA+ICsJCQkgICAgICAgbXdsX3Zp Zi0+YmVhY29uX2luZm8uaWVfdmh0X2xlbiwgIlZIVDoiKTsNCj4gPiArCQlwICs9IHNwcmludGYo cCwgIlxuIik7DQo+ID4gKwl9DQo+ID4gKwlzcGluX3VubG9ja19iaCgmcHJpdi0+dmlmX2xvY2sp Ow0KPiANCj4gSSBob3BlIHRoZXJlIGlzIG5vIHdheSB0aGF0IHRoZSBudW1iZXIgb2YgdmlmcyBj YW4gZ2V0IHRvIHRoZSBwb2ludCB3aGVyZSB5b3UNCj4gb3ZlcmZsb3cgdGhlIHBhZ2UgYWxsb2Nh dGVkIHNpbmNlIHRoZXJlIGlzIG5vIGNhcCBvbiB0aGUNCj4gc3ByaW50ZigpIHVzYWdlIGluIGR1 bXBfZGF0YSgpLg0KPiANCg0KSSB3aWxsIG1vZGlmeSBpdC4NCg0KPiA+ICsNCj4gPiArTVdMV0lG SV9ERUJVR0ZTX0ZJTEVfUkVBRF9PUFMoaW5mbyk7DQo+ID4gK01XTFdJRklfREVCVUdGU19GSUxF X1JFQURfT1BTKHZpZik7DQo+ID4gK01XTFdJRklfREVCVUdGU19GSUxFX1JFQURfT1BTKHN0YSk7 DQo+ID4gK01XTFdJRklfREVCVUdGU19GSUxFX1JFQURfT1BTKGFtcGR1KTsNCj4gPiArTVdMV0lG SV9ERUJVR0ZTX0ZJTEVfT1BTKHJlZ3Jkd3IpOw0KPiA+ICsNCj4gPiArdm9pZCBtd2xfZGVidWdm c19pbml0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KSB7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYg KnByaXYgPSBody0+cHJpdjsNCj4gPiArDQo+ID4gKwlpZiAoIXByaXYtPmRlYnVnZnNfcGh5KQ0K PiA+ICsJCXByaXYtPmRlYnVnZnNfcGh5ID0gZGVidWdmc19jcmVhdGVfZGlyKCJtd2x3aWZpIiwN Cj4gPiArCQkJCQkJICAgICAgIGh3LT53aXBoeS0+ZGVidWdmc2Rpcik7DQo+ID4gKw0KPiA+ICsJ aWYgKCFwcml2LT5kZWJ1Z2ZzX3BoeSkNCj4gPiArCQlyZXR1cm47DQo+ID4gKw0KPiA+ICsJTVdM V0lGSV9ERUJVR0ZTX0FERF9GSUxFKGluZm8pOw0KPiA+ICsJTVdMV0lGSV9ERUJVR0ZTX0FERF9G SUxFKHZpZik7DQo+ID4gKwlNV0xXSUZJX0RFQlVHRlNfQUREX0ZJTEUoc3RhKTsNCj4gPiArCU1X TFdJRklfREVCVUdGU19BRERfRklMRShhbXBkdSk7DQo+ID4gKwlNV0xXSUZJX0RFQlVHRlNfQURE X0ZJTEUocmVncmR3cik7DQo+ID4gK30NCj4gPiArDQo+ID4gK3ZvaWQgbXdsX2RlYnVnZnNfcmVt b3ZlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KSB7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYgKnBy aXYgPSBody0+cHJpdjsNCj4gPiArDQo+ID4gKwlkZWJ1Z2ZzX3JlbW92ZShwcml2LT5kZWJ1Z2Zz X3BoeSk7DQo+ID4gKwlwcml2LT5kZWJ1Z2ZzX3BoeSA9IE5VTEw7DQo+ID4gK30NCj4gPiBkaWZm IC0tZ2l0IGEvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuaA0K PiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2RlYnVnZnMuaA0KPiA+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uZGZjMmEzYw0KPiA+IC0t LSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213bHdp ZmkvZGVidWdmcy5oDQo+ID4gQEAgLTAsMCArMSwyNCBAQA0KPiA+ICsvKg0KPiA+ICsgKiBDb3B5 cmlnaHQgKEMpIDIwMDYtMjAxNSwgTWFydmVsbCBJbnRlcm5hdGlvbmFsIEx0ZC4NCj4gPiArICoN Cj4gPiArICogVGhpcyBzb2Z0d2FyZSBmaWxlICh0aGUgIkZpbGUiKSBpcyBkaXN0cmlidXRlZCBi eSBNYXJ2ZWxsDQo+ID4gK0ludGVybmF0aW9uYWwNCj4gPiArICogTHRkLiB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMiwNCj4gPiArSnVu ZSAxOTkxDQo+ID4gKyAqICh0aGUgIkxpY2Vuc2UiKS4gIFlvdSBtYXkgdXNlLCByZWRpc3RyaWJ1 dGUgYW5kL29yIG1vZGlmeSB0aGlzDQo+ID4gK0ZpbGUgaW4NCj4gPiArICogYWNjb3JkYW5jZSB3 aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgTGljZW5zZSwgYSBjb3B5IG9mDQo+ ID4gK3doaWNoDQo+ID4gKyAqIGlzIGF2YWlsYWJsZSBieSB3cml0aW5nIHRvIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4NCj4gPiArICoNCj4gPiArICogVEhFIEZJTEUgSVMgRElT VFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORA0KPiA+ICtU SEUNCj4gPiArICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRO RVNTIEZPUiBBDQo+IFBBUlRJQ1VMQVINCj4gPiArUFVSUE9TRQ0KPiA+ICsgKiBBUkUgRVhQUkVT U0xZIERJU0NMQUlNRUQuICBUaGUgTGljZW5zZSBwcm92aWRlcyBhZGRpdGlvbmFsIGRldGFpbHMN Cj4gPiArYWJvdXQNCj4gPiArICogdGhpcyB3YXJyYW50eSBkaXNjbGFpbWVyLg0KPiA+ICsgKi8N Cj4gPiArDQo+ID4gKy8qIERlc2NyaXB0aW9uOiAgVGhpcyBmaWxlIGRlZmluZXMgZGVidWcgZnMg cmVsYXRlZCBmdW5jdGlvbnMuICovDQo+ID4gKw0KPiA+ICsjaWZuZGVmIF9kZWJ1Z2ZzX2hfDQo+ ID4gKyNkZWZpbmUgX2RlYnVnZnNfaF8NCj4gDQo+IFRoZSBnZW5lcmFsIGNvbnZlbnRpb24gaXMg dG8gdXNlciB1cHBlci1jYXNlIGZvciB0aGUgdGhlc2UgLSBub3QgYSBiaWdnaWUNCj4gdGhvdWdo Lg0KPiANCg0KSSB3aWxsIG1vZGlmeSBpdC4NCg0KPiA+ICtzdHJ1Y3QgbXdsX3ByaXYgew0KPiA+ ICsJc3RydWN0IGllZWU4MDIxMV9odyAqaHc7DQo+ID4gKwlzdHJ1Y3QgZmlybXdhcmUgKmZ3X3Vj b2RlOw0KPiA+ICsJaW50IGNoaXBfdHlwZTsNCj4gPiArDQo+ID4gKwlzdHJ1Y3QgZGV2aWNlX25v ZGUgKmR0X25vZGU7DQo+ID4gKwlzdHJ1Y3QgZGV2aWNlX25vZGUgKnB3cl9ub2RlOw0KPiA+ICsJ Ym9vbCBkaXNhYmxlXzJnOw0KPiA+ICsJYm9vbCBkaXNhYmxlXzVnOw0KPiA+ICsJaW50IGFudGVu bmFfdHg7DQo+ID4gKwlpbnQgYW50ZW5uYV9yeDsNCj4gPiArDQo+ID4gKwlzdHJ1Y3QgbXdsX3R4 X3B3cl90YmwgdHhfcHdyX3RibFtTWVNBRFBUX01BWF9OVU1fQ0hBTk5FTFNdOw0KPiA+ICsJYm9v bCBjZGQ7DQo+ID4gKwl1MTYgdHhhbnRlbm5hMjsNCj4gPiArCXU4IHBvd2luaXRlZDsNCj4gPiAr CXUxNiBtYXhfdHhfcG93W1NZU0FEUFRfVFhfUE9XRVJfTEVWRUxfVE9UQUxdOyAvKiBtYXggdHgg cG93ZXINCj4gKGRCbSkgKi8NCj4gPiArCXUxNiB0YXJnZXRfcG93ZXJzW1NZU0FEUFRfVFhfUE9X RVJfTEVWRUxfVE9UQUxdOyAvKiB0YXJnZXQNCj4gcG93ZXJzICAgKi8NCj4gPiArCXU4IGNhbF90 YmxbMjAwXTsNCj4gPiArDQo+ID4gKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsNCj4gPiArCXZvaWQg X19pb21lbSAqaW9iYXNlMDsgLyogTUVNIEJhc2UgQWRkcmVzcyBSZWdpc3RlciAwICAqLw0KPiA+ ICsJdm9pZCBfX2lvbWVtICppb2Jhc2UxOyAvKiBNRU0gQmFzZSBBZGRyZXNzIFJlZ2lzdGVyIDEg ICovDQo+ID4gKwl1MzIgbmV4dF9iYXJfbnVtOw0KPiA+ICsNCj4gPiArCXNwaW5sb2NrX3QgZndj bWRfbG9jazsgICAgICAgLyogZm9yIGZpcm13YXJlIGNvbW1hbmQgICAgICAgICAqLw0KPiA+ICsJ dW5zaWduZWQgc2hvcnQgKnBjbWRfYnVmOyAgICAvKiBwb2ludGVyIHRvIENtZEJ1ZiAodmlydHVh bCkgICovDQo+ID4gKwlkbWFfYWRkcl90IHBwaHlzX2NtZF9idWY7ICAgIC8qIHBvaW50ZXIgdG8g Q21kQnVmIChwaHlzaWNhbCkgKi8NCj4gPiArCWJvb2wgaW5fc2VuZF9jbWQ7DQo+ID4gKw0KPiA+ ICsJaW50IGlycTsNCj4gPiArCXN0cnVjdCBtd2xfaHdfZGF0YSBod19kYXRhOyAgLyogQWRhcHRl ciBIVyBzcGVjaWZpYyBpbmZvICAgICAqLw0KPiA+ICsNCj4gPiArCS8qIHZhcmlvdXMgZGVzY3Jp cHRvciBkYXRhICovDQo+ID4gKwlzcGlubG9ja190IHR4X2Rlc2NfbG9jazsgICAgIC8qIGZvciB0 eCBkZXNjcmlwdG9yIGRhdGEgICAgICAgKi8NCj4gPiArCXNwaW5sb2NrX3QgcnhfZGVzY19sb2Nr OyAgICAgLyogZm9yIHJ4IGRlc2NyaXB0b3IgZGF0YSAgICAgICAqLw0KPiANCj4gWW91IHByb2Jh Ymx5IGRvbid0IHdhbnQgdG8gZGVjbGFyZSB0aGVzZSB0d28gcmlnaHQgbmV4dCB0byBlYWNoIG90 aGVyLCBpZiB5b3UNCj4gZXhwZWN0IHRoZSBSWCBhbmQgVFggcGF0aHMgb2YgdGhlIGNvZGUgdG8g YmUgYWJsZSB0byBydW4gaW4gcGFyYWxsZWwuDQo+IA0KPiBTcGluIGxvY2tzIGFyZSBub3QgZ3Vh cmFudGVlZCB0byBiZSBjYWNoZSBsaW5lIGFsaWduZWQgb3IgY2FjaGUgbGluZSBzaXplZCwgc28N Cj4geW91IGNhbiBlbmQgdXAgd2l0aCBjYWNoZSBsaW5lIHBpbmcgcG9uZ3MgYmV0d2VlbiBDUFVz IGluIHRoaXMgY2FzZS4NCj4gDQoNCkkgd2lsbCBjaGVjayBhbmQgbW9kaWZ5IGl0Lg0KDQo+ID4g KwlzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSBkZXNjX2RhdGFbU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRB XTsNCj4gPiArCXN0cnVjdCBza19idWZmX2hlYWQgdHhxW1NZU0FEUFRfTlVNX09GX0RFU0NfREFU QV07DQo+ID4gKwlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGRlbGF5X3E7DQo+ID4gKwkvKiBudW1iZXIg b2YgZGVzY3JpcHRvcnMgb3duZWQgYnkgZncgYXQgYW55IG9uZSB0aW1lICovDQo+ID4gKwlpbnQg ZndfZGVzY19jbnRbU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBXTsNCj4gPiArDQo+ID4gKwlzdHJ1 Y3QgdGFza2xldF9zdHJ1Y3QgdHhfdGFzazsNCj4gPiArCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCBy eF90YXNrOw0KPiA+ICsJc3RydWN0IHRhc2tsZXRfc3RydWN0IHFlX3Rhc2s7DQo+ID4gKwlpbnQg dHhxX2xpbWl0Ow0KPiA+ICsJYm9vbCBpc190eF9zY2hlZHVsZTsNCj4gPiArCWludCByZWN2X2xp bWl0Ow0KPiA+ICsJYm9vbCBpc19yeF9zY2hlZHVsZTsNCj4gPiArCWJvb2wgaXNfcWVfc2NoZWR1 bGU7DQo+ID4gKwlzOCBub2lzZTsgICAgICAgICAgICAgICAgICAgIC8qIE1vc3QgcmVjZW50bHkg cmVwb3J0ZWQgbm9pc2UgaW4gZEJtDQo+ICovDQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBv cnRlZF9iYW5kIGJhbmRfMjQ7DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbm5l bHNfMjRbQkFORF8yNF9DSEFOTkVMX05VTV07DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUg cmF0ZXNfMjRbQkFORF8yNF9SQVRFX05VTV07DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3N1cHBv cnRlZF9iYW5kIGJhbmRfNTA7DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgY2hhbm5l bHNfNTBbQkFORF81MF9DSEFOTkVMX05VTV07DQo+ID4gKwlzdHJ1Y3QgaWVlZTgwMjExX3JhdGUg cmF0ZXNfNTBbQkFORF81MF9SQVRFX05VTV07DQo+ID4gKw0KPiA+ICsJdTMyIGFwX21hY2lkc19z dXBwb3J0ZWQ7DQo+ID4gKwl1MzIgc3RhX21hY2lkc19zdXBwb3J0ZWQ7DQo+ID4gKwl1MzIgbWFj aWRzX3VzZWQ7DQo+ID4gKwlzcGlubG9ja190IHZpZl9sb2NrOyAgICAgICAgIC8qIGZvciBwcml2 YXRlIGludGVyZmFjZSBpbmZvICAgKi8NCj4gPiArCXN0cnVjdCBsaXN0X2hlYWQgdmlmX2xpc3Q7 ICAgLyogTGlzdCBvZiBpbnRlcmZhY2VzLiAgICAgICAgICAqLw0KPiA+ICsJdTMyIHJ1bm5pbmdf YnNzZXM7ICAgICAgICAgICAvKiBiaXRtYXAgb2YgcnVubmluZyBCU1NlcyAgICAgICovDQo+ID4g Kw0KPiA+ICsJc3BpbmxvY2tfdCBzdGFfbG9jazsgICAgICAgICAvKiBmb3IgcHJpdmF0ZSBzdGEg aW5mbyAgICAgICAgICovDQo+ID4gKwlzdHJ1Y3QgbGlzdF9oZWFkIHN0YV9saXN0OyAgIC8qIExp c3Qgb2Ygc3RhdGlvbnMgICAgICAgICAgICAgKi8NCj4gDQo+IFRoZXNlIHR3byBhcmUgYXdmdWxs eSBjbG9zZSB0b2dldGhlciB0b28uIFlvdSBtaWdodCBqdXN0IGdldCBhd2F5IHdpdGggaXQgb24N Cj4geDg2XzY0LCBnaXZlbiBsaXN0X2hlYWQgaXMgMTYgYnl0ZXMsIGJ1dCB0aGUgeDg2XzY0IHBh Y2tpbmcgcnVsZXMgYXJlIG9kZCwgc28gSQ0KPiBhbSBuZXZlciBxdWl0ZSBzdXJlLiBPbiB4ODZf MzIgaXQgd2lsbCBjZXJ0YWlubHkgYml0ZSB5b3UNCj4gLSBwcm92aWRlZCB2aWZfbG9jayBhbmQg c3RhX2xvY2sgY2FuIGdldCB0YWtlbiBmcm9tIHR3byBkaWZmZXJlbnQgcGF0aHMuDQo+IA0KDQpJ IHdpbGwgY2hlY2sgYW5kIG1vZGlmeSBpdC4NCg0KPiA+ICsNCj4gPiArCWJvb2wgcmFkaW9fb247 DQo+ID4gKwlib29sIHJhZGlvX3Nob3J0X3ByZWFtYmxlOw0KPiA+ICsJYm9vbCB3bW1fZW5hYmxl ZDsNCj4gPiArCXN0cnVjdCBpZWVlODAyMTFfdHhfcXVldWVfcGFyYW1zDQo+IHdtbV9wYXJhbXNb U1lTQURQVF9UWF9XTU1fUVVFVUVTXTsNCj4gPiArDQo+ID4gKwkvKiBBbXBkdSBzdHJlYW0gaW5m b3JtYXRpb24gKi8NCj4gPiArCXU4IG51bV9hbXBkdV9xdWV1ZXM7DQo+ID4gKwlzcGlubG9ja190 IHN0cmVhbV9sb2NrOyAgICAgIC8qIGZvciBhbXBkdSBzdHJlYW0gICAgICAgICAgICAgKi8NCj4g PiArCXN0cnVjdCBtd2xfYW1wZHVfc3RyZWFtIGFtcGR1W1NZU0FEUFRfVFhfQU1QRFVfUVVFVUVT XTsNCj4gPiArCXN0cnVjdCB3b3JrX3N0cnVjdCB3YXRjaGRvZ19iYV9oYW5kbGU7DQo+ID4gKw0K PiA+ICsJYm9vbCBtZmdfbW9kZTsNCj4gPiArDQo+ID4gKyNpZmRlZiBDT05GSUdfREVCVUdfRlMN Cj4gPiArCXN0cnVjdCBkZW50cnkgKmRlYnVnZnNfcGh5Ow0KPiA+ICsJdTMyIHJlZ190eXBlOw0K PiA+ICsJdTMyIHJlZ19vZmZzZXQ7DQo+ID4gKwl1MzIgcmVnX3ZhbHVlOw0KPiA+ICsjZW5kaWYN Cj4gPiArfTsNCj4gW3NuaXBdDQo+IA0KPiA+ICtzdGF0aWMgdm9pZCBtd2xfZndjbWRfcGFyc2Vf YmVhY29uKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCj4gPiArCQkJCSAgIHN0cnVjdCBtd2xfdmlm ICp2aWYsIHU4ICpiZWFjb24sIGludCBsZW4pIHsNCj4gPiArCXN0cnVjdCBpZWVlODAyMTFfbWdt dCAqbWdtdDsNCj4gPiArCXN0cnVjdCBiZWFjb25faW5mbyAqYmVhY29uX2luZm87DQo+ID4gKwlp bnQgYmFzZWxlbjsNCj4gPiArCXU4ICpwb3M7DQo+ID4gKwlzaXplX3QgbGVmdDsNCj4gPiArCWJv b2wgZWxlbV9wYXJzZV9mYWlsZWQ7DQo+ID4gKw0KPiA+ICsJbWdtdCA9IChzdHJ1Y3QgaWVlZTgw MjExX21nbXQgKiliZWFjb247DQo+ID4gKw0KPiA+ICsJYmFzZWxlbiA9ICh1OCAqKW1nbXQtPnUu YmVhY29uLnZhcmlhYmxlIC0gKHU4ICopbWdtdDsNCj4gPiArCWlmIChiYXNlbGVuID4gbGVuKQ0K PiA+ICsJCXJldHVybjsNCj4gPiArDQo+ID4gKwliZWFjb25faW5mbyA9ICZ2aWYtPmJlYWNvbl9p bmZvOw0KPiA+ICsJbWVtc2V0KGJlYWNvbl9pbmZvLCAwLCBzaXplb2Yoc3RydWN0IGJlYWNvbl9p bmZvKSk7DQo+ID4gKwliZWFjb25faW5mby0+dmFsaWQgPSBmYWxzZTsNCj4gPiArCWJlYWNvbl9p bmZvLT5pZV9odF9wdHIgPSAmYmVhY29uX2luZm8tPmllX2xpc3RfaHRbMF07DQo+ID4gKwliZWFj b25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF92aHRbMF07DQo+ID4g Kw0KPiA+ICsJYmVhY29uX2luZm8tPmNhcF9pbmZvID0gbGUxNl90b19jcHUobWdtdC0+dS5iZWFj b24uY2FwYWJfaW5mbyk7DQo+ID4gKw0KPiA+ICsJcG9zID0gKHU4ICopbWdtdC0+dS5iZWFjb24u dmFyaWFibGU7DQo+ID4gKwlsZWZ0ID0gbGVuIC0gYmFzZWxlbjsNCj4gPiArDQo+ID4gKwllbGVt X3BhcnNlX2ZhaWxlZCA9IGZhbHNlOw0KPiA+ICsNCj4gPiArCXdoaWxlIChsZWZ0ID49IDIpIHsN Cj4gPiArCQl1OCBpZCwgZWxlbjsNCj4gPiArDQo+ID4gKwkJaWQgPSAqcG9zKys7DQo+ID4gKwkJ ZWxlbiA9ICpwb3MrKzsNCj4gPiArCQlsZWZ0IC09IDI7DQo+ID4gKw0KPiA+ICsJCWlmIChlbGVu ID4gbGVmdCkgew0KPiA+ICsJCQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCWJy ZWFrOw0KPiA+ICsJCX0NCj4gPiArDQo+ID4gKwkJc3dpdGNoIChpZCkgew0KPiA+ICsJCWNhc2Ug V0xBTl9FSURfU1VQUF9SQVRFUzoNCj4gPiArCQljYXNlIFdMQU5fRUlEX0VYVF9TVVBQX1JBVEVT Og0KPiA+ICsJCQl7DQo+ID4gKwkJCWludCBpZHgsIGJpLCBvaTsNCj4gPiArCQkJdTggcmF0ZTsN Cj4gPiArDQo+ID4gKwkJCWZvciAoYmkgPSAwOyBiaSA8IFNZU0FEUFRfTUFYX0RBVEFfUkFURVNf RzsNCj4gPiArCQkJICAgICBiaSsrKSB7DQo+ID4gKwkJCQlpZiAoYmVhY29uX2luZm8tPmJfcmF0 ZV9zZXRbYmldID09IDApDQo+ID4gKwkJCQkJYnJlYWs7DQo+ID4gKwkJCX0NCj4gPiArDQo+ID4g KwkJCWZvciAob2kgPSAwOyBvaSA8IFNZU0FEUFRfTUFYX0RBVEFfUkFURVNfRzsNCj4gPiArCQkJ ICAgICBvaSsrKSB7DQo+ID4gKwkJCQlpZiAoYmVhY29uX2luZm8tPm9wX3JhdGVfc2V0W29pXSA9 PSAwKQ0KPiA+ICsJCQkJCWJyZWFrOw0KPiA+ICsJCQl9DQo+ID4gKw0KPiA+ICsJCQlmb3IgKGlk eCA9IDA7IGlkeCA8IGVsZW47IGlkeCsrKSB7DQo+ID4gKwkJCQlyYXRlID0gcG9zW2lkeF07DQo+ ID4gKwkJCQlpZiAoKHJhdGUgJiAweDgwKSAhPSAwKSB7DQo+ID4gKwkJCQkJaWYgKGJpIDwgU1lT QURQVF9NQVhfREFUQV9SQVRFU19HKQ0KPiA+ICsJCQkJCQliZWFjb25faW5mby0+Yl9yYXRlX3Nl dFtiaSsrXQ0KPiA+ICsJCQkJCQkJPSByYXRlICYgMHg3ZjsNCj4gPiArCQkJCQllbHNlIHsNCj4g PiArCQkJCQkJZWxlbV9wYXJzZV9mYWlsZWQgPSB0cnVlOw0KPiA+ICsJCQkJCQlicmVhazsNCj4g PiArCQkJCQl9DQo+ID4gKwkJCQl9DQo+ID4gKwkJCQlpZiAob2kgPCBTWVNBRFBUX01BWF9EQVRB X1JBVEVTX0cpDQo+ID4gKwkJCQkJYmVhY29uX2luZm8tPm9wX3JhdGVfc2V0W29pKytdID0NCj4g PiArCQkJCQkJcmF0ZSAmIDB4N2Y7DQo+ID4gKwkJCQllbHNlIHsNCj4gPiArCQkJCQllbGVtX3Bh cnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCQkJYnJlYWs7DQo+ID4gKwkJCQl9DQo+ID4gKwkJ CX0NCj4gPiArCQkJfQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIFdMQU5fRUlEX1JTTjoN Cj4gPiArCQkJYmVhY29uX2luZm8tPmllX3JzbjQ4X2xlbiA9IChlbGVuICsgMik7DQo+ID4gKwkJ CWJlYWNvbl9pbmZvLT5pZV9yc240OF9wdHIgPSAocG9zIC0gMik7DQo+ID4gKwkJCWJyZWFrOw0K PiA+ICsJCWNhc2UgV0xBTl9FSURfSFRfQ0FQQUJJTElUWToNCj4gPiArCQljYXNlIFdMQU5fRUlE X0hUX09QRVJBVElPTjoNCj4gPiArCQljYXNlIFdMQU5fRUlEX09WRVJMQVBfQlNTX1NDQU5fUEFS QU06DQo+ID4gKwkJY2FzZSBXTEFOX0VJRF9FWFRfQ0FQQUJJTElUWToNCj4gPiArCQkJYmVhY29u X2luZm8tPmllX2h0X2xlbiArPSAoZWxlbiArIDIpOw0KPiA+ICsJCQlpZiAoYmVhY29uX2luZm8t PmllX2h0X2xlbiA+DQo+ID4gKwkJCSAgICBzaXplb2YoYmVhY29uX2luZm8tPmllX2xpc3RfaHQp KSB7DQo+ID4gKwkJCQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCX0gZWxzZSB7 DQo+ID4gKwkJCQkqYmVhY29uX2luZm8tPmllX2h0X3B0cisrID0gaWQ7DQo+ID4gKwkJCQkqYmVh Y29uX2luZm8tPmllX2h0X3B0cisrID0gZWxlbjsNCj4gPiArCQkJCW1lbWNweShiZWFjb25faW5m by0+aWVfaHRfcHRyLCBwb3MsIGVsZW4pOw0KPiA+ICsJCQkJYmVhY29uX2luZm8tPmllX2h0X3B0 ciArPSBlbGVuOw0KPiA+ICsJCQl9DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsjaWZkZWYgQ09ORklH X01BQzgwMjExX01FU0gNCj4gPiArCQljYXNlIFdMQU5fRUlEX01FU0hfQ09ORklHOg0KPiA+ICsJ CQliZWFjb25faW5mby0+aWVfbWVzaGNmZ19sZW4gPSAoZWxlbiArIDIpOw0KPiA+ICsJCQliZWFj b25faW5mby0+aWVfbWVzaGNmZ19wdHIgPSAocG9zIC0gMik7DQo+ID4gKwkJCWJyZWFrOw0KPiA+ ICsJCWNhc2UgV0xBTl9FSURfTUVTSF9JRDoNCj4gPiArCQkJYmVhY29uX2luZm8tPmllX21lc2hp ZF9sZW4gPSAoZWxlbiArIDIpOw0KPiA+ICsJCQliZWFjb25faW5mby0+aWVfbWVzaGlkX3B0ciA9 IChwb3MgLSAyKTsNCj4gPiArCQkJYnJlYWs7DQo+ID4gKwkJY2FzZSBXTEFOX0VJRF9DSEFOX1NX SVRDSF9QQVJBTToNCj4gPiArCQkJYmVhY29uX2luZm8tPmllX21lc2hjaHN3X2xlbiA9IChlbGVu ICsgMik7DQo+ID4gKwkJCWJlYWNvbl9pbmZvLT5pZV9tZXNoY2hzd19wdHIgPSAocG9zIC0gMik7 DQo+ID4gKwkJCWJyZWFrOw0KPiA+ICsjZW5kaWYNCj4gPiArCQljYXNlIFdMQU5fRUlEX1ZIVF9D QVBBQklMSVRZOg0KPiA+ICsJCWNhc2UgV0xBTl9FSURfVkhUX09QRVJBVElPTjoNCj4gPiArCQlj YXNlIFdMQU5fRUlEX09QTU9ERV9OT1RJRjoNCj4gPiArCQkJYmVhY29uX2luZm8tPmllX3ZodF9s ZW4gKz0gKGVsZW4gKyAyKTsNCj4gPiArCQkJaWYgKGJlYWNvbl9pbmZvLT5pZV92aHRfbGVuID4N Cj4gPiArCQkJICAgIHNpemVvZihiZWFjb25faW5mby0+aWVfbGlzdF92aHQpKSB7DQo+ID4gKwkJ CQllbGVtX3BhcnNlX2ZhaWxlZCA9IHRydWU7DQo+ID4gKwkJCX0gZWxzZSB7DQo+ID4gKwkJCQkq YmVhY29uX2luZm8tPmllX3ZodF9wdHIrKyA9IGlkOw0KPiA+ICsJCQkJKmJlYWNvbl9pbmZvLT5p ZV92aHRfcHRyKysgPSBlbGVuOw0KPiA+ICsJCQkJbWVtY3B5KGJlYWNvbl9pbmZvLT5pZV92aHRf cHRyLCBwb3MsIGVsZW4pOw0KPiA+ICsJCQkJYmVhY29uX2luZm8tPmllX3ZodF9wdHIgKz0gZWxl bjsNCj4gPiArCQkJfQ0KPiA+ICsJCQlicmVhazsNCj4gPiArCQljYXNlIFdMQU5fRUlEX1ZFTkRP Ul9TUEVDSUZJQzoNCj4gPiArCQkJaWYgKChwb3NbMF0gPT0gMHgwMCkgJiYgKHBvc1sxXSA9PSAw eDUwKSAmJg0KPiA+ICsJCQkgICAgKHBvc1syXSA9PSAweGYyKSkgew0KPiA+ICsJCQkJaWYgKHBv c1szXSA9PSAweDAxKSB7DQo+ID4gKwkJCQkJYmVhY29uX2luZm8tPmllX3Jzbl9sZW4gPSAoZWxl biArIDIpOw0KPiA+ICsJCQkJCWJlYWNvbl9pbmZvLT5pZV9yc25fcHRyID0gKHBvcyAtIDIpOw0K PiA+ICsJCQkJfQ0KPiA+ICsNCj4gPiArCQkJCWlmIChwb3NbM10gPT0gMHgwMikgew0KPiA+ICsJ CQkJCWJlYWNvbl9pbmZvLT5pZV93bW1fbGVuID0gKGVsZW4gKyAyKTsNCj4gPiArCQkJCQliZWFj b25faW5mby0+aWVfd21tX3B0ciA9IChwb3MgLSAyKTsNCj4gPiArCQkJCX0NCj4gPiArCQkJfQ0K PiA+ICsJCQlicmVhazsNCj4gPiArCQlkZWZhdWx0Og0KPiA+ICsJCQlicmVhazsNCj4gPiArCQl9 DQo+ID4gKw0KPiA+ICsJCWxlZnQgLT0gZWxlbjsNCj4gPiArCQlwb3MgKz0gZWxlbjsNCj4gPiAr CX0NCj4gPiArDQo+ID4gKwlpZiAoIWVsZW1fcGFyc2VfZmFpbGVkKSB7DQo+ID4gKwkJYmVhY29u X2luZm8tPmllX2h0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF9odFswXTsNCj4gPiArCQli ZWFjb25faW5mby0+aWVfdmh0X3B0ciA9ICZiZWFjb25faW5mby0+aWVfbGlzdF92aHRbMF07DQo+ ID4gKwkJYmVhY29uX2luZm8tPnZhbGlkID0gdHJ1ZTsNCj4gPiArCX0NCj4gPiArfQ0KPiANCj4g QW55IHJlYXNvbiB5b3UncmUgbm90IHVzaW5nIGNmZzgwMjExX2ZpbmRfaWUoKSBoZXJlPyBTZWVt cyB0byBiZQ0KPiByZS1pbnZlbnRpbmcgdGhlIHdoZWVsIHRvIG1lLg0KPiANCg0KSXQgaXMgYmV0 dGVyIHRvIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHBhcnNlIGJlYWNvbiBvbmUgdGltZSBhbmQgZ2V0 IGFsbCBJRXMgd2UgbmVlZC4gSXQgaXMgbm90IGEgZ29vZCBpZGVhIHRvIHVzZSBjZmc4MDIxMV9m aW5kX2llKCkgdG8gZmluZCBJRXMgd2UgbmVlZCBvbmUgYnkgb25lLg0KDQo+ID4gK3ZvaWQgbXds X2Z3Y21kX3Jlc2V0KHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3KSB7DQo+ID4gKwlzdHJ1Y3QgbXds X3ByaXYgKnByaXYgPSBody0+cHJpdjsNCj4gPiArDQo+ID4gKwlpZiAobXdsX2Z3Y21kX2Noa19h ZGFwdGVyKHByaXYpKQ0KPiA+ICsJCXdyaXRlbChJU1JfUkVTRVQsDQo+ID4gKwkJICAgICAgIHBy aXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0gyQV9JTlRFUlJVUFRfRVZFTlRTKTsgfQ0KPiA+ICsN Cj4gPiArdm9pZCBtd2xfZndjbWRfaW50X2VuYWJsZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykg ew0KPiA+ICsJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnByaXY7DQo+ID4gKw0KPiA+ICsJ aWYgKG13bF9md2NtZF9jaGtfYWRhcHRlcihwcml2KSkgew0KPiA+ICsJCXdyaXRlbCgweDAwLA0K PiA+ICsJCSAgICAgICBwcml2LT5pb2Jhc2UxICsgTUFDUkVHX1JFR19BMkhfSU5URVJSVVBUX01B U0spOw0KPiA+ICsJCXdyaXRlbCgoTUFDUkVHX0EySFJJQ19CSVRfTUFTSyksDQo+ID4gKwkJICAg ICAgIHByaXYtPmlvYmFzZTEgKyBNQUNSRUdfUkVHX0EySF9JTlRFUlJVUFRfTUFTSyk7DQo+IA0K PiBQbGVhc2UgYXZvaWQgc3VwZXJmbHVvdXMgdXNlIG9mIHBhcmVudGhlc2VzLg0KPiANCg0KSSB3 aWxsIG1vZGlmeSBpdC4NCg0KPiA+ICtpbnQgbXdsX2Z3Y21kX2dldF9od19zcGVjcyhzdHJ1Y3Qg aWVlZTgwMjExX2h3ICpodykgew0KPiA+ICsJc3RydWN0IG13bF9wcml2ICpwcml2ID0gaHctPnBy aXY7DQo+ID4gKwlzdHJ1Y3QgaG9zdGNtZF9jbWRfZ2V0X2h3X3NwZWMgKnBjbWQ7DQo+ID4gKwlp bnQgcmV0cnk7DQo+ID4gKwlpbnQgaTsNCj4gPiArDQo+ID4gKwlpZiAocHJpdi0+bWZnX21vZGUp DQo+ID4gKwkJcmV0dXJuIDA7DQo+ID4gKw0KPiA+ICsJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9j bWRfZ2V0X2h3X3NwZWMgKikmcHJpdi0+cGNtZF9idWZbMF07DQo+ID4gKw0KPiA+ICsJc3Bpbl9s b2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCj4gPiArDQo+ID4gKwl3aXBoeV9kZWJ1Zyhody0+ d2lwaHksICJwY21kID0gJXBcbiIsIHBjbWQpOw0KPiA+ICsJbWVtc2V0KHBjbWQsIDB4MDAsIHNp emVvZigqcGNtZCkpOw0KPiA+ICsJZXRoX2Jyb2FkY2FzdF9hZGRyKHBjbWQtPnBlcm1hbmVudF9h ZGRyKTsNCj4gPiArCXBjbWQtPmNtZF9oZHIuY21kID0gY3B1X3RvX2xlMTYoSE9TVENNRF9DTURf R0VUX0hXX1NQRUMpOw0KPiA+ICsJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9fbGUxNihzaXpl b2YoKnBjbWQpKTsNCj4gPiArCXBjbWQtPmZ3X2F3YWtlX2Nvb2tpZSA9IGNwdV90b19sZTMyKHBy aXYtPnBwaHlzX2NtZF9idWYgKyAyMDQ4KTsNCj4gPiArDQo+ID4gKwlyZXRyeSA9IDA7DQo+ID4g Kwl3aGlsZSAobXdsX2Z3Y21kX2V4ZWNfY21kKHByaXYsIEhPU1RDTURfQ01EX0dFVF9IV19TUEVD KSkgew0KPiA+ICsJCWlmIChyZXRyeSsrID4gTUFYX1dBSVRfR0VUX0hXX1NQRUNTX0lURVJBVE9O Uykgew0KPiA+ICsJCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiY2FuJ3QgZ2V0IGh3IHNwZWNzXG4i KTsNCj4gPiArCQkJc3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KPiA+ICsJCQly ZXR1cm4gLUVJTzsNCj4gPiArCQl9DQo+ID4gKw0KPiA+ICsJCW1kZWxheSgxMDAwKTsNCj4gPiAr CQl3aXBoeV9kZWJ1Zyhody0+d2lwaHksDQo+ID4gKwkJCSAgICAicmVwZWF0IGNvbW1hbmQgPSAl cFxuIiwgcGNtZCk7DQo+ID4gKwl9DQo+IA0KPiAqY291Z2gqIG1kZWxheSgxMDAwKSB3aGlsZSBo b2xkaW5nIGEgc3BpbiBsb2NrIGFuZCB3aXRoaW4gaW4gYSB3aGlsZSgpICpsb29wPw0KPiAqY291 Z2gqDQo+IA0KPiBUaGlzIG5lZWRzIGEgbGl0dGxlIGNsZWFuaW5nIHVwLiBQbGVhc2UgaGF2ZSBh IGxvb2sgYXQNCj4gRG9jdW1lbnRhdGlvbi90aW1lcnMvdGltZXJzLWhvd3RvLnR4dA0KPiANCg0K SSB3aWxsIHRyeSB0byB1c2UgbXV0ZXggYW5kIG1zbGVlcCgpLg0KDQo+ID4gKw0KPiA+ICsJZXRo ZXJfYWRkcl9jb3B5KCZwcml2LT5od19kYXRhLm1hY19hZGRyWzBdLA0KPiBwY21kLT5wZXJtYW5l bnRfYWRkcik7DQo+ID4gKwlwcml2LT5kZXNjX2RhdGFbMF0ud2NiX2Jhc2UgPQ0KPiA+ICsJCWxl MzJfdG9fY3B1KHBjbWQtPndjYl9iYXNlMCkgJiAweDAwMDBmZmZmOw0KPiA+ICsJZm9yIChpID0g MTsgaSA8IFNZU0FEUFRfVE9UQUxfVFhfUVVFVUVTOyBpKyspDQo+ID4gKwkJcHJpdi0+ZGVzY19k YXRhW2ldLndjYl9iYXNlID0NCj4gPiArCQkJbGUzMl90b19jcHUocGNtZC0+d2NiX2Jhc2VbaSAt IDFdKSAmIDB4MDAwMGZmZmY7DQo+ID4gKwlwcml2LT5kZXNjX2RhdGFbMF0ucnhfZGVzY19yZWFk ID0NCj4gPiArCQlsZTMyX3RvX2NwdShwY21kLT5yeHBkX3JkX3B0cikgJiAweDAwMDBmZmZmOw0K PiA+ICsJcHJpdi0+ZGVzY19kYXRhWzBdLnJ4X2Rlc2Nfd3JpdGUgPQ0KPiA+ICsJCWxlMzJfdG9f Y3B1KHBjbWQtPnJ4cGRfd3JfcHRyKSAmIDB4MDAwMGZmZmY7DQo+ID4gKwlwcml2LT5od19kYXRh LnJlZ2lvbl9jb2RlID0gbGUxNl90b19jcHUocGNtZC0+cmVnaW9uX2NvZGUpICYgMHgwMGZmOw0K PiA+ICsJcHJpdi0+aHdfZGF0YS5md19yZWxlYXNlX251bSA9IGxlMzJfdG9fY3B1KHBjbWQtPmZ3 X3JlbGVhc2VfbnVtKTsNCj4gPiArCXByaXYtPmh3X2RhdGEubWF4X251bV90eF9kZXNjID0gbGUx Nl90b19jcHUocGNtZC0+bnVtX3djYik7DQo+ID4gKwlwcml2LT5od19kYXRhLm1heF9udW1fbWNf YWRkciA9DQo+IGxlMTZfdG9fY3B1KHBjbWQtPm51bV9tY2FzdF9hZGRyKTsNCj4gPiArCXByaXYt Pmh3X2RhdGEubnVtX2FudGVubmFzID0gbGUxNl90b19jcHUocGNtZC0+bnVtX2FudGVubmEpOw0K PiA+ICsJcHJpdi0+aHdfZGF0YS5od192ZXJzaW9uID0gcGNtZC0+dmVyc2lvbjsNCj4gPiArCXBy aXYtPmh3X2RhdGEuaG9zdF9pbnRlcmZhY2UgPSBwY21kLT5ob3N0X2lmOw0KPiA+ICsNCj4gPiAr CXNwaW5fdW5sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsNCj4gPiArDQo+ID4gKwlyZXR1cm4g MDsNCj4gPiArfQ0KPiA+ICsNCj4gPiAraW50IG13bF9md2NtZF9zZXRfaHdfc3BlY3Moc3RydWN0 IGllZWU4MDIxMV9odyAqaHcpIHsNCj4gPiArCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9IGh3LT5w cml2Ow0KPiA+ICsJc3RydWN0IGhvc3RjbWRfY21kX3NldF9od19zcGVjICpwY21kOw0KPiA+ICsJ aW50IGk7DQo+ID4gKw0KPiA+ICsJaWYgKHByaXYtPm1mZ19tb2RlKQ0KPiA+ICsJCXJldHVybiAw Ow0KPiA+ICsNCj4gPiArCXBjbWQgPSAoc3RydWN0IGhvc3RjbWRfY21kX3NldF9od19zcGVjICop JnByaXYtPnBjbWRfYnVmWzBdOw0KPiA+ICsNCj4gPiArCXNwaW5fbG9ja19iaCgmcHJpdi0+Zndj bWRfbG9jayk7DQo+ID4gKw0KPiA+ICsJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigqcGNtZCkp Ow0KPiA+ICsJcGNtZC0+Y21kX2hkci5jbWQgPSBjcHVfdG9fbGUxNihIT1NUQ01EX0NNRF9TRVRf SFdfU1BFQyk7DQo+ID4gKwlwY21kLT5jbWRfaGRyLmxlbiA9IGNwdV90b19sZTE2KHNpemVvZigq cGNtZCkpOw0KPiA+ICsJcGNtZC0+d2NiX2Jhc2VbMF0gPSBjcHVfdG9fbGUzMihwcml2LT5kZXNj X2RhdGFbMF0ucHBoeXNfdHhfcmluZyk7DQo+ID4gKwlmb3IgKGkgPSAxOyBpIDwgU1lTQURQVF9U T1RBTF9UWF9RVUVVRVM7IGkrKykNCj4gPiArCQlwY21kLT53Y2JfYmFzZVtpXSA9DQo+ID4gKwkJ CWNwdV90b19sZTMyKHByaXYtPmRlc2NfZGF0YVtpXS5wcGh5c190eF9yaW5nKTsNCj4gPiArCXBj bWQtPnR4X3djYl9udW1fcGVyX3F1ZXVlID0NCj4gY3B1X3RvX2xlMzIoU1lTQURQVF9NQVhfTlVN X1RYX0RFU0MpOw0KPiA+ICsJcGNtZC0+bnVtX3R4X3F1ZXVlcyA9IGNwdV90b19sZTMyKFNZU0FE UFRfTlVNX09GX0RFU0NfREFUQSk7DQo+ID4gKwlwY21kLT50b3RhbF9yeF93Y2IgPSBjcHVfdG9f bGUzMihTWVNBRFBUX01BWF9OVU1fUlhfREVTQyk7DQo+ID4gKwlwY21kLT5yeHBkX3dyX3B0ciA9 IGNwdV90b19sZTMyKHByaXYtPmRlc2NfZGF0YVswXS5wcGh5c19yeF9yaW5nKTsNCj4gPiArCXBj bWQtPmZlYXR1cmVzID0gMDsNCj4gPiArDQo+ID4gKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21kKHBy aXYsIEhPU1RDTURfQ01EX1NFVF9IV19TUEVDKSkgew0KPiA+ICsJCXNwaW5fdW5sb2NrX2JoKCZw cml2LT5md2NtZF9sb2NrKTsNCj4gPiArCQl3aXBoeV9lcnIoaHctPndpcGh5LCAiZmFpbGVkIGV4 ZWN1dGlvblxuIik7DQo+ID4gKwkJcmV0dXJuIC1FSU87DQo+ID4gKwl9DQo+ID4gKw0KPiA+ICsJ c3Bpbl91bmxvY2tfYmgoJnByaXYtPmZ3Y21kX2xvY2spOw0KPiA+ICsNCj4gPiArCXJldHVybiAw Ow0KPiA+ICt9DQo+IA0KPiBJdCBsb29rcyBsaWtlIGZ3Y21kX2xvY2soKSBpcyB1c2VkIGluIHRo aXMgd2F5IGluIGV2ZXJ5IGluc3RhbmNlLiBDb3VsZCB5b3Ugbm90DQo+IGFsbG9jYXRlIGEgcG9v bCBvZiBjb21tYW5kIGJ1ZmZlcnMsIHB1dCB0aGVtIG9uIGEgbGlzdCwgYW5kIG9ubHkgdGFrZSB0 aGUgbG9jaw0KPiB3aGlsZSB5b3UgcHVsbCB0aGVtIG91dCBhbmQgcmVpbnNlcnQgdGhlbSBiYWNr IGludG8gdGhlIGxpc3Q/DQo+IA0KPiBJZiB5b3UgbmVlZCB0byBob2xkIGEgbG9jayBkdXJpbmcg ZmlybXdhcmUgY29tbWFuZCBleGVjdXRpb24sIHlvdSBwcm9iYWJseQ0KPiBzaG91bGQgc3dpdGNo IHRvIGEgbXV0ZXggbWVjaGFuaXNtIHJhdGhlciB0aGFuIHNwaW4gbG9ja3MuDQo+IA0KDQpJIHdp bGwgdHJ5IHRvIHVzZSBtdXRleC4NCg0KPiA+ICsNCj4gPiAraW50IG13bF9md2NtZF9nZXRfc3Rh dChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCj4gPiArCQkgICAgICAgc3RydWN0IGllZWU4MDIx MV9sb3dfbGV2ZWxfc3RhdHMgKnN0YXRzKSB7DQo+ID4gKwlzdHJ1Y3QgbXdsX3ByaXYgKnByaXYg PSBody0+cHJpdjsNCj4gPiArCXN0cnVjdCBob3N0Y21kX2NtZF84MDJfMTFfZ2V0X3N0YXQgKnBj bWQ7DQo+ID4gKw0KPiA+ICsJcGNtZCA9IChzdHJ1Y3QgaG9zdGNtZF9jbWRfODAyXzExX2dldF9z dGF0ICopJnByaXYtPnBjbWRfYnVmWzBdOw0KPiA+ICsNCj4gPiArCXNwaW5fbG9ja19iaCgmcHJp di0+ZndjbWRfbG9jayk7DQo+ID4gKw0KPiA+ICsJbWVtc2V0KHBjbWQsIDB4MDAsIHNpemVvZigq cGNtZCkpOw0KPiA+ICsJcGNtZC0+Y21kX2hkci5jbWQgPQ0KPiBjcHVfdG9fbGUxNihIT1NUQ01E X0NNRF84MDJfMTFfR0VUX1NUQVQpOw0KPiA+ICsJcGNtZC0+Y21kX2hkci5sZW4gPSBjcHVfdG9f bGUxNihzaXplb2YoKnBjbWQpKTsNCj4gPiArDQo+ID4gKwlpZiAobXdsX2Z3Y21kX2V4ZWNfY21k KHByaXYsIEhPU1RDTURfQ01EXzgwMl8xMV9HRVRfU1RBVCkpIHsNCj4gPiArCQlzcGluX3VubG9j a19iaCgmcHJpdi0+ZndjbWRfbG9jayk7DQo+ID4gKwkJd2lwaHlfZXJyKGh3LT53aXBoeSwgImZh aWxlZCBleGVjdXRpb25cbiIpOw0KPiA+ICsJCXJldHVybiAtRUlPOw0KPiA+ICsJfQ0KPiA+ICsN Cj4gPiArCXN0YXRzLT5kb3QxMUFDS0ZhaWx1cmVDb3VudCA9DQo+ID4gKwkJbGUzMl90b19jcHUo cGNtZC0+YWNrX2ZhaWx1cmVzKTsNCj4gPiArCXN0YXRzLT5kb3QxMVJUU0ZhaWx1cmVDb3VudCA9 DQo+ID4gKwkJbGUzMl90b19jcHUocGNtZC0+cnRzX2ZhaWx1cmVzKTsNCj4gPiArCXN0YXRzLT5k b3QxMUZDU0Vycm9yQ291bnQgPQ0KPiA+ICsJCWxlMzJfdG9fY3B1KHBjbWQtPnJ4X2Zjc19lcnJv cnMpOw0KPiA+ICsJc3RhdHMtPmRvdDExUlRTU3VjY2Vzc0NvdW50ID0NCj4gPiArCQlsZTMyX3Rv X2NwdShwY21kLT5ydHNfc3VjY2Vzc2VzKTsNCj4gPiArDQo+ID4gKwlzcGluX3VubG9ja19iaCgm cHJpdi0+ZndjbWRfbG9jayk7DQo+ID4gKw0KPiA+ICsJcmV0dXJuIDA7DQo+ID4gK30NCj4gPiAr DQo+ID4gK2ludCBtd2xfZndjbWRfcmFkaW9fZW5hYmxlKHN0cnVjdCBpZWVlODAyMTFfaHcgKmh3 KSB7DQo+ID4gKwlyZXR1cm4gbXdsX2Z3Y21kXzgwMl8xMV9yYWRpb19jb250cm9sKGh3LT5wcml2 LCB0cnVlLCBmYWxzZSk7IH0NCj4gPiArDQo+ID4gK2ludCBtd2xfZndjbWRfcmFkaW9fZGlzYWJs ZShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodykgew0KPiA+ICsJcmV0dXJuIG13bF9md2NtZF84MDJf MTFfcmFkaW9fY29udHJvbChody0+cHJpdiwgZmFsc2UsIGZhbHNlKTsgfQ0KPiANCj4gVGhlc2Ug bGFzdCB0d28gbWFrZXMgbWUgdGhpbmsgeW91IG9ubHkgdXNlIHRoZSBzcGluIGxvY2sgZm9yIGJ1 ZmZlcg0KPiBtYW5hZ2VtZW50IGFuZCBub3QgdGhlIGNvbW1hbmQgZXhlY3V0aW9uIGl0c2VsZj8N Cj4gDQo+IEkgYW0gb3V0IG9mIHRpbWUgZm9yIHRvZGF5LCBJJ2xsIHRyeSB0byBzZWUgaWYgSSBj YW4gZmluZCBtb3JlIHRpbWUgbGF0ZXIgLSBwbGVhc2UNCj4gbG9vayBpbnRvIGZpeGluZyB0aGUg YWJvdmUuDQo+IA0KPiBKZXMNCg== ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin 2015-11-12 19:47 ` Jes Sorensen @ 2015-11-20 11:22 ` Johannes Berg 2015-11-26 8:27 ` David Lin [not found] ` <CANEJEGv7ENTJu4YHz1x2_ve2M6-3Nn8X-0aC2hA3o1mUs3tQ1g@mail.gmail.com> 2015-12-10 14:03 ` Kalle Valo ` (4 subsequent siblings) 6 siblings, 2 replies; 26+ messages in thread From: Johannes Berg @ 2015-11-20 11:22 UTC (permalink / raw) To: David Lin, Kalle Valo; +Cc: linux-wireless, Chor Teck Law, Pete Hsieh On Thu, 2015-11-12 at 03:51 +0000, David Lin wrote: > > +static int print_mac_addr(char *p, u8 *mac_addr) > +{ > + int i; > + char *str = p; > + > + str += sprintf(str, "mac address: %02x", mac_addr[0]); > + for (i = 1; i < ETH_ALEN; i++) > + str += sprintf(str, ":%02x", mac_addr[i]); > + str += sprintf(str, "\n"); > + > + return (str - p); > +} You can use %pM here (and perhaps get rid of the function then) > +void mwl_debugfs_remove(struct ieee80211_hw *hw) > +{ > + struct mwl_priv *priv = hw->priv; > + > + debugfs_remove(priv->debugfs_phy); doesn't that have to be _recursive()? > +#define MWL_DRV_NAME KBUILD_MODNAME > +#define MWL_DRV_VERSION "10.3.0.14" versions like that are generally fairly useless since you don't update them for every commit ... > +struct mwl_tx_desc { > + u8 data_rate; > + u8 tx_priority; > + __le16 qos_ctrl; [...] I still wouldn't mix device/firmware API with driver-use structures in the same file, it gets confusing. It's your driver though, so if you really want to confuse yourselves ... assuming you're going to maintain it :) > +struct mwl_sta { > + struct list_head list; > + bool is_mesh_node; > + bool is_ampdu_allowed; > + struct mwl_tx_info tx_stats[MWL_MAX_TID]; > + bool is_amsdu_allowed; > + spinlock_t amsdu_lock; /* for amsdu > aggregation */ > + struct mwl_amsdu_ctrl amsdu_ctrl; > + u16 iv16; > + u32 iv32; > +}; I still don't see how this iv stuff in the *station* can possibly be right. I think I also pointed out earlier that you can just let mac80211 assign the PN/IV. > +static int mwl_fwcmd_wait_complete(struct mwl_priv *priv, unsigned > short cmd) > +{ > [...] > + mdelay(3); > + > + return 0; > +} > + > +static int mwl_fwcmd_exec_cmd(struct mwl_priv *priv, unsigned short > cmd) > +{ [...] > + if (mwl_fwcmd_wait_complete(priv, 0x8000 | cmd)) { [...] > +} > + > +static int mwl_fwcmd_802_11_radio_control(struct mwl_priv *priv, > + bool enable, bool force) > +{ [...] > + spin_lock_bh(&priv->fwcmd_lock); [...] > + if (mwl_fwcmd_exec_cmd(priv, > HOSTCMD_CMD_802_11_RADIO_CONTROL)) { > + spin_unlock_bh(&priv->fwcmd_lock); This seems like a terrible idea. Spinning for 3 milliseconds (and more) while blocking local soft-irqs is really bad for general latency on the system. I don't like it at all. And there doesn't really seem to be much reason for it either as far as I can tell - almost all places can (as I pointed out before) live with this being a mutex, you just need special handling in very few places that really do want to send a command while not being able to sleep. > +++ b/drivers/net/wireless/marvell/mwlwifi/hostcmd.h This looks like you do have a file for commands - maybe move that TX thing above here? > +const struct ieee80211_ops mwl_mac80211_ops = { > + .tx = mwl_mac80211_tx, > + .start = mwl_mac80211_start, > + .stop = mwl_mac80211_stop, > + .add_interface = mwl_mac80211_add_interface, > + .remove_interface = mwl_mac80211_remove_interface, > + .config = mwl_mac80211_config, > + .bss_info_changed = mwl_mac80211_bss_info_changed, > + .configure_filter = mwl_mac80211_configure_filter, > + .set_key = mwl_mac80211_set_key, > + .set_rts_threshold = mwl_mac80211_set_rts_threshold, > + .sta_add = mwl_mac80211_sta_add, > + .sta_remove = mwl_mac80211_sta_remove, > + .conf_tx = mwl_mac80211_conf_tx, > + .get_stats = mwl_mac80211_get_stats, > + .get_survey = mwl_mac80211_get_survey, > + .ampdu_action = mwl_mac80211_ampdu_action, > +}; Apart from .tx and .configure_filter, all of these can sleep I think. > + rc = mwl_init_firmware(priv, fw_name); > Since you do this in .probe, you should consider loading the firmware asynchronously. > +#ifdef CONFIG_SUPPORT_MFG This Kconfig variable doesn't exist. > +static inline bool mwl_rx_process_mesh_amsdu(struct mwl_priv *priv, > + struct sk_buff *skb, Please instead teach mac80211 to do it right. > + if (ieee80211_is_data(wh->frame_control)) { > + if (is_multicast_ether_addr(wh->addr1)) { > + if (ccmp) { > + mwl_tx_insert_ccmp_hdr(dma_data- > >data, > + mwl_vif- > >keyidx, > + mwl_vif- > >iv16, > + mwl_vif- > >iv32); > + INCREASE_IV(mwl_vif->iv16, mwl_vif- > >iv32); > + } Can't you let mac80211 deal with this? Now I actually am beginning to understand - you need this for GTK only, so it might even work in the station ... but still, don't do it, set the flag to make mac80211 do it on the GTK. > + if (mgmtframe) { > + u16 capab; > + > + if (unlikely(ieee80211_is_action(wh->frame_control) > && > + mgmt->u.action.category == > WLAN_CATEGORY_BACK && > + mgmt->u.action.u.addba_req.action_code > == > + WLAN_ACTION_ADDBA_REQ)) { > + capab = le16_to_cpu(mgmt- > >u.action.u.addba_req.capab); > + tid = (capab & > IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; > + index = mwl_tx_tid_queue_mapping(tid); > + capab |= 1; > + mgmt->u.action.u.addba_req.capab = > cpu_to_le16(capab); > + } What's going on here? Why are you modifying the action frames on the fly??! johannes ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-20 11:22 ` Johannes Berg @ 2015-11-26 8:27 ` David Lin 2015-11-26 9:40 ` Johannes Berg 2015-12-10 14:06 ` Kalle Valo [not found] ` <CANEJEGv7ENTJu4YHz1x2_ve2M6-3Nn8X-0aC2hA3o1mUs3tQ1g@mail.gmail.com> 1 sibling, 2 replies; 26+ messages in thread From: David Lin @ 2015-11-26 8:27 UTC (permalink / raw) To: Johannes Berg, Kalle Valo; +Cc: linux-wireless, Chor Teck Law, Pete Hsieh PiBPbiBOb3ZlbWJlciAyMCwgMjAxNSA3OjIyIFBNLCBKb2hhbm5lcyBCZXJnIHdyb3RlOg0KPiAN Cj4gT24gVGh1LCAyMDE1LTExLTEyIGF0IDAzOjUxICswMDAwLCBEYXZpZCBMaW4gd3JvdGU6DQo+ ID4NCj4gPiArc3RhdGljIGludCBwcmludF9tYWNfYWRkcihjaGFyICpwLCB1OCAqbWFjX2FkZHIp IHsNCj4gPiArCWludCBpOw0KPiA+ICsJY2hhciAqc3RyID0gcDsNCj4gPiArDQo+ID4gKwlzdHIg Kz0gc3ByaW50ZihzdHIsICJtYWMgYWRkcmVzczogJTAyeCIsIG1hY19hZGRyWzBdKTsNCj4gPiAr CWZvciAoaSA9IDE7IGkgPCBFVEhfQUxFTjsgaSsrKQ0KPiA+ICsJCXN0ciArPSBzcHJpbnRmKHN0 ciwgIjolMDJ4IiwgbWFjX2FkZHJbaV0pOw0KPiA+ICsJc3RyICs9IHNwcmludGYoc3RyLCAiXG4i KTsNCj4gPiArDQo+ID4gKwlyZXR1cm4gKHN0ciAtIHApOw0KPiA+ICt9DQo+IA0KPiBZb3UgY2Fu IHVzZSAlcE0gaGVyZSAoYW5kIHBlcmhhcHMgZ2V0IHJpZCBvZiB0aGUgZnVuY3Rpb24gdGhlbikN Cj4gDQoNCkkgd2lsbCBtb2RpZnkgaXQuDQoNCj4gPiArdm9pZCBtd2xfZGVidWdmc19yZW1vdmUo c3RydWN0IGllZWU4MDIxMV9odyAqaHcpIHsNCj4gPiArCXN0cnVjdCBtd2xfcHJpdiAqcHJpdiA9 IGh3LT5wcml2Ow0KPiA+ICsNCj4gPiArCWRlYnVnZnNfcmVtb3ZlKHByaXYtPmRlYnVnZnNfcGh5 KTsNCj4gDQo+IGRvZXNuJ3QgdGhhdCBoYXZlIHRvIGJlIF9yZWN1cnNpdmUoKT8NCj4gDQo+ID4g KyNkZWZpbmUgTVdMX0RSVl9OQU1FwqDCoMKgwqDCoEtCVUlMRF9NT0ROQU1FDQo+ID4gKyNkZWZp bmUgTVdMX0RSVl9WRVJTSU9OCcKgIjEwLjMuMC4xNCINCj4gDQo+IHZlcnNpb25zIGxpa2UgdGhh dCBhcmUgZ2VuZXJhbGx5IGZhaXJseSB1c2VsZXNzIHNpbmNlIHlvdSBkb24ndCB1cGRhdGUgdGhl bSBmb3INCj4gZXZlcnkgY29tbWl0IC4uLg0KPiANCg0KV2Ugc3RpbGwgbmVlZCB2ZXJzaW9uIGlu Zm9ybWF0aW9uIGZvciBmb3JtYWwgcmVsZWFzZS4NCg0KPiA+ICtzdHJ1Y3QgbXdsX3R4X2Rlc2Mg ew0KPiA+ICsJdTggZGF0YV9yYXRlOw0KPiA+ICsJdTggdHhfcHJpb3JpdHk7DQo+ID4gKwlfX2xl MTYgcW9zX2N0cmw7DQo+IFsuLi5dDQo+IA0KPiBJIHN0aWxsIHdvdWxkbid0IG1peCBkZXZpY2Uv ZmlybXdhcmUgQVBJIHdpdGggZHJpdmVyLXVzZSBzdHJ1Y3R1cmVzIGluIHRoZSBzYW1lDQo+IGZp bGUsIGl0IGdldHMgY29uZnVzaW5nLiBJdCdzIHlvdXIgZHJpdmVyIHRob3VnaCwgc28gaWYgeW91 IHJlYWxseSB3YW50IHRvIGNvbmZ1c2UNCj4geW91cnNlbHZlcyAuLi4gYXNzdW1pbmcgeW91J3Jl IGdvaW5nIHRvIG1haW50YWluIGl0IDopDQo+DQoNClRoZXNlIGZpZWxkcyBhcmUgZmlybXdhcmUg QVBJLiBZZXMsIHdlIHdpbGwgbWFpbnRhaW4gaXQuDQoNCj4gPiArc3RydWN0IG13bF9zdGEgew0K PiA+ICsJc3RydWN0IGxpc3RfaGVhZCBsaXN0Ow0KPiA+ICsJYm9vbCBpc19tZXNoX25vZGU7DQo+ ID4gKwlib29sIGlzX2FtcGR1X2FsbG93ZWQ7DQo+ID4gKwlzdHJ1Y3QgbXdsX3R4X2luZm8gdHhf c3RhdHNbTVdMX01BWF9USURdOw0KPiA+ICsJYm9vbCBpc19hbXNkdV9hbGxvd2VkOw0KPiA+ICsJ c3BpbmxvY2tfdCBhbXNkdV9sb2NrO8KgwqDCoMKgwqDCoC8qIGZvciBhbXNkdQ0KPiA+IGFnZ3Jl Z2F0aW9uwqDCoMKgwqDCoMKgwqAqLw0KPiA+ICsJc3RydWN0IG13bF9hbXNkdV9jdHJsIGFtc2R1 X2N0cmw7DQo+ID4gKwl1MTYgaXYxNjsNCj4gPiArCXUzMiBpdjMyOw0KPiA+ICt9Ow0KPiANCj4g SSBzdGlsbCBkb24ndCBzZWUgaG93IHRoaXMgaXYgc3R1ZmYgaW4gdGhlICpzdGF0aW9uKiBjYW4g cG9zc2libHkgYmUgcmlnaHQuIEkgdGhpbmsgSQ0KPiBhbHNvIHBvaW50ZWQgb3V0IGVhcmxpZXIg dGhhdCB5b3UgY2FuIGp1c3QgbGV0DQo+IG1hYzgwMjExIGFzc2lnbiB0aGUgUE4vSVYuDQo+IA0K DQpJIHdpbGwgdHJ5IHRvIG1vZGlmeSB0aGUgY29kZSB0byByZW1vdmUgdGhlbS4NCg0KPiA+ICtz dGF0aWMgaW50IG13bF9md2NtZF93YWl0X2NvbXBsZXRlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwg dW5zaWduZWQNCj4gPiBzaG9ydCBjbWQpDQo+ID4gK3sNCj4gPg0KPiBbLi4uXQ0KPiA+ICsJbWRl bGF5KDMpOw0KPiA+ICsNCj4gPiArCXJldHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0 aWMgaW50IG13bF9md2NtZF9leGVjX2NtZChzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIHVuc2lnbmVk IHNob3J0DQo+ID4gY21kKQ0KPiA+ICt7DQo+IFsuLi5dDQo+ID4gKwkJaWYgKG13bF9md2NtZF93 YWl0X2NvbXBsZXRlKHByaXYsIDB4ODAwMCB8IGNtZCkpIHsNCj4gWy4uLl0NCj4gPiArfQ0KPiA+ ICsNCj4gPiArc3RhdGljIGludCBtd2xfZndjbWRfODAyXzExX3JhZGlvX2NvbnRyb2woc3RydWN0 IG13bF9wcml2ICpwcml2LA0KPiA+ICsJCQkJCcKgwqBib29sIGVuYWJsZSwgYm9vbCBmb3JjZSkN Cj4gPiArew0KPiBbLi4uXQ0KPiA+ICsJc3Bpbl9sb2NrX2JoKCZwcml2LT5md2NtZF9sb2NrKTsN Cj4gWy4uLl0NCj4gPiArCWlmIChtd2xfZndjbWRfZXhlY19jbWQocHJpdiwNCj4gPiBIT1NUQ01E X0NNRF84MDJfMTFfUkFESU9fQ09OVFJPTCkpIHsNCj4gPiArCQlzcGluX3VubG9ja19iaCgmcHJp di0+ZndjbWRfbG9jayk7DQo+IA0KPiBUaGlzIHNlZW1zIGxpa2UgYSB0ZXJyaWJsZSBpZGVhLiBT cGlubmluZyBmb3IgMyBtaWxsaXNlY29uZHMgKGFuZCBtb3JlKSB3aGlsZQ0KPiBibG9ja2luZyBs b2NhbCBzb2Z0LWlycXMgaXMgcmVhbGx5IGJhZCBmb3IgZ2VuZXJhbCBsYXRlbmN5IG9uIHRoZSBz eXN0ZW0uIEkgZG9uJ3QNCj4gbGlrZSBpdCBhdCBhbGwuDQo+IA0KPiBBbmQgdGhlcmUgZG9lc24n dCByZWFsbHkgc2VlbSB0byBiZSBtdWNoIHJlYXNvbiBmb3IgaXQgZWl0aGVyIGFzIGZhciBhcyBJ IGNhbg0KPiB0ZWxsIC0gYWxtb3N0IGFsbCBwbGFjZXMgY2FuIChhcyBJIHBvaW50ZWQgb3V0IGJl Zm9yZSkgbGl2ZSB3aXRoIHRoaXMgYmVpbmcgYQ0KPiBtdXRleCwgeW91IGp1c3QgbmVlZCBzcGVj aWFsIGhhbmRsaW5nIGluIHZlcnkgZmV3IHBsYWNlcyB0aGF0IHJlYWxseSBkbyB3YW50IHRvDQo+ IHNlbmQgYSBjb21tYW5kIHdoaWxlIG5vdCBiZWluZyBhYmxlIHRvIHNsZWVwLg0KPiANCg0KSSB3 aWxsIHRyeSB0byB1c2UgbXV0ZXggaW4gbmV4dCBwYXRjaCBzb29uLg0KDQo+ID4gKysrIGIvZHJp dmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL2hvc3RjbWQuaA0KPiANCj4gVGhpcyBs b29rcyBsaWtlIHlvdSBkbyBoYXZlIGEgZmlsZSBmb3IgY29tbWFuZHMgLSBtYXliZSBtb3ZlIHRo YXQgVFggdGhpbmcNCj4gYWJvdmUgaGVyZT8NCj4gDQoNCkl0IGlzIGJldHRlciB0byBrZWVwIGN1 cnJlbnQgZmlsZSBzdHJ1Y3R1cmUgKGVhc2llciBmb3Igb3VyIGludGVybmFsIG1haW50ZW5hbmNl IHN5bmNpbmcgb3RoZXIgZmlsZXMpDQoNCj4gPiArY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMg bXdsX21hYzgwMjExX29wcyA9IHsNCj4gPiArCS50eMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqA9IG13bF9tYWM4MDIxMV90eCwNCj4gPiArCS5zdGFydMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqA9IG13bF9tYWM4MDIxMV9zdGFydCwNCj4gPiArCS5zdG9wwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfc3RvcCwNCj4gPiArCS5hZGRfaW50ZXJm YWNlwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfYWRkX2ludGVyZmFjZSwNCj4gPiArCS5yZW1v dmVfaW50ZXJmYWNlwqDCoMKgPSBtd2xfbWFjODAyMTFfcmVtb3ZlX2ludGVyZmFjZSwNCj4gPiAr CS5jb25maWfCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoD0gbXdsX21hYzgwMjExX2NvbmZpZywN Cj4gPiArCS5ic3NfaW5mb19jaGFuZ2VkwqDCoMKgPSBtd2xfbWFjODAyMTFfYnNzX2luZm9fY2hh bmdlZCwNCj4gPiArCS5jb25maWd1cmVfZmlsdGVywqDCoMKgPSBtd2xfbWFjODAyMTFfY29uZmln dXJlX2ZpbHRlciwNCj4gPiArCS5zZXRfa2V5wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xf bWFjODAyMTFfc2V0X2tleSwNCj4gPiArCS5zZXRfcnRzX3RocmVzaG9sZMKgwqA9IG13bF9tYWM4 MDIxMV9zZXRfcnRzX3RocmVzaG9sZCwNCj4gPiArCS5zdGFfYWRkwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgPSBtd2xfbWFjODAyMTFfc3RhX2FkZCwNCj4gPiArCS5zdGFfcmVtb3ZlwqDCoMKgwqDC oMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfc3RhX3JlbW92ZSwNCj4gPiArCS5jb25mX3R4wqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfY29uZl90eCwNCj4gPiArCS5nZXRfc3Rh dHPCoMKgwqDCoMKgwqDCoMKgwqDCoD0gbXdsX21hYzgwMjExX2dldF9zdGF0cywNCj4gPiArCS5n ZXRfc3VydmV5wqDCoMKgwqDCoMKgwqDCoMKgPSBtd2xfbWFjODAyMTFfZ2V0X3N1cnZleSwNCj4g PiArCS5hbXBkdV9hY3Rpb27CoMKgwqDCoMKgwqDCoD0gbXdsX21hYzgwMjExX2FtcGR1X2FjdGlv biwgfTsNCj4gDQo+IEFwYXJ0IGZyb20gLnR4IGFuZCAuY29uZmlndXJlX2ZpbHRlciwgYWxsIG9m IHRoZXNlIGNhbiBzbGVlcCBJIHRoaW5rLg0KPiANCj4gPiArCXJjID0gbXdsX2luaXRfZmlybXdh cmUocHJpdiwgZndfbmFtZSk7DQo+ID4NCj4gU2luY2UgeW91IGRvIHRoaXMgaW4gLnByb2JlLCB5 b3Ugc2hvdWxkIGNvbnNpZGVyIGxvYWRpbmcgdGhlIGZpcm13YXJlDQo+IGFzeW5jaHJvbm91c2x5 Lg0KPiANCg0KSSBob3BlIEkgY2FuIHBvc3Rwb25lIHRoaXMgbW9kaWZpY2F0aW9uIGxhdGVyLg0K DQo+ID4gKyNpZmRlZiBDT05GSUdfU1VQUE9SVF9NRkcNCj4gDQo+IFRoaXMgS2NvbmZpZyB2YXJp YWJsZSBkb2Vzbid0IGV4aXN0Lg0KPiANCg0KVGhlIGNvbXBpbGUgdmFyaWFibGUgaXMgdXNlZCBw cml2YXRlbHkgYnkgTWFydmVsbCBhbmQgb3VyIGN1c3RvbWVycyBpbiBwcm9kdWN0aW9uIGxpbmUu DQoNCj4gPiArc3RhdGljIGlubGluZSBib29sIG13bF9yeF9wcm9jZXNzX21lc2hfYW1zZHUoc3Ry dWN0IG13bF9wcml2ICpwcml2LA0KPiA+ICsJCQkJCcKgwqDCoMKgwqBzdHJ1Y3Qgc2tfYnVmZiAq c2tiLA0KPiANCj4gDQo+IA0KPiANCj4gUGxlYXNlIGluc3RlYWQgdGVhY2ggbWFjODAyMTEgdG8g ZG8gaXQgcmlnaHQuDQo+IA0KDQpNYWM4MDIxMSBkb2VzIG5vdCBzdXBwb3J0IG1lc2ggQU1TRFUg bm93LCB3ZSBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiBpbiBtd2x3aWZpIGRyaXZlciBmb3IgdGhl IHRpbWUgYmVpbmcuIEV4Y2VwdCBmb3IgbWVzaCBBTVNEVSwgd2Ugc3RpbGwgbGV2ZXJhZ2UgbWFj ODAyMTEgdG8gaGFuZGxlIGRhdGEgQU1TRFUuDQoNCj4gPiArCWlmIChpZWVlODAyMTFfaXNfZGF0 YSh3aC0+ZnJhbWVfY29udHJvbCkpIHsNCj4gPiArCQlpZiAoaXNfbXVsdGljYXN0X2V0aGVyX2Fk ZHIod2gtPmFkZHIxKSkgew0KPiA+ICsJCQlpZiAoY2NtcCkgew0KPiA+ICsJCQkJbXdsX3R4X2lu c2VydF9jY21wX2hkcihkbWFfZGF0YS0NCj4gPiA+ZGF0YSwNCj4gPiArCQkJCQkJwqDCoMKgwqDC oMKgwqBtd2xfdmlmLQ0KPiA+ID5rZXlpZHgsDQo+ID4gKwkJCQkJCcKgwqDCoMKgwqDCoMKgbXds X3ZpZi0NCj4gPiA+aXYxNiwNCj4gPiArCQkJCQkJwqDCoMKgwqDCoMKgwqBtd2xfdmlmLQ0KPiA+ ID5pdjMyKTsNCj4gPiArCQkJCUlOQ1JFQVNFX0lWKG13bF92aWYtPml2MTYsIG13bF92aWYtDQo+ ID4gPml2MzIpOw0KPiA+ICsJCQl9DQo+IA0KPiBDYW4ndCB5b3UgbGV0IG1hYzgwMjExIGRlYWwg d2l0aCB0aGlzPw0KPiANCj4gTm93IEkgYWN0dWFsbHkgYW0gYmVnaW5uaW5nIHRvIHVuZGVyc3Rh bmQgLSB5b3UgbmVlZCB0aGlzIGZvciBHVEsgb25seSwgc28gaXQNCj4gbWlnaHQgZXZlbiB3b3Jr IGluIHRoZSBzdGF0aW9uIC4uLiBidXQgc3RpbGwsIGRvbid0IGRvIGl0LCBzZXQgdGhlIGZsYWcg dG8gbWFrZQ0KPiBtYWM4MDIxMSBkbyBpdCBvbiB0aGUgR1RLLg0KPiANCg0KSSB3aWxsIGNoZWNr IG1hYzgwMjExIHRvIHNlZSBpZiBJIGNhbiBsZXQgbWFjODAyMTEgZG8gaXQuDQoNCj4gPiArCWlm IChtZ210ZnJhbWUpIHsNCj4gPiArCQl1MTYgY2FwYWI7DQo+ID4gKw0KPiA+ICsJCWlmICh1bmxp a2VseShpZWVlODAyMTFfaXNfYWN0aW9uKHdoLT5mcmFtZV9jb250cm9sKQ0KPiA+ICYmDQo+ID4g KwkJCcKgwqDCoMKgwqBtZ210LT51LmFjdGlvbi5jYXRlZ29yeSA9PQ0KPiA+IFdMQU5fQ0FURUdP UllfQkFDSyAmJg0KPiA+ICsJCQnCoMKgwqDCoMKgbWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXEu YWN0aW9uX2NvZGUNCj4gPiA9PQ0KPiA+ICsJCQnCoMKgwqDCoMKgV0xBTl9BQ1RJT05fQUREQkFf UkVRKSkgew0KPiA+ICsJCQljYXBhYiA9IGxlMTZfdG9fY3B1KG1nbXQtDQo+ID4gPnUuYWN0aW9u LnUuYWRkYmFfcmVxLmNhcGFiKTsNCj4gPiArCQkJdGlkID0gKGNhcGFiICYNCj4gPiBJRUVFODAy MTFfQUREQkFfUEFSQU1fVElEX01BU0spID4+IDI7DQo+ID4gKwkJCWluZGV4ID0gbXdsX3R4X3Rp ZF9xdWV1ZV9tYXBwaW5nKHRpZCk7DQo+ID4gKwkJCWNhcGFiIHw9IDE7DQo+ID4gKwkJCW1nbXQt PnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiID0NCj4gPiBjcHVfdG9fbGUxNihjYXBhYik7DQo+ ID4gKwkJfQ0KPiANCj4gV2hhdCdzIGdvaW5nIG9uIGhlcmU/IFdoeSBhcmUgeW91IG1vZGlmeWlu ZyB0aGUgYWN0aW9uIGZyYW1lcyBvbiB0aGUgZmx5Pz8hDQo+IA0KDQpEdWUgdG8gbXdsd2lmaSBz dXBwb3J0cyBUeC9SeCBBTVNEVSwgdGhlc2UgZnJhbWVzIGFyZSBtb2RpZmllZCB0byBpbmZvcm0g Y2xpZW50IHRoYXQgd2Ugc3VwcG9ydCBBTVNEVS4NCkZvciBSeCBBTVNEVSwgbXdsd2lmaSBoYW5k bGVkIG1lc2ggQU1TRFUgYW5kIGxldCBtYWM4MDIxMSBoYW5kbGUgZGF0YSBBTVNEVS4NCg0KPiBq b2hhbm5lcw0K ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-26 8:27 ` David Lin @ 2015-11-26 9:40 ` Johannes Berg 2015-11-27 2:00 ` David Lin 2015-12-10 14:06 ` Kalle Valo 1 sibling, 1 reply; 26+ messages in thread From: Johannes Berg @ 2015-11-26 9:40 UTC (permalink / raw) To: David Lin, Kalle Valo; +Cc: linux-wireless, Chor Teck Law, Pete Hsieh On Thu, 2015-11-26 at 08:27 +0000, David Lin wrote: > > Since you do this in .probe, you should consider loading the > > firmware asynchronously. > > > > I hope I can postpone this modification later. I don't feel strongly about this one - otoh it's not really complicated. > > > +#ifdef CONFIG_SUPPORT_MFG > > > > This Kconfig variable doesn't exist. > > > > The compile variable is used privately by Marvell and our customers > in production line. Yeah, still. Make it a proper Kconfig variable, defaulting to off and hidden under something, or remove it. It's extremely misleading to have something called CONFIG_* when it's not a Kconfig variable. > Mac80211 does not support mesh AMSDU now, we implement this function > in mwlwifi driver for the time being. Except for mesh AMSDU, we still > leverage mac80211 to handle data AMSDU. You're allowed to modify mac80211. > > What's going on here? Why are you modifying the action frames on > > the fly??! > > > > Due to mwlwifi supports Tx/Rx AMSDU, these frames are modified to > inform client that we support AMSDU. > Ditto - you're allowed to modify mac80211. We actually have a patch like this already: https://git.kernel.org/cgit/linux/kernel/git/jberg/mac80211- next.git/commit/?id=99e7ca44bb910f0cbfda5d9008e8517df0ebc939 johannes ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-26 9:40 ` Johannes Berg @ 2015-11-27 2:00 ` David Lin 2015-11-27 8:27 ` Johannes Berg 2015-12-10 14:57 ` Kalle Valo 0 siblings, 2 replies; 26+ messages in thread From: David Lin @ 2015-11-27 2:00 UTC (permalink / raw) To: Johannes Berg, Kalle Valo; +Cc: linux-wireless, Chor Teck Law, Pete Hsieh PiBPbiBOb3ZlbWJlciAyNiwgMjAxNSA1OjQwIFBNLCBKb2hhbm5lcyBCZXJnIHdyb3RlOg0KPiAN Cj4gT24gVGh1LCAyMDE1LTExLTI2IGF0IDA4OjI3ICswMDAwLCBEYXZpZCBMaW4gd3JvdGU6DQo+ IA0KPiA+ID4gU2luY2UgeW91IGRvIHRoaXMgaW4gLnByb2JlLCB5b3Ugc2hvdWxkIGNvbnNpZGVy IGxvYWRpbmcgdGhlDQo+ID4gPiBmaXJtd2FyZSBhc3luY2hyb25vdXNseS4NCj4gPiA+DQo+ID4N Cj4gPiBJIGhvcGUgSSBjYW4gcG9zdHBvbmUgdGhpcyBtb2RpZmljYXRpb24gbGF0ZXIuDQo+IA0K PiBJIGRvbid0IGZlZWwgc3Ryb25nbHkgYWJvdXQgdGhpcyBvbmUgLSBvdG9oIGl0J3Mgbm90IHJl YWxseSBjb21wbGljYXRlZC4NCj4gDQoNClRoYW5rcy4NCg0KPiA+ID4gPiArI2lmZGVmIENPTkZJ R19TVVBQT1JUX01GRw0KPiA+ID4NCj4gPiA+IFRoaXMgS2NvbmZpZyB2YXJpYWJsZSBkb2Vzbid0 IGV4aXN0Lg0KPiA+ID4NCj4gPg0KPiA+IFRoZSBjb21waWxlIHZhcmlhYmxlIGlzIHVzZWQgcHJp dmF0ZWx5IGJ5IE1hcnZlbGwgYW5kIG91ciBjdXN0b21lcnMgaW4NCj4gPiBwcm9kdWN0aW9uIGxp bmUuDQo+IA0KPiBZZWFoLCBzdGlsbC4gTWFrZSBpdCBhIHByb3BlciBLY29uZmlnIHZhcmlhYmxl LCBkZWZhdWx0aW5nIHRvIG9mZiBhbmQgaGlkZGVuDQo+IHVuZGVyIHNvbWV0aGluZywgb3IgcmVt b3ZlIGl0LiBJdCdzIGV4dHJlbWVseSBtaXNsZWFkaW5nIHRvIGhhdmUgc29tZXRoaW5nDQo+IGNh bGxlZCBDT05GSUdfKiB3aGVuIGl0J3Mgbm90IGEgS2NvbmZpZyB2YXJpYWJsZS4NCj4gDQoNCkkg d2lsbCBjaGFuZ2UgdGhpcyBjb21waWxlIHZhcmlhYmxlIGZyb20gIkNPTkZJR19TVVBQT1JUX01G RyIgdG8gIlNVUFBPUlRfTUZHIi4NCg0KPiA+IE1hYzgwMjExIGRvZXMgbm90IHN1cHBvcnQgbWVz aCBBTVNEVSBub3csIHdlIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uDQo+ID4gaW4gbXdsd2lmaSBk cml2ZXIgZm9yIHRoZSB0aW1lIGJlaW5nLiBFeGNlcHQgZm9yIG1lc2ggQU1TRFUsIHdlIHN0aWxs DQo+ID4gbGV2ZXJhZ2UgbWFjODAyMTEgdG8gaGFuZGxlIGRhdGEgQU1TRFUuDQo+IA0KPiBZb3Un cmUgYWxsb3dlZCB0byBtb2RpZnkgbWFjODAyMTEuDQo+IA0KPiA+ID4gV2hhdCdzIGdvaW5nIG9u IGhlcmU/IFdoeSBhcmUgeW91IG1vZGlmeWluZyB0aGUgYWN0aW9uIGZyYW1lcyBvbiB0aGUNCj4g PiA+IGZseT8/IQ0KPiA+ID4NCj4gPg0KPiA+IER1ZSB0byBtd2x3aWZpIHN1cHBvcnRzIFR4L1J4 IEFNU0RVLCB0aGVzZSBmcmFtZXMgYXJlIG1vZGlmaWVkIHRvDQo+ID4gaW5mb3JtIGNsaWVudCB0 aGF0IHdlIHN1cHBvcnQgQU1TRFUuDQo+ID4NCj4gDQo+IERpdHRvIC0geW91J3JlIGFsbG93ZWQg dG8gbW9kaWZ5IG1hYzgwMjExLiBXZSBhY3R1YWxseSBoYXZlIGEgcGF0Y2ggbGlrZSB0aGlzDQo+ IGFscmVhZHk6DQo+IGh0dHBzOi8vZ2l0Lmtlcm5lbC5vcmcvY2dpdC9saW51eC9rZXJuZWwvZ2l0 L2piZXJnL21hYzgwMjExLQ0KPiBuZXh0LmdpdC9jb21taXQvP2lkPTk5ZTdjYTQ0YmI5MTBmMGNi ZmRhNWQ5MDA4ZTg1MTdkZjBlYmM5MzkNCj4gDQoNCk9uY2UgaWYgdGhpcyBwYXRjaCBpcyByZWFk eSwgSSB3aWxsIG1vZGlmeSBtd2x3aWZpIHRvIHVzZSBpdC4gVGhhbmtzLg0KDQo+IGpvaGFubmVz DQo+IC0tDQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0OiBzZW5kIHRoZSBsaW5lICJ1 bnN1YnNjcmliZSBsaW51eC13aXJlbGVzcyIgaW4gdGhlDQo+IGJvZHkgb2YgYSBtZXNzYWdlIHRv IG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcgTW9yZSBtYWpvcmRvbW8gaW5mbyBhdA0KPiBodHRw Oi8vdmdlci5rZXJuZWwub3JnL21ham9yZG9tby1pbmZvLmh0bWwNCg== ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-27 2:00 ` David Lin @ 2015-11-27 8:27 ` Johannes Berg 2015-12-10 14:57 ` Kalle Valo 1 sibling, 0 replies; 26+ messages in thread From: Johannes Berg @ 2015-11-27 8:27 UTC (permalink / raw) To: David Lin, Kalle Valo; +Cc: linux-wireless, Chor Teck Law, Pete Hsieh On Fri, 2015-11-27 at 02:00 +0000, David Lin wrote: > > Ditto - you're allowed to modify mac80211. We actually have a patch > > like this > > already: > > https://git.kernel.org/cgit/linux/kernel/git/jberg/mac80211- > > next.git/commit/?id=99e7ca44bb910f0cbfda5d9008e8517df0ebc939 > > > > Once if this patch is ready, I will modify mwlwifi to use it. Thanks. The patch is ready now and in the tree, but that wasn't my point. My point is that you shouldn't try to hack around mac80211 like with the action frame interception and the mesh-amsdu-reimplementation, but actually go fix it. If you have issues with mac80211 like this you can ask how to fix them, or just fix them and suggest changes/patches, but just working around it in the driver isn't the right approach. johannes ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-27 2:00 ` David Lin 2015-11-27 8:27 ` Johannes Berg @ 2015-12-10 14:57 ` Kalle Valo 2015-12-15 7:54 ` David Lin 1 sibling, 1 reply; 26+ messages in thread From: Kalle Valo @ 2015-12-10 14:57 UTC (permalink / raw) To: David Lin; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh David Lin <dlin@marvell.com> writes: > On November 26, 2015 5:40 PM, Johannes Berg wrote: >> On Thu, 2015-11-26 at 08:27 +0000, David Lin wrote: >> >> > > > +#ifdef CONFIG_SUPPORT_MFG >> > > >> > > This Kconfig variable doesn't exist. >> > > >> > >> > The compile variable is used privately by Marvell and our customers in >> > production line. >> >> Yeah, still. Make it a proper Kconfig variable, defaulting to off and hidden >> under something, or remove it. It's extremely misleading to have something >> called CONFIG_* when it's not a Kconfig variable. >> > > I will change this compile variable from "CONFIG_SUPPORT_MFG" to > "SUPPORT_MFG". Then it's still dead code which won't ever get compiled in upstream. Please follow what Johannes suggested. -- Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-12-10 14:57 ` Kalle Valo @ 2015-12-15 7:54 ` David Lin 0 siblings, 0 replies; 26+ messages in thread From: David Lin @ 2015-12-15 7:54 UTC (permalink / raw) To: Kalle Valo; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh > Kalle Valo [mailto:kvalo@codeaurora.org] wrote: > > David Lin <dlin@marvell.com> writes: > > > On November 26, 2015 5:40 PM, Johannes Berg wrote: > >> On Thu, 2015-11-26 at 08:27 +0000, David Lin wrote: > >> > >> > > > +#ifdef CONFIG_SUPPORT_MFG > >> > > > >> > > This Kconfig variable doesn't exist. > >> > > > >> > > >> > The compile variable is used privately by Marvell and our customers > >> > in production line. > >> > >> Yeah, still. Make it a proper Kconfig variable, defaulting to off and > >> hidden under something, or remove it. It's extremely misleading to > >> have something called CONFIG_* when it's not a Kconfig variable. > >> > > > > I will change this compile variable from "CONFIG_SUPPORT_MFG" to > > "SUPPORT_MFG". > > Then it's still dead code which won't ever get compiled in upstream. > Please follow what Johannes suggested. > The code will be removed. > -- > Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-26 8:27 ` David Lin 2015-11-26 9:40 ` Johannes Berg @ 2015-12-10 14:06 ` Kalle Valo 1 sibling, 0 replies; 26+ messages in thread From: Kalle Valo @ 2015-12-10 14:06 UTC (permalink / raw) To: David Lin; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh David Lin <dlin@marvell.com> writes: >> > +#define MWL_DRV_NAME KBUILD_MODNAME >> > +#define MWL_DRV_VERSION "10.3.0.14" >> >> versions like that are generally fairly useless since you don't update them for >> every commit ... >> > > We still need version information for formal release. Then use git commit ids for tracking the driver version. Using manual version strings for drivers don't work, it has been tried multiple times and they are always out of sync. -- Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
[parent not found: <CANEJEGv7ENTJu4YHz1x2_ve2M6-3Nn8X-0aC2hA3o1mUs3tQ1g@mail.gmail.com>]
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. [not found] ` <CANEJEGv7ENTJu4YHz1x2_ve2M6-3Nn8X-0aC2hA3o1mUs3tQ1g@mail.gmail.com> @ 2015-12-12 0:47 ` Grant Grundler 2015-12-14 11:47 ` Kalle Valo 1 sibling, 0 replies; 26+ messages in thread From: Grant Grundler @ 2015-12-12 0:47 UTC (permalink / raw) To: Johannes Berg Cc: David Lin, Kalle Valo, linux-wireless, Chor Teck Law, Pete Hsieh [resending as plain text....gmail...grrrh.] On Fri, Dec 11, 2015 at 4:46 PM, Grant Grundler <grundler@google.com> wrote: > Sorry for the late response...just one point below > > On Fri, Nov 20, 2015 at 3:22 AM, Johannes Berg <johannes@sipsolutions.net> > wrote: >> >> > +#define MWL_DRV_NAME KBUILD_MODNAME >> > +#define MWL_DRV_VERSION "10.3.0.14" >> >> versions like that are generally fairly useless since you don't update >> them for every commit ... > > > When backporting to other kernel trees, it's extremely handy to have a > DRV_VERSION. > > Checking if a particular kernel build has the expected driver version > trivial. "mod_info" dumps the driver version for modules (which this will > usually be too). > > And yes, it won't get updated for every commit only because other version > control might encapsulate those changes. Not every distro makes their build > versioning accessible to outsiders. So it's still helpful even if not > perfect. > > Marvell can update this every time they resync with their own internal > versions. > > cheers, > grant ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. [not found] ` <CANEJEGv7ENTJu4YHz1x2_ve2M6-3Nn8X-0aC2hA3o1mUs3tQ1g@mail.gmail.com> 2015-12-12 0:47 ` Grant Grundler @ 2015-12-14 11:47 ` Kalle Valo 1 sibling, 0 replies; 26+ messages in thread From: Kalle Valo @ 2015-12-14 11:47 UTC (permalink / raw) To: Grant Grundler Cc: Johannes Berg, David Lin, linux-wireless, Chor Teck Law, Pete Hsieh Grant Grundler <grundler@google.com> writes: > Sorry for the late response...just one point below > > On Fri, Nov 20, 2015 at 3:22 AM, Johannes Berg <johannes@sipsolutions.net> > wrote: > > > +#define MWL_DRV_NAME KBUILD_MODNAME > > +#define MWL_DRV_VERSION "10.3.0.14" > > versions like that are generally fairly useless since you don't update > them for every commit ... > > > When backporting to other kernel trees, it's extremely handy to have a > DRV_VERSION. > > Checking if a particular kernel build has the expected driver version trivial. > "mod_info" dumps the driver version for modules (which this will usually be > too). > > And yes, it won't get updated for every commit only because other version > control might encapsulate those changes. Not every distro makes their build > versioning accessible to outsiders. So it's still helpful even if not perfect. > > Marvell can update this every time they resync with their own internal > versions. But the problem is that you cannot really trust this driver version string. I found a perfect example from another Marvell driver: 5e6e3a92b9a4c drivers/net/wireless/mwifiex/main.c (Bing Zhao 2011-03-21 18:00:50 -0700 25) #define VERSION "1.0" So nobody has updated that version string since the initial commit from 2011 and that driver has had over 900 non-merge commits after that. Because of bad cases like this I think having a driver specific versions in in-tree drivers are just noise and unnecessary extra work. When porting a driver to another tree git commit ids, release tag names or git-describe output are much better ways to identify the driver version. -- Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin 2015-11-12 19:47 ` Jes Sorensen 2015-11-20 11:22 ` Johannes Berg @ 2015-12-10 14:03 ` Kalle Valo 2015-12-10 14:39 ` Kalle Valo ` (3 subsequent siblings) 6 siblings, 0 replies; 26+ messages in thread From: Kalle Valo @ 2015-12-10 14:03 UTC (permalink / raw) To: David Lin; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh David Lin <dlin@marvell.com> writes: > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897 > chipsets. > This driver was developed as part of the openwrt.org project to support > Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi. > > The mwlwifi driver differs from existing mwifiex driver: > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem > to provide full AP/Wireless Bridge functionality (routers). > o mwifiex is a "fullmac driver" which provides a comprehensive set of > client functions (laptops/embedded devices) > o only mwlwifi supports Marvell AP chip 886X series > > NOTE: Users with Marvell 88W8897 chipsets currently should enable > (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH. > > mwlwifi driver leveraged code from existing MWL8K driver in the > following areas: > - 802.11n setting for mac80211 > - Functions needed to hook up to mac80211 > - Interactions with mac80211 to establish BA streams > - Partial firmware APIs, some data fields > - Method to pass Rx packets to mac80211 except 11ac rates > > In addition, mwlwifi driver supports: > - future scalability and future development (refactored source code) > - Marvell 802.11ac chipsets, including combo BT devices > - 802.11ac related settings and functions > - concurrent AP+STA functionalities with single firmware per chip > - firmware APIs for the supported chipset > - communicating new mac80211 settings to firmware > - Different TX/RX datapath where applicable > - A-MSDU and A-MPDU > - mac80211-based MESH (work in progress) > - Refined the code to establish BA streams > > NOTE: MWLWIFI will be organized under new vendor specific folder/marvell, > as per request of the gate keeper and community. > > Signed-off-by: David Lin <dlin@marvell.com> I don't see any changelog, please always provide one. Makes review a lot easier. Also I hope you are not adding new features anymore. It's better to freeze the driver and focus on getting the driver accepted. Once that is done you can submit new features as separate patches. Otherwise we go back to square one after every review. -- Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin ` (2 preceding siblings ...) 2015-12-10 14:03 ` Kalle Valo @ 2015-12-10 14:39 ` Kalle Valo 2015-12-15 7:55 ` David Lin 2015-12-14 21:32 ` Kan Yan ` (2 subsequent siblings) 6 siblings, 1 reply; 26+ messages in thread From: Kalle Valo @ 2015-12-10 14:39 UTC (permalink / raw) To: David Lin; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh David Lin <dlin@marvell.com> writes: > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897 > chipsets. > This driver was developed as part of the openwrt.org project to support > Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi. > > The mwlwifi driver differs from existing mwifiex driver: > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem > to provide full AP/Wireless Bridge functionality (routers). > o mwifiex is a "fullmac driver" which provides a comprehensive set of > client functions (laptops/embedded devices) > o only mwlwifi supports Marvell AP chip 886X series > > NOTE: Users with Marvell 88W8897 chipsets currently should enable > (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH. > > mwlwifi driver leveraged code from existing MWL8K driver in the > following areas: > - 802.11n setting for mac80211 > - Functions needed to hook up to mac80211 > - Interactions with mac80211 to establish BA streams > - Partial firmware APIs, some data fields > - Method to pass Rx packets to mac80211 except 11ac rates > > In addition, mwlwifi driver supports: > - future scalability and future development (refactored source code) > - Marvell 802.11ac chipsets, including combo BT devices > - 802.11ac related settings and functions > - concurrent AP+STA functionalities with single firmware per chip > - firmware APIs for the supported chipset > - communicating new mac80211 settings to firmware > - Different TX/RX datapath where applicable > - A-MSDU and A-MPDU > - mac80211-based MESH (work in progress) > - Refined the code to establish BA streams > > NOTE: MWLWIFI will be organized under new vendor specific folder/marvell, > as per request of the gate keeper and community. > > Signed-off-by: David Lin <dlin@marvell.com> This seems to use base64 encoding, how did you submit this? 'git send-email' tool is strongly preferred. Content-Transfer-Encoding: base64 I applied this to pending branch and saw few easy conflicts with Kconfig files and Makefiles, I guess you submitted this patch before I added the vendor directories. Let's see what kbuild finds but I already saw two warnings: drivers/net/wireless/marvell/mwlwifi/main.c:160:20: warning: incorrect type in argument 1 (different address spaces) drivers/net/wireless/marvell/mwlwifi/main.c:160:20: expected void const *ptr drivers/net/wireless/marvell/mwlwifi/main.c:160:20: got void [noderef] <asn:2>*[assigned] addr drivers/net/wireless/marvell/mwlwifi/main.c:171:20: warning: incorrect type in argument 1 (different address spaces) drivers/net/wireless/marvell/mwlwifi/main.c:171:20: expected void const *ptr drivers/net/wireless/marvell/mwlwifi/main.c:171:20: got void [noderef] <asn:2>*[assigned] addr -- Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-12-10 14:39 ` Kalle Valo @ 2015-12-15 7:55 ` David Lin 0 siblings, 0 replies; 26+ messages in thread From: David Lin @ 2015-12-15 7:55 UTC (permalink / raw) To: Kalle Valo; +Cc: Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh PiBLYWxsZSBWYWxvIFttYWlsdG86a3ZhbG9AY29kZWF1cm9yYS5vcmddIHdyb3RlOg0KPiANCj4g RGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPiB3cml0ZXM6DQo+IA0KPiA+IFRoaXMgcGF0Y2gg cHJvdmlkZXMgdGhlIG13bHdpZmkgZHJpdmVyIGZvciBNYXJ2ZWxsIDg4NjMsIDg4NjQgYW5kIDg4 OTcNCj4gPiBjaGlwc2V0cy4NCj4gPiBUaGlzIGRyaXZlciB3YXMgZGV2ZWxvcGVkIGFzIHBhcnQg b2YgdGhlIG9wZW53cnQub3JnIHByb2plY3QgdG8NCj4gPiBzdXBwb3J0IExpbmtzeXMgV1JUMTkw MEFDIGFuZCBpcyBtYWludGFpbmVkIG9uDQo+IGh0dHBzOi8vZ2l0aHViLmNvbS9rYWxvei9td2x3 aWZpLg0KPiA+DQo+ID4gVGhlIG13bHdpZmkgZHJpdmVyIGRpZmZlcnMgZnJvbSBleGlzdGluZyBt d2lmaWV4IGRyaXZlcjoNCj4gPiBvIG13bHdpZmkgaXMgYSAic29mdG1hYyBkcml2ZXIiIHVzaW5n IHRoZSBrZXJuZWw/7qiDIG1hYzgwMi4xMSBzdWJzeXN0ZW0NCj4gPiB0byBwcm92aWRlIGZ1bGwg QVAvV2lyZWxlc3MgQnJpZGdlIGZ1bmN0aW9uYWxpdHkgKHJvdXRlcnMpLg0KPiA+IG8gbXdpZmll eCBpcyBhICJmdWxsbWFjIGRyaXZlciIgd2hpY2ggcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIHNl dCBvZg0KPiA+IGNsaWVudCBmdW5jdGlvbnMgKGxhcHRvcHMvZW1iZWRkZWQgZGV2aWNlcykgbyBv bmx5IG13bHdpZmkgc3VwcG9ydHMNCj4gPiBNYXJ2ZWxsIEFQIGNoaXAgODg2WCBzZXJpZXMNCj4g Pg0KPiA+IE5PVEU6IFVzZXJzIHdpdGggTWFydmVsbCA4OFc4ODk3IGNoaXBzZXRzIGN1cnJlbnRs eSBzaG91bGQgZW5hYmxlDQo+ID4gKENPTkZJRz1ZIG9yIE0pIGVpdGhlciBDT05GSUdfTVdJRklF WCBvciBDT05GSUdfTVdMV0lGSSwgTk9UDQo+IEJPVEguDQo+ID4NCj4gPiBtd2x3aWZpIGRyaXZl ciBsZXZlcmFnZWQgY29kZSBmcm9tIGV4aXN0aW5nIE1XTDhLIGRyaXZlciBpbiB0aGUNCj4gPiBm b2xsb3dpbmcgYXJlYXM6DQo+ID4gLSA4MDIuMTFuIHNldHRpbmcgZm9yIG1hYzgwMjExDQo+ID4g LSBGdW5jdGlvbnMgbmVlZGVkIHRvIGhvb2sgdXAgdG8gbWFjODAyMTENCj4gPiAtIEludGVyYWN0 aW9ucyB3aXRoIG1hYzgwMjExIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4gLSBQYXJ0aWFs IGZpcm13YXJlIEFQSXMsIHNvbWUgZGF0YSBmaWVsZHMNCj4gPiAtIE1ldGhvZCB0byBwYXNzIFJ4 IHBhY2tldHMgdG8gbWFjODAyMTEgZXhjZXB0IDExYWMgcmF0ZXMNCj4gPg0KPiA+IEluIGFkZGl0 aW9uLCBtd2x3aWZpIGRyaXZlciBzdXBwb3J0czoNCj4gPiAtIGZ1dHVyZSBzY2FsYWJpbGl0eSBh bmQgZnV0dXJlIGRldmVsb3BtZW50IChyZWZhY3RvcmVkIHNvdXJjZSBjb2RlKQ0KPiA+IC0gTWFy dmVsbCA4MDIuMTFhYyBjaGlwc2V0cywgaW5jbHVkaW5nIGNvbWJvIEJUIGRldmljZXMNCj4gPiAt IDgwMi4xMWFjIHJlbGF0ZWQgc2V0dGluZ3MgYW5kIGZ1bmN0aW9ucw0KPiA+IC0gY29uY3VycmVu dCBBUCtTVEEgZnVuY3Rpb25hbGl0aWVzIHdpdGggc2luZ2xlIGZpcm13YXJlIHBlciBjaGlwDQo+ ID4gLSBmaXJtd2FyZSBBUElzIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQNCj4gPiAtIGNvbW11 bmljYXRpbmcgbmV3IG1hYzgwMjExIHNldHRpbmdzIHRvIGZpcm13YXJlDQo+ID4gLSBEaWZmZXJl bnQgVFgvUlggZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KPiA+IC0gQS1NU0RVIGFuZCBBLU1Q RFUNCj4gPiAtIG1hYzgwMjExLWJhc2VkIE1FU0ggKHdvcmsgaW4gcHJvZ3Jlc3MpDQo+ID4gLSBS ZWZpbmVkIHRoZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4NCj4gPiBOT1RFOiBN V0xXSUZJIHdpbGwgYmUgb3JnYW5pemVkIHVuZGVyIG5ldyB2ZW5kb3Igc3BlY2lmaWMNCj4gPiBm b2xkZXIvbWFydmVsbCwgYXMgcGVyIHJlcXVlc3Qgb2YgdGhlIGdhdGUga2VlcGVyIGFuZCBjb21t dW5pdHkuDQo+ID4NCj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBMaW4gPGRsaW5AbWFydmVsbC5j b20+DQo+IA0KPiBUaGlzIHNlZW1zIHRvIHVzZSBiYXNlNjQgZW5jb2RpbmcsIGhvdyBkaWQgeW91 IHN1Ym1pdCB0aGlzPyAnZ2l0IHNlbmQtZW1haWwnDQo+IHRvb2wgaXMgc3Ryb25nbHkgcHJlZmVy cmVkLg0KPiANCj4gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogYmFzZTY0DQo+IA0KPiBJIGFw cGxpZWQgdGhpcyB0byBwZW5kaW5nIGJyYW5jaCBhbmQgc2F3IGZldyBlYXN5IGNvbmZsaWN0cyB3 aXRoIEtjb25maWcgZmlsZXMNCj4gYW5kIE1ha2VmaWxlcywgSSBndWVzcyB5b3Ugc3VibWl0dGVk IHRoaXMgcGF0Y2ggYmVmb3JlIEkgYWRkZWQgdGhlIHZlbmRvcg0KPiBkaXJlY3Rvcmllcy4gTGV0 J3Mgc2VlIHdoYXQga2J1aWxkIGZpbmRzIGJ1dCBJIGFscmVhZHkgc2F3IHR3bw0KPiB3YXJuaW5n czoNCj4gDQo+IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9tYWluLmM6MTYw OjIwOiB3YXJuaW5nOiBpbmNvcnJlY3QgdHlwZQ0KPiBpbiBhcmd1bWVudCAxIChkaWZmZXJlbnQg YWRkcmVzcyBzcGFjZXMpDQo+IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9t YWluLmM6MTYwOjIwOiAgICBleHBlY3RlZCB2b2lkIGNvbnN0DQo+ICpwdHINCj4gZHJpdmVycy9u ZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL21haW4uYzoxNjA6MjA6ICAgIGdvdCB2b2lkIFtu b2RlcmVmXQ0KPiA8YXNuOjI+Klthc3NpZ25lZF0gYWRkcg0KPiBkcml2ZXJzL25ldC93aXJlbGVz cy9tYXJ2ZWxsL213bHdpZmkvbWFpbi5jOjE3MToyMDogd2FybmluZzogaW5jb3JyZWN0IHR5cGUN Cj4gaW4gYXJndW1lbnQgMSAoZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2VzKQ0KPiBkcml2ZXJzL25l dC93aXJlbGVzcy9tYXJ2ZWxsL213bHdpZmkvbWFpbi5jOjE3MToyMDogICAgZXhwZWN0ZWQgdm9p ZCBjb25zdA0KPiAqcHRyDQo+IGRyaXZlcnMvbmV0L3dpcmVsZXNzL21hcnZlbGwvbXdsd2lmaS9t YWluLmM6MTcxOjIwOiAgICBnb3Qgdm9pZCBbbm9kZXJlZl0NCj4gPGFzbjoyPipbYXNzaWduZWRd IGFkZHINCj4NCg0KSSB3aWxsIGZpeCBpdC4NCg0KPiAtLQ0KPiBLYWxsZSBWYWxvDQo= ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin ` (3 preceding siblings ...) 2015-12-10 14:39 ` Kalle Valo @ 2015-12-14 21:32 ` Kan Yan 2015-12-15 5:47 ` David Lin 2015-12-15 7:40 ` Emmanuel Grumbach 2016-03-16 23:24 ` Julian Calaby 6 siblings, 1 reply; 26+ messages in thread From: Kan Yan @ 2015-12-14 21:32 UTC (permalink / raw) To: linux-wireless David Lin <dlin@...> writes: > +static inline struct sk_buff *mwl_tx_do_amsdu(struct mwl_priv *priv, > + int desc_num, > ... > + amsdu_pkts = (struct sk_buff_head *) > + kmalloc(sizeof(*amsdu_pkts), GFP_KERNEL); > + if (!amsdu_pkts) { Should GFP_ATOMIC be used here instead of GFP_KERNEL? This function could be called in interrupt context. ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-12-14 21:32 ` Kan Yan @ 2015-12-15 5:47 ` David Lin 0 siblings, 0 replies; 26+ messages in thread From: David Lin @ 2015-12-15 5:47 UTC (permalink / raw) To: Kan Yan, linux-wireless > Kan Yan writes: > > David Lin <dlin@...> writes: > > > +static inline struct sk_buff *mwl_tx_do_amsdu(struct mwl_priv *priv, > > + int desc_num, > > ... > > + amsdu_pkts = (struct sk_buff_head *) > > + kmalloc(sizeof(*amsdu_pkts), GFP_KERNEL); > > + if (!amsdu_pkts) { > > Should GFP_ATOMIC be used here instead of GFP_KERNEL? This function could > be called in interrupt context. > Thanks. I will fix it. > -- > To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the > body of a message to majordomo@vger.kernel.org More majordomo info at > http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin ` (4 preceding siblings ...) 2015-12-14 21:32 ` Kan Yan @ 2015-12-15 7:40 ` Emmanuel Grumbach 2015-12-15 7:53 ` David Lin 2016-03-16 23:24 ` Julian Calaby 6 siblings, 1 reply; 26+ messages in thread From: Emmanuel Grumbach @ 2015-12-15 7:40 UTC (permalink / raw) To: David Lin Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh Hi, I was interested in the checking the A-MSDU implementation only, so I reviewed only that. I am not sure I really followed your implementation though. In iwlwifi I chose the LSO mechanism to implement A-MSDU. I understand that for an AP it makes less sense since you don't really have locally generated traffic and LSO won't work well with packets forwarded by the IP layer. So you seem to have added a timeout mechanism inside the driver that accumulates the packet for a certain period of time and send them all when the max number of packets has been reached? But I didn't see any timer there, so that if you start an A-MSDU and then suddenly stop receiving packets for transmission, the packet already in the buffer will stay stale? A few more comments below. On Thu, Nov 12, 2015 at 5:51 AM, David Lin <dlin@marvell.com> wrote: > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897 > chipsets. > This driver was developed as part of the openwrt.org project to support > Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi. > > The mwlwifi driver differs from existing mwifiex driver: > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem > to provide full AP/Wireless Bridge functionality (routers). > o mwifiex is a "fullmac driver" which provides a comprehensive set of > client functions (laptops/embedded devices) > o only mwlwifi supports Marvell AP chip 886X series > [snip] > + > +static int mwl_mac80211_ampdu_action(struct ieee80211_hw *hw, > + struct ieee80211_vif *vif, > + enum ieee80211_ampdu_mlme_action action, > + struct ieee80211_sta *sta, > + u16 tid, u16 *ssn, u8 buf_size, bool amsdu) > +{ > + int rc = 0; > + struct mwl_priv *priv = hw->priv; > + struct mwl_ampdu_stream *stream; > + u8 *addr = sta->addr, idx; > + struct mwl_sta *sta_info; > + > + sta_info = mwl_dev_get_sta(sta); > + > + spin_lock_bh(&priv->stream_lock); > + > + stream = mwl_fwcmd_lookup_stream(hw, addr, tid); > + > + switch (action) { > + case IEEE80211_AMPDU_RX_START: > + case IEEE80211_AMPDU_RX_STOP: > + break; > + case IEEE80211_AMPDU_TX_START: > + if (!sta_info->is_ampdu_allowed) { > + wiphy_warn(hw->wiphy, "ampdu not allowed\n"); > + rc = -EPERM; > + break; > + } > + > + if (!stream) { > + stream = mwl_fwcmd_add_stream(hw, sta, tid); > + if (!stream) { > + wiphy_warn(hw->wiphy, "no stream found\n"); > + rc = -EPERM; > + break; > + } > + } > + > + spin_unlock_bh(&priv->stream_lock); > + rc = mwl_fwcmd_check_ba(hw, stream, vif); > + spin_lock_bh(&priv->stream_lock); > + if (rc) { > + mwl_fwcmd_remove_stream(hw, stream); > + wiphy_err(hw->wiphy, > + "ampdu start error code: %d\n", rc); > + rc = -EPERM; > + break; > + } > + stream->state = AMPDU_STREAM_IN_PROGRESS; > + *ssn = 0; > + ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid); This is why you have the race you mention below. What you should really be doing is to wait until the all the packets for that RA / TID are sent from all the HW Tx queues (only one realistically), and only then call the _cb. This will allow you to send the ADDBA req on the VO queue as it should be according to spec. [snip] > + > +void mwl_rx_recv(unsigned long data) > +{ [snip] > + > + if (unlikely(ieee80211_is_action(wh->frame_control) && > + mgmt->u.action.category == > + WLAN_CATEGORY_BACK && > + mgmt->u.action.u.addba_resp.action_code == > + WLAN_ACTION_ADDBA_RESP)) { > + capab = mgmt->u.action.u.addba_resp.capab; > + if (le16_to_cpu(capab) & 1) > + mwl_rx_enable_sta_amsdu(priv, mgmt->sa); err... no. mac80211 knows how to do that today. Johannes already reported a similar issue somewhere else in your code. > + } > + } > + > + if (ieee80211_is_data_qos(wh->frame_control) && > + ieee80211_has_a4(wh->frame_control)) { > + u8 *qc = ieee80211_get_qos_ctl(wh); > + > + if (*qc & IEEE80211_QOS_CTL_A_MSDU_PRESENT) > + if (mwl_rx_process_mesh_amsdu(priv, prx_skb, > + &status)) This sounds to be something you want to teach mac80211 about. [snip] > + > +#define SYSADPT_AMSDU_FW_MAX_SIZE 3300 > + > +#define SYSADPT_AMSDU_4K_MAX_SIZE SYSADPT_AMSDU_FW_MAX_SIZE > + > +#define SYSADPT_AMSDU_8K_MAX_SIZE SYSADPT_AMSDU_FW_MAX_SIZE In case the FW will grow later? > + > +#define SYSADPT_AMSDU_ALLOW_SIZE 1600 > + > +#define SYSADPT_AMSDU_FLUSH_TIME 500 > + > +#define SYSADPT_AMSDU_PACKET_THRESHOLD 10 > + > +#define SYSADPT_MAX_TID 8 > + > +#endif /* _mwl_sysadpt_h_ */ > diff --git a/drivers/net/wireless/marvell/mwlwifi/tx.c b/drivers/net/wireless/marvell/mwlwifi/tx.c > new file mode 100644 > index 0000000..68a994d > --- /dev/null > +++ b/drivers/net/wireless/marvell/mwlwifi/tx.c > @@ -0,0 +1,1251 @@ > +/* > + * Copyright (C) 2006-2015, Marvell International Ltd. > + * > + * This software file (the "File") is distributed by Marvell International > + * Ltd. under the terms of the GNU General Public License Version 2, June 1991 > + * (the "License"). You may use, redistribute and/or modify this File in > + * accordance with the terms and conditions of the License, a copy of which > + * is available by writing to the Free Software Foundation, Inc. > + * > + * THE FILE IS DISTRIBUTED AS-IS, WITHOUT WARRANTY OF ANY KIND, AND THE > + * IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE > + * ARE EXPRESSLY DISCLAIMED. The License provides additional details about > + * this warranty disclaimer. > + */ > + > +/* Description: This file implements transmit related functions. */ > + > +#include <linux/etherdevice.h> > +#include <linux/skbuff.h> > + > +#include "sysadpt.h" > +#include "dev.h" > +#include "fwcmd.h" > +#include "tx.h" > + > +#define MAX_NUM_TX_RING_BYTES (SYSADPT_MAX_NUM_TX_DESC * \ > + sizeof(struct mwl_tx_desc)) > + > +#define MAX_NUM_TX_HNDL_BYTES (SYSADPT_MAX_NUM_TX_DESC * \ > + sizeof(struct mwl_tx_hndl)) > + > +#define EAGLE_TXD_XMITCTRL_USE_MC_RATE 0x8 /* Use multicast data rate */ > + > +#define MWL_QOS_ACK_POLICY_MASK 0x0060 > +#define MWL_QOS_ACK_POLICY_NORMAL 0x0000 > +#define MWL_QOS_ACK_POLICY_BLOCKACK 0x0060 > + > +#define EXT_IV 0x20 > +#define INCREASE_IV(iv16, iv32) \ > +{ \ > + (iv16)++; \ > + if ((iv16) == 0) \ > + (iv32)++; \ > +} > + > +/* Transmit rate information constants */ > +#define TX_RATE_FORMAT_LEGACY 0 > +#define TX_RATE_FORMAT_11N 1 > +#define TX_RATE_FORMAT_11AC 2 > + > +#define TX_RATE_BANDWIDTH_20 0 > +#define TX_RATE_BANDWIDTH_40 1 > +#define TX_RATE_BANDWIDTH_80 2 > + > +#define TX_RATE_INFO_STD_GI 0 > +#define TX_RATE_INFO_SHORT_GI 1 > + > +enum { > + IEEE_TYPE_MANAGEMENT = 0, > + IEEE_TYPE_CONTROL, > + IEEE_TYPE_DATA > +}; > + > +struct ccmp_hdr { > + __le16 iv16; > + u8 rsvd; > + u8 key_id; > + __le32 iv32; > +} __packed; > + > +static int mwl_tx_ring_alloc(struct mwl_priv *priv) > +{ > + struct mwl_desc_data *desc; > + int num; > + u8 *mem; > + > + desc = &priv->desc_data[0]; > + > + mem = dma_alloc_coherent(&priv->pdev->dev, > + MAX_NUM_TX_RING_BYTES * > + SYSADPT_NUM_OF_DESC_DATA, > + &desc->pphys_tx_ring, > + GFP_KERNEL); > + > + if (!mem) { > + wiphy_err(priv->hw->wiphy, "cannot alloc mem\n"); > + return -ENOMEM; > + } > + > + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) { > + desc = &priv->desc_data[num]; > + > + desc->ptx_ring = (struct mwl_tx_desc *) > + (mem + num * MAX_NUM_TX_RING_BYTES); > + > + desc->pphys_tx_ring = (dma_addr_t) > + ((u32)priv->desc_data[0].pphys_tx_ring + > + num * MAX_NUM_TX_RING_BYTES); > + > + memset(desc->ptx_ring, 0x00, > + MAX_NUM_TX_RING_BYTES); > + } > + > + mem = kmalloc(MAX_NUM_TX_HNDL_BYTES * SYSADPT_NUM_OF_DESC_DATA, > + GFP_KERNEL); > + > + if (!mem) { > + wiphy_err(priv->hw->wiphy, "cannot alloc mem\n"); > + dma_free_coherent(&priv->pdev->dev, > + MAX_NUM_TX_RING_BYTES * > + SYSADPT_NUM_OF_DESC_DATA, > + priv->desc_data[0].ptx_ring, > + priv->desc_data[0].pphys_tx_ring); > + return -ENOMEM; > + } > + > + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) { > + desc = &priv->desc_data[num]; > + > + desc->tx_hndl = (struct mwl_tx_hndl *) > + (mem + num * MAX_NUM_TX_HNDL_BYTES); > + > + memset(desc->tx_hndl, 0x00, > + MAX_NUM_TX_HNDL_BYTES); > + } > + > + return 0; > +} > + > +static int mwl_tx_ring_init(struct mwl_priv *priv) > +{ > + int num, i; > + struct mwl_desc_data *desc; > + > + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) { > + skb_queue_head_init(&priv->txq[num]); > + priv->fw_desc_cnt[num] = 0; > + > + desc = &priv->desc_data[num]; > + > + if (desc->ptx_ring) { > + for (i = 0; i < SYSADPT_MAX_NUM_TX_DESC; i++) { > + desc->ptx_ring[i].status = > + cpu_to_le32(EAGLE_TXD_STATUS_IDLE); > + desc->ptx_ring[i].pphys_next = > + cpu_to_le32((u32)desc->pphys_tx_ring + > + ((i + 1) * sizeof(struct mwl_tx_desc))); > + desc->tx_hndl[i].pdesc = > + &desc->ptx_ring[i]; > + if (i < SYSADPT_MAX_NUM_TX_DESC - 1) > + desc->tx_hndl[i].pnext = > + &desc->tx_hndl[i + 1]; > + } > + desc->ptx_ring[SYSADPT_MAX_NUM_TX_DESC - 1].pphys_next = > + cpu_to_le32((u32)desc->pphys_tx_ring); > + desc->tx_hndl[SYSADPT_MAX_NUM_TX_DESC - 1].pnext = > + &desc->tx_hndl[0]; > + > + desc->pstale_tx_hndl = &desc->tx_hndl[0]; > + desc->pnext_tx_hndl = &desc->tx_hndl[0]; > + } else { > + wiphy_err(priv->hw->wiphy, "no valid TX mem\n"); > + return -ENOMEM; > + } > + } > + > + return 0; > +} > + > +static void mwl_tx_ring_cleanup(struct mwl_priv *priv) > +{ > + int cleaned_tx_desc = 0; > + int num, i; > + struct mwl_desc_data *desc; > + > + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) { > + skb_queue_purge(&priv->txq[num]); > + priv->fw_desc_cnt[num] = 0; > + > + desc = &priv->desc_data[num]; > + > + if (desc->ptx_ring) { > + for (i = 0; i < SYSADPT_MAX_NUM_TX_DESC; i++) { > + if (!desc->tx_hndl[i].psk_buff) > + continue; > + > + wiphy_info(priv->hw->wiphy, > + "unmapped and free'd %i 0x%p 0x%x\n", > + i, > + desc->tx_hndl[i].psk_buff->data, > + le32_to_cpu( > + desc->ptx_ring[i].pkt_ptr)); > + pci_unmap_single(priv->pdev, > + le32_to_cpu( > + desc->ptx_ring[i].pkt_ptr), > + desc->tx_hndl[i].psk_buff->len, > + PCI_DMA_TODEVICE); > + dev_kfree_skb_any(desc->tx_hndl[i].psk_buff); > + desc->ptx_ring[i].status = > + cpu_to_le32(EAGLE_TXD_STATUS_IDLE); > + desc->ptx_ring[i].pkt_ptr = 0; > + desc->ptx_ring[i].pkt_len = 0; > + desc->tx_hndl[i].psk_buff = NULL; > + cleaned_tx_desc++; > + } > + } > + } > + > + wiphy_info(priv->hw->wiphy, "cleaned %i TX descr\n", cleaned_tx_desc); > +} > + > +static void mwl_tx_ring_free(struct mwl_priv *priv) > +{ > + int num; > + > + if (priv->desc_data[0].ptx_ring) { > + dma_free_coherent(&priv->pdev->dev, > + MAX_NUM_TX_RING_BYTES * > + SYSADPT_NUM_OF_DESC_DATA, > + priv->desc_data[0].ptx_ring, > + priv->desc_data[0].pphys_tx_ring); > + } > + > + for (num = 0; num < SYSADPT_NUM_OF_DESC_DATA; num++) { > + if (priv->desc_data[num].ptx_ring) > + priv->desc_data[num].ptx_ring = NULL; > + priv->desc_data[num].pstale_tx_hndl = NULL; > + priv->desc_data[num].pnext_tx_hndl = NULL; > + } > + > + kfree(priv->desc_data[0].tx_hndl); > +} > + > +static inline void mwl_tx_add_dma_header(struct mwl_priv *priv, > + struct sk_buff *skb, > + int head_pad, > + int tail_pad) > +{ > + struct ieee80211_hdr *wh; > + int hdrlen; > + int reqd_hdrlen; > + struct mwl_dma_data *tr; > + > + /* Add a firmware DMA header; the firmware requires that we > + * present a 2-byte payload length followed by a 4-address > + * header (without QoS field), followed (optionally) by any > + * WEP/ExtIV header (but only filled in for CCMP). > + */ > + wh = (struct ieee80211_hdr *)skb->data; > + > + hdrlen = ieee80211_hdrlen(wh->frame_control); > + > + reqd_hdrlen = sizeof(*tr) + head_pad; > + > + if (hdrlen != reqd_hdrlen) > + skb_push(skb, reqd_hdrlen - hdrlen); > + > + if (ieee80211_is_data_qos(wh->frame_control)) > + hdrlen -= IEEE80211_QOS_CTL_LEN; > + > + tr = (struct mwl_dma_data *)skb->data; > + > + if (wh != &tr->wh) > + memmove(&tr->wh, wh, hdrlen); > + > + if (hdrlen != sizeof(tr->wh)) > + memset(((void *)&tr->wh) + hdrlen, 0, sizeof(tr->wh) - hdrlen); > + > + /* Firmware length is the length of the fully formed "802.11 > + * payload". That is, everything except for the 802.11 header. > + * This includes all crypto material including the MIC. > + */ > + tr->fwlen = cpu_to_le16(skb->len - sizeof(*tr) + tail_pad); > +} > + > +static inline void mwl_tx_encapsulate_frame(struct mwl_priv *priv, > + struct sk_buff *skb, > + struct ieee80211_key_conf *k_conf, > + bool *ccmp) > +{ > + int head_pad = 0; > + int data_pad = 0; > + > + /* Make sure the packet header is in the DMA header format (4-address > + * without QoS), and add head & tail padding when HW crypto is enabled. > + * > + * We have the following trailer padding requirements: > + * - WEP: 4 trailer bytes (ICV) > + * - TKIP: 12 trailer bytes (8 MIC + 4 ICV) > + * - CCMP: 8 trailer bytes (MIC) > + */ > + > + if (k_conf) { > + head_pad = k_conf->iv_len; > + > + switch (k_conf->cipher) { > + case WLAN_CIPHER_SUITE_WEP40: > + case WLAN_CIPHER_SUITE_WEP104: > + data_pad = 4; > + break; > + case WLAN_CIPHER_SUITE_TKIP: > + data_pad = 12; > + break; > + case WLAN_CIPHER_SUITE_CCMP: > + data_pad = 8; > + *ccmp = true; > + break; > + } > + } > + > + mwl_tx_add_dma_header(priv, skb, head_pad, data_pad); > +} > + > +static inline void mwl_tx_insert_ccmp_hdr(u8 *pccmp_hdr, > + u8 key_id, u16 iv16, u32 iv32) > +{ > + struct ccmp_hdr *ccmp_h = (struct ccmp_hdr *)pccmp_hdr; > + > + ccmp_h->iv16 = cpu_to_le16(iv16); > + ccmp_h->rsvd = 0; > + ccmp_h->key_id = EXT_IV | (key_id << 6); > + ccmp_h->iv32 = cpu_to_le32(iv32); > +} > + > +static inline int mwl_tx_tid_queue_mapping(u8 tid) > +{ > + switch (tid) { > + case 0: > + case 3: > + return IEEE80211_AC_BE; > + case 1: > + case 2: > + return IEEE80211_AC_BK; > + case 4: > + case 5: > + return IEEE80211_AC_VI; > + case 6: > + case 7: > + return IEEE80211_AC_VO; > + default: > + break; > + } > + > + return -1; > +} > + > +static inline void mwl_tx_count_packet(struct ieee80211_sta *sta, u8 tid) > +{ > + struct mwl_sta *sta_info; > + struct mwl_tx_info *tx_stats; > + > + if (WARN_ON(tid >= SYSADPT_MAX_TID)) > + return; > + > + sta_info = mwl_dev_get_sta(sta); > + > + tx_stats = &sta_info->tx_stats[tid]; > + > + if (tx_stats->start_time == 0) > + tx_stats->start_time = jiffies; > + > + /* reset the packet count after each second elapses. If the number of > + * packets ever exceeds the ampdu_min_traffic threshold, we will allow > + * an ampdu stream to be started. > + */ > + if (jiffies - tx_stats->start_time > HZ) { > + tx_stats->pkts = 0; > + tx_stats->start_time = 0; > + } else { > + tx_stats->pkts++; > + } > +} > + > +static inline bool mwl_tx_available(struct mwl_priv *priv, int desc_num) > +{ > + struct mwl_tx_hndl *tx_hndl; > + > + tx_hndl = priv->desc_data[desc_num].pnext_tx_hndl; > + > + if (!tx_hndl->pdesc) > + return false; > + > + if (tx_hndl->pdesc->status != EAGLE_TXD_STATUS_IDLE) { > + /* Interrupt F/W anyway */ > + if (tx_hndl->pdesc->status & > + cpu_to_le32(EAGLE_TXD_STATUS_FW_OWNED)) > + writel(MACREG_H2ARIC_BIT_PPA_READY, > + priv->iobase1 + > + MACREG_REG_H2A_INTERRUPT_EVENTS); > + return false; > + } > + > + return true; > +} > + > +static inline void mwl_tx_skb(struct mwl_priv *priv, int desc_num, > + struct sk_buff *tx_skb) > +{ > + struct ieee80211_tx_info *tx_info; > + struct mwl_tx_ctrl *tx_ctrl; > + struct mwl_tx_hndl *tx_hndl; > + struct mwl_tx_desc *tx_desc; > + struct ieee80211_sta *sta; > + struct ieee80211_vif *vif; > + struct mwl_vif *mwl_vif; > + struct ieee80211_key_conf *k_conf; > + bool ccmp = false; > + struct mwl_dma_data *dma_data; > + struct ieee80211_hdr *wh; > + dma_addr_t dma; > + > + if (WARN_ON(!tx_skb)) > + return; > + > + tx_info = IEEE80211_SKB_CB(tx_skb); > + tx_ctrl = (struct mwl_tx_ctrl *)&tx_info->status; > + sta = (struct ieee80211_sta *)tx_ctrl->sta; > + vif = (struct ieee80211_vif *)tx_ctrl->vif; > + mwl_vif = mwl_dev_get_vif(vif); > + k_conf = (struct ieee80211_key_conf *)tx_ctrl->k_conf; > + > + mwl_tx_encapsulate_frame(priv, tx_skb, k_conf, &ccmp); > + > + dma_data = (struct mwl_dma_data *)tx_skb->data; > + wh = &dma_data->wh; > + > + if (ieee80211_is_data(wh->frame_control)) { > + if (is_multicast_ether_addr(wh->addr1)) { > + if (ccmp) { > + mwl_tx_insert_ccmp_hdr(dma_data->data, > + mwl_vif->keyidx, > + mwl_vif->iv16, > + mwl_vif->iv32); > + INCREASE_IV(mwl_vif->iv16, mwl_vif->iv32); > + } > + } else { > + if (ccmp) { > + if (vif->type == NL80211_IFTYPE_STATION) { > + mwl_tx_insert_ccmp_hdr(dma_data->data, > + mwl_vif->keyidx, > + mwl_vif->iv16, > + mwl_vif->iv32); > + INCREASE_IV(mwl_vif->iv16, > + mwl_vif->iv32); > + } else { > + struct mwl_sta *sta_info; > + > + sta_info = mwl_dev_get_sta(sta); > + > + mwl_tx_insert_ccmp_hdr(dma_data->data, > + 0, > + sta_info->iv16, > + sta_info->iv32); > + INCREASE_IV(sta_info->iv16, > + sta_info->iv32); > + } > + } > + } > + } > + > + tx_hndl = priv->desc_data[desc_num].pnext_tx_hndl; > + tx_hndl->psk_buff = tx_skb; > + tx_desc = tx_hndl->pdesc; > + tx_desc->tx_priority = tx_ctrl->tx_priority; > + tx_desc->qos_ctrl = cpu_to_le16(tx_ctrl->qos_ctrl); > + tx_desc->pkt_len = cpu_to_le16(tx_skb->len); > + tx_desc->packet_info = 0; > + tx_desc->data_rate = 0; > + tx_desc->type = tx_ctrl->type; > + tx_desc->xmit_control = tx_ctrl->xmit_control; > + tx_desc->sap_pkt_info = 0; > + dma = pci_map_single(priv->pdev, tx_skb->data, > + tx_skb->len, PCI_DMA_TODEVICE); > + if (pci_dma_mapping_error(priv->pdev, dma)) { > + dev_kfree_skb_any(tx_skb); > + wiphy_err(priv->hw->wiphy, > + "failed to map pci memory!\n"); > + return; > + } > + tx_desc->pkt_ptr = cpu_to_le32(dma); > + tx_desc->status = cpu_to_le32(EAGLE_TXD_STATUS_FW_OWNED); > + /* make sure all the memory transactions done by cpu were completed */ > + wmb(); /*Data Memory Barrier*/ > + writel(MACREG_H2ARIC_BIT_PPA_READY, > + priv->iobase1 + MACREG_REG_H2A_INTERRUPT_EVENTS); > + priv->desc_data[desc_num].pnext_tx_hndl = tx_hndl->pnext; > + priv->fw_desc_cnt[desc_num]++; > +} > + > +static inline struct sk_buff *mwl_tx_do_amsdu(struct mwl_priv *priv, > + int desc_num, > + struct sk_buff *tx_skb, > + struct ieee80211_tx_info *tx_info) > +{ > + struct ieee80211_sta *sta; > + struct mwl_sta *sta_info; > + struct mwl_tx_ctrl *tx_ctrl = (struct mwl_tx_ctrl *)&tx_info->status; > + struct ieee80211_tx_info *amsdu_info; > + struct sk_buff_head *amsdu_pkts; > + struct mwl_amsdu_frag *amsdu; > + int amsdu_allow_size; > + struct ieee80211_hdr *wh; > + int wh_len; > + u16 len; > + u8 *data; > + > + sta = (struct ieee80211_sta *)tx_ctrl->sta; > + sta_info = mwl_dev_get_sta(sta); > + > + if (!sta_info->is_amsdu_allowed) > + return tx_skb; > + > + wh = (struct ieee80211_hdr *)tx_skb->data; > + if (sta_info->is_mesh_node && is_multicast_ether_addr(wh->addr3)) > + return tx_skb; > + > + if (sta_info->amsdu_ctrl.cap == MWL_AMSDU_SIZE_4K) > + amsdu_allow_size = SYSADPT_AMSDU_4K_MAX_SIZE; > + else if (sta_info->amsdu_ctrl.cap == MWL_AMSDU_SIZE_8K) > + amsdu_allow_size = SYSADPT_AMSDU_8K_MAX_SIZE; > + else > + return tx_skb; > + > + spin_lock_bh(&sta_info->amsdu_lock); > + amsdu = &sta_info->amsdu_ctrl.frag[desc_num]; > + > + if (tx_skb->len > SYSADPT_AMSDU_ALLOW_SIZE) { > + if (amsdu->num) { > + mwl_tx_skb(priv, desc_num, amsdu->skb); > + amsdu->num = 0; > + amsdu->cur_pos = NULL; > + > + if (!mwl_tx_available(priv, desc_num)) { > + skb_queue_head(&priv->txq[desc_num], tx_skb); > + spin_unlock_bh(&sta_info->amsdu_lock); > + return NULL; > + } > + } > + spin_unlock_bh(&sta_info->amsdu_lock); > + return tx_skb; > + } > + > + /* potential amsdu size, should add amsdu header 14 bytes + > + * maximum padding 3. > + */ > + wh_len = ieee80211_hdrlen(wh->frame_control); > + len = tx_skb->len - wh_len + 17; > + > + if (amsdu->num) { > + if ((amsdu->skb->len + len) > amsdu_allow_size) { > + mwl_tx_skb(priv, desc_num, amsdu->skb); > + amsdu->num = 0; > + amsdu->cur_pos = NULL; > + } > + } > + > + amsdu->jiffies = jiffies; > + len = tx_skb->len - wh_len; > + > + if (amsdu->num == 0) { > + struct sk_buff *newskb; > + > + amsdu_pkts = (struct sk_buff_head *) > + kmalloc(sizeof(*amsdu_pkts), GFP_KERNEL); > + if (!amsdu_pkts) { > + spin_unlock_bh(&sta_info->amsdu_lock); > + return tx_skb; > + } > + newskb = dev_alloc_skb(amsdu_allow_size + > + SYSADPT_MIN_BYTES_HEADROOM); > + if (!newskb) { > + spin_unlock_bh(&sta_info->amsdu_lock); > + kfree(amsdu_pkts); > + return tx_skb; > + } > + > + data = newskb->data; > + memcpy(data, tx_skb->data, wh_len); > + if (sta_info->is_mesh_node) { > + ether_addr_copy(data + wh_len, wh->addr3); > + ether_addr_copy(data + wh_len + ETH_ALEN, wh->addr4); > + } else { > + ether_addr_copy(data + wh_len, > + ieee80211_get_DA(wh)); > + ether_addr_copy(data + wh_len + ETH_ALEN, > + ieee80211_get_SA(wh)); > + } > + *(u8 *)(data + wh_len + ETH_HLEN - 1) = len & 0xff; > + *(u8 *)(data + wh_len + ETH_HLEN - 2) = (len >> 8) & 0xff; These bit oeprations are not needed. The pointer must be WORD aligned, right? This is why you have padding after all, unless you have some weird DMA games? You seem to be assuming this alignment anyway because you use ether_addr_copy above. > + > + /* Queue ADDBA request in the respective data queue. While setting up > + * the ampdu stream, mac80211 queues further packets for that > + * particular ra/tid pair. However, packets piled up in the hardware > + * for that ra/tid pair will still go out. ADDBA request and the > + * related data packets going out from different queues asynchronously > + * will cause a shift in the receiver window which might result in > + * ampdu packets getting dropped at the receiver after the stream has > + * been setup. > + */ Here is the race you are facing and that race can be avoided by the proper usage of the _cb > + if (mgmtframe) { > + u16 capab; > + > + if (unlikely(ieee80211_is_action(wh->frame_control) && > + mgmt->u.action.category == WLAN_CATEGORY_BACK && > + mgmt->u.action.u.addba_req.action_code == > + WLAN_ACTION_ADDBA_REQ)) { > + capab = le16_to_cpu(mgmt->u.action.u.addba_req.capab); > + tid = (capab & IEEE80211_ADDBA_PARAM_TID_MASK) >> 2; > + index = mwl_tx_tid_queue_mapping(tid); > + capab |= 1; > + mgmt->u.action.u.addba_req.capab = cpu_to_le16(capab); > + } > + > + if (unlikely(ieee80211_is_action(wh->frame_control) && > + mgmt->u.action.category == WLAN_CATEGORY_BACK && > + mgmt->u.action.u.addba_resp.action_code == > + WLAN_ACTION_ADDBA_RESP)) { > + capab = le16_to_cpu(mgmt->u.action.u.addba_resp.capab); > + capab |= 1; > + mgmt->u.action.u.addba_resp.capab = cpu_to_le16(capab); > + } > + } > + > + index = SYSADPT_TX_WMM_QUEUES - index - 1; > + txpriority = index; > + > + if (sta && sta->ht_cap.ht_supported && !eapol_frame && > + ieee80211_is_data_qos(wh->frame_control)) { > + tid = qos & 0xf; > + mwl_tx_count_packet(sta, tid); > + > + spin_lock_bh(&priv->stream_lock); > + stream = mwl_fwcmd_lookup_stream(hw, sta->addr, tid); > + > + if (stream) { > + if (stream->state == AMPDU_STREAM_ACTIVE) { > + if (WARN_ON(!(qos & > + MWL_QOS_ACK_POLICY_BLOCKACK))) { > + spin_unlock_bh(&priv->stream_lock); > + dev_kfree_skb_any(skb); > + return; > + } > + > + txpriority = > + (SYSADPT_TX_WMM_QUEUES + stream->idx) % > + SYSADPT_TOTAL_HW_QUEUES; > + } else if (stream->state == AMPDU_STREAM_NEW) { > + /* We get here if the driver sends us packets > + * after we've initiated a stream, but before > + * our ampdu_action routine has been called > + * with IEEE80211_AMPDU_TX_START to get the SSN > + * for the ADDBA request. So this packet can > + * go out with no risk of sequence number > + * mismatch. No special handling is required. > + */ > + } else { > + /* Drop packets that would go out after the > + * ADDBA request was sent but before the ADDBA > + * response is received. If we don't do this, > + * the recipient would probably receive it > + * after the ADDBA request with SSN 0. This > + * will cause the recipient's BA receive window > + * to shift, which would cause the subsequent > + * packets in the BA stream to be discarded. > + * mac80211 queues our packets for us in this > + * case, so this is really just a safety check. > + */ Well... I think you can really avoid that. ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-12-15 7:40 ` Emmanuel Grumbach @ 2015-12-15 7:53 ` David Lin 0 siblings, 0 replies; 26+ messages in thread From: David Lin @ 2015-12-15 7:53 UTC (permalink / raw) To: Emmanuel Grumbach Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh PiBFbW1hbnVlbCBHcnVtYmFjaCBbbWFpbHRvOmVncnVtYmFjaEBnbWFpbC5jb21dIHdyb3RlOg0K PiANCj4gSGksDQo+IA0KPiBJIHdhcyBpbnRlcmVzdGVkIGluIHRoZSBjaGVja2luZyB0aGUgQS1N U0RVIGltcGxlbWVudGF0aW9uIG9ubHksIHNvIEkNCj4gcmV2aWV3ZWQgb25seSB0aGF0Lg0KPiAN Cj4gSSBhbSBub3Qgc3VyZSBJIHJlYWxseSBmb2xsb3dlZCB5b3VyIGltcGxlbWVudGF0aW9uIHRo b3VnaC4NCj4gSW4gaXdsd2lmaSBJIGNob3NlIHRoZSBMU08gbWVjaGFuaXNtIHRvIGltcGxlbWVu dCBBLU1TRFUuIEkgdW5kZXJzdGFuZCB0aGF0DQo+IGZvciBhbiBBUCBpdCBtYWtlcyBsZXNzIHNl bnNlIHNpbmNlIHlvdSBkb24ndCByZWFsbHkgaGF2ZSBsb2NhbGx5IGdlbmVyYXRlZA0KPiB0cmFm ZmljIGFuZCBMU08gd29uJ3Qgd29yayB3ZWxsIHdpdGggcGFja2V0cyBmb3J3YXJkZWQgYnkgdGhl IElQIGxheWVyLg0KPiBTbyB5b3Ugc2VlbSB0byBoYXZlIGFkZGVkIGEgdGltZW91dCBtZWNoYW5p c20gaW5zaWRlIHRoZSBkcml2ZXIgdGhhdA0KPiBhY2N1bXVsYXRlcyB0aGUgcGFja2V0IGZvciBh IGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUgYW5kIHNlbmQgdGhlbSBhbGwgd2hlbg0KPiB0aGUgbWF4 IG51bWJlciBvZiBwYWNrZXRzIGhhcyBiZWVuIHJlYWNoZWQ/DQo+IEJ1dCBJIGRpZG4ndCBzZWUg YW55IHRpbWVyIHRoZXJlLCBzbyB0aGF0IGlmIHlvdSBzdGFydCBhbiBBLU1TRFUgYW5kIHRoZW4N Cj4gc3VkZGVubHkgc3RvcCByZWNlaXZpbmcgcGFja2V0cyBmb3IgdHJhbnNtaXNzaW9uLCB0aGUg cGFja2V0IGFscmVhZHkgaW4gdGhlDQo+IGJ1ZmZlciB3aWxsIHN0YXkgc3RhbGU/DQo+DQoNClRo ZSBmbHVzaCBtZWNoYW5pc20gaXMgaG9va2VkIG9uIHF1ZXVlIGVtcHR5IGludGVycnVwdC4NCg0K PiBBIGZldyBtb3JlIGNvbW1lbnRzIGJlbG93Lg0KPiANCj4gT24gVGh1LCBOb3YgMTIsIDIwMTUg YXQgNTo1MSBBTSwgRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPiB3cm90ZToNCj4gPiBUaGlz IHBhdGNoIHByb3ZpZGVzIHRoZSBtd2x3aWZpIGRyaXZlciBmb3IgTWFydmVsbCA4ODYzLCA4ODY0 IGFuZCA4ODk3DQo+ID4gY2hpcHNldHMuDQo+ID4gVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BlZCBh cyBwYXJ0IG9mIHRoZSBvcGVud3J0Lm9yZyBwcm9qZWN0IHRvDQo+ID4gc3VwcG9ydCBMaW5rc3lz IFdSVDE5MDBBQyBhbmQgaXMgbWFpbnRhaW5lZCBvbg0KPiBodHRwczovL2dpdGh1Yi5jb20va2Fs b3ovbXdsd2lmaS4NCj4gPg0KPiA+IFRoZSBtd2x3aWZpIGRyaXZlciBkaWZmZXJzIGZyb20gZXhp c3RpbmcgbXdpZmlleCBkcml2ZXI6DQo+ID4gbyBtd2x3aWZpIGlzIGEgInNvZnRtYWMgZHJpdmVy IiB1c2luZyB0aGUga2VybmVsP+6ogyBtYWM4MDIuMTEgc3Vic3lzdGVtDQo+ID4gdG8gcHJvdmlk ZSBmdWxsIEFQL1dpcmVsZXNzIEJyaWRnZSBmdW5jdGlvbmFsaXR5IChyb3V0ZXJzKS4NCj4gPiBv IG13aWZpZXggaXMgYSAiZnVsbG1hYyBkcml2ZXIiIHdoaWNoIHByb3ZpZGVzIGEgY29tcHJlaGVu c2l2ZSBzZXQgb2YNCj4gPiBjbGllbnQgZnVuY3Rpb25zIChsYXB0b3BzL2VtYmVkZGVkIGRldmlj ZXMpIG8gb25seSBtd2x3aWZpIHN1cHBvcnRzDQo+ID4gTWFydmVsbCBBUCBjaGlwIDg4Nlggc2Vy aWVzDQo+ID4NCj4gDQo+IFtzbmlwXQ0KPiANCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgbXdsX21h YzgwMjExX2FtcGR1X2FjdGlvbihzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywNCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGllZWU4MDIxMV92aWYgKnZpZiwN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bQ0KPiBpZWVlODAy MTFfYW1wZHVfbWxtZV9hY3Rpb24gYWN0aW9uLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3N0YSAqc3RhLA0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1MTYgdGlkLCB1MTYgKnNzbiwgdTggYnVmX3NpemUs DQo+ID4gK2Jvb2wgYW1zZHUpIHsNCj4gPiArICAgICAgIGludCByYyA9IDA7DQo+ID4gKyAgICAg ICBzdHJ1Y3QgbXdsX3ByaXYgKnByaXYgPSBody0+cHJpdjsNCj4gPiArICAgICAgIHN0cnVjdCBt d2xfYW1wZHVfc3RyZWFtICpzdHJlYW07DQo+ID4gKyAgICAgICB1OCAqYWRkciA9IHN0YS0+YWRk ciwgaWR4Ow0KPiA+ICsgICAgICAgc3RydWN0IG13bF9zdGEgKnN0YV9pbmZvOw0KPiA+ICsNCj4g PiArICAgICAgIHN0YV9pbmZvID0gbXdsX2Rldl9nZXRfc3RhKHN0YSk7DQo+ID4gKw0KPiA+ICsg ICAgICAgc3Bpbl9sb2NrX2JoKCZwcml2LT5zdHJlYW1fbG9jayk7DQo+ID4gKw0KPiA+ICsgICAg ICAgc3RyZWFtID0gbXdsX2Z3Y21kX2xvb2t1cF9zdHJlYW0oaHcsIGFkZHIsIHRpZCk7DQo+ID4g Kw0KPiA+ICsgICAgICAgc3dpdGNoIChhY3Rpb24pIHsNCj4gPiArICAgICAgIGNhc2UgSUVFRTgw MjExX0FNUERVX1JYX1NUQVJUOg0KPiA+ICsgICAgICAgY2FzZSBJRUVFODAyMTFfQU1QRFVfUlhf U1RPUDoNCj4gPiArICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICBjYXNlIElFRUU4 MDIxMV9BTVBEVV9UWF9TVEFSVDoNCj4gPiArICAgICAgICAgICAgICAgaWYgKCFzdGFfaW5mby0+ aXNfYW1wZHVfYWxsb3dlZCkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHdpcGh5X3dh cm4oaHctPndpcGh5LCAiYW1wZHUgbm90DQo+IGFsbG93ZWRcbiIpOw0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJjID0gLUVQRVJNOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGJy ZWFrOw0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBp ZiAoIXN0cmVhbSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IG13bF9m d2NtZF9hZGRfc3RyZWFtKGh3LCBzdGEsDQo+IHRpZCk7DQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgaWYgKCFzdHJlYW0pIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IHdpcGh5X3dhcm4oaHctPndpcGh5LCAibm8gc3RyZWFtDQo+IGZvdW5kXG4iKTsNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjID0gLUVQRVJNOw0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg fQ0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBzcGlu X3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICByYyA9 IG13bF9md2NtZF9jaGVja19iYShodywgc3RyZWFtLCB2aWYpOw0KPiA+ICsgICAgICAgICAgICAg ICBzcGluX2xvY2tfYmgoJnByaXYtPnN0cmVhbV9sb2NrKTsNCj4gPiArICAgICAgICAgICAgICAg aWYgKHJjKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgbXdsX2Z3Y21kX3JlbW92ZV9z dHJlYW0oaHcsIHN0cmVhbSk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgd2lwaHlfZXJy KGh3LT53aXBoeSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFtcGR1 IHN0YXJ0IGVycm9yIGNvZGU6ICVkXG4iLA0KPiByYyk7DQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgcmMgPSAtRVBFUk07DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgc3RyZWFtLT5zdGF0ZSA9 IEFNUERVX1NUUkVBTV9JTl9QUk9HUkVTUzsNCj4gPiArICAgICAgICAgICAgICAgKnNzbiA9IDA7 DQo+ID4gKyAgICAgICAgICAgICAgIGllZWU4MDIxMV9zdGFydF90eF9iYV9jYl9pcnFzYWZlKHZp ZiwgYWRkciwgdGlkKTsNCj4gDQo+IFRoaXMgaXMgd2h5IHlvdSBoYXZlIHRoZSByYWNlIHlvdSBt ZW50aW9uIGJlbG93LiBXaGF0IHlvdSBzaG91bGQgcmVhbGx5IGJlDQo+IGRvaW5nIGlzIHRvIHdh aXQgdW50aWwgdGhlIGFsbCB0aGUgcGFja2V0cyBmb3IgdGhhdCBSQSAvIFRJRCBhcmUgc2VudCBm cm9tIGFsbCB0aGUNCj4gSFcgVHggcXVldWVzIChvbmx5IG9uZSByZWFsaXN0aWNhbGx5KSwgYW5k IG9ubHkgdGhlbiBjYWxsIHRoZSBfY2IuIFRoaXMgd2lsbA0KPiBhbGxvdyB5b3UgdG8gc2VuZCB0 aGUgQUREQkEgcmVxIG9uIHRoZSBWTyBxdWV1ZSBhcyBpdCBzaG91bGQgYmUgYWNjb3JkaW5nIHRv DQo+IHNwZWMuDQo+IA0KPiBbc25pcF0NCj4gDQo+ID4gKw0KPiA+ICt2b2lkIG13bF9yeF9yZWN2 KHVuc2lnbmVkIGxvbmcgZGF0YSkNCj4gPiArew0KPiANCj4gW3NuaXBdDQo+IA0KPiA+ICsNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICBpZg0KPiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2Fj dGlvbih3aC0+ZnJhbWVfY29udHJvbCkgJiYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgbWdtdC0+dS5hY3Rpb24uY2F0ZWdvcnkgPT0NCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9DQVRFR09SWV9CQUNLICYmDQo+ID4gKw0KPiBt Z210LT51LmFjdGlvbi51LmFkZGJhX3Jlc3AuYWN0aW9uX2NvZGUgPT0NCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgV0xBTl9BQ1RJT05fQUREQkFfUkVTUCkpDQo+IHsN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFiID0NCj4gbWdtdC0+dS5h Y3Rpb24udS5hZGRiYV9yZXNwLmNhcGFiOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgaWYgKGxlMTZfdG9fY3B1KGNhcGFiKSAmIDEpDQo+ID4gKw0KPiBtd2xfcnhfZW5hYmxl X3N0YV9hbXNkdShwcml2LA0KPiA+ICsgbWdtdC0+c2EpOw0KPiANCj4gZXJyLi4uIG5vLiBtYWM4 MDIxMSBrbm93cyBob3cgdG8gZG8gdGhhdCB0b2RheS4gSm9oYW5uZXMgYWxyZWFkeSByZXBvcnRl ZCBhDQo+IHNpbWlsYXIgaXNzdWUgc29tZXdoZXJlIGVsc2UgaW4geW91ciBjb2RlLg0KDQpZZXMu IFRoZSBwYXRjaCBpcyByZWFkeSBvbiAyMDE1LzkuDQoNCj4gDQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAg ICAgICBpZiAoaWVlZTgwMjExX2lzX2RhdGFfcW9zKHdoLT5mcmFtZV9jb250cm9sKSAmJg0KPiA+ ICsgICAgICAgICAgICAgICAgICAgaWVlZTgwMjExX2hhc19hNCh3aC0+ZnJhbWVfY29udHJvbCkp IHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB1OCAqcWMgPSBpZWVlODAyMTFfZ2V0X3Fv c19jdGwod2gpOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBpZiAoKnFjICYN Cj4gSUVFRTgwMjExX1FPU19DVExfQV9NU0RVX1BSRVNFTlQpDQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBpZg0KPiAobXdsX3J4X3Byb2Nlc3NfbWVzaF9hbXNkdShwcml2LCBw cnhfc2tiLA0KPiA+ICsNCj4gPiArICZzdGF0dXMpKQ0KPiANCj4gVGhpcyBzb3VuZHMgdG8gYmUg c29tZXRoaW5nIHlvdSB3YW50IHRvIHRlYWNoIG1hYzgwMjExIGFib3V0Lg0KPiANCj4gW3NuaXBd DQo+IA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBUX0FNU0RVX0ZXX01BWF9TSVpFICAgICAg MzMwMA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBUX0FNU0RVXzRLX01BWF9TSVpFDQo+IFNZ U0FEUFRfQU1TRFVfRldfTUFYX1NJWkUNCj4gPiArDQo+ID4gKyNkZWZpbmUgU1lTQURQVF9BTVNE VV84S19NQVhfU0laRQ0KPiBTWVNBRFBUX0FNU0RVX0ZXX01BWF9TSVpFDQo+IA0KPiBJbiBjYXNl IHRoZSBGVyB3aWxsIGdyb3cgbGF0ZXI/DQo+IA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBU X0FNU0RVX0FMTE9XX1NJWkUgICAgICAgMTYwMA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBU X0FNU0RVX0ZMVVNIX1RJTUUgICAgICAgNTAwDQo+ID4gKw0KPiA+ICsjZGVmaW5lIFNZU0FEUFRf QU1TRFVfUEFDS0VUX1RIUkVTSE9MRCAxMA0KPiA+ICsNCj4gPiArI2RlZmluZSBTWVNBRFBUX01B WF9USUQgICAgICAgICAgICAgICAgOA0KPiA+ICsNCj4gPiArI2VuZGlmIC8qIF9td2xfc3lzYWRw dF9oXyAqLw0KPiA+IGRpZmYgLS1naXQgYS9kcml2ZXJzL25ldC93aXJlbGVzcy9tYXJ2ZWxsL213 bHdpZmkvdHguYw0KPiA+IGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVsbC9td2x3aWZpL3R4 LmMNCj4gPiBuZXcgZmlsZSBtb2RlIDEwMDY0NA0KPiA+IGluZGV4IDAwMDAwMDAuLjY4YTk5NGQN Cj4gPiAtLS0gL2Rldi9udWxsDQo+ID4gKysrIGIvZHJpdmVycy9uZXQvd2lyZWxlc3MvbWFydmVs bC9td2x3aWZpL3R4LmMNCj4gPiBAQCAtMCwwICsxLDEyNTEgQEANCj4gPiArLyoNCj4gPiArICog Q29weXJpZ2h0IChDKSAyMDA2LTIwMTUsIE1hcnZlbGwgSW50ZXJuYXRpb25hbCBMdGQuDQo+ID4g KyAqDQo+ID4gKyAqIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgZGlzdHJpYnV0 ZWQgYnkgTWFydmVsbA0KPiA+ICtJbnRlcm5hdGlvbmFsDQo+ID4gKyAqIEx0ZC4gdW5kZXIgdGhl IHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsDQo+ID4g K0p1bmUgMTk5MQ0KPiA+ICsgKiAodGhlICJMaWNlbnNlIikuICBZb3UgbWF5IHVzZSwgcmVkaXN0 cmlidXRlIGFuZC9vciBtb2RpZnkgdGhpcw0KPiA+ICtGaWxlIGluDQo+ID4gKyAqIGFjY29yZGFu Y2Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIExpY2Vuc2UsIGEgY29weSBv Zg0KPiA+ICt3aGljaA0KPiA+ICsgKiBpcyBhdmFpbGFibGUgYnkgd3JpdGluZyB0byB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuDQo+ID4gKyAqDQo+ID4gKyAqIFRIRSBGSUxFIElT IERJU1RSSUJVVEVEIEFTLUlTLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBBTkQNCj4g PiArVEhFDQo+ID4gKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1Ig RklUTkVTUyBGT1IgQQ0KPiBQQVJUSUNVTEFSDQo+ID4gK1BVUlBPU0UNCj4gPiArICogQVJFIEVY UFJFU1NMWSBESVNDTEFJTUVELiAgVGhlIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRh aWxzDQo+ID4gK2Fib3V0DQo+ID4gKyAqIHRoaXMgd2FycmFudHkgZGlzY2xhaW1lci4NCj4gPiAr ICovDQo+ID4gKw0KPiA+ICsvKiBEZXNjcmlwdGlvbjogIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRy YW5zbWl0IHJlbGF0ZWQgZnVuY3Rpb25zLiAqLw0KPiA+ICsNCj4gPiArI2luY2x1ZGUgPGxpbnV4 L2V0aGVyZGV2aWNlLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4NCj4gPiArDQo+ ID4gKyNpbmNsdWRlICJzeXNhZHB0LmgiDQo+ID4gKyNpbmNsdWRlICJkZXYuaCINCj4gPiArI2lu Y2x1ZGUgImZ3Y21kLmgiDQo+ID4gKyNpbmNsdWRlICJ0eC5oIg0KPiA+ICsNCj4gPiArI2RlZmlu ZSBNQVhfTlVNX1RYX1JJTkdfQllURVMgIChTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAqIFwNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzdHJ1Y3QgbXdsX3R4X2Rl c2MpKQ0KPiA+ICsNCj4gPiArI2RlZmluZSBNQVhfTlVNX1RYX0hORExfQllURVMgICAoU1lTQURQ VF9NQVhfTlVNX1RYX0RFU0MgKg0KPiBcDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBzaXplb2Yoc3RydWN0IG13bF90eF9obmRsKSkNCj4gPiArDQo+ID4gKyNkZWZpbmUgRUFH TEVfVFhEX1hNSVRDVFJMX1VTRV9NQ19SQVRFICAgICAweDggICAgIC8qIFVzZQ0KPiBtdWx0aWNh c3QgZGF0YSByYXRlICovDQo+ID4gKw0KPiA+ICsjZGVmaW5lIE1XTF9RT1NfQUNLX1BPTElDWV9N QVNLICAgICAgICAgICAgICAgICAgIDB4MDA2MA0KPiA+ICsjZGVmaW5lIE1XTF9RT1NfQUNLX1BP TElDWV9OT1JNQUwgICAgICAgICAgMHgwMDAwDQo+ID4gKyNkZWZpbmUgTVdMX1FPU19BQ0tfUE9M SUNZX0JMT0NLQUNLICAgICAgICAweDAwNjANCj4gPiArDQo+ID4gKyNkZWZpbmUgRVhUX0lWICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAweDIwDQo+ID4gKyNkZWZpbmUgSU5DUkVBU0VfSVYo aXYxNiwgaXYzMikgXA0KPiA+ICt7IFwNCj4gPiArICAgICAgIChpdjE2KSsrOyBcDQo+ID4gKyAg ICAgICBpZiAoKGl2MTYpID09IDApIFwNCj4gPiArICAgICAgICAgICAgICAgKGl2MzIpKys7IFwN Cj4gPiArfQ0KPiA+ICsNCj4gPiArLyogVHJhbnNtaXQgcmF0ZSBpbmZvcm1hdGlvbiBjb25zdGFu dHMgKi8NCj4gPiArI2RlZmluZSBUWF9SQVRFX0ZPUk1BVF9MRUdBQ1kgICAgICAgICAwDQo+ID4g KyNkZWZpbmUgVFhfUkFURV9GT1JNQVRfMTFOICAgICAgICAgICAgMQ0KPiA+ICsjZGVmaW5lIFRY X1JBVEVfRk9STUFUXzExQUMgICAgICAgICAgIDINCj4gPiArDQo+ID4gKyNkZWZpbmUgVFhfUkFU RV9CQU5EV0lEVEhfMjAgICAgICAgICAgMA0KPiA+ICsjZGVmaW5lIFRYX1JBVEVfQkFORFdJRFRI XzQwICAgICAgICAgIDENCj4gPiArI2RlZmluZSBUWF9SQVRFX0JBTkRXSURUSF84MCAgICAgICAg ICAyDQo+ID4gKw0KPiA+ICsjZGVmaW5lIFRYX1JBVEVfSU5GT19TVERfR0kgICAgICAgICAgIDAN Cj4gPiArI2RlZmluZSBUWF9SQVRFX0lORk9fU0hPUlRfR0kgICAgICAgICAxDQo+ID4gKw0KPiA+ ICtlbnVtIHsNCj4gPiArICAgICAgIElFRUVfVFlQRV9NQU5BR0VNRU5UID0gMCwNCj4gPiArICAg ICAgIElFRUVfVFlQRV9DT05UUk9MLA0KPiA+ICsgICAgICAgSUVFRV9UWVBFX0RBVEENCj4gPiAr fTsNCj4gPiArDQo+ID4gK3N0cnVjdCBjY21wX2hkciB7DQo+ID4gKyAgICAgICBfX2xlMTYgaXYx NjsNCj4gPiArICAgICAgIHU4IHJzdmQ7DQo+ID4gKyAgICAgICB1OCBrZXlfaWQ7DQo+ID4gKyAg ICAgICBfX2xlMzIgaXYzMjsNCj4gPiArfSBfX3BhY2tlZDsNCj4gPiArDQo+ID4gK3N0YXRpYyBp bnQgbXdsX3R4X3JpbmdfYWxsb2Moc3RydWN0IG13bF9wcml2ICpwcml2KSB7DQo+ID4gKyAgICAg ICBzdHJ1Y3QgbXdsX2Rlc2NfZGF0YSAqZGVzYzsNCj4gPiArICAgICAgIGludCBudW07DQo+ID4g KyAgICAgICB1OCAqbWVtOw0KPiA+ICsNCj4gPiArICAgICAgIGRlc2MgPSAmcHJpdi0+ZGVzY19k YXRhWzBdOw0KPiA+ICsNCj4gPiArICAgICAgIG1lbSA9IGRtYV9hbGxvY19jb2hlcmVudCgmcHJp di0+cGRldi0+ZGV2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9O VU1fVFhfUklOR19CWVRFUyAqDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg U1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICZkZXNjLT5wcGh5c190eF9yaW5nLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIEdGUF9LRVJORUwpOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICghbWVtKSB7DQo+ ID4gKyAgICAgICAgICAgICAgIHdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjYW5ub3QgYWxs b2MgbWVtXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKyAg ICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05V TV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRlc2MgPSAmcHJp di0+ZGVzY19kYXRhW251bV07DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBkZXNjLT5wdHhf cmluZyA9IChzdHJ1Y3QgbXdsX3R4X2Rlc2MgKikNCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAobWVtICsgbnVtICogTUFYX05VTV9UWF9SSU5HX0JZVEVTKTsNCj4gPiArDQo+ID4gKyAgICAg ICAgICAgICAgIGRlc2MtPnBwaHlzX3R4X3JpbmcgPSAoZG1hX2FkZHJfdCkNCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAoKHUzMilwcml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfdHhfcmluZyAr DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgbnVtICogTUFYX05VTV9UWF9SSU5HX0JZVEVT KTsNCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIG1lbXNldChkZXNjLT5wdHhfcmluZywgMHgw MCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fVFhfUklOR19CWVRFUyk7DQo+ ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgbWVtID0ga21hbGxvYyhNQVhfTlVNX1RY X0hORExfQllURVMgKg0KPiBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEEsDQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgIEdGUF9LRVJORUwpOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICghbWVtKSB7 DQo+ID4gKyAgICAgICAgICAgICAgIHdpcGh5X2Vycihwcml2LT5ody0+d2lwaHksICJjYW5ub3Qg YWxsb2MgbWVtXG4iKTsNCj4gPiArICAgICAgICAgICAgICAgZG1hX2ZyZWVfY29oZXJlbnQoJnBy aXYtPnBkZXYtPmRldiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFY X05VTV9UWF9SSU5HX0JZVEVTICoNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgU1lTQURQVF9OVU1fT0ZfREVTQ19EQVRBLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcml2LT5kZXNjX2RhdGFbMF0ucHR4X3JpbmcsDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHByaXYtPmRlc2NfZGF0YVswXS5wcGh5c190eF9yaW5nKTsN Cj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKyAgICAgICB9DQo+ID4g Kw0KPiA+ICsgICAgICAgZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RB VEE7IG51bSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRlc2MgPSAmcHJpdi0+ZGVzY19kYXRh W251bV07DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBkZXNjLT50eF9obmRsID0gKHN0cnVj dCBtd2xfdHhfaG5kbCAqKQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIChtZW0gKyBudW0g KiBNQVhfTlVNX1RYX0hORExfQllURVMpOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgbWVt c2V0KGRlc2MtPnR4X2huZGwsIDB4MDAsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICBNQVhf TlVNX1RYX0hORExfQllURVMpOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIHJl dHVybiAwOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW50IG13bF90eF9yaW5nX2luaXQo c3RydWN0IG13bF9wcml2ICpwcml2KSB7DQo+ID4gKyAgICAgICBpbnQgbnVtLCBpOw0KPiA+ICsg ICAgICAgc3RydWN0IG13bF9kZXNjX2RhdGEgKmRlc2M7DQo+ID4gKw0KPiA+ICsgICAgICAgZm9y IChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9PRl9ERVNDX0RBVEE7IG51bSsrKSB7DQo+ID4g KyAgICAgICAgICAgICAgIHNrYl9xdWV1ZV9oZWFkX2luaXQoJnByaXYtPnR4cVtudW1dKTsNCj4g PiArICAgICAgICAgICAgICAgcHJpdi0+ZndfZGVzY19jbnRbbnVtXSA9IDA7DQo+ID4gKw0KPiA+ ICsgICAgICAgICAgICAgICBkZXNjID0gJnByaXYtPmRlc2NfZGF0YVtudW1dOw0KPiA+ICsNCj4g PiArICAgICAgICAgICAgICAgaWYgKGRlc2MtPnB0eF9yaW5nKSB7DQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfTUFYX05VTV9UWF9ERVNDOw0KPiBp KyspIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPnB0eF9yaW5n W2ldLnN0YXR1cyA9DQo+ID4gKw0KPiBjcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0lETEUp Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+cHR4X3JpbmdbaV0u cHBoeXNfbmV4dCA9DQo+ID4gKw0KPiBjcHVfdG9fbGUzMigodTMyKWRlc2MtPnBwaHlzX3R4X3Jp bmcgKw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGkgKyAx KSAqIHNpemVvZihzdHJ1Y3QNCj4gbXdsX3R4X2Rlc2MpKSk7DQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBkZXNjLT50eF9obmRsW2ldLnBkZXNjID0NCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MtPnB0eF9yaW5nW2ldOw0KPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBTWVNBRFBUX01BWF9OVU1fVFhf REVTQw0KPiAtIDEpDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGRlc2MtPnR4X2huZGxbaV0ucG5leHQgPQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICZkZXNjLT50eF9obmRsW2kNCj4gKyAxXTsNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+ cHR4X3JpbmdbU1lTQURQVF9NQVhfTlVNX1RYX0RFU0MNCj4gLSAxXS5wcGh5c19uZXh0ID0NCj4g PiArDQo+IGNwdV90b19sZTMyKCh1MzIpZGVzYy0+cHBoeXNfdHhfcmluZyk7DQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgZGVzYy0+dHhfaG5kbFtTWVNBRFBUX01BWF9OVU1fVFhfREVTQyAt DQo+IDFdLnBuZXh0ID0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNj LT50eF9obmRsWzBdOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5w c3RhbGVfdHhfaG5kbCA9ICZkZXNjLT50eF9obmRsWzBdOw0KPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgIGRlc2MtPnBuZXh0X3R4X2huZGwgID0gJmRlc2MtPnR4X2huZGxbMF07DQo+ID4gKyAg ICAgICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgd2lwaHlf ZXJyKHByaXYtPmh3LT53aXBoeSwgIm5vIHZhbGlkIFRYDQo+IG1lbVxuIik7DQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07DQo+ID4gKyAgICAgICAgICAgICAgIH0N Cj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICByZXR1cm4gMDsNCj4gPiArfQ0KPiA+ ICsNCj4gPiArc3RhdGljIHZvaWQgbXdsX3R4X3JpbmdfY2xlYW51cChzdHJ1Y3QgbXdsX3ByaXYg KnByaXYpIHsNCj4gPiArICAgICAgIGludCBjbGVhbmVkX3R4X2Rlc2MgPSAwOw0KPiA+ICsgICAg ICAgaW50IG51bSwgaTsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfZGVzY19kYXRhICpkZXNjOw0K PiA+ICsNCj4gPiArICAgICAgIGZvciAobnVtID0gMDsgbnVtIDwgU1lTQURQVF9OVU1fT0ZfREVT Q19EQVRBOyBudW0rKykgew0KPiA+ICsgICAgICAgICAgICAgICBza2JfcXVldWVfcHVyZ2UoJnBy aXYtPnR4cVtudW1dKTsNCj4gPiArICAgICAgICAgICAgICAgcHJpdi0+ZndfZGVzY19jbnRbbnVt XSA9IDA7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBkZXNjID0gJnByaXYtPmRlc2NfZGF0 YVtudW1dOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgaWYgKGRlc2MtPnB0eF9yaW5nKSB7 DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IFNZU0FEUFRfTUFY X05VTV9UWF9ERVNDOw0KPiBpKyspIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGlmICghZGVzYy0+dHhfaG5kbFtpXS5wc2tfYnVmZikNCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7DQo+ID4gKw0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bm1hcHBlZCBhbmQgZnJl ZSdkDQo+ICVpIDB4JXAgMHgleFxuIiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgaSwNCj4gPiArDQo+IGRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYtPmRh dGEsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlMzJf dG9fY3B1KA0KPiA+ICsNCj4gZGVzYy0+cHR4X3JpbmdbaV0ucGt0X3B0cikpOw0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNpX3VubWFwX3NpbmdsZShwcml2LT5wZGV2LA0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZTMy X3RvX2NwdSgNCj4gPiArDQo+IGRlc2MtPnB0eF9yaW5nW2ldLnBrdF9wdHIpLA0KPiA+ICsNCj4g ZGVzYy0+dHhfaG5kbFtpXS5wc2tfYnVmZi0+bGVuLA0KPiA+ICsNCj4gUENJX0RNQV9UT0RFVklD RSk7DQo+ID4gKw0KPiBkZXZfa2ZyZWVfc2tiX2FueShkZXNjLT50eF9obmRsW2ldLnBza19idWZm KTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPnB0eF9yaW5nW2ld LnN0YXR1cyA9DQo+ID4gKw0KPiBjcHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0lETEUpOw0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+cHR4X3JpbmdbaV0ucGt0 X3B0ciA9IDA7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5wdHhf cmluZ1tpXS5wa3RfbGVuID0gMDsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGRlc2MtPnR4X2huZGxbaV0ucHNrX2J1ZmYgPSBOVUxMOw0KPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgY2xlYW5lZF90eF9kZXNjKys7DQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ ICsgICAgICAgd2lwaHlfaW5mbyhwcml2LT5ody0+d2lwaHksICJjbGVhbmVkICVpIFRYIGRlc2Ny XG4iLA0KPiA+ICtjbGVhbmVkX3R4X2Rlc2MpOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgdm9pZCBt d2xfdHhfcmluZ19mcmVlKHN0cnVjdCBtd2xfcHJpdiAqcHJpdikgew0KPiA+ICsgICAgICAgaW50 IG51bTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAocHJpdi0+ZGVzY19kYXRhWzBdLnB0eF9yaW5n KSB7DQo+ID4gKyAgICAgICAgICAgICAgIGRtYV9mcmVlX2NvaGVyZW50KCZwcml2LT5wZGV2LT5k ZXYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9OVU1fVFhfUklO R19CWVRFUyAqDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNZU0FEUFRf TlVNX09GX0RFU0NfREFUQSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg cHJpdi0+ZGVzY19kYXRhWzBdLnB0eF9yaW5nLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBwcml2LT5kZXNjX2RhdGFbMF0ucHBoeXNfdHhfcmluZyk7DQo+ID4gKyAgICAg ICB9DQo+ID4gKw0KPiA+ICsgICAgICAgZm9yIChudW0gPSAwOyBudW0gPCBTWVNBRFBUX05VTV9P Rl9ERVNDX0RBVEE7IG51bSsrKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGlmIChwcml2LT5kZXNj X2RhdGFbbnVtXS5wdHhfcmluZykNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5k ZXNjX2RhdGFbbnVtXS5wdHhfcmluZyA9IE5VTEw7DQo+ID4gKyAgICAgICAgICAgICAgIHByaXYt PmRlc2NfZGF0YVtudW1dLnBzdGFsZV90eF9obmRsID0gTlVMTDsNCj4gPiArICAgICAgICAgICAg ICAgcHJpdi0+ZGVzY19kYXRhW251bV0ucG5leHRfdHhfaG5kbCA9IE5VTEw7DQo+ID4gKyAgICAg ICB9DQo+ID4gKw0KPiA+ICsgICAgICAga2ZyZWUocHJpdi0+ZGVzY19kYXRhWzBdLnR4X2huZGwp Ow0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4X2FkZF9kbWFf aGVhZGVyKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVhZF9wYWQsDQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFpbF9wYWQpIHsNCj4gPiArICAg ICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCj4gPiArICAgICAgIGludCBoZHJsZW47DQo+ ID4gKyAgICAgICBpbnQgcmVxZF9oZHJsZW47DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdsX2RtYV9k YXRhICp0cjsNCj4gPiArDQo+ID4gKyAgICAgICAvKiBBZGQgYSBmaXJtd2FyZSBETUEgaGVhZGVy OyB0aGUgZmlybXdhcmUgcmVxdWlyZXMgdGhhdCB3ZQ0KPiA+ICsgICAgICAgICogcHJlc2VudCBh IDItYnl0ZSBwYXlsb2FkIGxlbmd0aCBmb2xsb3dlZCBieSBhIDQtYWRkcmVzcw0KPiA+ICsgICAg ICAgICogaGVhZGVyICh3aXRob3V0IFFvUyBmaWVsZCksIGZvbGxvd2VkIChvcHRpb25hbGx5KSBi eSBhbnkNCj4gPiArICAgICAgICAqIFdFUC9FeHRJViBoZWFkZXIgKGJ1dCBvbmx5IGZpbGxlZCBp biBmb3IgQ0NNUCkuDQo+ID4gKyAgICAgICAgKi8NCj4gPiArICAgICAgIHdoID0gKHN0cnVjdCBp ZWVlODAyMTFfaGRyICopc2tiLT5kYXRhOw0KPiA+ICsNCj4gPiArICAgICAgIGhkcmxlbiA9IGll ZWU4MDIxMV9oZHJsZW4od2gtPmZyYW1lX2NvbnRyb2wpOw0KPiA+ICsNCj4gPiArICAgICAgIHJl cWRfaGRybGVuID0gc2l6ZW9mKCp0cikgKyBoZWFkX3BhZDsNCj4gPiArDQo+ID4gKyAgICAgICBp ZiAoaGRybGVuICE9IHJlcWRfaGRybGVuKQ0KPiA+ICsgICAgICAgICAgICAgICBza2JfcHVzaChz a2IsIHJlcWRfaGRybGVuIC0gaGRybGVuKTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoaWVlZTgw MjExX2lzX2RhdGFfcW9zKHdoLT5mcmFtZV9jb250cm9sKSkNCj4gPiArICAgICAgICAgICAgICAg aGRybGVuIC09IElFRUU4MDIxMV9RT1NfQ1RMX0xFTjsNCj4gPiArDQo+ID4gKyAgICAgICB0ciA9 IChzdHJ1Y3QgbXdsX2RtYV9kYXRhICopc2tiLT5kYXRhOw0KPiA+ICsNCj4gPiArICAgICAgIGlm ICh3aCAhPSAmdHItPndoKQ0KPiA+ICsgICAgICAgICAgICAgICBtZW1tb3ZlKCZ0ci0+d2gsIHdo LCBoZHJsZW4pOw0KPiA+ICsNCj4gPiArICAgICAgIGlmIChoZHJsZW4gIT0gc2l6ZW9mKHRyLT53 aCkpDQo+ID4gKyAgICAgICAgICAgICAgIG1lbXNldCgoKHZvaWQgKikmdHItPndoKSArIGhkcmxl biwgMCwgc2l6ZW9mKHRyLT53aCkgLQ0KPiA+ICsgaGRybGVuKTsNCj4gPiArDQo+ID4gKyAgICAg ICAvKiBGaXJtd2FyZSBsZW5ndGggaXMgdGhlIGxlbmd0aCBvZiB0aGUgZnVsbHkgZm9ybWVkICI4 MDIuMTENCj4gPiArICAgICAgICAqIHBheWxvYWQiLiAgVGhhdCBpcywgZXZlcnl0aGluZyBleGNl cHQgZm9yIHRoZSA4MDIuMTEgaGVhZGVyLg0KPiA+ICsgICAgICAgICogVGhpcyBpbmNsdWRlcyBh bGwgY3J5cHRvIG1hdGVyaWFsIGluY2x1ZGluZyB0aGUgTUlDLg0KPiA+ICsgICAgICAgICovDQo+ ID4gKyAgICAgICB0ci0+ZndsZW4gPSBjcHVfdG9fbGUxNihza2ItPmxlbiAtIHNpemVvZigqdHIp ICsgdGFpbF9wYWQpOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5lIHZvaWQgbXdsX3R4X2Vu Y2Fwc3VsYXRlX2ZyYW1lKHN0cnVjdCBtd2xfcHJpdiAqcHJpdiwNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpza2IsDQo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QNCj4gaWVl ZTgwMjExX2tleV9jb25mICprX2NvbmYsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBib29sICpjY21wKSB7DQo+ID4gKyAgICAgICBpbnQgaGVhZF9wYWQg PSAwOw0KPiA+ICsgICAgICAgaW50IGRhdGFfcGFkID0gMDsNCj4gPiArDQo+ID4gKyAgICAgICAv KiBNYWtlIHN1cmUgdGhlIHBhY2tldCBoZWFkZXIgaXMgaW4gdGhlIERNQSBoZWFkZXIgZm9ybWF0 DQo+ICg0LWFkZHJlc3MNCj4gPiArICAgICAgICAqIHdpdGhvdXQgUW9TKSwgYW5kIGFkZCBoZWFk ICYgdGFpbCBwYWRkaW5nIHdoZW4gSFcgY3J5cHRvIGlzDQo+IGVuYWJsZWQuDQo+ID4gKyAgICAg ICAgKg0KPiA+ICsgICAgICAgICogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIHRyYWlsZXIgcGFkZGlu ZyByZXF1aXJlbWVudHM6DQo+ID4gKyAgICAgICAgKiAtIFdFUDogNCB0cmFpbGVyIGJ5dGVzIChJ Q1YpDQo+ID4gKyAgICAgICAgKiAtIFRLSVA6IDEyIHRyYWlsZXIgYnl0ZXMgKDggTUlDICsgNCBJ Q1YpDQo+ID4gKyAgICAgICAgKiAtIENDTVA6IDggdHJhaWxlciBieXRlcyAoTUlDKQ0KPiA+ICsg ICAgICAgICovDQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKGtfY29uZikgew0KPiA+ICsgICAgICAg ICAgICAgICBoZWFkX3BhZCA9IGtfY29uZi0+aXZfbGVuOw0KPiA+ICsNCj4gPiArICAgICAgICAg ICAgICAgc3dpdGNoIChrX2NvbmYtPmNpcGhlcikgew0KPiA+ICsgICAgICAgICAgICAgICBjYXNl IFdMQU5fQ0lQSEVSX1NVSVRFX1dFUDQwOg0KPiA+ICsgICAgICAgICAgICAgICBjYXNlIFdMQU5f Q0lQSEVSX1NVSVRFX1dFUDEwNDoNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBkYXRhX3Bh ZCA9IDQ7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICAg ICAgICAgIGNhc2UgV0xBTl9DSVBIRVJfU1VJVEVfVEtJUDoNCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICBkYXRhX3BhZCA9IDEyOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGJyZWFr Ow0KPiA+ICsgICAgICAgICAgICAgICBjYXNlIFdMQU5fQ0lQSEVSX1NVSVRFX0NDTVA6DQo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9wYWQgPSA4Ow0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICpjY21wID0gdHJ1ZTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBicmVh azsNCj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAg ICAgIG13bF90eF9hZGRfZG1hX2hlYWRlcihwcml2LCBza2IsIGhlYWRfcGFkLCBkYXRhX3BhZCk7 IH0NCj4gPiArDQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfaW5zZXJ0X2NjbXBfaGRy KHU4ICpwY2NtcF9oZHIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgdTgga2V5X2lkLCB1MTYgaXYxNiwgdTMyDQo+ID4gK2l2MzIpIHsNCj4gPiArICAgICAg IHN0cnVjdCBjY21wX2hkciAqY2NtcF9oID0gKHN0cnVjdCBjY21wX2hkciAqKXBjY21wX2hkcjsN Cj4gPiArDQo+ID4gKyAgICAgICBjY21wX2gtPml2MTYgPSBjcHVfdG9fbGUxNihpdjE2KTsNCj4g PiArICAgICAgIGNjbXBfaC0+cnN2ZCA9IDA7DQo+ID4gKyAgICAgICBjY21wX2gtPmtleV9pZCA9 IEVYVF9JViB8IChrZXlfaWQgPDwgNik7DQo+ID4gKyAgICAgICBjY21wX2gtPml2MzIgPSBjcHVf dG9fbGUzMihpdjMyKTsgfQ0KPiA+ICsNCj4gPiArc3RhdGljIGlubGluZSBpbnQgbXdsX3R4X3Rp ZF9xdWV1ZV9tYXBwaW5nKHU4IHRpZCkgew0KPiA+ICsgICAgICAgc3dpdGNoICh0aWQpIHsNCj4g PiArICAgICAgIGNhc2UgMDoNCj4gPiArICAgICAgIGNhc2UgMzoNCj4gPiArICAgICAgICAgICAg ICAgcmV0dXJuIElFRUU4MDIxMV9BQ19CRTsNCj4gPiArICAgICAgIGNhc2UgMToNCj4gPiArICAg ICAgIGNhc2UgMjoNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIElFRUU4MDIxMV9BQ19CSzsN Cj4gPiArICAgICAgIGNhc2UgNDoNCj4gPiArICAgICAgIGNhc2UgNToNCj4gPiArICAgICAgICAg ICAgICAgcmV0dXJuIElFRUU4MDIxMV9BQ19WSTsNCj4gPiArICAgICAgIGNhc2UgNjoNCj4gPiAr ICAgICAgIGNhc2UgNzoNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIElFRUU4MDIxMV9BQ19W TzsNCj4gPiArICAgICAgIGRlZmF1bHQ6DQo+ID4gKyAgICAgICAgICAgICAgIGJyZWFrOw0KPiA+ ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIHJldHVybiAtMTsNCj4gPiArfQ0KPiA+ICsN Cj4gPiArc3RhdGljIGlubGluZSB2b2lkIG13bF90eF9jb3VudF9wYWNrZXQoc3RydWN0IGllZWU4 MDIxMV9zdGEgKnN0YSwgdTgNCj4gPiArdGlkKSB7DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdsX3N0 YSAqc3RhX2luZm87DQo+ID4gKyAgICAgICBzdHJ1Y3QgbXdsX3R4X2luZm8gKnR4X3N0YXRzOw0K PiA+ICsNCj4gPiArICAgICAgIGlmIChXQVJOX09OKHRpZCA+PSBTWVNBRFBUX01BWF9USUQpKQ0K PiA+ICsgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKw0KPiA+ICsgICAgICAgc3RhX2luZm8g PSBtd2xfZGV2X2dldF9zdGEoc3RhKTsNCj4gPiArDQo+ID4gKyAgICAgICB0eF9zdGF0cyA9ICZz dGFfaW5mby0+dHhfc3RhdHNbdGlkXTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAodHhfc3RhdHMt PnN0YXJ0X3RpbWUgPT0gMCkNCj4gPiArICAgICAgICAgICAgICAgdHhfc3RhdHMtPnN0YXJ0X3Rp bWUgPSBqaWZmaWVzOw0KPiA+ICsNCj4gPiArICAgICAgIC8qIHJlc2V0IHRoZSBwYWNrZXQgY291 bnQgYWZ0ZXIgZWFjaCBzZWNvbmQgZWxhcHNlcy4gIElmIHRoZQ0KPiBudW1iZXIgb2YNCj4gPiAr ICAgICAgICAqIHBhY2tldHMgZXZlciBleGNlZWRzIHRoZSBhbXBkdV9taW5fdHJhZmZpYyB0aHJl c2hvbGQsIHdlIHdpbGwNCj4gYWxsb3cNCj4gPiArICAgICAgICAqIGFuIGFtcGR1IHN0cmVhbSB0 byBiZSBzdGFydGVkLg0KPiA+ICsgICAgICAgICovDQo+ID4gKyAgICAgICBpZiAoamlmZmllcyAt IHR4X3N0YXRzLT5zdGFydF90aW1lID4gSFopIHsNCj4gPiArICAgICAgICAgICAgICAgdHhfc3Rh dHMtPnBrdHMgPSAwOw0KPiA+ICsgICAgICAgICAgICAgICB0eF9zdGF0cy0+c3RhcnRfdGltZSA9 IDA7DQo+ID4gKyAgICAgICB9IGVsc2Ugew0KPiA+ICsgICAgICAgICAgICAgICB0eF9zdGF0cy0+ cGt0cysrOw0KPiA+ICsgICAgICAgfQ0KPiA+ICt9DQo+ID4gKw0KPiA+ICtzdGF0aWMgaW5saW5l IGJvb2wgbXdsX3R4X2F2YWlsYWJsZShzdHJ1Y3QgbXdsX3ByaXYgKnByaXYsIGludA0KPiA+ICtk ZXNjX251bSkgew0KPiA+ICsgICAgICAgc3RydWN0IG13bF90eF9obmRsICp0eF9obmRsOw0KPiA+ ICsNCj4gPiArICAgICAgIHR4X2huZGwgPSBwcml2LT5kZXNjX2RhdGFbZGVzY19udW1dLnBuZXh0 X3R4X2huZGw7DQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKCF0eF9obmRsLT5wZGVzYykNCj4gPiAr ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOw0KPiA+ICsNCj4gPiArICAgICAgIGlmICh0eF9o bmRsLT5wZGVzYy0+c3RhdHVzICE9IEVBR0xFX1RYRF9TVEFUVVNfSURMRSkgew0KPiA+ICsgICAg ICAgICAgICAgICAvKiBJbnRlcnJ1cHQgRi9XIGFueXdheSAqLw0KPiA+ICsgICAgICAgICAgICAg ICBpZiAodHhfaG5kbC0+cGRlc2MtPnN0YXR1cyAmDQo+ID4gKyAgICAgICAgICAgICAgICAgICBj cHVfdG9fbGUzMihFQUdMRV9UWERfU1RBVFVTX0ZXX09XTkVEKSkNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICB3cml0ZWwoTUFDUkVHX0gyQVJJQ19CSVRfUFBBX1JFQURZLA0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2LT5pb2Jhc2UxICsNCj4gPiArDQo+IE1BQ1JF R19SRUdfSDJBX0lOVEVSUlVQVF9FVkVOVFMpOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4g ZmFsc2U7DQo+ID4gKyAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgcmV0dXJuIHRydWU7DQo+ ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbmxpbmUgdm9pZCBtd2xfdHhfc2tiKHN0cnVjdCBt d2xfcHJpdiAqcHJpdiwgaW50IGRlc2NfbnVtLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBza19idWZmICp0eF9za2IpIHsNCj4gPiArICAgICAgIHN0cnVjdCBpZWVl ODAyMTFfdHhfaW5mbyAqdHhfaW5mbzsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfdHhfY3RybCAq dHhfY3RybDsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfdHhfaG5kbCAqdHhfaG5kbDsNCj4gPiAr ICAgICAgIHN0cnVjdCBtd2xfdHhfZGVzYyAqdHhfZGVzYzsNCj4gPiArICAgICAgIHN0cnVjdCBp ZWVlODAyMTFfc3RhICpzdGE7DQo+ID4gKyAgICAgICBzdHJ1Y3QgaWVlZTgwMjExX3ZpZiAqdmlm Ow0KPiA+ICsgICAgICAgc3RydWN0IG13bF92aWYgKm13bF92aWY7DQo+ID4gKyAgICAgICBzdHJ1 Y3QgaWVlZTgwMjExX2tleV9jb25mICprX2NvbmY7DQo+ID4gKyAgICAgICBib29sIGNjbXAgPSBm YWxzZTsNCj4gPiArICAgICAgIHN0cnVjdCBtd2xfZG1hX2RhdGEgKmRtYV9kYXRhOw0KPiA+ICsg ICAgICAgc3RydWN0IGllZWU4MDIxMV9oZHIgKndoOw0KPiA+ICsgICAgICAgZG1hX2FkZHJfdCBk bWE7DQo+ID4gKw0KPiA+ICsgICAgICAgaWYgKFdBUk5fT04oIXR4X3NrYikpDQo+ID4gKyAgICAg ICAgICAgICAgIHJldHVybjsNCj4gPiArDQo+ID4gKyAgICAgICB0eF9pbmZvID0gSUVFRTgwMjEx X1NLQl9DQih0eF9za2IpOw0KPiA+ICsgICAgICAgdHhfY3RybCA9IChzdHJ1Y3QgbXdsX3R4X2N0 cmwgKikmdHhfaW5mby0+c3RhdHVzOw0KPiA+ICsgICAgICAgc3RhID0gKHN0cnVjdCBpZWVlODAy MTFfc3RhICopdHhfY3RybC0+c3RhOw0KPiA+ICsgICAgICAgdmlmID0gKHN0cnVjdCBpZWVlODAy MTFfdmlmICopdHhfY3RybC0+dmlmOw0KPiA+ICsgICAgICAgbXdsX3ZpZiA9IG13bF9kZXZfZ2V0 X3ZpZih2aWYpOw0KPiA+ICsgICAgICAga19jb25mID0gKHN0cnVjdCBpZWVlODAyMTFfa2V5X2Nv bmYgKil0eF9jdHJsLT5rX2NvbmY7DQo+ID4gKw0KPiA+ICsgICAgICAgbXdsX3R4X2VuY2Fwc3Vs YXRlX2ZyYW1lKHByaXYsIHR4X3NrYiwga19jb25mLCAmY2NtcCk7DQo+ID4gKw0KPiA+ICsgICAg ICAgZG1hX2RhdGEgPSAoc3RydWN0IG13bF9kbWFfZGF0YSAqKXR4X3NrYi0+ZGF0YTsNCj4gPiAr ICAgICAgIHdoID0gJmRtYV9kYXRhLT53aDsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoaWVlZTgw MjExX2lzX2RhdGEod2gtPmZyYW1lX2NvbnRyb2wpKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGlm IChpc19tdWx0aWNhc3RfZXRoZXJfYWRkcih3aC0+YWRkcjEpKSB7DQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgaWYgKGNjbXApIHsNCj4gPiArDQo+IG13bF90eF9pbnNlcnRfY2NtcF9oZHIo ZG1hX2RhdGEtPmRhdGEsDQo+ID4gKw0KPiBtd2xfdmlmLT5rZXlpZHgsDQo+ID4gKw0KPiBtd2xf dmlmLT5pdjE2LA0KPiA+ICsNCj4gbXdsX3ZpZi0+aXYzMik7DQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBJTkNSRUFTRV9JVihtd2xfdmlmLT5pdjE2LA0KPiBtd2xfdmlmLT5p djMyKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAgICAgICAgICAgICAg IH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNjbXApIHsNCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWYtPnR5cGUgPT0NCj4gTkw4MDIx MV9JRlRZUEVfU1RBVElPTikgew0KPiA+ICsNCj4gbXdsX3R4X2luc2VydF9jY21wX2hkcihkbWFf ZGF0YS0+ZGF0YSwNCj4gPiArDQo+IG13bF92aWYtPmtleWlkeCwNCj4gPiArDQo+IG13bF92aWYt Pml2MTYsDQo+ID4gKw0KPiBtd2xfdmlmLT5pdjMyKTsNCj4gPiArDQo+IElOQ1JFQVNFX0lWKG13 bF92aWYtPml2MTYsDQo+ID4gKw0KPiBtd2xfdmlmLT5pdjMyKTsNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIHN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCj4gPiArDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YV9pbmZvID0NCj4gPiArIG13 bF9kZXZfZ2V0X3N0YShzdGEpOw0KPiA+ICsNCj4gPiArDQo+IG13bF90eF9pbnNlcnRfY2NtcF9o ZHIoZG1hX2RhdGEtPmRhdGEsDQo+ID4gKw0KPiAwLA0KPiA+ICsNCj4gc3RhX2luZm8tPml2MTYs DQo+ID4gKw0KPiBzdGFfaW5mby0+aXYzMik7DQo+ID4gKw0KPiBJTkNSRUFTRV9JVihzdGFfaW5m by0+aXYxNiwNCj4gPiArDQo+IHN0YV9pbmZvLT5pdjMyKTsNCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKyAg ICAgICAgICAgICAgIH0NCj4gPiArICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICB0eF9obmRs ID0gcHJpdi0+ZGVzY19kYXRhW2Rlc2NfbnVtXS5wbmV4dF90eF9obmRsOw0KPiA+ICsgICAgICAg dHhfaG5kbC0+cHNrX2J1ZmYgPSB0eF9za2I7DQo+ID4gKyAgICAgICB0eF9kZXNjID0gdHhfaG5k bC0+cGRlc2M7DQo+ID4gKyAgICAgICB0eF9kZXNjLT50eF9wcmlvcml0eSA9IHR4X2N0cmwtPnR4 X3ByaW9yaXR5Ow0KPiA+ICsgICAgICAgdHhfZGVzYy0+cW9zX2N0cmwgPSBjcHVfdG9fbGUxNih0 eF9jdHJsLT5xb3NfY3RybCk7DQo+ID4gKyAgICAgICB0eF9kZXNjLT5wa3RfbGVuID0gY3B1X3Rv X2xlMTYodHhfc2tiLT5sZW4pOw0KPiA+ICsgICAgICAgdHhfZGVzYy0+cGFja2V0X2luZm8gPSAw Ow0KPiA+ICsgICAgICAgdHhfZGVzYy0+ZGF0YV9yYXRlID0gMDsNCj4gPiArICAgICAgIHR4X2Rl c2MtPnR5cGUgPSB0eF9jdHJsLT50eXBlOw0KPiA+ICsgICAgICAgdHhfZGVzYy0+eG1pdF9jb250 cm9sID0gdHhfY3RybC0+eG1pdF9jb250cm9sOw0KPiA+ICsgICAgICAgdHhfZGVzYy0+c2FwX3Br dF9pbmZvID0gMDsNCj4gPiArICAgICAgIGRtYSA9IHBjaV9tYXBfc2luZ2xlKHByaXYtPnBkZXYs IHR4X3NrYi0+ZGF0YSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR4X3NrYi0+ bGVuLCBQQ0lfRE1BX1RPREVWSUNFKTsNCj4gPiArICAgICAgIGlmIChwY2lfZG1hX21hcHBpbmdf ZXJyb3IocHJpdi0+cGRldiwgZG1hKSkgew0KPiA+ICsgICAgICAgICAgICAgICBkZXZfa2ZyZWVf c2tiX2FueSh0eF9za2IpOw0KPiA+ICsgICAgICAgICAgICAgICB3aXBoeV9lcnIocHJpdi0+aHct PndpcGh5LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBtYXAgcGNp IG1lbW9yeSFcbiIpOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKyAgICAgICB9 DQo+ID4gKyAgICAgICB0eF9kZXNjLT5wa3RfcHRyID0gY3B1X3RvX2xlMzIoZG1hKTsNCj4gPiAr ICAgICAgIHR4X2Rlc2MtPnN0YXR1cyA9IGNwdV90b19sZTMyKEVBR0xFX1RYRF9TVEFUVVNfRldf T1dORUQpOw0KPiA+ICsgICAgICAgLyogbWFrZSBzdXJlIGFsbCB0aGUgbWVtb3J5IHRyYW5zYWN0 aW9ucyBkb25lIGJ5IGNwdSB3ZXJlDQo+IGNvbXBsZXRlZCAqLw0KPiA+ICsgICAgICAgd21iKCk7 ICAvKkRhdGEgTWVtb3J5IEJhcnJpZXIqLw0KPiA+ICsgICAgICAgd3JpdGVsKE1BQ1JFR19IMkFS SUNfQklUX1BQQV9SRUFEWSwNCj4gPiArICAgICAgICAgICAgICBwcml2LT5pb2Jhc2UxICsNCj4g TUFDUkVHX1JFR19IMkFfSU5URVJSVVBUX0VWRU5UUyk7DQo+ID4gKyAgICAgICBwcml2LT5kZXNj X2RhdGFbZGVzY19udW1dLnBuZXh0X3R4X2huZGwgPSB0eF9obmRsLT5wbmV4dDsNCj4gPiArICAg ICAgIHByaXYtPmZ3X2Rlc2NfY250W2Rlc2NfbnVtXSsrOyB9DQo+ID4gKw0KPiA+ICtzdGF0aWMg aW5saW5lIHN0cnVjdCBza19idWZmICptd2xfdHhfZG9fYW1zZHUoc3RydWN0IG13bF9wcml2ICpw cml2LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp bnQgZGVzY19udW0sDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHN0cnVjdCBza19idWZmDQo+ICp0eF9za2IsDQo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdA0KPiBpZWVlODAyMTFfdHhfaW5mbw0K PiA+ICsqdHhfaW5mbykgew0KPiA+ICsgICAgICAgc3RydWN0IGllZWU4MDIxMV9zdGEgKnN0YTsN Cj4gPiArICAgICAgIHN0cnVjdCBtd2xfc3RhICpzdGFfaW5mbzsNCj4gPiArICAgICAgIHN0cnVj dCBtd2xfdHhfY3RybCAqdHhfY3RybCA9IChzdHJ1Y3QgbXdsX3R4X2N0cmwNCj4gKikmdHhfaW5m by0+c3RhdHVzOw0KPiA+ICsgICAgICAgc3RydWN0IGllZWU4MDIxMV90eF9pbmZvICphbXNkdV9p bmZvOw0KPiA+ICsgICAgICAgc3RydWN0IHNrX2J1ZmZfaGVhZCAqYW1zZHVfcGt0czsNCj4gPiAr ICAgICAgIHN0cnVjdCBtd2xfYW1zZHVfZnJhZyAqYW1zZHU7DQo+ID4gKyAgICAgICBpbnQgYW1z ZHVfYWxsb3dfc2l6ZTsNCj4gPiArICAgICAgIHN0cnVjdCBpZWVlODAyMTFfaGRyICp3aDsNCj4g PiArICAgICAgIGludCB3aF9sZW47DQo+ID4gKyAgICAgICB1MTYgbGVuOw0KPiA+ICsgICAgICAg dTggKmRhdGE7DQo+ID4gKw0KPiA+ICsgICAgICAgc3RhID0gKHN0cnVjdCBpZWVlODAyMTFfc3Rh ICopdHhfY3RybC0+c3RhOw0KPiA+ICsgICAgICAgc3RhX2luZm8gPSBtd2xfZGV2X2dldF9zdGEo c3RhKTsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoIXN0YV9pbmZvLT5pc19hbXNkdV9hbGxvd2Vk KQ0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gdHhfc2tiOw0KPiA+ICsNCj4gPiArICAgICAg IHdoID0gKHN0cnVjdCBpZWVlODAyMTFfaGRyICopdHhfc2tiLT5kYXRhOw0KPiA+ICsgICAgICAg aWYgKHN0YV9pbmZvLT5pc19tZXNoX25vZGUgJiYNCj4gaXNfbXVsdGljYXN0X2V0aGVyX2FkZHIo d2gtPmFkZHIzKSkNCj4gPiArICAgICAgICAgICAgICAgcmV0dXJuIHR4X3NrYjsNCj4gPiArDQo+ ID4gKyAgICAgICBpZiAoc3RhX2luZm8tPmFtc2R1X2N0cmwuY2FwID09IE1XTF9BTVNEVV9TSVpF XzRLKQ0KPiA+ICsgICAgICAgICAgICAgICBhbXNkdV9hbGxvd19zaXplID0gU1lTQURQVF9BTVNE VV80S19NQVhfU0laRTsNCj4gPiArICAgICAgIGVsc2UgaWYgKHN0YV9pbmZvLT5hbXNkdV9jdHJs LmNhcCA9PSBNV0xfQU1TRFVfU0laRV84SykNCj4gPiArICAgICAgICAgICAgICAgYW1zZHVfYWxs b3dfc2l6ZSA9IFNZU0FEUFRfQU1TRFVfOEtfTUFYX1NJWkU7DQo+ID4gKyAgICAgICBlbHNlDQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybiB0eF9za2I7DQo+ID4gKw0KPiA+ICsgICAgICAgc3Bp bl9sb2NrX2JoKCZzdGFfaW5mby0+YW1zZHVfbG9jayk7DQo+ID4gKyAgICAgICBhbXNkdSA9ICZz dGFfaW5mby0+YW1zZHVfY3RybC5mcmFnW2Rlc2NfbnVtXTsNCj4gPiArDQo+ID4gKyAgICAgICBp ZiAodHhfc2tiLT5sZW4gPiBTWVNBRFBUX0FNU0RVX0FMTE9XX1NJWkUpIHsNCj4gPiArICAgICAg ICAgICAgICAgaWYgKGFtc2R1LT5udW0pIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBt d2xfdHhfc2tiKHByaXYsIGRlc2NfbnVtLCBhbXNkdS0+c2tiKTsNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICBhbXNkdS0+bnVtID0gMDsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBh bXNkdS0+Y3VyX3BvcyA9IE5VTEw7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg IGlmICghbXdsX3R4X2F2YWlsYWJsZShwcml2LCBkZXNjX251bSkpIHsNCj4gPiArDQo+IHNrYl9x dWV1ZV9oZWFkKCZwcml2LT50eHFbZGVzY19udW1dLCB0eF9za2IpOw0KPiA+ICsNCj4gc3Bpbl91 bmxvY2tfYmgoJnN0YV9pbmZvLT5hbXNkdV9sb2NrKTsNCj4gPiArICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIHJldHVybiBOVUxMOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIH0N Cj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICBzcGluX3VubG9ja19i aCgmc3RhX2luZm8tPmFtc2R1X2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gdHhf c2tiOw0KPiA+ICsgICAgICAgfQ0KPiA+ICsNCj4gPiArICAgICAgIC8qIHBvdGVudGlhbCBhbXNk dSBzaXplLCBzaG91bGQgYWRkIGFtc2R1IGhlYWRlciAxNCBieXRlcyArDQo+ID4gKyAgICAgICAg KiBtYXhpbXVtIHBhZGRpbmcgMy4NCj4gPiArICAgICAgICAqLw0KPiA+ICsgICAgICAgd2hfbGVu ID0gaWVlZTgwMjExX2hkcmxlbih3aC0+ZnJhbWVfY29udHJvbCk7DQo+ID4gKyAgICAgICBsZW4g PSB0eF9za2ItPmxlbiAtIHdoX2xlbiArIDE3Ow0KPiA+ICsNCj4gPiArICAgICAgIGlmIChhbXNk dS0+bnVtKSB7DQo+ID4gKyAgICAgICAgICAgICAgIGlmICgoYW1zZHUtPnNrYi0+bGVuICsgbGVu KSA+IGFtc2R1X2FsbG93X3NpemUpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBtd2xf dHhfc2tiKHByaXYsIGRlc2NfbnVtLCBhbXNkdS0+c2tiKTsNCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICBhbXNkdS0+bnVtID0gMDsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBhbXNk dS0+Y3VyX3BvcyA9IE5VTEw7DQo+ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgIH0N Cj4gPiArDQo+ID4gKyAgICAgICBhbXNkdS0+amlmZmllcyA9IGppZmZpZXM7DQo+ID4gKyAgICAg ICBsZW4gPSB0eF9za2ItPmxlbiAtIHdoX2xlbjsNCj4gPiArDQo+ID4gKyAgICAgICBpZiAoYW1z ZHUtPm51bSA9PSAwKSB7DQo+ID4gKyAgICAgICAgICAgICAgIHN0cnVjdCBza19idWZmICpuZXdz a2I7DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAgICBhbXNkdV9wa3RzID0gKHN0cnVjdCBza19i dWZmX2hlYWQgKikNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBrbWFsbG9jKHNpemVvZigq YW1zZHVfcGt0cyksIEdGUF9LRVJORUwpOw0KPiA+ICsgICAgICAgICAgICAgICBpZiAoIWFtc2R1 X3BrdHMpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmc3Rh X2luZm8tPmFtc2R1X2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0 eF9za2I7DQo+ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiArICAgICAgICAgICAgICAgbmV3c2ti ID0gZGV2X2FsbG9jX3NrYihhbXNkdV9hbGxvd19zaXplICsNCj4gPiArDQo+IFNZU0FEUFRfTUlO X0JZVEVTX0hFQURST09NKTsNCj4gPiArICAgICAgICAgICAgICAgaWYgKCFuZXdza2IpIHsNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICBzcGluX3VubG9ja19iaCgmc3RhX2luZm8tPmFtc2R1 X2xvY2spOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGtmcmVlKGFtc2R1X3BrdHMpOw0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eF9za2I7DQo+ID4gKyAgICAgICAg ICAgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgICAgICAgICAgIGRhdGEgPSBuZXdza2ItPmRhdGE7 DQo+ID4gKyAgICAgICAgICAgICAgIG1lbWNweShkYXRhLCB0eF9za2ItPmRhdGEsIHdoX2xlbik7 DQo+ID4gKyAgICAgICAgICAgICAgIGlmIChzdGFfaW5mby0+aXNfbWVzaF9ub2RlKSB7DQo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJfYWRkcl9jb3B5KGRhdGEgKyB3aF9sZW4sIHdo LT5hZGRyMyk7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgZXRoZXJfYWRkcl9jb3B5KGRh dGEgKyB3aF9sZW4gKyBFVEhfQUxFTiwNCj4gd2gtPmFkZHI0KTsNCj4gPiArICAgICAgICAgICAg ICAgfSBlbHNlIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBldGhlcl9hZGRyX2NvcHko ZGF0YSArIHdoX2xlbiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWVlZTgwMjExX2dldF9EQSh3aCkpOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGV0 aGVyX2FkZHJfY29weShkYXRhICsgd2hfbGVuICsgRVRIX0FMRU4sDQo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllZWU4MDIxMV9nZXRfU0Eod2gpKTsNCj4gPiAr ICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAgICAgICAgICAqKHU4ICopKGRhdGEgKyB3aF9s ZW4gKyBFVEhfSExFTiAtIDEpID0gbGVuICYgMHhmZjsNCj4gPiArICAgICAgICAgICAgICAgKih1 OCAqKShkYXRhICsgd2hfbGVuICsgRVRIX0hMRU4gLSAyKSA9IChsZW4gPj4gOCkgJg0KPiA+ICsg MHhmZjsNCj4gDQo+IFRoZXNlIGJpdCBvZXByYXRpb25zIGFyZSBub3QgbmVlZGVkLiBUaGUgcG9p bnRlciBtdXN0IGJlIFdPUkQgYWxpZ25lZCwNCj4gcmlnaHQ/DQo+IFRoaXMgaXMgd2h5IHlvdSBo YXZlIHBhZGRpbmcgYWZ0ZXIgYWxsLCB1bmxlc3MgeW91IGhhdmUgc29tZSB3ZWlyZCBETUENCj4g Z2FtZXM/DQo+IFlvdSBzZWVtIHRvIGJlIGFzc3VtaW5nIHRoaXMgYWxpZ25tZW50IGFueXdheSBi ZWNhdXNlIHlvdSB1c2UNCj4gZXRoZXJfYWRkcl9jb3B5IGFib3ZlLg0KPiANCj4gPiArDQo+ID4g KyAgICAgICAvKiBRdWV1ZSBBRERCQSByZXF1ZXN0IGluIHRoZSByZXNwZWN0aXZlIGRhdGEgcXVl dWUuICBXaGlsZQ0KPiBzZXR0aW5nIHVwDQo+ID4gKyAgICAgICAgKiB0aGUgYW1wZHUgc3RyZWFt LCBtYWM4MDIxMSBxdWV1ZXMgZnVydGhlciBwYWNrZXRzIGZvciB0aGF0DQo+ID4gKyAgICAgICAg KiBwYXJ0aWN1bGFyIHJhL3RpZCBwYWlyLiAgSG93ZXZlciwgcGFja2V0cyBwaWxlZCB1cCBpbiB0 aGUNCj4gaGFyZHdhcmUNCj4gPiArICAgICAgICAqIGZvciB0aGF0IHJhL3RpZCBwYWlyIHdpbGwg c3RpbGwgZ28gb3V0LiBBRERCQSByZXF1ZXN0IGFuZCB0aGUNCj4gPiArICAgICAgICAqIHJlbGF0 ZWQgZGF0YSBwYWNrZXRzIGdvaW5nIG91dCBmcm9tIGRpZmZlcmVudCBxdWV1ZXMNCj4gYXN5bmNo cm9ub3VzbHkNCj4gPiArICAgICAgICAqIHdpbGwgY2F1c2UgYSBzaGlmdCBpbiB0aGUgcmVjZWl2 ZXIgd2luZG93IHdoaWNoIG1pZ2h0IHJlc3VsdCBpbg0KPiA+ICsgICAgICAgICogYW1wZHUgcGFj a2V0cyBnZXR0aW5nIGRyb3BwZWQgYXQgdGhlIHJlY2VpdmVyIGFmdGVyIHRoZSBzdHJlYW0NCj4g aGFzDQo+ID4gKyAgICAgICAgKiBiZWVuIHNldHVwLg0KPiA+ICsgICAgICAgICovDQo+IA0KPiBI ZXJlIGlzIHRoZSByYWNlIHlvdSBhcmUgZmFjaW5nIGFuZCB0aGF0IHJhY2UgY2FuIGJlIGF2b2lk ZWQgYnkgdGhlIHByb3Blcg0KPiB1c2FnZSBvZiB0aGUgX2NiDQo+IA0KPiA+ICsgICAgICAgaWYg KG1nbXRmcmFtZSkgew0KPiA+ICsgICAgICAgICAgICAgICB1MTYgY2FwYWI7DQo+ID4gKw0KPiA+ ICsgICAgICAgICAgICAgICBpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJh bWVfY29udHJvbCkgJiYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nbXQtPnUu YWN0aW9uLmNhdGVnb3J5ID09DQo+IFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KPiA+ICsNCj4gbWdt dC0+dS5hY3Rpb24udS5hZGRiYV9yZXEuYWN0aW9uX2NvZGUgPT0NCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFdMQU5fQUNUSU9OX0FEREJBX1JFUSkpIHsNCj4gPiArICAgICAgICAg ICAgICAgICAgICAgICBjYXBhYiA9DQo+IGxlMTZfdG9fY3B1KG1nbXQtPnUuYWN0aW9uLnUuYWRk YmFfcmVxLmNhcGFiKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0aWQgPSAoY2FwYWIg Jg0KPiBJRUVFODAyMTFfQUREQkFfUEFSQU1fVElEX01BU0spID4+IDI7DQo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgaW5kZXggPSBtd2xfdHhfdGlkX3F1ZXVlX21hcHBpbmcodGlkKTsNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICBjYXBhYiB8PSAxOw0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgIG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVxLmNhcGFiID0NCj4gY3B1X3RvX2xl MTYoY2FwYWIpOw0KPiA+ICsgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAg ICAgICBpZiAodW5saWtlbHkoaWVlZTgwMjExX2lzX2FjdGlvbih3aC0+ZnJhbWVfY29udHJvbCkg JiYNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1nbXQtPnUuYWN0aW9uLmNhdGVn b3J5ID09DQo+IFdMQU5fQ0FURUdPUllfQkFDSyAmJg0KPiA+ICsNCj4gbWdtdC0+dS5hY3Rpb24u dS5hZGRiYV9yZXNwLmFjdGlvbl9jb2RlID09DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBXTEFOX0FDVElPTl9BRERCQV9SRVNQKSkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIGNhcGFiID0NCj4gbGUxNl90b19jcHUobWdtdC0+dS5hY3Rpb24udS5hZGRiYV9yZXNwLmNh cGFiKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBjYXBhYiB8PSAxOw0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgIG1nbXQtPnUuYWN0aW9uLnUuYWRkYmFfcmVzcC5jYXBhYiA9DQo+ IGNwdV90b19sZTE2KGNhcGFiKTsNCj4gPiArICAgICAgICAgICAgICAgfQ0KPiA+ICsgICAgICAg fQ0KPiA+ICsNCj4gPiArICAgICAgIGluZGV4ID0gU1lTQURQVF9UWF9XTU1fUVVFVUVTIC0gaW5k ZXggLSAxOw0KPiA+ICsgICAgICAgdHhwcmlvcml0eSA9IGluZGV4Ow0KPiA+ICsNCj4gPiArICAg ICAgIGlmIChzdGEgJiYgc3RhLT5odF9jYXAuaHRfc3VwcG9ydGVkICYmICFlYXBvbF9mcmFtZSAm Jg0KPiA+ICsgICAgICAgICAgIGllZWU4MDIxMV9pc19kYXRhX3Fvcyh3aC0+ZnJhbWVfY29udHJv bCkpIHsNCj4gPiArICAgICAgICAgICAgICAgdGlkID0gcW9zICYgMHhmOw0KPiA+ICsgICAgICAg ICAgICAgICBtd2xfdHhfY291bnRfcGFja2V0KHN0YSwgdGlkKTsNCj4gPiArDQo+ID4gKyAgICAg ICAgICAgICAgIHNwaW5fbG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KPiA+ICsgICAgICAg ICAgICAgICBzdHJlYW0gPSBtd2xfZndjbWRfbG9va3VwX3N0cmVhbShodywgc3RhLT5hZGRyLCB0 aWQpOw0KPiA+ICsNCj4gPiArICAgICAgICAgICAgICAgaWYgKHN0cmVhbSkgew0KPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0tPnN0YXRlID09IEFNUERVX1NUUkVBTV9BQ1RJ VkUpDQo+IHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXQVJOX09O KCEocW9zICYNCj4gPiArDQo+IE1XTF9RT1NfQUNLX1BPTElDWV9CTE9DS0FDSykpKSB7DQo+ID4g Kw0KPiBzcGluX3VubG9ja19iaCgmcHJpdi0+c3RyZWFtX2xvY2spOw0KPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShza2IpOw0KPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47DQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgdHhwcmlvcml0eSA9DQo+ID4gKw0KPiAoU1lTQURQVF9UWF9XTU1f UVVFVUVTICsgc3RyZWFtLT5pZHgpICUNCj4gPiArDQo+IFNZU0FEUFRfVE9UQUxfSFdfUVVFVUVT Ow0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLT5zdGF0ZSA9 PQ0KPiBBTVBEVV9TVFJFQU1fTkVXKSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAvKiBXZSBnZXQgaGVyZSBpZiB0aGUgZHJpdmVyIHNlbmRzIHVzDQo+IHBhY2tldHMNCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFmdGVyIHdlJ3ZlIGluaXRpYXRl ZCBhIHN0cmVhbSwgYnV0DQo+IGJlZm9yZQ0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICogb3VyIGFtcGR1X2FjdGlvbiByb3V0aW5lIGhhcw0KPiBiZWVuIGNhbGxlZA0KPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogd2l0aA0KPiBJRUVFODAyMTFfQU1Q RFVfVFhfU1RBUlQgdG8gZ2V0IHRoZSBTU04NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqIGZvciB0aGUgQUREQkEgcmVxdWVzdC4gIFNvIHRoaXMNCj4gcGFja2V0IGNhbg0K PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZ28gb3V0IHdpdGggbm8gcmlz ayBvZiBzZXF1ZW5jZQ0KPiBudW1iZXINCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAqIG1pc21hdGNoLiAgTm8gc3BlY2lhbCBoYW5kbGluZyBpcw0KPiByZXF1aXJlZC4NCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgIH0gZWxzZSB7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAv KiBEcm9wIHBhY2tldHMgdGhhdCB3b3VsZCBnbyBvdXQNCj4gYWZ0ZXIgdGhlDQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBBRERCQSByZXF1ZXN0IHdhcyBzZW50IGJ1dA0K PiBiZWZvcmUgdGhlIEFEREJBDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KiByZXNwb25zZSBpcyByZWNlaXZlZC4gIElmIHdlIGRvbid0DQo+IGRvIHRoaXMsDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgcmVjaXBpZW50IHdvdWxkIHByb2Jh Ymx5DQo+IHJlY2VpdmUgaXQNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq IGFmdGVyIHRoZSBBRERCQSByZXF1ZXN0IHdpdGggU1NODQo+IDAuICBUaGlzDQo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3aWxsIGNhdXNlIHRoZSByZWNpcGllbnQncyBC QQ0KPiByZWNlaXZlIHdpbmRvdw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICogdG8gc2hpZnQsIHdoaWNoIHdvdWxkIGNhdXNlIHRoZQ0KPiBzdWJzZXF1ZW50DQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwYWNrZXRzIGluIHRoZSBCQSBzdHJlYW0g dG8gYmUNCj4gZGlzY2FyZGVkLg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICogbWFjODAyMTEgcXVldWVzIG91ciBwYWNrZXRzIGZvcg0KPiB1cyBpbiB0aGlzDQo+ID4gKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBjYXNlLCBzbyB0aGlzIGlzIHJlYWxseSBq dXN0IGEgc2FmZXR5DQo+IGNoZWNrLg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICovDQo+IA0KPiBXZWxsLi4uIEkgdGhpbmsgeW91IGNhbiByZWFsbHkgYXZvaWQgdGhhdC4N Cg0KQU1QRFUgcmVsYXRlZCBjb2RlIHdpbGwgYmUgY2hlY2tlZCBiYXNlZCBvbiB5b3VyIHN1Z2dl c3Rpb25zIGxhdGVyLg0K ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin ` (5 preceding siblings ...) 2015-12-15 7:40 ` Emmanuel Grumbach @ 2016-03-16 23:24 ` Julian Calaby 2016-03-17 1:23 ` David Lin 6 siblings, 1 reply; 26+ messages in thread From: Julian Calaby @ 2016-03-16 23:24 UTC (permalink / raw) To: David Lin Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh Hi David, On Thu, Nov 12, 2015 at 2:51 PM, David Lin <dlin@marvell.com> wrote: > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897 > chipsets. > This driver was developed as part of the openwrt.org project to support > Linksys WRT1900AC and is maintained on https://github.com/kaloz/mwlwifi. > > The mwlwifi driver differs from existing mwifiex driver: > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem > to provide full AP/Wireless Bridge functionality (routers). > o mwifiex is a "fullmac driver" which provides a comprehensive set of > client functions (laptops/embedded devices) > o only mwlwifi supports Marvell AP chip 886X series > > NOTE: Users with Marvell 88W8897 chipsets currently should enable > (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT BOTH. > > mwlwifi driver leveraged code from existing MWL8K driver in the > following areas: > - 802.11n setting for mac80211 > - Functions needed to hook up to mac80211 > - Interactions with mac80211 to establish BA streams > - Partial firmware APIs, some data fields > - Method to pass Rx packets to mac80211 except 11ac rates > > In addition, mwlwifi driver supports: > - future scalability and future development (refactored source code) > - Marvell 802.11ac chipsets, including combo BT devices > - 802.11ac related settings and functions > - concurrent AP+STA functionalities with single firmware per chip > - firmware APIs for the supported chipset > - communicating new mac80211 settings to firmware > - Different TX/RX datapath where applicable > - A-MSDU and A-MPDU > - mac80211-based MESH (work in progress) > - Refined the code to establish BA streams > > NOTE: MWLWIFI will be organized under new vendor specific folder/marvell, > as per request of the gate keeper and community. > > Signed-off-by: David Lin <dlin@marvell.com> It's been quite a while since this was reviewed. Do you have a new version of the driver? Thanks, -- Julian Calaby Email: julian.calaby@gmail.com Profile: http://www.google.com/profiles/julian.calaby/ ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2016-03-16 23:24 ` Julian Calaby @ 2016-03-17 1:23 ` David Lin 2016-03-17 1:32 ` Julian Calaby 0 siblings, 1 reply; 26+ messages in thread From: David Lin @ 2016-03-17 1:23 UTC (permalink / raw) To: Julian Calaby Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh PiBGcm9tOiBKdWxpYW4gQ2FsYWJ5IFttYWlsdG86anVsaWFuLmNhbGFieUBnbWFpbC5jb21dIFRo dXJzZGF5LCBNYXJjaCAxNywgMjAxNiA3OjI0IEFNDQo+IA0KPiBIaSBEYXZpZCwNCj4gDQo+IE9u IFRodSwgTm92IDEyLCAyMDE1IGF0IDI6NTEgUE0sIERhdmlkIExpbiA8ZGxpbkBtYXJ2ZWxsLmNv bT4gd3JvdGU6DQo+ID4gVGhpcyBwYXRjaCBwcm92aWRlcyB0aGUgbXdsd2lmaSBkcml2ZXIgZm9y IE1hcnZlbGwgODg2MywgODg2NCBhbmQgODg5Nw0KPiA+IGNoaXBzZXRzLg0KPiA+IFRoaXMgZHJp dmVyIHdhcyBkZXZlbG9wZWQgYXMgcGFydCBvZiB0aGUgb3BlbndydC5vcmcgcHJvamVjdCB0bw0K PiA+IHN1cHBvcnQgTGlua3N5cyBXUlQxOTAwQUMgYW5kIGlzIG1haW50YWluZWQgb24NCj4gaHR0 cHM6Ly9naXRodWIuY29tL2thbG96L213bHdpZmkuDQo+ID4NCj4gPiBUaGUgbXdsd2lmaSBkcml2 ZXIgZGlmZmVycyBmcm9tIGV4aXN0aW5nIG13aWZpZXggZHJpdmVyOg0KPiA+IG8gbXdsd2lmaSBp cyBhICJzb2Z0bWFjIGRyaXZlciIgdXNpbmcgdGhlIGtlcm5lbD/uqIMgbWFjODAyLjExIHN1YnN5 c3RlbQ0KPiA+IHRvIHByb3ZpZGUgZnVsbCBBUC9XaXJlbGVzcyBCcmlkZ2UgZnVuY3Rpb25hbGl0 eSAocm91dGVycykuDQo+ID4gbyBtd2lmaWV4IGlzIGEgImZ1bGxtYWMgZHJpdmVyIiB3aGljaCBw cm92aWRlcyBhIGNvbXByZWhlbnNpdmUgc2V0IG9mDQo+ID4gY2xpZW50IGZ1bmN0aW9ucyAobGFw dG9wcy9lbWJlZGRlZCBkZXZpY2VzKSBvIG9ubHkgbXdsd2lmaSBzdXBwb3J0cw0KPiA+IE1hcnZl bGwgQVAgY2hpcCA4ODZYIHNlcmllcw0KPiA+DQo+ID4gTk9URTogVXNlcnMgd2l0aCBNYXJ2ZWxs IDg4Vzg4OTcgY2hpcHNldHMgY3VycmVudGx5IHNob3VsZCBlbmFibGUNCj4gPiAoQ09ORklHPVkg b3IgTSkgZWl0aGVyIENPTkZJR19NV0lGSUVYIG9yIENPTkZJR19NV0xXSUZJLCBOT1QNCj4gQk9U SC4NCj4gPg0KPiA+IG13bHdpZmkgZHJpdmVyIGxldmVyYWdlZCBjb2RlIGZyb20gZXhpc3Rpbmcg TVdMOEsgZHJpdmVyIGluIHRoZQ0KPiA+IGZvbGxvd2luZyBhcmVhczoNCj4gPiAtIDgwMi4xMW4g c2V0dGluZyBmb3IgbWFjODAyMTENCj4gPiAtIEZ1bmN0aW9ucyBuZWVkZWQgdG8gaG9vayB1cCB0 byBtYWM4MDIxMQ0KPiA+IC0gSW50ZXJhY3Rpb25zIHdpdGggbWFjODAyMTEgdG8gZXN0YWJsaXNo IEJBIHN0cmVhbXMNCj4gPiAtIFBhcnRpYWwgZmlybXdhcmUgQVBJcywgc29tZSBkYXRhIGZpZWxk cw0KPiA+IC0gTWV0aG9kIHRvIHBhc3MgUnggcGFja2V0cyB0byBtYWM4MDIxMSBleGNlcHQgMTFh YyByYXRlcw0KPiA+DQo+ID4gSW4gYWRkaXRpb24sIG13bHdpZmkgZHJpdmVyIHN1cHBvcnRzOg0K PiA+IC0gZnV0dXJlIHNjYWxhYmlsaXR5IGFuZCBmdXR1cmUgZGV2ZWxvcG1lbnQgKHJlZmFjdG9y ZWQgc291cmNlIGNvZGUpDQo+ID4gLSBNYXJ2ZWxsIDgwMi4xMWFjIGNoaXBzZXRzLCBpbmNsdWRp bmcgY29tYm8gQlQgZGV2aWNlcw0KPiA+IC0gODAyLjExYWMgcmVsYXRlZCBzZXR0aW5ncyBhbmQg ZnVuY3Rpb25zDQo+ID4gLSBjb25jdXJyZW50IEFQK1NUQSBmdW5jdGlvbmFsaXRpZXMgd2l0aCBz aW5nbGUgZmlybXdhcmUgcGVyIGNoaXANCj4gPiAtIGZpcm13YXJlIEFQSXMgZm9yIHRoZSBzdXBw b3J0ZWQgY2hpcHNldA0KPiA+IC0gY29tbXVuaWNhdGluZyBuZXcgbWFjODAyMTEgc2V0dGluZ3Mg dG8gZmlybXdhcmUNCj4gPiAtIERpZmZlcmVudCBUWC9SWCBkYXRhcGF0aCB3aGVyZSBhcHBsaWNh YmxlDQo+ID4gLSBBLU1TRFUgYW5kIEEtTVBEVQ0KPiA+IC0gbWFjODAyMTEtYmFzZWQgTUVTSCAo d29yayBpbiBwcm9ncmVzcykNCj4gPiAtIFJlZmluZWQgdGhlIGNvZGUgdG8gZXN0YWJsaXNoIEJB IHN0cmVhbXMNCj4gPg0KPiA+IE5PVEU6IE1XTFdJRkkgd2lsbCBiZSBvcmdhbml6ZWQgdW5kZXIg bmV3IHZlbmRvciBzcGVjaWZpYw0KPiA+IGZvbGRlci9tYXJ2ZWxsLCBhcyBwZXIgcmVxdWVzdCBv ZiB0aGUgZ2F0ZSBrZWVwZXIgYW5kIGNvbW11bml0eS4NCj4gPg0KPiA+IFNpZ25lZC1vZmYtYnk6 IERhdmlkIExpbiA8ZGxpbkBtYXJ2ZWxsLmNvbT4NCj4gDQo+IEl0J3MgYmVlbiBxdWl0ZSBhIHdo aWxlIHNpbmNlIHRoaXMgd2FzIHJldmlld2VkLiBEbyB5b3UgaGF2ZSBhIG5ldyB2ZXJzaW9uIG9m DQo+IHRoZSBkcml2ZXI/DQo+IA0KDQpZZXMgd2UgaGF2ZSBzb21lIHVwZGF0ZXMsIGFuZCBjb250 aW51ZSB3b3JraW5nIG9uIGl0LiBCdXQgd2UgZmVsdCB0aGF0IGNvbW11bml0eSBkb2VzIG5vdCBz ZWVtIHRvIGJlIHZlcnkgaW50ZXJlc3RlZCBpbiB0aGlzIGRyaXZlciwgc28gd2UgaGF2ZSBub3Qg YmVlbiB1cGRhdGluZyB0aGUgd2lyZWxlc3Mgb3JnLiBMZXQgdXMga25vdyBpZiB5b3UgYXJlIHN1 cHBvcnRpdmUgYW5kIHdhaXRpbmcgZm9yIGl0Lg0KDQpUaGFua3MsDQpEYXZpZA0KDQo+DQo+IFRo YW5rcywNCj4NCj4gLS0NCj4gSnVsaWFuIENhbGFieQ0KPiANCj4gRW1haWw6IGp1bGlhbi5jYWxh YnlAZ21haWwuY29tDQo+IFByb2ZpbGU6IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS9wcm9maWxlcy9q dWxpYW4uY2FsYWJ5Lw0K ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2016-03-17 1:23 ` David Lin @ 2016-03-17 1:32 ` Julian Calaby 2016-03-17 2:10 ` David Lin 0 siblings, 1 reply; 26+ messages in thread From: Julian Calaby @ 2016-03-17 1:32 UTC (permalink / raw) To: David Lin Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh Hi David, On Thu, Mar 17, 2016 at 12:23 PM, David Lin <dlin@marvell.com> wrote: >> From: Julian Calaby [mailto:julian.calaby@gmail.com] Thursday, March 17, 2016 7:24 AM >> >> Hi David, >> >> On Thu, Nov 12, 2015 at 2:51 PM, David Lin <dlin@marvell.com> wrote: >> > This patch provides the mwlwifi driver for Marvell 8863, 8864 and 8897 >> > chipsets. >> > This driver was developed as part of the openwrt.org project to >> > support Linksys WRT1900AC and is maintained on >> https://github.com/kaloz/mwlwifi. >> > >> > The mwlwifi driver differs from existing mwifiex driver: >> > o mwlwifi is a "softmac driver" using the kernel? mac802.11 subsystem >> > to provide full AP/Wireless Bridge functionality (routers). >> > o mwifiex is a "fullmac driver" which provides a comprehensive set of >> > client functions (laptops/embedded devices) o only mwlwifi supports >> > Marvell AP chip 886X series >> > >> > NOTE: Users with Marvell 88W8897 chipsets currently should enable >> > (CONFIG=Y or M) either CONFIG_MWIFIEX or CONFIG_MWLWIFI, NOT >> BOTH. >> > >> > mwlwifi driver leveraged code from existing MWL8K driver in the >> > following areas: >> > - 802.11n setting for mac80211 >> > - Functions needed to hook up to mac80211 >> > - Interactions with mac80211 to establish BA streams >> > - Partial firmware APIs, some data fields >> > - Method to pass Rx packets to mac80211 except 11ac rates >> > >> > In addition, mwlwifi driver supports: >> > - future scalability and future development (refactored source code) >> > - Marvell 802.11ac chipsets, including combo BT devices >> > - 802.11ac related settings and functions >> > - concurrent AP+STA functionalities with single firmware per chip >> > - firmware APIs for the supported chipset >> > - communicating new mac80211 settings to firmware >> > - Different TX/RX datapath where applicable >> > - A-MSDU and A-MPDU >> > - mac80211-based MESH (work in progress) >> > - Refined the code to establish BA streams >> > >> > NOTE: MWLWIFI will be organized under new vendor specific >> > folder/marvell, as per request of the gate keeper and community. >> > >> > Signed-off-by: David Lin <dlin@marvell.com> >> >> It's been quite a while since this was reviewed. Do you have a new version of >> the driver? >> > > Yes we have some updates, and continue working on it. But we felt that community does not seem to be very interested in this driver, so we have not been updating the wireless org. Let us know if you are supportive and waiting for it. My understanding was that we'd very much like the driver to be sent upstream. From my perspective, it looked like you'd lost interest, not us. Thanks, -- Julian Calaby Email: julian.calaby@gmail.com Profile: http://www.google.com/profiles/julian.calaby/ ^ permalink raw reply [flat|nested] 26+ messages in thread
* RE: [PATCH v7] Add new mac80211 driver mwlwifi. 2016-03-17 1:32 ` Julian Calaby @ 2016-03-17 2:10 ` David Lin 2016-04-03 12:05 ` Bjørn Mork 0 siblings, 1 reply; 26+ messages in thread From: David Lin @ 2016-03-17 2:10 UTC (permalink / raw) To: Julian Calaby Cc: Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh PiBGcm9tOiBKdWxpYW4gQ2FsYWJ5IFttYWlsdG86anVsaWFuLmNhbGFieUBnbWFpbC5jb21dIFRo dXJzZGF5LCBNYXJjaCAxNywgMjAxNiA5OjMyIEFNPiANCj4gSGkgRGF2aWQsDQo+IA0KPiBPbiBU aHUsIE1hciAxNywgMjAxNiBhdCAxMjoyMyBQTSwgRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29t PiB3cm90ZToNCj4gPj4gRnJvbTogSnVsaWFuIENhbGFieSBbbWFpbHRvOmp1bGlhbi5jYWxhYnlA Z21haWwuY29tXSBUaHVyc2RheSwgTWFyY2gNCj4gPj4gMTcsIDIwMTYgNzoyNCBBTQ0KPiA+Pg0K PiA+PiBIaSBEYXZpZCwNCj4gPj4NCj4gPj4gT24gVGh1LCBOb3YgMTIsIDIwMTUgYXQgMjo1MSBQ TSwgRGF2aWQgTGluIDxkbGluQG1hcnZlbGwuY29tPiB3cm90ZToNCj4gPj4gPiBUaGlzIHBhdGNo IHByb3ZpZGVzIHRoZSBtd2x3aWZpIGRyaXZlciBmb3IgTWFydmVsbCA4ODYzLCA4ODY0IGFuZA0K PiA+PiA+IDg4OTcgY2hpcHNldHMuDQo+ID4+ID4gVGhpcyBkcml2ZXIgd2FzIGRldmVsb3BlZCBh cyBwYXJ0IG9mIHRoZSBvcGVud3J0Lm9yZyBwcm9qZWN0IHRvDQo+ID4+ID4gc3VwcG9ydCBMaW5r c3lzIFdSVDE5MDBBQyBhbmQgaXMgbWFpbnRhaW5lZCBvbg0KPiA+PiBodHRwczovL2dpdGh1Yi5j b20va2Fsb3ovbXdsd2lmaS4NCj4gPj4gPg0KPiA+PiA+IFRoZSBtd2x3aWZpIGRyaXZlciBkaWZm ZXJzIGZyb20gZXhpc3RpbmcgbXdpZmlleCBkcml2ZXI6DQo+ID4+ID4gbyBtd2x3aWZpIGlzIGEg InNvZnRtYWMgZHJpdmVyIiB1c2luZyB0aGUga2VybmVsP+6ogyBtYWM4MDIuMTENCj4gPj4gPiBz dWJzeXN0ZW0gdG8gcHJvdmlkZSBmdWxsIEFQL1dpcmVsZXNzIEJyaWRnZSBmdW5jdGlvbmFsaXR5 IChyb3V0ZXJzKS4NCj4gPj4gPiBvIG13aWZpZXggaXMgYSAiZnVsbG1hYyBkcml2ZXIiIHdoaWNo IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSBzZXQNCj4gPj4gPiBvZiBjbGllbnQgZnVuY3Rpb25z IChsYXB0b3BzL2VtYmVkZGVkIGRldmljZXMpIG8gb25seSBtd2x3aWZpDQo+ID4+ID4gc3VwcG9y dHMgTWFydmVsbCBBUCBjaGlwIDg4Nlggc2VyaWVzDQo+ID4+ID4NCj4gPj4gPiBOT1RFOiBVc2Vy cyB3aXRoIE1hcnZlbGwgODhXODg5NyBjaGlwc2V0cyBjdXJyZW50bHkgc2hvdWxkIGVuYWJsZQ0K PiA+PiA+IChDT05GSUc9WSBvciBNKSBlaXRoZXIgQ09ORklHX01XSUZJRVggb3IgQ09ORklHX01X TFdJRkksIE5PVA0KPiA+PiBCT1RILg0KPiA+PiA+DQo+ID4+ID4gbXdsd2lmaSBkcml2ZXIgbGV2 ZXJhZ2VkIGNvZGUgZnJvbSBleGlzdGluZyBNV0w4SyBkcml2ZXIgaW4gdGhlDQo+ID4+ID4gZm9s bG93aW5nIGFyZWFzOg0KPiA+PiA+IC0gODAyLjExbiBzZXR0aW5nIGZvciBtYWM4MDIxMQ0KPiA+ PiA+IC0gRnVuY3Rpb25zIG5lZWRlZCB0byBob29rIHVwIHRvIG1hYzgwMjExDQo+ID4+ID4gLSBJ bnRlcmFjdGlvbnMgd2l0aCBtYWM4MDIxMSB0byBlc3RhYmxpc2ggQkEgc3RyZWFtcw0KPiA+PiA+ IC0gUGFydGlhbCBmaXJtd2FyZSBBUElzLCBzb21lIGRhdGEgZmllbGRzDQo+ID4+ID4gLSBNZXRo b2QgdG8gcGFzcyBSeCBwYWNrZXRzIHRvIG1hYzgwMjExIGV4Y2VwdCAxMWFjIHJhdGVzDQo+ID4+ ID4NCj4gPj4gPiBJbiBhZGRpdGlvbiwgbXdsd2lmaSBkcml2ZXIgc3VwcG9ydHM6DQo+ID4+ID4g LSBmdXR1cmUgc2NhbGFiaWxpdHkgYW5kIGZ1dHVyZSBkZXZlbG9wbWVudCAocmVmYWN0b3JlZCBz b3VyY2UNCj4gPj4gPiBjb2RlKQ0KPiA+PiA+IC0gTWFydmVsbCA4MDIuMTFhYyBjaGlwc2V0cywg aW5jbHVkaW5nIGNvbWJvIEJUIGRldmljZXMNCj4gPj4gPiAtIDgwMi4xMWFjIHJlbGF0ZWQgc2V0 dGluZ3MgYW5kIGZ1bmN0aW9ucw0KPiA+PiA+IC0gY29uY3VycmVudCBBUCtTVEEgZnVuY3Rpb25h bGl0aWVzIHdpdGggc2luZ2xlIGZpcm13YXJlIHBlciBjaGlwDQo+ID4+ID4gLSBmaXJtd2FyZSBB UElzIGZvciB0aGUgc3VwcG9ydGVkIGNoaXBzZXQNCj4gPj4gPiAtIGNvbW11bmljYXRpbmcgbmV3 IG1hYzgwMjExIHNldHRpbmdzIHRvIGZpcm13YXJlDQo+ID4+ID4gLSBEaWZmZXJlbnQgVFgvUlgg ZGF0YXBhdGggd2hlcmUgYXBwbGljYWJsZQ0KPiA+PiA+IC0gQS1NU0RVIGFuZCBBLU1QRFUNCj4g Pj4gPiAtIG1hYzgwMjExLWJhc2VkIE1FU0ggKHdvcmsgaW4gcHJvZ3Jlc3MpDQo+ID4+ID4gLSBS ZWZpbmVkIHRoZSBjb2RlIHRvIGVzdGFibGlzaCBCQSBzdHJlYW1zDQo+ID4+ID4NCj4gPj4gPiBO T1RFOiBNV0xXSUZJIHdpbGwgYmUgb3JnYW5pemVkIHVuZGVyIG5ldyB2ZW5kb3Igc3BlY2lmaWMN Cj4gPj4gPiBmb2xkZXIvbWFydmVsbCwgYXMgcGVyIHJlcXVlc3Qgb2YgdGhlIGdhdGUga2VlcGVy IGFuZCBjb21tdW5pdHkuDQo+ID4+ID4NCj4gPj4gPiBTaWduZWQtb2ZmLWJ5OiBEYXZpZCBMaW4g PGRsaW5AbWFydmVsbC5jb20+DQo+ID4+DQo+ID4+IEl0J3MgYmVlbiBxdWl0ZSBhIHdoaWxlIHNp bmNlIHRoaXMgd2FzIHJldmlld2VkLiBEbyB5b3UgaGF2ZSBhIG5ldw0KPiA+PiB2ZXJzaW9uIG9m IHRoZSBkcml2ZXI/DQo+ID4+DQo+ID4NCj4gPiBZZXMgd2UgaGF2ZSBzb21lIHVwZGF0ZXMsIGFu ZCBjb250aW51ZSB3b3JraW5nIG9uIGl0LiBCdXQgd2UgZmVsdCB0aGF0DQo+IGNvbW11bml0eSBk b2VzIG5vdCBzZWVtIHRvIGJlIHZlcnkgaW50ZXJlc3RlZCBpbiB0aGlzIGRyaXZlciwgc28gd2Ug aGF2ZSBub3QNCj4gYmVlbiB1cGRhdGluZyB0aGUgd2lyZWxlc3Mgb3JnLiBMZXQgdXMga25vdyBp ZiB5b3UgYXJlIHN1cHBvcnRpdmUgYW5kIHdhaXRpbmcNCj4gZm9yIGl0Lg0KPiANCj4gTXkgdW5k ZXJzdGFuZGluZyB3YXMgdGhhdCB3ZSdkIHZlcnkgbXVjaCBsaWtlIHRoZSBkcml2ZXIgdG8gYmUg c2VudCB1cHN0cmVhbS4NCj4gRnJvbSBteSBwZXJzcGVjdGl2ZSwgaXQgbG9va2VkIGxpa2UgeW91 J2QgbG9zdCBpbnRlcmVzdCwgbm90IHVzLg0KPiANCg0KV2UgZmVsdCBzb21lIHJlc2lzdGFuY2Ug ZnJvbSB2YXJpb3VzIHBlb3BsZSwgYW5kIGdldCBkaXNjb3VyYWdlZC4gVGhvdWdoIHdlIGNvbnRp bnVlIHRvIHdvcmsgb24gaXQgaW50ZXJuYWxseSwgd2Ugd2VyZSBqdXN0IGtlZXBpbmcgZnVydGhl ciBzdWJtaXNzaW9uIGF0IHRoZSBiYWNrIG9mIG91ciBtaW5kLiBXZSBkbyBrZWVwIHRoZSBmZWVk YmFjayBmcm9tIGNvbW11bml0eSBhbmQgd2lsbCB3b3JrIG9uIGNvbXBsaWFuY3kgd2hlcmUgYXBw bGljYWJsZSBhbmQgcG9zc2libGUuDQoNCk5leHQsIHdlIHdpbGwgcHJlcGFyZSBhIHBhdGNoOCBm b3Igc3VibWlzc2lvbiBsYXRlci4NCg0KPg0KPiBUaGFua3MsDQo+IA0KPiAtLQ0KPiBKdWxpYW4g Q2FsYWJ5DQo+IA0KPiBFbWFpbDoganVsaWFuLmNhbGFieUBnbWFpbC5jb20NCj4gUHJvZmlsZTog aHR0cDovL3d3dy5nb29nbGUuY29tL3Byb2ZpbGVzL2p1bGlhbi5jYWxhYnkvDQo= ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2016-03-17 2:10 ` David Lin @ 2016-04-03 12:05 ` Bjørn Mork 2016-04-15 12:40 ` Kalle Valo 0 siblings, 1 reply; 26+ messages in thread From: Bjørn Mork @ 2016-04-03 12:05 UTC (permalink / raw) To: David Lin Cc: Julian Calaby, Kalle Valo, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh David Lin <dlin@marvell.com> writes: > We felt some resistance from various people, and get discouraged. Sorry to hear that. I believe this is a misunderstanding. I am convinced that *everyone* who commented on the driver did so with the intention to help getting it merged. I for one would very much like to see this driver in mainline. But for that to happen, you wil have to: 1) create a feature frozen branch for mainline submission 2) respond relatively quickly to comments received, posting new versions of the patch set if necessary The main issue preventing this driver from being merged so far, in my view, is that you have continued to add features between each attemt to get it merged. Adding new features is of course not bad, but you should do that in another branch *until* the initial version is accepted. Let me know if there is anything I can do to help getting this into mainline Bjørn ^ permalink raw reply [flat|nested] 26+ messages in thread
* Re: [PATCH v7] Add new mac80211 driver mwlwifi. 2016-04-03 12:05 ` Bjørn Mork @ 2016-04-15 12:40 ` Kalle Valo 0 siblings, 0 replies; 26+ messages in thread From: Kalle Valo @ 2016-04-15 12:40 UTC (permalink / raw) To: Bjørn Mork Cc: David Lin, Julian Calaby, Johannes Berg, linux-wireless, Chor Teck Law, Pete Hsieh Bjørn Mork <bjorn@mork.no> writes: > David Lin <dlin@marvell.com> writes: > >> We felt some resistance from various people, and get discouraged. > > Sorry to hear that. I believe this is a misunderstanding. I am > convinced that *everyone* who commented on the driver did so with the > intention to help getting it merged. Exactly. Why would we otherwise spend so much time reviewing the driver if we would not want it included? > I for one would very much like to see this driver in mainline. But for > that to happen, you wil have to: > 1) create a feature frozen branch for mainline submission > 2) respond relatively quickly to comments received, posting new > versions of the patch set if necessary > > The main issue preventing this driver from being merged so far, in my > view, is that you have continued to add features between each attemt to > get it merged. Adding new features is of course not bad, but you should > do that in another branch *until* the initial version is accepted. Thanks for the good summary, I think we should even add that to our wiki as a guideline for new drivers. Then submitting a new driver (or normal patches for that matter) you really want to optimise the use of reviewer's time. Just fix the issues pointed out in the review, don't do anything extra as the chances are that it just slows down everything. -- Kalle Valo ^ permalink raw reply [flat|nested] 26+ messages in thread
end of thread, other threads:[~2016-04-15 12:40 UTC | newest] Thread overview: 26+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2015-11-12 3:51 [PATCH v7] Add new mac80211 driver mwlwifi David Lin 2015-11-12 19:47 ` Jes Sorensen 2015-11-26 8:34 ` David Lin 2015-11-20 11:22 ` Johannes Berg 2015-11-26 8:27 ` David Lin 2015-11-26 9:40 ` Johannes Berg 2015-11-27 2:00 ` David Lin 2015-11-27 8:27 ` Johannes Berg 2015-12-10 14:57 ` Kalle Valo 2015-12-15 7:54 ` David Lin 2015-12-10 14:06 ` Kalle Valo [not found] ` <CANEJEGv7ENTJu4YHz1x2_ve2M6-3Nn8X-0aC2hA3o1mUs3tQ1g@mail.gmail.com> 2015-12-12 0:47 ` Grant Grundler 2015-12-14 11:47 ` Kalle Valo 2015-12-10 14:03 ` Kalle Valo 2015-12-10 14:39 ` Kalle Valo 2015-12-15 7:55 ` David Lin 2015-12-14 21:32 ` Kan Yan 2015-12-15 5:47 ` David Lin 2015-12-15 7:40 ` Emmanuel Grumbach 2015-12-15 7:53 ` David Lin 2016-03-16 23:24 ` Julian Calaby 2016-03-17 1:23 ` David Lin 2016-03-17 1:32 ` Julian Calaby 2016-03-17 2:10 ` David Lin 2016-04-03 12:05 ` Bjørn Mork 2016-04-15 12:40 ` Kalle Valo
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.