From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [RFC,4/5] dmaengine: ti: New driver for K3 UDMA From: Peter Ujfalusi Message-Id: <20180924130021.20530-5-peter.ujfalusi@ti.com> Date: Mon, 24 Sep 2018 16:00:20 +0300 To: vkoul@kernel.org, dan.j.williams@intel.com Cc: dmaengine@vger.kernel.org, grygorii.strashko@ti.com List-ID: RE1BIGRyaXZlciBmb3IKVGV4YXMgSW5zdHJ1bWVudHMgSzMgTkFWU1MgVW5pZmllZCBETUEg4oCT IFBlcmlwaGVyYWwgUm9vdCBDb21wbGV4IChVRE1BLVApCgpUaGUgVURNQS1QIGlzIGludGVuZGVk IHRvIHBlcmZvcm0gc2ltaWxhciAoYnV0IHNpZ25pZmljYW50bHkgdXBncmFkZWQpIGZ1bmN0aW9u cwphcyB0aGUgcGFja2V0LW9yaWVudGVkIERNQSB1c2VkIG9uIHByZXZpb3VzIFNvQyBkZXZpY2Vz LiBUaGUgVURNQS1QIG1vZHVsZQpzdXBwb3J0cyB0aGUgdHJhbnNtaXNzaW9uIGFuZCByZWNlcHRp b24gb2YgdmFyaW91cyBwYWNrZXQgdHlwZXMuIFRoZSBVRE1BLVAgaXMKYXJjaGl0ZWN0ZWQgdG8g ZmFjaWxpdGF0ZSB0aGUgc2VnbWVudGF0aW9uIGFuZCByZWFzc2VtYmx5IG9mIFNvQyBETUEgZGF0 YQpzdHJ1Y3R1cmUgY29tcGxpYW50IHBhY2tldHMgdG8vZnJvbSBzbWFsbGVyIGRhdGEgYmxvY2tz IHRoYXQgYXJlIG5hdGl2ZWx5CmNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWMgcmVxdWlyZW1l bnRzIG9mIGVhY2ggY29ubmVjdGVkIHBlcmlwaGVyYWwuIE11bHRpcGxlClR4IGFuZCBSeCBjaGFu bmVscyBhcmUgcHJvdmlkZWQgd2l0aGluIHRoZSBETUEgd2hpY2ggYWxsb3cgbXVsdGlwbGUgc2Vn bWVudGF0aW9uCm9yIHJlYXNzZW1ibHkgb3BlcmF0aW9ucyB0byBiZSBvbmdvaW5nLiBUaGUgRE1B IGNvbnRyb2xsZXIgbWFpbnRhaW5zIHN0YXRlCmluZm9ybWF0aW9uIGZvciBlYWNoIG9mIHRoZSBj aGFubmVscyB3aGljaCBhbGxvd3MgcGFja2V0IHNlZ21lbnRhdGlvbiBhbmQKcmVhc3NlbWJseSBv cGVyYXRpb25zIHRvIGJlIHRpbWUgZGl2aXNpb24gbXVsdGlwbGV4ZWQgYmV0d2VlbiBjaGFubmVs cyBpbiBvcmRlcgp0byBzaGFyZSB0aGUgdW5kZXJseWluZyBETUEgaGFyZHdhcmUuIEFuIGV4dGVy bmFsIERNQSBzY2hlZHVsZXIgaXMgdXNlZCB0bwpjb250cm9sIHRoZSBvcmRlcmluZyBhbmQgcmF0 ZSBhdCB3aGljaCB0aGlzIG11bHRpcGxleGluZyBvY2N1cnMgZm9yIFRyYW5zbWl0Cm9wZXJhdGlv bnMuIFRoZSBvcmRlcmluZyBhbmQgcmF0ZSBvZiBSZWNlaXZlIG9wZXJhdGlvbnMgaXMgaW5kaXJl Y3RseSBjb250cm9sbGVkCmJ5IHRoZSBvcmRlciBpbiB3aGljaCBibG9ja3MgYXJlIHB1c2hlZCBp bnRvIHRoZSBETUEgb24gdGhlIFJ4IFBTSS1MIGludGVyZmFjZS4KClRoZSBVRE1BLVAgYWxzbyBz dXBwb3J0cyBhY3RpbmcgYXMgYm90aCBhIFVUQyBhbmQgVURNQS1DIGZvciBpdHMgaW50ZXJuYWwK Y2hhbm5lbHMuIENoYW5uZWxzIGluIHRoZSBVRE1BLVAgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gYmUg ZWl0aGVyIFBhY2tldC1CYXNlZCBvcgpUaGlyZC1QYXJ0eSBjaGFubmVscyBvbiBhIGNoYW5uZWwg YnkgY2hhbm5lbCBiYXNpcy4KClRoZSBpbml0aWFsIGRyaXZlciBzdXBwb3J0czoKLSBNRU1fVE9f TUVNIChUUiBtb2RlKQotIERFVl9UT19NRU0gKFBhY2tldCAvIFRSIG1vZGUpCi0gTUVNX1RPX0RF ViAoUGFja2V0IC8gVFIgbW9kZSkKLSBDeWNsaWMgKFBhY2tldCAvIFRSIG1vZGUpCi0gTWV0YWRh dGEgZm9yIGRlc2NyaXB0b3JzCgpTaWduZWQtb2ZmLWJ5OiBQZXRlciBVamZhbHVzaSA8cGV0ZXIu dWpmYWx1c2lAdGkuY29tPgotLS0KIGRyaXZlcnMvZG1hL3RpL0tjb25maWcgICAgICAgICAgICB8 ICAgMTIgKwogZHJpdmVycy9kbWEvdGkvTWFrZWZpbGUgICAgICAgICAgIHwgICAgMSArCiBkcml2 ZXJzL2RtYS90aS9rMy11ZG1hLmMgICAgICAgICAgfCAzNjIzICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrCiBkcml2ZXJzL2RtYS90aS9rMy11ZG1hLmggICAgICAgICAgfCAgMTMyICsrCiBp bmNsdWRlL2R0LWJpbmRpbmdzL2RtYS9rMy11ZG1hLmggfCAgIDI2ICsKIDUgZmlsZXMgY2hhbmdl ZCwgMzc5NCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEvdGkv azMtdWRtYS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9kbWEvdGkvazMtdWRtYS5oCiBj cmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kdC1iaW5kaW5ncy9kbWEvazMtdWRtYS5oCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy9kbWEvdGkvS2NvbmZpZyBiL2RyaXZlcnMvZG1hL3RpL0tjb25maWcK aW5kZXggZTVlNzRlMTM2MWRjLi5kYjczMzcxZGUyMDYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZG1h L3RpL0tjb25maWcKKysrIGIvZHJpdmVycy9kbWEvdGkvS2NvbmZpZwpAQCAtMzMsNSArMzMsMTcg QEAgY29uZmlnIERNQV9PTUFQCiAJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIFRJIHNETUEgKFN5 c3RlbSBETUEgb3IgRE1BNCkgY29udHJvbGxlci4gVGhpcwogCSAgRE1BIGVuZ2luZSBpcyBmb3Vu ZCBvbiBPTUFQIGFuZCBEUkE3eHggcGFydHMuCiAKK2NvbmZpZyBUSV9LM19OQVZTU19VRE1BCisJ dHJpc3RhdGUgIlRleGFzIEluc3RydW1lbnRzIFVETUEgc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEFS Q0hfSzMgfHwgQ09NUElMRV9URVNUCisJZGVwZW5kcyBvbiBUSV9TQ0lfUFJPVE9DT0wKKwlzZWxl Y3QgRE1BX0VOR0lORQorCXNlbGVjdCBETUFfVklSVFVBTF9DSEFOTkVMUworCXNlbGVjdCBUSV9L M19OQVZTU19SSU5HQUNDCisJZGVmYXVsdCB5CisgICAgICAgIGhlbHAKKwkgIEVuYWJsZSBzdXBw b3J0IGZvciB0aGUgVEkgVURNQSAoVW5pZmllZCBETUEpIGNvbnRyb2xsZXIuIFRoaXMKKwkgIERN QSBlbmdpbmUgaXMgdXNlZCBpbiBBTTY1eC4KKwogY29uZmlnIFRJX0RNQV9DUk9TU0JBUgogCWJv b2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZG1hL3RpL01ha2VmaWxlIGIvZHJpdmVycy9kbWEvdGkv TWFrZWZpbGUKaW5kZXggMTEzZTU5ZWM5YzMyLi45MTFmN2M3MjM5NzkgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZG1hL3RpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZG1hL3RpL01ha2VmaWxlCkBAIC0y LDQgKzIsNSBAQAogb2JqLSQoQ09ORklHX1RJX0NQUEk0MSkgKz0gY3BwaTQxLm8KIG9iai0kKENP TkZJR19USV9FRE1BKSArPSBlZG1hLm8KIG9iai0kKENPTkZJR19ETUFfT01BUCkgKz0gb21hcC1k bWEubworb2JqLSQoQ09ORklHX1RJX0szX05BVlNTX1VETUEpICs9IGszLXVkbWEubwogb2JqLSQo Q09ORklHX1RJX0RNQV9DUk9TU0JBUikgKz0gZG1hLWNyb3NzYmFyLm8KZGlmZiAtLWdpdCBhL2Ry aXZlcnMvZG1hL3RpL2szLXVkbWEuYyBiL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjJhMmEyYzhiMWZjMgotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZG1hL3RpL2szLXVkbWEuYwpAQCAtMCwwICsxLDM2MjMgQEAKKy8v IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogIENvcHlyaWdodCAoQykg MjAxOCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRpLmNvbQor ICogIEF1dGhvcjogUGV0ZXIgVWpmYWx1c2kgPHBldGVyLnVqZmFsdXNpQHRpLmNvbT4KKyAqLwor CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNp bmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5o PgorI2luY2x1ZGUgPGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNp bmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5j bHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4K KyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNp bmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2RtYS5oPgorI2luY2x1ZGUg PGxpbnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2lycS5oPgorI2luY2x1ZGUg PGxpbnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNs dWRlIDxkdC1iaW5kaW5ncy9kbWEvazMtdWRtYS5oPgorI2luY2x1ZGUgPGxpbnV4L3NvYy90aS9r My1uYXZzcy1yaW5nYWNjLmg+CisjaW5jbHVkZSA8bGludXgvc29jL3RpL3RpX3NjaV9wcm90b2Nv bC5oPgorI2luY2x1ZGUgPGxpbnV4L2lycWNoaXAvaXJxLXRpLXNjaS1pbnRhLmg+CisjaW5jbHVk ZSA8bGludXgvc29jL3RpL2NwcGk1Lmg+CisKKyNpbmNsdWRlICIuLi92aXJ0LWRtYS5oIgorI2lu Y2x1ZGUgImszLXVkbWEuaCIKKworLyogZWxlbWVudCBzaXplcyAqLworI2RlZmluZSBVRE1BX0VM U0laRV84CQkJCTAKKyNkZWZpbmUgVURNQV9FTFNJWkVfMTYJCQkJMQorI2RlZmluZSBVRE1BX0VM U0laRV8yNAkJCQkyCisjZGVmaW5lIFVETUFfRUxTSVpFXzMyCQkJCTMKKyNkZWZpbmUgVURNQV9F TFNJWkVfNjQJCQkJNAorCitzdGF0aWMgY29uc3QgdTggZWxzaXplX2J5dGVzW10gPSB7CisJW1VE TUFfRUxTSVpFXzhdID0gMSwKKwlbVURNQV9FTFNJWkVfMTZdID0gMiwKKwlbVURNQV9FTFNJWkVf MjRdID0gMywKKwlbVURNQV9FTFNJWkVfMzJdID0gNCwKKwlbVURNQV9FTFNJWkVfNjRdID0gOCwK K307CisKKyNkZWZpbmUgQ1BQSTUwX1RSX0ZMQUdTX1RZUEUoeCkJCQkoeCA8PCAwKQorI2RlZmlu ZSBDUFBJNTBfVFJfRkxBR1NfV0FJVAkJCSgxIDw8IDUpCisvKgorICogRVZFTlRfU0laRToKKyAq IDA6IE9ubHkgZ2VuZXJhdGUgZXZlbnQgd2hlbiB0aGUgVFIgaXMgY29tcGxldGVkCisgKiAxOiBF dmVudCBpcyBnZW5lcmF0ZWQgd2hlbiBJQ05UMSBpcyBkZWNyZW1lbnRlZCBieSAxCisgKiAyOiBF dmVudCBpcyBnZW5lcmF0ZWQgd2hlbiBJQ05UMiBpcyBkZWNyZW1lbnRlZCBieSAxCisgKiAzOiBF dmVudCBpcyBnZW5lcmF0ZWQgd2hlbiBJQ05UMyBpcyBkZWNyZW1lbnRlZCBieSAxCisgKi8KKyNk ZWZpbmUgQ1BQSTUwX1RSX0ZMQUdTX0VWRU5UX1NJWkUoeCkJCSgoKHgpICYgMHgzKSA8PCA2KQor LyoKKyAqIFRSSUdHRVJ4OgorICogMDogTm8gdHJpZ2dlcgorICogMTogR2xvYmFsIFRyaWdnZXIg MCBmb3IgdGhlIGNoYW5uZWwKKyAqIDI6IEdsb2JhbCBUcmlnZ2VyIDEgZm9yIHRoZSBjaGFubmVs CisgKiAzOiBMb2NhbCBFdmVudCBmb3IgdGhlIGNoYW5uZWwKKyAqCisgKiBUUklHR0VSX1RZUEV4 OgorICogMDogSUNOVDEgY2FuIGJlIGRlY3JlbWVudGVkIGJ5IDEgb24gdHJpZ2dlcgorICogMTog SUNOVDIgY2FuIGJlIGRlY3JlbWVudGVkIGJ5IDEgb24gdHJpZ2dlcgorICogMjogSUNOVDMgY2Fu IGJlIGRlY3JlbWVudGVkIGJ5IDEgb24gdHJpZ2dlcgorICogMzogVGhlIGVudGlyZSBUUiBpcyB3 YWl0aW5nIGZvciB0aGUgdHJpZ2dlcgorICovCisjZGVmaW5lIENQUEk1MF9UUl9GTEFHU19UUklH R0VSMCh4KQkJKCgoeCkgJiAweDMpIDw8IDgpCisjZGVmaW5lIENQUEk1MF9UUl9GTEFHU19UUklH R0VSMF9UWVBFKHgpCSgoKHgpICYgMHgzKSA8PCAxMCkKKyNkZWZpbmUgQ1BQSTUwX1RSX0ZMQUdT X1RSSUdHRVIxKHgpCQkoKCh4KSAmIDB4MykgPDwgMTApCisjZGVmaW5lIENQUEk1MF9UUl9GTEFH U19UUklHR0VSMV9UWVBFKHgpCSgoKHgpICYgMHgzKSA8PCAxNCkKKworI2RlZmluZSBDUFBJNTBf VFJfRkxBR1NfU1VQUl9FVlQJCSgxIDw8IDI2KQorI2RlZmluZSBDUFBJNTBfVFJfRkxBR1NfRU9Q CQkJKDEgPDwgMzEpCisKKy8qIFRyYW5zZmVyIFJlcXVlc3QgVHlwZSAwOiBPbmUgRGltZW5zaW9u YWwgVHJhbnNmZXIgKi8KK3N0cnVjdCBjcHBpNTBfdHJfcmVxX3R5cGUwIHsKKwl1MzIgZmxhZ3M7 CisJdTE2IGljbnQwOworCXUxNiB1bnVzZWQ7CisJdTY0IGFkZHI7Cit9IF9fcGFja2VkOworCisv KiBUcmFuc2ZlciBSZXF1ZXN0IFR5cGUgMTogVHdvIERpbWVuc2lvbmFsIFRyYW5zZmVyICovCitz dHJ1Y3QgY3BwaTUwX3RyX3JlcV90eXBlMSB7CisJdTMyIGZsYWdzOworCXUxNiBpY250MDsKKwl1 MTYgaWNudDE7CisJdTY0IGFkZHI7CisJczMyIGRpbTE7CisJdTMyIHBhZGRbM107IC8qIGZ1bGwg c2l6ZSBpcyAzMiBieXRlcyAqLworfSBfX3BhY2tlZDsKKworLyogVHJhbnNmZXIgUmVxdWVzdCBU eXBlIDI6IFRocmVlIERpbWVuc2lvbmFsIFRyYW5zZmVyICovCitzdHJ1Y3QgY3BwaTUwX3RyX3Jl cV90eXBlMiB7CisJdTMyIGZsYWdzOworCXUxNiBpY250MDsKKwl1MTYgaWNudDE7CisJdTY0IGFk ZHI7CisJczMyIGRpbTE7CisJdTE2IGljbnQyOworCXUxNiB1bnVzZWQ7CisJczMyIGRpbTI7CisJ dTMyIHBhZGQ7IC8qIGZ1bGwgc2l6ZSBpcyAzMiBieXRlcyAqLworfSBfX3BhY2tlZDsKKworLyog VHJhbnNmZXIgUmVxdWVzdCBUeXBlIDk6IEZvdXIgRGltZW5zaW9uYWwgQmxvY2sgQ29weSB3aXRo IFJlcGFja2luZyAqLworc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTkgeworCXUzMiBmbGFnczsK Kwl1MTYgaWNudDA7CisJdTE2IGljbnQxOworCXU2NCBhZGRyOworCXMzMiBkaW0xOworCXUxNiBp Y250MjsKKwl1MTYgaWNudDM7CisJczMyIGRpbTI7CisJczMyIGRpbTM7CisJdTMyIGZtdGZsYWdz OworCXMzMiBkZGltMTsKKwl1NjQgZGFkZHI7CisJczMyIGRkaW0yOworCXMzMiBkZGltMzsKKwl1 MTYgZGljbnQwOworCXUxNiBkaWNudDE7CisJdTE2IGRpY250MjsKKwl1MTYgZGljbnQzOworfSBf X3BhY2tlZDsKKworLyogVHJhbnNmZXIgUmVxdWVzdCBUeXBlIDEwOiBUd28gRGltZW5zaW9uYWwg QkxvY2sgQ29weSAqLworc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTEwIHsKKwl1MzIgZmxhZ3M7 CisJdTE2IGljbnQwOworCXUxNiBpY250MTsKKwl1NjQgYWRkcjsKKwlzMzIgZGltMTsKKwl1MzIg dW51c2VkWzNdOworCXUzMiBmbXRmbGFnczsKKwlzMzIgZGRpbTE7CisJdTY0IGRhZGRyOworCXUz MiBwYWRkWzRdOyAvKiBmdWxsIHNpemUgaXMgNjQgYnl0ZXMgKi8KK30gX19wYWNrZWQ7CisKKy8q CisgKiBUcmFuc2ZlciBSZXF1ZXN0IFR5cGUgMTU6IEZvdXIgRGltZW5zaW9uYWwgQmxvY2sgQ29w eSB3aXRoIFJlcGFja2luZworICoJCQkgICAgIGFuZCBJbmRpcmVjdGlvbiBTdXBwb3J0CisgKi8K K3N0cnVjdCBjcHBpNTBfdHJfcmVxX3R5cGUxNSB7CisJdTMyIGZsYWdzOworCXUxNiBpY250MDsK Kwl1MTYgaWNudDE7CisJdTY0IGFkZHI7CisJczMyIGRpbTE7CisJdTE2IGljbnQyOworCXUxNiBp Y250MzsKKwlzMzIgZGltMjsKKwlzMzIgZGltMzsKKwl1MzIgdW51c2VkOworCXMzMiBkZGltMTsK Kwl1NjQgZGFkZHI7CisJczMyIGRkaW0yOworCXMzMiBkZGltMzsKKwl1MTYgZGljbnQwOworCXUx NiBkaWNudDE7CisJdTE2IGRpY250MjsKKwl1MTYgZGljbnQzOworfSBfX3BhY2tlZDsKKworc3Ry dWN0IGNwcGk1MF90cl9yZXNwIHsKKwl1OCBzdGF0dXM7CisJdTggcmVzZXJ2ZWQ7CisJdTggY21k X2lkOworCXU4IGZsYWdzOworfSBfX3BhY2tlZDsKKworI2RlZmluZSBDUFBJNTBfVFJERVNDX1cw X0xBU1RfRU5UUlkoeCkJCSgoKHgpICYgMHgzZmZmKSA8PCAwKQorI2RlZmluZSBDUFBJNTBfVFJE RVNDX1cwX1JFTE9BRF9JRFgoeCkJCSgoKHgpICYgMHgzZmZmKSA8PCAxNCkKKyNkZWZpbmUgQ1BQ STUwX1RSREVTQ19XMF9SRUxPQURfQ05UKHgpCQkoKCh4KSAmIDB4MWZmKSA8PCAyMCkKKyNkZWZp bmUgQ1BQSTUwX1RSREVTQ19XMF9UWVBFCQkJKDB4MyA8PCAzMCkKKworI2RlZmluZSBDUFBJNTBf VFJERVNDX1cxX0ZMT1dJRCh4KQkJKCgoeCkgJiAweDNmZmYpIDw8IDApCisjZGVmaW5lIENQUEk1 MF9UUkRFU0NfVzFfUEFDS0VUSUQoeCkJCSgoKHgpICYgMHgzZmYpIDw8IDE0KQorI2RlZmluZSBD UFBJNTBfVFJERVNDX1cxX1RSX1NJWkVfMTYJCSgwIDw8IDI0KQorI2RlZmluZSBDUFBJNTBfVFJE RVNDX1cxX1RSX1NJWkVfMzIJCSgxIDw8IDI0KQorI2RlZmluZSBDUFBJNTBfVFJERVNDX1cxX1RS X1NJWkVfNjQJCSgyIDw8IDI0KQorI2RlZmluZSBDUFBJNTBfVFJERVNDX1cxX1RSX1NJWkVfMTI4 CQkoMyA8PCAyNCkKKworLyogQ1BQSSA1LjAgVHJhbnNmZXIgUmVxdWVzdCBEZXNjcmlwdG9yICov CitzdHJ1Y3QgY3BwaTUwX3RyX3JlcV9kZXNjIHsKKwl1MzIgcGFja2V0X2luZm9bNF07Cit9IF9f YWxpZ25lZCg2NCkgX19wYWNrZWQ7CisKK3N0cnVjdCB1ZG1hX3N0YXRpY190ciB7CisJdTggZWxz aXplOyAvKiBSUFNUUjAgKi8KKwl1MTYgZWxjbnQ7IC8qIFJQU1RSMCAqLworCXUxNiBic3RjbnQ7 IC8qIFJQU1RSMSAqLworfTsKKworI2RlZmluZSBLM19VRE1BX01BWF9SRkxPV1MgMTAyNAorCitz dHJ1Y3QgdWRtYV9jaGFuOworCitlbnVtIHVkbWFfbW1yIHsKKwlNTVJfR0NGRyA9IDAsCisJTU1S X1JDSEFOUlQsCisJTU1SX1RDSEFOUlQsCisJTU1SX0xBU1QsCit9OworCitzdGF0aWMgY29uc3Qg Y2hhciAqIGNvbnN0IG1tcl9uYW1lc1tdID0geyAiZ2NmZyIsICJyY2hhbnJ0IiwgInRjaGFucnQi IH07CisKK3N0cnVjdCB1ZG1hX3RjaGFuIHsKKwl2b2lkIF9faW9tZW0gKnJlZ19ydDsKKworCWlu dCBpZDsKKwlzdHJ1Y3QgazNfbmF2X3JpbmcgKnRfcmluZzsgLyogVHJhbnNtaXQgcmluZyAqLwor CXN0cnVjdCBrM19uYXZfcmluZyAqdGNfcmluZzsgLyogVHJhbnNtaXQgQ29tcGxldGlvbiByaW5n ICovCit9OworCitzdHJ1Y3QgdWRtYV9yY2hhbiB7CisJdm9pZCBfX2lvbWVtICpyZWdfcnQ7CisK KwlpbnQgaWQ7CisJc3RydWN0IGszX25hdl9yaW5nICpmZF9yaW5nOyAvKiBGcmVlIERlc2NyaXB0 b3IgcmluZyAqLworCXN0cnVjdCBrM19uYXZfcmluZyAqcl9yaW5nOyAvKiBSZWNlaXZlIHJpbmcq LworfTsKKworc3RydWN0IHVkbWFfcmZsb3cgeworCXZvaWQgX19pb21lbSAqcmVnX3JmbG93Owor CisJaW50IGlkOworfTsKKworc3RydWN0IHVkbWFfbWF0Y2hfZGF0YSB7CisJdTggdHBsX2xldmVs czsKKwl1MzIgbGV2ZWxfc3RhcnRfaWR4W107Cit9OworCitzdHJ1Y3QgdWRtYV9kZXYgeworCXN0 cnVjdCBkbWFfZGV2aWNlIGRkZXY7CisJc3RydWN0IGRldmljZSAqZGV2OworCXZvaWQgX19pb21l bSAqbW1yc1tNTVJfTEFTVF07CisJY29uc3Qgc3RydWN0IHVkbWFfbWF0Y2hfZGF0YSAqbWF0Y2hf ZGF0YTsKKworCXN0cnVjdCB1ZG1hX3Rpc2NpX3JtIHRpc2NpX3JtOworCisJc3RydWN0IGszX25h dl9yaW5nYWNjICpyaW5nYWNjOworCisJc3RydWN0IGlycV9kb21haW4gKmlycV9kb21haW47CisK KwlzdHJ1Y3Qgd29ya19zdHJ1Y3QgcHVyZ2Vfd29yazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGRlc2Nf dG9fcHVyZ2U7CisJc3BpbmxvY2tfdCBsb2NrOworCisJaW50IHRjaGFuX2NudDsKKwlpbnQgZWNo YW5fY250OworCWludCByY2hhbl9jbnQ7CisJaW50IHJmbG93X2NudDsKKwl1bnNpZ25lZCBsb25n ICp0Y2hhbl9tYXA7CisJdW5zaWduZWQgbG9uZyAqcmNoYW5fbWFwOworCXVuc2lnbmVkIGxvbmcg KnJmbG93X21hcDsKKwl1bnNpZ25lZCBsb25nICpyZmxvd19tYXBfcmVzZXJ2ZWQ7CisKKwlzdHJ1 Y3QgdWRtYV90Y2hhbiAqdGNoYW5zOworCXN0cnVjdCB1ZG1hX3JjaGFuICpyY2hhbnM7CisJc3Ry dWN0IHVkbWFfcmZsb3cgKnJmbG93czsKKworCXN0cnVjdCB1ZG1hX2NoYW4gKmNoYW5uZWxzOwor CXUzMiBwc2lsX2Jhc2U7Cit9OworCisvKgorICogU2xhdmUgUlggc2NhdHRlciBnYXRoZXIgd29y a2Fyb3VuZDoKKyAqIFdlIG5lZWQgdG8gdXNlIHNpbmdsZSBjb250aW51b3VzIGJ1ZmZlciBpZiB0 aGUgb3JpZ2luYWwgYnVmZmVyIGlzIHNjYXR0ZXJlZAorICovCitzdHJ1Y3QgdWRtYV9yeF9zZ193 b3JrYXJvdW5kIHsKKwlib29sIGluX3VzZTsKKworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dsOwor CXVuc2lnbmVkIGludCBzZ2xlbjsKKwlzaXplX3QgdG90YWxfbGVuOworCisJc3RydWN0IHNjYXR0 ZXJsaXN0IHNpbmdsZV9zZzsKK307CisKK3N0cnVjdCB1ZG1hX2h3ZGVzYyB7CisJc2l6ZV90IGNw cGk1X2Rlc2Nfc2l6ZTsKKwl2b2lkICpjcHBpNV9kZXNjX3ZhZGRyOworCWRtYV9hZGRyX3QgY3Bw aTVfZGVzY19wYWRkcjsKKworCS8qIFRSIGRlc2NyaXB0b3IgaW50ZXJuYWwgcG9pbnRlcnMgKi8K Kwl2b2lkICp0cl9yZXFfYmFzZTsKKwlzdHJ1Y3QgY3BwaTUwX3RyX3Jlc3AgKnRyX3Jlc3BfYmFz ZTsKK307CisKK3N0cnVjdCB1ZG1hX2Rlc2MgeworCXN0cnVjdCB2aXJ0X2RtYV9kZXNjIHZkOwor CisJYm9vbCB0ZXJtaW5hdGVkOworCisJZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpcjsK KworCXN0cnVjdCB1ZG1hX3N0YXRpY190ciBzdGF0aWNfdHI7CisJdTMyIHJlc2lkdWU7CisKKwl1 bnNpZ25lZCBpbnQgc2dsZW47CisJdW5zaWduZWQgaW50IGRlc2NfaWR4OyAvKiBPbmx5IHVzZWQg Zm9yIGN5Y2xpYyBpbiBwYWNrZXQgbW9kZSAqLworCXVuc2lnbmVkIGludCB0cl9pZHg7CisKKwkv KiBmb3Igc2xhdmVfc2cgUlggd29ya2Fyb3VuZCAqLworCXN0cnVjdCB1ZG1hX3J4X3NnX3dvcmth cm91bmQgcnhfc2dfd2E7CisKKwl1MzIgbWV0YWRhdGFfc2l6ZTsKKwl2b2lkICptZXRhZGF0YTsg LyogcG9pbnRlciB0byBwcm92aWRlZCBtZXRhZGF0YSBidWZmZXIgKEVQSVAsIFBTZGF0YSkgKi8K KworCXVuc2lnbmVkIGludCBod2Rlc2NfY291bnQ7CisJc3RydWN0IHVkbWFfaHdkZXNjIGh3ZGVz Y1swXTsKK307CisKK2VudW0gdWRtYV9jaGFuX3N0YXRlIHsKKwlVRE1BX0NIQU5fSVNfSURMRSA9 IDAsIC8qIG5vdCBhY3RpdmUsIG5vIHRlYXJkb3duIGlzIGluIHByb2dyZXNzICovCisJVURNQV9D SEFOX0lTX0FDVElWRSwgLyogTm9ybWFsIG9wZXJhdGlvbiAqLworCVVETUFfQ0hBTl9JU19BQ1RJ VkVfRkxVU0gsIC8qIEZsdXNoaW5nIGZvciBkZWxheWVkIHR4ICovCisJVURNQV9DSEFOX0lTX1RF Uk1JTkFUSU5HLCAvKiBjaGFubmVsIGlzIGJlaW5nIHRlcm1pbmF0ZWQgKi8KK307CisKK3N0cnVj dCB1ZG1hX2NoYW4geworCXN0cnVjdCB2aXJ0X2RtYV9jaGFuIHZjOworCXN0cnVjdCBkbWFfc2xh dmVfY29uZmlnCWNmZzsKKwlzdHJ1Y3QgdWRtYV9kZXYgKnVkOworCXN0cnVjdCB1ZG1hX2Rlc2Mg KmRlc2M7CisJc3RydWN0IHVkbWFfZGVzYyAqdGVybWluYXRlZF9kZXNjOworCXN0cnVjdCB1ZG1h X3N0YXRpY190ciBzdGF0aWNfdHI7CisJY2hhciAqbmFtZTsKKworCXN0cnVjdCB1ZG1hX3RjaGFu ICp0Y2hhbjsKKwlzdHJ1Y3QgdWRtYV9yY2hhbiAqcmNoYW47CisJc3RydWN0IHVkbWFfcmZsb3cg KnJmbG93OworCisJYm9vbCBwc2lsX3BhaXJlZDsKKwl1MzIgaXJxX3JhX3Rpc2NpOworCXUzMiBp cnFfcmFfaWR4OworCXUzMiBpcnFfdWRtYV9pZHg7CisKKwlpbnQgaXJxX251bV9yaW5nOworCWlu dCBpcnFfbnVtX3VkbWE7CisKKwlib29sIGN5Y2xpYzsKKwlib29sIHBhdXNlZDsKKworCWVudW0g dWRtYV9jaGFuX3N0YXRlIHN0YXRlOworCXN0cnVjdCBjb21wbGV0aW9uIHRlYXJkb3duX2NvbXBs ZXRlZDsKKworCXUzMiBiY250OyAvKiBudW1iZXIgb2YgYnl0ZXMgY29tcGxldGVkIHNpbmNlIHRo ZSBzdGFydCBvZiB0aGUgY2hhbm5lbCAqLworCXUzMiBpbl9yaW5nX2NudDsgLyogbnVtYmVyIG9m IGRlc2NyaXB0b3JzIGluIGZsaWdodCAqLworCisJYm9vbCBwa3RfbW9kZTsgLyogVFIgb3IgcGFj a2V0ICovCisJYm9vbCBuZWVkc19lcGliOyAvKiBFUElCIGlzIG5lZWRlZCBmb3IgdGhlIGNvbW11 bmljYXRpb24gb3Igbm90ICovCisJdTMyIHBzZF9zaXplOyAvKiBzaXplIG9mIFByb3RvY29sIFNw ZWNpZmljIERhdGEgKi8KKwl1MzIgbWV0YWRhdGFfc2l6ZTsgLyogKG5lZWRzX2VwaWIgPyAxNjow KSArIHBzZF9zaXplICovCisJdTMyIGhkZXNjX3NpemU7IC8qIFNpemUgb2YgYSBwYWNrZXQgZGVz Y3JpcHRvciBpbiBwYWNrZXQgbW9kZSAqLworCWludCBkZXNjX2FsaWduOyAvKiBhbGlnbm1lbnQg dG8gdXNlIGZvciBkZXNjcmlwdG9ycyAqLworCWludCBzbGF2ZV90aHJlYWRfaWQ7CisJdTMyIHNy Y190aHJlYWQ7CisJdTMyIGRzdF90aHJlYWQ7CisJdTMyIHN0YXRpY190cl90eXBlOworCWVudW0g dWRtYV90cF9sZXZlbCBjaGFubmVsX3RwbDsgLyogQ2hhbm5lbCBUaHJvdWdocHV0IExldmVsICov CisKKwkvKiBkbWFwb29sIGZvciBwYWNrZXQgbW9kZSBkZXNjcmlwdG9ycyAqLworCWJvb2wgdXNl X2RtYV9wb29sOworCXN0cnVjdCBkbWFfcG9vbCAqaGRlc2NfcG9vbDsKKworCXUzMiBpZDsKKwll bnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyOworfTsKKworc3RhdGljIGlubGluZSBzdHJ1 Y3QgdWRtYV9kZXYgKnRvX3VkbWFfZGV2KHN0cnVjdCBkbWFfZGV2aWNlICpkKQoreworCXJldHVy biBjb250YWluZXJfb2YoZCwgc3RydWN0IHVkbWFfZGV2LCBkZGV2KTsKK30KKworc3RhdGljIGlu bGluZSBzdHJ1Y3QgdWRtYV9jaGFuICp0b191ZG1hX2NoYW4oc3RydWN0IGRtYV9jaGFuICpjKQor eworCXJldHVybiBjb250YWluZXJfb2YoYywgc3RydWN0IHVkbWFfY2hhbiwgdmMuY2hhbik7Cit9 CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHVkbWFfZGVzYyAqdG9fdWRtYV9kZXNjKHN0cnVjdCBk bWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqdCkKK3sKKwlyZXR1cm4gY29udGFpbmVyX29mKHQsIHN0 cnVjdCB1ZG1hX2Rlc2MsIHZkLnR4KTsKK30KKworI2RlZmluZSBVRE1BX0NIXzEwMDAoY2gpCQko Y2ggKiAweDEwMDApCisKKy8qIEdlbmVyaWMgcmVnaXN0ZXIgYWNjZXNzIGZ1bmN0aW9ucyAqLwor c3RhdGljIGlubGluZSB1MzIgdWRtYV9yZWFkKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IHJlZykK K3sKKwlyZXR1cm4gX19yYXdfcmVhZGwoYmFzZSArIHJlZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUg dm9pZCB1ZG1hX3dyaXRlKHZvaWQgX19pb21lbSAqYmFzZSwgaW50IHJlZywgdTMyIHZhbCkKK3sK KwlfX3Jhd193cml0ZWwodmFsLCBiYXNlICsgcmVnKTsKK30KKworc3RhdGljIGlubGluZSB2b2lk IHVkbWFfdXBkYXRlX2JpdHModm9pZCBfX2lvbWVtICpiYXNlLCBpbnQgcmVnLAorCQkJCSAgICB1 MzIgbWFzaywgdTMyIHZhbCkKK3sKKwl1MzIgdG1wLCBvcmlnOworCisJb3JpZyA9IF9fcmF3X3Jl YWRsKGJhc2UgKyByZWcpOworCXRtcCA9IG9yaWcgJiB+bWFzazsKKwl0bXAgfD0gKHZhbCAmIG1h c2spOworCisJaWYgKHRtcCAhPSBvcmlnKQorCQlfX3Jhd193cml0ZWwodG1wLCBiYXNlICsgcmVn KTsKK30KKworLyogVENIQU5SVCAqLworc3RhdGljIGlubGluZSB1MzIgdWRtYV90Y2hhbnJ0X3Jl YWQoc3RydWN0IHVkbWFfdGNoYW4gKnRjaGFuLCBpbnQgcmVnKQoreworCWlmICghdGNoYW4pCisJ CXJldHVybiAwOworCXJldHVybiB1ZG1hX3JlYWQodGNoYW4tPnJlZ19ydCwgcmVnKTsKK30KKwor c3RhdGljIGlubGluZSB2b2lkIHVkbWFfdGNoYW5ydF93cml0ZShzdHJ1Y3QgdWRtYV90Y2hhbiAq dGNoYW4sIGludCByZWcsCisJCQkJICAgICAgdTMyIHZhbCkKK3sKKwlpZiAoIXRjaGFuKQorCQly ZXR1cm47CisJdWRtYV93cml0ZSh0Y2hhbi0+cmVnX3J0LCByZWcsIHZhbCk7Cit9CisKK3N0YXRp YyBpbmxpbmUgdm9pZCB1ZG1hX3RjaGFucnRfdXBkYXRlX2JpdHMoc3RydWN0IHVkbWFfdGNoYW4g KnRjaGFuLCBpbnQgcmVnLAorCQkJCQkgICAgdTMyIG1hc2ssIHUzMiB2YWwpCit7CisJaWYgKCF0 Y2hhbikKKwkJcmV0dXJuOworCXVkbWFfdXBkYXRlX2JpdHModGNoYW4tPnJlZ19ydCwgcmVnLCBt YXNrLCB2YWwpOworfQorCisvKiBSQ0hBTlJUICovCitzdGF0aWMgaW5saW5lIHUzMiB1ZG1hX3Jj aGFucnRfcmVhZChzdHJ1Y3QgdWRtYV9yY2hhbiAqcmNoYW4sIGludCByZWcpCit7CisJaWYgKCFy Y2hhbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHVkbWFfcmVhZChyY2hhbi0+cmVnX3J0LCByZWcp OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRtYV9yY2hhbnJ0X3dyaXRlKHN0cnVjdCB1ZG1h X3JjaGFuICpyY2hhbiwgaW50IHJlZywKKwkJCQkgICAgICB1MzIgdmFsKQoreworCWlmICghcmNo YW4pCisJCXJldHVybjsKKwl1ZG1hX3dyaXRlKHJjaGFuLT5yZWdfcnQsIHJlZywgdmFsKTsKK30K Kworc3RhdGljIGlubGluZSB2b2lkIHVkbWFfcmNoYW5ydF91cGRhdGVfYml0cyhzdHJ1Y3QgdWRt YV9yY2hhbiAqcmNoYW4sIGludCByZWcsCisJCQkJCSAgICB1MzIgbWFzaywgdTMyIHZhbCkKK3sK KwlpZiAoIXJjaGFuKQorCQlyZXR1cm47CisJdWRtYV91cGRhdGVfYml0cyhyY2hhbi0+cmVnX3J0 LCByZWcsIG1hc2ssIHZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5hdnNzX3BzaWxfcGFp cihzdHJ1Y3QgdWRtYV9kZXYgKnVkLCB1MzIgc3JjX3RocmVhZCwKKwkJCQkgIHUzMiBkc3RfdGhy ZWFkKQoreworCXN0cnVjdCB1ZG1hX3Rpc2NpX3JtICp0aXNjaV9ybSA9ICZ1ZC0+dGlzY2lfcm07 CisKKwlkc3RfdGhyZWFkIHw9IFVETUFfUFNJTF9EU1RfVEhSRUFEX0lEX09GRlNFVDsKKwlyZXR1 cm4gdGlzY2lfcm0tPnRpc2NpX3BzaWxfb3BzLT5wYWlyKHRpc2NpX3JtLT50aXNjaSwKKwkJCQkJ ICAgICAgdGlzY2lfcm0tPnRpc2NpX25hdnNzX2Rldl9pZCwKKwkJCQkJICAgICAgc3JjX3RocmVh ZCwgZHN0X3RocmVhZCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5hdnNzX3BzaWxfdW5wYWly KHN0cnVjdCB1ZG1hX2RldiAqdWQsIHUzMiBzcmNfdGhyZWFkLAorCQkJCSAgICB1MzIgZHN0X3Ro cmVhZCkKK3sKKwlzdHJ1Y3QgdWRtYV90aXNjaV9ybSAqdGlzY2lfcm0gPSAmdWQtPnRpc2NpX3Jt OworCisJZHN0X3RocmVhZCB8PSBVRE1BX1BTSUxfRFNUX1RIUkVBRF9JRF9PRkZTRVQ7CisJcmV0 dXJuIHRpc2NpX3JtLT50aXNjaV9wc2lsX29wcy0+dW5wYWlyKHRpc2NpX3JtLT50aXNjaSwKKwkJ CQkJCXRpc2NpX3JtLT50aXNjaV9uYXZzc19kZXZfaWQsCisJCQkJCQlzcmNfdGhyZWFkLCBkc3Rf dGhyZWFkKTsKK30KKworc3RhdGljIGlubGluZSBjaGFyICp1ZG1hX2dldF9kaXJfdGV4dChlbnVt IGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyKQoreworCXN3aXRjaCAoZGlyKSB7CisJY2FzZSBE TUFfREVWX1RPX01FTToKKwkJcmV0dXJuICJERVZfVE9fTUVNIjsKKwljYXNlIERNQV9NRU1fVE9f REVWOgorCQlyZXR1cm4gIk1FTV9UT19ERVYiOworCWNhc2UgRE1BX01FTV9UT19NRU06CisJCXJl dHVybiAiTUVNX1RPX01FTSI7CisJY2FzZSBETUFfREVWX1RPX0RFVjoKKwkJcmV0dXJuICJERVZf VE9fREVWIjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gImludmFsaWQiOwor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgdWRtYV9kdW1wX2NoYW5fc3RkYXRhKHN0cnVjdCB1ZG1h X2NoYW4gKnVjKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVjLT51ZC0+ZGV2OworCXUzMiBv ZmZzZXQ7CisJaW50IGk7CisKKwlpZiAodWMtPmRpciA9PSBETUFfTUVNX1RPX0RFViB8fCB1Yy0+ ZGlyID09IERNQV9NRU1fVE9fTUVNKSB7CisJCWRldl9kYmcoZGV2LCAiVENIQU4gU3RhdGUgZGF0 YTpcbiIpOworCQlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykgeworCQkJb2Zmc2V0ID0gVURNQV9U Q0hBTl9SVF9TVERBVEFfUkVHICsgaSAqIDQ7CisJCQlkZXZfZGJnKGRldiwgIlRSVF9TVERBVEFb JTAyZF06IDB4JTA4eFxuIiwgaSwKKwkJCQl1ZG1hX3RjaGFucnRfcmVhZCh1Yy0+dGNoYW4sIG9m ZnNldCkpOworCQl9CisJfQorCisJaWYgKHVjLT5kaXIgPT0gRE1BX0RFVl9UT19NRU0gfHwgdWMt PmRpciA9PSBETUFfTUVNX1RPX01FTSkgeworCQlkZXZfZGJnKGRldiwgIlJDSEFOIFN0YXRlIGRh dGE6XG4iKTsKKwkJZm9yIChpID0gMDsgaSA8IDMyOyBpKyspIHsKKwkJCW9mZnNldCA9IFVETUFf UkNIQU5fUlRfU1REQVRBX1JFRyArIGkgKiA0OworCQkJZGV2X2RiZyhkZXYsICJSUlRfU1REQVRB WyUwMmRdOiAweCUwOHhcbiIsIGksCisJCQkJdWRtYV9yY2hhbnJ0X3JlYWQodWMtPnJjaGFuLCBv ZmZzZXQpKTsKKwkJfQorCX0KK30KKworc3RhdGljIGlubGluZSBkbWFfYWRkcl90IHVkbWFfY3Vy cl9jcHBpNV9kZXNjX3BhZGRyKHN0cnVjdCB1ZG1hX2Rlc2MgKmQsCisJCQkJCQkgICAgaW50IGlk eCkKK3sKKwlyZXR1cm4gZC0+aHdkZXNjW2lkeF0uY3BwaTVfZGVzY19wYWRkcjsKK30KKworc3Rh dGljIGlubGluZSB2b2lkICp1ZG1hX2N1cnJfY3BwaTVfZGVzY192YWRkcihzdHJ1Y3QgdWRtYV9k ZXNjICpkLCBpbnQgaWR4KQoreworCXJldHVybiBkLT5od2Rlc2NbaWR4XS5jcHBpNV9kZXNjX3Zh ZGRyOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1ZG1hX2Rlc2MgKnVkbWFfdWRtYV9kZXNj X2Zyb21fcGFkZHIoc3RydWN0IHVkbWFfY2hhbiAqdWMsCisJCQkJCQkJICBkbWFfYWRkcl90IHBh ZGRyKQoreworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQgPSB1Yy0+dGVybWluYXRlZF9kZXNjOworCisJ aWYgKGQpIHsKKwkJZG1hX2FkZHJfdCBkZXNjX3BhZGRyID0gdWRtYV9jdXJyX2NwcGk1X2Rlc2Nf cGFkZHIoZCwKKwkJCQkJCQkJICAgZC0+ZGVzY19pZHgpOworCisJCWlmIChkZXNjX3BhZGRyICE9 IHBhZGRyKQorCQkJZCA9IE5VTEw7CisJfQorCisJaWYgKCFkKSB7CisJCWQgPSB1Yy0+ZGVzYzsK KwkJaWYgKGQpIHsKKwkJCWRtYV9hZGRyX3QgZGVzY19wYWRkciA9IHVkbWFfY3Vycl9jcHBpNV9k ZXNjX3BhZGRyKGQsCisJCQkJCQkJCWQtPmRlc2NfaWR4KTsKKworCQkJaWYgKGRlc2NfcGFkZHIg IT0gcGFkZHIpCisJCQkJZCA9IE5VTEw7CisJCX0KKwl9CisKKwlyZXR1cm4gZDsKK30KKworc3Rh dGljIGlubGluZSBzaXplX3QgdWRtYV9jYWxjX3RyZGVzY19zaXplKHNpemVfdCB0cl9zaXplLCBp bnQgdHJfY291bnQpCit7CisJc2l6ZV90IHRyZGVzY19zaXplID0gc2l6ZW9mKHN0cnVjdCBjcHBp NTBfdHJfcmVxX2Rlc2MpOworCisJdHJkZXNjX3NpemUgKz0gdHJfc2l6ZSAqICh0cl9jb3VudCAr IDEpOworCXRyZGVzY19zaXplICs9IHRyX2NvdW50ICogc2l6ZW9mKHN0cnVjdCBjcHBpNTBfdHJf cmVzcCk7CisKKwlyZXR1cm4gdHJkZXNjX3NpemU7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfZnJl ZV9od2Rlc2Moc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkKQoreworCXN0cnVjdCB1ZG1hX2NoYW4g KnVjID0gdG9fdWRtYV9jaGFuKHZkLT50eC5jaGFuKTsKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkID0g dG9fdWRtYV9kZXNjKCZ2ZC0+dHgpOworCisJaWYgKHVjLT51c2VfZG1hX3Bvb2wpIHsKKwkJaW50 IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IGQtPmh3ZGVzY19jb3VudDsgaSsrKSB7CisJCQlpZiAo IWQtPmh3ZGVzY1tpXS5jcHBpNV9kZXNjX3ZhZGRyKQorCQkJCWNvbnRpbnVlOworCisJCQlkbWFf cG9vbF9mcmVlKHVjLT5oZGVzY19wb29sLAorCQkJCSAgICAgIGQtPmh3ZGVzY1tpXS5jcHBpNV9k ZXNjX3ZhZGRyLAorCQkJCSAgICAgIGQtPmh3ZGVzY1tpXS5jcHBpNV9kZXNjX3BhZGRyKTsKKwor CQkJZC0+aHdkZXNjW2ldLmNwcGk1X2Rlc2NfdmFkZHIgPSBOVUxMOworCQl9CisJfSBlbHNlIGlm IChkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY192YWRkcikgeworCQlzdHJ1Y3QgdWRtYV9kZXYgKnVk ID0gdG9fdWRtYV9kZXYodmQtPnR4LmNoYW4tPmRldmljZSk7CisKKwkJZG1hX2ZyZWVfY29oZXJl bnQodWQtPmRldiwgZC0+aHdkZXNjWzBdLmNwcGk1X2Rlc2Nfc2l6ZSwKKwkJCQkgIGQtPmh3ZGVz Y1swXS5jcHBpNV9kZXNjX3ZhZGRyLAorCQkJCSAgZC0+aHdkZXNjWzBdLmNwcGk1X2Rlc2NfcGFk ZHIpOworCisJCWQtPmh3ZGVzY1swXS5jcHBpNV9kZXNjX3ZhZGRyID0gTlVMTDsKKwl9CisKKwlp ZiAoZC0+cnhfc2dfd2EuaW5fdXNlKSB7CisJCWRtYV91bm1hcF9zZyh1Yy0+dWQtPmRldiwgJmQt PnJ4X3NnX3dhLnNpbmdsZV9zZywgMSwKKwkJCSAgICAgRE1BX0ZST01fREVWSUNFKTsKKwkJa2Zy ZWUoc2dfdmlydCgmZC0+cnhfc2dfd2Euc2luZ2xlX3NnKSk7CisJfQorfQorCitzdGF0aWMgdm9p ZCB1ZG1hX3B1cmdlX2Rlc2Nfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3Ry dWN0IHVkbWFfZGV2ICp1ZCA9IGNvbnRhaW5lcl9vZih3b3JrLCB0eXBlb2YoKnVkKSwgcHVyZ2Vf d29yayk7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCAqX3ZkOworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisJTElTVF9IRUFEKGhlYWQpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnVkLT5sb2Nr LCBmbGFncyk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ1ZC0+ZGVzY190b19wdXJnZSwgJmhl YWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVkLT5sb2NrLCBmbGFncyk7CisKKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5X3NhZmUodmQsIF92ZCwgJmhlYWQsIG5vZGUpIHsKKwkJc3RydWN0IHVk bWFfZGVzYyAqZDsKKworCQlkID0gdG9fdWRtYV9kZXNjKCZ2ZC0+dHgpOworCisJCXVkbWFfZnJl ZV9od2Rlc2ModmQpOworCQlsaXN0X2RlbCgmdmQtPm5vZGUpOworCQlrZnJlZShkKTsKKwl9CisK KwkvKiBJZiBtb3JlIHRvIHB1cmdlLCBzY2hlZHVsZSB0aGUgd29yayBhZ2FpbiAqLworCWlmICgh bGlzdF9lbXB0eSgmdWQtPmRlc2NfdG9fcHVyZ2UpKQorCQlzY2hlZHVsZV93b3JrKCZ1ZC0+cHVy Z2Vfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfZGVzY19mcmVlKHN0cnVjdCB2aXJ0X2Rt YV9kZXNjICp2ZCkKK3sKKwlzdHJ1Y3QgdWRtYV9kZXYgKnVkID0gdG9fdWRtYV9kZXYodmQtPnR4 LmNoYW4tPmRldmljZSk7CisJc3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2NoYW4odmQt PnR4LmNoYW4pOworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQgPSB0b191ZG1hX2Rlc2MoJnZkLT50eCk7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICh1Yy0+dGVybWluYXRlZF9kZXNjID09IGQp CisJCXVjLT50ZXJtaW5hdGVkX2Rlc2MgPSBOVUxMOworCisJaWYgKHVjLT51c2VfZG1hX3Bvb2wp IHsKKwkJdWRtYV9mcmVlX2h3ZGVzYygmZC0+dmQpOworCQlrZnJlZShkKTsKKwkJcmV0dXJuOwor CX0KKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1ZC0+bG9jaywgZmxhZ3MpOworCWxpc3RfYWRkX3Rh aWwoJnZkLT5ub2RlLCAmdWQtPmRlc2NfdG9fcHVyZ2UpOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnVkLT5sb2NrLCBmbGFncyk7CisKKwlzY2hlZHVsZV93b3JrKCZ1ZC0+cHVyZ2Vfd29yayk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB1ZG1hX2lzX2NoYW5fcnVubmluZyhzdHJ1Y3QgdWRt YV9jaGFuICp1YykKK3sKKwl1MzIgdHJ0X2N0bCA9IDA7CisJdTMyIHJydF9jdGwgPSAwOworCisJ c3dpdGNoICh1Yy0+ZGlyKSB7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJcnJ0X2N0bCA9IHVk bWFfcmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9DVExfUkVHKTsKKwkJYnJl YWs7CisJY2FzZSBETUFfTUVNX1RPX0RFVjoKKwkJdHJ0X2N0bCA9IHVkbWFfdGNoYW5ydF9yZWFk KHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9DVExfUkVHKTsKKwkJYnJlYWs7CisJY2FzZSBETUFf TUVNX1RPX01FTToKKwkJdHJ0X2N0bCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwgVURN QV9UQ0hBTl9SVF9DVExfUkVHKTsKKwkJcnJ0X2N0bCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVjLT5y Y2hhbiwgVURNQV9SQ0hBTl9SVF9DVExfUkVHKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJl YWs7CisJfQorCisJaWYgKHRydF9jdGwgJiBVRE1BX0NIQU5fUlRfQ1RMX0VOIHx8IHJydF9jdGwg JiBVRE1BX0NIQU5fUlRfQ1RMX0VOKQorCQlyZXR1cm4gdHJ1ZTsKKworCXJldHVybiBmYWxzZTsK K30KKworc3RhdGljIHZvaWQgdWRtYV9zeW5jX2Zvcl9kZXZpY2Uoc3RydWN0IHVkbWFfY2hhbiAq dWMsIGludCBpZHgpCit7CisJc3RydWN0IHVkbWFfZGVzYyAqZCA9IHVjLT5kZXNjOworCisJaWYg KHVjLT5jeWNsaWMgJiYgdWMtPnBrdF9tb2RlKSB7CisJCWRtYV9zeW5jX3NpbmdsZV9mb3JfZGV2 aWNlKHVjLT51ZC0+ZGV2LAorCQkJCQkgICBkLT5od2Rlc2NbaWR4XS5jcHBpNV9kZXNjX3BhZGRy LAorCQkJCQkgICBkLT5od2Rlc2NbaWR4XS5jcHBpNV9kZXNjX3NpemUsCisJCQkJCSAgIERNQV9U T19ERVZJQ0UpOworCX0gZWxzZSB7CisJCWludCBpOworCisJCWZvciAoaSA9IDA7IGkgPCBkLT5o d2Rlc2NfY291bnQ7IGkrKykgeworCQkJaWYgKCFkLT5od2Rlc2NbaV0uY3BwaTVfZGVzY192YWRk cikKKwkJCQljb250aW51ZTsKKworCQkJZG1hX3N5bmNfc2luZ2xlX2Zvcl9kZXZpY2UodWMtPnVk LT5kZXYsCisJCQkJCQlkLT5od2Rlc2NbaV0uY3BwaTVfZGVzY19wYWRkciwKKwkJCQkJCWQtPmh3 ZGVzY1tpXS5jcHBpNV9kZXNjX3NpemUsCisJCQkJCQlETUFfVE9fREVWSUNFKTsKKwkJfQorCX0K K30KKworc3RhdGljIGludCB1ZG1hX3B1c2hfdG9fcmluZyhzdHJ1Y3QgdWRtYV9jaGFuICp1Yywg aW50IGlkeCkKK3sKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkID0gdWMtPmRlc2M7CisKKwlzdHJ1Y3Qg azNfbmF2X3JpbmcgKnJpbmcgPSBOVUxMOworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNo ICh1Yy0+ZGlyKSB7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJcmluZyA9IHVjLT5yY2hhbi0+ ZmRfcmluZzsKKwkJYnJlYWs7CisJY2FzZSBETUFfTUVNX1RPX0RFVjoKKwkJcmluZyA9IHVjLT50 Y2hhbi0+dF9yaW5nOworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fTUVNOgorCQlyaW5nID0g dWMtPnRjaGFuLT50X3Jpbmc7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwor CWlmIChyaW5nKSB7CisJCWRtYV9hZGRyX3QgZGVzY19hZGRyID0gdWRtYV9jdXJyX2NwcGk1X2Rl c2NfcGFkZHIoZCwgaWR4KTsKKworCQl3bWIoKTsgLyogRW5zdXJlIHRoYXQgd3JpdGVzIGFyZSBu b3QgbW92ZWQgb3ZlciB0aGlzIHBvaW50ICovCisJCXVkbWFfc3luY19mb3JfZGV2aWNlKHVjLCBp ZHgpOworCQlyZXQgPSBrM19uYXZfcmluZ2FjY19yaW5nX3B1c2gocmluZywgJmRlc2NfYWRkcik7 CisJCXVjLT5pbl9yaW5nX2NudCsrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bnQgdWRtYV9wb3BfZnJvbV9yaW5nKHN0cnVjdCB1ZG1hX2NoYW4gKnVjLCBkbWFfYWRkcl90ICph ZGRyKQoreworCXN0cnVjdCBrM19uYXZfcmluZyAqcmluZyA9IE5VTEw7CisJaW50IHJldCA9IC1F Tk9FTlQ7CisKKwlzd2l0Y2ggKHVjLT5kaXIpIHsKKwljYXNlIERNQV9ERVZfVE9fTUVNOgorCQly aW5nID0gdWMtPnJjaGFuLT5yX3Jpbmc7CisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19ERVY6 CisJCXJpbmcgPSB1Yy0+dGNoYW4tPnRjX3Jpbmc7CisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9U T19NRU06CisJCXJpbmcgPSB1Yy0+dGNoYW4tPnRjX3Jpbmc7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCWJyZWFrOworCX0KKworCWlmIChyaW5nICYmIGszX25hdl9yaW5nYWNjX3JpbmdfZ2V0X29j YyhyaW5nKSkgeworCQlzdHJ1Y3QgdWRtYV9kZXNjICpkID0gTlVMTDsKKworCQlyZXQgPSBrM19u YXZfcmluZ2FjY19yaW5nX3BvcChyaW5nLCBhZGRyKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiBy ZXQ7CisKKwkJLyogVGVhcmRvd24gY29tcGxldGlvbiAqLworCQlpZiAoKmFkZHIgJiAweDEpCisJ CQlyZXR1cm4gcmV0OworCisJCWQgPSB1ZG1hX3VkbWFfZGVzY19mcm9tX3BhZGRyKHVjLCAqYWRk cik7CisKKwkJaWYgKGQpCisJCQlkbWFfc3luY19zaW5nbGVfZm9yX2NwdSh1Yy0+dWQtPmRldiwg KmFkZHIsCisJCQkJCQlkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY19zaXplLAorCQkJCQkJRE1BX0ZS T01fREVWSUNFKTsKKwkJcm1iKCk7IC8qIEVuc3VyZSB0aGF0IHJlYWRzIGFyZSBub3QgbW92ZWQg YmVmb3JlIHRoaXMgcG9pbnQgKi8KKworCQlpZiAoIXJldCkKKwkJCXVjLT5pbl9yaW5nX2NudC0t OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfcmVzZXRfcmluZ3Mo c3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IGszX25hdl9yaW5nICpyaW5nMSA9IE5V TEw7CisJc3RydWN0IGszX25hdl9yaW5nICpyaW5nMiA9IE5VTEw7CisKKwlzd2l0Y2ggKHVjLT5k aXIpIHsKKwljYXNlIERNQV9ERVZfVE9fTUVNOgorCQlpZiAodWMtPnJjaGFuKSB7CisJCQlyaW5n MSA9IHVjLT5yY2hhbi0+ZmRfcmluZzsKKwkJCXJpbmcyID0gdWMtPnJjaGFuLT5yX3Jpbmc7CisJ CX0KKwkJYnJlYWs7CisJY2FzZSBETUFfTUVNX1RPX0RFVjoKKwkJaWYgKHVjLT50Y2hhbikgewor CQkJcmluZzEgPSB1Yy0+dGNoYW4tPnRfcmluZzsKKwkJCXJpbmcyID0gdWMtPnRjaGFuLT50Y19y aW5nOworCQl9CisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19NRU06CisJCWlmICh1Yy0+dGNo YW4pIHsKKwkJCXJpbmcxID0gdWMtPnRjaGFuLT50X3Jpbmc7CisJCQlyaW5nMiA9IHVjLT50Y2hh bi0+dGNfcmluZzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlp ZiAocmluZzEpCisJCWszX25hdl9yaW5nYWNjX3JpbmdfcmVzZXRfZG1hKHJpbmcxLCAwKTsKKwlp ZiAocmluZzIpCisJCWszX25hdl9yaW5nYWNjX3JpbmdfcmVzZXQocmluZzIpOworCisJLyogbWFr ZSBzdXJlIHdlIGFyZSBub3QgbGVha2luZyBtZW1vcnkgYnkgc3RhbGxlZCBkZXNjcmlwdG9yICov CisJaWYgKHVjLT50ZXJtaW5hdGVkX2Rlc2MpIHsKKwkJdWRtYV9kZXNjX2ZyZWUoJnVjLT50ZXJt aW5hdGVkX2Rlc2MtPnZkKTsKKwkJdWMtPnRlcm1pbmF0ZWRfZGVzYyA9IE5VTEw7CisJfQorCisJ dWMtPmluX3JpbmdfY250ID0gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHVkbWFfcmVzZXRf Y291bnRlcnMoc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJdTMyIHZhbDsKKworCWlmICh1Yy0+ dGNoYW4pIHsKKwkJdmFsID0gdWRtYV90Y2hhbnJ0X3JlYWQodWMtPnRjaGFuLCBVRE1BX1RDSEFO X1JUX0JDTlRfUkVHKTsKKwkJdWRtYV90Y2hhbnJ0X3dyaXRlKHVjLT50Y2hhbiwgVURNQV9UQ0hB Tl9SVF9CQ05UX1JFRywgdmFsKTsKKworCQl2YWwgPSB1ZG1hX3RjaGFucnRfcmVhZCh1Yy0+dGNo YW4sIFVETUFfVENIQU5fUlRfU0JDTlRfUkVHKTsKKwkJdWRtYV90Y2hhbnJ0X3dyaXRlKHVjLT50 Y2hhbiwgVURNQV9UQ0hBTl9SVF9TQkNOVF9SRUcsIHZhbCk7CisKKwkJdmFsID0gdWRtYV90Y2hh bnJ0X3JlYWQodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX1BDTlRfUkVHKTsKKwkJdWRtYV90Y2hh bnJ0X3dyaXRlKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9QQ05UX1JFRywgdmFsKTsKKworCQl2 YWwgPSB1ZG1hX3RjaGFucnRfcmVhZCh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfUEVFUl9CQ05U X1JFRyk7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfUEVF Ul9CQ05UX1JFRywgdmFsKTsKKwl9CisKKwlpZiAodWMtPnJjaGFuKSB7CisJCXZhbCA9IHVkbWFf cmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9CQ05UX1JFRyk7CisJCXVkbWFf cmNoYW5ydF93cml0ZSh1Yy0+cmNoYW4sIFVETUFfUkNIQU5fUlRfQkNOVF9SRUcsIHZhbCk7CisK KwkJdmFsID0gdWRtYV9yY2hhbnJ0X3JlYWQodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX1NCQ05U X1JFRyk7CisJCXVkbWFfcmNoYW5ydF93cml0ZSh1Yy0+cmNoYW4sIFVETUFfUkNIQU5fUlRfU0JD TlRfUkVHLCB2YWwpOworCisJCXZhbCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwgVURN QV9SQ0hBTl9SVF9QQ05UX1JFRyk7CisJCXVkbWFfcmNoYW5ydF93cml0ZSh1Yy0+cmNoYW4sIFVE TUFfUkNIQU5fUlRfUENOVF9SRUcsIHZhbCk7CisKKwkJdmFsID0gdWRtYV9yY2hhbnJ0X3JlYWQo dWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX1BFRVJfQkNOVF9SRUcpOworCQl1ZG1hX3JjaGFucnRf d3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX1BFRVJfQkNOVF9SRUcsIHZhbCk7CisJfQor CisJdWMtPmJjbnQgPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCB1ZG1hX3Jlc2V0X2NoYW4o c3RydWN0IHVkbWFfY2hhbiAqdWMsIGJvb2wgaGFyZCkKK3sKKwlzd2l0Y2ggKHVjLT5kaXIpIHsK KwljYXNlIERNQV9ERVZfVE9fTUVNOgorCQl1ZG1hX3JjaGFucnRfd3JpdGUodWMtPnJjaGFuLCBV RE1BX1JDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLCAwKTsKKwkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVj LT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9DVExfUkVHLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBETUFf TUVNX1RPX0RFVjoKKwkJdWRtYV90Y2hhbnJ0X3dyaXRlKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9S VF9DVExfUkVHLCAwKTsKKwkJdWRtYV90Y2hhbnJ0X3dyaXRlKHVjLT50Y2hhbiwgVURNQV9UQ0hB Tl9SVF9QRUVSX1JUX0VOX1JFRywgMCk7CisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19NRU06 CisJCXVkbWFfcmNoYW5ydF93cml0ZSh1Yy0+cmNoYW4sIFVETUFfUkNIQU5fUlRfQ1RMX1JFRywg MCk7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JF RywgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8q IFJlc2V0IGFsbCBjb3VudGVycyAqLworCXVkbWFfcmVzZXRfY291bnRlcnModWMpOworCisJLyog SGFyZCByZXNldDogcmUtaW5pdGlhbGl6ZSB0aGUgY2hhbm5lbCB0byByZXNldCAqLworCWlmICho YXJkKSB7CisJCWludCByZXQ7CisKKwkJdWMtPnVkLT5kZGV2LmRldmljZV9mcmVlX2NoYW5fcmVz b3VyY2VzKCZ1Yy0+dmMuY2hhbik7CisJCXJldCA9IHVjLT51ZC0+ZGRldi5kZXZpY2VfYWxsb2Nf Y2hhbl9yZXNvdXJjZXMoJnVjLT52Yy5jaGFuKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7 CisJfQorCXVjLT5zdGF0ZSA9IFVETUFfQ0hBTl9JU19JRExFOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCB1ZG1hX3N0YXJ0X2Rlc2Moc3RydWN0IHVkbWFfY2hhbiAqdWMp Cit7CisJaWYgKHVjLT5jeWNsaWMgJiYgdWMtPnBrdF9tb2RlKSB7CisJCWludCBpOworCisJCS8q IFB1c2ggYWxsIGRlc2NyaXB0b3JzIHRvIHJpbmcgZm9yIGN5Y2xpYyBwYWNrZXQgbW9kZSAqLwor CQlmb3IgKGkgPSAwOyBpIDwgdWMtPmRlc2MtPnNnbGVuOyBpKyspCisJCQl1ZG1hX3B1c2hfdG9f cmluZyh1YywgaSk7CisJfSBlbHNlIHsKKwkJdWRtYV9wdXNoX3RvX3JpbmcodWMsIDApOworCX0K K30KKworc3RhdGljIGlubGluZSBib29sIHVkbWFfY2hhbl9uZWVkc19yZWNvbmZpZ3VyYXRpb24o c3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJLyogT25seSBQRE1BcyBoYXZlIHN0YXRpY1RSICov CisJaWYgKCF1Yy0+c3RhdGljX3RyX3R5cGUpCisJCXJldHVybiBmYWxzZTsKKworCS8qIFJYIGNo YW5uZWxzIGFsd2F5cyBuZWVkIHRvIGJlIHJlc2V0LCByZWNvbmZpZ3VyZWQgKi8KKwlpZiAodWMt PmRpciA9PSBETUFfREVWX1RPX01FTSkKKwkJcmV0dXJuIHRydWU7CisKKwkvKiBDaGVjayBpZiB0 aGUgc3RhdGljVFIgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZCBmb3IgVFggKi8KKwlpZiAobWVt Y21wKCZ1Yy0+c3RhdGljX3RyLCAmdWMtPmRlc2MtPnN0YXRpY190ciwgc2l6ZW9mKHVjLT5zdGF0 aWNfdHIpKSkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBp bnQgdWRtYV9zdGFydChzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlzdHJ1Y3QgdmlydF9kbWFf ZGVzYyAqdmQgPSB2Y2hhbl9uZXh0X2Rlc2MoJnVjLT52Yyk7CisKKwlpZiAoIXZkKSB7CisJCXVj LT5kZXNjID0gTlVMTDsKKwkJcmV0dXJuIC1FTk9FTlQ7CisJfQorCisJbGlzdF9kZWwoJnZkLT5u b2RlKTsKKworCXVjLT5kZXNjID0gdG9fdWRtYV9kZXNjKCZ2ZC0+dHgpOworCisJLyogQ2hhbm5l bCBpcyBhbHJlYWR5IHJ1bm5pbmcgYW5kIGRvZXMgbm90IG5lZWQgcmVjb25maWd1cmF0aW9uICov CisJaWYgKHVkbWFfaXNfY2hhbl9ydW5uaW5nKHVjKSAmJiAhdWRtYV9jaGFuX25lZWRzX3JlY29u ZmlndXJhdGlvbih1YykpIHsKKwkJdWRtYV9zdGFydF9kZXNjKHVjKTsKKwkJZ290byBvdXQ7CisJ fQorCisJLyogTWFrZSBzdXJlIHRoYXQgd2UgY2xlYXIgdGhlIHRlYXJkb3duIGJpdCwgaWYgaXQg aXMgc2V0ICovCisJdWRtYV9yZXNldF9jaGFuKHVjLCBmYWxzZSk7CisKKwkvKiBQdXNoIGRlc2Ny aXB0b3JzIGJlZm9yZSB3ZSBzdGFydCB0aGUgY2hhbm5lbCAqLworCXVkbWFfc3RhcnRfZGVzYyh1 Yyk7CisKKwlzd2l0Y2ggKHVjLT5kZXNjLT5kaXIpIHsKKwljYXNlIERNQV9ERVZfVE9fTUVNOgor CQkvKiBDb25maWcgcmVtb3RlIFRSICovCisJCWlmICh1Yy0+c3RhdGljX3RyX3R5cGUpIHsKKwkJ CXVkbWFfcmNoYW5ydF93cml0ZSh1Yy0+cmNoYW4sCisJCQkJVURNQV9SQ0hBTl9SVF9QRUVSX1NU QVRJQ19UUl9YWV9SRUcsCisJCQkJUERNQV9TVEFUSUNfVFJfWSh1Yy0+ZGVzYy0+c3RhdGljX3Ry LmVsY250KSB8CisJCQkJUERNQV9TVEFUSUNfVFJfWCh1Yy0+ZGVzYy0+c3RhdGljX3RyLmVsc2l6 ZSkpOworCQkJdWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwKKwkJCQlVRE1BX1JDSEFOX1JU X1BFRVJfU1RBVElDX1RSX1pfUkVHLAorCQkJCVBETUFfU1RBVElDX1RSX1oodWMtPmRlc2MtPnN0 YXRpY190ci5ic3RjbnQpKTsKKworCQkJLyogc2F2ZSB0aGUgY3VycmVudCBzdGF0aWNUUiBjb25m aWd1cmF0aW9uICovCisJCQltZW1jcHkoJnVjLT5zdGF0aWNfdHIsICZ1Yy0+ZGVzYy0+c3RhdGlj X3RyLAorCQkJICAgICAgIHNpemVvZih1Yy0+c3RhdGljX3RyKSk7CisJCX0KKworCQl1ZG1hX3Jj aGFucnRfd3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX0NUTF9SRUcsCisJCQkJICAgVURN QV9DSEFOX1JUX0NUTF9FTik7CisKKwkJLyogRW5hYmxlIHJlbW90ZSAqLworCQl1ZG1hX3JjaGFu cnRfd3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJCSAg IFVETUFfUEVFUl9SVF9FTl9FTkFCTEUpOworCisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19E RVY6CisJCS8qIENvbmZpZyByZW1vdGUgVFIgKi8KKwkJaWYgKHVjLT5zdGF0aWNfdHJfdHlwZSkg eworCQkJdWRtYV90Y2hhbnJ0X3dyaXRlKHVjLT50Y2hhbiwKKwkJCQlVRE1BX1RDSEFOX1JUX1BF RVJfU1RBVElDX1RSX1hZX1JFRywKKwkJCQlQRE1BX1NUQVRJQ19UUl9ZKHVjLT5kZXNjLT5zdGF0 aWNfdHIuZWxjbnQpIHwKKwkJCQlQRE1BX1NUQVRJQ19UUl9YKHVjLT5kZXNjLT5zdGF0aWNfdHIu ZWxzaXplKSk7CisKKwkJCS8qIHNhdmUgdGhlIGN1cnJlbnQgc3RhdGljVFIgY29uZmlndXJhdGlv biAqLworCQkJbWVtY3B5KCZ1Yy0+c3RhdGljX3RyLCAmdWMtPmRlc2MtPnN0YXRpY190ciwKKwkJ CSAgICAgICBzaXplb2YodWMtPnN0YXRpY190cikpOworCQl9CisKKwkJLyogRW5hYmxlIHJlbW90 ZSAqLworCQl1ZG1hX3RjaGFucnRfd3JpdGUodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX1BFRVJf UlRfRU5fUkVHLAorCQkJCSAgIFVETUFfUEVFUl9SVF9FTl9FTkFCTEUpOworCisJCXVkbWFfdGNo YW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JFRywKKwkJCQkgICBVRE1B X0NIQU5fUlRfQ1RMX0VOKTsKKworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fTUVNOgorCQl1 ZG1hX3JjaGFucnRfd3JpdGUodWMtPnJjaGFuLCBVRE1BX1JDSEFOX1JUX0NUTF9SRUcsCisJCQkJ ICAgVURNQV9DSEFOX1JUX0NUTF9FTik7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4s IFVETUFfVENIQU5fUlRfQ1RMX1JFRywKKwkJCQkgICBVRE1BX0NIQU5fUlRfQ1RMX0VOKTsKKwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl1Yy0+c3RhdGUg PSBVRE1BX0NIQU5fSVNfQUNUSVZFOworb3V0OgorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bmxpbmUgaW50IHVkbWFfc3RvcChzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwllbnVtIHVkbWFf Y2hhbl9zdGF0ZSBvbGRfc3RhdGUgPSB1Yy0+c3RhdGU7CisKKwl1Yy0+c3RhdGUgPSBVRE1BX0NI QU5fSVNfVEVSTUlOQVRJTkc7CisJcmVpbml0X2NvbXBsZXRpb24oJnVjLT50ZWFyZG93bl9jb21w bGV0ZWQpOworCisJc3dpdGNoICh1Yy0+ZGlyKSB7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJ dWRtYV9yY2hhbnJ0X3dyaXRlKHVjLT5yY2hhbiwgVURNQV9SQ0hBTl9SVF9QRUVSX1JUX0VOX1JF RywKKwkJCQkgICBVRE1BX1BFRVJfUlRfRU5fRU5BQkxFIHwKKwkJCQkgICBVRE1BX1BFRVJfUlRf RU5fVEVBUkRPV04pOworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fREVWOgorCQl1ZG1hX3Rj aGFucnRfd3JpdGUodWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJ CSAgIFVETUFfUEVFUl9SVF9FTl9FTkFCTEUgfAorCQkJCSAgIFVETUFfUEVFUl9SVF9FTl9GTFVT SCk7CisJCXVkbWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JF RywKKwkJCQkgICBVRE1BX0NIQU5fUlRfQ1RMX0VOIHwKKwkJCQkgICBVRE1BX0NIQU5fUlRfQ1RM X1RET1dOKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfTUVNX1RPX01FTToKKwkJdWRtYV90Y2hhbnJ0 X3dyaXRlKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9DVExfUkVHLAorCQkJCSAgIFVETUFfQ0hB Tl9SVF9DVExfRU4gfAorCQkJCSAgIFVETUFfQ0hBTl9SVF9DVExfVERPV04pOworCQlicmVhazsK KwlkZWZhdWx0OgorCQl1Yy0+c3RhdGUgPSBvbGRfc3RhdGU7CisJCWNvbXBsZXRlX2FsbCgmdWMt PnRlYXJkb3duX2NvbXBsZXRlZCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCB1ZG1hX2N5Y2xpY19wYWNrZXRfZWxhcHNlZChzdHJ1Y3QgdWRt YV9jaGFuICp1YykKK3sKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkID0gdWMtPmRlc2M7CisJc3RydWN0 IGtuYXZfdWRtYXBfaG9zdF9kZXNjX3QgKmhfZGVzYzsKKworCWhfZGVzYyA9IGQtPmh3ZGVzY1tk LT5kZXNjX2lkeF0uY3BwaTVfZGVzY192YWRkcjsKKwlrbmF2X3VkbWFwX2hkZXNjX3Jlc2V0X3Rv X29yaWdpbmFsKGhfZGVzYyk7CisJdWRtYV9wdXNoX3RvX3JpbmcodWMsIGQtPmRlc2NfaWR4KTsK KwlkLT5kZXNjX2lkeCA9IChkLT5kZXNjX2lkeCArIDEpICUgZC0+c2dsZW47Cit9CisKK3N0YXRp YyBpbmxpbmUgdm9pZCB1ZG1hX2ZldGNoX2VwaWIoc3RydWN0IHVkbWFfY2hhbiAqdWMsIHN0cnVj dCB1ZG1hX2Rlc2MgKmQpCit7CisJc3RydWN0IGtuYXZfdWRtYXBfaG9zdF9kZXNjX3QgKmhfZGVz YyA9IGQtPmh3ZGVzY1swXS5jcHBpNV9kZXNjX3ZhZGRyOworCisJbWVtY3B5KGQtPm1ldGFkYXRh LCBoX2Rlc2MtPmVwaWIsIGQtPm1ldGFkYXRhX3NpemUpOworfQorCitzdGF0aWMgaW5saW5lIGJv b2wgdWRtYV9pc19kZXNjX3JlYWxseV9kb25lKHN0cnVjdCB1ZG1hX2NoYW4gKnVjLAorCQkJCQkg ICAgc3RydWN0IHVkbWFfZGVzYyAqZCkKK3sKKwl1MzIgcGVlcl9iY250LCBiY250OworCisJLyog T25seSBUWCB0b3dhcmRzIFBETUEgaXMgYWZmZWN0ZWQgKi8KKwlpZiAoIXVjLT5zdGF0aWNfdHJf dHlwZSB8fCB1Yy0+ZGlyICE9IERNQV9NRU1fVE9fREVWKQorCQlyZXR1cm4gdHJ1ZTsKKworCXBl ZXJfYmNudCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9QRUVS X0JDTlRfUkVHKTsKKwliY250ID0gdWRtYV90Y2hhbnJ0X3JlYWQodWMtPnRjaGFuLCBVRE1BX1RD SEFOX1JUX0JDTlRfUkVHKTsKKworCWlmIChwZWVyX2JjbnQgPCBiY250KQorCQlyZXR1cm4gZmFs c2U7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgdWRtYV9mbHVzaF90eChzdHJ1 Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlpZiAodWMtPmRpciAhPSBETUFfTUVNX1RPX0RFVikKKwkJ cmV0dXJuOworCisJdWMtPnN0YXRlID0gVURNQV9DSEFOX0lTX0FDVElWRV9GTFVTSDsKKworCXVk bWFfdGNoYW5ydF93cml0ZSh1Yy0+dGNoYW4sIFVETUFfVENIQU5fUlRfQ1RMX1JFRywKKwkJCSAg IFVETUFfQ0hBTl9SVF9DVExfRU4gfAorCQkJICAgVURNQV9DSEFOX1JUX0NUTF9URE9XTik7Cit9 CisKK3N0YXRpYyB2b2lkIHVkbWFfcmluZ19jYWxsYmFjayhzdHJ1Y3QgdWRtYV9jaGFuICp1Yywg ZG1hX2FkZHJfdCBwYWRkcikKK3sKKwlzdHJ1Y3QgdWRtYV9kZXNjICpkOworCXVuc2lnbmVkIGxv bmcgZmxhZ3M7CisKKwlpZiAoIXBhZGRyKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2 ZSgmdWMtPnZjLmxvY2ssIGZsYWdzKTsKKworCS8qIFRlYXJkb3duIGNvbXBsZXRpb24gbWVzc2Fn ZSAqLworCWlmIChwYWRkciAmIDB4MSkgeworCQkvKiBDb21wZW5zYXRlIG91ciBpbnRlcm5hbCBw b3AvcHVzaCBjb3VudGVyICovCisJCXVjLT5pbl9yaW5nX2NudCsrOworCisJCWNvbXBsZXRlX2Fs bCgmdWMtPnRlYXJkb3duX2NvbXBsZXRlZCk7CisKKwkJaWYgKHVjLT50ZXJtaW5hdGVkX2Rlc2Mp IHsKKwkJCXVkbWFfZGVzY19mcmVlKCZ1Yy0+dGVybWluYXRlZF9kZXNjLT52ZCk7CisJCQl1Yy0+ dGVybWluYXRlZF9kZXNjID0gTlVMTDsKKwkJfQorCisJCWlmICghdWMtPmRlc2MpCisJCQl1ZG1h X3N0YXJ0KHVjKTsKKworCQlpZiAodWMtPnN0YXRlICE9IFVETUFfQ0hBTl9JU19BQ1RJVkVfRkxV U0gpCisJCQlnb3RvIG91dDsKKwkJZWxzZSBpZiAodWMtPmRlc2MpCisJCQlwYWRkciA9IHVkbWFf Y3Vycl9jcHBpNV9kZXNjX3BhZGRyKHVjLT5kZXNjLAorCQkJCQkJCSAgIHVjLT5kZXNjLT5kZXNj X2lkeCk7CisJfQorCisJZCA9IHVkbWFfdWRtYV9kZXNjX2Zyb21fcGFkZHIodWMsIHBhZGRyKTsK KworCWlmIChkKSB7CisJCWRtYV9hZGRyX3QgZGVzY19wYWRkciA9IHVkbWFfY3Vycl9jcHBpNV9k ZXNjX3BhZGRyKGQsCisJCQkJCQkJCSAgIGQtPmRlc2NfaWR4KTsKKwkJaWYgKGRlc2NfcGFkZHIg IT0gcGFkZHIpIHsKKwkJCWRldl9lcnIodWMtPnVkLT5kZXYsICJub3QgbWF0Y2hpbmcgZGVzY3Jp cHRvcnMhXG4iKTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJaWYgKHVjLT5jeWNsaWMpIHsKKwkJ CS8qIHB1c2ggdGhlIGRlc2NyaXB0b3IgYmFjayB0byB0aGUgcmluZyAqLworCQkJaWYgKGQgPT0g dWMtPmRlc2MpIHsKKwkJCQl1ZG1hX2N5Y2xpY19wYWNrZXRfZWxhcHNlZCh1Yyk7CisJCQkJdmNo YW5fY3ljbGljX2NhbGxiYWNrKCZkLT52ZCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlib29sIGRl c2NfZG9uZSA9IHRydWU7CisKKwkJCWlmIChkID09IHVjLT5kZXNjKSB7CisJCQkJZGVzY19kb25l ID0gdWRtYV9pc19kZXNjX3JlYWxseV9kb25lKHVjLCBkKTsKKworCQkJCWlmIChkZXNjX2RvbmUp IHsKKwkJCQkJdWMtPmJjbnQgKz0gZC0+cmVzaWR1ZTsKKwkJCQkJdWRtYV9zdGFydCh1Yyk7CisJ CQkJfSBlbHNlIHsKKwkJCQkJdWRtYV9mbHVzaF90eCh1Yyk7CisJCQkJfQorCQkJfSBlbHNlIGlm IChkID09IHVjLT50ZXJtaW5hdGVkX2Rlc2MpIHsKKwkJCQl1Yy0+dGVybWluYXRlZF9kZXNjID0g TlVMTDsKKwkJCX0KKworCQkJaWYgKGRlc2NfZG9uZSkKKwkJCQl2Y2hhbl9jb29raWVfY29tcGxl dGUoJmQtPnZkKTsKKwkJfQorCX0KK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1Yy0+ dmMubG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCB1ZG1hX3RyX2V2ZW50X2NhbGxiYWNr KHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQoreworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJdW5zaWdu ZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ1Yy0+dmMubG9jaywgZmxhZ3Mp OworCWQgPSB1Yy0+ZGVzYzsKKwlpZiAoZCkgeworCQlkLT50cl9pZHggPSAoZC0+dHJfaWR4ICsg MSkgJSBkLT5zZ2xlbjsKKworCQlpZiAodWMtPmN5Y2xpYykgeworCQkJdmNoYW5fY3ljbGljX2Nh bGxiYWNrKCZkLT52ZCk7CisJCX0gZWxzZSB7CisJCQkvKiBUT0RPOiBmaWd1cmUgb3V0IHRoZSBy ZWFsIGFtb3VudCBvZiBkYXRhICovCisJCQl1Yy0+YmNudCArPSBkLT5yZXNpZHVlOworCQkJdWRt YV9zdGFydCh1Yyk7CisJCQl2Y2hhbl9jb29raWVfY29tcGxldGUoJmQtPnZkKTsKKwkJfQorCX0K KworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjLT52Yy5sb2NrLCBmbGFncyk7Cit9CisKK3N0 YXRpYyBpcnFyZXR1cm5fdCB1ZG1hX3JpbmdfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0 YSkKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IGRhdGE7CisJZG1hX2FkZHJfdCBwYWRkciA9 IDA7CisKKwlpZiAoIXVkbWFfcG9wX2Zyb21fcmluZyh1YywgJnBhZGRyKSkKKwkJdWRtYV9yaW5n X2NhbGxiYWNrKHVjLCBwYWRkcik7CisKKwlyZXR1cm4gSVJRX0hBTkRMRUQ7Cit9CisKK3N0YXRp YyBpcnFyZXR1cm5fdCB1ZG1hX3VkbWFfaXJxX2hhbmRsZXIoaW50IGlycSwgdm9pZCAqZGF0YSkK K3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IGRhdGE7CisJc3RydWN0IHVkbWFfdGlzY2lfcm0g KnRpc2NpX3JtID0gJnVjLT51ZC0+dGlzY2lfcm07CisKKwl0aV9zY2lfaW50YV9hY2tfZXZlbnQo dWMtPnVkLT5pcnFfZG9tYWluLCB0aXNjaV9ybS0+dGlzY2lfZGV2X2lkLAorCQkJICAgICAgdWMt PmlycV91ZG1hX2lkeCwgdWMtPmlycV9udW1fdWRtYSk7CisKKwl1ZG1hX3RyX2V2ZW50X2NhbGxi YWNrKHVjKTsKKworCXJldHVybiBJUlFfSEFORExFRDsKK30KKworLyoqCisgKiBfX3VkbWFfcmVz ZXJ2ZV9yZmxvd19yYW5nZSAtIHJlc2VydmUgcmFuZ2Ugb2YgZmxvdyBpZHMKKyAqIEB1ZDogVURN QSBkZXZpY2UKKyAqIEBmcm9tOiBTdGFydCB0aGUgc2VhcmNoIGZyb20gdGhpcyBmbG93IGlkIG51 bWJlcgorICogQGNudDogTnVtYmVyIG9mIGNvbnNlY3V0aXZlIGZsb3cgaWRzIHRvIGFsbG9jYXRl CisgKgorICogUmVzZXJ2ZSByYW5nZSBvZiBmbG93IGlkcyBmb3IgZnV0dXJlIHVzZSwgdGhvc2Ug Zmxvd3MgY2FuIGJlIGFsbG9jYXRlZAorICogb25seSB1c2luZyBleHBsaWNpdCBmbG93IGlkIG51 bWJlci4gaWYgQGZyb20gaXMgc2V0IHRvIC0xIGl0IHdpbGwgdHJ5IHRvIGZpbmQKKyAqIGZpcnN0 IGZyZWUgcmFuZ2UuIGlmIEBmcm9tIGlzIHBvc2l0aXZlIHZhbHVlIGl0IHdpbGwgZm9yY2UgYWxs b2NhdGlvbiBvbmx5CisgKiBvZiB0aGUgc3BlY2lmaWVkIHJhbmdlIG9mIGZsb3dzLgorICoKKyAq IFJldHVybnMgLUVOT01FTSBpZiBjYW4ndCBmaW5kIGZyZWUgcmFuZ2UuCisgKiAtRUVYSVNUIGlm IHJlcXVlc3RlZCByYW5nZSBpcyBidXN5LgorICogLUVJTlZBTCBpZiB3cm9uZyBpbnB1dCB2YWx1 ZXMgcGFzc2VkLgorICogUmV0dXJucyBmbG93IGlkIG9uIHN1Y2Nlc3MuCisgKi8KK3N0YXRpYyBp bnQgX191ZG1hX3Jlc2VydmVfcmZsb3dfcmFuZ2Uoc3RydWN0IHVkbWFfZGV2ICp1ZCwgaW50IGZy b20sIGludCBjbnQpCit7CisJaW50IHN0YXJ0LCB0bXBfZnJvbTsKKwlERUNMQVJFX0JJVE1BUCh0 bXAsIEszX1VETUFfTUFYX1JGTE9XUyk7CisKKwl0bXBfZnJvbSA9IGZyb207CisJaWYgKHRtcF9m cm9tIDwgMCkKKwkJdG1wX2Zyb20gPSB1ZC0+cmNoYW5fY250OworCS8qIGRlZmF1bHQgZmxvd3Mg Y2FuJ3QgYmUgcmVzZXJ2ZWQgYW5kIGFjY2Vzc2libGUgb25seSBieSBpZCAqLworCWlmICh0bXBf ZnJvbSA8IHVkLT5yY2hhbl9jbnQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHRtcF9mcm9t ICsgY250ID4gdWQtPnJmbG93X2NudCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwliaXRtYXBfb3Io dG1wLCB1ZC0+cmZsb3dfbWFwLCB1ZC0+cmZsb3dfbWFwX3Jlc2VydmVkLAorCQkgIHVkLT5yZmxv d19jbnQpOworCisJc3RhcnQgPSBiaXRtYXBfZmluZF9uZXh0X3plcm9fYXJlYSh0bXAsCisJCQkJ CSAgIHVkLT5yZmxvd19jbnQsCisJCQkJCSAgIHRtcF9mcm9tLCBjbnQsIDApOworCWlmIChzdGFy dCA+PSB1ZC0+cmZsb3dfY250KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChmcm9tID49IDAg JiYgc3RhcnQgIT0gZnJvbSkKKwkJcmV0dXJuIC1FRVhJU1Q7CisKKwliaXRtYXBfc2V0KHVkLT5y Zmxvd19tYXBfcmVzZXJ2ZWQsIHN0YXJ0LCBjbnQpOworCXJldHVybiBzdGFydDsKK30KKworc3Rh dGljIGludCBfX3VkbWFfZnJlZV9yZmxvd19yYW5nZShzdHJ1Y3QgdWRtYV9kZXYgKnVkLCBpbnQg ZnJvbSwgaW50IGNudCkKK3sKKwlpZiAoZnJvbSA8IHVkLT5yY2hhbl9jbnQpCisJCXJldHVybiAt RUlOVkFMOworCWlmIChmcm9tICsgY250ID4gdWQtPnJmbG93X2NudCkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwliaXRtYXBfY2xlYXIodWQtPnJmbG93X21hcF9yZXNlcnZlZCwgZnJvbSwgY250KTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1ZG1hX3JmbG93ICpfX3VkbWFfcmVzZXJ2 ZV9yZmxvdyhzdHJ1Y3QgdWRtYV9kZXYgKnVkLAorCQkJCQkgICAgICAgZW51bSB1ZG1hX3RwX2xl dmVsIHRwbCwgaW50IGlkKQoreworCURFQ0xBUkVfQklUTUFQKHRtcCwgSzNfVURNQV9NQVhfUkZM T1dTKTsKKworCWlmIChpZCA+PSAwKSB7CisJCWlmICh0ZXN0X2JpdChpZCwgdWQtPnJmbG93X21h cCkpIHsKKwkJCWRldl9lcnIodWQtPmRldiwgInJmbG93JWQgaXMgaW4gdXNlXG4iLCBpZCk7CisJ CQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKKwkJfQorCX0gZWxzZSB7CisJCWJpdG1hcF9vcih0 bXAsIHVkLT5yZmxvd19tYXAsIHVkLT5yZmxvd19tYXBfcmVzZXJ2ZWQsCisJCQkgIHVkLT5yZmxv d19jbnQpOworCisJCWlkID0gZmluZF9uZXh0X3plcm9fYml0KHRtcCwgdWQtPnJmbG93X2NudCwg dWQtPnJjaGFuX2NudCk7CisJCWlmIChpZCA+PSB1ZC0+cmZsb3dfY250KQorCQkJcmV0dXJuIEVS Ul9QVFIoLUVOT0VOVCk7CisJfQorCisJc2V0X2JpdChpZCwgdWQtPnJmbG93X21hcCk7CisJcmV0 dXJuICZ1ZC0+cmZsb3dzW2lkXTsKK30KKworI2RlZmluZSBVRE1BX1JFU0VSVkVfUkVTT1VSQ0Uo cmVzKQkJCQkJXAorc3RhdGljIHN0cnVjdCB1ZG1hXyMjcmVzICpfX3VkbWFfcmVzZXJ2ZV8jI3Jl cyhzdHJ1Y3QgdWRtYV9kZXYgKnVkLAlcCisJCQkJCSAgICAgICBlbnVtIHVkbWFfdHBfbGV2ZWwg dHBsLAlcCisJCQkJCSAgICAgICBpbnQgaWQpCQkJXAorewkJCQkJCQkJCVwKKwlpZiAoaWQgPj0g MCkgewkJCQkJCQlcCisJCWlmICh0ZXN0X2JpdChpZCwgdWQtPnJlcyMjX21hcCkpIHsJCQlcCisJ CQlkZXZfZXJyKHVkLT5kZXYsICJyZXMjIyVkIGlzIGluIHVzZVxuIiwgaWQpOwlcCisJCQlyZXR1 cm4gRVJSX1BUUigtRU5PRU5UKTsJCQlcCisJCX0JCQkJCQkJXAorCX0gZWxzZSB7CQkJCQkJCVwK KwkJaW50IHN0YXJ0OwkJCQkJCVwKKwkJCQkJCQkJCVwKKwkJaWYgKHRwbCA+PSB1ZC0+bWF0Y2hf ZGF0YS0+dHBsX2xldmVscykJCQlcCisJCQl0cGwgPSB1ZC0+bWF0Y2hfZGF0YS0+dHBsX2xldmVs cyAtIDE7CQlcCisJCQkJCQkJCQlcCisJCXN0YXJ0ID0gdWQtPm1hdGNoX2RhdGEtPmxldmVsX3N0 YXJ0X2lkeFt0cGxdOwkJXAorCQkJCQkJCQkJXAorCQlpZCA9IGZpbmRfbmV4dF96ZXJvX2JpdCh1 ZC0+cmVzIyNfbWFwLCB1ZC0+cmVzIyNfY250LAlcCisJCQkJCXN0YXJ0KTsJCQkJXAorCQlpZiAo aWQgPT0gdWQtPnJlcyMjX2NudCkgewkJCQlcCisJCQlyZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsJ CQlcCisJCX0JCQkJCQkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzZXRfYml0KGlkLCB1 ZC0+cmVzIyNfbWFwKTsJCQkJCVwKKwlyZXR1cm4gJnVkLT5yZXMjI3NbaWRdOwkJCQkJCVwKK30K KworVURNQV9SRVNFUlZFX1JFU09VUkNFKHRjaGFuKTsKK1VETUFfUkVTRVJWRV9SRVNPVVJDRShy Y2hhbik7CisKK3N0YXRpYyBpbnQgdWRtYV9nZXRfdGNoYW4oc3RydWN0IHVkbWFfY2hhbiAqdWMp Cit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51ZDsKKworCWlmICh1Yy0+dGNoYW4pIHsK KwkJZGV2X2RiZyh1ZC0+ZGV2LCAiY2hhbiVkOiBhbHJlYWR5IGhhdmUgdGNoYW4lZCBhbGxvY2F0 ZWRcbiIsCisJCQl1Yy0+aWQsIHVjLT50Y2hhbi0+aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwl1 Yy0+dGNoYW4gPSBfX3VkbWFfcmVzZXJ2ZV90Y2hhbih1ZCwgdWMtPmNoYW5uZWxfdHBsLCAtMSk7 CisJaWYgKElTX0VSUih1Yy0+dGNoYW4pKQorCQlyZXR1cm4gUFRSX0VSUih1Yy0+dGNoYW4pOwor CisJaWYgKHVkbWFfaXNfY2hhbl9ydW5uaW5nKHVjKSkgeworCQlkZXZfd2Fybih1ZC0+ZGV2LCAi Y2hhbiVkOiB0Y2hhbiVkIGlzIHJ1bm5pbmchXG4iLCB1Yy0+aWQsCisJCQkgdWMtPnRjaGFuLT5p ZCk7CisJCXVkbWFfc3RvcCh1Yyk7CisJCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpCisJ CQlkZXZfZXJyKHVkLT5kZXYsICJjaGFuJWQ6IHdvbid0IHN0b3AhXG4iLCB1Yy0+aWQpOworCX0K KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVkbWFfZ2V0X3JjaGFuKHN0cnVjdCB1ZG1h X2NoYW4gKnVjKQoreworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSB1Yy0+dWQ7CisKKwlpZiAodWMt PnJjaGFuKSB7CisJCWRldl9kYmcodWQtPmRldiwgImNoYW4lZDogYWxyZWFkeSBoYXZlIHJjaGFu JWQgYWxsb2NhdGVkXG4iLAorCQkJdWMtPmlkLCB1Yy0+cmNoYW4tPmlkKTsKKwkJcmV0dXJuIDA7 CisJfQorCisJdWMtPnJjaGFuID0gX191ZG1hX3Jlc2VydmVfcmNoYW4odWQsIHVjLT5jaGFubmVs X3RwbCwgLTEpOworCWlmIChJU19FUlIodWMtPnJjaGFuKSkKKwkJcmV0dXJuIFBUUl9FUlIodWMt PnJjaGFuKTsKKworCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpIHsKKwkJZGV2X3dhcm4o dWQtPmRldiwgImNoYW4lZDogcmNoYW4lZCBpcyBydW5uaW5nIVxuIiwgdWMtPmlkLAorCQkJIHVj LT5yY2hhbi0+aWQpOworCQl1ZG1hX3N0b3AodWMpOworCQlpZiAodWRtYV9pc19jaGFuX3J1bm5p bmcodWMpKQorCQkJZGV2X2Vycih1ZC0+ZGV2LCAiY2hhbiVkOiB3b24ndCBzdG9wIVxuIiwgdWMt PmlkKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZG1hX2dldF9jaGFuX3Bh aXIoc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51 ZDsKKwlpbnQgY2hhbl9pZCwgZW5kOworCisJaWYgKCh1Yy0+dGNoYW4gJiYgdWMtPnJjaGFuKSAm JiB1Yy0+dGNoYW4tPmlkID09IHVjLT5yY2hhbi0+aWQpIHsKKwkJZGV2X2luZm8odWQtPmRldiwg ImNoYW4lZDogYWxyZWFkeSBoYXZlICVkIHBhaXIgYWxsb2NhdGVkXG4iLAorCQkJIHVjLT5pZCwg dWMtPnRjaGFuLT5pZCk7CisJCXJldHVybiAwOworCX0KKworCWlmICh1Yy0+dGNoYW4pIHsKKwkJ ZGV2X2Vycih1ZC0+ZGV2LCAiY2hhbiVkOiBhbHJlYWR5IGhhdmUgdGNoYW4lZCBhbGxvY2F0ZWRc biIsCisJCQl1Yy0+aWQsIHVjLT50Y2hhbi0+aWQpOworCQlyZXR1cm4gLUVCVVNZOworCX0gZWxz ZSBpZiAodWMtPnJjaGFuKSB7CisJCWRldl9lcnIodWQtPmRldiwgImNoYW4lZDogYWxyZWFkeSBo YXZlIHJjaGFuJWQgYWxsb2NhdGVkXG4iLAorCQkJdWMtPmlkLCB1Yy0+cmNoYW4tPmlkKTsKKwkJ cmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBDYW4gYmUgb3B0aW1pemVkLCBidXQgbGV0J3MgaGF2 ZSBpdCBsaWtlIHRoaXMgZm9yIG5vdyAqLworCWVuZCA9IG1pbih1ZC0+dGNoYW5fY250LCB1ZC0+ cmNoYW5fY250KTsKKwlmb3IgKGNoYW5faWQgPSB1ZC0+bWF0Y2hfZGF0YS0+bGV2ZWxfc3RhcnRf aWR4W1VETUFfVFBfTk9STUFMXTsKKwkgICAgIGNoYW5faWQgPCBlbmQ7IGNoYW5faWQrKykgewor CQlpZiAoIXRlc3RfYml0KGNoYW5faWQsIHVkLT50Y2hhbl9tYXApICYmCisJCSAgICAhdGVzdF9i aXQoY2hhbl9pZCwgdWQtPnJjaGFuX21hcCkpCisJCQlicmVhazsKKwl9CisKKwlpZiAoY2hhbl9p ZCA9PSBlbmQpCisJCXJldHVybiAtRU5PRU5UOworCisJc2V0X2JpdChjaGFuX2lkLCB1ZC0+dGNo YW5fbWFwKTsKKwlzZXRfYml0KGNoYW5faWQsIHVkLT5yY2hhbl9tYXApOworCXVjLT50Y2hhbiA9 ICZ1ZC0+dGNoYW5zW2NoYW5faWRdOworCXVjLT5yY2hhbiA9ICZ1ZC0+cmNoYW5zW2NoYW5faWRd OworCisJaWYgKHVkbWFfaXNfY2hhbl9ydW5uaW5nKHVjKSkgeworCQlkZXZfd2Fybih1ZC0+ZGV2 LCAiY2hhbiVkOiB0L3JjaGFuJWQgcGFpciBpcyBydW5uaW5nIVxuIiwKKwkJCSB1Yy0+aWQsIGNo YW5faWQpOworCQl1ZG1hX3N0b3AodWMpOworCQlpZiAodWRtYV9pc19jaGFuX3J1bm5pbmcodWMp KQorCQkJZGV2X2Vycih1ZC0+ZGV2LCAiY2hhbiVkOiB3b24ndCBzdG9wIVxuIiwgdWMtPmlkKTsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZG1hX2dldF9yZmxvdyhzdHJ1Y3Qg dWRtYV9jaGFuICp1YywgaW50IGZsb3dfaWQpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVj LT51ZDsKKworCWlmICh1Yy0+cmZsb3cpIHsKKwkJZGV2X2RiZyh1ZC0+ZGV2LCAiY2hhbiVkOiBh bHJlYWR5IGhhdmUgcmZsb3clZCBhbGxvY2F0ZWRcbiIsCisJCQl1Yy0+aWQsIHVjLT5yZmxvdy0+ aWQpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIXVjLT5yY2hhbikKKwkJZGV2X3dhcm4odWQt PmRldiwgImNoYW4lZDogZG9lcyBub3QgaGF2ZSByY2hhbj8/XG4iLCB1Yy0+aWQpOworCisJdWMt PnJmbG93ID0gX191ZG1hX3Jlc2VydmVfcmZsb3codWQsIHVjLT5jaGFubmVsX3RwbCwgZmxvd19p ZCk7CisJaWYgKElTX0VSUih1Yy0+cmZsb3cpKQorCQlyZXR1cm4gUFRSX0VSUih1Yy0+cmZsb3cp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFfcHV0X3JjaGFuKHN0cnVjdCB1 ZG1hX2NoYW4gKnVjKQoreworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSB1Yy0+dWQ7CisKKwlpZiAo dWMtPnJjaGFuKSB7CisJCWRldl9kYmcodWQtPmRldiwgImNoYW4lZDogcHV0IHJjaGFuJWRcbiIs IHVjLT5pZCwKKwkJCXVjLT5yY2hhbi0+aWQpOworCQljbGVhcl9iaXQodWMtPnJjaGFuLT5pZCwg dWQtPnJjaGFuX21hcCk7CisJCXVjLT5yY2hhbiA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9p ZCB1ZG1hX3B1dF90Y2hhbihzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlzdHJ1Y3QgdWRtYV9k ZXYgKnVkID0gdWMtPnVkOworCisJaWYgKHVjLT50Y2hhbikgeworCQlkZXZfZGJnKHVkLT5kZXYs ICJjaGFuJWQ6IHB1dCB0Y2hhbiVkXG4iLCB1Yy0+aWQsCisJCQl1Yy0+dGNoYW4tPmlkKTsKKwkJ Y2xlYXJfYml0KHVjLT50Y2hhbi0+aWQsIHVkLT50Y2hhbl9tYXApOworCQl1Yy0+dGNoYW4gPSBO VUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdWRtYV9wdXRfcmZsb3coc3RydWN0IHVkbWFfY2hh biAqdWMpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51ZDsKKworCWlmICh1Yy0+cmZs b3cpIHsKKwkJZGV2X2RiZyh1ZC0+ZGV2LCAiY2hhbiVkOiBwdXQgcmZsb3clZFxuIiwgdWMtPmlk LAorCQkJdWMtPnJmbG93LT5pZCk7CisJCWNsZWFyX2JpdCh1Yy0+cmZsb3ctPmlkLCB1ZC0+cmZs b3dfbWFwKTsKKwkJdWMtPnJmbG93ID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVkbWFf ZnJlZV90eF9yZXNvdXJjZXMoc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJaWYgKCF1Yy0+dGNo YW4pCisJCXJldHVybjsKKworCWszX25hdl9yaW5nYWNjX3JpbmdfZnJlZSh1Yy0+dGNoYW4tPnRf cmluZyk7CisJazNfbmF2X3JpbmdhY2NfcmluZ19mcmVlKHVjLT50Y2hhbi0+dGNfcmluZyk7CisJ dWMtPnRjaGFuLT50X3JpbmcgPSBOVUxMOworCXVjLT50Y2hhbi0+dGNfcmluZyA9IE5VTEw7CisK Kwl1ZG1hX3B1dF90Y2hhbih1Yyk7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9hbGxvY190eF9yZXNv dXJjZXMoc3RydWN0IHVkbWFfY2hhbiAqdWMpCit7CisJc3RydWN0IGszX25hdl9yaW5nX2NmZyBy aW5nX2NmZzsKKwlzdHJ1Y3QgdWRtYV9kZXYgKnVkID0gdWMtPnVkOworCWludCByZXQ7CisKKwly ZXQgPSB1ZG1hX2dldF90Y2hhbih1Yyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXVj LT50Y2hhbi0+dF9yaW5nID0gazNfbmF2X3JpbmdhY2NfcmVxdWVzdF9yaW5nKHVkLT5yaW5nYWNj LAorCQkJCQkJCXVjLT50Y2hhbi0+aWQsIDApOworCWlmICghdWMtPnRjaGFuLT50X3JpbmcpIHsK KwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl90eF9yaW5nOworCX0KKworCXVjLT50Y2hhbi0+ dGNfcmluZyA9IGszX25hdl9yaW5nYWNjX3JlcXVlc3RfcmluZyh1ZC0+cmluZ2FjYywgLTEsIDAp OworCWlmICghdWMtPnRjaGFuLT50Y19yaW5nKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byBl cnJfdHhjX3Jpbmc7CisJfQorCisJbWVtc2V0KCZyaW5nX2NmZywgMCwgc2l6ZW9mKHJpbmdfY2Zn KSk7CisJcmluZ19jZmcuc2l6ZSA9IDE2OworCXJpbmdfY2ZnLmVsbV9zaXplID0gSzNfTkFWX1JJ TkdBQ0NfUklOR19FTFNJWkVfODsKKwlyaW5nX2NmZy5tb2RlID0gSzNfTkFWX1JJTkdBQ0NfUklO R19NT0RFX01FU1NBR0U7CisKKwlyZXQgPSBrM19uYXZfcmluZ2FjY19yaW5nX2NmZyh1Yy0+dGNo YW4tPnRfcmluZywgJnJpbmdfY2ZnKTsKKwlyZXQgfD0gazNfbmF2X3JpbmdhY2NfcmluZ19jZmco dWMtPnRjaGFuLT50Y19yaW5nLCAmcmluZ19jZmcpOworCisJaWYgKHJldCkKKwkJZ290byBlcnJf cmluZ2NmZzsKKworCXJldHVybiAwOworCitlcnJfcmluZ2NmZzoKKwlrM19uYXZfcmluZ2FjY19y aW5nX2ZyZWUodWMtPnRjaGFuLT50Y19yaW5nKTsKKwl1Yy0+dGNoYW4tPnRjX3JpbmcgPSBOVUxM OworZXJyX3R4Y19yaW5nOgorCWszX25hdl9yaW5nYWNjX3JpbmdfZnJlZSh1Yy0+dGNoYW4tPnRf cmluZyk7CisJdWMtPnRjaGFuLT50X3JpbmcgPSBOVUxMOworZXJyX3R4X3Jpbmc6CisJdWRtYV9w dXRfdGNoYW4odWMpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdWRtYV9mcmVl X3J4X3Jlc291cmNlcyhzdHJ1Y3QgdWRtYV9jaGFuICp1YykKK3sKKwlpZiAoIXVjLT5yY2hhbikK KwkJcmV0dXJuOworCisJaWYgKHVjLT5kaXIgIT0gRE1BX01FTV9UT19NRU0pIHsKKwkJazNfbmF2 X3JpbmdhY2NfcmluZ19mcmVlKHVjLT5yY2hhbi0+ZmRfcmluZyk7CisJCWszX25hdl9yaW5nYWNj X3JpbmdfZnJlZSh1Yy0+cmNoYW4tPnJfcmluZyk7CisJCXVjLT5yY2hhbi0+ZmRfcmluZyA9IE5V TEw7CisJCXVjLT5yY2hhbi0+cl9yaW5nID0gTlVMTDsKKworCQl1ZG1hX3B1dF9yZmxvdyh1Yyk7 CisJfQorCisJdWRtYV9wdXRfcmNoYW4odWMpOworfQorCitzdGF0aWMgaW50IHVkbWFfYWxsb2Nf cnhfcmVzb3VyY2VzKHN0cnVjdCB1ZG1hX2NoYW4gKnVjKQoreworCXN0cnVjdCBrM19uYXZfcmlu Z19jZmcgcmluZ19jZmc7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHVjLT51ZDsKKwlpbnQgZmRf cmluZ19pZDsKKwlpbnQgcmV0OworCisJcmV0ID0gdWRtYV9nZXRfcmNoYW4odWMpOworCWlmIChy ZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBGb3IgTUVNX1RPX01FTSB3ZSBkb24ndCBuZWVkIHJm bG93IG9yIHJpbmdzICovCisJaWYgKHVjLT5kaXIgPT0gRE1BX01FTV9UT19NRU0pCisJCXJldHVy biAwOworCisJcmV0ID0gdWRtYV9nZXRfcmZsb3codWMsIHVjLT5yY2hhbi0+aWQpOworCWlmIChy ZXQpIHsKKwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yZmxvdzsKKwl9CisKKwlmZF9yaW5n X2lkID0gdWQtPnRjaGFuX2NudCArIHVkLT5lY2hhbl9jbnQgKyB1Yy0+cmNoYW4tPmlkOworCXVj LT5yY2hhbi0+ZmRfcmluZyA9IGszX25hdl9yaW5nYWNjX3JlcXVlc3RfcmluZyh1ZC0+cmluZ2Fj YywKKwkJCQkJCQkgZmRfcmluZ19pZCwgMCk7CisJaWYgKCF1Yy0+cmNoYW4tPmZkX3JpbmcpIHsK KwkJcmV0ID0gLUVCVVNZOworCQlnb3RvIGVycl9yeF9yaW5nOworCX0KKworCXVjLT5yY2hhbi0+ cl9yaW5nID0gazNfbmF2X3JpbmdhY2NfcmVxdWVzdF9yaW5nKHVkLT5yaW5nYWNjLCAtMSwgMCk7 CisJaWYgKCF1Yy0+cmNoYW4tPnJfcmluZykgeworCQlyZXQgPSAtRUJVU1k7CisJCWdvdG8gZXJy X3J4Y19yaW5nOworCX0KKworCW1lbXNldCgmcmluZ19jZmcsIDAsIHNpemVvZihyaW5nX2NmZykp OworCXJpbmdfY2ZnLnNpemUgPSAxNjsKKwlyaW5nX2NmZy5lbG1fc2l6ZSA9IEszX05BVl9SSU5H QUNDX1JJTkdfRUxTSVpFXzg7CisJcmluZ19jZmcubW9kZSA9IEszX05BVl9SSU5HQUNDX1JJTkdf TU9ERV9NRVNTQUdFOworCisJcmV0ID0gazNfbmF2X3JpbmdhY2NfcmluZ19jZmcodWMtPnJjaGFu LT5mZF9yaW5nLCAmcmluZ19jZmcpOworCXJldCB8PSBrM19uYXZfcmluZ2FjY19yaW5nX2NmZyh1 Yy0+cmNoYW4tPnJfcmluZywgJnJpbmdfY2ZnKTsKKworCWlmIChyZXQpCisJCWdvdG8gZXJyX3Jp bmdjZmc7CisKKwlyZXR1cm4gMDsKKworZXJyX3JpbmdjZmc6CisJazNfbmF2X3JpbmdhY2Nfcmlu Z19mcmVlKHVjLT5yY2hhbi0+cl9yaW5nKTsKKwl1Yy0+cmNoYW4tPnJfcmluZyA9IE5VTEw7Citl cnJfcnhjX3Jpbmc6CisJazNfbmF2X3JpbmdhY2NfcmluZ19mcmVlKHVjLT5yY2hhbi0+ZmRfcmlu Zyk7CisJdWMtPnJjaGFuLT5mZF9yaW5nID0gTlVMTDsKK2Vycl9yeF9yaW5nOgorCXVkbWFfcHV0 X3JmbG93KHVjKTsKK2Vycl9yZmxvdzoKKwl1ZG1hX3B1dF9yY2hhbih1Yyk7CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW50IHVkbWFfYWxsb2NfY2hhbl9yZXNvdXJjZXMoc3RydWN0IGRt YV9jaGFuICpjaGFuKQoreworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNo YW4pOworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSB0b191ZG1hX2RldihjaGFuLT5kZXZpY2UpOwor CXN0cnVjdCB1ZG1hX3Rpc2NpX3JtICp0aXNjaV9ybSA9ICZ1ZC0+dGlzY2lfcm07CisJY29uc3Qg c3RydWN0IHRpX3NjaV9ybV91ZG1hcF9vcHMgKnRpc2NpX29wcyA9IHRpc2NpX3JtLT50aXNjaV91 ZG1hcF9vcHM7CisJc3RydWN0IHVkbWFfdGNoYW4gKnRjaGFuOworCXN0cnVjdCB1ZG1hX3JjaGFu ICpyY2hhbjsKKwlpbnQgcmV0OworCisJaWYgKHVjLT5wa3RfbW9kZSB8fCB1Yy0+ZGlyID09IERN QV9NRU1fVE9fTUVNKSB7CisJCXVjLT51c2VfZG1hX3Bvb2wgPSB0cnVlOworCQkvKiBpbiBjYXNl IG9mIE1FTV9UT19NRU0gd2UgaGF2ZSBtYXhpbXVtIG9mIHR3byBUUnMgKi8KKwkJaWYgKHVjLT5k aXIgPT0gRE1BX01FTV9UT19NRU0pCisJCQl1Yy0+aGRlc2Nfc2l6ZSA9IHVkbWFfY2FsY190cmRl c2Nfc2l6ZSgKKwkJCQkJc2l6ZW9mKHN0cnVjdCBjcHBpNTBfdHJfcmVxX3R5cGUxNSksIDIpOwor CX0KKworCWlmICh1Yy0+dXNlX2RtYV9wb29sKSB7CisJCXVjLT5oZGVzY19wb29sID0gZG1hX3Bv b2xfY3JlYXRlKHVjLT5uYW1lLCB1ZC0+ZGRldi5kZXYsCisJCQkJCQkgdWMtPmhkZXNjX3NpemUs IHVjLT5kZXNjX2FsaWduLAorCQkJCQkJIDApOworCQlpZiAoIXVjLT5oZGVzY19wb29sKSB7CisJ CQlkZXZfZXJyKHVkLT5kZGV2LmRldiwKKwkJCQkiRGVzY3JpcHRvciBwb29sIGFsbG9jYXRpb24g ZmFpbGVkXG4iKTsKKwkJCXVjLT51c2VfZG1hX3Bvb2wgPSBmYWxzZTsKKwkJCXJldHVybiAtRU5P TUVNOworCQl9CisJfQorCisJcG1fcnVudGltZV9nZXRfc3luYyh1ZC0+ZGRldi5kZXYpOworCisJ LyoKKwkgKiBNYWtlIHN1cmUgdGhhdCB0aGUgY29tcGxldGlvbiBpcyBpbiBhIGtub3duIHN0YXRl OgorCSAqIE5vIHRlYXJkb3duLCB0aGUgY2hhbm5lbCBpcyBpZGxlCisJICovCisJcmVpbml0X2Nv bXBsZXRpb24oJnVjLT50ZWFyZG93bl9jb21wbGV0ZWQpOworCWNvbXBsZXRlX2FsbCgmdWMtPnRl YXJkb3duX2NvbXBsZXRlZCk7CisJdWMtPnN0YXRlID0gVURNQV9DSEFOX0lTX0lETEU7CisKKwlz d2l0Y2ggKHVjLT5kaXIpIHsKKwljYXNlIERNQV9NRU1fVE9fTUVNOgorCQkvKiBOb24gc3luY2hy b25pemVkIC0gbWVtIHRvIG1lbSB0eXBlIG9mIHRyYW5zZmVyICovCisJCWRldl9kYmcodWMtPnVk LT5kZXYsICIlczogY2hhbiVkIGFzIE1FTS10by1NRU1cbiIsIF9fZnVuY19fLAorCQkJdWMtPmlk KTsKKworCQlyZXQgPSB1ZG1hX2dldF9jaGFuX3BhaXIodWMpOworCQlpZiAocmV0KQorCQkJcmV0 dXJuIHJldDsKKworCQlyZXQgPSB1ZG1hX2FsbG9jX3R4X3Jlc291cmNlcyh1Yyk7CisJCWlmIChy ZXQpCisJCQlyZXR1cm4gcmV0OworCisJCXJldCA9IHVkbWFfYWxsb2NfcnhfcmVzb3VyY2VzKHVj KTsKKwkJaWYgKHJldCkgeworCQkJdWRtYV9mcmVlX3R4X3Jlc291cmNlcyh1Yyk7CisJCQlyZXR1 cm4gcmV0OworCQl9CisKKwkJdWMtPnNyY190aHJlYWQgPSB1ZC0+cHNpbF9iYXNlICsgdWMtPnRj aGFuLT5pZDsKKwkJdWMtPmRzdF90aHJlYWQgPSAodWQtPnBzaWxfYmFzZSArIHVjLT5yY2hhbi0+ aWQpIHwgMHg4MDAwOworCisJCWJyZWFrOworCWNhc2UgRE1BX01FTV9UT19ERVY6CisJCS8qIFNs YXZlIHRyYW5zZmVyIHN5bmNocm9uaXplZCAtIG1lbSB0byBkZXYgKFRYKSB0cmFzbmZlciAqLwor CQlkZXZfZGJnKHVjLT51ZC0+ZGV2LCAiJXM6IGNoYW4lZCBhcyBNRU0tdG8tREVWXG4iLCBfX2Z1 bmNfXywKKwkJCXVjLT5pZCk7CisKKwkJcmV0ID0gdWRtYV9hbGxvY190eF9yZXNvdXJjZXModWMp OworCQlpZiAocmV0KSB7CisJCQl1Yy0+c2xhdmVfdGhyZWFkX2lkID0gLTE7CisJCQlyZXR1cm4g cmV0OworCQl9CisKKwkJdWMtPnNyY190aHJlYWQgPSB1ZC0+cHNpbF9iYXNlICsgdWMtPnRjaGFu LT5pZDsKKwkJdWMtPmRzdF90aHJlYWQgPSB1Yy0+c2xhdmVfdGhyZWFkX2lkOworCQlpZiAoISh1 Yy0+ZHN0X3RocmVhZCAmIDB4ODAwMCkpCisJCQl1Yy0+ZHN0X3RocmVhZCB8PSAweDgwMDA7CisK KwkJYnJlYWs7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJLyogU2xhdmUgdHJhbnNmZXIgc3lu Y2hyb25pemVkIC0gZGV2IHRvIG1lbSAoUlgpIHRyYXNuZmVyICovCisJCWRldl9kYmcodWMtPnVk LT5kZXYsICIlczogY2hhbiVkIGFzIERFVi10by1NRU1cbiIsIF9fZnVuY19fLAorCQkJdWMtPmlk KTsKKworCQlyZXQgPSB1ZG1hX2FsbG9jX3J4X3Jlc291cmNlcyh1Yyk7CisJCWlmIChyZXQpIHsK KwkJCXVjLT5zbGF2ZV90aHJlYWRfaWQgPSAtMTsKKwkJCXJldHVybiByZXQ7CisJCX0KKworCQl1 Yy0+c3JjX3RocmVhZCA9IHVjLT5zbGF2ZV90aHJlYWRfaWQ7CisJCXVjLT5kc3RfdGhyZWFkID0g KHVkLT5wc2lsX2Jhc2UgKyB1Yy0+cmNoYW4tPmlkKSB8IDB4ODAwMDsKKworCQlicmVhazsKKwlk ZWZhdWx0OgorCQkvKiBDYW4gbm90IGhhcHBlbiAqLworCQlkZXZfZXJyKHVjLT51ZC0+ZGV2LCAi JXM6IGNoYW4lZCBpbnZhbGlkIGRpcmVjdGlvbiAoJXUpXG4iLAorCQkJX19mdW5jX18sIHVjLT5p ZCwgdWMtPmRpcik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXRjaGFuID0gdWMtPnRjaGFu OworCXJjaGFuID0gdWMtPnJjaGFuOworCisJLyoKKwkgKiBDb25maWd1cmUgVHggYW5kIFJ4IGNo YW5uZWwgdHlwZSB0bzoKKwkgKiBUaGlyZCBQYXJ0eSBETUEgY29udHJvbCB0cmFuc2ZlcnMgdXNp bmcgcGFzcyBieSByZWZlcmVuY2UgcmluZ3MKKwkgKi8KKwlpZiAodWMtPmRpciA9PSBETUFfTUVN X1RPX01FTSkgeworCQkvKiBOb24gc3luY2hyb25pemVkIC0gbWVtIHRvIG1lbSB0eXBlIG9mIHRy YW5zZmVyICovCisJCWludCB0Y19yaW5nID0gazNfbmF2X3JpbmdhY2NfZ2V0X3JpbmdfaWQodGNo YW4tPnRjX3JpbmcpOworCQlzdHJ1Y3QgdGlfc2NpX21zZ19ybV91ZG1hcF90eF9jaF9jZmcgcmVx X3R4ID0geyAwIH07CisJCXN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX3J4X2NoX2NmZyByZXFf cnggPSB7IDAgfTsKKworCQlyZXFfdHgudmFsaWRfcGFyYW1zID0KKwkJCVRJX1NDSV9NU0dfVkFM VUVfUk1fVURNQVBfQ0hfUEFVU0VfT05fRVJSX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFMVUVf Uk1fVURNQVBfQ0hfVFhfRklMVF9FSU5GT19WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0NIX1RYX0ZJTFRfUFNXT1JEU19WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0NIX0NIQU5fVFlQRV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQ X0NIX1RYX1NVUFJfVERQS1RfVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9D SF9GRVRDSF9TSVpFX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfQ1Ff UU5VTV9WQUxJRDsKKworCQlyZXFfdHgubmF2X2lkID0gdGlzY2lfcm0tPnRpc2NpX2Rldl9pZDsK KwkJcmVxX3R4LmluZGV4ID0gdGNoYW4tPmlkOworCQlyZXFfdHgudHhfcGF1c2Vfb25fZXJyID0g MDsKKwkJcmVxX3R4LnR4X2ZpbHRfZWluZm8gPSAwOworCQlyZXFfdHgudHhfZmlsdF9wc3dvcmRz ID0gMDsKKwkJcmVxX3R4LnR4X2NoYW5fdHlwZSA9IFRJX1NDSV9STV9VRE1BUF9DSEFOX1RZUEVf M1JEUF9CQ09QWV9QQlJSOworCQlyZXFfdHgudHhfc3Vwcl90ZHBrdCA9IDA7CisJCXJlcV90eC50 eF9mZXRjaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBjcHBpNTBfdHJfcmVxX2Rlc2MpID4+IDI7CisJ CXJlcV90eC50eGNxX3FudW0gPSB0Y19yaW5nOworCisJCXJldCA9IHRpc2NpX29wcy0+dHhfY2hf Y2ZnKHRpc2NpX3JtLT50aXNjaSwgJnJlcV90eCk7CisJCWlmIChyZXQpIHsKKwkJCWRldl9lcnIo dWQtPmRldiwgInRjaGFuJWQgY2ZnIGZhaWxlZCAlZFxuIiwKKwkJCQl0Y2hhbi0+aWQsIHJldCk7 CisJCQlnb3RvIGVycl9yZXNfZnJlZTsKKwkJfQorCisJCXJlcV9yeC52YWxpZF9wYXJhbXMgPQor CQkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9QQVVTRV9PTl9FUlJfVkFMSUQgfAorCQkJ VElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9DSF9GRVRDSF9TSVpFX1ZBTElEIHwKKwkJCVRJX1ND SV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hfQ1FfUU5VTV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZB TFVFX1JNX1VETUFQX0NIX0NIQU5fVFlQRV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0NIX1JYX0lHTk9SRV9TSE9SVF9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0NIX1JYX0lHTk9SRV9MT05HX1ZBTElEOworCisJCXJlcV9yeC5uYXZfaWQgPSB0aXNj aV9ybS0+dGlzY2lfZGV2X2lkOworCQlyZXFfcnguaW5kZXggPSByY2hhbi0+aWQ7CisJCXJlcV9y eC5yeF9mZXRjaF9zaXplID0gc2l6ZW9mKHN0cnVjdCBjcHBpNTBfdHJfcmVxX2Rlc2MpID4+IDI7 CisJCXJlcV9yeC5yeGNxX3FudW0gPSB0Y19yaW5nOworCQlyZXFfcngucnhfcGF1c2Vfb25fZXJy ID0gMDsKKwkJcmVxX3J4LnJ4X2NoYW5fdHlwZSA9IFRJX1NDSV9STV9VRE1BUF9DSEFOX1RZUEVf M1JEUF9CQ09QWV9QQlJSOworCQlyZXFfcngucnhfaWdub3JlX3Nob3J0ID0gMDsKKwkJcmVxX3J4 LnJ4X2lnbm9yZV9sb25nID0gMDsKKworCQlyZXQgPSB0aXNjaV9vcHMtPnJ4X2NoX2NmZyh0aXNj aV9ybS0+dGlzY2ksICZyZXFfcngpOworCQlpZiAocmV0KSB7CisJCQlkZXZfZXJyKHVkLT5kZXYs ICJyY2hhbiVkIGFsbG9jIGZhaWxlZCAlZFxuIiwKKwkJCQlyY2hhbi0+aWQsIHJldCk7CisJCQln b3RvIGVycl9yZXNfZnJlZTsKKwkJfQorCisJCXVjLT5pcnFfcmFfdGlzY2kgPSBrM19uYXZfcmlu Z2FjY19nZXRfdGlzY2lfZGV2X2lkKAorCQkJCQkJCQl0Y2hhbi0+dGNfcmluZyk7CisJCXVjLT5p cnFfcmFfaWR4ID0gdGNfcmluZzsKKwkJdWMtPmlycV91ZG1hX2lkeCA9IHRjaGFuLT5pZDsKKwl9 IGVsc2UgeworCQkvKiBTbGF2ZSB0cmFuc2ZlciAqLworCQl1MzIgbW9kZSwgZmV0Y2hfc2l6ZTsK KworCQlpZiAodWMtPnBrdF9tb2RlKSB7CisJCQltb2RlID0gVElfU0NJX1JNX1VETUFQX0NIQU5f VFlQRV9QS1RfUEJSUjsKKwkJCWZldGNoX3NpemUgPSBrbmF2X3VkbWFwX2hkZXNjX2NhbGNfc2l6 ZSh1Yy0+bmVlZHNfZXBpYiwKKwkJCQkJCQkJdWMtPnBzZF9zaXplLAorCQkJCQkJCQkwKTsKKwkJ fSBlbHNlIHsKKwkJCW1vZGUgPSBUSV9TQ0lfUk1fVURNQVBfQ0hBTl9UWVBFXzNSRFBfUEJSUjsK KwkJCWZldGNoX3NpemUgPSBzaXplb2Yoc3RydWN0IGNwcGk1MF90cl9yZXFfZGVzYyk7CisJCX0K KworCQlpZiAodWMtPmRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQkJLyogVFggKi8KKwkJCWlu dCB0Y19yaW5nID0gazNfbmF2X3JpbmdhY2NfZ2V0X3JpbmdfaWQoCisJCQkJCQkJCXRjaGFuLT50 Y19yaW5nKTsKKwkJCXN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX3R4X2NoX2NmZyByZXFfdHgg PSB7IDAgfTsKKworCQkJcmVxX3R4LnZhbGlkX3BhcmFtcyA9CisJCQlUSV9TQ0lfTVNHX1ZBTFVF X1JNX1VETUFQX0NIX1BBVVNFX09OX0VSUl9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0NIX1RYX0ZJTFRfRUlORk9fVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9STV9V RE1BUF9DSF9UWF9GSUxUX1BTV09SRFNfVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9STV9V RE1BUF9DSF9DSEFOX1RZUEVfVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9STV9VRE1BUF9D SF9UWF9TVVBSX1REUEtUX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hf RkVUQ0hfU0laRV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX0NRX1FO VU1fVkFMSUQ7CisKKwkJCXJlcV90eC5uYXZfaWQgPSB0aXNjaV9ybS0+dGlzY2lfZGV2X2lkOwor CQkJcmVxX3R4LmluZGV4ID0gdGNoYW4tPmlkOworCQkJcmVxX3R4LnR4X3BhdXNlX29uX2VyciA9 IDA7CisJCQlyZXFfdHgudHhfZmlsdF9laW5mbyA9IDA7CisJCQlyZXFfdHgudHhfZmlsdF9wc3dv cmRzID0gMDsKKwkJCXJlcV90eC50eF9jaGFuX3R5cGUgPSBtb2RlOworCQkJcmVxX3R4LnR4X3N1 cHJfdGRwa3QgPSAwOworCQkJcmVxX3R4LnR4X2ZldGNoX3NpemUgPSBmZXRjaF9zaXplID4+IDI7 CisJCQlyZXFfdHgudHhjcV9xbnVtID0gdGNfcmluZzsKKworCQkJcmV0ID0gdGlzY2lfb3BzLT50 eF9jaF9jZmcodGlzY2lfcm0tPnRpc2NpLCAmcmVxX3R4KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlk ZXZfZXJyKHVkLT5kZXYsICJ0Y2hhbiVkIGNmZyBmYWlsZWQgJWRcbiIsCisJCQkJCXRjaGFuLT5p ZCwgcmV0KTsKKwkJCQlnb3RvIGVycl9yZXNfZnJlZTsKKwkJCX0KKworCQkJdWMtPmlycV9yYV90 aXNjaSA9IGszX25hdl9yaW5nYWNjX2dldF90aXNjaV9kZXZfaWQoCisJCQkJCQkJCXRjaGFuLT50 Y19yaW5nKTsKKwkJCXVjLT5pcnFfcmFfaWR4ID0gdGNfcmluZzsKKwkJCXVjLT5pcnFfdWRtYV9p ZHggPSB0Y2hhbi0+aWQ7CisJCX0gZWxzZSB7CisJCQkvKiBSWCAqLworCQkJaW50IGZkX3Jpbmcg PSBrM19uYXZfcmluZ2FjY19nZXRfcmluZ19pZCgKKwkJCQkJCQkJcmNoYW4tPmZkX3JpbmcpOwor CQkJaW50IHJ4X3JpbmcgPSBrM19uYXZfcmluZ2FjY19nZXRfcmluZ19pZChyY2hhbi0+cl9yaW5n KTsKKwkJCXN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX3J4X2NoX2NmZyByZXFfcnggPSB7IDAg fTsKKwkJCXN0cnVjdCB0aV9zY2lfbXNnX3JtX3VkbWFwX2Zsb3dfY2ZnIGZsb3dfcmVxID0geyAw IH07CisKKwkJCXJlcV9yeC52YWxpZF9wYXJhbXMgPQorCQkJVElfU0NJX01TR19WQUxVRV9STV9V RE1BUF9DSF9QQVVTRV9PTl9FUlJfVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9STV9VRE1B UF9DSF9GRVRDSF9TSVpFX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFMVUVfUk1fVURNQVBfQ0hf Q1FfUU5VTV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX0NIQU5fVFlQ RV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX1JYX0lHTk9SRV9TSE9S VF9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VETUFQX0NIX1JYX0lHTk9SRV9MT05H X1ZBTElEOworCisJCQlyZXFfcngubmF2X2lkID0gdGlzY2lfcm0tPnRpc2NpX2Rldl9pZDsKKwkJ CXJlcV9yeC5pbmRleCA9IHJjaGFuLT5pZDsKKwkJCXJlcV9yeC5yeF9mZXRjaF9zaXplID0gIGZl dGNoX3NpemUgPj4gMjsKKwkJCXJlcV9yeC5yeGNxX3FudW0gPSByeF9yaW5nOworCQkJcmVxX3J4 LnJ4X3BhdXNlX29uX2VyciA9IDA7CisJCQlyZXFfcngucnhfY2hhbl90eXBlID0gbW9kZTsKKwkJ CXJlcV9yeC5yeF9pZ25vcmVfc2hvcnQgPSAwOworCQkJcmVxX3J4LnJ4X2lnbm9yZV9sb25nID0g MDsKKworCQkJcmV0ID0gdGlzY2lfb3BzLT5yeF9jaF9jZmcodGlzY2lfcm0tPnRpc2NpLCAmcmVx X3J4KTsKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKHVkLT5kZXYsICJyY2hhbiVkIGNmZyBm YWlsZWQgJWRcbiIsCisJCQkJCXJjaGFuLT5pZCwgcmV0KTsKKwkJCQlnb3RvIGVycl9yZXNfZnJl ZTsKKwkJCX0KKworCQkJZmxvd19yZXEudmFsaWRfcGFyYW1zID0KKwkJCVRJX1NDSV9NU0dfVkFM VUVfUk1fVURNQVBfRkxPV19FSU5GT19QUkVTRU5UX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFM VUVfUk1fVURNQVBfRkxPV19QU0lORk9fUFJFU0VOVF9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZB TFVFX1JNX1VETUFQX0ZMT1dfRVJST1JfSEFORExJTkdfVkFMSUQgfAorCQkJVElfU0NJX01TR19W QUxVRV9STV9VRE1BUF9GTE9XX0RFU0NfVFlQRV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVF X1JNX1VETUFQX0ZMT1dfREVTVF9RTlVNX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFMVUVfUk1f VURNQVBfRkxPV19TUkNfVEFHX0hJX1NFTF9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JN X1VETUFQX0ZMT1dfU1JDX1RBR19MT19TRUxfVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9S TV9VRE1BUF9GTE9XX0RFU1RfVEFHX0hJX1NFTF9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVF X1JNX1VETUFQX0ZMT1dfREVTVF9UQUdfTE9fU0VMX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFM VUVfUk1fVURNQVBfRkxPV19GRFEwX1NaMF9RTlVNX1ZBTElEIHwKKwkJCVRJX1NDSV9NU0dfVkFM VUVfUk1fVURNQVBfRkxPV19GRFExX1FOVU1fVkFMSUQgfAorCQkJVElfU0NJX01TR19WQUxVRV9S TV9VRE1BUF9GTE9XX0ZEUTJfUU5VTV9WQUxJRCB8CisJCQlUSV9TQ0lfTVNHX1ZBTFVFX1JNX1VE TUFQX0ZMT1dfRkRRM19RTlVNX1ZBTElEOworCisJCQlmbG93X3JlcS5uYXZfaWQgPSB0aXNjaV9y bS0+dGlzY2lfZGV2X2lkOworCQkJZmxvd19yZXEuZmxvd19pbmRleCA9IHJjaGFuLT5pZDsKKwor CQkJaWYgKHVjLT5uZWVkc19lcGliKQorCQkJCWZsb3dfcmVxLnJ4X2VpbmZvX3ByZXNlbnQgPSAx OworCQkJZWxzZQorCQkJCWZsb3dfcmVxLnJ4X2VpbmZvX3ByZXNlbnQgPSAwOworCQkJaWYgKHVj LT5wc2Rfc2l6ZSkKKwkJCQlmbG93X3JlcS5yeF9wc2luZm9fcHJlc2VudCA9IDE7CisJCQllbHNl CisJCQkJZmxvd19yZXEucnhfcHNpbmZvX3ByZXNlbnQgPSAwOworCQkJZmxvd19yZXEucnhfZXJy b3JfaGFuZGxpbmcgPSAxOworCQkJZmxvd19yZXEucnhfZGVzY190eXBlID0gMDsKKwkJCWZsb3df cmVxLnJ4X2Rlc3RfcW51bSA9IHJ4X3Jpbmc7CisJCQlmbG93X3JlcS5yeF9zcmNfdGFnX2hpX3Nl bCA9IDI7CisJCQlmbG93X3JlcS5yeF9zcmNfdGFnX2xvX3NlbCA9IDQ7CisJCQlmbG93X3JlcS5y eF9kZXN0X3RhZ19oaV9zZWwgPSA1OworCQkJZmxvd19yZXEucnhfZGVzdF90YWdfbG9fc2VsID0g NDsKKwkJCWZsb3dfcmVxLnJ4X2ZkcTBfc3owX3FudW0gPSBmZF9yaW5nOworCQkJZmxvd19yZXEu cnhfZmRxMV9xbnVtID0gZmRfcmluZzsKKwkJCWZsb3dfcmVxLnJ4X2ZkcTJfcW51bSA9IGZkX3Jp bmc7CisJCQlmbG93X3JlcS5yeF9mZHEzX3FudW0gPSBmZF9yaW5nOworCisJCQlyZXQgPSB0aXNj aV9vcHMtPnJ4X2Zsb3dfY2ZnKHRpc2NpX3JtLT50aXNjaSwKKwkJCQkJCSAgICAgICZmbG93X3Jl cSk7CisKKwkJCWlmIChyZXQpIHsKKwkJCQlkZXZfZXJyKHVkLT5kZXYsICJmbG93JWQgY29uZmln IGZhaWxlZDogJWRcbiIsCisJCQkJCXJjaGFuLT5pZCwgcmV0KTsKKwkJCQlnb3RvIGVycl9jaGFu X2ZyZWU7CisJCQl9CisKKwkJCXVjLT5pcnFfcmFfdGlzY2kgPSBrM19uYXZfcmluZ2FjY19nZXRf dGlzY2lfZGV2X2lkKAorCQkJCQkJCQlyY2hhbi0+cl9yaW5nKTsKKwkJCXVjLT5pcnFfcmFfaWR4 ID0gcnhfcmluZzsKKwkJCXVjLT5pcnFfdWRtYV9pZHggPSAweDIwMDAgKyByY2hhbi0+aWQ7CisJ CX0KKwl9CisKKwkvKiBQU0ktTCBwYWlyaW5nICovCisJcmV0ID0gbmF2c3NfcHNpbF9wYWlyKHVk LCB1Yy0+c3JjX3RocmVhZCwgdWMtPmRzdF90aHJlYWQpOworCWlmIChyZXQpCisJCWdvdG8gZXJy X2NoYW5fZnJlZTsKKworCXVjLT5wc2lsX3BhaXJlZCA9IHRydWU7CisKKwkvKiBHZXQgdGhlIGlu dGVycnVwdHMuLi4gKi8KKwl1Yy0+aXJxX251bV9yaW5nID0gdGlfc2NpX2ludGFfcmVnaXN0ZXJf ZXZlbnQodWQtPmRldiwgdWMtPmlycV9yYV90aXNjaSwKKwkJCQkJCSAgICAgIHVjLT5pcnFfcmFf aWR4LCAwLAorCQkJCQkJICAgICAgSVJRRl9UUklHR0VSX0hJR0gpOworCWlmICh1Yy0+aXJxX251 bV9yaW5nIDw9IDApIHsKKwkJZGV2X2Vycih1ZC0+ZGV2LCAiRmFpbGVkIHRvIGdldCByaW5nIGly cSAoaW5kZXg6ICV1KSAlZFxuIiwKKwkJCXVjLT5pcnFfcmFfaWR4LCB1Yy0+aXJxX251bV9yaW5n KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBlcnJfcHNpX2ZyZWU7CisJfQorCisJdWMtPmly cV9udW1fdWRtYSA9IHRpX3NjaV9pbnRhX3JlZ2lzdGVyX2V2ZW50KHVkLT5kZXYsCisJCQkJCQkg ICAgICB0aXNjaV9ybS0+dGlzY2lfZGV2X2lkLAorCQkJCQkJICAgICAgdWMtPmlycV91ZG1hX2lk eCwgMCwKKwkJCQkJCSAgICAgIElSUUZfVFJJR0dFUl9ISUdIKTsKKwlpZiAodWMtPmlycV9udW1f dWRtYSA8PSAwKSB7CisJCWRldl9lcnIodWQtPmRldiwgIkZhaWxlZCB0byBnZXQgdWRtYSBpcnEg KGluZGV4OiAldSkgJWRcbiIsCisJCQl1Yy0+aXJxX3VkbWFfaWR4LCB1Yy0+aXJxX251bV91ZG1h KTsKKworCQl0aV9zY2lfaW50YV91bnJlZ2lzdGVyX2V2ZW50KHVkLT5kZXYsIHVjLT5pcnFfcmFf dGlzY2ksCisJCQkJCSAgICAgdWMtPmlycV9yYV9pZHgsIHVjLT5pcnFfbnVtX3JpbmcpOworCisJ CXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZXJyX3BzaV9mcmVlOworCX0KKworCXJldCA9IHJlcXVl c3RfaXJxKHVjLT5pcnFfbnVtX3JpbmcsIHVkbWFfcmluZ19pcnFfaGFuZGxlciwgMCwgdWMtPm5h bWUsCisJCQkgIHVjKTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIodWQtPmRldiwgIiVzOiBjaGFu JWQ6IEZhaWxlZCB0byByZXF1ZXN0IHJpbmcgaXJxXG4iLAorCQkJX19mdW5jX18sIHVjLT5pZCk7 CisJCWdvdG8gZXJyX2lycV9mcmVlOworCX0KKworCXJldCA9IHJlcXVlc3RfaXJxKHVjLT5pcnFf bnVtX3VkbWEsIHVkbWFfdWRtYV9pcnFfaGFuZGxlciwgMCwgdWMtPm5hbWUsCisJCQkgIHVjKTsK KwlpZiAocmV0KSB7CisJCWRldl9lcnIodWQtPmRldiwgIiVzOiBjaGFuJWQ6IEZhaWxlZCB0byBy ZXF1ZXN0IFVETUEgaXJxXG4iLAorCQkJX19mdW5jX18sIHVjLT5pZCk7CisJCWZyZWVfaXJxKHVj LT5pcnFfbnVtX3JpbmcsIHVjKTsKKwkJZ290byBlcnJfaXJxX2ZyZWU7CisJfQorCisJdWRtYV9y ZXNldF9yaW5ncyh1Yyk7CisKKwlyZXR1cm4gMDsKKworZXJyX2lycV9mcmVlOgorCXRpX3NjaV9p bnRhX3VucmVnaXN0ZXJfZXZlbnQodWQtPmRldiwgdWMtPmlycV9yYV90aXNjaSwgdWMtPmlycV9y YV9pZHgsCisJCQkJICAgICB1Yy0+aXJxX251bV9yaW5nKTsKKwl1Yy0+aXJxX251bV9yaW5nID0g MDsKKworCXRpX3NjaV9pbnRhX3VucmVnaXN0ZXJfZXZlbnQodWQtPmRldiwgdGlzY2lfcm0tPnRp c2NpX2Rldl9pZCwKKwkJCQkgICAgIHVjLT5pcnFfdWRtYV9pZHgsIHVjLT5pcnFfbnVtX3VkbWEp OworCXVjLT5pcnFfbnVtX3VkbWEgPSAwOworZXJyX3BzaV9mcmVlOgorCW5hdnNzX3BzaWxfdW5w YWlyKHVkLCB1Yy0+c3JjX3RocmVhZCwgdWMtPmRzdF90aHJlYWQpOworCXVjLT5wc2lsX3BhaXJl ZCA9IGZhbHNlOworZXJyX2NoYW5fZnJlZToKK2Vycl9yZXNfZnJlZToKKwl1ZG1hX2ZyZWVfdHhf cmVzb3VyY2VzKHVjKTsKKwl1ZG1hX2ZyZWVfcnhfcmVzb3VyY2VzKHVjKTsKKwl1Yy0+c2xhdmVf dGhyZWFkX2lkID0gLTE7CisKKwlpZiAodWMtPnVzZV9kbWFfcG9vbCkgeworCQlkbWFfcG9vbF9k ZXN0cm95KHVjLT5oZGVzY19wb29sKTsKKwkJdWMtPnVzZV9kbWFfcG9vbCA9IGZhbHNlOworCX0K KworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9zbGF2ZV9jb25maWcoc3RydWN0 IGRtYV9jaGFuICpjaGFuLAorCQkJICAgICBzdHJ1Y3QgZG1hX3NsYXZlX2NvbmZpZyAqY2ZnKQor eworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCisJbWVtY3B5 KCZ1Yy0+Y2ZnLCBjZmcsIHNpemVvZih1Yy0+Y2ZnKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIHN0cnVjdCB1ZG1hX2Rlc2MgKnVkbWFfYWxsb2NfdHJfZGVzYyhzdHJ1Y3QgdWRtYV9jaGFu ICp1YywKKwkJCQkJICAgIHNpemVfdCB0cl9zaXplLCBpbnQgdHJfY291bnQsCisJCQkJCSAgICBl bnVtIGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyKQoreworCXN0cnVjdCB1ZG1hX2h3ZGVzYyAq aHdkZXNjOworCXN0cnVjdCBjcHBpNTBfdHJfcmVxX2Rlc2MgKnRyX2Rlc2M7CisJc3RydWN0IHVk bWFfZGVzYyAqZDsKKwl1MzIgdHJfbm9taW5hbF9zaXplOworCisJc3dpdGNoICh0cl9zaXplKSB7 CisJY2FzZSAxNjoKKwkJdHJfbm9taW5hbF9zaXplID0gQ1BQSTUwX1RSREVTQ19XMV9UUl9TSVpF XzE2OworCQlicmVhazsKKwljYXNlIDMyOgorCQl0cl9ub21pbmFsX3NpemUgPSBDUFBJNTBfVFJE RVNDX1cxX1RSX1NJWkVfMzI7CisJCWJyZWFrOworCWNhc2UgNjQ6CisJCXRyX25vbWluYWxfc2l6 ZSA9IENQUEk1MF9UUkRFU0NfVzFfVFJfU0laRV82NDsKKwkJYnJlYWs7CisJY2FzZSAxMjg6CisJ CXRyX25vbWluYWxfc2l6ZSA9IENQUEk1MF9UUkRFU0NfVzFfVFJfU0laRV8xMjg7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCWRldl9lcnIodWMtPnVkLT5kZXYsICJVbnN1cHBvcnRlZCBUUiBzaXpl IG9mICV6dVxuIiwgdHJfc2l6ZSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFdlIGhhdmUg b25seSBvbmUgZGVzY3JpcHRvciBjb250YWluaW5nIG11bHRpcGxlIFRScyAqLworCWQgPSBremFs bG9jKHNpemVvZigqZCkgKyBzaXplb2YoZC0+aHdkZXNjWzBdKSwgR0ZQX0FUT01JQyk7CisJaWYg KCFkKQorCQlyZXR1cm4gTlVMTDsKKworCWQtPnNnbGVuID0gdHJfY291bnQ7CisKKwlkLT5od2Rl c2NfY291bnQgPSAxOworCWh3ZGVzYyA9ICZkLT5od2Rlc2NbMF07CisKKwkvKiBBbGxvY2F0ZSBt ZW1vcnkgZm9yIERNQSByaW5nIGRlc2NyaXB0b3IgKi8KKwlpZiAodWMtPnVzZV9kbWFfcG9vbCkg eworCQlod2Rlc2MtPmNwcGk1X2Rlc2Nfc2l6ZSA9IHVjLT5oZGVzY19zaXplOworCQlod2Rlc2Mt PmNwcGk1X2Rlc2NfdmFkZHIgPSBkbWFfcG9vbF96YWxsb2ModWMtPmhkZXNjX3Bvb2wsCisJCQkJ CQlHRlBfQVRPTUlDLAorCQkJCQkJJmh3ZGVzYy0+Y3BwaTVfZGVzY19wYWRkcik7CisJfSBlbHNl IHsKKwkJaHdkZXNjLT5jcHBpNV9kZXNjX3NpemUgPSB1ZG1hX2NhbGNfdHJkZXNjX3NpemUodHJf c2l6ZSwKKwkJCQkJCQkJdHJfY291bnQpOworCQlod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHIgPSBk bWFfemFsbG9jX2NvaGVyZW50KHVjLT51ZC0+ZGV2LAorCQkJCQkJaHdkZXNjLT5jcHBpNV9kZXNj X3NpemUsCisJCQkJCQkmaHdkZXNjLT5jcHBpNV9kZXNjX3BhZGRyLAorCQkJCQkJR0ZQX0FUT01J Qyk7CisJfQorCisJaWYgKCFod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHIpIHsKKwkJa2ZyZWUoZCk7 CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFN0YXJ0IG9mIHRoZSBUUiByZXEgcmVjb3JkcyAq LworCWh3ZGVzYy0+dHJfcmVxX2Jhc2UgPSBod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHIgKyB0cl9z aXplOworCS8qIFN0YXJ0IGFkZHJlc3Mgb2YgdGhlIFRSIHJlc3BvbnNlIGFycmF5ICovCisJaHdk ZXNjLT50cl9yZXNwX2Jhc2UgPSBod2Rlc2MtPnRyX3JlcV9iYXNlICsgdHJfc2l6ZSAqIHRyX2Nv dW50OworCisJdHJfZGVzYyA9IGh3ZGVzYy0+Y3BwaTVfZGVzY192YWRkcjsKKwl0cl9kZXNjLT5w YWNrZXRfaW5mb1swXSA9IENQUEk1MF9UUkRFU0NfVzBfTEFTVF9FTlRSWSh0cl9jb3VudCAtIDEp IHwKKwkJCQkgIENQUEk1MF9UUkRFU0NfVzBfVFlQRTsKKwlpZiAodWMtPmN5Y2xpYykKKwkJdHJf ZGVzYy0+cGFja2V0X2luZm9bMF0gfD0gQ1BQSTUwX1RSREVTQ19XMF9SRUxPQURfQ05UKDB4MWZm KTsKKworCS8qIEZsb3cgYW5kIFBhY2tlZCBJRCAqLworCXRyX2Rlc2MtPnBhY2tldF9pbmZvWzFd ID0gdHJfbm9taW5hbF9zaXplIHwKKwkJCQkgIENQUEk1MF9UUkRFU0NfVzFfUEFDS0VUSUQodWMt PmlkKSB8CisJCQkJICBDUFBJNTBfVFJERVNDX1cxX0ZMT1dJRCgweDNmZmYpOworCisJaWYgKGRp ciA9PSBETUFfREVWX1RPX01FTSkKKwkJdHJfZGVzYy0+cGFja2V0X2luZm9bMl0gPSBrM19uYXZf cmluZ2FjY19nZXRfcmluZ19pZCgKKwkJCQkJCQl1Yy0+cmNoYW4tPnJfcmluZyk7CisJZWxzZQor CQl0cl9kZXNjLT5wYWNrZXRfaW5mb1syXSA9IGszX25hdl9yaW5nYWNjX2dldF9yaW5nX2lkKAor CQkJCQkJCXVjLT50Y2hhbi0+dGNfcmluZyk7CisKKwlyZXR1cm4gZDsKK30KKworc3RhdGljIHN0 cnVjdCB1ZG1hX2Rlc2MgKnVkbWFfcHJlcF9zbGF2ZV9zZ190cigKKwlzdHJ1Y3QgdWRtYV9jaGFu ICp1Yywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2xlbiwKKwllbnVt IGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIHR4X2ZsYWdzLCB2b2lk ICpjb250ZXh0KQoreworCWVudW0gZG1hX3NsYXZlX2J1c3dpZHRoIGRldl93aWR0aDsKKwlzdHJ1 Y3Qgc2NhdHRlcmxpc3QgKnNnZW50OworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJc2l6ZV90IHRy X3NpemU7CisJc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTEgKnRyX3JlcSA9IE5VTEw7CisJdW5z aWduZWQgaW50IGk7CisJdTggZWxzaXplOworCXUzMiBidXJzdDsKKworCWlmIChkaXIgPT0gRE1B X0RFVl9UT19NRU0pIHsKKwkJZGV2X3dpZHRoID0gdWMtPmNmZy5zcmNfYWRkcl93aWR0aDsKKwkJ YnVyc3QgPSB1Yy0+Y2ZnLnNyY19tYXhidXJzdDsKKwl9IGVsc2UgaWYgKGRpciA9PSBETUFfTUVN X1RPX0RFVikgeworCQlkZXZfd2lkdGggPSB1Yy0+Y2ZnLmRzdF9hZGRyX3dpZHRoOworCQlidXJz dCA9IHVjLT5jZmcuZHN0X21heGJ1cnN0OworCX0gZWxzZSB7CisJCWRldl9lcnIodWMtPnVkLT5k ZXYsICIlczogYmFkIGRpcmVjdGlvbj9cbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJ fQorCisJLyogQnVzIHdpZHRoIHRyYW5zbGF0ZXMgdG8gdGhlIGVsZW1lbnQgc2l6ZSAoRVMpICov CisJc3dpdGNoIChkZXZfd2lkdGgpIHsKKwljYXNlIERNQV9TTEFWRV9CVVNXSURUSF8xX0JZVEU6 CisJCWVsc2l6ZSA9IFVETUFfRUxTSVpFXzg7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JV U1dJRFRIXzJfQllURVM6CisJCWVsc2l6ZSA9IFVETUFfRUxTSVpFXzE2OworCQlicmVhazsKKwlj YXNlIERNQV9TTEFWRV9CVVNXSURUSF8zX0JZVEVTOgorCQllbHNpemUgPSBVRE1BX0VMU0laRV8y NDsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfNF9CWVRFUzoKKwkJZWxzaXpl ID0gVURNQV9FTFNJWkVfMzI7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzhf QllURVM6CisJCWVsc2l6ZSA9IFVETUFfRUxTSVpFXzY0OworCQlicmVhazsKKwlkZWZhdWx0OiAv KiBub3QgcmVhY2hlZCAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAoIWJ1cnN0KQorCQli dXJzdCA9IDE7CisKKwkvKiBOb3cgYWxsb2NhdGUgYW5kIHNldHVwIHRoZSBkZXNjcmlwdG9yLiAq LworCXRyX3NpemUgPSBzaXplb2Yoc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTEpOworCWQgPSB1 ZG1hX2FsbG9jX3RyX2Rlc2ModWMsIHRyX3NpemUsIHNnbGVuLCBkaXIpOworCWlmICghZCkKKwkJ cmV0dXJuIE5VTEw7CisKKwlkLT5zZ2xlbiA9IHNnbGVuOworCisJdHJfcmVxID0gKHN0cnVjdCBj cHBpNTBfdHJfcmVxX3R5cGUxICopZC0+aHdkZXNjWzBdLnRyX3JlcV9iYXNlOworCWZvcl9lYWNo X3NnKHNnbCwgc2dlbnQsIHNnbGVuLCBpKSB7CisJCWQtPnJlc2lkdWUgKz0gc2dfZG1hX2xlbihz Z2VudCk7CisJCXRyX3JlcVtpXS5mbGFncyA9IENQUEk1MF9UUl9GTEFHU19UWVBFKDEpOworCQl0 cl9yZXFbaV0uYWRkciA9IHNnX2RtYV9hZGRyZXNzKHNnZW50KTsKKwkJdHJfcmVxW2ldLmljbnQw ID0gYnVyc3QgKiBlbHNpemVfYnl0ZXNbZWxzaXplXTsKKwkJdHJfcmVxW2ldLmRpbTEgPSBidXJz dCAqIGVsc2l6ZV9ieXRlc1tlbHNpemVdOworCQl0cl9yZXFbaV0uaWNudDEgPSBzZ19kbWFfbGVu KHNnZW50KSAvIHRyX3JlcVtpXS5pY250MDsKKworCQl0cl9yZXFbaV0uZmxhZ3MgfD0gQ1BQSTUw X1RSX0ZMQUdTX1NVUFJfRVZUOworCX0KKworCXRyX3JlcVtpIC0gMV0uZmxhZ3MgfD0gQ1BQSTUw X1RSX0ZMQUdTX0VPUDsKKworCXJldHVybiBkOworfQorCitzdGF0aWMgaW5saW5lIGludCB1ZG1h X2NvbmZpZ3VyZV9zdGF0aWN0cihzdHJ1Y3QgdWRtYV9jaGFuICp1YywKKwkJCQkJICBzdHJ1Y3Qg dWRtYV9kZXNjICpkLCB1OCBlbHNpemUsCisJCQkJCSAgdTE2IGVsY250KQoreworCWlmICghdWMt PnN0YXRpY190cl90eXBlKQorCQlyZXR1cm4gMDsKKworCWQtPnN0YXRpY190ci5lbHNpemUgPSBl bHNpemU7CisJZC0+c3RhdGljX3RyLmVsY250ID0gZWxjbnQ7CisJaWYgKHVjLT5wa3RfbW9kZSkg eworCQl1bnNpZ25lZCBpbnQgZGl2ID0gZWxzaXplX2J5dGVzW2Vsc2l6ZV0gKiBlbGNudDsKKwor CQlpZiAodWMtPmN5Y2xpYykKKwkJCWQtPnN0YXRpY190ci5ic3RjbnQgPSBkLT5yZXNpZHVlIC8g ZC0+c2dsZW4gLyBkaXY7CisJCWVsc2UKKwkJCWQtPnN0YXRpY190ci5ic3RjbnQgPSBkLT5yZXNp ZHVlIC8gZGl2OworCisJCWlmICh1Yy0+ZGlyID09IERNQV9ERVZfVE9fTUVNICYmIGQtPnN0YXRp Y190ci5ic3RjbnQgPiAweGZmZikKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCWQt PnN0YXRpY190ci5ic3RjbnQgPSAwOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3Ry dWN0IHVkbWFfZGVzYyAqdWRtYV9wcmVwX3NsYXZlX3NnX3BrdCgKKwlzdHJ1Y3QgdWRtYV9jaGFu ICp1Yywgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsIHVuc2lnbmVkIGludCBzZ2xlbiwKKwllbnVt IGRtYV90cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIHR4X2ZsYWdzLCB2b2lk ICpjb250ZXh0KQoreworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2dlbnQ7CisJc3RydWN0IGtuYXZf dWRtYXBfaG9zdF9kZXNjX3QgKmhfZGVzYyA9IE5VTEw7CisJc3RydWN0IHVkbWFfZGVzYyAqZDsK Kwl1MzIgcmluZ19pZDsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWQgPSBremFsbG9jKHNpemVvZigq ZCkgKyBzZ2xlbiAqIHNpemVvZihkLT5od2Rlc2NbMF0pLCBHRlBfQVRPTUlDKTsKKwlpZiAoIWQp CisJCXJldHVybiBOVUxMOworCisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSAmJiBzZ2xlbiA+ IDEpIHsKKwkJdm9pZCAqYnVmZmVyOworCQlpbnQgcmV0OworCQlzaXplX3QgdG90YWxfbGVuID0g MDsKKworCQkvKiBDb3VudCB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSByZWNlaXZlIFNHIGJ1ZmZl ciAqLworCQlmb3JfZWFjaF9zZyhzZ2wsIHNnZW50LCBzZ2xlbiwgaSkKKwkJCXRvdGFsX2xlbiAr PSBzZ19kbWFfbGVuKHNnZW50KTsKKworCQlidWZmZXIgPSBremFsbG9jKHRvdGFsX2xlbiwgR0ZQ X0FUT01JQyk7CisJCWlmICghYnVmZmVyKSB7CisJCQlrZnJlZShkKTsKKwkJCXJldHVybiBOVUxM OworCQl9CisKKwkJc2dfaW5pdF90YWJsZSgmZC0+cnhfc2dfd2Euc2luZ2xlX3NnLCAxKTsKKwkJ c2dfc2V0X2J1ZigmZC0+cnhfc2dfd2Euc2luZ2xlX3NnLCBidWZmZXIsIHRvdGFsX2xlbik7CisJ CXJldCA9IGRtYV9tYXBfc2codWMtPnVkLT5kZXYsICZkLT5yeF9zZ193YS5zaW5nbGVfc2csIDEs CisJCQkJIERNQV9GUk9NX0RFVklDRSk7CisJCWlmIChyZXQgIT0gMSkgeworCQkJZGV2X2Vycih1 Yy0+dWQtPmRldiwKKwkJCQkibWFwcGluZyBvZiB0ZW1wIGJ1ZmZlciBlcnJvciAoJWQpXG4iLCBy ZXQpOworCQkJa2ZyZWUoYnVmZmVyKTsKKwkJCWtmcmVlKGQpOworCQkJcmV0dXJuIE5VTEw7CisJ CX0KKworCQlkLT5yeF9zZ193YS5pbl91c2UgPSB0cnVlOworCisJCWQtPnJ4X3NnX3dhLnNnbCA9 IHNnbDsKKwkJZC0+cnhfc2dfd2Euc2dsZW4gPSBzZ2xlbjsKKwkJZC0+cnhfc2dfd2EudG90YWxf bGVuID0gdG90YWxfbGVuOworCisJCXNnbCA9ICZkLT5yeF9zZ193YS5zaW5nbGVfc2c7CisJCXNn bGVuID0gMTsKKwl9CisKKwlkLT5zZ2xlbiA9IHNnbGVuOworCWQtPmh3ZGVzY19jb3VudCA9IHNn bGVuOworCisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkKKwkJcmluZ19pZCA9IGszX25hdl9y aW5nYWNjX2dldF9yaW5nX2lkKHVjLT5yY2hhbi0+cl9yaW5nKTsKKwllbHNlCisJCXJpbmdfaWQg PSBrM19uYXZfcmluZ2FjY19nZXRfcmluZ19pZCh1Yy0+dGNoYW4tPnRjX3JpbmcpOworCisJZm9y X2VhY2hfc2coc2dsLCBzZ2VudCwgc2dsZW4sIGkpIHsKKwkJc3RydWN0IHVkbWFfaHdkZXNjICpo d2Rlc2MgPSAmZC0+aHdkZXNjW2ldOworCQlkbWFfYWRkcl90IHNnX2FkZHIgPSBzZ19kbWFfYWRk cmVzcyhzZ2VudCk7CisJCXN0cnVjdCBrbmF2X3VkbWFwX2hvc3RfZGVzY190ICpkZXNjOworCQlz aXplX3Qgc2dfbGVuID0gc2dfZG1hX2xlbihzZ2VudCk7CisKKwkJaHdkZXNjLT5jcHBpNV9kZXNj X3ZhZGRyID0gZG1hX3Bvb2xfemFsbG9jKHVjLT5oZGVzY19wb29sLAorCQkJCQkJR0ZQX0FUT01J QywKKwkJCQkJCSZod2Rlc2MtPmNwcGk1X2Rlc2NfcGFkZHIpOworCQlpZiAoIWh3ZGVzYy0+Y3Bw aTVfZGVzY192YWRkcikgeworCQkJZGV2X2Vycih1Yy0+dWQtPmRldiwKKwkJCQkiZGVzY3JpcHRv ciVkIGFsbG9jYXRpb24gZmFpbGVkXG4iLCBpKTsKKworCQkJdWRtYV9mcmVlX2h3ZGVzYygmZC0+ dmQpOworCQkJa2ZyZWUoZCk7CisJCQlyZXR1cm4gTlVMTDsKKworCQl9CisKKwkJZC0+cmVzaWR1 ZSArPSBzZ19sZW47CisJCWh3ZGVzYy0+Y3BwaTVfZGVzY19zaXplID0gdWMtPmhkZXNjX3NpemU7 CisJCWRlc2MgPSBod2Rlc2MtPmNwcGk1X2Rlc2NfdmFkZHI7CisKKwkJaWYgKGkgPT0gMCkgewor CQkJa25hdl91ZG1hcF9oZGVzY19pbml0KGRlc2MsIDAsIDApOworCQkJLyogRmxvdyBhbmQgUGFj a2VkIElEID8/PyAqLworCQkJa25hdl91ZG1hcF9oZGVzY19zZXRfcGt0aWRzKCZkZXNjLT5oZHIs IHVjLT5pZCwgMHgzZmZmKTsKKwkJCWtuYXZfdWRtYXBfZGVzY19zZXRfcmV0cG9saWN5KCZkZXNj LT5oZHIsIDAsIHJpbmdfaWQpOworCQl9IGVsc2UgeworCQkJa25hdl91ZG1hcF9oZGVzY19yZXNl dF9oYmRlc2MoZGVzYyk7CisJCQlrbmF2X3VkbWFwX2Rlc2Nfc2V0X3JldHBvbGljeSgmZGVzYy0+ aGRyLCAwLCAweGZmZmYpOworCQl9CisKKwkJLyogYXR0YWNoIHRoZSBzZyBidWZmZXIgdG8gdGhl IGRlc2NyaXB0b3IgKi8KKwkJa25hdl91ZG1hcF9oZGVzY19hdHRhY2hfYnVmKGRlc2MsCisJCQkJ CSAgICBzZ19hZGRyLCBzZ19sZW4sCisJCQkJCSAgICBzZ19hZGRyLCBzZ19sZW4pOworCisJCS8q IEF0dGFjaCBsaW5rIGFzIGhvc3QgYnVmZmVyIGRlc2NyaXB0b3IgKi8KKwkJaWYgKGhfZGVzYykK KwkJCWtuYXZfdWRtYXBfaGRlc2NfbGlua19oYmRlc2MoaF9kZXNjLAorCQkJCQkJICAgICBod2Rl c2MtPmNwcGk1X2Rlc2NfcGFkZHIpOworCisJCWhfZGVzYyA9IGRlc2M7CisJfQorCisJaWYgKGQt PnJlc2lkdWUgPj0gU1pfNE0pIHsKKwkJZGV2X2Vycih1Yy0+dWQtPmRldiwKKwkJCSIlczogVHJh bnNmZXIgc2l6ZSAldSBpcyBvdmVyIHRoZSBzdXBwb3J0ZWQgNE0gcmFuZ2VcbiIsCisJCQlfX2Z1 bmNfXywgZC0+cmVzaWR1ZSk7CisJCXVkbWFfZnJlZV9od2Rlc2MoJmQtPnZkKTsKKwkJa2ZyZWUo ZCk7CisJCXJldHVybiBOVUxMOworCX0KKworCWhfZGVzYyA9IGQtPmh3ZGVzY1swXS5jcHBpNV9k ZXNjX3ZhZGRyOworCWtuYXZfdWRtYXBfaGRlc2Nfc2V0X3BrdGxlbihoX2Rlc2MsIGQtPnJlc2lk dWUpOworCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBpbnQgdWRtYV9hdHRhY2hfbWV0YWRhdGEo c3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCXZvaWQgKmRhdGEsIHNp emVfdCBsZW4pCit7CisJc3RydWN0IHVkbWFfZGVzYyAqZCA9IHRvX3VkbWFfZGVzYyhkZXNjKTsK KwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihkZXNjLT5jaGFuKTsKKwlzdHJ1 Y3Qga25hdl91ZG1hcF9ob3N0X2Rlc2NfdCAqaF9kZXNjOworCXUzMiBwc2Rfc2l6ZSA9IGxlbjsK Kwl1MzIgZmxhZ3MgPSAwOworCisJaWYgKCF1Yy0+cGt0X21vZGUgfHwgIXVjLT5tZXRhZGF0YV9z aXplKQorCQlyZXR1cm4gLUVOT1RTVVBQOworCisJaWYgKCFkYXRhIHx8IGxlbiA+IHVjLT5tZXRh ZGF0YV9zaXplKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh1Yy0+bmVlZHNfZXBpYiAmJiBs ZW4gPCAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwloX2Rlc2MgPSBkLT5od2Rlc2NbMF0uY3Bw aTVfZGVzY192YWRkcjsKKwlpZiAoZC0+ZGlyID09IERNQV9NRU1fVE9fREVWKQorCQltZW1jcHko aF9kZXNjLT5lcGliLCBkYXRhLCBsZW4pOworCisJaWYgKHVjLT5uZWVkc19lcGliKQorCQlwc2Rf c2l6ZSAtPSAxNjsKKworCWQtPm1ldGFkYXRhID0gZGF0YTsKKwlkLT5tZXRhZGF0YV9zaXplID0g bGVuOworCWlmICh1Yy0+bmVlZHNfZXBpYikKKwkJZmxhZ3MgfD0gS05BVl9VRE1BUF9JTkZPMF9I REVTQ19FUElCX1BSRVNFTlQ7CisKKwlrbmF2X3VkbWFwX2hkZXNjX3VwZGF0ZV9mbGFncyhoX2Rl c2MsIGZsYWdzKTsKKwlrbmF2X3VkbWFwX2hkZXNjX3VwZGF0ZV9wc2RhdGFfc2l6ZShoX2Rlc2Ms IHBzZF9zaXplKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCAqdWRtYV9nZXRfbWV0 YWRhdGFfcHRyKHN0cnVjdCBkbWFfYXN5bmNfdHhfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkgICBz aXplX3QgKnBheWxvYWRfbGVuLCBzaXplX3QgKm1heF9sZW4pCit7CisJc3RydWN0IHVkbWFfZGVz YyAqZCA9IHRvX3VkbWFfZGVzYyhkZXNjKTsKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3Vk bWFfY2hhbihkZXNjLT5jaGFuKTsKKwlzdHJ1Y3Qga25hdl91ZG1hcF9ob3N0X2Rlc2NfdCAqaF9k ZXNjOworCisJaWYgKCF1Yy0+cGt0X21vZGUgfHwgIXVjLT5tZXRhZGF0YV9zaXplKQorCQlyZXR1 cm4gRVJSX1BUUigtRU5PVFNVUFApOworCisJaF9kZXNjID0gZC0+aHdkZXNjWzBdLmNwcGk1X2Rl c2NfdmFkZHI7CisKKwkqbWF4X2xlbiA9IHVjLT5tZXRhZGF0YV9zaXplOworCisJKnBheWxvYWRf bGVuID0ga25hdl91ZG1hcF9kZXNjX2lzX2VwaWJfcHJlc2VudCgmaF9kZXNjLT5oZHIpID8gMTYg OiAwOworCSpwYXlsb2FkX2xlbiArPSBrbmF2X3VkbWFwX2hkZXNjX2dldF9wc2RhdGFfc2l6ZSho X2Rlc2MpOworCisJcmV0dXJuIGhfZGVzYy0+ZXBpYjsKK30KKworc3RhdGljIGludCB1ZG1hX3Nl dF9tZXRhZGF0YV9sZW4oc3RydWN0IGRtYV9hc3luY190eF9kZXNjcmlwdG9yICpkZXNjLAorCQkJ CSBzaXplX3QgcGF5bG9hZF9sZW4pCit7CisJc3RydWN0IHVkbWFfZGVzYyAqZCA9IHRvX3VkbWFf ZGVzYyhkZXNjKTsKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihkZXNjLT5j aGFuKTsKKwlzdHJ1Y3Qga25hdl91ZG1hcF9ob3N0X2Rlc2NfdCAqaF9kZXNjOworCXUzMiBwc2Rf c2l6ZSA9IHBheWxvYWRfbGVuOworCXUzMiBmbGFncyA9IDA7CisKKwlpZiAoIXVjLT5wa3RfbW9k ZSB8fCAhdWMtPm1ldGFkYXRhX3NpemUpCisJCXJldHVybiAtRU5PVFNVUFA7CisKKwlpZiAocGF5 bG9hZF9sZW4gPiB1Yy0+bWV0YWRhdGFfc2l6ZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAo dWMtPm5lZWRzX2VwaWIgJiYgcGF5bG9hZF9sZW4gPCAxNikKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwloX2Rlc2MgPSBkLT5od2Rlc2NbMF0uY3BwaTVfZGVzY192YWRkcjsKKworCWlmICh1Yy0+bmVl ZHNfZXBpYikgeworCQlwc2Rfc2l6ZSAtPSAxNjsKKwkJZmxhZ3MgfD0gS05BVl9VRE1BUF9JTkZP MF9IREVTQ19FUElCX1BSRVNFTlQ7CisJfQorCisJa25hdl91ZG1hcF9oZGVzY191cGRhdGVfZmxh Z3MoaF9kZXNjLCBmbGFncyk7CisJa25hdl91ZG1hcF9oZGVzY191cGRhdGVfcHNkYXRhX3NpemUo aF9kZXNjLCBwc2Rfc2l6ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBkbWFf ZGVzY3JpcHRvcl9tZXRhZGF0YV9vcHMgbWV0YWRhdGFfb3BzID0geworCS5hdHRhY2ggPSB1ZG1h X2F0dGFjaF9tZXRhZGF0YSwKKwkuZ2V0X3B0ciA9IHVkbWFfZ2V0X21ldGFkYXRhX3B0ciwKKwku c2V0X2xlbiA9IHVkbWFfc2V0X21ldGFkYXRhX2xlbiwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZG1h X2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnVkbWFfcHJlcF9zbGF2ZV9zZygKKwlzdHJ1Y3QgZG1hX2No YW4gKmNoYW4sIHN0cnVjdCBzY2F0dGVybGlzdCAqc2dsLCB1bnNpZ25lZCBpbnQgc2dsZW4sCisJ ZW51bSBkbWFfdHJhbnNmZXJfZGlyZWN0aW9uIGRpciwgdW5zaWduZWQgbG9uZyB0eF9mbGFncywg dm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihj aGFuKTsKKwllbnVtIGRtYV9zbGF2ZV9idXN3aWR0aCBkZXZfd2lkdGg7CisJc3RydWN0IHVkbWFf ZGVzYyAqZDsKKwl1OCBlbHNpemU7CisJdTMyIGJ1cnN0OworCisJaWYgKGRpciAhPSB1Yy0+ZGly KSB7CisJCWRldl9lcnIoY2hhbi0+ZGV2aWNlLT5kZXYsCisJCQkiJXM6IGNoYW4lZCBpcyBmb3Ig JXMsIG5vdCBzdXBwb3J0aW5nICVzXG4iLAorCQkJX19mdW5jX18sIHVjLT5pZCwgdWRtYV9nZXRf ZGlyX3RleHQodWMtPmRpciksCisJCQl1ZG1hX2dldF9kaXJfdGV4dChkaXIpKTsKKwkJcmV0dXJu IE5VTEw7CisJfQorCisJaWYgKGRpciA9PSBETUFfREVWX1RPX01FTSkgeworCQlkZXZfd2lkdGgg PSB1Yy0+Y2ZnLnNyY19hZGRyX3dpZHRoOworCQlidXJzdCA9IHVjLT5jZmcuc3JjX21heGJ1cnN0 OworCX0gZWxzZSBpZiAoZGlyID09IERNQV9NRU1fVE9fREVWKSB7CisJCWRldl93aWR0aCA9IHVj LT5jZmcuZHN0X2FkZHJfd2lkdGg7CisJCWJ1cnN0ID0gdWMtPmNmZy5kc3RfbWF4YnVyc3Q7CisJ fSBlbHNlIHsKKwkJZGV2X2VycihjaGFuLT5kZXZpY2UtPmRldiwgIiVzOiBiYWQgZGlyZWN0aW9u P1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBCdXMgd2lkdGggdHJh bnNsYXRlcyB0byB0aGUgZWxlbWVudCBzaXplIChFUykgKi8KKwlzd2l0Y2ggKGRldl93aWR0aCkg eworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKKwkJZWxzaXplID0gVURNQV9FTFNJ WkVfODsKKwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzoKKwkJZWxz aXplID0gVURNQV9FTFNJWkVfMTY7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRI XzNfQllURVM6CisJCWVsc2l6ZSA9IFVETUFfRUxTSVpFXzI0OworCQlicmVhazsKKwljYXNlIERN QV9TTEFWRV9CVVNXSURUSF80X0JZVEVTOgorCQllbHNpemUgPSBVRE1BX0VMU0laRV8zMjsKKwkJ YnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfOF9CWVRFUzoKKwkJZWxzaXplID0gVURN QV9FTFNJWkVfNjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIG5vdCByZWFjaGVkICovCisJCXJl dHVybiBOVUxMOworCX0KKworCWlmICghYnVyc3QpCisJCWJ1cnN0ID0gMTsKKworCWlmICh1Yy0+ cGt0X21vZGUpCisJCWQgPSB1ZG1hX3ByZXBfc2xhdmVfc2dfcGt0KHVjLCBzZ2wsIHNnbGVuLCBk aXIsIHR4X2ZsYWdzLAorCQkJCQkgICBjb250ZXh0KTsKKwllbHNlCisJCWQgPSB1ZG1hX3ByZXBf c2xhdmVfc2dfdHIodWMsIHNnbCwgc2dsZW4sIGRpciwgdHhfZmxhZ3MsCisJCQkJCSAgY29udGV4 dCk7CisKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCisJZC0+ZGlyID0gZGlyOworCWQtPmRl c2NfaWR4ID0gMDsKKwlkLT50cl9pZHggPSAwOworCisJLyogc3RhdGljIFRSIGZvciByZW1vdGUg UERNQSAqLworCWlmICh1ZG1hX2NvbmZpZ3VyZV9zdGF0aWN0cih1YywgZCwgZWxzaXplLCBidXJz dCkpIHsKKwkJZGV2X2Vycih1Yy0+dWQtPmRldiwKKwkJCSIlczogU3RhdGljVFIgWiBpcyBsaW10 ZWQgdG8gbWF4aW11bSA0MDk1ICgldSlcbiIsCisJCQlfX2Z1bmNfXywgZC0+c3RhdGljX3RyLmJz dGNudCk7CisKKwkJdWRtYV9mcmVlX2h3ZGVzYygmZC0+dmQpOworCQlrZnJlZShkKTsKKwkJcmV0 dXJuIE5VTEw7CisJfQorCisJaWYgKHVjLT5tZXRhZGF0YV9zaXplKQorCQlkLT52ZC50eC5tZXRh ZGF0YV9vcHMgPSAmbWV0YWRhdGFfb3BzOworCisJcmV0dXJuIHZjaGFuX3R4X3ByZXAoJnVjLT52 YywgJmQtPnZkLCB0eF9mbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWRtYV9kZXNjICp1ZG1h X3ByZXBfZG1hX2N5Y2xpY190cigKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YywgZG1hX2FkZHJfdCBi dWZfYWRkciwgc2l6ZV90IGJ1Zl9sZW4sCisJc2l6ZV90IHBlcmlvZF9sZW4sIGVudW0gZG1hX3Ry YW5zZmVyX2RpcmVjdGlvbiBkaXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJZW51bSBkbWFf c2xhdmVfYnVzd2lkdGggZGV2X3dpZHRoOworCXN0cnVjdCB1ZG1hX2Rlc2MgKmQ7CisJc2l6ZV90 IHRyX3NpemU7CisJc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTEgKnRyX3JlcTsKKwl1bnNpZ25l ZCBpbnQgaTsKKwl1bnNpZ25lZCBpbnQgcGVyaW9kcyA9IGJ1Zl9sZW4gLyBwZXJpb2RfbGVuOwor CXUzMiBidXJzdDsKKworCWlmIChkaXIgPT0gRE1BX0RFVl9UT19NRU0pIHsKKwkJZGV2X3dpZHRo ID0gdWMtPmNmZy5zcmNfYWRkcl93aWR0aDsKKwkJYnVyc3QgPSB1Yy0+Y2ZnLnNyY19tYXhidXJz dDsKKwl9IGVsc2UgaWYgKGRpciA9PSBETUFfTUVNX1RPX0RFVikgeworCQlkZXZfd2lkdGggPSB1 Yy0+Y2ZnLmRzdF9hZGRyX3dpZHRoOworCQlidXJzdCA9IHVjLT5jZmcuZHN0X21heGJ1cnN0Owor CX0gZWxzZSB7CisJCWRldl9lcnIodWMtPnVkLT5kZXYsICIlczogYmFkIGRpcmVjdGlvbj9cbiIs IF9fZnVuY19fKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFidXJzdCkKKwkJYnVyc3Qg PSAxOworCisJLyogTm93IGFsbG9jYXRlIGFuZCBzZXR1cCB0aGUgZGVzY3JpcHRvci4gKi8KKwl0 cl9zaXplID0gc2l6ZW9mKHN0cnVjdCBjcHBpNTBfdHJfcmVxX3R5cGUxKTsKKwlkID0gdWRtYV9h bGxvY190cl9kZXNjKHVjLCB0cl9zaXplLCBwZXJpb2RzLCBkaXIpOworCWlmICghZCkKKwkJcmV0 dXJuIE5VTEw7CisKKwl0cl9yZXEgPSAoc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTEgKilkLT5o d2Rlc2NbMF0udHJfcmVxX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IHBlcmlvZHM7IGkrKykgewor CQl0cl9yZXFbaV0uZmxhZ3MgPSBDUFBJNTBfVFJfRkxBR1NfVFlQRSgxKTsKKwkJdHJfcmVxW2ld LmFkZHIgPSBidWZfYWRkciArIHBlcmlvZF9sZW4gKiBpOworCQl0cl9yZXFbaV0uaWNudDAgPSBk ZXZfd2lkdGg7CisJCXRyX3JlcVtpXS5pY250MSA9IHBlcmlvZF9sZW4gLyBkZXZfd2lkdGg7CisJ CXRyX3JlcVtpXS5kaW0xID0gZGV2X3dpZHRoOworCisJCWlmICghKGZsYWdzICYgRE1BX1BSRVBf SU5URVJSVVBUKSkKKwkJCXRyX3JlcVtpXS5mbGFncyB8PSBDUFBJNTBfVFJfRkxBR1NfU1VQUl9F VlQ7CisJfQorCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdWRtYV9kZXNjICp1ZG1h X3ByZXBfZG1hX2N5Y2xpY19wa3QoCisJc3RydWN0IHVkbWFfY2hhbiAqdWMsIGRtYV9hZGRyX3Qg YnVmX2FkZHIsIHNpemVfdCBidWZfbGVuLAorCXNpemVfdCBwZXJpb2RfbGVuLCBlbnVtIGRtYV90 cmFuc2Zlcl9kaXJlY3Rpb24gZGlyLCB1bnNpZ25lZCBsb25nIGZsYWdzKQoreworCXN0cnVjdCB1 ZG1hX2Rlc2MgKmQ7CisJdTMyIHJpbmdfaWQ7CisJaW50IGk7CisJaW50IHBlcmlvZHMgPSBidWZf bGVuIC8gcGVyaW9kX2xlbjsKKworCWlmIChwZXJpb2RzID4gMTUpCisJCXJldHVybiBOVUxMOwor CisJaWYgKHBlcmlvZF9sZW4gPiAweDNGRkZGRikKKwkJcmV0dXJuIE5VTEw7CisKKwlkID0ga3ph bGxvYyhzaXplb2YoKmQpICsgcGVyaW9kcyAqIHNpemVvZihkLT5od2Rlc2NbMF0pLCBHRlBfQVRP TUlDKTsKKwlpZiAoIWQpCisJCXJldHVybiBOVUxMOworCisJZC0+aHdkZXNjX2NvdW50ID0gcGVy aW9kczsKKworCS8qIFRPRE86IHJlLWNoZWNrIHRoaXMuLi4gKi8KKwlpZiAoZGlyID09IERNQV9E RVZfVE9fTUVNKQorCQlyaW5nX2lkID0gazNfbmF2X3JpbmdhY2NfZ2V0X3JpbmdfaWQodWMtPnJj aGFuLT5yX3JpbmcpOworCWVsc2UKKwkJcmluZ19pZCA9IGszX25hdl9yaW5nYWNjX2dldF9yaW5n X2lkKHVjLT50Y2hhbi0+dGNfcmluZyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGVyaW9kczsgaSsr KSB7CisJCXN0cnVjdCB1ZG1hX2h3ZGVzYyAqaHdkZXNjID0gJmQtPmh3ZGVzY1tpXTsKKwkJZG1h X2FkZHJfdCBwZXJpb2RfYWRkciA9IGJ1Zl9hZGRyICsgKHBlcmlvZF9sZW4gKiBpKTsKKwkJc3Ry dWN0IGtuYXZfdWRtYXBfaG9zdF9kZXNjX3QgKmhfZGVzYzsKKworCQlod2Rlc2MtPmNwcGk1X2Rl c2NfdmFkZHIgPSBkbWFfcG9vbF96YWxsb2ModWMtPmhkZXNjX3Bvb2wsCisJCQkJCQlHRlBfQVRP TUlDLAorCQkJCQkJJmh3ZGVzYy0+Y3BwaTVfZGVzY19wYWRkcik7CisJCWlmICghaHdkZXNjLT5j cHBpNV9kZXNjX3ZhZGRyKSB7CisJCQlkZXZfZXJyKHVjLT51ZC0+ZGV2LAorCQkJCSJkZXNjcmlw dG9yJWQgYWxsb2NhdGlvbiBmYWlsZWRcbiIsIGkpOworCisJCQl1ZG1hX2ZyZWVfaHdkZXNjKCZk LT52ZCk7CisJCQlrZnJlZShkKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisKKwkJaHdkZXNjLT5j cHBpNV9kZXNjX3NpemUgPSB1Yy0+aGRlc2Nfc2l6ZTsKKwkJaF9kZXNjID0gaHdkZXNjLT5jcHBp NV9kZXNjX3ZhZGRyOworCisJCWtuYXZfdWRtYXBfaGRlc2NfaW5pdChoX2Rlc2MsIDAsIDApOwor CQlrbmF2X3VkbWFwX2hkZXNjX3NldF9wa3RsZW4oaF9kZXNjLCBwZXJpb2RfbGVuKTsKKworCQkv KiBGbG93IGFuZCBQYWNrZWQgSUQgPz8/ICovCisJCWtuYXZfdWRtYXBfaGRlc2Nfc2V0X3BrdGlk cygmaF9kZXNjLT5oZHIsIHVjLT5pZCwgMHgzZmZmKTsKKwkJa25hdl91ZG1hcF9kZXNjX3NldF9y ZXRwb2xpY3koJmhfZGVzYy0+aGRyLCAwLCByaW5nX2lkKTsKKworCQkvKiBhdHRhY2ggZWFjaCBw ZXJpb2QgdG8gYSBuZXcgZGVzY3JpcHRvciAqLworCQlrbmF2X3VkbWFwX2hkZXNjX2F0dGFjaF9i dWYoaF9kZXNjLAorCQkJCQkgICAgcGVyaW9kX2FkZHIsIHBlcmlvZF9sZW4sCisJCQkJCSAgICBw ZXJpb2RfYWRkciwgcGVyaW9kX2xlbik7CisJfQorCisJcmV0dXJuIGQ7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgZG1hX2FzeW5jX3R4X2Rlc2NyaXB0b3IgKnVkbWFfcHJlcF9kbWFfY3ljbGljKAorCXN0 cnVjdCBkbWFfY2hhbiAqY2hhbiwgZG1hX2FkZHJfdCBidWZfYWRkciwgc2l6ZV90IGJ1Zl9sZW4s CisJc2l6ZV90IHBlcmlvZF9sZW4sIGVudW0gZG1hX3RyYW5zZmVyX2RpcmVjdGlvbiBkaXIsIHVu c2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJc3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2No YW4oY2hhbik7CisJZW51bSBkbWFfc2xhdmVfYnVzd2lkdGggZGV2X3dpZHRoOworCXN0cnVjdCB1 ZG1hX2Rlc2MgKmQ7CisJdTggZWxzaXplOworCXUzMiBidXJzdDsKKworCWlmIChkaXIgIT0gdWMt PmRpcikgeworCQlkZXZfZXJyKGNoYW4tPmRldmljZS0+ZGV2LAorCQkJIiVzOiBjaGFuJWQgaXMg Zm9yICVzLCBub3Qgc3VwcG9ydGluZyAlc1xuIiwKKwkJCV9fZnVuY19fLCB1Yy0+aWQsIHVkbWFf Z2V0X2Rpcl90ZXh0KHVjLT5kaXIpLAorCQkJdWRtYV9nZXRfZGlyX3RleHQoZGlyKSk7CisJCXJl dHVybiBOVUxMOworCX0KKworCXVjLT5jeWNsaWMgPSB0cnVlOworCisJaWYgKGRpciA9PSBETUFf REVWX1RPX01FTSkgeworCQlkZXZfd2lkdGggPSB1Yy0+Y2ZnLnNyY19hZGRyX3dpZHRoOworCQli dXJzdCA9IHVjLT5jZmcuc3JjX21heGJ1cnN0OworCX0gZWxzZSBpZiAoZGlyID09IERNQV9NRU1f VE9fREVWKSB7CisJCWRldl93aWR0aCA9IHVjLT5jZmcuZHN0X2FkZHJfd2lkdGg7CisJCWJ1cnN0 ID0gdWMtPmNmZy5kc3RfbWF4YnVyc3Q7CisJfSBlbHNlIHsKKwkJZGV2X2Vycih1Yy0+dWQtPmRl diwgIiVzOiBiYWQgZGlyZWN0aW9uP1xuIiwgX19mdW5jX18pOworCQlyZXR1cm4gTlVMTDsKKwl9 CisKKwlpZiAoIWJ1cnN0KQorCQlidXJzdCA9IDE7CisKKwkvKiBCdXMgd2lkdGggdHJhbnNsYXRl cyB0byB0aGUgZWxlbWVudCBzaXplIChFUykgKi8KKwlzd2l0Y2ggKGRldl93aWR0aCkgeworCWNh c2UgRE1BX1NMQVZFX0JVU1dJRFRIXzFfQllURToKKwkJZWxzaXplID0gVURNQV9FTFNJWkVfODsK KwkJYnJlYWs7CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfMl9CWVRFUzoKKwkJZWxzaXplID0g VURNQV9FTFNJWkVfMTY7CisJCWJyZWFrOworCWNhc2UgRE1BX1NMQVZFX0JVU1dJRFRIXzNfQllU RVM6CisJCWVsc2l6ZSA9IFVETUFfRUxTSVpFXzI0OworCQlicmVhazsKKwljYXNlIERNQV9TTEFW RV9CVVNXSURUSF80X0JZVEVTOgorCQllbHNpemUgPSBVRE1BX0VMU0laRV8zMjsKKwkJYnJlYWs7 CisJY2FzZSBETUFfU0xBVkVfQlVTV0lEVEhfOF9CWVRFUzoKKwkJZWxzaXplID0gVURNQV9FTFNJ WkVfNjQ7CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIG5vdCByZWFjaGVkICovCisJCXJldHVybiBO VUxMOworCX0KKworCWlmICh1Yy0+cGt0X21vZGUpCisJCWQgPSB1ZG1hX3ByZXBfZG1hX2N5Y2xp Y19wa3QodWMsIGJ1Zl9hZGRyLCBidWZfbGVuLCBwZXJpb2RfbGVuLAorCQkJCQkgICAgIGRpciwg ZmxhZ3MpOworCWVsc2UKKwkJZCA9IHVkbWFfcHJlcF9kbWFfY3ljbGljX3RyKHVjLCBidWZfYWRk ciwgYnVmX2xlbiwgcGVyaW9kX2xlbiwKKwkJCQkJICAgIGRpciwgZmxhZ3MpOworCisJaWYgKCFk KQorCQlyZXR1cm4gTlVMTDsKKworCWQtPnNnbGVuID0gYnVmX2xlbiAvIHBlcmlvZF9sZW47CisK KwlkLT5kaXIgPSBkaXI7CisJZC0+cmVzaWR1ZSA9IGJ1Zl9sZW47CisKKwkvKiBzdGF0aWMgVFIg Zm9yIHJlbW90ZSBQRE1BICovCisJaWYgKHVkbWFfY29uZmlndXJlX3N0YXRpY3RyKHVjLCBkLCBl bHNpemUsIGJ1cnN0KSkgeworCQlkZXZfZXJyKHVjLT51ZC0+ZGV2LAorCQkJIiVzOiBTdGF0aWNU UiBaIGlzIGxpbXRlZCB0byBtYXhpbXVtIDQwOTUgKCV1KVxuIiwKKwkJCV9fZnVuY19fLCBkLT5z dGF0aWNfdHIuYnN0Y250KTsKKworCQl1ZG1hX2ZyZWVfaHdkZXNjKCZkLT52ZCk7CisJCWtmcmVl KGQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAodWMtPm1ldGFkYXRhX3NpemUpCisJCWQt PnZkLnR4Lm1ldGFkYXRhX29wcyA9ICZtZXRhZGF0YV9vcHM7CisKKwlyZXR1cm4gdmNoYW5fdHhf cHJlcCgmdWMtPnZjLCAmZC0+dmQsIGZsYWdzKTsKK30KKworc3RhdGljIHN0cnVjdCBkbWFfYXN5 bmNfdHhfZGVzY3JpcHRvciAqdWRtYV9wcmVwX2RtYV9tZW1jcHkoCisJc3RydWN0IGRtYV9jaGFu ICpjaGFuLCBkbWFfYWRkcl90IGRlc3QsIGRtYV9hZGRyX3Qgc3JjLAorCXNpemVfdCBsZW4sIHVu c2lnbmVkIGxvbmcgdHhfZmxhZ3MpCit7CisJc3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1h X2NoYW4oY2hhbik7CisJc3RydWN0IHVkbWFfZGVzYyAqZDsKKwlzdHJ1Y3QgY3BwaTUwX3RyX3Jl cV90eXBlMTUgKnRyX3JlcTsKKwlpbnQgbnVtX3RyOworCXNpemVfdCB0cl9zaXplID0gc2l6ZW9m KHN0cnVjdCBjcHBpNTBfdHJfcmVxX3R5cGUxNSk7CisJdTE2IHRyMF9jbnQwLCB0cjBfY250MSwg dHIxX2NudDA7CisKKwlpZiAodWMtPmRpciAhPSBETUFfTUVNX1RPX01FTSkgeworCQlkZXZfZXJy KGNoYW4tPmRldmljZS0+ZGV2LAorCQkJIiVzOiBjaGFuJWQgaXMgZm9yICVzLCBub3Qgc3VwcG9y dGluZyAlc1xuIiwKKwkJCV9fZnVuY19fLCB1Yy0+aWQsIHVkbWFfZ2V0X2Rpcl90ZXh0KHVjLT5k aXIpLAorCQkJdWRtYV9nZXRfZGlyX3RleHQoRE1BX01FTV9UT19NRU0pKTsKKwkJcmV0dXJuIE5V TEw7CisJfQorCisJaWYgKGxlbiA8IFNaXzY0SykgeworCQludW1fdHIgPSAxOworCQl0cjBfY250 MCA9IGxlbjsKKwkJdHIwX2NudDEgPSAxOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGxvbmcgYWxp Z25fdG8gPSBfX2ZmcyhzcmMgfCBkZXN0KTsKKworCQlpZiAoYWxpZ25fdG8gPiAzKQorCQkJYWxp Z25fdG8gPSAzOworCQkvKgorCQkgKiBLZWVwIHNpbXBsZTogdHIwOiBTWl82NEstYWxpZ25tZW50 IGJsb2NrcywKKwkJICoJCXRyMTogdGhlIHJlbWFpbmluZworCQkgKi8KKwkJbnVtX3RyID0gMjsK KwkJdHIwX2NudDAgPSAoU1pfNjRLIC0gQklUKGFsaWduX3RvKSk7CisJCWlmIChsZW4gLyB0cjBf Y250MCA+PSBTWl82NEspIHsKKwkJCWRldl9lcnIodWMtPnVkLT5kZXYsICJzaXplICV6dSBpcyBu b3Qgc3VwcG9ydGVkXG4iLAorCQkJCWxlbik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCXRy MF9jbnQxID0gbGVuIC8gdHIwX2NudDA7CisJCXRyMV9jbnQwID0gbGVuICUgdHIwX2NudDA7CisJ fQorCisJZCA9IHVkbWFfYWxsb2NfdHJfZGVzYyh1YywgdHJfc2l6ZSwgbnVtX3RyLCBETUFfTUVN X1RPX01FTSk7CisJaWYgKCFkKQorCQlyZXR1cm4gTlVMTDsKKworCWQtPmRpciA9IERNQV9NRU1f VE9fTUVNOworCWQtPmRlc2NfaWR4ID0gMDsKKwlkLT50cl9pZHggPSAwOworCWQtPnJlc2lkdWUg PSBsZW47CisKKwl0cl9yZXEgPSAoc3RydWN0IGNwcGk1MF90cl9yZXFfdHlwZTE1ICopZC0+aHdk ZXNjWzBdLnRyX3JlcV9iYXNlOworCisJdHJfcmVxWzBdLmZsYWdzID0gQ1BQSTUwX1RSX0ZMQUdT X1RZUEUoMTUpOworCXRyX3JlcVswXS5hZGRyID0gc3JjOworCXRyX3JlcVswXS5pY250MCA9IHRy MF9jbnQwOworCXRyX3JlcVswXS5pY250MSA9IHRyMF9jbnQxOworCXRyX3JlcVswXS5pY250MiA9 IDE7CisJdHJfcmVxWzBdLmljbnQzID0gMTsKKwl0cl9yZXFbMF0uZGltMSA9IHRyMF9jbnQwOwor CisJdHJfcmVxWzBdLmRhZGRyID0gZGVzdDsKKwl0cl9yZXFbMF0uZGljbnQwID0gdHIwX2NudDA7 CisJdHJfcmVxWzBdLmRpY250MSA9IHRyMF9jbnQxOworCXRyX3JlcVswXS5kaWNudDIgPSAxOwor CXRyX3JlcVswXS5kaWNudDMgPSAxOworCXRyX3JlcVswXS5kZGltMSA9IHRyMF9jbnQwOworCisJ dHJfcmVxWzBdLmZsYWdzIHw9IENQUEk1MF9UUl9GTEFHU19XQUlUOworCisJdHJfcmVxWzBdLmZs YWdzIHw9IENQUEk1MF9UUl9GTEFHU19TVVBSX0VWVDsKKworCWlmIChudW1fdHIgPT0gMikgewor CQl0cl9yZXFbMV0uZmxhZ3MgPSBDUFBJNTBfVFJfRkxBR1NfVFlQRSgxNSk7CisJCXRyX3JlcVsx XS5hZGRyID0gc3JjICsgdHIwX2NudDEgKiB0cjBfY250MDsKKwkJdHJfcmVxWzFdLmljbnQwID0g dHIxX2NudDA7CisJCXRyX3JlcVsxXS5pY250MSA9IDE7CisJCXRyX3JlcVsxXS5pY250MiA9IDE7 CisJCXRyX3JlcVsxXS5pY250MyA9IDE7CisKKwkJdHJfcmVxWzFdLmRhZGRyID0gZGVzdCArIHRy MF9jbnQxICogdHIwX2NudDA7CisJCXRyX3JlcVsxXS5kaWNudDAgPSB0cjFfY250MDsKKwkJdHJf cmVxWzFdLmRpY250MSA9IDE7CisJCXRyX3JlcVsxXS5kaWNudDIgPSAxOworCQl0cl9yZXFbMV0u ZGljbnQzID0gMTsKKworCQl0cl9yZXFbMV0uZmxhZ3MgfD0gQ1BQSTUwX1RSX0ZMQUdTX1dBSVQ7 CisKKwkJdHJfcmVxWzFdLmZsYWdzIHw9IENQUEk1MF9UUl9GTEFHU19TVVBSX0VWVDsKKwl9CisK Kwl0cl9yZXFbbnVtX3RyIC0gMV0uZmxhZ3MgfD0gQ1BQSTUwX1RSX0ZMQUdTX0VPUDsKKworCWlm ICh1Yy0+bWV0YWRhdGFfc2l6ZSkKKwkJZC0+dmQudHgubWV0YWRhdGFfb3BzID0gJm1ldGFkYXRh X29wczsKKworCXJldHVybiB2Y2hhbl90eF9wcmVwKCZ1Yy0+dmMsICZkLT52ZCwgdHhfZmxhZ3Mp OworfQorCitzdGF0aWMgdm9pZCB1ZG1hX2lzc3VlX3BlbmRpbmcoc3RydWN0IGRtYV9jaGFuICpj aGFuKQoreworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWMtPnZjLmxvY2ssIGZs YWdzKTsKKworCS8qIElmIHdlIGhhdmUgc29tZXRoaW5nIHBlbmRpbmcgYW5kIG5vIGFjdGl2ZSBk ZXNjcmlwdG9yLCB0aGVuICovCisJaWYgKHZjaGFuX2lzc3VlX3BlbmRpbmcoJnVjLT52YykgJiYg IXVjLT5kZXNjKSB7CisJCS8qCisJCSAqIHN0YXJ0IGEgZGVzY3JpcHRvciBpZiB0aGUgY2hhbm5l bCBpcyBOT1QgW21hcmtlZCBhcworCQkgKiB0ZXJtaW5hdGluZyBfYW5kXyBpdCBpcyBzdGlsbCBy dW5uaW5nICh0ZWFyZG93biBoYXMgbm90CisJCSAqIGNvbXBsZXRlZCB5ZXQpXS4KKwkJICovCisJ CWlmICghKHVjLT5zdGF0ZSA9PSBVRE1BX0NIQU5fSVNfVEVSTUlOQVRJTkcgJiYKKwkJICAgICAg dWRtYV9pc19jaGFuX3J1bm5pbmcodWMpKSkKKwkJCXVkbWFfc3RhcnQodWMpOworCX0KKworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjLT52Yy5sb2NrLCBmbGFncyk7Cit9CisKKy8qIE5vdCBt dWNoIHlldCAqLworc3RhdGljIGVudW0gZG1hX3N0YXR1cyB1ZG1hX3R4X3N0YXR1cyhzdHJ1Y3Qg ZG1hX2NoYW4gKmNoYW4sCisJCQkJICAgICAgZG1hX2Nvb2tpZV90IGNvb2tpZSwKKwkJCQkgICAg ICBzdHJ1Y3QgZG1hX3R4X3N0YXRlICp0eHN0YXRlKQoreworCXN0cnVjdCB1ZG1hX2NoYW4gKnVj ID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCWVudW0gZG1hX3N0YXR1cyByZXQ7CisKKwlyZXQgPSBk bWFfY29va2llX3N0YXR1cyhjaGFuLCBjb29raWUsIHR4c3RhdGUpOworCisJaWYgKCF1ZG1hX2lz X2NoYW5fcnVubmluZyh1YykpCisJCXJldCA9IERNQV9DT01QTEVURTsKKworCWlmIChyZXQgPT0g RE1BX0NPTVBMRVRFIHx8ICF0eHN0YXRlKQorCQlyZXR1cm4gcmV0OworCisJaWYgKHVjLT5kZXNj ICYmIHVjLT5kZXNjLT52ZC50eC5jb29raWUgPT0gY29va2llKSB7CisJCXUzMiBwZG1hX2JjbnQg PSAwOworCQl1MzIgYmNudCA9IDA7CisJCXUzMiBwY250ID0gMDsKKwkJdTMyIHJlc2lkdWUgPSB1 Yy0+ZGVzYy0+cmVzaWR1ZTsKKwkJdTMyIGRlbGF5ID0gMDsKKworCQlpZiAodWMtPmRlc2MtPmRp ciA9PSBETUFfTUVNX1RPX0RFVikgeworCQkJYmNudCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50 Y2hhbiwKKwkJCQkJCSBVRE1BX1RDSEFOX1JUX0JDTlRfUkVHKTsKKwkJCXBkbWFfYmNudCA9IHVk bWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwKKwkJCQkJCVVETUFfVENIQU5fUlRfUEVFUl9CQ05U X1JFRyk7CisJCQlwY250ID0gdWRtYV90Y2hhbnJ0X3JlYWQodWMtPnRjaGFuLAorCQkJCQkJIFVE TUFfVENIQU5fUlRfUENOVF9SRUcpOworCisJCQlpZiAoYmNudCA+IHBkbWFfYmNudCkKKwkJCQlk ZWxheSA9IGJjbnQgLSBwZG1hX2JjbnQ7CisJCX0gZWxzZSBpZiAodWMtPmRlc2MtPmRpciA9PSBE TUFfREVWX1RPX01FTSkgeworCQkJYmNudCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwK KwkJCQkJCSBVRE1BX1JDSEFOX1JUX1NCQ05UX1JFRyk7CisJCQlwZG1hX2JjbnQgPSB1ZG1hX3Jj aGFucnRfcmVhZCh1Yy0+cmNoYW4sCisJCQkJCQlVRE1BX1JDSEFOX1JUX1BFRVJfQkNOVF9SRUcp OworCQkJcGNudCA9IHVkbWFfcmNoYW5ydF9yZWFkKHVjLT5yY2hhbiwKKwkJCQkJCSBVRE1BX1JD SEFOX1JUX1BDTlRfUkVHKTsKKworCQkJaWYgKHBkbWFfYmNudCA+IGJjbnQpCisJCQkJZGVsYXkg PSBwZG1hX2JjbnQgLSBiY250OworCQl9IGVsc2UgeworCQkJdTMyIHNiY250OworCisJCQlzYmNu dCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwKKwkJCQkJCSAgVURNQV9UQ0hBTl9SVF9T QkNOVF9SRUcpOworCQkJYmNudCA9IHVkbWFfdGNoYW5ydF9yZWFkKHVjLT50Y2hhbiwKKwkJCQkJ CSBVRE1BX1RDSEFOX1JUX1BFRVJfQkNOVF9SRUcpOworCQkJcGNudCA9IHVkbWFfdGNoYW5ydF9y ZWFkKHVjLT50Y2hhbiwKKwkJCQkJCSBVRE1BX1RDSEFOX1JUX1BDTlRfUkVHKTsKKworCQkJaWYg KHNiY250ID4gYmNudCkKKwkJCQlkZWxheSA9IHNiY250IC0gYmNudDsKKwkJfQorCisJCXJlc2lk dWUgLT0gKChiY250IC0gdWMtPmJjbnQpICUgdWMtPmRlc2MtPnJlc2lkdWUpOworCQlkbWFfc2V0 X3Jlc2lkdWUodHhzdGF0ZSwgcmVzaWR1ZSk7CisJCWRtYV9zZXRfY2FjaGVkKHR4c3RhdGUsIGRl bGF5KTsKKworCX0gZWxzZSB7CisJCXJldCA9IERNQV9DT01QTEVURTsKKwl9CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW50IHVkbWFfcGF1c2Uoc3RydWN0IGRtYV9jaGFuICpjaGFuKQor eworCXN0cnVjdCB1ZG1hX2NoYW4gKnVjID0gdG9fdWRtYV9jaGFuKGNoYW4pOworCisJaWYgKCF1 Yy0+ZGVzYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBwYXVzZSB0aGUgY2hhbm5lbCAqLwor CXN3aXRjaCAodWMtPmRlc2MtPmRpcikgeworCWNhc2UgRE1BX0RFVl9UT19NRU06CisJCXVkbWFf cmNoYW5ydF91cGRhdGVfYml0cyh1Yy0+cmNoYW4sCisJCQkJCSBVRE1BX1JDSEFOX1JUX1BFRVJf UlRfRU5fUkVHLAorCQkJCQkgVURNQV9QRUVSX1JUX0VOX1BBVVNFLAorCQkJCQkgVURNQV9QRUVS X1JUX0VOX1BBVVNFKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfTUVNX1RPX0RFVjoKKwkJdWRtYV90 Y2hhbnJ0X3VwZGF0ZV9iaXRzKHVjLT50Y2hhbiwKKwkJCQkJIFVETUFfVENIQU5fUlRfUEVFUl9S VF9FTl9SRUcsCisJCQkJCSBVRE1BX1BFRVJfUlRfRU5fUEFVU0UsCisJCQkJCSBVRE1BX1BFRVJf UlRfRU5fUEFVU0UpOworCQlicmVhazsKKwljYXNlIERNQV9NRU1fVE9fTUVNOgorCQl1ZG1hX3Rj aGFucnRfdXBkYXRlX2JpdHModWMtPnRjaGFuLCBVRE1BX1RDSEFOX1JUX0NUTF9SRUcsCisJCQkJ CSBVRE1BX0NIQU5fUlRfQ1RMX1BBVVNFLAorCQkJCQkgVURNQV9DSEFOX1JUX0NUTF9QQVVTRSk7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IHVkbWFfcmVzdW1lKHN0cnVjdCBkbWFfY2hhbiAqY2hhbikKK3sK KwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihjaGFuKTsKKworCWlmICghdWMt PmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogcmVzdW1lIHRoZSBjaGFubmVsICovCisJ c3dpdGNoICh1Yy0+ZGVzYy0+ZGlyKSB7CisJY2FzZSBETUFfREVWX1RPX01FTToKKwkJdWRtYV9y Y2hhbnJ0X3VwZGF0ZV9iaXRzKHVjLT5yY2hhbiwKKwkJCQkJIFVETUFfUkNIQU5fUlRfUEVFUl9S VF9FTl9SRUcsCisJCQkJCSBVRE1BX1BFRVJfUlRfRU5fUEFVU0UsIDApOworCisJCWJyZWFrOwor CWNhc2UgRE1BX01FTV9UT19ERVY6CisJCXVkbWFfdGNoYW5ydF91cGRhdGVfYml0cyh1Yy0+dGNo YW4sCisJCQkJCSBVRE1BX1RDSEFOX1JUX1BFRVJfUlRfRU5fUkVHLAorCQkJCQkgVURNQV9QRUVS X1JUX0VOX1BBVVNFLCAwKTsKKwkJYnJlYWs7CisJY2FzZSBETUFfTUVNX1RPX01FTToKKwkJdWRt YV90Y2hhbnJ0X3VwZGF0ZV9iaXRzKHVjLT50Y2hhbiwgVURNQV9UQ0hBTl9SVF9DVExfUkVHLAor CQkJCQkgVURNQV9DSEFOX1JUX0NUTF9QQVVTRSwgMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJ CXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHVkbWFf dGVybWluYXRlX2FsbChzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4pCit7CisJc3RydWN0IHVkbWFfY2hh biAqdWMgPSB0b191ZG1hX2NoYW4oY2hhbik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlMSVNU X0hFQUQoaGVhZCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdWMtPnZjLmxvY2ssIGZsYWdzKTsK KworCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpCisJCXVkbWFfc3RvcCh1Yyk7CisKKwlp ZiAodWMtPmRlc2MpIHsKKwkJdWMtPnRlcm1pbmF0ZWRfZGVzYyA9IHVjLT5kZXNjOworCQl1Yy0+ ZGVzYyA9IE5VTEw7CisJCXVjLT50ZXJtaW5hdGVkX2Rlc2MtPnRlcm1pbmF0ZWQgPSB0cnVlOwor CX0KKworCXVjLT5wYXVzZWQgPSBmYWxzZTsKKworCXZjaGFuX2dldF9hbGxfZGVzY3JpcHRvcnMo JnVjLT52YywgJmhlYWQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnVjLT52Yy5sb2NrLCBm bGFncyk7CisJdmNoYW5fZG1hX2Rlc2NfZnJlZV9saXN0KCZ1Yy0+dmMsICZoZWFkKTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgdm9pZCB1ZG1hX3N5bmNocm9uaXplKHN0cnVjdCBkbWFfY2hh biAqY2hhbikKK3sKKwlzdHJ1Y3QgdWRtYV9jaGFuICp1YyA9IHRvX3VkbWFfY2hhbihjaGFuKTsK Kwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBtc2Vjc190b19qaWZmaWVzKDEwMDApOworCisJdmNo YW5fc3luY2hyb25pemUoJnVjLT52Yyk7CisKKwlpZiAodWMtPnN0YXRlID09IFVETUFfQ0hBTl9J U19URVJNSU5BVElORykgeworCQl0aW1lb3V0ID0gd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0 KCZ1Yy0+dGVhcmRvd25fY29tcGxldGVkLAorCQkJCQkJICAgICAgdGltZW91dCk7CisJCWlmICgh dGltZW91dCkgeworCQkJZGV2X3dhcm4odWMtPnVkLT5kZXYsICJjaGFuJWQgdGVhcmRvd24gdGlt ZW91dCFcbiIsCisJCQkJIHVjLT5pZCk7CisJCQl1ZG1hX2R1bXBfY2hhbl9zdGRhdGEodWMpOwor CQkJdWRtYV9yZXNldF9jaGFuKHVjLCB0cnVlKTsKKwkJfQorCX0KKworCXVkbWFfcmVzZXRfY2hh bih1YywgZmFsc2UpOworCWlmICh1ZG1hX2lzX2NoYW5fcnVubmluZyh1YykpCisJCWRldl93YXJu KHVjLT51ZC0+ZGV2LCAiY2hhbiVkIHJlZnVzZWQgdG8gc3RvcCFcbiIsIHVjLT5pZCk7CisKKwl1 ZG1hX3Jlc2V0X3JpbmdzKHVjKTsKK30KKworc3RhdGljIHZvaWQgdWRtYV9kZXNjX3ByZV9jYWxs YmFjayhzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMsCisJCQkJICAgc3RydWN0IHZpcnRfZG1hX2Rl c2MgKnZkLAorCQkJCSAgIHN0cnVjdCBkbWFlbmdpbmVfcmVzdWx0ICpyZXN1bHQpCit7CisJc3Ry dWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2NoYW4oJnZjLT5jaGFuKTsKKwlzdHJ1Y3QgdWRt YV9kZXNjICpkOworCisJaWYgKCF2ZCkKKwkJcmV0dXJuOworCisJZCA9IHRvX3VkbWFfZGVzYygm dmQtPnR4KTsKKworCWlmIChkLT5tZXRhZGF0YV9zaXplKQorCQl1ZG1hX2ZldGNoX2VwaWIodWMs IGQpOworCisJLyogVE9ETzogcGVlayBpbnRvIHRoZSBkZXNjIHRvIGtub3cgdGhlIHJlYWwgbGVu Z3RoICovCisJaWYgKGQtPnJ4X3NnX3dhLmluX3VzZSkgeworCQl2b2lkICpzcmMgPSBzZ192aXJ0 KCZkLT5yeF9zZ193YS5zaW5nbGVfc2cpOworCisJCWRtYV9zeW5jX3NnX2Zvcl9jcHUodWMtPnVk LT5kZXYsICZkLT5yeF9zZ193YS5zaW5nbGVfc2csIDEsCisJCQkJICAgIERNQV9GUk9NX0RFVklD RSk7CisJCS8qIEVuc3VyZSB0aGF0IHJlYWRzIGFyZSBub3QgbW92ZWQgYmVmb3JlIHRoaXMgcG9p bnQgKi8KKwkJcm1iKCk7CisKKwkJc2dfY29weV9mcm9tX2J1ZmZlcihkLT5yeF9zZ193YS5zZ2ws IGQtPnJ4X3NnX3dhLnNnbGVuLCBzcmMsCisJCQkJICAgIGQtPnJ4X3NnX3dhLnRvdGFsX2xlbik7 CisJfQorCisJLyogUHJvdmlkZSByZXNpZHVlIGluZm9ybWF0aW9uIGZvciB0aGUgY2xpZW50ICov CisJaWYgKHJlc3VsdCkgeworCQl2b2lkICpkZXNjX3ZhZGRyID0gdWRtYV9jdXJyX2NwcGk1X2Rl c2NfdmFkZHIoZCwgZC0+ZGVzY19pZHgpOworCisJCWlmIChrbmF2X3VkbWFwX2Rlc2NfZ2V0X3R5 cGUoZGVzY192YWRkcikgPT0KKwkJCUtOQVZfVURNQVBfSU5GTzBfREVTQ19UWVBFX1ZBTF9IT1NU KSB7CisJCQlyZXN1bHQtPnJlc2lkdWUgPSBrbmF2X3VkbWFwX2hkZXNjX2dldF9wa3RsZW4oZGVz Y192YWRkcik7CisJCQlpZiAocmVzdWx0LT5yZXNpZHVlID09IGQtPnJlc2lkdWUpCisJCQkJcmVz dWx0LT5yZXN1bHQgPSBETUFfVFJBTlNfTk9FUlJPUjsKKwkJCWVsc2UKKwkJCQlyZXN1bHQtPnJl c3VsdCA9IERNQV9UUkFOU19BQk9SVEVEOworCQl9IGVsc2UgeworCQkJcmVzdWx0LT5yZXNpZHVl ID0gZC0+cmVzaWR1ZTsKKwkJCXJlc3VsdC0+cmVzdWx0ID0gRE1BX1RSQU5TX05PRVJST1I7CisJ CX0KKwl9Cit9CisKKy8qCisgKiBUaGlzIHRhc2tsZXQgaGFuZGxlcyB0aGUgY29tcGxldGlvbiBv ZiBhIERNQSBkZXNjcmlwdG9yIGJ5CisgKiBjYWxsaW5nIGl0cyBjYWxsYmFjayBhbmQgZnJlZWlu ZyBpdC4KKyAqLworc3RhdGljIHZvaWQgdWRtYV92Y2hhbl9jb21wbGV0ZSh1bnNpZ25lZCBsb25n IGFyZykKK3sKKwlzdHJ1Y3QgdmlydF9kbWFfY2hhbiAqdmMgPSAoc3RydWN0IHZpcnRfZG1hX2No YW4gKilhcmc7CisJc3RydWN0IHZpcnRfZG1hX2Rlc2MgKnZkLCAqX3ZkOworCXN0cnVjdCBkbWFl bmdpbmVfZGVzY19jYWxsYmFjayBjYjsKKwlMSVNUX0hFQUQoaGVhZCk7CisKKwlzcGluX2xvY2tf aXJxKCZ2Yy0+bG9jayk7CisJbGlzdF9zcGxpY2VfdGFpbF9pbml0KCZ2Yy0+ZGVzY19jb21wbGV0 ZWQsICZoZWFkKTsKKwl2ZCA9IHZjLT5jeWNsaWM7CisJaWYgKHZkKSB7CisJCXZjLT5jeWNsaWMg PSBOVUxMOworCQlkbWFlbmdpbmVfZGVzY19nZXRfY2FsbGJhY2soJnZkLT50eCwgJmNiKTsKKwl9 IGVsc2UgeworCQltZW1zZXQoJmNiLCAwLCBzaXplb2YoY2IpKTsKKwl9CisJc3Bpbl91bmxvY2tf aXJxKCZ2Yy0+bG9jayk7CisKKwl1ZG1hX2Rlc2NfcHJlX2NhbGxiYWNrKHZjLCB2ZCwgTlVMTCk7 CisJZG1hZW5naW5lX2Rlc2NfY2FsbGJhY2tfaW52b2tlKCZjYiwgTlVMTCk7CisKKwlsaXN0X2Zv cl9lYWNoX2VudHJ5X3NhZmUodmQsIF92ZCwgJmhlYWQsIG5vZGUpIHsKKwkJc3RydWN0IGRtYWVu Z2luZV9yZXN1bHQgcmVzdWx0OworCisJCWRtYWVuZ2luZV9kZXNjX2dldF9jYWxsYmFjaygmdmQt PnR4LCAmY2IpOworCisJCWxpc3RfZGVsKCZ2ZC0+bm9kZSk7CisKKwkJdWRtYV9kZXNjX3ByZV9j YWxsYmFjayh2YywgdmQsICZyZXN1bHQpOworCQlkbWFlbmdpbmVfZGVzY19jYWxsYmFja19pbnZv a2UoJmNiLCAmcmVzdWx0KTsKKworCQl2Y2hhbl92ZGVzY19maW5pKHZkKTsKKwl9Cit9CisKK3N0 YXRpYyB2b2lkIHVkbWFfZnJlZV9jaGFuX3Jlc291cmNlcyhzdHJ1Y3QgZG1hX2NoYW4gKmNoYW4p Cit7CisJc3RydWN0IHVkbWFfY2hhbiAqdWMgPSB0b191ZG1hX2NoYW4oY2hhbik7CisJc3RydWN0 IHVkbWFfZGV2ICp1ZCA9IHRvX3VkbWFfZGV2KGNoYW4tPmRldmljZSk7CisJc3RydWN0IHVkbWFf dGlzY2lfcm0gKnRpc2NpX3JtID0gJnVkLT50aXNjaV9ybTsKKworCXVkbWFfdGVybWluYXRlX2Fs bChjaGFuKTsKKworCWlmICh1Yy0+aXJxX251bV9yaW5nID4gMCkgeworCQlmcmVlX2lycSh1Yy0+ aXJxX251bV9yaW5nLCB1Yyk7CisKKwkJdGlfc2NpX2ludGFfdW5yZWdpc3Rlcl9ldmVudCh1ZC0+ ZGV2LCB1Yy0+aXJxX3JhX3Rpc2NpLAorCQkJCQkgICAgIHVjLT5pcnFfcmFfaWR4LCB1Yy0+aXJx X251bV9yaW5nKTsKKwkJdWMtPmlycV9udW1fcmluZyA9IDA7CisJfQorCWlmICh1Yy0+aXJxX251 bV91ZG1hID4gMCkgeworCQlmcmVlX2lycSh1Yy0+aXJxX251bV91ZG1hLCB1Yyk7CisKKwkJdGlf c2NpX2ludGFfdW5yZWdpc3Rlcl9ldmVudCh1ZC0+ZGV2LCB0aXNjaV9ybS0+dGlzY2lfZGV2X2lk LAorCQkJCQkgICAgIHVjLT5pcnFfdWRtYV9pZHgsCisJCQkJCSAgICAgdWMtPmlycV9udW1fdWRt YSk7CisJCXVjLT5pcnFfbnVtX3VkbWEgPSAwOworCX0KKworCS8qIFJlbGVhc2UgUFNJLUwgcGFp cmluZyAqLworCWlmICh1Yy0+cHNpbF9wYWlyZWQpIHsKKwkJbmF2c3NfcHNpbF91bnBhaXIodWQs IHVjLT5zcmNfdGhyZWFkLCB1Yy0+ZHN0X3RocmVhZCk7CisJCXVjLT5wc2lsX3BhaXJlZCA9IGZh bHNlOworCX0KKworCXZjaGFuX2ZyZWVfY2hhbl9yZXNvdXJjZXMoJnVjLT52Yyk7CisJdGFza2xl dF9raWxsKCZ1Yy0+dmMudGFzayk7CisKKwlwbV9ydW50aW1lX3B1dCh1ZC0+ZGRldi5kZXYpOwor CisJdWRtYV9mcmVlX3R4X3Jlc291cmNlcyh1Yyk7CisJdWRtYV9mcmVlX3J4X3Jlc291cmNlcyh1 Yyk7CisKKwl1Yy0+c2xhdmVfdGhyZWFkX2lkID0gLTE7CisJdWMtPmRpciA9IERNQV9NRU1fVE9f TUVNOworCisJaWYgKHVjLT51c2VfZG1hX3Bvb2wpIHsKKwkJZG1hX3Bvb2xfZGVzdHJveSh1Yy0+ aGRlc2NfcG9vbCk7CisJCXVjLT51c2VfZG1hX3Bvb2wgPSBmYWxzZTsKKwl9Cit9CisKK3N0YXRp YyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHVkbWFfZHJpdmVyOworCitzdGF0aWMgYm9vbCB1ZG1h X2RtYV9maWx0ZXJfZm4oc3RydWN0IGRtYV9jaGFuICpjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwl1 MzIgKmFyZ3M7CisJc3RydWN0IHVkbWFfY2hhbiAqdWM7CisJc3RydWN0IHVkbWFfZGV2ICp1ZDsK KwlzdHJ1Y3QgZGV2aWNlX25vZGUgKmNoY29uZl9ub2RlLCAqc2xhdmVfbm9kZTsKKwljaGFyIHBy b3BbNTBdOworCXUzMiB2YWw7CisKKwlpZiAoY2hhbi0+ZGV2aWNlLT5kZXYtPmRyaXZlciAhPSAm dWRtYV9kcml2ZXIuZHJpdmVyKQorCQlyZXR1cm4gZmFsc2U7CisKKwl1YyA9IHRvX3VkbWFfY2hh bihjaGFuKTsKKwl1ZCA9IHVjLT51ZDsKKwlhcmdzID0gcGFyYW07CisKKwlpZiAoYXJnc1syXSA9 PSBVRE1BX0RJUl9UWCkgeworCQl1Yy0+ZGlyID0gRE1BX01FTV9UT19ERVY7CisJfSBlbHNlIGlm IChhcmdzWzJdID09IFVETUFfRElSX1JYKSB7CisJCXVjLT5kaXIgPSBETUFfREVWX1RPX01FTTsK Kwl9IGVsc2UgeworCQlkZXZfZXJyKHVkLT5kZXYsICJJbnZhbGlkIGRpcmVjdGlvbiAoJXUpXG4i LCBhcmdzWzJdKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCXNsYXZlX25vZGUgPSBvZl9maW5k X25vZGVfYnlfcGhhbmRsZShhcmdzWzBdKTsKKwlpZiAoIXNsYXZlX25vZGUpIHsKKwkJZGV2X2Vy cih1ZC0+ZGV2LCAiU2xhdmUgbm9kZSBpcyBtaXNzaW5nXG4iKTsKKwkJcmV0dXJuIGZhbHNlOwor CX0KKworCXNucHJpbnRmKHByb3AsIHNpemVvZihwcm9wKSwgInRpLHBzaWwtY29uZmlnJXUiLCBh cmdzWzFdKTsKKwljaGNvbmZfbm9kZSA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKHNsYXZlX25vZGUs IHByb3ApOworCWlmICghY2hjb25mX25vZGUpIHsKKwkJZGV2X2Vycih1ZC0+ZGV2LCAiQ2hhbm5l bCBjb25maWd1cmF0aW9uIG5vZGUgaXMgbWlzc2luZ1xuIik7CisJCW9mX25vZGVfcHV0KHNsYXZl X25vZGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3Uz MihjaGNvbmZfbm9kZSwgImxpbnV4LHVkbWEtbW9kZSIsICZ2YWwpKSB7CisJCWlmICh2YWwgPT0g VURNQV9QS1RfTU9ERSkKKwkJCXVjLT5wa3RfbW9kZSA9IHRydWU7CisJfQorCisJaWYgKCFvZl9w cm9wZXJ0eV9yZWFkX3UzMihjaGNvbmZfbm9kZSwgInN0YXRpY3RyLXR5cGUiLCAmdmFsKSkKKwkJ dWMtPnN0YXRpY190cl90eXBlID0gdmFsOworCisJaWYgKCFvZl9wcm9wZXJ0eV9yZWFkX3UzMihj aGNvbmZfbm9kZSwgInRpLGNoYW5uZWwtdHBsIiwgJnZhbCkpCisJCXVjLT5jaGFubmVsX3RwbCA9 IHZhbDsKKworCXVjLT5uZWVkc19lcGliID0gb2ZfcHJvcGVydHlfcmVhZF9ib29sKGNoY29uZl9u b2RlLCAidGksbmVlZHMtZXBpYiIpOworCWlmICghb2ZfcHJvcGVydHlfcmVhZF91MzIoY2hjb25m X25vZGUsICJ0aSxwc2Qtc2l6ZSIsICZ2YWwpKQorCQl1Yy0+cHNkX3NpemUgPSB2YWw7CisJdWMt Pm1ldGFkYXRhX3NpemUgPSAodWMtPm5lZWRzX2VwaWIgPyAxNiA6IDApICsgdWMtPnBzZF9zaXpl OworCisJdWMtPmRlc2NfYWxpZ24gPSA2NDsKKwlpZiAodWMtPmRlc2NfYWxpZ24gPCBkbWFfZ2V0 X2NhY2hlX2FsaWdubWVudCgpKQorCQl1Yy0+ZGVzY19hbGlnbiA9IGRtYV9nZXRfY2FjaGVfYWxp Z25tZW50KCk7CisKKwlpZiAodWMtPnBrdF9tb2RlKQorCQl1Yy0+aGRlc2Nfc2l6ZSA9IEFMSUdO KHNpemVvZihzdHJ1Y3Qga25hdl91ZG1hcF9ob3N0X2Rlc2NfdCkgKworCQkJCSB1Yy0+bWV0YWRh dGFfc2l6ZSwgdWMtPmRlc2NfYWxpZ24pOworCisJb2Zfbm9kZV9wdXQoY2hjb25mX25vZGUpOwor CisJaWYgKG9mX3Byb3BlcnR5X3JlYWRfdTMyKHNsYXZlX25vZGUsICJ0aSxwc2lsLWJhc2UiLCAm dmFsKSkgeworCQlkZXZfZXJyKHVkLT5kZXYsICJ0aSxwc2lsLWJhc2UgaXMgbWlzc2luZ1xuIik7 CisJCW9mX25vZGVfcHV0KHNsYXZlX25vZGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJdWMt PnNsYXZlX3RocmVhZF9pZCA9IHZhbCArIGFyZ3NbMV07CisKKwlvZl9ub2RlX3B1dChzbGF2ZV9u b2RlKTsKKworCWRldl9kYmcodWQtPmRldiwgIiVzOiBTbGF2ZSAlcyB0aHJlYWQlZCB3aWxsIGJl IGhhbmRsZWQgYnkgdmNoYW4gJWRcbiIsCisJCV9fZnVuY19fLCB1ZG1hX2dldF9kaXJfdGV4dCh1 Yy0+ZGlyKSwgdWMtPnNsYXZlX3RocmVhZF9pZCwKKwkJdWMtPmlkKTsKKworCXJldHVybiB0cnVl OworfQorCitzdGF0aWMgc3RydWN0IGRtYV9jaGFuICp1ZG1hX29mX3hsYXRlKHN0cnVjdCBvZl9w aGFuZGxlX2FyZ3MgKmRtYV9zcGVjLAorCQkJCSAgICAgIHN0cnVjdCBvZl9kbWEgKm9mZG1hKQor eworCXN0cnVjdCB1ZG1hX2RldiAqdWQgPSBvZmRtYS0+b2ZfZG1hX2RhdGE7CisJc3RydWN0IGRt YV9jaGFuICpjaGFuOworCisJaWYgKGRtYV9zcGVjLT5hcmdzX2NvdW50ICE9IDMpCisJCXJldHVy biBOVUxMOworCisJY2hhbiA9IGRtYWRldl9nZXRfc2xhdmVfY2hhbm5lbCgmdWQtPmRkZXYsIHVk bWFfZG1hX2ZpbHRlcl9mbiwKKwkJCQkJJmRtYV9zcGVjLT5hcmdzWzBdKTsKKwlpZiAoIWNoYW4p IHsKKwkJZGV2X2Vycih1ZC0+ZGV2LCAiZ2V0IGNoYW5uZWwgZmFpbCBpbiAlcy5cbiIsIF9fZnVu Y19fKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCisJcmV0dXJuIGNoYW47Cit9 CisKK3N0cnVjdCB1ZG1hX21hdGNoX2RhdGEgYW02NTRfbWFpbl9kYXRhID0geworCS50cGxfbGV2 ZWxzID0gMiwKKwkubGV2ZWxfc3RhcnRfaWR4ID0geworCQlbMF0gPSA4LCAvKiBOb3JtYWwgY2hh bm5lbHMgKi8KKwkJWzFdID0gMCwgLyogSGlnaCBUaHJvdWdocHV0IGNoYW5uZWxzICovCisJfSwK K307CisKK3N0cnVjdCB1ZG1hX21hdGNoX2RhdGEgYW02NTRfbWN1X2RhdGEgPSB7CisJLnRwbF9s ZXZlbHMgPSAyLAorCS5sZXZlbF9zdGFydF9pZHggPSB7CisJCVswXSA9IDIsIC8qIE5vcm1hbCBj aGFubmVscyAqLworCQlbMV0gPSAwLCAvKiBIaWdoIFRocm91Z2hwdXQgY2hhbm5lbHMgKi8KKwl9 LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgdWRtYV9vZl9tYXRjaFtd ID0geworCXsgLmNvbXBhdGlibGUgPSAidGksYW02NTQtbmF2c3MtbWFpbi11ZG1hcCIsIC5kYXRh ID0gJmFtNjU0X21haW5fZGF0YSwgfSwKKwl7IC5jb21wYXRpYmxlID0gInRpLGFtNjU0LW5hdnNz LW1jdS11ZG1hcCIsIC5kYXRhID0gJmFtNjU0X21jdV9kYXRhLCB9LAorCXt9LAorfTsKK01PRFVM RV9ERVZJQ0VfVEFCTEUob2YsIHVkbWFfb2ZfbWF0Y2gpOworCitzdGF0aWMgaW50IHVkbWFfZ2V0 X21tcnMoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgc3RydWN0IHVkbWFfZGV2ICp1ZCkK K3sKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBN TVJfTEFTVDsgaSsrKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZV9ieW5hbWUocGRl diwgSU9SRVNPVVJDRV9NRU0sCisJCQkJCQkgICBtbXJfbmFtZXNbaV0pOworCQl1ZC0+bW1yc1tp XSA9IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCQlpZiAoSVNfRVJS KHVkLT5tbXJzW2ldKSkKKwkJCXJldHVybiBQVFJfRVJSKHVkLT5tbXJzW2ldKTsKKwl9CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCB1ZG1hX3NldHVwX3Jlc291cmNlcyhzdHJ1Y3QgdWRt YV9kZXYgKnVkKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IHVkLT5kZXY7CisJaW50IGNoX2Nv dW50LCBpOworCXUzMiBjYXAyLCBjYXAzOworCXN0cnVjdCB0aV9zY2lfcmVzb3VyY2VfZGVzYyAq cm1fZGVzYzsKKwlzdHJ1Y3QgdGlfc2NpX3Jlc291cmNlICpybV9yZXM7CisJc3RydWN0IHVkbWFf dGlzY2lfcm0gKnRpc2NpX3JtID0gJnVkLT50aXNjaV9ybTsKKwljaGFyICpyYW5nZV9uYW1lc1td ID0geyAidGksc2NpLXJtLXJhbmdlLXRjaGFuIiwKKwkJCQkidGksc2NpLXJtLXJhbmdlLXJjaGFu IiwKKwkJCQkidGksc2NpLXJtLXJhbmdlLXJmbG93IiB9OworCisJY2FwMiA9IHVkbWFfcmVhZCh1 ZC0+bW1yc1tNTVJfR0NGR10sIDB4MjgpOworCWNhcDMgPSB1ZG1hX3JlYWQodWQtPm1tcnNbTU1S X0dDRkddLCAweDJjKTsKKworCXVkLT5yZmxvd19jbnQgPSBjYXAzICYgMHgzZmZmOworCXVkLT50 Y2hhbl9jbnQgPSBjYXAyICYgMHgxZmY7CisJdWQtPmVjaGFuX2NudCA9IChjYXAyID4+IDkpICYg MHgxZmY7CisJdWQtPnJjaGFuX2NudCA9IChjYXAyID4+IDE4KSAmIDB4MWZmOworCWNoX2NvdW50 ICA9IHVkLT50Y2hhbl9jbnQgKyB1ZC0+cmNoYW5fY250OworCisJdWQtPnRjaGFuX21hcCA9IGRl dm1fa21hbGxvY19hcnJheShkZXYsIEJJVFNfVE9fTE9OR1ModWQtPnRjaGFuX2NudCksCisJCQkJ CSAgIHNpemVvZih1bnNpZ25lZCBsb25nKSwgR0ZQX0tFUk5FTCk7CisJdWQtPnRjaGFucyA9IGRl dm1fa2NhbGxvYyhkZXYsIHVkLT50Y2hhbl9jbnQsIHNpemVvZigqdWQtPnRjaGFucyksCisJCQkJ ICBHRlBfS0VSTkVMKTsKKwl1ZC0+cmNoYW5fbWFwID0gZGV2bV9rbWFsbG9jX2FycmF5KGRldiwg QklUU19UT19MT05HUyh1ZC0+cmNoYW5fY250KSwKKwkJCQkJICAgc2l6ZW9mKHVuc2lnbmVkIGxv bmcpLCBHRlBfS0VSTkVMKTsKKwl1ZC0+cmNoYW5zID0gZGV2bV9rY2FsbG9jKGRldiwgdWQtPnJj aGFuX2NudCwgc2l6ZW9mKCp1ZC0+cmNoYW5zKSwKKwkJCQkgIEdGUF9LRVJORUwpOworCXVkLT5y Zmxvd19tYXAgPSBkZXZtX2ttYWxsb2NfYXJyYXkoZGV2LCBCSVRTX1RPX0xPTkdTKHVkLT5yZmxv d19jbnQpLAorCQkJCQkgICBzaXplb2YodW5zaWduZWQgbG9uZyksIEdGUF9LRVJORUwpOworCXVk LT5yZmxvd19tYXBfcmVzZXJ2ZWQgPSBkZXZtX2tjYWxsb2MoZGV2LCBCSVRTX1RPX0xPTkdTKHVk LT5yZmxvd19jbnQpLAorCQkJCQkgICAgICBzaXplb2YodW5zaWduZWQgbG9uZyksCisJCQkJCSAg ICAgIEdGUF9LRVJORUwpOworCXVkLT5yZmxvd3MgPSBkZXZtX2tjYWxsb2MoZGV2LCB1ZC0+cmZs b3dfY250LCBzaXplb2YoKnVkLT5yZmxvd3MpLAorCQkJCSAgR0ZQX0tFUk5FTCk7CisKKwlpZiAo IXVkLT50Y2hhbl9tYXAgfHwgIXVkLT5yY2hhbl9tYXAgfHwgIXVkLT5yZmxvd19tYXAgfHwKKwkg ICAgIXVkLT5yZmxvd19tYXBfcmVzZXJ2ZWQgfHwgIXVkLT50Y2hhbnMgfHwgIXVkLT5yY2hhbnMg fHwKKwkgICAgIXVkLT5yZmxvd3MpCisJCXJldHVybiAtRU5PTUVNOworCisJLyoKKwkgKiBSWCBm bG93cyB3aXRoIHRoZSBzYW1lIElkcyBhcyBSWCBjaGFubmVscyBhcmUgcmVzZXJ2ZWQgdG8gYmUg dXNlZAorCSAqIGFzIGRlZmF1bHQgZmxvd3MgaWYgcmVtb3RlIEhXIGNhbid0IGdlbmVyYXRlIGZs b3dfaWRzLiBUaG9zZQorCSAqIFJYIGZsb3dzIGNhbiBiZSByZXF1ZXN0ZWQgb25seSBleHBsaWNp dGx5IGJ5IGlkLgorCSAqLworCWJpdG1hcF9zZXQodWQtPnJmbG93X21hcF9yZXNlcnZlZCwgMCwg dWQtPnJjaGFuX2NudCk7CisKKwkvKiBHZXQgcmVzb3VyY2UgcmFuZ2VzIGZyb20gdGlzY2kgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgUk1fUkFOR0VfTEFTVDsgaSsrKQorCQl0aXNjaV9ybS0+cm1fcmFu Z2VzW2ldID0gZGV2bV90aV9zY2lfZ2V0X29mX3Jlc291cmNlKAorCQkJCQkJCXRpc2NpX3JtLT50 aXNjaSwgZGV2LAorCQkJCQkJCXJhbmdlX25hbWVzW2ldKTsKKworCS8qIHRjaGFuIHJhbmdlcyAq LworCXJtX3JlcyA9IHRpc2NpX3JtLT5ybV9yYW5nZXNbUk1fUkFOR0VfVENIQU5dOworCWlmIChJ U19FUlIocm1fcmVzKSkgeworCQliaXRtYXBfemVybyh1ZC0+dGNoYW5fbWFwLCB1ZC0+dGNoYW5f Y250KTsKKwl9IGVsc2UgeworCQliaXRtYXBfZmlsbCh1ZC0+dGNoYW5fbWFwLCB1ZC0+dGNoYW5f Y250KTsKKwkJZm9yIChpID0gMDsgaSA8IHJtX3Jlcy0+c2V0czsgaSsrKSB7CisJCQlybV9kZXNj ID0gJnJtX3Jlcy0+ZGVzY1tpXTsKKwkJCWJpdG1hcF9jbGVhcih1ZC0+dGNoYW5fbWFwLCBybV9k ZXNjLT5zdGFydCwKKwkJCQkgICAgIHJtX2Rlc2MtPm51bSk7CisJCX0KKwl9CisKKwkvKiByY2hh biBhbmQgbWF0Y2hpbmcgZGVmYXVsdCBmbG93IHJhbmdlcyAqLworCXJtX3JlcyA9IHRpc2NpX3Jt LT5ybV9yYW5nZXNbUk1fUkFOR0VfUkNIQU5dOworCWlmIChJU19FUlIocm1fcmVzKSkgeworCQli aXRtYXBfemVybyh1ZC0+cmNoYW5fbWFwLCB1ZC0+cmNoYW5fY250KTsKKwkJYml0bWFwX3plcm8o dWQtPnJmbG93X21hcCwgdWQtPnJjaGFuX2NudCk7CisJfSBlbHNlIHsKKwkJYml0bWFwX2ZpbGwo dWQtPnJjaGFuX21hcCwgdWQtPnJjaGFuX2NudCk7CisJCWJpdG1hcF9maWxsKHVkLT5yZmxvd19t YXAsIHVkLT5yY2hhbl9jbnQpOworCQlmb3IgKGkgPSAwOyBpIDwgcm1fcmVzLT5zZXRzOyBpKysp IHsKKwkJCXJtX2Rlc2MgPSAmcm1fcmVzLT5kZXNjW2ldOworCQkJYml0bWFwX2NsZWFyKHVkLT5y Y2hhbl9tYXAsIHJtX2Rlc2MtPnN0YXJ0LAorCQkJCSAgICAgcm1fZGVzYy0+bnVtKTsKKwkJCWJp dG1hcF9jbGVhcih1ZC0+cmZsb3dfbWFwLCBybV9kZXNjLT5zdGFydCwKKwkJCQkgICAgIHJtX2Rl c2MtPm51bSk7CisJCX0KKwl9CisKKwkvKiBHUCByZmxvdyByYW5nZXMgKi8KKwlybV9yZXMgPSB0 aXNjaV9ybS0+cm1fcmFuZ2VzW1JNX1JBTkdFX1JGTE9XXTsKKwlpZiAoSVNfRVJSKHJtX3Jlcykp IHsKKwkJYml0bWFwX2NsZWFyKHVkLT5yZmxvd19tYXAsIHVkLT5yY2hhbl9jbnQsCisJCQkgICAg IHVkLT5yZmxvd19jbnQgLSB1ZC0+cmNoYW5fY250KTsKKwl9IGVsc2UgeworCQliaXRtYXBfc2V0 KHVkLT5yZmxvd19tYXAsIHVkLT5yY2hhbl9jbnQsCisJCQkgICB1ZC0+cmZsb3dfY250IC0gdWQt PnJjaGFuX2NudCk7CisJCWZvciAoaSA9IDA7IGkgPCBybV9yZXMtPnNldHM7IGkrKykgeworCQkJ cm1fZGVzYyA9ICZybV9yZXMtPmRlc2NbaV07CisJCQliaXRtYXBfY2xlYXIodWQtPnJmbG93X21h cCwgcm1fZGVzYy0+c3RhcnQsCisJCQkJICAgICBybV9kZXNjLT5udW0pOworCQl9CisJfQorCisJ LyoKKwkgKiBIQUNLOiB0Y2hhbjAsIHJjaGFuMCwxIGFuZCByZmxvdzAsMSBvbiBtYWluX25hdnNz IGlzIGRlZGljYXRlZCB0bworCSAqIHN5c2Z3LgorCSAqIE9ubHkgVURNQVAgb24gbWFpbl9uYXZz cyBoYXZlIGVjaGFuLCB1c2UgaXQgYXMgYSBoaW50IGZvciBub3cuCisJICovCisJaWYgKHVkLT5l Y2hhbl9jbnQpIHsKKwkJc2V0X2JpdCgwLCB1ZC0+dGNoYW5fbWFwKTsKKwkJc2V0X2JpdCgwLCB1 ZC0+cmNoYW5fbWFwKTsKKwkJc2V0X2JpdCgxLCB1ZC0+cmNoYW5fbWFwKTsKKwkJc2V0X2JpdCgw LCB1ZC0+cmZsb3dfbWFwKTsKKwkJc2V0X2JpdCgxLCB1ZC0+cmZsb3dfbWFwKTsKKwl9CisKKwlj aF9jb3VudCAtPSBiaXRtYXBfd2VpZ2h0KHVkLT50Y2hhbl9tYXAsIHVkLT50Y2hhbl9jbnQpOwor CWNoX2NvdW50IC09IGJpdG1hcF93ZWlnaHQodWQtPnJjaGFuX21hcCwgdWQtPnJjaGFuX2NudCk7 CisJaWYgKCFjaF9jb3VudCkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwl1ZC0+Y2hhbm5lbHMgPSBk ZXZtX2tjYWxsb2MoZGV2LCBjaF9jb3VudCwgc2l6ZW9mKCp1ZC0+Y2hhbm5lbHMpLAorCQkJCSAg ICBHRlBfS0VSTkVMKTsKKwlpZiAoIXVkLT5jaGFubmVscykKKwkJcmV0dXJuIC1FTk9NRU07CisK KwlkZXZfaW5mbyhkZXYsCisJCSAiQ2hhbm5lbHM6ICVkICh0Y2hhbjogJXUsIGVjaGFuOiAldSwg cmNoYW46ICV1LCByZmxvdzogJXUpXG4iLAorCQkgY2hfY291bnQsIHVkLT50Y2hhbl9jbnQsIHVk LT5lY2hhbl9jbnQsIHVkLT5yY2hhbl9jbnQsCisJCSB1ZC0+cmZsb3dfY250KTsKKworCXJldHVy biBjaF9jb3VudDsKK30KKworI2RlZmluZSBUSV9VRE1BQ19CVVNXSURUSFMJKEJJVChETUFfU0xB VkVfQlVTV0lEVEhfMV9CWVRFKSB8IFwKKwkJCQkgQklUKERNQV9TTEFWRV9CVVNXSURUSF8yX0JZ VEVTKSB8IFwKKwkJCQkgQklUKERNQV9TTEFWRV9CVVNXSURUSF8zX0JZVEVTKSB8IFwKKwkJCQkg QklUKERNQV9TTEFWRV9CVVNXSURUSF80X0JZVEVTKSB8IFwKKwkJCQkgQklUKERNQV9TTEFWRV9C VVNXSURUSF84X0JZVEVTKSkKKworc3RhdGljIGludCB1ZG1hX3Byb2JlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGRldmljZV9ub2RlICpwYXJlbnRfaXJxX25vZGU7 CisJc3RydWN0IGRldmljZV9ub2RlICpuYXZzc19ub2RlID0gcGRldi0+ZGV2LnBhcmVudC0+b2Zf bm9kZTsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmcGRldi0+ZGV2OworCXN0cnVjdCB1ZG1hX2Rl diAqdWQ7CisJY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCAqbWF0Y2g7CisJaW50IGksIHJldDsK KwlpbnQgY2hfY291bnQ7CisKKwlyZXQgPSBkbWFfY29lcmNlX21hc2tfYW5kX2NvaGVyZW50KGRl diwgRE1BX0JJVF9NQVNLKDQ4KSk7CisJaWYgKHJldCkKKwkJZGV2X2VycihkZXYsICJmYWlsZWQg dG8gc2V0IGRtYSBtYXNrIHN0dWZmXG4iKTsKKworCXVkID0gZGV2bV9remFsbG9jKGRldiwgc2l6 ZW9mKCp1ZCksIEdGUF9LRVJORUwpOworCWlmICghdWQpCisJCXJldHVybiAtRU5PTUVNOworCisJ cmV0ID0gdWRtYV9nZXRfbW1ycyhwZGV2LCB1ZCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCXVkLT50aXNjaV9ybS50aXNjaSA9IHRpX3NjaV9nZXRfYnlfcGhhbmRsZShkZXYtPm9mX25v ZGUsICJ0aSxzY2kiKTsKKwlpZiAoSVNfRVJSKHVkLT50aXNjaV9ybS50aXNjaSkpCisJCXJldHVy biBQVFJfRVJSKHVkLT50aXNjaV9ybS50aXNjaSk7CisKKwlyZXQgPSBvZl9wcm9wZXJ0eV9yZWFk X3UzMihkZXYtPm9mX25vZGUsICJ0aSxzY2ktZGV2LWlkIiwKKwkJCQkgICAmdWQtPnRpc2NpX3Jt LnRpc2NpX2Rldl9pZCk7CisJaWYgKHJldCkgeworCQlkZXZfZXJyKGRldiwgInRpLHNjaS1kZXYt aWQgcmVhZCBmYWlsdXJlICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9 IG9mX3Byb3BlcnR5X3JlYWRfdTMyKG5hdnNzX25vZGUsICJ0aSxzY2ktZGV2LWlkIiwKKwkJCQkg ICAmdWQtPnRpc2NpX3JtLnRpc2NpX25hdnNzX2Rldl9pZCk7CisJaWYgKHJldCkgeworCQlkZXZf ZXJyKGRldiwgIk5BVlNTIHRpLHNjaS1kZXYtaWQgcmVhZCBmYWlsdXJlICVkXG4iLCByZXQpOwor CQlyZXR1cm4gcmV0OworCX0KKworCXVkLT50aXNjaV9ybS50aXNjaV91ZG1hcF9vcHMgPSAmdWQt PnRpc2NpX3JtLnRpc2NpLT5vcHMucm1fdWRtYXBfb3BzOworCXVkLT50aXNjaV9ybS50aXNjaV9w c2lsX29wcyA9ICZ1ZC0+dGlzY2lfcm0udGlzY2ktPm9wcy5ybV9wc2lsX29wczsKKworCXVkLT5y aW5nYWNjID0gb2ZfazNfbmF2X3JpbmdhY2NfZ2V0X2J5X3BoYW5kbGUoZGV2LT5vZl9ub2RlLAor CQkJCQkJICAgICAgICJ0aSxyaW5nYWNjIik7CisJaWYgKElTX0VSUih1ZC0+cmluZ2FjYykpCisJ CXJldHVybiBQVFJfRVJSKHVkLT5yaW5nYWNjKTsKKworCXBhcmVudF9pcnFfbm9kZSA9IG9mX2ly cV9maW5kX3BhcmVudChkZXYtPm9mX25vZGUpOworCWlmICghcGFyZW50X2lycV9ub2RlKSB7CisJ CWRldl9lcnIoZGV2LCAiRmFpbGVkIHRvIGdldCBJUlEgcGFyZW50IG5vZGVcbiIpOworCQlyZXR1 cm4gLUVOT0RFVjsKKwl9CisKKwl1ZC0+aXJxX2RvbWFpbiA9IGlycV9maW5kX2hvc3QocGFyZW50 X2lycV9ub2RlKTsKKwlpZiAoIXVkLT5pcnFfZG9tYWluKQorCQlyZXR1cm4gLUVQUk9CRV9ERUZF UjsKKworCW1hdGNoID0gb2ZfbWF0Y2hfbm9kZSh1ZG1hX29mX21hdGNoLCBkZXYtPm9mX25vZGUp OworCWlmICghbWF0Y2gpIHsKKwkJZGV2X2VycihkZXYsICJObyBjb21wYXRpYmxlIG1hdGNoIGZv dW5kXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCXVkLT5tYXRjaF9kYXRhID0gbWF0Y2gt PmRhdGE7CisKKwlkbWFfY2FwX3NldChETUFfU0xBVkUsIHVkLT5kZGV2LmNhcF9tYXNrKTsKKwlk bWFfY2FwX3NldChETUFfQ1lDTElDLCB1ZC0+ZGRldi5jYXBfbWFzayk7CisJZG1hX2NhcF9zZXQo RE1BX01FTUNQWSwgdWQtPmRkZXYuY2FwX21hc2spOworCisJdWQtPmRkZXYuZGV2aWNlX2FsbG9j X2NoYW5fcmVzb3VyY2VzID0gdWRtYV9hbGxvY19jaGFuX3Jlc291cmNlczsKKwl1ZC0+ZGRldi5k ZXZpY2VfY29uZmlnID0gdWRtYV9zbGF2ZV9jb25maWc7CisJdWQtPmRkZXYuZGV2aWNlX3ByZXBf c2xhdmVfc2cgPSB1ZG1hX3ByZXBfc2xhdmVfc2c7CisJdWQtPmRkZXYuZGV2aWNlX3ByZXBfZG1h X2N5Y2xpYyA9IHVkbWFfcHJlcF9kbWFfY3ljbGljOworCXVkLT5kZGV2LmRldmljZV9wcmVwX2Rt YV9tZW1jcHkgPSB1ZG1hX3ByZXBfZG1hX21lbWNweTsKKwl1ZC0+ZGRldi5kZXZpY2VfaXNzdWVf cGVuZGluZyA9IHVkbWFfaXNzdWVfcGVuZGluZzsKKwl1ZC0+ZGRldi5kZXZpY2VfdHhfc3RhdHVz ID0gdWRtYV90eF9zdGF0dXM7CisJdWQtPmRkZXYuZGV2aWNlX3BhdXNlID0gdWRtYV9wYXVzZTsK Kwl1ZC0+ZGRldi5kZXZpY2VfcmVzdW1lID0gdWRtYV9yZXN1bWU7CisJdWQtPmRkZXYuZGV2aWNl X3Rlcm1pbmF0ZV9hbGwgPSB1ZG1hX3Rlcm1pbmF0ZV9hbGw7CisJdWQtPmRkZXYuZGV2aWNlX3N5 bmNocm9uaXplID0gdWRtYV9zeW5jaHJvbml6ZTsKKworCXVkLT5kZGV2LmRldmljZV9mcmVlX2No YW5fcmVzb3VyY2VzID0gdWRtYV9mcmVlX2NoYW5fcmVzb3VyY2VzOworCXVkLT5kZGV2LnNyY19h ZGRyX3dpZHRocyA9IFRJX1VETUFDX0JVU1dJRFRIUzsKKwl1ZC0+ZGRldi5kc3RfYWRkcl93aWR0 aHMgPSBUSV9VRE1BQ19CVVNXSURUSFM7CisJdWQtPmRkZXYuZGlyZWN0aW9ucyA9IEJJVChETUFf REVWX1RPX01FTSkgfCBCSVQoRE1BX01FTV9UT19ERVYpIHwKKwkJCSAgICAgIEJJVChETUFfTUVN X1RPX01FTSk7CisJdWQtPmRkZXYucmVzaWR1ZV9ncmFudWxhcml0eSA9IERNQV9SRVNJRFVFX0dS QU5VTEFSSVRZX0JVUlNUOworCXVkLT5kZGV2LmNvcHlfYWxpZ24gPSBETUFFTkdJTkVfQUxJR05f OF9CWVRFUzsKKwl1ZC0+ZGRldi5kZXNjX21ldGFkYXRhX21vZGVzID0gREVTQ19NRVRBREFUQV9D TElFTlQgfAorCQkJCSAgICAgICBERVNDX01FVEFEQVRBX0VOR0lORTsKKwl1ZC0+ZGRldi5kZXYg PSBkZXY7CisJdWQtPmRldiA9IGRldjsKKworCUlOSVRfTElTVF9IRUFEKCZ1ZC0+ZGRldi5jaGFu bmVscyk7CisJSU5JVF9MSVNUX0hFQUQoJnVkLT5kZXNjX3RvX3B1cmdlKTsKKworCXJldCA9IG9m X3Byb3BlcnR5X3JlYWRfdTMyKGRldi0+b2Zfbm9kZSwgInRpLHBzaWwtYmFzZSIsCisJCQkJICAg JnVkLT5wc2lsX2Jhc2UpOworCWlmIChyZXQpIHsKKwkJZGV2X2luZm8oZGV2LCAiTWlzc2luZyB0 aSxwc2lsLWJhc2UgcHJvcGVydHksIHVzaW5nICVkLlxuIiwKKwkJCSByZXQpOworCQlyZXR1cm4g cmV0OworCX0KKworCWNoX2NvdW50ID0gdWRtYV9zZXR1cF9yZXNvdXJjZXModWQpOworCWlmIChj aF9jb3VudCA8PSAwKQorCQlyZXR1cm4gY2hfY291bnQ7CisKKwlzcGluX2xvY2tfaW5pdCgmdWQt PmxvY2spOworCUlOSVRfV09SSygmdWQtPnB1cmdlX3dvcmssIHVkbWFfcHVyZ2VfZGVzY193b3Jr KTsKKworCWZvciAoaSA9IDA7IGkgPCB1ZC0+dGNoYW5fY250OyBpKyspIHsKKwkJc3RydWN0IHVk bWFfdGNoYW4gKnRjaGFuID0gJnVkLT50Y2hhbnNbaV07CisKKwkJdGNoYW4tPmlkID0gaTsKKwkJ dGNoYW4tPnJlZ19ydCA9IHVkLT5tbXJzW01NUl9UQ0hBTlJUXSArIFVETUFfQ0hfMTAwMChpKTsK Kwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgdWQtPnJjaGFuX2NudDsgaSsrKSB7CisJCXN0cnVjdCB1 ZG1hX3JjaGFuICpyY2hhbiA9ICZ1ZC0+cmNoYW5zW2ldOworCisJCXJjaGFuLT5pZCA9IGk7CisJ CXJjaGFuLT5yZWdfcnQgPSB1ZC0+bW1yc1tNTVJfUkNIQU5SVF0gKyBVRE1BX0NIXzEwMDAoaSk7 CisJfQorCisJZm9yIChpID0gMDsgaSA8IHVkLT5yZmxvd19jbnQ7IGkrKykgeworCQlzdHJ1Y3Qg dWRtYV9yZmxvdyAqcmZsb3cgPSAmdWQtPnJmbG93c1tpXTsKKworCQlyZmxvdy0+aWQgPSBpOwor CX0KKworCWZvciAoaSA9IDA7IGkgPCBjaF9jb3VudDsgaSsrKSB7CisJCXN0cnVjdCB1ZG1hX2No YW4gKnVjID0gJnVkLT5jaGFubmVsc1tpXTsKKworCQl1Yy0+dWQgPSB1ZDsKKwkJdWMtPnZjLmRl c2NfZnJlZSA9IHVkbWFfZGVzY19mcmVlOworCQl1Yy0+aWQgPSBpOworCQl1Yy0+c2xhdmVfdGhy ZWFkX2lkID0gLTE7CisJCXVjLT50Y2hhbiA9IE5VTEw7CisJCXVjLT5yY2hhbiA9IE5VTEw7CisJ CXVjLT5kaXIgPSBETUFfTUVNX1RPX01FTTsKKwkJdWMtPm5hbWUgPSBkZXZtX2thc3ByaW50Zihk ZXYsIEdGUF9LRVJORUwsICJVRE1BIGNoYW4lZCIsIGkpOworCisJCXZjaGFuX2luaXQoJnVjLT52 YywgJnVkLT5kZGV2KTsKKwkJLyogVXNlIGN1c3RvbSB2Y2hhbiBjb21wbGV0aW9uIGhhbmRsaW5n ICovCisJCXRhc2tsZXRfaW5pdCgmdWMtPnZjLnRhc2ssIHVkbWFfdmNoYW5fY29tcGxldGUsCisJ CQkgICAgICh1bnNpZ25lZCBsb25nKSZ1Yy0+dmMpOworCQlpbml0X2NvbXBsZXRpb24oJnVjLT50 ZWFyZG93bl9jb21wbGV0ZWQpOworCX0KKworCXJldCA9IGRtYV9hc3luY19kZXZpY2VfcmVnaXN0 ZXIoJnVkLT5kZGV2KTsKKwlpZiAocmV0KSB7CisJCWRldl9lcnIoZGV2LCAiZmFpbGVkIHRvIHJl Z2lzdGVyIHNsYXZlIERNQSBlbmdpbmU6ICVkXG4iLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0K KworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHVkKTsKKworCXJldCA9IG9mX2RtYV9jb250 cm9sbGVyX3JlZ2lzdGVyKGRldi0+b2Zfbm9kZSwgdWRtYV9vZl94bGF0ZSwgdWQpOworCWlmIChy ZXQpIHsKKwkJZGV2X2VycihkZXYsICJmYWlsZWQgdG8gcmVnaXN0ZXIgb2ZfZG1hIGNvbnRyb2xs ZXJcbiIpOworCQlkbWFfYXN5bmNfZGV2aWNlX3VucmVnaXN0ZXIoJnVkLT5kZGV2KTsKKwl9CisK KwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHVkbWFfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9y bV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHVkbWFfZGV2ICp1ZCA9IHBsYXRmb3JtX2dldF9k cnZkYXRhKHBkZXYpOworCisJb2ZfZG1hX2NvbnRyb2xsZXJfZnJlZShwZGV2LT5kZXYub2Zfbm9k ZSk7CisJZG1hX2FzeW5jX2RldmljZV91bnJlZ2lzdGVyKCZ1ZC0+ZGRldik7CisKKwkvKiBNYWtl IHN1cmUgdGhhdCB3ZSBkaWQgcHJvcGVyIGNsZWFudXAgKi8KKwljYW5jZWxfd29ya19zeW5jKCZ1 ZC0+cHVyZ2Vfd29yayk7CisJdWRtYV9wdXJnZV9kZXNjX3dvcmsoJnVkLT5wdXJnZV93b3JrKTsK KworCXBtX3J1bnRpbWVfcHV0X3N5bmMoJnBkZXYtPmRldik7CisJcG1fcnVudGltZV9kaXNhYmxl KCZwZGV2LT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1f ZHJpdmVyIHVkbWFfZHJpdmVyID0geworCS5kcml2ZXIgPSB7CisJCS5uYW1lCT0gInRpLXVkbWEi LAorCQkub2ZfbWF0Y2hfdGFibGUgPSB1ZG1hX29mX21hdGNoLAorCX0sCisJLnByb2JlCQk9IHVk bWFfcHJvYmUsCisJLnJlbW92ZQkJPSB1ZG1hX3JlbW92ZSwKK307CisKK21vZHVsZV9wbGF0Zm9y bV9kcml2ZXIodWRtYV9kcml2ZXIpOworCitNT0RVTEVfQUxJQVMoInBsYXRmb3JtOnRpLXVkbWEi KTsKK01PRFVMRV9ERVNDUklQVElPTigiVEkgSzMgRE1BIGRyaXZlciBmb3IgQ1BQSSA1LjAgY29t cGxpYW50IGRldmljZXMiKTsKK01PRFVMRV9BVVRIT1IoIlBldGVyIFVqZmFsdXNpIDxwZXRlci51 amZhbHVzaUB0aS5jb20+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7CmRpZmYgLS1naXQg YS9kcml2ZXJzL2RtYS90aS9rMy11ZG1hLmggYi9kcml2ZXJzL2RtYS90aS9rMy11ZG1hLmgKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi43ODdiOWZlZWZlNWQKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL2RtYS90aS9rMy11ZG1hLmgKQEAgLTAsMCArMSwxMzIgQEAK Ky8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKgorICogIENvcHlyaWdo dCAoQykgMjAxOCBUZXhhcyBJbnN0cnVtZW50cyBJbmNvcnBvcmF0ZWQgLSBodHRwOi8vd3d3LnRp LmNvbQorICovCisKKyNpZm5kZWYgSzNfVURNQV9IXworI2RlZmluZSBLM19VRE1BX0hfCisKKyNk ZWZpbmUgVURNQV9QU0lMX0RTVF9USFJFQURfSURfT0ZGU0VUIDB4ODAwMAorCisvKiBHbG9iYWwg cmVnaXN0ZXJzICovCisjZGVmaW5lIFVETUFfUkVWX1JFRwkJCTB4MAorI2RlZmluZSBVRE1BX1BF UkZfQ1RMX1JFRwkJMHg0CisjZGVmaW5lIFVETUFfRU1VX0NUTF9SRUcJCTB4OAorI2RlZmluZSBV RE1BX1BTSUxfVE9fUkVHCQkweDEwCisjZGVmaW5lIFVETUFfVVRDX0NUTF9SRUcJCTB4MWMKKyNk ZWZpbmUgVURNQV9DQVBfUkVHKGkpCQkJKDB4MjAgKyAoaSAqIDQpKQorI2RlZmluZSBVRE1BX1JY X0ZMT1dfSURfRldfT0VTX1JFRwkweDgwCisjZGVmaW5lIFVETUFfUlhfRkxPV19JRF9GV19TVEFU VVNfUkVHCTB4ODgKKworLyogVFggY2hhbiBSVCByZWdzICovCisjZGVmaW5lIFVETUFfVENIQU5f UlRfQ1RMX1JFRwkJMHgwCisjZGVmaW5lIFVETUFfVENIQU5fUlRfU1dUUklHX1JFRwkweDgKKyNk ZWZpbmUgVURNQV9UQ0hBTl9SVF9TVERBVEFfUkVHCTB4ODAKKworI2RlZmluZSBVRE1BX1RDSEFO X1JUX1BFRVJuX1JFRyhpKQkoMHgyMDAgKyAoaSAqIDB4NCkpCisjZGVmaW5lIFVETUFfVENIQU5f UlRfUEVFUl9TVEFUSUNfVFJfWFlfUkVHCVwKKwlVRE1BX1RDSEFOX1JUX1BFRVJuX1JFRygwKQkv KiBQU0ktTDogMHg0MDAgKi8KKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9QRUVSX1NUQVRJQ19UUl9a X1JFRwlcCisJVURNQV9UQ0hBTl9SVF9QRUVSbl9SRUcoMSkJLyogUFNJLUw6IDB4NDAxICovCisj ZGVmaW5lIFVETUFfVENIQU5fUlRfUEVFUl9CQ05UX1JFRwkJXAorCVVETUFfVENIQU5fUlRfUEVF Um5fUkVHKDQpCS8qIFBTSS1MOiAweDQwNCAqLworI2RlZmluZSBVRE1BX1RDSEFOX1JUX1BFRVJf UlRfRU5fUkVHCQlcCisJVURNQV9UQ0hBTl9SVF9QRUVSbl9SRUcoOCkJLyogUFNJLUw6IDB4NDA4 ICovCisKKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9QQ05UX1JFRwkJMHg0MDAKKyNkZWZpbmUgVURN QV9UQ0hBTl9SVF9CQ05UX1JFRwkJMHg0MDgKKyNkZWZpbmUgVURNQV9UQ0hBTl9SVF9TQkNOVF9S RUcJCTB4NDEwCisKKy8qIFJYIGNoYW4gUlQgcmVncyAqLworI2RlZmluZSBVRE1BX1JDSEFOX1JU X0NUTF9SRUcJCTB4MAorI2RlZmluZSBVRE1BX1JDSEFOX1JUX1NXVFJJR19SRUcJMHg4CisjZGVm aW5lIFVETUFfUkNIQU5fUlRfU1REQVRBX1JFRwkweDgwCisKKyNkZWZpbmUgVURNQV9SQ0hBTl9S VF9QRUVSbl9SRUcoaSkJKDB4MjAwICsgKGkgKiAweDQpKQorI2RlZmluZSBVRE1BX1JDSEFOX1JU X1BFRVJfU1RBVElDX1RSX1hZX1JFRwlcCisJVURNQV9SQ0hBTl9SVF9QRUVSbl9SRUcoMCkJLyog UFNJLUw6IDB4NDAwICovCisjZGVmaW5lIFVETUFfUkNIQU5fUlRfUEVFUl9TVEFUSUNfVFJfWl9S RUcJXAorCVVETUFfUkNIQU5fUlRfUEVFUm5fUkVHKDEpCS8qIFBTSS1MOiAweDQwMSAqLworI2Rl ZmluZSBVRE1BX1JDSEFOX1JUX1BFRVJfQkNOVF9SRUcJCVwKKwlVRE1BX1JDSEFOX1JUX1BFRVJu X1JFRyg0KQkvKiBQU0ktTDogMHg0MDQgKi8KKyNkZWZpbmUgVURNQV9SQ0hBTl9SVF9QRUVSX1JU X0VOX1JFRwkJXAorCVVETUFfUkNIQU5fUlRfUEVFUm5fUkVHKDgpCS8qIFBTSS1MOiAweDQwOCAq LworCisjZGVmaW5lIFVETUFfUkNIQU5fUlRfUENOVF9SRUcJCTB4NDAwCisjZGVmaW5lIFVETUFf UkNIQU5fUlRfQkNOVF9SRUcJCTB4NDA4CisjZGVmaW5lIFVETUFfUkNIQU5fUlRfU0JDTlRfUkVH CQkweDQxMAorCisvKiBVRE1BX1RDSEFOX1JUX0NUTF9SRUcvVURNQV9SQ0hBTl9SVF9DVExfUkVH ICovCisjZGVmaW5lIFVETUFfQ0hBTl9SVF9DVExfRU4JQklUKDMxKQorI2RlZmluZSBVRE1BX0NI QU5fUlRfQ1RMX1RET1dOCUJJVCgzMCkKKyNkZWZpbmUgVURNQV9DSEFOX1JUX0NUTF9QQVVTRQlC SVQoMjkpCisjZGVmaW5lIFVETUFfQ0hBTl9SVF9DVExfRlRET1dOCUJJVCgyOCkKKyNkZWZpbmUg VURNQV9DSEFOX1JUX0NUTF9FUlJPUglCSVQoMCkKKworLyogVURNQV9UQ0hBTl9SVF9QRUVSX1JU X0VOX1JFRy9VRE1BX1JDSEFOX1JUX1BFRVJfUlRfRU5fUkVHIChQU0ktTDogMHg0MDgpICovCisj ZGVmaW5lIFVETUFfUEVFUl9SVF9FTl9FTkFCTEUJCUJJVCgzMSkKKyNkZWZpbmUgVURNQV9QRUVS X1JUX0VOX1RFQVJET1dOCUJJVCgzMCkKKyNkZWZpbmUgVURNQV9QRUVSX1JUX0VOX1BBVVNFCQlC SVQoMjkpCisjZGVmaW5lIFVETUFfUEVFUl9SVF9FTl9GTFVTSAkJQklUKDI4KQorI2RlZmluZSBV RE1BX1BFRVJfUlRfRU5fSURMRQkJQklUKDEpCisKKy8qCisgKiBVRE1BX1RDSEFOX1JUX1BFRVJf U1RBVElDX1RSX1hZX1JFRyAvCisgKiBVRE1BX1JDSEFOX1JUX1BFRVJfU1RBVElDX1RSX1hZX1JF RworICovCisjZGVmaW5lIFBETUFfU1RBVElDX1RSX1hfTUFTSwkJR0VOTUFTSygyNiwgMjQpCisj ZGVmaW5lIFBETUFfU1RBVElDX1RSX1hfU0hJRlQJCSgyNCkKKyNkZWZpbmUgUERNQV9TVEFUSUNf VFJfWV9NQVNLCQlHRU5NQVNLKDExLCAwKQorI2RlZmluZSBQRE1BX1NUQVRJQ19UUl9ZX1NISUZU CQkoMCkKKworI2RlZmluZSBQRE1BX1NUQVRJQ19UUl9ZKHgpCVwKKwkoKCh4KSA8PCBQRE1BX1NU QVRJQ19UUl9ZX1NISUZUKSAmIFBETUFfU1RBVElDX1RSX1lfTUFTSykKKyNkZWZpbmUgUERNQV9T VEFUSUNfVFJfWCh4KQlcCisJKCgoeCkgPDwgUERNQV9TVEFUSUNfVFJfWF9TSElGVCkgJiBQRE1B X1NUQVRJQ19UUl9YX01BU0spCisKKy8qCisgKiBVRE1BX1RDSEFOX1JUX1BFRVJfU1RBVElDX1RS X1pfUkVHIC8KKyAqIFVETUFfUkNIQU5fUlRfUEVFUl9TVEFUSUNfVFJfWl9SRUcKKyAqLworI2Rl ZmluZSBQRE1BX1NUQVRJQ19UUl9aX01BU0sJCUdFTk1BU0soMTEsIDApCisjZGVmaW5lIFBETUFf U1RBVElDX1RSX1pfU0hJRlQJCSgwKQorI2RlZmluZSBQRE1BX1NUQVRJQ19UUl9aKHgpCVwKKwko KCh4KSA8PCBQRE1BX1NUQVRJQ19UUl9aX1NISUZUKSAmIFBETUFfU1RBVElDX1RSX1pfTUFTSykK KworLyogUHJpdmF0ZSBBUEkgdG8gVURNQSB2aWEgazMtdWRtYS1wcml2YXRlICovCisjaW5jbHVk ZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWFlbmdpbmUuaD4KKyNpbmNsdWRlIDxs aW51eC9zb2MvdGkvdGlfc2NpX3Byb3RvY29sLmg+CisKK3N0cnVjdCB1ZG1hX2RldjsKK3N0cnVj dCB1ZG1hX3RjaGFuOworc3RydWN0IHVkbWFfcmNoYW47CitzdHJ1Y3QgdWRtYV9yZmxvdzsKKwor ZW51bSB1ZG1hX3JtX3JhbmdlIHsKKwlSTV9SQU5HRV9UQ0hBTiA9IDAsCisJUk1fUkFOR0VfUkNI QU4sCisJUk1fUkFOR0VfUkZMT1csCisJUk1fUkFOR0VfTEFTVCwKK307CisKKy8qIENoYW5uZWwg VGhyb3VnaHB1dCBMZXZlbHMgKi8KK2VudW0gdWRtYV90cF9sZXZlbCB7CisJVURNQV9UUF9OT1JN QUwgPSAwLAorCVVETUFfVFBfSElHSCA9IDEsCisJVURNQV9UUF9MQVNULAorfTsKKworc3RydWN0 IHVkbWFfdGlzY2lfcm0geworCWNvbnN0IHN0cnVjdCB0aV9zY2lfaGFuZGxlICp0aXNjaTsKKwlj b25zdCBzdHJ1Y3QgdGlfc2NpX3JtX3VkbWFwX29wcyAqdGlzY2lfdWRtYXBfb3BzOworCXUzMiAg dGlzY2lfZGV2X2lkOworCisJLyogdGlzY2kgaW5mb3JtYXRpb24gZm9yIFBTSS1MIHRocmVhZCBw YWlyaW5nL3VucGFpcmluZyAqLworCWNvbnN0IHN0cnVjdCB0aV9zY2lfcm1fcHNpbF9vcHMgKnRp c2NpX3BzaWxfb3BzOworCXUzMiAgdGlzY2lfbmF2c3NfZGV2X2lkOworCisJc3RydWN0IHRpX3Nj aV9yZXNvdXJjZSAqcm1fcmFuZ2VzW1JNX1JBTkdFX0xBU1RdOworfTsKKworI2VuZGlmIC8qIEsz X1VETUFfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHQtYmluZGluZ3MvZG1hL2szLXVkbWEu aCBiL2luY2x1ZGUvZHQtYmluZGluZ3MvZG1hL2szLXVkbWEuaApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMDAuLjg5YmE2YTlkNGE4ZgotLS0gL2Rldi9udWxsCisrKyBiL2lu Y2x1ZGUvZHQtYmluZGluZ3MvZG1hL2szLXVkbWEuaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVm IF9fRFRfVElfVURNQV9ICisjZGVmaW5lIF9fRFRfVElfVURNQV9ICisKKyNkZWZpbmUgVURNQV9U Ul9NT0RFCQkwCisjZGVmaW5lIFVETUFfUEtUX01PREUJCTEKKworI2RlZmluZSBVRE1BX0RJUl9U WAkJMAorI2RlZmluZSBVRE1BX0RJUl9SWAkJMQorCisjZGVmaW5lIFBTSUxfU1RBVElDX1RSX05P TkUJMAorI2RlZmluZSBQU0lMX1NUQVRJQ19UUl9YWQkxCisjZGVmaW5lIFBTSUxfU1RBVElDX1RS X01DQU4JMgorCisjZGVmaW5lIFVETUFfUERNQV9UUl9YWShpZCkJCQkJXAorCXRpLHBzaWwtY29u ZmlnIyNpZCB7CQkJCVwKKwkJbGludXgsdWRtYS1tb2RlID0gPFVETUFfVFJfTU9ERT47CVwKKwkJ c3RhdGljdHItdHlwZSA9IDxQU0lMX1NUQVRJQ19UUl9YWT47CVwKKwl9CisKKyNkZWZpbmUgVURN QV9QRE1BX1BLVF9YWShpZCkJCQkJXAorCXRpLHBzaWwtY29uZmlnIyNpZCB7CQkJCVwKKwkJbGlu dXgsdWRtYS1tb2RlID0gPFVETUFfUEtUX01PREU+OwlcCisJCXN0YXRpY3RyLXR5cGUgPSA8UFNJ TF9TVEFUSUNfVFJfWFk+OwlcCisJfQorCisjZW5kaWYgLyogX19EVF9USV9VRE1BX0ggKi8K