From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alan Cox Subject: [PATCH 11/12] gma500: Add support for Cedarview Date: Thu, 03 Nov 2011 18:22:37 +0000 Message-ID: <20111103182237.29503.99851.stgit@bob.linux.org.uk> References: <20111103182046.29503.60288.stgit@bob.linux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from lxorguk.ukuu.org.uk (lxorguk.ukuu.org.uk [81.2.110.251]) by gabe.freedesktop.org (Postfix) with ESMTP id DB9079EFC5 for ; Thu, 3 Nov 2011 11:11:45 -0700 (PDT) In-Reply-To: <20111103182046.29503.60288.stgit@bob.linux.org.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org Errors-To: dri-devel-bounces+sf-dri-devel=m.gmane.org@lists.freedesktop.org To: airlied@linux.ie, dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org RnJvbTogQWxhbiBDb3ggPGFsYW5AbGludXguaW50ZWwuY29tPgoKQWdhaW4gdGhpcyBpcyBzaW1p bGFyIGJ1dCBoYXMgc29tZSBkaWZmZXJlbmNlcyBzbyB3ZSBoYXZlIGEgc2V0IG9mIHBsdWcgaW4K c3VwcG9ydC4gVGhpcyBkb2VzIG1ha2UgdGhlIGRyaXZlciBiaWdnZXIgdGhhbiBpcyBuZWVkZWQg aW4gc29tZSByZXNwZWN0cwpidXQgdGhlIHRyYWRlb2ZmIGZvciBtYWludGFpbmFiaWxpdHkgaXMg aHVnZS4KClNpZ25lZC1vZmYtYnk6IEFsYW4gQ294IDxhbGFuQGxpbnV4LmludGVsLmNvbT4KLS0t CgogZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfZGV2aWNlLmMgICAgICAgIHwgIDM1MSArKysr KysrCiBkcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9kZXZpY2UuaCAgICAgICAgfCAgIDM2ICsK IGRyaXZlcnMvZ3B1L2RybS9nbWE1MDAvY2R2X2ludGVsX2NydC5jICAgICB8ICAzMjYgKysrKysr CiBkcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9kaXNwbGF5LmMgfCAxNTA4ICsrKysr KysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9nbWE1MDAvY2R2X2ludGVs X2hkbWkuYyAgICB8ICAzNzYgKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfaW50 ZWxfbHZkcy5jICAgIHwgIDcyMSArKysrKysrKysrKysrCiA2IGZpbGVzIGNoYW5nZWQsIDMzMTgg aW5zZXJ0aW9ucygrKSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vZ21hNTAwL2Nkdl9kZXZpY2UuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9nbWE1MDAvY2R2X2RldmljZS5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL2dtYTUwMC9jZHZfaW50ZWxfY3J0LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9kaXNwbGF5LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9oZG1pLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9sdmRzLmMKCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfZGV2aWNlLmMgYi9kcml2ZXJzL2dwdS9kcm0vZ21h NTAwL2Nkdl9kZXZpY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzYx NGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfZGV2aWNl LmMKQEAgLTAsMCArMSwzNTEgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChj KSAyMDExLCBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIsIGFzIHB1Ymxpc2hl ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQK KyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1F UkNIQU5UQUJJTElUWSBvcgorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvcgorICogbW9yZSBkZXRhaWxzLgor ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFsb25nIHdpdGgKKyAqIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0 ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4g U3QgLSBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCisKKyNpbmNsdWRlIDxsaW51eC9iYWNrbGlnaHQuaD4KKyNpbmNsdWRlIDxk cm0vZHJtUC5oPgorI2luY2x1ZGUgPGRybS9kcm0uaD4KKyNpbmNsdWRlICJwc2JfZHJtLmgiCisj aW5jbHVkZSAicHNiX2Rydi5oIgorI2luY2x1ZGUgInBzYl9yZWcuaCIKKyNpbmNsdWRlICJwc2Jf aW50ZWxfcmVnLmgiCisjaW5jbHVkZSAiaW50ZWxfYmlvcy5oIgorI2luY2x1ZGUgImNkdl9kZXZp Y2UuaCIKKworI2RlZmluZSBWR0FfU1JfSU5ERVgJCTB4M2M0CisjZGVmaW5lIFZHQV9TUl9EQVRB CQkweDNjNQorCisvKiBGSVhNRTogc2hvdWxkIGNoZWNrIGlmIHdlIGFyZSB0aGUgYWN0aXZlIFZH QSBkZXZpY2UgPz8gKi8KK3N0YXRpYyB2b2lkIGNkdl9kaXNhYmxlX3ZnYShzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2KQoreworCXU4IHNyMTsKKwl1MzIgdmdhX3JlZzsKKworCXZnYV9yZWcgPSBWR0FD TlRSTDsKKworCW91dGIoMSwgVkdBX1NSX0lOREVYKTsKKwlzcjEgPSBpbmIoVkdBX1NSX0RBVEEp OworCW91dGIoc3IxIHwgMTw8NSwgVkdBX1NSX0RBVEEpOworCXVkZWxheSgzMDApOworCisJUkVH X1dSSVRFKHZnYV9yZWcsIFZHQV9ESVNQX0RJU0FCTEUpOworCVJFR19SRUFEKHZnYV9yZWcpOwor fQorCitzdGF0aWMgaW50IGNkdl9vdXRwdXRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQor eworCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsK KwljZHZfZGlzYWJsZV92Z2EoZGV2KTsKKworCWNkdl9pbnRlbF9jcnRfaW5pdChkZXYsICZkZXZf cHJpdi0+bW9kZV9kZXYpOworCWNkdl9pbnRlbF9sdmRzX2luaXQoZGV2LCAmZGV2X3ByaXYtPm1v ZGVfZGV2KTsKKworCS8qIFRoZXNlIGJpdHMgaW5kaWNhdGUgSERNSSBub3QgU0RWTyBvbiBDRFYs IGJ1dCB3ZSBkb24ndCB5ZXQgc3VwcG9ydAorCSAgIHRoZSBIRE1JIGludGVyZmFjZSAqLworCWlm IChSRUdfUkVBRChTRFZPQikgJiBTRFZPX0RFVEVDVEVEKQorCQljZHZfaGRtaV9pbml0KGRldiwg JmRldl9wcml2LT5tb2RlX2RldiwgU0RWT0IpOworCWlmIChSRUdfUkVBRChTRFZPQykgJiBTRFZP X0RFVEVDVEVEKQorCQljZHZfaGRtaV9pbml0KGRldiwgJmRldl9wcml2LT5tb2RlX2RldiwgU0RW T0MpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJ Q0UKKworLyoKKyAqCVBvdWxzYm8gQmFja2xpZ2h0IEludGVyZmFjZXMKKyAqLworCisjZGVmaW5l IEJMQ19QV01fUFJFQ0lTSU9OX0ZBQ1RPUiAxMDAJLyogMTAwMDAwMDAgKi8KKyNkZWZpbmUgQkxD X1BXTV9GUkVRX0NBTENfQ09OU1RBTlQgMzIKKyNkZWZpbmUgTUh6IDEwMDAwMDAKKworI2RlZmlu ZSBQU0JfQkxDX1BXTV9QUkVDSVNJT05fRkFDVE9SICAgIDEwCisjZGVmaW5lIFBTQl9CTENfTUFY X1BXTV9SRUdfRlJFUSAgICAgICAgMHhGRkZFCisjZGVmaW5lIFBTQl9CTENfTUlOX1BXTV9SRUdf RlJFUSAgICAgICAgMHgyCisKKyNkZWZpbmUgUFNCX0JBQ0tMSUdIVF9QV01fUE9MQVJJVFlfQklU X0NMRUFSICgweEZGRkUpCisjZGVmaW5lIFBTQl9CQUNLTElHSFRfUFdNX0NUTF9TSElGVAkoMTYp CisKK3N0YXRpYyBpbnQgY2R2X2JyaWdodG5lc3M7CitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9k ZXZpY2UgKmNkdl9iYWNrbGlnaHRfZGV2aWNlOworCitzdGF0aWMgaW50IGNkdl9nZXRfYnJpZ2h0 bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJLyogcmV0dXJuIGxvY2FsbHkg Y2FjaGVkIHZhciBpbnN0ZWFkIG9mIEhXIHJlYWQgKGR1ZSB0byBEUFNUIGV0Yy4pICovCisJLyog RklYTUU6IGlkZWFsbHkgcmV0dXJuIGFjdHVhbCB2YWx1ZSBpbiBjYXNlIGZpcm13YXJlIGZpZGRs ZWQgd2l0aAorCSAgIGl0ICovCisJcmV0dXJuIGNkdl9icmlnaHRuZXNzOworfQorCisKK3N0YXRp YyBpbnQgY2R2X2JhY2tsaWdodF9zZXR1cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXN0 cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKwl1bnNp Z25lZCBsb25nIGNvcmVfY2xvY2s7CisJLyogdTMyIGJsX21heF9mcmVxOyAqLworCS8qIHVuc2ln bmVkIGxvbmcgdmFsdWU7ICovCisJdTE2IGJsX21heF9mcmVxOworCXVpbnQzMl90IHZhbHVlOwor CXVpbnQzMl90IGJsY19wd21fcHJlY2lzaW9uX2ZhY3RvcjsKKworCS8qIGdldCBibF9tYXhfZnJl cSBhbmQgcG9sIGZyb20gZGV2X3ByaXYqLworCWlmICghZGV2X3ByaXYtPmx2ZHNfYmwpIHsKKwkJ ZGV2X2VycihkZXYtPmRldiwgIkhhcyBubyB2YWxpZCBMVkRTIGJhY2tsaWdodCBpbmZvXG4iKTsK KwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCWJsX21heF9mcmVxID0gZGV2X3ByaXYtPmx2ZHNfYmwt PmZyZXE7CisJYmxjX3B3bV9wcmVjaXNpb25fZmFjdG9yID0gUFNCX0JMQ19QV01fUFJFQ0lTSU9O X0ZBQ1RPUjsKKworCWNvcmVfY2xvY2sgPSBkZXZfcHJpdi0+Y29yZV9mcmVxOworCisJdmFsdWUg PSAoY29yZV9jbG9jayAqIE1IeikgLyBCTENfUFdNX0ZSRVFfQ0FMQ19DT05TVEFOVDsKKwl2YWx1 ZSAqPSBibGNfcHdtX3ByZWNpc2lvbl9mYWN0b3I7CisJdmFsdWUgLz0gYmxfbWF4X2ZyZXE7CisJ dmFsdWUgLz0gYmxjX3B3bV9wcmVjaXNpb25fZmFjdG9yOworCisJaWYgKHZhbHVlID4gKHVuc2ln bmVkIGxvbmcgbG9uZylQU0JfQkxDX01BWF9QV01fUkVHX0ZSRVEgfHwKKwkJIHZhbHVlIDwgKHVu c2lnbmVkIGxvbmcgbG9uZylQU0JfQkxDX01JTl9QV01fUkVHX0ZSRVEpCisJCQkJcmV0dXJuIC1F UkFOR0U7CisJZWxzZSB7CisJCS8qIEZJWE1FICovCisJfQorCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGNkdl9zZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7 CisJaW50IGxldmVsID0gYmQtPnByb3BzLmJyaWdodG5lc3M7CisKKwkvKiBQZXJjZW50YWdlIDEt MTAwJSBiZWluZyB2YWxpZCAqLworCWlmIChsZXZlbCA8IDEpCisJCWxldmVsID0gMTsKKworCS8q Y2R2X2ludGVsX2x2ZHNfc2V0X2JyaWdodG5lc3MoZGV2LCBsZXZlbCk7IEZJWE1FICovCisJY2R2 X2JyaWdodG5lc3MgPSBsZXZlbDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVj dCBiYWNrbGlnaHRfb3BzIGNkdl9vcHMgPSB7CisJLmdldF9icmlnaHRuZXNzID0gY2R2X2dldF9i cmlnaHRuZXNzLAorCS51cGRhdGVfc3RhdHVzICA9IGNkdl9zZXRfYnJpZ2h0bmVzcywKK307CisK K3N0YXRpYyBpbnQgY2R2X2JhY2tsaWdodF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7 CisJc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwor CWludCByZXQ7CisJc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIHByb3BzOworCisJbWVtc2V0 KCZwcm9wcywgMCwgc2l6ZW9mKHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcykpOworCXByb3Bz Lm1heF9icmlnaHRuZXNzID0gMTAwOworCXByb3BzLnR5cGUgPSBCQUNLTElHSFRfUExBVEZPUk07 CisKKwljZHZfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInBz Yi1ibCIsCisJCQkJCU5VTEwsICh2b2lkICopZGV2LCAmY2R2X29wcywgJnByb3BzKTsKKwlpZiAo SVNfRVJSKGNkdl9iYWNrbGlnaHRfZGV2aWNlKSkKKwkJcmV0dXJuIFBUUl9FUlIoY2R2X2JhY2ts aWdodF9kZXZpY2UpOworCisJcmV0ID0gY2R2X2JhY2tsaWdodF9zZXR1cChkZXYpOworCWlmIChy ZXQgPCAwKSB7CisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3RlcihjZHZfYmFja2xpZ2h0X2Rl dmljZSk7CisJCWNkdl9iYWNrbGlnaHRfZGV2aWNlID0gTlVMTDsKKwkJcmV0dXJuIHJldDsKKwl9 CisJY2R2X2JhY2tsaWdodF9kZXZpY2UtPnByb3BzLmJyaWdodG5lc3MgPSAxMDA7CisJY2R2X2Jh Y2tsaWdodF9kZXZpY2UtPnByb3BzLm1heF9icmlnaHRuZXNzID0gMTAwOworCWJhY2tsaWdodF91 cGRhdGVfc3RhdHVzKGNkdl9iYWNrbGlnaHRfZGV2aWNlKTsKKwlkZXZfcHJpdi0+YmFja2xpZ2h0 X2RldmljZSA9IGNkdl9iYWNrbGlnaHRfZGV2aWNlOworCXJldHVybiAwOworfQorCisjZW5kaWYK KworLyoKKyAqCVByb3ZpZGUgdGhlIENlZGFydmlldyBzcGVjaWZpYyBjaGlwIGxvZ2ljIGFuZCBs b3cgbGV2ZWwgbWV0aG9kcworICoJZm9yIHBvd2VyIG1hbmFnZW1lbnQKKyAqCisgKglGSVhNRTog d2UgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGFwbS9vc3BtIGJhc2UgbWFuYWdlbWVudCBiaXRzCisg Kglmb3IgdGhpcyBhbmQgdGhlIE1JRCBkZXZpY2VzLgorICovCisKK3N0YXRpYyBpbmxpbmUgdTMy IENEVl9NU0dfUkVBRDMyKHVpbnQgcG9ydCwgdWludCBvZmZzZXQpCit7CisJaW50IG1jciA9ICgw eDEwPDwyNCkgfCAocG9ydCA8PCAxNikgfCAob2Zmc2V0IDw8IDgpOworCXVpbnQzMl90IHJldF92 YWwgPSAwOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfcm9vdCA9IHBjaV9nZXRfYnVzX2FuZF9zbG90 KDAsIDApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX3Jvb3QsIDB4RDAsIG1jcik7CisJ cGNpX3JlYWRfY29uZmlnX2R3b3JkKHBjaV9yb290LCAweEQ0LCAmcmV0X3ZhbCk7CisJcGNpX2Rl dl9wdXQocGNpX3Jvb3QpOworCXJldHVybiByZXRfdmFsOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgQ0RWX01TR19XUklURTMyKHVpbnQgcG9ydCwgdWludCBvZmZzZXQsIHUzMiB2YWx1ZSkKK3sK KwlpbnQgbWNyID0gKDB4MTE8PDI0KSB8IChwb3J0IDw8IDE2KSB8IChvZmZzZXQgPDwgOCkgfCAw eEYwOworCXN0cnVjdCBwY2lfZGV2ICpwY2lfcm9vdCA9IHBjaV9nZXRfYnVzX2FuZF9zbG90KDAs IDApOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQocGNpX3Jvb3QsIDB4RDQsIHZhbHVlKTsKKwlw Y2lfd3JpdGVfY29uZmlnX2R3b3JkKHBjaV9yb290LCAweEQwLCBtY3IpOworCXBjaV9kZXZfcHV0 KHBjaV9yb290KTsKK30KKworI2RlZmluZSBQU0JfQVBNX0NNRAkJCTB4MAorI2RlZmluZSBQU0Jf QVBNX1NUUwkJCTB4MDQKKyNkZWZpbmUgUFNCX1BNX1NTQwkJCTB4MjAKKyNkZWZpbmUgUFNCX1BN X1NTUwkJCTB4MzAKKyNkZWZpbmUgUFNCX1BXUkdUX0dGWF9NQVNLCQkweDMKKyNkZWZpbmUgQ0RW X1BXUkdUX0RJU1BMQVlfQ05UUgkJMHgwMDBmYzAwYworI2RlZmluZSBDRFZfUFdSR1RfRElTUExB WV9TVFMJCTB4MDAwZmMwMGMKKworc3RhdGljIHZvaWQgY2R2X2luaXRfcG0oc3RydWN0IGRybV9k ZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ ZGV2X3ByaXZhdGU7CisJdTMyIHB3cl9jbnQ7CisJaW50IGk7CisKKwlkZXZfcHJpdi0+YXBtX2Jh c2UgPSBDRFZfTVNHX1JFQUQzMihQU0JfUFVOSVRfUE9SVCwKKwkJCQkJCQlQU0JfQVBNQkEpICYg MHhGRkZGOworCWRldl9wcml2LT5vc3BtX2Jhc2UgPSBDRFZfTVNHX1JFQUQzMihQU0JfUFVOSVRf UE9SVCwKKwkJCQkJCQlQU0JfT1NQTUJBKSAmIDB4RkZGRjsKKworCS8qIEZvcmNlIHBvd2VyIG9u IGZvciBub3cgKi8KKwlwd3JfY250ID0gaW5sKGRldl9wcml2LT5hcG1fYmFzZSArIFBTQl9BUE1f Q01EKTsKKwlwd3JfY250ICY9IH5QU0JfUFdSR1RfR0ZYX01BU0s7CisKKwlvdXRsKHB3cl9jbnQs IGRldl9wcml2LT5hcG1fYmFzZSArIFBTQl9BUE1fQ01EKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTsg aSsrKSB7CisJCXUzMiBwd3Jfc3RzID0gaW5sKGRldl9wcml2LT5hcG1fYmFzZSArIFBTQl9BUE1f U1RTKTsKKwkJaWYgKChwd3Jfc3RzICYgUFNCX1BXUkdUX0dGWF9NQVNLKSA9PSAwKQorCQkJYnJl YWs7CisJCXVkZWxheSgxMCk7CisJfQorCXB3cl9jbnQgPSBpbmwoZGV2X3ByaXYtPm9zcG1fYmFz ZSArIFBTQl9QTV9TU0MpOworCXB3cl9jbnQgJj0gfkNEVl9QV1JHVF9ESVNQTEFZX0NOVFI7CisJ b3V0bChwd3JfY250LCBkZXZfcHJpdi0+b3NwbV9iYXNlICsgUFNCX1BNX1NTQyk7CisJZm9yIChp ID0gMDsgaSA8IDU7IGkrKykgeworCQl1MzIgcHdyX3N0cyA9IGlubChkZXZfcHJpdi0+b3NwbV9i YXNlICsgUFNCX1BNX1NTUyk7CisJCWlmICgocHdyX3N0cyAmIENEVl9QV1JHVF9ESVNQTEFZX1NU UykgPT0gMCkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMTApOworCX0KK30KKworLyoqCisgKgljZHZf c2F2ZV9kaXNwbGF5X3JlZ2lzdGVycwktCXNhdmUgcmVnaXN0ZXJzIGxvc3Qgb24gc3VzcGVuZAor ICoJQGRldjogb3VyIERSTSBkZXZpY2UKKyAqCisgKglTYXZlIHRoZSBzdGF0ZSB3ZSBuZWVkIGlu IG9yZGVyIHRvIGJlIGFibGUgdG8gcmVzdG9yZSB0aGUgaW50ZXJmYWNlCisgKgl1cG9uIHJlc3Vt ZSBmcm9tIHN1c3BlbmQKKyAqCisgKglGSVhNRTogcmV2aWV3CisgKi8KK3N0YXRpYyBpbnQgY2R2 X3NhdmVfZGlzcGxheV9yZWdpc3RlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1 cm4gMDsKK30KKworLyoqCisgKgljZHZfcmVzdG9yZV9kaXNwbGF5X3JlZ2lzdGVycwktCXJlc3Rv cmUgbG9zdCByZWdpc3RlciBzdGF0ZQorICoJQGRldjogb3VyIERSTSBkZXZpY2UKKyAqCisgKglS ZXN0b3JlIHJlZ2lzdGVyIHN0YXRlIHRoYXQgd2FzIGxvc3QgZHVyaW5nIHN1c3BlbmQgYW5kIHJl c3VtZS4KKyAqCisgKglGSVhNRTogcmV2aWV3CisgKi8KK3N0YXRpYyBpbnQgY2R2X3Jlc3RvcmVf ZGlzcGxheV9yZWdpc3RlcnMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBjZHZfcG93ZXJfZG93bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQor eworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNkdl9wb3dlcl91cChzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2KQoreworCXJldHVybiAwOworfQorCisvKiBGSVhNRSA/IC0gc2hhcmVkIHdpdGgg UG91bHNibyAqLworc3RhdGljIHZvaWQgY2R2X2dldF9jb3JlX2ZyZXEoc3RydWN0IGRybV9kZXZp Y2UgKmRldikKK3sKKwl1aW50MzJfdCBjbG9jazsKKwlzdHJ1Y3QgcGNpX2RldiAqcGNpX3Jvb3Qg PSBwY2lfZ2V0X2J1c19hbmRfc2xvdCgwLCAwKTsKKwlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpk ZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisKKwlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKHBj aV9yb290LCAweEQwLCAweEQwMDUwMzAwKTsKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQocGNpX3Jv b3QsIDB4RDQsICZjbG9jayk7CisJcGNpX2Rldl9wdXQocGNpX3Jvb3QpOworCisJc3dpdGNoIChj bG9jayAmIDB4MDcpIHsKKwljYXNlIDA6CisJCWRldl9wcml2LT5jb3JlX2ZyZXEgPSAxMDA7CisJ CWJyZWFrOworCWNhc2UgMToKKwkJZGV2X3ByaXYtPmNvcmVfZnJlcSA9IDEzMzsKKwkJYnJlYWs7 CisJY2FzZSAyOgorCQlkZXZfcHJpdi0+Y29yZV9mcmVxID0gMTUwOworCQlicmVhazsKKwljYXNl IDM6CisJCWRldl9wcml2LT5jb3JlX2ZyZXEgPSAxNzg7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJ ZGV2X3ByaXYtPmNvcmVfZnJlcSA9IDIwMDsKKwkJYnJlYWs7CisJY2FzZSA1OgorCWNhc2UgNjoK KwljYXNlIDc6CisJCWRldl9wcml2LT5jb3JlX2ZyZXEgPSAyNjY7CisJZGVmYXVsdDoKKwkJZGV2 X3ByaXYtPmNvcmVfZnJlcSA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IGNkdl9jaGlwX3NldHVw KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJY2R2X2dldF9jb3JlX2ZyZXEoZGV2KTsKKwln bWFfaW50ZWxfb3ByZWdpb25faW5pdChkZXYpOworCXBzYl9pbnRlbF9pbml0X2Jpb3MoZGV2KTsK KwlyZXR1cm4gMDsKK30KKworLyogQ0RWIGlzIG11Y2ggbGlrZSBQb3Vsc2JvIGJ1dCBoYXMgTUlE IGxpa2UgU0dYIG9mZnNldHMgYW5kIFBNICovCisKK2NvbnN0IHN0cnVjdCBwc2Jfb3BzIGNkdl9j aGlwX29wcyA9IHsKKwkubmFtZSA9ICJDZWRhcnRyYWlsIiwKKwkuYWNjZWxfMmQgPSAwLAorCS5w aXBlcyA9IDIsCisJLnNneF9vZmZzZXQgPSBNUlNUX1NHWF9PRkZTRVQsCisJLmNoaXBfc2V0dXAg PSBjZHZfY2hpcF9zZXR1cCwKKworCS5jcnRjX2hlbHBlciA9ICZjZHZfaW50ZWxfaGVscGVyX2Z1 bmNzLAorCS5jcnRjX2Z1bmNzID0gJmNkdl9pbnRlbF9jcnRjX2Z1bmNzLAorCisJLm91dHB1dF9p bml0ID0gY2R2X291dHB1dF9pbml0LAorCisjaWZkZWYgQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19E RVZJQ0UKKwkuYmFja2xpZ2h0X2luaXQgPSBjZHZfYmFja2xpZ2h0X2luaXQsCisjZW5kaWYKKwor CS5pbml0X3BtID0gY2R2X2luaXRfcG0sCisJLnNhdmVfcmVncyA9IGNkdl9zYXZlX2Rpc3BsYXlf cmVnaXN0ZXJzLAorCS5yZXN0b3JlX3JlZ3MgPSBjZHZfcmVzdG9yZV9kaXNwbGF5X3JlZ2lzdGVy cywKKwkucG93ZXJfZG93biA9IGNkdl9wb3dlcl9kb3duLAorCS5wb3dlcl91cCA9IGNkdl9wb3dl cl91cCwKK307CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9kZXZpY2Uu aCBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvY2R2X2RldmljZS5oCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAuLjJhODhiN2IKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dw dS9kcm0vZ21hNTAwL2Nkdl9kZXZpY2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJp Z2h0IMKpIDIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICog dW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo b3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgKiBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcg d2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb24sIEluYy4sIAorICogNTEgRnJhbmtsaW4gU3QgLSBGaWZ0aCBGbG9vciwgQm9z dG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqLworCitleHRlcm4gY29uc3Qgc3RydWN0IGRybV9j cnRjX2hlbHBlcl9mdW5jcyBjZHZfaW50ZWxfaGVscGVyX2Z1bmNzOworZXh0ZXJuIGNvbnN0IHN0 cnVjdCBkcm1fY3J0Y19mdW5jcyBjZHZfaW50ZWxfY3J0Y19mdW5jczsKK2V4dGVybiB2b2lkIGNk dl9pbnRlbF9jcnRfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJc3RydWN0IHBzYl9p bnRlbF9tb2RlX2RldmljZSAqbW9kZV9kZXYpOworZXh0ZXJuIHZvaWQgY2R2X2ludGVsX2x2ZHNf aW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJc3RydWN0IHBzYl9pbnRlbF9tb2RlX2Rl dmljZSAqbW9kZV9kZXYpOworZXh0ZXJuIHZvaWQgY2R2X2hkbWlfaW5pdChzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LCBzdHJ1Y3QgcHNiX2ludGVsX21vZGVfZGV2aWNlICptb2RlX2RldiwKKwkJCWlu dCByZWcpOworZXh0ZXJuIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpjZHZfaW50ZWxfY3J0Y19t b2RlX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBkcm1fY3J0 YyAqY3J0Yyk7CisKK2V4dGVybiBpbmxpbmUgdm9pZCBjZHZfaW50ZWxfd2FpdF9mb3JfdmJsYW5r KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCit7CisJLyogV2FpdCBmb3IgMjBtcywgaS5lLiBvbmUg Y3ljbGUgYXQgNTBoei4gKi8KKyAgICAgICAgLyogRklYTUU6IG1zbGVlcCA/PyAqLworCW1kZWxh eSgyMCk7Cit9CisKKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfaW50 ZWxfY3J0LmMgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9jcnQuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRhNjNiCi0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfaW50ZWxfY3J0LmMKQEAgLTAsMCArMSwzMjYgQEAK Ky8qCisgKiBDb3B5cmlnaHQgwqkgMjAwNi0yMDA3IEludGVsIENvcnBvcmF0aW9uCisgKgorICog UGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJz b24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBk b2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBT b2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9u CisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlz dHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdh cmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVy bmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAq CisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGlj ZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGlu IGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4K KyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5U WSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1Qg TElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZF TlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBG T1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g QU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJP TSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBP UiBPVEhFUgorICogREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqIEF1dGhvcnM6Cisg KglFcmljIEFuaG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICovCisKKyNpbmNsdWRlIDxsaW51eC9p MmMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorCisjaW5jbHVkZSAiaW50ZWxfYmlvcy5oIgor I2luY2x1ZGUgInBzYl9kcnYuaCIKKyNpbmNsdWRlICJwc2JfaW50ZWxfZHJ2LmgiCisjaW5jbHVk ZSAicHNiX2ludGVsX3JlZy5oIgorI2luY2x1ZGUgInBvd2VyLmgiCisjaW5jbHVkZSA8bGludXgv cG1fcnVudGltZS5oPgorCisKK3N0YXRpYyB2b2lkIGNkdl9pbnRlbF9jcnRfZHBtcyhzdHJ1Y3Qg ZHJtX2VuY29kZXIgKmVuY29kZXIsIGludCBtb2RlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpk ZXYgPSBlbmNvZGVyLT5kZXY7CisJdTMyIHRlbXAsIHJlZzsKKwlyZWcgPSBBRFBBOworCisJdGVt cCA9IFJFR19SRUFEKHJlZyk7CisJdGVtcCAmPSB+KEFEUEFfSFNZTkNfQ05UTF9ESVNBQkxFIHwg QURQQV9WU1lOQ19DTlRMX0RJU0FCTEUpOworCXRlbXAgJj0gfkFEUEFfREFDX0VOQUJMRTsKKwor CXN3aXRjaCAobW9kZSkgeworCWNhc2UgRFJNX01PREVfRFBNU19PTjoKKwkJdGVtcCB8PSBBRFBB X0RBQ19FTkFCTEU7CisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19TVEFOREJZOgorCQl0 ZW1wIHw9IEFEUEFfREFDX0VOQUJMRSB8IEFEUEFfSFNZTkNfQ05UTF9ESVNBQkxFOworCQlicmVh azsKKwljYXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKKwkJdGVtcCB8PSBBRFBBX0RBQ19FTkFC TEUgfCBBRFBBX1ZTWU5DX0NOVExfRElTQUJMRTsKKwkJYnJlYWs7CisJY2FzZSBEUk1fTU9ERV9E UE1TX09GRjoKKwkJdGVtcCB8PSBBRFBBX0hTWU5DX0NOVExfRElTQUJMRSB8IEFEUEFfVlNZTkNf Q05UTF9ESVNBQkxFOworCQlicmVhazsKKwl9CisKKwlSRUdfV1JJVEUocmVnLCB0ZW1wKTsKK30K Kworc3RhdGljIGludCBjZHZfaW50ZWxfY3J0X21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0 b3IgKmNvbm5lY3RvciwKKwkJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkKK3sKKwlp bnQgbWF4X2Nsb2NrID0gMDsKKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFND QU4pCisJCXJldHVybiBNT0RFX05PX0RCTEVTQ0FOOworCisJLyogVGhlIGxvd2VzdCBjbG9jayBm b3IgQ0RWIGlzIDIwMDAwS0h6ICovCisJaWYgKG1vZGUtPmNsb2NrIDwgMjAwMDApCisJCXJldHVy biBNT0RFX0NMT0NLX0xPVzsKKworCS8qIFRoZSBtYXggY2xvY2sgZm9yIENEViBpcyAzNTUgaW5z dGVhZCBvZiA0MDAgKi8KKwltYXhfY2xvY2sgPSAzNTUwMDA7CisJaWYgKG1vZGUtPmNsb2NrID4g bWF4X2Nsb2NrKQorCQlyZXR1cm4gTU9ERV9DTE9DS19ISUdIOworCisJaWYgKG1vZGUtPmhkaXNw bGF5ID4gMTY4MCB8fCBtb2RlLT52ZGlzcGxheSA+IDEwNTApCisJCXJldHVybiBNT0RFX1BBTkVM OworCisJcmV0dXJuIE1PREVfT0s7Cit9CisKK3N0YXRpYyBib29sIGNkdl9pbnRlbF9jcnRfbW9k ZV9maXh1cChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkJIHN0cnVjdCBkcm1fZGlz cGxheV9tb2RlICptb2RlLAorCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRf bW9kZSkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgY2R2X2ludGVsX2NydF9t b2RlX3NldChzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIsCisJCQkgICAgICAgc3RydWN0IGRy bV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUg KmFkanVzdGVkX21vZGUpCit7CisKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ ZGV2OworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGVuY29kZXItPmNydGM7CisJc3RydWN0IHBz Yl9pbnRlbF9jcnRjICpwc2JfaW50ZWxfY3J0YyA9CisJCQkJCXRvX3BzYl9pbnRlbF9jcnRjKGNy dGMpOworCWludCBkcGxsX21kX3JlZzsKKwl1MzIgYWRwYSwgZHBsbF9tZDsKKwl1MzIgYWRwYV9y ZWc7CisKKwlpZiAocHNiX2ludGVsX2NydGMtPnBpcGUgPT0gMCkKKwkJZHBsbF9tZF9yZWcgPSBE UExMX0FfTUQ7CisJZWxzZQorCQlkcGxsX21kX3JlZyA9IERQTExfQl9NRDsKKworCWFkcGFfcmVn ID0gQURQQTsKKworCS8qCisJICogRGlzYWJsZSBzZXBhcmF0ZSBtb2RlIG11bHRpcGxpZXIgdXNl ZCB3aGVuIGNsb25pbmcgU0RWTyB0byBDUlQKKwkgKiBYWFggdGhpcyBuZWVkcyB0byBiZSBhZGp1 c3RlZCB3aGVuIHdlIHJlYWxseSBhcmUgY2xvbmluZworCSAqLworCXsKKwkJZHBsbF9tZCA9IFJF R19SRUFEKGRwbGxfbWRfcmVnKTsKKwkJUkVHX1dSSVRFKGRwbGxfbWRfcmVnLAorCQkJICAgZHBs bF9tZCAmIH5EUExMX01EX1VESV9NVUxUSVBMSUVSX01BU0spOworCX0KKworCWFkcGEgPSAwOwor CWlmIChhZGp1c3RlZF9tb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfUEhTWU5DKQorCQlhZHBh IHw9IEFEUEFfSFNZTkNfQUNUSVZFX0hJR0g7CisJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYg RFJNX01PREVfRkxBR19QVlNZTkMpCisJCWFkcGEgfD0gQURQQV9WU1lOQ19BQ1RJVkVfSElHSDsK KworCWlmIChwc2JfaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKQorCQlhZHBhIHw9IEFEUEFfUElQRV9B X1NFTEVDVDsKKwllbHNlCisJCWFkcGEgfD0gQURQQV9QSVBFX0JfU0VMRUNUOworCisJUkVHX1dS SVRFKGFkcGFfcmVnLCBhZHBhKTsKK30KKworCisvKioKKyAqIFVzZXMgQ1JUX0hPVFBMVUdfRU4g YW5kIENSVF9IT1RQTFVHX1NUQVQgdG8gZGV0ZWN0IENSVCBwcmVzZW5jZS4KKyAqCisgKiBccmV0 dXJuIHRydWUgaWYgQ1JUIGlzIGNvbm5lY3RlZC4KKyAqIFxyZXR1cm4gZmFsc2UgaWYgQ1JUIGlz IGRpc2Nvbm5lY3RlZC4KKyAqLworc3RhdGljIGJvb2wgY2R2X2ludGVsX2NydF9kZXRlY3RfaG90 cGx1ZyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLAorCQkJCQkJCQlib29sIGZvcmNl KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjb25uZWN0b3ItPmRldjsKKwl1MzIgaG90 cGx1Z19lbjsKKwlpbnQgaSwgdHJpZXMgPSAwLCByZXQgPSBmYWxzZTsKKwl1MzIgYWRwYV9vcmln OworCisJLyogZGlzYWJsZSB0aGUgREFDIHdoZW4gZG9pbmcgdGhlIGhvdHBsdWcgZGV0ZWN0aW9u ICovCisKKwlhZHBhX29yaWcgPSBSRUdfUkVBRChBRFBBKTsKKworCVJFR19XUklURShBRFBBLCBh ZHBhX29yaWcgJiB+KEFEUEFfREFDX0VOQUJMRSkpOworCisJLyoKKwkgKiBPbiBhIENEViB0aGVw LCBDUlQgZGV0ZWN0IHNlcXVlbmNlIG5lZWQgdG8gYmUgZG9uZSB0d2ljZQorCSAqIHRvIGdldCBh IHJlbGlhYmxlIHJlc3VsdC4KKwkgKi8KKwl0cmllcyA9IDI7CisKKwlob3RwbHVnX2VuID0gUkVH X1JFQUQoUE9SVF9IT1RQTFVHX0VOKTsKKwlob3RwbHVnX2VuICY9IH4oQ1JUX0hPVFBMVUdfREVU RUNUX01BU0spOworCWhvdHBsdWdfZW4gfD0gQ1JUX0hPVFBMVUdfRk9SQ0VfREVURUNUOworCisJ aG90cGx1Z19lbiB8PSBDUlRfSE9UUExVR19BQ1RJVkFUSU9OX1BFUklPRF82NDsKKwlob3RwbHVn X2VuIHw9IENSVF9IT1RQTFVHX1ZPTFRBR0VfQ09NUEFSRV81MDsKKworCWZvciAoaSA9IDA7IGkg PCB0cmllcyA7IGkrKykgeworCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJCS8qIHR1cm4gb24g dGhlIEZPUkNFX0RFVEVDVCAqLworCQlSRUdfV1JJVEUoUE9SVF9IT1RQTFVHX0VOLCBob3RwbHVn X2VuKTsKKwkJdGltZW91dCA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCQkv KiB3YWl0IGZvciBGT1JDRV9ERVRFQ1QgdG8gZ28gb2ZmICovCisJCWRvIHsKKwkJCWlmICghKFJF R19SRUFEKFBPUlRfSE9UUExVR19FTikgJgorCQkJCQlDUlRfSE9UUExVR19GT1JDRV9ERVRFQ1Qp KQorCQkJCWJyZWFrOworCQkJbXNsZWVwKDEpOworCQl9IHdoaWxlICh0aW1lX2FmdGVyKHRpbWVv dXQsIGppZmZpZXMpKTsKKwl9CisKKwlpZiAoKFJFR19SRUFEKFBPUlRfSE9UUExVR19TVEFUKSAm IENSVF9IT1RQTFVHX01PTklUT1JfTUFTSykgIT0KKwkgICAgQ1JUX0hPVFBMVUdfTU9OSVRPUl9O T05FKQorCQlyZXQgPSB0cnVlOworCisJLyogUmVzdG9yZSB0aGUgc2F2ZWQgQURQQSAqLworCVJF R19XUklURShBRFBBLCBhZHBhX29yaWcpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBlbnVt IGRybV9jb25uZWN0b3Jfc3RhdHVzIGNkdl9pbnRlbF9jcnRfZGV0ZWN0KAorCQkJCXN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2UpCit7CisJaWYgKGNkdl9pbnRlbF9j cnRfZGV0ZWN0X2hvdHBsdWcoY29ubmVjdG9yLCBmb3JjZSkpCisJCXJldHVybiBjb25uZWN0b3Jf c3RhdHVzX2Nvbm5lY3RlZDsKKwllbHNlCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nv bm5lY3RlZDsKK30KKworc3RhdGljIHZvaWQgY2R2X2ludGVsX2NydF9kZXN0cm95KHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKmlu dGVsX291dHB1dCA9IHRvX3BzYl9pbnRlbF9vdXRwdXQoY29ubmVjdG9yKTsKKworCXBzYl9pbnRl bF9pMmNfZGVzdHJveShpbnRlbF9vdXRwdXQtPmRkY19idXMpOworCWRybV9zeXNmc19jb25uZWN0 b3JfcmVtb3ZlKGNvbm5lY3Rvcik7CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7 CisJa2ZyZWUoY29ubmVjdG9yKTsKK30KKworc3RhdGljIGludCBjZHZfaW50ZWxfY3J0X2dldF9t b2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBwc2JfaW50 ZWxfb3V0cHV0ICppbnRlbF9vdXRwdXQgPQorCQkJCXRvX3BzYl9pbnRlbF9vdXRwdXQoY29ubmVj dG9yKTsKKwlyZXR1cm4gcHNiX2ludGVsX2RkY19nZXRfbW9kZXMoaW50ZWxfb3V0cHV0KTsKK30K Kworc3RhdGljIGludCBjZHZfaW50ZWxfY3J0X3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5l Y3RvciAqY29ubmVjdG9yLAorCQkJCSAgc3RydWN0IGRybV9wcm9wZXJ0eSAqcHJvcGVydHksCisJ CQkJICB1aW50NjRfdCB2YWx1ZSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJvdXRpbmVz IGZvciBjb250cm9sbGluZyBzdHVmZiBvbiB0aGUgYW5hbG9nIHBvcnQKKyAqLworCitzdGF0aWMg Y29uc3Qgc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyBjZHZfaW50ZWxfY3J0X2hlbHBl cl9mdW5jcyA9IHsKKwkuZHBtcyA9IGNkdl9pbnRlbF9jcnRfZHBtcywKKwkubW9kZV9maXh1cCA9 IGNkdl9pbnRlbF9jcnRfbW9kZV9maXh1cCwKKwkucHJlcGFyZSA9IHBzYl9pbnRlbF9lbmNvZGVy X3ByZXBhcmUsCisJLmNvbW1pdCA9IHBzYl9pbnRlbF9lbmNvZGVyX2NvbW1pdCwKKwkubW9kZV9z ZXQgPSBjZHZfaW50ZWxfY3J0X21vZGVfc2V0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBk cm1fY29ubmVjdG9yX2Z1bmNzIGNkdl9pbnRlbF9jcnRfY29ubmVjdG9yX2Z1bmNzID0geworCS5k cG1zID0gZHJtX2hlbHBlcl9jb25uZWN0b3JfZHBtcywKKwkuZGV0ZWN0ID0gY2R2X2ludGVsX2Ny dF9kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0 b3JfbW9kZXMsCisJLmRlc3Ryb3kgPSBjZHZfaW50ZWxfY3J0X2Rlc3Ryb3ksCisJLnNldF9wcm9w ZXJ0eSA9IGNkdl9pbnRlbF9jcnRfc2V0X3Byb3BlcnR5LAorfTsKKworc3RhdGljIGNvbnN0IHN0 cnVjdCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcworCQkJCWNkdl9pbnRlbF9jcnRfY29ubmVj dG9yX2hlbHBlcl9mdW5jcyA9IHsKKwkubW9kZV92YWxpZCA9IGNkdl9pbnRlbF9jcnRfbW9kZV92 YWxpZCwKKwkuZ2V0X21vZGVzID0gY2R2X2ludGVsX2NydF9nZXRfbW9kZXMsCisJLmJlc3RfZW5j b2RlciA9IHBzYl9pbnRlbF9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgdm9pZCBjZHZfaW50 ZWxfY3J0X2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlkcm1f ZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9l bmNvZGVyX2Z1bmNzIGNkdl9pbnRlbF9jcnRfZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0gY2R2 X2ludGVsX2NydF9lbmNfZGVzdHJveSwKK307CisKK3ZvaWQgY2R2X2ludGVsX2NydF9pbml0KHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQlzdHJ1Y3QgcHNiX2ludGVsX21vZGVfZGV2aWNlICpt b2RlX2RldikKK3sKKworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpwc2JfaW50ZWxfb3V0cHV0 OworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9lbmNvZGVy ICplbmNvZGVyOworCisJdTMyIGkyY19yZWc7CisKKwlwc2JfaW50ZWxfb3V0cHV0ID0ga3phbGxv YyhzaXplb2Yoc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBz Yl9pbnRlbF9vdXRwdXQpCisJCXJldHVybjsKKworCXBzYl9pbnRlbF9vdXRwdXQtPm1vZGVfZGV2 ID0gbW9kZV9kZXY7CisJY29ubmVjdG9yID0gJnBzYl9pbnRlbF9vdXRwdXQtPmJhc2U7CisJZHJt X2Nvbm5lY3Rvcl9pbml0KGRldiwgY29ubmVjdG9yLAorCQkmY2R2X2ludGVsX2NydF9jb25uZWN0 b3JfZnVuY3MsIERSTV9NT0RFX0NPTk5FQ1RPUl9WR0EpOworCisJZW5jb2RlciA9ICZwc2JfaW50 ZWxfb3V0cHV0LT5lbmM7CisJZHJtX2VuY29kZXJfaW5pdChkZXYsIGVuY29kZXIsCisJCSZjZHZf aW50ZWxfY3J0X2VuY19mdW5jcywgRFJNX01PREVfRU5DT0RFUl9EQUMpOworCisJZHJtX21vZGVf Y29ubmVjdG9yX2F0dGFjaF9lbmNvZGVyKCZwc2JfaW50ZWxfb3V0cHV0LT5iYXNlLAorCQkJCQkg ICZwc2JfaW50ZWxfb3V0cHV0LT5lbmMpOworCisJLyogU2V0IHVwIHRoZSBEREMgYnVzLiAqLwor CWkyY19yZWcgPSBHUElPQTsKKwkvKiBSZW1vdmUgdGhlIGZvbGxvd2luZyBjb2RlIGZvciBDRFYg Ki8KKwkvKgorCWlmIChkZXZfcHJpdi0+Y3J0X2RkY19idXMgIT0gMCkKKwkJaTJjX3JlZyA9IGRl dl9wcml2LT5jcnRfZGRjX2J1czsKKwl9Ki8KKwlwc2JfaW50ZWxfb3V0cHV0LT5kZGNfYnVzID0g cHNiX2ludGVsX2kyY19jcmVhdGUoZGV2LAorCQkJCQkJaTJjX3JlZywgIkNSVEREQ19BIik7CisJ aWYgKCFwc2JfaW50ZWxfb3V0cHV0LT5kZGNfYnVzKSB7CisJCWRldl9wcmludGsoS0VSTl9FUlIs ICZkZXYtPnBkZXYtPmRldiwgIkREQyBidXMgcmVnaXN0cmF0aW9uICIKKwkJCSAgICJmYWlsZWQu XG4iKTsKKwkJZ290byBmYWlsZWRfZGRjOworCX0KKworCXBzYl9pbnRlbF9vdXRwdXQtPnR5cGUg PSBJTlRFTF9PVVRQVVRfQU5BTE9HOworCS8qCisJcHNiX2ludGVsX291dHB1dC0+Y2xvbmVfbWFz ayA9ICgxIDw8IElOVEVMX0FOQUxPR19DTE9ORV9CSVQpOworCXBzYl9pbnRlbF9vdXRwdXQtPmNy dGNfbWFzayA9ICgxIDw8IDApIHwgKDEgPDwgMSk7CisJKi8KKwljb25uZWN0b3ItPmludGVybGFj ZV9hbGxvd2VkID0gMDsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dlZCA9IDA7CisKKwlk cm1fZW5jb2Rlcl9oZWxwZXJfYWRkKGVuY29kZXIsICZjZHZfaW50ZWxfY3J0X2hlbHBlcl9mdW5j cyk7CisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwKKwkJCQkJJmNkdl9pbnRl bF9jcnRfY29ubmVjdG9yX2hlbHBlcl9mdW5jcyk7CisKKwlkcm1fc3lzZnNfY29ubmVjdG9yX2Fk ZChjb25uZWN0b3IpOworCisJcmV0dXJuOworZmFpbGVkX2RkYzoKKwlkcm1fZW5jb2Rlcl9jbGVh bnVwKCZwc2JfaW50ZWxfb3V0cHV0LT5lbmMpOworCWRybV9jb25uZWN0b3JfY2xlYW51cCgmcHNi X2ludGVsX291dHB1dC0+YmFzZSk7CisJa2ZyZWUocHNiX2ludGVsX291dHB1dCk7CisJcmV0dXJu OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfaW50ZWxfZGlzcGxh eS5jIGIvZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9jZHZfaW50ZWxfZGlzcGxheS5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOTdjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9kaXNwbGF5LmMKQEAgLTAsMCArMSwxNTA4 IEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMDYtMjAxMSBJbnRlbCBDb3Jwb3JhdGlvbgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2Yg dGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyLCBhcyBwdWJsaXNo ZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0g aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VU CisgKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBN RVJDSEFOVEFCSUxJVFkgb3IKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IKKyAqIG1vcmUgZGV0YWlscy4K KyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoCisgKiB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3Jp dGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGlu IFN0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICogQXV0 aG9yczoKKyAqCUVyaWMgQW5ob2x0IDxlcmljQGFuaG9sdC5uZXQ+CisgKi8KKworI2luY2x1ZGUg PGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKworI2luY2x1ZGUg PGRybS9kcm1QLmg+CisjaW5jbHVkZSAiZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJwc2JfZHJ2 LmgiCisjaW5jbHVkZSAicHNiX2ludGVsX2Rydi5oIgorI2luY2x1ZGUgInBzYl9pbnRlbF9yZWcu aCIKKyNpbmNsdWRlICJwc2JfaW50ZWxfZGlzcGxheS5oIgorI2luY2x1ZGUgInBvd2VyLmgiCisj aW5jbHVkZSAiY2R2X2RldmljZS5oIgorCisKK3N0cnVjdCBjZHZfaW50ZWxfcmFuZ2VfdCB7CisJ aW50IG1pbiwgbWF4OworfTsKKworc3RydWN0IGNkdl9pbnRlbF9wMl90IHsKKwlpbnQgZG90X2xp bWl0OworCWludCBwMl9zbG93LCBwMl9mYXN0OworfTsKKworc3RydWN0IGNkdl9pbnRlbF9jbG9j a190IHsKKwkvKiBnaXZlbiB2YWx1ZXMgKi8KKwlpbnQgbjsKKwlpbnQgbTEsIG0yOworCWludCBw MSwgcDI7CisJLyogZGVyaXZlZCB2YWx1ZXMgKi8KKwlpbnQgZG90OworCWludCB2Y287CisJaW50 IG07CisJaW50IHA7Cit9OworCisjZGVmaW5lIElOVEVMX1AyX05VTQkJICAgICAgMgorCitzdHJ1 Y3QgY2R2X2ludGVsX2xpbWl0X3QgeworCXN0cnVjdCBjZHZfaW50ZWxfcmFuZ2VfdCBkb3QsIHZj bywgbiwgbSwgbTEsIG0yLCBwLCBwMTsKKwlzdHJ1Y3QgY2R2X2ludGVsX3AyX3QgcDI7Cit9Owor CisjZGVmaW5lIENEVl9MSU1JVF9TSU5HTEVfTFZEU185NgkwCisjZGVmaW5lIENEVl9MSU1JVF9T SU5HTEVfTFZEU18xMDAJMQorI2RlZmluZSBDRFZfTElNSVRfREFDX0hETUlfMjcJCTIKKyNkZWZp bmUgQ0RWX0xJTUlUX0RBQ19IRE1JXzk2CQkzCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY2R2X2lu dGVsX2xpbWl0X3QgY2R2X2ludGVsX2xpbWl0c1tdID0geworCXsJCQkvKiBDRFZfU0lHTkxFX0xW RFNfOTZNSHogKi8KKwkgLmRvdCA9IHsubWluID0gMjAwMDAsIC5tYXggPSAxMTU1MDB9LAorCSAu dmNvID0gey5taW4gPSAxODAwMDAwLCAubWF4ID0gMzYwMDAwMH0sCisJIC5uID0gey5taW4gPSAy LCAubWF4ID0gNn0sCisJIC5tID0gey5taW4gPSA2MCwgLm1heCA9IDE2MH0sCisJIC5tMSA9IHsu bWluID0gMCwgLm1heCA9IDB9LAorCSAubTIgPSB7Lm1pbiA9IDU4LCAubWF4ID0gMTU4fSwKKwkg LnAgPSB7Lm1pbiA9IDI4LCAubWF4ID0gMTQwfSwKKwkgLnAxID0gey5taW4gPSAyLCAubWF4ID0g MTB9LAorCSAucDIgPSB7LmRvdF9saW1pdCA9IDIwMDAwMCwKKwkJLnAyX3Nsb3cgPSAxNCwgLnAy X2Zhc3QgPSAxNH0sCisJIH0sCisJewkJCS8qIENEVl9TSU5HTEVfTFZEU18xMDBNSHogKi8KKwkg LmRvdCA9IHsubWluID0gMjAwMDAsIC5tYXggPSAxMTU1MDB9LAorCSAudmNvID0gey5taW4gPSAx ODAwMDAwLCAubWF4ID0gMzYwMDAwMH0sCisJIC5uID0gey5taW4gPSAyLCAubWF4ID0gNn0sCisJ IC5tID0gey5taW4gPSA2MCwgLm1heCA9IDE2MH0sCisJIC5tMSA9IHsubWluID0gMCwgLm1heCA9 IDB9LAorCSAubTIgPSB7Lm1pbiA9IDU4LCAubWF4ID0gMTU4fSwKKwkgLnAgPSB7Lm1pbiA9IDI4 LCAubWF4ID0gMTQwfSwKKwkgLnAxID0gey5taW4gPSAyLCAubWF4ID0gMTB9LAorCSAvKiBUaGUg c2luZ2xlLWNoYW5uZWwgcmFuZ2UgaXMgMjUtMTEyTWh6LCBhbmQgZHVhbC1jaGFubmVsCisJICAq IGlzIDgwLTIyNE1oei4gIFByZWZlciBzaW5nbGUgY2hhbm5lbCBhcyBtdWNoIGFzIHBvc3NpYmxl LgorCSAgKi8KKwkgLnAyID0gey5kb3RfbGltaXQgPSAyMDAwMDAsIC5wMl9zbG93ID0gMTQsIC5w Ml9mYXN0ID0gMTR9LAorCSB9LAorCXsJCQkvKiBDRFZfREFDX0hETUlfMjdNSHogKi8KKwkgLmRv dCA9IHsubWluID0gMjAwMDAsIC5tYXggPSA0MDAwMDB9LAorCSAudmNvID0gey5taW4gPSAxODA5 MDAwLCAubWF4ID0gMzU2NDAwMH0sCisJIC5uID0gey5taW4gPSAxLCAubWF4ID0gMX0sCisJIC5t ID0gey5taW4gPSA2NywgLm1heCA9IDEzMn0sCisJIC5tMSA9IHsubWluID0gMCwgLm1heCA9IDB9 LAorCSAubTIgPSB7Lm1pbiA9IDY1LCAubWF4ID0gMTMwfSwKKwkgLnAgPSB7Lm1pbiA9IDUsIC5t YXggPSA5MH0sCisJIC5wMSA9IHsubWluID0gMSwgLm1heCA9IDl9LAorCSAucDIgPSB7LmRvdF9s aW1pdCA9IDIyNTAwMCwgLnAyX3Nsb3cgPSAxMCwgLnAyX2Zhc3QgPSA1fSwKKwkgfSwKKwl7CQkJ LyogQ0RWX0RBQ19IRE1JXzk2TUh6ICovCisJIC5kb3QgPSB7Lm1pbiA9IDIwMDAwLCAubWF4ID0g NDAwMDAwfSwKKwkgLnZjbyA9IHsubWluID0gMTgwMDAwMCwgLm1heCA9IDM2MDAwMDB9LAorCSAu biA9IHsubWluID0gMiwgLm1heCA9IDZ9LAorCSAubSA9IHsubWluID0gNjAsIC5tYXggPSAxNjB9 LAorCSAubTEgPSB7Lm1pbiA9IDAsIC5tYXggPSAwfSwKKwkgLm0yID0gey5taW4gPSA1OCwgLm1h eCA9IDE1OH0sCisJIC5wID0gey5taW4gPSA1LCAubWF4ID0gMTAwfSwKKwkgLnAxID0gey5taW4g PSAxLCAubWF4ID0gMTB9LAorCSAucDIgPSB7LmRvdF9saW1pdCA9IDIyNTAwMCwgLnAyX3Nsb3cg PSAxMCwgLnAyX2Zhc3QgPSA1fSwKKwkgfSwKK307CisKKyNkZWZpbmUgX3dhaXRfZm9yKENPTkQs IE1TLCBXKSAoeyBcCisJdW5zaWduZWQgbG9uZyB0aW1lb3V0X18gPSBqaWZmaWVzICsgbXNlY3Nf dG9famlmZmllcyhNUyk7CVwKKwlpbnQgcmV0X18gPSAwOwkJCQkJCQlcCisJd2hpbGUgKCEoQ09O RCkpIHsJCQkJCQlcCisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRpbWVvdXRfXykpIHsJCQlc CisJCQlyZXRfXyA9IC1FVElNRURPVVQ7CQkJCVwKKwkJCWJyZWFrOwkJCQkJCVwKKwkJfQkJCQkJ CQlcCisJCWlmIChXICYmICFpbl9kYmdfbWFzdGVyKCkpCQkJCVwKKwkJCW1zbGVlcChXKTsJCQkJ CVwKKwl9CQkJCQkJCQlcCisJcmV0X187CQkJCQkJCQlcCit9KQorCisjZGVmaW5lIHdhaXRfZm9y KENPTkQsIE1TKSBfd2FpdF9mb3IoQ09ORCwgTVMsIDEpCisKKworc3RhdGljIGludCBjZHZfc2Jf cmVhZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1MzIgcmVnLCB1MzIgKnZhbCkKK3sKKwlpbnQg cmV0OworCisJcmV0ID0gd2FpdF9mb3IoKFJFR19SRUFEKFNCX1BDS1QpICYgU0JfQlVTWSkgPT0g MCwgMTAwMCk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3Ig U0IgdG8gaWRsZSBiZWZvcmUgcmVhZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJUkVHX1dS SVRFKFNCX0FERFIsIHJlZyk7CisJUkVHX1dSSVRFKFNCX1BDS1QsCisJCSAgIFNFVF9GSUVMRChT Ql9PUENPREVfUkVBRCwgU0JfT1BDT0RFKSB8CisJCSAgIFNFVF9GSUVMRChTQl9ERVNUX0RQTEws IFNCX0RFU1QpIHwKKwkJICAgU0VUX0ZJRUxEKDB4ZiwgU0JfQllURV9FTkFCTEUpKTsKKworCXJl dCA9IHdhaXRfZm9yKChSRUdfUkVBRChTQl9QQ0tUKSAmIFNCX0JVU1kpID09IDAsIDEwMDApOwor CWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIFNCIHRvIGlkbGUg YWZ0ZXIgcmVhZFxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJKnZhbCA9IFJFR19SRUFEKFNC X0RBVEEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2R2X3NiX3dyaXRlKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsIHUzMiByZWcsIHUzMiB2YWwpCit7CisJaW50IHJldDsKKwlzdGF0 aWMgYm9vbCBkcGlvX2RlYnVnID0gdHJ1ZTsKKwl1MzIgdGVtcDsKKworCWlmIChkcGlvX2RlYnVn KSB7CisJCWlmIChjZHZfc2JfcmVhZChkZXYsIHJlZywgJnRlbXApID09IDApCisJCQlEUk1fREVC VUdfS01TKCIweCUwOHg6IDB4JTA4eCAoYmVmb3JlKVxuIiwgcmVnLCB0ZW1wKTsKKwkJRFJNX0RF QlVHX0tNUygiMHglMDh4OiAweCUwOHhcbiIsIHJlZywgdmFsKTsKKwl9CisKKwlyZXQgPSB3YWl0 X2ZvcigoUkVHX1JFQUQoU0JfUENLVCkgJiBTQl9CVVNZKSA9PSAwLCAxMDAwKTsKKwlpZiAocmV0 KSB7CisJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBTQiB0byBpZGxlIGJlZm9yZSB3 cml0ZVxuIik7CisJCXJldHVybiByZXQ7CisJfQorCisJUkVHX1dSSVRFKFNCX0FERFIsIHJlZyk7 CisJUkVHX1dSSVRFKFNCX0RBVEEsIHZhbCk7CisJUkVHX1dSSVRFKFNCX1BDS1QsCisJCSAgIFNF VF9GSUVMRChTQl9PUENPREVfV1JJVEUsIFNCX09QQ09ERSkgfAorCQkgICBTRVRfRklFTEQoU0Jf REVTVF9EUExMLCBTQl9ERVNUKSB8CisJCSAgIFNFVF9GSUVMRCgweGYsIFNCX0JZVEVfRU5BQkxF KSk7CisKKwlyZXQgPSB3YWl0X2ZvcigoUkVHX1JFQUQoU0JfUENLVCkgJiBTQl9CVVNZKSA9PSAw LCAxMDAwKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBT QiB0byBpZGxlIGFmdGVyIHdyaXRlXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoZHBp b19kZWJ1ZykgeworCQlpZiAoY2R2X3NiX3JlYWQoZGV2LCByZWcsICZ0ZW1wKSA9PSAwKQorCQkJ RFJNX0RFQlVHX0tNUygiMHglMDh4OiAweCUwOHggKGFmdGVyKVxuIiwgcmVnLCB0ZW1wKTsKKwl9 CisKKwlyZXR1cm4gMDsKK30KKworLyogUmVzZXQgdGhlIERQSU8gY29uZmlndXJhdGlvbiByZWdp c3Rlci4gIFRoZSBCSU9TIGRvZXMgdGhpcyBhdCBldmVyeQorICogbW9kZSBzZXQuCisgKi8KK3N0 YXRpYyB2b2lkIGNkdl9zYl9yZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCisJUkVH X1dSSVRFKERQSU9fQ0ZHLCAwKTsKKwlSRUdfUkVBRChEUElPX0NGRyk7CisJUkVHX1dSSVRFKERQ SU9fQ0ZHLCBEUElPX01PREVfU0VMRUNUXzAgfCBEUElPX0NNTl9SRVNFVF9OKTsKK30KKworLyog VW5saWtlIG1vc3QgSW50ZWwgZGlzcGxheSBlbmdpbmVzLCBvbiBDZWRhcnZpZXcgdGhlIERQTEwg cmVnaXN0ZXJzCisgKiBhcmUgYmVoaW5kIHRoaXMgc2lkZWJhbmQgYnVzLiAgVGhleSBtdXN0IGJl IHByb2dyYW1tZWQgd2hpbGUgdGhlCisgKiBEUExMIHJlZmVyZW5jZSBjbG9jayBpcyBvbiBpbiB0 aGUgRFBMTCBjb250cm9sIHJlZ2lzdGVyLCBidXQgYmVmb3JlCisgKiB0aGUgRFBMTCBpcyBlbmFi bGVkIGluIHRoZSBEUExMIGNvbnRyb2wgcmVnaXN0ZXIuCisgKi8KK3N0YXRpYyBpbnQKK2Nkdl9k cGxsX3NldF9jbG9ja19jZHYoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0IGRybV9jcnRj ICpjcnRjLAorCQkJICAgICAgIHN0cnVjdCBjZHZfaW50ZWxfY2xvY2tfdCAqY2xvY2spCit7CisJ c3RydWN0IHBzYl9pbnRlbF9jcnRjICpwc2JfY3J0YyA9CisJCQkJdG9fcHNiX2ludGVsX2NydGMo Y3J0Yyk7CisJaW50IHBpcGUgPSBwc2JfY3J0Yy0+cGlwZTsKKwl1MzIgbSwgbl92Y28sIHA7CisJ aW50IHJldCA9IDA7CisJaW50IGRwbGxfcmVnID0gKHBpcGUgPT0gMCkgPyBEUExMX0EgOiBEUExM X0I7CisJdTMyIHJlZl92YWx1ZTsKKworCWNkdl9zYl9yZXNldChkZXYpOworCisJaWYgKChSRUdf UkVBRChkcGxsX3JlZykgJiBEUExMX1NZTkNMT0NLX0VOQUJMRSkgPT0gMCkgeworCQlEUk1fRVJS T1IoIkF0dGVtcHRpbmcgdG8gc2V0IERQTEwgd2l0aCByZWZjbGsgZGlzYWJsZWRcbiIpOworCQly ZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEZvbGxvdyB0aGUgQklPUyBhbmQgd3JpdGUgdGhlIFJF Ri9TRlIgUmVnaXN0ZXIuIEhhcmRjb2RlZCB2YWx1ZSAqLworCXJlZl92YWx1ZSA9IDB4NjhBNzAx OworCisJY2R2X3NiX3dyaXRlKGRldiwgU0JfUkVGX1NGUihwaXBlKSwgcmVmX3ZhbHVlKTsKKwor CS8qIFdlIGRvbid0IGtub3cgd2hhdCB0aGUgb3RoZXIgZmllbGRzIG9mIHRoZXNlIHJlZ3MgYXJl LCBzbworCSAqIGxlYXZlIHRoZW0gaW4gcGxhY2UuCisJICovCisJcmV0ID0gY2R2X3NiX3JlYWQo ZGV2LCBTQl9NKHBpcGUpLCAmbSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwltICY9IH5T Ql9NX0RJVklERVJfTUFTSzsKKwltIHw9ICgoY2xvY2stPm0yKSA8PCBTQl9NX0RJVklERVJfU0hJ RlQpOworCXJldCA9IGNkdl9zYl93cml0ZShkZXYsIFNCX00ocGlwZSksIG0pOworCWlmIChyZXQp CisJCXJldHVybiByZXQ7CisKKwlyZXQgPSBjZHZfc2JfcmVhZChkZXYsIFNCX05fVkNPKHBpcGUp LCAmbl92Y28pOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBGb2xsb3cgdGhlIEJJ T1MgdG8gcHJvZ3JhbSB0aGUgTl9ESVZJREVSIFJFRyAqLworCW5fdmNvICY9IDB4RkZGRjsKKwlu X3ZjbyB8PSAweDEwNzsKKwluX3ZjbyAmPSB+KFNCX05fVkNPX1NFTF9NQVNLIHwKKwkJICAgU0Jf Tl9ESVZJREVSX01BU0sgfAorCQkgICBTQl9OX0NCX1RVTkVfTUFTSyk7CisKKwluX3ZjbyB8PSAo KGNsb2NrLT5uKSA8PCBTQl9OX0RJVklERVJfU0hJRlQpOworCisJaWYgKGNsb2NrLT52Y28gPCAy MjUwMDAwKSB7CisJCW5fdmNvIHw9ICgyIDw8IFNCX05fQ0JfVFVORV9TSElGVCk7CisJCW5fdmNv IHw9ICgwIDw8IFNCX05fVkNPX1NFTF9TSElGVCk7CisJfSBlbHNlIGlmIChjbG9jay0+dmNvIDwg Mjc1MDAwMCkgeworCQluX3ZjbyB8PSAoMSA8PCBTQl9OX0NCX1RVTkVfU0hJRlQpOworCQluX3Zj byB8PSAoMSA8PCBTQl9OX1ZDT19TRUxfU0hJRlQpOworCX0gZWxzZSBpZiAoY2xvY2stPnZjbyA8 IDMzMDAwMDApIHsKKwkJbl92Y28gfD0gKDAgPDwgU0JfTl9DQl9UVU5FX1NISUZUKTsKKwkJbl92 Y28gfD0gKDIgPDwgU0JfTl9WQ09fU0VMX1NISUZUKTsKKwl9IGVsc2UgeworCQluX3ZjbyB8PSAo MCA8PCBTQl9OX0NCX1RVTkVfU0hJRlQpOworCQluX3ZjbyB8PSAoMyA8PCBTQl9OX1ZDT19TRUxf U0hJRlQpOworCX0KKworCXJldCA9IGNkdl9zYl93cml0ZShkZXYsIFNCX05fVkNPKHBpcGUpLCBu X3Zjbyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IGNkdl9zYl9yZWFkKGRl diwgU0JfUChwaXBlKSwgJnApOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisJcCAmPSB+KFNC X1AyX0RJVklERVJfTUFTSyB8IFNCX1AxX0RJVklERVJfTUFTSyk7CisJcCB8PSBTRVRfRklFTEQo Y2xvY2stPnAxLCBTQl9QMV9ESVZJREVSKTsKKwlzd2l0Y2ggKGNsb2NrLT5wMikgeworCWNhc2Ug NToKKwkJcCB8PSBTRVRfRklFTEQoU0JfUDJfNSwgU0JfUDJfRElWSURFUik7CisJCWJyZWFrOwor CWNhc2UgMTA6CisJCXAgfD0gU0VUX0ZJRUxEKFNCX1AyXzEwLCBTQl9QMl9ESVZJREVSKTsKKwkJ YnJlYWs7CisJY2FzZSAxNDoKKwkJcCB8PSBTRVRfRklFTEQoU0JfUDJfMTQsIFNCX1AyX0RJVklE RVIpOworCQlicmVhazsKKwljYXNlIDc6CisJCXAgfD0gU0VUX0ZJRUxEKFNCX1AyXzcsIFNCX1Ay X0RJVklERVIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoIkJhZCBQMiBjbG9j azogJWRcbiIsIGNsb2NrLT5wMik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXQgPSBjZHZf c2Jfd3JpdGUoZGV2LCBTQl9QKHBpcGUpLCBwKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0Owor CisJLyogYWx3YXlzIFByb2dyYW0gdGhlIExhbmUgUmVnaXN0ZXIgZm9yIHRoZSBQaXBlIEEqLwor CWlmIChwaXBlID09IDApIHsKKwkJLyogUHJvZ3JhbSB0aGUgTGFuZTAvMSBmb3IgSERNSSBCICov CisJCXUzMiBsYW5lX3JlZywgbGFuZV92YWx1ZTsKKworCQlsYW5lX3JlZyA9IFBTQl9MQU5FMDsK KwkJY2R2X3NiX3JlYWQoZGV2LCBsYW5lX3JlZywgJmxhbmVfdmFsdWUpOworCQlsYW5lX3ZhbHVl ICY9IH4oTEFORV9QTExfTUFTSyk7CisJCWxhbmVfdmFsdWUgfD0gTEFORV9QTExfRU5BQkxFOwor CQljZHZfc2Jfd3JpdGUoZGV2LCBsYW5lX3JlZywgbGFuZV92YWx1ZSk7CisKKwkJbGFuZV9yZWcg PSBQU0JfTEFORTE7CisJCWNkdl9zYl9yZWFkKGRldiwgbGFuZV9yZWcsICZsYW5lX3ZhbHVlKTsK KwkJbGFuZV92YWx1ZSAmPSB+KExBTkVfUExMX01BU0spOworCQlsYW5lX3ZhbHVlIHw9IExBTkVf UExMX0VOQUJMRTsKKwkJY2R2X3NiX3dyaXRlKGRldiwgbGFuZV9yZWcsIGxhbmVfdmFsdWUpOwor CisJCS8qIFByb2dyYW0gdGhlIExhbmUyLzMgZm9yIEhETUkgQyAqLworCQlsYW5lX3JlZyA9IFBT Ql9MQU5FMjsKKwkJY2R2X3NiX3JlYWQoZGV2LCBsYW5lX3JlZywgJmxhbmVfdmFsdWUpOworCQls YW5lX3ZhbHVlICY9IH4oTEFORV9QTExfTUFTSyk7CisJCWxhbmVfdmFsdWUgfD0gTEFORV9QTExf RU5BQkxFOworCQljZHZfc2Jfd3JpdGUoZGV2LCBsYW5lX3JlZywgbGFuZV92YWx1ZSk7CisKKwkJ bGFuZV9yZWcgPSBQU0JfTEFORTM7CisJCWNkdl9zYl9yZWFkKGRldiwgbGFuZV9yZWcsICZsYW5l X3ZhbHVlKTsKKwkJbGFuZV92YWx1ZSAmPSB+KExBTkVfUExMX01BU0spOworCQlsYW5lX3ZhbHVl IHw9IExBTkVfUExMX0VOQUJMRTsKKwkJY2R2X3NiX3dyaXRlKGRldiwgbGFuZV9yZWcsIGxhbmVf dmFsdWUpOworCX0KKworCXJldHVybiAwOworfQorCisvKgorICogUmV0dXJucyB3aGV0aGVyIGFu eSBvdXRwdXQgb24gdGhlIHNwZWNpZmllZCBwaXBlIGlzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZQor ICovCitib29sIGNkdl9pbnRlbF9waXBlX2hhc190eXBlKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yywg aW50IHR5cGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwlzdHJ1 Y3QgZHJtX21vZGVfY29uZmlnICptb2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOworCXN0 cnVjdCBkcm1fY29ubmVjdG9yICpsX2VudHJ5OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShsX2Vu dHJ5LCAmbW9kZV9jb25maWctPmNvbm5lY3Rvcl9saXN0LCBoZWFkKSB7CisJCWlmIChsX2VudHJ5 LT5lbmNvZGVyICYmIGxfZW50cnktPmVuY29kZXItPmNydGMgPT0gY3J0YykgeworCQkJc3RydWN0 IHBzYl9pbnRlbF9vdXRwdXQgKnBzYl9pbnRlbF9vdXRwdXQgPQorCQkJICAgIHRvX3BzYl9pbnRl bF9vdXRwdXQobF9lbnRyeSk7CisJCQlpZiAocHNiX2ludGVsX291dHB1dC0+dHlwZSA9PSB0eXBl KQorCQkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGlj IGNvbnN0IHN0cnVjdCBjZHZfaW50ZWxfbGltaXRfdCAqY2R2X2ludGVsX2xpbWl0KHN0cnVjdCBk cm1fY3J0YyAqY3J0YywKKwkJCQkJCQlpbnQgcmVmY2xrKQoreworCWNvbnN0IHN0cnVjdCBjZHZf aW50ZWxfbGltaXRfdCAqbGltaXQ7CisJaWYgKGNkdl9pbnRlbF9waXBlX2hhc190eXBlKGNydGMs IElOVEVMX09VVFBVVF9MVkRTKSkgeworCQkvKgorCQkgKiBOb3cgb25seSBzaW5nbGUtY2hhbm5l bCBMVkRTIGlzIHN1cHBvcnRlZCBvbiBDRFYuIElmIGl0IGlzCisJCSAqIGluY29ycmVjdCwgcGxl YXNlIGFkZCB0aGUgZHVhbC1jaGFubmVsIExWRFMuCisJCSAqLworCQlpZiAocmVmY2xrID09IDk2 MDAwKQorCQkJbGltaXQgPSAmY2R2X2ludGVsX2xpbWl0c1tDRFZfTElNSVRfU0lOR0xFX0xWRFNf OTZdOworCQllbHNlCisJCQlsaW1pdCA9ICZjZHZfaW50ZWxfbGltaXRzW0NEVl9MSU1JVF9TSU5H TEVfTFZEU18xMDBdOworCX0gZWxzZSB7CisJCWlmIChyZWZjbGsgPT0gMjcwMDApCisJCQlsaW1p dCA9ICZjZHZfaW50ZWxfbGltaXRzW0NEVl9MSU1JVF9EQUNfSERNSV8yN107CisJCWVsc2UKKwkJ CWxpbWl0ID0gJmNkdl9pbnRlbF9saW1pdHNbQ0RWX0xJTUlUX0RBQ19IRE1JXzk2XTsKKwl9CisJ cmV0dXJuIGxpbWl0OworfQorCisvKiBtMSBpcyByZXNlcnZlZCBhcyAwIGluIENEViwgbiBpcyBh IHJpbmcgY291bnRlciAqLworc3RhdGljIHZvaWQgY2R2X2ludGVsX2Nsb2NrKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsCisJCQlpbnQgcmVmY2xrLCBzdHJ1Y3QgY2R2X2ludGVsX2Nsb2NrX3QgKmNs b2NrKQoreworCWNsb2NrLT5tID0gY2xvY2stPm0yICsgMjsKKwljbG9jay0+cCA9IGNsb2NrLT5w MSAqIGNsb2NrLT5wMjsKKwljbG9jay0+dmNvID0gKHJlZmNsayAqIGNsb2NrLT5tKSAvIGNsb2Nr LT5uOworCWNsb2NrLT5kb3QgPSBjbG9jay0+dmNvIC8gY2xvY2stPnA7Cit9CisKKworI2RlZmlu ZSBJTlRFTFBsbEludmFsaWQocykgICB7IC8qIEVycm9yRiAocykgKi87IHJldHVybiBmYWxzZTsg fQorc3RhdGljIGJvb2wgY2R2X2ludGVsX1BMTF9pc192YWxpZChzdHJ1Y3QgZHJtX2NydGMgKmNy dGMsCisJCQkJY29uc3Qgc3RydWN0IGNkdl9pbnRlbF9saW1pdF90ICpsaW1pdCwKKwkJCSAgICAg ICBzdHJ1Y3QgY2R2X2ludGVsX2Nsb2NrX3QgKmNsb2NrKQoreworCWlmIChjbG9jay0+cDEgPCBs aW1pdC0+cDEubWluIHx8IGxpbWl0LT5wMS5tYXggPCBjbG9jay0+cDEpCisJCUlOVEVMUGxsSW52 YWxpZCgicDEgb3V0IG9mIHJhbmdlXG4iKTsKKwlpZiAoY2xvY2stPnAgPCBsaW1pdC0+cC5taW4g fHwgbGltaXQtPnAubWF4IDwgY2xvY2stPnApCisJCUlOVEVMUGxsSW52YWxpZCgicCBvdXQgb2Yg cmFuZ2VcbiIpOworCS8qIHVubmVjZXNzYXJ5IHRvIGNoZWNrIHRoZSByYW5nZSBvZiBtKG0xL00y KS9uIGFnYWluICovCisJaWYgKGNsb2NrLT52Y28gPCBsaW1pdC0+dmNvLm1pbiB8fCBsaW1pdC0+ dmNvLm1heCA8IGNsb2NrLT52Y28pCisJCUlOVEVMUGxsSW52YWxpZCgidmNvIG91dCBvZiByYW5n ZVxuIik7CisJLyogWFhYOiBXZSBtYXkgbmVlZCB0byBiZSBjaGVja2luZyAiRG90IGNsb2NrIgor CSAqIGRlcGVuZGluZyBvbiB0aGUgbXVsdGlwbGllciwgY29ubmVjdG9yLCBldGMuLAorCSAqIHJh dGhlciB0aGFuIGp1c3QgYSBzaW5nbGUgcmFuZ2UuCisJICovCisJaWYgKGNsb2NrLT5kb3QgPCBs aW1pdC0+ZG90Lm1pbiB8fCBsaW1pdC0+ZG90Lm1heCA8IGNsb2NrLT5kb3QpCisJCUlOVEVMUGxs SW52YWxpZCgiZG90IG91dCBvZiByYW5nZVxuIik7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3Rh dGljIGJvb2wgY2R2X2ludGVsX2ZpbmRfYmVzdF9QTEwoc3RydWN0IGRybV9jcnRjICpjcnRjLCBp bnQgdGFyZ2V0LAorCQkJCWludCByZWZjbGssCisJCQkJc3RydWN0IGNkdl9pbnRlbF9jbG9ja190 ICpiZXN0X2Nsb2NrKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJ c3RydWN0IGNkdl9pbnRlbF9jbG9ja190IGNsb2NrOworCWNvbnN0IHN0cnVjdCBjZHZfaW50ZWxf bGltaXRfdCAqbGltaXQgPSBjZHZfaW50ZWxfbGltaXQoY3J0YywgcmVmY2xrKTsKKwlpbnQgZXJy ID0gdGFyZ2V0OworCisKKwlpZiAoY2R2X2ludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxf T1VUUFVUX0xWRFMpICYmCisJICAgIChSRUdfUkVBRChMVkRTKSAmIExWRFNfUE9SVF9FTikgIT0g MCkgeworCQkvKgorCQkgKiBGb3IgTFZEUywgaWYgdGhlIHBhbmVsIGlzIG9uLCBqdXN0IHJlbHkg b24gaXRzIGN1cnJlbnQKKwkJICogc2V0dGluZ3MgZm9yIGR1YWwtY2hhbm5lbC4gIFdlIGhhdmVu J3QgZmlndXJlZCBvdXQgaG93IHRvCisJCSAqIHJlbGlhYmx5IHNldCB1cCBkaWZmZXJlbnQgc2lu Z2xlL2R1YWwgY2hhbm5lbCBzdGF0ZSwgaWYgd2UKKwkJICogZXZlbiBjYW4uCisJCSAqLworCQlp ZiAoKFJFR19SRUFEKExWRFMpICYgTFZEU19DTEtCX1BPV0VSX01BU0spID09CisJCSAgICBMVkRT X0NMS0JfUE9XRVJfVVApCisJCQljbG9jay5wMiA9IGxpbWl0LT5wMi5wMl9mYXN0OworCQllbHNl CisJCQljbG9jay5wMiA9IGxpbWl0LT5wMi5wMl9zbG93OworCX0gZWxzZSB7CisJCWlmICh0YXJn ZXQgPCBsaW1pdC0+cDIuZG90X2xpbWl0KQorCQkJY2xvY2sucDIgPSBsaW1pdC0+cDIucDJfc2xv dzsKKwkJZWxzZQorCQkJY2xvY2sucDIgPSBsaW1pdC0+cDIucDJfZmFzdDsKKwl9CisKKwltZW1z ZXQoYmVzdF9jbG9jaywgMCwgc2l6ZW9mKCpiZXN0X2Nsb2NrKSk7CisJY2xvY2subTEgPSAwOwor CS8qIG0xIGlzIHJlc2VydmVkIGFzIDAgaW4gQ0RWLCBuIGlzIGEgcmluZyBjb3VudGVyLgorCSAg IFNvIHNraXAgdGhlIG0xIGxvb3AgKi8KKwlmb3IgKGNsb2NrLm4gPSBsaW1pdC0+bi5taW47IGNs b2NrLm4gPD0gbGltaXQtPm4ubWF4OyBjbG9jay5uKyspIHsKKwkJZm9yIChjbG9jay5tMiA9IGxp bWl0LT5tMi5taW47IGNsb2NrLm0yIDw9IGxpbWl0LT5tMi5tYXg7CisJCQkJCSAgICAgY2xvY2su bTIrKykgeworCQkJZm9yIChjbG9jay5wMSA9IGxpbWl0LT5wMS5taW47CisJCQkJCWNsb2NrLnAx IDw9IGxpbWl0LT5wMS5tYXg7CisJCQkJCWNsb2NrLnAxKyspIHsKKwkJCQlpbnQgdGhpc19lcnI7 CisKKwkJCQljZHZfaW50ZWxfY2xvY2soZGV2LCByZWZjbGssICZjbG9jayk7CisKKwkJCQlpZiAo IWNkdl9pbnRlbF9QTExfaXNfdmFsaWQoY3J0YywKKwkJCQkJCQkJbGltaXQsICZjbG9jaykpCisJ CQkJCQljb250aW51ZTsKKworCQkJCXRoaXNfZXJyID0gYWJzKGNsb2NrLmRvdCAtIHRhcmdldCk7 CisJCQkJaWYgKHRoaXNfZXJyIDwgZXJyKSB7CisJCQkJCSpiZXN0X2Nsb2NrID0gY2xvY2s7CisJ CQkJCWVyciA9IHRoaXNfZXJyOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBlcnIg IT0gdGFyZ2V0OworfQorCitpbnQgY2R2X2ludGVsX3BpcGVfc2V0X2Jhc2Uoc3RydWN0IGRybV9j cnRjICpjcnRjLAorCQkJICAgIGludCB4LCBpbnQgeSwgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAq b2xkX2ZiKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0 IHBzYl9pbnRlbF9jcnRjICpwc2JfaW50ZWxfY3J0YyA9IHRvX3BzYl9pbnRlbF9jcnRjKGNydGMp OworCXN0cnVjdCBwc2JfZnJhbWVidWZmZXIgKnBzYmZiID0gdG9fcHNiX2ZiKGNydGMtPmZiKTsK KwlpbnQgcGlwZSA9IHBzYl9pbnRlbF9jcnRjLT5waXBlOworCXVuc2lnbmVkIGxvbmcgc3RhcnQs IG9mZnNldDsKKwlpbnQgZHNwYmFzZSA9IChwaXBlID09IDAgPyBEU1BBQkFTRSA6IERTUEJCQVNF KTsKKwlpbnQgZHNwc3VyZiA9IChwaXBlID09IDAgPyBEU1BBU1VSRiA6IERTUEJTVVJGKTsKKwlp bnQgZHNwc3RyaWRlID0gKHBpcGUgPT0gMCkgPyBEU1BBU1RSSURFIDogRFNQQlNUUklERTsKKwlp bnQgZHNwY250cl9yZWcgPSAocGlwZSA9PSAwKSA/IERTUEFDTlRSIDogRFNQQkNOVFI7CisJdTMy IGRzcGNudHI7CisJaW50IHJldCA9IDA7CisKKwlpZiAoIWdtYV9wb3dlcl9iZWdpbihkZXYsIHRy dWUpKQorCQlyZXR1cm4gMDsKKworCS8qIG5vIGZiIGJvdW5kICovCisJaWYgKCFjcnRjLT5mYikg eworCQlkZXZfZXJyKGRldi0+ZGV2LCAiTm8gRkIgYm91bmRcbiIpOworCQlnb3RvIHBzYl9pbnRl bF9waXBlX2NsZWFuZXI7CisJfQorCisKKwkvKiBXZSBhcmUgZGlzcGxheWluZyB0aGlzIGJ1ZmZl ciwgbWFrZSBzdXJlIGl0IGlzIGFjdHVhbGx5IGxvYWRlZAorCSAgIGludG8gdGhlIEdUVCAqLwor CXJldCA9IHBzYl9ndHRfcGluKHBzYmZiLT5ndHQpOworCWlmIChyZXQgPCAwKQorCQlnb3RvIHBz Yl9pbnRlbF9waXBlX3NldF9iYXNlX2V4aXQ7CisJc3RhcnQgPSBwc2JmYi0+Z3R0LT5vZmZzZXQ7 CisJb2Zmc2V0ID0geSAqIGNydGMtPmZiLT5waXRjaCArIHggKiAoY3J0Yy0+ZmItPmJpdHNfcGVy X3BpeGVsIC8gOCk7CisKKwlSRUdfV1JJVEUoZHNwc3RyaWRlLCBjcnRjLT5mYi0+cGl0Y2gpOwor CisJZHNwY250ciA9IFJFR19SRUFEKGRzcGNudHJfcmVnKTsKKwlkc3BjbnRyICY9IH5ESVNQUExB TkVfUElYRk9STUFUX01BU0s7CisKKwlzd2l0Y2ggKGNydGMtPmZiLT5iaXRzX3Blcl9waXhlbCkg eworCWNhc2UgODoKKwkJZHNwY250ciB8PSBESVNQUExBTkVfOEJQUDsKKwkJYnJlYWs7CisJY2Fz ZSAxNjoKKwkJaWYgKGNydGMtPmZiLT5kZXB0aCA9PSAxNSkKKwkJCWRzcGNudHIgfD0gRElTUFBM QU5FXzE1XzE2QlBQOworCQllbHNlCisJCQlkc3BjbnRyIHw9IERJU1BQTEFORV8xNkJQUDsKKwkJ YnJlYWs7CisJY2FzZSAyNDoKKwljYXNlIDMyOgorCQlkc3BjbnRyIHw9IERJU1BQTEFORV8zMkJQ UF9OT19BTFBIQTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihkZXYtPmRldiwgIlVu a25vd24gY29sb3IgZGVwdGhcbiIpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHBzYl9pbnRl bF9waXBlX3NldF9iYXNlX2V4aXQ7CisJfQorCVJFR19XUklURShkc3BjbnRyX3JlZywgZHNwY250 cik7CisKKwlkZXZfZGJnKGRldi0+ZGV2LAorCQkiV3JpdGluZyBiYXNlICUwOGxYICUwOGxYICVk ICVkXG4iLCBzdGFydCwgb2Zmc2V0LCB4LCB5KTsKKworCVJFR19XUklURShkc3BiYXNlLCBvZmZz ZXQpOworCVJFR19SRUFEKGRzcGJhc2UpOworCVJFR19XUklURShkc3BzdXJmLCBzdGFydCk7CisJ UkVHX1JFQUQoZHNwc3VyZik7CisKK3BzYl9pbnRlbF9waXBlX2NsZWFuZXI6CisJLyogSWYgdGhl cmUgd2FzIGEgcHJldmlvdXMgZGlzcGxheSB3ZSBjYW4gbm93IHVucGluIGl0ICovCisJaWYgKG9s ZF9mYikKKwkJcHNiX2d0dF91bnBpbih0b19wc2JfZmIob2xkX2ZiKS0+Z3R0KTsKKworcHNiX2lu dGVsX3BpcGVfc2V0X2Jhc2VfZXhpdDoKKwlnbWFfcG93ZXJfZW5kKGRldik7CisJcmV0dXJuIHJl dDsKK30KKworLyoqCisgKiBTZXRzIHRoZSBwb3dlciBtYW5hZ2VtZW50IG1vZGUgb2YgdGhlIHBp cGUgYW5kIHBsYW5lLgorICoKKyAqIFRoaXMgY29kZSBzaG91bGQgcHJvYmFibHkgZ3JvdyBzdXBw b3J0IGZvciB0dXJuaW5nIHRoZSBjdXJzb3Igb2ZmIGFuZCBiYWNrCisgKiBvbiBhcHByb3ByaWF0 ZWx5IGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UncmUgdHVybmluZyB0aGUgcGlwZSBvZmYvb24uCisg Ki8KK3N0YXRpYyB2b2lkIGNkdl9pbnRlbF9jcnRjX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRj LCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0 cnVjdCBwc2JfaW50ZWxfY3J0YyAqcHNiX2ludGVsX2NydGMgPSB0b19wc2JfaW50ZWxfY3J0Yyhj cnRjKTsKKwlpbnQgcGlwZSA9IHBzYl9pbnRlbF9jcnRjLT5waXBlOworCWludCBkcGxsX3JlZyA9 IChwaXBlID09IDApID8gRFBMTF9BIDogRFBMTF9COworCWludCBkc3BjbnRyX3JlZyA9IChwaXBl ID09IDApID8gRFNQQUNOVFIgOiBEU1BCQ05UUjsKKwlpbnQgZHNwYmFzZV9yZWcgPSAocGlwZSA9 PSAwKSA/IERTUEFCQVNFIDogRFNQQkJBU0U7CisJaW50IHBpcGVjb25mX3JlZyA9IChwaXBlID09 IDApID8gUElQRUFDT05GIDogUElQRUJDT05GOworCXUzMiB0ZW1wOworCWJvb2wgZW5hYmxlZDsK KworCS8qIFhYWDogV2hlbiBvdXIgb3V0cHV0cyBhcmUgYWxsIHVuYXdhcmUgb2YgRFBNUyBtb2Rl cyBvdGhlciB0aGFuIG9mZgorCSAqIGFuZCBvbiwgd2Ugc2hvdWxkIG1hcCB0aG9zZSBtb2RlcyB0 byBEUk1fTU9ERV9EUE1TX09GRiBpbiB0aGUgQ1JUQy4KKwkgKi8KKwlzd2l0Y2ggKG1vZGUpIHsK KwljYXNlIERSTV9NT0RFX0RQTVNfT046CisJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6CisJ Y2FzZSBEUk1fTU9ERV9EUE1TX1NVU1BFTkQ6CisJCS8qIEVuYWJsZSB0aGUgRFBMTCAqLworCQl0 ZW1wID0gUkVHX1JFQUQoZHBsbF9yZWcpOworCQlpZiAoKHRlbXAgJiBEUExMX1ZDT19FTkFCTEUp ID09IDApIHsKKwkJCVJFR19XUklURShkcGxsX3JlZywgdGVtcCk7CisJCQlSRUdfUkVBRChkcGxs X3JlZyk7CisJCQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KKwkJCXVk ZWxheSgxNTApOworCQkJUkVHX1dSSVRFKGRwbGxfcmVnLCB0ZW1wIHwgRFBMTF9WQ09fRU5BQkxF KTsKKwkJCVJFR19SRUFEKGRwbGxfcmVnKTsKKwkJCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8g c3RhYmlsaXplLiAqLworCQkJdWRlbGF5KDE1MCk7CisJCQlSRUdfV1JJVEUoZHBsbF9yZWcsIHRl bXAgfCBEUExMX1ZDT19FTkFCTEUpOworCQkJUkVHX1JFQUQoZHBsbF9yZWcpOworCQkJLyogV2Fp dCBmb3IgdGhlIGNsb2NrcyB0byBzdGFiaWxpemUuICovCisJCQl1ZGVsYXkoMTUwKTsKKwkJfQor CisJCS8qIEppbSBCaXNoIC0gc3dpdGNoIHBsYW4gYW5kIHBpcGUgcGVyIHNjb3R0ICovCisJCS8q IEVuYWJsZSB0aGUgcGxhbmUgKi8KKwkJdGVtcCA9IFJFR19SRUFEKGRzcGNudHJfcmVnKTsKKwkJ aWYgKCh0ZW1wICYgRElTUExBWV9QTEFORV9FTkFCTEUpID09IDApIHsKKwkJCVJFR19XUklURShk c3BjbnRyX3JlZywKKwkJCQkgIHRlbXAgfCBESVNQTEFZX1BMQU5FX0VOQUJMRSk7CisJCQkvKiBG bHVzaCB0aGUgcGxhbmUgY2hhbmdlcyAqLworCQkJUkVHX1dSSVRFKGRzcGJhc2VfcmVnLCBSRUdf UkVBRChkc3BiYXNlX3JlZykpOworCQl9CisKKwkJdWRlbGF5KDE1MCk7CisKKwkJLyogRW5hYmxl IHRoZSBwaXBlICovCisJCXRlbXAgPSBSRUdfUkVBRChwaXBlY29uZl9yZWcpOworCQlpZiAoKHRl bXAgJiBQSVBFQUNPTkZfRU5BQkxFKSA9PSAwKQorCQkJUkVHX1dSSVRFKHBpcGVjb25mX3JlZywg dGVtcCB8IFBJUEVBQ09ORl9FTkFCTEUpOworCisJCXBzYl9pbnRlbF9jcnRjX2xvYWRfbHV0KGNy dGMpOworCisJCS8qIEdpdmUgdGhlIG92ZXJsYXkgc2NhbGVyIGEgY2hhbmNlIHRvIGVuYWJsZQor CQkgKiBpZiBpdCdzIG9uIHRoaXMgcGlwZSAqLworCQkvKiBwc2JfaW50ZWxfY3J0Y19kcG1zX3Zp ZGVvKGNydGMsIHRydWUpOyBUT0RPICovCisJCWJyZWFrOworCWNhc2UgRFJNX01PREVfRFBNU19P RkY6CisJCS8qIEdpdmUgdGhlIG92ZXJsYXkgc2NhbGVyIGEgY2hhbmNlIHRvIGRpc2FibGUKKwkJ ICogaWYgaXQncyBvbiB0aGlzIHBpcGUgKi8KKwkJLyogcHNiX2ludGVsX2NydGNfZHBtc192aWRl byhjcnRjLCBGQUxTRSk7IFRPRE8gKi8KKworCQkvKiBEaXNhYmxlIHRoZSBWR0EgcGxhbmUgdGhh dCB3ZSBuZXZlciB1c2UgKi8KKwkJUkVHX1dSSVRFKFZHQUNOVFJMLCBWR0FfRElTUF9ESVNBQkxF KTsKKworCQkvKiBKaW0gQmlzaCAtIGNoYW5nZWQgcGlwZS9wbGFuZSBoZXJlIGFzIHdlbGwuICov CisKKwkJLyogV2FpdCBmb3IgdmJsYW5rIGZvciB0aGUgZGlzYWJsZSB0byB0YWtlIGVmZmVjdCAq LworCQljZHZfaW50ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CisKKwkJLyogTmV4dCwgZGlzYWJs ZSBkaXNwbGF5IHBpcGVzICovCisJCXRlbXAgPSBSRUdfUkVBRChwaXBlY29uZl9yZWcpOworCQlp ZiAoKHRlbXAgJiBQSVBFQUNPTkZfRU5BQkxFKSAhPSAwKSB7CisJCQlSRUdfV1JJVEUocGlwZWNv bmZfcmVnLCB0ZW1wICYgflBJUEVBQ09ORl9FTkFCTEUpOworCQkJUkVHX1JFQUQocGlwZWNvbmZf cmVnKTsKKwkJfQorCisJCS8qIFdhaXQgZm9yIHZibGFuayBmb3IgdGhlIGRpc2FibGUgdG8gdGFr ZSBlZmZlY3QuICovCisJCWNkdl9pbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2KTsKKworCQl1ZGVs YXkoMTUwKTsKKworCQkvKiBEaXNhYmxlIGRpc3BsYXkgcGxhbmUgKi8KKwkJdGVtcCA9IFJFR19S RUFEKGRzcGNudHJfcmVnKTsKKwkJaWYgKCh0ZW1wICYgRElTUExBWV9QTEFORV9FTkFCTEUpICE9 IDApIHsKKwkJCVJFR19XUklURShkc3BjbnRyX3JlZywKKwkJCQkgIHRlbXAgJiB+RElTUExBWV9Q TEFORV9FTkFCTEUpOworCQkJLyogRmx1c2ggdGhlIHBsYW5lIGNoYW5nZXMgKi8KKwkJCVJFR19X UklURShkc3BiYXNlX3JlZywgUkVHX1JFQUQoZHNwYmFzZV9yZWcpKTsKKwkJCVJFR19SRUFEKGRz cGJhc2VfcmVnKTsKKwkJfQorCisJCXRlbXAgPSBSRUdfUkVBRChkcGxsX3JlZyk7CisJCWlmICgo dGVtcCAmIERQTExfVkNPX0VOQUJMRSkgIT0gMCkgeworCQkJUkVHX1dSSVRFKGRwbGxfcmVnLCB0 ZW1wICYgfkRQTExfVkNPX0VOQUJMRSk7CisJCQlSRUdfUkVBRChkcGxsX3JlZyk7CisJCX0KKwor CQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHR1cm4gb2ZmLiAqLworCQl1ZGVsYXkoMTUwKTsK KwkJYnJlYWs7CisJfQorCWVuYWJsZWQgPSBjcnRjLT5lbmFibGVkICYmIG1vZGUgIT0gRFJNX01P REVfRFBNU19PRkY7CisJLypTZXQgRklGTyBXYXRlcm1hcmtzKi8KKwlSRUdfV1JJVEUoRFNQQVJC LCAweDNGM0UpOworfQorCitzdGF0aWMgdm9pZCBjZHZfaW50ZWxfY3J0Y19wcmVwYXJlKHN0cnVj dCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpjcnRj X2Z1bmNzID0gY3J0Yy0+aGVscGVyX3ByaXZhdGU7CisJY3J0Y19mdW5jcy0+ZHBtcyhjcnRjLCBE Uk1fTU9ERV9EUE1TX09GRik7Cit9CisKK3N0YXRpYyB2b2lkIGNkdl9pbnRlbF9jcnRjX2NvbW1p dChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5j cyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOworCWNydGNfZnVuY3MtPmRwbXMo Y3J0YywgRFJNX01PREVfRFBNU19PTik7Cit9CisKK3ZvaWQgY2R2X2ludGVsX2VuY29kZXJfcHJl cGFyZShzdHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIpCit7CisJc3RydWN0IGRybV9lbmNvZGVy X2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jcyA9CisJICAgIGVuY29kZXItPmhlbHBlcl9wcml2 YXRlOworCS8qIGx2ZHMgaGFzIGl0cyBvd24gdmVyc2lvbiBvZiBwcmVwYXJlIHNlZSBjZHZfaW50 ZWxfbHZkc19wcmVwYXJlICovCisJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9E RV9EUE1TX09GRik7Cit9CisKK3ZvaWQgY2R2X2ludGVsX2VuY29kZXJfY29tbWl0KHN0cnVjdCBk cm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNz ICplbmNvZGVyX2Z1bmNzID0KKwkgICAgZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CisJLyogbHZk cyBoYXMgaXRzIG93biB2ZXJzaW9uIG9mIGNvbW1pdCBzZWUgY2R2X2ludGVsX2x2ZHNfY29tbWl0 ICovCisJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKK30K Kworc3RhdGljIGJvb2wgY2R2X2ludGVsX2NydGNfbW9kZV9maXh1cChzdHJ1Y3QgZHJtX2NydGMg KmNydGMsCisJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKKwkJCQkgIHN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICphZGp1c3RlZF9tb2RlKQoreworCXJldHVybiB0cnVlOworfQor CisKKy8qKgorICogUmV0dXJuIHRoZSBwaXBlIGN1cnJlbnRseSBjb25uZWN0ZWQgdG8gdGhlIHBh bmVsIGZpdHRlciwKKyAqIG9yIC0xIGlmIHRoZSBwYW5lbCBmaXR0ZXIgaXMgbm90IHByZXNlbnQg b3Igbm90IGluIHVzZQorICovCitzdGF0aWMgaW50IGNkdl9pbnRlbF9wYW5lbF9maXR0ZXJfcGlw ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQoreworCXUzMiBwZml0X2NvbnRyb2w7CisKKwlwZml0 X2NvbnRyb2wgPSBSRUdfUkVBRChQRklUX0NPTlRST0wpOworCisJLyogU2VlIGlmIHRoZSBwYW5l bCBmaXR0ZXIgaXMgaW4gdXNlICovCisJaWYgKChwZml0X2NvbnRyb2wgJiBQRklUX0VOQUJMRSkg PT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiAocGZpdF9jb250cm9sID4+IDI5KSAmIDB4MzsK K30KKworc3RhdGljIGludCBjZHZfaW50ZWxfY3J0Y19tb2RlX3NldChzdHJ1Y3QgZHJtX2NydGMg KmNydGMsCisJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkgICAg ICAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUsCisJCQkgICAgICAgaW50 IHgsIGludCB5LAorCQkJICAgICAgIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKm9sZF9mYikKK3sK KwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBwc2JfaW50ZWxf Y3J0YyAqcHNiX2ludGVsX2NydGMgPSB0b19wc2JfaW50ZWxfY3J0YyhjcnRjKTsKKwlpbnQgcGlw ZSA9IHBzYl9pbnRlbF9jcnRjLT5waXBlOworCWludCBkcGxsX3JlZyA9IChwaXBlID09IDApID8g RFBMTF9BIDogRFBMTF9COworCWludCBkcGxsX21kX3JlZyA9IChwc2JfaW50ZWxfY3J0Yy0+cGlw ZSA9PSAwKSA/IERQTExfQV9NRCA6IERQTExfQl9NRDsKKwlpbnQgZHNwY250cl9yZWcgPSAocGlw ZSA9PSAwKSA/IERTUEFDTlRSIDogRFNQQkNOVFI7CisJaW50IHBpcGVjb25mX3JlZyA9IChwaXBl ID09IDApID8gUElQRUFDT05GIDogUElQRUJDT05GOworCWludCBodG90X3JlZyA9IChwaXBlID09 IDApID8gSFRPVEFMX0EgOiBIVE9UQUxfQjsKKwlpbnQgaGJsYW5rX3JlZyA9IChwaXBlID09IDAp ID8gSEJMQU5LX0EgOiBIQkxBTktfQjsKKwlpbnQgaHN5bmNfcmVnID0gKHBpcGUgPT0gMCkgPyBI U1lOQ19BIDogSFNZTkNfQjsKKwlpbnQgdnRvdF9yZWcgPSAocGlwZSA9PSAwKSA/IFZUT1RBTF9B IDogVlRPVEFMX0I7CisJaW50IHZibGFua19yZWcgPSAocGlwZSA9PSAwKSA/IFZCTEFOS19BIDog VkJMQU5LX0I7CisJaW50IHZzeW5jX3JlZyA9IChwaXBlID09IDApID8gVlNZTkNfQSA6IFZTWU5D X0I7CisJaW50IGRzcHNpemVfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBU0laRSA6IERTUEJTSVpF OworCWludCBkc3Bwb3NfcmVnID0gKHBpcGUgPT0gMCkgPyBEU1BBUE9TIDogRFNQQlBPUzsKKwlp bnQgcGlwZXNyY19yZWcgPSAocGlwZSA9PSAwKSA/IFBJUEVBU1JDIDogUElQRUJTUkM7CisJaW50 IHJlZmNsazsKKwlzdHJ1Y3QgY2R2X2ludGVsX2Nsb2NrX3QgY2xvY2s7CisJdTMyIGRwbGwgPSAw LCBkc3BjbnRyLCBwaXBlY29uZjsKKwlib29sIG9rLCBpc19zZHZvID0gZmFsc2UsIGlzX2R2byA9 IGZhbHNlOworCWJvb2wgaXNfY3J0ID0gZmFsc2UsIGlzX2x2ZHMgPSBmYWxzZSwgaXNfdHYgPSBm YWxzZTsKKwlib29sIGlzX2hkbWkgPSBmYWxzZTsKKwlzdHJ1Y3QgZHJtX21vZGVfY29uZmlnICpt b2RlX2NvbmZpZyA9ICZkZXYtPm1vZGVfY29uZmlnOworCXN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3I7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3RvciwgJm1vZGVfY29uZmln LT5jb25uZWN0b3JfbGlzdCwgaGVhZCkgeworCQlzdHJ1Y3QgcHNiX2ludGVsX291dHB1dCAqcHNi X2ludGVsX291dHB1dCA9CisJCSAgICB0b19wc2JfaW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisK KwkJaWYgKCFjb25uZWN0b3ItPmVuY29kZXIKKwkJICAgIHx8IGNvbm5lY3Rvci0+ZW5jb2Rlci0+ Y3J0YyAhPSBjcnRjKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChwc2JfaW50ZWxfb3V0cHV0 LT50eXBlKSB7CisJCWNhc2UgSU5URUxfT1VUUFVUX0xWRFM6CisJCQlpc19sdmRzID0gdHJ1ZTsK KwkJCWJyZWFrOworCQljYXNlIElOVEVMX09VVFBVVF9TRFZPOgorCQkJaXNfc2R2byA9IHRydWU7 CisJCQlicmVhazsKKwkJY2FzZSBJTlRFTF9PVVRQVVRfRFZPOgorCQkJaXNfZHZvID0gdHJ1ZTsK KwkJCWJyZWFrOworCQljYXNlIElOVEVMX09VVFBVVF9UVk9VVDoKKwkJCWlzX3R2ID0gdHJ1ZTsK KwkJCWJyZWFrOworCQljYXNlIElOVEVMX09VVFBVVF9BTkFMT0c6CisJCQlpc19jcnQgPSB0cnVl OworCQkJYnJlYWs7CisJCWNhc2UgSU5URUxfT1VUUFVUX0hETUk6CisJCQlpc19oZG1pID0gdHJ1 ZTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmVmY2xrID0gOTYwMDA7CisKKwkvKiBIYWNrIHNl bGVjdGlvbiBhYm91dCByZWYgY2xrIGZvciBDUlQgKi8KKwkvKiBTZWxlY3QgMjdNSHogYXMgdGhl IHJlZmVyZW5jZSBjbGsgZm9yIEhETUkgKi8KKwlpZiAoaXNfY3J0IHx8IGlzX2hkbWkpCisJCXJl ZmNsayA9IDI3MDAwOworCisJZHJtX21vZGVfZGVidWdfcHJpbnRtb2RlbGluZShhZGp1c3RlZF9t b2RlKTsKKworCW9rID0gY2R2X2ludGVsX2ZpbmRfYmVzdF9QTEwoY3J0YywgYWRqdXN0ZWRfbW9k ZS0+Y2xvY2ssIHJlZmNsaywKKwkJCQkgJmNsb2NrKTsKKwlpZiAoIW9rKSB7CisJCWRldl9lcnIo ZGV2LT5kZXYsICJDb3VsZG4ndCBmaW5kIFBMTCBzZXR0aW5ncyBmb3IgbW9kZSFcbiIpOworCQly ZXR1cm4gMDsKKwl9CisKKwlkcGxsID0gRFBMTF9WR0FfTU9ERV9ESVM7CisJaWYgKGlzX3R2KSB7 CisJCS8qIFhYWDoganVzdCBtYXRjaGluZyBCSU9TIGZvciBub3cgKi8KKy8qCWRwbGwgfD0gUExM X1JFRl9JTlBVVF9UVkNMS0lOQkM7ICovCisJCWRwbGwgfD0gMzsKKwl9CisJCWRwbGwgfD0gUExM X1JFRl9JTlBVVF9EUkVGQ0xLOworCisJZHBsbCB8PSBEUExMX1NZTkNMT0NLX0VOQUJMRTsKKwlk cGxsIHw9IERQTExfVkdBX01PREVfRElTOworCWlmIChpc19sdmRzKQorCQlkcGxsIHw9IERQTExC X01PREVfTFZEUzsKKwllbHNlCisJCWRwbGwgfD0gRFBMTEJfTU9ERV9EQUNfU0VSSUFMOworCS8q IGRwbGwgfD0gKDIgPDwgMTEpOyAqLworCisJLyogc2V0dXAgcGlwZWNvbmYgKi8KKwlwaXBlY29u ZiA9IFJFR19SRUFEKHBpcGVjb25mX3JlZyk7CisKKwkvKiBTZXQgdXAgdGhlIGRpc3BsYXkgcGxh bmUgcmVnaXN0ZXIgKi8KKwlkc3BjbnRyID0gRElTUFBMQU5FX0dBTU1BX0VOQUJMRTsKKworCWlm IChwaXBlID09IDApCisJCWRzcGNudHIgfD0gRElTUFBMQU5FX1NFTF9QSVBFX0E7CisJZWxzZQor CQlkc3BjbnRyIHw9IERJU1BQTEFORV9TRUxfUElQRV9COworCisJZHNwY250ciB8PSBESVNQTEFZ X1BMQU5FX0VOQUJMRTsKKwlwaXBlY29uZiB8PSBQSVBFQUNPTkZfRU5BQkxFOworCisJUkVHX1dS SVRFKGRwbGxfcmVnLCBkcGxsIHwgRFBMTF9WR0FfTU9ERV9ESVMgfCBEUExMX1NZTkNMT0NLX0VO QUJMRSk7CisJUkVHX1JFQUQoZHBsbF9yZWcpOworCisJY2R2X2RwbGxfc2V0X2Nsb2NrX2Nkdihk ZXYsIGNydGMsICZjbG9jayk7CisKKwl1ZGVsYXkoMTUwKTsKKworCisJLyogVGhlIExWRFMgcGlu IHBhaXIgbmVlZHMgdG8gYmUgb24gYmVmb3JlIHRoZSBEUExMcyBhcmUgZW5hYmxlZC4KKwkgKiBU aGlzIGlzIGFuIGV4Y2VwdGlvbiB0byB0aGUgZ2VuZXJhbCBydWxlIHRoYXQgbW9kZV9zZXQgZG9l c24ndCB0dXJuCisJICogdGhpbmdzIG9uLgorCSAqLworCWlmIChpc19sdmRzKSB7CisJCXUzMiBs dmRzID0gUkVHX1JFQUQoTFZEUyk7CisKKwkJbHZkcyB8PQorCQkgICAgTFZEU19QT1JUX0VOIHwg TFZEU19BMEEyX0NMS0FfUE9XRVJfVVAgfAorCQkgICAgTFZEU19QSVBFQl9TRUxFQ1Q7CisJCS8q IFNldCB0aGUgQjAtQjMgZGF0YSBwYWlycyBjb3JyZXNwb25kaW5nIHRvCisJCSAqIHdoZXRoZXIg d2UncmUgZ29pbmcgdG8KKwkJICogc2V0IHRoZSBEUExMcyBmb3IgZHVhbC1jaGFubmVsIG1vZGUg b3Igbm90LgorCQkgKi8KKwkJaWYgKGNsb2NrLnAyID09IDcpCisJCQlsdmRzIHw9IExWRFNfQjBC M19QT1dFUl9VUCB8IExWRFNfQ0xLQl9QT1dFUl9VUDsKKwkJZWxzZQorCQkJbHZkcyAmPSB+KExW RFNfQjBCM19QT1dFUl9VUCB8IExWRFNfQ0xLQl9QT1dFUl9VUCk7CisKKwkJLyogSXQgd291bGQg YmUgbmljZSB0byBzZXQgMjQgdnMgMTgtYml0IG1vZGUgKExWRFNfQTNfUE9XRVJfVVApCisJCSAq IGFwcHJvcHJpYXRlbHkgaGVyZSwgYnV0IHdlIG5lZWQgdG8gbG9vayBtb3JlCisJCSAqIHRob3Jv dWdobHkgaW50byBob3cgcGFuZWxzIGJlaGF2ZSBpbiB0aGUgdHdvIG1vZGVzLgorCQkgKi8KKwor CQlSRUdfV1JJVEUoTFZEUywgbHZkcyk7CisJCVJFR19SRUFEKExWRFMpOworCX0KKworCWRwbGwg fD0gRFBMTF9WQ09fRU5BQkxFOworCisJLyogRGlzYWJsZSB0aGUgcGFuZWwgZml0dGVyIGlmIGl0 IHdhcyBvbiBvdXIgcGlwZSAqLworCWlmIChjZHZfaW50ZWxfcGFuZWxfZml0dGVyX3BpcGUoZGV2 KSA9PSBwaXBlKQorCQlSRUdfV1JJVEUoUEZJVF9DT05UUk9MLCAwKTsKKworCURSTV9ERUJVR19L TVMoIk1vZGUgZm9yIHBpcGUgJWM6XG4iLCBwaXBlID09IDAgPyAnQScgOiAnQicpOworCWRybV9t b2RlX2RlYnVnX3ByaW50bW9kZWxpbmUobW9kZSk7CisKKwlSRUdfV1JJVEUoZHBsbF9yZWcsCisJ CShSRUdfUkVBRChkcGxsX3JlZykgJiB+RFBMTF9MT0NLKSB8IERQTExfVkNPX0VOQUJMRSk7CisJ UkVHX1JFQUQoZHBsbF9yZWcpOworCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gc3RhYmlsaXpl LiAqLworCXVkZWxheSgxNTApOyAvKiA0MiB1c2VjIHcvbyBjYWxpYnJhdGlvbiwgMTEwIHdpdGgu ICByb3VuZGVkIHVwLiAqLworCisJaWYgKCEoUkVHX1JFQUQoZHBsbF9yZWcpICYgRFBMTF9MT0NL KSkgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBEUExMIGxvY2tcbiIpOwor CQlyZXR1cm4gLUVCVVNZOworCX0KKworCXsKKwkJaW50IHNkdm9fcGl4ZWxfbXVsdGlwbHkgPSBh ZGp1c3RlZF9tb2RlLT5jbG9jayAvIG1vZGUtPmNsb2NrOworCQlSRUdfV1JJVEUoZHBsbF9tZF9y ZWcsICgwIDw8IERQTExfTURfVURJX0RJVklERVJfU0hJRlQpIHwgKChzZHZvX3BpeGVsX211bHRp cGx5IC0gMSkgPDwgRFBMTF9NRF9VRElfTVVMVElQTElFUl9TSElGVCkpOworCX0KKworCVJFR19X UklURShodG90X3JlZywgKGFkanVzdGVkX21vZGUtPmNydGNfaGRpc3BsYXkgLSAxKSB8CisJCSAg KChhZGp1c3RlZF9tb2RlLT5jcnRjX2h0b3RhbCAtIDEpIDw8IDE2KSk7CisJUkVHX1dSSVRFKGhi bGFua19yZWcsIChhZGp1c3RlZF9tb2RlLT5jcnRjX2hibGFua19zdGFydCAtIDEpIHwKKwkJICAo KGFkanVzdGVkX21vZGUtPmNydGNfaGJsYW5rX2VuZCAtIDEpIDw8IDE2KSk7CisJUkVHX1dSSVRF KGhzeW5jX3JlZywgKGFkanVzdGVkX21vZGUtPmNydGNfaHN5bmNfc3RhcnQgLSAxKSB8CisJCSAg KChhZGp1c3RlZF9tb2RlLT5jcnRjX2hzeW5jX2VuZCAtIDEpIDw8IDE2KSk7CisJUkVHX1dSSVRF KHZ0b3RfcmVnLCAoYWRqdXN0ZWRfbW9kZS0+Y3J0Y192ZGlzcGxheSAtIDEpIHwKKwkJICAoKGFk anVzdGVkX21vZGUtPmNydGNfdnRvdGFsIC0gMSkgPDwgMTYpKTsKKwlSRUdfV1JJVEUodmJsYW5r X3JlZywgKGFkanVzdGVkX21vZGUtPmNydGNfdmJsYW5rX3N0YXJ0IC0gMSkgfAorCQkgICgoYWRq dXN0ZWRfbW9kZS0+Y3J0Y192YmxhbmtfZW5kIC0gMSkgPDwgMTYpKTsKKwlSRUdfV1JJVEUodnN5 bmNfcmVnLCAoYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19zdGFydCAtIDEpIHwKKwkJICAoKGFk anVzdGVkX21vZGUtPmNydGNfdnN5bmNfZW5kIC0gMSkgPDwgMTYpKTsKKwkvKiBwaXBlc3JjIGFu ZCBkc3BzaXplIGNvbnRyb2wgdGhlIHNpemUgdGhhdCBpcyBzY2FsZWQgZnJvbSwKKwkgKiB3aGlj aCBzaG91bGQgYWx3YXlzIGJlIHRoZSB1c2VyJ3MgcmVxdWVzdGVkIHNpemUuCisJICovCisJUkVH X1dSSVRFKGRzcHNpemVfcmVnLAorCQkgICgobW9kZS0+dmRpc3BsYXkgLSAxKSA8PCAxNikgfCAo bW9kZS0+aGRpc3BsYXkgLSAxKSk7CisJUkVHX1dSSVRFKGRzcHBvc19yZWcsIDApOworCVJFR19X UklURShwaXBlc3JjX3JlZywKKwkJICAoKG1vZGUtPmhkaXNwbGF5IC0gMSkgPDwgMTYpIHwgKG1v ZGUtPnZkaXNwbGF5IC0gMSkpOworCVJFR19XUklURShwaXBlY29uZl9yZWcsIHBpcGVjb25mKTsK KwlSRUdfUkVBRChwaXBlY29uZl9yZWcpOworCisJY2R2X2ludGVsX3dhaXRfZm9yX3ZibGFuayhk ZXYpOworCisJUkVHX1dSSVRFKGRzcGNudHJfcmVnLCBkc3BjbnRyKTsKKworCS8qIEZsdXNoIHRo ZSBwbGFuZSBjaGFuZ2VzICovCisJeworCQlzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICpj cnRjX2Z1bmNzID0KKwkJICAgIGNydGMtPmhlbHBlcl9wcml2YXRlOworCQljcnRjX2Z1bmNzLT5t b2RlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYik7CisJfQorCisJY2R2X2ludGVsX3dhaXRf Zm9yX3ZibGFuayhkZXYpOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiBMb2FkcyB0aGUgcGFsZXR0 ZS9nYW1tYSB1bml0IGZvciB0aGUgQ1JUQyB3aXRoIHRoZSBwcmVwYXJlZCB2YWx1ZXMgKi8KK3Zv aWQgY2R2X2ludGVsX2NydGNfbG9hZF9sdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0 cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IGRybV9wc2JfcHJpdmF0 ZSAqZGV2X3ByaXYgPQorCQkJCShzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICopZGV2LT5kZXZfcHJp dmF0ZTsKKwlzdHJ1Y3QgcHNiX2ludGVsX2NydGMgKnBzYl9pbnRlbF9jcnRjID0gdG9fcHNiX2lu dGVsX2NydGMoY3J0Yyk7CisJaW50IHBhbHJlZyA9IFBBTEVUVEVfQTsKKwlpbnQgaTsKKworCS8q IFRoZSBjbG9ja3MgaGF2ZSB0byBiZSBvbiB0byBsb2FkIHRoZSBwYWxldHRlLiAqLworCWlmICgh Y3J0Yy0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJc3dpdGNoIChwc2JfaW50ZWxfY3J0Yy0+cGlw ZSkgeworCWNhc2UgMDoKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlwYWxyZWcgPSBQQUxFVFRFX0I7 CisJCWJyZWFrOworCWNhc2UgMjoKKwkJcGFscmVnID0gUEFMRVRURV9DOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlkZXZfZXJyKGRldi0+ZGV2LCAiSWxsZWdhbCBQaXBlIE51bWJlci5cbiIpOwor CQlyZXR1cm47CisJfQorCisJaWYgKGdtYV9wb3dlcl9iZWdpbihkZXYsIGZhbHNlKSkgeworCQlm b3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJCVJFR19XUklURShwYWxyZWcgKyA0ICogaSwK KwkJCQkgICgocHNiX2ludGVsX2NydGMtPmx1dF9yW2ldICsKKwkJCQkgIHBzYl9pbnRlbF9jcnRj LT5sdXRfYWRqW2ldKSA8PCAxNikgfAorCQkJCSAgKChwc2JfaW50ZWxfY3J0Yy0+bHV0X2dbaV0g KworCQkJCSAgcHNiX2ludGVsX2NydGMtPmx1dF9hZGpbaV0pIDw8IDgpIHwKKwkJCQkgIChwc2Jf aW50ZWxfY3J0Yy0+bHV0X2JbaV0gKworCQkJCSAgcHNiX2ludGVsX2NydGMtPmx1dF9hZGpbaV0p KTsKKwkJfQorCQlnbWFfcG93ZXJfZW5kKGRldik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsg aSA8IDI1NjsgaSsrKSB7CisJCQlkZXZfcHJpdi0+c2F2ZV9wYWxldHRlX2FbaV0gPQorCQkJCSAg KChwc2JfaW50ZWxfY3J0Yy0+bHV0X3JbaV0gKworCQkJCSAgcHNiX2ludGVsX2NydGMtPmx1dF9h ZGpbaV0pIDw8IDE2KSB8CisJCQkJICAoKHBzYl9pbnRlbF9jcnRjLT5sdXRfZ1tpXSArCisJCQkJ ICBwc2JfaW50ZWxfY3J0Yy0+bHV0X2FkaltpXSkgPDwgOCkgfAorCQkJCSAgKHBzYl9pbnRlbF9j cnRjLT5sdXRfYltpXSArCisJCQkJICBwc2JfaW50ZWxfY3J0Yy0+bHV0X2FkaltpXSk7CisJCX0K KworCX0KK30KKworLyoqCisgKiBTYXZlIEhXIHN0YXRlcyBvZiBnaXZpbmcgY3J0YworICovCitz dGF0aWMgdm9pZCBjZHZfaW50ZWxfY3J0Y19zYXZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sK KwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCS8qIHN0cnVjdCBkcm1fcHNi X3ByaXZhdGUgKmRldl9wcml2ID0KKwkJCShzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICopZGV2LT5k ZXZfcHJpdmF0ZTsgKi8KKwlzdHJ1Y3QgcHNiX2ludGVsX2NydGMgKnBzYl9pbnRlbF9jcnRjID0g dG9fcHNiX2ludGVsX2NydGMoY3J0Yyk7CisJc3RydWN0IHBzYl9pbnRlbF9jcnRjX3N0YXRlICpj cnRjX3N0YXRlID0gcHNiX2ludGVsX2NydGMtPmNydGNfc3RhdGU7CisJaW50IHBpcGVBID0gKHBz Yl9pbnRlbF9jcnRjLT5waXBlID09IDApOworCXVpbnQzMl90IHBhbGV0dGVSZWc7CisJaW50IGk7 CisKKwlpZiAoIWNydGNfc3RhdGUpIHsKKwkJZGV2X2RiZyhkZXYtPmRldiwgIk5vIENSVEMgc3Rh dGUgZm91bmRcbiIpOworCQlyZXR1cm47CisJfQorCisJY3J0Y19zdGF0ZS0+c2F2ZURTUENOVFIg PSBSRUdfUkVBRChwaXBlQSA/IERTUEFDTlRSIDogRFNQQkNOVFIpOworCWNydGNfc3RhdGUtPnNh dmVQSVBFQ09ORiA9IFJFR19SRUFEKHBpcGVBID8gUElQRUFDT05GIDogUElQRUJDT05GKTsKKwlj cnRjX3N0YXRlLT5zYXZlUElQRVNSQyA9IFJFR19SRUFEKHBpcGVBID8gUElQRUFTUkMgOiBQSVBF QlNSQyk7CisJY3J0Y19zdGF0ZS0+c2F2ZUZQMCA9IFJFR19SRUFEKHBpcGVBID8gRlBBMCA6IEZQ QjApOworCWNydGNfc3RhdGUtPnNhdmVGUDEgPSBSRUdfUkVBRChwaXBlQSA/IEZQQTEgOiBGUEIx KTsKKwljcnRjX3N0YXRlLT5zYXZlRFBMTCA9IFJFR19SRUFEKHBpcGVBID8gRFBMTF9BIDogRFBM TF9CKTsKKwljcnRjX3N0YXRlLT5zYXZlSFRPVEFMID0gUkVHX1JFQUQocGlwZUEgPyBIVE9UQUxf QSA6IEhUT1RBTF9CKTsKKwljcnRjX3N0YXRlLT5zYXZlSEJMQU5LID0gUkVHX1JFQUQocGlwZUEg PyBIQkxBTktfQSA6IEhCTEFOS19CKTsKKwljcnRjX3N0YXRlLT5zYXZlSFNZTkMgPSBSRUdfUkVB RChwaXBlQSA/IEhTWU5DX0EgOiBIU1lOQ19CKTsKKwljcnRjX3N0YXRlLT5zYXZlVlRPVEFMID0g UkVHX1JFQUQocGlwZUEgPyBWVE9UQUxfQSA6IFZUT1RBTF9CKTsKKwljcnRjX3N0YXRlLT5zYXZl VkJMQU5LID0gUkVHX1JFQUQocGlwZUEgPyBWQkxBTktfQSA6IFZCTEFOS19CKTsKKwljcnRjX3N0 YXRlLT5zYXZlVlNZTkMgPSBSRUdfUkVBRChwaXBlQSA/IFZTWU5DX0EgOiBWU1lOQ19CKTsKKwlj cnRjX3N0YXRlLT5zYXZlRFNQU1RSSURFID0gUkVHX1JFQUQocGlwZUEgPyBEU1BBU1RSSURFIDog RFNQQlNUUklERSk7CisKKwkvKk5PVEU6IERTUFNJWkUgRFNQUE9TIG9ubHkgZm9yIHBzYiovCisJ Y3J0Y19zdGF0ZS0+c2F2ZURTUFNJWkUgPSBSRUdfUkVBRChwaXBlQSA/IERTUEFTSVpFIDogRFNQ QlNJWkUpOworCWNydGNfc3RhdGUtPnNhdmVEU1BQT1MgPSBSRUdfUkVBRChwaXBlQSA/IERTUEFQ T1MgOiBEU1BCUE9TKTsKKworCWNydGNfc3RhdGUtPnNhdmVEU1BCQVNFID0gUkVHX1JFQUQocGlw ZUEgPyBEU1BBQkFTRSA6IERTUEJCQVNFKTsKKworCURSTV9ERUJVRygiKCV4ICV4ICV4ICV4ICV4 ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4KVxuIiwKKwkJCWNydGNfc3RhdGUtPnNh dmVEU1BDTlRSLAorCQkJY3J0Y19zdGF0ZS0+c2F2ZVBJUEVDT05GLAorCQkJY3J0Y19zdGF0ZS0+ c2F2ZVBJUEVTUkMsCisJCQljcnRjX3N0YXRlLT5zYXZlRlAwLAorCQkJY3J0Y19zdGF0ZS0+c2F2 ZUZQMSwKKwkJCWNydGNfc3RhdGUtPnNhdmVEUExMLAorCQkJY3J0Y19zdGF0ZS0+c2F2ZUhUT1RB TCwKKwkJCWNydGNfc3RhdGUtPnNhdmVIQkxBTkssCisJCQljcnRjX3N0YXRlLT5zYXZlSFNZTkMs CisJCQljcnRjX3N0YXRlLT5zYXZlVlRPVEFMLAorCQkJY3J0Y19zdGF0ZS0+c2F2ZVZCTEFOSywK KwkJCWNydGNfc3RhdGUtPnNhdmVWU1lOQywKKwkJCWNydGNfc3RhdGUtPnNhdmVEU1BTVFJJREUs CisJCQljcnRjX3N0YXRlLT5zYXZlRFNQU0laRSwKKwkJCWNydGNfc3RhdGUtPnNhdmVEU1BQT1Ms CisJCQljcnRjX3N0YXRlLT5zYXZlRFNQQkFTRQorCQkpOworCisJcGFsZXR0ZVJlZyA9IHBpcGVB ID8gUEFMRVRURV9BIDogUEFMRVRURV9COworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKKwkJ Y3J0Y19zdGF0ZS0+c2F2ZVBhbGV0dGVbaV0gPSBSRUdfUkVBRChwYWxldHRlUmVnICsgKGkgPDwg MikpOworfQorCisvKioKKyAqIFJlc3RvcmUgSFcgc3RhdGVzIG9mIGdpdmluZyBjcnRjCisgKi8K K3N0YXRpYyB2b2lkIGNkdl9pbnRlbF9jcnRjX3Jlc3RvcmUoc3RydWN0IGRybV9jcnRjICpjcnRj KQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJLyogc3RydWN0IGRy bV9wc2JfcHJpdmF0ZSAqIGRldl9wcml2ID0KKwkJCQkoc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAq KWRldi0+ZGV2X3ByaXZhdGU7ICovCisJc3RydWN0IHBzYl9pbnRlbF9jcnRjICpwc2JfaW50ZWxf Y3J0YyA9ICB0b19wc2JfaW50ZWxfY3J0YyhjcnRjKTsKKwlzdHJ1Y3QgcHNiX2ludGVsX2NydGNf c3RhdGUgKmNydGNfc3RhdGUgPSBwc2JfaW50ZWxfY3J0Yy0+Y3J0Y19zdGF0ZTsKKwkvKiBzdHJ1 Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzICogY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2 YXRlOyAqLworCWludCBwaXBlQSA9IChwc2JfaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKTsKKwl1aW50 MzJfdCBwYWxldHRlUmVnOworCWludCBpOworCisJaWYgKCFjcnRjX3N0YXRlKSB7CisJCWRldl9k YmcoZGV2LT5kZXYsICJObyBjcnRjIHN0YXRlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCURSTV9E RUJVRygKKwkJImN1cnJlbnQ6KCV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4ICV4 ICV4ICV4ICV4KVxuIiwKKwkJUkVHX1JFQUQocGlwZUEgPyBEU1BBQ05UUiA6IERTUEJDTlRSKSwK KwkJUkVHX1JFQUQocGlwZUEgPyBQSVBFQUNPTkYgOiBQSVBFQkNPTkYpLAorCQlSRUdfUkVBRChw aXBlQSA/IFBJUEVBU1JDIDogUElQRUJTUkMpLAorCQlSRUdfUkVBRChwaXBlQSA/IEZQQTAgOiBG UEIwKSwKKwkJUkVHX1JFQUQocGlwZUEgPyBGUEExIDogRlBCMSksCisJCVJFR19SRUFEKHBpcGVB ID8gRFBMTF9BIDogRFBMTF9CKSwKKwkJUkVHX1JFQUQocGlwZUEgPyBIVE9UQUxfQSA6IEhUT1RB TF9CKSwKKwkJUkVHX1JFQUQocGlwZUEgPyBIQkxBTktfQSA6IEhCTEFOS19CKSwKKwkJUkVHX1JF QUQocGlwZUEgPyBIU1lOQ19BIDogSFNZTkNfQiksCisJCVJFR19SRUFEKHBpcGVBID8gVlRPVEFM X0EgOiBWVE9UQUxfQiksCisJCVJFR19SRUFEKHBpcGVBID8gVkJMQU5LX0EgOiBWQkxBTktfQiks CisJCVJFR19SRUFEKHBpcGVBID8gVlNZTkNfQSA6IFZTWU5DX0IpLAorCQlSRUdfUkVBRChwaXBl QSA/IERTUEFTVFJJREUgOiBEU1BCU1RSSURFKSwKKwkJUkVHX1JFQUQocGlwZUEgPyBEU1BBU0la RSA6IERTUEJTSVpFKSwKKwkJUkVHX1JFQUQocGlwZUEgPyBEU1BBUE9TIDogRFNQQlBPUyksCisJ CVJFR19SRUFEKHBpcGVBID8gRFNQQUJBU0UgOiBEU1BCQkFTRSkKKwkJKTsKKworCURSTV9ERUJV RygKKwkJInNhdmVkOiAoJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXggJXgg JXggJXgpXG4iLAorCQljcnRjX3N0YXRlLT5zYXZlRFNQQ05UUiwKKwkJY3J0Y19zdGF0ZS0+c2F2 ZVBJUEVDT05GLAorCQljcnRjX3N0YXRlLT5zYXZlUElQRVNSQywKKwkJY3J0Y19zdGF0ZS0+c2F2 ZUZQMCwKKwkJY3J0Y19zdGF0ZS0+c2F2ZUZQMSwKKwkJY3J0Y19zdGF0ZS0+c2F2ZURQTEwsCisJ CWNydGNfc3RhdGUtPnNhdmVIVE9UQUwsCisJCWNydGNfc3RhdGUtPnNhdmVIQkxBTkssCisJCWNy dGNfc3RhdGUtPnNhdmVIU1lOQywKKwkJY3J0Y19zdGF0ZS0+c2F2ZVZUT1RBTCwKKwkJY3J0Y19z dGF0ZS0+c2F2ZVZCTEFOSywKKwkJY3J0Y19zdGF0ZS0+c2F2ZVZTWU5DLAorCQljcnRjX3N0YXRl LT5zYXZlRFNQU1RSSURFLAorCQljcnRjX3N0YXRlLT5zYXZlRFNQU0laRSwKKwkJY3J0Y19zdGF0 ZS0+c2F2ZURTUFBPUywKKwkJY3J0Y19zdGF0ZS0+c2F2ZURTUEJBU0UKKwkJKTsKKworCisJaWYg KGNydGNfc3RhdGUtPnNhdmVEUExMICYgRFBMTF9WQ09fRU5BQkxFKSB7CisJCVJFR19XUklURShw aXBlQSA/IERQTExfQSA6IERQTExfQiwKKwkJCWNydGNfc3RhdGUtPnNhdmVEUExMICYgfkRQTExf VkNPX0VOQUJMRSk7CisJCVJFR19SRUFEKHBpcGVBID8gRFBMTF9BIDogRFBMTF9CKTsKKwkJRFJN X0RFQlVHKCJ3cml0ZSBkcGxsOiAleFxuIiwKKwkJCQlSRUdfUkVBRChwaXBlQSA/IERQTExfQSA6 IERQTExfQikpOworCQl1ZGVsYXkoMTUwKTsKKwl9CisKKwlSRUdfV1JJVEUocGlwZUEgPyBGUEEw IDogRlBCMCwgY3J0Y19zdGF0ZS0+c2F2ZUZQMCk7CisJUkVHX1JFQUQocGlwZUEgPyBGUEEwIDog RlBCMCk7CisKKwlSRUdfV1JJVEUocGlwZUEgPyBGUEExIDogRlBCMSwgY3J0Y19zdGF0ZS0+c2F2 ZUZQMSk7CisJUkVHX1JFQUQocGlwZUEgPyBGUEExIDogRlBCMSk7CisKKwlSRUdfV1JJVEUocGlw ZUEgPyBEUExMX0EgOiBEUExMX0IsIGNydGNfc3RhdGUtPnNhdmVEUExMKTsKKwlSRUdfUkVBRChw aXBlQSA/IERQTExfQSA6IERQTExfQik7CisJdWRlbGF5KDE1MCk7CisKKwlSRUdfV1JJVEUocGlw ZUEgPyBIVE9UQUxfQSA6IEhUT1RBTF9CLCBjcnRjX3N0YXRlLT5zYXZlSFRPVEFMKTsKKwlSRUdf V1JJVEUocGlwZUEgPyBIQkxBTktfQSA6IEhCTEFOS19CLCBjcnRjX3N0YXRlLT5zYXZlSEJMQU5L KTsKKwlSRUdfV1JJVEUocGlwZUEgPyBIU1lOQ19BIDogSFNZTkNfQiwgY3J0Y19zdGF0ZS0+c2F2 ZUhTWU5DKTsKKwlSRUdfV1JJVEUocGlwZUEgPyBWVE9UQUxfQSA6IFZUT1RBTF9CLCBjcnRjX3N0 YXRlLT5zYXZlVlRPVEFMKTsKKwlSRUdfV1JJVEUocGlwZUEgPyBWQkxBTktfQSA6IFZCTEFOS19C LCBjcnRjX3N0YXRlLT5zYXZlVkJMQU5LKTsKKwlSRUdfV1JJVEUocGlwZUEgPyBWU1lOQ19BIDog VlNZTkNfQiwgY3J0Y19zdGF0ZS0+c2F2ZVZTWU5DKTsKKwlSRUdfV1JJVEUocGlwZUEgPyBEU1BB U1RSSURFIDogRFNQQlNUUklERSwgY3J0Y19zdGF0ZS0+c2F2ZURTUFNUUklERSk7CisKKwlSRUdf V1JJVEUocGlwZUEgPyBEU1BBU0laRSA6IERTUEJTSVpFLCBjcnRjX3N0YXRlLT5zYXZlRFNQU0la RSk7CisJUkVHX1dSSVRFKHBpcGVBID8gRFNQQVBPUyA6IERTUEJQT1MsIGNydGNfc3RhdGUtPnNh dmVEU1BQT1MpOworCisJUkVHX1dSSVRFKHBpcGVBID8gUElQRUFTUkMgOiBQSVBFQlNSQywgY3J0 Y19zdGF0ZS0+c2F2ZVBJUEVTUkMpOworCVJFR19XUklURShwaXBlQSA/IERTUEFCQVNFIDogRFNQ QkJBU0UsIGNydGNfc3RhdGUtPnNhdmVEU1BCQVNFKTsKKwlSRUdfV1JJVEUocGlwZUEgPyBQSVBF QUNPTkYgOiBQSVBFQkNPTkYsIGNydGNfc3RhdGUtPnNhdmVQSVBFQ09ORik7CisKKwljZHZfaW50 ZWxfd2FpdF9mb3JfdmJsYW5rKGRldik7CisKKwlSRUdfV1JJVEUocGlwZUEgPyBEU1BBQ05UUiA6 IERTUEJDTlRSLCBjcnRjX3N0YXRlLT5zYXZlRFNQQ05UUik7CisJUkVHX1dSSVRFKHBpcGVBID8g RFNQQUJBU0UgOiBEU1BCQkFTRSwgY3J0Y19zdGF0ZS0+c2F2ZURTUEJBU0UpOworCisJY2R2X2lu dGVsX3dhaXRfZm9yX3ZibGFuayhkZXYpOworCisJcGFsZXR0ZVJlZyA9IHBpcGVBID8gUEFMRVRU RV9BIDogUEFMRVRURV9COworCWZvciAoaSA9IDA7IGkgPCAyNTY7ICsraSkKKwkJUkVHX1dSSVRF KHBhbGV0dGVSZWcgKyAoaSA8PCAyKSwgY3J0Y19zdGF0ZS0+c2F2ZVBhbGV0dGVbaV0pOworfQor CitzdGF0aWMgaW50IGNkdl9pbnRlbF9jcnRjX2N1cnNvcl9zZXQoc3RydWN0IGRybV9jcnRjICpj cnRjLAorCQkJCSBzdHJ1Y3QgZHJtX2ZpbGUgKmZpbGVfcHJpdiwKKwkJCQkgdWludDMyX3QgaGFu ZGxlLAorCQkJCSB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KQoreworCXN0cnVjdCBk cm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IHBzYl9pbnRlbF9jcnRjICpwc2Jf aW50ZWxfY3J0YyA9IHRvX3BzYl9pbnRlbF9jcnRjKGNydGMpOworCWludCBwaXBlID0gcHNiX2lu dGVsX2NydGMtPnBpcGU7CisJdWludDMyX3QgY29udHJvbCA9IChwaXBlID09IDApID8gQ1VSQUNO VFIgOiBDVVJCQ05UUjsKKwl1aW50MzJfdCBiYXNlID0gKHBpcGUgPT0gMCkgPyBDVVJBQkFTRSA6 IENVUkJCQVNFOworCXVpbnQzMl90IHRlbXA7CisJc2l6ZV90IGFkZHIgPSAwOworCXN0cnVjdCBn dHRfcmFuZ2UgKmd0OworCXN0cnVjdCBkcm1fZ2VtX29iamVjdCAqb2JqOworCWludCByZXQ7CisK KwkvKiBpZiB3ZSB3YW50IHRvIHR1cm4gb2YgdGhlIGN1cnNvciBpZ25vcmUgd2lkdGggYW5kIGhl aWdodCAqLworCWlmICghaGFuZGxlKSB7CisJCS8qIHR1cm4gb2ZmIHRoZSBjdXJzb3IgKi8KKwkJ dGVtcCA9IENVUlNPUl9NT0RFX0RJU0FCTEU7CisKKwkJaWYgKGdtYV9wb3dlcl9iZWdpbihkZXYs IGZhbHNlKSkgeworCQkJUkVHX1dSSVRFKGNvbnRyb2wsIHRlbXApOworCQkJUkVHX1dSSVRFKGJh c2UsIDApOworCQkJZ21hX3Bvd2VyX2VuZChkZXYpOworCQl9CisKKwkJLyogdW5waW4gdGhlIG9s ZCBHRU0gb2JqZWN0ICovCisJCWlmIChwc2JfaW50ZWxfY3J0Yy0+Y3Vyc29yX29iaikgeworCQkJ Z3QgPSBjb250YWluZXJfb2YocHNiX2ludGVsX2NydGMtPmN1cnNvcl9vYmosCisJCQkJCQkJc3Ry dWN0IGd0dF9yYW5nZSwgZ2VtKTsKKwkJCXBzYl9ndHRfdW5waW4oZ3QpOworCQkJZHJtX2dlbV9v YmplY3RfdW5yZWZlcmVuY2UocHNiX2ludGVsX2NydGMtPmN1cnNvcl9vYmopOworCQkJcHNiX2lu dGVsX2NydGMtPmN1cnNvcl9vYmogPSBOVUxMOworCQl9CisKKwkJcmV0dXJuIDA7CisJfQorCisJ LyogQ3VycmVudGx5IHdlIG9ubHkgc3VwcG9ydCA2NHg2NCBjdXJzb3JzICovCisJaWYgKHdpZHRo ICE9IDY0IHx8IGhlaWdodCAhPSA2NCkgeworCQlkZXZfZGJnKGRldi0+ZGV2LCAid2UgY3VycmVu dGx5IG9ubHkgc3VwcG9ydCA2NHg2NCBjdXJzb3JzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJb2JqID0gZHJtX2dlbV9vYmplY3RfbG9va3VwKGRldiwgZmlsZV9wcml2LCBoYW5kbGUp OworCWlmICghb2JqKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmIChvYmotPnNpemUgPCB3aWR0 aCAqIGhlaWdodCAqIDQpIHsKKwkJZGV2X2RiZyhkZXYtPmRldiwgImJ1ZmZlciBpcyB0byBzbWFs bFxuIik7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWd0ID0gY29udGFpbmVyX29mKG9iaiwg c3RydWN0IGd0dF9yYW5nZSwgZ2VtKTsKKworCS8qIFBpbiB0aGUgbWVtb3J5IGludG8gdGhlIEdU VCAqLworCXJldCA9IHBzYl9ndHRfcGluKGd0KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2 LT5kZXYsICJDYW4gbm90IHBpbiBkb3duIGhhbmRsZSAweCV4XG4iLCBoYW5kbGUpOworCQlyZXR1 cm4gcmV0OworCX0KKworCWFkZHIgPSBndC0+b2Zmc2V0OwkvKiBPciByZXNvdXJjZS5zdGFydCA/ Pz8gKi8KKworCXBzYl9pbnRlbF9jcnRjLT5jdXJzb3JfYWRkciA9IGFkZHI7CisKKwl0ZW1wID0g MDsKKwkvKiBzZXQgdGhlIHBpcGUgZm9yIHRoZSBjdXJzb3IgKi8KKwl0ZW1wIHw9IChwaXBlIDw8 IDI4KTsKKwl0ZW1wIHw9IENVUlNPUl9NT0RFXzY0X0FSR0JfQVggfCBNQ1VSU09SX0dBTU1BX0VO QUJMRTsKKworCWlmIChnbWFfcG93ZXJfYmVnaW4oZGV2LCBmYWxzZSkpIHsKKwkJUkVHX1dSSVRF KGNvbnRyb2wsIHRlbXApOworCQlSRUdfV1JJVEUoYmFzZSwgYWRkcik7CisJCWdtYV9wb3dlcl9l bmQoZGV2KTsKKwl9CisKKwkvKiB1bnBpbiB0aGUgb2xkIEdFTSBvYmplY3QgKi8KKwlpZiAocHNi X2ludGVsX2NydGMtPmN1cnNvcl9vYmopIHsKKwkJZ3QgPSBjb250YWluZXJfb2YocHNiX2ludGVs X2NydGMtPmN1cnNvcl9vYmosCisJCQkJCQkJc3RydWN0IGd0dF9yYW5nZSwgZ2VtKTsKKwkJcHNi X2d0dF91bnBpbihndCk7CisJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKHBzYl9pbnRlbF9j cnRjLT5jdXJzb3Jfb2JqKTsKKwkJcHNiX2ludGVsX2NydGMtPmN1cnNvcl9vYmogPSBvYmo7CisJ fQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNkdl9pbnRlbF9jcnRjX2N1cnNvcl9tb3Zl KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5KQoreworCXN0cnVjdCBkcm1fZGV2 aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJc3RydWN0IHBzYl9pbnRlbF9jcnRjICpwc2JfaW50ZWxf Y3J0YyA9IHRvX3BzYl9pbnRlbF9jcnRjKGNydGMpOworCWludCBwaXBlID0gcHNiX2ludGVsX2Ny dGMtPnBpcGU7CisJdWludDMyX3QgdGVtcCA9IDA7CisJdWludDMyX3QgYWRkZXI7CisKKworCWlm ICh4IDwgMCkgeworCQl0ZW1wIHw9IChDVVJTT1JfUE9TX1NJR04gPDwgQ1VSU09SX1hfU0hJRlQp OworCQl4ID0gLXg7CisJfQorCWlmICh5IDwgMCkgeworCQl0ZW1wIHw9IChDVVJTT1JfUE9TX1NJ R04gPDwgQ1VSU09SX1lfU0hJRlQpOworCQl5ID0gLXk7CisJfQorCisJdGVtcCB8PSAoKHggJiBD VVJTT1JfUE9TX01BU0spIDw8IENVUlNPUl9YX1NISUZUKTsKKwl0ZW1wIHw9ICgoeSAmIENVUlNP Ul9QT1NfTUFTSykgPDwgQ1VSU09SX1lfU0hJRlQpOworCisJYWRkZXIgPSBwc2JfaW50ZWxfY3J0 Yy0+Y3Vyc29yX2FkZHI7CisKKwlpZiAoZ21hX3Bvd2VyX2JlZ2luKGRldiwgZmFsc2UpKSB7CisJ CVJFR19XUklURSgocGlwZSA9PSAwKSA/IENVUkFQT1MgOiBDVVJCUE9TLCB0ZW1wKTsKKwkJUkVH X1dSSVRFKChwaXBlID09IDApID8gQ1VSQUJBU0UgOiBDVVJCQkFTRSwgYWRkZXIpOworCQlnbWFf cG93ZXJfZW5kKGRldik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjZHZfaW50 ZWxfY3J0Y19nYW1tYV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgKnJlZCwKKwkJCSB1 MTYgKmdyZWVuLCB1MTYgKmJsdWUsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBzaXplKQorewor CXN0cnVjdCBwc2JfaW50ZWxfY3J0YyAqcHNiX2ludGVsX2NydGMgPSB0b19wc2JfaW50ZWxfY3J0 YyhjcnRjKTsKKwlpbnQgaTsKKwlpbnQgZW5kID0gKHN0YXJ0ICsgc2l6ZSA+IDI1NikgPyAyNTYg OiBzdGFydCArIHNpemU7CisKKwlmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisJCXBz Yl9pbnRlbF9jcnRjLT5sdXRfcltpXSA9IHJlZFtpXSA+PiA4OworCQlwc2JfaW50ZWxfY3J0Yy0+ bHV0X2dbaV0gPSBncmVlbltpXSA+PiA4OworCQlwc2JfaW50ZWxfY3J0Yy0+bHV0X2JbaV0gPSBi bHVlW2ldID4+IDg7CisJfQorCisJY2R2X2ludGVsX2NydGNfbG9hZF9sdXQoY3J0Yyk7Cit9CisK K3N0YXRpYyBpbnQgY2R2X2NydGNfc2V0X2NvbmZpZyhzdHJ1Y3QgZHJtX21vZGVfc2V0ICpzZXQp Cit7CisJaW50IHJldCA9IDA7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IHNldC0+Y3J0Yy0+ ZGV2OworCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0 ZTsKKworCWlmICghZGV2X3ByaXYtPnJwbV9lbmFibGVkKQorCQlyZXR1cm4gZHJtX2NydGNfaGVs cGVyX3NldF9jb25maWcoc2V0KTsKKworCXBtX3J1bnRpbWVfZm9yYmlkKCZkZXYtPnBkZXYtPmRl dik7CisKKwlyZXQgPSBkcm1fY3J0Y19oZWxwZXJfc2V0X2NvbmZpZyhzZXQpOworCisJcG1fcnVu dGltZV9hbGxvdygmZGV2LT5wZGV2LT5kZXYpOworCisJcmV0dXJuIHJldDsKK30KKworLyoqIERl cml2ZSB0aGUgcGl4ZWwgY2xvY2sgZm9yIHRoZSBnaXZlbiByZWZjbGsgYW5kIGRpdmlzb3JzIGZv ciA4eHggY2hpcHMuICovCisKKy8qIEZJWE1FOiB3aHkgYXJlIHdlIHVzaW5nIHRoaXMsIHNob3Vs ZCBpdCBiZSBjZHZfIGluIHRoaXMgdHJlZSA/ICovCisKK3N0YXRpYyB2b2lkIGk4eHhfY2xvY2so aW50IHJlZmNsaywgc3RydWN0IGNkdl9pbnRlbF9jbG9ja190ICpjbG9jaykKK3sKKwljbG9jay0+ bSA9IDUgKiAoY2xvY2stPm0xICsgMikgKyAoY2xvY2stPm0yICsgMik7CisJY2xvY2stPnAgPSBj bG9jay0+cDEgKiBjbG9jay0+cDI7CisJY2xvY2stPnZjbyA9IHJlZmNsayAqIGNsb2NrLT5tIC8g KGNsb2NrLT5uICsgMik7CisJY2xvY2stPmRvdCA9IGNsb2NrLT52Y28gLyBjbG9jay0+cDsKK30K KworLyogUmV0dXJucyB0aGUgY2xvY2sgb2YgdGhlIGN1cnJlbnRseSBwcm9ncmFtbWVkIG1vZGUg b2YgdGhlIGdpdmVuIHBpcGUuICovCitzdGF0aWMgaW50IGNkdl9pbnRlbF9jcnRjX2Nsb2NrX2dl dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCXN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sK KwlzdHJ1Y3QgcHNiX2ludGVsX2NydGMgKnBzYl9pbnRlbF9jcnRjID0gdG9fcHNiX2ludGVsX2Ny dGMoY3J0Yyk7CisJaW50IHBpcGUgPSBwc2JfaW50ZWxfY3J0Yy0+cGlwZTsKKwl1MzIgZHBsbDsK Kwl1MzIgZnA7CisJc3RydWN0IGNkdl9pbnRlbF9jbG9ja190IGNsb2NrOworCWJvb2wgaXNfbHZk czsKKwlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7 CisKKwlpZiAoZ21hX3Bvd2VyX2JlZ2luKGRldiwgZmFsc2UpKSB7CisJCWRwbGwgPSBSRUdfUkVB RCgocGlwZSA9PSAwKSA/IERQTExfQSA6IERQTExfQik7CisJCWlmICgoZHBsbCAmIERJU1BMQVlf UkFURV9TRUxFQ1RfRlBBMSkgPT0gMCkKKwkJCWZwID0gUkVHX1JFQUQoKHBpcGUgPT0gMCkgPyBG UEEwIDogRlBCMCk7CisJCWVsc2UKKwkJCWZwID0gUkVHX1JFQUQoKHBpcGUgPT0gMCkgPyBGUEEx IDogRlBCMSk7CisJCWlzX2x2ZHMgPSAocGlwZSA9PSAxKSAmJiAoUkVHX1JFQUQoTFZEUykgJiBM VkRTX1BPUlRfRU4pOworCQlnbWFfcG93ZXJfZW5kKGRldik7CisJfSBlbHNlIHsKKwkJZHBsbCA9 IChwaXBlID09IDApID8KKwkJCWRldl9wcml2LT5zYXZlRFBMTF9BIDogZGV2X3ByaXYtPnNhdmVE UExMX0I7CisKKwkJaWYgKChkcGxsICYgRElTUExBWV9SQVRFX1NFTEVDVF9GUEExKSA9PSAwKQor CQkJZnAgPSAocGlwZSA9PSAwKSA/CisJCQkJZGV2X3ByaXYtPnNhdmVGUEEwIDoKKwkJCQlkZXZf cHJpdi0+c2F2ZUZQQjA7CisJCWVsc2UKKwkJCWZwID0gKHBpcGUgPT0gMCkgPworCQkJCWRldl9w cml2LT5zYXZlRlBBMSA6CisJCQkJZGV2X3ByaXYtPnNhdmVGUEIxOworCisJCWlzX2x2ZHMgPSAo cGlwZSA9PSAxKSAmJiAoZGV2X3ByaXYtPnNhdmVMVkRTICYgTFZEU19QT1JUX0VOKTsKKwl9CisK KwljbG9jay5tMSA9IChmcCAmIEZQX00xX0RJVl9NQVNLKSA+PiBGUF9NMV9ESVZfU0hJRlQ7CisJ Y2xvY2subTIgPSAoZnAgJiBGUF9NMl9ESVZfTUFTSykgPj4gRlBfTTJfRElWX1NISUZUOworCWNs b2NrLm4gPSAoZnAgJiBGUF9OX0RJVl9NQVNLKSA+PiBGUF9OX0RJVl9TSElGVDsKKworCWlmIChp c19sdmRzKSB7CisJCWNsb2NrLnAxID0KKwkJICAgIGZmcygoZHBsbCAmCisJCQkgRFBMTF9GUEEw MV9QMV9QT1NUX0RJVl9NQVNLX0k4MzBfTFZEUykgPj4KKwkJCURQTExfRlBBMDFfUDFfUE9TVF9E SVZfU0hJRlQpOworCQlpZiAoY2xvY2sucDEgPT0gMCkgeworCQkJY2xvY2sucDEgPSA0OworCQkJ ZGV2X2VycihkZXYtPmRldiwgIlBMTCAlZFxuIiwgZHBsbCk7CisJCX0KKwkJY2xvY2sucDIgPSAx NDsKKworCQlpZiAoKGRwbGwgJiBQTExfUkVGX0lOUFVUX01BU0spID09CisJCSAgICBQTExCX1JF Rl9JTlBVVF9TUFJFQURTUEVDVFJVTUlOKSB7CisJCQkvKiBYWFg6IG1pZ2h0IG5vdCBiZSA2Nk1I eiAqLworCQkJaTh4eF9jbG9jayg2NjAwMCwgJmNsb2NrKTsKKwkJfSBlbHNlCisJCQlpOHh4X2Ns b2NrKDQ4MDAwLCAmY2xvY2spOworCX0gZWxzZSB7CisJCWlmIChkcGxsICYgUExMX1AxX0RJVklE RV9CWV9UV08pCisJCQljbG9jay5wMSA9IDI7CisJCWVsc2UgeworCQkJY2xvY2sucDEgPQorCQkJ ICAgICgoZHBsbCAmCisJCQkgICAgICBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0tfSTgzMCkg Pj4KKwkJCSAgICAgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9TSElGVCkgKyAyOworCQl9CisJCWlm IChkcGxsICYgUExMX1AyX0RJVklERV9CWV80KQorCQkJY2xvY2sucDIgPSA0OworCQllbHNlCisJ CQljbG9jay5wMiA9IDI7CisKKwkJaTh4eF9jbG9jayg0ODAwMCwgJmNsb2NrKTsKKwl9CisKKwkv KiBYWFg6IEl0IHdvdWxkIGJlIG5pY2UgdG8gdmFsaWRhdGUgdGhlIGNsb2NrcywgYnV0IHdlIGNh bid0IHJldXNlCisJICogaTgzMFBsbElzVmFsaWQoKSBiZWNhdXNlIGl0IHJlbGllcyBvbiB0aGUg eGY4Nl9jb25maWcgY29ubmVjdG9yCisJICogY29uZmlndXJhdGlvbiBiZWluZyBhY2N1cmF0ZSwg d2hpY2ggaXQgaXNuJ3QgbmVjZXNzYXJpbHkuCisJICovCisKKwlyZXR1cm4gY2xvY2suZG90Owor fQorCisvKiogUmV0dXJucyB0aGUgY3VycmVudGx5IHByb2dyYW1tZWQgbW9kZSBvZiB0aGUgZ2l2 ZW4gcGlwZS4gKi8KK3N0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpjZHZfaW50ZWxfY3J0Y19tb2Rl X2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICAgIHN0cnVjdCBkcm1fY3J0YyAq Y3J0YykKK3sKKwlzdHJ1Y3QgcHNiX2ludGVsX2NydGMgKnBzYl9pbnRlbF9jcnRjID0gdG9fcHNi X2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBwc2JfaW50ZWxfY3J0Yy0+cGlwZTsKKwlz dHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKKwlpbnQgaHRvdDsKKwlpbnQgaHN5bmM7CisJ aW50IHZ0b3Q7CisJaW50IHZzeW5jOworCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2 ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCWlmIChnbWFfcG93ZXJfYmVnaW4oZGV2LCBmYWxzZSkp IHsKKwkJaHRvdCA9IFJFR19SRUFEKChwaXBlID09IDApID8gSFRPVEFMX0EgOiBIVE9UQUxfQik7 CisJCWhzeW5jID0gUkVHX1JFQUQoKHBpcGUgPT0gMCkgPyBIU1lOQ19BIDogSFNZTkNfQik7CisJ CXZ0b3QgPSBSRUdfUkVBRCgocGlwZSA9PSAwKSA/IFZUT1RBTF9BIDogVlRPVEFMX0IpOworCQl2 c3luYyA9IFJFR19SRUFEKChwaXBlID09IDApID8gVlNZTkNfQSA6IFZTWU5DX0IpOworCQlnbWFf cG93ZXJfZW5kKGRldik7CisJfSBlbHNlIHsKKwkJaHRvdCA9IChwaXBlID09IDApID8KKwkJCWRl dl9wcml2LT5zYXZlSFRPVEFMX0EgOiBkZXZfcHJpdi0+c2F2ZUhUT1RBTF9COworCQloc3luYyA9 IChwaXBlID09IDApID8KKwkJCWRldl9wcml2LT5zYXZlSFNZTkNfQSA6IGRldl9wcml2LT5zYXZl SFNZTkNfQjsKKwkJdnRvdCA9IChwaXBlID09IDApID8KKwkJCWRldl9wcml2LT5zYXZlVlRPVEFM X0EgOiBkZXZfcHJpdi0+c2F2ZVZUT1RBTF9COworCQl2c3luYyA9IChwaXBlID09IDApID8KKwkJ CWRldl9wcml2LT5zYXZlVlNZTkNfQSA6IGRldl9wcml2LT5zYXZlVlNZTkNfQjsKKwl9CisKKwlt b2RlID0ga3phbGxvYyhzaXplb2YoKm1vZGUpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1vZGUpCisJ CXJldHVybiBOVUxMOworCisJbW9kZS0+Y2xvY2sgPSBjZHZfaW50ZWxfY3J0Y19jbG9ja19nZXQo ZGV2LCBjcnRjKTsKKwltb2RlLT5oZGlzcGxheSA9IChodG90ICYgMHhmZmZmKSArIDE7CisJbW9k ZS0+aHRvdGFsID0gKChodG90ICYgMHhmZmZmMDAwMCkgPj4gMTYpICsgMTsKKwltb2RlLT5oc3lu Y19zdGFydCA9IChoc3luYyAmIDB4ZmZmZikgKyAxOworCW1vZGUtPmhzeW5jX2VuZCA9ICgoaHN5 bmMgJiAweGZmZmYwMDAwKSA+PiAxNikgKyAxOworCW1vZGUtPnZkaXNwbGF5ID0gKHZ0b3QgJiAw eGZmZmYpICsgMTsKKwltb2RlLT52dG90YWwgPSAoKHZ0b3QgJiAweGZmZmYwMDAwKSA+PiAxNikg KyAxOworCW1vZGUtPnZzeW5jX3N0YXJ0ID0gKHZzeW5jICYgMHhmZmZmKSArIDE7CisJbW9kZS0+ dnN5bmNfZW5kID0gKCh2c3luYyAmIDB4ZmZmZjAwMDApID4+IDE2KSArIDE7CisKKwlkcm1fbW9k ZV9zZXRfbmFtZShtb2RlKTsKKwlkcm1fbW9kZV9zZXRfY3J0Y2luZm8obW9kZSwgMCk7CisKKwly ZXR1cm4gbW9kZTsKK30KKworc3RhdGljIHZvaWQgY2R2X2ludGVsX2NydGNfZGVzdHJveShzdHJ1 Y3QgZHJtX2NydGMgKmNydGMpCit7CisJc3RydWN0IHBzYl9pbnRlbF9jcnRjICpwc2JfaW50ZWxf Y3J0YyA9IHRvX3BzYl9pbnRlbF9jcnRjKGNydGMpOworCisJa2ZyZWUocHNiX2ludGVsX2NydGMt PmNydGNfc3RhdGUpOworCWRybV9jcnRjX2NsZWFudXAoY3J0Yyk7CisJa2ZyZWUocHNiX2ludGVs X2NydGMpOworfQorCitjb25zdCBzdHJ1Y3QgZHJtX2NydGNfaGVscGVyX2Z1bmNzIGNkdl9pbnRl bF9oZWxwZXJfZnVuY3MgPSB7CisJLmRwbXMgPSBjZHZfaW50ZWxfY3J0Y19kcG1zLAorCS5tb2Rl X2ZpeHVwID0gY2R2X2ludGVsX2NydGNfbW9kZV9maXh1cCwKKwkubW9kZV9zZXQgPSBjZHZfaW50 ZWxfY3J0Y19tb2RlX3NldCwKKwkubW9kZV9zZXRfYmFzZSA9IGNkdl9pbnRlbF9waXBlX3NldF9i YXNlLAorCS5wcmVwYXJlID0gY2R2X2ludGVsX2NydGNfcHJlcGFyZSwKKwkuY29tbWl0ID0gY2R2 X2ludGVsX2NydGNfY29tbWl0LAorfTsKKworY29uc3Qgc3RydWN0IGRybV9jcnRjX2Z1bmNzIGNk dl9pbnRlbF9jcnRjX2Z1bmNzID0geworCS5zYXZlID0gY2R2X2ludGVsX2NydGNfc2F2ZSwKKwku cmVzdG9yZSA9IGNkdl9pbnRlbF9jcnRjX3Jlc3RvcmUsCisJLmN1cnNvcl9zZXQgPSBjZHZfaW50 ZWxfY3J0Y19jdXJzb3Jfc2V0LAorCS5jdXJzb3JfbW92ZSA9IGNkdl9pbnRlbF9jcnRjX2N1cnNv cl9tb3ZlLAorCS5nYW1tYV9zZXQgPSBjZHZfaW50ZWxfY3J0Y19nYW1tYV9zZXQsCisJLnNldF9j b25maWcgPSBjZHZfY3J0Y19zZXRfY29uZmlnLAorCS5kZXN0cm95ID0gY2R2X2ludGVsX2NydGNf ZGVzdHJveSwKK307CisKKy8qCisgKiBTZXQgdGhlIGRlZmF1bHQgdmFsdWUgb2YgY3Vyc29yIGNv bnRyb2wgYW5kIGJhc2UgcmVnaXN0ZXIKKyAqIHRvIHplcm8uIFRoaXMgaXMgYSB3b3JrYXJvdW5k IGZvciBoL3cgZGVmZWN0IG9uIG9ha3RyYWlsCisgKi8KK3ZvaWQgY2R2X2ludGVsX2N1cnNvcl9p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQoreworCXVpbnQzMl90IGNvbnRy b2w7CisJdWludDMyX3QgYmFzZTsKKworCXN3aXRjaCAocGlwZSkgeworCWNhc2UgMDoKKwkJY29u dHJvbCA9IENVUkFDTlRSOworCQliYXNlID0gQ1VSQUJBU0U7CisJCWJyZWFrOworCWNhc2UgMToK KwkJY29udHJvbCA9IENVUkJDTlRSOworCQliYXNlID0gQ1VSQkJBU0U7CisJCWJyZWFrOworCWNh c2UgMjoKKwkJY29udHJvbCA9IENVUkNDTlRSOworCQliYXNlID0gQ1VSQ0JBU0U7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlSRUdfV1JJVEUoY29udHJvbCwgMCk7CisJ UkVHX1dSSVRFKGJhc2UsIDApOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21h NTAwL2Nkdl9pbnRlbF9oZG1pLmMgYi9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9o ZG1pLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JjYTJiMAotLS0gL2Rl di9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvY2R2X2ludGVsX2hkbWkuYwpAQCAt MCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMTEgSW50ZWwgQ29ycG9y YXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJn ZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFu ZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRv IGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRo b3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdl LCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVz IG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBT b2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBj b25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwg YmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUK KyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBX SVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNM VURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU WSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1F TlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERF UlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElU WSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBB UklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FS RSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKgor ICogQXV0aG9yczoKKyAqCWppbSBsaXUgPGppbS5saXVAaW50ZWwuY29tPgorICoKKyAqIEZJWE1F OgorICoJV2Ugc2hvdWxkIHByb2JhYmx5IG1ha2UgdGhpcyBnZW5lcmljIGFuZCBzaGFyZSBpdCB3 aXRoIE1lZGZpZWxkCisgKi8KKworI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSA8ZHJt L2RybS5oPgorI2luY2x1ZGUgPGRybS9kcm1fY3J0Yy5oPgorI2luY2x1ZGUgPGRybS9kcm1fZWRp ZC5oPgorI2luY2x1ZGUgInBzYl9pbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJwc2JfZHJ2LmgiCisj aW5jbHVkZSAicHNiX2ludGVsX3JlZy5oIgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4K KworLyogaGRtaSBjb250cm9sIGJpdHMgKi8KKyNkZWZpbmUgSERNSV9OVUxMX1BBQ0tFVFNfRFVS SU5HX1ZTWU5DCSgxIDw8IDkpCisjZGVmaW5lIEhETUlfQk9SREVSX0VOQUJMRQkJKDEgPDwgNykK KyNkZWZpbmUgSERNSV9BVURJT19FTkFCTEUJCSgxIDw8IDYpCisjZGVmaW5lIEhETUlfVlNZTkNf QUNUSVZFX0hJR0gJCSgxIDw8IDQpCisjZGVmaW5lIEhETUlfSFNZTkNfQUNUSVZFX0hJR0gJCSgx IDw8IDMpCisvKiBoZG1pLWIgY29udHJvbCBiaXRzICovCisjZGVmaW5lCUhETUlCX1BJUEVfQl9T RUxFQ1QJCSgxIDw8IDMwKQorCisKK3N0cnVjdCBtaWRfaW50ZWxfaGRtaV9wcml2IHsKKwl1MzIg aGRtaV9yZWc7CisJdTMyIHNhdmVfSERNSUI7CisJYm9vbCBoYXNfaGRtaV9zaW5rOworCWJvb2wg aGFzX2hkbWlfYXVkaW87CisJLyogU2hvdWxkIHNldCB0aGlzIHdoZW4gZGV0ZWN0IGhvdHBsdWcg Ki8KKwlib29sIGhkbWlfZGV2aWNlX2Nvbm5lY3RlZDsKKwlzdHJ1Y3QgbWRmbGRfaGRtaV9pMmMg KmkyY19idXM7CisJc3RydWN0IGkyY19hZGFwdGVyICpoZG1pX2kyY19hZGFwdGVyOwkvKiBmb3Ig Y29udHJvbCBmdW5jdGlvbnMgKi8KKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2OworfTsKKworc3Rh dGljIHZvaWQgY2R2X2hkbWlfbW9kZV9zZXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLAor CQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlf bW9kZSAqYWRqdXN0ZWRfbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rl ci0+ZGV2OworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpvdXRwdXQgPSBlbmNfdG9fcHNiX2lu dGVsX291dHB1dChlbmNvZGVyKTsKKwlzdHJ1Y3QgbWlkX2ludGVsX2hkbWlfcHJpdiAqaGRtaV9w cml2ID0gb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgaGRtaWI7CisJc3RydWN0IGRybV9jcnRjICpj cnRjID0gZW5jb2Rlci0+Y3J0YzsKKwlzdHJ1Y3QgcHNiX2ludGVsX2NydGMgKmludGVsX2NydGMg PSB0b19wc2JfaW50ZWxfY3J0YyhjcnRjKTsKKworCWhkbWliID0gKDIgPDwgMTApOworCisJaWYg KGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19QVlNZTkMpCisJCWhkbWliIHw9 IEhETUlfVlNZTkNfQUNUSVZFX0hJR0g7CisJaWYgKGFkanVzdGVkX21vZGUtPmZsYWdzICYgRFJN X01PREVfRkxBR19QSFNZTkMpCisJCWhkbWliIHw9IEhETUlfSFNZTkNfQUNUSVZFX0hJR0g7CisK KwlpZiAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAxKQorCQloZG1pYiB8PSBIRE1JQl9QSVBFX0JfU0VM RUNUOworCisJaWYgKGhkbWlfcHJpdi0+aGFzX2hkbWlfYXVkaW8pIHsKKwkJaGRtaWIgfD0gSERN SV9BVURJT19FTkFCTEU7CisJCWhkbWliIHw9IEhETUlfTlVMTF9QQUNLRVRTX0RVUklOR19WU1lO QzsKKwl9CisKKwlSRUdfV1JJVEUoaGRtaV9wcml2LT5oZG1pX3JlZywgaGRtaWIpOworCVJFR19S RUFEKGhkbWlfcHJpdi0+aGRtaV9yZWcpOworfQorCitzdGF0aWMgYm9vbCBjZHZfaGRtaV9tb2Rl X2ZpeHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgIHN0cnVjdCBkcm1fZGlz cGxheV9tb2RlICptb2RlLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVk X21vZGUpCit7CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGNkdl9oZG1pX2RwbXMo c3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkKK3sKKwlzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpvdXRw dXQgPSBlbmNfdG9fcHNiX2ludGVsX291dHB1dChlbmNvZGVyKTsKKwlzdHJ1Y3QgbWlkX2ludGVs X2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gb3V0cHV0LT5kZXZfcHJpdjsKKwl1MzIgaGRtaWI7CisK KwloZG1pYiA9IFJFR19SRUFEKGhkbWlfcHJpdi0+aGRtaV9yZWcpOworCisJaWYgKG1vZGUgIT0g RFJNX01PREVfRFBNU19PTikKKwkJUkVHX1dSSVRFKGhkbWlfcHJpdi0+aGRtaV9yZWcsIGhkbWli ICYgfkhETUlCX1BPUlRfRU4pOworCWVsc2UKKwkJUkVHX1dSSVRFKGhkbWlfcHJpdi0+aGRtaV9y ZWcsIGhkbWliIHwgSERNSUJfUE9SVF9FTik7CisJUkVHX1JFQUQoaGRtaV9wcml2LT5oZG1pX3Jl Zyk7Cit9CisKK3N0YXRpYyB2b2lkIGNkdl9oZG1pX3NhdmUoc3RydWN0IGRybV9jb25uZWN0b3Ig KmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY29ubmVjdG9yLT5kZXY7 CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKm91dHB1dCA9IHRvX3BzYl9pbnRlbF9vdXRwdXQo Y29ubmVjdG9yKTsKKwlzdHJ1Y3QgbWlkX2ludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2ID0gb3V0 cHV0LT5kZXZfcHJpdjsKKworCWhkbWlfcHJpdi0+c2F2ZV9IRE1JQiA9IFJFR19SRUFEKGhkbWlf cHJpdi0+aGRtaV9yZWcpOworfQorCitzdGF0aWMgdm9pZCBjZHZfaGRtaV9yZXN0b3JlKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9 IGNvbm5lY3Rvci0+ZGV2OworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpvdXRwdXQgPSB0b19w c2JfaW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IG1pZF9pbnRlbF9oZG1pX3ByaXYg KmhkbWlfcHJpdiA9IG91dHB1dC0+ZGV2X3ByaXY7CisKKwlSRUdfV1JJVEUoaGRtaV9wcml2LT5o ZG1pX3JlZywgaGRtaV9wcml2LT5zYXZlX0hETUlCKTsKKwlSRUdfUkVBRChoZG1pX3ByaXYtPmhk bWlfcmVnKTsKK30KKworc3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY2R2X2hkbWlf ZGV0ZWN0KAorCQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2Up Cit7CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKnBzYl9pbnRlbF9vdXRwdXQgPQorCQkJCQkJ dG9fcHNiX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBtaWRfaW50ZWxfaGRtaV9w cml2ICpoZG1pX3ByaXYgPSBwc2JfaW50ZWxfb3V0cHV0LT5kZXZfcHJpdjsKKwlzdHJ1Y3QgZWRp ZCAqZWRpZCA9IE5VTEw7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25u ZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKworCWVkaWQgPSBkcm1fZ2V0X2VkaWQoJnBzYl9p bnRlbF9vdXRwdXQtPmJhc2UsCisJCQkgcHNiX2ludGVsX291dHB1dC0+aGRtaV9pMmNfYWRhcHRl cik7CisKKwloZG1pX3ByaXYtPmhhc19oZG1pX3NpbmsgPSBmYWxzZTsKKwloZG1pX3ByaXYtPmhh c19oZG1pX2F1ZGlvID0gZmFsc2U7CisJaWYgKGVkaWQpIHsKKwkJaWYgKGVkaWQtPmlucHV0ICYg RFJNX0VESURfSU5QVVRfRElHSVRBTCkgeworCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19j b25uZWN0ZWQ7CisJCQloZG1pX3ByaXYtPmhhc19oZG1pX3NpbmsgPQorCQkJCQkJZHJtX2RldGVj dF9oZG1pX21vbml0b3IoZWRpZCk7CisJCQloZG1pX3ByaXYtPmhhc19oZG1pX2F1ZGlvID0KKwkJ CQkJCWRybV9kZXRlY3RfbW9uaXRvcl9hdWRpbyhlZGlkKTsKKwkJfQorCisJCXBzYl9pbnRlbF9v dXRwdXQtPmJhc2UuZGlzcGxheV9pbmZvLnJhd19lZGlkID0gTlVMTDsKKwkJa2ZyZWUoZWRpZCk7 CisJfQorCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgY2R2X2hkbWlfc2V0X3Byb3Bl cnR5KHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsCisJCQkJICAgICAgIHN0cnVjdCBk cm1fcHJvcGVydHkgKnByb3BlcnR5LAorCQkJCSAgICAgICB1aW50NjRfdCB2YWx1ZSkKK3sKKwlz dHJ1Y3QgZHJtX2VuY29kZXIgKmVuY29kZXIgPSBjb25uZWN0b3ItPmVuY29kZXI7CisKKwlpZiAo IXN0cmNtcChwcm9wZXJ0eS0+bmFtZSwgInNjYWxpbmcgbW9kZSIpICYmIGVuY29kZXIpIHsKKwkJ c3RydWN0IHBzYl9pbnRlbF9jcnRjICpjcnRjID0gdG9fcHNiX2ludGVsX2NydGMoZW5jb2Rlci0+ Y3J0Yyk7CisJCWJvb2wgY2VudHJlOworCQl1aW50NjRfdCBjdXJWYWx1ZTsKKworCQlpZiAoIWNy dGMpCisJCQlyZXR1cm4gLTE7CisKKwkJc3dpdGNoICh2YWx1ZSkgeworCQljYXNlIERSTV9NT0RF X1NDQUxFX0ZVTExTQ1JFRU46CisJCQlicmVhazsKKwkJY2FzZSBEUk1fTU9ERV9TQ0FMRV9OT19T Q0FMRToKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RFX1NDQUxFX0FTUEVDVDoKKwkJCWJyZWFr OworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGRybV9jb25uZWN0b3Jf cHJvcGVydHlfZ2V0X3ZhbHVlKGNvbm5lY3RvciwKKwkJCQkJCQlwcm9wZXJ0eSwgJmN1clZhbHVl KSkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoY3VyVmFsdWUgPT0gdmFsdWUpCisJCQlyZXR1cm4g MDsKKworCQlpZiAoZHJtX2Nvbm5lY3Rvcl9wcm9wZXJ0eV9zZXRfdmFsdWUoY29ubmVjdG9yLAor CQkJCQkJCXByb3BlcnR5LCB2YWx1ZSkpCisJCQlyZXR1cm4gLTE7CisKKwkJY2VudHJlID0gKGN1 clZhbHVlID09IERSTV9NT0RFX1NDQUxFX05PX1NDQUxFKSB8fAorCQkJKHZhbHVlID09IERSTV9N T0RFX1NDQUxFX05PX1NDQUxFKTsKKworCQlpZiAoY3J0Yy0+c2F2ZWRfbW9kZS5oZGlzcGxheSAh PSAwICYmCisJCSAgICBjcnRjLT5zYXZlZF9tb2RlLnZkaXNwbGF5ICE9IDApIHsKKwkJCWlmIChj ZW50cmUpIHsKKwkJCQlpZiAoIWRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZShlbmNvZGVyLT5jcnRj LCAmY3J0Yy0+c2F2ZWRfbW9kZSwKKwkJCQkJICAgIGVuY29kZXItPmNydGMtPngsIGVuY29kZXIt PmNydGMtPnksIGVuY29kZXItPmNydGMtPmZiKSkKKwkJCQkJcmV0dXJuIC0xOworCQkJfSBlbHNl IHsKKwkJCQlzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICpoZWxwZXJzCisJCQkJCQkg ICAgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJCQloZWxwZXJzLT5tb2RlX3NldChlbmNv ZGVyLCAmY3J0Yy0+c2F2ZWRfbW9kZSwKKwkJCQkJICAgICAmY3J0Yy0+c2F2ZWRfYWRqdXN0ZWRf bW9kZSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBSZXR1cm4gdGhl IGxpc3Qgb2YgSERNSSBEREMgbW9kZXMgaWYgYXZhaWxhYmxlLgorICovCitzdGF0aWMgaW50IGNk dl9oZG1pX2dldF9tb2RlcyhzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0 cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpwc2JfaW50ZWxfb3V0cHV0ID0KKwkJCQkJdG9fcHNiX2lu dGVsX291dHB1dChjb25uZWN0b3IpOworCXN0cnVjdCBlZGlkICplZGlkID0gTlVMTDsKKwlpbnQg cmV0ID0gMDsKKworCWVkaWQgPSBkcm1fZ2V0X2VkaWQoJnBzYl9pbnRlbF9vdXRwdXQtPmJhc2Us CisJCQkgcHNiX2ludGVsX291dHB1dC0+aGRtaV9pMmNfYWRhcHRlcik7CisJaWYgKGVkaWQpIHsK KwkJZHJtX21vZGVfY29ubmVjdG9yX3VwZGF0ZV9lZGlkX3Byb3BlcnR5KCZwc2JfaW50ZWxfb3V0 cHV0LT4KKwkJCQkJCQliYXNlLCBlZGlkKTsKKwkJcmV0ID0gZHJtX2FkZF9lZGlkX21vZGVzKCZw c2JfaW50ZWxfb3V0cHV0LT5iYXNlLCBlZGlkKTsKKwkJa2ZyZWUoZWRpZCk7CisJfQorCXJldHVy biByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY2R2X2hkbWlfbW9kZV92YWxpZChzdHJ1Y3QgZHJtX2Nv bm5lY3RvciAqY29ubmVjdG9yLAorCQkJCSBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSkK K3sKKworCWlmIChtb2RlLT5jbG9jayA+IDE2NTAwMCkKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElH SDsKKwlpZiAobW9kZS0+Y2xvY2sgPCAyMDAwMCkKKwkJcmV0dXJuIE1PREVfQ0xPQ0tfSElHSDsK KworCS8qIGp1c3QgaW4gY2FzZSAqLworCWlmIChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdf REJMU0NBTikKKwkJcmV0dXJuIE1PREVfTk9fREJMRVNDQU47CisKKwkvKiBqdXN0IGluIGNhc2Ug Ki8KKwlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkKKwkJcmV0dXJu IE1PREVfTk9fSU5URVJMQUNFOworCisJLyoKKwkgKiBGSVhNRTogZm9yIG5vdyB3ZSBsaW1pdCB0 aGUgc2l6ZSB0byAxNjgweDEwNTAgb24gQ0RWLCBvdGhlcndpc2UgaXQKKwkgKiB3aWxsIGdvIGJl eW9uZCB0aGUgc3RvbGVuIG1lbW9yeSBzaXplIGFsbG9jYXRlZCB0byB0aGUgZnJhbWVidWZmZXIK KwkgKi8KKwlpZiAobW9kZS0+aGRpc3BsYXkgPiAxNjgwKQorCQlyZXR1cm4gTU9ERV9QQU5FTDsK KwlpZiAobW9kZS0+dmRpc3BsYXkgPiAxMDUwKQorCQlyZXR1cm4gTU9ERV9QQU5FTDsKKwlyZXR1 cm4gTU9ERV9PSzsKK30KKworc3RhdGljIHZvaWQgY2R2X2hkbWlfZGVzdHJveShzdHJ1Y3QgZHJt X2Nvbm5lY3RvciAqY29ubmVjdG9yKQoreworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpwc2Jf aW50ZWxfb3V0cHV0ID0KKwkJCQkJdG9fcHNiX2ludGVsX291dHB1dChjb25uZWN0b3IpOworCisJ aWYgKHBzYl9pbnRlbF9vdXRwdXQtPmRkY19idXMpCisJCXBzYl9pbnRlbF9pMmNfZGVzdHJveShw c2JfaW50ZWxfb3V0cHV0LT5kZGNfYnVzKTsKKwlkcm1fc3lzZnNfY29ubmVjdG9yX3JlbW92ZShj b25uZWN0b3IpOworCWRybV9jb25uZWN0b3JfY2xlYW51cChjb25uZWN0b3IpOworCWtmcmVlKGNv bm5lY3Rvcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1 bmNzIGNkdl9oZG1pX2hlbHBlcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGNkdl9oZG1pX2RwbXMsCisJ Lm1vZGVfZml4dXAgPSBjZHZfaGRtaV9tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gcHNiX2ludGVs X2VuY29kZXJfcHJlcGFyZSwKKwkubW9kZV9zZXQgPSBjZHZfaGRtaV9tb2RlX3NldCwKKwkuY29t bWl0ID0gcHNiX2ludGVsX2VuY29kZXJfY29tbWl0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVj dCBkcm1fY29ubmVjdG9yX2hlbHBlcl9mdW5jcworCQkJCQljZHZfaGRtaV9jb25uZWN0b3JfaGVs cGVyX2Z1bmNzID0geworCS5nZXRfbW9kZXMgPSBjZHZfaGRtaV9nZXRfbW9kZXMsCisJLm1vZGVf dmFsaWQgPSBjZHZfaGRtaV9tb2RlX3ZhbGlkLAorCS5iZXN0X2VuY29kZXIgPSBwc2JfaW50ZWxf YmVzdF9lbmNvZGVyLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9yX2Z1 bmNzIGNkdl9oZG1pX2Nvbm5lY3Rvcl9mdW5jcyA9IHsKKwkuZHBtcyA9IGRybV9oZWxwZXJfY29u bmVjdG9yX2RwbXMsCisJLnNhdmUgPSBjZHZfaGRtaV9zYXZlLAorCS5yZXN0b3JlID0gY2R2X2hk bWlfcmVzdG9yZSwKKwkuZGV0ZWN0ID0gY2R2X2hkbWlfZGV0ZWN0LAorCS5maWxsX21vZGVzID0g ZHJtX2hlbHBlcl9wcm9iZV9zaW5nbGVfY29ubmVjdG9yX21vZGVzLAorCS5zZXRfcHJvcGVydHkg PSBjZHZfaGRtaV9zZXRfcHJvcGVydHksCisJLmRlc3Ryb3kgPSBjZHZfaGRtaV9kZXN0cm95LAor fTsKKwordm9pZCBjZHZfaGRtaV9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQlzdHJ1 Y3QgcHNiX2ludGVsX21vZGVfZGV2aWNlICptb2RlX2RldiwgaW50IHJlZykKK3sKKwlzdHJ1Y3Qg cHNiX2ludGVsX291dHB1dCAqcHNiX2ludGVsX291dHB1dDsKKwlzdHJ1Y3QgZHJtX2Nvbm5lY3Rv ciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcjsKKwlzdHJ1Y3QgbWlk X2ludGVsX2hkbWlfcHJpdiAqaGRtaV9wcml2OworCWludCBkZGNfYnVzOworCisJcHNiX2ludGVs X291dHB1dCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0KSArCisJCQkg ICAgICAgc2l6ZW9mKHN0cnVjdCBtaWRfaW50ZWxfaGRtaV9wcml2KSwgR0ZQX0tFUk5FTCk7CisJ aWYgKCFwc2JfaW50ZWxfb3V0cHV0KQorCQlyZXR1cm47CisKKwloZG1pX3ByaXYgPSAoc3RydWN0 IG1pZF9pbnRlbF9oZG1pX3ByaXYgKikocHNiX2ludGVsX291dHB1dCArIDEpOworCXBzYl9pbnRl bF9vdXRwdXQtPm1vZGVfZGV2ID0gbW9kZV9kZXY7CisJY29ubmVjdG9yID0gJnBzYl9pbnRlbF9v dXRwdXQtPmJhc2U7CisJZW5jb2RlciA9ICZwc2JfaW50ZWxfb3V0cHV0LT5lbmM7CisJZHJtX2Nv bm5lY3Rvcl9pbml0KGRldiwgJnBzYl9pbnRlbF9vdXRwdXQtPmJhc2UsCisJCQkgICAmY2R2X2hk bWlfY29ubmVjdG9yX2Z1bmNzLAorCQkJICAgRFJNX01PREVfQ09OTkVDVE9SX0RWSUQpOworCisJ ZHJtX2VuY29kZXJfaW5pdChkZXYsICZwc2JfaW50ZWxfb3V0cHV0LT5lbmMsICZwc2JfaW50ZWxf bHZkc19lbmNfZnVuY3MsCisJCQkgRFJNX01PREVfRU5DT0RFUl9UTURTKTsKKworCWRybV9tb2Rl X2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcigmcHNiX2ludGVsX291dHB1dC0+YmFzZSwKKwkJCQkJ ICAmcHNiX2ludGVsX291dHB1dC0+ZW5jKTsKKwlwc2JfaW50ZWxfb3V0cHV0LT50eXBlID0gSU5U RUxfT1VUUFVUX0hETUk7CisJaGRtaV9wcml2LT5oZG1pX3JlZyA9IHJlZzsKKwloZG1pX3ByaXYt Pmhhc19oZG1pX3NpbmsgPSBmYWxzZTsKKwlwc2JfaW50ZWxfb3V0cHV0LT5kZXZfcHJpdiA9IGhk bWlfcHJpdjsKKworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmNkdl9oZG1pX2hl bHBlcl9mdW5jcyk7CisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwKKwkJCQkg JmNkdl9oZG1pX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCWNvbm5lY3Rvci0+ZGlzcGxheV9p bmZvLnN1YnBpeGVsX29yZGVyID0gU3ViUGl4ZWxIb3Jpem9udGFsUkdCOworCWNvbm5lY3Rvci0+ aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5fYWxsb3dl ZCA9IGZhbHNlOworCisJZHJtX2Nvbm5lY3Rvcl9hdHRhY2hfcHJvcGVydHkoY29ubmVjdG9yLAor CSAgICBkZXYtPm1vZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSwgRFJNX01PREVfU0NB TEVfRlVMTFNDUkVFTik7CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgU0RWT0I6CisJCWRkY19i dXMgPSBHUElPRTsKKwkJYnJlYWs7CisJY2FzZSBTRFZPQzoKKwkJZGRjX2J1cyA9IEdQSU9EOwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlEUk1fRVJST1IoInVua25vd24gcmVnIDB4JXggZm9yIEhE TUlcbiIsIHJlZyk7CisJCWdvdG8gZmFpbGVkX2RkYzsKKwkJYnJlYWs7CisJfQorCisJcHNiX2lu dGVsX291dHB1dC0+ZGRjX2J1cyA9IHBzYl9pbnRlbF9pMmNfY3JlYXRlKGRldiwKKwkJCQlkZGNf YnVzLCAocmVnID09IFNEVk9CKSA/ICJIRE1JQiIgOiAiSERNSUMiKTsKKworCWlmICghcHNiX2lu dGVsX291dHB1dC0+ZGRjX2J1cykgeworCQlkZXZfZXJyKGRldi0+ZGV2LCAiTm8gZGRjIGFkYXB0 ZXIgYXZhaWxhYmxlIVxuIik7CisJCWdvdG8gZmFpbGVkX2RkYzsKKwl9CisJcHNiX2ludGVsX291 dHB1dC0+aGRtaV9pMmNfYWRhcHRlciA9CisJCQkJJihwc2JfaW50ZWxfb3V0cHV0LT5kZGNfYnVz LT5hZGFwdGVyKTsKKwloZG1pX3ByaXYtPmRldiA9IGRldjsKKwlkcm1fc3lzZnNfY29ubmVjdG9y X2FkZChjb25uZWN0b3IpOworCXJldHVybjsKKworZmFpbGVkX2RkYzoKKwlkcm1fZW5jb2Rlcl9j bGVhbnVwKCZwc2JfaW50ZWxfb3V0cHV0LT5lbmMpOworCWRybV9jb25uZWN0b3JfY2xlYW51cCgm cHNiX2ludGVsX291dHB1dC0+YmFzZSk7CisJa2ZyZWUocHNiX2ludGVsX291dHB1dCk7Cit9CmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9sdmRzLmMgYi9kcml2 ZXJzL2dwdS9kcm0vZ21hNTAwL2Nkdl9pbnRlbF9sdmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMC4uOTg4YjJkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2Ry bS9nbWE1MDAvY2R2X2ludGVsX2x2ZHMuYwpAQCAtMCwwICsxLDcyMSBAQAorLyoKKyAqIENvcHly aWdodCDCqSAyMDA2LTIwMTEgSW50ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBp dAorICogdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiwgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGlu IHRoZSBob3BlIGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAorICogQU5ZIFdBUlJBTlRZ OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9y CisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UgZm9yCisgKiBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3Vs ZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YWxvbmcgd2l0aAorICogdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdCAtIEZpZnRoIEZsb29y LCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqIEF1dGhvcnM6CisgKglFcmljIEFu aG9sdCA8ZXJpY0BhbmhvbHQubmV0PgorICoJRGF2ZSBBaXJsaWUgPGFpcmxpZWRAbGludXguaWU+ CisgKglKZXNzZSBCYXJuZXMgPGplc3NlLmJhcm5lc0BpbnRlbC5jb20+CisgKi8KKworI2luY2x1 ZGUgPGxpbnV4L2kyYy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtaS5oPgorI2luY2x1ZGUgPGRybS9k cm1QLmg+CisKKyNpbmNsdWRlICJpbnRlbF9iaW9zLmgiCisjaW5jbHVkZSAicHNiX2Rydi5oIgor I2luY2x1ZGUgInBzYl9pbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJwc2JfaW50ZWxfcmVnLmgiCisj aW5jbHVkZSAicG93ZXIuaCIKKyNpbmNsdWRlIDxsaW51eC9wbV9ydW50aW1lLmg+CisjaW5jbHVk ZSAiY2R2X2RldmljZS5oIgorCisvKioKKyAqIExWRFMgSTJDIGJhY2tsaWdodCBjb250cm9sIG1h Y3JvcworICovCisjZGVmaW5lIEJSSUdIVE5FU1NfTUFYX0xFVkVMIDEwMAorI2RlZmluZSBCUklH SFRORVNTX01BU0sgMHhGRgorI2RlZmluZSBCTENfSTJDX1RZUEUJMHgwMQorI2RlZmluZSBCTENf UFdNX1RZUFQJMHgwMgorCisjZGVmaW5lIEJMQ19QT0xBUklUWV9OT1JNQUwgMAorI2RlZmluZSBC TENfUE9MQVJJVFlfSU5WRVJTRSAxCisKKyNkZWZpbmUgUFNCX0JMQ19NQVhfUFdNX1JFR19GUkVR ICAgICAgICgweEZGRkUpCisjZGVmaW5lIFBTQl9CTENfTUlOX1BXTV9SRUdfRlJFUQkoMHgyKQor I2RlZmluZSBQU0JfQkxDX1BXTV9QUkVDSVNJT05fRkFDVE9SCSgxMCkKKyNkZWZpbmUgUFNCX0JB Q0tMSUdIVF9QV01fQ1RMX1NISUZUCSgxNikKKyNkZWZpbmUgUFNCX0JBQ0tMSUdIVF9QV01fUE9M QVJJVFlfQklUX0NMRUFSICgweEZGRkUpCisKK3N0cnVjdCBjZHZfaW50ZWxfbHZkc19wcml2IHsK KwkvKioKKwkgKiBTYXZlZCBMVkRPIG91dHB1dCBzdGF0ZXMKKwkgKi8KKwl1aW50MzJfdCBzYXZl UFBfT047CisJdWludDMyX3Qgc2F2ZVBQX09GRjsKKwl1aW50MzJfdCBzYXZlTFZEUzsKKwl1aW50 MzJfdCBzYXZlUFBfQ09OVFJPTDsKKwl1aW50MzJfdCBzYXZlUFBfQ1lDTEU7CisJdWludDMyX3Qg c2F2ZVBGSVRfQ09OVFJPTDsKKwl1aW50MzJfdCBzYXZlUEZJVF9QR01fUkFUSU9TOworCXVpbnQz Ml90IHNhdmVCTENfUFdNX0NUTDsKK307CisKKy8qCisgKiBSZXR1cm5zIHRoZSBtYXhpbXVtIGxl dmVsIG9mIHRoZSBiYWNrbGlnaHQgZHV0eSBjeWNsZSBmaWVsZC4KKyAqLworc3RhdGljIHUzMiBj ZHZfaW50ZWxfbHZkc19nZXRfbWF4X2JhY2tsaWdodChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQor eworCXN0cnVjdCBkcm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsK Kwl1MzIgcmV0dmFsOworCisJaWYgKGdtYV9wb3dlcl9iZWdpbihkZXYsIGZhbHNlKSkgeworCQly ZXR2YWwgPSAoKFJFR19SRUFEKEJMQ19QV01fQ1RMKSAmCisJCQkgIEJBQ0tMSUdIVF9NT0RVTEFU SU9OX0ZSRVFfTUFTSykgPj4KKwkJCSAgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9TSElGVCkg KiAyOworCisJCWdtYV9wb3dlcl9lbmQoZGV2KTsKKwl9IGVsc2UKKwkJcmV0dmFsID0gKChkZXZf cHJpdi0+c2F2ZUJMQ19QV01fQ1RMICYKKwkJCSAgQkFDS0xJR0hUX01PRFVMQVRJT05fRlJFUV9N QVNLKSA+PgorCQkJICBCQUNLTElHSFRfTU9EVUxBVElPTl9GUkVRX1NISUZUKSAqIDI7CisKKwly ZXR1cm4gcmV0dmFsOworfQorCisvKgorICogU2V0IExWRFMgYmFja2xpZ2h0IGxldmVsIGJ5IEky QyBjb21tYW5kCisgKi8KK3N0YXRpYyBpbnQgY2R2X2x2ZHNfaTJjX3NldF9icmlnaHRuZXNzKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCQkJCXVuc2lnbmVkIGludCBsZXZlbCkKK3sKKwlzdHJ1 Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJc3RydWN0 IHBzYl9pbnRlbF9pMmNfY2hhbiAqbHZkc19pMmNfYnVzID0gZGV2X3ByaXYtPmx2ZHNfaTJjX2J1 czsKKwl1OCBvdXRfYnVmWzJdOworCXVuc2lnbmVkIGludCBibGNfaTJjX2JyaWdodG5lc3M7CisK KwlzdHJ1Y3QgaTJjX21zZyBtc2dzW10gPSB7CisJCXsKKwkJCS5hZGRyID0gbHZkc19pMmNfYnVz LT5zbGF2ZV9hZGRyLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gPSAyLAorCQkJLmJ1ZiA9IG91 dF9idWYsCisJCX0KKwl9OworCisJYmxjX2kyY19icmlnaHRuZXNzID0gQlJJR0hUTkVTU19NQVNL ICYgKCh1bnNpZ25lZCBpbnQpbGV2ZWwgKgorCQkJICAgICBCUklHSFRORVNTX01BU0sgLworCQkJ ICAgICBCUklHSFRORVNTX01BWF9MRVZFTCk7CisKKwlpZiAoZGV2X3ByaXYtPmx2ZHNfYmwtPnBv bCA9PSBCTENfUE9MQVJJVFlfSU5WRVJTRSkKKwkJYmxjX2kyY19icmlnaHRuZXNzID0gQlJJR0hU TkVTU19NQVNLIC0gYmxjX2kyY19icmlnaHRuZXNzOworCisJb3V0X2J1ZlswXSA9IGRldl9wcml2 LT5sdmRzX2JsLT5icmlnaHRuZXNzY21kOworCW91dF9idWZbMV0gPSAodTgpYmxjX2kyY19icmln aHRuZXNzOworCisJaWYgKGkyY190cmFuc2ZlcigmbHZkc19pMmNfYnVzLT5hZGFwdGVyLCBtc2dz LCAxKSA9PSAxKQorCQlyZXR1cm4gMDsKKworCURSTV9FUlJPUigiSTJDIHRyYW5zZmVyIGVycm9y XG4iKTsKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBjZHZfbHZkc19wd21fc2V0X2Jy aWdodG5lc3Moc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGxldmVsKQoreworCXN0cnVjdCBk cm1fcHNiX3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKKworCXUzMiBtYXhf cHdtX2JsYzsKKwl1MzIgYmxjX3B3bV9kdXR5X2N5Y2xlOworCisJbWF4X3B3bV9ibGMgPSBjZHZf aW50ZWxfbHZkc19nZXRfbWF4X2JhY2tsaWdodChkZXYpOworCisJLypCTENfUFdNX0NUTCBTaG91 bGQgYmUgaW5pdGlhdGVkIHdoaWxlIGJhY2tsaWdodCBkZXZpY2UgaW5pdCovCisJQlVHX09OKCht YXhfcHdtX2JsYyAmIFBTQl9CTENfTUFYX1BXTV9SRUdfRlJFUSkgPT0gMCk7CisKKwlibGNfcHdt X2R1dHlfY3ljbGUgPSBsZXZlbCAqIG1heF9wd21fYmxjIC8gQlJJR0hUTkVTU19NQVhfTEVWRUw7 CisKKwlpZiAoZGV2X3ByaXYtPmx2ZHNfYmwtPnBvbCA9PSBCTENfUE9MQVJJVFlfSU5WRVJTRSkK KwkJYmxjX3B3bV9kdXR5X2N5Y2xlID0gbWF4X3B3bV9ibGMgLSBibGNfcHdtX2R1dHlfY3ljbGU7 CisKKwlibGNfcHdtX2R1dHlfY3ljbGUgJj0gUFNCX0JBQ0tMSUdIVF9QV01fUE9MQVJJVFlfQklU X0NMRUFSOworCVJFR19XUklURShCTENfUFdNX0NUTCwKKwkJICAobWF4X3B3bV9ibGMgPDwgUFNC X0JBQ0tMSUdIVF9QV01fQ1RMX1NISUZUKSB8CisJCSAgKGJsY19wd21fZHV0eV9jeWNsZSkpOwor CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXQgTFZEUyBiYWNrbGlnaHQgbGV2ZWwgZWl0aGVy IGJ5IEkyQyBvciBQV00KKyAqLwordm9pZCBjZHZfaW50ZWxfbHZkc19zZXRfYnJpZ2h0bmVzcyhz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgbGV2ZWwpCit7CisJc3RydWN0IGRybV9wc2JfcHJp dmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOworCisJaWYgKCFkZXZfcHJpdi0+bHZk c19ibCkgeworCQlEUk1fRVJST1IoIk5PIExWRFMgQmFja2xpZ2h0IEluZm9cbiIpOworCQlyZXR1 cm47CisJfQorCisJaWYgKGRldl9wcml2LT5sdmRzX2JsLT50eXBlID09IEJMQ19JMkNfVFlQRSkK KwkJY2R2X2x2ZHNfaTJjX3NldF9icmlnaHRuZXNzKGRldiwgbGV2ZWwpOworCWVsc2UKKwkJY2R2 X2x2ZHNfcHdtX3NldF9icmlnaHRuZXNzKGRldiwgbGV2ZWwpOworfQorCisvKioKKyAqIFNldHMg dGhlIGJhY2tsaWdodCBsZXZlbC4KKyAqCisgKiBsZXZlbCBiYWNrbGlnaHQgbGV2ZWwsIGZyb20g MCB0byBjZHZfaW50ZWxfbHZkc19nZXRfbWF4X2JhY2tsaWdodCgpLgorICovCitzdGF0aWMgdm9p ZCBjZHZfaW50ZWxfbHZkc19zZXRfYmFja2xpZ2h0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGlu dCBsZXZlbCkKK3sKKwlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2 X3ByaXZhdGU7CisJdTMyIGJsY19wd21fY3RsOworCisJaWYgKGdtYV9wb3dlcl9iZWdpbihkZXYs IGZhbHNlKSkgeworCQlibGNfcHdtX2N0bCA9CisJCQlSRUdfUkVBRChCTENfUFdNX0NUTCkgJiB+ QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFTSzsKKwkJUkVHX1dSSVRFKEJMQ19QV01fQ1RMLAorCQkJ CShibGNfcHdtX2N0bCB8CisJCQkJKGxldmVsIDw8IEJBQ0tMSUdIVF9EVVRZX0NZQ0xFX1NISUZU KSkpOworCQlnbWFfcG93ZXJfZW5kKGRldik7CisJfSBlbHNlIHsKKwkJYmxjX3B3bV9jdGwgPSBk ZXZfcHJpdi0+c2F2ZUJMQ19QV01fQ1RMICYKKwkJCQl+QkFDS0xJR0hUX0RVVFlfQ1lDTEVfTUFT SzsKKwkJZGV2X3ByaXYtPnNhdmVCTENfUFdNX0NUTCA9IChibGNfcHdtX2N0bCB8CisJCQkJCShs ZXZlbCA8PCBCQUNLTElHSFRfRFVUWV9DWUNMRV9TSElGVCkpOworCX0KK30KKworLyoqCisgKiBT ZXRzIHRoZSBwb3dlciBzdGF0ZSBmb3IgdGhlIHBhbmVsLgorICovCitzdGF0aWMgdm9pZCBjZHZf aW50ZWxfbHZkc19zZXRfcG93ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkgc3RydWN0 IHBzYl9pbnRlbF9vdXRwdXQgKm91dHB1dCwgYm9vbCBvbikKK3sKKwl1MzIgcHBfc3RhdHVzOwor CisJaWYgKCFnbWFfcG93ZXJfYmVnaW4oZGV2LCB0cnVlKSkKKwkJcmV0dXJuOworCisJaWYgKG9u KSB7CisJCVJFR19XUklURShQUF9DT05UUk9MLCBSRUdfUkVBRChQUF9DT05UUk9MKSB8CisJCQkg IFBPV0VSX1RBUkdFVF9PTik7CisJCWRvIHsKKwkJCXBwX3N0YXR1cyA9IFJFR19SRUFEKFBQX1NU QVRVUyk7CisJCX0gd2hpbGUgKChwcF9zdGF0dXMgJiBQUF9PTikgPT0gMCk7CisKKwkJY2R2X2lu dGVsX2x2ZHNfc2V0X2JhY2tsaWdodChkZXYsCisJCQkJCSBvdXRwdXQtPgorCQkJCQkgbW9kZV9k ZXYtPmJhY2tsaWdodF9kdXR5X2N5Y2xlKTsKKwl9IGVsc2UgeworCQljZHZfaW50ZWxfbHZkc19z ZXRfYmFja2xpZ2h0KGRldiwgMCk7CisKKwkJUkVHX1dSSVRFKFBQX0NPTlRST0wsIFJFR19SRUFE KFBQX0NPTlRST0wpICYKKwkJCSAgflBPV0VSX1RBUkdFVF9PTik7CisJCWRvIHsKKwkJCXBwX3N0 YXR1cyA9IFJFR19SRUFEKFBQX1NUQVRVUyk7CisJCX0gd2hpbGUgKHBwX3N0YXR1cyAmIFBQX09O KTsKKwl9CisJZ21hX3Bvd2VyX2VuZChkZXYpOworfQorCitzdGF0aWMgdm9pZCBjZHZfaW50ZWxf bHZkc19lbmNvZGVyX2RwbXMoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyLCBpbnQgbW9kZSkK K3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBwc2Jf aW50ZWxfb3V0cHV0ICpvdXRwdXQgPSBlbmNfdG9fcHNiX2ludGVsX291dHB1dChlbmNvZGVyKTsK KwlpZiAobW9kZSA9PSBEUk1fTU9ERV9EUE1TX09OKQorCQljZHZfaW50ZWxfbHZkc19zZXRfcG93 ZXIoZGV2LCBvdXRwdXQsIHRydWUpOworCWVsc2UKKwkJY2R2X2ludGVsX2x2ZHNfc2V0X3Bvd2Vy KGRldiwgb3V0cHV0LCBmYWxzZSk7CisJLyogWFhYOiBXZSBuZXZlciBwb3dlciBkb3duIHRoZSBM VkRTIHBhaXJzLiAqLworfQorCitzdGF0aWMgdm9pZCBjZHZfaW50ZWxfbHZkc19zYXZlKHN0cnVj dCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCit7Cit9CisKK3N0YXRpYyB2b2lkIGNkdl9pbnRl bF9sdmRzX3Jlc3RvcmUoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKK30KKwor aW50IGNkdl9pbnRlbF9sdmRzX21vZGVfdmFsaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5l Y3RvciwKKwkJCQkgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUpCit7CisJc3RydWN0IHBz Yl9pbnRlbF9vdXRwdXQgKnBzYl9pbnRlbF9vdXRwdXQgPQorCQkJCXRvX3BzYl9pbnRlbF9vdXRw dXQoY29ubmVjdG9yKTsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqZml4ZWRfbW9kZSA9CisJ ICAgIHBzYl9pbnRlbF9vdXRwdXQtPm1vZGVfZGV2LT5wYW5lbF9maXhlZF9tb2RlOworCisJLyog anVzdCBpbiBjYXNlICovCisJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19EQkxTQ0FO KQorCQlyZXR1cm4gTU9ERV9OT19EQkxFU0NBTjsKKworCS8qIGp1c3QgaW4gY2FzZSAqLworCWlm IChtb2RlLT5mbGFncyAmIERSTV9NT0RFX0ZMQUdfSU5URVJMQUNFKQorCQlyZXR1cm4gTU9ERV9O T19JTlRFUkxBQ0U7CisKKwlpZiAoZml4ZWRfbW9kZSkgeworCQlpZiAobW9kZS0+aGRpc3BsYXkg PiBmaXhlZF9tb2RlLT5oZGlzcGxheSkKKwkJCXJldHVybiBNT0RFX1BBTkVMOworCQlpZiAobW9k ZS0+dmRpc3BsYXkgPiBmaXhlZF9tb2RlLT52ZGlzcGxheSkKKwkJCXJldHVybiBNT0RFX1BBTkVM OworCX0KKwlyZXR1cm4gTU9ERV9PSzsKK30KKworYm9vbCBjZHZfaW50ZWxfbHZkc19tb2RlX2Zp eHVwKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlciwKKwkJCQkgIHN0cnVjdCBkcm1fZGlzcGxh eV9tb2RlICptb2RlLAorCQkJCSAgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21v ZGUpCit7CisJc3RydWN0IHBzYl9pbnRlbF9tb2RlX2RldmljZSAqbW9kZV9kZXYgPQorCSAgICBl bmNfdG9fcHNiX2ludGVsX291dHB1dChlbmNvZGVyKS0+bW9kZV9kZXY7CisJc3RydWN0IGRybV9k ZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX2VuY29kZXIgKnRtcF9lbmNv ZGVyOworCXN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICpwYW5lbF9maXhlZF9tb2RlID0gbW9kZV9k ZXYtPnBhbmVsX2ZpeGVkX21vZGU7CisKKwkvKiBTaG91bGQgbmV2ZXIgaGFwcGVuISEgKi8KKwls aXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9lbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVy X2xpc3QsCisJCQkgICAgaGVhZCkgeworCQlpZiAodG1wX2VuY29kZXIgIT0gZW5jb2RlcgorCQkg ICAgJiYgdG1wX2VuY29kZXItPmNydGMgPT0gZW5jb2Rlci0+Y3J0YykgeworCQkJcHJpbnRrKEtF Uk5fRVJSICJDYW4ndCBlbmFibGUgTFZEUyBhbmQgYW5vdGhlciAiCisJCQkgICAgICAgImVuY29k ZXIgb24gdGhlIHNhbWUgcGlwZVxuIik7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CisKKwkv KgorCSAqIElmIHdlIGhhdmUgdGltaW5ncyBmcm9tIHRoZSBCSU9TIGZvciB0aGUgcGFuZWwsIHB1 dCB0aGVtIGluCisJICogdG8gdGhlIGFkanVzdGVkIG1vZGUuICBUaGUgQ1JUQyB3aWxsIGJlIHNl dCB1cCBmb3IgdGhpcyBtb2RlLAorCSAqIHdpdGggdGhlIHBhbmVsIHNjYWxpbmcgc2V0IHVwIHRv IHNvdXJjZSBmcm9tIHRoZSBIL1ZEaXNwbGF5CisJICogb2YgdGhlIG9yaWdpbmFsIG1vZGUuCisJ ICovCisJaWYgKHBhbmVsX2ZpeGVkX21vZGUgIT0gTlVMTCkgeworCQlhZGp1c3RlZF9tb2RlLT5o ZGlzcGxheSA9IHBhbmVsX2ZpeGVkX21vZGUtPmhkaXNwbGF5OworCQlhZGp1c3RlZF9tb2RlLT5o c3luY19zdGFydCA9IHBhbmVsX2ZpeGVkX21vZGUtPmhzeW5jX3N0YXJ0OworCQlhZGp1c3RlZF9t b2RlLT5oc3luY19lbmQgPSBwYW5lbF9maXhlZF9tb2RlLT5oc3luY19lbmQ7CisJCWFkanVzdGVk X21vZGUtPmh0b3RhbCA9IHBhbmVsX2ZpeGVkX21vZGUtPmh0b3RhbDsKKwkJYWRqdXN0ZWRfbW9k ZS0+dmRpc3BsYXkgPSBwYW5lbF9maXhlZF9tb2RlLT52ZGlzcGxheTsKKwkJYWRqdXN0ZWRfbW9k ZS0+dnN5bmNfc3RhcnQgPSBwYW5lbF9maXhlZF9tb2RlLT52c3luY19zdGFydDsKKwkJYWRqdXN0 ZWRfbW9kZS0+dnN5bmNfZW5kID0gcGFuZWxfZml4ZWRfbW9kZS0+dnN5bmNfZW5kOworCQlhZGp1 c3RlZF9tb2RlLT52dG90YWwgPSBwYW5lbF9maXhlZF9tb2RlLT52dG90YWw7CisJCWFkanVzdGVk X21vZGUtPmNsb2NrID0gcGFuZWxfZml4ZWRfbW9kZS0+Y2xvY2s7CisJCWRybV9tb2RlX3NldF9j cnRjaW5mbyhhZGp1c3RlZF9tb2RlLAorCQkJCSAgICAgIENSVENfSU5URVJMQUNFX0hBTFZFX1Yp OworCX0KKworCS8qCisJICogWFhYOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHN1cHBvcnQgbG93ZXIg cmVmcmVzaCByYXRlcyBvbiB0aGUKKwkgKiBwYW5lbHMgdG8gcmVkdWNlIHBvd2VyIGNvbnN1bXB0 aW9uLCBhbmQgcGVyaGFwcyBtYXRjaCB0aGUKKwkgKiB1c2VyJ3MgcmVxdWVzdGVkIHJlZnJlc2gg cmF0ZS4KKwkgKi8KKworCXJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBjZHZfaW50ZWxf bHZkc19wcmVwYXJlKHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikKK3sKKwlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gZW5jb2Rlci0+ZGV2OworCXN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0ICpv dXRwdXQgPSBlbmNfdG9fcHNiX2ludGVsX291dHB1dChlbmNvZGVyKTsKKwlzdHJ1Y3QgcHNiX2lu dGVsX21vZGVfZGV2aWNlICptb2RlX2RldiA9IG91dHB1dC0+bW9kZV9kZXY7CisKKwlpZiAoIWdt YV9wb3dlcl9iZWdpbihkZXYsIHRydWUpKQorCQlyZXR1cm47CisKKwltb2RlX2Rldi0+c2F2ZUJM Q19QV01fQ1RMID0gUkVHX1JFQUQoQkxDX1BXTV9DVEwpOworCW1vZGVfZGV2LT5iYWNrbGlnaHRf ZHV0eV9jeWNsZSA9IChtb2RlX2Rldi0+c2F2ZUJMQ19QV01fQ1RMICYKKwkJCQkJICBCQUNLTElH SFRfRFVUWV9DWUNMRV9NQVNLKTsKKworCWNkdl9pbnRlbF9sdmRzX3NldF9wb3dlcihkZXYsIG91 dHB1dCwgZmFsc2UpOworCisJZ21hX3Bvd2VyX2VuZChkZXYpOworfQorCitzdGF0aWMgdm9pZCBj ZHZfaW50ZWxfbHZkc19jb21taXQoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQoreworCXN0 cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBlbmNvZGVyLT5kZXY7CisJc3RydWN0IHBzYl9pbnRlbF9v dXRwdXQgKm91dHB1dCA9IGVuY190b19wc2JfaW50ZWxfb3V0cHV0KGVuY29kZXIpOworCXN0cnVj dCBwc2JfaW50ZWxfbW9kZV9kZXZpY2UgKm1vZGVfZGV2ID0gb3V0cHV0LT5tb2RlX2RldjsKKwor CWlmIChtb2RlX2Rldi0+YmFja2xpZ2h0X2R1dHlfY3ljbGUgPT0gMCkKKwkJbW9kZV9kZXYtPmJh Y2tsaWdodF9kdXR5X2N5Y2xlID0KKwkJICAgIGNkdl9pbnRlbF9sdmRzX2dldF9tYXhfYmFja2xp Z2h0KGRldik7CisKKwljZHZfaW50ZWxfbHZkc19zZXRfcG93ZXIoZGV2LCBvdXRwdXQsIHRydWUp OworfQorCitzdGF0aWMgdm9pZCBjZHZfaW50ZWxfbHZkc19tb2RlX3NldChzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIsCisJCQkJc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUsCisJCQkJ c3RydWN0IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCit7CisJc3RydWN0IGRybV9k ZXZpY2UgKmRldiA9IGVuY29kZXItPmRldjsKKwlzdHJ1Y3QgZHJtX3BzYl9wcml2YXRlICpkZXZf cHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CisJdTMyIHBmaXRfY29udHJvbDsKKworCS8qCisJICog VGhlIExWRFMgcGluIHBhaXIgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiB0dXJuZWQgb24gaW4gdGhl CisJICogY2R2X2ludGVsX2NydGNfbW9kZV9zZXQgc2luY2UgaXQgaGFzIGEgbGFyZ2UgaW1wYWN0 IG9uIHRoZSBEUExMCisJICogc2V0dGluZ3MuCisJICovCisKKwkvKgorCSAqIEVuYWJsZSBhdXRv bWF0aWMgcGFuZWwgc2NhbGluZyBzbyB0aGF0IG5vbi1uYXRpdmUgbW9kZXMgZmlsbCB0aGUKKwkg KiBzY3JlZW4uICBTaG91bGQgYmUgZW5hYmxlZCBiZWZvcmUgdGhlIHBpcGUgaXMgZW5hYmxlZCwg YWNjb3JkaW5nIHRvCisJICogcmVnaXN0ZXIgZGVzY3JpcHRpb24gYW5kIFBSTS4KKwkgKi8KKwlp ZiAobW9kZS0+aGRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+aGRpc3BsYXkgfHwKKwkgICAgbW9k ZS0+dmRpc3BsYXkgIT0gYWRqdXN0ZWRfbW9kZS0+dmRpc3BsYXkpCisJCXBmaXRfY29udHJvbCA9 IChQRklUX0VOQUJMRSB8IFZFUlRfQVVUT19TQ0FMRSB8CisJCQkJSE9SSVpfQVVUT19TQ0FMRSB8 IFZFUlRfSU5URVJQX0JJTElORUFSIHwKKwkJCQlIT1JJWl9JTlRFUlBfQklMSU5FQVIpOworCWVs c2UKKwkJcGZpdF9jb250cm9sID0gMDsKKworCWlmIChkZXZfcHJpdi0+bHZkc19kaXRoZXIpCisJ CXBmaXRfY29udHJvbCB8PSBQQU5FTF84VE82X0RJVEhFUl9FTkFCTEU7CisKKwlSRUdfV1JJVEUo UEZJVF9DT05UUk9MLCBwZml0X2NvbnRyb2wpOworfQorCisvKioKKyAqIERldGVjdCB0aGUgTFZE UyBjb25uZWN0aW9uLgorICoKKyAqIFRoaXMgYWx3YXlzIHJldHVybnMgQ09OTkVDVE9SX1NUQVRV U19DT05ORUNURUQuCisgKiBUaGlzIGNvbm5lY3RvciBzaG91bGQgb25seSBoYXZlCisgKiBiZWVu IHNldCB1cCBpZiB0aGUgTFZEUyB3YXMgYWN0dWFsbHkgY29ubmVjdGVkIGFueXdheS4KKyAqLwor c3RhdGljIGVudW0gZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgY2R2X2ludGVsX2x2ZHNfZGV0ZWN0KAor CQkJCXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IsIGJvb2wgZm9yY2UpCit7CisJcmV0 dXJuIGNvbm5lY3Rvcl9zdGF0dXNfY29ubmVjdGVkOworfQorCisvKioKKyAqIFJldHVybiB0aGUg bGlzdCBvZiBEREMgbW9kZXMgaWYgYXZhaWxhYmxlLCBvciB0aGUgQklPUyBmaXhlZCBtb2RlIG90 aGVyd2lzZS4KKyAqLworc3RhdGljIGludCBjZHZfaW50ZWxfbHZkc19nZXRfbW9kZXMoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g Y29ubmVjdG9yLT5kZXY7CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKnBzYl9pbnRlbF9vdXRw dXQgPQorCQkJCQl0b19wc2JfaW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisJc3RydWN0IHBzYl9p bnRlbF9tb2RlX2RldmljZSAqbW9kZV9kZXYgPQorCQkJCQlwc2JfaW50ZWxfb3V0cHV0LT5tb2Rl X2RldjsKKwlpbnQgcmV0OworCisJcmV0ID0gcHNiX2ludGVsX2RkY19nZXRfbW9kZXMocHNiX2lu dGVsX291dHB1dCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogRGlkbid0IGdl dCBhbiBFRElELCBzbworCSAqIFNldCB3aWRlIHN5bmMgcmFuZ2VzIHNvIHdlIGdldCBhbGwgbW9k ZXMKKwkgKiBoYW5kZWQgdG8gdmFsaWRfbW9kZSBmb3IgY2hlY2tpbmcKKwkgKi8KKwljb25uZWN0 b3ItPmRpc3BsYXlfaW5mby5taW5fdmZyZXEgPSAwOworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZv Lm1heF92ZnJlcSA9IDIwMDsKKwljb25uZWN0b3ItPmRpc3BsYXlfaW5mby5taW5faGZyZXEgPSAw OworCWNvbm5lY3Rvci0+ZGlzcGxheV9pbmZvLm1heF9oZnJlcSA9IDIwMDsKKwlpZiAobW9kZV9k ZXYtPnBhbmVsX2ZpeGVkX21vZGUgIT0gTlVMTCkgeworCQlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9k ZSAqbW9kZSA9CisJCSAgICBkcm1fbW9kZV9kdXBsaWNhdGUoZGV2LCBtb2RlX2Rldi0+cGFuZWxf Zml4ZWRfbW9kZSk7CisJCWRybV9tb2RlX3Byb2JlZF9hZGQoY29ubmVjdG9yLCBtb2RlKTsKKwkJ cmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogY2R2X2ludGVsX2x2ZHNf ZGVzdHJveSAtIHVucmVnaXN0ZXIgYW5kIGZyZWUgTFZEUyBzdHJ1Y3R1cmVzCisgKiBAY29ubmVj dG9yOiBjb25uZWN0b3IgdG8gZnJlZQorICoKKyAqIFVucmVnaXN0ZXIgdGhlIEREQyBidXMgZm9y IHRoaXMgY29ubmVjdG9yIHRoZW4gZnJlZSB0aGUgZHJpdmVyIHByaXZhdGUKKyAqIHN0cnVjdHVy ZS4KKyAqLwordm9pZCBjZHZfaW50ZWxfbHZkc19kZXN0cm95KHN0cnVjdCBkcm1fY29ubmVjdG9y ICpjb25uZWN0b3IpCit7CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKnBzYl9pbnRlbF9vdXRw dXQgPQorCQkJCQl0b19wc2JfaW50ZWxfb3V0cHV0KGNvbm5lY3Rvcik7CisKKwlpZiAocHNiX2lu dGVsX291dHB1dC0+ZGRjX2J1cykKKwkJcHNiX2ludGVsX2kyY19kZXN0cm95KHBzYl9pbnRlbF9v dXRwdXQtPmRkY19idXMpOworCWRybV9zeXNmc19jb25uZWN0b3JfcmVtb3ZlKGNvbm5lY3Rvcik7 CisJZHJtX2Nvbm5lY3Rvcl9jbGVhbnVwKGNvbm5lY3Rvcik7CisJa2ZyZWUoY29ubmVjdG9yKTsK K30KKworaW50IGNkdl9pbnRlbF9sdmRzX3NldF9wcm9wZXJ0eShzdHJ1Y3QgZHJtX2Nvbm5lY3Rv ciAqY29ubmVjdG9yLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX3Byb3BlcnR5ICpwcm9wZXJ0eSwK KwkJCQkgICAgICAgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IGRybV9lbmNvZGVyICplbmNv ZGVyID0gY29ubmVjdG9yLT5lbmNvZGVyOworCisJaWYgKCFzdHJjbXAocHJvcGVydHktPm5hbWUs ICJzY2FsaW5nIG1vZGUiKSAmJiBlbmNvZGVyKSB7CisJCXN0cnVjdCBwc2JfaW50ZWxfY3J0YyAq Y3J0YyA9CisJCQkJCXRvX3BzYl9pbnRlbF9jcnRjKGVuY29kZXItPmNydGMpOworCQl1aW50NjRf dCBjdXJWYWx1ZTsKKworCQlpZiAoIWNydGMpCisJCQlyZXR1cm4gLTE7CisKKwkJc3dpdGNoICh2 YWx1ZSkgeworCQljYXNlIERSTV9NT0RFX1NDQUxFX0ZVTExTQ1JFRU46CisJCQlicmVhazsKKwkJ Y2FzZSBEUk1fTU9ERV9TQ0FMRV9OT19TQ0FMRToKKwkJCWJyZWFrOworCQljYXNlIERSTV9NT0RF X1NDQUxFX0FTUEVDVDoKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC0xOworCQl9 CisKKwkJaWYgKGRybV9jb25uZWN0b3JfcHJvcGVydHlfZ2V0X3ZhbHVlKGNvbm5lY3RvciwKKwkJ CQkJCSAgICAgcHJvcGVydHksCisJCQkJCQkgICAgICZjdXJWYWx1ZSkpCisJCQlyZXR1cm4gLTE7 CisKKwkJaWYgKGN1clZhbHVlID09IHZhbHVlKQorCQkJcmV0dXJuIDA7CisKKwkJaWYgKGRybV9j b25uZWN0b3JfcHJvcGVydHlfc2V0X3ZhbHVlKGNvbm5lY3RvciwKKwkJCQkJCQlwcm9wZXJ0eSwK KwkJCQkJCQl2YWx1ZSkpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKGNydGMtPnNhdmVkX21vZGUu aGRpc3BsYXkgIT0gMCAmJgorCQkgICAgY3J0Yy0+c2F2ZWRfbW9kZS52ZGlzcGxheSAhPSAwKSB7 CisJCQlpZiAoIWRybV9jcnRjX2hlbHBlcl9zZXRfbW9kZShlbmNvZGVyLT5jcnRjLAorCQkJCQkJ ICAgICAgJmNydGMtPnNhdmVkX21vZGUsCisJCQkJCQkgICAgICBlbmNvZGVyLT5jcnRjLT54LAor CQkJCQkJICAgICAgZW5jb2Rlci0+Y3J0Yy0+eSwKKwkJCQkJCSAgICAgIGVuY29kZXItPmNydGMt PmZiKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwl9IGVsc2UgaWYgKCFzdHJjbXAocHJvcGVydHkt Pm5hbWUsICJiYWNrbGlnaHQiKSAmJiBlbmNvZGVyKSB7CisJCWlmIChkcm1fY29ubmVjdG9yX3By b3BlcnR5X3NldF92YWx1ZShjb25uZWN0b3IsCisJCQkJCQkJcHJvcGVydHksCisJCQkJCQkJdmFs dWUpKQorCQkJcmV0dXJuIC0xOworCQllbHNlIHsKKyNpZmRlZiBDT05GSUdfQkFDS0xJR0hUX0NM QVNTX0RFVklDRQorCQkJc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQkJCQkJ ZW5jb2Rlci0+ZGV2LT5kZXZfcHJpdmF0ZTsKKwkJCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpi ZCA9CisJCQkJCQlkZXZfcHJpdi0+YmFja2xpZ2h0X2RldmljZTsKKwkJCWJkLT5wcm9wcy5icmln aHRuZXNzID0gdmFsdWU7CisJCQliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CisjZW5kaWYK KwkJfQorCX0gZWxzZSBpZiAoIXN0cmNtcChwcm9wZXJ0eS0+bmFtZSwgIkRQTVMiKSAmJiBlbmNv ZGVyKSB7CisJCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmhlbHBlcnMgPQorCQkJ CQllbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKKwkJaGVscGVycy0+ZHBtcyhlbmNvZGVyLCB2YWx1 ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9lbmNvZGVy X2hlbHBlcl9mdW5jcworCQkJCQljZHZfaW50ZWxfbHZkc19oZWxwZXJfZnVuY3MgPSB7CisJLmRw bXMgPSBjZHZfaW50ZWxfbHZkc19lbmNvZGVyX2RwbXMsCisJLm1vZGVfZml4dXAgPSBjZHZfaW50 ZWxfbHZkc19tb2RlX2ZpeHVwLAorCS5wcmVwYXJlID0gY2R2X2ludGVsX2x2ZHNfcHJlcGFyZSwK KwkubW9kZV9zZXQgPSBjZHZfaW50ZWxfbHZkc19tb2RlX3NldCwKKwkuY29tbWl0ID0gY2R2X2lu dGVsX2x2ZHNfY29tbWl0LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fY29ubmVjdG9y X2hlbHBlcl9mdW5jcworCQkJCWNkdl9pbnRlbF9sdmRzX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3Mg PSB7CisJLmdldF9tb2RlcyA9IGNkdl9pbnRlbF9sdmRzX2dldF9tb2RlcywKKwkubW9kZV92YWxp ZCA9IGNkdl9pbnRlbF9sdmRzX21vZGVfdmFsaWQsCisJLmJlc3RfZW5jb2RlciA9IHBzYl9pbnRl bF9iZXN0X2VuY29kZXIsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9jb25uZWN0b3Jf ZnVuY3MgY2R2X2ludGVsX2x2ZHNfY29ubmVjdG9yX2Z1bmNzID0geworCS5kcG1zID0gZHJtX2hl bHBlcl9jb25uZWN0b3JfZHBtcywKKwkuc2F2ZSA9IGNkdl9pbnRlbF9sdmRzX3NhdmUsCisJLnJl c3RvcmUgPSBjZHZfaW50ZWxfbHZkc19yZXN0b3JlLAorCS5kZXRlY3QgPSBjZHZfaW50ZWxfbHZk c19kZXRlY3QsCisJLmZpbGxfbW9kZXMgPSBkcm1faGVscGVyX3Byb2JlX3NpbmdsZV9jb25uZWN0 b3JfbW9kZXMsCisJLnNldF9wcm9wZXJ0eSA9IGNkdl9pbnRlbF9sdmRzX3NldF9wcm9wZXJ0eSwK KwkuZGVzdHJveSA9IGNkdl9pbnRlbF9sdmRzX2Rlc3Ryb3ksCit9OworCisKK3N0YXRpYyB2b2lk IGNkdl9pbnRlbF9sdmRzX2VuY19kZXN0cm95KHN0cnVjdCBkcm1fZW5jb2RlciAqZW5jb2RlcikK K3sKKwlkcm1fZW5jb2Rlcl9jbGVhbnVwKGVuY29kZXIpOworfQorCitjb25zdCBzdHJ1Y3QgZHJt X2VuY29kZXJfZnVuY3MgY2R2X2ludGVsX2x2ZHNfZW5jX2Z1bmNzID0geworCS5kZXN0cm95ID0g Y2R2X2ludGVsX2x2ZHNfZW5jX2Rlc3Ryb3ksCit9OworCisvKioKKyAqIGNkdl9pbnRlbF9sdmRz X2luaXQgLSBzZXR1cCBMVkRTIGNvbm5lY3RvcnMgb24gdGhpcyBkZXZpY2UKKyAqIEBkZXY6IGRy bSBkZXZpY2UKKyAqCisgKiBDcmVhdGUgdGhlIGNvbm5lY3RvciwgcmVnaXN0ZXIgdGhlIExWRFMg RERDIGJ1cywgYW5kIHRyeSB0byBmaWd1cmUgb3V0IHdoYXQKKyAqIG1vZGVzIHdlIGNhbiBkaXNw bGF5IG9uIHRoZSBMVkRTIHBhbmVsIChpZiBwcmVzZW50KS4KKyAqLwordm9pZCBjZHZfaW50ZWxf bHZkc19pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCSAgICAgc3RydWN0IHBzYl9pbnRl bF9tb2RlX2RldmljZSAqbW9kZV9kZXYpCit7CisJc3RydWN0IHBzYl9pbnRlbF9vdXRwdXQgKnBz Yl9pbnRlbF9vdXRwdXQ7CisJc3RydWN0IGNkdl9pbnRlbF9sdmRzX3ByaXYgKmx2ZHNfcHJpdjsK KwlzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yOworCXN0cnVjdCBkcm1fZW5jb2RlciAq ZW5jb2RlcjsKKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqc2NhbjsKKwlzdHJ1Y3QgZHJtX2Ny dGMgKmNydGM7CisJc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9w cml2YXRlOworCXUzMiBsdmRzOworCWludCBwaXBlOworCisJcHNiX2ludGVsX291dHB1dCA9IGt6 YWxsb2Moc2l6ZW9mKHN0cnVjdCBwc2JfaW50ZWxfb3V0cHV0KSArCisJCQlzaXplb2Yoc3RydWN0 IGNkdl9pbnRlbF9sdmRzX3ByaXYpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXBzYl9pbnRlbF9vdXRw dXQpCisJCXJldHVybjsKKworCWx2ZHNfcHJpdiA9IChzdHJ1Y3QgY2R2X2ludGVsX2x2ZHNfcHJp diAqKShwc2JfaW50ZWxfb3V0cHV0ICsgMSk7CisKKwlwc2JfaW50ZWxfb3V0cHV0LT5kZXZfcHJp diA9IGx2ZHNfcHJpdjsKKworCXBzYl9pbnRlbF9vdXRwdXQtPm1vZGVfZGV2ID0gbW9kZV9kZXY7 CisJY29ubmVjdG9yID0gJnBzYl9pbnRlbF9vdXRwdXQtPmJhc2U7CisJZW5jb2RlciA9ICZwc2Jf aW50ZWxfb3V0cHV0LT5lbmM7CisKKworCWRybV9jb25uZWN0b3JfaW5pdChkZXYsICZwc2JfaW50 ZWxfb3V0cHV0LT5iYXNlLAorCQkJICAgJmNkdl9pbnRlbF9sdmRzX2Nvbm5lY3Rvcl9mdW5jcywK KwkJCSAgIERSTV9NT0RFX0NPTk5FQ1RPUl9MVkRTKTsKKworCWRybV9lbmNvZGVyX2luaXQoZGV2 LCAmcHNiX2ludGVsX291dHB1dC0+ZW5jLAorCQkJICZjZHZfaW50ZWxfbHZkc19lbmNfZnVuY3Ms CisJCQkgRFJNX01PREVfRU5DT0RFUl9MVkRTKTsKKworCisJZHJtX21vZGVfY29ubmVjdG9yX2F0 dGFjaF9lbmNvZGVyKCZwc2JfaW50ZWxfb3V0cHV0LT5iYXNlLAorCQkJCQkgICZwc2JfaW50ZWxf b3V0cHV0LT5lbmMpOworCXBzYl9pbnRlbF9vdXRwdXQtPnR5cGUgPSBJTlRFTF9PVVRQVVRfTFZE UzsKKworCWRybV9lbmNvZGVyX2hlbHBlcl9hZGQoZW5jb2RlciwgJmNkdl9pbnRlbF9sdmRzX2hl bHBlcl9mdW5jcyk7CisJZHJtX2Nvbm5lY3Rvcl9oZWxwZXJfYWRkKGNvbm5lY3RvciwKKwkJCQkg JmNkdl9pbnRlbF9sdmRzX2Nvbm5lY3Rvcl9oZWxwZXJfZnVuY3MpOworCWNvbm5lY3Rvci0+ZGlz cGxheV9pbmZvLnN1YnBpeGVsX29yZGVyID0gU3ViUGl4ZWxIb3Jpem9udGFsUkdCOworCWNvbm5l Y3Rvci0+aW50ZXJsYWNlX2FsbG93ZWQgPSBmYWxzZTsKKwljb25uZWN0b3ItPmRvdWJsZXNjYW5f YWxsb3dlZCA9IGZhbHNlOworCisJLypBdHRhY2ggY29ubmVjdG9yIHByb3BlcnRpZXMqLworCWRy bV9jb25uZWN0b3JfYXR0YWNoX3Byb3BlcnR5KGNvbm5lY3RvciwKKwkJCQkgICAgICBkZXYtPm1v ZGVfY29uZmlnLnNjYWxpbmdfbW9kZV9wcm9wZXJ0eSwKKwkJCQkgICAgICBEUk1fTU9ERV9TQ0FM RV9GVUxMU0NSRUVOKTsKKwlkcm1fY29ubmVjdG9yX2F0dGFjaF9wcm9wZXJ0eShjb25uZWN0b3Is CisJCQkJICAgICAgZGV2X3ByaXYtPmJhY2tsaWdodF9wcm9wZXJ0eSwKKwkJCQkgICAgICBCUklH SFRORVNTX01BWF9MRVZFTCk7CisKKwkvKioKKwkgKiBTZXQgdXAgSTJDIGJ1cworCSAqIEZJWE1F OiBkaXN0cm95IGkyY19idXMgd2hlbiBleGl0CisJICovCisJcHNiX2ludGVsX291dHB1dC0+aTJj X2J1cyA9IHBzYl9pbnRlbF9pMmNfY3JlYXRlKGRldiwKKwkJCQkJCQkgR1BJT0IsCisJCQkJCQkJ ICJMVkRTQkxDX0IiKTsKKwlpZiAoIXBzYl9pbnRlbF9vdXRwdXQtPmkyY19idXMpIHsKKwkJZGV2 X3ByaW50ayhLRVJOX0VSUiwKKwkJCSZkZXYtPnBkZXYtPmRldiwgIkkyQyBidXMgcmVnaXN0cmF0 aW9uIGZhaWxlZC5cbiIpOworCQlnb3RvIGZhaWxlZF9ibGNfaTJjOworCX0KKwlwc2JfaW50ZWxf b3V0cHV0LT5pMmNfYnVzLT5zbGF2ZV9hZGRyID0gMHgyQzsKKwlkZXZfcHJpdi0+bHZkc19pMmNf YnVzID0gIHBzYl9pbnRlbF9vdXRwdXQtPmkyY19idXM7CisKKwkvKgorCSAqIExWRFMgZGlzY292 ZXJ5OgorCSAqIDEpIGNoZWNrIGZvciBFRElEIG9uIEREQworCSAqIDIpIGNoZWNrIGZvciBWQlQg ZGF0YQorCSAqIDMpIGNoZWNrIHRvIHNlZSBpZiBMVkRTIGlzIGFscmVhZHkgb24KKwkgKiAgICBp ZiBub25lIG9mIHRoZSBhYm92ZSwgbm8gcGFuZWwKKwkgKiA0KSBtYWtlIHN1cmUgbGlkIGlzIG9w ZW4KKwkgKiAgICBpZiBjbG9zZWQsIGFjdCBsaWtlIGl0J3Mgbm90IHRoZXJlIGZvciBub3cKKwkg Ki8KKworCS8qIFNldCB1cCB0aGUgRERDIGJ1cy4gKi8KKwlwc2JfaW50ZWxfb3V0cHV0LT5kZGNf YnVzID0gcHNiX2ludGVsX2kyY19jcmVhdGUoZGV2LAorCQkJCQkJCSBHUElPQywKKwkJCQkJCQkg IkxWRFNERENfQyIpOworCWlmICghcHNiX2ludGVsX291dHB1dC0+ZGRjX2J1cykgeworCQlkZXZf cHJpbnRrKEtFUk5fRVJSLCAmZGV2LT5wZGV2LT5kZXYsCisJCQkgICAiRERDIGJ1cyByZWdpc3Ry YXRpb24gIiAiZmFpbGVkLlxuIik7CisJCWdvdG8gZmFpbGVkX2RkYzsKKwl9CisKKwkvKgorCSAq IEF0dGVtcHQgdG8gZ2V0IHRoZSBmaXhlZCBwYW5lbCBtb2RlIGZyb20gRERDLiAgQXNzdW1lIHRo YXQgdGhlCisJICogcHJlZmVycmVkIG1vZGUgaXMgdGhlIHJpZ2h0IG9uZS4KKwkgKi8KKwlwc2Jf aW50ZWxfZGRjX2dldF9tb2Rlcyhwc2JfaW50ZWxfb3V0cHV0KTsKKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KHNjYW4sICZjb25uZWN0b3ItPnByb2JlZF9tb2RlcywgaGVhZCkgeworCQlpZiAoc2Nhbi0+ dHlwZSAmIERSTV9NT0RFX1RZUEVfUFJFRkVSUkVEKSB7CisJCQltb2RlX2Rldi0+cGFuZWxfZml4 ZWRfbW9kZSA9CisJCQkgICAgZHJtX21vZGVfZHVwbGljYXRlKGRldiwgc2Nhbik7CisJCQlnb3Rv IG91dDsJLyogRklYTUU6IGNoZWNrIGZvciBxdWlya3MgKi8KKwkJfQorCX0KKworCS8qIEZhaWxl ZCB0byBnZXQgRURJRCwgd2hhdCBhYm91dCBWQlQ/IGRvIHdlIG5lZWQgdGhpcz8qLworCWlmIChk ZXZfcHJpdi0+bGZwX2x2ZHNfdmJ0X21vZGUpIHsKKwkJbW9kZV9kZXYtPnBhbmVsX2ZpeGVkX21v ZGUgPQorCQkJZHJtX21vZGVfZHVwbGljYXRlKGRldiwgZGV2X3ByaXYtPmxmcF9sdmRzX3ZidF9t b2RlKTsKKwkJaWYgKG1vZGVfZGV2LT5wYW5lbF9maXhlZF9tb2RlKSB7CisJCQltb2RlX2Rldi0+ cGFuZWxfZml4ZWRfbW9kZS0+dHlwZSB8PQorCQkJCURSTV9NT0RFX1RZUEVfUFJFRkVSUkVEOwor CQkJZ290byBvdXQ7CS8qIEZJWE1FOiBjaGVjayBmb3IgcXVpcmtzICovCisJCX0KKwl9CisJLyoK KwkgKiBJZiB3ZSBkaWRuJ3QgZ2V0IEVESUQsIHRyeSBjaGVja2luZyBpZiB0aGUgcGFuZWwgaXMg YWxyZWFkeSB0dXJuZWQKKwkgKiBvbi4JSWYgc28sIGFzc3VtZSB0aGF0IHdoYXRldmVyIGlzIGN1 cnJlbnRseSBwcm9ncmFtbWVkIGlzIHRoZQorCSAqIGNvcnJlY3QgbW9kZS4KKwkgKi8KKwlsdmRz ID0gUkVHX1JFQUQoTFZEUyk7CisJcGlwZSA9IChsdmRzICYgTFZEU19QSVBFQl9TRUxFQ1QpID8g MSA6IDA7CisJY3J0YyA9IHBzYl9pbnRlbF9nZXRfY3J0Y19mcm9tX3BpcGUoZGV2LCBwaXBlKTsK KworCWlmIChjcnRjICYmIChsdmRzICYgTFZEU19QT1JUX0VOKSkgeworCQltb2RlX2Rldi0+cGFu ZWxfZml4ZWRfbW9kZSA9CisJCSAgICBjZHZfaW50ZWxfY3J0Y19tb2RlX2dldChkZXYsIGNydGMp OworCQlpZiAobW9kZV9kZXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJCW1vZGVfZGV2LT5wYW5l bF9maXhlZF9tb2RlLT50eXBlIHw9CisJCQkgICAgRFJNX01PREVfVFlQRV9QUkVGRVJSRUQ7CisJ CQlnb3RvIG91dDsJLyogRklYTUU6IGNoZWNrIGZvciBxdWlya3MgKi8KKwkJfQorCX0KKworCS8q IElmIHdlIHN0aWxsIGRvbid0IGhhdmUgYSBtb2RlIGFmdGVyIGFsbCB0aGF0LCBnaXZlIHVwLiAq LworCWlmICghbW9kZV9kZXYtPnBhbmVsX2ZpeGVkX21vZGUpIHsKKwkJRFJNX0RFQlVHCisJCQko IkZvdW5kIG5vIG1vZGVzIG9uIHRoZSBsdmRzLCBpZ25vcmluZyB0aGUgTFZEU1xuIik7CisJCWdv dG8gZmFpbGVkX2ZpbmQ7CisJfQorCitvdXQ6CisJZHJtX3N5c2ZzX2Nvbm5lY3Rvcl9hZGQoY29u bmVjdG9yKTsKKwlyZXR1cm47CisKK2ZhaWxlZF9maW5kOgorCXByaW50ayhLRVJOX0VSUiAiRmFp bGVkIGZpbmRcbiIpOworCWlmIChwc2JfaW50ZWxfb3V0cHV0LT5kZGNfYnVzKQorCQlwc2JfaW50 ZWxfaTJjX2Rlc3Ryb3kocHNiX2ludGVsX291dHB1dC0+ZGRjX2J1cyk7CitmYWlsZWRfZGRjOgor CXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIEREQ1xuIik7CisJaWYgKHBzYl9pbnRlbF9vdXRwdXQt PmkyY19idXMpCisJCXBzYl9pbnRlbF9pMmNfZGVzdHJveShwc2JfaW50ZWxfb3V0cHV0LT5pMmNf YnVzKTsKK2ZhaWxlZF9ibGNfaTJjOgorCXByaW50ayhLRVJOX0VSUiAiRmFpbGVkIEJMQ1xuIik7 CisJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKKwlkcm1fY29ubmVjdG9yX2NsZWFudXAo Y29ubmVjdG9yKTsKKwlrZnJlZShjb25uZWN0b3IpOworfQoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK