Date: Sun, 2 Jan 2011 17:02:21 -0600 From: bv <deboomerang@gmail.com> To: freebsd-current@freebsd.org Subject: [Call for testers] FreeBSD VirtIO Network Driver Message-ID: <AANLkTi=OB%2B1A-zQYupU5w1AoY-EodndexcwEC4kg27x3@mail.gmail.com>
next in thread | raw e-mail | index | archive | help
--20cf30549f434fb2120498e508cb Content-Type: text/plain; charset=ISO-8859-1 Hi. I'd like to present the network VirtIO driver I've been working on for the last few months in my spare time. It is not based on the NetBSD code that is floating around. The attached patch should apply to both recent -current and -stable. Early development was done on VirtualBox, but most has been done on KVM/QEMU. While still a work in progress, the network is mostly feature complete with checksum offloading, TSO, etc, with a couple of caveats: - The VirtIO checksum offload interface doesn't map well to FreeBSD's offloading interface. The network driver is forced to peek inside the incoming/outgoing frames to set the appropriate flags. This could be make more robust with regards to IPv6. - Per Rx/Tx locking needs to be implemented before LRO can happen. - Tx completion interrupts could be basically eliminated when the host supports a certain virtqueue feature. I have a patch that does just that, but haven't had a chance to really test it. I haven't done any real performance testing yet, but here's some informal iperf results between the emulated e1000 device and the VirtIO device on FreeBSD. The host is Fedora 14 running 2.6.35.10-72.fc14.x86_64/qemu-kvm-0.13.0-1.fc14.x86_64. The Linux guest is debain-testing (2.6.32-5-amd64) with a VirtIO network device. The FreeBSD guest is amd64 8-STABLE with both an e1000 and VirtIO network interfaces. Both guests are running on the same host, and the MTU of all interfaces was 1500. Measurements are in Mbits/sec. FreeBSD --> Linux x e1000 + vtnet N Min Max Median Avg Stddev x 6 340 358 348 347.66667 6.2822501 + 6 1529 1540 1538 1535.3333 4.3665394 Difference at 95.0% confidence 1187.67 +/- 6.95891 341.611% +/- 2.0016% (Student's t, pooled s = 5.40987) Linux --> FreeBSD x e1000 + vtnet N Min Max Median Avg Stddev x 11 437 456 449 447.36364 6.4385204 + 11 669 679 671 673.27273 3.5802488 Difference at 95.0% confidence 225.909 +/- 4.6335 50.4979% +/- 1.03573% (Student's t, pooled s = 5.20926) I imagine the lack of LRO makes the FreeBSD receiving results less impressive. Performance is not up to where Linux <--> Linux is at. To use, after applying the patch and compiling, you'll need to load the virtio, virtio_pci, and if_vtnet kernel modules. The virtio module contains the virtqueue transport and a bit of glue code. The virtio_pci module implements the VirtIO PCI interface for device probing and communication with the host. The if_vtnet module contains the network driver. I have a partially complete VirtIO block driver. Hopefully it will be ready for wider testing in a couple of weeks. I'm going to be away from my computer for the next couple of days, I'll get to any email after then. --20cf30549f434fb2120498e508cb Content-Type: application/octet-stream; name="FreeBSD-VirtIO.patch" Content-Disposition: attachment; filename="FreeBSD-VirtIO.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gigirf2l0 ZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLmFtZDY0IGIvc3lzL2NvbmYvZmlsZXMuYW1kNjQK LS0tIGEvc3lzL2NvbmYvZmlsZXMuYW1kNjQKKysrIGIvc3lzL2NvbmYvZmlsZXMuYW1kNjQKQEAg LTIyNSw2ICsyMjUsMTIgQEAKIGRldi90cG0vdHBtX2FjcGkuYwkJb3B0aW9uYWwJdHBtIGFjcGkK IGRldi90cG0vdHBtX2lzYS5jCQlvcHRpb25hbAl0cG0gaXNhCiBkZXYvdWFydC91YXJ0X2NwdV9h bWQ2NC5jCW9wdGlvbmFsCXVhcnQKK2Rldi92aXJ0aW8vdmlydGlvLmMgICAgICAgICAgICAgb3B0 aW9uYWwJdmlydGlvCitkZXYvdmlydGlvL3ZpcnRpb19pZi5tICAgICAgICAgIG9wdGlvbmFsIAl2 aXJ0aW8KK2Rldi92aXJ0aW8vdmlydGlvX2J1c19pZi5tICAgICAgb3B0aW9uYWwJdmlydGlvCitk ZXYvdmlydGlvL3ZpcnRxdWV1ZS5jICAgICAgICAgIG9wdGlvbmFsCXZpcnRpbworZGV2L3ZpcnRp by9wY2kvdmlydGlvX3BjaS5jICAgICBvcHRpb25hbAl2aXJ0aW9fcGNpIHBjaQorZGV2L3ZpcnRp by9uZXR3b3JrL2lmX3Z0bmV0LmMgICBvcHRpb25hbAl2dG5ldAogZGV2L3dwaS9pZl93cGkuYwkJ b3B0aW9uYWwJd3BpCiBpc2Evc3lzY29uc19pc2EuYwkJb3B0aW9uYWwJc2MKIGlzYS92Z2FfaXNh LmMJCQlvcHRpb25hbAl2Z2EKZGlmZiAtLWdpdCBhL3N5cy9jb25mL2ZpbGVzLmkzODYgYi9zeXMv Y29uZi9maWxlcy5pMzg2Ci0tLSBhL3N5cy9jb25mL2ZpbGVzLmkzODYKKysrIGIvc3lzL2NvbmYv ZmlsZXMuaTM4NgpAQCAtMjM1LDYgKzIzNSwxMiBAQAogZGV2L3RwbS90cG1fYWNwaS5jCQlvcHRp b25hbCB0cG0gYWNwaQogZGV2L3RwbS90cG1faXNhLmMJCW9wdGlvbmFsIHRwbSBpc2EKIGRldi91 YXJ0L3VhcnRfY3B1X2kzODYuYwlvcHRpb25hbCB1YXJ0CitkZXYvdmlydGlvL3ZpcnRpby5jICAg ICAgICAgICAgIG9wdGlvbmFsIHZpcnRpbworZGV2L3ZpcnRpby92aXJ0aW9faWYubSAgICAgICAg ICBvcHRpb25hbCB2aXJ0aW8KK2Rldi92aXJ0aW8vdmlydGlvX2J1c19pZi5tICAgICAgb3B0aW9u YWwgdmlydGlvCitkZXYvdmlydGlvL3ZpcnRxdWV1ZS5jICAgICAgICAgIG9wdGlvbmFsIHZpcnRp bworZGV2L3ZpcnRpby9wY2kvdmlydGlvX3BjaS5jICAgICBvcHRpb25hbCB2aXJ0aW9fcGNpIHBj aQorZGV2L3ZpcnRpby9uZXR3b3JrL2lmX3Z0bmV0LmMgICBvcHRpb25hbCB2dG5ldAogZGV2L2Fj cGljYS9hY3BpX2lmLm0JCXN0YW5kYXJkCiBkZXYvYWNwaV9zdXBwb3J0L2FjcGlfd21pX2lmLm0J c3RhbmRhcmQKIGRldi93cGkvaWZfd3BpLmMJCW9wdGlvbmFsIHdwaQpkaWZmIC0tZ2l0IGEvc3lz L2NvbmYva21vZC5tayBiL3N5cy9jb25mL2ttb2QubWsKLS0tIGEvc3lzL2NvbmYva21vZC5tawor KysgYi9zeXMvY29uZi9rbW9kLm1rCkBAIC0zNjEsNiArMzYxLDcgQEAKIAlkZXYvc291bmQvcGNt L2ZlZWRlcl9pZi5tIGRldi9zb3VuZC9wY20vbWl4ZXJfaWYubSBcCiAJZGV2L3NvdW5kL21pZGkv bXB1X2lmLm0gZGV2L3NvdW5kL21pZGkvbXB1Zm9pX2lmLm0gXAogCWRldi9zb3VuZC9taWRpL3N5 bnRoX2lmLm0gZGV2L3VzYi91c2JfaWYubSBpc2EvaXNhX2lmLm0gXAorCWRldi92aXJ0aW8vdmly dGlvX2J1c19pZi5tIGRldi92aXJ0aW8vdmlydGlvX2lmLm0gXAogCWtlcm4vYnVzX2lmLm0ga2Vy bi9jbG9ja19pZi5tIFwKIAlrZXJuL2NwdWZyZXFfaWYubSBrZXJuL2RldmljZV9pZi5tIGtlcm4v c2VyZGV2X2lmLm0gXAogCWxpYmtlcm4vaWNvbnZfY29udmVydGVyX2lmLm0gb3BlbmNyeXB0by9j cnlwdG9kZXZfaWYubSBcCmRpZmYgLS1naXQgYS9zeXMvZGV2L3ZpcnRpby9uZXR3b3JrL2lmX3Z0 bmV0LmMgYi9zeXMvZGV2L3ZpcnRpby9uZXR3b3JrL2lmX3Z0bmV0LmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvZGV2L3ZpcnRpby9uZXR3b3JrL2lmX3Z0bmV0 LmMKQEAgLTAsMCArMSwyNzU4IEBACisvKiBEcml2ZXIgZm9yIFZpcnRJTyBuZXR3b3JrIGRldmlj ZXMuICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2lmZGVmIEhBVkVfS0VSTkVMX09Q VElPTl9IRUFERVJTCisjaW5jbHVkZSAib3B0X2RldmljZV9wb2xsaW5nLmgiCisjZW5kaWYKKwor I2luY2x1ZGUgPHN5cy9wYXJhbS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUg PHN5cy9rZXJuZWwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CisjaW5jbHVkZSA8c3lzL21i dWYuaD4KKyNpbmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL21vZHVsZS5oPgor I2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRl IDxzeXMvc3lzY3RsLmg+CisjaW5jbHVkZSA8c3lzL3Rhc2txdWV1ZS5oPgorI2luY2x1ZGUgPHN5 cy9yYW5kb20uaD4KKyNpbmNsdWRlIDxzeXMvc2dsaXN0Lmg+CisjaW5jbHVkZSA8c3lzL2xvY2su aD4KKyNpbmNsdWRlIDxzeXMvbXV0ZXguaD4KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1 ZGUgPG5ldC9pZl9hcnAuaD4KKyNpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKyNpbmNsdWRlIDxu ZXQvaWZfZGwuaD4KKyNpbmNsdWRlIDxuZXQvaWZfdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXQvaWZf dmxhbl92YXIuaD4KKworI2luY2x1ZGUgPG5ldC9icGYuaD4KKworI2luY2x1ZGUgPG5ldGluZXQv aW5fc3lzdG0uaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9p cC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4K KyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPG5ldGluZXQvc2N0cC5oPgorCisj aW5jbHVkZSA8bWFjaGluZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL2luX2Nrc3VtLmg+Cisj aW5jbHVkZSA8bWFjaGluZS9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9idXMuaD4KKyNpbmNs dWRlIDxzeXMvcm1hbi5oPgorCisjaW5jbHVkZSA8ZGV2L3ZpcnRpby92aXJ0aW8uaD4KKyNpbmNs dWRlIDxkZXYvdmlydGlvL3ZpcnRxdWV1ZS5oPgorI2luY2x1ZGUgPGRldi92aXJ0aW8vbmV0d29y ay92aXJ0aW9fbmV0X3JlZy5oPgorCisjaW5jbHVkZSAidmlydGlvX2J1c19pZi5oIgorI2luY2x1 ZGUgInZpcnRpb19pZi5oIgorCitzdHJ1Y3QgdnRuZXRfc3RhdGlzdGljcyB7CisJdW5zaWduZWQg bG9uZwltYnVmX2FsbG9jX2ZhaWxlZDsKKworCS8qIFJ4IHN0YXRpc3RpY3MuICovCisJdW5zaWdu ZWQgbG9uZwlyeF9tZXJnZWFibGVfZmFpbGVkOworCXVuc2lnbmVkIGxvbmcJcnhfY3N1bV9vZmZs b2FkZWQ7CisJdW5zaWduZWQgbG9uZwlyeF9jc3VtX3Vua25vd25fZXR5cGU7CisJdW5zaWduZWQg bG9uZwlyeF9jc3VtX2JhZF9zdGFydDsKKwl1bnNpZ25lZCBsb25nCXJ4X2NzdW1fdW5rbm93bl9p cHByb3RvOworCXVuc2lnbmVkIGxvbmcJcnhfY3N1bV9iYWRfb2Zmc2V0OworCisJLyogVHggc3Rh dGlzdGljcy4gKi8KKwl1bnNpZ25lZCBsb25nCXR4X2VucXVldWVfZmFpbGVkOworCXVuc2lnbmVk IGxvbmcJdHhfY3N1bV9vZmZsb2FkZWQ7CisJdW5zaWduZWQgbG9uZwl0eF9jc3VtX3Vua25vd25f ZXR5cGU7CisJdW5zaWduZWQgbG9uZwl0eF90c29fdW5rbm93bl9ldHlwZTsKK307CisKK3N0cnVj dCB2dG5ldF9zb2Z0YyB7CisJZGV2aWNlX3QJCSB2dG5ldF9kZXY7CisJc3RydWN0IGlmbmV0CQkq dnRuZXRfaWZwOworCXN0cnVjdCBtdHgJCSB2dG5ldF9tdHg7CisKKwl1aW50MzJfdAkJIHZ0bmV0 X2ZsYWdzOworI2RlZmluZSBWVE5FVF9GTEFHX0xJTksJCSAweDAwMDEKKyNkZWZpbmUgVlRORVRf RkxBR19TVVNQRU5ERUQJIDB4MDAwMgorI2RlZmluZSBWVE5FVF9GTEFHX0NUUkxfVlEJIDB4MDAw NAorI2RlZmluZSBWVE5FVF9GTEFHX0NUUkxfUlgJIDB4MDAwOAorI2RlZmluZSBWVE5FVF9GTEFH X1ZMQU5fRklMVEVSCSAweDAwMTAKKyNkZWZpbmUgVlRORVRfRkxBR19IV19DU1VNCSAweDAwMjAK KyNkZWZpbmUgVlRORVRfRkxBR19UU09fRUNOCSAweDAwNDAKKyNkZWZpbmUgVlRORVRfRkxBR19N UkdfUlhCVUZTCSAweDAwODAKKworCXN0cnVjdCB2aXJ0cXVldWUJKnZ0bmV0X3J4X3ZxOworCXN0 cnVjdCB2aXJ0cXVldWUJKnZ0bmV0X3R4X3ZxOworCXN0cnVjdCB2aXJ0cXVldWUJKnZ0bmV0X2N0 cmxfdnE7CisKKwlpbnQJCQkgdnRuZXRfaGRyX3NpemU7CisJaW50CQkJIHZ0bmV0X3J4X3NpemU7 CisJaW50CQkJIHZ0bmV0X3J4X3Byb2Nlc3NfbGltaXQ7CisJaW50CQkJIHZ0bmV0X3J4X21idWZf c2l6ZTsKKwlpbnQJCQkgdnRuZXRfdHhfc2l6ZTsKKwlpbnQJCQkgdnRuZXRfdHhfaGl3YXQ7CisJ aW50CQkgCSB2dG5ldF9pZl9mbGFnczsKKwlpbnQJCQkgdnRuZXRfd2F0Y2hkb2dfdGltZXI7CisJ dWludDMyX3QJCSB2dG5ldF9mZWF0dXJlczsKKworCXN0cnVjdCB0YXNrcXVldWUJKnZ0bmV0X3Rx OworCXN0cnVjdCB0YXNrCQkgdnRuZXRfcnhfaW50cl90YXNrOworCXN0cnVjdCB0YXNrCQkgdnRu ZXRfdHhfaW50cl90YXNrOworCXN0cnVjdCB0YXNrCQkgdnRuZXRfdHhfdGFzazsKKwlzdHJ1Y3Qg dGFzawkJIHZ0bmV0X2NmZ2NoZ190YXNrOworCisJc3RydWN0IHZ0bmV0X3N0YXRpc3RpY3MJIHZ0 bmV0X3N0YXRzOworCisJc3RydWN0IGNhbGxvdXQJCSB2dG5ldF90aWNrX2NoOworCisJZXZlbnRo YW5kbGVyX3RhZwkgdnRuZXRfdmxhbl9hdHRhY2g7CisJZXZlbnRoYW5kbGVyX3RhZwkgdnRuZXRf dmxhbl9kZXRhY2g7CisKKwljaGFyCQkJIHZ0bmV0X2h3YWRkcltFVEhFUl9BRERSX0xFTl07CisK KwkvKgorCSAqIE9uIHJlc2V0LCBWTEFOJ3MgcmVnaXN0ZXJlZCB3aXRoIGhvc3QgYXJlIGxvc3Qu IFVzZQorCSAqIHRoaXMgdGFibGUgdG8gcmVtZW1iZXIgd2hhdCBWTEFOcyB3ZSdyZSBmaWx0ZXJp bmcuCisJICoKKwkgKiA0MDk2IFZMQU5zIC8gMzIgPSAxMjggZW50cmllcyBuZWVkZWQuCisJICov CisjZGVmaW5lIFZUTkVUX1ZMQU5fVEFCTEVfU1oJIDEyOAorCWludAkJCSB2dG5ldF9udmxhbnM7 CisJdWludDMyX3QJCSB2dG5ldF92bGFuX3RhYmxlW1ZUTkVUX1ZMQU5fVEFCTEVfU1pdOworfTsK KworLyoKKyAqIERhdGEgc3RydWN0dXJlIHByZXBlbmRlZCB0byBlYWNoIFJ4IG1idWYncyBkYXRh IGFyZWEgd2hlbgorICogbm90IHVzaW5nIG1lcmdlYWJsZSBSeCBidWZmZXJzLiBXaGVuIHVzaW5n IG1lcmdlYWJsZSBSeAorICogYnVmZmVycywgdGhlIGhlYWRlciBpcyBpbmxpbmUgd2l0aCB0aGUg bGVhZGluZyBtYnVmJ3MgZGF0YS4KKyAqCisgKiBQYWQgd2l0aCA0IGJ5dGVzIHRvIGtlZXAgdGhl IGhlYWRlciBhbmQgZGF0YSBhcmVhcyBub24tCisgKiBjb250aWd1b3VzIGFuZCB0aGUgZnJhbWUg cGF5bG9hZCBzdGFydGluZyBvbiBhIDQgYnl0ZQorICogYm91bmRhcnk6ICgxMCArIDQgKyAxNCkg JSA0ID09IDAuCisgKi8KKyNkZWZpbmUgVlRORVRfUlhfTUJVRl9IRUFERVJfUEFECTQKK3N0cnVj dCB2dG5ldF9yeF9tYnVmX2hlYWRlciB7CisJc3RydWN0IHZpcnRpb19uZXRfaGRyCXZyaF9oZHI7 CisJY2hhcgkJCXZyaF9wYWRbVlRORVRfUlhfTUJVRl9IRUFERVJfUEFEXTsKK30gX19wYWNrZWQ7 CisKKy8qCisgKiBTdHJ1Y3R1cmUgcHJlcGVuZGVkIHRvIGVhY2ggVHggbWJ1ZidzIGRhdGEgYXJl YSwgcmVnYXJkbGVzcyBpZgorICogbWVyZ2VhYmxlIGJ1ZmZlcnMgaGF2ZSBiZWVuIG5lZ290aWF0 ZWQuIFdoZW4gdXNpbmcgbWVyZ2VhYmxlCisgKiBidWZmZXJzLCB0aGUgYG51bV9idWZmZXJzYCBv ZiB0aGUgbWVyZ2VhYmxlIGhlYWRlciBtdXN0IGJlIHplcm8uCisgKiBUbyBtYWtlIHRoaW5ncyBl YXNpZXIsIHdlIHByZXBlbmQgdGhlIHNhbWUgc3RydWN0dXJlIHJlZ2FyZGxlc3MsCisgKiBhbmQg dXNlIGB2dG5ldF9oZHJfc2l6ZWAgYXMgdGhlIGhlYWRlciBzaXplIHdlIHRlbGwgdGhlIGhvc3Qu CisgKi8KK3N0cnVjdCB2dG5ldF90eF9tYnVmX2hlYWRlciB7CisJdW5pb24geworCQlzdHJ1Y3Qg dmlydGlvX25ldF9oZHIJCWhkcjsKKwkJc3RydWN0IHZpcnRpb19uZXRfaGRyX21yZ19yeGJ1Zglt aGRyOworCX0gdnRoX3VoZHI7CisKKwkvKiBNYWtlIGhlYWRlciBhbmQgZGF0YSBub24tY29udGln dW91cy4gKi8KKwljaGFyCQkJCQl2dGhfcGFkWzJdOworfSBfX3BhY2tlZDsKKworLyoKKyAqIEZv ciBNQUMgYWRkcmVzcyBmaWx0ZXJpbmcsIHdlJ3JlIHN1cHBvc2UgdG8gYXNzdW1lIGFuIGluZmlu aXRlIGxpbWl0LgorICogSW4gcHJhY3RpY2UsIHdlJ3JlIGxpbWl0ZWQgYnkgdGhlIGhvc3QncyBh dmFpbGFibGUgcmVzb3VyY2VzLiBJdCBtYWtlcworICogdGhpbmdzIGVhc2llciBpZiB3ZSBpbXBv c2UgYSByZWFzb25hYmxlIGxpbWl0IG9uIG91cnNlbHZlcywgZW5zdXJpbmcKKyAqIHRoZSByZXN1 bHRpbmcgdW5pY2FzdCBhbmQgbXVsdGljYXN0IHRhYmxlcyBmaXQgaW4gb25lIHBhZ2UuCisgKi8K KyNkZWZpbmUgVlRORVRfTUFYX01BQ19FTlRSSUVTCTI1Ngorc3RydWN0IHZ0bmV0X21hY190YWJs ZSB7CisJdWludDMyX3QJbmVudHJpZXM7CisJdWludDhfdCAJbWFjc1tWVE5FVF9NQVhfTUFDX0VO VFJJRVNdW0VUSEVSX0FERFJfTEVOXTsKK30gX19wYWNrZWQ7CisKK3N0cnVjdCB2dG5ldF9tYWNf ZmlsdGVyIHsKKwlzdHJ1Y3QgdnRuZXRfbWFjX3RhYmxlCXZtZl91bmk7CisKKwkvKiBQYWQgdG8g bWFrZSB0aGUgdW5pY2FzdCBhbmQgbXVsdGljYXN0IHRhYmxlcyBub24tY29udGlndW91cy4gKi8K Kwl1aW50MTZfdAkJdm1mX3BhZDsKKworCXN0cnVjdCB2dG5ldF9tYWNfdGFibGUJdm1mX211bDsK K307CitDVEFTU0VSVChzaXplb2Yoc3RydWN0IHZ0bmV0X21hY19maWx0ZXIpIDw9IFBBR0VfU0la RSk7CisKK3N0YXRpYyBzdHJ1Y3QgdmlydGlvX2ZlYXR1cmVfZGVzYyB2dG5ldF9mZWF0dXJlX2Rl c2NbXSA9IHsKKwl7IFZJUlRJT19ORVRfRl9DU1VNLAkJIlR4Q2hlY2tzdW0iCX0sCisJeyBWSVJU SU9fTkVUX0ZfR1VFU1RfQ1NVTSwJIlJ4Q2hlY2tzdW0iCX0sCisJeyBWSVJUSU9fTkVUX0ZfTUFD LAkJIk1hY0FkZHJlc3MiCX0sCisJeyBWSVJUSU9fTkVUX0ZfR1NPLAkJIlR4QWxsR1NPIgl9LAor CXsgVklSVElPX05FVF9GX0dVRVNUX1RTTzQsCSJSeFRTT3Y0Igl9LAorCXsgVklSVElPX05FVF9G X0dVRVNUX1RTTzYsCSJSeFRTT3Y2Igl9LAorCXsgVklSVElPX05FVF9GX0dVRVNUX0VDTiwJIlJ4 RUNOIgkJfSwKKwl7IFZJUlRJT19ORVRfRl9HVUVTVF9VRk8sCSJSeFVGTyIJCX0sCisJeyBWSVJU SU9fTkVUX0ZfSE9TVF9UU080LAkiVHhUU092NCIJfSwKKwl7IFZJUlRJT19ORVRfRl9IT1NUX1RT TzYsCSJUeFRTT3Y2Igl9LAorCXsgVklSVElPX05FVF9GX0hPU1RfRUNOLAkiVHhUU09FQ04iCX0s CisJeyBWSVJUSU9fTkVUX0ZfSE9TVF9VRk8sCSJUeFVGTyIJCX0sCisJeyBWSVJUSU9fTkVUX0Zf TVJHX1JYQlVGLAkiTXJnUnhCdWYiCX0sCisJeyBWSVJUSU9fTkVUX0ZfU1RBVFVTLAkJIlN0YXR1 cyIJfSwKKwl7IFZJUlRJT19ORVRfRl9DVFJMX1ZRLAkJIkNvbnRyb2xWcSIJfSwKKwl7IFZJUlRJ T19ORVRfRl9DVFJMX1JYLAkJIlJ4TW9kZSIJfSwKKwl7IFZJUlRJT19ORVRfRl9DVFJMX1ZMQU4s CSJWTGFuRmlsdGVyIgl9LAorCXsgVklSVElPX05FVF9GX0NUUkxfUlhfRVhUUkEsCSJSeE1vZGVF eHRyYSIJfSwKKworCXsgMCwgTlVMTCB9Cit9OworCitzdGF0aWMgaW50CXZ0bmV0X3Byb2JlKGRl dmljZV90KTsKK3N0YXRpYyBpbnQJdnRuZXRfYXR0YWNoKGRldmljZV90KTsKK3N0YXRpYyBpbnQg CXZ0bmV0X2RldGFjaChkZXZpY2VfdCk7CitzdGF0aWMgaW50CXZ0bmV0X3N1c3BlbmQoZGV2aWNl X3QpOworc3RhdGljIGludAl2dG5ldF9yZXN1bWUoZGV2aWNlX3QpOworc3RhdGljIGludAl2dG5l dF9zaHV0ZG93bihkZXZpY2VfdCk7CitzdGF0aWMgaW50CXZ0bmV0X2NvbmZpZ19jaGFuZ2UoZGV2 aWNlX3QpOworCitzdGF0aWMgdm9pZAl2dG5ldF9uZWdvdGlhdGVfZmVhdHVyZXMoc3RydWN0IHZ0 bmV0X3NvZnRjICopOworc3RhdGljIGludAl2dG5ldF9hbGxvY192aXJ0cXVldWVzKHN0cnVjdCB2 dG5ldF9zb2Z0YyAqKTsKK3N0YXRpYyB2b2lkCXZ0bmV0X2dldF9od2FkZHIoc3RydWN0IHZ0bmV0 X3NvZnRjICopOworc3RhdGljIHZvaWQJdnRuZXRfc2V0X2h3YWRkcihzdHJ1Y3QgdnRuZXRfc29m dGMgKik7CitzdGF0aWMgdm9pZAl2dG5ldF91cGRhdGVfbGlua19zdGF0dXMoc3RydWN0IHZ0bmV0 X3NvZnRjICopOworc3RhdGljIHZvaWQJdnRuZXRfd2F0Y2hkb2coc3RydWN0IHZ0bmV0X3NvZnRj ICopOworc3RhdGljIHZvaWQJdnRuZXRfY29uZmlnX2NoYW5nZV90YXNrKHZvaWQgKiwgaW50KTsK K3N0YXRpYyBpbnQJdnRuZXRfY2hhbmdlX210dShzdHJ1Y3QgdnRuZXRfc29mdGMgKiwgaW50KTsK K3N0YXRpYyBpbnQJdnRuZXRfaW9jdGwoc3RydWN0IGlmbmV0ICosIHVfbG9uZywgY2FkZHJfdCk7 CisKK3N0YXRpYyBpbnQJdnRuZXRfaW5pdF9yeF92cShzdHJ1Y3QgdnRuZXRfc29mdGMgKik7Citz dGF0aWMgdm9pZAl2dG5ldF9mcmVlX3J4X21idWZzKHN0cnVjdCB2dG5ldF9zb2Z0YyAqKTsKK3N0 YXRpYyB2b2lkCXZ0bmV0X2ZyZWVfdHhfbWJ1ZnMoc3RydWN0IHZ0bmV0X3NvZnRjICopOworc3Rh dGljIHZvaWQJdnRuZXRfZnJlZV9jdHJsX3ZxKHN0cnVjdCB2dG5ldF9zb2Z0YyAqKTsKKworI2lm ZGVmIERFVklDRV9QT0xMSU5HCitzdGF0aWMgcG9sbF9oYW5kbGVyX3QgdnRuZXRfcG9sbDsKKyNl bmRpZgorCitzdGF0aWMgaW50CXZ0bmV0X25ld2J1ZihzdHJ1Y3QgdnRuZXRfc29mdGMgKik7Citz dGF0aWMgdm9pZAl2dG5ldF9kaXNjYXJkX21lcmdlZF9yeGJ1ZihzdHJ1Y3QgdnRuZXRfc29mdGMg KiwgaW50KTsKK3N0YXRpYyB2b2lkCXZ0bmV0X2Rpc2NhcmRfcnhidWYoc3RydWN0IHZ0bmV0X3Nv ZnRjICosIHN0cnVjdCBtYnVmICopOworc3RhdGljIGludAl2dG5ldF9lbnF1ZXVlX3J4YnVmKHN0 cnVjdCB2dG5ldF9zb2Z0YyAqLCBzdHJ1Y3QgbWJ1ZiAqKTsKK3N0YXRpYyB2b2lkCXZ0bmV0X3Zs YW5fdGFnX3JlbW92ZShzdHJ1Y3QgbWJ1ZiAqKTsKK3N0YXRpYyBpbnQJdnRuZXRfcnhfY3N1bShz dHJ1Y3QgdnRuZXRfc29mdGMgKiwgc3RydWN0IG1idWYgKiwKKwkJICAgIHN0cnVjdCB2aXJ0aW9f bmV0X2hkciAqKTsKK3N0YXRpYyBpbnQJdnRuZXRfcnhlb2ZfbWVyZ2VkKHN0cnVjdCB2dG5ldF9z b2Z0YyAqLCBzdHJ1Y3QgbWJ1ZiAqLAorCQkgICAgaW50KTsKK3N0YXRpYyBpbnQJdnRuZXRfcnhl b2Yoc3RydWN0IHZ0bmV0X3NvZnRjICosIGludCwgaW50ICopOworc3RhdGljIHZvaWQJdnRuZXRf cnhfaW50cl90YXNrKHZvaWQgKiwgaW50KTsKK3N0YXRpYyBpbnQJdnRuZXRfcnhfdnFfaW50cih2 b2lkICopOworCitzdGF0aWMgdm9pZAl2dG5ldF90eGVvZihzdHJ1Y3QgdnRuZXRfc29mdGMgKik7 CitzdGF0aWMgc3RydWN0IG1idWYgKiB2dG5ldF92bGFuX3RhZ19pbnNlcnQoc3RydWN0IG1idWYg Kik7CitzdGF0aWMgc3RydWN0IG1idWYgKiB2dG5ldF9nZXRfZnJhbWVfdHlwZShzdHJ1Y3QgbWJ1 ZiAqLCB1aW50MTZfdCAqLCBpbnQgKik7CitzdGF0aWMgc3RydWN0IG1idWYgKiB2dG5ldF9zZXR1 cF90c28oc3RydWN0IHZ0bmV0X3NvZnRjICosIHN0cnVjdCBtYnVmICosCisJCSAgICBzdHJ1Y3Qg dmlydGlvX25ldF9oZHIgKiwgdWludDE2X3QsIGludCk7CitzdGF0aWMgc3RydWN0IG1idWYgKiB2 dG5ldF90eF9jc3VtKHN0cnVjdCB2dG5ldF9zb2Z0YyAqLCBzdHJ1Y3QgbWJ1ZiAqLAorCQkgICAg c3RydWN0IHZpcnRpb19uZXRfaGRyICosIHVpbnQxNl90LCBpbnQpOworc3RhdGljIGludAl2dG5l dF9lbnF1ZXVlX3R4YnVmKHN0cnVjdCB2dG5ldF9zb2Z0YyAqLCBzdHJ1Y3QgbWJ1ZiAqKiwKKwkJ ICAgIHN0cnVjdCB2dG5ldF90eF9tYnVmX2hlYWRlciAqKTsKK3N0YXRpYyBpbnQJdnRuZXRfZW5j YXAoc3RydWN0IHZ0bmV0X3NvZnRjICosIHN0cnVjdCBtYnVmICoqKTsKK3N0YXRpYyB2b2lkCXZ0 bmV0X3N0YXJ0X2xvY2tlZChzdHJ1Y3QgaWZuZXQgKik7CitzdGF0aWMgdm9pZAl2dG5ldF9zdGFy dChzdHJ1Y3QgaWZuZXQgKik7CitzdGF0aWMgdm9pZAl2dG5ldF90eF90YXNrKHZvaWQgKiwgaW50 KTsKK3N0YXRpYyB2b2lkCXZ0bmV0X3RpY2sodm9pZCAqKTsKK3N0YXRpYyB2b2lkCXZ0bmV0X3R4 X2ludHJfdGFzayh2b2lkICosIGludCk7CitzdGF0aWMgaW50CXZ0bmV0X3R4X3ZxX2ludHIodm9p ZCAqKTsKKworc3RhdGljIHZvaWQJdnRuZXRfc3RvcChzdHJ1Y3QgdnRuZXRfc29mdGMgKik7Citz dGF0aWMgaW50CXZ0bmV0X3JlaW5pdChzdHJ1Y3QgdnRuZXRfc29mdGMgKik7CitzdGF0aWMgdm9p ZAl2dG5ldF9pbml0X2xvY2tlZChzdHJ1Y3QgdnRuZXRfc29mdGMgKik7CitzdGF0aWMgdm9pZAl2 dG5ldF9pbml0KHZvaWQgKik7CisKK3N0YXRpYyB2b2lkCXZ0bmV0X2V4ZWNfY3RybF9jbWQoc3Ry dWN0IHZ0bmV0X3NvZnRjICosIHZvaWQgKiwKKwkJICAgIHN0cnVjdCBzZ2xpc3QgKiwgaW50LCBp bnQpOworCitzdGF0aWMgdm9pZAl2dG5ldF9yeF9maWx0ZXIoc3RydWN0IHZ0bmV0X3NvZnRjICpz Yyk7CitzdGF0aWMgaW50CXZ0bmV0X2N0cmxfcnhfY21kKHN0cnVjdCB2dG5ldF9zb2Z0YyAqLCBp bnQsIGludCk7CitzdGF0aWMgaW50CXZ0bmV0X3NldF9wcm9taXNjKHN0cnVjdCB2dG5ldF9zb2Z0 YyAqLCBpbnQpOworc3RhdGljIGludAl2dG5ldF9zZXRfYWxsbXVsdGkoc3RydWN0IHZ0bmV0X3Nv ZnRjICosIGludCk7CitzdGF0aWMgdm9pZAl2dG5ldF9yeF9maWx0ZXJfbWFjKHN0cnVjdCB2dG5l dF9zb2Z0YyAqKTsKKworc3RhdGljIGludAl2dG5ldF9leGVjX3ZsYW5fZmlsdGVyKHN0cnVjdCB2 dG5ldF9zb2Z0YyAqLCBpbnQsIHVpbnQxNl90KTsKK3N0YXRpYyB2b2lkCXZ0bmV0X3J4X2ZpbHRl cl92bGFuKHN0cnVjdCB2dG5ldF9zb2Z0YyAqKTsKK3N0YXRpYyB2b2lkCXZ0bmV0X3NldF92bGFu X2ZpbHRlcihzdHJ1Y3QgdnRuZXRfc29mdGMgKiwgaW50LCB1aW50MTZfdCk7CitzdGF0aWMgdm9p ZAl2dG5ldF9yZWdpc3Rlcl92bGFuKHZvaWQgKiwgc3RydWN0IGlmbmV0ICosIHVpbnQxNl90KTsK K3N0YXRpYyB2b2lkCXZ0bmV0X3VucmVnaXN0ZXJfdmxhbih2b2lkICosIHN0cnVjdCBpZm5ldCAq LCB1aW50MTZfdCk7CisKK3N0YXRpYyB2b2lkCXZ0bmV0X2FkZF9zdGF0aXN0aWNzKHN0cnVjdCB2 dG5ldF9zb2Z0YyAqKTsKKworc3RhdGljIGludAl2dG5ldF9lbmFibGVfcnhfaW50cihzdHJ1Y3Qg dnRuZXRfc29mdGMgKik7CitzdGF0aWMgaW50CXZ0bmV0X2VuYWJsZV90eF9pbnRyKHN0cnVjdCB2 dG5ldF9zb2Z0YyAqKTsKK3N0YXRpYyB2b2lkCXZ0bmV0X2Rpc2FibGVfcnhfaW50cihzdHJ1Y3Qg dnRuZXRfc29mdGMgKik7CitzdGF0aWMgdm9pZAl2dG5ldF9kaXNhYmxlX3R4X2ludHIoc3RydWN0 IHZ0bmV0X3NvZnRjICopOworc3RhdGljIHZvaWQJdnRuZXRfZGlzYWJsZV9jdHJsX2ludHIoc3Ry dWN0IHZ0bmV0X3NvZnRjICopOworCisvKiBGZWF0dXJlcyBkZXNpcmVkL2ltcGxlbWVudGVkIGJ5 IHRoaXMgZHJpdmVyLiAqLworI2RlZmluZSBWVE5FVF9JTVBMX0ZFQVRVUkVTIFwKKyAgICAoVklS VElPX05FVF9GX01BQyB8IFZJUlRJT19ORVRfRl9TVEFUVVMgfCBWSVJUSU9fTkVUX0ZfQ1RSTF9W UQl8IFwKKyAgICAgVklSVElPX05FVF9GX0NUUkxfUlggfCBWSVJUSU9fTkVUX0ZfQ1RSTF9WTEFO CQkJfCBcCisgICAgIFZJUlRJT19ORVRfRl9DU1VNIHwgVklSVElPX05FVF9GX0hPU1RfVFNPNCB8 IFZJUlRJT19ORVRfRl9IT1NUX0VDTgl8IFwKKyAgICAgVklSVElPX05FVF9GX0dVRVNUX0NTVU0g fCBWSVJUSU9fTkVUX0ZfTVJHX1JYQlVGCQkJfCBcCisgICAgIFZJUlRJT19GX05PVElGWV9PTl9F TVBUWSB8IFZJUlRJT19GX1JJTkdfSU5ESVJFQ1RfREVTQykKKworLyogRmVhdHVyZXMgb25seSBh dmFpbGFibGUgd2l0aCBWSVJUSU9fTkVUX0ZfQ1NVTSAoVHgpLiAqLworI2RlZmluZSBWVE5FVF9I T1NUX0NTVU1fRkVBVFVSRVMgXAorICAgIChWSVJUSU9fTkVUX0ZfSE9TVF9UU080IHwgVklSVElP X05FVF9GX0hPU1RfVFNPNiB8IFwKKyAgICAgVklSVElPX05FVF9GX0hPU1RfRUNOIHwgVklSVElP X05FVF9GX0hPU1RfVUZPKQorCisvKiBGZWF0dXJlcyBvbmx5IGF2YWlsYWJsZSB3aXRoIFZJUlRJ T19ORVRfRl9HVUVTVF9DU1VNIChSeCkuICovCisjZGVmaW5lIFZUTkVUX0dVRVNUX0NTVU1fRkVB VFVSRVMgXAorICAgIChWSVJUSU9fTkVUX0ZfR1VFU1RfVFNPNCB8IFZJUlRJT19ORVRfRl9HVUVT VF9UU082IHwgXAorICAgICBWSVJUSU9fTkVUX0ZfR1VFU1RfRUNOIHwgVklSVElPX05FVF9GX0dV RVNUX1VGTykKKworLyoKKyAqIFVzZWQgdG8gcHJlYWxsb2NhdGUgdGhlIFZxIGluZGlyZWN0IGRl c2NyaXB0b3JzLiBPbmUgc2VnbWVudAorICogaXMgcmVzZXJ2ZWQgZm9yIHRoZSBoZWFkZXIuCisg Ki8KKyNkZWZpbmUgVlRORVRfTUFYX1JYX1NFR1MJMgorI2RlZmluZSBWVE5FVF9NQVhfVFhfU0VH UwkzMworCisjZGVmaW5lIFZUTkVUX01BWF9NVFUJCTY1NTM2CisKKy8qIEFzc2VydCB3ZSBjYW4g dHJhbnNtaXQgTUFYX01UVSB3aXRoIHJlZ3VsYXIgc2l6ZSBjbHVzdGVycy4gKi8KK0NUQVNTRVJU KCgoVlRORVRfTUFYX1RYX1NFR1MgLSAxKSAqIE1DTEJZVEVTKSA+PSBWVE5FVF9NQVhfTVRVKTsK KworI2RlZmluZSBWVE5FVF9DU1VNX0ZFQVRVUkVTCShDU1VNX1RDUCB8IENTVU1fVURQKQorCisj ZGVmaW5lIFZUTkVUX1dBVENIRE9HX1RJTUVPVVQJNQorCisjZGVmaW5lIFZUTkVUX01UWChfc2Mp CQkmKF9zYyktPnZ0bmV0X210eAorI2RlZmluZSBWVE5FVF9MT0NLX0lOSVQoX3NjLCBfbmFtZSkg XAorCQkJCW10eF9pbml0KFZUTkVUX01UWCgoX3NjKSksIF9uYW1lLCBcCisJCQkJICAgICJWVE5F VCBMb2NrIiwgTVRYX0RFRikKKyNkZWZpbmUgVlRORVRfTE9DSyhfc2MpCQltdHhfbG9jayhWVE5F VF9NVFgoKF9zYykpKQorI2RlZmluZSBWVE5FVF9VTkxPQ0soX3NjKQltdHhfdW5sb2NrKFZUTkVU X01UWCgoX3NjKSkpCisjZGVmaW5lIFZUTkVUX0xPQ0tfREVTVFJPWShfc2MpCW10eF9kZXN0cm95 KFZUTkVUX01UWCgoX3NjKSkpCisjZGVmaW5lIFZUTkVUX0xPQ0tfQVNTRVJUKF9zYykJbXR4X2Fz c2VydChWVE5FVF9NVFgoKF9zYykpLCBNQV9PV05FRCkKKyNkZWZpbmUgVlRORVRfTE9DS19BU1NF UlRfTk9UT1dORUQoX3NjKSBcCisgICAgCQkJCW10eF9hc3NlcnQoVlRORVRfTVRYKChfc2MpKSwg TUFfTk9UT1dORUQpCisKKy8qIFR1bmFibGVzLiAqLworc3RhdGljIGludCB2dG5ldF9jc3VtX2Rp c2FibGUgPSAwOworVFVOQUJMRV9JTlQoImh3LnZ0bmV0LmNzdW1fZGlzYWJsZSIsICZ2dG5ldF9j c3VtX2Rpc2FibGUpOworc3RhdGljIGludCB2dG5ldF90c29fZGlzYWJsZSA9IDA7CitUVU5BQkxF X0lOVCgiaHcudnRuZXQudHNvX2Rpc2FibGUiLCAmdnRuZXRfdHNvX2Rpc2FibGUpOworc3RhdGlj IGludCB2dG5ldF9scm9fZGlzYWJsZSA9IDE7CitUVU5BQkxFX0lOVCgiaHcudnRuZXQubHJvX2Rp c2FibGUiLCAmdnRuZXRfbHJvX2Rpc2FibGUpOworCitzdGF0aWMgZGV2aWNlX21ldGhvZF90IHZ0 bmV0X21ldGhvZHNbXSA9IHsKKwkvKiBEZXZpY2UgbWV0aG9kcy4gKi8KKwlERVZNRVRIT0QoZGV2 aWNlX3Byb2JlLAkJdnRuZXRfcHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLAl2dG5l dF9hdHRhY2gpLAorCURFVk1FVEhPRChkZXZpY2VfZGV0YWNoLAl2dG5ldF9kZXRhY2gpLAorCURF Vk1FVEhPRChkZXZpY2Vfc3VzcGVuZCwJdnRuZXRfc3VzcGVuZCksCisJREVWTUVUSE9EKGRldmlj ZV9yZXN1bWUsCXZ0bmV0X3Jlc3VtZSksCisJREVWTUVUSE9EKGRldmljZV9zaHV0ZG93biwJdnRu ZXRfc2h1dGRvd24pLAorCisJLyogVmlydElPIG1ldGhvZHMuICovCisJREVWTUVUSE9EKHZpcnRp b19jb25maWdfY2hhbmdlLCB2dG5ldF9jb25maWdfY2hhbmdlKSwKKworCXsgMCwgMCB9Cit9Owor CitzdGF0aWMgZHJpdmVyX3QgdnRuZXRfZHJpdmVyID0geworCSJ2dG5ldCIsCisJdnRuZXRfbWV0 aG9kcywKKwlzaXplb2Yoc3RydWN0IHZ0bmV0X3NvZnRjKQorfTsKK3N0YXRpYyBkZXZjbGFzc190 IHZ0bmV0X2RldmNsYXNzOworCitEUklWRVJfTU9EVUxFKHZ0bmV0LCB2aXJ0aW9fcGNpLCB2dG5l dF9kcml2ZXIsIHZ0bmV0X2RldmNsYXNzLCAwLCAwKTsKK01PRFVMRV9WRVJTSU9OKHZ0bmV0LCAx KTsKK01PRFVMRV9ERVBFTkQodnRuZXQsIHZpcnRpbywgMSwgMSwgMSk7CisKK3N0YXRpYyBpbnQK K3Z0bmV0X3Byb2JlKGRldmljZV90IGRldikKK3sKKwlzdHJ1Y3QgdmlydGlvX2l2YXJzICppdmFy czsKKworCWl2YXJzID0gZGV2aWNlX2dldF9pdmFycyhkZXYpOworCWlmIChpdmFycyA9PSBOVUxM KQorCQlyZXR1cm4gKEVOWElPKTsKKworCWlmIChpdmFycy0+dnRpdmFyX2RldnR5cGUgIT0gVklS VElPX0lEX05FVFdPUkspCisJCXJldHVybiAoRU5YSU8pOworCisJZGV2aWNlX3NldF9kZXNjKGRl diwgIlZpcnRJTyBOZXR3b3JraW5nIEFkYXB0ZXIiKTsKKworCXJldHVybiAoQlVTX1BST0JFX0RF RkFVTFQpOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9hdHRhY2goZGV2aWNlX3QgZGV2KQorewor CXN0cnVjdCB2dG5ldF9zb2Z0YyAqc2M7CisJc3RydWN0IHZpcnRpb19pdmFycyAqaXZhcnM7CisJ c3RydWN0IGlmbmV0ICppZnA7CisJaW50IHR4X3NpemU7CisJaW50IGVycm9yOworCisJc2MgPSBk ZXZpY2VfZ2V0X3NvZnRjKGRldik7CisJc2MtPnZ0bmV0X2RldiA9IGRldjsKKworCVZUTkVUX0xP Q0tfSU5JVChzYywgZGV2aWNlX2dldF9uYW1ldW5pdChkZXYpKTsKKwljYWxsb3V0X2luaXRfbXR4 KCZzYy0+dnRuZXRfdGlja19jaCwgVlRORVRfTVRYKHNjKSwgMCk7CisKKwkvKiBBdHRhY2ggc3Rh dGlzdGljcyBzeXNjdGwuICovCisJdnRuZXRfYWRkX3N0YXRpc3RpY3Moc2MpOworCisJaXZhcnMg PSBkZXZpY2VfZ2V0X2l2YXJzKGRldik7CisJaXZhcnMtPnZ0aXZhcl9mZWF0dXJlcyA9IHZ0bmV0 X2ZlYXR1cmVfZGVzYzsKKworCXZ0bmV0X25lZ290aWF0ZV9mZWF0dXJlcyhzYyk7CisKKwlpZiAo dmlydGlvX3dpdGhfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9NUkdfUlhCVUYpKSB7CisJCXNj LT52dG5ldF9mbGFncyB8PSBWVE5FVF9GTEFHX01SR19SWEJVRlM7CisJCXNjLT52dG5ldF9oZHJf c2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJnX3J4YnVmKTsKKwl9IGVsc2UK KwkJc2MtPnZ0bmV0X2hkcl9zaXplID0gc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fbmV0X2hkcik7CisK KwlzYy0+dnRuZXRfcnhfbWJ1Zl9zaXplID0gTUNMQllURVM7CisKKwlpZiAodmlydGlvX3dpdGhf ZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9DVFJMX1ZRKSkgeworCQlzYy0+dnRuZXRfZmxhZ3Mg fD0gVlRORVRfRkxBR19DVFJMX1ZROworCisJCWlmICh2aXJ0aW9fd2l0aF9mZWF0dXJlKGRldiwg VklSVElPX05FVF9GX0NUUkxfUlgpKQorCQkJc2MtPnZ0bmV0X2ZsYWdzIHw9IFZUTkVUX0ZMQUdf Q1RSTF9SWDsKKwkJaWYgKHZpcnRpb193aXRoX2ZlYXR1cmUoZGV2LCBWSVJUSU9fTkVUX0ZfQ1RS TF9WTEFOKSkKKwkJCXNjLT52dG5ldF9mbGFncyB8PSBWVE5FVF9GTEFHX1ZMQU5fRklMVEVSOwor CX0KKworCXZ0bmV0X2dldF9od2FkZHIoc2MpOworCisJZXJyb3IgPSB2dG5ldF9hbGxvY192aXJ0 cXVldWVzKHNjKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJjYW5ub3Qg YWxsb2NhdGUgdmlydHF1ZXVlc1xuIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZnAgPSBzYy0+ dnRuZXRfaWZwID0gaWZfYWxsb2MoSUZUX0VUSEVSKTsKKwlpZiAoaWZwID09IE5VTEwpIHsKKwkJ ZGV2aWNlX3ByaW50ZihkZXYsICJjYW5ub3QgYWxsb2NhdGUgaWZuZXQgc3RydWN0dXJlXG4iKTsK KwkJZXJyb3IgPSBFTk9TUEM7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZnAtPmlmX3NvZnRjID0g c2M7CisJaWZfaW5pdG5hbWUoaWZwLCBkZXZpY2VfZ2V0X25hbWUoZGV2KSwgZGV2aWNlX2dldF91 bml0KGRldikpOworCWlmcC0+aWZfZmxhZ3MgPSBJRkZfQlJPQURDQVNUIHwgSUZGX1NJTVBMRVgg fCBJRkZfTVVMVElDQVNUOworCWlmcC0+aWZfaW5pdCA9IHZ0bmV0X2luaXQ7CisJaWZwLT5pZl9z dGFydCA9IHZ0bmV0X3N0YXJ0OworCWlmcC0+aWZfaW9jdGwgPSB2dG5ldF9pb2N0bDsKKworCXNj LT52dG5ldF9yeF9zaXplID0gdmlydHF1ZXVlX3NpemUoc2MtPnZ0bmV0X3J4X3ZxKTsKKwlzYy0+ dnRuZXRfcnhfcHJvY2Vzc19saW1pdCA9IChzYy0+dnRuZXRfcnhfc2l6ZSAqIDMpIC8gNDsKKwor CXR4X3NpemUgPSB2aXJ0cXVldWVfc2l6ZShzYy0+dnRuZXRfdHhfdnEpOworCXNjLT52dG5ldF90 eF9zaXplID0gdHhfc2l6ZTsKKwlzYy0+dnRuZXRfdHhfaGl3YXQgPSB0eF9zaXplIC0gKCh0eF9z aXplICogMikgLyAxMCk7CisKKwlJRlFfU0VUX01BWExFTigmaWZwLT5pZl9zbmQsIHR4X3NpemUg LSAxKTsKKwlpZnAtPmlmX3NuZC5pZnFfZHJ2X21heGxlbiA9IHR4X3NpemUgLSAxOworCUlGUV9T RVRfUkVBRFkoJmlmcC0+aWZfc25kKTsKKworCWV0aGVyX2lmYXR0YWNoKGlmcCwgc2MtPnZ0bmV0 X2h3YWRkcik7CisKKwlpZiAodmlydGlvX3dpdGhfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9T VEFUVVMpKQorCQlpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJRkNBUF9MSU5LU1RBVEU7CisKKwkv KiBUZWxsIHRoZSB1cHBlciBsYXllcihzKSB3ZSBzdXBwb3J0IGxvbmcgZnJhbWVzLiAqLworCWlm cC0+aWZfZGF0YS5pZmlfaGRybGVuID0gc2l6ZW9mKHN0cnVjdCBldGhlcl92bGFuX2hlYWRlcik7 CisJaWZwLT5pZl9jYXBhYmlsaXRpZXMgfD0gSUZDQVBfSlVNQk9fTVRVIHwgSUZDQVBfVkxBTl9N VFU7CisKKwlpZiAodmlydGlvX3dpdGhfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9DU1VNKSkg eworCQlpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJRkNBUF9UWENTVU07CisKKwkJaWYgKHZpcnRp b193aXRoX2ZlYXR1cmUoZGV2LCBWSVJUSU9fTkVUX0ZfSE9TVF9UU080KSkKKwkJCWlmcC0+aWZf Y2FwYWJpbGl0aWVzIHw9IElGQ0FQX1RTTzQ7CisJCWlmICh2aXJ0aW9fd2l0aF9mZWF0dXJlKGRl diwgVklSVElPX05FVF9GX0hPU1RfVFNPNikpCisJCQlpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJ RkNBUF9UU082OworCisJCWlmICh2aXJ0aW9fd2l0aF9mZWF0dXJlKGRldiwgVklSVElPX05FVF9G X0hPU1RfRUNOKSkKKwkJCXNjLT52dG5ldF9mbGFncyB8PSBWVE5FVF9GTEFHX1RTT19FQ047CisK KwkJaWYgKGlmcC0+aWZfY2FwYWJpbGl0aWVzICYgSUZDQVBfVFNPKQorCQkJaWZwLT5pZl9jYXBh YmlsaXRpZXMgfD0gSUZDQVBfVkxBTl9IV1RTTzsKKwl9CisKKwlpZiAodmlydGlvX3dpdGhfZmVh dHVyZShkZXYsIFZJUlRJT19ORVRfRl9HVUVTVF9DU1VNKSkgeworCQlpZnAtPmlmX2NhcGFiaWxp dGllcyB8PSBJRkNBUF9SWENTVU07CisKKwkJaWYgKHZpcnRpb193aXRoX2ZlYXR1cmUoZGV2LCBW SVJUSU9fTkVUX0ZfR1VFU1RfVFNPNCkgfHwKKwkJICAgIHZpcnRpb193aXRoX2ZlYXR1cmUoZGV2 LCBWSVJUSU9fTkVUX0ZfR1VFU1RfVFNPNikpCisJCQlpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJ RkNBUF9MUk87CisJfQorCisJaWYgKGlmcC0+aWZfY2FwYWJpbGl0aWVzICYgSUZDQVBfSFdDU1VN KSB7CisJCS8qCisJCSAqIFZpcnRJTyBkb2VzIG5vdCBzdXBwb3J0IGBoYXJkd2FyZWAgVkxBTiB0 YWdnaW5nLiBJbnN0ZWFkCisJCSAqIHdlIGVtdWxhdGUgaXQgZHVyaW5nIHJlY2VpdmUgYW5kIHRy YW5zbWl0LCBhbmQgd2UncmUgdGhlbgorCQkgKiBhYmxlIHRvIHN1cHBvcnQgY2hlY2tzdW0gb2Zm bG9hZGluZyBvZiBWTEFOIGZyYW1lcy4KKwkJICovCisJCWlmcC0+aWZfY2FwYWJpbGl0aWVzIHw9 CisJCSAgICBJRkNBUF9WTEFOX0hXVEFHR0lORyB8IElGQ0FQX1ZMQU5fSFdDU1VNOworCX0KKwor CWlmcC0+aWZfY2FwZW5hYmxlID0gaWZwLT5pZl9jYXBhYmlsaXRpZXM7CisKKwkvKgorCSAqIENh cGFiaWxpdGllcyBhZnRlciB0aGlzIGFyZSBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgorCSAqLwor CisJaWYgKHNjLT52dG5ldF9mbGFncyAmIFZUTkVUX0ZMQUdfVkxBTl9GSUxURVIpIHsKKwkJaWZw LT5pZl9jYXBhYmlsaXRpZXMgfD0gSUZDQVBfVkxBTl9IV0ZJTFRFUjsKKworCQlzYy0+dnRuZXRf dmxhbl9hdHRhY2ggPSBFVkVOVEhBTkRMRVJfUkVHSVNURVIodmxhbl9jb25maWcsCisJCSAgICB2 dG5ldF9yZWdpc3Rlcl92bGFuLCBzYywgRVZFTlRIQU5ETEVSX1BSSV9GSVJTVCk7CisJCXNjLT52 dG5ldF92bGFuX2RldGFjaCA9IEVWRU5USEFORExFUl9SRUdJU1RFUih2bGFuX3VuY29uZmlnLAor CQkgICAgdnRuZXRfdW5yZWdpc3Rlcl92bGFuLCBzYywgRVZFTlRIQU5ETEVSX1BSSV9GSVJTVCk7 CisJfQorCisjaWZkZWYgREVWSUNFX1BPTExJTkcKKwlpZnAtPmlmX2NhcGFiaWxpdGllcyB8PSBJ RkNBUF9QT0xMSU5HOworI2VuZGlmCisKKwlUQVNLX0lOSVQoJnNjLT52dG5ldF90eF90YXNrLCAx LCB2dG5ldF90eF90YXNrLCBpZnApOworCVRBU0tfSU5JVCgmc2MtPnZ0bmV0X2NmZ2NoZ190YXNr LCAwLCB2dG5ldF9jb25maWdfY2hhbmdlX3Rhc2ssIHNjKTsKKworCVRBU0tfSU5JVCgmc2MtPnZ0 bmV0X3J4X2ludHJfdGFzaywgMCwgdnRuZXRfcnhfaW50cl90YXNrLCBzYyk7CisJVEFTS19JTklU KCZzYy0+dnRuZXRfdHhfaW50cl90YXNrLCAwLCB2dG5ldF90eF9pbnRyX3Rhc2ssIHNjKTsKKwor CXNjLT52dG5ldF90cSA9IHRhc2txdWV1ZV9jcmVhdGVfZmFzdCgidnRuZXRfdGFza3EiLCBNX1dB SVRPSywKKwkgICAgdGFza3F1ZXVlX3RocmVhZF9lbnF1ZXVlLCAmc2MtPnZ0bmV0X3RxKTsKKwlp ZiAoc2MtPnZ0bmV0X3RxID09IE5VTEwpIHsKKwkJZXJyb3IgPSBFTk9NRU07CisJCWRldmljZV9w cmludGYoZGV2LCAiY2Fubm90IGFsbG9jYXRlIHRhc2txdWV1ZVxuIik7CisJCWV0aGVyX2lmZGV0 YWNoKGlmcCk7CisJCWdvdG8gZmFpbDsKKwl9CisJdGFza3F1ZXVlX3N0YXJ0X3RocmVhZHMoJnNj LT52dG5ldF90cSwgMSwgUElfTkVULCAiJXMgdGFza3EiLAorCSAgICBkZXZpY2VfZ2V0X25hbWV1 bml0KGRldikpOworCisJZXJyb3IgPSB2aXJ0aW9fc2V0dXBfaW50cihkZXYsIElOVFJfVFlQRV9O RVQpOworCWlmIChlcnJvcikgeworCQlkZXZpY2VfcHJpbnRmKGRldiwgImNhbm5vdCBzZXR1cCB2 aXJ0cXVldWUgaW50ZXJydXB0c1xuIik7CisJCXRhc2txdWV1ZV9mcmVlKHNjLT52dG5ldF90cSk7 CisJCXNjLT52dG5ldF90cSA9IE5VTEw7CisJCWV0aGVyX2lmZGV0YWNoKGlmcCk7CisJCWdvdG8g ZmFpbDsKKwl9CisKKwkvKgorCSAqIEhvc3QgZGVmYXVsdHMgdG8gcHJvbWlzY3VvdXMgbW9kZSBm b3IgYmFja3dhcmRzCisJICogY29tcGF0aWJpbGl0eS4gVHVybiBpdCBvZmYgaWYgcG9zc2libGUu CisJICovCisJaWYgKHNjLT52dG5ldF9mbGFncyAmIFZUTkVUX0ZMQUdfQ1RSTF9SWCkgeworCQlW VE5FVF9MT0NLKHNjKTsKKwkJaWYgKHZ0bmV0X3NldF9wcm9taXNjKHNjLCAwKSAhPSAwKSB7CisJ CQkvKiBVbmFibGUgdG8gZGlzYWJsZSwgaW5mb3JtIHN0YWNrLiAqLworCQkJaWZwLT5pZl9mbGFn cyB8PSBJRkZfUFJPTUlTQzsKKwkJCWRldmljZV9wcmludGYoZGV2LAorCQkJICAgICJjYW5ub3Qg ZGlzYWJsZSBwcm9taXNjdW91cyBtb2RlXG4iKTsKKwkJfQorCQlWVE5FVF9VTkxPQ0soc2MpOwor CX0gZWxzZQorCQlpZnAtPmlmX2ZsYWdzIHw9IElGRl9QUk9NSVNDOworCitmYWlsOgorCWlmIChl cnJvcikKKwkJdnRuZXRfZGV0YWNoKGRldik7CisKKwlyZXR1cm4gKGVycm9yKTsKK30KKworc3Rh dGljIGludAordnRuZXRfZGV0YWNoKGRldmljZV90IGRldikKK3sKKwlzdHJ1Y3QgdnRuZXRfc29m dGMgKnNjOworCXN0cnVjdCBpZm5ldCAqaWZwOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRl dik7CisJaWZwID0gc2MtPnZ0bmV0X2lmcDsKKworCUtBU1NFUlQobXR4X2luaXRpYWxpemVkKFZU TkVUX01UWChzYykpLAorCSAgICAoInZ0bmV0IG11dGV4IG5vdCBpbml0aWFsaXplZCIpKTsKKwor I2lmZGVmIERFVklDRV9QT0xMSU5HCisJaWYgKGlmcCAhPSBOVUxMICYmIGlmcC0+aWZfY2FwZW5h YmxlICYgSUZDQVBfUE9MTElORykKKwkJZXRoZXJfcG9sbF9kZXJlZ2lzdGVyKGlmcCk7CisjZW5k aWYKKworCWlmIChkZXZpY2VfaXNfYXR0YWNoZWQoZGV2KSkgeworCQlWVE5FVF9MT0NLKHNjKTsK KwkJdnRuZXRfc3RvcChzYyk7CisJCWlmcC0+aWZfZmxhZ3MgJj0gfklGRl9VUDsKKwkJVlRORVRf VU5MT0NLKHNjKTsKKworCQljYWxsb3V0X2RyYWluKCZzYy0+dnRuZXRfdGlja19jaCk7CisJCXRh c2txdWV1ZV9kcmFpbih0YXNrcXVldWVfZmFzdCwgJnNjLT52dG5ldF9jZmdjaGdfdGFzayk7CisJ CXRhc2txdWV1ZV9kcmFpbih0YXNrcXVldWVfZmFzdCwgJnNjLT52dG5ldF90eF90YXNrKTsKKwor CQlldGhlcl9pZmRldGFjaChpZnApOworCX0KKworCWlmIChzYy0+dnRuZXRfdHEgIT0gTlVMTCkg eworCQl0YXNrcXVldWVfZHJhaW4oc2MtPnZ0bmV0X3RxLCAmc2MtPnZ0bmV0X3J4X2ludHJfdGFz ayk7CisJCXRhc2txdWV1ZV9kcmFpbihzYy0+dnRuZXRfdHEsICZzYy0+dnRuZXRfdHhfaW50cl90 YXNrKTsKKwkJdGFza3F1ZXVlX2ZyZWUoc2MtPnZ0bmV0X3RxKTsKKwkJc2MtPnZ0bmV0X3RxID0g TlVMTDsKKwl9CisKKwlpZiAoc2MtPnZ0bmV0X3ZsYW5fYXR0YWNoICE9IE5VTEwpIHsKKwkJRVZF TlRIQU5ETEVSX0RFUkVHSVNURVIodmxhbl9jb25maWcsIHNjLT52dG5ldF92bGFuX2F0dGFjaCk7 CisJCXNjLT52dG5ldF92bGFuX2F0dGFjaCA9IE5VTEw7CisJfQorCWlmIChzYy0+dnRuZXRfdmxh bl9kZXRhY2ggIT0gTlVMTCkgeworCQlFVkVOVEhBTkRMRVJfREVSRUdJU1RFUih2bGFuX3VuY29u ZmcsIHNjLT52dG5ldF92bGFuX2RldGFjaCk7CisJCXNjLT52dG5ldF92bGFuX2RldGFjaCA9IE5V TEw7CisJfQorCisJaWYgKGlmcCkgeworCQlpZl9mcmVlKGlmcCk7CisJCXNjLT52dG5ldF9pZnAg PSBOVUxMOworCX0KKworCWlmIChzYy0+dnRuZXRfcnhfdnEgIT0gTlVMTCkKKwkJdnRuZXRfZnJl ZV9yeF9tYnVmcyhzYyk7CisJaWYgKHNjLT52dG5ldF90eF92cSAhPSBOVUxMKQorCQl2dG5ldF9m cmVlX3R4X21idWZzKHNjKTsKKwlpZiAoc2MtPnZ0bmV0X2N0cmxfdnEgIT0gTlVMTCkKKwkJdnRu ZXRfZnJlZV9jdHJsX3ZxKHNjKTsKKworCVZUTkVUX0xPQ0tfREVTVFJPWShzYyk7CisKKwlyZXR1 cm4gKDApOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9zdXNwZW5kKGRldmljZV90IGRldikKK3sK KwlzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7 CisKKwlWVE5FVF9MT0NLKHNjKTsKKwl2dG5ldF9zdG9wKHNjKTsKKwlzYy0+dnRuZXRfZmxhZ3Mg fD0gVlRORVRfRkxBR19TVVNQRU5ERUQ7CisJVlRORVRfVU5MT0NLKHNjKTsKKworCXJldHVybiAo MCk7Cit9CisKK3N0YXRpYyBpbnQKK3Z0bmV0X3Jlc3VtZShkZXZpY2VfdCBkZXYpCit7CisJc3Ry dWN0IHZ0bmV0X3NvZnRjICpzYzsKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKworCXNjID0gZGV2aWNl X2dldF9zb2Z0YyhkZXYpOworCWlmcCA9IHNjLT52dG5ldF9pZnA7CisKKwlWVE5FVF9MT0NLKHNj KTsKKwlpZiAoaWZwLT5pZl9mbGFncyAmIElGRl9VUCkKKwkJdnRuZXRfaW5pdF9sb2NrZWQoc2Mp OworCXNjLT52dG5ldF9mbGFncyAmPSB+VlRORVRfRkxBR19TVVNQRU5ERUQ7CisJVlRORVRfVU5M T0NLKHNjKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3Z0bmV0X3NodXRkb3du KGRldmljZV90IGRldikKK3sKKworCS8qCisJICogU3VzcGVuZCBpcyBhbGwgd2UgbmVlZCB0byBk byBoZXJlLCB3ZSBqdXN0CisJICogbmV2ZXIgZXhwZWN0IHRvIGJlIHJlc3VtZWQuCisJICovCisJ cmV0dXJuICh2dG5ldF9zdXNwZW5kKGRldikpOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9jb25m aWdfY2hhbmdlKGRldmljZV90IGRldikKK3sKKwlzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjOworCisJ c2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisKKwl0YXNrcXVldWVfZW5xdWV1ZV9mYXN0KHRh c2txdWV1ZV9mYXN0LCAmc2MtPnZ0bmV0X2NmZ2NoZ190YXNrKTsKKworCXJldHVybiAoMSk7Cit9 CisKK3N0YXRpYyB2b2lkCit2dG5ldF9uZWdvdGlhdGVfZmVhdHVyZXMoc3RydWN0IHZ0bmV0X3Nv ZnRjICpzYykKK3sKKwlkZXZpY2VfdCBkZXY7CisJdWludDMyX3QgbmV3X2ZlYXR1cmVzOworCisJ ZGV2ID0gc2MtPnZ0bmV0X2RldjsKKwluZXdfZmVhdHVyZXMgPSBWVE5FVF9JTVBMX0ZFQVRVUkVT OworCisJaWYgKHZ0bmV0X2NzdW1fZGlzYWJsZSkKKwkJbmV3X2ZlYXR1cmVzICY9CisJCSAgICB+ KFZJUlRJT19ORVRfRl9DU1VNIHwgVlRORVRfSE9TVF9DU1VNX0ZFQVRVUkVTIHwKKwkJICAgICAg VklSVElPX05FVF9GX0dVRVNUX0NTVU0gfCBWVE5FVF9HVUVTVF9DU1VNX0ZFQVRVUkVTKTsKKwor CWlmICh2dG5ldF90c29fZGlzYWJsZSkKKwkJbmV3X2ZlYXR1cmVzICY9CisJCSAgICB+KFZJUlRJ T19ORVRfRl9IT1NUX1RTTzQgfCBWSVJUSU9fTkVUX0ZfSE9TVF9UU082IHwKKwkJICAgICAgVklS VElPX05FVF9GX0hPU1RfVUZPKTsKKworCWlmICh2dG5ldF9scm9fZGlzYWJsZSkKKwkJbmV3X2Zl YXR1cmVzICY9CisJCSAgICB+KFZJUlRJT19ORVRfRl9HVUVTVF9UU080IHwgVklSVElPX05FVF9G X0dVRVNUX1RTTzYgfAorCQkgICAgICBWSVJUSU9fTkVUX0ZfR1VFU1RfVUZPKTsKKworCXNjLT52 dG5ldF9mZWF0dXJlcyA9IHZpcnRpb19uZWdvdGlhdGVfZmVhdHVyZXMoZGV2LCBuZXdfZmVhdHVy ZXMpOworCisJaWYgKHZpcnRpb193aXRoX2ZlYXR1cmUoZGV2LCBWSVJUSU9fTkVUX0ZfTVJHX1JY QlVGKSA9PSAwICYmCisJICAgKHZpcnRpb193aXRoX2ZlYXR1cmUoZGV2LCBWSVJUSU9fTkVUX0Zf R1VFU1RfVFNPNCkgfHwKKwkgICAgdmlydGlvX3dpdGhfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRf Rl9HVUVTVF9UU082KSB8fAorCSAgICB2aXJ0aW9fd2l0aF9mZWF0dXJlKGRldiwgVklSVElPX05F VF9GX0dVRVNUX1VGTykpKSB7CisJCS8qCisJCSAqIFdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQg VFNPIHJlY2VpdmUgKExSTykgd2hlbiBwYWlyZWQKKwkJICogd2l0aCBtZXJnZWFibGUgYnVmZmVy cy4gT3RoZXJ3aXNlLCBlYWNoIFJ4IGJ1ZmZlciBtdXN0CisJCSAqIGJlIGF0IGxlYXN0IDY1NTUw IGJ5dGVzIGJpZywgd2hpY2ggaXMgYSBsb3Qgb2YgbWVtb3J5IHRvCisJCSAqIGhvbGQgdXAgaW4g dGhlIHZpcnRxdWV1ZS4KKwkJICoKKwkJICogTi5CLiBXZSBkb24ndCBzdXBwb3J0IGFueSBvZiB0 aGlzIHlldCBhbnl3YXlzLgorCQkgKi8KKwkJbmV3X2ZlYXR1cmVzICY9CisJCSAgICB+KFZJUlRJ T19ORVRfRl9HVUVTVF9UU080IHwgVklSVElPX05FVF9GX0dVRVNUX1RTTzYgfAorCQkgICAgICBW SVJUSU9fTkVUX0ZfR1VFU1RfVUZPKTsKKworCQlzYy0+dnRuZXRfZmVhdHVyZXMgPSB2aXJ0aW9f bmVnb3RpYXRlX2ZlYXR1cmVzKGRldiwKKwkJICAgIG5ld19mZWF0dXJlcyk7CisJfQorfQorCitz dGF0aWMgaW50Cit2dG5ldF9hbGxvY192aXJ0cXVldWVzKHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2Mp Cit7CisJZGV2aWNlX3QgZGV2OworCXN0cnVjdCB2cV9hbGxvY19pbmZvIHZxX2luZm9bM107CisJ aW50IG52cXMsIHJ4c2VnczsKKworCWRldiA9IHNjLT52dG5ldF9kZXY7CisJbnZxcyA9IDI7CisK KwkvKgorCSAqIEluZGlyZWN0IGRlc2NyaXB0b3JzIGFyZSBub3QgbmVlZGVkIGZvciB0aGUgUngK KwkgKiB2aXJ0cXVldWUgd2hlbiBtZXJnZWFibGUgYnVmZmVycyBhcmUgbmVnb3RpYXRlZC4KKwkg KiBUaGUgaGVhZGVyIGlzIHBsYWNlZCBpbmxpbmUgd2l0aCB0aGUgZGF0YSwgbm90CisJICogaW4g YSBzZXBhcmF0ZSBkZXNjcmlwdG9yLCBhbmQgbWJ1ZiBjbHVzdGVycyBhcmUKKwkgKiBhbHdheXMg cGh5c2ljYWxseSBjb250aWd1b3VzLgorCSAqLworCXJ4c2VncyA9IHNjLT52dG5ldF9mbGFncyAm IFZUTkVUX0ZMQUdfTVJHX1JYQlVGUyA/IDAgOgorCSAgICBWVE5FVF9NQVhfUlhfU0VHUzsKKwor CVZRX0FMTE9DX0lORk9fSU5JVCgmdnFfaW5mb1swXSwgcnhzZWdzLAorCSAgICB2dG5ldF9yeF92 cV9pbnRyLCBzYywgJnNjLT52dG5ldF9yeF92cSwKKwkgICAgIiVzIHJlY2VpdmUiLCBkZXZpY2Vf Z2V0X25hbWV1bml0KGRldikpOworCisJVlFfQUxMT0NfSU5GT19JTklUKCZ2cV9pbmZvWzFdLCBW VE5FVF9NQVhfVFhfU0VHUywKKwkgICAgdnRuZXRfdHhfdnFfaW50ciwgc2MsICZzYy0+dnRuZXRf dHhfdnEsCisJICAgICIlcyB0cmFuc21pdCIsIGRldmljZV9nZXRfbmFtZXVuaXQoZGV2KSk7CisK KwlpZiAoc2MtPnZ0bmV0X2ZsYWdzICYgVlRORVRfRkxBR19DVFJMX1ZRKSB7CisJCW52cXMrKzsK KworCQlWUV9BTExPQ19JTkZPX0lOSVQoJnZxX2luZm9bMl0sIDAsIE5VTEwsIE5VTEwsCisJCSAg ICAmc2MtPnZ0bmV0X2N0cmxfdnEsICIlcyBjb250cm9sIiwKKwkJICAgIGRldmljZV9nZXRfbmFt ZXVuaXQoZGV2KSk7CisJfQorCisJcmV0dXJuICh2aXJ0aW9fYWxsb2NfdnFzKGRldiwgMCwgbnZx cywgdnFfaW5mbykpOworfQorCitzdGF0aWMgdm9pZAordnRuZXRfZ2V0X2h3YWRkcihzdHJ1Y3Qg dnRuZXRfc29mdGMgKnNjKQoreworCWRldmljZV90IGRldjsKKworCWRldiA9IHNjLT52dG5ldF9k ZXY7CisKKwlpZiAodmlydGlvX3dpdGhfZmVhdHVyZShkZXYsIFZJUlRJT19ORVRfRl9NQUMpID09 IDApIHsKKwkJLyogTWFrZSByYW5kb20sIGxvY2FsbHkgYWRtaW5pc3RlcmVkLCB1bmljYXN0IGFk ZHJlc3MuICovCisJCXNjLT52dG5ldF9od2FkZHJbMF0gPSAweGIyOworCQlyZWFkX3JhbmRvbSgm c2MtPnZ0bmV0X2h3YWRkclsxXSwgRVRIRVJfQUREUl9MRU4gLSAxKTsKKwkJdnRuZXRfc2V0X2h3 YWRkcihzYyk7CisJfSBlbHNlIHsKKwkJdmlydGlvX3JlYWRfZGV2aWNlX2NvbmZpZyhkZXYsCisJ CSAgICBvZmZzZXRvZihzdHJ1Y3QgdmlydGlvX25ldF9jb25maWcsIG1hYyksCisJCSAgICBzYy0+ dnRuZXRfaHdhZGRyLCBFVEhFUl9BRERSX0xFTik7CisJfQorfQorCitzdGF0aWMgdm9pZAordnRu ZXRfc2V0X2h3YWRkcihzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjKQoreworCWRldmljZV90IGRldjsK KworCWRldiA9IHNjLT52dG5ldF9kZXY7CisKKwl2aXJ0aW9fd3JpdGVfZGV2aWNlX2NvbmZpZyhk ZXYsCisJICAgIG9mZnNldG9mKHN0cnVjdCB2aXJ0aW9fbmV0X2NvbmZpZywgbWFjKSwKKwkgICAg c2MtPnZ0bmV0X2h3YWRkciwgRVRIRVJfQUREUl9MRU4pOworfQorCitzdGF0aWMgdm9pZAordnRu ZXRfdXBkYXRlX2xpbmtfc3RhdHVzKHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2MpCit7CisJZGV2aWNl X3QgZGV2OworCXN0cnVjdCBpZm5ldCAqaWZwOworCWludCBsaW5rOworCXVpbnQxNl90IHN0YXR1 czsKKworCWRldiA9IHNjLT52dG5ldF9kZXY7CisJaWZwID0gc2MtPnZ0bmV0X2lmcDsKKworCVZU TkVUX0xPQ0tfQVNTRVJUKHNjKTsKKworCWlmIChpZnAtPmlmX2NhcGFiaWxpdGllcyAmIElGQ0FQ X0xJTktTVEFURSkgeworCQlzdGF0dXMgPSB2aXJ0aW9fcmVhZF9kZXZfY29uZmlnXzIoZGV2LAor CQkgICAgb2Zmc2V0b2Yoc3RydWN0IHZpcnRpb19uZXRfY29uZmlnLCBzdGF0dXMpKTsKKwkJaWYg KHN0YXR1cyAmIFZJUlRJT19ORVRfU19MSU5LX1VQKQorCQkJbGluayA9IDE7CisJCWVsc2UKKwkJ CWxpbmsgPSAwOworCX0gZWxzZQorCQlsaW5rID0gMTsKKworCWlmIChsaW5rICYmICgoc2MtPnZ0 bmV0X2ZsYWdzICYgVlRORVRfRkxBR19MSU5LKSA9PSAwKSkgeworCQlzYy0+dnRuZXRfZmxhZ3Mg fD0gVlRORVRfRkxBR19MSU5LOworCQlpZiAoYm9vdHZlcmJvc2UpCisJCQlkZXZpY2VfcHJpbnRm KGRldiwgIkxpbmsgaXMgdXBcbiIpOworCisJCWlmX2xpbmtfc3RhdGVfY2hhbmdlKGlmcCwgTElO S19TVEFURV9VUCk7CisJCWlmICghSUZRX0RSVl9JU19FTVBUWSgmaWZwLT5pZl9zbmQpKQorCQkJ dnRuZXRfc3RhcnRfbG9ja2VkKGlmcCk7CisJfSBlbHNlIGlmICghbGluayAmJiAoc2MtPnZ0bmV0 X2ZsYWdzICYgVlRORVRfRkxBR19MSU5LKSkgeworCQlzYy0+dnRuZXRfZmxhZ3MgJj0gflZUTkVU X0ZMQUdfTElOSzsKKwkJaWYgKGJvb3R2ZXJib3NlKQorCQkJZGV2aWNlX3ByaW50ZihkZXYsICJM aW5rIGlzIGRvd25cbiIpOworCisJCWlmX2xpbmtfc3RhdGVfY2hhbmdlKGlmcCwgTElOS19TVEFU RV9ET1dOKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit2dG5ldF93YXRjaGRvZyhzdHJ1Y3QgdnRu ZXRfc29mdGMgKnNjKQoreworCXN0cnVjdCBpZm5ldCAqaWZwOworCisJaWZwID0gc2MtPnZ0bmV0 X2lmcDsKKworCVZUTkVUX0xPQ0tfQVNTRVJUKHNjKTsKKworCWlmIChzYy0+dnRuZXRfd2F0Y2hk b2dfdGltZXIgPT0gMCB8fCAtLXNjLT52dG5ldF93YXRjaGRvZ190aW1lcikKKwkJcmV0dXJuOwor CisJLyogQ29tcGxldGUgYW55IGFscmVhZHkgcmVjZWl2ZWQgZnJhbWVzLiAqLworCXZ0bmV0X3J4 ZW9mKHNjLCBzYy0+dnRuZXRfcnhfc2l6ZSwgTlVMTCk7CisKKwlpZl9wcmludGYoaWZwLCAid2F0 Y2hkb2cgdGltZW91dCAtLSByZXNldHRpbmdcbiIpOworCWlmcC0+aWZfb2Vycm9ycysrOworCWlm cC0+aWZfZHJ2X2ZsYWdzICY9IH5JRkZfRFJWX1JVTk5JTkc7CisJdnRuZXRfaW5pdF9sb2NrZWQo c2MpOworCisJaWYgKCFJRlFfRFJWX0lTX0VNUFRZKCZpZnAtPmlmX3NuZCkpCisJCXRhc2txdWV1 ZV9lbnF1ZXVlX2Zhc3Qoc2MtPnZ0bmV0X3RxLAorCQkgICAgJnNjLT52dG5ldF90eF90YXNrKTsK K30KKworc3RhdGljIHZvaWQKK3Z0bmV0X2NvbmZpZ19jaGFuZ2VfdGFzayh2b2lkICphcmcsIGlu dCBwZW5kaW5nKQoreworCXN0cnVjdCB2dG5ldF9zb2Z0YyAqc2M7CisKKwlzYyA9IGFyZzsKKwor CVZUTkVUX0xPQ0soc2MpOworCXZ0bmV0X3VwZGF0ZV9saW5rX3N0YXR1cyhzYyk7CisJVlRORVRf VU5MT0NLKHNjKTsKK30KKworc3RhdGljIGludAordnRuZXRfaW9jdGwoc3RydWN0IGlmbmV0ICpp ZnAsIHVfbG9uZyBjbWQsIGNhZGRyX3QgZGF0YSkKK3sKKwlzdHJ1Y3QgdnRuZXRfc29mdGMgKnNj OworCXN0cnVjdCBpZnJlcSAqaWZyOworCWludCBlcnJvcjsKKworCXNjID0gaWZwLT5pZl9zb2Z0 YzsKKwlpZnIgPSAoc3RydWN0IGlmcmVxICopIGRhdGE7CisJZXJyb3IgPSAwOworCisJc3dpdGNo IChjbWQpIHsKKwljYXNlIFNJT0NTSUZNVFU6CisJCWlmIChpZnItPmlmcl9tdHUgPCBFVEhFUk1J TiB8fCBpZnItPmlmcl9tdHUgPiBWVE5FVF9NQVhfTVRVKQorCQkJZXJyb3IgPSBFSU5WQUw7CisJ CWVsc2UgaWYgKGlmcC0+aWZfbXR1ICE9IGlmci0+aWZyX210dSkgeworCQkJVlRORVRfTE9DSyhz Yyk7CisJCQllcnJvciA9IHZ0bmV0X2NoYW5nZV9tdHUoc2MsIGlmci0+aWZyX210dSk7CisJCQlW VE5FVF9VTkxPQ0soc2MpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBTSU9DU0lGRkxBR1M6CisJ CVZUTkVUX0xPQ0soc2MpOworCQlpZiAoaWZwLT5pZl9mbGFncyAmIElGRl9VUCkgeworCQkJaWYg KGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSB7CisJCQkJaWYgKCgoaWZwLT5p Zl9mbGFncyBeIHNjLT52dG5ldF9pZl9mbGFncykgJgorCQkJCSAgICAoSUZGX1BST01JU0MgfCBJ RkZfQUxMTVVMVEkpKSAhPSAwKSB7CisJCQkJCS8qIENhbm5vdCBjaGFuZ2Ugd2l0aG91dCBDVFJM X1JYLiAqLworCQkJCQlpZiAoc2MtPnZ0bmV0X2ZsYWdzICYKKwkJCQkJICAgIFZUTkVUX0ZMQUdf Q1RSTF9SWCkKKwkJCQkJCXZ0bmV0X3J4X2ZpbHRlcihzYyk7CisJCQkJCWVsc2UKKwkJCQkJCWVy cm9yID0gRU5PVFNVUDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCQl2dG5ldF9pbml0X2xvY2tlZChz Yyk7CisJCX0gZWxzZSB7CisJCQlpZiAoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5J TkcpCisJCQkJdnRuZXRfc3RvcChzYyk7CisJCX0KKworCQlpZiAoZXJyb3IgPT0gMCkKKwkJCXNj LT52dG5ldF9pZl9mbGFncyA9IGlmcC0+aWZfZmxhZ3M7CisJCVZUTkVUX1VOTE9DSyhzYyk7CisJ CWJyZWFrOworCisJY2FzZSBTSU9DQURETVVMVEk6CisJY2FzZSBTSU9DREVMTVVMVEk6CisJCVZU TkVUX0xPQ0soc2MpOworCQlpZiAoc2MtPnZ0bmV0X2ZsYWdzICYgVlRORVRfRkxBR19DVFJMX1JY KSB7CisJCQlpZiAoaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpCisJCQkJdnRu ZXRfcnhfZmlsdGVyX21hYyhzYyk7CisJCX0KKwkJVlRORVRfVU5MT0NLKHNjKTsKKwkJYnJlYWs7 CisKKwljYXNlIFNJT0NTSUZDQVA6CisJICAgIHsKKwkJaW50IHJlaW5pdCwgbWFzazsKKworCQly ZWluaXQgPSAwOworCQltYXNrID0gaWZyLT5pZnJfcmVxY2FwIF4gaWZwLT5pZl9jYXBlbmFibGU7 CisKKyNpZmRlZiBERVZJQ0VfUE9MTElORworCQlpZiAobWFzayAmIElGQ0FQX1BPTExJTkcpIHsK KwkJCWlmIChpZnItPmlmcl9yZXFjYXAgJiBJRkNBUF9QT0xMSU5HKSB7CisJCQkJZXJyb3IgPSBl dGhlcl9wb2xsX3JlZ2lzdGVyKHZ0bmV0X3BvbGwsIGlmcCk7CisJCQkJaWYgKGVycm9yKQorCQkJ CQlicmVhazsKKworCQkJCVZUTkVUX0xPQ0soc2MpOworCQkJCXZ0bmV0X2Rpc2FibGVfcnhfaW50 cihzYyk7CisJCQkJdnRuZXRfZGlzYWJsZV90eF9pbnRyKHNjKTsKKwkJCQlpZnAtPmlmX2NhcGVu YWJsZSB8PSBJRkNBUF9QT0xMSU5HOworCQkJCVZUTkVUX1VOTE9DSyhzYyk7CisJCQl9IGVsc2Ug eworCQkJCWVycm9yID0gZXRoZXJfcG9sbF9kZXJlZ2lzdGVyKGlmcCk7CisJCQkJLyogRW5hYmxl IGludGVycnVwdHMgZXZlbiBpbiBlcnJvciBjYXNlLiAqLworCQkJCVZUTkVUX0xPQ0soc2MpOwor CQkJCXZ0bmV0X2VuYWJsZV90eF9pbnRyKHNjKTsKKwkJCQl2dG5ldF9lbmFibGVfcnhfaW50cihz Yyk7CisJCQkJaWZwLT5pZl9jYXBlbmFibGUgJj0gfklGQ0FQX1BPTExJTkc7CisJCQkJVlRORVRf VU5MT0NLKHNjKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCVZUTkVUX0xPQ0soc2MpOworCisJCWlm IChtYXNrICYgSUZDQVBfVFhDU1VNICYmCisJCSAgICBpZnAtPmlmX2NhcGFiaWxpdGllcyAmIElG Q0FQX1RYQ1NVTSkgeworCQkJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfVFhDU1VNKSB7 CisJCQkJLyogVFNPIHJlcXVpcmVzIFRYIGNoZWNrc3VtIG9mZmxvYWQuICovCisJCQkJaWZwLT5p Zl9jYXBlbmFibGUgJj0KKwkJCQkgICAgfihJRkNBUF9UWENTVU0gfCBJRkNBUF9UU08pOworCQkJ CWlmcC0+aWZfaHdhc3Npc3QgJj0KKwkJCQkgICAgfihWVE5FVF9DU1VNX0ZFQVRVUkVTIHwgQ1NV TV9UU08pOworCQkJfSBlbHNlIHsKKwkJCQlpZnAtPmlmX2NhcGVuYWJsZSB8PSBJRkNBUF9UWENT VU07CisJCQkJaWZwLT5pZl9od2Fzc2lzdCB8PSBWVE5FVF9DU1VNX0ZFQVRVUkVTOworCQkJfQor CQl9CisKKwkJaWYgKG1hc2sgJiBJRkNBUF9SWENTVU0gJiYKKwkJICAgIGlmcC0+aWZfY2FwYWJp bGl0aWVzICYgSUZDQVBfUlhDU1VNKSB7CisJCQlpZnAtPmlmX2NhcGVuYWJsZSBePSBJRkNBUF9S WENTVU07CisJCQlyZWluaXQgPSAxOworCQl9CisKKwkJaWYgKG1hc2sgJiBJRkNBUF9UU080ICYm CisJCSAgICBpZnAtPmlmX2NhcGFiaWxpdGllcyAmIElGQ0FQX1RTTzQpIHsKKwkJCWlmIChpZnAt PmlmX2NhcGVuYWJsZSAmIElGQ0FQX1RTTzQpIHsKKwkJCQlpZnAtPmlmX2NhcGVuYWJsZSAmPSB+ SUZDQVBfVFNPNDsKKwkJCQlpZnAtPmlmX2h3YXNzaXN0ICY9IH5DU1VNX1RTTzsKKwkJCX0gZWxz ZSBpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJRkNBUF9UWENTVU0pIHsKKwkJCQlpZnAtPmlmX2Nh cGVuYWJsZSB8PSBJRkNBUF9UU080OworCQkJCWlmcC0+aWZfaHdhc3Npc3QgfD0gQ1NVTV9UU087 CisJCQl9IGVsc2UgeworCQkJCWlmX3ByaW50ZihpZnAsCisJCQkJICAgICJUU08gcmVxdWlyZXMg VHggY2hlY2tzdW0gb2ZmbG9hZFxuIik7CisJCQkJZXJyb3IgPSBFSU5WQUw7CisJCQl9CisJCX0K KworCQlpZiAobWFzayAmIElGQ0FQX0xSTyAmJgorCQkgICAgaWZwLT5pZl9jYXBhYmlsaXRpZXMg JiBJRkNBUF9MUk8pIHsKKwkJCWlmcC0+aWZfY2FwZW5hYmxlIF49IElGQ0FQX0xSTzsKKwkJCXJl aW5pdCA9IDE7CisJCX0KKworCQlpZiAobWFzayAmIElGQ0FQX1ZMQU5fSFdGSUxURVIgJiYKKwkJ ICAgIGlmcC0+aWZfY2FwYWJpbGl0aWVzICYgSUZDQVBfVkxBTl9IV0ZJTFRFUikgeworCQkJaWZw LT5pZl9jYXBlbmFibGUgXj0gSUZDQVBfVkxBTl9IV0ZJTFRFUjsKKwkJCXJlaW5pdCA9IDE7CisJ CX0KKworCQlpZiAobWFzayAmIElGQ0FQX1ZMQU5fSFdUU08gJiYKKwkJICAgIGlmcC0+aWZfY2Fw YWJpbGl0aWVzICYgSUZDQVBfVkxBTl9IV1RTTykKKwkJCWlmcC0+aWZfY2FwZW5hYmxlIF49IElG Q0FQX1ZMQU5fSFdUU087CisKKwkJaWYgKG1hc2sgJiBJRkNBUF9WTEFOX0hXVEFHR0lORyAmJgor CQkgICAgaWZwLT5pZl9jYXBhYmlsaXRpZXMgJiBJRkNBUF9WTEFOX0hXVEFHR0lORykKKwkJCWlm cC0+aWZfY2FwZW5hYmxlIF49IElGQ0FQX1ZMQU5fSFdUQUdHSU5HOworCisJCWlmIChyZWluaXQg JiYgaWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpIHsKKwkJCWlmcC0+aWZfZHJ2 X2ZsYWdzICY9IH5JRkZfRFJWX1JVTk5JTkc7CisJCQl2dG5ldF9pbml0X2xvY2tlZChzYyk7CisJ CX0KKworCQlWTEFOX0NBUEFCSUxJVElFUyhpZnApOworCQlWVE5FVF9VTkxPQ0soc2MpOworCSAg ICB9CisJICAgIGJyZWFrOworCisJZGVmYXVsdDoKKwkJZXJyb3IgPSBldGhlcl9pb2N0bChpZnAs IGNtZCwgZGF0YSk7CisJCWJyZWFrOworCX0KKworCVZUTkVUX0xPQ0tfQVNTRVJUX05PVE9XTkVE KHNjKTsKKworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9jaGFuZ2Vf bXR1KHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2MsIGludCBuZXdfbXR1KQoreworCXN0cnVjdCBpZm5l dCAqaWZwOworCWludCBuZXdfZnJhbWVfc2l6ZSwgY2xzaXplOworCisJaWZwID0gc2MtPnZ0bmV0 X2lmcDsKKworCWlmICgoc2MtPnZ0bmV0X2ZsYWdzICYgVlRORVRfRkxBR19NUkdfUlhCVUZTKSA9 PSAwKSB7CisJCW5ld19mcmFtZV9zaXplID0gc2l6ZW9mKHN0cnVjdCB2dG5ldF9yeF9tYnVmX2hl YWRlcikgKworCQkgICAgc2l6ZW9mKHN0cnVjdCBldGhlcl92bGFuX2hlYWRlcikgKyBuZXdfbXR1 OworCisJCWlmIChuZXdfZnJhbWVfc2l6ZSA+IE1KVU05QllURVMpCisJCQlyZXR1cm4gKEVJTlZB TCk7CisKKwkJaWYgKG5ld19mcmFtZV9zaXplIDw9IE1DTEJZVEVTKQorCQkJY2xzaXplID0gTUNM QllURVM7CisJCWVsc2UKKwkJCWNsc2l6ZSA9IE1KVU05QllURVM7CisKKwl9IGVsc2UgeworCQkv KgorCQkgKiBOT1RFOiBXZSBoYXZlIGFscmVhZHkgY29tcGFyZWQgJ25ld19tdHUnIGFnYWluc3QK KwkJICogVlRORVRfTUFYX01UVSAoaW4gdnRuZXRfaW9jdGwpLCBhbmQgd2UgaGF2ZSBhCisJCSAq IENUQVNTRVJUIGVuc3VyaW5nIFZUTkVUX01BWF9UWF9TRUdTLTEgY2FuIGhvbGQgYXQKKwkJICog bGVhc3QgVlRORVRfTUFYX01UVSB3aXRoIE1DTEJZVEVTIHNpemVkIGNsdXN0ZXJzLgorCQkgKi8K KworCQluZXdfZnJhbWVfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJnX3J4 YnVmKSArCisJCSAgICBzaXplb2Yoc3RydWN0IGV0aGVyX3ZsYW5faGVhZGVyKSArIG5ld19tdHU7 CisKKwkJaWYgKG5ld19mcmFtZV9zaXplIDw9IE1DTEJZVEVTKQorCQkJY2xzaXplID0gTUNMQllU RVM7CisJCWVsc2UKKwkJCWNsc2l6ZSA9IE1KVU1QQUdFU0laRTsKKwl9CisKKwlpZnAtPmlmX210 dSA9IG5ld19tdHU7CisJc2MtPnZ0bmV0X3J4X21idWZfc2l6ZSA9IGNsc2l6ZTsKKworCWlmIChp ZnAtPmlmX2Rydl9mbGFncyAmIElGRl9EUlZfUlVOTklORykgeworCQlpZnAtPmlmX2Rydl9mbGFn cyAmPSB+SUZGX0RSVl9SVU5OSU5HOworCQl2dG5ldF9pbml0X2xvY2tlZChzYyk7CisJfQorCisJ cmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAordnRuZXRfaW5pdF9yeF92cShzdHJ1Y3QgdnRu ZXRfc29mdGMgKnNjKQoreworCXN0cnVjdCB2aXJ0cXVldWUgKnZxOworCWludCBpLCBlcnJvcjsK KworCXZxID0gc2MtPnZ0bmV0X3J4X3ZxOworCWVycm9yID0gRU5PU1BDOworCisJZm9yIChpID0g MDsgIXZpcnRxdWV1ZV9mdWxsKHZxKTsgaSsrKSB7CisJCWlmICgoZXJyb3IgPSB2dG5ldF9uZXdi dWYoc2MpKSAhPSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKGkgPiAwKSB7CisJCXZxX3Jpbmdf c3luYyh2cSk7CisKKwkJLyoKKwkJICogRU1TR1NJWkUgc2lnbmlmaWVzIHRoZSB2aXJ0cXVldWUg ZGlkIG5vdAorCQkgKiBoYXZlIGVub3VnaCBlbnRyaWVzIGF2YWlsYWJsZSB0byBob2xkIHRoZQor CQkgKiBsYXN0IG1idWYuIFRoaXMgaXMgbm90IGFuIGVycm9yLiBXZSBzaG91bGQKKwkJICogbm90 IGdldCBFTk9TUEMgc2luY2Ugd2UgY2hlY2sgaWYgdGhlIFZxCisJCSAqIGlzIGZ1bGwgYmVmb3Jl IGF0dGVtcHRpbmcgdG8gYWRkIGEgYnVmZmVyLgorCQkgKi8KKwkJaWYgKGVycm9yID09IEVNU0dT SVpFKQorCQkJZXJyb3IgPSAwOworCX0KKworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMg dm9pZAordnRuZXRfZnJlZV9yeF9tYnVmcyhzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjKQoreworCXN0 cnVjdCB2aXJ0cXVldWUgKnZxOworCXN0cnVjdCBtYnVmICptOworCisJdnEgPSBzYy0+dnRuZXRf cnhfdnE7CisKKwl3aGlsZSAoKG0gPSB2aXJ0cXVldWVfZHJhaW4odnEpKSAhPSBOVUxMKQorCQlt X2ZyZWVtKG0pOworCisJS0FTU0VSVCh2aXJ0cXVldWVfZW1wdHkodnEpLCAoIm1idWZzIHJlbWFp bmluZyBpbiBSeCBWcSIpKTsKK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X2ZyZWVfdHhfbWJ1ZnMo c3RydWN0IHZ0bmV0X3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKwlzdHJ1 Y3QgbWJ1ZiAqbTsKKworCXZxID0gc2MtPnZ0bmV0X3R4X3ZxOworCisJd2hpbGUgKChtID0gdmly dHF1ZXVlX2RyYWluKHZxKSkgIT0gTlVMTCkKKwkJbV9mcmVlbShtKTsKKworCUtBU1NFUlQodmly dHF1ZXVlX2VtcHR5KHZxKSwgKCJtYnVmcyByZW1haW5pbmcgaW4gVHggVnEiKSk7Cit9CisKK3N0 YXRpYyB2b2lkCit2dG5ldF9mcmVlX2N0cmxfdnEoc3RydWN0IHZ0bmV0X3NvZnRjICpzYykKK3sK KwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKworCXZxID0gc2MtPnZ0bmV0X2N0cmxfdnE7CisKKwkv KgorCSAqIFNpbmNlIHRoZSBjb250cm9sIHZpcnRxdWV1ZSBpcyBhbHdheXMgcG9sbGVkIGZvcgor CSAqIHJlc3BvbnNlcywgaXQgc2hvdWxkIGJlIGVtcHR5LgorCSAqLworCUtBU1NFUlQodmlydHF1 ZXVlX2VtcHR5KHZxKSwgKCJDdHJsIFZxIG5vdCBlbXB0eSIpKTsKK30KKworI2lmZGVmIERFVklD RV9QT0xMSU5HCitzdGF0aWMgaW50Cit2dG5ldF9wb2xsKHN0cnVjdCBpZm5ldCAqaWZwLCBlbnVt IHBvbGxfY21kIGNtZCwgaW50IGNvdW50KQoreworCXN0cnVjdCB2dG5ldF9zb2Z0YyAqc2M7CisJ aW50IHJ4X2RvbmU7CisKKwlzYyA9IGlmcC0+aWZfc29mdGM7CisJcnhfZG9uZSA9IDA7CisKKwlW VE5FVF9MT0NLKHNjKTsKKwlpZiAoKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5H KSA9PSAwKSB7CisJCVZUTkVUX1VOTE9DSyhzYyk7CisJCXJldHVybiAocnhfZG9uZSk7CisJfQor CisJaWYgKGNtZCA9PSBQT0xMX0FORF9DSEVDS19TVEFUVVMpCisJCXZ0bmV0X3VwZGF0ZV9saW5r X3N0YXR1cyhzYyk7CisKKwl2dG5ldF9yeGVvZihzYywgY291bnQsICZyeF9kb25lKTsKKworCXZ0 bmV0X3R4ZW9mKHNjKTsKKwlpZiAoIUlGUV9EUlZfSVNfRU1QVFkoJmlmcC0+aWZfc25kKSkKKwkJ dGFza3F1ZXVlX2VucXVldWVfZmFzdChzYy0+dnRuZXRfdHEsICZzYy0+dnRuZXRfdHhfdGFzayk7 CisKKwlWVE5FVF9VTkxPQ0soc2MpOworCisJcmV0dXJuIChyeF9kb25lKTsKK30KKyNlbmRpZiAv KiBERVZJQ0VfUE9MTElORyAqLworCitzdGF0aWMgaW50Cit2dG5ldF9uZXdidWYoc3RydWN0IHZ0 bmV0X3NvZnRjICpzYykKK3sKKwlzdHJ1Y3QgbWJ1ZiAqbTsKKwlpbnQgY2xzaXplLCBlcnJvcjsK KworCWNsc2l6ZSA9IHNjLT52dG5ldF9yeF9tYnVmX3NpemU7CisKKwltID0gbV9nZXRqY2woTV9E T05UV0FJVCwgTVRfREFUQSwgTV9QS1RIRFIsIGNsc2l6ZSk7CisJaWYgKG0gPT0gTlVMTCkgewor CQlzYy0+dnRuZXRfc3RhdHMubWJ1Zl9hbGxvY19mYWlsZWQrKzsKKwkJcmV0dXJuIChFTk9CVUZT KTsKKwl9CisKKwltLT5tX2xlbiA9IG0tPm1fcGt0aGRyLmxlbiA9IGNsc2l6ZTsKKworCWVycm9y ID0gdnRuZXRfZW5xdWV1ZV9yeGJ1ZihzYywgbSk7CisJaWYgKGVycm9yKQorCQltX2ZyZWVtKG0p OworCisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCit2dG5ldF9kaXNjYXJkX21l cmdlZF9yeGJ1ZihzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjLCBpbnQgbmJ1ZnMpCit7CisJc3RydWN0 IHZpcnRxdWV1ZSAqdnE7CisJc3RydWN0IG1idWYgKm07CisKKwl2cSA9IHNjLT52dG5ldF9yeF92 cTsKKworCS8qIE5PVEU6IFRoZSBsZWFkaW5nIG1idWYgaGFzIGFscmVhZHkgYmVlbiBkaXNjYXJk ZWQuICovCisKKwl3aGlsZSAoLS1uYnVmcyA+IDApIHsKKwkJaWYgKChtID0gdnFfcmluZ19kZXF1 ZXVlKHZxLCBOVUxMKSkgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCXZ0bmV0X2Rpc2NhcmRfcnhi dWYoc2MsIG0pOworCX0KK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X2Rpc2NhcmRfcnhidWYoc3Ry dWN0IHZ0bmV0X3NvZnRjICpzYywgc3RydWN0IG1idWYgKm0pCit7CisJaW50IGVycm9yOworCisJ ZXJyb3IgPSB2dG5ldF9lbnF1ZXVlX3J4YnVmKHNjLCBtKTsKKworCS8qCisJICogVGhlIGRpc2Nh cmRlZCBidWZmZXIgc2hvdWxkIGFsd2F5cyBiZSBzdWNjZXNzZnVsbHkgcmVxdWV1ZWQKKwkgKiBz aW5jZSBpdCB3YXMganVzdCBkZXF1ZXVlZCBhbmQgd2Ugc3RpbGwgaG9sZCBWVE5FVF9NVFguCisJ ICovCisJS0FTU0VSVChlcnJvciA9PSAwLCAoImNhbm5vdCByZXF1ZXVlZCBkaXNjYXJkZWQgbWJ1 ZiIpKTsKK30KKworc3RhdGljIGludAordnRuZXRfZW5xdWV1ZV9yeGJ1ZihzdHJ1Y3QgdnRuZXRf c29mdGMgKnNjLCBzdHJ1Y3QgbWJ1ZiAqbSkKK3sKKwlzdHJ1Y3Qgc2dsaXN0IHNnOworCXN0cnVj dCBzZ2xpc3Rfc2VnIHNlZ3NbVlRORVRfTUFYX1JYX1NFR1NdOworCXN0cnVjdCB2dG5ldF9yeF9t YnVmX2hlYWRlciAqcnhoZHI7CisJc3RydWN0IHZpcnRpb19uZXRfaGRyICpoZHI7CisJdWludDhf dCAqbWRhdGE7CisJaW50IG9mZnNldCwgZXJyb3I7CisKKwlWVE5FVF9MT0NLX0FTU0VSVChzYyk7 CisJS0FTU0VSVChtLT5tX25leHQgPT0gTlVMTCwgKCJ1bmV4cGVjdGVkIG1idWYgY2hhaW4iKSk7 CisKKwlzZ2xpc3RfaW5pdCgmc2csIFZUTkVUX01BWF9SWF9TRUdTLCBzZWdzKTsKKworCW1kYXRh ID0gbXRvZChtLCB1aW50OF90ICopOworCW9mZnNldCA9IDA7CisKKwlpZiAoKHNjLT52dG5ldF9m bGFncyAmIFZUTkVUX0ZMQUdfTVJHX1JYQlVGUykgPT0gMCkgeworCQlyeGhkciA9IChzdHJ1Y3Qg dnRuZXRfcnhfbWJ1Zl9oZWFkZXIgKikgbWRhdGE7CisJCWhkciA9ICZyeGhkci0+dnJoX2hkcjsK KwkJb2Zmc2V0ICs9IHNpemVvZihzdHJ1Y3QgdnRuZXRfcnhfbWJ1Zl9oZWFkZXIpOworCisJCWVy cm9yID0gc2dsaXN0X2FwcGVuZCgmc2csIGhkciwgc2MtPnZ0bmV0X2hkcl9zaXplKTsKKwkJS0FT U0VSVChlcnJvciA9PSAwLCAoImNhbm5vdCBhZGQgaGVhZGVyIHRvIHNnbGlzdCIpKTsKKwl9CisK KwllcnJvciA9IHNnbGlzdF9hcHBlbmQoJnNnLCBtZGF0YSArIG9mZnNldCwgbS0+bV9sZW4gLSBv ZmZzZXQpOworCUtBU1NFUlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIG1idWYgdG8gc2dsaXN0 IikpOworCisJZXJyb3IgPSB2cV9yaW5nX2VucXVldWUoc2MtPnZ0bmV0X3J4X3ZxLCBtLCAmc2cs IDAsIHNnLnNnX25zZWcpOworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgdm9pZAordnRu ZXRfdmxhbl90YWdfcmVtb3ZlKHN0cnVjdCBtYnVmICptKQoreworCXN0cnVjdCBldGhlcl92bGFu X2hlYWRlciAqZXZsOworCisJZXZsID0gbXRvZChtLCBzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIg Kik7CisKKwltLT5tX3BrdGhkci5ldGhlcl92dGFnID0gbnRvaHMoZXZsLT5ldmxfdGFnKTsKKwlt LT5tX2ZsYWdzIHw9IE1fVkxBTlRBRzsKKworCS8qIFN0cmlwIHRoZSA4MDIuMVEgaGVhZGVyLiAq LworCWJjb3B5KChjaGFyICopIGV2bCwgKGNoYXIgKikgZXZsICsgRVRIRVJfVkxBTl9FTkNBUF9M RU4sCisJICAgIEVUSEVSX0hEUl9MRU4gLSBFVEhFUl9UWVBFX0xFTik7CisJbV9hZGoobSwgRVRI RVJfVkxBTl9FTkNBUF9MRU4pOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9yeF9jc3VtKHN0cnVj dCB2dG5ldF9zb2Z0YyAqc2MsIHN0cnVjdCBtYnVmICptLAorICAgIHN0cnVjdCB2aXJ0aW9fbmV0 X2hkciAqaGRyKQoreworCXN0cnVjdCBldGhlcl9oZWFkZXIgKmVoOworCXN0cnVjdCBldGhlcl92 bGFuX2hlYWRlciAqZXZoOworCXVpbnQ4X3QgKnByb3RvX2hkcjsKKwlpbnQgY2tfc3RhcnQsIGNr X29mZnNldDsKKwl1aW50MTZfdCBldHlwZTsKKwl1aW50OF90IGlwX3Byb3RvOworCisJLyoKKwkg KiBUcmFuc2xhdGUgVmlydElPJ3MgY2hlY2tzdW0gaW50ZXJmYWNlIHRvIEZyZWVCU0QncyBpbnRl cmZhY2UuCisJICogVGhlIGhvc3Qgb25seSBwcm92aWRlcyB1cyB3aXRoIHRoZSBvZmZzZXQgYXQg d2hpY2ggdG8gc3RhcnQKKwkgKiBjaGVja3N1bW1pbmcsIGFuZCB0aGUgb2Zmc2V0IGZyb20gdGhh dCB0byBwbGFjZSB0aGUgY29tcGxldGUKKwkgKiBjaGVja3N1bS4gV2hpbGUgYXBwYXJlbnRseSBt YXBwaW5nIHdlbGwgdG8gaG93IExpbnV4IGhhbmRsZXMKKwkgKiBjaGVja3N1bSBvZmZsb2FkLCBm b3IgRnJlZUJTRCB3ZSBtdXN0IHBlZWsgaW5zaWRlIHRoZSByZWNlaXZlZAorCSAqIHBhY2tldCBp biBvcmRlciB0byBzZXQgdGhlIGFwcHJvcHJpYXRlIGZsYWdzLgorCSAqCisJICogU2luY2Ugd2Ug b25seSBwb3B1bGF0ZSB0aGUgUnggdmlydHF1ZXVlIHdpdGggTUNMQllURVMgb3IgYmlnZ2VyCisJ ICogY2x1c3RlcnMsIGZpZ3VyZSBzb21ldGhpbmcgaXMgYW1pc3MgaWYgdGhlIGZpcnN0IG1idWYg ZG9lcyBub3QKKwkgKiBjb250YWluIHRoZSBFdGhlcm5ldCBhbmQgcHJvdG9jb2wgaGVhZGVycy4K KwkgKi8KKworCWVoID0gbXRvZChtLCBzdHJ1Y3QgZXRoZXJfaGVhZGVyICopOworCWlmIChlaC0+ ZXRoZXJfdHlwZSA9PSBodG9ucyhFVEhFUlRZUEVfVkxBTikpIHsKKwkJZXZoID0gbXRvZChtLCBz dHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKik7CisJCWV0eXBlID0gbnRvaHMoZXZoLT5ldmxfcHJv dG8pOworCQlja19zdGFydCA9IHNpemVvZihzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIpOworCX0g ZWxzZSB7CisJCWV0eXBlID0gbnRvaHMoZWgtPmV0aGVyX3R5cGUpOworCQlja19zdGFydCA9IHNp emVvZihzdHJ1Y3QgZXRoZXJfaGVhZGVyKTsKKwl9CisKKwlwcm90b19oZHIgPSBtdG9kKG0sIHVp bnQ4X3QgKikgKyBja19zdGFydDsKKworCXN3aXRjaCAoZXR5cGUpIHsKKwljYXNlIEVUSEVSVFlQ RV9JUDoKKwkJeworCQkJc3RydWN0IGlwICppcDsKKwkJCWludCBobGVuOworCisJCQlpZiAobS0+ bV9sZW4gPCBja19zdGFydCArIHNpemVvZihzdHJ1Y3QgaXApKQorCQkJCXJldHVybiAoMSk7CisK KwkJCWlwID0gKHN0cnVjdCBpcCAqKSBwcm90b19oZHI7CisKKwkJCSAvKiBTYW50aXkgY2hlY2sg SVAgaGVhZGVyLiAqLworCQkJaWYgKGlwLT5pcF92ICE9IElQVkVSU0lPTikKKwkJCQlyZXR1cm4g KDEpOworCQkJaGxlbiA9IGlwLT5pcF9obCA8PCAyOworCQkJaWYgKGhsZW4gPCBzaXplb2Yoc3Ry dWN0IGlwKSkKKwkJCQlyZXR1cm4gKDEpOworCQkJaWYgKG50b2hzKGlwLT5pcF9sZW4pIDwgaGxl bikKKwkJCQlyZXR1cm4gKDEpOworCQkJaWYgKG50b2hzKGlwLT5pcF9sZW4pICE9IChtLT5tX3Br dGhkci5sZW4gLSBja19zdGFydCkpCisJCQkJcmV0dXJuICgxKTsKKworCQkJaXBfcHJvdG8gPSBp cC0+aXBfcDsKKwkJCWNrX3N0YXJ0ICs9IGhsZW47CisJCX0KKwkJYnJlYWs7CisKKwljYXNlIEVU SEVSVFlQRV9JUFY2OgorCQl7CisJCQlzdHJ1Y3QgaXA2X2hkciAqaXA2OworCisJCQlpZiAobS0+ bV9sZW4gPCBja19zdGFydCArIHNpemVvZihzdHJ1Y3QgaXA2X2hkcikpCisJCQkJcmV0dXJuICgx KTsKKwkJCWlwNiA9IChzdHJ1Y3QgaXA2X2hkciAqKSBwcm90b19oZHI7CisKKwkJCS8qCisJCQkg KiBUT0RPIE5lZWQgdG8gaGFuZGxlIGFueSBleHRlbnNpb24gaGVhZGVycy4KKwkJCSAqLworCisJ CQlpcF9wcm90byA9IGlwNi0+aXA2X254dDsKKwkJCWNrX3N0YXJ0ICs9IHNpemVvZihzdHJ1Y3Qg aXA2X2hkcik7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlzYy0+dnRuZXRfc3RhdHMu cnhfY3N1bV91bmtub3duX2V0eXBlKys7CisJCXJldHVybiAoMSk7CisJfQorCisJLyogQXNzdW1l IGNoZWNrc3VtIGJlZ2lucyByaWdodCBhZnRlciB0aGUgSVAgaGVhZGVyIGVuZHMuICovCisJaWYg KGNrX3N0YXJ0ICE9IGhkci0+Y3N1bV9zdGFydCkgeworCQlzYy0+dnRuZXRfc3RhdHMucnhfY3N1 bV9iYWRfc3RhcnQrKzsKKwkJcmV0dXJuICgxKTsKKwl9CisKKwlzd2l0Y2ggKGlwX3Byb3RvKSB7 CisJY2FzZSBJUFBST1RPX1RDUDoKKwkJY2tfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHRjcGhk ciwgdGhfc3VtKTsKKwkJYnJlYWs7CisKKwljYXNlIElQUFJPVE9fVURQOgorCQlja19vZmZzZXQg PSBvZmZzZXRvZihzdHJ1Y3QgdWRwaGRyLCB1aF9zdW0pOworCQlicmVhazsKKworCWNhc2UgSVBQ Uk9UT19TQ1RQOgorCQlja19vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2N0cGhkciwgY2hlY2tz dW0pOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXNjLT52dG5ldF9zdGF0cy5yeF9jc3VtX3Vu a25vd25faXBwcm90bysrOworCQlyZXR1cm4gKDEpOworCX0KKworCWlmIChja19vZmZzZXQgIT0g aGRyLT5jc3VtX29mZnNldCkgeworCQlzYy0+dnRuZXRfc3RhdHMucnhfY3N1bV9iYWRfb2Zmc2V0 Kys7CisJCXJldHVybiAoMSk7CisJfQorCisJLyoKKwkgKiBUaGUgSVAgaGVhZGVyIGNoZWNrc3Vt IGlzIGFsbW9zdCBjZXJ0YWlubHkgdmFsaWQgYnV0IEknbQorCSAqIHVuY2VydGFpbiBpZiB0aGF0 IGlzIGd1YXJhbnRlZWQuCisJICoKKwkgKiBtLT5tX3BrdGhkci5jc3VtX2ZsYWdzIHw9CisJICog ICAgIENTVU1fSVBfQ0hFQ0tFRCB8IENTVU1fSVBfVkFMSUQ7CisJICovCisKKwlzd2l0Y2ggKGlw X3Byb3RvKSB7CisJY2FzZSBJUFBST1RPX1VEUDoKKwkgICAgeworCQlzdHJ1Y3QgdWRwaGRyICp1 ZHA7CisKKwkJaWYgKG0tPm1fbGVuIDwgY2tfc3RhcnQgKyBzaXplb2Yoc3RydWN0IHVkcGhkcikp CisJCQlyZXR1cm4gKDEpOworCisJCXVkcCA9IChzdHJ1Y3QgdWRwaGRyICopKG10b2QobSwgdWlu dDhfdCAqKSArIGNrX3N0YXJ0KTsKKwkJaWYgKHVkcC0+dWhfc3VtID09IDApCisJCQlicmVhazsK KwkgICAgfQorCSAgICAvKiBGQUxMVEhST1VHSCAqLworCisJY2FzZSBJUFBST1RPX1RDUDoKKwkJ bS0+bV9wa3RoZHIuY3N1bV9mbGFncyB8PQorCQkgICAgQ1NVTV9EQVRBX1ZBTElEIHwgQ1NVTV9Q U0VVRE9fSERSOworCQltLT5tX3BrdGhkci5jc3VtX2RhdGEgPSAweEZGRkY7CisJCWJyZWFrOwor CisJY2FzZSBJUFBST1RPX1NDVFA6CisJCW0tPm1fcGt0aGRyLmNzdW1fZmxhZ3MgfD0gQ1NVTV9T Q1RQX1ZBTElEOworCQlicmVhazsKKwl9CisKKwlzYy0+dnRuZXRfc3RhdHMucnhfY3N1bV9vZmZs b2FkZWQrKzsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3Z0bmV0X3J4ZW9mX21l cmdlZChzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjLCBzdHJ1Y3QgbWJ1ZiAqbV9oZWFkLAorICAgIGlu dCBuYnVmcykKK3sKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsK KwlzdHJ1Y3QgbWJ1ZiAqbSwgKm1fdGFpbDsKKwlpbnQgbGVuOworCisJaWZwID0gc2MtPnZ0bmV0 X2lmcDsKKwl2cSA9IHNjLT52dG5ldF9yeF92cTsKKwltX3RhaWwgPSBtX2hlYWQ7CisKKwl3aGls ZSAoLS1uYnVmcyA+IDApIHsKKwkJbSA9IHZxX3JpbmdfZGVxdWV1ZSh2cSwgJmxlbik7CisJCWlm IChtID09IE5VTEwpCisJCQlicmVhazsKKworCQlpZiAodnRuZXRfbmV3YnVmKHNjKSAhPSAwKSB7 CisJCQlpZnAtPmlmX2lxZHJvcHMrKzsKKwkJCXZ0bmV0X2Rpc2NhcmRfcnhidWYoc2MsIG0pOwor CQkJaWYgKG5idWZzID4gMSkKKwkJCQl2dG5ldF9kaXNjYXJkX21lcmdlZF9yeGJ1ZihzYywgbmJ1 ZnMpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAobS0+bV9sZW4gPCBsZW4pCisJCQlsZW4gPSBt LT5tX2xlbjsKKworCQltLT5tX2xlbiA9IGxlbjsKKwkJbS0+bV9mbGFncyAmPSB+TV9QS1RIRFI7 CisKKwkJbV9oZWFkLT5tX3BrdGhkci5sZW4gKz0gbGVuOworCQltX3RhaWwtPm1fbmV4dCA9IG07 CisJCW1fdGFpbCA9IG07CisJfQorCisJaWYgKG5idWZzID4gMCkgeworCQlzYy0+dnRuZXRfc3Rh dHMucnhfbWVyZ2VhYmxlX2ZhaWxlZCsrOworCQltX2ZyZWVtKG1faGVhZCk7CisJCXJldHVybiAo MSk7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAordnRuZXRfcnhlb2Yoc3Ry dWN0IHZ0bmV0X3NvZnRjICpzYywgaW50IGNvdW50LCBpbnQgKnJ4X25wa3RzcCkKK3sKKwlzdHJ1 Y3QgdmlydGlvX25ldF9oZHIgbGhkcjsKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwlzdHJ1Y3Qgdmly dHF1ZXVlICp2cTsKKwlzdHJ1Y3QgbWJ1ZiAqbTsKKwlzdHJ1Y3QgZXRoZXJfaGVhZGVyICplaDsK KwlzdHJ1Y3QgdmlydGlvX25ldF9oZHIgKmhkcjsKKwlzdHJ1Y3QgdmlydGlvX25ldF9oZHJfbXJn X3J4YnVmICptaGRyOworCWludCBsZW4sIG5kZXEsIG5idWZzLCBhZGpzeiwgcnhfbnBrdHM7CisK KwlpZnAgPSBzYy0+dnRuZXRfaWZwOworCXZxID0gc2MtPnZ0bmV0X3J4X3ZxOworCWhkciA9IE5V TEw7CisJbmRlcSA9IDA7CisJcnhfbnBrdHMgPSAwOworCisJVlRORVRfTE9DS19BU1NFUlQoc2Mp OworCisJd2hpbGUgKC0tY291bnQgPj0gMCkgeworCQltID0gdnFfcmluZ19kZXF1ZXVlKHZxLCAm bGVuKTsKKwkJaWYgKG0gPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCS8qIFZpcnRxdWV1ZSBzeW5j IHJlcXVpcmVkIGxhdGVyLiAqLworCQluZGVxKys7CisKKwkJaWYgKGxlbiA8IHNjLT52dG5ldF9o ZHJfc2l6ZSArIEVUSEVSX0hEUl9MRU4pIHsKKwkJCWlmcC0+aWZfaWVycm9ycysrOworCQkJdnRu ZXRfZGlzY2FyZF9yeGJ1ZihzYywgbSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmICgoc2Mt PnZ0bmV0X2ZsYWdzICYgVlRORVRfRkxBR19NUkdfUlhCVUZTKSA9PSAwKSB7CisJCQluYnVmcyA9 IDE7CisJCQlhZGpzeiA9IHNpemVvZihzdHJ1Y3QgdnRuZXRfcnhfbWJ1Zl9oZWFkZXIpOworCisJ CQkvKgorCQkJICogQWNjb3VudCBmb3Igb3VyIHBhZCBiZXR3ZWVuIHRoZSBoZWFkZXIgYW5kCisJ CQkgKiB0aGUgYWN0dWFsIHN0YXJ0IG9mIHRoZSBmcmFtZS4KKwkJCSAqLworCQkJbGVuICs9IFZU TkVUX1JYX01CVUZfSEVBREVSX1BBRDsKKwkJfSBlbHNlIHsKKwkJCW1oZHIgPSBtdG9kKG0sIHN0 cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYgKik7CisJCQluYnVmcyA9IG1oZHItPm51bV9i dWZmZXJzOworCQkJYWRqc3ogPSBzaXplb2Yoc3RydWN0IHZpcnRpb19uZXRfaGRyX21yZ19yeGJ1 Zik7CisJCX0KKworCQlpZiAodnRuZXRfbmV3YnVmKHNjKSAhPSAwKSB7CisJCQlpZnAtPmlmX2lx ZHJvcHMrKzsKKwkJCXZ0bmV0X2Rpc2NhcmRfcnhidWYoc2MsIG0pOworCQkJaWYgKG5idWZzID4g MSkKKwkJCQl2dG5ldF9kaXNjYXJkX21lcmdlZF9yeGJ1ZihzYywgbmJ1ZnMpOworCQkJY29udGlu dWU7CisJCX0KKworCQltLT5tX2xlbiA9IG0tPm1fcGt0aGRyLmxlbiA9IGxlbjsKKwkJbS0+bV9w a3RoZHIucmN2aWYgPSBpZnA7CisJCW0tPm1fcGt0aGRyLmNzdW1fZmxhZ3MgPSAwOworCisJCWlm IChuYnVmcyA+IDEpIHsKKwkJCWlmICh2dG5ldF9yeGVvZl9tZXJnZWQoc2MsIG0sIG5idWZzKSAh PSAwKQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWZwLT5pZl9pcGFja2V0cysrOworCisJCS8q CisJCSAqIFNhdmUgY29weSBvZiBoZWFkZXIgYmVmb3JlIHdlIHN0cmlwIGl0LiBGb3IgYm90aCBt ZXJnZWFibGUKKwkJICogYW5kIG5vbi1tZXJnZWFibGUsIHRoZSBWaXJ0SU8gaGVhZGVyIGlzIHBs YWNlZCBmaXJzdCBpbiB0aGUKKwkJICogbWJ1ZidzIGRhdGEuIE5vdGUgd2Ugbm8gbG9uZ2VyIG5l ZWQgbnVtX2J1ZmZlcnMsIHNvIGFsd2F5cworCQkgKiB1c2UgdmlydGlvX25ldF9oZHIuCisJCSAq LworCQloZHIgPSAmbGhkcjsKKwkJbWVtY3B5KGhkciwgbXRvZChtLCB2b2lkICopLCBzaXplb2Yo c3RydWN0IHZpcnRpb19uZXRfaGRyKSk7CisKKwkJLyogU3RyaXAgaGVhZGVyLiAqLworCQltX2Fk aihtLCBhZGpzeik7CisKKwkJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfVkxBTl9IV1RB R0dJTkcpIHsKKwkJCWVoID0gbXRvZChtLCBzdHJ1Y3QgZXRoZXJfaGVhZGVyICopOworCQkJaWYg KGVoLT5ldGhlcl90eXBlID09IGh0b25zKEVUSEVSVFlQRV9WTEFOKSkgeworCQkJCXZ0bmV0X3Zs YW5fdGFnX3JlbW92ZShtKTsKKworCQkJCS8qCisJCQkJICogV2l0aCB0aGUgODAyLjFRIGhlYWRl ciByZW1vdmVkLCB1cGRhdGUgdGhlCisJCQkJICogY2hlY2tzdW0gc3RhcnRpbmcgbG9jYXRpb24g YWNjb3JkaW5nbHkuCisJCQkJICovCisJCQkJaWYgKGhkci0+ZmxhZ3MgJiBWSVJUSU9fTkVUX0hE Ul9GX05FRURTX0NTVU0pCisJCQkJCWhkci0+Y3N1bV9zdGFydCAtPQorCQkJCQkgICAgRVRIRVJf VkxBTl9FTkNBUF9MRU47CisJCQl9CisJCX0KKworCQlpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJ RkNBUF9SWENTVU0gJiYKKwkJICAgIGhkci0+ZmxhZ3MgJiBWSVJUSU9fTkVUX0hEUl9GX05FRURT X0NTVU0pCisJCQl2dG5ldF9yeF9jc3VtKHNjLCBtLCBoZHIpOworCisJCVZUTkVUX1VOTE9DSyhz Yyk7CisJCSgqaWZwLT5pZl9pbnB1dCkoaWZwLCBtKTsKKwkJVlRORVRfTE9DSyhzYyk7CisJCXJ4 X25wa3RzKys7CisKKwkJLyoKKwkJICogVGhlIGludGVyZmFjZSBtYXkgaGF2ZSBiZWVuIHN0b3Bw ZWQgd2hpbGUgd2Ugd2VyZQorCQkgKiBwYXNzaW5nIHRoZSBwYWNrZXQgdXAgdGhlIG5ldHdvcmsg c3RhY2suCisJCSAqLworCQlpZiAoKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5H KSA9PSAwKQorCQkJYnJlYWs7CisJfQorCisJaWYgKG5kZXEgPiAwKQorCQl2cV9yaW5nX3N5bmMo dnEpOworCisJaWYgKHJ4X25wa3RzcCAhPSBOVUxMKQorCQkqcnhfbnBrdHNwID0gcnhfbnBrdHM7 CisKKwlyZXR1cm4gKGNvdW50ID4gMCA/IDAgOiBFQUdBSU4pOworfQorCitzdGF0aWMgdm9pZAor dnRuZXRfcnhfaW50cl90YXNrKHZvaWQgKmFyZywgaW50IHBlbmRpbmcpCit7CisJc3RydWN0IHZ0 bmV0X3NvZnRjICpzYzsKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwlpbnQgZG9tb3JlOworCisJc2Mg PSBhcmc7CisJaWZwID0gc2MtPnZ0bmV0X2lmcDsKKworCVZUTkVUX0xPQ0soc2MpOworCisjaWZk ZWYgREVWSUNFX1BPTExJTkcKKwlpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJRkNBUF9QT0xMSU5H KSB7CisJCVZUTkVUX1VOTE9DSyhzYyk7CisJCXJldHVybjsKKwl9CisjZW5kaWYKKworCWlmICgo aWZwLT5pZl9kcnZfZmxhZ3MgJiBJRkZfRFJWX1JVTk5JTkcpID09IDApIHsKKwkJdnRuZXRfZW5h YmxlX3J4X2ludHIoc2MpOworCQlWVE5FVF9VTkxPQ0soc2MpOworCQlyZXR1cm47CisJfQorCisJ ZG9tb3JlID0gdnRuZXRfcnhlb2Yoc2MsIHNjLT52dG5ldF9yeF9wcm9jZXNzX2xpbWl0LCBOVUxM KTsKKwlpZiAoIWRvbW9yZSAmJiB2dG5ldF9lbmFibGVfcnhfaW50cihzYykgIT0gMCkgeworCQlk b21vcmUgPSAxOworCQl2dG5ldF9kaXNhYmxlX3J4X2ludHIoc2MpOworCX0KKworCVZUTkVUX1VO TE9DSyhzYyk7CisKKwlpZiAoZG9tb3JlKQorCQl0YXNrcXVldWVfZW5xdWV1ZV9mYXN0KHNjLT52 dG5ldF90cSwKKwkJICAgICZzYy0+dnRuZXRfcnhfaW50cl90YXNrKTsKK30KKworc3RhdGljIGlu dAordnRuZXRfcnhfdnFfaW50cih2b2lkICp4c2MpCit7CisJc3RydWN0IHZ0bmV0X3NvZnRjICpz YzsKKworCXNjID0geHNjOworCisJdnRuZXRfZGlzYWJsZV9yeF9pbnRyKHNjKTsKKwl0YXNrcXVl dWVfZW5xdWV1ZV9mYXN0KHNjLT52dG5ldF90cSwgJnNjLT52dG5ldF9yeF9pbnRyX3Rhc2spOwor CisJcmV0dXJuICgxKTsKK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X3R4ZW9mKHN0cnVjdCB2dG5l dF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IHZpcnRxdWV1ZSAqdnE7CisJc3RydWN0IGlmbmV0ICpp ZnA7CisJc3RydWN0IG1idWYgKm07CisJaW50IGRlcTsKKworCXZxID0gc2MtPnZ0bmV0X3R4X3Zx OworCWlmcCA9IHNjLT52dG5ldF9pZnA7CisJZGVxID0gMDsKKworCVZUTkVUX0xPQ0tfQVNTRVJU KHNjKTsKKworCXdoaWxlICgobSA9IHZxX3JpbmdfZGVxdWV1ZSh2cSwgTlVMTCkpICE9IE5VTEwp IHsKKwkJZGVxKys7CisJCWlmcC0+aWZfb3BhY2tldHMrKzsKKwkJbV9mcmVlbShtKTsKKwl9CisK KwlpZiAoZGVxID4gMCkgeworCQlpZnAtPmlmX2Rydl9mbGFncyAmPSB+SUZGX0RSVl9PQUNUSVZF OworCQlpZiAodmlydHF1ZXVlX2VtcHR5KHZxKSkKKwkJCXNjLT52dG5ldF93YXRjaGRvZ190aW1l ciA9IDA7CisJfQorfQorCitzdGF0aWMgc3RydWN0IG1idWYgKgordnRuZXRfdmxhbl90YWdfaW5z ZXJ0KHN0cnVjdCBtYnVmICptKQoreworCXN0cnVjdCBtYnVmICpuOworCXN0cnVjdCBldGhlcl92 bGFuX2hlYWRlciAqZXZsOworCisJaWYgKE1fV1JJVEFCTEUobSkgPT0gMCkgeworCQluID0gbV9k dXAobSwgTV9ET05UV0FJVCk7CisJCW1fZnJlZW0obSk7CisJCWlmICgobSA9IG4pID09IE5VTEwp CisJCQlyZXR1cm4gKE5VTEwpOworCX0KKworCU1fUFJFUEVORChtLCBFVEhFUl9WTEFOX0VOQ0FQ X0xFTiwgTV9ET05UV0FJVCk7CisJaWYgKG0gPT0gTlVMTCkKKwkJcmV0dXJuIChOVUxMKTsKKwlp ZiAobS0+bV9sZW4gPCBzaXplb2Yoc3RydWN0IGV0aGVyX3ZsYW5faGVhZGVyKSkgeworCQltID0g bV9wdWxsdXAobSwgc2l6ZW9mKHN0cnVjdCBldGhlcl92bGFuX2hlYWRlcikpOworCQlpZiAobSA9 PSBOVUxMKQorCQkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwkvKiBJbnNlcnQgODAyLjFRIGhlYWRl ciBpbnRvIHRoZSBleGlzdGluZyBFdGhlcm5ldCBoZWFkZXIuICovCisJZXZsID0gbXRvZChtLCBz dHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKik7CisJYmNvcHkoKGNoYXIgKikgZXZsICsgRVRIRVJf VkxBTl9FTkNBUF9MRU4sCisJICAgICAgKGNoYXIgKikgZXZsLCBFVEhFUl9IRFJfTEVOIC0gRVRI RVJfVFlQRV9MRU4pOworCWV2bC0+ZXZsX2VuY2FwX3Byb3RvID0gaHRvbnMoRVRIRVJUWVBFX1ZM QU4pOworCWV2bC0+ZXZsX3RhZyA9IGh0b25zKG0tPm1fcGt0aGRyLmV0aGVyX3Z0YWcpOworCW0t Pm1fZmxhZ3MgJj0gfk1fVkxBTlRBRzsKKworCXJldHVybiAobSk7Cit9CisKK3N0YXRpYyBzdHJ1 Y3QgbWJ1ZiAqCit2dG5ldF9nZXRfZnJhbWVfdHlwZShzdHJ1Y3QgbWJ1ZiAqbSwgdWludDE2X3Qg KmV0eXBlLCBpbnQgKmlwX29mZikKK3sKKwlzdHJ1Y3QgZXRoZXJfaGVhZGVyICplaDsKKwlzdHJ1 Y3QgZXRoZXJfdmxhbl9oZWFkZXIgKmV2aDsKKwlpbnQgb2Zmc2V0OworCisJLyoKKwkgKiBEZXRl cm1pbmUgcGF5bG9hZCB0eXBlIC0gSVB2NCwgSVB2NiwgZXRjIC0gb2YgdGhlIGZyYW1lLgorCSAq LworCisJb2Zmc2V0ID0gc2l6ZW9mKHN0cnVjdCBldGhlcl9oZWFkZXIpOworCWlmIChtLT5tX2xl biA8IG9mZnNldCkKKwkJaWYgKChtID0gbV9wdWxsdXAobSwgb2Zmc2V0KSkgPT0gTlVMTCkKKwkJ CXJldHVybiAoTlVMTCk7CisKKwllaCA9IG10b2QobSwgc3RydWN0IGV0aGVyX2hlYWRlciAqKTsK KwlpZiAoZWgtPmV0aGVyX3R5cGUgPT0gaHRvbnMoRVRIRVJUWVBFX1ZMQU4pKSB7CisJCW9mZnNl dCA9IHNpemVvZihzdHJ1Y3QgZXRoZXJfdmxhbl9oZWFkZXIpOworCQlpZiAoKG0gPSBtX3B1bGx1 cChtLCBvZmZzZXQpKSA9PSBOVUxMKQorCQkJcmV0dXJuIChOVUxMKTsKKworCQlldmggPSBtdG9k KG0sIHN0cnVjdCBldGhlcl92bGFuX2hlYWRlciAqKTsKKwkJKmV0eXBlID0gbnRvaHMoZXZoLT5l dmxfcHJvdG8pOworCX0gZWxzZQorCQkqZXR5cGUgPSBudG9ocyhlaC0+ZXRoZXJfdHlwZSk7CisJ KmlwX29mZiA9IG9mZnNldDsKKworCXJldHVybiAobSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWJ1 ZiAqCit2dG5ldF9zZXR1cF90c28oc3RydWN0IHZ0bmV0X3NvZnRjICpzYywgc3RydWN0IG1idWYg Km0sCisgICAgc3RydWN0IHZpcnRpb19uZXRfaGRyICpoZHIsIHVpbnQxNl90IGV0eXBlLCBpbnQg aXBfb2ZmKQoreworCXN0cnVjdCBpZm5ldCAqaWZwOworCXN0cnVjdCB0Y3BoZHIgKnRjcDsKKwl1 aW50OF90IGdzb190eXBlOworCWludCB0Y3Bfb2ZmOworCisJaWZwID0gc2MtPnZ0bmV0X2lmcDsK KworCXN3aXRjaCAoZXR5cGUpIHsKKwljYXNlIEVUSEVSVFlQRV9JUDoKKwkgICAgeworCQlzdHJ1 Y3QgaXAgKmlwOworCisJCWlmIChtLT5tX2xlbiA8IGlwX29mZiArIHNpemVvZihzdHJ1Y3QgaXAp KSB7CisJCQltID0gbV9wdWxsdXAobSwgaXBfb2ZmICsgc2l6ZW9mKHN0cnVjdCBpcCkpOworCQkJ aWYgKG0gPT0gTlVMTCkKKwkJCQlyZXR1cm4gKE5VTEwpOworCQl9CisJCWlwID0gKHN0cnVjdCBp cCAqKShtdG9kKG0sIHVpbnQ4X3QgKikgKyBpcF9vZmYpOworCisJCWdzb190eXBlID0gVklSVElP X05FVF9IRFJfR1NPX1RDUFY0OworCQl0Y3Bfb2ZmID0gaXBfb2ZmICsgKGlwLT5pcF9obCA8PCAy KTsKKwkgICAgfQorCSAgICBicmVhazsKKworCWNhc2UgRVRIRVJUWVBFX0lQVjY6CisJICAgIHsK KwkJc3RydWN0IGlwNl9oZHIgKmlwNjsKKworCQlpZiAobS0+bV9sZW4gPCBpcF9vZmYgKyBzaXpl b2Yoc3RydWN0IGlwNl9oZHIpKSB7CisJCQltID0gbV9wdWxsdXAobSwgaXBfb2ZmICsgc2l6ZW9m KHN0cnVjdCBpcDZfaGRyKSk7CisJCQlpZiAobSA9PSBOVUxMKQorCQkJCXJldHVybiAoTlVMTCk7 CisJCX0KKworCQlpcDYgPSAoc3RydWN0IGlwNl9oZHIgKikobXRvZChtLCB1aW50OF90ICopICsg aXBfb2ZmKTsKKworCQkvKgorCQkgKiBGcmVlQlNEIGRvZXNuJ3Qgc3VwcG9ydCBUU08gb3ZlciBJ UHY2IHlldC4KKwkJICovCisKKwkJZ3NvX3R5cGUgPSBWSVJUSU9fTkVUX0hEUl9HU09fVENQVjY7 CisJCXRjcF9vZmYgPSAwOworCSAgICB9CisJICAgIC8qIEZBTExUSFJPVUdIICovCisKKwlkZWZh dWx0OgorCQlzYy0+dnRuZXRfc3RhdHMudHhfdHNvX3Vua25vd25fZXR5cGUrKzsKKwkJbV9mcmVl bShtKTsKKwkJcmV0dXJuIChOVUxMKTsKKwl9CisKKwlpZiAobS0+bV9sZW4gPCB0Y3Bfb2ZmICsg c2l6ZW9mKHN0cnVjdCB0Y3BoZHIpKSB7CisJCW0gPSBtX3B1bGx1cChtLCB0Y3Bfb2ZmICsgc2l6 ZW9mKHN0cnVjdCB0Y3BoZHIpKTsKKwkJaWYgKG0gPT0gTlVMTCkKKwkJCXJldHVybiAoTlVMTCk7 CisJfQorCXRjcCA9IChzdHJ1Y3QgdGNwaGRyICopKG10b2QobSwgdWludDhfdCAqKSArIHRjcF9v ZmYpOworCisJaGRyLT5nc29fdHlwZSA9IGdzb190eXBlOworCWhkci0+aGRyX2xlbiA9IHRjcF9v ZmYgKyAodGNwLT50aF9vZmYgPDwgMik7CisJaGRyLT5nc29fc2l6ZSA9IG0tPm1fcGt0aGRyLnRz b19zZWdzejsKKworCWlmICh0Y3AtPnRoX2ZsYWdzICYgVEhfQ1dSKSB7CisJCS8qCisJCSAqIERy b3AgcGFja2V0IGlmIGRpZCBub3QgbmVnb3RpYXRlIFZJUlRJT19ORVRfRl9IT1NUX0VDTi4KKwkJ ICogRnJlZUJTRCBkb2VzIG5vdCBkaXN0aW5ndWlzaCBUU08vRUNOIHN1cHBvcnQgb24gYSBwZXIt CisJCSAqIGludGVyZmFjZSBiYXNpcy4gUmF0aGVyLCBpdCBpcyBjb250cm9sbGVkIGdsb2JhbGx5 IHZpYQorCQkgKiB0aGUgYG5ldC5pbmV0LnRjcC5lY24uZW5hYmxlYCBzeXNjdGwuCisJCSAqLwor CQlpZiAoKHNjLT52dG5ldF9mbGFncyAmIFZUTkVUX0ZMQUdfVFNPX0VDTikgPT0gMCkgeworCQkJ aWZfcHJpbnRmKGlmcCwgIlRTTyB3aXRoIEVDTiBub3Qgc3VwcG9ydGVkIGJ5IGhvc3RcbiIpOwor CQkJbV9mcmVlbShtKTsKKwkJCXJldHVybiAoTlVMTCk7CisJCX0KKworCQloZHItPmZsYWdzIHw9 IFZJUlRJT19ORVRfSERSX0dTT19FQ047CisJfQorCisJcmV0dXJuIChtKTsKK30KKworc3RhdGlj IHN0cnVjdCBtYnVmICoKK3Z0bmV0X3R4X2NzdW0oc3RydWN0IHZ0bmV0X3NvZnRjICpzYywgc3Ry dWN0IG1idWYgKm0sCisgICAgc3RydWN0IHZpcnRpb19uZXRfaGRyICpoZHIsIHVpbnQxNl90IGV0 eXBlLCBpbnQgaXBfb2ZmKQoreworCXVpbnQxNl90IGNzdW1fc3RhcnQ7CisKKwlzd2l0Y2ggKGV0 eXBlKSB7CisJY2FzZSBFVEhFUlRZUEVfSVA6CisJICAgIHsKKwkJc3RydWN0IGlwICppcDsKKwor CQlpZiAobS0+bV9sZW4gPCBpcF9vZmYgKyBzaXplb2Yoc3RydWN0IGlwKSkgeworCQkJbSA9IG1f cHVsbHVwKG0sIGlwX29mZiArIHNpemVvZihzdHJ1Y3QgaXApKTsKKwkJCWlmIChtID09IE5VTEwp CisJCQkJcmV0dXJuIChOVUxMKTsKKwkJfQorCisJCWlwID0gKHN0cnVjdCBpcCAqKShtdG9kKG0s IHVpbnQ4X3QgKikgKyBpcF9vZmYpOworCQkvKiBBc3N1bWUgY2hlY2tzdW0gYmVnaW5zIHJpZ2h0 IGFmdGVyIGVuZCBvZiBoZWFkZXIuICovCisJCWNzdW1fc3RhcnQgPSBpcF9vZmYgKyAoaXAtPmlw X2hsIDw8IDIpOworCSAgICB9CisJICAgIGJyZWFrOworCisJICAgIC8qCisJICAgICAqIEZyZWVC U0QgZG9lcyBub3QgZG8gY2hlY2tzdW0gb2ZmbG9hZGluZyBvZiBJUHY2IHlldC4KKwkgICAgICov CisKKwlkZWZhdWx0OgorCQlzYy0+dnRuZXRfc3RhdHMudHhfY3N1bV91bmtub3duX2V0eXBlKys7 CisJCXJldHVybiAobSk7CisJfQorCisJaGRyLT5mbGFncyB8PSBWSVJUSU9fTkVUX0hEUl9GX05F RURTX0NTVU07CisJaGRyLT5jc3VtX3N0YXJ0ID0gY3N1bV9zdGFydDsKKwloZHItPmNzdW1fb2Zm c2V0ID0gbS0+bV9wa3RoZHIuY3N1bV9kYXRhOworCisJc2MtPnZ0bmV0X3N0YXRzLnR4X2NzdW1f b2ZmbG9hZGVkKys7CisKKwlyZXR1cm4gKG0pOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9lbnF1 ZXVlX3R4YnVmKHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2MsIHN0cnVjdCBtYnVmICoqbV9oZWFkLAor ICAgIHN0cnVjdCB2dG5ldF90eF9tYnVmX2hlYWRlciAqdHhoZHIpCit7CisJc3RydWN0IHNnbGlz dCBzZzsKKwlzdHJ1Y3Qgc2dsaXN0X3NlZyBzZWdzW1ZUTkVUX01BWF9UWF9TRUdTXTsKKwlzdHJ1 Y3QgdmlydHF1ZXVlICp2cTsKKwlzdHJ1Y3QgbWJ1ZiAqbTsKKwl1aW50OF90ICpkYXRhOworCWlu dCB0eGhkcnN6LCByZXNpZCwgY29sbGFwc2VkLCBlcnJvcjsKKworCXZxID0gc2MtPnZ0bmV0X3R4 X3ZxOworCW0gPSAqbV9oZWFkOworCXR4aGRyc3ogPSBzaXplb2Yoc3RydWN0IHZ0bmV0X3R4X21i dWZfaGVhZGVyKTsKKwljb2xsYXBzZWQgPSAwOworCisJLyoKKwkgKiBFbnN1cmUgdGhlcmUgaXMg c3VmZmljaWVudCBsZWFkaW5nIHNwYWNlIGluIHRoZSBtYnVmCisJICogdG8gaG9sZCBvdXIgaGVh ZGVyLiBJZGVhbGx5LCBvdXIgaGVhZGVyIHdpbGwgZml4IGluCisJICogdGhlIHJlbWFpbmluZyBz cGFjZSBpbiBvZiB0aGUgYG1heF9saW5rZGhyYCByZWdpb24sCisJICogc28gbm8gYWRkaXRpb25h bCBhbGxvY2F0aW9uIHdpbGwgYmUgcmVxdWlyZWQuCisJICovCisJTV9QUkVQRU5EKG0sIHR4aGRy c3osIE1fRE9OVFdBSVQpOworCWlmIChtID09IE5VTEwpCisJCWdvdG8gZmFpbDsKKworCSptX2hl YWQgPSBtOworCithZ2FpbjoKKwlzZ2xpc3RfaW5pdCgmc2csIFZUTkVUX01BWF9UWF9TRUdTLCBz ZWdzKTsKKworCWRhdGEgPSBtdG9kKG0sIHVpbnQ4X3QgKik7CisJbWVtY3B5KGRhdGEsIHR4aGRy LCB0eGhkcnN6KTsKKworCS8qIEFkZCBoZWFkZXIgdG8gc2dsaXN0LiAqLworCWVycm9yID0gc2ds aXN0X2FwcGVuZCgmc2csIGRhdGEsIHNjLT52dG5ldF9oZHJfc2l6ZSk7CisJS0FTU0VSVChlcnJv ciA9PSAwLCAoImNhbm5vdCBhZGQgaGVhZGVyIHRvIHNnbGlzdCIpKTsKKworCS8qIEFkZCByZW1h aW5kZXIgb2YgdGhlIGZpcnN0IG1idWYuICovCisJaWYgKChyZXNpZCA9IG0tPm1fbGVuIC0gdHho ZHJzeikgPiAwKSB7CisJCWVycm9yID0gc2dsaXN0X2FwcGVuZCgmc2csIGRhdGEgKyB0eGhkcnN6 LCByZXNpZCk7CisJCUtBU1NFUlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIHJlc3Qgb2YgbWJ1 ZiB0byBzZ2xpc3QiKSk7CisJfQorCisJaWYgKG0tPm1fbmV4dCAhPSBOVUxMKSB7CisJCS8qIEFk ZCB0aGUgcmVzdCBvZiB0aGUgbWJ1ZiBjaGFpbi4gKi8KKwkJZXJyb3IgPSBzZ2xpc3RfYXBwZW5k X21idWYoJnNnLCBtLT5tX25leHQpOworCQlpZiAoZXJyb3IpIHsKKwkJCWlmIChjb2xsYXBzZWQp CisJCQkJZ290byBmYWlsOworCisJCQltID0gbV9jb2xsYXBzZShtLCBNX0RPTlRXQUlULCBWVE5F VF9NQVhfVFhfU0VHUyAtIDEpOworCQkJaWYgKG0gPT0gTlVMTCkKKwkJCQlnb3RvIGZhaWw7CisK KwkJCSptX2hlYWQgPSBtOworCQkJY29sbGFwc2VkID0gMTsKKwkJCWdvdG8gYWdhaW47CisJCX0K Kwl9CisKKwlyZXR1cm4gKHZxX3JpbmdfZW5xdWV1ZSh2cSwgbSwgJnNnLCBzZy5zZ19uc2VnLCAw KSk7CisKK2ZhaWw6CisJc2MtPnZ0bmV0X3N0YXRzLnR4X2VucXVldWVfZmFpbGVkKys7CisJbV9m cmVlbSgqbV9oZWFkKTsKKwkqbV9oZWFkID0gTlVMTDsKKwlyZXR1cm4gKEVOT0JVRlMpOworfQor CitzdGF0aWMgaW50Cit2dG5ldF9lbmNhcChzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjLCBzdHJ1Y3Qg bWJ1ZiAqKm1faGVhZCkKK3sKKwlzdHJ1Y3QgdnRuZXRfdHhfbWJ1Zl9oZWFkZXIgdHhoZHI7CisJ c3RydWN0IHZpcnRpb19uZXRfaGRyICpoZHI7CisJc3RydWN0IG1idWYgKm07CisJaW50IGlwX29m ZjsKKwl1aW50MTZfdCBldHlwZTsKKworCW0gPSAqbV9oZWFkOworCWhkciA9ICZ0eGhkci52dGhf dWhkci5oZHI7CisJYnplcm8oJnR4aGRyLCBzaXplb2Yoc3RydWN0IHZ0bmV0X3R4X21idWZfaGVh ZGVyKSk7CisKKwlpZiAobS0+bV9mbGFncyAmIE1fVkxBTlRBRykgeworCQltID0gdnRuZXRfdmxh bl90YWdfaW5zZXJ0KG0pOworCQlpZiAoKCptX2hlYWQgPSBtKSA9PSBOVUxMKQorCQkJcmV0dXJu IChFTk9CVUZTKTsKKwl9CisKKwlpZiAobS0+bV9wa3RoZHIuY3N1bV9mbGFncyAhPSAwKSB7CisJ CW0gPSB2dG5ldF9nZXRfZnJhbWVfdHlwZShtLCAmZXR5cGUsICZpcF9vZmYpOworCQlpZiAoKCpt X2hlYWQgPSBtKSA9PSBOVUxMKQorCQkgICAgcmV0dXJuIChFTk9CVUZTKTsKKworCQlpZiAobS0+ bV9wa3RoZHIuY3N1bV9mbGFncyAmIENTVU1fREVMQVlfREFUQSkgeworCQkJbSA9IHZ0bmV0X3R4 X2NzdW0oc2MsIG0sIGhkciwgZXR5cGUsIGlwX29mZik7CisJCQlpZiAoKCptX2hlYWQgPSBtKSA9 PSBOVUxMKQorCQkJCXJldHVybiAoRU5PQlVGUyk7CisJCX0KKworCQlpZiAobS0+bV9wa3RoZHIu Y3N1bV9mbGFncyAmIENTVU1fVFNPKSB7CisJCQltID0gdnRuZXRfc2V0dXBfdHNvKHNjLCBtLCBo ZHIsIGV0eXBlLCBpcF9vZmYpOworCQkJaWYgKCgqbV9oZWFkID0gbSkgPT0gTlVMTCkKKwkJCQly ZXR1cm4gKEVOT0JVRlMpOworCQl9IGVsc2UKKwkJCWhkci0+Z3NvX3R5cGUgPSBWSVJUSU9fTkVU X0hEUl9HU09fTk9ORTsKKwl9CisKKwlyZXR1cm4gKHZ0bmV0X2VucXVldWVfdHhidWYoc2MsIG1f aGVhZCwgJnR4aGRyKSk7Cit9CisKK3N0YXRpYyB2b2lkCit2dG5ldF9zdGFydChzdHJ1Y3QgaWZu ZXQgKmlmcCkKK3sKKwlzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjOworCisJc2MgPSBpZnAtPmlmX3Nv ZnRjOworCisJVlRORVRfTE9DSyhzYyk7CisJdnRuZXRfc3RhcnRfbG9ja2VkKGlmcCk7CisJVlRO RVRfVU5MT0NLKHNjKTsKK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X3N0YXJ0X2xvY2tlZChzdHJ1 Y3QgaWZuZXQgKmlmcCkKK3sKKwlzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjOworCXN0cnVjdCB2aXJ0 cXVldWUgKnZxOworCXN0cnVjdCBtYnVmICptMDsKKwlpbnQgZW5xOworCisJc2MgPSBpZnAtPmlm X3NvZnRjOworCXZxID0gc2MtPnZ0bmV0X3R4X3ZxOworCWVucSA9IDA7CisKKwlWVE5FVF9MT0NL X0FTU0VSVChzYyk7CisKKwlpZiAoKGlmcC0+aWZfZHJ2X2ZsYWdzICYgKElGRl9EUlZfUlVOTklO RyB8IElGRl9EUlZfT0FDVElWRSkpICE9CisJICAgIElGRl9EUlZfUlVOTklORyB8fCAoKHNjLT52 dG5ldF9mbGFncyAmIFZUTkVUX0ZMQUdfTElOSykgPT0gMCkpCisJCXJldHVybjsKKworCXdoaWxl ICghSUZRX0RSVl9JU19FTVBUWSgmaWZwLT5pZl9zbmQpKSB7CisJCWlmICh2aXJ0cXVldWVfZnVs bCh2cSkpIHsKKwkJCWlmcC0+aWZfZHJ2X2ZsYWdzIHw9IElGRl9EUlZfT0FDVElWRTsKKwkJCWJy ZWFrOworCQl9CisKKwkJSUZRX0RSVl9ERVFVRVVFKCZpZnAtPmlmX3NuZCwgbTApOworCQlpZiAo bTAgPT0gTlVMTCkKKwkJCWJyZWFrOworCisJCWlmICh2dG5ldF9lbmNhcChzYywgJm0wKSAhPSAw KSB7CisJCQlpZiAobTAgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJCUlGUV9EUlZfUFJFUEVORCgm aWZwLT5pZl9zbmQsIG0wKTsKKwkJCWlmcC0+aWZfZHJ2X2ZsYWdzIHw9IElGRl9EUlZfT0FDVElW RTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW5xKys7CisJCUVUSEVSX0JQRl9NVEFQKGlmcCwgbTAp OworCX0KKworCWlmIChlbnEgPiAwKSB7CisJCXZxX3Jpbmdfc3luYyh2cSk7CisKKwkJc2MtPnZ0 bmV0X3dhdGNoZG9nX3RpbWVyID0gVlRORVRfV0FUQ0hET0dfVElNRU9VVDsKKwl9Cit9CisKK3N0 YXRpYyB2b2lkCit2dG5ldF90eF90YXNrKHZvaWQgKmFyZywgaW50IHBlbmRpbmcpCit7CisJc3Ry dWN0IGlmbmV0ICppZnA7CisKKwlpZnAgPSBhcmc7CisJdnRuZXRfc3RhcnQoaWZwKTsKK30KKwor c3RhdGljIHZvaWQKK3Z0bmV0X3RpY2sodm9pZCAqeHNjKQoreworCXN0cnVjdCB2dG5ldF9zb2Z0 YyAqc2M7CisJc3RydWN0IGlmbmV0ICppZnA7CisKKwlzYyA9IHhzYzsKKwlpZnAgPSBzYy0+dnRu ZXRfaWZwOworCisJVlRORVRfTE9DS19BU1NFUlQoc2MpOworCisjaWZkZWYgVlRORVRfREVCVUcK Kwl2aXJ0cXVldWVfZHVtcChzYy0+dnRuZXRfcnhfdnEpOworCXZpcnRxdWV1ZV9kdW1wKHNjLT52 dG5ldF90eF92cSk7CisjZW5kaWYKKworI2lmZGVmIERFVklDRV9QT0xMSU5HCisJaWYgKChpZnAt PmlmX2NhcGVuYWJsZSAmIElGQ0FQX1BPTExJTkcpID09IDApCisjZW5kaWYKKwl7CisJLyogSW4g cG9sbGluZyBtb2RlLCB3ZSBwb2xsIGxpbmsgc3RhdGUgaW4gdnRuZXRfcG9sbCgpLiAqLworCXZ0 bmV0X3VwZGF0ZV9saW5rX3N0YXR1cyhzYyk7CisJfQorCisJdnRuZXRfd2F0Y2hkb2coc2MpOwor CWNhbGxvdXRfcmVzZXQoJnNjLT52dG5ldF90aWNrX2NoLCBoeiwgdnRuZXRfdGljaywgc2MpOwor fQorCitzdGF0aWMgdm9pZAordnRuZXRfdHhfaW50cl90YXNrKHZvaWQgKmFyZywgaW50IHBlbmRp bmcpCit7CisJc3RydWN0IHZ0bmV0X3NvZnRjICpzYzsKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwor CXNjID0gYXJnOworCWlmcCA9IHNjLT52dG5ldF9pZnA7CisKKwlWVE5FVF9MT0NLKHNjKTsKKwor I2lmZGVmIERFVklDRV9QT0xMSU5HCisJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfUE9M TElORykgeworCQlWVE5FVF9VTkxPQ0soc2MpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisKKwlp ZiAoKGlmcC0+aWZfZHJ2X2ZsYWdzICYgSUZGX0RSVl9SVU5OSU5HKSA9PSAwKSB7CisJCXZ0bmV0 X2VuYWJsZV90eF9pbnRyKHNjKTsKKwkJVlRORVRfVU5MT0NLKHNjKTsKKwkJcmV0dXJuOworCX0K KworCXZ0bmV0X3R4ZW9mKHNjKTsKKworCWlmICghSUZRX0RSVl9JU19FTVBUWSgmaWZwLT5pZl9z bmQpKQorCQl0YXNrcXVldWVfZW5xdWV1ZV9mYXN0KHNjLT52dG5ldF90cSwgJnNjLT52dG5ldF90 eF90YXNrKTsKKworCWlmICh2dG5ldF9lbmFibGVfdHhfaW50cihzYykgIT0gMCkgeworCQl2dG5l dF9kaXNhYmxlX3R4X2ludHIoc2MpOworCQlWVE5FVF9VTkxPQ0soc2MpOworCQl0YXNrcXVldWVf ZW5xdWV1ZV9mYXN0KHNjLT52dG5ldF90cSwgJnNjLT52dG5ldF90eF9pbnRyX3Rhc2spOworCQly ZXR1cm47CisJfQorCisJVlRORVRfVU5MT0NLKHNjKTsKK30KKworc3RhdGljIGludAordnRuZXRf dHhfdnFfaW50cih2b2lkICp4c2MpCit7CisJc3RydWN0IHZ0bmV0X3NvZnRjICpzYzsKKworCXNj ID0geHNjOworCisJdnRuZXRfZGlzYWJsZV90eF9pbnRyKHNjKTsKKwl0YXNrcXVldWVfZW5xdWV1 ZV9mYXN0KHNjLT52dG5ldF90cSwgJnNjLT52dG5ldF90eF9pbnRyX3Rhc2spOworCisJcmV0dXJu ICgxKTsKK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X3N0b3Aoc3RydWN0IHZ0bmV0X3NvZnRjICpz YykKK3sKKwlkZXZpY2VfdCBkZXY7CisJc3RydWN0IGlmbmV0ICppZnA7CisKKwlkZXYgPSBzYy0+ dnRuZXRfZGV2OworCWlmcCA9IHNjLT52dG5ldF9pZnA7CisKKwlWVE5FVF9MT0NLX0FTU0VSVChz Yyk7CisKKwlzYy0+dnRuZXRfd2F0Y2hkb2dfdGltZXIgPSAwOworCWlmcC0+aWZfZHJ2X2ZsYWdz ICY9IH4oSUZGX0RSVl9SVU5OSU5HIHwgSUZGX0RSVl9PQUNUSVZFKTsKKworCWNhbGxvdXRfc3Rv cCgmc2MtPnZ0bmV0X3RpY2tfY2gpOworCisJdnRuZXRfZGlzYWJsZV9yeF9pbnRyKHNjKTsKKwl2 dG5ldF9kaXNhYmxlX3R4X2ludHIoc2MpOworCWlmIChzYy0+dnRuZXRfZmxhZ3MgJiBWVE5FVF9G TEFHX0NUUkxfVlEpCisJCXZ0bmV0X2Rpc2FibGVfY3RybF9pbnRyKHNjKTsKKworCS8qCisJICog U3RvcCB0aGUgaG9zdCBWaXJ0SU8gYWRhcHRlci4gTm90ZSB0aGlzIHdpbGwgcmVzZXQgdGhlIGhv c3QKKwkgKiBhZGFwdGVyJ3Mgc3RhdGUgYmFjayB0byB0aGUgcHJlLWluaXRpYWxpemVkIHN0YXRl LCBzbyBpbgorCSAqIG9yZGVyIHRvIG1ha2UgdGhlIGRldmljZSB1c2FibGUgYWdhaW4sIHdlIG11 c3QgZHJpdmUgaXQKKwkgKiB0aHJvdWdoIHZpcnRpb19yZWluaXQgYW5kIHZpcnRpb19yZWluaXRf Y29tcGxldGUuCisJICovCisJdmlydGlvX3N0b3AoZGV2KTsKKworCXNjLT52dG5ldF9mbGFncyAm PSB+VlRORVRfRkxBR19MSU5LOworCisJdnRuZXRfcnhlb2Yoc2MsIHNjLT52dG5ldF9yeF9zaXpl LCBOVUxMKTsKKwl2dG5ldF90eGVvZihzYyk7CisKKwl2dG5ldF9mcmVlX3J4X21idWZzKHNjKTsK Kwl2dG5ldF9mcmVlX3R4X21idWZzKHNjKTsKK30KKworc3RhdGljIGludAordnRuZXRfcmVpbml0 KHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGlmbmV0ICppZnA7CisJdWludDMy X3QgZmVhdHVyZXM7CisKKwlpZnAgPSBzYy0+dnRuZXRfaWZwOworCWZlYXR1cmVzID0gc2MtPnZ0 bmV0X2ZlYXR1cmVzOworCisJLyoKKwkgKiBSZS1uZWdvdGlhdGUgd2l0aCBob3N0LCBkaXNhYmxp bmcgYW55IFJ4IGZlYXR1cmVzIHdlCisJICogbm8gbG9uZ2VyIHdpc2ggdG8gc3VwcG9ydC4gVHgg ZmVhdHVyZXMgYXJlIGhhbmRsZWQgb24KKwkgKiBvdXIgc2lkZSB2aWEgaWZfY2FwZW5hYmxlIGFu ZCBpZl9od2Fzc2lzdC4KKwkgKi8KKworCWlmIChpZnAtPmlmX2NhcGFiaWxpdGllcyAmIElGQ0FQ X1JYQ1NVTSkgeworCQlpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJRkNBUF9SWENTVU0pCisJCQlm ZWF0dXJlcyB8PSBWSVJUSU9fTkVUX0ZfR1VFU1RfQ1NVTTsKKwkJZWxzZQorCQkJZmVhdHVyZXMg Jj0gfihWSVJUSU9fTkVUX0ZfR1VFU1RfQ1NVTSB8CisJCQkgICAgVlRORVRfR1VFU1RfQ1NVTV9G RUFUVVJFUyk7CisJfQorCisJaWYgKGlmcC0+aWZfY2FwYWJpbGl0aWVzICYgSUZDQVBfTFJPKSB7 CisJCWlmIChpZnAtPmlmX2NhcGVuYWJsZSAmIElGQ0FQX0xSTykKKwkJCWZlYXR1cmVzIHw9IFZJ UlRJT19ORVRfRl9HVUVTVF9UU080IHwKKwkJCSAgICBWSVJUSU9fTkVUX0ZfR1VFU1RfVFNPNjsK KwkJZWxzZQorCQkJZmVhdHVyZXMgJj0gfihWSVJUSU9fTkVUX0ZfR1VFU1RfVFNPNCB8CisJCQkg ICAgVklSVElPX05FVF9GX0dVRVNUX1RTTzYpOworCX0KKworCWlmIChpZnAtPmlmX2NhcGFiaWxp dGllcyAmIElGQ0FQX1ZMQU5fSFdGSUxURVIpIHsKKwkJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYg SUZDQVBfVkxBTl9IV0ZJTFRFUikKKwkJCWZlYXR1cmVzIHw9IFZJUlRJT19ORVRfRl9DVFJMX1ZM QU47CisJCWVsc2UKKwkJCWZlYXR1cmVzICY9IH5WSVJUSU9fTkVUX0ZfQ1RSTF9WTEFOOworCX0K KworCXJldHVybiAodmlydGlvX3JlaW5pdChzYy0+dnRuZXRfZGV2LCBmZWF0dXJlcykpOworfQor CitzdGF0aWMgdm9pZAordnRuZXRfaW5pdF9sb2NrZWQoc3RydWN0IHZ0bmV0X3NvZnRjICpzYykK K3sKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwlpbnQgZXJyb3I7CisKKwlpZnAgPSBzYy0+dnRuZXRf aWZwOworCisJVlRORVRfTE9DS19BU1NFUlQoc2MpOworCisJaWYgKGlmcC0+aWZfZHJ2X2ZsYWdz ICYgSUZGX0RSVl9SVU5OSU5HKQorCQlyZXR1cm47CisKKwkvKiBTdG9wIGhvc3QncyBhZGFwdGVy LCBjYW5jZWwgYW55IHBlbmRpbmcgSS9PLiAqLworCXZ0bmV0X3N0b3Aoc2MpOworCisJLyogUmVp bml0aWFsaXplIHRoZSBob3N0J3MgZGV2aWNlLiAqLworCWVycm9yID0gdnRuZXRfcmVpbml0KHNj KTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2aWNlX3ByaW50ZihzYy0+dnRuZXRfZGV2LAorCQkgICAg InJlaW5pdGlhbGl6YXRpb24gZmFpbGVkLCBzdG9wcGluZyBkZXZpY2UuLi5cbiIpOworCQl2dG5l dF9zdG9wKHNjKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEdldCBsYXRlc3QgTUFDIGFkZHJlc3Mg YW5kIHVwZGF0ZSBob3N0LiAqLworCWJjb3B5KElGX0xMQUREUihpZnApLCBzYy0+dnRuZXRfaHdh ZGRyLCBFVEhFUl9BRERSX0xFTik7CisJdnRuZXRfc2V0X2h3YWRkcihzYyk7CisKKwlpZnAtPmlm X2h3YXNzaXN0ID0gMDsKKwlpZiAoaWZwLT5pZl9jYXBlbmFibGUgJiBJRkNBUF9UWENTVU0pCisJ CWlmcC0+aWZfaHdhc3Npc3QgfD0gVlRORVRfQ1NVTV9GRUFUVVJFUzsKKwlpZiAoaWZwLT5pZl9j YXBlbmFibGUgJiBJRkNBUF9UU080KQorCQlpZnAtPmlmX2h3YXNzaXN0IHw9IENTVU1fVFNPOwor CisJZXJyb3IgPSB2dG5ldF9pbml0X3J4X3ZxKHNjKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2aWNl X3ByaW50ZihzYy0+dnRuZXRfZGV2LAorCQkgICAgImNhbm5vdCBhbGxvY2F0ZSBtYnVmcyBmb3Ig UnggdmlydHF1ZXVlXG4iKTsKKwkJdnRuZXRfc3RvcChzYyk7CisJCXJldHVybjsKKwl9CisKKwlp ZiAoc2MtPnZ0bmV0X2ZsYWdzICYgVlRORVRfRkxBR19DVFJMX1ZRKSB7CisJCWlmIChzYy0+dnRu ZXRfZmxhZ3MgJiBWVE5FVF9GTEFHX0NUUkxfUlgpIHsKKwkJCS8qIFJlc3RvcmUgcHJvbWlzY3Vv dXMgYW5kIGFsbC1tdWx0aWNhc3QgbW9kZXMuICovCisJCQl2dG5ldF9yeF9maWx0ZXIoc2MpOwor CisJCQkvKiBSZXN0b3JlIE1BQyBmaWx0ZXJzLiAqLworCQkJdnRuZXRfcnhfZmlsdGVyX21hYyhz Yyk7CisJCX0KKworCQkvKiBSZXN0b3JlIFZMQU4gZmlsdGVycy4gKi8KKwkJaWYgKHNjLT52dG5l dF9mbGFncyAmIFZUTkVUX0ZMQUdfVkxBTl9GSUxURVIpCisJCQl2dG5ldF9yeF9maWx0ZXJfdmxh bihzYyk7CisJfQorCisjaWZkZWYgREVWSUNFX1BPTExJTkcKKwlpZiAoaWZwLT5pZl9jYXBlbmFi bGUgJiBJRkNBUF9QT0xMSU5HKSB7CisJCXZ0bmV0X2Rpc2FibGVfcnhfaW50cihzYyk7CisJCXZ0 bmV0X2Rpc2FibGVfdHhfaW50cihzYyk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCXZ0bmV0X2Vu YWJsZV9yeF9pbnRyKHNjKTsKKwkJdnRuZXRfZW5hYmxlX3R4X2ludHIoc2MpOworCX0KKworCWlm cC0+aWZfZHJ2X2ZsYWdzIHw9IElGRl9EUlZfUlVOTklORzsKKwlpZnAtPmlmX2Rydl9mbGFncyAm PSB+SUZGX0RSVl9PQUNUSVZFOworCisJdmlydGlvX3JlaW5pdF9jb21wbGV0ZShzYy0+dnRuZXRf ZGV2KTsKKworCXZ0bmV0X3VwZGF0ZV9saW5rX3N0YXR1cyhzYyk7CisJY2FsbG91dF9yZXNldCgm c2MtPnZ0bmV0X3RpY2tfY2gsIGh6LCB2dG5ldF90aWNrLCBzYyk7Cit9CisKK3N0YXRpYyB2b2lk Cit2dG5ldF9pbml0KHZvaWQgKnhzYykKK3sKKwlzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjOworCisJ c2MgPSB4c2M7CisKKwlWVE5FVF9MT0NLKHNjKTsKKwl2dG5ldF9pbml0X2xvY2tlZChzYyk7CisJ VlRORVRfVU5MT0NLKHNjKTsKK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X2V4ZWNfY3RybF9jbWQo c3RydWN0IHZ0bmV0X3NvZnRjICpzYywgdm9pZCAqY29va2llLAorICAgIHN0cnVjdCBzZ2xpc3Qg KnNnLCBpbnQgcmVhZGFibGUsIGludCB3cml0YWJsZSkKK3sKKwlzdHJ1Y3QgdmlydHF1ZXVlICp2 cTsKKwl2b2lkICpjOworCWludCBlcnJvcjsKKworCXZxID0gc2MtPnZ0bmV0X2N0cmxfdnE7CisK KwlWVE5FVF9MT0NLX0FTU0VSVChzYyk7CisJS0FTU0VSVChzYy0+dnRuZXRfZmxhZ3MgJiBWVE5F VF9GTEFHX0NUUkxfVlEsICgibm8gY29udHJvbCB2cSIpKTsKKwkvKiBOb2JvZHkgc2hvdWxkIGJl IHBlbmRpbmcgYmVmb3JlIHVzLiAqLworCUtBU1NFUlQodmlydHF1ZXVlX2VtcHR5KHZxKSwgKCJj dHJsIGNtZCBhbHJlYWR5IGVucXVldWVkIikpOworCisJZXJyb3IgPSB2cV9yaW5nX2VucXVldWUo dnEsIGNvb2tpZSwgc2csIHJlYWRhYmxlLCB3cml0YWJsZSk7CisJS0FTU0VSVChlcnJvciA9PSAw LCAoImNhbm5vdCBlbnF1ZXVlIGN0cmwgY29tbWFuZCIpKTsKKworCXZxX3Jpbmdfc3luYyh2cSk7 CisKKwkvKgorCSAqIFBvbGwgdW50aWwgdGhlIGNvbW1hbmQgaXMgY29tcGxldGUuIFByZXZpb3Vz bHksIHdlIHdvdWxkCisJICogbXR4X3NsZWVwKCkgdW50aWwgdGhlIGludGVycnVwdCBoYW5kbGVy IHdva2UgdXAgdXMsIGJ1dAorCSAqIGRyb3BwaW5nIHRoZSBsb2NrIG9wZW5lZCB1cyB0byBhbGwg c29ydHMgb2Ygc2VyaWFsaXphdGlvbgorCSAqIGlzc3Vlcy4KKwkgKgorCSAqIEFsc28sIEtWTSBv bmx5IGFsbG9jYXRlcyB0aHJlZSBNU0lYIHZlY3RvcnMgLSBwcmVzdW1hYmx5CisJICogb25lIGZv ciB0aGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFuZCBvbmUgZWFjaCBmb3IgdGhlIFJ4CisJICog YW5kIFR4IHZpcnRxdWV1ZXMgLSBsZWF2aW5nIG5vbmUgZm9yIHRoZSBjb250cm9sIHZpcnRxdWV1 ZS4KKwkgKi8KKworCXdoaWxlICgoYyA9IHZxX3JpbmdfZGVxdWV1ZSh2cSwgTlVMTCkpID09IE5V TEwpCisJCWNwdV9zcGlud2FpdCgpOworCUtBU1NFUlQoYyA9PSBjb29raWUsICgibm90IG15IGN0 cmwgY21kIHJlc3BvbnNlIikpOworfQorCitzdGF0aWMgdm9pZAordnRuZXRfcnhfZmlsdGVyKHN0 cnVjdCB2dG5ldF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IGlmbmV0ICppZnA7CisKKwlpZnAgPSBz Yy0+dnRuZXRfaWZwOworCisJVlRORVRfTE9DS19BU1NFUlQoc2MpOworCUtBU1NFUlQoc2MtPnZ0 bmV0X2ZsYWdzICYgVlRORVRfRkxBR19DVFJMX1JYLAorCSAgICAoIkNUUkxfUlggbm90IG5lZ290 aWF0ZWQiKSk7CisKKwlpZiAodnRuZXRfc2V0X3Byb21pc2Moc2MsIGlmcC0+aWZfZmxhZ3MgJiBJ RkZfUFJPTUlTQykgIT0gMCkKKwkJZGV2aWNlX3ByaW50ZihzYy0+dnRuZXRfZGV2LAorCQkgICAg ImNhbm5vdCAlcyBwcm9taXNjdW91cyBtb2RlXG4iLAorCQkgICAgaWZwLT5pZl9mbGFncyAmIElG Rl9QUk9NSVNDID8gImVuYWJsZSIgOiAiZGlzYWJsZSIpOworCisJaWYgKHZ0bmV0X3NldF9hbGxt dWx0aShzYywgaWZwLT5pZl9mbGFncyAmIElGRl9BTExNVUxUSSkgIT0gMCkKKwkJZGV2aWNlX3By aW50ZihzYy0+dnRuZXRfZGV2LAorCQkgICAgImNhbm5vdCAlcyBhbGwtbXVsdGljYXN0IG1vZGVc biIsCisJCSAgICBpZnAtPmlmX2ZsYWdzICYgSUZGX0FMTE1VTFRJID8gImVuYWJsZSIgOiAiZGlz YWJsZSIpOworfQorCitzdGF0aWMgaW50Cit2dG5ldF9jdHJsX3J4X2NtZChzdHJ1Y3QgdnRuZXRf c29mdGMgKnNjLCBpbnQgY21kLCBpbnQgb24pCit7CisJc3RydWN0IHZpcnRpb19uZXRfY3RybF9o ZHIgaGRyOworCXN0cnVjdCBzZ2xpc3Qgc2c7CisJc3RydWN0IHNnbGlzdF9zZWcgc2Vnc1szXTsK Kwl1aW50OF90IG9ub2ZmLCBhY2s7CisJaW50IGVycm9yOworCisJaWYgKChzYy0+dnRuZXRfZmxh Z3MgJiBWVE5FVF9GTEFHX0NUUkxfUlgpID09IDApCisJCXJldHVybiAoRU5PVFNVUCk7CisKKwlo ZHIuY2xhc3MgPSBWSVJUSU9fTkVUX0NUUkxfUlg7CisJaGRyLmNtZCA9IGNtZDsKKwlvbm9mZiA9 ICEhb247CisJYWNrID0gVklSVElPX05FVF9FUlI7CisKKwlzZ2xpc3RfaW5pdCgmc2csIDMsIHNl Z3MpOworCisJZXJyb3IgPSBzZ2xpc3RfYXBwZW5kKCZzZywgJmhkciwgc2l6ZW9mKGhkcikpOwor CUtBU1NFUlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIGNvbnRyb2wgaGVhZGVyIHRvIHNnbGlz dCIpKTsKKwllcnJvciA9IHNnbGlzdF9hcHBlbmQoJnNnLCAmb25vZmYsIHNpemVvZihvbm9mZikp OworCUtBU1NFUlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIG9uL29mZiB0byBzZ2xpc3QiKSk7 CisJZXJyb3IgPSBzZ2xpc3RfYXBwZW5kKCZzZywgJmFjaywgc2l6ZW9mKGFjaykpOworCUtBU1NF UlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIGFjayB0byBzZ2xpc3QiKSk7CisKKwl2dG5ldF9l eGVjX2N0cmxfY21kKHNjLCAmYWNrLCAmc2csIHNnLnNnX25zZWcgLSAxLCAxKTsKKworCXJldHVy biAoYWNrID09IFZJUlRJT19ORVRfT0sgPyAwIDogRUlPKTsKK30KKworc3RhdGljIGludAordnRu ZXRfc2V0X3Byb21pc2Moc3RydWN0IHZ0bmV0X3NvZnRjICpzYywgaW50IG9uKQoreworCWludCBl cnJvcjsKKworCWVycm9yID0gdnRuZXRfY3RybF9yeF9jbWQoc2MsIFZJUlRJT19ORVRfQ1RSTF9S WF9QUk9NSVNDLCBvbik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyBpbnQKK3Z0bmV0 X3NldF9hbGxtdWx0aShzdHJ1Y3QgdnRuZXRfc29mdGMgKnNjLCBpbnQgb24pCit7CisJaW50IGVy cm9yOworCisJZXJyb3IgPSB2dG5ldF9jdHJsX3J4X2NtZChzYywgVklSVElPX05FVF9DVFJMX1JY X0FMTE1VTFRJLCBvbik7CisJcmV0dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyB2b2lkCit2dG5l dF9yeF9maWx0ZXJfbWFjKHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2MpCit7CisJc3RydWN0IHZpcnRp b19uZXRfY3RybF9oZHIgaGRyOworCXN0cnVjdCB2dG5ldF9tYWNfZmlsdGVyICpmaWx0ZXI7CisJ c3RydWN0IGlmbmV0ICppZnA7CisJc3RydWN0IGlmYWRkciAqaWZhOworCXN0cnVjdCBpZm11bHRp YWRkciAqaWZtYTsKKwlzdHJ1Y3Qgc2dsaXN0IHNnOworCXN0cnVjdCBzZ2xpc3Rfc2VnIHNlZ3Nb NF07CisJaW50IHVjbnQsIG1jbnQ7CisJaW50IHByb21pc2MsIGFsbG11bHRpOworCXVpbnQ4X3Qg YWNrOworCWludCBlcnJvcjsKKworCWlmcCA9IHNjLT52dG5ldF9pZnA7CisJZmlsdGVyID0gTlVM TDsKKwl1Y250ID0gbWNudCA9IDA7CisJcHJvbWlzYyA9IGFsbG11bHRpID0gMDsKKworCVZUTkVU X0xPQ0tfQVNTRVJUKHNjKTsKKwlLQVNTRVJUKHNjLT52dG5ldF9mbGFncyAmIFZUTkVUX0ZMQUdf Q1RSTF9SWCwKKwkgICAgKCJDVFJMX1JYIG5vdCBuZWdvdGlhdGVkIikpOworCisJZmlsdGVyID0g Y29udGlnbWFsbG9jKFBBR0VfU0laRSwgTV9ERVZCVUYsIE1fTk9XQUlUIHwgTV9aRVJPLAorCSAg ICAwLCB+MHVsLCBQQUdFX1NJWkUsIDApOworCWlmIChmaWx0ZXIgPT0gTlVMTCkgeworCQlkZXZp Y2VfcHJpbnRmKHNjLT52dG5ldF9kZXYsICJjYW5ub3QgYWxsb2MgYnVmZmVyIGZvciAiCisJCSAg ICAiTUFDIGFkZHJlc3MgZmlsdGVyaW5nXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVuaWNh c3QuICovCisJaWZfYWRkcl9ybG9jayhpZnApOworCVRBSUxRX0ZPUkVBQ0goaWZhLCAmaWZwLT5p Zl9hZGRyaGVhZCwgaWZhX2xpbmspIHsKKwkJaWYgKGlmYS0+aWZhX2FkZHItPnNhX2ZhbWlseSAh PSBBRl9MSU5LKQorCQkJY29udGludWU7CisKKwkJaWYgKHVjbnQgPT0gVlRORVRfTUFYX01BQ19F TlRSSUVTKQorCQkJYnJlYWs7CisKKwkJYmNvcHkoTExBRERSKChzdHJ1Y3Qgc29ja2FkZHJfZGwg KilpZmEtPmlmYV9hZGRyKSwKKwkJICAgIGZpbHRlci0+dm1mX3VuaS5tYWNzW3VjbnRdLCBFVEhF Ul9BRERSX0xFTik7CisJCXVjbnQrKzsKKwl9CisJaWZfYWRkcl9ydW5sb2NrKGlmcCk7CisKKwlp ZiAodWNudCA+PSBWVE5FVF9NQVhfTUFDX0VOVFJJRVMpIHsKKwkJaWZfcHJpbnRmKGlmcCwgInRv byBtYW55IHVuaWNhc3QgYWRkcmVzc2VzLCAiCisJCSAgICAiZW5hYmxpbmcgcHJvbWlzY3VvdXMg bW9kZVxuIik7CisJCWZpbHRlci0+dm1mX3VuaS5uZW50cmllcyA9IDA7CisJCXByb21pc2MgPSAx OworCX0gZWxzZQorCQlmaWx0ZXItPnZtZl91bmkubmVudHJpZXMgPSB1Y250OworCisJLyogTXVs dGljYXN0LiAqLworCWlmX21hZGRyX3Jsb2NrKGlmcCk7CisJVEFJTFFfRk9SRUFDSChpZm1hLCAm aWZwLT5pZl9tdWx0aWFkZHJzLCBpZm1hX2xpbmspIHsKKwkJaWYgKGlmbWEtPmlmbWFfYWRkci0+ c2FfZmFtaWx5ICE9IEFGX0xJTkspCisJCQljb250aW51ZTsKKworCQlpZiAobWNudCA9PSBWVE5F VF9NQVhfTUFDX0VOVFJJRVMpCisJCQlicmVhazsKKworCQliY29weShMTEFERFIoKHN0cnVjdCBz b2NrYWRkcl9kbCAqKWlmbWEtPmlmbWFfYWRkciksCisJCSAgICAmZmlsdGVyLT52bWZfbXVsLm1h Y3NbbWNudF0sIEVUSEVSX0FERFJfTEVOKTsKKwkJbWNudCsrOworCX0KKwlpZl9tYWRkcl9ydW5s b2NrKGlmcCk7CisKKwlpZiAobWNudCA+PSBWVE5FVF9NQVhfTUFDX0VOVFJJRVMpIHsKKwkJaWZf cHJpbnRmKGlmcCwgInRvbyBtYW55IG11bHRpY2FzdCBhZGRyZXNzZXMsICIKKwkJICAgICJlbmFi bGluZyBhbGwtbXVsdGljYXN0IG1vZGVcbiIpOworCQlmaWx0ZXItPnZtZl9tdWwubmVudHJpZXMg PSAwOworCQlhbGxtdWx0aSA9IDE7CisJfSBlbHNlCisJCWZpbHRlci0+dm1mX211bC5uZW50cmll cyA9IG1jbnQ7CisKKwlpZiAocHJvbWlzYyAmJiBhbGxtdWx0aSkKKwkJZ290byBvdXQ7CisKKwlo ZHIuY2xhc3MgPSBWSVJUSU9fTkVUX0NUUkxfTUFDOworCWhkci5jbWQgPSBWSVJUSU9fTkVUX0NU UkxfTUFDX1RBQkxFX1NFVDsKKwlhY2sgPSBWSVJUSU9fTkVUX0VSUjsKKworCXNnbGlzdF9pbml0 KCZzZywgNCwgc2Vncyk7CisKKwllcnJvciA9IHNnbGlzdF9hcHBlbmQoJnNnLCAmaGRyLCBzaXpl b2YoaGRyKSk7CisJS0FTU0VSVChlcnJvciA9PSAwLCAoImNhbm5vdCBhZGQgY29udHJvbCBoZWFk ZXIgdG8gc2dsaXN0IikpOworCWVycm9yID0gc2dsaXN0X2FwcGVuZCgmc2csICZmaWx0ZXItPnZt Zl91bmksIHNpemVvZihmaWx0ZXItPnZtZl91bmkpKTsKKwlLQVNTRVJUKGVycm9yID09IDAsICgi Y2Fubm90IGFkZCB1bmljYXN0IG1hY3MgdG8gc2dsaXN0IikpOworCWVycm9yID0gc2dsaXN0X2Fw cGVuZCgmc2csICZmaWx0ZXItPnZtZl9tdWwsIHNpemVvZihmaWx0ZXItPnZtZl9tdWwpKTsKKwlL QVNTRVJUKGVycm9yID09IDAsICgiY2Fubm90IGFkZCBtdWx0aWNhc3QgbWFjcyB0byBzZ2xpc3Qi KSk7CisJZXJyb3IgPSBzZ2xpc3RfYXBwZW5kKCZzZywgJmFjaywgc2l6ZW9mKGFjaykpOworCUtB U1NFUlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIGFjayB0byBzZ2xpc3QiKSk7CisKKwl2dG5l dF9leGVjX2N0cmxfY21kKHNjLCAmYWNrLCAmc2csIHNnLnNnX25zZWcgLSAxLCAxKTsKKworCWlm IChhY2sgIT0gVklSVElPX05FVF9PSykgeworCQkvKiBGYWlsdXJlLCBkbyBwcm9taXNjL2FsbG11 bHRpIGluc3RlYWQuICovCisJCWRldmljZV9wcmludGYoc2MtPnZ0bmV0X2RldiwgImNhbm5vdCBz ZXQgbWFjIGFkZHJlc3MgIgorCQkgICAgInRhYmxlLCBmYWxsaW5nIGJhY2sgdG8gcHJvbWlzYy9h bGxtdWx0aVxuIik7CisJCWlmICh1Y250ID4gMSkKKwkJCXByb21pc2MgPSAxOworCQlpZiAobWNu dCA+IDApCisJCQlhbGxtdWx0aSA9IDE7CisJfQorCitvdXQ6CisJaWYgKGZpbHRlciAhPSBOVUxM KQorCQljb250aWdmcmVlKGZpbHRlciwgUEFHRV9TSVpFLCBNX0RFVkJVRik7CisKKwlpZiAocHJv bWlzYykgeworCQlpZiAodnRuZXRfc2V0X3Byb21pc2Moc2MsIDEpICE9IDApCisJCQlpZl9wcmlu dGYoaWZwLCAiY2Fubm90IGVuYWJsZSBwcm9taXNjdW91cyBtb2RlXG4iKTsKKwl9CisKKwlpZiAo YWxsbXVsdGkpIHsKKwkJaWYgKHZ0bmV0X3NldF9hbGxtdWx0aShzYywgMSkgIT0gMCkKKwkJCWlm X3ByaW50ZihpZnAsICJjYW5ub3QgZW5hYmxlIGFsbC1tdWx0aWNhc3QgbW9kZVxuIik7CisJfQor fQorCitzdGF0aWMgaW50Cit2dG5ldF9leGVjX3ZsYW5fZmlsdGVyKHN0cnVjdCB2dG5ldF9zb2Z0 YyAqc2MsIGludCBhZGQsIHVpbnQxNl90IHRhZykKK3sKKwlzdHJ1Y3QgdmlydGlvX25ldF9jdHJs X2hkciBoZHI7CisJc3RydWN0IHNnbGlzdCBzZzsKKwlzdHJ1Y3Qgc2dsaXN0X3NlZyBzZWdzWzNd OworCXVpbnQ4X3QgYWNrOworCWludCBlcnJvcjsKKworCWhkci5jbGFzcyA9IFZJUlRJT19ORVRf Q1RSTF9WTEFOOworCWhkci5jbWQgPSBhZGQgPyBWSVJUSU9fTkVUX0NUUkxfVkxBTl9BREQgOiBW SVJUSU9fTkVUX0NUUkxfVkxBTl9ERUw7CisJYWNrID0gVklSVElPX05FVF9FUlI7CisKKwlWVE5F VF9MT0NLX0FTU0VSVChzYyk7CisJS0FTU0VSVChzYy0+dnRuZXRfZmxhZ3MgJiBWVE5FVF9GTEFH X1ZMQU5fRklMVEVSLAorCSAgICAoIlZMQU5fRklMVEVSIG5vdCBuZWdvdGlhdGVkIikpOworCisJ c2dsaXN0X2luaXQoJnNnLCAzLCBzZWdzKTsKKwllcnJvciA9IHNnbGlzdF9hcHBlbmQoJnNnLCAm aGRyLCBzaXplb2YoaGRyKSk7CisJS0FTU0VSVChlcnJvciA9PSAwLCAoImNhbm5vdCBhZGQgY29u dHJvbCBoZWFkZXIgdG8gc2dsaXN0IikpOworCWVycm9yID0gc2dsaXN0X2FwcGVuZCgmc2csICZ0 YWcsIHNpemVvZih0YWcpKTsKKwlLQVNTRVJUKGVycm9yID09IDAsICgiY2Fubm90IGFkZCB2bGFu IHRhZyB0byBzZ2xpc3QiKSk7CisJZXJyb3IgPSBzZ2xpc3RfYXBwZW5kKCZzZywgJmFjaywgc2l6 ZW9mKGFjaykpOworCUtBU1NFUlQoZXJyb3IgPT0gMCwgKCJjYW5ub3QgYWRkIGFjayB0byBzZ2xp c3QiKSk7CisKKwl2dG5ldF9leGVjX2N0cmxfY21kKHNjLCAmYWNrLCAmc2csIHNnLnNnX25zZWcg LSAxLCAxKTsKKworCXJldHVybiAoYWNrID09IFZJUlRJT19ORVRfT0sgPyAwIDogRUlPKTsKK30K Kworc3RhdGljIHZvaWQKK3Z0bmV0X3J4X2ZpbHRlcl92bGFuKHN0cnVjdCB2dG5ldF9zb2Z0YyAq c2MpCit7CisJc3RydWN0IGlmbmV0ICppZnA7CisJdWludDMyX3QgdzsKKwl1aW50MTZfdCB2bGFu OworCWludCBpLCBqLCBlcnJvcjsKKworCWlmcCA9IHNjLT52dG5ldF9pZnA7CisJZXJyb3IgPSAw OworCisJVlRORVRfTE9DS19BU1NFUlQoc2MpOworCUtBU1NFUlQoc2MtPnZ0bmV0X2ZsYWdzICYg VlRORVRfRkxBR19WTEFOX0ZJTFRFUiwKKwkgICAgKCJWTEFOX0ZJTFRFUiBub3QgbmVnb3RpYXRl ZCIpKTsKKworCWlmICgoaWZwLT5pZl9jYXBlbmFibGUgJiBJRkNBUF9WTEFOX0hXRklMVEVSKSA9 PSAwIHx8CisJICAgIHNjLT52dG5ldF9udmxhbnMgPD0gMCkKKwkJcmV0dXJuOworCisJZm9yIChp ID0gMDsgaSA8IFZUTkVUX1ZMQU5fVEFCTEVfU1o7IGkrKykgeworCQl3ID0gc2MtPnZ0bmV0X3Zs YW5fdGFibGVbaV07CisJCWZvciAoaiA9IDA7IHcgIT0gMDsgaisrKSB7CisJCQlpZiAodyAmICgx IDw8IGopKSB7CisJCQkJdyAmPSB+KDEgPDwgaik7CisJCQkJdmxhbiA9IGkgKiAzMiArIGo7CisJ CQkJZXJyb3IgfD0gdnRuZXRfZXhlY192bGFuX2ZpbHRlcihzYywgMSwgdmxhbik7CisJCQl9CisJ CX0KKwl9CisKKwlpZiAoZXJyb3IpCisJCWRldmljZV9wcmludGYoc2MtPnZ0bmV0X2RldiwKKwkJ ICAgICJjYW5ub3QgcmVzdG9yZSB0aGUgaG9zdCdzIFZMQU4gdGFibGVcbiIpOworfQorCitzdGF0 aWMgdm9pZAordnRuZXRfc2V0X3ZsYW5fZmlsdGVyKHN0cnVjdCB2dG5ldF9zb2Z0YyAqc2MsIGlu dCBhZGQsIHVpbnQxNl90IHRhZykKK3sKKwlzdHJ1Y3QgaWZuZXQgKmlmcDsKKwlpbnQgaWR4LCBi aXQ7CisJaW50IGVycm9yOworCisJaWZwID0gc2MtPnZ0bmV0X2lmcDsKKwllcnJvciA9IDA7CisK KwlpZiAoKHRhZyA9PSAwKSB8fCAodGFnID4gNDA5NSkpCisJCXJldHVybjsKKworCWlkeCA9ICh0 YWcgPj4gNSkgJiAweDdGOworCWJpdCA9IHRhZyAmIDB4MUY7CisKKwlWVE5FVF9MT0NLKHNjKTsK KwlLQVNTRVJUKHNjLT52dG5ldF9mbGFncyAmIFZUTkVUX0ZMQUdfVkxBTl9GSUxURVIsCisJICAg ICgiVkxBTl9GSUxURVIgbm90IG5lZ290aWF0ZWQiKSk7CisKKwkvKiBVcGRhdGUgc2hhZG93IFZM QU4gdGFibGUuICovCisJaWYgKGFkZCkgeworCQlzYy0+dnRuZXRfbnZsYW5zKys7CisJCXNjLT52 dG5ldF92bGFuX3RhYmxlW2lkeF0gfD0gKDEgPDwgYml0KTsKKwl9IGVsc2UgeworCQlzYy0+dnRu ZXRfbnZsYW5zLS07CisJCXNjLT52dG5ldF92bGFuX3RhYmxlW2lkeF0gJj0gfigxIDw8IGJpdCk7 CisJfQorCisJaWYgKGlmcC0+aWZfY2FwZW5hYmxlICYgSUZDQVBfVkxBTl9IV0ZJTFRFUikKKwkJ ZXJyb3IgPSB2dG5ldF9leGVjX3ZsYW5fZmlsdGVyKHNjLCBhZGQsIHRhZyk7CisKKwlWVE5FVF9V TkxPQ0soc2MpOworCisJaWYgKGVycm9yKQorCQlkZXZpY2VfcHJpbnRmKHNjLT52dG5ldF9kZXYs ICJ1bmFibGUgdG8gdXBkYXRlIGhvc3QgIgorCQkgICAgIlZMQU4gdGFibGVcbiIpOworfQorCitz dGF0aWMgdm9pZAordnRuZXRfcmVnaXN0ZXJfdmxhbih2b2lkICphcmcsIHN0cnVjdCBpZm5ldCAq aWZwLCB1aW50MTZfdCB0YWcpCit7CisKKwlpZiAoaWZwLT5pZl9zb2Z0YyAhPSBhcmcpCisJCXJl dHVybjsKKworCXZ0bmV0X3NldF92bGFuX2ZpbHRlcihhcmcsIDEsIHRhZyk7Cit9CisKK3N0YXRp YyB2b2lkCit2dG5ldF91bnJlZ2lzdGVyX3ZsYW4odm9pZCAqYXJnLCBzdHJ1Y3QgaWZuZXQgKmlm cCwgdWludDE2X3QgdGFnKQoreworCisJaWYgKGlmcC0+aWZfc29mdGMgIT0gYXJnKQorCQlyZXR1 cm47CisKKwl2dG5ldF9zZXRfdmxhbl9maWx0ZXIoYXJnLCAwLCB0YWcpOworfQorCitzdGF0aWMg dm9pZAordnRuZXRfYWRkX3N0YXRpc3RpY3Moc3RydWN0IHZ0bmV0X3NvZnRjICpzYykKK3sKKwlk ZXZpY2VfdCBkZXY7CisJc3RydWN0IHZ0bmV0X3N0YXRpc3RpY3MgKnN0YXRzOworICAgICAgICBz dHJ1Y3Qgc3lzY3RsX2N0eF9saXN0ICpjdHg7CisJc3RydWN0IHN5c2N0bF9vaWQgKnRyZWU7CisJ c3RydWN0IHN5c2N0bF9vaWRfbGlzdCAqY2hpbGQ7CisKKwlkZXYgPSBzYy0+dnRuZXRfZGV2Owor CXN0YXRzID0gJnNjLT52dG5ldF9zdGF0czsKKwljdHggPSBkZXZpY2VfZ2V0X3N5c2N0bF9jdHgo ZGV2KTsKKwl0cmVlID0gZGV2aWNlX2dldF9zeXNjdGxfdHJlZShkZXYpOworCWNoaWxkID0gU1lT Q1RMX0NISUxEUkVOKHRyZWUpOworCisJU1lTQ1RMX0FERF9VTE9ORyhjdHgsIGNoaWxkLCBPSURf QVVUTywgIm1idWZfYWxsb2NfZmFpbGVkIiwKKwkgICAgQ1RMRkxBR19SRCwgJnN0YXRzLT5tYnVm X2FsbG9jX2ZhaWxlZCwKKwkgICAgIk1idWYgY2x1c3RlciBhbGxvY2F0aW9uIGZhaWx1cmVzIik7 CisKKwlTWVNDVExfQUREX1VMT05HKGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAicnhfbWVyZ2VhYmxl X2ZhaWxlZCIsCisJICAgIENUTEZMQUdfUkQsICZzdGF0cy0+cnhfbWVyZ2VhYmxlX2ZhaWxlZCwK KwkgICAgIk1lcmdlYWJsZSBidWZmZXJzIHJlY2VpdmUgZmFpbHVyZXMiKTsKKwlTWVNDVExfQURE X1VMT05HKGN0eCwgY2hpbGQsIE9JRF9BVVRPLCAicnhfY3N1bV9vZmZsb2FkZWQiLAorCSAgICBD VExGTEFHX1JELCAmc3RhdHMtPnJ4X2NzdW1fb2ZmbG9hZGVkLAorCSAgICAiUmVjZWl2ZWQgYnVm ZmVyIHdpdGggY2hlY2tzdW0gb2ZmbG9hZGVkIik7CisJU1lTQ1RMX0FERF9VTE9ORyhjdHgsIGNo aWxkLCBPSURfQVVUTywgInJ4X2NzdW1fdW5rbm93bl9ldHlwZSIsCisJICAgIENUTEZMQUdfUkQs ICZzdGF0cy0+cnhfY3N1bV91bmtub3duX2V0eXBlLAorCSAgICAiUmVjZWl2ZWQgY2hlY2tzdW0g b2ZmbG9hZGVkIGJ1ZmZlciB3aXRoIHVua25vd24gRXRoZXJuZXQgdHlwZSIpOworCVNZU0NUTF9B RERfVUxPTkcoY3R4LCBjaGlsZCwgT0lEX0FVVE8sICJyeF9jc3VtX2JhZF9zdGFydCIsCisJICAg IENUTEZMQUdfUkQsICZzdGF0cy0+cnhfY3N1bV9iYWRfc3RhcnQsCisJICAgICJSZWNlaXZlZCBj aGVja3N1bSBvZmZsb2FkZWQgYnVmZmVyIHdpdGggaW5jb3JyZWN0IHN0YXJ0IG9mZnNldCIpOwor CVNZU0NUTF9BRERfVUxPTkcoY3R4LCBjaGlsZCwgT0lEX0FVVE8sICJyeF9jc3VtX3Vua25vd25f aXBwcm90byIsCisJICAgIENUTEZMQUdfUkQsICZzdGF0cy0+cnhfY3N1bV91bmtub3duX2lwcHJv dG8sCisJICAgICJSZWNlaXZlZCBjaGVja3N1bSBvZmZsb2FkZWQgYnVmZmVyIHdpdGggaW5jb3Jy ZWN0IElQIHByb3RvY29sIik7CisJU1lTQ1RMX0FERF9VTE9ORyhjdHgsIGNoaWxkLCBPSURfQVVU TywgInJ4X2NzdW1fYmFkX29mZnNldCIsCisJICAgIENUTEZMQUdfUkQsICZzdGF0cy0+cnhfY3N1 bV9iYWRfb2Zmc2V0LAorCSAgICAiUmVjZWl2ZWQgY2hlY2tzdW0gb2ZmbG9hZGVkIGJ1ZmZlciB3 aXRoIGluY29ycmVjdCBvZmZzZXQiKTsKKworCVNZU0NUTF9BRERfVUxPTkcoY3R4LCBjaGlsZCwg T0lEX0FVVE8sICJ0eF9lbnF1ZXVlX2ZhaWxlZCIsCisJICAgIENUTEZMQUdfUkQsICZzdGF0cy0+ dHhfZW5xdWV1ZV9mYWlsZWQsCisJICAgICJFbnF1ZXVlaW5nIGJ1ZmZlciB0byB0cmFuc21pdCB2 aXJ0cXVldWUgZmFpbHVyZXMiKTsKKwlTWVNDVExfQUREX1VMT05HKGN0eCwgY2hpbGQsIE9JRF9B VVRPLCAidHhfY3N1bV9vZmZsb2FkZWQiLAorCSAgICBDVExGTEFHX1JELCAmc3RhdHMtPnR4X2Nz dW1fb2ZmbG9hZGVkLAorCSAgICAiT2ZmbG9hZGVkIGNoZWNrc3VtIG9mIHRyYW5zbWl0dGVkIGJ1 ZmZlciIpOworCVNZU0NUTF9BRERfVUxPTkcoY3R4LCBjaGlsZCwgT0lEX0FVVE8sICJ0eF9jc3Vt X3Vua25vd25fZXR5cGUiLAorCSAgICBDVExGTEFHX1JELCAmc3RhdHMtPnR4X2NzdW1fdW5rbm93 bl9ldHlwZSwKKwkgICAgIkFib3J0ZWQgdHJhbnNtaXQgb2YgY2hlY2tzdW0gb2ZmbG9hZGVkIGJ1 ZmZlciB3aXRoIHVua25vd24gIgorCSAgICAiRXRoZXJuZXQgdHlwZSIpOworCVNZU0NUTF9BRERf VUxPTkcoY3R4LCBjaGlsZCwgT0lEX0FVVE8sICJ0eF90c29fdW5rbm93bl9ldHlwZSIsCisJICAg IENUTEZMQUdfUkQsICZzdGF0cy0+dHhfdHNvX3Vua25vd25fZXR5cGUsCisJICAgICJBYm9ydGVk IHRyYW5zbWl0IG9mIFRTTyBidWZmZXIgd2l0aCB1bmtub3duIEV0aGVybmV0IHR5cGUiKTsKK30K Kworc3RhdGljIGludAordnRuZXRfZW5hYmxlX3J4X2ludHIoc3RydWN0IHZ0bmV0X3NvZnRjICpz YykKK3sKKworCXJldHVybiAodmlydHF1ZXVlX2VuYWJsZV9pbnRyKHNjLT52dG5ldF9yeF92cSkp OworfQorCitzdGF0aWMgdm9pZAordnRuZXRfZGlzYWJsZV9yeF9pbnRyKHN0cnVjdCB2dG5ldF9z b2Z0YyAqc2MpCit7CisKKwl2aXJ0cXVldWVfZGlzYWJsZV9pbnRyKHNjLT52dG5ldF9yeF92cSk7 Cit9CisKK3N0YXRpYyBpbnQKK3Z0bmV0X2VuYWJsZV90eF9pbnRyKHN0cnVjdCB2dG5ldF9zb2Z0 YyAqc2MpCit7CisKKwlyZXR1cm4gKHZpcnRxdWV1ZV9lbmFibGVfaW50cihzYy0+dnRuZXRfdHhf dnEpKTsKK30KKworc3RhdGljIHZvaWQKK3Z0bmV0X2Rpc2FibGVfdHhfaW50cihzdHJ1Y3QgdnRu ZXRfc29mdGMgKnNjKQoreworCisJdmlydHF1ZXVlX2Rpc2FibGVfaW50cihzYy0+dnRuZXRfdHhf dnEpOworfQorCitzdGF0aWMgdm9pZAordnRuZXRfZGlzYWJsZV9jdHJsX2ludHIoc3RydWN0IHZ0 bmV0X3NvZnRjICpzYykKK3sKKworCXZpcnRxdWV1ZV9kaXNhYmxlX2ludHIoc2MtPnZ0bmV0X2N0 cmxfdnEpOworfQpkaWZmIC0tZ2l0IGEvc3lzL2Rldi92aXJ0aW8vbmV0d29yay92aXJ0aW9fbmV0 X3JlZy5oIGIvc3lzL2Rldi92aXJ0aW8vbmV0d29yay92aXJ0aW9fbmV0X3JlZy5oCm5ldyBmaWxl IG1vZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi92aXJ0aW8vbmV0d29yay92 aXJ0aW9fbmV0X3JlZy5oCkBAIC0wLDAgKzEsMTM2IEBACisjaWZuZGVmIF9WSVJUSU9fTkVUX1JF R19ICisjZGVmaW5lIF9WSVJUSU9fTkVUX1JFR19ICisKKy8qCisgKiBUaGlzIGhlYWRlciBpcyBC U0QgbGljZW5zZWQgc28gYW55b25lIGNhbiB1c2UgdGhlIGRlZmluaXRpb25zIHRvIGltcGxlbWVu dAorICogY29tcGF0aWJsZSBkcml2ZXJzL3NlcnZlcnMuCisgKi8KKworI2luY2x1ZGUgPHN5cy90 eXBlcy5oPgorCisvKiBUaGUgZmVhdHVyZSBiaXRtYXAgZm9yIHZpcnRpbyBuZXQgKi8KKyNkZWZp bmUgVklSVElPX05FVF9GX0NTVU0JMHgwMDAwMSAvKiBIb3N0IGhhbmRsZXMgcGt0cyB3LyBwYXJ0 aWFsIGNzdW0gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX0NTVU0gMHgwMDAwMiAvKiBH dWVzdCBoYW5kbGVzIHBrdHMgdy8gcGFydGlhbCBjc3VtKi8KKyNkZWZpbmUgVklSVElPX05FVF9G X01BQwkweDAwMDIwIC8qIEhvc3QgaGFzIGdpdmVuIE1BQyBhZGRyZXNzLiAqLworI2RlZmluZSBW SVJUSU9fTkVUX0ZfR1NPCTB4MDAwNDAgLyogSG9zdCBoYW5kbGVzIHBrdHMgdy8gYW55IEdTTyB0 eXBlICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9HVUVTVF9UU080CTB4MDAwODAgLyogR3Vlc3Qg Y2FuIGhhbmRsZSBUU092NCBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0dVRVNUX1RTTzYJ MHgwMDEwMCAvKiBHdWVzdCBjYW4gaGFuZGxlIFRTT3Y2IGluLiAqLworI2RlZmluZSBWSVJUSU9f TkVUX0ZfR1VFU1RfRUNOCTB4MDAyMDAgLyogR3Vlc3QgY2FuIGhhbmRsZSBUU09bNl0gdy8gRUNO IGluLiovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9HVUVTVF9VRk8JMHgwMDQwMCAvKiBHdWVzdCBj YW4gaGFuZGxlIFVGTyBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0hPU1RfVFNPNAkweDAw ODAwIC8qIEhvc3QgY2FuIGhhbmRsZSBUU092NCBpbi4gKi8KKyNkZWZpbmUgVklSVElPX05FVF9G X0hPU1RfVFNPNgkweDAxMDAwIC8qIEhvc3QgY2FuIGhhbmRsZSBUU092NiBpbi4gKi8KKyNkZWZp bmUgVklSVElPX05FVF9GX0hPU1RfRUNOCTB4MDIwMDAgLyogSG9zdCBjYW4gaGFuZGxlIFRTT1s2 XSB3LyBFQ04gaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9IT1NUX1VGTwkweDA0MDAwIC8q IEhvc3QgY2FuIGhhbmRsZSBVRk8gaW4uICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9NUkdfUlhC VUYJMHgwODAwMCAvKiBIb3N0IGNhbiBtZXJnZSByZWNlaXZlIGJ1ZmZlcnMuICovCisjZGVmaW5l IFZJUlRJT19ORVRfRl9TVEFUVVMJMHgxMDAwMCAvKiB2aXJ0aW9fbmV0X2NvbmZpZy5zdGF0dXMg YXZhaWxhYmxlKi8KKyNkZWZpbmUgVklSVElPX05FVF9GX0NUUkxfVlEJMHgyMDAwMCAvKiBDb250 cm9sIGNoYW5uZWwgYXZhaWxhYmxlICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9DVFJMX1JYCTB4 NDAwMDAgLyogQ29udHJvbCBjaGFubmVsIFJYIG1vZGUgc3VwcG9ydCAqLworI2RlZmluZSBWSVJU SU9fTkVUX0ZfQ1RSTF9WTEFOCTB4ODAwMDAgLyogQ29udHJvbCBjaGFubmVsIFZMQU4gZmlsdGVy aW5nICovCisjZGVmaW5lIFZJUlRJT19ORVRfRl9DVFJMX1JYX0VYVFJBIDB4MTAwMDAwIC8qIEV4 dHJhIFJYIG1vZGUgY29udHJvbCBzdXBwb3J0ICovCisKKyNkZWZpbmUgVklSVElPX05FVF9TX0xJ TktfVVAJMQkvKiBMaW5rIGlzIHVwICovCisKK3N0cnVjdCB2aXJ0aW9fbmV0X2NvbmZpZyB7CisJ LyogVGhlIGNvbmZpZyBkZWZpbmluZyBtYWMgYWRkcmVzcyAoaWYgVklSVElPX05FVF9GX01BQykg Ki8KKwl1aW50OF90CQltYWNbRVRIRVJfQUREUl9MRU5dOyAKKwkvKiBTZWUgVklSVElPX05FVF9G X1NUQVRVUyBhbmQgVklSVElPX05FVF9TXyogYWJvdmUgKi8KKwl1aW50MTZfdAlzdGF0dXM7Cit9 IF9fcGFja2VkOworCisvKgorICogVGhpcyBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgc2Nh dHRlci1nYXRoZXIgbGlzdC4gIElmIHlvdSBkb24ndAorICogc3BlY2lmeSBHU08gb3IgQ1NVTSBm ZWF0dXJlcywgeW91IGNhbiBzaW1wbHkgaWdub3JlIHRoZSBoZWFkZXIuCisgKi8KK3N0cnVjdCB2 aXJ0aW9fbmV0X2hkciB7CisjZGVmaW5lIFZJUlRJT19ORVRfSERSX0ZfTkVFRFNfQ1NVTQkxCS8q IFVzZSBjc3VtX3N0YXJ0LGNzdW1fb2Zmc2V0Ki8KKwl1aW50OF90CWZsYWdzOworI2RlZmluZSBW SVJUSU9fTkVUX0hEUl9HU09fTk9ORQkJMAkvKiBOb3QgYSBHU08gZnJhbWUgKi8KKyNkZWZpbmUg VklSVElPX05FVF9IRFJfR1NPX1RDUFY0CTEJLyogR1NPIGZyYW1lLCBJUHY0IFRDUCAoVFNPKSAq LworI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fVURQCQkzCS8qIEdTTyBmcmFtZSwgSVB2NCBV RFAgKFVGTykgKi8KKyNkZWZpbmUgVklSVElPX05FVF9IRFJfR1NPX1RDUFY2CTQJLyogR1NPIGZy YW1lLCBJUHY2IFRDUCAqLworI2RlZmluZSBWSVJUSU9fTkVUX0hEUl9HU09fRUNOCQkweDgwCS8q IFRDUCBoYXMgRUNOIHNldCAqLworCXVpbnQ4X3QgZ3NvX3R5cGU7CisJdWludDE2X3QgaGRyX2xl bjsJLyogRXRoZXJuZXQgKyBJUCArIHRjcC91ZHAgaGRycyAqLworCXVpbnQxNl90IGdzb19zaXpl OwkvKiBCeXRlcyB0byBhcHBlbmQgdG8gaGRyX2xlbiBwZXIgZnJhbWUgKi8KKwl1aW50MTZfdCBj c3VtX3N0YXJ0OwkvKiBQb3NpdGlvbiB0byBzdGFydCBjaGVja3N1bW1pbmcgZnJvbSAqLworCXVp bnQxNl90IGNzdW1fb2Zmc2V0OwkvKiBPZmZzZXQgYWZ0ZXIgdGhhdCB0byBwbGFjZSBjaGVja3N1 bSAqLworfTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIHZlcnNpb24gb2YgdGhlIGhlYWRlciB0byB1 c2Ugd2hlbiB0aGUgTVJHX1JYQlVGCisgKiBmZWF0dXJlIGhhcyBiZWVuIG5lZ290aWF0ZWQuCisg Ki8KK3N0cnVjdCB2aXJ0aW9fbmV0X2hkcl9tcmdfcnhidWYgeworCXN0cnVjdCB2aXJ0aW9fbmV0 X2hkciBoZHI7CisJdWludDE2X3QgbnVtX2J1ZmZlcnM7CS8qIE51bWJlciBvZiBtZXJnZWQgcngg YnVmZmVycyAqLworfTsKKworLyoKKyAqIENvbnRyb2wgdmlydHF1ZXVlIGRhdGEgc3RydWN0dXJl cworICoKKyAqIFRoZSBjb250cm9sIHZpcnRxdWV1ZSBleHBlY3RzIGEgaGVhZGVyIGluIHRoZSBm aXJzdCBzZyBlbnRyeQorICogYW5kIGFuIGFjay9zdGF0dXMgcmVzcG9uc2UgaW4gdGhlIGxhc3Qg ZW50cnkuICBEYXRhIGZvciB0aGUKKyAqIGNvbW1hbmQgZ29lcyBpbiBiZXR3ZWVuLgorICovCitz dHJ1Y3QgdmlydGlvX25ldF9jdHJsX2hkciB7CisJdWludDhfdCBjbGFzczsKKwl1aW50OF90IGNt ZDsKK30gX19wYWNrZWQ7CisKK3R5cGVkZWYgdWludDhfdCB2aXJ0aW9fbmV0X2N0cmxfYWNrOwor CisjZGVmaW5lIFZJUlRJT19ORVRfT0sJMAorI2RlZmluZSBWSVJUSU9fTkVUX0VSUgkxCisKKy8q CisgKiBDb250cm9sIHRoZSBSWCBtb2RlLCBpZS4gcHJvbWlzY3VvdXMsIGFsbG11bHRpLCBldGMu Li4KKyAqIEFsbCBjb21tYW5kcyByZXF1aXJlIGFuICJvdXQiIHNnIGVudHJ5IGNvbnRhaW5pbmcg YSAxIGJ5dGUKKyAqIHN0YXRlIHZhbHVlLCB6ZXJvID0gZGlzYWJsZSwgbm9uLXplcm8gPSBlbmFi bGUuICBDb21tYW5kcworICogMCBhbmQgMSBhcmUgc3VwcG9ydGVkIHdpdGggdGhlIFZJUlRJT19O RVRfRl9DVFJMX1JYIGZlYXR1cmUuCisgKiBDb21tYW5kcyAyLTUgYXJlIGFkZGVkIHdpdGggVklS VElPX05FVF9GX0NUUkxfUlhfRVhUUkEuCisgKi8KKyNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JY CTAKKyNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JYX1BST01JU0MJMAorI2RlZmluZSBWSVJUSU9f TkVUX0NUUkxfUlhfQUxMTVVMVEkJMQorI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlhfQUxMVU5J CTIKKyNkZWZpbmUgVklSVElPX05FVF9DVFJMX1JYX05PTVVMVEkJMworI2RlZmluZSBWSVJUSU9f TkVUX0NUUkxfUlhfTk9VTkkJNAorI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfUlhfTk9CQ0FTVAk1 CisKKy8qCisgKiBDb250cm9sIHRoZSBNQUMgZmlsdGVyIHRhYmxlLgorICoKKyAqIFRoZSBNQUMg ZmlsdGVyIHRhYmxlIGlzIG1hbmFnZWQgYnkgdGhlIGh5cGVydmlzb3IsIHRoZSBndWVzdCBzaG91 bGQKKyAqIGFzc3VtZSB0aGUgc2l6ZSBpcyBpbmZpbml0ZS4gIEZpbHRlcmluZyBzaG91bGQgYmUg Y29uc2lkZXJlZAorICogbm9uLXBlcmZlY3QsIGllLiBiYXNlZCBvbiBoeXBlcnZpc29yIHJlc291 cmNlcywgdGhlIGd1ZXN0IG1heQorICogcmVjZWl2ZWQgcGFja2V0cyBmcm9tIHNvdXJjZXMgbm90 IHNwZWNpZmllZCBpbiB0aGUgZmlsdGVyIGxpc3QuCisgKgorICogSW4gYWRkaXRpb24gdG8gdGhl IGNsYXNzL2NtZCBoZWFkZXIsIHRoZSBUQUJMRV9TRVQgY29tbWFuZCByZXF1aXJlcworICogdHdv IG91dCBzY2F0dGVybGlzdHMuICBFYWNoIGNvbnRhaW5zIGEgNCBieXRlIGNvdW50IG9mIGVudHJp ZXMgZm9sbG93ZWQKKyAqIGJ5IGEgY29uY2F0ZW5hdGVkIGJ5dGUgc3RyZWFtIG9mIHRoZSBFVEhf QUxFTiBNQUMgYWRkcmVzc2VzLiAgVGhlCisgKiBmaXJzdCBzZyBsaXN0IGNvbnRhaW5zIHVuaWNh c3QgYWRkcmVzc2VzLCB0aGUgc2Vjb25kIGlzIGZvciBtdWx0aWNhc3QuCisgKiBUaGlzIGZ1bmN0 aW9uYWxpdHkgaXMgcHJlc2VudCBpZiB0aGUgVklSVElPX05FVF9GX0NUUkxfUlggZmVhdHVyZQor ICogaXMgYXZhaWxhYmxlLgorICovCitzdHJ1Y3QgdmlydGlvX25ldF9jdHJsX21hYyB7CisJdWlu dDMyX3QJZW50cmllczsKKwl1aW50OF90CQltYWNzW11bRVRIRVJfQUREUl9MRU5dOworfSBfX3Bh Y2tlZDsKKworI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxfTUFDCTEKKyNkZWZpbmUgVklSVElPX05F VF9DVFJMX01BQ19UQUJMRV9TRVQJMAorCisvKgorICogQ29udHJvbCBWTEFOIGZpbHRlcmluZwor ICoKKyAqIFRoZSBWTEFOIGZpbHRlciB0YWJsZSBpcyBjb250cm9sbGVkIHZpYSBhIHNpbXBsZSBB REQvREVMIGludGVyZmFjZS4KKyAqIFZMQU4gSURzIG5vdCBhZGRlZCBtYXkgYmUgZmlsdGVyZWQg YnkgdGhlIGh5cGVydmlzb3IuICBEZWwgaXMgdGhlCisgKiBvcHBvc2l0ZSBvZiBhZGQuICBCb3Ro IGNvbW1hbmRzIGV4cGVjdCBhbiBvdXQgZW50cnkgY29udGFpbmluZyBhIDIKKyAqIGJ5dGUgVkxB TiBJRC4gIFZMQU4gZmlsdGVyaW5nIGlzIGF2YWlsYWJsZSB3aXRoIHRoZQorICogVklSVElPX05F VF9GX0NUUkxfVkxBTiBmZWF0dXJlIGJpdC4KKyAqLworI2RlZmluZSBWSVJUSU9fTkVUX0NUUkxf VkxBTgkyCisjZGVmaW5lIFZJUlRJT19ORVRfQ1RSTF9WTEFOX0FERAkwCisjZGVmaW5lIFZJUlRJ T19ORVRfQ1RSTF9WTEFOX0RFTAkxCisKKyNlbmRpZiAvKiBfVklSVElPX05FVF9SRUdfSCAqLwpk aWZmIC0tZ2l0IGEvc3lzL2Rldi92aXJ0aW8vcGNpL3ZpcnRpb19wY2kuYyBiL3N5cy9kZXYvdmly dGlvL3BjaS92aXJ0aW9fcGNpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVsbAor KysgYi9zeXMvZGV2L3ZpcnRpby9wY2kvdmlydGlvX3BjaS5jCkBAIC0wLDAgKzEsOTc2IEBACisv KiBEcml2ZXIgZm9yIHRoZSBWaXJ0SU8gUENJIGludGVyZmFjZS4gKi8KKworI2luY2x1ZGUgPHN5 cy9jZGVmcy5oPgorCisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N5c3Rt Lmg+CisjaW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNpbmNs dWRlIDxzeXMvbW9kdWxlLmg+CisjaW5jbHVkZSA8c3lzL21hbGxvYy5oPgorCisjaW5jbHVkZSA8 bWFjaGluZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8 c3lzL2J1cy5oPgorI2luY2x1ZGUgPHN5cy9ybWFuLmg+CisKKyNpbmNsdWRlIDxkZXYvcGNpL3Bj aXZhci5oPgorI2luY2x1ZGUgPGRldi9wY2kvcGNpcmVnLmg+CisKKyNpbmNsdWRlIDxkZXYvdmly dGlvL3ZpcnRpby5oPgorI2luY2x1ZGUgPGRldi92aXJ0aW8vdmlydHF1ZXVlLmg+CisjaW5jbHVk ZSA8ZGV2L3ZpcnRpby9wY2kvdmlydGlvX3BjaV9yZWcuaD4KKworI2luY2x1ZGUgInZpcnRpb19i dXNfaWYuaCIKKyNpbmNsdWRlICJ2aXJ0aW9faWYuaCIKKworLyoKKyAqIE1heGltdW0gbnVtYmVy IG9mIHZpcnRxdWV1ZXMgcGVyIGRldmljZS4KKyAqLworI2RlZmluZSBWSVJUSU9fUENJX01BWF9W SVJUUVVFVUVTIDgKKworc3RydWN0IHZpcnRpb19wY2lfc29mdGMgeworCWRldmljZV90CQkgdnRw Y2lfZGV2OworCXN0cnVjdCByZXNvdXJjZQkJKnZ0cGNpX2lvcG9ydDsKKwlzdHJ1Y3QgcmVzb3Vy Y2UJCSp2dHBjaV9tc2l4X3RibDsKKwl1aW50MzJfdAkgCSB2dHBjaV9mZWF0dXJlczsKKwl1aW50 MzJfdAkgCSB2dHBjaV9mbGFnczsKKyNkZWZpbmUgVklSVElPX1BDSV9GTEFHX05PX01TSVgJCTB4 MDAwMQorI2RlZmluZSBWSVJUSU9fUENJX0ZMQUdfTVNJWAkJMHgwMDAyCisjZGVmaW5lIFZJUlRJ T19QQ0lfRkxBR19TSEFSRURfTVNJWAkweDAwMDQKKworCS8qIE91ciBsb25lIGNoaWxkIGRldmlj ZS4gKi8KKwlkZXZpY2VfdAkJIHZ0cGNpX2NoaWxkX2RldjsKKwlzdHJ1Y3QgdmlydGlvX2l2YXJz CSB2dHBjaV9jaGlsZF9pdmFyczsKKworCS8qCisJICogSWYgc3VmZmljaWVudCBNU0lYIHZlY3Rv cnMgYXJlIGF2YWlsYWJsZSwgdGhlbiBlYWNoCisJICogdmlydHF1ZXVlIHdpdGggYSBub24tTlVM TCBpbnRlcnJ1cHQgY2FsbGJhY2sgd2lsbAorCSAqIGhhdmUgaXRzIG93biBpbnRlcnJ1cHQgaGFu ZGxlciBhc3NpZ25lZC4gSWYgdGhlcmUKKwkgKiBhcmUgaW5zdWZmaWNpZW50IHZlY3RvcnMgYXZh aWxhYmxlIGZvciB0aGF0LCBidXQgYXQKKwkgKiBsZWFzdCB0d28gYXJlIGF2YWlsYWJsZSwgdGhl biBhbGwgdGhlIHZpcnRxdWV1ZXMKKwkgKiB3aWxsIHNoYXJlIHRoZSBzYW1lIE1TSVggdmVjdG9y LiBOb3RlIHRoYXQgZm9yIE1TSVgsCisJICogdGhlIGNvbmZpZ3VyYXRpb24gY2hhbmdlZCBub3Rp ZmljYXRpb25zIHJlY2VpdmUgdGhlaXIKKwkgKiBvd24gTVNJWCB2ZWN0b3IuIElmIHRoZXJlIGFy ZSBpbnN1ZmZpY2llbnQgdmVjdG9ycworCSAqIGF2YWlsYWJsZSBmb3IgdGhlIHNoYXJlZCBzZXR1 cCwgdGhlbiBldmVyeXRoaW5nIHVzZXMKKwkgKiBvbmUgbGVnYWN5IGludGVycnVwdC4KKwkgKi8K KwlpbnQJCQkgdnRwY2lfbnZxczsKKwlzdHJ1Y3QgdmlydGlvX3BjaV92cXggeworCQlzdHJ1Y3Qg dmlydHF1ZXVlICp2cTsKKwkJLyogSW5kZXggaW50byB2dHBjaV9pcmVzW10gYmVsb3cuIFVudXNl ZCwgdGhlbiAtMS4gKi8KKwkJaW50CQkgaXJlc19pZHg7CisJfSB2dHBjaV92cXhbVklSVElPX1BD SV9NQVhfVklSVFFVRVVFU107CisKKwkvKgorCSAqIFdoZW4gdXNpbmcgbGVnYWN5IGludGVycnVw dHMsIG9ubHkgdGhlIGZpcnN0IGVsZW1lbnQgb2YKKwkgKiB2dHBjaV9pcmVzIGlzIHVzZWQuCisJ ICoKKwkgKiBXaGVuIHVzaW5nIE1TSVggaW50ZXJydXB0cywgdGhlIGZpcnN0IGVsZW1lbnQgb2Yg dnRwY2lfaXJlcworCSAqIGlzIHVzZWQgZm9yIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZWQgaW50 ZXJydXB0OyB0aGUgcmVtYWluaW5nCisJICogZWxlbWVudHMgYXJlIHVzZWQgZm9yIHRoZSB2aXJ0 cXVldWVzLgorCSAqLworCWludAkJCSB2dHBjaV9uaXJlczsKKwlzdHJ1Y3QgdmlydGlvX3BjaV9p bnRyX3JlcyB7CisJCXN0cnVjdCByZXNvdXJjZQkqaXJxOworCQlpbnQJCSByaWQ7CisJCXZvaWQJ CSppbnRyaGFuZDsKKwl9IHZ0cGNpX2lyZXNbMSArIFZJUlRJT19QQ0lfTUFYX1ZJUlRRVUVVRVNd OworfTsKKworc3RhdGljIGludAl2aXJ0aW9fcGNpX3Byb2JlKGRldmljZV90KTsKK3N0YXRpYyBp bnQJdmlydGlvX3BjaV9hdHRhY2goZGV2aWNlX3QpOworc3RhdGljIGludAl2aXJ0aW9fcGNpX2Rl dGFjaChkZXZpY2VfdCk7CitzdGF0aWMgaW50CXZpcnRpb19wY2lfc3VzcGVuZChkZXZpY2VfdCk7 CitzdGF0aWMgaW50CXZpcnRpb19wY2lfcmVzdW1lKGRldmljZV90KTsKK3N0YXRpYyBpbnQJdmly dGlvX3BjaV9zaHV0ZG93bihkZXZpY2VfdCk7CitzdGF0aWMgdm9pZAl2aXJ0aW9fcGNpX2RyaXZl cl9hZGRlZChkZXZpY2VfdCwgZHJpdmVyX3QgKik7CitzdGF0aWMgdm9pZAl2aXJ0aW9fcGNpX2No aWxkX2RldGFjaGVkKGRldmljZV90LCBkZXZpY2VfdCk7CisKK3N0YXRpYyB1aW50MzJfdAl2aXJ0 aW9fcGNpX25lZ290aWF0ZV9mZWF0dXJlcyhkZXZpY2VfdCwgdWludDMyX3QpOworc3RhdGljIGlu dAl2aXJ0aW9fcGNpX3dpdGhfZmVhdHVyZShkZXZpY2VfdCwgdWludDMyX3QpOworc3RhdGljIGlu dAl2aXJ0aW9fcGNpX2FsbG9jX3ZxcyhkZXZpY2VfdCwgaW50LCBpbnQsCisJCSAgICBzdHJ1Y3Qg dnFfYWxsb2NfaW5mbyAqKTsKK3N0YXRpYyBpbnQJdmlydGlvX3BjaV9zZXR1cF9pbnRyKGRldmlj ZV90LCBlbnVtIGludHJfdHlwZSk7CitzdGF0aWMgdm9pZAl2aXJ0aW9fcGNpX3N0b3AoZGV2aWNl X3QpOworc3RhdGljIGludAl2aXJ0aW9fcGNpX3JlaW5pdChkZXZpY2VfdCwgdWludDMyX3QpOwor c3RhdGljIHZvaWQJdmlydGlvX3BjaV9yZWluaXRfY29tcGxldGUoZGV2aWNlX3QpOworc3RhdGlj IHZvaWQJdmlydGlvX3BjaV9ub3RpZnlfdnEoZGV2aWNlX3QsIHVpbnQxNl90KTsKK3N0YXRpYyB1 aW50OF90CXZpcnRpb19wY2lfZ2V0X3N0YXR1cyhkZXZpY2VfdCk7CitzdGF0aWMgdm9pZAl2aXJ0 aW9fcGNpX3NldF9zdGF0dXMoZGV2aWNlX3QsIHVpbnQ4X3QpOworc3RhdGljIHZvaWQJdmlydGlv X3BjaV9yZWFkX2Rldl9jb25maWcoZGV2aWNlX3QsIGJ1c19zaXplX3QsCisJCSAgICB2b2lkICos IGludCk7CitzdGF0aWMgdm9pZAl2aXJ0aW9fcGNpX3dyaXRlX2Rldl9jb25maWcoZGV2aWNlX3Qs IGJ1c19zaXplX3QsCisJCSAgICB2b2lkICosIGludCk7CisKK3N0YXRpYyB2b2lkCXZpcnRpb19w Y2lfcHJvYmVfYW5kX2F0dGFjaF9jaGlsZChzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqKTsKKwor c3RhdGljIGludAl2aXJ0aW9fcGNpX2FsbG9jX2ludHIoc3RydWN0IHZpcnRpb19wY2lfc29mdGMg KiwgaW50LCBpbnQsCisJCSAgICBzdHJ1Y3QgdnFfYWxsb2NfaW5mbyAqKTsKK3N0YXRpYyBpbnQJ dmlydGlvX3BjaV9hbGxvY19pbnRyX3JlcyhzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqLCBpbnQs CisJCSAgICBzdHJ1Y3QgdnFfYWxsb2NfaW5mbyAqKTsKK3N0YXRpYyBpbnQJdmlydGlvX3BjaV9h bGxvY19tc2l4KHN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRjICosIGludCk7CitzdGF0aWMgaW50IAl2 aXJ0aW9fcGNpX3JlZ2lzdGVyX21zaXgoc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKiwgaW50LCBp bnQpOworCitzdGF0aWMgdm9pZAl2aXJ0aW9fcGNpX2ZyZWVfaW50cl9yZXMoc3RydWN0IHZpcnRp b19wY2lfc29mdGMgKik7CitzdGF0aWMgdm9pZAl2aXJ0aW9fcGNpX2ZyZWVfdnFzKHN0cnVjdCB2 aXJ0aW9fcGNpX3NvZnRjICopOworc3RhdGljIHZvaWQJdmlydGlvX3BjaV9yZWxlYXNlX2NoaWxk X3JlcyhzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqKTsKK3N0YXRpYyB2b2lkCXZpcnRpb19wY2lf cmVzZXQoc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKik7CisKK3N0YXRpYyBpbnQJdmlydGlvX3Bj aV9sZWdhY3lfaW50cih2b2lkICopOworc3RhdGljIGludAl2aXJ0aW9fcGNpX3ZxX3NoYXJlZF9p bnRyKHZvaWQgKik7CitzdGF0aWMgaW50CXZpcnRpb19wY2lfdnFfaW50cih2b2lkICopOworc3Rh dGljIGludAl2aXJ0aW9fcGNpX2NvbmZpZ19pbnRyKHZvaWQgKik7CisKKy8qCisgKiBJL08gcG9y dCByZWFkL3dyaXRlIHdyYXBwZXJzLgorICovCisjZGVmaW5lIHZpcnRpb19wY2lfcmVhZF9jb25m aWdfMShzYywgbykgXAorICAgIGJ1c19yZWFkXzEoKHNjKS0+dnRwY2lfaW9wb3J0LCAobykpCisj ZGVmaW5lIHZpcnRpb19wY2lfcmVhZF9jb25maWdfMihzYywgbykgXAorICAgIGJ1c19yZWFkXzIo KHNjKS0+dnRwY2lfaW9wb3J0LCAobykpCisjZGVmaW5lIHZpcnRpb19wY2lfcmVhZF9jb25maWdf NChzYywgbykgXAorICAgIGJ1c19yZWFkXzQoKHNjKS0+dnRwY2lfaW9wb3J0LCAobykpCisjZGVm aW5lIHZpcnRpb19wY2lfd3JpdGVfY29uZmlnXzEoc2MsIG8sIHYpIFwKKyAgICBidXNfd3JpdGVf MSgoc2MpLT52dHBjaV9pb3BvcnQsIChvKSwgKHYpKQorI2RlZmluZSB2aXJ0aW9fcGNpX3dyaXRl X2NvbmZpZ18yKHNjLCBvLCB2KSBcCisgICAgYnVzX3dyaXRlXzIoKHNjKS0+dnRwY2lfaW9wb3J0 LCAobyksICh2KSkKKyNkZWZpbmUgdmlydGlvX3BjaV93cml0ZV9jb25maWdfNChzYywgbywgdikg XAorICAgIGJ1c193cml0ZV80KChzYyktPnZ0cGNpX2lvcG9ydCwgKG8pLCAodikpCisKKy8qIFR1 bmFibGVzLiAqLworc3RhdGljIGludCB2aXJ0aW9fcGNpX2Rpc2FibGVfbXNpeCA9IDA7CitUVU5B QkxFX0lOVCgiaHcudmlydGlvLnBjaS5kaXNhYmxlX21zaXgiLCAmdmlydGlvX3BjaV9kaXNhYmxl X21zaXgpOworCitzdGF0aWMgZGV2aWNlX21ldGhvZF90IHZpcnRpb19wY2lfbWV0aG9kc1tdID0g eworCS8qIERldmljZSBpbnRlcmZhY2UuICovCisJREVWTUVUSE9EKGRldmljZV9wcm9iZSwJCXZp cnRpb19wY2lfcHJvYmUpLAorCURFVk1FVEhPRChkZXZpY2VfYXR0YWNoLAl2aXJ0aW9fcGNpX2F0 dGFjaCksCisJREVWTUVUSE9EKGRldmljZV9kZXRhY2gsCXZpcnRpb19wY2lfZGV0YWNoKSwKKwlE RVZNRVRIT0QoZGV2aWNlX3N1c3BlbmQsCXZpcnRpb19wY2lfc3VzcGVuZCksCisJREVWTUVUSE9E KGRldmljZV9yZXN1bWUsCXZpcnRpb19wY2lfcmVzdW1lKSwKKwlERVZNRVRIT0QoZGV2aWNlX3No dXRkb3duLAl2aXJ0aW9fcGNpX3NodXRkb3duKSwKKworCS8qIEJ1cyBpbnRlcmZhY2UuICovCisJ REVWTUVUSE9EKGJ1c19kcml2ZXJfYWRkZWQsCXZpcnRpb19wY2lfZHJpdmVyX2FkZGVkKSwKKwlE RVZNRVRIT0QoYnVzX2NoaWxkX2RldGFjaGVkLAl2aXJ0aW9fcGNpX2NoaWxkX2RldGFjaGVkKSwK KworCS8qIFZpcnRJTyBidXMgaW50ZXJmYWNlLiAqLworCURFVk1FVEhPRCh2aXJ0aW9fYnVzX25l Z290aWF0ZV9mZWF0dXJlcywgdmlydGlvX3BjaV9uZWdvdGlhdGVfZmVhdHVyZXMpLAorCURFVk1F VEhPRCh2aXJ0aW9fYnVzX3dpdGhfZmVhdHVyZSwJIHZpcnRpb19wY2lfd2l0aF9mZWF0dXJlKSwK KwlERVZNRVRIT0QodmlydGlvX2J1c19hbGxvY192cXMsCQkgdmlydGlvX3BjaV9hbGxvY192cXMp LAorCURFVk1FVEhPRCh2aXJ0aW9fYnVzX3NldHVwX2ludHIsCSB2aXJ0aW9fcGNpX3NldHVwX2lu dHIpLAorCURFVk1FVEhPRCh2aXJ0aW9fYnVzX3N0b3AsCQkgdmlydGlvX3BjaV9zdG9wKSwKKwlE RVZNRVRIT0QodmlydGlvX2J1c19yZWluaXQsCQkgdmlydGlvX3BjaV9yZWluaXQpLAorCURFVk1F VEhPRCh2aXJ0aW9fYnVzX3JlaW5pdF9jb21wbGV0ZSwJIHZpcnRpb19wY2lfcmVpbml0X2NvbXBs ZXRlKSwKKwlERVZNRVRIT0QodmlydGlvX2J1c19ub3RpZnlfdnEsCQkgdmlydGlvX3BjaV9ub3Rp ZnlfdnEpLAorCURFVk1FVEhPRCh2aXJ0aW9fYnVzX3JlYWRfZGV2aWNlX2NvbmZpZywgdmlydGlv X3BjaV9yZWFkX2Rldl9jb25maWcpLAorCURFVk1FVEhPRCh2aXJ0aW9fYnVzX3dyaXRlX2Rldmlj ZV9jb25maWcsIHZpcnRpb19wY2lfd3JpdGVfZGV2X2NvbmZpZyksCisKKwl7IDAsIDAgfQorfTsK Kworc3RhdGljIGRyaXZlcl90IHZpcnRpb19wY2lfZHJpdmVyID0geworCSJ2aXJ0aW9fcGNpIiwK Kwl2aXJ0aW9fcGNpX21ldGhvZHMsCisJc2l6ZW9mKHN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRjKQor fTsKKworZGV2Y2xhc3NfdCB2aXJ0aW9fcGNpX2RldmNsYXNzOworCitEUklWRVJfTU9EVUxFKHZp cnRpb19wY2ksIHBjaSwgdmlydGlvX3BjaV9kcml2ZXIsIHZpcnRpb19wY2lfZGV2Y2xhc3MsIDAs IDApOworTU9EVUxFX1ZFUlNJT04odmlydGlvX3BjaSwgMSk7CitNT0RVTEVfREVQRU5EKHZpcnRp b19wY2ksIHBjaSwgMSwgMSwgMSk7CitNT0RVTEVfREVQRU5EKHZpcnRpb19wY2ksIHZpcnRpbywg MSwgMSwgMSk7CisKK3N0YXRpYyBpbnQKK3ZpcnRpb19wY2lfcHJvYmUoZGV2aWNlX3QgZGV2KQor eworCWNoYXIgZGVzY1szNl07CisJY29uc3QgY2hhciAqbmFtZTsKKworCWlmIChwY2lfZ2V0X3Zl bmRvcihkZXYpICE9IFZJUlRJT19QQ0lfVkVORE9SSUQpCisJCXJldHVybiAoRU5YSU8pOworCisJ aWYgKHBjaV9nZXRfZGV2aWNlKGRldikgPCBWSVJUSU9fUENJX0RFVklDRUlEX01JTiB8fAorCSAg ICBwY2lfZ2V0X2RldmljZShkZXYpID4gVklSVElPX1BDSV9ERVZJQ0VJRF9NQVgpCisJCXJldHVy biAoRU5YSU8pOworCisJaWYgKHBjaV9nZXRfcmV2aWQoZGV2KSAhPSBWSVJUSU9fUENJX0FCSV9W RVJTSU9OKQorCQlyZXR1cm4gKEVOWElPKTsKKworCW5hbWUgPSB2aXJ0aW9fZGV2aWNlX25hbWUo cGNpX2dldF9zdWJkZXZpY2UoZGV2KSk7CisJaWYgKG5hbWUgPT0gTlVMTCkKKwkJbmFtZSA9ICJV bmtub3duIjsKKworCXNucHJpbnRmKGRlc2MsIHNpemVvZihkZXNjKSwgIlZpcnRJTyBQQ0kgJXMg YWRhcHRlciIsIG5hbWUpOworCWRldmljZV9zZXRfZGVzY19jb3B5KGRldiwgZGVzYyk7CisKKwly ZXR1cm4gKEJVU19QUk9CRV9ERUZBVUxUKTsKK30KKworc3RhdGljIGludAordmlydGlvX3BjaV9h dHRhY2goZGV2aWNlX3QgZGV2KQoreworCXN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRjICpzYzsKKwlk ZXZpY2VfdCBjaGlsZDsKKwlpbnQgcmlkOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7 CisJc2MtPnZ0cGNpX2RldiA9IGRldjsKKworCXBjaV9lbmFibGVfYnVzbWFzdGVyKGRldik7CisK KwlyaWQgPSBQQ0lSX0JBUigwKTsKKwlzYy0+dnRwY2lfaW9wb3J0ID0gYnVzX2FsbG9jX3Jlc291 cmNlX2FueShkZXYsIFNZU19SRVNfSU9QT1JULAorCSAgICAmcmlkLCBSRl9BQ1RJVkUpOworCWlm IChzYy0+dnRwY2lfaW9wb3J0ID09IE5VTEwpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJjYW5u b3QgbWFwIEkvTyBzcGFjZVxuIik7CisJCXJldHVybiAoRU5YSU8pOworCX0KKworCWlmIChwY2lf ZmluZF9leHRjYXAoZGV2LCBQQ0lZX01TSVgsIE5VTEwpID09IDApIHsKKwkJcmlkID0gUENJUl9C QVIoMSk7CisJCXNjLT52dHBjaV9tc2l4X3RibCA9IGJ1c19hbGxvY19yZXNvdXJjZV9hbnkoZGV2 LCBTWVNfUkVTX01FTU9SWSwKKwkJICAgICZyaWQsIFJGX0FDVElWRSk7CisJCWlmIChzYy0+dnRw Y2lfbXNpeF90YmwgPT0gTlVMTCkKKwkJCS8qIE5vdCBmYXRhbC4gKi8KKwkJCXNjLT52dHBjaV9m bGFncyB8PSBWSVJUSU9fUENJX0ZMQUdfTk9fTVNJWDsKKwl9IGVsc2UKKwkJc2MtPnZ0cGNpX2Zs YWdzIHw9IFZJUlRJT19QQ0lfRkxBR19OT19NU0lYOworCisJdmlydGlvX3BjaV9yZXNldChzYyk7 CisKKwkvKiBUZWxsIHRoZSBob3N0IHdlJ3ZlIG5vdGljZWQgdGhpcyBkZXZpY2UuICovCisJdmly dGlvX3BjaV9zZXRfc3RhdHVzKGRldiwgVklSVElPX0NPTkZJR19TVEFUVVNfQUNLKTsKKworCWlm ICgoY2hpbGQgPSBkZXZpY2VfYWRkX2NoaWxkKGRldiwgTlVMTCwgLTEpKSA9PSBOVUxMKSB7CisJ CWRldmljZV9wcmludGYoZGV2LCAiY2Fubm90IGNyZWF0ZSBjaGlsZCBkZXZpY2VcbiIpOworCQl2 aXJ0aW9fcGNpX3NldF9zdGF0dXMoZGV2LCBWSVJUSU9fQ09ORklHX1NUQVRVU19GQUlMRUQpOwor CQl2aXJ0aW9fcGNpX2RldGFjaChkZXYpOworCQlyZXR1cm4gKEVOT01FTSk7CisJfQorCisJc2Mt PnZ0cGNpX2NoaWxkX2RldiA9IGNoaWxkOworCXNjLT52dHBjaV9jaGlsZF9pdmFycy52dGl2YXJf ZGV2dHlwZSA9IHBjaV9nZXRfc3ViZGV2aWNlKGRldik7CisJZGV2aWNlX3NldF9pdmFycyhjaGls ZCwgJnNjLT52dHBjaV9jaGlsZF9pdmFycyk7CisKKwl2aXJ0aW9fcGNpX3Byb2JlX2FuZF9hdHRh Y2hfY2hpbGQoc2MpOworCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAordmlydGlvX3Bj aV9kZXRhY2goZGV2aWNlX3QgZGV2KQoreworCXN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRjICpzYzsK KwlkZXZpY2VfdCBjaGlsZDsKKwlpbnQgZXJyb3I7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMo ZGV2KTsKKworCWlmICgoY2hpbGQgPSBzYy0+dnRwY2lfY2hpbGRfZGV2KSAhPSBOVUxMKSB7CisJ CWVycm9yID0gZGV2aWNlX2RlbGV0ZV9jaGlsZChkZXYsIGNoaWxkKTsKKwkJaWYgKGVycm9yKQor CQkJcmV0dXJuIChlcnJvcik7CisJCXNjLT52dHBjaV9jaGlsZF9kZXYgPSBOVUxMOworCX0KKwor CS8qIFJlc2V0IHRvIGluaXRpYWwgc3RhdGUuICovCisJdmlydGlvX3BjaV9yZXNldChzYyk7CisK KwlpZiAoc2MtPnZ0cGNpX21zaXhfdGJsICE9IE5VTEwpIHsKKwkJYnVzX3JlbGVhc2VfcmVzb3Vy Y2UoZGV2LCBTWVNfUkVTX01FTU9SWSwKKwkJICAgIFBDSVJfQkFSKDEpLCBzYy0+dnRwY2lfbXNp eF90YmwpOworCQlzYy0+dnRwY2lfbXNpeF90YmwgPSBOVUxMOworCX0KKworCWlmIChzYy0+dnRw Y2lfaW9wb3J0ICE9IE5VTEwpIHsKKwkJYnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2LCBTWVNfUkVT X0lPUE9SVCwKKwkJICAgIFBDSVJfQkFSKDApLCBzYy0+dnRwY2lfaW9wb3J0KTsKKwkJc2MtPnZ0 cGNpX2lvcG9ydCA9IE5VTEw7CisJfQorCisJcmV0dXJuICgwKTsKK30KKworc3RhdGljIGludAor dmlydGlvX3BjaV9zdXNwZW5kKGRldmljZV90IGRldikKK3sKKworCXJldHVybiAoYnVzX2dlbmVy aWNfc3VzcGVuZChkZXYpKTsKK30KKworc3RhdGljIGludAordmlydGlvX3BjaV9yZXN1bWUoZGV2 aWNlX3QgZGV2KQoreworCisJcmV0dXJuIChidXNfZ2VuZXJpY19yZXN1bWUoZGV2KSk7Cit9CisK K3N0YXRpYyBpbnQKK3ZpcnRpb19wY2lfc2h1dGRvd24oZGV2aWNlX3QgZGV2KQoreworCisJKHZv aWQpIGJ1c19nZW5lcmljX3NodXRkb3duKGRldik7CisKKwkvKiBGb3JjaWJseSBzdG9wIHRoZSBo b3N0IGRldmljZS4gKi8KKwl2aXJ0aW9fcGNpX3N0b3AoZGV2KTsKKworCXJldHVybiAoMCk7Cit9 CisKK3N0YXRpYyB2b2lkCit2aXJ0aW9fcGNpX2RyaXZlcl9hZGRlZChkZXZpY2VfdCBkZXYsIGRy aXZlcl90ICpkcml2ZXIpCit7CisJc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKnNjOworCisJc2Mg PSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisKKwl2aXJ0aW9fcGNpX3Byb2JlX2FuZF9hdHRhY2hf Y2hpbGQoc2MpOworfQorCitzdGF0aWMgdm9pZAordmlydGlvX3BjaV9jaGlsZF9kZXRhY2hlZChk ZXZpY2VfdCBkZXYsIGRldmljZV90IGNoaWxkKQoreworCXN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRj ICpzYzsKKworCXNjID0gZGV2aWNlX2dldF9zb2Z0YyhkZXYpOworCisJdmlydGlvX3BjaV9yZXNl dChzYyk7CisJdmlydGlvX3BjaV9yZWxlYXNlX2NoaWxkX3JlcyhzYyk7Cit9CisKK3N0YXRpYyB1 aW50MzJfdAordmlydGlvX3BjaV9uZWdvdGlhdGVfZmVhdHVyZXMoZGV2aWNlX3QgZGV2LCB1aW50 MzJfdCBjaGlsZF9mZWF0dXJlcykKK3sKKwlzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqc2M7CisJ ZGV2aWNlX3QgY2hpbGQ7CisJc3RydWN0IHZpcnRpb19pdmFycyAqaXZhcnM7CisJdWludDMyX3Qg ZmVhdHVyZXM7CisJaW50IHZlcmJvc2U7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsK KwljaGlsZCA9IHNjLT52dHBjaV9jaGlsZF9kZXY7CisJaXZhcnMgPSBkZXZpY2VfZ2V0X2l2YXJz KGNoaWxkKTsKKworCS8qIERvbid0IHByaW50IGRlc2NyaXB0aW9uIGFnYWluIGR1cmluZyByZS1u ZWdvdGlhdGlvbi4gKi8KKwl2ZXJib3NlID0gKGRldmljZV9pc19hdHRhY2hlZChjaGlsZCkgPT0g MCk7CisKKwlmZWF0dXJlcyA9IHZpcnRpb19wY2lfcmVhZF9jb25maWdfNChzYywgVklSVElPX1BD SV9IT1NUX0ZFQVRVUkVTKTsKKworCWlmICh2ZXJib3NlKQorCQl2aXJ0aW9fZGVzY3JpYmUoZGV2 LCAiYXZhaWxhYmxlIiwgZmVhdHVyZXMsCisJCSAgICBpdmFycy0+dnRpdmFyX2ZlYXR1cmVzKTsK KworCWZlYXR1cmVzICY9IGNoaWxkX2ZlYXR1cmVzOworCWZlYXR1cmVzID0gdmlydHF1ZXVlX2Zp bHRlcl9mZWF0dXJlcyhmZWF0dXJlcyk7CisJc2MtPnZ0cGNpX2ZlYXR1cmVzID0gZmVhdHVyZXM7 CisJdmlydGlvX3BjaV93cml0ZV9jb25maWdfNChzYywgVklSVElPX1BDSV9HVUVTVF9GRUFUVVJF UywgZmVhdHVyZXMpOworCisJaWYgKHZlcmJvc2UpCisJCXZpcnRpb19kZXNjcmliZShkZXYsICJu ZWdvdGlhdGVkIiwgZmVhdHVyZXMsCisJCSAgICBpdmFycy0+dnRpdmFyX2ZlYXR1cmVzKTsKKwor CXJldHVybiAoZmVhdHVyZXMpOworfQorCitzdGF0aWMgaW50Cit2aXJ0aW9fcGNpX3dpdGhfZmVh dHVyZShkZXZpY2VfdCBkZXYsIHVpbnQzMl90IGZlYXR1cmUpCit7CisJc3RydWN0IHZpcnRpb19w Y2lfc29mdGMgKnNjOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisKKwlyZXR1cm4g KChzYy0+dnRwY2lfZmVhdHVyZXMgJiBmZWF0dXJlKSA9PSBmZWF0dXJlKTsKK30KKworc3RhdGlj IGludAordmlydGlvX3BjaV9hbGxvY192cXMoZGV2aWNlX3QgZGV2LCBpbnQgZmxhZ3MsIGludCBu dnFzLAorICAgIHN0cnVjdCB2cV9hbGxvY19pbmZvICp2cV9pbmZvKQoreworCXN0cnVjdCB2aXJ0 aW9fcGNpX3NvZnRjICpzYzsKKwlzdHJ1Y3QgdmlydGlvX3BjaV92cXggKnZxeDsKKwlzdHJ1Y3Qg dnFfYWxsb2NfaW5mbyAqaW5mbzsKKwlpbnQgcXVldWUsIGVycm9yOworCXVpbnQxNl90IHNpemU7 CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKworCWlmIChzYy0+dnRwY2lfbnZxcyAh PSAwIHx8CisJICAgIG52cXMgPD0gMCB8fCBudnFzID4gVklSVElPX1BDSV9NQVhfVklSVFFVRVVF UykKKwkJcmV0dXJuIChFSU5WQUwpOworCisJZXJyb3IgPSB2aXJ0aW9fcGNpX2FsbG9jX2ludHIo c2MsIGZsYWdzLCBudnFzLCB2cV9pbmZvKTsKKwlpZiAoZXJyb3IpIHsKKwkJZGV2aWNlX3ByaW50 ZihkZXYsCisJCSAgICAiY2Fubm90IGFsbG9jYXRlIGludGVycnVwdCByZXNvdXJjZXNcbiIpOwor CQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlpZiAoc2MtPnZ0cGNpX2ZsYWdzICYgVklSVElPX1BD SV9GTEFHX01TSVgpIHsKKwkJZXJyb3IgPSB2aXJ0aW9fcGNpX3JlZ2lzdGVyX21zaXgoc2MsCisJ CSAgICBWSVJUSU9fTVNJX0NPTkZJR19WRUNUT1IsIDApOworCQlpZiAoZXJyb3IpCisJCQlyZXR1 cm4gKGVycm9yKTsKKwl9CisKKwlmb3IgKHF1ZXVlID0gMDsgcXVldWUgPCBudnFzOyBxdWV1ZSsr KSB7CisJCXZxeCA9ICZzYy0+dnRwY2lfdnF4W3F1ZXVlXTsKKwkJaW5mbyA9ICZ2cV9pbmZvW3F1 ZXVlXTsKKworCQl2aXJ0aW9fcGNpX3dyaXRlX2NvbmZpZ18yKHNjLCBWSVJUSU9fUENJX1FVRVVF X1NFTCwgcXVldWUpOworCQlzaXplID0gdmlydGlvX3BjaV9yZWFkX2NvbmZpZ18yKHNjLCBWSVJU SU9fUENJX1FVRVVFX05VTSk7CisKKwkJZXJyb3IgPSB2aXJ0cXVldWVfYWxsb2MoZGV2LCBxdWV1 ZSwgc2l6ZSwKKwkJICAgIFZJUlRJT19QQ0lfVlJJTkdfQUxJR04sIGluZm8sICZ2cXgtPnZxKTsK KwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisKKwkJaWYgKHNjLT52dHBjaV9mbGFncyAmIFZJUlRJ T19QQ0lfRkxBR19NU0lYKSB7CisJCQllcnJvciA9IHZpcnRpb19wY2lfcmVnaXN0ZXJfbXNpeChz YywKKwkJCSAgICBWSVJUSU9fTVNJX1FVRVVFX1ZFQ1RPUiwgdnF4LT5pcmVzX2lkeCk7CisJCQlp ZiAoZXJyb3IpCisJCQkJYnJlYWs7CisJCX0KKworCQl2aXJ0aW9fcGNpX3dyaXRlX2NvbmZpZ180 KHNjLCBWSVJUSU9fUENJX1FVRVVFX1BGTiwKKwkJICAgIHZxX3JpbmdfcGFkZHIodnF4LT52cSkg Pj4gVklSVElPX1BDSV9RVUVVRV9BRERSX1NISUZUKTsKKworCQlzYy0+dnRwY2lfbnZxcysrOwor CQkqaW5mby0+dnFhaV92cSA9IHZxeC0+dnE7CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9CisK K3N0YXRpYyBpbnQKK3ZpcnRpb19wY2lfc2V0dXBfaW50cihkZXZpY2VfdCBkZXYsIGVudW0gaW50 cl90eXBlIHR5cGUpCit7CisJc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKnNjOworCXN0cnVjdCB2 aXJ0aW9fcGNpX2ludHJfcmVzICppcmVzOworCXN0cnVjdCB2aXJ0aW9fcGNpX3ZxeCAqdnF4Owor CWludCBpLCBmbGFncywgZXJyb3I7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwlm bGFncyA9IHR5cGUgfCBJTlRSX01QU0FGRTsKKwllcnJvciA9IDA7CisKKwlpZiAoKHNjLT52dHBj aV9mbGFncyAmIFZJUlRJT19QQ0lfRkxBR19NU0lYKSA9PSAwKSB7CisJCWlyZXMgPSAmc2MtPnZ0 cGNpX2lyZXNbMF07CisJCWVycm9yID0gYnVzX3NldHVwX2ludHIoZGV2LCBpcmVzLT5pcnEsIGZs YWdzLAorCQkgICAgdmlydGlvX3BjaV9sZWdhY3lfaW50ciwgTlVMTCwgc2MsICZpcmVzLT5pbnRy aGFuZCk7CisKKwkJcmV0dXJuIChlcnJvcik7CisJfQorCisJaXJlcyA9ICZzYy0+dnRwY2lfaXJl c1swXTsKKwllcnJvciA9IGJ1c19zZXR1cF9pbnRyKGRldiwgaXJlcy0+aXJxLCBmbGFncywKKwkg ICAgdmlydGlvX3BjaV9jb25maWdfaW50ciwgTlVMTCwgc2MsICZpcmVzLT5pbnRyaGFuZCk7CisJ aWYgKGVycm9yKQorCQlyZXR1cm4gKGVycm9yKTsKKworCWlmIChzYy0+dnRwY2lfZmxhZ3MgJiBW SVJUSU9fUENJX0ZMQUdfU0hBUkVEX01TSVgpIHsKKwkJaXJlcyA9ICZzYy0+dnRwY2lfaXJlc1sx XTsKKwkJZXJyb3IgPSBidXNfc2V0dXBfaW50cihkZXYsIGlyZXMtPmlycSwgZmxhZ3MsCisJCSAg ICB2aXJ0aW9fcGNpX3ZxX3NoYXJlZF9pbnRyLCBOVUxMLCBzYywgJmlyZXMtPmludHJoYW5kKTsK KworCQlyZXR1cm4gKGVycm9yKTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgc2MtPnZ0cGNpX252 cXM7IGkrKykgeworCQl2cXggPSAmc2MtPnZ0cGNpX3ZxeFtpXTsKKwkJaWYgKHZxeC0+aXJlc19p ZHggPCAxKQorCQkJY29udGludWU7CisKKwkJaXJlcyA9ICZzYy0+dnRwY2lfaXJlc1t2cXgtPmly ZXNfaWR4XTsKKworCQllcnJvciA9IGJ1c19zZXR1cF9pbnRyKGRldiwgaXJlcy0+aXJxLCBmbGFn cywKKwkJICAgIHZpcnRpb19wY2lfdnFfaW50ciwgTlVMTCwgdnF4LT52cSwgJmlyZXMtPmludHJo YW5kKTsKKwkJaWYgKGVycm9yKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIChlcnJvcik7Cit9 CisKK3N0YXRpYyB2b2lkCit2aXJ0aW9fcGNpX3N0b3AoZGV2aWNlX3QgZGV2KQoreworCisJdmly dGlvX3BjaV9yZXNldChkZXZpY2VfZ2V0X3NvZnRjKGRldikpOworfQorCitzdGF0aWMgaW50Cit2 aXJ0aW9fcGNpX3JlaW5pdChkZXZpY2VfdCBkZXYsIHVpbnQzMl90IGZlYXR1cmVzKQoreworCXN0 cnVjdCB2aXJ0aW9fcGNpX3NvZnRjICpzYzsKKwlzdHJ1Y3QgdmlydGlvX3BjaV92cXggKnZxeDsK KwlzdHJ1Y3QgdmlydHF1ZXVlICp2cTsKKwl1aW50MTZfdCBzaXplOworCWludCBxdWV1ZSwgcmVz X2lkeCwgZXJyb3I7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwllcnJvciA9IDA7 CisKKwkvKgorCSAqIE5PVEU6IFdlJ3JlIHByZXR0eSBzZW5zaXRpdmUgaGVyZSBpZiB0aGUgaG9z dCdzIGRldmljZQorCSAqIHJhZGljYWxseSBjaGFuZ2VzIGZyb20gd2hhdCB3YXMgb3JpZ2luYWxs eSBuZWdvdGlhdGVkCisJICogZHVyaW5nIGF0dGFjaDsgaS5lLiBNU0lYIGdvZXMgYXdheSwgdmly dHF1ZXVlIHNpemUKKwkgKiBjaGFuZ2VzLCBldGMuCisJICoKKwkgKiBQcmVzZW50bHksIGJvdGgg S1ZNIGFuZCBWaXJ0dWFsQm94IHNlZW0gdG8gcGxheSBuaWNlLAorCSAqIGJ1dCBldmVudHVhbGx5 IHRoaXMgc2hvdWxkIGJlIG1vcmUgcm9idXN0LCBlZmZlY3RpdmVseQorCSAqIHJlLWRyaXZpbmcg dGhlIHdob2xlIGRldmljZSB0aHJvdWdoIGRldmljZV9hdHRhY2goKQorCSAqIHdpdGggdGhlIG5l dyBkZXNpcmVkIGZlYXR1cmVzLgorCSAqLworCWlmICh2aXJ0aW9fcGNpX2dldF9zdGF0dXMoZGV2 KSAhPSBWSVJUSU9fQ09ORklHX1NUQVRVU19SRVNFVCkKKwkJdmlydGlvX3BjaV9zdG9wKGRldik7 CisKKwl2aXJ0aW9fcGNpX3NldF9zdGF0dXMoZGV2LCBWSVJUSU9fQ09ORklHX1NUQVRVU19BQ0sp OworCXZpcnRpb19wY2lfc2V0X3N0YXR1cyhkZXYsIFZJUlRJT19DT05GSUdfU1RBVFVTX0RSSVZF Uik7CisKKwl2aXJ0aW9fcGNpX25lZ290aWF0ZV9mZWF0dXJlcyhkZXYsIGZlYXR1cmVzKTsKKwor CS8qCisJICogUmVpbml0aWFsaXplIHRoZSBob3N0IGRldmljZS4KKwkgKiBYWFggTW9zdGx5IGR1 cGxpY2F0ZWQgZnJvbSB2aXJ0aW9fcGNpX2FsbG9jX3ZxcygpLgorCSAqLworCisJaWYgKHNjLT52 dHBjaV9mbGFncyAmIFZJUlRJT19QQ0lfRkxBR19NU0lYKSB7CisJCWVycm9yID0gdmlydGlvX3Bj aV9yZWdpc3Rlcl9tc2l4KHNjLAorCQkgICAgVklSVElPX01TSV9DT05GSUdfVkVDVE9SLCAwKTsK KwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIChlcnJvcik7CisJfQorCisJZm9yIChxdWV1ZSA9IDA7 IHF1ZXVlIDwgc2MtPnZ0cGNpX252cXM7IHF1ZXVlKyspIHsKKwkJdnF4ID0gJnNjLT52dHBjaV92 cXhbcXVldWVdOworCisJCXZxID0gdnF4LT52cTsKKwkJcmVzX2lkeCA9IHZxeC0+aXJlc19pZHg7 CisKKwkJS0FTU0VSVCh2cSAhPSBOVUxMLAorCQkgICAgKCJ2aXJ0cXVldWUgJWQgbm90IGFsbG9j YXRlZCIsIHF1ZXVlKSk7CisKKwkJdmlydGlvX3BjaV93cml0ZV9jb25maWdfMihzYywgVklSVElP X1BDSV9RVUVVRV9TRUwsIHF1ZXVlKTsKKwkJc2l6ZSA9IHZpcnRpb19wY2lfcmVhZF9jb25maWdf MihzYywgVklSVElPX1BDSV9RVUVVRV9OVU0pOworCisJCWVycm9yID0gdmlydHF1ZXVlX3JlaW5p dCh2cSwgc2l6ZSk7CisJCWlmIChlcnJvcikKKwkJCWJyZWFrOworCisJCWlmIChzYy0+dnRwY2lf ZmxhZ3MgJiBWSVJUSU9fUENJX0ZMQUdfTVNJWCkgeworCQkJZXJyb3IgPSB2aXJ0aW9fcGNpX3Jl Z2lzdGVyX21zaXgoc2MsCisJCQkgICAgVklSVElPX01TSV9RVUVVRV9WRUNUT1IsIHJlc19pZHgp OworCQkJaWYgKGVycm9yKQorCQkJCWJyZWFrOworCQl9CisKKwkJdmlydGlvX3BjaV93cml0ZV9j b25maWdfNChzYywgVklSVElPX1BDSV9RVUVVRV9QRk4sCisJCSAgICB2cV9yaW5nX3BhZGRyKHZx KSA+PiBWSVJUSU9fUENJX1FVRVVFX0FERFJfU0hJRlQpOworCX0KKworCXJldHVybiAoZXJyb3Ip OworfQorCitzdGF0aWMgdm9pZAordmlydGlvX3BjaV9yZWluaXRfY29tcGxldGUoZGV2aWNlX3Qg ZGV2KQoreworCisJdmlydGlvX3BjaV9zZXRfc3RhdHVzKGRldiwgVklSVElPX0NPTkZJR19TVEFU VVNfRFJJVkVSX09LKTsKK30KKworc3RhdGljIHZvaWQKK3ZpcnRpb19wY2lfbm90aWZ5X3ZxKGRl dmljZV90IGRldiwgdWludDE2X3QgcXVldWUpCit7CisJc3RydWN0IHZpcnRpb19wY2lfc29mdGMg KnNjOworCisJc2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisKKwl2aXJ0aW9fcGNpX3dyaXRl X2NvbmZpZ18yKHNjLCBWSVJUSU9fUENJX1FVRVVFX05PVElGWSwgcXVldWUpOworfQorCitzdGF0 aWMgdWludDhfdAordmlydGlvX3BjaV9nZXRfc3RhdHVzKGRldmljZV90IGRldikKK3sKKwlzdHJ1 Y3QgdmlydGlvX3BjaV9zb2Z0YyAqc2M7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsK KworCXJldHVybiAodmlydGlvX3BjaV9yZWFkX2NvbmZpZ18xKHNjLCBWSVJUSU9fUENJX1NUQVRV UykpOworfQorCitzdGF0aWMgdm9pZAordmlydGlvX3BjaV9zZXRfc3RhdHVzKGRldmljZV90IGRl diwgdWludDhfdCBzdGF0dXMpCit7CisJc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKnNjOworCisJ c2MgPSBkZXZpY2VfZ2V0X3NvZnRjKGRldik7CisKKwl2aXJ0aW9fcGNpX3dyaXRlX2NvbmZpZ18x KHNjLCBWSVJUSU9fUENJX1NUQVRVUywgc3RhdHVzKTsKK30KKworc3RhdGljIHZvaWQKK3ZpcnRp b19wY2lfcmVhZF9kZXZfY29uZmlnKGRldmljZV90IGRldiwgYnVzX3NpemVfdCBvZmZzZXQsCisg ICAgdm9pZCAqZHN0LCBpbnQgbGVuKQoreworCXN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRjICpzYzsK KwlidXNfc2l6ZV90IG87CisJdWludDhfdCAqZDsKKworCXNjID0gZGV2aWNlX2dldF9zb2Z0Yyhk ZXYpOworCW8gPSBWSVJUSU9fUENJX0NPTkZJRyhzYykgKyBvZmZzZXQ7CisKKwlmb3IgKGQgPSBk c3Q7IGxlbi0tID4gMDsgZCsrLCBvKyspCisJCSpkID0gdmlydGlvX3BjaV9yZWFkX2NvbmZpZ18x KHNjLCBvKTsKK30KKworc3RhdGljIHZvaWQKK3ZpcnRpb19wY2lfd3JpdGVfZGV2X2NvbmZpZyhk ZXZpY2VfdCBkZXYsIGJ1c19zaXplX3Qgb2Zmc2V0LAorICAgIHZvaWQgKnNyYywgaW50IGxlbikK K3sKKwlzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqc2M7CisJYnVzX3NpemVfdCBvOworCXVpbnQ4 X3QgKnM7CisKKwlzYyA9IGRldmljZV9nZXRfc29mdGMoZGV2KTsKKwlvID0gVklSVElPX1BDSV9D T05GSUcoc2MpICsgb2Zmc2V0OworCisJZm9yIChzID0gc3JjOyBsZW4tLSA+IDA7IHMrKywgbysr KQorCQl2aXJ0aW9fcGNpX3dyaXRlX2NvbmZpZ18xKHNjLCBvLCAqcyk7Cit9CisKK3N0YXRpYyB2 b2lkCit2aXJ0aW9fcGNpX3Byb2JlX2FuZF9hdHRhY2hfY2hpbGQoc3RydWN0IHZpcnRpb19wY2lf c29mdGMgKnNjKQoreworCWRldmljZV90IGRldiwgY2hpbGQ7CisJaW50IGVycm9yOworCisJZGV2 ID0gc2MtPnZ0cGNpX2RldjsKKwljaGlsZCA9IHNjLT52dHBjaV9jaGlsZF9kZXY7CisKKwlpZiAo Y2hpbGQgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGRldmljZV9nZXRfc3RhdGUoY2hpbGQp ICE9IERTX05PVFBSRVNFTlQpCisJCXJldHVybjsKKworCWVycm9yID0gZGV2aWNlX3Byb2JlKGNo aWxkKTsKKwlpZiAoZXJyb3IgPT0gRU5YSU8pCisJCXJldHVybjsKKwllbHNlIGlmIChlcnJvcikK KwkJZ290byBmYWlsOworCisJdmlydGlvX3BjaV9zZXRfc3RhdHVzKGRldiwgVklSVElPX0NPTkZJ R19TVEFUVVNfRFJJVkVSKTsKKwlpZiAoZGV2aWNlX2F0dGFjaChjaGlsZCkgPT0gMCkgeworCQl2 aXJ0aW9fcGNpX3NldF9zdGF0dXMoZGV2LCBWSVJUSU9fQ09ORklHX1NUQVRVU19EUklWRVJfT0sp OworCQlyZXR1cm47CisJfQorCitmYWlsOgorCXZpcnRpb19wY2lfc2V0X3N0YXR1cyhkZXYsIFZJ UlRJT19DT05GSUdfU1RBVFVTX0ZBSUxFRCk7CisJdmlydGlvX3BjaV9yZXNldChzYyk7CisJdmly dGlvX3BjaV9yZWxlYXNlX2NoaWxkX3JlcyhzYyk7CisKKwkvKiBSZXNldCBmb3IgbGF0ZXIgYXR0 ZW1wdC4gKi8KKwl2aXJ0aW9fcGNpX3NldF9zdGF0dXMoZGV2LCBWSVJUSU9fQ09ORklHX1NUQVRV U19BQ0spOworfQorCitzdGF0aWMgaW50Cit2aXJ0aW9fcGNpX2FsbG9jX2ludHIoc3RydWN0IHZp cnRpb19wY2lfc29mdGMgKnNjLCBpbnQgZmxhZ3MsIGludCBudnFzLAorICAgIHN0cnVjdCB2cV9h bGxvY19pbmZvICp2cV9pbmZvKQoreworCWludCBpLCBudmVjdDsKKworCWZvciAobnZlY3QgPSAw LCBpID0gMDsgaSA8IG52cXM7IGkrKykKKwkJaWYgKHZxX2luZm9baV0udnFhaV9pbnRyICE9IE5V TEwpCisJCQludmVjdCsrOworCisJaWYgKHZpcnRpb19wY2lfZGlzYWJsZV9tc2l4ICE9IDAgfHwK KwkgICAgZmxhZ3MgJiBWSVJUSU9fQUxMT0NfVlFTX0RJU0FCTEVfTVNJWCB8fAorCSAgICBzYy0+ dnRwY2lfZmxhZ3MgJiBWSVJUSU9fUENJX0ZMQUdfTk9fTVNJWCB8fAorCSAgICB2aXJ0aW9fcGNp X2FsbG9jX21zaXgoc2MsIG52ZWN0KSAhPSAwKSB7CisJCS8qIEZhbGwtYmFjayB0byBsZWdhY3kg aW50ZXJydXB0cy4gKi8KKwkJc2MtPnZ0cGNpX25pcmVzID0gMTsKKwl9CisKKwlyZXR1cm4gKHZp cnRpb19wY2lfYWxsb2NfaW50cl9yZXMoc2MsIG52cXMsIHZxX2luZm8pKTsKK30KKworc3RhdGlj IGludAordmlydGlvX3BjaV9hbGxvY19pbnRyX3JlcyhzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAq c2MsIGludCBudnFzLAorICAgIHN0cnVjdCB2cV9hbGxvY19pbmZvICp2cV9pbmZvKQoreworCWRl dmljZV90IGRldjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKmlycTsKKwlzdHJ1Y3QgdmlydGlvX3BjaV92 cXggKnZxeDsKKwlpbnQgaSwgcmlkLCBmbGFncywgcmVzX2lkeDsKKworCWRldiA9IHNjLT52dHBj aV9kZXY7CisKKwlpZiAoc2MtPnZ0cGNpX2ZsYWdzICYgVklSVElPX1BDSV9GTEFHX01TSVgpIHsK KwkJcmlkID0gMTsKKwkJZmxhZ3MgPSBSRl9BQ1RJVkU7CisJfSBlbHNlIHsKKwkJcmlkID0gMDsK KwkJZmxhZ3MgPSBSRl9BQ1RJVkUgfCBSRl9TSEFSRUFCTEU7CisJCUtBU1NFUlQoc2MtPnZ0cGNp X25pcmVzID09IDEsICgidG9vIG1hbnkgbGVnYWN5IGludHIgcmVzIikpOworCX0KKworCWZvciAo aSA9IDA7IGkgPCBzYy0+dnRwY2lfbmlyZXM7IGkrKywgcmlkKyspIHsKKwkJaXJxID0gYnVzX2Fs bG9jX3Jlc291cmNlX2FueShkZXYsIFNZU19SRVNfSVJRLCAmcmlkLCBmbGFncyk7CisJCWlmIChp cnEgPT0gTlVMTCkKKwkJCXJldHVybiAoRU5YSU8pOworCisJCXNjLT52dHBjaV9pcmVzW2ldLmly cSA9IGlycTsKKwkJc2MtPnZ0cGNpX2lyZXNbaV0ucmlkID0gcmlkOworCX0KKworCWZvciAoaSA9 IDAsIHJlc19pZHggPSAxOyBpIDwgbnZxczsgaSsrKSB7CisJCXZxeCA9ICZzYy0+dnRwY2lfdnF4 W2ldOworCisJCWlmIChzYy0+dnRwY2lfZmxhZ3MgJiBWSVJUSU9fUENJX0ZMQUdfTVNJWCkgewor CQkJaWYgKHZxX2luZm9baV0udnFhaV9pbnRyID09IE5VTEwpCisJCQkJdnF4LT5pcmVzX2lkeCA9 IC0xOworCQkJZWxzZSBpZiAoc2MtPnZ0cGNpX2ZsYWdzICYgVklSVElPX1BDSV9GTEFHX1NIQVJF RF9NU0lYKQorCQkJCXZxeC0+aXJlc19pZHggPSByZXNfaWR4OworCQkJZWxzZQorCQkJCXZxeC0+ aXJlc19pZHggPSByZXNfaWR4Kys7CisJCX0gZWxzZQorCQkJdnF4LT5pcmVzX2lkeCA9IC0xOwor CX0KKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyBpbnQKK3ZpcnRpb19wY2lfYWxsb2NfbXNp eChzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqc2MsIGludCBudmVjdCkKK3sKKwlkZXZpY2VfdCBk ZXY7CisJaW50IG5tc2l4LCBjbnQsIHJlcXVpcmVkOworCisJZGV2ID0gc2MtPnZ0cGNpX2RldjsK KwlubXNpeCA9IHBjaV9tc2l4X2NvdW50KGRldik7CisKKwlpZiAobm1zaXggPCAxKQorCQlyZXR1 cm4gKDEpOworCisJLyoKKwkgKiBOT1RFOiBOZWVkIGFuIGFkZGl0aW9uYWwgdmVjdG9yIGZvciBj b25maWd1cmF0aW9uCisJICogY2hhbmdlZCBub3RpZmljYXRpb25zLgorCSAqLworCisJY250ID0g cmVxdWlyZWQgPSBudmVjdCArIDE7CisJaWYgKG5tc2l4ID49IHJlcXVpcmVkKSB7CisJCWlmIChw Y2lfYWxsb2NfbXNpeChkZXYsICZjbnQpID09IDAgJiYKKwkJICAgIGNudCA+PSByZXF1aXJlZCkK KwkJCWdvdG8gb3V0OworCQllbHNlCisJCQkvKiBSZWxlYXNlIGFueSBwYXJ0aWFsIGFsbG9jYXRp b24uICovCisJCQlwY2lfcmVsZWFzZV9tc2koZGV2KTsKKwl9CisKKwkvKiBBdHRlbXB0IHNoYXJl ZCBNU0lYIGFsbG9jYXRpb24uICovCisJY250ID0gcmVxdWlyZWQgPSAyOworCWlmIChubXNpeCA8 IHJlcXVpcmVkIHx8CisJICAgIHBjaV9hbGxvY19tc2l4KGRldiwgJmNudCkgIT0gMCB8fAorCSAg ICBjbnQgPCByZXF1aXJlZCkgeworCQlwY2lfcmVsZWFzZV9tc2koZGV2KTsKKwkJcmV0dXJuICgx KTsKKwl9CisKKwlzYy0+dnRwY2lfZmxhZ3MgfD0gVklSVElPX1BDSV9GTEFHX1NIQVJFRF9NU0lY OworCitvdXQ6CisJc2MtPnZ0cGNpX25pcmVzID0gcmVxdWlyZWQ7CisJc2MtPnZ0cGNpX2ZsYWdz IHw9IFZJUlRJT19QQ0lfRkxBR19NU0lYOworCisJaWYgKGJvb3R2ZXJib3NlKSB7CisJCWlmIChz Yy0+dnRwY2lfZmxhZ3MgJiBWSVJUSU9fUENJX0ZMQUdfU0hBUkVEX01TSVgpCisJCQlkZXZpY2Vf cHJpbnRmKGRldiwgInVzaW5nIHNoYXJlZCB2aXJ0cXVldWUgTVNJWFxuIik7CisJCWVsc2UKKwkJ CWRldmljZV9wcmludGYoZGV2LCAidXNpbmcgcGVyIHZpcnRxdWV1ZSBNU0lYXG4iKTsKKwl9CisK KwlyZXR1cm4gKDApOworfQorCitzdGF0aWMgaW50Cit2aXJ0aW9fcGNpX3JlZ2lzdGVyX21zaXgo c3RydWN0IHZpcnRpb19wY2lfc29mdGMgKnNjLCBpbnQgb2Zmc2V0LAorICAgIGludCByZXNfaWR4 KQoreworCWRldmljZV90IGRldjsKKwl1aW50MTZfdCB2ZWN0b3IsIGhvc3RfdmVjdG9yOworCisJ ZGV2ID0gc2MtPnZ0cGNpX2RldjsKKworCWlmIChyZXNfaWR4ID09IC0xKQorCQl2ZWN0b3IgPSBW SVJUSU9fTVNJX05PX1ZFQ1RPUjsKKwllbHNlCisJCS8qIE1hcCBmcm9tIHJpZCB0byBob3N0IHZl Y3Rvci4gKi8KKwkJdmVjdG9yID0gc2MtPnZ0cGNpX2lyZXNbcmVzX2lkeF0ucmlkIC0gMTsKKwor CS8qIEVuc3VyZSB0aGUgY29uZmlnIGNoYW5nZSB2ZWN0b3IgaXNuJ3QgYmVpbmcgbWlzdXNlZC4g Ki8KKwlpZiAocmVzX2lkeCA9PSAwKQorCQlLQVNTRVJUKG9mZnNldCA9PSBWSVJUSU9fTVNJX0NP TkZJR19WRUNUT1IgJiYKKwkJICAgIAl2ZWN0b3IgPT0gMCwgKCJyZXVzaW5nIGNvbmZpZyBjaGFu Z2UgdmVjdG9yIikpOworCisJdmlydGlvX3BjaV93cml0ZV9jb25maWdfMihzYywgb2Zmc2V0LCB2 ZWN0b3IpOworCWlmICh2ZWN0b3IgPT0gVklSVElPX01TSV9OT19WRUNUT1IpCisJCXJldHVybiAo MCk7CisKKwlob3N0X3ZlY3RvciA9IHZpcnRpb19wY2lfcmVhZF9jb25maWdfMihzYywgb2Zmc2V0 KTsKKwlpZiAoaG9zdF92ZWN0b3IgPT0gVklSVElPX01TSV9OT19WRUNUT1IpIHsKKwkJZGV2aWNl X3ByaW50ZihkZXYsCisJCSAgICAiaW5zdWZmaWNpZW50IGhvc3QgcmVzb3VyY2VzIGZvciBNU0lY IGludGVycnVwdHNcbiIpOworCQlyZXR1cm4gKEVOT0RFVik7CisJfQorCisJcmV0dXJuICgwKTsK K30KKworc3RhdGljIHZvaWQKK3ZpcnRpb19wY2lfZnJlZV9pbnRyX3JlcyhzdHJ1Y3QgdmlydGlv X3BjaV9zb2Z0YyAqc2MpCit7CisJZGV2aWNlX3QgZGV2OworCXN0cnVjdCB2aXJ0aW9fcGNpX2lu dHJfcmVzICppcmVzOworCWludCBpOworCisJZGV2ID0gc2MtPnZ0cGNpX2RldjsKKwlzYy0+dnRw Y2lfbmlyZXMgPSAwOworCisJZm9yIChpID0gMDsgaSA8IDEgKyBWSVJUSU9fUENJX01BWF9WSVJU UVVFVUVTOyBpKyspIHsKKwkJaXJlcyA9ICZzYy0+dnRwY2lfaXJlc1tpXTsKKworCQlpZiAoaXJl cy0+aW50cmhhbmQgIT0gTlVMTCkgeworCQkJYnVzX3RlYXJkb3duX2ludHIoZGV2LCBpcmVzLT5p cnEsIGlyZXMtPmludHJoYW5kKTsKKwkJCWlyZXMtPmludHJoYW5kID0gTlVMTDsKKwkJfQorCisJ CWlmIChpcmVzLT5pcnEgIT0gTlVMTCkgeworCQkJYnVzX3JlbGVhc2VfcmVzb3VyY2UoZGV2LCBT WVNfUkVTX0lSUSwgaXJlcy0+cmlkLAorCQkJICAgIGlyZXMtPmlycSk7CisJCQlpcmVzLT5pcnEg PSBOVUxMOworCQl9CisKKwkJaXJlcy0+cmlkID0gLTE7CisJfQorfQorCitzdGF0aWMgdm9pZAor dmlydGlvX3BjaV9mcmVlX3ZxcyhzdHJ1Y3QgdmlydGlvX3BjaV9zb2Z0YyAqc2MpCit7CisJc3Ry dWN0IHZpcnRpb19wY2lfdnF4ICp2cXg7CisJaW50IGk7CisKKwlzYy0+dnRwY2lfbnZxcyA9IDA7 CisKKwlmb3IgKGkgPSAwOyBpIDwgVklSVElPX1BDSV9NQVhfVklSVFFVRVVFUzsgaSsrKSB7CisJ CXZxeCA9ICZzYy0+dnRwY2lfdnF4W2ldOworCisJCWlmICh2cXgtPnZxICE9IE5VTEwpIHsKKwkJ CXZpcnRxdWV1ZV9mcmVlKHZxeC0+dnEpOworCQkJdnF4LT52cSA9IE5VTEw7CisJCX0KKwl9Cit9 CisKK3N0YXRpYyB2b2lkCit2aXJ0aW9fcGNpX3JlbGVhc2VfY2hpbGRfcmVzKHN0cnVjdCB2aXJ0 aW9fcGNpX3NvZnRjICpzYykKK3sKKwlkZXZpY2VfdCBkZXY7CisKKwlkZXYgPSBzYy0+dnRwY2lf ZGV2OworCisJLyogUmVsZWFzZSBhbnkgcmVzb3VyY2VzIHRoZSBjaGlsZCBtYXkgaGF2ZSBhbGxv Y2F0ZWQuICovCisJdmlydGlvX3BjaV9mcmVlX2ludHJfcmVzKHNjKTsKKwl2aXJ0aW9fcGNpX2Zy ZWVfdnFzKHNjKTsKKworCWlmIChzYy0+dnRwY2lfZmxhZ3MgJiBWSVJUSU9fUENJX0ZMQUdfTVNJ WCkgeworCQlwY2lfcmVsZWFzZV9tc2koZGV2KTsKKwkJc2MtPnZ0cGNpX2ZsYWdzICY9IH4oVklS VElPX1BDSV9GTEFHX01TSVggfAorCQkgICAgCQkgICAgIFZJUlRJT19QQ0lfRkxBR19TSEFSRURf TVNJWCk7CisJfQorfQorCitzdGF0aWMgdm9pZAordmlydGlvX3BjaV9yZXNldChzdHJ1Y3Qgdmly dGlvX3BjaV9zb2Z0YyAqc2MpCit7CisKKwkvKgorCSAqIFNldHRpbmcgdGhlIHN0YXR1cyB0byBS RVNFVCByZXN0b3JlcyB0aGUgaG9zdCdzCisJICogZGV2aWNlIHRvIHRoZSBvcmlnaW5hbCB1bmlu aXRpYWxpemVkIHN0YXRlLgorCSAqLworCXZpcnRpb19wY2lfc2V0X3N0YXR1cyhzYy0+dnRwY2lf ZGV2LCBWSVJUSU9fQ09ORklHX1NUQVRVU19SRVNFVCk7Cit9CisKK3N0YXRpYyBpbnQKK3ZpcnRp b19wY2lfbGVnYWN5X2ludHIodm9pZCAqeHNjKQoreworCXN0cnVjdCB2aXJ0aW9fcGNpX3NvZnRj ICpzYzsKKwlzdHJ1Y3QgdmlydGlvX3BjaV92cXggKnZxeDsKKwlpbnQgaTsKKwl1aW50OF90IGlz cjsKKworCXNjID0geHNjOworCXZxeCA9ICZzYy0+dnRwY2lfdnF4WzBdOworCisJLyogUmVhZGlu ZyB0aGUgSVNSIGFsc28gY2xlYXJzIGl0LiAqLworCWlzciA9IHZpcnRpb19wY2lfcmVhZF9jb25m aWdfMShzYywgVklSVElPX1BDSV9JU1IpOworCisJaWYgKGlzciAmIFZJUlRJT19QQ0lfSVNSX0NP TkZJRykKKwkJdmlydGlvX3BjaV9jb25maWdfaW50cihzYyk7CisKKwlpZiAoaXNyICYgVklSVElP X1BDSV9JU1JfSU5UUikKKwkJZm9yIChpID0gMDsgaSA8IHNjLT52dHBjaV9udnFzOyBpKyssIHZx eCsrKQorCQkJdmlydHF1ZXVlX2ludHIodnF4LT52cSk7CisKKwlyZXR1cm4gKGlzciA/IEZJTFRF Ul9IQU5ETEVEIDogRklMVEVSX1NUUkFZKTsKK30KKworc3RhdGljIGludAordmlydGlvX3BjaV92 cV9zaGFyZWRfaW50cih2b2lkICp4c2MpCit7CisJc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKnNj OworCXN0cnVjdCB2aXJ0aW9fcGNpX3ZxeCAqdnF4OworCWludCBpLCByYzsKKworCXJjID0gMDsK KwlzYyA9IHhzYzsKKwl2cXggPSAmc2MtPnZ0cGNpX3ZxeFswXTsKKworCWZvciAoaSA9IDA7IGkg PCBzYy0+dnRwY2lfbnZxczsgaSsrLCB2cXgrKykKKwkJcmMgfD0gdmlydHF1ZXVlX2ludHIodnF4 LT52cSk7CisKKwlyZXR1cm4gKHJjID8gRklMVEVSX0hBTkRMRUQgOiBGSUxURVJfU1RSQVkpOwor fQorCitzdGF0aWMgaW50Cit2aXJ0aW9fcGNpX3ZxX2ludHIodm9pZCAqeHZxKQoreworCXN0cnVj dCB2aXJ0cXVldWUgKnZxOworCWludCByYzsKKworCXZxID0geHZxOworCXJjID0gdmlydHF1ZXVl X2ludHIodnEpOworCisJcmV0dXJuIChyYyA/IEZJTFRFUl9IQU5ETEVEIDogRklMVEVSX1NUUkFZ KTsKK30KKworc3RhdGljIGludAordmlydGlvX3BjaV9jb25maWdfaW50cih2b2lkICp4c2MpCit7 CisJc3RydWN0IHZpcnRpb19wY2lfc29mdGMgKnNjOworCWRldmljZV90IGNoaWxkOworCWludCBy YzsKKworCXJjID0gMDsKKwlzYyA9IHhzYzsKKwljaGlsZCA9IHNjLT52dHBjaV9jaGlsZF9kZXY7 CisKKwlpZiAoY2hpbGQgIT0gTlVMTCkKKwkJcmMgPSBWSVJUSU9fQ09ORklHX0NIQU5HRShjaGls ZCk7CisKKwlyZXR1cm4gKHJjID8gRklMVEVSX0hBTkRMRUQgOiBGSUxURVJfU1RSQVkpOworfQpk aWZmIC0tZ2l0IGEvc3lzL2Rldi92aXJ0aW8vcGNpL3ZpcnRpb19wY2lfcmVnLmggYi9zeXMvZGV2 L3ZpcnRpby9wY2kvdmlydGlvX3BjaV9yZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rl di9udWxsCisrKyBiL3N5cy9kZXYvdmlydGlvL3BjaS92aXJ0aW9fcGNpX3JlZy5oCkBAIC0wLDAg KzEsNDggQEAKKyNpZm5kZWYgX1ZJUlRJT19QQ0lfUkVHX0gKKyNkZWZpbmUgX1ZJUlRJT19QQ0lf UkVHX0gKKworLyogVmlydElPIFBDSSB2ZW5kb3IvZGV2aWNlIElELiAqLworI2RlZmluZSBWSVJU SU9fUENJX1ZFTkRPUklECTB4MUFGNAorI2RlZmluZSBWSVJUSU9fUENJX0RFVklDRUlEX01JTgkw eDEwMDAKKyNkZWZpbmUgVklSVElPX1BDSV9ERVZJQ0VJRF9NQVgJMHgxMDNGCisKKy8qIFZpcnRJ TyBBQkkgdmVyc2lvbiwgdGhpcyBtdXN0IG1hdGNoIGV4YWN0bHkuICovCisjZGVmaW5lIFZJUlRJ T19QQ0lfQUJJX1ZFUlNJT04JMAorCisvKgorICogVmlydElPIEhlYWRlciwgbG9jYXRlZCBpbiBC QVIgMC4KKyAqLworI2RlZmluZSBWSVJUSU9fUENJX0hPU1RfRkVBVFVSRVMgIDAgIC8qIGhvc3Qn cyBzdXBwb3J0ZWQgZmVhdHVyZXMgKDMyYml0LCBSTykqLworI2RlZmluZSBWSVJUSU9fUENJX0dV RVNUX0ZFQVRVUkVTIDQgIC8qIGd1ZXN0J3Mgc3VwcG9ydGVkIGZlYXR1cmVzICgzMiwgUlcpICov CisjZGVmaW5lIFZJUlRJT19QQ0lfUVVFVUVfUEZOICAgICAgOCAgLyogcGh5c2ljYWwgYWRkcmVz cyBvZiBWUSAoMzIsIFJXKSAqLworI2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX05VTSAgICAgIDEy IC8qIG51bWJlciBvZiByaW5nIGVudHJpZXMgKDE2LCBSTykgKi8KKyNkZWZpbmUgVklSVElPX1BD SV9RVUVVRV9TRUwgICAgICAxNCAvKiBjdXJyZW50IFZRIHNlbGVjdGlvbiAoMTYsIFJXKSAqLwor I2RlZmluZSBWSVJUSU9fUENJX1FVRVVFX05PVElGWQkgIDE2IC8qIG5vdGlmeSBob3N0IHJlZ2Fy ZGluZyBWUSAoMTYsIFJXKSAqLworI2RlZmluZSBWSVJUSU9fUENJX1NUQVRVUyAgICAgICAgIDE4 IC8qIGRldmljZSBzdGF0dXMgcmVnaXN0ZXIgKDgsIFJXKSAqLworI2RlZmluZSBWSVJUSU9fUENJ X0lTUiAgICAgICAgICAgIDE5IC8qIGludGVycnVwdCBzdGF0dXMgcmVnaXN0ZXIsIHJlYWRpbmcK KwkJCQkgICAgICAqIGFsc28gY2xlYXJzIHRoZSByZWdpc3RlciAoOCwgUk8pICovCisvKiBPbmx5 IGlmIE1TSVggaXMgZW5hYmxlZDogKi8KKyNkZWZpbmUgVklSVElPX01TSV9DT05GSUdfVkVDVE9S ICAyMCAvKiBjb25maWd1cmF0aW9uIGNoYW5nZSB2ZWN0b3IgKDE2LCBSVykgKi8KKyNkZWZpbmUg VklSVElPX01TSV9RVUVVRV9WRUNUT1IgICAyMiAvKiB2ZWN0b3IgZm9yIHNlbGVjdGVkIFZRIG5v dGlmaWNhdGlvbnMKKwkJCQkJKDE2LCBSVykgKi8KKworLyogVGhlIGJpdCBvZiB0aGUgSVNSIHdo aWNoIGluZGljYXRlcyBhIGRldmljZSBoYXMgYW4gaW50ZXJydXB0LiAqLworI2RlZmluZSBWSVJU SU9fUENJX0lTUl9JTlRSCTB4MQorLyogVGhlIGJpdCBvZiB0aGUgSVNSIHdoaWNoIGluZGljYXRl cyBhIGRldmljZSBjb25maWd1cmF0aW9uIGNoYW5nZS4gKi8KKyNkZWZpbmUgVklSVElPX1BDSV9J U1JfQ09ORklHCTB4MgorLyogVmVjdG9yIHZhbHVlIHVzZWQgdG8gZGlzYWJsZSBNU0kgZm9yIHF1 ZXVlLiAqLworI2RlZmluZSBWSVJUSU9fTVNJX05PX1ZFQ1RPUgkweEZGRkYKKworLyogVGhlIHJl bWFpbmluZyBzcGFjZSBpcyBkZWZpbmVkIGJ5IGVhY2ggZHJpdmVyIGFzIHRoZSBwZXItZHJpdmVy CisgKiBjb25maWd1cmF0aW9uIHNwYWNlLiAqLworI2RlZmluZSBWSVJUSU9fUENJX0NPTkZJRyhz YykgXAorICAgICgoKHNjKS0+dnRwY2lfZmxhZ3MgJiBWSVJUSU9fUENJX0ZMQUdfTVNJWCkgPyAy NCA6IDIwKQorCisvKiBIb3cgbWFueSBiaXRzIHRvIHNoaWZ0IHBoeXNpY2FsIHF1ZXVlIGFkZHJl c3Mgd3JpdHRlbiB0byBRVUVVRV9QRk4uCisgKiAxMiBpcyBoaXN0b3JpY2FsLCBhbmQgZHVlIHRv IHg4NiBwYWdlIHNpemUuICovCisjZGVmaW5lIFZJUlRJT19QQ0lfUVVFVUVfQUREUl9TSElGVAkx MgorCisvKiBUaGUgYWxpZ25tZW50IHRvIHVzZSBiZXR3ZWVuIGNvbnN1bWVyIGFuZCBwcm9kdWNl ciBwYXJ0cyBvZiB2cmluZy4gKi8KKyNkZWZpbmUgVklSVElPX1BDSV9WUklOR19BTElHTgk0MDk2 CisKKyNlbmRpZiAvKiBfVklSVElPX1BDSV9SRUdfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzL2Rldi92 aXJ0aW8vdmlydGlvLmMgYi9zeXMvZGV2L3ZpcnRpby92aXJ0aW8uYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kZXYvdmlydGlvL3ZpcnRpby5jCkBAIC0wLDAg KzEsMjMxIEBACisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisKKyNpbmNsdWRlIDxzeXMvcGFyYW0u aD4KKyNpbmNsdWRlIDxzeXMvc3lzdG0uaD4KKyNpbmNsdWRlIDxzeXMva2VybmVsLmg+CisjaW5j bHVkZSA8c3lzL21hbGxvYy5oPgorI2luY2x1ZGUgPHN5cy9tb2R1bGUuaD4KKyNpbmNsdWRlIDxz eXMvc2J1Zi5oPgorCisjaW5jbHVkZSA8bWFjaGluZS9idXMuaD4KKyNpbmNsdWRlIDxtYWNoaW5l L3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1ZGUgPHN5cy9ybWFuLmg+ CisKKyNpbmNsdWRlIDxkZXYvdmlydGlvL3ZpcnRpby5oPgorI2luY2x1ZGUgPGRldi92aXJ0aW8v dmlydHF1ZXVlLmg+CisKKyNpbmNsdWRlICJ2aXJ0aW9fYnVzX2lmLmgiCisKK3N0YXRpYyBpbnQg dmlydGlvX21vZGV2ZW50KG1vZHVsZV90LCBpbnQsIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hh ciAqdmlydGlvX2ZlYXR1cmVfbmFtZSh1aW50MzJfdCwgc3RydWN0IHZpcnRpb19mZWF0dXJlX2Rl c2MgKik7CisKK3N0YXRpYyBzdHJ1Y3QgdmlydGlvX2lkZW50IHsKKwl1aW50MTZfdCBkZXZpZDsK KwljaGFyCSpuYW1lOworfSB2aXJ0aW9faWRlbnRfdGFibGVbXSA9IHsKKwl7IFZJUlRJT19JRF9O RVRXT1JLLAkiTmV0d29yayIJfSwKKwl7IFZJUlRJT19JRF9CTE9DSywJIkJsb2NrIgkJfSwKKwl7 IFZJUlRJT19JRF9DT05TT0xFLCAJIkNvbnNvbGUiIAl9LAorCXsgVklSVElPX0lEX0VOVFJPUFks CSJFbnRyb3B5IiAJfSwKKwl7IFZJUlRJT19JRF9CQUxMT09OLAkiQmFsbG9vbiIgCX0sCisJeyBW SVJUSU9fSURfOVAsCQkiOVAgVHJhbnNwb3J0Igl9LAorCisJeyAwLCBOVUxMIH0KK307CisKKy8q IERldmljZSBpbmRlcGVuZGVudCBmZWF0dXJlcy4gKi8KK3N0YXRpYyBzdHJ1Y3QgdmlydGlvX2Zl YXR1cmVfZGVzYyB2aXJ0aW9fY29tbW9uX2ZlYXR1cmVfZGVzY1tdID0geworCXsgVklSVElPX0Zf Tk9USUZZX09OX0VNUFRZLAkiTm90aWZ5T25FbXB0eSIJfSwKKwl7IFZJUlRJT19GX1JJTkdfSU5E SVJFQ1RfREVTQywJIlJpbmdJbmRpcmVjdCIJfSwKKwl7IFZJUlRJT19GX0JBRF9GRUFUVVJFLAkJ IkJhZEZlYXR1cmUiCX0sCisKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3QgY2hhciAqCit2aXJ0 aW9fZGV2aWNlX25hbWUodWludDE2X3QgZGV2aWQpCit7CisJc3RydWN0IHZpcnRpb19pZGVudCAq aWRlbnQ7CisKKwlmb3IgKGlkZW50ID0gdmlydGlvX2lkZW50X3RhYmxlOyBpZGVudC0+bmFtZSAh PSBOVUxMOyBpZGVudCsrKSB7CisJCWlmIChpZGVudC0+ZGV2aWQgPT0gZGV2aWQpCisJCQlyZXR1 cm4gKGlkZW50LT5uYW1lKTsKKwl9CisKKwlyZXR1cm4gKE5VTEwpOworfQorCitzdGF0aWMgY29u c3QgY2hhciAqCit2aXJ0aW9fZmVhdHVyZV9uYW1lKHVpbnQzMl90IHZhbCwgc3RydWN0IHZpcnRp b19mZWF0dXJlX2Rlc2MgKmZlYXR1cmVfZGVzYykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7 IGZlYXR1cmVfZGVzY1tpXS52ZmRfdmFsICE9IDA7IGkrKykKKwkJaWYgKHZhbCA9PSBmZWF0dXJl X2Rlc2NbaV0udmZkX3ZhbCkKKwkJCXJldHVybiAoZmVhdHVyZV9kZXNjW2ldLnZmZF9zdHIpOwor CisJcmV0dXJuIChOVUxMKTsKK30KKwordm9pZAordmlydGlvX2Rlc2NyaWJlKGRldmljZV90IGRl diwgY29uc3QgY2hhciAqbXNnLAorICAgIHVpbnQzMl90IGZlYXR1cmVzLCBzdHJ1Y3QgdmlydGlv X2ZlYXR1cmVfZGVzYyAqZmVhdHVyZV9kZXNjKQoreworCXN0cnVjdCBzYnVmIHNiOworCWNoYXIg KmJ1ZjsKKwljb25zdCBjaGFyICpuYW1lOworCXVpbnQzMl90IHZhbDsKKwlpbnQgaSwgbjsKKwor CWlmICgoYnVmID0gbWFsbG9jKDUxMiwgTV9URU1QLCBNX05PV0FJVCkpID09IE5VTEwpCisJCXJl dHVybjsKKworCXNidWZfbmV3KCZzYiwgYnVmLCA1MTIsIFNCVUZfRklYRURMRU4pOworCXNidWZf cHJpbnRmKCZzYiwgIiVzIGZlYXR1cmVzOiAweCV4IiwgbXNnLCBmZWF0dXJlcyk7CisKKwkvKiBE ZWNvZGUgZmVhdHVyZSBiaXRzIGR1cmluZyB2ZXJib3NlIGJvb3RzLiAqLworCWZvciAobiA9IDAs IGkgPSAzMTsgYm9vdHZlcmJvc2UgJiYgaSA+PSAwOyBpLS0pIHsKKwkJdmFsID0gMSA8PCBpOwor CisJCWlmICgoZmVhdHVyZXMgJiB2YWwpID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAobisr ID09IDApCisJCQlzYnVmX2NhdCgmc2IsICIgPCIpOworCQllbHNlCisJCQlzYnVmX2NhdCgmc2Is ICIsIik7CisKKwkJbmFtZSA9IE5VTEw7CisJCWlmIChmZWF0dXJlX2Rlc2MgIT0gTlVMTCkKKwkJ CW5hbWUgPSB2aXJ0aW9fZmVhdHVyZV9uYW1lKHZhbCwgZmVhdHVyZV9kZXNjKTsKKwkJaWYgKG5h bWUgPT0gTlVMTCkKKwkJCW5hbWUgPSB2aXJ0aW9fZmVhdHVyZV9uYW1lKHZhbCwKKwkJCSAgICB2 aXJ0aW9fY29tbW9uX2ZlYXR1cmVfZGVzYyk7CisKKwkJaWYgKG5hbWUgPT0gTlVMTCkKKwkJCXNi dWZfcHJpbnRmKCZzYiwgIjB4JXgiLCB2YWwpOworCQllbHNlCisJCQlzYnVmX2NhdCgmc2IsIG5h bWUpOworCX0KKworCWlmIChuID4gMCkKKwkJc2J1Zl9jYXQoJnNiLCAiPiIpOworCisjaWYgX19G cmVlQlNEX3ZlcnNpb24gPCA5MDAwMjAKKwlzYnVmX2ZpbmlzaCgmc2IpOworCWlmIChzYnVmX292 ZXJmbG93ZWQoJnNiKSA9PSAwKQorI2Vsc2UKKwlpZiAoc2J1Zl9maW5pc2goJnNiKSA9PSAwKQor I2VuZGlmCisJCWRldmljZV9wcmludGYoZGV2LCAiJXNcbiIsIHNidWZfZGF0YSgmc2IpKTsKKwor CXNidWZfZGVsZXRlKCZzYik7CisJZnJlZShidWYsIE1fVEVNUCk7Cit9CisKKy8qCisgKiBWaXJ0 SU8gYnVzIG1ldGhvZCB3cmFwcGVycy4KKyAqLworCit1aW50MzJfdAordmlydGlvX25lZ290aWF0 ZV9mZWF0dXJlcyhkZXZpY2VfdCBkZXYsIHVpbnQzMl90IGNoaWxkX2ZlYXR1cmVzKQoreworCisJ cmV0dXJuIChWSVJUSU9fQlVTX05FR09USUFURV9GRUFUVVJFUyhkZXZpY2VfZ2V0X3BhcmVudChk ZXYpLAorCSAgICBjaGlsZF9mZWF0dXJlcykpOworfQorCitpbnQKK3ZpcnRpb19hbGxvY192cXMo ZGV2aWNlX3QgZGV2LCBpbnQgZmxhZ3MsIGludCBudnFzLAorICAgIHN0cnVjdCB2cV9hbGxvY19p bmZvICppbmZvKQoreworCisJcmV0dXJuIChWSVJUSU9fQlVTX0FMTE9DX1ZRUyhkZXZpY2VfZ2V0 X3BhcmVudChkZXYpLCBmbGFncywgbnZxcywKKwkgICAgaW5mbykpOworfQorCitpbnQKK3ZpcnRp b19zZXR1cF9pbnRyKGRldmljZV90IGRldiwgZW51bSBpbnRyX3R5cGUgdHlwZSkKK3sKKworCXJl dHVybiAoVklSVElPX0JVU19TRVRVUF9JTlRSKGRldmljZV9nZXRfcGFyZW50KGRldiksIHR5cGUp KTsKK30KKworaW50Cit2aXJ0aW9fd2l0aF9mZWF0dXJlKGRldmljZV90IGRldiwgdWludDMyX3Qg ZmVhdHVyZSkKK3sKKworCXJldHVybiAoVklSVElPX0JVU19XSVRIX0ZFQVRVUkUoZGV2aWNlX2dl dF9wYXJlbnQoZGV2KSwgZmVhdHVyZSkpOworfQorCit2b2lkCit2aXJ0aW9fc3RvcChkZXZpY2Vf dCBkZXYpCit7CisKKwlWSVJUSU9fQlVTX1NUT1AoZGV2aWNlX2dldF9wYXJlbnQoZGV2KSk7Cit9 CisKK2ludAordmlydGlvX3JlaW5pdChkZXZpY2VfdCBkZXYsIHVpbnQzMl90IGZlYXR1cmVzKQor eworCisJcmV0dXJuIChWSVJUSU9fQlVTX1JFSU5JVChkZXZpY2VfZ2V0X3BhcmVudChkZXYpLCBm ZWF0dXJlcykpOworfQorCit2b2lkCit2aXJ0aW9fcmVpbml0X2NvbXBsZXRlKGRldmljZV90IGRl dikKK3sKKworCVZJUlRJT19CVVNfUkVJTklUX0NPTVBMRVRFKGRldmljZV9nZXRfcGFyZW50KGRl dikpOworfQorCit2b2lkCit2aXJ0aW9fcmVhZF9kZXZpY2VfY29uZmlnKGRldmljZV90IGRldiwg YnVzX3NpemVfdCBvZmZzZXQsIHZvaWQgKmRzdCwgaW50IGxlbikKK3sKKwlkZXZpY2VfdCBwYXJl bnQ7CisKKwlwYXJlbnQgPSBkZXZpY2VfZ2V0X3BhcmVudChkZXYpOworCisJVklSVElPX0JVU19S RUFEX0RFVklDRV9DT05GSUcocGFyZW50LCBvZmZzZXQsIGRzdCwgbGVuKTsKK30KKwordm9pZAor dmlydGlvX3dyaXRlX2RldmljZV9jb25maWcoZGV2aWNlX3QgZGV2LCBidXNfc2l6ZV90IG9mZnNl dCwgdm9pZCAqZHN0LCBpbnQgbGVuKQoreworCWRldmljZV90IHBhcmVudDsKKworCXBhcmVudCA9 IGRldmljZV9nZXRfcGFyZW50KGRldik7CisKKwlWSVJUSU9fQlVTX1dSSVRFX0RFVklDRV9DT05G SUcocGFyZW50LCBvZmZzZXQsIGRzdCwgbGVuKTsKK30KKworc3RhdGljIGludAordmlydGlvX21v ZGV2ZW50KG1vZHVsZV90IG1vZCwgaW50IHR5cGUsIHZvaWQgKnVudXNlZCkKK3sKKwlpbnQgZXJy b3I7CisKKwllcnJvciA9IDA7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIE1PRF9MT0FEOgor CWNhc2UgTU9EX1FVSUVTQ0U6CisJY2FzZSBNT0RfVU5MT0FEOgorCWNhc2UgTU9EX1NIVVRET1dO OgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllcnJvciA9IEVPUE5PVFNVUFA7CisJCWJyZWFrOwor CX0KKworCXJldHVybiAoZXJyb3IpOworfQorCitzdGF0aWMgbW9kdWxlZGF0YV90IHZpcnRpb19t b2QgPSB7CisJInZpcnRpbyIsCisJdmlydGlvX21vZGV2ZW50LAorCTAKK307CisKK0RFQ0xBUkVf TU9EVUxFKHZpcnRpbywgdmlydGlvX21vZCwgU0lfU1VCX0RSSVZFUlMsIFNJX09SREVSX0ZJUlNU KTsKK01PRFVMRV9WRVJTSU9OKHZpcnRpbywgMSk7CmRpZmYgLS1naXQgYS9zeXMvZGV2L3ZpcnRp by92aXJ0aW8uaCBiL3N5cy9kZXYvdmlydGlvL3ZpcnRpby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi92aXJ0aW8vdmlydGlvLmgKQEAgLTAsMCArMSwx MDMgQEAKKyNpZm5kZWYgX1ZJUlRJT19IXworI2RlZmluZSBfVklSVElPX0hfCisKKyNpbmNsdWRl IDxzeXMvdHlwZXMuaD4KKworc3RydWN0IHZxX2FsbG9jX2luZm87CisKKy8qIFZpcnRJTyBkZXZp Y2UgSURzLiAqLworI2RlZmluZSBWSVJUSU9fSURfTkVUV09SSwkweDAxCisjZGVmaW5lIFZJUlRJ T19JRF9CTE9DSwkJMHgwMgorI2RlZmluZSBWSVJUSU9fSURfQ09OU09MRQkweDAzCisjZGVmaW5l IFZJUlRJT19JRF9FTlRST1BZCTB4MDQKKyNkZWZpbmUgVklSVElPX0lEX0JBTExPT04JMHgwNQor I2RlZmluZSBWSVJUSU9fSURfOVAJCTB4MDkKKworLyogU3RhdHVzIGJ5dGUgZm9yIGd1ZXN0IHRv IHJlcG9ydCBwcm9ncmVzcy4gKi8KKyNkZWZpbmUgVklSVElPX0NPTkZJR19TVEFUVVNfUkVTRVQJ MHgwMAorI2RlZmluZSBWSVJUSU9fQ09ORklHX1NUQVRVU19BQ0sJMHgwMQorI2RlZmluZSBWSVJU SU9fQ09ORklHX1NUQVRVU19EUklWRVIJMHgwMgorI2RlZmluZSBWSVJUSU9fQ09ORklHX1NUQVRV U19EUklWRVJfT0sgCTB4MDQKKyNkZWZpbmUgVklSVElPX0NPTkZJR19TVEFUVVNfRkFJTEVECTB4 ODAKKworLyoKKyAqIEdlbmVyYXRlIGludGVycnVwdCB3aGVuIHRoZSB2aXJ0cXVldWUgcmluZyBp cworICogY29tcGxldGVseSB1c2VkLCBldmVuIGlmIHdlJ3ZlIHN1cHByZXNzZWQgdGhlbS4KKyAq LworI2RlZmluZSBWSVJUSU9fRl9OT1RJRllfT05fRU1QVFkgKDEgPDwgMjQpCisKKy8qCisgKiBU aGUgZ3Vlc3Qgc2hvdWxkIG5ldmVyIG5lZ290aWF0ZSB0aGlzIGZlYXR1cmU7IGl0CisgKiBpcyB1 c2VkIHRvIGRldGVjdCBmYXVsdHkgZHJpdmVycy4KKyAqLworI2RlZmluZSBWSVJUSU9fRl9CQURf RkVBVFVSRSAoMSA8PCAzMCkKKworLyoKKyAqIFNvbWUgVmlydElPIGZlYXR1cmUgYml0cyAoY3Vy cmVudGx5IGJpdHMgMjggdGhyb3VnaCAzMSkgYXJlCisgKiByZXNlcnZlZCBmb3IgdGhlIHRyYW5z cG9ydCBiZWluZyB1c2VkIChlZy4gdmlydGlvX3JpbmcpLCB0aGUKKyAqIHJlc3QgYXJlIHBlci1k ZXZpY2UgZmVhdHVyZSBiaXRzLgorICovCisjZGVmaW5lIFZJUlRJT19UUkFOU1BPUlRfRl9TVEFS VAkyOAorI2RlZmluZSBWSVJUSU9fVFJBTlNQT1JUX0ZfRU5ECQkzMgorCitzdHJ1Y3QgdmlydGlv X2ZlYXR1cmVfZGVzYyB7CisJdWludDMyX3QJIHZmZF92YWw7CisJY2hhcgkJKnZmZF9zdHI7Cit9 OworCitzdHJ1Y3QgdmlydGlvX2l2YXJzIHsKKwl1aW50MTZfdAkJCSB2dGl2YXJfZGV2dHlwZTsK KwlzdHJ1Y3QgdmlydGlvX2ZlYXR1cmVfZGVzYwkqdnRpdmFyX2ZlYXR1cmVzOworfTsKKworY29u c3QgY2hhciAqdmlydGlvX2RldmljZV9uYW1lKHVpbnQxNl90IGRldmlkKTsKKwordm9pZAkgdmly dGlvX2Rlc2NyaWJlKGRldmljZV90IGRldiwgY29uc3QgY2hhciAqbXNnLAorCSAgICAgIHVpbnQz Ml90IGZlYXR1cmVzLAorCSAgICAgIHN0cnVjdCB2aXJ0aW9fZmVhdHVyZV9kZXNjICpmZWF0dXJl X2Rlc2MpOworCisvKgorICogVmlydElPIEJ1cyBNZXRob2RzLgorICovCit1aW50MzJfdCB2aXJ0 aW9fbmVnb3RpYXRlX2ZlYXR1cmVzKGRldmljZV90IGRldiwgdWludDMyX3QgY2hpbGRfZmVhdHVy ZXMpOworaW50CSB2aXJ0aW9fYWxsb2NfdnFzKGRldmljZV90IGRldiwgaW50IGZsYWdzLCBpbnQg bnZxcywKKwkgICAgIHN0cnVjdCB2cV9hbGxvY19pbmZvICppbmZvKTsKK2ludAkgdmlydGlvX3Nl dHVwX2ludHIoZGV2aWNlX3QgZGV2LCBlbnVtIGludHJfdHlwZSB0eXBlKTsKK2ludCAJIHZpcnRp b193aXRoX2ZlYXR1cmUoZGV2aWNlX3QgZGV2LCB1aW50MzJfdCBmZWF0dXJlKTsKK3ZvaWQJIHZp cnRpb19zdG9wKGRldmljZV90IGRldik7CitpbnQJIHZpcnRpb19yZWluaXQoZGV2aWNlX3QgZGV2 LCB1aW50MzJfdCBmZWF0dXJlcyk7Cit2b2lkCSB2aXJ0aW9fcmVpbml0X2NvbXBsZXRlKGRldmlj ZV90IGRldik7CisKKy8qCisgKiBSZWFkL3dyaXRlIGEgdmFyaWFibGUgYW1vdW50IGZyb20gdGhl IGRldmljZSBzcGVjaWZpYyAoaWUsIG5ldHdvcmspCisgKiBjb25maWd1cmF0aW9uIHJlZ2lvbi4g VGhpcyByZWdpb24gbXVzdCBiZSBlbmNvZGVkIGluIHRoZSBzYW1lCisgKiBlbmRpYW5uZXNzIG9m IHRoZSBndWVzdCwgc28gd2UgY2FuIHJlYWQgZmllbGRzIGdyZWF0ZXIgdGhhbiBvbmUgYnl0ZSwK KyAqIG9uZSBieXRlIGF0IGEgdGltZS4KKyAqLwordm9pZAkgdmlydGlvX3JlYWRfZGV2aWNlX2Nv bmZpZyhkZXZpY2VfdCBkZXYsIGJ1c19zaXplX3Qgb2Zmc2V0LAorCSAgICAgdm9pZCAqZHN0LCBp bnQgbGVuKTsKK3ZvaWQJIHZpcnRpb193cml0ZV9kZXZpY2VfY29uZmlnKGRldmljZV90IGRldiwg YnVzX3NpemVfdCBvZmZzZXQsCisJICAgICB2b2lkICpkc3QsIGludCBsZW4pOworCisvKiBQcm92 aWRlIHJlYWQvd3JpdGUgbWFjcm9zIGZvciBjb21tb24gbGVuZ3Rocy4gKi8KKyNkZWZpbmUgVklS VElPX1JEV1JfREVWSUNFX0NPTkZJRyh0eXBlLCBzaXplKSBcCitzdGF0aWMgaW5saW5lIHR5cGUg XAorX19DT05DQVQodmlydGlvX3JlYWRfZGV2X2NvbmZpZ18sc2l6ZSkoZGV2aWNlX3QgZGV2LCBc CisgICAgYnVzX3NpemVfdCBvZmZzZXQpIFwKK3sgXAorCXR5cGUgZDsgXAorCXZpcnRpb19yZWFk X2RldmljZV9jb25maWcoZGV2LCBvZmZzZXQsICZkLCBzaXplb2YodHlwZSkpOyBcCisJcmV0dXJu IChkKTsgXAorfSBcCitzdGF0aWMgaW5saW5lIHZvaWQgXAorX19DT05DQVQodmlydGlvX3dyaXRl X2Rldl9jb25maWdfLHNpemUpKGRldmljZV90IGRldiwgXAorICAgIGJ1c19zaXplX3Qgb2Zmc2V0 LCB0eXBlIHMpIFwKK3sgXAorCXZpcnRpb193cml0ZV9kZXZpY2VfY29uZmlnKGRldiwgb2Zmc2V0 LCAmcywgc2l6ZW9mKHR5cGUpKTsgXAorfQorCitWSVJUSU9fUkRXUl9ERVZJQ0VfQ09ORklHKHVp bnQ4X3QsIDEpOworVklSVElPX1JEV1JfREVWSUNFX0NPTkZJRyh1aW50MTZfdCwgMik7CitWSVJU SU9fUkRXUl9ERVZJQ0VfQ09ORklHKHVpbnQzMl90LCA0KTsKKworI2VuZGlmIC8qIF9WSVJUSU9f SF8gKi8KZGlmZiAtLWdpdCBhL3N5cy9kZXYvdmlydGlvL3ZpcnRpb19idXNfaWYubSBiL3N5cy9k ZXYvdmlydGlvL3ZpcnRpb19idXNfaWYubQpuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rldi9u dWxsCisrKyBiL3N5cy9kZXYvdmlydGlvL3ZpcnRpb19idXNfaWYubQpAQCAtMCwwICsxLDY1IEBA CisjaW5jbHVkZSA8c3lzL2J1cy5oPgorI2luY2x1ZGUgPG1hY2hpbmUvYnVzLmg+CisKK0lOVEVS RkFDRSB2aXJ0aW9fYnVzOworCitIRUFERVIgeworc3RydWN0IHZxX2FsbG9jX2luZm87Cit9Owor CitNRVRIT0QgdWludDMyX3QgbmVnb3RpYXRlX2ZlYXR1cmVzIHsKKwlkZXZpY2VfdAlkZXY7CisJ dWludDMyX3QJY2hpbGRfZmVhdHVyZXM7Cit9OworCitNRVRIT0QgaW50IHdpdGhfZmVhdHVyZSB7 CisJZGV2aWNlX3QJZGV2OworCXVpbnQzMl90CWZlYXR1cmU7Cit9OworCitNRVRIT0QgaW50IGFs bG9jX3ZxcyB7CisJZGV2aWNlX3QJZGV2OworCWludAkJZmxhZ3M7CisJaW50CQludnFzOworCXN0 cnVjdCB2cV9hbGxvY19pbmZvICppbmZvOworfTsKK0hFQURFUiB7CisjZGVmaW5lIFZJUlRJT19B TExPQ19WUVNfRElTQUJMRV9NU0lYIDB4MQorfTsKKworTUVUSE9EIGludCBzZXR1cF9pbnRyIHsK KwlkZXZpY2VfdAlkZXY7CisJZW51bSBpbnRyX3R5cGUJdHlwZTsKK307CisKK01FVEhPRCB2b2lk IHN0b3AgeworCWRldmljZV90CWRldjsKK307CisKK01FVEhPRCBpbnQgcmVpbml0IHsKKwlkZXZp Y2VfdAlkZXY7CisJdWludDMyX3QJZmVhdHVyZXM7Cit9OworCitNRVRIT0Qgdm9pZCByZWluaXRf Y29tcGxldGUgeworCWRldmljZV90CWRldjsKK307CisKK01FVEhPRCB2b2lkIG5vdGlmeV92cSB7 CisJZGV2aWNlX3QJZGV2OworCXVpbnQxNl90CXF1ZXVlOworfTsKKworTUVUSE9EIHZvaWQgcmVh ZF9kZXZpY2VfY29uZmlnIHsKKwlkZXZpY2VfdAlkZXY7CisJYnVzX3NpemVfdAlvZmZzZXQ7CisJ dm9pZAkJKmRzdDsKKwlpbnQJCWxlbjsKK307CisKK01FVEhPRCB2b2lkIHdyaXRlX2RldmljZV9j b25maWcgeworCWRldmljZV90CWRldjsKKwlidXNfc2l6ZV90CW9mZnNldDsKKwl2b2lkCQkqc3Jj OworCWludAkJbGVuOworfTsKZGlmZiAtLWdpdCBhL3N5cy9kZXYvdmlydGlvL3ZpcnRpb19pZi5t IGIvc3lzL2Rldi92aXJ0aW8vdmlydGlvX2lmLm0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9k ZXYvbnVsbAorKysgYi9zeXMvZGV2L3ZpcnRpby92aXJ0aW9faWYubQpAQCAtMCwwICsxLDcgQEAK KyNpbmNsdWRlIDxzeXMvYnVzLmg+CisKK0lOVEVSRkFDRSB2aXJ0aW87CisKK01FVEhPRCBpbnQg Y29uZmlnX2NoYW5nZSB7CisJZGV2aWNlX3QJZGV2OworfTsKZGlmZiAtLWdpdCBhL3N5cy9kZXYv dmlydGlvL3ZpcnRpb19yaW5nLmggYi9zeXMvZGV2L3ZpcnRpby92aXJ0aW9fcmluZy5oCm5ldyBm aWxlIG1vZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi92aXJ0aW8vdmlydGlv X3JpbmcuaApAQCAtMCwwICsxLDE0NSBAQAorLyogQW4gaW50ZXJmYWNlIGZvciBlZmZpY2llbnQg dmlydGlvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIFRoaXMgaGVhZGVyIGlzIEJTRCBsaWNlbnNl ZCBzbyBhbnlvbmUgY2FuIHVzZSB0aGUgZGVmaW5pdGlvbnMKKyAqIHRvIGltcGxlbWVudCBjb21w YXRpYmxlIGRyaXZlcnMvc2VydmVycy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNywgMjAwOSwgSUJN IENvcnBvcmF0aW9uCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0 aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVp dGhlciB0aGUgbmFtZSBvZiBJQk0gbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisg KiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBm cm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw ZXJtaXNzaW9uLgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBP UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI QUxMIElCTSBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5E SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAor ICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G IFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5E IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QK KyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF KSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUs IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgor ICovCisKKyNpZm5kZWYgVklSVElPX1JJTkdfSAorI2RlZmluZQlWSVJUSU9fUklOR19ICisKKyNp bmNsdWRlIDxzeXMvdHlwZXMuaD4KKworLyogVGhpcyBtYXJrcyBhIGJ1ZmZlciBhcyBjb250aW51 aW5nIHZpYSB0aGUgbmV4dCBmaWVsZC4gKi8KKyNkZWZpbmUgVlJJTkdfREVTQ19GX05FWFQgICAg ICAgMQorLyogVGhpcyBtYXJrcyBhIGJ1ZmZlciBhcyB3cml0ZS1vbmx5IChvdGhlcndpc2UgcmVh ZC1vbmx5KS4gKi8KKyNkZWZpbmUgVlJJTkdfREVTQ19GX1dSSVRFICAgICAgMgorLyogVGhpcyBt ZWFucyB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgbGlzdCBvZiBidWZmZXIgZGVzY3JpcHRvcnMuICov CisjZGVmaW5lIFZSSU5HX0RFU0NfRl9JTkRJUkVDVAk0CisKKy8qIFRoZSBIb3N0IHVzZXMgdGhp cyBpbiB1c2VkLT5mbGFncyB0byBhZHZpc2UgdGhlIEd1ZXN0OiBkb24ndCBraWNrIG1lCisgKiB3 aGVuIHlvdSBhZGQgYSBidWZmZXIuICBJdCdzIHVucmVsaWFibGUsIHNvIGl0J3Mgc2ltcGx5IGFu CisgKiBvcHRpbWl6YXRpb24uICBHdWVzdCB3aWxsIHN0aWxsIGtpY2sgaWYgaXQncyBvdXQgb2Yg YnVmZmVycy4gKi8KKyNkZWZpbmUgVlJJTkdfVVNFRF9GX05PX05PVElGWSAgMQorLyogVGhlIEd1 ZXN0IHVzZXMgdGhpcyBpbiBhdmFpbC0+ZmxhZ3MgdG8gYWR2aXNlIHRoZSBIb3N0OiBkb24ndAor ICogaW50ZXJydXB0IG1lIHdoZW4geW91IGNvbnN1bWUgYSBidWZmZXIuICBJdCdzIHVucmVsaWFi bGUsIHNvIGl0J3MKKyAqIHNpbXBseSBhbiBvcHRpbWl6YXRpb24uICAqLworI2RlZmluZSBWUklO R19BVkFJTF9GX05PX0lOVEVSUlVQVCAgICAgIDEKKworLyogVmlydGlvIHJpbmcgZGVzY3JpcHRv cnM6IDE2IGJ5dGVzLgorICogVGhlc2UgY2FuIGNoYWluIHRvZ2V0aGVyIHZpYSAibmV4dCIuICov CitzdHJ1Y3QgdnJpbmdfZGVzYyB7CisgICAgICAgIC8qIEFkZHJlc3MgKGd1ZXN0LXBoeXNpY2Fs KS4gKi8KKyAgICAgICAgdWludDY0X3QgYWRkcjsKKyAgICAgICAgLyogTGVuZ3RoLiAqLworICAg ICAgICB1aW50MzJfdCBsZW47CisgICAgICAgIC8qIFRoZSBmbGFncyBhcyBpbmRpY2F0ZWQgYWJv dmUuICovCisgICAgICAgIHVpbnQxNl90IGZsYWdzOworICAgICAgICAvKiBXZSBjaGFpbiB1bnVz ZWQgZGVzY3JpcHRvcnMgdmlhIHRoaXMsIHRvby4gKi8KKyAgICAgICAgdWludDE2X3QgbmV4dDsK K307CisKK3N0cnVjdCB2cmluZ19hdmFpbCB7CisgICAgICAgIHVpbnQxNl90IGZsYWdzOworICAg ICAgICB1aW50MTZfdCBpZHg7CisgICAgICAgIHVpbnQxNl90IHJpbmdbMF07Cit9OworCisvKiB1 aW50MzJfdCBpcyB1c2VkIGhlcmUgZm9yIGlkcyBmb3IgcGFkZGluZyByZWFzb25zLiAqLworc3Ry dWN0IHZyaW5nX3VzZWRfZWxlbSB7CisgICAgICAgIC8qIEluZGV4IG9mIHN0YXJ0IG9mIHVzZWQg ZGVzY3JpcHRvciBjaGFpbi4gKi8KKyAgICAgICAgdWludDMyX3QgaWQ7CisgICAgICAgIC8qIFRv dGFsIGxlbmd0aCBvZiB0aGUgZGVzY3JpcHRvciBjaGFpbiB3aGljaCB3YXMgd3JpdHRlbiB0by4g Ki8KKyAgICAgICAgdWludDMyX3QgbGVuOworfTsKKworc3RydWN0IHZyaW5nX3VzZWQgeworICAg ICAgICB1aW50MTZfdCBmbGFnczsKKyAgICAgICAgdWludDE2X3QgaWR4OworICAgICAgICBzdHJ1 Y3QgdnJpbmdfdXNlZF9lbGVtIHJpbmdbMF07Cit9OworCitzdHJ1Y3QgdnJpbmcgeworCXVuc2ln bmVkIGludCBudW07IC8qIHVudXNlZCAqLworCisJc3RydWN0IHZyaW5nX2Rlc2MgKmRlc2M7CisJ c3RydWN0IHZyaW5nX2F2YWlsICphdmFpbDsKKwlzdHJ1Y3QgdnJpbmdfdXNlZCAqdXNlZDsKK307 CisKKy8qIFRoZSBzdGFuZGFyZCBsYXlvdXQgZm9yIHRoZSByaW5nIGlzIGEgY29udGludW91cyBj aHVuayBvZiBtZW1vcnkgd2hpY2gKKyAqIGxvb2tzIGxpa2UgdGhpcy4gIFdlIGFzc3VtZSBudW0g aXMgYSBwb3dlciBvZiAyLgorICoKKyAqIHN0cnVjdCB2cmluZyB7CisgKiAgICAgIC8vIFRoZSBh Y3R1YWwgZGVzY3JpcHRvcnMgKDE2IGJ5dGVzIGVhY2gpCisgKiAgICAgIHN0cnVjdCB2cmluZ19k ZXNjIGRlc2NbbnVtXTsKKyAqCisgKiAgICAgIC8vIEEgcmluZyBvZiBhdmFpbGFibGUgZGVzY3Jp cHRvciBoZWFkcyB3aXRoIGZyZWUtcnVubmluZyBpbmRleC4KKyAqICAgICAgX191MTYgYXZhaWxf ZmxhZ3M7CisgKiAgICAgIF9fdTE2IGF2YWlsX2lkeDsKKyAqICAgICAgX191MTYgYXZhaWxhYmxl W251bV07CisgKgorICogICAgICAvLyBQYWRkaW5nIHRvIHRoZSBuZXh0IGFsaWduIGJvdW5kYXJ5 LgorICogICAgICBjaGFyIHBhZFtdOworICoKKyAqICAgICAgLy8gQSByaW5nIG9mIHVzZWQgZGVz Y3JpcHRvciBoZWFkcyB3aXRoIGZyZWUtcnVubmluZyBpbmRleC4KKyAqICAgICAgX191MTYgdXNl ZF9mbGFnczsKKyAqICAgICAgX191MTYgdXNlZF9pZHg7CisgKiAgICAgIHN0cnVjdCB2cmluZ191 c2VkX2VsZW0gdXNlZFtudW1dOworICogfTsKKyAqCisgKiBOT1RFOiBmb3IgVmlydElPIFBDSSwg YWxpZ24gaXMgNDA5Ni4KKyAqLworCitzdGF0aWMgaW5saW5lIGludAordnJpbmdfc2l6ZSh1bnNp Z25lZCBpbnQgbnVtLCB1bnNpZ25lZCBsb25nIGFsaWduKQoreworCWludCBzaXplOworCisJc2l6 ZSA9IG51bSAqIHNpemVvZihzdHJ1Y3QgdnJpbmdfZGVzYyk7CisJc2l6ZSArPSBzaXplb2Yoc3Ry dWN0IHZyaW5nX2F2YWlsKSArIChudW0gKiBzaXplb2YodWludDE2X3QpKTsKKwlzaXplID0gKHNp emUgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworCXNpemUgKz0gc2l6ZW9mKHN0cnVjdCB2 cmluZ191c2VkKSArCisJICAgIChudW0gKiBzaXplb2Yoc3RydWN0IHZyaW5nX3VzZWRfZWxlbSkp OworCXJldHVybiAoc2l6ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordnJpbmdfaW5pdChz dHJ1Y3QgdnJpbmcgKnZyLCB1bnNpZ25lZCBpbnQgbnVtLCB1aW50OF90ICpwLAorICAgIHVuc2ln bmVkIGxvbmcgYWxpZ24pCit7CisgICAgICAgIHZyLT5udW0gPSBudW07CisgICAgICAgIHZyLT5k ZXNjID0gKHN0cnVjdCB2cmluZ19kZXNjICopIHA7CisgICAgICAgIHZyLT5hdmFpbCA9IChzdHJ1 Y3QgdnJpbmdfYXZhaWwgKikgKHAgKworCSAgICBudW0gKiBzaXplb2Yoc3RydWN0IHZyaW5nX2Rl c2MpKTsKKyAgICAgICAgdnItPnVzZWQgPSAodm9pZCAqKQorCSAgICAoKCh1bnNpZ25lZCBsb25n KSAmdnItPmF2YWlsLT5yaW5nW251bV0gKyBhbGlnbi0xKSAmIH4oYWxpZ24tMSkpOworfQorCisK KyNlbmRpZiAvKiBWSVJUSU9fUklOR19IICovCmRpZmYgLS1naXQgYS9zeXMvZGV2L3ZpcnRpby92 aXJ0cXVldWUuYyBiL3N5cy9kZXYvdmlydGlvL3ZpcnRxdWV1ZS5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lzL2Rldi92aXJ0aW8vdmlydHF1ZXVlLmMKQEAgLTAs MCArMSw2NjAgQEAKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKworI2luY2x1ZGUgPHN5cy9wYXJh bS5oPgorI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgorI2luY2x1ZGUgPHN5cy9rZXJuZWwuaD4KKyNp bmNsdWRlIDxzeXMvbWFsbG9jLmg+CisjaW5jbHVkZSA8c3lzL3NnbGlzdC5oPgorI2luY2x1ZGUg PHZtL3ZtLmg+CisjaW5jbHVkZSA8dm0vcG1hcC5oPgorCisjaW5jbHVkZSA8bWFjaGluZS9idXMu aD4KKyNpbmNsdWRlIDxtYWNoaW5lL3Jlc291cmNlLmg+CisjaW5jbHVkZSA8c3lzL2J1cy5oPgor I2luY2x1ZGUgPHN5cy9ybWFuLmg+CisKKyNpbmNsdWRlIDxtYWNoaW5lL2F0b21pYy5oPgorCisj aW5jbHVkZSA8ZGV2L3ZpcnRpby92aXJ0aW8uaD4KKyNpbmNsdWRlIDxkZXYvdmlydGlvL3ZpcnRx dWV1ZS5oPgorI2luY2x1ZGUgPGRldi92aXJ0aW8vdmlydGlvX3JpbmcuaD4KKworI2luY2x1ZGUg InZpcnRpb19idXNfaWYuaCIKKworc3RydWN0IHZpcnRxdWV1ZSB7CisJZGV2aWNlX3QJIAkgdnFf ZGV2OworCWNoYXIJCSAJIHZxX25hbWVbVklSVFFVRVVFX01BWF9OQU1FX1NaXTsKKwl1aW50MTZf dAkgCSB2cV9xdWV1ZV9pbmRleDsKKwl1aW50MTZfdAkgCSB2cV9uZW50cmllczsKKwl1aW50MzJf dAkgCSB2cV9mbGFnczsKKyNkZWZpbmUJVklSVFFVRVVFX0lORElSRUNUCSAweDAwMDEKKworCWlu dAkJCSB2cV9hbGlnbm1lbnQ7CisJaW50CQkgCSB2cV9yaW5nX3NpemU7CisJdm9pZAkJCSp2cV9y aW5nX21lbTsKKwlpbnQJCQkgdnFfbWF4X2luZGlyZWN0X3N6OworCWludAkJCSB2cV9pbmRpcmVj dF9tZW1fc3o7CisJc3RydWN0IHZyaW5nX2Rlc2MJKnZxX2luZGlyZWN0X21lbTsKKwl2aXJ0cXVl dWVfaW50cl90CSp2cV9pbnRyaGFuZDsKKwl2b2lkCQkJKnZxX2ludHJoYW5kX2FyZzsKKworCXN0 cnVjdCB2cmluZwkJIHZxX3ZyaW5nOworCS8qIE51bWJlciBvZiBmcmVlIGRlc2NyaXB0b3JzLiAq LworCXVpbnQxNl90CQkgdnFfZnJlZV9jbnQ7CisJLyogSW5kZXggb2YgZmlyc3QgZnJlZSBkZXNj cmlwdG9yLiAqLworCXVpbnQxNl90CQkgdnFfaGVhZF9pZHg7CisJLyogTnVtYmVyIG9mIGRlc2Ny aXB0b3JzIGF3YWl0aW5nIHZpcnRpb19zeW5jKCkuICovCisJdWludDE2X3QJCSB2cV9xdWV1ZWRf Y250OworCS8qIEluZGV4IG9mIGxhc3QgZGVzY3JpcHRvciB3ZSd2ZSBwcm9jZXNzZWQuICovCisJ dWludDE2X3QJCSB2cV9sYXN0X3VzZWRfaWR4OworCisJLyoKKwkgKiBUT0RPIFRoaXMgZG9lc24n dCBuZWVkIHRvIGJlIGEgc3RydWN0IGFueW1vcmUuIEJhY2sKKwkgKiB3aGVuIHRoZSBpbmRpcmVj dCBkZXNjcmlwdG9ycyB3ZXJlbid0IHByZWFsbG9jYXRlZCwKKwkgKiB0aGUgYWRkcmVzcyB3YXMg YWxzbyBodW5nIG9mZiBoZXJlLgorCSAqLworCXN0cnVjdCB2cV9kZXNjX2V4dHJhIHsKKwkJdm9p ZCAJKmNvb2tpZTsKKwl9IHZxX2Rlc2N4WzBdOworfTsKKworLyoKKyAqIFRoZSBhcmNoaXRlY3Rl ZCBtYXhpbXVtIHZpcnRxdWV1ZSBzaXplIGlzIDJeMTUsIHNvCisgKiB0aGlzIHdpbGwgbmV2ZXIg YmUgYSB2YWxpZCBpbmRleCBpbiB0aGUgZGVzY3JpcHRvcgorICogY2hhaW4uIFdlIHVzZSB0aGlz IHRvIHZlcmlmeSB3ZSBhcmUgbm90IG1pc3MtaGFuZGxpbmcKKyAqIHZxX2ZyZWVfY250LgorICov CisjZGVmaW5lIFZRX1JJTkdfREVTQ19DSEFJTl9FTkQgMzI3NjgKKworI2RlZmluZSBWUUFTU0VS VChfdnEsIF9leHAsIF9tc2csIC4uLikgXAorCUtBU1NFUlQoKF9leHApLCgiJXM6ICVzIC0gIl9t c2csIF9fZnVuY19fLCBcCisJICAgIChfdnEpLT52cV9uYW1lLCAjI19fVkFfQVJHU19fKSkKKwor I2RlZmluZSBWUV9SSU5HX0FTU0VSVF9WQUxJRF9JRFgoX3ZxLCBfaWR4KSBcCisJICAgIFZRQVNT RVJUKChfdnEpLCAoX2lkeCkgPCAoX3ZxKS0+dnFfbmVudHJpZXMsIFwKKwkJImludmFsaWQgcmlu ZyBpbmRleDogJWQsIG1heDogJWQiLCBcCisJCShfaWR4KSwgKF92cSktPnZxX25lbnRyaWVzKQor CisjZGVmaW5lIFZRX1JJTkdfQVNTRVJUX0NIQUlOX1RFUk0oX3ZxKSBcCisgICAgCSAgICBWUUFT U0VSVCgoX3ZxKSwgKF92cSktPnZxX2hlYWRfaWR4ID09IFZRX1JJTkdfREVTQ19DSEFJTl9FTkQs IFwKKwkJImZ1bGwgcmluZyBub3QgdGVybWluYXRlZCBjb3JyZWN0bHkiKQorCitzdGF0aWMgaW50 CXZpcnRxdWV1ZV9pbml0X2luZGlyZWN0KHN0cnVjdCB2aXJ0cXVldWUgKnZxKTsKK3N0YXRpYyB2 b2lkCXZpcnRxdWV1ZV9mcmVlX2luZGlyZWN0KHN0cnVjdCB2aXJ0cXVldWUgKnZxKTsKKworc3Rh dGljIHZvaWQJdnFfcmluZ19pbml0KHN0cnVjdCB2aXJ0cXVldWUgKik7CitzdGF0aWMgaW50CXZx X3JpbmdfZG9faW5kaXJlY3Qoc3RydWN0IHZpcnRxdWV1ZSAqLCBpbnQpOworc3RhdGljIHZvaWQJ dnFfcmluZ19lbnF1ZXVlX2luZGlyZWN0KHN0cnVjdCB2aXJ0cXVldWUgKiwgdm9pZCAqLAorICAg IAkJICAgIHN0cnVjdCBzZ2xpc3QgKiwgaW50LCBpbnQpOworc3RhdGljIHZvaWQJdnFfcmluZ19m cmVlX2NoYWluKHN0cnVjdCB2aXJ0cXVldWUgKiwgaW50KTsKKwordWludDMyX3QKK3ZpcnRxdWV1 ZV9maWx0ZXJfZmVhdHVyZXModWludDMyX3QgZmVhdHVyZXMpCit7CisJdWludDMyX3QgbWFzazsK KworCW1hc2sgPSAoKDEgPDwgVklSVElPX1RSQU5TUE9SVF9GX1NUQVJUKSAtIDEpOworCW1hc2sg fD0gVklSVElPX0ZfUklOR19JTkRJUkVDVF9ERVNDOworCisJcmV0dXJuIChmZWF0dXJlcyAmIG1h c2spOworfQorCitpbnQKK3ZpcnRxdWV1ZV9hbGxvYyhkZXZpY2VfdCBkZXYsIHVpbnQxNl90IHF1 ZXVlLCB1aW50MTZfdCBzaXplLAorICAgIGludCBhbGlnbiwgc3RydWN0IHZxX2FsbG9jX2luZm8g KmluZm8sIHN0cnVjdCB2aXJ0cXVldWUgKip2cXApCit7CisJc3RydWN0IHZpcnRxdWV1ZSAqdnE7 CisJaW50IGVycm9yOworCisJKnZxcCA9IE5VTEw7CisJZXJyb3IgPSAwOworCisJaWYgKHNpemUg PT0gMCkgeworCQlkZXZpY2VfcHJpbnRmKGRldiwgInZpcnRxdWV1ZSBzaXplIGlzIHplcm9cbiIp OworCQlyZXR1cm4gKEVOT0RFVik7CisJfSBlbHNlIGlmICghcG93ZXJvZjIoc2l6ZSkpIHsKKwkJ ZGV2aWNlX3ByaW50ZihkZXYsICJ2aXJ0cXVldWUgc2l6ZSBpcyBub3QgcG93ZXIgb2YgMjogJWRc biIsCisJCSAgICBzaXplKTsKKwkJcmV0dXJuIChFTlhJTyk7CisJfQorCisJdnEgPSBtYWxsb2Mo c2l6ZW9mKHN0cnVjdCB2aXJ0cXVldWUpICsKKwkgICAgc2l6ZSAqIHNpemVvZihzdHJ1Y3QgdnFf ZGVzY19leHRyYSksIE1fREVWQlVGLAorCSAgICBNX05PV0FJVCB8IE1fWkVSTyk7CisJaWYgKHZx ID09IE5VTEwpIHsKKwkJZGV2aWNlX3ByaW50ZihkZXYsICJjYW5ub3QgYWxsb2NhdGUgdmlydHF1 ZXVlXG4iKTsKKwkJcmV0dXJuIChFTk9NRU0pOworCX0KKworCS8qIEluaXRpYWxpemUgdmlydHF1 ZXVlLiAqLworCXZxLT52cV9kZXYgPSBkZXY7CisJc3RybGNweSh2cS0+dnFfbmFtZSwgaW5mby0+ dnFhaV9uYW1lLCBzaXplb2YodnEtPnZxX25hbWUpKTsKKwl2cS0+dnFfcXVldWVfaW5kZXggPSBx dWV1ZTsKKwl2cS0+dnFfYWxpZ25tZW50ID0gYWxpZ247CisJdnEtPnZxX25lbnRyaWVzID0gc2l6 ZTsKKwl2cS0+dnFfZnJlZV9jbnQgPSBzaXplOworCXZxLT52cV9tYXhfaW5kaXJlY3Rfc3ogPSBp bmZvLT52cWFpX21heGluZGlyc3o7CisJdnEtPnZxX2ludHJoYW5kID0gaW5mby0+dnFhaV9pbnRy OworCXZxLT52cV9pbnRyaGFuZF9hcmcgPSBpbmZvLT52cWFpX2ludHJfYXJnOworCisJLyogQWxs b2NhdGUgbWVtb3J5IGZvciBpbmRpcmVjdCBkZXNjcmlwdG9ycy4gKi8KKwlpZiAodnEtPnZxX21h eF9pbmRpcmVjdF9zeiA+IDEgJiYKKwkgICAgVklSVElPX0JVU19XSVRIX0ZFQVRVUkUoZGV2LAor CSAgICAgICAgVklSVElPX0ZfUklOR19JTkRJUkVDVF9ERVNDKSkgeworCisJCWVycm9yID0gdmly dHF1ZXVlX2luaXRfaW5kaXJlY3QodnEpOworCQlpZiAoZXJyb3IpIHsKKwkJCWRldmljZV9wcmlu dGYoZGV2LCAiY2Fubm90IGFsbG9jYXRlIG1lbW9yeSAiCisJCQkgICAgImZvciBpbmRpcmVjdCBk ZXNjcmlwdG9yc1xuIik7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwkvKgorCSAqIEFsbG9j YXRlIG1lbW9yeSBmb3IgdGhlIHZyaW5nLgorCSAqIFhYWDogVGhlIDRHQiB1cHBlciBib3VuZGFy eSBpcyBhIFBDSSBsaW1pdGF0aW9uLgorCSAqLworCXZxLT52cV9yaW5nX3NpemUgPSByb3VuZF9w YWdlKHZyaW5nX3NpemUoc2l6ZSwgYWxpZ24pKTsKKwl2cS0+dnFfcmluZ19tZW0gPSBjb250aWdt YWxsb2ModnEtPnZxX3Jpbmdfc2l6ZSwgTV9ERVZCVUYsCisJICAgIE1fV0FJVE9LIHwgTV9aRVJP LCAwLCAweEZGRkZGRkZGVUwsIFBBR0VfU0laRSwgMCk7CisJaWYgKHZxLT52cV9yaW5nX21lbSA9 PSBOVUxMKSB7CisJCWRldmljZV9wcmludGYoZGV2LAorCQkgICAgImNhbm5vdCBhbGxvY2F0ZSBt ZW1vcnkgZm9yIHZpcnRxdWV1ZSByaW5nXG4iKTsKKwkJZXJyb3IgPSBFTk9NRU07CisJCWdvdG8g ZmFpbDsKKwl9CisKKwl2cV9yaW5nX2luaXQodnEpOworCisJLyogRGVmYXVsdCB0byBpbnRlcnJ1 cHRzIGRpc2FibGVkLiAqLworCXZpcnRxdWV1ZV9kaXNhYmxlX2ludHIodnEpOworCisJKnZxcCA9 IHZxOworCitmYWlsOgorCWlmIChlcnJvcikKKwkJdmlydHF1ZXVlX2ZyZWUodnEpOworCisJcmV0 dXJuIChlcnJvcik7Cit9CisKK3N0YXRpYyBpbnQKK3ZpcnRxdWV1ZV9pbml0X2luZGlyZWN0KHN0 cnVjdCB2aXJ0cXVldWUgKnZxKQoreworCXN0cnVjdCB2cmluZ19kZXNjICpkZXNjOworCWludCBz aXplOworCisJc2l6ZSA9IHZxLT52cV9tYXhfaW5kaXJlY3Rfc3ogKiBzaXplb2Yoc3RydWN0IHZy aW5nX2Rlc2MpOworCXNpemUgKj0gdnEtPnZxX25lbnRyaWVzOworCisJZGVzYyA9IGNvbnRpZ21h bGxvYyhzaXplLCBNX0RFVkJVRiwgTV9OT1dBSVQgfCBNX1pFUk8sCisJICAgIDAsIH4wdWwsIFBB R0VfU0laRSwgMCk7CisJaWYgKGRlc2MgPT0gTlVMTCkKKwkJcmV0dXJuIChFTk9NRU0pOworCisJ dnEtPnZxX2ZsYWdzIHw9IFZJUlRRVUVVRV9JTkRJUkVDVDsKKwl2cS0+dnFfaW5kaXJlY3RfbWVt ID0gZGVzYzsKKwl2cS0+dnFfaW5kaXJlY3RfbWVtX3N6ID0gc2l6ZTsKKworCXJldHVybiAoMCk7 Cit9CisKK3N0YXRpYyB2b2lkCit2aXJ0cXVldWVfZnJlZV9pbmRpcmVjdChzdHJ1Y3QgdmlydHF1 ZXVlICp2cSkKK3sKKworCWlmICgodnEtPnZxX2ZsYWdzICYgVklSVFFVRVVFX0lORElSRUNUKSA9 PSAwKQorCQlyZXR1cm47CisKKwljb250aWdmcmVlKHZxLT52cV9pbmRpcmVjdF9tZW0sIHZxLT52 cV9pbmRpcmVjdF9tZW1fc3osIE1fREVWQlVGKTsKKworCXZxLT52cV9mbGFncyAmPSB+VklSVFFV RVVFX0lORElSRUNUOworCXZxLT52cV9pbmRpcmVjdF9tZW0gPSBOVUxMOworCXZxLT52cV9pbmRp cmVjdF9tZW1fc3ogPSAwOworfQorCitpbnQKK3ZpcnRxdWV1ZV9yZWluaXQoc3RydWN0IHZpcnRx dWV1ZSAqdnEsIHVpbnQxNl90IHNpemUpCit7CisKKwlpZiAodnEtPnZxX25lbnRyaWVzICE9IHNp emUpIHsKKwkJZGV2aWNlX3ByaW50Zih2cS0+dnFfZGV2LAorCQkgICAgInZxX3JlaW5pdDogJyVz JyBjaGFuZ2VkIHNpemU7IG9sZD0laHUsIG5ldz0laHVcbiIsCisJCSAgICB2cS0+dnFfbmFtZSwg dnEtPnZxX25lbnRyaWVzLCBzaXplKTsKKwkJcmV0dXJuIChFSU5WQUwpOworCX0KKworCS8qIFdh cm4gaWYgdGhlIHZpcnRxdWV1ZSB3YXMgbm90IHByb3Blcmx5IGNsZWFuZWQgdXAuICovCisJaWYg KHZxLT52cV9mcmVlX2NudCAhPSB2cS0+dnFfbmVudHJpZXMpIHsKKwkJZGV2aWNlX3ByaW50Zih2 cS0+dnFfZGV2LAorCQkgICAgInZxX3JlaW5pdDogd2FybmluZywgJyVzJyB2aXJ0cXVldWUgbm90 IGVtcHR5LCAiCisJCSAgICAibGVha2luZyAlZCBlbnRyaWVzXG4iLCB2cS0+dnFfbmFtZSwKKwkJ ICAgIHZxLT52cV9uZW50cmllcyAtIHZxLT52cV9mcmVlX2NudCk7CisJfQorCisJdnEtPnZxX2hl YWRfaWR4ID0gMDsKKwl2cS0+dnFfbGFzdF91c2VkX2lkeCA9IDA7CisJdnEtPnZxX3F1ZXVlZF9j bnQgPSAwOworCXZxLT52cV9mcmVlX2NudCA9IHZxLT52cV9uZW50cmllczsKKworCS8qIFRvIGJl IHNhZmUsIHplcm8gYWxsIG91ciBhbGxvY2F0ZWQgbWVtb3J5LiAqLworCWJ6ZXJvKCZ2cS0+dnFf ZGVzY3hbMF0sIHNpemUgKiBzaXplb2Yoc3RydWN0IHZxX2Rlc2NfZXh0cmEpKTsKKwliemVybyh2 cS0+dnFfcmluZ19tZW0sIHZxLT52cV9yaW5nX3NpemUpOworCWlmICh2cS0+dnFfZmxhZ3MgJiBW SVJUUVVFVUVfSU5ESVJFQ1QpCisJCWJ6ZXJvKHZxLT52cV9pbmRpcmVjdF9tZW0sIHZxLT52cV9p bmRpcmVjdF9tZW1fc3opOworCisJdnFfcmluZ19pbml0KHZxKTsKKwl2aXJ0cXVldWVfZGlzYWJs ZV9pbnRyKHZxKTsKKworCXJldHVybiAoMCk7Cit9CisKK3N0YXRpYyB2b2lkCit2cV9yaW5nX2lu aXQoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7CisJc3RydWN0IHZyaW5nICp2cjsKKwljaGFyICpy aW5nX21lbTsKKwlpbnQgaSwgc2l6ZTsKKworCXJpbmdfbWVtID0gdnEtPnZxX3JpbmdfbWVtOwor CXNpemUgPSB2cS0+dnFfbmVudHJpZXM7CisJdnIgPSAmdnEtPnZxX3ZyaW5nOworCisJdnJpbmdf aW5pdCh2ciwgc2l6ZSwgcmluZ19tZW0sIHZxLT52cV9hbGlnbm1lbnQpOworCisJZm9yIChpID0g MDsgaSA8IHNpemUgLSAxOyBpKyspCisJCXZyLT5kZXNjW2ldLm5leHQgPSBpICsgMTsKKwl2ci0+ ZGVzY1tpXS5uZXh0ID0gVlFfUklOR19ERVNDX0NIQUlOX0VORDsKK30KKwordm1fcGFkZHJfdAor dnFfcmluZ19wYWRkcihzdHJ1Y3QgdmlydHF1ZXVlICp2cSkKK3sKKworCXJldHVybiAodnRvcGh5 cyh2cS0+dnFfcmluZ19tZW0pKTsKK30KKwordm9pZAordmlydHF1ZXVlX2ZyZWUoc3RydWN0IHZp cnRxdWV1ZSAqdnEpCit7CisJaW50IG5sZWFraW5nOworCisJbmxlYWtpbmcgPSB2cS0+dnFfbmVu dHJpZXMgLSB2cS0+dnFfZnJlZV9jbnQ7CisJaWYgKG5sZWFraW5nID4gMCkgeworCQlkZXZpY2Vf cHJpbnRmKHZxLT52cV9kZXYsICIlczogZnJlZWluZyBub24tZW1wdHkgdmlydHF1ZXVlLCAiCisJ CSAgICAibGVha2luZyAlZCBlbnRyaWVzXG4iLCB2cS0+dnFfbmFtZSwgbmxlYWtpbmcpOworCX0K KworCXZpcnRxdWV1ZV9mcmVlX2luZGlyZWN0KHZxKTsKKworCWlmICh2cS0+dnFfcmluZ19tZW0g IT0gTlVMTCkgeworCQljb250aWdmcmVlKHZxLT52cV9yaW5nX21lbSwgdnEtPnZxX3Jpbmdfc2l6 ZSwgTV9ERVZCVUYpOworCQl2cS0+dnFfcmluZ19zaXplID0gMDsKKwkJdnEtPnZxX3JpbmdfbWVt ID0gTlVMTDsKKwl9CisKKwlmcmVlKHZxLCBNX0RFVkJVRik7Cit9CisKK2ludAordmlydHF1ZXVl X3NpemUoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7CisKKwlyZXR1cm4gKHZxLT52cV9uZW50cmll cyk7Cit9CisKK2ludAordmlydHF1ZXVlX2VtcHR5KHN0cnVjdCB2aXJ0cXVldWUgKnZxKQorewor CisJcmV0dXJuICh2cS0+dnFfbmVudHJpZXMgPT0gdnEtPnZxX2ZyZWVfY250KTsKK30KKworaW50 Cit2aXJ0cXVldWVfZnVsbChzdHJ1Y3QgdmlydHF1ZXVlICp2cSkKK3sKKworCXJldHVybiAodnEt PnZxX2ZyZWVfY250ID09IDApOworfQorCitpbnQKK3ZpcnRxdWV1ZV9udXNlZChzdHJ1Y3Qgdmly dHF1ZXVlICp2cSkKK3sKKwl1aW50MTZfdCBudXNlZDsKKworCWlmICh2cS0+dnFfdnJpbmcudXNl ZC0+aWR4ID49IHZxLT52cV9sYXN0X3VzZWRfaWR4KQorCQludXNlZCA9IHZxLT52cV92cmluZy51 c2VkLT5pZHggLSB2cS0+dnFfbGFzdF91c2VkX2lkeDsKKwllbHNlCisJCW51c2VkID0gVUlOVDE2 X01BWCAtIHZxLT52cV9sYXN0X3VzZWRfaWR4ICsKKwkJICAgIHZxLT52cV92cmluZy51c2VkLT5p ZHggKyAxOworCisJS0FTU0VSVChudXNlZCA8PSB2cS0+dnFfbmVudHJpZXMsICgidXNlZCBtb3Jl IHRoYW4gYXZhaWxhYmxlIikpOworCisJcmV0dXJuIChudXNlZCk7Cit9CisKK3ZvaWQKK3ZpcnRx dWV1ZV9kaXNhYmxlX2ludHIoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7CisKKwkvKgorCSAqIE5v dGUgdGhpcyBpcyBvbmx5IGNvbnNpZGVyZWQgYSBoaW50IHRvIHRoZSBob3N0LgorCSAqLworCXZx LT52cV92cmluZy5hdmFpbC0+ZmxhZ3MgfD0gVlJJTkdfQVZBSUxfRl9OT19JTlRFUlJVUFQ7Cit9 CisKK2ludAordmlydHF1ZXVlX2VuYWJsZV9pbnRyKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQorewor CisJLyoKKwkgKiBFbmFibGUgaW50ZXJydXB0cywgbWFraW5nIHN1cmUgd2UgZ2V0IHRoZSBsYXRl c3QKKwkgKiBpbmRleCBvZiB3aGF0J3MgYWxyZWFkeSBiZWVuIHVzZWQuCisJICovCisJdnEtPnZx X3ZyaW5nLmF2YWlsLT5mbGFncyAmPSB+VlJJTkdfQVZBSUxfRl9OT19JTlRFUlJVUFQ7CisKKwlt YigpOworCisJLyoKKwkgKiBBZGRpdGlvbmFsIGl0ZW1zIG1heSBoYXZlIGJlZW4gdXNlZCBpbiB0 aGUgdGltZSBiZXR3ZWVuCisJICogc2luY2Ugd2UgbGFzdCBjaGVja2VkIGFuZCBlbmFibGVkIGlu dGVycnVwdHMgYWJvdmUuIExldAorCSAqIG91ciBjYWxsZXIga25vdyBzbyBpdCBwcm9jZXNzZXMg dGhlIG5ldyB1c2VkIGVudHJpZXMuCisJICovCisJaWYgKHZxLT52cV9sYXN0X3VzZWRfaWR4ICE9 IHZxLT52cV92cmluZy51c2VkLT5pZHgpCisJCXJldHVybiAoMSk7CisKKwlyZXR1cm4gKDApOwor fQorCitpbnQKK3ZpcnRxdWV1ZV9pbnRyX2VuYWJsZWQoc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7 CisKKwlyZXR1cm4gKCh2cS0+dnFfdnJpbmcuYXZhaWwtPmZsYWdzICYgVlJJTkdfQVZBSUxfRl9O T19JTlRFUlJVUFQpID09IDApOworfQorCitpbnQKK3ZpcnRxdWV1ZV9pbnRyKHN0cnVjdCB2aXJ0 cXVldWUgKnZxKQoreworCisJaWYgKHZxLT52cV9sYXN0X3VzZWRfaWR4ID09IHZxLT52cV92cmlu Zy51c2VkLT5pZHgpCisJCXJldHVybiAoMCk7CisKKwlpZiAodnEtPnZxX2ludHJoYW5kICE9IE5V TEwpCisJCXZxLT52cV9pbnRyaGFuZCh2cS0+dnFfaW50cmhhbmRfYXJnKTsKKworCXJldHVybiAo MSk7Cit9CisKK3ZvaWQKK3ZpcnRxdWV1ZV9ub3RpZnkoc3RydWN0IHZpcnRxdWV1ZSAqdnEsIGlu dCBmb3JjZSkKK3sKKworCWlmIChmb3JjZSB8fAorCSAgICAodnEtPnZxX3ZyaW5nLnVzZWQtPmZs YWdzICYgVlJJTkdfVVNFRF9GX05PX05PVElGWSkgPT0gMCkKKwkJVklSVElPX0JVU19OT1RJRllf VlEodnEtPnZxX2RldiwgdnEtPnZxX3F1ZXVlX2luZGV4KTsKK30KKwordm9pZCAqCit2aXJ0cXVl dWVfZHJhaW4oc3RydWN0IHZpcnRxdWV1ZSAqdnEpCit7CisJdm9pZCAqY29va2llOworCWludCBp OworCisJY29va2llID0gTlVMTDsKKworCS8qIFZpcnRxdWV1ZXMgYXJlIHNtYWxsIC0gYWx3YXlz IHN0YXJ0IG92ZXIgYXQgdGhlIGJlZ2lubmluZy4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdnEtPnZx X25lbnRyaWVzOyBpKyspIHsKKwkJaWYgKChjb29raWUgPSB2cS0+dnFfZGVzY3hbaV0uY29va2ll KSAhPSBOVUxMKSB7CisJCQl2cV9yaW5nX2ZyZWVfY2hhaW4odnEsIGkpOworCQkJdnEtPnZxX2Rl c2N4W2ldLmNvb2tpZSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiAoY29v a2llKTsKK30KKworaW50Cit2cV9yaW5nX2VucXVldWUoc3RydWN0IHZpcnRxdWV1ZSAqdnEsIHZv aWQgKmNvb2tpZSwgc3RydWN0IHNnbGlzdCAqc2csCisgICAgaW50IHJlYWRhYmxlLCBpbnQgd3Jp dGFibGUpCit7CisJc3RydWN0IHNnbGlzdF9zZWcgKnNlZzsKKwlzdHJ1Y3QgdnJpbmdfZGVzYyAq ZHA7CisJaW50IGksIGlkeCwgbmVlZGVkLCBoZWFkLCBhdmFpbF9pZHg7CisKKwluZWVkZWQgPSBy ZWFkYWJsZSArIHdyaXRhYmxlOworCisJVlFBU1NFUlQodnEsIGNvb2tpZSAhPSBOVUxMLCAiTlVM TCBjb29raWUiKTsKKwlWUUFTU0VSVCh2cSwgbmVlZGVkID09IHNnLT5zZ19uc2VnLCAic2VnbWVu dCBjb3VudCBtaXNtYXRjaCwgJWQsICVkIiwKKwkgICAgbmVlZGVkLCBzZy0+c2dfbnNlZyk7CisJ VlFBU1NFUlQodnEsCisJICAgIG5lZWRlZCA8PSB2cS0+dnFfbmVudHJpZXMgfHwgbmVlZGVkIDw9 IHZxLT52cV9tYXhfaW5kaXJlY3Rfc3osCisJICAgICJ0b28gbWFueSBzZWdtZW50cyB0byBlbnF1 ZXVlOiAlZCwgJWQvJWQiLCBuZWVkZWQsCisJICAgIHZxLT52cV9uZW50cmllcywgdnEtPnZxX21h eF9pbmRpcmVjdF9zeik7CisKKwlpZiAobmVlZGVkIDwgMSkKKwkJcmV0dXJuIChFSU5WQUwpOwor CisJLyogVXNlIGluZGlyZWN0IGlmIHBvc3NpYmxlLiAqLworCWlmICh2cV9yaW5nX2RvX2luZGly ZWN0KHZxLCBuZWVkZWQpKSB7CisJCXZxX3JpbmdfZW5xdWV1ZV9pbmRpcmVjdCh2cSwgY29va2ll LCBzZywgcmVhZGFibGUsIHdyaXRhYmxlKTsKKwkJcmV0dXJuICgwKTsKKwl9CisKKwlpZiAodnEt PnZxX2ZyZWVfY250IDwgbmVlZGVkKSB7CisJCS8qCisJCSAqIE5vdGlmeSB0aGUgaG9zdCBvbmx5 IGZvciByZWFkLW9ubHkgYnVmZmVycy4KKwkJICovCisJCWlmICh3cml0YWJsZSA9PSAwKQorCQkJ dmlydHF1ZXVlX25vdGlmeSh2cSwgMSk7CisKKwkJaWYgKHZxLT52cV9mcmVlX2NudCA9PSAwKQor CQkJcmV0dXJuIChFTk9TUEMpOworCQllbHNlCisJCQkvKiBDYWxsZXIgbWF5IGRlZnJhZyBhbmQg dHJ5IGFnYWluLiAqLworCQkJcmV0dXJuIChFTVNHU0laRSk7CisJfQorCisJaGVhZCA9IHZxLT52 cV9oZWFkX2lkeDsKKworCWZvciAoaSA9IDAsIGlkeCA9IGhlYWQsIHNlZyA9IHNnLT5zZ19zZWdz OworCSAgICAgaSA8IG5lZWRlZDsKKwkgICAgIGkrKywgaWR4ID0gZHAtPm5leHQsIHNlZysrKSB7 CisJCVZRX1JJTkdfQVNTRVJUX1ZBTElEX0lEWCh2cSwgaWR4KTsKKworCQlkcCA9ICZ2cS0+dnFf dnJpbmcuZGVzY1tpZHhdOworCQlkcC0+YWRkciA9IHNlZy0+c3NfcGFkZHI7CisJCWRwLT5sZW4g PSBzZWctPnNzX2xlbjsKKwkJZHAtPmZsYWdzID0gVlJJTkdfREVTQ19GX05FWFQ7CisJCWlmIChp ID49IHJlYWRhYmxlKQorCQkJZHAtPmZsYWdzIHw9IFZSSU5HX0RFU0NfRl9XUklURTsKKwl9CisJ ZHAtPmZsYWdzICY9IH5WUklOR19ERVNDX0ZfTkVYVDsKKworCS8qIFNldCB0aGUgbmV3IGhlYWQu ICovCisJdnEtPnZxX2hlYWRfaWR4ID0gZHAtPm5leHQ7CisJdnEtPnZxX2ZyZWVfY250IC09IG5l ZWRlZDsKKwlpZiAodnEtPnZxX2ZyZWVfY250ID09IDApCisJCVZRX1JJTkdfQVNTRVJUX0NIQUlO X1RFUk0odnEpOworCWVsc2UKKwkJVlFfUklOR19BU1NFUlRfVkFMSURfSURYKHZxLCB2cS0+dnFf aGVhZF9pZHgpOworCisJLyoKKwkgKiBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGF2YWlsYWJsZSBy aW5nLCBidXQgcG9zdHBvbmUKKwkgKiB0ZWxsaW5nIHRoZSBob3N0IGFib3V0IGl0IHVudGlsIHZx X3Jpbmdfc3luYygpLiBUaGUKKwkgKiBzcGVjaWZpY2F0aW9uIGFkdm9jYXRlcyBkb2luZyB0aGlz IHRvIHJlZHVjZSBndWVzdC9ob3N0CisJICogY29udGV4dCBzd2l0Y2hlcy4KKwkgKi8KKwlhdmFp bF9pZHggPSAodnEtPnZxX3ZyaW5nLmF2YWlsLT5pZHggKyB2cS0+dnFfcXVldWVkX2NudCsrKSAl CisJICAgIHZxLT52cV9uZW50cmllczsKKwl2cS0+dnFfdnJpbmcuYXZhaWwtPnJpbmdbYXZhaWxf aWR4XSA9IGhlYWQ7CisJVlFBU1NFUlQodnEsIHZxLT52cV9kZXNjeFtoZWFkXS5jb29raWUgPT0g TlVMTCwKKwkgICAgImNvb2tpZSBhbHJlYWR5IGV4aXN0cyBmb3IgaWR4ICVkIiwgaGVhZCk7CisJ dnEtPnZxX2Rlc2N4W2hlYWRdLmNvb2tpZSA9IGNvb2tpZTsKKworCXJldHVybiAoMCk7Cit9CisK K3N0YXRpYyBpbnQKK3ZxX3JpbmdfZG9faW5kaXJlY3Qoc3RydWN0IHZpcnRxdWV1ZSAqdnEsIGlu dCBuZWVkZWQpCit7CisKKwlpZiAoKHZxLT52cV9mbGFncyAmIFZJUlRRVUVVRV9JTkRJUkVDVCkg PT0gMCkKKwkJcmV0dXJuICgwKTsKKworCWlmICh2cS0+dnFfZnJlZV9jbnQgPT0gMCkKKwkJcmV0 dXJuICgwKTsKKworCWlmICh2cS0+dnFfbWF4X2luZGlyZWN0X3N6IDwgbmVlZGVkKQorCQlyZXR1 cm4gKDApOworCisJaWYgKG5lZWRlZCA8IDIpCisJCXJldHVybiAoMCk7CisKKwlyZXR1cm4gKDEp OworfQorCitzdGF0aWMgdm9pZAordnFfcmluZ19lbnF1ZXVlX2luZGlyZWN0KHN0cnVjdCB2aXJ0 cXVldWUgKnZxLCB2b2lkICpjb29raWUsCisgICAgc3RydWN0IHNnbGlzdCAqc2csIGludCByZWFk YWJsZSwgaW50IHdyaXRhYmxlKQoreworCXN0cnVjdCBzZ2xpc3Rfc2VnICpzZWc7CisJc3RydWN0 IHZyaW5nX2Rlc2MgKmRwLCAqaW5kaXJlY3QsICppZHA7CisJaW50IGksIG5lZWRlZCwgaGVhZCwg YXZhaWxfaWR4OworCisJaGVhZCA9IHZxLT52cV9oZWFkX2lkeDsKKwlWUV9SSU5HX0FTU0VSVF9W QUxJRF9JRFgodnEsIGhlYWQpOworCW5lZWRlZCA9IHJlYWRhYmxlICsgd3JpdGFibGU7CisKKwlW UUFTU0VSVCh2cSwgbmVlZGVkIDw9IHZxLT52cV9tYXhfaW5kaXJlY3Rfc3osCisJICAgICJlbnF1 ZXVpbmcgdG9vIG1hbnkgaW5kaXJlY3QgZGVzY3JpcHRvcnMiKTsKKworCWluZGlyZWN0ID0gaWRw ID0gJnZxLT52cV9pbmRpcmVjdF9tZW1baGVhZCAqIHZxLT52cV9tYXhfaW5kaXJlY3Rfc3pdOwor CisJZm9yIChpID0gMCwgc2VnID0gc2ctPnNnX3NlZ3M7CisJICAgICBpIDwgbmVlZGVkOworCSAg ICAgaSsrLCBzZWcrKykgeworCisJCWlkcCA9ICZpbmRpcmVjdFtpXTsKKwkJaWRwLT5hZGRyID0g c2VnLT5zc19wYWRkcjsKKwkJaWRwLT5sZW4gPSBzZWctPnNzX2xlbjsKKwkJaWRwLT5mbGFncyA9 IFZSSU5HX0RFU0NfRl9ORVhUOworCQlpZHAtPm5leHQgPSBpICsgMTsKKwkJaWYgKGkgPj0gcmVh ZGFibGUpCisJCQlpZHAtPmZsYWdzIHw9IFZSSU5HX0RFU0NfRl9XUklURTsKKwl9CisJaWRwLT5m bGFncyAmPSB+VlJJTkdfREVTQ19GX05FWFQ7CisJaWRwLT5uZXh0ID0gVlFfUklOR19ERVNDX0NI QUlOX0VORDsKKworCWRwID0gJnZxLT52cV92cmluZy5kZXNjW2hlYWRdOworCWRwLT5hZGRyID0g dnRvcGh5cyhpbmRpcmVjdCk7CisJZHAtPmxlbiA9IG5lZWRlZCAqIHNpemVvZihzdHJ1Y3QgdnJp bmdfZGVzYyk7CisJZHAtPmZsYWdzID0gVlJJTkdfREVTQ19GX0lORElSRUNUOworCisJLyogU2V0 IHRoZSBuZXcgaGVhZC4gKi8KKwl2cS0+dnFfaGVhZF9pZHggPSBkcC0+bmV4dDsKKwl2cS0+dnFf ZnJlZV9jbnQtLTsKKwlpZiAodnEtPnZxX2ZyZWVfY250ID09IDApCisJCVZRX1JJTkdfQVNTRVJU X0NIQUlOX1RFUk0odnEpOworCWVsc2UKKwkJVlFfUklOR19BU1NFUlRfVkFMSURfSURYKHZxLCB2 cS0+dnFfaGVhZF9pZHgpOworCisJVlFBU1NFUlQodnEsIHZxLT52cV9kZXNjeFtoZWFkXS5jb29r aWUgPT0gTlVMTCwKKwkgICAgImNvb2tpZSBhbHJlYWR5IGV4aXN0cyBmb3IgaWR4ICVkIiwgaGVh ZCk7CisJdnEtPnZxX2Rlc2N4W2hlYWRdLmNvb2tpZSA9IGNvb2tpZTsKKworCWF2YWlsX2lkeCA9 ICh2cS0+dnFfdnJpbmcuYXZhaWwtPmlkeCArIHZxLT52cV9xdWV1ZWRfY250KyspICUKKwkgICAg dnEtPnZxX25lbnRyaWVzOworCXZxLT52cV92cmluZy5hdmFpbC0+cmluZ1thdmFpbF9pZHhdID0g aGVhZDsKK30KKwordm9pZAordnFfcmluZ19zeW5jKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQorewor CisJLyogVXBkYXRlIGF2YWlsYWJsZSByaW5nLiAqLworCW1iKCk7CisJdnEtPnZxX3ZyaW5nLmF2 YWlsLT5pZHggKz0gdnEtPnZxX3F1ZXVlZF9jbnQ7CisJdnEtPnZxX3F1ZXVlZF9jbnQgPSAwOwor CisJLyogTm90aWZ5IGhvc3QuICovCisJbWIoKTsKKwl2aXJ0cXVldWVfbm90aWZ5KHZxLCAwKTsK K30KKwordm9pZCAqCit2cV9yaW5nX2RlcXVldWUoc3RydWN0IHZpcnRxdWV1ZSAqdnEsIHVpbnQz Ml90ICpsZW4pCit7CisJc3RydWN0IHZyaW5nX3VzZWRfZWxlbSAqdWVwOworCXZvaWQgKmNvb2tp ZTsKKwlpbnQgdXNlZF9pZHgsIGRlc2NfaWR4OworCisJaWYgKHZxLT52cV9sYXN0X3VzZWRfaWR4 ID09IHZxLT52cV92cmluZy51c2VkLT5pZHgpCisJCXJldHVybiAoTlVMTCk7CisKKwltYigpOwor CXVzZWRfaWR4ID0gdnEtPnZxX2xhc3RfdXNlZF9pZHggJSB2cS0+dnFfbmVudHJpZXM7CisJdWVw ID0gJnZxLT52cV92cmluZy51c2VkLT5yaW5nW3VzZWRfaWR4XTsKKwl2cS0+dnFfbGFzdF91c2Vk X2lkeCsrOworCisJZGVzY19pZHggPSB1ZXAtPmlkOworCWlmIChsZW4gIT0gTlVMTCkKKwkJKmxl biA9IHVlcC0+bGVuOworCWNvb2tpZSA9IHZxLT52cV9kZXNjeFtkZXNjX2lkeF0uY29va2llOwor CVZRQVNTRVJUKHZxLCBjb29raWUgIT0gTlVMTCwgIm5vIGNvb2tpZSBmb3IgaW5kZXggJWQiLCBk ZXNjX2lkeCk7CisJdnEtPnZxX2Rlc2N4W2Rlc2NfaWR4XS5jb29raWUgPSBOVUxMOworCisJdnFf cmluZ19mcmVlX2NoYWluKHZxLCBkZXNjX2lkeCk7CisKKwlyZXR1cm4gKGNvb2tpZSk7Cit9CisK K3N0YXRpYyB2b2lkCit2cV9yaW5nX2ZyZWVfY2hhaW4oc3RydWN0IHZpcnRxdWV1ZSAqdnEsIGlu dCBkZXNjX2lkeCkKK3sKKwlzdHJ1Y3QgdnJpbmdfZGVzYyAqaGRwLCAqZHA7CisKKwloZHAgPSBk cCA9ICZ2cS0+dnFfdnJpbmcuZGVzY1tkZXNjX2lkeF07CisJaWYgKHZxLT52cV9mcmVlX2NudCA9 PSAwKQorCQlWUV9SSU5HX0FTU0VSVF9DSEFJTl9URVJNKHZxKTsKKworCWlmICgoZHAtPmZsYWdz ICYgVlJJTkdfREVTQ19GX0lORElSRUNUKSA9PSAwKSB7CisJCS8qIE1hcmsgdGhlIGNoYWluIGFz IGZyZWUuICovCisJCXdoaWxlIChkcC0+ZmxhZ3MgJiBWUklOR19ERVNDX0ZfTkVYVCkgeworCQkJ VlFfUklOR19BU1NFUlRfVkFMSURfSURYKHZxLCBkcC0+bmV4dCk7CisKKwkJCWRwID0gJnZxLT52 cV92cmluZy5kZXNjW2RwLT5uZXh0XTsKKwkJCWRwLT5mbGFncyAmPSBWUklOR19ERVNDX0ZfTkVY VDsKKwkJCXZxLT52cV9mcmVlX2NudCsrOworCQl9CisJfQorCisJLyogTWFyayAqaGRwIGFzIGZy ZWUuICovCisJaGRwLT5mbGFncyAmPSBWUklOR19ERVNDX0ZfTkVYVDsKKwl2cS0+dnFfZnJlZV9j bnQrKzsKKworCS8qCisJICogQXBwZW5kIHRoZSBleGlzdGluZyBmcmVlIGNoYWluLCBpZiBhbnks IHRvIHRoZSBuZXdseSBmcmVlZAorCSAqIGNoYWluLiBNdXN0IGFwcGVuZCBvbGQgdG8gbmV3IGlu IGNhc2UgdGhlIHZpcnRxdWV1ZSB3YXMKKwkgKiBmdWxsLgorCSAqLworCWRwLT5uZXh0ID0gdnEt PnZxX2hlYWRfaWR4OworCWRwLT5mbGFncyA9IFZSSU5HX0RFU0NfRl9ORVhUOworCS8qIFNldCBk ZXNjX2lkeCBhcyB0aGUgbmV3IGhlYWQuICovCisJdnEtPnZxX2hlYWRfaWR4ID0gZGVzY19pZHg7 Cit9CisKK3ZvaWQKK3ZpcnRxdWV1ZV9kdW1wKHN0cnVjdCB2aXJ0cXVldWUgKnZxKQoreworCisJ aWYgKHZxID09IE5VTEwpCisJCXJldHVybjsKKworCXByaW50ZigiVlE6ICVzIC0gbGFzdF91c2Vk X2lkeDogJWQ7IHVzZWQuaWR4OiAlZDsgIgorCSAgICAiYXZhaWwuaWR4OiAlZDsgZnJlZTogJWQ7 IGZsYWdzOiAweCV4XG4iLCB2cS0+dnFfbmFtZSwKKwkgICAgdnEtPnZxX2xhc3RfdXNlZF9pZHgs IHZxLT52cV92cmluZy51c2VkLT5pZHgsCisJICAgIHZxLT52cV92cmluZy5hdmFpbC0+aWR4LCB2 cS0+dnFfZnJlZV9jbnQsCisJICAgIHZxLT52cV92cmluZy5hdmFpbC0+ZmxhZ3MpOworfQpkaWZm IC0tZ2l0IGEvc3lzL2Rldi92aXJ0aW8vdmlydHF1ZXVlLmggYi9zeXMvZGV2L3ZpcnRpby92aXJ0 cXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAotLS0gL2Rldi9udWxsCisrKyBiL3N5cy9kZXYv dmlydGlvL3ZpcnRxdWV1ZS5oCkBAIC0wLDAgKzEsNjggQEAKKyNpZm5kZWYgX1ZJUlRJT19WSVJU UVVFVUVfSAorI2RlZmluZSBfVklSVElPX1ZJUlRRVUVVRV9ICisKKyNpbmNsdWRlIDxzeXMvdHlw ZXMuaD4KKworc3RydWN0IHZpcnRxdWV1ZTsKK3N0cnVjdCBzZ2xpc3Q7CisKKy8qIFN1cHBvcnQg Zm9yIGluZGlyZWN0IGJ1ZmZlciBkZXNjcmlwdG9ycy4gKi8KKyNkZWZpbmUgVklSVElPX0ZfUklO R19JTkRJUkVDVF9ERVNDCSgxIDw8IDI4KQorCisvKiBEZXZpY2UgY2FsbGJhY2sgZm9yIGEgdmly dHF1ZXVlIGludGVycnVwdC4gKi8KK3R5cGVkZWYgaW50IHZpcnRxdWV1ZV9pbnRyX3Qodm9pZCAq KTsKKworI2RlZmluZSBWSVJUUVVFVUVfTUFYX05BTUVfU1oJMzIKKworLyogT25lIGZvciBlYWNo IHZpcnRxdWV1ZSB0aGUgZHJpdmVyIHdpc2hlcyB0byBhbGxvY2F0ZS4gKi8KK3N0cnVjdCB2cV9h bGxvY19pbmZvIHsKKwljaGFyCQkgICB2cWFpX25hbWVbVklSVFFVRVVFX01BWF9OQU1FX1NaXTsK KwlpbnQJCSAgIHZxYWlfbWF4aW5kaXJzejsKKwl2aXJ0cXVldWVfaW50cl90ICAqdnFhaV9pbnRy OworCXZvaWQJCSAgKnZxYWlfaW50cl9hcmc7CisJc3RydWN0IHZpcnRxdWV1ZSAqKnZxYWlfdnE7 Cit9OworCisjZGVmaW5lIFZRX0FMTE9DX0lORk9fSU5JVChfaSxfbnNlZ3MsX2ludHIsX2FyZyxf dnFwLF9zdHIsLi4uKSBkbyB7CVwKKwlzbnByaW50ZigoX2kpLT52cWFpX25hbWUsIFZJUlRRVUVV RV9NQVhfTkFNRV9TWiwgX3N0ciwJCVwKKwkgICAgIyNfX1ZBX0FSR1NfXyk7CQkJCQkJXAorCShf aSktPnZxYWlfbWF4aW5kaXJzeiA9IChfbnNlZ3MpOwkJCQlcCisJKF9pKS0+dnFhaV9pbnRyID0g KF9pbnRyKTsJCQkJCVwKKwkoX2kpLT52cWFpX2ludHJfYXJnID0gKF9hcmcpOwkJCQkJXAorCShf aSktPnZxYWlfdnEgPSAoX3ZxcCk7CQkJCQkJXAorfSB3aGlsZSAoMCkKKwordWludDMyX3Qgdmly dHF1ZXVlX2ZpbHRlcl9mZWF0dXJlcyh1aW50MzJfdCk7CisKK2ludAl2aXJ0cXVldWVfYWxsb2Mo ZGV2aWNlX3QgZGV2LCB1aW50MTZfdCBxdWV1ZSwgdWludDE2X3Qgc2l6ZSwKKwkgICAgaW50IGFs aWduLCBzdHJ1Y3QgdnFfYWxsb2NfaW5mbyAqaW5mbywKKwkgICAgc3RydWN0IHZpcnRxdWV1ZSAq KnZxcCk7Cit2b2lkCSp2aXJ0cXVldWVfZHJhaW4oc3RydWN0IHZpcnRxdWV1ZSAqdnEpOwordm9p ZAkgdmlydHF1ZXVlX2ZyZWUoc3RydWN0IHZpcnRxdWV1ZSAqdnEpOworaW50CSB2aXJ0cXVldWVf cmVpbml0KHN0cnVjdCB2aXJ0cXVldWUgKnZxLCB1aW50MTZfdCBzaXplKTsKKworaW50CSB2aXJ0 cXVldWVfaW50cihzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7CitpbnQgCSB2aXJ0cXVldWVfZW5hYmxl X2ludHIoc3RydWN0IHZpcnRxdWV1ZSAqdnEpOwordm9pZCAJIHZpcnRxdWV1ZV9kaXNhYmxlX2lu dHIoc3RydWN0IHZpcnRxdWV1ZSAqdnEpOworaW50CSB2aXJ0cXVldWVfaW50cl9lbmFibGVkKHN0 cnVjdCB2aXJ0cXVldWUgKnZxKTsKK3ZvaWQJIHZpcnRxdWV1ZV9ub3RpZnkoc3RydWN0IHZpcnRx dWV1ZSAqdnEsIGludCBmb3JjZSk7CisKK2ludAkgdmlydHF1ZXVlX2Z1bGwoc3RydWN0IHZpcnRx dWV1ZSAqdnEpOworaW50CSB2aXJ0cXVldWVfZW1wdHkoc3RydWN0IHZpcnRxdWV1ZSAqdnEpOwor aW50CSB2aXJ0cXVldWVfc2l6ZShzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7CitpbnQJIHZpcnRxdWV1 ZV9udXNlZChzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7Cit2b2lkCSB2aXJ0cXVldWVfZHVtcChzdHJ1 Y3QgdmlydHF1ZXVlICp2cSk7CisKKy8qCisgKiBUaGUgVmlydElPIHJpbmcgaXMgdGhlIG9ubHkg dHJhbnNwb3J0IHdlIHN1cHBvcnQuCisgKi8KKworLyogR2V0IHBoeXNpY2FsIGFkZHJlc3Mgb2Yg dGhlIHZxIHJpbmcuICovCit2bV9wYWRkcl90IHZxX3JpbmdfcGFkZHIoc3RydWN0IHZpcnRxdWV1 ZSAqdnEpOworCitpbnQJIHZxX3JpbmdfZW5xdWV1ZShzdHJ1Y3QgdmlydHF1ZXVlICp2cSwgdm9p ZCAqY29va2llLAorCSAgICAgc3RydWN0IHNnbGlzdCAqc2csIGludCByZWFkYWJsZSwgaW50IHdy aXRhYmxlKTsKK3ZvaWQJIHZxX3Jpbmdfc3luYyhzdHJ1Y3QgdmlydHF1ZXVlICp2cSk7Cit2b2lk CSp2cV9yaW5nX2RlcXVldWUoc3RydWN0IHZpcnRxdWV1ZSAqdnEsIHVpbnQzMl90ICpsZW4pOwor CisjZW5kaWYgLyogX1ZJUlRJT19WSVJUUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvc3lzL21vZHVs ZXMvTWFrZWZpbGUgYi9zeXMvbW9kdWxlcy9NYWtlZmlsZQotLS0gYS9zeXMvbW9kdWxlcy9NYWtl ZmlsZQorKysgYi9zeXMvbW9kdWxlcy9NYWtlZmlsZQpAQCAtMzAyLDYgKzMwMiw3IEBACiAJdXRv cGlhIFwKIAkke192ZXNhfSBcCiAJdmdlIFwKKwkke192aXJ0aW99IFwKIAl2a2JkIFwKIAkke192 cG99IFwKIAl2ciBcCmRpZmYgLS1naXQgYS9zeXMvbW9kdWxlcy92aXJ0aW8vTWFrZWZpbGUgYi9z eXMvbW9kdWxlcy92aXJ0aW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYv bnVsbAorKysgYi9zeXMvbW9kdWxlcy92aXJ0aW8vTWFrZWZpbGUKQEAgLTAsMCArMSwyOCBAQAor IworIyAkRnJlZUJTRCQKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0Ogor IyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl IGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBs aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMg ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl IGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVU SE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBM SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElS RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMg REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV QlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJ QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT SU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworU1VC RElSPQl2aXJ0aW8gcGNpIG5ldHdvcmsKKworLmluY2x1ZGUgPGJzZC5zdWJkaXIubWs+CmRpZmYg LS1naXQgYS9zeXMvbW9kdWxlcy92aXJ0aW8vYmxvY2svTWFrZWZpbGUgYi9zeXMvbW9kdWxlcy92 aXJ0aW8vYmxvY2svTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKLS0tIC9kZXYvbnVsbAor KysgYi9zeXMvbW9kdWxlcy92aXJ0aW8vYmxvY2svTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBAQAor IworIyAkRnJlZUJTRCQKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0Ogor IyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl IGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg Zm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBs aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyMg ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl IGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVU SE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJTVBM SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMgSU1Q TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElORElS RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyMg REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV QlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9G SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB TlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisjIExJ QUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT SU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKworLlBB VEg6ICR7LkNVUkRJUn0vLi4vLi4vLi4vZGV2L3ZpcnRpby9ibG9jaworCitLTU9EPQl2dGJsawor U1JDUz0JdnRibGsuYworU1JDUys9CXZpcnRpb19idXNfaWYuaCB2aXJ0aW9faWYuaAorU1JDUys9 CWJ1c19pZi5oIGRldmljZV9pZi5oIAorCisuaW5jbHVkZSA8YnNkLmttb2QubWs+CmRpZmYgLS1n aXQgYS9zeXMvbW9kdWxlcy92aXJ0aW8vbmV0d29yay9NYWtlZmlsZSBiL3N5cy9tb2R1bGVzL3Zp cnRpby9uZXR3b3JrL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Ci0tLSAvZGV2L251bGwK KysrIGIvc3lzL21vZHVsZXMvdmlydGlvL25ldHdvcmsvTWFrZWZpbGUKQEAgLTAsMCArMSwzMyBA QAorIworIyAkRnJlZUJTRCQKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBl cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0 OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi b3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0 aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhp cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK KyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg dGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUg QVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVTUyBPUiBJ TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyMg SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ QVJUSUNVTEFSIFBVUlBPU0UKKyMgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBU SEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyMgRk9SIEFOWSBESVJFQ1QsIElO RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwK KyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G IFNVQlNUSVRVVEUgR09PRFMKKyMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQ Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisjIEhPV0VWRVIgQ0FVU0VEIEFORCBP TiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisj IExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB UklTSU5HIElOIEFOWSBXQVkKKyMgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZF TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorIyBTVUNIIERBTUFHRS4KKyMKKwor LlBBVEg6ICR7LkNVUkRJUn0vLi4vLi4vLi4vZGV2L3ZpcnRpby9uZXR3b3JrCisKK0tNT0Q9CWlm X3Z0bmV0CitTUkNTPQlpZl92dG5ldC5jCitTUkNTKz0JdmlydGlvX2J1c19pZi5oIHZpcnRpb19p Zi5oCitTUkNTKz0JYnVzX2lmLmggZGV2aWNlX2lmLmggCisKKy5pbmNsdWRlIDxic2Qua21vZC5t az4KZGlmZiAtLWdpdCBhL3N5cy9tb2R1bGVzL3ZpcnRpby9wY2kvTWFrZWZpbGUgYi9zeXMvbW9k dWxlcy92aXJ0aW8vcGNpL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Ci0tLSAvZGV2L251 bGwKKysrIGIvc3lzL21vZHVsZXMvdmlydGlvL3BjaS9NYWtlZmlsZQpAQCAtMCwwICsxLDMzIEBA CisjCisjICRGcmVlQlNEJAorIworIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisjIGFyZSBtZXQ6 CisjIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0CisjICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlz IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor IyAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0 aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBB VVRIT1IgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisjIEFOWSBFWFBSRVNTIE9SIElN UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorIyBJ TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB UlRJQ1VMQVIgUFVSUE9TRQorIyBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRI RSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorIyBGT1IgQU5ZIERJUkVDVCwgSU5E SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAor IyBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg U1VCU1RJVFVURSBHT09EUworIyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBS T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyMgSE9XRVZFUiBDQVVTRUQgQU5EIE9O IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyMg TElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS SVNJTkcgSU4gQU5ZIFdBWQorIyBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVO IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisjIFNVQ0ggREFNQUdFLgorIworCisu UEFUSDogJHsuQ1VSRElSfS8uLi8uLi8uLi9kZXYvdmlydGlvL3BjaQorCitLTU9EPQl2aXJ0aW9f cGNpCitTUkNTPQl2aXJ0aW9fcGNpLmMKK1NSQ1MrPQl2aXJ0aW9fYnVzX2lmLmggdmlydGlvX2lm LmggCitTUkNTKz0JYnVzX2lmLmggZGV2aWNlX2lmLmggcGNpX2lmLmgKKworLmluY2x1ZGUgPGJz ZC5rbW9kLm1rPgpkaWZmIC0tZ2l0IGEvc3lzL21vZHVsZXMvdmlydGlvL3ZpcnRpby9NYWtlZmls ZSBiL3N5cy9tb2R1bGVzL3ZpcnRpby92aXJ0aW8vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2 NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zeXMvbW9kdWxlcy92aXJ0aW8vdmlydGlvL01ha2VmaWxl CkBAIC0wLDAgKzEsMzUgQEAKKyMKKyMgJEZyZWVCU0QkCisjCisjIFJlZGlzdHJpYnV0aW9uIGFu ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorIyBtb2Rp ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp dGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11 c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorIyAyLiBSZWRpc3RyaWJ1 dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor IyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp c2NsYWltZXIgaW4gdGhlCisjICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisjCisjIFRISVMgU09GVFdBUkUgSVMg UFJPVklERUQgQlkgVEhFIEFVVEhPUiBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMg QU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN SVRFRCBUTywgVEhFCisjIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisjIEFSRSBESVNDTEFJTUVELiAgSU4g Tk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisjIEZP UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBP UiBDT05TRVFVRU5USUFMCisjIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisjIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorIyBIT1dF VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O VFJBQ1QsIFNUUklDVAorIyBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNF IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisjIE9VVCBPRiBUSEUgVVNFIE9GIFRI SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyMgU1VD SCBEQU1BR0UuCisjCisKKy5QQVRIOiAkey5DVVJESVJ9Ly4uLy4uLy4uL2Rldi92aXJ0aW8KKwor S01PRD0JdmlydGlvCisKK1NSQ1M9CXZpcnRpby5jIHZpcnRxdWV1ZS5jCitTUkNTKz0JdmlydGlv X2J1c19pZi5jIHZpcnRpb19idXNfaWYuaAorU1JDUys9CXZpcnRpb19pZi5jIHZpcnRpb19pZi5o CitTUkNTKz0JYnVzX2lmLmggZGV2aWNlX2lmLmggCisKKy5pbmNsdWRlIDxic2Qua21vZC5taz4K --20cf30549f434fb2120498e508cb--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTi=OB%2B1A-zQYupU5w1AoY-EodndexcwEC4kg27x3>