From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6152 invoked by alias); 29 Mar 2011 10:12:00 -0000 Received: (qmail 6135 invoked by uid 22791); 29 Mar 2011 10:11:57 -0000 X-SWARE-Spam-Status: No, hits=-2.0 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,TW_GD,TW_LG,TW_MX,TW_NV,TW_PG,TW_TB,TW_VL,TW_VM X-Spam-Check-By: sourceware.org Received: from mail-yx0-f169.google.com (HELO mail-yx0-f169.google.com) (209.85.213.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 29 Mar 2011 10:11:52 +0000 Received: by yxt33 with SMTP id 33so2178yxt.0 for ; Tue, 29 Mar 2011 03:11:51 -0700 (PDT) Received: by 10.147.100.20 with SMTP id c20mr4592722yam.5.1301393511152; Tue, 29 Mar 2011 03:11:51 -0700 (PDT) MIME-Version: 1.0 Received: by 10.146.167.2 with HTTP; Tue, 29 Mar 2011 03:11:30 -0700 (PDT) In-Reply-To: <4C929A9C.1050601@vmware.com> References: <1255182393-15292-1-git-send-email-freephp@gmail.com> <4AD28E95.1050404@vmware.com> <7d77a27d0910111921v13a8e8acpb98c29a9aa72ed8@mail.gmail.com> <4C929A9C.1050601@vmware.com> From: Jiang Jilin Date: Tue, 29 Mar 2011 12:07:00 -0000 Message-ID: Subject: Re: [PATCH] Rewrite the codes for opcode 0x0f01 and add more instructions support To: Michael Snyder Cc: Hui Zhu , gdb-patches ml , "tromey@redhat.com" Content-Type: multipart/mixed; boundary=000e0cd3a9b8f1fb26049f9c491d X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2011-03/txt/msg01164.txt.bz2 --000e0cd3a9b8f1fb26049f9c491d Content-Type: text/plain; charset=ISO-8859-1 Content-length: 10305 Michael, Miss you! I hope you could get the patch. Sorry to Michael and Hui, it should be finished earlier. No regression found after testing precord.exp. Hui, please help review it. 2011-03-29 Jiang Jilin * i386-tdep.c (i386_process_record): Rewrite the codes for opcode 0x0f01 and add more instructions support --- gdb/i386-tdep.c | 281 ++++++++++++++++++++++++------------------------------- 1 files changed, 122 insertions(+), 159 deletions(-) diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c index c7ad3a6..94833cb 100644 --- a/gdb/i386-tdep.c +++ b/gdb/i386-tdep.c @@ -5802,174 +5802,137 @@ Do you want to stop the program?"), case 0x0f01: if (i386_record_modrm (&ir)) return -1; - switch (ir.reg) + if (ir.mod == 3) { - case 0: /* sgdt */ - { - uint64_t addr64; - - if (ir.mod == 3) - { - ir.addr -= 3; - opcode = opcode << 8 | ir.modrm; - goto no_support; - } - if (ir.override >= 0) - { - if (record_memory_query) - { - int q; + uint8_t reg_rm = (ir.reg << 4) | ir.rm; - target_terminal_ours (); - q = yquery (_("\ -Process record ignores the memory change of instruction at address %s\n\ -because it can't get the value of the segment register.\n\ -Do you want to stop the program?"), - paddress (gdbarch, ir.orig_addr)); - target_terminal_inferior (); - if (q) - return -1; - } - } - else - { - if (i386_record_lea_modrm_addr (&ir, &addr64)) - return -1; - if (record_arch_list_add_mem (addr64, 2)) - return -1; - addr64 += 2; + switch (reg_rm) + { + /* vmcall */ + case 0x01: + /* vmlaunch */ + case 0x02: + /* vmresume */ + case 0x03: + /* vmxoff */ + case 0x04: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; + /* monitor */ + case 0x10: + break; + /* mwait */ + case 0x11: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; + /* xgetbv */ + case 0x20: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM); + break; + /* xsetbv */ + case 0x21: + break; + /* swapgs */ + case 0x70: if (ir.regmap[X86_RECORD_R8_REGNUM]) + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM); + else { - if (record_arch_list_add_mem (addr64, 8)) - return -1; + ir.addr -= 3; + opcode = opcode << 8 | ir.modrm; + goto no_support; } - else + break; + /* rdtscp */ + case 0x71: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM); + break; + default: + /* smsw */ + if (ir.reg == 4) { - if (record_arch_list_add_mem (addr64, 4)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); + break; } - } - } - break; - case 1: - if (ir.mod == 3) - { - switch (ir.rm) - { - case 0: /* monitor */ - break; - case 1: /* mwait */ - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); - break; - default: - ir.addr -= 3; - opcode = opcode << 8 | ir.modrm; - goto no_support; - break; - } - } - else - { - /* sidt */ - if (ir.override >= 0) - { - if (record_memory_query) - { - int q; - - target_terminal_ours (); - q = yquery (_("\ -Process record ignores the memory change of instruction at address %s\n\ -because it can't get the value of the segment register.\n\ -Do you want to stop the program?"), - paddress (gdbarch, ir.orig_addr)); - target_terminal_inferior (); - if (q) - return -1; - } - } - else - { - uint64_t addr64; + /* lmsw */ + else if (ir.reg == 6) + break; - if (i386_record_lea_modrm_addr (&ir, &addr64)) - return -1; - if (record_arch_list_add_mem (addr64, 2)) - return -1; - addr64 += 2; - if (ir.regmap[X86_RECORD_R8_REGNUM]) - { - if (record_arch_list_add_mem (addr64, 8)) - return -1; - } - else - { - if (record_arch_list_add_mem (addr64, 4)) - return -1; - } - } - } - break; - case 2: /* lgdt */ - if (ir.mod == 3) - { - /* xgetbv */ - if (ir.rm == 0) - { - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM); - break; - } - /* xsetbv */ - else if (ir.rm == 1) - break; - } - case 3: /* lidt */ - if (ir.mod == 3) - { - ir.addr -= 3; - opcode = opcode << 8 | ir.modrm; - goto no_support; - } - break; - case 4: /* smsw */ - if (ir.mod == 3) - { - if (record_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b)) - return -1; - } - else - { - ir.ot = OT_WORD; - if (i386_record_lea_modrm (&ir)) - return -1; - } - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); - break; - case 6: /* lmsw */ - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); - break; - case 7: /* invlpg */ - if (ir.mod == 3) + ir.addr -= 3; + opcode = opcode << 8 | ir.modrm; + goto no_support; + } + } + else + { + switch (ir.reg) { - if (ir.rm == 0 && ir.regmap[X86_RECORD_R8_REGNUM]) - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM); - else - { - ir.addr -= 3; - opcode = opcode << 8 | ir.modrm; - goto no_support; - } - } - else - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); - break; - default: - ir.addr -= 3; - opcode = opcode << 8 | ir.modrm; - goto no_support; - break; - } + /* sgdt */ + case 0: + /* sidt */ + case 1: + if (ir.override >= 0) + { + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q = yquery (_("\ + Process record ignores the memory change of \ + instruction at address %s\n\ + because it can't get the value of the segment \ + register.\n Do you want to stop the program?"), + paddress (gdbarch, ir.orig_addr)); + target_terminal_inferior (); + if (q) + return -1; + } + } + else + { + uint64_t tmpu64; + + /* We have to store at least (4 + 2 = 6) bytes, + or (8 + 2 = 10) bytes at most. */ + if (i386_record_lea_modrm_addr (&ir, &tmpu64)) + return -1; + if (record_arch_list_add_mem (tmpu64, 6)) + return -1; + tmpu64 += 6; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + if (record_arch_list_add_mem (tmpu64, 4)) + return -1; + } + } + break; + /* lgdt */ + case 2: + /* lidt */ + case 3: + break; + /* smsw */ + case 4: + ir.ot = OT_WORD; + if (i386_record_lea_modrm (&ir)) + return -1; + break; + /* lmsw */ + case 6: + break; + /* invlpg */ + case 7: + break; + default: + ir.addr -= 3; + opcode = opcode << 8 | ir.modrm; + goto no_support; + } + } break; case 0x0f08: /* invd */ -- 1.7.0.4 --000e0cd3a9b8f1fb26049f9c491d Content-Type: text/x-patch; charset=US-ASCII; name="0001-Rewrite-the-codes-for-opcode-0x0f01-and-add-more-ins.patch" Content-Disposition: attachment; filename="0001-Rewrite-the-codes-for-opcode-0x0f01-and-add-more-ins.patch" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gluo0x1q0 Content-length: 12306 CjIwMTEtMDMtMjkgIEppYW5nIEppbGluICA8ZnJlZXBocEBnbWFpbC5jb20+ CiAgICAgICAqIGkzODYtdGRlcC5jIChpMzg2X3Byb2Nlc3NfcmVjb3JkKTog UmV3cml0ZSB0aGUgY29kZXMgZm9yCiAgICAgICBvcGNvZGUgMHgwZjAxIGFu ZCBhZGQgbW9yZSBpbnN0cnVjdGlvbnMgc3VwcG9ydAotLS0KIGdkYi9pMzg2 LXRkZXAuYyB8ICAyODEgKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogMSBmaWxlcyBjaGFuZ2VkLCAx MjIgaW5zZXJ0aW9ucygrKSwgMTU5IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL2dkYi9pMzg2LXRkZXAuYyBiL2dkYi9pMzg2LXRkZXAuYwppbmRleCBj N2FkM2E2Li45NDgzM2NiIDEwMDY0NAotLS0gYS9nZGIvaTM4Ni10ZGVwLmMK KysrIGIvZ2RiL2kzODYtdGRlcC5jCkBAIC01ODAyLDE3NCArNTgwMiwxMzcg QEAgRG8geW91IHdhbnQgdG8gc3RvcCB0aGUgcHJvZ3JhbT8iKSwKICAgICBj YXNlIDB4MGYwMToKICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmly KSkKIAlyZXR1cm4gLTE7Ci0gICAgICBzd2l0Y2ggKGlyLnJlZykKKyAgICAg IGlmIChpci5tb2QgPT0gMykKIAl7Ci0JY2FzZSAwOiAgLyogc2dkdCAqLwot CSAgewotCSAgICB1aW50NjRfdCBhZGRyNjQ7Ci0KLQkgICAgaWYgKGlyLm1v ZCA9PSAzKQotCSAgICAgIHsKLQkJaXIuYWRkciAtPSAzOwotCQlvcGNvZGUg PSBvcGNvZGUgPDwgOCB8IGlyLm1vZHJtOwotCQlnb3RvIG5vX3N1cHBvcnQ7 Ci0JICAgICAgfQotCSAgICBpZiAoaXIub3ZlcnJpZGUgPj0gMCkKLQkgICAg ICB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZF9tZW1vcnlfcXVlcnkp Ci0gICAgICAgICAgICAgICAgICB7Ci0JICAgICAgICAgICAgaW50IHE7CisJ ICB1aW50OF90IHJlZ19ybSA9IChpci5yZWcgPDwgNCkgfCBpci5ybTsKIAot ICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsK LSAgICAgICAgICAgICAgICAgICAgcSA9IHlxdWVyeSAoXygiXAotUHJvY2Vz cyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5IGNoYW5nZSBvZiBpbnN0cnVj dGlvbiBhdCBhZGRyZXNzICVzXG5cCi1iZWNhdXNlIGl0IGNhbid0IGdldCB0 aGUgdmFsdWUgb2YgdGhlIHNlZ21lbnQgcmVnaXN0ZXIuXG5cCi1EbyB5b3Ug d2FudCB0byBzdG9wIHRoZSBwcm9ncmFtPyIpLAotICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIub3JpZ19h ZGRyKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRhcmdldF90ZXJtaW5hbF9p bmZlcmlvciAoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHEpCi0gICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgICAg ICAgfQotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKGkz ODZfcmVjb3JkX2xlYV9tb2RybV9hZGRyICgmaXIsICZhZGRyNjQpKQotCQkg IHJldHVybiAtMTsKLQkJaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo YWRkcjY0LCAyKSkKLQkJICByZXR1cm4gLTE7Ci0JCWFkZHI2NCArPSAyOwor CSAgc3dpdGNoIChyZWdfcm0pCisJICAgIHsKKyAgICAgICAgICAgICAgLyog dm1jYWxsICovCisgICAgICAgICAgICAgIGNhc2UgMHgwMToKKyAgICAgICAg ICAgICAgICAvKiB2bWxhdW5jaCAqLworICAgICAgICAgICAgICBjYXNlIDB4 MDI6CisgICAgICAgICAgICAgICAgLyogdm1yZXN1bWUgKi8KKyAgICAgICAg ICAgICAgY2FzZSAweDAzOgorICAgICAgICAgICAgICAgIC8qIHZteG9mZiAq LworICAgICAgICAgICAgICBjYXNlIDB4MDQ6CisgICAgICAgICAgICAgICAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZM QUdTX1JFR05VTSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg ICAgICAgICAgLyogbW9uaXRvciAqLworICAgICAgICAgICAgICBjYXNlIDB4 MTA6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg LyogbXdhaXQgKi8KKyAgICAgICAgICAgICAgY2FzZSAweDExOgorICAgICAg ICAgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX0VGTEFHU19SRUdOVU0pOworICAgICAgICAgICAgICAgIGJyZWFr OworICAgICAgICAgICAgICAgIC8qIHhnZXRidiAqLworICAgICAgICAgICAg ICBjYXNlIDB4MjA6CisgICAgICAgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVBWF9SRUdOVU0pOworICAg ICAgICAgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChY ODZfUkVDT1JEX1JFRFhfUkVHTlVNKTsKKyAgICAgICAgICAgICAgICBicmVh azsKKyAgICAgICAgICAgICAgICAvKiB4c2V0YnYgKi8KKyAgICAgICAgICAg ICAgY2FzZSAweDIxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgICAgICAgIC8qIHN3YXBncyAqLworICAgICAgICAgICAgICBjYXNlIDB4 NzA6CiAgICAgICAgICAgICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JE X1I4X1JFR05VTV0pCisgICAgICAgICAgICAgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9HU19SRUdOVU0pOworICAg ICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgIHsKLSAgICAg ICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo YWRkcjY0LCA4KSkKLQkJICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAg ICAgICAgICBpci5hZGRyIC09IDM7CisgICAgICAgICAgICAgICAgICAgIG9w Y29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07CisgICAgICAgICAgICAg ICAgICAgIGdvdG8gbm9fc3VwcG9ydDsKICAgICAgICAgICAgICAgICAgIH0K LSAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7 CisgICAgICAgICAgICAgICAgLyogcmR0c2NwICovCisgICAgICAgICAgICAg IGNhc2UgMHg3MToKKyAgICAgICAgICAgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7CisgICAg ICAgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4 Nl9SRUNPUkRfUkVDWF9SRUdOVU0pOworICAgICAgICAgICAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFRFhfUkVH TlVNKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg ZGVmYXVsdDogCisgICAgICAgICAgICAgICAgLyogc21zdyAqLworICAgICAg ICAgICAgICAgIGlmIChpci5yZWcgPT0gNCkKICAgICAgICAgICAgICAgICAg IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX21lbSAoYWRkcjY0LCA0KSkKLQkJICAgICAgcmV0dXJuIC0xOworICAg ICAgICAgICAgICAgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAoaXIucm0gfCBpci5yZXhfYik7IAorICAgICAgICAgICAgICAgICAgICBi cmVhazsgCiAgICAgICAgICAgICAgICAgICB9Ci0JICAgICAgfQotCSAgfQot CSAgYnJlYWs7Ci0JY2FzZSAxOgotCSAgaWYgKGlyLm1vZCA9PSAzKQotCSAg ICB7Ci0JICAgICAgc3dpdGNoIChpci5ybSkKLQkJewotCQljYXNlIDA6ICAv KiBtb25pdG9yICovCi0JCSAgYnJlYWs7Ci0JCWNhc2UgMTogIC8qIG13YWl0 ICovCi0JCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9S RUNPUkRfRUZMQUdTX1JFR05VTSk7Ci0JCSAgYnJlYWs7Ci0JCWRlZmF1bHQ6 Ci0JCSAgaXIuYWRkciAtPSAzOwotCQkgIG9wY29kZSA9IG9wY29kZSA8PCA4 IHwgaXIubW9kcm07Ci0JCSAgZ290byBub19zdXBwb3J0OwotCQkgIGJyZWFr OwotCQl9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIC8qIHNp ZHQgKi8KLQkgICAgICBpZiAoaXIub3ZlcnJpZGUgPj0gMCkKLQkJewotICAg ICAgICAgICAgICAgICAgaWYgKHJlY29yZF9tZW1vcnlfcXVlcnkpCi0gICAg ICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICAgIGludCBxOwotCi0g ICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Rlcm1pbmFsX291cnMgKCk7 Ci0gICAgICAgICAgICAgICAgICAgICAgcSA9IHlxdWVyeSAoXygiXAotUHJv Y2VzcyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5IGNoYW5nZSBvZiBpbnN0 cnVjdGlvbiBhdCBhZGRyZXNzICVzXG5cCi1iZWNhdXNlIGl0IGNhbid0IGdl dCB0aGUgdmFsdWUgb2YgdGhlIHNlZ21lbnQgcmVnaXN0ZXIuXG5cCi1EbyB5 b3Ugd2FudCB0byBzdG9wIHRoZSBwcm9ncmFtPyIpLAotICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBhZGRyZXNzIChnZGJhcmNoLCBpci5v cmlnX2FkZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdGVy bWluYWxfaW5mZXJpb3IgKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgaWYg KHEpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAg ICAgICAgICAgICAgICAgIH0KLQkJfQotCSAgICAgIGVsc2UKLQkJewotCQkg IHVpbnQ2NF90IGFkZHI2NDsKKyAgICAgICAgICAgICAgICAvKiBsbXN3ICov CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoaXIucmVnID09IDYpCisgICAg ICAgICAgICAgICAgICBicmVhazsgCiAKLQkJICBpZiAoaTM4Nl9yZWNvcmRf bGVhX21vZHJtX2FkZHIgKCZpciwgJmFkZHI2NCkpCi0JCSAgICByZXR1cm4g LTE7Ci0JCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkcjY0 LCAyKSkKLQkJICAgIHJldHVybiAtMTsKLQkJICBhZGRyNjQgKz0gMjsKLSAg ICAgICAgICAgICAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9S RUdOVU1dKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAg ICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkcjY0 LCA4KSkKLQkJICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAg ICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAg ICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9tZW0gKGFkZHI2NCwgNCkpCi0JCSAgICAgICAgcmV0dXJu IC0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0JCX0KLQkgICAgfQotCSAg YnJlYWs7Ci0JY2FzZSAyOiAgLyogbGdkdCAqLwotCSAgaWYgKGlyLm1vZCA9 PSAzKQotCSAgICB7Ci0JICAgICAgLyogeGdldGJ2ICovCi0JICAgICAgaWYg KGlyLnJtID09IDApCi0JCXsKLQkJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7Ci0JCSAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVEWF9SRUdO VU0pOwotCQkgIGJyZWFrOwotCQl9Ci0JICAgICAgLyogeHNldGJ2ICovCi0J ICAgICAgZWxzZSBpZiAoaXIucm0gPT0gMSkKLQkJYnJlYWs7Ci0JICAgIH0K LQljYXNlIDM6ICAvKiBsaWR0ICovCi0JICBpZiAoaXIubW9kID09IDMpCi0J ICAgIHsKLQkgICAgICBpci5hZGRyIC09IDM7Ci0JICAgICAgb3Bjb2RlID0g b3Bjb2RlIDw8IDggfCBpci5tb2RybTsKLQkgICAgICBnb3RvIG5vX3N1cHBv cnQ7Ci0JICAgIH0KLQkgIGJyZWFrOwotCWNhc2UgNDogIC8qIHNtc3cgKi8K LQkgIGlmIChpci5tb2QgPT0gMykKLQkgICAgewotCSAgICAgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSB8IGly LnJleF9iKSkKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAg IHsKLQkgICAgICBpci5vdCA9IE9UX1dPUkQ7Ci0JICAgICAgaWYgKGkzODZf cmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKLQkJcmV0dXJuIC0xOwotCSAgICB9 Ci0JICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9FRkxBR1NfUkVHTlVNKTsKLQkgIGJyZWFrOwotCWNhc2UgNjogIC8qIGxt c3cgKi8KLQkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX0VGTEFHU19SRUdOVU0pOwotCSAgYnJlYWs7Ci0JY2FzZSA3OiAg LyogaW52bHBnICovCi0JICBpZiAoaXIubW9kID09IDMpCisgICAgICAgICAg ICAgICAgaXIuYWRkciAtPSAzOworICAgICAgICAgICAgICAgIG9wY29kZSA9 IG9wY29kZSA8PCA4IHwgaXIubW9kcm07CisgICAgICAgICAgICAgICAgZ290 byBub19zdXBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg ICBlbHNlCisJeworCSAgc3dpdGNoIChpci5yZWcpCiAJICAgIHsKLQkgICAg ICBpZiAoaXIucm0gPT0gMCAmJiBpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9S RUdOVU1dKQotCSAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9S RUcgKFg4Nl9SRUNPUkRfR1NfUkVHTlVNKTsKLQkgICAgICBlbHNlCi0JICAg ICAgICB7Ci0JICAgICAgICAgIGlyLmFkZHIgLT0gMzsKLQkgICAgICAgICAg b3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKLQkgICAgICAgICAg Z290byBub19zdXBwb3J0OwotCSAgICAgICAgfQotCSAgICB9Ci0JICBlbHNl Ci0JICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVD T1JEX0VGTEFHU19SRUdOVU0pOwotCSAgYnJlYWs7Ci0JZGVmYXVsdDoKLQkg IGlyLmFkZHIgLT0gMzsKLQkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIu bW9kcm07Ci0JICBnb3RvIG5vX3N1cHBvcnQ7Ci0JICBicmVhazsKLQl9Cisg ICAgICAgICAgICAgIC8qIHNnZHQgKi8KKyAgICAgICAgICAgICAgY2FzZSAw OgorICAgICAgICAgICAgICAgIC8qIHNpZHQgKi8KKyAgICAgICAgICAgICAg Y2FzZSAxOiAKKyAgICAgICAgICAgICAgICBpZiAoaXIub3ZlcnJpZGUgPj0g MCkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAg aWYgKHJlY29yZF9tZW1vcnlfcXVlcnkpCisgICAgICAgICAgICAgICAgICAg ICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHE7CisKKyAgICAg ICAgICAgICAgICAgICAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOwor ICAgICAgICAgICAgICAgICAgICAgICAgcSA9IHlxdWVyeSAoXygiXAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2VzcyByZWNvcmQgaWdu b3JlcyB0aGUgbWVtb3J5IGNoYW5nZSBvZiBcCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzXG5cCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIGl0IGNhbid0 IGdldCB0aGUgdmFsdWUgb2YgdGhlIHNlZ21lbnQgXAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIuXG4gRG8geW91IHdhbnQgdG8g c3RvcCB0aGUgcHJvZ3JhbT8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIub3JpZ19hZGRyKSk7CisgICAg ICAgICAgICAgICAgICAgICAgICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3Ig KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocSkKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg ICBlbHNlCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg ICAgIHVpbnQ2NF90IHRtcHU2NDsKKworICAgICAgICAgICAgICAgICAgICAv KiBXZSBoYXZlIHRvIHN0b3JlIGF0IGxlYXN0ICg0ICsgMiA9IDYpIGJ5dGVz LCAKKyAgICAgICAgICAgICAgICAgICAgICAgb3IgKDggKyAyID0gMTApIGJ5 dGVzIGF0IG1vc3QuICAqLworICAgICAgICAgICAgICAgICAgICBpZiAoaTM4 Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKCZpciwgJnRtcHU2NCkpCisgICAg ICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAg ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtICh0bXB1NjQsIDYp KQorICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAg ICAgICAgICAgICAgdG1wdTY0ICs9IDY7CisgICAgICAgICAgICAgICAgICAg IGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAg ICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlm IChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgNCkpCisgICAg ICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogbGdkdCAqLworICAg ICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgLyogbGlkdCAq LworICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgYnJl YWs7CisgICAgICAgICAgICAgICAgLyogc21zdyAqLworICAgICAgICAgICAg ICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgaXIub3QgPSBPVF9XT1JEOwor ICAgICAgICAgICAgICAgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9kcm0gKCZp cikpCisgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAg ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLyogbG1zdyAqLworICAg ICAgICAgICAgICBjYXNlIDY6CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg ICAgICAgICAgICAgICAgLyogaW52bHBnICovCisgICAgICAgICAgICAgIGNh c2UgNzoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg ZGVmYXVsdDogCisgICAgICAgICAgICAgICAgaXIuYWRkciAtPSAzOworICAg ICAgICAgICAgICAgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07 CisgICAgICAgICAgICAgICAgZ290byBub19zdXBwb3J0OworICAgICAgICAg ICAgfQorICAgICAgICB9CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgw ZjA4OiAgICAvKiBpbnZkICovCi0tIAoxLjcuMC40Cgo= --000e0cd3a9b8f1fb26049f9c491d--