From mboxrd@z Thu Jan 1 00:00:00 1970 From: Alex Deucher Subject: [PATCH 24/51] drm/amd/powerplay: add Fiji SMU support. Date: Thu, 12 Nov 2015 01:18:14 -0500 Message-ID: <1447309121-2480-25-git-send-email-alexander.deucher@amd.com> References: <1447309121-2480-1-git-send-email-alexander.deucher@amd.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-qg0-f41.google.com (mail-qg0-f41.google.com [209.85.192.41]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9C2EB7A112 for ; Wed, 11 Nov 2015 22:19:16 -0800 (PST) Received: by qgea14 with SMTP id a14so40616572qge.0 for ; Wed, 11 Nov 2015 22:19:15 -0800 (PST) In-Reply-To: <1447309121-2480-1-git-send-email-alexander.deucher@amd.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org Cc: Eric Huang List-Id: dri-devel@lists.freedesktop.org RnJvbTogRXJpYyBIdWFuZyA8SmluSHVpRXJpYy5IdWFuZ0BhbWQuY29tPgoKQWRkIHN1cHBvcnQg Zm9yIHRoZSBTTVUgbWFuYWdlciBmb3IgRmlqaS4gVGhpcyBoYW5kbGVzIHRoZQpmaXJtd2FyZSBs b2FkaW5nIGZvciBvdGhlciBJUCBibG9ja3MgKEdGWCwgU0RNQSwgZXRjLikuCgpSZXZpZXdlZC1i eTogQWxleCBEZXVjaGVyIDxhbGV4YW5kZXIuZGV1Y2hlckBhbWQuY29tPgpTaWduZWQtb2ZmLWJ5 OiBFcmljIEh1YW5nIDxKaW5IdWlFcmljLkh1YW5nQGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUv ZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL01ha2VmaWxlICAgICAgfCAgICAyICstCiBkcml2ZXJz L2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3IvZmlqaV9zbXVtZ3IuYyB8IDEwMzUgKysrKysr KysrKysrKysrKysrKysKIGRyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci9maWpp X3NtdW1nci5oIHwgICA3NyArKwogZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdy L3NtdW1nci5jICAgICAgfCAgICA0ICsKIDQgZmlsZXMgY2hhbmdlZCwgMTExNyBpbnNlcnRpb25z KCspLCAxIGRlbGV0aW9uKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvc211bWdyL2Zpamlfc211bWdyLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3IvZmlqaV9zbXVtZ3IuaAoKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci9NYWtlZmlsZSBiL2RyaXZl cnMvZ3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci9NYWtlZmlsZQppbmRleCAwZTMzNDhkLi42 YzRlZjEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3Iv TWFrZWZpbGUKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL01ha2Vm aWxlCkBAIC0yLDcgKzIsNyBAQAogIyBNYWtlZmlsZSBmb3IgdGhlICdzbXUgbWFuYWdlcicgc3Vi LWNvbXBvbmVudCBvZiBwb3dlcnBsYXkuCiAjIEl0IHByb3ZpZGVzIHRoZSBzbXUgbWFuYWdlbWVu dCBzZXJ2aWNlcyBmb3IgdGhlIGRyaXZlci4KIAotU01VX01HUiA9IHNtdW1nci5vIGN6X3NtdW1n ci5vIHRvbmdhX3NtdW1nci5vCitTTVVfTUdSID0gc211bWdyLm8gY3pfc211bWdyLm8gdG9uZ2Ff c211bWdyLm8gZmlqaV9zbXVtZ3IubwogCiBBTURfUFBfU01VTUdSID0gJChhZGRwcmVmaXggJChB TURfUFBfUEFUSCkvc211bWdyLywkKFNNVV9NR1IpKQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3IvZmlqaV9zbXVtZ3IuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9hbWQvcG93ZXJwbGF5L3NtdW1nci9maWppX3NtdW1nci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAuLmM5NmI0NTgKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9k cm0vYW1kL3Bvd2VycGxheS9zbXVtZ3IvZmlqaV9zbXVtZ3IuYwpAQCAtMCwwICsxLDEwMzUgQEAK Ky8qCisgKiBDb3B5cmlnaHQgMjAxNSBBZHZhbmNlZCBNaWNybyBEZXZpY2VzLCBJbmMuCisgKgor ICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBw ZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRl ZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRo ZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0 aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwg ZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29m dHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMg ZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoK KyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5v dGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBw b3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVE ICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElN UExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVS Q0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5P TklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUgQ09QWVJJR0hUIEhPTERF UihTKSBPUiBBVVRIT1IoUykgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IKKyAq IE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQg T1IgT1RIRVJXSVNFLAorICogQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBX SVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SCisgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUg U09GVFdBUkUuCisgKgorICovCisKKyNpbmNsdWRlICJzbXVtZ3IuaCIKKyNpbmNsdWRlICJzbXU3 My5oIgorI2luY2x1ZGUgInNtdV91Y29kZV94ZmVyX3ZpLmgiCisjaW5jbHVkZSAiZmlqaV9zbXVt Z3IuaCIKKyNpbmNsdWRlICJmaWppX3Bwc21jLmgiCisjaW5jbHVkZSAic211NzNfZGlzY3JldGUu aCIKKyNpbmNsdWRlICJwcGF0b21jdHJsLmgiCisjaW5jbHVkZSAic211L3NtdV83XzFfM19kLmgi CisjaW5jbHVkZSAic211L3NtdV83XzFfM19zaF9tYXNrLmgiCisjaW5jbHVkZSAiZ21jL2dtY184 XzFfZC5oIgorI2luY2x1ZGUgImdtYy9nbWNfOF8xX3NoX21hc2suaCIKKyNpbmNsdWRlICJvc3Mv b3NzXzNfMF9kLmgiCisjaW5jbHVkZSAiZ2NhL2dmeF84XzBfZC5oIgorI2luY2x1ZGUgImJpZi9i aWZfNV8wX2QuaCIKKyNpbmNsdWRlICJiaWYvYmlmXzVfMF9zaF9tYXNrLmgiCisjaW5jbHVkZSAi cHBfZGVidWcuaCIKKyNpbmNsdWRlICJmaWppX3B3cnZpcnVzLmgiCisKKyNkZWZpbmUgQVZGU19F Tl9NU0IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU2OAorI2RlZmlu ZSBBVkZTX0VOX0xTQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTY4 CisKKyNkZWZpbmUgRklKSV9TTUNfU0laRSAweDIwMDAwCisKK3N0cnVjdCBTTVU3M19EaXNjcmV0 ZV9HcmFwaGljc0xldmVsIGF2ZnNfZ3JhcGhpY3NfbGV2ZWxbOF0gPSB7CisJCS8qICBNaW4gICAg ICAgIFNjbGsgICAgICAgcGNpZSAgICAgRGVlcFNsZWVwIEFjdGl2aXR5ICBDZ1NwbGwgICAgICBD Z1NwbGwgICAgc3BsbFNwcmVhZCAgU3BsbFNwcmVhZCAgIENjUHdyICBDY1B3ciAgU2NsayAgIERp c3BsYXkgICAgIEVuYWJsZWQgICAgIEVuYWJsZWQgICAgICAgICAgICAgICAgICAgICAgIFZvbHRh Z2UgICAgUG93ZXIgKi8KKwkJLyogVm9sdGFnZSwgIEZyZXF1ZW5jeSwgIERwbUxldmVsLCAgRGl2 SWQsICAgIExldmVsLCAgRnVuY0NudGwzLCAgRnVuY0NudGw0LCAgU3BlY3RydW0sICAgU3BlY3Ry dW0yLCAgRHluUm0sIER5blJtMSAgRGlkLCBXYXRlcm1hcmssIEZvckFjdGl2aXR5LCBGb3JUaHJv dHRsZSwgVXBIeXN0LCBEb3duSHlzdCwgRG93bkh5c3QsIFRocm90dGxlICovCisJCXsgMHgzYzBm ZDA0NywgMHgzMDc1MDAwMCwgICAweDAwLCAgICAgMHgwMywgICAweDFlMDAsIDB4MDAyMDA0MTAs IDB4ODcwMjAwMDAsIDB4MjE2ODAwMDAsIDB4MGMwMDAwMDAsICAgMCwgICAgICAwLCAgIDB4MTYs ICAgMHgwMCwgICAgICAgMHgwMSwgICAgICAgIDB4MDEsICAgICAgMHgwMCwgICAweDAwLCAgICAg IDB4MDAsICAgICAweDAwIH0sCisJCXsgMHhhMDBmZDA0NywgMHg0MDljMDAwMCwgICAweDAxLCAg ICAgMHgwNCwgICAweDFlMDAsIDB4MDA4MDA1MTAsIDB4ODcwMjAwMDAsIDB4MjE2ODAwMDAsIDB4 MTEwMDAwMDAsICAgMCwgICAgICAwLCAgIDB4MTYsICAgMHgwMCwgICAgICAgMHgwMSwgICAgICAg IDB4MDEsICAgICAgMHgwMCwgICAweDAwLCAgICAgIDB4MDAsICAgICAweDAwIH0sCisJCXsgMHgw NDEwZDA0NywgMHg1MGMzMDAwMCwgICAweDAxLCAgICAgMHgwMCwgICAweDFlMDAsIDB4MDA2MDA0 MTAsIDB4ODcwMjAwMDAsIDB4MjE2ODAwMDAsIDB4MGQwMDAwMDAsICAgMCwgICAgICAwLCAgIDB4 MGUsICAgMHgwMCwgICAgICAgMHgwMSwgICAgICAgIDB4MDEsICAgICAgMHgwMCwgICAweDAwLCAg ICAgIDB4MDAsICAgICAweDAwIH0sCisJCXsgMHg2ODEwZDA0NywgMHg2MGVhMDAwMCwgICAweDAx LCAgICAgMHgwMCwgICAweDFlMDAsIDB4MDA4MDA0MTAsIDB4ODcwMjAwMDAsIDB4MjE2ODAwMDAs IDB4MGUwMDAwMDAsICAgMCwgICAgICAwLCAgIDB4MGMsICAgMHgwMCwgICAgICAgMHgwMSwgICAg ICAgIDB4MDEsICAgICAgMHgwMCwgICAweDAwLCAgICAgIDB4MDAsICAgICAweDAwIH0sCisJCXsg MHhjYzEwZDA0NywgMHhlOGZkMDAwMCwgICAweDAxLCAgICAgMHgwMCwgICAweDFlMDAsIDB4MDBl MDA0MTAsIDB4ODcwMjAwMDAsIDB4MjE2ODAwMDAsIDB4MGYwMDAwMDAsICAgMCwgICAgICAwLCAg IDB4MGMsICAgMHgwMCwgICAgICAgMHgwMSwgICAgICAgIDB4MDEsICAgICAgMHgwMCwgICAweDAw LCAgICAgIDB4MDAsICAgICAweDAwIH0sCisJCXsgMHgzMDExZDA0NywgMHg3MDExMDEwMCwgICAw eDAxLCAgICAgMHgwMCwgICAweDFlMDAsIDB4MDA0MDA1MTAsIDB4ODcwMjAwMDAsIDB4MjE2ODAw MDAsIDB4MTAwMDAwMDAsICAgMCwgICAgICAwLCAgIDB4MGMsICAgMHgwMCwgICAgICAgMHgwMSwg ICAgICAgIDB4MDEsICAgICAgMHgwMCwgICAweDAwLCAgICAgIDB4MDAsICAgICAweDAwIH0sCisJ CXsgMHg5NDExZDA0NywgMHhmODI0MDEwMCwgICAweDAxLCAgICAgMHgwMCwgICAweDFlMDAsIDB4 MDBhMDA1MTAsIDB4ODcwMjAwMDAsIDB4MjE2ODAwMDAsIDB4MTEwMDAwMDAsICAgMCwgICAgICAw LCAgIDB4MGMsICAgMHgwMCwgICAgICAgMHgwMSwgICAgICAgIDB4MDEsICAgICAgMHgwMCwgICAw eDAwLCAgICAgIDB4MDAsICAgICAweDAwIH0sCisJCXsgMHhmODExZDA0NywgMHg4MDM4MDEwMCwg ICAweDAxLCAgICAgMHgwMCwgICAweDFlMDAsIDB4MDAwMDA2MTAsIDB4ODcwMjAwMDAsIDB4MjE2 ODAwMDAsIDB4MTIwMDAwMDAsICAgMCwgICAgICAwLCAgIDB4MGMsICAgMHgwMSwgICAgICAgMHgw MSwgICAgICAgIDB4MDEsICAgICAgMHgwMCwgICAweDAwLCAgICAgIDB4MDAsICAgICAweDAwIH0K K307CisKK3N0YXRpYyBlbnVtIGNnc191Y29kZV9pZCBmaWppX2NvbnZlcnRfZndfdHlwZV90b19j Z3ModWludDMyX3QgZndfdHlwZSkKK3sKKwllbnVtIGNnc191Y29kZV9pZCByZXN1bHQgPSBDR1Nf VUNPREVfSURfTUFYSU1VTTsKKworCXN3aXRjaCAoZndfdHlwZSkgeworCWNhc2UgVUNPREVfSURf U01VOgorCQlyZXN1bHQgPSBDR1NfVUNPREVfSURfU01VOworCQlicmVhazsKKwljYXNlIFVDT0RF X0lEX1NETUEwOgorCQlyZXN1bHQgPSBDR1NfVUNPREVfSURfU0RNQTA7CisJCWJyZWFrOworCWNh c2UgVUNPREVfSURfU0RNQTE6CisJCXJlc3VsdCA9IENHU19VQ09ERV9JRF9TRE1BMTsKKwkJYnJl YWs7CisJY2FzZSBVQ09ERV9JRF9DUF9DRToKKwkJcmVzdWx0ID0gQ0dTX1VDT0RFX0lEX0NQX0NF OworCQlicmVhazsKKwljYXNlIFVDT0RFX0lEX0NQX1BGUDoKKwkJcmVzdWx0ID0gQ0dTX1VDT0RF X0lEX0NQX1BGUDsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9DUF9NRToKKwkJcmVzdWx0ID0g Q0dTX1VDT0RFX0lEX0NQX01FOworCQlicmVhazsKKwljYXNlIFVDT0RFX0lEX0NQX01FQzoKKwkJ cmVzdWx0ID0gQ0dTX1VDT0RFX0lEX0NQX01FQzsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9D UF9NRUNfSlQxOgorCQlyZXN1bHQgPSBDR1NfVUNPREVfSURfQ1BfTUVDX0pUMTsKKwkJYnJlYWs7 CisJY2FzZSBVQ09ERV9JRF9DUF9NRUNfSlQyOgorCQlyZXN1bHQgPSBDR1NfVUNPREVfSURfQ1Bf TUVDX0pUMjsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9STENfRzoKKwkJcmVzdWx0ID0gQ0dT X1VDT0RFX0lEX1JMQ19HOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwly ZXR1cm4gcmVzdWx0OworfQorLyoqCisqIFNldCB0aGUgYWRkcmVzcyBmb3IgcmVhZGluZy93cml0 aW5nIHRoZSBTTUMgU1JBTSBzcGFjZS4KKyogQHBhcmFtICAgIHNtdW1nciAgdGhlIGFkZHJlc3Mg b2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcGFyYW0gICAgc21jX2FkZHIg dGhlIGFkZHJlc3MgaW4gdGhlIFNNQyBSQU0gdG8gYWNjZXNzLgorKi8KK3N0YXRpYyBpbnQgZmlq aV9zZXRfc21jX3NyYW1fYWRkcmVzcyhzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IsCisJCXVpbnQz Ml90IHNtY19hZGRyLCB1aW50MzJfdCBsaW1pdCkKK3sKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKCgw ID09ICgzICYgc21jX2FkZHIpKSwKKwkJCSJTTUMgYWRkcmVzcyBtdXN0IGJlIDQgYnl0ZSBhbGln bmVkLiIsIHJldHVybiAtRUlOVkFMOyk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgobGltaXQgPiAo c21jX2FkZHIgKyAzKSksCisJCQkiU01DIGFkZHJlc3MgaXMgYmV5b25kIHRoZSBTTUMgUkFNIGFy ZWEuIiwgcmV0dXJuIC1FSU5WQUw7KTsKKworCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRl dmljZSwgbW1TTUNfSU5EX0lOREVYXzAsIHNtY19hZGRyKTsKKwlTTVVNX1dSSVRFX0ZJRUxEKHNt dW1nci0+ZGV2aWNlLCBTTUNfSU5EX0FDQ0VTU19DTlRMLCBBVVRPX0lOQ1JFTUVOVF9JTkRfMCwg MCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoqCisqIENvcHkgYnl0ZXMgZnJvbSBhbiBhcnJheSBp bnRvIHRoZSBTTUMgUkFNIHNwYWNlLgorKgorKiBAcGFyYW0gICAgc211bWdyICB0aGUgYWRkcmVz cyBvZiB0aGUgcG93ZXJwbGF5IFNNVSBtYW5hZ2VyLgorKiBAcGFyYW0gICAgc21jU3RhcnRBZGRy ZXNzIHRoZSBzdGFydCBhZGRyZXNzIGluIHRoZSBTTUMgUkFNIHRvIGNvcHkgYnl0ZXMgdG8uCisq IEBwYXJhbSAgICBzcmMgdGhlIGJ5dGUgYXJyYXkgdG8gY29weSB0aGUgYnl0ZXMgZnJvbS4KKyog QHBhcmFtICAgIGJ5dGVDb3VudCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkuCisqLworaW50 IGZpamlfY29weV9ieXRlc190b19zbWMoc3RydWN0IHBwX3NtdW1nciAqc211bWdyLAorCQl1aW50 MzJfdCBzbWNTdGFydEFkZHJlc3MsIGNvbnN0IHVpbnQ4X3QgKnNyYywKKwkJdWludDMyX3QgYnl0 ZUNvdW50LCB1aW50MzJfdCBsaW1pdCkKK3sKKwlpbnQgcmVzdWx0OworCXVpbnQzMl90IGRhdGEs IG9yaWdpbmFsRGF0YTsKKwl1aW50MzJfdCBhZGRyLCBleHRyYVNoaWZ0OworCisJUFBfQVNTRVJU X1dJVEhfQ09ERSgoMCA9PSAoMyAmIHNtY1N0YXJ0QWRkcmVzcykpLAorCQkJIlNNQyBhZGRyZXNz IG11c3QgYmUgNCBieXRlIGFsaWduZWQuIiwgcmV0dXJuIC1FSU5WQUw7KTsKKwlQUF9BU1NFUlRf V0lUSF9DT0RFKChsaW1pdCA+IChzbWNTdGFydEFkZHJlc3MgKyBieXRlQ291bnQpKSwKKwkJCSJT TUMgYWRkcmVzcyBpcyBiZXlvbmQgdGhlIFNNQyBSQU0gYXJlYS4iLCByZXR1cm4gLUVJTlZBTDsp OworCisJYWRkciA9IHNtY1N0YXJ0QWRkcmVzczsKKworCXdoaWxlIChieXRlQ291bnQgPj0gNCkg eworCQkvKiBCeXRlcyBhcmUgd3JpdHRlbiBpbnRvIHRoZSBTTUMgYWRkcmVzIHNwYWNlIHdpdGgg dGhlIE1TQiBmaXJzdC4gKi8KKwkJZGF0YSA9IHNyY1swXSAqIDB4MTAwMDAwMCArIHNyY1sxXSAq IDB4MTAwMDAgKyBzcmNbMl0gKiAweDEwMCArIHNyY1szXTsKKworCQlyZXN1bHQgPSBmaWppX3Nl dF9zbWNfc3JhbV9hZGRyZXNzKHNtdW1nciwgYWRkciwgbGltaXQpOworCQlpZiAocmVzdWx0KQor CQkJcmV0dXJuIHJlc3VsdDsKKworCQljZ3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2Us IG1tU01DX0lORF9EQVRBXzAsIGRhdGEpOworCisJCXNyYyArPSA0OworCQlieXRlQ291bnQgLT0g NDsKKwkJYWRkciArPSA0OworCX0KKworCWlmIChieXRlQ291bnQpIHsKKwkJLyogTm93IHdyaXRl IHRoZSBvZGQgYnl0ZXMgbGVmdC4KKwkJICogRG8gYSByZWFkIG1vZGlmeSB3cml0ZSBjeWNsZS4K KwkJICovCisJCWRhdGEgPSAwOworCisJCXJlc3VsdCA9IGZpamlfc2V0X3NtY19zcmFtX2FkZHJl c3Moc211bWdyLCBhZGRyLCBsaW1pdCk7CisJCWlmIChyZXN1bHQpCisJCQlyZXR1cm4gcmVzdWx0 OworCisJCW9yaWdpbmFsRGF0YSA9IGNnc19yZWFkX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLCBt bVNNQ19JTkRfREFUQV8wKTsKKwkJZXh0cmFTaGlmdCA9IDggKiAoNCAtIGJ5dGVDb3VudCk7CisK KwkJd2hpbGUgKGJ5dGVDb3VudCA+IDApIHsKKwkJCS8qIEJ5dGVzIGFyZSB3cml0dGVuIGludG8g dGhlIFNNQyBhZGRyZXMKKwkJCSAqIHNwYWNlIHdpdGggdGhlIE1TQiBmaXJzdC4KKwkJCSAqLwor CQkJZGF0YSA9ICgweDEwMCAqIGRhdGEpICsgKnNyYysrOworCQkJYnl0ZUNvdW50LS07CisJCX0K KwkJZGF0YSA8PD0gZXh0cmFTaGlmdDsKKwkJZGF0YSB8PSAob3JpZ2luYWxEYXRhICYgfigofjBV TCkgPDwgZXh0cmFTaGlmdCkpOworCisJCXJlc3VsdCA9IGZpamlfc2V0X3NtY19zcmFtX2FkZHJl c3Moc211bWdyLCBhZGRyLCBsaW1pdCk7CisJCWlmICghcmVzdWx0KQorCQkJcmV0dXJuIHJlc3Vs dDsKKworCQljZ3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX0lORF9EQVRB XzAsIGRhdGEpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGZpamlfcHJvZ3JhbV9qdW1wX29u X3N0YXJ0KHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlzdGF0aWMgdW5zaWduZWQgY2hh ciBkYXRhW10gPSB7IDB4RTAsIDB4MDAsIDB4ODAsIDB4NDAgfTsKKworCWZpamlfY29weV9ieXRl c190b19zbWMoc211bWdyLCAweDAsIGRhdGEsIDQsIHNpemVvZihkYXRhKSArIDEpOworCisJcmV0 dXJuIDA7Cit9CisKKy8qKgorKiBSZXR1cm4gaWYgdGhlIFNNQyBpcyBjdXJyZW50bHkgcnVubmlu Zy4KKyoKKyogQHBhcmFtICAgIHNtdW1nciAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBo YXJkd2FyZSBtYW5hZ2VyLgorKi8KK2Jvb2wgZmlqaV9pc19zbWNfcmFtX3J1bm5pbmcoc3RydWN0 IHBwX3NtdW1nciAqc211bWdyKQoreworCXJldHVybiAoKDAgPT0gU01VTV9SRUFEX1ZGUEZfSU5E SVJFQ1RfRklFTEQoc211bWdyLT5kZXZpY2UsCisJCQlDR1NfSU5EX1JFR19fU01DLAorCQkJU01D X1NZU0NPTl9DTE9DS19DTlRMXzAsIGNrX2Rpc2FibGUpKQorCQkJJiYgKDB4MjAxMDAgPD0gY2dz X3JlYWRfaW5kX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLAorCQkJCQlDR1NfSU5EX1JFR19fU01D LCBpeFNNQ19QQ19DKSkpOworfQorCisvKioKKyogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFNNQywg YW5kIHdhaXQgZm9yIGl0cyByZXNwb25zZS4KKyoKKyogQHBhcmFtICAgIHNtdW1nciAgdGhlIGFk ZHJlc3Mgb2YgdGhlIHBvd2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcGFyYW0gICAgbXNn IHRoZSBtZXNzYWdlIHRvIHNlbmQuCisqIEByZXR1cm4gICBUaGUgcmVzcG9uc2UgdGhhdCBjYW1l IGZyb20gdGhlIFNNQy4KKyovCitpbnQgZmlqaV9zZW5kX21zZ190b19zbWMoc3RydWN0IHBwX3Nt dW1nciAqc211bWdyLCB1aW50MTZfdCBtc2cpCit7CisJaWYgKCFmaWppX2lzX3NtY19yYW1fcnVu bmluZyhzbXVtZ3IpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoMSAhPSBTTVVNX1JFQURfRklFTEQo c211bWdyLT5kZXZpY2UsIFNNQ19SRVNQXzAsIFNNQ19SRVNQKSkgeworCQlwcmludGsoS0VSTl9F UlIgIkZhaWxlZCB0byBzZW5kIFByZXZpb3VzIE1lc3NhZ2UuIik7CisJCVNNVU1fV0FJVF9GSUVM RF9VTkVRVUFMKHNtdW1nciwgU01DX1JFU1BfMCwgU01DX1JFU1AsIDApOworCX0KKworCWNnc193 cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgbW1TTUNfTUVTU0FHRV8wLCBtc2cpOworICAg IFNNVU1fV0FJVF9GSUVMRF9VTkVRVUFMKHNtdW1nciwgU01DX1JFU1BfMCwgU01DX1JFU1AsIDAp OworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKgorICogU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIFNN QyB3aXRoIHBhcmFtZXRlcgorICogQHBhcmFtICAgIHNtdW1ncjogIHRoZSBhZGRyZXNzIG9mIHRo ZSBwb3dlcnBsYXkgaGFyZHdhcmUgbWFuYWdlci4KKyAqIEBwYXJhbSAgICBtc2c6IHRoZSBtZXNz YWdlIHRvIHNlbmQuCisgKiBAcGFyYW0gICAgcGFyYW1ldGVyOiB0aGUgcGFyYW1ldGVyIHRvIHNl bmQKKyAqIEByZXR1cm4gICBUaGUgcmVzcG9uc2UgdGhhdCBjYW1lIGZyb20gdGhlIFNNQy4KKyAq LworaW50IGZpamlfc2VuZF9tc2dfdG9fc21jX3dpdGhfcGFyYW1ldGVyKHN0cnVjdCBwcF9zbXVt Z3IgKnNtdW1nciwKKwkJdWludDE2X3QgbXNnLCB1aW50MzJfdCBwYXJhbWV0ZXIpCit7CisJaWYg KCFmaWppX2lzX3NtY19yYW1fcnVubmluZyhzbXVtZ3IpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAo MSAhPSBTTVVNX1JFQURfRklFTEQoc211bWdyLT5kZXZpY2UsIFNNQ19SRVNQXzAsIFNNQ19SRVNQ KSkgeworCQlwcmludGsoS0VSTl9FUlIgIkZhaWxlZCB0byBzZW5kIFByZXZpb3VzIE1lc3NhZ2Uu Iik7CisJCVNNVU1fV0FJVF9GSUVMRF9VTkVRVUFMKHNtdW1nciwgU01DX1JFU1BfMCwgU01DX1JF U1AsIDApOworCX0KKworCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgbW1TTUNf TVNHX0FSR18wLCBwYXJhbWV0ZXIpOworCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRldmlj ZSwgbW1TTUNfTUVTU0FHRV8wLCBtc2cpOworCVNNVU1fV0FJVF9GSUVMRF9VTkVRVUFMKHNtdW1n ciwgU01DX1JFU1BfMCwgU01DX1JFU1AsIDApOworCisJcmV0dXJuIDA7Cit9CisKKworLyoqCisq IFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBTTUMgd2l0aCBwYXJhbWV0ZXIsIGRvIG5vdCB3YWl0IGZv ciByZXNwb25zZQorKgorKiBAcGFyYW0gICAgc211bWdyOiAgdGhlIGFkZHJlc3Mgb2YgdGhlIHBv d2VycGxheSBoYXJkd2FyZSBtYW5hZ2VyLgorKiBAcGFyYW0gICAgbXNnOiB0aGUgbWVzc2FnZSB0 byBzZW5kLgorKiBAcGFyYW0gICAgcGFyYW1ldGVyOiB0aGUgcGFyYW1ldGVyIHRvIHNlbmQKKyog QHJldHVybiAgIFRoZSByZXNwb25zZSB0aGF0IGNhbWUgZnJvbSB0aGUgU01DLgorKi8KK2ludCBm aWppX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcl93aXRob3V0X3dhaXRpbmcoCisJCXN0 cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwgdWludDE2X3QgbXNnLCB1aW50MzJfdCBwYXJhbWV0ZXIp Cit7CisJaWYgKDEgIT0gU01VTV9SRUFEX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBTTUNfUkVTUF8w LCBTTUNfUkVTUCkpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJGYWlsZWQgdG8gc2VuZCBQcmV2aW91 cyBNZXNzYWdlLiIpOworCQlTTVVNX1dBSVRfRklFTERfVU5FUVVBTChzbXVtZ3IsIFNNQ19SRVNQ XzAsIFNNQ19SRVNQLCAwKTsKKwl9CisJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNl LCBtbVNNQ19NU0dfQVJHXzAsIHBhcmFtZXRlcik7CisJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1n ci0+ZGV2aWNlLCBtbVNNQ19NRVNTQUdFXzAsIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoq CisqIFVwbG9hZHMgdGhlIFNNVSBmaXJtd2FyZSBmcm9tIC5oZXggZmlsZQorKgorKiBAcGFyYW0g ICAgc211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IFNNVSBtYW5hZ2VyLgorKiBA cmV0dXJuICAgMCBvciAtMS4KKyovCisKK3N0YXRpYyBpbnQgZmlqaV91cGxvYWRfc211X2Zpcm13 YXJlX2ltYWdlKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwljb25zdCB1aW50OF90ICpz cmM7CisJdWludDMyX3QgYnl0ZV9jb3VudDsKKwl1aW50MzJfdCAqZGF0YTsKKwlzdHJ1Y3QgY2dz X2Zpcm13YXJlX2luZm8gaW5mbyA9IHswfTsKKworCWNnc19nZXRfZmlybXdhcmVfaW5mbyhzbXVt Z3ItPmRldmljZSwKKwkJCWZpamlfY29udmVydF9md190eXBlX3RvX2NncyhVQ09ERV9JRF9TTVUp LCAmaW5mbyk7CisKKwlpZiAoaW5mby5pbWFnZV9zaXplICYgMykgeworCQlwcmludGsoS0VSTl9F UlIgIlNNQyB1Y29kZSBpcyBub3QgNCBieXRlcyBhbGlnbmVkXG4iKTsKKwkJcmV0dXJuIC1FSU5W QUw7CisJfQorCisJaWYgKGluZm8uaW1hZ2Vfc2l6ZSA+IEZJSklfU01DX1NJWkUpIHsKKwkJcHJp bnRrKEtFUk5fRVJSICJTTUMgYWRkcmVzcyBpcyBiZXlvbmQgdGhlIFNNQyBSQU0gYXJlYVxuIik7 CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRl dmljZSwgbW1TTUNfSU5EX0lOREVYXzAsIDB4MjAwMDApOworCVNNVU1fV1JJVEVfRklFTEQoc211 bWdyLT5kZXZpY2UsIFNNQ19JTkRfQUNDRVNTX0NOVEwsIEFVVE9fSU5DUkVNRU5UX0lORF8wLCAx KTsKKworCWJ5dGVfY291bnQgPSBpbmZvLmltYWdlX3NpemU7CisJc3JjID0gKGNvbnN0IHVpbnQ4 X3QgKilpbmZvLmtwdHI7CisKKwlkYXRhID0gKHVpbnQzMl90ICopc3JjOworCWZvciAoOyBieXRl X2NvdW50ID49IDQ7IGRhdGErKywgYnl0ZV9jb3VudCAtPSA0KQorCQljZ3Nfd3JpdGVfcmVnaXN0 ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX0lORF9EQVRBXzAsIGRhdGFbMF0pOworCisJU01VTV9X UklURV9GSUVMRChzbXVtZ3ItPmRldmljZSwgU01DX0lORF9BQ0NFU1NfQ05UTCwgQVVUT19JTkNS RU1FTlRfSU5EXzAsIDApOworCXJldHVybiAwOworfQorCisvKioKKyogUmVhZCBhIDMyYml0IHZh bHVlIGZyb20gdGhlIFNNQyBTUkFNIHNwYWNlLgorKiBBTEwgUEFSQU1FVEVSUyBBUkUgSU4gSE9T VCBCWVRFIE9SREVSLgorKiBAcGFyYW0gICAgc211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93 ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisqIEBwYXJhbSAgICBzbWNfYWRkciB0aGUgYWRkcmVz cyBpbiB0aGUgU01DIFJBTSB0byBhY2Nlc3MuCisqIEBwYXJhbSAgICB2YWx1ZSBhbmQgb3V0cHV0 IHBhcmFtZXRlciBmb3IgdGhlIGRhdGEgcmVhZCBmcm9tIHRoZSBTTUMgU1JBTS4KKyovCitpbnQg ZmlqaV9yZWFkX3NtY19zcmFtX2R3b3JkKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwgdWludDMy X3Qgc21jX2FkZHIsCisJCXVpbnQzMl90ICp2YWx1ZSwgdWludDMyX3QgbGltaXQpCit7CisJaW50 CXJlc3VsdCA9IGZpamlfc2V0X3NtY19zcmFtX2FkZHJlc3Moc211bWdyLCBzbWNfYWRkciwgbGlt aXQpOworCisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCSp2YWx1ZSA9IGNnc19y ZWFkX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLCBtbVNNQ19JTkRfREFUQV8wKTsKKwlyZXR1cm4g MDsKK30KKworLyoqCisqIFdyaXRlIGEgMzJiaXQgdmFsdWUgdG8gdGhlIFNNQyBTUkFNIHNwYWNl LgorKiBBTEwgUEFSQU1FVEVSUyBBUkUgSU4gSE9TVCBCWVRFIE9SREVSLgorKiBAcGFyYW0gICAg c211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisq IEBwYXJhbSAgICBzbWNfYWRkciB0aGUgYWRkcmVzcyBpbiB0aGUgU01DIFJBTSB0byBhY2Nlc3Mu CisqIEBwYXJhbSAgICB2YWx1ZSB0byB3cml0ZSB0byB0aGUgU01DIFNSQU0uCisqLworaW50IGZp amlfd3JpdGVfc21jX3NyYW1fZHdvcmQoc3RydWN0IHBwX3NtdW1nciAqc211bWdyLCB1aW50MzJf dCBzbWNfYWRkciwKKwkJdWludDMyX3QgdmFsdWUsIHVpbnQzMl90IGxpbWl0KQoreworCWludCBy ZXN1bHQ7CisKKwlyZXN1bHQgPSBmaWppX3NldF9zbWNfc3JhbV9hZGRyZXNzKHNtdW1nciwgc21j X2FkZHIsIGxpbWl0KTsKKworCWlmIChyZXN1bHQpCisJCXJldHVybiByZXN1bHQ7CisKKwljZ3Nf d3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tU01DX0lORF9EQVRBXzAsIHZhbHVlKTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVpbnQzMl90IGZpamlfZ2V0X21hc2tfZm9yX2Zpcm13 YXJlX3R5cGUodWludDMyX3QgZndfdHlwZSkKK3sKKwl1aW50MzJfdCByZXN1bHQgPSAwOworCisJ c3dpdGNoIChmd190eXBlKSB7CisJY2FzZSBVQ09ERV9JRF9TRE1BMDoKKwkJcmVzdWx0ID0gVUNP REVfSURfU0RNQTBfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9TRE1BMToKKwkJcmVz dWx0ID0gVUNPREVfSURfU0RNQTFfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBVQ09ERV9JRF9DUF9D RToKKwkJcmVzdWx0ID0gVUNPREVfSURfQ1BfQ0VfTUFTSzsKKwkJYnJlYWs7CisJY2FzZSBVQ09E RV9JRF9DUF9QRlA6CisJCXJlc3VsdCA9IFVDT0RFX0lEX0NQX1BGUF9NQVNLOworCQlicmVhazsK KwljYXNlIFVDT0RFX0lEX0NQX01FOgorCQlyZXN1bHQgPSBVQ09ERV9JRF9DUF9NRV9NQVNLOwor CQlicmVhazsKKwljYXNlIFVDT0RFX0lEX0NQX01FQ19KVDE6CisJCXJlc3VsdCA9IFVDT0RFX0lE X0NQX01FQ19NQVNLIHwgVUNPREVfSURfQ1BfTUVDX0pUMV9NQVNLOworCQlicmVhazsKKwljYXNl IFVDT0RFX0lEX0NQX01FQ19KVDI6CisJCXJlc3VsdCA9IFVDT0RFX0lEX0NQX01FQ19NQVNLIHwg VUNPREVfSURfQ1BfTUVDX0pUMl9NQVNLOworCQlicmVhazsKKwljYXNlIFVDT0RFX0lEX1JMQ19H OgorCQlyZXN1bHQgPSBVQ09ERV9JRF9STENfR19NQVNLOworCQlicmVhazsKKwlkZWZhdWx0Ogor CQlwcmludGsoS0VSTl9FUlIgIlVDb2RlIHR5cGUgaXMgb3V0IG9mIHJhbmdlISIpOworCQlyZXN1 bHQgPSAwOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIFBvcHVsYXRlIG9uZSBmaXJt d2FyZSBpbWFnZSB0byB0aGUgZGF0YSBzdHJ1Y3R1cmUgKi8KK3N0YXRpYyBpbnQgZmlqaV9wb3B1 bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkoc3RydWN0IHBwX3NtdW1nciAqc211bWdyLAorCQl1 aW50MzJfdCBmd190eXBlLCBzdHJ1Y3QgU01VX0VudHJ5ICplbnRyeSkKK3sKKwlpbnQgcmVzdWx0 OworCXN0cnVjdCBjZ3NfZmlybXdhcmVfaW5mbyBpbmZvID0gezB9OworCisJcmVzdWx0ID0gY2dz X2dldF9maXJtd2FyZV9pbmZvKAorCQkJc211bWdyLT5kZXZpY2UsCisJCQlmaWppX2NvbnZlcnRf ZndfdHlwZV90b19jZ3MoZndfdHlwZSksCisJCQkmaW5mbyk7CisKKwlpZiAoIXJlc3VsdCkgewor CQllbnRyeS0+dmVyc2lvbiA9IDA7CisJCWVudHJ5LT5pZCA9ICh1aW50MTZfdClmd190eXBlOwor CQllbnRyeS0+aW1hZ2VfYWRkcl9oaWdoID0gc211X3VwcGVyXzMyX2JpdHMoaW5mby5tY19hZGRy KTsKKwkJZW50cnktPmltYWdlX2FkZHJfbG93ID0gc211X2xvd2VyXzMyX2JpdHMoaW5mby5tY19h ZGRyKTsKKwkJZW50cnktPm1ldGFfZGF0YV9hZGRyX2hpZ2ggPSAwOworCQllbnRyeS0+bWV0YV9k YXRhX2FkZHJfbG93ID0gMDsKKwkJZW50cnktPmRhdGFfc2l6ZV9ieXRlID0gaW5mby5pbWFnZV9z aXplOworCQllbnRyeS0+bnVtX3JlZ2lzdGVyX2VudHJpZXMgPSAwOworCisJCWlmIChmd190eXBl ID09IFVDT0RFX0lEX1JMQ19HKQorCQkJZW50cnktPmZsYWdzID0gMTsKKwkJZWxzZQorCQkJZW50 cnktPmZsYWdzID0gMDsKKwl9CisKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZp amlfcmVxdWVzdF9zbXVfbG9hZF9mdyhzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IpCit7CisJc3Ry dWN0IGZpamlfc211bWdyICpwcml2ID0gKHN0cnVjdCBmaWppX3NtdW1nciAqKShzbXVtZ3ItPmJh Y2tlbmQpOworCXVpbnQzMl90IGZ3X3RvX2xvYWQ7CisJc3RydWN0IFNNVV9EUkFNRGF0YV9UT0Mg KnRvYzsKKworCWlmIChwcml2LT5zb2Z0X3JlZ3Nfc3RhcnQpCisJCWNnc193cml0ZV9pbmRfcmVn aXN0ZXIoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQkJcHJpdi0+c29mdF9y ZWdzX3N0YXJ0ICsKKwkJCQlvZmZzZXRvZihTTVU3M19Tb2Z0UmVnaXN0ZXJzLCBVY29kZUxvYWRT dGF0dXMpLAorCQkJCTB4MCk7CisKKwl0b2MgPSAoc3RydWN0IFNNVV9EUkFNRGF0YV9UT0MgKilw cml2LT5oZWFkZXI7CisJdG9jLT5udW1fZW50cmllcyA9IDA7CisJdG9jLT5zdHJ1Y3R1cmVfdmVy c2lvbiA9IDE7CisKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJMCA9PSBmaWppX3BvcHVsYXRl X3NpbmdsZV9maXJtd2FyZV9lbnRyeShzbXVtZ3IsCisJCQkJCVVDT0RFX0lEX1JMQ19HLCAmdG9j LT5lbnRyeVt0b2MtPm51bV9lbnRyaWVzKytdKSwKKwkJCSJGYWlsZWQgdG8gR2V0IEZpcm13YXJl IEVudHJ5LlxuIiAsIHJldHVybiAtMSApOworCVBQX0FTU0VSVF9XSVRIX0NPREUoCisJCQkwID09 IGZpamlfcG9wdWxhdGVfc2luZ2xlX2Zpcm13YXJlX2VudHJ5KHNtdW1nciwKKwkJCQkJVUNPREVf SURfQ1BfQ0UsICZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMrK10pLAorCQkJIkZhaWxlZCB0 byBHZXQgRmlybXdhcmUgRW50cnkuXG4iICwgcmV0dXJuIC0xICk7CisJUFBfQVNTRVJUX1dJVEhf Q09ERSgKKwkJCTAgPT0gZmlqaV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkoc211bWdy LAorCQkJCQlVQ09ERV9JRF9DUF9QRlAsICZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMrK10p LAorCQkJIkZhaWxlZCB0byBHZXQgRmlybXdhcmUgRW50cnkuXG4iICwgcmV0dXJuIC0xICk7CisJ UFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCTAgPT0gZmlqaV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdh cmVfZW50cnkoc211bWdyLAorCQkJCQlVQ09ERV9JRF9DUF9NRSwgJnRvYy0+ZW50cnlbdG9jLT5u dW1fZW50cmllcysrXSksCisJCQkiRmFpbGVkIHRvIEdldCBGaXJtd2FyZSBFbnRyeS5cbiIgLCBy ZXR1cm4gLTEgKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJMCA9PSBmaWppX3BvcHVsYXRl X3NpbmdsZV9maXJtd2FyZV9lbnRyeShzbXVtZ3IsCisJCQkJCVVDT0RFX0lEX0NQX01FQywgJnRv Yy0+ZW50cnlbdG9jLT5udW1fZW50cmllcysrXSksCisJCQkiRmFpbGVkIHRvIEdldCBGaXJtd2Fy ZSBFbnRyeS5cbiIgLCByZXR1cm4gLTEgKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJMCA9 PSBmaWppX3BvcHVsYXRlX3NpbmdsZV9maXJtd2FyZV9lbnRyeShzbXVtZ3IsCisJCQkJCVVDT0RF X0lEX0NQX01FQ19KVDEsICZ0b2MtPmVudHJ5W3RvYy0+bnVtX2VudHJpZXMrK10pLAorCQkJCQki RmFpbGVkIHRvIEdldCBGaXJtd2FyZSBFbnRyeS5cbiIgLCByZXR1cm4gLTEgKTsKKwlQUF9BU1NF UlRfV0lUSF9DT0RFKAorCQkJMCA9PSBmaWppX3BvcHVsYXRlX3NpbmdsZV9maXJtd2FyZV9lbnRy eShzbXVtZ3IsCisJCQkJCVVDT0RFX0lEX0NQX01FQ19KVDIsICZ0b2MtPmVudHJ5W3RvYy0+bnVt X2VudHJpZXMrK10pLAorCQkJCQkiRmFpbGVkIHRvIEdldCBGaXJtd2FyZSBFbnRyeS5cbiIgLCBy ZXR1cm4gLTEgKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKAorCQkJMCA9PSBmaWppX3BvcHVsYXRl X3NpbmdsZV9maXJtd2FyZV9lbnRyeShzbXVtZ3IsCisJCQkJCVVDT0RFX0lEX1NETUEwLCAmdG9j LT5lbnRyeVt0b2MtPm51bV9lbnRyaWVzKytdKSwKKwkJCQkJIkZhaWxlZCB0byBHZXQgRmlybXdh cmUgRW50cnkuXG4iICwgcmV0dXJuIC0xICk7CisJUFBfQVNTRVJUX1dJVEhfQ09ERSgKKwkJCTAg PT0gZmlqaV9wb3B1bGF0ZV9zaW5nbGVfZmlybXdhcmVfZW50cnkoc211bWdyLAorCQkJCQlVQ09E RV9JRF9TRE1BMSwgJnRvYy0+ZW50cnlbdG9jLT5udW1fZW50cmllcysrXSksCisJCQkJCSJGYWls ZWQgdG8gR2V0IEZpcm13YXJlIEVudHJ5LlxuIiAsIHJldHVybiAtMSApOworCisJZmlqaV9zZW5k X21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoc211bWdyLCBQUFNNQ19NU0dfRFJWX0RSQU1fQURE Ul9ISSwKKwkJCXByaXYtPmhlYWRlcl9idWZmZXIubWNfYWRkcl9oaWdoKTsKKwlmaWppX3NlbmRf bXNnX3RvX3NtY193aXRoX3BhcmFtZXRlcihzbXVtZ3IsUFBTTUNfTVNHX0RSVl9EUkFNX0FERFJf TE8sCisJCQlwcml2LT5oZWFkZXJfYnVmZmVyLm1jX2FkZHJfbG93KTsKKworCWZ3X3RvX2xvYWQg PSBVQ09ERV9JRF9STENfR19NQVNLCisJCQkrIFVDT0RFX0lEX1NETUEwX01BU0sKKwkJCSsgVUNP REVfSURfU0RNQTFfTUFTSworCQkJKyBVQ09ERV9JRF9DUF9DRV9NQVNLCisJCQkrIFVDT0RFX0lE X0NQX01FX01BU0sKKwkJCSsgVUNPREVfSURfQ1BfUEZQX01BU0sKKwkJCSsgVUNPREVfSURfQ1Bf TUVDX01BU0sKKwkJCSsgVUNPREVfSURfQ1BfTUVDX0pUMV9NQVNLCisJCQkrIFVDT0RFX0lEX0NQ X01FQ19KVDJfTUFTSzsKKworCWlmIChmaWppX3NlbmRfbXNnX3RvX3NtY193aXRoX3BhcmFtZXRl cihzbXVtZ3IsCisJCQlQUFNNQ19NU0dfTG9hZFVjb2RlcywgZndfdG9fbG9hZCkpCisJCXByaW50 ayhLRVJOX0VSUiAiRmFpbCB0byBSZXF1ZXN0IFNNVSBMb2FkIHVDb2RlIik7CisKKwlyZXR1cm4g MDsKK30KKworCisvKiBDaGVjayBpZiB0aGUgRlcgaGFzIGJlZW4gbG9hZGVkLCBTTVUgd2lsbCBu b3QgcmV0dXJuCisgKiBpZiBsb2FkaW5nIGhhcyBub3QgZmluaXNoZWQuCisgKi8KK3N0YXRpYyBp bnQgZmlqaV9jaGVja19md19sb2FkX2ZpbmlzaChzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IsCisJ CXVpbnQzMl90IGZ3X3R5cGUpCit7CisJc3RydWN0IGZpamlfc211bWdyICpwcml2ID0gKHN0cnVj dCBmaWppX3NtdW1nciAqKShzbXVtZ3ItPmJhY2tlbmQpOworCXVpbnQzMl90IG1hc2sgPSBmaWpp X2dldF9tYXNrX2Zvcl9maXJtd2FyZV90eXBlKGZ3X3R5cGUpOworCisJLyogQ2hlY2sgU09GVF9S RUdJU1RFUlNfVEFCTEVfMjguVWNvZGVMb2FkU3RhdHVzICovCisJaWYgKHNtdW1fd2FpdF9vbl9p bmRpcmVjdF9yZWdpc3RlcihzbXVtZ3IsIG1tU01DX0lORF9JTkRFWCwKKwkJCXByaXYtPnNvZnRf cmVnc19zdGFydCArCisJCQlvZmZzZXRvZihTTVU3M19Tb2Z0UmVnaXN0ZXJzLCBVY29kZUxvYWRT dGF0dXMpLAorCQkJbWFzaywgbWFzaykpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICJjaGVjayBmaXJt d2FyZSBsb2FkaW5nIGZhaWxlZFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXR1cm4g MDsKK30KKworCitzdGF0aWMgaW50IGZpamlfcmVsb2FkX2Zpcm13YXJlKHN0cnVjdCBwcF9zbXVt Z3IgKnNtdW1ncikKK3sKKwlyZXR1cm4gc211bWdyLT5zbXVtZ3JfZnVuY3MtPnN0YXJ0X3NtdShz bXVtZ3IpOworfQorCitzdGF0aWMgYm9vbCBmaWppX2lzX2h3X3ZpcnR1YWxpemF0aW9uX2VuYWJs ZWQoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKQoreworCXVpbnQzMl90IHZhbHVlOworCisJdmFs dWUgPSBjZ3NfcmVhZF9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgbW1CSUZfSU9WX0ZVTkNfSURF TlRJRklFUik7CisJaWYgKHZhbHVlICYgQklGX0lPVl9GVU5DX0lERU5USUZJRVJfX0lPVl9FTkFC TEVfTUFTSykgeworCQkvKiBkcml2ZXIgcmVhZHMgb24gU1ItSU9WIGVuYWJsZWQgUEY6IDB4ODAw MDAwMDAKKwkJICogZHJpdmVyIHJlYWRzIG9uIFNSLUlPViBlbmFibGVkIFZGOiAweDgwMDAwMDAx CisJCSAqIGRyaXZlciByZWFkcyBvbiBTUi1JT1YgZGlzYWJsZWQ6ICAgMHgwMDAwMDAwMAorCQkg Ki8KKwkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBm aWppX3JlcXVlc3Rfc211X3NwZWNpZmljX2Z3X2xvYWQoc3RydWN0IHBwX3NtdW1nciAqc211bWdy LCB1aW50MzJfdCBmd190eXBlKQoreworCWlmIChmaWppX2lzX2h3X3ZpcnR1YWxpemF0aW9uX2Vu YWJsZWQoc211bWdyKSkgeworCQl1aW50MzJfdCBtYXNrcyA9IGZpamlfZ2V0X21hc2tfZm9yX2Zp cm13YXJlX3R5cGUoZndfdHlwZSk7CisJCWlmIChmaWppX3NlbmRfbXNnX3RvX3NtY193aXRoX3Bh cmFtZXRlcl93aXRob3V0X3dhaXRpbmcoc211bWdyLAorCQkJCVBQU01DX01TR19Mb2FkVWNvZGVz LCBtYXNrcykpCisJCQlwcmludGsoS0VSTl9FUlIgIkZhaWwgdG8gUmVxdWVzdCBTTVUgTG9hZCB1 Q29kZSIpOworCX0KKwkvKiBGb3Igbm9uLXZpcnR1YWxpemF0aW9uIGNhc2VzLAorCSAqIFNNVSBs b2FkcyBhbGwgRldzIGF0IG9uY2UgaW4gZmlqaV9yZXF1ZXN0X3NtdV9sb2FkX2Z3LgorCSAqLwor ICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpamlfc3RhcnRfc211X2luX3Byb3RlY3Rp b25fbW9kZShzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IpCit7CisJaW50IHJlc3VsdCA9IDA7CisK KwkvKiBXYWl0IGZvciBzbWMgYm9vdCB1cCAqLworCS8qIFNNVU1fV0FJVF9JTkRJUkVDVF9GSUVM RF9VTkVRVUFMKHNtdW1nciwgU01DX0lORCwKKwkJUkNVX1VDX0VWRU5UUywgYm9vdF9zZXFfZG9u ZSwgMCk7ICovCisKKwlTTVVNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoc211bWdyLT5kZXZp Y2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlTTUNfU1lTQ09OX1JFU0VUX0NOVEwsIHJzdF9yZWcs IDEpOworCisJcmVzdWx0ID0gZmlqaV91cGxvYWRfc211X2Zpcm13YXJlX2ltYWdlKHNtdW1ncik7 CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCS8qIENsZWFyIHN0YXR1cyAqLwor CWNnc193cml0ZV9pbmRfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMs CisJCQlpeFNNVV9TVEFUVVMsIDApOworCisJU01VTV9XUklURV9WRlBGX0lORElSRUNUX0ZJRUxE KHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJU01DX1NZU0NPTl9DTE9DS19D TlRMXzAsIGNrX2Rpc2FibGUsIDApOworCisJLyogRGUtYXNzZXJ0IHJlc2V0ICovCisJU01VTV9X UklURV9WRlBGX0lORElSRUNUX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01D LAorCQkJU01DX1NZU0NPTl9SRVNFVF9DTlRMLCByc3RfcmVnLCAwKTsKKworCS8qIFdhaXQgZm9y IFJPTSBmaXJtd2FyZSB0byBpbml0aWFsaXplIGludGVycnVwdCBoZW5kbGVyICovCisJLypTTVVN X1dBSVRfVkZQRl9JTkRJUkVDVF9SRUdJU1RFUihzbXVtZ3IsIFNNQ19JTkQsCisJCQlTTUNfSU5U Ul9DTlRMX01BU0tfMCwgMHgxMDA0MCwgMHhGRkZGRkZGRik7ICovCisKKwkvKiBTZXQgU01VIEF1 dG8gU3RhcnQgKi8KKwlTTVVNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoc211bWdyLT5kZXZp Y2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlTTVVfSU5QVVRfREFUQSwgQVVUT19TVEFSVCwgMSk7 CisKKwkvKiBDbGVhciBmaXJtd2FyZSBpbnRlcnJ1cHQgZW5hYmxlIGZsYWcgKi8KKwljZ3Nfd3Jp dGVfaW5kX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJaXhG SVJNV0FSRV9GTEFHUywgMCk7CisKKwlTTVVNX1dBSVRfVkZQRl9JTkRJUkVDVF9GSUVMRChzbXVt Z3IsIFNNQ19JTkQsIFJDVV9VQ19FVkVOVFMsCisJCQlJTlRFUlJVUFRTX0VOQUJMRUQsIDEpOwor CisJY2dzX3dyaXRlX3JlZ2lzdGVyKHNtdW1nci0+ZGV2aWNlLCBtbVNNQ19NU0dfQVJHXzAsIDB4 MjAwMDApOworCWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgbW1TTUNfTUVTU0FH RV8wLCBQUFNNQ19NU0dfVGVzdCk7CisJU01VTV9XQUlUX0ZJRUxEX1VORVFVQUwoc211bWdyLCBT TUNfUkVTUF8wLCBTTUNfUkVTUCwgMCk7CisKKwkvKiBXYWl0IGZvciBkb25lIGJpdCB0byBiZSBz ZXQgKi8KKwlTTVVNX1dBSVRfVkZQRl9JTkRJUkVDVF9GSUVMRF9VTkVRVUFMKHNtdW1nciwgU01D X0lORCwKKwkJCVNNVV9TVEFUVVMsIFNNVV9ET05FLCAwKTsKKworCS8qIENoZWNrIHBhc3MvZmFp bGVkIGluZGljYXRvciAqLworCWlmICgxICE9IFNNVU1fUkVBRF9WRlBGX0lORElSRUNUX0ZJRUxE KHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JFR19fU01DLAorCQkJU01VX1NUQVRVUywgU01VX1BB U1MpKSB7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoZmFsc2UsCisJCQkJIlNNVSBGaXJtd2FyZSBz dGFydCBmYWlsZWQhIiwgcmV0dXJuIC0xKTsKKwl9CisKKwkvKiBXYWl0IGZvciBmaXJtd2FyZSB0 byBpbml0aWFsaXplICovCisJU01VTV9XQUlUX1ZGUEZfSU5ESVJFQ1RfRklFTEQoc211bWdyLCBT TUNfSU5ELAorCQkJRklSTVdBUkVfRkxBR1MsIElOVEVSUlVQVFNfRU5BQkxFRCwgMSk7CisKKwly ZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZpamlfc3RhcnRfc211X2luX25vbl9wcm90 ZWN0aW9uX21vZGUoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKQoreworCWludCByZXN1bHQgPSAw OworCisJLyogd2FpdCBmb3Igc21jIGJvb3QgdXAgKi8KKwlTTVVNX1dBSVRfVkZQRl9JTkRJUkVD VF9GSUVMRF9VTkVRVUFMKHNtdW1nciwgU01DX0lORCwKKwkJCVJDVV9VQ19FVkVOVFMsIGJvb3Rf c2VxX2RvbmUsIDApOworCisJLyogQ2xlYXIgZmlybXdhcmUgaW50ZXJydXB0IGVuYWJsZSBmbGFn ICovCisJY2dzX3dyaXRlX2luZF9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgQ0dTX0lORF9SRUdf X1NNQywKKwkJCWl4RklSTVdBUkVfRkxBR1MsIDApOworCisJLyogQXNzZXJ0IHJlc2V0ICovCisJ U01VTV9XUklURV9WRlBGX0lORElSRUNUX0ZJRUxEKHNtdW1nci0+ZGV2aWNlLCBDR1NfSU5EX1JF R19fU01DLAorCQkJU01DX1NZU0NPTl9SRVNFVF9DTlRMLCByc3RfcmVnLCAxKTsKKworCXJlc3Vs dCA9IGZpamlfdXBsb2FkX3NtdV9maXJtd2FyZV9pbWFnZShzbXVtZ3IpOworCWlmIChyZXN1bHQp CisJCXJldHVybiByZXN1bHQ7CisKKwkvKiBTZXQgc21jIGluc3RydWN0IHN0YXJ0IHBvaW50IGF0 IDB4MCAqLworCWZpamlfcHJvZ3JhbV9qdW1wX29uX3N0YXJ0KHNtdW1ncik7CisKKwkvKiBFbmFi bGUgY2xvY2sgKi8KKwlTTVVNX1dSSVRFX1ZGUEZfSU5ESVJFQ1RfRklFTEQoc211bWdyLT5kZXZp Y2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlTTUNfU1lTQ09OX0NMT0NLX0NOVExfMCwgY2tfZGlz YWJsZSwgMCk7CisKKwkvKiBEZS1hc3NlcnQgcmVzZXQgKi8KKwlTTVVNX1dSSVRFX1ZGUEZfSU5E SVJFQ1RfRklFTEQoc211bWdyLT5kZXZpY2UsIENHU19JTkRfUkVHX19TTUMsCisJCQlTTUNfU1lT Q09OX1JFU0VUX0NOVEwsIHJzdF9yZWcsIDApOworCisJLyogV2FpdCBmb3IgZmlybXdhcmUgdG8g aW5pdGlhbGl6ZSAqLworCVNNVU1fV0FJVF9WRlBGX0lORElSRUNUX0ZJRUxEKHNtdW1nciwgU01D X0lORCwKKwkJCUZJUk1XQVJFX0ZMQUdTLCBJTlRFUlJVUFRTX0VOQUJMRUQsIDEpOworCisJcmV0 dXJuIHJlc3VsdDsKK30KKworaW50IGZpamlfc2V0dXBfcHdyX3ZpcnVzKHN0cnVjdCBwcF9zbXVt Z3IgKnNtdW1ncikKK3sKKwlpbnQgaSwgcmVzdWx0ID0gLTE7CisJdWludDMyX3QgcmVnLCBkYXRh OworCVBXUl9Db21tYW5kX1RhYmxlICp2aXJ1cyA9IFB3clZpcnVzVGFibGU7CisJc3RydWN0IGZp amlfc211bWdyICpwcml2ID0gKHN0cnVjdCBmaWppX3NtdW1nciAqKShzbXVtZ3ItPmJhY2tlbmQp OworCisJcHJpdi0+YXZmcy5BdmZzQnRjU3RhdHVzID0gQVZGU19MT0FEX1ZJUlVTOworCWZvciAo aSA9IDA7IChpIDwgUFdSX1ZJUlVTX1RBQkxFX1NJWkUpOyBpKyspIHsKKwkJc3dpdGNoICh2aXJ1 cy0+Y29tbWFuZCkgeworCQljYXNlIFB3ckNtZFdyaXRlOgorCQkJcmVnICA9IHZpcnVzLT5yZWc7 CisJCQlkYXRhID0gdmlydXMtPmRhdGE7CisJCQljZ3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5k ZXZpY2UsIHJlZywgZGF0YSk7CisJCQlicmVhazsKKwkJY2FzZSBQd3JDbWRFbmQ6CisJCQlwcml2 LT5hdmZzLkF2ZnNCdGNTdGF0dXMgPSBBVkZTX0JUQ19WSVJVU19MT0FERUQ7CisJCQlyZXN1bHQg PSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9FUlIgIlRhYmxlIEV4 aXQgd2l0aCBJbnZhbGlkIENvbW1hbmQhIik7CisJCQlwcml2LT5hdmZzLkF2ZnNCdGNTdGF0dXMg PSBBVkZTX0JUQ19WSVJVU19GQUlMOworCQkJcmVzdWx0ID0gLTE7CisJCQlicmVhazsKKwkJfQor CQl2aXJ1cysrOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IGZpamlfc3Rh cnRfYXZmc19idGMoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKQoreworCWludCByZXN1bHQgPSAw OworCXN0cnVjdCBmaWppX3NtdW1nciAqcHJpdiA9IChzdHJ1Y3QgZmlqaV9zbXVtZ3IgKikoc211 bWdyLT5iYWNrZW5kKTsKKworCXByaXYtPmF2ZnMuQXZmc0J0Y1N0YXR1cyA9IEFWRlNfQlRDX1NU QVJURUQ7CisJaWYgKHByaXYtPmF2ZnMuQXZmc0J0Y1BhcmFtKSB7CisJCWlmICghZmlqaV9zZW5k X21zZ190b19zbWNfd2l0aF9wYXJhbWV0ZXIoc211bWdyLAorCQkJCVBQU01DX01TR19QZXJmb3Jt QnRjLCBwcml2LT5hdmZzLkF2ZnNCdGNQYXJhbSkpIHsKKwkJCWlmICghZmlqaV9zZW5kX21zZ190 b19zbWMoc211bWdyLCBQUFNNQ19NU0dfRW5hYmxlQXZmcykpIHsKKwkJCQlwcml2LT5hdmZzLkF2 ZnNCdGNTdGF0dXMgPSBBVkZTX0JUQ19DT01QTEVURURfVU5TQVZFRDsKKwkJCQlyZXN1bHQgPSAw OworCQkJfSBlbHNlIHsKKwkJCQlwcmludGsoS0VSTl9FUlIgIltBVkZTXVtmaWppX3N0YXJ0X2F2 ZnNfYnRjXSBBdHRlbXB0IgorCQkJCQkJIiB0byBFbmFibGUgQVZGUyBGYWlsZWQhIik7CisJCQkJ ZmlqaV9zZW5kX21zZ190b19zbWMoc211bWdyLCBQUFNNQ19NU0dfRGlzYWJsZUF2ZnMpOworCQkJ CXJlc3VsdCA9IC0xOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRrKEtFUk5fRVJSICJbQVZG U11bZmlqaV9zdGFydF9hdmZzX2J0Y10gIgorCQkJCQkiUGVyZm9ybUJUQyBTTVUgbXNnIGZhaWxl ZCIpOworCQkJcmVzdWx0ID0gLTE7CisJCX0KKwl9CisJLyogU29mdC1SZXNldCB0byByZXNldCB0 aGUgZW5naW5lIGJlZm9yZSBsb2FkaW5nIHVDb2RlICovCisJIC8qIGhhbHQgKi8KKwljZ3Nfd3Jp dGVfcmVnaXN0ZXIoc211bWdyLT5kZXZpY2UsIG1tQ1BfTUVDX0NOVEwsIDB4NTAwMDAwMDApOwor CS8qIHJlc2V0IGV2ZXJ5dGhpbmcgKi8KKwljZ3Nfd3JpdGVfcmVnaXN0ZXIoc211bWdyLT5kZXZp Y2UsIG1tR1JCTV9TT0ZUX1JFU0VULCAweGZmZmZmZmZmKTsKKwkvKiBjbGVhciByZXNldCAqLwor CWNnc193cml0ZV9yZWdpc3RlcihzbXVtZ3ItPmRldmljZSwgbW1HUkJNX1NPRlRfUkVTRVQsIDAp OworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGZpamlfc2V0dXBfcG1fZnVzZV9mb3Jf YXZmcyhzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IpCit7CisJaW50IHJlc3VsdCA9IDA7CisJdWlu dDMyX3QgdGFibGVfc3RhcnQ7CisJdWludDMyX3QgY2hhcnpfZnJlcV9hZGRyLCBpbnZlcnNpb25f dm9sdGFnZV9hZGRyLCBjaGFyel9mcmVxOworCXVpbnQxNl90IGludmVyc2lvbl92b2x0YWdlOwor CisJY2hhcnpfZnJlcSA9IDB4MzA3NTAwMDA7IC8qIEluIDEwS0h6IHVuaXRzIDB4MDAwMDc1MzAg QWN0dWFsIHZhbHVlICovCisJaW52ZXJzaW9uX3ZvbHRhZ2UgPSAweDFBMDQ7IC8qIG1WIFExNC4y IDB4NDFBIEFjdHVhbCB2YWx1ZSAqLworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IGZpamlf cmVhZF9zbWNfc3JhbV9kd29yZChzbXVtZ3IsCisJCQlTTVU3X0ZJUk1XQVJFX0hFQURFUl9MT0NB VElPTiArIG9mZnNldG9mKFNNVTczX0Zpcm13YXJlX0hlYWRlciwKKwkJCQkJUG1GdXNlVGFibGUp LCAmdGFibGVfc3RhcnQsIDB4NDAwMDApLAorCQkJIltBVkZTXVtGaWppX1NldHVwR2Z4THZsU3Ry dWN0XSBTTVUgY291bGQgbm90IGNvbW11bmljYXRlICIKKwkJCSJzdGFydGluZyBhZGRyZXNzIG9m IFBtRnVzZSBzdHJ1Y3R1cmUiLAorCQkJcmV0dXJuIC0xOyk7CisKKwljaGFyel9mcmVxX2FkZHIg PSB0YWJsZV9zdGFydCArCisJCQlvZmZzZXRvZihzdHJ1Y3QgU01VNzNfRGlzY3JldGVfUG1GdXNl cywgUHNtQ2hhcnpGcmVxKTsKKwlpbnZlcnNpb25fdm9sdGFnZV9hZGRyID0gdGFibGVfc3RhcnQg KworCQkJb2Zmc2V0b2Yoc3RydWN0IFNNVTczX0Rpc2NyZXRlX1BtRnVzZXMsIEludmVyc2lvblZv bHRhZ2UpOworCisJcmVzdWx0ID0gZmlqaV9jb3B5X2J5dGVzX3RvX3NtYyhzbXVtZ3IsIGNoYXJ6 X2ZyZXFfYWRkciwKKwkJCSh1aW50OF90ICopKCZjaGFyel9mcmVxKSwgc2l6ZW9mKGNoYXJ6X2Zy ZXEpLCAweDQwMDAwKTsKKwlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gcmVzdWx0LAorCQkJIltB VkZTXVtmaWppX3NldHVwX3BtX2Z1c2VfZm9yX2F2ZnNdIGNoYXJ6X2ZyZXEgY291bGQgbm90ICIK KwkJCSJiZSBwb3B1bGF0ZWQuIiwgcmV0dXJuIC0xOyk7CisKKwlyZXN1bHQgPSBmaWppX2NvcHlf Ynl0ZXNfdG9fc21jKHNtdW1nciwgaW52ZXJzaW9uX3ZvbHRhZ2VfYWRkciwKKwkJCSh1aW50OF90 ICopKCZpbnZlcnNpb25fdm9sdGFnZSksIHNpemVvZihpbnZlcnNpb25fdm9sdGFnZSksIDB4NDAw MDApOworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSByZXN1bHQsICJbQVZGU11bZmlqaV9zZXR1 cF9wbV9mdXNlX2Zvcl9hdmZzXSAiCisJCQkiY2hhcnpfZnJlcSBjb3VsZCBub3QgYmUgcG9wdWxh dGVkLiIsIHJldHVybiAtMTspOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGZpamlfc2V0 dXBfZ3JhcGhpY3NfbGV2ZWxfc3RydWN0dXJlKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sK KwlpbnQzMl90IHZyX2NvbmZpZzsKKwl1aW50MzJfdCB0YWJsZV9zdGFydDsKKwl1aW50MzJfdCBs ZXZlbF9hZGRyLCB2cl9jb25maWdfYWRkcjsKKwl1aW50MzJfdCBsZXZlbF9zaXplID0gc2l6ZW9m KGF2ZnNfZ3JhcGhpY3NfbGV2ZWwpOworCisJUFBfQVNTRVJUX1dJVEhfQ09ERSgwID09IGZpamlf cmVhZF9zbWNfc3JhbV9kd29yZChzbXVtZ3IsCisJCQlTTVU3X0ZJUk1XQVJFX0hFQURFUl9MT0NB VElPTiArCisJCQlvZmZzZXRvZihTTVU3M19GaXJtd2FyZV9IZWFkZXIsIERwbVRhYmxlKSwKKwkJ CSZ0YWJsZV9zdGFydCwgMHg0MDAwMCksCisJCQkiW0FWRlNdW0ZpamlfU2V0dXBHZnhMdmxTdHJ1 Y3RdIFNNVSBjb3VsZCBub3QgIgorCQkJImNvbW11bmljYXRlIHN0YXJ0aW5nIGFkZHJlc3Mgb2Yg RFBNIHRhYmxlIiwKKwkJCXJldHVybiAtMTspOworCisJLyogRGVmYXVsdCB2YWx1ZSBmb3IgdnJf Y29uZmlnID0KKwkgKiBWUl9NRVJHRURfV0lUSF9WRERDICsgVlJfU1RBVElDX1ZPTFRBR0UoVkRE Q0kpICovCisJdnJfY29uZmlnID0gMHgwMTAwMDUwMDsgICAvKiBSZWFsIHZhbHVlOjB4NTAwMDEg Ki8KKworCXZyX2NvbmZpZ19hZGRyID0gdGFibGVfc3RhcnQgKworCQkJb2Zmc2V0b2YoU01VNzNf RGlzY3JldGVfRHBtVGFibGUsIFZSQ29uZmlnKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9 PSBmaWppX2NvcHlfYnl0ZXNfdG9fc21jKHNtdW1nciwgdnJfY29uZmlnX2FkZHIsCisJCQkodWlu dDhfdCAqKSZ2cl9jb25maWcsIHNpemVvZihpbnQzMl90KSwgMHg0MDAwMCksCisJCQkiW0FWRlNd W0ZpamlfU2V0dXBHZnhMdmxTdHJ1Y3RdIFByb2JsZW1zIGNvcHlpbmcgIgorCQkJInZyX2NvbmZp ZyB2YWx1ZSBvdmVyIHRvIFNNQyIsCisJCQlyZXR1cm4gLTE7KTsKKworCWxldmVsX2FkZHIgPSB0 YWJsZV9zdGFydCArIG9mZnNldG9mKFNNVTczX0Rpc2NyZXRlX0RwbVRhYmxlLCBHcmFwaGljc0xl dmVsKTsKKworCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSBmaWppX2NvcHlfYnl0ZXNfdG9fc21j KHNtdW1nciwgbGV2ZWxfYWRkciwKKwkJCSh1aW50OF90ICopKCZhdmZzX2dyYXBoaWNzX2xldmVs KSwgbGV2ZWxfc2l6ZSwgMHg0MDAwMCksCisJCQkiW0FWRlNdW0ZpamlfU2V0dXBHZnhMdmxTdHJ1 Y3RdIENvcHlpbmcgb2YgRFBNIHRhYmxlIGZhaWxlZCEiLAorCQkJcmV0dXJuIC0xOyk7CisKKwly ZXR1cm4gMDsKK30KKworLyogV29yayBpbiBQcm9ncmVzcyAqLworaW50IGZpamlfcmVzdG9yZV92 ZnRfdGFibGUoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKQoreworCXN0cnVjdCBmaWppX3NtdW1n ciAqcHJpdiA9IChzdHJ1Y3QgZmlqaV9zbXVtZ3IgKikoc211bWdyLT5iYWNrZW5kKTsKKworCWlm IChBVkZTX0JUQ19DT01QTEVURURfU0FWRUQgPT0gcHJpdi0+YXZmcy5BdmZzQnRjU3RhdHVzKSB7 CisJCXByaXYtPmF2ZnMuQXZmc0J0Y1N0YXR1cyA9IEFWRlNfQlRDX0NPTVBMRVRFRF9SRVNUT1JF RDsKKwkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAtRUlOVkFMOworfQorCisvKiBXb3Jr IGluIFByb2dyZXNzICovCitpbnQgZmlqaV9zYXZlX3ZmdF90YWJsZShzdHJ1Y3QgcHBfc211bWdy ICpzbXVtZ3IpCit7CisJc3RydWN0IGZpamlfc211bWdyICpwcml2ID0gKHN0cnVjdCBmaWppX3Nt dW1nciAqKShzbXVtZ3ItPmJhY2tlbmQpOworCisJaWYgKEFWRlNfQlRDX0NPTVBMRVRFRF9TQVZF RCA9PSBwcml2LT5hdmZzLkF2ZnNCdGNTdGF0dXMpIHsKKwkJcHJpdi0+YXZmcy5BdmZzQnRjU3Rh dHVzID0gQVZGU19CVENfQ09NUExFVEVEX1JFU1RPUkVEOworCQlyZXR1cm4gMDsKKwl9IGVsc2UK KwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBmaWppX2F2ZnNfZXZlbnRfbWdyKHN0cnVjdCBw cF9zbXVtZ3IgKnNtdW1nciwgYm9vbCBzbXVfc3RhcnRlZCkKK3sKKwlzdHJ1Y3QgZmlqaV9zbXVt Z3IgKnByaXYgPSAoc3RydWN0IGZpamlfc211bWdyICopKHNtdW1nci0+YmFja2VuZCk7CisKKwlz d2l0Y2ggKHByaXYtPmF2ZnMuQXZmc0J0Y1N0YXR1cykgeworCWNhc2UgQVZGU19CVENfQ09NUExF VEVEX1NBVkVEOiAvKlMzIFN0YXRlIC0gUHJlIFNNVSBTdGFydCAqLworCQlwcml2LT5hdmZzLkF2 ZnNCdGNTdGF0dXMgPSBBVkZTX0JUQ19SRVNUT1JFVkZUX0ZBSUxFRDsKKwkJUFBfQVNTRVJUX1dJ VEhfQ09ERSgwID09IGZpamlfcmVzdG9yZV92ZnRfdGFibGUoc211bWdyKSwKKwkJCQkiW0FWRlNd W2ZpamlfYXZmc19ldmVudF9tZ3JdIENvdWxkIG5vdCBDb3B5IEdyYXBoaWNzICIKKwkJCQkiTGV2 ZWwgdGFibGUgb3ZlciB0byBTTVUiLAorCQkJCXJldHVybiAtMTspOworCQlwcml2LT5hdmZzLkF2 ZnNCdGNTdGF0dXMgPSBBVkZTX0JUQ19DT01QTEVURURfUkVTVE9SRUQ7CisJCWJyZWFrOworCWNh c2UgQVZGU19CVENfQ09NUExFVEVEX1JFU1RPUkVEOiAvKlMzIFN0YXRlIC0gUG9zdCBTTVUgU3Rh cnQqLworCQlwcml2LT5hdmZzLkF2ZnNCdGNTdGF0dXMgPSBBVkZTX0JUQ19TTVVNU0dfRVJST1I7 CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSBmaWppX3NlbmRfbXNnX3RvX3NtYyhzbXVtZ3Is CisJCQkJUFBTTUNfTVNHX1ZmdFRhYmxlSXNWYWxpZCksCisJCQkJIltBVkZTXVtmaWppX2F2ZnNf ZXZlbnRfbWdyXSBTTVUgZGlkIG5vdCByZXNwb25kICIKKwkJCQkiY29ycmVjdGx5IHRvIFZmdFRh YmxlSXNWYWxpZCBNc2ciLAorCQkJCXJldHVybiAtMTspOworCQlwcml2LT5hdmZzLkF2ZnNCdGNT dGF0dXMgPSBBVkZTX0JUQ19TTVVNU0dfRVJST1I7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9 PSBmaWppX3NlbmRfbXNnX3RvX3NtYyhzbXVtZ3IsCisJCQkJUFBTTUNfTVNHX0VuYWJsZUF2ZnMp LAorCQkJCSJbQVZGU11bZmlqaV9hdmZzX2V2ZW50X21ncl0gU01VIGRpZCBub3QgcmVzcG9uZCAi CisJCQkJImNvcnJlY3RseSB0byBFbmFibGVBdmZzIE1lc3NhZ2UgTXNnIiwKKwkJCQlyZXR1cm4g LTE7KTsKKwkJcHJpdi0+YXZmcy5BdmZzQnRjU3RhdHVzID0gQVZGU19CVENfQ09NUExFVEVEX1NB VkVEOworCQlicmVhazsKKwljYXNlIEFWRlNfQlRDX0JPT1Q6IC8qQ29sZCBCb290IFN0YXRlIC0g UG9zdCBTTVUgU3RhcnQqLworCQlpZiAoIXNtdV9zdGFydGVkKQorCQkJYnJlYWs7CisJCXByaXYt PmF2ZnMuQXZmc0J0Y1N0YXR1cyA9IEFWRlNfQlRDX0ZBSUxFRDsKKwkJUFBfQVNTRVJUX1dJVEhf Q09ERSgwID09IGZpamlfc2V0dXBfcG1fZnVzZV9mb3JfYXZmcyhzbXVtZ3IpLAorCQkJCSJbQVZG U11bZmlqaV9hdmZzX2V2ZW50X21ncl0gRmFpbHVyZSBhdCAiCisJCQkJImZpamlfc2V0dXBfcG1f ZnVzZV9mb3JfYXZmcyIsCisJCQkJcmV0dXJuIC0xOyk7CisJCXByaXYtPmF2ZnMuQXZmc0J0Y1N0 YXR1cyA9IEFWRlNfQlRDX0RQTVRBQkxFU0VUVVBfRkFJTEVEOworCQlQUF9BU1NFUlRfV0lUSF9D T0RFKDAgPT0gZmlqaV9zZXR1cF9ncmFwaGljc19sZXZlbF9zdHJ1Y3R1cmUoc211bWdyKSwKKwkJ CQkiW0FWRlNdW2ZpamlfYXZmc19ldmVudF9tZ3JdIENvdWxkIG5vdCBDb3B5IEdyYXBoaWNzIExl dmVsIgorCQkJCSIgdGFibGUgb3ZlciB0byBTTVUiLAorCQkJCXJldHVybiAtMTspOworCQlwcml2 LT5hdmZzLkF2ZnNCdGNTdGF0dXMgPSBBVkZTX0JUQ19WSVJVU19GQUlMOworCQlQUF9BU1NFUlRf V0lUSF9DT0RFKDAgPT0gZmlqaV9zZXR1cF9wd3JfdmlydXMoc211bWdyKSwKKwkJCQkiW0FWRlNd W2ZpamlfYXZmc19ldmVudF9tZ3JdIENvdWxkIG5vdCBzZXR1cCAiCisJCQkJIlB3ciBWaXJ1cyBm b3IgQVZGUyAiLAorCQkJCXJldHVybiAtMTspOworCQlwcml2LT5hdmZzLkF2ZnNCdGNTdGF0dXMg PSBBVkZTX0JUQ19GQUlMRUQ7CisJCVBQX0FTU0VSVF9XSVRIX0NPREUoMCA9PSBmaWppX3N0YXJ0 X2F2ZnNfYnRjKHNtdW1nciksCisJCQkJIltBVkZTXVtmaWppX2F2ZnNfZXZlbnRfbWdyXSBGYWls dXJlIGF0ICIKKwkJCQkiZmlqaV9zdGFydF9hdmZzX2J0Yy4gQVZGUyBEaXNhYmxlZCIsCisJCQkJ cmV0dXJuIC0xOyk7CisJCXByaXYtPmF2ZnMuQXZmc0J0Y1N0YXR1cyA9IEFWRlNfQlRDX1NBVkVW RlRfRkFJTEVEOworCQlQUF9BU1NFUlRfV0lUSF9DT0RFKDAgPT0gZmlqaV9zYXZlX3ZmdF90YWJs ZShzbXVtZ3IpLAorCQkJCSJbQVZGU11bZmlqaV9hdmZzX2V2ZW50X21ncl0gQ291bGQgbm90IHNh dmUgVkZUIFRhYmxlIiwKKwkJCQlyZXR1cm4gLTE7KTsKKwkJcHJpdi0+YXZmcy5BdmZzQnRjU3Rh dHVzID0gQVZGU19CVENfQ09NUExFVEVEX1NBVkVEOworCQlicmVhazsKKwljYXNlIEFWRlNfQlRD X0RJU0FCTEVEOiAvKiBEbyBub3RoaW5nICovCisJCWJyZWFrOworCWNhc2UgQVZGU19CVENfTk9U U1VQUE9SVEVEOiAvKiBEbyBub3RoaW5nICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50 ayhLRVJOX0VSUiAiW0FWRlNdIFNvbWV0aGluZyBpcyBicm9rZW4uIFNlZSBsb2chIik7CisJCWJy ZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWppX3N0YXJ0X3NtdShzdHJ1 Y3QgcHBfc211bWdyICpzbXVtZ3IpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGZpamlf c211bWdyICpwcml2ID0gKHN0cnVjdCBmaWppX3NtdW1nciAqKShzbXVtZ3ItPmJhY2tlbmQpOwor CisJLyogT25seSBzdGFydCBTTUMgaWYgU01DIFJBTSBpcyBub3QgcnVubmluZyAqLworCWlmICgh ZmlqaV9pc19zbWNfcmFtX3J1bm5pbmcoc211bWdyKSkgeworCQlmaWppX2F2ZnNfZXZlbnRfbWdy KHNtdW1nciwgZmFsc2UpOworCisJCS8qIENoZWNrIGlmIFNNVSBpcyBydW5uaW5nIGluIHByb3Rl Y3RlZCBtb2RlICovCisJCWlmICgwID09IFNNVU1fUkVBRF9WRlBGX0lORElSRUNUX0ZJRUxEKHNt dW1nci0+ZGV2aWNlLAorCQkJCUNHU19JTkRfUkVHX19TTUMsCisJCQkJU01VX0ZJUk1XQVJFLCBT TVVfTU9ERSkpIHsKKwkJCXJlc3VsdCA9IGZpamlfc3RhcnRfc211X2luX25vbl9wcm90ZWN0aW9u X21vZGUoc211bWdyKTsKKwkJCWlmIChyZXN1bHQpCisJCQkJcmV0dXJuIHJlc3VsdDsKKwkJfSBl bHNlIHsKKwkJCXJlc3VsdCA9IGZpamlfc3RhcnRfc211X2luX3Byb3RlY3Rpb25fbW9kZShzbXVt Z3IpOworCQkJaWYgKHJlc3VsdCkKKwkJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWZpamlfYXZm c19ldmVudF9tZ3Ioc211bWdyLCB0cnVlKTsKKwl9CisKKwkvKiBUbyBpbml0aWFsaXplIGFsbCBj bG9jayBnYXRpbmcgYmVmb3JlIFJMQyBsb2FkZWQgYW5kIHJ1bm5pbmcuKi8KKwkvKlBFQ0lfSW5p dENsb2NrR2F0aW5nKHBlY2kpOyovCisKKwkvKiBTZXR1cCBTb2Z0UmVnc1N0YXJ0IGhlcmUgZm9y IHJlZ2lzdGVyIGxvb2t1cCBpbiBjYXNlCisJICogRHVtbXlCYWNrRW5kIGlzIHVzZWQgYW5kIFBy b2Nlc3NGaXJtd2FyZUhlYWRlciBpcyBub3QgZXhlY3V0ZWQKKwkgKi8KKwlmaWppX3JlYWRfc21j X3NyYW1fZHdvcmQoc211bWdyLAorCQkJU01VN19GSVJNV0FSRV9IRUFERVJfTE9DQVRJT04gKwor CQkJb2Zmc2V0b2YoU01VNzNfRmlybXdhcmVfSGVhZGVyLCBTb2Z0UmVnaXN0ZXJzKSwKKwkJCSYo cHJpdi0+c29mdF9yZWdzX3N0YXJ0KSwgMHg0MDAwMCk7CisKKwlyZXN1bHQgPSBmaWppX3JlcXVl c3Rfc211X2xvYWRfZncoc211bWdyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBi b29sIGZpamlfaXNfaHdfYXZmc19wcmVzZW50KHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sK KworCXVpbnQzMl90IGVmdXNlID0gMDsKKwl1aW50MzJfdCBtYXNrID0gKDEgPDwgKChBVkZTX0VO X01TQiAtIEFWRlNfRU5fTFNCKSArIDEpKSAtIDE7CisKKwlpZiAoIWF0b21jdHJsX3JlYWRfZWZ1 c2Uoc211bWdyLT5kZXZpY2UsIEFWRlNfRU5fTFNCLCBBVkZTX0VOX01TQiwKKwkJCW1hc2ssICZl ZnVzZSkpIHsKKwkJaWYgKGVmdXNlKQorCQkJcmV0dXJuIHRydWU7CisJfQorCXJldHVybiBmYWxz ZTsKK30KKworLyoqCisqIFdyaXRlIGEgMzJiaXQgdmFsdWUgdG8gdGhlIFNNQyBTUkFNIHNwYWNl LgorKiBBTEwgUEFSQU1FVEVSUyBBUkUgSU4gSE9TVCBCWVRFIE9SREVSLgorKiBAcGFyYW0gICAg c211bWdyICB0aGUgYWRkcmVzcyBvZiB0aGUgcG93ZXJwbGF5IGhhcmR3YXJlIG1hbmFnZXIuCisq IEBwYXJhbSAgICBzbWNfYWRkciB0aGUgYWRkcmVzcyBpbiB0aGUgU01DIFJBTSB0byBhY2Nlc3Mu CisqIEBwYXJhbSAgICB2YWx1ZSB0byB3cml0ZSB0byB0aGUgU01DIFNSQU0uCisqLworc3RhdGlj IGludCBmaWppX3NtdV9pbml0KHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1ncikKK3sKKwlzdHJ1Y3Qg ZmlqaV9zbXVtZ3IgKnByaXYgPSAoc3RydWN0IGZpamlfc211bWdyICopKHNtdW1nci0+YmFja2Vu ZCk7CisJdWludDY0X3QgbWNfYWRkcjsKKworCXByaXYtPmhlYWRlcl9idWZmZXIuZGF0YV9zaXpl ID0KKwkJCSgoc2l6ZW9mKHN0cnVjdCBTTVVfRFJBTURhdGFfVE9DKSAvIDQwOTYpICsgMSkgKiA0 MDk2OworCXNtdV9hbGxvY2F0ZV9tZW1vcnkoc211bWdyLT5kZXZpY2UsCisJCQlwcml2LT5oZWFk ZXJfYnVmZmVyLmRhdGFfc2l6ZSwKKwkJCUNHU19HUFVfTUVNX1RZUEVfX1ZJU0lCTEVfQ09OVElH X0ZCLAorCQkJUEFHRV9TSVpFLAorCQkJJm1jX2FkZHIsCisJCQkmcHJpdi0+aGVhZGVyX2J1ZmZl ci5rYWRkciwKKwkJCSZwcml2LT5oZWFkZXJfYnVmZmVyLmhhbmRsZSk7CisKKwlwcml2LT5oZWFk ZXIgPSBwcml2LT5oZWFkZXJfYnVmZmVyLmthZGRyOworCXByaXYtPmhlYWRlcl9idWZmZXIubWNf YWRkcl9oaWdoID0gc211X3VwcGVyXzMyX2JpdHMobWNfYWRkcik7CisJcHJpdi0+aGVhZGVyX2J1 ZmZlci5tY19hZGRyX2xvdyA9IHNtdV9sb3dlcl8zMl9iaXRzKG1jX2FkZHIpOworCisJUFBfQVNT RVJUX1dJVEhfQ09ERSgoTlVMTCAhPSBwcml2LT5oZWFkZXIpLAorCQkJIk91dCBvZiBtZW1vcnku IiwKKwkJCWtmcmVlKHNtdW1nci0+YmFja2VuZCk7CisJCQljZ3NfZnJlZV9ncHVfbWVtKHNtdW1n ci0+ZGV2aWNlLAorCQkJKGNnc19oYW5kbGVfdClwcml2LT5oZWFkZXJfYnVmZmVyLmhhbmRsZSk7 CisJCQlyZXR1cm4gLTEpOworCisJcHJpdi0+YXZmcy5BdmZzQnRjU3RhdHVzID0gQVZGU19CVENf Qk9PVDsKKwlpZiAoZmlqaV9pc19od19hdmZzX3ByZXNlbnQoc211bWdyKSkKKwkJLyogQVZGUyBQ YXJhbWV0ZXIKKwkJICogMCAtIEJUQyBEQyBkaXNhYmxlZCwgQlRDIEFDIGRpc2FibGVkCisJCSAq IDEgLSBCVEMgREMgZW5hYmxlZCwgIEJUQyBBQyBkaXNhYmxlZAorCQkgKiAyIC0gQlRDIERDIGRp c2FibGVkLCBCVEMgQUMgZW5hYmxlZAorCQkgKiAzIC0gQlRDIERDIGVuYWJsZWQsICBCVEMgQUMg ZW5hYmxlZAorCQkgKiBEZWZhdWx0IGlzIDAgLSBCVEMgREMgZGlzYWJsZWQsIEJUQyBBQyBkaXNh YmxlZAorCQkgKi8KKwkJcHJpdi0+YXZmcy5BdmZzQnRjUGFyYW0gPSAwOworCWVsc2UKKwkJcHJp di0+YXZmcy5BdmZzQnRjU3RhdHVzID0gQVZGU19CVENfTk9UU1VQUE9SVEVEOworCisJcHJpdi0+ YWNwaV9vcHRpbWl6YXRpb24gPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmlq aV9zbXVfZmluaShzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IpCit7CisJaWYgKHNtdW1nci0+YmFj a2VuZCkgeworCQlrZnJlZShzbXVtZ3ItPmJhY2tlbmQpOworCQlzbXVtZ3ItPmJhY2tlbmQgPSBO VUxMOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwcF9zbXVtZ3Jf ZnVuYyBmaWppX3NtdV9mdW5jcyA9IHsKKwkuc211X2luaXQgPSAmZmlqaV9zbXVfaW5pdCwKKwku c211X2ZpbmkgPSAmZmlqaV9zbXVfZmluaSwKKwkuc3RhcnRfc211ID0gJmZpamlfc3RhcnRfc211 LAorCS5jaGVja19md19sb2FkX2ZpbmlzaCA9ICZmaWppX2NoZWNrX2Z3X2xvYWRfZmluaXNoLAor CS5yZXF1ZXN0X3NtdV9sb2FkX2Z3ID0gJmZpamlfcmVsb2FkX2Zpcm13YXJlLAorCS5yZXF1ZXN0 X3NtdV9sb2FkX3NwZWNpZmljX2Z3ID0gJmZpamlfcmVxdWVzdF9zbXVfc3BlY2lmaWNfZndfbG9h ZCwKKwkuc2VuZF9tc2dfdG9fc21jID0gJmZpamlfc2VuZF9tc2dfdG9fc21jLAorCS5zZW5kX21z Z190b19zbWNfd2l0aF9wYXJhbWV0ZXIgPSAmZmlqaV9zZW5kX21zZ190b19zbWNfd2l0aF9wYXJh bWV0ZXIsCisJLmRvd25sb2FkX3BwdGFibGVfc2V0dGluZ3MgPSBOVUxMLAorCS51cGxvYWRfcHB0 YWJsZV9zZXR0aW5ncyA9IE5VTEwsCit9OworCitpbnQgZmlqaV9zbXVtX2luaXQoc3RydWN0IHBw X3NtdW1nciAqc211bWdyKQoreworCXN0cnVjdCBmaWppX3NtdW1nciAqZmlqaV9zbXUgPSBOVUxM OworCisJZmlqaV9zbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZmlqaV9zbXVtZ3IpLCBHRlBf S0VSTkVMKTsKKworCWlmIChmaWppX3NtdSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlzbXVt Z3ItPmJhY2tlbmQgPSBmaWppX3NtdTsKKwlzbXVtZ3ItPnNtdW1ncl9mdW5jcyA9ICZmaWppX3Nt dV9mdW5jczsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2Ft ZC9wb3dlcnBsYXkvc211bWdyL2Zpamlfc211bWdyLmggYi9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bv d2VycGxheS9zbXVtZ3IvZmlqaV9zbXVtZ3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi44Y2QyMmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2FtZC9w b3dlcnBsYXkvc211bWdyL2Zpamlfc211bWdyLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENv cHlyaWdodCAyMDE1IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4KKyAqCisgKiBQZXJtaXNz aW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRh aW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50 YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJl IHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRo ZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRl LCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5k IHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQg dG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRo ZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxs IGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9m IHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwg V0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5D TFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ VFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VN RU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIE9SIEFV VEhPUihTKSBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUgorICogT1RIRVIgTElB QklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJ U0UsCisgKiBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNP RlRXQVJFIE9SIFRIRSBVU0UgT1IKKyAqIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K KyAqCisgKi8KKyNpZm5kZWYgX0ZJSklfU01VTUFOQUdFUl9IXworI2RlZmluZSBfRklKSV9TTVVN QU5BR0VSX0hfCisKK2VudW0gQVZGU19CVENfU1RBVFVTIHsKKwlBVkZTX0JUQ19CT09UID0gMCwK KwlBVkZTX0JUQ19CT09UX1NUQVJURURTTVUsCisJQVZGU19MT0FEX1ZJUlVTLAorCUFWRlNfQlRD X1ZJUlVTX0xPQURFRCwKKwlBVkZTX0JUQ19WSVJVU19GQUlMLAorCUFWRlNfQlRDX1NUQVJURUQs CisJQVZGU19CVENfRkFJTEVELAorCUFWRlNfQlRDX1JFU1RPUkVWRlRfRkFJTEVELAorCUFWRlNf QlRDX1NBVkVWRlRfRkFJTEVELAorCUFWRlNfQlRDX0RQTVRBQkxFU0VUVVBfRkFJTEVELAorCUFW RlNfQlRDX0NPTVBMRVRFRF9VTlNBVkVELAorCUFWRlNfQlRDX0NPTVBMRVRFRF9TQVZFRCwKKwlB VkZTX0JUQ19DT01QTEVURURfUkVTVE9SRUQsCisJQVZGU19CVENfRElTQUJMRUQsCisJQVZGU19C VENfTk9UU1VQUE9SVEVELAorCUFWRlNfQlRDX1NNVU1TR19FUlJPUgorfTsKKworc3RydWN0IGZp amlfc211X2F2ZnMgeworCWVudW0gQVZGU19CVENfU1RBVFVTIEF2ZnNCdGNTdGF0dXM7CisJdWlu dDMyX3QgICAgICAgICAgIEF2ZnNCdGNQYXJhbTsKK307CisKK3N0cnVjdCBmaWppX2J1ZmZlcl9l bnRyeSB7CisJdWludDMyX3QgZGF0YV9zaXplOworCXVpbnQzMl90IG1jX2FkZHJfbG93OworCXVp bnQzMl90IG1jX2FkZHJfaGlnaDsKKwl2b2lkICprYWRkcjsKKwl1bnNpZ25lZCBsb25nICBoYW5k bGU7Cit9OworCitzdHJ1Y3QgZmlqaV9zbXVtZ3IgeworCXVpbnQ4X3QgICAgICAgICpoZWFkZXI7 CisJdWludDhfdCAgICAgICAgKm1lY19pbWFnZTsKKwl1aW50MzJfdCAgICAgICAgc29mdF9yZWdz X3N0YXJ0OworCXN0cnVjdCBmaWppX3NtdV9hdmZzIGF2ZnM7CisJdWludDMyX3QgICAgICAgIGFj cGlfb3B0aW1pemF0aW9uOworCisJc3RydWN0IGZpamlfYnVmZmVyX2VudHJ5IGhlYWRlcl9idWZm ZXI7Cit9OworCitpbnQgZmlqaV9zbXVtX2luaXQoc3RydWN0IHBwX3NtdW1nciAqc211bWdyKTsK K2ludCBmaWppX3JlYWRfc21jX3NyYW1fZHdvcmQoc3RydWN0IHBwX3NtdW1nciAqc211bWdyLCB1 aW50MzJfdCBzbWNBZGRyZXNzLAorCQl1aW50MzJfdCAqdmFsdWUsIHVpbnQzMl90IGxpbWl0KTsK K2ludCBmaWppX3dyaXRlX3NtY19zcmFtX2R3b3JkKHN0cnVjdCBwcF9zbXVtZ3IgKnNtdW1nciwg dWludDMyX3Qgc21jX2FkZHIsCisJCXVpbnQzMl90IHZhbHVlLCB1aW50MzJfdCBsaW1pdCk7Citp bnQgZmlqaV9jb3B5X2J5dGVzX3RvX3NtYyhzdHJ1Y3QgcHBfc211bWdyICpzbXVtZ3IsIHVpbnQz Ml90IHNtY1N0YXJ0QWRkcmVzcywKKwkJY29uc3QgdWludDhfdCAqc3JjLAl1aW50MzJfdCBieXRl Q291bnQsIHVpbnQzMl90IGxpbWl0KTsKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9hbWQvcG93ZXJwbGF5L3NtdW1nci9zbXVtZ3IuYyBiL2RyaXZlcnMvZ3B1L2RybS9h bWQvcG93ZXJwbGF5L3NtdW1nci9zbXVtZ3IuYwppbmRleCBhMzg2Y2E4Li4wNjNhZTcxIDEwMDY0 NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL3Bvd2VycGxheS9zbXVtZ3Ivc211bWdyLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9wb3dlcnBsYXkvc211bWdyL3NtdW1nci5jCkBAIC0yOSw2 ICsyOSw3IEBACiAjaW5jbHVkZSAibGludXgvZGVsYXkuaCIKICNpbmNsdWRlICJjel9zbXVtZ3Iu aCIKICNpbmNsdWRlICJ0b25nYV9zbXVtZ3IuaCIKKyNpbmNsdWRlICJmaWppX3NtdW1nci5oIgog CiBpbnQgc211bV9pbml0KHN0cnVjdCBhbWRfcHBfaW5pdCAqcHBfaW5pdCwgc3RydWN0IHBwX2lu c3RhbmNlICpoYW5kbGUpCiB7CkBAIC01OCw2ICs1OSw5IEBAIGludCBzbXVtX2luaXQoc3RydWN0 IGFtZF9wcF9pbml0ICpwcF9pbml0LCBzdHJ1Y3QgcHBfaW5zdGFuY2UgKmhhbmRsZSkKIAkJY2Fz ZSBDSElQX1RPTkdBOgogCQkJdG9uZ2Ffc211bV9pbml0KHNtdW1ncik7CiAJCQlicmVhazsKKwkJ Y2FzZSBDSElQX0ZJSkk6CisJCQlmaWppX3NtdW1faW5pdChzbXVtZ3IpOworCQkJYnJlYWs7CiAJ CWRlZmF1bHQ6CiAJCQlyZXR1cm4gLUVJTlZBTDsKIAkJfQotLSAKMS44LjMuMQoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcg bGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK