From mboxrd@z Thu Jan 1 00:00:00 1970 From: Scott James Remnant Date: Wed, 24 Dec 2008 11:37:01 +0000 Subject: Re: Revisiting threaded udevd Message-Id: <1230118621.18723.57.camel@quest> MIME-Version: 1 Content-Type: multipart/mixed; boundary="=-ASGhT7dpBcE6B2mRNE03" List-Id: References: <494F7942.6060702@tuffmail.co.uk> In-Reply-To: <494F7942.6060702@tuffmail.co.uk> To: linux-hotplug@vger.kernel.org --=-ASGhT7dpBcE6B2mRNE03 Content-Type: multipart/mixed; boundary="=-W4nE7hTK5biGt6Fzf4Es" --=-W4nE7hTK5biGt6Fzf4Es Content-Type: text/plain Content-Transfer-Encoding: quoted-printable On Mon, 2008-12-22 at 11:25 +0000, Alan Jenkins wrote: > I have some time to look at this again now. >=20 I was just looking at this myself, since it formed a natural part of the performance testing I'm doing on Ubuntu. I got as far as reapplying the patches to current git head, but then hit a segfault :-( Attached is the patch against head. The segfault occurs in the udev_device_get_properties() call at the top of udev_exec(), because that calls update_envp_monitor_buf() which calls free(). I assume this is non-reentrant territory? Scott --=20 Scott James Remnant scott@canonical.com --=-W4nE7hTK5biGt6Fzf4Es Content-Disposition: inline; filename="threaded.patch" Content-Type: text/x-patch; name="threaded.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 PT09IG1vZGlmaWVkIGZpbGUgJ2NvbmZpZ3VyZS5hYycNCi0tLSBjb25maWd1cmUuYWMJMjAwOC0x Mi0xNiAxNToxNzo1MyArMDAwMA0KKysrIGNvbmZpZ3VyZS5hYwkyMDA4LTEyLTI0IDExOjE2OjE3 ICswMDAwDQpAQCAtOSw2ICs5LDggQEANCiBBQ19TWVNfTEFSR0VGSUxFDQogQUNfUFJPR19MSUJU T09MDQogDQorc2luY2x1ZGUoYWN4X3B0aHJlYWQubTQpDQorDQogZG5sIC8qIGxpYnVkZXYgdmVy c2lvbiAqLw0KIExJQlVERVZfTFRfQ1VSUkVOVD0wDQogTElCVURFVl9MVF9SRVZJU0lPTj02DQpA QCAtMjUsNiArMjcsOCBAQA0KIEFDX1NVQlNUKFZPTElEX0xUX1JFVklTSU9OKQ0KIEFDX1NVQlNU KFZPTElEX0xUX0FHRSkNCiANCitBQ1hfUFRIUkVBRChBQ19ERUZJTkUoSEFWRV9QVEhSRUFEKSwg QUNfTVNHX0ZBSUxVUkUoW3B0aHJlYWRzIHVuYXZhaWxhYmxlXSkpDQorDQogQUNfUEFUSF9QUk9H KFtYU0xUUFJPQ10sIFt4c2x0cHJvY10pDQogDQogQUNfQ0hFQ0tfTElCKGMsIGlub3RpZnlfaW5p dCwNCg0KPT09IG1vZGlmaWVkIGZpbGUgJ3VkZXYvTWFrZWZpbGUuYW0nDQotLS0gdWRldi9NYWtl ZmlsZS5hbQkyMDA4LTEyLTA2IDAzOjAzOjA4ICswMDAwDQorKysgdWRldi9NYWtlZmlsZS5hbQky MDA4LTEyLTI0IDExOjE2OjE3ICswMDAwDQpAQCAtMSw1ICsxLDkgQEANCiBpbmNsdWRlICQodG9w X3NyY2RpcikvTWFrZWZpbGUuYW0uaW5jDQogDQorTElCUyArPSAkKFBUSFJFQURfTElCUykNCitD RkxBR1MgKz0gJChQVEhSRUFEX0NGTEFHUykNCitDQz0kKFBUSFJFQURfQ0MpDQorDQogU1VCRElS UyA9IFwNCiAJbGliDQogDQpAQCAtMTgsNiArMjIsNyBAQA0KIAl1ZGV2LWV2ZW50LmMgXA0KIAl1 ZGV2LW5vZGUuYyBcDQogCXVkZXYtcnVsZXMuYyBcDQorCXVkZXYtZXhlYy5jIFwNCiAJdWRldi11 dGlsLmMgXA0KIAlsaWIvbGlidWRldi5oIFwNCiAJbGliL2xpYnVkZXYtcHJpdmF0ZS5oIFwNCg0K PT09IG1vZGlmaWVkIGZpbGUgJ3VkZXYvdGVzdC11ZGV2LmMnDQotLS0gdWRldi90ZXN0LXVkZXYu YwkyMDA4LTEwLTI0IDA4OjUxOjA0ICswMDAwDQorKysgdWRldi90ZXN0LXVkZXYuYwkyMDA4LTEy LTI0IDExOjE2OjI4ICswMDAwDQpAQCAtNjAsNiArNjAsOSBAQA0KIAlpbmZvKHVkZXYsICJ2ZXJz aW9uICVzXG4iLCBWRVJTSU9OKTsNCiAJdWRldl9zZWxpbnV4X2luaXQodWRldik7DQogDQorCS8q IGZvcmsgZXhlYyBkYWVtb24gYmVmb3JlIG9wZW5pbmcgZmRzIG9yIGNoYW5naW5nIHNpZ25hbCBo YW5kbGluZyAqLw0KKwl1ZGV2X2V4ZWNfaW5pdCh1ZGV2KTsNCisNCiAJLyogc2V0IHNpZ25hbCBo YW5kbGVycyAqLw0KIAltZW1zZXQoJmFjdCwgMHgwMCwgc2l6ZW9mKGFjdCkpOw0KIAlhY3Quc2Ff aGFuZGxlciA9ICh2b2lkICgqKShpbnQpKSBzaWdfaGFuZGxlcjsNCkBAIC02OSw5ICs3Miw2IEBA DQogCXNpZ2FjdGlvbihTSUdJTlQsICZhY3QsIE5VTEwpOw0KIAlzaWdhY3Rpb24oU0lHVEVSTSwg JmFjdCwgTlVMTCk7DQogDQotCS8qIHRyaWdnZXIgdGltZW91dCB0byBwcmV2ZW50IGhhbmdpbmcg cHJvY2Vzc2VzICovDQotCWFsYXJtKFVERVZfRVZFTlRfVElNRU9VVCk7DQotDQogCWFjdGlvbiA9 IGdldGVudigiQUNUSU9OIik7DQogCWRldnBhdGggPSBnZXRlbnYoIkRFVlBBVEgiKTsNCiAJc3Vi c3lzdGVtID0gZ2V0ZW52KCJTVUJTWVNURU0iKTsNCkBAIC05OSwxMCArOTksNiBAQA0KIAlldmVu dCA9IHVkZXZfZXZlbnRfbmV3KGRldik7DQogCWVyciA9IHVkZXZfZXZlbnRfZXhlY3V0ZV9ydWxl cyhldmVudCwgcnVsZXMpOw0KIA0KLQkvKiBydWxlcyBtYXkgY2hhbmdlL2Rpc2FibGUgdGhlIHRp bWVvdXQgKi8NCi0JaWYgKHVkZXZfZGV2aWNlX2dldF9ldmVudF90aW1lb3V0KGRldikgPj0gMCkN Ci0JCWFsYXJtKHVkZXZfZGV2aWNlX2dldF9ldmVudF90aW1lb3V0KGRldikpOw0KLQ0KIAlpZiAo ZXJyID09IDAgJiYgIWV2ZW50LT5pZ25vcmVfZGV2aWNlICYmIHVkZXZfZ2V0X3J1bih1ZGV2KSkN CiAJCXVkZXZfZXZlbnRfZXhlY3V0ZV9ydW4oZXZlbnQpOw0KIA0KQEAgLTExMSw2ICsxMDcsNyBA QA0KIGZhaWw6DQogCXVkZXZfcnVsZXNfdW5yZWYocnVsZXMpOw0KIGV4aXQ6DQorCXVkZXZfZXhl Y19jbGVhbnVwKHVkZXYpOw0KIAl1ZGV2X3NlbGludXhfZXhpdCh1ZGV2KTsNCiAJdWRldl91bnJl Zih1ZGV2KTsNCiAJaWYgKGVyciAhPSAwKQ0KDQo9PT0gbW9kaWZpZWQgZmlsZSAndWRldi91ZGV2 LWV2ZW50LmMnDQotLS0gdWRldi91ZGV2LWV2ZW50LmMJMjAwOC0xMi0wMiAwMDowNDoyMyArMDAw MA0KKysrIHVkZXYvdWRldi1ldmVudC5jCTIwMDgtMTItMjQgMTE6MTA6MzkgKzAwMDANCkBAIC03 MTcsNyArNzE3LDcgQEANCiAJCQkJICAgICAgIHVkZXZfZGV2aWNlX2dldF9zZXFudW0oZXZlbnQt PmRldiksDQogCQkJCSAgICAgICBwcm9ncmFtKTsNCiAJCQllbnZwID0gdWRldl9kZXZpY2VfZ2V0 X3Byb3BlcnRpZXNfZW52cChldmVudC0+ZGV2KTsNCi0JCQlpZiAodXRpbF9ydW5fcHJvZ3JhbShl dmVudC0+dWRldiwgcHJvZ3JhbSwgZW52cCwgTlVMTCwgMCwgTlVMTCkgIT0gMCkgew0KKwkJCWlm ICh1ZGV2X2V4ZWMoZXZlbnQtPmRldiwgcHJvZ3JhbSwgTlVMTCwgMCwgTlVMTCkgIT0gMCkgew0K IAkJCQlpZiAoIXVkZXZfbGlzdF9lbnRyeV9nZXRfZmxhZyhsaXN0X2VudHJ5KSkNCiAJCQkJCWVy ciA9IC0xOw0KIAkJCX0NCg0KPT09IG1vZGlmaWVkIGZpbGUgJ3VkZXYvdWRldi1ydWxlcy5jJw0K LS0tIHVkZXYvdWRldi1ydWxlcy5jCTIwMDgtMTEtMjQgMjA6MjQ6MDQgKzAwMDANCisrKyB1ZGV2 L3VkZXYtcnVsZXMuYwkyMDA4LTEyLTI0IDExOjE2OjAxICswMDAwDQpAQCAtNzMxLDEzICs3MzEs MTEgQEANCiBzdGF0aWMgaW50IGltcG9ydF9wcm9ncmFtX2ludG9fcHJvcGVydGllcyhzdHJ1Y3Qg dWRldl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqcHJvZ3JhbSkNCiB7DQogCXN0cnVjdCB1ZGV2 ICp1ZGV2ID0gdWRldl9kZXZpY2VfZ2V0X3VkZXYoZGV2KTsNCi0JY2hhciAqKmVudnA7DQogCWNo YXIgcmVzdWx0WzIwNDhdOw0KIAlzaXplX3QgcmVzbGVuOw0KIAljaGFyICpsaW5lOw0KIA0KLQll bnZwID0gdWRldl9kZXZpY2VfZ2V0X3Byb3BlcnRpZXNfZW52cChkZXYpOw0KLQlpZiAodXRpbF9y dW5fcHJvZ3JhbSh1ZGV2LCBwcm9ncmFtLCBlbnZwLCByZXN1bHQsIHNpemVvZihyZXN1bHQpLCAm cmVzbGVuKSAhPSAwKQ0KKwlpZiAodWRldl9leGVjKGRldiwgcHJvZ3JhbSwgcmVzdWx0LCBzaXpl b2YocmVzdWx0KSwgJnJlc2xlbikgIT0gMCkNCiAJCXJldHVybiAtMTsNCiANCiAJbGluZSA9IHJl c3VsdDsNCkBAIC0yMTkwLDE5ICsyMTg4LDE3IEBADQogCQljYXNlIFRLX01fUFJPR1JBTToNCiAJ CQl7DQogCQkJCWNoYXIgcHJvZ3JhbVtVVElMX1BBVEhfU0laRV07DQotCQkJCWNoYXIgKiplbnZw Ow0KIAkJCQljaGFyIHJlc3VsdFtVVElMX1BBVEhfU0laRV07DQogDQogCQkJCWZyZWUoZXZlbnQt PnByb2dyYW1fcmVzdWx0KTsNCiAJCQkJZXZlbnQtPnByb2dyYW1fcmVzdWx0ID0gTlVMTDsNCiAJ CQkJdXRpbF9zdHJsY3B5KHByb2dyYW0sICZydWxlcy0+YnVmW2N1ci0+a2V5LnZhbHVlX29mZl0s IHNpemVvZihwcm9ncmFtKSk7DQogCQkJCXVkZXZfZXZlbnRfYXBwbHlfZm9ybWF0KGV2ZW50LCBw cm9ncmFtLCBzaXplb2YocHJvZ3JhbSkpOw0KLQkJCQllbnZwID0gdWRldl9kZXZpY2VfZ2V0X3By b3BlcnRpZXNfZW52cChldmVudC0+ZGV2KTsNCiAJCQkJaW5mbyhldmVudC0+dWRldiwgIlBST0dS QU0gJyVzJyAlczoldVxuIiwNCiAJCQkJICAgICBwcm9ncmFtLA0KIAkJCQkgICAgICZydWxlcy0+ YnVmW3J1bGUtPnJ1bGUuZmlsZW5hbWVfb2ZmXSwNCiAJCQkJICAgICBydWxlLT5ydWxlLmZpbGVu YW1lX2xpbmUpOw0KLQkJCQlpZiAodXRpbF9ydW5fcHJvZ3JhbShldmVudC0+dWRldiwgcHJvZ3Jh bSwgZW52cCwgcmVzdWx0LCBzaXplb2YocmVzdWx0KSwgTlVMTCkgIT0gMCkgew0KKwkJCQlpZiAo dWRldl9leGVjKGV2ZW50LT51ZGV2LCBwcm9ncmFtLCByZXN1bHQsIHNpemVvZihyZXN1bHQpLCBO VUxMKSAhPSAwKSB7DQogCQkJCQlpZiAoY3VyLT5rZXkub3AgIT0gT1BfTk9NQVRDSCkNCiAJCQkJ CQlnb3RvIG5vbWF0Y2g7DQogCQkJCX0gZWxzZSB7DQoNCj09PSBtb2RpZmllZCBmaWxlICd1ZGV2 L3VkZXYtdXRpbC5jJw0KLS0tIHVkZXYvdWRldi11dGlsLmMJMjAwOC0xMi0xOSAyMzowMzo1MyAr MDAwMA0KKysrIHVkZXYvdWRldi11dGlsLmMJMjAwOC0xMi0yNCAxMToxMjo1MiArMDAwMA0KQEAg LTI1LDcgKzI1LDYgQEANCiAjaW5jbHVkZSA8Y3R5cGUuaD4NCiAjaW5jbHVkZSA8cHdkLmg+DQog I2luY2x1ZGUgPGdycC5oPg0KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPg0KIA0KICNpbmNsdWRlICJ1 ZGV2LmgiDQogDQpAQCAtMjM4LDIxNSArMjM3LDMgQEANCiAJdWRldl9kZXZpY2VfdW5yZWYoZGV2 KTsNCiAJcmV0dXJuIDA7DQogfQ0KLQ0KLWludCB1dGlsX3J1bl9wcm9ncmFtKHN0cnVjdCB1ZGV2 ICp1ZGV2LCBjb25zdCBjaGFyICpjb21tYW5kLCBjaGFyICoqZW52cCwNCi0JCSAgICAgY2hhciAq cmVzdWx0LCBzaXplX3QgcmVzc2l6ZSwgc2l6ZV90ICpyZXNsZW4pDQotew0KLQlpbnQgc3RhdHVz Ow0KLQlpbnQgb3V0cGlwZVsyXSA9IHstMSwgLTF9Ow0KLQlpbnQgZXJycGlwZVsyXSA9IHstMSwg LTF9Ow0KLQlwaWRfdCBwaWQ7DQotCWNoYXIgYXJnW1VUSUxfUEFUSF9TSVpFXTsNCi0JY2hhciBw cm9ncmFtW1VUSUxfUEFUSF9TSVpFXTsNCi0JY2hhciAqYXJndlsoc2l6ZW9mKGFyZykgLyAyKSAr IDFdOw0KLQlpbnQgZGV2bnVsbDsNCi0JaW50IGk7DQotCWludCBlcnIgPSAwOw0KLQ0KLQkvKiBi dWlsZCBhcmd2IGZyb20gY29tbWFuZCAqLw0KLQl1dGlsX3N0cmxjcHkoYXJnLCBjb21tYW5kLCBz aXplb2YoYXJnKSk7DQotCWkgPSAwOw0KLQlpZiAoc3RyY2hyKGFyZywgJyAnKSAhPSBOVUxMKSB7 DQotCQljaGFyICpwb3MgPSBhcmc7DQotDQotCQl3aGlsZSAocG9zICE9IE5VTEwgJiYgcG9zWzBd ICE9ICdcMCcpIHsNCi0JCQlpZiAocG9zWzBdID09ICdcJycpIHsNCi0JCQkJLyogZG8gbm90IHNl cGFyYXRlIHF1b3RlcyAqLw0KLQkJCQlwb3MrKzsNCi0JCQkJYXJndltpXSA9IHN0cnNlcCgmcG9z LCAiXCciKTsNCi0JCQkJd2hpbGUgKHBvcyAhPSBOVUxMICYmIHBvc1swXSA9PSAnICcpDQotCQkJ CQlwb3MrKzsNCi0JCQl9IGVsc2Ugew0KLQkJCQlhcmd2W2ldID0gc3Ryc2VwKCZwb3MsICIgIik7 DQotCQkJfQ0KLQkJCWRiZyh1ZGV2LCAiYXJnWyVpXSAnJXMnXG4iLCBpLCBhcmd2W2ldKTsNCi0J CQlpKys7DQotCQl9DQotCQlhcmd2W2ldID0gTlVMTDsNCi0JfSBlbHNlIHsNCi0JCWFyZ3ZbMF0g PSBhcmc7DQotCQlhcmd2WzFdID0gTlVMTDsNCi0JfQ0KLQlpbmZvKHVkZXYsICInJXMnXG4iLCBj b21tYW5kKTsNCi0NCi0JLyogcHJlcGFyZSBwaXBlcyBmcm9tIGNoaWxkIHRvIHBhcmVudCAqLw0K LQlpZiAocmVzdWx0ICE9IE5VTEwgfHwgdWRldl9nZXRfbG9nX3ByaW9yaXR5KHVkZXYpID49IExP R19JTkZPKSB7DQotCQlpZiAocGlwZShvdXRwaXBlKSAhPSAwKSB7DQotCQkJZXJyKHVkZXYsICJw aXBlIGZhaWxlZDogJW1cbiIpOw0KLQkJCXJldHVybiAtMTsNCi0JCX0NCi0JfQ0KLQlpZiAodWRl dl9nZXRfbG9nX3ByaW9yaXR5KHVkZXYpID49IExPR19JTkZPKSB7DQotCQlpZiAocGlwZShlcnJw aXBlKSAhPSAwKSB7DQotCQkJZXJyKHVkZXYsICJwaXBlIGZhaWxlZDogJW1cbiIpOw0KLQkJCXJl dHVybiAtMTsNCi0JCX0NCi0JfQ0KLQ0KLQkvKiBhbGxvdyBwcm9ncmFtcyBpbiAvbGliL3VkZXYv IHRvIGJlIGNhbGxlZCB3aXRob3V0IHRoZSBwYXRoICovDQotCWlmIChzdHJjaHIoYXJndlswXSwg Jy8nKSA9PSBOVUxMKSB7DQotCQl1dGlsX3N0cmxjcHkocHJvZ3JhbSwgVURFVl9QUkVGSVggIi9s aWIvdWRldi8iLCBzaXplb2YocHJvZ3JhbSkpOw0KLQkJdXRpbF9zdHJsY2F0KHByb2dyYW0sIGFy Z3ZbMF0sIHNpemVvZihwcm9ncmFtKSk7DQotCQlhcmd2WzBdID0gcHJvZ3JhbTsNCi0JfQ0KLQ0K LQlwaWQgPSBmb3JrKCk7DQotCXN3aXRjaChwaWQpIHsNCi0JY2FzZSAwOg0KLQkJLyogY2hpbGQg Y2xvc2VzIHBhcmVudCBlbmRzIG9mIHBpcGVzICovDQotCQlpZiAob3V0cGlwZVtSRUFEX0VORF0g PiAwKQ0KLQkJCWNsb3NlKG91dHBpcGVbUkVBRF9FTkRdKTsNCi0JCWlmIChlcnJwaXBlW1JFQURf RU5EXSA+IDApDQotCQkJY2xvc2UoZXJycGlwZVtSRUFEX0VORF0pOw0KLQ0KLQkJLyogZGlzY2Fy ZCBjaGlsZCBvdXRwdXQgb3IgY29ubmVjdCB0byBwaXBlICovDQotCQlkZXZudWxsID0gb3Blbigi L2Rldi9udWxsIiwgT19SRFdSKTsNCi0JCWlmIChkZXZudWxsID4gMCkgew0KLQkJCWR1cDIoZGV2 bnVsbCwgU1RESU5fRklMRU5PKTsNCi0JCQlpZiAob3V0cGlwZVtXUklURV9FTkRdIDwgMCkNCi0J CQkJZHVwMihkZXZudWxsLCBTVERPVVRfRklMRU5PKTsNCi0JCQlpZiAoZXJycGlwZVtXUklURV9F TkRdIDwgMCkNCi0JCQkJZHVwMihkZXZudWxsLCBTVERFUlJfRklMRU5PKTsNCi0JCQljbG9zZShk ZXZudWxsKTsNCi0JCX0gZWxzZQ0KLQkJCWVycih1ZGV2LCAib3BlbiAvZGV2L251bGwgZmFpbGVk OiAlbVxuIik7DQotCQlpZiAob3V0cGlwZVtXUklURV9FTkRdID4gMCkgew0KLQkJCWR1cDIob3V0 cGlwZVtXUklURV9FTkRdLCBTVERPVVRfRklMRU5PKTsNCi0JCQljbG9zZShvdXRwaXBlW1dSSVRF X0VORF0pOw0KLQkJfQ0KLQkJaWYgKGVycnBpcGVbV1JJVEVfRU5EXSA+IDApIHsNCi0JCQlkdXAy KGVycnBpcGVbV1JJVEVfRU5EXSwgU1RERVJSX0ZJTEVOTyk7DQotCQkJY2xvc2UoZXJycGlwZVtX UklURV9FTkRdKTsNCi0JCX0NCi0JCWV4ZWN2ZShhcmd2WzBdLCBhcmd2LCBlbnZwKTsNCi0JCWlm IChlcnJubyA9PSBFTk9FTlQgfHwgZXJybm8gPT0gRU5PVERJUikgew0KLQkJCS8qIG1heSBiZSBv biBhIGZpbGVzeXRlbSB3aGljaCBpcyBub3QgbW91bnRlZCByaWdodCBub3cgKi8NCi0JCQlpbmZv KHVkZXYsICJwcm9ncmFtICclcycgbm90IGZvdW5kXG4iLCBhcmd2WzBdKTsNCi0JCX0gZWxzZSB7 DQotCQkJLyogb3RoZXIgcHJvYmxlbXMgKi8NCi0JCQllcnIodWRldiwgImV4ZWMgb2YgcHJvZ3Jh bSAnJXMnIGZhaWxlZFxuIiwgYXJndlswXSk7DQotCQl9DQotCQlfZXhpdCgxKTsNCi0JY2FzZSAt MToNCi0JCWVycih1ZGV2LCAiZm9yayBvZiAnJXMnIGZhaWxlZDogJW1cbiIsIGFyZ3ZbMF0pOw0K LQkJcmV0dXJuIC0xOw0KLQlkZWZhdWx0Og0KLQkJLyogcmVhZCBmcm9tIGNoaWxkIGlmIHJlcXVl c3RlZCAqLw0KLQkJaWYgKG91dHBpcGVbUkVBRF9FTkRdID4gMCB8fCBlcnJwaXBlW1JFQURfRU5E XSA+IDApIHsNCi0JCQlzc2l6ZV90IGNvdW50Ow0KLQkJCXNpemVfdCByZXNwb3MgPSAwOw0KLQ0K LQkJCS8qIHBhcmVudCBjbG9zZXMgY2hpbGQgZW5kcyBvZiBwaXBlcyAqLw0KLQkJCWlmIChvdXRw aXBlW1dSSVRFX0VORF0gPiAwKQ0KLQkJCQljbG9zZShvdXRwaXBlW1dSSVRFX0VORF0pOw0KLQkJ CWlmIChlcnJwaXBlW1dSSVRFX0VORF0gPiAwKQ0KLQkJCQljbG9zZShlcnJwaXBlW1dSSVRFX0VO RF0pOw0KLQ0KLQkJCS8qIHJlYWQgY2hpbGQgb3V0cHV0ICovDQotCQkJd2hpbGUgKG91dHBpcGVb UkVBRF9FTkRdID4gMCB8fCBlcnJwaXBlW1JFQURfRU5EXSA+IDApIHsNCi0JCQkJaW50IGZkY291 bnQ7DQotCQkJCWZkX3NldCByZWFkZmRzOw0KLQ0KLQkJCQlGRF9aRVJPKCZyZWFkZmRzKTsNCi0J CQkJaWYgKG91dHBpcGVbUkVBRF9FTkRdID4gMCkNCi0JCQkJCUZEX1NFVChvdXRwaXBlW1JFQURf RU5EXSwgJnJlYWRmZHMpOw0KLQkJCQlpZiAoZXJycGlwZVtSRUFEX0VORF0gPiAwKQ0KLQkJCQkJ RkRfU0VUKGVycnBpcGVbUkVBRF9FTkRdLCAmcmVhZGZkcyk7DQotCQkJCWZkY291bnQgPSBzZWxl Y3QoVURFVl9NQVgob3V0cGlwZVtSRUFEX0VORF0sIGVycnBpcGVbUkVBRF9FTkRdKSsxLCAmcmVh ZGZkcywgTlVMTCwgTlVMTCwgTlVMTCk7DQotCQkJCWlmIChmZGNvdW50IDwgMCkgew0KLQkJCQkJ aWYgKGVycm5vID09IEVJTlRSKQ0KLQkJCQkJCWNvbnRpbnVlOw0KLQkJCQkJZXJyID0gLTE7DQot CQkJCQlicmVhazsNCi0JCQkJfQ0KLQ0KLQkJCQkvKiBnZXQgc3Rkb3V0ICovDQotCQkJCWlmIChv dXRwaXBlW1JFQURfRU5EXSA+IDAgJiYgRkRfSVNTRVQob3V0cGlwZVtSRUFEX0VORF0sICZyZWFk ZmRzKSkgew0KLQkJCQkJY2hhciBpbmJ1ZlsxMDI0XTsNCi0JCQkJCWNoYXIgKnBvczsNCi0JCQkJ CWNoYXIgKmxpbmU7DQotDQotCQkJCQljb3VudCA9IHJlYWQob3V0cGlwZVtSRUFEX0VORF0sIGlu YnVmLCBzaXplb2YoaW5idWYpLTEpOw0KLQkJCQkJaWYgKGNvdW50IDw9IDApIHsNCi0JCQkJCQlj bG9zZShvdXRwaXBlW1JFQURfRU5EXSk7DQotCQkJCQkJb3V0cGlwZVtSRUFEX0VORF0gPSAtMTsN Ci0JCQkJCQlpZiAoY291bnQgPCAwKSB7DQotCQkJCQkJCWVycih1ZGV2LCAic3RkaW4gcmVhZCBm YWlsZWQ6ICVtXG4iKTsNCi0JCQkJCQkJZXJyID0gLTE7DQotCQkJCQkJfQ0KLQkJCQkJCWNvbnRp bnVlOw0KLQkJCQkJfQ0KLQkJCQkJaW5idWZbY291bnRdID0gJ1wwJzsNCi0NCi0JCQkJCS8qIHN0 b3JlIHJlc3VsdCBmb3IgcnVsZSBwcm9jZXNzaW5nICovDQotCQkJCQlpZiAocmVzdWx0KSB7DQot CQkJCQkJaWYgKHJlc3BvcyArIGNvdW50IDwgcmVzc2l6ZSkgew0KLQkJCQkJCQltZW1jcHkoJnJl c3VsdFtyZXNwb3NdLCBpbmJ1ZiwgY291bnQpOw0KLQkJCQkJCQlyZXNwb3MgKz0gY291bnQ7DQot CQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkJZXJyKHVkZXYsICJyZXNzaXplICVsZCB0b28gc2hvcnRc biIsIChsb25nKXJlc3NpemUpOw0KLQkJCQkJCQllcnIgPSAtMTsNCi0JCQkJCQl9DQotCQkJCQl9 DQotCQkJCQlwb3MgPSBpbmJ1ZjsNCi0JCQkJCXdoaWxlICgobGluZSA9IHN0cnNlcCgmcG9zLCAi XG4iKSkpDQotCQkJCQkJaWYgKHBvcyB8fCBsaW5lWzBdICE9ICdcMCcpDQotCQkJCQkJCWluZm8o dWRldiwgIiclcycgKHN0ZG91dCkgJyVzJ1xuIiwgYXJndlswXSwgbGluZSk7DQotCQkJCX0NCi0N Ci0JCQkJLyogZ2V0IHN0ZGVyciAqLw0KLQkJCQlpZiAoZXJycGlwZVtSRUFEX0VORF0gPiAwICYm IEZEX0lTU0VUKGVycnBpcGVbUkVBRF9FTkRdLCAmcmVhZGZkcykpIHsNCi0JCQkJCWNoYXIgZXJy YnVmWzEwMjRdOw0KLQkJCQkJY2hhciAqcG9zOw0KLQkJCQkJY2hhciAqbGluZTsNCi0NCi0JCQkJ CWNvdW50ID0gcmVhZChlcnJwaXBlW1JFQURfRU5EXSwgZXJyYnVmLCBzaXplb2YoZXJyYnVmKS0x KTsNCi0JCQkJCWlmIChjb3VudCA8PSAwKSB7DQotCQkJCQkJY2xvc2UoZXJycGlwZVtSRUFEX0VO RF0pOw0KLQkJCQkJCWVycnBpcGVbUkVBRF9FTkRdID0gLTE7DQotCQkJCQkJaWYgKGNvdW50IDwg MCkNCi0JCQkJCQkJZXJyKHVkZXYsICJzdGRlcnIgcmVhZCBmYWlsZWQ6ICVtXG4iKTsNCi0JCQkJ CQljb250aW51ZTsNCi0JCQkJCX0NCi0JCQkJCWVycmJ1Zltjb3VudF0gPSAnXDAnOw0KLQkJCQkJ cG9zID0gZXJyYnVmOw0KLQkJCQkJd2hpbGUgKChsaW5lID0gc3Ryc2VwKCZwb3MsICJcbiIpKSkN Ci0JCQkJCQlpZiAocG9zIHx8IGxpbmVbMF0gIT0gJ1wwJykNCi0JCQkJCQkJaW5mbyh1ZGV2LCAi JyVzJyAoc3RkZXJyKSAnJXMnXG4iLCBhcmd2WzBdLCBsaW5lKTsNCi0JCQkJfQ0KLQkJCX0NCi0J CQlpZiAob3V0cGlwZVtSRUFEX0VORF0gPiAwKQ0KLQkJCQljbG9zZShvdXRwaXBlW1JFQURfRU5E XSk7DQotCQkJaWYgKGVycnBpcGVbUkVBRF9FTkRdID4gMCkNCi0JCQkJY2xvc2UoZXJycGlwZVtS RUFEX0VORF0pOw0KLQ0KLQkJCS8qIHJldHVybiB0aGUgY2hpbGRzIHN0ZG91dCBzdHJpbmcgKi8N Ci0JCQlpZiAocmVzdWx0KSB7DQotCQkJCXJlc3VsdFtyZXNwb3NdID0gJ1wwJzsNCi0JCQkJZGJn KHVkZXYsICJyZXN1bHQ9JyVzJ1xuIiwgcmVzdWx0KTsNCi0JCQkJaWYgKHJlc2xlbikNCi0JCQkJ CSpyZXNsZW4gPSByZXNwb3M7DQotCQkJfQ0KLQkJfQ0KLQkJd2FpdHBpZChwaWQsICZzdGF0dXMs IDApOw0KLQkJaWYgKFdJRkVYSVRFRChzdGF0dXMpKSB7DQotCQkJaW5mbyh1ZGV2LCAiJyVzJyBy ZXR1cm5lZCB3aXRoIHN0YXR1cyAlaVxuIiwgYXJndlswXSwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7 DQotCQkJaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkNCi0JCQkJZXJyID0gLTE7DQotCQl9 IGVsc2Ugew0KLQkJCWVycih1ZGV2LCAiJyVzJyBhYm5vcm1hbCBleGl0XG4iLCBjb21tYW5kKTsN Ci0JCQllcnIgPSAtMTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gZXJyOw0KLX0NCg0KPT09IG1vZGlm aWVkIGZpbGUgJ3VkZXYvdWRldi5oJw0KLS0tIHVkZXYvdWRldi5oCTIwMDgtMTEtMDUgMjA6NDk6 NTIgKzAwMDANCisrKyB1ZGV2L3VkZXYuaAkyMDA4LTEyLTI0IDExOjE2OjQ3ICswMDAwDQpAQCAt MzUsNiArMzUsOSBAQA0KICNkZWZpbmUgUkVBRF9FTkQJCQkJMA0KICNkZWZpbmUgV1JJVEVfRU5E CQkJCTENCiANCisjZGVmaW5lIFVERVZEX1BSSU9SSVRZCQkJLTQgLyogbmljZSBsZXZlbCBmb3Ig ZGFlbW9uICovDQorI2RlZmluZSBVREVWX1BSSU9SSVRZCQkJLTIgLyogbmljZSBsZXZlbCBmb3Ig cHJvZ3JhbXMgcnVuIGJ5IGRhZW1vbiovDQorDQogc3RhdGljIGlubGluZSB2b2lkIGxvZ2dpbmdf aW5pdChjb25zdCBjaGFyICpwcm9ncmFtX25hbWUpDQogew0KIAlvcGVubG9nKHByb2dyYW1fbmFt ZSwgTE9HX1BJRCB8IExPR19DT05TLCBMT0dfREFFTU9OKTsNCkBAIC02NCw3ICs2Nyw3IEBADQog CXVpZF90IHVpZDsNCiAJZ2lkX3QgZ2lkOw0KIAlzdHJ1Y3QgdWRldl9saXN0X25vZGUgcnVuX2xp c3Q7DQotCXBpZF90IHBpZDsNCisJcHRocmVhZF90IHRocmVhZDsNCiAJaW50IGV4aXRzdGF0dXM7 DQogCXRpbWVfdCBxdWV1ZV90aW1lOw0KIAl1bnNpZ25lZCBsb25nIGxvbmcgaW50IGRlbGF5aW5n X3NlcW51bTsNCkBAIC0xMDAsMTQgKzEwMywxOCBAQA0KIGV4dGVybiBpbnQgdWRldl9ub2RlX3Jl bW92ZShzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldiwgaW50IHRlc3QpOw0KIGV4dGVybiB2b2lkIHVk ZXZfbm9kZV91cGRhdGVfb2xkX2xpbmtzKHN0cnVjdCB1ZGV2X2RldmljZSAqZGV2LCBzdHJ1Y3Qg dWRldl9kZXZpY2UgKmRldl9vbGQsIGludCB0ZXN0KTsNCiANCisvKiB1ZGV2LWV4ZWMuYyAqLw0K K2V4dGVybiBpbnQgdWRldl9leGVjX2luaXQoc3RydWN0IHVkZXYgKnVkZXYpOw0KK2V4dGVybiB2 b2lkIHVkZXZfZXhlY19jbGVhbnVwKHN0cnVjdCB1ZGV2ICp1ZGV2KTsNCitleHRlcm4gaW50IHVk ZXZfZXhlYyhzdHJ1Y3QgdWRldl9kZXZpY2UgKmRldiwgY29uc3QgY2hhciAqY29tbWFuZCwNCisg ICAgICAgICAgICAgICAgICAgICBjaGFyICpyZXN1bHQsIHNpemVfdCByZXNzaXplLCBzaXplX3Qg KnJlc2xlbik7DQorDQogLyogdWRldi11dGlsLmMgKi8NCiBleHRlcm4gaW50IHV0aWxfY3JlYXRl X3BhdGgoc3RydWN0IHVkZXYgKnVkZXYsIGNvbnN0IGNoYXIgKnBhdGgpOw0KIGV4dGVybiBpbnQg dXRpbF9kZWxldGVfcGF0aChzdHJ1Y3QgdWRldiAqdWRldiwgY29uc3QgY2hhciAqcGF0aCk7DQog ZXh0ZXJuIGludCB1dGlsX3VubGlua19zZWN1cmUoc3RydWN0IHVkZXYgKnVkZXYsIGNvbnN0IGNo YXIgKmZpbGVuYW1lKTsNCiBleHRlcm4gdWlkX3QgdXRpbF9sb29rdXBfdXNlcihzdHJ1Y3QgdWRl diAqdWRldiwgY29uc3QgY2hhciAqdXNlcik7DQogZXh0ZXJuIGdpZF90IHV0aWxfbG9va3VwX2dy b3VwKHN0cnVjdCB1ZGV2ICp1ZGV2LCBjb25zdCBjaGFyICpncm91cCk7DQotZXh0ZXJuIGludCB1 dGlsX3J1bl9wcm9ncmFtKHN0cnVjdCB1ZGV2ICp1ZGV2LCBjb25zdCBjaGFyICpjb21tYW5kLCBj aGFyICoqZW52cCwNCi0JCQkgICAgY2hhciAqcmVzdWx0LCBzaXplX3QgcmVzc2l6ZSwgc2l6ZV90 ICpyZXNsZW4pOw0KIGV4dGVybiBpbnQgdXRpbF9yZXNvbHZlX3N1YnN5c19rZXJuZWwoc3RydWN0 IHVkZXYgKnVkZXYsIGNvbnN0IGNoYXIgKnN0cmluZywNCiAJCQkJICAgICAgY2hhciAqcmVzdWx0 LCBzaXplX3QgbWF4c2l6ZSwgaW50IHJlYWRfdmFsdWUpOw0KIA0KDQo9PT0gbW9kaWZpZWQgZmls ZSAndWRldi91ZGV2ZC5jJw0KLS0tIHVkZXYvdWRldmQuYwkyMDA4LTExLTE3IDEzOjQzOjU4ICsw MDAwDQorKysgdWRldi91ZGV2ZC5jCTIwMDgtMTItMjQgMTE6Mjg6MTcgKzAwMDANCkBAIC0zNSwx MiArMzUsMTAgQEANCiAjaWZkZWYgSEFWRV9JTk9USUZZDQogI2luY2x1ZGUgPHN5cy9pbm90aWZ5 Lmg+DQogI2VuZGlmDQorI2luY2x1ZGUgPHB0aHJlYWQuaD4NCiANCiAjaW5jbHVkZSAidWRldi5o Ig0KIA0KLSNkZWZpbmUgVURFVkRfUFJJT1JJVFkJCQktNA0KLSNkZWZpbmUgVURFVl9QUklPUklU WQkJCS0yDQotDQogLyogbWF4aW11bSBsaW1pdCBvZiBmb3JrZWQgY2hpbGRzICovDQogI2RlZmlu ZSBVREVWRF9NQVhfQ0hJTERTCQkyNTYNCiANCkBAIC02NCw3ICs2Miw3IEBADQogc3RhdGljIHN0 cnVjdCB1ZGV2X21vbml0b3IgKmtlcm5lbF9tb25pdG9yOw0KIHN0YXRpYyBpbnQgaW5vdGlmeV9m ZCA9IC0xOw0KIHN0YXRpYyBpbnQgc2lnbmFsX3BpcGVbMl0gPSB7LTEsIC0xfTsNCi1zdGF0aWMg dm9sYXRpbGUgaW50IHNpZ2NoaWxkc193YWl0aW5nOw0KK3N0YXRpYyBpbnQgZXZlbnRfZG9uZV9w aXBlWzJdID0gey0xLCAtMX07DQogc3RhdGljIHZvbGF0aWxlIGludCB1ZGV2X2V4aXQ7DQogc3Rh dGljIHZvbGF0aWxlIGludCByZWxvYWRfY29uZmlnOw0KIHN0YXRpYyBpbnQgcnVuX2V4ZWNfcTsN CkBAIC03Myw2ICs3MSw4IEBADQogc3RhdGljIGludCBjaGlsZHM7DQogc3RhdGljIHN0cnVjdCB1 ZGV2X2xpc3Rfbm9kZSBldmVudF9saXN0Ow0KIA0KK3B0aHJlYWRfYXR0cl90IHRocmVhZF9hdHRy Ow0KKw0KIGVudW0gZXZlbnRfc3RhdGUgew0KIAlFVkVOVF9RVUVVRUQsDQogCUVWRU5UX0ZJTklT SEVELA0KQEAgLTE2Nyw4NyArMTY3LDY4IEBADQogCXVkZXZfZXZlbnRfdW5yZWYoZXZlbnQpOw0K IH0NCiANCi1zdGF0aWMgdm9pZCBhc21saW5rYWdlIGV2ZW50X3NpZ19oYW5kbGVyKGludCBzaWdu dW0pDQotew0KLQlpZiAoc2lnbnVtID09IFNJR0FMUk0pDQotCQlleGl0KDEpOw0KLX0NCi0NCi1z dGF0aWMgdm9pZCBldmVudF9mb3JrKHN0cnVjdCB1ZGV2X2V2ZW50ICpldmVudCkNCi17DQotCXBp ZF90IHBpZDsNCi0Jc3RydWN0IHNpZ2FjdGlvbiBhY3Q7DQotCWludCBlcnI7DQotDQotCWlmIChk ZWJ1Z190cmFjZSkgew0KLQkJZXZlbnQtPnRyYWNlID0gMTsNCi0JCWZwcmludGYoc3RkZXJyLCAi Zm9yayAlcyAoJWxsdSlcbiIsDQotCQkgICAgICAgdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgoZXZl bnQtPmRldiksDQotCQkgICAgICAgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShldmVudC0+ZGV2KSk7 DQotCX0NCi0NCi0JcGlkID0gZm9yaygpOw0KLQlzd2l0Y2ggKHBpZCkgew0KLQljYXNlIDA6DQot CQkvKiBjaGlsZCAqLw0KLQkJdWRldl9tb25pdG9yX3VucmVmKGtlcm5lbF9tb25pdG9yKTsNCi0J CXVkZXZfY3RybF91bnJlZih1ZGV2X2N0cmwpOw0KLQkJaWYgKGlub3RpZnlfZmQgPj0gMCkNCi0J CQljbG9zZShpbm90aWZ5X2ZkKTsNCi0JCWNsb3NlKHNpZ25hbF9waXBlW1JFQURfRU5EXSk7DQot CQljbG9zZShzaWduYWxfcGlwZVtXUklURV9FTkRdKTsNCi0JCWxvZ2dpbmdfY2xvc2UoKTsNCi0J CWxvZ2dpbmdfaW5pdCgidWRldmQtZXZlbnQiKTsNCi0JCXNldHByaW9yaXR5KFBSSU9fUFJPQ0VT UywgMCwgVURFVl9QUklPUklUWSk7DQotDQotCQkvKiBzZXQgc2lnbmFsIGhhbmRsZXJzICovDQot CQltZW1zZXQoJmFjdCwgMHgwMCwgc2l6ZW9mKGFjdCkpOw0KLQkJYWN0LnNhX2hhbmRsZXIgPSAo dm9pZCAoKikoaW50KSkgZXZlbnRfc2lnX2hhbmRsZXI7DQotCQlzaWdlbXB0eXNldCAoJmFjdC5z YV9tYXNrKTsNCi0JCWFjdC5zYV9mbGFncyA9IDA7DQotCQlzaWdhY3Rpb24oU0lHQUxSTSwgJmFj dCwgTlVMTCk7DQotDQotCQkvKiByZXNldCB0byBkZWZhdWx0ICovDQotCQlhY3Quc2FfaGFuZGxl ciA9IFNJR19ERkw7DQotCQlzaWdhY3Rpb24oU0lHSU5ULCAmYWN0LCBOVUxMKTsNCi0JCXNpZ2Fj dGlvbihTSUdURVJNLCAmYWN0LCBOVUxMKTsNCi0JCXNpZ2FjdGlvbihTSUdDSExELCAmYWN0LCBO VUxMKTsNCi0JCXNpZ2FjdGlvbihTSUdIVVAsICZhY3QsIE5VTEwpOw0KLQ0KLQkJLyogc2V0IHRp bWVvdXQgdG8gcHJldmVudCBoYW5naW5nIHByb2Nlc3NlcyAqLw0KLQkJYWxhcm0oVURFVl9FVkVO VF9USU1FT1VUKTsNCi0NCi0JCS8qIGFwcGx5IHJ1bGVzLCBjcmVhdGUgbm9kZSwgc3ltbGlua3Mg Ki8NCi0JCWVyciA9IHVkZXZfZXZlbnRfZXhlY3V0ZV9ydWxlcyhldmVudCwgcnVsZXMpOw0KLQ0K LQkJLyogcnVsZXMgbWF5IGNoYW5nZS9kaXNhYmxlIHRoZSB0aW1lb3V0ICovDQotCQlpZiAodWRl dl9kZXZpY2VfZ2V0X2V2ZW50X3RpbWVvdXQoZXZlbnQtPmRldikgPj0gMCkNCi0JCQlhbGFybSh1 ZGV2X2RldmljZV9nZXRfZXZlbnRfdGltZW91dChldmVudC0+ZGV2KSk7DQotDQotCQkvKiBleGVj dXRlIFJVTj0gKi8NCi0JCWlmIChlcnIgPT0gMCAmJiAhZXZlbnQtPmlnbm9yZV9kZXZpY2UgJiYg dWRldl9nZXRfcnVuKGV2ZW50LT51ZGV2KSkNCi0JCQl1ZGV2X2V2ZW50X2V4ZWN1dGVfcnVuKGV2 ZW50KTsNCi0NCi0JCWluZm8oZXZlbnQtPnVkZXYsICJzZXEgJWxsdSBleGl0IHdpdGggJWlcbiIs IHVkZXZfZGV2aWNlX2dldF9zZXFudW0oZXZlbnQtPmRldiksIGVycik7DQotCQlsb2dnaW5nX2Ns b3NlKCk7DQotCQlpZiAoZXJyICE9IDApDQotCQkJZXhpdCgxKTsNCi0JCWV4aXQoMCk7DQotCWNh c2UgLTE6DQotCQllcnIoZXZlbnQtPnVkZXYsICJmb3JrIG9mIGNoaWxkIGZhaWxlZDogJW1cbiIp Ow0KK3N0YXRpYyBpbnQgZXZlbnRfcnVuKHN0cnVjdCB1ZGV2X2V2ZW50ICpldmVudCkNCit7DQor CWludCBlcnI7DQorDQorCS8qIGFwcGx5IHJ1bGVzLCBjcmVhdGUgbm9kZSwgc3ltbGlua3MgKi8N CisJZXJyID0gdWRldl9ldmVudF9leGVjdXRlX3J1bGVzKGV2ZW50LCBydWxlcyk7DQorDQorCS8q IGV4ZWN1dGUgUlVOPSAqLw0KKwlpZiAoZXJyID09IDAgJiYgIWV2ZW50LT5pZ25vcmVfZGV2aWNl ICYmIHVkZXZfZ2V0X3J1bihldmVudC0+dWRldikpDQorCQl1ZGV2X2V2ZW50X2V4ZWN1dGVfcnVu KGV2ZW50KTsNCisJaW5mbyhldmVudC0+dWRldiwgInNlcSAlbGx1IGV4aXQgd2l0aCAlaVxuIiwg dWRldl9kZXZpY2VfZ2V0X3NlcW51bShldmVudC0+ZGV2KSwgZXJyKTsNCisNCisJcmV0dXJuIGVy cjsNCit9DQorDQorc3RhdGljIHZvaWQgKmV2ZW50X3J1bl9wdGhyZWFkKHZvaWQgKmFyZykNCit7 DQorCXN0cnVjdCB1ZGV2X2V2ZW50ICpldmVudCA9IGFyZzsNCisJaW50IGVycjsNCisNCisJZXJy ID0gZXZlbnRfcnVuKGV2ZW50KTsNCisNCisJLyogd3JpdGUgdG8gcGlwZSwgd2hpY2ggd2lsbCB3 YWtldXAgc2VsZWN0KCkgaW4gb3VyIG1haW5sb29wICovDQorCXdyaXRlKGV2ZW50X2RvbmVfcGlw ZVtXUklURV9FTkRdLCAmZXZlbnQsIHNpemVvZihzdHJ1Y3QgdWRldl9ldmVudCAqKSk7DQorDQor CXJldHVybiAodm9pZCAqKSAodWludHB0cl90KSBlcnI7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIGV2 ZW50X3RocmVhZF9jcmVhdGUoc3RydWN0IHVkZXZfZXZlbnQgKmV2ZW50KQ0KK3sNCisJaWYgKHB0 aHJlYWRfY3JlYXRlKCZldmVudC0+dGhyZWFkLCAmdGhyZWFkX2F0dHIsIGV2ZW50X3J1bl9wdGhy ZWFkLCBldmVudCkgIT0gMCkgew0KKwkJZXJyKGV2ZW50LT51ZGV2LCAiY3JlYXRlIHRocmVhZCBm YWlsZWQ6ICVtXG4iKTsNCiAJCWV2ZW50X3F1ZXVlX2RlbGV0ZShldmVudCk7DQotCQlicmVhazsN Ci0JZGVmYXVsdDoNCi0JCS8qIGdldCBTSUdDSExEIGluIG1haW4gbG9vcCAqLw0KLQkJaW5mbyhl dmVudC0+dWRldiwgInNlcSAlbGx1IGZvcmtlZCwgcGlkIFslZF0sICclcycgJyVzJywgJWxkIHNl Y29uZHMgb2xkXG4iLA0KLQkJICAgICB1ZGV2X2RldmljZV9nZXRfc2VxbnVtKGV2ZW50LT5kZXYp LA0KLQkJICAgICBwaWQsDQotCQkgICAgIHVkZXZfZGV2aWNlX2dldF9hY3Rpb24oZXZlbnQtPmRl diksDQotCQkgICAgIHVkZXZfZGV2aWNlX2dldF9zdWJzeXN0ZW0oZXZlbnQtPmRldiksDQotCQkg ICAgIHRpbWUoTlVMTCkgLSBldmVudC0+cXVldWVfdGltZSk7DQotCQlldmVudC0+cGlkID0gcGlk Ow0KLQkJY2hpbGRzKys7DQotCX0NCisJfQ0KKw0KKwlpbmZvKGV2ZW50LT51ZGV2LCAic2VxICVs bHUgY3JlYXRlZCwgJyVzJyAnJXMnLCAlbGQgc2Vjb25kcyBvbGRcbiIsDQorCSAgICAgdWRldl9k ZXZpY2VfZ2V0X3NlcW51bShldmVudC0+ZGV2KSwNCisJICAgICB1ZGV2X2RldmljZV9nZXRfYWN0 aW9uKGV2ZW50LT5kZXYpLA0KKwkgICAgIHVkZXZfZGV2aWNlX2dldF9zdWJzeXN0ZW0oZXZlbnQt PmRldiksDQorCSAgICAgdGltZShOVUxMKSAtIGV2ZW50LT5xdWV1ZV90aW1lKTsNCit9DQorDQor c3RhdGljIGludCBldmVudF90aHJlYWRfam9pbihzdHJ1Y3QgdWRldl9ldmVudCAqZXZlbnQpDQor ew0KKwl2b2lkICpyZXN1bHQ7DQorCWludCBlcnI7DQorDQorCWVyciA9IHB0aHJlYWRfam9pbihl dmVudC0+dGhyZWFkLCAmcmVzdWx0KTsNCisJaWYgKGVycikgew0KKwkJZXJyKGV2ZW50LT51ZGV2 LCAiZmFpbGVkIHRvIHJldHJpZXZlIHRocmVhZCByZXR1cm4gdmFsdWU6ICVtXG4iKTsNCisJCXJl dHVybiAtMTsNCisJfQ0KKw0KKwlyZXR1cm4gKGludCkgKHVpbnRwdHJfdCkgcmVzdWx0Ow0KK30N CisNCitzdGF0aWMgdm9pZCBldmVudF90aHJlYWRfa2lsbChzdHJ1Y3QgdWRldl9ldmVudCAqZXZl bnQpDQorew0KKwlwdGhyZWFkX2tpbGwoZXZlbnQtPnRocmVhZCwgU0lHVEVSTSk7DQorDQorCS8q IE1ha2Ugc3VyZSB0aHJlYWQgaGFzIGRpZWQgYmVmb3JlIHdlIHJldHVybiAqLw0KKwlldmVudF90 aHJlYWRfam9pbihldmVudCk7DQogfQ0KIA0KIHN0YXRpYyB2b2lkIGV2ZW50X3F1ZXVlX2luc2Vy dChzdHJ1Y3QgdWRldl9ldmVudCAqZXZlbnQpDQpAQCAtMjc5LDcgKzI2MCw3IEBADQogDQogCS8q IHJ1biBhbGwgZXZlbnRzIHdpdGggYSB0aW1lb3V0IHNldCBpbW1lZGlhdGVseSAqLw0KIAlpZiAo dWRldl9kZXZpY2VfZ2V0X3RpbWVvdXQoZXZlbnQtPmRldikgPiAwKSB7DQotCQlldmVudF9mb3Jr KGV2ZW50KTsNCisJCWV2ZW50X3RocmVhZF9jcmVhdGUoZXZlbnQpOw0KIAkJcmV0dXJuOw0KIAl9 DQogfQ0KQEAgLTQyMCw3ICs0MDEsNyBAQA0KIAkJCWJyZWFrOw0KIAkJfQ0KIA0KLQkJaWYgKGxv b3BfZXZlbnQtPnBpZCAhPSAwKQ0KKwkJaWYgKGxvb3BfZXZlbnQtPnRocmVhZCkNCiAJCQljb250 aW51ZTsNCiANCiAJCS8qIGRvIG5vdCBzdGFydCBldmVudCBpZiBwYXJlbnQgb3IgY2hpbGQgZXZl bnQgaXMgc3RpbGwgcnVubmluZyAqLw0KQEAgLTQzMSw3ICs0MTIsNyBAQA0KIAkJCWNvbnRpbnVl Ow0KIAkJfQ0KIA0KLQkJZXZlbnRfZm9yayhsb29wX2V2ZW50KTsNCisJCWV2ZW50X3RocmVhZF9j cmVhdGUobG9vcF9ldmVudCk7DQogCQlkYmcodWRldiwgIm1vdmVkIHNlcSAlbGx1IHRvIHJ1bm5p bmcgbGlzdFxuIiwgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShsb29wX2V2ZW50LT5kZXYpKTsNCiAJ fQ0KIH0NCkBAIC01MDksMTIgKzQ5MCw5IEBADQogCXN3aXRjaCAoc2lnbnVtKSB7DQogCQljYXNl IFNJR0lOVDoNCiAJCWNhc2UgU0lHVEVSTToNCisJCWNhc2UgU0lHQ0hMRDoNCiAJCQl1ZGV2X2V4 aXQgPSAxOw0KIAkJCWJyZWFrOw0KLQkJY2FzZSBTSUdDSExEOg0KLQkJCS8qIHNldCBmbGFnLCB0 aGVuIHdyaXRlIHRvIHBpcGUgaWYgbmVlZGVkICovDQotCQkJc2lnY2hpbGRzX3dhaXRpbmcgPSAx Ow0KLQkJCWJyZWFrOw0KIAkJY2FzZSBTSUdIVVA6DQogCQkJcmVsb2FkX2NvbmZpZyA9IDE7DQog CQkJYnJlYWs7DQpAQCAtNTI0LDUwICs1MDIsMTcgQEANCiAJd3JpdGUoc2lnbmFsX3BpcGVbV1JJ VEVfRU5EXSwgIiIsIDEpOw0KIH0NCiANCi1zdGF0aWMgdm9pZCB1ZGV2X2RvbmUoaW50IHBpZCwg aW50IGV4aXRzdGF0dXMpDQotew0KLQlzdHJ1Y3QgdWRldl9saXN0X25vZGUgKmxvb3A7DQotDQot CS8qIGZpbmQgZXZlbnQgYXNzb2NpYXRlZCB3aXRoIHBpZCBhbmQgZGVsZXRlIGl0ICovDQotCXVk ZXZfbGlzdF9ub2RlX2ZvcmVhY2gobG9vcCwgJmV2ZW50X2xpc3QpIHsNCi0JCXN0cnVjdCB1ZGV2 X2V2ZW50ICpsb29wX2V2ZW50ID0gbm9kZV90b19ldmVudChsb29wKTsNCi0NCi0JCWlmIChsb29w X2V2ZW50LT5waWQgPT0gcGlkKSB7DQotCQkJaW5mbyhsb29wX2V2ZW50LT51ZGV2LCAic2VxICVs bHUgY2xlYW51cCwgcGlkIFslZF0sIHN0YXR1cyAlaSwgJWxkIHNlY29uZHMgb2xkXG4iLA0KLQkJ CSAgICAgdWRldl9kZXZpY2VfZ2V0X3NlcW51bShsb29wX2V2ZW50LT5kZXYpLCBsb29wX2V2ZW50 LT5waWQsDQotCQkJICAgICBleGl0c3RhdHVzLCB0aW1lKE5VTEwpIC0gbG9vcF9ldmVudC0+cXVl dWVfdGltZSk7DQotCQkJbG9vcF9ldmVudC0+ZXhpdHN0YXR1cyA9IGV4aXRzdGF0dXM7DQotCQkJ aWYgKGRlYnVnX3RyYWNlKQ0KLQkJCQlmcHJpbnRmKHN0ZGVyciwgImV4aXQgJXMgKCVsbHUpXG4i LA0KLQkJCQkgICAgICAgdWRldl9kZXZpY2VfZ2V0X3N5c3BhdGgobG9vcF9ldmVudC0+ZGV2KSwN Ci0JCQkJICAgICAgIHVkZXZfZGV2aWNlX2dldF9zZXFudW0obG9vcF9ldmVudC0+ZGV2KSk7DQot CQkJZXZlbnRfcXVldWVfZGVsZXRlKGxvb3BfZXZlbnQpOw0KLQkJCWNoaWxkcy0tOw0KLQ0KLQkJ CS8qIHRoZXJlIG1heSBiZSBkZXBlbmRlbnQgZXZlbnRzIHdhaXRpbmcgKi8NCi0JCQlydW5fZXhl Y19xID0gMTsNCi0JCQlyZXR1cm47DQotCQl9DQotCX0NCi19DQotDQotc3RhdGljIHZvaWQgcmVh cF9zaWdjaGlsZHModm9pZCkNCi17DQotCXBpZF90IHBpZDsNCi0JaW50IHN0YXR1czsNCi0NCi0J d2hpbGUgKDEpIHsNCi0JCXBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIFdOT0hBTkcpOw0KLQkJ aWYgKHBpZCA8PSAwKQ0KLQkJCWJyZWFrOw0KLQkJaWYgKFdJRkVYSVRFRChzdGF0dXMpKQ0KLQkJ CXN0YXR1cyA9IFdFWElUU1RBVFVTKHN0YXR1cyk7DQotCQllbHNlIGlmIChXSUZTSUdOQUxFRChz dGF0dXMpKQ0KLQkJCXN0YXR1cyA9IFdURVJNU0lHKHN0YXR1cykgKyAxMjg7DQotCQllbHNlDQot CQkJc3RhdHVzID0gMDsNCi0JCXVkZXZfZG9uZShwaWQsIHN0YXR1cyk7DQotCX0NCitzdGF0aWMg dm9pZCB1ZGV2X2RvbmUoc3RydWN0IHVkZXZfZXZlbnQgKmV2ZW50KQ0KK3sNCisJZXZlbnQtPmV4 aXRzdGF0dXMgPSBldmVudF90aHJlYWRfam9pbihldmVudCk7DQorCWluZm8oZXZlbnQtPnVkZXYs ICJzZXEgJWxsdSBjbGVhbnVwLCBzdGF0dXMgJWksICVsZCBzZWNvbmRzIG9sZFxuIiwNCisJICAg ICB1ZGV2X2RldmljZV9nZXRfc2VxbnVtKGV2ZW50LT5kZXYpLA0KKwkgICAgIGV2ZW50LT5leGl0 c3RhdHVzLCB0aW1lKE5VTEwpIC0gZXZlbnQtPnF1ZXVlX3RpbWUpOw0KKw0KKwlldmVudF9xdWV1 ZV9kZWxldGUoZXZlbnQpOw0KKw0KKwkvKiB0aGVyZSBtYXkgYmUgZXZlbnRzIHdhaXRpbmcgd2l0 aCB0aGUgc2FtZSBkZXZwYXRoICovDQorCXJ1bl9leGVjX3EgPSAxOw0KIH0NCiANCiBzdGF0aWMg dm9pZCBjbGVhbnVwX3F1ZXVlX2RpcihzdHJ1Y3QgdWRldiAqdWRldikNCkBAIC02MzYsNiArNTgx LDggQEANCiAJaW50IGVycjsNCiAJaW50IGZkOw0KIAlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsNCisJ aW50IHBhZ2VzaXplOw0KKwlpbnQgc3RhY2tzaXplOw0KIAlmZF9zZXQgcmVhZGZkczsNCiAJY29u c3QgY2hhciAqdmFsdWU7DQogCWludCBkYWVtb25pemUgPSAwOw0KQEAgLTcwNiw2ICs2NTMsMTMg QEANCiAJaWYgKHdyaXRlKFNUREVSUl9GSUxFTk8sIDAsIDApIDwgMCkNCiAJCWR1cDIoZmQsIFNU REVSUl9GSUxFTk8pOw0KIA0KKwljaGRpcigiLyIpOw0KKwl1bWFzaygwMjIpOw0KKwlzZXRzaWQo KTsNCisNCisJLyogZm9yayBleGVjIGRhZW1vbiBiZWZvcmUgb3BlbmluZyBtb3JlIGZkcyBvciBj aGFuZ2luZyBzaWduYWwgaGFuZGxpbmcgKi8NCisJdWRldl9leGVjX2luaXQodWRldik7DQorDQog CS8qIGluaXQgY29udHJvbCBzb2NrZXQsIGJpbmQoKSBlbnN1cmVzLCB0aGF0IG9ubHkgb25lIHVk ZXZkIGluc3RhbmNlIGlzIHJ1bm5pbmcgKi8NCiAJdWRldl9jdHJsID0gdWRldl9jdHJsX25ld19m cm9tX3NvY2tldCh1ZGV2LCBVREVWX0NUUkxfU09DS19QQVRIKTsNCiAJaWYgKHVkZXZfY3RybCA9 PSBOVUxMKSB7DQpAQCAtNzM2LDYgKzY5MCwxMSBAQA0KIAkJZXJyKHVkZXYsICJlcnJvciBnZXR0 aW5nIHBpcGVzOiAlbVxuIik7DQogCQlnb3RvIGV4aXQ7DQogCX0NCisJZXJyID0gcGlwZShldmVu dF9kb25lX3BpcGUpOw0KKwlpZiAoZXJyIDwgMCkgew0KKwkJZXJyKHVkZXYsICJlcnJvciBnZXR0 aW5nIHBpcGVzOiAlbVxuIik7DQorCQlnb3RvIGV4aXQ7DQorCX0NCiANCiAJZXJyID0gZmNudGwo c2lnbmFsX3BpcGVbUkVBRF9FTkRdLCBGX0dFVEZMLCAwKTsNCiAJaWYgKGVyciA8IDApIHsNCkBA IC03OTksOSArNzU4LDI4IEBADQogCS8qIHNldCBzY2hlZHVsaW5nIHByaW9yaXR5IGZvciB0aGUg ZGFlbW9uICovDQogCXNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgVURFVkRfUFJJT1JJVFkp Ow0KIA0KLQljaGRpcigiLyIpOw0KLQl1bWFzaygwMjIpOw0KLQlzZXRzaWQoKTsNCisJcHRocmVh ZF9hdHRyX2luaXQoJnRocmVhZF9hdHRyKTsNCisNCisJLyogVG8gY3JlYXRlIG1hbnkgdGhyZWFk cyBvbiAzMi1iaXQsIGl0IG1heSBiZSBuZWNlc3NhcnkgdG8gZXhwbGljaXRseSBsaW1pdCB0aGUg c3RhY2sgc2l6ZS4NCisNCisJICAgdWRldmQgZG9lc24ndCB1c2UgY3JhenkgcmVjdXJzaW9uIG9y IGRlZXAgY2FsbC1jaGFpbnMuDQorCSAgIEJ1dCBpdCBkb2VzIGFsbG9jYXRlIHF1aXRlIGEgZmV3 IGJ1ZmZlcnMgYW5kIHRlbXBvcmFyeSBzdHJpbmdzIG9uIHRoZSBzdGFjay4NCisJICAgV2UgbWF5 IGFsc28gbmVlZCBleHRyYSBzcGFjZSBmb3IgZXhvdGljIE5TUyBtb2R1bGVzICh1c2VyL2dyb3Vw IGxvb2t1cCwgZS5nLiBvdmVyIExEQVApLg0KKwkgICBNYWtlIGEgZ2VuZXJvdXMgZ3Vlc3MsIGRv dWJsZSBpdCwgYW5kIGRvdWJsZSBpdCBhZ2FpbiENCisNCisJICAgVGhpcyBjb21lcyB0byBqdXN0 IG92ZXIgMjAwS2IuICBUaGUgZGVmYXVsdCBvbiBpMzg2IGlzIDJNYi4NCisJICovDQorCXN0YWNr c2l6ZSA9IFBUSFJFQURfU1RBQ0tfTUlOOw0KKwlzdGFja3NpemUgKz0gVVRJTF9QQVRIX1NJWkUg KiA4Ow0KKwlzdGFja3NpemUgKz0gVVRJTF9MSU5FX1NJWkUgKiA4Ow0KKwlzdGFja3NpemUgKz0g VVRJTF9OQU1FX1NJWkUgKiA4Ow0KKwlzdGFja3NpemUgKz0gNDA5NiAqIDg7DQorCXN0YWNrc2l6 ZSAqPSA0Ow0KKw0KKwkvKiBSb3VuZCB1cCB0byBhIHdob2xlIG51bWJlciBvZiBwYWdlcyAqLw0K KwlwYWdlc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsNCisJc3RhY2tzaXplID0gKChzdGFj a3NpemUgLyBwYWdlc2l6ZSkgKyAxKSAqIHBhZ2VzaXplOw0KKwlwdGhyZWFkX2F0dHJfc2V0c3Rh Y2tzaXplKCZ0aHJlYWRfYXR0ciwgc3RhY2tzaXplKTsNCiANCiAJLyogT09NX0RJU0FCTEUgPT0g LTE3ICovDQogCWZkID0gb3BlbigiL3Byb2Mvc2VsZi9vb21fYWRqIiwgT19SRFdSKTsNCkBAIC04 ODcsMTIgKzg2NSwxNCBAQA0KIAltYXhmZCA9IHVkZXZfY3RybF9nZXRfZmQodWRldl9jdHJsKTsN CiAJbWF4ZmQgPSBVREVWX01BWChtYXhmZCwgdWRldl9tb25pdG9yX2dldF9mZChrZXJuZWxfbW9u aXRvcikpOw0KIAltYXhmZCA9IFVERVZfTUFYKG1heGZkLCBzaWduYWxfcGlwZVtSRUFEX0VORF0p Ow0KKwltYXhmZCA9IFVERVZfTUFYKG1heGZkLCBldmVudF9kb25lX3BpcGVbUkVBRF9FTkRdKTsN CiAJbWF4ZmQgPSBVREVWX01BWChtYXhmZCwgaW5vdGlmeV9mZCk7DQogCXdoaWxlICghdWRldl9l eGl0KSB7DQogCQlpbnQgZmRjb3VudDsNCiANCiAJCUZEX1pFUk8oJnJlYWRmZHMpOw0KIAkJRkRf U0VUKHNpZ25hbF9waXBlW1JFQURfRU5EXSwgJnJlYWRmZHMpOw0KKwkJRkRfU0VUKGV2ZW50X2Rv bmVfcGlwZVtSRUFEX0VORF0sICZyZWFkZmRzKTsNCiAJCUZEX1NFVCh1ZGV2X2N0cmxfZ2V0X2Zk KHVkZXZfY3RybCksICZyZWFkZmRzKTsNCiAJCUZEX1NFVCh1ZGV2X21vbml0b3JfZ2V0X2ZkKGtl cm5lbF9tb25pdG9yKSwgJnJlYWRmZHMpOw0KIAkJaWYgKGlub3RpZnlfZmQgPj0gMCkNCkBAIC05 MzEsNiArOTExLDIxIEBADQogCQkJcmVhZChzaWduYWxfcGlwZVtSRUFEX0VORF0sICZidWYsIHNp emVvZihidWYpKTsNCiAJCX0NCiANCisJCS8qIHByb2Nlc3NlZCBldmVudHMgKi8NCisJCWlmIChG RF9JU1NFVChldmVudF9kb25lX3BpcGVbUkVBRF9FTkRdLCAmcmVhZGZkcykpIHsNCisJCQlzdHJ1 Y3QgdWRldl9ldmVudCAqYnVmWzMyXTsNCisJCQlzc2l6ZV90IGNvdW50Ow0KKwkJCXVuc2lnbmVk IGk7DQorDQorCQkJY291bnQgPSByZWFkKGV2ZW50X2RvbmVfcGlwZVtSRUFEX0VORF0sICZidWYs IHNpemVvZihidWYpKTsNCisJCQlpZiAoY291bnQgPCAwKSB7DQorCQkJCWVycih1ZGV2LCAicmVh ZCBlcnJvciBvbiB0aHJlYWQgcGlwZTogJW1cbiIpOw0KKwkJCX0gZWxzZSB7DQorCQkJCWZvciAo aSA9IDA7IGkgPCBjb3VudCAvIHNpemVvZihidWZbMF0pOyBpKyspDQorCQkJCQl1ZGV2X2RvbmUo YnVmW2ldKTsNCisJCQl9DQorCQl9DQorDQogCQkvKiBydWxlcyBkaXJlY3RvcnkgaW5vdGlmeSB3 YXRjaCAqLw0KIAkJaWYgKChpbm90aWZ5X2ZkID49IDApICYmIEZEX0lTU0VUKGlub3RpZnlfZmQs ICZyZWFkZmRzKSkgew0KIAkJCWludCBuYnl0ZXM7DQpAQCAtOTYzLDExICs5NTgsNiBAQA0KIAkJ CX0NCiAJCX0NCiANCi0JCWlmIChzaWdjaGlsZHNfd2FpdGluZykgew0KLQkJCXNpZ2NoaWxkc193 YWl0aW5nID0gMDsNCi0JCQlyZWFwX3NpZ2NoaWxkcygpOw0KLQkJfQ0KLQ0KIAkJaWYgKHJ1bl9l eGVjX3EpIHsNCiAJCQlydW5fZXhlY19xID0gMDsNCiAJCQlpZiAoIXN0b3BfZXhlY19xKQ0KQEAg LTk3Niw4ICs5NjYsMTkgQEANCiAJfQ0KIAljbGVhbnVwX3F1ZXVlX2Rpcih1ZGV2KTsNCiAJcmMg PSAwOw0KKwkvKiBLaWxsIGV2ZW50IHRocmVhZHMgYmVmb3JlIGRlc3Ryb3lpbmcgZ2xvYmFsIHVk ZXYgY29udGV4dCAqLw0KKwlpZiAoIXVkZXZfbGlzdF9pc19lbXB0eSgmZXZlbnRfbGlzdCkpIHsN CisJCXN0cnVjdCB1ZGV2X2xpc3Rfbm9kZSAqbG9vcDsNCisNCisJCXVkZXZfbGlzdF9ub2RlX2Zv cmVhY2gobG9vcCwgJmV2ZW50X2xpc3QpIHsNCisJCQlzdHJ1Y3QgdWRldl9ldmVudCAqbG9vcF9l dmVudCA9IG5vZGVfdG9fZXZlbnQobG9vcCk7DQorDQorCQkJZXZlbnRfdGhyZWFkX2tpbGwobG9v cF9ldmVudCk7DQorCQl9DQorCX0NCiBleGl0Og0KIAl1ZGV2X3J1bGVzX3VucmVmKHJ1bGVzKTsN CisJcHRocmVhZF9hdHRyX2Rlc3Ryb3koJnRocmVhZF9hdHRyKTsNCiAJaWYgKHNpZ25hbF9waXBl W1JFQURfRU5EXSA+PSAwKQ0KIAkJY2xvc2Uoc2lnbmFsX3BpcGVbUkVBRF9FTkRdKTsNCiAJaWYg KHNpZ25hbF9waXBlW1dSSVRFX0VORF0gPj0gMCkNCkBAIC05ODYsNiArOTg3LDcgQEANCiAJaWYg KGlub3RpZnlfZmQgPj0gMCkNCiAJCWNsb3NlKGlub3RpZnlfZmQpOw0KIAl1ZGV2X21vbml0b3Jf dW5yZWYoa2VybmVsX21vbml0b3IpOw0KKwl1ZGV2X2V4ZWNfY2xlYW51cCh1ZGV2KTsNCiAJdWRl dl9zZWxpbnV4X2V4aXQodWRldik7DQogCXVkZXZfdW5yZWYodWRldik7DQogCWxvZ2dpbmdfY2xv c2UoKTsNCg0K --=-W4nE7hTK5biGt6Fzf4Es-- --=-ASGhT7dpBcE6B2mRNE03 Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) iEYEABECAAYFAklSHt0ACgkQSnQiFMl4yK5+kQCgld8R6K9+3pf7NBSDDPi37+z0 9cwAoJPDz8ddrLy7FOmQ1+VSClWb+AgH =Sv+n -----END PGP SIGNATURE----- --=-ASGhT7dpBcE6B2mRNE03--