From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20884 invoked by alias); 20 Jul 2009 14:09:32 -0000 Received: (qmail 20845 invoked by uid 22791); 20 Jul 2009 14:09:16 -0000 X-SWARE-Spam-Status: No, hits=0.4 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_22,J_CHICKENPOX_23,J_CHICKENPOX_24,J_CHICKENPOX_25,J_CHICKENPOX_26,J_CHICKENPOX_27,J_CHICKENPOX_28,SARE_MSGID_LONG40,SPF_PASS X-Spam-Check-By: sourceware.org Received: from wf-out-1314.google.com (HELO wf-out-1314.google.com) (209.85.200.169) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 20 Jul 2009 14:09:00 +0000 Received: by wf-out-1314.google.com with SMTP id 23so762533wfg.24 for ; Mon, 20 Jul 2009 07:08:58 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.165.19 with SMTP id s19mr976515wfo.36.1248098938155; Mon, 20 Jul 2009 07:08:58 -0700 (PDT) In-Reply-To: References: <4A5A810B.7080603@vmware.com> <4A610EE8.1090904@vmware.com> <4A63BF8B.4020906@vmware.com> From: Hui Zhu Date: Mon, 20 Jul 2009 14:24:00 -0000 Message-ID: Subject: Re: [RFA/RFC Prec] Add Linux AMD64 process record support second version, (instruction set support) 1/3 To: Michael Snyder , Mark Kettenis Cc: gdb-patches ml Content-Type: multipart/mixed; boundary=001636e91011da75fc046f23adb6 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-07/txt/msg00479.txt.bz2 --001636e91011da75fc046f23adb6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 73976 On Mon, Jul 20, 2009 at 14:13, Hui Zhu wrote: > Oops, I found a lot of push code need be check clear. > > Thanks for you remind me. =A0I will check them all. > > Hui > > On Mon, Jul 20, 2009 at 08:51, Michael Snyder wrote: >> Hi Hui, >> >> I think I discovered a bug in this one. =A0In 64-bit mode, >> the "call immediate" instruction is not correctly logging >> the pushed return address. =A0It's only saving 4 bytes. >> >> Please tell me what you think of this patch to your patch? >> >> Michael >> >> --- i386-tdep.c 2009-07-19 17:51:58.000300000 -0700 >> +++ tmp/i386-tdep.c =A0 =A0 2009-07-19 17:51:51.000907000 -0700 >> @@ -4563,6 +4563,8 @@ reswitch: >> >> =A0 =A0 =A0 /* call im */ >> =A0 =A0 case 0xe8: >> + =A0 =A0 =A0if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) >> + =A0 =A0 =A0 =A0ir.dflag =3D 2; >> =A0 =A0 =A0 if (i386_record_push (&ir, 1 << (ir.dflag + 1))) >> =A0 =A0 =A0 =A0 return -1; >> =A0 =A0 =A0 break; >> >> > Hi guys, I make a new version to fix the error. Please help me review it. Thanks, Hui 2009-07-20 Hui Zhu Michael Snyder Add AMD64 process record instruction set support. * i386-tdep.h (gdbarch_tdep): Add record_regmap for registers because the AMD64's registers order in GDB is not same with I386 instructions. Add i386_syscall_record to be the syscall function handle interface. (record_i386_regnum): Number for record_regmap. * i386-tdep.c (OT_QUAD): For 64 bits. (i386_record_s): Add rex_x, rex_b, rip_offset and popl_esp_hack for AMD64 instruction set. And regmap for record_regmap. (i386_record_lea_modrm_addr): Support AMD64 instruction set 64 bits lea. (i386_record_lea_modrm): Ditto. (i386_record_push): New function. Record the execution log of push. (I386_RECORD_ARCH_LIST_ADD_REG): New macro to record the register. (i386_process_record): Support AMD64 instruction set. amd64-tdep.c (amd64_record_regmap): For record_regmap. (amd64_init_abi): Set amd64_record_regmap to record_regmap. --- amd64-tdep.c | 12 i386-tdep.c | 1445 ++++++++++++++++++++++++++++++++----------------------= ----- i386-tdep.h | 35 + 3 files changed, 833 insertions(+), 659 deletions(-) --- a/amd64-tdep.c +++ b/amd64-tdep.c @@ -1989,6 +1989,16 @@ amd64_get_longjmp_target (struct frame_i return 1; } +static const int amd64_record_regmap[] =3D +{ + AMD64_RAX_REGNUM, AMD64_RCX_REGNUM, AMD64_RDX_REGNUM, AMD64_RBX_REGNUM, + AMD64_RSP_REGNUM, AMD64_RBP_REGNUM, AMD64_RSI_REGNUM, AMD64_RDI_REGNUM, + AMD64_R8_REGNUM, AMD64_R9_REGNUM, AMD64_R10_REGNUM, AMD64_R11_REGNUM, + AMD64_R12_REGNUM, AMD64_R13_REGNUM, AMD64_R14_REGNUM, AMD64_R15_REGNUM, + AMD64_RIP_REGNUM, AMD64_EFLAGS_REGNUM, AMD64_CS_REGNUM, AMD64_SS_REGNUM, + AMD64_DS_REGNUM, AMD64_ES_REGNUM, AMD64_FS_REGNUM, AMD64_GS_REGNUM +}; + void amd64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch) { @@ -2051,6 +2061,8 @@ amd64_init_abi (struct gdbarch_info info set_gdbarch_num_pseudo_regs (gdbarch, 0); tdep->mm0_regnum =3D -1; + tdep->record_regmap =3D amd64_record_regmap; + set_gdbarch_dummy_id (gdbarch, amd64_dummy_id); frame_unwind_append_unwinder (gdbarch, &amd64_sigtramp_frame_unwind); --- a/i386-tdep.c +++ b/i386-tdep.c @@ -2847,6 +2847,7 @@ enum OT_BYTE =3D 0, OT_WORD, OT_LONG, + OT_QUAD, }; /* i386 arith/logic operations */ @@ -2864,6 +2865,7 @@ enum struct i386_record_s { + struct gdbarch *gdbarch; struct regcache *regcache; CORE_ADDR addr; int aflag; @@ -2872,6 +2874,11 @@ struct i386_record_s uint8_t modrm; uint8_t mod, reg, rm; int ot; + uint8_t rex_x; + uint8_t rex_b; + int rip_offset; + int popl_esp_hack; + const int *regmap; }; /* Parse "modrm" part in current memory address that irp->addr point to @@ -2880,7 +2887,7 @@ struct i386_record_s static int i386_record_modrm (struct i386_record_s *irp) { - struct gdbarch *gdbarch =3D get_regcache_arch (irp->regcache); + struct gdbarch *gdbarch =3D irp->gdbarch; if (target_read_memory (irp->addr, &irp->modrm, 1)) { @@ -2903,12 +2910,13 @@ i386_record_modrm (struct i386_record_s Return -1 if something wrong. */ static int -i386_record_lea_modrm_addr (struct i386_record_s *irp, uint32_t * addr) +i386_record_lea_modrm_addr (struct i386_record_s *irp, uint64_t *addr) { - struct gdbarch *gdbarch =3D get_regcache_arch (irp->regcache); + struct gdbarch *gdbarch =3D irp->gdbarch; uint8_t tmpu8; - uint16_t tmpu16; - uint32_t tmpu32; + int16_t tmpi16; + int32_t tmpi32; + ULONGEST tmpulongest; *addr =3D 0; if (irp->aflag) @@ -2932,9 +2940,10 @@ i386_record_lea_modrm_addr (struct i386_ } irp->addr++; scale =3D (tmpu8 >> 6) & 3; - index =3D ((tmpu8 >> 3) & 7); + index =3D ((tmpu8 >> 3) & 7) | irp->rex_x; base =3D (tmpu8 & 7); } + base |=3D irp->rex_b; switch (irp->mod) { @@ -2942,7 +2951,7 @@ i386_record_lea_modrm_addr (struct i386_ if ((base & 7) =3D=3D 5) { base =3D 0xff; - if (target_read_memory (irp->addr, (gdb_byte *) addr, 4)) + if (target_read_memory (irp->addr, (gdb_byte *) &tmpi32, 4)) { if (record_debug) printf_unfiltered (_("Process record: error reading " @@ -2951,6 +2960,9 @@ i386_record_lea_modrm_addr (struct i386_ return -1; } irp->addr +=3D 4; + *addr =3D tmpi32; + if (irp->regmap[X86_RECORD_R8_REGNUM] && !havesib) + *addr +=3D irp->addr + irp->rip_offset; } else { @@ -2970,7 +2982,7 @@ i386_record_lea_modrm_addr (struct i386_ *addr =3D (int8_t) tmpu8; break; case 2: - if (target_read_memory (irp->addr, (gdb_byte *) addr, 4)) + if (target_read_memory (irp->addr, (gdb_byte *) &tmpi32, 4)) { if (record_debug) printf_unfiltered (_("Process record: error reading memory " @@ -2978,21 +2990,34 @@ i386_record_lea_modrm_addr (struct i386_ paddress (gdbarch, irp->addr)); return -1; } + *addr =3D tmpi32; irp->addr +=3D 4; break; } + tmpulongest =3D 0; if (base !=3D 0xff) - { - regcache_raw_read (irp->regcache, base, (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + { + if (base =3D=3D 4 && irp->popl_esp_hack) + *addr +=3D irp->popl_esp_hack; + regcache_raw_read_unsigned (irp->regcache, irp->regmap[base], + &tmpulongest); } + if (irp->aflag =3D=3D 2) + { + *addr +=3D tmpulongest; + } + else + *addr =3D (uint32_t) (tmpulongest + *addr); - /* XXX: index =3D=3D 4 is always invalid */ if (havesib && (index !=3D 4 || scale !=3D 0)) { - regcache_raw_read (irp->regcache, index, (gdb_byte *) & tmpu32); - *addr +=3D tmpu32 << scale; + regcache_raw_read_unsigned (irp->regcache, irp->regmap[index], + &tmpulongest); + if (irp->aflag =3D=3D 2) + *addr +=3D tmpulongest << scale; + else + *addr =3D (uint32_t) (*addr + (tmpulongest << scale)); } } else @@ -3004,7 +3029,7 @@ i386_record_lea_modrm_addr (struct i386_ if (irp->rm =3D=3D 6) { if (target_read_memory - (irp->addr, (gdb_byte *) & tmpu16, 2)) + (irp->addr, (gdb_byte *) &tmpi16, 2)) { if (record_debug) printf_unfiltered (_("Process record: error reading " @@ -3013,7 +3038,7 @@ i386_record_lea_modrm_addr (struct i386_ return -1; } irp->addr +=3D 2; - *addr =3D (int16_t) tmpu16; + *addr =3D tmpi16; irp->rm =3D 0; goto no_rm; } @@ -3035,7 +3060,7 @@ i386_record_lea_modrm_addr (struct i386_ *addr =3D (int8_t) tmpu8; break; case 2: - if (target_read_memory (irp->addr, (gdb_byte *) & tmpu16, 2)) + if (target_read_memory (irp->addr, (gdb_byte *) &tmpi16, 2)) { if (record_debug) printf_unfiltered (_("Process record: error reading memory " @@ -3044,63 +3069,75 @@ i386_record_lea_modrm_addr (struct i386_ return -1; } irp->addr +=3D 2; - *addr =3D (int16_t) tmpu16; + *addr =3D tmpi16; break; } switch (irp->rm) { case 0: - regcache_raw_read (irp->regcache, I386_EBX_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; - regcache_raw_read (irp->regcache, I386_ESI_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REBX_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_RESI_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 1: - regcache_raw_read (irp->regcache, I386_EBX_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; - regcache_raw_read (irp->regcache, I386_EDI_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REBX_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REDI_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 2: - regcache_raw_read (irp->regcache, I386_EBP_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; - regcache_raw_read (irp->regcache, I386_ESI_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REBP_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_RESI_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 3: - regcache_raw_read (irp->regcache, I386_EBP_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; - regcache_raw_read (irp->regcache, I386_EDI_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REBP_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REDI_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 4: - regcache_raw_read (irp->regcache, I386_ESI_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_RESI_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 5: - regcache_raw_read (irp->regcache, I386_EDI_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REDI_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 6: - regcache_raw_read (irp->regcache, I386_EBP_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REBP_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; case 7: - regcache_raw_read (irp->regcache, I386_EBX_REGNUM, - (gdb_byte *) & tmpu32); - *addr +=3D tmpu32; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_REBX_REGNUM], + &tmpulongest); + *addr =3D (uint32_t) (*addr + tmpulongest); break; } *addr &=3D 0xffff; @@ -3117,10 +3154,10 @@ no_rm: static int i386_record_lea_modrm (struct i386_record_s *irp) { - struct gdbarch *gdbarch =3D get_regcache_arch (irp->regcache); - uint32_t addr; + struct gdbarch *gdbarch =3D irp->gdbarch; + uint64_t addr; - if (irp->override) + if (irp->override >=3D 0) { if (record_debug) printf_unfiltered (_("Process record ignores the memory change " @@ -3139,10 +3176,33 @@ i386_record_lea_modrm (struct i386_recor return 0; } +/* Record the push operation to "record_arch_list". + Return -1 if something wrong. */ + +static int +i386_record_push (struct i386_record_s *irp, int size) +{ + ULONGEST tmpulongest; + + if (record_arch_list_add_reg (irp->regcache, + irp->regmap[X86_RECORD_RESP_REGNUM])) + return -1; + regcache_raw_read_unsigned (irp->regcache, + irp->regmap[X86_RECORD_RESP_REGNUM], + &tmpulongest); + if (record_arch_list_add_mem ((CORE_ADDR) tmpulongest - size, size)) + return -1; + + return 0; +} + /* Parse the current instruction and record the values of the registers and memory that will be changed in current instruction to "record_arch_list= ". Return -1 if something wrong. */ +#define I386_RECORD_ARCH_LIST_ADD_REG(regnum) \ + record_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)]) + int i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR addr) @@ -3151,14 +3211,22 @@ i386_process_record (struct gdbarch *gdb uint8_t tmpu8; uint16_t tmpu16; uint32_t tmpu32; + ULONGEST tmpulongest; uint32_t opcode; struct i386_record_s ir; + int rex =3D 0; + uint8_t rex_w =3D -1; + uint8_t rex_r =3D 0; memset (&ir, 0, sizeof (struct i386_record_s)); ir.regcache =3D regcache; ir.addr =3D addr; ir.aflag =3D 1; ir.dflag =3D 1; + ir.override =3D -1; + ir.popl_esp_hack =3D 0; + ir.regmap =3D gdbarch_tdep (gdbarch)->record_regmap; + ir.gdbarch =3D gdbarch; if (record_debug > 1) fprintf_unfiltered (gdb_stdlog, "Process record: i386_process_record " @@ -3189,22 +3257,22 @@ i386_process_record (struct gdbarch *gdb prefixes |=3D PREFIX_LOCK; break; case 0x2e: - ir.override =3D I386_CS_REGNUM; + ir.override =3D X86_RECORD_CS_REGNUM; break; case 0x36: - ir.override =3D I386_SS_REGNUM; + ir.override =3D X86_RECORD_SS_REGNUM; break; case 0x3e: - ir.override =3D I386_DS_REGNUM; + ir.override =3D X86_RECORD_DS_REGNUM; break; case 0x26: - ir.override =3D I386_ES_REGNUM; + ir.override =3D X86_RECORD_ES_REGNUM; break; case 0x64: - ir.override =3D I386_FS_REGNUM; + ir.override =3D X86_RECORD_FS_REGNUM; break; case 0x65: - ir.override =3D I386_GS_REGNUM; + ir.override =3D X86_RECORD_GS_REGNUM; break; case 0x66: prefixes |=3D PREFIX_DATA; @@ -3212,16 +3280,51 @@ i386_process_record (struct gdbarch *gdb case 0x67: prefixes |=3D PREFIX_ADDR; break; + case 0x40: + case 0x41: + case 0x42: + case 0x43: + case 0x44: + case 0x45: + case 0x46: + case 0x47: + case 0x48: + case 0x49: + case 0x4a: + case 0x4b: + case 0x4c: + case 0x4d: + case 0x4e: + case 0x4f: + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + /* REX */ + rex =3D 1; + rex_w =3D (tmpu8 >> 3) & 1; + rex_r =3D (tmpu8 & 0x4) << 1; + ir.rex_x =3D (tmpu8 & 0x2) << 2; + ir.rex_b =3D (tmpu8 & 0x1) << 3; + } + break; default: goto out_prefixes; break; } } out_prefixes: - if (prefixes & PREFIX_DATA) - ir.dflag ^=3D 1; + if (ir.regmap[X86_RECORD_R8_REGNUM] && rex_w =3D=3D 1) + { + ir.dflag =3D 2; + } + else + { + if (prefixes & PREFIX_DATA) + ir.dflag ^=3D 1; + } if (prefixes & PREFIX_ADDR) ir.aflag ^=3D 1; + else if (ir.regmap[X86_RECORD_R8_REGNUM]) + ir.aflag =3D 2; /* now check op code */ opcode =3D (uint32_t) tmpu8; @@ -3311,30 +3414,28 @@ reswitch: } else { - if (ir.ot =3D=3D OT_BYTE) + ir.rm |=3D ir.rex_b; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } break; /* OP Gv, Ev */ case 1: if (i386_record_modrm (&ir)) return -1; - if (ir.ot =3D=3D OT_BYTE) + ir.reg |=3D rex_r; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); break; /* OP A, Iv */ case 2: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); break; } } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* GRP1 */ @@ -3354,17 +3455,17 @@ reswitch: if (ir.mod !=3D 3) { + if (opcode =3D=3D 0x83) + ir.rip_offset =3D 1; + else + ir.rip_offset =3D (ir.ot > OT_LONG) ? 4 : (1 << ir.ot); if (i386_record_lea_modrm (&ir)) return -1; } else - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* inv */ @@ -3385,10 +3486,8 @@ reswitch: case 0x4d: case 0x4e: case 0x4f: - if (record_arch_list_add_reg (ir.regcache, opcode & 7)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (opcode & 7); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* GRP3 */ @@ -3401,28 +3500,17 @@ reswitch: if (i386_record_modrm (&ir)) return -1; + if (ir.mod !=3D 3 && ir.reg =3D=3D 0) + ir.rip_offset =3D (ir.ot > OT_LONG) ? 4 : (1 << ir.ot); + switch (ir.reg) { /* test */ case 0: - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* not */ case 2: - if (ir.mod !=3D 3) - { - if (i386_record_lea_modrm (&ir)) - return -1; - } - else - { - if (ir.ot =3D=3D OT_BYTE) - ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } - break; /* neg */ case 3: if (ir.mod !=3D 3) @@ -3432,13 +3520,14 @@ reswitch: } else { - if (ir.ot =3D=3D OT_BYTE) + ir.rm |=3D ir.rex_b; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + /* neg */ + if (ir.reg =3D=3D 3) + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* mul */ case 4: @@ -3448,15 +3537,10 @@ reswitch: case 6: /* idiv */ case 7: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); if (ir.ot !=3D OT_BYTE) - { - if (record_arch_list_add_reg (ir.regcache, I386_EDX_REGNUM)) - return -1; - } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; default: ir.addr -=3D 2; @@ -3470,10 +3554,6 @@ reswitch: case 0xfe: /* GRP5 */ case 0xff: - if ((opcode & 1) =3D=3D 0) - ir.ot =3D OT_BYTE; - else - ir.ot =3D ir.dflag + OT_WORD; if (i386_record_modrm (&ir)) return -1; if (ir.reg >=3D 2 && opcode =3D=3D 0xfe) @@ -3482,13 +3562,16 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - switch (ir.reg) { /* inc */ case 0: /* dec */ case 1: + if ((opcode & 1) =3D=3D 0) + ir.ot =3D OT_BYTE; + else + ir.ot =3D ir.dflag + OT_WORD; if (ir.mod !=3D 3) { if (i386_record_lea_modrm (&ir)) @@ -3496,42 +3579,40 @@ reswitch: } else { - if (ir.ot =3D=3D OT_BYTE) + ir.rm |=3D ir.rex_b; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* call */ case 2: - /* push */ - case 6: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 1)), (1 << (ir.dflag + 1)))) + if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) + ir.dflag =3D 2; + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* lcall */ case 3: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_CS_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 2)), (1 << (ir.dflag + 2)))) + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM); + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* jmp */ case 4: /* ljmp */ case 5: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; + /* push */ + case 6: + if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) + ir.dflag =3D 2; + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; break; default: ir.addr -=3D 2; @@ -3546,22 +3627,18 @@ reswitch: case 0x85: case 0xa8: case 0xa9: - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* CWDE/CBW */ case 0x98: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); break; /* CDQ/CWD */ case 0x99: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EDX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM); break; /* imul */ @@ -3571,12 +3648,15 @@ reswitch: ir.ot =3D ir.dflag + OT_WORD; if (i386_record_modrm (&ir)) return -1; - if (ir.ot =3D=3D OT_BYTE) + if (opcode =3D=3D 0x69) + ir.rip_offset =3D (ir.ot > OT_LONG) ? 4 : (1 << ir.ot); + else if (opcode =3D=3D 0x6b) + ir.rip_offset =3D 1; + ir.reg |=3D rex_r; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* xadd */ @@ -3588,28 +3668,25 @@ reswitch: ir.ot =3D ir.dflag + OT_WORD; if (i386_record_modrm (&ir)) return -1; + ir.reg |=3D rex_r; if (ir.mod =3D=3D 3) { - if (ir.ot =3D=3D OT_BYTE) + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; - if (ir.ot =3D=3D OT_BYTE) + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } else { if (i386_record_lea_modrm (&ir)) return -1; - if (ir.ot =3D=3D OT_BYTE) + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* cmpxchg */ @@ -3623,22 +3700,19 @@ reswitch: return -1; if (ir.mod =3D=3D 3) { - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (ir.ot =3D=3D OT_BYTE) + ir.reg |=3D rex_r; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); } else { - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); if (i386_record_lea_modrm (&ir)) return -1; } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* cmpxchg8b */ @@ -3651,14 +3725,11 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EDX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDX_REGNUM); if (i386_record_lea_modrm (&ir)) return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* push */ @@ -3672,6 +3743,12 @@ reswitch: case 0x57: case 0x68: case 0x6a: + if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) + ir.dflag =3D 2; + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; + break; + /* push es */ case 0x06: /* push cs */ @@ -3680,16 +3757,36 @@ reswitch: case 0x16: /* push ds */ case 0x1e: + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; + break; + /* push fs */ case 0x0fa0: /* push gs */ case 0x0fa8: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 2; + goto no_support; + } + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 1)), (1 << (ir.dflag + 1)))) + break; + + /* pusha */ + case 0x60: + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + if (i386_record_push (&ir, 1 << (ir.dflag + 4))) return -1; break; @@ -3702,113 +3799,104 @@ reswitch: case 0x5d: case 0x5e: case 0x5f: - ir.ot =3D ir.dflag + OT_WORD; - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (ir.ot =3D=3D OT_BYTE) - opcode &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, opcode & 0x7)) - return -1; - break; - - /* pusha */ - case 0x60: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 4)), (1 << (ir.dflag + 4)))) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b); break; /* popa */ case 0x61: - for (tmpu8 =3D I386_EAX_REGNUM; tmpu8 <=3D I386_EDI_REGNUM; tmpu8++) - { - if (record_arch_list_add_reg (ir.regcache, tmpu8)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; } + for (tmpu8 =3D X86_RECORD_REAX_REGNUM; tmpu8 <=3D X86_RECORD_REDI_RE= GNUM; + tmpu8++) + I386_RECORD_ARCH_LIST_ADD_REG (tmpu8); break; /* pop */ case 0x8f: - ir.ot =3D ir.dflag + OT_WORD; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + ir.ot =3D ir.dflag ? OT_QUAD : OT_WORD; + else + ir.ot =3D ir.dflag + OT_WORD; if (i386_record_modrm (&ir)) return -1; if (ir.mod =3D=3D 3) - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); else { + ir.popl_esp_hack =3D 1 << ir.ot; if (i386_record_lea_modrm (&ir)) return -1; } - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); break; /* enter */ case 0xc8: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EBP_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 1)), (1 << (ir.dflag + 1)))) + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM); + if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) + ir.dflag =3D 2; + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) return -1; break; /* leave */ case 0xc9: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EBP_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBP_REGNUM); break; /* pop es */ case 0x07: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_ES_REGNUM)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_ES_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* pop ss */ case 0x17: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_SS_REGNUM)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_SS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* pop ds */ case 0x1f: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_DS_REGNUM)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_DS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* pop fs */ case 0x0fa1: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_FS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_FS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* pop gs */ case 0x0fa9: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_GS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_GS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* mov */ @@ -3826,19 +3914,21 @@ reswitch: if (ir.mod !=3D 3) { + if (opcode =3D=3D 0xc6 || opcode =3D=3D 0xc7) + ir.rip_offset =3D (ir.ot > OT_LONG) ? 4 : (1 << ir.ot); if (i386_record_lea_modrm (&ir)) return -1; } else { - if (ir.ot =3D=3D OT_BYTE) + if (opcode =3D=3D 0xc6 || opcode =3D=3D 0xc7) + ir.rm |=3D ir.rex_b; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; break; + /* mov */ case 0x8a: case 0x8b: @@ -3846,40 +3936,55 @@ reswitch: ir.ot =3D OT_BYTE; else ir.ot =3D ir.dflag + OT_WORD; - if (i386_record_modrm (&ir)) return -1; - - if (ir.ot =3D=3D OT_BYTE) + ir.reg |=3D rex_r; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); + break; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) + /* mov seg */ + case 0x8c: + if (i386_record_modrm (&ir)) return -1; + if (ir.reg > 5) + { + ir.addr -=3D 2; + opcode =3D opcode << 8 | ir.modrm; + goto no_support; + } + + if (ir.mod =3D=3D 3) + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); + else + { + ir.ot =3D OT_WORD; + if (i386_record_lea_modrm (&ir)) + return -1; + } break; /* mov seg */ case 0x8e: if (i386_record_modrm (&ir)) return -1; - switch (ir.reg) { case 0: - tmpu8 =3D I386_ES_REGNUM; + tmpu8 =3D X86_RECORD_ES_REGNUM; break; case 2: - tmpu8 =3D I386_SS_REGNUM; + tmpu8 =3D X86_RECORD_SS_REGNUM; break; case 3: - tmpu8 =3D I386_DS_REGNUM; + tmpu8 =3D X86_RECORD_DS_REGNUM; break; case 4: - tmpu8 =3D I386_FS_REGNUM; + tmpu8 =3D X86_RECORD_FS_REGNUM; break; case 5: - tmpu8 =3D I386_GS_REGNUM; + tmpu8 =3D X86_RECORD_GS_REGNUM; break; default: ir.addr -=3D 2; @@ -3887,38 +3992,8 @@ reswitch: goto no_support; break; } - if (record_arch_list_add_reg (ir.regcache, tmpu8)) - return -1; - - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; - break; - - /* mov seg */ - case 0x8c: - if (i386_record_modrm (&ir)) - return -1; - if (ir.reg > 5) - { - ir.addr -=3D 2; - opcode =3D opcode << 8 | ir.modrm; - goto no_support; - } - - if (ir.mod =3D=3D 3) - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } - else - { - ir.ot =3D OT_WORD; - if (i386_record_lea_modrm (&ir)) - return -1; - } - - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (tmpu8); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* movzbS */ @@ -3931,8 +4006,7 @@ reswitch: case 0x0fbf: if (i386_record_modrm (&ir)) return -1; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r); break; /* lea */ @@ -3945,12 +4019,11 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - ir.ot =3D ir.dflag; - if (ir.ot =3D=3D OT_BYTE) + ir.reg |=3D rex_r; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); break; /* mov EAX */ @@ -3958,62 +4031,68 @@ reswitch: case 0xa1: /* xlat */ case 0xd7: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); break; /* mov EAX */ case 0xa2: case 0xa3: - { - uint32_t addr; - - if (ir.override) - { - 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)); - } - else - { - if ((opcode & 1) =3D=3D 0) - ir.ot =3D OT_BYTE; - else - ir.ot =3D ir.dflag + OT_WORD; - if (ir.aflag) - { - if (target_read_memory - (ir.addr, (gdb_byte *) & addr, 4)) - { - if (record_debug) - printf_unfiltered (_("Process record: error reading " - "memory at addr %s len =3D 4.\n"), - paddress (gdbarch, ir.addr)); - return -1; - } - ir.addr +=3D 4; - } - else - { - if (target_read_memory - (ir.addr, (gdb_byte *) & tmpu16, 4)) - { - if (record_debug) - printf_unfiltered (_("Process record: error reading " - "memory at addr %s len =3D 4.\n"), - paddress (gdbarch, ir.addr)); - return -1; - } - ir.addr +=3D 2; - addr =3D tmpu16; - } - if (record_arch_list_add_mem (addr, 1 << ir.ot)) - return -1; - } - } + if (ir.override >=3D 0) + { + 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)); + } + else + { + if ((opcode & 1) =3D=3D 0) + ir.ot =3D OT_BYTE; + else + ir.ot =3D ir.dflag + OT_WORD; + if (ir.aflag =3D=3D 2) + { + if (target_read_memory (ir.addr, (gdb_byte *) &addr, 8)) + { + if (record_debug) + printf_unfiltered (_("Process record: error reading " + "memory at addr 0x%s len =3D 8.\n"), + paddress (gdbarch, ir.addr)); + return -1; + } + ir.addr +=3D 8; + } + else if (ir.aflag) + { + if (target_read_memory (ir.addr, (gdb_byte *) &tmpu32, 4)) + { + if (record_debug) + printf_unfiltered (_("Process record: error reading " + "memory at addr 0x%s len =3D 4.\n"), + paddress (gdbarch, ir.addr)); + return -1; + } + ir.addr +=3D 4; + addr =3D tmpu32; + } + else + { + if (target_read_memory (ir.addr, (gdb_byte *) &tmpu16, 2)) + { + if (record_debug) + printf_unfiltered (_("Process record: error reading " + "memory at addr 0x%s len =3D 2.\n"), + paddress (gdbarch, ir.addr)); + return -1; + } + ir.addr +=3D 2; + addr =3D tmpu16; + } + if (record_arch_list_add_mem (addr, 1 << ir.ot)) + return -1; + } break; /* mov R, Ib */ @@ -4025,8 +4104,9 @@ reswitch: case 0xb5: case 0xb6: case 0xb7: - if (record_arch_list_add_reg (ir.regcache, (opcode & 0x7) & 0x3)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG ((ir.regmap[X86_RECORD_R8_REGNUM]) + ? ((opcode & 0x7) | ir.rex_b) + : ((opcode & 0x7) & 0x3)); break; /* mov R, Iv */ @@ -4038,8 +4118,7 @@ reswitch: case 0xbd: case 0xbe: case 0xbf: - if (record_arch_list_add_reg (ir.regcache, opcode & 0x7)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 0x7) | ir.rex_b); break; /* xchg R, EAX */ @@ -4050,10 +4129,8 @@ reswitch: case 0x95: case 0x96: case 0x97: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, opcode & 0x7)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (opcode & 0x7); break; /* xchg Ev, Gv */ @@ -4063,33 +4140,35 @@ reswitch: ir.ot =3D OT_BYTE; else ir.ot =3D ir.dflag + OT_WORD; - if (i386_record_modrm (&ir)) return -1; - if (ir.mod =3D=3D 3) { - if (ir.ot =3D=3D OT_BYTE) + ir.rm !=3D ir.rex_b; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } else { if (i386_record_lea_modrm (&ir)) return -1; } - - if (ir.ot =3D=3D OT_BYTE) + ir.reg |=3D rex_r; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); break; /* les Gv */ case 0xc4: /* lds Gv */ case 0xc5: + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } /* lss Gv */ case 0x0fb2: /* lfs Gv */ @@ -4107,35 +4186,32 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - switch (opcode) { /* les Gv */ case 0xc4: - tmpu8 =3D I386_ES_REGNUM; + tmpu8 =3D X86_RECORD_ES_REGNUM; break; /* lds Gv */ case 0xc5: - tmpu8 =3D I386_DS_REGNUM; + tmpu8 =3D X86_RECORD_DS_REGNUM; break; /* lss Gv */ case 0x0fb2: - tmpu8 =3D I386_SS_REGNUM; + tmpu8 =3D X86_RECORD_SS_REGNUM; break; /* lfs Gv */ case 0x0fb4: - tmpu8 =3D I386_FS_REGNUM; + tmpu8 =3D X86_RECORD_FS_REGNUM; break; /* lgs Gv */ case 0x0fb5: - tmpu8 =3D I386_GS_REGNUM; + tmpu8 =3D X86_RECORD_GS_REGNUM; break; } - if (record_arch_list_add_reg (ir.regcache, tmpu8)) - return -1; - - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (tmpu8); + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* shifts */ @@ -4149,10 +4225,8 @@ reswitch: ir.ot =3D OT_BYTE; else ir.ot =3D ir.dflag + OT_WORD; - if (i386_record_modrm (&ir)) return -1; - if (ir.mod !=3D 3 && (opcode =3D=3D 0xd2 || opcode =3D=3D 0xd3)) { if (i386_record_lea_modrm (&ir)) @@ -4160,14 +4234,12 @@ reswitch: } else { - if (ir.ot =3D=3D OT_BYTE) + ir.rm |=3D ir.rex_b; + if (ir.ot =3D=3D OT_BYTE && !ir.regmap[X86_RECORD_R8_REGNUM]) ir.rm &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm); } - - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; case 0x0fa4: @@ -4204,9 +4276,9 @@ reswitch: if (ir.mod !=3D 3) { /* memory */ - uint32_t addr; + uint64_t tmpu64; - if (i386_record_lea_modrm_addr (&ir, &addr)) + if (i386_record_lea_modrm_addr (&ir, &tmpu64)) return -1; switch (ir.reg) { @@ -4266,16 +4338,16 @@ reswitch: switch (ir.reg >> 4) { case 0: - if (record_arch_list_add_mem (addr, 4)) + if (record_arch_list_add_mem (tmpu64, 4)) return -1; break; case 2: - if (record_arch_list_add_mem (addr, 8)) + if (record_arch_list_add_mem (tmpu64, 8)) return -1; break; case 3: default: - if (record_arch_list_add_mem (addr, 2)) + if (record_arch_list_add_mem (tmpu64, 2)) return -1; break; } @@ -4285,16 +4357,16 @@ reswitch: { case 0: case 1: - if (record_arch_list_add_mem (addr, 4)) + if (record_arch_list_add_mem (tmpu64, 4)) return -1; break; case 2: - if (record_arch_list_add_mem (addr, 8)) + if (record_arch_list_add_mem (tmpu64, 8)) return -1; break; case 3: default: - if (record_arch_list_add_mem (addr, 2)) + if (record_arch_list_add_mem (tmpu64, 2)) return -1; break; } @@ -4311,43 +4383,43 @@ reswitch: case 0x0e: if (ir.dflag) { - if (record_arch_list_add_mem (addr, 28)) + if (record_arch_list_add_mem (tmpu64, 28)) return -1; } else { - if (record_arch_list_add_mem (addr, 14)) + if (record_arch_list_add_mem (tmpu64, 14)) return -1; } break; case 0x0f: case 0x2f: - if (record_arch_list_add_mem (addr, 2)) + if (record_arch_list_add_mem (tmpu64, 2)) return -1; break; case 0x1f: case 0x3e: - if (record_arch_list_add_mem (addr, 10)) + if (record_arch_list_add_mem (tmpu64, 10)) return -1; break; case 0x2e: if (ir.dflag) { - if (record_arch_list_add_mem (addr, 28)) + if (record_arch_list_add_mem (tmpu64, 28)) return -1; - addr +=3D 28; + tmpu64 +=3D 28; } else { - if (record_arch_list_add_mem (addr, 14)) + if (record_arch_list_add_mem (tmpu64, 14)) return -1; - addr +=3D 14; + tmpu64 +=3D 14; } - if (record_arch_list_add_mem (addr, 80)) + if (record_arch_list_add_mem (tmpu64, 80)) return -1; break; case 0x3f: - if (record_arch_list_add_mem (addr, 8)) + if (record_arch_list_add_mem (tmpu64, 8)) return -1; break; default: @@ -4369,123 +4441,88 @@ reswitch: /* insS */ case 0x6c: case 0x6d: - { - uint32_t addr; - - if ((opcode & 1) =3D=3D 0) - ir.ot =3D OT_BYTE; - else - ir.ot =3D ir.dflag + OT_WORD; - if (opcode =3D=3D 0xa4 || opcode =3D=3D 0xa5) - { - if (record_arch_list_add_reg (ir.regcache, I386_ESI_REGNUM)) - return -1; - } - if (record_arch_list_add_reg (ir.regcache, I386_EDI_REGNUM)) - return -1; - - regcache_raw_read (ir.regcache, I386_EDI_REGNUM, - (gdb_byte *) & addr); - if (!ir.aflag) - { - addr &=3D 0xffff; - /* 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 %s because " - "it can't get the value of the segment " - "register.\n"), - paddress (gdbarch, ir.addr)); - } - - if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) - { - uint32_t count; - - regcache_raw_read (ir.regcache, I386_ECX_REGNUM, - (gdb_byte *) & count); - if (!ir.aflag) - count &=3D 0xffff; - - regcache_raw_read (ir.regcache, I386_EFLAGS_REGNUM, - (gdb_byte *) & tmpu32); - if ((tmpu32 >> 10) & 0x1) - addr -=3D (count - 1) * (1 << ir.ot); - - if (ir.aflag) - { - if (record_arch_list_add_mem (addr, count * (1 << ir.ot))) - return -1; - } + if ((opcode & 1) =3D=3D 0) + ir.ot =3D OT_BYTE; + else + ir.ot =3D ir.dflag + OT_WORD; + regcache_raw_read_unsigned (ir.regcache, + ir.regmap[X86_RECORD_REDI_REGNUM], + &tmpulongest); + if (!ir.aflag) + { + tmpulongest &=3D 0xffff; + /* 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 segment " + "register.\n"), + paddress (gdbarch, ir.addr)); + } + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) + { + ULONGEST count, eflags; + regcache_raw_read_unsigned (ir.regcache, + ir.regmap[X86_RECORD_REDI_REGNUM], + &count); + if (!ir.aflag) + count &=3D 0xffff; + regcache_raw_read_unsigned (ir.regcache, + ir.regmap[X86_RECORD_EFLAGS_REGNUM], + &eflags); + if ((eflags >> 10) & 0x1) + tmpulongest -=3D (count - 1) * (1 << ir.ot); + if (record_arch_list_add_mem (tmpulongest, count * (1 << ir.ot))) + return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + } + else + { + 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); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; - } - else - { - if (ir.aflag) - { - if (record_arch_list_add_mem (addr, 1 << ir.ot)) - return -1; - } - } - } + /* cmpsS */ + case 0xa6: + case 0xa7: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM); + if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* lodsS */ case 0xac: case 0xad: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_ESI_REGNUM)) - return -1; - if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) - { - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; - } - break; - - /* outsS */ - case 0x6e: - case 0x6f: - if (record_arch_list_add_reg (ir.regcache, I386_ESI_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM); if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) - { - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* scasS */ case 0xae: case 0xaf: - if (record_arch_list_add_reg (ir.regcache, I386_EDI_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REDI_REGNUM); if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) - { - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; - } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; - /* cmpsS */ - case 0xa6: - case 0xa7: - if (record_arch_list_add_reg (ir.regcache, I386_EDI_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_ESI_REGNUM)) - return -1; + /* outsS */ + case 0x6e: + case 0x6f: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESI_REGNUM); if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) - { - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; - } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* port I/O */ @@ -4493,8 +4530,8 @@ reswitch: case 0xe5: case 0xec: case 0xed: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); break; case 0xe6: @@ -4508,48 +4545,39 @@ reswitch: case 0xc2: /* ret */ case 0xc3: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; + /* lret im */ case 0xca: /* lret */ case 0xcb: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_CS_REGNUM)) - return -1; - break; - /* iret */ case 0xcf: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_CS_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* call im */ case 0xe8: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 1)), (1 << (ir.dflag + 1)))) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) + ir.dflag =3D 2; + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; break; /* lcall im */ case 0x9a: - if (record_arch_list_add_reg (ir.regcache, I386_CS_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 2)), (1 << (ir.dflag + 2)))) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM); + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; break; /* jmp im */ @@ -4611,14 +4639,13 @@ reswitch: case 0x0f9d: case 0x0f9e: case 0x0f9f: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); ir.ot =3D OT_BYTE; if (i386_record_modrm (&ir)) return -1; if (ir.mod =3D=3D 3) - { - if (record_arch_list_add_reg (ir.regcache, ir.rm & 0x3)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (ir.rex_b ? (ir.rm | ir.rex_b) + : (ir.rm & 0x3)); else { if (i386_record_lea_modrm (&ir)) @@ -4645,34 +4672,35 @@ reswitch: case 0x0f4f: if (i386_record_modrm (&ir)) return -1; + ir.reg |=3D rex_r; if (ir.dflag =3D=3D OT_BYTE) ir.reg &=3D 0x3; - if (record_arch_list_add_reg (ir.regcache, ir.reg & 0x3)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg); break; /* flags */ /* pushf */ case 0x9c: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - regcache_raw_read (ir.regcache, I386_ESP_REGNUM, - (gdb_byte *) & tmpu32); - if (record_arch_list_add_mem - ((CORE_ADDR) tmpu32 - (1 << (ir.dflag + 1)), (1 << (ir.dflag + 1)))) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + if (ir.regmap[X86_RECORD_R8_REGNUM] && ir.dflag) + ir.dflag =3D 2; + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; break; /* popf */ case 0x9d: - if (record_arch_list_add_reg (ir.regcache, I386_ESP_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RESP_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* sahf */ case 0x9e: + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } /* cmc */ case 0xf5: /* clc */ @@ -4683,66 +4711,95 @@ reswitch: case 0xfc: /* std */ case 0xfd: - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* lahf */ case 0x9f: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); break; /* bit operations */ /* bt/bts/btr/btc Gv, im */ case 0x0fba: - /* bts */ - case 0x0fab: - /* btr */ - case 0x0fb3: - /* btc */ - case 0x0fbb: ir.ot =3D ir.dflag + OT_WORD; if (i386_record_modrm (&ir)) return -1; if (ir.reg < 4) { - ir.addr -=3D 3; + ir.addr -=3D 2; opcode =3D opcode << 8 | ir.modrm; goto no_support; } - ir.reg -=3D 4; - if (ir.reg !=3D 0) + if (ir.reg !=3D 4) { - if (ir.mod !=3D 3) - { - if (i386_record_lea_modrm (&ir)) - return -1; - } + if (ir.mod =3D=3D 3) + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); else { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) + if (i386_record_lea_modrm (&ir)) return -1; } } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* bt Gv, Ev */ case 0x0fa3: - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; + + /* bts */ + case 0x0fab: + /* btr */ + case 0x0fb3: + /* btc */ + case 0x0fbb: + ir.ot =3D ir.dflag + OT_WORD; + if (i386_record_modrm (&ir)) + return -1; + if (ir.mod =3D=3D 3) + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); + else + { + uint64_t tmpu64; + if (i386_record_lea_modrm_addr (&ir, &tmpu64)) + return -1; + regcache_raw_read_unsigned (ir.regcache, + ir.regmap[ir.reg | rex_r], + &tmpulongest); + switch (ir.dflag) + { + case 0: + tmpu64 +=3D ((int16_t) tmpulongest >> 4) << 4; + break; + case 1: + tmpu64 +=3D ((int32_t) tmpulongest >> 5) << 5; + break; + case 2: + tmpu64 +=3D ((int64_t) tmpulongest >> 6) << 6; + break; + } + if (record_arch_list_add_mem (tmpu64, 1 << ir.ot)) + return -1; + if (i386_record_lea_modrm (&ir)) + return -1; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* bsf */ case 0x0fbc: /* bsr */ case 0x0fbd: - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* bcd */ @@ -4758,10 +4815,13 @@ reswitch: case 0xd4: /* aad */ case 0xd5: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* misc */ @@ -4853,16 +4913,18 @@ reswitch: case 0x0fcd: case 0x0fce: case 0x0fcf: - if (record_arch_list_add_reg (ir.regcache, opcode & 7)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG ((opcode & 7) | ir.rex_b); break; /* salc */ case 0xd6: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 1; + goto no_support; + } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REAX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* loopnz */ @@ -4873,8 +4935,8 @@ reswitch: case 0xe2: /* jecxz */ case 0xe3: - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_RECX_REGNUM); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* wrmsr */ @@ -4905,6 +4967,11 @@ reswitch: case 0x0f34: { int ret; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + ir.addr -=3D 2; + goto no_support; + } if (gdbarch_tdep (gdbarch)->i386_sysenter_record =3D=3D NULL) { printf_unfiltered (_("Process record doesn't support " @@ -4926,16 +4993,37 @@ reswitch: goto no_support; break; + /* syscall */ + case 0x0f05: + { + int ret; + if (gdbarch_tdep (gdbarch)->i386_syscall_record =3D=3D NULL) + { + printf_unfiltered (_("Process record doesn't support " + "instruction syscall.\n")); + ir.addr -=3D 2; + goto no_support; + } + ret =3D gdbarch_tdep (gdbarch)->i386_syscall_record (ir.regcache); + if (ret) + return ret; + } + break; + + /* sysret */ + case 0x0f07: + printf_unfiltered (_("Process record doesn't support " + "instruction sysret.\n")); + ir.addr -=3D 2; + goto no_support; + break; + /* cpuid */ case 0x0fa2: - if (record_arch_list_add_reg (ir.regcache, I386_EAX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_ECX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EDX_REGNUM)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EBX_REGNUM)) - return -1; + 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); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REBX_REGNUM); break; /* hlt */ @@ -4956,10 +5044,7 @@ reswitch: /* str */ case 1: if (ir.mod =3D=3D 3) - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); else { ir.ot =3D OT_WORD; @@ -4976,8 +5061,7 @@ reswitch: case 4: /* verw */ case 5: - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; default: ir.addr -=3D 3; @@ -4995,7 +5079,7 @@ reswitch: /* sgdt */ case 0: { - uint32_t addr; + uint64_t tmpu64; if (ir.mod =3D=3D 3) { @@ -5003,8 +5087,7 @@ reswitch: opcode =3D opcode << 8 | ir.modrm; goto no_support; } - - if (ir.override) + if (ir.override >=3D 0) { if (record_debug) printf_unfiltered (_("Process record ignores the memory " @@ -5016,13 +5099,21 @@ reswitch: } else { - if (i386_record_lea_modrm_addr (&ir, &addr)) - return -1; - if (record_arch_list_add_mem (addr, 2)) + if (i386_record_lea_modrm_addr (&ir, &tmpu64)) return -1; - addr +=3D 2; - if (record_arch_list_add_mem (addr, 4)) + if (record_arch_list_add_mem (tmpu64, 2)) return -1; + tmpu64 +=3D 2; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + if (record_arch_list_add_mem (tmpu64, 8)) + return -1; + } + else + { + if (record_arch_list_add_mem (tmpu64, 4)) + return -1; + } } } break; @@ -5036,8 +5127,7 @@ reswitch: break; /* mwait */ case 1: - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; default: ir.addr -=3D 3; @@ -5049,7 +5139,7 @@ reswitch: else { /* sidt */ - if (ir.override) + if (ir.override >=3D 0) { if (record_debug) printf_unfiltered (_("Process record ignores the memory " @@ -5061,15 +5151,23 @@ reswitch: } else { - uint32_t addr; + uint64_t tmpu64; - if (i386_record_lea_modrm_addr (&ir, &addr)) + if (i386_record_lea_modrm_addr (&ir, &tmpu64)) return -1; - if (record_arch_list_add_mem (addr, 2)) + if (record_arch_list_add_mem (tmpu64, 2)) return -1; addr +=3D 2; - if (record_arch_list_add_mem (addr, 4)) - return -1; + if (ir.regmap[X86_RECORD_R8_REGNUM]) + { + if (record_arch_list_add_mem (tmpu64, 8)) + return -1; + } + else + { + if (record_arch_list_add_mem (tmpu64, 4)) + return -1; + } } } break; @@ -5077,9 +5175,6 @@ reswitch: case 2: /* lidt */ case 3: - /* invlpg */ - case 7: - default: if (ir.mod =3D=3D 3) { ir.addr -=3D 3; @@ -5091,7 +5186,7 @@ reswitch: case 4: if (ir.mod =3D=3D 3) { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) + if (record_arch_list_add_reg (ir.regcache, ir.rm | ir.rex_b)) return -1; } else @@ -5100,9 +5195,32 @@ reswitch: if (i386_record_lea_modrm (&ir)) return -1; } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* lmsw */ case 6: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); + break; + /* invlpg */ + case 7: + if (ir.mod =3D=3D 3) + { + 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; } break; @@ -5115,21 +5233,21 @@ reswitch: /* arpl */ case 0x63: - ir.ot =3D ir.dflag ? OT_LONG : OT_WORD; if (i386_record_modrm (&ir)) return -1; - if (ir.mod !=3D 3) - { - if (i386_record_lea_modrm (&ir)) - return -1; - } + if (ir.mod =3D=3D 3 || ir.regmap[X86_RECORD_R8_REGNUM]) + { + I386_RECORD_ARCH_LIST_ADD_REG (ir.regmap[X86_RECORD_R8_REGNUM] + ? (ir.reg | rex_r) : ir.rm); + } else - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + { + ir.ot =3D ir.dflag ? OT_LONG : OT_WORD; + if (i386_record_lea_modrm (&ir)) + return -1; + } + if (!ir.regmap[X86_RECORD_R8_REGNUM]) + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* lar */ @@ -5138,13 +5256,19 @@ reswitch: case 0x0f03: if (i386_record_modrm (&ir)) return -1; - if (record_arch_list_add_reg (ir.regcache, ir.reg)) - return -1; - if (record_arch_list_add_reg (ir.regcache, I386_EFLAGS_REGNUM)) - return -1; + I386_RECORD_ARCH_LIST_ADD_REG (ir.reg | rex_r); + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; case 0x0f18: + if (i386_record_modrm (&ir)) + return -1; + if (ir.mod =3D=3D 3 && ir.reg =3D=3D 3) + { + ir.addr -=3D 3; + opcode =3D opcode << 8 | ir.modrm; + goto no_support; + } break; /* nop (multi byte) */ @@ -5165,7 +5289,7 @@ reswitch: return -1; if ((ir.modrm & 0xc0) !=3D 0xc0) { - ir.addr -=3D 2; + ir.addr -=3D 3; opcode =3D opcode << 8 | ir.modrm; goto no_support; } @@ -5177,16 +5301,12 @@ reswitch: case 4: case 8: if (opcode & 2) - { - } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); else - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); break; default: - ir.addr -=3D 2; + ir.addr -=3D 3; opcode =3D opcode << 8 | ir.modrm; goto no_support; break; @@ -5202,22 +5322,19 @@ reswitch: if ((ir.modrm & 0xc0) !=3D 0xc0 || ir.reg =3D=3D 4 || ir.reg =3D=3D 5 || ir.reg >=3D 8) { - ir.addr -=3D 2; + ir.addr -=3D 3; opcode =3D opcode << 8 | ir.modrm; goto no_support; } if (opcode & 2) - { - } + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); else - { - if (record_arch_list_add_reg (ir.regcache, ir.rm)) - return -1; - } + I386_RECORD_ARCH_LIST_ADD_REG (ir.rm | ir.rex_b); break; /* clts */ case 0x0f06: + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_EFLAGS_REGNUM); break; /* MMX/SSE/SSE2/PNI support */ @@ -5232,9 +5349,8 @@ reswitch: break; } -/* In the future, Maybe still need to deal with need_dasm */ - if (record_arch_list_add_reg (ir.regcache, I386_EIP_REGNUM)) - return -1; + /* In the future, maybe still need to deal with need_dasm. */ + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_REIP_REGNUM); if (record_arch_list_add_end ()) return -1; @@ -5247,6 +5363,15 @@ no_support: return -1; } +static const int i386_record_regmap[] =3D +{ + I386_EAX_REGNUM, I386_ECX_REGNUM, I386_EDX_REGNUM, I386_EBX_REGNUM, + I386_ESP_REGNUM, I386_EBP_REGNUM, I386_ESI_REGNUM, I386_EDI_REGNUM, + 0, 0, 0, 0, 0, 0, 0, 0, + I386_EIP_REGNUM, I386_EFLAGS_REGNUM, I386_CS_REGNUM, I386_SS_REGNUM, + I386_DS_REGNUM, I386_ES_REGNUM, I386_FS_REGNUM, I386_GS_REGNUM +}; + static struct gdbarch * i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) @@ -5307,6 +5432,8 @@ i386_gdbarch_init (struct gdbarch_info i tdep->sc_pc_offset =3D -1; tdep->sc_sp_offset =3D -1; + tdep->record_regmap =3D i386_record_regmap; + /* The format used for `long double' on almost all i386 targets is the i387 extended floating-point format. In fact, of all targets in the GCC 2.95 tree, only OSF/1 does it different, and insists --- a/i386-tdep.h +++ b/i386-tdep.h @@ -111,10 +111,15 @@ struct gdbarch_tdep struct type *i387_ext_type; /* Process record/replay target. */ + /* The map for registers because the AMD64's registers order + in GDB is not same as I386 instructions. */ + const int *record_regmap; /* Parse intx80 args. */ int (*i386_intx80_record) (struct regcache *regcache); /* Parse sysenter args. */ int (*i386_sysenter_record) (struct regcache *regcache); + /* Parse syscall args. */ + int (*i386_syscall_record) (struct regcache *regcache); }; /* Floating-point registers. */ @@ -151,6 +156,36 @@ enum i386_regnum I386_ST0_REGNUM /* %st(0) */ }; +/* Register numbers of RECORD_REGMAP. */ + +enum record_i386_regnum +{ + X86_RECORD_REAX_REGNUM, + X86_RECORD_RECX_REGNUM, + X86_RECORD_REDX_REGNUM, + X86_RECORD_REBX_REGNUM, + X86_RECORD_RESP_REGNUM, + X86_RECORD_REBP_REGNUM, + X86_RECORD_RESI_REGNUM, + X86_RECORD_REDI_REGNUM, + X86_RECORD_R8_REGNUM, + X86_RECORD_R9_REGNUM, + X86_RECORD_R10_REGNUM, + X86_RECORD_R11_REGNUM, + X86_RECORD_R12_REGNUM, + X86_RECORD_R13_REGNUM, + X86_RECORD_R14_REGNUM, + X86_RECORD_R15_REGNUM, + X86_RECORD_REIP_REGNUM, + X86_RECORD_EFLAGS_REGNUM, + X86_RECORD_CS_REGNUM, + X86_RECORD_SS_REGNUM, + X86_RECORD_DS_REGNUM, + X86_RECORD_ES_REGNUM, + X86_RECORD_FS_REGNUM, + X86_RECORD_GS_REGNUM, +}; + #define I386_NUM_GREGS 16 #define I386_NUM_FREGS 16 #define I386_NUM_XREGS 9 --001636e91011da75fc046f23adb6 Content-Type: text/plain; charset=US-ASCII; name="prec_amd64_tdep.txt" Content-Disposition: attachment; filename="prec_amd64_tdep.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_fxd9ut400 Content-length: 96303 LS0tCiBhbWQ2NC10ZGVwLmMgfCAgIDEyIAogaTM4Ni10ZGVwLmMgIHwgMTQ0 NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQogaTM4Ni10ZGVwLmggIHwgICAzNSArCiAzIGZp bGVzIGNoYW5nZWQsIDgzMyBpbnNlcnRpb25zKCspLCA2NTkgZGVsZXRpb25z KC0pCgotLS0gYS9hbWQ2NC10ZGVwLmMKKysrIGIvYW1kNjQtdGRlcC5jCkBA IC0xOTg5LDYgKzE5ODksMTYgQEAgYW1kNjRfZ2V0X2xvbmdqbXBfdGFyZ2V0 IChzdHJ1Y3QgZnJhbWVfaQogICByZXR1cm4gMTsKIH0KIAorc3RhdGljIGNv bnN0IGludCBhbWQ2NF9yZWNvcmRfcmVnbWFwW10gPQoreworICBBTUQ2NF9S QVhfUkVHTlVNLCBBTUQ2NF9SQ1hfUkVHTlVNLCBBTUQ2NF9SRFhfUkVHTlVN LCBBTUQ2NF9SQlhfUkVHTlVNLAorICBBTUQ2NF9SU1BfUkVHTlVNLCBBTUQ2 NF9SQlBfUkVHTlVNLCBBTUQ2NF9SU0lfUkVHTlVNLCBBTUQ2NF9SRElfUkVH TlVNLAorICBBTUQ2NF9SOF9SRUdOVU0sIEFNRDY0X1I5X1JFR05VTSwgQU1E NjRfUjEwX1JFR05VTSwgQU1ENjRfUjExX1JFR05VTSwKKyAgQU1ENjRfUjEy X1JFR05VTSwgQU1ENjRfUjEzX1JFR05VTSwgQU1ENjRfUjE0X1JFR05VTSwg QU1ENjRfUjE1X1JFR05VTSwKKyAgQU1ENjRfUklQX1JFR05VTSwgQU1ENjRf RUZMQUdTX1JFR05VTSwgQU1ENjRfQ1NfUkVHTlVNLCBBTUQ2NF9TU19SRUdO VU0sCisgIEFNRDY0X0RTX1JFR05VTSwgQU1ENjRfRVNfUkVHTlVNLCBBTUQ2 NF9GU19SRUdOVU0sIEFNRDY0X0dTX1JFR05VTQorfTsKKwogdm9pZAogYW1k NjRfaW5pdF9hYmkgKHN0cnVjdCBnZGJhcmNoX2luZm8gaW5mbywgc3RydWN0 IGdkYmFyY2ggKmdkYmFyY2gpCiB7CkBAIC0yMDUxLDYgKzIwNjEsOCBAQCBh bWQ2NF9pbml0X2FiaSAoc3RydWN0IGdkYmFyY2hfaW5mbyBpbmZvCiAgIHNl dF9nZGJhcmNoX251bV9wc2V1ZG9fcmVncyAoZ2RiYXJjaCwgMCk7CiAgIHRk ZXAtPm1tMF9yZWdudW0gPSAtMTsKIAorICB0ZGVwLT5yZWNvcmRfcmVnbWFw ID0gYW1kNjRfcmVjb3JkX3JlZ21hcDsKKwogICBzZXRfZ2RiYXJjaF9kdW1t eV9pZCAoZ2RiYXJjaCwgYW1kNjRfZHVtbXlfaWQpOwogCiAgIGZyYW1lX3Vu d2luZF9hcHBlbmRfdW53aW5kZXIgKGdkYmFyY2gsICZhbWQ2NF9zaWd0cmFt cF9mcmFtZV91bndpbmQpOwotLS0gYS9pMzg2LXRkZXAuYworKysgYi9pMzg2 LXRkZXAuYwpAQCAtMjg0Nyw2ICsyODQ3LDcgQEAgZW51bQogICBPVF9CWVRF ID0gMCwKICAgT1RfV09SRCwKICAgT1RfTE9ORywKKyAgT1RfUVVBRCwKIH07 CiAKIC8qIGkzODYgYXJpdGgvbG9naWMgb3BlcmF0aW9ucyAqLwpAQCAtMjg2 NCw2ICsyODY1LDcgQEAgZW51bQogCiBzdHJ1Y3QgaTM4Nl9yZWNvcmRfcwog eworICBzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaDsKICAgc3RydWN0IHJlZ2Nh Y2hlICpyZWdjYWNoZTsKICAgQ09SRV9BRERSIGFkZHI7CiAgIGludCBhZmxh ZzsKQEAgLTI4NzIsNiArMjg3NCwxMSBAQCBzdHJ1Y3QgaTM4Nl9yZWNvcmRf cwogICB1aW50OF90IG1vZHJtOwogICB1aW50OF90IG1vZCwgcmVnLCBybTsK ICAgaW50IG90OworICB1aW50OF90IHJleF94OworICB1aW50OF90IHJleF9i OworICBpbnQgcmlwX29mZnNldDsKKyAgaW50IHBvcGxfZXNwX2hhY2s7Cisg IGNvbnN0IGludCAqcmVnbWFwOwogfTsKIAogLyogUGFyc2UgIm1vZHJtIiBw YXJ0IGluIGN1cnJlbnQgbWVtb3J5IGFkZHJlc3MgdGhhdCBpcnAtPmFkZHIg cG9pbnQgdG8KQEAgLTI4ODAsNyArMjg4Nyw3IEBAIHN0cnVjdCBpMzg2X3Jl Y29yZF9zCiBzdGF0aWMgaW50CiBpMzg2X3JlY29yZF9tb2RybSAoc3RydWN0 IGkzODZfcmVjb3JkX3MgKmlycCkKIHsKLSAgc3RydWN0IGdkYmFyY2ggKmdk YmFyY2ggPSBnZXRfcmVnY2FjaGVfYXJjaCAoaXJwLT5yZWdjYWNoZSk7Cisg IHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoID0gaXJwLT5nZGJhcmNoOwogCiAg IGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGlycC0+YWRkciwgJmlycC0+bW9k cm0sIDEpKQogICAgIHsKQEAgLTI5MDMsMTIgKzI5MTAsMTMgQEAgaTM4Nl9y ZWNvcmRfbW9kcm0gKHN0cnVjdCBpMzg2X3JlY29yZF9zIAogICAgUmV0dXJu IC0xIGlmIHNvbWV0aGluZyB3cm9uZy4gKi8KIAogc3RhdGljIGludAotaTM4 Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBpMzg2X3JlY29yZF9z ICppcnAsIHVpbnQzMl90ICogYWRkcikKK2kzODZfcmVjb3JkX2xlYV9tb2Ry bV9hZGRyIChzdHJ1Y3QgaTM4Nl9yZWNvcmRfcyAqaXJwLCB1aW50NjRfdCAq YWRkcikKIHsKLSAgc3RydWN0IGdkYmFyY2ggKmdkYmFyY2ggPSBnZXRfcmVn Y2FjaGVfYXJjaCAoaXJwLT5yZWdjYWNoZSk7CisgIHN0cnVjdCBnZGJhcmNo ICpnZGJhcmNoID0gaXJwLT5nZGJhcmNoOwogICB1aW50OF90IHRtcHU4Owot ICB1aW50MTZfdCB0bXB1MTY7Ci0gIHVpbnQzMl90IHRtcHUzMjsKKyAgaW50 MTZfdCB0bXBpMTY7CisgIGludDMyX3QgdG1waTMyOworICBVTE9OR0VTVCB0 bXB1bG9uZ2VzdDsKIAogICAqYWRkciA9IDA7CiAgIGlmIChpcnAtPmFmbGFn KQpAQCAtMjkzMiw5ICsyOTQwLDEwIEBAIGkzODZfcmVjb3JkX2xlYV9tb2Ry bV9hZGRyIChzdHJ1Y3QgaTM4Nl8KIAkgICAgfQogCSAgaXJwLT5hZGRyKys7 CiAJICBzY2FsZSA9ICh0bXB1OCA+PiA2KSAmIDM7Ci0JICBpbmRleCA9ICgo dG1wdTggPj4gMykgJiA3KTsKKwkgIGluZGV4ID0gKCh0bXB1OCA+PiAzKSAm IDcpIHwgaXJwLT5yZXhfeDsKIAkgIGJhc2UgPSAodG1wdTggJiA3KTsKIAl9 CisgICAgICBiYXNlIHw9IGlycC0+cmV4X2I7CiAKICAgICAgIHN3aXRjaCAo aXJwLT5tb2QpCiAJewpAQCAtMjk0Miw3ICsyOTUxLDcgQEAgaTM4Nl9yZWNv cmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBpMzg2XwogCSAgaWYgKChiYXNl ICYgNykgPT0gNSkKIAkgICAgewogCSAgICAgIGJhc2UgPSAweGZmOwotCSAg ICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGlycC0+YWRkciwgKGdkYl9i eXRlICopIGFkZHIsIDQpKQorCSAgICAgIGlmICh0YXJnZXRfcmVhZF9tZW1v cnkgKGlycC0+YWRkciwgKGdkYl9ieXRlICopICZ0bXBpMzIsIDQpKQogCQl7 CiAJCSAgaWYgKHJlY29yZF9kZWJ1ZykKIAkJICAgIHByaW50Zl91bmZpbHRl cmVkIChfKCJQcm9jZXNzIHJlY29yZDogZXJyb3IgcmVhZGluZyAiCkBAIC0y OTUxLDYgKzI5NjAsOSBAQCBpMzg2X3JlY29yZF9sZWFfbW9kcm1fYWRkciAo c3RydWN0IGkzODZfCiAJCSAgcmV0dXJuIC0xOwogCQl9CiAJICAgICAgaXJw LT5hZGRyICs9IDQ7CisJICAgICAgKmFkZHIgPSB0bXBpMzI7CisJICAgICAg aWYgKGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSAmJiAhaGF2 ZXNpYikKKwkJKmFkZHIgKz0gaXJwLT5hZGRyICsgaXJwLT5yaXBfb2Zmc2V0 OwogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKQEAgLTI5NzAsNyArMjk4Miw3 IEBAIGkzODZfcmVjb3JkX2xlYV9tb2RybV9hZGRyIChzdHJ1Y3QgaTM4Nl8K IAkgICphZGRyID0gKGludDhfdCkgdG1wdTg7CiAJICBicmVhazsKIAljYXNl IDI6Ci0JICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5IChpcnAtPmFkZHIsIChn ZGJfYnl0ZSAqKSBhZGRyLCA0KSkKKwkgIGlmICh0YXJnZXRfcmVhZF9tZW1v cnkgKGlycC0+YWRkciwgKGdkYl9ieXRlICopICZ0bXBpMzIsIDQpKQogCSAg ICB7CiAJICAgICAgaWYgKHJlY29yZF9kZWJ1ZykKIAkJcHJpbnRmX3VuZmls dGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkOiBlcnJvciByZWFkaW5nIG1lbW9y eSAiCkBAIC0yOTc4LDIxICsyOTkwLDM0IEBAIGkzODZfcmVjb3JkX2xlYV9t b2RybV9hZGRyIChzdHJ1Y3QgaTM4Nl8KIAkJCQkgICBwYWRkcmVzcyAoZ2Ri YXJjaCwgaXJwLT5hZGRyKSk7CiAJICAgICAgcmV0dXJuIC0xOwogCSAgICB9 CisJICAqYWRkciA9IHRtcGkzMjsKIAkgIGlycC0+YWRkciArPSA0OwogCSAg YnJlYWs7CiAJfQogCisgICAgICB0bXB1bG9uZ2VzdCA9IDA7CiAgICAgICBp ZiAoYmFzZSAhPSAweGZmKQotCXsKLQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChp cnAtPnJlZ2NhY2hlLCBiYXNlLCAoZ2RiX2J5dGUgKikgJiB0bXB1MzIpOwot CSAgKmFkZHIgKz0gdG1wdTMyOworICAgICAgICB7CisJICBpZiAoYmFzZSA9 PSA0ICYmIGlycC0+cG9wbF9lc3BfaGFjaykKKwkgICAgKmFkZHIgKz0gaXJw LT5wb3BsX2VzcF9oYWNrOworCSAgcmVnY2FjaGVfcmF3X3JlYWRfdW5zaWdu ZWQgKGlycC0+cmVnY2FjaGUsIGlycC0+cmVnbWFwW2Jhc2VdLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3Qp OwogCX0KKyAgICAgIGlmIChpcnAtPmFmbGFnID09IDIpCisgICAgICAgIHsK KwkgICphZGRyICs9IHRtcHVsb25nZXN0OworICAgICAgICB9CisgICAgICBl bHNlCisgICAgICAgICphZGRyID0gKHVpbnQzMl90KSAodG1wdWxvbmdlc3Qg KyAqYWRkcik7CiAKLSAgICAgIC8qIFhYWDogaW5kZXggPT0gNCBpcyBhbHdh eXMgaW52YWxpZCAqLwogICAgICAgaWYgKGhhdmVzaWIgJiYgKGluZGV4ICE9 IDQgfHwgc2NhbGUgIT0gMCkpCiAJewotCSAgcmVnY2FjaGVfcmF3X3JlYWQg KGlycC0+cmVnY2FjaGUsIGluZGV4LCAoZ2RiX2J5dGUgKikgJiB0bXB1MzIp OwotCSAgKmFkZHIgKz0gdG1wdTMyIDw8IHNjYWxlOworCSAgcmVnY2FjaGVf cmF3X3JlYWRfdW5zaWduZWQgKGlycC0+cmVnY2FjaGUsIGlycC0+cmVnbWFw W2luZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgJnRtcHVsb25nZXN0KTsKKwkgIGlmIChpcnAtPmFmbGFnID09IDIpCisJ ICAgICphZGRyICs9IHRtcHVsb25nZXN0IDw8IHNjYWxlOworCSAgZWxzZQor CSAgICAqYWRkciA9ICh1aW50MzJfdCkgKCphZGRyICsgKHRtcHVsb25nZXN0 IDw8IHNjYWxlKSk7CiAJfQogICAgIH0KICAgZWxzZQpAQCAtMzAwNCw3ICsz MDI5LDcgQEAgaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBp Mzg2XwogCSAgaWYgKGlycC0+cm0gPT0gNikKIAkgICAgewogCSAgICAgIGlm ICh0YXJnZXRfcmVhZF9tZW1vcnkKLQkJICAoaXJwLT5hZGRyLCAoZ2RiX2J5 dGUgKikgJiB0bXB1MTYsIDIpKQorCQkgIChpcnAtPmFkZHIsIChnZGJfYnl0 ZSAqKSAmdG1waTE2LCAyKSkKIAkJewogCQkgIGlmIChyZWNvcmRfZGVidWcp CiAJCSAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQ6 IGVycm9yIHJlYWRpbmcgIgpAQCAtMzAxMyw3ICszMDM4LDcgQEAgaTM4Nl9y ZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBpMzg2XwogCQkgIHJldHVy biAtMTsKIAkJfQogCSAgICAgIGlycC0+YWRkciArPSAyOwotCSAgICAgICph ZGRyID0gKGludDE2X3QpIHRtcHUxNjsKKwkgICAgICAqYWRkciA9IHRtcGkx NjsKIAkgICAgICBpcnAtPnJtID0gMDsKIAkgICAgICBnb3RvIG5vX3JtOwog CSAgICB9CkBAIC0zMDM1LDcgKzMwNjAsNyBAQCBpMzg2X3JlY29yZF9sZWFf bW9kcm1fYWRkciAoc3RydWN0IGkzODZfCiAJICAqYWRkciA9IChpbnQ4X3Qp IHRtcHU4OwogCSAgYnJlYWs7CiAJY2FzZSAyOgotCSAgaWYgKHRhcmdldF9y ZWFkX21lbW9yeSAoaXJwLT5hZGRyLCAoZ2RiX2J5dGUgKikgJiB0bXB1MTYs IDIpKQorCSAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoaXJwLT5hZGRyLCAo Z2RiX2J5dGUgKikgJnRtcGkxNiwgMikpCiAJICAgIHsKIAkgICAgICBpZiAo cmVjb3JkX2RlYnVnKQogCQlwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2Vz cyByZWNvcmQ6IGVycm9yIHJlYWRpbmcgbWVtb3J5ICIKQEAgLTMwNDQsNjMg KzMwNjksNzUgQEAgaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVj dCBpMzg2XwogCSAgICAgIHJldHVybiAtMTsKIAkgICAgfQogCSAgaXJwLT5h ZGRyICs9IDI7Ci0JICAqYWRkciA9IChpbnQxNl90KSB0bXB1MTY7CisJICAq YWRkciA9IHRtcGkxNjsKIAkgIGJyZWFrOwogCX0KIAogICAgICAgc3dpdGNo IChpcnAtPnJtKQogCXsKIAljYXNlIDA6Ci0JICByZWdjYWNoZV9yYXdfcmVh ZCAoaXJwLT5yZWdjYWNoZSwgSTM4Nl9FQlhfUkVHTlVNLAotCQkJICAgICAo Z2RiX2J5dGUgKikgJiB0bXB1MzIpOwotCSAgKmFkZHIgKz0gdG1wdTMyOwot CSAgcmVnY2FjaGVfcmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRVNJ X1JFR05VTSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkg ICphZGRyICs9IHRtcHUzMjsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2ln bmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGlycC0+cmVnbWFwW1g4 Nl9SRUNPUkRfUkVCWF9SRUdOVU1dLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworCSAgKmFkZHIgPSAo dWludDMyX3QpICgqYWRkciArIHRtcHVsb25nZXN0KTsKKwkgIHJlZ2NhY2hl X3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAg IGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVTSV9SRUdOVU1dLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3Qp OworCSAgKmFkZHIgPSAodWludDMyX3QpICgqYWRkciArIHRtcHVsb25nZXN0 KTsKIAkgIGJyZWFrOwogCWNhc2UgMToKLQkgIHJlZ2NhY2hlX3Jhd19yZWFk IChpcnAtPnJlZ2NhY2hlLCBJMzg2X0VCWF9SRUdOVU0sCi0JCQkgICAgIChn ZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0JICAqYWRkciArPSB0bXB1MzI7Ci0J ICByZWdjYWNoZV9yYXdfcmVhZCAoaXJwLT5yZWdjYWNoZSwgSTM4Nl9FRElf UkVHTlVNLAotCQkJICAgICAoZ2RiX2J5dGUgKikgJiB0bXB1MzIpOwotCSAg KmFkZHIgKz0gdG1wdTMyOworCSAgcmVnY2FjaGVfcmF3X3JlYWRfdW5zaWdu ZWQgKGlycC0+cmVnY2FjaGUsCisJCQkJICAgICAgaXJwLT5yZWdtYXBbWDg2 X1JFQ09SRF9SRUJYX1JFR05VTV0sCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZ0bXB1bG9uZ2VzdCk7CisJICAqYWRkciA9ICh1 aW50MzJfdCkgKCphZGRyICsgdG1wdWxvbmdlc3QpOworCSAgcmVnY2FjaGVf cmF3X3JlYWRfdW5zaWduZWQgKGlycC0+cmVnY2FjaGUsCisJCQkJICAgICAg aXJwLT5yZWdtYXBbWDg2X1JFQ09SRF9SRURJX1JFR05VTV0sCisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXB1bG9uZ2VzdCk7 CisJICAqYWRkciA9ICh1aW50MzJfdCkgKCphZGRyICsgdG1wdWxvbmdlc3Qp OwogCSAgYnJlYWs7CiAJY2FzZSAyOgotCSAgcmVnY2FjaGVfcmF3X3JlYWQg KGlycC0+cmVnY2FjaGUsIEkzODZfRUJQX1JFR05VTSwKLQkJCSAgICAgKGdk Yl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUzMjsKLQkg IHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBJMzg2X0VTSV9S RUdOVU0sCi0JCQkgICAgIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0JICAq YWRkciArPSB0bXB1MzI7CisJICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25l ZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBpcnAtPnJlZ21hcFtYODZf UkVDT1JEX1JFQlBfUkVHTlVNXSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsKKwkgICphZGRyID0gKHVp bnQzMl90KSAoKmFkZHIgKyB0bXB1bG9uZ2VzdCk7CisJICByZWdjYWNoZV9y YXdfcmVhZF91bnNpZ25lZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBp cnAtPnJlZ21hcFtYODZfUkVDT1JEX1JFU0lfUkVHTlVNXSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsK KwkgICphZGRyID0gKHVpbnQzMl90KSAoKmFkZHIgKyB0bXB1bG9uZ2VzdCk7 CiAJICBicmVhazsKIAljYXNlIDM6Ci0JICByZWdjYWNoZV9yYXdfcmVhZCAo aXJwLT5yZWdjYWNoZSwgSTM4Nl9FQlBfUkVHTlVNLAotCQkJICAgICAoZ2Ri X2J5dGUgKikgJiB0bXB1MzIpOwotCSAgKmFkZHIgKz0gdG1wdTMyOwotCSAg cmVnY2FjaGVfcmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRURJX1JF R05VTSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICph ZGRyICs9IHRtcHUzMjsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVk IChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGlycC0+cmVnbWFwW1g4Nl9S RUNPUkRfUkVCUF9SRUdOVU1dLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworCSAgKmFkZHIgPSAodWlu dDMyX3QpICgqYWRkciArIHRtcHVsb25nZXN0KTsKKwkgIHJlZ2NhY2hlX3Jh d19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGly cC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVESV9SRUdOVU1dLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOwor CSAgKmFkZHIgPSAodWludDMyX3QpICgqYWRkciArIHRtcHVsb25nZXN0KTsK IAkgIGJyZWFrOwogCWNhc2UgNDoKLQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChp cnAtPnJlZ2NhY2hlLCBJMzg2X0VTSV9SRUdOVU0sCi0JCQkgICAgIChnZGJf Ynl0ZSAqKSAmIHRtcHUzMik7Ci0JICAqYWRkciArPSB0bXB1MzI7CisJICBy ZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25lZCAoaXJwLT5yZWdjYWNoZSwKKwkJ CQkgICAgICBpcnAtPnJlZ21hcFtYODZfUkVDT1JEX1JFU0lfUkVHTlVNXSwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRtcHVs b25nZXN0KTsKKwkgICphZGRyID0gKHVpbnQzMl90KSAoKmFkZHIgKyB0bXB1 bG9uZ2VzdCk7CiAJICBicmVhazsKIAljYXNlIDU6Ci0JICByZWdjYWNoZV9y YXdfcmVhZCAoaXJwLT5yZWdjYWNoZSwgSTM4Nl9FRElfUkVHTlVNLAotCQkJ ICAgICAoZ2RiX2J5dGUgKikgJiB0bXB1MzIpOwotCSAgKmFkZHIgKz0gdG1w dTMyOworCSAgcmVnY2FjaGVfcmF3X3JlYWRfdW5zaWduZWQgKGlycC0+cmVn Y2FjaGUsCisJCQkJICAgICAgaXJwLT5yZWdtYXBbWDg2X1JFQ09SRF9SRURJ X1JFR05VTV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICZ0bXB1bG9uZ2VzdCk7CisJICAqYWRkciA9ICh1aW50MzJfdCkgKCph ZGRyICsgdG1wdWxvbmdlc3QpOwogCSAgYnJlYWs7CiAJY2FzZSA2OgotCSAg cmVnY2FjaGVfcmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRUJQX1JF R05VTSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICph ZGRyICs9IHRtcHUzMjsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVk IChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGlycC0+cmVnbWFwW1g4Nl9S RUNPUkRfUkVCUF9SRUdOVU1dLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworCSAgKmFkZHIgPSAodWlu dDMyX3QpICgqYWRkciArIHRtcHVsb25nZXN0KTsKIAkgIGJyZWFrOwogCWNh c2UgNzoKLQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBJ Mzg2X0VCWF9SRUdOVU0sCi0JCQkgICAgIChnZGJfYnl0ZSAqKSAmIHRtcHUz Mik7Ci0JICAqYWRkciArPSB0bXB1MzI7CisJICByZWdjYWNoZV9yYXdfcmVh ZF91bnNpZ25lZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBpcnAtPnJl Z21hcFtYODZfUkVDT1JEX1JFQlhfUkVHTlVNXSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsKKwkgICph ZGRyID0gKHVpbnQzMl90KSAoKmFkZHIgKyB0bXB1bG9uZ2VzdCk7CiAJICBi cmVhazsKIAl9CiAgICAgICAqYWRkciAmPSAweGZmZmY7CkBAIC0zMTE3LDEw ICszMTU0LDEwIEBAIG5vX3JtOgogc3RhdGljIGludAogaTM4Nl9yZWNvcmRf bGVhX21vZHJtIChzdHJ1Y3QgaTM4Nl9yZWNvcmRfcyAqaXJwKQogewotICBz dHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCA9IGdldF9yZWdjYWNoZV9hcmNoIChp cnAtPnJlZ2NhY2hlKTsKLSAgdWludDMyX3QgYWRkcjsKKyAgc3RydWN0IGdk YmFyY2ggKmdkYmFyY2ggPSBpcnAtPmdkYmFyY2g7CisgIHVpbnQ2NF90IGFk ZHI7CiAKLSAgaWYgKGlycC0+b3ZlcnJpZGUpCisgIGlmIChpcnAtPm92ZXJy aWRlID49IDApCiAgICAgewogICAgICAgaWYgKHJlY29yZF9kZWJ1ZykKIAlw cmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQgaWdub3JlcyB0 aGUgbWVtb3J5IGNoYW5nZSAiCkBAIC0zMTM5LDEwICszMTc2LDMzIEBAIGkz ODZfcmVjb3JkX2xlYV9tb2RybSAoc3RydWN0IGkzODZfcmVjb3IKICAgcmV0 dXJuIDA7CiB9CiAKKy8qIFJlY29yZCB0aGUgcHVzaCBvcGVyYXRpb24gdG8g InJlY29yZF9hcmNoX2xpc3QiLgorICAgUmV0dXJuIC0xIGlmIHNvbWV0aGlu ZyB3cm9uZy4gKi8KKworc3RhdGljIGludAoraTM4Nl9yZWNvcmRfcHVzaCAo c3RydWN0IGkzODZfcmVjb3JkX3MgKmlycCwgaW50IHNpemUpCit7CisgIFVM T05HRVNUIHRtcHVsb25nZXN0OworCisgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKGlycC0+cmVnY2FjaGUsCisJCQkJaXJwLT5yZWdtYXBbWDg2 X1JFQ09SRF9SRVNQX1JFR05VTV0pKQorICAgIHJldHVybiAtMTsKKyAgcmVn Y2FjaGVfcmF3X3JlYWRfdW5zaWduZWQgKGlycC0+cmVnY2FjaGUsCisJCQkg ICAgICBpcnAtPnJlZ21hcFtYODZfUkVDT1JEX1JFU1BfUkVHTlVNXSwKKwkJ CSAgICAgICZ0bXB1bG9uZ2VzdCk7CisgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9tZW0gKChDT1JFX0FERFIpIHRtcHVsb25nZXN0IC0gc2l6ZSwgc2l6 ZSkpCisgICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCiAvKiBQ YXJzZSB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhbmQgcmVjb3JkIHRoZSB2 YWx1ZXMgb2YgdGhlIHJlZ2lzdGVycyBhbmQKICAgIG1lbW9yeSB0aGF0IHdp bGwgYmUgY2hhbmdlZCBpbiBjdXJyZW50IGluc3RydWN0aW9uIHRvICJyZWNv cmRfYXJjaF9saXN0Ii4KICAgIFJldHVybiAtMSBpZiBzb21ldGhpbmcgd3Jv bmcuICovCiAKKyNkZWZpbmUgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9S RUcocmVnbnVtKSBcCisgICAgcmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucmVnbWFwWyhyZWdudW0pXSkKKwogaW50CiBpMzg2 X3Byb2Nlc3NfcmVjb3JkIChzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaCwgc3Ry dWN0IHJlZ2NhY2hlICpyZWdjYWNoZSwKIAkJICAgICBDT1JFX0FERFIgYWRk cikKQEAgLTMxNTEsMTQgKzMyMTEsMjIgQEAgaTM4Nl9wcm9jZXNzX3JlY29y ZCAoc3RydWN0IGdkYmFyY2ggKmdkYgogICB1aW50OF90IHRtcHU4OwogICB1 aW50MTZfdCB0bXB1MTY7CiAgIHVpbnQzMl90IHRtcHUzMjsKKyAgVUxPTkdF U1QgdG1wdWxvbmdlc3Q7CiAgIHVpbnQzMl90IG9wY29kZTsKICAgc3RydWN0 IGkzODZfcmVjb3JkX3MgaXI7CisgIGludCByZXggPSAwOworICB1aW50OF90 IHJleF93ID0gLTE7CisgIHVpbnQ4X3QgcmV4X3IgPSAwOwogCiAgIG1lbXNl dCAoJmlyLCAwLCBzaXplb2YgKHN0cnVjdCBpMzg2X3JlY29yZF9zKSk7CiAg IGlyLnJlZ2NhY2hlID0gcmVnY2FjaGU7CiAgIGlyLmFkZHIgPSBhZGRyOwog ICBpci5hZmxhZyA9IDE7CiAgIGlyLmRmbGFnID0gMTsKKyAgaXIub3ZlcnJp ZGUgPSAtMTsKKyAgaXIucG9wbF9lc3BfaGFjayA9IDA7CisgIGlyLnJlZ21h cCA9IGdkYmFyY2hfdGRlcCAoZ2RiYXJjaCktPnJlY29yZF9yZWdtYXA7Cisg IGlyLmdkYmFyY2ggPSBnZGJhcmNoOwogCiAgIGlmIChyZWNvcmRfZGVidWcg PiAxKQogICAgIGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgIlBy b2Nlc3MgcmVjb3JkOiBpMzg2X3Byb2Nlc3NfcmVjb3JkICIKQEAgLTMxODks MjIgKzMyNTcsMjIgQEAgaTM4Nl9wcm9jZXNzX3JlY29yZCAoc3RydWN0IGdk YmFyY2ggKmdkYgogCSAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7CiAJICBi cmVhazsKIAljYXNlIDB4MmU6Ci0JICBpci5vdmVycmlkZSA9IEkzODZfQ1Nf UkVHTlVNOworCSAgaXIub3ZlcnJpZGUgPSBYODZfUkVDT1JEX0NTX1JFR05V TTsKIAkgIGJyZWFrOwogCWNhc2UgMHgzNjoKLQkgIGlyLm92ZXJyaWRlID0g STM4Nl9TU19SRUdOVU07CisJICBpci5vdmVycmlkZSA9IFg4Nl9SRUNPUkRf U1NfUkVHTlVNOwogCSAgYnJlYWs7CiAJY2FzZSAweDNlOgotCSAgaXIub3Zl cnJpZGUgPSBJMzg2X0RTX1JFR05VTTsKKwkgIGlyLm92ZXJyaWRlID0gWDg2 X1JFQ09SRF9EU19SRUdOVU07CiAJICBicmVhazsKIAljYXNlIDB4MjY6Ci0J ICBpci5vdmVycmlkZSA9IEkzODZfRVNfUkVHTlVNOworCSAgaXIub3ZlcnJp ZGUgPSBYODZfUkVDT1JEX0VTX1JFR05VTTsKIAkgIGJyZWFrOwogCWNhc2Ug MHg2NDoKLQkgIGlyLm92ZXJyaWRlID0gSTM4Nl9GU19SRUdOVU07CisJICBp ci5vdmVycmlkZSA9IFg4Nl9SRUNPUkRfRlNfUkVHTlVNOwogCSAgYnJlYWs7 CiAJY2FzZSAweDY1OgotCSAgaXIub3ZlcnJpZGUgPSBJMzg2X0dTX1JFR05V TTsKKwkgIGlyLm92ZXJyaWRlID0gWDg2X1JFQ09SRF9HU19SRUdOVU07CiAJ ICBicmVhazsKIAljYXNlIDB4NjY6CiAJICBwcmVmaXhlcyB8PSBQUkVGSVhf REFUQTsKQEAgLTMyMTIsMTYgKzMyODAsNTEgQEAgaTM4Nl9wcm9jZXNzX3Jl Y29yZCAoc3RydWN0IGdkYmFyY2ggKmdkYgogCWNhc2UgMHg2NzoKIAkgIHBy ZWZpeGVzIHw9IFBSRUZJWF9BRERSOwogCSAgYnJlYWs7CisgICAgICAgIGNh c2UgMHg0MDoKKyAgICAgICAgY2FzZSAweDQxOgorICAgICAgICBjYXNlIDB4 NDI6CisgICAgICAgIGNhc2UgMHg0MzoKKyAgICAgICAgY2FzZSAweDQ0Ogor ICAgICAgICBjYXNlIDB4NDU6CisgICAgICAgIGNhc2UgMHg0NjoKKyAgICAg ICAgY2FzZSAweDQ3OgorICAgICAgICBjYXNlIDB4NDg6CisgICAgICAgIGNh c2UgMHg0OToKKyAgICAgICAgY2FzZSAweDRhOgorICAgICAgICBjYXNlIDB4 NGI6CisgICAgICAgIGNhc2UgMHg0YzoKKyAgICAgICAgY2FzZSAweDRkOgor ICAgICAgICBjYXNlIDB4NGU6CisgICAgICAgIGNhc2UgMHg0ZjoKKyAgICAg ICAgICBpZiAoaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAg ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgIC8qIFJFWCAqLworICAgICAg ICAgICAgICAgcmV4ID0gMTsKKyAgICAgICAgICAgICAgIHJleF93ID0gKHRt cHU4ID4+IDMpICYgMTsKKyAgICAgICAgICAgICAgIHJleF9yID0gKHRtcHU4 ICYgMHg0KSA8PCAxOworICAgICAgICAgICAgICAgaXIucmV4X3ggPSAodG1w dTggJiAweDIpIDw8IDI7CisgICAgICAgICAgICAgICBpci5yZXhfYiA9ICh0 bXB1OCAmIDB4MSkgPDwgMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBi cmVhazsKIAlkZWZhdWx0OgogCSAgZ290byBvdXRfcHJlZml4ZXM7CiAJICBi cmVhazsKIAl9CiAgICAgfQogb3V0X3ByZWZpeGVzOgotICBpZiAocHJlZml4 ZXMgJiBQUkVGSVhfREFUQSkKLSAgICBpci5kZmxhZyBePSAxOworICBpZiAo aXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSAmJiByZXhfdyA9PSAx KQorICAgIHsKKyAgICAgIGlyLmRmbGFnID0gMjsKKyAgICB9CisgIGVsc2UK KyAgICB7CisgICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKKyAg ICAgICAgaXIuZGZsYWcgXj0gMTsKKyAgICB9CiAgIGlmIChwcmVmaXhlcyAm IFBSRUZJWF9BRERSKQogICAgIGlyLmFmbGFnIF49IDE7CisgIGVsc2UgaWYg KGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgaXIuYWZs YWcgPSAyOwogCiAgIC8qIG5vdyBjaGVjayBvcCBjb2RlICovCiAgIG9wY29k ZSA9ICh1aW50MzJfdCkgdG1wdTg7CkBAIC0zMzExLDMwICszNDE0LDI4IEBA IHJlc3dpdGNoOgogCQl9CiAJICAgICAgZWxzZQogCQl7Ci0JCSAgaWYgKGly Lm90ID09IE9UX0JZVEUpCisgICAgICAgICAgICAgICAgICBpci5ybSB8PSBp ci5yZXhfYjsKKwkJICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAhaXIucmVn bWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAkJICAgIGlyLnJtICY9IDB4 MzsKLQkJICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdj YWNoZSwgaXIucm0pKQotCQkgICAgcmV0dXJuIC0xOworCQkgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSk7CiAJCX0KIAkgICAgICBi cmVhazsKIAkgICAgICAvKiBPUCBHdiwgRXYgKi8KIAkgICAgY2FzZSAxOgog CSAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAkJcmV0dXJu IC0xOwotCSAgICAgIGlmIChpci5vdCA9PSBPVF9CWVRFKQorICAgICAgICAg ICAgICBpci5yZWcgfD0gcmV4X3I7CisJICAgICAgaWYgKGlyLm90ID09IE9U X0JZVEUgJiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJ CWlyLnJlZyAmPSAweDM7Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJlZykpCi0JCXJldHVybiAtMTsK KwkgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucmVn KTsKIAkgICAgICBicmVhazsKIAkgICAgICAvKiBPUCBBLCBJdiAqLwogCSAg ICBjYXNlIDI6Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaXIucmVnY2FjaGUsIEkzODZfRUFYX1JFR05VTSkpCi0JCXJldHVybiAt MTsKKwkgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9SRUFYX1JFR05VTSk7CiAJICAgICAgYnJlYWs7CiAJICAgIH0K IAl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7Cisg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBH UlAxICovCkBAIC0zMzU0LDE3ICszNDU1LDE3IEBAIHJlc3dpdGNoOgogCiAJ ICBpZiAoaXIubW9kICE9IDMpCiAJICAgIHsKKyAgICAgICAgICAgICAgaWYg KG9wY29kZSA9PSAweDgzKQorICAgICAgICAgICAgICAgIGlyLnJpcF9vZmZz ZXQgPSAxOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg aXIucmlwX29mZnNldCA9IChpci5vdCA+IE9UX0xPTkcpID8gNCA6ICgxIDw8 IGlyLm90KTsKIAkgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgm aXIpKQogCQlyZXR1cm4gLTE7CiAJICAgIH0KIAkgIGVsc2UKLQkgICAgewot CSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBpci5ybSkpCi0JCXJldHVybiAtMTsKLQkgICAgfQorCSAgICBJMzg2 X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucm0gfCBpci5yZXhfYik7 CiAJfQotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNP UkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyog aW52ICovCkBAIC0zMzg1LDEwICszNDg2LDggQEAgcmVzd2l0Y2g6CiAgICAg Y2FzZSAweDRkOgogICAgIGNhc2UgMHg0ZToKICAgICBjYXNlIDB4NGY6Ci0g ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNo ZSwgb3Bjb2RlICYgNykpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdT X1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKG9wY29kZSAmIDcpOworICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05V TSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogR1JQMyAqLwpAQCAtMzQw MSwyOCArMzUwMCwxNyBAQCByZXN3aXRjaDoKICAgICAgIGlmIChpMzg2X3Jl Y29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7CiAKKyAgICAgIGlmIChp ci5tb2QgIT0gMyAmJiBpci5yZWcgPT0gMCkKKyAgICAgICAgaXIucmlwX29m ZnNldCA9IChpci5vdCA+IE9UX0xPTkcpID8gNCA6ICgxIDw8IGlyLm90KTsK KwogICAgICAgc3dpdGNoIChpci5yZWcpCiAJewogCSAgLyogdGVzdCAqLwog CWNhc2UgMDoKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGly LnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCSAgICByZXR1cm4g LTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JF Q09SRF9FRkxBR1NfUkVHTlVNKTsKIAkgIGJyZWFrOwogCSAgLyogbm90ICov CiAJY2FzZSAyOgotCSAgaWYgKGlyLm1vZCAhPSAzKQotCSAgICB7Ci0JICAg ICAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKLQkJcmV0dXJu IC0xOwotCSAgICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaXIu b3QgPT0gT1RfQllURSkKLQkJaXIucm0gJj0gMHgzOwotCSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSkp Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgYnJlYWs7CiAJICAvKiBuZWcg Ki8KIAljYXNlIDM6CiAJICBpZiAoaXIubW9kICE9IDMpCkBAIC0zNDMyLDEz ICszNTIwLDE0IEBAIHJlc3dpdGNoOgogCSAgICB9CiAJICBlbHNlCiAJICAg IHsKLQkgICAgICBpZiAoaXIub3QgPT0gT1RfQllURSkKKyAgICAgICAgICAg ICAgaXIucm0gfD0gaXIucmV4X2I7CisJICAgICAgaWYgKGlyLm90ID09IE9U X0JZVEUgJiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJ CWlyLnJtICY9IDB4MzsKLQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9h ZGRfcmVnIChpci5yZWdjYWNoZSwgaXIucm0pKQotCQlyZXR1cm4gLTE7CisJ ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtKTsK IAkgICAgfQotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JICAgIHJldHVybiAt MTsKKwkgIC8qIG5lZyAqLworCSAgaWYgKGlyLnJlZyA9PSAzKQorCSAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxB R1NfUkVHTlVNKTsKIAkgIGJyZWFrOwogCSAgLyogbXVsICovCiAJY2FzZSA0 OgpAQCAtMzQ0OCwxNSArMzUzNywxMCBAQCByZXN3aXRjaDoKIAljYXNlIDY6 CiAJICAvKiBpZGl2ICovCiAJY2FzZSA3OgotCSAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUFYX1JFR05VTSkp Ci0JICAgIHJldHVybiAtMTsKKwkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9B RERfUkVHIChYODZfUkVDT1JEX1JFQVhfUkVHTlVNKTsKIAkgIGlmIChpci5v dCAhPSBPVF9CWVRFKQotCSAgICB7Ci0JICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRURYX1JFR05VTSkp Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgaWYgKHJlY29yZF9hcmNoX2xp c3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkp Ci0JICAgIHJldHVybiAtMTsKKwkgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNU X0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVEWF9SRUdOVU0pOworCSAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JF R05VTSk7CiAJICBicmVhazsKIAlkZWZhdWx0OgogCSAgaXIuYWRkciAtPSAy OwpAQCAtMzQ3MCwxMCArMzU1NCw2IEBAIHJlc3dpdGNoOgogICAgIGNhc2Ug MHhmZToKICAgICAgIC8qIEdSUDUgKi8KICAgICBjYXNlIDB4ZmY6Ci0gICAg ICBpZiAoKG9wY29kZSAmIDEpID09IDApCi0JaXIub3QgPSBPVF9CWVRFOwot ICAgICAgZWxzZQotCWlyLm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOwogICAg ICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJldHVybiAtMTsK ICAgICAgIGlmIChpci5yZWcgPj0gMiAmJiBvcGNvZGUgPT0gMHhmZSkKQEAg LTM0ODIsMTMgKzM1NjIsMTYgQEAgcmVzd2l0Y2g6CiAJICBvcGNvZGUgPSBv cGNvZGUgPDwgOCB8IGlyLm1vZHJtOwogCSAgZ290byBub19zdXBwb3J0Owog CX0KLQogICAgICAgc3dpdGNoIChpci5yZWcpCiAJewogCSAgLyogaW5jICov CiAJY2FzZSAwOgogCSAgLyogZGVjICovCiAJY2FzZSAxOgorICAgICAgICAg IGlmICgob3Bjb2RlICYgMSkgPT0gMCkKKwkgICAgaXIub3QgPSBPVF9CWVRF OworICAgICAgICAgIGVsc2UKKwkgICAgaXIub3QgPSBpci5kZmxhZyArIE9U X1dPUkQ7CiAJICBpZiAoaXIubW9kICE9IDMpCiAJICAgIHsKIAkgICAgICBp ZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIpKQpAQCAtMzQ5Niw0MiAr MzU3OSw0MCBAQCByZXN3aXRjaDoKIAkgICAgfQogCSAgZWxzZQogCSAgICB7 Ci0JICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisJICAgICAgaXIucm0g fD0gaXIucmV4X2I7CisJICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUgJiYg IWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJCWlyLnJtICY9 IDB4MzsKLQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucm0pKQotCQlyZXR1cm4gLTE7CisJICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtKTsKIAkgICAgfQot CSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IEkzODZfRUZMQUdTX1JFR05VTSkpCi0JICAgIHJldHVybiAtMTsKKwkgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFH U19SRUdOVU0pOwogCSAgYnJlYWs7CiAJICAvKiBjYWxsICovCiAJY2FzZSAy OgotCSAgLyogcHVzaCAqLwotCWNhc2UgNjoKLQkgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0p KQotCSAgICByZXR1cm4gLTE7Ci0JICByZWdjYWNoZV9yYXdfcmVhZCAoaXIu cmVnY2FjaGUsIEkzODZfRVNQX1JFR05VTSwKLQkJCSAgICAgKGdkYl9ieXRl ICopICYgdG1wdTMyKTsKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9t ZW0KLQkgICAgICAoKENPUkVfQUREUikgdG1wdTMyIC0gKDEgPDwgKGlyLmRm bGFnICsgMSkpLCAoMSA8PCAoaXIuZGZsYWcgKyAxKSkpKQorICAgICAgICAg IGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dICYmIGlyLmRm bGFnKQorICAgICAgICAgICAgaXIuZGZsYWcgPSAyOworCSAgaWYgKGkzODZf cmVjb3JkX3B1c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAxKSkpCiAJICAg IHJldHVybiAtMTsKKwkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH IChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogCSAgYnJlYWs7CiAJICAv KiBsY2FsbCAqLwogCWNhc2UgMzoKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCSAg ICByZXR1cm4gLTE7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChpci5yZWdjYWNoZSwgSTM4Nl9DU19SRUdOVU0pKQotCSAgICByZXR1cm4g LTE7Ci0JICByZWdjYWNoZV9yYXdfcmVhZCAoaXIucmVnY2FjaGUsIEkzODZf RVNQX1JFR05VTSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsK LQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0KLQkgICAgICAoKENP UkVfQUREUikgdG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgMikpLCAoMSA8 PCAoaXIuZGZsYWcgKyAyKSkpKQorCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNU X0FERF9SRUcgKFg4Nl9SRUNPUkRfQ1NfUkVHTlVNKTsKKwkgIGlmIChpMzg2 X3JlY29yZF9wdXNoICgmaXIsIDEgPDwgKGlyLmRmbGFnICsgMSkpKQogCSAg ICByZXR1cm4gLTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKIAkgIGJyZWFrOwogCSAg Lyogam1wICovCiAJY2FzZSA0OgogCSAgLyogbGptcCAqLwogCWNhc2UgNToK KwkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JE X0VGTEFHU19SRUdOVU0pOworCSAgYnJlYWs7CisJICAvKiBwdXNoICovCisJ Y2FzZSA2OgorICAgICAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9S OF9SRUdOVU1dICYmIGlyLmRmbGFnKQorICAgICAgICAgICAgaXIuZGZsYWcg PSAyOworCSAgaWYgKGkzODZfcmVjb3JkX3B1c2ggKCZpciwgMSA8PCAoaXIu ZGZsYWcgKyAxKSkpCisJICAgIHJldHVybiAtMTsKIAkgIGJyZWFrOwogCWRl ZmF1bHQ6CiAJICBpci5hZGRyIC09IDI7CkBAIC0zNTQ2LDIyICszNjI3LDE4 IEBAIHJlc3dpdGNoOgogICAgIGNhc2UgMHg4NToKICAgICBjYXNlIDB4YTg6 CiAgICAgY2FzZSAweGE5OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0J cmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9S RUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsK IAogICAgICAgLyogQ1dERS9DQlcgKi8KICAgICBjYXNlIDB4OTg6Ci0gICAg ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwg STM4Nl9FQVhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05V TSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogQ0RRL0NXRCAqLwogICAg IGNhc2UgMHg5OToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9y ZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0pKQotCXJldHVybiAt MTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBJMzg2X0VEWF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAg IEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JF QVhfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX1JFRFhfUkVHTlVNKTsKICAgICAgIGJyZWFrOwog CiAgICAgICAvKiBpbXVsICovCkBAIC0zNTcxLDEyICszNjQ4LDE1IEBAIHJl c3dpdGNoOgogICAgICAgaXIub3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7CiAg ICAgICBpZiAoaTM4Nl9yZWNvcmRfbW9kcm0gKCZpcikpCiAJcmV0dXJuIC0x OwotICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAgICBpZiAob3Bj b2RlID09IDB4NjkpCisgICAgICAgIGlyLnJpcF9vZmZzZXQgPSAoaXIub3Qg PiBPVF9MT05HKSA/IDQgOiAoMSA8PCBpci5vdCk7CisgICAgICBlbHNlIGlm IChvcGNvZGUgPT0gMHg2YikKKyAgICAgICAgaXIucmlwX29mZnNldCA9IDE7 CisgICAgICBpci5yZWcgfD0gcmV4X3I7CisgICAgICBpZiAoaXIub3QgPT0g T1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkK IAlpci5yZWcgJj0gMHgzOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJlZykpCi0JcmV0dXJuIC0xOwot ICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2Fj aGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJlZyk7CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9F RkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiB4YWRk ICovCkBAIC0zNTg4LDI4ICszNjY4LDI1IEBAIHJlc3dpdGNoOgogCWlyLm90 ID0gaXIuZGZsYWcgKyBPVF9XT1JEOwogICAgICAgaWYgKGkzODZfcmVjb3Jk X21vZHJtICgmaXIpKQogCXJldHVybiAtMTsKKyAgICAgIGlyLnJlZyB8PSBy ZXhfcjsKICAgICAgIGlmIChpci5tb2QgPT0gMykKIAl7Ci0JICBpZiAoaXIu b3QgPT0gT1RfQllURSkKKwkgIGlmIChpci5vdCA9PSBPVF9CWVRFICYmICFp ci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQogCSAgICBpci5yZWcg Jj0gMHgzOwotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIGlyLnJlZykpCi0JICAgIHJldHVybiAtMTsKLQkgIGlmIChp ci5vdCA9PSBPVF9CWVRFKQorCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKGlyLnJlZyk7CisJICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAh aXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAkgICAgaXIucm0g Jj0gMHgzOwotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIGlyLnJtKSkKLQkgICAgcmV0dXJuIC0xOworCSAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtKTsKIAl9CiAgICAgICBl bHNlCiAJewogCSAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkK IAkgICAgcmV0dXJuIC0xOwotCSAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisJ ICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNP UkRfUjhfUkVHTlVNXSkKIAkgICAgaXIucmVnICY9IDB4MzsKLQkgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5yZWcp KQotCSAgICByZXR1cm4gLTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoaXIucmVnKTsKIAl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVN KSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJy ZWFrOwogCiAgICAgICAvKiBjbXB4Y2hnICovCkBAIC0zNjIzLDIyICszNzAw LDE5IEBAIHJlc3dpdGNoOgogCXJldHVybiAtMTsKICAgICAgIGlmIChpci5t b2QgPT0gMykKIAl7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChpci5yZWdjYWNoZSwgSTM4Nl9FQVhfUkVHTlVNKSkKLQkgICAgcmV0dXJu IC0xOwotCSAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAgICAgICAgaXIu cmVnIHw9IHJleF9yOworCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9S RUcgKFg4Nl9SRUNPUkRfUkVBWF9SRUdOVU0pOworCSAgaWYgKGlyLm90ID09 IE9UX0JZVEUgJiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0p CiAJICAgIGlyLnJlZyAmPSAweDM7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfcmVnIChpci5yZWdjYWNoZSwgaXIucmVnKSkKLQkgICAgcmV0dXJu IC0xOworCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJl Zyk7CiAJfQogICAgICAgZWxzZQogCXsKLQkgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0pKQot CSAgICByZXR1cm4gLTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7CiAJICBpZiAoaTM4Nl9y ZWNvcmRfbGVhX21vZHJtICgmaXIpKQogCSAgICByZXR1cm4gLTE7CiAJfQot ICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2Fj aGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZM QUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogY21weGNo ZzhiICovCkBAIC0zNjUxLDE0ICszNzI1LDExIEBAIHJlc3dpdGNoOgogCSAg b3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKIAkgIGdvdG8gbm9f c3VwcG9ydDsKIAl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQVhfUkVHTlVNKSkKLQlyZXR1cm4g LTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgSTM4Nl9FRFhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9S RUFYX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9SRURYX1JFR05VTSk7CiAgICAgICBpZiAoaTM4 Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIpKQogCXJldHVybiAtMTsKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19S RUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHB1c2ggKi8KQEAg LTM2NzIsNiArMzc0MywxMiBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4NTc6 CiAgICAgY2FzZSAweDY4OgogICAgIGNhc2UgMHg2YToKKyAgICAgIGlmIChp ci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dICYmIGlyLmRmbGFnKQor ICAgICAgICBpci5kZmxhZyA9IDI7CisgICAgICBpZiAoaTM4Nl9yZWNvcmRf cHVzaCAoJmlyLCAxIDw8IChpci5kZmxhZyArIDEpKSkKKwlyZXR1cm4gLTE7 CisgICAgICBicmVhazsKKwogICAgICAgLyogcHVzaCBlcyAqLwogICAgIGNh c2UgMHgwNjoKICAgICAgIC8qIHB1c2ggY3MgKi8KQEAgLTM2ODAsMTYgKzM3 NTcsMzYgQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDE2OgogICAgICAgLyog cHVzaCBkcyAqLwogICAgIGNhc2UgMHgxZToKKyAgICAgIGlmIChpci5yZWdt YXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAgICB7CisJICBpci5h ZGRyIC09IDE7CisJICBnb3RvIG5vX3N1cHBvcnQ7CisJfQorICAgICAgaWYg KGkzODZfcmVjb3JkX3B1c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAxKSkp CisJcmV0dXJuIC0xOworICAgICAgYnJlYWs7CisKICAgICAgIC8qIHB1c2gg ZnMgKi8KICAgICBjYXNlIDB4MGZhMDoKICAgICAgIC8qIHB1c2ggZ3MgKi8K ICAgICBjYXNlIDB4MGZhODoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQorICAg ICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAg ICAgIHsKKwkgIGlyLmFkZHIgLT0gMjsKKwkgIGdvdG8gbm9fc3VwcG9ydDsK Kwl9CisgICAgICBpZiAoaTM4Nl9yZWNvcmRfcHVzaCAoJmlyLCAxIDw8IChp ci5kZmxhZyArIDEpKSkKIAlyZXR1cm4gLTE7Ci0gICAgICByZWdjYWNoZV9y YXdfcmVhZCAoaXIucmVnY2FjaGUsIEkzODZfRVNQX1JFR05VTSwKLQkJCSAo Z2RiX2J5dGUgKikgJiB0bXB1MzIpOwotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX21lbQotCSAgKChDT1JFX0FERFIpIHRtcHUzMiAtICgxIDw8 IChpci5kZmxhZyArIDEpKSwgKDEgPDwgKGlyLmRmbGFnICsgMSkpKSkKKyAg ICAgIGJyZWFrOworCisgICAgICAvKiBwdXNoYSAqLworICAgIGNhc2UgMHg2 MDoKKyAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1d KQorICAgICAgICB7CisJICBpci5hZGRyIC09IDE7CisJICBnb3RvIG5vX3N1 cHBvcnQ7CisJfQorICAgICAgaWYgKGkzODZfcmVjb3JkX3B1c2ggKCZpciwg MSA8PCAoaXIuZGZsYWcgKyA0KSkpCiAJcmV0dXJuIC0xOwogICAgICAgYnJl YWs7CiAKQEAgLTM3MDIsMTEzICszNzk5LDEwNCBAQCByZXN3aXRjaDoKICAg ICBjYXNlIDB4NWQ6CiAgICAgY2FzZSAweDVlOgogICAgIGNhc2UgMHg1ZjoK LSAgICAgIGlyLm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOwotICAgICAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZf RVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKGlyLm90ID09 IE9UX0JZVEUpCi0Jb3Bjb2RlICY9IDB4MzsKLSAgICAgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBvcGNvZGUgJiAweDcp KQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBwdXNo YSAqLwotICAgIGNhc2UgMHg2MDoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQot CXJldHVybiAtMTsKLSAgICAgIHJlZ2NhY2hlX3Jhd19yZWFkIChpci5yZWdj YWNoZSwgSTM4Nl9FU1BfUkVHTlVNLAotCQkJIChnZGJfYnl0ZSAqKSAmIHRt cHUzMik7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtCi0J ICAoKENPUkVfQUREUikgdG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgNCkp LCAoMSA8PCAoaXIuZGZsYWcgKyA0KSkpKQotCXJldHVybiAtMTsKKyAgICAg IEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JF U1BfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHICgob3Bjb2RlICYgMHg3KSB8IGlyLnJleF9iKTsKICAgICAgIGJyZWFr OwogCiAgICAgICAvKiBwb3BhICovCiAgICAgY2FzZSAweDYxOgotICAgICAg Zm9yICh0bXB1OCA9IEkzODZfRUFYX1JFR05VTTsgdG1wdTggPD0gSTM4Nl9F RElfUkVHTlVNOyB0bXB1OCsrKQotCXsKLQkgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCB0bXB1OCkpCi0JICAgIHJldHVy biAtMTsKKyAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdO VU1dKQorICAgICAgICB7CisJICBpci5hZGRyIC09IDE7CisJICBnb3RvIG5v X3N1cHBvcnQ7CiAJfQorICAgICAgZm9yICh0bXB1OCA9IFg4Nl9SRUNPUkRf UkVBWF9SRUdOVU07IHRtcHU4IDw9IFg4Nl9SRUNPUkRfUkVESV9SRUdOVU07 CisJICAgdG1wdTgrKykKKwlJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAodG1wdTgpOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHBvcCAqLwog ICAgIGNhc2UgMHg4ZjoKLSAgICAgIGlyLm90ID0gaXIuZGZsYWcgKyBPVF9X T1JEOworICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05V TV0pCisJaXIub3QgPSBpci5kZmxhZyA/IE9UX1FVQUQgOiBPVF9XT1JEOwor ICAgICAgZWxzZQorICAgICAgICBpci5vdCA9IGlyLmRmbGFnICsgT1RfV09S RDsKICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1 cm4gLTE7CiAgICAgICBpZiAoaXIubW9kID09IDMpCi0JewotCSAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJtKSkK LQkgICAgcmV0dXJuIC0xOwotCX0KKwlJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoaXIucm0gfCBpci5yZXhfYik7CiAgICAgICBlbHNlCiAJewor ICAgICAgICAgIGlyLnBvcGxfZXNwX2hhY2sgPSAxIDw8IGlyLm90OwogCSAg aWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKIAkgICAgcmV0dXJu IC0xOwogCX0KLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsK KyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVD T1JEX1JFU1BfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBl bnRlciAqLwogICAgIGNhc2UgMHhjODoKLSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0p KQotCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VCUF9SRUdOVU0pKQotCXJldHVy biAtMTsKLSAgICAgIHJlZ2NhY2hlX3Jhd19yZWFkIChpci5yZWdjYWNoZSwg STM4Nl9FU1BfUkVHTlVNLAotCQkJIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7 Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtCi0JICAoKENP UkVfQUREUikgdG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgMSkpLCAoMSA8 PCAoaXIuZGZsYWcgKyAxKSkpKQorICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVCUF9SRUdOVU0pOworICAgICAg aWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0gJiYgaXIuZGZs YWcpCisgICAgICAgIGlyLmRmbGFnID0gMjsKKyAgICAgIGlmIChpMzg2X3Jl Y29yZF9wdXNoICgmaXIsIDEgPDwgKGlyLmRmbGFnICsgMSkpKQogCXJldHVy biAtMTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBsZWF2ZSAqLwogICAg IGNhc2UgMHhjOToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9y ZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAt MTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBJMzg2X0VCUF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAg IEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JF U1BfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX1JFQlBfUkVHTlVNKTsKICAgICAgIGJyZWFrOwog CiAgICAgICAvKiBwb3AgZXMgKi8KICAgICBjYXNlIDB4MDc6Ci0gICAgICBp ZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4 Nl9FU1BfUkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FU19SRUdO VU0pKQotCXJldHVybiAtMTsKKyAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JF Q09SRF9SOF9SRUdOVU1dKQorICAgICAgICB7CisJICBpci5hZGRyIC09IDE7 CisJICBnb3RvIG5vX3N1cHBvcnQ7CisJfQorICAgICAgSTM4Nl9SRUNPUkRf QVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTUF9SRUdOVU0pOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNP UkRfRVNfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9B RERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgYnJl YWs7CiAKICAgICAgIC8qIHBvcCBzcyAqLwogICAgIGNhc2UgMHgxNzoKLSAg ICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hl LCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X1NT X1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgaWYgKGlyLnJlZ21hcFtY ODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAgIHsKKwkgIGlyLmFkZHIg LT0gMTsKKwkgIGdvdG8gbm9fc3VwcG9ydDsKKwl9CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRVNQX1JFR05V TSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9TU19SRUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAg ICBicmVhazsKIAogICAgICAgLyogcG9wIGRzICovCiAgICAgY2FzZSAweDFm OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVn Y2FjaGUsIEkzODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkz ODZfRFNfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBpZiAoaXIucmVn bWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAgeworCSAgaXIu YWRkciAtPSAxOworCSAgZ290byBub19zdXBwb3J0OworCX0KKyAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU1Bf UkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH IChYODZfUkVDT1JEX0RTX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsK ICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBwb3AgZnMgKi8KICAgICBjYXNl IDB4MGZhMToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsK LSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBJMzg2X0ZTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTUF9S RUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfRlNfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FS Q0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwog ICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHBvcCBncyAqLwogICAgIGNhc2Ug MHgwZmE5OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIEkzODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwot ICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2Fj aGUsIEkzODZfR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2 X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRVNQX1JF R05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAo WDg2X1JFQ09SRF9HU19SRUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAg ICAgICBicmVhazsKIAogICAgICAgLyogbW92ICovCkBAIC0zODI2LDE5ICsz OTE0LDIxIEBAIHJlc3dpdGNoOgogCiAgICAgICBpZiAoaXIubW9kICE9IDMp CiAJeworICAgICAgICAgIGlmIChvcGNvZGUgPT0gMHhjNiB8fCBvcGNvZGUg PT0gMHhjNykKKwkgICAgaXIucmlwX29mZnNldCA9IChpci5vdCA+IE9UX0xP TkcpID8gNCA6ICgxIDw8IGlyLm90KTsKIAkgIGlmIChpMzg2X3JlY29yZF9s ZWFfbW9kcm0gKCZpcikpCiAJICAgIHJldHVybiAtMTsKIAl9CiAgICAgICBl bHNlCiAJewotCSAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAgICAgICAg aWYgKG9wY29kZSA9PSAweGM2IHx8IG9wY29kZSA9PSAweGM3KQorCSAgICBp ci5ybSB8PSBpci5yZXhfYjsKKwkgIGlmIChpci5vdCA9PSBPVF9CWVRFICYm ICFpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQogCSAgICBpci5y bSAmPSAweDM7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucm0pKQotCSAgICByZXR1cm4gLTE7CisJICBJMzg2 X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucm0pOwogCX0KLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKICAgICAgIGJyZWFr OworCiAgICAgICAvKiBtb3YgKi8KICAgICBjYXNlIDB4OGE6CiAgICAgY2Fz ZSAweDhiOgpAQCAtMzg0Niw0MCArMzkzNiw1NSBAQCByZXN3aXRjaDoKIAlp ci5vdCA9IE9UX0JZVEU7CiAgICAgICBlbHNlCiAJaXIub3QgPSBpci5kZmxh ZyArIE9UX1dPUkQ7Ci0KICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAo JmlyKSkKIAlyZXR1cm4gLTE7Ci0KLSAgICAgIGlmIChpci5vdCA9PSBPVF9C WVRFKQorICAgICAgaXIucmVnIHw9IHJleF9yOworICAgICAgaWYgKGlyLm90 ID09IE9UX0JZVEUgJiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05V TV0pCiAJaXIucmVnICY9IDB4MzsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5yZWcpKQotCXJldHVybiAt MTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5y ZWcpOworICAgICAgYnJlYWs7CiAKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0p KQorICAgICAgLyogbW92IHNlZyAqLworICAgIGNhc2UgMHg4YzoKKyAgICAg IGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7Cisg ICAgICBpZiAoaXIucmVnID4gNSkKKwl7CisJICBpci5hZGRyIC09IDI7CisJ ICBvcGNvZGUgPSBvcGNvZGUgPDwgOCB8IGlyLm1vZHJtOworCSAgZ290byBu b19zdXBwb3J0OworCX0KKworICAgICAgaWYgKGlyLm1vZCA9PSAzKQorCUkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSk7CisgICAgICBl bHNlCisJeworCSAgaXIub3QgPSBPVF9XT1JEOworCSAgaWYgKGkzODZfcmVj b3JkX2xlYV9tb2RybSAoJmlyKSkKKwkgICAgcmV0dXJuIC0xOworCX0KICAg ICAgIGJyZWFrOwogCiAgICAgICAvKiBtb3Ygc2VnICovCiAgICAgY2FzZSAw eDhlOgogICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJl dHVybiAtMTsKLQogICAgICAgc3dpdGNoIChpci5yZWcpCiAJewogCWNhc2Ug MDoKLQkgIHRtcHU4ID0gSTM4Nl9FU19SRUdOVU07CisJICB0bXB1OCA9IFg4 Nl9SRUNPUkRfRVNfUkVHTlVNOwogCSAgYnJlYWs7CiAJY2FzZSAyOgotCSAg dG1wdTggPSBJMzg2X1NTX1JFR05VTTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09S RF9TU19SRUdOVU07CiAJICBicmVhazsKIAljYXNlIDM6Ci0JICB0bXB1OCA9 IEkzODZfRFNfUkVHTlVNOworCSAgdG1wdTggPSBYODZfUkVDT1JEX0RTX1JF R05VTTsKIAkgIGJyZWFrOwogCWNhc2UgNDoKLQkgIHRtcHU4ID0gSTM4Nl9G U19SRUdOVU07CisJICB0bXB1OCA9IFg4Nl9SRUNPUkRfRlNfUkVHTlVNOwog CSAgYnJlYWs7CiAJY2FzZSA1OgotCSAgdG1wdTggPSBJMzg2X0dTX1JFR05V TTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9HU19SRUdOVU07CiAJICBicmVh azsKIAlkZWZhdWx0OgogCSAgaXIuYWRkciAtPSAyOwpAQCAtMzg4NywzOCAr Mzk5Miw4IEBAIHJlc3dpdGNoOgogCSAgZ290byBub19zdXBwb3J0OwogCSAg YnJlYWs7CiAJfQotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaXIucmVnY2FjaGUsIHRtcHU4KSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFr OwotCi0gICAgICAvKiBtb3Ygc2VnICovCi0gICAgY2FzZSAweDhjOgotICAg ICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQotCXJldHVybiAtMTsK LSAgICAgIGlmIChpci5yZWcgPiA1KQotCXsKLQkgIGlyLmFkZHIgLT0gMjsK LQkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07Ci0JICBnb3Rv IG5vX3N1cHBvcnQ7Ci0JfQotCi0gICAgICBpZiAoaXIubW9kID09IDMpCi0J ewotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2Fj aGUsIGlyLnJtKSkKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGVsc2UK LQl7Ci0JICBpci5vdCA9IE9UX1dPUkQ7Ci0JICBpZiAoaTM4Nl9yZWNvcmRf bGVhX21vZHJtICgmaXIpKQotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0gICAg ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwg STM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2 X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAodG1wdTgpOworICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdT X1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogbW92emJTICov CkBAIC0zOTMxLDggKzQwMDYsNyBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4 MGZiZjoKICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAly ZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChpci5yZWdjYWNoZSwgaXIucmVnKSkKLQlyZXR1cm4gLTE7CisgICAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucmVnIHwgcmV4X3Ip OwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGxlYSAqLwpAQCAtMzk0NSwx MiArNDAxOSwxMSBAQCByZXN3aXRjaDoKIAkgIG9wY29kZSA9IG9wY29kZSA8 PCA4IHwgaXIubW9kcm07CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJfQotCiAg ICAgICBpci5vdCA9IGlyLmRmbGFnOwotICAgICAgaWYgKGlyLm90ID09IE9U X0JZVEUpCisgICAgICBpci5yZWcgfD0gcmV4X3I7CisgICAgICBpZiAoaXIu b3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVH TlVNXSkKIAlpci5yZWcgJj0gMHgzOwotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJlZykpCi0JcmV0dXJu IC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGly LnJlZyk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogbW92IEVBWCAqLwpA QCAtMzk1OCw2MiArNDAzMSw2OCBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4 YTE6CiAgICAgICAvKiB4bGF0ICovCiAgICAgY2FzZSAweGQ3OgotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkz ODZfRUFYX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVBWF9SRUdOVU0p OwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIG1vdiBFQVggKi8KICAgICBj YXNlIDB4YTI6CiAgICAgY2FzZSAweGEzOgotICAgICAgewotCXVpbnQzMl90 IGFkZHI7Ci0KLQlpZiAoaXIub3ZlcnJpZGUpCi0JICB7Ci0JICAgIGlmIChy ZWNvcmRfZGVidWcpCi0JICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlBy b2Nlc3MgcmVjb3JkIGlnbm9yZXMgdGhlIG1lbW9yeSBjaGFuZ2UgIgotCQkJ CSAgICJvZiBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzIGJlY2F1c2UgIgot CQkJCSAgICJpdCBjYW4ndCBnZXQgdGhlIHZhbHVlIG9mIHRoZSBzZWdtZW50 ICIKLQkJCQkgICAicmVnaXN0ZXIuXG4iKSwKLQkJCQkgcGFkZHJlc3MgKGdk YmFyY2gsIGlyLmFkZHIpKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlm ICgob3Bjb2RlICYgMSkgPT0gMCkKLQkgICAgICBpci5vdCA9IE9UX0JZVEU7 Ci0JICAgIGVsc2UKLQkgICAgICBpci5vdCA9IGlyLmRmbGFnICsgT1RfV09S RDsKLQkgICAgaWYgKGlyLmFmbGFnKQotCSAgICAgIHsKLQkJaWYgKHRhcmdl dF9yZWFkX21lbW9yeQotCQkgICAgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSAm IGFkZHIsIDQpKQotCQkgIHsKLQkJICAgIGlmIChyZWNvcmRfZGVidWcpCi0J CSAgICAgIHByaW50Zl91bmZpbHRlcmVkIChfKCJQcm9jZXNzIHJlY29yZDog ZXJyb3IgcmVhZGluZyAiCi0JCQkJCSAgICJtZW1vcnkgYXQgYWRkciAlcyBs ZW4gPSA0LlxuIiksCi0JCQkJCSBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIuYWRk cikpOwotCQkgICAgcmV0dXJuIC0xOwotCQkgIH0KLQkJaXIuYWRkciArPSA0 OwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKHRhcmdl dF9yZWFkX21lbW9yeQotCQkgICAgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSAm IHRtcHUxNiwgNCkpCi0JCSAgewotCQkgICAgaWYgKHJlY29yZF9kZWJ1ZykK LQkJICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3Jk OiBlcnJvciByZWFkaW5nICIKLQkJCQkJICAgIm1lbW9yeSBhdCBhZGRyICVz IGxlbiA9IDQuXG4iKSwKLQkJCQkJIHBhZGRyZXNzIChnZGJhcmNoLCBpci5h ZGRyKSk7Ci0JCSAgICByZXR1cm4gLTE7Ci0JCSAgfQotCQlpci5hZGRyICs9 IDI7Ci0JCWFkZHIgPSB0bXB1MTY7Ci0JICAgICAgfQotCSAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyLCAxIDw8IGlyLm90KSkKLQkg ICAgICByZXR1cm4gLTE7Ci0JICB9Ci0gICAgICB9CisgICAgICBpZiAoaXIu b3ZlcnJpZGUgPj0gMCkKKyAgICAgICAgeworCSAgaWYgKHJlY29yZF9kZWJ1 ZykKKwkgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3Jk IGlnbm9yZXMgdGhlIG1lbW9yeSBjaGFuZ2UgIgorCQkJCSAib2YgaW5zdHJ1 Y3Rpb24gYXQgYWRkcmVzcyAweCVzIGJlY2F1c2UgIgorCQkJCSAiaXQgY2Fu J3QgZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgc2VnbWVudCAiCisJCQkJICJyZWdp c3Rlci5cbiIpLAorCQkJICAgICAgIHBhZGRyZXNzIChnZGJhcmNoLCBpci5h ZGRyKSk7CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBpZiAoKG9w Y29kZSAmIDEpID09IDApCisJICAgIGlyLm90ID0gT1RfQllURTsKKwkgIGVs c2UKKwkgICAgaXIub3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7CisJICBpZiAo aXIuYWZsYWcgPT0gMikKKwkgICAgeworICAgICAgICAgICAgICBpZiAodGFy Z2V0X3JlYWRfbWVtb3J5IChpci5hZGRyLCAoZ2RiX2J5dGUgKikgJmFkZHIs IDgpKQorCQl7CisJICAgICAgICAgIGlmIChyZWNvcmRfZGVidWcpCisJCSAg ICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQ6IGVycm9y IHJlYWRpbmcgIgorCSAgICAgICAgICAgICAgICAgICAgCQkgIm1lbW9yeSBh dCBhZGRyIDB4JXMgbGVuID0gOC5cbiIpLAorCQkJCSAgICAgICBwYWRkcmVz cyAoZ2RiYXJjaCwgaXIuYWRkcikpOworCQkgIHJldHVybiAtMTsKKwkJfQor CSAgICAgIGlyLmFkZHIgKz0gODsKKwkgICAgfQorICAgICAgICAgIGVsc2Ug aWYgKGlyLmFmbGFnKQorCSAgICB7CisgICAgICAgICAgICAgIGlmICh0YXJn ZXRfcmVhZF9tZW1vcnkgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSAmdG1wdTMy LCA0KSkKKwkJeworCSAgICAgICAgICBpZiAocmVjb3JkX2RlYnVnKQorCQkg ICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkOiBlcnJv ciByZWFkaW5nICIKKwkgICAgICAgICAgICAgICAgICAgIAkJICJtZW1vcnkg YXQgYWRkciAweCVzIGxlbiA9IDQuXG4iKSwKKwkJCQkgICAgICAgcGFkZHJl c3MgKGdkYmFyY2gsIGlyLmFkZHIpKTsKKwkJICByZXR1cm4gLTE7CisJCX0K KwkgICAgICBpci5hZGRyICs9IDQ7CisgICAgICAgICAgICAgIGFkZHIgPSB0 bXB1MzI7CisJICAgIH0KKyAgICAgICAgICBlbHNlCisJICAgIHsKKyAgICAg ICAgICAgICAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoaXIuYWRkciwgKGdk Yl9ieXRlICopICZ0bXB1MTYsIDIpKQorCQl7CisJICAgICAgICAgIGlmIChy ZWNvcmRfZGVidWcpCisJCSAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJv Y2VzcyByZWNvcmQ6IGVycm9yIHJlYWRpbmcgIgorCSAgICAgICAgICAgICAg ICAgICAgCQkgIm1lbW9yeSBhdCBhZGRyIDB4JXMgbGVuID0gMi5cbiIpLAor CQkJCSAgICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIuYWRkcikpOworCQkg IHJldHVybiAtMTsKKwkJfQorCSAgICAgIGlyLmFkZHIgKz0gMjsKKyAgICAg ICAgICAgICAgYWRkciA9IHRtcHUxNjsKKwkgICAgfQorCSAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgMSA8PCBpci5vdCkpCisJICAg IHJldHVybiAtMTsKKyAgICAgICAgfQogICAgICAgYnJlYWs7CiAKICAgICAg IC8qIG1vdiBSLCBJYiAqLwpAQCAtNDAyNSw4ICs0MTA0LDkgQEAgcmVzd2l0 Y2g6CiAgICAgY2FzZSAweGI1OgogICAgIGNhc2UgMHhiNjoKICAgICBjYXNl IDB4Yjc6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgKG9wY29kZSAmIDB4NykgJiAweDMpKQotCXJldHVybiAt MTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHICgoaXIu cmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgob3Bjb2RlICYgMHg3KSB8 IGlyLnJleF9iKQorCQkJCQk6ICgob3Bjb2RlICYgMHg3KSAmIDB4MykpOwog ICAgICAgYnJlYWs7CiAKICAgICAgIC8qIG1vdiBSLCBJdiAqLwpAQCAtNDAz OCw4ICs0MTE4LDcgQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweGJkOgogICAg IGNhc2UgMHhiZToKICAgICBjYXNlIDB4YmY6Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgb3Bjb2RlICYgMHg3 KSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoKG9wY29kZSAmIDB4NykgfCBpci5yZXhfYik7CiAgICAgICBi cmVhazsKIAogICAgICAgLyogeGNoZyBSLCBFQVggKi8KQEAgLTQwNTAsMTAg KzQxMjksOCBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4OTU6CiAgICAgY2Fz ZSAweDk2OgogICAgIGNhc2UgMHg5NzoKLSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0p KQotCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBvcGNvZGUgJiAweDcpKQotCXJldHVybiAt MTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX1JFQVhfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hf TElTVF9BRERfUkVHIChvcGNvZGUgJiAweDcpOwogICAgICAgYnJlYWs7CiAK ICAgICAgIC8qIHhjaGcgRXYsIEd2ICovCkBAIC00MDYzLDMzICs0MTQwLDM1 IEBAIHJlc3dpdGNoOgogCWlyLm90ID0gT1RfQllURTsKICAgICAgIGVsc2UK IAlpci5vdCA9IGlyLmRmbGFnICsgT1RfV09SRDsKLQogICAgICAgaWYgKGkz ODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJldHVybiAtMTsKLQogICAgICAg aWYgKGlyLm1vZCA9PSAzKQogCXsKLQkgIGlmIChpci5vdCA9PSBPVF9CWVRF KQorCSAgaXIucm0gIT0gaXIucmV4X2I7CisJICBpZiAoaXIub3QgPT0gT1Rf QllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAkg ICAgaXIucm0gJj0gMHgzOwotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X3JlZyAoaXIucmVnY2FjaGUsIGlyLnJtKSkKLQkgICAgcmV0dXJuIC0xOwor CSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtKTsKIAl9 CiAgICAgICBlbHNlCiAJewogCSAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2Ry bSAoJmlyKSkKIAkgICAgcmV0dXJuIC0xOwogCX0KLQotICAgICAgaWYgKGly Lm90ID09IE9UX0JZVEUpCisgICAgICBpci5yZWcgfD0gcmV4X3I7CisgICAg ICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNP UkRfUjhfUkVHTlVNXSkKIAlpci5yZWcgJj0gMHgzOwotICAgICAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJlZykp Ci0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKGlyLnJlZyk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogbGVz IEd2ICovCiAgICAgY2FzZSAweGM0OgogICAgICAgLyogbGRzIEd2ICovCiAg ICAgY2FzZSAweGM1OgorICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JE X1I4X1JFR05VTV0pCisgICAgICAgIHsKKwkgIGlyLmFkZHIgLT0gMTsKKwkg IGdvdG8gbm9fc3VwcG9ydDsKKwl9CiAgICAgICAvKiBsc3MgR3YgKi8KICAg ICBjYXNlIDB4MGZiMjoKICAgICAgIC8qIGxmcyBHdiAqLwpAQCAtNDEwNywz NSArNDE4NiwzMiBAQCByZXN3aXRjaDoKIAkgIG9wY29kZSA9IG9wY29kZSA8 PCA4IHwgaXIubW9kcm07CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJfQotCiAg ICAgICBzd2l0Y2ggKG9wY29kZSkKIAl7CiAJICAvKiBsZXMgR3YgKi8KIAlj YXNlIDB4YzQ6Ci0JICB0bXB1OCA9IEkzODZfRVNfUkVHTlVNOworCSAgdG1w dTggPSBYODZfUkVDT1JEX0VTX1JFR05VTTsKIAkgIGJyZWFrOwogCSAgLyog bGRzIEd2ICovCiAJY2FzZSAweGM1OgotCSAgdG1wdTggPSBJMzg2X0RTX1JF R05VTTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9EU19SRUdOVU07CiAJICBi cmVhazsKIAkgIC8qIGxzcyBHdiAqLwogCWNhc2UgMHgwZmIyOgotCSAgdG1w dTggPSBJMzg2X1NTX1JFR05VTTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9T U19SRUdOVU07CiAJICBicmVhazsKIAkgIC8qIGxmcyBHdiAqLwogCWNhc2Ug MHgwZmI0OgotCSAgdG1wdTggPSBJMzg2X0ZTX1JFR05VTTsKKwkgIHRtcHU4 ID0gWDg2X1JFQ09SRF9GU19SRUdOVU07CiAJICBicmVhazsKIAkgIC8qIGxn cyBHdiAqLwogCWNhc2UgMHgwZmI1OgotCSAgdG1wdTggPSBJMzg2X0dTX1JF R05VTTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9HU19SRUdOVU07CiAJICBi cmVhazsKIAl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChpci5yZWdjYWNoZSwgdG1wdTgpKQotCXJldHVybiAtMTsKLQotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGly LnJlZykpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKHRtcHU4KTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hf TElTVF9BRERfUkVHIChpci5yZWcgfCByZXhfcik7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVH TlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBzaGlmdHMgKi8KQEAg LTQxNDksMTAgKzQyMjUsOCBAQCByZXN3aXRjaDoKIAlpci5vdCA9IE9UX0JZ VEU7CiAgICAgICBlbHNlCiAJaXIub3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7 Ci0KICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1 cm4gLTE7Ci0KICAgICAgIGlmIChpci5tb2QgIT0gMyAmJiAob3Bjb2RlID09 IDB4ZDIgfHwgb3Bjb2RlID09IDB4ZDMpKQogCXsKIAkgIGlmIChpMzg2X3Jl Y29yZF9sZWFfbW9kcm0gKCZpcikpCkBAIC00MTYwLDE0ICs0MjM0LDEyIEBA IHJlc3dpdGNoOgogCX0KICAgICAgIGVsc2UKIAl7Ci0JICBpZiAoaXIub3Qg PT0gT1RfQllURSkKKwkgIGlyLnJtIHw9IGlyLnJleF9iOworCSAgaWYgKGly Lm90ID09IE9UX0JZVEUgJiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JF R05VTV0pCiAJICAgIGlyLnJtICY9IDB4MzsKLQkgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSkpCi0JICAgIHJl dHVybiAtMTsKKwkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChp ci5ybSk7CiAJfQotCi0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1 cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAo WDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAg ICAgY2FzZSAweDBmYTQ6CkBAIC00MjA0LDkgKzQyNzYsOSBAQCByZXN3aXRj aDoKICAgICAgIGlmIChpci5tb2QgIT0gMykKIAl7CiAJICAvKiBtZW1vcnkg Ki8KLQkgIHVpbnQzMl90IGFkZHI7CisJICB1aW50NjRfdCB0bXB1NjQ7CiAK LQkgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9kcm1fYWRkciAoJmlyLCAmYWRk cikpCisJICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKCZpciwg JnRtcHU2NCkpCiAJICAgIHJldHVybiAtMTsKIAkgIHN3aXRjaCAoaXIucmVn KQogCSAgICB7CkBAIC00MjY2LDE2ICs0MzM4LDE2IEBAIHJlc3dpdGNoOgog CQkgIHN3aXRjaCAoaXIucmVnID4+IDQpCiAJCSAgICB7CiAJCSAgICBjYXNl IDA6Ci0JCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFk ZHIsIDQpKQorCQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVt ICh0bXB1NjQsIDQpKQogCQkJcmV0dXJuIC0xOwogCQkgICAgICBicmVhazsK IAkJICAgIGNhc2UgMjoKLQkJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX21lbSAoYWRkciwgOCkpCisJCSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9tZW0gKHRtcHU2NCwgOCkpCiAJCQlyZXR1cm4gLTE7CiAJCSAg ICAgIGJyZWFrOwogCQkgICAgY2FzZSAzOgogCQkgICAgZGVmYXVsdDoKLQkJ ICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgMikp CisJCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2 NCwgMikpCiAJCQlyZXR1cm4gLTE7CiAJCSAgICAgIGJyZWFrOwogCQkgICAg fQpAQCAtNDI4NSwxNiArNDM1NywxNiBAQCByZXN3aXRjaDoKIAkJICAgIHsK IAkJICAgIGNhc2UgMDoKIAkJICAgIGNhc2UgMToKLQkJICAgICAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgNCkpCisJCSAgICAgIGlm IChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgNCkpCiAJCQly ZXR1cm4gLTE7CiAJCSAgICAgIGJyZWFrOwogCQkgICAgY2FzZSAyOgotCQkg ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyLCA4KSkK KwkJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0 LCA4KSkKIAkJCXJldHVybiAtMTsKIAkJICAgICAgYnJlYWs7CiAJCSAgICBj YXNlIDM6CiAJCSAgICBkZWZhdWx0OgotCQkgICAgICBpZiAocmVjb3JkX2Fy Y2hfbGlzdF9hZGRfbWVtIChhZGRyLCAyKSkKKwkJICAgICAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCAyKSkKIAkJCXJldHVybiAt MTsKIAkJICAgICAgYnJlYWs7CiAJCSAgICB9CkBAIC00MzExLDQzICs0Mzgz LDQzIEBAIHJlc3dpdGNoOgogCSAgICBjYXNlIDB4MGU6CiAJICAgICAgaWYg KGlyLmRmbGFnKQogCQl7Ci0JCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X21lbSAoYWRkciwgMjgpKQorCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKHRtcHU2NCwgMjgpKQogCQkgICAgcmV0dXJuIC0xOwogCQl9CiAJ ICAgICAgZWxzZQogCQl7Ci0JCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X21lbSAoYWRkciwgMTQpKQorCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKHRtcHU2NCwgMTQpKQogCQkgICAgcmV0dXJuIC0xOwogCQl9CiAJ ICAgICAgYnJlYWs7CiAJICAgIGNhc2UgMHgwZjoKIAkgICAgY2FzZSAweDJm OgotCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFkZHIs IDIpKQorCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRt cHU2NCwgMikpCiAJCXJldHVybiAtMTsKIAkgICAgICBicmVhazsKIAkgICAg Y2FzZSAweDFmOgogCSAgICBjYXNlIDB4M2U6Ci0JICAgICAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgMTApKQorCSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgMTApKQogCQlyZXR1 cm4gLTE7CiAJICAgICAgYnJlYWs7CiAJICAgIGNhc2UgMHgyZToKIAkgICAg ICBpZiAoaXIuZGZsYWcpCiAJCXsKLQkJICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfbWVtIChhZGRyLCAyOCkpCisJCSAgaWYgKHJlY29yZF9hcmNoX2xp c3RfYWRkX21lbSAodG1wdTY0LCAyOCkpCiAJCSAgICByZXR1cm4gLTE7Ci0J CSAgYWRkciArPSAyODsKKwkJICB0bXB1NjQgKz0gMjg7CiAJCX0KIAkgICAg ICBlbHNlCiAJCXsKLQkJICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVt IChhZGRyLCAxNCkpCisJCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21l bSAodG1wdTY0LCAxNCkpCiAJCSAgICByZXR1cm4gLTE7Ci0JCSAgYWRkciAr PSAxNDsKKwkJICB0bXB1NjQgKz0gMTQ7CiAJCX0KLQkgICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyLCA4MCkpCisJICAgICAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCA4MCkpCiAJCXJl dHVybiAtMTsKIAkgICAgICBicmVhazsKIAkgICAgY2FzZSAweDNmOgotCSAg ICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFkZHIsIDgpKQor CSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwg OCkpCiAJCXJldHVybiAtMTsKIAkgICAgICBicmVhazsKIAkgICAgZGVmYXVs dDoKQEAgLTQzNjksMTIzICs0NDQxLDg4IEBAIHJlc3dpdGNoOgogICAgICAg LyogaW5zUyAqLwogICAgIGNhc2UgMHg2YzoKICAgICBjYXNlIDB4NmQ6Ci0g ICAgICB7Ci0JdWludDMyX3QgYWRkcjsKLQotCWlmICgob3Bjb2RlICYgMSkg PT0gMCkKLQkgIGlyLm90ID0gT1RfQllURTsKLQllbHNlCi0JICBpci5vdCA9 IGlyLmRmbGFnICsgT1RfV09SRDsKLQlpZiAob3Bjb2RlID09IDB4YTQgfHwg b3Bjb2RlID09IDB4YTUpCi0JICB7Ci0JICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTSV9SRUdOVU0pKQot CSAgICAgIHJldHVybiAtMTsKLQkgIH0KLQlpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRElfUkVHTlVNKSkKLQkg IHJldHVybiAtMTsKLQotCXJlZ2NhY2hlX3Jhd19yZWFkIChpci5yZWdjYWNo ZSwgSTM4Nl9FRElfUkVHTlVNLAotCQkJICAgKGdkYl9ieXRlICopICYgYWRk cik7Ci0JaWYgKCFpci5hZmxhZykKLQkgIHsKLQkgICAgYWRkciAmPSAweGZm ZmY7Ci0JICAgIC8qIGFkZHIgKz0gKCh1aW50MzJfdClyZWFkX3JlZ2lzdGVy IChJMzg2X0VTX1JFR05VTSkpIDw8IDQ7ICovCi0JICAgIGlmIChyZWNvcmRf ZGVidWcpCi0JICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3Mg cmVjb3JkIGlnbm9yZXMgdGhlIG1lbW9yeSBjaGFuZ2UgIgotCQkJCSAgICJv ZiBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzIGJlY2F1c2UgIgotCQkJCSAg ICJpdCBjYW4ndCBnZXQgdGhlIHZhbHVlIG9mIHRoZSBzZWdtZW50ICIKLQkJ CQkgICAicmVnaXN0ZXIuXG4iKSwKLQkJCQkgcGFkZHJlc3MgKGdkYmFyY2gs IGlyLmFkZHIpKTsKLQkgIH0KLQotCWlmIChwcmVmaXhlcyAmIChQUkVGSVhf UkVQWiB8IFBSRUZJWF9SRVBOWikpCi0JICB7Ci0JICAgIHVpbnQzMl90IGNv dW50OwotCi0JICAgIHJlZ2NhY2hlX3Jhd19yZWFkIChpci5yZWdjYWNoZSwg STM4Nl9FQ1hfUkVHTlVNLAotCQkJICAgICAgIChnZGJfYnl0ZSAqKSAmIGNv dW50KTsKLQkgICAgaWYgKCFpci5hZmxhZykKLQkgICAgICBjb3VudCAmPSAw eGZmZmY7Ci0KLQkgICAgcmVnY2FjaGVfcmF3X3JlYWQgKGlyLnJlZ2NhY2hl LCBJMzg2X0VGTEFHU19SRUdOVU0sCi0JCQkgICAgICAgKGdkYl9ieXRlICop ICYgdG1wdTMyKTsKLQkgICAgaWYgKCh0bXB1MzIgPj4gMTApICYgMHgxKQot CSAgICAgIGFkZHIgLT0gKGNvdW50IC0gMSkgKiAoMSA8PCBpci5vdCk7Ci0K LQkgICAgaWYgKGlyLmFmbGFnKQotCSAgICAgIHsKLQkJaWYgKHJlY29yZF9h cmNoX2xpc3RfYWRkX21lbSAoYWRkciwgY291bnQgKiAoMSA8PCBpci5vdCkp KQotCQkgIHJldHVybiAtMTsKLQkgICAgICB9CisgICAgICBpZiAoKG9wY29k ZSAmIDEpID09IDApCisJaXIub3QgPSBPVF9CWVRFOworICAgICAgZWxzZQor CWlyLm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOworICAgICAgcmVnY2FjaGVf cmF3X3JlYWRfdW5zaWduZWQgKGlyLnJlZ2NhY2hlLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGlyLnJlZ21hcFtYODZfUkVDT1JEX1JF RElfUkVHTlVNXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmdG1wdWxvbmdlc3QpOworICAgICAgaWYgKCFpci5hZmxhZykKKyAgICAg ICAgeworICAgICAgICAgIHRtcHVsb25nZXN0ICY9IDB4ZmZmZjsKKyAgICAg ICAgICAvKiBhZGRyICs9ICgodWludDMyX3QpIHJlYWRfcmVnaXN0ZXIgKEkz ODZfRVNfUkVHTlVNKSkgPDwgNDsgKi8KKyAgICAgICAgICBpZiAocmVjb3Jk X2RlYnVnKQorICAgICAgICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlBy b2Nlc3MgcmVjb3JkIGlnbm9yZXMgdGhlIG1lbW9yeSBjaGFuZ2UgIgorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mIGluc3RydWN0aW9u IGF0IGFkZHJlc3MgMHglcyBiZWNhdXNlICIKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJpdCBjYW4ndCBnZXQgdGhlIHZhbHVlIG9mIHRo ZSBzZWdtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICJyZWdpc3Rlci5cbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIHBhZGRyZXNzIChnZGJhcmNoLCBpci5hZGRyKSk7CisgICAgICAgIH0K KyAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9S RVBOWikpCisgICAgICAgIHsKKyAgICAgICAgICBVTE9OR0VTVCBjb3VudCwg ZWZsYWdzOworICAgICAgICAgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVk IChpci5yZWdjYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgaXIucmVnbWFwW1g4Nl9SRUNPUkRfUkVESV9SRUdOVU1dLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY291bnQp OworICAgICAgICAgIGlmICghaXIuYWZsYWcpCisgICAgICAgICAgICBjb3Vu dCAmPSAweGZmZmY7CisgICAgICAgICAgcmVnY2FjaGVfcmF3X3JlYWRfdW5z aWduZWQgKGlyLnJlZ2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBpci5yZWdtYXBbWDg2X1JFQ09SRF9FRkxBR1NfUkVH TlVNXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg JmVmbGFncyk7CisgICAgICAgICAgaWYgKChlZmxhZ3MgPj4gMTApICYgMHgx KQorICAgICAgICAgICAgdG1wdWxvbmdlc3QgLT0gKGNvdW50IC0gMSkgKiAo MSA8PCBpci5vdCk7CisgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX21lbSAodG1wdWxvbmdlc3QsIGNvdW50ICogKDEgPDwgaXIub3QpKSkK KyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUNYX1JFR05VTSk7 CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHVsb25nZXN0LCAx IDw8IGlyLm90KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAg fQorICAgICAgaWYgKG9wY29kZSA9PSAweGE0IHx8IG9wY29kZSA9PSAweGE1 KQorICAgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9SRVNJX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRURJX1JFR05VTSk7CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9F RkxBR1NfUkVHTlVNKTsKKyAgICAgIGJyZWFrOwogCi0JICAgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VDWF9S RUdOVU0pKQotCSAgICAgIHJldHVybiAtMTsKLQkgIH0KLQllbHNlCi0JICB7 Ci0JICAgIGlmIChpci5hZmxhZykKLQkgICAgICB7Ci0JCWlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9tZW0gKGFkZHIsIDEgPDwgaXIub3QpKQotCQkgIHJl dHVybiAtMTsKLQkgICAgICB9Ci0JICB9Ci0gICAgICB9CisgICAgICAvKiBj bXBzUyAqLworICAgIGNhc2UgMHhhNjoKKyAgICBjYXNlIDB4YTc6CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9S RURJX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9SRVNJX1JFR05VTSk7CisgICAgICBpZiAocHJl Zml4ZXMgJiAoUFJFRklYX1JFUFogfCBQUkVGSVhfUkVQTlopKQorICAgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9S RUNYX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFr OwogCiAgICAgICAvKiBsb2RzUyAqLwogICAgIGNhc2UgMHhhYzoKICAgICBj YXNlIDB4YWQ6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChpci5yZWdjYWNoZSwgSTM4Nl9FQVhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7 Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdj YWNoZSwgSTM4Nl9FU0lfUkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBp ZiAocHJlZml4ZXMgJiAoUFJFRklYX1JFUFogfCBQUkVGSVhfUkVQTlopKQot CXsKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBJMzg2X0VDWF9SRUdOVU0pKQotCSAgICByZXR1cm4gLTE7Ci0JfQot ICAgICAgYnJlYWs7Ci0KLSAgICAgIC8qIG91dHNTICovCi0gICAgY2FzZSAw eDZlOgotICAgIGNhc2UgMHg2ZjoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTSV9SRUdOVU0pKQot CXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX1JFQVhfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU0lfUkVHTlVN KTsKICAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJ WF9SRVBOWikpCi0JewotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaXIucmVnY2FjaGUsIEkzODZfRUNYX1JFR05VTSkpCi0JICAgIHJldHVy biAtMTsKLQl9CisgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX1JFQ1hfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdO VU0pOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHNjYXNTICovCiAgICAg Y2FzZSAweGFlOgogICAgIGNhc2UgMHhhZjoKLSAgICAgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VESV9SRUdO VU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX1JFRElfUkVHTlVNKTsKICAgICAgIGlm IChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9SRVBOWikpCi0J ewotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2Fj aGUsIEkzODZfRUNYX1JFR05VTSkpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0g ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNo ZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICAg IEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JF Q1hfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgYnJlYWs7 CiAKLSAgICAgIC8qIGNtcHNTICovCi0gICAgY2FzZSAweGE2OgotICAgIGNh c2UgMHhhNzoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VESV9SRUdOVU0pKQotCXJldHVybiAtMTsK LSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBJMzg2X0VTSV9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAgIC8q IG91dHNTICovCisgICAgY2FzZSAweDZlOgorICAgIGNhc2UgMHg2ZjoKKyAg ICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JE X1JFU0lfUkVHTlVNKTsKICAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhf UkVQWiB8IFBSRUZJWF9SRVBOWikpCi0JewotCSAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUNYX1JFR05VTSkp Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVN KSkKLQlyZXR1cm4gLTE7CisgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX1JFQ1hfUkVHTlVNKTsKKyAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFH U19SRUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHBvcnQgSS9P ICovCkBAIC00NDkzLDggKzQ1MzAsOCBAQCByZXN3aXRjaDoKICAgICBjYXNl IDB4ZTU6CiAgICAgY2FzZSAweGVjOgogICAgIGNhc2UgMHhlZDoKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0VBWF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdO VU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4 Nl9SRUNPUkRfUkVBWF9SRUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICBj YXNlIDB4ZTY6CkBAIC00NTA4LDQ4ICs0NTQ1LDM5IEBAIHJlc3dpdGNoOgog ICAgIGNhc2UgMHhjMjoKICAgICAgIC8qIHJldCAqLwogICAgIGNhc2UgMHhj MzoKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX1JFU1BfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hf TElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOworICAg ICAgYnJlYWs7CisKICAgICAgIC8qIGxyZXQgaW0gKi8KICAgICBjYXNlIDB4 Y2E6CiAgICAgICAvKiBscmV0ICovCiAgICAgY2FzZSAweGNiOgotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkz ODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfQ1NfUkVH TlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBicmVhazsKLQogICAgICAgLyog aXJldCAqLwogICAgIGNhc2UgMHhjZjoKLSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0p KQotCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0NTX1JFR05VTSkpCi0JcmV0dXJu IC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNP UkRfQ1NfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9B RERfUkVHIChYODZfUkVDT1JEX1JFU1BfUkVHTlVNKTsKKyAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19S RUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGNhbGwgaW0gKi8K ICAgICBjYXNlIDB4ZTg6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9h ZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNKSkKLQlyZXR1 cm4gLTE7Ci0gICAgICByZWdjYWNoZV9yYXdfcmVhZCAoaXIucmVnY2FjaGUs IEkzODZfRVNQX1JFR05VTSwKLQkJCSAoZ2RiX2J5dGUgKikgJiB0bXB1MzIp OwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbQotCSAgKChD T1JFX0FERFIpIHRtcHUzMiAtICgxIDw8IChpci5kZmxhZyArIDEpKSwgKDEg PDwgKGlyLmRmbGFnICsgMSkpKSkKLQlyZXR1cm4gLTE7CisgICAgICBpZiAo aXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSAmJiBpci5kZmxhZykK KyAgICAgICAgaXIuZGZsYWcgPSAyOworICAgICAgaWYgKGkzODZfcmVjb3Jk X3B1c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAxKSkpCisgICAgICAgIHJl dHVybiAtMTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBsY2FsbCBpbSAq LwogICAgIGNhc2UgMHg5YToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0NTX1JFR05VTSkpCi0JcmV0 dXJuIC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIEkzODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwot ICAgICAgcmVnY2FjaGVfcmF3X3JlYWQgKGlyLnJlZ2NhY2hlLCBJMzg2X0VT UF9SRUdOVU0sCi0JCQkgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0KLQkgICgoQ09SRV9BRERS KSB0bXB1MzIgLSAoMSA8PCAoaXIuZGZsYWcgKyAyKSksICgxIDw8IChpci5k ZmxhZyArIDIpKSkpCi0JcmV0dXJuIC0xOworICAgICAgaWYgKGlyLnJlZ21h cFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAgIHsKKyAgICAgICAg ICBpci5hZGRyIC09IDE7CisgICAgICAgICAgZ290byBub19zdXBwb3J0Owor ICAgICAgICB9CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAoWDg2X1JFQ09SRF9DU19SRUdOVU0pOworICAgICAgaWYgKGkzODZfcmVj b3JkX3B1c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAxKSkpCisgICAgICAg IHJldHVybiAtMTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBqbXAgaW0g Ki8KQEAgLTQ2MTEsMTQgKzQ2MzksMTMgQEAgcmVzd2l0Y2g6CiAgICAgY2Fz ZSAweDBmOWQ6CiAgICAgY2FzZSAweDBmOWU6CiAgICAgY2FzZSAweDBmOWY6 CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JF Q09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGlyLm90ID0gT1RfQllURTsK ICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4g LTE7CiAgICAgICBpZiAoaXIubW9kID09IDMpCi0JewotCSAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJtICYgMHgz KSkKLQkgICAgcmV0dXJuIC0xOwotCX0KKyAgICAgICAgSTM4Nl9SRUNPUkRf QVJDSF9MSVNUX0FERF9SRUcgKGlyLnJleF9iID8gKGlyLnJtIHwgaXIucmV4 X2IpCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IDogKGlyLnJtICYgMHgzKSk7CiAgICAgICBlbHNlCiAJewogCSAgaWYgKGkz ODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKQEAgLTQ2NDUsMzQgKzQ2NzIs MzUgQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDBmNGY6CiAgICAgICBpZiAo aTM4Nl9yZWNvcmRfbW9kcm0gKCZpcikpCiAJcmV0dXJuIC0xOworICAgICAg aXIucmVnIHw9IHJleF9yOwogICAgICAgaWYgKGlyLmRmbGFnID09IE9UX0JZ VEUpCiAJaXIucmVnICY9IDB4MzsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5yZWcgJiAweDMpKQotCXJl dHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH IChpci5yZWcpOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGZsYWdzICov CiAgICAgICAvKiBwdXNoZiAqLwogICAgIGNhc2UgMHg5YzoKLSAgICAgIGlm IChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2 X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIHJlZ2NhY2hlX3Jh d19yZWFkIChpci5yZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNLAotCQkJIChn ZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfbWVtCi0JICAoKENPUkVfQUREUikgdG1wdTMyIC0gKDEgPDwg KGlyLmRmbGFnICsgMSkpLCAoMSA8PCAoaXIuZGZsYWcgKyAxKSkpKQotCXJl dHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH IChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOworICAgICAgaWYgKGlyLnJl Z21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0gJiYgaXIuZGZsYWcpCisgICAg ICAgIGlyLmRmbGFnID0gMjsKKyAgICAgIGlmIChpMzg2X3JlY29yZF9wdXNo ICgmaXIsIDEgPDwgKGlyLmRmbGFnICsgMSkpKQorICAgICAgICByZXR1cm4g LTE7CiAgICAgICBicmVhazsKIAogICAgICAgLyogcG9wZiAqLwogICAgIGNh c2UgMHg5ZDoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsK LSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAg IEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JF U1BfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgYnJlYWs7 CiAKICAgICAgIC8qIHNhaGYgKi8KICAgICBjYXNlIDB4OWU6CisgICAgICBp ZiAoaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAg eworICAgICAgICAgIGlyLmFkZHIgLT0gMTsKKyAgICAgICAgICBnb3RvIG5v X3N1cHBvcnQ7CisgICAgICAgIH0KICAgICAgIC8qIGNtYyAqLwogICAgIGNh c2UgMHhmNToKICAgICAgIC8qIGNsYyAqLwpAQCAtNDY4Myw2NiArNDcxMSw5 NSBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4ZmM6CiAgICAgICAvKiBzdGQg Ki8KICAgICBjYXNlIDB4ZmQ6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkK LQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFr OwogCiAgICAgICAvKiBsYWhmICovCiAgICAgY2FzZSAweDlmOgotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkz ODZfRUFYX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgaWYgKGlyLnJl Z21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAgIHsKKyAgICAg ICAgICBpci5hZGRyIC09IDE7CisgICAgICAgICAgZ290byBub19zdXBwb3J0 OworICAgICAgICB9CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKKyAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFQVhfUkVH TlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBiaXQgb3BlcmF0aW9u cyAqLwogICAgICAgLyogYnQvYnRzL2J0ci9idGMgR3YsIGltICovCiAgICAg Y2FzZSAweDBmYmE6Ci0gICAgICAvKiBidHMgKi8KLSAgICBjYXNlIDB4MGZh YjoKLSAgICAgIC8qIGJ0ciAqLwotICAgIGNhc2UgMHgwZmIzOgotICAgICAg LyogYnRjICovCi0gICAgY2FzZSAweDBmYmI6CiAgICAgICBpci5vdCA9IGly LmRmbGFnICsgT1RfV09SRDsKICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2Ry bSAoJmlyKSkKIAlyZXR1cm4gLTE7CiAgICAgICBpZiAoaXIucmVnIDwgNCkK IAl7Ci0JICBpci5hZGRyIC09IDM7CisJICBpci5hZGRyIC09IDI7CiAJICBv cGNvZGUgPSBvcGNvZGUgPDwgOCB8IGlyLm1vZHJtOwogCSAgZ290byBub19z dXBwb3J0OwogCX0KLSAgICAgIGlyLnJlZyAtPSA0OwotICAgICAgaWYgKGly LnJlZyAhPSAwKQorICAgICAgaWYgKGlyLnJlZyAhPSA0KQogCXsKLQkgIGlm IChpci5tb2QgIT0gMykKLQkgICAgewotCSAgICAgIGlmIChpMzg2X3JlY29y ZF9sZWFfbW9kcm0gKCZpcikpCi0JCXJldHVybiAtMTsKLQkgICAgfQorICAg ICAgICAgIGlmIChpci5tb2QgPT0gMykKKyAgICAgICAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSB8IGlyLnJleF9iKTsKIAkg IGVsc2UKIAkgICAgewotCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSkpCisJICAgICAgaWYgKGkzODZf cmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKIAkJcmV0dXJuIC0xOwogCSAgICB9 CiAJfQotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNP UkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyog YnQgR3YsIEV2ICovCiAgICAgY2FzZSAweDBmYTM6Ci0gICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxB R1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsK KyAgICAgIGJyZWFrOworCisgICAgICAvKiBidHMgKi8KKyAgICBjYXNlIDB4 MGZhYjoKKyAgICAgIC8qIGJ0ciAqLworICAgIGNhc2UgMHgwZmIzOgorICAg ICAgLyogYnRjICovCisgICAgY2FzZSAweDBmYmI6CisgICAgICBpci5vdCA9 IGlyLmRmbGFnICsgT1RfV09SRDsKKyAgICAgIGlmIChpMzg2X3JlY29yZF9t b2RybSAoJmlyKSkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgaWYgKGly Lm1vZCA9PSAzKQorICAgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoaXIucm0gfCBpci5yZXhfYik7CisgICAgICBlbHNlCisgICAgICAg IHsKKyAgICAgICAgICB1aW50NjRfdCB0bXB1NjQ7CisgICAgICAgICAgaWYg KGkzODZfcmVjb3JkX2xlYV9tb2RybV9hZGRyICgmaXIsICZ0bXB1NjQpKQor ICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgIHJlZ2NhY2hlX3Jh d19yZWFkX3Vuc2lnbmVkIChpci5yZWdjYWNoZSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgaXIucmVnbWFwW2lyLnJlZyB8IHJl eF9yXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg JnRtcHVsb25nZXN0KTsKKyAgICAgICAgICBzd2l0Y2ggKGlyLmRmbGFnKQor ICAgICAgICAgICAgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAg ICAgICB0bXB1NjQgKz0gKChpbnQxNl90KSB0bXB1bG9uZ2VzdCA+PiA0KSA8 PCA0OworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Ug MToKKyAgICAgICAgICAgICAgdG1wdTY0ICs9ICgoaW50MzJfdCkgdG1wdWxv bmdlc3QgPj4gNSkgPDwgNTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgIHRtcHU2NCArPSAoKGlu dDY0X3QpIHRtcHVsb25nZXN0ID4+IDYpIDw8IDY7CisgICAgICAgICAgICAg IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgMSA8PCBpci5vdCkpCisgICAg ICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgaWYgKGkzODZfcmVjb3Jk X2xlYV9tb2RybSAoJmlyKSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAg ICAgICAgfQorICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAog ICAgICAgLyogYnNmICovCiAgICAgY2FzZSAweDBmYmM6CiAgICAgICAvKiBi c3IgKi8KICAgICBjYXNlIDB4MGZiZDoKLSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5yZWcpKQotCXJldHVy biAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGly LnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsK KyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5yZWcg fCByZXhfcik7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwog CiAgICAgICAvKiBiY2QgKi8KQEAgLTQ3NTgsMTAgKzQ4MTUsMTMgQEAgcmVz d2l0Y2g6CiAgICAgY2FzZSAweGQ0OgogICAgICAgLyogYWFkICovCiAgICAg Y2FzZSAweGQ1OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaXIucmVnY2FjaGUsIEkzODZfRUFYX1JFR05VTSkpCi0JcmV0dXJuIC0x OwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVn Y2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAg ICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAg ICAgIHsKKyAgICAgICAgICBpci5hZGRyIC09IDE7CisgICAgICAgICAgZ290 byBub19zdXBwb3J0OworICAgICAgICB9CisgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7Cisg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBt aXNjICovCkBAIC00ODUzLDE2ICs0OTEzLDE4IEBAIHJlc3dpdGNoOgogICAg IGNhc2UgMHgwZmNkOgogICAgIGNhc2UgMHgwZmNlOgogICAgIGNhc2UgMHgw ZmNmOgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIG9wY29kZSAmIDcpKQotCXJldHVybiAtMTsKKyAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHICgob3Bjb2RlICYgNykgfCBp ci5yZXhfYik7CiAgICAgICBicmVhazsKIAogICAgICAgLyogc2FsYyAqLwog ICAgIGNhc2UgMHhkNjoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0pKQotCXJldHVy biAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGly LnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsK KyAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQor ICAgICAgICB7CisgICAgICAgICAgaXIuYWRkciAtPSAxOworICAgICAgICAg IGdvdG8gbm9fc3VwcG9ydDsKKyAgICAgICAgfQorICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVBWF9SRUdOVU0p OworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9S RUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAg LyogbG9vcG56ICovCkBAIC00ODczLDggKzQ5MzUsOCBAQCByZXN3aXRjaDoK ICAgICBjYXNlIDB4ZTI6CiAgICAgICAvKiBqZWN4eiAqLwogICAgIGNhc2Ug MHhlMzoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGly LnJlZ2NhY2hlLCBJMzg2X0VDWF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAg ICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JE X1JFQ1hfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9B RERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgYnJl YWs7CiAKICAgICAgIC8qIHdybXNyICovCkBAIC00OTA1LDYgKzQ5NjcsMTEg QEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDBmMzQ6CiAgICAgICB7CiAJaW50 IHJldDsKKyAgICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JF R05VTV0pCisgICAgICAgICAgeworICAgICAgICAgICAgaXIuYWRkciAtPSAy OworICAgICAgICAgICAgZ290byBub19zdXBwb3J0OworICAgICAgICAgIH0K IAlpZiAoZ2RiYXJjaF90ZGVwIChnZGJhcmNoKS0+aTM4Nl9zeXNlbnRlcl9y ZWNvcmQgPT0gTlVMTCkKIAkgIHsKIAkgICAgcHJpbnRmX3VuZmlsdGVyZWQg KF8oIlByb2Nlc3MgcmVjb3JkIGRvZXNuJ3Qgc3VwcG9ydCAiCkBAIC00OTI2 LDE2ICs0OTkzLDM3IEBAIHJlc3dpdGNoOgogICAgICAgZ290byBub19zdXBw b3J0OwogICAgICAgYnJlYWs7CiAKKyAgICAgIC8qIHN5c2NhbGwgKi8KKyAg ICBjYXNlIDB4MGYwNToKKyAgICAgIHsKKwlpbnQgcmV0OworCWlmIChnZGJh cmNoX3RkZXAgKGdkYmFyY2gpLT5pMzg2X3N5c2NhbGxfcmVjb3JkID09IE5V TEwpCisJICB7CisJICAgIHByaW50Zl91bmZpbHRlcmVkIChfKCJQcm9jZXNz IHJlY29yZCBkb2Vzbid0IHN1cHBvcnQgIgorCQkJCSAiaW5zdHJ1Y3Rpb24g c3lzY2FsbC5cbiIpKTsKKwkgICAgaXIuYWRkciAtPSAyOworCSAgICBnb3Rv IG5vX3N1cHBvcnQ7CisJICB9CisJcmV0ID0gZ2RiYXJjaF90ZGVwIChnZGJh cmNoKS0+aTM4Nl9zeXNjYWxsX3JlY29yZCAoaXIucmVnY2FjaGUpOworCWlm IChyZXQpCisJICByZXR1cm4gcmV0OworICAgICAgfQorICAgICAgYnJlYWs7 CisKKyAgICAgIC8qIHN5c3JldCAqLworICAgIGNhc2UgMHgwZjA3OgorICAg ICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkIGRvZXNu J3Qgc3VwcG9ydCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5z dHJ1Y3Rpb24gc3lzcmV0LlxuIikpOworICAgICAgaXIuYWRkciAtPSAyOwor ICAgICAgZ290byBub19zdXBwb3J0OworICAgICAgYnJlYWs7CisKICAgICAg IC8qIGNwdWlkICovCiAgICAgY2FzZSAweDBmYTI6Ci0gICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQVhf UkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQ1hfUkVHTlVNKSkK LQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRFhfUkVHTlVNKSkKLQlyZXR1cm4g LTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgSTM4Nl9FQlhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9S RUFYX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9SRUNYX1JFR05VTSk7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRURYX1JFR05V TSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9SRUJYX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAg LyogaGx0ICovCkBAIC00OTU2LDEwICs1MDQ0LDcgQEAgcmVzd2l0Y2g6CiAJ ICAvKiBzdHIgKi8KIAljYXNlIDE6CiAJICBpZiAoaXIubW9kID09IDMpCi0J ICAgIHsKLQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucm0pKQotCQlyZXR1cm4gLTE7Ci0JICAgIH0KKyAg ICAgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5y bSB8IGlyLnJleF9iKTsKIAkgIGVsc2UKIAkgICAgewogCSAgICAgIGlyLm90 ID0gT1RfV09SRDsKQEAgLTQ5NzYsOCArNTA2MSw3IEBAIHJlc3dpdGNoOgog CWNhc2UgNDoKIAkgIC8qIHZlcncgKi8KIAljYXNlIDU6Ci0JICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxB R1NfUkVHTlVNKSkKLQkgICAgcmV0dXJuIC0xOworICAgICAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19S RUdOVU0pOwogCSAgYnJlYWs7CiAJZGVmYXVsdDoKIAkgIGlyLmFkZHIgLT0g MzsKQEAgLTQ5OTUsNyArNTA3OSw3IEBAIHJlc3dpdGNoOgogCSAgLyogc2dk dCAqLwogCWNhc2UgMDoKIAkgIHsKLQkgICAgdWludDMyX3QgYWRkcjsKKwkg ICAgdWludDY0X3QgdG1wdTY0OwogCiAJICAgIGlmIChpci5tb2QgPT0gMykK IAkgICAgICB7CkBAIC01MDAzLDggKzUwODcsNyBAQCByZXN3aXRjaDoKIAkJ b3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKIAkJZ290byBub19z dXBwb3J0OwogCSAgICAgIH0KLQotCSAgICBpZiAoaXIub3ZlcnJpZGUpCisJ ICAgIGlmIChpci5vdmVycmlkZSA+PSAwKQogCSAgICAgIHsKIAkJaWYgKHJl Y29yZF9kZWJ1ZykKIAkJICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2Vz cyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5ICIKQEAgLTUwMTYsMTMgKzUw OTksMjEgQEAgcmVzd2l0Y2g6CiAJICAgICAgfQogCSAgICBlbHNlCiAJICAg ICAgewotCQlpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKCZpciwg JmFkZHIpKQotCQkgIHJldHVybiAtMTsKLQkJaWYgKHJlY29yZF9hcmNoX2xp c3RfYWRkX21lbSAoYWRkciwgMikpCisJCWlmIChpMzg2X3JlY29yZF9sZWFf bW9kcm1fYWRkciAoJmlyLCAmdG1wdTY0KSkKIAkJICByZXR1cm4gLTE7Ci0J CWFkZHIgKz0gMjsKLQkJaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo YWRkciwgNCkpCisJCWlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRt cHU2NCwgMikpCiAJCSAgcmV0dXJuIC0xOworCQl0bXB1NjQgKz0gMjsKKyAg ICAgICAgICAgICAgICBpZiAoaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVH TlVNXSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCA4KSkK KwkJICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAg ICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo dG1wdTY0LCA0KSkKKwkJICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAg ICAgICAgfQogCSAgICAgIH0KIAkgIH0KIAkgIGJyZWFrOwpAQCAtNTAzNiw4 ICs1MTI3LDcgQEAgcmVzd2l0Y2g6CiAJCSAgYnJlYWs7CiAJCSAgLyogbXdh aXQgKi8KIAkJY2FzZSAxOgotCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCQkg ICAgcmV0dXJuIC0xOworCQkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogCQkgIGJyZWFrOwog CQlkZWZhdWx0OgogCQkgIGlyLmFkZHIgLT0gMzsKQEAgLTUwNDksNyArNTEz OSw3IEBAIHJlc3dpdGNoOgogCSAgZWxzZQogCSAgICB7CiAJICAgICAgLyog c2lkdCAqLwotCSAgICAgIGlmIChpci5vdmVycmlkZSkKKwkgICAgICBpZiAo aXIub3ZlcnJpZGUgPj0gMCkKIAkJewogCQkgIGlmIChyZWNvcmRfZGVidWcp CiAJCSAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQg aWdub3JlcyB0aGUgbWVtb3J5ICIKQEAgLTUwNjEsMTUgKzUxNTEsMjMgQEAg cmVzd2l0Y2g6CiAJCX0KIAkgICAgICBlbHNlCiAJCXsKLQkJICB1aW50MzJf dCBhZGRyOworCQkgIHVpbnQ2NF90IHRtcHU2NDsKIAotCQkgIGlmIChpMzg2 X3JlY29yZF9sZWFfbW9kcm1fYWRkciAoJmlyLCAmYWRkcikpCisJCSAgaWYg KGkzODZfcmVjb3JkX2xlYV9tb2RybV9hZGRyICgmaXIsICZ0bXB1NjQpKQog CQkgICAgcmV0dXJuIC0xOwotCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKGFkZHIsIDIpKQorCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKHRtcHU2NCwgMikpCiAJCSAgICByZXR1cm4gLTE7CiAJCSAgYWRk ciArPSAyOwotCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFk ZHIsIDQpKQotCQkgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAg aWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAg ICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfbWVtICh0bXB1NjQsIDgpKQorCQkgICAgICAg IHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAg ICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo dG1wdTY0LCA0KSkKKwkJICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAg ICAgICAgICAgIH0KIAkJfQogCSAgICB9CiAJICBicmVhazsKQEAgLTUwNzcs OSArNTE3NSw2IEBAIHJlc3dpdGNoOgogCWNhc2UgMjoKIAkgIC8qIGxpZHQg Ki8KIAljYXNlIDM6Ci0JICAvKiBpbnZscGcgKi8KLQljYXNlIDc6Ci0JZGVm YXVsdDoKIAkgIGlmIChpci5tb2QgPT0gMykKIAkgICAgewogCSAgICAgIGly LmFkZHIgLT0gMzsKQEAgLTUwOTEsNyArNTE4Niw3IEBAIHJlc3dpdGNoOgog CWNhc2UgNDoKIAkgIGlmIChpci5tb2QgPT0gMykKIAkgICAgewotCSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBp ci5ybSkpCisJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIGlyLnJtIHwgaXIucmV4X2IpKQogCQlyZXR1cm4gLTE7 CiAJICAgIH0KIAkgIGVsc2UKQEAgLTUxMDAsOSArNTE5NSwzMiBAQCByZXN3 aXRjaDoKIAkgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIp KQogCQlyZXR1cm4gLTE7CiAJICAgIH0KKwkgIEkzODZfUkVDT1JEX0FSQ0hf TElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogCSAg YnJlYWs7CiAJICAvKiBsbXN3ICovCiAJY2FzZSA2OgorCSAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05V TSk7CisJICBicmVhazsKKwkgIC8qIGludmxwZyAqLworCWNhc2UgNzoKKwkg IGlmIChpci5tb2QgPT0gMykKKwkgICAgeworCSAgICAgIGlmIChpci5ybSA9 PSAwICYmIGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisJICAg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9HU19SRUdOVU0pOworCSAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkgICAg ICAgICAgaXIuYWRkciAtPSAzOworCSAgICAgICAgICBvcGNvZGUgPSBvcGNv ZGUgPDwgOCB8IGlyLm1vZHJtOworCSAgICAgICAgICBnb3RvIG5vX3N1cHBv cnQ7CisJICAgICAgICB9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JF R05VTSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgaXIuYWRkciAtPSAz OworCSAgb3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKKwkgIGdv dG8gbm9fc3VwcG9ydDsKIAkgIGJyZWFrOwogCX0KICAgICAgIGJyZWFrOwpA QCAtNTExNSwyMSArNTIzMywyMSBAQCByZXN3aXRjaDoKIAogICAgICAgLyog YXJwbCAqLwogICAgIGNhc2UgMHg2MzoKLSAgICAgIGlyLm90ID0gaXIuZGZs YWcgPyBPVF9MT05HIDogT1RfV09SRDsKICAgICAgIGlmIChpMzg2X3JlY29y ZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7Ci0gICAgICBpZiAoaXIubW9k ICE9IDMpCi0JewotCSAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmly KSkKLQkgICAgcmV0dXJuIC0xOwotCX0KKyAgICAgIGlmIChpci5tb2QgPT0g MyB8fCBpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAg ICB7CisgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0KKwkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgID8gKGlyLnJlZyB8IHJleF9yKSA6 IGlyLnJtKTsKKyAgICAgICAgfQogICAgICAgZWxzZQotCXsKLQkgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSkp Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVN KSkKLQlyZXR1cm4gLTE7CisgICAgICAgIHsKKyAgICAgICAgICBpci5vdCA9 IGlyLmRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAgICAgaWYg KGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKKyAgICAgICAgICAgIHJl dHVybiAtMTsKKyAgICAgICAgfQorICAgICAgaWYgKCFpci5yZWdtYXBbWDg2 X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAg ICAgIGJyZWFrOwogCiAgICAgICAvKiBsYXIgKi8KQEAgLTUxMzgsMTMgKzUy NTYsMTkgQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDBmMDM6CiAgICAgICBp ZiAoaTM4Nl9yZWNvcmRfbW9kcm0gKCZpcikpCiAJcmV0dXJuIC0xOwotICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IGlyLnJlZykpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05V TSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNU X0FERF9SRUcgKGlyLnJlZyB8IHJleF9yKTsKKyAgICAgIEkzODZfUkVDT1JE X0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0p OwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MGYxODoKKyAgICAgIGlm IChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKKwlyZXR1cm4gLTE7CisgICAg ICBpZiAoaXIubW9kID09IDMgJiYgaXIucmVnID09IDMpCisgICAgICAgIHsK KwkgIGlyLmFkZHIgLT0gMzsKKwkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwg aXIubW9kcm07CisJICBnb3RvIG5vX3N1cHBvcnQ7CisJfQogICAgICAgYnJl YWs7CiAKICAgICAgIC8qIG5vcCAobXVsdGkgYnl0ZSkgKi8KQEAgLTUxNjUs NyArNTI4OSw3IEBAIHJlc3dpdGNoOgogCXJldHVybiAtMTsKICAgICAgIGlm ICgoaXIubW9kcm0gJiAweGMwKSAhPSAweGMwKQogCXsKLQkgIGlyLmFkZHIg LT0gMjsKKwkgIGlyLmFkZHIgLT0gMzsKIAkgIG9wY29kZSA9IG9wY29kZSA8 PCA4IHwgaXIubW9kcm07CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJfQpAQCAt NTE3NywxNiArNTMwMSwxMiBAQCByZXN3aXRjaDoKIAljYXNlIDQ6CiAJY2Fz ZSA4OgogCSAgaWYgKG9wY29kZSAmIDIpCi0JICAgIHsKLQkgICAgfQorCSAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9F RkxBR1NfUkVHTlVNKTsKIAkgIGVsc2UKLQkgICAgewotCSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSkp Ci0JCXJldHVybiAtMTsKLQkgICAgfQorICAgICAgICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtIHwgaXIucmV4X2IpOwogCSAg YnJlYWs7CiAJZGVmYXVsdDoKLQkgIGlyLmFkZHIgLT0gMjsKKwkgIGlyLmFk ZHIgLT0gMzsKIAkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07 CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJICBicmVhazsKQEAgLTUyMDIsMjIg KzUzMjIsMTkgQEAgcmVzd2l0Y2g6CiAgICAgICBpZiAoKGlyLm1vZHJtICYg MHhjMCkgIT0gMHhjMCB8fCBpci5yZWcgPT0gNAogCSAgfHwgaXIucmVnID09 IDUgfHwgaXIucmVnID49IDgpCiAJewotCSAgaXIuYWRkciAtPSAyOworCSAg aXIuYWRkciAtPSAzOwogCSAgb3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5t b2RybTsKIAkgIGdvdG8gbm9fc3VwcG9ydDsKIAl9CiAgICAgICBpZiAob3Bj b2RlICYgMikKLQl7Ci0JfQorICAgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJ U1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAg IGVsc2UKLQl7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucm0pKQotCSAgICByZXR1cm4gLTE7Ci0JfQorCUkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSB8IGlyLnJleF9i KTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBjbHRzICovCiAgICAgY2Fz ZSAweDBmMDY6CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwog CiAgICAgICAvKiBNTVgvU1NFL1NTRTIvUE5JIHN1cHBvcnQgKi8KQEAgLTUy MzIsOSArNTM0OSw4IEBAIHJlc3dpdGNoOgogICAgICAgYnJlYWs7CiAgICAg fQogCi0vKiBJbiB0aGUgZnV0dXJlLCBNYXliZSBzdGlsbCBuZWVkIHRvIGRl YWwgd2l0aCBuZWVkX2Rhc20gKi8KLSAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUlQX1JFR05VTSkpCi0gICAg cmV0dXJuIC0xOworICAvKiBJbiB0aGUgZnV0dXJlLCBtYXliZSBzdGlsbCBu ZWVkIHRvIGRlYWwgd2l0aCBuZWVkX2Rhc20uICAqLworICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUlQX1JFR05VTSk7 CiAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9lbmQgKCkpCiAgICAgcmV0 dXJuIC0xOwogCkBAIC01MjQ3LDYgKzUzNjMsMTUgQEAgbm9fc3VwcG9ydDoK ICAgcmV0dXJuIC0xOwogfQogCitzdGF0aWMgY29uc3QgaW50IGkzODZfcmVj b3JkX3JlZ21hcFtdID0KK3sKKyAgSTM4Nl9FQVhfUkVHTlVNLCBJMzg2X0VD WF9SRUdOVU0sIEkzODZfRURYX1JFR05VTSwgSTM4Nl9FQlhfUkVHTlVNLAor ICBJMzg2X0VTUF9SRUdOVU0sIEkzODZfRUJQX1JFR05VTSwgSTM4Nl9FU0lf UkVHTlVNLCBJMzg2X0VESV9SRUdOVU0sCisgIDAsIDAsIDAsIDAsIDAsIDAs IDAsIDAsCisgIEkzODZfRUlQX1JFR05VTSwgSTM4Nl9FRkxBR1NfUkVHTlVN LCBJMzg2X0NTX1JFR05VTSwgSTM4Nl9TU19SRUdOVU0sCisgIEkzODZfRFNf UkVHTlVNLCBJMzg2X0VTX1JFR05VTSwgSTM4Nl9GU19SRUdOVU0sIEkzODZf R1NfUkVHTlVNCit9OworCiAMCiBzdGF0aWMgc3RydWN0IGdkYmFyY2ggKgog aTM4Nl9nZGJhcmNoX2luaXQgKHN0cnVjdCBnZGJhcmNoX2luZm8gaW5mbywg c3RydWN0IGdkYmFyY2hfbGlzdCAqYXJjaGVzKQpAQCAtNTMwNyw2ICs1NDMy LDggQEAgaTM4Nl9nZGJhcmNoX2luaXQgKHN0cnVjdCBnZGJhcmNoX2luZm8g aQogICB0ZGVwLT5zY19wY19vZmZzZXQgPSAtMTsKICAgdGRlcC0+c2Nfc3Bf b2Zmc2V0ID0gLTE7CiAKKyAgdGRlcC0+cmVjb3JkX3JlZ21hcCA9IGkzODZf cmVjb3JkX3JlZ21hcDsKKwogICAvKiBUaGUgZm9ybWF0IHVzZWQgZm9yIGBs b25nIGRvdWJsZScgb24gYWxtb3N0IGFsbCBpMzg2IHRhcmdldHMgaXMKICAg ICAgdGhlIGkzODcgZXh0ZW5kZWQgZmxvYXRpbmctcG9pbnQgZm9ybWF0LiAg SW4gZmFjdCwgb2YgYWxsIHRhcmdldHMKICAgICAgaW4gdGhlIEdDQyAyLjk1 IHRyZWUsIG9ubHkgT1NGLzEgZG9lcyBpdCBkaWZmZXJlbnQsIGFuZCBpbnNp c3RzCi0tLSBhL2kzODYtdGRlcC5oCisrKyBiL2kzODYtdGRlcC5oCkBAIC0x MTEsMTAgKzExMSwxNSBAQCBzdHJ1Y3QgZ2RiYXJjaF90ZGVwCiAgIHN0cnVj dCB0eXBlICppMzg3X2V4dF90eXBlOwogCiAgIC8qIFByb2Nlc3MgcmVjb3Jk L3JlcGxheSB0YXJnZXQuICAqLworICAvKiBUaGUgbWFwIGZvciByZWdpc3Rl cnMgYmVjYXVzZSB0aGUgQU1ENjQncyByZWdpc3RlcnMgb3JkZXIKKyAgICAg aW4gR0RCIGlzIG5vdCBzYW1lIGFzIEkzODYgaW5zdHJ1Y3Rpb25zLiAgKi8K KyAgY29uc3QgaW50ICpyZWNvcmRfcmVnbWFwOwogICAvKiBQYXJzZSBpbnR4 ODAgYXJncy4gICovCiAgIGludCAoKmkzODZfaW50eDgwX3JlY29yZCkgKHN0 cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUpOwogICAvKiBQYXJzZSBzeXNlbnRl ciBhcmdzLiAgKi8KICAgaW50ICgqaTM4Nl9zeXNlbnRlcl9yZWNvcmQpIChz dHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlKTsKKyAgLyogUGFyc2Ugc3lzY2Fs bCBhcmdzLiAgKi8KKyAgaW50ICgqaTM4Nl9zeXNjYWxsX3JlY29yZCkgKHN0 cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUpOwogfTsKIAogLyogRmxvYXRpbmct cG9pbnQgcmVnaXN0ZXJzLiAgKi8KQEAgLTE1MSw2ICsxNTYsMzYgQEAgZW51 bSBpMzg2X3JlZ251bQogICBJMzg2X1NUMF9SRUdOVU0JCS8qICVzdCgwKSAq LwogfTsKIAorLyogUmVnaXN0ZXIgbnVtYmVycyBvZiBSRUNPUkRfUkVHTUFQ LiAgKi8KKworZW51bSByZWNvcmRfaTM4Nl9yZWdudW0KK3sKKyAgWDg2X1JF Q09SRF9SRUFYX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRUNYX1JFR05VTSwK KyAgWDg2X1JFQ09SRF9SRURYX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRUJY X1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRVNQX1JFR05VTSwKKyAgWDg2X1JF Q09SRF9SRUJQX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRVNJX1JFR05VTSwK KyAgWDg2X1JFQ09SRF9SRURJX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SOF9S RUdOVU0sCisgIFg4Nl9SRUNPUkRfUjlfUkVHTlVNLAorICBYODZfUkVDT1JE X1IxMF9SRUdOVU0sCisgIFg4Nl9SRUNPUkRfUjExX1JFR05VTSwKKyAgWDg2 X1JFQ09SRF9SMTJfUkVHTlVNLAorICBYODZfUkVDT1JEX1IxM19SRUdOVU0s CisgIFg4Nl9SRUNPUkRfUjE0X1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SMTVf UkVHTlVNLAorICBYODZfUkVDT1JEX1JFSVBfUkVHTlVNLAorICBYODZfUkVD T1JEX0VGTEFHU19SRUdOVU0sCisgIFg4Nl9SRUNPUkRfQ1NfUkVHTlVNLAor ICBYODZfUkVDT1JEX1NTX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9EU19SRUdO VU0sCisgIFg4Nl9SRUNPUkRfRVNfUkVHTlVNLAorICBYODZfUkVDT1JEX0ZT X1JFR05VTSwKKyAgWDg2X1JFQ09SRF9HU19SRUdOVU0sCit9OworCiAjZGVm aW5lIEkzODZfTlVNX0dSRUdTCTE2CiAjZGVmaW5lIEkzODZfTlVNX0ZSRUdT CTE2CiAjZGVmaW5lIEkzODZfTlVNX1hSRUdTICA5Cg== --001636e91011da75fc046f23adb6--