From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from list by lists.gnu.org with archive (Exim 4.71) id 1UTCUV-0007Oz-V4 for mharc-grub-devel@gnu.org; Fri, 19 Apr 2013 10:40:43 -0400 Received: from eggs.gnu.org ([208.118.235.92]:41673) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UTCUO-0007OR-KE for grub-devel@gnu.org; Fri, 19 Apr 2013 10:40:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UTCUJ-0001SE-DS for grub-devel@gnu.org; Fri, 19 Apr 2013 10:40:36 -0400 Received: from mail.gw90.de ([188.40.100.199]:49906) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UTCUI-0001Qw-PH for grub-devel@gnu.org; Fri, 19 Apr 2013 10:40:31 -0400 Received: from e178066249.adsl.alicedsl.de ([85.178.66.249] helo=[192.168.2.49]) by mail.gw90.de with esmtpsa (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.72) (envelope-from ) id 1UTCUD-0001MQ-7t for grub-devel@gnu.org; Fri, 19 Apr 2013 14:40:25 +0000 Message-ID: <1366382416.6116.9.camel@mattotaupa> Subject: Re: SATA disk on cntroller in AHCI mode not found: Hang at `AHCI status <1 0 150>` From: Paul Menzel To: grub-devel@gnu.org Date: Fri, 19 Apr 2013 16:40:16 +0200 In-Reply-To: <1366283507.11819.40.camel@mattotaupa> References: <1365159295.20168.36.camel@mattotaupa> <1366283507.11819.40.camel@mattotaupa> Content-Type: multipart/signed; micalg="pgp-sha1"; protocol="application/pgp-signature"; boundary="=-dzUqpcZw17GIs5V+ogKu" X-Mailer: Evolution 3.4.4-3 Mime-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6.x X-Received-From: 188.40.100.199 X-BeenThere: grub-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list Reply-To: The development of GNU GRUB List-Id: The development of GNU GRUB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Apr 2013 14:40:42 -0000 --=-dzUqpcZw17GIs5V+ogKu Content-Type: multipart/mixed; boundary="=-T9zcZBxiR2SINUMSnccE" --=-T9zcZBxiR2SINUMSnccE Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Dear GRUB folks, Am Donnerstag, den 18.04.2013, 13:11 +0200 schrieb Paul Menzel: > here is an update on the issue I only reported to #grub on > . >=20 >=20 > Am Freitag, den 05.04.2013, 12:54 +0200 schrieb Paul Menzel: >=20 > > as reported to the coreboot mailing list already [1][2], using GRUB > > (4778) as a payload [3] on the AMD SB800 based ASRock E350M1 [4], the > > SATA disk attached to the SATA controller is not found when the > > controller is in AHCI mode. Using IDE mode works. >=20 > [=E2=80=A6] >=20 > > I=E2=80=99ll gladly test patches and provide more information. >=20 > Vladmir gave me the following patch to test [5]. [=E2=80=A6] > The change to `ahci.c` did make a change and it progressed further. >=20 > grub> insmod pata > disk/pata.c:295: sectors=3D0x5a > disk/pata.c:295: sectors=3D0x5a > disk/pata.c:295: sectors=3D0xff > error: no device connected. > disk/pata.c:295: sectors=3D0xff > error: no device connected. > grub> insmod ahci > disk/ahci.c:308: Requesting AHCI ownership > disk/ahci.c:311: Waiting for BIOS to give up ownership > disk/ahci.c:322: AHCI ownership obtained > disk/ahci.c:328: AHCI is in compat mode. Switching > disk/ahci.c:374: 6 AHCI ports > disk/ahci.c:384: status 0:123 > disk/ahci.c:186: found device ahci0 (port 0) > disk/ahci.c:229: det =3D 3 > disk/ahci.c:240: link up > disk/ahci.c:246: After PORT_CMD_ST > disk/ahci.c:255: before return 0 > disk/ahci.c:384: status 1:0 > disk/ahci.c:384: status 2:0 > disk/ahci.c:384: status 3:0 > disk/ahci.c:384: status 4:0 > disk/ahci.c:384: status 5:0 > grub> ls > disk/ahci.c:710: opening AHCI dev `ahci0' > disk/ahci.c:535: AHCI tfd =3D 150 > disk/ahci.c:561: grub_ahci_read (size=3D512, cmdsize =3D 0) > disk/ahci.c:574: AHCI tfd =3D 150 > disk/ahci.c:604: cfis: 27 80 ec 00 00 00 00 e0 > disk/ahci.c:609: cfis: 00 00 00 00 00 00 00 00 > disk/ahci.c:622: PRDT =3D c7eed800, 0, 800001ff (128) > disk/ahci.c:627: AHCI command schedulded > disk/ahci.c:629: AHCI tfd =3D 150 > disk/ahci.c:633: AHCI tfd =3D 150 > disk/ahci.c:635: AHCI sig =3D 101 > disk/ahci.c:637: AHCI tfd =3D 150 > disk/ahci.c:646: AHCI status <1 0 150> > disk/ahci.c:658: AHCI command completed <1 0 150 0 0, 0 0> > disk/ahci.c:668: last PIO FIS 00000000 00000000 00000000 00000000= 00000000 > 00000000 00000000 00000000 > disk/ahci.c:678: last REG FIS 00000000 00000000 00000000 00000000= 00000000 > 00000000 00000000 00000000 > disk/pata.c:295: sectors=3D0x5a > disk/pata.c:295: sectors=3D0x5a > disk/pata.c:295: sectors=3D0xff > disk/pata.c:295: sectors=3D0xff > disk/ahci.c:710: opening AHCI dev `ahci0' > disk/ahci.c:535: AHCI tfd =3D 150 > disk/ahci.c:561: grub_ahci_read (size=3D512, cmdsize =3D 0) > disk/ahci.c:574: AHCI tfd =3D 150 > disk/ahci.c:604: cfis: 27 80 ec 00 00 00 00 e0 > disk/ahci.c:609: cfis: 00 00 00 00 00 00 00 00 > disk/ahci.c:622: PRDT =3D c7eed800, 0, 800001ff (128) > disk/ahci.c:627: AHCI command schedulded > disk/ahci.c:629: AHCI tfd =3D 150 > disk/ahci.c:633: AHCI tfd =3D 150 > disk/ahci.c:635: AHCI sig =3D 101 > disk/ahci.c:637: AHCI tfd =3D 150 > disk/ahci.c:646: AHCI status <1 0 150> > disk/ahci.c:658: AHCI command completed <1 0 150 0 0, 0 0> > disk/ahci.c:668: last PIO FIS 00000000 00000000 00000000 00000000= 00000000 > 00000000 00000000 00000000 > disk/ahci.c:678: last REG FIS 00000000 00000000 00000000 00000000= 00000000 > 00000000 00000000 00000000 > disk/pata.c:295: sectors=3D0x5a > disk/pata.c:295: sectors=3D0x5a > disk/pata.c:295: sectors=3D0xff > disk/pata.c:295: sectors=3D0xff > (memdisk) >=20 > So it gets further but still does not find the disk. >=20 > Vladimir also said, he can reproduce this issue, when putting his AMD > board=E2=80=99s SATA controller in IDE mode in the BIOS and then trying t= o > change it in GRUB to AHCI mode. Vladimir gave me another patch to try changing the reset code [6]. =3D=3D=3D modified file 'grub-core/disk/ahci.c' --- grub-core/disk/ahci.c 2010-12-25 11:11:54 +0000 +++ grub-core/disk/ahci.c 2010-12-25 15:30:53 +0000 @@ -131,7 +131,8 @@ =20 static grub_err_t=20 grub_ahci_readwrite_real (struct grub_ahci_device *dev, - struct grub_disk_ata_pass_through_parms *parms); + struct grub_disk_ata_pass_through_parms *parms, + int reset); =20 =20 enum @@ -374,9 +375,30 @@ 9 /* LBA48 mid */, 10 /* LBA48 high */ };=20 =20 +static grub_err_t +grub_ahci_reset_port (struct grub_ahci_device *dev, int force) +{ + dev->hba->ports[dev->port].sata_error =3D dev->hba->ports[dev->p= ort].sata_error; + + if (force || (dev->hba->ports[dev->port].command_issue & 1) + || (dev->hba->ports[dev->port].task_file_data & 0x80)) + { + struct grub_disk_ata_pass_through_parms parms2; + dev->hba->ports[dev->port].command &=3D ~GRUB_AHCI_HBA_PORT_= CMD_ST; + while ((dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_P= ORT_CMD_CR)); + dev->hba->ports[dev->port].command |=3D GRUB_AHCI_HBA_PORT_C= MD_ST; + while (!(dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_= PORT_CMD_CR)); + dev->hba->ports[dev->port].sata_error =3D dev->hba->ports[de= v->port].sata_error; + grub_memset (&parms2, 0, sizeof (parms2)); + parms2.taskfile.cmd =3D 8; + return grub_ahci_readwrite_real (dev, &parms2, 1); + } + return GRUB_ERR_NONE; +} + static grub_err_t=20 grub_ahci_readwrite_real (struct grub_ahci_device *dev, - struct grub_disk_ata_pass_through_parms *parms) + struct grub_disk_ata_pass_through_parms *parms, int reset) { struct grub_pci_dma_chunk *bufc; grub_uint64_t endtime; @@ -386,15 +408,8 @@ grub_dprintf ("ahci", "AHCI tfd =3D %x\n", dev->hba->ports[dev->port].task_file_data); =20 - if ((dev->hba->ports[dev->port].task_file_data & 0x80)) - { - dev->hba->ports[dev->port].command &=3D ~GRUB_AHCI_HBA_PORT_= CMD_ST; - while ((dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_P= ORT_CMD_CR)); - dev->hba->ports[dev->port].command |=3D GRUB_AHCI_HBA_PORT_C= MD_ST; - while (!(dev->hba->ports[dev->port].command & GRUB_AHCI_HBA_= PORT_CMD_CR)); - } - - dev->hba->ports[dev->port].sata_error =3D dev->hba->ports[dev->p= ort].sata_error; + if (!reset) + grub_ahci_reset_port (dev, 0); =20 grub_dprintf("ahci", "grub_ahci_read (size=3D%llu, cmdsize =3D %= llu)\n", (unsigned long long) parms->size, @@ -475,7 +490,7 @@ grub_dprintf ("ahci", "AHCI tfd =3D %x\n", dev->hba->ports[dev->port].task_file_data); =20 - endtime =3D grub_get_time_ms () + 1000; + endtime =3D grub_get_time_ms () + 10000; while ((dev->hba->ports[dev->port].command_issue & 1)) if (grub_get_time_ms () > endtime) { @@ -483,7 +498,8 @@ dev->hba->ports[dev->port].command_issue, dev->hba->ports[dev->port].intstatus, dev->hba->ports[dev->port].task_file_data); - err =3D grub_error (GRUB_ERR_IO, "AHCI transfer timeouted"); + grub_ahci_reset_port (dev, 1); + err =3D grub_error (GRUB_ERR_IO, "AHCI transfer timed out"); break; } =20 @@ -527,7 +543,7 @@ grub_ahci_readwrite (grub_ata_t disk, struct grub_disk_ata_pass_through_parms *parms) { - return grub_ahci_readwrite_real (disk->data, parms); + return grub_ahci_readwrite_real (disk->data, parms, 0); } =20 static grub_err_t It does not apply cleanly to my version and misses probably something as `grub_ahci_readwrite` was also changed but not `ata.h`. I am attaching my adapted version of `ahci.c` I tested. Here is the result. Unfortunately it hangs now. grub> insmod ahci disk/ahci.c:308: Requesting AHCI ownership disk/ahci.c:311: Waiting for BIOS to give up ownership disk/ahci.c:322: AHCI ownership obtained disk/ahci.c:328: AHCI is in compat mode. Switching disk/ahci.c:374: 6 AHCI ports disk/ahci.c:384: status 0:123 disk/ahci.c:186: found device ahci0 (port 0) disk/ahci.c:229: det =3D 3 disk/ahci.c:240: link up disk/ahci.c:246: After PORT_CMD_ST disk/ahci.c:255: before return 0 disk/ahci.c:384: status 1:0 disk/ahci.c:384: status 2:0 disk/ahci.c:384: status 3:0 disk/ahci.c:384: status 4:0 disk/ahci.c:384: status 5:0 grub> ls disk/ahci.c:713: opening AHCI dev `ahci0' disk/ahci.c:555: AHCI tfd =3D 150 disk/ahci.c:562: grub_ahci_read (size=3D512, cmdsize =3D 0) disk/ahci.c:575: AHCI tfd =3D 150 disk/ahci.c:605: cfis: 27 80 ec 00 00 00 00 e0 disk/ahci.c:610: cfis: 00 00 00 00 00 00 00 00 disk/ahci.c:623: PRDT =3D c7eedc00, 0, 800001ff (128) disk/ahci.c:628: AHCI command schedulded disk/ahci.c:630: AHCI tfd =3D 150 disk/ahci.c:634: AHCI tfd =3D 150 disk/ahci.c:636: AHCI sig =3D 101 disk/ahci.c:638: AHCI tfd =3D 150 disk/ahci.c:647: AHCI status <1 0 150> I have to reset the machine to break the hang. Hopefully I did not mess up applying the patch. If yes, it would be nice to test some branch with the latest AHCI test code. Thanks, Paul > > [1] http://www.coreboot.org/pipermail/coreboot/2013-March/075583.html > > [2] http://www.coreboot.org/pipermail/coreboot/2013-April/075592.html > > [3] http://www.coreboot.org/GRUB2 > > [4] http://www.coreboot.org/ASRock_E350M1 > [5] http://paste.debian.net/249135/ [6] http://paste.debian.net/249577/ --=-T9zcZBxiR2SINUMSnccE Content-Disposition: attachment; filename="ahci.c" Content-Type: text/x-csrc; name="ahci.c"; charset="UTF-8" Content-Transfer-Encoding: base64 LyoNCiAqICBHUlVCICAtLSAgR1JhbmQgVW5pZmllZCBCb290bG9hZGVyDQogKiAgQ29weXJpZ2h0 IChDKSAyMDA3LCAyMDA4LCAyMDA5LCAyMDEwICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIElu Yy4NCiAqDQogKiAgR1JVQiBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5DQogKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkNCiAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcg0KICogIChhdCB5 b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uDQogKg0KICogIEdSVUIgaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwNCiAqICBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZg0KICogIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUNCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLg0KICoN CiAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQ0KICogIGFsb25nIHdpdGggR1JVQi4gIElmIG5vdCwgc2VlIDxodHRwOi8v d3d3LmdudS5vcmcvbGljZW5zZXMvPi4NCiAqLw0KDQojaW5jbHVkZSA8Z3J1Yi9kbC5oPg0KI2lu Y2x1ZGUgPGdydWIvZGlzay5oPg0KI2luY2x1ZGUgPGdydWIvbW0uaD4NCiNpbmNsdWRlIDxncnVi L3RpbWUuaD4NCiNpbmNsdWRlIDxncnViL3BjaS5oPg0KI2luY2x1ZGUgPGdydWIvYXRhLmg+DQoj aW5jbHVkZSA8Z3J1Yi9zY3NpLmg+DQojaW5jbHVkZSA8Z3J1Yi9taXNjLmg+DQojaW5jbHVkZSA8 Z3J1Yi9saXN0Lmg+DQojaW5jbHVkZSA8Z3J1Yi9sb2FkZXIuaD4NCg0KR1JVQl9NT0RfTElDRU5T RSAoIkdQTHYzKyIpOw0KDQpzdHJ1Y3QgZ3J1Yl9haGNpX2NtZF9oZWFkDQp7DQogIGdydWJfdWlu dDMyX3QgY29uZmlnOw0KICBncnViX3VpbnQzMl90IHRyYW5zZmVyZWQ7DQogIGdydWJfdWludDY0 X3QgY29tbWFuZF90YWJsZV9iYXNlOw0KICBncnViX3VpbnQzMl90IHVudXNlZFs0XTsNCn07DQoN CnN0cnVjdCBncnViX2FoY2lfcHJkdF9lbnRyeQ0Kew0KICBncnViX3VpbnQ2NF90IGRhdGFfYmFz ZTsNCiAgZ3J1Yl91aW50MzJfdCB1bnVzZWQ7DQogIGdydWJfdWludDMyX3Qgc2l6ZTsNCn07DQoN CnN0cnVjdCBncnViX2FoY2lfY21kX3RhYmxlDQp7DQogIGdydWJfdWludDhfdCBjZmlzWzB4NDBd Ow0KICBncnViX3VpbnQ4X3QgY29tbWFuZFsweDEwXTsNCiAgZ3J1Yl91aW50OF90IHJlc2VydmVk WzB4MzBdOw0KICBzdHJ1Y3QgZ3J1Yl9haGNpX3ByZHRfZW50cnkgcHJkdFsxXTsNCn07DQoNCnN0 cnVjdCBncnViX2FoY2lfaGJhX3BvcnQNCnsNCiAgZ3J1Yl91aW50NjRfdCBjb21tYW5kX2xpc3Rf YmFzZTsNCiAgZ3J1Yl91aW50NjRfdCBmaXNfYmFzZTsNCiAgZ3J1Yl91aW50MzJfdCBpbnRzdGF0 dXM7DQogIGdydWJfdWludDMyX3QgaW50ZW47DQogIGdydWJfdWludDMyX3QgY29tbWFuZDsNCiAg Z3J1Yl91aW50MzJfdCB1bnVzZWQxOw0KICBncnViX3VpbnQzMl90IHRhc2tfZmlsZV9kYXRhOw0K ICBncnViX3VpbnQzMl90IHNpZzsNCiAgZ3J1Yl91aW50MzJfdCBzdGF0dXM7DQogIGdydWJfdWlu dDMyX3QgdW51c2VkMjsNCiAgZ3J1Yl91aW50MzJfdCBzYXRhX2Vycm9yOw0KICBncnViX3VpbnQz Ml90IHNhdGFfYWN0aXZlOw0KICBncnViX3VpbnQzMl90IGNvbW1hbmRfaXNzdWU7DQogIGdydWJf dWludDMyX3QgdW51c2VkMzsNCiAgZ3J1Yl91aW50MzJfdCBmYnM7DQogIGdydWJfdWludDMyX3Qg dW51c2VkNFsxNV07DQp9Ow0KDQplbnVtIGdydWJfYWhjaV9oYmFfcG9ydF9jb21tYW5kDQogIHsN CiAgICBHUlVCX0FIQ0lfSEJBX1BPUlRfQ01EX1NUICA9IDB4MDEsIC8qIFN0YXJ0ICovDQogICAg R1JVQl9BSENJX0hCQV9QT1JUX0NNRF9TVUQgPSAweDAyLCAvKiBTcGluLVVwIERldmljZSAqLw0K ICAgIEdSVUJfQUhDSV9IQkFfUE9SVF9DTURfRlJFID0gMHgxMCwgLyogRklTIFJlY2VpdmUgRW5h YmxlICovDQogICAgR1JVQl9BSENJX0hCQV9QT1JUX0NNRF9DUiA9IDB4ODAwMCwgLyogQ29tbWFu ZCBMaXN0IFJ1bm5pbmcgICovDQogICAgR1JVQl9BSENJX0hCQV9QT1JUX0NNRF9GUiA9IDB4NDAw MCwgLyogRklTIFJlY2VpdmUgUnVubmluZyAqLw0KICAgIEdSVUJfQUhDSV9IQkFfUE9SVF9TU1RT ID0gMHgyOCwgLyogMy4zLjEwIE9mZnNldCAyOGg6IFB4U1NUUyDigJMgUG9ydCB4IFNlcmlhbCBB VEEgU3RhdHVzIChTQ1IwOiBTU3RhdHVzKSAqLw0KICB9Ow0KDQpzdHJ1Y3QgZ3J1Yl9haGNpX2hi YQ0Kew0KICBncnViX3VpbnQzMl90IGNhcDsNCiAgZ3J1Yl91aW50MzJfdCBnbG9iYWxfY29udHJv bDsNCiAgZ3J1Yl91aW50MzJfdCBpbnRyX3N0YXR1czsNCiAgZ3J1Yl91aW50MzJfdCBwb3J0c19p bXBsZW1lbnRlZDsNCiAgZ3J1Yl91aW50MzJfdCB1bnVzZWQxWzZdOw0KICBncnViX3VpbnQzMl90 IGJpb3NfaGFuZG9mZjsNCiAgZ3J1Yl91aW50MzJfdCB1bnVzZWQyWzUzXTsNCiAgc3RydWN0IGdy dWJfYWhjaV9oYmFfcG9ydCBwb3J0c1szMl07DQp9Ow0KDQpzdHJ1Y3QgZ3J1Yl9haGNpX3JlY2Vp dmVkX2Zpcw0Kew0KICBjaGFyIHJhd1s0MDk2XTsNCn07DQoNCmVudW0NCiAgew0KICAgIEdSVUJf QUhDSV9IQkFfQ0FQX05QT1JUU19NQVNLID0gMHgxZg0KICB9Ow0KDQplbnVtDQogIHsNCiAgICBH UlVCX0FIQ0lfSEJBX0dMT0JBTF9DT05UUk9MX1JFU0VUID0gMHgwMDAwMDAwMSwNCiAgICBHUlVC X0FIQ0lfSEJBX0dMT0JBTF9DT05UUk9MX0lOVFJfRU4gPSAweDAwMDAwMDAyLA0KICAgIEdSVUJf QUhDSV9IQkFfR0xPQkFMX0NPTlRST0xfQUhDSV9FTiA9IDB4ODAwMDAwMDAsDQogIH07DQoNCmVu dW0NCiAgew0KICAgIEdSVUJfQUhDSV9CSU9TX0hBTkRPRkZfQklPU19PV05FRCA9IDEsDQogICAg R1JVQl9BSENJX0JJT1NfSEFORE9GRl9PU19PV05FRCA9IDIsDQogICAgR1JVQl9BSENJX0JJT1Nf SEFORE9GRl9PU19PV05FUlNISVBfQ0hBTkdFRCA9IDgsDQogICAgR1JVQl9BSENJX0JJT1NfSEFO RE9GRl9SV0MgPSA4DQogIH07DQoNCg0Kc3RydWN0IGdydWJfYWhjaV9kZXZpY2UNCnsNCiAgc3Ry dWN0IGdydWJfYWhjaV9kZXZpY2UgKm5leHQ7DQogIHN0cnVjdCBncnViX2FoY2lfZGV2aWNlICoq cHJldjsNCiAgdm9sYXRpbGUgc3RydWN0IGdydWJfYWhjaV9oYmEgKmhiYTsNCiAgaW50IHBvcnQ7 DQogIGludCBudW07DQogIHN0cnVjdCBncnViX3BjaV9kbWFfY2h1bmsgKmNvbW1hbmRfbGlzdF9j aHVuazsNCiAgdm9sYXRpbGUgc3RydWN0IGdydWJfYWhjaV9jbWRfaGVhZCAqY29tbWFuZF9saXN0 Ow0KICBzdHJ1Y3QgZ3J1Yl9wY2lfZG1hX2NodW5rICpjb21tYW5kX3RhYmxlX2NodW5rOw0KICB2 b2xhdGlsZSBzdHJ1Y3QgZ3J1Yl9haGNpX2NtZF90YWJsZSAqY29tbWFuZF90YWJsZTsNCiAgc3Ry dWN0IGdydWJfcGNpX2RtYV9jaHVuayAqcmZpczsNCiAgaW50IHByZXNlbnQ7DQp9Ow0KDQpzdGF0 aWMgZ3J1Yl9lcnJfdCANCmdydWJfYWhjaV9yZWFkd3JpdGVfcmVhbCAoc3RydWN0IGdydWJfYWhj aV9kZXZpY2UgKmRldiwNCgkJCSAgc3RydWN0IGdydWJfZGlza19hdGFfcGFzc190aHJvdWdoX3Bh cm1zICpwYXJtcywNCgkJCSAgaW50IHJlc2V0KTsNCg0KDQplbnVtDQogIHsNCiAgICBHUlVCX0FI Q0lfQ09ORklHX1JFQUQgPSAwLA0KICAgIEdSVUJfQUhDSV9DT05GSUdfQ0ZJU19MRU5HVEhfTUFT SyA9IDB4MWYsDQogICAgR1JVQl9BSENJX0NPTkZJR19BVEFQSSA9IDB4MjAsDQogICAgR1JVQl9B SENJX0NPTkZJR19XUklURSA9IDB4NDAsDQogICAgR1JVQl9BSENJX0NPTkZJR19QUkVGRVRDSCA9 IDB4ODAsDQogICAgR1JVQl9BSENJX0NPTkZJR19SRVNFVCA9IDB4MTAwLA0KICAgIEdSVUJfQUhD SV9DT05GSUdfQklTVCA9IDB4MjAwLA0KICAgIEdSVUJfQUhDSV9DT05GSUdfQ0xFQVJfUl9PSyA9 IDB4NDAwLA0KICAgIEdSVUJfQUhDSV9DT05GSUdfUE1QX01BU0sgPSAweGYwMDAsDQogICAgR1JV Ql9BSENJX0NPTkZJR19QUkRUX0xFTkdUSF9NQVNLID0gMHhmZmZmMDAwMCwNCiAgfTsNCiNkZWZp bmUgR1JVQl9BSENJX0NPTkZJR19DRklTX0xFTkdUSF9TSElGVCAwDQojZGVmaW5lIEdSVUJfQUhD SV9DT05GSUdfUE1QX1NISUZUIDEyDQojZGVmaW5lIEdSVUJfQUhDSV9DT05GSUdfUFJEVF9MRU5H VEhfU0hJRlQgMTYNCiNkZWZpbmUgR1JVQl9BSENJX0lOVEVSUlVQVF9PTl9DT01QTEVURSAweDgw MDAwMDAwDQoNCiNkZWZpbmUgR1JVQl9BSENJX1BSRFRfTUFYX0NIVU5LX0xFTkdUSCAweDIwMDAw MA0KDQpzdGF0aWMgc3RydWN0IGdydWJfYWhjaV9kZXZpY2UgKmdydWJfYWhjaV9kZXZpY2VzOw0K c3RhdGljIGludCBudW1kZXZzOw0KDQpzdGF0aWMgaW50IA0KaW5pdF9wb3J0IChzdHJ1Y3QgZ3J1 Yl9haGNpX2RldmljZSAqZGV2KQ0Kew0KICBzdHJ1Y3QgZ3J1Yl9wY2lfZG1hX2NodW5rICpjb21t YW5kX2xpc3Q7DQogIHN0cnVjdCBncnViX3BjaV9kbWFfY2h1bmsgKmNvbW1hbmRfdGFibGU7DQog IGdydWJfdWludDY0X3QgZW5kdGltZTsNCg0KICBjb21tYW5kX2xpc3QgPSBncnViX21lbWFsaWdu X2RtYTMyICgxMDI0LCBzaXplb2YgKHN0cnVjdCBncnViX2FoY2lfY21kX2hlYWQpKTsNCiAgaWYg KCFjb21tYW5kX2xpc3QpDQogICAgcmV0dXJuIDE7DQoNCiAgY29tbWFuZF90YWJsZSA9IGdydWJf bWVtYWxpZ25fZG1hMzIgKDEwMjQsDQoJCQkJICAgICAgIHNpemVvZiAoc3RydWN0IGdydWJfYWhj aV9jbWRfdGFibGUpKTsNCiAgaWYgKCFjb21tYW5kX3RhYmxlKQ0KICAgIHsNCiAgICAgIGdydWJf ZG1hX2ZyZWUgKGNvbW1hbmRfbGlzdCk7DQogICAgICByZXR1cm4gMTsNCiAgICB9DQoNCiAgZ3J1 Yl9kcHJpbnRmICgiYWhjaSIsICJmb3VuZCBkZXZpY2UgYWhjaSVkIChwb3J0ICVkKVxuIiwgZGV2 LT5udW0sIGRldi0+cG9ydCk7DQoNCiAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFu ZCAmPSB+R1JVQl9BSENJX0hCQV9QT1JUX0NNRF9GUkU7DQogIGVuZHRpbWUgPSBncnViX2dldF90 aW1lX21zICgpICsgMTAwMDsNCiAgd2hpbGUgKChkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5j b21tYW5kICYgR1JVQl9BSENJX0hCQV9QT1JUX0NNRF9GUikpDQogICAgaWYgKGdydWJfZ2V0X3Rp bWVfbXMgKCkgPiBlbmR0aW1lKQ0KICAgICAgew0KCWdydWJfZHByaW50ZiAoImFoY2kiLCAiY291 bGRuJ3Qgc3RvcCBGUlxuIik7DQoJZ290byBvdXQ7DQogICAgICB9DQoNCiAgZGV2LT5oYmEtPnBv cnRzW2Rldi0+cG9ydF0uY29tbWFuZCAmPSB+R1JVQl9BSENJX0hCQV9QT1JUX0NNRF9TVDsNCiAg ZW5kdGltZSA9IGdydWJfZ2V0X3RpbWVfbXMgKCkgKyAxMDAwOw0KICB3aGlsZSAoKGRldi0+aGJh LT5wb3J0c1tkZXYtPnBvcnRdLmNvbW1hbmQgJiBHUlVCX0FIQ0lfSEJBX1BPUlRfQ01EX0NSKSkN CiAgICBpZiAoZ3J1Yl9nZXRfdGltZV9tcyAoKSA+IGVuZHRpbWUpDQogICAgICB7DQoJZ3J1Yl9k cHJpbnRmICgiYWhjaSIsICJjb3VsZG4ndCBzdG9wIENSXG4iKTsNCglnb3RvIG91dDsNCiAgICAg IH0NCg0KICBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5mYnMgPSAyOw0KDQogIGRldi0+cmZp cyA9IGdydWJfbWVtYWxpZ25fZG1hMzIgKDQwOTYsIA0KCQkJCSAgIHNpemVvZiAoc3RydWN0IGdy dWJfYWhjaV9yZWNlaXZlZF9maXMpKTsNCiAgZ3J1Yl9tZW1zZXQgKChjaGFyICopIGdydWJfZG1h X2dldF92aXJ0IChkZXYtPnJmaXMpLCAwLA0KCSAgICAgICBzaXplb2YgKHN0cnVjdCBncnViX2Fo Y2lfcmVjZWl2ZWRfZmlzKSk7DQogIGRldi0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLmZpc19iYXNl ID0gZ3J1Yl9kbWFfZ2V0X3BoeXMgKGRldi0+cmZpcyk7DQogIGRldi0+aGJhLT5wb3J0c1tkZXYt PnBvcnRdLmNvbW1hbmRfbGlzdF9iYXNlDQogICAgPSBncnViX2RtYV9nZXRfcGh5cyAoY29tbWFu ZF9saXN0KTsNCiAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFuZCB8PSBHUlVCX0FI Q0lfSEJBX1BPUlRfQ01EX0ZSRTsNCiAgd2hpbGUgKCEoZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9y dF0uY29tbWFuZCAmIEdSVUJfQUhDSV9IQkFfUE9SVF9DTURfRlIpKQ0KICAgIGlmIChncnViX2dl dF90aW1lX21zICgpID4gZW5kdGltZSkNCiAgICAgIHsNCglncnViX2RwcmludGYgKCJhaGNpIiwg ImNvdWxkbid0IHN0YXJ0IEZSXG4iKTsNCglkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21t YW5kICY9IH5HUlVCX0FIQ0lfSEJBX1BPUlRfQ01EX0ZSRTsNCglnb3RvIG91dDsNCiAgICAgIH0N Cg0KICAvKiBTcGluIHRoZSBkZXZpY2UgdXAgKi8NCiAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9y dF0uY29tbWFuZCB8PSBHUlVCX0FIQ0lfSEJBX1BPUlRfQ01EX1NVRDsNCiAgd2hpbGUgKDEpDQog ICAgew0KICAgICAgaW50IGRldCA9IGRldi0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLnN0YXR1cyAm IDc7DQogICAgICBncnViX2RwcmludGYgKCJhaGNpIiwgImRldCA9ICVkXG4iLCBkZXQpOw0KICAg ICAgaWYgKGRldCA9PSAxIHx8IGRldCA9PSAzKQ0KCWJyZWFrOw0KICAgICAgaWYgKGdydWJfZ2V0 X3RpbWVfbXMgKCkgPiBlbmR0aW1lKQ0KCXsNCgkgIGdydWJfZHByaW50ZiAoImFoY2kiLCAiY291 bGRuJ3Qgc3Bpbi11cFxuIik7DQoJICBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21tYW5k ICY9IH5HUlVCX0FIQ0lfSEJBX1BPUlRfQ01EX0NSOw0KCSAgZ290byBvdXRfc3RvcF9mcjsNCgl9 DQogICAgfQ0KDQogIGdydWJfZHByaW50ZiAoImFoY2kiLCAibGluayB1cFxuIik7DQoNCiAgZGV2 LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFuZA0KICAgID0gKGRldi0+aGJhLT5wb3J0c1tk ZXYtPnBvcnRdLmNvbW1hbmQgJiAweDBmZmZmZmZmKSB8ICgxIDw8IDI4KSB8IDIgfCA0Ow0KDQog IGRldi0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLmNvbW1hbmQgfD0gR1JVQl9BSENJX0hCQV9QT1JU X0NNRF9TVDsNCiAgZ3J1Yl9kcHJpbnRmICgiYWhjaSIsICJBZnRlciBQT1JUX0NNRF9TVFxuIik7 DQoNCiAgZGV2LT5jb21tYW5kX2xpc3RfY2h1bmsgPSBjb21tYW5kX2xpc3Q7DQogIGRldi0+Y29t bWFuZF9saXN0ID0gZ3J1Yl9kbWFfZ2V0X3ZpcnQgKGNvbW1hbmRfbGlzdCk7DQogIGRldi0+Y29t bWFuZF90YWJsZV9jaHVuayA9IGNvbW1hbmRfdGFibGU7DQogIGRldi0+Y29tbWFuZF90YWJsZSA9 IGdydWJfZG1hX2dldF92aXJ0IChjb21tYW5kX3RhYmxlKTsNCiAgZGV2LT5jb21tYW5kX2xpc3Qt PmNvbW1hbmRfdGFibGVfYmFzZQ0KICAgID0gZ3J1Yl9kbWFfZ2V0X3BoeXMgKGNvbW1hbmRfdGFi bGUpOw0KDQogIGdydWJfZHByaW50ZiAoImFoY2kiLCAiYmVmb3JlIHJldHVybiAwXG4iKTsNCg0K ICByZXR1cm4gMDsNCiBvdXRfc3RvcF9mcjoNCiAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0u Y29tbWFuZCAmPSB+R1JVQl9BSENJX0hCQV9QT1JUX0NNRF9GUkU7DQogIGVuZHRpbWUgPSBncnVi X2dldF90aW1lX21zICgpICsgMTAwMDsNCiAgd2hpbGUgKChkZXYtPmhiYS0+cG9ydHNbZGV2LT5w b3J0XS5jb21tYW5kICYgR1JVQl9BSENJX0hCQV9QT1JUX0NNRF9GUikpDQogICAgaWYgKGdydWJf Z2V0X3RpbWVfbXMgKCkgPiBlbmR0aW1lKQ0KICAgICAgew0KCWdydWJfZHByaW50ZiAoImFoY2ki LCAiY291bGRuJ3Qgc3RvcCBGUlxuIik7DQoJYnJlYWs7DQogICAgICB9DQogb3V0Og0KICBncnVi X2RtYV9mcmVlIChjb21tYW5kX2xpc3QpOw0KICBncnViX2RtYV9mcmVlIChjb21tYW5kX3RhYmxl KTsNCiAgZ3J1Yl9kbWFfZnJlZSAoZGV2LT5yZmlzKTsNCiAgcmV0dXJuIDE7DQp9DQoNCnN0YXRp YyBpbnQNCmdydWJfYWhjaV9wY2lpbml0IChncnViX3BjaV9kZXZpY2VfdCBkZXYsDQoJCSAgIGdy dWJfcGNpX2lkX3QgcGNpaWQgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpLA0KCQkgICB2b2lkICpk YXRhIF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKSkNCnsNCiAgZ3J1Yl9wY2lfYWRkcmVzc190IGFk ZHI7DQogIGdydWJfdWludDMyX3QgY2xhc3M7DQogIGdydWJfdWludDMyX3QgYmFyOw0KICB1bnNp Z25lZCBpLCBucG9ydHM7DQogIHZvbGF0aWxlIHN0cnVjdCBncnViX2FoY2lfaGJhICpoYmE7DQoN CiAgLyogUmVhZCBjbGFzcy4gICovDQogIGFkZHIgPSBncnViX3BjaV9tYWtlX2FkZHJlc3MgKGRl diwgR1JVQl9QQ0lfUkVHX0NMQVNTKTsNCiAgY2xhc3MgPSBncnViX3BjaV9yZWFkIChhZGRyKTsN Cg0KICAvKiBDaGVjayBpZiB0aGlzIGNsYXNzIElEIG1hdGNoZXMgdGhhdCBvZiBhIFBDSSBJREUg Q29udHJvbGxlci4gICovDQogIGlmIChjbGFzcyA+PiA4ICE9IDB4MDEwNjAxKQ0KICAgIHJldHVy biAwOw0KDQogIGFkZHIgPSBncnViX3BjaV9tYWtlX2FkZHJlc3MgKGRldiwgR1JVQl9QQ0lfUkVH X0FERFJFU1NfUkVHNSk7DQogIGJhciA9IGdydWJfcGNpX3JlYWQgKGFkZHIpOw0KDQogIGlmICgo YmFyICYgKEdSVUJfUENJX0FERFJfU1BBQ0VfTUFTSyB8IEdSVUJfUENJX0FERFJfTUVNX1RZUEVf TUFTSw0KCSAgICAgIHwgR1JVQl9QQ0lfQUREUl9NRU1fUFJFRkVUQ0gpKQ0KICAgICAgIT0gKEdS VUJfUENJX0FERFJfU1BBQ0VfTUVNT1JZIHwgR1JVQl9QQ0lfQUREUl9NRU1fVFlQRV8zMikpDQog ICAgcmV0dXJuIDA7DQoNCiAgaGJhID0gZ3J1Yl9wY2lfZGV2aWNlX21hcF9yYW5nZSAoZGV2LCBi YXIgJiBHUlVCX1BDSV9BRERSX01FTV9NQVNLLA0KCQkJCSAgIHNpemVvZiAoaGJhKSk7DQoNCiAg aWYgKCEgKGhiYS0+Ymlvc19oYW5kb2ZmICYgR1JVQl9BSENJX0JJT1NfSEFORE9GRl9PU19PV05F RCkpDQogICAgew0KICAgICAgZ3J1Yl91aW50NjRfdCBlbmR0aW1lOw0KDQogICAgICBncnViX2Rw cmludGYgKCJhaGNpIiwgIlJlcXVlc3RpbmcgQUhDSSBvd25lcnNoaXBcbiIpOw0KICAgICAgaGJh LT5iaW9zX2hhbmRvZmYgPSAoaGJhLT5iaW9zX2hhbmRvZmYgJiB+R1JVQl9BSENJX0JJT1NfSEFO RE9GRl9SV0MpDQoJfCBHUlVCX0FIQ0lfQklPU19IQU5ET0ZGX09TX09XTkVEOw0KICAgICAgZ3J1 Yl9kcHJpbnRmICgiYWhjaSIsICJXYWl0aW5nIGZvciBCSU9TIHRvIGdpdmUgdXAgb3duZXJzaGlw XG4iKTsNCiAgICAgIGVuZHRpbWUgPSBncnViX2dldF90aW1lX21zICgpICsgMTAwMDsNCiAgICAg IHdoaWxlICgoaGJhLT5iaW9zX2hhbmRvZmYgJiBHUlVCX0FIQ0lfQklPU19IQU5ET0ZGX0JJT1Nf T1dORUQpDQoJICAgICAmJiBncnViX2dldF90aW1lX21zICgpIDwgZW5kdGltZSk7DQogICAgICBp ZiAoaGJhLT5iaW9zX2hhbmRvZmYgJiBHUlVCX0FIQ0lfQklPU19IQU5ET0ZGX0JJT1NfT1dORUQp DQoJew0KCSAgZ3J1Yl9kcHJpbnRmICgiYWhjaSIsICJGb3JjaWJseSB0YWtpbmcgb3duZXJzaGlw XG4iKTsNCgkgIGhiYS0+Ymlvc19oYW5kb2ZmID0gR1JVQl9BSENJX0JJT1NfSEFORE9GRl9PU19P V05FRDsNCgkgIGhiYS0+Ymlvc19oYW5kb2ZmIHw9IEdSVUJfQUhDSV9CSU9TX0hBTkRPRkZfT1Nf T1dORVJTSElQX0NIQU5HRUQ7DQoJfQ0KICAgICAgZWxzZQ0KCWdydWJfZHByaW50ZiAoImFoY2ki LCAiQUhDSSBvd25lcnNoaXAgb2J0YWluZWRcbiIpOw0KICAgIH0NCiAgZWxzZQ0KICAgIGdydWJf ZHByaW50ZiAoImFoY2kiLCAiQUhDSSBpcyBhbHJlYWR5IGluIE9TIG1vZGVcbiIpOw0KDQogIGlm ICghKGhiYS0+Z2xvYmFsX2NvbnRyb2wgJiBHUlVCX0FIQ0lfSEJBX0dMT0JBTF9DT05UUk9MX0FI Q0lfRU4pKQ0KICAgIGdydWJfZHByaW50ZiAoImFoY2kiLCAiQUhDSSBpcyBpbiBjb21wYXQgbW9k ZS4gU3dpdGNoaW5nXG4iKTsNCiAgZWxzZQ0KICAgIGdydWJfZHByaW50ZiAoImFoY2kiLCAiQUhD SSBpcyBpbiBBSENJIG1vZGUuXG4iKTsNCg0KICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQ0KICAg IHsNCiAgICAgIGhiYS0+Z2xvYmFsX2NvbnRyb2wgfD0gR1JVQl9BSENJX0hCQV9HTE9CQUxfQ09O VFJPTF9BSENJX0VOOw0KICAgICAgZ3J1Yl9taWxsaXNsZWVwICgxKTsNCiAgICAgIGlmIChoYmEt Pmdsb2JhbF9jb250cm9sICYgR1JVQl9BSENJX0hCQV9HTE9CQUxfQ09OVFJPTF9BSENJX0VOKQ0K CWJyZWFrOw0KICAgIH0NCiAgaWYgKGkgPT0gNSkNCiAgICB7DQogICAgICBncnViX2RwcmludGYg KCJhaGNpIiwgIkNvdWxkbid0IHB1dCBBSENJIGluIEFIQ0kgbW9kZVxuIik7DQogICAgICByZXR1 cm4gMDsNCiAgICB9DQoNCiAgLyoNCiAgew0KICAgICAgZ3J1Yl91aW50NjRfdCBlbmR0aW1lOw0K ICAgICAgaGJhLT5nbG9iYWxfY29udHJvbCB8PSAxOw0KICAgICAgZW5kdGltZSA9IGdydWJfZ2V0 X3RpbWVfbXMgKCkgKyAxMDAwOw0KICAgICAgd2hpbGUgKGhiYS0+Z2xvYmFsX2NvbnRyb2wgJiAx KQ0KCWlmIChncnViX2dldF90aW1lX21zICgpID4gZW5kdGltZSkNCgkgIHsNCgkgICAgZ3J1Yl9k cHJpbnRmICgiYWhjaSIsICJjb3VsZG4ndCByZXNldCBBSENJXG4iKTsNCgkgICAgcmV0dXJuIDA7 DQoJICB9DQogIH0NCg0KICBmb3IgKGkgPSAwOyBpIDwgNTsgaSsrKQ0KICAgIHsNCiAgICAgIGhi YS0+Z2xvYmFsX2NvbnRyb2wgfD0gR1JVQl9BSENJX0hCQV9HTE9CQUxfQ09OVFJPTF9BSENJX0VO Ow0KICAgICAgZ3J1Yl9taWxsaXNsZWVwICgxKTsNCiAgICAgIGlmIChoYmEtPmdsb2JhbF9jb250 cm9sICYgR1JVQl9BSENJX0hCQV9HTE9CQUxfQ09OVFJPTF9BSENJX0VOKQ0KCWJyZWFrOw0KICAg IH0NCiAgaWYgKGkgPT0gNSkNCiAgICB7DQogICAgICBncnViX2RwcmludGYgKCJhaGNpIiwgIkNv dWxkbid0IHB1dCBBSENJIGluIEFIQ0kgbW9kZVxuIik7DQogICAgICByZXR1cm4gMDsNCiAgICB9 DQogICovDQoNCiAgbnBvcnRzID0gKGhiYS0+Y2FwICYgR1JVQl9BSENJX0hCQV9DQVBfTlBPUlRT X01BU0spICsgMTsNCg0KICBncnViX2RwcmludGYgKCJhaGNpIiwgIiVkIEFIQ0kgcG9ydHNcbiIs IG5wb3J0cyk7DQoNCiAgZm9yIChpID0gMDsgaSA8IG5wb3J0czsgaSsrKQ0KICAgIHsNCiAgICAg IHN0cnVjdCBncnViX2FoY2lfZGV2aWNlICphZGV2Ow0KICAgICAgZ3J1Yl91aW50MzJfdCBzdDsN Cg0KICAgICAgaWYgKCEoaGJhLT5wb3J0c19pbXBsZW1lbnRlZCAmICgxIDw8IGkpKSkNCgljb250 aW51ZTsNCg0KICAgICAgZ3J1Yl9kcHJpbnRmICgiYWhjaSIsICJzdGF0dXMgJWQ6JXhcbiIsIGks IGhiYS0+cG9ydHNbaV0uc3RhdHVzKTsNCiAgICAgIC8qIEZJWE1FOiBzdXBwb3J0IGhvdHBsdWdn aW5nLiAgKi8NCiAgICAgIHN0ID0gaGJhLT5wb3J0c1tpXS5zdGF0dXM7DQogICAgICBpZiAoKHN0 ICYgMHhmKSAhPSAweDMgJiYgKHN0ICYgMHhmKSAhPSAweDEpDQoJY29udGludWU7DQoNCiAgICAg IGFkZXYgPSBncnViX21hbGxvYyAoc2l6ZW9mICgqYWRldikpOw0KICAgICAgaWYgKCFhZGV2KQ0K CXJldHVybiAxOw0KDQogICAgICBhZGV2LT5oYmEgPSBoYmE7DQogICAgICBhZGV2LT5wb3J0ID0g aTsNCiAgICAgIGFkZXYtPnByZXNlbnQgPSAxOw0KICAgICAgYWRldi0+bnVtID0gbnVtZGV2cysr Ow0KDQogICAgICBpZiAoaW5pdF9wb3J0IChhZGV2KSkNCgl7DQoJICBncnViX2ZyZWUgKGFkZXYp Ow0KCSAgcmV0dXJuIDE7DQoJfQ0KDQogICAgICBncnViX2xpc3RfcHVzaCAoR1JVQl9BU19MSVNU X1AgKCZncnViX2FoY2lfZGV2aWNlcyksDQoJCSAgICAgIEdSVUJfQVNfTElTVCAoYWRldikpOw0K ICAgIH0NCg0KICByZXR1cm4gMDsNCn0NCg0Kc3RhdGljIGdydWJfZXJyX3QNCmdydWJfYWhjaV9p bml0aWFsaXplICh2b2lkKQ0Kew0KICBncnViX3BjaV9pdGVyYXRlIChncnViX2FoY2lfcGNpaW5p dCwgTlVMTCk7DQogIHJldHVybiBncnViX2Vycm5vOw0KfQ0KDQpzdGF0aWMgZ3J1Yl9lcnJfdA0K Z3J1Yl9haGNpX2ZpbmlfaHcgKGludCBub3JldHVybiBfX2F0dHJpYnV0ZV9fICgodW51c2VkKSkp DQp7DQogIHN0cnVjdCBncnViX2FoY2lfZGV2aWNlICpkZXY7DQoNCiAgZm9yIChkZXYgPSBncnVi X2FoY2lfZGV2aWNlczsgZGV2OyBkZXYgPSBkZXYtPm5leHQpDQogICAgew0KICAgICAgZ3J1Yl91 aW50NjRfdCBlbmR0aW1lOw0KDQogICAgICBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21t YW5kICY9IH5HUlVCX0FIQ0lfSEJBX1BPUlRfQ01EX0ZSRTsNCiAgICAgIGVuZHRpbWUgPSBncnVi X2dldF90aW1lX21zICgpICsgMTAwMDsNCiAgICAgIHdoaWxlICgoZGV2LT5oYmEtPnBvcnRzW2Rl di0+cG9ydF0uY29tbWFuZCAmIEdSVUJfQUhDSV9IQkFfUE9SVF9DTURfRlIpKQ0KCWlmIChncnVi X2dldF90aW1lX21zICgpID4gZW5kdGltZSkNCgkgIHsNCgkgICAgZ3J1Yl9kcHJpbnRmICgiYWhj aSIsICJjb3VsZG4ndCBzdG9wIEZSXG4iKTsNCgkgICAgYnJlYWs7DQoJICB9DQoNCiAgICAgIGRl di0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLmNvbW1hbmQgJj0gfkdSVUJfQUhDSV9IQkFfUE9SVF9D TURfU1Q7DQogICAgICBlbmR0aW1lID0gZ3J1Yl9nZXRfdGltZV9tcyAoKSArIDEwMDA7DQogICAg ICB3aGlsZSAoKGRldi0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLmNvbW1hbmQgJiBHUlVCX0FIQ0lf SEJBX1BPUlRfQ01EX0NSKSkNCglpZiAoZ3J1Yl9nZXRfdGltZV9tcyAoKSA+IGVuZHRpbWUpDQoJ ICB7DQoJICAgIGdydWJfZHByaW50ZiAoImFoY2kiLCAiY291bGRuJ3Qgc3RvcCBDUlxuIik7DQoJ ICAgIGJyZWFrOw0KCSAgfQ0KICAgICAgZ3J1Yl9kbWFfZnJlZSAoZGV2LT5jb21tYW5kX2xpc3Rf Y2h1bmspOw0KICAgICAgZ3J1Yl9kbWFfZnJlZSAoZGV2LT5jb21tYW5kX3RhYmxlX2NodW5rKTsN CiAgICAgIGdydWJfZG1hX2ZyZWUgKGRldi0+cmZpcyk7DQogICAgICBkZXYtPmNvbW1hbmRfbGlz dF9jaHVuayA9IE5VTEw7DQogICAgICBkZXYtPmNvbW1hbmRfdGFibGVfY2h1bmsgPSBOVUxMOw0K ICAgICAgZGV2LT5yZmlzID0gTlVMTDsNCiAgICB9DQogIHJldHVybiBHUlVCX0VSUl9OT05FOw0K fQ0KDQpzdGF0aWMgZ3J1Yl9lcnJfdA0KZ3J1Yl9haGNpX3Jlc3RvcmVfaHcgKHZvaWQpDQp7DQog IHN0cnVjdCBncnViX2FoY2lfZGV2aWNlICoqcGRldjsNCg0KICBmb3IgKHBkZXYgPSAmZ3J1Yl9h aGNpX2RldmljZXM7ICpwZGV2OyBwZGV2ID0gJigoKnBkZXYpLT5uZXh0KSkNCiAgICBpZiAoaW5p dF9wb3J0ICgqcGRldikpDQogICAgICB7DQoJc3RydWN0IGdydWJfYWhjaV9kZXZpY2UgKm9kZXY7 DQoJb2RldiA9ICpwZGV2Ow0KCSpwZGV2ID0gKCpwZGV2KS0+bmV4dDsNCglncnViX2ZyZWUgKG9k ZXYpOw0KICAgICAgfQ0KICByZXR1cm4gR1JVQl9FUlJfTk9ORTsNCn0NCg0KDQoMDQoNCnN0YXRp YyBpbnQNCmdydWJfYWhjaV9pdGVyYXRlIChncnViX2F0YV9kZXZfaXRlcmF0ZV9ob29rX3QgaG9v aywgdm9pZCAqaG9va19kYXRhLA0KCQkgICBncnViX2Rpc2tfcHVsbF90IHB1bGwpDQp7DQogIHN0 cnVjdCBncnViX2FoY2lfZGV2aWNlICpkZXY7DQoNCiAgaWYgKHB1bGwgIT0gR1JVQl9ESVNLX1BV TExfTk9ORSkNCiAgICByZXR1cm4gMDsNCg0KICBGT1JfTElTVF9FTEVNRU5UUyhkZXYsIGdydWJf YWhjaV9kZXZpY2VzKQ0KICAgIGlmIChob29rIChHUlVCX1NDU0lfU1VCU1lTVEVNX0FIQ0ksIGRl di0+bnVtLCBob29rX2RhdGEpKQ0KICAgICAgcmV0dXJuIDE7DQoNCiAgcmV0dXJuIDA7DQp9DQoN CiNpZiAwDQpzdGF0aWMgaW50DQpmaW5kX2ZyZWVfY21kX3Nsb3QgKHN0cnVjdCBncnViX2FoY2lf ZGV2aWNlICpkZXYpDQp7DQogIGludCBpOw0KICBmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykNCiAg ICB7DQogICAgICBpZiAoZGV2LT5oZGEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFuZF9pc3N1ZSAm ICgxIDw8IGkpKQ0KCWNvbnRpbnVlOw0KICAgICAgaWYgKGRldi0+aGRhLT5wb3J0c1tkZXYtPnBv cnRdLnNhdGFfYWN0aXZlICYgKDEgPDwgaSkpDQoJY29udGludWU7DQogICAgICByZXR1cm4gaTsN CiAgICB9DQogIHJldHVybiAtMTsNCn0NCiNlbmRpZg0KDQplbnVtDQogIHsNCiAgICBHUlVCX0FI Q0lfRklTX1JFR19IMkQgPSAweDI3DQogIH07DQoNCnN0YXRpYyBjb25zdCBpbnQgcmVnaXN0ZXJf bWFwWzExXSA9IHsgMyAvKiBGZWF0dXJlcyAqLywNCgkJCQkgICAgICAxMiAvKiBTZWN0b3JzICov LA0KCQkJCSAgICAgIDQgLyogTEJBIGxvdyAqLywNCgkJCQkgICAgICA1IC8qIExCQSBtaWQgKi8s DQoJCQkJICAgICAgNiAvKiBMQkEgaGlnaCAqLywNCgkJCQkgICAgICA3IC8qIERldmljZSAqLywN CgkJCQkgICAgICAyIC8qIENNRCByZWdpc3RlciAqLywNCgkJCQkgICAgICAxMyAvKiBTZWN0b3Jz IDQ4ICAqLywNCgkJCQkgICAgICA4IC8qIExCQTQ4IGxvdyAqLywNCgkJCQkgICAgICA5IC8qIExC QTQ4IG1pZCAqLywNCgkJCQkgICAgICAxMCAvKiBMQkE0OCBoaWdoICovIH07IA0KDQpzdGF0aWMg Z3J1Yl9lcnJfdA0KZ3J1Yl9haGNpX3Jlc2V0X3BvcnQgKHN0cnVjdCBncnViX2FoY2lfZGV2aWNl ICpkZXYsIGludCBmb3JjZSkNCnsNCiAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uc2F0YV9l cnJvciA9IGRldi0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLnNhdGFfZXJyb3I7DQoNCiAgaWYgKGZv cmNlIHx8IChkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21tYW5kX2lzc3VlICYgMSkNCiAg ICAgIHx8IChkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS50YXNrX2ZpbGVfZGF0YSAmIDB4ODAp KQ0KICAgIHsNCiAgICAgIHN0cnVjdCBncnViX2Rpc2tfYXRhX3Bhc3NfdGhyb3VnaF9wYXJtcyBw YXJtczI7DQogICAgICBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21tYW5kICY9IH5HUlVC X0FIQ0lfSEJBX1BPUlRfQ01EX1NUOw0KICAgICAgd2hpbGUgKChkZXYtPmhiYS0+cG9ydHNbZGV2 LT5wb3J0XS5jb21tYW5kICYgR1JVQl9BSENJX0hCQV9QT1JUX0NNRF9DUikpOw0KICAgICAgZGV2 LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFuZCB8PSBHUlVCX0FIQ0lfSEJBX1BPUlRfQ01E X1NUOw0KICAgICAgd2hpbGUgKCEoZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFuZCAm IEdSVUJfQUhDSV9IQkFfUE9SVF9DTURfQ1IpKTsNCiAgICAgIGRldi0+aGJhLT5wb3J0c1tkZXYt PnBvcnRdLnNhdGFfZXJyb3IgPSBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5zYXRhX2Vycm9y Ow0KICAgICAgZ3J1Yl9tZW1zZXQgKCZwYXJtczIsIDAsIHNpemVvZiAocGFybXMyKSk7DQogICAg ICBwYXJtczIudGFza2ZpbGUuY21kID0gODsNCiAgICAgIHJldHVybiBncnViX2FoY2lfcmVhZHdy aXRlX3JlYWwgKGRldiwgJnBhcm1zMiwgMSk7DQogICAgfQ0KICByZXR1cm4gR1JVQl9FUlJfTk9O RTsNCn0NCg0Kc3RhdGljIGdydWJfZXJyX3QgDQpncnViX2FoY2lfcmVhZHdyaXRlX3JlYWwgKHN0 cnVjdCBncnViX2FoY2lfZGV2aWNlICpkZXYsDQoJCQkgIHN0cnVjdCBncnViX2Rpc2tfYXRhX3Bh c3NfdGhyb3VnaF9wYXJtcyAqcGFybXMsIGludCByZXNldCkNCnsNCiAgc3RydWN0IGdydWJfcGNp X2RtYV9jaHVuayAqYnVmYzsNCiAgZ3J1Yl91aW50NjRfdCBlbmR0aW1lOw0KICB1bnNpZ25lZCBp Ow0KICBncnViX2Vycl90IGVyciA9IEdSVUJfRVJSX05PTkU7DQoNCiAgZ3J1Yl9kcHJpbnRmICgi YWhjaSIsICJBSENJIHRmZCA9ICV4XG4iLA0KCQlkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS50 YXNrX2ZpbGVfZGF0YSk7DQoNCiAgaWYgKCFyZXNldCkNCiAgICBncnViX2FoY2lfcmVzZXRfcG9y dCAoZGV2LCAwKTsNCg0KICBncnViX2RwcmludGYoImFoY2kiLCAiZ3J1Yl9haGNpX3JlYWQgKHNp emU9JWxsdSwgY21kc2l6ZSA9ICVsbHUpXG4iLA0KCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25n KSBwYXJtcy0+c2l6ZSwNCgkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgcGFybXMtPmNtZHNp emUpOw0KDQogIGlmIChwYXJtcy0+Y21kc2l6ZSAhPSAwICYmIHBhcm1zLT5jbWRzaXplICE9IDEy ICYmIHBhcm1zLT5jbWRzaXplICE9IDE2KQ0KICAgIHJldHVybiBncnViX2Vycm9yIChHUlVCX0VS Ul9CVUcsICJpbmNvcnJlY3QgQVRBUEkgY29tbWFuZCBzaXplIik7DQoNCiAgaWYgKHBhcm1zLT5z aXplID4gR1JVQl9BSENJX1BSRFRfTUFYX0NIVU5LX0xFTkdUSCkNCiAgICByZXR1cm4gZ3J1Yl9l cnJvciAoR1JVQl9FUlJfQlVHLCAidG9vIGJpZyBkYXRhIGJ1ZmZlciIpOw0KDQogIGJ1ZmMgPSBn cnViX21lbWFsaWduX2RtYTMyICgxMDI0LCBwYXJtcy0+c2l6ZSArIChwYXJtcy0+c2l6ZSAmIDEp KTsNCg0KICBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21tYW5kIHw9IDg7DQoNCiAgZ3J1 Yl9kcHJpbnRmICgiYWhjaSIsICJBSENJIHRmZCA9ICV4XG4iLA0KCQlkZXYtPmhiYS0+cG9ydHNb ZGV2LT5wb3J0XS50YXNrX2ZpbGVfZGF0YSk7DQogIC8qIEZJWE1FOiBzdXBwb3J0IHBvcnQgbXVs dGlwbGllcnMuICAqLw0KICBkZXYtPmNvbW1hbmRfbGlzdFswXS5jb25maWcNCiAgICA9ICg1IDw8 IEdSVUJfQUhDSV9DT05GSUdfQ0ZJU19MRU5HVEhfU0hJRlQpDQogICAgLy8gICAgfCBHUlVCX0FI Q0lfQ09ORklHX0NMRUFSX1JfT0sNCiAgICB8ICgwIDw8IEdSVUJfQUhDSV9DT05GSUdfUE1QX1NI SUZUKQ0KICAgIHwgKDEgPDwgR1JVQl9BSENJX0NPTkZJR19QUkRUX0xFTkdUSF9TSElGVCkNCiAg ICB8IChwYXJtcy0+Y21kc2l6ZSA/IEdSVUJfQUhDSV9DT05GSUdfQVRBUEkgOiAwKQ0KICAgIHwg KHBhcm1zLT53cml0ZSA/IEdSVUJfQUhDSV9DT05GSUdfV1JJVEUgOiBHUlVCX0FIQ0lfQ09ORklH X1JFQUQpDQogICAgfCAocGFybXMtPnRhc2tmaWxlLmNtZCA9PSA4ID8gKDEgPDwgOCkgOiAwKTsN CiAgZGV2LT5jb21tYW5kX2xpc3RbMF0udHJhbnNmZXJlZCA9IDA7DQogIGRldi0+Y29tbWFuZF9s aXN0WzBdLmNvbW1hbmRfdGFibGVfYmFzZQ0KICAgID0gZ3J1Yl9kbWFfZ2V0X3BoeXMgKGRldi0+ Y29tbWFuZF90YWJsZV9jaHVuayk7DQogIGdydWJfbWVtc2V0ICgoY2hhciAqKSBkZXYtPmNvbW1h bmRfbGlzdFswXS51bnVzZWQsIDAsDQoJICAgICAgIHNpemVvZiAoZGV2LT5jb21tYW5kX2xpc3Rb MF0udW51c2VkKSk7DQogIGdydWJfbWVtc2V0ICgoY2hhciAqKSAmZGV2LT5jb21tYW5kX3RhYmxl WzBdLCAwLA0KCSAgICAgICBzaXplb2YgKGRldi0+Y29tbWFuZF90YWJsZVswXSkpOw0KICBpZiAo cGFybXMtPmNtZHNpemUpDQogICAgZ3J1Yl9tZW1jcHkgKChjaGFyICopIGRldi0+Y29tbWFuZF90 YWJsZVswXS5jb21tYW5kLCBwYXJtcy0+Y21kLA0KCQkgcGFybXMtPmNtZHNpemUpOw0KDQogIGRl di0+Y29tbWFuZF90YWJsZVswXS5jZmlzWzBdID0gR1JVQl9BSENJX0ZJU19SRUdfSDJEOw0KICBk ZXYtPmNvbW1hbmRfdGFibGVbMF0uY2Zpc1sxXSA9IDB4ODA7DQogIGZvciAoaSA9IDA7IGkgPCBz aXplb2YgKHBhcm1zLT50YXNrZmlsZS5yYXcpOyBpKyspDQogICAgZGV2LT5jb21tYW5kX3RhYmxl WzBdLmNmaXNbcmVnaXN0ZXJfbWFwW2ldXSA9IHBhcm1zLT50YXNrZmlsZS5yYXdbaV07IA0KDQog IGdydWJfZHByaW50ZiAoImFoY2kiLCAiY2ZpczogJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUw MnggJTAyeCAlMDJ4XG4iLA0KCQlkZXYtPmNvbW1hbmRfdGFibGVbMF0uY2Zpc1swXSwgZGV2LT5j b21tYW5kX3RhYmxlWzBdLmNmaXNbMV0sDQoJCWRldi0+Y29tbWFuZF90YWJsZVswXS5jZmlzWzJd LCBkZXYtPmNvbW1hbmRfdGFibGVbMF0uY2Zpc1szXSwNCgkJZGV2LT5jb21tYW5kX3RhYmxlWzBd LmNmaXNbNF0sIGRldi0+Y29tbWFuZF90YWJsZVswXS5jZmlzWzVdLA0KCQlkZXYtPmNvbW1hbmRf dGFibGVbMF0uY2Zpc1s2XSwgZGV2LT5jb21tYW5kX3RhYmxlWzBdLmNmaXNbN10pOw0KICBncnVi X2RwcmludGYgKCJhaGNpIiwgImNmaXM6ICUwMnggJTAyeCAlMDJ4ICUwMnggJTAyeCAlMDJ4ICUw MnggJTAyeFxuIiwNCgkJZGV2LT5jb21tYW5kX3RhYmxlWzBdLmNmaXNbOF0sIGRldi0+Y29tbWFu ZF90YWJsZVswXS5jZmlzWzldLA0KCQlkZXYtPmNvbW1hbmRfdGFibGVbMF0uY2Zpc1sxMF0sIGRl di0+Y29tbWFuZF90YWJsZVswXS5jZmlzWzExXSwNCgkJZGV2LT5jb21tYW5kX3RhYmxlWzBdLmNm aXNbMTJdLCBkZXYtPmNvbW1hbmRfdGFibGVbMF0uY2Zpc1sxM10sDQoJCWRldi0+Y29tbWFuZF90 YWJsZVswXS5jZmlzWzE0XSwgZGV2LT5jb21tYW5kX3RhYmxlWzBdLmNmaXNbMTVdKTsNCg0KICBk ZXYtPmNvbW1hbmRfdGFibGVbMF0ucHJkdFswXS5kYXRhX2Jhc2UgPSBncnViX2RtYV9nZXRfcGh5 cyAoYnVmYyk7DQogIGRldi0+Y29tbWFuZF90YWJsZVswXS5wcmR0WzBdLnVudXNlZCA9IDA7DQog IGRldi0+Y29tbWFuZF90YWJsZVswXS5wcmR0WzBdLnNpemUgPSAocGFybXMtPnNpemUgKyAocGFy bXMtPnNpemUgJiAxKSAtIDEpDQogICAgfCBHUlVCX0FIQ0lfSU5URVJSVVBUX09OX0NPTVBMRVRF Ow0KDQogIGdydWJfZHByaW50ZiAoImFoY2kiLCAiUFJEVCA9ICUiIFBSSXhHUlVCX1VJTlQ2NF9U ICIsICV4LCAleCAoJSINCgkJUFJJdUdSVUJfU0laRSAiKVxuIiwNCgkJZGV2LT5jb21tYW5kX3Rh YmxlWzBdLnByZHRbMF0uZGF0YV9iYXNlLA0KCQlkZXYtPmNvbW1hbmRfdGFibGVbMF0ucHJkdFsw XS51bnVzZWQsDQoJCWRldi0+Y29tbWFuZF90YWJsZVswXS5wcmR0WzBdLnNpemUsDQoJCShjaGFy ICopICZkZXYtPmNvbW1hbmRfdGFibGVbMF0ucHJkdFswXQ0KCQktIChjaGFyICopICZkZXYtPmNv bW1hbmRfdGFibGVbMF0pOw0KDQogIGlmIChwYXJtcy0+d3JpdGUpDQogICAgZ3J1Yl9tZW1jcHkg KChjaGFyICopIGdydWJfZG1hX2dldF92aXJ0IChidWZjKSwgcGFybXMtPmJ1ZmZlciwgcGFybXMt PnNpemUpOw0KDQogIGdydWJfZHByaW50ZiAoImFoY2kiLCAiQUhDSSBjb21tYW5kIHNjaGVkdWxk ZWRcbiIpOw0KICBncnViX2RwcmludGYgKCJhaGNpIiwgIkFIQ0kgdGZkID0gJXhcbiIsDQoJCWRl di0+aGJhLT5wb3J0c1tkZXYtPnBvcnRdLnRhc2tfZmlsZV9kYXRhKTsNCiAgZGV2LT5oYmEtPnBv cnRzW2Rldi0+cG9ydF0uaW50ZW4gPSAweGZmZmZmZmZmOy8vKDEgPDwgMikgfCAoMSA8PCA1KTsN CiAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uaW50c3RhdHVzID0gMHhmZmZmZmZmZjsvLygx IDw8IDIpIHwgKDEgPDwgNSk7DQogIGdydWJfZHByaW50ZiAoImFoY2kiLCAiQUhDSSB0ZmQgPSAl eFxuIiwNCgkJZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0udGFza19maWxlX2RhdGEpOw0KICBk ZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS5jb21tYW5kX2lzc3VlIHw9IDE7DQogIGdydWJfZHBy aW50ZiAoImFoY2kiLCAiQUhDSSBzaWcgPSAleFxuIiwgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9y dF0uc2lnKTsNCiAgZ3J1Yl9kcHJpbnRmICgiYWhjaSIsICJBSENJIHRmZCA9ICV4XG4iLA0KCQlk ZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS50YXNrX2ZpbGVfZGF0YSk7DQoNCiAgZW5kdGltZSA9 IGdydWJfZ2V0X3RpbWVfbXMgKCkgKyAxMDAwMDsNCiAgd2hpbGUgKChkZXYtPmhiYS0+cG9ydHNb ZGV2LT5wb3J0XS5jb21tYW5kX2lzc3VlICYgMSkpDQogICAgaWYgKGdydWJfZ2V0X3RpbWVfbXMg KCkgPiBlbmR0aW1lKQ0KICAgICAgew0KCWdydWJfZHByaW50ZiAoImFoY2kiLCAiQUhDSSBzdGF0 dXMgPCV4ICV4ICV4PlxuIiwNCgkJICAgICAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29t bWFuZF9pc3N1ZSwNCgkJICAgICAgZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uaW50c3RhdHVz LA0KCQkgICAgICBkZXYtPmhiYS0+cG9ydHNbZGV2LT5wb3J0XS50YXNrX2ZpbGVfZGF0YSk7DQoJ Z3J1Yl9haGNpX3Jlc2V0X3BvcnQgKGRldiwgMSk7DQoJZXJyID0gZ3J1Yl9lcnJvciAoR1JVQl9F UlJfSU8sICJBSENJIHRyYW5zZmVyIHRpbWVkIG91dCIpOw0KCWJyZWFrOw0KICAgICAgfQ0KDQog IGdydWJfZHByaW50ZiAoImFoY2kiLCAiQUhDSSBjb21tYW5kIGNvbXBsZXRlZCA8JXggJXggJXgg JXggJXgsICV4ICV4PlxuIiwNCgkJZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uY29tbWFuZF9p c3N1ZSwNCgkJZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uaW50c3RhdHVzLA0KCQlkZXYtPmhi YS0+cG9ydHNbZGV2LT5wb3J0XS50YXNrX2ZpbGVfZGF0YSwNCgkJZGV2LT5jb21tYW5kX2xpc3Rb MF0udHJhbnNmZXJlZCwNCgkJZGV2LT5oYmEtPnBvcnRzW2Rldi0+cG9ydF0uc2F0YV9lcnJvciwN CgkJKChncnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDAw XSwNCgkJKChncnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsw eDE4XSk7DQogIGdydWJfZHByaW50ZiAoImFoY2kiLA0KCQkibGFzdCBQSU8gRklTICUwOHggJTA4 eCAlMDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwNCgkJKChncnViX3VpbnQzMl90ICop IGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDA4XSwNCgkJKChncnViX3VpbnQzMl90 ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDA5XSwNCgkJKChncnViX3VpbnQz Ml90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDBhXSwNCgkJKChncnViX3Vp bnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDBiXSwNCgkJKChncnVi X3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDBjXSwNCgkJKChn cnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDBkXSwNCgkJ KChncnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDBlXSwN CgkJKChncnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDBm XSk7DQogIGdydWJfZHByaW50ZiAoImFoY2kiLA0KCQkibGFzdCBSRUcgRklTICUwOHggJTA4eCAl MDh4ICUwOHggJTA4eCAlMDh4ICUwOHggJTA4eFxuIiwNCgkJKChncnViX3VpbnQzMl90ICopIGdy dWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDEwXSwNCgkJKChncnViX3VpbnQzMl90ICop IGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDExXSwNCgkJKChncnViX3VpbnQzMl90 ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDEyXSwNCgkJKChncnViX3VpbnQz Ml90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDEzXSwNCgkJKChncnViX3Vp bnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDE0XSwNCgkJKChncnVi X3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDE1XSwNCgkJKChn cnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDE2XSwNCgkJ KChncnViX3VpbnQzMl90ICopIGdydWJfZG1hX2dldF92aXJ0IChkZXYtPnJmaXMpKVsweDE3XSk7 DQoNCiAgaWYgKCFwYXJtcy0+d3JpdGUpDQogICAgZ3J1Yl9tZW1jcHkgKHBhcm1zLT5idWZmZXIs IChjaGFyICopIGdydWJfZG1hX2dldF92aXJ0IChidWZjKSwgcGFybXMtPnNpemUpOw0KICBncnVi X2RtYV9mcmVlIChidWZjKTsNCg0KICByZXR1cm4gZXJyOw0KfQ0KDQpzdGF0aWMgZ3J1Yl9lcnJf dCANCmdydWJfYWhjaV9yZWFkd3JpdGUgKGdydWJfYXRhX3QgZGlzaywNCgkJICAgICBzdHJ1Y3Qg Z3J1Yl9kaXNrX2F0YV9wYXNzX3Rocm91Z2hfcGFybXMgKnBhcm1zLA0KCQkgICAgIGludCBzcGlu dXApDQp7DQogIHNwaW51cCA9IDA7DQogIHJldHVybiBncnViX2FoY2lfcmVhZHdyaXRlX3JlYWwg KGRpc2stPmRhdGEsIHBhcm1zLCBzcGludXApOw0KfQ0KDQpzdGF0aWMgZ3J1Yl9lcnJfdA0KZ3J1 Yl9haGNpX29wZW4gKGludCBpZCwgaW50IGRldm51bSwgc3RydWN0IGdydWJfYXRhICphdGEpDQp7 DQogIHN0cnVjdCBncnViX2FoY2lfZGV2aWNlICpkZXY7DQoNCiAgaWYgKGlkICE9IEdSVUJfU0NT SV9TVUJTWVNURU1fQUhDSSkNCiAgICByZXR1cm4gZ3J1Yl9lcnJvciAoR1JVQl9FUlJfVU5LTk9X Tl9ERVZJQ0UsICJub3QgYW4gQUhDSSBkZXZpY2UiKTsNCg0KICBGT1JfTElTVF9FTEVNRU5UUyhk ZXYsIGdydWJfYWhjaV9kZXZpY2VzKQ0KICAgIGlmIChkZXYtPm51bSA9PSBkZXZudW0pDQogICAg ICBicmVhazsNCg0KICBpZiAoISBkZXYpDQogICAgcmV0dXJuIGdydWJfZXJyb3IgKEdSVUJfRVJS X1VOS05PV05fREVWSUNFLCAibm8gc3VjaCBBSENJIGRldmljZSIpOw0KDQogIGdydWJfZHByaW50 ZiAoImFoY2kiLCAib3BlbmluZyBBSENJIGRldiBgYWhjaSVkJ1xuIiwgZGV2LT5udW0pOw0KDQog IGF0YS0+ZGF0YSA9IGRldjsNCiAgYXRhLT5kbWEgPSAxOw0KICBhdGEtPm1heGJ1ZmZlciA9IEdS VUJfQUhDSV9QUkRUX01BWF9DSFVOS19MRU5HVEg7DQogIGF0YS0+cHJlc2VudCA9ICZkZXYtPnBy ZXNlbnQ7DQoNCiAgcmV0dXJuIEdSVUJfRVJSX05PTkU7DQp9DQoNCnN0YXRpYyBzdHJ1Y3QgZ3J1 Yl9hdGFfZGV2IGdydWJfYWhjaV9kZXYgPQ0KICB7DQogICAgLml0ZXJhdGUgPSBncnViX2FoY2lf aXRlcmF0ZSwNCiAgICAub3BlbiA9IGdydWJfYWhjaV9vcGVuLA0KICAgIC5yZWFkd3JpdGUgPSBn cnViX2FoY2lfcmVhZHdyaXRlLA0KICB9Ow0KDQoMDQoNCnN0YXRpYyBzdHJ1Y3QgZ3J1Yl9wcmVi b290ICpmaW5pX2huZDsNCg0KR1JVQl9NT0RfSU5JVChhaGNpKQ0Kew0KICAvKiBUbyBwcmV2ZW50 IHR3byBkcml2ZXJzIG9wZXJhdGluZyBvbiB0aGUgc2FtZSBkaXNrcy4gICovDQogIGdydWJfZGlz a19maXJtd2FyZV9pc190YWludGVkID0gMTsNCiAgaWYgKGdydWJfZGlza19maXJtd2FyZV9maW5p KQ0KICAgIHsNCiAgICAgIGdydWJfZGlza19maXJtd2FyZV9maW5pICgpOw0KICAgICAgZ3J1Yl9k aXNrX2Zpcm13YXJlX2ZpbmkgPSBOVUxMOw0KICAgIH0NCg0KICAvKiBBSENJIGluaXRpYWxpemF0 aW9uLiAgKi8NCiAgZ3J1Yl9haGNpX2luaXRpYWxpemUgKCk7DQoNCiAgLyogQUhDSSBkZXZpY2Vz IGFyZSBoYW5kbGVkIGJ5IHNjc2kubW9kLiAgKi8NCiAgZ3J1Yl9hdGFfZGV2X3JlZ2lzdGVyICgm Z3J1Yl9haGNpX2Rldik7DQoNCiAgZmluaV9obmQgPSBncnViX2xvYWRlcl9yZWdpc3Rlcl9wcmVi b290X2hvb2sgKGdydWJfYWhjaV9maW5pX2h3LA0KCQkJCQkJZ3J1Yl9haGNpX3Jlc3RvcmVfaHcs DQoJCQkJCQlHUlVCX0xPQURFUl9QUkVCT09UX0hPT0tfUFJJT19ESVNLKTsNCn0NCg0KR1JVQl9N T0RfRklOSShhaGNpKQ0Kew0KICBncnViX2FoY2lfZmluaV9odyAoMCk7DQogIGdydWJfbG9hZGVy X3VucmVnaXN0ZXJfcHJlYm9vdF9ob29rIChmaW5pX2huZCk7DQoNCiAgZ3J1Yl9hdGFfZGV2X3Vu cmVnaXN0ZXIgKCZncnViX2FoY2lfZGV2KTsNCn0NCm== --=-T9zcZBxiR2SINUMSnccE-- --=-dzUqpcZw17GIs5V+ogKu Content-Type: application/pgp-signature; name="signature.asc" Content-Description: This is a digitally signed message part Content-Transfer-Encoding: 7bit -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.12 (GNU/Linux) iEYEABECAAYFAlFxV1AACgkQPX1aK2wOHVhRjQCfSDShiKT+dIdkBF55W0IY2Gs2 OIAAoIhAfz/t9bj4Fu9AItFLrkkgMEGK =VCnf -----END PGP SIGNATURE----- --=-dzUqpcZw17GIs5V+ogKu--