From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31861 invoked by alias); 30 Aug 2009 03:09:18 -0000 Received: (qmail 31848 invoked by uid 22791); 30 Aug 2009 03:09:16 -0000 X-SWARE-Spam-Status: No, hits=-0.8 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_24,J_CHICKENPOX_25,J_CHICKENPOX_28,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mail-iw0-f183.google.com (HELO mail-iw0-f183.google.com) (209.85.223.183) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sun, 30 Aug 2009 03:09:09 +0000 Received: by iwn13 with SMTP id 13so1321011iwn.12 for ; Sat, 29 Aug 2009 20:09:07 -0700 (PDT) MIME-Version: 1.0 Received: by 10.231.25.29 with SMTP id x29mr3674210ibb.31.1251601747080; Sat, 29 Aug 2009 20:09:07 -0700 (PDT) In-Reply-To: <4A999BC3.5020606@vmware.com> References: <4A999BC3.5020606@vmware.com> From: Hui Zhu Date: Sun, 30 Aug 2009 03:21:00 -0000 Message-ID: Subject: Re: [RFA/prec] Make i386 handle segment register better To: Michael Snyder Cc: gdb-patches ml Content-Type: multipart/mixed; boundary=00151773e73088f7670472533d2e 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: 2009-08/txt/msg00555.txt.bz2 --00151773e73088f7670472533d2e Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 12486 On Sun, Aug 30, 2009 at 05:21, Michael Snyder wrote: > Hui Zhu wrote: >> >> Hi guys, >> >> In prec-fix-x86-strinsn.txt patch, I add code the compare the ES and >> DS to make sure if es if same with ds or not. >> I think it works not bad, so I make a patch to check other segment >> regiser like it. >> >> Please help me with it. > > Thanks for doing this! > I think it looks good, but I have a couple of questions: > >> 2009-08-29 =A0Hui Zhu =A0 >> >> =A0 =A0 =A0 =A0* i386-tdep.c (i386_record_check_override): New function. >> =A0 =A0 =A0 =A0(i386_record_lea_modrm): Call i386_record_check_override. >> =A0 =A0 =A0 =A0(i386_process_record): Ditto. >> >> --- >> =A0i386-tdep.c | =A0 37 ++++++++++++++++++++++++++----------- >> =A01 file changed, 26 insertions(+), 11 deletions(-) >> >> --- a/i386-tdep.c >> +++ b/i386-tdep.c >> @@ -3147,6 +3147,26 @@ no_rm: >> =A0 return 0; >> =A0} >> >> +static int >> +i386_record_check_override (struct i386_record_s *irp) >> +{ >> + =A0if (irp->override >=3D 0 && irp->override !=3D X86_RECORD_DS_REGNUM) >> + =A0 =A0{ >> + =A0 =A0 =A0ULONGEST tmp, ds; >> + >> + =A0 =A0 =A0regcache_raw_read_unsigned (irp->regcache, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irp= ->regmap[irp->override], >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&tm= p); >> + =A0 =A0 =A0regcache_raw_read_unsigned (irp->regcache, >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0irp= ->regmap[X86_RECORD_DS_REGNUM], >> + =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0&ds= ); >> + =A0 =A0 =A0if (tmp !=3D ds) >> + =A0 =A0 =A0 =A0return 1; >> + =A0 =A0} >> + >> + =A0return 0; >> +} >> + >> =A0/* Record the value of the memory that willbe changed in current >> instruction >> =A0 =A0to "record_arch_list". >> =A0 =A0Return -1 if something wrong. */ >> @@ -3157,7 +3177,7 @@ i386_record_lea_modrm (struct i386_recor >> =A0 struct gdbarch *gdbarch =3D irp->gdbarch; >> =A0 uint64_t addr; >> >> - =A0if (irp->override >=3D 0) >> + =A0if (i386_record_check_override (irp)) >> =A0 =A0 { >> =A0 =A0 =A0 if (record_debug) >> =A0 =A0 =A0 =A0printf_unfiltered (_("Process record ignores the memory c= hange " > > In this case, you "return 0", so it is true that we > "ignore the memory change". > > In some cases below, you use an "if/else", so it is also > true that we "ignore the memory change". > > But in the "String ops" case, there is no "else", so we > really do *not* ignore the memory change. > > Should we be consistant, and add an "else" to the string ops case? > > See further comments at end. > >> @@ -4039,7 +4059,7 @@ reswitch: >> =A0 =A0 =A0 /* mov EAX */ >> =A0 =A0 case 0xa2: >> =A0 =A0 case 0xa3: >> - =A0 =A0 =A0if (ir.override >=3D 0) >> + =A0 =A0 =A0if (i386_record_check_override (&ir)) >> =A0 =A0 =A0 =A0 { >> =A0 =A0 =A0 =A0 =A0if (record_debug) >> =A0 =A0 =A0 =A0 =A0 =A0printf_unfiltered (_("Process record ignores the = memory change >> " > > OK, this one is an "if/else", so you don't record the memory. > >> @@ -4458,13 +4478,8 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 ir.regmap[X86_RECORD_REDI_REGNUM], >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 &tmpulongest); >> >> - =A0 =A0 =A0 =A0 =A0regcache_raw_read_unsigned (ir.regcache, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0ir.regmap[X86_RECORD_ES_REGNUM], >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0&es); >> - =A0 =A0 =A0 =A0 =A0regcache_raw_read_unsigned (ir.regcache, >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0ir.regmap[X86_RECORD_DS_REGNUM], >> - =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0&ds); >> - =A0 =A0 =A0 =A0 =A0if (ir.aflag && (es !=3D ds)) >> + =A0 =A0 =A0 =A0 =A0ir.override =3D X86_RECORD_ES_REGNUM; >> + =A0 =A0 =A0 =A0 =A0if (ir.aflag && i386_record_check_override (&ir)) >> =A0 =A0 =A0 =A0 =A0 =A0 { >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 /* addr +=3D ((uint32_t) read_register (I386= _ES_REGNUM)) << 4; >> */ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 if (record_debug) > > But in this case, there is no "else", so you still record > the memory even if i386_record_check_override returns true. > > > >> @@ -5086,7 +5101,7 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0opcode =3D opcode << 8 | ir.modrm; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0goto no_support; >> =A0 =A0 =A0 =A0 =A0 =A0 =A0} >> - =A0 =A0 =A0 =A0 =A0 if (ir.override >=3D 0) >> + =A0 =A0 =A0 =A0 =A0 if (i386_record_check_override (&ir)) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0{ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (record_debug) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf_unfiltered (_("Process record = ignores the memory " > > This is an "if/else" so you don't record the memory. > >> @@ -5138,7 +5153,7 @@ reswitch: >> =A0 =A0 =A0 =A0 =A0else >> =A0 =A0 =A0 =A0 =A0 =A0{ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0/* sidt */ >> - =A0 =A0 =A0 =A0 =A0 =A0 if (ir.override >=3D 0) >> + =A0 =A0 =A0 =A0 =A0 =A0 if (i386_record_check_override (&ir)) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0{ >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0if (record_debug) >> =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0printf_unfiltered (_("Process rec= ord ignores the memory >> " > > And this one is also an if/else. =A0So I guess my questions are: > > 1) Should you use an "else" in the "String ops" case? OK. > > 2) Should we go ahead and record the register changes, > even though we can't record the memory change? I think even if we cannot record the memory change. Keep record the change of reg is better. > > 3) Should this be a warning, rather than just a debug message? > I think yes, because if this happens, it actually means that the > record log will be inaccurate. > OK. I make a new patch for it. Please help me review it. 2009-08-30 Hui Zhu * i386-tdep.c (i386_record_s): Add orig_addr. (i386_record_check_override): New function. (i386_record_lea_modrm): Call i386_record_check_override. (i386_process_record): Ditto. --- i386-tdep.c | 103 ++++++++++++++++++++++++++++++++++---------------------= ----- 1 file changed, 59 insertions(+), 44 deletions(-) --- a/i386-tdep.c +++ b/i386-tdep.c @@ -2867,6 +2867,7 @@ struct i386_record_s { struct gdbarch *gdbarch; struct regcache *regcache; + CORE_ADDR orig_addr; CORE_ADDR addr; int aflag; int dflag; @@ -3147,6 +3148,26 @@ no_rm: return 0; } +static int +i386_record_check_override (struct i386_record_s *irp) +{ + if (irp->override >=3D 0 && irp->override !=3D X86_RECORD_DS_REGNUM) + { + ULONGEST tmp, ds; + + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[irp->override], + &tmp); + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_DS_REGNUM], + &ds); + if (tmp !=3D ds) + return 1; + } + + return 0; +} + /* Record the value of the memory that willbe changed in current instructi= on to "record_arch_list". Return -1 if something wrong. */ @@ -3157,13 +3178,12 @@ i386_record_lea_modrm (struct i386_recor struct gdbarch *gdbarch =3D irp->gdbarch; uint64_t addr; - if (irp->override >=3D 0) + if (i386_record_check_override (irp)) { - if (record_debug) - printf_unfiltered (_("Process record ignores the memory change " - "of instruction at address %s because it " - "can't get the value of the segment register.\n"), - paddress (gdbarch, irp->addr)); + warning (_("Process record ignores the memory change " + "of instruction at address %s because it " + "can't get the value of the segment register."), + paddress (gdbarch, irp->orig_addr)); return 0; } @@ -3221,6 +3241,7 @@ i386_process_record (struct gdbarch *gdb memset (&ir, 0, sizeof (struct i386_record_s)); ir.regcache =3D regcache; ir.addr =3D addr; + ir.orig_addr =3D addr; ir.aflag =3D 1; ir.dflag =3D 1; ir.override =3D -1; @@ -4039,14 +4060,13 @@ reswitch: /* mov EAX */ case 0xa2: case 0xa3: - if (ir.override >=3D 0) + if (i386_record_check_override (&ir)) { - if (record_debug) - printf_unfiltered (_("Process record ignores the memory change " - "of instruction at address 0x%s because " - "it can't get the value of the segment " - "register.\n"), - paddress (gdbarch, ir.addr)); + warning (_("Process record ignores the memory change " + "of instruction at address 0x%s because " + "it can't get the value of the segment " + "register."), + paddress (gdbarch, ir.orig_addr)); } else { @@ -4458,27 +4478,24 @@ reswitch: ir.regmap[X86_RECORD_REDI_REGNUM], &tmpulongest); - regcache_raw_read_unsigned (ir.regcache, - ir.regmap[X86_RECORD_ES_REGNUM], - &es); - regcache_raw_read_unsigned (ir.regcache, - ir.regmap[X86_RECORD_DS_REGNUM], - &ds); - if (ir.aflag && (es !=3D ds)) + ir.override =3D X86_RECORD_ES_REGNUM; + if (ir.aflag && i386_record_check_override (&ir)) { /* addr +=3D ((uint32_t) read_register (I386_ES_REGNUM)) << = 4; */ - if (record_debug) - printf_unfiltered (_("Process record ignores the memory " - "change of instruction at address 0x%s " - "because it can't get the value of the " - "ES segment register.\n"), - paddress (gdbarch, ir.addr)); + warning (_("Process record ignores the memory " + "change of instruction at address 0x%s " + "because it can't get the value of the " + "ES segment register."), + paddress (gdbarch, ir.orig_addr)); + } + else + { + if (record_arch_list_add_mem (tmpulongest, 1 << ir.ot)) + return -1; } if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); - if (record_arch_list_add_mem (tmpulongest, 1 << ir.ot)) - return -1; if (opcode =3D=3D 0xa4 || opcode =3D=3D 0xa5) I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM); I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM); @@ -5086,15 +5103,14 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - if (ir.override >=3D 0) + if (i386_record_check_override (&ir)) { - if (record_debug) - printf_unfiltered (_("Process record ignores the memory " - "change of instruction at " - "address %s because it can't get " - "the value of the segment " - "register.\n"), - paddress (gdbarch, ir.addr)); + warning (_("Process record ignores the memory " + "change of instruction at " + "address %s because it can't get " + "the value of the segment " + "register."), + paddress (gdbarch, ir.orig_addr)); } else { @@ -5138,15 +5154,14 @@ reswitch: else { /* sidt */ - if (ir.override >=3D 0) + if (i386_record_check_override (&ir)) { - if (record_debug) - printf_unfiltered (_("Process record ignores the memory " - "change of instruction at " - "address %s because it can't get " - "the value of the segment " - "register.\n"), - paddress (gdbarch, ir.addr)); + warning (_("Process record ignores the memory " + "change of instruction at " + "address %s because it can't get " + "the value of the segment " + "register."), + paddress (gdbarch, ir.orig_addr)); } else { --00151773e73088f7670472533d2e Content-Type: text/plain; charset=US-ASCII; name="prec-i386-override.txt" Content-Disposition: attachment; filename="prec-i386-override.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fyz7bvsm0 Content-length: 8536 LS0tCiBpMzg2LXRkZXAuYyB8ICAxMDMgKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZp bGUgY2hhbmdlZCwgNTkgaW5zZXJ0aW9ucygrKSwgNDQgZGVsZXRpb25zKC0p CgotLS0gYS9pMzg2LXRkZXAuYworKysgYi9pMzg2LXRkZXAuYwpAQCAtMjg2 Nyw2ICsyODY3LDcgQEAgc3RydWN0IGkzODZfcmVjb3JkX3MKIHsKICAgc3Ry dWN0IGdkYmFyY2ggKmdkYmFyY2g7CiAgIHN0cnVjdCByZWdjYWNoZSAqcmVn Y2FjaGU7CisgIENPUkVfQUREUiBvcmlnX2FkZHI7CiAgIENPUkVfQUREUiBh ZGRyOwogICBpbnQgYWZsYWc7CiAgIGludCBkZmxhZzsKQEAgLTMxNDcsNiAr MzE0OCwyNiBAQCBub19ybToKICAgcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBp bnQKK2kzODZfcmVjb3JkX2NoZWNrX292ZXJyaWRlIChzdHJ1Y3QgaTM4Nl9y ZWNvcmRfcyAqaXJwKQoreworICBpZiAoaXJwLT5vdmVycmlkZSA+PSAwICYm IGlycC0+b3ZlcnJpZGUgIT0gWDg2X1JFQ09SRF9EU19SRUdOVU0pCisgICAg eworICAgICAgVUxPTkdFU1QgdG1wLCBkczsKKworICAgICAgcmVnY2FjaGVf cmF3X3JlYWRfdW5zaWduZWQgKGlycC0+cmVnY2FjaGUsCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaXJwLT5yZWdtYXBbaXJwLT5vdmVy cmlkZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRt cCk7CisgICAgICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25lZCAoaXJwLT5y ZWdjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp cnAtPnJlZ21hcFtYODZfUkVDT1JEX0RTX1JFR05VTV0sCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJmRzKTsKKyAgICAgIGlmICh0bXAg IT0gZHMpCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICByZXR1cm4g MDsKK30KKwogLyogUmVjb3JkIHRoZSB2YWx1ZSBvZiB0aGUgbWVtb3J5IHRo YXQgd2lsbGJlIGNoYW5nZWQgaW4gY3VycmVudCBpbnN0cnVjdGlvbgogICAg dG8gInJlY29yZF9hcmNoX2xpc3QiLgogICAgUmV0dXJuIC0xIGlmIHNvbWV0 aGluZyB3cm9uZy4gKi8KQEAgLTMxNTcsMTMgKzMxNzgsMTIgQEAgaTM4Nl9y ZWNvcmRfbGVhX21vZHJtIChzdHJ1Y3QgaTM4Nl9yZWNvcgogICBzdHJ1Y3Qg Z2RiYXJjaCAqZ2RiYXJjaCA9IGlycC0+Z2RiYXJjaDsKICAgdWludDY0X3Qg YWRkcjsKIAotICBpZiAoaXJwLT5vdmVycmlkZSA+PSAwKQorICBpZiAoaTM4 Nl9yZWNvcmRfY2hlY2tfb3ZlcnJpZGUgKGlycCkpCiAgICAgewotICAgICAg aWYgKHJlY29yZF9kZWJ1ZykKLQlwcmludGZfdW5maWx0ZXJlZCAoXygiUHJv Y2VzcyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5IGNoYW5nZSAiCi0JCQkg ICAgICJvZiBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzIGJlY2F1c2UgaXQg IgotCQkJICAgICAiY2FuJ3QgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VnbWVu dCByZWdpc3Rlci5cbiIpLAotCQkJICAgcGFkZHJlc3MgKGdkYmFyY2gsIGly cC0+YWRkcikpOworICAgICAgd2FybmluZyAoXygiUHJvY2VzcyByZWNvcmQg aWdub3JlcyB0aGUgbWVtb3J5IGNoYW5nZSAiCisgICAgICAgICAgICAgICAg ICJvZiBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzIGJlY2F1c2UgaXQgIgor ICAgICAgICAgICAgICAgICAiY2FuJ3QgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUg c2VnbWVudCByZWdpc3Rlci4iKSwKKyAgICAgICAgICAgICAgIHBhZGRyZXNz IChnZGJhcmNoLCBpcnAtPm9yaWdfYWRkcikpOwogICAgICAgcmV0dXJuIDA7 CiAgICAgfQogCkBAIC0zMjIxLDYgKzMyNDEsNyBAQCBpMzg2X3Byb2Nlc3Nf cmVjb3JkIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiCiAgIG1lbXNldCAoJmlyLCAw LCBzaXplb2YgKHN0cnVjdCBpMzg2X3JlY29yZF9zKSk7CiAgIGlyLnJlZ2Nh Y2hlID0gcmVnY2FjaGU7CiAgIGlyLmFkZHIgPSBhZGRyOworICBpci5vcmln X2FkZHIgPSBhZGRyOwogICBpci5hZmxhZyA9IDE7CiAgIGlyLmRmbGFnID0g MTsKICAgaXIub3ZlcnJpZGUgPSAtMTsKQEAgLTQwMzksMTQgKzQwNjAsMTMg QEAgcmVzd2l0Y2g6CiAgICAgICAvKiBtb3YgRUFYICovCiAgICAgY2FzZSAw eGEyOgogICAgIGNhc2UgMHhhMzoKLSAgICAgIGlmIChpci5vdmVycmlkZSA+ PSAwKQorICAgICAgaWYgKGkzODZfcmVjb3JkX2NoZWNrX292ZXJyaWRlICgm aXIpKQogICAgICAgICB7Ci0JICBpZiAocmVjb3JkX2RlYnVnKQotCSAgICBw cmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQgaWdub3JlcyB0 aGUgbWVtb3J5IGNoYW5nZSAiCi0JCQkJICJvZiBpbnN0cnVjdGlvbiBhdCBh ZGRyZXNzIDB4JXMgYmVjYXVzZSAiCi0JCQkJICJpdCBjYW4ndCBnZXQgdGhl IHZhbHVlIG9mIHRoZSBzZWdtZW50ICIKLQkJCQkgInJlZ2lzdGVyLlxuIiks Ci0JCQkgICAgICAgcGFkZHJlc3MgKGdkYmFyY2gsIGlyLmFkZHIpKTsKKwkg IHdhcm5pbmcgKF8oIlByb2Nlc3MgcmVjb3JkIGlnbm9yZXMgdGhlIG1lbW9y eSBjaGFuZ2UgIgorICAgICAgICAgICAgICAgICAgICAgIm9mIGluc3RydWN0 aW9uIGF0IGFkZHJlc3MgMHglcyBiZWNhdXNlICIKKyAgICAgICAgICAgICAg ICAgICAgICJpdCBjYW4ndCBnZXQgdGhlIHZhbHVlIG9mIHRoZSBzZWdtZW50 ICIKKyAgICAgICAgICAgICAgICAgICAgICJyZWdpc3Rlci4iKSwKKyAgICAg ICAgICAgICAgICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIub3JpZ19hZGRy KSk7CiAJfQogICAgICAgZWxzZQogCXsKQEAgLTQ0NTgsMjcgKzQ0NzgsMjQg QEAgcmVzd2l0Y2g6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIGlyLnJlZ21hcFtYODZfUkVDT1JEX1JFRElfUkVHTlVNXSwKICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcHVsb25n ZXN0KTsKIAotICAgICAgICAgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVk IChpci5yZWdjYWNoZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaXIucmVnbWFwW1g4Nl9SRUNPUkRfRVNfUkVHTlVNXSwKLSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVzKTsKLSAg ICAgICAgICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25lZCAoaXIucmVnY2Fj aGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGly LnJlZ21hcFtYODZfUkVDT1JEX0RTX1JFR05VTV0sCi0gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICZkcyk7Ci0gICAgICAgICAgaWYg KGlyLmFmbGFnICYmIChlcyAhPSBkcykpCisgICAgICAgICAgaXIub3ZlcnJp ZGUgPSBYODZfUkVDT1JEX0VTX1JFR05VTTsKKyAgICAgICAgICBpZiAoaXIu YWZsYWcgJiYgaTM4Nl9yZWNvcmRfY2hlY2tfb3ZlcnJpZGUgKCZpcikpCiAg ICAgICAgICAgICB7CiAgICAgICAgICAgICAgIC8qIGFkZHIgKz0gKCh1aW50 MzJfdCkgcmVhZF9yZWdpc3RlciAoSTM4Nl9FU19SRUdOVU0pKSA8PCA0OyAq LwotICAgICAgICAgICAgICBpZiAocmVjb3JkX2RlYnVnKQotICAgICAgICAg ICAgICAgIHByaW50Zl91bmZpbHRlcmVkIChfKCJQcm9jZXNzIHJlY29yZCBp Z25vcmVzIHRoZSBtZW1vcnkgIgotCQkJCSAgICAgImNoYW5nZSBvZiBpbnN0 cnVjdGlvbiBhdCBhZGRyZXNzIDB4JXMgIgotCQkJCSAgICAgImJlY2F1c2Ug aXQgY2FuJ3QgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgIgotCQkJCSAgICAgIkVT IHNlZ21lbnQgcmVnaXN0ZXIuXG4iKSwKLSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgcGFkZHJlc3MgKGdkYmFyY2gsIGlyLmFkZHIpKTsK KyAgICAgICAgICAgICAgd2FybmluZyAoXygiUHJvY2VzcyByZWNvcmQgaWdu b3JlcyB0aGUgbWVtb3J5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAi Y2hhbmdlIG9mIGluc3RydWN0aW9uIGF0IGFkZHJlc3MgMHglcyAiCisgICAg ICAgICAgICAgICAgICAgICAgICAgImJlY2F1c2UgaXQgY2FuJ3QgZ2V0IHRo ZSB2YWx1ZSBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJF UyBzZWdtZW50IHJlZ2lzdGVyLiIpLAorICAgICAgICAgICAgICAgICAgICAg ICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIub3JpZ19hZGRyKSk7CisgICAgICAg ICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAg ICAgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtICh0bXB1bG9u Z2VzdCwgMSA8PCBpci5vdCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0x OwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgaWYgKHByZWZpeGVzICYg KFBSRUZJWF9SRVBaIHwgUFJFRklYX1JFUE5aKSkKICAgICAgICAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFQ1hf UkVHTlVNKTsKLSAgICAgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf bWVtICh0bXB1bG9uZ2VzdCwgMSA8PCBpci5vdCkpCi0gICAgICAgICAgICBy ZXR1cm4gLTE7CiAgICAgICAgICAgaWYgKG9wY29kZSA9PSAweGE0IHx8IG9w Y29kZSA9PSAweGE1KQogICAgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTSV9SRUdOVU0pOwogICAgICAg ICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JE X1JFRElfUkVHTlVNKTsKQEAgLTUwODYsMTUgKzUxMDMsMTQgQEAgcmVzd2l0 Y2g6CiAJCW9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07CiAJCWdv dG8gbm9fc3VwcG9ydDsKIAkgICAgICB9Ci0JICAgIGlmIChpci5vdmVycmlk ZSA+PSAwKQorCSAgICBpZiAoaTM4Nl9yZWNvcmRfY2hlY2tfb3ZlcnJpZGUg KCZpcikpCiAJICAgICAgewotCQlpZiAocmVjb3JkX2RlYnVnKQotCQkgIHBy aW50Zl91bmZpbHRlcmVkIChfKCJQcm9jZXNzIHJlY29yZCBpZ25vcmVzIHRo ZSBtZW1vcnkgIgotCQkJCSAgICAgICAiY2hhbmdlIG9mIGluc3RydWN0aW9u IGF0ICIKLQkJCQkgICAgICAgImFkZHJlc3MgJXMgYmVjYXVzZSBpdCBjYW4n dCBnZXQgIgotCQkJCSAgICAgICAidGhlIHZhbHVlIG9mIHRoZSBzZWdtZW50 ICIKLQkJCQkgICAgICAgInJlZ2lzdGVyLlxuIiksCi0JCQkJICAgICBwYWRk cmVzcyAoZ2RiYXJjaCwgaXIuYWRkcikpOworCQl3YXJuaW5nIChfKCJQcm9j ZXNzIHJlY29yZCBpZ25vcmVzIHRoZSBtZW1vcnkgIgorICAgICAgICAgICAg ICAgICAgICAgICAgICAgImNoYW5nZSBvZiBpbnN0cnVjdGlvbiBhdCAiCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcmVzcyAlcyBiZWNhdXNl IGl0IGNhbid0IGdldCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAi dGhlIHZhbHVlIG9mIHRoZSBzZWdtZW50ICIKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICJyZWdpc3Rlci4iKSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIub3JpZ19hZGRyKSk7CiAJICAg ICAgfQogCSAgICBlbHNlCiAJICAgICAgewpAQCAtNTEzOCwxNSArNTE1NCwx NCBAQCByZXN3aXRjaDoKIAkgIGVsc2UKIAkgICAgewogCSAgICAgIC8qIHNp ZHQgKi8KLQkgICAgICBpZiAoaXIub3ZlcnJpZGUgPj0gMCkKKwkgICAgICBp ZiAoaTM4Nl9yZWNvcmRfY2hlY2tfb3ZlcnJpZGUgKCZpcikpCiAJCXsKLQkJ ICBpZiAocmVjb3JkX2RlYnVnKQotCQkgICAgcHJpbnRmX3VuZmlsdGVyZWQg KF8oIlByb2Nlc3MgcmVjb3JkIGlnbm9yZXMgdGhlIG1lbW9yeSAiCi0JCQkJ CSAiY2hhbmdlIG9mIGluc3RydWN0aW9uIGF0ICIKLQkJCQkJICJhZGRyZXNz ICVzIGJlY2F1c2UgaXQgY2FuJ3QgZ2V0ICIKLQkJCQkJICJ0aGUgdmFsdWUg b2YgdGhlIHNlZ21lbnQgIgotCQkJCQkgInJlZ2lzdGVyLlxuIiksCi0JCQkJ ICAgICAgIHBhZGRyZXNzIChnZGJhcmNoLCBpci5hZGRyKSk7CisJCSAgd2Fy bmluZyAoXygiUHJvY2VzcyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5ICIK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5nZSBvZiBpbnN0 cnVjdGlvbiBhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJh ZGRyZXNzICVzIGJlY2F1c2UgaXQgY2FuJ3QgZ2V0ICIKKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgInRoZSB2YWx1ZSBvZiB0aGUgc2VnbWVudCAi CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpc3Rlci4iKSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRyZXNzIChnZGJhcmNo LCBpci5vcmlnX2FkZHIpKTsKIAkJfQogCSAgICAgIGVsc2UKIAkJewo= --00151773e73088f7670472533d2e--