From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH] drm/amdgpu: remove old CI DPM implementation Date: Wed, 23 Jan 2019 14:05:25 -0500 Message-ID: <20190123190525.6288-1-alexander.deucher@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: amd-gfx-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "amd-gfx" To: amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Cc: Alex Deucher VGhlIHBvd2VyIHNtdTcgcG93ZXJwbGF5IGNvZGUgaXMgbXVjaCBtb3JlIHJvYnVzdCBhbmQgaGFz CmJlZW4gdGhlIGRlZmF1bHQgZm9yIGEgd2hpbGUgbm93LiAgUmVtb3ZlIHRoZSBvbGQgY29kZS4K ClNpZ25lZC1vZmYtYnk6IEFsZXggRGV1Y2hlciA8YWxleGFuZGVyLmRldWNoZXJAYW1kLmNvbT4K LS0tCiBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9NYWtlZmlsZSAgfCAgICAyICstCiBkcml2 ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaV9kcG0uYyAgfCA2ODQ0IC0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tCiBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaV9kcG0uaCAgfCAgMzQ5IC0t CiBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaV9zbWMuYyAgfCAgMjc5IC0tCiBkcml2ZXJz L2dwdS9kcm0vYW1kL2FtZGdwdS9jaWsuYyAgICAgfCAgIDEwICstCiBkcml2ZXJzL2dwdS9kcm0v YW1kL2FtZGdwdS9jaWtfZHBtLmggfCAgICAxIC0KIDYgZmlsZXMgY2hhbmdlZCwgMyBpbnNlcnRp b25zKCspLCA3NDgyIGRlbGV0aW9ucygtKQogZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1 L2RybS9hbWQvYW1kZ3B1L2NpX2RwbS5jCiBkZWxldGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUv ZHJtL2FtZC9hbWRncHUvY2lfZHBtLmgKIGRlbGV0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9k cm0vYW1kL2FtZGdwdS9jaV9zbWMuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvTWFrZWZpbGUKaW5k ZXggZjc2YmNiOWM0NWU0Li40NjZkYTU5NTRhNjggMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvYW1kZ3B1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L01h a2VmaWxlCkBAIC01Nyw3ICs1Nyw3IEBAIGFtZGdwdS15ICs9IGFtZGdwdV9kZXZpY2UubyBhbWRn cHVfa21zLm8gXAogCiAjIGFkZCBhc2ljIHNwZWNpZmljIGJsb2NrCiBhbWRncHUtJChDT05GSUdf RFJNX0FNREdQVV9DSUspKz0gY2lrLm8gY2lrX2loLm8ga3Zfc21jLm8ga3ZfZHBtLm8gXAotCWNp X3NtYy5vIGNpX2RwbS5vIGRjZV92OF8wLm8gZ2Z4X3Y3XzAubyBjaWtfc2RtYS5vIHV2ZF92NF8y Lm8gdmNlX3YyXzAubworCWRjZV92OF8wLm8gZ2Z4X3Y3XzAubyBjaWtfc2RtYS5vIHV2ZF92NF8y Lm8gdmNlX3YyXzAubwogCiBhbWRncHUtJChDT05GSUdfRFJNX0FNREdQVV9TSSkrPSBzaS5vIGdt Y192Nl8wLm8gZ2Z4X3Y2XzAubyBzaV9paC5vIHNpX2RtYS5vIGRjZV92Nl8wLm8gc2lfZHBtLm8g c2lfc21jLm8KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvY2lfZHBt LmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaV9kcG0uYwpkZWxldGVkIGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggODZlMTRjNzU0ZGQ0Li4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2FtZC9hbWRncHUvY2lfZHBtLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ODQ0ICswLDAg QEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0g KgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFu eSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2Np YXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGlu IHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1p dGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlz aCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUg U29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUg aXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u czoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9u IG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlh bCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAq IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E IE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09QWVJJR0hUIEhP TERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IK LSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRP UlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBU SEUgU09GVFdBUkUuCi0gKgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2lu Y2x1ZGUgPGRybS9kcm1QLmg+Ci0jaW5jbHVkZSAiYW1kZ3B1LmgiCi0jaW5jbHVkZSAiYW1kZ3B1 X3BtLmgiCi0jaW5jbHVkZSAiYW1kZ3B1X3Vjb2RlLmgiCi0jaW5jbHVkZSAiY2lrZC5oIgotI2lu Y2x1ZGUgImFtZGdwdV9kcG0uaCIKLSNpbmNsdWRlICJjaV9kcG0uaCIKLSNpbmNsdWRlICJnZnhf djdfMC5oIgotI2luY2x1ZGUgImF0b20uaCIKLSNpbmNsdWRlICJhbWRfcGNpZS5oIgotI2luY2x1 ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0KLSNpbmNsdWRlICJzbXUvc211XzdfMF8xX2QuaCIKLSNp bmNsdWRlICJzbXUvc211XzdfMF8xX3NoX21hc2suaCIKLQotI2luY2x1ZGUgImRjZS9kY2VfOF8w X2QuaCIKLSNpbmNsdWRlICJkY2UvZGNlXzhfMF9zaF9tYXNrLmgiCi0KLSNpbmNsdWRlICJiaWYv YmlmXzRfMV9kLmgiCi0jaW5jbHVkZSAiYmlmL2JpZl80XzFfc2hfbWFzay5oIgotCi0jaW5jbHVk ZSAiZ2NhL2dmeF83XzJfZC5oIgotI2luY2x1ZGUgImdjYS9nZnhfN18yX3NoX21hc2suaCIKLQot I2luY2x1ZGUgImdtYy9nbWNfN18xX2QuaCIKLSNpbmNsdWRlICJnbWMvZ21jXzdfMV9zaF9tYXNr LmgiCi0KLU1PRFVMRV9GSVJNV0FSRSgiYW1kZ3B1L2JvbmFpcmVfc21jLmJpbiIpOwotTU9EVUxF X0ZJUk1XQVJFKCJhbWRncHUvYm9uYWlyZV9rX3NtYy5iaW4iKTsKLU1PRFVMRV9GSVJNV0FSRSgi YW1kZ3B1L2hhd2FpaV9zbWMuYmluIik7Ci1NT0RVTEVfRklSTVdBUkUoImFtZGdwdS9oYXdhaWlf a19zbWMuYmluIik7Ci0KLSNkZWZpbmUgTUNfQ0dfQVJCX0ZSRVFfRjAgICAgICAgICAgIDB4MGEK LSNkZWZpbmUgTUNfQ0dfQVJCX0ZSRVFfRjEgICAgICAgICAgIDB4MGIKLSNkZWZpbmUgTUNfQ0df QVJCX0ZSRVFfRjIgICAgICAgICAgIDB4MGMKLSNkZWZpbmUgTUNfQ0dfQVJCX0ZSRVFfRjMgICAg ICAgICAgIDB4MGQKLQotI2RlZmluZSBTTUNfUkFNX0VORCAweDQwMDAwCi0KLSNkZWZpbmUgVk9M VEFHRV9TQ0FMRSAgICAgICAgICAgICAgIDQKLSNkZWZpbmUgVk9MVEFHRV9WSURfT0ZGU0VUX1ND QUxFMSAgICA2MjUKLSNkZWZpbmUgVk9MVEFHRV9WSURfT0ZGU0VUX1NDQUxFMiAgICAxMDAKLQot c3RhdGljIGNvbnN0IHN0cnVjdCBhbWRfcG1fZnVuY3MgY2lfZHBtX2Z1bmNzOwotCi1zdGF0aWMg Y29uc3Qgc3RydWN0IGNpX3B0X2RlZmF1bHRzIGRlZmF1bHRzX2hhd2FpaV94dCA9Ci17Ci0JMSwg MHhGLCAweEZELCAweDE5LCA1LCAweDE0LCAwLCAweEIwMDAwLAotCXsgMHgyRSwgIDB4MDAsICAw eDAwLCAgMHg4OCwgIDB4MDAsICAweDAwLCAgMHg3MiwgIDB4NjAsICAweDUxLCAgMHhBNywgIDB4 NzksICAweDZCLCAgMHg5MCwgIDB4QkQsICAweDc5ICB9LAotCXsgMHgyMTcsIDB4MjE3LCAweDIx NywgMHgyNDIsIDB4MjQyLCAweDI0MiwgMHgyNjksIDB4MjY5LCAweDI2OSwgMHgyQTEsIDB4MkEx LCAweDJBMSwgMHgyQzksIDB4MkM5LCAweDJDOSB9Ci19OwotCi1zdGF0aWMgY29uc3Qgc3RydWN0 IGNpX3B0X2RlZmF1bHRzIGRlZmF1bHRzX2hhd2FpaV9wcm8gPQotewotCTEsIDB4RiwgMHhGRCwg MHgxOSwgNSwgMHgxNCwgMCwgMHg2NTA2MiwKLQl7IDB4MkUsICAweDAwLCAgMHgwMCwgIDB4ODgs ICAweDAwLCAgMHgwMCwgIDB4NzIsICAweDYwLCAgMHg1MSwgIDB4QTcsICAweDc5LCAgMHg2Qiwg IDB4OTAsICAweEJELCAgMHg3OSAgfSwKLQl7IDB4MjE3LCAweDIxNywgMHgyMTcsIDB4MjQyLCAw eDI0MiwgMHgyNDIsIDB4MjY5LCAweDI2OSwgMHgyNjksIDB4MkExLCAweDJBMSwgMHgyQTEsIDB4 MkM5LCAweDJDOSwgMHgyQzkgfQotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBjaV9wdF9kZWZh dWx0cyBkZWZhdWx0c19ib25haXJlX3h0ID0KLXsKLQkxLCAweEYsIDB4RkQsIDB4MTksIDUsIDQ1 LCAwLCAweEIwMDAwLAotCXsgMHg3OSwgIDB4MjUzLCAweDI1RCwgMHhBRSwgIDB4NzIsICAweDgw LCAgMHg4MywgIDB4ODYsICAweDZGLCAgMHhDOCwgIDB4QzksICAweEM5LCAgMHgyRiwgIDB4NEQs ICAweDYxICB9LAotCXsgMHgxN0MsIDB4MTcyLCAweDE4MCwgMHgxQkMsIDB4MUIzLCAweDFCRCwg MHgyMDYsIDB4MjAwLCAweDIwMywgMHgyNUQsIDB4MjVBLCAweDI1NSwgMHgyQzMsIDB4MkM1LCAw eDJCNCB9Ci19OwotCi0jaWYgMAotc3RhdGljIGNvbnN0IHN0cnVjdCBjaV9wdF9kZWZhdWx0cyBk ZWZhdWx0c19ib25haXJlX3BybyA9Ci17Ci0JMSwgMHhGLCAweEZELCAweDE5LCA1LCA0NSwgMCwg MHg2NTA2MiwKLQl7IDB4OEMsICAweDIzRiwgMHgyNDQsIDB4QTYsICAweDgzLCAgMHg4NSwgIDB4 ODYsICAweDg2LCAgMHg4MywgIDB4REIsICAweERCLCAgMHhEQSwgIDB4NjcsICAweDYwLCAgMHg1 RiAgfSwKLQl7IDB4MTg3LCAweDE5MywgMHgxOTMsIDB4MUM3LCAweDFEMSwgMHgxRDEsIDB4MjEw LCAweDIxOSwgMHgyMTksIDB4MjY2LCAweDI2QywgMHgyNkMsIDB4MkM5LCAweDJDQiwgMHgyQ0Ig fQotfTsKLSNlbmRpZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNpX3B0X2RlZmF1bHRzIGRlZmF1 bHRzX3NhdHVybl94dCA9Ci17Ci0JMSwgMHhGLCAweEZELCAweDE5LCA1LCA1NSwgMCwgMHg3MDAw MCwKLQl7IDB4OEMsICAweDI0NywgMHgyNDksIDB4QTYsICAweDgwLCAgMHg4MSwgIDB4OEIsICAw eDg5LCAgMHg4NiwgIDB4QzksICAweENBLCAgMHhDOSwgIDB4NEQsICAweDRELCAgMHg0RCAgfSwK LQl7IDB4MTg3LCAweDE4NywgMHgxODcsIDB4MUM3LCAweDFDNywgMHgxQzcsIDB4MjEwLCAweDIx MCwgMHgyMTAsIDB4MjY2LCAweDI2NiwgMHgyNjYsIDB4MkM5LCAweDJDOSwgMHgyQzkgfQotfTsK LQotI2lmIDAKLXN0YXRpYyBjb25zdCBzdHJ1Y3QgY2lfcHRfZGVmYXVsdHMgZGVmYXVsdHNfc2F0 dXJuX3BybyA9Ci17Ci0JMSwgMHhGLCAweEZELCAweDE5LCA1LCA1NSwgMCwgMHgzMDAwMCwKLQl7 IDB4OTYsICAweDIxRCwgMHgyM0IsIDB4QTEsICAweDg1LCAgMHg4NywgIDB4ODMsICAweDg0LCAg MHg4MSwgIDB4RTYsICAweEU2LCAgMHhFNiwgIDB4NzEsICAweDZBLCAgMHg2QSAgfSwKLQl7IDB4 MTkzLCAweDE5RSwgMHgxOUUsIDB4MUQyLCAweDFEQywgMHgxREMsIDB4MjFBLCAweDIyMywgMHgy MjMsIDB4MjZFLCAweDI3RSwgMHgyNzQsIDB4MkNGLCAweDJEMiwgMHgyRDIgfQotfTsKLSNlbmRp ZgotCi1zdGF0aWMgY29uc3Qgc3RydWN0IGNpX3B0X2NvbmZpZ19yZWcgZGlkdF9jb25maWdfY2lb XSA9Ci17Ci0JeyAweDEwLCAweDAwMDAwMGZmLCAwLCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19E SURUX0lORCB9LAotCXsgMHgxMCwgMHgwMDAwZmYwMCwgOCwgMHgwLCBDSVNMQU5EU19DT05GSUdS RUdfRElEVF9JTkQgfSwKLQl7IDB4MTAsIDB4MDBmZjAwMDAsIDE2LCAweDAsIENJU0xBTkRTX0NP TkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgxMCwgMHhmZjAwMDAwMCwgMjQsIDB4MCwgQ0lTTEFO RFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDExLCAweDAwMDAwMGZmLCAwLCAweDAsIENJ U0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgxMSwgMHgwMDAwZmYwMCwgOCwgMHgw LCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4MTEsIDB4MDBmZjAwMDAsIDE2 LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgxMSwgMHhmZjAwMDAw MCwgMjQsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDEyLCAweDAw MDAwMGZmLCAwLCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgxMiwg MHgwMDAwZmYwMCwgOCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4 MTIsIDB4MDBmZjAwMDAsIDE2LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAot CXsgMHgxMiwgMHhmZjAwMDAwMCwgMjQsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5E IH0sCi0JeyAweDIsIDB4MDAwMDNmZmYsIDAsIDB4NCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRf SU5EIH0sCi0JeyAweDIsIDB4MDNmZjAwMDAsIDE2LCAweDgwLCBDSVNMQU5EU19DT05GSUdSRUdf RElEVF9JTkQgfSwKLQl7IDB4MiwgMHg3ODAwMDAwMCwgMjcsIDB4MywgQ0lTTEFORFNfQ09ORklH UkVHX0RJRFRfSU5EIH0sCi0JeyAweDEsIDB4MDAwMGZmZmYsIDAsIDB4M0ZGRiwgQ0lTTEFORFNf Q09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDEsIDB4ZmZmZjAwMDAsIDE2LCAweDNGRkYsIENJ U0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgwLCAweDAwMDAwMDAxLCAwLCAweDAs IENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgzMCwgMHgwMDAwMDBmZiwgMCwg MHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4MzAsIDB4MDAwMGZmMDAs IDgsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDMwLCAweDAwZmYw MDAwLCAxNiwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4MzAsIDB4 ZmYwMDAwMDAsIDI0LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgz MSwgMHgwMDAwMDBmZiwgMCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7 IDB4MzEsIDB4MDAwMGZmMDAsIDgsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0s Ci0JeyAweDMxLCAweDAwZmYwMDAwLCAxNiwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9J TkQgfSwKLQl7IDB4MzEsIDB4ZmYwMDAwMDAsIDI0LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19E SURUX0lORCB9LAotCXsgMHgzMiwgMHgwMDAwMDBmZiwgMCwgMHgwLCBDSVNMQU5EU19DT05GSUdS RUdfRElEVF9JTkQgfSwKLQl7IDB4MzIsIDB4MDAwMGZmMDAsIDgsIDB4MCwgQ0lTTEFORFNfQ09O RklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDMyLCAweDAwZmYwMDAwLCAxNiwgMHgwLCBDSVNMQU5E U19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4MzIsIDB4ZmYwMDAwMDAsIDI0LCAweDAsIENJ U0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgyMiwgMHgwMDAwM2ZmZiwgMCwgMHg0 LCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4MjIsIDB4MDNmZjAwMDAsIDE2 LCAweDgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4MjIsIDB4NzgwMDAw MDAsIDI3LCAweDMsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHgyMSwgMHgw MDAwZmZmZiwgMCwgMHgzRkZGLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4 MjEsIDB4ZmZmZjAwMDAsIDE2LCAweDNGRkYsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9 LAotCXsgMHgyMCwgMHgwMDAwMDAwMSwgMCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9J TkQgfSwKLQl7IDB4NTAsIDB4MDAwMDAwZmYsIDAsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJ RFRfSU5EIH0sCi0JeyAweDUwLCAweDAwMDBmZjAwLCA4LCAweDAsIENJU0xBTkRTX0NPTkZJR1JF R19ESURUX0lORCB9LAotCXsgMHg1MCwgMHgwMGZmMDAwMCwgMTYsIDB4MCwgQ0lTTEFORFNfQ09O RklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDUwLCAweGZmMDAwMDAwLCAyNCwgMHgwLCBDSVNMQU5E U19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4NTEsIDB4MDAwMDAwZmYsIDAsIDB4MCwgQ0lT TEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDUxLCAweDAwMDBmZjAwLCA4LCAweDAs IENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg1MSwgMHgwMGZmMDAwMCwgMTYs IDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDUxLCAweGZmMDAwMDAw LCAyNCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4NTIsIDB4MDAw MDAwZmYsIDAsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDUyLCAw eDAwMDBmZjAwLCA4LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg1 MiwgMHgwMGZmMDAwMCwgMTYsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0J eyAweDUyLCAweGZmMDAwMDAwLCAyNCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQg fSwKLQl7IDB4NDIsIDB4MDAwMDNmZmYsIDAsIDB4NCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRf SU5EIH0sCi0JeyAweDQyLCAweDAzZmYwMDAwLCAxNiwgMHg4MCwgQ0lTTEFORFNfQ09ORklHUkVH X0RJRFRfSU5EIH0sCi0JeyAweDQyLCAweDc4MDAwMDAwLCAyNywgMHgzLCBDSVNMQU5EU19DT05G SUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4NDEsIDB4MDAwMGZmZmYsIDAsIDB4M0ZGRiwgQ0lTTEFO RFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDQxLCAweGZmZmYwMDAwLCAxNiwgMHgzRkZG LCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4NDAsIDB4MDAwMDAwMDEsIDAs IDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDcwLCAweDAwMDAwMGZm LCAwLCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg3MCwgMHgwMDAw ZmYwMCwgOCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4NzAsIDB4 MDBmZjAwMDAsIDE2LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg3 MCwgMHhmZjAwMDAwMCwgMjQsIDB4MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0J eyAweDcxLCAweDAwMDAwMGZmLCAwLCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9 LAotCXsgMHg3MSwgMHgwMDAwZmYwMCwgOCwgMHgwLCBDSVNMQU5EU19DT05GSUdSRUdfRElEVF9J TkQgfSwKLQl7IDB4NzEsIDB4MDBmZjAwMDAsIDE2LCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19E SURUX0lORCB9LAotCXsgMHg3MSwgMHhmZjAwMDAwMCwgMjQsIDB4MCwgQ0lTTEFORFNfQ09ORklH UkVHX0RJRFRfSU5EIH0sCi0JeyAweDcyLCAweDAwMDAwMGZmLCAwLCAweDAsIENJU0xBTkRTX0NP TkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg3MiwgMHgwMDAwZmYwMCwgOCwgMHgwLCBDSVNMQU5E U19DT05GSUdSRUdfRElEVF9JTkQgfSwKLQl7IDB4NzIsIDB4MDBmZjAwMDAsIDE2LCAweDAsIENJ U0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg3MiwgMHhmZjAwMDAwMCwgMjQsIDB4 MCwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDYyLCAweDAwMDAzZmZmLCAw LCAweDQsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg2MiwgMHgwM2ZmMDAw MCwgMTYsIDB4ODAsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAotCXsgMHg2MiwgMHg3 ODAwMDAwMCwgMjcsIDB4MywgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRfSU5EIH0sCi0JeyAweDYx LCAweDAwMDBmZmZmLCAwLCAweDNGRkYsIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCB9LAot CXsgMHg2MSwgMHhmZmZmMDAwMCwgMTYsIDB4M0ZGRiwgQ0lTTEFORFNfQ09ORklHUkVHX0RJRFRf SU5EIH0sCi0JeyAweDYwLCAweDAwMDAwMDAxLCAwLCAweDAsIENJU0xBTkRTX0NPTkZJR1JFR19E SURUX0lORCB9LAotCXsgMHhGRkZGRkZGRiB9Ci19OwotCi1zdGF0aWMgdTggY2lfZ2V0X21lbW9y eV9tb2R1bGVfaW5kZXgoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0JcmV0dXJuICh1 OCkgKChSUkVHMzIobW1CSU9TX1NDUkFUQ0hfNCkgPj4gMTYpICYgMHhmZik7Ci19Ci0KLSNkZWZp bmUgTUNfQ0dfQVJCX0ZSRVFfRjAgICAgICAgICAgIDB4MGEKLSNkZWZpbmUgTUNfQ0dfQVJCX0ZS RVFfRjEgICAgICAgICAgIDB4MGIKLSNkZWZpbmUgTUNfQ0dfQVJCX0ZSRVFfRjIgICAgICAgICAg IDB4MGMKLSNkZWZpbmUgTUNfQ0dfQVJCX0ZSRVFfRjMgICAgICAgICAgIDB4MGQKLQotc3RhdGlj IGludCBjaV9jb3B5X2FuZF9zd2l0Y2hfYXJiX3NldHMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYsCi0JCQkJICAgICAgIHUzMiBhcmJfZnJlcV9zcmMsIHUzMiBhcmJfZnJlcV9kZXN0KQotewot CXUzMiBtY19hcmJfZHJhbV90aW1pbmc7Ci0JdTMyIG1jX2FyYl9kcmFtX3RpbWluZzI7Ci0JdTMy IGJ1cnN0X3RpbWU7Ci0JdTMyIG1jX2NnX2NvbmZpZzsKLQotCXN3aXRjaCAoYXJiX2ZyZXFfc3Jj KSB7Ci0JY2FzZSBNQ19DR19BUkJfRlJFUV9GMDoKLQkJbWNfYXJiX2RyYW1fdGltaW5nICA9IFJS RUczMihtbU1DX0FSQl9EUkFNX1RJTUlORyk7Ci0JCW1jX2FyYl9kcmFtX3RpbWluZzIgPSBSUkVH MzIobW1NQ19BUkJfRFJBTV9USU1JTkcyKTsKLQkJYnVyc3RfdGltZSA9IChSUkVHMzIobW1NQ19B UkJfQlVSU1RfVElNRSkgJiBNQ19BUkJfQlVSU1RfVElNRV9fU1RBVEUwX01BU0spID4+Ci0JCQkg TUNfQVJCX0JVUlNUX1RJTUVfX1NUQVRFMF9fU0hJRlQ7Ci0JCWJyZWFrOwotCWNhc2UgTUNfQ0df QVJCX0ZSRVFfRjE6Ci0JCW1jX2FyYl9kcmFtX3RpbWluZyAgPSBSUkVHMzIobW1NQ19BUkJfRFJB TV9USU1JTkdfMSk7Ci0JCW1jX2FyYl9kcmFtX3RpbWluZzIgPSBSUkVHMzIobW1NQ19BUkJfRFJB TV9USU1JTkcyXzEpOwotCQlidXJzdF90aW1lID0gKFJSRUczMihtbU1DX0FSQl9CVVJTVF9USU1F KSAmIE1DX0FSQl9CVVJTVF9USU1FX19TVEFURTFfTUFTSykgPj4KLQkJCSBNQ19BUkJfQlVSU1Rf VElNRV9fU1RBVEUxX19TSElGVDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5W QUw7Ci0JfQotCi0Jc3dpdGNoIChhcmJfZnJlcV9kZXN0KSB7Ci0JY2FzZSBNQ19DR19BUkJfRlJF UV9GMDoKLQkJV1JFRzMyKG1tTUNfQVJCX0RSQU1fVElNSU5HLCBtY19hcmJfZHJhbV90aW1pbmcp OwotCQlXUkVHMzIobW1NQ19BUkJfRFJBTV9USU1JTkcyLCBtY19hcmJfZHJhbV90aW1pbmcyKTsK LQkJV1JFRzMyX1AobW1NQ19BUkJfQlVSU1RfVElNRSwgKGJ1cnN0X3RpbWUgPDwgTUNfQVJCX0JV UlNUX1RJTUVfX1NUQVRFMF9fU0hJRlQpLAotCQkJfk1DX0FSQl9CVVJTVF9USU1FX19TVEFURTBf TUFTSyk7Ci0JCWJyZWFrOwotCWNhc2UgTUNfQ0dfQVJCX0ZSRVFfRjE6Ci0JCVdSRUczMihtbU1D X0FSQl9EUkFNX1RJTUlOR18xLCBtY19hcmJfZHJhbV90aW1pbmcpOwotCQlXUkVHMzIobW1NQ19B UkJfRFJBTV9USU1JTkcyXzEsIG1jX2FyYl9kcmFtX3RpbWluZzIpOwotCQlXUkVHMzJfUChtbU1D X0FSQl9CVVJTVF9USU1FLCAoYnVyc3RfdGltZSA8PCBNQ19BUkJfQlVSU1RfVElNRV9fU1RBVEUx X19TSElGVCksCi0JCQl+TUNfQVJCX0JVUlNUX1RJTUVfX1NUQVRFMV9NQVNLKTsKLQkJYnJlYWs7 Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JbWNfY2dfY29uZmlnID0gUlJF RzMyKG1tTUNfQ0dfQ09ORklHKSB8IDB4MDAwMDAwMEY7Ci0JV1JFRzMyKG1tTUNfQ0dfQ09ORklH LCBtY19jZ19jb25maWcpOwotCVdSRUczMl9QKG1tTUNfQVJCX0NHLCAoYXJiX2ZyZXFfZGVzdCkg PDwgTUNfQVJCX0NHX19DR19BUkJfUkVRX19TSElGVCwKLQkJfk1DX0FSQl9DR19fQ0dfQVJCX1JF UV9NQVNLKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTggY2lfZ2V0X2RkcjNfbWNsa19m cmVxdWVuY3lfcmF0aW8odTMyIG1lbW9yeV9jbG9jaykKLXsKLQl1OCBtY19wYXJhX2luZGV4Owot Ci0JaWYgKG1lbW9yeV9jbG9jayA8IDEwMDAwKQotCQltY19wYXJhX2luZGV4ID0gMDsKLQllbHNl IGlmIChtZW1vcnlfY2xvY2sgPj0gODAwMDApCi0JCW1jX3BhcmFfaW5kZXggPSAweDBmOwotCWVs c2UKLQkJbWNfcGFyYV9pbmRleCA9ICh1OCkoKG1lbW9yeV9jbG9jayAtIDEwMDAwKSAvIDUwMDAg KyAxKTsKLQlyZXR1cm4gbWNfcGFyYV9pbmRleDsKLX0KLQotc3RhdGljIHU4IGNpX2dldF9tY2xr X2ZyZXF1ZW5jeV9yYXRpbyh1MzIgbWVtb3J5X2Nsb2NrLCBib29sIHN0cm9iZV9tb2RlKQotewot CXU4IG1jX3BhcmFfaW5kZXg7Ci0KLQlpZiAoc3Ryb2JlX21vZGUpIHsKLQkJaWYgKG1lbW9yeV9j bG9jayA8IDEyNTAwKQotCQkJbWNfcGFyYV9pbmRleCA9IDB4MDA7Ci0JCWVsc2UgaWYgKG1lbW9y eV9jbG9jayA+IDQ3NTAwKQotCQkJbWNfcGFyYV9pbmRleCA9IDB4MGY7Ci0JCWVsc2UKLQkJCW1j X3BhcmFfaW5kZXggPSAodTgpKChtZW1vcnlfY2xvY2sgLSAxMDAwMCkgLyAyNTAwKTsKLQl9IGVs c2UgewotCQlpZiAobWVtb3J5X2Nsb2NrIDwgNjUwMDApCi0JCQltY19wYXJhX2luZGV4ID0gMHgw MDsKLQkJZWxzZSBpZiAobWVtb3J5X2Nsb2NrID4gMTM1MDAwKQotCQkJbWNfcGFyYV9pbmRleCA9 IDB4MGY7Ci0JCWVsc2UKLQkJCW1jX3BhcmFfaW5kZXggPSAodTgpKChtZW1vcnlfY2xvY2sgLSA2 MDAwMCkgLyA1MDAwKTsKLQl9Ci0JcmV0dXJuIG1jX3BhcmFfaW5kZXg7Ci19Ci0KLXN0YXRpYyB2 b2lkIGNpX3RyaW1fdm9sdGFnZV90YWJsZV90b19maXRfc3RhdGVfdGFibGUoc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYsCi0JCQkJCQkgICAgIHUzMiBtYXhfdm9sdGFnZV9zdGVwcywKLQkJCQkJ CSAgICAgc3RydWN0IGF0b21fdm9sdGFnZV90YWJsZSAqdm9sdGFnZV90YWJsZSkKLXsKLQl1bnNp Z25lZCBpbnQgaSwgZGlmZjsKLQotCWlmICh2b2x0YWdlX3RhYmxlLT5jb3VudCA8PSBtYXhfdm9s dGFnZV9zdGVwcykKLQkJcmV0dXJuOwotCi0JZGlmZiA9IHZvbHRhZ2VfdGFibGUtPmNvdW50IC0g bWF4X3ZvbHRhZ2Vfc3RlcHM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWF4X3ZvbHRhZ2Vfc3RlcHM7 IGkrKykKLQkJdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXSA9IHZvbHRhZ2VfdGFibGUtPmVudHJp ZXNbaSArIGRpZmZdOwotCi0Jdm9sdGFnZV90YWJsZS0+Y291bnQgPSBtYXhfdm9sdGFnZV9zdGVw czsKLX0KLQotc3RhdGljIGludCBjaV9nZXRfc3RkX3ZvbHRhZ2VfdmFsdWVfc2lkZChzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJIHN0cnVjdCBhdG9tX3ZvbHRhZ2VfdGFibGVfZW50 cnkgKnZvbHRhZ2VfdGFibGUsCi0JCQkJCSB1MTYgKnN0ZF92b2x0YWdlX2hpX3NpZGQsIHUxNiAq c3RkX3ZvbHRhZ2VfbG9fc2lkZCk7Ci1zdGF0aWMgaW50IGNpX3NldF9wb3dlcl9saW1pdChzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdTMyIG4pOwotc3RhdGljIGludCBjaV9zZXRfb3ZlcmRy aXZlX3RhcmdldF90ZHAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAgIHUz MiB0YXJnZXRfdGRwKTsKLXN0YXRpYyBpbnQgY2lfdXBkYXRlX3V2ZF9kcG0oc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYsIGJvb2wgZ2F0ZSk7Ci1zdGF0aWMgdm9pZCBjaV9kcG1fc2V0X2lycV9m dW5jcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7Ci0KLXN0YXRpYyBQUFNNQ19SZXN1bHQg YW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihzdHJ1Y3QgYW1kZ3B1X2Rl dmljZSAqYWRldiwKLQkJCQkJCQkgICAgIFBQU01DX01zZyBtc2csIHUzMiBwYXJhbWV0ZXIpOwot c3RhdGljIHZvaWQgY2lfdGhlcm1hbF9zdGFydF9zbWNfZmFuX2NvbnRyb2woc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYpOwotc3RhdGljIHZvaWQgY2lfZmFuX2N0cmxfc2V0X2RlZmF1bHRfbW9k ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldik7Ci0KLXN0YXRpYyBzdHJ1Y3QgY2lfcG93ZXJf aW5mbyAqY2lfZ2V0X3BpKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBj aV9wb3dlcl9pbmZvICpwaSA9IGFkZXYtPnBtLmRwbS5wcml2OwotCi0JcmV0dXJuIHBpOwotfQot Ci1zdGF0aWMgc3RydWN0IGNpX3BzICpjaV9nZXRfcHMoc3RydWN0IGFtZGdwdV9wcyAqcnBzKQot ewotCXN0cnVjdCBjaV9wcyAqcHMgPSBycHMtPnBzX3ByaXY7Ci0KLQlyZXR1cm4gcHM7Ci19Ci0K LXN0YXRpYyB2b2lkIGNpX2luaXRpYWxpemVfcG93ZXJ0dW5lX2RlZmF1bHRzKHN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9w aShhZGV2KTsKLQotCXN3aXRjaCAoYWRldi0+cGRldi0+ZGV2aWNlKSB7Ci0JY2FzZSAweDY2NDk6 Ci0JY2FzZSAweDY2NTA6Ci0JY2FzZSAweDY2NTE6Ci0JY2FzZSAweDY2NTg6Ci0JY2FzZSAweDY2 NUM6Ci0JY2FzZSAweDY2NUQ6Ci0JZGVmYXVsdDoKLQkJcGktPnBvd2VydHVuZV9kZWZhdWx0cyA9 ICZkZWZhdWx0c19ib25haXJlX3h0OwotCQlicmVhazsKLQljYXNlIDB4NjY0MDoKLQljYXNlIDB4 NjY0MToKLQljYXNlIDB4NjY0NjoKLQljYXNlIDB4NjY0NzoKLQkJcGktPnBvd2VydHVuZV9kZWZh dWx0cyA9ICZkZWZhdWx0c19zYXR1cm5feHQ7Ci0JCWJyZWFrOwotCWNhc2UgMHg2N0I4OgotCWNh c2UgMHg2N0IwOgotCQlwaS0+cG93ZXJ0dW5lX2RlZmF1bHRzID0gJmRlZmF1bHRzX2hhd2FpaV94 dDsKLQkJYnJlYWs7Ci0JY2FzZSAweDY3QkE6Ci0JY2FzZSAweDY3QjE6Ci0JCXBpLT5wb3dlcnR1 bmVfZGVmYXVsdHMgPSAmZGVmYXVsdHNfaGF3YWlpX3BybzsKLQkJYnJlYWs7Ci0JY2FzZSAweDY3 QTA6Ci0JY2FzZSAweDY3QTE6Ci0JY2FzZSAweDY3QTI6Ci0JY2FzZSAweDY3QTg6Ci0JY2FzZSAw eDY3QTk6Ci0JY2FzZSAweDY3QUE6Ci0JY2FzZSAweDY3Qjk6Ci0JY2FzZSAweDY3QkU6Ci0JCXBp LT5wb3dlcnR1bmVfZGVmYXVsdHMgPSAmZGVmYXVsdHNfYm9uYWlyZV94dDsKLQkJYnJlYWs7Ci0J fQotCi0JcGktPmR0ZV90al9vZmZzZXQgPSAwOwotCi0JcGktPmNhcHNfcG93ZXJfY29udGFpbm1l bnQgPSB0cnVlOwotCXBpLT5jYXBzX2NhYyA9IGZhbHNlOwotCXBpLT5jYXBzX3NxX3JhbXBpbmcg PSBmYWxzZTsKLQlwaS0+Y2Fwc19kYl9yYW1waW5nID0gZmFsc2U7Ci0JcGktPmNhcHNfdGRfcmFt cGluZyA9IGZhbHNlOwotCXBpLT5jYXBzX3RjcF9yYW1waW5nID0gZmFsc2U7Ci0KLQlpZiAocGkt PmNhcHNfcG93ZXJfY29udGFpbm1lbnQpIHsKLQkJcGktPmNhcHNfY2FjID0gdHJ1ZTsKLQkJaWYg KGFkZXYtPmFzaWNfdHlwZSA9PSBDSElQX0hBV0FJSSkKLQkJCXBpLT5lbmFibGVfYmFwbV9mZWF0 dXJlID0gZmFsc2U7Ci0JCWVsc2UKLQkJCXBpLT5lbmFibGVfYmFwbV9mZWF0dXJlID0gdHJ1ZTsK LQkJcGktPmVuYWJsZV90ZGNfbGltaXRfZmVhdHVyZSA9IHRydWU7Ci0JCXBpLT5lbmFibGVfcGtn X3B3cl90cmFja2luZ19mZWF0dXJlID0gdHJ1ZTsKLQl9Ci19Ci0KLXN0YXRpYyB1OCBjaV9jb252 ZXJ0X3RvX3ZpZCh1MTYgdmRkYykKLXsKLQlyZXR1cm4gKDYyMDAgLSAodmRkYyAqIFZPTFRBR0Vf U0NBTEUpKSAvIDI1OwotfQotCi1zdGF0aWMgaW50IGNpX3BvcHVsYXRlX2JhcG1fdmRkY192aWRf c2lkZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5m byAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JdTggKmhpX3ZpZCA9IHBpLT5zbWNfcG93ZXJ0dW5l X3RhYmxlLkJhcG1WZGRDVmlkSGlTaWRkOwotCXU4ICpsb192aWQgPSBwaS0+c21jX3Bvd2VydHVu ZV90YWJsZS5CYXBtVmRkQ1ZpZExvU2lkZDsKLQl1OCAqaGkyX3ZpZCA9IHBpLT5zbWNfcG93ZXJ0 dW5lX3RhYmxlLkJhcG1WZGRDVmlkSGlTaWRkMjsKLQl1MzIgaTsKLQotCWlmIChhZGV2LT5wbS5k cG0uZHluX3N0YXRlLmNhY19sZWFrYWdlX3RhYmxlLmVudHJpZXMgPT0gTlVMTCkKLQkJcmV0dXJu IC1FSU5WQUw7Ci0JaWYgKGFkZXYtPnBtLmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFibGUu Y291bnQgPiA4KQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYWRldi0+cG0uZHBtLmR5bl9zdGF0 ZS5jYWNfbGVha2FnZV90YWJsZS5jb3VudCAhPQotCSAgICBhZGV2LT5wbS5kcG0uZHluX3N0YXRl LnZkZGNfZGVwZW5kZW5jeV9vbl9zY2xrLmNvdW50KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZv ciAoaSA9IDA7IGkgPCBhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY19sZWFrYWdlX3RhYmxlLmNv dW50OyBpKyspIHsKLQkJaWYgKGFkZXYtPnBtLmRwbS5wbGF0Zm9ybV9jYXBzICYgQVRPTV9QUF9Q TEFURk9STV9DQVBfRVZWKSB7Ci0JCQlsb192aWRbaV0gPSBjaV9jb252ZXJ0X3RvX3ZpZChhZGV2 LT5wbS5kcG0uZHluX3N0YXRlLmNhY19sZWFrYWdlX3RhYmxlLmVudHJpZXNbaV0udmRkYzEpOwot CQkJaGlfdmlkW2ldID0gY2lfY29udmVydF90b192aWQoYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5j YWNfbGVha2FnZV90YWJsZS5lbnRyaWVzW2ldLnZkZGMyKTsKLQkJCWhpMl92aWRbaV0gPSBjaV9j b252ZXJ0X3RvX3ZpZChhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY19sZWFrYWdlX3RhYmxlLmVu dHJpZXNbaV0udmRkYzMpOwotCQl9IGVsc2UgewotCQkJbG9fdmlkW2ldID0gY2lfY29udmVydF90 b192aWQoYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5jYWNfbGVha2FnZV90YWJsZS5lbnRyaWVzW2ld LnZkZGMpOwotCQkJaGlfdmlkW2ldID0gY2lfY29udmVydF90b192aWQoKHUxNilhZGV2LT5wbS5k cG0uZHluX3N0YXRlLmNhY19sZWFrYWdlX3RhYmxlLmVudHJpZXNbaV0ubGVha2FnZSk7Ci0JCX0K LQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9wdWxhdGVfdmRkY192aWQoc3Ry dWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0g Y2lfZ2V0X3BpKGFkZXYpOwotCXU4ICp2aWQgPSBwaS0+c21jX3Bvd2VydHVuZV90YWJsZS5WZGRD VmlkOwotCXUzMiBpOwotCi0JaWYgKHBpLT52ZGRjX3ZvbHRhZ2VfdGFibGUuY291bnQgPiA4KQot CQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvciAoaSA9IDA7IGkgPCBwaS0+dmRkY192b2x0YWdlX3Rh YmxlLmNvdW50OyBpKyspCi0JCXZpZFtpXSA9IGNpX2NvbnZlcnRfdG9fdmlkKHBpLT52ZGRjX3Zv bHRhZ2VfdGFibGUuZW50cmllc1tpXS52YWx1ZSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IGludCBjaV9wb3B1bGF0ZV9zdmlfbG9hZF9saW5lKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQljb25z dCBzdHJ1Y3QgY2lfcHRfZGVmYXVsdHMgKnB0X2RlZmF1bHRzID0gcGktPnBvd2VydHVuZV9kZWZh dWx0czsKLQotCXBpLT5zbWNfcG93ZXJ0dW5lX3RhYmxlLlN2aUxvYWRMaW5lRW4gPSBwdF9kZWZh dWx0cy0+c3ZpX2xvYWRfbGluZV9lbjsKLQlwaS0+c21jX3Bvd2VydHVuZV90YWJsZS5TdmlMb2Fk TGluZVZkZEMgPSBwdF9kZWZhdWx0cy0+c3ZpX2xvYWRfbGluZV92ZGRjOwotCXBpLT5zbWNfcG93 ZXJ0dW5lX3RhYmxlLlN2aUxvYWRMaW5lVHJpbVZkZEMgPSAzOwotCXBpLT5zbWNfcG93ZXJ0dW5l X3RhYmxlLlN2aUxvYWRMaW5lT2Zmc2V0VmRkQyA9IDA7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3Rh dGljIGludCBjaV9wb3B1bGF0ZV90ZGNfbGltaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYp Ci17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCWNvbnN0 IHN0cnVjdCBjaV9wdF9kZWZhdWx0cyAqcHRfZGVmYXVsdHMgPSBwaS0+cG93ZXJ0dW5lX2RlZmF1 bHRzOwotCXUxNiB0ZGNfbGltaXQ7Ci0KLQl0ZGNfbGltaXQgPSBhZGV2LT5wbS5kcG0uZHluX3N0 YXRlLmNhY190ZHBfdGFibGUtPnRkYyAqIDI1NjsKLQlwaS0+c21jX3Bvd2VydHVuZV90YWJsZS5U RENfVkREQ19Qa2dMaW1pdCA9IGNwdV90b19iZTE2KHRkY19saW1pdCk7Ci0JcGktPnNtY19wb3dl cnR1bmVfdGFibGUuVERDX1ZERENfVGhyb3R0bGVSZWxlYXNlTGltaXRQZXJjID0KLQkJcHRfZGVm YXVsdHMtPnRkY192ZGRjX3Rocm90dGxlX3JlbGVhc2VfbGltaXRfcGVyYzsKLQlwaS0+c21jX3Bv d2VydHVuZV90YWJsZS5URENfTUFXdCA9IHB0X2RlZmF1bHRzLT50ZGNfbWF3dDsKLQotCXJldHVy biAwOwotfQotCi1zdGF0aWMgaW50IGNpX3BvcHVsYXRlX2R3OChzdHJ1Y3QgYW1kZ3B1X2Rldmlj ZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7 Ci0JY29uc3Qgc3RydWN0IGNpX3B0X2RlZmF1bHRzICpwdF9kZWZhdWx0cyA9IHBpLT5wb3dlcnR1 bmVfZGVmYXVsdHM7Ci0JaW50IHJldDsKLQotCXJldCA9IGFtZGdwdV9jaV9yZWFkX3NtY19zcmFt X2R3b3JkKGFkZXYsCi0JCQkJICAgICBTTVU3X0ZJUk1XQVJFX0hFQURFUl9MT0NBVElPTiArCi0J CQkJICAgICBvZmZzZXRvZihTTVU3X0Zpcm13YXJlX0hlYWRlciwgUG1GdXNlVGFibGUpICsKLQkJ CQkgICAgIG9mZnNldG9mKFNNVTdfRGlzY3JldGVfUG1GdXNlcywgVGRjV2F0ZXJmYWxsQ3RsKSwK LQkJCQkgICAgICh1MzIgKikmcGktPnNtY19wb3dlcnR1bmVfdGFibGUuVGRjV2F0ZXJmYWxsQ3Rs LAotCQkJCSAgICAgcGktPnNyYW1fZW5kKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gLUVJTlZBTDsK LQllbHNlCi0JCXBpLT5zbWNfcG93ZXJ0dW5lX3RhYmxlLlRkY1dhdGVyZmFsbEN0bCA9IHB0X2Rl ZmF1bHRzLT50ZGNfd2F0ZXJmYWxsX2N0bDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IGNpX3BvcHVsYXRlX2Z1enp5X2ZhbihzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlz dHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0KLQlpZiAoKGFkZXYt PnBtLmRwbS5mYW4uZmFuX291dHB1dF9zZW5zaXRpdml0eSAmICgxIDw8IDE1KSkgfHwKLQkgICAg KGFkZXYtPnBtLmRwbS5mYW4uZmFuX291dHB1dF9zZW5zaXRpdml0eSA9PSAwKSkKLQkJYWRldi0+ cG0uZHBtLmZhbi5mYW5fb3V0cHV0X3NlbnNpdGl2aXR5ID0KLQkJCWFkZXYtPnBtLmRwbS5mYW4u ZGVmYXVsdF9mYW5fb3V0cHV0X3NlbnNpdGl2aXR5OwotCi0JcGktPnNtY19wb3dlcnR1bmVfdGFi bGUuRnV6enlGYW5fUHdtU2V0RGVsdGEgPQotCQljcHVfdG9fYmUxNihhZGV2LT5wbS5kcG0uZmFu LmZhbl9vdXRwdXRfc2Vuc2l0aXZpdHkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQg Y2lfbWluX21heF92X2duYmxfcG1fbGlkX2Zyb21fYmFwbV92ZGRjKHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2 KTsKLQl1OCAqaGlfdmlkID0gcGktPnNtY19wb3dlcnR1bmVfdGFibGUuQmFwbVZkZENWaWRIaVNp ZGQ7Ci0JdTggKmxvX3ZpZCA9IHBpLT5zbWNfcG93ZXJ0dW5lX3RhYmxlLkJhcG1WZGRDVmlkTG9T aWRkOwotCWludCBpLCBtaW4sIG1heDsKLQotCW1pbiA9IG1heCA9IGhpX3ZpZFswXTsKLQlmb3Ig KGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0JCWlmICgwICE9IGhpX3ZpZFtpXSkgewotCQkJaWYgKG1p biA+IGhpX3ZpZFtpXSkKLQkJCQltaW4gPSBoaV92aWRbaV07Ci0JCQlpZiAobWF4IDwgaGlfdmlk W2ldKQotCQkJCW1heCA9IGhpX3ZpZFtpXTsKLQkJfQotCi0JCWlmICgwICE9IGxvX3ZpZFtpXSkg ewotCQkJaWYgKG1pbiA+IGxvX3ZpZFtpXSkKLQkJCQltaW4gPSBsb192aWRbaV07Ci0JCQlpZiAo bWF4IDwgbG9fdmlkW2ldKQotCQkJCW1heCA9IGxvX3ZpZFtpXTsKLQkJfQotCX0KLQotCWlmICgo bWluID09IDApIHx8IChtYXggPT0gMCkpCi0JCXJldHVybiAtRUlOVkFMOwotCXBpLT5zbWNfcG93 ZXJ0dW5lX3RhYmxlLkduYkxQTUxNYXhWaWQgPSAodTgpbWF4OwotCXBpLT5zbWNfcG93ZXJ0dW5l X3RhYmxlLkduYkxQTUxNaW5WaWQgPSAodTgpbWluOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgY2lfcG9wdWxhdGVfYmFwbV92ZGRjX2Jhc2VfbGVha2FnZV9zaWRkKHN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9w aShhZGV2KTsKLQl1MTYgaGlfc2lkZCA9IHBpLT5zbWNfcG93ZXJ0dW5lX3RhYmxlLkJhcG1WZGRD QmFzZUxlYWthZ2VIaVNpZGQ7Ci0JdTE2IGxvX3NpZGQgPSBwaS0+c21jX3Bvd2VydHVuZV90YWJs ZS5CYXBtVmRkQ0Jhc2VMZWFrYWdlTG9TaWRkOwotCXN0cnVjdCBhbWRncHVfY2FjX3RkcF90YWJs ZSAqY2FjX3RkcF90YWJsZSA9Ci0JCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUuY2FjX3RkcF90YWJs ZTsKLQotCWhpX3NpZGQgPSBjYWNfdGRwX3RhYmxlLT5oaWdoX2NhY19sZWFrYWdlIC8gMTAwICog MjU2OwotCWxvX3NpZGQgPSBjYWNfdGRwX3RhYmxlLT5sb3dfY2FjX2xlYWthZ2UgLyAxMDAgKiAy NTY7Ci0KLQlwaS0+c21jX3Bvd2VydHVuZV90YWJsZS5CYXBtVmRkQ0Jhc2VMZWFrYWdlSGlTaWRk ID0gY3B1X3RvX2JlMTYoaGlfc2lkZCk7Ci0JcGktPnNtY19wb3dlcnR1bmVfdGFibGUuQmFwbVZk ZENCYXNlTGVha2FnZUxvU2lkZCA9IGNwdV90b19iZTE2KGxvX3NpZGQpOwotCi0JcmV0dXJuIDA7 Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9wdWxhdGVfYmFwbV9wYXJhbWV0ZXJzX2luX2RwbV90YWJs ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAq cGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JY29uc3Qgc3RydWN0IGNpX3B0X2RlZmF1bHRzICpwdF9k ZWZhdWx0cyA9IHBpLT5wb3dlcnR1bmVfZGVmYXVsdHM7Ci0JU01VN19EaXNjcmV0ZV9EcG1UYWJs ZSAgKmRwbV90YWJsZSA9ICZwaS0+c21jX3N0YXRlX3RhYmxlOwotCXN0cnVjdCBhbWRncHVfY2Fj X3RkcF90YWJsZSAqY2FjX3RkcF90YWJsZSA9Ci0JCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUuY2Fj X3RkcF90YWJsZTsKLQlzdHJ1Y3QgYW1kZ3B1X3BwbV90YWJsZSAqcHBtID0gYWRldi0+cG0uZHBt LmR5bl9zdGF0ZS5wcG1fdGFibGU7Ci0JaW50IGksIGosIGs7Ci0JY29uc3QgdTE2ICpkZWYxOwot CWNvbnN0IHUxNiAqZGVmMjsKLQotCWRwbV90YWJsZS0+RGVmYXVsdFRkcCA9IGNhY190ZHBfdGFi bGUtPnRkcCAqIDI1NjsKLQlkcG1fdGFibGUtPlRhcmdldFRkcCA9IGNhY190ZHBfdGFibGUtPmNv bmZpZ3VyYWJsZV90ZHAgKiAyNTY7Ci0KLQlkcG1fdGFibGUtPkRURVRqT2Zmc2V0ID0gKHU4KXBp LT5kdGVfdGpfb2Zmc2V0OwotCWRwbV90YWJsZS0+R3B1VGpNYXggPQotCQkodTgpKHBpLT50aGVy bWFsX3RlbXBfc2V0dGluZy50ZW1wZXJhdHVyZV9oaWdoIC8gMTAwMCk7Ci0JZHBtX3RhYmxlLT5H cHVUakh5c3QgPSA4OwotCi0JZHBtX3RhYmxlLT5EVEVBbWJpZW50VGVtcEJhc2UgPSBwdF9kZWZh dWx0cy0+ZHRlX2FtYmllbnRfdGVtcF9iYXNlOwotCi0JaWYgKHBwbSkgewotCQlkcG1fdGFibGUt PlBQTV9Qa2dQd3JMaW1pdCA9IGNwdV90b19iZTE2KCh1MTYpcHBtLT5kZ3B1X3RkcCAqIDI1NiAv IDEwMDApOwotCQlkcG1fdGFibGUtPlBQTV9UZW1wZXJhdHVyZUxpbWl0ID0gY3B1X3RvX2JlMTYo KHUxNilwcG0tPnRqX21heCAqIDI1Nik7Ci0JfSBlbHNlIHsKLQkJZHBtX3RhYmxlLT5QUE1fUGtn UHdyTGltaXQgPSBjcHVfdG9fYmUxNigwKTsKLQkJZHBtX3RhYmxlLT5QUE1fVGVtcGVyYXR1cmVM aW1pdCA9IGNwdV90b19iZTE2KDApOwotCX0KLQotCWRwbV90YWJsZS0+QkFQTV9URU1QX0dSQURJ RU5UID0gY3B1X3RvX2JlMzIocHRfZGVmYXVsdHMtPmJhcG1fdGVtcF9ncmFkaWVudCk7Ci0JZGVm MSA9IHB0X2RlZmF1bHRzLT5iYXBtdGlfcjsKLQlkZWYyID0gcHRfZGVmYXVsdHMtPmJhcG10aV9y YzsKLQotCWZvciAoaSA9IDA7IGkgPCBTTVU3X0RURV9JVEVSQVRJT05TOyBpKyspIHsKLQkJZm9y IChqID0gMDsgaiA8IFNNVTdfRFRFX1NPVVJDRVM7IGorKykgewotCQkJZm9yIChrID0gMDsgayA8 IFNNVTdfRFRFX1NJTktTOyBrKyspIHsKLQkJCQlkcG1fdGFibGUtPkJBUE1USV9SW2ldW2pdW2td ID0gY3B1X3RvX2JlMTYoKmRlZjEpOwotCQkJCWRwbV90YWJsZS0+QkFQTVRJX1JDW2ldW2pdW2td ID0gY3B1X3RvX2JlMTYoKmRlZjIpOwotCQkJCWRlZjErKzsKLQkJCQlkZWYyKys7Ci0JCQl9Ci0J CX0KLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9wb3B1bGF0ZV9wbV9iYXNl KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpw aSA9IGNpX2dldF9waShhZGV2KTsKLQl1MzIgcG1fZnVzZV90YWJsZV9vZmZzZXQ7Ci0JaW50IHJl dDsKLQotCWlmIChwaS0+Y2Fwc19wb3dlcl9jb250YWlubWVudCkgewotCQlyZXQgPSBhbWRncHVf Y2lfcmVhZF9zbWNfc3JhbV9kd29yZChhZGV2LAotCQkJCQkgICAgIFNNVTdfRklSTVdBUkVfSEVB REVSX0xPQ0FUSU9OICsKLQkJCQkJICAgICBvZmZzZXRvZihTTVU3X0Zpcm13YXJlX0hlYWRlciwg UG1GdXNlVGFibGUpLAotCQkJCQkgICAgICZwbV9mdXNlX3RhYmxlX29mZnNldCwgcGktPnNyYW1f ZW5kKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGNpX3BvcHVsYXRlX2Jh cG1fdmRkY192aWRfc2lkZChhZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJl dCA9IGNpX3BvcHVsYXRlX3ZkZGNfdmlkKGFkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJl dDsKLQkJcmV0ID0gY2lfcG9wdWxhdGVfc3ZpX2xvYWRfbGluZShhZGV2KTsKLQkJaWYgKHJldCkK LQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGNpX3BvcHVsYXRlX3RkY19saW1pdChhZGV2KTsKLQkJ aWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGNpX3BvcHVsYXRlX2R3OChhZGV2KTsK LQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGNpX3BvcHVsYXRlX2Z1enp5X2Zh bihhZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGNpX21pbl9tYXhf dl9nbmJsX3BtX2xpZF9mcm9tX2JhcG1fdmRkYyhhZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVy biByZXQ7Ci0JCXJldCA9IGNpX3BvcHVsYXRlX2JhcG1fdmRkY19iYXNlX2xlYWthZ2Vfc2lkZChh ZGV2KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JCXJldCA9IGFtZGdwdV9jaV9jb3B5 X2J5dGVzX3RvX3NtYyhhZGV2LCBwbV9mdXNlX3RhYmxlX29mZnNldCwKLQkJCQkJICAgKHU4ICop JnBpLT5zbWNfcG93ZXJ0dW5lX3RhYmxlLAotCQkJCQkgICBzaXplb2YoU01VN19EaXNjcmV0ZV9Q bUZ1c2VzKSwgcGktPnNyYW1fZW5kKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQot Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2RvX2VuYWJsZV9kaWR0KHN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2LCBjb25zdCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgY2lfcG93 ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JdTMyIGRhdGE7Ci0KLQlpZiAocGktPmNh cHNfc3FfcmFtcGluZykgewotCQlkYXRhID0gUlJFRzMyX0RJRFQoaXhESURUX1NRX0NUUkwwKTsK LQkJaWYgKGVuYWJsZSkKLQkJCWRhdGEgfD0gRElEVF9TUV9DVFJMMF9fRElEVF9DVFJMX0VOX01B U0s7Ci0JCWVsc2UKLQkJCWRhdGEgJj0gfkRJRFRfU1FfQ1RSTDBfX0RJRFRfQ1RSTF9FTl9NQVNL OwotCQlXUkVHMzJfRElEVChpeERJRFRfU1FfQ1RSTDAsIGRhdGEpOwotCX0KLQotCWlmIChwaS0+ Y2Fwc19kYl9yYW1waW5nKSB7Ci0JCWRhdGEgPSBSUkVHMzJfRElEVChpeERJRFRfREJfQ1RSTDAp OwotCQlpZiAoZW5hYmxlKQotCQkJZGF0YSB8PSBESURUX0RCX0NUUkwwX19ESURUX0NUUkxfRU5f TUFTSzsKLQkJZWxzZQotCQkJZGF0YSAmPSB+RElEVF9EQl9DVFJMMF9fRElEVF9DVFJMX0VOX01B U0s7Ci0JCVdSRUczMl9ESURUKGl4RElEVF9EQl9DVFJMMCwgZGF0YSk7Ci0JfQotCi0JaWYgKHBp LT5jYXBzX3RkX3JhbXBpbmcpIHsKLQkJZGF0YSA9IFJSRUczMl9ESURUKGl4RElEVF9URF9DVFJM MCk7Ci0JCWlmIChlbmFibGUpCi0JCQlkYXRhIHw9IERJRFRfVERfQ1RSTDBfX0RJRFRfQ1RSTF9F Tl9NQVNLOwotCQllbHNlCi0JCQlkYXRhICY9IH5ESURUX1REX0NUUkwwX19ESURUX0NUUkxfRU5f TUFTSzsKLQkJV1JFRzMyX0RJRFQoaXhESURUX1REX0NUUkwwLCBkYXRhKTsKLQl9Ci0KLQlpZiAo cGktPmNhcHNfdGNwX3JhbXBpbmcpIHsKLQkJZGF0YSA9IFJSRUczMl9ESURUKGl4RElEVF9UQ1Bf Q1RSTDApOwotCQlpZiAoZW5hYmxlKQotCQkJZGF0YSB8PSBESURUX1RDUF9DVFJMMF9fRElEVF9D VFJMX0VOX01BU0s7Ci0JCWVsc2UKLQkJCWRhdGEgJj0gfkRJRFRfVENQX0NUUkwwX19ESURUX0NU UkxfRU5fTUFTSzsKLQkJV1JFRzMyX0RJRFQoaXhESURUX1RDUF9DVFJMMCwgZGF0YSk7Ci0JfQot fQotCi1zdGF0aWMgaW50IGNpX3Byb2dyYW1fcHRfY29uZmlnX3JlZ2lzdGVycyhzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwKLQkJCQkJICBjb25zdCBzdHJ1Y3QgY2lfcHRfY29uZmlnX3JlZyAq Y2FjX2NvbmZpZ19yZWdzKQotewotCWNvbnN0IHN0cnVjdCBjaV9wdF9jb25maWdfcmVnICpjb25m aWdfcmVncyA9IGNhY19jb25maWdfcmVnczsKLQl1MzIgZGF0YTsKLQl1MzIgY2FjaGUgPSAwOwot Ci0JaWYgKGNvbmZpZ19yZWdzID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jd2hpbGUg KGNvbmZpZ19yZWdzLT5vZmZzZXQgIT0gMHhGRkZGRkZGRikgewotCQlpZiAoY29uZmlnX3JlZ3Mt PnR5cGUgPT0gQ0lTTEFORFNfQ09ORklHUkVHX0NBQ0hFKSB7Ci0JCQljYWNoZSB8PSAoKGNvbmZp Z19yZWdzLT52YWx1ZSA8PCBjb25maWdfcmVncy0+c2hpZnQpICYgY29uZmlnX3JlZ3MtPm1hc2sp OwotCQl9IGVsc2UgewotCQkJc3dpdGNoIChjb25maWdfcmVncy0+dHlwZSkgewotCQkJY2FzZSBD SVNMQU5EU19DT05GSUdSRUdfU01DX0lORDoKLQkJCQlkYXRhID0gUlJFRzMyX1NNQyhjb25maWdf cmVncy0+b2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ0lTTEFORFNfQ09ORklHUkVHX0RJ RFRfSU5EOgotCQkJCWRhdGEgPSBSUkVHMzJfRElEVChjb25maWdfcmVncy0+b2Zmc2V0KTsKLQkJ CQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJZGF0YSA9IFJSRUczMihjb25maWdfcmVncy0+b2Zm c2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJZGF0YSAmPSB+Y29uZmlnX3JlZ3MtPm1hc2s7 Ci0JCQlkYXRhIHw9ICgoY29uZmlnX3JlZ3MtPnZhbHVlIDw8IGNvbmZpZ19yZWdzLT5zaGlmdCkg JiBjb25maWdfcmVncy0+bWFzayk7Ci0JCQlkYXRhIHw9IGNhY2hlOwotCi0JCQlzd2l0Y2ggKGNv bmZpZ19yZWdzLT50eXBlKSB7Ci0JCQljYXNlIENJU0xBTkRTX0NPTkZJR1JFR19TTUNfSU5EOgot CQkJCVdSRUczMl9TTUMoY29uZmlnX3JlZ3MtPm9mZnNldCwgZGF0YSk7Ci0JCQkJYnJlYWs7Ci0J CQljYXNlIENJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORDoKLQkJCQlXUkVHMzJfRElEVChjb25m aWdfcmVncy0+b2Zmc2V0LCBkYXRhKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJV1JF RzMyKGNvbmZpZ19yZWdzLT5vZmZzZXQsIGRhdGEpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2Fj aGUgPSAwOwotCQl9Ci0JCWNvbmZpZ19yZWdzKys7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0 aWMgaW50IGNpX2VuYWJsZV9kaWR0KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBib29sIGVu YWJsZSkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0J aW50IHJldDsKLQotCWlmIChwaS0+Y2Fwc19zcV9yYW1waW5nIHx8IHBpLT5jYXBzX2RiX3JhbXBp bmcgfHwKLQkgICAgcGktPmNhcHNfdGRfcmFtcGluZyB8fCBwaS0+Y2Fwc190Y3BfcmFtcGluZykg ewotCQlhbWRncHVfZ2Z4X3JsY19lbnRlcl9zYWZlX21vZGUoYWRldik7Ci0KLQkJaWYgKGVuYWJs ZSkgewotCQkJcmV0ID0gY2lfcHJvZ3JhbV9wdF9jb25maWdfcmVnaXN0ZXJzKGFkZXYsIGRpZHRf Y29uZmlnX2NpKTsKLQkJCWlmIChyZXQpIHsKLQkJCQlhbWRncHVfZ2Z4X3JsY19leGl0X3NhZmVf bW9kZShhZGV2KTsKLQkJCQlyZXR1cm4gcmV0OwotCQkJfQotCQl9Ci0KLQkJY2lfZG9fZW5hYmxl X2RpZHQoYWRldiwgZW5hYmxlKTsKLQotCQlhbWRncHVfZ2Z4X3JsY19leGl0X3NhZmVfbW9kZShh ZGV2KTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9lbmFibGVfcG93ZXJf Y29udGFpbm1lbnQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIGJvb2wgZW5hYmxlKQotewot CXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlQUFNNQ19SZXN1 bHQgc21jX3Jlc3VsdDsKLQlpbnQgcmV0ID0gMDsKLQotCWlmIChlbmFibGUpIHsKLQkJcGktPnBv d2VyX2NvbnRhaW5tZW50X2ZlYXR1cmVzID0gMDsKLQkJaWYgKHBpLT5jYXBzX3Bvd2VyX2NvbnRh aW5tZW50KSB7Ci0JCQlpZiAocGktPmVuYWJsZV9iYXBtX2ZlYXR1cmUpIHsKLQkJCQlzbWNfcmVz dWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfRW5hYmxlRFRF KTsKLQkJCQlpZiAoc21jX3Jlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0JCQkJCXJldCA9IC1F SU5WQUw7Ci0JCQkJZWxzZQotCQkJCQlwaS0+cG93ZXJfY29udGFpbm1lbnRfZmVhdHVyZXMgfD0g UE9XRVJDT05UQUlOTUVOVF9GRUFUVVJFX0JBUE07Ci0JCQl9Ci0KLQkJCWlmIChwaS0+ZW5hYmxl X3RkY19saW1pdF9mZWF0dXJlKSB7Ci0JCQkJc21jX3Jlc3VsdCA9IGFtZGdwdV9jaV9zZW5kX21z Z190b19zbWMoYWRldiwgUFBTTUNfTVNHX1REQ0xpbWl0RW5hYmxlKTsKLQkJCQlpZiAoc21jX3Jl c3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0JCQkJCXJldCA9IC1FSU5WQUw7Ci0JCQkJZWxzZQot CQkJCQlwaS0+cG93ZXJfY29udGFpbm1lbnRfZmVhdHVyZXMgfD0gUE9XRVJDT05UQUlOTUVOVF9G RUFUVVJFX1REQ0xpbWl0OwotCQkJfQotCi0JCQlpZiAocGktPmVuYWJsZV9wa2dfcHdyX3RyYWNr aW5nX2ZlYXR1cmUpIHsKLQkJCQlzbWNfcmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3Nt YyhhZGV2LCBQUFNNQ19NU0dfUGtnUHdyTGltaXRFbmFibGUpOwotCQkJCWlmIChzbWNfcmVzdWx0 ICE9IFBQU01DX1Jlc3VsdF9PSykgewotCQkJCQlyZXQgPSAtRUlOVkFMOwotCQkJCX0gZWxzZSB7 Ci0JCQkJCXN0cnVjdCBhbWRncHVfY2FjX3RkcF90YWJsZSAqY2FjX3RkcF90YWJsZSA9Ci0JCQkJ CQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY190ZHBfdGFibGU7Ci0JCQkJCXUzMiBkZWZhdWx0 X3B3cl9saW1pdCA9Ci0JCQkJCQkodTMyKShjYWNfdGRwX3RhYmxlLT5tYXhpbXVtX3Bvd2VyX2Rl bGl2ZXJ5X2xpbWl0ICogMjU2KTsKLQotCQkJCQlwaS0+cG93ZXJfY29udGFpbm1lbnRfZmVhdHVy ZXMgfD0gUE9XRVJDT05UQUlOTUVOVF9GRUFUVVJFX1BrZ1B3ckxpbWl0OwotCi0JCQkJCWNpX3Nl dF9wb3dlcl9saW1pdChhZGV2LCBkZWZhdWx0X3B3cl9saW1pdCk7Ci0JCQkJfQotCQkJfQotCQl9 Ci0JfSBlbHNlIHsKLQkJaWYgKHBpLT5jYXBzX3Bvd2VyX2NvbnRhaW5tZW50ICYmIHBpLT5wb3dl cl9jb250YWlubWVudF9mZWF0dXJlcykgewotCQkJaWYgKHBpLT5wb3dlcl9jb250YWlubWVudF9m ZWF0dXJlcyAmIFBPV0VSQ09OVEFJTk1FTlRfRkVBVFVSRV9URENMaW1pdCkKLQkJCQlhbWRncHVf Y2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19URENMaW1pdERpc2FibGUpOwotCi0J CQlpZiAocGktPnBvd2VyX2NvbnRhaW5tZW50X2ZlYXR1cmVzICYgUE9XRVJDT05UQUlOTUVOVF9G RUFUVVJFX0JBUE0pCi0JCQkJYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19N U0dfRGlzYWJsZURURSk7Ci0KLQkJCWlmIChwaS0+cG93ZXJfY29udGFpbm1lbnRfZmVhdHVyZXMg JiBQT1dFUkNPTlRBSU5NRU5UX0ZFQVRVUkVfUGtnUHdyTGltaXQpCi0JCQkJYW1kZ3B1X2NpX3Nl bmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfUGtnUHdyTGltaXREaXNhYmxlKTsKLQkJCXBp LT5wb3dlcl9jb250YWlubWVudF9mZWF0dXJlcyA9IDA7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0 OwotfQotCi1zdGF0aWMgaW50IGNpX2VuYWJsZV9zbWNfY2FjKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2LCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9n ZXRfcGkoYWRldik7Ci0JUFBTTUNfUmVzdWx0IHNtY19yZXN1bHQ7Ci0JaW50IHJldCA9IDA7Ci0K LQlpZiAocGktPmNhcHNfY2FjKSB7Ci0JCWlmIChlbmFibGUpIHsKLQkJCXNtY19yZXN1bHQgPSBh bWRncHVfY2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19FbmFibGVDYWMpOwotCQkJ aWYgKHNtY19yZXN1bHQgIT0gUFBTTUNfUmVzdWx0X09LKSB7Ci0JCQkJcmV0ID0gLUVJTlZBTDsK LQkJCQlwaS0+Y2FjX2VuYWJsZWQgPSBmYWxzZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGktPmNhY19l bmFibGVkID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIGlmIChwaS0+Y2FjX2VuYWJsZWQpIHsKLQkJ CWFtZGdwdV9jaV9zZW5kX21zZ190b19zbWMoYWRldiwgUFBTTUNfTVNHX0Rpc2FibGVDYWMpOwot CQkJcGktPmNhY19lbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQot Ci1zdGF0aWMgaW50IGNpX2VuYWJsZV90aGVybWFsX2Jhc2VkX3NjbGtfZHBtKHN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2LAotCQkJCQkgICAgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IGNpX3Bv d2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCVBQU01DX1Jlc3VsdCBzbWNfcmVzdWx0 ID0gUFBTTUNfUmVzdWx0X09LOwotCi0JaWYgKHBpLT50aGVybWFsX3NjbGtfZHBtX2VuYWJsZWQp IHsKLQkJaWYgKGVuYWJsZSkKLQkJCXNtY19yZXN1bHQgPSBhbWRncHVfY2lfc2VuZF9tc2dfdG9f c21jKGFkZXYsIFBQU01DX01TR19FTkFCTEVfVEhFUk1BTF9EUE0pOwotCQllbHNlCi0JCQlzbWNf cmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfRElTQUJM RV9USEVSTUFMX0RQTSk7Ci0JfQotCi0JaWYgKHNtY19yZXN1bHQgPT0gUFBTTUNfUmVzdWx0X09L KQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50 IGNpX3Bvd2VyX2NvbnRyb2xfc2V0X2xldmVsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQot ewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlzdHJ1Y3Qg YW1kZ3B1X2NhY190ZHBfdGFibGUgKmNhY190ZHBfdGFibGUgPQotCQlhZGV2LT5wbS5kcG0uZHlu X3N0YXRlLmNhY190ZHBfdGFibGU7Ci0JczMyIGFkanVzdF9wZXJjZW50OwotCXMzMiB0YXJnZXRf dGRwOwotCWludCByZXQgPSAwOwotCWJvb2wgYWRqdXN0X3BvbGFyaXR5ID0gZmFsc2U7IC8qID8/ PyAqLwotCi0JaWYgKHBpLT5jYXBzX3Bvd2VyX2NvbnRhaW5tZW50KSB7Ci0JCWFkanVzdF9wZXJj ZW50ID0gYWRqdXN0X3BvbGFyaXR5ID8KLQkJCWFkZXYtPnBtLmRwbS50ZHBfYWRqdXN0bWVudCA6 ICgtMSAqIGFkZXYtPnBtLmRwbS50ZHBfYWRqdXN0bWVudCk7Ci0JCXRhcmdldF90ZHAgPSAoKDEw MCArIGFkanVzdF9wZXJjZW50KSAqCi0JCQkgICAgICAoczMyKWNhY190ZHBfdGFibGUtPmNvbmZp Z3VyYWJsZV90ZHApIC8gMTAwOwotCi0JCXJldCA9IGNpX3NldF9vdmVyZHJpdmVfdGFyZ2V0X3Rk cChhZGV2LCAodTMyKXRhcmdldF90ZHApOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRp YyB2b2lkIGNpX2RwbV9wb3dlcmdhdGVfdXZkKHZvaWQgKmhhbmRsZSwgYm9vbCBnYXRlKQotewot CXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFu ZGxlOwotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQotCXBp LT51dmRfcG93ZXJfZ2F0ZWQgPSBnYXRlOwotCi0JaWYgKGdhdGUpIHsKLQkJLyogc3RvcCB0aGUg VVZEIGJsb2NrICovCi0JCWFtZGdwdV9kZXZpY2VfaXBfc2V0X3Bvd2VyZ2F0aW5nX3N0YXRlKGFk ZXYsIEFNRF9JUF9CTE9DS19UWVBFX1VWRCwKLQkJCQkJCSAgICAgICBBTURfUEdfU1RBVEVfR0FU RSk7Ci0JCWNpX3VwZGF0ZV91dmRfZHBtKGFkZXYsIGdhdGUpOwotCX0gZWxzZSB7Ci0JCWFtZGdw dV9kZXZpY2VfaXBfc2V0X3Bvd2VyZ2F0aW5nX3N0YXRlKGFkZXYsIEFNRF9JUF9CTE9DS19UWVBF X1VWRCwKLQkJCQkJCSAgICAgICBBTURfUEdfU1RBVEVfVU5HQVRFKTsKLQkJY2lfdXBkYXRlX3V2 ZF9kcG0oYWRldiwgZ2F0ZSk7Ci0JfQotfQotCi1zdGF0aWMgYm9vbCBjaV9kcG1fdmJsYW5rX3Rv b19zaG9ydCh2b2lkICpoYW5kbGUpCi17Ci0Jc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAo c3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0JdTMyIHZibGFua190aW1lID0gYW1kZ3B1 X2RwbV9nZXRfdmJsYW5rX3RpbWUoYWRldik7Ci0JdTMyIHN3aXRjaF9saW1pdCA9IGFkZXYtPmdt Yy52cmFtX3R5cGUgPT0gQU1ER1BVX1ZSQU1fVFlQRV9HRERSNSA/IDQ1MCA6IDMwMDsKLQotCS8q IGRpc2FibGUgbWNsayBzd2l0Y2hpbmcgaWYgdGhlIHJlZnJlc2ggaXMgPjEyMEh6LCBldmVuIGlm IHRoZQotCSAqIGJsYW5raW5nIHBlcmlvZCB3b3VsZCBhbGxvdyBpdAotCSAqLwotCWlmIChhbWRn cHVfZHBtX2dldF92cmVmcmVzaChhZGV2KSA+IDEyMCkKLQkJcmV0dXJuIHRydWU7Ci0KLQlpZiAo dmJsYW5rX3RpbWUgPCBzd2l0Y2hfbGltaXQpCi0JCXJldHVybiB0cnVlOwotCWVsc2UKLQkJcmV0 dXJuIGZhbHNlOwotCi19Ci0KLXN0YXRpYyB2b2lkIGNpX2FwcGx5X3N0YXRlX2FkanVzdF9ydWxl cyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJc3RydWN0IGFtZGdwdV9wcyAqcnBz KQotewotCXN0cnVjdCBjaV9wcyAqcHMgPSBjaV9nZXRfcHMocnBzKTsKLQlzdHJ1Y3QgY2lfcG93 ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0IGFtZGdwdV9jbG9ja19hbmRf dm9sdGFnZV9saW1pdHMgKm1heF9saW1pdHM7Ci0JYm9vbCBkaXNhYmxlX21jbGtfc3dpdGNoaW5n OwotCXUzMiBzY2xrLCBtY2xrOwotCWludCBpOwotCi0JaWYgKHJwcy0+dmNlX2FjdGl2ZSkgewot CQlycHMtPmV2Y2xrID0gYWRldi0+cG0uZHBtLnZjZV9zdGF0ZXNbYWRldi0+cG0uZHBtLnZjZV9s ZXZlbF0uZXZjbGs7Ci0JCXJwcy0+ZWNjbGsgPSBhZGV2LT5wbS5kcG0udmNlX3N0YXRlc1thZGV2 LT5wbS5kcG0udmNlX2xldmVsXS5lY2NsazsKLQl9IGVsc2UgewotCQlycHMtPmV2Y2xrID0gMDsK LQkJcnBzLT5lY2NsayA9IDA7Ci0JfQotCi0JaWYgKChhZGV2LT5wbS5kcG0ubmV3X2FjdGl2ZV9j cnRjX2NvdW50ID4gMSkgfHwKLQkgICAgY2lfZHBtX3ZibGFua190b29fc2hvcnQoYWRldikpCi0J CWRpc2FibGVfbWNsa19zd2l0Y2hpbmcgPSB0cnVlOwotCWVsc2UKLQkJZGlzYWJsZV9tY2xrX3N3 aXRjaGluZyA9IGZhbHNlOwotCi0JaWYgKChycHMtPmNsYXNzICYgQVRPTV9QUExJQl9DTEFTU0lG SUNBVElPTl9VSV9NQVNLKSA9PSBBVE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX0JBVFRFUlkp Ci0JCXBpLT5iYXR0ZXJ5X3N0YXRlID0gdHJ1ZTsKLQllbHNlCi0JCXBpLT5iYXR0ZXJ5X3N0YXRl ID0gZmFsc2U7Ci0KLQlpZiAoYWRldi0+cG0uYWNfcG93ZXIpCi0JCW1heF9saW1pdHMgPSAmYWRl di0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYzsKLQllbHNlCi0JCW1h eF9saW1pdHMgPSAmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9k YzsKLQotCWlmIChhZGV2LT5wbS5hY19wb3dlciA9PSBmYWxzZSkgewotCQlmb3IgKGkgPSAwOyBp IDwgcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50OyBpKyspIHsKLQkJCWlmIChwcy0+cGVyZm9y bWFuY2VfbGV2ZWxzW2ldLm1jbGsgPiBtYXhfbGltaXRzLT5tY2xrKQotCQkJCXBzLT5wZXJmb3Jt YW5jZV9sZXZlbHNbaV0ubWNsayA9IG1heF9saW1pdHMtPm1jbGs7Ci0JCQlpZiAocHMtPnBlcmZv cm1hbmNlX2xldmVsc1tpXS5zY2xrID4gbWF4X2xpbWl0cy0+c2NsaykKLQkJCQlwcy0+cGVyZm9y bWFuY2VfbGV2ZWxzW2ldLnNjbGsgPSBtYXhfbGltaXRzLT5zY2xrOwotCQl9Ci0JfQotCi0JLyog WFhYIHZhbGlkYXRlIHRoZSBtaW4gY2xvY2tzIHJlcXVpcmVkIGZvciBkaXNwbGF5ICovCi0KLQlp ZiAoZGlzYWJsZV9tY2xrX3N3aXRjaGluZykgewotCQltY2xrICA9IHBzLT5wZXJmb3JtYW5jZV9s ZXZlbHNbcHMtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50IC0gMV0ubWNsazsKLQkJc2NsayA9IHBz LT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0uc2NsazsKLQl9IGVsc2UgewotCQltY2xrID0gcHMtPnBl cmZvcm1hbmNlX2xldmVsc1swXS5tY2xrOwotCQlzY2xrID0gcHMtPnBlcmZvcm1hbmNlX2xldmVs c1swXS5zY2xrOwotCX0KLQotCWlmIChhZGV2LT5wbS5wbV9kaXNwbGF5X2NmZy5taW5fY29yZV9z ZXRfY2xvY2sgPiBzY2xrKQotCQlzY2xrID0gYWRldi0+cG0ucG1fZGlzcGxheV9jZmcubWluX2Nv cmVfc2V0X2Nsb2NrOwotCi0JaWYgKGFkZXYtPnBtLnBtX2Rpc3BsYXlfY2ZnLm1pbl9tZW1fc2V0 X2Nsb2NrID4gbWNsaykKLQkJbWNsayA9IGFkZXYtPnBtLnBtX2Rpc3BsYXlfY2ZnLm1pbl9tZW1f c2V0X2Nsb2NrOwotCi0JaWYgKHJwcy0+dmNlX2FjdGl2ZSkgewotCQlpZiAoc2NsayA8IGFkZXYt PnBtLmRwbS52Y2Vfc3RhdGVzW2FkZXYtPnBtLmRwbS52Y2VfbGV2ZWxdLnNjbGspCi0JCQlzY2xr ID0gYWRldi0+cG0uZHBtLnZjZV9zdGF0ZXNbYWRldi0+cG0uZHBtLnZjZV9sZXZlbF0uc2NsazsK LQkJaWYgKG1jbGsgPCBhZGV2LT5wbS5kcG0udmNlX3N0YXRlc1thZGV2LT5wbS5kcG0udmNlX2xl dmVsXS5tY2xrKQotCQkJbWNsayA9IGFkZXYtPnBtLmRwbS52Y2Vfc3RhdGVzW2FkZXYtPnBtLmRw bS52Y2VfbGV2ZWxdLm1jbGs7Ci0JfQotCi0JcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5zY2xr ID0gc2NsazsKLQlwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLm1jbGsgPSBtY2xrOwotCi0JaWYg KHBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMV0uc2NsayA8IHBzLT5wZXJmb3JtYW5jZV9sZXZlbHNb MF0uc2NsaykKLQkJcHMtPnBlcmZvcm1hbmNlX2xldmVsc1sxXS5zY2xrID0gcHMtPnBlcmZvcm1h bmNlX2xldmVsc1swXS5zY2xrOwotCi0JaWYgKGRpc2FibGVfbWNsa19zd2l0Y2hpbmcpIHsKLQkJ aWYgKHBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWNsayA8IHBzLT5wZXJmb3JtYW5jZV9sZXZl bHNbMV0ubWNsaykKLQkJCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0ubWNsayA9IHBzLT5wZXJm b3JtYW5jZV9sZXZlbHNbMV0ubWNsazsKLQl9IGVsc2UgewotCQlpZiAocHMtPnBlcmZvcm1hbmNl X2xldmVsc1sxXS5tY2xrIDwgcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5tY2xrKQotCQkJcHMt PnBlcmZvcm1hbmNlX2xldmVsc1sxXS5tY2xrID0gcHMtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5t Y2xrOwotCX0KLX0KLQotc3RhdGljIGludCBjaV90aGVybWFsX3NldF90ZW1wZXJhdHVyZV9yYW5n ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJICAgIGludCBtaW5fdGVtcCwgaW50 IG1heF90ZW1wKQotewotCWludCBsb3dfdGVtcCA9IDAgKiAxMDAwOwotCWludCBoaWdoX3RlbXAg PSAyNTUgKiAxMDAwOwotCXUzMiB0bXA7Ci0KLQlpZiAobG93X3RlbXAgPCBtaW5fdGVtcCkKLQkJ bG93X3RlbXAgPSBtaW5fdGVtcDsKLQlpZiAoaGlnaF90ZW1wID4gbWF4X3RlbXApCi0JCWhpZ2hf dGVtcCA9IG1heF90ZW1wOwotCWlmIChoaWdoX3RlbXAgPCBsb3dfdGVtcCkgewotCQlEUk1fRVJS T1IoImludmFsaWQgdGhlcm1hbCByYW5nZTogJWQgLSAlZFxuIiwgbG93X3RlbXAsIGhpZ2hfdGVt cCk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXRtcCA9IFJSRUczMl9TTUMoaXhDR19USEVS TUFMX0lOVCk7Ci0JdG1wICY9IH4oQ0dfVEhFUk1BTF9JTlRfX0RJR19USEVSTV9JTlRIX01BU0sg fCBDR19USEVSTUFMX0lOVF9fRElHX1RIRVJNX0lOVExfTUFTSyk7Ci0JdG1wIHw9ICgoaGlnaF90 ZW1wIC8gMTAwMCkgPDwgQ0dfVEhFUk1BTF9JTlRfX0RJR19USEVSTV9JTlRIX19TSElGVCkgfAot CQkoKGxvd190ZW1wIC8gMTAwMCkpIDw8IENHX1RIRVJNQUxfSU5UX19ESUdfVEhFUk1fSU5UTF9f U0hJRlQ7Ci0JV1JFRzMyX1NNQyhpeENHX1RIRVJNQUxfSU5ULCB0bXApOwotCi0jaWYgMAotCS8q IFhYWDogbmVlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBoYW5kbGUgdGhpcyBwcm9wZXJseSAqLwot CXRtcCA9IFJSRUczMl9TTUMoaXhDR19USEVSTUFMX0NUUkwpOwotCXRtcCAmPSBESUdfVEhFUk1f RFBNX01BU0s7Ci0JdG1wIHw9IERJR19USEVSTV9EUE0oaGlnaF90ZW1wIC8gMTAwMCk7Ci0JV1JF RzMyX1NNQyhpeENHX1RIRVJNQUxfQ1RSTCwgdG1wKTsKLSNlbmRpZgotCi0JYWRldi0+cG0uZHBt LnRoZXJtYWwubWluX3RlbXAgPSBsb3dfdGVtcDsKLQlhZGV2LT5wbS5kcG0udGhlcm1hbC5tYXhf dGVtcCA9IGhpZ2hfdGVtcDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV90aGVybWFs X2VuYWJsZV9hbGVydChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkgICBib29sIGVu YWJsZSkKLXsKLQl1MzIgdGhlcm1hbF9pbnQgPSBSUkVHMzJfU01DKGl4Q0dfVEhFUk1BTF9JTlQp OwotCVBQU01DX1Jlc3VsdCByZXN1bHQ7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXRoZXJtYWxfaW50 ICY9IH4oQ0dfVEhFUk1BTF9JTlRfQ1RSTF9fVEhFUk1fSU5USF9NQVNLX01BU0sgfAotCQkJCSBD R19USEVSTUFMX0lOVF9DVFJMX19USEVSTV9JTlRMX01BU0tfTUFTSyk7Ci0JCVdSRUczMl9TTUMo aXhDR19USEVSTUFMX0lOVCwgdGhlcm1hbF9pbnQpOwotCQlyZXN1bHQgPSBhbWRncHVfY2lfc2Vu ZF9tc2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19UaGVybWFsX0NudGxfRW5hYmxlKTsKLQkJaWYg KHJlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spIHsKLQkJCURSTV9ERUJVR19LTVMoIkNvdWxkIG5v dCBlbmFibGUgdGhlcm1hbCBpbnRlcnJ1cHRzLlxuIik7Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJ fQotCX0gZWxzZSB7Ci0JCXRoZXJtYWxfaW50IHw9IENHX1RIRVJNQUxfSU5UX0NUUkxfX1RIRVJN X0lOVEhfTUFTS19NQVNLIHwKLQkJCUNHX1RIRVJNQUxfSU5UX0NUUkxfX1RIRVJNX0lOVExfTUFT S19NQVNLOwotCQlXUkVHMzJfU01DKGl4Q0dfVEhFUk1BTF9JTlQsIHRoZXJtYWxfaW50KTsKLQkJ cmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfVGhlcm1h bF9DbnRsX0Rpc2FibGUpOwotCQlpZiAocmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykgewotCQkJ RFJNX0RFQlVHX0tNUygiQ291bGQgbm90IGRpc2FibGUgdGhlcm1hbCBpbnRlcnJ1cHRzLlxuIik7 Ci0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMg dm9pZCBjaV9mYW5fY3RybF9zZXRfc3RhdGljX21vZGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYsIHUzMiBtb2RlKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShh ZGV2KTsKLQl1MzIgdG1wOwotCi0JaWYgKHBpLT5mYW5fY3RybF9pc19pbl9kZWZhdWx0X21vZGUp IHsKLQkJdG1wID0gKFJSRUczMl9TTUMoaXhDR19GRE9fQ1RSTDIpICYgQ0dfRkRPX0NUUkwyX19G RE9fUFdNX01PREVfTUFTSykKLQkJCT4+IENHX0ZET19DVFJMMl9fRkRPX1BXTV9NT0RFX19TSElG VDsKLQkJcGktPmZhbl9jdHJsX2RlZmF1bHRfbW9kZSA9IHRtcDsKLQkJdG1wID0gKFJSRUczMl9T TUMoaXhDR19GRE9fQ1RSTDIpICYgQ0dfRkRPX0NUUkwyX19UTUlOX01BU0spCi0JCQk+PiBDR19G RE9fQ1RSTDJfX1RNSU5fX1NISUZUOwotCQlwaS0+dF9taW4gPSB0bXA7Ci0JCXBpLT5mYW5fY3Ry bF9pc19pbl9kZWZhdWx0X21vZGUgPSBmYWxzZTsKLQl9Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4 Q0dfRkRPX0NUUkwyKSAmIH5DR19GRE9fQ1RSTDJfX1RNSU5fTUFTSzsKLQl0bXAgfD0gMCA8PCBD R19GRE9fQ1RSTDJfX1RNSU5fX1NISUZUOwotCVdSRUczMl9TTUMoaXhDR19GRE9fQ1RSTDIsIHRt cCk7Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwyKSAmIH5DR19GRE9fQ1RSTDJf X0ZET19QV01fTU9ERV9NQVNLOwotCXRtcCB8PSBtb2RlIDw8IENHX0ZET19DVFJMMl9fRkRPX1BX TV9NT0RFX19TSElGVDsKLQlXUkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwyLCB0bXApOwotfQotCi1z dGF0aWMgaW50IGNpX3RoZXJtYWxfc2V0dXBfZmFuX3RhYmxlKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsK LQlTTVU3X0Rpc2NyZXRlX0ZhblRhYmxlIGZhbl90YWJsZSA9IHsgRkRPX01PREVfSEFSRFdBUkUg fTsKLQl1MzIgZHV0eTEwMDsKLQl1MzIgdF9kaWZmMSwgdF9kaWZmMiwgcHdtX2RpZmYxLCBwd21f ZGlmZjI7Ci0JdTE2IGZkb19taW4sIHNsb3BlMSwgc2xvcGUyOwotCXUzMiByZWZlcmVuY2VfY2xv Y2ssIHRtcDsKLQlpbnQgcmV0OwotCXU2NCB0bXA2NDsKLQotCWlmICghcGktPmZhbl90YWJsZV9z dGFydCkgewotCQlhZGV2LT5wbS5kcG0uZmFuLnVjb2RlX2Zhbl9jb250cm9sID0gZmFsc2U7Ci0J CXJldHVybiAwOwotCX0KLQotCWR1dHkxMDAgPSAoUlJFRzMyX1NNQyhpeENHX0ZET19DVFJMMSkg JiBDR19GRE9fQ1RSTDFfX0ZNQVhfRFVUWTEwMF9NQVNLKQotCQk+PiBDR19GRE9fQ1RSTDFfX0ZN QVhfRFVUWTEwMF9fU0hJRlQ7Ci0KLQlpZiAoZHV0eTEwMCA9PSAwKSB7Ci0JCWFkZXYtPnBtLmRw bS5mYW4udWNvZGVfZmFuX2NvbnRyb2wgPSBmYWxzZTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JdG1w NjQgPSAodTY0KWFkZXYtPnBtLmRwbS5mYW4ucHdtX21pbiAqIGR1dHkxMDA7Ci0JZG9fZGl2KHRt cDY0LCAxMDAwMCk7Ci0JZmRvX21pbiA9ICh1MTYpdG1wNjQ7Ci0KLQl0X2RpZmYxID0gYWRldi0+ cG0uZHBtLmZhbi50X21lZCAtIGFkZXYtPnBtLmRwbS5mYW4udF9taW47Ci0JdF9kaWZmMiA9IGFk ZXYtPnBtLmRwbS5mYW4udF9oaWdoIC0gYWRldi0+cG0uZHBtLmZhbi50X21lZDsKLQotCXB3bV9k aWZmMSA9IGFkZXYtPnBtLmRwbS5mYW4ucHdtX21lZCAtIGFkZXYtPnBtLmRwbS5mYW4ucHdtX21p bjsKLQlwd21fZGlmZjIgPSBhZGV2LT5wbS5kcG0uZmFuLnB3bV9oaWdoIC0gYWRldi0+cG0uZHBt LmZhbi5wd21fbWVkOwotCi0Jc2xvcGUxID0gKHUxNikoKDUwICsgKCgxNiAqIGR1dHkxMDAgKiBw d21fZGlmZjEpIC8gdF9kaWZmMSkpIC8gMTAwKTsKLQlzbG9wZTIgPSAodTE2KSgoNTAgKyAoKDE2 ICogZHV0eTEwMCAqIHB3bV9kaWZmMikgLyB0X2RpZmYyKSkgLyAxMDApOwotCi0JZmFuX3RhYmxl LlRlbXBNaW4gPSBjcHVfdG9fYmUxNigoNTAgKyBhZGV2LT5wbS5kcG0uZmFuLnRfbWluKSAvIDEw MCk7Ci0JZmFuX3RhYmxlLlRlbXBNZWQgPSBjcHVfdG9fYmUxNigoNTAgKyBhZGV2LT5wbS5kcG0u ZmFuLnRfbWVkKSAvIDEwMCk7Ci0JZmFuX3RhYmxlLlRlbXBNYXggPSBjcHVfdG9fYmUxNigoNTAg KyBhZGV2LT5wbS5kcG0uZmFuLnRfbWF4KSAvIDEwMCk7Ci0KLQlmYW5fdGFibGUuU2xvcGUxID0g Y3B1X3RvX2JlMTYoc2xvcGUxKTsKLQlmYW5fdGFibGUuU2xvcGUyID0gY3B1X3RvX2JlMTYoc2xv cGUyKTsKLQotCWZhbl90YWJsZS5GZG9NaW4gPSBjcHVfdG9fYmUxNihmZG9fbWluKTsKLQotCWZh bl90YWJsZS5IeXN0RG93biA9IGNwdV90b19iZTE2KGFkZXYtPnBtLmRwbS5mYW4udF9oeXN0KTsK LQotCWZhbl90YWJsZS5IeXN0VXAgPSBjcHVfdG9fYmUxNigxKTsKLQotCWZhbl90YWJsZS5IeXN0 U2xvcGUgPSBjcHVfdG9fYmUxNigxKTsKLQotCWZhbl90YWJsZS5UZW1wUmVzcExpbSA9IGNwdV90 b19iZTE2KDUpOwotCi0JcmVmZXJlbmNlX2Nsb2NrID0gYW1kZ3B1X2FzaWNfZ2V0X3hjbGsoYWRl dik7Ci0KLQlmYW5fdGFibGUuUmVmcmVzaFBlcmlvZCA9IGNwdV90b19iZTMyKChhZGV2LT5wbS5k cG0uZmFuLmN5Y2xlX2RlbGF5ICoKLQkJCQkJICAgICAgIHJlZmVyZW5jZV9jbG9jaykgLyAxNjAw KTsKLQotCWZhbl90YWJsZS5GZG9NYXggPSBjcHVfdG9fYmUxNigodTE2KWR1dHkxMDApOwotCi0J dG1wID0gKFJSRUczMl9TTUMoaXhDR19NVUxUX1RIRVJNQUxfQ1RSTCkgJiBDR19NVUxUX1RIRVJN QUxfQ1RSTF9fVEVNUF9TRUxfTUFTSykKLQkJPj4gQ0dfTVVMVF9USEVSTUFMX0NUUkxfX1RFTVBf U0VMX19TSElGVDsKLQlmYW5fdGFibGUuVGVtcFNyYyA9ICh1aW50OF90KXRtcDsKLQotCXJldCA9 IGFtZGdwdV9jaV9jb3B5X2J5dGVzX3RvX3NtYyhhZGV2LAotCQkJCQkgIHBpLT5mYW5fdGFibGVf c3RhcnQsCi0JCQkJCSAgKHU4ICopKCZmYW5fdGFibGUpLAotCQkJCQkgIHNpemVvZihmYW5fdGFi bGUpLAotCQkJCQkgIHBpLT5zcmFtX2VuZCk7Ci0KLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigi RmFpbGVkIHRvIGxvYWQgZmFuIHRhYmxlIHRvIHRoZSBTTUMuIik7Ci0JCWFkZXYtPnBtLmRwbS5m YW4udWNvZGVfZmFuX2NvbnRyb2wgPSBmYWxzZTsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3Rh dGljIGludCBjaV9mYW5fY3RybF9zdGFydF9zbWNfZmFuX2NvbnRyb2woc3RydWN0IGFtZGdwdV9k ZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFk ZXYpOwotCVBQU01DX1Jlc3VsdCByZXQ7Ci0KLQlpZiAocGktPmNhcHNfb2RfZnV6enlfZmFuX2Nv bnRyb2xfc3VwcG9ydCkgewotCQlyZXQgPSBhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhf cGFyYW1ldGVyKGFkZXYsCi0JCQkJCQkJICAgICAgIFBQU01DX1N0YXJ0RmFuQ29udHJvbCwKLQkJ CQkJCQkgICAgICAgRkFOX0NPTlRST0xfRlVaWlkpOwotCQlpZiAocmV0ICE9IFBQU01DX1Jlc3Vs dF9PSykKLQkJCXJldHVybiAtRUlOVkFMOwotCQlyZXQgPSBhbWRncHVfY2lfc2VuZF9tc2dfdG9f c21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsCi0JCQkJCQkJICAgICAgIFBQU01DX01TR19TZXRGYW5Q d21NYXgsCi0JCQkJCQkJICAgICAgIGFkZXYtPnBtLmRwbS5mYW4uZGVmYXVsdF9tYXhfZmFuX3B3 bSk7Ci0JCWlmIChyZXQgIT0gUFBTTUNfUmVzdWx0X09LKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0J fSBlbHNlIHsKLQkJcmV0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRl cihhZGV2LAotCQkJCQkJCSAgICAgICBQUFNNQ19TdGFydEZhbkNvbnRyb2wsCi0JCQkJCQkJICAg ICAgIEZBTl9DT05UUk9MX1RBQkxFKTsKLQkJaWYgKHJldCAhPSBQUFNNQ19SZXN1bHRfT0spCi0J CQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlwaS0+ZmFuX2lzX2NvbnRyb2xsZWRfYnlfc21jID0g dHJ1ZTsKLQlyZXR1cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNpX2Zhbl9jdHJsX3N0b3Bfc21j X2Zhbl9jb250cm9sKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCVBQU01DX1Jlc3Vs dCByZXQ7Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0J cmV0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19TdG9wRmFuQ29udHJv bCk7Ci0JaWYgKHJldCA9PSBQUFNNQ19SZXN1bHRfT0spIHsKLQkJcGktPmZhbl9pc19jb250cm9s bGVkX2J5X3NtYyA9IGZhbHNlOwotCQlyZXR1cm4gMDsKLQl9IGVsc2UgewotCQlyZXR1cm4gLUVJ TlZBTDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX2dldF9mYW5fc3BlZWRfcGVyY2VudCh2 b2lkICpoYW5kbGUsCi0JCQkJCXUzMiAqc3BlZWQpCi17Ci0JdTMyIGR1dHksIGR1dHkxMDA7Ci0J dTY0IHRtcDY0OwotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVf ZGV2aWNlICopaGFuZGxlOwotCi0JaWYgKGFkZXYtPnBtLm5vX2ZhbikKLQkJcmV0dXJuIC1FTk9F TlQ7Ci0KLQlkdXR5MTAwID0gKFJSRUczMl9TTUMoaXhDR19GRE9fQ1RSTDEpICYgQ0dfRkRPX0NU UkwxX19GTUFYX0RVVFkxMDBfTUFTSykKLQkJPj4gQ0dfRkRPX0NUUkwxX19GTUFYX0RVVFkxMDBf X1NISUZUOwotCWR1dHkgPSAoUlJFRzMyX1NNQyhpeENHX1RIRVJNQUxfU1RBVFVTKSAmIENHX1RI RVJNQUxfU1RBVFVTX19GRE9fUFdNX0RVVFlfTUFTSykKLQkJPj4gQ0dfVEhFUk1BTF9TVEFUVVNf X0ZET19QV01fRFVUWV9fU0hJRlQ7Ci0KLQlpZiAoZHV0eTEwMCA9PSAwKQotCQlyZXR1cm4gLUVJ TlZBTDsKLQotCXRtcDY0ID0gKHU2NClkdXR5ICogMTAwOwotCWRvX2Rpdih0bXA2NCwgZHV0eTEw MCk7Ci0JKnNwZWVkID0gKHUzMil0bXA2NDsKLQotCWlmICgqc3BlZWQgPiAxMDApCi0JCSpzcGVl ZCA9IDEwMDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV9zZXRfZmFuX3Nw ZWVkX3BlcmNlbnQodm9pZCAqaGFuZGxlLAotCQkJCQl1MzIgc3BlZWQpCi17Ci0JdTMyIHRtcDsK LQl1MzIgZHV0eSwgZHV0eTEwMDsKLQl1NjQgdG1wNjQ7Ci0Jc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0Jc3RydWN0IGNpX3Bvd2Vy X2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JaWYgKGFkZXYtPnBtLm5vX2ZhbikKLQkJ cmV0dXJuIC1FTk9FTlQ7Ci0KLQlpZiAocGktPmZhbl9pc19jb250cm9sbGVkX2J5X3NtYykKLQkJ cmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAoc3BlZWQgPiAxMDApCi0JCXJldHVybiAtRUlOVkFMOwot Ci0JZHV0eTEwMCA9IChSUkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwxKSAmIENHX0ZET19DVFJMMV9f Rk1BWF9EVVRZMTAwX01BU0spCi0JCT4+IENHX0ZET19DVFJMMV9fRk1BWF9EVVRZMTAwX19TSElG VDsKLQotCWlmIChkdXR5MTAwID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0JdG1wNjQgPSAo dTY0KXNwZWVkICogZHV0eTEwMDsKLQlkb19kaXYodG1wNjQsIDEwMCk7Ci0JZHV0eSA9ICh1MzIp dG1wNjQ7Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwwKSAmIH5DR19GRE9fQ1RS TDBfX0ZET19TVEFUSUNfRFVUWV9NQVNLOwotCXRtcCB8PSBkdXR5IDw8IENHX0ZET19DVFJMMF9f RkRPX1NUQVRJQ19EVVRZX19TSElGVDsKLQlXUkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwwLCB0bXAp OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2RwbV9zZXRfZmFuX2NvbnRyb2xf bW9kZSh2b2lkICpoYW5kbGUsIHUzMiBtb2RlKQotewotCXN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOwotCi0Jc3dpdGNoIChtb2RlKSB7 Ci0JY2FzZSBBTURfRkFOX0NUUkxfTk9ORToKLQkJaWYgKGFkZXYtPnBtLmRwbS5mYW4udWNvZGVf ZmFuX2NvbnRyb2wpCi0JCQljaV9mYW5fY3RybF9zdG9wX3NtY19mYW5fY29udHJvbChhZGV2KTsK LQkJY2lfZHBtX3NldF9mYW5fc3BlZWRfcGVyY2VudChhZGV2LCAxMDApOwotCQlicmVhazsKLQlj YXNlIEFNRF9GQU5fQ1RSTF9NQU5VQUw6Ci0JCWlmIChhZGV2LT5wbS5kcG0uZmFuLnVjb2RlX2Zh bl9jb250cm9sKQotCQkJY2lfZmFuX2N0cmxfc3RvcF9zbWNfZmFuX2NvbnRyb2woYWRldik7Ci0J CWJyZWFrOwotCWNhc2UgQU1EX0ZBTl9DVFJMX0FVVE86Ci0JCWlmIChhZGV2LT5wbS5kcG0uZmFu LnVjb2RlX2Zhbl9jb250cm9sKQotCQkJY2lfdGhlcm1hbF9zdGFydF9zbWNfZmFuX2NvbnRyb2wo YWRldik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIHUz MiBjaV9kcG1fZ2V0X2Zhbl9jb250cm9sX21vZGUodm9pZCAqaGFuZGxlKQotewotCXN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOwotCXN0 cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQotCWlmIChwaS0+ZmFu X2lzX2NvbnRyb2xsZWRfYnlfc21jKQotCQlyZXR1cm4gQU1EX0ZBTl9DVFJMX0FVVE87Ci0JZWxz ZQotCQlyZXR1cm4gQU1EX0ZBTl9DVFJMX01BTlVBTDsKLX0KLQotI2lmIDAKLXN0YXRpYyBpbnQg Y2lfZmFuX2N0cmxfZ2V0X2Zhbl9zcGVlZF9ycG0oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYs Ci0JCQkJCSB1MzIgKnNwZWVkKQotewotCXUzMiB0YWNoX3BlcmlvZDsKLQl1MzIgeGNsayA9IGFt ZGdwdV9hc2ljX2dldF94Y2xrKGFkZXYpOwotCi0JaWYgKGFkZXYtPnBtLm5vX2ZhbikKLQkJcmV0 dXJuIC1FTk9FTlQ7Ci0KLQlpZiAoYWRldi0+cG0uZmFuX3B1bHNlc19wZXJfcmV2b2x1dGlvbiA9 PSAwKQotCQlyZXR1cm4gLUVOT0VOVDsKLQotCXRhY2hfcGVyaW9kID0gKFJSRUczMl9TTUMoaXhD R19UQUNIX1NUQVRVUykgJiBDR19UQUNIX1NUQVRVU19fVEFDSF9QRVJJT0RfTUFTSykKLQkJPj4g Q0dfVEFDSF9TVEFUVVNfX1RBQ0hfUEVSSU9EX19TSElGVDsKLQlpZiAodGFjaF9wZXJpb2QgPT0g MCkKLQkJcmV0dXJuIC1FTk9FTlQ7Ci0KLQkqc3BlZWQgPSA2MCAqIHhjbGsgKiAxMDAwMCAvIHRh Y2hfcGVyaW9kOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZmFuX2N0cmxfc2V0 X2Zhbl9zcGVlZF9ycG0oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJCSB1MzIgc3Bl ZWQpCi17Ci0JdTMyIHRhY2hfcGVyaW9kLCB0bXA7Ci0JdTMyIHhjbGsgPSBhbWRncHVfYXNpY19n ZXRfeGNsayhhZGV2KTsKLQotCWlmIChhZGV2LT5wbS5ub19mYW4pCi0JCXJldHVybiAtRU5PRU5U OwotCi0JaWYgKGFkZXYtPnBtLmZhbl9wdWxzZXNfcGVyX3Jldm9sdXRpb24gPT0gMCkKLQkJcmV0 dXJuIC1FTk9FTlQ7Ci0KLQlpZiAoKHNwZWVkIDwgYWRldi0+cG0uZmFuX21pbl9ycG0pIHx8Ci0J ICAgIChzcGVlZCA+IGFkZXYtPnBtLmZhbl9tYXhfcnBtKSkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0K LQlpZiAoYWRldi0+cG0uZHBtLmZhbi51Y29kZV9mYW5fY29udHJvbCkKLQkJY2lfZmFuX2N0cmxf c3RvcF9zbWNfZmFuX2NvbnRyb2woYWRldik7Ci0KLQl0YWNoX3BlcmlvZCA9IDYwICogeGNsayAq IDEwMDAwIC8gKDggKiBzcGVlZCk7Ci0JdG1wID0gUlJFRzMyX1NNQyhpeENHX1RBQ0hfQ1RSTCkg JiB+Q0dfVEFDSF9DVFJMX19UQVJHRVRfUEVSSU9EX01BU0s7Ci0JdG1wIHw9IHRhY2hfcGVyaW9k IDw8IENHX1RBQ0hfQ1RSTF9fVEFSR0VUX1BFUklPRF9fU0hJRlQ7Ci0JV1JFRzMyX1NNQyhDR19U QUNIX0NUUkwsIHRtcCk7Ci0KLQljaV9mYW5fY3RybF9zZXRfc3RhdGljX21vZGUoYWRldiwgRkRP X1BXTV9NT0RFX1NUQVRJQ19SUE0pOwotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGlj IHZvaWQgY2lfZmFuX2N0cmxfc2V0X2RlZmF1bHRfbW9kZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0J dTMyIHRtcDsKLQotCWlmICghcGktPmZhbl9jdHJsX2lzX2luX2RlZmF1bHRfbW9kZSkgewotCQl0 bXAgPSBSUkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwyKSAmIH5DR19GRE9fQ1RSTDJfX0ZET19QV01f TU9ERV9NQVNLOwotCQl0bXAgfD0gcGktPmZhbl9jdHJsX2RlZmF1bHRfbW9kZSA8PCBDR19GRE9f Q1RSTDJfX0ZET19QV01fTU9ERV9fU0hJRlQ7Ci0JCVdSRUczMl9TTUMoaXhDR19GRE9fQ1RSTDIs IHRtcCk7Ci0KLQkJdG1wID0gUlJFRzMyX1NNQyhpeENHX0ZET19DVFJMMikgJiB+Q0dfRkRPX0NU UkwyX19UTUlOX01BU0s7Ci0JCXRtcCB8PSBwaS0+dF9taW4gPDwgQ0dfRkRPX0NUUkwyX19UTUlO X19TSElGVDsKLQkJV1JFRzMyX1NNQyhpeENHX0ZET19DVFJMMiwgdG1wKTsKLQkJcGktPmZhbl9j dHJsX2lzX2luX2RlZmF1bHRfbW9kZSA9IHRydWU7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV90 aGVybWFsX3N0YXJ0X3NtY19mYW5fY29udHJvbChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikK LXsKLQlpZiAoYWRldi0+cG0uZHBtLmZhbi51Y29kZV9mYW5fY29udHJvbCkgewotCQljaV9mYW5f Y3RybF9zdGFydF9zbWNfZmFuX2NvbnRyb2woYWRldik7Ci0JCWNpX2Zhbl9jdHJsX3NldF9zdGF0 aWNfbW9kZShhZGV2LCBGRE9fUFdNX01PREVfU1RBVElDKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lk IGNpX3RoZXJtYWxfaW5pdGlhbGl6ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1 MzIgdG1wOwotCi0JaWYgKGFkZXYtPnBtLmZhbl9wdWxzZXNfcGVyX3Jldm9sdXRpb24pIHsKLQkJ dG1wID0gUlJFRzMyX1NNQyhpeENHX1RBQ0hfQ1RSTCkgJiB+Q0dfVEFDSF9DVFJMX19FREdFX1BF Ul9SRVZfTUFTSzsKLQkJdG1wIHw9IChhZGV2LT5wbS5mYW5fcHVsc2VzX3Blcl9yZXZvbHV0aW9u IC0gMSkKLQkJCTw8IENHX1RBQ0hfQ1RSTF9fRURHRV9QRVJfUkVWX19TSElGVDsKLQkJV1JFRzMy X1NNQyhpeENHX1RBQ0hfQ1RSTCwgdG1wKTsKLQl9Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4Q0df RkRPX0NUUkwyKSAmIH5DR19GRE9fQ1RSTDJfX1RBQ0hfUFdNX1JFU1BfUkFURV9NQVNLOwotCXRt cCB8PSAweDI4IDw8IENHX0ZET19DVFJMMl9fVEFDSF9QV01fUkVTUF9SQVRFX19TSElGVDsKLQlX UkVHMzJfU01DKGl4Q0dfRkRPX0NUUkwyLCB0bXApOwotfQotCi1zdGF0aWMgaW50IGNpX3RoZXJt YWxfc3RhcnRfdGhlcm1hbF9jb250cm9sbGVyKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQot ewotCWludCByZXQ7Ci0KLQljaV90aGVybWFsX2luaXRpYWxpemUoYWRldik7Ci0JcmV0ID0gY2lf dGhlcm1hbF9zZXRfdGVtcGVyYXR1cmVfcmFuZ2UoYWRldiwgQ0lTTEFORFNfVEVNUF9SQU5HRV9N SU4sIENJU0xBTkRTX1RFTVBfUkFOR0VfTUFYKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0Owot CXJldCA9IGNpX3RoZXJtYWxfZW5hYmxlX2FsZXJ0KGFkZXYsIHRydWUpOwotCWlmIChyZXQpCi0J CXJldHVybiByZXQ7Ci0JaWYgKGFkZXYtPnBtLmRwbS5mYW4udWNvZGVfZmFuX2NvbnRyb2wpIHsK LQkJcmV0ID0gY2lfdGhlcm1hbF9zZXR1cF9mYW5fdGFibGUoYWRldik7Ci0JCWlmIChyZXQpCi0J CQlyZXR1cm4gcmV0OwotCQljaV90aGVybWFsX3N0YXJ0X3NtY19mYW5fY29udHJvbChhZGV2KTsK LQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2lfdGhlcm1hbF9zdG9wX3RoZXJt YWxfY29udHJvbGxlcihzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlpZiAoIWFkZXYt PnBtLm5vX2ZhbikKLQkJY2lfZmFuX2N0cmxfc2V0X2RlZmF1bHRfbW9kZShhZGV2KTsKLX0KLQot c3RhdGljIGludCBjaV9yZWFkX3NtY19zb2Z0X3JlZ2lzdGVyKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2LAotCQkJCSAgICAgdTE2IHJlZ19vZmZzZXQsIHUzMiAqdmFsdWUpCi17Ci0Jc3RydWN0 IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JcmV0dXJuIGFtZGdwdV9j aV9yZWFkX3NtY19zcmFtX2R3b3JkKGFkZXYsCi0JCQkJICAgICAgcGktPnNvZnRfcmVnc19zdGFy dCArIHJlZ19vZmZzZXQsCi0JCQkJICAgICAgdmFsdWUsIHBpLT5zcmFtX2VuZCk7Ci19Ci0KLXN0 YXRpYyBpbnQgY2lfd3JpdGVfc21jX3NvZnRfcmVnaXN0ZXIoc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYsCi0JCQkJICAgICAgdTE2IHJlZ19vZmZzZXQsIHUzMiB2YWx1ZSkKLXsKLQlzdHJ1Y3Qg Y2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0KLQlyZXR1cm4gYW1kZ3B1X2Np X3dyaXRlX3NtY19zcmFtX2R3b3JkKGFkZXYsCi0JCQkJICAgICAgIHBpLT5zb2Z0X3JlZ3Nfc3Rh cnQgKyByZWdfb2Zmc2V0LAotCQkJCSAgICAgICB2YWx1ZSwgcGktPnNyYW1fZW5kKTsKLX0KLQot c3RhdGljIHZvaWQgY2lfaW5pdF9mcHNfbGltaXRzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlTTVU3 X0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSA9ICZwaS0+c21jX3N0YXRlX3RhYmxlOwotCi0JaWYg KHBpLT5jYXBzX2ZwcykgewotCQl1MTYgdG1wOwotCi0JCXRtcCA9IDQ1OwotCQl0YWJsZS0+RnBz SGlnaFQgPSBjcHVfdG9fYmUxNih0bXApOwotCi0JCXRtcCA9IDMwOwotCQl0YWJsZS0+RnBzTG93 VCA9IGNwdV90b19iZTE2KHRtcCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNpX3VwZGF0ZV9zY2xr X3Qoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8g KnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCWludCByZXQgPSAwOwotCXUzMiBsb3dfc2Nsa19pbnRl cnJ1cHRfdCA9IDA7Ci0KLQlpZiAocGktPmNhcHNfc2Nsa190aHJvdHRsZV9sb3dfbm90aWZpY2F0 aW9uKSB7Ci0JCWxvd19zY2xrX2ludGVycnVwdF90ID0gY3B1X3RvX2JlMzIocGktPmxvd19zY2xr X2ludGVycnVwdF90KTsKLQotCQlyZXQgPSBhbWRncHVfY2lfY29weV9ieXRlc190b19zbWMoYWRl diwKLQkJCQkJICAgcGktPmRwbV90YWJsZV9zdGFydCArCi0JCQkJCSAgIG9mZnNldG9mKFNNVTdf RGlzY3JldGVfRHBtVGFibGUsIExvd1NjbGtJbnRlcnJ1cHRUKSwKLQkJCQkJICAgKHU4ICopJmxv d19zY2xrX2ludGVycnVwdF90LAotCQkJCQkgICBzaXplb2YodTMyKSwgcGktPnNyYW1fZW5kKTsK LQotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2dldF9sZWFrYWdlX3Zv bHRhZ2VzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9p bmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQl1MTYgbGVha2FnZV9pZCwgdmlydHVhbF92b2x0 YWdlX2lkOwotCXUxNiB2ZGRjLCB2ZGRjaTsKLQlpbnQgaTsKLQotCXBpLT52ZGRjX2xlYWthZ2Uu Y291bnQgPSAwOwotCXBpLT52ZGRjaV9sZWFrYWdlLmNvdW50ID0gMDsKLQotCWlmIChhZGV2LT5w bS5kcG0ucGxhdGZvcm1fY2FwcyAmIEFUT01fUFBfUExBVEZPUk1fQ0FQX0VWVikgewotCQlmb3Ig KGkgPSAwOyBpIDwgQ0lTTEFORFNfTUFYX0xFQUtBR0VfQ09VTlQ7IGkrKykgewotCQkJdmlydHVh bF92b2x0YWdlX2lkID0gQVRPTV9WSVJUVUFMX1ZPTFRBR0VfSUQwICsgaTsKLQkJCWlmIChhbWRn cHVfYXRvbWJpb3NfZ2V0X3ZvbHRhZ2VfZXZ2KGFkZXYsIHZpcnR1YWxfdm9sdGFnZV9pZCwgJnZk ZGMpICE9IDApCi0JCQkJY29udGludWU7Ci0JCQlpZiAodmRkYyAhPSAwICYmIHZkZGMgIT0gdmly dHVhbF92b2x0YWdlX2lkKSB7Ci0JCQkJcGktPnZkZGNfbGVha2FnZS5hY3R1YWxfdm9sdGFnZVtw aS0+dmRkY19sZWFrYWdlLmNvdW50XSA9IHZkZGM7Ci0JCQkJcGktPnZkZGNfbGVha2FnZS5sZWFr YWdlX2lkW3BpLT52ZGRjX2xlYWthZ2UuY291bnRdID0gdmlydHVhbF92b2x0YWdlX2lkOwotCQkJ CXBpLT52ZGRjX2xlYWthZ2UuY291bnQrKzsKLQkJCX0KLQkJfQotCX0gZWxzZSBpZiAoYW1kZ3B1 X2F0b21iaW9zX2dldF9sZWFrYWdlX2lkX2Zyb21fdmJpb3MoYWRldiwgJmxlYWthZ2VfaWQpID09 IDApIHsKLQkJZm9yIChpID0gMDsgaSA8IENJU0xBTkRTX01BWF9MRUFLQUdFX0NPVU5UOyBpKysp IHsKLQkJCXZpcnR1YWxfdm9sdGFnZV9pZCA9IEFUT01fVklSVFVBTF9WT0xUQUdFX0lEMCArIGk7 Ci0JCQlpZiAoYW1kZ3B1X2F0b21iaW9zX2dldF9sZWFrYWdlX3ZkZGNfYmFzZWRfb25fbGVha2Fn ZV9wYXJhbXMoYWRldiwgJnZkZGMsICZ2ZGRjaSwKLQkJCQkJCQkJCQkgICAgIHZpcnR1YWxfdm9s dGFnZV9pZCwKLQkJCQkJCQkJCQkgICAgIGxlYWthZ2VfaWQpID09IDApIHsKLQkJCQlpZiAodmRk YyAhPSAwICYmIHZkZGMgIT0gdmlydHVhbF92b2x0YWdlX2lkKSB7Ci0JCQkJCXBpLT52ZGRjX2xl YWthZ2UuYWN0dWFsX3ZvbHRhZ2VbcGktPnZkZGNfbGVha2FnZS5jb3VudF0gPSB2ZGRjOwotCQkJ CQlwaS0+dmRkY19sZWFrYWdlLmxlYWthZ2VfaWRbcGktPnZkZGNfbGVha2FnZS5jb3VudF0gPSB2 aXJ0dWFsX3ZvbHRhZ2VfaWQ7Ci0JCQkJCXBpLT52ZGRjX2xlYWthZ2UuY291bnQrKzsKLQkJCQl9 Ci0JCQkJaWYgKHZkZGNpICE9IDAgJiYgdmRkY2kgIT0gdmlydHVhbF92b2x0YWdlX2lkKSB7Ci0J CQkJCXBpLT52ZGRjaV9sZWFrYWdlLmFjdHVhbF92b2x0YWdlW3BpLT52ZGRjaV9sZWFrYWdlLmNv dW50XSA9IHZkZGNpOwotCQkJCQlwaS0+dmRkY2lfbGVha2FnZS5sZWFrYWdlX2lkW3BpLT52ZGRj aV9sZWFrYWdlLmNvdW50XSA9IHZpcnR1YWxfdm9sdGFnZV9pZDsKLQkJCQkJcGktPnZkZGNpX2xl YWthZ2UuY291bnQrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNp X3NldF9kcG1fZXZlbnRfc291cmNlcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdTMyIHNv dXJjZXMpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwot CWJvb2wgd2FudF90aGVybWFsX3Byb3RlY3Rpb247Ci0JZW51bSBhbWRncHVfZHBtX2V2ZW50X3Ny YyBkcG1fZXZlbnRfc3JjOwotCXUzMiB0bXA7Ci0KLQlzd2l0Y2ggKHNvdXJjZXMpIHsKLQljYXNl IDA6Ci0JZGVmYXVsdDoKLQkJd2FudF90aGVybWFsX3Byb3RlY3Rpb24gPSBmYWxzZTsKLQkJYnJl YWs7Ci0JY2FzZSAoMSA8PCBBTURHUFVfRFBNX0FVVE9fVEhST1RUTEVfU1JDX1RIRVJNQUwpOgot CQl3YW50X3RoZXJtYWxfcHJvdGVjdGlvbiA9IHRydWU7Ci0JCWRwbV9ldmVudF9zcmMgPSBBTURH UFVfRFBNX0VWRU5UX1NSQ19ESUdJVEFMOwotCQlicmVhazsKLQljYXNlICgxIDw8IEFNREdQVV9E UE1fQVVUT19USFJPVFRMRV9TUkNfRVhURVJOQUwpOgotCQl3YW50X3RoZXJtYWxfcHJvdGVjdGlv biA9IHRydWU7Ci0JCWRwbV9ldmVudF9zcmMgPSBBTURHUFVfRFBNX0VWRU5UX1NSQ19FWFRFUk5B TDsKLQkJYnJlYWs7Ci0JY2FzZSAoKDEgPDwgQU1ER1BVX0RQTV9BVVRPX1RIUk9UVExFX1NSQ19F WFRFUk5BTCkgfAotCSAgICAgICgxIDw8IEFNREdQVV9EUE1fQVVUT19USFJPVFRMRV9TUkNfVEhF Uk1BTCkpOgotCQl3YW50X3RoZXJtYWxfcHJvdGVjdGlvbiA9IHRydWU7Ci0JCWRwbV9ldmVudF9z cmMgPSBBTURHUFVfRFBNX0VWRU5UX1NSQ19ESUdJQUxfT1JfRVhURVJOQUw7Ci0JCWJyZWFrOwot CX0KLQotCWlmICh3YW50X3RoZXJtYWxfcHJvdGVjdGlvbikgewotI2lmIDAKLQkJLyogWFhYOiBu ZWVkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGhhbmRsZSB0aGlzIHByb3Blcmx5ICovCi0JCXRtcCA9 IFJSRUczMl9TTUMoaXhDR19USEVSTUFMX0NUUkwpOwotCQl0bXAgJj0gRFBNX0VWRU5UX1NSQ19N QVNLOwotCQl0bXAgfD0gRFBNX0VWRU5UX1NSQyhkcG1fZXZlbnRfc3JjKTsKLQkJV1JFRzMyX1NN QyhpeENHX1RIRVJNQUxfQ1RSTCwgdG1wKTsKLSNlbmRpZgotCi0JCXRtcCA9IFJSRUczMl9TTUMo aXhHRU5FUkFMX1BXUk1HVCk7Ci0JCWlmIChwaS0+dGhlcm1hbF9wcm90ZWN0aW9uKQotCQkJdG1w ICY9IH5HRU5FUkFMX1BXUk1HVF9fVEhFUk1BTF9QUk9URUNUSU9OX0RJU19NQVNLOwotCQllbHNl Ci0JCQl0bXAgfD0gR0VORVJBTF9QV1JNR1RfX1RIRVJNQUxfUFJPVEVDVElPTl9ESVNfTUFTSzsK LQkJV1JFRzMyX1NNQyhpeEdFTkVSQUxfUFdSTUdULCB0bXApOwotCX0gZWxzZSB7Ci0JCXRtcCA9 IFJSRUczMl9TTUMoaXhHRU5FUkFMX1BXUk1HVCk7Ci0JCXRtcCB8PSBHRU5FUkFMX1BXUk1HVF9f VEhFUk1BTF9QUk9URUNUSU9OX0RJU19NQVNLOwotCQlXUkVHMzJfU01DKGl4R0VORVJBTF9QV1JN R1QsIHRtcCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV9lbmFibGVfYXV0b190aHJvdHRsZV9z b3VyY2Uoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJCSAgIGVudW0gYW1kZ3B1X2Rw bV9hdXRvX3Rocm90dGxlX3NyYyBzb3VyY2UsCi0JCQkJCSAgIGJvb2wgZW5hYmxlKQotewotCXN0 cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQotCWlmIChlbmFibGUp IHsKLQkJaWYgKCEocGktPmFjdGl2ZV9hdXRvX3Rocm90dGxlX3NvdXJjZXMgJiAoMSA8PCBzb3Vy Y2UpKSkgewotCQkJcGktPmFjdGl2ZV9hdXRvX3Rocm90dGxlX3NvdXJjZXMgfD0gMSA8PCBzb3Vy Y2U7Ci0JCQljaV9zZXRfZHBtX2V2ZW50X3NvdXJjZXMoYWRldiwgcGktPmFjdGl2ZV9hdXRvX3Ro cm90dGxlX3NvdXJjZXMpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBpLT5hY3RpdmVfYXV0b190 aHJvdHRsZV9zb3VyY2VzICYgKDEgPDwgc291cmNlKSkgewotCQkJcGktPmFjdGl2ZV9hdXRvX3Ro cm90dGxlX3NvdXJjZXMgJj0gfigxIDw8IHNvdXJjZSk7Ci0JCQljaV9zZXRfZHBtX2V2ZW50X3Nv dXJjZXMoYWRldiwgcGktPmFjdGl2ZV9hdXRvX3Rocm90dGxlX3NvdXJjZXMpOwotCQl9Ci0JfQot fQotCi1zdGF0aWMgdm9pZCBjaV9lbmFibGVfdnJfaG90X2dwaW9faW50ZXJydXB0KHN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2KQotewotCWlmIChhZGV2LT5wbS5kcG0ucGxhdGZvcm1fY2FwcyAm IEFUT01fUFBfUExBVEZPUk1fQ0FQX1JFR1VMQVRPUl9IT1QpCi0JCWFtZGdwdV9jaV9zZW5kX21z Z190b19zbWMoYWRldiwgUFBTTUNfTVNHX0VuYWJsZVZSSG90R1BJT0ludGVycnVwdCk7Ci19Ci0K LXN0YXRpYyBpbnQgY2lfdW5mcmVlemVfc2Nsa19tY2xrX2RwbShzdHJ1Y3QgYW1kZ3B1X2Rldmlj ZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7 Ci0JUFBTTUNfUmVzdWx0IHNtY19yZXN1bHQ7Ci0KLQlpZiAoIXBpLT5uZWVkX3VwZGF0ZV9zbXU3 X2RwbV90YWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoKCFwaS0+c2Nsa19kcG1fa2V5X2Rpc2Fi bGVkKSAmJgotCSAgICAocGktPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYgKERQTVRBQkxF X09EX1VQREFURV9TQ0xLIHwgRFBNVEFCTEVfVVBEQVRFX1NDTEspKSkgewotCQlzbWNfcmVzdWx0 ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfU0NMS0RQTV9VbmZy ZWV6ZUxldmVsKTsKLQkJaWYgKHNtY19yZXN1bHQgIT0gUFBTTUNfUmVzdWx0X09LKQotCQkJcmV0 dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCghcGktPm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgJiYK LQkgICAgKHBpLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJsZSAmIERQTVRBQkxFX09EX1VQREFU RV9NQ0xLKSkgewotCQlzbWNfcmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2 LCBQUFNNQ19NU0dfTUNMS0RQTV9VbmZyZWV6ZUxldmVsKTsKLQkJaWYgKHNtY19yZXN1bHQgIT0g UFBTTUNfUmVzdWx0X09LKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcGktPm5lZWRfdXBk YXRlX3NtdTdfZHBtX3RhYmxlID0gMDsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9l bmFibGVfc2Nsa19tY2xrX2RwbShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgYm9vbCBlbmFi bGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCVBQ U01DX1Jlc3VsdCBzbWNfcmVzdWx0OwotCi0JaWYgKGVuYWJsZSkgewotCQlpZiAoIXBpLT5zY2xr X2RwbV9rZXlfZGlzYWJsZWQpIHsKLQkJCXNtY19yZXN1bHQgPSBhbWRncHVfY2lfc2VuZF9tc2df dG9fc21jKGFkZXYsIFBQU01DX01TR19EUE1fRW5hYmxlKTsKLQkJCWlmIChzbWNfcmVzdWx0ICE9 IFBQU01DX1Jlc3VsdF9PSykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCi0JCWlmICghcGkt Pm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgewotCQkJc21jX3Jlc3VsdCA9IGFtZGdwdV9jaV9zZW5k X21zZ190b19zbWMoYWRldiwgUFBTTUNfTVNHX01DTEtEUE1fRW5hYmxlKTsKLQkJCWlmIChzbWNf cmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQotCQkJV1JF RzMyX1AobW1NQ19TRVFfQ05UTF8zLCBNQ19TRVFfQ05UTF8zX19DQUNfRU5fTUFTSywKLQkJCQkJ fk1DX1NFUV9DTlRMXzNfX0NBQ19FTl9NQVNLKTsKLQotCQkJV1JFRzMyX1NNQyhpeExDQUNfTUMw X0NOVEwsIDB4MDUpOwotCQkJV1JFRzMyX1NNQyhpeExDQUNfTUMxX0NOVEwsIDB4MDUpOwotCQkJ V1JFRzMyX1NNQyhpeExDQUNfQ1BMX0NOVEwsIDB4MTAwMDA1KTsKLQotCQkJdWRlbGF5KDEwKTsK LQotCQkJV1JFRzMyX1NNQyhpeExDQUNfTUMwX0NOVEwsIDB4NDAwMDA1KTsKLQkJCVdSRUczMl9T TUMoaXhMQ0FDX01DMV9DTlRMLCAweDQwMDAwNSk7Ci0JCQlXUkVHMzJfU01DKGl4TENBQ19DUExf Q05UTCwgMHg1MDAwMDUpOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKCFwaS0+c2Nsa19kcG1fa2V5 X2Rpc2FibGVkKSB7Ci0JCQlzbWNfcmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhh ZGV2LCBQUFNNQ19NU0dfRFBNX0Rpc2FibGUpOwotCQkJaWYgKHNtY19yZXN1bHQgIT0gUFBTTUNf UmVzdWx0X09LKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0KLQkJaWYgKCFwaS0+bWNsa19k cG1fa2V5X2Rpc2FibGVkKSB7Ci0JCQlzbWNfcmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3Rv X3NtYyhhZGV2LCBQUFNNQ19NU0dfTUNMS0RQTV9EaXNhYmxlKTsKLQkJCWlmIChzbWNfcmVzdWx0 ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfQotCX0KLQotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3N0YXJ0X2RwbShzdHJ1Y3QgYW1kZ3B1X2Rldmlj ZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7 Ci0JUFBTTUNfUmVzdWx0IHNtY19yZXN1bHQ7Ci0JaW50IHJldDsKLQl1MzIgdG1wOwotCi0JdG1w ID0gUlJFRzMyX1NNQyhpeEdFTkVSQUxfUFdSTUdUKTsKLQl0bXAgfD0gR0VORVJBTF9QV1JNR1Rf X0dMT0JBTF9QV1JNR1RfRU5fTUFTSzsKLQlXUkVHMzJfU01DKGl4R0VORVJBTF9QV1JNR1QsIHRt cCk7Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4U0NMS19QV1JNR1RfQ05UTCk7Ci0JdG1wIHw9IFND TEtfUFdSTUdUX0NOVExfX0RZTkFNSUNfUE1fRU5fTUFTSzsKLQlXUkVHMzJfU01DKGl4U0NMS19Q V1JNR1RfQ05UTCwgdG1wKTsKLQotCWNpX3dyaXRlX3NtY19zb2Z0X3JlZ2lzdGVyKGFkZXYsIG9m ZnNldG9mKFNNVTdfU29mdFJlZ2lzdGVycywgVm9sdGFnZUNoYW5nZVRpbWVvdXQpLCAweDEwMDAp OwotCi0JV1JFRzMyX1AobW1CSUZfTE5DTlRfUkVTRVQsIDAsIH5CSUZfTE5DTlRfUkVTRVRfX1JF U0VUX0xOQ05UX0VOX01BU0spOwotCi0Jc21jX3Jlc3VsdCA9IGFtZGdwdV9jaV9zZW5kX21zZ190 b19zbWMoYWRldiwgUFBTTUNfTVNHX1ZvbHRhZ2VfQ250bF9FbmFibGUpOwotCWlmIChzbWNfcmVz dWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlyZXQgPSBjaV9l bmFibGVfc2Nsa19tY2xrX2RwbShhZGV2LCB0cnVlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0 OwotCi0JaWYgKCFwaS0+cGNpZV9kcG1fa2V5X2Rpc2FibGVkKSB7Ci0JCXNtY19yZXN1bHQgPSBh bWRncHVfY2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19QQ0llRFBNX0VuYWJsZSk7 Ci0JCWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCXJldHVybiAtRUlOVkFM OwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2ZyZWV6ZV9zY2xrX21jbGtf ZHBtKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZv ICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlQUFNNQ19SZXN1bHQgc21jX3Jlc3VsdDsKLQotCWlm ICghcGktPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlKQotCQlyZXR1cm4gMDsKLQotCWlmICgo IXBpLT5zY2xrX2RwbV9rZXlfZGlzYWJsZWQpICYmCi0JICAgIChwaS0+bmVlZF91cGRhdGVfc211 N19kcG1fdGFibGUgJiAoRFBNVEFCTEVfT0RfVVBEQVRFX1NDTEsgfCBEUE1UQUJMRV9VUERBVEVf U0NMSykpKSB7Ci0JCXNtY19yZXN1bHQgPSBhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jKGFkZXYs IFBQU01DX01TR19TQ0xLRFBNX0ZyZWV6ZUxldmVsKTsKLQkJaWYgKHNtY19yZXN1bHQgIT0gUFBT TUNfUmVzdWx0X09LKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKCghcGktPm1jbGtf ZHBtX2tleV9kaXNhYmxlZCkgJiYKLQkgICAgKHBpLT5uZWVkX3VwZGF0ZV9zbXU3X2RwbV90YWJs ZSAmIERQTVRBQkxFX09EX1VQREFURV9NQ0xLKSkgewotCQlzbWNfcmVzdWx0ID0gYW1kZ3B1X2Np X3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfTUNMS0RQTV9GcmVlemVMZXZlbCk7Ci0J CWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCXJldHVybiAtRUlOVkFMOwot CX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3N0b3BfZHBtKHN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9w aShhZGV2KTsKLQlQUFNNQ19SZXN1bHQgc21jX3Jlc3VsdDsKLQlpbnQgcmV0OwotCXUzMiB0bXA7 Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4R0VORVJBTF9QV1JNR1QpOwotCXRtcCAmPSB+R0VORVJB TF9QV1JNR1RfX0dMT0JBTF9QV1JNR1RfRU5fTUFTSzsKLQlXUkVHMzJfU01DKGl4R0VORVJBTF9Q V1JNR1QsIHRtcCk7Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4U0NMS19QV1JNR1RfQ05UTCk7Ci0J dG1wICY9IH5TQ0xLX1BXUk1HVF9DTlRMX19EWU5BTUlDX1BNX0VOX01BU0s7Ci0JV1JFRzMyX1NN QyhpeFNDTEtfUFdSTUdUX0NOVEwsIHRtcCk7Ci0KLQlpZiAoIXBpLT5wY2llX2RwbV9rZXlfZGlz YWJsZWQpIHsKLQkJc21jX3Jlc3VsdCA9IGFtZGdwdV9jaV9zZW5kX21zZ190b19zbWMoYWRldiwg UFBTTUNfTVNHX1BDSWVEUE1fRGlzYWJsZSk7Ci0JCWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jl c3VsdF9PSykKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldCA9IGNpX2VuYWJsZV9zY2xr X21jbGtfZHBtKGFkZXYsIGZhbHNlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0Jc21j X3Jlc3VsdCA9IGFtZGdwdV9jaV9zZW5kX21zZ190b19zbWMoYWRldiwgUFBTTUNfTVNHX1ZvbHRh Z2VfQ250bF9EaXNhYmxlKTsKLQlpZiAoc21jX3Jlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0J CXJldHVybiAtRUlOVkFMOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2VuYWJs ZV9zY2xrX2NvbnRyb2woc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIGJvb2wgZW5hYmxlKQot ewotCXUzMiB0bXAgPSBSUkVHMzJfU01DKGl4U0NMS19QV1JNR1RfQ05UTCk7Ci0KLQlpZiAoZW5h YmxlKQotCQl0bXAgJj0gflNDTEtfUFdSTUdUX0NOVExfX1NDTEtfUFdSTUdUX09GRl9NQVNLOwot CWVsc2UKLQkJdG1wIHw9IFNDTEtfUFdSTUdUX0NOVExfX1NDTEtfUFdSTUdUX09GRl9NQVNLOwot CVdSRUczMl9TTUMoaXhTQ0xLX1BXUk1HVF9DTlRMLCB0bXApOwotfQotCi0jaWYgMAotc3RhdGlj IGludCBjaV9ub3RpZnlfaHdfb2ZfcG93ZXJfc291cmNlKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2LAotCQkJCQlib29sIGFjX3Bvd2VyKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9 IGNpX2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgYW1kZ3B1X2NhY190ZHBfdGFibGUgKmNhY190ZHBf dGFibGUgPQotCQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY190ZHBfdGFibGU7Ci0JdTMyIHBv d2VyX2xpbWl0OwotCi0JaWYgKGFjX3Bvd2VyKQotCQlwb3dlcl9saW1pdCA9ICh1MzIpKGNhY190 ZHBfdGFibGUtPm1heGltdW1fcG93ZXJfZGVsaXZlcnlfbGltaXQgKiAyNTYpOwotCWVsc2UKLQkJ cG93ZXJfbGltaXQgPSAodTMyKShjYWNfdGRwX3RhYmxlLT5iYXR0ZXJ5X3Bvd2VyX2xpbWl0ICog MjU2KTsKLQotCWNpX3NldF9wb3dlcl9saW1pdChhZGV2LCBwb3dlcl9saW1pdCk7Ci0KLQlpZiAo cGktPmNhcHNfYXV0b21hdGljX2RjX3RyYW5zaXRpb24pIHsKLQkJaWYgKGFjX3Bvd2VyKQotCQkJ YW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfUnVubmluZ09uQUMpOwot CQllbHNlCi0JCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19SZW1v dmVfRENfQ2xhbXApOwotCX0KLQotCXJldHVybiAwOwotfQotI2VuZGlmCi0KLXN0YXRpYyBQUFNN Q19SZXN1bHQgYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJCSAgICAgIFBQU01DX01zZyBtc2csIHUzMiBwYXJh bWV0ZXIpCi17Ci0JV1JFRzMyKG1tU01DX01TR19BUkdfMCwgcGFyYW1ldGVyKTsKLQlyZXR1cm4g YW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBtc2cpOwotfQotCi1zdGF0aWMgUFBTTUNf UmVzdWx0IGFtZGdwdV9jaV9zZW5kX21zZ190b19zbWNfcmV0dXJuX3BhcmFtZXRlcihzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJCQlQUFNNQ19Nc2cgbXNnLCB1MzIgKnBhcmFtZXRl cikKLXsKLQlQUFNNQ19SZXN1bHQgc21jX3Jlc3VsdDsKLQotCXNtY19yZXN1bHQgPSBhbWRncHVf Y2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIG1zZyk7Ci0KLQlpZiAoKHNtY19yZXN1bHQgPT0gUFBT TUNfUmVzdWx0X09LKSAmJiBwYXJhbWV0ZXIpCi0JCSpwYXJhbWV0ZXIgPSBSUkVHMzIobW1TTUNf TVNHX0FSR18wKTsKLQotCXJldHVybiBzbWNfcmVzdWx0OwotfQotCi1zdGF0aWMgaW50IGNpX2Rw bV9mb3JjZV9zdGF0ZV9zY2xrKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1MzIgbikKLXsK LQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0KLQlpZiAoIXBp LT5zY2xrX2RwbV9rZXlfZGlzYWJsZWQpIHsKLQkJUFBTTUNfUmVzdWx0IHNtY19yZXN1bHQgPQot CQkJYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihhZGV2LCBQUFNNQ19N U0dfU0NMS0RQTV9TZXRFbmFibGVkTWFzaywgMSA8PCBuKTsKLQkJaWYgKHNtY19yZXN1bHQgIT0g UFBTTUNfUmVzdWx0X09LKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19 Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX2ZvcmNlX3N0YXRlX21jbGsoc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYsIHUzMiBuKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9w aShhZGV2KTsKLQotCWlmICghcGktPm1jbGtfZHBtX2tleV9kaXNhYmxlZCkgewotCQlQUFNNQ19S ZXN1bHQgc21jX3Jlc3VsdCA9Ci0JCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFy YW1ldGVyKGFkZXYsIFBQU01DX01TR19NQ0xLRFBNX1NldEVuYWJsZWRNYXNrLCAxIDw8IG4pOwot CQlpZiAoc21jX3Jlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0JCQlyZXR1cm4gLUVJTlZBTDsK LQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9kcG1fZm9yY2Vfc3RhdGVfcGNp ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdTMyIG4pCi17Ci0Jc3RydWN0IGNpX3Bvd2Vy X2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JaWYgKCFwaS0+cGNpZV9kcG1fa2V5X2Rp c2FibGVkKSB7Ci0JCVBQU01DX1Jlc3VsdCBzbWNfcmVzdWx0ID0KLQkJCWFtZGdwdV9jaV9zZW5k X21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoYWRldiwgUFBTTUNfTVNHX1BDSWVEUE1fRm9yY2VM ZXZlbCwgbik7Ci0JCWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCXJldHVy biAtRUlOVkFMOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3NldF9wb3dl cl9saW1pdChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgdTMyIG4pCi17Ci0Jc3RydWN0IGNp X3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JaWYgKHBpLT5wb3dlcl9jb250 YWlubWVudF9mZWF0dXJlcyAmIFBPV0VSQ09OVEFJTk1FTlRfRkVBVFVSRV9Qa2dQd3JMaW1pdCkg ewotCQlQUFNNQ19SZXN1bHQgc21jX3Jlc3VsdCA9Ci0JCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9f c21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsIFBQU01DX01TR19Qa2dQd3JTZXRMaW1pdCwgbik7Ci0J CWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCXJldHVybiAtRUlOVkFMOwot CX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3NldF9vdmVyZHJpdmVfdGFyZ2V0 X3RkcChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkgICAgICAgdTMyIHRhcmdldF90 ZHApCi17Ci0JUFBTTUNfUmVzdWx0IHNtY19yZXN1bHQgPQotCQlhbWRncHVfY2lfc2VuZF9tc2df dG9fc21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsIFBQU01DX01TR19PdmVyRHJpdmVTZXRUYXJnZXRU ZHAsIHRhcmdldF90ZHApOwotCWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJ cmV0dXJuIC1FSU5WQUw7Ci0JcmV0dXJuIDA7Ci19Ci0KLSNpZiAwCi1zdGF0aWMgaW50IGNpX3Nl dF9ib290X3N0YXRlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXJldHVybiBjaV9l bmFibGVfc2Nsa19tY2xrX2RwbShhZGV2LCBmYWxzZSk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHUz MiBjaV9nZXRfYXZlcmFnZV9zY2xrX2ZyZXEoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17 Ci0JdTMyIHNjbGtfZnJlcTsKLQlQUFNNQ19SZXN1bHQgc21jX3Jlc3VsdCA9Ci0JCWFtZGdwdV9j aV9zZW5kX21zZ190b19zbWNfcmV0dXJuX3BhcmFtZXRlcihhZGV2LAotCQkJCQkJICAgIFBQU01D X01TR19BUElfR2V0U2Nsa0ZyZXF1ZW5jeSwKLQkJCQkJCSAgICAmc2Nsa19mcmVxKTsKLQlpZiAo c21jX3Jlc3VsdCAhPSBQUFNNQ19SZXN1bHRfT0spCi0JCXNjbGtfZnJlcSA9IDA7Ci0KLQlyZXR1 cm4gc2Nsa19mcmVxOwotfQotCi1zdGF0aWMgdTMyIGNpX2dldF9hdmVyYWdlX21jbGtfZnJlcShz dHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1MzIgbWNsa19mcmVxOwotCVBQU01DX1Jl c3VsdCBzbWNfcmVzdWx0ID0KLQkJYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtY19yZXR1cm5fcGFy YW1ldGVyKGFkZXYsCi0JCQkJCQkgICAgUFBTTUNfTVNHX0FQSV9HZXRNY2xrRnJlcXVlbmN5LAot CQkJCQkJICAgICZtY2xrX2ZyZXEpOwotCWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9P SykKLQkJbWNsa19mcmVxID0gMDsKLQotCXJldHVybiBtY2xrX2ZyZXE7Ci19Ci0KLXN0YXRpYyB2 b2lkIGNpX2RwbV9zdGFydF9zbWMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0JaW50 IGk7Ci0KLQlhbWRncHVfY2lfcHJvZ3JhbV9qdW1wX29uX3N0YXJ0KGFkZXYpOwotCWFtZGdwdV9j aV9zdGFydF9zbWNfY2xvY2soYWRldik7Ci0JYW1kZ3B1X2NpX3N0YXJ0X3NtYyhhZGV2KTsKLQlm b3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKLQkJaWYgKFJSRUczMl9T TUMoaXhGSVJNV0FSRV9GTEFHUykgJiBGSVJNV0FSRV9GTEFHU19fSU5URVJSVVBUU19FTkFCTEVE X01BU0spCi0JCQlicmVhazsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2RwbV9zdG9wX3NtYyhz dHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlhbWRncHVfY2lfcmVzZXRfc21jKGFkZXYp OwotCWFtZGdwdV9jaV9zdG9wX3NtY19jbG9jayhhZGV2KTsKLX0KLQotc3RhdGljIGludCBjaV9w cm9jZXNzX2Zpcm13YXJlX2hlYWRlcihzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlz dHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JdTMyIHRtcDsKLQlp bnQgcmV0OwotCi0JcmV0ID0gYW1kZ3B1X2NpX3JlYWRfc21jX3NyYW1fZHdvcmQoYWRldiwKLQkJ CQkgICAgIFNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKLQkJCQkgICAgIG9mZnNldG9m KFNNVTdfRmlybXdhcmVfSGVhZGVyLCBEcG1UYWJsZSksCi0JCQkJICAgICAmdG1wLCBwaS0+c3Jh bV9lbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwaS0+ZHBtX3RhYmxlX3N0YXJ0 ID0gdG1wOwotCi0JcmV0ID0gYW1kZ3B1X2NpX3JlYWRfc21jX3NyYW1fZHdvcmQoYWRldiwKLQkJ CQkgICAgIFNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKLQkJCQkgICAgIG9mZnNldG9m KFNNVTdfRmlybXdhcmVfSGVhZGVyLCBTb2Z0UmVnaXN0ZXJzKSwKLQkJCQkgICAgICZ0bXAsIHBp LT5zcmFtX2VuZCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXBpLT5zb2Z0X3JlZ3Nf c3RhcnQgPSB0bXA7Ci0KLQlyZXQgPSBhbWRncHVfY2lfcmVhZF9zbWNfc3JhbV9kd29yZChhZGV2 LAotCQkJCSAgICAgU01VN19GSVJNV0FSRV9IRUFERVJfTE9DQVRJT04gKwotCQkJCSAgICAgb2Zm c2V0b2YoU01VN19GaXJtd2FyZV9IZWFkZXIsIG1jUmVnaXN0ZXJUYWJsZSksCi0JCQkJICAgICAm dG1wLCBwaS0+c3JhbV9lbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwaS0+bWNf cmVnX3RhYmxlX3N0YXJ0ID0gdG1wOwotCi0JcmV0ID0gYW1kZ3B1X2NpX3JlYWRfc21jX3NyYW1f ZHdvcmQoYWRldiwKLQkJCQkgICAgIFNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKLQkJ CQkgICAgIG9mZnNldG9mKFNNVTdfRmlybXdhcmVfSGVhZGVyLCBGYW5UYWJsZSksCi0JCQkJICAg ICAmdG1wLCBwaS0+c3JhbV9lbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlwaS0+ ZmFuX3RhYmxlX3N0YXJ0ID0gdG1wOwotCi0JcmV0ID0gYW1kZ3B1X2NpX3JlYWRfc21jX3NyYW1f ZHdvcmQoYWRldiwKLQkJCQkgICAgIFNNVTdfRklSTVdBUkVfSEVBREVSX0xPQ0FUSU9OICsKLQkJ CQkgICAgIG9mZnNldG9mKFNNVTdfRmlybXdhcmVfSGVhZGVyLCBtY0FyYkRyYW1UaW1pbmdUYWJs ZSksCi0JCQkJICAgICAmdG1wLCBwaS0+c3JhbV9lbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiBy ZXQ7Ci0KLQlwaS0+YXJiX3RhYmxlX3N0YXJ0ID0gdG1wOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyB2b2lkIGNpX3JlYWRfY2xvY2tfcmVnaXN0ZXJzKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQot CXBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9mdW5jX2NudGwgPQotCQlSUkVHMzJfU01DKGl4 Q0dfU1BMTF9GVU5DX0NOVEwpOwotCXBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9mdW5jX2Nu dGxfMiA9Ci0JCVJSRUczMl9TTUMoaXhDR19TUExMX0ZVTkNfQ05UTF8yKTsKLQlwaS0+Y2xvY2tf cmVnaXN0ZXJzLmNnX3NwbGxfZnVuY19jbnRsXzMgPQotCQlSUkVHMzJfU01DKGl4Q0dfU1BMTF9G VU5DX0NOVExfMyk7Ci0JcGktPmNsb2NrX3JlZ2lzdGVycy5jZ19zcGxsX2Z1bmNfY250bF80ID0K LQkJUlJFRzMyX1NNQyhpeENHX1NQTExfRlVOQ19DTlRMXzQpOwotCXBpLT5jbG9ja19yZWdpc3Rl cnMuY2dfc3BsbF9zcHJlYWRfc3BlY3RydW0gPQotCQlSUkVHMzJfU01DKGl4Q0dfU1BMTF9TUFJF QURfU1BFQ1RSVU0pOwotCXBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9zcHJlYWRfc3BlY3Ry dW1fMiA9Ci0JCVJSRUczMl9TTUMoaXhDR19TUExMX1NQUkVBRF9TUEVDVFJVTV8yKTsKLQlwaS0+ Y2xvY2tfcmVnaXN0ZXJzLmRsbF9jbnRsID0gUlJFRzMyKG1tRExMX0NOVEwpOwotCXBpLT5jbG9j a19yZWdpc3RlcnMubWNsa19wd3JtZ3RfY250bCA9IFJSRUczMihtbU1DTEtfUFdSTUdUX0NOVEwp OwotCXBpLT5jbG9ja19yZWdpc3RlcnMubXBsbF9hZF9mdW5jX2NudGwgPSBSUkVHMzIobW1NUExM X0FEX0ZVTkNfQ05UTCk7Ci0JcGktPmNsb2NrX3JlZ2lzdGVycy5tcGxsX2RxX2Z1bmNfY250bCA9 IFJSRUczMihtbU1QTExfRFFfRlVOQ19DTlRMKTsKLQlwaS0+Y2xvY2tfcmVnaXN0ZXJzLm1wbGxf ZnVuY19jbnRsID0gUlJFRzMyKG1tTVBMTF9GVU5DX0NOVEwpOwotCXBpLT5jbG9ja19yZWdpc3Rl cnMubXBsbF9mdW5jX2NudGxfMSA9IFJSRUczMihtbU1QTExfRlVOQ19DTlRMXzEpOwotCXBpLT5j bG9ja19yZWdpc3RlcnMubXBsbF9mdW5jX2NudGxfMiA9IFJSRUczMihtbU1QTExfRlVOQ19DTlRM XzIpOwotCXBpLT5jbG9ja19yZWdpc3RlcnMubXBsbF9zczEgPSBSUkVHMzIobW1NUExMX1NTMSk7 Ci0JcGktPmNsb2NrX3JlZ2lzdGVycy5tcGxsX3NzMiA9IFJSRUczMihtbU1QTExfU1MyKTsKLX0K LQotc3RhdGljIHZvaWQgY2lfaW5pdF9zY2xrX3Qoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYp Ci17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JcGkt Pmxvd19zY2xrX2ludGVycnVwdF90ID0gMDsKLX0KLQotc3RhdGljIHZvaWQgY2lfZW5hYmxlX3Ro ZXJtYWxfcHJvdGVjdGlvbihzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJIGJvb2wg ZW5hYmxlKQotewotCXUzMiB0bXAgPSBSUkVHMzJfU01DKGl4R0VORVJBTF9QV1JNR1QpOwotCi0J aWYgKGVuYWJsZSkKLQkJdG1wICY9IH5HRU5FUkFMX1BXUk1HVF9fVEhFUk1BTF9QUk9URUNUSU9O X0RJU19NQVNLOwotCWVsc2UKLQkJdG1wIHw9IEdFTkVSQUxfUFdSTUdUX19USEVSTUFMX1BST1RF Q1RJT05fRElTX01BU0s7Ci0JV1JFRzMyX1NNQyhpeEdFTkVSQUxfUFdSTUdULCB0bXApOwotfQot Ci1zdGF0aWMgdm9pZCBjaV9lbmFibGVfYWNwaV9wb3dlcl9tYW5hZ2VtZW50KHN0cnVjdCBhbWRn cHVfZGV2aWNlICphZGV2KQotewotCXUzMiB0bXAgPSBSUkVHMzJfU01DKGl4R0VORVJBTF9QV1JN R1QpOwotCi0JdG1wIHw9IEdFTkVSQUxfUFdSTUdUX19TVEFUSUNfUE1fRU5fTUFTSzsKLQotCVdS RUczMl9TTUMoaXhHRU5FUkFMX1BXUk1HVCwgdG1wKTsKLX0KLQotI2lmIDAKLXN0YXRpYyBpbnQg Y2lfZW50ZXJfdWxwX3N0YXRlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCi0JV1JF RzMyKG1tU01DX01FU1NBR0VfMCwgUFBTTUNfTVNHX1N3aXRjaFRvTWluaW11bVBvd2VyKTsKLQot CXVkZWxheSgyNTAwMCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9leGl0X3Vs cF9zdGF0ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlpbnQgaTsKLQotCVdSRUcz MihtbVNNQ19NRVNTQUdFXzAsIFBQU01DX01TR19SZXN1bWVGcm9tTWluaW11bVBvd2VyKTsKLQot CXVkZWxheSg3MDAwKTsKLQotCWZvciAoaSA9IDA7IGkgPCBhZGV2LT51c2VjX3RpbWVvdXQ7IGkr KykgewotCQlpZiAoUlJFRzMyKG1tU01DX1JFU1BfMCkgPT0gMSkKLQkJCWJyZWFrOwotCQl1ZGVs YXkoMTAwMCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0jZW5kaWYKLQotc3RhdGljIGludCBjaV9u b3RpZnlfc21jX2Rpc3BsYXlfY2hhbmdlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJ CQlib29sIGhhc19kaXNwbGF5KQotewotCVBQU01DX01zZyBtc2cgPSBoYXNfZGlzcGxheSA/IFBQ U01DX01TR19IYXNEaXNwbGF5IDogUFBTTUNfTVNHX05vRGlzcGxheTsKLQotCXJldHVybiAoYW1k Z3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBtc2cpID09IFBQU01DX1Jlc3VsdF9PSykgPyAg MCA6IC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZW5hYmxlX2RzX21hc3Rlcl9zd2l0Y2go c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAgYm9vbCBlbmFibGUpCi17Ci0J c3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JaWYgKGVuYWJs ZSkgewotCQlpZiAocGktPmNhcHNfc2Nsa19kcykgewotCQkJaWYgKGFtZGdwdV9jaV9zZW5kX21z Z190b19zbWMoYWRldiwgUFBTTUNfTVNHX01BU1RFUl9EZWVwU2xlZXBfT04pICE9IFBQU01DX1Jl c3VsdF9PSykKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJfSBlbHNlIHsKLQkJCWlmIChhbWRncHVf Y2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19NQVNURVJfRGVlcFNsZWVwX09GRikg IT0gUFBTTUNfUmVzdWx0X09LKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfSBlbHNlIHsK LQkJaWYgKHBpLT5jYXBzX3NjbGtfZHMpIHsKLQkJCWlmIChhbWRncHVfY2lfc2VuZF9tc2dfdG9f c21jKGFkZXYsIFBQU01DX01TR19NQVNURVJfRGVlcFNsZWVwX09GRikgIT0gUFBTTUNfUmVzdWx0 X09LKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyB2b2lkIGNpX3Byb2dyYW1fZGlzcGxheV9nYXAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYpCi17Ci0JdTMyIHRtcCA9IFJSRUczMl9TTUMoaXhDR19ESVNQTEFZX0dBUF9DTlRMKTsKLQl1 MzIgcHJlX3ZiaV90aW1lX2luX3VzOwotCXUzMiBmcmFtZV90aW1lX2luX3VzOwotCXUzMiByZWZf Y2xvY2sgPSBhZGV2LT5jbG9jay5zcGxsLnJlZmVyZW5jZV9mcmVxOwotCXUzMiByZWZyZXNoX3Jh dGUgPSBhbWRncHVfZHBtX2dldF92cmVmcmVzaChhZGV2KTsKLQl1MzIgdmJsYW5rX3RpbWUgPSBh bWRncHVfZHBtX2dldF92YmxhbmtfdGltZShhZGV2KTsKLQotCXRtcCAmPSB+Q0dfRElTUExBWV9H QVBfQ05UTF9fRElTUF9HQVBfTUFTSzsKLQlpZiAoYWRldi0+cG0uZHBtLm5ld19hY3RpdmVfY3J0 Y19jb3VudCA+IDApCi0JCXRtcCB8PSAoQU1ER1BVX1BNX0RJU1BMQVlfR0FQX1ZCTEFOS19PUl9X TSA8PCBDR19ESVNQTEFZX0dBUF9DTlRMX19ESVNQX0dBUF9fU0hJRlQpOwotCWVsc2UKLQkJdG1w IHw9IChBTURHUFVfUE1fRElTUExBWV9HQVBfSUdOT1JFIDw8IENHX0RJU1BMQVlfR0FQX0NOVExf X0RJU1BfR0FQX19TSElGVCk7Ci0JV1JFRzMyX1NNQyhpeENHX0RJU1BMQVlfR0FQX0NOVEwsIHRt cCk7Ci0KLQlpZiAocmVmcmVzaF9yYXRlID09IDApCi0JCXJlZnJlc2hfcmF0ZSA9IDYwOwotCWlm ICh2YmxhbmtfdGltZSA9PSAweGZmZmZmZmZmKQotCQl2YmxhbmtfdGltZSA9IDUwMDsKLQlmcmFt ZV90aW1lX2luX3VzID0gMTAwMDAwMCAvIHJlZnJlc2hfcmF0ZTsKLQlwcmVfdmJpX3RpbWVfaW5f dXMgPQotCQlmcmFtZV90aW1lX2luX3VzIC0gMjAwIC0gdmJsYW5rX3RpbWU7Ci0JdG1wID0gcHJl X3ZiaV90aW1lX2luX3VzICogKHJlZl9jbG9jayAvIDEwMCk7Ci0KLQlXUkVHMzJfU01DKGl4Q0df RElTUExBWV9HQVBfQ05UTDIsIHRtcCk7Ci0JY2lfd3JpdGVfc21jX3NvZnRfcmVnaXN0ZXIoYWRl diwgb2Zmc2V0b2YoU01VN19Tb2Z0UmVnaXN0ZXJzLCBQcmVWQmxhbmtHYXApLCAweDY0KTsKLQlj aV93cml0ZV9zbWNfc29mdF9yZWdpc3RlcihhZGV2LCBvZmZzZXRvZihTTVU3X1NvZnRSZWdpc3Rl cnMsIFZCbGFua1RpbWVvdXQpLCAoZnJhbWVfdGltZV9pbl91cyAtIHByZV92YmlfdGltZV9pbl91 cykpOwotCi0KLQljaV9ub3RpZnlfc21jX2Rpc3BsYXlfY2hhbmdlKGFkZXYsIChhZGV2LT5wbS5k cG0ubmV3X2FjdGl2ZV9jcnRjX2NvdW50ID09IDEpKTsKLQotfQotCi1zdGF0aWMgdm9pZCBjaV9l bmFibGVfc3ByZWFkX3NwZWN0cnVtKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBib29sIGVu YWJsZSkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0J dTMyIHRtcDsKLQotCWlmIChlbmFibGUpIHsKLQkJaWYgKHBpLT5jYXBzX3NjbGtfc3Nfc3VwcG9y dCkgewotCQkJdG1wID0gUlJFRzMyX1NNQyhpeEdFTkVSQUxfUFdSTUdUKTsKLQkJCXRtcCB8PSBH RU5FUkFMX1BXUk1HVF9fRFlOX1NQUkVBRF9TUEVDVFJVTV9FTl9NQVNLOwotCQkJV1JFRzMyX1NN QyhpeEdFTkVSQUxfUFdSTUdULCB0bXApOwotCQl9Ci0JfSBlbHNlIHsKLQkJdG1wID0gUlJFRzMy X1NNQyhpeENHX1NQTExfU1BSRUFEX1NQRUNUUlVNKTsKLQkJdG1wICY9IH5DR19TUExMX1NQUkVB RF9TUEVDVFJVTV9fU1NFTl9NQVNLOwotCQlXUkVHMzJfU01DKGl4Q0dfU1BMTF9TUFJFQURfU1BF Q1RSVU0sIHRtcCk7Ci0KLQkJdG1wID0gUlJFRzMyX1NNQyhpeEdFTkVSQUxfUFdSTUdUKTsKLQkJ dG1wICY9IH5HRU5FUkFMX1BXUk1HVF9fRFlOX1NQUkVBRF9TUEVDVFJVTV9FTl9NQVNLOwotCQlX UkVHMzJfU01DKGl4R0VORVJBTF9QV1JNR1QsIHRtcCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBj aV9wcm9ncmFtX3NzdHAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0JV1JFRzMyX1NN QyhpeENHX1NUQVRJQ19TQ1JFRU5fUEFSQU1FVEVSLAotCSgoQ0lTTEFORFNfU1NUVV9ERkxUIDw8 IENHX1NUQVRJQ19TQ1JFRU5fUEFSQU1FVEVSX19TVEFUSUNfU0NSRUVOX1RIUkVTSE9MRF9VTklU X19TSElGVCkgfAotCSAoQ0lTTEFORFNfU1NUX0RGTFQgPDwgQ0dfU1RBVElDX1NDUkVFTl9QQVJB TUVURVJfX1NUQVRJQ19TQ1JFRU5fVEhSRVNIT0xEX19TSElGVCkpKTsKLX0KLQotc3RhdGljIHZv aWQgY2lfZW5hYmxlX2Rpc3BsYXlfZ2FwKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewot CXUzMiB0bXAgPSBSUkVHMzJfU01DKGl4Q0dfRElTUExBWV9HQVBfQ05UTCk7Ci0KLQl0bXAgJj0g fihDR19ESVNQTEFZX0dBUF9DTlRMX19ESVNQX0dBUF9NQVNLIHwKLQkJCUNHX0RJU1BMQVlfR0FQ X0NOVExfX0RJU1BfR0FQX01DSEdfTUFTSyk7Ci0JdG1wIHw9ICgoQU1ER1BVX1BNX0RJU1BMQVlf R0FQX0lHTk9SRSA8PCBDR19ESVNQTEFZX0dBUF9DTlRMX19ESVNQX0dBUF9fU0hJRlQpIHwKLQkJ KEFNREdQVV9QTV9ESVNQTEFZX0dBUF9WQkxBTksgPDwgQ0dfRElTUExBWV9HQVBfQ05UTF9fRElT UF9HQVBfTUNIR19fU0hJRlQpKTsKLQotCVdSRUczMl9TTUMoaXhDR19ESVNQTEFZX0dBUF9DTlRM LCB0bXApOwotfQotCi1zdGF0aWMgdm9pZCBjaV9wcm9ncmFtX3ZjKHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2KQotewotCXUzMiB0bXA7Ci0KLQl0bXAgPSBSUkVHMzJfU01DKGl4U0NMS19QV1JN R1RfQ05UTCk7Ci0JdG1wICY9IH4oU0NMS19QV1JNR1RfQ05UTF9fUkVTRVRfU0NMS19DTlRfTUFT SyB8IFNDTEtfUFdSTUdUX0NOVExfX1JFU0VUX0JVU1lfQ05UX01BU0spOwotCVdSRUczMl9TTUMo aXhTQ0xLX1BXUk1HVF9DTlRMLCB0bXApOwotCi0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJBTl9W T1RJTkdfMCwgQ0lTTEFORFNfVlJDX0RGTFQwKTsKLQlXUkVHMzJfU01DKGl4Q0dfRlJFUV9UUkFO X1ZPVElOR18xLCBDSVNMQU5EU19WUkNfREZMVDEpOwotCVdSRUczMl9TTUMoaXhDR19GUkVRX1RS QU5fVk9USU5HXzIsIENJU0xBTkRTX1ZSQ19ERkxUMik7Ci0JV1JFRzMyX1NNQyhpeENHX0ZSRVFf VFJBTl9WT1RJTkdfMywgQ0lTTEFORFNfVlJDX0RGTFQzKTsKLQlXUkVHMzJfU01DKGl4Q0dfRlJF UV9UUkFOX1ZPVElOR180LCBDSVNMQU5EU19WUkNfREZMVDQpOwotCVdSRUczMl9TTUMoaXhDR19G UkVRX1RSQU5fVk9USU5HXzUsIENJU0xBTkRTX1ZSQ19ERkxUNSk7Ci0JV1JFRzMyX1NNQyhpeENH X0ZSRVFfVFJBTl9WT1RJTkdfNiwgQ0lTTEFORFNfVlJDX0RGTFQ2KTsKLQlXUkVHMzJfU01DKGl4 Q0dfRlJFUV9UUkFOX1ZPVElOR183LCBDSVNMQU5EU19WUkNfREZMVDcpOwotfQotCi1zdGF0aWMg dm9pZCBjaV9jbGVhcl92YyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1MzIgdG1w OwotCi0JdG1wID0gUlJFRzMyX1NNQyhpeFNDTEtfUFdSTUdUX0NOVEwpOwotCXRtcCB8PSAoU0NM S19QV1JNR1RfQ05UTF9fUkVTRVRfU0NMS19DTlRfTUFTSyB8IFNDTEtfUFdSTUdUX0NOVExfX1JF U0VUX0JVU1lfQ05UX01BU0spOwotCVdSRUczMl9TTUMoaXhTQ0xLX1BXUk1HVF9DTlRMLCB0bXAp OwotCi0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJBTl9WT1RJTkdfMCwgMCk7Ci0JV1JFRzMyX1NN QyhpeENHX0ZSRVFfVFJBTl9WT1RJTkdfMSwgMCk7Ci0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJB Tl9WT1RJTkdfMiwgMCk7Ci0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJBTl9WT1RJTkdfMywgMCk7 Ci0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJBTl9WT1RJTkdfNCwgMCk7Ci0JV1JFRzMyX1NNQyhp eENHX0ZSRVFfVFJBTl9WT1RJTkdfNSwgMCk7Ci0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJBTl9W T1RJTkdfNiwgMCk7Ci0JV1JFRzMyX1NNQyhpeENHX0ZSRVFfVFJBTl9WT1RJTkdfNywgMCk7Ci19 Ci0KLXN0YXRpYyBpbnQgY2lfdXBsb2FkX2Zpcm13YXJlKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2KQotewotCWludCBpLCByZXQ7Ci0KLQlpZiAoYW1kZ3B1X2NpX2lzX3NtY19ydW5uaW5nKGFk ZXYpKSB7Ci0JCURSTV9JTkZPKCJzbWMgaXMgcnVubmluZywgbm8gbmVlZCB0byBsb2FkIHNtYyBm aXJtd2FyZVxuIik7Ci0JCXJldHVybiAwOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBhZGV2LT51 c2VjX3RpbWVvdXQ7IGkrKykgewotCQlpZiAoUlJFRzMyX1NNQyhpeFJDVV9VQ19FVkVOVFMpICYg UkNVX1VDX0VWRU5UU19fYm9vdF9zZXFfZG9uZV9NQVNLKQotCQkJYnJlYWs7Ci0JfQotCVdSRUcz Ml9TTUMoaXhTTUNfU1lTQ09OX01JU0NfQ05UTCwgMSk7Ci0KLQlhbWRncHVfY2lfc3RvcF9zbWNf Y2xvY2soYWRldik7Ci0JYW1kZ3B1X2NpX3Jlc2V0X3NtYyhhZGV2KTsKLQotCXJldCA9IGFtZGdw dV9jaV9sb2FkX3NtY191Y29kZShhZGV2LCBTTUNfUkFNX0VORCk7Ci0KLQlyZXR1cm4gcmV0Owot Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZ2V0X3N2aTJfdm9sdGFnZV90YWJsZShzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiwKLQkJCQkgICAgIHN0cnVjdCBhbWRncHVfY2xvY2tfdm9sdGFnZV9kZXBl bmRlbmN5X3RhYmxlICp2b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUsCi0JCQkJICAgICBzdHJ1Y3Qg YXRvbV92b2x0YWdlX3RhYmxlICp2b2x0YWdlX3RhYmxlKQotewotCXUzMiBpOwotCi0JaWYgKHZv bHRhZ2VfZGVwZW5kZW5jeV90YWJsZSA9PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXZv bHRhZ2VfdGFibGUtPm1hc2tfbG93ID0gMDsKLQl2b2x0YWdlX3RhYmxlLT5waGFzZV9kZWxheSA9 IDA7Ci0KLQl2b2x0YWdlX3RhYmxlLT5jb3VudCA9IHZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZS0+ Y291bnQ7Ci0JZm9yIChpID0gMDsgaSA8IHZvbHRhZ2VfdGFibGUtPmNvdW50OyBpKyspIHsKLQkJ dm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXS52YWx1ZSA9IHZvbHRhZ2VfZGVwZW5kZW5jeV90YWJs ZS0+ZW50cmllc1tpXS52OwotCQl2b2x0YWdlX3RhYmxlLT5lbnRyaWVzW2ldLnNtaW9fbG93ID0g MDsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9jb25zdHJ1Y3Rfdm9sdGFn ZV90YWJsZXMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2Vy X2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCWludCByZXQ7Ci0KLQlpZiAocGktPnZvbHRh Z2VfY29udHJvbCA9PSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xfQllfR1BJTykgewotCQlyZXQg PSBhbWRncHVfYXRvbWJpb3NfZ2V0X3ZvbHRhZ2VfdGFibGUoYWRldiwgVk9MVEFHRV9UWVBFX1ZE REMsCi0JCQkJCQkJVk9MVEFHRV9PQkpfR1BJT19MVVQsCi0JCQkJCQkJJnBpLT52ZGRjX3ZvbHRh Z2VfdGFibGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgaWYgKHBpLT52 b2x0YWdlX2NvbnRyb2wgPT0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyKSB7Ci0J CXJldCA9IGNpX2dldF9zdmkyX3ZvbHRhZ2VfdGFibGUoYWRldiwKLQkJCQkJCSZhZGV2LT5wbS5k cG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9tY2xrLAotCQkJCQkJJnBpLT52ZGRjX3Zv bHRhZ2VfdGFibGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAocGkt PnZkZGNfdm9sdGFnZV90YWJsZS5jb3VudCA+IFNNVTdfTUFYX0xFVkVMU19WRERDKQotCQljaV90 cmltX3ZvbHRhZ2VfdGFibGVfdG9fZml0X3N0YXRlX3RhYmxlKGFkZXYsIFNNVTdfTUFYX0xFVkVM U19WRERDLAotCQkJCQkJCSAmcGktPnZkZGNfdm9sdGFnZV90YWJsZSk7Ci0KLQlpZiAocGktPnZk ZGNpX2NvbnRyb2wgPT0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU8pIHsKLQkJcmV0 ID0gYW1kZ3B1X2F0b21iaW9zX2dldF92b2x0YWdlX3RhYmxlKGFkZXYsIFZPTFRBR0VfVFlQRV9W RERDSSwKLQkJCQkJCQlWT0xUQUdFX09CSl9HUElPX0xVVCwKLQkJCQkJCQkmcGktPnZkZGNpX3Zv bHRhZ2VfdGFibGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9IGVsc2UgaWYgKHBp LT52ZGRjaV9jb250cm9sID09IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMikgewot CQlyZXQgPSBjaV9nZXRfc3ZpMl92b2x0YWdlX3RhYmxlKGFkZXYsCi0JCQkJCQkmYWRldi0+cG0u ZHBtLmR5bl9zdGF0ZS52ZGRjaV9kZXBlbmRlbmN5X29uX21jbGssCi0JCQkJCQkmcGktPnZkZGNp X3ZvbHRhZ2VfdGFibGUpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAo cGktPnZkZGNpX3ZvbHRhZ2VfdGFibGUuY291bnQgPiBTTVU3X01BWF9MRVZFTFNfVkREQ0kpCi0J CWNpX3RyaW1fdm9sdGFnZV90YWJsZV90b19maXRfc3RhdGVfdGFibGUoYWRldiwgU01VN19NQVhf TEVWRUxTX1ZERENJLAotCQkJCQkJCSAmcGktPnZkZGNpX3ZvbHRhZ2VfdGFibGUpOwotCi0JaWYg KHBpLT5tdmRkX2NvbnRyb2wgPT0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU8pIHsK LQkJcmV0ID0gYW1kZ3B1X2F0b21iaW9zX2dldF92b2x0YWdlX3RhYmxlKGFkZXYsIFZPTFRBR0Vf VFlQRV9NVkREQywKLQkJCQkJCQlWT0xUQUdFX09CSl9HUElPX0xVVCwKLQkJCQkJCQkmcGktPm12 ZGRfdm9sdGFnZV90YWJsZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0gZWxzZSBp ZiAocGktPm12ZGRfY29udHJvbCA9PSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIp IHsKLQkJcmV0ID0gY2lfZ2V0X3N2aTJfdm9sdGFnZV90YWJsZShhZGV2LAotCQkJCQkJJmFkZXYt PnBtLmRwbS5keW5fc3RhdGUubXZkZF9kZXBlbmRlbmN5X29uX21jbGssCi0JCQkJCQkmcGktPm12 ZGRfdm9sdGFnZV90YWJsZSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWlm IChwaS0+bXZkZF92b2x0YWdlX3RhYmxlLmNvdW50ID4gU01VN19NQVhfTEVWRUxTX01WREQpCi0J CWNpX3RyaW1fdm9sdGFnZV90YWJsZV90b19maXRfc3RhdGVfdGFibGUoYWRldiwgU01VN19NQVhf TEVWRUxTX01WREQsCi0JCQkJCQkJICZwaS0+bXZkZF92b2x0YWdlX3RhYmxlKTsKLQotCXJldHVy biAwOwotfQotCi1zdGF0aWMgdm9pZCBjaV9wb3B1bGF0ZV9zbWNfdm9sdGFnZV90YWJsZShzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJICBzdHJ1Y3QgYXRvbV92b2x0YWdlX3RhYmxl X2VudHJ5ICp2b2x0YWdlX3RhYmxlLAotCQkJCQkgIFNNVTdfRGlzY3JldGVfVm9sdGFnZUxldmVs ICpzbWNfdm9sdGFnZV90YWJsZSkKLXsKLQlpbnQgcmV0OwotCi0JcmV0ID0gY2lfZ2V0X3N0ZF92 b2x0YWdlX3ZhbHVlX3NpZGQoYWRldiwgdm9sdGFnZV90YWJsZSwKLQkJCQkJICAgICZzbWNfdm9s dGFnZV90YWJsZS0+U3RkVm9sdGFnZUhpU2lkZCwKLQkJCQkJICAgICZzbWNfdm9sdGFnZV90YWJs ZS0+U3RkVm9sdGFnZUxvU2lkZCk7Ci0KLQlpZiAocmV0KSB7Ci0JCXNtY192b2x0YWdlX3RhYmxl LT5TdGRWb2x0YWdlSGlTaWRkID0gdm9sdGFnZV90YWJsZS0+dmFsdWUgKiBWT0xUQUdFX1NDQUxF OwotCQlzbWNfdm9sdGFnZV90YWJsZS0+U3RkVm9sdGFnZUxvU2lkZCA9IHZvbHRhZ2VfdGFibGUt PnZhbHVlICogVk9MVEFHRV9TQ0FMRTsKLQl9Ci0KLQlzbWNfdm9sdGFnZV90YWJsZS0+Vm9sdGFn ZSA9IGNwdV90b19iZTE2KHZvbHRhZ2VfdGFibGUtPnZhbHVlICogVk9MVEFHRV9TQ0FMRSk7Ci0J c21jX3ZvbHRhZ2VfdGFibGUtPlN0ZFZvbHRhZ2VIaVNpZGQgPQotCQljcHVfdG9fYmUxNihzbWNf dm9sdGFnZV90YWJsZS0+U3RkVm9sdGFnZUhpU2lkZCk7Ci0Jc21jX3ZvbHRhZ2VfdGFibGUtPlN0 ZFZvbHRhZ2VMb1NpZGQgPQotCQljcHVfdG9fYmUxNihzbWNfdm9sdGFnZV90YWJsZS0+U3RkVm9s dGFnZUxvU2lkZCk7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9wdWxhdGVfc21jX3ZkZGNfdGFibGUo c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAgU01VN19EaXNjcmV0ZV9EcG1U YWJsZSAqdGFibGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFk ZXYpOwotCXVuc2lnbmVkIGludCBjb3VudDsKLQotCXRhYmxlLT5WZGRjTGV2ZWxDb3VudCA9IHBp LT52ZGRjX3ZvbHRhZ2VfdGFibGUuY291bnQ7Ci0JZm9yIChjb3VudCA9IDA7IGNvdW50IDwgdGFi bGUtPlZkZGNMZXZlbENvdW50OyBjb3VudCsrKSB7Ci0JCWNpX3BvcHVsYXRlX3NtY192b2x0YWdl X3RhYmxlKGFkZXYsCi0JCQkJCSAgICAgICZwaS0+dmRkY192b2x0YWdlX3RhYmxlLmVudHJpZXNb Y291bnRdLAotCQkJCQkgICAgICAmdGFibGUtPlZkZGNMZXZlbFtjb3VudF0pOwotCi0JCWlmIChw aS0+dm9sdGFnZV9jb250cm9sID09IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPKQot CQkJdGFibGUtPlZkZGNMZXZlbFtjb3VudF0uU21pbyB8PQotCQkJCXBpLT52ZGRjX3ZvbHRhZ2Vf dGFibGUuZW50cmllc1tjb3VudF0uc21pb19sb3c7Ci0JCWVsc2UKLQkJCXRhYmxlLT5WZGRjTGV2 ZWxbY291bnRdLlNtaW8gPSAwOwotCX0KLQl0YWJsZS0+VmRkY0xldmVsQ291bnQgPSBjcHVfdG9f YmUzMih0YWJsZS0+VmRkY0xldmVsQ291bnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBp bnQgY2lfcG9wdWxhdGVfc21jX3ZkZGNpX3RhYmxlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 LAotCQkJCSAgICAgICBTTVU3X0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKLXsKLQl1bnNpZ25l ZCBpbnQgY291bnQ7Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYp OwotCi0JdGFibGUtPlZkZGNpTGV2ZWxDb3VudCA9IHBpLT52ZGRjaV92b2x0YWdlX3RhYmxlLmNv dW50OwotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHRhYmxlLT5WZGRjaUxldmVsQ291bnQ7IGNv dW50KyspIHsKLQkJY2lfcG9wdWxhdGVfc21jX3ZvbHRhZ2VfdGFibGUoYWRldiwKLQkJCQkJICAg ICAgJnBpLT52ZGRjaV92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRdLAotCQkJCQkgICAgICAm dGFibGUtPlZkZGNpTGV2ZWxbY291bnRdKTsKLQotCQlpZiAocGktPnZkZGNpX2NvbnRyb2wgPT0g Q0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX0JZX0dQSU8pCi0JCQl0YWJsZS0+VmRkY2lMZXZlbFtj b3VudF0uU21pbyB8PQotCQkJCXBpLT52ZGRjaV92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRd LnNtaW9fbG93OwotCQllbHNlCi0JCQl0YWJsZS0+VmRkY2lMZXZlbFtjb3VudF0uU21pbyA9IDA7 Ci0JfQotCXRhYmxlLT5WZGRjaUxldmVsQ291bnQgPSBjcHVfdG9fYmUzMih0YWJsZS0+VmRkY2lM ZXZlbENvdW50KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3BvcHVsYXRlX3Nt Y19tdmRkX3RhYmxlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCSAgICAgIFNNVTdf RGlzY3JldGVfRHBtVGFibGUgKnRhYmxlKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9 IGNpX2dldF9waShhZGV2KTsKLQl1bnNpZ25lZCBpbnQgY291bnQ7Ci0KLQl0YWJsZS0+TXZkZExl dmVsQ291bnQgPSBwaS0+bXZkZF92b2x0YWdlX3RhYmxlLmNvdW50OwotCWZvciAoY291bnQgPSAw OyBjb3VudCA8IHRhYmxlLT5NdmRkTGV2ZWxDb3VudDsgY291bnQrKykgewotCQljaV9wb3B1bGF0 ZV9zbWNfdm9sdGFnZV90YWJsZShhZGV2LAotCQkJCQkgICAgICAmcGktPm12ZGRfdm9sdGFnZV90 YWJsZS5lbnRyaWVzW2NvdW50XSwKLQkJCQkJICAgICAgJnRhYmxlLT5NdmRkTGV2ZWxbY291bnRd KTsKLQotCQlpZiAocGktPm12ZGRfY29udHJvbCA9PSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xf QllfR1BJTykKLQkJCXRhYmxlLT5NdmRkTGV2ZWxbY291bnRdLlNtaW8gfD0KLQkJCQlwaS0+bXZk ZF92b2x0YWdlX3RhYmxlLmVudHJpZXNbY291bnRdLnNtaW9fbG93OwotCQllbHNlCi0JCQl0YWJs ZS0+TXZkZExldmVsW2NvdW50XS5TbWlvID0gMDsKLQl9Ci0JdGFibGUtPk12ZGRMZXZlbENvdW50 ID0gY3B1X3RvX2JlMzIodGFibGUtPk12ZGRMZXZlbENvdW50KTsKLQotCXJldHVybiAwOwotfQot Ci1zdGF0aWMgaW50IGNpX3BvcHVsYXRlX3NtY192b2x0YWdlX3RhYmxlcyhzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiwKLQkJCQkJICBTTVU3X0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKLXsK LQlpbnQgcmV0OwotCi0JcmV0ID0gY2lfcG9wdWxhdGVfc21jX3ZkZGNfdGFibGUoYWRldiwgdGFi bGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBjaV9wb3B1bGF0ZV9zbWNf dmRkY2lfdGFibGUoYWRldiwgdGFibGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQly ZXQgPSBjaV9wb3B1bGF0ZV9zbWNfbXZkZF90YWJsZShhZGV2LCB0YWJsZSk7Ci0JaWYgKHJldCkK LQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3BvcHVsYXRl X212ZGRfdmFsdWUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHUzMiBtY2xrLAotCQkJCSAg U01VN19EaXNjcmV0ZV9Wb2x0YWdlTGV2ZWwgKnZvbHRhZ2UpCi17Ci0Jc3RydWN0IGNpX3Bvd2Vy X2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXUzMiBpID0gMDsKLQotCWlmIChwaS0+bXZk ZF9jb250cm9sICE9IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9OT05FKSB7Ci0JCWZvciAoaSA9 IDA7IGkgPCBhZGV2LT5wbS5kcG0uZHluX3N0YXRlLm12ZGRfZGVwZW5kZW5jeV9vbl9tY2xrLmNv dW50OyBpKyspIHsKLQkJCWlmIChtY2xrIDw9IGFkZXYtPnBtLmRwbS5keW5fc3RhdGUubXZkZF9k ZXBlbmRlbmN5X29uX21jbGsuZW50cmllc1tpXS5jbGspIHsKLQkJCQl2b2x0YWdlLT5Wb2x0YWdl ID0gcGktPm12ZGRfdm9sdGFnZV90YWJsZS5lbnRyaWVzW2ldLnZhbHVlOwotCQkJCWJyZWFrOwot CQkJfQotCQl9Ci0KLQkJaWYgKGkgPj0gYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tdmRkX2RlcGVu ZGVuY3lfb25fbWNsay5jb3VudCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXJldHVybiAt RUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGNpX2dldF9zdGRfdm9sdGFnZV92YWx1ZV9zaWRkKHN0 cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCQkgc3RydWN0IGF0b21fdm9sdGFnZV90YWJs ZV9lbnRyeSAqdm9sdGFnZV90YWJsZSwKLQkJCQkJIHUxNiAqc3RkX3ZvbHRhZ2VfaGlfc2lkZCwg dTE2ICpzdGRfdm9sdGFnZV9sb19zaWRkKQotewotCXUxNiB2X2luZGV4LCBpZHg7Ci0JYm9vbCB2 b2x0YWdlX2ZvdW5kID0gZmFsc2U7Ci0JKnN0ZF92b2x0YWdlX2hpX3NpZGQgPSB2b2x0YWdlX3Rh YmxlLT52YWx1ZSAqIFZPTFRBR0VfU0NBTEU7Ci0JKnN0ZF92b2x0YWdlX2xvX3NpZGQgPSB2b2x0 YWdlX3RhYmxlLT52YWx1ZSAqIFZPTFRBR0VfU0NBTEU7Ci0KLQlpZiAoYWRldi0+cG0uZHBtLmR5 bl9zdGF0ZS52ZGRjX2RlcGVuZGVuY3lfb25fc2Nsay5lbnRyaWVzID09IE5VTEwpCi0JCXJldHVy biAtRUlOVkFMOwotCi0JaWYgKGFkZXYtPnBtLmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFi bGUuZW50cmllcykgewotCQlmb3IgKHZfaW5kZXggPSAwOyAodTMyKXZfaW5kZXggPCBhZGV2LT5w bS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9zY2xrLmNvdW50OyB2X2luZGV4Kysp IHsKLQkJCWlmICh2b2x0YWdlX3RhYmxlLT52YWx1ZSA9PQotCQkJICAgIGFkZXYtPnBtLmRwbS5k eW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29uX3NjbGsuZW50cmllc1t2X2luZGV4XS52KSB7Ci0J CQkJdm9sdGFnZV9mb3VuZCA9IHRydWU7Ci0JCQkJaWYgKCh1MzIpdl9pbmRleCA8IGFkZXYtPnBt LmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFibGUuY291bnQpCi0JCQkJCWlkeCA9IHZfaW5k ZXg7Ci0JCQkJZWxzZQotCQkJCQlpZHggPSBhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY19sZWFr YWdlX3RhYmxlLmNvdW50IC0gMTsKLQkJCQkqc3RkX3ZvbHRhZ2VfbG9fc2lkZCA9Ci0JCQkJCWFk ZXYtPnBtLmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFibGUuZW50cmllc1tpZHhdLnZkZGMg KiBWT0xUQUdFX1NDQUxFOwotCQkJCSpzdGRfdm9sdGFnZV9oaV9zaWRkID0KLQkJCQkJYWRldi0+ cG0uZHBtLmR5bl9zdGF0ZS5jYWNfbGVha2FnZV90YWJsZS5lbnRyaWVzW2lkeF0ubGVha2FnZSAq IFZPTFRBR0VfU0NBTEU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIXZvbHRhZ2Vf Zm91bmQpIHsKLQkJCWZvciAodl9pbmRleCA9IDA7ICh1MzIpdl9pbmRleCA8IGFkZXYtPnBtLmRw bS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29uX3NjbGsuY291bnQ7IHZfaW5kZXgrKykgewot CQkJCWlmICh2b2x0YWdlX3RhYmxlLT52YWx1ZSA8PQotCQkJCSAgICBhZGV2LT5wbS5kcG0uZHlu X3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9zY2xrLmVudHJpZXNbdl9pbmRleF0udikgewotCQkJ CQl2b2x0YWdlX2ZvdW5kID0gdHJ1ZTsKLQkJCQkJaWYgKCh1MzIpdl9pbmRleCA8IGFkZXYtPnBt LmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFibGUuY291bnQpCi0JCQkJCQlpZHggPSB2X2lu ZGV4OwotCQkJCQllbHNlCi0JCQkJCQlpZHggPSBhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY19s ZWFrYWdlX3RhYmxlLmNvdW50IC0gMTsKLQkJCQkJKnN0ZF92b2x0YWdlX2xvX3NpZGQgPQotCQkJ CQkJYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5jYWNfbGVha2FnZV90YWJsZS5lbnRyaWVzW2lkeF0u dmRkYyAqIFZPTFRBR0VfU0NBTEU7Ci0JCQkJCSpzdGRfdm9sdGFnZV9oaV9zaWRkID0KLQkJCQkJ CWFkZXYtPnBtLmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFibGUuZW50cmllc1tpZHhdLmxl YWthZ2UgKiBWT0xUQUdFX1NDQUxFOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9 Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgY2lfcG9wdWxhdGVfcGhhc2VfdmFsdWVf YmFzZWRfb25fc2NsayhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJCSAgY29uc3Qg c3RydWN0IGFtZGdwdV9waGFzZV9zaGVkZGluZ19saW1pdHNfdGFibGUgKmxpbWl0cywKLQkJCQkJ CSAgdTMyIHNjbGssCi0JCQkJCQkgIHUzMiAqcGhhc2Vfc2hlZGRpbmcpCi17Ci0JdW5zaWduZWQg aW50IGk7Ci0KLQkqcGhhc2Vfc2hlZGRpbmcgPSAxOwotCi0JZm9yIChpID0gMDsgaSA8IGxpbWl0 cy0+Y291bnQ7IGkrKykgewotCQlpZiAoc2NsayA8IGxpbWl0cy0+ZW50cmllc1tpXS5zY2xrKSB7 Ci0JCQkqcGhhc2Vfc2hlZGRpbmcgPSBpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRp YyB2b2lkIGNpX3BvcHVsYXRlX3BoYXNlX3ZhbHVlX2Jhc2VkX29uX21jbGsoc3RydWN0IGFtZGdw dV9kZXZpY2UgKmFkZXYsCi0JCQkJCQkgIGNvbnN0IHN0cnVjdCBhbWRncHVfcGhhc2Vfc2hlZGRp bmdfbGltaXRzX3RhYmxlICpsaW1pdHMsCi0JCQkJCQkgIHUzMiBtY2xrLAotCQkJCQkJICB1MzIg KnBoYXNlX3NoZWRkaW5nKQotewotCXVuc2lnbmVkIGludCBpOwotCi0JKnBoYXNlX3NoZWRkaW5n ID0gMTsKLQotCWZvciAoaSA9IDA7IGkgPCBsaW1pdHMtPmNvdW50OyBpKyspIHsKLQkJaWYgKG1j bGsgPCBsaW1pdHMtPmVudHJpZXNbaV0ubWNsaykgewotCQkJKnBoYXNlX3NoZWRkaW5nID0gaTsK LQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IGNpX2luaXRfYXJiX3RhYmxlX2lu ZGV4KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZv ICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQl1MzIgdG1wOwotCWludCByZXQ7Ci0KLQlyZXQgPSBh bWRncHVfY2lfcmVhZF9zbWNfc3JhbV9kd29yZChhZGV2LCBwaS0+YXJiX3RhYmxlX3N0YXJ0LAot CQkJCSAgICAgJnRtcCwgcGktPnNyYW1fZW5kKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0Owot Ci0JdG1wICY9IDB4MDBGRkZGRkY7Ci0JdG1wIHw9IE1DX0NHX0FSQl9GUkVRX0YxIDw8IDI0Owot Ci0JcmV0dXJuIGFtZGdwdV9jaV93cml0ZV9zbWNfc3JhbV9kd29yZChhZGV2LCBwaS0+YXJiX3Rh YmxlX3N0YXJ0LAotCQkJCSAgICAgICB0bXAsIHBpLT5zcmFtX2VuZCk7Ci19Ci0KLXN0YXRpYyBp bnQgY2lfZ2V0X2RlcGVuZGVuY3lfdm9sdF9ieV9jbGsoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYsCi0JCQkJCSBzdHJ1Y3QgYW1kZ3B1X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAq YWxsb3dlZF9jbG9ja192b2x0YWdlX3RhYmxlLAotCQkJCQkgdTMyIGNsb2NrLCB1MzIgKnZvbHRh Z2UpCi17Ci0JdTMyIGkgPSAwOwotCi0JaWYgKGFsbG93ZWRfY2xvY2tfdm9sdGFnZV90YWJsZS0+ Y291bnQgPT0gMCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWxsb3dl ZF9jbG9ja192b2x0YWdlX3RhYmxlLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChhbGxvd2VkX2Nsb2Nr X3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0uY2xrID49IGNsb2NrKSB7Ci0JCQkqdm9sdGFnZSA9 IGFsbG93ZWRfY2xvY2tfdm9sdGFnZV90YWJsZS0+ZW50cmllc1tpXS52OwotCQkJcmV0dXJuIDA7 Ci0JCX0KLQl9Ci0KLQkqdm9sdGFnZSA9IGFsbG93ZWRfY2xvY2tfdm9sdGFnZV90YWJsZS0+ZW50 cmllc1tpLTFdLnY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHU4IGNpX2dldF9zbGVlcF9k aXZpZGVyX2lkX2Zyb21fY2xvY2sodTMyIHNjbGssIHUzMiBtaW5fc2Nsa19pbl9zcikKLXsKLQl1 MzIgaTsKLQl1MzIgdG1wOwotCXUzMiBtaW4gPSBtYXgobWluX3NjbGtfaW5fc3IsICh1MzIpQ0lT TEFORF9NSU5JTVVNX0VOR0lORV9DTE9DSyk7Ci0KLQlpZiAoc2NsayA8IG1pbikKLQkJcmV0dXJu IDA7Ci0KLQlmb3IgKGkgPSBDSVNMQU5EX01BWF9ERUVQU0xFRVBfRElWSURFUl9JRDsgIDsgaS0t KSB7Ci0JCXRtcCA9IHNjbGsgPj4gaTsKLQkJaWYgKHRtcCA+PSBtaW4gfHwgaSA9PSAwKQotCQkJ YnJlYWs7Ci0JfQotCi0JcmV0dXJuICh1OClpOwotfQotCi1zdGF0aWMgaW50IGNpX2luaXRpYWxf c3dpdGNoX2Zyb21fYXJiX2YwX3RvX2YxKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewot CXJldHVybiBjaV9jb3B5X2FuZF9zd2l0Y2hfYXJiX3NldHMoYWRldiwgTUNfQ0dfQVJCX0ZSRVFf RjAsIE1DX0NHX0FSQl9GUkVRX0YxKTsKLX0KLQotc3RhdGljIGludCBjaV9yZXNldF90b19kZWZh dWx0KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXJldHVybiAoYW1kZ3B1X2NpX3Nl bmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfUmVzZXRUb0RlZmF1bHRzKSA9PSBQUFNNQ19S ZXN1bHRfT0spID8KLQkJMCA6IC1FSU5WQUw7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZm9yY2Vfc3dp dGNoX3RvX2FyYl9mMChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1MzIgdG1wOwot Ci0JdG1wID0gKFJSRUczMl9TTUMoaXhTTUNfU0NSQVRDSDkpICYgMHgwMDAwZmYwMCkgPj4gODsK LQotCWlmICh0bXAgPT0gTUNfQ0dfQVJCX0ZSRVFfRjApCi0JCXJldHVybiAwOwotCi0JcmV0dXJu IGNpX2NvcHlfYW5kX3N3aXRjaF9hcmJfc2V0cyhhZGV2LCB0bXAsIE1DX0NHX0FSQl9GUkVRX0Yw KTsKLX0KLQotc3RhdGljIHZvaWQgY2lfcmVnaXN0ZXJfcGF0Y2hpbmdfbWNfYXJiKHN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2LAotCQkJCQljb25zdCB1MzIgZW5naW5lX2Nsb2NrLAotCQkJCQlj b25zdCB1MzIgbWVtb3J5X2Nsb2NrLAotCQkJCQl1MzIgKmRyYW1fdGltaW1nMikKLXsKLQlib29s IHBhdGNoOwotCXUzMiB0bXAsIHRtcDI7Ci0KLQl0bXAgPSBSUkVHMzIobW1NQ19TRVFfTUlTQzAp OwotCXBhdGNoID0gKCh0bXAgJiAweDAwMDBmMDApID09IDB4MzAwKSA/IHRydWUgOiBmYWxzZTsK LQotCWlmIChwYXRjaCAmJgotCSAgICAoKGFkZXYtPnBkZXYtPmRldmljZSA9PSAweDY3QjApIHx8 Ci0JICAgICAoYWRldi0+cGRldi0+ZGV2aWNlID09IDB4NjdCMSkpKSB7Ci0JCWlmICgobWVtb3J5 X2Nsb2NrID4gMTAwMDAwKSAmJiAobWVtb3J5X2Nsb2NrIDw9IDEyNTAwMCkpIHsKLQkJCXRtcDIg PSAoKCgweDMxICogZW5naW5lX2Nsb2NrKSAvIDEyNTAwMCkgLSAxKSAmIDB4ZmY7Ci0JCQkqZHJh bV90aW1pbWcyICY9IH4weDAwZmYwMDAwOwotCQkJKmRyYW1fdGltaW1nMiB8PSB0bXAyIDw8IDE2 OwotCQl9IGVsc2UgaWYgKChtZW1vcnlfY2xvY2sgPiAxMjUwMDApICYmIChtZW1vcnlfY2xvY2sg PD0gMTM3NTAwKSkgewotCQkJdG1wMiA9ICgoKDB4MzYgKiBlbmdpbmVfY2xvY2spIC8gMTM3NTAw KSAtIDEpICYgMHhmZjsKLQkJCSpkcmFtX3RpbWltZzIgJj0gfjB4MDBmZjAwMDA7Ci0JCQkqZHJh bV90aW1pbWcyIHw9IHRtcDIgPDwgMTY7Ci0JCX0KLQl9Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9w dWxhdGVfbWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 LAotCQkJCQkJdTMyIHNjbGssCi0JCQkJCQl1MzIgbWNsaywKLQkJCQkJCVNNVTdfRGlzY3JldGVf TUNBcmJEcmFtVGltaW5nVGFibGVFbnRyeSAqYXJiX3JlZ3MpCi17Ci0JdTMyIGRyYW1fdGltaW5n OwotCXUzMiBkcmFtX3RpbWluZzI7Ci0JdTMyIGJ1cnN0X3RpbWU7Ci0KLQlhbWRncHVfYXRvbWJp b3Nfc2V0X2VuZ2luZV9kcmFtX3RpbWluZ3MoYWRldiwgc2NsaywgbWNsayk7Ci0KLQlkcmFtX3Rp bWluZyAgPSBSUkVHMzIobW1NQ19BUkJfRFJBTV9USU1JTkcpOwotCWRyYW1fdGltaW5nMiA9IFJS RUczMihtbU1DX0FSQl9EUkFNX1RJTUlORzIpOwotCWJ1cnN0X3RpbWUgPSBSUkVHMzIobW1NQ19B UkJfQlVSU1RfVElNRSkgJiBNQ19BUkJfQlVSU1RfVElNRV9fU1RBVEUwX01BU0s7Ci0KLQljaV9y ZWdpc3Rlcl9wYXRjaGluZ19tY19hcmIoYWRldiwgc2NsaywgbWNsaywgJmRyYW1fdGltaW5nMik7 Ci0KLQlhcmJfcmVncy0+TWNBcmJEcmFtVGltaW5nICA9IGNwdV90b19iZTMyKGRyYW1fdGltaW5n KTsKLQlhcmJfcmVncy0+TWNBcmJEcmFtVGltaW5nMiA9IGNwdV90b19iZTMyKGRyYW1fdGltaW5n Mik7Ci0JYXJiX3JlZ3MtPk1jQXJiQnVyc3RUaW1lID0gKHU4KWJ1cnN0X3RpbWU7Ci0KLQlyZXR1 cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9kb19wcm9ncmFtX21lbW9yeV90aW1pbmdfcGFyYW1l dGVycyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5m byAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JU01VN19EaXNjcmV0ZV9NQ0FyYkRyYW1UaW1pbmdU YWJsZSBhcmJfcmVnczsKLQl1MzIgaSwgajsKLQlpbnQgcmV0ID0gIDA7Ci0KLQltZW1zZXQoJmFy Yl9yZWdzLCAwLCBzaXplb2YoU01VN19EaXNjcmV0ZV9NQ0FyYkRyYW1UaW1pbmdUYWJsZSkpOwot Ci0JZm9yIChpID0gMDsgaSA8IHBpLT5kcG1fdGFibGUuc2Nsa190YWJsZS5jb3VudDsgaSsrKSB7 Ci0JCWZvciAoaiA9IDA7IGogPCBwaS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuY291bnQ7IGorKykg ewotCQkJcmV0ID0gY2lfcG9wdWxhdGVfbWVtb3J5X3RpbWluZ19wYXJhbWV0ZXJzKGFkZXYsCi0J CQkJCQkJCSAgIHBpLT5kcG1fdGFibGUuc2Nsa190YWJsZS5kcG1fbGV2ZWxzW2ldLnZhbHVlLAot CQkJCQkJCQkgICBwaS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuZHBtX2xldmVsc1tqXS52YWx1ZSwK LQkJCQkJCQkJICAgJmFyYl9yZWdzLmVudHJpZXNbaV1bal0pOwotCQkJaWYgKHJldCkKLQkJCQli cmVhazsKLQkJfQotCX0KLQotCWlmIChyZXQgPT0gMCkKLQkJcmV0ID0gYW1kZ3B1X2NpX2NvcHlf Ynl0ZXNfdG9fc21jKGFkZXYsCi0JCQkJCSAgIHBpLT5hcmJfdGFibGVfc3RhcnQsCi0JCQkJCSAg ICh1OCAqKSZhcmJfcmVncywKLQkJCQkJICAgc2l6ZW9mKFNNVTdfRGlzY3JldGVfTUNBcmJEcmFt VGltaW5nVGFibGUpLAotCQkJCQkgICBwaS0+c3JhbV9lbmQpOwotCi0JcmV0dXJuIHJldDsKLX0K LQotc3RhdGljIGludCBjaV9wcm9ncmFtX21lbW9yeV90aW1pbmdfcGFyYW1ldGVycyhzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9n ZXRfcGkoYWRldik7Ci0KLQlpZiAocGktPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlID09IDAp Ci0JCXJldHVybiAwOwotCi0JcmV0dXJuIGNpX2RvX3Byb2dyYW1fbWVtb3J5X3RpbWluZ19wYXJh bWV0ZXJzKGFkZXYpOwotfQotCi1zdGF0aWMgdm9pZCBjaV9wb3B1bGF0ZV9zbWNfaW5pdGlhbF9z dGF0ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJICBzdHJ1Y3QgYW1kZ3B1X3Bz ICphbWRncHVfYm9vdF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgY2lfcHMgKmJvb3Rfc3RhdGUgPSBjaV9n ZXRfcHMoYW1kZ3B1X2Jvb3Rfc3RhdGUpOwotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNp X2dldF9waShhZGV2KTsKLQl1MzIgbGV2ZWwgPSAwOwotCi0JZm9yIChsZXZlbCA9IDA7IGxldmVs IDwgYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVuZGVuY3lfb25fc2Nsay5jb3VudDsg bGV2ZWwrKykgewotCQlpZiAoYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVuZGVuY3lf b25fc2Nsay5lbnRyaWVzW2xldmVsXS5jbGsgPj0KLQkJICAgIGJvb3Rfc3RhdGUtPnBlcmZvcm1h bmNlX2xldmVsc1swXS5zY2xrKSB7Ci0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNzQm9v dExldmVsID0gbGV2ZWw7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCWZvciAobGV2ZWwgPSAwOyBs ZXZlbCA8IGFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29uX21jbGsuY291 bnQ7IGxldmVsKyspIHsKLQkJaWYgKGFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRl bmN5X29uX21jbGsuZW50cmllc1tsZXZlbF0uY2xrID49Ci0JCSAgICBib290X3N0YXRlLT5wZXJm b3JtYW5jZV9sZXZlbHNbMF0ubWNsaykgewotCQkJcGktPnNtY19zdGF0ZV90YWJsZS5NZW1vcnlC b290TGV2ZWwgPSBsZXZlbDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdTMyIGNp X2dldF9kcG1fbGV2ZWxfZW5hYmxlX21hc2tfdmFsdWUoc3RydWN0IGNpX3NpbmdsZV9kcG1fdGFi bGUgKmRwbV90YWJsZSkKLXsKLQl1MzIgaTsKLQl1MzIgbWFza192YWx1ZSA9IDA7Ci0KLQlmb3Ig KGkgPSBkcG1fdGFibGUtPmNvdW50OyBpID4gMDsgaS0tKSB7Ci0JCW1hc2tfdmFsdWUgPSBtYXNr X3ZhbHVlIDw8IDE7Ci0JCWlmIChkcG1fdGFibGUtPmRwbV9sZXZlbHNbaS0xXS5lbmFibGVkKQot CQkJbWFza192YWx1ZSB8PSAweDE7Ci0JCWVsc2UKLQkJCW1hc2tfdmFsdWUgJj0gMHhGRkZGRkZG RTsKLQl9Ci0KLQlyZXR1cm4gbWFza192YWx1ZTsKLX0KLQotc3RhdGljIHZvaWQgY2lfcG9wdWxh dGVfc21jX2xpbmtfbGV2ZWwoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAg IFNNVTdfRGlzY3JldGVfRHBtVGFibGUgKnRhYmxlKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZv ICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgY2lfZHBtX3RhYmxlICpkcG1fdGFibGUg PSAmcGktPmRwbV90YWJsZTsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBkcG1fdGFibGUt PnBjaWVfc3BlZWRfdGFibGUuY291bnQ7IGkrKykgewotCQl0YWJsZS0+TGlua0xldmVsW2ldLlBj aWVHZW5TcGVlZCA9Ci0JCQkodTgpZHBtX3RhYmxlLT5wY2llX3NwZWVkX3RhYmxlLmRwbV9sZXZl bHNbaV0udmFsdWU7Ci0JCXRhYmxlLT5MaW5rTGV2ZWxbaV0uUGNpZUxhbmVDb3VudCA9Ci0JCQlh bWRncHVfZW5jb2RlX3BjaV9sYW5lX3dpZHRoKGRwbV90YWJsZS0+cGNpZV9zcGVlZF90YWJsZS5k cG1fbGV2ZWxzW2ldLnBhcmFtMSk7Ci0JCXRhYmxlLT5MaW5rTGV2ZWxbaV0uRW5hYmxlZEZvckFj dGl2aXR5ID0gMTsKLQkJdGFibGUtPkxpbmtMZXZlbFtpXS5Eb3duVCA9IGNwdV90b19iZTMyKDUp OwotCQl0YWJsZS0+TGlua0xldmVsW2ldLlVwVCA9IGNwdV90b19iZTMyKDMwKTsKLQl9Ci0KLQlw aS0+c21jX3N0YXRlX3RhYmxlLkxpbmtMZXZlbENvdW50ID0gKHU4KWRwbV90YWJsZS0+cGNpZV9z cGVlZF90YWJsZS5jb3VudDsKLQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnBjaWVfZHBtX2Vu YWJsZV9tYXNrID0KLQkJY2lfZ2V0X2RwbV9sZXZlbF9lbmFibGVfbWFza192YWx1ZSgmZHBtX3Rh YmxlLT5wY2llX3NwZWVkX3RhYmxlKTsKLX0KLQotc3RhdGljIGludCBjaV9wb3B1bGF0ZV9zbWNf dXZkX2xldmVsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCSAgICAgU01VN19EaXNj cmV0ZV9EcG1UYWJsZSAqdGFibGUpCi17Ci0JdTMyIGNvdW50OwotCXN0cnVjdCBhdG9tX2Nsb2Nr X2RpdmlkZXJzIGRpdmlkZXJzOwotCWludCByZXQgPSAtRUlOVkFMOwotCi0JdGFibGUtPlV2ZExl dmVsQ291bnQgPQotCQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnV2ZF9jbG9ja192b2x0YWdlX2Rl cGVuZGVuY3lfdGFibGUuY291bnQ7Ci0KLQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCB0YWJsZS0+ VXZkTGV2ZWxDb3VudDsgY291bnQrKykgewotCQl0YWJsZS0+VXZkTGV2ZWxbY291bnRdLlZjbGtG cmVxdWVuY3kgPQotCQkJYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS51dmRfY2xvY2tfdm9sdGFnZV9k ZXBlbmRlbmN5X3RhYmxlLmVudHJpZXNbY291bnRdLnZjbGs7Ci0JCXRhYmxlLT5VdmRMZXZlbFtj b3VudF0uRGNsa0ZyZXF1ZW5jeSA9Ci0JCQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnV2ZF9jbG9j a192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuZW50cmllc1tjb3VudF0uZGNsazsKLQkJdGFibGUt PlV2ZExldmVsW2NvdW50XS5NaW5WZGRjID0KLQkJCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUudXZk X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZS5lbnRyaWVzW2NvdW50XS52ICogVk9MVEFH RV9TQ0FMRTsKLQkJdGFibGUtPlV2ZExldmVsW2NvdW50XS5NaW5WZGRjUGhhc2VzID0gMTsKLQot CQlyZXQgPSBhbWRncHVfYXRvbWJpb3NfZ2V0X2Nsb2NrX2RpdmlkZXJzKGFkZXYsCi0JCQkJCQkJ IENPTVBVVEVfR1BVQ0xLX0lOUFVUX0ZMQUdfREVGQVVMVF9HUFVDTEssCi0JCQkJCQkJIHRhYmxl LT5VdmRMZXZlbFtjb3VudF0uVmNsa0ZyZXF1ZW5jeSwgZmFsc2UsICZkaXZpZGVycyk7Ci0JCWlm IChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCi0JCXRhYmxlLT5VdmRMZXZlbFtjb3VudF0uVmNsa0Rp dmlkZXIgPSAodTgpZGl2aWRlcnMucG9zdF9kaXZpZGVyOwotCi0JCXJldCA9IGFtZGdwdV9hdG9t Ymlvc19nZXRfY2xvY2tfZGl2aWRlcnMoYWRldiwKLQkJCQkJCQkgQ09NUFVURV9HUFVDTEtfSU5Q VVRfRkxBR19ERUZBVUxUX0dQVUNMSywKLQkJCQkJCQkgdGFibGUtPlV2ZExldmVsW2NvdW50XS5E Y2xrRnJlcXVlbmN5LCBmYWxzZSwgJmRpdmlkZXJzKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiBy ZXQ7Ci0KLQkJdGFibGUtPlV2ZExldmVsW2NvdW50XS5EY2xrRGl2aWRlciA9ICh1OClkaXZpZGVy cy5wb3N0X2RpdmlkZXI7Ci0KLQkJdGFibGUtPlV2ZExldmVsW2NvdW50XS5WY2xrRnJlcXVlbmN5 ID0gY3B1X3RvX2JlMzIodGFibGUtPlV2ZExldmVsW2NvdW50XS5WY2xrRnJlcXVlbmN5KTsKLQkJ dGFibGUtPlV2ZExldmVsW2NvdW50XS5EY2xrRnJlcXVlbmN5ID0gY3B1X3RvX2JlMzIodGFibGUt PlV2ZExldmVsW2NvdW50XS5EY2xrRnJlcXVlbmN5KTsKLQkJdGFibGUtPlV2ZExldmVsW2NvdW50 XS5NaW5WZGRjID0gY3B1X3RvX2JlMTYodGFibGUtPlV2ZExldmVsW2NvdW50XS5NaW5WZGRjKTsK LQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNpX3BvcHVsYXRlX3NtY192Y2Vf bGV2ZWwoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICBTTVU3X0Rpc2NyZXRl X0RwbVRhYmxlICp0YWJsZSkKLXsKLQl1MzIgY291bnQ7Ci0Jc3RydWN0IGF0b21fY2xvY2tfZGl2 aWRlcnMgZGl2aWRlcnM7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0KLQl0YWJsZS0+VmNlTGV2ZWxD b3VudCA9Ci0JCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmNlX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5k ZW5jeV90YWJsZS5jb3VudDsKLQotCWZvciAoY291bnQgPSAwOyBjb3VudCA8IHRhYmxlLT5WY2VM ZXZlbENvdW50OyBjb3VudCsrKSB7Ci0JCXRhYmxlLT5WY2VMZXZlbFtjb3VudF0uRnJlcXVlbmN5 ID0KLQkJCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmNlX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5j eV90YWJsZS5lbnRyaWVzW2NvdW50XS5ldmNsazsKLQkJdGFibGUtPlZjZUxldmVsW2NvdW50XS5N aW5Wb2x0YWdlID0KLQkJCSh1MTYpYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52Y2VfY2xvY2tfdm9s dGFnZV9kZXBlbmRlbmN5X3RhYmxlLmVudHJpZXNbY291bnRdLnYgKiBWT0xUQUdFX1NDQUxFOwot CQl0YWJsZS0+VmNlTGV2ZWxbY291bnRdLk1pblBoYXNlcyA9IDE7Ci0KLQkJcmV0ID0gYW1kZ3B1 X2F0b21iaW9zX2dldF9jbG9ja19kaXZpZGVycyhhZGV2LAotCQkJCQkJCSBDT01QVVRFX0dQVUNM S19JTlBVVF9GTEFHX0RFRkFVTFRfR1BVQ0xLLAotCQkJCQkJCSB0YWJsZS0+VmNlTGV2ZWxbY291 bnRdLkZyZXF1ZW5jeSwgZmFsc2UsICZkaXZpZGVycyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4g cmV0OwotCi0JCXRhYmxlLT5WY2VMZXZlbFtjb3VudF0uRGl2aWRlciA9ICh1OClkaXZpZGVycy5w b3N0X2RpdmlkZXI7Ci0KLQkJdGFibGUtPlZjZUxldmVsW2NvdW50XS5GcmVxdWVuY3kgPSBjcHVf dG9fYmUzMih0YWJsZS0+VmNlTGV2ZWxbY291bnRdLkZyZXF1ZW5jeSk7Ci0JCXRhYmxlLT5WY2VM ZXZlbFtjb3VudF0uTWluVm9sdGFnZSA9IGNwdV90b19iZTE2KHRhYmxlLT5WY2VMZXZlbFtjb3Vu dF0uTWluVm9sdGFnZSk7Ci0JfQotCi0JcmV0dXJuIHJldDsKLQotfQotCi1zdGF0aWMgaW50IGNp X3BvcHVsYXRlX3NtY19hY3BfbGV2ZWwoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJ ICAgICBTTVU3X0Rpc2NyZXRlX0RwbVRhYmxlICp0YWJsZSkKLXsKLQl1MzIgY291bnQ7Ci0Jc3Ry dWN0IGF0b21fY2xvY2tfZGl2aWRlcnMgZGl2aWRlcnM7Ci0JaW50IHJldCA9IC1FSU5WQUw7Ci0K LQl0YWJsZS0+QWNwTGV2ZWxDb3VudCA9ICh1OCkKLQkJKGFkZXYtPnBtLmRwbS5keW5fc3RhdGUu YWNwX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZS5jb3VudCk7Ci0KLQlmb3IgKGNvdW50 ID0gMDsgY291bnQgPCB0YWJsZS0+QWNwTGV2ZWxDb3VudDsgY291bnQrKykgewotCQl0YWJsZS0+ QWNwTGV2ZWxbY291bnRdLkZyZXF1ZW5jeSA9Ci0JCQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmFj cF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuZW50cmllc1tjb3VudF0uY2xrOwotCQl0 YWJsZS0+QWNwTGV2ZWxbY291bnRdLk1pblZvbHRhZ2UgPQotCQkJYWRldi0+cG0uZHBtLmR5bl9z dGF0ZS5hY3BfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlLmVudHJpZXNbY291bnRdLnY7 Ci0JCXRhYmxlLT5BY3BMZXZlbFtjb3VudF0uTWluUGhhc2VzID0gMTsKLQotCQlyZXQgPSBhbWRn cHVfYXRvbWJpb3NfZ2V0X2Nsb2NrX2RpdmlkZXJzKGFkZXYsCi0JCQkJCQkJIENPTVBVVEVfR1BV Q0xLX0lOUFVUX0ZMQUdfREVGQVVMVF9HUFVDTEssCi0JCQkJCQkJIHRhYmxlLT5BY3BMZXZlbFtj b3VudF0uRnJlcXVlbmN5LCBmYWxzZSwgJmRpdmlkZXJzKTsKLQkJaWYgKHJldCkKLQkJCXJldHVy biByZXQ7Ci0KLQkJdGFibGUtPkFjcExldmVsW2NvdW50XS5EaXZpZGVyID0gKHU4KWRpdmlkZXJz LnBvc3RfZGl2aWRlcjsKLQotCQl0YWJsZS0+QWNwTGV2ZWxbY291bnRdLkZyZXF1ZW5jeSA9IGNw dV90b19iZTMyKHRhYmxlLT5BY3BMZXZlbFtjb3VudF0uRnJlcXVlbmN5KTsKLQkJdGFibGUtPkFj cExldmVsW2NvdW50XS5NaW5Wb2x0YWdlID0gY3B1X3RvX2JlMTYodGFibGUtPkFjcExldmVsW2Nv dW50XS5NaW5Wb2x0YWdlKTsKLQl9Ci0KLQlyZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgaW50IGNp X3BvcHVsYXRlX3NtY19zYW11X2xldmVsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJ CSAgICAgIFNNVTdfRGlzY3JldGVfRHBtVGFibGUgKnRhYmxlKQotewotCXUzMiBjb3VudDsKLQlz dHJ1Y3QgYXRvbV9jbG9ja19kaXZpZGVycyBkaXZpZGVyczsKLQlpbnQgcmV0ID0gLUVJTlZBTDsK LQotCXRhYmxlLT5TYW11TGV2ZWxDb3VudCA9Ci0JCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUuc2Ft dV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuY291bnQ7Ci0KLQlmb3IgKGNvdW50ID0g MDsgY291bnQgPCB0YWJsZS0+U2FtdUxldmVsQ291bnQ7IGNvdW50KyspIHsKLQkJdGFibGUtPlNh bXVMZXZlbFtjb3VudF0uRnJlcXVlbmN5ID0KLQkJCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUuc2Ft dV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuZW50cmllc1tjb3VudF0uY2xrOwotCQl0 YWJsZS0+U2FtdUxldmVsW2NvdW50XS5NaW5Wb2x0YWdlID0KLQkJCWFkZXYtPnBtLmRwbS5keW5f c3RhdGUuc2FtdV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuZW50cmllc1tjb3VudF0u diAqIFZPTFRBR0VfU0NBTEU7Ci0JCXRhYmxlLT5TYW11TGV2ZWxbY291bnRdLk1pblBoYXNlcyA9 IDE7Ci0KLQkJcmV0ID0gYW1kZ3B1X2F0b21iaW9zX2dldF9jbG9ja19kaXZpZGVycyhhZGV2LAot CQkJCQkJCSBDT01QVVRFX0dQVUNMS19JTlBVVF9GTEFHX0RFRkFVTFRfR1BVQ0xLLAotCQkJCQkJ CSB0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5GcmVxdWVuY3ksIGZhbHNlLCAmZGl2aWRlcnMpOwot CQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5E aXZpZGVyID0gKHU4KWRpdmlkZXJzLnBvc3RfZGl2aWRlcjsKLQotCQl0YWJsZS0+U2FtdUxldmVs W2NvdW50XS5GcmVxdWVuY3kgPSBjcHVfdG9fYmUzMih0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5G cmVxdWVuY3kpOwotCQl0YWJsZS0+U2FtdUxldmVsW2NvdW50XS5NaW5Wb2x0YWdlID0gY3B1X3Rv X2JlMTYodGFibGUtPlNhbXVMZXZlbFtjb3VudF0uTWluVm9sdGFnZSk7Ci0JfQotCi0JcmV0dXJu IHJldDsKLX0KLQotc3RhdGljIGludCBjaV9jYWxjdWxhdGVfbWNsa19wYXJhbXMoc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgIHUzMiBtZW1vcnlfY2xvY2ssCi0JCQkJICAgIFNN VTdfRGlzY3JldGVfTWVtb3J5TGV2ZWwgKm1jbGssCi0JCQkJICAgIGJvb2wgc3Ryb2JlX21vZGUs Ci0JCQkJICAgIGJvb2wgZGxsX3N0YXRlX29uKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpw aSA9IGNpX2dldF9waShhZGV2KTsKLQl1MzIgIGRsbF9jbnRsID0gcGktPmNsb2NrX3JlZ2lzdGVy cy5kbGxfY250bDsKLQl1MzIgIG1jbGtfcHdybWd0X2NudGwgPSBwaS0+Y2xvY2tfcmVnaXN0ZXJz Lm1jbGtfcHdybWd0X2NudGw7Ci0JdTMyICBtcGxsX2FkX2Z1bmNfY250bCA9IHBpLT5jbG9ja19y ZWdpc3RlcnMubXBsbF9hZF9mdW5jX2NudGw7Ci0JdTMyICBtcGxsX2RxX2Z1bmNfY250bCA9IHBp LT5jbG9ja19yZWdpc3RlcnMubXBsbF9kcV9mdW5jX2NudGw7Ci0JdTMyICBtcGxsX2Z1bmNfY250 bCA9IHBpLT5jbG9ja19yZWdpc3RlcnMubXBsbF9mdW5jX2NudGw7Ci0JdTMyICBtcGxsX2Z1bmNf Y250bF8xID0gcGktPmNsb2NrX3JlZ2lzdGVycy5tcGxsX2Z1bmNfY250bF8xOwotCXUzMiAgbXBs bF9mdW5jX2NudGxfMiA9IHBpLT5jbG9ja19yZWdpc3RlcnMubXBsbF9mdW5jX2NudGxfMjsKLQl1 MzIgIG1wbGxfc3MxID0gcGktPmNsb2NrX3JlZ2lzdGVycy5tcGxsX3NzMTsKLQl1MzIgIG1wbGxf c3MyID0gcGktPmNsb2NrX3JlZ2lzdGVycy5tcGxsX3NzMjsKLQlzdHJ1Y3QgYXRvbV9tcGxsX3Bh cmFtIG1wbGxfcGFyYW07Ci0JaW50IHJldDsKLQotCXJldCA9IGFtZGdwdV9hdG9tYmlvc19nZXRf bWVtb3J5X3BsbF9kaXZpZGVycyhhZGV2LCBtZW1vcnlfY2xvY2ssIHN0cm9iZV9tb2RlLCAmbXBs bF9wYXJhbSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCW1wbGxfZnVuY19jbnRsICY9 IH5NUExMX0ZVTkNfQ05UTF9fQldDVFJMX01BU0s7Ci0JbXBsbF9mdW5jX2NudGwgfD0gKG1wbGxf cGFyYW0uYndjbnRsIDw8IE1QTExfRlVOQ19DTlRMX19CV0NUUkxfX1NISUZUKTsKLQotCW1wbGxf ZnVuY19jbnRsXzEgJj0gfihNUExMX0ZVTkNfQ05UTF8xX19DTEtGX01BU0sgfCBNUExMX0ZVTkNf Q05UTF8xX19DTEtGUkFDX01BU0sgfAotCQkJTVBMTF9GVU5DX0NOVExfMV9fVkNPX01PREVfTUFT Syk7Ci0JbXBsbF9mdW5jX2NudGxfMSB8PSAobXBsbF9wYXJhbS5jbGtmKSA8PCBNUExMX0ZVTkNf Q05UTF8xX19DTEtGX19TSElGVCB8Ci0JCShtcGxsX3BhcmFtLmNsa2ZyYWMgPDwgTVBMTF9GVU5D X0NOVExfMV9fQ0xLRlJBQ19fU0hJRlQpIHwKLQkJKG1wbGxfcGFyYW0udmNvX21vZGUgPDwgTVBM TF9GVU5DX0NOVExfMV9fVkNPX01PREVfX1NISUZUKTsKLQotCW1wbGxfYWRfZnVuY19jbnRsICY9 IH5NUExMX0FEX0ZVTkNfQ05UTF9fWUNMS19QT1NUX0RJVl9NQVNLOwotCW1wbGxfYWRfZnVuY19j bnRsIHw9IChtcGxsX3BhcmFtLnBvc3RfZGl2IDw8IE1QTExfQURfRlVOQ19DTlRMX19ZQ0xLX1BP U1RfRElWX19TSElGVCk7Ci0KLQlpZiAoYWRldi0+Z21jLnZyYW1fdHlwZSA9PSBBTURHUFVfVlJB TV9UWVBFX0dERFI1KSB7Ci0JCW1wbGxfZHFfZnVuY19jbnRsICY9IH4oTVBMTF9EUV9GVU5DX0NO VExfX1lDTEtfU0VMX01BU0sgfAotCQkJCU1QTExfQURfRlVOQ19DTlRMX19ZQ0xLX1BPU1RfRElW X01BU0spOwotCQltcGxsX2RxX2Z1bmNfY250bCB8PSAobXBsbF9wYXJhbS55Y2xrX3NlbCA8PCBN UExMX0RRX0ZVTkNfQ05UTF9fWUNMS19TRUxfX1NISUZUKSB8Ci0JCQkJKG1wbGxfcGFyYW0ucG9z dF9kaXYgPDwgTVBMTF9BRF9GVU5DX0NOVExfX1lDTEtfUE9TVF9ESVZfX1NISUZUKTsKLQl9Ci0K LQlpZiAocGktPmNhcHNfbWNsa19zc19zdXBwb3J0KSB7Ci0JCXN0cnVjdCBhbWRncHVfYXRvbV9z cyBzczsKLQkJdTMyIGZyZXFfbm9tOwotCQl1MzIgdG1wOwotCQl1MzIgcmVmZXJlbmNlX2Nsb2Nr ID0gYWRldi0+Y2xvY2subXBsbC5yZWZlcmVuY2VfZnJlcTsKLQotCQlpZiAobXBsbF9wYXJhbS5x ZHIgPT0gMSkKLQkJCWZyZXFfbm9tID0gbWVtb3J5X2Nsb2NrICogNCAqICgxIDw8IG1wbGxfcGFy YW0ucG9zdF9kaXYpOwotCQllbHNlCi0JCQlmcmVxX25vbSA9IG1lbW9yeV9jbG9jayAqIDIgKiAo MSA8PCBtcGxsX3BhcmFtLnBvc3RfZGl2KTsKLQotCQl0bXAgPSAoZnJlcV9ub20gLyByZWZlcmVu Y2VfY2xvY2spOwotCQl0bXAgPSB0bXAgKiB0bXA7Ci0JCWlmIChhbWRncHVfYXRvbWJpb3NfZ2V0 X2FzaWNfc3NfaW5mbyhhZGV2LCAmc3MsCi0JCQkJCQkgICAgIEFTSUNfSU5URVJOQUxfTUVNT1JZ X1NTLCBmcmVxX25vbSkpIHsKLQkJCXUzMiBjbGtzID0gcmVmZXJlbmNlX2Nsb2NrICogNSAvIHNz LnJhdGU7Ci0JCQl1MzIgY2xrdiA9ICh1MzIpKCgoKDEzMSAqIHNzLnBlcmNlbnRhZ2UgKiBzcy5y YXRlKSAvIDEwMCkgKiB0bXApIC8gZnJlcV9ub20pOwotCi0JCQltcGxsX3NzMSAmPSB+TVBMTF9T UzFfX0NMS1ZfTUFTSzsKLQkJCW1wbGxfc3MxIHw9IChjbGt2IDw8IE1QTExfU1MxX19DTEtWX19T SElGVCk7Ci0KLQkJCW1wbGxfc3MyICY9IH5NUExMX1NTMl9fQ0xLU19NQVNLOwotCQkJbXBsbF9z czIgfD0gKGNsa3MgPDwgTVBMTF9TUzJfX0NMS1NfX1NISUZUKTsKLQkJfQotCX0KLQotCW1jbGtf cHdybWd0X2NudGwgJj0gfk1DTEtfUFdSTUdUX0NOVExfX0RMTF9TUEVFRF9NQVNLOwotCW1jbGtf cHdybWd0X2NudGwgfD0gKG1wbGxfcGFyYW0uZGxsX3NwZWVkIDw8IE1DTEtfUFdSTUdUX0NOVExf X0RMTF9TUEVFRF9fU0hJRlQpOwotCi0JaWYgKGRsbF9zdGF0ZV9vbikKLQkJbWNsa19wd3JtZ3Rf Y250bCB8PSBNQ0xLX1BXUk1HVF9DTlRMX19NUkRDSzBfUEROQl9NQVNLIHwKLQkJCU1DTEtfUFdS TUdUX0NOVExfX01SRENLMV9QRE5CX01BU0s7Ci0JZWxzZQotCQltY2xrX3B3cm1ndF9jbnRsICY9 IH4oTUNMS19QV1JNR1RfQ05UTF9fTVJEQ0swX1BETkJfTUFTSyB8Ci0JCQlNQ0xLX1BXUk1HVF9D TlRMX19NUkRDSzFfUEROQl9NQVNLKTsKLQotCW1jbGstPk1jbGtGcmVxdWVuY3kgPSBtZW1vcnlf Y2xvY2s7Ci0JbWNsay0+TXBsbEZ1bmNDbnRsID0gbXBsbF9mdW5jX2NudGw7Ci0JbWNsay0+TXBs bEZ1bmNDbnRsXzEgPSBtcGxsX2Z1bmNfY250bF8xOwotCW1jbGstPk1wbGxGdW5jQ250bF8yID0g bXBsbF9mdW5jX2NudGxfMjsKLQltY2xrLT5NcGxsQWRGdW5jQ250bCA9IG1wbGxfYWRfZnVuY19j bnRsOwotCW1jbGstPk1wbGxEcUZ1bmNDbnRsID0gbXBsbF9kcV9mdW5jX2NudGw7Ci0JbWNsay0+ TWNsa1B3cm1ndENudGwgPSBtY2xrX3B3cm1ndF9jbnRsOwotCW1jbGstPkRsbENudGwgPSBkbGxf Y250bDsKLQltY2xrLT5NcGxsU3MxID0gbXBsbF9zczE7Ci0JbWNsay0+TXBsbFNzMiA9IG1wbGxf c3MyOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9wdWxhdGVfc2luZ2xlX21l bW9yeV9sZXZlbChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJICAgdTMyIG1lbW9y eV9jbG9jaywKLQkJCQkJICAgU01VN19EaXNjcmV0ZV9NZW1vcnlMZXZlbCAqbWVtb3J5X2xldmVs KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlpbnQg cmV0OwotCWJvb2wgZGxsX3N0YXRlX29uOwotCi0JaWYgKGFkZXYtPnBtLmRwbS5keW5fc3RhdGUu dmRkY19kZXBlbmRlbmN5X29uX21jbGsuZW50cmllcykgewotCQlyZXQgPSBjaV9nZXRfZGVwZW5k ZW5jeV92b2x0X2J5X2NsayhhZGV2LAotCQkJCQkJICAgICZhZGV2LT5wbS5kcG0uZHluX3N0YXRl LnZkZGNfZGVwZW5kZW5jeV9vbl9tY2xrLAotCQkJCQkJICAgIG1lbW9yeV9jbG9jaywgJm1lbW9y eV9sZXZlbC0+TWluVmRkYyk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCX0KLQotCWlm IChhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNpX2RlcGVuZGVuY3lfb25fbWNsay5lbnRyaWVz KSB7Ci0JCXJldCA9IGNpX2dldF9kZXBlbmRlbmN5X3ZvbHRfYnlfY2xrKGFkZXYsCi0JCQkJCQkg ICAgJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY2lfZGVwZW5kZW5jeV9vbl9tY2xrLAotCQkJ CQkJICAgIG1lbW9yeV9jbG9jaywgJm1lbW9yeV9sZXZlbC0+TWluVmRkY2kpOwotCQlpZiAocmV0 KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlpZiAoYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tdmRk X2RlcGVuZGVuY3lfb25fbWNsay5lbnRyaWVzKSB7Ci0JCXJldCA9IGNpX2dldF9kZXBlbmRlbmN5 X3ZvbHRfYnlfY2xrKGFkZXYsCi0JCQkJCQkgICAgJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubXZk ZF9kZXBlbmRlbmN5X29uX21jbGssCi0JCQkJCQkgICAgbWVtb3J5X2Nsb2NrLCAmbWVtb3J5X2xl dmVsLT5NaW5NdmRkKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JbWVtb3J5 X2xldmVsLT5NaW5WZGRjUGhhc2VzID0gMTsKLQotCWlmIChwaS0+dmRkY19waGFzZV9zaGVkX2Nv bnRyb2wpCi0JCWNpX3BvcHVsYXRlX3BoYXNlX3ZhbHVlX2Jhc2VkX29uX21jbGsoYWRldiwKLQkJ CQkJCSAgICAgICZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnBoYXNlX3NoZWRkaW5nX2xpbWl0c190 YWJsZSwKLQkJCQkJCSAgICAgIG1lbW9yeV9jbG9jaywKLQkJCQkJCSAgICAgICZtZW1vcnlfbGV2 ZWwtPk1pblZkZGNQaGFzZXMpOwotCi0JbWVtb3J5X2xldmVsLT5FbmFibGVkRm9yQWN0aXZpdHkg PSAxOwotCW1lbW9yeV9sZXZlbC0+RW5hYmxlZEZvclRocm90dGxlID0gMTsKLQltZW1vcnlfbGV2 ZWwtPlVwSCA9IDA7Ci0JbWVtb3J5X2xldmVsLT5Eb3duSCA9IDEwMDsKLQltZW1vcnlfbGV2ZWwt PlZvbHRhZ2VEb3duSCA9IDA7Ci0JbWVtb3J5X2xldmVsLT5BY3Rpdml0eUxldmVsID0gKHUxNilw aS0+bWNsa19hY3Rpdml0eV90YXJnZXQ7Ci0KLQltZW1vcnlfbGV2ZWwtPlN0dXR0ZXJFbmFibGUg PSBmYWxzZTsKLQltZW1vcnlfbGV2ZWwtPlN0cm9iZUVuYWJsZSA9IGZhbHNlOwotCW1lbW9yeV9s ZXZlbC0+RWRjUmVhZEVuYWJsZSA9IGZhbHNlOwotCW1lbW9yeV9sZXZlbC0+RWRjV3JpdGVFbmFi bGUgPSBmYWxzZTsKLQltZW1vcnlfbGV2ZWwtPlJ0dEVuYWJsZSA9IGZhbHNlOwotCi0JbWVtb3J5 X2xldmVsLT5EaXNwbGF5V2F0ZXJtYXJrID0gUFBTTUNfRElTUExBWV9XQVRFUk1BUktfTE9XOwot Ci0JaWYgKHBpLT5tY2xrX3N0dXR0ZXJfbW9kZV90aHJlc2hvbGQgJiYKLQkgICAgKG1lbW9yeV9j bG9jayA8PSBwaS0+bWNsa19zdHV0dGVyX21vZGVfdGhyZXNob2xkKSAmJgotCSAgICAoIXBpLT51 dmRfZW5hYmxlZCkgJiYKLQkgICAgKFJSRUczMihtbURQR19QSVBFX1NUVVRURVJfQ09OVFJPTCkg JiBEUEdfUElQRV9TVFVUVEVSX0NPTlRST0xfX1NUVVRURVJfRU5BQkxFX01BU0spICYmCi0JICAg IChhZGV2LT5wbS5kcG0ubmV3X2FjdGl2ZV9jcnRjX2NvdW50IDw9IDIpKQotCQltZW1vcnlfbGV2 ZWwtPlN0dXR0ZXJFbmFibGUgPSB0cnVlOwotCi0JaWYgKHBpLT5tY2xrX3N0cm9iZV9tb2RlX3Ro cmVzaG9sZCAmJgotCSAgICAobWVtb3J5X2Nsb2NrIDw9IHBpLT5tY2xrX3N0cm9iZV9tb2RlX3Ro cmVzaG9sZCkpCi0JCW1lbW9yeV9sZXZlbC0+U3Ryb2JlRW5hYmxlID0gMTsKLQotCWlmIChhZGV2 LT5nbWMudnJhbV90eXBlID09IEFNREdQVV9WUkFNX1RZUEVfR0REUjUpIHsKLQkJbWVtb3J5X2xl dmVsLT5TdHJvYmVSYXRpbyA9Ci0JCQljaV9nZXRfbWNsa19mcmVxdWVuY3lfcmF0aW8obWVtb3J5 X2Nsb2NrLCBtZW1vcnlfbGV2ZWwtPlN0cm9iZUVuYWJsZSk7Ci0JCWlmIChwaS0+bWNsa19lZGNf ZW5hYmxlX3RocmVzaG9sZCAmJgotCQkgICAgKG1lbW9yeV9jbG9jayA+IHBpLT5tY2xrX2VkY19l bmFibGVfdGhyZXNob2xkKSkKLQkJCW1lbW9yeV9sZXZlbC0+RWRjUmVhZEVuYWJsZSA9IHRydWU7 Ci0KLQkJaWYgKHBpLT5tY2xrX2VkY193cl9lbmFibGVfdGhyZXNob2xkICYmCi0JCSAgICAobWVt b3J5X2Nsb2NrID4gcGktPm1jbGtfZWRjX3dyX2VuYWJsZV90aHJlc2hvbGQpKQotCQkJbWVtb3J5 X2xldmVsLT5FZGNXcml0ZUVuYWJsZSA9IHRydWU7Ci0KLQkJaWYgKG1lbW9yeV9sZXZlbC0+U3Ry b2JlRW5hYmxlKSB7Ci0JCQlpZiAoY2lfZ2V0X21jbGtfZnJlcXVlbmN5X3JhdGlvKG1lbW9yeV9j bG9jaywgdHJ1ZSkgPj0KLQkJCSAgICAoKFJSRUczMihtbU1DX1NFUV9NSVNDNykgPj4gMTYpICYg MHhmKSkKLQkJCQlkbGxfc3RhdGVfb24gPSAoKFJSRUczMihtbU1DX1NFUV9NSVNDNSkgPj4gMSkg JiAweDEpID8gdHJ1ZSA6IGZhbHNlOwotCQkJZWxzZQotCQkJCWRsbF9zdGF0ZV9vbiA9ICgoUlJF RzMyKG1tTUNfU0VRX01JU0M2KSA+PiAxKSAmIDB4MSkgPyB0cnVlIDogZmFsc2U7Ci0JCX0gZWxz ZSB7Ci0JCQlkbGxfc3RhdGVfb24gPSBwaS0+ZGxsX2RlZmF1bHRfb247Ci0JCX0KLQl9IGVsc2Ug ewotCQltZW1vcnlfbGV2ZWwtPlN0cm9iZVJhdGlvID0gY2lfZ2V0X2RkcjNfbWNsa19mcmVxdWVu Y3lfcmF0aW8obWVtb3J5X2Nsb2NrKTsKLQkJZGxsX3N0YXRlX29uID0gKChSUkVHMzIobW1NQ19T RVFfTUlTQzUpID4+IDEpICYgMHgxKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQlyZXQgPSBjaV9j YWxjdWxhdGVfbWNsa19wYXJhbXMoYWRldiwgbWVtb3J5X2Nsb2NrLCBtZW1vcnlfbGV2ZWwsIG1l bW9yeV9sZXZlbC0+U3Ryb2JlRW5hYmxlLCBkbGxfc3RhdGVfb24pOwotCWlmIChyZXQpCi0JCXJl dHVybiByZXQ7Ci0KLQltZW1vcnlfbGV2ZWwtPk1pblZkZGMgPSBjcHVfdG9fYmUzMihtZW1vcnlf bGV2ZWwtPk1pblZkZGMgKiBWT0xUQUdFX1NDQUxFKTsKLQltZW1vcnlfbGV2ZWwtPk1pblZkZGNQ aGFzZXMgPSBjcHVfdG9fYmUzMihtZW1vcnlfbGV2ZWwtPk1pblZkZGNQaGFzZXMpOwotCW1lbW9y eV9sZXZlbC0+TWluVmRkY2kgPSBjcHVfdG9fYmUzMihtZW1vcnlfbGV2ZWwtPk1pblZkZGNpICog Vk9MVEFHRV9TQ0FMRSk7Ci0JbWVtb3J5X2xldmVsLT5NaW5NdmRkID0gY3B1X3RvX2JlMzIobWVt b3J5X2xldmVsLT5NaW5NdmRkICogVk9MVEFHRV9TQ0FMRSk7Ci0KLQltZW1vcnlfbGV2ZWwtPk1j bGtGcmVxdWVuY3kgPSBjcHVfdG9fYmUzMihtZW1vcnlfbGV2ZWwtPk1jbGtGcmVxdWVuY3kpOwot CW1lbW9yeV9sZXZlbC0+QWN0aXZpdHlMZXZlbCA9IGNwdV90b19iZTE2KG1lbW9yeV9sZXZlbC0+ QWN0aXZpdHlMZXZlbCk7Ci0JbWVtb3J5X2xldmVsLT5NcGxsRnVuY0NudGwgPSBjcHVfdG9fYmUz MihtZW1vcnlfbGV2ZWwtPk1wbGxGdW5jQ250bCk7Ci0JbWVtb3J5X2xldmVsLT5NcGxsRnVuY0Nu dGxfMSA9IGNwdV90b19iZTMyKG1lbW9yeV9sZXZlbC0+TXBsbEZ1bmNDbnRsXzEpOwotCW1lbW9y eV9sZXZlbC0+TXBsbEZ1bmNDbnRsXzIgPSBjcHVfdG9fYmUzMihtZW1vcnlfbGV2ZWwtPk1wbGxG dW5jQ250bF8yKTsKLQltZW1vcnlfbGV2ZWwtPk1wbGxBZEZ1bmNDbnRsID0gY3B1X3RvX2JlMzIo bWVtb3J5X2xldmVsLT5NcGxsQWRGdW5jQ250bCk7Ci0JbWVtb3J5X2xldmVsLT5NcGxsRHFGdW5j Q250bCA9IGNwdV90b19iZTMyKG1lbW9yeV9sZXZlbC0+TXBsbERxRnVuY0NudGwpOwotCW1lbW9y eV9sZXZlbC0+TWNsa1B3cm1ndENudGwgPSBjcHVfdG9fYmUzMihtZW1vcnlfbGV2ZWwtPk1jbGtQ d3JtZ3RDbnRsKTsKLQltZW1vcnlfbGV2ZWwtPkRsbENudGwgPSBjcHVfdG9fYmUzMihtZW1vcnlf bGV2ZWwtPkRsbENudGwpOwotCW1lbW9yeV9sZXZlbC0+TXBsbFNzMSA9IGNwdV90b19iZTMyKG1l bW9yeV9sZXZlbC0+TXBsbFNzMSk7Ci0JbWVtb3J5X2xldmVsLT5NcGxsU3MyID0gY3B1X3RvX2Jl MzIobWVtb3J5X2xldmVsLT5NcGxsU3MyKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IGNpX3BvcHVsYXRlX3NtY19hY3BpX2xldmVsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAot CQkJCSAgICAgIFNNVTdfRGlzY3JldGVfRHBtVGFibGUgKnRhYmxlKQotewotCXN0cnVjdCBjaV9w b3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgYXRvbV9jbG9ja19kaXZp ZGVycyBkaXZpZGVyczsKLQlTTVU3X0Rpc2NyZXRlX1ZvbHRhZ2VMZXZlbCB2b2x0YWdlX2xldmVs OwotCXUzMiBzcGxsX2Z1bmNfY250bCA9IHBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9mdW5j X2NudGw7Ci0JdTMyIHNwbGxfZnVuY19jbnRsXzIgPSBwaS0+Y2xvY2tfcmVnaXN0ZXJzLmNnX3Nw bGxfZnVuY19jbnRsXzI7Ci0JdTMyIGRsbF9jbnRsID0gcGktPmNsb2NrX3JlZ2lzdGVycy5kbGxf Y250bDsKLQl1MzIgbWNsa19wd3JtZ3RfY250bCA9IHBpLT5jbG9ja19yZWdpc3RlcnMubWNsa19w d3JtZ3RfY250bDsKLQlpbnQgcmV0OwotCi0JdGFibGUtPkFDUElMZXZlbC5GbGFncyAmPSB+UFBT TUNfU1dTVEFURV9GTEFHX0RDOwotCi0JaWYgKHBpLT5hY3BpX3ZkZGMpCi0JCXRhYmxlLT5BQ1BJ TGV2ZWwuTWluVmRkYyA9IGNwdV90b19iZTMyKHBpLT5hY3BpX3ZkZGMgKiBWT0xUQUdFX1NDQUxF KTsKLQllbHNlCi0JCXRhYmxlLT5BQ1BJTGV2ZWwuTWluVmRkYyA9IGNwdV90b19iZTMyKHBpLT5t aW5fdmRkY19pbl9wcF90YWJsZSAqIFZPTFRBR0VfU0NBTEUpOwotCi0JdGFibGUtPkFDUElMZXZl bC5NaW5WZGRjUGhhc2VzID0gcGktPnZkZGNfcGhhc2Vfc2hlZF9jb250cm9sID8gMCA6IDE7Ci0K LQl0YWJsZS0+QUNQSUxldmVsLlNjbGtGcmVxdWVuY3kgPSBhZGV2LT5jbG9jay5zcGxsLnJlZmVy ZW5jZV9mcmVxOwotCi0JcmV0ID0gYW1kZ3B1X2F0b21iaW9zX2dldF9jbG9ja19kaXZpZGVycyhh ZGV2LAotCQkJCQkJIENPTVBVVEVfR1BVQ0xLX0lOUFVUX0ZMQUdfU0NMSywKLQkJCQkJCSB0YWJs ZS0+QUNQSUxldmVsLlNjbGtGcmVxdWVuY3ksIGZhbHNlLCAmZGl2aWRlcnMpOwotCWlmIChyZXQp Ci0JCXJldHVybiByZXQ7Ci0KLQl0YWJsZS0+QUNQSUxldmVsLlNjbGtEaWQgPSAodTgpZGl2aWRl cnMucG9zdF9kaXZpZGVyOwotCXRhYmxlLT5BQ1BJTGV2ZWwuRGlzcGxheVdhdGVybWFyayA9IFBQ U01DX0RJU1BMQVlfV0FURVJNQVJLX0xPVzsKLQl0YWJsZS0+QUNQSUxldmVsLkRlZXBTbGVlcERp dklkID0gMDsKLQotCXNwbGxfZnVuY19jbnRsICY9IH5DR19TUExMX0ZVTkNfQ05UTF9fU1BMTF9Q V1JPTl9NQVNLOwotCXNwbGxfZnVuY19jbnRsIHw9IENHX1NQTExfRlVOQ19DTlRMX19TUExMX1JF U0VUX01BU0s7Ci0KLQlzcGxsX2Z1bmNfY250bF8yICY9IH5DR19TUExMX0ZVTkNfQ05UTF8yX19T Q0xLX01VWF9TRUxfTUFTSzsKLQlzcGxsX2Z1bmNfY250bF8yIHw9ICg0IDw8IENHX1NQTExfRlVO Q19DTlRMXzJfX1NDTEtfTVVYX1NFTF9fU0hJRlQpOwotCi0JdGFibGUtPkFDUElMZXZlbC5DZ1Nw bGxGdW5jQ250bCA9IHNwbGxfZnVuY19jbnRsOwotCXRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVu Y0NudGwyID0gc3BsbF9mdW5jX2NudGxfMjsKLQl0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmND bnRsMyA9IHBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9mdW5jX2NudGxfMzsKLQl0YWJsZS0+ QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsNCA9IHBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9m dW5jX2NudGxfNDsKLQl0YWJsZS0+QUNQSUxldmVsLlNwbGxTcHJlYWRTcGVjdHJ1bSA9IHBpLT5j bG9ja19yZWdpc3RlcnMuY2dfc3BsbF9zcHJlYWRfc3BlY3RydW07Ci0JdGFibGUtPkFDUElMZXZl bC5TcGxsU3ByZWFkU3BlY3RydW0yID0gcGktPmNsb2NrX3JlZ2lzdGVycy5jZ19zcGxsX3NwcmVh ZF9zcGVjdHJ1bV8yOwotCXRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JEeW5SbSA9IDA7Ci0JdGFibGUt PkFDUElMZXZlbC5DY1B3ckR5blJtMSA9IDA7Ci0KLQl0YWJsZS0+QUNQSUxldmVsLkZsYWdzID0g Y3B1X3RvX2JlMzIodGFibGUtPkFDUElMZXZlbC5GbGFncyk7Ci0JdGFibGUtPkFDUElMZXZlbC5N aW5WZGRjUGhhc2VzID0gY3B1X3RvX2JlMzIodGFibGUtPkFDUElMZXZlbC5NaW5WZGRjUGhhc2Vz KTsKLQl0YWJsZS0+QUNQSUxldmVsLlNjbGtGcmVxdWVuY3kgPSBjcHVfdG9fYmUzMih0YWJsZS0+ QUNQSUxldmVsLlNjbGtGcmVxdWVuY3kpOwotCXRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0Nu dGwgPSBjcHVfdG9fYmUzMih0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsKTsKLQl0YWJs ZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsMiA9IGNwdV90b19iZTMyKHRhYmxlLT5BQ1BJTGV2 ZWwuQ2dTcGxsRnVuY0NudGwyKTsKLQl0YWJsZS0+QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsMyA9 IGNwdV90b19iZTMyKHRhYmxlLT5BQ1BJTGV2ZWwuQ2dTcGxsRnVuY0NudGwzKTsKLQl0YWJsZS0+ QUNQSUxldmVsLkNnU3BsbEZ1bmNDbnRsNCA9IGNwdV90b19iZTMyKHRhYmxlLT5BQ1BJTGV2ZWwu Q2dTcGxsRnVuY0NudGw0KTsKLQl0YWJsZS0+QUNQSUxldmVsLlNwbGxTcHJlYWRTcGVjdHJ1bSA9 IGNwdV90b19iZTMyKHRhYmxlLT5BQ1BJTGV2ZWwuU3BsbFNwcmVhZFNwZWN0cnVtKTsKLQl0YWJs ZS0+QUNQSUxldmVsLlNwbGxTcHJlYWRTcGVjdHJ1bTIgPSBjcHVfdG9fYmUzMih0YWJsZS0+QUNQ SUxldmVsLlNwbGxTcHJlYWRTcGVjdHJ1bTIpOwotCXRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JEeW5S bSA9IGNwdV90b19iZTMyKHRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JEeW5SbSk7Ci0JdGFibGUtPkFD UElMZXZlbC5DY1B3ckR5blJtMSA9IGNwdV90b19iZTMyKHRhYmxlLT5BQ1BJTGV2ZWwuQ2NQd3JE eW5SbTEpOwotCi0JdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NaW5WZGRjID0gdGFibGUtPkFDUElM ZXZlbC5NaW5WZGRjOwotCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTWluVmRkY1BoYXNlcyA9IHRh YmxlLT5BQ1BJTGV2ZWwuTWluVmRkY1BoYXNlczsKLQotCWlmIChwaS0+dmRkY2lfY29udHJvbCAh PSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xfTk9ORSkgewotCQlpZiAocGktPmFjcGlfdmRkY2kp Ci0JCQl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1pblZkZGNpID0KLQkJCQljcHVfdG9fYmUzMihw aS0+YWNwaV92ZGRjaSAqIFZPTFRBR0VfU0NBTEUpOwotCQllbHNlCi0JCQl0YWJsZS0+TWVtb3J5 QUNQSUxldmVsLk1pblZkZGNpID0KLQkJCQljcHVfdG9fYmUzMihwaS0+bWluX3ZkZGNpX2luX3Bw X3RhYmxlICogVk9MVEFHRV9TQ0FMRSk7Ci0JfQotCi0JaWYgKGNpX3BvcHVsYXRlX212ZGRfdmFs dWUoYWRldiwgMCwgJnZvbHRhZ2VfbGV2ZWwpKQotCQl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1p bk12ZGQgPSAwOwotCWVsc2UKLQkJdGFibGUtPk1lbW9yeUFDUElMZXZlbC5NaW5NdmRkID0KLQkJ CWNwdV90b19iZTMyKHZvbHRhZ2VfbGV2ZWwuVm9sdGFnZSAqIFZPTFRBR0VfU0NBTEUpOwotCi0J bWNsa19wd3JtZ3RfY250bCB8PSBNQ0xLX1BXUk1HVF9DTlRMX19NUkRDSzBfUkVTRVRfTUFTSyB8 Ci0JCU1DTEtfUFdSTUdUX0NOVExfX01SRENLMV9SRVNFVF9NQVNLOwotCW1jbGtfcHdybWd0X2Nu dGwgJj0gfihNQ0xLX1BXUk1HVF9DTlRMX19NUkRDSzBfUEROQl9NQVNLIHwKLQkJCU1DTEtfUFdS TUdUX0NOVExfX01SRENLMV9QRE5CX01BU0spOwotCi0JZGxsX2NudGwgJj0gfihETExfQ05UTF9f TVJEQ0swX0JZUEFTU19NQVNLIHwgRExMX0NOVExfX01SRENLMV9CWVBBU1NfTUFTSyk7Ci0KLQl0 YWJsZS0+TWVtb3J5QUNQSUxldmVsLkRsbENudGwgPSBjcHVfdG9fYmUzMihkbGxfY250bCk7Ci0J dGFibGUtPk1lbW9yeUFDUElMZXZlbC5NY2xrUHdybWd0Q250bCA9IGNwdV90b19iZTMyKG1jbGtf cHdybWd0X2NudGwpOwotCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuTXBsbEFkRnVuY0NudGwgPQot CQljcHVfdG9fYmUzMihwaS0+Y2xvY2tfcmVnaXN0ZXJzLm1wbGxfYWRfZnVuY19jbnRsKTsKLQl0 YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1wbGxEcUZ1bmNDbnRsID0KLQkJY3B1X3RvX2JlMzIocGkt PmNsb2NrX3JlZ2lzdGVycy5tcGxsX2RxX2Z1bmNfY250bCk7Ci0JdGFibGUtPk1lbW9yeUFDUElM ZXZlbC5NcGxsRnVuY0NudGwgPQotCQljcHVfdG9fYmUzMihwaS0+Y2xvY2tfcmVnaXN0ZXJzLm1w bGxfZnVuY19jbnRsKTsKLQl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1wbGxGdW5jQ250bF8xID0K LQkJY3B1X3RvX2JlMzIocGktPmNsb2NrX3JlZ2lzdGVycy5tcGxsX2Z1bmNfY250bF8xKTsKLQl0 YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1wbGxGdW5jQ250bF8yID0KLQkJY3B1X3RvX2JlMzIocGkt PmNsb2NrX3JlZ2lzdGVycy5tcGxsX2Z1bmNfY250bF8yKTsKLQl0YWJsZS0+TWVtb3J5QUNQSUxl dmVsLk1wbGxTczEgPSBjcHVfdG9fYmUzMihwaS0+Y2xvY2tfcmVnaXN0ZXJzLm1wbGxfc3MxKTsK LQl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLk1wbGxTczIgPSBjcHVfdG9fYmUzMihwaS0+Y2xvY2tf cmVnaXN0ZXJzLm1wbGxfc3MyKTsKLQotCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuRW5hYmxlZEZv clRocm90dGxlID0gMDsKLQl0YWJsZS0+TWVtb3J5QUNQSUxldmVsLkVuYWJsZWRGb3JBY3Rpdml0 eSA9IDA7Ci0JdGFibGUtPk1lbW9yeUFDUElMZXZlbC5VcEggPSAwOwotCXRhYmxlLT5NZW1vcnlB Q1BJTGV2ZWwuRG93bkggPSAxMDA7Ci0JdGFibGUtPk1lbW9yeUFDUElMZXZlbC5Wb2x0YWdlRG93 bkggPSAwOwotCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuQWN0aXZpdHlMZXZlbCA9Ci0JCWNwdV90 b19iZTE2KCh1MTYpcGktPm1jbGtfYWN0aXZpdHlfdGFyZ2V0KTsKLQotCXRhYmxlLT5NZW1vcnlB Q1BJTGV2ZWwuU3R1dHRlckVuYWJsZSA9IGZhbHNlOwotCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwu U3Ryb2JlRW5hYmxlID0gZmFsc2U7Ci0JdGFibGUtPk1lbW9yeUFDUElMZXZlbC5FZGNSZWFkRW5h YmxlID0gZmFsc2U7Ci0JdGFibGUtPk1lbW9yeUFDUElMZXZlbC5FZGNXcml0ZUVuYWJsZSA9IGZh bHNlOwotCXRhYmxlLT5NZW1vcnlBQ1BJTGV2ZWwuUnR0RW5hYmxlID0gZmFsc2U7Ci0KLQlyZXR1 cm4gMDsKLX0KLQotCi1zdGF0aWMgaW50IGNpX2VuYWJsZV91bHYoc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYsIGJvb2wgZW5hYmxlKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNp X2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgY2lfdWx2X3Bhcm0gKnVsdiA9ICZwaS0+dWx2OwotCi0J aWYgKHVsdi0+c3VwcG9ydGVkKSB7Ci0JCWlmIChlbmFibGUpCi0JCQlyZXR1cm4gKGFtZGdwdV9j aV9zZW5kX21zZ190b19zbWMoYWRldiwgUFBTTUNfTVNHX0VuYWJsZVVMVikgPT0gUFBTTUNfUmVz dWx0X09LKSA/Ci0JCQkJMCA6IC1FSU5WQUw7Ci0JCWVsc2UKLQkJCXJldHVybiAoYW1kZ3B1X2Np X3NlbmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfRGlzYWJsZVVMVikgPT0gUFBTTUNfUmVz dWx0X09LKSA/Ci0JCQkJMCA6IC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRp YyBpbnQgY2lfcG9wdWxhdGVfdWx2X2xldmVsKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAot CQkJCSBTTVU3X0Rpc2NyZXRlX1VsdiAqc3RhdGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8g KnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXUxNiB1bHZfdm9sdGFnZSA9IGFkZXYtPnBtLmRwbS5i YWNrYmlhc19yZXNwb25zZV90aW1lOwotCi0Jc3RhdGUtPkNjUHdyRHluUm0gPSAwOwotCXN0YXRl LT5DY1B3ckR5blJtMSA9IDA7Ci0KLQlpZiAodWx2X3ZvbHRhZ2UgPT0gMCkgewotCQlwaS0+dWx2 LnN1cHBvcnRlZCA9IGZhbHNlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlpZiAocGktPnZvbHRhZ2Vf Y29udHJvbCAhPSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDIpIHsKLQkJaWYgKHVs dl92b2x0YWdlID4gYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVuZGVuY3lfb25fc2Ns ay5lbnRyaWVzWzBdLnYpCi0JCQlzdGF0ZS0+VmRkY09mZnNldCA9IDA7Ci0JCWVsc2UKLQkJCXN0 YXRlLT5WZGRjT2Zmc2V0ID0KLQkJCQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5k ZW5jeV9vbl9zY2xrLmVudHJpZXNbMF0udiAtIHVsdl92b2x0YWdlOwotCX0gZWxzZSB7Ci0JCWlm ICh1bHZfdm9sdGFnZSA+IGFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29u X3NjbGsuZW50cmllc1swXS52KQotCQkJc3RhdGUtPlZkZGNPZmZzZXRWaWQgPSAwOwotCQllbHNl Ci0JCQlzdGF0ZS0+VmRkY09mZnNldFZpZCA9ICh1OCkKLQkJCQkoKGFkZXYtPnBtLmRwbS5keW5f c3RhdGUudmRkY19kZXBlbmRlbmN5X29uX3NjbGsuZW50cmllc1swXS52IC0gdWx2X3ZvbHRhZ2Up ICoKLQkJCQkgVk9MVEFHRV9WSURfT0ZGU0VUX1NDQUxFMiAvIFZPTFRBR0VfVklEX09GRlNFVF9T Q0FMRTEpOwotCX0KLQlzdGF0ZS0+VmRkY1BoYXNlID0gcGktPnZkZGNfcGhhc2Vfc2hlZF9jb250 cm9sID8gMCA6IDE7Ci0KLQlzdGF0ZS0+Q2NQd3JEeW5SbSA9IGNwdV90b19iZTMyKHN0YXRlLT5D Y1B3ckR5blJtKTsKLQlzdGF0ZS0+Q2NQd3JEeW5SbTEgPSBjcHVfdG9fYmUzMihzdGF0ZS0+Q2NQ d3JEeW5SbTEpOwotCXN0YXRlLT5WZGRjT2Zmc2V0ID0gY3B1X3RvX2JlMTYoc3RhdGUtPlZkZGNP ZmZzZXQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfY2FsY3VsYXRlX3NjbGtf cGFyYW1zKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCSAgICB1MzIgZW5naW5lX2Ns b2NrLAotCQkJCSAgICBTTVU3X0Rpc2NyZXRlX0dyYXBoaWNzTGV2ZWwgKnNjbGspCi17Ci0Jc3Ry dWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXN0cnVjdCBhdG9tX2Ns b2NrX2RpdmlkZXJzIGRpdmlkZXJzOwotCXUzMiBzcGxsX2Z1bmNfY250bF8zID0gcGktPmNsb2Nr X3JlZ2lzdGVycy5jZ19zcGxsX2Z1bmNfY250bF8zOwotCXUzMiBzcGxsX2Z1bmNfY250bF80ID0g cGktPmNsb2NrX3JlZ2lzdGVycy5jZ19zcGxsX2Z1bmNfY250bF80OwotCXUzMiBjZ19zcGxsX3Nw cmVhZF9zcGVjdHJ1bSA9IHBpLT5jbG9ja19yZWdpc3RlcnMuY2dfc3BsbF9zcHJlYWRfc3BlY3Ry dW07Ci0JdTMyIGNnX3NwbGxfc3ByZWFkX3NwZWN0cnVtXzIgPSBwaS0+Y2xvY2tfcmVnaXN0ZXJz LmNnX3NwbGxfc3ByZWFkX3NwZWN0cnVtXzI7Ci0JdTMyIHJlZmVyZW5jZV9jbG9jayA9IGFkZXYt PmNsb2NrLnNwbGwucmVmZXJlbmNlX2ZyZXE7Ci0JdTMyIHJlZmVyZW5jZV9kaXZpZGVyOwotCXUz MiBmYmRpdjsKLQlpbnQgcmV0OwotCi0JcmV0ID0gYW1kZ3B1X2F0b21iaW9zX2dldF9jbG9ja19k aXZpZGVycyhhZGV2LAotCQkJCQkJIENPTVBVVEVfR1BVQ0xLX0lOUFVUX0ZMQUdfU0NMSywKLQkJ CQkJCSBlbmdpbmVfY2xvY2ssIGZhbHNlLCAmZGl2aWRlcnMpOwotCWlmIChyZXQpCi0JCXJldHVy biByZXQ7Ci0KLQlyZWZlcmVuY2VfZGl2aWRlciA9IDEgKyBkaXZpZGVycy5yZWZfZGl2OwotCWZi ZGl2ID0gZGl2aWRlcnMuZmJfZGl2ICYgMHgzRkZGRkZGOwotCi0Jc3BsbF9mdW5jX2NudGxfMyAm PSB+Q0dfU1BMTF9GVU5DX0NOVExfM19fU1BMTF9GQl9ESVZfTUFTSzsKLQlzcGxsX2Z1bmNfY250 bF8zIHw9IChmYmRpdiA8PCBDR19TUExMX0ZVTkNfQ05UTF8zX19TUExMX0ZCX0RJVl9fU0hJRlQp OwotCXNwbGxfZnVuY19jbnRsXzMgfD0gQ0dfU1BMTF9GVU5DX0NOVExfM19fU1BMTF9ESVRIRU5f TUFTSzsKLQotCWlmIChwaS0+Y2Fwc19zY2xrX3NzX3N1cHBvcnQpIHsKLQkJc3RydWN0IGFtZGdw dV9hdG9tX3NzIHNzOwotCQl1MzIgdmNvX2ZyZXEgPSBlbmdpbmVfY2xvY2sgKiBkaXZpZGVycy5w b3N0X2RpdjsKLQotCQlpZiAoYW1kZ3B1X2F0b21iaW9zX2dldF9hc2ljX3NzX2luZm8oYWRldiwg JnNzLAotCQkJCQkJICAgICBBU0lDX0lOVEVSTkFMX0VOR0lORV9TUywgdmNvX2ZyZXEpKSB7Ci0J CQl1MzIgY2xrX3MgPSByZWZlcmVuY2VfY2xvY2sgKiA1IC8gKHJlZmVyZW5jZV9kaXZpZGVyICog c3MucmF0ZSk7Ci0JCQl1MzIgY2xrX3YgPSA0ICogc3MucGVyY2VudGFnZSAqIGZiZGl2IC8gKGNs a19zICogMTAwMDApOwotCi0JCQljZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bSAmPSB+KENHX1NQTExf U1BSRUFEX1NQRUNUUlVNX19DTEtTX01BU0sgfCBDR19TUExMX1NQUkVBRF9TUEVDVFJVTV9fU1NF Tl9NQVNLKTsKLQkJCWNnX3NwbGxfc3ByZWFkX3NwZWN0cnVtIHw9IChjbGtfcyA8PCBDR19TUExM X1NQUkVBRF9TUEVDVFJVTV9fQ0xLU19fU0hJRlQpOwotCQkJY2dfc3BsbF9zcHJlYWRfc3BlY3Ry dW0gfD0gKDEgPDwgQ0dfU1BMTF9TUFJFQURfU1BFQ1RSVU1fX1NTRU5fX1NISUZUKTsKLQotCQkJ Y2dfc3BsbF9zcHJlYWRfc3BlY3RydW1fMiAmPSB+Q0dfU1BMTF9TUFJFQURfU1BFQ1RSVU1fMl9f Q0xLVl9NQVNLOwotCQkJY2dfc3BsbF9zcHJlYWRfc3BlY3RydW1fMiB8PSAoY2xrX3YgPDwgQ0df U1BMTF9TUFJFQURfU1BFQ1RSVU1fMl9fQ0xLVl9fU0hJRlQpOwotCQl9Ci0JfQotCi0Jc2Nsay0+ U2Nsa0ZyZXF1ZW5jeSA9IGVuZ2luZV9jbG9jazsKLQlzY2xrLT5DZ1NwbGxGdW5jQ250bDMgPSBz cGxsX2Z1bmNfY250bF8zOwotCXNjbGstPkNnU3BsbEZ1bmNDbnRsNCA9IHNwbGxfZnVuY19jbnRs XzQ7Ci0Jc2Nsay0+U3BsbFNwcmVhZFNwZWN0cnVtID0gY2dfc3BsbF9zcHJlYWRfc3BlY3RydW07 Ci0Jc2Nsay0+U3BsbFNwcmVhZFNwZWN0cnVtMiAgPSBjZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bV8y OwotCXNjbGstPlNjbGtEaWQgPSAodTgpZGl2aWRlcnMucG9zdF9kaXZpZGVyOwotCi0JcmV0dXJu IDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9wdWxhdGVfc2luZ2xlX2dyYXBoaWNfbGV2ZWwoc3Ry dWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJCSAgICB1MzIgZW5naW5lX2Nsb2NrLAotCQkJ CQkgICAgdTE2IHNjbGtfYWN0aXZpdHlfbGV2ZWxfdCwKLQkJCQkJICAgIFNNVTdfRGlzY3JldGVf R3JhcGhpY3NMZXZlbCAqZ3JhcGhpY19sZXZlbCkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAq cGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JaW50IHJldDsKLQotCXJldCA9IGNpX2NhbGN1bGF0ZV9z Y2xrX3BhcmFtcyhhZGV2LCBlbmdpbmVfY2xvY2ssIGdyYXBoaWNfbGV2ZWwpOwotCWlmIChyZXQp Ci0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBjaV9nZXRfZGVwZW5kZW5jeV92b2x0X2J5X2Nsayhh ZGV2LAotCQkJCQkgICAgJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29u X3NjbGssCi0JCQkJCSAgICBlbmdpbmVfY2xvY2ssICZncmFwaGljX2xldmVsLT5NaW5WZGRjKTsK LQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JZ3JhcGhpY19sZXZlbC0+U2Nsa0ZyZXF1ZW5j eSA9IGVuZ2luZV9jbG9jazsKLQotCWdyYXBoaWNfbGV2ZWwtPkZsYWdzID0gIDA7Ci0JZ3JhcGhp Y19sZXZlbC0+TWluVmRkY1BoYXNlcyA9IDE7Ci0KLQlpZiAocGktPnZkZGNfcGhhc2Vfc2hlZF9j b250cm9sKQotCQljaV9wb3B1bGF0ZV9waGFzZV92YWx1ZV9iYXNlZF9vbl9zY2xrKGFkZXYsCi0J CQkJCQkgICAgICAmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5waGFzZV9zaGVkZGluZ19saW1pdHNf dGFibGUsCi0JCQkJCQkgICAgICBlbmdpbmVfY2xvY2ssCi0JCQkJCQkgICAgICAmZ3JhcGhpY19s ZXZlbC0+TWluVmRkY1BoYXNlcyk7Ci0KLQlncmFwaGljX2xldmVsLT5BY3Rpdml0eUxldmVsID0g c2Nsa19hY3Rpdml0eV9sZXZlbF90OwotCi0JZ3JhcGhpY19sZXZlbC0+Q2NQd3JEeW5SbSA9IDA7 Ci0JZ3JhcGhpY19sZXZlbC0+Q2NQd3JEeW5SbTEgPSAwOwotCWdyYXBoaWNfbGV2ZWwtPkVuYWJs ZWRGb3JUaHJvdHRsZSA9IDE7Ci0JZ3JhcGhpY19sZXZlbC0+VXBIID0gMDsKLQlncmFwaGljX2xl dmVsLT5Eb3duSCA9IDA7Ci0JZ3JhcGhpY19sZXZlbC0+Vm9sdGFnZURvd25IID0gMDsKLQlncmFw aGljX2xldmVsLT5Qb3dlclRocm90dGxlID0gMDsKLQotCWlmIChwaS0+Y2Fwc19zY2xrX2RzKQot CQlncmFwaGljX2xldmVsLT5EZWVwU2xlZXBEaXZJZCA9IGNpX2dldF9zbGVlcF9kaXZpZGVyX2lk X2Zyb21fY2xvY2soZW5naW5lX2Nsb2NrLAotCQkJCQkJCQkJCSAgIENJU0xBTkRfTUlOSU1VTV9F TkdJTkVfQ0xPQ0spOwotCi0JZ3JhcGhpY19sZXZlbC0+RGlzcGxheVdhdGVybWFyayA9IFBQU01D X0RJU1BMQVlfV0FURVJNQVJLX0xPVzsKLQotCWdyYXBoaWNfbGV2ZWwtPkZsYWdzID0gY3B1X3Rv X2JlMzIoZ3JhcGhpY19sZXZlbC0+RmxhZ3MpOwotCWdyYXBoaWNfbGV2ZWwtPk1pblZkZGMgPSBj cHVfdG9fYmUzMihncmFwaGljX2xldmVsLT5NaW5WZGRjICogVk9MVEFHRV9TQ0FMRSk7Ci0JZ3Jh cGhpY19sZXZlbC0+TWluVmRkY1BoYXNlcyA9IGNwdV90b19iZTMyKGdyYXBoaWNfbGV2ZWwtPk1p blZkZGNQaGFzZXMpOwotCWdyYXBoaWNfbGV2ZWwtPlNjbGtGcmVxdWVuY3kgPSBjcHVfdG9fYmUz MihncmFwaGljX2xldmVsLT5TY2xrRnJlcXVlbmN5KTsKLQlncmFwaGljX2xldmVsLT5BY3Rpdml0 eUxldmVsID0gY3B1X3RvX2JlMTYoZ3JhcGhpY19sZXZlbC0+QWN0aXZpdHlMZXZlbCk7Ci0JZ3Jh cGhpY19sZXZlbC0+Q2dTcGxsRnVuY0NudGwzID0gY3B1X3RvX2JlMzIoZ3JhcGhpY19sZXZlbC0+ Q2dTcGxsRnVuY0NudGwzKTsKLQlncmFwaGljX2xldmVsLT5DZ1NwbGxGdW5jQ250bDQgPSBjcHVf dG9fYmUzMihncmFwaGljX2xldmVsLT5DZ1NwbGxGdW5jQ250bDQpOwotCWdyYXBoaWNfbGV2ZWwt PlNwbGxTcHJlYWRTcGVjdHJ1bSA9IGNwdV90b19iZTMyKGdyYXBoaWNfbGV2ZWwtPlNwbGxTcHJl YWRTcGVjdHJ1bSk7Ci0JZ3JhcGhpY19sZXZlbC0+U3BsbFNwcmVhZFNwZWN0cnVtMiA9IGNwdV90 b19iZTMyKGdyYXBoaWNfbGV2ZWwtPlNwbGxTcHJlYWRTcGVjdHJ1bTIpOwotCWdyYXBoaWNfbGV2 ZWwtPkNjUHdyRHluUm0gPSBjcHVfdG9fYmUzMihncmFwaGljX2xldmVsLT5DY1B3ckR5blJtKTsK LQlncmFwaGljX2xldmVsLT5DY1B3ckR5blJtMSA9IGNwdV90b19iZTMyKGdyYXBoaWNfbGV2ZWwt PkNjUHdyRHluUm0xKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX3BvcHVsYXRl X2FsbF9ncmFwaGljX2xldmVscyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1 Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0IGNpX2RwbV90 YWJsZSAqZHBtX3RhYmxlID0gJnBpLT5kcG1fdGFibGU7Ci0JdTMyIGxldmVsX2FycmF5X2FkZHJl c3MgPSBwaS0+ZHBtX3RhYmxlX3N0YXJ0ICsKLQkJb2Zmc2V0b2YoU01VN19EaXNjcmV0ZV9EcG1U YWJsZSwgR3JhcGhpY3NMZXZlbCk7Ci0JdTMyIGxldmVsX2FycmF5X3NpemUgPSBzaXplb2YoU01V N19EaXNjcmV0ZV9HcmFwaGljc0xldmVsKSAqCi0JCVNNVTdfTUFYX0xFVkVMU19HUkFQSElDUzsK LQlTTVU3X0Rpc2NyZXRlX0dyYXBoaWNzTGV2ZWwgKmxldmVscyA9IHBpLT5zbWNfc3RhdGVfdGFi bGUuR3JhcGhpY3NMZXZlbDsKLQl1MzIgaSwgcmV0OwotCi0JbWVtc2V0KGxldmVscywgMCwgbGV2 ZWxfYXJyYXlfc2l6ZSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgZHBtX3RhYmxlLT5zY2xrX3RhYmxl LmNvdW50OyBpKyspIHsKLQkJcmV0ID0gY2lfcG9wdWxhdGVfc2luZ2xlX2dyYXBoaWNfbGV2ZWwo YWRldiwKLQkJCQkJCSAgICAgICBkcG1fdGFibGUtPnNjbGtfdGFibGUuZHBtX2xldmVsc1tpXS52 YWx1ZSwKLQkJCQkJCSAgICAgICAodTE2KXBpLT5hY3Rpdml0eV90YXJnZXRbaV0sCi0JCQkJCQkg ICAgICAgJnBpLT5zbWNfc3RhdGVfdGFibGUuR3JhcGhpY3NMZXZlbFtpXSk7Ci0JCWlmIChyZXQp Ci0JCQlyZXR1cm4gcmV0OwotCQlpZiAoaSA+IDEpCi0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLkdy YXBoaWNzTGV2ZWxbaV0uRGVlcFNsZWVwRGl2SWQgPSAwOwotCQlpZiAoaSA9PSAoZHBtX3RhYmxl LT5zY2xrX3RhYmxlLmNvdW50IC0gMSkpCi0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNz TGV2ZWxbaV0uRGlzcGxheVdhdGVybWFyayA9Ci0JCQkJUFBTTUNfRElTUExBWV9XQVRFUk1BUktf SElHSDsKLQl9Ci0JcGktPnNtY19zdGF0ZV90YWJsZS5HcmFwaGljc0xldmVsWzBdLkVuYWJsZWRG b3JBY3Rpdml0eSA9IDE7Ci0KLQlwaS0+c21jX3N0YXRlX3RhYmxlLkdyYXBoaWNzRHBtTGV2ZWxD b3VudCA9ICh1OClkcG1fdGFibGUtPnNjbGtfdGFibGUuY291bnQ7Ci0JcGktPmRwbV9sZXZlbF9l bmFibGVfbWFzay5zY2xrX2RwbV9lbmFibGVfbWFzayA9Ci0JCWNpX2dldF9kcG1fbGV2ZWxfZW5h YmxlX21hc2tfdmFsdWUoJmRwbV90YWJsZS0+c2Nsa190YWJsZSk7Ci0KLQlyZXQgPSBhbWRncHVf Y2lfY29weV9ieXRlc190b19zbWMoYWRldiwgbGV2ZWxfYXJyYXlfYWRkcmVzcywKLQkJCQkgICAo dTggKilsZXZlbHMsIGxldmVsX2FycmF5X3NpemUsCi0JCQkJICAgcGktPnNyYW1fZW5kKTsKLQlp ZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lf cG9wdWxhdGVfdWx2X3N0YXRlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCSBTTVU3 X0Rpc2NyZXRlX1VsdiAqdWx2X2xldmVsKQotewotCXJldHVybiBjaV9wb3B1bGF0ZV91bHZfbGV2 ZWwoYWRldiwgdWx2X2xldmVsKTsKLX0KLQotc3RhdGljIGludCBjaV9wb3B1bGF0ZV9hbGxfbWVt b3J5X2xldmVscyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93 ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0IGNpX2RwbV90YWJsZSAqZHBt X3RhYmxlID0gJnBpLT5kcG1fdGFibGU7Ci0JdTMyIGxldmVsX2FycmF5X2FkZHJlc3MgPSBwaS0+ ZHBtX3RhYmxlX3N0YXJ0ICsKLQkJb2Zmc2V0b2YoU01VN19EaXNjcmV0ZV9EcG1UYWJsZSwgTWVt b3J5TGV2ZWwpOwotCXUzMiBsZXZlbF9hcnJheV9zaXplID0gc2l6ZW9mKFNNVTdfRGlzY3JldGVf TWVtb3J5TGV2ZWwpICoKLQkJU01VN19NQVhfTEVWRUxTX01FTU9SWTsKLQlTTVU3X0Rpc2NyZXRl X01lbW9yeUxldmVsICpsZXZlbHMgPSBwaS0+c21jX3N0YXRlX3RhYmxlLk1lbW9yeUxldmVsOwot CXUzMiBpLCByZXQ7Ci0KLQltZW1zZXQobGV2ZWxzLCAwLCBsZXZlbF9hcnJheV9zaXplKTsKLQot CWZvciAoaSA9IDA7IGkgPCBkcG1fdGFibGUtPm1jbGtfdGFibGUuY291bnQ7IGkrKykgewotCQlp ZiAoZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbaV0udmFsdWUgPT0gMCkKLQkJCXJl dHVybiAtRUlOVkFMOwotCQlyZXQgPSBjaV9wb3B1bGF0ZV9zaW5nbGVfbWVtb3J5X2xldmVsKGFk ZXYsCi0JCQkJCQkgICAgICBkcG1fdGFibGUtPm1jbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1 ZSwKLQkJCQkJCSAgICAgICZwaS0+c21jX3N0YXRlX3RhYmxlLk1lbW9yeUxldmVsW2ldKTsKLQkJ aWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JaWYgKChkcG1fdGFibGUtPm1jbGtfdGFi bGUuY291bnQgPj0gMikgJiYKLQkgICAgKChhZGV2LT5wZGV2LT5kZXZpY2UgPT0gMHg2N0IwKSB8 fCAoYWRldi0+cGRldi0+ZGV2aWNlID09IDB4NjdCMSkpKSB7Ci0JCXBpLT5zbWNfc3RhdGVfdGFi bGUuTWVtb3J5TGV2ZWxbMV0uTWluVmRkYyA9Ci0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLk1lbW9y eUxldmVsWzBdLk1pblZkZGM7Ci0JCXBpLT5zbWNfc3RhdGVfdGFibGUuTWVtb3J5TGV2ZWxbMV0u TWluVmRkY1BoYXNlcyA9Ci0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLk1lbW9yeUxldmVsWzBdLk1p blZkZGNQaGFzZXM7Ci0JfQotCi0JcGktPnNtY19zdGF0ZV90YWJsZS5NZW1vcnlMZXZlbFswXS5B Y3Rpdml0eUxldmVsID0gY3B1X3RvX2JlMTYoMHgxRik7Ci0KLQlwaS0+c21jX3N0YXRlX3RhYmxl Lk1lbW9yeURwbUxldmVsQ291bnQgPSAodTgpZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNvdW50Owot CXBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21hc2sgPQotCQljaV9n ZXRfZHBtX2xldmVsX2VuYWJsZV9tYXNrX3ZhbHVlKCZkcG1fdGFibGUtPm1jbGtfdGFibGUpOwot Ci0JcGktPnNtY19zdGF0ZV90YWJsZS5NZW1vcnlMZXZlbFtkcG1fdGFibGUtPm1jbGtfdGFibGUu Y291bnQgLSAxXS5EaXNwbGF5V2F0ZXJtYXJrID0KLQkJUFBTTUNfRElTUExBWV9XQVRFUk1BUktf SElHSDsKLQotCXJldCA9IGFtZGdwdV9jaV9jb3B5X2J5dGVzX3RvX3NtYyhhZGV2LCBsZXZlbF9h cnJheV9hZGRyZXNzLAotCQkJCSAgICh1OCAqKWxldmVscywgbGV2ZWxfYXJyYXlfc2l6ZSwKLQkJ CQkgICBwaS0+c3JhbV9lbmQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4g MDsKLX0KLQotc3RhdGljIHZvaWQgY2lfcmVzZXRfc2luZ2xlX2RwbV90YWJsZShzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwKLQkJCQkgICAgICBzdHJ1Y3QgY2lfc2luZ2xlX2RwbV90YWJsZSog ZHBtX3RhYmxlLAotCQkJCSAgICAgIHUzMiBjb3VudCkKLXsKLQl1MzIgaTsKLQotCWRwbV90YWJs ZS0+Y291bnQgPSBjb3VudDsKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX1JFR1VMQVJfRFBNX05VTUJF UjsgaSsrKQotCQlkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IGZhbHNlOwotfQot Ci1zdGF0aWMgdm9pZCBjaV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KHN0cnVjdCBjaV9zaW5nbGVf ZHBtX3RhYmxlKiBkcG1fdGFibGUsCi0JCQkJICAgICAgdTMyIGluZGV4LCB1MzIgcGNpZV9nZW4s IHUzMiBwY2llX2xhbmVzKQotewotCWRwbV90YWJsZS0+ZHBtX2xldmVsc1tpbmRleF0udmFsdWUg PSBwY2llX2dlbjsKLQlkcG1fdGFibGUtPmRwbV9sZXZlbHNbaW5kZXhdLnBhcmFtMSA9IHBjaWVf bGFuZXM7Ci0JZHBtX3RhYmxlLT5kcG1fbGV2ZWxzW2luZGV4XS5lbmFibGVkID0gdHJ1ZTsKLX0K LQotc3RhdGljIGludCBjaV9zZXR1cF9kZWZhdWx0X3BjaWVfdGFibGVzKHN0cnVjdCBhbWRncHVf ZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShh ZGV2KTsKLQotCWlmICghcGktPnVzZV9wY2llX3BlcmZvcm1hbmNlX2xldmVscyAmJiAhcGktPnVz ZV9wY2llX3Bvd2Vyc2F2aW5nX2xldmVscykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAocGkt PnVzZV9wY2llX3BlcmZvcm1hbmNlX2xldmVscyAmJiAhcGktPnVzZV9wY2llX3Bvd2Vyc2F2aW5n X2xldmVscykgewotCQlwaS0+cGNpZV9nZW5fcG93ZXJzYXZpbmcgPSBwaS0+cGNpZV9nZW5fcGVy Zm9ybWFuY2U7Ci0JCXBpLT5wY2llX2xhbmVfcG93ZXJzYXZpbmcgPSBwaS0+cGNpZV9sYW5lX3Bl cmZvcm1hbmNlOwotCX0gZWxzZSBpZiAoIXBpLT51c2VfcGNpZV9wZXJmb3JtYW5jZV9sZXZlbHMg JiYgcGktPnVzZV9wY2llX3Bvd2Vyc2F2aW5nX2xldmVscykgewotCQlwaS0+cGNpZV9nZW5fcGVy Zm9ybWFuY2UgPSBwaS0+cGNpZV9nZW5fcG93ZXJzYXZpbmc7Ci0JCXBpLT5wY2llX2xhbmVfcGVy Zm9ybWFuY2UgPSBwaS0+cGNpZV9sYW5lX3Bvd2Vyc2F2aW5nOwotCX0KLQotCWNpX3Jlc2V0X3Np bmdsZV9kcG1fdGFibGUoYWRldiwKLQkJCQkgICZwaS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFi bGUsCi0JCQkJICBTTVU3X01BWF9MRVZFTFNfTElOSyk7Ci0KLQlpZiAoYWRldi0+YXNpY190eXBl ID09IENISVBfQk9OQUlSRSkKLQkJY2lfc2V0dXBfcGNpZV90YWJsZV9lbnRyeSgmcGktPmRwbV90 YWJsZS5wY2llX3NwZWVkX3RhYmxlLCAwLAotCQkJCQkgIHBpLT5wY2llX2dlbl9wb3dlcnNhdmlu Zy5taW4sCi0JCQkJCSAgcGktPnBjaWVfbGFuZV9wb3dlcnNhdmluZy5tYXgpOwotCWVsc2UKLQkJ Y2lfc2V0dXBfcGNpZV90YWJsZV9lbnRyeSgmcGktPmRwbV90YWJsZS5wY2llX3NwZWVkX3RhYmxl LCAwLAotCQkJCQkgIHBpLT5wY2llX2dlbl9wb3dlcnNhdmluZy5taW4sCi0JCQkJCSAgcGktPnBj aWVfbGFuZV9wb3dlcnNhdmluZy5taW4pOwotCWNpX3NldHVwX3BjaWVfdGFibGVfZW50cnkoJnBp LT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgMSwKLQkJCQkgIHBpLT5wY2llX2dlbl9wZXJm b3JtYW5jZS5taW4sCi0JCQkJICBwaS0+cGNpZV9sYW5lX3BlcmZvcm1hbmNlLm1pbik7Ci0JY2lf c2V0dXBfcGNpZV90YWJsZV9lbnRyeSgmcGktPmRwbV90YWJsZS5wY2llX3NwZWVkX3RhYmxlLCAy LAotCQkJCSAgcGktPnBjaWVfZ2VuX3Bvd2Vyc2F2aW5nLm1pbiwKLQkJCQkgIHBpLT5wY2llX2xh bmVfcG93ZXJzYXZpbmcubWF4KTsKLQljaV9zZXR1cF9wY2llX3RhYmxlX2VudHJ5KCZwaS0+ZHBt X3RhYmxlLnBjaWVfc3BlZWRfdGFibGUsIDMsCi0JCQkJICBwaS0+cGNpZV9nZW5fcGVyZm9ybWFu Y2UubWluLAotCQkJCSAgcGktPnBjaWVfbGFuZV9wZXJmb3JtYW5jZS5tYXgpOwotCWNpX3NldHVw X3BjaWVfdGFibGVfZW50cnkoJnBpLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJsZSwgNCwKLQkJ CQkgIHBpLT5wY2llX2dlbl9wb3dlcnNhdmluZy5tYXgsCi0JCQkJICBwaS0+cGNpZV9sYW5lX3Bv d2Vyc2F2aW5nLm1heCk7Ci0JY2lfc2V0dXBfcGNpZV90YWJsZV9lbnRyeSgmcGktPmRwbV90YWJs ZS5wY2llX3NwZWVkX3RhYmxlLCA1LAotCQkJCSAgcGktPnBjaWVfZ2VuX3BlcmZvcm1hbmNlLm1h eCwKLQkJCQkgIHBpLT5wY2llX2xhbmVfcGVyZm9ybWFuY2UubWF4KTsKLQotCXBpLT5kcG1fdGFi bGUucGNpZV9zcGVlZF90YWJsZS5jb3VudCA9IDY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IGludCBjaV9zZXR1cF9kZWZhdWx0X2RwbV90YWJsZXMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFk ZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXN0 cnVjdCBhbWRncHVfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICphbGxvd2VkX3NjbGtf dmRkY190YWJsZSA9Ci0JCSZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9v bl9zY2xrOwotCXN0cnVjdCBhbWRncHVfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICph bGxvd2VkX21jbGtfdGFibGUgPQotCQkmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVu ZGVuY3lfb25fbWNsazsKLQlzdHJ1Y3QgYW1kZ3B1X2NhY19sZWFrYWdlX3RhYmxlICpzdGRfdm9s dGFnZV90YWJsZSA9Ci0JCSZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLmNhY19sZWFrYWdlX3RhYmxl OwotCXUzMiBpOwotCi0JaWYgKGFsbG93ZWRfc2Nsa192ZGRjX3RhYmxlID09IE5VTEwpCi0JCXJl dHVybiAtRUlOVkFMOwotCWlmIChhbGxvd2VkX3NjbGtfdmRkY190YWJsZS0+Y291bnQgPCAxKQot CQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYWxsb3dlZF9tY2xrX3RhYmxlID09IE5VTEwpCi0JCXJl dHVybiAtRUlOVkFMOwotCWlmIChhbGxvd2VkX21jbGtfdGFibGUtPmNvdW50IDwgMSkKLQkJcmV0 dXJuIC1FSU5WQUw7Ci0KLQltZW1zZXQoJnBpLT5kcG1fdGFibGUsIDAsIHNpemVvZihzdHJ1Y3Qg Y2lfZHBtX3RhYmxlKSk7Ci0KLQljaV9yZXNldF9zaW5nbGVfZHBtX3RhYmxlKGFkZXYsCi0JCQkJ ICAmcGktPmRwbV90YWJsZS5zY2xrX3RhYmxlLAotCQkJCSAgU01VN19NQVhfTEVWRUxTX0dSQVBI SUNTKTsKLQljaV9yZXNldF9zaW5nbGVfZHBtX3RhYmxlKGFkZXYsCi0JCQkJICAmcGktPmRwbV90 YWJsZS5tY2xrX3RhYmxlLAotCQkJCSAgU01VN19NQVhfTEVWRUxTX01FTU9SWSk7Ci0JY2lfcmVz ZXRfc2luZ2xlX2RwbV90YWJsZShhZGV2LAotCQkJCSAgJnBpLT5kcG1fdGFibGUudmRkY190YWJs ZSwKLQkJCQkgIFNNVTdfTUFYX0xFVkVMU19WRERDKTsKLQljaV9yZXNldF9zaW5nbGVfZHBtX3Rh YmxlKGFkZXYsCi0JCQkJICAmcGktPmRwbV90YWJsZS52ZGRjaV90YWJsZSwKLQkJCQkgIFNNVTdf TUFYX0xFVkVMU19WRERDSSk7Ci0JY2lfcmVzZXRfc2luZ2xlX2RwbV90YWJsZShhZGV2LAotCQkJ CSAgJnBpLT5kcG1fdGFibGUubXZkZF90YWJsZSwKLQkJCQkgIFNNVTdfTUFYX0xFVkVMU19NVkRE KTsKLQotCXBpLT5kcG1fdGFibGUuc2Nsa190YWJsZS5jb3VudCA9IDA7Ci0JZm9yIChpID0gMDsg aSA8IGFsbG93ZWRfc2Nsa192ZGRjX3RhYmxlLT5jb3VudDsgaSsrKSB7Ci0JCWlmICgoaSA9PSAw KSB8fAotCQkgICAgKHBpLT5kcG1fdGFibGUuc2Nsa190YWJsZS5kcG1fbGV2ZWxzW3BpLT5kcG1f dGFibGUuc2Nsa190YWJsZS5jb3VudC0xXS52YWx1ZSAhPQotCQkgICAgIGFsbG93ZWRfc2Nsa192 ZGRjX3RhYmxlLT5lbnRyaWVzW2ldLmNsaykpIHsKLQkJCXBpLT5kcG1fdGFibGUuc2Nsa190YWJs ZS5kcG1fbGV2ZWxzW3BpLT5kcG1fdGFibGUuc2Nsa190YWJsZS5jb3VudF0udmFsdWUgPQotCQkJ CWFsbG93ZWRfc2Nsa192ZGRjX3RhYmxlLT5lbnRyaWVzW2ldLmNsazsKLQkJCXBpLT5kcG1fdGFi bGUuc2Nsa190YWJsZS5kcG1fbGV2ZWxzW3BpLT5kcG1fdGFibGUuc2Nsa190YWJsZS5jb3VudF0u ZW5hYmxlZCA9Ci0JCQkJKGkgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0JCQlwaS0+ZHBtX3RhYmxl LnNjbGtfdGFibGUuY291bnQrKzsKLQkJfQotCX0KLQotCXBpLT5kcG1fdGFibGUubWNsa190YWJs ZS5jb3VudCA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IGFsbG93ZWRfbWNsa190YWJsZS0+Y291bnQ7 IGkrKykgewotCQlpZiAoKGkgPT0gMCkgfHwKLQkJICAgIChwaS0+ZHBtX3RhYmxlLm1jbGtfdGFi bGUuZHBtX2xldmVsc1twaS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuY291bnQtMV0udmFsdWUgIT0K LQkJICAgICBhbGxvd2VkX21jbGtfdGFibGUtPmVudHJpZXNbaV0uY2xrKSkgewotCQkJcGktPmRw bV90YWJsZS5tY2xrX3RhYmxlLmRwbV9sZXZlbHNbcGktPmRwbV90YWJsZS5tY2xrX3RhYmxlLmNv dW50XS52YWx1ZSA9Ci0JCQkJYWxsb3dlZF9tY2xrX3RhYmxlLT5lbnRyaWVzW2ldLmNsazsKLQkJ CXBpLT5kcG1fdGFibGUubWNsa190YWJsZS5kcG1fbGV2ZWxzW3BpLT5kcG1fdGFibGUubWNsa190 YWJsZS5jb3VudF0uZW5hYmxlZCA9Ci0JCQkJKGkgPT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0JCQlw aS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuY291bnQrKzsKLQkJfQotCX0KLQotCWZvciAoaSA9IDA7 IGkgPCBhbGxvd2VkX3NjbGtfdmRkY190YWJsZS0+Y291bnQ7IGkrKykgewotCQlwaS0+ZHBtX3Rh YmxlLnZkZGNfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9Ci0JCQlhbGxvd2VkX3NjbGtfdmRk Y190YWJsZS0+ZW50cmllc1tpXS52OwotCQlwaS0+ZHBtX3RhYmxlLnZkZGNfdGFibGUuZHBtX2xl dmVsc1tpXS5wYXJhbTEgPQotCQkJc3RkX3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0ubGVha2Fn ZTsKLQkJcGktPmRwbV90YWJsZS52ZGRjX3RhYmxlLmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IHRy dWU7Ci0JfQotCXBpLT5kcG1fdGFibGUudmRkY190YWJsZS5jb3VudCA9IGFsbG93ZWRfc2Nsa192 ZGRjX3RhYmxlLT5jb3VudDsKLQotCWFsbG93ZWRfbWNsa190YWJsZSA9ICZhZGV2LT5wbS5kcG0u ZHluX3N0YXRlLnZkZGNpX2RlcGVuZGVuY3lfb25fbWNsazsKLQlpZiAoYWxsb3dlZF9tY2xrX3Rh YmxlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBhbGxvd2VkX21jbGtfdGFibGUtPmNvdW50OyBpKysp IHsKLQkJCXBpLT5kcG1fdGFibGUudmRkY2lfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9Ci0J CQkJYWxsb3dlZF9tY2xrX3RhYmxlLT5lbnRyaWVzW2ldLnY7Ci0JCQlwaS0+ZHBtX3RhYmxlLnZk ZGNpX3RhYmxlLmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IHRydWU7Ci0JCX0KLQkJcGktPmRwbV90 YWJsZS52ZGRjaV90YWJsZS5jb3VudCA9IGFsbG93ZWRfbWNsa190YWJsZS0+Y291bnQ7Ci0JfQot Ci0JYWxsb3dlZF9tY2xrX3RhYmxlID0gJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubXZkZF9kZXBl bmRlbmN5X29uX21jbGs7Ci0JaWYgKGFsbG93ZWRfbWNsa190YWJsZSkgewotCQlmb3IgKGkgPSAw OyBpIDwgYWxsb3dlZF9tY2xrX3RhYmxlLT5jb3VudDsgaSsrKSB7Ci0JCQlwaS0+ZHBtX3RhYmxl Lm12ZGRfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSA9Ci0JCQkJYWxsb3dlZF9tY2xrX3RhYmxl LT5lbnRyaWVzW2ldLnY7Ci0JCQlwaS0+ZHBtX3RhYmxlLm12ZGRfdGFibGUuZHBtX2xldmVsc1tp XS5lbmFibGVkID0gdHJ1ZTsKLQkJfQotCQlwaS0+ZHBtX3RhYmxlLm12ZGRfdGFibGUuY291bnQg PSBhbGxvd2VkX21jbGtfdGFibGUtPmNvdW50OwotCX0KLQotCWNpX3NldHVwX2RlZmF1bHRfcGNp ZV90YWJsZXMoYWRldik7Ci0KLQkvKiBzYXZlIGEgY29weSBvZiB0aGUgZGVmYXVsdCBEUE0gdGFi bGUgKi8KLQltZW1jcHkoJihwaS0+Z29sZGVuX2RwbV90YWJsZSksICYocGktPmRwbV90YWJsZSks Ci0JCQlzaXplb2Yoc3RydWN0IGNpX2RwbV90YWJsZSkpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyBpbnQgY2lfZmluZF9ib290X2xldmVsKHN0cnVjdCBjaV9zaW5nbGVfZHBtX3RhYmxlICp0 YWJsZSwKLQkJCSAgICAgIHUzMiB2YWx1ZSwgdTMyICpib290X2xldmVsKQotewotCXUzMiBpOwot CWludCByZXQgPSAtRUlOVkFMOwotCi0JZm9yKGkgPSAwOyBpIDwgdGFibGUtPmNvdW50OyBpKysp IHsKLQkJaWYgKHZhbHVlID09IHRhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVlKSB7Ci0JCQkqYm9v dF9sZXZlbCA9IGk7Ci0JCQlyZXQgPSAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0KLQot c3RhdGljIGludCBjaV9pbml0X3NtY190YWJsZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikK LXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0 IGNpX3Vsdl9wYXJtICp1bHYgPSAmcGktPnVsdjsKLQlzdHJ1Y3QgYW1kZ3B1X3BzICphbWRncHVf Ym9vdF9zdGF0ZSA9IGFkZXYtPnBtLmRwbS5ib290X3BzOwotCVNNVTdfRGlzY3JldGVfRHBtVGFi bGUgKnRhYmxlID0gJnBpLT5zbWNfc3RhdGVfdGFibGU7Ci0JaW50IHJldDsKLQotCXJldCA9IGNp X3NldHVwX2RlZmF1bHRfZHBtX3RhYmxlcyhhZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0 OwotCi0JaWYgKHBpLT52b2x0YWdlX2NvbnRyb2wgIT0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9M X05PTkUpCi0JCWNpX3BvcHVsYXRlX3NtY192b2x0YWdlX3RhYmxlcyhhZGV2LCB0YWJsZSk7Ci0K LQljaV9pbml0X2Zwc19saW1pdHMoYWRldik7Ci0KLQlpZiAoYWRldi0+cG0uZHBtLnBsYXRmb3Jt X2NhcHMgJiBBVE9NX1BQX1BMQVRGT1JNX0NBUF9IQVJEV0FSRURDKQotCQl0YWJsZS0+U3lzdGVt RmxhZ3MgfD0gUFBTTUNfU1lTVEVNRkxBR19HUElPX0RDOwotCi0JaWYgKGFkZXYtPnBtLmRwbS5w bGF0Zm9ybV9jYXBzICYgQVRPTV9QUF9QTEFURk9STV9DQVBfU1RFUFZEREMpCi0JCXRhYmxlLT5T eXN0ZW1GbGFncyB8PSBQUFNNQ19TWVNURU1GTEFHX1NURVBWRERDOwotCi0JaWYgKGFkZXYtPmdt Yy52cmFtX3R5cGUgPT0gQU1ER1BVX1ZSQU1fVFlQRV9HRERSNSkKLQkJdGFibGUtPlN5c3RlbUZs YWdzIHw9IFBQU01DX1NZU1RFTUZMQUdfR0REUjU7Ci0KLQlpZiAodWx2LT5zdXBwb3J0ZWQpIHsK LQkJcmV0ID0gY2lfcG9wdWxhdGVfdWx2X3N0YXRlKGFkZXYsICZwaS0+c21jX3N0YXRlX3RhYmxl LlVsdik7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0OwotCQlXUkVHMzJfU01DKGl4Q0dfVUxW X1BBUkFNRVRFUiwgdWx2LT5jZ191bHZfcGFyYW1ldGVyKTsKLQl9Ci0KLQlyZXQgPSBjaV9wb3B1 bGF0ZV9hbGxfZ3JhcGhpY19sZXZlbHMoYWRldik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsK LQotCXJldCA9IGNpX3BvcHVsYXRlX2FsbF9tZW1vcnlfbGV2ZWxzKGFkZXYpOwotCWlmIChyZXQp Ci0JCXJldHVybiByZXQ7Ci0KLQljaV9wb3B1bGF0ZV9zbWNfbGlua19sZXZlbChhZGV2LCB0YWJs ZSk7Ci0KLQlyZXQgPSBjaV9wb3B1bGF0ZV9zbWNfYWNwaV9sZXZlbChhZGV2LCB0YWJsZSk7Ci0J aWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldCA9IGNpX3BvcHVsYXRlX3NtY192Y2VfbGV2 ZWwoYWRldiwgdGFibGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBjaV9w b3B1bGF0ZV9zbWNfYWNwX2xldmVsKGFkZXYsIHRhYmxlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4g cmV0OwotCi0JcmV0ID0gY2lfcG9wdWxhdGVfc21jX3NhbXVfbGV2ZWwoYWRldiwgdGFibGUpOwot CWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXQgPSBjaV9kb19wcm9ncmFtX21lbW9yeV90 aW1pbmdfcGFyYW1ldGVycyhhZGV2KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0 ID0gY2lfcG9wdWxhdGVfc21jX3V2ZF9sZXZlbChhZGV2LCB0YWJsZSk7Ci0JaWYgKHJldCkKLQkJ cmV0dXJuIHJldDsKLQotCXRhYmxlLT5VdmRCb290TGV2ZWwgID0gMDsKLQl0YWJsZS0+VmNlQm9v dExldmVsICA9IDA7Ci0JdGFibGUtPkFjcEJvb3RMZXZlbCAgPSAwOwotCXRhYmxlLT5TYW11Qm9v dExldmVsICA9IDA7Ci0JdGFibGUtPkdyYXBoaWNzQm9vdExldmVsICA9IDA7Ci0JdGFibGUtPk1l bW9yeUJvb3RMZXZlbCAgPSAwOwotCi0JcmV0ID0gY2lfZmluZF9ib290X2xldmVsKCZwaS0+ZHBt X3RhYmxlLnNjbGtfdGFibGUsCi0JCQkJIHBpLT52Ymlvc19ib290X3N0YXRlLnNjbGtfYm9vdHVw X3ZhbHVlLAotCQkJCSAodTMyICopJnBpLT5zbWNfc3RhdGVfdGFibGUuR3JhcGhpY3NCb290TGV2 ZWwpOwotCi0JcmV0ID0gY2lfZmluZF9ib290X2xldmVsKCZwaS0+ZHBtX3RhYmxlLm1jbGtfdGFi bGUsCi0JCQkJIHBpLT52Ymlvc19ib290X3N0YXRlLm1jbGtfYm9vdHVwX3ZhbHVlLAotCQkJCSAo dTMyICopJnBpLT5zbWNfc3RhdGVfdGFibGUuTWVtb3J5Qm9vdExldmVsKTsKLQotCXRhYmxlLT5C b290VmRkYyA9IHBpLT52Ymlvc19ib290X3N0YXRlLnZkZGNfYm9vdHVwX3ZhbHVlOwotCXRhYmxl LT5Cb290VmRkY2kgPSBwaS0+dmJpb3NfYm9vdF9zdGF0ZS52ZGRjaV9ib290dXBfdmFsdWU7Ci0J dGFibGUtPkJvb3RNVmRkID0gcGktPnZiaW9zX2Jvb3Rfc3RhdGUubXZkZF9ib290dXBfdmFsdWU7 Ci0KLQljaV9wb3B1bGF0ZV9zbWNfaW5pdGlhbF9zdGF0ZShhZGV2LCBhbWRncHVfYm9vdF9zdGF0 ZSk7Ci0KLQlyZXQgPSBjaV9wb3B1bGF0ZV9iYXBtX3BhcmFtZXRlcnNfaW5fZHBtX3RhYmxlKGFk ZXYpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQl0YWJsZS0+VVZESW50ZXJ2YWwgPSAx OwotCXRhYmxlLT5WQ0VJbnRlcnZhbCA9IDE7Ci0JdGFibGUtPkFDUEludGVydmFsID0gMTsKLQl0 YWJsZS0+U0FNVUludGVydmFsID0gMTsKLQl0YWJsZS0+R3JhcGhpY3NWb2x0YWdlQ2hhbmdlRW5h YmxlID0gMTsKLQl0YWJsZS0+R3JhcGhpY3NUaGVybVRocm90dGxlRW5hYmxlID0gMTsKLQl0YWJs ZS0+R3JhcGhpY3NJbnRlcnZhbCA9IDE7Ci0JdGFibGUtPlZvbHRhZ2VJbnRlcnZhbCA9IDE7Ci0J dGFibGUtPlRoZXJtYWxJbnRlcnZhbCA9IDE7Ci0JdGFibGUtPlRlbXBlcmF0dXJlTGltaXRIaWdo ID0gKHUxNikoKHBpLT50aGVybWFsX3RlbXBfc2V0dGluZy50ZW1wZXJhdHVyZV9oaWdoICoKLQkJ CQkJICAgICBDSVNMQU5EU19RODhfRk9STUFUX0NPTlZFUlNJT05fVU5JVCkgLyAxMDAwKTsKLQl0 YWJsZS0+VGVtcGVyYXR1cmVMaW1pdExvdyA9ICh1MTYpKChwaS0+dGhlcm1hbF90ZW1wX3NldHRp bmcudGVtcGVyYXR1cmVfbG93ICoKLQkJCQkJICAgIENJU0xBTkRTX1E4OF9GT1JNQVRfQ09OVkVS U0lPTl9VTklUKSAvIDEwMDApOwotCXRhYmxlLT5NZW1vcnlWb2x0YWdlQ2hhbmdlRW5hYmxlID0g MTsKLQl0YWJsZS0+TWVtb3J5SW50ZXJ2YWwgPSAxOwotCXRhYmxlLT5Wb2x0YWdlUmVzcG9uc2VU aW1lID0gMDsKLQl0YWJsZS0+VmRkY1ZkZGNpRGVsdGEgPSA0MDAwOwotCXRhYmxlLT5QaGFzZVJl c3BvbnNlVGltZSA9IDA7Ci0JdGFibGUtPk1lbW9yeVRoZXJtVGhyb3R0bGVFbmFibGUgPSAxOwot CXRhYmxlLT5QQ0llQm9vdExpbmtMZXZlbCA9IHBpLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJs ZS5jb3VudCAtIDE7Ci0JdGFibGUtPlBDSWVHZW5JbnRlcnZhbCA9IDE7Ci0JaWYgKHBpLT52b2x0 YWdlX2NvbnRyb2wgPT0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyKQotCQl0YWJs ZS0+U1ZJMkVuYWJsZSAgPSAxOwotCWVsc2UKLQkJdGFibGUtPlNWSTJFbmFibGUgID0gMDsKLQot CXRhYmxlLT5UaGVybUdwaW8gPSAxNzsKLQl0YWJsZS0+U2Nsa1N0ZXBTaXplID0gMHg0MDAwOwot Ci0JdGFibGUtPlN5c3RlbUZsYWdzID0gY3B1X3RvX2JlMzIodGFibGUtPlN5c3RlbUZsYWdzKTsK LQl0YWJsZS0+U21pb01hc2tWZGRjVmlkID0gY3B1X3RvX2JlMzIodGFibGUtPlNtaW9NYXNrVmRk Y1ZpZCk7Ci0JdGFibGUtPlNtaW9NYXNrVmRkY1BoYXNlID0gY3B1X3RvX2JlMzIodGFibGUtPlNt aW9NYXNrVmRkY1BoYXNlKTsKLQl0YWJsZS0+U21pb01hc2tWZGRjaVZpZCA9IGNwdV90b19iZTMy KHRhYmxlLT5TbWlvTWFza1ZkZGNpVmlkKTsKLQl0YWJsZS0+U21pb01hc2tNdmRkVmlkID0gY3B1 X3RvX2JlMzIodGFibGUtPlNtaW9NYXNrTXZkZFZpZCk7Ci0JdGFibGUtPlNjbGtTdGVwU2l6ZSA9 IGNwdV90b19iZTMyKHRhYmxlLT5TY2xrU3RlcFNpemUpOwotCXRhYmxlLT5UZW1wZXJhdHVyZUxp bWl0SGlnaCA9IGNwdV90b19iZTE2KHRhYmxlLT5UZW1wZXJhdHVyZUxpbWl0SGlnaCk7Ci0JdGFi bGUtPlRlbXBlcmF0dXJlTGltaXRMb3cgPSBjcHVfdG9fYmUxNih0YWJsZS0+VGVtcGVyYXR1cmVM aW1pdExvdyk7Ci0JdGFibGUtPlZkZGNWZGRjaURlbHRhID0gY3B1X3RvX2JlMTYodGFibGUtPlZk ZGNWZGRjaURlbHRhKTsKLQl0YWJsZS0+Vm9sdGFnZVJlc3BvbnNlVGltZSA9IGNwdV90b19iZTE2 KHRhYmxlLT5Wb2x0YWdlUmVzcG9uc2VUaW1lKTsKLQl0YWJsZS0+UGhhc2VSZXNwb25zZVRpbWUg PSBjcHVfdG9fYmUxNih0YWJsZS0+UGhhc2VSZXNwb25zZVRpbWUpOwotCXRhYmxlLT5Cb290VmRk YyA9IGNwdV90b19iZTE2KHRhYmxlLT5Cb290VmRkYyAqIFZPTFRBR0VfU0NBTEUpOwotCXRhYmxl LT5Cb290VmRkY2kgPSBjcHVfdG9fYmUxNih0YWJsZS0+Qm9vdFZkZGNpICogVk9MVEFHRV9TQ0FM RSk7Ci0JdGFibGUtPkJvb3RNVmRkID0gY3B1X3RvX2JlMTYodGFibGUtPkJvb3RNVmRkICogVk9M VEFHRV9TQ0FMRSk7Ci0KLQlyZXQgPSBhbWRncHVfY2lfY29weV9ieXRlc190b19zbWMoYWRldiwK LQkJCQkgICBwaS0+ZHBtX3RhYmxlX3N0YXJ0ICsKLQkJCQkgICBvZmZzZXRvZihTTVU3X0Rpc2Ny ZXRlX0RwbVRhYmxlLCBTeXN0ZW1GbGFncyksCi0JCQkJICAgKHU4ICopJnRhYmxlLT5TeXN0ZW1G bGFncywKLQkJCQkgICBzaXplb2YoU01VN19EaXNjcmV0ZV9EcG1UYWJsZSkgLSAzICogc2l6ZW9m KFNNVTdfUElEQ29udHJvbGxlciksCi0JCQkJICAgcGktPnNyYW1fZW5kKTsKLQlpZiAocmV0KQot CQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX3RyaW1fc2lu Z2xlX2RwbV9zdGF0ZXMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAgc3Ry dWN0IGNpX3NpbmdsZV9kcG1fdGFibGUgKmRwbV90YWJsZSwKLQkJCQkgICAgICB1MzIgbG93X2xp bWl0LCB1MzIgaGlnaF9saW1pdCkKLXsKLQl1MzIgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBkcG1f dGFibGUtPmNvdW50OyBpKyspIHsKLQkJaWYgKChkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0udmFs dWUgPCBsb3dfbGltaXQpIHx8Ci0JCSAgICAoZHBtX3RhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVl ID4gaGlnaF9saW1pdCkpCi0JCQlkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IGZh bHNlOwotCQllbHNlCi0JCQlkcG1fdGFibGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IHRydWU7 Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV90cmltX3BjaWVfZHBtX3N0YXRlcyhzdHJ1Y3QgYW1k Z3B1X2RldmljZSAqYWRldiwKLQkJCQkgICAgdTMyIHNwZWVkX2xvdywgdTMyIGxhbmVzX2xvdywK LQkJCQkgICAgdTMyIHNwZWVkX2hpZ2gsIHUzMiBsYW5lc19oaWdoKQotewotCXN0cnVjdCBjaV9w b3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgY2lfc2luZ2xlX2RwbV90 YWJsZSAqcGNpZV90YWJsZSA9ICZwaS0+ZHBtX3RhYmxlLnBjaWVfc3BlZWRfdGFibGU7Ci0JdTMy IGksIGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGNpZV90YWJsZS0+Y291bnQ7IGkrKykgewotCQlp ZiAoKHBjaWVfdGFibGUtPmRwbV9sZXZlbHNbaV0udmFsdWUgPCBzcGVlZF9sb3cpIHx8Ci0JCSAg ICAocGNpZV90YWJsZS0+ZHBtX2xldmVsc1tpXS5wYXJhbTEgPCBsYW5lc19sb3cpIHx8Ci0JCSAg ICAocGNpZV90YWJsZS0+ZHBtX2xldmVsc1tpXS52YWx1ZSA+IHNwZWVkX2hpZ2gpIHx8Ci0JCSAg ICAocGNpZV90YWJsZS0+ZHBtX2xldmVsc1tpXS5wYXJhbTEgPiBsYW5lc19oaWdoKSkKLQkJCXBj aWVfdGFibGUtPmRwbV9sZXZlbHNbaV0uZW5hYmxlZCA9IGZhbHNlOwotCQllbHNlCi0JCQlwY2ll X3RhYmxlLT5kcG1fbGV2ZWxzW2ldLmVuYWJsZWQgPSB0cnVlOwotCX0KLQotCWZvciAoaSA9IDA7 IGkgPCBwY2llX3RhYmxlLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChwY2llX3RhYmxlLT5kcG1fbGV2 ZWxzW2ldLmVuYWJsZWQpIHsKLQkJCWZvciAoaiA9IGkgKyAxOyBqIDwgcGNpZV90YWJsZS0+Y291 bnQ7IGorKykgewotCQkJCWlmIChwY2llX3RhYmxlLT5kcG1fbGV2ZWxzW2pdLmVuYWJsZWQpIHsK LQkJCQkJaWYgKChwY2llX3RhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVlID09IHBjaWVfdGFibGUt PmRwbV9sZXZlbHNbal0udmFsdWUpICYmCi0JCQkJCSAgICAocGNpZV90YWJsZS0+ZHBtX2xldmVs c1tpXS5wYXJhbTEgPT0gcGNpZV90YWJsZS0+ZHBtX2xldmVsc1tqXS5wYXJhbTEpKQotCQkJCQkJ cGNpZV90YWJsZS0+ZHBtX2xldmVsc1tqXS5lbmFibGVkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQot CQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IGNpX3RyaW1fZHBtX3N0YXRlcyhzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiwKLQkJCSAgICAgIHN0cnVjdCBhbWRncHVfcHMgKmFtZGdwdV9zdGF0ZSkK LXsKLQlzdHJ1Y3QgY2lfcHMgKnN0YXRlID0gY2lfZ2V0X3BzKGFtZGdwdV9zdGF0ZSk7Ci0Jc3Ry dWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXUzMiBoaWdoX2xpbWl0 X2NvdW50OwotCi0JaWYgKHN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudCA8IDEpCi0JCXJl dHVybiAtRUlOVkFMOwotCi0JaWYgKHN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudCA9PSAx KQotCQloaWdoX2xpbWl0X2NvdW50ID0gMDsKLQllbHNlCi0JCWhpZ2hfbGltaXRfY291bnQgPSAx OwotCi0JY2lfdHJpbV9zaW5nbGVfZHBtX3N0YXRlcyhhZGV2LAotCQkJCSAgJnBpLT5kcG1fdGFi bGUuc2Nsa190YWJsZSwKLQkJCQkgIHN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNbMF0uc2NsaywK LQkJCQkgIHN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNbaGlnaF9saW1pdF9jb3VudF0uc2Nsayk7 Ci0KLQljaV90cmltX3NpbmdsZV9kcG1fc3RhdGVzKGFkZXYsCi0JCQkJICAmcGktPmRwbV90YWJs ZS5tY2xrX3RhYmxlLAotCQkJCSAgc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsc1swXS5tY2xrLAot CQkJCSAgc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsc1toaWdoX2xpbWl0X2NvdW50XS5tY2xrKTsK LQotCWNpX3RyaW1fcGNpZV9kcG1fc3RhdGVzKGFkZXYsCi0JCQkJc3RhdGUtPnBlcmZvcm1hbmNl X2xldmVsc1swXS5wY2llX2dlbiwKLQkJCQlzdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxzWzBdLnBj aWVfbGFuZSwKLQkJCQlzdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxzW2hpZ2hfbGltaXRfY291bnRd LnBjaWVfZ2VuLAotCQkJCXN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNbaGlnaF9saW1pdF9jb3Vu dF0ucGNpZV9sYW5lKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2FwcGx5X2Rp c3BfbWluaW11bV92b2x0YWdlX3JlcXVlc3Qoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17 Ci0Jc3RydWN0IGFtZGdwdV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKmRpc3Bfdm9s dGFnZV90YWJsZSA9Ci0JCSZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9v bl9kaXNwY2xrOwotCXN0cnVjdCBhbWRncHVfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxl ICp2ZGRjX3RhYmxlID0KLQkJJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5 X29uX3NjbGs7Ci0JdTMyIHJlcXVlc3RlZF92b2x0YWdlID0gMDsKLQl1MzIgaTsKLQotCWlmIChk aXNwX3ZvbHRhZ2VfdGFibGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFkaXNw X3ZvbHRhZ2VfdGFibGUtPmNvdW50KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWZvciAoaSA9IDA7 IGkgPCBkaXNwX3ZvbHRhZ2VfdGFibGUtPmNvdW50OyBpKyspIHsKLQkJaWYgKGFkZXYtPmNsb2Nr LmN1cnJlbnRfZGlzcGNsayA9PSBkaXNwX3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0uY2xrKQot CQkJcmVxdWVzdGVkX3ZvbHRhZ2UgPSBkaXNwX3ZvbHRhZ2VfdGFibGUtPmVudHJpZXNbaV0udjsK LQl9Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdmRkY190YWJsZS0+Y291bnQ7IGkrKykgewotCQlpZiAo cmVxdWVzdGVkX3ZvbHRhZ2UgPD0gdmRkY190YWJsZS0+ZW50cmllc1tpXS52KSB7Ci0JCQlyZXF1 ZXN0ZWRfdm9sdGFnZSA9IHZkZGNfdGFibGUtPmVudHJpZXNbaV0udjsKLQkJCXJldHVybiAoYW1k Z3B1X2NpX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihhZGV2LAotCQkJCQkJCQkgIFBQ U01DX01TR19WZGRDX1JlcXVlc3QsCi0JCQkJCQkJCSAgcmVxdWVzdGVkX3ZvbHRhZ2UgKiBWT0xU QUdFX1NDQUxFKSA9PSBQUFNNQ19SZXN1bHRfT0spID8KLQkJCQkwIDogLUVJTlZBTDsKLQkJfQot CX0KLQotCXJldHVybiAtRUlOVkFMOwotfQotCi1zdGF0aWMgaW50IGNpX3VwbG9hZF9kcG1fbGV2 ZWxfZW5hYmxlX21hc2soc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNp X3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCVBQU01DX1Jlc3VsdCByZXN1bHQ7 Ci0KLQljaV9hcHBseV9kaXNwX21pbmltdW1fdm9sdGFnZV9yZXF1ZXN0KGFkZXYpOwotCi0JaWYg KCFwaS0+c2Nsa19kcG1fa2V5X2Rpc2FibGVkKSB7Ci0JCWlmIChwaS0+ZHBtX2xldmVsX2VuYWJs ZV9tYXNrLnNjbGtfZHBtX2VuYWJsZV9tYXNrKSB7Ci0JCQlyZXN1bHQgPSBhbWRncHVfY2lfc2Vu ZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsCi0JCQkJCQkJCSAgIFBQU01DX01TR19T Q0xLRFBNX1NldEVuYWJsZWRNYXNrLAotCQkJCQkJCQkgICBwaS0+ZHBtX2xldmVsX2VuYWJsZV9t YXNrLnNjbGtfZHBtX2VuYWJsZV9tYXNrKTsKLQkJCWlmIChyZXN1bHQgIT0gUFBTTUNfUmVzdWx0 X09LKQotCQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JaWYgKCFwaS0+bWNsa19kcG1f a2V5X2Rpc2FibGVkKSB7Ci0JCWlmIChwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBt X2VuYWJsZV9tYXNrKSB7Ci0JCQlyZXN1bHQgPSBhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dp dGhfcGFyYW1ldGVyKGFkZXYsCi0JCQkJCQkJCSAgIFBQU01DX01TR19NQ0xLRFBNX1NldEVuYWJs ZWRNYXNrLAotCQkJCQkJCQkgICBwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBtX2Vu YWJsZV9tYXNrKTsKLQkJCWlmIChyZXN1bHQgIT0gUFBTTUNfUmVzdWx0X09LKQotCQkJCXJldHVy biAtRUlOVkFMOwotCQl9Ci0JfQotCi0jaWYgMAotCWlmICghcGktPnBjaWVfZHBtX2tleV9kaXNh YmxlZCkgewotCQlpZiAocGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay5wY2llX2RwbV9lbmFibGVf bWFzaykgewotCQkJcmVzdWx0ID0gYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFt ZXRlcihhZGV2LAotCQkJCQkJCQkgICBQUFNNQ19NU0dfUENJZURQTV9TZXRFbmFibGVkTWFzaywK LQkJCQkJCQkJICAgcGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay5wY2llX2RwbV9lbmFibGVfbWFz ayk7Ci0JCQlpZiAocmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCQlyZXR1cm4gLUVJTlZB TDsKLQkJfQotCX0KLSNlbmRpZgotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2Zp bmRfZHBtX3N0YXRlc19jbG9ja3NfaW5fZHBtX3RhYmxlKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2LAotCQkJCQkJICAgc3RydWN0IGFtZGdwdV9wcyAqYW1kZ3B1X3N0YXRlKQotewotCXN0cnVj dCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgY2lfcHMgKnN0 YXRlID0gY2lfZ2V0X3BzKGFtZGdwdV9zdGF0ZSk7Ci0Jc3RydWN0IGNpX3NpbmdsZV9kcG1fdGFi bGUgKnNjbGtfdGFibGUgPSAmcGktPmRwbV90YWJsZS5zY2xrX3RhYmxlOwotCXUzMiBzY2xrID0g c3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsc1tzdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQt MV0uc2NsazsKLQlzdHJ1Y3QgY2lfc2luZ2xlX2RwbV90YWJsZSAqbWNsa190YWJsZSA9ICZwaS0+ ZHBtX3RhYmxlLm1jbGtfdGFibGU7Ci0JdTMyIG1jbGsgPSBzdGF0ZS0+cGVyZm9ybWFuY2VfbGV2 ZWxzW3N0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudC0xXS5tY2xrOwotCXUzMiBpOwotCi0J cGktPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlID0gMDsKLQotCWZvciAoaSA9IDA7IGkgPCBz Y2xrX3RhYmxlLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChzY2xrID09IHNjbGtfdGFibGUtPmRwbV9s ZXZlbHNbaV0udmFsdWUpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA+PSBzY2xrX3RhYmxlLT5j b3VudCkgewotCQlwaS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUgfD0gRFBNVEFCTEVfT0Rf VVBEQVRFX1NDTEs7Ci0JfSBlbHNlIHsKLQkJLyogWFhYIGNoZWNrIGRpc3BsYXkgbWluIGNsb2Nr IHJlcXVpcmVtZW50cyAqLwotCQlpZiAoQ0lTTEFORF9NSU5JTVVNX0VOR0lORV9DTE9DSyAhPSBD SVNMQU5EX01JTklNVU1fRU5HSU5FX0NMT0NLKQotCQkJcGktPm5lZWRfdXBkYXRlX3NtdTdfZHBt X3RhYmxlIHw9IERQTVRBQkxFX1VQREFURV9TQ0xLOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBt Y2xrX3RhYmxlLT5jb3VudDsgaSsrKSB7Ci0JCWlmIChtY2xrID09IG1jbGtfdGFibGUtPmRwbV9s ZXZlbHNbaV0udmFsdWUpCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAoaSA+PSBtY2xrX3RhYmxlLT5j b3VudCkKLQkJcGktPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlIHw9IERQTVRBQkxFX09EX1VQ REFURV9NQ0xLOwotCi0JaWYgKGFkZXYtPnBtLmRwbS5jdXJyZW50X2FjdGl2ZV9jcnRjX2NvdW50 ICE9Ci0JICAgIGFkZXYtPnBtLmRwbS5uZXdfYWN0aXZlX2NydGNfY291bnQpCi0JCXBpLT5uZWVk X3VwZGF0ZV9zbXU3X2RwbV90YWJsZSB8PSBEUE1UQUJMRV9VUERBVEVfTUNMSzsKLX0KLQotc3Rh dGljIGludCBjaV9wb3B1bGF0ZV9hbmRfdXBsb2FkX3NjbGtfbWNsa19kcG1fbGV2ZWxzKHN0cnVj dCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCQkJICAgICAgIHN0cnVjdCBhbWRncHVfcHMgKmFt ZGdwdV9zdGF0ZSkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRl dik7Ci0Jc3RydWN0IGNpX3BzICpzdGF0ZSA9IGNpX2dldF9wcyhhbWRncHVfc3RhdGUpOwotCXUz MiBzY2xrID0gc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsc1tzdGF0ZS0+cGVyZm9ybWFuY2VfbGV2 ZWxfY291bnQtMV0uc2NsazsKLQl1MzIgbWNsayA9IHN0YXRlLT5wZXJmb3JtYW5jZV9sZXZlbHNb c3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50LTFdLm1jbGs7Ci0Jc3RydWN0IGNpX2RwbV90 YWJsZSAqZHBtX3RhYmxlID0gJnBpLT5kcG1fdGFibGU7Ci0JaW50IHJldDsKLQotCWlmICghcGkt Pm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlKQotCQlyZXR1cm4gMDsKLQotCWlmIChwaS0+bmVl ZF91cGRhdGVfc211N19kcG1fdGFibGUgJiBEUE1UQUJMRV9PRF9VUERBVEVfU0NMSykKLQkJZHBt X3RhYmxlLT5zY2xrX3RhYmxlLmRwbV9sZXZlbHNbZHBtX3RhYmxlLT5zY2xrX3RhYmxlLmNvdW50 LTFdLnZhbHVlID0gc2NsazsKLQotCWlmIChwaS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUg JiBEUE1UQUJMRV9PRF9VUERBVEVfTUNMSykKLQkJZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmRwbV9s ZXZlbHNbZHBtX3RhYmxlLT5tY2xrX3RhYmxlLmNvdW50LTFdLnZhbHVlID0gbWNsazsKLQotCWlm IChwaS0+bmVlZF91cGRhdGVfc211N19kcG1fdGFibGUgJiAoRFBNVEFCTEVfT0RfVVBEQVRFX1ND TEsgfCBEUE1UQUJMRV9VUERBVEVfU0NMSykpIHsKLQkJcmV0ID0gY2lfcG9wdWxhdGVfYWxsX2dy YXBoaWNfbGV2ZWxzKGFkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlp ZiAocGktPm5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlICYgKERQTVRBQkxFX09EX1VQREFURV9N Q0xLIHwgRFBNVEFCTEVfVVBEQVRFX01DTEspKSB7Ci0JCXJldCA9IGNpX3BvcHVsYXRlX2FsbF9t ZW1vcnlfbGV2ZWxzKGFkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9lbmFibGVfdXZkX2RwbShzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBp ID0gY2lfZ2V0X3BpKGFkZXYpOwotCWNvbnN0IHN0cnVjdCBhbWRncHVfY2xvY2tfYW5kX3ZvbHRh Z2VfbGltaXRzICptYXhfbGltaXRzOwotCWludCBpOwotCi0JaWYgKGFkZXYtPnBtLmFjX3Bvd2Vy KQotCQltYXhfbGltaXRzID0gJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRh Z2Vfb25fYWM7Ci0JZWxzZQotCQltYXhfbGltaXRzID0gJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUu bWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fZGM7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXBpLT5kcG1fbGV2 ZWxfZW5hYmxlX21hc2sudXZkX2RwbV9lbmFibGVfbWFzayA9IDA7Ci0KLQkJZm9yIChpID0gYWRl di0+cG0uZHBtLmR5bl9zdGF0ZS51dmRfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlLmNv dW50IC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnV2 ZF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuZW50cmllc1tpXS52IDw9IG1heF9saW1p dHMtPnZkZGMpIHsKLQkJCQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnV2ZF9kcG1fZW5hYmxl X21hc2sgfD0gMSA8PCBpOwotCi0JCQkJaWYgKCFwaS0+Y2Fwc191dmRfZHBtKQotCQkJCQlicmVh azsKLQkJCX0KLQkJfQotCi0JCWFtZGdwdV9jaV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0 ZXIoYWRldiwKLQkJCQkJCSAgUFBTTUNfTVNHX1VWRERQTV9TZXRFbmFibGVkTWFzaywKLQkJCQkJ CSAgcGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay51dmRfZHBtX2VuYWJsZV9tYXNrKTsKLQotCQlp ZiAocGktPmxhc3RfbWNsa19kcG1fZW5hYmxlX21hc2sgJiAweDEpIHsKLQkJCXBpLT51dmRfZW5h YmxlZCA9IHRydWU7Ci0JCQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBtX2VuYWJs ZV9tYXNrICY9IDB4RkZGRkZGRkU7Ci0JCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhf cGFyYW1ldGVyKGFkZXYsCi0JCQkJCQkJICBQUFNNQ19NU0dfTUNMS0RQTV9TZXRFbmFibGVkTWFz aywKLQkJCQkJCQkgIHBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21h c2spOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKHBpLT51dmRfZW5hYmxlZCkgewotCQkJcGktPnV2 ZF9lbmFibGVkID0gZmFsc2U7Ci0JCQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtfZHBt X2VuYWJsZV9tYXNrIHw9IDE7Ci0JCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFy YW1ldGVyKGFkZXYsCi0JCQkJCQkJICBQUFNNQ19NU0dfTUNMS0RQTV9TZXRFbmFibGVkTWFzaywK LQkJCQkJCQkgIHBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21hc2sp OwotCQl9Ci0JfQotCi0JcmV0dXJuIChhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIGVu YWJsZSA/Ci0JCQkJICAgUFBTTUNfTVNHX1VWRERQTV9FbmFibGUgOiBQUFNNQ19NU0dfVVZERFBN X0Rpc2FibGUpID09IFBQU01DX1Jlc3VsdF9PSykgPwotCQkwIDogLUVJTlZBTDsKLX0KLQotc3Rh dGljIGludCBjaV9lbmFibGVfdmNlX2RwbShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgYm9v bCBlbmFibGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYp OwotCWNvbnN0IHN0cnVjdCBhbWRncHVfY2xvY2tfYW5kX3ZvbHRhZ2VfbGltaXRzICptYXhfbGlt aXRzOwotCWludCBpOwotCi0JaWYgKGFkZXYtPnBtLmFjX3Bvd2VyKQotCQltYXhfbGltaXRzID0g JmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWM7Ci0JZWxzZQot CQltYXhfbGltaXRzID0gJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vf b25fZGM7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2sudmNl X2RwbV9lbmFibGVfbWFzayA9IDA7Ci0JCWZvciAoaSA9IGFkZXYtPnBtLmRwbS5keW5fc3RhdGUu dmNlX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZS5jb3VudCAtIDE7IGkgPj0gMDsgaS0t KSB7Ci0JCQlpZiAoYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52Y2VfY2xvY2tfdm9sdGFnZV9kZXBl bmRlbmN5X3RhYmxlLmVudHJpZXNbaV0udiA8PSBtYXhfbGltaXRzLT52ZGRjKSB7Ci0JCQkJcGkt PmRwbV9sZXZlbF9lbmFibGVfbWFzay52Y2VfZHBtX2VuYWJsZV9tYXNrIHw9IDEgPDwgaTsKLQot CQkJCWlmICghcGktPmNhcHNfdmNlX2RwbSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlh bWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsCi0JCQkJCQkgIFBQ U01DX01TR19WQ0VEUE1fU2V0RW5hYmxlZE1hc2ssCi0JCQkJCQkgIHBpLT5kcG1fbGV2ZWxfZW5h YmxlX21hc2sudmNlX2RwbV9lbmFibGVfbWFzayk7Ci0JfQotCi0JcmV0dXJuIChhbWRncHVfY2lf c2VuZF9tc2dfdG9fc21jKGFkZXYsIGVuYWJsZSA/Ci0JCQkJICAgUFBTTUNfTVNHX1ZDRURQTV9F bmFibGUgOiBQUFNNQ19NU0dfVkNFRFBNX0Rpc2FibGUpID09IFBQU01DX1Jlc3VsdF9PSykgPwot CQkwIDogLUVJTlZBTDsKLX0KLQotI2lmIDAKLXN0YXRpYyBpbnQgY2lfZW5hYmxlX3NhbXVfZHBt KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBib29sIGVuYWJsZSkKLXsKLQlzdHJ1Y3QgY2lf cG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JY29uc3Qgc3RydWN0IGFtZGdwdV9j bG9ja19hbmRfdm9sdGFnZV9saW1pdHMgKm1heF9saW1pdHM7Ci0JaW50IGk7Ci0KLQlpZiAoYWRl di0+cG0uYWNfcG93ZXIpCi0JCW1heF9saW1pdHMgPSAmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5t YXhfY2xvY2tfdm9sdGFnZV9vbl9hYzsKLQllbHNlCi0JCW1heF9saW1pdHMgPSAmYWRldi0+cG0u ZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9kYzsKLQotCWlmIChlbmFibGUpIHsK LQkJcGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay5zYW11X2RwbV9lbmFibGVfbWFzayA9IDA7Ci0J CWZvciAoaSA9IGFkZXYtPnBtLmRwbS5keW5fc3RhdGUuc2FtdV9jbG9ja192b2x0YWdlX2RlcGVu ZGVuY3lfdGFibGUuY291bnQgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGFkZXYtPnBtLmRw bS5keW5fc3RhdGUuc2FtdV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuZW50cmllc1tp XS52IDw9IG1heF9saW1pdHMtPnZkZGMpIHsKLQkJCQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNr LnNhbXVfZHBtX2VuYWJsZV9tYXNrIHw9IDEgPDwgaTsKLQotCQkJCWlmICghcGktPmNhcHNfc2Ft dV9kcG0pCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJYW1kZ3B1X2NpX3NlbmRfbXNnX3Rv X3NtY193aXRoX3BhcmFtZXRlcihhZGV2LAotCQkJCQkJICBQUFNNQ19NU0dfU0FNVURQTV9TZXRF bmFibGVkTWFzaywKLQkJCQkJCSAgcGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay5zYW11X2RwbV9l bmFibGVfbWFzayk7Ci0JfQotCXJldHVybiAoYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2 LCBlbmFibGUgPwotCQkJCSAgIFBQU01DX01TR19TQU1VRFBNX0VuYWJsZSA6IFBQU01DX01TR19T QU1VRFBNX0Rpc2FibGUpID09IFBQU01DX1Jlc3VsdF9PSykgPwotCQkwIDogLUVJTlZBTDsKLX0K LQotc3RhdGljIGludCBjaV9lbmFibGVfYWNwX2RwbShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diwgYm9vbCBlbmFibGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3Bp KGFkZXYpOwotCWNvbnN0IHN0cnVjdCBhbWRncHVfY2xvY2tfYW5kX3ZvbHRhZ2VfbGltaXRzICpt YXhfbGltaXRzOwotCWludCBpOwotCi0JaWYgKGFkZXYtPnBtLmFjX3Bvd2VyKQotCQltYXhfbGlt aXRzID0gJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWM7Ci0J ZWxzZQotCQltYXhfbGltaXRzID0gJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3Zv bHRhZ2Vfb25fZGM7Ci0KLQlpZiAoZW5hYmxlKSB7Ci0JCXBpLT5kcG1fbGV2ZWxfZW5hYmxlX21h c2suYWNwX2RwbV9lbmFibGVfbWFzayA9IDA7Ci0JCWZvciAoaSA9IGFkZXYtPnBtLmRwbS5keW5f c3RhdGUuYWNwX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZS5jb3VudCAtIDE7IGkgPj0g MDsgaS0tKSB7Ci0JCQlpZiAoYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5hY3BfY2xvY2tfdm9sdGFn ZV9kZXBlbmRlbmN5X3RhYmxlLmVudHJpZXNbaV0udiA8PSBtYXhfbGltaXRzLT52ZGRjKSB7Ci0J CQkJcGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay5hY3BfZHBtX2VuYWJsZV9tYXNrIHw9IDEgPDwg aTsKLQotCQkJCWlmICghcGktPmNhcHNfYWNwX2RwbSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0K LQotCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsCi0JCQkJ CQkgIFBQU01DX01TR19BQ1BEUE1fU2V0RW5hYmxlZE1hc2ssCi0JCQkJCQkgIHBpLT5kcG1fbGV2 ZWxfZW5hYmxlX21hc2suYWNwX2RwbV9lbmFibGVfbWFzayk7Ci0JfQotCi0JcmV0dXJuIChhbWRn cHVfY2lfc2VuZF9tc2dfdG9fc21jKGFkZXYsIGVuYWJsZSA/Ci0JCQkJICAgUFBTTUNfTVNHX0FD UERQTV9FbmFibGUgOiBQUFNNQ19NU0dfQUNQRFBNX0Rpc2FibGUpID09IFBQU01DX1Jlc3VsdF9P SykgPwotCQkwIDogLUVJTlZBTDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGNpX3VwZGF0ZV91 dmRfZHBtKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBib29sIGdhdGUpCi17Ci0Jc3RydWN0 IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXUzMiB0bXA7Ci0JaW50IHJl dCA9IDA7Ci0KLQlpZiAoIWdhdGUpIHsKLQkJLyogdHVybiB0aGUgY2xvY2tzIG9uIHdoZW4gZGVj b2RpbmcgKi8KLQkJaWYgKHBpLT5jYXBzX3V2ZF9kcG0gfHwKLQkJICAgIChhZGV2LT5wbS5kcG0u ZHluX3N0YXRlLnV2ZF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuY291bnQgPD0gMCkp Ci0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLlV2ZEJvb3RMZXZlbCA9IDA7Ci0JCWVsc2UKLQkJCXBp LT5zbWNfc3RhdGVfdGFibGUuVXZkQm9vdExldmVsID0KLQkJCQlhZGV2LT5wbS5kcG0uZHluX3N0 YXRlLnV2ZF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUuY291bnQgLSAxOwotCi0JCXRt cCA9IFJSRUczMl9TTUMoaXhEUE1fVEFCTEVfNDc1KTsKLQkJdG1wICY9IH5EUE1fVEFCTEVfNDc1 X19VdmRCb290TGV2ZWxfTUFTSzsKLQkJdG1wIHw9IChwaS0+c21jX3N0YXRlX3RhYmxlLlV2ZEJv b3RMZXZlbCA8PCBEUE1fVEFCTEVfNDc1X19VdmRCb290TGV2ZWxfX1NISUZUKTsKLQkJV1JFRzMy X1NNQyhpeERQTV9UQUJMRV80NzUsIHRtcCk7Ci0JCXJldCA9IGNpX2VuYWJsZV91dmRfZHBtKGFk ZXYsIHRydWUpOwotCX0gZWxzZSB7Ci0JCXJldCA9IGNpX2VuYWJsZV91dmRfZHBtKGFkZXYsIGZh bHNlKTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0dXJuIHJldDsKLX0K LQotc3RhdGljIHU4IGNpX2dldF92Y2VfYm9vdF9sZXZlbChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq YWRldikKLXsKLQl1OCBpOwotCXUzMiBtaW5fZXZjbGsgPSAzMDAwMDsgLyogPz8/ICovCi0Jc3Ry dWN0IGFtZGdwdV92Y2VfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlICp0YWJsZSA9Ci0J CSZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZjZV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFi bGU7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPmNvdW50OyBpKyspIHsKLQkJaWYgKHRhYmxl LT5lbnRyaWVzW2ldLmV2Y2xrID49IG1pbl9ldmNsaykKLQkJCXJldHVybiBpOwotCX0KLQotCXJl dHVybiB0YWJsZS0+Y291bnQgLSAxOwotfQotCi1zdGF0aWMgaW50IGNpX3VwZGF0ZV92Y2VfZHBt KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJICAgICBzdHJ1Y3QgYW1kZ3B1X3BzICph bWRncHVfbmV3X3N0YXRlLAotCQkJICAgICBzdHJ1Y3QgYW1kZ3B1X3BzICphbWRncHVfY3VycmVu dF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7 Ci0JaW50IHJldCA9IDA7Ci0JdTMyIHRtcDsKLQotCWlmIChhbWRncHVfY3VycmVudF9zdGF0ZS0+ ZXZjbGsgIT0gYW1kZ3B1X25ld19zdGF0ZS0+ZXZjbGspIHsKLQkJaWYgKGFtZGdwdV9uZXdfc3Rh dGUtPmV2Y2xrKSB7Ci0JCQlwaS0+c21jX3N0YXRlX3RhYmxlLlZjZUJvb3RMZXZlbCA9IGNpX2dl dF92Y2VfYm9vdF9sZXZlbChhZGV2KTsKLQkJCXRtcCA9IFJSRUczMl9TTUMoaXhEUE1fVEFCTEVf NDc1KTsKLQkJCXRtcCAmPSB+RFBNX1RBQkxFXzQ3NV9fVmNlQm9vdExldmVsX01BU0s7Ci0JCQl0 bXAgfD0gKHBpLT5zbWNfc3RhdGVfdGFibGUuVmNlQm9vdExldmVsIDw8IERQTV9UQUJMRV80NzVf X1ZjZUJvb3RMZXZlbF9fU0hJRlQpOwotCQkJV1JFRzMyX1NNQyhpeERQTV9UQUJMRV80NzUsIHRt cCk7Ci0KLQkJCXJldCA9IGNpX2VuYWJsZV92Y2VfZHBtKGFkZXYsIHRydWUpOwotCQl9IGVsc2Ug ewotCQkJcmV0ID0gY2lfZW5hYmxlX3ZjZV9kcG0oYWRldiwgZmFsc2UpOwotCQkJaWYgKHJldCkK LQkJCQlyZXR1cm4gcmV0OwotCQl9Ci0JfQotCXJldHVybiByZXQ7Ci19Ci0KLSNpZiAwCi1zdGF0 aWMgaW50IGNpX3VwZGF0ZV9zYW11X2RwbShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwgYm9v bCBnYXRlKQotewotCXJldHVybiBjaV9lbmFibGVfc2FtdV9kcG0oYWRldiwgZ2F0ZSk7Ci19Ci0K LXN0YXRpYyBpbnQgY2lfdXBkYXRlX2FjcF9kcG0oc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYs IGJvb2wgZ2F0ZSkKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRl dik7Ci0JdTMyIHRtcDsKLQotCWlmICghZ2F0ZSkgewotCQlwaS0+c21jX3N0YXRlX3RhYmxlLkFj cEJvb3RMZXZlbCA9IDA7Ci0KLQkJdG1wID0gUlJFRzMyX1NNQyhpeERQTV9UQUJMRV80NzUpOwot CQl0bXAgJj0gfkFjcEJvb3RMZXZlbF9NQVNLOwotCQl0bXAgfD0gQWNwQm9vdExldmVsKHBpLT5z bWNfc3RhdGVfdGFibGUuQWNwQm9vdExldmVsKTsKLQkJV1JFRzMyX1NNQyhpeERQTV9UQUJMRV80 NzUsIHRtcCk7Ci0JfQotCi0JcmV0dXJuIGNpX2VuYWJsZV9hY3BfZHBtKGFkZXYsICFnYXRlKTsK LX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IGNpX2dlbmVyYXRlX2RwbV9sZXZlbF9lbmFibGVfbWFz ayhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJICAgICBzdHJ1Y3QgYW1kZ3B1X3Bz ICphbWRncHVfc3RhdGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3Bp KGFkZXYpOwotCWludCByZXQ7Ci0KLQlyZXQgPSBjaV90cmltX2RwbV9zdGF0ZXMoYWRldiwgYW1k Z3B1X3N0YXRlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcGktPmRwbV9sZXZlbF9l bmFibGVfbWFzay5zY2xrX2RwbV9lbmFibGVfbWFzayA9Ci0JCWNpX2dldF9kcG1fbGV2ZWxfZW5h YmxlX21hc2tfdmFsdWUoJnBpLT5kcG1fdGFibGUuc2Nsa190YWJsZSk7Ci0JcGktPmRwbV9sZXZl bF9lbmFibGVfbWFzay5tY2xrX2RwbV9lbmFibGVfbWFzayA9Ci0JCWNpX2dldF9kcG1fbGV2ZWxf ZW5hYmxlX21hc2tfdmFsdWUoJnBpLT5kcG1fdGFibGUubWNsa190YWJsZSk7Ci0JcGktPmxhc3Rf bWNsa19kcG1fZW5hYmxlX21hc2sgPQotCQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLm1jbGtf ZHBtX2VuYWJsZV9tYXNrOwotCWlmIChwaS0+dXZkX2VuYWJsZWQpIHsKLQkJaWYgKHBpLT5kcG1f bGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21hc2sgJiAxKQotCQkJcGktPmRwbV9s ZXZlbF9lbmFibGVfbWFzay5tY2xrX2RwbV9lbmFibGVfbWFzayAmPSAweEZGRkZGRkZFOwotCX0K LQlwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnBjaWVfZHBtX2VuYWJsZV9tYXNrID0KLQkJY2lf Z2V0X2RwbV9sZXZlbF9lbmFibGVfbWFza192YWx1ZSgmcGktPmRwbV90YWJsZS5wY2llX3NwZWVk X3RhYmxlKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIGNpX2dldF9sb3dlc3RfZW5h YmxlZF9sZXZlbChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkgICAgICAgdTMyIGxl dmVsX21hc2spCi17Ci0JdTMyIGxldmVsID0gMDsKLQotCXdoaWxlICgobGV2ZWxfbWFzayAmICgx IDw8IGxldmVsKSkgPT0gMCkKLQkJbGV2ZWwrKzsKLQotCXJldHVybiBsZXZlbDsKLX0KLQotCi1z dGF0aWMgaW50IGNpX2RwbV9mb3JjZV9wZXJmb3JtYW5jZV9sZXZlbCh2b2lkICpoYW5kbGUsCi0J CQkJCSAgZW51bSBhbWRfZHBtX2ZvcmNlZF9sZXZlbCBsZXZlbCkKLXsKLQlzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKLQlzdHJ1Y3Qg Y2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JdTMyIHRtcCwgbGV2ZWxzLCBp OwotCWludCByZXQ7Ci0KLQlpZiAobGV2ZWwgPT0gQU1EX0RQTV9GT1JDRURfTEVWRUxfSElHSCkg ewotCQlpZiAoKCFwaS0+cGNpZV9kcG1fa2V5X2Rpc2FibGVkKSAmJgotCQkgICAgcGktPmRwbV9s ZXZlbF9lbmFibGVfbWFzay5wY2llX2RwbV9lbmFibGVfbWFzaykgewotCQkJbGV2ZWxzID0gMDsK LQkJCXRtcCA9IHBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2s7 Ci0JCQl3aGlsZSAodG1wID4+PSAxKQotCQkJCWxldmVscysrOwotCQkJaWYgKGxldmVscykgewot CQkJCXJldCA9IGNpX2RwbV9mb3JjZV9zdGF0ZV9wY2llKGFkZXYsIGxldmVsKTsKLQkJCQlpZiAo cmV0KQotCQkJCQlyZXR1cm4gcmV0OwotCQkJCWZvciAoaSA9IDA7IGkgPCBhZGV2LT51c2VjX3Rp bWVvdXQ7IGkrKykgewotCQkJCQl0bXAgPSAoUlJFRzMyX1NNQyhpeFRBUkdFVF9BTkRfQ1VSUkVO VF9QUk9GSUxFX0lOREVYXzEpICYKLQkJCQkJVEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5E RVhfMV9fQ1VSUl9QQ0lFX0lOREVYX01BU0spID4+Ci0JCQkJCVRBUkdFVF9BTkRfQ1VSUkVOVF9Q Uk9GSUxFX0lOREVYXzFfX0NVUlJfUENJRV9JTkRFWF9fU0hJRlQ7Ci0JCQkJCWlmICh0bXAgPT0g bGV2ZWxzKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXVkZWxheSgxKTsKLQkJCQl9Ci0JCQl9Ci0JCX0K LQkJaWYgKCghcGktPnNjbGtfZHBtX2tleV9kaXNhYmxlZCkgJiYKLQkJICAgIHBpLT5kcG1fbGV2 ZWxfZW5hYmxlX21hc2suc2Nsa19kcG1fZW5hYmxlX21hc2spIHsKLQkJCWxldmVscyA9IDA7Ci0J CQl0bXAgPSBwaS0+ZHBtX2xldmVsX2VuYWJsZV9tYXNrLnNjbGtfZHBtX2VuYWJsZV9tYXNrOwot CQkJd2hpbGUgKHRtcCA+Pj0gMSkKLQkJCQlsZXZlbHMrKzsKLQkJCWlmIChsZXZlbHMpIHsKLQkJ CQlyZXQgPSBjaV9kcG1fZm9yY2Vfc3RhdGVfc2NsayhhZGV2LCBsZXZlbHMpOwotCQkJCWlmIChy ZXQpCi0JCQkJCXJldHVybiByZXQ7Ci0JCQkJZm9yIChpID0gMDsgaSA8IGFkZXYtPnVzZWNfdGlt ZW91dDsgaSsrKSB7Ci0JCQkJCXRtcCA9IChSUkVHMzJfU01DKGl4VEFSR0VUX0FORF9DVVJSRU5U X1BST0ZJTEVfSU5ERVgpICYKLQkJCQkJVEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVhf X0NVUlJfU0NMS19JTkRFWF9NQVNLKSA+PgotCQkJCQlUQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklM RV9JTkRFWF9fQ1VSUl9TQ0xLX0lOREVYX19TSElGVDsKLQkJCQkJaWYgKHRtcCA9PSBsZXZlbHMp Ci0JCQkJCQlicmVhazsKLQkJCQkJdWRlbGF5KDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAo KCFwaS0+bWNsa19kcG1fa2V5X2Rpc2FibGVkKSAmJgotCQkgICAgcGktPmRwbV9sZXZlbF9lbmFi bGVfbWFzay5tY2xrX2RwbV9lbmFibGVfbWFzaykgewotCQkJbGV2ZWxzID0gMDsKLQkJCXRtcCA9 IHBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2subWNsa19kcG1fZW5hYmxlX21hc2s7Ci0JCQl3aGls ZSAodG1wID4+PSAxKQotCQkJCWxldmVscysrOwotCQkJaWYgKGxldmVscykgewotCQkJCXJldCA9 IGNpX2RwbV9mb3JjZV9zdGF0ZV9tY2xrKGFkZXYsIGxldmVscyk7Ci0JCQkJaWYgKHJldCkKLQkJ CQkJcmV0dXJuIHJldDsKLQkJCQlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0OyBp KyspIHsKLQkJCQkJdG1wID0gKFJSRUczMl9TTUMoaXhUQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklM RV9JTkRFWCkgJgotCQkJCQlUQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklMRV9JTkRFWF9fQ1VSUl9N Q0xLX0lOREVYX01BU0spID4+Ci0JCQkJCVRBUkdFVF9BTkRfQ1VSUkVOVF9QUk9GSUxFX0lOREVY X19DVVJSX01DTEtfSU5ERVhfX1NISUZUOwotCQkJCQlpZiAodG1wID09IGxldmVscykKLQkJCQkJ CWJyZWFrOwotCQkJCQl1ZGVsYXkoMSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfSBlbHNlIGlmIChs ZXZlbCA9PSBBTURfRFBNX0ZPUkNFRF9MRVZFTF9MT1cpIHsKLQkJaWYgKCghcGktPnNjbGtfZHBt X2tleV9kaXNhYmxlZCkgJiYKLQkJICAgIHBpLT5kcG1fbGV2ZWxfZW5hYmxlX21hc2suc2Nsa19k cG1fZW5hYmxlX21hc2spIHsKLQkJCWxldmVscyA9IGNpX2dldF9sb3dlc3RfZW5hYmxlZF9sZXZl bChhZGV2LAotCQkJCQkJCSAgICAgcGktPmRwbV9sZXZlbF9lbmFibGVfbWFzay5zY2xrX2RwbV9l bmFibGVfbWFzayk7Ci0JCQlyZXQgPSBjaV9kcG1fZm9yY2Vfc3RhdGVfc2NsayhhZGV2LCBsZXZl bHMpOwotCQkJaWYgKHJldCkKLQkJCQlyZXR1cm4gcmV0OwotCQkJZm9yIChpID0gMDsgaSA8IGFk ZXYtPnVzZWNfdGltZW91dDsgaSsrKSB7Ci0JCQkJdG1wID0gKFJSRUczMl9TTUMoaXhUQVJHRVRf QU5EX0NVUlJFTlRfUFJPRklMRV9JTkRFWCkgJgotCQkJCVRBUkdFVF9BTkRfQ1VSUkVOVF9QUk9G SUxFX0lOREVYX19DVVJSX1NDTEtfSU5ERVhfTUFTSykgPj4KLQkJCQlUQVJHRVRfQU5EX0NVUlJF TlRfUFJPRklMRV9JTkRFWF9fQ1VSUl9TQ0xLX0lOREVYX19TSElGVDsKLQkJCQlpZiAodG1wID09 IGxldmVscykKLQkJCQkJYnJlYWs7Ci0JCQkJdWRlbGF5KDEpOwotCQkJfQotCQl9Ci0JCWlmICgo IXBpLT5tY2xrX2RwbV9rZXlfZGlzYWJsZWQpICYmCi0JCSAgICBwaS0+ZHBtX2xldmVsX2VuYWJs ZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrKSB7Ci0JCQlsZXZlbHMgPSBjaV9nZXRfbG93ZXN0 X2VuYWJsZWRfbGV2ZWwoYWRldiwKLQkJCQkJCQkgICAgIHBpLT5kcG1fbGV2ZWxfZW5hYmxlX21h c2subWNsa19kcG1fZW5hYmxlX21hc2spOwotCQkJcmV0ID0gY2lfZHBtX2ZvcmNlX3N0YXRlX21j bGsoYWRldiwgbGV2ZWxzKTsKLQkJCWlmIChyZXQpCi0JCQkJcmV0dXJuIHJldDsKLQkJCWZvciAo aSA9IDA7IGkgPCBhZGV2LT51c2VjX3RpbWVvdXQ7IGkrKykgewotCQkJCXRtcCA9IChSUkVHMzJf U01DKGl4VEFSR0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVgpICYKLQkJCQlUQVJHRVRfQU5E X0NVUlJFTlRfUFJPRklMRV9JTkRFWF9fQ1VSUl9NQ0xLX0lOREVYX01BU0spID4+Ci0JCQkJVEFS R0VUX0FORF9DVVJSRU5UX1BST0ZJTEVfSU5ERVhfX0NVUlJfTUNMS19JTkRFWF9fU0hJRlQ7Ci0J CQkJaWYgKHRtcCA9PSBsZXZlbHMpCi0JCQkJCWJyZWFrOwotCQkJCXVkZWxheSgxKTsKLQkJCX0K LQkJfQotCQlpZiAoKCFwaS0+cGNpZV9kcG1fa2V5X2Rpc2FibGVkKSAmJgotCQkgICAgcGktPmRw bV9sZXZlbF9lbmFibGVfbWFzay5wY2llX2RwbV9lbmFibGVfbWFzaykgewotCQkJbGV2ZWxzID0g Y2lfZ2V0X2xvd2VzdF9lbmFibGVkX2xldmVsKGFkZXYsCi0JCQkJCQkJICAgICBwaS0+ZHBtX2xl dmVsX2VuYWJsZV9tYXNrLnBjaWVfZHBtX2VuYWJsZV9tYXNrKTsKLQkJCXJldCA9IGNpX2RwbV9m b3JjZV9zdGF0ZV9wY2llKGFkZXYsIGxldmVscyk7Ci0JCQlpZiAocmV0KQotCQkJCXJldHVybiBy ZXQ7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKLQkJCQl0 bXAgPSAoUlJFRzMyX1NNQyhpeFRBUkdFVF9BTkRfQ1VSUkVOVF9QUk9GSUxFX0lOREVYXzEpICYK LQkJCQlUQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklMRV9JTkRFWF8xX19DVVJSX1BDSUVfSU5ERVhf TUFTSykgPj4KLQkJCQlUQVJHRVRfQU5EX0NVUlJFTlRfUFJPRklMRV9JTkRFWF8xX19DVVJSX1BD SUVfSU5ERVhfX1NISUZUOwotCQkJCWlmICh0bXAgPT0gbGV2ZWxzKQotCQkJCQlicmVhazsKLQkJ CQl1ZGVsYXkoMSk7Ci0JCQl9Ci0JCX0KLQl9IGVsc2UgaWYgKGxldmVsID09IEFNRF9EUE1fRk9S Q0VEX0xFVkVMX0FVVE8pIHsKLQkJaWYgKCFwaS0+cGNpZV9kcG1fa2V5X2Rpc2FibGVkKSB7Ci0J CQlQUFNNQ19SZXN1bHQgc21jX3Jlc3VsdDsKLQotCQkJc21jX3Jlc3VsdCA9IGFtZGdwdV9jaV9z ZW5kX21zZ190b19zbWMoYWRldiwKLQkJCQkJCQkgICAgICAgUFBTTUNfTVNHX1BDSWVEUE1fVW5G b3JjZUxldmVsKTsKLQkJCWlmIChzbWNfcmVzdWx0ICE9IFBQU01DX1Jlc3VsdF9PSykKLQkJCQly ZXR1cm4gLUVJTlZBTDsKLQkJfQotCQlyZXQgPSBjaV91cGxvYWRfZHBtX2xldmVsX2VuYWJsZV9t YXNrKGFkZXYpOwotCQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQl9Ci0KLQlhZGV2LT5wbS5k cG0uZm9yY2VkX2xldmVsID0gbGV2ZWw7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBj aV9zZXRfbWNfc3BlY2lhbF9yZWdpc3RlcnMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0J CQkJICAgICAgIHN0cnVjdCBjaV9tY19yZWdfdGFibGUgKnRhYmxlKQotewotCXU4IGksIGosIGs7 Ci0JdTMyIHRlbXBfcmVnOwotCi0JZm9yIChpID0gMCwgaiA9IHRhYmxlLT5sYXN0OyBpIDwgdGFi bGUtPmxhc3Q7IGkrKykgewotCQlpZiAoaiA+PSBTTVU3X0RJU0NSRVRFX01DX1JFR0lTVEVSX0FS UkFZX1NJWkUpCi0JCQlyZXR1cm4gLUVJTlZBTDsKLQkJc3dpdGNoKHRhYmxlLT5tY19yZWdfYWRk cmVzc1tpXS5zMSkgewotCQljYXNlIG1tTUNfU0VRX01JU0MxOgotCQkJdGVtcF9yZWcgPSBSUkVH MzIobW1NQ19QTUdfQ01EX0VNUlMpOwotCQkJdGFibGUtPm1jX3JlZ19hZGRyZXNzW2pdLnMxID0g bW1NQ19QTUdfQ01EX0VNUlM7Ci0JCQl0YWJsZS0+bWNfcmVnX2FkZHJlc3Nbal0uczAgPSBtbU1D X1NFUV9QTUdfQ01EX0VNUlNfTFA7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgdGFibGUtPm51bV9lbnRy aWVzOyBrKyspIHsKLQkJCQl0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1jX2RhdGFbal0g PQotCQkJCQkoKHRlbXBfcmVnICYgMHhmZmZmMDAwMCkpIHwgKCh0YWJsZS0+bWNfcmVnX3RhYmxl X2VudHJ5W2tdLm1jX2RhdGFbaV0gJiAweGZmZmYwMDAwKSA+PiAxNik7Ci0JCQl9Ci0JCQlqKys7 Ci0KLQkJCWlmIChqID49IFNNVTdfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlfU0laRSkKLQkJ CQlyZXR1cm4gLUVJTlZBTDsKLQkJCXRlbXBfcmVnID0gUlJFRzMyKG1tTUNfUE1HX0NNRF9NUlMp OwotCQkJdGFibGUtPm1jX3JlZ19hZGRyZXNzW2pdLnMxID0gbW1NQ19QTUdfQ01EX01SUzsKLQkJ CXRhYmxlLT5tY19yZWdfYWRkcmVzc1tqXS5zMCA9IG1tTUNfU0VRX1BNR19DTURfTVJTX0xQOwot CQkJZm9yIChrID0gMDsgayA8IHRhYmxlLT5udW1fZW50cmllczsgaysrKSB7Ci0JCQkJdGFibGUt Pm1jX3JlZ190YWJsZV9lbnRyeVtrXS5tY19kYXRhW2pdID0KLQkJCQkJKHRlbXBfcmVnICYgMHhm ZmZmMDAwMCkgfCAodGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtrXS5tY19kYXRhW2ldICYgMHgw MDAwZmZmZik7Ci0JCQkJaWYgKGFkZXYtPmdtYy52cmFtX3R5cGUgIT0gQU1ER1BVX1ZSQU1fVFlQ RV9HRERSNSkKLQkJCQkJdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtrXS5tY19kYXRhW2pdIHw9 IDB4MTAwOwotCQkJfQotCQkJaisrOwotCi0JCQlpZiAoYWRldi0+Z21jLnZyYW1fdHlwZSAhPSBB TURHUFVfVlJBTV9UWVBFX0dERFI1KSB7Ci0JCQkJaWYgKGogPj0gU01VN19ESVNDUkVURV9NQ19S RUdJU1RFUl9BUlJBWV9TSVpFKQotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl0YWJsZS0+bWNf cmVnX2FkZHJlc3Nbal0uczEgPSBtbU1DX1BNR19BVVRPX0NNRDsKLQkJCQl0YWJsZS0+bWNfcmVn X2FkZHJlc3Nbal0uczAgPSBtbU1DX1BNR19BVVRPX0NNRDsKLQkJCQlmb3IgKGsgPSAwOyBrIDwg dGFibGUtPm51bV9lbnRyaWVzOyBrKyspIHsKLQkJCQkJdGFibGUtPm1jX3JlZ190YWJsZV9lbnRy eVtrXS5tY19kYXRhW2pdID0KLQkJCQkJCSh0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1j X2RhdGFbaV0gJiAweGZmZmYwMDAwKSA+PiAxNjsKLQkJCQl9Ci0JCQkJaisrOwotCQkJfQotCQkJ YnJlYWs7Ci0JCWNhc2UgbW1NQ19TRVFfUkVTRVJWRV9NOgotCQkJdGVtcF9yZWcgPSBSUkVHMzIo bW1NQ19QTUdfQ01EX01SUzEpOwotCQkJdGFibGUtPm1jX3JlZ19hZGRyZXNzW2pdLnMxID0gbW1N Q19QTUdfQ01EX01SUzE7Ci0JCQl0YWJsZS0+bWNfcmVnX2FkZHJlc3Nbal0uczAgPSBtbU1DX1NF UV9QTUdfQ01EX01SUzFfTFA7Ci0JCQlmb3IgKGsgPSAwOyBrIDwgdGFibGUtPm51bV9lbnRyaWVz OyBrKyspIHsKLQkJCQl0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1jX2RhdGFbal0gPQot CQkJCQkodGVtcF9yZWcgJiAweGZmZmYwMDAwKSB8ICh0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5 W2tdLm1jX2RhdGFbaV0gJiAweDAwMDBmZmZmKTsKLQkJCX0KLQkJCWorKzsKLQkJCWJyZWFrOwot CQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXRhYmxlLT5sYXN0ID0gajsKLQot CXJldHVybiAwOwotfQotCi1zdGF0aWMgYm9vbCBjaV9jaGVja19zMF9tY19yZWdfaW5kZXgodTE2 IGluX3JlZywgdTE2ICpvdXRfcmVnKQotewotCWJvb2wgcmVzdWx0ID0gdHJ1ZTsKLQotCXN3aXRj aChpbl9yZWcpIHsKLQljYXNlIG1tTUNfU0VRX1JBU19USU1JTkc6Ci0JCSpvdXRfcmVnID0gbW1N Q19TRVFfUkFTX1RJTUlOR19MUDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1DX1NFUV9ETExfU1RCWToK LQkJKm91dF9yZWcgPSBtbU1DX1NFUV9ETExfU1RCWV9MUDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1D X1NFUV9HNVBEWF9DTUQwOgotCQkqb3V0X3JlZyA9IG1tTUNfU0VRX0c1UERYX0NNRDBfTFA7Ci0J CWJyZWFrOwotCWNhc2UgbW1NQ19TRVFfRzVQRFhfQ01EMToKLQkJKm91dF9yZWcgPSBtbU1DX1NF UV9HNVBEWF9DTUQxX0xQOwotCQlicmVhazsKLQljYXNlIG1tTUNfU0VRX0c1UERYX0NUUkw6Ci0J CSpvdXRfcmVnID0gbW1NQ19TRVFfRzVQRFhfQ1RSTF9MUDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1D X1NFUV9DQVNfVElNSU5HOgotCQkqb3V0X3JlZyA9IG1tTUNfU0VRX0NBU19USU1JTkdfTFA7Ci0J ICAgIGJyZWFrOwotCWNhc2UgbW1NQ19TRVFfTUlTQ19USU1JTkc6Ci0JCSpvdXRfcmVnID0gbW1N Q19TRVFfTUlTQ19USU1JTkdfTFA7Ci0JCWJyZWFrOwotCWNhc2UgbW1NQ19TRVFfTUlTQ19USU1J TkcyOgotCQkqb3V0X3JlZyA9IG1tTUNfU0VRX01JU0NfVElNSU5HMl9MUDsKLQkJYnJlYWs7Ci0J Y2FzZSBtbU1DX1NFUV9QTUdfRFZTX0NNRDoKLQkJKm91dF9yZWcgPSBtbU1DX1NFUV9QTUdfRFZT X0NNRF9MUDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1DX1NFUV9QTUdfRFZTX0NUTDoKLQkJKm91dF9y ZWcgPSBtbU1DX1NFUV9QTUdfRFZTX0NUTF9MUDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1DX1NFUV9S RF9DVExfRDA6Ci0JCSpvdXRfcmVnID0gbW1NQ19TRVFfUkRfQ1RMX0QwX0xQOwotCQlicmVhazsK LQljYXNlIG1tTUNfU0VRX1JEX0NUTF9EMToKLQkJKm91dF9yZWcgPSBtbU1DX1NFUV9SRF9DVExf RDFfTFA7Ci0JCWJyZWFrOwotCWNhc2UgbW1NQ19TRVFfV1JfQ1RMX0QwOgotCQkqb3V0X3JlZyA9 IG1tTUNfU0VRX1dSX0NUTF9EMF9MUDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1DX1NFUV9XUl9DVExf RDE6Ci0JCSpvdXRfcmVnID0gbW1NQ19TRVFfV1JfQ1RMX0QxX0xQOwotCQlicmVhazsKLQljYXNl IG1tTUNfUE1HX0NNRF9FTVJTOgotCQkqb3V0X3JlZyA9IG1tTUNfU0VRX1BNR19DTURfRU1SU19M UDsKLQkJYnJlYWs7Ci0JY2FzZSBtbU1DX1BNR19DTURfTVJTOgotCQkqb3V0X3JlZyA9IG1tTUNf U0VRX1BNR19DTURfTVJTX0xQOwotCQlicmVhazsKLQljYXNlIG1tTUNfUE1HX0NNRF9NUlMxOgot CQkqb3V0X3JlZyA9IG1tTUNfU0VRX1BNR19DTURfTVJTMV9MUDsKLQkJYnJlYWs7Ci0JY2FzZSBt bU1DX1NFUV9QTUdfVElNSU5HOgotCQkqb3V0X3JlZyA9IG1tTUNfU0VRX1BNR19USU1JTkdfTFA7 Ci0JCWJyZWFrOwotCWNhc2UgbW1NQ19QTUdfQ01EX01SUzI6Ci0JCSpvdXRfcmVnID0gbW1NQ19T RVFfUE1HX0NNRF9NUlMyX0xQOwotCQlicmVhazsKLQljYXNlIG1tTUNfU0VRX1dSX0NUTF8yOgot CQkqb3V0X3JlZyA9IG1tTUNfU0VRX1dSX0NUTF8yX0xQOwotCQlicmVhazsKLQlkZWZhdWx0Ogot CQlyZXN1bHQgPSBmYWxzZTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQot c3RhdGljIHZvaWQgY2lfc2V0X3ZhbGlkX2ZsYWcoc3RydWN0IGNpX21jX3JlZ190YWJsZSAqdGFi bGUpCi17Ci0JdTggaSwgajsKLQotCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+bGFzdDsgaSsrKSB7 Ci0JCWZvciAoaiA9IDE7IGogPCB0YWJsZS0+bnVtX2VudHJpZXM7IGorKykgewotCQkJaWYgKHRh YmxlLT5tY19yZWdfdGFibGVfZW50cnlbai0xXS5tY19kYXRhW2ldICE9Ci0JCQkgICAgdGFibGUt Pm1jX3JlZ190YWJsZV9lbnRyeVtqXS5tY19kYXRhW2ldKSB7Ci0JCQkJdGFibGUtPnZhbGlkX2Zs YWcgfD0gMSA8PCBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9p ZCBjaV9zZXRfczBfbWNfcmVnX2luZGV4KHN0cnVjdCBjaV9tY19yZWdfdGFibGUgKnRhYmxlKQot ewotCXUzMiBpOwotCXUxNiBhZGRyZXNzOwotCi0JZm9yIChpID0gMDsgaSA8IHRhYmxlLT5sYXN0 OyBpKyspIHsKLQkJdGFibGUtPm1jX3JlZ19hZGRyZXNzW2ldLnMwID0KLQkJCWNpX2NoZWNrX3Mw X21jX3JlZ19pbmRleCh0YWJsZS0+bWNfcmVnX2FkZHJlc3NbaV0uczEsICZhZGRyZXNzKSA/Ci0J CQlhZGRyZXNzIDogdGFibGUtPm1jX3JlZ19hZGRyZXNzW2ldLnMxOwotCX0KLX0KLQotc3RhdGlj IGludCBjaV9jb3B5X3ZiaW9zX21jX3JlZ190YWJsZShjb25zdCBzdHJ1Y3QgYXRvbV9tY19yZWdf dGFibGUgKnRhYmxlLAotCQkJCSAgICAgIHN0cnVjdCBjaV9tY19yZWdfdGFibGUgKmNpX3RhYmxl KQotewotCXU4IGksIGo7Ci0KLQlpZiAodGFibGUtPmxhc3QgPiBTTVU3X0RJU0NSRVRFX01DX1JF R0lTVEVSX0FSUkFZX1NJWkUpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmICh0YWJsZS0+bnVtX2Vu dHJpZXMgPiBNQVhfQUNfVElNSU5HX0VOVFJJRVMpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JZm9y IChpID0gMDsgaSA8IHRhYmxlLT5sYXN0OyBpKyspCi0JCWNpX3RhYmxlLT5tY19yZWdfYWRkcmVz c1tpXS5zMSA9IHRhYmxlLT5tY19yZWdfYWRkcmVzc1tpXS5zMTsKLQotCWNpX3RhYmxlLT5sYXN0 ID0gdGFibGUtPmxhc3Q7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPm51bV9lbnRyaWVzOyBp KyspIHsKLQkJY2lfdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtpXS5tY2xrX21heCA9Ci0JCQl0 YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2ldLm1jbGtfbWF4OwotCQlmb3IgKGogPSAwOyBqIDwg dGFibGUtPmxhc3Q7IGorKykKLQkJCWNpX3RhYmxlLT5tY19yZWdfdGFibGVfZW50cnlbaV0ubWNf ZGF0YVtqXSA9Ci0JCQkJdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtpXS5tY19kYXRhW2pdOwot CX0KLQljaV90YWJsZS0+bnVtX2VudHJpZXMgPSB0YWJsZS0+bnVtX2VudHJpZXM7Ci0KLQlyZXR1 cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9yZWdpc3Rlcl9wYXRjaGluZ19tY19zZXEoc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAgIHN0cnVjdCBjaV9tY19yZWdfdGFibGUg KnRhYmxlKQotewotCXU4IGksIGs7Ci0JdTMyIHRtcDsKLQlib29sIHBhdGNoOwotCi0JdG1wID0g UlJFRzMyKG1tTUNfU0VRX01JU0MwKTsKLQlwYXRjaCA9ICgodG1wICYgMHgwMDAwZjAwKSA9PSAw eDMwMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQlpZiAocGF0Y2ggJiYKLQkgICAgKChhZGV2LT5wZGV2 LT5kZXZpY2UgPT0gMHg2N0IwKSB8fAotCSAgICAgKGFkZXYtPnBkZXYtPmRldmljZSA9PSAweDY3 QjEpKSkgewotCQlmb3IgKGkgPSAwOyBpIDwgdGFibGUtPmxhc3Q7IGkrKykgewotCQkJaWYgKHRh YmxlLT5sYXN0ID49IFNNVTdfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlfU0laRSkKLQkJCQly ZXR1cm4gLUVJTlZBTDsKLQkJCXN3aXRjaCAodGFibGUtPm1jX3JlZ19hZGRyZXNzW2ldLnMxKSB7 Ci0JCQljYXNlIG1tTUNfU0VRX01JU0MxOgotCQkJCWZvciAoayA9IDA7IGsgPCB0YWJsZS0+bnVt X2VudHJpZXM7IGsrKykgewotCQkJCQlpZiAoKHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10u bWNsa19tYXggPT0gMTI1MDAwKSB8fAotCQkJCQkgICAgKHRhYmxlLT5tY19yZWdfdGFibGVfZW50 cnlba10ubWNsa19tYXggPT0gMTM3NTAwKSkKLQkJCQkJCXRhYmxlLT5tY19yZWdfdGFibGVfZW50 cnlba10ubWNfZGF0YVtpXSA9Ci0JCQkJCQkJKHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10u bWNfZGF0YVtpXSAmIDB4RkZGRkZGRjgpIHwKLQkJCQkJCQkweDAwMDAwMDA3OwotCQkJCX0KLQkJ CQlicmVhazsKLQkJCWNhc2UgbW1NQ19TRVFfV1JfQ1RMX0QwOgotCQkJCWZvciAoayA9IDA7IGsg PCB0YWJsZS0+bnVtX2VudHJpZXM7IGsrKykgewotCQkJCQlpZiAoKHRhYmxlLT5tY19yZWdfdGFi bGVfZW50cnlba10ubWNsa19tYXggPT0gMTI1MDAwKSB8fAotCQkJCQkgICAgKHRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlba10ubWNsa19tYXggPT0gMTM3NTAwKSkKLQkJCQkJCXRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSA9Ci0JCQkJCQkJKHRhYmxlLT5tY19yZWdfdGFi bGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4RkZGRjBGMDApIHwKLQkJCQkJCQkweDAwMDBEMERE OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgbW1NQ19TRVFfV1JfQ1RMX0QxOgotCQkJCWZv ciAoayA9IDA7IGsgPCB0YWJsZS0+bnVtX2VudHJpZXM7IGsrKykgewotCQkJCQlpZiAoKHRhYmxl LT5tY19yZWdfdGFibGVfZW50cnlba10ubWNsa19tYXggPT0gMTI1MDAwKSB8fAotCQkJCQkgICAg KHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNsa19tYXggPT0gMTM3NTAwKSkKLQkJCQkJ CXRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSA9Ci0JCQkJCQkJKHRhYmxl LT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4RkZGRjBGMDApIHwKLQkJCQkJ CQkweDAwMDBEMEREOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgbW1NQ19TRVFfV1JfQ1RM XzI6Ci0JCQkJZm9yIChrID0gMDsgayA8IHRhYmxlLT5udW1fZW50cmllczsgaysrKSB7Ci0JCQkJ CWlmICgodGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtrXS5tY2xrX21heCA9PSAxMjUwMDApIHx8 Ci0JCQkJCSAgICAodGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtrXS5tY2xrX21heCA9PSAxMzc1 MDApKQotCQkJCQkJdGFibGUtPm1jX3JlZ190YWJsZV9lbnRyeVtrXS5tY19kYXRhW2ldID0gMDsK LQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIG1tTUNfU0VRX0NBU19USU1JTkc6Ci0JCQkJZm9y IChrID0gMDsgayA8IHRhYmxlLT5udW1fZW50cmllczsgaysrKSB7Ci0JCQkJCWlmICh0YWJsZS0+ bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1jbGtfbWF4ID09IDEyNTAwMCkKLQkJCQkJCXRhYmxlLT5t Y19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSA9Ci0JCQkJCQkJKHRhYmxlLT5tY19yZWdf dGFibGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4RkZFMEZFMEYpIHwKLQkJCQkJCQkweDAwMEMw MTQwOwotCQkJCQllbHNlIGlmICh0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1jbGtfbWF4 ID09IDEzNzUwMCkKLQkJCQkJCXRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtp XSA9Ci0JCQkJCQkJKHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4 RkZFMEZFMEYpIHwKLQkJCQkJCQkweDAwMEMwMTUwOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNh c2UgbW1NQ19TRVFfTUlTQ19USU1JTkc6Ci0JCQkJZm9yIChrID0gMDsgayA8IHRhYmxlLT5udW1f ZW50cmllczsgaysrKSB7Ci0JCQkJCWlmICh0YWJsZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1j bGtfbWF4ID09IDEyNTAwMCkKLQkJCQkJCXRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNf ZGF0YVtpXSA9Ci0JCQkJCQkJKHRhYmxlLT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtp XSAmIDB4RkZGRkZGRTApIHwKLQkJCQkJCQkweDAwMDAwMDMwOwotCQkJCQllbHNlIGlmICh0YWJs ZS0+bWNfcmVnX3RhYmxlX2VudHJ5W2tdLm1jbGtfbWF4ID09IDEzNzUwMCkKLQkJCQkJCXRhYmxl LT5tY19yZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSA9Ci0JCQkJCQkJKHRhYmxlLT5tY19y ZWdfdGFibGVfZW50cnlba10ubWNfZGF0YVtpXSAmIDB4RkZGRkZGRTApIHwKLQkJCQkJCQkweDAw MDAwMDM1OwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJYnJlYWs7Ci0JCQl9 Ci0JCX0KLQotCQlXUkVHMzIobW1NQ19TRVFfSU9fREVCVUdfSU5ERVgsIDMpOwotCQl0bXAgPSBS UkVHMzIobW1NQ19TRVFfSU9fREVCVUdfREFUQSk7Ci0JCXRtcCA9ICh0bXAgJiAweEZGRjhGRkZG KSB8ICgxIDw8IDE2KTsKLQkJV1JFRzMyKG1tTUNfU0VRX0lPX0RFQlVHX0lOREVYLCAzKTsKLQkJ V1JFRzMyKG1tTUNfU0VRX0lPX0RFQlVHX0RBVEEsIHRtcCk7Ci0JfQotCi0JcmV0dXJuIDA7Ci19 Ci0KLXN0YXRpYyBpbnQgY2lfaW5pdGlhbGl6ZV9tY19yZWdfdGFibGUoc3RydWN0IGFtZGdwdV9k ZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFk ZXYpOwotCXN0cnVjdCBhdG9tX21jX3JlZ190YWJsZSAqdGFibGU7Ci0Jc3RydWN0IGNpX21jX3Jl Z190YWJsZSAqY2lfdGFibGUgPSAmcGktPm1jX3JlZ190YWJsZTsKLQl1OCBtb2R1bGVfaW5kZXgg PSBjaV9nZXRfbWVtb3J5X21vZHVsZV9pbmRleChhZGV2KTsKLQlpbnQgcmV0OwotCi0JdGFibGUg PSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYXRvbV9tY19yZWdfdGFibGUpLCBHRlBfS0VSTkVMKTsK LQlpZiAoIXRhYmxlKQotCQlyZXR1cm4gLUVOT01FTTsKLQotCVdSRUczMihtbU1DX1NFUV9SQVNf VElNSU5HX0xQLCBSUkVHMzIobW1NQ19TRVFfUkFTX1RJTUlORykpOwotCVdSRUczMihtbU1DX1NF UV9DQVNfVElNSU5HX0xQLCBSUkVHMzIobW1NQ19TRVFfQ0FTX1RJTUlORykpOwotCVdSRUczMiht bU1DX1NFUV9ETExfU1RCWV9MUCwgUlJFRzMyKG1tTUNfU0VRX0RMTF9TVEJZKSk7Ci0JV1JFRzMy KG1tTUNfU0VRX0c1UERYX0NNRDBfTFAsIFJSRUczMihtbU1DX1NFUV9HNVBEWF9DTUQwKSk7Ci0J V1JFRzMyKG1tTUNfU0VRX0c1UERYX0NNRDFfTFAsIFJSRUczMihtbU1DX1NFUV9HNVBEWF9DTUQx KSk7Ci0JV1JFRzMyKG1tTUNfU0VRX0c1UERYX0NUUkxfTFAsIFJSRUczMihtbU1DX1NFUV9HNVBE WF9DVFJMKSk7Ci0JV1JFRzMyKG1tTUNfU0VRX1BNR19EVlNfQ01EX0xQLCBSUkVHMzIobW1NQ19T RVFfUE1HX0RWU19DTUQpKTsKLQlXUkVHMzIobW1NQ19TRVFfUE1HX0RWU19DVExfTFAsIFJSRUcz MihtbU1DX1NFUV9QTUdfRFZTX0NUTCkpOwotCVdSRUczMihtbU1DX1NFUV9NSVNDX1RJTUlOR19M UCwgUlJFRzMyKG1tTUNfU0VRX01JU0NfVElNSU5HKSk7Ci0JV1JFRzMyKG1tTUNfU0VRX01JU0Nf VElNSU5HMl9MUCwgUlJFRzMyKG1tTUNfU0VRX01JU0NfVElNSU5HMikpOwotCVdSRUczMihtbU1D X1NFUV9QTUdfQ01EX0VNUlNfTFAsIFJSRUczMihtbU1DX1BNR19DTURfRU1SUykpOwotCVdSRUcz MihtbU1DX1NFUV9QTUdfQ01EX01SU19MUCwgUlJFRzMyKG1tTUNfUE1HX0NNRF9NUlMpKTsKLQlX UkVHMzIobW1NQ19TRVFfUE1HX0NNRF9NUlMxX0xQLCBSUkVHMzIobW1NQ19QTUdfQ01EX01SUzEp KTsKLQlXUkVHMzIobW1NQ19TRVFfV1JfQ1RMX0QwX0xQLCBSUkVHMzIobW1NQ19TRVFfV1JfQ1RM X0QwKSk7Ci0JV1JFRzMyKG1tTUNfU0VRX1dSX0NUTF9EMV9MUCwgUlJFRzMyKG1tTUNfU0VRX1dS X0NUTF9EMSkpOwotCVdSRUczMihtbU1DX1NFUV9SRF9DVExfRDBfTFAsIFJSRUczMihtbU1DX1NF UV9SRF9DVExfRDApKTsKLQlXUkVHMzIobW1NQ19TRVFfUkRfQ1RMX0QxX0xQLCBSUkVHMzIobW1N Q19TRVFfUkRfQ1RMX0QxKSk7Ci0JV1JFRzMyKG1tTUNfU0VRX1BNR19USU1JTkdfTFAsIFJSRUcz MihtbU1DX1NFUV9QTUdfVElNSU5HKSk7Ci0JV1JFRzMyKG1tTUNfU0VRX1BNR19DTURfTVJTMl9M UCwgUlJFRzMyKG1tTUNfUE1HX0NNRF9NUlMyKSk7Ci0JV1JFRzMyKG1tTUNfU0VRX1dSX0NUTF8y X0xQLCBSUkVHMzIobW1NQ19TRVFfV1JfQ1RMXzIpKTsKLQotCXJldCA9IGFtZGdwdV9hdG9tYmlv c19pbml0X21jX3JlZ190YWJsZShhZGV2LCBtb2R1bGVfaW5kZXgsIHRhYmxlKTsKLQlpZiAocmV0 KQotCQlnb3RvIGluaXRfbWNfZG9uZTsKLQotCXJldCA9IGNpX2NvcHlfdmJpb3NfbWNfcmVnX3Rh YmxlKHRhYmxlLCBjaV90YWJsZSk7Ci0JaWYgKHJldCkKLQkJZ290byBpbml0X21jX2RvbmU7Ci0K LQljaV9zZXRfczBfbWNfcmVnX2luZGV4KGNpX3RhYmxlKTsKLQotCXJldCA9IGNpX3JlZ2lzdGVy X3BhdGNoaW5nX21jX3NlcShhZGV2LCBjaV90YWJsZSk7Ci0JaWYgKHJldCkKLQkJZ290byBpbml0 X21jX2RvbmU7Ci0KLQlyZXQgPSBjaV9zZXRfbWNfc3BlY2lhbF9yZWdpc3RlcnMoYWRldiwgY2lf dGFibGUpOwotCWlmIChyZXQpCi0JCWdvdG8gaW5pdF9tY19kb25lOwotCi0JY2lfc2V0X3ZhbGlk X2ZsYWcoY2lfdGFibGUpOwotCi1pbml0X21jX2RvbmU6Ci0Ja2ZyZWUodGFibGUpOwotCi0JcmV0 dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjaV9wb3B1bGF0ZV9tY19yZWdfYWRkcmVzc2VzKHN0 cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCQlTTVU3X0Rpc2NyZXRlX01DUmVnaXN0ZXJz ICptY19yZWdfdGFibGUpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3Bp KGFkZXYpOwotCXUzMiBpLCBqOwotCi0JZm9yIChpID0gMCwgaiA9IDA7IGogPCBwaS0+bWNfcmVn X3RhYmxlLmxhc3Q7IGorKykgewotCQlpZiAocGktPm1jX3JlZ190YWJsZS52YWxpZF9mbGFnICYg KDEgPDwgaikpIHsKLQkJCWlmIChpID49IFNNVTdfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlf U0laRSkKLQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCW1jX3JlZ190YWJsZS0+YWRkcmVzc1tpXS5z MCA9IGNwdV90b19iZTE2KHBpLT5tY19yZWdfdGFibGUubWNfcmVnX2FkZHJlc3Nbal0uczApOwot CQkJbWNfcmVnX3RhYmxlLT5hZGRyZXNzW2ldLnMxID0gY3B1X3RvX2JlMTYocGktPm1jX3JlZ190 YWJsZS5tY19yZWdfYWRkcmVzc1tqXS5zMSk7Ci0JCQlpKys7Ci0JCX0KLQl9Ci0KLQltY19yZWdf dGFibGUtPmxhc3QgPSAodTgpaTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBjaV9j b252ZXJ0X21jX3JlZ2lzdGVycyhjb25zdCBzdHJ1Y3QgY2lfbWNfcmVnX2VudHJ5ICplbnRyeSwK LQkJCQkgICAgU01VN19EaXNjcmV0ZV9NQ1JlZ2lzdGVyU2V0ICpkYXRhLAotCQkJCSAgICB1MzIg bnVtX2VudHJpZXMsIHUzMiB2YWxpZF9mbGFnKQotewotCXUzMiBpLCBqOwotCi0JZm9yIChpID0g MCwgaiA9IDA7IGogPCBudW1fZW50cmllczsgaisrKSB7Ci0JCWlmICh2YWxpZF9mbGFnICYgKDEg PDwgaikpIHsKLQkJCWRhdGEtPnZhbHVlW2ldID0gY3B1X3RvX2JlMzIoZW50cnktPm1jX2RhdGFb al0pOwotCQkJaSsrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV9jb252ZXJ0X21jX3Jl Z190YWJsZV9lbnRyeV90b19zbWMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJCQkg Y29uc3QgdTMyIG1lbW9yeV9jbG9jaywKLQkJCQkJCSBTTVU3X0Rpc2NyZXRlX01DUmVnaXN0ZXJT ZXQgKm1jX3JlZ190YWJsZV9kYXRhKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNp X2dldF9waShhZGV2KTsKLQl1MzIgaSA9IDA7Ci0KLQlmb3IoaSA9IDA7IGkgPCBwaS0+bWNfcmVn X3RhYmxlLm51bV9lbnRyaWVzOyBpKyspIHsKLQkJaWYgKG1lbW9yeV9jbG9jayA8PSBwaS0+bWNf cmVnX3RhYmxlLm1jX3JlZ190YWJsZV9lbnRyeVtpXS5tY2xrX21heCkKLQkJCWJyZWFrOwotCX0K LQotCWlmICgoaSA9PSBwaS0+bWNfcmVnX3RhYmxlLm51bV9lbnRyaWVzKSAmJiAoaSA+IDApKQot CQktLWk7Ci0KLQljaV9jb252ZXJ0X21jX3JlZ2lzdGVycygmcGktPm1jX3JlZ190YWJsZS5tY19y ZWdfdGFibGVfZW50cnlbaV0sCi0JCQkJbWNfcmVnX3RhYmxlX2RhdGEsIHBpLT5tY19yZWdfdGFi bGUubGFzdCwKLQkJCQlwaS0+bWNfcmVnX3RhYmxlLnZhbGlkX2ZsYWcpOwotfQotCi1zdGF0aWMg dm9pZCBjaV9jb252ZXJ0X21jX3JlZ190YWJsZV90b19zbWMoc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYsCi0JCQkJCSAgIFNNVTdfRGlzY3JldGVfTUNSZWdpc3RlcnMgKm1jX3JlZ190YWJsZSkK LXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JdTMyIGk7 Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcGktPmRwbV90YWJsZS5tY2xrX3RhYmxlLmNvdW50OyBpKysp Ci0JCWNpX2NvbnZlcnRfbWNfcmVnX3RhYmxlX2VudHJ5X3RvX3NtYyhhZGV2LAotCQkJCQkJICAg ICBwaS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUuZHBtX2xldmVsc1tpXS52YWx1ZSwKLQkJCQkJCSAg ICAgJm1jX3JlZ190YWJsZS0+ZGF0YVtpXSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfcG9wdWxhdGVf aW5pdGlhbF9tY19yZWdfdGFibGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3Ry dWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCWludCByZXQ7Ci0KLQlt ZW1zZXQoJnBpLT5zbWNfbWNfcmVnX3RhYmxlLCAwLCBzaXplb2YoU01VN19EaXNjcmV0ZV9NQ1Jl Z2lzdGVycykpOwotCi0JcmV0ID0gY2lfcG9wdWxhdGVfbWNfcmVnX2FkZHJlc3NlcyhhZGV2LCAm cGktPnNtY19tY19yZWdfdGFibGUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0JY2lfY29u dmVydF9tY19yZWdfdGFibGVfdG9fc21jKGFkZXYsICZwaS0+c21jX21jX3JlZ190YWJsZSk7Ci0K LQlyZXR1cm4gYW1kZ3B1X2NpX2NvcHlfYnl0ZXNfdG9fc21jKGFkZXYsCi0JCQkJICAgIHBpLT5t Y19yZWdfdGFibGVfc3RhcnQsCi0JCQkJICAgICh1OCAqKSZwaS0+c21jX21jX3JlZ190YWJsZSwK LQkJCQkgICAgc2l6ZW9mKFNNVTdfRGlzY3JldGVfTUNSZWdpc3RlcnMpLAotCQkJCSAgICBwaS0+ c3JhbV9lbmQpOwotfQotCi1zdGF0aWMgaW50IGNpX3VwZGF0ZV9hbmRfdXBsb2FkX21jX3JlZ190 YWJsZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5m byAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0KLQlpZiAoIShwaS0+bmVlZF91cGRhdGVfc211N19k cG1fdGFibGUgJiBEUE1UQUJMRV9PRF9VUERBVEVfTUNMSykpCi0JCXJldHVybiAwOwotCi0JbWVt c2V0KCZwaS0+c21jX21jX3JlZ190YWJsZSwgMCwgc2l6ZW9mKFNNVTdfRGlzY3JldGVfTUNSZWdp c3RlcnMpKTsKLQotCWNpX2NvbnZlcnRfbWNfcmVnX3RhYmxlX3RvX3NtYyhhZGV2LCAmcGktPnNt Y19tY19yZWdfdGFibGUpOwotCi0JcmV0dXJuIGFtZGdwdV9jaV9jb3B5X2J5dGVzX3RvX3NtYyhh ZGV2LAotCQkJCSAgICBwaS0+bWNfcmVnX3RhYmxlX3N0YXJ0ICsKLQkJCQkgICAgb2Zmc2V0b2Yo U01VN19EaXNjcmV0ZV9NQ1JlZ2lzdGVycywgZGF0YVswXSksCi0JCQkJICAgICh1OCAqKSZwaS0+ c21jX21jX3JlZ190YWJsZS5kYXRhWzBdLAotCQkJCSAgICBzaXplb2YoU01VN19EaXNjcmV0ZV9N Q1JlZ2lzdGVyU2V0KSAqCi0JCQkJICAgIHBpLT5kcG1fdGFibGUubWNsa190YWJsZS5jb3VudCwK LQkJCQkgICAgcGktPnNyYW1fZW5kKTsKLX0KLQotc3RhdGljIHZvaWQgY2lfZW5hYmxlX3ZvbHRh Z2VfY29udHJvbChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1MzIgdG1wID0gUlJF RzMyX1NNQyhpeEdFTkVSQUxfUFdSTUdUKTsKLQotCXRtcCB8PSBHRU5FUkFMX1BXUk1HVF9fVk9M VF9QV1JNR1RfRU5fTUFTSzsKLQlXUkVHMzJfU01DKGl4R0VORVJBTF9QV1JNR1QsIHRtcCk7Ci19 Ci0KLXN0YXRpYyBlbnVtIGFtZGdwdV9wY2llX2dlbiBjaV9nZXRfbWF4aW11bV9saW5rX3NwZWVk KHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCQkJICAgICAgc3RydWN0IGFtZGdwdV9w cyAqYW1kZ3B1X3N0YXRlKQotewotCXN0cnVjdCBjaV9wcyAqc3RhdGUgPSBjaV9nZXRfcHMoYW1k Z3B1X3N0YXRlKTsKLQlpbnQgaTsKLQl1MTYgcGNpZV9zcGVlZCwgbWF4X3NwZWVkID0gMDsKLQot CWZvciAoaSA9IDA7IGkgPCBzdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQ7IGkrKykgewot CQlwY2llX3NwZWVkID0gc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsc1tpXS5wY2llX2dlbjsKLQkJ aWYgKG1heF9zcGVlZCA8IHBjaWVfc3BlZWQpCi0JCQltYXhfc3BlZWQgPSBwY2llX3NwZWVkOwot CX0KLQotCXJldHVybiBtYXhfc3BlZWQ7Ci19Ci0KLXN0YXRpYyB1MTYgY2lfZ2V0X2N1cnJlbnRf cGNpZV9zcGVlZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1MzIgc3BlZWRfY250 bCA9IDA7Ci0KLQlzcGVlZF9jbnRsID0gUlJFRzMyX1BDSUUoaXhQQ0lFX0xDX1NQRUVEX0NOVEwp ICYKLQkJUENJRV9MQ19TUEVFRF9DTlRMX19MQ19DVVJSRU5UX0RBVEFfUkFURV9NQVNLOwotCXNw ZWVkX2NudGwgPj49IFBDSUVfTENfU1BFRURfQ05UTF9fTENfQ1VSUkVOVF9EQVRBX1JBVEVfX1NI SUZUOwotCi0JcmV0dXJuICh1MTYpc3BlZWRfY250bDsKLX0KLQotc3RhdGljIGludCBjaV9nZXRf Y3VycmVudF9wY2llX2xhbmVfbnVtYmVyKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewot CXUzMiBsaW5rX3dpZHRoID0gMDsKLQotCWxpbmtfd2lkdGggPSBSUkVHMzJfUENJRShpeFBDSUVf TENfTElOS19XSURUSF9DTlRMKSAmCi0JCVBDSUVfTENfTElOS19XSURUSF9DTlRMX19MQ19MSU5L X1dJRFRIX1JEX01BU0s7Ci0JbGlua193aWR0aCA+Pj0gUENJRV9MQ19MSU5LX1dJRFRIX0NOVExf X0xDX0xJTktfV0lEVEhfUkRfX1NISUZUOwotCi0Jc3dpdGNoIChsaW5rX3dpZHRoKSB7Ci0JY2Fz ZSAxOgotCQlyZXR1cm4gMTsKLQljYXNlIDI6Ci0JCXJldHVybiAyOwotCWNhc2UgMzoKLQkJcmV0 dXJuIDQ7Ci0JY2FzZSA0OgotCQlyZXR1cm4gODsKLQljYXNlIDA6Ci0JY2FzZSA2OgotCWRlZmF1 bHQ6Ci0JCXJldHVybiAxNjsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX3JlcXVlc3RfbGlua19z cGVlZF9jaGFuZ2VfYmVmb3JlX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRl diwKLQkJCQkJCQkgICAgIHN0cnVjdCBhbWRncHVfcHMgKmFtZGdwdV9uZXdfc3RhdGUsCi0JCQkJ CQkJICAgICBzdHJ1Y3QgYW1kZ3B1X3BzICphbWRncHVfY3VycmVudF9zdGF0ZSkKLXsKLQlzdHJ1 Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0JZW51bSBhbWRncHVfcGNp ZV9nZW4gdGFyZ2V0X2xpbmtfc3BlZWQgPQotCQljaV9nZXRfbWF4aW11bV9saW5rX3NwZWVkKGFk ZXYsIGFtZGdwdV9uZXdfc3RhdGUpOwotCWVudW0gYW1kZ3B1X3BjaWVfZ2VuIGN1cnJlbnRfbGlu a19zcGVlZDsKLQotCWlmIChwaS0+Zm9yY2VfcGNpZV9nZW4gPT0gQU1ER1BVX1BDSUVfR0VOX0lO VkFMSUQpCi0JCWN1cnJlbnRfbGlua19zcGVlZCA9IGNpX2dldF9tYXhpbXVtX2xpbmtfc3BlZWQo YWRldiwgYW1kZ3B1X2N1cnJlbnRfc3RhdGUpOwotCWVsc2UKLQkJY3VycmVudF9saW5rX3NwZWVk ID0gcGktPmZvcmNlX3BjaWVfZ2VuOwotCi0JcGktPmZvcmNlX3BjaWVfZ2VuID0gQU1ER1BVX1BD SUVfR0VOX0lOVkFMSUQ7Ci0JcGktPnBzcHBfbm90aWZ5X3JlcXVpcmVkID0gZmFsc2U7Ci0JaWYg KHRhcmdldF9saW5rX3NwZWVkID4gY3VycmVudF9saW5rX3NwZWVkKSB7Ci0JCXN3aXRjaCAodGFy Z2V0X2xpbmtfc3BlZWQpIHsKLSNpZmRlZiBDT05GSUdfQUNQSQotCQljYXNlIEFNREdQVV9QQ0lF X0dFTjM6Ci0JCQlpZiAoYW1kZ3B1X2FjcGlfcGNpZV9wZXJmb3JtYW5jZV9yZXF1ZXN0KGFkZXYs IFBDSUVfUEVSRl9SRVFfUEVDSV9HRU4zLCBmYWxzZSkgPT0gMCkKLQkJCQlicmVhazsKLQkJCXBp LT5mb3JjZV9wY2llX2dlbiA9IEFNREdQVV9QQ0lFX0dFTjI7Ci0JCQlpZiAoY3VycmVudF9saW5r X3NwZWVkID09IEFNREdQVV9QQ0lFX0dFTjIpCi0JCQkJYnJlYWs7Ci0JCWNhc2UgQU1ER1BVX1BD SUVfR0VOMjoKLQkJCWlmIChhbWRncHVfYWNwaV9wY2llX3BlcmZvcm1hbmNlX3JlcXVlc3QoYWRl diwgUENJRV9QRVJGX1JFUV9QRUNJX0dFTjIsIGZhbHNlKSA9PSAwKQotCQkJCWJyZWFrOwotI2Vu ZGlmCi0JCWRlZmF1bHQ6Ci0JCQlwaS0+Zm9yY2VfcGNpZV9nZW4gPSBjaV9nZXRfY3VycmVudF9w Y2llX3NwZWVkKGFkZXYpOwotCQkJYnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAodGFyZ2V0 X2xpbmtfc3BlZWQgPCBjdXJyZW50X2xpbmtfc3BlZWQpCi0JCQlwaS0+cHNwcF9ub3RpZnlfcmVx dWlyZWQgPSB0cnVlOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2lfbm90aWZ5X2xpbmtfc3BlZWRf Y2hhbmdlX2FmdGVyX3N0YXRlX2NoYW5nZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJ CQkJCQkgICBzdHJ1Y3QgYW1kZ3B1X3BzICphbWRncHVfbmV3X3N0YXRlLAotCQkJCQkJCSAgIHN0 cnVjdCBhbWRncHVfcHMgKmFtZGdwdV9jdXJyZW50X3N0YXRlKQotewotCXN0cnVjdCBjaV9wb3dl cl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQllbnVtIGFtZGdwdV9wY2llX2dlbiB0YXJn ZXRfbGlua19zcGVlZCA9Ci0JCWNpX2dldF9tYXhpbXVtX2xpbmtfc3BlZWQoYWRldiwgYW1kZ3B1 X25ld19zdGF0ZSk7Ci0JdTggcmVxdWVzdDsKLQotCWlmIChwaS0+cHNwcF9ub3RpZnlfcmVxdWly ZWQpIHsKLQkJaWYgKHRhcmdldF9saW5rX3NwZWVkID09IEFNREdQVV9QQ0lFX0dFTjMpCi0JCQly ZXF1ZXN0ID0gUENJRV9QRVJGX1JFUV9QRUNJX0dFTjM7Ci0JCWVsc2UgaWYgKHRhcmdldF9saW5r X3NwZWVkID09IEFNREdQVV9QQ0lFX0dFTjIpCi0JCQlyZXF1ZXN0ID0gUENJRV9QRVJGX1JFUV9Q RUNJX0dFTjI7Ci0JCWVsc2UKLQkJCXJlcXVlc3QgPSBQQ0lFX1BFUkZfUkVRX1BFQ0lfR0VOMTsK LQotCQlpZiAoKHJlcXVlc3QgPT0gUENJRV9QRVJGX1JFUV9QRUNJX0dFTjEpICYmCi0JCSAgICAo Y2lfZ2V0X2N1cnJlbnRfcGNpZV9zcGVlZChhZGV2KSA+IDApKQotCQkJcmV0dXJuOwotCi0jaWZk ZWYgQ09ORklHX0FDUEkKLQkJYW1kZ3B1X2FjcGlfcGNpZV9wZXJmb3JtYW5jZV9yZXF1ZXN0KGFk ZXYsIHJlcXVlc3QsIGZhbHNlKTsKLSNlbmRpZgotCX0KLX0KLQotc3RhdGljIGludCBjaV9zZXRf cHJpdmF0ZV9kYXRhX3ZhcmlhYmxlc19iYXNlZF9vbl9wcHRhYmxlKHN0cnVjdCBhbWRncHVfZGV2 aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2 KTsKLQlzdHJ1Y3QgYW1kZ3B1X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqYWxsb3dl ZF9zY2xrX3ZkZGNfdGFibGUgPQotCQkmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVu ZGVuY3lfb25fc2NsazsKLQlzdHJ1Y3QgYW1kZ3B1X2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90 YWJsZSAqYWxsb3dlZF9tY2xrX3ZkZGNfdGFibGUgPQotCQkmYWRldi0+cG0uZHBtLmR5bl9zdGF0 ZS52ZGRjX2RlcGVuZGVuY3lfb25fbWNsazsKLQlzdHJ1Y3QgYW1kZ3B1X2Nsb2NrX3ZvbHRhZ2Vf ZGVwZW5kZW5jeV90YWJsZSAqYWxsb3dlZF9tY2xrX3ZkZGNpX3RhYmxlID0KLQkJJmFkZXYtPnBt LmRwbS5keW5fc3RhdGUudmRkY2lfZGVwZW5kZW5jeV9vbl9tY2xrOwotCi0JaWYgKGFsbG93ZWRf c2Nsa192ZGRjX3RhYmxlID09IE5VTEwpCi0JCXJldHVybiAtRUlOVkFMOwotCWlmIChhbGxvd2Vk X3NjbGtfdmRkY190YWJsZS0+Y291bnQgPCAxKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoYWxs b3dlZF9tY2xrX3ZkZGNfdGFibGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGFs bG93ZWRfbWNsa192ZGRjX3RhYmxlLT5jb3VudCA8IDEpCi0JCXJldHVybiAtRUlOVkFMOwotCWlm IChhbGxvd2VkX21jbGtfdmRkY2lfdGFibGUgPT0gTlVMTCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0J aWYgKGFsbG93ZWRfbWNsa192ZGRjaV90YWJsZS0+Y291bnQgPCAxKQotCQlyZXR1cm4gLUVJTlZB TDsKLQotCXBpLT5taW5fdmRkY19pbl9wcF90YWJsZSA9IGFsbG93ZWRfc2Nsa192ZGRjX3RhYmxl LT5lbnRyaWVzWzBdLnY7Ci0JcGktPm1heF92ZGRjX2luX3BwX3RhYmxlID0KLQkJYWxsb3dlZF9z Y2xrX3ZkZGNfdGFibGUtPmVudHJpZXNbYWxsb3dlZF9zY2xrX3ZkZGNfdGFibGUtPmNvdW50IC0g MV0udjsKLQotCXBpLT5taW5fdmRkY2lfaW5fcHBfdGFibGUgPSBhbGxvd2VkX21jbGtfdmRkY2lf dGFibGUtPmVudHJpZXNbMF0udjsKLQlwaS0+bWF4X3ZkZGNpX2luX3BwX3RhYmxlID0KLQkJYWxs b3dlZF9tY2xrX3ZkZGNpX3RhYmxlLT5lbnRyaWVzW2FsbG93ZWRfbWNsa192ZGRjaV90YWJsZS0+ Y291bnQgLSAxXS52OwotCi0JYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFn ZV9vbl9hYy5zY2xrID0KLQkJYWxsb3dlZF9zY2xrX3ZkZGNfdGFibGUtPmVudHJpZXNbYWxsb3dl ZF9zY2xrX3ZkZGNfdGFibGUtPmNvdW50IC0gMV0uY2xrOwotCWFkZXYtPnBtLmRwbS5keW5fc3Rh dGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fYWMubWNsayA9Ci0JCWFsbG93ZWRfbWNsa192ZGRjX3Rh YmxlLT5lbnRyaWVzW2FsbG93ZWRfc2Nsa192ZGRjX3RhYmxlLT5jb3VudCAtIDFdLmNsazsKLQlh ZGV2LT5wbS5kcG0uZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2FjLnZkZGMgPQotCQlh bGxvd2VkX3NjbGtfdmRkY190YWJsZS0+ZW50cmllc1thbGxvd2VkX3NjbGtfdmRkY190YWJsZS0+ Y291bnQgLSAxXS52OwotCWFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vf b25fYWMudmRkY2kgPQotCQlhbGxvd2VkX21jbGtfdmRkY2lfdGFibGUtPmVudHJpZXNbYWxsb3dl ZF9tY2xrX3ZkZGNpX3RhYmxlLT5jb3VudCAtIDFdLnY7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3Rh dGljIHZvaWQgY2lfcGF0Y2hfd2l0aF92ZGRjX2xlYWthZ2Uoc3RydWN0IGFtZGdwdV9kZXZpY2Ug KmFkZXYsIHUxNiAqdmRkYykKLXsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRf cGkoYWRldik7Ci0Jc3RydWN0IGNpX2xlYWthZ2Vfdm9sdGFnZSAqbGVha2FnZV90YWJsZSA9ICZw aS0+dmRkY19sZWFrYWdlOwotCXUzMiBsZWFrYWdlX2luZGV4OwotCi0JZm9yIChsZWFrYWdlX2lu ZGV4ID0gMDsgbGVha2FnZV9pbmRleCA8IGxlYWthZ2VfdGFibGUtPmNvdW50OyBsZWFrYWdlX2lu ZGV4KyspIHsKLQkJaWYgKGxlYWthZ2VfdGFibGUtPmxlYWthZ2VfaWRbbGVha2FnZV9pbmRleF0g PT0gKnZkZGMpIHsKLQkJCSp2ZGRjID0gbGVha2FnZV90YWJsZS0+YWN0dWFsX3ZvbHRhZ2VbbGVh a2FnZV9pbmRleF07Ci0JCQlicmVhazsKLQkJfQotCX0KLX0KLQotc3RhdGljIHZvaWQgY2lfcGF0 Y2hfd2l0aF92ZGRjaV9sZWFrYWdlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCB1MTYgKnZk ZGNpKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlz dHJ1Y3QgY2lfbGVha2FnZV92b2x0YWdlICpsZWFrYWdlX3RhYmxlID0gJnBpLT52ZGRjaV9sZWFr YWdlOwotCXUzMiBsZWFrYWdlX2luZGV4OwotCi0JZm9yIChsZWFrYWdlX2luZGV4ID0gMDsgbGVh a2FnZV9pbmRleCA8IGxlYWthZ2VfdGFibGUtPmNvdW50OyBsZWFrYWdlX2luZGV4KyspIHsKLQkJ aWYgKGxlYWthZ2VfdGFibGUtPmxlYWthZ2VfaWRbbGVha2FnZV9pbmRleF0gPT0gKnZkZGNpKSB7 Ci0JCQkqdmRkY2kgPSBsZWFrYWdlX3RhYmxlLT5hY3R1YWxfdm9sdGFnZVtsZWFrYWdlX2luZGV4 XTsKLQkJCWJyZWFrOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV9wYXRjaF9jbG9ja192 b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVfd2l0aF92ZGRjX2xlYWthZ2Uoc3RydWN0IGFtZGdwdV9k ZXZpY2UgKmFkZXYsCi0JCQkJCQkJCSAgICAgIHN0cnVjdCBhbWRncHVfY2xvY2tfdm9sdGFnZV9k ZXBlbmRlbmN5X3RhYmxlICp0YWJsZSkKLXsKLQl1MzIgaTsKLQotCWlmICh0YWJsZSkgewotCQlm b3IgKGkgPSAwOyBpIDwgdGFibGUtPmNvdW50OyBpKyspCi0JCQljaV9wYXRjaF93aXRoX3ZkZGNf bGVha2FnZShhZGV2LCAmdGFibGUtPmVudHJpZXNbaV0udik7Ci0JfQotfQotCi1zdGF0aWMgdm9p ZCBjaV9wYXRjaF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVfd2l0aF92ZGRjaV9sZWFr YWdlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCQkJCQkgICAgICAgc3RydWN0IGFt ZGdwdV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGUgKnRhYmxlKQotewotCXUzMiBpOwot Ci0JaWYgKHRhYmxlKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCB0YWJsZS0+Y291bnQ7IGkrKykKLQkJ CWNpX3BhdGNoX3dpdGhfdmRkY2lfbGVha2FnZShhZGV2LCAmdGFibGUtPmVudHJpZXNbaV0udik7 Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV9wYXRjaF92Y2VfY2xvY2tfdm9sdGFnZV9kZXBlbmRl bmN5X3RhYmxlX3dpdGhfdmRkY19sZWFrYWdlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAot CQkJCQkJCQkJICBzdHJ1Y3QgYW1kZ3B1X3ZjZV9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFi bGUgKnRhYmxlKQotewotCXUzMiBpOwotCi0JaWYgKHRhYmxlKSB7Ci0JCWZvciAoaSA9IDA7IGkg PCB0YWJsZS0+Y291bnQ7IGkrKykKLQkJCWNpX3BhdGNoX3dpdGhfdmRkY19sZWFrYWdlKGFkZXYs ICZ0YWJsZS0+ZW50cmllc1tpXS52KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX3BhdGNoX3V2 ZF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVfd2l0aF92ZGRjX2xlYWthZ2Uoc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJCQkJCQkgIHN0cnVjdCBhbWRncHVfdXZkX2Nsb2Nr X3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSAqdGFibGUpCi17Ci0JdTMyIGk7Ci0KLQlpZiAodGFi bGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRhYmxlLT5jb3VudDsgaSsrKQotCQkJY2lfcGF0Y2hf d2l0aF92ZGRjX2xlYWthZ2UoYWRldiwgJnRhYmxlLT5lbnRyaWVzW2ldLnYpOwotCX0KLX0KLQot c3RhdGljIHZvaWQgY2lfcGF0Y2hfdmRkY19waGFzZV9zaGVkX2xpbWl0X3RhYmxlX3dpdGhfdmRk Y19sZWFrYWdlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCQkJCQkgICBzdHJ1Y3Qg YW1kZ3B1X3BoYXNlX3NoZWRkaW5nX2xpbWl0c190YWJsZSAqdGFibGUpCi17Ci0JdTMyIGk7Ci0K LQlpZiAodGFibGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRhYmxlLT5jb3VudDsgaSsrKQotCQkJ Y2lfcGF0Y2hfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwgJnRhYmxlLT5lbnRyaWVzW2ldLnZvbHRh Z2UpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2lfcGF0Y2hfY2xvY2tfdm9sdGFnZV9saW1pdHNf d2l0aF92ZGRjX2xlYWthZ2Uoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJCQkJICAg IHN0cnVjdCBhbWRncHVfY2xvY2tfYW5kX3ZvbHRhZ2VfbGltaXRzICp0YWJsZSkKLXsKLQlpZiAo dGFibGUpIHsKLQkJY2lfcGF0Y2hfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwgKHUxNiAqKSZ0YWJs ZS0+dmRkYyk7Ci0JCWNpX3BhdGNoX3dpdGhfdmRkY2lfbGVha2FnZShhZGV2LCAodTE2ICopJnRh YmxlLT52ZGRjaSk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBjaV9wYXRjaF9jYWNfbGVha2FnZV90 YWJsZV93aXRoX3ZkZGNfbGVha2FnZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJ CQkgc3RydWN0IGFtZGdwdV9jYWNfbGVha2FnZV90YWJsZSAqdGFibGUpCi17Ci0JdTMyIGk7Ci0K LQlpZiAodGFibGUpIHsKLQkJZm9yIChpID0gMDsgaSA8IHRhYmxlLT5jb3VudDsgaSsrKQotCQkJ Y2lfcGF0Y2hfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwgJnRhYmxlLT5lbnRyaWVzW2ldLnZkZGMp OwotCX0KLX0KLQotc3RhdGljIHZvaWQgY2lfcGF0Y2hfZGVwZW5kZW5jeV90YWJsZXNfd2l0aF9s ZWFrYWdlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCi0JY2lfcGF0Y2hfY2xvY2tf dm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlX3dpdGhfdmRkY19sZWFrYWdlKGFkZXYsCi0JCQkJCQkJ CSAgJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29uX3NjbGspOwotCWNp X3BhdGNoX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZV93aXRoX3ZkZGNfbGVha2FnZShh ZGV2LAotCQkJCQkJCQkgICZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9v bl9tY2xrKTsKLQljaV9wYXRjaF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVfd2l0aF92 ZGRjX2xlYWthZ2UoYWRldiwKLQkJCQkJCQkJICAmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRj X2RlcGVuZGVuY3lfb25fZGlzcGNsayk7Ci0JY2lfcGF0Y2hfY2xvY2tfdm9sdGFnZV9kZXBlbmRl bmN5X3RhYmxlX3dpdGhfdmRkY2lfbGVha2FnZShhZGV2LAotCQkJCQkJCQkgICAmYWRldi0+cG0u ZHBtLmR5bl9zdGF0ZS52ZGRjaV9kZXBlbmRlbmN5X29uX21jbGspOwotCWNpX3BhdGNoX3ZjZV9j bG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwKLQkJ CQkJCQkJICAgICAgJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUudmNlX2Nsb2NrX3ZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZSk7Ci0JY2lfcGF0Y2hfdXZkX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90 YWJsZV93aXRoX3ZkZGNfbGVha2FnZShhZGV2LAotCQkJCQkJCQkgICAgICAmYWRldi0+cG0uZHBt LmR5bl9zdGF0ZS51dmRfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxlKTsKLQljaV9wYXRj aF9jbG9ja192b2x0YWdlX2RlcGVuZGVuY3lfdGFibGVfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwK LQkJCQkJCQkJICAmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5zYW11X2Nsb2NrX3ZvbHRhZ2VfZGVw ZW5kZW5jeV90YWJsZSk7Ci0JY2lfcGF0Y2hfY2xvY2tfdm9sdGFnZV9kZXBlbmRlbmN5X3RhYmxl X3dpdGhfdmRkY19sZWFrYWdlKGFkZXYsCi0JCQkJCQkJCSAgJmFkZXYtPnBtLmRwbS5keW5fc3Rh dGUuYWNwX2Nsb2NrX3ZvbHRhZ2VfZGVwZW5kZW5jeV90YWJsZSk7Ci0JY2lfcGF0Y2hfdmRkY19w aGFzZV9zaGVkX2xpbWl0X3RhYmxlX3dpdGhfdmRkY19sZWFrYWdlKGFkZXYsCi0JCQkJCQkJICAg ICAgICZhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnBoYXNlX3NoZWRkaW5nX2xpbWl0c190YWJsZSk7 Ci0JY2lfcGF0Y2hfY2xvY2tfdm9sdGFnZV9saW1pdHNfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwK LQkJCQkJCQkmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9hYyk7 Ci0JY2lfcGF0Y2hfY2xvY2tfdm9sdGFnZV9saW1pdHNfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwK LQkJCQkJCQkmYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9vbl9kYyk7 Ci0JY2lfcGF0Y2hfY2FjX2xlYWthZ2VfdGFibGVfd2l0aF92ZGRjX2xlYWthZ2UoYWRldiwKLQkJ CQkJCSAgICAgJmFkZXYtPnBtLmRwbS5keW5fc3RhdGUuY2FjX2xlYWthZ2VfdGFibGUpOwotCi19 Ci0KLXN0YXRpYyB2b2lkIGNpX3VwZGF0ZV9jdXJyZW50X3BzKHN0cnVjdCBhbWRncHVfZGV2aWNl ICphZGV2LAotCQkJCSBzdHJ1Y3QgYW1kZ3B1X3BzICpycHMpCi17Ci0Jc3RydWN0IGNpX3BzICpu ZXdfcHMgPSBjaV9nZXRfcHMocnBzKTsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9n ZXRfcGkoYWRldik7Ci0KLQlwaS0+Y3VycmVudF9ycHMgPSAqcnBzOwotCXBpLT5jdXJyZW50X3Bz ID0gKm5ld19wczsKLQlwaS0+Y3VycmVudF9ycHMucHNfcHJpdiA9ICZwaS0+Y3VycmVudF9wczsK LQlhZGV2LT5wbS5kcG0uY3VycmVudF9wcyA9ICZwaS0+Y3VycmVudF9ycHM7Ci19Ci0KLXN0YXRp YyB2b2lkIGNpX3VwZGF0ZV9yZXF1ZXN0ZWRfcHMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYs Ci0JCQkJICAgc3RydWN0IGFtZGdwdV9wcyAqcnBzKQotewotCXN0cnVjdCBjaV9wcyAqbmV3X3Bz ID0gY2lfZ2V0X3BzKHJwcyk7Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3Bp KGFkZXYpOwotCi0JcGktPnJlcXVlc3RlZF9ycHMgPSAqcnBzOwotCXBpLT5yZXF1ZXN0ZWRfcHMg PSAqbmV3X3BzOwotCXBpLT5yZXF1ZXN0ZWRfcnBzLnBzX3ByaXYgPSAmcGktPnJlcXVlc3RlZF9w czsKLQlhZGV2LT5wbS5kcG0ucmVxdWVzdGVkX3BzID0gJnBpLT5yZXF1ZXN0ZWRfcnBzOwotfQot Ci1zdGF0aWMgaW50IGNpX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlKHZvaWQgKmhhbmRsZSkKLXsK LQlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhh bmRsZTsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3Ry dWN0IGFtZGdwdV9wcyByZXF1ZXN0ZWRfcHMgPSAqYWRldi0+cG0uZHBtLnJlcXVlc3RlZF9wczsK LQlzdHJ1Y3QgYW1kZ3B1X3BzICpuZXdfcHMgPSAmcmVxdWVzdGVkX3BzOwotCi0JY2lfdXBkYXRl X3JlcXVlc3RlZF9wcyhhZGV2LCBuZXdfcHMpOwotCi0JY2lfYXBwbHlfc3RhdGVfYWRqdXN0X3J1 bGVzKGFkZXYsICZwaS0+cmVxdWVzdGVkX3Jwcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IHZvaWQgY2lfZHBtX3Bvc3Rfc2V0X3Bvd2VyX3N0YXRlKHZvaWQgKmhhbmRsZSkKLXsKLQlzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsK LQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0IGFt ZGdwdV9wcyAqbmV3X3BzID0gJnBpLT5yZXF1ZXN0ZWRfcnBzOwotCi0JY2lfdXBkYXRlX2N1cnJl bnRfcHMoYWRldiwgbmV3X3BzKTsKLX0KLQotCi1zdGF0aWMgdm9pZCBjaV9kcG1fc2V0dXBfYXNp YyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQljaV9yZWFkX2Nsb2NrX3JlZ2lzdGVy cyhhZGV2KTsKLQljaV9lbmFibGVfYWNwaV9wb3dlcl9tYW5hZ2VtZW50KGFkZXYpOwotCWNpX2lu aXRfc2Nsa190KGFkZXYpOwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV9lbmFibGUoc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0 X3BpKGFkZXYpOwotCXN0cnVjdCBhbWRncHVfcHMgKmJvb3RfcHMgPSBhZGV2LT5wbS5kcG0uYm9v dF9wczsKLQlpbnQgcmV0OwotCi0JaWYgKHBpLT52b2x0YWdlX2NvbnRyb2wgIT0gQ0lTTEFORFNf Vk9MVEFHRV9DT05UUk9MX05PTkUpIHsKLQkJY2lfZW5hYmxlX3ZvbHRhZ2VfY29udHJvbChhZGV2 KTsKLQkJcmV0ID0gY2lfY29uc3RydWN0X3ZvbHRhZ2VfdGFibGVzKGFkZXYpOwotCQlpZiAocmV0 KSB7Ci0JCQlEUk1fRVJST1IoImNpX2NvbnN0cnVjdF92b2x0YWdlX3RhYmxlcyBmYWlsZWRcbiIp OwotCQkJcmV0dXJuIHJldDsKLQkJfQotCX0KLQlpZiAocGktPmNhcHNfZHluYW1pY19hY190aW1p bmcpIHsKLQkJcmV0ID0gY2lfaW5pdGlhbGl6ZV9tY19yZWdfdGFibGUoYWRldik7Ci0JCWlmIChy ZXQpCi0JCQlwaS0+Y2Fwc19keW5hbWljX2FjX3RpbWluZyA9IGZhbHNlOwotCX0KLQlpZiAocGkt PmR5bmFtaWNfc3MpCi0JCWNpX2VuYWJsZV9zcHJlYWRfc3BlY3RydW0oYWRldiwgdHJ1ZSk7Ci0J aWYgKHBpLT50aGVybWFsX3Byb3RlY3Rpb24pCi0JCWNpX2VuYWJsZV90aGVybWFsX3Byb3RlY3Rp b24oYWRldiwgdHJ1ZSk7Ci0JY2lfcHJvZ3JhbV9zc3RwKGFkZXYpOwotCWNpX2VuYWJsZV9kaXNw bGF5X2dhcChhZGV2KTsKLQljaV9wcm9ncmFtX3ZjKGFkZXYpOwotCXJldCA9IGNpX3VwbG9hZF9m aXJtd2FyZShhZGV2KTsKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiY2lfdXBsb2FkX2Zpcm13 YXJlIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGNpX3Byb2Nlc3NfZmly bXdhcmVfaGVhZGVyKGFkZXYpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJjaV9wcm9jZXNz X2Zpcm13YXJlX2hlYWRlciBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBj aV9pbml0aWFsX3N3aXRjaF9mcm9tX2FyYl9mMF90b19mMShhZGV2KTsKLQlpZiAocmV0KSB7Ci0J CURSTV9FUlJPUigiY2lfaW5pdGlhbF9zd2l0Y2hfZnJvbV9hcmJfZjBfdG9fZjEgZmFpbGVkXG4i KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0ID0gY2lfaW5pdF9zbWNfdGFibGUoYWRldik7Ci0J aWYgKHJldCkgewotCQlEUk1fRVJST1IoImNpX2luaXRfc21jX3RhYmxlIGZhaWxlZFxuIik7Ci0J CXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGNpX2luaXRfYXJiX3RhYmxlX2luZGV4KGFkZXYpOwot CWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJjaV9pbml0X2FyYl90YWJsZV9pbmRleCBmYWlsZWRc biIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAocGktPmNhcHNfZHluYW1pY19hY190aW1pbmcp IHsKLQkJcmV0ID0gY2lfcG9wdWxhdGVfaW5pdGlhbF9tY19yZWdfdGFibGUoYWRldik7Ci0JCWlm IChyZXQpIHsKLQkJCURSTV9FUlJPUigiY2lfcG9wdWxhdGVfaW5pdGlhbF9tY19yZWdfdGFibGUg ZmFpbGVkXG4iKTsKLQkJCXJldHVybiByZXQ7Ci0JCX0KLQl9Ci0JcmV0ID0gY2lfcG9wdWxhdGVf cG1fYmFzZShhZGV2KTsKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiY2lfcG9wdWxhdGVfcG1f YmFzZSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQljaV9kcG1fc3RhcnRfc21jKGFk ZXYpOwotCWNpX2VuYWJsZV92cl9ob3RfZ3Bpb19pbnRlcnJ1cHQoYWRldik7Ci0JcmV0ID0gY2lf bm90aWZ5X3NtY19kaXNwbGF5X2NoYW5nZShhZGV2LCBmYWxzZSk7Ci0JaWYgKHJldCkgewotCQlE Uk1fRVJST1IoImNpX25vdGlmeV9zbWNfZGlzcGxheV9jaGFuZ2UgZmFpbGVkXG4iKTsKLQkJcmV0 dXJuIHJldDsKLQl9Ci0JY2lfZW5hYmxlX3NjbGtfY29udHJvbChhZGV2LCB0cnVlKTsKLQlyZXQg PSBjaV9lbmFibGVfdWx2KGFkZXYsIHRydWUpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJj aV9lbmFibGVfdWx2IGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGNpX2Vu YWJsZV9kc19tYXN0ZXJfc3dpdGNoKGFkZXYsIHRydWUpOwotCWlmIChyZXQpIHsKLQkJRFJNX0VS Uk9SKCJjaV9lbmFibGVfZHNfbWFzdGVyX3N3aXRjaCBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0 OwotCX0KLQlyZXQgPSBjaV9zdGFydF9kcG0oYWRldik7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJS T1IoImNpX3N0YXJ0X2RwbSBmYWlsZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBj aV9lbmFibGVfZGlkdChhZGV2LCB0cnVlKTsKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiY2lf ZW5hYmxlX2RpZHQgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0JcmV0ID0gY2lfZW5h YmxlX3NtY19jYWMoYWRldiwgdHJ1ZSk7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImNpX2Vu YWJsZV9zbWNfY2FjIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGNpX2Vu YWJsZV9wb3dlcl9jb250YWlubWVudChhZGV2LCB0cnVlKTsKLQlpZiAocmV0KSB7Ci0JCURSTV9F UlJPUigiY2lfZW5hYmxlX3Bvd2VyX2NvbnRhaW5tZW50IGZhaWxlZFxuIik7Ci0JCXJldHVybiBy ZXQ7Ci0JfQotCi0JcmV0ID0gY2lfcG93ZXJfY29udHJvbF9zZXRfbGV2ZWwoYWRldik7Ci0JaWYg KHJldCkgewotCQlEUk1fRVJST1IoImNpX3Bvd2VyX2NvbnRyb2xfc2V0X2xldmVsIGZhaWxlZFxu Iik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JY2lfZW5hYmxlX2F1dG9fdGhyb3R0bGVfc291cmNl KGFkZXYsIEFNREdQVV9EUE1fQVVUT19USFJPVFRMRV9TUkNfVEhFUk1BTCwgdHJ1ZSk7Ci0KLQly ZXQgPSBjaV9lbmFibGVfdGhlcm1hbF9iYXNlZF9zY2xrX2RwbShhZGV2LCB0cnVlKTsKLQlpZiAo cmV0KSB7Ci0JCURSTV9FUlJPUigiY2lfZW5hYmxlX3RoZXJtYWxfYmFzZWRfc2Nsa19kcG0gZmFp bGVkXG4iKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQljaV90aGVybWFsX3N0YXJ0X3RoZXJtYWxf Y29udHJvbGxlcihhZGV2KTsKLQotCWNpX3VwZGF0ZV9jdXJyZW50X3BzKGFkZXYsIGJvb3RfcHMp OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2RwbV9kaXNhYmxlKHN0cnVjdCBh bWRncHVfZGV2aWNlICphZGV2KQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dl dF9waShhZGV2KTsKLQlzdHJ1Y3QgYW1kZ3B1X3BzICpib290X3BzID0gYWRldi0+cG0uZHBtLmJv b3RfcHM7Ci0KLQlhbWRncHVfaXJxX3B1dChhZGV2LCAmYWRldi0+cG0uZHBtLnRoZXJtYWwuaXJx LAotCQkgICAgICAgQU1ER1BVX1RIRVJNQUxfSVJRX0xPV19UT19ISUdIKTsKLQlhbWRncHVfaXJx X3B1dChhZGV2LCAmYWRldi0+cG0uZHBtLnRoZXJtYWwuaXJxLAotCQkgICAgICAgQU1ER1BVX1RI RVJNQUxfSVJRX0hJR0hfVE9fTE9XKTsKLQotCWNpX2RwbV9wb3dlcmdhdGVfdXZkKGFkZXYsIHRy dWUpOwotCi0JaWYgKCFhbWRncHVfY2lfaXNfc21jX3J1bm5pbmcoYWRldikpCi0JCXJldHVybjsK LQotCWNpX3RoZXJtYWxfc3RvcF90aGVybWFsX2NvbnRyb2xsZXIoYWRldik7Ci0KLQlpZiAocGkt PnRoZXJtYWxfcHJvdGVjdGlvbikKLQkJY2lfZW5hYmxlX3RoZXJtYWxfcHJvdGVjdGlvbihhZGV2 LCBmYWxzZSk7Ci0JY2lfZW5hYmxlX3Bvd2VyX2NvbnRhaW5tZW50KGFkZXYsIGZhbHNlKTsKLQlj aV9lbmFibGVfc21jX2NhYyhhZGV2LCBmYWxzZSk7Ci0JY2lfZW5hYmxlX2RpZHQoYWRldiwgZmFs c2UpOwotCWNpX2VuYWJsZV9zcHJlYWRfc3BlY3RydW0oYWRldiwgZmFsc2UpOwotCWNpX2VuYWJs ZV9hdXRvX3Rocm90dGxlX3NvdXJjZShhZGV2LCBBTURHUFVfRFBNX0FVVE9fVEhST1RUTEVfU1JD X1RIRVJNQUwsIGZhbHNlKTsKLQljaV9zdG9wX2RwbShhZGV2KTsKLQljaV9lbmFibGVfZHNfbWFz dGVyX3N3aXRjaChhZGV2LCBmYWxzZSk7Ci0JY2lfZW5hYmxlX3VsdihhZGV2LCBmYWxzZSk7Ci0J Y2lfY2xlYXJfdmMoYWRldik7Ci0JY2lfcmVzZXRfdG9fZGVmYXVsdChhZGV2KTsKLQljaV9kcG1f c3RvcF9zbWMoYWRldik7Ci0JY2lfZm9yY2Vfc3dpdGNoX3RvX2FyYl9mMChhZGV2KTsKLQljaV9l bmFibGVfdGhlcm1hbF9iYXNlZF9zY2xrX2RwbShhZGV2LCBmYWxzZSk7Ci0KLQljaV91cGRhdGVf Y3VycmVudF9wcyhhZGV2LCBib290X3BzKTsKLX0KLQotc3RhdGljIGludCBjaV9kcG1fc2V0X3Bv d2VyX3N0YXRlKHZvaWQgKmhhbmRsZSkKLXsKLQlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9 IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAq cGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0IGFtZGdwdV9wcyAqbmV3X3BzID0gJnBpLT5y ZXF1ZXN0ZWRfcnBzOwotCXN0cnVjdCBhbWRncHVfcHMgKm9sZF9wcyA9ICZwaS0+Y3VycmVudF9y cHM7Ci0JaW50IHJldDsKLQotCWNpX2ZpbmRfZHBtX3N0YXRlc19jbG9ja3NfaW5fZHBtX3RhYmxl KGFkZXYsIG5ld19wcyk7Ci0JaWYgKHBpLT5wY2llX3BlcmZvcm1hbmNlX3JlcXVlc3QpCi0JCWNp X3JlcXVlc3RfbGlua19zcGVlZF9jaGFuZ2VfYmVmb3JlX3N0YXRlX2NoYW5nZShhZGV2LCBuZXdf cHMsIG9sZF9wcyk7Ci0JcmV0ID0gY2lfZnJlZXplX3NjbGtfbWNsa19kcG0oYWRldik7Ci0JaWYg KHJldCkgewotCQlEUk1fRVJST1IoImNpX2ZyZWV6ZV9zY2xrX21jbGtfZHBtIGZhaWxlZFxuIik7 Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9IGNpX3BvcHVsYXRlX2FuZF91cGxvYWRfc2Nsa19t Y2xrX2RwbV9sZXZlbHMoYWRldiwgbmV3X3BzKTsKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigi Y2lfcG9wdWxhdGVfYW5kX3VwbG9hZF9zY2xrX21jbGtfZHBtX2xldmVscyBmYWlsZWRcbiIpOwot CQlyZXR1cm4gcmV0OwotCX0KLQlyZXQgPSBjaV9nZW5lcmF0ZV9kcG1fbGV2ZWxfZW5hYmxlX21h c2soYWRldiwgbmV3X3BzKTsKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiY2lfZ2VuZXJhdGVf ZHBtX2xldmVsX2VuYWJsZV9tYXNrIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0J cmV0ID0gY2lfdXBkYXRlX3ZjZV9kcG0oYWRldiwgbmV3X3BzLCBvbGRfcHMpOwotCWlmIChyZXQp IHsKLQkJRFJNX0VSUk9SKCJjaV91cGRhdGVfdmNlX2RwbSBmYWlsZWRcbiIpOwotCQlyZXR1cm4g cmV0OwotCX0KLQotCXJldCA9IGNpX3VwZGF0ZV9zY2xrX3QoYWRldik7Ci0JaWYgKHJldCkgewot CQlEUk1fRVJST1IoImNpX3VwZGF0ZV9zY2xrX3QgZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsK LQl9Ci0JaWYgKHBpLT5jYXBzX2R5bmFtaWNfYWNfdGltaW5nKSB7Ci0JCXJldCA9IGNpX3VwZGF0 ZV9hbmRfdXBsb2FkX21jX3JlZ190YWJsZShhZGV2KTsKLQkJaWYgKHJldCkgewotCQkJRFJNX0VS Uk9SKCJjaV91cGRhdGVfYW5kX3VwbG9hZF9tY19yZWdfdGFibGUgZmFpbGVkXG4iKTsKLQkJCXJl dHVybiByZXQ7Ci0JCX0KLQl9Ci0JcmV0ID0gY2lfcHJvZ3JhbV9tZW1vcnlfdGltaW5nX3BhcmFt ZXRlcnMoYWRldik7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoImNpX3Byb2dyYW1fbWVtb3J5 X3RpbWluZ19wYXJhbWV0ZXJzIGZhaWxlZFxuIik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXJldCA9 IGNpX3VuZnJlZXplX3NjbGtfbWNsa19kcG0oYWRldik7Ci0JaWYgKHJldCkgewotCQlEUk1fRVJS T1IoImNpX3VuZnJlZXplX3NjbGtfbWNsa19kcG0gZmFpbGVkXG4iKTsKLQkJcmV0dXJuIHJldDsK LQl9Ci0JcmV0ID0gY2lfdXBsb2FkX2RwbV9sZXZlbF9lbmFibGVfbWFzayhhZGV2KTsKLQlpZiAo cmV0KSB7Ci0JCURSTV9FUlJPUigiY2lfdXBsb2FkX2RwbV9sZXZlbF9lbmFibGVfbWFzayBmYWls ZWRcbiIpOwotCQlyZXR1cm4gcmV0OwotCX0KLQlpZiAocGktPnBjaWVfcGVyZm9ybWFuY2VfcmVx dWVzdCkKLQkJY2lfbm90aWZ5X2xpbmtfc3BlZWRfY2hhbmdlX2FmdGVyX3N0YXRlX2NoYW5nZShh ZGV2LCBuZXdfcHMsIG9sZF9wcyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotI2lmIDAKLXN0YXRpYyB2 b2lkIGNpX2RwbV9yZXNldF9hc2ljKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCWNp X3NldF9ib290X3N0YXRlKGFkZXYpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIGNpX2RwbV9k aXNwbGF5X2NvbmZpZ3VyYXRpb25fY2hhbmdlZCh2b2lkICpoYW5kbGUpCi17Ci0Jc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0KLQlj aV9wcm9ncmFtX2Rpc3BsYXlfZ2FwKGFkZXYpOwotfQotCi11bmlvbiBwb3dlcl9pbmZvIHsKLQlz dHJ1Y3QgX0FUT01fUE9XRVJQTEFZX0lORk8gaW5mbzsKLQlzdHJ1Y3QgX0FUT01fUE9XRVJQTEFZ X0lORk9fVjIgaW5mb18yOwotCXN0cnVjdCBfQVRPTV9QT1dFUlBMQVlfSU5GT19WMyBpbmZvXzM7 Ci0Jc3RydWN0IF9BVE9NX1BQTElCX1BPV0VSUExBWVRBQkxFIHBwbGliOwotCXN0cnVjdCBfQVRP TV9QUExJQl9QT1dFUlBMQVlUQUJMRTIgcHBsaWIyOwotCXN0cnVjdCBfQVRPTV9QUExJQl9QT1dF UlBMQVlUQUJMRTMgcHBsaWIzOwotfTsKLQotdW5pb24gcHBsaWJfY2xvY2tfaW5mbyB7Ci0Jc3Ry dWN0IF9BVE9NX1BQTElCX1I2MDBfQ0xPQ0tfSU5GTyByNjAwOwotCXN0cnVjdCBfQVRPTV9QUExJ Ql9SUzc4MF9DTE9DS19JTkZPIHJzNzgwOwotCXN0cnVjdCBfQVRPTV9QUExJQl9FVkVSR1JFRU5f Q0xPQ0tfSU5GTyBldmVyZ3JlZW47Ci0Jc3RydWN0IF9BVE9NX1BQTElCX1NVTU9fQ0xPQ0tfSU5G TyBzdW1vOwotCXN0cnVjdCBfQVRPTV9QUExJQl9TSV9DTE9DS19JTkZPIHNpOwotCXN0cnVjdCBf QVRPTV9QUExJQl9DSV9DTE9DS19JTkZPIGNpOwotfTsKLQotdW5pb24gcHBsaWJfcG93ZXJfc3Rh dGUgewotCXN0cnVjdCBfQVRPTV9QUExJQl9TVEFURSB2MTsKLQlzdHJ1Y3QgX0FUT01fUFBMSUJf U1RBVEVfVjIgdjI7Ci19OwotCi1zdGF0aWMgdm9pZCBjaV9wYXJzZV9wcGxpYl9ub25fY2xvY2tf aW5mbyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkJICBzdHJ1Y3QgYW1kZ3B1X3Bz ICpycHMsCi0JCQkJCSAgc3RydWN0IF9BVE9NX1BQTElCX05PTkNMT0NLX0lORk8gKm5vbl9jbG9j a19pbmZvLAotCQkJCQkgIHU4IHRhYmxlX3JldikKLXsKLQlycHMtPmNhcHMgPSBsZTMyX3RvX2Nw dShub25fY2xvY2tfaW5mby0+dWxDYXBzQW5kU2V0dGluZ3MpOwotCXJwcy0+Y2xhc3MgPSBsZTE2 X3RvX2NwdShub25fY2xvY2tfaW5mby0+dXNDbGFzc2lmaWNhdGlvbik7Ci0JcnBzLT5jbGFzczIg PSBsZTE2X3RvX2NwdShub25fY2xvY2tfaW5mby0+dXNDbGFzc2lmaWNhdGlvbjIpOwotCi0JaWYg KEFUT01fUFBMSUJfTk9OQ0xPQ0tJTkZPX1ZFUjEgPCB0YWJsZV9yZXYpIHsKLQkJcnBzLT52Y2xr ID0gbGUzMl90b19jcHUobm9uX2Nsb2NrX2luZm8tPnVsVkNMSyk7Ci0JCXJwcy0+ZGNsayA9IGxl MzJfdG9fY3B1KG5vbl9jbG9ja19pbmZvLT51bERDTEspOwotCX0gZWxzZSB7Ci0JCXJwcy0+dmNs ayA9IDA7Ci0JCXJwcy0+ZGNsayA9IDA7Ci0JfQotCi0JaWYgKHJwcy0+Y2xhc3MgJiBBVE9NX1BQ TElCX0NMQVNTSUZJQ0FUSU9OX0JPT1QpCi0JCWFkZXYtPnBtLmRwbS5ib290X3BzID0gcnBzOwot CWlmIChycHMtPmNsYXNzICYgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VVkRTVEFURSkKLQkJ YWRldi0+cG0uZHBtLnV2ZF9wcyA9IHJwczsKLX0KLQotc3RhdGljIHZvaWQgY2lfcGFyc2VfcHBs aWJfY2xvY2tfaW5mbyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCQkgICAgICBzdHJ1 Y3QgYW1kZ3B1X3BzICpycHMsIGludCBpbmRleCwKLQkJCQkgICAgICB1bmlvbiBwcGxpYl9jbG9j a19pbmZvICpjbG9ja19pbmZvKQotewotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dl dF9waShhZGV2KTsKLQlzdHJ1Y3QgY2lfcHMgKnBzID0gY2lfZ2V0X3BzKHJwcyk7Ci0Jc3RydWN0 IGNpX3BsICpwbCA9ICZwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2luZGV4XTsKLQotCXBzLT5wZXJm b3JtYW5jZV9sZXZlbF9jb3VudCA9IGluZGV4ICsgMTsKLQotCXBsLT5zY2xrID0gbGUxNl90b19j cHUoY2xvY2tfaW5mby0+Y2kudXNFbmdpbmVDbG9ja0xvdyk7Ci0JcGwtPnNjbGsgfD0gY2xvY2tf aW5mby0+Y2kudWNFbmdpbmVDbG9ja0hpZ2ggPDwgMTY7Ci0JcGwtPm1jbGsgPSBsZTE2X3RvX2Nw dShjbG9ja19pbmZvLT5jaS51c01lbW9yeUNsb2NrTG93KTsKLQlwbC0+bWNsayB8PSBjbG9ja19p bmZvLT5jaS51Y01lbW9yeUNsb2NrSGlnaCA8PCAxNjsKLQotCXBsLT5wY2llX2dlbiA9IGFtZGdw dV9nZXRfcGNpZV9nZW5fc3VwcG9ydChhZGV2LAotCQkJCQkJICAgcGktPnN5c19wY2llX21hc2ss Ci0JCQkJCQkgICBwaS0+dmJpb3NfYm9vdF9zdGF0ZS5wY2llX2dlbl9ib290dXBfdmFsdWUsCi0J CQkJCQkgICBjbG9ja19pbmZvLT5jaS51Y1BDSUVHZW4pOwotCXBsLT5wY2llX2xhbmUgPSBhbWRn cHVfZ2V0X3BjaWVfbGFuZV9zdXBwb3J0KGFkZXYsCi0JCQkJCQkgICAgIHBpLT52Ymlvc19ib290 X3N0YXRlLnBjaWVfbGFuZV9ib290dXBfdmFsdWUsCi0JCQkJCQkgICAgIGxlMTZfdG9fY3B1KGNs b2NrX2luZm8tPmNpLnVzUENJRUxhbmUpKTsKLQotCWlmIChycHMtPmNsYXNzICYgQVRPTV9QUExJ Ql9DTEFTU0lGSUNBVElPTl9BQ1BJKSB7Ci0JCXBpLT5hY3BpX3BjaWVfZ2VuID0gcGwtPnBjaWVf Z2VuOwotCX0KLQotCWlmIChycHMtPmNsYXNzMiAmIEFUT01fUFBMSUJfQ0xBU1NJRklDQVRJT04y X1VMVikgewotCQlwaS0+dWx2LnN1cHBvcnRlZCA9IHRydWU7Ci0JCXBpLT51bHYucGwgPSAqcGw7 Ci0JCXBpLT51bHYuY2dfdWx2X3BhcmFtZXRlciA9IENJU0xBTkRTX0NHVUxWUEFSQU1FVEVSX0RG TFQ7Ci0JfQotCi0JLyogcGF0Y2ggdXAgYm9vdCBzdGF0ZSAqLwotCWlmIChycHMtPmNsYXNzICYg QVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9CT09UKSB7Ci0JCXBsLT5tY2xrID0gcGktPnZiaW9z X2Jvb3Rfc3RhdGUubWNsa19ib290dXBfdmFsdWU7Ci0JCXBsLT5zY2xrID0gcGktPnZiaW9zX2Jv b3Rfc3RhdGUuc2Nsa19ib290dXBfdmFsdWU7Ci0JCXBsLT5wY2llX2dlbiA9IHBpLT52Ymlvc19i b290X3N0YXRlLnBjaWVfZ2VuX2Jvb3R1cF92YWx1ZTsKLQkJcGwtPnBjaWVfbGFuZSA9IHBpLT52 Ymlvc19ib290X3N0YXRlLnBjaWVfbGFuZV9ib290dXBfdmFsdWU7Ci0JfQotCi0Jc3dpdGNoIChy cHMtPmNsYXNzICYgQVRPTV9QUExJQl9DTEFTU0lGSUNBVElPTl9VSV9NQVNLKSB7Ci0JY2FzZSBB VE9NX1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX0JBVFRFUlk6Ci0JCXBpLT51c2VfcGNpZV9wb3dl cnNhdmluZ19sZXZlbHMgPSB0cnVlOwotCQlpZiAocGktPnBjaWVfZ2VuX3Bvd2Vyc2F2aW5nLm1h eCA8IHBsLT5wY2llX2dlbikKLQkJCXBpLT5wY2llX2dlbl9wb3dlcnNhdmluZy5tYXggPSBwbC0+ cGNpZV9nZW47Ci0JCWlmIChwaS0+cGNpZV9nZW5fcG93ZXJzYXZpbmcubWluID4gcGwtPnBjaWVf Z2VuKQotCQkJcGktPnBjaWVfZ2VuX3Bvd2Vyc2F2aW5nLm1pbiA9IHBsLT5wY2llX2dlbjsKLQkJ aWYgKHBpLT5wY2llX2xhbmVfcG93ZXJzYXZpbmcubWF4IDwgcGwtPnBjaWVfbGFuZSkKLQkJCXBp LT5wY2llX2xhbmVfcG93ZXJzYXZpbmcubWF4ID0gcGwtPnBjaWVfbGFuZTsKLQkJaWYgKHBpLT5w Y2llX2xhbmVfcG93ZXJzYXZpbmcubWluID4gcGwtPnBjaWVfbGFuZSkKLQkJCXBpLT5wY2llX2xh bmVfcG93ZXJzYXZpbmcubWluID0gcGwtPnBjaWVfbGFuZTsKLQkJYnJlYWs7Ci0JY2FzZSBBVE9N X1BQTElCX0NMQVNTSUZJQ0FUSU9OX1VJX1BFUkZPUk1BTkNFOgotCQlwaS0+dXNlX3BjaWVfcGVy Zm9ybWFuY2VfbGV2ZWxzID0gdHJ1ZTsKLQkJaWYgKHBpLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5t YXggPCBwbC0+cGNpZV9nZW4pCi0JCQlwaS0+cGNpZV9nZW5fcGVyZm9ybWFuY2UubWF4ID0gcGwt PnBjaWVfZ2VuOwotCQlpZiAocGktPnBjaWVfZ2VuX3BlcmZvcm1hbmNlLm1pbiA+IHBsLT5wY2ll X2dlbikKLQkJCXBpLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5taW4gPSBwbC0+cGNpZV9nZW47Ci0J CWlmIChwaS0+cGNpZV9sYW5lX3BlcmZvcm1hbmNlLm1heCA8IHBsLT5wY2llX2xhbmUpCi0JCQlw aS0+cGNpZV9sYW5lX3BlcmZvcm1hbmNlLm1heCA9IHBsLT5wY2llX2xhbmU7Ci0JCWlmIChwaS0+ cGNpZV9sYW5lX3BlcmZvcm1hbmNlLm1pbiA+IHBsLT5wY2llX2xhbmUpCi0JCQlwaS0+cGNpZV9s YW5lX3BlcmZvcm1hbmNlLm1pbiA9IHBsLT5wY2llX2xhbmU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6 Ci0JCWJyZWFrOwotCX0KLX0KLQotc3RhdGljIGludCBjaV9wYXJzZV9wb3dlcl90YWJsZShzdHJ1 Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdHJ1Y3QgYW1kZ3B1X21vZGVfaW5mbyAqbW9k ZV9pbmZvID0gJmFkZXYtPm1vZGVfaW5mbzsKLQlzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tf SU5GTyAqbm9uX2Nsb2NrX2luZm87Ci0JdW5pb24gcHBsaWJfcG93ZXJfc3RhdGUgKnBvd2VyX3N0 YXRlOwotCWludCBpLCBqLCBrLCBub25fY2xvY2tfYXJyYXlfaW5kZXgsIGNsb2NrX2FycmF5X2lu ZGV4OwotCXVuaW9uIHBwbGliX2Nsb2NrX2luZm8gKmNsb2NrX2luZm87Ci0Jc3RydWN0IF9TdGF0 ZUFycmF5ICpzdGF0ZV9hcnJheTsKLQlzdHJ1Y3QgX0Nsb2NrSW5mb0FycmF5ICpjbG9ja19pbmZv X2FycmF5OwotCXN0cnVjdCBfTm9uQ2xvY2tJbmZvQXJyYXkgKm5vbl9jbG9ja19pbmZvX2FycmF5 OwotCXVuaW9uIHBvd2VyX2luZm8gKnBvd2VyX2luZm87Ci0JaW50IGluZGV4ID0gR2V0SW5kZXhJ bnRvTWFzdGVyVGFibGUoREFUQSwgUG93ZXJQbGF5SW5mbyk7Ci0JdTE2IGRhdGFfb2Zmc2V0Owot CXU4IGZyZXYsIGNyZXY7Ci0JdTggKnBvd2VyX3N0YXRlX29mZnNldDsKLQlzdHJ1Y3QgY2lfcHMg KnBzOwotCi0JaWYgKCFhbWRncHVfYXRvbV9wYXJzZV9kYXRhX2hlYWRlcihtb2RlX2luZm8tPmF0 b21fY29udGV4dCwgaW5kZXgsIE5VTEwsCi0JCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZz ZXQpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlwb3dlcl9pbmZvID0gKHVuaW9uIHBvd2VyX2luZm8g KikobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRhX29mZnNldCk7Ci0KLQlhbWRn cHVfYWRkX3RoZXJtYWxfY29udHJvbGxlcihhZGV2KTsKLQotCXN0YXRlX2FycmF5ID0gKHN0cnVj dCBfU3RhdGVBcnJheSAqKQotCQkobW9kZV9pbmZvLT5hdG9tX2NvbnRleHQtPmJpb3MgKyBkYXRh X29mZnNldCArCi0JCSBsZTE2X3RvX2NwdShwb3dlcl9pbmZvLT5wcGxpYi51c1N0YXRlQXJyYXlP ZmZzZXQpKTsKLQljbG9ja19pbmZvX2FycmF5ID0gKHN0cnVjdCBfQ2xvY2tJbmZvQXJyYXkgKikK LQkJKG1vZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKwotCQkgbGUx Nl90b19jcHUocG93ZXJfaW5mby0+cHBsaWIudXNDbG9ja0luZm9BcnJheU9mZnNldCkpOwotCW5v bl9jbG9ja19pbmZvX2FycmF5ID0gKHN0cnVjdCBfTm9uQ2xvY2tJbmZvQXJyYXkgKikKLQkJKG1v ZGVfaW5mby0+YXRvbV9jb250ZXh0LT5iaW9zICsgZGF0YV9vZmZzZXQgKwotCQkgbGUxNl90b19j cHUocG93ZXJfaW5mby0+cHBsaWIudXNOb25DbG9ja0luZm9BcnJheU9mZnNldCkpOwotCi0JYWRl di0+cG0uZHBtLnBzID0ga2NhbGxvYyhzdGF0ZV9hcnJheS0+dWNOdW1FbnRyaWVzLAotCQkJCSAg c2l6ZW9mKHN0cnVjdCBhbWRncHVfcHMpLAotCQkJCSAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGV2 LT5wbS5kcG0ucHMpCi0JCXJldHVybiAtRU5PTUVNOwotCXBvd2VyX3N0YXRlX29mZnNldCA9ICh1 OCAqKXN0YXRlX2FycmF5LT5zdGF0ZXM7Ci0JZm9yIChpID0gMDsgaSA8IHN0YXRlX2FycmF5LT51 Y051bUVudHJpZXM7IGkrKykgewotCQl1OCAqaWR4OwotCQlwb3dlcl9zdGF0ZSA9ICh1bmlvbiBw cGxpYl9wb3dlcl9zdGF0ZSAqKXBvd2VyX3N0YXRlX29mZnNldDsKLQkJbm9uX2Nsb2NrX2FycmF5 X2luZGV4ID0gcG93ZXJfc3RhdGUtPnYyLm5vbkNsb2NrSW5mb0luZGV4OwotCQlub25fY2xvY2tf aW5mbyA9IChzdHJ1Y3QgX0FUT01fUFBMSUJfTk9OQ0xPQ0tfSU5GTyAqKQotCQkJJm5vbl9jbG9j a19pbmZvX2FycmF5LT5ub25DbG9ja0luZm9bbm9uX2Nsb2NrX2FycmF5X2luZGV4XTsKLQkJcHMg PSBremFsbG9jKHNpemVvZihzdHJ1Y3QgY2lfcHMpLCBHRlBfS0VSTkVMKTsKLQkJaWYgKHBzID09 IE5VTEwpIHsKLQkJCWtmcmVlKGFkZXYtPnBtLmRwbS5wcyk7Ci0JCQlyZXR1cm4gLUVOT01FTTsK LQkJfQotCQlhZGV2LT5wbS5kcG0ucHNbaV0ucHNfcHJpdiA9IHBzOwotCQljaV9wYXJzZV9wcGxp Yl9ub25fY2xvY2tfaW5mbyhhZGV2LCAmYWRldi0+cG0uZHBtLnBzW2ldLAotCQkJCQkgICAgICBu b25fY2xvY2tfaW5mbywKLQkJCQkJICAgICAgbm9uX2Nsb2NrX2luZm9fYXJyYXktPnVjRW50cnlT aXplKTsKLQkJayA9IDA7Ci0JCWlkeCA9ICh1OCAqKSZwb3dlcl9zdGF0ZS0+djIuY2xvY2tJbmZv SW5kZXhbMF07Ci0JCWZvciAoaiA9IDA7IGogPCBwb3dlcl9zdGF0ZS0+djIudWNOdW1EUE1MZXZl bHM7IGorKykgewotCQkJY2xvY2tfYXJyYXlfaW5kZXggPSBpZHhbal07Ci0JCQlpZiAoY2xvY2tf YXJyYXlfaW5kZXggPj0gY2xvY2tfaW5mb19hcnJheS0+dWNOdW1FbnRyaWVzKQotCQkJCWNvbnRp bnVlOwotCQkJaWYgKGsgPj0gQ0lTTEFORFNfTUFYX0hBUkRXQVJFX1BPV0VSTEVWRUxTKQotCQkJ CWJyZWFrOwotCQkJY2xvY2tfaW5mbyA9ICh1bmlvbiBwcGxpYl9jbG9ja19pbmZvICopCi0JCQkJ KCh1OCAqKSZjbG9ja19pbmZvX2FycmF5LT5jbG9ja0luZm9bMF0gKwotCQkJCSAoY2xvY2tfYXJy YXlfaW5kZXggKiBjbG9ja19pbmZvX2FycmF5LT51Y0VudHJ5U2l6ZSkpOwotCQkJY2lfcGFyc2Vf cHBsaWJfY2xvY2tfaW5mbyhhZGV2LAotCQkJCQkJICAmYWRldi0+cG0uZHBtLnBzW2ldLCBrLAot CQkJCQkJICBjbG9ja19pbmZvKTsKLQkJCWsrKzsKLQkJfQotCQlwb3dlcl9zdGF0ZV9vZmZzZXQg Kz0gMiArIHBvd2VyX3N0YXRlLT52Mi51Y051bURQTUxldmVsczsKLQl9Ci0JYWRldi0+cG0uZHBt Lm51bV9wcyA9IHN0YXRlX2FycmF5LT51Y051bUVudHJpZXM7Ci0KLQkvKiBmaWxsIGluIHRoZSB2 Y2UgcG93ZXIgc3RhdGVzICovCi0JZm9yIChpID0gMDsgaSA8IGFkZXYtPnBtLmRwbS5udW1fb2Zf dmNlX3N0YXRlczsgaSsrKSB7Ci0JCXUzMiBzY2xrLCBtY2xrOwotCQljbG9ja19hcnJheV9pbmRl eCA9IGFkZXYtPnBtLmRwbS52Y2Vfc3RhdGVzW2ldLmNsa19pZHg7Ci0JCWNsb2NrX2luZm8gPSAo dW5pb24gcHBsaWJfY2xvY2tfaW5mbyAqKQotCQkJJmNsb2NrX2luZm9fYXJyYXktPmNsb2NrSW5m b1tjbG9ja19hcnJheV9pbmRleCAqIGNsb2NrX2luZm9fYXJyYXktPnVjRW50cnlTaXplXTsKLQkJ c2NsayA9IGxlMTZfdG9fY3B1KGNsb2NrX2luZm8tPmNpLnVzRW5naW5lQ2xvY2tMb3cpOwotCQlz Y2xrIHw9IGNsb2NrX2luZm8tPmNpLnVjRW5naW5lQ2xvY2tIaWdoIDw8IDE2OwotCQltY2xrID0g bGUxNl90b19jcHUoY2xvY2tfaW5mby0+Y2kudXNNZW1vcnlDbG9ja0xvdyk7Ci0JCW1jbGsgfD0g Y2xvY2tfaW5mby0+Y2kudWNNZW1vcnlDbG9ja0hpZ2ggPDwgMTY7Ci0JCWFkZXYtPnBtLmRwbS52 Y2Vfc3RhdGVzW2ldLnNjbGsgPSBzY2xrOwotCQlhZGV2LT5wbS5kcG0udmNlX3N0YXRlc1tpXS5t Y2xrID0gbWNsazsKLQl9Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9nZXRfdmJp b3NfYm9vdF92YWx1ZXMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgIHN0cnVj dCBjaV92Ymlvc19ib290X3N0YXRlICpib290X3N0YXRlKQotewotCXN0cnVjdCBhbWRncHVfbW9k ZV9pbmZvICptb2RlX2luZm8gPSAmYWRldi0+bW9kZV9pbmZvOwotCWludCBpbmRleCA9IEdldElu ZGV4SW50b01hc3RlclRhYmxlKERBVEEsIEZpcm13YXJlSW5mbyk7Ci0JQVRPTV9GSVJNV0FSRV9J TkZPX1YyXzIgKmZpcm13YXJlX2luZm87Ci0JdTggZnJldiwgY3JldjsKLQl1MTYgZGF0YV9vZmZz ZXQ7Ci0KLQlpZiAoYW1kZ3B1X2F0b21fcGFyc2VfZGF0YV9oZWFkZXIobW9kZV9pbmZvLT5hdG9t X2NvbnRleHQsIGluZGV4LCBOVUxMLAotCQkJCSAgICZmcmV2LCAmY3JldiwgJmRhdGFfb2Zmc2V0 KSkgewotCQlmaXJtd2FyZV9pbmZvID0KLQkJCShBVE9NX0ZJUk1XQVJFX0lORk9fVjJfMiAqKSht b2RlX2luZm8tPmF0b21fY29udGV4dC0+YmlvcyArCi0JCQkJCQkgICAgZGF0YV9vZmZzZXQpOwot CQlib290X3N0YXRlLT5tdmRkX2Jvb3R1cF92YWx1ZSA9IGxlMTZfdG9fY3B1KGZpcm13YXJlX2lu Zm8tPnVzQm9vdFVwTVZERENWb2x0YWdlKTsKLQkJYm9vdF9zdGF0ZS0+dmRkY19ib290dXBfdmFs dWUgPSBsZTE2X3RvX2NwdShmaXJtd2FyZV9pbmZvLT51c0Jvb3RVcFZERENWb2x0YWdlKTsKLQkJ Ym9vdF9zdGF0ZS0+dmRkY2lfYm9vdHVwX3ZhbHVlID0gbGUxNl90b19jcHUoZmlybXdhcmVfaW5m by0+dXNCb290VXBWRERDSVZvbHRhZ2UpOwotCQlib290X3N0YXRlLT5wY2llX2dlbl9ib290dXBf dmFsdWUgPSBjaV9nZXRfY3VycmVudF9wY2llX3NwZWVkKGFkZXYpOwotCQlib290X3N0YXRlLT5w Y2llX2xhbmVfYm9vdHVwX3ZhbHVlID0gY2lfZ2V0X2N1cnJlbnRfcGNpZV9sYW5lX251bWJlcihh ZGV2KTsKLQkJYm9vdF9zdGF0ZS0+c2Nsa19ib290dXBfdmFsdWUgPSBsZTMyX3RvX2NwdShmaXJt d2FyZV9pbmZvLT51bERlZmF1bHRFbmdpbmVDbG9jayk7Ci0JCWJvb3Rfc3RhdGUtPm1jbGtfYm9v dHVwX3ZhbHVlID0gbGUzMl90b19jcHUoZmlybXdhcmVfaW5mby0+dWxEZWZhdWx0TWVtb3J5Q2xv Y2spOwotCi0JCXJldHVybiAwOwotCX0KLQlyZXR1cm4gLUVJTlZBTDsKLX0KLQotc3RhdGljIHZv aWQgY2lfZHBtX2Zpbmkoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0JaW50IGk7Ci0K LQlmb3IgKGkgPSAwOyBpIDwgYWRldi0+cG0uZHBtLm51bV9wczsgaSsrKSB7Ci0JCWtmcmVlKGFk ZXYtPnBtLmRwbS5wc1tpXS5wc19wcml2KTsKLQl9Ci0Ja2ZyZWUoYWRldi0+cG0uZHBtLnBzKTsK LQlrZnJlZShhZGV2LT5wbS5kcG0ucHJpdik7Ci0Ja2ZyZWUoYWRldi0+cG0uZHBtLmR5bl9zdGF0 ZS52ZGRjX2RlcGVuZGVuY3lfb25fZGlzcGNsay5lbnRyaWVzKTsKLQlhbWRncHVfZnJlZV9leHRl bmRlZF9wb3dlcl90YWJsZShhZGV2KTsKLX0KLQotLyoqCi0gKiBjaV9kcG1faW5pdF9taWNyb2Nv ZGUgLSBsb2FkIHVjb2RlIGltYWdlcyBmcm9tIGRpc2sKLSAqCi0gKiBAYWRldjogYW1kZ3B1X2Rl dmljZSBwb2ludGVyCi0gKgotICogVXNlIHRoZSBmaXJtd2FyZSBpbnRlcmZhY2UgdG8gbG9hZCB0 aGUgdWNvZGUgaW1hZ2VzIGludG8KLSAqIHRoZSBkcml2ZXIgKG5vdCBsb2FkZWQgaW50byBodyku Ci0gKiBSZXR1cm5zIDAgb24gc3VjY2VzcywgZXJyb3Igb24gZmFpbHVyZS4KLSAqLwotc3RhdGlj IGludCBjaV9kcG1faW5pdF9taWNyb2NvZGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17 Ci0JY29uc3QgY2hhciAqY2hpcF9uYW1lOwotCWNoYXIgZndfbmFtZVszMF07Ci0JaW50IGVycjsK LQotCURSTV9ERUJVRygiXG4iKTsKLQotCXN3aXRjaCAoYWRldi0+YXNpY190eXBlKSB7Ci0JY2Fz ZSBDSElQX0JPTkFJUkU6Ci0JCWlmICgoYWRldi0+cGRldi0+cmV2aXNpb24gPT0gMHg4MCkgfHwK LQkJICAgIChhZGV2LT5wZGV2LT5yZXZpc2lvbiA9PSAweDgxKSB8fAotCQkgICAgKGFkZXYtPnBk ZXYtPmRldmljZSA9PSAweDY2NWYpKQotCQkJY2hpcF9uYW1lID0gImJvbmFpcmVfayI7Ci0JCWVs c2UKLQkJCWNoaXBfbmFtZSA9ICJib25haXJlIjsKLQkJYnJlYWs7Ci0JY2FzZSBDSElQX0hBV0FJ SToKLQkJaWYgKGFkZXYtPnBkZXYtPnJldmlzaW9uID09IDB4ODApCi0JCQljaGlwX25hbWUgPSAi aGF3YWlpX2siOwotCQllbHNlCi0JCQljaGlwX25hbWUgPSAiaGF3YWlpIjsKLQkJYnJlYWs7Ci0J Y2FzZSBDSElQX0tBVkVSSToKLQljYXNlIENISVBfS0FCSU5JOgotCWNhc2UgQ0hJUF9NVUxMSU5T OgotCWRlZmF1bHQ6IEJVRygpOwotCX0KLQotCXNucHJpbnRmKGZ3X25hbWUsIHNpemVvZihmd19u YW1lKSwgImFtZGdwdS8lc19zbWMuYmluIiwgY2hpcF9uYW1lKTsKLQllcnIgPSByZXF1ZXN0X2Zp cm13YXJlKCZhZGV2LT5wbS5mdywgZndfbmFtZSwgYWRldi0+ZGV2KTsKLQlpZiAoZXJyKQotCQln b3RvIG91dDsKLQllcnIgPSBhbWRncHVfdWNvZGVfdmFsaWRhdGUoYWRldi0+cG0uZncpOwotCi1v dXQ6Ci0JaWYgKGVycikgewotCQlwcl9lcnIoImNpa19zbWM6IEZhaWxlZCB0byBsb2FkIGZpcm13 YXJlIFwiJXNcIlxuIiwgZndfbmFtZSk7Ci0JCXJlbGVhc2VfZmlybXdhcmUoYWRldi0+cG0uZncp OwotCQlhZGV2LT5wbS5mdyA9IE5VTEw7Ci0JfQotCXJldHVybiBlcnI7Ci19Ci0KLXN0YXRpYyBp bnQgY2lfZHBtX2luaXQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0JaW50IGluZGV4 ID0gR2V0SW5kZXhJbnRvTWFzdGVyVGFibGUoREFUQSwgQVNJQ19JbnRlcm5hbFNTX0luZm8pOwot CVNNVTdfRGlzY3JldGVfRHBtVGFibGUgKmRwbV90YWJsZTsKLQlzdHJ1Y3QgYW1kZ3B1X2dwaW9f cmVjIGdwaW87Ci0JdTE2IGRhdGFfb2Zmc2V0LCBzaXplOwotCXU4IGZyZXYsIGNyZXY7Ci0Jc3Ry dWN0IGNpX3Bvd2VyX2luZm8gKnBpOwotCWludCByZXQ7Ci0KLQlwaSA9IGt6YWxsb2Moc2l6ZW9m KHN0cnVjdCBjaV9wb3dlcl9pbmZvKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKHBpID09IE5VTEwpCi0J CXJldHVybiAtRU5PTUVNOwotCWFkZXYtPnBtLmRwbS5wcml2ID0gcGk7Ci0KLQlwaS0+c3lzX3Bj aWVfbWFzayA9Ci0JCWFkZXYtPnBtLnBjaWVfZ2VuX21hc2sgJiBDQUlMX1BDSUVfTElOS19TUEVF RF9TVVBQT1JUX01BU0s7Ci0KLQlwaS0+Zm9yY2VfcGNpZV9nZW4gPSBBTURHUFVfUENJRV9HRU5f SU5WQUxJRDsKLQotCXBpLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5tYXggPSBBTURHUFVfUENJRV9H RU4xOwotCXBpLT5wY2llX2dlbl9wZXJmb3JtYW5jZS5taW4gPSBBTURHUFVfUENJRV9HRU4zOwot CXBpLT5wY2llX2dlbl9wb3dlcnNhdmluZy5tYXggPSBBTURHUFVfUENJRV9HRU4xOwotCXBpLT5w Y2llX2dlbl9wb3dlcnNhdmluZy5taW4gPSBBTURHUFVfUENJRV9HRU4zOwotCi0JcGktPnBjaWVf bGFuZV9wZXJmb3JtYW5jZS5tYXggPSAwOwotCXBpLT5wY2llX2xhbmVfcGVyZm9ybWFuY2UubWlu ID0gMTY7Ci0JcGktPnBjaWVfbGFuZV9wb3dlcnNhdmluZy5tYXggPSAwOwotCXBpLT5wY2llX2xh bmVfcG93ZXJzYXZpbmcubWluID0gMTY7Ci0KLQlyZXQgPSBjaV9nZXRfdmJpb3NfYm9vdF92YWx1 ZXMoYWRldiwgJnBpLT52Ymlvc19ib290X3N0YXRlKTsKLQlpZiAocmV0KSB7Ci0JCWNpX2RwbV9m aW5pKGFkZXYpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCXJldCA9IGFtZGdwdV9nZXRfcGxhdGZv cm1fY2FwcyhhZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWNpX2RwbV9maW5pKGFkZXYpOwotCQlyZXR1 cm4gcmV0OwotCX0KLQotCXJldCA9IGFtZGdwdV9wYXJzZV9leHRlbmRlZF9wb3dlcl90YWJsZShh ZGV2KTsKLQlpZiAocmV0KSB7Ci0JCWNpX2RwbV9maW5pKGFkZXYpOwotCQlyZXR1cm4gcmV0Owot CX0KLQotCXJldCA9IGNpX3BhcnNlX3Bvd2VyX3RhYmxlKGFkZXYpOwotCWlmIChyZXQpIHsKLQkJ Y2lfZHBtX2ZpbmkoYWRldik7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcGktPmRsbF9kZWZhdWx0 X29uID0gZmFsc2U7Ci0JcGktPnNyYW1fZW5kID0gU01DX1JBTV9FTkQ7Ci0KLQlwaS0+YWN0aXZp dHlfdGFyZ2V0WzBdID0gQ0lTTEFORF9UQVJHRVRBQ1RJVklUWV9ERkxUOwotCXBpLT5hY3Rpdml0 eV90YXJnZXRbMV0gPSBDSVNMQU5EX1RBUkdFVEFDVElWSVRZX0RGTFQ7Ci0JcGktPmFjdGl2aXR5 X3RhcmdldFsyXSA9IENJU0xBTkRfVEFSR0VUQUNUSVZJVFlfREZMVDsKLQlwaS0+YWN0aXZpdHlf dGFyZ2V0WzNdID0gQ0lTTEFORF9UQVJHRVRBQ1RJVklUWV9ERkxUOwotCXBpLT5hY3Rpdml0eV90 YXJnZXRbNF0gPSBDSVNMQU5EX1RBUkdFVEFDVElWSVRZX0RGTFQ7Ci0JcGktPmFjdGl2aXR5X3Rh cmdldFs1XSA9IENJU0xBTkRfVEFSR0VUQUNUSVZJVFlfREZMVDsKLQlwaS0+YWN0aXZpdHlfdGFy Z2V0WzZdID0gQ0lTTEFORF9UQVJHRVRBQ1RJVklUWV9ERkxUOwotCXBpLT5hY3Rpdml0eV90YXJn ZXRbN10gPSBDSVNMQU5EX1RBUkdFVEFDVElWSVRZX0RGTFQ7Ci0KLQlwaS0+bWNsa19hY3Rpdml0 eV90YXJnZXQgPSBDSVNMQU5EX01DTEtfVEFSR0VUQUNUSVZJVFlfREZMVDsKLQotCXBpLT5zY2xr X2RwbV9rZXlfZGlzYWJsZWQgPSAwOwotCXBpLT5tY2xrX2RwbV9rZXlfZGlzYWJsZWQgPSAwOwot CXBpLT5wY2llX2RwbV9rZXlfZGlzYWJsZWQgPSAwOwotCXBpLT50aGVybWFsX3NjbGtfZHBtX2Vu YWJsZWQgPSAwOwotCi0JaWYgKGFkZXYtPnBvd2VycGxheS5wcF9mZWF0dXJlICYgUFBfU0NMS19E RUVQX1NMRUVQX01BU0spCi0JCXBpLT5jYXBzX3NjbGtfZHMgPSB0cnVlOwotCWVsc2UKLQkJcGkt PmNhcHNfc2Nsa19kcyA9IGZhbHNlOwotCi0JcGktPm1jbGtfc3Ryb2JlX21vZGVfdGhyZXNob2xk ID0gNDAwMDA7Ci0JcGktPm1jbGtfc3R1dHRlcl9tb2RlX3RocmVzaG9sZCA9IDQwMDAwOwotCXBp LT5tY2xrX2VkY19lbmFibGVfdGhyZXNob2xkID0gNDAwMDA7Ci0JcGktPm1jbGtfZWRjX3dyX2Vu YWJsZV90aHJlc2hvbGQgPSA0MDAwMDsKLQotCWNpX2luaXRpYWxpemVfcG93ZXJ0dW5lX2RlZmF1 bHRzKGFkZXYpOwotCi0JcGktPmNhcHNfZnBzID0gZmFsc2U7Ci0KLQlwaS0+Y2Fwc19zY2xrX3Ro cm90dGxlX2xvd19ub3RpZmljYXRpb24gPSBmYWxzZTsKLQotCXBpLT5jYXBzX3V2ZF9kcG0gPSB0 cnVlOwotCXBpLT5jYXBzX3ZjZV9kcG0gPSB0cnVlOwotCi0JY2lfZ2V0X2xlYWthZ2Vfdm9sdGFn ZXMoYWRldik7Ci0JY2lfcGF0Y2hfZGVwZW5kZW5jeV90YWJsZXNfd2l0aF9sZWFrYWdlKGFkZXYp OwotCWNpX3NldF9wcml2YXRlX2RhdGFfdmFyaWFibGVzX2Jhc2VkX29uX3BwdGFibGUoYWRldik7 Ci0KLQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9kaXNwY2xrLmVu dHJpZXMgPQotCQlrY2FsbG9jKDQsCi0JCQlzaXplb2Yoc3RydWN0IGFtZGdwdV9jbG9ja192b2x0 YWdlX2RlcGVuZGVuY3lfZW50cnkpLAotCQkJR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhZGV2LT5wbS5k cG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9kaXNwY2xrLmVudHJpZXMpIHsKLQkJY2lf ZHBtX2ZpbmkoYWRldik7Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQlhZGV2LT5wbS5kcG0uZHlu X3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9kaXNwY2xrLmNvdW50ID0gNDsKLQlhZGV2LT5wbS5k cG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9kaXNwY2xrLmVudHJpZXNbMF0uY2xrID0g MDsKLQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9kaXNwY2xrLmVu dHJpZXNbMF0udiA9IDA7Ci0JYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVuZGVuY3lf b25fZGlzcGNsay5lbnRyaWVzWzFdLmNsayA9IDM2MDAwOwotCWFkZXYtPnBtLmRwbS5keW5fc3Rh dGUudmRkY19kZXBlbmRlbmN5X29uX2Rpc3BjbGsuZW50cmllc1sxXS52ID0gNzIwOwotCWFkZXYt PnBtLmRwbS5keW5fc3RhdGUudmRkY19kZXBlbmRlbmN5X29uX2Rpc3BjbGsuZW50cmllc1syXS5j bGsgPSA1NDAwMDsKLQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNfZGVwZW5kZW5jeV9vbl9k aXNwY2xrLmVudHJpZXNbMl0udiA9IDgxMDsKLQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLnZkZGNf ZGVwZW5kZW5jeV9vbl9kaXNwY2xrLmVudHJpZXNbM10uY2xrID0gNzIwMDA7Ci0JYWRldi0+cG0u ZHBtLmR5bl9zdGF0ZS52ZGRjX2RlcGVuZGVuY3lfb25fZGlzcGNsay5lbnRyaWVzWzNdLnYgPSA5 MDA7Ci0KLQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLm1jbGtfc2Nsa19yYXRpbyA9IDQ7Ci0JYWRl di0+cG0uZHBtLmR5bl9zdGF0ZS5zY2xrX21jbGtfZGVsdGEgPSAxNTAwMDsKLQlhZGV2LT5wbS5k cG0uZHluX3N0YXRlLnZkZGNfdmRkY2lfZGVsdGEgPSAyMDA7Ci0KLQlhZGV2LT5wbS5kcG0uZHlu X3N0YXRlLnZhbGlkX3NjbGtfdmFsdWVzLmNvdW50ID0gMDsKLQlhZGV2LT5wbS5kcG0uZHluX3N0 YXRlLnZhbGlkX3NjbGtfdmFsdWVzLnZhbHVlcyA9IE5VTEw7Ci0JYWRldi0+cG0uZHBtLmR5bl9z dGF0ZS52YWxpZF9tY2xrX3ZhbHVlcy5jb3VudCA9IDA7Ci0JYWRldi0+cG0uZHBtLmR5bl9zdGF0 ZS52YWxpZF9tY2xrX3ZhbHVlcy52YWx1ZXMgPSBOVUxMOwotCi0JaWYgKGFkZXYtPmFzaWNfdHlw ZSA9PSBDSElQX0hBV0FJSSkgewotCQlwaS0+dGhlcm1hbF90ZW1wX3NldHRpbmcudGVtcGVyYXR1 cmVfbG93ID0gOTQ1MDA7Ci0JCXBpLT50aGVybWFsX3RlbXBfc2V0dGluZy50ZW1wZXJhdHVyZV9o aWdoID0gOTUwMDA7Ci0JCXBpLT50aGVybWFsX3RlbXBfc2V0dGluZy50ZW1wZXJhdHVyZV9zaHV0 ZG93biA9IDEwNDAwMDsKLQl9IGVsc2UgewotCQlwaS0+dGhlcm1hbF90ZW1wX3NldHRpbmcudGVt cGVyYXR1cmVfbG93ID0gOTk1MDA7Ci0JCXBpLT50aGVybWFsX3RlbXBfc2V0dGluZy50ZW1wZXJh dHVyZV9oaWdoID0gMTAwMDAwOwotCQlwaS0+dGhlcm1hbF90ZW1wX3NldHRpbmcudGVtcGVyYXR1 cmVfc2h1dGRvd24gPSAxMDQwMDA7Ci0JfQotCi0JcGktPnV2ZF9lbmFibGVkID0gZmFsc2U7Ci0K LQlkcG1fdGFibGUgPSAmcGktPnNtY19zdGF0ZV90YWJsZTsKLQotCWdwaW8gPSBhbWRncHVfYXRv bWJpb3NfbG9va3VwX2dwaW8oYWRldiwgVkREQ19WUkhPVF9HUElPX1BJTklEKTsKLQlpZiAoZ3Bp by52YWxpZCkgewotCQlkcG1fdGFibGUtPlZSSG90R3BpbyA9IGdwaW8uc2hpZnQ7Ci0JCWFkZXYt PnBtLmRwbS5wbGF0Zm9ybV9jYXBzIHw9IEFUT01fUFBfUExBVEZPUk1fQ0FQX1JFR1VMQVRPUl9I T1Q7Ci0JfSBlbHNlIHsKLQkJZHBtX3RhYmxlLT5WUkhvdEdwaW8gPSBDSVNMQU5EU19VTlVTRURf R1BJT19QSU47Ci0JCWFkZXYtPnBtLmRwbS5wbGF0Zm9ybV9jYXBzICY9IH5BVE9NX1BQX1BMQVRG T1JNX0NBUF9SRUdVTEFUT1JfSE9UOwotCX0KLQotCWdwaW8gPSBhbWRncHVfYXRvbWJpb3NfbG9v a3VwX2dwaW8oYWRldiwgUFBfQUNfRENfU1dJVENIX0dQSU9fUElOSUQpOwotCWlmIChncGlvLnZh bGlkKSB7Ci0JCWRwbV90YWJsZS0+QWNEY0dwaW8gPSBncGlvLnNoaWZ0OwotCQlhZGV2LT5wbS5k cG0ucGxhdGZvcm1fY2FwcyB8PSBBVE9NX1BQX1BMQVRGT1JNX0NBUF9IQVJEV0FSRURDOwotCX0g ZWxzZSB7Ci0JCWRwbV90YWJsZS0+QWNEY0dwaW8gPSBDSVNMQU5EU19VTlVTRURfR1BJT19QSU47 Ci0JCWFkZXYtPnBtLmRwbS5wbGF0Zm9ybV9jYXBzICY9IH5BVE9NX1BQX1BMQVRGT1JNX0NBUF9I QVJEV0FSRURDOwotCX0KLQotCWdwaW8gPSBhbWRncHVfYXRvbWJpb3NfbG9va3VwX2dwaW8oYWRl diwgVkREQ19QQ0NfR1BJT19QSU5JRCk7Ci0JaWYgKGdwaW8udmFsaWQpIHsKLQkJdTMyIHRtcCA9 IFJSRUczMl9TTUMoaXhDTkJfUFdSTUdUX0NOVEwpOwotCi0JCXN3aXRjaCAoZ3Bpby5zaGlmdCkg ewotCQljYXNlIDA6Ci0JCQl0bXAgJj0gfkNOQl9QV1JNR1RfQ05UTF9fR05CX1NMT1dfTU9ERV9N QVNLOwotCQkJdG1wIHw9IDEgPDwgQ05CX1BXUk1HVF9DTlRMX19HTkJfU0xPV19NT0RFX19TSElG VDsKLQkJCWJyZWFrOwotCQljYXNlIDE6Ci0JCQl0bXAgJj0gfkNOQl9QV1JNR1RfQ05UTF9fR05C X1NMT1dfTU9ERV9NQVNLOwotCQkJdG1wIHw9IDIgPDwgQ05CX1BXUk1HVF9DTlRMX19HTkJfU0xP V19NT0RFX19TSElGVDsKLQkJCWJyZWFrOwotCQljYXNlIDI6Ci0JCQl0bXAgfD0gQ05CX1BXUk1H VF9DTlRMX19HTkJfU0xPV19NQVNLOwotCQkJYnJlYWs7Ci0JCWNhc2UgMzoKLQkJCXRtcCB8PSBD TkJfUFdSTUdUX0NOVExfX0ZPUkNFX05CX1BTMV9NQVNLOwotCQkJYnJlYWs7Ci0JCWNhc2UgNDoK LQkJCXRtcCB8PSBDTkJfUFdSTUdUX0NOVExfX0RQTV9FTkFCTEVEX01BU0s7Ci0JCQlicmVhazsK LQkJZGVmYXVsdDoKLQkJCURSTV9JTkZPKCJJbnZhbGlkIFBDQyBHUElPOiAldSFcbiIsIGdwaW8u c2hpZnQpOwotCQkJYnJlYWs7Ci0JCX0KLQkJV1JFRzMyX1NNQyhpeENOQl9QV1JNR1RfQ05UTCwg dG1wKTsKLQl9Ci0KLQlwaS0+dm9sdGFnZV9jb250cm9sID0gQ0lTTEFORFNfVk9MVEFHRV9DT05U Uk9MX05PTkU7Ci0JcGktPnZkZGNpX2NvbnRyb2wgPSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xf Tk9ORTsKLQlwaS0+bXZkZF9jb250cm9sID0gQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX05PTkU7 Ci0JaWYgKGFtZGdwdV9hdG9tYmlvc19pc192b2x0YWdlX2dwaW8oYWRldiwgVk9MVEFHRV9UWVBF X1ZEREMsIFZPTFRBR0VfT0JKX0dQSU9fTFVUKSkKLQkJcGktPnZvbHRhZ2VfY29udHJvbCA9IENJ U0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPOwotCWVsc2UgaWYgKGFtZGdwdV9hdG9tYmlv c19pc192b2x0YWdlX2dwaW8oYWRldiwgVk9MVEFHRV9UWVBFX1ZEREMsIFZPTFRBR0VfT0JKX1NW SUQyKSkKLQkJcGktPnZvbHRhZ2VfY29udHJvbCA9IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9C WV9TVklEMjsKLQotCWlmIChhZGV2LT5wbS5kcG0ucGxhdGZvcm1fY2FwcyAmIEFUT01fUFBfUExB VEZPUk1fQ0FQX1ZERENJX0NPTlRST0wpIHsKLQkJaWYgKGFtZGdwdV9hdG9tYmlvc19pc192b2x0 YWdlX2dwaW8oYWRldiwgVk9MVEFHRV9UWVBFX1ZERENJLCBWT0xUQUdFX09CSl9HUElPX0xVVCkp Ci0JCQlwaS0+dmRkY2lfY29udHJvbCA9IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElP OwotCQllbHNlIGlmIChhbWRncHVfYXRvbWJpb3NfaXNfdm9sdGFnZV9ncGlvKGFkZXYsIFZPTFRB R0VfVFlQRV9WRERDSSwgVk9MVEFHRV9PQkpfU1ZJRDIpKQotCQkJcGktPnZkZGNpX2NvbnRyb2wg PSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xfQllfU1ZJRDI7Ci0JCWVsc2UKLQkJCWFkZXYtPnBt LmRwbS5wbGF0Zm9ybV9jYXBzICY9IH5BVE9NX1BQX1BMQVRGT1JNX0NBUF9WRERDSV9DT05UUk9M OwotCX0KLQotCWlmIChhZGV2LT5wbS5kcG0ucGxhdGZvcm1fY2FwcyAmIEFUT01fUFBfUExBVEZP Uk1fQ0FQX01WRERDT05UUk9MKSB7Ci0JCWlmIChhbWRncHVfYXRvbWJpb3NfaXNfdm9sdGFnZV9n cGlvKGFkZXYsIFZPTFRBR0VfVFlQRV9NVkREQywgVk9MVEFHRV9PQkpfR1BJT19MVVQpKQotCQkJ cGktPm12ZGRfY29udHJvbCA9IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9CWV9HUElPOwotCQll bHNlIGlmIChhbWRncHVfYXRvbWJpb3NfaXNfdm9sdGFnZV9ncGlvKGFkZXYsIFZPTFRBR0VfVFlQ RV9NVkREQywgVk9MVEFHRV9PQkpfU1ZJRDIpKQotCQkJcGktPm12ZGRfY29udHJvbCA9IENJU0xB TkRTX1ZPTFRBR0VfQ09OVFJPTF9CWV9TVklEMjsKLQkJZWxzZQotCQkJYWRldi0+cG0uZHBtLnBs YXRmb3JtX2NhcHMgJj0gfkFUT01fUFBfUExBVEZPUk1fQ0FQX01WRERDT05UUk9MOwotCX0KLQot CXBpLT52ZGRjX3BoYXNlX3NoZWRfY29udHJvbCA9IHRydWU7Ci0KLSNpZiBkZWZpbmVkKENPTkZJ R19BQ1BJKQotCXBpLT5wY2llX3BlcmZvcm1hbmNlX3JlcXVlc3QgPQotCQlhbWRncHVfYWNwaV9p c19wY2llX3BlcmZvcm1hbmNlX3JlcXVlc3Rfc3VwcG9ydGVkKGFkZXYpOwotI2Vsc2UKLQlwaS0+ cGNpZV9wZXJmb3JtYW5jZV9yZXF1ZXN0ID0gZmFsc2U7Ci0jZW5kaWYKLQotCWlmIChhbWRncHVf YXRvbV9wYXJzZV9kYXRhX2hlYWRlcihhZGV2LT5tb2RlX2luZm8uYXRvbV9jb250ZXh0LCBpbmRl eCwgJnNpemUsCi0JCQkJICAgJmZyZXYsICZjcmV2LCAmZGF0YV9vZmZzZXQpKSB7Ci0JCXBpLT5j YXBzX3NjbGtfc3Nfc3VwcG9ydCA9IHRydWU7Ci0JCXBpLT5jYXBzX21jbGtfc3Nfc3VwcG9ydCA9 IHRydWU7Ci0JCXBpLT5keW5hbWljX3NzID0gdHJ1ZTsKLQl9IGVsc2UgewotCQlwaS0+Y2Fwc19z Y2xrX3NzX3N1cHBvcnQgPSBmYWxzZTsKLQkJcGktPmNhcHNfbWNsa19zc19zdXBwb3J0ID0gZmFs c2U7Ci0JCXBpLT5keW5hbWljX3NzID0gdHJ1ZTsKLQl9Ci0KLQlpZiAoYWRldi0+cG0uaW50X3Ro ZXJtYWxfdHlwZSAhPSBUSEVSTUFMX1RZUEVfTk9ORSkKLQkJcGktPnRoZXJtYWxfcHJvdGVjdGlv biA9IHRydWU7Ci0JZWxzZQotCQlwaS0+dGhlcm1hbF9wcm90ZWN0aW9uID0gZmFsc2U7Ci0KLQlw aS0+Y2Fwc19keW5hbWljX2FjX3RpbWluZyA9IHRydWU7Ci0KLQlwaS0+dXZkX3Bvd2VyX2dhdGVk ID0gdHJ1ZTsKLQotCS8qIG1ha2Ugc3VyZSBkYyBsaW1pdHMgYXJlIHZhbGlkICovCi0JaWYgKChh ZGV2LT5wbS5kcG0uZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2RjLnNjbGsgPT0gMCkg fHwKLQkgICAgKGFkZXYtPnBtLmRwbS5keW5fc3RhdGUubWF4X2Nsb2NrX3ZvbHRhZ2Vfb25fZGMu bWNsayA9PSAwKSkKLQkJYWRldi0+cG0uZHBtLmR5bl9zdGF0ZS5tYXhfY2xvY2tfdm9sdGFnZV9v bl9kYyA9Ci0JCQlhZGV2LT5wbS5kcG0uZHluX3N0YXRlLm1heF9jbG9ja192b2x0YWdlX29uX2Fj OwotCi0JcGktPmZhbl9jdHJsX2lzX2luX2RlZmF1bHRfbW9kZSA9IHRydWU7Ci0KLQlyZXR1cm4g MDsKLX0KLQotc3RhdGljIHZvaWQKLWNpX2RwbV9kZWJ1Z2ZzX3ByaW50X2N1cnJlbnRfcGVyZm9y bWFuY2VfbGV2ZWwodm9pZCAqaGFuZGxlLAotCQkJCQkgICAgICAgc3RydWN0IHNlcV9maWxlICpt KQotewotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNl ICopaGFuZGxlOwotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsK LQlzdHJ1Y3QgYW1kZ3B1X3BzICpycHMgPSAmcGktPmN1cnJlbnRfcnBzOwotCXUzMiBzY2xrID0g Y2lfZ2V0X2F2ZXJhZ2Vfc2Nsa19mcmVxKGFkZXYpOwotCXUzMiBtY2xrID0gY2lfZ2V0X2F2ZXJh Z2VfbWNsa19mcmVxKGFkZXYpOwotCXUzMiBhY3Rpdml0eV9wZXJjZW50ID0gNTA7Ci0JaW50IHJl dDsKLQotCXJldCA9IGNpX3JlYWRfc21jX3NvZnRfcmVnaXN0ZXIoYWRldiwgb2Zmc2V0b2YoU01V N19Tb2Z0UmVnaXN0ZXJzLCBBdmVyYWdlR3JhcGhpY3NBKSwKLQkJCQkJJmFjdGl2aXR5X3BlcmNl bnQpOwotCi0JaWYgKHJldCA9PSAwKSB7Ci0JCWFjdGl2aXR5X3BlcmNlbnQgKz0gMHg4MDsKLQkJ YWN0aXZpdHlfcGVyY2VudCA+Pj0gODsKLQkJYWN0aXZpdHlfcGVyY2VudCA9IGFjdGl2aXR5X3Bl cmNlbnQgPiAxMDAgPyAxMDAgOiBhY3Rpdml0eV9wZXJjZW50OwotCX0KLQotCXNlcV9wcmludGYo bSwgInV2ZCAlc2FibGVkXG4iLCBwaS0+dXZkX3Bvd2VyX2dhdGVkID8gImRpcyIgOiAiZW4iKTsK LQlzZXFfcHJpbnRmKG0sICJ2Y2UgJXNhYmxlZFxuIiwgcnBzLT52Y2VfYWN0aXZlID8gImVuIiA6 ICJkaXMiKTsKLQlzZXFfcHJpbnRmKG0sICJwb3dlciBsZXZlbCBhdmcgICAgc2NsazogJXUgbWNs azogJXVcbiIsCi0JCSAgIHNjbGssIG1jbGspOwotCXNlcV9wcmludGYobSwgIkdQVSBsb2FkOiAl dSAlJVxuIiwgYWN0aXZpdHlfcGVyY2VudCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNpX2RwbV9wcmlu dF9wb3dlcl9zdGF0ZSh2b2lkICpoYW5kbGUsIHZvaWQgKmN1cnJlbnRfcHMpCi17Ci0Jc3RydWN0 IGFtZGdwdV9wcyAqcnBzID0gKHN0cnVjdCBhbWRncHVfcHMgKiljdXJyZW50X3BzOwotCXN0cnVj dCBjaV9wcyAqcHMgPSBjaV9nZXRfcHMocnBzKTsKLQlzdHJ1Y3QgY2lfcGwgKnBsOwotCWludCBp OwotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICop aGFuZGxlOwotCi0JYW1kZ3B1X2RwbV9wcmludF9jbGFzc19pbmZvKHJwcy0+Y2xhc3MsIHJwcy0+ Y2xhc3MyKTsKLQlhbWRncHVfZHBtX3ByaW50X2NhcF9pbmZvKHJwcy0+Y2Fwcyk7Ci0JcHJpbnRr KCJcdHV2ZCAgICB2Y2xrOiAlZCBkY2xrOiAlZFxuIiwgcnBzLT52Y2xrLCBycHMtPmRjbGspOwot CWZvciAoaSA9IDA7IGkgPCBwcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQ7IGkrKykgewotCQlw bCA9ICZwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW2ldOwotCQlwcmludGsoIlx0XHRwb3dlciBsZXZl bCAlZCAgICBzY2xrOiAldSBtY2xrOiAldSBwY2llIGdlbjogJXUgcGNpZSBsYW5lczogJXVcbiIs Ci0JCSAgICAgICBpLCBwbC0+c2NsaywgcGwtPm1jbGssIHBsLT5wY2llX2dlbiArIDEsIHBsLT5w Y2llX2xhbmUpOwotCX0KLQlhbWRncHVfZHBtX3ByaW50X3BzX3N0YXR1cyhhZGV2LCBycHMpOwot fQotCi1zdGF0aWMgaW5saW5lIGJvb2wgY2lfYXJlX3Bvd2VyX2xldmVsc19lcXVhbChjb25zdCBz dHJ1Y3QgY2lfcGwgKmNpX2NwbDEsCi0JCQkJCQljb25zdCBzdHJ1Y3QgY2lfcGwgKmNpX2NwbDIp Ci17Ci0JcmV0dXJuICgoY2lfY3BsMS0+bWNsayA9PSBjaV9jcGwyLT5tY2xrKSAmJgotCQkgIChj aV9jcGwxLT5zY2xrID09IGNpX2NwbDItPnNjbGspICYmCi0JCSAgKGNpX2NwbDEtPnBjaWVfZ2Vu ID09IGNpX2NwbDItPnBjaWVfZ2VuKSAmJgotCQkgIChjaV9jcGwxLT5wY2llX2xhbmUgPT0gY2lf Y3BsMi0+cGNpZV9sYW5lKSk7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfY2hlY2tfc3RhdGVfZXF1YWwo dm9pZCAqaGFuZGxlLAotCQkJCXZvaWQgKmN1cnJlbnRfcHMsCi0JCQkJdm9pZCAqcmVxdWVzdF9w cywKLQkJCQlib29sICplcXVhbCkKLXsKLQlzdHJ1Y3QgY2lfcHMgKmNpX2NwczsKLQlzdHJ1Y3Qg Y2lfcHMgKmNpX3JwczsKLQlpbnQgaTsKLQlzdHJ1Y3QgYW1kZ3B1X3BzICpjcHMgPSAoc3RydWN0 IGFtZGdwdV9wcyAqKWN1cnJlbnRfcHM7Ci0Jc3RydWN0IGFtZGdwdV9wcyAqcnBzID0gKHN0cnVj dCBhbWRncHVfcHMgKilyZXF1ZXN0X3BzOwotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0g KHN0cnVjdCBhbWRncHVfZGV2aWNlICopaGFuZGxlOwotCi0JaWYgKGFkZXYgPT0gTlVMTCB8fCBj cHMgPT0gTlVMTCB8fCBycHMgPT0gTlVMTCB8fCBlcXVhbCA9PSBOVUxMKQotCQlyZXR1cm4gLUVJ TlZBTDsKLQotCWNpX2NwcyA9IGNpX2dldF9wcygoc3RydWN0IGFtZGdwdV9wcyAqKWNwcyk7Ci0J Y2lfcnBzID0gY2lfZ2V0X3BzKChzdHJ1Y3QgYW1kZ3B1X3BzICopcnBzKTsKLQotCWlmIChjaV9j cHMgPT0gTlVMTCkgewotCQkqZXF1YWwgPSBmYWxzZTsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JaWYg KGNpX2Nwcy0+cGVyZm9ybWFuY2VfbGV2ZWxfY291bnQgIT0gY2lfcnBzLT5wZXJmb3JtYW5jZV9s ZXZlbF9jb3VudCkgewotCi0JCSplcXVhbCA9IGZhbHNlOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQlm b3IgKGkgPSAwOyBpIDwgY2lfY3BzLT5wZXJmb3JtYW5jZV9sZXZlbF9jb3VudDsgaSsrKSB7Ci0J CWlmICghY2lfYXJlX3Bvd2VyX2xldmVsc19lcXVhbCgmKGNpX2Nwcy0+cGVyZm9ybWFuY2VfbGV2 ZWxzW2ldKSwKLQkJCQkJJihjaV9ycHMtPnBlcmZvcm1hbmNlX2xldmVsc1tpXSkpKSB7Ci0JCQkq ZXF1YWwgPSBmYWxzZTsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JLyogSWYgYWxsIHBlcmZv cm1hbmNlIGxldmVscyBhcmUgdGhlIHNhbWUgdHJ5IHRvIHVzZSB0aGUgVVZEIGNsb2NrcyB0byBi cmVhayB0aGUgdGllLiovCi0JKmVxdWFsID0gKChjcHMtPnZjbGsgPT0gcnBzLT52Y2xrKSAmJiAo Y3BzLT5kY2xrID09IHJwcy0+ZGNsaykpOwotCSplcXVhbCAmPSAoKGNwcy0+ZXZjbGsgPT0gcnBz LT5ldmNsaykgJiYgKGNwcy0+ZWNjbGsgPT0gcnBzLT5lY2NsaykpOwotCi0JcmV0dXJuIDA7Ci19 Ci0KLXN0YXRpYyB1MzIgY2lfZHBtX2dldF9zY2xrKHZvaWQgKmhhbmRsZSwgYm9vbCBsb3cpCi17 Ci0Jc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKilo YW5kbGU7Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXN0 cnVjdCBjaV9wcyAqcmVxdWVzdGVkX3N0YXRlID0gY2lfZ2V0X3BzKCZwaS0+cmVxdWVzdGVkX3Jw cyk7Ci0KLQlpZiAobG93KQotCQlyZXR1cm4gcmVxdWVzdGVkX3N0YXRlLT5wZXJmb3JtYW5jZV9s ZXZlbHNbMF0uc2NsazsKLQllbHNlCi0JCXJldHVybiByZXF1ZXN0ZWRfc3RhdGUtPnBlcmZvcm1h bmNlX2xldmVsc1tyZXF1ZXN0ZWRfc3RhdGUtPnBlcmZvcm1hbmNlX2xldmVsX2NvdW50IC0gMV0u c2NsazsKLX0KLQotc3RhdGljIHUzMiBjaV9kcG1fZ2V0X21jbGsodm9pZCAqaGFuZGxlLCBib29s IGxvdykKLXsKLQlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2Rl dmljZSAqKWhhbmRsZTsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRl dik7Ci0Jc3RydWN0IGNpX3BzICpyZXF1ZXN0ZWRfc3RhdGUgPSBjaV9nZXRfcHMoJnBpLT5yZXF1 ZXN0ZWRfcnBzKTsKLQotCWlmIChsb3cpCi0JCXJldHVybiByZXF1ZXN0ZWRfc3RhdGUtPnBlcmZv cm1hbmNlX2xldmVsc1swXS5tY2xrOwotCWVsc2UKLQkJcmV0dXJuIHJlcXVlc3RlZF9zdGF0ZS0+ cGVyZm9ybWFuY2VfbGV2ZWxzW3JlcXVlc3RlZF9zdGF0ZS0+cGVyZm9ybWFuY2VfbGV2ZWxfY291 bnQgLSAxXS5tY2xrOwotfQotCi0vKiBnZXQgdGVtcGVyYXR1cmUgaW4gbWlsbGlkZWdyZWVzICov Ci1zdGF0aWMgaW50IGNpX2RwbV9nZXRfdGVtcCh2b2lkICpoYW5kbGUpCi17Ci0JdTMyIHRlbXA7 Ci0JaW50IGFjdHVhbF90ZW1wID0gMDsKLQlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChz dHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKLQotCXRlbXAgPSAoUlJFRzMyX1NNQyhpeENH X01VTFRfVEhFUk1BTF9TVEFUVVMpICYgQ0dfTVVMVF9USEVSTUFMX1NUQVRVU19fQ1RGX1RFTVBf TUFTSykgPj4KLQkJQ0dfTVVMVF9USEVSTUFMX1NUQVRVU19fQ1RGX1RFTVBfX1NISUZUOwotCi0J aWYgKHRlbXAgJiAweDIwMCkKLQkJYWN0dWFsX3RlbXAgPSAyNTU7Ci0JZWxzZQotCQlhY3R1YWxf dGVtcCA9IHRlbXAgJiAweDFmZjsKLQotCWFjdHVhbF90ZW1wID0gYWN0dWFsX3RlbXAgKiAxMDAw OwotCi0JcmV0dXJuIGFjdHVhbF90ZW1wOwotfQotCi1zdGF0aWMgaW50IGNpX3NldF90ZW1wZXJh dHVyZV9yYW5nZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlpbnQgcmV0OwotCi0J cmV0ID0gY2lfdGhlcm1hbF9lbmFibGVfYWxlcnQoYWRldiwgZmFsc2UpOwotCWlmIChyZXQpCi0J CXJldHVybiByZXQ7Ci0JcmV0ID0gY2lfdGhlcm1hbF9zZXRfdGVtcGVyYXR1cmVfcmFuZ2UoYWRl diwgQ0lTTEFORFNfVEVNUF9SQU5HRV9NSU4sCi0JCQkJCSAgICAgICBDSVNMQU5EU19URU1QX1JB TkdFX01BWCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQlyZXQgPSBjaV90aGVybWFsX2Vu YWJsZV9hbGVydChhZGV2LCB0cnVlKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCXJldHVy biByZXQ7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX2Vhcmx5X2luaXQodm9pZCAqaGFuZGxlKQot ewotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICop aGFuZGxlOwotCi0JYWRldi0+cG93ZXJwbGF5LnBwX2Z1bmNzID0gJmNpX2RwbV9mdW5jczsKLQlh ZGV2LT5wb3dlcnBsYXkucHBfaGFuZGxlID0gYWRldjsKLQljaV9kcG1fc2V0X2lycV9mdW5jcyhh ZGV2KTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV9sYXRlX2luaXQodm9p ZCAqaGFuZGxlKQotewotCWludCByZXQ7Ci0Jc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAo c3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0KLQlpZiAoIWFkZXYtPnBtLmRwbV9lbmFi bGVkKQotCQlyZXR1cm4gMDsKLQotCS8qIGluaXQgdGhlIHN5c2ZzIGFuZCBkZWJ1Z2ZzIGZpbGVz IGxhdGUgKi8KLQlyZXQgPSBhbWRncHVfcG1fc3lzZnNfaW5pdChhZGV2KTsKLQlpZiAocmV0KQot CQlyZXR1cm4gcmV0OwotCi0JcmV0ID0gY2lfc2V0X3RlbXBlcmF0dXJlX3JhbmdlKGFkZXYpOwot CWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBj aV9kcG1fc3dfaW5pdCh2b2lkICpoYW5kbGUpCi17Ci0JaW50IHJldDsKLQlzdHJ1Y3QgYW1kZ3B1 X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRsZTsKLQotCXJldCA9 IGFtZGdwdV9pcnFfYWRkX2lkKGFkZXYsIEFNREdQVV9JUlFfQ0xJRU5USURfTEVHQUNZLCAyMzAs Ci0JCQkJJmFkZXYtPnBtLmRwbS50aGVybWFsLmlycSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJl dDsKLQotCXJldCA9IGFtZGdwdV9pcnFfYWRkX2lkKGFkZXYsIEFNREdQVV9JUlFfQ0xJRU5USURf TEVHQUNZLCAyMzEsCi0JCQkJJmFkZXYtPnBtLmRwbS50aGVybWFsLmlycSk7Ci0JaWYgKHJldCkK LQkJcmV0dXJuIHJldDsKLQotCS8qIGRlZmF1bHQgdG8gYmFsYW5jZWQgc3RhdGUgKi8KLQlhZGV2 LT5wbS5kcG0uc3RhdGUgPSBQT1dFUl9TVEFURV9UWVBFX0JBTEFOQ0VEOwotCWFkZXYtPnBtLmRw bS51c2VyX3N0YXRlID0gUE9XRVJfU1RBVEVfVFlQRV9CQUxBTkNFRDsKLQlhZGV2LT5wbS5kcG0u Zm9yY2VkX2xldmVsID0gQU1EX0RQTV9GT1JDRURfTEVWRUxfQVVUTzsKLQlhZGV2LT5wbS5kZWZh dWx0X3NjbGsgPSBhZGV2LT5jbG9jay5kZWZhdWx0X3NjbGs7Ci0JYWRldi0+cG0uZGVmYXVsdF9t Y2xrID0gYWRldi0+Y2xvY2suZGVmYXVsdF9tY2xrOwotCWFkZXYtPnBtLmN1cnJlbnRfc2NsayA9 IGFkZXYtPmNsb2NrLmRlZmF1bHRfc2NsazsKLQlhZGV2LT5wbS5jdXJyZW50X21jbGsgPSBhZGV2 LT5jbG9jay5kZWZhdWx0X21jbGs7Ci0JYWRldi0+cG0uaW50X3RoZXJtYWxfdHlwZSA9IFRIRVJN QUxfVFlQRV9OT05FOwotCi0JcmV0ID0gY2lfZHBtX2luaXRfbWljcm9jb2RlKGFkZXYpOwotCWlm IChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlpZiAoYW1kZ3B1X2RwbSA9PSAwKQotCQlyZXR1cm4g MDsKLQotCUlOSVRfV09SSygmYWRldi0+cG0uZHBtLnRoZXJtYWwud29yaywgYW1kZ3B1X2RwbV90 aGVybWFsX3dvcmtfaGFuZGxlcik7Ci0JbXV0ZXhfbG9jaygmYWRldi0+cG0ubXV0ZXgpOwotCXJl dCA9IGNpX2RwbV9pbml0KGFkZXYpOwotCWlmIChyZXQpCi0JCWdvdG8gZHBtX2ZhaWxlZDsKLQlh ZGV2LT5wbS5kcG0uY3VycmVudF9wcyA9IGFkZXYtPnBtLmRwbS5yZXF1ZXN0ZWRfcHMgPSBhZGV2 LT5wbS5kcG0uYm9vdF9wczsKLQlpZiAoYW1kZ3B1X2RwbSA9PSAxKQotCQlhbWRncHVfcG1fcHJp bnRfcG93ZXJfc3RhdGVzKGFkZXYpOwotCW11dGV4X3VubG9jaygmYWRldi0+cG0ubXV0ZXgpOwot CURSTV9JTkZPKCJhbWRncHU6IGRwbSBpbml0aWFsaXplZFxuIik7Ci0KLQlyZXR1cm4gMDsKLQot ZHBtX2ZhaWxlZDoKLQljaV9kcG1fZmluaShhZGV2KTsKLQltdXRleF91bmxvY2soJmFkZXYtPnBt Lm11dGV4KTsKLQlEUk1fRVJST1IoImFtZGdwdTogZHBtIGluaXRpYWxpemF0aW9uIGZhaWxlZFxu Iik7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGludCBjaV9kcG1fc3dfZmluaSh2b2lkICpo YW5kbGUpCi17Ci0Jc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9k ZXZpY2UgKiloYW5kbGU7Ci0KLQlmbHVzaF93b3JrKCZhZGV2LT5wbS5kcG0udGhlcm1hbC53b3Jr KTsKLQotCW11dGV4X2xvY2soJmFkZXYtPnBtLm11dGV4KTsKLQljaV9kcG1fZmluaShhZGV2KTsK LQltdXRleF91bmxvY2soJmFkZXYtPnBtLm11dGV4KTsKLQotCXJlbGVhc2VfZmlybXdhcmUoYWRl di0+cG0uZncpOwotCWFkZXYtPnBtLmZ3ID0gTlVMTDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0 aWMgaW50IGNpX2RwbV9od19pbml0KHZvaWQgKmhhbmRsZSkKLXsKLQlpbnQgcmV0OwotCi0Jc3Ry dWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7 Ci0KLQlpZiAoIWFtZGdwdV9kcG0pIHsKLQkJcmV0ID0gY2lfdXBsb2FkX2Zpcm13YXJlKGFkZXYp OwotCQlpZiAocmV0KSB7Ci0JCQlEUk1fRVJST1IoImNpX3VwbG9hZF9maXJtd2FyZSBmYWlsZWRc biIpOwotCQkJcmV0dXJuIHJldDsKLQkJfQotCQljaV9kcG1fc3RhcnRfc21jKGFkZXYpOwotCQly ZXR1cm4gMDsKLQl9Ci0KLQltdXRleF9sb2NrKCZhZGV2LT5wbS5tdXRleCk7Ci0JY2lfZHBtX3Nl dHVwX2FzaWMoYWRldik7Ci0JcmV0ID0gY2lfZHBtX2VuYWJsZShhZGV2KTsKLQlpZiAocmV0KQot CQlhZGV2LT5wbS5kcG1fZW5hYmxlZCA9IGZhbHNlOwotCWVsc2UKLQkJYWRldi0+cG0uZHBtX2Vu YWJsZWQgPSB0cnVlOwotCW11dGV4X3VubG9jaygmYWRldi0+cG0ubXV0ZXgpOwotCi0JcmV0dXJu IHJldDsKLX0KLQotc3RhdGljIGludCBjaV9kcG1faHdfZmluaSh2b2lkICpoYW5kbGUpCi17Ci0J c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5k bGU7Ci0KLQlpZiAoYWRldi0+cG0uZHBtX2VuYWJsZWQpIHsKLQkJbXV0ZXhfbG9jaygmYWRldi0+ cG0ubXV0ZXgpOwotCQljaV9kcG1fZGlzYWJsZShhZGV2KTsKLQkJbXV0ZXhfdW5sb2NrKCZhZGV2 LT5wbS5tdXRleCk7Ci0JfSBlbHNlIHsKLQkJY2lfZHBtX3N0b3Bfc21jKGFkZXYpOwotCX0KLQot CXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV9zdXNwZW5kKHZvaWQgKmhhbmRsZSkK LXsKLQlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAq KWhhbmRsZTsKLQotCWlmIChhZGV2LT5wbS5kcG1fZW5hYmxlZCkgewotCQltdXRleF9sb2NrKCZh ZGV2LT5wbS5tdXRleCk7Ci0JCWFtZGdwdV9pcnFfcHV0KGFkZXYsICZhZGV2LT5wbS5kcG0udGhl cm1hbC5pcnEsCi0JCQkgICAgICAgQU1ER1BVX1RIRVJNQUxfSVJRX0xPV19UT19ISUdIKTsKLQkJ YW1kZ3B1X2lycV9wdXQoYWRldiwgJmFkZXYtPnBtLmRwbS50aGVybWFsLmlycSwKLQkJCSAgICAg ICBBTURHUFVfVEhFUk1BTF9JUlFfSElHSF9UT19MT1cpOwotCQlhZGV2LT5wbS5kcG0ubGFzdF91 c2VyX3N0YXRlID0gYWRldi0+cG0uZHBtLnVzZXJfc3RhdGU7Ci0JCWFkZXYtPnBtLmRwbS5sYXN0 X3N0YXRlID0gYWRldi0+cG0uZHBtLnN0YXRlOwotCQlhZGV2LT5wbS5kcG0udXNlcl9zdGF0ZSA9 IFBPV0VSX1NUQVRFX1RZUEVfSU5URVJOQUxfQk9PVDsKLQkJYWRldi0+cG0uZHBtLnN0YXRlID0g UE9XRVJfU1RBVEVfVFlQRV9JTlRFUk5BTF9CT09UOwotCQltdXRleF91bmxvY2soJmFkZXYtPnBt Lm11dGV4KTsKLQkJYW1kZ3B1X3BtX2NvbXB1dGVfY2xvY2tzKGFkZXYpOwotCi0JfQotCi0JcmV0 dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX3Jlc3VtZSh2b2lkICpoYW5kbGUpCi17Ci0J aW50IHJldDsKLQlzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2Rl dmljZSAqKWhhbmRsZTsKLQotCWlmIChhZGV2LT5wbS5kcG1fZW5hYmxlZCkgewotCQkvKiBhc2lj IGluaXQgd2lsbCByZXNldCB0byB0aGUgYm9vdCBzdGF0ZSAqLwotCQltdXRleF9sb2NrKCZhZGV2 LT5wbS5tdXRleCk7Ci0JCWNpX2RwbV9zZXR1cF9hc2ljKGFkZXYpOwotCQlyZXQgPSBjaV9kcG1f ZW5hYmxlKGFkZXYpOwotCQlpZiAocmV0KQotCQkJYWRldi0+cG0uZHBtX2VuYWJsZWQgPSBmYWxz ZTsKLQkJZWxzZQotCQkJYWRldi0+cG0uZHBtX2VuYWJsZWQgPSB0cnVlOwotCQlhZGV2LT5wbS5k cG0udXNlcl9zdGF0ZSA9IGFkZXYtPnBtLmRwbS5sYXN0X3VzZXJfc3RhdGU7Ci0JCWFkZXYtPnBt LmRwbS5zdGF0ZSA9IGFkZXYtPnBtLmRwbS5sYXN0X3N0YXRlOwotCQltdXRleF91bmxvY2soJmFk ZXYtPnBtLm11dGV4KTsKLQkJaWYgKGFkZXYtPnBtLmRwbV9lbmFibGVkKQotCQkJYW1kZ3B1X3Bt X2NvbXB1dGVfY2xvY2tzKGFkZXYpOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGJvb2wg Y2lfZHBtX2lzX2lkbGUodm9pZCAqaGFuZGxlKQotewotCS8qIFhYWCAqLwotCXJldHVybiB0cnVl OwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV93YWl0X2Zvcl9pZGxlKHZvaWQgKmhhbmRsZSkKLXsK LQkvKiBYWFggKi8KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9kcG1fc29mdF9yZXNl dCh2b2lkICpoYW5kbGUpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX3Nl dF9pbnRlcnJ1cHRfc3RhdGUoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgICAg c3RydWN0IGFtZGdwdV9pcnFfc3JjICpzb3VyY2UsCi0JCQkJICAgICAgdW5zaWduZWQgdHlwZSwK LQkJCQkgICAgICBlbnVtIGFtZGdwdV9pbnRlcnJ1cHRfc3RhdGUgc3RhdGUpCi17Ci0JdTMyIGNn X3RoZXJtYWxfaW50OwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBBTURHUFVfVEhFUk1BTF9J UlFfTE9XX1RPX0hJR0g6Ci0JCXN3aXRjaCAoc3RhdGUpIHsKLQkJY2FzZSBBTURHUFVfSVJRX1NU QVRFX0RJU0FCTEU6Ci0JCQljZ190aGVybWFsX2ludCA9IFJSRUczMl9TTUMoaXhDR19USEVSTUFM X0lOVCk7Ci0JCQljZ190aGVybWFsX2ludCB8PSBDR19USEVSTUFMX0lOVF9DVFJMX19USEVSTV9J TlRIX01BU0tfTUFTSzsKLQkJCVdSRUczMl9TTUMoaXhDR19USEVSTUFMX0lOVCwgY2dfdGhlcm1h bF9pbnQpOwotCQkJYnJlYWs7Ci0JCWNhc2UgQU1ER1BVX0lSUV9TVEFURV9FTkFCTEU6Ci0JCQlj Z190aGVybWFsX2ludCA9IFJSRUczMl9TTUMoaXhDR19USEVSTUFMX0lOVCk7Ci0JCQljZ190aGVy bWFsX2ludCAmPSB+Q0dfVEhFUk1BTF9JTlRfQ1RSTF9fVEhFUk1fSU5USF9NQVNLX01BU0s7Ci0J CQlXUkVHMzJfU01DKGl4Q0dfVEhFUk1BTF9JTlQsIGNnX3RoZXJtYWxfaW50KTsKLQkJCWJyZWFr OwotCQlkZWZhdWx0OgotCQkJYnJlYWs7Ci0JCX0KLQkJYnJlYWs7Ci0KLQljYXNlIEFNREdQVV9U SEVSTUFMX0lSUV9ISUdIX1RPX0xPVzoKLQkJc3dpdGNoIChzdGF0ZSkgewotCQljYXNlIEFNREdQ VV9JUlFfU1RBVEVfRElTQUJMRToKLQkJCWNnX3RoZXJtYWxfaW50ID0gUlJFRzMyX1NNQyhpeENH X1RIRVJNQUxfSU5UKTsKLQkJCWNnX3RoZXJtYWxfaW50IHw9IENHX1RIRVJNQUxfSU5UX0NUUkxf X1RIRVJNX0lOVExfTUFTS19NQVNLOwotCQkJV1JFRzMyX1NNQyhpeENHX1RIRVJNQUxfSU5ULCBj Z190aGVybWFsX2ludCk7Ci0JCQlicmVhazsKLQkJY2FzZSBBTURHUFVfSVJRX1NUQVRFX0VOQUJM RToKLQkJCWNnX3RoZXJtYWxfaW50ID0gUlJFRzMyX1NNQyhpeENHX1RIRVJNQUxfSU5UKTsKLQkJ CWNnX3RoZXJtYWxfaW50ICY9IH5DR19USEVSTUFMX0lOVF9DVFJMX19USEVSTV9JTlRMX01BU0tf TUFTSzsKLQkJCVdSRUczMl9TTUMoaXhDR19USEVSTUFMX0lOVCwgY2dfdGhlcm1hbF9pbnQpOwot CQkJYnJlYWs7Ci0JCWRlZmF1bHQ6Ci0JCQlicmVhazsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1 bHQ6Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9kcG1fcHJv Y2Vzc19pbnRlcnJ1cHQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkJICAgIHN0cnVj dCBhbWRncHVfaXJxX3NyYyAqc291cmNlLAotCQkJCSAgICBzdHJ1Y3QgYW1kZ3B1X2l2X2VudHJ5 ICplbnRyeSkKLXsKLQlib29sIHF1ZXVlX3RoZXJtYWwgPSBmYWxzZTsKLQotCWlmIChlbnRyeSA9 PSBOVUxMKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoZW50cnktPnNyY19pZCkgewot CWNhc2UgMjMwOiAvKiB0aGVybWFsIGxvdyB0byBoaWdoICovCi0JCURSTV9ERUJVRygiSUg6IHRo ZXJtYWwgbG93IHRvIGhpZ2hcbiIpOwotCQlhZGV2LT5wbS5kcG0udGhlcm1hbC5oaWdoX3RvX2xv dyA9IGZhbHNlOwotCQlxdWV1ZV90aGVybWFsID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAyMzE6 IC8qIHRoZXJtYWwgaGlnaCB0byBsb3cgKi8KLQkJRFJNX0RFQlVHKCJJSDogdGhlcm1hbCBoaWdo IHRvIGxvd1xuIik7Ci0JCWFkZXYtPnBtLmRwbS50aGVybWFsLmhpZ2hfdG9fbG93ID0gdHJ1ZTsK LQkJcXVldWVfdGhlcm1hbCA9IHRydWU7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWJyZWFrOwot CX0KLQotCWlmIChxdWV1ZV90aGVybWFsKQotCQlzY2hlZHVsZV93b3JrKCZhZGV2LT5wbS5kcG0u dGhlcm1hbC53b3JrKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV9zZXRf Y2xvY2tnYXRpbmdfc3RhdGUodm9pZCAqaGFuZGxlLAotCQkJCQkgIGVudW0gYW1kX2Nsb2NrZ2F0 aW5nX3N0YXRlIHN0YXRlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2RwbV9z ZXRfcG93ZXJnYXRpbmdfc3RhdGUodm9pZCAqaGFuZGxlLAotCQkJCQkgIGVudW0gYW1kX3Bvd2Vy Z2F0aW5nX3N0YXRlIHN0YXRlKQotewotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGNpX2Rw bV9wcmludF9jbG9ja19sZXZlbHModm9pZCAqaGFuZGxlLAotCQllbnVtIHBwX2Nsb2NrX3R5cGUg dHlwZSwgY2hhciAqYnVmKQotewotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVj dCBhbWRncHVfZGV2aWNlICopaGFuZGxlOwotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNp X2dldF9waShhZGV2KTsKLQlzdHJ1Y3QgY2lfc2luZ2xlX2RwbV90YWJsZSAqc2Nsa190YWJsZSA9 ICZwaS0+ZHBtX3RhYmxlLnNjbGtfdGFibGU7Ci0Jc3RydWN0IGNpX3NpbmdsZV9kcG1fdGFibGUg Km1jbGtfdGFibGUgPSAmcGktPmRwbV90YWJsZS5tY2xrX3RhYmxlOwotCXN0cnVjdCBjaV9zaW5n bGVfZHBtX3RhYmxlICpwY2llX3RhYmxlID0gJnBpLT5kcG1fdGFibGUucGNpZV9zcGVlZF90YWJs ZTsKLQotCWludCBpLCBub3csIHNpemUgPSAwOwotCXVpbnQzMl90IGNsb2NrLCBwY2llX3NwZWVk OwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBQUF9TQ0xLOgotCQlhbWRncHVfY2lfc2VuZF9t c2dfdG9fc21jKGFkZXYsIFBQU01DX01TR19BUElfR2V0U2Nsa0ZyZXF1ZW5jeSk7Ci0JCWNsb2Nr ID0gUlJFRzMyKG1tU01DX01TR19BUkdfMCk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHNjbGtfdGFi bGUtPmNvdW50OyBpKyspIHsKLQkJCWlmIChjbG9jayA+IHNjbGtfdGFibGUtPmRwbV9sZXZlbHNb aV0udmFsdWUpCi0JCQkJY29udGludWU7Ci0JCQlicmVhazsKLQkJfQotCQlub3cgPSBpOwotCi0J CWZvciAoaSA9IDA7IGkgPCBzY2xrX3RhYmxlLT5jb3VudDsgaSsrKQotCQkJc2l6ZSArPSBzcHJp bnRmKGJ1ZiArIHNpemUsICIlZDogJXVNaHogJXNcbiIsCi0JCQkJCWksIHNjbGtfdGFibGUtPmRw bV9sZXZlbHNbaV0udmFsdWUgLyAxMDAsCi0JCQkJCShpID09IG5vdykgPyAiKiIgOiAiIik7Ci0J CWJyZWFrOwotCWNhc2UgUFBfTUNMSzoKLQkJYW1kZ3B1X2NpX3NlbmRfbXNnX3RvX3NtYyhhZGV2 LCBQUFNNQ19NU0dfQVBJX0dldE1jbGtGcmVxdWVuY3kpOwotCQljbG9jayA9IFJSRUczMihtbVNN Q19NU0dfQVJHXzApOwotCi0JCWZvciAoaSA9IDA7IGkgPCBtY2xrX3RhYmxlLT5jb3VudDsgaSsr KSB7Ci0JCQlpZiAoY2xvY2sgPiBtY2xrX3RhYmxlLT5kcG1fbGV2ZWxzW2ldLnZhbHVlKQotCQkJ CWNvbnRpbnVlOwotCQkJYnJlYWs7Ci0JCX0KLQkJbm93ID0gaTsKLQotCQlmb3IgKGkgPSAwOyBp IDwgbWNsa190YWJsZS0+Y291bnQ7IGkrKykKLQkJCXNpemUgKz0gc3ByaW50ZihidWYgKyBzaXpl LCAiJWQ6ICV1TWh6ICVzXG4iLAotCQkJCQlpLCBtY2xrX3RhYmxlLT5kcG1fbGV2ZWxzW2ldLnZh bHVlIC8gMTAwLAotCQkJCQkoaSA9PSBub3cpID8gIioiIDogIiIpOwotCQlicmVhazsKLQljYXNl IFBQX1BDSUU6Ci0JCXBjaWVfc3BlZWQgPSBjaV9nZXRfY3VycmVudF9wY2llX3NwZWVkKGFkZXYp OwotCQlmb3IgKGkgPSAwOyBpIDwgcGNpZV90YWJsZS0+Y291bnQ7IGkrKykgewotCQkJaWYgKHBj aWVfc3BlZWQgIT0gcGNpZV90YWJsZS0+ZHBtX2xldmVsc1tpXS52YWx1ZSkKLQkJCQljb250aW51 ZTsKLQkJCWJyZWFrOwotCQl9Ci0JCW5vdyA9IGk7Ci0KLQkJZm9yIChpID0gMDsgaSA8IHBjaWVf dGFibGUtPmNvdW50OyBpKyspCi0JCQlzaXplICs9IHNwcmludGYoYnVmICsgc2l6ZSwgIiVkOiAl cyAlc1xuIiwgaSwKLQkJCQkJKHBjaWVfdGFibGUtPmRwbV9sZXZlbHNbaV0udmFsdWUgPT0gMCkg PyAiMi41R1QvcywgeDEiIDoKLQkJCQkJKHBjaWVfdGFibGUtPmRwbV9sZXZlbHNbaV0udmFsdWUg PT0gMSkgPyAiNS4wR1QvcywgeDE2IiA6Ci0JCQkJCShwY2llX3RhYmxlLT5kcG1fbGV2ZWxzW2ld LnZhbHVlID09IDIpID8gIjguMEdUL3MsIHgxNiIgOiAiIiwKLQkJCQkJKGkgPT0gbm93KSA/ICIq IiA6ICIiKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIHNp emU7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX2ZvcmNlX2Nsb2NrX2xldmVsKHZvaWQgKmhhbmRs ZSwKLQkJZW51bSBwcF9jbG9ja190eXBlIHR5cGUsIHVpbnQzMl90IG1hc2spCi17Ci0Jc3RydWN0 IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0J c3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCi0JaWYgKGFkZXYt PnBtLmRwbS5mb3JjZWRfbGV2ZWwgIT0gQU1EX0RQTV9GT1JDRURfTEVWRUxfTUFOVUFMKQotCQly ZXR1cm4gLUVJTlZBTDsKLQotCWlmIChtYXNrID09IDApCi0JCXJldHVybiAtRUlOVkFMOwotCi0J c3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBQUF9TQ0xLOgotCQlpZiAoIXBpLT5zY2xrX2RwbV9rZXlf ZGlzYWJsZWQpCi0JCQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKGFk ZXYsCi0JCQkJCVBQU01DX01TR19TQ0xLRFBNX1NldEVuYWJsZWRNYXNrLAotCQkJCQlwaS0+ZHBt X2xldmVsX2VuYWJsZV9tYXNrLnNjbGtfZHBtX2VuYWJsZV9tYXNrICYgbWFzayk7Ci0JCWJyZWFr OwotCi0JY2FzZSBQUF9NQ0xLOgotCQlpZiAoIXBpLT5tY2xrX2RwbV9rZXlfZGlzYWJsZWQpCi0J CQlhbWRncHVfY2lfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKGFkZXYsCi0JCQkJCVBQ U01DX01TR19NQ0xLRFBNX1NldEVuYWJsZWRNYXNrLAotCQkJCQlwaS0+ZHBtX2xldmVsX2VuYWJs ZV9tYXNrLm1jbGtfZHBtX2VuYWJsZV9tYXNrICYgbWFzayk7Ci0JCWJyZWFrOwotCi0JY2FzZSBQ UF9QQ0lFOgotCXsKLQkJdWludDMyX3QgdG1wID0gbWFzayAmIHBpLT5kcG1fbGV2ZWxfZW5hYmxl X21hc2sucGNpZV9kcG1fZW5hYmxlX21hc2s7Ci0KLQkJaWYgKCFwaS0+cGNpZV9kcG1fa2V5X2Rp c2FibGVkKSB7Ci0JCQlpZiAoZmxzKHRtcCkgIT0gZmZzKHRtcCkpCi0JCQkJYW1kZ3B1X2NpX3Nl bmRfbXNnX3RvX3NtYyhhZGV2LCBQUFNNQ19NU0dfUENJZURQTV9VbkZvcmNlTGV2ZWwpOwotCQkJ ZWxzZQotCQkJCWFtZGdwdV9jaV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoYWRldiwK LQkJCQkJUFBTTUNfTVNHX1BDSWVEUE1fRm9yY2VMZXZlbCwKLQkJCQkJZmxzKHRtcCkgLSAxKTsK LQkJfQotCQlicmVhazsKLQl9Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIDA7 Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX2dldF9zY2xrX29kKHZvaWQgKmhhbmRsZSkKLXsKLQlz dHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiA9IChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqKWhhbmRs ZTsKLQlzdHJ1Y3QgY2lfcG93ZXJfaW5mbyAqcGkgPSBjaV9nZXRfcGkoYWRldik7Ci0Jc3RydWN0 IGNpX3NpbmdsZV9kcG1fdGFibGUgKnNjbGtfdGFibGUgPSAmKHBpLT5kcG1fdGFibGUuc2Nsa190 YWJsZSk7Ci0Jc3RydWN0IGNpX3NpbmdsZV9kcG1fdGFibGUgKmdvbGRlbl9zY2xrX3RhYmxlID0K LQkJCSYocGktPmdvbGRlbl9kcG1fdGFibGUuc2Nsa190YWJsZSk7Ci0JaW50IHZhbHVlOwotCi0J dmFsdWUgPSAoc2Nsa190YWJsZS0+ZHBtX2xldmVsc1tzY2xrX3RhYmxlLT5jb3VudCAtIDFdLnZh bHVlIC0KLQkJCWdvbGRlbl9zY2xrX3RhYmxlLT5kcG1fbGV2ZWxzW2dvbGRlbl9zY2xrX3RhYmxl LT5jb3VudCAtIDFdLnZhbHVlKSAqCi0JCQkxMDAgLwotCQkJZ29sZGVuX3NjbGtfdGFibGUtPmRw bV9sZXZlbHNbZ29sZGVuX3NjbGtfdGFibGUtPmNvdW50IC0gMV0udmFsdWU7Ci0KLQlyZXR1cm4g dmFsdWU7Ci19Ci0KLXN0YXRpYyBpbnQgY2lfZHBtX3NldF9zY2xrX29kKHZvaWQgKmhhbmRsZSwg dWludDMyX3QgdmFsdWUpCi17Ci0Jc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0 IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0Jc3RydWN0IGNpX3Bvd2VyX2luZm8gKnBpID0gY2lf Z2V0X3BpKGFkZXYpOwotCXN0cnVjdCBjaV9wcyAqcHMgPSBjaV9nZXRfcHMoYWRldi0+cG0uZHBt LnJlcXVlc3RlZF9wcyk7Ci0Jc3RydWN0IGNpX3NpbmdsZV9kcG1fdGFibGUgKmdvbGRlbl9zY2xr X3RhYmxlID0KLQkJCSYocGktPmdvbGRlbl9kcG1fdGFibGUuc2Nsa190YWJsZSk7Ci0KLQlpZiAo dmFsdWUgPiAyMCkKLQkJdmFsdWUgPSAyMDsKLQotCXBzLT5wZXJmb3JtYW5jZV9sZXZlbHNbcHMt PnBlcmZvcm1hbmNlX2xldmVsX2NvdW50IC0gMV0uc2NsayA9Ci0JCQlnb2xkZW5fc2Nsa190YWJs ZS0+ZHBtX2xldmVsc1tnb2xkZW5fc2Nsa190YWJsZS0+Y291bnQgLSAxXS52YWx1ZSAqCi0JCQl2 YWx1ZSAvIDEwMCArCi0JCQlnb2xkZW5fc2Nsa190YWJsZS0+ZHBtX2xldmVsc1tnb2xkZW5fc2Ns a190YWJsZS0+Y291bnQgLSAxXS52YWx1ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IGNpX2RwbV9nZXRfbWNsa19vZCh2b2lkICpoYW5kbGUpCi17Ci0Jc3RydWN0IGFtZGdwdV9kZXZp Y2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0Jc3RydWN0IGNpX3Bv d2VyX2luZm8gKnBpID0gY2lfZ2V0X3BpKGFkZXYpOwotCXN0cnVjdCBjaV9zaW5nbGVfZHBtX3Rh YmxlICptY2xrX3RhYmxlID0gJihwaS0+ZHBtX3RhYmxlLm1jbGtfdGFibGUpOwotCXN0cnVjdCBj aV9zaW5nbGVfZHBtX3RhYmxlICpnb2xkZW5fbWNsa190YWJsZSA9Ci0JCQkmKHBpLT5nb2xkZW5f ZHBtX3RhYmxlLm1jbGtfdGFibGUpOwotCWludCB2YWx1ZTsKLQotCXZhbHVlID0gKG1jbGtfdGFi bGUtPmRwbV9sZXZlbHNbbWNsa190YWJsZS0+Y291bnQgLSAxXS52YWx1ZSAtCi0JCQlnb2xkZW5f bWNsa190YWJsZS0+ZHBtX2xldmVsc1tnb2xkZW5fbWNsa190YWJsZS0+Y291bnQgLSAxXS52YWx1 ZSkgKgotCQkJMTAwIC8KLQkJCWdvbGRlbl9tY2xrX3RhYmxlLT5kcG1fbGV2ZWxzW2dvbGRlbl9t Y2xrX3RhYmxlLT5jb3VudCAtIDFdLnZhbHVlOwotCi0JcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0 aWMgaW50IGNpX2RwbV9zZXRfbWNsa19vZCh2b2lkICpoYW5kbGUsIHVpbnQzMl90IHZhbHVlKQot ewotCXN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gKHN0cnVjdCBhbWRncHVfZGV2aWNlICop aGFuZGxlOwotCXN0cnVjdCBjaV9wb3dlcl9pbmZvICpwaSA9IGNpX2dldF9waShhZGV2KTsKLQlz dHJ1Y3QgY2lfcHMgKnBzID0gY2lfZ2V0X3BzKGFkZXYtPnBtLmRwbS5yZXF1ZXN0ZWRfcHMpOwot CXN0cnVjdCBjaV9zaW5nbGVfZHBtX3RhYmxlICpnb2xkZW5fbWNsa190YWJsZSA9Ci0JCQkmKHBp LT5nb2xkZW5fZHBtX3RhYmxlLm1jbGtfdGFibGUpOwotCi0JaWYgKHZhbHVlID4gMjApCi0JCXZh bHVlID0gMjA7Ci0KLQlwcy0+cGVyZm9ybWFuY2VfbGV2ZWxzW3BzLT5wZXJmb3JtYW5jZV9sZXZl bF9jb3VudCAtIDFdLm1jbGsgPQotCQkJZ29sZGVuX21jbGtfdGFibGUtPmRwbV9sZXZlbHNbZ29s ZGVuX21jbGtfdGFibGUtPmNvdW50IC0gMV0udmFsdWUgKgotCQkJdmFsdWUgLyAxMDAgKwotCQkJ Z29sZGVuX21jbGtfdGFibGUtPmRwbV9sZXZlbHNbZ29sZGVuX21jbGtfdGFibGUtPmNvdW50IC0g MV0udmFsdWU7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaV9kcG1fcmVhZF9zZW5z b3Iodm9pZCAqaGFuZGxlLCBpbnQgaWR4LAotCQkJICAgICAgdm9pZCAqdmFsdWUsIGludCAqc2l6 ZSkKLXsKLQl1MzIgYWN0aXZpdHlfcGVyY2VudCA9IDUwOwotCWludCByZXQ7Ci0Jc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYgPSAoc3RydWN0IGFtZGdwdV9kZXZpY2UgKiloYW5kbGU7Ci0KLQkv KiBzaXplIG11c3QgYmUgYXQgbGVhc3QgNCBieXRlcyBmb3IgYWxsIHNlbnNvcnMgKi8KLQlpZiAo KnNpemUgPCA0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAoaWR4KSB7Ci0JY2FzZSBB TURHUFVfUFBfU0VOU09SX0dGWF9TQ0xLOgotCQkqKCh1aW50MzJfdCAqKXZhbHVlKSA9IGNpX2dl dF9hdmVyYWdlX3NjbGtfZnJlcShhZGV2KTsKLQkJKnNpemUgPSA0OwotCQlyZXR1cm4gMDsKLQlj YXNlIEFNREdQVV9QUF9TRU5TT1JfR0ZYX01DTEs6Ci0JCSooKHVpbnQzMl90ICopdmFsdWUpID0g Y2lfZ2V0X2F2ZXJhZ2VfbWNsa19mcmVxKGFkZXYpOwotCQkqc2l6ZSA9IDQ7Ci0JCXJldHVybiAw OwotCWNhc2UgQU1ER1BVX1BQX1NFTlNPUl9HUFVfVEVNUDoKLQkJKigodWludDMyX3QgKil2YWx1 ZSkgPSBjaV9kcG1fZ2V0X3RlbXAoYWRldik7Ci0JCSpzaXplID0gNDsKLQkJcmV0dXJuIDA7Ci0J Y2FzZSBBTURHUFVfUFBfU0VOU09SX0dQVV9MT0FEOgotCQlyZXQgPSBjaV9yZWFkX3NtY19zb2Z0 X3JlZ2lzdGVyKGFkZXYsCi0JCQkJCQlvZmZzZXRvZihTTVU3X1NvZnRSZWdpc3RlcnMsCi0JCQkJ CQkJIEF2ZXJhZ2VHcmFwaGljc0EpLAotCQkJCQkJJmFjdGl2aXR5X3BlcmNlbnQpOwotCQlpZiAo cmV0ID09IDApIHsKLQkJCWFjdGl2aXR5X3BlcmNlbnQgKz0gMHg4MDsKLQkJCWFjdGl2aXR5X3Bl cmNlbnQgPj49IDg7Ci0JCQlhY3Rpdml0eV9wZXJjZW50ID0KLQkJCQlhY3Rpdml0eV9wZXJjZW50 ID4gMTAwID8gMTAwIDogYWN0aXZpdHlfcGVyY2VudDsKLQkJfQotCQkqKCh1aW50MzJfdCAqKXZh bHVlKSA9IGFjdGl2aXR5X3BlcmNlbnQ7Ci0JCSpzaXplID0gNDsKLQkJcmV0dXJuIDA7Ci0JZGVm YXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotfQotCi1zdGF0aWMgaW50IGNpX3NldF9wb3dl cmdhdGluZ19ieV9zbXUodm9pZCAqaGFuZGxlLAotCQkJCXVpbnQzMl90IGJsb2NrX3R5cGUsIGJv b2wgZ2F0ZSkKLXsKLQlzd2l0Y2ggKGJsb2NrX3R5cGUpIHsKLQljYXNlIEFNRF9JUF9CTE9DS19U WVBFX1VWRDoKLQkJY2lfZHBtX3Bvd2VyZ2F0ZV91dmQoaGFuZGxlLCBnYXRlKTsKLQkJYnJlYWs7 Ci0JZGVmYXVsdDoKLQkJYnJlYWs7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgY29uc3Qg c3RydWN0IGFtZF9pcF9mdW5jcyBjaV9kcG1faXBfZnVuY3MgPSB7Ci0JLm5hbWUgPSAiY2lfZHBt IiwKLQkuZWFybHlfaW5pdCA9IGNpX2RwbV9lYXJseV9pbml0LAotCS5sYXRlX2luaXQgPSBjaV9k cG1fbGF0ZV9pbml0LAotCS5zd19pbml0ID0gY2lfZHBtX3N3X2luaXQsCi0JLnN3X2ZpbmkgPSBj aV9kcG1fc3dfZmluaSwKLQkuaHdfaW5pdCA9IGNpX2RwbV9od19pbml0LAotCS5od19maW5pID0g Y2lfZHBtX2h3X2ZpbmksCi0JLnN1c3BlbmQgPSBjaV9kcG1fc3VzcGVuZCwKLQkucmVzdW1lID0g Y2lfZHBtX3Jlc3VtZSwKLQkuaXNfaWRsZSA9IGNpX2RwbV9pc19pZGxlLAotCS53YWl0X2Zvcl9p ZGxlID0gY2lfZHBtX3dhaXRfZm9yX2lkbGUsCi0JLnNvZnRfcmVzZXQgPSBjaV9kcG1fc29mdF9y ZXNldCwKLQkuc2V0X2Nsb2NrZ2F0aW5nX3N0YXRlID0gY2lfZHBtX3NldF9jbG9ja2dhdGluZ19z dGF0ZSwKLQkuc2V0X3Bvd2VyZ2F0aW5nX3N0YXRlID0gY2lfZHBtX3NldF9wb3dlcmdhdGluZ19z dGF0ZSwKLX07Ci0KLWNvbnN0IHN0cnVjdCBhbWRncHVfaXBfYmxvY2tfdmVyc2lvbiBjaV9zbXVf aXBfYmxvY2sgPQotewotCS50eXBlID0gQU1EX0lQX0JMT0NLX1RZUEVfU01DLAotCS5tYWpvciA9 IDcsCi0JLm1pbm9yID0gMCwKLQkucmV2ID0gMCwKLQkuZnVuY3MgPSAmY2lfZHBtX2lwX2Z1bmNz LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbWRfcG1fZnVuY3MgY2lfZHBtX2Z1bmNzID0g ewotCS5wcmVfc2V0X3Bvd2VyX3N0YXRlID0gJmNpX2RwbV9wcmVfc2V0X3Bvd2VyX3N0YXRlLAot CS5zZXRfcG93ZXJfc3RhdGUgPSAmY2lfZHBtX3NldF9wb3dlcl9zdGF0ZSwKLQkucG9zdF9zZXRf cG93ZXJfc3RhdGUgPSAmY2lfZHBtX3Bvc3Rfc2V0X3Bvd2VyX3N0YXRlLAotCS5kaXNwbGF5X2Nv bmZpZ3VyYXRpb25fY2hhbmdlZCA9ICZjaV9kcG1fZGlzcGxheV9jb25maWd1cmF0aW9uX2NoYW5n ZWQsCi0JLmdldF9zY2xrID0gJmNpX2RwbV9nZXRfc2NsaywKLQkuZ2V0X21jbGsgPSAmY2lfZHBt X2dldF9tY2xrLAotCS5wcmludF9wb3dlcl9zdGF0ZSA9ICZjaV9kcG1fcHJpbnRfcG93ZXJfc3Rh dGUsCi0JLmRlYnVnZnNfcHJpbnRfY3VycmVudF9wZXJmb3JtYW5jZV9sZXZlbCA9ICZjaV9kcG1f ZGVidWdmc19wcmludF9jdXJyZW50X3BlcmZvcm1hbmNlX2xldmVsLAotCS5mb3JjZV9wZXJmb3Jt YW5jZV9sZXZlbCA9ICZjaV9kcG1fZm9yY2VfcGVyZm9ybWFuY2VfbGV2ZWwsCi0JLnZibGFua190 b29fc2hvcnQgPSAmY2lfZHBtX3ZibGFua190b29fc2hvcnQsCi0JLnNldF9wb3dlcmdhdGluZ19i eV9zbXUgPSAmY2lfc2V0X3Bvd2VyZ2F0aW5nX2J5X3NtdSwKLQkuc2V0X2Zhbl9jb250cm9sX21v ZGUgPSAmY2lfZHBtX3NldF9mYW5fY29udHJvbF9tb2RlLAotCS5nZXRfZmFuX2NvbnRyb2xfbW9k ZSA9ICZjaV9kcG1fZ2V0X2Zhbl9jb250cm9sX21vZGUsCi0JLnNldF9mYW5fc3BlZWRfcGVyY2Vu dCA9ICZjaV9kcG1fc2V0X2Zhbl9zcGVlZF9wZXJjZW50LAotCS5nZXRfZmFuX3NwZWVkX3BlcmNl bnQgPSAmY2lfZHBtX2dldF9mYW5fc3BlZWRfcGVyY2VudCwKLQkucHJpbnRfY2xvY2tfbGV2ZWxz ID0gY2lfZHBtX3ByaW50X2Nsb2NrX2xldmVscywKLQkuZm9yY2VfY2xvY2tfbGV2ZWwgPSBjaV9k cG1fZm9yY2VfY2xvY2tfbGV2ZWwsCi0JLmdldF9zY2xrX29kID0gY2lfZHBtX2dldF9zY2xrX29k LAotCS5zZXRfc2Nsa19vZCA9IGNpX2RwbV9zZXRfc2Nsa19vZCwKLQkuZ2V0X21jbGtfb2QgPSBj aV9kcG1fZ2V0X21jbGtfb2QsCi0JLnNldF9tY2xrX29kID0gY2lfZHBtX3NldF9tY2xrX29kLAot CS5jaGVja19zdGF0ZV9lcXVhbCA9IGNpX2NoZWNrX3N0YXRlX2VxdWFsLAotCS5nZXRfdmNlX2Ns b2NrX3N0YXRlID0gYW1kZ3B1X2dldF92Y2VfY2xvY2tfc3RhdGUsCi0JLnJlYWRfc2Vuc29yID0g Y2lfZHBtX3JlYWRfc2Vuc29yLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBhbWRncHVfaXJx X3NyY19mdW5jcyBjaV9kcG1faXJxX2Z1bmNzID0gewotCS5zZXQgPSBjaV9kcG1fc2V0X2ludGVy cnVwdF9zdGF0ZSwKLQkucHJvY2VzcyA9IGNpX2RwbV9wcm9jZXNzX2ludGVycnVwdCwKLX07Ci0K LXN0YXRpYyB2b2lkIGNpX2RwbV9zZXRfaXJxX2Z1bmNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2KQotewotCWFkZXYtPnBtLmRwbS50aGVybWFsLmlycS5udW1fdHlwZXMgPSBBTURHUFVfVEhF Uk1BTF9JUlFfTEFTVDsKLQlhZGV2LT5wbS5kcG0udGhlcm1hbC5pcnEuZnVuY3MgPSAmY2lfZHBt X2lycV9mdW5jczsKLX0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Np X2RwbS5oIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvY2lfZHBtLmgKZGVsZXRlZCBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDkxYmUyOTk2YWU3Yy4uMDAwMDAwMDAwMDAwCi0tLSBhL2RyaXZl cnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2NpX2RwbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICsw LDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMu Ci0gKgotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNz b2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFs IGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBs aW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVi bGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0 aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdh cmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0 aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNz aW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFu dGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBS T1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IK LSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMg T0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Ug QU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09QWVJJR0hU IEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVD VElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJ TiBUSEUgU09GVFdBUkUuCi0gKgotICovCi0jaWZuZGVmIF9fQ0lfRFBNX0hfXwotI2RlZmluZSBf X0NJX0RQTV9IX18KLQotI2luY2x1ZGUgImFtZGdwdV9hdG9tYmlvcy5oIgotI2luY2x1ZGUgInBw c21jLmgiCi0KLSNkZWZpbmUgU01VX19OVU1fU0NMS19EUE1fU1RBVEUgIDgKLSNkZWZpbmUgU01V X19OVU1fTUNMS19EUE1fTEVWRUxTIDYKLSNkZWZpbmUgU01VX19OVU1fTENMS19EUE1fTEVWRUxT IDgKLSNkZWZpbmUgU01VX19OVU1fUENJRV9EUE1fTEVWRUxTIDgKLSNpbmNsdWRlICJzbXU3X2Rp c2NyZXRlLmgiCi0KLSNkZWZpbmUgQ0lTTEFORFNfTUFYX0hBUkRXQVJFX1BPV0VSTEVWRUxTIDIK LQotI2RlZmluZSBDSVNMQU5EU19VTlVTRURfR1BJT19QSU4gMHg3RgotCi1zdHJ1Y3QgY2lfcGwg ewotCXUzMiBtY2xrOwotCXUzMiBzY2xrOwotCWVudW0gYW1kZ3B1X3BjaWVfZ2VuIHBjaWVfZ2Vu OwotCXUxNiBwY2llX2xhbmU7Ci19OwotCi1zdHJ1Y3QgY2lfcHMgewotCXUxNiBwZXJmb3JtYW5j ZV9sZXZlbF9jb3VudDsKLQlib29sIGRjX2NvbXBhdGlibGU7Ci0JdTMyIHNjbGtfdDsKLQlzdHJ1 Y3QgY2lfcGwgcGVyZm9ybWFuY2VfbGV2ZWxzW0NJU0xBTkRTX01BWF9IQVJEV0FSRV9QT1dFUkxF VkVMU107Ci19OwotCi1zdHJ1Y3QgY2lfZHBtX2xldmVsIHsKLQlib29sIGVuYWJsZWQ7Ci0JdTMy IHZhbHVlOwotCXUzMiBwYXJhbTE7Ci19OwotCi0jZGVmaW5lIENJU0xBTkRfTUFYX0RFRVBTTEVF UF9ESVZJREVSX0lEIDUKLSNkZWZpbmUgTUFYX1JFR1VMQVJfRFBNX05VTUJFUiA4Ci0jZGVmaW5l IENJU0xBTkRfTUlOSU1VTV9FTkdJTkVfQ0xPQ0sgODAwCi0KLXN0cnVjdCBjaV9zaW5nbGVfZHBt X3RhYmxlIHsKLQl1MzIgY291bnQ7Ci0Jc3RydWN0IGNpX2RwbV9sZXZlbCBkcG1fbGV2ZWxzW01B WF9SRUdVTEFSX0RQTV9OVU1CRVJdOwotfTsKLQotc3RydWN0IGNpX2RwbV90YWJsZSB7Ci0Jc3Ry dWN0IGNpX3NpbmdsZV9kcG1fdGFibGUgc2Nsa190YWJsZTsKLQlzdHJ1Y3QgY2lfc2luZ2xlX2Rw bV90YWJsZSBtY2xrX3RhYmxlOwotCXN0cnVjdCBjaV9zaW5nbGVfZHBtX3RhYmxlIHBjaWVfc3Bl ZWRfdGFibGU7Ci0Jc3RydWN0IGNpX3NpbmdsZV9kcG1fdGFibGUgdmRkY190YWJsZTsKLQlzdHJ1 Y3QgY2lfc2luZ2xlX2RwbV90YWJsZSB2ZGRjaV90YWJsZTsKLQlzdHJ1Y3QgY2lfc2luZ2xlX2Rw bV90YWJsZSBtdmRkX3RhYmxlOwotfTsKLQotc3RydWN0IGNpX21jX3JlZ19lbnRyeSB7Ci0JdTMy IG1jbGtfbWF4OwotCXUzMiBtY19kYXRhW1NNVTdfRElTQ1JFVEVfTUNfUkVHSVNURVJfQVJSQVlf U0laRV07Ci19OwotCi1zdHJ1Y3QgY2lfbWNfcmVnX3RhYmxlIHsKLQl1OCBsYXN0OwotCXU4IG51 bV9lbnRyaWVzOwotCXUxNiB2YWxpZF9mbGFnOwotCXN0cnVjdCBjaV9tY19yZWdfZW50cnkgbWNf cmVnX3RhYmxlX2VudHJ5W01BWF9BQ19USU1JTkdfRU5UUklFU107Ci0JU01VN19EaXNjcmV0ZV9N Q1JlZ2lzdGVyQWRkcmVzcyBtY19yZWdfYWRkcmVzc1tTTVU3X0RJU0NSRVRFX01DX1JFR0lTVEVS X0FSUkFZX1NJWkVdOwotfTsKLQotc3RydWN0IGNpX3Vsdl9wYXJtCi17Ci0JYm9vbCBzdXBwb3J0 ZWQ7Ci0JdTMyIGNnX3Vsdl9wYXJhbWV0ZXI7Ci0JdTMyIHZvbHRfY2hhbmdlX2RlbGF5OwotCXN0 cnVjdCBjaV9wbCBwbDsKLX07Ci0KLSNkZWZpbmUgQ0lTTEFORFNfTUFYX0xFQUtBR0VfQ09VTlQg IDgKLQotc3RydWN0IGNpX2xlYWthZ2Vfdm9sdGFnZSB7Ci0JdTE2IGNvdW50OwotCXUxNiBsZWFr YWdlX2lkW0NJU0xBTkRTX01BWF9MRUFLQUdFX0NPVU5UXTsKLQl1MTYgYWN0dWFsX3ZvbHRhZ2Vb Q0lTTEFORFNfTUFYX0xFQUtBR0VfQ09VTlRdOwotfTsKLQotc3RydWN0IGNpX2RwbV9sZXZlbF9l bmFibGVfbWFzayB7Ci0JdTMyIHV2ZF9kcG1fZW5hYmxlX21hc2s7Ci0JdTMyIHZjZV9kcG1fZW5h YmxlX21hc2s7Ci0JdTMyIGFjcF9kcG1fZW5hYmxlX21hc2s7Ci0JdTMyIHNhbXVfZHBtX2VuYWJs ZV9tYXNrOwotCXUzMiBzY2xrX2RwbV9lbmFibGVfbWFzazsKLQl1MzIgbWNsa19kcG1fZW5hYmxl X21hc2s7Ci0JdTMyIHBjaWVfZHBtX2VuYWJsZV9tYXNrOwotfTsKLQotc3RydWN0IGNpX3ZiaW9z X2Jvb3Rfc3RhdGUKLXsKLQl1MTYgbXZkZF9ib290dXBfdmFsdWU7Ci0JdTE2IHZkZGNfYm9vdHVw X3ZhbHVlOwotCXUxNiB2ZGRjaV9ib290dXBfdmFsdWU7Ci0JdTMyIHNjbGtfYm9vdHVwX3ZhbHVl OwotCXUzMiBtY2xrX2Jvb3R1cF92YWx1ZTsKLQl1MTYgcGNpZV9nZW5fYm9vdHVwX3ZhbHVlOwot CXUxNiBwY2llX2xhbmVfYm9vdHVwX3ZhbHVlOwotfTsKLQotc3RydWN0IGNpX2Nsb2NrX3JlZ2lz dGVycyB7Ci0JdTMyIGNnX3NwbGxfZnVuY19jbnRsOwotCXUzMiBjZ19zcGxsX2Z1bmNfY250bF8y OwotCXUzMiBjZ19zcGxsX2Z1bmNfY250bF8zOwotCXUzMiBjZ19zcGxsX2Z1bmNfY250bF80Owot CXUzMiBjZ19zcGxsX3NwcmVhZF9zcGVjdHJ1bTsKLQl1MzIgY2dfc3BsbF9zcHJlYWRfc3BlY3Ry dW1fMjsKLQl1MzIgZGxsX2NudGw7Ci0JdTMyIG1jbGtfcHdybWd0X2NudGw7Ci0JdTMyIG1wbGxf YWRfZnVuY19jbnRsOwotCXUzMiBtcGxsX2RxX2Z1bmNfY250bDsKLQl1MzIgbXBsbF9mdW5jX2Nu dGw7Ci0JdTMyIG1wbGxfZnVuY19jbnRsXzE7Ci0JdTMyIG1wbGxfZnVuY19jbnRsXzI7Ci0JdTMy IG1wbGxfc3MxOwotCXUzMiBtcGxsX3NzMjsKLX07Ci0KLXN0cnVjdCBjaV90aGVybWFsX3RlbXBl cmF0dXJlX3NldHRpbmcgewotCXMzMiB0ZW1wZXJhdHVyZV9sb3c7Ci0JczMyIHRlbXBlcmF0dXJl X2hpZ2g7Ci0JczMyIHRlbXBlcmF0dXJlX3NodXRkb3duOwotfTsKLQotc3RydWN0IGNpX3BjaWVf cGVyZl9yYW5nZSB7Ci0JdTE2IG1heDsKLQl1MTYgbWluOwotfTsKLQotZW51bSBjaV9wdF9jb25m aWdfcmVnX3R5cGUgewotCUNJU0xBTkRTX0NPTkZJR1JFR19NTVIgPSAwLAotCUNJU0xBTkRTX0NP TkZJR1JFR19TTUNfSU5ELAotCUNJU0xBTkRTX0NPTkZJR1JFR19ESURUX0lORCwKLQlDSVNMQU5E U19DT05GSUdSRUdfQ0FDSEUsCi0JQ0lTTEFORFNfQ09ORklHUkVHX01BWAotfTsKLQotI2RlZmlu ZSBQT1dFUkNPTlRBSU5NRU5UX0ZFQVRVUkVfQkFQTSAgICAgICAgICAgIDB4MDAwMDAwMDEKLSNk ZWZpbmUgUE9XRVJDT05UQUlOTUVOVF9GRUFUVVJFX1REQ0xpbWl0ICAgICAgICAweDAwMDAwMDAy Ci0jZGVmaW5lIFBPV0VSQ09OVEFJTk1FTlRfRkVBVFVSRV9Qa2dQd3JMaW1pdCAgICAgMHgwMDAw MDAwNAotCi1zdHJ1Y3QgY2lfcHRfY29uZmlnX3JlZyB7Ci0JdTMyIG9mZnNldDsKLQl1MzIgbWFz azsKLQl1MzIgc2hpZnQ7Ci0JdTMyIHZhbHVlOwotCWVudW0gY2lfcHRfY29uZmlnX3JlZ190eXBl IHR5cGU7Ci19OwotCi1zdHJ1Y3QgY2lfcHRfZGVmYXVsdHMgewotCXU4IHN2aV9sb2FkX2xpbmVf ZW47Ci0JdTggc3ZpX2xvYWRfbGluZV92ZGRjOwotCXU4IHRkY192ZGRjX3Rocm90dGxlX3JlbGVh c2VfbGltaXRfcGVyYzsKLQl1OCB0ZGNfbWF3dDsKLQl1OCB0ZGNfd2F0ZXJmYWxsX2N0bDsKLQl1 OCBkdGVfYW1iaWVudF90ZW1wX2Jhc2U7Ci0JdTMyIGRpc3BsYXlfY2FjOwotCXUzMiBiYXBtX3Rl bXBfZ3JhZGllbnQ7Ci0JdTE2IGJhcG10aV9yW1NNVTdfRFRFX0lURVJBVElPTlMgKiBTTVU3X0RU RV9TT1VSQ0VTICogU01VN19EVEVfU0lOS1NdOwotCXUxNiBiYXBtdGlfcmNbU01VN19EVEVfSVRF UkFUSU9OUyAqIFNNVTdfRFRFX1NPVVJDRVMgKiBTTVU3X0RURV9TSU5LU107Ci19OwotCi0jZGVm aW5lIERQTVRBQkxFX09EX1VQREFURV9TQ0xLICAgICAweDAwMDAwMDAxCi0jZGVmaW5lIERQTVRB QkxFX09EX1VQREFURV9NQ0xLICAgICAweDAwMDAwMDAyCi0jZGVmaW5lIERQTVRBQkxFX1VQREFU RV9TQ0xLICAgICAgICAweDAwMDAwMDA0Ci0jZGVmaW5lIERQTVRBQkxFX1VQREFURV9NQ0xLICAg ICAgICAweDAwMDAwMDA4Ci0KLXN0cnVjdCBjaV9wb3dlcl9pbmZvIHsKLQlzdHJ1Y3QgY2lfZHBt X3RhYmxlIGRwbV90YWJsZTsKLQlzdHJ1Y3QgY2lfZHBtX3RhYmxlIGdvbGRlbl9kcG1fdGFibGU7 Ci0JdTMyIHZvbHRhZ2VfY29udHJvbDsKLQl1MzIgbXZkZF9jb250cm9sOwotCXUzMiB2ZGRjaV9j b250cm9sOwotCXUzMiBhY3RpdmVfYXV0b190aHJvdHRsZV9zb3VyY2VzOwotCXN0cnVjdCBjaV9j bG9ja19yZWdpc3RlcnMgY2xvY2tfcmVnaXN0ZXJzOwotCXUxNiBhY3BpX3ZkZGM7Ci0JdTE2IGFj cGlfdmRkY2k7Ci0JZW51bSBhbWRncHVfcGNpZV9nZW4gZm9yY2VfcGNpZV9nZW47Ci0JZW51bSBh bWRncHVfcGNpZV9nZW4gYWNwaV9wY2llX2dlbjsKLQlzdHJ1Y3QgY2lfbGVha2FnZV92b2x0YWdl IHZkZGNfbGVha2FnZTsKLQlzdHJ1Y3QgY2lfbGVha2FnZV92b2x0YWdlIHZkZGNpX2xlYWthZ2U7 Ci0JdTE2IG1heF92ZGRjX2luX3BwX3RhYmxlOwotCXUxNiBtaW5fdmRkY19pbl9wcF90YWJsZTsK LQl1MTYgbWF4X3ZkZGNpX2luX3BwX3RhYmxlOwotCXUxNiBtaW5fdmRkY2lfaW5fcHBfdGFibGU7 Ci0JdTMyIG1jbGtfc3Ryb2JlX21vZGVfdGhyZXNob2xkOwotCXUzMiBtY2xrX3N0dXR0ZXJfbW9k ZV90aHJlc2hvbGQ7Ci0JdTMyIG1jbGtfZWRjX2VuYWJsZV90aHJlc2hvbGQ7Ci0JdTMyIG1jbGtf ZWRjX3dyX2VuYWJsZV90aHJlc2hvbGQ7Ci0Jc3RydWN0IGNpX3ZiaW9zX2Jvb3Rfc3RhdGUgdmJp b3NfYm9vdF9zdGF0ZTsKLQkvKiBzbWMgb2Zmc2V0cyAqLwotCXUzMiBzcmFtX2VuZDsKLQl1MzIg ZHBtX3RhYmxlX3N0YXJ0OwotCXUzMiBzb2Z0X3JlZ3Nfc3RhcnQ7Ci0JdTMyIG1jX3JlZ190YWJs ZV9zdGFydDsKLQl1MzIgZmFuX3RhYmxlX3N0YXJ0OwotCXUzMiBhcmJfdGFibGVfc3RhcnQ7Ci0J Lyogc21jIHRhYmxlcyAqLwotCVNNVTdfRGlzY3JldGVfRHBtVGFibGUgc21jX3N0YXRlX3RhYmxl OwotCVNNVTdfRGlzY3JldGVfTUNSZWdpc3RlcnMgc21jX21jX3JlZ190YWJsZTsKLQlTTVU3X0Rp c2NyZXRlX1BtRnVzZXMgc21jX3Bvd2VydHVuZV90YWJsZTsKLQkvKiBvdGhlciBzdHVmZiAqLwot CXN0cnVjdCBjaV9tY19yZWdfdGFibGUgbWNfcmVnX3RhYmxlOwotCXN0cnVjdCBhdG9tX3ZvbHRh Z2VfdGFibGUgdmRkY192b2x0YWdlX3RhYmxlOwotCXN0cnVjdCBhdG9tX3ZvbHRhZ2VfdGFibGUg dmRkY2lfdm9sdGFnZV90YWJsZTsKLQlzdHJ1Y3QgYXRvbV92b2x0YWdlX3RhYmxlIG12ZGRfdm9s dGFnZV90YWJsZTsKLQlzdHJ1Y3QgY2lfdWx2X3Bhcm0gdWx2OwotCXUzMiBwb3dlcl9jb250YWlu bWVudF9mZWF0dXJlczsKLQljb25zdCBzdHJ1Y3QgY2lfcHRfZGVmYXVsdHMgKnBvd2VydHVuZV9k ZWZhdWx0czsKLQl1MzIgZHRlX3RqX29mZnNldDsKLQlib29sIHZkZGNfcGhhc2Vfc2hlZF9jb250 cm9sOwotCXN0cnVjdCBjaV90aGVybWFsX3RlbXBlcmF0dXJlX3NldHRpbmcgdGhlcm1hbF90ZW1w X3NldHRpbmc7Ci0Jc3RydWN0IGNpX2RwbV9sZXZlbF9lbmFibGVfbWFzayBkcG1fbGV2ZWxfZW5h YmxlX21hc2s7Ci0JdTMyIG5lZWRfdXBkYXRlX3NtdTdfZHBtX3RhYmxlOwotCXUzMiBzY2xrX2Rw bV9rZXlfZGlzYWJsZWQ7Ci0JdTMyIG1jbGtfZHBtX2tleV9kaXNhYmxlZDsKLQl1MzIgcGNpZV9k cG1fa2V5X2Rpc2FibGVkOwotCXUzMiB0aGVybWFsX3NjbGtfZHBtX2VuYWJsZWQ7Ci0Jc3RydWN0 IGNpX3BjaWVfcGVyZl9yYW5nZSBwY2llX2dlbl9wZXJmb3JtYW5jZTsKLQlzdHJ1Y3QgY2lfcGNp ZV9wZXJmX3JhbmdlIHBjaWVfbGFuZV9wZXJmb3JtYW5jZTsKLQlzdHJ1Y3QgY2lfcGNpZV9wZXJm X3JhbmdlIHBjaWVfZ2VuX3Bvd2Vyc2F2aW5nOwotCXN0cnVjdCBjaV9wY2llX3BlcmZfcmFuZ2Ug cGNpZV9sYW5lX3Bvd2Vyc2F2aW5nOwotCXUzMiBhY3Rpdml0eV90YXJnZXRbU01VN19NQVhfTEVW RUxTX0dSQVBISUNTXTsKLQl1MzIgbWNsa19hY3Rpdml0eV90YXJnZXQ7Ci0JdTMyIGxvd19zY2xr X2ludGVycnVwdF90OwotCXUzMiBsYXN0X21jbGtfZHBtX2VuYWJsZV9tYXNrOwotCXUzMiBzeXNf cGNpZV9tYXNrOwotCS8qIGNhcHMgKi8KLQlib29sIGNhcHNfcG93ZXJfY29udGFpbm1lbnQ7Ci0J Ym9vbCBjYXBzX2NhYzsKLQlib29sIGNhcHNfc3FfcmFtcGluZzsKLQlib29sIGNhcHNfZGJfcmFt cGluZzsKLQlib29sIGNhcHNfdGRfcmFtcGluZzsKLQlib29sIGNhcHNfdGNwX3JhbXBpbmc7Ci0J Ym9vbCBjYXBzX2ZwczsKLQlib29sIGNhcHNfc2Nsa19kczsKLQlib29sIGNhcHNfc2Nsa19zc19z dXBwb3J0OwotCWJvb2wgY2Fwc19tY2xrX3NzX3N1cHBvcnQ7Ci0JYm9vbCBjYXBzX3V2ZF9kcG07 Ci0JYm9vbCBjYXBzX3ZjZV9kcG07Ci0JYm9vbCBjYXBzX3NhbXVfZHBtOwotCWJvb2wgY2Fwc19h Y3BfZHBtOwotCWJvb2wgY2Fwc19hdXRvbWF0aWNfZGNfdHJhbnNpdGlvbjsKLQlib29sIGNhcHNf c2Nsa190aHJvdHRsZV9sb3dfbm90aWZpY2F0aW9uOwotCWJvb2wgY2Fwc19keW5hbWljX2FjX3Rp bWluZzsKLQlib29sIGNhcHNfb2RfZnV6enlfZmFuX2NvbnRyb2xfc3VwcG9ydDsKLQkvKiBmbGFn cyAqLwotCWJvb2wgdGhlcm1hbF9wcm90ZWN0aW9uOwotCWJvb2wgcGNpZV9wZXJmb3JtYW5jZV9y ZXF1ZXN0OwotCWJvb2wgZHluYW1pY19zczsKLQlib29sIGRsbF9kZWZhdWx0X29uOwotCWJvb2wg Y2FjX2VuYWJsZWQ7Ci0JYm9vbCB1dmRfZW5hYmxlZDsKLQlib29sIGJhdHRlcnlfc3RhdGU7Ci0J Ym9vbCBwc3BwX25vdGlmeV9yZXF1aXJlZDsKLQlib29sIGVuYWJsZV9iYXBtX2ZlYXR1cmU7Ci0J Ym9vbCBlbmFibGVfdGRjX2xpbWl0X2ZlYXR1cmU7Ci0JYm9vbCBlbmFibGVfcGtnX3B3cl90cmFj a2luZ19mZWF0dXJlOwotCWJvb2wgdXNlX3BjaWVfcGVyZm9ybWFuY2VfbGV2ZWxzOwotCWJvb2wg dXNlX3BjaWVfcG93ZXJzYXZpbmdfbGV2ZWxzOwotCWJvb2wgdXZkX3Bvd2VyX2dhdGVkOwotCS8q IGRyaXZlciBzdGF0ZXMgKi8KLQlzdHJ1Y3QgYW1kZ3B1X3BzIGN1cnJlbnRfcnBzOwotCXN0cnVj dCBjaV9wcyBjdXJyZW50X3BzOwotCXN0cnVjdCBhbWRncHVfcHMgcmVxdWVzdGVkX3JwczsKLQlz dHJ1Y3QgY2lfcHMgcmVxdWVzdGVkX3BzOwotCS8qIGZhbiBjb250cm9sICovCi0JYm9vbCBmYW5f Y3RybF9pc19pbl9kZWZhdWx0X21vZGU7Ci0JYm9vbCBmYW5faXNfY29udHJvbGxlZF9ieV9zbWM7 Ci0JdTMyIHRfbWluOwotCXUzMiBmYW5fY3RybF9kZWZhdWx0X21vZGU7Ci19OwotCi0jZGVmaW5l IENJU0xBTkRTX1ZPTFRBR0VfQ09OVFJPTF9OT05FICAgICAgICAgICAgICAgICAgIDB4MAotI2Rl ZmluZSBDSVNMQU5EU19WT0xUQUdFX0NPTlRST0xfQllfR1BJTyAgICAgICAgICAgICAgICAweDEK LSNkZWZpbmUgQ0lTTEFORFNfVk9MVEFHRV9DT05UUk9MX0JZX1NWSUQyICAgICAgICAgICAgICAg MHgyCi0KLSNkZWZpbmUgQ0lTTEFORFNfUTg4X0ZPUk1BVF9DT05WRVJTSU9OX1VOSVQgICAgICAg ICAgICAgMjU2Ci0KLSNkZWZpbmUgQ0lTTEFORFNfVlJDX0RGTFQwICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgMHgzRkZGQzAwMAotI2RlZmluZSBDSVNMQU5EU19WUkNfREZMVDEgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAweDAwMDQwMAotI2RlZmluZSBDSVNMQU5EU19WUkNfREZM VDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwMDA4MAotI2RlZmluZSBDSVNMQU5E U19WUkNfREZMVDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwMDIwMAotI2RlZmlu ZSBDSVNMQU5EU19WUkNfREZMVDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEMwMTY4 MAotI2RlZmluZSBDSVNMQU5EU19WUkNfREZMVDUgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAweEMwMDAzMwotI2RlZmluZSBDSVNMQU5EU19WUkNfREZMVDYgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAweEMwMDAzMwotI2RlZmluZSBDSVNMQU5EU19WUkNfREZMVDcgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAweDNGRkZDMDAwCi0KLSNkZWZpbmUgQ0lTTEFORFNfQ0dVTFZQ QVJBTUVURVJfREZMVCAgICAgICAgICAgICAgICAgICAgMHgwMDA0MDAzNQotI2RlZmluZSBDSVNM QU5EX1RBUkdFVEFDVElWSVRZX0RGTFQgICAgICAgICAgICAgICAgICAgICAzMAotI2RlZmluZSBD SVNMQU5EX01DTEtfVEFSR0VUQUNUSVZJVFlfREZMVCAgICAgICAgICAgICAgICAxMAotCi0jZGVm aW5lIFBDSUVfUEVSRl9SRVFfUkVNT1ZFX1JFR0lTVFJZICAgMAotI2RlZmluZSBQQ0lFX1BFUkZf UkVRX0ZPUkNFX0xPV1BPV0VSICAgIDEKLSNkZWZpbmUgUENJRV9QRVJGX1JFUV9QRUNJX0dFTjEg ICAgICAgICAyCi0jZGVmaW5lIFBDSUVfUEVSRl9SRVFfUEVDSV9HRU4yICAgICAgICAgMwotI2Rl ZmluZSBQQ0lFX1BFUkZfUkVRX1BFQ0lfR0VOMyAgICAgICAgIDQKLQotI2RlZmluZSBDSVNMQU5E U19TU1RVX0RGTFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDSVNM QU5EU19TU1RfREZMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwMEM4Ci0KLS8q IFhYWCBhcmUgdGhlc2Ugb2s/ICovCi0jZGVmaW5lIENJU0xBTkRTX1RFTVBfUkFOR0VfTUlOICg5 MCAqIDEwMDApCi0jZGVmaW5lIENJU0xBTkRTX1RFTVBfUkFOR0VfTUFYICgxMjAgKiAxMDAwKQot Ci1pbnQgYW1kZ3B1X2NpX2NvcHlfYnl0ZXNfdG9fc21jKHN0cnVjdCBhbWRncHVfZGV2aWNlICph ZGV2LAotCQkJIHUzMiBzbWNfc3RhcnRfYWRkcmVzcywKLQkJCSBjb25zdCB1OCAqc3JjLCB1MzIg Ynl0ZV9jb3VudCwgdTMyIGxpbWl0KTsKLXZvaWQgYW1kZ3B1X2NpX3N0YXJ0X3NtYyhzdHJ1Y3Qg YW1kZ3B1X2RldmljZSAqYWRldik7Ci12b2lkIGFtZGdwdV9jaV9yZXNldF9zbWMoc3RydWN0IGFt ZGdwdV9kZXZpY2UgKmFkZXYpOwotaW50IGFtZGdwdV9jaV9wcm9ncmFtX2p1bXBfb25fc3RhcnQo c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwotdm9pZCBhbWRncHVfY2lfc3RvcF9zbWNfY2xv Y2soc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpOwotdm9pZCBhbWRncHVfY2lfc3RhcnRfc21j X2Nsb2NrKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKLWJvb2wgYW1kZ3B1X2NpX2lzX3Nt Y19ydW5uaW5nKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKLVBQU01DX1Jlc3VsdCBhbWRn cHVfY2lfc2VuZF9tc2dfdG9fc21jKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LCBQUFNNQ19N c2cgbXNnKTsKLVBQU01DX1Jlc3VsdCBhbWRncHVfY2lfd2FpdF9mb3Jfc21jX2luYWN0aXZlKHN0 cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KTsKLWludCBhbWRncHVfY2lfbG9hZF9zbWNfdWNvZGUo c3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIHUzMiBsaW1pdCk7Ci1pbnQgYW1kZ3B1X2NpX3Jl YWRfc21jX3NyYW1fZHdvcmQoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkgICB1MzIg c21jX2FkZHJlc3MsIHUzMiAqdmFsdWUsIHUzMiBsaW1pdCk7Ci1pbnQgYW1kZ3B1X2NpX3dyaXRl X3NtY19zcmFtX2R3b3JkKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJICAgIHUzMiBz bWNfYWRkcmVzcywgdTMyIHZhbHVlLCB1MzIgbGltaXQpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2NpX3NtYy5jIGIvZHJpdmVycy9ncHUvZHJtL2Ft ZC9hbWRncHUvY2lfc21jLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4YmE1MWUw NDViNS4uMDAwMDAwMDAwMDAwCi0tLSBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2NpX3Nt Yy5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAx MSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCi0gKgotICogUGVybWlzc2lvbiBpcyBoZXJl YnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAq IGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVz ICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJl c3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRv IHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5z ZSwKLSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQg cGVyc29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBz dWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29w eXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRl ZCBpbgotICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdh cmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FS UkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5P IEVWRU5UIFNIQUxMCi0gKiBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBPUiBBVVRIT1IoUykgQkUg TElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKLSAqIE9USEVSIExJQUJJTElUWSwgV0hF VEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLAotICogQVJJ U0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBU SEUgVVNFIE9SCi0gKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCi0gKgotICogQXV0 aG9yczogQWxleCBEZXVjaGVyCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0j aW5jbHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlICJhbWRncHUuaCIKLSNpbmNsdWRlICJjaWtk LmgiCi0jaW5jbHVkZSAicHBzbWMuaCIKLSNpbmNsdWRlICJhbWRncHVfdWNvZGUuaCIKLSNpbmNs dWRlICJjaV9kcG0uaCIKLQotI2luY2x1ZGUgInNtdS9zbXVfN18wXzFfZC5oIgotI2luY2x1ZGUg InNtdS9zbXVfN18wXzFfc2hfbWFzay5oIgotCi1zdGF0aWMgaW50IGNpX3NldF9zbWNfc3JhbV9h ZGRyZXNzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2LAotCQkJCSAgIHUzMiBzbWNfYWRkcmVz cywgdTMyIGxpbWl0KQotewotCWlmIChzbWNfYWRkcmVzcyAmIDMpCi0JCXJldHVybiAtRUlOVkFM OwotCWlmICgoc21jX2FkZHJlc3MgKyAzKSA+IGxpbWl0KQotCQlyZXR1cm4gLUVJTlZBTDsKLQot CVdSRUczMihtbVNNQ19JTkRfSU5ERVhfMCwgc21jX2FkZHJlc3MpOwotCVdSRUczMl9QKG1tU01D X0lORF9BQ0NFU1NfQ05UTCwgMCwgflNNQ19JTkRfQUNDRVNTX0NOVExfX0FVVE9fSU5DUkVNRU5U X0lORF8wX01BU0spOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBhbWRncHVfY2lfY29weV9ieXRl c190b19zbWMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsCi0JCQkgdTMyIHNtY19zdGFydF9h ZGRyZXNzLAotCQkJIGNvbnN0IHU4ICpzcmMsIHUzMiBieXRlX2NvdW50LCB1MzIgbGltaXQpCi17 Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1MzIgZGF0YSwgb3JpZ2luYWxfZGF0YTsKLQl1MzIg YWRkcjsKLQl1MzIgZXh0cmFfc2hpZnQ7Ci0JaW50IHJldCA9IDA7Ci0KLQlpZiAoc21jX3N0YXJ0 X2FkZHJlc3MgJiAzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQlpZiAoKHNtY19zdGFydF9hZGRyZXNz ICsgYnl0ZV9jb3VudCkgPiBsaW1pdCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlhZGRyID0gc21j X3N0YXJ0X2FkZHJlc3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmYWRldi0+c21jX2lkeF9sb2Nr LCBmbGFncyk7Ci0Jd2hpbGUgKGJ5dGVfY291bnQgPj0gNCkgewotCQkvKiBTTUMgYWRkcmVzcyBz cGFjZSBpcyBCRSAqLwotCQlkYXRhID0gKHNyY1swXSA8PCAyNCkgfCAoc3JjWzFdIDw8IDE2KSB8 IChzcmNbMl0gPDwgOCkgfCBzcmNbM107Ci0KLQkJcmV0ID0gY2lfc2V0X3NtY19zcmFtX2FkZHJl c3MoYWRldiwgYWRkciwgbGltaXQpOwotCQlpZiAocmV0KQotCQkJZ290byBkb25lOwotCi0JCVdS RUczMihtbVNNQ19JTkRfREFUQV8wLCBkYXRhKTsKLQotCQlzcmMgKz0gNDsKLQkJYnl0ZV9jb3Vu dCAtPSA0OwotCQlhZGRyICs9IDQ7Ci0JfQotCi0JLyogUk1XIGZvciB0aGUgZmluYWwgYnl0ZXMg Ki8KLQlpZiAoYnl0ZV9jb3VudCA+IDApIHsKLQkJZGF0YSA9IDA7Ci0KLQkJcmV0ID0gY2lfc2V0 X3NtY19zcmFtX2FkZHJlc3MoYWRldiwgYWRkciwgbGltaXQpOwotCQlpZiAocmV0KQotCQkJZ290 byBkb25lOwotCi0JCW9yaWdpbmFsX2RhdGEgPSBSUkVHMzIobW1TTUNfSU5EX0RBVEFfMCk7Ci0K LQkJZXh0cmFfc2hpZnQgPSA4ICogKDQgLSBieXRlX2NvdW50KTsKLQotCQl3aGlsZSAoYnl0ZV9j b3VudCA+IDApIHsKLQkJCWRhdGEgPSAoZGF0YSA8PCA4KSArICpzcmMrKzsKLQkJCWJ5dGVfY291 bnQtLTsKLQkJfQotCi0JCWRhdGEgPDw9IGV4dHJhX3NoaWZ0OwotCi0JCWRhdGEgfD0gKG9yaWdp bmFsX2RhdGEgJiB+KCh+MFVMKSA8PCBleHRyYV9zaGlmdCkpOwotCi0JCXJldCA9IGNpX3NldF9z bWNfc3JhbV9hZGRyZXNzKGFkZXYsIGFkZHIsIGxpbWl0KTsKLQkJaWYgKHJldCkKLQkJCWdvdG8g ZG9uZTsKLQotCQlXUkVHMzIobW1TTUNfSU5EX0RBVEFfMCwgZGF0YSk7Ci0JfQotCi1kb25lOgot CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkZXYtPnNtY19pZHhfbG9jaywgZmxhZ3MpOwotCi0J cmV0dXJuIHJldDsKLX0KLQotdm9pZCBhbWRncHVfY2lfc3RhcnRfc21jKHN0cnVjdCBhbWRncHVf ZGV2aWNlICphZGV2KQotewotCXUzMiB0bXAgPSBSUkVHMzJfU01DKGl4U01DX1NZU0NPTl9SRVNF VF9DTlRMKTsKLQotCXRtcCAmPSB+U01DX1NZU0NPTl9SRVNFVF9DTlRMX19yc3RfcmVnX01BU0s7 Ci0JV1JFRzMyX1NNQyhpeFNNQ19TWVNDT05fUkVTRVRfQ05UTCwgdG1wKTsKLX0KLQotdm9pZCBh bWRncHVfY2lfcmVzZXRfc21jKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXUzMiB0 bXAgPSBSUkVHMzJfU01DKGl4U01DX1NZU0NPTl9SRVNFVF9DTlRMKTsKLQotCXRtcCB8PSBTTUNf U1lTQ09OX1JFU0VUX0NOVExfX3JzdF9yZWdfTUFTSzsKLQlXUkVHMzJfU01DKGl4U01DX1NZU0NP Tl9SRVNFVF9DTlRMLCB0bXApOwotfQotCi1pbnQgYW1kZ3B1X2NpX3Byb2dyYW1fanVtcF9vbl9z dGFydChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQlzdGF0aWMgdTggZGF0YVtdID0g eyAweEUwLCAweDAwLCAweDgwLCAweDQwIH07Ci0KLQlyZXR1cm4gYW1kZ3B1X2NpX2NvcHlfYnl0 ZXNfdG9fc21jKGFkZXYsIDB4MCwgZGF0YSwgNCwgc2l6ZW9mKGRhdGEpKzEpOwotfQotCi12b2lk IGFtZGdwdV9jaV9zdG9wX3NtY19jbG9jayhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsK LQl1MzIgdG1wID0gUlJFRzMyX1NNQyhpeFNNQ19TWVNDT05fQ0xPQ0tfQ05UTF8wKTsKLQotCXRt cCB8PSBTTUNfU1lTQ09OX0NMT0NLX0NOVExfMF9fY2tfZGlzYWJsZV9NQVNLOwotCi0JV1JFRzMy X1NNQyhpeFNNQ19TWVNDT05fQ0xPQ0tfQ05UTF8wLCB0bXApOwotfQotCi12b2lkIGFtZGdwdV9j aV9zdGFydF9zbWNfY2xvY2soc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYpCi17Ci0JdTMyIHRt cCA9IFJSRUczMl9TTUMoaXhTTUNfU1lTQ09OX0NMT0NLX0NOVExfMCk7Ci0KLQl0bXAgJj0gflNN Q19TWVNDT05fQ0xPQ0tfQ05UTF8wX19ja19kaXNhYmxlX01BU0s7Ci0KLQlXUkVHMzJfU01DKGl4 U01DX1NZU0NPTl9DTE9DS19DTlRMXzAsIHRtcCk7Ci19Ci0KLWJvb2wgYW1kZ3B1X2NpX2lzX3Nt Y19ydW5uaW5nKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2KQotewotCXUzMiBjbGsgPSBSUkVH MzJfU01DKGl4U01DX1NZU0NPTl9DTE9DS19DTlRMXzApOwotCXUzMiBwY19jID0gUlJFRzMyX1NN QyhpeFNNQ19QQ19DKTsKLQotCWlmICghKGNsayAmIFNNQ19TWVNDT05fQ0xPQ0tfQ05UTF8wX19j a19kaXNhYmxlX01BU0spICYmICgweDIwMTAwIDw9IHBjX2MpKQotCQlyZXR1cm4gdHJ1ZTsKLQot CXJldHVybiBmYWxzZTsKLX0KLQotUFBTTUNfUmVzdWx0IGFtZGdwdV9jaV9zZW5kX21zZ190b19z bWMoc3RydWN0IGFtZGdwdV9kZXZpY2UgKmFkZXYsIFBQU01DX01zZyBtc2cpCi17Ci0JdTMyIHRt cDsKLQlpbnQgaTsKLQotCWlmICghYW1kZ3B1X2NpX2lzX3NtY19ydW5uaW5nKGFkZXYpKQotCQly ZXR1cm4gUFBTTUNfUmVzdWx0X0ZhaWxlZDsKLQotCVdSRUczMihtbVNNQ19NRVNTQUdFXzAsIG1z Zyk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0OyBpKyspIHsKLQkJdG1w ID0gUlJFRzMyKG1tU01DX1JFU1BfMCk7Ci0JCWlmICh0bXAgIT0gMCkKLQkJCWJyZWFrOwotCQl1 ZGVsYXkoMSk7Ci0JfQotCXRtcCA9IFJSRUczMihtbVNNQ19SRVNQXzApOwotCi0JcmV0dXJuIChQ UFNNQ19SZXN1bHQpdG1wOwotfQotCi1QUFNNQ19SZXN1bHQgYW1kZ3B1X2NpX3dhaXRfZm9yX3Nt Y19pbmFjdGl2ZShzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikKLXsKLQl1MzIgdG1wOwotCWlu dCBpOwotCi0JaWYgKCFhbWRncHVfY2lfaXNfc21jX3J1bm5pbmcoYWRldikpCi0JCXJldHVybiBQ UFNNQ19SZXN1bHRfT0s7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgYWRldi0+dXNlY190aW1lb3V0OyBp KyspIHsKLQkJdG1wID0gUlJFRzMyX1NNQyhpeFNNQ19TWVNDT05fQ0xPQ0tfQ05UTF8wKTsKLQkJ aWYgKCh0bXAgJiBTTUNfU1lTQ09OX0NMT0NLX0NOVExfMF9fY2tlbl9NQVNLKSA9PSAwKQotCQkJ YnJlYWs7Ci0JCXVkZWxheSgxKTsKLQl9Ci0KLQlyZXR1cm4gUFBTTUNfUmVzdWx0X09LOwotfQot Ci1pbnQgYW1kZ3B1X2NpX2xvYWRfc21jX3Vjb2RlKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 LCB1MzIgbGltaXQpCi17Ci0JY29uc3Qgc3RydWN0IHNtY19maXJtd2FyZV9oZWFkZXJfdjFfMCAq aGRyOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdTMyIHVjb2RlX3N0YXJ0X2FkZHJlc3M7Ci0J dTMyIHVjb2RlX3NpemU7Ci0JY29uc3QgdTggKnNyYzsKLQl1MzIgZGF0YTsKLQotCWlmICghYWRl di0+cG0uZncpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaGRyID0gKGNvbnN0IHN0cnVjdCBzbWNf ZmlybXdhcmVfaGVhZGVyX3YxXzAgKilhZGV2LT5wbS5mdy0+ZGF0YTsKLQlhbWRncHVfdWNvZGVf cHJpbnRfc21jX2hkcigmaGRyLT5oZWFkZXIpOwotCi0JYWRldi0+cG0uZndfdmVyc2lvbiA9IGxl MzJfdG9fY3B1KGhkci0+aGVhZGVyLnVjb2RlX3ZlcnNpb24pOwotCXVjb2RlX3N0YXJ0X2FkZHJl c3MgPSBsZTMyX3RvX2NwdShoZHItPnVjb2RlX3N0YXJ0X2FkZHIpOwotCXVjb2RlX3NpemUgPSBs ZTMyX3RvX2NwdShoZHItPmhlYWRlci51Y29kZV9zaXplX2J5dGVzKTsKLQlzcmMgPSAoY29uc3Qg dTggKikKLQkJKGFkZXYtPnBtLmZ3LT5kYXRhICsgbGUzMl90b19jcHUoaGRyLT5oZWFkZXIudWNv ZGVfYXJyYXlfb2Zmc2V0X2J5dGVzKSk7Ci0KLQlpZiAodWNvZGVfc2l6ZSAmIDMpCi0JCXJldHVy biAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmFkZXYtPnNtY19pZHhfbG9jaywgZmxh Z3MpOwotCVdSRUczMihtbVNNQ19JTkRfSU5ERVhfMCwgdWNvZGVfc3RhcnRfYWRkcmVzcyk7Ci0J V1JFRzMyX1AobW1TTUNfSU5EX0FDQ0VTU19DTlRMLCBTTUNfSU5EX0FDQ0VTU19DTlRMX19BVVRP X0lOQ1JFTUVOVF9JTkRfMF9NQVNLLAotCQl+U01DX0lORF9BQ0NFU1NfQ05UTF9fQVVUT19JTkNS RU1FTlRfSU5EXzBfTUFTSyk7Ci0Jd2hpbGUgKHVjb2RlX3NpemUgPj0gNCkgewotCQkvKiBTTUMg YWRkcmVzcyBzcGFjZSBpcyBCRSAqLwotCQlkYXRhID0gKHNyY1swXSA8PCAyNCkgfCAoc3JjWzFd IDw8IDE2KSB8IChzcmNbMl0gPDwgOCkgfCBzcmNbM107Ci0KLQkJV1JFRzMyKG1tU01DX0lORF9E QVRBXzAsIGRhdGEpOwotCi0JCXNyYyArPSA0OwotCQl1Y29kZV9zaXplIC09IDQ7Ci0JfQotCVdS RUczMl9QKG1tU01DX0lORF9BQ0NFU1NfQ05UTCwgMCwgflNNQ19JTkRfQUNDRVNTX0NOVExfX0FV VE9fSU5DUkVNRU5UX0lORF8wX01BU0spOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkZXYt PnNtY19pZHhfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBhbWRncHVfY2lf cmVhZF9zbWNfc3JhbV9kd29yZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCSAgIHUz MiBzbWNfYWRkcmVzcywgdTMyICp2YWx1ZSwgdTMyIGxpbWl0KQotewotCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Ci0JaW50IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGV2LT5zbWNfaWR4X2xv Y2ssIGZsYWdzKTsKLQlyZXQgPSBjaV9zZXRfc21jX3NyYW1fYWRkcmVzcyhhZGV2LCBzbWNfYWRk cmVzcywgbGltaXQpOwotCWlmIChyZXQgPT0gMCkKLQkJKnZhbHVlID0gUlJFRzMyKG1tU01DX0lO RF9EQVRBXzApOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmFkZXYtPnNtY19pZHhfbG9jaywg ZmxhZ3MpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotaW50IGFtZGdwdV9jaV93cml0ZV9zbWNfc3Jh bV9kd29yZChzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldiwKLQkJCSAgICB1MzIgc21jX2FkZHJl c3MsIHUzMiB2YWx1ZSwgdTMyIGxpbWl0KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50 IHJldDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZhZGV2LT5zbWNfaWR4X2xvY2ssIGZsYWdzKTsK LQlyZXQgPSBjaV9zZXRfc21jX3NyYW1fYWRkcmVzcyhhZGV2LCBzbWNfYWRkcmVzcywgbGltaXQp OwotCWlmIChyZXQgPT0gMCkKLQkJV1JFRzMyKG1tU01DX0lORF9EQVRBXzAsIHZhbHVlKTsKLQlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZhZGV2LT5zbWNfaWR4X2xvY2ssIGZsYWdzKTsKLQotCXJl dHVybiByZXQ7Ci19CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWsu YyBiL2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Npay5jCmluZGV4IGIxYjdhYmVkN2RhYi4u MDdjMWYyMzllOWMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWsu YworKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9jaWsuYwpAQCAtMjA3MCwxMCArMjA3 MCw3IEBAIGludCBjaWtfc2V0X2lwX2Jsb2NrcyhzdHJ1Y3QgYW1kZ3B1X2RldmljZSAqYWRldikK IAkJYW1kZ3B1X2RldmljZV9pcF9ibG9ja19hZGQoYWRldiwgJmNpa19paF9pcF9ibG9jayk7CiAJ CWFtZGdwdV9kZXZpY2VfaXBfYmxvY2tfYWRkKGFkZXYsICZnZnhfdjdfMl9pcF9ibG9jayk7CiAJ CWFtZGdwdV9kZXZpY2VfaXBfYmxvY2tfYWRkKGFkZXYsICZjaWtfc2RtYV9pcF9ibG9jayk7Ci0J CWlmIChhbWRncHVfZHBtID09IC0xKQotCQkJYW1kZ3B1X2RldmljZV9pcF9ibG9ja19hZGQoYWRl diwgJnBwX3NtdV9pcF9ibG9jayk7Ci0JCWVsc2UKLQkJCWFtZGdwdV9kZXZpY2VfaXBfYmxvY2tf YWRkKGFkZXYsICZjaV9zbXVfaXBfYmxvY2spOworCQlhbWRncHVfZGV2aWNlX2lwX2Jsb2NrX2Fk ZChhZGV2LCAmcHBfc211X2lwX2Jsb2NrKTsKIAkJaWYgKGFkZXYtPmVuYWJsZV92aXJ0dWFsX2Rp c3BsYXkpCiAJCQlhbWRncHVfZGV2aWNlX2lwX2Jsb2NrX2FkZChhZGV2LCAmZGNlX3ZpcnR1YWxf aXBfYmxvY2spOwogI2lmIGRlZmluZWQoQ09ORklHX0RSTV9BTURfREMpCkBAIC0yMDkxLDEwICsy MDg4LDcgQEAgaW50IGNpa19zZXRfaXBfYmxvY2tzKHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2 KQogCQlhbWRncHVfZGV2aWNlX2lwX2Jsb2NrX2FkZChhZGV2LCAmY2lrX2loX2lwX2Jsb2NrKTsK IAkJYW1kZ3B1X2RldmljZV9pcF9ibG9ja19hZGQoYWRldiwgJmdmeF92N18zX2lwX2Jsb2NrKTsK IAkJYW1kZ3B1X2RldmljZV9pcF9ibG9ja19hZGQoYWRldiwgJmNpa19zZG1hX2lwX2Jsb2NrKTsK LQkJaWYgKGFtZGdwdV9kcG0gPT0gLTEpCi0JCQlhbWRncHVfZGV2aWNlX2lwX2Jsb2NrX2FkZChh ZGV2LCAmcHBfc211X2lwX2Jsb2NrKTsKLQkJZWxzZQotCQkJYW1kZ3B1X2RldmljZV9pcF9ibG9j a19hZGQoYWRldiwgJmNpX3NtdV9pcF9ibG9jayk7CisJCWFtZGdwdV9kZXZpY2VfaXBfYmxvY2tf YWRkKGFkZXYsICZwcF9zbXVfaXBfYmxvY2spOwogCQlpZiAoYWRldi0+ZW5hYmxlX3ZpcnR1YWxf ZGlzcGxheSkKIAkJCWFtZGdwdV9kZXZpY2VfaXBfYmxvY2tfYWRkKGFkZXYsICZkY2VfdmlydHVh bF9pcF9ibG9jayk7CiAjaWYgZGVmaW5lZChDT05GSUdfRFJNX0FNRF9EQykKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Npa19kcG0uaCBiL2RyaXZlcnMvZ3B1L2RybS9h bWQvYW1kZ3B1L2Npa19kcG0uaAppbmRleCAyYTA4NjYxMGY3NGQuLjJmY2M0YjYwMTUzYyAxMDA2 NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvY2lrX2RwbS5oCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2Npa19kcG0uaApAQCAtMjQsNyArMjQsNiBAQAogI2lmbmRl ZiBfX0NJS19EUE1fSF9fCiAjZGVmaW5lIF9fQ0lLX0RQTV9IX18KIAotZXh0ZXJuIGNvbnN0IHN0 cnVjdCBhbWRncHVfaXBfYmxvY2tfdmVyc2lvbiBjaV9zbXVfaXBfYmxvY2s7CiBleHRlcm4gY29u c3Qgc3RydWN0IGFtZGdwdV9pcF9ibG9ja192ZXJzaW9uIGt2X3NtdV9pcF9ibG9jazsKIAogI2Vu ZGlmCi0tIAoyLjIwLjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmFtZC1nZnggbWFpbGluZyBsaXN0CmFtZC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3Jn Cmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vYW1kLWdmeAo=