From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: "Slava Tulchinsky" Message-ID: <85256A55.0061ED1B.00@IBJS06DS.ibjs.com> Date: Wed, 23 May 2001 14:16:38 -0400 Mime-Version: 1.0 Content-type: multipart/mixed; Boundary="0__=9aXSUzwAb4n8F6JF3X9g4LTgMVlw6lLOYWHGvYKVXMSGht60CenEJo04" Content-Disposition: inline Subject: [linux-lvm] ORACLE OPS and Fibre channel Sender: linux-lvm-admin@sistina.com Errors-To: linux-lvm-admin@sistina.com Reply-To: linux-lvm@sistina.com List-Help: List-Post: List-Subscribe: , List-Unsubscribe: , List-Archive: List-Id: To: Linux-LVM@sistina.com --0__=9aXSUzwAb4n8F6JF3X9g4LTgMVlw6lLOYWHGvYKVXMSGht60CenEJo04 Content-type: text/plain; charset=us-ascii Content-Disposition: inline After successfully installing Oracle 8.1.7.0.1 OPS on Redhat 6.2 with 2.2.19-6.2.1 using Compaq fibre channel card RA4000 to connect to Compaq external drive enclosure RA4100 (kernel driver cpqfc), We decided see if OPS will work with lvm 0.9.1-Beta7. After following all the instructions in INSTALL and README files was able to compile patch file. when running the patch against kernel sorce genhd.c.rej was created, I was still able to compile the kernel and install lvm. LVM part seems to work fine, but when booting with the newly compiled kernel no longer able to use raw partitions with OPS with or without LVM. Corrupt block relative dba: 0x00000001 (file 0, block 1) Fractured block found during control file header read Data in bad block - type: 21 format: 2 rdba: 0x00000001 last change scn: 0xffff.00000002 seq: 0x1 flg: 0x04 consistency value in tail: 0x00000000 check value in block header: 0x3574, computed block checksum: 0x9a9 spare1: 0x0, spare2: 0x0, spare3: 0x Corrupt block relative dba: 0x00000001 (file 0, block 1) Fractured block found during control file header read Data in bad block - type: 21 format: 2 rdba: 0x00000001 last change scn: 0xffff.00000002 seq: 0x1 flg: 0x04 consistency value in tail: 0x00000000 check value in block header: 0x3574, computed block checksum: 0x9a9 spare1: 0x0, spare2: 0x0, spare3: 0x When booting with the original kernal everything is OK --0__=9aXSUzwAb4n8F6JF3X9g4LTgMVlw6lLOYWHGvYKVXMSGht60CenEJo04 Content-type: application/octet-stream; name="genhd.c.orig" Content-Disposition: attachment; filename="genhd.c.orig" Content-transfer-encoding: base64 LyoKICogIENvZGUgZXh0cmFjdGVkIGZyb20KICogIGxpbnV4L2tlcm5lbC9oZC5jCiAqCiAqICBD b3B5cmlnaHQgKEMpIDE5OTEtMTk5OCAgTGludXMgVG9ydmFsZHMKICoKICoKICogIFRoYW5rcyB0 byBCcmFua28gTGFua2VzdGVyLCBsYW5rZXN0ZUBmd2kudXZhLm5sLCB3aG8gZm91bmQgYSBidWcK ICogIGluIHRoZSBlYXJseSBleHRlbmRlZC1wYXJ0aXRpb24gY2hlY2tzIGFuZCBhZGRlZCBETSBw YXJ0aXRpb25zCiAqCiAqICBTdXBwb3J0IGZvciBEaXNrTWFuYWdlciB2Ni4weCBhZGRlZCBieSBN YXJrIExvcmQsCiAqICB3aXRoIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IE9uVHJhY2suICBUaGlz IG5vdyB3b3JrcyBmb3IgbGludXggZmRpc2sKICogIGFuZCBMSUxPLCBhcyB3ZWxsIGFzIGxvYWRs aW4gYW5kIGJvb3Rsbi4gIE5vdGUgdGhhdCBkaXNrcyBvdGhlciB0aGFuCiAqICAvZGV2L2hkYSAq bXVzdCogaGF2ZSBhICJET1MiIHR5cGUgMHg1MSBwYXJ0aXRpb24gaW4gdGhlIGZpcnN0IHNsb3Qg KGhkYTEpLgogKgogKiAgTW9yZSBmbGV4aWJsZSBoYW5kbGluZyBvZiBleHRlbmRlZCBwYXJ0aXRp b25zIC0gYWViLCA5NTA4MzEKICoKICogIENoZWNrIHBhcnRpdGlvbiB0YWJsZSBvbiBJREUgZGlz a3MgZm9yIGNvbW1vbiBDSFMgdHJhbnNsYXRpb25zCiAqCiAqICBBZGRlZCBuZWVkZWQgTUFKT1JT IGZvciBuZXcgcGFpcnMsIHtoZGksaGRqfSwge2hkayxoZGx9CiAqLwoKI2luY2x1ZGUgPGxpbnV4 L2NvbmZpZy5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2dlbmhkLmg+ CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CiNpbmNs dWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsay5oPgojaW5jbHVkZSA8bGlu dXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvcmFpZC9tZC5oPgoKI2lmZGVmIENPTkZJR19BUkNI X1MzOTAKI2luY2x1ZGUgPGFzbS9kYXNkLmg+CiNlbmRpZiAvKiBDT05GSUdfQVJDSF9TMzkwICov CgojaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgojaW5jbHVkZSA8YXNtL2J5dGVvcmRlci5oPgoKLyoK ICogTWFueSBhcmNoaXRlY3R1cmVzIGRvbid0IGxpa2UgdW5hbGlnbmVkIGFjY2Vzc2VzLCB3aGlj aCBpcwogKiBmcmVxdWVudGx5IHRoZSBjYXNlIHdpdGggdGhlIG5yX3NlY3RzIGFuZCBzdGFydF9z ZWN0IHBhcnRpdGlvbgogKiB0YWJsZSBlbnRyaWVzLgogKi8KI2luY2x1ZGUgPGFzbS91bmFsaWdu ZWQuaD4KCiNkZWZpbmUgU1lTX0lORChwKQkoZ2V0X3VuYWxpZ25lZCgmcC0+c3lzX2luZCkpCiNk ZWZpbmUgTlJfU0VDVFMocCkJKHsgX190eXBlb2ZfXyhwLT5ucl9zZWN0cykgX19hID0JXAoJCQkJ Z2V0X3VuYWxpZ25lZCgmcC0+bnJfc2VjdHMpOwlcCgkJCQlsZTMyX3RvX2NwdShfX2EpOyBcCgkJ CX0pCgojZGVmaW5lIFNUQVJUX1NFQ1QocCkJKHsgX190eXBlb2ZfXyhwLT5zdGFydF9zZWN0KSBf X2EgPQlcCgkJCQlnZXRfdW5hbGlnbmVkKCZwLT5zdGFydF9zZWN0KTsJXAoJCQkJbGUzMl90b19j cHUoX19hKTsgXAoJCQl9KQoKI2RlZmluZSBNU0RPU19MQUJFTF9NQUdJQzEJCTB4NTUKI2RlZmlu ZSBNU0RPU19MQUJFTF9NQUdJQzIJCTB4QUEKCnN0YXRpYyBpbmxpbmUgaW50Cm1zZG9zX21hZ2lj X3ByZXNlbnQodW5zaWduZWQgY2hhciAqcCkgewoJcmV0dXJuIChwWzBdID09IE1TRE9TX0xBQkVM X01BR0lDMSAmJiBwWzFdID09IE1TRE9TX0xBQkVMX01BR0lDMik7Cn0KCnN0cnVjdCBnZW5kaXNr ICpnZW5kaXNrX2hlYWQgPSBOVUxMOwpzdHJ1Y3QgZ2VuZGlzayAqbWFqb3JfZ2VuZGlza1tNQVhf QkxLREVWXSA9IHswLH07CgpzdGF0aWMgaW50IGN1cnJlbnRfbWlub3IgPSAwOwpleHRlcm4gaW50 ICpibGtfc2l6ZVtdOwpleHRlcm4gdm9pZCByZF9sb2FkKHZvaWQpOwpleHRlcm4gdm9pZCBpbml0 cmRfbG9hZCh2b2lkKTsKCmV4dGVybiBpbnQgY2hyX2Rldl9pbml0KHZvaWQpOwpleHRlcm4gaW50 IGJsa19kZXZfaW5pdCh2b2lkKTsKZXh0ZXJuIGludCBpMm9faW5pdCh2b2lkKTsKI2lmZGVmIENP TkZJR19CTEtfREVWX0RBQzk2MApleHRlcm4gdm9pZCBEQUM5NjBfSW5pdGlhbGl6ZSh2b2lkKTsK I2VuZGlmCmV4dGVybiBpbnQgc2NzaV9kZXZfaW5pdCh2b2lkKTsKZXh0ZXJuIGludCBuZXRfZGV2 X2luaXQodm9pZCk7CgojaWZkZWYgQ09ORklHX1BQQwpleHRlcm4gdm9pZCBub3RlX2Jvb3RhYmxl X3BhcnQoa2Rldl90IGRldiwgaW50IHBhcnQsIGludCBnb29kbmVzcyk7CiNlbmRpZgoKc3RhdGlj IGNoYXIgKnJhaWRfbmFtZSAoc3RydWN0IGdlbmRpc2sgKmhkLCBpbnQgbWlub3IsIGludCBtYWpv cl9iYXNlLAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWYpCnsKICAgICAgICBpbnQg Y3RsciA9IGhkLT5tYWpvciAtIG1ham9yX2Jhc2U7CiAgICAgICAgaW50IGRpc2sgPSBtaW5vciA+ PiBoZC0+bWlub3Jfc2hpZnQ7CiAgICAgICAgaW50IHBhcnQgPSBtaW5vciAmICgoIDEgPDwgaGQt Pm1pbm9yX3NoaWZ0KSAtIDEpOwogICAgICAgIGlmIChwYXJ0ID09IDApCiAgICAgICAgICAgICAg ICBzcHJpbnRmKGJ1ZiwgIiVzL2MlZGQlZCIsIGhkLT5tYWpvcl9uYW1lLCBjdGxyLCBkaXNrKTsK ICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgIiVzL2MlZGQlZHAlZCIs IGhkLT5tYWpvcl9uYW1lLCBjdGxyLCBkaXNrLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJ0 KTsKICAgICAgICByZXR1cm4gYnVmOwp9CgojaWZkZWYgQ09ORklHX0FSQ0hfUzM5MAppbnQgKCpn ZW5oZF9kYXNkX25hbWUpKGNoYXIqLGludCxpbnQsc3RydWN0IGdlbmRpc2sqKSA9IE5VTEw7CiNl bmRpZgoKLyoKICogZGlza19uYW1lKCkgaXMgdXNlZCBieSBnZW5oZC5jIGFuZCBtZC5jLgogKiBJ dCBmb3JtYXRzIHRoZSBkZXZpY2VuYW1lIG9mIHRoZSBpbmRpY2F0ZWQgZGlzawogKiBpbnRvIHRo ZSBzdXBwbGllZCBidWZmZXIsIGFuZCByZXR1cm5zIGEgcG9pbnRlcgogKiB0byB0aGF0IHNhbWUg YnVmZmVyIChmb3IgY29udmVuaWVuY2UpLgogKi8KY2hhciAqZGlza19uYW1lIChzdHJ1Y3QgZ2Vu ZGlzayAqaGQsIGludCBtaW5vciwgY2hhciAqYnVmKQp7Cgl1bnNpZ25lZCBpbnQgcGFydDsKCWNv bnN0IGNoYXIgKm1haiA9IGhkLT5tYWpvcl9uYW1lOwoJaW50IHVuaXQgPSAobWlub3IgPj4gaGQt Pm1pbm9yX3NoaWZ0KSArICdhJzsKCiNpZmRlZiBDT05GSUdfQVJDSF9TMzkwCglpZiAoIHN0cm5j bXAgKCBoZC0+bWFqb3JfbmFtZSwiZGFzZCIsNCkgPT0gMCApewoJCXBhcnQgPSBtaW5vciAmICgo MSA8PCBoZC0+bWlub3Jfc2hpZnQpIC0gMSk7CgkJaWYgKCBnZW5oZF9kYXNkX25hbWUgKQoJCQln ZW5oZF9kYXNkX25hbWUoYnVmLG1pbm9yPj5oZC0+bWlub3Jfc2hpZnQscGFydCxoZCk7CgkJcmV0 dXJuIGJ1ZjsKCX0gCiNlbmRpZgoJLyoKCSAqIElERSBkZXZpY2VzIHVzZSBtdWx0aXBsZSBtYWpv ciBudW1iZXJzLCBidXQgdGhlIGRyaXZlcwoJICogYXJlIG5hbWVkIGFzOiAge2hkYSxoZGJ9LCB7 aGRjLGhkZH0sIHtoZGUsaGRmfSwge2hkZyxoZGh9Li4KCSAqIFRoaXMgcmVxdWlyZXMgc3BlY2lh bCBoYW5kbGluZyBoZXJlLgoJICoKCSAqIE1EIGRldmljZXMgYXJlIG5hbWVkIG1kMCwgbWQxLCAu Li4gbWQxNSwgZml4IGl0IHVwIGhlcmUuCgkgKi8KCXN3aXRjaCAoaGQtPm1ham9yKSB7CgkJY2Fz ZSBJREU1X01BSk9SOgoJCQl1bml0ICs9IDI7CgkJY2FzZSBJREU0X01BSk9SOgoJCQl1bml0ICs9 IDI7CgkJY2FzZSBJREUzX01BSk9SOgoJCQl1bml0ICs9IDI7CgkJY2FzZSBJREUyX01BSk9SOgoJ CQl1bml0ICs9IDI7CgkJY2FzZSBJREUxX01BSk9SOgoJCQl1bml0ICs9IDI7CgkJY2FzZSBJREUw X01BSk9SOgoJCQltYWogPSAiaGQiOwoJCQlicmVhazsKCQljYXNlIE1EX01BSk9SOgoJCQl1bml0 ID0gKG1pbm9yID4+IGhkLT5taW5vcl9zaGlmdCkgKyAnMCc7Cgl9CglwYXJ0ID0gbWlub3IgJiAo KDEgPDwgaGQtPm1pbm9yX3NoaWZ0KSAtIDEpOwoJaWYgKGhkLT5tYWpvciA+PSBTQ1NJX0RJU0sx X01BSk9SICYmIGhkLT5tYWpvciA8PSBTQ1NJX0RJU0s3X01BSk9SKSB7CgkJdW5pdCA9IHVuaXQg KyAoaGQtPm1ham9yIC0gU0NTSV9ESVNLMV9NQUpPUiArIDEpICogMTY7CgkJaWYgKHVuaXQgPiAn eicpIHsKCQkJdW5pdCAtPSAneicgKyAxOwoJCQlzcHJpbnRmKGJ1ZiwgInNkJWMlYyIsICdhJyAr IHVuaXQgLyAyNiwgJ2EnICsgdW5pdCAlIDI2KTsKCQkJaWYgKHBhcnQpCgkJCQlzcHJpbnRmKGJ1 ZiArIDQsICIlZCIsIHBhcnQpOwoJCQlyZXR1cm4gYnVmOwoJCX0KCX0KCWlmIChoZC0+bWFqb3Ig Pj0gQ09NUEFRX0NJU1NfTUFKT1IgJiYgaGQtPm1ham9yIDw9CiAgICAgICAgICAgIENPTVBBUV9D SVNTX01BSk9SKzcpIHsKICAgICAgICAgIHJldHVybiByYWlkX25hbWUgKGhkLCBtaW5vciwgQ09N UEFRX0NJU1NfTUFKT1IsIGJ1Zik7CiAgICAgICAgfQoJaWYgKGhkLT5tYWpvciA+PSBDT01QQVFf U01BUlQyX01BSk9SICYmIGhkLT5tYWpvciA8PQogICAgICAgICAgICBDT01QQVFfU01BUlQyX01B Sk9SKzcpIHsKICAgICAgICAgIHJldHVybiByYWlkX25hbWUgKGhkLCBtaW5vciwgQ09NUEFRX1NN QVJUMl9NQUpPUiwgYnVmKTsKIAl9CglpZiAoaGQtPm1ham9yID49IERBQzk2MF9NQUpPUiAmJiBo ZC0+bWFqb3IgPD0gREFDOTYwX01BSk9SKzcpIHsKICAgICAgICAgIHJldHVybiByYWlkX25hbWUg KGhkLCBtaW5vciwgREFDOTYwX01BSk9SLCBidWYpOwogCX0KCWlmIChwYXJ0KQoJCXNwcmludGYo YnVmLCAiJXMlYyVkIiwgbWFqLCB1bml0LCBwYXJ0KTsKCWVsc2UKCQlzcHJpbnRmKGJ1ZiwgIiVz JWMiLCBtYWosIHVuaXQpOwoJcmV0dXJuIGJ1ZjsKfQoKc3RhdGljIHZvaWQgYWRkX3BhcnRpdGlv biAoc3RydWN0IGdlbmRpc2sgKmhkLCBpbnQgbWlub3IsCgkJCQkJaW50IHN0YXJ0LCBpbnQgc2l6 ZSwgaW50IHR5cGUpCnsKCWNoYXIgYnVmW01BWF9ESVNLTkFNRV9MRU5dOwoJc3RydWN0IGhkX3N0 cnVjdCAqcCA9IGhkLT5wYXJ0K21pbm9yOwoKCXAtPnN0YXJ0X3NlY3QgPSBzdGFydDsKCXAtPm5y X3NlY3RzID0gc2l6ZTsKCXAtPnR5cGUgPSB0eXBlOwoKCXByaW50aygiICVzIiwgZGlza19uYW1l KGhkLCBtaW5vciwgYnVmKSk7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGlzX2V4dGVuZGVkX3BhcnRp dGlvbihzdHJ1Y3QgcGFydGl0aW9uICpwKQp7CglyZXR1cm4gKFNZU19JTkQocCkgPT0gRE9TX0VY VEVOREVEX1BBUlRJVElPTiB8fAoJCVNZU19JTkQocCkgPT0gV0lOOThfRVhURU5ERURfUEFSVElU SU9OIHx8CgkJU1lTX0lORChwKSA9PSBMSU5VWF9FWFRFTkRFRF9QQVJUSVRJT04pOwp9CgpzdGF0 aWMgdW5zaWduZWQgaW50IGdldF9wdGFibGVfYmxvY2tzaXplKGtkZXZfdCBkZXYpCnsKCWludCBy ZXQgPSAxMDI0OwoKCS8qCgkgKiBTZWUgd2hldGhlciB0aGUgbG93LWxldmVsIGRyaXZlciBoYXMg Z2l2ZW4gdXMgYSBtaW51bXVtIGJsb2Nrc2l6ZS4KCSAqIElmIHNvLCBjaGVjayB0byBzZWUgd2hl dGhlciBpdCBpcyBsYXJnZXIgdGhhbiB0aGUgZGVmYXVsdCBvZiAxMDI0LgoJICovCglpZiAoIWJs a3NpemVfc2l6ZVtNQUpPUihkZXYpXSkKCQlyZXR1cm4gcmV0OwoKCS8qCgkgKiBDaGVjayBmb3Ig Y2VydGFpbiBzcGVjaWFsIHBvd2VyIG9mIHR3byBzaXplcyB0aGF0IHdlIGFsbG93LgoJICogV2l0 aCBhbnl0aGluZyBsYXJnZXIgdGhhbiAxMDI0LCB3ZSBtdXN0IGZvcmNlIHRoZSBibG9ja3NpemUg dXAgdG8KCSAqIHRoZSBuYXR1cmFsIGJsb2Nrc2l6ZSBmb3IgdGhlIGRldmljZSBzbyB0aGF0IHdl IGRvbid0IGhhdmUgdG8gdHJ5CgkgKiBhbmQgcmVhZCBwYXJ0aWFsIHNlY3RvcnMuICBBbnl0aGlu ZyBzbWFsbGVyIHNob3VsZCBiZSBqdXN0IGZpbmUuCgkgKi8KCglzd2l0Y2goIGJsa3NpemVfc2l6 ZVtNQUpPUihkZXYpXVtNSU5PUihkZXYpXSApIHsKCWNhc2UgMjA0ODoKCQlyZXQgPSAyMDQ4OwoJ CWJyZWFrOwoKCWNhc2UgNDA5NjoKCQlyZXQgPSA0MDk2OwoJCWJyZWFrOwoKCWNhc2UgODE5MjoK CQlyZXQgPSA4MTkyOwoJCWJyZWFrOwoKCWNhc2UgMTAyNDoKCWNhc2UgNTEyOgoJY2FzZSAyNTY6 CgljYXNlIDA6CgkJLyoKCQkgKiBUaGVzZSBhcmUgYWxsIE9LLgoJCSAqLwoJCWJyZWFrOwoKCWRl ZmF1bHQ6CgkJcGFuaWMoIlN0cmFuZ2UgYmxvY2tzaXplIGZvciBwYXJ0aXRpb24gdGFibGVcbiIp OwoJfQoKCXJldHVybiByZXQ7Cn0KCiNpZmRlZiBDT05GSUdfTVNET1NfUEFSVElUSU9OCi8qCiAq IENyZWF0ZSBkZXZpY2VzIGZvciBlYWNoIGxvZ2ljYWwgcGFydGl0aW9uIGluIGFuIGV4dGVuZGVk IHBhcnRpdGlvbi4KICogVGhlIGxvZ2ljYWwgcGFydGl0aW9ucyBmb3JtIGEgbGlua2VkIGxpc3Qs IHdpdGggZWFjaCBlbnRyeSBiZWluZwogKiBhIHBhcnRpdGlvbiB0YWJsZSB3aXRoIHR3byBlbnRy aWVzLiAgVGhlIGZpcnN0IGVudHJ5CiAqIGlzIHRoZSByZWFsIGRhdGEgcGFydGl0aW9uICh3aXRo IGEgc3RhcnQgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbgogKiB0YWJsZSBzdGFydCkuICBUaGUg c2Vjb25kIGlzIGEgcG9pbnRlciB0byB0aGUgbmV4dCBsb2dpY2FsIHBhcnRpdGlvbgogKiAod2l0 aCBhIHN0YXJ0IHJlbGF0aXZlIHRvIHRoZSBlbnRpcmUgZXh0ZW5kZWQgcGFydGl0aW9uKS4KICog V2UgZG8gbm90IGNyZWF0ZSBhIExpbnV4IHBhcnRpdGlvbiBmb3IgdGhlIHBhcnRpdGlvbiB0YWJs ZXMsIGJ1dAogKiBvbmx5IGZvciB0aGUgYWN0dWFsIGRhdGEgcGFydGl0aW9ucy4KICovCgpzdGF0 aWMgdm9pZCBleHRlbmRlZF9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmhkLCBrZGV2X3QgZGV2 LCBpbnQgc2VjdG9yX3NpemUpCnsKCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CglzdHJ1Y3QgcGFy dGl0aW9uICpwOwoJdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IsIGZpcnN0X3NpemUsIHRoaXNf c2VjdG9yLCB0aGlzX3NpemU7CglpbnQgbWFzayA9ICgxIDw8IGhkLT5taW5vcl9zaGlmdCkgLSAx OwoJaW50IGk7CglpbnQgbG9vcGN0ID0gMDsgCS8qIG51bWJlciBvZiBsaW5rcyBmb2xsb3dlZAoJ CQkJICAgd2l0aG91dCBmaW5kaW5nIGEgZGF0YSBwYXJ0aXRpb24gKi8KCglmaXJzdF9zZWN0b3Ig PSBoZC0+cGFydFtNSU5PUihkZXYpXS5zdGFydF9zZWN0OwoJZmlyc3Rfc2l6ZSA9IGhkLT5wYXJ0 W01JTk9SKGRldildLm5yX3NlY3RzOwoJdGhpc19zZWN0b3IgPSBmaXJzdF9zZWN0b3I7CgoJd2hp bGUgKDEpIHsKCQlpZiAoKytsb29wY3QgPiAxMDApCgkJCXJldHVybjsKCQlpZiAoKGN1cnJlbnRf bWlub3IgJiBtYXNrKSA9PSAwKQoJCQlyZXR1cm47CgkJaWYgKCEoYmggPSBicmVhZChkZXYsMCxn ZXRfcHRhYmxlX2Jsb2Nrc2l6ZShkZXYpKSkpCgkJCXJldHVybjsKCSAgLyoKCSAgICogVGhpcyBi bG9jayBpcyBmcm9tIGEgZGV2aWNlIHRoYXQgd2UncmUgYWJvdXQgdG8gc3RvbXAgb24uCgkgICAq IFNvIG1ha2Ugc3VyZSBub2JvZHkgdGhpbmtzIHRoaXMgYmxvY2sgaXMgdXNhYmxlLgoJICAgKi8K CQliaC0+Yl9zdGF0ZSA9IDA7CgoJCWlmICghKG1zZG9zX21hZ2ljX3ByZXNlbnQoYmgtPmJfZGF0 YSArIDUxMCkpKQoJCQlnb3RvIGRvbmU7CgoJCXAgPSAoc3RydWN0IHBhcnRpdGlvbiAqKSAoYmgt PmJfZGF0YSArIDB4MWJlKTsKCgkJdGhpc19zaXplID0gaGQtPnBhcnRbTUlOT1IoZGV2KV0ubnJf c2VjdHM7CgoJCS8qCgkJICogVXN1YWxseSwgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSByZWFsIGRh dGEgcGFydGl0aW9uLAoJCSAqIHRoZSAybmQgZW50cnkgaXMgdGhlIG5leHQgZXh0ZW5kZWQgcGFy dGl0aW9uLCBvciBlbXB0eSwKCQkgKiBhbmQgdGhlIDNyZCBhbmQgNHRoIGVudHJpZXMgYXJlIHVu dXNlZC4KCQkgKiBIb3dldmVyLCBEUkRPUyBzb21ldGltZXMgaGFzIHRoZSBleHRlbmRlZCBwYXJ0 aXRpb24gYXMKCQkgKiB0aGUgZmlyc3QgZW50cnkgKHdoZW4gdGhlIGRhdGEgcGFydGl0aW9uIGlz IGVtcHR5KSwKCQkgKiBhbmQgT1MvMiBzZWVtcyB0byB1c2UgYWxsIGZvdXIgZW50cmllcy4KCQkg Ki8KCgkJLyogCgkJICogRmlyc3QgcHJvY2VzcyB0aGUgZGF0YSBwYXJ0aXRpb24ocykKCQkgKi8K CQlmb3IgKGk9MDsgaTw0OyBpKyssIHArKykgewoJCQlpZiAoIU5SX1NFQ1RTKHApIHx8IGlzX2V4 dGVuZGVkX3BhcnRpdGlvbihwKSkKCQkJCWNvbnRpbnVlOwoKCQkJLyogQ2hlY2sgdGhlIDNyZCBh bmQgNHRoIGVudHJpZXMgLQoJCQkgICB0aGVzZSBzb21ldGltZXMgY29udGFpbiByYW5kb20gZ2Fy YmFnZSAqLwoJCQlpZiAoaSA+PSAyCgkJCQkmJiBTVEFSVF9TRUNUKHApICsgTlJfU0VDVFMocCkg PiB0aGlzX3NpemUKCQkJCSYmICh0aGlzX3NlY3RvciArIFNUQVJUX1NFQ1QocCkgPCBmaXJzdF9z ZWN0b3IgfHwKCQkJCSAgICB0aGlzX3NlY3RvciArIFNUQVJUX1NFQ1QocCkgKyBOUl9TRUNUUyhw KSA+CgkJCQkgICAgIGZpcnN0X3NlY3RvciArIGZpcnN0X3NpemUpKQoJCQkJY29udGludWU7CgoJ CQlhZGRfcGFydGl0aW9uKGhkLCBjdXJyZW50X21pbm9yLCB0aGlzX3NlY3RvcitTVEFSVF9TRUNU KHApKnNlY3Rvcl9zaXplLCAKCQkJCSAgICAgIE5SX1NFQ1RTKHApKnNlY3Rvcl9zaXplLCBwdHlw ZShTWVNfSU5EKHApKSk7CgkJCWN1cnJlbnRfbWlub3IrKzsKCQkJaWYgKChjdXJyZW50X21pbm9y ICYgbWFzaykgPT0gMCkKCQkJCWdvdG8gZG9uZTsKCQkJbG9vcGN0ID0gMDsKCQl9CgkJLyoKCQkg KiBOZXh0LCBwcm9jZXNzIHRoZSAoZmlyc3QpIGV4dGVuZGVkIHBhcnRpdGlvbiwgaWYgcHJlc2Vu dC4KCQkgKiAoU28gZmFyLCB0aGVyZSBzZWVtcyB0byBiZSBubyByZWFzb24gdG8gbWFrZQoJCSAq ICBleHRlbmRlZF9wYXJ0aXRpb24oKSAgcmVjdXJzaXZlIGFuZCBhbGxvdyBhIHRyZWUKCQkgKiAg b2YgZXh0ZW5kZWQgcGFydGl0aW9ucy4pCgkJICogSXQgc2hvdWxkIGJlIGEgbGluayB0byB0aGUg bmV4dCBsb2dpY2FsIHBhcnRpdGlvbi4KCQkgKiBDcmVhdGUgYSBtaW5vciBmb3IgdGhpcyBqdXN0 IGxvbmcgZW5vdWdoIHRvIGdldCB0aGUgbmV4dAoJCSAqIHBhcnRpdGlvbiB0YWJsZS4gIFRoZSBt aW5vciB3aWxsIGJlIHJldXNlZCBmb3IgdGhlIG5leHQKCQkgKiBkYXRhIHBhcnRpdGlvbi4KCQkg Ki8KCQlwIC09IDQ7CgkJZm9yIChpPTA7IGk8NDsgaSsrLCBwKyspCgkJCWlmKE5SX1NFQ1RTKHAp ICYmIGlzX2V4dGVuZGVkX3BhcnRpdGlvbihwKSkKCQkJCWJyZWFrOwoJCWlmIChpID09IDQpCgkJ CWdvdG8gZG9uZTsJIC8qIG5vdGhpbmcgbGVmdCB0byBkbyAqLwoKCQloZC0+cGFydFtjdXJyZW50 X21pbm9yXS5ucl9zZWN0cyA9IE5SX1NFQ1RTKHApICogc2VjdG9yX3NpemU7IC8qIEpTdCAqLwoJ CWhkLT5wYXJ0W2N1cnJlbnRfbWlub3JdLnN0YXJ0X3NlY3QgPSBmaXJzdF9zZWN0b3IgKyBTVEFS VF9TRUNUKHApICogc2VjdG9yX3NpemU7CgkJdGhpc19zZWN0b3IgPSBmaXJzdF9zZWN0b3IgKyBT VEFSVF9TRUNUKHApICogc2VjdG9yX3NpemU7CgkJZGV2ID0gTUtERVYoaGQtPm1ham9yLCBjdXJy ZW50X21pbm9yKTsKCQlicmVsc2UoYmgpOwoJfQpkb25lOgoJYnJlbHNlKGJoKTsKfQoKI2lmZGVm IENPTkZJR19TT0xBUklTX1g4Nl9QQVJUSVRJT04Kc3RhdGljIHZvaWQKc29sYXJpc194ODZfcGFy dGl0aW9uKHN0cnVjdCBnZW5kaXNrICpoZCwga2Rldl90IGRldiwgbG9uZyBvZmZzZXQpIHsKCglz dHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwoJc3RydWN0IHNvbGFyaXNfeDg2X3Z0b2MgKnY7CglzdHJ1 Y3Qgc29sYXJpc194ODZfc2xpY2UgKnM7CglpbnQgbWFzayA9ICgxIDw8IGhkLT5taW5vcl9zaGlm dCkgLSAxOwoJaW50IGk7CgoJaWYoIShiaCA9IGJyZWFkKGRldiwgMCwgZ2V0X3B0YWJsZV9ibG9j a3NpemUoZGV2KSkpKQoJCXJldHVybjsKCXYgPSAoc3RydWN0IHNvbGFyaXNfeDg2X3Z0b2MgKiko YmgtPmJfZGF0YSArIDUxMik7CglpZih2LT52X3Nhbml0eSAhPSBTT0xBUklTX1g4Nl9WVE9DX1NB TkUpIHsKCQlicmVsc2UoYmgpOwoJCXJldHVybjsKCX0KCXByaW50aygiIDxzb2xhcmlzOiIpOwoJ aWYodi0+dl92ZXJzaW9uICE9IDEpIHsKCQlwcmludGsoIiAgY2Fubm90IGhhbmRsZSB2ZXJzaW9u ICVsZCB2dG9jPiIsIHYtPnZfdmVyc2lvbik7CgkJYnJlbHNlKGJoKTsKCQlyZXR1cm47Cgl9Cglm b3IoaT0wOyBpPFNPTEFSSVNfWDg2X05VTVNMSUNFOyBpKyspIHsKCQlpZiAoKGN1cnJlbnRfbWlu b3IgJiBtYXNrKSA9PSAwKQoJCQlicmVhazsKCgkJcyA9ICZ2LT52X3NsaWNlW2ldOwoKCQlpZiAo cy0+c19zaXplID09IDApCgkJCWNvbnRpbnVlOwoKCQlwcmludGsoIiBbcyVkXSIsIGkpOwoJCS8q IHNvbGFyaXMgcGFydGl0aW9ucyBhcmUgcmVsYXRpdmUgdG8gY3VycmVudCBNUy1ET1MKCQkgKiBv bmUgYnV0IGFkZF9wYXJ0aXRpb24gc3RhcnRzIHJlbGF0aXZlIHRvIHNlY3RvcgoJCSAqIHplcm8g b2YgdGhlIGRpc2suICBUaGVyZWZvcmUsIG11c3QgYWRkIHRoZSBvZmZzZXQKCQkgKiBvZiB0aGUg Y3VycmVudCBwYXJ0aXRpb24gKi8KCQlhZGRfcGFydGl0aW9uKGhkLCBjdXJyZW50X21pbm9yLAoJ CQkJCXMtPnNfc3RhcnQrb2Zmc2V0LCBzLT5zX3NpemUsIDApOwoJCWN1cnJlbnRfbWlub3IrKzsK CX0KCWJyZWxzZShiaCk7CglwcmludGsoIiA+Iik7Cn0KI2VuZGlmCgojaWZkZWYgQ09ORklHX0JT RF9ESVNLTEFCRUwKc3RhdGljIHZvaWQgY2hlY2tfYW5kX2FkZF9ic2RfcGFydGl0aW9uKHN0cnVj dCBnZW5kaXNrICpoZCwKCQkJCQlzdHJ1Y3QgYnNkX3BhcnRpdGlvbiAqYnNkX3AsIGtkZXZfdCBk ZXYpCnsKCXN0cnVjdCBoZF9zdHJ1Y3QgKmxpbl9wOwoJCS8qIGNoZWNrIHJlbGF0aXZlIHBvc2l0 aW9uIG9mIHBhcnRpdGlvbnMuICAqLwoJZm9yIChsaW5fcCA9IGhkLT5wYXJ0ICsgMSArIE1JTk9S KGRldik7CgkgICAgIGxpbl9wIC0gaGQtPnBhcnQgLSBNSU5PUihkZXYpIDwgY3VycmVudF9taW5v cjsgbGluX3ArKykgewoJCQkvKiBubyByZWxhdGlvbnNoaXAgLT4gdHJ5IGFnYWluICovCgkJaWYg KGxpbl9wLT5zdGFydF9zZWN0ICsgbGluX3AtPm5yX3NlY3RzIDw9IGJzZF9wLT5wX29mZnNldCAK CQkJfHwgbGluX3AtPnN0YXJ0X3NlY3QgPj0gYnNkX3AtPnBfb2Zmc2V0ICsgYnNkX3AtPnBfc2l6 ZSkKCQkJY29udGludWU7CQoJCQkvKiBlcXVhbCAtPiBubyBuZWVkIHRvIGFkZCAqLwoJCWlmIChs aW5fcC0+c3RhcnRfc2VjdCA9PSBic2RfcC0+cF9vZmZzZXQgJiYgCgkJCWxpbl9wLT5ucl9zZWN0 cyA9PSBic2RfcC0+cF9zaXplKSAKCQkJcmV0dXJuOwoJCQkvKiBic2QgbGl2aW5nIHdpdGhpbiBk b3MgcGFydGl0aW9uICovCgkJaWYgKGxpbl9wLT5zdGFydF9zZWN0IDw9IGJzZF9wLT5wX29mZnNl dCAmJiBsaW5fcC0+c3RhcnRfc2VjdCAKCQkJKyBsaW5fcC0+bnJfc2VjdHMgPj0gYnNkX3AtPnBf b2Zmc2V0ICsgYnNkX3AtPnBfc2l6ZSkgewojaWZkZWYgREVCVUdfQlNEX0RJU0tMQUJFTAoJCQlw cmludGsoInc6ICVkICVsZCslbGQsJWQrJWQiLCAKCQkJCWxpbl9wIC0gaGQtPnBhcnQsIAoJCQkJ bGluX3AtPnN0YXJ0X3NlY3QsIGxpbl9wLT5ucl9zZWN0cywgCgkJCQlic2RfcC0+cF9vZmZzZXQs IGJzZF9wLT5wX3NpemUpOwojZW5kaWYKCQkJYnJlYWs7CgkJfQoJIC8qIG91Y2g6IGJzZCBhbmQg bGludXggb3ZlcmxhcC4gRG9uJ3QgZXZlbiB0cnkgZm9yIHRoYXQgcGFydGl0aW9uICovCiNpZmRl ZiBERUJVR19CU0RfRElTS0xBQkVMCgkJcHJpbnRrKCI/Pz86ICVkICVsZCslbGQsJWQrJWQiLAoJ CQlsaW5fcCAtIGhkLT5wYXJ0LCBsaW5fcC0+c3RhcnRfc2VjdCwgbGluX3AtPm5yX3NlY3RzLAoJ CQlic2RfcC0+cF9vZmZzZXQsIGJzZF9wLT5wX3NpemUpOwojZW5kaWYKCQlwcmludGsoIj8/PyIp OwoJCXJldHVybjsKCX0gLyogaWYgdGhlIGJzZCBwYXJ0aXRpb24gaXMgbm90IGN1cnJlbnRseSBr bm93biB0byBsaW51eCwgd2UgZW5kCgkgICAqIHVwIGhlcmUgCgkgICAqLwoJYWRkX3BhcnRpdGlv bihoZCwgY3VycmVudF9taW5vciwgYnNkX3AtPnBfb2Zmc2V0LCBic2RfcC0+cF9zaXplLCAwKTsK CWN1cnJlbnRfbWlub3IrKzsKfQovKiAKICogQ3JlYXRlIGRldmljZXMgZm9yIEJTRCBwYXJ0aXRp b25zIGxpc3RlZCBpbiBhIGRpc2tsYWJlbCwgdW5kZXIgYQogKiBkb3MtbGlrZSBwYXJ0aXRpb24u IFNlZSBleHRlbmRlZF9wYXJ0aXRpb24oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICovCnN0YXRp YyB2b2lkIGJzZF9kaXNrbGFiZWxfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpoZCwga2Rldl90 IGRldiwgCiAgIGludCBtYXhfcGFydGl0aW9ucykKewoJc3RydWN0IGJ1ZmZlcl9oZWFkICpiaDsK CXN0cnVjdCBic2RfZGlza2xhYmVsICpsOwoJc3RydWN0IGJzZF9wYXJ0aXRpb24gKnA7CglpbnQg bWFzayA9ICgxIDw8IGhkLT5taW5vcl9zaGlmdCkgLSAxOwoKCWlmICghKGJoID0gYnJlYWQoZGV2 LDAsZ2V0X3B0YWJsZV9ibG9ja3NpemUoZGV2KSkpKQoJCXJldHVybjsKCWJoLT5iX3N0YXRlID0g MDsKCWwgPSAoc3RydWN0IGJzZF9kaXNrbGFiZWwgKikgKGJoLT5iX2RhdGErNTEyKTsKCWlmIChs LT5kX21hZ2ljICE9IEJTRF9ESVNLTUFHSUMpIHsKCQlicmVsc2UoYmgpOwoJCXJldHVybjsKCX0K CglpZiAobC0+ZF9ucGFydGl0aW9ucyA8IG1heF9wYXJ0aXRpb25zKQoJCW1heF9wYXJ0aXRpb25z ID0gbC0+ZF9ucGFydGl0aW9uczsKCWZvciAocCA9IGwtPmRfcGFydGl0aW9uczsgcCAtIGwtPmRf cGFydGl0aW9ucyA8ICBtYXhfcGFydGl0aW9uczsgcCsrKSB7CgkJaWYgKChjdXJyZW50X21pbm9y ICYgbWFzaykgPj0gKDQgKyBoZC0+bWF4X3ApKQoJCQlicmVhazsKCgkJaWYgKHAtPnBfZnN0eXBl ICE9IEJTRF9GU19VTlVTRUQpIAoJCQljaGVja19hbmRfYWRkX2JzZF9wYXJ0aXRpb24oaGQsIHAs IGRldik7Cgl9CglicmVsc2UoYmgpOwoKfQojZW5kaWYKCiNpZmRlZiBDT05GSUdfVU5JWFdBUkVf RElTS0xBQkVMCi8qCiAqIENyZWF0ZSBkZXZpY2VzIGZvciBVbml4d2FyZSBwYXJ0aXRpb25zIGxp c3RlZCBpbiBhIGRpc2tsYWJlbCwgdW5kZXIgYQogKiBkb3MtbGlrZSBwYXJ0aXRpb24uIFNlZSBl eHRlbmRlZF9wYXJ0aXRpb24oKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICovCnN0YXRpYyB2b2lk IHVuaXh3YXJlX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqaGQsIGtkZXZfdCBkZXYpCnsKCXN0 cnVjdCBidWZmZXJfaGVhZCAqYmg7CglzdHJ1Y3QgdW5peHdhcmVfZGlza2xhYmVsICpsOwoJc3Ry dWN0IHVuaXh3YXJlX3NsaWNlICpwOwoJaW50IG1hc2sgPSAoMSA8PCBoZC0+bWlub3Jfc2hpZnQp IC0gMTsKCglpZiAoIShiaCA9IGJyZWFkKGRldiwgMTQsIGdldF9wdGFibGVfYmxvY2tzaXplKGRl dikpKSkKCQlyZXR1cm47CgliaC0+Yl9zdGF0ZSA9IDA7CglsID0gKHN0cnVjdCB1bml4d2FyZV9k aXNrbGFiZWwgKikgKGJoLT5iX2RhdGErNTEyKTsKCWlmIChsZTMyX3RvX2NwdShsLT5kX21hZ2lj KSAhPSBVTklYV0FSRV9ESVNLTUFHSUMgfHwKCSAgICBsZTMyX3RvX2NwdShsLT52dG9jLnZfbWFn aWMpICE9IFVOSVhXQVJFX0RJU0tNQUdJQzIpIHsKCQlicmVsc2UoYmgpOwoJCXJldHVybjsKCX0K CXByaW50aygiIDx1bml4d2FyZToiKTsKCXAgPSAmbC0+dnRvYy52X3NsaWNlWzFdOwoJLyogSSBv bWl0IHRoZSAwdGggc2xpY2UgYXMgaXQgaXMgdGhlIHNhbWUgYXMgd2hvbGUgZGlzay4gKi8KCXdo aWxlIChwIC0gJmwtPnZ0b2Mudl9zbGljZVswXSA8IFVOSVhXQVJFX05VTVNMSUNFKSB7CgkJaWYg KChjdXJyZW50X21pbm9yICYgbWFzaykgPT0gMCkKCQkJYnJlYWs7CgoJCWlmIChwLT5zX2xhYmVs ICE9IFVOSVhXQVJFX0ZTX1VOVVNFRCkgewoJCQlhZGRfcGFydGl0aW9uKGhkLCBjdXJyZW50X21p bm9yLCBTVEFSVF9TRUNUKHApLCBOUl9TRUNUUyhwKSwgMCk7CgkJCWN1cnJlbnRfbWlub3IrKzsK CQl9CgkJcCsrOwoJfQoJYnJlbHNlKGJoKTsKCXByaW50aygiID4iKTsKfQojZW5kaWYKCQkKI2lm ZGVmIENPTkZJR19NSU5JWF9TVUJQQVJUSVRJT04KLyoKICogTWluaXggMi4wLjAvMi4wLjIgc3Vi cGFydGl0aW9uIHN1cHBvcnQuCiAqIEFuYW5kIEtyaXNobmFtdXJ0aHkgPGFuYW5ka0B3aXByb2dl Lm1lZC5nZS5jb20+CiAqIFJhamVldiBWLiBQaWxsYWkgICAgPHJhamVldnZwQHlhaG9vLmNvbT4K ICovCiNkZWZpbmUgTUlOSVhfUEFSVElUSU9OICAgICAgICAgMHg4MSAgLyogTWluaXggUGFydGl0 aW9uIElEICovCiNkZWZpbmUgTUlOSVhfTlJfU1VCUEFSVElUSU9OUyAgNApzdGF0aWMgdm9pZCBt aW5peF9wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmhkLCBrZGV2X3QgZGV2KQp7CglzdHJ1Y3Qg YnVmZmVyX2hlYWQgKmJoOwoJc3RydWN0IHBhcnRpdGlvbiAqcDsKCWludCBtYXNrID0gKDEgPDwg aGQtPm1pbm9yX3NoaWZ0KSAtIDE7CglpbnQgaTsKCglpZiAoIShiaCA9IGJyZWFkKGRldiwgMCwg Z2V0X3B0YWJsZV9ibG9ja3NpemUoZGV2KSkpKQoJCXJldHVybjsKCWJoLT5iX3N0YXRlID0gMDsK CglwID0gKHN0cnVjdCBwYXJ0aXRpb24gKikoYmgtPmJfZGF0YSArIDB4MWJlKTsKCgkvKiBUaGUg Zmlyc3Qgc2VjdG9yIG9mIGEgTWluaXggcGFydGl0aW9uIGNhbiBoYXZlIGVpdGhlcgoJICogYSBz ZWNvbmRhcnkgTUJSIGRlc2NyaWJpbmcgaXRzIHN1YnBhcnRpdGlvbnMsIG9yCgkgKiB0aGUgbm9y bWFsIGJvb3Qgc2VjdG9yLiAqLwoJaWYgKG1zZG9zX21hZ2ljX3ByZXNlbnQoYmgtPmJfZGF0YSAr IDUxMCkgJiYKCSAgICBTWVNfSU5EKHApID09IE1JTklYX1BBUlRJVElPTikgeyAvKiBzdWJwYXJ0 aXRpb24gdGFibGUgcHJlc2VudCAqLwoKCQlwcmludGsoIiA8Iik7CgkJZm9yIChpID0gMDsgaSA8 IE1JTklYX05SX1NVQlBBUlRJVElPTlM7IGkrKywgcCsrKSB7CgkJCWlmICgoY3VycmVudF9taW5v ciAmIG1hc2spID09IDApIAoJCQkJYnJlYWs7CgkJCS8qIGFkZCBlYWNoIHBhcnRpdGlvbiBpbiB1 c2UgKi8KCQkJaWYgKFNZU19JTkQocCkgPT0gTUlOSVhfUEFSVElUSU9OKSB7CgkJCQlhZGRfcGFy dGl0aW9uKGhkLCBjdXJyZW50X21pbm9yLAoJCQkJCSAgICAgIFNUQVJUX1NFQ1QocCksIE5SX1NF Q1RTKHApLCAwKTsKCQkJCWN1cnJlbnRfbWlub3IrKzsKCQkJfQoJCX0KCQlwcmludGsoIiA+Iik7 Cgl9CglicmVsc2UoYmgpOwp9CiNlbmRpZiAvKiBDT05GSUdfTUlOSVhfU1VCUEFSVElUSU9OICov CiAKc3RhdGljIGludCBtc2Rvc19wYXJ0aXRpb24oc3RydWN0IGdlbmRpc2sgKmhkLCBrZGV2X3Qg ZGV2LCB1bnNpZ25lZCBsb25nIGZpcnN0X3NlY3RvcikKewoJaW50IGksIG1pbm9yID0gY3VycmVu dF9taW5vcjsKCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CglzdHJ1Y3QgcGFydGl0aW9uICpwOwoJ dW5zaWduZWQgY2hhciAqZGF0YTsKCWludCBtYXNrID0gKDEgPDwgaGQtPm1pbm9yX3NoaWZ0KSAt IDE7CglpbnQgc2VjdG9yX3NpemU7CiAgICAgICAgaW50IGRpc2tfbnVtYmVyX29mX3NlY3RzOwoj aWZkZWYgQ09ORklHX0JTRF9ESVNLTEFCRUwKCS8qIG5vIGJzZCBkaXNrbGFiZWwgYXMgYSBkZWZh dWx0ICovCglrZGV2X3QgYnNkX2tkZXYgPSAwOwoJaW50IGJzZF9tYXhwYXJ0ID0gQlNEX01BWFBB UlRJVElPTlM7CiNlbmRpZgojaWZkZWYgQ09ORklHX0JMS19ERVZfSURFCglpbnQgdGVzdGVkX2Zv cl94bGF0ZSA9IDA7CgpyZWFkX21icjoKI2VuZGlmCglpZiAoIShiaCA9IGJyZWFkKGRldiwwLGdl dF9wdGFibGVfYmxvY2tzaXplKGRldikpKSkgewoJCXByaW50aygiIHVuYWJsZSB0byByZWFkIHBh cnRpdGlvbiB0YWJsZVxuIik7CgkJcmV0dXJuIC0xOwoJfQoKCS8qIGluIHNvbWUgY2FzZXMgKGJh Y2t3YXJkcyBjb21wYXRpYmlsaXR5KSB3ZSdsbCBhZGp1c3QgdGhlCiAgICAgICAgICogc2VjdG9y X3NpemUgYmVsb3cKICAgICAgICAgKi8KICAgICAgICBpZiAoaGFyZHNlY3Rfc2l6ZVtNQUpPUihk ZXYpXSAhPSBOVUxMKQogICAgICAgICAgICAgICBzZWN0b3Jfc2l6ZT1oYXJkc2VjdF9zaXplW01B Sk9SKGRldildW01JTk9SKGRldildLzUxMjsKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHNl Y3Rvcl9zaXplPTE7CgoJZGF0YSA9IGJoLT5iX2RhdGE7CgkvKiBJbiBzb21lIGNhc2VzIHdlIG1v ZGlmeSB0aGUgZ2VvbWV0cnkgICAgKi8KCS8qICBvZiB0aGUgZHJpdmUgKGJlbG93KSwgc28gZW5z dXJlIHRoYXQgICAqLwoJLyogIG5vYm9keSBlbHNlIHRyaWVzIHRvIHJlLXVzZSB0aGlzIGRhdGEu ICovCgliaC0+Yl9zdGF0ZSA9IDA7CiNpZmRlZiBDT05GSUdfQkxLX0RFVl9JREUKY2hlY2tfdGFi bGU6CiNlbmRpZgoJaWYgKCEobXNkb3NfbWFnaWNfcHJlc2VudChkYXRhICsgNTEwKSkpIHsKCQli cmVsc2UoYmgpOwoJCXJldHVybiAwOwoJfQoJcCA9IChzdHJ1Y3QgcGFydGl0aW9uICopIChkYXRh ICsgMHgxYmUpOwoKI2lmZGVmIENPTkZJR19CTEtfREVWX0lERQoJaWYgKCF0ZXN0ZWRfZm9yX3hs YXRlKyspIHsJLyogRG8gdGhpcyBvbmx5IG9uY2UgcGVyIGRpc2sgKi8KCQkvKgoJCSAqIExvb2sg Zm9yIHZhcmlvdXMgZm9ybXMgb2YgSURFIGRpc2sgZ2VvbWV0cnkgdHJhbnNsYXRpb24KCQkgKi8K CQlleHRlcm4gaW50IGlkZV94bGF0ZV8xMDI0KGtkZXZfdCwgaW50LCBjb25zdCBjaGFyICopOwoJ CXVuc2lnbmVkIGludCBzaWcgPSBsZTE2X3RvX2NwdSgqKHVuc2lnbmVkIHNob3J0ICopKGRhdGEg KyAyKSk7CgkJaWYgKFNZU19JTkQocCkgPT0gRVpEX1BBUlRJVElPTikgewoJCQkvKgoJCQkgKiBU aGUgcmVtYWluZGVyIG9mIHRoZSBkaXNrIG11c3QgYmUgYWNjZXNzZWQgdXNpbmcKCQkJICogYSB0 cmFuc2xhdGVkIGdlb21ldHJ5IHRoYXQgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIAoJCQkgKiBhcHBh cmVudCBjeWxpbmRlcnMgdG8gbGVzcyB0aGFuIDEwMjQgaWYgcG9zc2libGUuCgkJCSAqCgkJCSAq IGlkZV94bGF0ZV8xMDI0KCkgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIG5lY2Vzc2FyeQoJCQkgKiBh ZGp1c3RtZW50cyB0byBmb29sIGZkaXNrL0xJTE8gYW5kIHBhcnRpdGlvbiBjaGVjay4KCQkJICov CgkJCWlmIChpZGVfeGxhdGVfMTAyNChkZXYsIC0xLCAiIFtFWkRdIikpIHsKCQkJCWRhdGEgKz0g NTEyOwoJCQkJZ290byBjaGVja190YWJsZTsKCQkJfQoJCX0gZWxzZSBpZiAoU1lTX0lORChwKSA9 PSBETTZfUEFSVElUSU9OKSB7CgoJCQkvKgoJCQkgKiBFdmVyeXRoaW5nIG9uIHRoZSBkaXNrIGlz IG9mZnNldCBieSA2MyBzZWN0b3JzLAoJCQkgKiBpbmNsdWRpbmcgYSAibmV3IiBNQlIgd2l0aCBp dHMgb3duIHBhcnRpdGlvbiB0YWJsZSwKCQkJICogYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIGRp c2sgbXVzdCBiZSBhY2Nlc3NlZCB1c2luZwoJCQkgKiBhIHRyYW5zbGF0ZWQgZ2VvbWV0cnkgdGhh dCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgCgkJCSAqIGFwcGFyZW50IGN5bGluZGVycyB0byBsZXNz IHRoYW4gMTAyNCBpZiBwb3NzaWJsZS4KCQkJICoKCQkJICogaWRlX3hsYXRlXzEwMjQoKSB3aWxs IHRha2UgY2FyZSBvZiB0aGUgbmVjZXNzYXJ5CgkJCSAqIGFkanVzdG1lbnRzIHRvIGZvb2wgZmRp c2svTElMTyBhbmQgcGFydGl0aW9uIGNoZWNrLgoJCQkgKi8KCQkJaWYgKGlkZV94bGF0ZV8xMDI0 KGRldiwgMSwgIiBbRE02OkRET10iKSkgewoJCQkJYnJlbHNlKGJoKTsKCQkJCWdvdG8gcmVhZF9t YnI7CS8qIHN0YXJ0IG92ZXIgd2l0aCBuZXcgTUJSICovCgkJCX0KCQl9IGVsc2UgaWYgKHNpZyA8 PSAweDFhZSAmJgoJCQkgICAqKHVuc2lnbmVkIHNob3J0ICopKGRhdGEgKyBzaWcpID09IGNwdV90 b19sZTE2KDB4NTVBQSkgJiYKCQkJICAgKDEgJiAqKHVuc2lnbmVkIGNoYXIgKikoZGF0YSArIHNp ZyArIDIpKSkgewoJCQkvKiBETTYgc2lnbmF0dXJlIGluIE1CUiwgY291cnRlc3kgb2YgT25UcmFj ayAqLwoJCQkodm9pZCkgaWRlX3hsYXRlXzEwMjQgKGRldiwgMCwgIiBbRE02Ok1CUl0iKTsKCQl9 IGVsc2UgaWYgKFNZU19JTkQocCkgPT0gRE02X0FVWDFQQVJUSVRJT04gfHwgU1lTX0lORChwKSA9 PSBETTZfQVVYM1BBUlRJVElPTikgewoJCQkvKgoJCQkgKiBETTYgb24gb3RoZXIgdGhhbiB0aGUg Zmlyc3QgKGJvb3QpIGRyaXZlCgkJCSAqLwoJCQkodm9pZCkgaWRlX3hsYXRlXzEwMjQoZGV2LCAw LCAiIFtETTY6QVVYXSIpOwoJCX0gZWxzZSB7CgkJCS8qCgkJCSAqIEV4YW1pbmUgdGhlIHBhcnRp dGlvbiB0YWJsZSBmb3IgY29tbW9uIHRyYW5zbGF0aW9ucy4KCQkJICogVGhpcyBpcyB1c2VmdWwg Zm9yIGRyaXZlcyBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZQoJCQkgKiB0cmFuc2xhdGVkIGdlb21l dHJ5IGlzIHVuYXZhaWxhYmxlIGZyb20gdGhlIEJJT1MuCgkJCSAqLwoJCQlmb3IgKGkgPSAwOyBp IDwgNDsgaSsrKSB7CgkJCQlzdHJ1Y3QgcGFydGl0aW9uICpxID0gJnBbaV07CgkJCQlpZiAoTlJf U0VDVFMocSkKCQkJCSAgICYmIChxLT5zZWN0b3IgJiA2MykgPT0gMQoJCQkJICAgJiYgKHEtPmVu ZF9zZWN0b3IgJiA2MykgPT0gNjMpIHsKCQkJCQl1bnNpZ25lZCBpbnQgaGVhZHMgPSBxLT5lbmRf aGVhZCArIDE7CgkJCQkJaWYgKGhlYWRzID09IDMyIHx8IGhlYWRzID09IDY0IHx8CgkJCQkJICAg IGhlYWRzID09IDEyOCB8fCBoZWFkcyA9PSAyNDAgfHwKCQkJCQkgICAgaGVhZHMgPT0gMjU1KSB7 CgkJCQkJCSh2b2lkKSBpZGVfeGxhdGVfMTAyNChkZXYsIGhlYWRzLCAiIFtQVEJMXSIpOwoJCQkJ CQlicmVhazsKCQkJCQl9CgkJCQl9CgkJCX0KCQl9Cgl9CiNlbmRpZgkvKiBDT05GSUdfQkxLX0RF Vl9JREUgKi8KCgkvKgogICAgICAgICAqIFRoZSBMaW51eCBjb2RlIG5vdyBob25vdXJzIHRoZSBy dWxlcyB0aGUgTU8gcGVvcGxlIHNldCBhbmQKICAgICAgICAgKiBpcyAnRE9TIGNvbXBhdGlibGUn IC0gc2l6ZXMgYXJlIHNjYWxlZCBieSB0aGUgbWVkaWEgYmxvY2sKCSAqIHNpemUgbm90IDUxMiBi eXRlcy4gVGhlIGZvbGxvd2luZyBpcyBhIGJhY2t3YXJkcwoJICogY29tcGF0aWJpbGl0eSBjaGVj ay4gSWYgYSAxayBvciBncmVhdGVyIHNlY3RvcnNpemUgZGlzawoJICogKDEwMjQsIDIwNDgsIGV0 Yykgd2FzIGNyZWF0ZWQgdW5kZXIgYSBwcmUgMi4yIGtlcm5lbCwKCSAqIHRoZSBwYXJ0aXRpb24g dGFibGUgd3JvbmdseSB1c2VkIHVuaXRzIG9mIDUxMiBpbnN0ZWFkIG9mCiAgICAgICAgICogdW5p dHMgb2Ygc2VjdG9yc2l6ZSAoMTAyNCwgMjA0OCwgZXRjLikgVGhlIGJlbG93IGNoZWNrIGF0dGVt cHRzCiAgICAgICAgICogdG8gZGV0ZWN0IGEgcGFydGl0aW9uIHRhYmxlIGNyZWF0ZWQgdW5kZXIg dGhlIG9sZGVyIGtlcm5lbCwgYW5kCiAgICAgICAgICogaWYgc28gZGV0ZWN0ZWQsIGl0IHdpbGwg cmVzZXQgdGhlIGEgc2VjdG9yIHNjYWxlIGZhY3RvciB0byAxIChpLmUuCiAgICAgICAgICogbm8g c2NhbGluZykuCgkgKi8KICAgICAgICBkaXNrX251bWJlcl9vZl9zZWN0cyA9IE5SX1NFQ1RTKCgm aGQtPnBhcnRbTUlOT1IoZGV2KV0pKTsKCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKCQlzdHJ1 Y3QgcGFydGl0aW9uICpxID0gJnBbaV07CgkJaWYgKE5SX1NFQ1RTKHEpKSB7CgkJICAgICAgICBp ZiAoKChmaXJzdF9zZWN0b3IrKFNUQVJUX1NFQ1QocSkrTlJfU0VDVFMocSkpKnNlY3Rvcl9zaXpl KSA+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpc2tfbnVtYmVyX29mX3NlY3RzKzEp KSAmJgoJCSAgICAgICAgICAgICgoZmlyc3Rfc2VjdG9yKyhTVEFSVF9TRUNUKHEpK05SX1NFQ1RT KHEpKSA8PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2tfbnVtYmVyX29mX3NlY3Rz KSkpIHsKCSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmW01BWF9ESVNLTkFNRV9MRU5d OwoJICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRrKCIgJXM6IFJFU0VUVElOR0lORyBTRUNU T1IgU0NBTEUgZnJvbSAlZCB0byAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgZGlza19uYW1lKGhkLCBNSU5PUihkZXYpLCBidWYpLCBzZWN0b3Jfc2l6ZSk7CgkJICAg ICAgICAgICAgICAgIHNlY3Rvcl9zaXplPTE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgYnJlYWs7CgkJICAgICAgICB9CgkJfQoJfQoKCWN1cnJlbnRfbWlub3IgKz0gNDsgIC8qIGZp cnN0ICJleHRyYSIgbWlub3IgKGZvciBleHRlbmRlZCBwYXJ0aXRpb25zKSAqLwoJZm9yIChpPTEg OyBpPD00IDsgbWlub3IrKyxpKysscCsrKSB7CgkJaWYgKCFOUl9TRUNUUyhwKSkKCQkJY29udGlu dWU7CiAgICAgICAgICAgICAgIGFkZF9wYXJ0aXRpb24oaGQsIG1pbm9yLCBmaXJzdF9zZWN0b3Ir U1RBUlRfU0VDVChwKSpzZWN0b3Jfc2l6ZSwKCQkJICAgICBOUl9TRUNUUyhwKSpzZWN0b3Jfc2l6 ZSwgcHR5cGUoU1lTX0lORChwKSkpOwoJCWlmIChpc19leHRlbmRlZF9wYXJ0aXRpb24ocCkpIHsK CQkJcHJpbnRrKCIgPCIpOwoJCQkvKgoJCQkgKiBJZiB3ZSBhcmUgcmVyZWFkaW5nIHRoZSBwYXJ0 aXRpb24gdGFibGUsIHdlIG5lZWQKCQkJICogdG8gc2V0IHRoZSBzaXplIG9mIHRoZSBwYXJ0aXRp b24gc28gdGhhdCB3ZSB3aWxsCgkJCSAqIGJlIGFibGUgdG8gYnJlYWQgdGhlIGJsb2NrIGNvbnRh aW5pbmcgdGhlIGV4dGVuZGVkCgkJCSAqIHBhcnRpdGlvbiBpbmZvLgoJCQkgKi8KCQkJaGQtPnNp emVzW21pbm9yXSA9IGhkLT5wYXJ0W21pbm9yXS5ucl9zZWN0cyAKCQkJICAJPj4gKEJMT0NLX1NJ WkVfQklUUyAtIDkpOwoJCQlleHRlbmRlZF9wYXJ0aXRpb24oaGQsIE1LREVWKGhkLT5tYWpvciwg bWlub3IpLCBzZWN0b3Jfc2l6ZSk7CgkJCXByaW50aygiID4iKTsKCQkJLyogcHJldmVudCBzb21l b25lIGRvaW5nIG1rZnMgb3IgbWtzd2FwIG9uIGFuCgkJCSAgIGV4dGVuZGVkIHBhcnRpdGlvbiwg YnV0IGxlYXZlIHJvb20gZm9yIExJTE8gKi8KCQkJaWYgKGhkLT5wYXJ0W21pbm9yXS5ucl9zZWN0 cyA+IDIpCgkJCQloZC0+cGFydFttaW5vcl0ubnJfc2VjdHMgPSAyOwoJCX0KI2lmZGVmIENPTkZJ R19CU0RfRElTS0xBQkVMCgkJCS8qIHRhZyBmaXJzdCBkaXNrbGFiZWwgZm9yIGxhdGUgcmVjb2du aXRpb24gKi8KCQlpZiAoU1lTX0lORChwKSA9PSBCU0RfUEFSVElUSU9OIHx8IFNZU19JTkQocCkg PT0gTkVUQlNEX1BBUlRJVElPTikgewoJCQlwcmludGsoIiEiKTsKCQkJaWYgKCFic2Rfa2RldikK CQkJCWJzZF9rZGV2ID0gTUtERVYoaGQtPm1ham9yLCBtaW5vcik7CgkJfSBlbHNlIGlmIChTWVNf SU5EKHApID09IE9QRU5CU0RfUEFSVElUSU9OKSB7CgkJCXByaW50aygiISIpOwoJCQlpZiAoIWJz ZF9rZGV2KSB7CgkJCQlic2Rfa2RldiA9IE1LREVWKGhkLT5tYWpvciwgbWlub3IpOwoJCQkJYnNk X21heHBhcnQgPSBPUEVOQlNEX01BWFBBUlRJVElPTlM7CgkJCX0KCQl9CiNlbmRpZgojaWZkZWYg Q09ORklHX01JTklYX1NVQlBBUlRJVElPTgoJCWlmIChTWVNfSU5EKHApID09IE1JTklYX1BBUlRJ VElPTikgewoJCQlwcmludGsoIkAiKTsJLyogTWluaXggcGFydGl0aW9ucyBhcmUgaW5kaWNhdGVk IGJ5ICdAJyAqLwoJCQltaW5peF9wYXJ0aXRpb24oaGQsIE1LREVWKGhkLT5tYWpvciwgbWlub3Ip KTsKCQl9CiNlbmRpZgojaWZkZWYgQ09ORklHX1VOSVhXQVJFX0RJU0tMQUJFTAoJCWlmIChTWVNf SU5EKHApID09IFVOSVhXQVJFX1BBUlRJVElPTikKCQkJdW5peHdhcmVfcGFydGl0aW9uKGhkLCBN S0RFVihoZC0+bWFqb3IsIG1pbm9yKSk7CiNlbmRpZgojaWZkZWYgQ09ORklHX1NPTEFSSVNfWDg2 X1BBUlRJVElPTgoKCQkvKiBqYW1lc0BicGdjLmNvbTogU29sYXJpcyBoYXMgYSBuYXN0eSBpbmRp Y2F0b3I6IDB4ODIKCQkgKiB3aGljaCBhbHNvIG1lYW5zIGxpbnV4IHN3YXAuICBGb3IgdGhhdCBy ZWFzb24sIGFsbAoJCSAqIG9mIHRoZSBwcmludHMgYXJlIGRvbmUgaW5zaWRlIHRoZQoJCSAqIHNv bGFyaXNfeDg2X3BhcnRpdGlvbiByb3V0aW5lICovCgoJCWlmKFNZU19JTkQocCkgPT0gU09MQVJJ U19YODZfUEFSVElUSU9OKSB7CgkJCXNvbGFyaXNfeDg2X3BhcnRpdGlvbihoZCwgTUtERVYoaGQt Pm1ham9yLCBtaW5vciksCgkJCQkJICAgICAgZmlyc3Rfc2VjdG9yK1NUQVJUX1NFQ1QocCkpOwoJ CX0KI2VuZGlmCgl9CiNpZmRlZiBDT05GSUdfQlNEX0RJU0tMQUJFTAoJaWYgKGJzZF9rZGV2KSB7 CgkJcHJpbnRrKCIgPCIpOwoJCWJzZF9kaXNrbGFiZWxfcGFydGl0aW9uKGhkLCBic2Rfa2Rldiwg YnNkX21heHBhcnQpOwoJCXByaW50aygiID4iKTsKCX0KI2VuZGlmCgkvKgoJICogIENoZWNrIGZv ciBvbGQtc3R5bGUgRGlzayBNYW5hZ2VyIHBhcnRpdGlvbiB0YWJsZQoJICovCglpZiAobXNkb3Nf bWFnaWNfcHJlc2VudChkYXRhICsgMHhmYykpIHsKCQlwID0gKHN0cnVjdCBwYXJ0aXRpb24gKikg KDB4MWJlICsgZGF0YSk7CgkJZm9yIChpID0gNCA7IGkgPCAxNiA7IGkrKywgY3VycmVudF9taW5v cisrKSB7CgkJCXAtLTsKCQkJaWYgKChjdXJyZW50X21pbm9yICYgbWFzaykgPT0gMCkKCQkJCWJy ZWFrOwoJCQlpZiAoIShTVEFSVF9TRUNUKHApICYmIE5SX1NFQ1RTKHApKSkKCQkJCWNvbnRpbnVl OwoJCQlhZGRfcGFydGl0aW9uKGhkLCBjdXJyZW50X21pbm9yLCBTVEFSVF9TRUNUKHApLAoJCQkJ CU5SX1NFQ1RTKHApLCAwKTsKCQl9Cgl9CglwcmludGsoIlxuIik7CglicmVsc2UoYmgpOwoJcmV0 dXJuIDE7Cn0KCiNlbmRpZiAvKiBDT05GSUdfTVNET1NfUEFSVElUSU9OICovCgojaWZkZWYgQ09O RklHX09TRl9QQVJUSVRJT04KCnN0YXRpYyBpbnQgb3NmX3BhcnRpdGlvbihzdHJ1Y3QgZ2VuZGlz ayAqaGQsIHVuc2lnbmVkIGludCBkZXYsIHVuc2lnbmVkIGxvbmcgZmlyc3Rfc2VjdG9yKQp7Cglp bnQgaTsKCWludCBtYXNrID0gKDEgPDwgaGQtPm1pbm9yX3NoaWZ0KSAtIDE7CglzdHJ1Y3QgYnVm ZmVyX2hlYWQgKmJoOwoJc3RydWN0IGRpc2tsYWJlbCB7CgkJdTMyIGRfbWFnaWM7CgkJdTE2IGRf dHlwZSxkX3N1YnR5cGU7CgkJdTggZF90eXBlbmFtZVsxNl07CgkJdTggZF9wYWNrbmFtZVsxNl07 CgkJdTMyIGRfc2Vjc2l6ZTsKCQl1MzIgZF9uc2VjdG9yczsKCQl1MzIgZF9udHJhY2tzOwoJCXUz MiBkX25jeWxpbmRlcnM7CgkJdTMyIGRfc2VjcGVyY3lsOwoJCXUzMiBkX3NlY3BydHVuaXQ7CgkJ dTE2IGRfc3BhcmVzcGVydHJhY2s7CgkJdTE2IGRfc3BhcmVzcGVyY3lsOwoJCXUzMiBkX2FjeWxp bmRlcnM7CgkJdTE2IGRfcnBtLCBkX2ludGVybGVhdmUsIGRfdHJhY2tza2V3LCBkX2N5bHNrZXc7 CgkJdTMyIGRfaGVhZHN3aXRjaCwgZF90cmtzZWVrLCBkX2ZsYWdzOwoJCXUzMiBkX2RyaXZlZGF0 YVs1XTsKCQl1MzIgZF9zcGFyZVs1XTsKCQl1MzIgZF9tYWdpYzI7CgkJdTE2IGRfY2hlY2tzdW07 CgkJdTE2IGRfbnBhcnRpdGlvbnM7CgkJdTMyIGRfYmJzaXplLCBkX3Nic2l6ZTsKCQlzdHJ1Y3Qg ZF9wYXJ0aXRpb24gewoJCQl1MzIgcF9zaXplOwoJCQl1MzIgcF9vZmZzZXQ7CgkJCXUzMiBwX2Zz aXplOwoJCQl1OCAgcF9mc3R5cGU7CgkJCXU4ICBwX2ZyYWc7CgkJCXUxNiBwX2NwZzsKCQl9IGRf cGFydGl0aW9uc1s4XTsKCX0gKiBsYWJlbDsKCXN0cnVjdCBkX3BhcnRpdGlvbiAqIHBhcnRpdGlv bjsKI2RlZmluZSBESVNLTEFCRUxNQUdJQyAoMHg4MjU2NDU1N1VMKQoKCWlmICghKGJoID0gYnJl YWQoZGV2LDAsZ2V0X3B0YWJsZV9ibG9ja3NpemUoZGV2KSkpKSB7CgkJcHJpbnRrKCJ1bmFibGUg dG8gcmVhZCBwYXJ0aXRpb24gdGFibGVcbiIpOwoJCXJldHVybiAtMTsKCX0KCWxhYmVsID0gKHN0 cnVjdCBkaXNrbGFiZWwgKikgKGJoLT5iX2RhdGErNjQpOwoJcGFydGl0aW9uID0gbGFiZWwtPmRf cGFydGl0aW9uczsKCWlmIChsYWJlbC0+ZF9tYWdpYyAhPSBESVNLTEFCRUxNQUdJQykgewoJCWJy ZWxzZShiaCk7CgkJcmV0dXJuIDA7Cgl9CglpZiAobGFiZWwtPmRfbWFnaWMyICE9IERJU0tMQUJF TE1BR0lDKSB7CgkJYnJlbHNlKGJoKTsKCQlyZXR1cm4gMDsKCX0KCWZvciAoaSA9IDAgOyBpIDwg bGFiZWwtPmRfbnBhcnRpdGlvbnM7IGkrKywgcGFydGl0aW9uKyspIHsKCQlpZiAoKGN1cnJlbnRf bWlub3IgJiBtYXNrKSA9PSAwKQoJCSAgICAgICAgYnJlYWs7CgkJaWYgKHBhcnRpdGlvbi0+cF9z aXplKQoJCQlhZGRfcGFydGl0aW9uKGhkLCBjdXJyZW50X21pbm9yLAoJCQkJZmlyc3Rfc2VjdG9y K3BhcnRpdGlvbi0+cF9vZmZzZXQsCgkJCQlwYXJ0aXRpb24tPnBfc2l6ZSwgMCk7CgkJY3VycmVu dF9taW5vcisrOwoJfQoJcHJpbnRrKCJcbiIpOwoJYnJlbHNlKGJoKTsKCXJldHVybiAxOwp9Cgoj ZW5kaWYgLyogQ09ORklHX09TRl9QQVJUSVRJT04gKi8KCiNpZmRlZiBDT05GSUdfU1VOX1BBUlRJ VElPTgoKc3RhdGljIGludCBzdW5fcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpoZCwga2Rldl90 IGRldiwgdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IpCnsKCWludCBpLCBjc3VtOwoJdW5zaWdu ZWQgc2hvcnQgKnVzaDsKCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CglzdHJ1Y3Qgc3VuX2Rpc2ts YWJlbCB7CgkJdW5zaWduZWQgY2hhciBpbmZvWzEyOF07ICAgLyogSW5mb3JtYXRpdmUgdGV4dCBz dHJpbmcgKi8KCQl1bnNpZ25lZCBjaGFyIHNwYXJlMFsxNF07CgkJc3RydWN0IHN1bl9kaXNrbGFi ZWxpbmZvIHsKCQkJdW5zaWduZWQgY2hhciBzcGFyZTE7CgkJCXVuc2lnbmVkIGNoYXIgaWQ7CgkJ CXVuc2lnbmVkIGNoYXIgc3BhcmUyOwoJCQl1bnNpZ25lZCBjaGFyIGZsYWdzOwoJCX0gaW5mb3Nb OF07CgkJdW5zaWduZWQgY2hhciBzcGFyZTFbMjQ2XTsgIC8qIEJvb3QgaW5mb3JtYXRpb24gZXRj LiAqLwoJCXVuc2lnbmVkIHNob3J0IHJzcGVlZDsgICAgIC8qIERpc2sgcm90YXRpb25hbCBzcGVl ZCAqLwoJCXVuc2lnbmVkIHNob3J0IHBjeWxjb3VudDsgIC8qIFBoeXNpY2FsIGN5bGluZGVyIGNv dW50ICovCgkJdW5zaWduZWQgc2hvcnQgc3BhcmVjeWw7ICAgLyogZXh0cmEgc2VjdHMgcGVyIGN5 bGluZGVyICovCgkJdW5zaWduZWQgY2hhciBzcGFyZTJbNF07ICAgLyogTW9yZSBtYWdpYy4uLiAq LwoJCXVuc2lnbmVkIHNob3J0IGlsZmFjdDsgICAgIC8qIEludGVybGVhdmUgZmFjdG9yICovCgkJ dW5zaWduZWQgc2hvcnQgbmN5bDsgICAgICAgLyogRGF0YSBjeWxpbmRlciBjb3VudCAqLwoJCXVu c2lnbmVkIHNob3J0IG5hY3lsOyAgICAgIC8qIEFsdC4gY3lsaW5kZXIgY291bnQgKi8KCQl1bnNp Z25lZCBzaG9ydCBudHJrczsgICAgICAvKiBUcmFja3MgcGVyIGN5bGluZGVyICovCgkJdW5zaWdu ZWQgc2hvcnQgbnNlY3Q7ICAgICAgLyogU2VjdG9ycyBwZXIgdHJhY2sgKi8KCQl1bnNpZ25lZCBj aGFyIHNwYXJlM1s0XTsgICAvKiBFdmVuIG1vcmUgbWFnaWMuLi4gKi8KCQlzdHJ1Y3Qgc3VuX3Bh cnRpdGlvbiB7CgkJCV9fdTMyIHN0YXJ0X2N5bGluZGVyOwoJCQlfX3UzMiBudW1fc2VjdG9yczsK CQl9IHBhcnRpdGlvbnNbOF07CgkJdW5zaWduZWQgc2hvcnQgbWFnaWM7ICAgICAgLyogTWFnaWMg bnVtYmVyICovCgkJdW5zaWduZWQgc2hvcnQgY3N1bTsgICAgICAgLyogTGFiZWwgeG9yJ2QgY2hl Y2tzdW0gKi8KCX0gKiBsYWJlbDsJCQoJc3RydWN0IHN1bl9wYXJ0aXRpb24gKnA7Cgl1bnNpZ25l ZCBsb25nIHNwYzsKI2RlZmluZSBTVU5fTEFCRUxfTUFHSUMgICAgICAgICAgMHhEQUJFCgoJaWYo IShiaCA9IGJyZWFkKGRldiwgMCwgZ2V0X3B0YWJsZV9ibG9ja3NpemUoZGV2KSkpKSB7CgkJcHJp bnRrKCJEZXYgJXM6IHVuYWJsZSB0byByZWFkIHBhcnRpdGlvbiB0YWJsZVxuIiwKCQkgICAgICAg a2Rldm5hbWUoZGV2KSk7CgkJcmV0dXJuIC0xOwoJfQoJbGFiZWwgPSAoc3RydWN0IHN1bl9kaXNr bGFiZWwgKikgYmgtPmJfZGF0YTsKCXAgPSBsYWJlbC0+cGFydGl0aW9uczsKCWlmIChiZTE2X3Rv X2NwdShsYWJlbC0+bWFnaWMpICE9IFNVTl9MQUJFTF9NQUdJQykgewojaWYgMAoJCS8qIFRoZXJl IGlzIG5vIGVycm9yIGhlcmUgLSBpdCBpcyBqdXN0IG5vdCBhIHN1bmxhYmVsLiAqLwoJCXByaW50 aygiRGV2ICVzIFN1biBkaXNrbGFiZWw6IGJhZCBtYWdpYyAlMDR4XG4iLAoJCSAgICAgICBrZGV2 bmFtZShkZXYpLCBiZTE2X3RvX2NwdShsYWJlbC0+bWFnaWMpKTsKI2VuZGlmCgkJYnJlbHNlKGJo KTsKCQlyZXR1cm4gMDsKCX0KCS8qIExvb2sgYXQgdGhlIGNoZWNrc3VtICovCgl1c2ggPSAoKHVu c2lnbmVkIHNob3J0ICopIChsYWJlbCsxKSkgLSAxOwoJZm9yKGNzdW0gPSAwOyB1c2ggPj0gKCh1 bnNpZ25lZCBzaG9ydCAqKSBsYWJlbCk7KQoJCWNzdW0gXj0gKnVzaC0tOwoJaWYoY3N1bSkgewoj aWYgMAkvKiA5OSUgb2YgdGhlIHRpbWUgdGhpcyBqdXN0IG1lYW5zIGl0IGlzbid0IGEgc3VuIGxh YmVsLiAqLwoJCXByaW50aygiRGV2ICVzIFN1biBkaXNrbGFiZWw6IENzdW0gYmFkLCBsYWJlbCBj b3JydXB0ZWRcbiIsCgkJICAgICAgIGtkZXZuYW1lKGRldikpOwojZW5kaWYKCQlicmVsc2UoYmgp OwoJCXJldHVybiAwOwoJfQoJLyogQWxsIFN1biBkaXNrcyBoYXZlIDggcGFydGl0aW9uIGVudHJp ZXMgKi8KCXNwYyA9IGJlMTZfdG9fY3B1KGxhYmVsLT5udHJrcykgKiBiZTE2X3RvX2NwdShsYWJl bC0+bnNlY3QpOwoJZm9yKGk9MDsgaSA8IDg7IGkrKywgcCsrKSB7CgkJdW5zaWduZWQgbG9uZyBz dF9zZWN0b3I7CgkJaW50IG51bV9zZWN0b3JzOwoKCQlzdF9zZWN0b3IgPSBmaXJzdF9zZWN0b3Ig KyBiZTMyX3RvX2NwdShwLT5zdGFydF9jeWxpbmRlcikgKiBzcGM7CgkJbnVtX3NlY3RvcnMgPSBi ZTMyX3RvX2NwdShwLT5udW1fc2VjdG9ycyk7CgkJaWYgKG51bV9zZWN0b3JzKQoJCQlhZGRfcGFy dGl0aW9uKGhkLCBjdXJyZW50X21pbm9yLCBzdF9zZWN0b3IsCgkJCQkJbnVtX3NlY3RvcnMsIHB0 eXBlKGxhYmVsLT5pbmZvc1tpXS5pZCkpOwoJCWN1cnJlbnRfbWlub3IrKzsKCX0KCXByaW50aygi XG4iKTsKCWJyZWxzZShiaCk7CglyZXR1cm4gMTsKfQoKI2VuZGlmIC8qIENPTkZJR19TVU5fUEFS VElUSU9OICovCgojaWZkZWYgQ09ORklHX1NHSV9QQVJUSVRJT04KCnN0YXRpYyBpbnQgc2dpX3Bh cnRpdGlvbihzdHJ1Y3QgZ2VuZGlzayAqaGQsIGtkZXZfdCBkZXYsIHVuc2lnbmVkIGxvbmcgZmly c3Rfc2VjdG9yKQp7CglpbnQgaSwgY3N1bSwgbWFnaWM7Cgl1bnNpZ25lZCBpbnQgKnVpLCBzdGFy dCwgYmxvY2tzLCBjczsKCXN0cnVjdCBidWZmZXJfaGVhZCAqYmg7CglzdHJ1Y3Qgc2dpX2Rpc2ts YWJlbCB7CgkJaW50IG1hZ2ljX211c2hyb29tOyAgICAgICAgIC8qIEJpZyBmYXQgc3BsaWZmLi4u ICovCgkJc2hvcnQgcm9vdF9wYXJ0X251bTsgICAgICAgIC8qIFJvb3QgcGFydGl0aW9uIG51bWJl ciAqLwoJCXNob3J0IHN3YXBfcGFydF9udW07ICAgICAgICAvKiBTd2FwIHBhcnRpdGlvbiBudW1i ZXIgKi8KCQljaGFyIGJvb3RfZmlsZVsxNl07ICAgICAgICAgLyogTmFtZSBvZiBib290IGZpbGUg Zm9yIEFSQ1MgKi8KCQl1bnNpZ25lZCBjaGFyIF91bnVzZWQwWzQ4XTsgLyogRGV2aWNlIHBhcmFt ZXRlciB1c2VsZXNzIGNyYXBvbGEuLiAqLwoJCXN0cnVjdCBzZ2lfdm9sdW1lIHsKCQkJY2hhciBu YW1lWzhdOyAgICAgICAvKiBOYW1lIG9mIHZvbHVtZSAqLwoJCQlpbnQgIGJsb2NrX251bTsgICAg IC8qIExvZ2ljYWwgYmxvY2sgbnVtYmVyICovCgkJCWludCAgbnVtX2J5dGVzOyAgICAgLyogSG93 IGJpZywgaW4gYnl0ZXMgKi8KCQl9IHZvbHVtZVsxNV07CgkJc3RydWN0IHNnaV9wYXJ0aXRpb24g ewoJCQlpbnQgbnVtX2Jsb2NrczsgICAgIC8qIFNpemUgaW4gbG9naWNhbCBibG9ja3MgKi8KCQkJ aW50IGZpcnN0X2Jsb2NrOyAgICAvKiBGaXJzdCBsb2dpY2FsIGJsb2NrICovCgkJCWludCB0eXBl OyAgICAgICAgICAgLyogVHlwZSBvZiB0aGlzIHBhcnRpdGlvbiAqLwoJCX0gcGFydGl0aW9uc1sx Nl07CgkJaW50IGNzdW07ICAgICAgICAgICAgICAgICAgIC8qIERpc2sgbGFiZWwgY2hlY2tzdW0g Ki8KCQlpbnQgX3VudXNlZDE7ICAgICAgICAgICAgICAgLyogUGFkZGluZyAqLwoJfSAqbGFiZWw7 CglzdHJ1Y3Qgc2dpX3BhcnRpdGlvbiAqcDsKI2RlZmluZSBTR0lfTEFCRUxfTUFHSUMgMHgwYmU1 YTk0MQoKCWlmKCEoYmggPSBicmVhZChkZXYsIDAsIGdldF9wdGFibGVfYmxvY2tzaXplKGRldikp KSkgewoJCXByaW50aygiRGV2ICVzOiB1bmFibGUgdG8gcmVhZCBwYXJ0aXRpb24gdGFibGVcbiIs IGtkZXZuYW1lKGRldikpOwoJCXJldHVybiAtMTsKCX0KCWxhYmVsID0gKHN0cnVjdCBzZ2lfZGlz a2xhYmVsICopIGJoLT5iX2RhdGE7CglwID0gJmxhYmVsLT5wYXJ0aXRpb25zWzBdOwoJbWFnaWMg PSBsYWJlbC0+bWFnaWNfbXVzaHJvb207CglpZihiZTMyX3RvX2NwdShtYWdpYykgIT0gU0dJX0xB QkVMX01BR0lDKSB7CiNpZiAwCgkJLyogVGhlcmUgaXMgbm8gZXJyb3IgaGVyZSAtIGl0IGlzIGp1 c3Qgbm90IGFuIHNnaWxhYmVsLiAqLwoJCXByaW50aygiRGV2ICVzIFNHSSBkaXNrbGFiZWw6IGJh ZCBtYWdpYyAlMDh4XG4iLAoJCSAgICAgICBrZGV2bmFtZShkZXYpLCBtYWdpYyk7CiNlbmRpZgoJ CWJyZWxzZShiaCk7CgkJcmV0dXJuIDA7Cgl9Cgl1aSA9ICgodW5zaWduZWQgaW50ICopIChsYWJl bCArIDEpKSAtIDE7Cglmb3IoY3N1bSA9IDA7IHVpID49ICgodW5zaWduZWQgaW50ICopIGxhYmVs KTspIHsKCQljcyA9ICp1aS0tOwoJCWNzdW0gKz0gYmUzMl90b19jcHUoY3MpOwoJfQoJaWYoY3N1 bSkgewoJCXByaW50aygiRGV2ICVzIFNHSSBkaXNrbGFiZWw6IGNzdW0gYmFkLCBsYWJlbCBjb3Jy dXB0ZWRcbiIsCgkJICAgICAgIGtkZXZuYW1lKGRldikpOwoJCWJyZWxzZShiaCk7CgkJcmV0dXJu IDA7Cgl9CgkvKiBBbGwgU0dJIGRpc2sgbGFiZWxzIGhhdmUgMTYgcGFydGl0aW9ucywgZGlza3Mg dW5kZXIgTGludXggb25seQoJICogaGF2ZSAxNSBtaW5vcidzLiAgTHVja2lseSB0aGVyZSBhcmUg YWx3YXlzIGEgZmV3IHplcm8gbGVuZ3RoCgkgKiBwYXJ0aXRpb25zIHdoaWNoIHdlIGRvbid0IGNh cmUgYWJvdXQgc28gd2UgbmV2ZXIgb3ZlcmZsb3cgdGhlCgkgKiBjdXJyZW50X21pbm9yLgoJICov Cglmb3IoaSA9IDA7IGkgPCAxNjsgaSsrLCBwKyspIHsKCQlibG9ja3MgPSBiZTMyX3RvX2NwdShw LT5udW1fYmxvY2tzKTsKCQlzdGFydCAgPSBiZTMyX3RvX2NwdShwLT5maXJzdF9ibG9jayk7CgkJ aWYoIWJsb2NrcykKCQkJY29udGludWU7CgkJYWRkX3BhcnRpdGlvbihoZCwgY3VycmVudF9taW5v ciwgc3RhcnQsIGJsb2NrcywgMCk7CgkJY3VycmVudF9taW5vcisrOwoJfQoJcHJpbnRrKCJcbiIp OwoJYnJlbHNlKGJoKTsKCXJldHVybiAxOwp9CgojZW5kaWYKCiNpZmRlZiBDT05GSUdfQU1JR0Ff UEFSVElUSU9OCiNpbmNsdWRlIDxsaW51eC9hZmZzX2hhcmRibG9ja3MuaD4KCnN0YXRpYyBfX2lu bGluZV9fIHUzMgpjaGVja3N1bV9ibG9jayh1MzIgKm0sIGludCBzaXplKQp7Cgl1MzIgc3VtID0g MDsKCgl3aGlsZSAoc2l6ZS0tKQoJCXN1bSArPSBiZTMyX3RvX2NwdSgqbSsrKTsKCXJldHVybiBz dW07Cn0KCnN0YXRpYyBpbnQKYW1pZ2FfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpoZCwga2Rl dl90IGRldiwgdW5zaWduZWQgbG9uZyBmaXJzdF9zZWN0b3IpCnsKCXN0cnVjdCBidWZmZXJfaGVh ZAkqYmg7CglzdHJ1Y3QgUmlnaWREaXNrQmxvY2sJKnJkYjsKCXN0cnVjdCBQYXJ0aXRpb25CbG9j awkqcGI7CglpbnQJCQkgc3RhcnRfc2VjdDsKCWludAkJCSBucl9zZWN0czsKCWludAkJCSBibGs7 CglpbnQJCQkgcGFydCwgcmVzOwoJaW50CQkJIG9sZF9ibG9ja3NpemU7CglpbnQJCQkgYmxvY2tz aXplOwoKCW9sZF9ibG9ja3NpemUgPSBnZXRfcHRhYmxlX2Jsb2Nrc2l6ZShkZXYpOwoJaWYgKGhh cmRzZWN0X3NpemVbTUFKT1IoZGV2KV0gIT0gTlVMTCkKCQlibG9ja3NpemUgPSBoYXJkc2VjdF9z aXplW01BSk9SKGRldildW01JTk9SKGRldildOwoJZWxzZQoJCWJsb2Nrc2l6ZSA9IDUxMjsKCglz ZXRfYmxvY2tzaXplKGRldixibG9ja3NpemUpOwoJcmVzID0gMDsKCglmb3IgKGJsayA9IDA7IGJs ayA8IFJEQl9BTExPQ0FUSU9OX0xJTUlUOyBibGsrKykgewoJCWlmKCEoYmggPSBicmVhZChkZXYs YmxrLGJsb2Nrc2l6ZSkpKSB7CgkJCXByaW50aygiRGV2ICVzOiB1bmFibGUgdG8gcmVhZCBSREIg YmxvY2sgJWRcbiIsCgkJCSAgICAgICBrZGV2bmFtZShkZXYpLGJsayk7CgkJCWdvdG8gcmRiX2Rv bmU7CgkJfQoJCWlmICgqKHUzMiAqKWJoLT5iX2RhdGEgPT0gY3B1X3RvX2JlMzIoSUROQU1FX1JJ R0lERElTSykpIHsKCQkJcmRiID0gKHN0cnVjdCBSaWdpZERpc2tCbG9jayAqKWJoLT5iX2RhdGE7 CgkJCWlmIChjaGVja3N1bV9ibG9jaygodTMyICopYmgtPmJfZGF0YSxiZTMyX3RvX2NwdShyZGIt PnJkYl9TdW1tZWRMb25ncykgJiAweDdGKSkgewoJCQkJLyogVHJ5IGFnYWluIHdpdGggMHhkYy4u MHhkZiB6ZXJvZWQsIFdpbmRvd3MgbWlnaHQgaGF2ZQoJCQkJICogdHJhc2hlZCBpdC4KCQkJCSAq LwoJCQkJKih1MzIgKikoJmJoLT5iX2RhdGFbMHhkY10pID0gMDsKCQkJCWlmIChjaGVja3N1bV9i bG9jaygodTMyICopYmgtPmJfZGF0YSwKCQkJCQkJYmUzMl90b19jcHUocmRiLT5yZGJfU3VtbWVk TG9uZ3MpICYgMHg3RikpIHsKCQkJCQlicmVsc2UoYmgpOwoJCQkJCXByaW50aygiRGV2ICVzOiBS REIgaW4gYmxvY2sgJWQgaGFzIGJhZCBjaGVja3N1bVxuIiwKCQkJCQkgICAgICAga2Rldm5hbWUo ZGV2KSxibGspOwoJCQkJCWNvbnRpbnVlOwoJCQkJfQoJCQkJcHJpbnRrKCJXYXJuaW5nOiBUcmFz aGVkIHdvcmQgYXQgMHhkMCBpbiBibG9jayAlZCAiCgkJCQkJImlnbm9yZWQgaW4gY2hlY2tzdW0g Y2FsY3VsYXRpb25cbiIsYmxrKTsKCQkJfQoJCQlwcmludGsoIiBSRFNLIik7CgkJCWJsayA9IGJl MzJfdG9fY3B1KHJkYi0+cmRiX1BhcnRpdGlvbkxpc3QpOwoJCQlicmVsc2UoYmgpOwoJCQlmb3Ig KHBhcnQgPSAxOyBibGsgPiAwICYmIHBhcnQgPD0gMTY7IHBhcnQrKykgewoJCQkJaWYgKCEoYmgg PSBicmVhZChkZXYsYmxrLGJsb2Nrc2l6ZSkpKSB7CgkJCQkJcHJpbnRrKCJEZXYgJXM6IHVuYWJs ZSB0byByZWFkIHBhcnRpdGlvbiBibG9jayAlZFxuIiwKCQkJCQkJICAgICAgIGtkZXZuYW1lKGRl diksYmxrKTsKCQkJCQlnb3RvIHJkYl9kb25lOwoJCQkJfQoJCQkJcGIgID0gKHN0cnVjdCBQYXJ0 aXRpb25CbG9jayAqKWJoLT5iX2RhdGE7CgkJCQlibGsgPSBiZTMyX3RvX2NwdShwYi0+cGJfTmV4 dCk7CgkJCQlpZiAocGItPnBiX0lEID09IGNwdV90b19iZTMyKElETkFNRV9QQVJUSVRJT04pICYm IGNoZWNrc3VtX2Jsb2NrKAoJCQkJICAgICh1MzIgKilwYixiZTMyX3RvX2NwdShwYi0+cGJfU3Vt bWVkTG9uZ3MpICYgMHg3RikgPT0gMCApIHsKCgkJCQkJLyogVGVsbCBLZXJuZWwgYWJvdXQgaXQg Ki8KCgkJCQkJaWYgKCEobnJfc2VjdHMgPSAoYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50 WzEwXSkgKyAxIC0KCQkJCQkJCSAgYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzldKSkg KgoJCQkJCQkJIGJlMzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFszXSkgKgoJCQkJCQkJIGJl MzJfdG9fY3B1KHBiLT5wYl9FbnZpcm9ubWVudFs1XSkpKSB7CgkJCQkJCWJyZWxzZShiaCk7CgkJ CQkJCWNvbnRpbnVlOwoJCQkJCX0KCQkJCQlzdGFydF9zZWN0ID0gYmUzMl90b19jcHUocGItPnBi X0Vudmlyb25tZW50WzldKSAqCgkJCQkJCSAgICAgYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25t ZW50WzNdKSAqCgkJCQkJCSAgICAgYmUzMl90b19jcHUocGItPnBiX0Vudmlyb25tZW50WzVdKTsK CQkJCQlhZGRfcGFydGl0aW9uKGhkLGN1cnJlbnRfbWlub3IsCgkJCQkJCQlzdGFydF9zZWN0LG5y X3NlY3RzLDApOwoJCQkJCWN1cnJlbnRfbWlub3IrKzsKCQkJCQlyZXMgPSAxOwoJCQkJfQoJCQkJ YnJlbHNlKGJoKTsKCQkJfQoJCQlwcmludGsoIlxuIik7CgkJCWJyZWFrOwoJCX0KCQllbHNlCgkJ CWJyZWxzZShiaCk7Cgl9CgpyZGJfZG9uZToKCXNldF9ibG9ja3NpemUoZGV2LG9sZF9ibG9ja3Np emUpOwoJcmV0dXJuIHJlczsKfQojZW5kaWYgLyogQ09ORklHX0FNSUdBX1BBUlRJVElPTiAqLwoK I2lmZGVmIENPTkZJR19NQUNfUEFSVElUSU9OCiNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgoKLyoK ICogQ29kZSB0byB1bmRlcnN0YW5kIE1hY09TIHBhcnRpdGlvbiB0YWJsZXMuCiAqLwoKI2RlZmlu ZSBNQUNfUEFSVElUSU9OX01BR0lDCTB4NTA0ZAoKLyogdHlwZSBmaWVsZCB2YWx1ZSBmb3IgQS9V WCBvciBvdGhlciBVbml4IHBhcnRpdGlvbnMgKi8KI2RlZmluZSBBUFBMRV9BVVhfVFlQRQkiQXBw bGVfVU5JWF9TVlIyIgoKc3RydWN0IG1hY19wYXJ0aXRpb24gewoJX191MTYJc2lnbmF0dXJlOwkv KiBleHBlY3RlZCB0byBiZSBNQUNfUEFSVElUSU9OX01BR0lDICovCglfX3UxNglyZXMxOwoJX191 MzIJbWFwX2NvdW50OwkvKiAjIGJsb2NrcyBpbiBwYXJ0aXRpb24gbWFwICovCglfX3UzMglzdGFy dF9ibG9jazsJLyogYWJzb2x1dGUgc3RhcnRpbmcgYmxvY2sgIyBvZiBwYXJ0aXRpb24gKi8KCV9f dTMyCWJsb2NrX2NvdW50OwkvKiBudW1iZXIgb2YgYmxvY2tzIGluIHBhcnRpdGlvbiAqLwoJY2hh cgluYW1lWzMyXTsJLyogcGFydGl0aW9uIG5hbWUgKi8KCWNoYXIJdHlwZVszMl07CS8qIHN0cmlu ZyB0eXBlIGRlc2NyaXB0aW9uICovCglfX3UzMglkYXRhX3N0YXJ0OwkvKiByZWwgYmxvY2sgIyBv ZiBmaXJzdCBkYXRhIGJsb2NrICovCglfX3UzMglkYXRhX2NvdW50OwkvKiBudW1iZXIgb2YgZGF0 YSBibG9ja3MgKi8KCV9fdTMyCXN0YXR1czsJCS8qIHBhcnRpdGlvbiBzdGF0dXMgYml0cyAqLwoJ X191MzIJYm9vdF9zdGFydDsKCV9fdTMyCWJvb3Rfc2l6ZTsKCV9fdTMyCWJvb3RfbG9hZDsKCV9f dTMyCWJvb3RfbG9hZDI7CglfX3UzMglib290X2VudHJ5OwoJX191MzIJYm9vdF9lbnRyeTI7Cglf X3UzMglib290X2Nrc3VtOwoJY2hhcglwcm9jZXNzb3JbMTZdOwkvKiBpZGVudGlmaWVzIElTQSBv ZiBib290ICovCgkvKiB0aGVyZSBpcyBtb3JlIHN0dWZmIGFmdGVyIHRoaXMgdGhhdCB3ZSBkb24n dCBuZWVkICovCn07CgojZGVmaW5lIE1BQ19TVEFUVVNfQk9PVEFCTEUJOAkvKiBwYXJ0aXRpb24g aXMgYm9vdGFibGUgKi8KCiNkZWZpbmUgTUFDX0RSSVZFUl9NQUdJQwkweDQ1NTIKCi8qIERyaXZl ciBkZXNjcmlwdG9yIHN0cnVjdHVyZSwgaW4gYmxvY2sgMCAqLwpzdHJ1Y3QgbWFjX2RyaXZlcl9k ZXNjIHsKCV9fdTE2CXNpZ25hdHVyZTsJLyogZXhwZWN0ZWQgdG8gYmUgTUFDX0RSSVZFUl9NQUdJ QyAqLwoJX191MTYJYmxvY2tfc2l6ZTsKCV9fdTMyCWJsb2NrX2NvdW50OwogICAgLyogLi4uIG1v cmUgc3R1ZmYgKi8KfTsKCnN0YXRpYyBpbmxpbmUgdm9pZCBtYWNfZml4X3N0cmluZyhjaGFyICpz dGcsIGludCBsZW4pCnsKCWludCBpOwoKCWZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMCAmJiBzdGdb aV0gPT0gJyAnOyBpLS0pCgkJc3RnW2ldID0gMDsKfQoKc3RhdGljIGludCBtYWNfcGFydGl0aW9u KHN0cnVjdCBnZW5kaXNrICpoZCwga2Rldl90IGRldiwgdW5zaWduZWQgbG9uZyBmc2VjKQp7Cglz dHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwoJaW50IGJsaywgYmxvY2tzX2luX21hcDsKCWludCBkZXZf YnNpemUsIGRldl9wb3MsIHBvczsKCXVuc2lnbmVkIHNlY3NpemU7CiNpZmRlZiBDT05GSUdfUFBD CglpbnQgZm91bmRfcm9vdCA9IDA7CglpbnQgZm91bmRfcm9vdF9nb29kbmVzcyA9IDA7CiNlbmRp ZgoJc3RydWN0IG1hY19wYXJ0aXRpb24gKnBhcnQ7CglzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjICpt ZDsKCglkZXZfYnNpemUgPSBnZXRfcHRhYmxlX2Jsb2Nrc2l6ZShkZXYpOwoJZGV2X3BvcyA9IDA7 CgkvKiBHZXQgMHRoIGJsb2NrIGFuZCBsb29rIGF0IHRoZSBmaXJzdCBwYXJ0aXRpb24gbWFwIGVu dHJ5LiAqLwoJaWYgKChiaCA9IGJyZWFkKGRldiwgMCwgZGV2X2JzaXplKSkgPT0gMCkgewoJICAg IHByaW50aygiJXM6IGVycm9yIHJlYWRpbmcgcGFydGl0aW9uIHRhYmxlXG4iLAoJCSAgIGtkZXZu YW1lKGRldikpOwoJICAgIHJldHVybiAtMTsKCX0KCW1kID0gKHN0cnVjdCBtYWNfZHJpdmVyX2Rl c2MgKikgYmgtPmJfZGF0YTsKCWlmIChiZTE2X3RvX2NwdShtZC0+c2lnbmF0dXJlKSAhPSBNQUNf RFJJVkVSX01BR0lDKSB7CgkJYnJlbHNlKGJoKTsKCQlyZXR1cm4gMDsKCX0KCXNlY3NpemUgPSBi ZTE2X3RvX2NwdShtZC0+YmxvY2tfc2l6ZSk7CglpZiAoc2Vjc2l6ZSA+PSBkZXZfYnNpemUpIHsK CQlicmVsc2UoYmgpOwoJCWRldl9wb3MgPSBzZWNzaXplOwoJCWlmICgoYmggPSBicmVhZChkZXYs IHNlY3NpemUvZGV2X2JzaXplLCBkZXZfYnNpemUpKSA9PSAwKSB7CgkJCXByaW50aygiJXM6IGVy cm9yIHJlYWRpbmcgcGFydGl0aW9uIHRhYmxlXG4iLAoJCQkgICAgICAga2Rldm5hbWUoZGV2KSk7 CgkJCXJldHVybiAtMTsKCQl9Cgl9CglwYXJ0ID0gKHN0cnVjdCBtYWNfcGFydGl0aW9uICopIChi aC0+Yl9kYXRhICsgc2Vjc2l6ZSAtIGRldl9wb3MpOwoJaWYgKGJlMTZfdG9fY3B1KHBhcnQtPnNp Z25hdHVyZSkgIT0gTUFDX1BBUlRJVElPTl9NQUdJQykgewoJCWJyZWxzZShiaCk7CgkJcmV0dXJu IDA7CQkvKiBub3QgYSBNYWNPUyBkaXNrICovCgl9CglibG9ja3NfaW5fbWFwID0gYmUzMl90b19j cHUocGFydC0+bWFwX2NvdW50KTsKCWZvciAoYmxrID0gMTsgYmxrIDw9IGJsb2Nrc19pbl9tYXA7 ICsrYmxrKSB7CgkJcG9zID0gYmxrICogc2Vjc2l6ZTsKCQlpZiAocG9zID49IGRldl9wb3MgKyBk ZXZfYnNpemUpIHsKCQkJYnJlbHNlKGJoKTsKCQkJZGV2X3BvcyA9IHBvczsKCQkJaWYgKChiaCA9 IGJyZWFkKGRldiwgcG9zL2Rldl9ic2l6ZSwgZGV2X2JzaXplKSkgPT0gMCkgewoJCQkJcHJpbnRr KCIlczogZXJyb3IgcmVhZGluZyBwYXJ0aXRpb24gdGFibGVcbiIsCgkJCQkgICAgICAga2Rldm5h bWUoZGV2KSk7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQl9CgkJcGFydCA9IChzdHJ1Y3QgbWFjX3Bh cnRpdGlvbiAqKSAoYmgtPmJfZGF0YSArIHBvcyAtIGRldl9wb3MpOwoJCWlmIChiZTE2X3RvX2Nw dShwYXJ0LT5zaWduYXR1cmUpICE9IE1BQ19QQVJUSVRJT05fTUFHSUMpCgkJCWJyZWFrOwoJCWJs b2Nrc19pbl9tYXAgPSBiZTMyX3RvX2NwdShwYXJ0LT5tYXBfY291bnQpOwoJCWFkZF9wYXJ0aXRp b24oaGQsIGN1cnJlbnRfbWlub3IsCgkJCWZzZWMgKyBiZTMyX3RvX2NwdShwYXJ0LT5zdGFydF9i bG9jaykgKiAoc2Vjc2l6ZS81MTIpLAoJCQliZTMyX3RvX2NwdShwYXJ0LT5ibG9ja19jb3VudCkg KiAoc2Vjc2l6ZS81MTIpLCAwKTsKCiNpZmRlZiBDT05GSUdfUFBDCgkJLyoKCQkgKiBJZiB0aGlz IGlzIHRoZSBmaXJzdCBib290YWJsZSBwYXJ0aXRpb24sIHRlbGwgdGhlCgkJICogc2V0dXAgY29k ZSwgaW4gY2FzZSBpdCB3YW50cyB0byBtYWtlIHRoaXMgdGhlIHJvb3QuCgkJICovCgkJaWYgKF9t YWNoaW5lID09IF9NQUNIX1BtYWMpIHsKCQkJaW50IGdvb2RuZXNzID0gMDsKCgkJCW1hY19maXhf c3RyaW5nKHBhcnQtPnByb2Nlc3NvciwgMTYpOwoJCQltYWNfZml4X3N0cmluZyhwYXJ0LT5uYW1l LCAzMik7CgkJCW1hY19maXhfc3RyaW5nKHBhcnQtPnR5cGUsIDMyKTsJCQkJCQoJCSAgICAKCQkJ aWYgKChiZTMyX3RvX2NwdShwYXJ0LT5zdGF0dXMpICYgTUFDX1NUQVRVU19CT09UQUJMRSkKCQkJ ICAgICYmIHN0cmNhc2VjbXAocGFydC0+cHJvY2Vzc29yLCAicG93ZXJwYyIpID09IDApCgkJCQln b29kbmVzcysrOwoKCQkJaWYgKHN0cmNhc2VjbXAocGFydC0+dHlwZSwgIkFwcGxlX1VOSVhfU1ZS MiIpID09IDAKCQkJICAgIHx8IChzdHJuaWNtcChwYXJ0LT50eXBlLCAiTGludXgiLCA1KSA9PSAw CgkJCSAgICAgICAgJiYgc3RyY2FzZWNtcChwYXJ0LT50eXBlLCAiTGludXhfc3dhcCIpICE9IDAp KSB7CgkJCQlpbnQgaSwgbDsKCgkJCQlnb29kbmVzcysrOwoJCQkJbCA9IHN0cmxlbihwYXJ0LT5u YW1lKTsKCQkJCWlmIChzdHJjbXAocGFydC0+bmFtZSwgIi8iKSA9PSAwKQoJCQkJCWdvb2RuZXNz Kys7CgkJCQlmb3IgKGkgPSAwOyBpIDw9IGwgLSA0OyArK2kpIHsKCQkJCQlpZiAoc3RybmljbXAo cGFydC0+bmFtZSArIGksICJyb290IiwKCQkJCQkJICAgICA0KSA9PSAwKSB7CgkJCQkJCWdvb2Ru ZXNzICs9IDI7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0KCQkJCWlmIChzdHJuaWNtcChwYXJ0 LT5uYW1lLCAic3dhcCIsIDQpID09IDApCgkJCQkJZ29vZG5lc3MtLTsKCQkJfQoKCQkJaWYgKGdv b2RuZXNzID4gZm91bmRfcm9vdF9nb29kbmVzcykgewoJCQkJZm91bmRfcm9vdCA9IGJsazsKCQkJ CWZvdW5kX3Jvb3RfZ29vZG5lc3MgPSBnb29kbmVzczsKCQkJfQoJCX0KI2VuZGlmIC8qIENPTkZJ R19QUEMgKi8KCgkJKytjdXJyZW50X21pbm9yOwoJfQojaWZkZWYgQ09ORklHX1BQQwoJaWYgKGZv dW5kX3Jvb3RfZ29vZG5lc3MpCgkJbm90ZV9ib290YWJsZV9wYXJ0KGRldiwgZm91bmRfcm9vdCwg Zm91bmRfcm9vdF9nb29kbmVzcyk7CiNlbmRpZgoJYnJlbHNlKGJoKTsKCXByaW50aygiXG4iKTsK CXJldHVybiAxOwp9CgojZW5kaWYgLyogQ09ORklHX01BQ19QQVJUSVRJT04gKi8KCiNpZmRlZiBD T05GSUdfQVRBUklfUEFSVElUSU9OCiNpbmNsdWRlIDxsaW51eC9hdGFyaV9yb290c2VjLmg+Cgov KiArK2d1ZW50aGVyOiB0aGlzIHNob3VsZCBiZSBzZXR0YWJsZSBieSB0aGUgdXNlciAoIm1ha2Ug Y29uZmlnIik/LgogKi8KI2RlZmluZSBJQ0RfUEFSVFMKCnN0YXRpYyBpbnQgYXRhcmlfcGFydGl0 aW9uIChzdHJ1Y3QgZ2VuZGlzayAqaGQsIGtkZXZfdCBkZXYsCgkJCSAgICB1bnNpZ25lZCBsb25n IGZpcnN0X3NlY3RvcikKewogIGludCBtaW5vciA9IGN1cnJlbnRfbWlub3IsIG1fbGltID0gY3Vy cmVudF9taW5vciArIGhkLT5tYXhfcDsKICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwogIHN0cnVj dCByb290c2VjdG9yICpyczsKICBzdHJ1Y3QgcGFydGl0aW9uX2luZm8gKnBpOwogIHVsb25nIGV4 dGVuc2VjdDsKI2lmZGVmIElDRF9QQVJUUwogIGludCBwYXJ0X2ZtdCA9IDA7IC8qIDA6dW5rbm93 biwgMTpBSERJLCAyOklDRC9TdXByYSAqLwojZW5kaWYKCiAgYmggPSBicmVhZCAoZGV2LCAwLCBn ZXRfcHRhYmxlX2Jsb2Nrc2l6ZShkZXYpKTsKICBpZiAoIWJoKQogICAgewogICAgICBwcmludGsg KCIgdW5hYmxlIHRvIHJlYWQgYmxvY2sgMFxuIik7CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAg cnMgPSAoc3RydWN0IHJvb3RzZWN0b3IgKikgYmgtPmJfZGF0YTsKICBwaSA9ICZycy0+cGFydFsw XTsKICBwcmludGsgKCIgQUhESSIpOwogIGZvciAoOyBwaSA8ICZycy0+cGFydFs0XSAmJiBtaW5v ciA8IG1fbGltOyBtaW5vcisrLCBwaSsrKQogICAgewogICAgICBpZiAocGktPmZsZyAmIDEpCgkv KiBhY3RpdmUgcGFydGl0aW9uICovCgl7CgkgIGlmIChtZW1jbXAgKHBpLT5pZCwgIlhHTSIsIDMp ID09IDApCgkgICAgLyogZXh0ZW5zaW9uIHBhcnRpdGlvbiAqLwoJICAgIHsKCSAgICAgIHN0cnVj dCByb290c2VjdG9yICp4cnM7CgkgICAgICBzdHJ1Y3QgYnVmZmVyX2hlYWQgKnhiaDsKCSAgICAg IHVsb25nIHBhcnRzZWN0OwoKI2lmZGVmIElDRF9QQVJUUwoJICAgICAgcGFydF9mbXQgPSAxOwoj ZW5kaWYKCSAgICAgIHByaW50aygiIFhHTTwiKTsKCSAgICAgIHBhcnRzZWN0ID0gZXh0ZW5zZWN0 ID0gYmUzMl90b19jcHUocGktPnN0KTsKCSAgICAgIHdoaWxlICgxKQoJCXsKCQkgIHhiaCA9IGJy ZWFkIChkZXYsIHBhcnRzZWN0IC8gMiwgZ2V0X3B0YWJsZV9ibG9ja3NpemUoZGV2KSk7CgkJICBp ZiAoIXhiaCkKCQkgICAgewoJCSAgICAgIHByaW50ayAoIiBibG9jayAlbGQgcmVhZCBmYWlsZWRc biIsIHBhcnRzZWN0KTsKCQkgICAgICBicmVsc2UoYmgpOwoJCSAgICAgIHJldHVybiAwOwoJCSAg ICB9CgkJICBpZiAocGFydHNlY3QgJiAxKQoJCSAgICB4cnMgPSAoc3RydWN0IHJvb3RzZWN0b3Ig KikgJnhiaC0+Yl9kYXRhWzUxMl07CgkJICBlbHNlCgkJICAgIHhycyA9IChzdHJ1Y3Qgcm9vdHNl Y3RvciAqKSAmeGJoLT5iX2RhdGFbMF07CgoJCSAgLyogKytyb21hbjogc2FuaXR5IGNoZWNrOiBi aXQgMCBvZiBmbGcgZmllbGQgbXVzdCBiZSBzZXQgKi8KCQkgIGlmICghKHhycy0+cGFydFswXS5m bGcgJiAxKSkgewoJCSAgICBwcmludGsoICJcbkZpcnN0IHN1Yi1wYXJ0aXRpb24gaW4gZXh0ZW5k ZWQgcGFydGl0aW9uIGlzIG5vdCB2YWxpZCFcbiIgKTsKCQkgICAgYnJlYWs7CgkJICB9CgoJCSAg YWRkX3BhcnRpdGlvbihoZCwgbWlub3IsIHBhcnRzZWN0ICsgYmUzMl90b19jcHUoeHJzLT5wYXJ0 WzBdLnN0KSwKCQkJCWJlMzJfdG9fY3B1KHhycy0+cGFydFswXS5zaXopLCAwKTsKCgkJICBpZiAo ISh4cnMtPnBhcnRbMV0uZmxnICYgMSkpIHsKCQkgICAgLyogZW5kIG9mIGxpbmtlZCBwYXJ0aXRp b24gbGlzdCAqLwoJCSAgICBicmVsc2UoIHhiaCApOwoJCSAgICBicmVhazsKCQkgIH0KCQkgIGlm IChtZW1jbXAoIHhycy0+cGFydFsxXS5pZCwgIlhHTSIsIDMgKSAhPSAwKSB7CgkJICAgIHByaW50 ayggIlxuSUQgb2YgZXh0ZW5kZWQgcGFydGl0aW9uIGlzIG5vdCBYR00hXG4iICk7CgkJICAgIGJy ZWxzZSggeGJoICk7CgkJICAgIGJyZWFrOwoJCSAgfQoKCQkgIHBhcnRzZWN0ID0gYmUzMl90b19j cHUoeHJzLT5wYXJ0WzFdLnN0KSArIGV4dGVuc2VjdDsKCQkgIGJyZWxzZSAoeGJoKTsKCQkgIG1p bm9yKys7CgkJICBpZiAobWlub3IgPj0gbV9saW0pIHsKCQkgICAgcHJpbnRrKCAiXG5NYXhpbXVt IG51bWJlciBvZiBwYXJ0aXRpb25zIHJlYWNoZWQhXG4iICk7CgkJICAgIGJyZWFrOwoJCSAgfQoJ CX0KCSAgICAgIHByaW50aygiID4iKTsKCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICAvKiB3 ZSBkb24ndCBjYXJlIGFib3V0IG90aGVyIGlkJ3MgKi8KCSAgICAgIHByaW50aygiICVjJWMlYygl ZCkiLCBwaS0+aWRbMF0sIHBpLT5pZFsxXSwgcGktPmlkWzJdLCBiZTMyX3RvX2NwdShwaS0+c2l6 KS8yMDQ4KTsKCSAgICAgIGFkZF9wYXJ0aXRpb24gKGhkLCBtaW5vciwgYmUzMl90b19jcHUocGkt PnN0KSwgYmUzMl90b19jcHUocGktPnNpeiksIDApOwoJICAgIH0KCX0KICAgIH0KI2lmZGVmIElD RF9QQVJUUwogIGlmICggcGFydF9mbXQhPTEgKSAvKiBubyBleHRlbmRlZCBwYXJ0aXRpb25zIC0+ IHRlc3QgSUNELWZvcm1hdCAqLwogIHsKICAgIHBpID0gJnJzLT5pY2RwYXJ0WzBdOwogICAgLyog c2FuaXR5IGNoZWNrOiBubyBJQ0QgZm9ybWF0IGlmIGZpcnN0IHBhcnRpdGlvbiBpbnZhbGlkICov CiAgICBpZiAobWVtY21wIChwaS0+aWQsICJHRU0iLCAzKSA9PSAwIHx8CiAgICAgICAgbWVtY21w IChwaS0+aWQsICJCR00iLCAzKSA9PSAwIHx8CiAgICAgICAgbWVtY21wIChwaS0+aWQsICJMTlgi LCAzKSA9PSAwIHx8CiAgICAgICAgbWVtY21wIChwaS0+aWQsICJTV1AiLCAzKSA9PSAwIHx8CiAg ICAgICAgbWVtY21wIChwaS0+aWQsICJSQVciLCAzKSA9PSAwICkKICAgIHsKICAgICAgcHJpbnRr KCIgSUNEPCIpOwogICAgICBmb3IgKDsgcGkgPCAmcnMtPmljZHBhcnRbOF0gJiYgbWlub3IgPCBt X2xpbTsgbWlub3IrKywgcGkrKykKICAgICAgewogICAgICAgIC8qIGFjY2VwdCBvbmx5IEdFTSxC R00sUkFXLExOWCxTV1AgcGFydGl0aW9ucyAqLwogICAgICAgIGlmIChwaS0+ZmxnICYgMSAmJiAK ICAgICAgICAgICAgKG1lbWNtcCAocGktPmlkLCAiR0VNIiwgMykgPT0gMCB8fAogICAgICAgICAg ICAgbWVtY21wIChwaS0+aWQsICJCR00iLCAzKSA9PSAwIHx8CiAgICAgICAgICAgICBtZW1jbXAg KHBpLT5pZCwgIkxOWCIsIDMpID09IDAgfHwKICAgICAgICAgICAgIG1lbWNtcCAocGktPmlkLCAi U1dQIiwgMykgPT0gMCB8fAogICAgICAgICAgICAgbWVtY21wIChwaS0+aWQsICJSQVciLCAzKSA9 PSAwKSApCiAgICAgICAgewogICAgICAgICAgcGFydF9mbXQgPSAyOwoJICBhZGRfcGFydGl0aW9u IChoZCwgbWlub3IsIHBpLT5zdCwgcGktPnNpeiwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICAg IHByaW50aygiID4iKTsKICAgIH0KICB9CiNlbmRpZgogIGJyZWxzZSAoYmgpOwoKICBwcmludGsg KCJcbiIpOwoKICByZXR1cm4gMTsKfQojZW5kaWYgLyogQ09ORklHX0FUQVJJX1BBUlRJVElPTiAq LwoKI2lmZGVmIENPTkZJR19VTFRSSVhfUEFSVElUSU9OCgpzdGF0aWMgaW50IHVsdHJpeF9wYXJ0 aXRpb24oc3RydWN0IGdlbmRpc2sgKmhkLCBrZGV2X3QgZGV2LCB1bnNpZ25lZCBsb25nIGZpcnN0 X3NlY3RvcikKewoJaW50IGksIG1pbm9yID0gY3VycmVudF9taW5vcjsKCXN0cnVjdCBidWZmZXJf aGVhZCAqYmg7CglzdHJ1Y3QgdWx0cml4X2Rpc2tsYWJlbCB7CgkJbG9uZwlwdF9tYWdpYzsJLyog bWFnaWMgbm8uIGluZGljYXRpbmcgcGFydC4gaW5mbyBleGl0cyAqLwoJCWludAlwdF92YWxpZDsJ Lyogc2V0IGJ5IGRyaXZlciBpZiBwdCBpcyBjdXJyZW50ICovCgkJc3RydWN0ICBwdF9pbmZvIHsK CQkJaW50CQlwaV9uYmxvY2tzOyAvKiBuby4gb2Ygc2VjdG9ycyAqLwoJCQl1bnNpZ25lZCBsb25n CXBpX2Jsa29mZjsgIC8qIGJsb2NrIG9mZnNldCBmb3Igc3RhcnQgKi8KCQl9IHB0X3BhcnRbOF07 Cgl9ICpsYWJlbDsKCiNkZWZpbmUgUFRfTUFHSUMJMHgwMzI5NTcJLyogUGFydGl0aW9uIG1hZ2lj IG51bWJlciAqLwojZGVmaW5lIFBUX1ZBTElECTEJCS8qIEluZGljYXRlcyBpZiBzdHJ1Y3QgaXMg dmFsaWQgKi8KCiNkZWZpbmUJU0JMT0NLCSgodW5zaWduZWQgbG9uZykoKDE2Mzg0IC0gc2l6ZW9m KHN0cnVjdCB1bHRyaXhfZGlza2xhYmVsKSkgXAogICAgICAgICAgICAgICAgICAvZ2V0X3B0YWJs ZV9ibG9ja3NpemUoZGV2KSkpCgoJYmggPSBicmVhZCAoZGV2LCBTQkxPQ0ssIGdldF9wdGFibGVf YmxvY2tzaXplKGRldikpOwoJaWYgKCFiaCkgewoJCXByaW50ayAoIiB1bmFibGUgdG8gcmVhZCBi bG9jayAweCVseFxuIiwgU0JMT0NLKTsKCQlyZXR1cm4gLTE7Cgl9CgkKCWxhYmVsID0gKHN0cnVj dCB1bHRyaXhfZGlza2xhYmVsICopKGJoLT5iX2RhdGEKICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICArIGdldF9wdGFibGVfYmxvY2tzaXplKGRldikKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHNpemVvZihzdHJ1Y3QgdWx0cml4 X2Rpc2tsYWJlbCkpOwoKCWlmIChsYWJlbC0+cHRfbWFnaWMgPT0gUFRfTUFHSUMgJiYgbGFiZWwt PnB0X3ZhbGlkID09IFBUX1ZBTElEKSB7CgkJZm9yIChpPTA7IGk8ODsgaSsrLCBtaW5vcisrKQoJ CQlpZiAobGFiZWwtPnB0X3BhcnRbaV0ucGlfbmJsb2NrcykKCQkJCWFkZF9wYXJ0aXRpb24oaGQs IG1pbm9yLCAKCQkJCQkgICAgICBsYWJlbC0+cHRfcGFydFtpXS5waV9ibGtvZmYsCgkJCQkJICAg ICAgbGFiZWwtPnB0X3BhcnRbaV0ucGlfbmJsb2Nrcyk7CgkJYnJlbHNlKGJoKTsKCQlwcmludGsg KCJcbiIpOwoJCXJldHVybiAxOwoJfSBlbHNlIHsKCQlicmVsc2UoYmgpOwoJCXJldHVybiAwOwoJ fQp9CgojZW5kaWYgLyogQ09ORklHX1VMVFJJWF9QQVJUSVRJT04gKi8KCiNpZmRlZiBDT05GSUdf QVJDSF9TMzkwCiNpbmNsdWRlIDxsaW51eC9tYWxsb2MuaD4KI2luY2x1ZGUgPGxpbnV4L2hkcmVn Lmg+CiNpbmNsdWRlIDxsaW51eC9pb2N0bC5oPgojaW5jbHVkZSA8YXNtL2ViY2RpYy5oPgojaW5j bHVkZSA8YXNtL3VhY2Nlc3MuaD4KCnR5cGVkZWYgZW51bSB7CiAgaWJtX3BhcnRpdGlvbl9ub25l ID0gMCwKICBpYm1fcGFydGl0aW9uX2xueDEgPSAxLAogIGlibV9wYXJ0aXRpb25fdm9sMSA9IDMs CiAgaWJtX3BhcnRpdGlvbl9jbXMxID0gNAp9IGlibV9wYXJ0aXRpb25fdDsKCnN0YXRpYyBpYm1f cGFydGl0aW9uX3QKZ2V0X3BhcnRpdGlvbl90eXBlICggY2hhciAqIHR5cGUgKQp7CiAgICAgICAg c3RhdGljIGNoYXIgbG54WzVdPSJMTlgxIjsKICAgICAgICBzdGF0aWMgY2hhciB2b2xbNV09IlZP TDEiOwogICAgICAgIHN0YXRpYyBjaGFyIGNtc1s1XT0iQ01TMSI7CiAgICAgICAgaWYgKCAhIHN0 cm5jbXAgKCBsbngsICJMTlgxIiw0ICkgKSB7CiAgICAgICAgICAgICAgICBBU0NFQkMobG54LDQp OwogICAgICAgICAgICAgICAgQVNDRUJDKHZvbCw0KTsKICAgICAgICAgICAgICAgIEFTQ0VCQyhj bXMsNCk7CiAgICAgICAgfQogICAgICAgIGlmICggISBzdHJuY21wICh0eXBlLGxueCw0KSB8fAog ICAgICAgICAgICAgISBzdHJuY21wICh0eXBlLCJMTlgxIiw0KSApCiAgICAgICAgICAgICAgICBy ZXR1cm4gaWJtX3BhcnRpdGlvbl9sbngxOwogICAgICAgIGlmICggISBzdHJuY21wICh0eXBlLHZv bCw0KSApCiAgICAgICAgICAgICAgICByZXR1cm4gaWJtX3BhcnRpdGlvbl92b2wxOwogICAgICAg IGlmICggISBzdHJuY21wICh0eXBlLGNtcyw0KSApCiAgICAgICAgICAgICAgICByZXR1cm4gaWJt X3BhcnRpdGlvbl9jbXMxOwogICAgICAgIHJldHVybiBpYm1fcGFydGl0aW9uX25vbmU7Cn0KCmlu dCAKaWJtX3BhcnRpdGlvbiAoc3RydWN0IGdlbmRpc2sgKmhkLCBrZGV2X3QgZGV2LCBpbnQgZmly c3Rfc2VjdG9yKQp7CglzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoOwoJaWJtX3BhcnRpdGlvbl90IHBh cnRpdGlvbl90eXBlOwoJY2hhciB0eXBlWzVdID0gezAsfTsKCWNoYXIgbmFtZVs3XSA9IHswLH07 CglzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvOwoJbW1fc2VnbWVudF90IG9sZF9mczsKCWludCBibG9j a3NpemU7CglzdHJ1Y3QgZmlsZSAqZmlscCA9IE5VTEw7CglzdHJ1Y3QgaW5vZGUgKmlub2RlID0g TlVMTDsKCWludCBvZmZzZXQsIHNpemU7CglpbnQgcmM7CgoJYmxvY2tzaXplID0gaGFyZHNlY3Rf c2l6ZVtNQUpPUihkZXYpXVtNSU5PUihkZXYpXTsKCWlmICggYmxvY2tzaXplIDw9IDAgKSB7CgkJ cmV0dXJuIDA7Cgl9CglzZXRfYmxvY2tzaXplKGRldiwgYmxvY2tzaXplKTsgIC8qIE9VQ0ggISEg Ki8KCgkvKiBmaW5kIG91dCBvZmZzZXQgb2Ygdm9sdW1lIGxhYmVsIChwYXJ0biB0YWJsZSkgKi8K CWZpbHAgPSAoc3RydWN0IGZpbGUgKilrbWFsbG9jIChzaXplb2Yoc3RydWN0IGZpbGUpLEdGUF9L RVJORUwpOwoJaWYgKCBmaWxwID09IE5VTEwgKSB7CgkJcHJpbnRrIChLRVJOX1dBUk5JTkcgX19G SUxFX18gIiBpYm1fcGFydGl0aW9uOiBrbWFsbG9jIGZhaWxlZCBmb3IgZmlscFxuIik7CgkJcmV0 dXJuIDA7Cgl9CgltZW1zZXQoZmlscCwwLHNpemVvZihzdHJ1Y3QgZmlsZSkpOwoJZmlscCAtPmZf bW9kZSA9IDE7IC8qIHJlYWQgb25seSAqLwoJaW5vZGUgPSBnZXRfZW1wdHlfaW5vZGUoKTsKCWlu b2RlIC0+IGlfcmRldiA9IGRldjsKCXJjID0gYmxrZGV2X29wZW4oaW5vZGUsZmlscCk7CglpZiAo IHJjICkgewoJCXJldHVybiAwOwoJfQoJb2xkX2ZzPWdldF9mcygpOwoJc2V0X2ZzKEtFUk5FTF9E Uyk7CglyYyA9IGZpbHAtPmZfb3AtPmlvY3RsIChpbm9kZSwgZmlscCwgSERJT19HRVRHRU8sICh1 bnNpZ25lZCBsb25nKSgmZ2VvKSk7CglzZXRfZnMob2xkX2ZzKTsKCWlmICggcmMgKSB7CgkJcmV0 dXJuIDA7Cgl9CglibGtkZXZfcmVsZWFzZShpbm9kZSk7CgkKCXNpemUgPSBoZCAtPiBzaXplc1tN SU5PUihkZXYpXTw8MTsKCWlmICggKCBiaCA9IGJyZWFkKCBkZXYsIGdlby5zdGFydCwgYmxvY2tz aXplKSApICE9IE5VTEwgKSB7CgkJc3RybmNweSAoIHR5cGUsYmggLT4gYl9kYXRhLCA0KTsKCQlz dHJuY3B5ICggbmFtZSxiaCAtPiBiX2RhdGEgKyA0LCA2KTsKICAgICAgICB9IGVsc2UgewoJCXJl dHVybiAwOwoJfQoJaWYgKCAoKihjaGFyICopYmggLT4gYl9kYXRhKSAmIDB4ODAgKSB7CgkJRUJD QVNDKG5hbWUsNik7Cgl9Cglzd2l0Y2ggKCBwYXJ0aXRpb25fdHlwZSA9IGdldF9wYXJ0aXRpb25f dHlwZSh0eXBlKSApIHsKCWNhc2UgaWJtX3BhcnRpdGlvbl9sbngxOiAKCQlvZmZzZXQgPSAoZ2Vv LnN0YXJ0ICsgMSk7CgkJcHJpbnRrICggIihMTlgxKS8lNnM6IixuYW1lKTsKCQlicmVhazsKCWNh c2UgaWJtX3BhcnRpdGlvbl92b2wxOgoJCW9mZnNldCA9IDA7CgkJc2l6ZSA9IDA7CgkJcHJpbnRr ICggIihWT0wxKS8lNnM6IixuYW1lKTsKCQlicmVhazsKCWNhc2UgaWJtX3BhcnRpdGlvbl9jbXMx OgoJCXByaW50ayAoICIoQ01TMSkvJTZzOiIsbmFtZSk7CgkJaWYgKCogKCgobG9uZyAqKWJoLT5i X2RhdGEpICsgMTMpID09IDApIHsKCQkJLyogZGlzayBob2xkcyBhIENNUyBmaWxlc3lzdGVtICov CgkJCW9mZnNldCA9IChnZW8uc3RhcnQgKyAxKTsKCQkJcHJpbnRrICgiKENNUykiKTsKCQl9IGVs c2UgewoJCQkvKiBkaXNrIGlzIHJlc2VydmVkIG1pbmlkaXNrICovCgkJCS8vIG1kaXNrX3NldHVw X2RhdGEuc2l6ZVtpXSA9CgkJCS8vIChsYWJlbFs3XSAtIDEgLSBsYWJlbFsxM10pICoKCQkJLy8g KGxhYmVsWzNdID4+IDkpID4+IDE7CgkJCWxvbmcgKmxhYmVsPShsb25nKiliaC0+Yl9kYXRhOwoJ CQlibG9ja3NpemUgPSBsYWJlbFszXTsKCQkJb2Zmc2V0ID0gbGFiZWxbMTNdOwoJCQlzaXplID0g KGxhYmVsWzddLTEpKihibG9ja3NpemU+PjkpOyAKCQkJcHJpbnRrICgiKE1EU0spIik7CgkJfQoJ CWJyZWFrOwoJY2FzZSBpYm1fcGFydGl0aW9uX25vbmU6CgkJcHJpbnRrICggIihub25sKS8gICAg ICA6Iik7CgkJb2Zmc2V0ID0gKGdlby5zdGFydCsxKTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJb2Zm c2V0ID0gMDsKCQlzaXplID0gMDsKCQkKCX0KCWFkZF9wYXJ0aXRpb24oIGhkLCBNSU5PUihkZXYp LCAwLHNpemUsMCk7CglhZGRfcGFydGl0aW9uKCBoZCwgTUlOT1IoZGV2KSArIDEsIG9mZnNldCAq IChibG9ja3NpemUgPj4gOSksCgkJICAgICAgIHNpemUtb2Zmc2V0KihibG9ja3NpemU+PjkpICww ICk7CglwcmludGsgKCAiXG4iICk7CgliZm9yZ2V0KGJoKTsKCXJldHVybiAxOwp9CiNlbmRpZgoK c3RhdGljIHZvaWQgY2hlY2tfcGFydGl0aW9uKHN0cnVjdCBnZW5kaXNrICpoZCwga2Rldl90IGRl dikKewoJc3RhdGljIGludCBmaXJzdF90aW1lID0gMTsKCXVuc2lnbmVkIGxvbmcgZmlyc3Rfc2Vj dG9yOwoJY2hhciBidWZbTUFYX0RJU0tOQU1FX0xFTl07CgoJaWYgKGZpcnN0X3RpbWUpCgkJcHJp bnRrKEtFUk5fSU5GTyAiUGFydGl0aW9uIGNoZWNrOlxuIik7CglmaXJzdF90aW1lID0gMDsKCWZp cnN0X3NlY3RvciA9IGhkLT5wYXJ0W01JTk9SKGRldildLnN0YXJ0X3NlY3Q7CgoJLyoKCSAqIFRo aXMgaXMgYSBrbHVkZ2UgdG8gYWxsb3cgdGhlIHBhcnRpdGlvbiBjaGVjayB0byBiZQoJICogc2tp cHBlZCBmb3Igc3BlY2lmaWMgZHJpdmVzIChlLmcuIElERSBDRC1ST00gZHJpdmVzKQoJICovCglp ZiAoKGludClmaXJzdF9zZWN0b3IgPT0gLTEpIHsKCQloZC0+cGFydFtNSU5PUihkZXYpXS5zdGFy dF9zZWN0ID0gMDsKCQlyZXR1cm47Cgl9CgoJcHJpbnRrKEtFUk5fSU5GTyAiICVzOiIsIGRpc2tf bmFtZShoZCwgTUlOT1IoZGV2KSwgYnVmKSk7CiNpZmRlZiBDT05GSUdfTVNET1NfUEFSVElUSU9O CglpZiAobXNkb3NfcGFydGl0aW9uKGhkLCBkZXYsIGZpcnN0X3NlY3RvcikpCgkJcmV0dXJuOwoj ZW5kaWYKI2lmZGVmIENPTkZJR19PU0ZfUEFSVElUSU9OCglpZiAob3NmX3BhcnRpdGlvbihoZCwg ZGV2LCBmaXJzdF9zZWN0b3IpKQoJCXJldHVybjsKI2VuZGlmCiNpZmRlZiBDT05GSUdfU1VOX1BB UlRJVElPTgoJaWYoc3VuX3BhcnRpdGlvbihoZCwgZGV2LCBmaXJzdF9zZWN0b3IpKQoJCXJldHVy bjsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQU1JR0FfUEFSVElUSU9OCglpZihhbWlnYV9wYXJ0aXRp b24oaGQsIGRldiwgZmlyc3Rfc2VjdG9yKSkKCQlyZXR1cm47CiNlbmRpZgojaWZkZWYgQ09ORklH X01BQ19QQVJUSVRJT04KCWlmIChtYWNfcGFydGl0aW9uKGhkLCBkZXYsIGZpcnN0X3NlY3Rvcikp CgkJcmV0dXJuOwojZW5kaWYKI2lmZGVmIENPTkZJR19TR0lfUEFSVElUSU9OCglpZihzZ2lfcGFy dGl0aW9uKGhkLCBkZXYsIGZpcnN0X3NlY3RvcikpCgkJcmV0dXJuOwojZW5kaWYKI2lmZGVmIENP TkZJR19VTFRSSVhfUEFSVElUSU9OCglpZih1bHRyaXhfcGFydGl0aW9uKGhkLCBkZXYsIGZpcnN0 X3NlY3RvcikpCgkJcmV0dXJuOwojZW5kaWYKI2lmZGVmIENPTkZJR19BVEFSSV9QQVJUSVRJT04K CWlmKGF0YXJpX3BhcnRpdGlvbihoZCwgZGV2LCBmaXJzdF9zZWN0b3IpKQoJCXJldHVybjsKI2Vu ZGlmCiNpZmRlZiBDT05GSUdfQVJDSF9TMzkwCglpZiAoaWJtX3BhcnRpdGlvbiAoaGQsIGRldiwg Zmlyc3Rfc2VjdG9yKSkKCQlyZXR1cm47CiNlbmRpZgoJcHJpbnRrKCIgdW5rbm93biBwYXJ0aXRp b24gdGFibGVcbiIpOwp9CgovKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmUtcmVhZCBwYXJ0 aXRpb24gdGFibGVzIGZvciByZW1vdmFibGUgZGlza3MuCiAgIE11Y2ggb2YgdGhlIGNsZWFudXAg ZnJvbSB0aGUgb2xkIHBhcnRpdGlvbiB0YWJsZXMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuCiAg IGRvbmUgKi8KCi8qIFRoaXMgZnVuY3Rpb24gd2lsbCByZS1yZWFkIHRoZSBwYXJ0aXRpb24gdGFi bGVzIGZvciBhIGdpdmVuIGRldmljZSwKYW5kIHNldCB0aGluZ3MgYmFjayB1cCBhZ2Fpbi4gIFRo ZXJlIGFyZSBzb21lIGltcG9ydGFudCBjYXZlYXRzLApob3dldmVyLiAgWW91IG11c3QgZW5zdXJl IHRoYXQgbm8gb25lIGlzIHVzaW5nIHRoZSBkZXZpY2UsIGFuZCBubyBvbmUKY2FuIHN0YXJ0IHVz aW5nIHRoZSBkZXZpY2Ugd2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBiZWluZyBleGVjdXRlZC4gKi8K CnZvaWQgcmVzZXR1cF9vbmVfZGV2KHN0cnVjdCBnZW5kaXNrICpkZXYsIGludCBkcml2ZSkKewoJ aW50IGk7CglpbnQgZmlyc3RfbWlub3IJPSBkcml2ZSA8PCBkZXYtPm1pbm9yX3NoaWZ0OwoJaW50 IGVuZF9taW5vcgk9IGZpcnN0X21pbm9yICsgZGV2LT5tYXhfcDsKCglibGtfc2l6ZVtkZXYtPm1h am9yXSA9IE5VTEw7CgljdXJyZW50X21pbm9yID0gMSArIGZpcnN0X21pbm9yOwoJY2hlY2tfcGFy dGl0aW9uKGRldiwgTUtERVYoZGV2LT5tYWpvciwgZmlyc3RfbWlub3IpKTsKCiAJLyoKIAkgKiBX ZSBuZWVkIHRvIHNldCB0aGUgc2l6ZXMgYXJyYXkgYmVmb3JlIHdlIHdpbGwgYmUgYWJsZSB0byBh Y2Nlc3MKIAkgKiBhbnkgb2YgdGhlIHBhcnRpdGlvbnMgb24gdGhpcyBkZXZpY2UuCiAJICovCglp ZiAoZGV2LT5zaXplcyAhPSBOVUxMKSB7CS8qIG9wdGlvbmFsIHNhZmVndWFyZCBpbiBsbF9yd19i bGsuYyAqLwoJCWZvciAoaSA9IGZpcnN0X21pbm9yOyBpIDwgZW5kX21pbm9yOyBpKyspCgkJCWRl di0+c2l6ZXNbaV0gPSBkZXYtPnBhcnRbaV0ubnJfc2VjdHMgPj4gKEJMT0NLX1NJWkVfQklUUyAt IDkpOwoJCWJsa19zaXplW2Rldi0+bWFqb3JdID0gZGV2LT5zaXplczsKCX0KfQoKc3RhdGljIGlu bGluZSB2b2lkIHNldHVwX2RldihzdHJ1Y3QgZ2VuZGlzayAqZGV2KQp7CglpbnQgaSwgZHJpdmU7 CglpbnQgZW5kX21pbm9yCT0gZGV2LT5tYXhfbnIgKiBkZXYtPm1heF9wOwoKCWJsa19zaXplW2Rl di0+bWFqb3JdID0gTlVMTDsKCWZvciAoaSA9IDAgOyBpIDwgZW5kX21pbm9yOyBpKyspIHsKCQlk ZXYtPnBhcnRbaV0uc3RhcnRfc2VjdCA9IDA7CgkJZGV2LT5wYXJ0W2ldLm5yX3NlY3RzID0gMDsK CX0KCWlmICggZGV2LT5pbml0ICE9IE5VTEwgKQoJCWRldi0+aW5pdChkZXYpOwkKCWZvciAoZHJp dmUgPSAwIDsgZHJpdmUgPCBkZXYtPm5yX3JlYWwgOyBkcml2ZSsrKSB7CgkJaW50IGZpcnN0X21p bm9yCT0gZHJpdmUgPDwgZGV2LT5taW5vcl9zaGlmdDsKCQljdXJyZW50X21pbm9yID0gMSArIGZp cnN0X21pbm9yOwoJCS8qIElmIHdlIHJlYWxseSBoYXZlIGEgZGV2aWNlIGNoZWNrIHBhcnRpdGlv biB0YWJsZSAqLwoJCWlmICggYmxrc2l6ZV9zaXplW2Rldi0+bWFqb3JdID09IE5VTEwgfHwKCQkg ICAgIGJsa3NpemVfc2l6ZVtkZXYtPm1ham9yXVtjdXJyZW50X21pbm9yXSkKCQkJY2hlY2tfcGFy dGl0aW9uKGRldiwgTUtERVYoZGV2LT5tYWpvciwgZmlyc3RfbWlub3IpKTsKCX0KCWlmIChkZXYt PnNpemVzICE9IE5VTEwpIHsJLyogb3B0aW9uYWwgc2FmZWd1YXJkIGluIGxsX3J3X2Jsay5jICov CgkJZm9yIChpID0gMDsgaSA8IGVuZF9taW5vcjsgaSsrKSAKCQkJZGV2LT5zaXplc1tpXSA9IGRl di0+cGFydFtpXS5ucl9zZWN0cyA+PiAoQkxPQ0tfU0laRV9CSVRTIC0gOSk7CgkJYmxrX3NpemVb ZGV2LT5tYWpvcl0gPSBkZXYtPnNpemVzOwoJfQp9CgpFWFBPUlRfU1lNQk9MKG1ham9yX2dlbmRp c2spOwoKX19pbml0ZnVuYyh2b2lkIGRldmljZV9zZXR1cCh2b2lkKSkKewoJZXh0ZXJuIHZvaWQg Y29uc29sZV9tYXBfaW5pdCh2b2lkKTsKCWV4dGVybiB2b2lkIGNwcWFycmF5X2luaXQodm9pZCk7 CiNpZmRlZiBDT05GSUdfQkxLX0NQUV9DSVNTX0RBCglleHRlcm4gaW50ICBjY2lzc19pbml0KHZv aWQpOwojZW5kaWYgCiNpZmRlZiBDT05GSUdfUEFSUE9SVAoJZXh0ZXJuIGludCBwYXJwb3J0X2lu aXQodm9pZCk7CiNlbmRpZgojaWZkZWYgQ09ORklHX01EX0JPT1QKICAgICAgICBleHRlcm4gdm9p ZCBtZF9zZXR1cF9kcml2ZSh2b2lkKSBfX2luaXQ7CiNlbmRpZgojaWZkZWYgQ09ORklHX0ZDNF9T T0MKCWV4dGVybiBpbnQgc29jX3Byb2JlKHZvaWQpOwojZW5kaWYKCXN0cnVjdCBnZW5kaXNrICpw OwoKI2lmZGVmIENPTkZJR19QQVJQT1JUCglwYXJwb3J0X2luaXQoKTsKI2VuZGlmCgljaHJfZGV2 X2luaXQoKTsKCWJsa19kZXZfaW5pdCgpOwoJc3RpKCk7CiNpZmRlZiBDT05GSUdfSTJPCglpMm9f aW5pdCgpOwojZW5kaWYKI2lmZGVmIENPTkZJR19CTEtfREVWX0RBQzk2MAoJREFDOTYwX0luaXRp YWxpemUoKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfRkM0X1NPQwoJLyogVGhpcyBoYXMgdG8gYmUg ZG9uZSBiZWZvcmUgc2NzaV9kZXZfaW5pdCAqLwoJc29jX3Byb2JlKCk7CiNlbmRpZgojaWZkZWYg Q09ORklHX1NDU0kKCXNjc2lfZGV2X2luaXQoKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQkxLX0NQ UV9EQQoJY3BxYXJyYXlfaW5pdCgpOwojZW5kaWYKI2lmZGVmIENPTkZJR19CTEtfQ1BRX0NJU1Nf REEKICAgICAgICBjY2lzc19pbml0KCk7CiNlbmRpZgojaWZkZWYgQ09ORklHX05FVAoJbmV0X2Rl dl9pbml0KCk7CiNlbmRpZgojaWZkZWYgQ09ORklHX1ZUCgljb25zb2xlX21hcF9pbml0KCk7CiNl bmRpZgoKCWZvciAocCA9IGdlbmRpc2tfaGVhZCA7IHAgOyBwPXAtPm5leHQpCgkJc2V0dXBfZGV2 KHApOwoKI2lmZGVmIENPTkZJR19CTEtfREVWX1JBTQojaWZkZWYgQ09ORklHX0JMS19ERVZfSU5J VFJECglpZiAoaW5pdHJkX3N0YXJ0ICYmIG1vdW50X2luaXRyZCkgaW5pdHJkX2xvYWQoKTsKCWVs c2UKI2VuZGlmCglyZF9sb2FkKCk7CiNlbmRpZgojaWZkZWYgQ09ORklHX0JMS19ERVZfTUQKCWF1 dG9kZXRlY3RfcmFpZCgpOwojZW5kaWYKI2lmZGVmIENPTkZJR19NRF9CT09UCiAgICAgICAgbWRf c2V0dXBfZHJpdmUoKTsKI2VuZGlmCn0KCiNpZmRlZiBDT05GSUdfUFJPQ19GUwoKI2RlZmluZSBN U0VDKHgpICgoeCkgKiAxMDAwIC8gSFopCgppbnQgZ2V0X3BhcnRpdGlvbl9saXN0KGNoYXIgKnBh Z2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgY291bnQpCnsKCXN0cnVjdCBnZW5k aXNrICpwOwoJc3RydWN0IGhkX3N0cnVjdCAqaGQ7CgljaGFyIGJ1ZltNQVhfRElTS05BTUVfTEVO XTsKCWludCBuLCBsZW47CgoJbGVuID0gc3ByaW50ZihwYWdlLCAibWFqb3IgbWlub3IgICNibG9j a3MgIG5hbWUgICAgIHJpbyBybWVyZ2UgcnNlY3QgcnVzZSB3aW8gd21lcmdlIHdzZWN0IHd1c2Ug cnVubmluZyB1c2UgYXZlcVxuXG4iKTsJCglmb3IgKHAgPSBnZW5kaXNrX2hlYWQ7IHA7IHAgPSBw LT5uZXh0KSB7CgkJZm9yIChuPTA7IG4gPCAocC0+bnJfcmVhbCA8PCBwLT5taW5vcl9zaGlmdCk7 IG4rKykgewoJCQlpZiAocC0+cGFydFtuXS5ucl9zZWN0cykgewogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgaGQgPSAmcC0+cGFydFtuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIGRpc2tfcm91bmRfc3RhdHMoaGQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg bGVuICs9IHNwcmludGYocGFnZStsZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAiJTRkICAlNGQgJTEwZCAlLThzICIKCQkJCQkJICIlZCAlZCAlZCAlZCAl ZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKCQkJCQkgICAgICAgcC0+bWFqb3IsIG4sIHAtPnNpemVz W25dLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2tf bmFtZShwLCBuLCBidWYpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGhkLT5yZF9pb3MsIGhkLT5yZF9tZXJnZXMsCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBoZC0+cmRfc2VjdG9ycywKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TRUMoaGQtPnJkX3RpY2tzKSwKICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkLT53cl9pb3MsIGhkLT53cl9t ZXJnZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZC0+ d3Jfc2VjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IE1TRUMoaGQtPndyX3RpY2tzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGhkLT5pb3NfaW5fZmxpZ2h0LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIE1TRUMoaGQtPmlvX3RpY2tzKSwKICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TRUMoaGQtPmF2ZXEpKTsgICAKCgkJCQkJICAg ICAgIAoJCQkJaWYgKGxlbiA8IG9mZnNldCkgCgkJCQkJb2Zmc2V0IC09IGxlbiwgbGVuID0gMDsK CQkJCWVsc2UgaWYgKGxlbiA+PSBvZmZzZXQgKyBjb3VudCkKCQkJCQlnb3RvIGxlYXZlX2xvb3Bz OwoJCQl9CgkJfQoJfQpsZWF2ZV9sb29wczoKCSpzdGFydCA9IHBhZ2UgKyBvZmZzZXQ7CglsZW4g LT0gb2Zmc2V0OwoJaWYgKGxlbiA8IDApCgkJbGVuID0gMDsKCXJldHVybiBsZW4gPiBjb3VudCA/ IGNvdW50IDogbGVuOwp9CiNlbmRpZgo= --0__=9aXSUzwAb4n8F6JF3X9g4LTgMVlw6lLOYWHGvYKVXMSGht60CenEJo04 Content-type: application/octet-stream; name="genhd.c.rej" Content-Disposition: attachment; filename="genhd.c.rej" Content-transfer-encoding: base64 KioqKioqKioqKioqKioqCioqKiAxNDQsMTQ5ICoqKioKICAJCQlicmVhazsKICAJCWNhc2UgTURf TUFKT1I6CiAgCQkJdW5pdCAtPSAnYSctJzAnOwogIAl9CiAgCXBhcnQgPSBtaW5vciAmICgoMSA8 PCBoZC0+bWlub3Jfc2hpZnQpIC0gMSk7CiAgCWlmIChoZC0+bWFqb3IgPj0gU0NTSV9ESVNLMV9N QUpPUiAmJiBoZC0+bWFqb3IgPD0gU0NTSV9ESVNLN19NQUpPUikgewotLS0gMTQ5LDE2MiAtLS0t CiAgCQkJYnJlYWs7CiAgCQljYXNlIE1EX01BSk9SOgogIAkJCXVuaXQgLT0gJ2EnLScwJzsKKyAJ CQlicmVhazsKKyAjaWYgZGVmaW5lZCBDT05GSUdfQkxLX0RFVl9MVk0gfHwgZGVmaW5lZCBDT05G SUdfQkxLX0RFVl9MVk1fTU9EVUxFCisgCQljYXNlIExWTV9CTEtfTUFKT1I6CisgCQkJKmJ1ZiA9 IDA7CisgCQkJaWYgKCBsdm1faGRfbmFtZV9wdHIgIT0gTlVMTCkKKyAJCQkJKCBsdm1faGRfbmFt ZV9wdHIpICggYnVmLCBtaW5vcik7CisgCQkJcmV0dXJuIGJ1ZjsKKyAjZW5kaWYKICAJfQogIAlw YXJ0ID0gbWlub3IgJiAoKDEgPDwgaGQtPm1pbm9yX3NoaWZ0KSAtIDEpOwogIAlpZiAoaGQtPm1h am9yID49IFNDU0lfRElTSzFfTUFKT1IgJiYgaGQtPm1ham9yIDw9IFNDU0lfRElTSzdfTUFKT1Ip IHsK --0__=9aXSUzwAb4n8F6JF3X9g4LTgMVlw6lLOYWHGvYKVXMSGht60CenEJo04--