From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from wa-out-1112.google.com (wa-out-1112.google.com [209.85.146.177]) by ozlabs.org (Postfix) with ESMTP id AD7F5DDE0D for ; Tue, 17 Jun 2008 18:28:26 +1000 (EST) Received: by wa-out-1112.google.com with SMTP id n7so4260688wag.13 for ; Tue, 17 Jun 2008 01:28:25 -0700 (PDT) Message-ID: <792f5f410806170128k7e435743x9892b559bd32b157@mail.gmail.com> Date: Tue, 17 Jun 2008 09:28:25 +0100 From: "Tim Yamin" Sender: plasmaroo@gmail.com To: linuxppc-dev@ozlabs.org Subject: [PATCH]: [MPC5200] Add ATA DMA support MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_46152_22134491.1213691305186" List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , ------=_Part_46152_22134491.1213691305186 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline This patch adds MDMA/UDMA support (using BestComm for DMA) on the MPC5200 platform. Based heavily on previous work by Freescale (Bernard Kuhn, John Rigby) and Domen Puncer. Using a SanDisk Extreme IV CF card I get read speeds of approximately 26.70 MB/sec. The BestComm ATA task priority was changed to maximum in bestcomm_priv.h; this fixes a deadlock issue I was experiencing when heavy DMA was occuring on both the ATA and Ethernet BestComm tasks, e.g. when downloading a large file over a LAN to disk. There's also what I believe to be a hardware bug if you have high levels of BestComm ATA DMA activity along with heavy LocalPlus Bus activity; the address bus seems to sometimes get corrupted with ATA commands while the LocalPlus Bus operation is still active (i.e. Chip Select is asserted). I've asked Freescale about this but have not received a reply yet -- if anybody from Freescale has any ideas please contact me; I can supply some analyzer traces if needed. Therefore, for now, do not enable DMA if you need reliable LocalPlus Bus unless you do a fixup in your driver as follows: Locking example: while (test_and_set_bit(0, &pata_mpc52xx_ata_dma_lock) != 0) { struct bcom_task_2 *tsk = pata_mpc52xx_ata_dma_task; if(bcom_buffer_done_2(tsk)) return 1; } return 0; (Save the return value to `flags`) Unlocking example: if(flags == 0) clear_bit(0, &pata_mpc52xx_ata_dma_lock); Comments and testing would of course be very welcome. Thanks, Signed-off-by: Tim Yamin ------=_Part_46152_22134491.1213691305186 Content-Type: text/x-patch; name=1050-mpc5200-add-ATA-DMA.patch Content-Transfer-Encoding: base64 X-Attachment-Id: f_fhk8enuk0 Content-Disposition: attachment; filename=1050-mpc5200-add-ATA-DMA.patch VGhpcyBwYXRjaCBhZGRzIE1ETUEvVURNQSBzdXBwb3J0ICh1c2luZyBCZXN0Q29tbSBmb3IgRE1B KSBvbiB0aGUgTVBDNTIwMApwbGF0Zm9ybS4KCkJhc2VkIGhlYXZpbHkgb24gcHJldmlvdXMgd29y ayBieSBGcmVlc2NhbGUgKEJlcm5hcmQgS3VobiwgSm9obiBSaWdieSkKYW5kIERvbWVuIFB1bmNl ci4KClVzaW5nIGEgU2FuRGlzayBFeHRyZW1lIElWIENGIGNhcmQgSSBnZXQgcmVhZCBzcGVlZHMg b2YgYXBwcm94aW1hdGVseQoyNi43MCBNQi9zZWMuCgpUaGUgQmVzdENvbW0gQVRBIHRhc2sgcHJp b3JpdHkgd2FzIGNoYW5nZWQgdG8gbWF4aW11bSBpbiBiZXN0Y29tbV9wcml2Lmg7CnRoaXMgZml4 ZXMgYSBkZWFkbG9jayBpc3N1ZSBJIHdhcyBleHBlcmllbmNpbmcgd2hlbiBoZWF2eSBETUEgd2Fz Cm9jY3VyaW5nIG9uIGJvdGggdGhlIEFUQSBhbmQgRXRoZXJuZXQgQmVzdENvbW0gdGFza3MsIGUu Zy4gd2hlbgpkb3dubG9hZGluZyBhIGxhcmdlIGZpbGUgb3ZlciBhIExBTiB0byBkaXNrLgoKVGhl cmUncyBhbHNvIHdoYXQgSSBiZWxpZXZlIHRvIGJlIGEgaGFyZHdhcmUgYnVnIGlmIHlvdSBoYXZl IGhpZ2ggbGV2ZWxzCm9mIEJlc3RDb21tIEFUQSBETUEgYWN0aXZpdHkgYWxvbmcgd2l0aCBoZWF2 eSBMb2NhbFBsdXMgQnVzIGFjdGl2aXR5Owp0aGUgYWRkcmVzcyBidXMgc2VlbXMgdG8gc29tZXRp bWVzIGdldCBjb3JydXB0ZWQgd2l0aCBBVEEgY29tbWFuZHMgd2hpbGUKdGhlIExvY2FsUGx1cyBC dXMgb3BlcmF0aW9uIGlzIHN0aWxsIGFjdGl2ZSAoaS5lLiBDaGlwIFNlbGVjdCBpcyBhc3NlcnRl ZCkuCgpJJ3ZlIGFza2VkIEZyZWVzY2FsZSBhYm91dCB0aGlzIGJ1dCBoYXZlIG5vdCByZWNlaXZl ZCBhIHJlcGx5IHlldCAtLSBpZgphbnlib2R5IGZyb20gRnJlZXNjYWxlIGhhcyBhbnkgaWRlYXMg cGxlYXNlIGNvbnRhY3QgbWU7IEkgY2FuIHN1cHBseSBzb21lCmFuYWx5emVyIHRyYWNlcyBpZiBu ZWVkZWQuIFRoZXJlZm9yZSwgZm9yIG5vdywgZG8gbm90IGVuYWJsZSBETUEgaWYgeW91Cm5lZWQg cmVsaWFibGUgTG9jYWxQbHVzIEJ1cyB1bmxlc3MgeW91IGRvIGEgZml4dXAgaW4geW91ciBkcml2 ZXIgYXMKZm9sbG93czoKCkxvY2tpbmcgZXhhbXBsZToKCiAgICAgICAgd2hpbGUgKHRlc3RfYW5k X3NldF9iaXQoMCwgJnBhdGFfbXBjNTJ4eF9hdGFfZG1hX2xvY2spICE9IDApCiAgICAgICAgewog ICAgICAgICAgICAgICAgc3RydWN0IGJjb21fdGFza18yICp0c2sgPSBwYXRhX21wYzUyeHhfYXRh X2RtYV90YXNrOwoKICAgICAgICAgICAgICAgIGlmKGJjb21fYnVmZmVyX2RvbmVfMih0c2spKQog ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CgoJcmV0dXJuIDA7Cgoo U2F2ZSB0aGUgcmV0dXJuIHZhbHVlIHRvIGBmbGFnc2ApCgpVbmxvY2tpbmcgZXhhbXBsZToKCiAg ICAgICAgaWYoZmxhZ3MgPT0gMCkKICAgICAgICAgICAgICAgIGNsZWFyX2JpdCgwLCAmcGF0YV9t cGM1Mnh4X2F0YV9kbWFfbG9jayk7CgpDb21tZW50cyBhbmQgdGVzdGluZyB3b3VsZCBvZiBjb3Vy c2UgYmUgdmVyeSB3ZWxjb21lLgoKVGhhbmtzLAoKU2lnbmVkLW9mZi1ieTogVGltIFlhbWluIDxw bGFzbUByb28ubWUudWs+CgpkaWZmIC1OdXJwIGxpbnV4LTIuNi4yNi1yYzYvYXJjaC9wb3dlcnBj L3N5c2Rldi9iZXN0Y29tbS9hdGEuaCBsaW51eC0yLjYuMjYtcmM2Lm5ldy9hcmNoL3Bvd2VycGMv c3lzZGV2L2Jlc3Rjb21tL2F0YS5oCi0tLSBsaW51eC0yLjYuMjYtcmM2L2FyY2gvcG93ZXJwYy9z eXNkZXYvYmVzdGNvbW0vYXRhLmgJMjAwOC0wMy0xOCAxNTo0OTo1My4wMDAwMDAwMDAgKzAwMDAK KysrIGxpbnV4LTIuNi4yNi1yYzYubmV3L2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vYXRh LmgJMjAwOC0wNC0xNSAxMDo0MjozOC4wMDAwMDAwMDAgKzAxMDAKQEAgLTE2LDggKzE2LDggQEAK IAogc3RydWN0IGJjb21fYXRhX2JkIHsKIAl1MzIJc3RhdHVzOwotCXUzMglkc3RfcGE7CiAJdTMy CXNyY19wYTsKKwl1MzIJZHN0X3BhOwogfTsKIAogZXh0ZXJuIHN0cnVjdCBiY29tX3Rhc2sgKgpk aWZmIC1OdXJwIGxpbnV4LTIuNi4yNi1yYzYvYXJjaC9wb3dlcnBjL3N5c2Rldi9iZXN0Y29tbS9i ZXN0Y29tbS5jIGxpbnV4LTIuNi4yNi1yYzYubmV3L2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNv bW0vYmVzdGNvbW0uYwotLS0gbGludXgtMi42LjI2LXJjNi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jl c3Rjb21tL2Jlc3Rjb21tLmMJMjAwOC0wMy0xOCAxNTo0OTo1My4wMDAwMDAwMDAgKzAwMDAKKysr IGxpbnV4LTIuNi4yNi1yYzYubmV3L2FyY2gvcG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vYmVzdGNv bW0uYwkyMDA4LTA0LTE1IDEwOjQyOjM4LjAwMDAwMDAwMCArMDEwMApAQCAtMzMwLDExICszMzAs MTAgQEAKIAkvKiBJbml0ICdhbHdheXMnIGluaXRpYXRvciAqLwogCW91dF84KCZiY29tX2VuZy0+ cmVncy0+aXByW0JDT01fSU5JVElBVE9SX0FMV0FZU10sIEJDT01fSVBSX0FMV0FZUyk7CiAKLQkv KiBEaXNhYmxlIENPTU0gQnVzIFByZWZldGNoIG9uIHRoZSBvcmlnaW5hbCA1MjAwOyBpdCdzIGJy b2tlbiAqLwotCWlmICgobWZzcHIoU1BSTl9TVlIpICYgTVBDNTIwMF9TVlJfTUFTSykgPT0gTVBD NTIwMF9TVlIpIHsKLQkJcmVndmFsID0gaW5fYmUxNigmYmNvbV9lbmctPnJlZ3MtPlB0ZENudHJs KTsKLQkJb3V0X2JlMTYoJmJjb21fZW5nLT5yZWdzLT5QdGRDbnRybCwgIHJlZ3ZhbCB8IDEpOwot CX0KKwkvKiBEaXNhYmxlIENPTU0gQnVzIFByZWZldGNoOyBBVEEgRE1BIGRvZXMgbm90IHdvcmsg cHJvcGVybHkgd2l0aCBpdAorCSAgIGVuYWJsZWQuICovCisJcmVndmFsID0gaW5fYmUxNigmYmNv bV9lbmctPnJlZ3MtPlB0ZENudHJsKTsKKwlvdXRfYmUxNigmYmNvbV9lbmctPnJlZ3MtPlB0ZENu dHJsLCByZWd2YWwgfCAxKTsKIAogCS8qIEluaXQgbG9jayAqLwogCXNwaW5fbG9ja19pbml0KCZi Y29tX2VuZy0+bG9jayk7CmRpZmYgLU51cnAgbGludXgtMi42LjI2LXJjNi9hcmNoL3Bvd2VycGMv c3lzZGV2L2Jlc3Rjb21tL2Jlc3Rjb21tLmggbGludXgtMi42LjI2LXJjNi5uZXcvYXJjaC9wb3dl cnBjL3N5c2Rldi9iZXN0Y29tbS9iZXN0Y29tbS5oCi0tLSBsaW51eC0yLjYuMjYtcmM2L2FyY2gv cG93ZXJwYy9zeXNkZXYvYmVzdGNvbW0vYmVzdGNvbW0uaAkyMDA4LTAzLTE4IDE1OjQ5OjUzLjAw MDAwMDAwMCArMDAwMAorKysgbGludXgtMi42LjI2LXJjNi5uZXcvYXJjaC9wb3dlcnBjL3N5c2Rl di9iZXN0Y29tbS9iZXN0Y29tbS5oCTIwMDgtMDQtMTUgMTA6NDI6MzguMDAwMDAwMDAwICswMTAw CkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIF9fQkVTVENPTU1fSF9fCiAKIHN0cnVjdCBiY29t X2JkOyAvKiBkZWZpbmVkIGxhdGVyIG9uIC4uLiAqLworc3RydWN0IGJjb21fYmRfMjsKIAogCiAv KiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0gKi8KQEAgLTQ5LDYgKzUwLDIyIEBACiAJdm9pZCoJCXByaXY7CiB9 OwogCitzdHJ1Y3QgYmNvbV90YXNrXzIgeworCXVuc2lnbmVkIGludAl0YXNrbnVtOworCXVuc2ln bmVkIGludAlmbGFnczsKKwlpbnQJCWlycTsKKworCXN0cnVjdCBiY29tX2JkXzIJKmJkOworCXBo eXNfYWRkcl90CWJkX3BhOworCXZvaWQJCSoqY29va2llOworCXVuc2lnbmVkIHNob3J0CWluZGV4 OworCXVuc2lnbmVkIHNob3J0CW91dGRleDsKKwl1bnNpZ25lZCBpbnQJbnVtX2JkOworCXVuc2ln bmVkIGludAliZF9zaXplOworCisJdm9pZCoJCXByaXY7Cit9OworCiAjZGVmaW5lIEJDT01fRkxB R1NfTk9ORSAgICAgICAgIDB4MDAwMDAwMDB1bAogI2RlZmluZSBCQ09NX0ZMQUdTX0VOQUJMRV9U QVNLICAoMXVsIDw8ICAwKQogCkBAIC05NSw2ICsxMTIsMTEgQEAKIAl1MzIJZGF0YVsxXTsJLyog dmFyaWFibGUsIGJ1dCBhdCBsZWFzdCAxICovCiB9OwogCitzdHJ1Y3QgYmNvbV9iZF8yIHsKKwl1 MzIJc3RhdHVzOworCXUzMglkYXRhWzJdOwkvKiB2YXJpYWJsZSwgYnV0IGF0IGxlYXN0IDIgKi8K K307CisKICNkZWZpbmUgQkNPTV9CRF9SRUFEWQkweDQwMDAwMDAwdWwKIAogLyoqIF9iY29tX25l eHRfaW5kZXggLSBHZXQgbmV4dCBpbnB1dCBpbmRleC4KQEAgLTEwOCw2ICsxMzAsMTIgQEAKIAly ZXR1cm4gKCh0c2stPmluZGV4ICsgMSkgPT0gdHNrLT5udW1fYmQpID8gMCA6IHRzay0+aW5kZXgg KyAxOwogfQogCitzdGF0aWMgaW5saW5lIGludAorX2Jjb21fbmV4dF9pbmRleF8yKHN0cnVjdCBi Y29tX3Rhc2tfMiAqdHNrKQoreworCXJldHVybiAoKHRzay0+aW5kZXggKyAxKSA9PSB0c2stPm51 bV9iZCkgPyAwIDogdHNrLT5pbmRleCArIDE7Cit9CisKIC8qKiBfYmNvbV9uZXh0X291dGRleCAt IEdldCBuZXh0IG91dHB1dCBpbmRleC4KICAqIEB0c2s6IHBvaW50ZXIgdG8gdGFzayBzdHJ1Y3R1 cmUKICAqCkBAIC0xMjksNiArMTU3LDEyIEBACiAJcmV0dXJuIHRzay0+aW5kZXggPT0gdHNrLT5v dXRkZXg7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50CitiY29tX3F1ZXVlX2VtcHR5XzIoc3RydWN0 IGJjb21fdGFza18yICp0c2spCit7CisJcmV0dXJuIHRzay0+aW5kZXggPT0gdHNrLT5vdXRkZXg7 Cit9CisKIC8qKgogICogYmNvbV9xdWV1ZV9mdWxsIC0gQ2hlY2tzIGlmIGEgQmVzdENvbW0gdGFz ayBCRCBxdWV1ZSBpcyBmdWxsCiAgKiBAdHNrOiBUaGUgQmVzdENvbW0gdGFzayBzdHJ1Y3R1cmUK QEAgLTE1MSw2ICsxODUsMTQgQEAKIAlyZXR1cm4gISh0c2stPmJkW3Rzay0+b3V0ZGV4XS5zdGF0 dXMgJiBCQ09NX0JEX1JFQURZKTsKIH0KIAorc3RhdGljIGlubGluZSBpbnQKK2Jjb21fYnVmZmVy X2RvbmVfMihzdHJ1Y3QgYmNvbV90YXNrXzIgKnRzaykKK3sKKwlpZiAoYmNvbV9xdWV1ZV9lbXB0 eV8yKHRzaykpCisJCXJldHVybiAwOworCXJldHVybiAhKHRzay0+YmRbdHNrLT5vdXRkZXhdLnN0 YXR1cyAmIEJDT01fQkRfUkVBRFkpOworfQorCiAvKioKICAqIGJjb21fcHJlcGFyZV9uZXh0X2J1 ZmZlciAtIGNsZWFyIHN0YXR1cyBvZiBuZXh0IGF2YWlsYWJsZSBidWZmZXIuCiAgKiBAdHNrOiBU aGUgQmVzdENvbW0gdGFzayBzdHJ1Y3R1cmUKQEAgLTE3NSw2ICsyMTcsMjIgQEAKIAkJYmNvbV9l bmFibGUodHNrKTsKIH0KIAorc3RhdGljIGlubGluZSBzdHJ1Y3QgYmNvbV9iZF8yICoKK2Jjb21f cHJlcGFyZV9uZXh0X2J1ZmZlcl8yKHN0cnVjdCBiY29tX3Rhc2tfMiAqdHNrKQoreworCXRzay0+ YmRbdHNrLT5pbmRleF0uc3RhdHVzID0gMDsJLyogY2xlYW51cCBsYXN0IHN0YXR1cyAqLworCXJl dHVybiAmdHNrLT5iZFt0c2stPmluZGV4XTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitiY29t X3N1Ym1pdF9uZXh0X2J1ZmZlcl8yKHN0cnVjdCBiY29tX3Rhc2tfMiAqdHNrLCB2b2lkICpjb29r aWUpCit7CisJdHNrLT5jb29raWVbdHNrLT5pbmRleF0gPSBjb29raWU7CisJbWIoKTsJLyogZW5z dXJlIHRoZSBiZCBpcyByZWFsbHkgdXAtdG8tZGF0ZSAqLworCXRzay0+YmRbdHNrLT5pbmRleF0u c3RhdHVzIHw9IEJDT01fQkRfUkVBRFk7CisJdHNrLT5pbmRleCA9IF9iY29tX25leHRfaW5kZXhf Mih0c2spOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgKgogYmNvbV9yZXRyaWV2ZV9idWZmZXIo c3RydWN0IGJjb21fdGFzayAqdHNrLCB1MzIgKnBfc3RhdHVzLCBzdHJ1Y3QgYmNvbV9iZCAqKnBf YmQpCiB7CmRpZmYgLU51cnAgbGludXgtMi42LjI2LXJjNi9hcmNoL3Bvd2VycGMvc3lzZGV2L2Jl c3Rjb21tL2Jlc3Rjb21tX3ByaXYuaCBsaW51eC0yLjYuMjYtcmM2Lm5ldy9hcmNoL3Bvd2VycGMv c3lzZGV2L2Jlc3Rjb21tL2Jlc3Rjb21tX3ByaXYuaAotLS0gbGludXgtMi42LjI2LXJjNi9hcmNo L3Bvd2VycGMvc3lzZGV2L2Jlc3Rjb21tL2Jlc3Rjb21tX3ByaXYuaAkyMDA4LTAzLTE4IDE1OjQ5 OjUzLjAwMDAwMDAwMCArMDAwMAorKysgbGludXgtMi42LjI2LXJjNi5uZXcvYXJjaC9wb3dlcnBj L3N5c2Rldi9iZXN0Y29tbS9iZXN0Y29tbV9wcml2LmgJMjAwOC0wNC0xNSAxMDo0MjozOC4wMDAw MDAwMDAgKzAxMDAKQEAgLTE5OCw4ICsxOTgsOCBAQCBzdHJ1Y3QgYmNvbV90YXNrX2hlYWRlciB7 CiAjZGVmaW5lIEJDT01fSVBSX1NDVE1SXzEJMgogI2RlZmluZSBCQ09NX0lQUl9GRUNfUlgJCTYK ICNkZWZpbmUgQkNPTV9JUFJfRkVDX1RYCQk1Ci0jZGVmaW5lIEJDT01fSVBSX0FUQV9SWAkJNAot I2RlZmluZSBCQ09NX0lQUl9BVEFfVFgJCTMKKyNkZWZpbmUgQkNPTV9JUFJfQVRBX1JYCQk3Cisj ZGVmaW5lIEJDT01fSVBSX0FUQV9UWAkJNwogI2RlZmluZSBCQ09NX0lQUl9TQ1BDSV9SWAkyCiAj ZGVmaW5lIEJDT01fSVBSX1NDUENJX1RYCTIKICNkZWZpbmUgQkNPTV9JUFJfUFNDM19SWAkyCmRp ZmYgLU51cnAgbGludXgtMi42LjI2LXJjNi9kcml2ZXJzL2F0YS9LY29uZmlnIGxpbnV4LTIuNi4y Ni1yYzYubmV3L2RyaXZlcnMvYXRhL0tjb25maWcKLS0tIGxpbnV4LTIuNi4yNi1yYzYvZHJpdmVy cy9hdGEvS2NvbmZpZwkyMDA4LTAzLTE4IDE1OjQ5OjMzLjAwMDAwMDAwMCArMDAwMAorKysgbGlu dXgtMi42LjI2LXJjNi5uZXcvZHJpdmVycy9hdGEvS2NvbmZpZwkyMDA4LTA0LTE1IDEwOjQxOjUx LjAwMDAwMDAwMCArMDEwMApAQCAtNDYyLDYgKzQ2MiwxNSBAQAogCiAJICBJZiB1bnN1cmUsIHNh eSBOLgogCitjb25maWcgUEFUQV9NUEM1Mnh4X0RNQQorCXRyaXN0YXRlICJGcmVlc2NhbGUgTVBD NTJ4eCBTb0MgaW50ZXJuYWwgSURFIERNQSIKKwlkZXBlbmRzIG9uIFBBVEFfTVBDNTJ4eAorCWhl bHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgRE1BIG9uIHRoZSBNUEM1Mnh4 IFNvQyBQQVRBCisJICBjb250cm9sbGVyLgorCisJICBJZiB1bnN1cmUsIHNheSBOLgorCiBjb25m aWcgUEFUQV9NUElJWAogCXRyaXN0YXRlICJJbnRlbCBQQVRBIE1QSUlYIHN1cHBvcnQiCiAJZGVw ZW5kcyBvbiBQQ0kKZGlmZiAtTnVycCBsaW51eC0yLjYuMjYtcmM2L2RyaXZlcnMvYXRhL3BhdGFf bXBjNTJ4eC5jIGxpbnV4LTIuNi4yNi1yYzYubmV3L2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5j Ci0tLSBsaW51eC0yLjYuMjYtcmM2L2RyaXZlcnMvYXRhL3BhdGFfbXBjNTJ4eC5jCTIwMDgtMDMt MTggMTU6NDk6MzMuMDAwMDAwMDAwICswMDAwCisrKyBsaW51eC0yLjYuMjYtcmM2Lm5ldy9kcml2 ZXJzL2F0YS9wYXRhX21wYzUyeHguYwkyMDA4LTA0LTE1IDEwOjQxOjQ5LjAwMDAwMDAwMCArMDEw MApAQCAtNiw2ICs2LDkgQEAKICAqIENvcHlyaWdodCAoQykgMjAwNiBTeWx2YWluIE11bmF1dCA8 dG50QDI0NnROdC5jb20+CiAgKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWlwc3lzIC0gQmVuamFtaW4g SGVycmVuc2NobWlkdAogICoKKyAqIFVETUEgc3VwcG9ydCBiYXNlZCBvbiBwYXRjaGVzIGJ5IEZy ZWVzY2FsZSAoQmVybmFyZCBLdWhuLCBKb2huIFJpZ2J5KSwKKyAqIERvbWVuIFB1bmNlciBhbmQg VGltIFlhbWluLgorICoKICAqIFRoaXMgZmlsZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgdGVybXMg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgKiB2ZXJzaW9uIDIuIFRoaXMgcHJv Z3JhbSBpcyBsaWNlbnNlZCAiYXMgaXMiIHdpdGhvdXQgYW55IHdhcnJhbnR5IG9mIGFueQogICog a2luZCwgd2hldGhlciBleHByZXNzIG9yIGltcGxpZWQuCkBAIC0xNywyOCArMjAsNDcgQEAKICNp bmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpYmF0YS5oPgogCisjaW5j bHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vdHlwZXMuaD4KICNpbmNsdWRl IDxhc20vcHJvbS5oPgogI2luY2x1ZGUgPGFzbS9vZl9wbGF0Zm9ybS5oPgogI2luY2x1ZGUgPGFz bS9tcGM1Mnh4Lmg+CiAKKyNpbmNsdWRlIDxzeXNkZXYvYmVzdGNvbW0vYmVzdGNvbW0uaD4KKyNp bmNsdWRlIDxzeXNkZXYvYmVzdGNvbW0vYmVzdGNvbW1fcHJpdi5oPgorI2luY2x1ZGUgPHN5c2Rl di9iZXN0Y29tbS9hdGEuaD4KIAogI2RlZmluZSBEUlZfTkFNRQkibXBjNTJ4eF9hdGEiCiAjZGVm aW5lIERSVl9WRVJTSU9OCSIwLjEuMiIKIAotCiAvKiBQcml2YXRlIHN0cnVjdHVyZXMgdXNlZCBi eSB0aGUgZHJpdmVyICovCiBzdHJ1Y3QgbXBjNTJ4eF9hdGFfdGltaW5ncyB7CiAJdTMyCXBpbzE7 CiAJdTMyCXBpbzI7CisJdTMyCW1kbWExOworCXUzMgltZG1hMjsKKwl1MzIJdWRtYTE7CisJdTMy CXVkbWEyOworCXUzMgl1ZG1hMzsKKwl1MzIJdWRtYTQ7CisJdTMyCXVkbWE1OworCWludAl1c2lu Z191ZG1hOwogfTsKIAogc3RydWN0IG1wYzUyeHhfYXRhX3ByaXYgewogCXVuc2lnbmVkIGludAkJ CWlwYl9wZXJpb2Q7CiAJc3RydWN0IG1wYzUyeHhfYXRhIF9faW9tZW0gKglhdGFfcmVnczsKKwlz dHJ1Y3QgbXBjNTJ4eF9hdGEgX19pb21lbSAqCWF0YV9yZWdzX3BhOwogCWludAkJCQlhdGFfaXJx OwogCXN0cnVjdCBtcGM1Mnh4X2F0YV90aW1pbmdzCXRpbWluZ3NbMl07CiAJaW50CQkJCWNzZWw7 CisKKwkvKiBETUEgKi8KKwlzdHJ1Y3QgYmNvbV90YXNrICoJCWRtYXRzazsKKwljb25zdCBzdHJ1 Y3QgdWRtYXNwZWMgKgkJdWRtYXNwZWM7CisJY29uc3Qgc3RydWN0IG1kbWFzcGVjICoJCW1kbWFz cGVjOworCWludCAJCQkJbXBjNTJ4eF9hdGFfZG1hX2xhc3Rfd3JpdGU7CisJaW50CQkJCXdhaXRp bmdfZm9yX2RtYTsKIH07CiAKIApAQCAtNTMsNiArNzUsMTAyIEBACiAKICNkZWZpbmUgQ0FMQ19D TEtDWUMoYyx2KSAoKCgodikrKGMpLTEpLyhjKSkpCiAKKy8qIEFUQVBJLTQgTURNQSBzcGVjcyAo aW4gY2xvY2tzKSAqLworc3RydWN0IG1kbWFzcGVjIHsKKwl1MzIgdDBNWzNdOworCXUzMiB0ZFsz XTsKKwl1MzIgdGhbM107CisJdTMyIHRqWzNdOworCXUzMiB0a3dbM107CisJdTMyIHRtWzNdOwor CXUzMiB0blszXTsKK307CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWRtYXNwZWMgbWRtYXNwZWM2NiA9IHsKKwl7MzIs ICAxMCwgIDh9LAorCXsxNSwgIDYsICAgNX0sCisJezIsICAgMSwgICAxfSwKKwl7MiwgICAxLCAg IDF9LAorCXsxNSwgIDQsICAgMn0sCisJezQsICAgMiwgICAyfSwKKwl7MSwgICAxLCAgIDF9Cit9 OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1kbWFzcGVjIG1kbWFzcGVjMTMyID0geworCXs2NCwg IDIwLCAgMTZ9LAorCXsyOSwgIDExLCAgMTB9LAorCXszLCAgIDIsICAgMn0sCisJezMsICAgMSwg ICAxfSwKKwl7MjksICA3LCAgIDR9LAorCXs3LCAgIDQsICAgNH0sCisJezIsICAgMSwgICAxfQor fTsKKworCisvKiBBVEFQSS00IFVETUEgc3BlY3MgKGluIGNsb2NrcykgKi8KK3N0cnVjdCB1ZG1h c3BlYyB7CisJdTMyIHRjeWNbNl07CisJdTMyIHQyY3ljWzZdOworCXUzMiB0ZHNbNl07CisJdTMy IHRkaFs2XTsKKwl1MzIgdGR2c1s2XTsKKwl1MzIgdGR2aFs2XTsKKwl1MzIgdGZzX21pbls2XTsK Kwl1MzIgdGxpX21heFs2XTsKKwl1MzIgdG1saVs2XTsKKwl1MzIgdGF6WzZdOworCXUzMiB0emFo WzZdOworCXUzMiB0ZW52X21pbls2XTsKKwl1MzIgdHNyWzZdOworCXUzMiB0cmZzWzZdOworCXUz MiB0cnBbNl07CisJdTMyIHRhY2tbNl07CisJdTMyIHRzc1s2XTsKK307CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgdWRtYXNwZWMgdWRtYXNwZWM2NiA9IHsKKwl7IDgsICA1LCAgNCwgIDMsICAyLCAg Mn0sCisJezE2LCAxMSwgIDgsICA2LCAgNCAsIDJ9LAorCXsgMSwgIDEsICAxLCAgMSwgIDEsICAx fSwKKwl7IDEsICAxLCAgMSwgIDEsICAxLCAgMX0sCisJeyA1LCAgNCwgIDMsICAyLCAgMSwgIDF9 LAorCXsgMSwgIDEsICAxLCAgMSwgIDEsICAxfSwKKwl7MTYsIDE0LCAxMiwgIDksICA4LCAgNn0s CisJezEwLCAxMCwgMTAsICA3LCAgOCwgIDV9LAorCXsgMiwgIDIsICAyLCAgMiwgIDIsICAyfSwK Kwl7IDEsICAxLCAgMSwgIDEsICAxLCAgMX0sCisJeyAyLCAgMiwgIDIsICAyLCAgMiwgIDJ9LAor CXsgMiwgIDIsICAyLCAgMiwgIDIsICAyfSwKKwl7IDMsICAyLCAgMiwgIDIsICAyLCAgMn0sCisJ eyA1LCAgNSwgIDQsICA0LCAgNCwgIDR9LAorCXsxMSwgIDksICA3LCAgNywgIDcsICA2fSwKKwl7 IDIsICAyLCAgMiwgIDIsICAyLCAgMn0sCisJeyA0LCAgNCwgIDQsICA0LCAgNCwgIDR9Cit9Owor CitzdGF0aWMgY29uc3Qgc3RydWN0IHVkbWFzcGVjIHVkbWFzcGVjMTMyID0geworCXsxNSwgMTAs ICA2LCAgNywgIDIsICAzfSwKKwl7MzEsIDIxLCAxMiwgMTIsICA1LCAgNn0sCisJeyAyLCAgMiwg IDEsICAxLCAgMCwgIDF9LAorCXsgMSwgIDEsICAxLCAgMSwgIDAsICAxfSwKKwl7MTAsICA3LCAg NSwgIDMsICAxLCAgMX0sCisJeyAxLCAgMSwgIDEsICAxLCAgMSwgIDF9LAorCXszMCwgMjcsIDIz LCAxNSwgMTYsIDEyfSwKKwl7MjAsIDIwLCAyMCwgMTMsIDE0LCAxMH0sCisJeyAzLCAgMywgIDMs ICAzLCAgMiwgIDN9LAorCXsgMiwgIDIsICAyLCAgMiwgIDEsICAyfSwKKwl7IDMsICAzLCAgMywg IDMsICAyLCAgM30sCisJeyAzLCAgMywgIDMsICAzLCAgMiwgIDN9LAorCXsgNywgIDQsICAzLCAg MywgIDIsICAzfSwKKwl7MTAsIDEwLCAgOCwgIDgsICA3LCAgN30sCisJezIyLCAxNywgMTQsIDE0 LCAxMywgMTJ9LAorCXsgMywgIDMsICAzLCAgMywgIDIsICAzfSwKKwl7IDcsICA3LCAgNywgIDcs ICA2LCAgN30sCit9OworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQogCiAvKiBCaXQgZGVmaW5pdGlvbnMgaW5zaWRlIHRoZSByZWdpc3RlcnMgKi8KICNkZWZpbmUg TVBDNTJ4eF9BVEFfSE9TVENPTkZfU01SCTB4ODAwMDAwMDBVTCAvKiBTdGF0ZSBtYWNoaW5lIHJl c2V0ICovCkBAIC03NSw2ICsxOTMsOCBAQAogI2RlZmluZSBNUEM1Mnh4X0FUQV9ETUFNT0RFX0ZS CQkweDIwIC8qIEZJRk8gUmVzZXQgKi8KICNkZWZpbmUgTVBDNTJ4eF9BVEFfRE1BTU9ERV9IVVQJ CTB4NDAgLyogSG9zdCBVRE1BIGJ1cnN0IHRlcm1pbmF0ZSAqLwogCisjZGVmaW5lIE1BWF9ETUFf QlVGRkVSUyAxMjgKKyNkZWZpbmUgTUFYX0RNQV9CVUZGRVJfU0laRSAweDIwMDAwdQogCiAvKiBT dHJ1Y3R1cmUgb2YgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyAqLwogc3RydWN0IG1wYzUyeHhfYXRh IHsKQEAgLTEzMyw2ICsyNTMsOSBAQAogCXU4ICByZXNlcnZlZDIxWzJdOwogfTsKIAorLyogQmVz dENvbW0gbG9ja2luZyAqLwordW5zaWduZWQgbG9uZyBwYXRhX21wYzUyeHhfYXRhX2RtYV9sb2Nr ID0gMDsKK3N0cnVjdCBiY29tX3Rhc2tfMiAqcGF0YV9tcGM1Mnh4X2F0YV9kbWFfdGFzazsKIAog LyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09ICovCiAvKiBBdXggZm5zICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTE0MSw2ICsy NjQsMTkgQEAKIAogLyogTVBDNTJ4eCBsb3cgbGV2ZWwgaHcgY29udHJvbCAqLwogCitzdGF0aWMg aW5saW5lIHZvaWQKK21wYzUyeHhfYXRhX3dhaXRfdGlwX2JpdF9jbGVhcihzdHJ1Y3QgbXBjNTJ4 eF9hdGEgX19pb21lbSAqcmVncykKK3sKKwlpbnQgdGltZW91dCA9IDEwMDA7CisKKwl3aGlsZSAo aW5fYmUzMigmcmVncy0+aG9zdF9zdGF0dXMpICYgTVBDNTJ4eF9BVEFfSE9TVFNUQVRfVElQKQor CQlpZiAodGltZW91dC0tID09IDApIHsKKwkJCXByaW50ayhLRVJOX0VSUiAibXBjNTJ4eC1pZGU6 IFRpbWVvdXQgd2FpdGluZyBmb3IgVElQIGNsZWFyXG4iKTsKKwkJCWJyZWFrOworCQl9CisJdWRl bGF5KDEwKTsgICAgIC8qIEZJWE1FOiBOZWNlc3NhcnkgPz8/ICovCit9CisKIHN0YXRpYyBpbnQK IG1wYzUyeHhfYXRhX2NvbXB1dGVfcGlvX3RpbWluZ3Moc3RydWN0IG1wYzUyeHhfYXRhX3ByaXYg KnByaXYsIGludCBkZXYsIGludCBwaW8pCiB7CkBAIC0xNjUsNiArMzAxLDk1IEBACiAJcmV0dXJu IDA7CiB9CiAKK3N0YXRpYyBpbnQKK21wYzUyeHhfYXRhX2NvbXB1dGVfbWRtYV90aW1pbmdzKHN0 cnVjdCBtcGM1Mnh4X2F0YV9wcml2ICpwcml2LCBpbnQgZGV2LCBpbnQgc3BlZWQpCit7CisJc3Ry dWN0IG1wYzUyeHhfYXRhX3RpbWluZ3MgKnRpbWluZyA9ICZwcml2LT50aW1pbmdzW2Rldl07CisJ dTMyIHQwTSwgdGQsIHRrdywgdG0sIHRoLCB0aiwgdG47CisKKwlpZiAoc3BlZWQgPCAwIHx8IHNw ZWVkID4gMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ME0gPSBwcml2LT5tZG1hc3BlYy0+dDBN W3NwZWVkXTsKKwl0ZCA9IHByaXYtPm1kbWFzcGVjLT50ZFtzcGVlZF07CisJdGt3ID0gcHJpdi0+ bWRtYXNwZWMtPnRrd1tzcGVlZF07CisJdG0gPSBwcml2LT5tZG1hc3BlYy0+dG1bc3BlZWRdOwor CXRoID0gcHJpdi0+bWRtYXNwZWMtPnRoW3NwZWVkXTsKKwl0aiA9IHByaXYtPm1kbWFzcGVjLT50 altzcGVlZF07CisJdG4gPSBwcml2LT5tZG1hc3BlYy0+dG5bc3BlZWRdOworCisJRFBSSU5USyAo InQwTSA9ICVkXG4iLCB0ME0pOworCURQUklOVEsgKCJ0ZCAgPSAlZFxuIiwgdGQpOworCURQUklO VEsgKCJ0a3cgPSAlZFxuIiwgdGt3KTsKKwlEUFJJTlRLICgidG0gID0gJWRcbiIsIHRtKTsKKwlE UFJJTlRLICgidGggID0gJWRcbiIsIHRoKTsKKwlEUFJJTlRLICgidGogID0gJWRcbiIsIHRqKTsK KwlEUFJJTlRLICgidG4gID0gJWRcbiIsIHRuKTsKKworCXRpbWluZy0+bWRtYTEgPSAodDBNIDw8 IDI0KSB8ICh0ZCA8PCAxNikgfCAodGt3IDw8IDgpIHwgKHRtKTsKKwl0aW1pbmctPm1kbWEyID0g KHRoIDw8IDI0KSB8ICh0aiA8PCAxNikgfCAodG4gPDwgOCk7CisKKwl0aW1pbmctPnVzaW5nX3Vk bWEgPSAwOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK21wYzUyeHhfYXRhX2NvbXB1 dGVfdWRtYV90aW1pbmdzKHN0cnVjdCBtcGM1Mnh4X2F0YV9wcml2ICpwcml2LCBpbnQgZGV2LCBp bnQgc3BlZWQpCit7CisJc3RydWN0IG1wYzUyeHhfYXRhX3RpbWluZ3MgKnRpbWluZyA9ICZwcml2 LT50aW1pbmdzW2Rldl07CisJdTMyIHQyY3ljLCB0Y3ljLCB0ZHMsIHRkaCwgdGR2cywgdGR2aCwg dGZzLCB0bGksIHRtbGksIHRheiwgdGVudiwgdHNyLCB0c3MsIHRyZnMsIHRycCwgdGFjaywgdHph aDsKKworCWlmIChzcGVlZCA8IDAgfHwgc3BlZWQgPiAyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor CXQyY3ljID0gcHJpdi0+dWRtYXNwZWMtPnQyY3ljW3NwZWVkXTsKKwl0Y3ljID0gcHJpdi0+dWRt YXNwZWMtPnRjeWNbc3BlZWRdOworCXRkcyA9IHByaXYtPnVkbWFzcGVjLT50ZHNbc3BlZWRdOwor CXRkaCA9IHByaXYtPnVkbWFzcGVjLT50ZGhbc3BlZWRdOworCXRkdnMgPSBwcml2LT51ZG1hc3Bl Yy0+dGR2c1tzcGVlZF07CisJdGR2aCA9IHByaXYtPnVkbWFzcGVjLT50ZHZoW3NwZWVkXTsKKwl0 ZnMgPSBwcml2LT51ZG1hc3BlYy0+dGZzX21pbltzcGVlZF07CisJdG1saSA9IHByaXYtPnVkbWFz cGVjLT50bWxpW3NwZWVkXTsKKwl0ZW52ID0gcHJpdi0+dWRtYXNwZWMtPnRlbnZfbWluW3NwZWVk XTsKKwl0c3MgPSBwcml2LT51ZG1hc3BlYy0+dHNzW3NwZWVkXTsKKwl0cnAgPSBwcml2LT51ZG1h c3BlYy0+dHJwW3NwZWVkXTsKKwl0YWNrID0gcHJpdi0+dWRtYXNwZWMtPnRhY2tbc3BlZWRdOwor CXR6YWggPSBwcml2LT51ZG1hc3BlYy0+dHphaFtzcGVlZF07CisJdGF6ID0gcHJpdi0+dWRtYXNw ZWMtPnRheltzcGVlZF07CisJdHJmcyA9IHByaXYtPnVkbWFzcGVjLT50cmZzW3NwZWVkXTsKKwl0 c3IgPSBwcml2LT51ZG1hc3BlYy0+dHNyW3NwZWVkXTsKKwl0bGkgPSBwcml2LT51ZG1hc3BlYy0+ dGxpX21heFtzcGVlZF07CisKKwlEUFJJTlRLICgiVURNQSB0MmN5YyA9ICVkXG4iLCB0MmN5Yyk7 CisJRFBSSU5USyAoIlVETUEgdGN5YyAgPSAlZFxuIiwgdGN5Yyk7CisJRFBSSU5USyAoIlVETUEg dGRzICAgPSAlZFxuIiwgdGRzKTsKKwlEUFJJTlRLICgiVURNQSB0ZGggICA9ICVkXG4iLCB0ZGgp OworCURQUklOVEsgKCJVRE1BIHRkdnMgID0gJWRcbiIsIHRkdnMpOworCURQUklOVEsgKCJVRE1B IHRkdmggID0gJWRcbiIsIHRkdmgpOworCURQUklOVEsgKCJVRE1BIHRmcyAgID0gJWRcbiIsIHRm cyk7CisJRFBSSU5USyAoIlVETUEgdGxpICAgPSAlZFxuIiwgdGxpKTsKKwlEUFJJTlRLICgiVURN QSB0bWxpICA9ICVkXG4iLCB0bWxpKTsKKwlEUFJJTlRLICgiVURNQSB0YXogICA9ICVkXG4iLCB0 YXopOworCURQUklOVEsgKCJVRE1BIHRlbnYgID0gJWRcbiIsIHRlbnYpOworCURQUklOVEsgKCJV RE1BIHRzciAgID0gJWRcbiIsIHRzcik7CisJRFBSSU5USyAoIlVETUEgdHNzICAgPSAlZFxuIiwg dHNzKTsKKwlEUFJJTlRLICgiVURNQSB0cmZzICA9ICVkXG4iLCB0cmZzKTsKKwlEUFJJTlRLICgi VURNQSB0cnAgICA9ICVkXG4iLCB0cnApOworCURQUklOVEsgKCJVRE1BIHRhY2sgID0gJWRcbiIs IHRhY2spOworCURQUklOVEsgKCJVRE1BIHR6YWggID0gJWRcbiIsIHR6YWgpOworCisJdGltaW5n LT51ZG1hMSA9ICh0MmN5YyA8PCAyNCkgfCAodGN5YyA8PCAxNikgfCAodGRzIDw8IDgpIHwgKHRk aCk7CisJdGltaW5nLT51ZG1hMiA9ICh0ZHZzIDw8IDI0KSB8ICh0ZHZoIDw8IDE2KSB8ICh0ZnMg PDwgOCkgfCAodGxpKTsKKwl0aW1pbmctPnVkbWEzID0gKHRtbGkgPDwgMjQpIHwgKHRheiA8PCAx NikgfCAodGVudiA8PCA4KSB8ICh0c3IpOworCXRpbWluZy0+dWRtYTQgPSAodHNzIDw8IDI0KSB8 ICh0cmZzIDw8IDE2KSB8ICh0cnAgPDwgOCkgfCAodGFjayk7CisJdGltaW5nLT51ZG1hNSA9ICh0 emFoIDw8IDI0KTsKKworCXRpbWluZy0+dXNpbmdfdWRtYSA9IDE7CisKKwlyZXR1cm4gMDsKK30K Kwogc3RhdGljIHZvaWQKIG1wYzUyeHhfYXRhX2FwcGx5X3RpbWluZ3Moc3RydWN0IG1wYzUyeHhf YXRhX3ByaXYgKnByaXYsIGludCBkZXZpY2UpCiB7CkBAIC0xNzMsMTQgKzM5OCwxMyBAQAogCiAJ b3V0X2JlMzIoJnJlZ3MtPnBpbzEsICB0aW1pbmctPnBpbzEpOwogCW91dF9iZTMyKCZyZWdzLT5w aW8yLCAgdGltaW5nLT5waW8yKTsKLQlvdXRfYmUzMigmcmVncy0+bWRtYTEsIDApOwotCW91dF9i ZTMyKCZyZWdzLT5tZG1hMiwgMCk7Ci0Jb3V0X2JlMzIoJnJlZ3MtPnVkbWExLCAwKTsKLQlvdXRf YmUzMigmcmVncy0+dWRtYTIsIDApOwotCW91dF9iZTMyKCZyZWdzLT51ZG1hMywgMCk7Ci0Jb3V0 X2JlMzIoJnJlZ3MtPnVkbWE0LCAwKTsKLQlvdXRfYmUzMigmcmVncy0+dWRtYTUsIDApOwotCisJ b3V0X2JlMzIoJnJlZ3MtPm1kbWExLCB0aW1pbmctPm1kbWExKTsKKwlvdXRfYmUzMigmcmVncy0+ bWRtYTIsIHRpbWluZy0+bWRtYTIpOworCW91dF9iZTMyKCZyZWdzLT51ZG1hMSwgdGltaW5nLT51 ZG1hMSk7CisJb3V0X2JlMzIoJnJlZ3MtPnVkbWEyLCB0aW1pbmctPnVkbWEyKTsKKwlvdXRfYmUz MigmcmVncy0+dWRtYTMsIHRpbWluZy0+dWRtYTMpOworCW91dF9iZTMyKCZyZWdzLT51ZG1hNCwg dGltaW5nLT51ZG1hNCk7CisJb3V0X2JlMzIoJnJlZ3MtPnVkbWE1LCB0aW1pbmctPnVkbWE1KTsK IAlwcml2LT5jc2VsID0gZGV2aWNlOwogfQogCkBAIC0yNDUsNiArNDY5LDI4IEBACiAJbXBjNTJ4 eF9hdGFfYXBwbHlfdGltaW5ncyhwcml2LCBhZGV2LT5kZXZubyk7CiB9CiBzdGF0aWMgdm9pZAor bXBjNTJ4eF9hdGFfc2V0X2RtYW1vZGUoc3RydWN0IGF0YV9wb3J0ICphcCwgc3RydWN0IGF0YV9k ZXZpY2UgKmFkZXYpCit7CisJc3RydWN0IG1wYzUyeHhfYXRhX3ByaXYgKnByaXYgPSBhcC0+aG9z dC0+cHJpdmF0ZV9kYXRhOworCWludCBydjsKKworCWlmIChhZGV2LT5kbWFfbW9kZSA+PSBYRkVS X1VETUFfMCkgeworCQlpbnQgZG1hID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX1VETUFfMDsKKwkJ cnYgPSBtcGM1Mnh4X2F0YV9jb21wdXRlX3VkbWFfdGltaW5ncyhwcml2LCBhZGV2LT5kZXZubywg ZG1hKTsKKwl9IGVsc2UgeworCQlpbnQgZG1hID0gYWRldi0+ZG1hX21vZGUgLSBYRkVSX01XX0RN QV8wOworCQlydiA9IG1wYzUyeHhfYXRhX2NvbXB1dGVfbWRtYV90aW1pbmdzKHByaXYsIGFkZXYt PmRldm5vLCBkbWEpOworCX0KKworCWlmIChydikgeworCQlwcmludGsoS0VSTl9FUlIgRFJWX05B TUUKKwkJCSI6IFRyeWluZyB0byBzZWxlY3QgaW52YWxpZCBETUEgbW9kZSAlZFxuIiwgYWRldi0+ ZG1hX21vZGUpOworCQlyZXR1cm47CisJfQorCisJbXBjNTJ4eF9hdGFfYXBwbHlfdGltaW5ncyhw cml2LCBhZGV2LT5kZXZubyk7Cit9CitzdGF0aWMgdm9pZAogbXBjNTJ4eF9hdGFfZGV2X3NlbGVj dChzdHJ1Y3QgYXRhX3BvcnQgKmFwLCB1bnNpZ25lZCBpbnQgZGV2aWNlKQogewogCXN0cnVjdCBt cGM1Mnh4X2F0YV9wcml2ICpwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKQEAgLTI1NSwx NiArNTAxLDE5MiBAQAogCWF0YV9zZmZfZGV2X3NlbGVjdChhcCxkZXZpY2UpOwogfQogCitzdGF0 aWMgdm9pZAorbXBjNTJ4eF9zZmZfZXhlY19jb21tYW5kKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNv bnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKQoreworCXN0cnVjdCBtcGM1Mnh4X2F0YV9wcml2 ICpwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKworCW1wYzUyeHhfYXRhX3dhaXRfdGlw X2JpdF9jbGVhcihwcml2LT5hdGFfcmVncyk7CisJYXRhX3NmZl9leGVjX2NvbW1hbmQoYXAsIHRm KTsKK30KKworc3RhdGljIGludAorbXBjNTJ4eF9hdGFfYnVpbGRfZG1hdGFibGUoc3RydWN0IGF0 YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOworCXN0 cnVjdCBtcGM1Mnh4X2F0YV9wcml2ICpwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0YTsKKwlz dHJ1Y3QgbXBjNTJ4eF9hdGEgX19pb21lbSAqcmVnc19wYSA9IHByaXYtPmF0YV9yZWdzX3BhOwor CXVuc2lnbmVkIGludCByZWFkID0gIShxYy0+dGYuZmxhZ3MgJiBBVEFfVEZMQUdfV1JJVEUpLCBz aTsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCWludCBjb3VudCA9IDA7CisKKwlpZiAocmVh ZCkKKwkJYmNvbV9hdGFfcnhfcHJlcGFyZShwcml2LT5kbWF0c2spOworCWVsc2UKKwkJYmNvbV9h dGFfdHhfcHJlcGFyZShwcml2LT5kbWF0c2spOworCisJZm9yX2VhY2hfc2cocWMtPnNnLCBzZywg cWMtPm5fZWxlbSwgc2kpIHsKKwkJdTMyIGN1cl9hZGRyID0gc2dfZG1hX2FkZHJlc3Moc2cpOwor CQl1MzIgY3VyX2xlbiA9IHNnX2RtYV9sZW4oc2cpOworCisJCXdoaWxlIChjdXJfbGVuKSB7CisJ CQl1bnNpZ25lZCBpbnQgdGMgPSBtaW4oY3VyX2xlbiwgTUFYX0RNQV9CVUZGRVJfU0laRSk7CisJ CQlzdHJ1Y3QgYmNvbV9hdGFfYmQgKmJkID0gKHN0cnVjdCBiY29tX2F0YV9iZCAqKSBiY29tX3By ZXBhcmVfbmV4dF9idWZmZXJfMigoc3RydWN0IGJjb21fdGFza18yICopIHByaXYtPmRtYXRzayk7 CisKKwkJCWlmIChyZWFkKSB7CisJCQkJYmQtPnN0YXR1cyA9IHRjOworCQkJCWJkLT5zcmNfcGEg PSAoX19mb3JjZSB1MzIpICZyZWdzX3BhLT5maWZvX2RhdGE7CisJCQkJYmQtPmRzdF9wYSA9IGN1 cl9hZGRyOworCisJCQkJaW52YWxpZGF0ZV9kY2FjaGVfcmFuZ2UoKF9fZm9yY2UgdTMyKSBwaHlz X3RvX3ZpcnQoY3VyX2FkZHIpLCAoX19mb3JjZSB1MzIpIHBoeXNfdG9fdmlydChjdXJfYWRkcikg KyAoX19mb3JjZSB1MzIpIGN1cl9sZW4pOworCQkJfSBlbHNlIHsKKwkJCQliZC0+c3RhdHVzID0g dGM7CisJCQkJYmQtPnNyY19wYSA9IGN1cl9hZGRyOworCQkJCWJkLT5kc3RfcGEgPSAoX19mb3Jj ZSB1MzIpICZyZWdzX3BhLT5maWZvX2RhdGE7CisKKwkJCQlmbHVzaF9kY2FjaGVfcmFuZ2UoKF9f Zm9yY2UgdTMyKSBwaHlzX3RvX3ZpcnQoY3VyX2FkZHIpLCAoX19mb3JjZSB1MzIpIHBoeXNfdG9f dmlydChjdXJfYWRkcikgKyAoX19mb3JjZSB1MzIpIGN1cl9sZW4pOworCQkJfQorCisJCQliY29t X3N1Ym1pdF9uZXh0X2J1ZmZlcl8yKChzdHJ1Y3QgYmNvbV90YXNrXzIgKikgcHJpdi0+ZG1hdHNr LCBOVUxMKTsKKworCQkJY3VyX2FkZHIgKz0gdGM7CisJCQljdXJfbGVuIC09IHRjOworCQkJY291 bnQrKzsKKworCQkJaWYgKGNvdW50ID09IE1BWF9ETUFfQlVGRkVSUykgeworCQkJCXByaW50ayhL RVJOX0FMRVJUICIlczogJWkgZG1hIHRhYmxlIHRvbyBzbWFsbFxuIiwgX19mdW5jX18sIF9fTElO RV9fKTsKKwkJCQlnb3RvIHVzZV9waW9faW5zdGVhZDsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4g MTsKKwordXNlX3Bpb19pbnN0ZWFkOgorCWJjb21fYXRhX3Jlc2V0X2JkKHByaXYtPmRtYXRzayk7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQKK21wYzUyeHhfYm1kbWFfc2V0dXAoc3Ry dWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFw OworCXN0cnVjdCBtcGM1Mnh4X2F0YV9wcml2ICpwcml2ID0gYXAtPmhvc3QtPnByaXZhdGVfZGF0 YTsKKwlzdHJ1Y3QgbXBjNTJ4eF9hdGEgX19pb21lbSAqcmVncyA9IHByaXYtPmF0YV9yZWdzOwor CisJdW5zaWduZWQgaW50IHJlYWQgPSAhKHFjLT50Zi5mbGFncyAmIEFUQV9URkxBR19XUklURSk7 CisJdTggZG1hX21vZGU7CisKKwlpZiAoIW1wYzUyeHhfYXRhX2J1aWxkX2RtYXRhYmxlKHFjKSkg eworCQlwcmludGsoS0VSTl9BTEVSVCAiJXM6ICVpLCByZXR1cm4gMT9cbiIsIF9fZnVuY19fLCBf X0xJTkVfXyk7CisJfQorCisJaWYgKHJlYWQpIHsKKwkJZG1hX21vZGUgPSBNUEM1Mnh4X0FUQV9E TUFNT0RFX0lFIHwgTVBDNTJ4eF9BVEFfRE1BTU9ERV9SRUFEIHwKKwkJCQlNUEM1Mnh4X0FUQV9E TUFNT0RFX0ZFOworCisJCS8qIFNldHVwIEZJRk8gaWYgZGlyZWN0aW9uIGNoYW5nZWQgKi8KKwkJ aWYgKHByaXYtPm1wYzUyeHhfYXRhX2RtYV9sYXN0X3dyaXRlICE9IDApIHsKKwkJCXByaXYtPm1w YzUyeHhfYXRhX2RtYV9sYXN0X3dyaXRlID0gMDsKKwkJCW1wYzUyeHhfYXRhX3dhaXRfdGlwX2Jp dF9jbGVhcihyZWdzKTsKKworCQkJLyogQ29uZmlndXJlIEZJRk8gd2l0aCBncmFudWxhcml0eSB0 byA3IGxpa2Ugc2FtcGxlIGNvZGUgKi8KKwkJCW91dF84KCZyZWdzLT5maWZvX2NvbnRyb2wsIDcp OworCQkJb3V0X2JlMTYoJnJlZ3MtPmZpZm9fYWxhcm0sIDEyOCk7CisKKwkJCS8qIFNldCBGSUZP IFJlc2V0IGJpdCAoRlIpICovCisJCQlvdXRfOCgmcmVncy0+ZG1hX21vZGUsIE1QQzUyeHhfQVRB X0RNQU1PREVfRlIpOworCQl9CisJfSBlbHNlIHsKKwkJZG1hX21vZGUgPSBNUEM1Mnh4X0FUQV9E TUFNT0RFX0lFIHwgTVBDNTJ4eF9BVEFfRE1BTU9ERV9XUklURTsKKworCQkvKiBTZXR1cCBGSUZP IGlmIGRpcmVjdGlvbiBjaGFuZ2VkICovCisJCWlmIChwcml2LT5tcGM1Mnh4X2F0YV9kbWFfbGFz dF93cml0ZSAhPSAxKSB7CisJCQlwcml2LT5tcGM1Mnh4X2F0YV9kbWFfbGFzdF93cml0ZSA9IDE7 CisJCQltcGM1Mnh4X2F0YV93YWl0X3RpcF9iaXRfY2xlYXIocmVncyk7CisKKwkJCS8qIENvbmZp Z3VyZSBGSUZPIHdpdGggZ3JhbnVsYXJpdHkgdG8gNCBsaWtlIHNhbXBsZSBjb2RlICovCisJCQlv dXRfOCgmcmVncy0+Zmlmb19jb250cm9sLCA0KTsKKwkJCW91dF9iZTE2KCZyZWdzLT5maWZvX2Fs YXJtLCAxMjgpOworCQl9CisJfQorCisJaWYgKHByaXYtPnRpbWluZ3NbcWMtPmRldi0+ZGV2bm9d LnVzaW5nX3VkbWEpCisJCWRtYV9tb2RlIHw9IE1QQzUyeHhfQVRBX0RNQU1PREVfVURNQTsKKwor CW1wYzUyeHhfYXRhX3dhaXRfdGlwX2JpdF9jbGVhcihyZWdzKTsKKwlvdXRfOCgmcmVncy0+ZG1h X21vZGUsIGRtYV9tb2RlKTsKKworCXByaXYtPndhaXRpbmdfZm9yX2RtYSA9IEFUQV9ETUFfQUNU SVZFOworCisJYXRhX3dhaXRfaWRsZShhcCk7CisJYXAtPm9wcy0+c2ZmX2V4ZWNfY29tbWFuZChh cCwgJnFjLT50Zik7Cit9CisKK3N0YXRpYyB2b2lkCittcGM1Mnh4X2JtZG1hX3N0YXJ0KHN0cnVj dCBhdGFfcXVldWVkX2NtZCAqcWMpCit7CisJc3RydWN0IGF0YV9wb3J0ICphcCA9IHFjLT5hcDsK KwlzdHJ1Y3QgbXBjNTJ4eF9hdGFfcHJpdiAqcHJpdiA9IGFwLT5ob3N0LT5wcml2YXRlX2RhdGE7 CisKKwkvKiBMb2NhbEJ1cyBsb2NrICovCisJd2hpbGUgKHRlc3RfYW5kX3NldF9iaXQoMCwgJnBh dGFfbXBjNTJ4eF9hdGFfZG1hX2xvY2spICE9IDApCisJCTsKKworCWJjb21fc2V0X3Rhc2tfYXV0 b19zdGFydChwcml2LT5kbWF0c2stPnRhc2tudW0sIHByaXYtPmRtYXRzay0+dGFza251bSB8IDB4 NDApOworCWJjb21fZW5hYmxlKHByaXYtPmRtYXRzayk7Cit9CisKK3N0YXRpYyB2b2lkCittcGM1 Mnh4X2JtZG1hX3N0b3Aoc3RydWN0IGF0YV9xdWV1ZWRfY21kICpxYykKK3sKKwlzdHJ1Y3QgYXRh X3BvcnQgKmFwID0gcWMtPmFwOworCXN0cnVjdCBtcGM1Mnh4X2F0YV9wcml2ICpwcml2ID0gYXAt Pmhvc3QtPnByaXZhdGVfZGF0YTsKKworCWJjb21fZGlzYWJsZShwcml2LT5kbWF0c2spOworCWJj b21fYXRhX3Jlc2V0X2JkKHByaXYtPmRtYXRzayk7CisKKwkvKiBMb2NhbEJ1cyB1bmxvY2sqLwor CWNsZWFyX2JpdCgwLCAmcGF0YV9tcGM1Mnh4X2F0YV9kbWFfbG9jayk7CisKKwlwcml2LT53YWl0 aW5nX2Zvcl9kbWEgPSAwOworfQorCitzdGF0aWMgdTgKK21wYzUyeHhfYm1kbWFfc3RhdHVzKHN0 cnVjdCBhdGFfcG9ydCAqYXApCit7CisJc3RydWN0IG1wYzUyeHhfYXRhX3ByaXYgKnByaXYgPSBh cC0+aG9zdC0+cHJpdmF0ZV9kYXRhOworCXJldHVybiBwcml2LT53YWl0aW5nX2Zvcl9kbWE7Cit9 CisKK3N0YXRpYyBpcnFyZXR1cm5fdAorbXBjNTJ4eF9hdGFfdGFza19pcnEoaW50IGlycSwgdm9p ZCAqdnByaXYpCit7CisJc3RydWN0IG1wYzUyeHhfYXRhX3ByaXYgKnByaXYgPSB2cHJpdjsKKwlw cml2LT53YWl0aW5nX2Zvcl9kbWEgfD0gQVRBX0RNQV9JTlRSOworCisJcmV0dXJuIElSUV9IQU5E TEVEOworfQorCiBzdGF0aWMgc3RydWN0IHNjc2lfaG9zdF90ZW1wbGF0ZSBtcGM1Mnh4X2F0YV9z aHQgPSB7CiAJQVRBX1BJT19TSFQoRFJWX05BTUUpLAogfTsKIAogc3RhdGljIHN0cnVjdCBhdGFf cG9ydF9vcGVyYXRpb25zIG1wYzUyeHhfYXRhX3BvcnRfb3BzID0gewogCS5pbmhlcml0cwkJPSAm YXRhX3NmZl9wb3J0X29wcywKLQkuc2ZmX2Rldl9zZWxlY3QJCT0gbXBjNTJ4eF9hdGFfZGV2X3Nl bGVjdCwKLQkuY2FibGVfZGV0ZWN0CQk9IGF0YV9jYWJsZV80MHdpcmUsCisKIAkuc2V0X3Bpb21v ZGUJCT0gbXBjNTJ4eF9hdGFfc2V0X3Bpb21vZGUsCi0JLnBvc3RfaW50ZXJuYWxfY21kCT0gQVRB X09QX05VTEwsCisJLnNldF9kbWFtb2RlCQk9IG1wYzUyeHhfYXRhX3NldF9kbWFtb2RlLAorCisJ LnNmZl9leGVjX2NvbW1hbmQJPSBtcGM1Mnh4X3NmZl9leGVjX2NvbW1hbmQsCisJLnNmZl9kZXZf c2VsZWN0CQk9IG1wYzUyeHhfYXRhX2Rldl9zZWxlY3QsCisKKwkuYm1kbWFfc2V0dXAJCT0gbXBj NTJ4eF9ibWRtYV9zZXR1cCwKKwkuYm1kbWFfc3RhcnQJCT0gbXBjNTJ4eF9ibWRtYV9zdGFydCwK KwkuYm1kbWFfc3RvcAkJPSBtcGM1Mnh4X2JtZG1hX3N0b3AsCisJLmJtZG1hX3N0YXR1cwkJPSBt cGM1Mnh4X2JtZG1hX3N0YXR1cywKKworCS5xY19wcmVwCQk9IGF0YV9ub29wX3FjX3ByZXAsCiB9 OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdApAQCAtMjgxLDkgKzcwMywxNCBAQAogCiAJYXAgPSBo b3N0LT5wb3J0c1swXTsKIAlhcC0+ZmxhZ3MJCXw9IEFUQV9GTEFHX1NMQVZFX1BPU1M7Ci0JYXAt PnBpb19tYXNrCQk9IDB4MWY7CS8qIFVwIHRvIFBJTzQgKi8KLQlhcC0+bXdkbWFfbWFzawkJPSAw eDAwOwkvKiBObyBNV0RNQSAgICovCi0JYXAtPnVkbWFfbWFzawkJPSAweDAwOwkvKiBObyBVRE1B ICAgICovCisJYXAtPnBpb19tYXNrCQk9IEFUQV9QSU80OwkvKiBVcCB0byBQSU80ICovCisjaWZk ZWYgQ09ORklHX1BBVEFfTVBDNTJ4eF9ETUEKKwlhcC0+bXdkbWFfbWFzawkJPSAweDA3OwkJLyog VXAgdG8gTVdETUEyICovCisJYXAtPnVkbWFfbWFzawkJPSBBVEFfVURNQTI7CS8qIFVwIHRvIFVE TUEyICovCisjZWxzZQorCWFwLT5td2RtYV9tYXNrCQk9IDB4MDA7CQkvKiBObyBNV0RNQSAqLwor CWFwLT51ZG1hX21hc2sJCT0gMHgwMDsJCS8qIE5vIFVETUEgKi8KKyNlbmRpZgogCWFwLT5vcHMJ CQk9ICZtcGM1Mnh4X2F0YV9wb3J0X29wczsKIAlob3N0LT5wcml2YXRlX2RhdGEJPSBwcml2Owog CkBAIC0zMzMsNyArNzYwLDcgQEAKIAlpbnQgYXRhX2lycTsKIAlzdHJ1Y3QgbXBjNTJ4eF9hdGEg X19pb21lbSAqYXRhX3JlZ3M7CiAJc3RydWN0IG1wYzUyeHhfYXRhX3ByaXYgKnByaXY7Ci0JaW50 IHJ2OworCWludCBydiwgcmV0LCB0YXNrX2lycTsKIAogCS8qIEdldCBpcGIgZnJlcXVlbmN5ICov CiAJaXBiX2ZyZXEgPSBtcGM1Mnh4X2ZpbmRfaXBiX2ZyZXEob3AtPm5vZGUpOwpAQCAtMzg5LDgg KzgxNiwzMSBAQAogCiAJcHJpdi0+aXBiX3BlcmlvZCA9IDEwMDAwMDAwMDAgLyAoaXBiX2ZyZXEg LyAxMDAwKTsKIAlwcml2LT5hdGFfcmVncyA9IGF0YV9yZWdzOworCXByaXYtPmF0YV9yZWdzX3Bh ID0gKHN0cnVjdCBtcGM1Mnh4X2F0YSBfX2lvbWVtICopIHJlc19tZW0uc3RhcnQ7CiAJcHJpdi0+ YXRhX2lycSA9IGF0YV9pcnE7CiAJcHJpdi0+Y3NlbCA9IC0xOworCXByaXYtPm1wYzUyeHhfYXRh X2RtYV9sYXN0X3dyaXRlID0gLTE7CisKKwlpZiAoaXBiX2ZyZXEvMTAwMDAwMCA9PSA2Nikgewor CQlwcml2LT5tZG1hc3BlYyA9ICZtZG1hc3BlYzY2OworCQlwcml2LT51ZG1hc3BlYyA9ICZ1ZG1h c3BlYzY2OworCX0gZWxzZSB7CisJCXByaXYtPm1kbWFzcGVjID0gJm1kbWFzcGVjMTMyOworCQlw cml2LT51ZG1hc3BlYyA9ICZ1ZG1hc3BlYzEzMjsKKwl9CisKKwlwcml2LT5kbWF0c2sgPSBiY29t X2F0YV9pbml0KE1BWF9ETUFfQlVGRkVSUywgTUFYX0RNQV9CVUZGRVJfU0laRSk7CisJcGF0YV9t cGM1Mnh4X2F0YV9kbWFfdGFzayA9IChzdHJ1Y3QgYmNvbV90YXNrXzIgKikgcHJpdi0+ZG1hdHNr OworCWlmICghcHJpdi0+ZG1hdHNrKSB7CisJCXByaW50ayhLRVJOX0FMRVJUICIlczogJWlcbiIs IF9fZnVuY19fLCBfX0xJTkVfXyk7CisJCXJ2ID0gLUVOT01FTTsKKwkJZ290byBlcnI7CisJfQor CisJdGFza19pcnEgPSBiY29tX2dldF90YXNrX2lycShwcml2LT5kbWF0c2spOworCXJldCA9IHJl cXVlc3RfaXJxKHRhc2tfaXJxLCAmbXBjNTJ4eF9hdGFfdGFza19pcnEsIElSUUZfRElTQUJMRUQs ICJBVEEgdGFzayIsIHByaXYpOworCWlmIChyZXQpCisJCXByaW50ayhLRVJOX0FMRVJUICIlczog cmVxdWVzdF9pcnEgZmFpbGVkIHdpdGg6ICVpXG4iLCBfX2Z1bmNfXywgcmV0KTsKIAogCS8qIElu aXQgdGhlIGh3ICovCiAJcnYgPSBtcGM1Mnh4X2F0YV9od19pbml0KHByaXYpOwo= ------=_Part_46152_22134491.1213691305186--