From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MIME_BASE64_TEXT,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY, URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DE60CC433E0 for ; Mon, 18 May 2020 09:25:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 91808207ED for ; Mon, 18 May 2020 09:25:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="FMZMP+Zm" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726497AbgERJZM (ORCPT ); Mon, 18 May 2020 05:25:12 -0400 Received: from mailgw01.mediatek.com ([210.61.82.183]:6734 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726724AbgERJZL (ORCPT ); Mon, 18 May 2020 05:25:11 -0400 X-UUID: ad8b38b2567c400fbb19192621ca4a7a-20200518 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:Content-Type:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=TOEwjD78j+pcEsWptbYWNJOWW7wF8Rkz5fmnOVU7sLs=; b=FMZMP+ZmaIE5S+Af5rwW6uTdpLhytz3PtOS1I2c71+btT0txxniaOFIDXwhnXmZ73/6vq1UuxzMKw9rUweCcbl2uTaxP8LiOMZBjftHw4O962oCckl3eJzuEdVGDhRMxNYqopSCtZJWSDg7Nzg3mqprSCky6RyVl8TR11HP9FdY=; X-UUID: ad8b38b2567c400fbb19192621ca4a7a-20200518 Received: from mtkexhb02.mediatek.inc [(172.21.101.103)] by mailgw01.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 1526658766; Mon, 18 May 2020 17:24:53 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs05n2.mediatek.inc (172.21.101.140) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 18 May 2020 17:24:47 +0800 Received: from mtksdaap41.mediatek.inc (172.21.77.4) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 18 May 2020 17:24:47 +0800 From: Roger Lu To: Kevin Hilman , Rob Herring , Nicolas Boichat , Stephen Boyd CC: Fan Chen , HenryC Chen , YT Lee , Xiaoqing Liu , Charles Yang , Angus Lin , Mark Rutland , Matthias Brugger , Nishanth Menon , Roger Lu , , , , , Subject: [PATCH v8 3/3] PM / AVS: SVS: Introduce SVS engine Date: Mon, 18 May 2020 17:24:04 +0800 Message-ID: <20200518092403.22647-4-roger.lu@mediatek.com> X-Mailer: git-send-email 2.18.0 In-Reply-To: <20200518092403.22647-1-roger.lu@mediatek.com> References: <20200518092403.22647-1-roger.lu@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Content-Transfer-Encoding: base64 Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org VGhlIFNWUyAoU21hcnQgVm9sdGFnZSBTY2FsaW5nKSBlbmdpbmUgaXMgYSBwaWVjZQ0Kb2YgaGFy ZHdhcmUgd2hpY2ggaXMgdXNlZCB0byBjYWxjdWxhdGUgb3B0aW1pemVkDQp2b2x0YWdlIHZhbHVl cyBvZiBzZXZlcmFsIHBvd2VyIGRvbWFpbnMsDQplLmcuIENQVS9HUFUvQ0NJLCBhY2NvcmRpbmcg dG8gY2hpcCBwcm9jZXNzIGNvcm5lciwNCnRlbXBlcmF0dXJlcywgYW5kIG90aGVyIGZhY3RvcnMu IFRoZW4gRFZGUyBkcml2ZXINCmNvdWxkIGFwcGx5IHRob3NlIG9wdGltaXplZCB2b2x0YWdlIHZh bHVlcyB0byByZWR1Y2UNCnBvd2VyIGNvbnN1bXB0aW9uLg0KDQpTaWduZWQtb2ZmLWJ5OiBSb2dl ciBMdSA8cm9nZXIubHVAbWVkaWF0ZWsuY29tPg0KLS0tDQogZHJpdmVycy9wb3dlci9hdnMvS2Nv bmZpZyAgICAgfCAgIDEwICsNCiBkcml2ZXJzL3Bvd2VyL2F2cy9NYWtlZmlsZSAgICB8ICAgIDEg Kw0KIGRyaXZlcnMvcG93ZXIvYXZzL210a19zdnMuYyAgIHwgMjExOSArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysNCiBpbmNsdWRlL2xpbnV4L3Bvd2VyL210a19zdnMuaCB8ICAgMjMg Kw0KIDQgZmlsZXMgY2hhbmdlZCwgMjE1MyBpbnNlcnRpb25zKCspDQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvcG93ZXIvYXZzL210a19zdnMuYw0KIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNs dWRlL2xpbnV4L3Bvd2VyL210a19zdnMuaA0KDQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9wb3dlci9h dnMvS2NvbmZpZyBiL2RyaXZlcnMvcG93ZXIvYXZzL0tjb25maWcNCmluZGV4IGNkYjQyMzdiZmQw Mi4uNjcwODlhYzYwNDBlIDEwMDY0NA0KLS0tIGEvZHJpdmVycy9wb3dlci9hdnMvS2NvbmZpZw0K KysrIGIvZHJpdmVycy9wb3dlci9hdnMvS2NvbmZpZw0KQEAgLTM1LDMgKzM1LDEzIEBAIGNvbmZp ZyBST0NLQ0hJUF9JT0RPTUFJTg0KIAkgIFNheSB5IGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgaW8g ZG9tYWlucyBvbiBSb2NrY2hpcCBTb0NzLiBJdCBpcw0KIAkgIG5lY2Vzc2FyeSBmb3IgdGhlIGlv IGRvbWFpbiBzZXR0aW5nIG9mIHRoZSBTb0MgdG8gbWF0Y2ggdGhlDQogCSAgdm9sdGFnZSBzdXBw bGllZCBieSB0aGUgcmVndWxhdG9ycy4NCisNCitjb25maWcgTVRLX1NWUw0KKwlib29sICJNZWRp YVRlayBTbWFydCBWb2x0YWdlIFNjYWxpbmcoU1ZTKSINCisJZGVwZW5kcyBvbiBQT1dFUl9BVlMg JiYgTVRLX0VGVVNFICYmIE5WTUVNDQorCWhlbHANCisJICBUaGUgU1ZTIGVuZ2luZSBpcyBhIHBp ZWNlIG9mIGhhcmR3YXJlIHdoaWNoIGlzIHVzZWQgdG8gY2FsY3VsYXRlDQorCSAgb3B0aW1pemVk IHZvbHRhZ2UgdmFsdWVzIG9mIHNldmVyYWwgcG93ZXIgZG9tYWlucywgZS5nLg0KKwkgIENQVSBj bHVzdGVycy9HUFUvQ0NJLCBhY2NvcmRpbmcgdG8gY2hpcCBwcm9jZXNzIGNvcm5lciwgdGVtcGVy YXR1cmVzLA0KKwkgIGFuZCBvdGhlciBmYWN0b3JzLiBUaGVuIERWRlMgZHJpdmVyIGNvdWxkIGFw cGx5IHRob3NlIG9wdGltaXplZCB2b2x0YWdlDQorCSAgdmFsdWVzIHRvIHJlZHVjZSBwb3dlciBj b25zdW1wdGlvbi4NCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F2cy9NYWtlZmlsZSBiL2Ry aXZlcnMvcG93ZXIvYXZzL01ha2VmaWxlDQppbmRleCA5MDA3ZDA1ODUzZTIuLjIzMWFkZjA3ODU4 MiAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvcG93ZXIvYXZzL01ha2VmaWxlDQorKysgYi9kcml2ZXJz L3Bvd2VyL2F2cy9NYWtlZmlsZQ0KQEAgLTIsMyArMiw0IEBADQogb2JqLSQoQ09ORklHX1BPV0VS X0FWU19PTUFQKQkJKz0gc21hcnRyZWZsZXgubw0KIG9iai0kKENPTkZJR19RQ09NX0NQUikJCQkr PSBxY29tLWNwci5vDQogb2JqLSQoQ09ORklHX1JPQ0tDSElQX0lPRE9NQUlOKQkJKz0gcm9ja2No aXAtaW8tZG9tYWluLm8NCitvYmotJChDT05GSUdfTVRLX1NWUykJCQkrPSBtdGtfc3ZzLm8NCmRp ZmYgLS1naXQgYS9kcml2ZXJzL3Bvd2VyL2F2cy9tdGtfc3ZzLmMgYi9kcml2ZXJzL3Bvd2VyL2F2 cy9tdGtfc3ZzLmMNCm5ldyBmaWxlIG1vZGUgMTAwNjQ0DQppbmRleCAwMDAwMDAwMDAwMDAuLmE0 MDgzYjNlZjE3NQ0KLS0tIC9kZXYvbnVsbA0KKysrIGIvZHJpdmVycy9wb3dlci9hdnMvbXRrX3N2 cy5jDQpAQCAtMCwwICsxLDIxMTkgQEANCisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMA0KKy8qDQorICogQ29weXJpZ2h0IChDKSAyMDIwIE1lZGlhVGVrIEluYy4NCisgKi8NCisN CisjZGVmaW5lIHByX2ZtdChmbXQpCSJbbXRrX3N2c10gIiBmbXQNCisNCisjaW5jbHVkZSA8bGlu dXgvYml0cy5oPg0KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4NCisjaW5jbHVkZSA8bGludXgvY29t cGxldGlvbi5oPg0KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+DQorI2luY2x1ZGUgPGxpbnV4L2lu dGVycnVwdC5oPg0KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4NCisjaW5jbHVkZSA8bGludXgv a3RocmVhZC5oPg0KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4NCisjaW5jbHVkZSA8bGludXgv bXV0ZXguaD4NCisjaW5jbHVkZSA8bGludXgvbnZtZW0tY29uc3VtZXIuaD4NCisjaW5jbHVkZSA8 bGludXgvb2ZfYWRkcmVzcy5oPg0KKyNpbmNsdWRlIDxsaW51eC9vZl9pcnEuaD4NCisjaW5jbHVk ZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4NCisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNl Lmg+DQorI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPg0KKyNpbmNsdWRlIDxsaW51eC9wbV9v cHAuaD4NCisjaW5jbHVkZSA8bGludXgvcG1fcW9zLmg+DQorI2luY2x1ZGUgPGxpbnV4L3BtX3J1 bnRpbWUuaD4NCisjaW5jbHVkZSA8bGludXgvcG93ZXIvbXRrX3N2cy5oPg0KKyNpbmNsdWRlIDxs aW51eC9wcm9jX2ZzLmg+DQorI2luY2x1ZGUgPGxpbnV4L3JlZ3VsYXRvci9jb25zdW1lci5oPg0K KyNpbmNsdWRlIDxsaW51eC9yZXNldC5oPg0KKyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPg0K KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+DQorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+DQor I2luY2x1ZGUgPGxpbnV4L3RoZXJtYWwuaD4NCisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPg0K Kw0KKy8qIHN2cyAxLWxpbmUgc3cgaWQgKi8NCisjZGVmaW5lIFNWU19DUFVfTElUVExFCQkJQklU KDApDQorI2RlZmluZSBTVlNfQ1BVX0JJRwkJCUJJVCgxKQ0KKyNkZWZpbmUgU1ZTX0NDSQkJCQlC SVQoMikNCisjZGVmaW5lIFNWU19HUFUJCQkJQklUKDMpDQorDQorLyogc3ZzIGJhbmsgbW9kZSBz dXBwb3J0ICovDQorI2RlZmluZSBTVlNCX01PREVfQUxMX0RJU0FCTEUJCSgwKQ0KKyNkZWZpbmUg U1ZTQl9NT0RFX0lOSVQwMQkJQklUKDEpDQorI2RlZmluZSBTVlNCX01PREVfSU5JVDAyCQlCSVQo MikNCisjZGVmaW5lIFNWU0JfTU9ERV9NT04JCQlCSVQoMykNCisNCisvKiBzdnMgYmFuayBpbml0 MDEgY29uZGl0aW9uICovDQorI2RlZmluZSBTVlNCX0lOSVQwMV9WT0xUX0lHTk9SRQkJQklUKDEp DQorI2RlZmluZSBTVlNCX0lOSVQwMV9WT0xUX0lOQ19PTkxZCUJJVCgyKQ0KKw0KKy8qIHN2cyBi YW5rIGNvbW1vbiBzZXR0aW5nICovDQorI2RlZmluZSBISUdIX1RFTVBfTUFYCQkJKFUzMl9NQVgp DQorI2RlZmluZSBSVU5DT05GSUdfREVGQVVMVAkJKDB4ODAwMDAwMDApDQorI2RlZmluZSBEQ19T SUdORURfQklUCQkJKDB4ODAwMCkNCisjZGVmaW5lIElOVEVOX0lOSVQweAkJCSgweDAwMDA1ZjAx KQ0KKyNkZWZpbmUgSU5URU5fTU9OVk9QRU4JCQkoMHgwMGZmMDAwMCkNCisjZGVmaW5lIFNWU0VO X09GRgkJCSgweDApDQorI2RlZmluZSBTVlNFTl9NQVNLCQkJKDB4NykNCisjZGVmaW5lIFNWU0VO X0lOSVQwMQkJCSgweDEpDQorI2RlZmluZSBTVlNFTl9JTklUMDIJCQkoMHg1KQ0KKyNkZWZpbmUg U1ZTRU5fTU9OCQkJKDB4MikNCisjZGVmaW5lIElOVFNUU19NT05WT1AJCQkoMHgwMGZmMDAwMCkN CisjZGVmaW5lIElOVFNUU19DT01QTEVURQkJCSgweDEpDQorI2RlZmluZSBJTlRTVFNfQ0xFQU4J CQkoMHgwMGZmZmZmZikNCisNCisjZGVmaW5lIHByb2NfZm9wc19ydyhuYW1lKSBcDQorCXN0YXRp YyBpbnQgbmFtZSAjIyBfcHJvY19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsCVwNCisJCQkJICAg ICAgc3RydWN0IGZpbGUgKmZpbGUpCVwNCisJewkJCQkJCQlcDQorCQlyZXR1cm4gc2luZ2xlX29w ZW4oZmlsZSwgbmFtZSAjIyBfcHJvY19zaG93LAlcDQorCQkJCSAgIFBERV9EQVRBKGlub2RlKSk7 CQlcDQorCX0JCQkJCQkJXA0KKwlzdGF0aWMgY29uc3Qgc3RydWN0IHByb2Nfb3BzIG5hbWUgIyMg X3Byb2NfZm9wcyA9IHsJXA0KKwkJLnByb2Nfb3Blbgk9IG5hbWUgIyMgX3Byb2Nfb3BlbiwJCVwN CisJCS5wcm9jX3JlYWQJPSBzZXFfcmVhZCwJCQlcDQorCQkucHJvY19sc2Vlawk9IHNlcV9sc2Vl aywJCQlcDQorCQkucHJvY19yZWxlYXNlCT0gc2luZ2xlX3JlbGVhc2UsCQlcDQorCQkucHJvY193 cml0ZQk9IG5hbWUgIyMgX3Byb2Nfd3JpdGUsCQlcDQorCX0NCisNCisjZGVmaW5lIHByb2NfZm9w c19ybyhuYW1lKSBcDQorCXN0YXRpYyBpbnQgbmFtZSAjIyBfcHJvY19vcGVuKHN0cnVjdCBpbm9k ZSAqaW5vZGUsCVwNCisJCQkJICAgICAgc3RydWN0IGZpbGUgKmZpbGUpCVwNCisJewkJCQkJCQlc DQorCQlyZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwgbmFtZSAjIyBfcHJvY19zaG93LAlcDQorCQkJ CSAgIFBERV9EQVRBKGlub2RlKSk7CQlcDQorCX0JCQkJCQkJXA0KKwlzdGF0aWMgY29uc3Qgc3Ry dWN0IHByb2Nfb3BzIG5hbWUgIyMgX3Byb2NfZm9wcyA9IHsJXA0KKwkJLnByb2Nfb3Blbgk9IG5h bWUgIyMgX3Byb2Nfb3BlbiwJCVwNCisJCS5wcm9jX3JlYWQJPSBzZXFfcmVhZCwJCQlcDQorCQku cHJvY19sc2Vlawk9IHNlcV9sc2VlaywJCQlcDQorCQkucHJvY19yZWxlYXNlCT0gc2luZ2xlX3Jl bGVhc2UsCQlcDQorCX0NCisNCisjZGVmaW5lIHByb2NfZW50cnkobmFtZSkJe19fc3RyaW5naWZ5 KG5hbWUpLCAmbmFtZSAjIyBfcHJvY19mb3BzfQ0KKw0KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0so bXRrX3N2c19sb2NrKTsNCitzdHJ1Y3QgbXRrX3N2czsNCisNCitlbnVtIHN2c2JfcGhhc2Ugew0K KwlTVlNCX1BIQVNFX0lOSVQwMSA9IDAsDQorCVNWU0JfUEhBU0VfSU5JVDAyLA0KKwlTVlNCX1BI QVNFX01PTiwNCisJU1ZTQl9QSEFTRV9FUlJPUiwNCit9Ow0KKw0KK2VudW0gcmVnX2luZGV4IHsN CisJVEVNUE1PTkNUTDAgPSAwLA0KKwlURU1QTU9OQ1RMMSwNCisJVEVNUE1PTkNUTDIsDQorCVRF TVBNT05JTlQsDQorCVRFTVBNT05JTlRTVFMsDQorCVRFTVBNT05JREVUMCwNCisJVEVNUE1PTklE RVQxLA0KKwlURU1QTU9OSURFVDIsDQorCVRFTVBIMk5USFJFLA0KKwlURU1QSFRIUkUsDQorCVRF TVBDVEhSRSwNCisJVEVNUE9GRlNFVEgsDQorCVRFTVBPRkZTRVRMLA0KKwlURU1QTVNSQ1RMMCwN CisJVEVNUE1TUkNUTDEsDQorCVRFTVBBSEJQT0xMLA0KKwlURU1QQUhCVE8sDQorCVRFTVBBRENQ TlAwLA0KKwlURU1QQURDUE5QMSwNCisJVEVNUEFEQ1BOUDIsDQorCVRFTVBBRENNVVgsDQorCVRF TVBBRENFWFQsDQorCVRFTVBBRENFWFQxLA0KKwlURU1QQURDRU4sDQorCVRFTVBQTlBNVVhBRERS LA0KKwlURU1QQURDTVVYQUREUiwNCisJVEVNUEFEQ0VYVEFERFIsDQorCVRFTVBBRENFWFQxQURE UiwNCisJVEVNUEFEQ0VOQUREUiwNCisJVEVNUEFEQ1ZBTElEQUREUiwNCisJVEVNUEFEQ1ZPTFRB RERSLA0KKwlURU1QUkRDVFJMLA0KKwlURU1QQURDVkFMSURNQVNLLA0KKwlURU1QQURDVk9MVEFH RVNISUZULA0KKwlURU1QQURDV1JJVEVDVFJMLA0KKwlURU1QTVNSMCwNCisJVEVNUE1TUjEsDQor CVRFTVBNU1IyLA0KKwlURU1QQURDSEFERFIsDQorCVRFTVBJTU1EMCwNCisJVEVNUElNTUQxLA0K KwlURU1QSU1NRDIsDQorCVRFTVBNT05JREVUMywNCisJVEVNUEFEQ1BOUDMsDQorCVRFTVBNU1Iz LA0KKwlURU1QSU1NRDMsDQorCVRFTVBQUk9UQ1RMLA0KKwlURU1QUFJPVFRBLA0KKwlURU1QUFJP VFRCLA0KKwlURU1QUFJPVFRDLA0KKwlURU1QU1BBUkUwLA0KKwlURU1QU1BBUkUxLA0KKwlURU1Q U1BBUkUyLA0KKwlURU1QU1BBUkUzLA0KKwlURU1QTVNSMF8xLA0KKwlURU1QTVNSMV8xLA0KKwlU RU1QTVNSMl8xLA0KKwlURU1QTVNSM18xLA0KKwlERVNDSEFSLA0KKwlURU1QQ0hBUiwNCisJREVU Q0hBUiwNCisJQUdFQ0hBUiwNCisJRENDT05GSUcsDQorCUFHRUNPTkZJRywNCisJRlJFUVBDVDMw LA0KKwlGUkVRUENUNzQsDQorCUxJTUlUVkFMUywNCisJVkJPT1QsDQorCURFVFdJTkRPVywNCisJ Q09ORklHLA0KKwlUU0NBTENTLA0KKwlSVU5DT05GSUcsDQorCVNWU0VOLA0KKwlJTklUMlZBTFMs DQorCURDVkFMVUVTLA0KKwlBR0VWQUxVRVMsDQorCVZPUDMwLA0KKwlWT1A3NCwNCisJVEVNUCwN CisJSU5UU1RTLA0KKwlJTlRTVFNSQVcsDQorCUlOVEVOLA0KKwlDSEtJTlQsDQorCUNIS1NISUZU LA0KKwlTVEFUVVMsDQorCVZERVNJR04zMCwNCisJVkRFU0lHTjc0LA0KKwlEVlQzMCwNCisJRFZU NzQsDQorCUFHRUNPVU5ULA0KKwlTTVNUQVRFMCwNCisJU01TVEFURTEsDQorCUNUTDAsDQorCURF U0RFVFNFQywNCisJVEVNUEFHRVNFQywNCisJQ1RSTFNQQVJFMCwNCisJQ1RSTFNQQVJFMSwNCisJ Q1RSTFNQQVJFMiwNCisJQ1RSTFNQQVJFMywNCisJQ09SRVNFTCwNCisJVEhFUk1JTlRTVCwNCisJ SU5UU1QsDQorCVRIU1RBR0UwU1QsDQorCVRIU1RBR0UxU1QsDQorCVRIU1RBR0UyU1QsDQorCVRI QUhCU1QwLA0KKwlUSEFIQlNUMSwNCisJU1BBUkUwLA0KKwlTUEFSRTEsDQorCVNQQVJFMiwNCisJ U1BBUkUzLA0KKwlUSFNMUEVWRUIsDQorCXJlZ19udW0sDQorfTsNCisNCitzdGF0aWMgY29uc3Qg dTMyIHN2c19yZWdzX3YyW10gPSB7DQorCVtURU1QTU9OQ1RMMF0JCT0gMHgwMDAsDQorCVtURU1Q TU9OQ1RMMV0JCT0gMHgwMDQsDQorCVtURU1QTU9OQ1RMMl0JCT0gMHgwMDgsDQorCVtURU1QTU9O SU5UXQkJPSAweDAwYywNCisJW1RFTVBNT05JTlRTVFNdCQk9IDB4MDEwLA0KKwlbVEVNUE1PTklE RVQwXQkJPSAweDAxNCwNCisJW1RFTVBNT05JREVUMV0JCT0gMHgwMTgsDQorCVtURU1QTU9OSURF VDJdCQk9IDB4MDFjLA0KKwlbVEVNUEgyTlRIUkVdCQk9IDB4MDI0LA0KKwlbVEVNUEhUSFJFXQkJ PSAweDAyOCwNCisJW1RFTVBDVEhSRV0JCT0gMHgwMmMsDQorCVtURU1QT0ZGU0VUSF0JCT0gMHgw MzAsDQorCVtURU1QT0ZGU0VUTF0JCT0gMHgwMzQsDQorCVtURU1QTVNSQ1RMMF0JCT0gMHgwMzgs DQorCVtURU1QTVNSQ1RMMV0JCT0gMHgwM2MsDQorCVtURU1QQUhCUE9MTF0JCT0gMHgwNDAsDQor CVtURU1QQUhCVE9dCQk9IDB4MDQ0LA0KKwlbVEVNUEFEQ1BOUDBdCQk9IDB4MDQ4LA0KKwlbVEVN UEFEQ1BOUDFdCQk9IDB4MDRjLA0KKwlbVEVNUEFEQ1BOUDJdCQk9IDB4MDUwLA0KKwlbVEVNUEFE Q01VWF0JCT0gMHgwNTQsDQorCVtURU1QQURDRVhUXQkJPSAweDA1OCwNCisJW1RFTVBBRENFWFQx XQkJPSAweDA1YywNCisJW1RFTVBBRENFTl0JCT0gMHgwNjAsDQorCVtURU1QUE5QTVVYQUREUl0J PSAweDA2NCwNCisJW1RFTVBBRENNVVhBRERSXQk9IDB4MDY4LA0KKwlbVEVNUEFEQ0VYVEFERFJd CT0gMHgwNmMsDQorCVtURU1QQURDRVhUMUFERFJdCT0gMHgwNzAsDQorCVtURU1QQURDRU5BRERS XQkJPSAweDA3NCwNCisJW1RFTVBBRENWQUxJREFERFJdCT0gMHgwNzgsDQorCVtURU1QQURDVk9M VEFERFJdCT0gMHgwN2MsDQorCVtURU1QUkRDVFJMXQkJPSAweDA4MCwNCisJW1RFTVBBRENWQUxJ RE1BU0tdCT0gMHgwODQsDQorCVtURU1QQURDVk9MVEFHRVNISUZUXQk9IDB4MDg4LA0KKwlbVEVN UEFEQ1dSSVRFQ1RSTF0JPSAweDA4YywNCisJW1RFTVBNU1IwXQkJPSAweDA5MCwNCisJW1RFTVBN U1IxXQkJPSAweDA5NCwNCisJW1RFTVBNU1IyXQkJPSAweDA5OCwNCisJW1RFTVBBRENIQUREUl0J CT0gMHgwOWMsDQorCVtURU1QSU1NRDBdCQk9IDB4MGEwLA0KKwlbVEVNUElNTUQxXQkJPSAweDBh NCwNCisJW1RFTVBJTU1EMl0JCT0gMHgwYTgsDQorCVtURU1QTU9OSURFVDNdCQk9IDB4MGIwLA0K KwlbVEVNUEFEQ1BOUDNdCQk9IDB4MGI0LA0KKwlbVEVNUE1TUjNdCQk9IDB4MGI4LA0KKwlbVEVN UElNTUQzXQkJPSAweDBiYywNCisJW1RFTVBQUk9UQ1RMXQkJPSAweDBjMCwNCisJW1RFTVBQUk9U VEFdCQk9IDB4MGM0LA0KKwlbVEVNUFBST1RUQl0JCT0gMHgwYzgsDQorCVtURU1QUFJPVFRDXQkJ PSAweDBjYywNCisJW1RFTVBTUEFSRTBdCQk9IDB4MGYwLA0KKwlbVEVNUFNQQVJFMV0JCT0gMHgw ZjQsDQorCVtURU1QU1BBUkUyXQkJPSAweDBmOCwNCisJW1RFTVBTUEFSRTNdCQk9IDB4MGZjLA0K KwlbVEVNUE1TUjBfMV0JCT0gMHgxOTAsDQorCVtURU1QTVNSMV8xXQkJPSAweDE5NCwNCisJW1RF TVBNU1IyXzFdCQk9IDB4MTk4LA0KKwlbVEVNUE1TUjNfMV0JCT0gMHgxYjgsDQorCVtERVNDSEFS XQkJPSAweGMwMCwNCisJW1RFTVBDSEFSXQkJPSAweGMwNCwNCisJW0RFVENIQVJdCQk9IDB4YzA4 LA0KKwlbQUdFQ0hBUl0JCT0gMHhjMGMsDQorCVtEQ0NPTkZJR10JCT0gMHhjMTAsDQorCVtBR0VD T05GSUddCQk9IDB4YzE0LA0KKwlbRlJFUVBDVDMwXQkJPSAweGMxOCwNCisJW0ZSRVFQQ1Q3NF0J CT0gMHhjMWMsDQorCVtMSU1JVFZBTFNdCQk9IDB4YzIwLA0KKwlbVkJPT1RdCQkJPSAweGMyNCwN CisJW0RFVFdJTkRPV10JCT0gMHhjMjgsDQorCVtDT05GSUddCQk9IDB4YzJjLA0KKwlbVFNDQUxD U10JCT0gMHhjMzAsDQorCVtSVU5DT05GSUddCQk9IDB4YzM0LA0KKwlbU1ZTRU5dCQkJPSAweGMz OCwNCisJW0lOSVQyVkFMU10JCT0gMHhjM2MsDQorCVtEQ1ZBTFVFU10JCT0gMHhjNDAsDQorCVtB R0VWQUxVRVNdCQk9IDB4YzQ0LA0KKwlbVk9QMzBdCQkJPSAweGM0OCwNCisJW1ZPUDc0XQkJCT0g MHhjNGMsDQorCVtURU1QXQkJCT0gMHhjNTAsDQorCVtJTlRTVFNdCQk9IDB4YzU0LA0KKwlbSU5U U1RTUkFXXQkJPSAweGM1OCwNCisJW0lOVEVOXQkJCT0gMHhjNWMsDQorCVtDSEtJTlRdCQk9IDB4 YzYwLA0KKwlbQ0hLU0hJRlRdCQk9IDB4YzY0LA0KKwlbU1RBVFVTXQkJPSAweGM2OCwNCisJW1ZE RVNJR04zMF0JCT0gMHhjNmMsDQorCVtWREVTSUdONzRdCQk9IDB4YzcwLA0KKwlbRFZUMzBdCQkJ PSAweGM3NCwNCisJW0RWVDc0XQkJCT0gMHhjNzgsDQorCVtBR0VDT1VOVF0JCT0gMHhjN2MsDQor CVtTTVNUQVRFMF0JCT0gMHhjODAsDQorCVtTTVNUQVRFMV0JCT0gMHhjODQsDQorCVtDVEwwXQkJ CT0gMHhjODgsDQorCVtERVNERVRTRUNdCQk9IDB4Y2UwLA0KKwlbVEVNUEFHRVNFQ10JCT0gMHhj ZTQsDQorCVtDVFJMU1BBUkUwXQkJPSAweGNmMCwNCisJW0NUUkxTUEFSRTFdCQk9IDB4Y2Y0LA0K KwlbQ1RSTFNQQVJFMl0JCT0gMHhjZjgsDQorCVtDVFJMU1BBUkUzXQkJPSAweGNmYywNCisJW0NP UkVTRUxdCQk9IDB4ZjAwLA0KKwlbVEhFUk1JTlRTVF0JCT0gMHhmMDQsDQorCVtJTlRTVF0JCQk9 IDB4ZjA4LA0KKwlbVEhTVEFHRTBTVF0JCT0gMHhmMGMsDQorCVtUSFNUQUdFMVNUXQkJPSAweGYx MCwNCisJW1RIU1RBR0UyU1RdCQk9IDB4ZjE0LA0KKwlbVEhBSEJTVDBdCQk9IDB4ZjE4LA0KKwlb VEhBSEJTVDFdCQk9IDB4ZjFjLA0KKwlbU1BBUkUwXQkJPSAweGYyMCwNCisJW1NQQVJFMV0JCT0g MHhmMjQsDQorCVtTUEFSRTJdCQk9IDB4ZjI4LA0KKwlbU1BBUkUzXQkJPSAweGYyYywNCisJW1RI U0xQRVZFQl0JCT0gMHhmMzAsDQorfTsNCisNCitzdHJ1Y3QgdGhlcm1hbF9wYXJhbWV0ZXIgew0K KwlpbnQgYWRjX2dlX3Q7DQorCWludCBhZGNfb2VfdDsNCisJaW50IGdlOw0KKwlpbnQgb2U7DQor CWludCBnYWluOw0KKwlpbnQgb192dHNhYmI7DQorCWludCBvX3Z0c21jdTE7DQorCWludCBvX3Z0 c21jdTI7DQorCWludCBvX3Z0c21jdTM7DQorCWludCBvX3Z0c21jdTQ7DQorCWludCBvX3Z0c21j dTU7DQorCWludCBkZWdjX2NhbGk7DQorCWludCBhZGNfY2FsaV9lbl90Ow0KKwlpbnQgb19zbG9w ZTsNCisJaW50IG9fc2xvcGVfc2lnbjsNCisJaW50IHRzX2lkOw0KK307DQorDQorc3RydWN0IHN2 c19iYW5rX29wcyB7DQorCXZvaWQgKCpzZXRfZnJlcXNfcGN0KShzdHJ1Y3QgbXRrX3N2cyAqc3Zz KTsNCisJdm9pZCAoKmdldF92b3BzKShzdHJ1Y3QgbXRrX3N2cyAqc3ZzKTsNCit9Ow0KKw0KK3N0 cnVjdCBzdnNfYmFuayB7DQorCXN0cnVjdCBzdnNfYmFua19vcHMgKm9wczsNCisJc3RydWN0IGNv bXBsZXRpb24gaW5pdF9jb21wbGV0aW9uOw0KKwlzdHJ1Y3QgZGV2aWNlICpkZXY7DQorCXN0cnVj dCByZWd1bGF0b3IgKmJ1Y2s7DQorCXN0cnVjdCBtdXRleCBsb2NrOwkvKiBMb2NrIHRvIHByb3Rl Y3QgdXBkYXRlIHZvbHRhZ2UgcHJvY2VzcyAqLw0KKwlib29sIHN1c3BlbmRlZDsNCisJYm9vbCBt dGNtb3NfcmVxdWVzdDsNCisJczMyIHZvbHRfb2Zmc2V0Ow0KKwl1MzIgbW9kZV9zdXBwb3J0Ow0K Kwl1MzIgb3BwX2ZyZXFzWzE2XTsNCisJdTMyIGZyZXFzX3BjdFsxNl07DQorCXUzMiBvcHBfdm9s dHNbMTZdOw0KKwl1MzIgaW5pdDAyX3ZvbHRzWzE2XTsNCisJdTMyIHZvbHRzWzE2XTsNCisJdTMy IHJlZ19kYXRhWzNdW3JlZ19udW1dOw0KKwl1MzIgZnJlcV9iYXNlOw0KKwl1MzIgdmJvb3Q7DQor CXUzMiB2b2x0X3N0ZXA7DQorCXUzMiB2b2x0X2Jhc2U7DQorCXUzMiBpbml0MDFfdm9sdF9mbGFn Ow0KKwl1MzIgcGhhc2U7DQorCXUzMiB2bWF4Ow0KKwl1MzIgdm1pbjsNCisJdTMyIGJ0czsNCisJ dTMyIG10czsNCisJdTMyIGJkZXM7DQorCXUzMiBtZGVzOw0KKwl1MzIgbXRkZXM7DQorCXUzMiBk Y2JkZXQ7DQorCXUzMiBkY21kZXQ7DQorCXUzMiBkdGhpOw0KKwl1MzIgZHRsbzsNCisJdTMyIGRl dF93aW5kb3c7DQorCXUzMiBkZXRfbWF4Ow0KKwl1MzIgYWdlX2NvbmZpZzsNCisJdTMyIGFnZV92 b2Zmc2V0X2luOw0KKwl1MzIgYWdlbTsNCisJdTMyIGRjX2NvbmZpZzsNCisJdTMyIGRjX3ZvZmZz ZXRfaW47DQorCXUzMiBkdnRfZml4ZWQ7DQorCXUzMiB2Y287DQorCXUzMiBjaGtfc2hpZnQ7DQor CXUzMiBzdnNfdGVtcDsNCisJdTMyIHVwcGVyX3RlbXBfYm91bmQ7DQorCXUzMiBsb3dlcl90ZW1w X2JvdW5kOw0KKwl1MzIgaGlnaF90ZW1wX3RocmVhc2hvbGQ7DQorCXUzMiBoaWdoX3RlbXBfb2Zm c2V0Ow0KKwl1MzIgbG93X3RlbXBfdGhyZWFzaG9sZDsNCisJdTMyIGxvd190ZW1wX29mZnNldDsN CisJdTMyIGNvcmVfc2VsOw0KKwl1MzIgb3BwX2NvdW50Ow0KKwl1MzIgaW50X3N0Ow0KKwl1MzIg c3lzdGVtY2xrX2VuOw0KKwl1MzIgc3dfaWQ7DQorCXUzMiBiYW5rX2lkOw0KKwl1MzIgY3RsMDsN CisJdTggKm9mX2NvbXBhdGlibGU7DQorCXU4ICpuYW1lOw0KKwl1OCAqdHpvbmVfbmFtZTsNCisJ dTggKmJ1Y2tfbmFtZTsNCit9Ow0KKw0KK3N0cnVjdCBzdnNfcGxhdGZvcm0gew0KKwlzdHJ1Y3Qg c3ZzX2JhbmsgKmJhbmtzOw0KKwlib29sICgqZWZ1c2VfcGFyc2luZykoc3RydWN0IG10a19zdnMg KnN2cyk7DQorCWJvb2wgZmFrZV9lZnVzZTsNCisJYm9vbCBuZWVkX2h3X3Jlc2V0Ow0KKwljb25z dCB1MzIgKnJlZ3M7DQorCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7DQorCXUzMiBiYW5rX251bTsN CisJdTMyIGVmdXNlX251bTsNCisJdTMyIGVmdXNlX2NoZWNrOw0KKwl1MzIgdGhlcm1hbF9lZnVz ZV9udW07DQorCXU4ICpuYW1lOw0KK307DQorDQorc3RydWN0IG10a19zdnMgew0KKwljb25zdCBz dHJ1Y3Qgc3ZzX3BsYXRmb3JtICpwbGF0Zm9ybTsNCisJc3RydWN0IHN2c19iYW5rICpiYW5rOw0K KwlzdHJ1Y3QgZGV2aWNlICpkZXY7DQorCXZvaWQgX19pb21lbSAqYmFzZTsNCisJc3RydWN0IGNs ayAqbWFpbl9jbGs7DQorCXUzMiAqZWZ1c2U7DQorCXUzMiAqdGhlcm1hbF9lZnVzZTsNCit9Ow0K Kw0KK3Vuc2lnbmVkIGxvbmcgY2xhaW1fbXRrX3N2c19sb2NrKHZvaWQpDQorCV9fYWNxdWlyZXMo Jm10a19zdnNfbG9jaykNCit7DQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQorDQorCXNwaW5fbG9j a19pcnFzYXZlKCZtdGtfc3ZzX2xvY2ssIGZsYWdzKTsNCisNCisJcmV0dXJuIGZsYWdzOw0KK30N CitFWFBPUlRfU1lNQk9MX0dQTChjbGFpbV9tdGtfc3ZzX2xvY2spOw0KKw0KK3ZvaWQgcmVsZWFz ZV9tdGtfc3ZzX2xvY2sodW5zaWduZWQgbG9uZyBmbGFncykNCisJX19yZWxlYXNlcygmbXRrX3N2 c19sb2NrKQ0KK3sNCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbXRrX3N2c19sb2NrLCBmbGFn cyk7DQorfQ0KK0VYUE9SVF9TWU1CT0xfR1BMKHJlbGVhc2VfbXRrX3N2c19sb2NrKTsNCisNCitz dGF0aWMgdTMyIHBlcmNlbnQodTMyIG51bWVyYXRvciwgdTMyIGRlbm9taW5hdG9yKQ0KK3sNCisJ dTMyIHBjdDsNCisNCisJLyogSWYgbm90IGRpdmlkZSAxMDAwLCAibnVtZXJhdG9yICogMTAwIiB3 b3VsZCBiZSBkYXRhIG92ZXJmbG93LiAqLw0KKwludW1lcmF0b3IgLz0gMTAwMDsNCisJZGVub21p bmF0b3IgLz0gMTAwMDsNCisJcGN0ID0gKChudW1lcmF0b3IgKiAxMDApICsgZGVub21pbmF0b3Ig LSAxKSAvIGRlbm9taW5hdG9yOw0KKwlwY3QgJj0gR0VOTUFTSyg3LCAwKTsNCisNCisJcmV0dXJu IHBjdDsNCit9DQorDQorc3RhdGljIHUzMiBzdnNfcmVhZGwoc3RydWN0IG10a19zdnMgKnN2cywg ZW51bSByZWdfaW5kZXggcmdfaSkNCit7DQorCXJldHVybiByZWFkbChzdnMtPmJhc2UgKyBzdnMt PnBsYXRmb3JtLT5yZWdzW3JnX2ldKTsNCit9DQorDQorc3RhdGljIHZvaWQgc3ZzX3dyaXRlbChz dHJ1Y3QgbXRrX3N2cyAqc3ZzLCB1MzIgdmFsLCBlbnVtIHJlZ19pbmRleCByZ19pKQ0KK3sNCisJ d3JpdGVsKHZhbCwgc3ZzLT5iYXNlICsgc3ZzLT5wbGF0Zm9ybS0+cmVnc1tyZ19pXSk7DQorfQ0K Kw0KK3N0YXRpYyB2b2lkIHN2c19zd2l0Y2hfYmFuayhzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sN CisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gc3ZzLT5iYW5rOw0KKw0KKwlzdnNfd3JpdGVsKHN2 cywgc3ZzYi0+Y29yZV9zZWwsIENPUkVTRUwpOw0KK30NCisNCitzdGF0aWMgdTMyIHN2c2Jfdm9s dF90b19vcHBfdm9sdCh1MzIgc3ZzYl92b2x0LCB1MzIgc3ZzYl92b2x0X3N0ZXAsDQorCQkJCSB1 MzIgc3ZzYl92b2x0X2Jhc2UpDQorew0KKwl1MzIgdV92b2x0Ow0KKw0KKwl1X3ZvbHQgPSAoc3Zz Yl92b2x0ICogc3ZzYl92b2x0X3N0ZXApICsgc3ZzYl92b2x0X2Jhc2U7DQorDQorCXJldHVybiB1 X3ZvbHQ7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzYl9nZXRfem9uZV90ZW1wZXJhdHVyZShzdHJ1 Y3Qgc3ZzX2JhbmsgKnN2c2IsIGludCAqdHpvbmVfdGVtcCkNCit7DQorCXN0cnVjdCB0aGVybWFs X3pvbmVfZGV2aWNlICp0emQ7DQorDQorCXR6ZCA9IHRoZXJtYWxfem9uZV9nZXRfem9uZV9ieV9u YW1lKHN2c2ItPnR6b25lX25hbWUpOw0KKwlpZiAoSVNfRVJSKHR6ZCkpDQorCQlyZXR1cm4gUFRS X0VSUih0emQpOw0KKw0KKwlyZXR1cm4gdGhlcm1hbF96b25lX2dldF90ZW1wKHR6ZCwgdHpvbmVf dGVtcCk7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzYl9zZXRfdm9sdHMoc3RydWN0IHN2c19iYW5r ICpzdnNiLCBib29sIGZvcmNlX3VwZGF0ZSkNCit7DQorCXUzMiBpLCBzdnNiX3ZvbHQsIG9wcF92 b2x0LCB0ZW1wX29mZnNldCA9IDA7DQorCWludCB0em9uZV90ZW1wLCByZXQ7DQorDQorCW11dGV4 X2xvY2soJnN2c2ItPmxvY2spOw0KKw0KKwkvKg0KKwkgKiBJZiBiYW5rIGlzIHN1c3BlbmRlZCwg aXQgbWVhbnMgc2lnbmVkLW9mZiB2b2x0YWdlcyBhcmUgYXBwbGllZC4NCisJICogRG9uJ3QgbmVl ZCB0byB1cGRhdGUgb3BwIHZvbHRhZ2UgYW55bW9yZS4NCisJICovDQorCWlmIChzdnNiLT5zdXNw ZW5kZWQgJiYgIWZvcmNlX3VwZGF0ZSkgew0KKwkJcHJfbm90aWNlKCIlczogYmFuayBpcyBzdXNw ZW5kZWRcbiIsIHN2c2ItPm5hbWUpOw0KKwkJbXV0ZXhfdW5sb2NrKCZzdnNiLT5sb2NrKTsNCisJ CXJldHVybiAtRVBFUk07DQorCX0NCisNCisJLyogR2V0IHRoZXJtYWwgZWZmZWN0ICovDQorCWlm IChzdnNiLT5waGFzZSA9PSBTVlNCX1BIQVNFX01PTikgew0KKwkJaWYgKHN2c2ItPnN2c190ZW1w ID4gc3ZzYi0+dXBwZXJfdGVtcF9ib3VuZCAmJg0KKwkJICAgIHN2c2ItPnN2c190ZW1wIDwgc3Zz Yi0+bG93ZXJfdGVtcF9ib3VuZCkgew0KKwkJCXByX2VycigiJXM6IHN2c190ZW1wIGlzIGFibm9y bWFsICgweCV4KT9cbiIsDQorCQkJICAgICAgIHN2c2ItPm5hbWUsIHN2c2ItPnN2c190ZW1wKTsN CisJCQltdXRleF91bmxvY2soJnN2c2ItPmxvY2spOw0KKwkJCXJldHVybiAtRUlOVkFMOw0KKwkJ fQ0KKw0KKwkJcmV0ID0gc3ZzYl9nZXRfem9uZV90ZW1wZXJhdHVyZShzdnNiLCAmdHpvbmVfdGVt cCk7DQorCQlpZiAocmV0KSB7DQorCQkJcHJfZXJyKCIlczogY2Fubm90IGdldCB6b25lIFwiJXNc IiB0ZW1wZXJhdHVyZSglZClcbiIsDQorCQkJICAgICAgIHN2c2ItPm5hbWUsIHN2c2ItPnR6b25l X25hbWUsIHJldCk7DQorCQkJcHJfZXJyKCIlczogc2V0IHNpZ25lZC1vZmYgdm9sdGFnZSB0aGlz IHRpbWUuXG4iLA0KKwkJCSAgICAgICBzdnNiLT5uYW1lKTsNCisJCQlzdnNiLT5waGFzZSA9IFNW U0JfUEhBU0VfRVJST1I7DQorCQl9DQorDQorCQlpZiAodHpvbmVfdGVtcCA+PSBzdnNiLT5oaWdo X3RlbXBfdGhyZWFzaG9sZCkNCisJCQl0ZW1wX29mZnNldCArPSBzdnNiLT5oaWdoX3RlbXBfb2Zm c2V0Ow0KKw0KKwkJaWYgKHR6b25lX3RlbXAgPD0gc3ZzYi0+bG93X3RlbXBfdGhyZWFzaG9sZCkN CisJCQl0ZW1wX29mZnNldCArPSBzdnNiLT5sb3dfdGVtcF9vZmZzZXQ7DQorCX0NCisNCisJLyog dm1pbiA8PSBzdnNiX3ZvbHQgKG9wcF92b2x0KSA8PSBzaWduZWQtb2ZmIHZvbHRhZ2UgKi8NCisJ Zm9yIChpID0gMDsgaSA8IHN2c2ItPm9wcF9jb3VudDsgaSsrKSB7DQorCQlpZiAoc3ZzYi0+cGhh c2UgPT0gU1ZTQl9QSEFTRV9NT04pIHsNCisJCQlzdnNiX3ZvbHQgPSBtYXgoKHN2c2ItPnZvbHRz W2ldICsgc3ZzYi0+dm9sdF9vZmZzZXQgKw0KKwkJCQkJIHRlbXBfb2Zmc2V0KSwgc3ZzYi0+dm1p bik7DQorCQkJb3BwX3ZvbHQgPSBzdnNiX3ZvbHRfdG9fb3BwX3ZvbHQoc3ZzYl92b2x0LA0KKwkJ CQkJCQkgc3ZzYi0+dm9sdF9zdGVwLA0KKwkJCQkJCQkgc3ZzYi0+dm9sdF9iYXNlKTsNCisJCX0g ZWxzZSBpZiAoc3ZzYi0+cGhhc2UgPT0gU1ZTQl9QSEFTRV9JTklUMDIpIHsNCisJCQlzdnNiX3Zv bHQgPSBtYXgoKHN2c2ItPmluaXQwMl92b2x0c1tpXSArDQorCQkJCQkgc3ZzYi0+dm9sdF9vZmZz ZXQpLCBzdnNiLT52bWluKTsNCisJCQlvcHBfdm9sdCA9IHN2c2Jfdm9sdF90b19vcHBfdm9sdChz dnNiX3ZvbHQsDQorCQkJCQkJCSBzdnNiLT52b2x0X3N0ZXAsDQorCQkJCQkJCSBzdnNiLT52b2x0 X2Jhc2UpOw0KKwkJfSBlbHNlIGlmIChzdnNiLT5waGFzZSA9PSBTVlNCX1BIQVNFX0VSUk9SKSB7 DQorCQkJb3BwX3ZvbHQgPSBzdnNiLT5vcHBfdm9sdHNbaV07DQorCQl9IGVsc2Ugew0KKwkJCXBy X2VycigiJXM6IHVua25vd24gcGhhc2U6ICV1P1xuIiwNCisJCQkgICAgICAgc3ZzYi0+bmFtZSwg c3ZzYi0+cGhhc2UpOw0KKwkJCW11dGV4X3VubG9jaygmc3ZzYi0+bG9jayk7DQorCQkJcmV0dXJu IC1FSU5WQUw7DQorCQl9DQorDQorCQlvcHBfdm9sdCA9IG1pbihvcHBfdm9sdCwgc3ZzYi0+b3Bw X3ZvbHRzW2ldKTsNCisJCXJldCA9IGRldl9wbV9vcHBfYWRqdXN0X3ZvbHRhZ2Uoc3ZzYi0+ZGV2 LCBzdnNiLT5vcHBfZnJlcXNbaV0sDQorCQkJCQkJb3BwX3ZvbHQsIG9wcF92b2x0LA0KKwkJCQkJ CXN2c2ItPm9wcF92b2x0c1tpXSk7DQorCQlpZiAocmV0KSB7DQorCQkJcHJfZXJyKCIlczogc2V0 IHZvbHRhZ2UgZmFpbGVkOiAlZFxuIiwgc3ZzYi0+bmFtZSwgcmV0KTsNCisJCQltdXRleF91bmxv Y2soJnN2c2ItPmxvY2spOw0KKwkJCXJldHVybiByZXQ7DQorCQl9DQorCX0NCisNCisJbXV0ZXhf dW5sb2NrKCZzdnNiLT5sb2NrKTsNCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyB1MzIg aW50ZXJwb2xhdGUodTMyIGYwLCB1MzIgZjEsIHUzMiB2MCwgdTMyIHYxLCB1MzIgZngpDQorew0K Kwl1MzIgdnk7DQorDQorCWlmICh2MCA9PSB2MSB8fCBmMCA9PSBmMSkNCisJCXJldHVybiB2MDsN CisNCisJLyogKjEwMCB0byBoYXZlIGRlY2ltYWwgZnJhY3Rpb24gZmFjdG9yLCArOTkgZm9yIHJv dW5kaW5nIHVwLiAqLw0KKwl2eSA9ICh2MCAqIDEwMCkgLSAoKCgodjAgLSB2MSkgKiAxMDApIC8g KGYwIC0gZjEpKSAqIChmMCAtIGZ4KSk7DQorCXZ5ID0gKHZ5ICsgOTkpIC8gMTAwOw0KKw0KKwly ZXR1cm4gdnk7DQorfQ0KKw0KK3N0YXRpYyB2b2lkIHN2c19nZXRfdm9wc192MihzdHJ1Y3QgbXRr X3N2cyAqc3ZzKQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gc3ZzLT5iYW5rOw0KKwl1 MzIgdGVtcCwgaTsNCisNCisJdGVtcCA9IHN2c19yZWFkbChzdnMsIFZPUDMwKTsNCisJc3ZzYi0+ dm9sdHNbNl0gPSAodGVtcCA+PiAyNCkgJiBHRU5NQVNLKDcsIDApOw0KKwlzdnNiLT52b2x0c1s0 XSA9ICh0ZW1wID4+IDE2KSAmIEdFTk1BU0soNywgMCk7DQorCXN2c2ItPnZvbHRzWzJdID0gKHRl bXAgPj4gOCkgICYgR0VOTUFTSyg3LCAwKTsNCisJc3ZzYi0+dm9sdHNbMF0gPSAodGVtcCAmIEdF Tk1BU0soNywgMCkpOw0KKw0KKwl0ZW1wID0gc3ZzX3JlYWRsKHN2cywgVk9QNzQpOw0KKwlzdnNi LT52b2x0c1sxNF0gPSAodGVtcCA+PiAyNCkgJiBHRU5NQVNLKDcsIDApOw0KKwlzdnNiLT52b2x0 c1sxMl0gPSAodGVtcCA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0KKwlzdnNiLT52b2x0c1sxMF0g PSAodGVtcCA+PiA4KSAgJiBHRU5NQVNLKDcsIDApOw0KKwlzdnNiLT52b2x0c1s4XSA9ICh0ZW1w ICYgR0VOTUFTSyg3LCAwKSk7DQorDQorCWZvciAoaSA9IDA7IGkgPD0gNzsgaSsrKSB7DQorCQlp ZiAoaSA8IDcpIHsNCisJCQlzdnNiLT52b2x0c1soaSAqIDIpICsgMV0gPQ0KKwkJCQlpbnRlcnBv bGF0ZShzdnNiLT5mcmVxc19wY3RbaSAqIDJdLA0KKwkJCQkJICAgIHN2c2ItPmZyZXFzX3BjdFso aSArIDEpICogMl0sDQorCQkJCQkgICAgc3ZzYi0+dm9sdHNbaSAqIDJdLA0KKwkJCQkJICAgIHN2 c2ItPnZvbHRzWyhpICsgMSkgKiAyXSwNCisJCQkJCSAgICBzdnNiLT5mcmVxc19wY3RbKGkgKiAy KSArIDFdKTsNCisJCX0gZWxzZSBpZiAoaSA9PSA3KSB7DQorCQkJc3ZzYi0+dm9sdHNbKGkgKiAy KSArIDFdID0NCisJCQkJaW50ZXJwb2xhdGUoc3ZzYi0+ZnJlcXNfcGN0WyhpIC0gMSkgKiAyXSwN CisJCQkJCSAgICBzdnNiLT5mcmVxc19wY3RbaSAqIDJdLA0KKwkJCQkJICAgIHN2c2ItPnZvbHRz WyhpIC0gMSkgKiAyXSwNCisJCQkJCSAgICBzdnNiLT52b2x0c1tpICogMl0sDQorCQkJCQkgICAg c3ZzYi0+ZnJlcXNfcGN0WyhpICogMikgKyAxXSk7DQorCQl9DQorCX0NCit9DQorDQorc3RhdGlj IHZvaWQgc3ZzX3NldF9mcmVxc19wY3RfdjIoc3RydWN0IG10a19zdnMgKnN2cykNCit7DQorCXN0 cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+YmFuazsNCisNCisJc3ZzX3dyaXRlbChzdnMsDQor CQkgICAoKHN2c2ItPmZyZXFzX3BjdFs2XSA8PCAyNCkgJiBHRU5NQVNLKDMxLCAyNCkpIHwNCisJ CSAgICgoc3ZzYi0+ZnJlcXNfcGN0WzRdIDw8IDE2KSAmIEdFTk1BU0soMjMsIDE2KSkgfA0KKwkJ ICAgKChzdnNiLT5mcmVxc19wY3RbMl0gPDwgOCkgJiBHRU5NQVNLKDE1LCA4KSkgfA0KKwkJICAg KHN2c2ItPmZyZXFzX3BjdFswXSAmIEdFTk1BU0soNywgMCkpLA0KKwkJICAgRlJFUVBDVDMwKTsN CisJc3ZzX3dyaXRlbChzdnMsDQorCQkgICAoKHN2c2ItPmZyZXFzX3BjdFsxNF0gPDwgMjQpICYg R0VOTUFTSygzMSwgMjQpKSB8DQorCQkgICAoKHN2c2ItPmZyZXFzX3BjdFsxMl0gPDwgMTYpICYg R0VOTUFTSygyMywgMTYpKSB8DQorCQkgICAoKHN2c2ItPmZyZXFzX3BjdFsxMF0gPDwgOCkgJiBH RU5NQVNLKDE1LCA4KSkgfA0KKwkJICAgKChzdnNiLT5mcmVxc19wY3RbOF0pICYgR0VOTUFTSyg3 LCAwKSksDQorCQkgICBGUkVRUENUNzQpOw0KK30NCisNCitzdGF0aWMgdm9pZCBzdnNfc2V0X3Bo YXNlKHN0cnVjdCBtdGtfc3ZzICpzdnMsIHUzMiB0YXJnZXRfcGhhc2UpDQorew0KKwlzdHJ1Y3Qg c3ZzX2JhbmsgKnN2c2IgPSBzdnMtPmJhbms7DQorCXUzMiBkZXNfY2hhciwgdGVtcF9jaGFyLCBk ZXRfY2hhciwgbGltaXRfdmFsczsNCisJdTMyIGluaXQydmFscywgdHNfY2FsY3MsIHZhbCwgZmls dGVyLCBpOw0KKw0KKwlzdnNfc3dpdGNoX2Jhbmsoc3ZzKTsNCisNCisJZGVzX2NoYXIgPSAoKHN2 c2ItPmJkZXMgPDwgOCkgJiBHRU5NQVNLKDE1LCA4KSkgfA0KKwkJICAgKHN2c2ItPm1kZXMgJiBH RU5NQVNLKDcsIDApKTsNCisJc3ZzX3dyaXRlbChzdnMsIGRlc19jaGFyLCBERVNDSEFSKTsNCisN CisJdGVtcF9jaGFyID0gKChzdnNiLT52Y28gPDwgMTYpICYgR0VOTUFTSygyMywgMTYpKSB8DQor CQkgICAgKChzdnNiLT5tdGRlcyA8PCA4KSAmIEdFTk1BU0soMTUsIDgpKSB8DQorCQkgICAgKHN2 c2ItPmR2dF9maXhlZCAmIEdFTk1BU0soNywgMCkpOw0KKwlzdnNfd3JpdGVsKHN2cywgdGVtcF9j aGFyLCBURU1QQ0hBUik7DQorDQorCWRldF9jaGFyID0gKChzdnNiLT5kY2JkZXQgPDwgOCkgJiBH RU5NQVNLKDE1LCA4KSkgfA0KKwkJICAgKHN2c2ItPmRjbWRldCAmIEdFTk1BU0soNywgMCkpOw0K KwlzdnNfd3JpdGVsKHN2cywgZGV0X2NoYXIsIERFVENIQVIpOw0KKw0KKwlzdnNfd3JpdGVsKHN2 cywgc3ZzYi0+ZGNfY29uZmlnLCBEQ0NPTkZJRyk7DQorCXN2c193cml0ZWwoc3ZzLCBzdnNiLT5h Z2VfY29uZmlnLCBBR0VDT05GSUcpOw0KKw0KKwlpZiAoIXN2c2ItPmFnZW0pIHsNCisJCXN2c193 cml0ZWwoc3ZzLCBSVU5DT05GSUdfREVGQVVMVCwgUlVOQ09ORklHKTsNCisJfSBlbHNlIHsNCisJ CXZhbCA9IDB4MDsNCisNCisJCWZvciAoaSA9IDA7IGkgPCAyNDsgaSArPSAyKSB7DQorCQkJZmls dGVyID0gMHgzIDw8IGk7DQorDQorCQkJaWYgKCEoc3ZzYi0+YWdlX2NvbmZpZyAmIGZpbHRlcikp DQorCQkJCXZhbCB8PSAoMHgxIDw8IGkpOw0KKwkJCWVsc2UNCisJCQkJdmFsIHw9IChzdnNiLT5h Z2VfY29uZmlnICYgZmlsdGVyKTsNCisJCX0NCisJCXN2c193cml0ZWwoc3ZzLCB2YWwsIFJVTkNP TkZJRyk7DQorCX0NCisNCisJc3ZzYi0+b3BzLT5zZXRfZnJlcXNfcGN0KHN2cyk7DQorDQorCWxp bWl0X3ZhbHMgPSAoKHN2c2ItPnZtYXggPDwgMjQpICYgR0VOTUFTSygzMSwgMjQpKSB8DQorCQkg ICAgICgoc3ZzYi0+dm1pbiA8PCAxNikgJiBHRU5NQVNLKDIzLCAxNikpIHwNCisJCSAgICAgKChz dnNiLT5kdGhpIDw8IDgpICYgR0VOTUFTSygxNSwgOCkpIHwNCisJCSAgICAgKHN2c2ItPmR0bG8g JiBHRU5NQVNLKDcsIDApKTsNCisJc3ZzX3dyaXRlbChzdnMsIGxpbWl0X3ZhbHMsIExJTUlUVkFM Uyk7DQorCXN2c193cml0ZWwoc3ZzLCAoc3ZzYi0+dmJvb3QgJiBHRU5NQVNLKDcsIDApKSwgVkJP T1QpOw0KKwlzdnNfd3JpdGVsKHN2cywgKHN2c2ItPmRldF93aW5kb3cgJiBHRU5NQVNLKDE1LCAw KSksIERFVFdJTkRPVyk7DQorCXN2c193cml0ZWwoc3ZzLCAoc3ZzYi0+ZGV0X21heCAmIEdFTk1B U0soMTUsIDApKSwgQ09ORklHKTsNCisNCisJaWYgKHN2c2ItPmNoa19zaGlmdCkNCisJCXN2c193 cml0ZWwoc3ZzLCAoc3ZzYi0+Y2hrX3NoaWZ0ICYgR0VOTUFTSyg3LCAwKSksIENIS1NISUZUKTsN CisNCisJaWYgKHN2c2ItPmN0bDApDQorCQlzdnNfd3JpdGVsKHN2cywgc3ZzYi0+Y3RsMCwgQ1RM MCk7DQorDQorCXN2c193cml0ZWwoc3ZzLCBJTlRTVFNfQ0xFQU4sIElOVFNUUyk7DQorDQorCXN3 aXRjaCAodGFyZ2V0X3BoYXNlKSB7DQorCWNhc2UgU1ZTQl9QSEFTRV9JTklUMDE6DQorCQlzdnNf d3JpdGVsKHN2cywgSU5URU5fSU5JVDB4LCBJTlRFTik7DQorCQlzdnNfd3JpdGVsKHN2cywgU1ZT RU5fSU5JVDAxLCBTVlNFTik7DQorCQlicmVhazsNCisJY2FzZSBTVlNCX1BIQVNFX0lOSVQwMjoN CisJCXN2c193cml0ZWwoc3ZzLCBJTlRFTl9JTklUMHgsIElOVEVOKTsNCisJCWluaXQydmFscyA9 ICgoc3ZzYi0+YWdlX3ZvZmZzZXRfaW4gPDwgMTYpICYgR0VOTUFTSygzMSwgMTYpKSB8DQorCQkJ ICAgIChzdnNiLT5kY192b2Zmc2V0X2luICYgR0VOTUFTSygxNSwgMCkpOw0KKwkJc3ZzX3dyaXRl bChzdnMsIGluaXQydmFscywgSU5JVDJWQUxTKTsNCisJCXN2c193cml0ZWwoc3ZzLCBTVlNFTl9J TklUMDIsIFNWU0VOKTsNCisJCWJyZWFrOw0KKwljYXNlIFNWU0JfUEhBU0VfTU9OOg0KKwkJdHNf Y2FsY3MgPSAoKHN2c2ItPmJ0cyA8PCAxMikgJiBHRU5NQVNLKDIzLCAxMikpIHwNCisJCQkgICAo c3ZzYi0+bXRzICYgR0VOTUFTSygxMSwgMCkpOw0KKwkJc3ZzX3dyaXRlbChzdnMsIHRzX2NhbGNz LCBUU0NBTENTKTsNCisJCXN2c193cml0ZWwoc3ZzLCBJTlRFTl9NT05WT1BFTiwgSU5URU4pOw0K KwkJc3ZzX3dyaXRlbChzdnMsIFNWU0VOX01PTiwgU1ZTRU4pOw0KKwkJYnJlYWs7DQorCWRlZmF1 bHQ6DQorCQlXQVJOX09OKDEpOw0KKwkJYnJlYWs7DQorCX0NCit9DQorDQorc3RhdGljIGlubGlu ZSB2b2lkIHN2c19pbml0MDFfaXNyX2hhbmRsZXIoc3RydWN0IG10a19zdnMgKnN2cykNCit7DQor CXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IHN2cy0+YmFuazsNCisJZW51bSByZWdfaW5kZXggcmdf aTsNCisNCisJcHJfbm90aWNlKCIlczogJXM6IFZETjc0OjB4JTA4eCwgVkROMzA6MHglMDh4LCBE Q1ZBTFVFUzoweCUwOHhcbiIsDQorCQkgIHN2c2ItPm5hbWUsIF9fZnVuY19fLCBzdnNfcmVhZGwo c3ZzLCBWREVTSUdONzQpLA0KKwkJICBzdnNfcmVhZGwoc3ZzLCBWREVTSUdOMzApLCBzdnNfcmVh ZGwoc3ZzLCBEQ1ZBTFVFUykpOw0KKw0KKwlmb3IgKHJnX2kgPSBURU1QTU9OQ1RMMDsgcmdfaSA8 IHJlZ19udW07IHJnX2krKykNCisJCXN2c2ItPnJlZ19kYXRhW1NWU0JfUEhBU0VfSU5JVDAxXVty Z19pXSA9IHN2c19yZWFkbChzdnMsIHJnX2kpOw0KKw0KKwlzdnNiLT5waGFzZSA9IFNWU0JfUEhB U0VfSU5JVDAxOw0KKwlzdnNiLT5kY192b2Zmc2V0X2luID0gfihzdnNfcmVhZGwoc3ZzLCBEQ1ZB TFVFUykgJiBHRU5NQVNLKDE1LCAwKSkgKyAxOw0KKwlpZiAoc3ZzYi0+aW5pdDAxX3ZvbHRfZmxh ZyA9PSBTVlNCX0lOSVQwMV9WT0xUX0lHTk9SRSkNCisJCXN2c2ItPmRjX3ZvZmZzZXRfaW4gPSAw Ow0KKwllbHNlIGlmICgoc3ZzYi0+ZGNfdm9mZnNldF9pbiAmIERDX1NJR05FRF9CSVQpICYmDQor CQkgKHN2c2ItPmluaXQwMV92b2x0X2ZsYWcgPT0gU1ZTQl9JTklUMDFfVk9MVF9JTkNfT05MWSkp DQorCQlzdnNiLT5kY192b2Zmc2V0X2luID0gMDsNCisNCisJc3ZzYi0+YWdlX3ZvZmZzZXRfaW4g PSBzdnNfcmVhZGwoc3ZzLCBBR0VWQUxVRVMpICYgR0VOTUFTSygxNSwgMCk7DQorDQorCXN2c193 cml0ZWwoc3ZzLCBTVlNFTl9PRkYsIFNWU0VOKTsNCisJc3ZzX3dyaXRlbChzdnMsIElOVFNUU19D T01QTEVURSwgSU5UU1RTKTsNCisNCisJLyogc3ZzIGluaXQwMSBjbG9jayBnYXRpbmcgKi8NCisJ c3ZzYi0+Y29yZV9zZWwgJj0gfnN2c2ItPnN5c3RlbWNsa19lbjsNCisJY29tcGxldGUoJnN2c2It PmluaXRfY29tcGxldGlvbik7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdnNfaW5pdDAy X2lzcl9oYW5kbGVyKHN0cnVjdCBtdGtfc3ZzICpzdnMpDQorew0KKwlzdHJ1Y3Qgc3ZzX2Jhbmsg KnN2c2IgPSBzdnMtPmJhbms7DQorCWVudW0gcmVnX2luZGV4IHJnX2k7DQorDQorCXByX25vdGlj ZSgiJXM6ICVzOiBWT1A3NDoweCUwOHgsIFZPUDMwOjB4JTA4eCwgRENWQUxVRVM6MHglMDh4XG4i LA0KKwkJICBzdnNiLT5uYW1lLCBfX2Z1bmNfXywgc3ZzX3JlYWRsKHN2cywgVk9QNzQpLA0KKwkJ ICBzdnNfcmVhZGwoc3ZzLCBWT1AzMCksIHN2c19yZWFkbChzdnMsIERDVkFMVUVTKSk7DQorDQor CWZvciAocmdfaSA9IFRFTVBNT05DVEwwOyByZ19pIDwgcmVnX251bTsgcmdfaSsrKQ0KKwkJc3Zz Yi0+cmVnX2RhdGFbU1ZTQl9QSEFTRV9JTklUMDJdW3JnX2ldID0gc3ZzX3JlYWRsKHN2cywgcmdf aSk7DQorDQorCXN2c2ItPnBoYXNlID0gU1ZTQl9QSEFTRV9JTklUMDI7DQorCXN2c2ItPm9wcy0+ Z2V0X3ZvcHMoc3ZzKTsNCisJbWVtY3B5KHN2c2ItPmluaXQwMl92b2x0cywgc3ZzYi0+dm9sdHMs IHNpemVvZih1MzIpICogc3ZzYi0+b3BwX2NvdW50KTsNCisNCisJc3ZzX3dyaXRlbChzdnMsIFNW U0VOX09GRiwgU1ZTRU4pOw0KKwlzdnNfd3JpdGVsKHN2cywgSU5UU1RTX0NPTVBMRVRFLCBJTlRT VFMpOw0KKw0KKwljb21wbGV0ZSgmc3ZzYi0+aW5pdF9jb21wbGV0aW9uKTsNCit9DQorDQorc3Rh dGljIGlubGluZSB2b2lkIHN2c19tb25fbW9kZV9pc3JfaGFuZGxlcihzdHJ1Y3QgbXRrX3N2cyAq c3ZzKQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gc3ZzLT5iYW5rOw0KKwllbnVtIHJl Z19pbmRleCByZ19pOw0KKw0KKwlmb3IgKHJnX2kgPSBURU1QTU9OQ1RMMDsgcmdfaSA8IHJlZ19u dW07IHJnX2krKykNCisJCXN2c2ItPnJlZ19kYXRhW1NWU0JfUEhBU0VfTU9OXVtyZ19pXSA9IHN2 c19yZWFkbChzdnMsIHJnX2kpOw0KKw0KKwlzdnNiLT5waGFzZSA9IFNWU0JfUEhBU0VfTU9OOw0K KwlzdnNiLT5zdnNfdGVtcCA9IHN2c19yZWFkbChzdnMsIFRFTVApICYgR0VOTUFTSyg3LCAwKTsN CisJc3ZzYi0+b3BzLT5nZXRfdm9wcyhzdnMpOw0KKw0KKwlzdnNfd3JpdGVsKHN2cywgSU5UU1RT X01PTlZPUCwgSU5UU1RTKTsNCit9DQorDQorc3RhdGljIGlubGluZSB2b2lkIHN2c19lcnJvcl9p c3JfaGFuZGxlcihzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19w bGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9 IHN2cy0+YmFuazsNCisJZW51bSByZWdfaW5kZXggcmdfaTsNCisNCisJcHJfZXJyKCIlcygpOiAl cyglcykiLCBfX2Z1bmNfXywgc3ZzcC0+bmFtZSwgc3ZzYi0+bmFtZSk7DQorCXByX2VycigiQ09S RVNFTCgweCV4KSA9IDB4JTA4eFxuIiwNCisJICAgICAgIHN2c3AtPnJlZ3NbQ09SRVNFTF0sIHN2 c19yZWFkbChzdnMsIENPUkVTRUwpKSwNCisJcHJfZXJyKCJTVlNFTigweCV4KSA9IDB4JTA4eCwg SU5UU1RTKDB4JXgpID0gMHglMDh4XG4iLA0KKwkgICAgICAgc3ZzcC0+cmVnc1tTVlNFTl0sIHN2 c19yZWFkbChzdnMsIFNWU0VOKSwNCisJICAgICAgIHN2c3AtPnJlZ3NbSU5UU1RTXSwgc3ZzX3Jl YWRsKHN2cywgSU5UU1RTKSk7DQorCXByX2VycigiU01TVEFURTAoMHgleCkgPSAweCUwOHgsIFNN U1RBVEUxKDB4JXgpID0gMHglMDh4XG4iLA0KKwkgICAgICAgc3ZzcC0+cmVnc1tTTVNUQVRFMF0s IHN2c19yZWFkbChzdnMsIFNNU1RBVEUwKSwNCisJICAgICAgIHN2c3AtPnJlZ3NbU01TVEFURTFd LCBzdnNfcmVhZGwoc3ZzLCBTTVNUQVRFMSkpOw0KKwlwcl9lcnIoIlRFTVAoMHgleCkgPSAweCUw OHgsIFRFTVBNU1IwKDB4JXgpID0gMHglMDh4XG4iLA0KKwkgICAgICAgc3ZzcC0+cmVnc1tURU1Q XSwgc3ZzX3JlYWRsKHN2cywgVEVNUCksDQorCSAgICAgICBzdnNwLT5yZWdzW1RFTVBNU1IwXSwg c3ZzX3JlYWRsKHN2cywgVEVNUE1TUjApKTsNCisJcHJfZXJyKCJURU1QTVNSMSgweCV4KSA9IDB4 JTA4eCwgVEVNUE1TUjIoMHgleCkgPSAweCUwOHhcbiIsDQorCSAgICAgICBzdnNwLT5yZWdzW1RF TVBNU1IxXSwgc3ZzX3JlYWRsKHN2cywgVEVNUE1TUjEpLA0KKwkgICAgICAgc3ZzcC0+cmVnc1tU RU1QTVNSMl0sIHN2c19yZWFkbChzdnMsIFRFTVBNU1IyKSk7DQorCXByX2VycigiVEVNUE1PTkNU TDAoMHgleCkgPSAweCUwOHgsIFRFTVBNU1JDVEwxKDB4JXgpID0gMHglMDh4XG4iLA0KKwkgICAg ICAgc3ZzcC0+cmVnc1tURU1QTU9OQ1RMMF0sIHN2c19yZWFkbChzdnMsIFRFTVBNT05DVEwwKSwN CisJICAgICAgIHN2c3AtPnJlZ3NbVEVNUE1TUkNUTDFdLCBzdnNfcmVhZGwoc3ZzLCBURU1QTVNS Q1RMMSkpOw0KKw0KKwlmb3IgKHJnX2kgPSBURU1QTU9OQ1RMMDsgcmdfaSA8IHJlZ19udW07IHJn X2krKykNCisJCXN2c2ItPnJlZ19kYXRhW1NWU0JfUEhBU0VfTU9OXVtyZ19pXSA9IHN2c19yZWFk bChzdnMsIHJnX2kpOw0KKw0KKwlzdnNiLT5tb2RlX3N1cHBvcnQgPSBTVlNCX01PREVfQUxMX0RJ U0FCTEU7DQorDQorCWlmIChzdnNiLT5waGFzZSAhPSBTVlNCX1BIQVNFX0lOSVQwMSkNCisJCXN2 c2ItPnBoYXNlID0gU1ZTQl9QSEFTRV9FUlJPUjsNCisNCisJc3ZzX3dyaXRlbChzdnMsIFNWU0VO X09GRiwgU1ZTRU4pOw0KKwlzdnNfd3JpdGVsKHN2cywgSU5UU1RTX0NMRUFOLCBJTlRTVFMpOw0K K30NCisNCitzdGF0aWMgaXJxcmV0dXJuX3Qgc3ZzX2lzcihpbnQgaXJxLCB2b2lkICpkYXRhKQ0K K3sNCisJc3RydWN0IG10a19zdnMgKnN2cyA9IChzdHJ1Y3QgbXRrX3N2cyAqKWRhdGE7DQorCWNv bnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0KKwlzdHJ1Y3Qg c3ZzX2JhbmsgKnN2c2IgPSBOVUxMOw0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KKwl1MzIgaWR4 LCBpbnRfc3RzLCBzdnNfZW47DQorDQorCWZsYWdzID0gY2xhaW1fbXRrX3N2c19sb2NrKCk7DQor CWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0g JnN2c3AtPmJhbmtzW2lkeF07DQorCQlzdnMtPmJhbmsgPSBzdnNiOw0KKw0KKwkJaWYgKHN2c2It PmludF9zdCAmIHN2c19yZWFkbChzdnMsIElOVFNUKSkNCisJCQljb250aW51ZTsNCisNCisJCWlm ICghc3ZzYi0+c3VzcGVuZGVkKSB7DQorCQkJc3ZzX3N3aXRjaF9iYW5rKHN2cyk7DQorCQkJaW50 X3N0cyA9IHN2c19yZWFkbChzdnMsIElOVFNUUyk7DQorCQkJc3ZzX2VuID0gc3ZzX3JlYWRsKHN2 cywgU1ZTRU4pOw0KKw0KKwkJCWlmIChpbnRfc3RzID09IElOVFNUU19DT01QTEVURSAmJg0KKwkJ CSAgICAoKHN2c19lbiAmIFNWU0VOX01BU0spID09IFNWU0VOX0lOSVQwMSkpDQorCQkJCXN2c19p bml0MDFfaXNyX2hhbmRsZXIoc3ZzKTsNCisJCQllbHNlIGlmICgoaW50X3N0cyA9PSBJTlRTVFNf Q09NUExFVEUpICYmDQorCQkJCSAoKHN2c19lbiAmIFNWU0VOX01BU0spID09IFNWU0VOX0lOSVQw MikpDQorCQkJCXN2c19pbml0MDJfaXNyX2hhbmRsZXIoc3ZzKTsNCisJCQllbHNlIGlmICghIShp bnRfc3RzICYgSU5UU1RTX01PTlZPUCkpDQorCQkJCXN2c19tb25fbW9kZV9pc3JfaGFuZGxlcihz dnMpOw0KKwkJCWVsc2UNCisJCQkJc3ZzX2Vycm9yX2lzcl9oYW5kbGVyKHN2cyk7DQorCQl9DQor DQorCQlicmVhazsNCisJfQ0KKwlyZWxlYXNlX210a19zdnNfbG9jayhmbGFncyk7DQorDQorCWlm IChzdnNiLT5waGFzZSAhPSBTVlNCX1BIQVNFX0lOSVQwMSkNCisJCXN2c2Jfc2V0X3ZvbHRzKHN2 c2IsIGZhbHNlKTsNCisNCisJcmV0dXJuIElSUV9IQU5ETEVEOw0KK30NCisNCitzdGF0aWMgdm9p ZCBzdnNfbW9uX21vZGUoc3RydWN0IG10a19zdnMgKnN2cykNCit7DQorCWNvbnN0IHN0cnVjdCBz dnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2 c2I7DQorCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQorCXUzMiBpZHg7DQorDQorCWZsYWdzID0gY2xh aW1fbXRrX3N2c19sb2NrKCk7DQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07 IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlzdnMtPmJhbmsgPSBz dnNiOw0KKw0KKwkJaWYgKCEoc3ZzYi0+bW9kZV9zdXBwb3J0ICYgU1ZTQl9NT0RFX01PTikpDQor CQkJY29udGludWU7DQorDQorCQlzdnNfc2V0X3BoYXNlKHN2cywgU1ZTQl9QSEFTRV9NT04pOw0K Kwl9DQorCXJlbGVhc2VfbXRrX3N2c19sb2NrKGZsYWdzKTsNCit9DQorDQorc3RhdGljIGludCBz dnNfaW5pdDAyKHN0cnVjdCBtdGtfc3ZzICpzdnMpDQorew0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3Bs YXRmb3JtICpzdnNwID0gc3ZzLT5wbGF0Zm9ybTsNCisJc3RydWN0IHN2c19iYW5rICpzdnNiOw0K Kwl1bnNpZ25lZCBsb25nIGZsYWdzLCB0aW1lX2xlZnQ7DQorCXUzMiBpZHg7DQorDQorCWZvciAo aWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQorCQlzdnNiID0gJnN2c3At PmJhbmtzW2lkeF07DQorCQlzdnMtPmJhbmsgPSBzdnNiOw0KKw0KKwkJaWYgKCEoc3ZzYi0+bW9k ZV9zdXBwb3J0ICYgU1ZTQl9NT0RFX0lOSVQwMikpDQorCQkJY29udGludWU7DQorDQorCQlyZWlu aXRfY29tcGxldGlvbigmc3ZzYi0+aW5pdF9jb21wbGV0aW9uKTsNCisJCWZsYWdzID0gY2xhaW1f bXRrX3N2c19sb2NrKCk7DQorCQlzdnNfc2V0X3BoYXNlKHN2cywgU1ZTQl9QSEFTRV9JTklUMDIp Ow0KKwkJcmVsZWFzZV9tdGtfc3ZzX2xvY2soZmxhZ3MpOw0KKwkJdGltZV9sZWZ0ID0NCisJCQl3 YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnN2c2ItPmluaXRfY29tcGxldGlvbiwNCisJCQkJ CQkgICAgbXNlY3NfdG9famlmZmllcygyMDAwKSk7DQorCQlpZiAoIXRpbWVfbGVmdCkgew0KKwkJ CXByX2VycigiJXM6IGluaXQwMiBjb21wbGV0aW9uIHRpbWVvdXRcbiIsIHN2c2ItPm5hbWUpOw0K KwkJCXJldHVybiAtRUJVU1k7DQorCQl9DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0 YXRpYyBpbnQgc3ZzX2luaXQwMShzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3Ry dWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBzdnNfYmFu ayAqc3ZzYjsNCisJc3RydWN0IHBtX3Fvc19yZXF1ZXN0ICpxb3NfcmVxdWVzdDsNCisJdW5zaWdu ZWQgbG9uZyBmbGFncywgdGltZV9sZWZ0Ow0KKwlib29sIHNlYXJjaF9kb25lOw0KKwlpbnQgcmV0 ID0gLUVQRVJNOw0KKwl1MzIgb3BwX2ZyZXFzLCBvcHBfdmJvb3QsIGJ1Y2tfdm9sdCwgaWR4LCBp Ow0KKw0KKwlxb3NfcmVxdWVzdCA9IGt6YWxsb2Moc2l6ZW9mKCpxb3NfcmVxdWVzdCksIEdGUF9L RVJORUwpOw0KKwlpZiAoIXFvc19yZXF1ZXN0KQ0KKwkJcmV0dXJuIC1FTk9NRU07DQorDQorCS8q IExldCBDUFVzIGxlYXZlIGlkbGUtb2ZmIHN0YXRlIGZvciBpbml0aWFsaXppbmcgc3ZzX2luaXQw MS4gKi8NCisJY3B1X2xhdGVuY3lfcW9zX2FkZF9yZXF1ZXN0KHFvc19yZXF1ZXN0LCAwKTsNCisN CisJLyoNCisJICogU29tZXRpbWVzIHR3byBzdnMgYmFua3MgdXNlIHRoZSBzYW1lIGJ1Y2suDQor CSAqIFRoZXJlZm9yZSwgd2Ugc2V0IGVhY2ggc3ZzIGJhbmsgdG8gdmJvb3Qgdm9sdGFnZSBmaXJz dC4NCisJICovDQorCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7 DQorCQlzdnNiID0gJnN2c3AtPmJhbmtzW2lkeF07DQorCQlzZWFyY2hfZG9uZSA9IGZhbHNlOw0K Kw0KKwkJcmV0ID0gcmVndWxhdG9yX3NldF9tb2RlKHN2c2ItPmJ1Y2ssIFJFR1VMQVRPUl9NT0RF X0ZBU1QpOw0KKwkJaWYgKHJldCkNCisJCQlwcl9ub3RpY2UoIiVzOiBmYWlsIHRvIHNldCBmYXN0 IG1vZGU6ICVkXG4iLA0KKwkJCQkgIHN2c2ItPm5hbWUsIHJldCk7DQorDQorCQlpZiAoc3ZzYi0+ bXRjbW9zX3JlcXVlc3QpIHsNCisJCQlyZXQgPSByZWd1bGF0b3JfZW5hYmxlKHN2c2ItPmJ1Y2sp Ow0KKwkJCWlmIChyZXQpIHsNCisJCQkJcHJfZXJyKCIlczogZmFpbCB0byBlbmFibGUgJXMgcG93 ZXI6ICVkXG4iLA0KKwkJCQkgICAgICAgc3ZzYi0+bmFtZSwgc3ZzYi0+YnVja19uYW1lLCByZXQp Ow0KKwkJCQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQkJfQ0KKw0KKwkJCXJldCA9IGRldl9wbV9k b21haW5fYXR0YWNoKHN2c2ItPmRldiwgZmFsc2UpOw0KKwkJCWlmIChyZXQpIHsNCisJCQkJcHJf ZXJyKCIlczogYXR0YWNoIHBtIGRvbWFpbiBmYWlsOiAlZFxuIiwNCisJCQkJICAgICAgIHN2c2It Pm5hbWUsIHJldCk7DQorCQkJCWdvdG8gaW5pdDAxX2ZpbmlzaDsNCisJCQl9DQorDQorCQkJcG1f cnVudGltZV9lbmFibGUoc3ZzYi0+ZGV2KTsNCisJCQlyZXQgPSBwbV9ydW50aW1lX2dldF9zeW5j KHN2c2ItPmRldik7DQorCQkJaWYgKHJldCA8IDApIHsNCisJCQkJcHJfZXJyKCIlczogdHVybiBt dGNtb3Mgb24gZmFpbDogJWRcbiIsDQorCQkJCSAgICAgICBzdnNiLT5uYW1lLCByZXQpOw0KKwkJ CQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQkJfQ0KKwkJfQ0KKw0KKwkJLyoNCisJCSAqIEZpbmQg dGhlIGZhc3Rlc3QgZnJlcSB0aGF0IGNhbiBiZSBydW4gYXQgdmJvb3QgYW5kDQorCQkgKiBmaXgg dG8gdGhhdCBmcmVxIHVudGlsIHN2c19pbml0MDEgaXMgZG9uZS4NCisJCSAqLw0KKwkJb3BwX3Zi b290ID0gc3ZzYl92b2x0X3RvX29wcF92b2x0KHN2c2ItPnZib290LA0KKwkJCQkJCSAgc3ZzYi0+ dm9sdF9zdGVwLA0KKwkJCQkJCSAgc3ZzYi0+dm9sdF9iYXNlKTsNCisNCisJCWZvciAoaSA9IDA7 IGkgPCBzdnNiLT5vcHBfY291bnQ7IGkrKykgew0KKwkJCW9wcF9mcmVxcyA9IHN2c2ItPm9wcF9m cmVxc1tpXTsNCisJCQlpZiAoIXNlYXJjaF9kb25lICYmIHN2c2ItPm9wcF92b2x0c1tpXSA8PSBv cHBfdmJvb3QpIHsNCisJCQkJcmV0ID0gZGV2X3BtX29wcF9hZGp1c3Rfdm9sdGFnZShzdnNiLT5k ZXYsDQorCQkJCQkJCQlvcHBfZnJlcXMsDQorCQkJCQkJCQlvcHBfdmJvb3QsDQorCQkJCQkJCQlv cHBfdmJvb3QsDQorCQkJCQkJCQlvcHBfdmJvb3QpOw0KKwkJCQlpZiAocmV0KSB7DQorCQkJCQlw cl9lcnIoIiVzOiBzZXQgdm9sdGFnZSBmYWlsZWQ6ICVkXG4iLA0KKwkJCQkJICAgICAgIHN2c2It Pm5hbWUsIHJldCk7DQorCQkJCQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQkJCX0NCisNCisJCQkJ c2VhcmNoX2RvbmUgPSB0cnVlOw0KKwkJCX0gZWxzZSB7DQorCQkJCWRldl9wbV9vcHBfZGlzYWJs ZShzdnNiLT5kZXYsDQorCQkJCQkJICAgc3ZzYi0+b3BwX2ZyZXFzW2ldKTsNCisJCQl9DQorCQl9 DQorCX0NCisNCisJLyogc3ZzIGJhbmsgaW5pdDAxIGJlZ2lucyAqLw0KKwlmb3IgKGlkeCA9IDA7 IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tp ZHhdOw0KKwkJc3ZzLT5iYW5rID0gc3ZzYjsNCisNCisJCWlmICghKHN2c2ItPm1vZGVfc3VwcG9y dCAmIFNWU0JfTU9ERV9JTklUMDEpKQ0KKwkJCWNvbnRpbnVlOw0KKw0KKwkJb3BwX3Zib290ID0g c3ZzYl92b2x0X3RvX29wcF92b2x0KHN2c2ItPnZib290LA0KKwkJCQkJCSAgc3ZzYi0+dm9sdF9z dGVwLA0KKwkJCQkJCSAgc3ZzYi0+dm9sdF9iYXNlKTsNCisNCisJCWJ1Y2tfdm9sdCA9IHJlZ3Vs YXRvcl9nZXRfdm9sdGFnZShzdnNiLT5idWNrKTsNCisJCWlmIChidWNrX3ZvbHQgIT0gb3BwX3Zi b290KSB7DQorCQkJcHJfZXJyKCIlczogYnVjayB2b2x0YWdlOiAldSwgZXhwZWN0ZWQgdmJvb3Q6 ICV1XG4iLA0KKwkJCSAgICAgICBzdnNiLT5uYW1lLCBidWNrX3ZvbHQsIG9wcF92Ym9vdCk7DQor CQkJcmV0ID0gLUVQRVJNOw0KKwkJCWdvdG8gaW5pdDAxX2ZpbmlzaDsNCisJCX0NCisNCisJCWlu aXRfY29tcGxldGlvbigmc3ZzYi0+aW5pdF9jb21wbGV0aW9uKTsNCisJCWZsYWdzID0gY2xhaW1f bXRrX3N2c19sb2NrKCk7DQorCQlzdnNfc2V0X3BoYXNlKHN2cywgU1ZTQl9QSEFTRV9JTklUMDEp Ow0KKwkJcmVsZWFzZV9tdGtfc3ZzX2xvY2soZmxhZ3MpOw0KKwkJdGltZV9sZWZ0ID0NCisJCQl3 YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJnN2c2ItPmluaXRfY29tcGxldGlvbiwNCisJCQkJ CQkgICAgbXNlY3NfdG9famlmZmllcygyMDAwKSk7DQorCQlpZiAoIXRpbWVfbGVmdCkgew0KKwkJ CXByX2VycigiJXM6IGluaXQwMSBjb21wbGV0aW9uIHRpbWVvdXRcbiIsIHN2c2ItPm5hbWUpOw0K KwkJCXJldCA9IC1FQlVTWTsNCisJCQlnb3RvIGluaXQwMV9maW5pc2g7DQorCQl9DQorCX0NCisN Citpbml0MDFfZmluaXNoOg0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBp ZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKw0KKwkJZm9yIChpID0gMDsg aSA8IHN2c2ItPm9wcF9jb3VudDsgaSsrKQ0KKwkJCWRldl9wbV9vcHBfZW5hYmxlKHN2c2ItPmRl diwgc3ZzYi0+b3BwX2ZyZXFzW2ldKTsNCisNCisJCWlmIChyZWd1bGF0b3Jfc2V0X21vZGUoc3Zz Yi0+YnVjaywgUkVHVUxBVE9SX01PREVfTk9STUFMKSkNCisJCQlwcl9ub3RpY2UoIiVzOiBmYWls IHRvIHNldCBub3JtYWwgbW9kZTogJWRcbiIsDQorCQkJCSAgc3ZzYi0+bmFtZSwgcmV0KTsNCisN CisJCWlmIChzdnNiLT5tdGNtb3NfcmVxdWVzdCkgew0KKwkJCWlmIChwbV9ydW50aW1lX3B1dF9z eW5jKHN2c2ItPmRldikpDQorCQkJCXByX2VycigiJXM6IHR1cm4gbXRjbW9zIG9mZiBmYWlsOiAl ZFxuIiwNCisJCQkJICAgICAgIHN2c2ItPm5hbWUsIHJldCk7DQorCQkJcG1fcnVudGltZV9kaXNh YmxlKHN2c2ItPmRldik7DQorCQkJZGV2X3BtX2RvbWFpbl9kZXRhY2goc3ZzYi0+ZGV2LCAwKTsN CisJCQlpZiAocmVndWxhdG9yX2Rpc2FibGUoc3ZzYi0+YnVjaykpDQorCQkJCXByX2VycigiJXM6 IGZhaWwgdG8gZGlzYWJsZSAlcyBwb3dlcjogJWRcbiIsDQorCQkJCSAgICAgICBzdnNiLT5uYW1l LCBzdnNiLT5idWNrX25hbWUsIHJldCk7DQorCQl9DQorCX0NCisNCisJY3B1X2xhdGVuY3lfcW9z X3JlbW92ZV9yZXF1ZXN0KHFvc19yZXF1ZXN0KTsNCisJa2ZyZWUocW9zX3JlcXVlc3QpOw0KKw0K KwlyZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgaW50IHN2c19zdGFydChzdHJ1Y3QgbXRrX3N2 cyAqc3ZzKQ0KK3sNCisJaW50IHJldDsNCisNCisJcmV0ID0gc3ZzX2luaXQwMShzdnMpOw0KKwlp ZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJcmV0ID0gc3ZzX2luaXQwMihzdnMpOw0KKwlp ZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJc3ZzX21vbl9tb2RlKHN2cyk7DQorDQorCXJl dHVybiByZXQ7DQorfQ0KKw0KK3N0YXRpYyBib29sIHN2c19tdDgxODNfZWZ1c2VfcGFyc2luZyhz dHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3Zz cCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCB0aGVybWFsX3BhcmFtZXRlciB0cDsNCisJc3Ry dWN0IHN2c19iYW5rICpzdnNiOw0KKwlib29sIG1vbl9tb2RlX3N1cHBvcnQgPSB0cnVlOw0KKwlp bnQgZm9ybWF0WzZdLCB4X3Jvb210WzZdLCB0Yl9yb29tdCA9IDA7DQorCXN0cnVjdCBudm1lbV9j ZWxsICpjZWxsOw0KKwlzaXplX3QgbGVuOw0KKwl1MzIgaWR4LCBpLCBmdF9wZ20sIG10cywgdGVt cDAsIHRlbXAxLCB0ZW1wMjsNCisNCisJaWYgKHN2c3AtPmZha2VfZWZ1c2UpIHsNCisJCXByX25v dGljZSgiZmFrZSBlZnVzZVxuIik7DQorCQlzdnMtPmVmdXNlWzBdID0gMHgwMDMxMDA4MDsNCisJ CXN2cy0+ZWZ1c2VbMV0gPSAweGFiZmJmNzU3Ow0KKwkJc3ZzLT5lZnVzZVsyXSA9IDB4NDdjNzQ3 Yzc7DQorCQlzdnMtPmVmdXNlWzNdID0gMHhhYmZiZjc1NzsNCisJCXN2cy0+ZWZ1c2VbNF0gPSAw eGU3ZmNhMGVjOw0KKwkJc3ZzLT5lZnVzZVs1XSA9IDB4NDdiZjRiODg7DQorCQlzdnMtPmVmdXNl WzZdID0gMHhhYmZiOGZhNTsNCisJCXN2cy0+ZWZ1c2VbN10gPSAweGFiZmIyMTdiOw0KKwkJc3Zz LT5lZnVzZVs4XSA9IDB4NGJmMzRiZTE7DQorCQlzdnMtPmVmdXNlWzldID0gMHhhYmZiNjcwZDsN CisJCXN2cy0+ZWZ1c2VbMTZdID0gMHhhYmZiYzY1MzsNCisJCXN2cy0+ZWZ1c2VbMTddID0gMHg0 N2YzNDdlMTsNCisJCXN2cy0+ZWZ1c2VbMThdID0gMHhhYmZiZDg0ODsNCisJfQ0KKw0KKwlmb3Ig KGkgPSAwOyBpIDwgc3ZzcC0+ZWZ1c2VfbnVtOyBpKyspDQorCQlpZiAoc3ZzLT5lZnVzZVtpXSkN CisJCQlwcl9ub3RpY2UoIk1fSFdfUkVTJWQ6IDB4JTA4eFxuIiwgaSwgc3ZzLT5lZnVzZVtpXSk7 DQorDQorCS8qIHN2cyBlZnVzZSBwYXJzaW5nICovDQorCWZ0X3BnbSA9IChzdnMtPmVmdXNlWzBd ID4+IDQpICYgR0VOTUFTSygzLCAwKTsNCisNCisJZm9yIChpZHggPSAwOyBpZHggPCBzdnNwLT5i YW5rX251bTsgaWR4KyspIHsNCisJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJCWlmIChm dF9wZ20gPD0gMSkNCisJCQlzdnNiLT5pbml0MDFfdm9sdF9mbGFnID0gU1ZTQl9JTklUMDFfVk9M VF9JR05PUkU7DQorDQorCQlzd2l0Y2ggKHN2c2ItPnN3X2lkKSB7DQorCQljYXNlIFNWU19DUFVf TElUVExFOg0KKwkJCXN2c2ItPmJkZXMgPSBzdnMtPmVmdXNlWzE2XSAmIEdFTk1BU0soNywgMCk7 DQorCQkJc3ZzYi0+bWRlcyA9IChzdnMtPmVmdXNlWzE2XSA+PiA4KSAmIEdFTk1BU0soNywgMCk7 DQorCQkJc3ZzYi0+ZGNiZGV0ID0gKHN2cy0+ZWZ1c2VbMTZdID4+IDE2KSAmIEdFTk1BU0soNywg MCk7DQorCQkJc3ZzYi0+ZGNtZGV0ID0gKHN2cy0+ZWZ1c2VbMTZdID4+IDI0KSAmIEdFTk1BU0so NywgMCk7DQorCQkJc3ZzYi0+bXRkZXMgID0gKHN2cy0+ZWZ1c2VbMTddID4+IDE2KSAmIEdFTk1B U0soNywgMCk7DQorDQorCQkJaWYgKGZ0X3BnbSA8PSAzKQ0KKwkJCQlzdnNiLT52b2x0X29mZnNl dCArPSAxMDsNCisJCQllbHNlDQorCQkJCXN2c2ItPnZvbHRfb2Zmc2V0ICs9IDI7DQorCQkJYnJl YWs7DQorCQljYXNlIFNWU19DUFVfQklHOg0KKwkJCXN2c2ItPmJkZXMgPSBzdnMtPmVmdXNlWzE4 XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bWRlcyA9IChzdnMtPmVmdXNlWzE4XSA+PiA4 KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNiZGV0ID0gKHN2cy0+ZWZ1c2VbMThdID4+ IDE2KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+ZGNtZGV0ID0gKHN2cy0+ZWZ1c2VbMThd ID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bXRkZXMgID0gc3ZzLT5lZnVzZVsx N10gJiBHRU5NQVNLKDcsIDApOw0KKw0KKwkJCWlmIChmdF9wZ20gPD0gMykNCisJCQkJc3ZzYi0+ dm9sdF9vZmZzZXQgKz0gMTU7DQorCQkJZWxzZQ0KKwkJCQlzdnNiLT52b2x0X29mZnNldCArPSAx MjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0NDSToNCisJCQlzdnNiLT5iZGVzID0gc3ZzLT5l ZnVzZVs0XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bWRlcyA9IChzdnMtPmVmdXNlWzRd ID4+IDgpICYgR0VOTUFTSyg3LCAwKTsNCisJCQlzdnNiLT5kY2JkZXQgPSAoc3ZzLT5lZnVzZVs0 XSA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPmRjbWRldCA9IChzdnMtPmVmdXNl WzRdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bXRkZXMgID0gKHN2cy0+ZWZ1 c2VbNV0gPj4gMTYpICYgR0VOTUFTSyg3LCAwKTsNCisNCisJCQlpZiAoZnRfcGdtIDw9IDMpDQor CQkJCXN2c2ItPnZvbHRfb2Zmc2V0ICs9IDEwOw0KKwkJCWVsc2UNCisJCQkJc3ZzYi0+dm9sdF9v ZmZzZXQgKz0gMjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0dQVToNCisJCQlzdnNiLT5iZGVz ID0gc3ZzLT5lZnVzZVs2XSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bWRlcyA9IChzdnMt PmVmdXNlWzZdID4+IDgpICYgR0VOTUFTSyg3LCAwKTsNCisJCQlzdnNiLT5kY2JkZXQgPSAoc3Zz LT5lZnVzZVs2XSA+PiAxNikgJiBHRU5NQVNLKDcsIDApOw0KKwkJCXN2c2ItPmRjbWRldCA9IChz dnMtPmVmdXNlWzZdID4+IDI0KSAmIEdFTk1BU0soNywgMCk7DQorCQkJc3ZzYi0+bXRkZXMgID0g c3ZzLT5lZnVzZVs1XSAmIEdFTk1BU0soNywgMCk7DQorDQorCQkJaWYgKGZ0X3BnbSA+PSAyKSB7 DQorCQkJCXN2c2ItPmZyZXFfYmFzZSA9IDgwMDAwMDAwMDsgLyogODAwTUh6ICovDQorCQkJCXN2 c2ItPmR2dF9maXhlZCA9IDI7DQorCQkJfQ0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQli cmVhazsNCisJCX0NCisJfQ0KKw0KKwlpZiAoc3ZzcC0+ZmFrZV9lZnVzZSkgew0KKwkJc3ZzLT50 aGVybWFsX2VmdXNlWzBdID0gMHgwMjg3M2Y2OTsNCisJCXN2cy0+dGhlcm1hbF9lZnVzZVsxXSA9 IDB4YTExZDkxNDI7DQorCQlzdnMtPnRoZXJtYWxfZWZ1c2VbMl0gPSAweGEyNTI2OTAwOw0KKwl9 IGVsc2Ugew0KKwkJLyogR2V0IHRoZXJtYWwgZWZ1c2UgYnkgbnZtZW0gKi8NCisJCWNlbGwgPSBu dm1lbV9jZWxsX2dldChzdnMtPmRldiwgImNhbGlicmF0aW9uLWRhdGEiKTsNCisJCWlmIChJU19F UlIoY2VsbCkpIHsNCisJCQlwcl9lcnIoIm5vIHRoZXJtYWwgZWZ1c2U/IGRpc2FibGUgbW9uIG1v ZGVcbiIpOw0KKwkJCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7 DQorCQkJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJCQkJc3ZzYi0+bW9kZV9zdXBwb3J0 ICY9IH5TVlNCX01PREVfTU9OOw0KKwkJCX0NCisNCisJCQlyZXR1cm4gdHJ1ZTsNCisJCX0NCisN CisJCXN2cy0+dGhlcm1hbF9lZnVzZSA9ICh1MzIgKiludm1lbV9jZWxsX3JlYWQoY2VsbCwgJmxl bik7DQorCQludm1lbV9jZWxsX3B1dChjZWxsKTsNCisJfQ0KKw0KKwkvKiBUaGVybWFsIGVmdXNl IHBhcnNpbmcgKi8NCisJdHAuYWRjX2dlX3QgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzFdID4+IDIy KSAmIEdFTk1BU0soOSwgMCk7DQorCXRwLmFkY19vZV90ID0gKHN2cy0+dGhlcm1hbF9lZnVzZVsx XSA+PiAxMikgJiBHRU5NQVNLKDksIDApOw0KKw0KKwl0cC5vX3Z0c21jdTEgPSAoc3ZzLT50aGVy bWFsX2VmdXNlWzBdID4+IDE3KSAmIEdFTk1BU0soOCwgMCk7DQorCXRwLm9fdnRzbWN1MiA9IChz dnMtPnRoZXJtYWxfZWZ1c2VbMF0gPj4gOCkgJiBHRU5NQVNLKDgsIDApOw0KKwl0cC5vX3Z0c21j dTMgPSBzdnMtPnRoZXJtYWxfZWZ1c2VbMV0gJiBHRU5NQVNLKDgsIDApOw0KKwl0cC5vX3Z0c21j dTQgPSAoc3ZzLT50aGVybWFsX2VmdXNlWzJdID4+IDIzKSAmIEdFTk1BU0soOCwgMCk7DQorCXRw Lm9fdnRzbWN1NSA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMl0gPj4gNSkgJiBHRU5NQVNLKDgsIDAp Ow0KKwl0cC5vX3Z0c2FiYiA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMl0gPj4gMTQpICYgR0VOTUFT Syg4LCAwKTsNCisNCisJdHAuZGVnY19jYWxpID0gKHN2cy0+dGhlcm1hbF9lZnVzZVswXSA+PiAx KSAmIEdFTk1BU0soNSwgMCk7DQorCXRwLmFkY19jYWxpX2VuX3QgPSBzdnMtPnRoZXJtYWxfZWZ1 c2VbMF0gJiBCSVQoMCk7DQorCXRwLm9fc2xvcGVfc2lnbiA9IChzdnMtPnRoZXJtYWxfZWZ1c2Vb MF0gPj4gNykgJiBCSVQoMCk7DQorDQorCXRwLnRzX2lkID0gKHN2cy0+dGhlcm1hbF9lZnVzZVsx XSA+PiA5KSAmIEJJVCgwKTsNCisJdHAub19zbG9wZSA9IChzdnMtPnRoZXJtYWxfZWZ1c2VbMF0g Pj4gMjYpICYgR0VOTUFTSyg1LCAwKTsNCisNCisJaWYgKHRwLmFkY19jYWxpX2VuX3QgPT0gMSkg ew0KKwkJaWYgKCF0cC50c19pZCkNCisJCQl0cC5vX3Nsb3BlID0gMDsNCisNCisJCWlmICgodHAu YWRjX2dlX3QgPCAyNjUgfHwgdHAuYWRjX2dlX3QgPiA3NTgpIHx8DQorCQkgICAgKHRwLmFkY19v ZV90IDwgMjY1IHx8IHRwLmFkY19vZV90ID4gNzU4KSB8fA0KKwkJICAgICh0cC5vX3Z0c21jdTEg PCAtOCB8fCB0cC5vX3Z0c21jdTEgPiA0ODQpIHx8DQorCQkgICAgKHRwLm9fdnRzbWN1MiA8IC04 IHx8IHRwLm9fdnRzbWN1MiA+IDQ4NCkgfHwNCisJCSAgICAodHAub192dHNtY3UzIDwgLTggfHwg dHAub192dHNtY3UzID4gNDg0KSB8fA0KKwkJICAgICh0cC5vX3Z0c21jdTQgPCAtOCB8fCB0cC5v X3Z0c21jdTQgPiA0ODQpIHx8DQorCQkgICAgKHRwLm9fdnRzbWN1NSA8IC04IHx8IHRwLm9fdnRz bWN1NSA+IDQ4NCkgfHwNCisJCSAgICAodHAub192dHNhYmIgPCAtOCB8fCB0cC5vX3Z0c2FiYiA+ IDQ4NCkgfHwNCisJCSAgICAodHAuZGVnY19jYWxpIDwgMSB8fCB0cC5kZWdjX2NhbGkgPiA2Mykp IHsNCisJCQlwcl9lcnIoImJhZCB0aGVybWFsIGVmdXNlIGRhdGEsIGRpc2FibGUgbW9uIG1vZGVc biIpOw0KKwkJCW1vbl9tb2RlX3N1cHBvcnQgPSBmYWxzZTsNCisJCX0NCisJfSBlbHNlIHsNCisJ CXByX2Vycigibm8gdGhlcm1hbCBlZnVzZSBkYXRhLCBkaXNhYmxlIG1vbiBtb2RlXG4iKTsNCisJ CW1vbl9tb2RlX3N1cHBvcnQgPSBmYWxzZTsNCisJfQ0KKw0KKwlpZiAoIW1vbl9tb2RlX3N1cHBv cnQpIHsNCisJCWZvciAoaWR4ID0gMDsgaWR4IDwgc3ZzcC0+YmFua19udW07IGlkeCsrKSB7DQor CQkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJCXN2c2ItPm1vZGVfc3VwcG9ydCAmPSB+ U1ZTQl9NT0RFX01PTjsNCisJCX0NCisNCisJCXJldHVybiB0cnVlOw0KKwl9DQorDQorCXRwLmdl ID0gKCh0cC5hZGNfZ2VfdCAtIDUxMikgKiAxMDAwMCkgLyA0MDk2Ow0KKwl0cC5vZSA9ICh0cC5h ZGNfb2VfdCAtIDUxMik7DQorCXRwLmdhaW4gPSAoMTAwMDAgKyB0cC5nZSk7DQorDQorCWZvcm1h dFswXSA9ICh0cC5vX3Z0c21jdTEgKyAzMzUwIC0gdHAub2UpOw0KKwlmb3JtYXRbMV0gPSAodHAu b192dHNtY3UyICsgMzM1MCAtIHRwLm9lKTsNCisJZm9ybWF0WzJdID0gKHRwLm9fdnRzbWN1MyAr IDMzNTAgLSB0cC5vZSk7DQorCWZvcm1hdFszXSA9ICh0cC5vX3Z0c21jdTQgKyAzMzUwIC0gdHAu b2UpOw0KKwlmb3JtYXRbNF0gPSAodHAub192dHNtY3U1ICsgMzM1MCAtIHRwLm9lKTsNCisJZm9y bWF0WzVdID0gKHRwLm9fdnRzYWJiICsgMzM1MCAtIHRwLm9lKTsNCisNCisJZm9yIChpID0gMDsg aSA8IDY7IGkrKykNCisJCXhfcm9vbXRbaV0gPSAoKChmb3JtYXRbaV0gKiAxMDAwMCkgLyA0MDk2 KSAqIDEwMDAwKSAvIHRwLmdhaW47DQorDQorCXRlbXAwID0gKDEwMDAwICogMTAwMDAwIC8gdHAu Z2FpbikgKiAxNSAvIDE4Ow0KKw0KKwlpZiAoIXRwLm9fc2xvcGVfc2lnbikNCisJCW10cyA9ICh0 ZW1wMCAqIDEwKSAvICgxNTM0ICsgdHAub19zbG9wZSAqIDEwKTsNCisJZWxzZQ0KKwkJbXRzID0g KHRlbXAwICogMTApIC8gKDE1MzQgLSB0cC5vX3Nsb3BlICogMTApOw0KKw0KKwlmb3IgKGlkeCA9 IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5r c1tpZHhdOw0KKwkJc3ZzYi0+bXRzID0gbXRzOw0KKw0KKwkJc3dpdGNoIChzdnNiLT5zd19pZCkg ew0KKwkJY2FzZSBTVlNfQ1BVX0xJVFRMRToNCisJCQl0Yl9yb29tdCA9IHhfcm9vbXRbM107DQor CQkJYnJlYWs7DQorCQljYXNlIFNWU19DUFVfQklHOg0KKwkJCXRiX3Jvb210ID0geF9yb29tdFs0 XTsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0NDSToNCisJCQl0Yl9yb29tdCA9IHhfcm9vbXRb M107DQorCQkJYnJlYWs7DQorCQljYXNlIFNWU19HUFU6DQorCQkJdGJfcm9vbXQgPSB4X3Jvb210 WzFdOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJCQlicmVhazsNCisJCX0NCisNCisJCXRl bXAwID0gKHRwLmRlZ2NfY2FsaSAqIDEwIC8gMik7DQorCQl0ZW1wMSA9ICgoMTAwMDAgKiAxMDAw MDAgLyA0MDk2IC8gdHAuZ2FpbikgKg0KKwkJCSB0cC5vZSArIHRiX3Jvb210ICogMTApICogMTUg LyAxODsNCisNCisJCWlmICghdHAub19zbG9wZV9zaWduKQ0KKwkJCXRlbXAyID0gdGVtcDEgKiAx MDAgLyAoMTUzNCArIHRwLm9fc2xvcGUgKiAxMCk7DQorCQllbHNlDQorCQkJdGVtcDIgPSB0ZW1w MSAqIDEwMCAvICgxNTM0IC0gdHAub19zbG9wZSAqIDEwKTsNCisNCisJCXN2c2ItPmJ0cyA9ICh0 ZW1wMCArIHRlbXAyIC0gMjUwKSAqIDQgLyAxMDsNCisJfQ0KKw0KKwlyZXR1cm4gdHJ1ZTsNCit9 DQorDQorc3RhdGljIGJvb2wgc3ZzX2lzX3N1cHBvcnRlZChzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0K K3sNCisJY29uc3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQor CXN0cnVjdCBudm1lbV9jZWxsICpjZWxsOw0KKwlzaXplX3QgbGVuOw0KKwlib29sIHJldDsNCisN CisJaWYgKHN2c3AtPmZha2VfZWZ1c2UpIHsNCisJCWxlbiA9IHN2c3AtPmVmdXNlX251bSAqIHNp emVvZih1MzIpOw0KKwkJc3ZzLT5lZnVzZSA9IGRldm1fa3phbGxvYyhzdnMtPmRldiwgbGVuLCBH RlBfS0VSTkVMKTsNCisJCWlmICghc3ZzLT5lZnVzZSkgew0KKwkJCXByX2Vycigibm8gbWVtb3J5 IGZvciBhbGxvY2F0aW5nIHN2c19lZnVzZVxuIik7DQorCQkJcmV0dXJuIGZhbHNlOw0KKwkJfQ0K Kw0KKwkJbGVuID0gc3ZzcC0+dGhlcm1hbF9lZnVzZV9udW0gKiBzaXplb2YodTMyKTsNCisJCXN2 cy0+dGhlcm1hbF9lZnVzZSA9IGRldm1fa3phbGxvYyhzdnMtPmRldiwgbGVuLCBHRlBfS0VSTkVM KTsNCisJCWlmICghc3ZzLT50aGVybWFsX2VmdXNlKSB7DQorCQkJcHJfZXJyKCJubyBtZW1vcnkg Zm9yIGFsbG9jYXRpbmcgc3ZzX3RoZXJtYWxfZWZ1c2VcbiIpOw0KKwkJCXJldHVybiBmYWxzZTsN CisJCX0NCisNCisJCWdvdG8gc3ZzcF9lZnVzZV9wYXJzaW5nOw0KKwl9DQorDQorCS8qIEdldCBz dnMgZWZ1c2UgYnkgbnZtZW0gKi8NCisJY2VsbCA9IG52bWVtX2NlbGxfZ2V0KHN2cy0+ZGV2LCAi c3ZzLWNhbGlicmF0aW9uLWRhdGEiKTsNCisJaWYgKElTX0VSUihjZWxsKSkgew0KKwkJcHJfZXJy KCJubyBcInN2cy1jYWxpYnJhdGlvbi1kYXRhXCIgZnJvbSBkdHM/IGRpc2FibGUgc3ZzXG4iKTsN CisJCXJldHVybiBmYWxzZTsNCisJfQ0KKw0KKwlzdnMtPmVmdXNlID0gKHUzMiAqKW52bWVtX2Nl bGxfcmVhZChjZWxsLCAmbGVuKTsNCisJbnZtZW1fY2VsbF9wdXQoY2VsbCk7DQorDQorCWlmICgh c3ZzLT5lZnVzZVtzdnNwLT5lZnVzZV9jaGVja10pIHsNCisJCXByX2Vycigic3ZzX2VmdXNlWyV1 XSA9IDB4JXg/XG4iLA0KKwkJICAgICAgIHN2c3AtPmVmdXNlX2NoZWNrLCBzdnMtPmVmdXNlW3N2 c3AtPmVmdXNlX2NoZWNrXSk7DQorCQlyZXR1cm4gZmFsc2U7DQorCX0NCisNCitzdnNwX2VmdXNl X3BhcnNpbmc6DQorCXJldCA9IHN2c3AtPmVmdXNlX3BhcnNpbmcoc3ZzKTsNCisNCisJcmV0dXJu IHJldDsNCit9DQorDQorc3RhdGljIGludCBzdnNfcmVzb3VyY2Vfc2V0dXAoc3RydWN0IG10a19z dnMgKnN2cykNCit7DQorCWNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBs YXRmb3JtOw0KKwlzdHJ1Y3Qgc3ZzX2JhbmsgKnN2c2I7DQorCXN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXY7DQorCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBOVUxMOw0KKwlzdHJ1Y3QgZGV2 X3BtX29wcCAqb3BwOw0KKwl1bnNpZ25lZCBsb25nIGZyZXE7DQorCWludCBjb3VudCwgcmV0Ow0K Kwl1MzIgaWR4LCBpOw0KKw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBp ZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKw0KKwkJc3dpdGNoIChzdnNi LT5zd19pZCkgew0KKwkJY2FzZSBTVlNfQ1BVX0xJVFRMRToNCisJCQlzdnNiLT5uYW1lID0gIlNW U19DUFVfTElUVExFIjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0NQVV9CSUc6DQorCQkJc3Zz Yi0+bmFtZSA9ICJTVlNfQ1BVX0JJRyI7DQorCQkJYnJlYWs7DQorCQljYXNlIFNWU19DQ0k6DQor CQkJc3ZzYi0+bmFtZSA9ICJTVlNfQ0NJIjsNCisJCQlicmVhazsNCisJCWNhc2UgU1ZTX0dQVToN CisJCQlzdnNiLT5uYW1lID0gIlNWU19HUFUiOw0KKwkJCWJyZWFrOw0KKwkJZGVmYXVsdDoNCisJ CQlXQVJOX09OKDEpOw0KKwkJCXJldHVybiAtRUlOVkFMOw0KKwkJfQ0KKw0KKwkJLyogQWRkIHN2 cyBiYW5rIGRldmljZSBmb3Igb3BwLXRhYmxlL210Y21vcy9idWNrIGNvbnRyb2wgKi8NCisJCXBk ZXYgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2Moc3ZzYi0+bmFtZSwgMCk7DQorCQlpZiAoIXBkZXYp IHsNCisJCQlwcl9lcnIoIiVzOiBmYWlsIHRvIGFsbG9jIHBkZXYgZm9yIHN2c19iYW5rXG4iLA0K KwkJCSAgICAgICBzdnNiLT5uYW1lKTsNCisJCQlyZXR1cm4gLUVOT01FTTsNCisJCX0NCisNCisJ CWZvcl9lYWNoX2NoaWxkX29mX25vZGUoc3ZzLT5kZXYtPm9mX25vZGUsIG5wKSB7DQorCQkJaWYg KG9mX2RldmljZV9pc19jb21wYXRpYmxlKG5wLCBzdnNiLT5vZl9jb21wYXRpYmxlKSkgew0KKwkJ CQlwZGV2LT5kZXYub2Zfbm9kZSA9IG5wOw0KKwkJCQlicmVhazsNCisJCQl9DQorCQl9DQorDQor CQlyZXQgPSBwbGF0Zm9ybV9kZXZpY2VfYWRkKHBkZXYpOw0KKwkJaWYgKHJldCkgew0KKwkJCXBy X2VycigiJXM6IGZhaWwgdG8gYWRkIHN2c19iYW5rIGRldmljZTogJWRcbiIsDQorCQkJICAgICAg IHN2c2ItPm5hbWUsIHJldCk7DQorCQkJcmV0dXJuIHJldDsNCisJCX0NCisNCisJCXN2c2ItPmRl diA9ICZwZGV2LT5kZXY7DQorCQlkZXZfc2V0X2RydmRhdGEoc3ZzYi0+ZGV2LCBzdnMpOw0KKwkJ cmV0ID0gZGV2X3BtX29wcF9vZl9hZGRfdGFibGUoc3ZzYi0+ZGV2KTsNCisJCWlmIChyZXQpIHsN CisJCQlwcl9lcnIoIiVzOiBmYWlsIHRvIGFkZCBvcHAgdGFibGU6ICVkXG4iLA0KKwkJCSAgICAg ICBzdnNiLT5uYW1lLCByZXQpOw0KKwkJCXJldHVybiByZXQ7DQorCQl9DQorDQorCQltdXRleF9p bml0KCZzdnNiLT5sb2NrKTsNCisNCisJCXN2c2ItPmJ1Y2sgPSBkZXZtX3JlZ3VsYXRvcl9nZXRf b3B0aW9uYWwoc3ZzYi0+ZGV2LA0KKwkJCQkJCQkgc3ZzYi0+YnVja19uYW1lKTsNCisJCWlmIChJ U19FUlIoc3ZzYi0+YnVjaykpIHsNCisJCQlwcl9lcnIoIiVzOiBjYW5ub3QgZ2V0IHJlZ3VsYXRv ciBcIiVzLXN1cHBseVwiXG4iLA0KKwkJCSAgICAgICBzdnNiLT5uYW1lLCBzdnNiLT5idWNrX25h bWUpOw0KKwkJCXJldHVybiBQVFJfRVJSKHN2c2ItPmJ1Y2spOw0KKwkJfQ0KKw0KKwkJY291bnQg PSBkZXZfcG1fb3BwX2dldF9vcHBfY291bnQoc3ZzYi0+ZGV2KTsNCisJCWlmIChzdnNiLT5vcHBf Y291bnQgIT0gY291bnQpIHsNCisJCQlwcl9lcnIoIiVzOiBvcHBfY291bnQgbm90IFwiJXVcIiBi dXQgZ2V0IFwiJWRcIj9cbiIsDQorCQkJICAgICAgIHN2c2ItPm5hbWUsIHN2c2ItPm9wcF9jb3Vu dCwgY291bnQpOw0KKwkJCXJldHVybiBjb3VudDsNCisJCX0NCisNCisJCWZvciAoaSA9IDAsIGZy ZXEgPSBVMzJfTUFYOyBpIDwgc3ZzYi0+b3BwX2NvdW50OyBpKyssIGZyZXEtLSkgew0KKwkJCW9w cCA9IGRldl9wbV9vcHBfZmluZF9mcmVxX2Zsb29yKHN2c2ItPmRldiwgJmZyZXEpOw0KKwkJCWlm IChJU19FUlIob3BwKSkgew0KKwkJCQlwcl9lcnIoIiVzOiBlcnJvciBvcHAgZW50cnkhISwgZXJy ID0gJWxkXG4iLA0KKwkJCQkgICAgICAgc3ZzYi0+bmFtZSwgUFRSX0VSUihvcHApKTsNCisJCQkJ cmV0dXJuIFBUUl9FUlIob3BwKTsNCisJCQl9DQorDQorCQkJc3ZzYi0+b3BwX2ZyZXFzW2ldID0g ZnJlcTsNCisJCQlzdnNiLT5vcHBfdm9sdHNbaV0gPSBkZXZfcG1fb3BwX2dldF92b2x0YWdlKG9w cCk7DQorCQkJc3ZzYi0+ZnJlcXNfcGN0W2ldID0gcGVyY2VudChzdnNiLT5vcHBfZnJlcXNbaV0s DQorCQkJCQkJICAgICBzdnNiLT5mcmVxX2Jhc2UpOw0KKwkJCWRldl9wbV9vcHBfcHV0KG9wcCk7 DQorCQl9DQorCX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBpbnQgc3ZzX3N1c3Bl bmQoc3RydWN0IGRldmljZSAqZGV2KQ0KK3sNCisJc3RydWN0IG10a19zdnMgKnN2cyA9IGRldl9n ZXRfZHJ2ZGF0YShkZXYpOw0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtICpzdnNwID0gc3Zz LT5wbGF0Zm9ybTsNCisJc3RydWN0IHN2c19iYW5rICpzdnNiOw0KKwl1bnNpZ25lZCBsb25nIGZs YWdzOw0KKwlpbnQgcmV0Ow0KKwl1MzIgaWR4Ow0KKw0KKwkvKiBXYWl0IGlmIHRoZXJlIGlzIHBy b2Nlc3Npbmcgc3ZzX2lzcigpLiBTdXNwZW5kIGFsbCBiYW5rcy4gKi8NCisJZmxhZ3MgPSBjbGFp bV9tdGtfc3ZzX2xvY2soKTsNCisJZm9yIChpZHggPSAwOyBpZHggPCBzdnNwLT5iYW5rX251bTsg aWR4KyspIHsNCisJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJCXN2cy0+YmFuayA9IHN2 c2I7DQorCQlzdnNfc3dpdGNoX2Jhbmsoc3ZzKTsNCisJCXN2c193cml0ZWwoc3ZzLCBTVlNFTl9P RkYsIFNWU0VOKTsNCisJCXN2c193cml0ZWwoc3ZzLCBJTlRTVFNfQ0xFQU4sIElOVFNUUyk7DQor CQlzdnNiLT5zdXNwZW5kZWQgPSB0cnVlOw0KKwl9DQorCXJlbGVhc2VfbXRrX3N2c19sb2NrKGZs YWdzKTsNCisNCisJZm9yIChpZHggPSAwOyBpZHggPCBzdnNwLT5iYW5rX251bTsgaWR4KyspIHsN CisJCXN2c2IgPSAmc3ZzcC0+YmFua3NbaWR4XTsNCisJCWlmIChzdnNiLT5waGFzZSAhPSBTVlNC X1BIQVNFX0lOSVQwMSkgew0KKwkJCXN2c2ItPnBoYXNlID0gU1ZTQl9QSEFTRV9FUlJPUjsNCisJ CQlzdnNiX3NldF92b2x0cyhzdnNiLCB0cnVlKTsNCisJCX0NCisJfQ0KKw0KKwlpZiAoc3ZzcC0+ bmVlZF9od19yZXNldCkgew0KKwkJcmV0ID0gZGV2aWNlX3Jlc2V0KHN2cy0+ZGV2KTsNCisJCWlm IChyZXQpIHsNCisJCQlwcl9lcnIoIiVzOiByZXQgPSAlZFxuIiwgX19mdW5jX18sIHJldCk7DQor CQkJcmV0dXJuIHJldDsNCisJCX0NCisJfQ0KKw0KKwljbGtfZGlzYWJsZV91bnByZXBhcmUoc3Zz LT5tYWluX2Nsayk7DQorDQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IHN2c19yZXN1 bWUoc3RydWN0IGRldmljZSAqZGV2KQ0KK3sNCisJc3RydWN0IG10a19zdnMgKnN2cyA9IGRldl9n ZXRfZHJ2ZGF0YShkZXYpOw0KKwljb25zdCBzdHJ1Y3Qgc3ZzX3BsYXRmb3JtICpzdnNwID0gc3Zz LT5wbGF0Zm9ybTsNCisJc3RydWN0IHN2c19iYW5rICpzdnNiOw0KKwlpbnQgcmV0Ow0KKwl1MzIg aWR4Ow0KKw0KKwlyZXQgPSBjbGtfcHJlcGFyZV9lbmFibGUoc3ZzLT5tYWluX2Nsayk7DQorCWlm IChyZXQpIHsNCisJCXByX2VycigiY2Fubm90IGVuYWJsZSBtYWluX2NsaywgZGlzYWJsZSBzdnNc biIpOw0KKwkJcmV0dXJuIHJldDsNCisJfQ0KKw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3At PmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKwkJc3Zz Yi0+c3VzcGVuZGVkID0gZmFsc2U7DQorCX0NCisNCisJcmV0ID0gc3ZzX2luaXQwMihzdnMpOw0K KwlpZiAocmV0KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJc3ZzX21vbl9tb2RlKHN2cyk7DQorDQor CXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW50IHN2c19kZWJ1Z19wcm9jX3Nob3coc3RydWN0 IHNlcV9maWxlICptLCB2b2lkICp2KQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gKHN0 cnVjdCBzdnNfYmFuayAqKW0tPnByaXZhdGU7DQorDQorCWlmIChzdnNiLT5waGFzZSA9PSBTVlNC X1BIQVNFX0lOSVQwMSkNCisJCXNlcV9wdXRzKG0sICJpbml0MVxuIik7DQorCWVsc2UgaWYgKHN2 c2ItPnBoYXNlID09IFNWU0JfUEhBU0VfSU5JVDAyKQ0KKwkJc2VxX3B1dHMobSwgImluaXQyXG4i KTsNCisJZWxzZSBpZiAoc3ZzYi0+cGhhc2UgPT0gU1ZTQl9QSEFTRV9NT04pDQorCQlzZXFfcHV0 cyhtLCAibW9uIG1vZGVcbiIpOw0KKwllbHNlIGlmIChzdnNiLT5waGFzZSA9PSBTVlNCX1BIQVNF X0VSUk9SKQ0KKwkJc2VxX3B1dHMobSwgImRpc2FibGVkXG4iKTsNCisJZWxzZQ0KKwkJc2VxX3B1 dHMobSwgInVua25vd25cbiIpOw0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQorc3RhdGljIHNzaXpl X3Qgc3ZzX2RlYnVnX3Byb2Nfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsDQorCQkJCSAgICBjb25z dCBjaGFyIF9fdXNlciAqYnVmZmVyLA0KKwkJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBv cykNCit7DQorCXN0cnVjdCBzdnNfYmFuayAqc3ZzYiA9IChzdHJ1Y3Qgc3ZzX2JhbmsgKilQREVf REFUQShmaWxlX2lub2RlKGZpbGUpKTsNCisJc3RydWN0IG10a19zdnMgKnN2cyA9IGRldl9nZXRf ZHJ2ZGF0YShzdnNiLT5kZXYpOw0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0KKwlpbnQgZW5hYmxl ZCwgcmV0Ow0KKwljaGFyICpidWYgPSBOVUxMOw0KKw0KKwlpZiAoY291bnQgPj0gUEFHRV9TSVpF KQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWJ1ZiA9IChjaGFyICopbWVtZHVwX3VzZXJfbnVs KGJ1ZmZlciwgY291bnQpOw0KKwlpZiAoSVNfRVJSKGJ1ZikpDQorCQlyZXR1cm4gUFRSX0VSUihi dWYpOw0KKw0KKwlyZXQgPSBrc3RydG9pbnQoYnVmLCAxMCwgJmVuYWJsZWQpOw0KKwlpZiAocmV0 KQ0KKwkJcmV0dXJuIHJldDsNCisNCisJaWYgKCFlbmFibGVkKSB7DQorCQlmbGFncyA9IGNsYWlt X210a19zdnNfbG9jaygpOw0KKwkJc3ZzLT5iYW5rID0gc3ZzYjsNCisJCXN2c2ItPm1vZGVfc3Vw cG9ydCA9IFNWU0JfTU9ERV9BTExfRElTQUJMRTsNCisJCXN2c19zd2l0Y2hfYmFuayhzdnMpOw0K KwkJc3ZzX3dyaXRlbChzdnMsIFNWU0VOX09GRiwgU1ZTRU4pOw0KKwkJc3ZzX3dyaXRlbChzdnMs IElOVFNUU19DTEVBTiwgSU5UU1RTKTsNCisJCXJlbGVhc2VfbXRrX3N2c19sb2NrKGZsYWdzKTsN CisNCisJCXN2c2ItPnBoYXNlID0gU1ZTQl9QSEFTRV9FUlJPUjsNCisJCXN2c2Jfc2V0X3ZvbHRz KHN2c2IsIHRydWUpOw0KKwl9DQorDQorCWtmcmVlKGJ1Zik7DQorDQorCXJldHVybiBjb3VudDsN Cit9DQorDQorcHJvY19mb3BzX3J3KHN2c19kZWJ1Zyk7DQorDQorc3RhdGljIGludCBzdnNfZHVt cF9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQ0KK3sNCisJc3RydWN0IG10 a19zdnMgKnN2cyA9IChzdHJ1Y3QgbXRrX3N2cyAqKW0tPnByaXZhdGU7DQorCWNvbnN0IHN0cnVj dCBzdnNfcGxhdGZvcm0gKnN2c3AgPSBzdnMtPnBsYXRmb3JtOw0KKwlzdHJ1Y3Qgc3ZzX2Jhbmsg KnN2c2I7DQorCXVuc2lnbmVkIGxvbmcgc3ZzX3JlZ19hZGRyOw0KKwl1MzIgaWR4LCBpLCBqOw0K Kw0KKwlmb3IgKGkgPSAwOyBpIDwgc3ZzcC0+ZWZ1c2VfbnVtOyBpKyspDQorCQlpZiAoc3ZzLT5l ZnVzZSAmJiBzdnMtPmVmdXNlW2ldKQ0KKwkJCXNlcV9wcmludGYobSwgIk1fSFdfUkVTJWQgPSAw eCUwOHhcbiIsDQorCQkJCSAgIGksIHN2cy0+ZWZ1c2VbaV0pOw0KKw0KKwlmb3IgKGkgPSAwOyBp IDwgc3ZzcC0+dGhlcm1hbF9lZnVzZV9udW07IGkrKykNCisJCWlmIChzdnMtPnRoZXJtYWxfZWZ1 c2UpDQorCQkJc2VxX3ByaW50ZihtLCAiVEhFUk1BTF9FRlVTRSVkID0gMHglMDh4XG4iLA0KKwkJ CQkgICBpLCBzdnMtPnRoZXJtYWxfZWZ1c2VbaV0pOw0KKw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8 IHN2c3AtPmJhbmtfbnVtOyBpZHgrKykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0K Kw0KKwkJZm9yIChpID0gU1ZTQl9QSEFTRV9JTklUMDE7IGkgPD0gU1ZTQl9QSEFTRV9NT047IGkr Kykgew0KKwkJCXNlcV9wcmludGYobSwgIkJhbmtfbnVtYmVyID0gJXVcbiIsIHN2c2ItPmJhbmtf aWQpOw0KKw0KKwkJCWlmIChpIDwgU1ZTQl9QSEFTRV9NT04pDQorCQkJCXNlcV9wcmludGYobSwg Im1vZGUgPSBpbml0JWRcbiIsIGkgKyAxKTsNCisJCQllbHNlDQorCQkJCXNlcV9wdXRzKG0sICJt b2RlID0gbW9uXG4iKTsNCisNCisJCQlmb3IgKGogPSBURU1QTU9OQ1RMMDsgaiA8IHJlZ19udW07 IGorKykgew0KKwkJCQlzdnNfcmVnX2FkZHIgPSAodW5zaWduZWQgbG9uZykoc3ZzLT5iYXNlICsN CisJCQkJCQkJICAgICAgIHN2c3AtPnJlZ3Nbal0pOw0KKwkJCQlzZXFfcHJpbnRmKG0sICIweCUw OGx4ID0gMHglMDh4XG4iLA0KKwkJCQkJICAgc3ZzX3JlZ19hZGRyLCBzdnNiLT5yZWdfZGF0YVtp XVtqXSk7DQorCQkJfQ0KKwkJfQ0KKwl9DQorDQorCXJldHVybiAwOw0KK30NCisNCitwcm9jX2Zv cHNfcm8oc3ZzX2R1bXApOw0KKw0KK3N0YXRpYyBpbnQgc3ZzX3N0YXR1c19wcm9jX3Nob3coc3Ry dWN0IHNlcV9maWxlICptLCB2b2lkICp2KQ0KK3sNCisJc3RydWN0IHN2c19iYW5rICpzdnNiID0g KHN0cnVjdCBzdnNfYmFuayAqKW0tPnByaXZhdGU7DQorCXN0cnVjdCBkZXZfcG1fb3BwICpvcHA7 DQorCXVuc2lnbmVkIGxvbmcgZnJlcTsNCisJaW50IHR6b25lX3RlbXAsIHJldDsNCisJdTMyIGk7 DQorDQorCXJldCA9IHN2c2JfZ2V0X3pvbmVfdGVtcGVyYXR1cmUoc3ZzYiwgJnR6b25lX3RlbXAp Ow0KKwlpZiAocmV0KQ0KKwkJc2VxX3ByaW50ZihtLCAiJXM6IGNhbm5vdCBnZXQgem9uZSBcIiVz XCIgdGVtcGVyYXR1cmVcbiIsDQorCQkJICAgc3ZzYi0+bmFtZSwgc3ZzYi0+dHpvbmVfbmFtZSk7 DQorCWVsc2UNCisJCXNlcV9wcmludGYobSwgIiVzOiB0ZW1wZXJhdHVyZSA9ICVkXG4iLCBzdnNi LT5uYW1lLCB0em9uZV90ZW1wKTsNCisNCisJZm9yIChpID0gMCwgZnJlcSA9IFUzMl9NQVg7IGkg PCBzdnNiLT5vcHBfY291bnQ7IGkrKywgZnJlcS0tKSB7DQorCQlvcHAgPSBkZXZfcG1fb3BwX2Zp bmRfZnJlcV9mbG9vcihzdnNiLT5kZXYsICZmcmVxKTsNCisJCWlmIChJU19FUlIob3BwKSkgew0K KwkJCXNlcV9wcmludGYobSwgIiVzOiBlcnJvciBvcHAgZW50cnkhISwgZXJyID0gJWxkXG4iLA0K KwkJCQkgICBzdnNiLT5uYW1lLCBQVFJfRVJSKG9wcCkpOw0KKwkJCXJldHVybiBQVFJfRVJSKG9w cCk7DQorCQl9DQorDQorCQlzZXFfcHJpbnRmKG0sICJvcHBfZnJlcXNbJTAydV06ICVsdSwgdm9s dHNbJTAydV06ICVsdSwgIiwNCisJCQkgICBpLCBmcmVxLCBpLCBkZXZfcG1fb3BwX2dldF92b2x0 YWdlKG9wcCkpOw0KKwkJc2VxX3ByaW50ZihtLCAic3ZzYl92b2x0c1slMDJ1XTogMHgleCwgZnJl cXNfcGN0WyUwMnVdOiAldVxuIiwNCisJCQkgICBpLCBzdnNiLT52b2x0c1tpXSwgaSwgc3ZzYi0+ ZnJlcXNfcGN0W2ldKTsNCisJCWRldl9wbV9vcHBfcHV0KG9wcCk7DQorCX0NCisNCisJcmV0dXJu IDA7DQorfQ0KKw0KK3Byb2NfZm9wc19ybyhzdnNfc3RhdHVzKTsNCisNCitzdGF0aWMgaW50IHN2 c192b2x0X29mZnNldF9wcm9jX3Nob3coc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp2KQ0KK3sN CisJc3RydWN0IHN2c19iYW5rICpzdnNiID0gKHN0cnVjdCBzdnNfYmFuayAqKW0tPnByaXZhdGU7 DQorDQorCXNlcV9wcmludGYobSwgIiVkXG4iLCBzdnNiLT52b2x0X29mZnNldCk7DQorDQorCXJl dHVybiAwOw0KK30NCisNCitzdGF0aWMgc3NpemVfdCBzdnNfdm9sdF9vZmZzZXRfcHJvY193cml0 ZShzdHJ1Y3QgZmlsZSAqZmlsZSwNCisJCQkJCSAgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZmZlciwN CisJCQkJCSAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBvcykNCit7DQorCXN0cnVjdCBzdnNfYmFu ayAqc3ZzYiA9IChzdHJ1Y3Qgc3ZzX2JhbmsgKilQREVfREFUQShmaWxlX2lub2RlKGZpbGUpKTsN CisJY2hhciAqYnVmID0gTlVMTDsNCisJczMyIHZvbHRfb2Zmc2V0Ow0KKw0KKwlpZiAoY291bnQg Pj0gUEFHRV9TSVpFKQ0KKwkJcmV0dXJuIC1FSU5WQUw7DQorDQorCWJ1ZiA9IChjaGFyICopbWVt ZHVwX3VzZXJfbnVsKGJ1ZmZlciwgY291bnQpOw0KKwlpZiAoSVNfRVJSKGJ1ZikpDQorCQlyZXR1 cm4gUFRSX0VSUihidWYpOw0KKw0KKwlpZiAoIWtzdHJ0b2ludChidWYsIDEwLCAmdm9sdF9vZmZz ZXQpKSB7DQorCQlzdnNiLT52b2x0X29mZnNldCA9IHZvbHRfb2Zmc2V0Ow0KKwkJc3ZzYl9zZXRf dm9sdHMoc3ZzYiwgdHJ1ZSk7DQorCX0NCisNCisJa2ZyZWUoYnVmKTsNCisNCisJcmV0dXJuIGNv dW50Ow0KK30NCisNCitwcm9jX2ZvcHNfcncoc3ZzX3ZvbHRfb2Zmc2V0KTsNCisNCitzdGF0aWMg aW50IHN2c19jcmVhdGVfc3ZzX3Byb2NmcyhzdHJ1Y3QgbXRrX3N2cyAqc3ZzKQ0KK3sNCisJY29u c3Qgc3RydWN0IHN2c19wbGF0Zm9ybSAqc3ZzcCA9IHN2cy0+cGxhdGZvcm07DQorCXN0cnVjdCBz dnNfYmFuayAqc3ZzYjsNCisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpzdnNfZGlyLCAqYmFua19k aXI7DQorCXUzMiBpZHgsIGk7DQorDQorCXN0cnVjdCBwZW50cnkgew0KKwkJY29uc3QgY2hhciAq bmFtZTsNCisJCWNvbnN0IHN0cnVjdCBwcm9jX29wcyAqZm9wczsNCisJfTsNCisNCisJc3RydWN0 IHBlbnRyeSBzdnNfZW50cmllc1tdID0gew0KKwkJcHJvY19lbnRyeShzdnNfZHVtcCksDQorCX07 DQorDQorCXN0cnVjdCBwZW50cnkgYmFua19lbnRyaWVzW10gPSB7DQorCQlwcm9jX2VudHJ5KHN2 c19kZWJ1ZyksDQorCQlwcm9jX2VudHJ5KHN2c19zdGF0dXMpLA0KKwkJcHJvY19lbnRyeShzdnNf dm9sdF9vZmZzZXQpLA0KKwl9Ow0KKw0KKwlzdnNfZGlyID0gcHJvY19ta2Rpcigic3ZzIiwgTlVM TCk7DQorCWlmICghc3ZzX2Rpcikgew0KKwkJcHJfZXJyKCJta2RpciAvcHJvYy9zdnMgZmFpbGVk XG4iKTsNCisJCXJldHVybiAtRVBFUk07DQorCX0NCisNCisJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUoc3ZzX2VudHJpZXMpOyBpKyspIHsNCisJCWlmICghcHJvY19jcmVhdGVfZGF0YShzdnNf ZW50cmllc1tpXS5uYW1lLCAwNjY0LA0KKwkJCQkgICAgICBzdnNfZGlyLCBzdnNfZW50cmllc1tp XS5mb3BzLCBzdnMpKSB7DQorCQkJcHJfZXJyKCJjcmVhdGUgL3Byb2Mvc3ZzLyVzIGZhaWxlZFxu IiwNCisJCQkgICAgICAgc3ZzX2VudHJpZXNbaV0ubmFtZSk7DQorCQkJcmV0dXJuIC1FUEVSTTsN CisJCX0NCisJfQ0KKw0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHN2c3AtPmJhbmtfbnVtOyBpZHgr Kykgew0KKwkJc3ZzYiA9ICZzdnNwLT5iYW5rc1tpZHhdOw0KKw0KKwkJaWYgKHN2c2ItPm1vZGVf c3VwcG9ydCA9PSBTVlNCX01PREVfQUxMX0RJU0FCTEUpDQorCQkJY29udGludWU7DQorDQorCQli YW5rX2RpciA9IHByb2NfbWtkaXIoc3ZzYi0+bmFtZSwgc3ZzX2Rpcik7DQorCQlpZiAoIWJhbmtf ZGlyKSB7DQorCQkJcHJfZXJyKCJta2RpciAvcHJvYy9zdnMvJXMgZmFpbGVkXG4iLCBzdnNiLT5u YW1lKTsNCisJCQlyZXR1cm4gLUVQRVJNOw0KKwkJfQ0KKw0KKwkJZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUoYmFua19lbnRyaWVzKTsgaSsrKSB7DQorCQkJaWYgKCFwcm9jX2NyZWF0ZV9kYXRh KGJhbmtfZW50cmllc1tpXS5uYW1lLCAwNjY0LA0KKwkJCQkJICAgICAgYmFua19kaXIsIGJhbmtf ZW50cmllc1tpXS5mb3BzLA0KKwkJCQkJICAgICAgc3ZzYikpIHsNCisJCQkJcHJfZXJyKCJjcmVh dGUgL3Byb2Mvc3ZzLyVzLyVzIGZhaWxlZFxuIiwNCisJCQkJICAgICAgIHN2c2ItPm5hbWUsIGJh bmtfZW50cmllc1tpXS5uYW1lKTsNCisJCQkJcmV0dXJuIC1FUEVSTTsNCisJCQl9DQorCQl9DQor CX0NCisNCisJcmV0dXJuIDA7DQorfQ0KKw0KK3N0YXRpYyBzdHJ1Y3Qgc3ZzX2Jhbmtfb3BzIHN2 c19tdDgxODNfYmFua3Nfb3BzID0gew0KKwkuc2V0X2ZyZXFzX3BjdAk9IHN2c19zZXRfZnJlcXNf cGN0X3YyLA0KKwkuZ2V0X3ZvcHMJPSBzdnNfZ2V0X3ZvcHNfdjIsDQorfTsNCisNCitzdGF0aWMg c3RydWN0IHN2c19iYW5rIHN2c19tdDgxODNfYmFua3NbNF0gPSB7DQorCXsNCisJCS5vZl9jb21w YXRpYmxlCQk9ICJtZWRpYXRlayxtdDgxODMtc3ZzLWNwdS1saXR0bGUiLA0KKwkJLnN3X2lkCQkJ PSBTVlNfQ1BVX0xJVFRMRSwNCisJCS5iYW5rX2lkCQk9IDAsDQorCQkub3BzCQkJPSAmc3ZzX210 ODE4M19iYW5rc19vcHMsDQorCQkudHpvbmVfbmFtZQkJPSAidHp0czQiLA0KKwkJLmJ1Y2tfbmFt ZQkJPSAidmNwdS1saXR0bGUiLA0KKwkJLm10Y21vc19yZXF1ZXN0CQk9IGZhbHNlLA0KKwkJLmlu aXQwMV92b2x0X2ZsYWcJPSBTVlNCX0lOSVQwMV9WT0xUX0lOQ19PTkxZLA0KKwkJLm1vZGVfc3Vw cG9ydAkJPSBTVlNCX01PREVfSU5JVDAxIHwgU1ZTQl9NT0RFX0lOSVQwMiwNCisJCS5vcHBfY291 bnQJCT0gMTYsDQorCQkuZnJlcV9iYXNlCQk9IDE5ODkwMDAwMDAsDQorCQkudmJvb3QJCQk9IDB4 MzAsDQorCQkudm9sdF9zdGVwCQk9IDYyNTAsDQorCQkudm9sdF9iYXNlCQk9IDUwMDAwMCwNCisJ CS52b2x0X29mZnNldAkJPSAwLA0KKwkJLnZtYXgJCQk9IDB4NjQsDQorCQkudm1pbgkJCT0gMHgx OCwNCisJCS5kdGhpCQkJPSAweDEsDQorCQkuZHRsbwkJCT0gMHhmZSwNCisJCS5kZXRfd2luZG93 CQk9IDB4YTI4LA0KKwkJLmRldF9tYXgJCT0gMHhmZmZmLA0KKwkJLmFnZV9jb25maWcJCT0gMHg1 NTU1NTUsDQorCQkuYWdlbQkJCT0gMCwNCisJCS5kY19jb25maWcJCT0gMHg1NTU1NTUsDQorCQku ZHZ0X2ZpeGVkCQk9IDB4NywNCisJCS52Y28JCQk9IDB4MTAsDQorCQkuY2hrX3NoaWZ0CQk9IDB4 NzcsDQorCQkudXBwZXJfdGVtcF9ib3VuZAk9IDB4NjQsDQorCQkubG93ZXJfdGVtcF9ib3VuZAk9 IDB4YjIsDQorCQkuaGlnaF90ZW1wX3RocmVhc2hvbGQJPSBISUdIX1RFTVBfTUFYLA0KKwkJLmxv d190ZW1wX3RocmVhc2hvbGQJPSAyNTAwMCwNCisJCS5sb3dfdGVtcF9vZmZzZXQJPSAwLA0KKwkJ LmNvcmVfc2VsCQk9IDB4OGZmZjAwMDAsDQorCQkuc3lzdGVtY2xrX2VuCQk9IEJJVCgzMSksDQor CQkuaW50X3N0CQkJPSBCSVQoMCksDQorCQkuY3RsMAkJCT0gMHgwMDAxMDAwMSwNCisJfSwNCisJ ew0KKwkJLm9mX2NvbXBhdGlibGUJCT0gIm1lZGlhdGVrLG10ODE4My1zdnMtY3B1LWJpZyIsDQor CQkuc3dfaWQJCQk9IFNWU19DUFVfQklHLA0KKwkJLmJhbmtfaWQJCT0gMSwNCisJCS5vcHMJCQk9 ICZzdnNfbXQ4MTgzX2JhbmtzX29wcywNCisJCS50em9uZV9uYW1lCQk9ICJ0enRzNSIsDQorCQku YnVja19uYW1lCQk9ICJ2Y3B1LWJpZyIsDQorCQkubXRjbW9zX3JlcXVlc3QJCT0gZmFsc2UsDQor CQkuaW5pdDAxX3ZvbHRfZmxhZwk9IFNWU0JfSU5JVDAxX1ZPTFRfSU5DX09OTFksDQorCQkubW9k ZV9zdXBwb3J0CQk9IFNWU0JfTU9ERV9JTklUMDEgfCBTVlNCX01PREVfSU5JVDAyLA0KKwkJLm9w cF9jb3VudAkJPSAxNiwNCisJCS5mcmVxX2Jhc2UJCT0gMTk4OTAwMDAwMCwNCisJCS52Ym9vdAkJ CT0gMHgzMCwNCisJCS52b2x0X3N0ZXAJCT0gNjI1MCwNCisJCS52b2x0X2Jhc2UJCT0gNTAwMDAw LA0KKwkJLnZvbHRfb2Zmc2V0CQk9IDAsDQorCQkudm1heAkJCT0gMHg1OCwNCisJCS52bWluCQkJ PSAweDEwLA0KKwkJLmR0aGkJCQk9IDB4MSwNCisJCS5kdGxvCQkJPSAweGZlLA0KKwkJLmRldF93 aW5kb3cJCT0gMHhhMjgsDQorCQkuZGV0X21heAkJPSAweGZmZmYsDQorCQkuYWdlX2NvbmZpZwkJ PSAweDU1NTU1NSwNCisJCS5hZ2VtCQkJPSAwLA0KKwkJLmRjX2NvbmZpZwkJPSAweDU1NTU1NSwN CisJCS5kdnRfZml4ZWQJCT0gMHg3LA0KKwkJLnZjbwkJCT0gMHgxMCwNCisJCS5jaGtfc2hpZnQJ CT0gMHg3NywNCisJCS51cHBlcl90ZW1wX2JvdW5kCT0gMHg2NCwNCisJCS5sb3dlcl90ZW1wX2Jv dW5kCT0gMHhiMiwNCisJCS5oaWdoX3RlbXBfdGhyZWFzaG9sZAk9IEhJR0hfVEVNUF9NQVgsDQor CQkubG93X3RlbXBfdGhyZWFzaG9sZAk9IDI1MDAwLA0KKwkJLmxvd190ZW1wX29mZnNldAk9IDAs DQorCQkuY29yZV9zZWwJCT0gMHg4ZmZmMDAwMSwNCisJCS5zeXN0ZW1jbGtfZW4JCT0gQklUKDMx KSwNCisJCS5pbnRfc3QJCQk9IEJJVCgxKSwNCisJCS5jdGwwCQkJPSAweDAwMDAwMDAxLA0KKwl9 LA0KKwl7DQorCQkub2ZfY29tcGF0aWJsZQkJPSAibWVkaWF0ZWssbXQ4MTgzLXN2cy1jY2kiLA0K KwkJLnN3X2lkCQkJPSBTVlNfQ0NJLA0KKwkJLmJhbmtfaWQJCT0gMiwNCisJCS5vcHMJCQk9ICZz dnNfbXQ4MTgzX2JhbmtzX29wcywNCisJCS50em9uZV9uYW1lCQk9ICJ0enRzNCIsDQorCQkuYnVj a19uYW1lCQk9ICJ2Y2NpIiwNCisJCS5tdGNtb3NfcmVxdWVzdAkJPSBmYWxzZSwNCisJCS5pbml0 MDFfdm9sdF9mbGFnCT0gU1ZTQl9JTklUMDFfVk9MVF9JTkNfT05MWSwNCisJCS5tb2RlX3N1cHBv cnQJCT0gU1ZTQl9NT0RFX0lOSVQwMSB8IFNWU0JfTU9ERV9JTklUMDIsDQorCQkub3BwX2NvdW50 CQk9IDE2LA0KKwkJLmZyZXFfYmFzZQkJPSAxMTk2MDAwMDAwLA0KKwkJLnZib290CQkJPSAweDMw LA0KKwkJLnZvbHRfc3RlcAkJPSA2MjUwLA0KKwkJLnZvbHRfYmFzZQkJPSA1MDAwMDAsDQorCQku dm9sdF9vZmZzZXQJCT0gMCwNCisJCS52bWF4CQkJPSAweDY0LA0KKwkJLnZtaW4JCQk9IDB4MTgs DQorCQkuZHRoaQkJCT0gMHgxLA0KKwkJLmR0bG8JCQk9IDB4ZmUsDQorCQkuZGV0X3dpbmRvdwkJ PSAweGEyOCwNCisJCS5kZXRfbWF4CQk9IDB4ZmZmZiwNCisJCS5hZ2VfY29uZmlnCQk9IDB4NTU1 NTU1LA0KKwkJLmFnZW0JCQk9IDAsDQorCQkuZGNfY29uZmlnCQk9IDB4NTU1NTU1LA0KKwkJLmR2 dF9maXhlZAkJPSAweDcsDQorCQkudmNvCQkJPSAweDEwLA0KKwkJLmNoa19zaGlmdAkJPSAweDc3 LA0KKwkJLnVwcGVyX3RlbXBfYm91bmQJPSAweDY0LA0KKwkJLmxvd2VyX3RlbXBfYm91bmQJPSAw eGIyLA0KKwkJLmhpZ2hfdGVtcF90aHJlYXNob2xkCT0gSElHSF9URU1QX01BWCwNCisJCS5sb3df dGVtcF90aHJlYXNob2xkCT0gMjUwMDAsDQorCQkubG93X3RlbXBfb2Zmc2V0CT0gMCwNCisJCS5j b3JlX3NlbAkJPSAweDhmZmYwMDAyLA0KKwkJLnN5c3RlbWNsa19lbgkJPSBCSVQoMzEpLA0KKwkJ LmludF9zdAkJCT0gQklUKDIpLA0KKwkJLmN0bDAJCQk9IDB4MDAxMDAwMDMsDQorCX0sDQorCXsN CisJCS5vZl9jb21wYXRpYmxlCQk9ICJtZWRpYXRlayxtdDgxODMtc3ZzLWdwdSIsDQorCQkuc3df aWQJCQk9IFNWU19HUFUsDQorCQkuYmFua19pZAkJPSAzLA0KKwkJLm9wcwkJCT0gJnN2c19tdDgx ODNfYmFua3Nfb3BzLA0KKwkJLnR6b25lX25hbWUJCT0gInR6dHMyIiwNCisJCS5idWNrX25hbWUJ CT0gInZncHUiLA0KKwkJLm10Y21vc19yZXF1ZXN0CQk9IHRydWUsDQorCQkuaW5pdDAxX3ZvbHRf ZmxhZwk9IFNWU0JfSU5JVDAxX1ZPTFRfSU5DX09OTFksDQorCQkubW9kZV9zdXBwb3J0CQk9IFNW U0JfTU9ERV9JTklUMDEgfCBTVlNCX01PREVfSU5JVDAyIHwNCisJCQkJCSAgU1ZTQl9NT0RFX01P TiwNCisJCS5vcHBfY291bnQJCT0gMTYsDQorCQkuZnJlcV9iYXNlCQk9IDkwMDAwMDAwMCwNCisJ CS52Ym9vdAkJCT0gMHgzMCwNCisJCS52b2x0X3N0ZXAJCT0gNjI1MCwNCisJCS52b2x0X2Jhc2UJ CT0gNTAwMDAwLA0KKwkJLnZvbHRfb2Zmc2V0CQk9IDAsDQorCQkudm1heAkJCT0gMHg0MCwNCisJ CS52bWluCQkJPSAweDE0LA0KKwkJLmR0aGkJCQk9IDB4MSwNCisJCS5kdGxvCQkJPSAweGZlLA0K KwkJLmRldF93aW5kb3cJCT0gMHhhMjgsDQorCQkuZGV0X21heAkJPSAweGZmZmYsDQorCQkuYWdl X2NvbmZpZwkJPSAweDU1NTU1NSwNCisJCS5hZ2VtCQkJPSAwLA0KKwkJLmRjX2NvbmZpZwkJPSAw eDU1NTU1NSwNCisJCS5kdnRfZml4ZWQJCT0gMHgzLA0KKwkJLnZjbwkJCT0gMHgxMCwNCisJCS5j aGtfc2hpZnQJCT0gMHg3NywNCisJCS51cHBlcl90ZW1wX2JvdW5kCT0gMHg2NCwNCisJCS5sb3dl cl90ZW1wX2JvdW5kCT0gMHhiMiwNCisJCS5oaWdoX3RlbXBfdGhyZWFzaG9sZAk9IEhJR0hfVEVN UF9NQVgsDQorCQkubG93X3RlbXBfdGhyZWFzaG9sZAk9IDI1MDAwLA0KKwkJLmxvd190ZW1wX29m ZnNldAk9IDMsDQorCQkuY29yZV9zZWwJCT0gMHg4ZmZmMDAwMywNCisJCS5zeXN0ZW1jbGtfZW4J CT0gQklUKDMxKSwNCisJCS5pbnRfc3QJCQk9IEJJVCgzKSwNCisJCS5jdGwwCQkJPSAweDAwMDUw MDAxLA0KKwl9LA0KK307DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBzdnNfcGxhdGZvcm0gc3Zz X210ODE4M19wbGF0Zm9ybSA9IHsNCisJLm5hbWUJCQk9ICJtdDgxODMtc3ZzIiwNCisJLmJhbmtz CQkJPSBzdnNfbXQ4MTgzX2JhbmtzLA0KKwkuZWZ1c2VfcGFyc2luZwkJPSBzdnNfbXQ4MTgzX2Vm dXNlX3BhcnNpbmcsDQorCS5yZWdzCQkJPSBzdnNfcmVnc192MiwNCisJLmlycWZsYWdzCQk9IElS UUZfVFJJR0dFUl9MT1cgfCBJUlFGX09ORVNIT1QsDQorCS5uZWVkX2h3X3Jlc2V0CQk9IGZhbHNl LA0KKwkuZmFrZV9lZnVzZQkJPSBmYWxzZSwNCisJLmJhbmtfbnVtCQk9IDQsDQorCS5lZnVzZV9u dW0JCT0gMjUsDQorCS5lZnVzZV9jaGVjawkJPSAyLA0KKwkudGhlcm1hbF9lZnVzZV9udW0JPSAz LA0KK307DQorDQorc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgbXRrX3N2c19vZl9t YXRjaFtdID0gew0KKwl7DQorCQkuY29tcGF0aWJsZSA9ICJtZWRpYXRlayxtdDgxODMtc3ZzIiwN CisJCS5kYXRhID0gJnN2c19tdDgxODNfcGxhdGZvcm0sDQorCX0sIHsNCisJCS8qIFNlbnRpbmVs ICovDQorCX0sDQorfTsNCisNCitzdGF0aWMgaW50IHN2c19hZGRfdGhlcm1hbF9kZXZpY2VfbGlu ayhzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzdnNfcGRldikNCit7DQorCXN0cnVjdCBkZXZpY2Vf bm9kZSAqdGhlcm1fbm9kZTsNCisJc3RydWN0IHBsYXRmb3JtX2RldmljZSAqdGhlcm1fcGRldjsN CisJc3RydWN0IGRldmljZV9saW5rICAqc3VwX2xpbms7DQorCWNoYXIgY29uc3QgKnRoZXJtX25v ZGVfbmFtZVtdID0geyJ0aGVybWFsIn07DQorCXUzMiBpOw0KKw0KKwlmb3IgKGkgPSAwOyBpIDwg QVJSQVlfU0laRSh0aGVybV9ub2RlX25hbWUpOyBpKyspIHsNCisJCXRoZXJtX25vZGUgPSBvZl9m aW5kX25vZGVfYnlfbmFtZShOVUxMLCB0aGVybV9ub2RlX25hbWVbaV0pOw0KKwkJaWYgKHRoZXJt X25vZGUpDQorCQkJYnJlYWs7DQorCX0NCisNCisJaWYgKCF0aGVybV9ub2RlKSB7DQorCQlwcl9l cnIoIm5vIGF2YWlsYWJsZSB0aGVybWFsIG5vZGU/IHBhc3MgZGV2aWNlIGxpbmtcbiIpOw0KKwkJ cmV0dXJuIDA7DQorCX0NCisNCisJdGhlcm1fcGRldiA9IG9mX2ZpbmRfZGV2aWNlX2J5X25vZGUo dGhlcm1fbm9kZSk7DQorCWlmICghdGhlcm1fcGRldikgew0KKwkJcHJfZXJyKCJubyBcIiVwT0Zc IiBwbGF0Zm9ybSBkZXZpY2U/IHBhc3MgZGV2aWNlIGxpbmtcbiIsDQorCQkgICAgICAgdGhlcm1f bm9kZSk7DQorCQlvZl9ub2RlX3B1dCh0aGVybV9ub2RlKTsNCisJCXJldHVybiAwOw0KKwl9DQor DQorCW9mX25vZGVfcHV0KHRoZXJtX25vZGUpOw0KKw0KKwlzdXBfbGluayA9IGRldmljZV9saW5r X2FkZCgmc3ZzX3BkZXYtPmRldiwgJnRoZXJtX3BkZXYtPmRldiwNCisJCQkJICAgRExfRkxBR19B VVRPUkVNT1ZFX0NPTlNVTUVSKTsNCisNCisJaWYgKHN1cF9saW5rLT5zdGF0dXMgPT0gRExfU1RB VEVfRE9STUFOVCkNCisJCXJldHVybiAtRVBST0JFX0RFRkVSOw0KKw0KKwlyZXR1cm4gMDsNCit9 DQorDQorc3RhdGljIGludCBzdnNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikN Cit7DQorCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm9mX2Rldl9pZDsNCisJc3RydWN0IG10 a19zdnMgKnN2czsNCisJaW50IHJldDsNCisJdTMyIHN2c19pcnE7DQorDQorCXJldCA9IHN2c19h ZGRfdGhlcm1hbF9kZXZpY2VfbGluayhwZGV2KTsNCisJaWYgKHJldCkNCisJCXJldHVybiByZXQ7 DQorDQorCXN2cyA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnN2cyksIEdGUF9L RVJORUwpOw0KKwlpZiAoIXN2cykNCisJCXJldHVybiAtRU5PTUVNOw0KKw0KKwlzdnMtPmRldiA9 ICZwZGV2LT5kZXY7DQorCWlmICghc3ZzLT5kZXYtPm9mX25vZGUpIHsNCisJCXByX2VycigiY2Fu bm90IGZpbmQgZGV2aWNlIG5vZGVcbiIpOw0KKwkJcmV0dXJuIC1FTk9ERVY7DQorCX0NCisNCisJ c3ZzLT5iYXNlID0gb2ZfaW9tYXAoc3ZzLT5kZXYtPm9mX25vZGUsIDApOw0KKwlpZiAoSVNfRVJS KHN2cy0+YmFzZSkpIHsNCisJCXByX2VycigiY2Fubm90IGZpbmQgc3ZzIHJlZ2lzdGVyIGJhc2Vc biIpOw0KKwkJcmV0dXJuIFBUUl9FUlIoc3ZzLT5iYXNlKTsNCisJfQ0KKw0KKwlvZl9kZXZfaWQg PSBvZl9tYXRjaF9ub2RlKG10a19zdnNfb2ZfbWF0Y2gsIHN2cy0+ZGV2LT5vZl9ub2RlKTsNCisJ aWYgKCFvZl9kZXZfaWQgfHwgIW9mX2Rldl9pZC0+ZGF0YSkNCisJCXJldHVybiAtRUlOVkFMOw0K Kw0KKwlzdnMtPnBsYXRmb3JtID0gb2ZfZGV2X2lkLT5kYXRhOw0KKwlkZXZfc2V0X2RydmRhdGEo c3ZzLT5kZXYsIHN2cyk7DQorDQorCXN2c19pcnEgPSBpcnFfb2ZfcGFyc2VfYW5kX21hcChzdnMt PmRldi0+b2Zfbm9kZSwgMCk7DQorCXJldCA9IGRldm1fcmVxdWVzdF90aHJlYWRlZF9pcnEoc3Zz LT5kZXYsIHN2c19pcnEsIE5VTEwsIHN2c19pc3IsDQorCQkJCQlzdnMtPnBsYXRmb3JtLT5pcnFm bGFncywgIm10ay1zdnMiLA0KKwkJCQkJc3ZzKTsNCisJaWYgKHJldCkgew0KKwkJcHJfZXJyKCJy ZWdpc3RlciBpcnEoJWQpIGZhaWxlZDogJWRcbiIsIHN2c19pcnEsIHJldCk7DQorCQlyZXR1cm4g cmV0Ow0KKwl9DQorDQorCXN2cy0+bWFpbl9jbGsgPSBkZXZtX2Nsa19nZXQoc3ZzLT5kZXYsICJt YWluIik7DQorCWlmIChJU19FUlIoc3ZzLT5tYWluX2NsaykpIHsNCisJCXByX2VycigiZmFpbGVk IHRvIGdldCBjbG9jazogJWxkXG4iLCBQVFJfRVJSKHN2cy0+bWFpbl9jbGspKTsNCisJCXJldHVy biBQVFJfRVJSKHN2cy0+bWFpbl9jbGspOw0KKwl9DQorDQorCXJldCA9IGNsa19wcmVwYXJlX2Vu YWJsZShzdnMtPm1haW5fY2xrKTsNCisJaWYgKHJldCkgew0KKwkJcHJfZXJyKCJjYW5ub3QgZW5h YmxlIG1haW4gY2xrOiAlZFxuIiwgcmV0KTsNCisJCXJldHVybiByZXQ7DQorCX0NCisNCisJaWYg KCFzdnNfaXNfc3VwcG9ydGVkKHN2cykpIHsNCisJCXByX25vdGljZSgic3ZzIGlzIG5vdCBzdXBw b3J0ZWRcbiIpOw0KKwkJcmV0ID0gLUVQRVJNOw0KKwkJZ290byBzdnNfcHJvYmVfZmFpbDsNCisJ fQ0KKw0KKwlyZXQgPSBzdnNfcmVzb3VyY2Vfc2V0dXAoc3ZzKTsNCisJaWYgKHJldCkNCisJCWdv dG8gc3ZzX3Byb2JlX2ZhaWw7DQorDQorCXJldCA9IHN2c19zdGFydChzdnMpOw0KKwlpZiAocmV0 KQ0KKwkJZ290byBzdnNfcHJvYmVfZmFpbDsNCisNCisJcmV0ID0gc3ZzX2NyZWF0ZV9zdnNfcHJv Y2ZzKHN2cyk7DQorCWlmIChyZXQpDQorCQlnb3RvIHN2c19wcm9iZV9mYWlsOw0KKw0KKwlyZXR1 cm4gMDsNCisNCitzdnNfcHJvYmVfZmFpbDoNCisJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHN2cy0+ bWFpbl9jbGspOw0KKw0KKwlyZXR1cm4gcmV0Ow0KK30NCisNCitzdGF0aWMgY29uc3Qgc3RydWN0 IGRldl9wbV9vcHMgc3ZzX3BtX29wcyA9IHsNCisJLnN1c3BlbmQJPSBzdnNfc3VzcGVuZCwNCisJ LnJlc3VtZQkJPSBzdnNfcmVzdW1lLA0KK307DQorDQorc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgc3ZzX2RyaXZlciA9IHsNCisJLnByb2JlCT0gc3ZzX3Byb2JlLA0KKwkuZHJpdmVyCT0g ew0KKwkJLm5hbWUJCT0gIm10ay1zdnMiLA0KKwkJLnBtCQk9ICZzdnNfcG1fb3BzLA0KKwkJLm9m X21hdGNoX3RhYmxlCT0gb2ZfbWF0Y2hfcHRyKG10a19zdnNfb2ZfbWF0Y2gpLA0KKwl9LA0KK307 DQorDQorc3RhdGljIGludCBfX2luaXQgc3ZzX2luaXQodm9pZCkNCit7DQorCWludCByZXQ7DQor DQorCXJldCA9IHBsYXRmb3JtX2RyaXZlcl9yZWdpc3Rlcigmc3ZzX2RyaXZlcik7DQorCWlmIChy ZXQpIHsNCisJCXByX2Vycigic3ZzIHBsYXRmb3JtIGRyaXZlciByZWdpc3RlciBmYWlsZWQ6ICVk XG4iLCByZXQpOw0KKwkJcmV0dXJuIHJldDsNCisJfQ0KKw0KKwlyZXR1cm4gMDsNCit9DQorDQor bGF0ZV9pbml0Y2FsbF9zeW5jKHN2c19pbml0KTsNCisNCitNT0RVTEVfREVTQ1JJUFRJT04oIk1l ZGlhVGVrIFNWUyBEcml2ZXIgdjEuMCIpOw0KK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsNCmRpZmYg LS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bvd2VyL210a19zdnMuaCBiL2luY2x1ZGUvbGludXgvcG93 ZXIvbXRrX3N2cy5oDQpuZXcgZmlsZSBtb2RlIDEwMDY0NA0KaW5kZXggMDAwMDAwMDAwMDAwLi41 YzAzOTgyZTM1NzYNCi0tLSAvZGV2L251bGwNCisrKyBiL2luY2x1ZGUvbGludXgvcG93ZXIvbXRr X3N2cy5oDQpAQCAtMCwwICsxLDIzIEBADQorLyogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjANCisgKg0KKyAqIENvcHlyaWdodCAoQykgMjAyMCBNZWRpYVRlayBJbmMuDQorICovDQor DQorI2lmbmRlZiBfX01US19TVlNfSF9fDQorI2RlZmluZSBfX01US19TVlNfSF9fDQorDQorI2lm IElTX0VOQUJMRUQoQ09ORklHX01US19TVlMpDQordW5zaWduZWQgbG9uZyBjbGFpbV9tdGtfc3Zz X2xvY2sodm9pZCk7DQordm9pZCByZWxlYXNlX210a19zdnNfbG9jayh1bnNpZ25lZCBsb25nIGZs YWdzKTsNCisjZWxzZQ0KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjbGFpbV9tdGtfc3Zz X2xvY2sodm9pZCkNCit7DQorCXJldHVybiAwOw0KK30NCisNCitzdGF0aWMgaW5saW5lIHZvaWQg cmVsZWFzZV9tdGtfc3ZzX2xvY2sodW5zaWduZWQgbG9uZyBmbGFncykNCit7DQorfQ0KKyNlbmRp ZiAvKiBDT05GSUdfTVRLX1NWUyAqLw0KKw0KKyNlbmRpZiAvKiBfX01US19TVlNfSF9fICovDQot LSANCjIuMTguMA0K