From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 12714 invoked by alias); 29 Mar 2011 14:14:53 -0000 Received: (qmail 12696 invoked by uid 22791); 29 Mar 2011 14:14:50 -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 14:14:41 +0000 Received: by yxt33 with SMTP id 33so103682yxt.0 for ; Tue, 29 Mar 2011 07:14:40 -0700 (PDT) Received: by 10.147.100.20 with SMTP id c20mr4843757yam.5.1301408080347; Tue, 29 Mar 2011 07:14:40 -0700 (PDT) MIME-Version: 1.0 Received: by 10.146.167.2 with HTTP; Tue, 29 Mar 2011 07:14:20 -0700 (PDT) In-Reply-To: <4D91BE41.2010107@codesourcery.com> References: <1255182393-15292-1-git-send-email-freephp@gmail.com> <4AD28E95.1050404@vmware.com> <7d77a27d0910111921v13a8e8acpb98c29a9aa72ed8@mail.gmail.com> <4C929A9C.1050601@vmware.com> <4D91BE41.2010107@codesourcery.com> From: Jiang Jilin Date: Tue, 29 Mar 2011 14:28:00 -0000 Message-ID: Subject: Re: [PATCH] Rewrite the codes for opcode 0x0f01 and add more instructions support To: Yao Qi Cc: gdb-patches@sourceware.org, Hui Zhu , tromey@redhat.com Content-Type: multipart/mixed; boundary=000e0cd3a9b85643cc049f9fae38 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/msg01172.txt.bz2 --000e0cd3a9b85643cc049f9fae38 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-length: 11861 On Tue, Mar 29, 2011 at 7:10 PM, Yao Qi wrote: > On 03/29/2011 06:11 PM, Jiang Jilin wrote: > > I am not the people to approve this patch. =C2=A0Some comments on code fo= rmat > and indent. > >> 2011-03-29 =C2=A0Jiang Jilin =C2=A0 > > There should be a newline here. =C2=A0Please reference other changelog en= tries. fixed. >> =C2=A0 =C2=A0 =C2=A0 * i386-tdep.c (i386_process_record): Rewrite the co= des for >> =C2=A0 =C2=A0 =C2=A0 opcode 0x0f01 and add more instructions support > >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 switch (reg_rm) >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 { >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* vmcall */ >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0case 0x01: >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* vmlaunch */ > Looks like there are two extra spaces in front of your comment. =C2=A0Ple= ase > remove them. =C2=A0There are several instances of this problem in your pa= tch. fixed. > >> + >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/= * We have to store at least (4 + 2 =3D 6) bytes, >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 or (8 + 2 =3D 10) bytes at most. =C2=A0*/ > > According to my limited English knowledge, it should be "6 bytes at > least *and* 10 bytes at most". fixed. > >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0i= f (i386_record_lea_modrm_addr (&ir, &tmpu64)) >> + =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0return -1; > > > -- > Yao (=E9=BD=90=E5=B0=A7) > Yao, Thank you! The new version: 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..631a505 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 =3D=3D 3) { - case 0: /* sgdt */ - { - uint64_t addr64; - - if (ir.mod =3D=3D 3) - { - ir.addr -=3D 3; - opcode =3D opcode << 8 | ir.modrm; - goto no_support; - } - if (ir.override >=3D 0) - { - if (record_memory_query) - { - int q; + uint8_t reg_rm =3D (ir.reg << 4) | ir.rm; - target_terminal_ours (); - q =3D 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 +=3D 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 -=3D 3; + opcode =3D 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 =3D=3D 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 =3D=3D 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 -=3D 3; - opcode =3D opcode << 8 | ir.modrm; - goto no_support; - break; - } - } - else - { - /* sidt */ - if (ir.override >=3D 0) - { - if (record_memory_query) - { - int q; - - target_terminal_ours (); - q =3D 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 =3D=3D 6) + break; - if (i386_record_lea_modrm_addr (&ir, &addr64)) - return -1; - if (record_arch_list_add_mem (addr64, 2)) - return -1; - addr64 +=3D 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 =3D=3D 3) - { - /* xgetbv */ - if (ir.rm =3D=3D 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 =3D=3D 1) - break; - } - case 3: /* lidt */ - if (ir.mod =3D=3D 3) - { - ir.addr -=3D 3; - opcode =3D opcode << 8 | ir.modrm; - goto no_support; - } - break; - case 4: /* smsw */ - if (ir.mod =3D=3D 3) - { - if (record_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b)) - return -1; - } - else - { - ir.ot =3D 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 =3D=3D 3) + ir.addr -=3D 3; + opcode =3D opcode << 8 | ir.modrm; + goto no_support; + } + } + else + { + switch (ir.reg) { - if (ir.rm =3D=3D 0 && ir.regmap[X86_RECORD_R8_REGNUM]) - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM); - else - { - ir.addr -=3D 3; - opcode =3D opcode << 8 | ir.modrm; - goto no_support; - } - } - else - I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); - break; - default: - ir.addr -=3D 3; - opcode =3D opcode << 8 | ir.modrm; - goto no_support; - break; - } + /* sgdt */ + case 0: + /* sidt */ + case 1: + if (ir.override >=3D 0) + { + if (record_memory_query) + { + int q; + + target_terminal_ours (); + q =3D yquery (_("\ + Process record ignores the memory change of \ + instruction at address %s\n\ + because it can't get the value of the segmen= t \ + 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 (4 + 2 =3D 6) bytes at least, + and (8 + 2 =3D 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 +=3D 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 =3D OT_WORD; + if (i386_record_lea_modrm (&ir)) + return -1; + break; + /* lmsw */ + case 6: + break; + /* invlpg */ + case 7: + break; + default: + ir.addr -=3D 3; + opcode =3D opcode << 8 | ir.modrm; + goto no_support; + } + } break; case 0x0f08: /* invd */ -- 1.7.0.4 --000e0cd3a9b85643cc049f9fae38 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_gluwkuya0 Content-length: 12579 RnJvbSBjZTM2YmVkNDZmYWFiM2RlNjE3NDdlNDgzZTMyNzhjYmE4ZGMzZjJk IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBKaWFuZyBKaWxpbiA8 ZnJlZXBocEBnbWFpbC5jb20+CkRhdGU6IFR1ZSwgMjkgTWFyIDIwMTEgMjE6 MzY6NDEgKzA4MDAKU3ViamVjdDogW1BBVENIXSBSZXdyaXRlIHRoZSBjb2Rl cyBmb3Igb3Bjb2RlIDB4MGYwMSBhbmQgYWRkIG1vcmUgaW5zdHJ1Y3Rpb25z IHN1cHBvcnQKCjIwMTEtMDMtMjkgIEppYW5nIEppbGluICA8ZnJlZXBocEBn bWFpbC5jb20+CgogICAgKiBpMzg2LXRkZXAuYyAoaTM4Nl9wcm9jZXNzX3Jl Y29yZCk6IFJld3JpdGUgdGhlIGNvZGVzIGZvcgogICAgb3Bjb2RlIDB4MGYw MSBhbmQgYWRkIG1vcmUgaW5zdHJ1Y3Rpb25zIHN1cHBvcnQuCi0tLQogZ2Ri L2kzODYtdGRlcC5jIHwgIDI4MSArKysrKysrKysrKysrKysrKysrKysrKyst LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGVzIGNoYW5n ZWQsIDEyMiBpbnNlcnRpb25zKCspLCAxNTkgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZ2RiL2kzODYtdGRlcC5jIGIvZ2RiL2kzODYtdGRlcC5jCmlu ZGV4IGM3YWQzYTYuLjYzMWE1MDUgMTAwNjQ0Ci0tLSBhL2dkYi9pMzg2LXRk ZXAuYworKysgYi9nZGIvaTM4Ni10ZGVwLmMKQEAgLTU4MDIsMTc0ICs1ODAy LDEzNyBAQCBEbyB5b3Ugd2FudCB0byBzdG9wIHRoZSBwcm9ncmFtPyIpLAog ICAgIGNhc2UgMHgwZjAxOgogICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJt ICgmaXIpKQogCXJldHVybiAtMTsKLSAgICAgIHN3aXRjaCAoaXIucmVnKQor ICAgICAgaWYgKGlyLm1vZCA9PSAzKQogCXsKLQljYXNlIDA6ICAvKiBzZ2R0 ICovCi0JICB7Ci0JICAgIHVpbnQ2NF90IGFkZHI2NDsKLQotCSAgICBpZiAo aXIubW9kID09IDMpCi0JICAgICAgewotCQlpci5hZGRyIC09IDM7Ci0JCW9w Y29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07Ci0JCWdvdG8gbm9fc3Vw cG9ydDsKLQkgICAgICB9Ci0JICAgIGlmIChpci5vdmVycmlkZSA+PSAwKQot CSAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkX21lbW9yeV9x dWVyeSkKLSAgICAgICAgICAgICAgICAgIHsKLQkgICAgICAgICAgICBpbnQg cTsKKwkgIHVpbnQ4X3QgcmVnX3JtID0gKGlyLnJlZyA8PCA0KSB8IGlyLnJt OwogCi0gICAgICAgICAgICAgICAgICAgIHRhcmdldF90ZXJtaW5hbF9vdXJz ICgpOwotICAgICAgICAgICAgICAgICAgICBxID0geXF1ZXJ5IChfKCJcCi1Q cm9jZXNzIHJlY29yZCBpZ25vcmVzIHRoZSBtZW1vcnkgY2hhbmdlIG9mIGlu c3RydWN0aW9uIGF0IGFkZHJlc3MgJXNcblwKLWJlY2F1c2UgaXQgY2FuJ3Qg Z2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VnbWVudCByZWdpc3Rlci5cblwKLURv IHlvdSB3YW50IHRvIHN0b3AgdGhlIHByb2dyYW0/IiksCi0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHBhZGRyZXNzIChnZGJhcmNoLCBpci5v cmlnX2FkZHIpKTsKLSAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X3Rlcm1p bmFsX2luZmVyaW9yICgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocSkK LSAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAg ICAgICAgICB9Ci0JICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQlp ZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKCZpciwgJmFkZHI2NCkp Ci0JCSAgcmV0dXJuIC0xOwotCQlpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf bWVtIChhZGRyNjQsIDIpKQotCQkgIHJldHVybiAtMTsKLQkJYWRkcjY0ICs9 IDI7CisJICBzd2l0Y2ggKHJlZ19ybSkKKwkgICAgeworICAgICAgICAgICAg ICAvKiB2bWNhbGwgKi8KKyAgICAgICAgICAgICAgY2FzZSAweDAxOgorICAg ICAgICAgICAgICAvKiB2bWxhdW5jaCAqLworICAgICAgICAgICAgICBjYXNl IDB4MDI6CisgICAgICAgICAgICAgIC8qIHZtcmVzdW1lICovCisgICAgICAg ICAgICAgIGNhc2UgMHgwMzoKKyAgICAgICAgICAgICAgLyogdm14b2ZmICov CisgICAgICAgICAgICAgIGNhc2UgMHgwNDoKKyAgICAgICAgICAgICAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxB R1NfUkVHTlVNKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg ICAgICAgLyogbW9uaXRvciAqLworICAgICAgICAgICAgICBjYXNlIDB4MTA6 CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIC8qIG13 YWl0ICovCisgICAgICAgICAgICAgIGNhc2UgMHgxMToKKyAgICAgICAgICAg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9FRkxBR1NfUkVHTlVNKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgICAgICAgLyogeGdldGJ2ICovCisgICAgICAgICAgICAgIGNhc2Ug MHgyMDoKKyAgICAgICAgICAgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7CisgICAgICAgICAg ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNP UkRfUkVEWF9SRUdOVU0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgICAgICAvKiB4c2V0YnYgKi8KKyAgICAgICAgICAgICAgY2FzZSAw eDIxOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAv KiBzd2FwZ3MgKi8KKyAgICAgICAgICAgICAgY2FzZSAweDcwOgogICAgICAg ICAgICAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1d KQorICAgICAgICAgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKFg4Nl9SRUNPUkRfR1NfUkVHTlVNKTsKKyAgICAgICAgICAgICAg ICBlbHNlCiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAg ICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFkZHI2NCwgOCkp Ci0JCSAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaXIu YWRkciAtPSAzOworICAgICAgICAgICAgICAgICAgICBvcGNvZGUgPSBvcGNv ZGUgPDwgOCB8IGlyLm1vZHJtOworICAgICAgICAgICAgICAgICAgICBnb3Rv IG5vX3N1cHBvcnQ7CiAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAg ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg ICAgICAvKiByZHRzY3AgKi8KKyAgICAgICAgICAgICAgY2FzZSAweDcxOgor ICAgICAgICAgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH IChYODZfUkVDT1JEX1JFQVhfUkVHTlVNKTsKKyAgICAgICAgICAgICAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUNY X1JFR05VTSk7CisgICAgICAgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVEWF9SRUdOVU0pOworICAgICAg ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICBkZWZhdWx0OiAKKyAg ICAgICAgICAgICAgICAvKiBzbXN3ICovCisgICAgICAgICAgICAgICAgaWYg KGlyLnJlZyA9PSA0KQogICAgICAgICAgICAgICAgICAgewotICAgICAgICAg ICAgICAgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRy NjQsIDQpKQotCQkgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAg ICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSB8IGly LnJleF9iKTsgCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAg ICAgICAgICAgICAgIH0KLQkgICAgICB9Ci0JICB9Ci0JICBicmVhazsKLQlj YXNlIDE6Ci0JICBpZiAoaXIubW9kID09IDMpCi0JICAgIHsKLQkgICAgICBz d2l0Y2ggKGlyLnJtKQotCQl7Ci0JCWNhc2UgMDogIC8qIG1vbml0b3IgKi8K LQkJICBicmVhazsKLQkJY2FzZSAxOiAgLyogbXdhaXQgKi8KLQkJICBJMzg2 X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1Nf UkVHTlVNKTsKLQkJICBicmVhazsKLQkJZGVmYXVsdDoKLQkJICBpci5hZGRy IC09IDM7Ci0JCSAgb3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsK LQkJICBnb3RvIG5vX3N1cHBvcnQ7Ci0JCSAgYnJlYWs7Ci0JCX0KLQkgICAg fQotCSAgZWxzZQotCSAgICB7Ci0JICAgICAgLyogc2lkdCAqLwotCSAgICAg IGlmIChpci5vdmVycmlkZSA+PSAwKQotCQl7Ci0gICAgICAgICAgICAgICAg ICBpZiAocmVjb3JkX21lbW9yeV9xdWVyeSkKLSAgICAgICAgICAgICAgICAg ICAgewotCSAgICAgICAgICAgICAgaW50IHE7Ci0KLSAgICAgICAgICAgICAg ICAgICAgICB0YXJnZXRfdGVybWluYWxfb3VycyAoKTsKLSAgICAgICAgICAg ICAgICAgICAgICBxID0geXF1ZXJ5IChfKCJcCi1Qcm9jZXNzIHJlY29yZCBp Z25vcmVzIHRoZSBtZW1vcnkgY2hhbmdlIG9mIGluc3RydWN0aW9uIGF0IGFk ZHJlc3MgJXNcblwKLWJlY2F1c2UgaXQgY2FuJ3QgZ2V0IHRoZSB2YWx1ZSBv ZiB0aGUgc2VnbWVudCByZWdpc3Rlci5cblwKLURvIHlvdSB3YW50IHRvIHN0 b3AgdGhlIHByb2dyYW0/IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcGFkZHJlc3MgKGdkYmFyY2gsIGlyLm9yaWdfYWRkcikpOwot ICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF90ZXJtaW5hbF9pbmZlcmlv ciAoKTsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAocSkKLSAgICAgICAg ICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAg ICAgfQotCQl9Ci0JICAgICAgZWxzZQotCQl7Ci0JCSAgdWludDY0X3QgYWRk cjY0OworICAgICAgICAgICAgICAgIC8qIGxtc3cgKi8KKyAgICAgICAgICAg ICAgICBlbHNlIGlmIChpci5yZWcgPT0gNikKKyAgICAgICAgICAgICAgICAg IGJyZWFrOyAKIAotCQkgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9kcm1fYWRk ciAoJmlyLCAmYWRkcjY0KSkKLQkJICAgIHJldHVybiAtMTsKLQkJICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyNjQsIDIpKQotCQkgICAg cmV0dXJuIC0xOwotCQkgIGFkZHI2NCArPSAyOwotICAgICAgICAgICAgICAg ICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCi0gICAg ICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyNjQsIDgpKQotCQkgICAg ICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAg ICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAg ICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21l bSAoYWRkcjY0LCA0KSkKLQkJICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAg ICAgICAgICAgICAgIH0KLQkJfQotCSAgICB9Ci0JICBicmVhazsKLQljYXNl IDI6ICAvKiBsZ2R0ICovCi0JICBpZiAoaXIubW9kID09IDMpCi0JICAgIHsK LQkgICAgICAvKiB4Z2V0YnYgKi8KLQkgICAgICBpZiAoaXIucm0gPT0gMCkK LQkJewotCQkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX1JFQVhfUkVHTlVNKTsKLQkJICBJMzg2X1JFQ09SRF9BUkNIX0xJ U1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRURYX1JFR05VTSk7Ci0JCSAgYnJl YWs7Ci0JCX0KLQkgICAgICAvKiB4c2V0YnYgKi8KLQkgICAgICBlbHNlIGlm IChpci5ybSA9PSAxKQotCQlicmVhazsKLQkgICAgfQotCWNhc2UgMzogIC8q IGxpZHQgKi8KLQkgIGlmIChpci5tb2QgPT0gMykKLQkgICAgewotCSAgICAg IGlyLmFkZHIgLT0gMzsKLQkgICAgICBvcGNvZGUgPSBvcGNvZGUgPDwgOCB8 IGlyLm1vZHJtOwotCSAgICAgIGdvdG8gbm9fc3VwcG9ydDsKLQkgICAgfQot CSAgYnJlYWs7Ci0JY2FzZSA0OiAgLyogc21zdyAqLwotCSAgaWYgKGlyLm1v ZCA9PSAzKQotCSAgICB7Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJtIHwgaXIucmV4X2IpKQotCQly ZXR1cm4gLTE7Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgewotCSAgICAgIGly Lm90ID0gT1RfV09SRDsKLQkgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21v ZHJtICgmaXIpKQotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQkgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdO VU0pOwotCSAgYnJlYWs7Ci0JY2FzZSA2OiAgLyogbG1zdyAqLwotCSAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdT X1JFR05VTSk7Ci0JICBicmVhazsKLQljYXNlIDc6ICAvKiBpbnZscGcgKi8K LQkgIGlmIChpci5tb2QgPT0gMykKKyAgICAgICAgICAgICAgICBpci5hZGRy IC09IDM7CisgICAgICAgICAgICAgICAgb3Bjb2RlID0gb3Bjb2RlIDw8IDgg fCBpci5tb2RybTsKKyAgICAgICAgICAgICAgICBnb3RvIG5vX3N1cHBvcnQ7 CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJ ICBzd2l0Y2ggKGlyLnJlZykKIAkgICAgewotCSAgICAgIGlmIChpci5ybSA9 PSAwICYmIGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCi0JICAg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9HU19SRUdOVU0pOwotCSAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAg ICAgICAgaXIuYWRkciAtPSAzOwotCSAgICAgICAgICBvcGNvZGUgPSBvcGNv ZGUgPDwgOCB8IGlyLm1vZHJtOwotCSAgICAgICAgICBnb3RvIG5vX3N1cHBv cnQ7Ci0JICAgICAgICB9Ci0JICAgIH0KLQkgIGVsc2UKLQkgICAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JF R05VTSk7Ci0JICBicmVhazsKLQlkZWZhdWx0OgotCSAgaXIuYWRkciAtPSAz OwotCSAgb3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKLQkgIGdv dG8gbm9fc3VwcG9ydDsKLQkgIGJyZWFrOwotCX0KKyAgICAgICAgICAgICAg Lyogc2dkdCAqLworICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAg ICAgIC8qIHNpZHQgKi8KKyAgICAgICAgICAgICAgY2FzZSAxOiAKKyAgICAg ICAgICAgICAgICBpZiAoaXIub3ZlcnJpZGUgPj0gMCkKKyAgICAgICAgICAg ICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZF9tZW1v cnlfcXVlcnkpCisgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAg ICAgICAgICAgICAgICAgaW50IHE7CisKKyAgICAgICAgICAgICAgICAgICAg ICAgIHRhcmdldF90ZXJtaW5hbF9vdXJzICgpOworICAgICAgICAgICAgICAg ICAgICAgICAgcSA9IHlxdWVyeSAoXygiXAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUHJvY2VzcyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5 IGNoYW5nZSBvZiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp bnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzXG5cCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBiZWNhdXNlIGl0IGNhbid0IGdldCB0aGUgdmFsdWUg b2YgdGhlIHNlZ21lbnQgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgcmVnaXN0ZXIuXG4gRG8geW91IHdhbnQgdG8gc3RvcCB0aGUgcHJvZ3Jh bT8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWRkcmVzcyAo Z2RiYXJjaCwgaXIub3JpZ19hZGRyKSk7CisgICAgICAgICAgICAgICAgICAg ICAgICB0YXJnZXRfdGVybWluYWxfaW5mZXJpb3IgKCk7CisgICAgICAgICAg ICAgICAgICAgICAgICBpZiAocSkKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRt cHU2NDsKKworICAgICAgICAgICAgICAgICAgICAvKiBXZSBoYXZlIHRvIHN0 b3JlICg0ICsgMiA9IDYpIGJ5dGVzIGF0IGxlYXN0LCAKKyAgICAgICAgICAg ICAgICAgICAgICAgYW5kICg4ICsgMiA9IDEwKSBieXRlcyBhdCBtb3N0LiAg Ki8KKyAgICAgICAgICAgICAgICAgICAgaWYgKGkzODZfcmVjb3JkX2xlYV9t b2RybV9hZGRyICgmaXIsICZ0bXB1NjQpKQorICAgICAgICAgICAgICAgICAg ICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCA2KSkKKyAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIHRt cHU2NCArPSA2OworICAgICAgICAgICAgICAgICAgICBpZiAoaXIucmVnbWFw W1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAgICAgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfbWVtICh0bXB1NjQsIDQpKQorICAgICAgICAgICAgICAgICAg ICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgICAgfQor ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwor ICAgICAgICAgICAgICAvKiBsZ2R0ICovCisgICAgICAgICAgICAgIGNhc2Ug MjoKKyAgICAgICAgICAgICAgLyogbGlkdCAqLworICAgICAgICAgICAgICBj YXNlIDM6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg IC8qIHNtc3cgKi8KKyAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAg ICAgICAgIGlyLm90ID0gT1RfV09SRDsKKyAgICAgICAgICAgICAgICBpZiAo aTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIpKQorICAgICAgICAgICAgICAg ICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg ICAgICAgICAvKiBsbXN3ICovCisgICAgICAgICAgICAgIGNhc2UgNjoKKyAg ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgLyogaW52bHBn ICovCisgICAgICAgICAgICAgIGNhc2UgNzoKKyAgICAgICAgICAgICAgICBi cmVhazsKKyAgICAgICAgICAgICAgZGVmYXVsdDogCisgICAgICAgICAgICAg ICAgaXIuYWRkciAtPSAzOworICAgICAgICAgICAgICAgIG9wY29kZSA9IG9w Y29kZSA8PCA4IHwgaXIubW9kcm07CisgICAgICAgICAgICAgICAgZ290byBu b19zdXBwb3J0OworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICBi cmVhazsKIAogICAgIGNhc2UgMHgwZjA4OiAgICAvKiBpbnZkICovCi0tIAox LjcuMC40Cgo= --000e0cd3a9b85643cc049f9fae38--