From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 28314 invoked by alias); 7 Jul 2009 02:38:07 -0000 Received: (qmail 28199 invoked by uid 22791); 7 Jul 2009 02:37:53 -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 mail-pz0-f203.google.com (HELO mail-pz0-f203.google.com) (209.85.222.203) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Tue, 07 Jul 2009 02:37:37 +0000 Received: by pzk41 with SMTP id 41so3952882pzk.12 for ; Mon, 06 Jul 2009 19:37:34 -0700 (PDT) MIME-Version: 1.0 Received: by 10.143.5.20 with SMTP id h20mr1665565wfi.279.1246934253872; Mon, 06 Jul 2009 19:37:33 -0700 (PDT) Date: Tue, 07 Jul 2009 02:38:00 -0000 Message-ID: Subject: [RFA/RFC Prec] Add Linux AMD64 process record support second version, (instruction set support) 1/3 From: Hui Zhu To: gdb-patches ml , Michael Snyder Content-Type: multipart/mixed; boundary=001636e0a91c42a6ae046e1481d3 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/msg00171.txt.bz2 --001636e0a91c42a6ae046e1481d3 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Content-length: 72887 Because AMD64 instruction set is the extend of I386 instruction set. So I update the function i386_process_record to make it support AMD64 instruction set. some of other software do something like it. 2009-07-07 Hui Zhu 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 | 1444 +++++++++++++++++++++++++++++++-----------------------= ----- i386-tdep.h | 35 + 3 files changed, 830 insertions(+), 661 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 @@ -2764,6 +2764,7 @@ enum OT_BYTE =3D 0, OT_WORD, OT_LONG, + OT_QUAD, }; /* i386 arith/logic operations */ @@ -2781,6 +2782,7 @@ enum struct i386_record_s { + struct gdbarch *gdbarch; struct regcache *regcache; CORE_ADDR addr; int aflag; @@ -2789,6 +2791,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 @@ -2797,7 +2804,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)) { @@ -2820,12 +2827,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) @@ -2849,9 +2857,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) { @@ -2859,7 +2868,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 " @@ -2868,6 +2877,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 { @@ -2884,10 +2896,10 @@ i386_record_lea_modrm_addr (struct i386_ return -1; } irp->addr++; - *addr =3D (int8_t) tmpu8; + *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 " @@ -2895,21 +2907,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 @@ -2921,7 +2946,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 " @@ -2930,7 +2955,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; } @@ -2949,10 +2974,10 @@ i386_record_lea_modrm_addr (struct i386_ return -1; } irp->addr++; - *addr =3D (int8_t) tmpu8; + *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 " @@ -2961,63 +2986,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; @@ -3034,10 +3071,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 " @@ -3056,10 +3093,36 @@ 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) \ + do { \ + if (record_arch_list_add_reg (ir.regcache, ir.regmap[(regnum)])) \ + return -1; \ + } while (0) + int i386_process_record (struct gdbarch *gdbarch, struct regcache *regcache, CORE_ADDR addr) @@ -3068,14 +3131,21 @@ 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.regmap =3D gdbarch_tdep (gdbarch)->record_regmap; + ir.gdbarch =3D gdbarch; if (record_debug > 1) fprintf_unfiltered (gdb_stdlog, "Process record: i386_process_record " @@ -3106,22 +3176,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; @@ -3129,16 +3199,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; @@ -3228,30 +3333,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 */ @@ -3271,17 +3374,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 */ @@ -3302,10 +3405,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 */ @@ -3318,28 +3419,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) @@ -3349,13 +3439,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: @@ -3365,15 +3456,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; @@ -3387,10 +3473,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) @@ -3399,13 +3481,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)) @@ -3413,42 +3498,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 + 2))) 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; @@ -3463,22 +3546,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 */ @@ -3488,12 +3567,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 */ @@ -3505,28 +3587,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 */ @@ -3540,22 +3619,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 */ @@ -3568,14 +3644,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 */ @@ -3589,6 +3662,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 */ @@ -3597,16 +3676,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; @@ -3619,113 +3718,103 @@ 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 { 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 */ @@ -3743,19 +3832,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: @@ -3763,40 +3854,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; @@ -3804,38 +3910,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 */ @@ -3848,8 +3924,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 */ @@ -3862,12 +3937,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 */ @@ -3875,62 +3949,71 @@ 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 */ @@ -3942,8 +4025,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 */ @@ -3955,8 +4039,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 */ @@ -3967,10 +4050,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 */ @@ -3980,33 +4061,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 */ @@ -4024,35 +4107,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 */ @@ -4066,10 +4146,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)) @@ -4077,14 +4155,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: @@ -4121,9 +4197,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) { @@ -4183,16 +4259,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; } @@ -4202,16 +4278,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; } @@ -4228,43 +4304,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: @@ -4286,123 +4362,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 */ @@ -4410,8 +4451,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: @@ -4425,48 +4466,32 @@ 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 (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; + I386_RECORD_ARCH_LIST_ADD_REG (X86_RECORD_CS_REGNUM); + if (i386_record_push (&ir, 1 << (ir.dflag + 1))) + return -1; break; /* jmp im */ @@ -4528,14 +4553,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)) @@ -4562,34 +4586,33 @@ 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 (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 */ @@ -4600,66 +4623,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=3D3) + 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 */ @@ -4675,10 +4727,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 */ @@ -4770,16 +4825,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 */ @@ -4790,8 +4847,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 */ @@ -4822,6 +4879,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 " @@ -4843,16 +4905,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 */ @@ -4873,10 +4956,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; @@ -4893,8 +4973,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; @@ -4912,7 +4991,7 @@ reswitch: /* sgdt */ case 0: { - uint32_t addr; + uint64_t tmpu64; if (ir.mod =3D=3D 3) { @@ -4920,8 +4999,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 " @@ -4933,13 +5011,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; @@ -4953,8 +5039,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; @@ -4966,7 +5051,7 @@ reswitch: else { /* sidt */ - if (ir.override) + if (ir.override >=3D 0) { if (record_debug) printf_unfiltered (_("Process record ignores the memory " @@ -4978,15 +5063,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; @@ -4994,9 +5087,6 @@ reswitch: case 2: /* lidt */ case 3: - /* invlpg */ - case 7: - default: if (ir.mod =3D=3D 3) { ir.addr -=3D 3; @@ -5008,7 +5098,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 @@ -5017,9 +5107,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; @@ -5032,21 +5145,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 */ @@ -5055,13 +5168,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) */ @@ -5082,7 +5201,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; } @@ -5094,16 +5213,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; @@ -5119,22 +5234,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 */ @@ -5149,9 +5261,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; @@ -5164,6 +5275,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 +}; + =0C static struct gdbarch * i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) @@ -5224,6 +5344,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 n= ot + same with 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 --001636e0a91c42a6ae046e1481d3 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_fwu0hnah0 Content-length: 96067 LS0tCiBhbWQ2NC10ZGVwLmMgfCAgIDEyIAogaTM4Ni10ZGVwLmMgIHwgMTQ0 NCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQogaTM4Ni10ZGVwLmggIHwgICAzNSArCiAzIGZp bGVzIGNoYW5nZWQsIDgzMCBpbnNlcnRpb25zKCspLCA2NjEgZGVsZXRpb25z KC0pCgotLS0gYS9hbWQ2NC10ZGVwLmMKKysrIGIvYW1kNjQtdGRlcC5jCkBA IC0xOTg5LDYgKzE5ODksMTYgQEAgYW1kNjRfZ2V0X2xvbmdqbXBfdGFyZ2V0 IChzdHJ1Y3QgZnJhbWVfaQogICByZXR1cm4gMTsKIH0KIAorc3RhdGljIGNv bnN0IGludCBhbWQ2NF9yZWNvcmRfcmVnbWFwW10gPQoreworICBBTUQ2NF9S QVhfUkVHTlVNLCBBTUQ2NF9SQ1hfUkVHTlVNLCBBTUQ2NF9SRFhfUkVHTlVN LCBBTUQ2NF9SQlhfUkVHTlVNLAorICBBTUQ2NF9SU1BfUkVHTlVNLCBBTUQ2 NF9SQlBfUkVHTlVNLCBBTUQ2NF9SU0lfUkVHTlVNLCBBTUQ2NF9SRElfUkVH TlVNLAorICBBTUQ2NF9SOF9SRUdOVU0sIEFNRDY0X1I5X1JFR05VTSwgQU1E NjRfUjEwX1JFR05VTSwgQU1ENjRfUjExX1JFR05VTSwKKyAgQU1ENjRfUjEy X1JFR05VTSwgQU1ENjRfUjEzX1JFR05VTSwgQU1ENjRfUjE0X1JFR05VTSwg QU1ENjRfUjE1X1JFR05VTSwKKyAgQU1ENjRfUklQX1JFR05VTSwgQU1ENjRf RUZMQUdTX1JFR05VTSwgQU1ENjRfQ1NfUkVHTlVNLCBBTUQ2NF9TU19SRUdO VU0sCisgIEFNRDY0X0RTX1JFR05VTSwgQU1ENjRfRVNfUkVHTlVNLCBBTUQ2 NF9GU19SRUdOVU0sIEFNRDY0X0dTX1JFR05VTQorfTsKKwogdm9pZAogYW1k NjRfaW5pdF9hYmkgKHN0cnVjdCBnZGJhcmNoX2luZm8gaW5mbywgc3RydWN0 IGdkYmFyY2ggKmdkYmFyY2gpCiB7CkBAIC0yMDUxLDYgKzIwNjEsOCBAQCBh bWQ2NF9pbml0X2FiaSAoc3RydWN0IGdkYmFyY2hfaW5mbyBpbmZvCiAgIHNl dF9nZGJhcmNoX251bV9wc2V1ZG9fcmVncyAoZ2RiYXJjaCwgMCk7CiAgIHRk ZXAtPm1tMF9yZWdudW0gPSAtMTsKIAorICB0ZGVwLT5yZWNvcmRfcmVnbWFw ID0gYW1kNjRfcmVjb3JkX3JlZ21hcDsKKwogICBzZXRfZ2RiYXJjaF9kdW1t eV9pZCAoZ2RiYXJjaCwgYW1kNjRfZHVtbXlfaWQpOwogCiAgIGZyYW1lX3Vu d2luZF9hcHBlbmRfdW53aW5kZXIgKGdkYmFyY2gsICZhbWQ2NF9zaWd0cmFt cF9mcmFtZV91bndpbmQpOwotLS0gYS9pMzg2LXRkZXAuYworKysgYi9pMzg2 LXRkZXAuYwpAQCAtMjc2NCw2ICsyNzY0LDcgQEAgZW51bQogICBPVF9CWVRF ID0gMCwKICAgT1RfV09SRCwKICAgT1RfTE9ORywKKyAgT1RfUVVBRCwKIH07 CiAKIC8qIGkzODYgYXJpdGgvbG9naWMgb3BlcmF0aW9ucyAqLwpAQCAtMjc4 MSw2ICsyNzgyLDcgQEAgZW51bQogCiBzdHJ1Y3QgaTM4Nl9yZWNvcmRfcwog eworICBzdHJ1Y3QgZ2RiYXJjaCAqZ2RiYXJjaDsKICAgc3RydWN0IHJlZ2Nh Y2hlICpyZWdjYWNoZTsKICAgQ09SRV9BRERSIGFkZHI7CiAgIGludCBhZmxh ZzsKQEAgLTI3ODksNiArMjc5MSwxMSBAQCBzdHJ1Y3QgaTM4Nl9yZWNvcmRf cwogICB1aW50OF90IG1vZHJtOwogICB1aW50OF90IG1vZCwgcmVnLCBybTsK ICAgaW50IG90OworICB1aW50OF90IHJleF94OworICB1aW50OF90IHJleF9i OworICBpbnQgcmlwX29mZnNldDsKKyAgaW50IHBvcGxfZXNwX2hhY2s7Cisg IGNvbnN0IGludCAqcmVnbWFwOwogfTsKIAogLyogUGFyc2UgIm1vZHJtIiBw YXJ0IGluIGN1cnJlbnQgbWVtb3J5IGFkZHJlc3MgdGhhdCBpcnAtPmFkZHIg cG9pbnQgdG8KQEAgLTI3OTcsNyArMjgwNCw3IEBAIHN0cnVjdCBpMzg2X3Jl Y29yZF9zCiBzdGF0aWMgaW50CiBpMzg2X3JlY29yZF9tb2RybSAoc3RydWN0 IGkzODZfcmVjb3JkX3MgKmlycCkKIHsKLSAgc3RydWN0IGdkYmFyY2ggKmdk YmFyY2ggPSBnZXRfcmVnY2FjaGVfYXJjaCAoaXJwLT5yZWdjYWNoZSk7Cisg IHN0cnVjdCBnZGJhcmNoICpnZGJhcmNoID0gaXJwLT5nZGJhcmNoOwogCiAg IGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGlycC0+YWRkciwgJmlycC0+bW9k cm0sIDEpKQogICAgIHsKQEAgLTI4MjAsMTIgKzI4MjcsMTMgQEAgaTM4Nl9y ZWNvcmRfbW9kcm0gKHN0cnVjdCBpMzg2X3JlY29yZF9zIAogICAgUmV0dXJu IC0xIGlmIHNvbWV0aGluZyB3cm9uZy4gKi8KIAogc3RhdGljIGludAotaTM4 Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBpMzg2X3JlY29yZF9z ICppcnAsIHVpbnQzMl90ICogYWRkcikKK2kzODZfcmVjb3JkX2xlYV9tb2Ry bV9hZGRyIChzdHJ1Y3QgaTM4Nl9yZWNvcmRfcyAqaXJwLCB1aW50NjRfdCAq YWRkcikKIHsKLSAgc3RydWN0IGdkYmFyY2ggKmdkYmFyY2ggPSBnZXRfcmVn Y2FjaGVfYXJjaCAoaXJwLT5yZWdjYWNoZSk7CisgIHN0cnVjdCBnZGJhcmNo ICpnZGJhcmNoID0gaXJwLT5nZGJhcmNoOwogICB1aW50OF90IHRtcHU4Owot ICB1aW50MTZfdCB0bXB1MTY7Ci0gIHVpbnQzMl90IHRtcHUzMjsKKyAgaW50 MTZfdCB0bXBpMTY7CisgIGludDMyX3QgdG1waTMyOworICBVTE9OR0VTVCB0 bXB1bG9uZ2VzdDsKIAogICAqYWRkciA9IDA7CiAgIGlmIChpcnAtPmFmbGFn KQpAQCAtMjg0OSw5ICsyODU3LDEwIEBAIGkzODZfcmVjb3JkX2xlYV9tb2Ry bV9hZGRyIChzdHJ1Y3QgaTM4Nl8KIAkgICAgfQogCSAgaXJwLT5hZGRyKys7 CiAJICBzY2FsZSA9ICh0bXB1OCA+PiA2KSAmIDM7Ci0JICBpbmRleCA9ICgo dG1wdTggPj4gMykgJiA3KTsKKwkgIGluZGV4ID0gKCh0bXB1OCA+PiAzKSAm IDcpIHwgaXJwLT5yZXhfeDsKIAkgIGJhc2UgPSAodG1wdTggJiA3KTsKIAl9 CisgICAgICBiYXNlIHw9IGlycC0+cmV4X2I7CiAKICAgICAgIHN3aXRjaCAo aXJwLT5tb2QpCiAJewpAQCAtMjg1OSw3ICsyODY4LDcgQEAgaTM4Nl9yZWNv cmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBpMzg2XwogCSAgaWYgKChiYXNl ICYgNykgPT0gNSkKIAkgICAgewogCSAgICAgIGJhc2UgPSAweGZmOwotCSAg ICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGlycC0+YWRkciwgKGdkYl9i eXRlICopIGFkZHIsIDQpKQorCSAgICAgIGlmICh0YXJnZXRfcmVhZF9tZW1v cnkgKGlycC0+YWRkciwgKGdkYl9ieXRlICopJnRtcGkzMiwgNCkpCiAJCXsK IAkJICBpZiAocmVjb3JkX2RlYnVnKQogCQkgICAgcHJpbnRmX3VuZmlsdGVy ZWQgKF8oIlByb2Nlc3MgcmVjb3JkOiBlcnJvciByZWFkaW5nICIKQEAgLTI4 NjgsNiArMjg3Nyw5IEBAIGkzODZfcmVjb3JkX2xlYV9tb2RybV9hZGRyIChz dHJ1Y3QgaTM4Nl8KIAkJICByZXR1cm4gLTE7CiAJCX0KIAkgICAgICBpcnAt PmFkZHIgKz0gNDsKKwkgICAgICAqYWRkciA9IHRtcGkzMjsKKwkgICAgICBp ZiAoaXJwLT5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dICYmICFoYXZl c2liKQorCQkqYWRkciArPSBpcnAtPmFkZHIgKyBpcnAtPnJpcF9vZmZzZXQ7 CiAJICAgIH0KIAkgIGVsc2UKIAkgICAgewpAQCAtMjg4NCwxMCArMjg5Niwx MCBAQCBpMzg2X3JlY29yZF9sZWFfbW9kcm1fYWRkciAoc3RydWN0IGkzODZf CiAJICAgICAgcmV0dXJuIC0xOwogCSAgICB9CiAJICBpcnAtPmFkZHIrKzsK LQkgICphZGRyID0gKGludDhfdCkgdG1wdTg7CisJICAqYWRkciA9IChpbnQ4 X3QpdG1wdTg7CiAJICBicmVhazsKIAljYXNlIDI6Ci0JICBpZiAodGFyZ2V0 X3JlYWRfbWVtb3J5IChpcnAtPmFkZHIsIChnZGJfYnl0ZSAqKSBhZGRyLCA0 KSkKKwkgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkgKGlycC0+YWRkciwgKGdk Yl9ieXRlICopJnRtcGkzMiwgNCkpCiAJICAgIHsKIAkgICAgICBpZiAocmVj b3JkX2RlYnVnKQogCQlwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyBy ZWNvcmQ6IGVycm9yIHJlYWRpbmcgbWVtb3J5ICIKQEAgLTI4OTUsMjEgKzI5 MDcsMzQgQEAgaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBp Mzg2XwogCQkJCSAgIHBhZGRyZXNzIChnZGJhcmNoLCBpcnAtPmFkZHIpKTsK IAkgICAgICByZXR1cm4gLTE7CiAJICAgIH0KKwkgICphZGRyID0gdG1waTMy OwogCSAgaXJwLT5hZGRyICs9IDQ7CiAJICBicmVhazsKIAl9CiAKKyAgICAg IHRtcHVsb25nZXN0ID0gMDsKICAgICAgIGlmIChiYXNlICE9IDB4ZmYpCi0J ewotCSAgcmVnY2FjaGVfcmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIGJhc2Us IChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0JICAqYWRkciArPSB0bXB1MzI7 CisgICAgICAgIHsKKwkgIGlmIChiYXNlID09IDQgJiYgaXJwLT5wb3BsX2Vz cF9oYWNrKQorCSAgICAqYWRkciArPSBpcnAtPnBvcGxfZXNwX2hhY2s7CisJ ICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25lZCAoaXJwLT5yZWdjYWNoZSwg aXJwLT5yZWdtYXBbYmFzZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICZ0bXB1bG9uZ2VzdCk7CiAJfQorICAgICAgaWYgKGly cC0+YWZsYWcgPT0gMikKKyAgICAgICAgeworCSAgKmFkZHIgKz0gdG1wdWxv bmdlc3Q7CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgKmFkZHIg PSAodWludDMyX3QpKHRtcHVsb25nZXN0ICsgKmFkZHIpOwogCi0gICAgICAv KiBYWFg6IGluZGV4ID09IDQgaXMgYWx3YXlzIGludmFsaWQgKi8KICAgICAg IGlmIChoYXZlc2liICYmIChpbmRleCAhPSA0IHx8IHNjYWxlICE9IDApKQog CXsKLQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBpbmRl eCwgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUz MiA8PCBzY2FsZTsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChp cnAtPnJlZ2NhY2hlLCBpcnAtPnJlZ21hcFtpbmRleF0sCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXB1bG9uZ2VzdCk7CisJ ICBpZiAoaXJwLT5hZmxhZyA9PSAyKQorCSAgICAqYWRkciArPSB0bXB1bG9u Z2VzdCA8PCBzY2FsZTsKKwkgIGVsc2UKKwkgICAgKmFkZHIgPSAodWludDMy X3QpKCphZGRyICsgKHRtcHVsb25nZXN0IDw8IHNjYWxlKSk7CiAJfQogICAg IH0KICAgZWxzZQpAQCAtMjkyMSw3ICsyOTQ2LDcgQEAgaTM4Nl9yZWNvcmRf bGVhX21vZHJtX2FkZHIgKHN0cnVjdCBpMzg2XwogCSAgaWYgKGlycC0+cm0g PT0gNikKIAkgICAgewogCSAgICAgIGlmICh0YXJnZXRfcmVhZF9tZW1vcnkK LQkJICAoaXJwLT5hZGRyLCAoZ2RiX2J5dGUgKikgJiB0bXB1MTYsIDIpKQor CQkgIChpcnAtPmFkZHIsIChnZGJfYnl0ZSAqKSZ0bXBpMTYsIDIpKQogCQl7 CiAJCSAgaWYgKHJlY29yZF9kZWJ1ZykKIAkJICAgIHByaW50Zl91bmZpbHRl cmVkIChfKCJQcm9jZXNzIHJlY29yZDogZXJyb3IgcmVhZGluZyAiCkBAIC0y OTMwLDcgKzI5NTUsNyBAQCBpMzg2X3JlY29yZF9sZWFfbW9kcm1fYWRkciAo c3RydWN0IGkzODZfCiAJCSAgcmV0dXJuIC0xOwogCQl9CiAJICAgICAgaXJw LT5hZGRyICs9IDI7Ci0JICAgICAgKmFkZHIgPSAoaW50MTZfdCkgdG1wdTE2 OworCSAgICAgICphZGRyID0gdG1waTE2OwogCSAgICAgIGlycC0+cm0gPSAw OwogCSAgICAgIGdvdG8gbm9fcm07CiAJICAgIH0KQEAgLTI5NDksMTAgKzI5 NzQsMTAgQEAgaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKHN0cnVjdCBp Mzg2XwogCSAgICAgIHJldHVybiAtMTsKIAkgICAgfQogCSAgaXJwLT5hZGRy Kys7Ci0JICAqYWRkciA9IChpbnQ4X3QpIHRtcHU4OworCSAgKmFkZHIgPSAo aW50OF90KXRtcHU4OwogCSAgYnJlYWs7CiAJY2FzZSAyOgotCSAgaWYgKHRh cmdldF9yZWFkX21lbW9yeSAoaXJwLT5hZGRyLCAoZ2RiX2J5dGUgKikgJiB0 bXB1MTYsIDIpKQorCSAgaWYgKHRhcmdldF9yZWFkX21lbW9yeSAoaXJwLT5h ZGRyLCAoZ2RiX2J5dGUgKikgJiB0bXBpMTYsIDIpKQogCSAgICB7CiAJICAg ICAgaWYgKHJlY29yZF9kZWJ1ZykKIAkJcHJpbnRmX3VuZmlsdGVyZWQgKF8o IlByb2Nlc3MgcmVjb3JkOiBlcnJvciByZWFkaW5nIG1lbW9yeSAiCkBAIC0y OTYxLDYzICsyOTg2LDc1IEBAIGkzODZfcmVjb3JkX2xlYV9tb2RybV9hZGRy IChzdHJ1Y3QgaTM4Nl8KIAkgICAgICByZXR1cm4gLTE7CiAJICAgIH0KIAkg IGlycC0+YWRkciArPSAyOwotCSAgKmFkZHIgPSAoaW50MTZfdCkgdG1wdTE2 OworCSAgKmFkZHIgPSB0bXBpMTY7CiAJICBicmVhazsKIAl9CiAKICAgICAg IHN3aXRjaCAoaXJwLT5ybSkKIAl7CiAJY2FzZSAwOgotCSAgcmVnY2FjaGVf cmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRUJYX1JFR05VTSwKLQkJ CSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRt cHUzMjsKLQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBJ Mzg2X0VTSV9SRUdOVU0sCi0JCQkgICAgIChnZGJfYnl0ZSAqKSAmIHRtcHUz Mik7Ci0JICAqYWRkciArPSB0bXB1MzI7CisJICByZWdjYWNoZV9yYXdfcmVh ZF91bnNpZ25lZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBpcnAtPnJl Z21hcFtYODZfUkVDT1JEX1JFQlhfUkVHTlVNXSwKKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsKKwkgICph ZGRyID0gKHVpbnQzMl90KSgqYWRkciArIHRtcHVsb25nZXN0KTsKKwkgIHJl Z2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJ CSAgICAgIGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVTSV9SRUdOVU1dLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxv bmdlc3QpOworCSAgKmFkZHIgPSAodWludDMyX3QpKCphZGRyICsgdG1wdWxv bmdlc3QpOwogCSAgYnJlYWs7CiAJY2FzZSAxOgotCSAgcmVnY2FjaGVfcmF3 X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRUJYX1JFR05VTSwKLQkJCSAg ICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUz MjsKLQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBJMzg2 X0VESV9SRUdOVU0sCi0JCQkgICAgIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7 Ci0JICAqYWRkciArPSB0bXB1MzI7CisJICByZWdjYWNoZV9yYXdfcmVhZF91 bnNpZ25lZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBpcnAtPnJlZ21h cFtYODZfUkVDT1JEX1JFQlhfUkVHTlVNXSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsKKwkgICphZGRy ID0gKHVpbnQzMl90KSgqYWRkciArIHRtcHVsb25nZXN0KTsKKwkgIHJlZ2Nh Y2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAg ICAgIGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVESV9SRUdOVU1dLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdl c3QpOworCSAgKmFkZHIgPSAodWludDMyX3QpKCphZGRyICsgdG1wdWxvbmdl c3QpOwogCSAgYnJlYWs7CiAJY2FzZSAyOgotCSAgcmVnY2FjaGVfcmF3X3Jl YWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRUJQX1JFR05VTSwKLQkJCSAgICAg KGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUzMjsK LQkgIHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBJMzg2X0VT SV9SRUdOVU0sCi0JCQkgICAgIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0J ICAqYWRkciArPSB0bXB1MzI7CisJICByZWdjYWNoZV9yYXdfcmVhZF91bnNp Z25lZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBpcnAtPnJlZ21hcFtY ODZfUkVDT1JEX1JFQlBfUkVHTlVNXSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsKKwkgICphZGRyID0g KHVpbnQzMl90KSgqYWRkciArIHRtcHVsb25nZXN0KTsKKwkgIHJlZ2NhY2hl X3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAg IGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVTSV9SRUdOVU1dLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3Qp OworCSAgKmFkZHIgPSAodWludDMyX3QpKCphZGRyICsgdG1wdWxvbmdlc3Qp OwogCSAgYnJlYWs7CiAJY2FzZSAzOgotCSAgcmVnY2FjaGVfcmF3X3JlYWQg KGlycC0+cmVnY2FjaGUsIEkzODZfRUJQX1JFR05VTSwKLQkJCSAgICAgKGdk Yl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUzMjsKLQkg IHJlZ2NhY2hlX3Jhd19yZWFkIChpcnAtPnJlZ2NhY2hlLCBJMzg2X0VESV9S RUdOVU0sCi0JCQkgICAgIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0JICAq YWRkciArPSB0bXB1MzI7CisJICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25l ZCAoaXJwLT5yZWdjYWNoZSwKKwkJCQkgICAgICBpcnAtPnJlZ21hcFtYODZf UkVDT1JEX1JFQlBfUkVHTlVNXSwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJnRtcHVsb25nZXN0KTsKKwkgICphZGRyID0gKHVp bnQzMl90KSgqYWRkciArIHRtcHVsb25nZXN0KTsKKwkgIHJlZ2NhY2hlX3Jh d19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGly cC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVESV9SRUdOVU1dLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOwor CSAgKmFkZHIgPSAodWludDMyX3QpKCphZGRyICsgdG1wdWxvbmdlc3QpOwog CSAgYnJlYWs7CiAJY2FzZSA0OgotCSAgcmVnY2FjaGVfcmF3X3JlYWQgKGly cC0+cmVnY2FjaGUsIEkzODZfRVNJX1JFR05VTSwKLQkJCSAgICAgKGdkYl9i eXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUzMjsKKwkgIHJl Z2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJ CSAgICAgIGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVTSV9SRUdOVU1dLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxv bmdlc3QpOworCSAgKmFkZHIgPSAodWludDMyX3QpKCphZGRyICsgdG1wdWxv bmdlc3QpOwogCSAgYnJlYWs7CiAJY2FzZSA1OgotCSAgcmVnY2FjaGVfcmF3 X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRURJX1JFR05VTSwKLQkJCSAg ICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRyICs9IHRtcHUz MjsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2Nh Y2hlLAorCQkJCSAgICAgIGlycC0+cmVnbWFwW1g4Nl9SRUNPUkRfUkVESV9S RUdOVU1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAmdG1wdWxvbmdlc3QpOworCSAgKmFkZHIgPSAodWludDMyX3QpKCphZGRy ICsgdG1wdWxvbmdlc3QpOwogCSAgYnJlYWs7CiAJY2FzZSA2OgotCSAgcmVn Y2FjaGVfcmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZfRUJQX1JFR05V TSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICphZGRy ICs9IHRtcHUzMjsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vuc2lnbmVkIChp cnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGlycC0+cmVnbWFwW1g4Nl9SRUNP UkRfUkVCUF9SRUdOVU1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworCSAgKmFkZHIgPSAodWludDMy X3QpKCphZGRyICsgdG1wdWxvbmdlc3QpOwogCSAgYnJlYWs7CiAJY2FzZSA3 OgotCSAgcmVnY2FjaGVfcmF3X3JlYWQgKGlycC0+cmVnY2FjaGUsIEkzODZf RUJYX1JFR05VTSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsK LQkgICphZGRyICs9IHRtcHUzMjsKKwkgIHJlZ2NhY2hlX3Jhd19yZWFkX3Vu c2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJCSAgICAgIGlycC0+cmVnbWFw W1g4Nl9SRUNPUkRfUkVCWF9SRUdOVU1dLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworCSAgKmFkZHIg PSAodWludDMyX3QpKCphZGRyICsgdG1wdWxvbmdlc3QpOwogCSAgYnJlYWs7 CiAJfQogICAgICAgKmFkZHIgJj0gMHhmZmZmOwpAQCAtMzAzNCwxMCArMzA3 MSwxMCBAQCBub19ybToKIHN0YXRpYyBpbnQKIGkzODZfcmVjb3JkX2xlYV9t b2RybSAoc3RydWN0IGkzODZfcmVjb3JkX3MgKmlycCkKIHsKLSAgc3RydWN0 IGdkYmFyY2ggKmdkYmFyY2ggPSBnZXRfcmVnY2FjaGVfYXJjaCAoaXJwLT5y ZWdjYWNoZSk7Ci0gIHVpbnQzMl90IGFkZHI7CisgIHN0cnVjdCBnZGJhcmNo ICpnZGJhcmNoID0gaXJwLT5nZGJhcmNoOworICB1aW50NjRfdCBhZGRyOwog Ci0gIGlmIChpcnAtPm92ZXJyaWRlKQorICBpZiAoaXJwLT5vdmVycmlkZSA+ PSAwKQogICAgIHsKICAgICAgIGlmIChyZWNvcmRfZGVidWcpCiAJcHJpbnRm X3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkIGlnbm9yZXMgdGhlIG1l bW9yeSBjaGFuZ2UgIgpAQCAtMzA1NiwxMCArMzA5MywzNiBAQCBpMzg2X3Jl Y29yZF9sZWFfbW9kcm0gKHN0cnVjdCBpMzg2X3JlY29yCiAgIHJldHVybiAw OwogfQogCisvKiBSZWNvcmQgdGhlIHB1c2ggb3BlcmF0aW9uIHRvICJyZWNv cmRfYXJjaF9saXN0Ii4KKyAgIFJldHVybiAtMSBpZiBzb21ldGhpbmcgd3Jv bmcuICovCisKK3N0YXRpYyBpbnQKK2kzODZfcmVjb3JkX3B1c2ggKHN0cnVj dCBpMzg2X3JlY29yZF9zICppcnAsIGludCBzaXplKQoreworICBVTE9OR0VT VCB0bXB1bG9uZ2VzdDsKKworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpcnAtPnJlZ2NhY2hlLAorCQkJCWlycC0+cmVnbWFwW1g4Nl9SRUNP UkRfUkVTUF9SRUdOVU1dKSkKKyAgICByZXR1cm4gLTE7CisgIHJlZ2NhY2hl X3Jhd19yZWFkX3Vuc2lnbmVkIChpcnAtPnJlZ2NhY2hlLAorCQkJICAgICAg aXJwLT5yZWdtYXBbWDg2X1JFQ09SRF9SRVNQX1JFR05VTV0sCisJCQkgICAg ICAmdG1wdWxvbmdlc3QpOworICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf bWVtICgoQ09SRV9BRERSKXRtcHVsb25nZXN0IC0gc2l6ZSwgc2l6ZSkpCisg ICAgcmV0dXJuIC0xOworCisgIHJldHVybiAwOworfQorCiAvKiBQYXJzZSB0 aGUgY3VycmVudCBpbnN0cnVjdGlvbiBhbmQgcmVjb3JkIHRoZSB2YWx1ZXMg b2YgdGhlIHJlZ2lzdGVycyBhbmQKICAgIG1lbW9yeSB0aGF0IHdpbGwgYmUg Y2hhbmdlZCBpbiBjdXJyZW50IGluc3RydWN0aW9uIHRvICJyZWNvcmRfYXJj aF9saXN0Ii4KICAgIFJldHVybiAtMSBpZiBzb21ldGhpbmcgd3JvbmcuICov CiAKKyNkZWZpbmUgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcocmVn bnVtKSBcCisgICAgZG8geyBcCisgICAgICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgaXIucmVnbWFwWyhyZWdudW0p XSkpIFwKKyAgICAgICAgIHJldHVybiAtMTsgXAorICAgICAgIH0gd2hpbGUg KDApCisKIGludAogaTM4Nl9wcm9jZXNzX3JlY29yZCAoc3RydWN0IGdkYmFy Y2ggKmdkYmFyY2gsIHN0cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUsCiAJCSAg ICAgQ09SRV9BRERSIGFkZHIpCkBAIC0zMDY4LDE0ICszMTMxLDIxIEBAIGkz ODZfcHJvY2Vzc19yZWNvcmQgKHN0cnVjdCBnZGJhcmNoICpnZGIKICAgdWlu dDhfdCB0bXB1ODsKICAgdWludDE2X3QgdG1wdTE2OwogICB1aW50MzJfdCB0 bXB1MzI7CisgIFVMT05HRVNUIHRtcHVsb25nZXN0OwogICB1aW50MzJfdCBv cGNvZGU7CiAgIHN0cnVjdCBpMzg2X3JlY29yZF9zIGlyOworICBpbnQgcmV4 ID0gMDsKKyAgdWludDhfdCByZXhfdyA9IC0xOworICB1aW50OF90IHJleF9y ID0gMDsKIAogICBtZW1zZXQgKCZpciwgMCwgc2l6ZW9mIChzdHJ1Y3QgaTM4 Nl9yZWNvcmRfcykpOwogICBpci5yZWdjYWNoZSA9IHJlZ2NhY2hlOwogICBp ci5hZGRyID0gYWRkcjsKICAgaXIuYWZsYWcgPSAxOwogICBpci5kZmxhZyA9 IDE7CisgIGlyLm92ZXJyaWRlID0gLTE7CisgIGlyLnJlZ21hcCA9IGdkYmFy Y2hfdGRlcCAoZ2RiYXJjaCktPnJlY29yZF9yZWdtYXA7CisgIGlyLmdkYmFy Y2ggPSBnZGJhcmNoOwogCiAgIGlmIChyZWNvcmRfZGVidWcgPiAxKQogICAg IGZwcmludGZfdW5maWx0ZXJlZCAoZ2RiX3N0ZGxvZywgIlByb2Nlc3MgcmVj b3JkOiBpMzg2X3Byb2Nlc3NfcmVjb3JkICIKQEAgLTMxMDYsMjIgKzMxNzYs MjIgQEAgaTM4Nl9wcm9jZXNzX3JlY29yZCAoc3RydWN0IGdkYmFyY2ggKmdk YgogCSAgcHJlZml4ZXMgfD0gUFJFRklYX0xPQ0s7CiAJICBicmVhazsKIAlj YXNlIDB4MmU6Ci0JICBpci5vdmVycmlkZSA9IEkzODZfQ1NfUkVHTlVNOwor CSAgaXIub3ZlcnJpZGUgPSBYODZfUkVDT1JEX0NTX1JFR05VTTsKIAkgIGJy ZWFrOwogCWNhc2UgMHgzNjoKLQkgIGlyLm92ZXJyaWRlID0gSTM4Nl9TU19S RUdOVU07CisJICBpci5vdmVycmlkZSA9IFg4Nl9SRUNPUkRfU1NfUkVHTlVN OwogCSAgYnJlYWs7CiAJY2FzZSAweDNlOgotCSAgaXIub3ZlcnJpZGUgPSBJ Mzg2X0RTX1JFR05VTTsKKwkgIGlyLm92ZXJyaWRlID0gWDg2X1JFQ09SRF9E U19SRUdOVU07CiAJICBicmVhazsKIAljYXNlIDB4MjY6Ci0JICBpci5vdmVy cmlkZSA9IEkzODZfRVNfUkVHTlVNOworCSAgaXIub3ZlcnJpZGUgPSBYODZf UkVDT1JEX0VTX1JFR05VTTsKIAkgIGJyZWFrOwogCWNhc2UgMHg2NDoKLQkg IGlyLm92ZXJyaWRlID0gSTM4Nl9GU19SRUdOVU07CisJICBpci5vdmVycmlk ZSA9IFg4Nl9SRUNPUkRfRlNfUkVHTlVNOwogCSAgYnJlYWs7CiAJY2FzZSAw eDY1OgotCSAgaXIub3ZlcnJpZGUgPSBJMzg2X0dTX1JFR05VTTsKKwkgIGly Lm92ZXJyaWRlID0gWDg2X1JFQ09SRF9HU19SRUdOVU07CiAJICBicmVhazsK IAljYXNlIDB4NjY6CiAJICBwcmVmaXhlcyB8PSBQUkVGSVhfREFUQTsKQEAg LTMxMjksMTYgKzMxOTksNTEgQEAgaTM4Nl9wcm9jZXNzX3JlY29yZCAoc3Ry dWN0IGdkYmFyY2ggKmdkYgogCWNhc2UgMHg2NzoKIAkgIHByZWZpeGVzIHw9 IFBSRUZJWF9BRERSOwogCSAgYnJlYWs7CisgICAgICAgIGNhc2UgMHg0MDoK KyAgICAgICAgY2FzZSAweDQxOgorICAgICAgICBjYXNlIDB4NDI6CisgICAg ICAgIGNhc2UgMHg0MzoKKyAgICAgICAgY2FzZSAweDQ0OgorICAgICAgICBj YXNlIDB4NDU6CisgICAgICAgIGNhc2UgMHg0NjoKKyAgICAgICAgY2FzZSAw eDQ3OgorICAgICAgICBjYXNlIDB4NDg6CisgICAgICAgIGNhc2UgMHg0OToK KyAgICAgICAgY2FzZSAweDRhOgorICAgICAgICBjYXNlIDB4NGI6CisgICAg ICAgIGNhc2UgMHg0YzoKKyAgICAgICAgY2FzZSAweDRkOgorICAgICAgICBj YXNlIDB4NGU6CisgICAgICAgIGNhc2UgMHg0ZjoKKyAgICAgICAgICBpZiAo aXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAgICAg IHsKKyAgICAgICAgICAgICAgIC8qIFJFWCAqLworICAgICAgICAgICAgICAg cmV4ID0gMTsKKyAgICAgICAgICAgICAgIHJleF93ID0gKHRtcHU4ID4+IDMp ICYgMTsKKyAgICAgICAgICAgICAgIHJleF9yID0gKHRtcHU4ICYgMHg0KSA8 PCAxOworICAgICAgICAgICAgICAgaXIucmV4X3ggPSAodG1wdTggJiAweDIp IDw8IDI7CisgICAgICAgICAgICAgICBpci5yZXhfYiA9ICh0bXB1OCAmIDB4 MSkgPDwgMzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKIAlk ZWZhdWx0OgogCSAgZ290byBvdXRfcHJlZml4ZXM7CiAJICBicmVhazsKIAl9 CiAgICAgfQogb3V0X3ByZWZpeGVzOgotICBpZiAocHJlZml4ZXMgJiBQUkVG SVhfREFUQSkKLSAgICBpci5kZmxhZyBePSAxOworICBpZiAoaXIucmVnbWFw W1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSAmJiByZXhfdyA9PSAxKQorICAgIHsK KyAgICAgIGlyLmRmbGFnID0gMjsKKyAgICB9CisgIGVsc2UKKyAgICB7Cisg ICAgICBpZiAocHJlZml4ZXMgJiBQUkVGSVhfREFUQSkKKyAgICAgICAgaXIu ZGZsYWcgXj0gMTsKKyAgICB9CiAgIGlmIChwcmVmaXhlcyAmIFBSRUZJWF9B RERSKQogICAgIGlyLmFmbGFnIF49IDE7CisgIGVsc2UgaWYgKGlyLnJlZ21h cFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgaXIuYWZsYWcgPSAyOwog CiAgIC8qIG5vdyBjaGVjayBvcCBjb2RlICovCiAgIG9wY29kZSA9ICh1aW50 MzJfdCkgdG1wdTg7CkBAIC0zMjI4LDMwICszMzMzLDI4IEBAIHJlc3dpdGNo OgogCQl9CiAJICAgICAgZWxzZQogCQl7Ci0JCSAgaWYgKGlyLm90ID09IE9U X0JZVEUpCisgICAgICAgICAgICAgICAgICBpci5ybSB8PSBpci5yZXhfYjsK KwkJICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9S RUNPUkRfUjhfUkVHTlVNXSkKIAkJICAgIGlyLnJtICY9IDB4MzsKLQkJICBp ZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgaXIu cm0pKQotCQkgICAgcmV0dXJuIC0xOworCQkgIEkzODZfUkVDT1JEX0FSQ0hf TElTVF9BRERfUkVHIChpci5ybSk7CiAJCX0KIAkgICAgICBicmVhazsKIAkg ICAgICAvKiBPUCBHdiwgRXYgKi8KIAkgICAgY2FzZSAxOgogCSAgICAgIGlm IChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAkJcmV0dXJuIC0xOwotCSAg ICAgIGlmIChpci5vdCA9PSBPVF9CWVRFKQorICAgICAgICAgICAgICBpci5y ZWcgfD0gcmV4X3I7CisJICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUgJiYg IWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJCWlyLnJlZyAm PSAweDM7Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIGlyLnJlZykpCi0JCXJldHVybiAtMTsKKwkgICAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucmVnKTsKIAkgICAg ICBicmVhazsKIAkgICAgICAvKiBPUCBBLCBJdiAqLwogCSAgICBjYXNlIDI6 Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVn Y2FjaGUsIEkzODZfRUFYX1JFR05VTSkpCi0JCXJldHVybiAtMTsKKwkgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9S RUFYX1JFR05VTSk7CiAJICAgICAgYnJlYWs7CiAJICAgIH0KIAl9Ci0gICAg ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwg STM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2 X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1Nf UkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBHUlAxICovCkBA IC0zMjcxLDE3ICszMzc0LDE3IEBAIHJlc3dpdGNoOgogCiAJICBpZiAoaXIu bW9kICE9IDMpCiAJICAgIHsKKyAgICAgICAgICAgICAgaWYgKG9wY29kZSA9 PSAweDgzKQorICAgICAgICAgICAgICAgIGlyLnJpcF9vZmZzZXQgPSAxOwor ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaXIucmlwX29m ZnNldCA9IChpci5vdCA+IE9UX0xPTkcpID8gNCA6ICgxIDw8IGlyLm90KTsK IAkgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIpKQogCQly ZXR1cm4gLTE7CiAJICAgIH0KIAkgIGVsc2UKLQkgICAgewotCSAgICAgIGlm IChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5y bSkpCi0JCXJldHVybiAtMTsKLQkgICAgfQorCSAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoaXIucm0gfCBpci5yZXhfYik7CiAJfQotICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdT X1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogaW52ICovCkBA IC0zMzAyLDEwICszNDA1LDggQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDRk OgogICAgIGNhc2UgMHg0ZToKICAgICBjYXNlIDB4NGY6Ci0gICAgICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgb3Bjb2Rl ICYgNykpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xp c3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkp Ci0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKG9wY29kZSAmIDcpOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAg ICBicmVhazsKIAogICAgICAgLyogR1JQMyAqLwpAQCAtMzMxOCwyOCArMzQx OSwxNyBAQCByZXN3aXRjaDoKICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2Ry bSAoJmlyKSkKIAlyZXR1cm4gLTE7CiAKKyAgICAgIGlmIChpci5tb2QgIT0g MyAmJiBpci5yZWcgPT0gMCkKKyAgICAgICAgaXIucmlwX29mZnNldCA9IChp ci5vdCA+IE9UX0xPTkcpID8gNCA6ICgxIDw8IGlyLm90KTsKKwogICAgICAg c3dpdGNoIChpci5yZWcpCiAJewogCSAgLyogdGVzdCAqLwogCWNhc2UgMDoK LQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hl LCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCSAgICByZXR1cm4gLTE7CisJICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxB R1NfUkVHTlVNKTsKIAkgIGJyZWFrOwogCSAgLyogbm90ICovCiAJY2FzZSAy OgotCSAgaWYgKGlyLm1vZCAhPSAzKQotCSAgICB7Ci0JICAgICAgaWYgKGkz ODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKLQkJcmV0dXJuIC0xOwotCSAg ICB9Ci0JICBlbHNlCi0JICAgIHsKLQkgICAgICBpZiAoaXIub3QgPT0gT1Rf QllURSkKLQkJaXIucm0gJj0gMHgzOwotCSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5ybSkpCi0JCXJldHVy biAtMTsKLQkgICAgfQotCSAgYnJlYWs7CiAJICAvKiBuZWcgKi8KIAljYXNl IDM6CiAJICBpZiAoaXIubW9kICE9IDMpCkBAIC0zMzQ5LDEzICszNDM5LDE0 IEBAIHJlc3dpdGNoOgogCSAgICB9CiAJICBlbHNlCiAJICAgIHsKLQkgICAg ICBpZiAoaXIub3QgPT0gT1RfQllURSkKKyAgICAgICAgICAgICAgaXIucm0g fD0gaXIucmV4X2I7CisJICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUgJiYg IWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJCWlyLnJtICY9 IDB4MzsKLQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucm0pKQotCQlyZXR1cm4gLTE7CisJICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtKTsKIAkgICAgfQot CSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IEkzODZfRUZMQUdTX1JFR05VTSkpCi0JICAgIHJldHVybiAtMTsKKwkgIC8q IG5lZyAqLworCSAgaWYgKGlyLnJlZyA9PSAzKQorCSAgICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVN KTsKIAkgIGJyZWFrOwogCSAgLyogbXVsICovCiAJY2FzZSA0OgpAQCAtMzM2 NSwxNSArMzQ1NiwxMCBAQCByZXN3aXRjaDoKIAljYXNlIDY6CiAJICAvKiBp ZGl2ICovCiAJY2FzZSA3OgotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUFYX1JFR05VTSkpCi0JICAgIHJl dHVybiAtMTsKKwkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChY ODZfUkVDT1JEX1JFQVhfUkVHTlVNKTsKIAkgIGlmIChpci5vdCAhPSBPVF9C WVRFKQotCSAgICB7Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRURYX1JFR05VTSkpCi0JCXJldHVy biAtMTsKLQkgICAgfQotCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JICAgIHJl dHVybiAtMTsKKwkgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfUkVEWF9SRUdOVU0pOworCSAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAJ ICBicmVhazsKIAlkZWZhdWx0OgogCSAgaXIuYWRkciAtPSAyOwpAQCAtMzM4 NywxMCArMzQ3Myw2IEBAIHJlc3dpdGNoOgogICAgIGNhc2UgMHhmZToKICAg ICAgIC8qIEdSUDUgKi8KICAgICBjYXNlIDB4ZmY6Ci0gICAgICBpZiAoKG9w Y29kZSAmIDEpID09IDApCi0JaXIub3QgPSBPVF9CWVRFOwotICAgICAgZWxz ZQotCWlyLm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOwogICAgICAgaWYgKGkz ODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJldHVybiAtMTsKICAgICAgIGlm IChpci5yZWcgPj0gMiAmJiBvcGNvZGUgPT0gMHhmZSkKQEAgLTMzOTksMTMg KzM0ODEsMTYgQEAgcmVzd2l0Y2g6CiAJICBvcGNvZGUgPSBvcGNvZGUgPDwg OCB8IGlyLm1vZHJtOwogCSAgZ290byBub19zdXBwb3J0OwogCX0KLQogICAg ICAgc3dpdGNoIChpci5yZWcpCiAJewogCSAgLyogaW5jICovCiAJY2FzZSAw OgogCSAgLyogZGVjICovCiAJY2FzZSAxOgorICAgICAgICAgIGlmICgob3Bj b2RlICYgMSkgPT0gMCkKKwkgICAgaXIub3QgPSBPVF9CWVRFOworICAgICAg ICAgIGVsc2UKKwkgICAgaXIub3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7CiAJ ICBpZiAoaXIubW9kICE9IDMpCiAJICAgIHsKIAkgICAgICBpZiAoaTM4Nl9y ZWNvcmRfbGVhX21vZHJtICgmaXIpKQpAQCAtMzQxMyw0MiArMzQ5OCw0MCBA QCByZXN3aXRjaDoKIAkgICAgfQogCSAgZWxzZQogCSAgICB7Ci0JICAgICAg aWYgKGlyLm90ID09IE9UX0JZVEUpCisJICAgICAgaXIucm0gfD0gaXIucmV4 X2I7CisJICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUgJiYgIWlyLnJlZ21h cFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJCWlyLnJtICY9IDB4MzsKLQkg ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNo ZSwgaXIucm0pKQotCQlyZXR1cm4gLTE7CisJICAgICAgSTM4Nl9SRUNPUkRf QVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtKTsKIAkgICAgfQotCSAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZM QUdTX1JFR05VTSkpCi0JICAgIHJldHVybiAtMTsKKwkgIEkzODZfUkVDT1JE X0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0p OwogCSAgYnJlYWs7CiAJICAvKiBjYWxsICovCiAJY2FzZSAyOgotCSAgLyog cHVzaCAqLwotCWNhc2UgNjoKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCSAgICBy ZXR1cm4gLTE7Ci0JICByZWdjYWNoZV9yYXdfcmVhZCAoaXIucmVnY2FjaGUs IEkzODZfRVNQX1JFR05VTSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1w dTMyKTsKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0KLQkgICAg ICAoKENPUkVfQUREUikgdG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgMSkp LCAoMSA8PCAoaXIuZGZsYWcgKyAxKSkpKQorICAgICAgICAgIGlmIChpci5y ZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dICYmIGlyLmRmbGFnKQorICAg ICAgICAgICAgaXIuZGZsYWcgPSAyOworCSAgaWYgKGkzODZfcmVjb3JkX3B1 c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAxKSkpCiAJICAgIHJldHVybiAt MTsKKwkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVD T1JEX0VGTEFHU19SRUdOVU0pOwogCSAgYnJlYWs7CiAJICAvKiBsY2FsbCAq LwogCWNhc2UgMzoKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCSAgICByZXR1cm4g LTE7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdj YWNoZSwgSTM4Nl9DU19SRUdOVU0pKQotCSAgICByZXR1cm4gLTE7Ci0JICBy ZWdjYWNoZV9yYXdfcmVhZCAoaXIucmVnY2FjaGUsIEkzODZfRVNQX1JFR05V TSwKLQkJCSAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0KLQkgICAgICAoKENPUkVfQUREUikg dG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgMikpLCAoMSA8PCAoaXIuZGZs YWcgKyAyKSkpKQorCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfQ1NfUkVHTlVNKTsKKwkgIGlmIChpMzg2X3JlY29yZF9w dXNoICgmaXIsIDEgPDwgKGlyLmRmbGFnICsgMikpKQogCSAgICByZXR1cm4g LTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JF Q09SRF9FRkxBR1NfUkVHTlVNKTsKIAkgIGJyZWFrOwogCSAgLyogam1wICov CiAJY2FzZSA0OgogCSAgLyogbGptcCAqLwogCWNhc2UgNToKKwkgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19S RUdOVU0pOworCSAgYnJlYWs7CisJICAvKiBwdXNoICovCisJY2FzZSA2Ogor ICAgICAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1d ICYmIGlyLmRmbGFnKQorICAgICAgICAgICAgaXIuZGZsYWcgPSAyOworCSAg aWYgKGkzODZfcmVjb3JkX3B1c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAx KSkpCisJICAgIHJldHVybiAtMTsKIAkgIGJyZWFrOwogCWRlZmF1bHQ6CiAJ ICBpci5hZGRyIC09IDI7CkBAIC0zNDYzLDIyICszNTQ2LDE4IEBAIHJlc3dp dGNoOgogICAgIGNhc2UgMHg4NToKICAgICBjYXNlIDB4YTg6CiAgICAgY2Fz ZSAweGE5OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0x OworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9S RUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAg LyogQ1dERS9DQlcgKi8KICAgICBjYXNlIDB4OTg6Ci0gICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQVhf UkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7CiAgICAg ICBicmVhazsKIAogICAgICAgLyogQ0RRL0NXRCAqLwogICAgIGNhc2UgMHg5 OToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0VEWF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFQVhfUkVHTlVN KTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX1JFRFhfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAv KiBpbXVsICovCkBAIC0zNDg4LDEyICszNTY3LDE1IEBAIHJlc3dpdGNoOgog ICAgICAgaXIub3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7CiAgICAgICBpZiAo aTM4Nl9yZWNvcmRfbW9kcm0gKCZpcikpCiAJcmV0dXJuIC0xOwotICAgICAg aWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAgICBpZiAob3Bjb2RlID09IDB4 NjkpCisgICAgICAgIGlyLnJpcF9vZmZzZXQgPSAoaXIub3QgPiBPVF9MT05H KSA/IDQgOiAoMSA8PCBpci5vdCk7CisgICAgICBlbHNlIGlmIChvcGNvZGUg PT0gMHg2YikKKyAgICAgICAgaXIucmlwX29mZnNldCA9IDE7CisgICAgICBp ci5yZWcgfD0gcmV4X3I7CisgICAgICBpZiAoaXIub3QgPT0gT1RfQllURSAm JiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAlpci5yZWcg Jj0gMHgzOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIGlyLnJlZykpCi0JcmV0dXJuIC0xOwotICAgICAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZf RUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJlZyk7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVH TlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiB4YWRkICovCkBAIC0z NTA1LDI4ICszNTg3LDI1IEBAIHJlc3dpdGNoOgogCWlyLm90ID0gaXIuZGZs YWcgKyBPVF9XT1JEOwogICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgm aXIpKQogCXJldHVybiAtMTsKKyAgICAgIGlyLnJlZyB8PSByZXhfcjsKICAg ICAgIGlmIChpci5tb2QgPT0gMykKIAl7Ci0JICBpZiAoaXIub3QgPT0gT1Rf QllURSkKKwkgIGlmIChpci5vdCA9PSBPVF9CWVRFICYmICFpci5yZWdtYXBb WDg2X1JFQ09SRF9SOF9SRUdOVU1dKQogCSAgICBpci5yZWcgJj0gMHgzOwot CSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IGlyLnJlZykpCi0JICAgIHJldHVybiAtMTsKLQkgIGlmIChpci5vdCA9PSBP VF9CWVRFKQorCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGly LnJlZyk7CisJICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFw W1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAkgICAgaXIucm0gJj0gMHgzOwot CSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IGlyLnJtKSkKLQkgICAgcmV0dXJuIC0xOworCSAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKGlyLnJtKTsKIAl9CiAgICAgICBlbHNlCiAJewog CSAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKIAkgICAgcmV0 dXJuIC0xOwotCSAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisJICBpZiAoaXIu b3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVH TlVNXSkKIAkgICAgaXIucmVnICY9IDB4MzsKLQkgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5yZWcpKQotCSAgICBy ZXR1cm4gLTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAo aXIucmVnKTsKIAl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1 cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAo WDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAg ICAgICAvKiBjbXB4Y2hnICovCkBAIC0zNTQwLDIyICszNjE5LDE5IEBAIHJl c3dpdGNoOgogCXJldHVybiAtMTsKICAgICAgIGlmIChpci5tb2QgPT0gMykK IAl7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdj YWNoZSwgSTM4Nl9FQVhfUkVHTlVNKSkKLQkgICAgcmV0dXJuIC0xOwotCSAg aWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAgICAgICAgaXIucmVnIHw9IHJl eF9yOworCSAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9S RUNPUkRfUkVBWF9SRUdOVU0pOworCSAgaWYgKGlyLm90ID09IE9UX0JZVEUg JiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJICAgIGly LnJlZyAmPSAweDM7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVn IChpci5yZWdjYWNoZSwgaXIucmVnKSkKLQkgICAgcmV0dXJuIC0xOworCSAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJlZyk7CiAJfQog ICAgICAgZWxzZQogCXsKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9y ZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0pKQotCSAgICByZXR1 cm4gLTE7CisJICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9SRUFYX1JFR05VTSk7CiAJICBpZiAoaTM4Nl9yZWNvcmRfbGVh X21vZHJtICgmaXIpKQogCSAgICByZXR1cm4gLTE7CiAJfQotICAgICAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZf RUZMQUdTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05V TSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogY21weGNoZzhiICovCkBA IC0zNTY4LDE0ICszNjQ0LDExIEBAIHJlc3dpdGNoOgogCSAgb3Bjb2RlID0g b3Bjb2RlIDw8IDggfCBpci5tb2RybTsKIAkgIGdvdG8gbm9fc3VwcG9ydDsK IAl9Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgSTM4Nl9FQVhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAg ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwg STM4Nl9FRFhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05V TSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9SRURYX1JFR05VTSk7CiAgICAgICBpZiAoaTM4Nl9yZWNvcmRf bGVhX21vZHJtICgmaXIpKQogCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFH U19SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FS Q0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwog ICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHB1c2ggKi8KQEAgLTM1ODksNiAr MzY2MiwxMiBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4NTc6CiAgICAgY2Fz ZSAweDY4OgogICAgIGNhc2UgMHg2YToKKyAgICAgIGlmIChpci5yZWdtYXBb WDg2X1JFQ09SRF9SOF9SRUdOVU1dICYmIGlyLmRmbGFnKQorICAgICAgICBp ci5kZmxhZyA9IDI7CisgICAgICBpZiAoaTM4Nl9yZWNvcmRfcHVzaCAoJmly LCAxIDw8IChpci5kZmxhZyArIDEpKSkKKwlyZXR1cm4gLTE7CisgICAgICBi cmVhazsKKwogICAgICAgLyogcHVzaCBlcyAqLwogICAgIGNhc2UgMHgwNjoK ICAgICAgIC8qIHB1c2ggY3MgKi8KQEAgLTM1OTcsMTYgKzM2NzYsMzYgQEAg cmVzd2l0Y2g6CiAgICAgY2FzZSAweDE2OgogICAgICAgLyogcHVzaCBkcyAq LwogICAgIGNhc2UgMHgxZToKKyAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JF Q09SRF9SOF9SRUdOVU1dKQorICAgICAgICB7CisJICBpci5hZGRyIC09IDE7 CisJICBnb3RvIG5vX3N1cHBvcnQ7CisJfQorICAgICAgaWYgKGkzODZfcmVj b3JkX3B1c2ggKCZpciwgMSA8PCAoaXIuZGZsYWcgKyAxKSkpCisJcmV0dXJu IC0xOworICAgICAgYnJlYWs7CisKICAgICAgIC8qIHB1c2ggZnMgKi8KICAg ICBjYXNlIDB4MGZhMDoKICAgICAgIC8qIHB1c2ggZ3MgKi8KICAgICBjYXNl IDB4MGZhODoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQorICAgICAgaWYgKGly LnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAgIHsKKwkg IGlyLmFkZHIgLT0gMjsKKwkgIGdvdG8gbm9fc3VwcG9ydDsKKwl9CisgICAg ICBpZiAoaTM4Nl9yZWNvcmRfcHVzaCAoJmlyLCAxIDw8IChpci5kZmxhZyAr IDEpKSkKIAlyZXR1cm4gLTE7Ci0gICAgICByZWdjYWNoZV9yYXdfcmVhZCAo aXIucmVnY2FjaGUsIEkzODZfRVNQX1JFR05VTSwKLQkJCSAoZ2RiX2J5dGUg KikgJiB0bXB1MzIpOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X21lbQotCSAgKChDT1JFX0FERFIpIHRtcHUzMiAtICgxIDw8IChpci5kZmxh ZyArIDEpKSwgKDEgPDwgKGlyLmRmbGFnICsgMSkpKSkKKyAgICAgIGJyZWFr OworCisgICAgICAvKiBwdXNoYSAqLworICAgIGNhc2UgMHg2MDoKKyAgICAg IGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAg ICB7CisJICBpci5hZGRyIC09IDE7CisJICBnb3RvIG5vX3N1cHBvcnQ7CisJ fQorICAgICAgaWYgKGkzODZfcmVjb3JkX3B1c2ggKCZpciwgMSA8PCAoaXIu ZGZsYWcgKyA0KSkpCiAJcmV0dXJuIC0xOwogICAgICAgYnJlYWs7CiAKQEAg LTM2MTksMTEzICszNzE4LDEwMyBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4 NWQ6CiAgICAgY2FzZSAweDVlOgogICAgIGNhc2UgMHg1ZjoKLSAgICAgIGly Lm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOwotICAgICAgaWYgKHJlY29yZF9h cmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRVNQX1JFR05V TSkpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUp Ci0Jb3Bjb2RlICY9IDB4MzsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBvcGNvZGUgJiAweDcpKQotCXJldHVy biAtMTsKLSAgICAgIGJyZWFrOwotCi0gICAgICAvKiBwdXNoYSAqLwotICAg IGNhc2UgMHg2MDoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9y ZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAt MTsKLSAgICAgIHJlZ2NhY2hlX3Jhd19yZWFkIChpci5yZWdjYWNoZSwgSTM4 Nl9FU1BfUkVHTlVNLAotCQkJIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0g ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtCi0JICAoKENPUkVf QUREUikgdG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgNCkpLCAoMSA8PCAo aXIuZGZsYWcgKyA0KSkpKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU1BfUkVHTlVN KTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHICgob3Bj b2RlICYgMHg3KSB8IGlyLnJleF9iKTsKICAgICAgIGJyZWFrOwogCiAgICAg ICAvKiBwb3BhICovCiAgICAgY2FzZSAweDYxOgotICAgICAgZm9yICh0bXB1 OCA9IEkzODZfRUFYX1JFR05VTTsgdG1wdTggPD0gSTM4Nl9FRElfUkVHTlVN OyB0bXB1OCsrKQotCXsKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9y ZWcgKGlyLnJlZ2NhY2hlLCB0bXB1OCkpCi0JICAgIHJldHVybiAtMTsKKyAg ICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAg ICAgICB7CisJICBpci5hZGRyIC09IDE7CisJICBnb3RvIG5vX3N1cHBvcnQ7 CiAJfQorICAgICAgZm9yICh0bXB1OCA9IFg4Nl9SRUNPUkRfUkVBWF9SRUdO VU07IHRtcHU4IDw9IFg4Nl9SRUNPUkRfUkVESV9SRUdOVU07CisJICAgdG1w dTgrKykKKwlJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAodG1wdTgp OwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHBvcCAqLwogICAgIGNhc2Ug MHg4ZjoKLSAgICAgIGlyLm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOworICAg ICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisJaXIu b3QgPSBpci5kZmxhZyA/IE9UX1FVQUQgOiBPVF9XT1JEOworICAgICAgZWxz ZQorICAgICAgICBpci5vdCA9IGlyLmRmbGFnICsgT1RfV09SRDsKICAgICAg IGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7CiAg ICAgICBpZiAoaXIubW9kID09IDMpCi0JewotCSAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJtKSkKLQkgICAgcmV0 dXJuIC0xOwotCX0KKwlJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAo aXIucm0gfCBpci5yZXhfYik7CiAgICAgICBlbHNlCiAJewogCSAgaWYgKGkz ODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKIAkgICAgcmV0dXJuIC0xOwog CX0KLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAg IEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JF U1BfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBlbnRlciAq LwogICAgIGNhc2UgMHhjODoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0 X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJl dHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VCUF9SRUdOVU0pKQotCXJldHVybiAtMTsK LSAgICAgIHJlZ2NhY2hlX3Jhd19yZWFkIChpci5yZWdjYWNoZSwgSTM4Nl9F U1BfUkVHTlVNLAotCQkJIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0gICAg ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtCi0JICAoKENPUkVfQURE UikgdG1wdTMyIC0gKDEgPDwgKGlyLmRmbGFnICsgMSkpLCAoMSA8PCAoaXIu ZGZsYWcgKyAxKSkpKQorICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKFg4Nl9SRUNPUkRfUkVCUF9SRUdOVU0pOworICAgICAgaWYgKGly LnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0gJiYgaXIuZGZsYWcpCisg ICAgICAgIGlyLmRmbGFnID0gMjsKKyAgICAgIGlmIChpMzg2X3JlY29yZF9w dXNoICgmaXIsIDEgPDwgKGlyLmRmbGFnICsgMSkpKQogCXJldHVybiAtMTsK ICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBsZWF2ZSAqLwogICAgIGNhc2Ug MHhjOToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGly LnJlZ2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAg ICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hl LCBJMzg2X0VCUF9SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU1BfUkVH TlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChY ODZfUkVDT1JEX1JFQlBfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAg ICAvKiBwb3AgZXMgKi8KICAgICBjYXNlIDB4MDc6Ci0gICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FU1Bf UkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FU19SRUdOVU0pKQot CXJldHVybiAtMTsKKyAgICAgIGlmIChpci5yZWdtYXBbWDg2X1JFQ09SRF9S OF9SRUdOVU1dKQorICAgICAgICB7CisJICBpci5hZGRyIC09IDE7CisJICBn b3RvIG5vX3N1cHBvcnQ7CisJfQorICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTUF9SRUdOVU0pOworICAgICAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRVNf UkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH IChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgYnJlYWs7CiAK ICAgICAgIC8qIHBvcCBzcyAqLwogICAgIGNhc2UgMHgxNzoKLSAgICAgIGlm IChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2 X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X1NTX1JFR05V TSkpCi0JcmV0dXJuIC0xOworICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVD T1JEX1I4X1JFR05VTV0pCisgICAgICAgIHsKKwkgIGlyLmFkZHIgLT0gMTsK KwkgIGdvdG8gbm9fc3VwcG9ydDsKKwl9CisgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRVNQX1JFR05VTSk7Cisg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9TU19SRUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVh azsKIAogICAgICAgLyogcG9wIGRzICovCiAgICAgY2FzZSAweDFmOgotICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IEkzODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRFNf UkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBpZiAoaXIucmVnbWFwW1g4 Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAgeworCSAgaXIuYWRkciAt PSAxOworCSAgZ290byBub19zdXBwb3J0OworCX0KKyAgICAgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU1BfUkVHTlVN KTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX0RTX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJ U1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAg IGJyZWFrOwogCiAgICAgICAvKiBwb3AgZnMgKi8KICAgICBjYXNlIDB4MGZh MToKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0ZTX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTUF9SRUdOVU0p OworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9S RUNPUkRfRlNfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAg YnJlYWs7CiAKICAgICAgIC8qIHBvcCBncyAqLwogICAgIGNhc2UgMHgwZmE5 OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVn Y2FjaGUsIEkzODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkz ODZfR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRVNQX1JFR05VTSk7 CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JF Q09SRF9HU19SRUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNU X0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBi cmVhazsKIAogICAgICAgLyogbW92ICovCkBAIC0zNzQzLDE5ICszODMyLDIx IEBAIHJlc3dpdGNoOgogCiAgICAgICBpZiAoaXIubW9kICE9IDMpCiAJewor ICAgICAgICAgIGlmIChvcGNvZGUgPT0gMHhjNiB8fCBvcGNvZGUgPT0gMHhj NykKKwkgICAgaXIucmlwX29mZnNldCA9IChpci5vdCA+IE9UX0xPTkcpID8g NCA6ICgxIDw8IGlyLm90KTsKIAkgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9k cm0gKCZpcikpCiAJICAgIHJldHVybiAtMTsKIAl9CiAgICAgICBlbHNlCiAJ ewotCSAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAgICAgICAgaWYgKG9w Y29kZSA9PSAweGM2IHx8IG9wY29kZSA9PSAweGM3KQorCSAgICBpci5ybSB8 PSBpci5yZXhfYjsKKwkgIGlmIChpci5vdCA9PSBPVF9CWVRFICYmICFpci5y ZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQogCSAgICBpci5ybSAmPSAw eDM7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdj YWNoZSwgaXIucm0pKQotCSAgICByZXR1cm4gLTE7CisJICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucm0pOwogCX0KLSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VG TEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKICAgICAgIGJyZWFrOworCiAg ICAgICAvKiBtb3YgKi8KICAgICBjYXNlIDB4OGE6CiAgICAgY2FzZSAweDhi OgpAQCAtMzc2Myw0MCArMzg1NCw1NSBAQCByZXN3aXRjaDoKIAlpci5vdCA9 IE9UX0JZVEU7CiAgICAgICBlbHNlCiAJaXIub3QgPSBpci5kZmxhZyArIE9U X1dPUkQ7Ci0KICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkK IAlyZXR1cm4gLTE7Ci0KLSAgICAgIGlmIChpci5vdCA9PSBPVF9CWVRFKQor ICAgICAgaXIucmVnIHw9IHJleF9yOworICAgICAgaWYgKGlyLm90ID09IE9U X0JZVEUgJiYgIWlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJ aXIucmVnICY9IDB4MzsKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBpci5yZWcpKQotCXJldHVybiAtMTsKKyAg ICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5yZWcpOwor ICAgICAgYnJlYWs7CiAKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQorICAg ICAgLyogbW92IHNlZyAqLworICAgIGNhc2UgMHg4YzoKKyAgICAgIGlmIChp Mzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7CisgICAgICBp ZiAoaXIucmVnID4gNSkKKwl7CisJICBpci5hZGRyIC09IDI7CisJICBvcGNv ZGUgPSBvcGNvZGUgPDwgOCB8IGlyLm1vZHJtOworCSAgZ290byBub19zdXBw b3J0OworCX0KKworICAgICAgaWYgKGlyLm1vZCA9PSAzKQorCUkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSk7CisgICAgICBlbHNlCisJ eworCSAgaXIub3QgPSBPVF9XT1JEOworCSAgaWYgKGkzODZfcmVjb3JkX2xl YV9tb2RybSAoJmlyKSkKKwkgICAgcmV0dXJuIC0xOworCX0KICAgICAgIGJy ZWFrOwogCiAgICAgICAvKiBtb3Ygc2VnICovCiAgICAgY2FzZSAweDhlOgog ICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJldHVybiAt MTsKLQogICAgICAgc3dpdGNoIChpci5yZWcpCiAJewogCWNhc2UgMDoKLQkg IHRtcHU4ID0gSTM4Nl9FU19SRUdOVU07CisJICB0bXB1OCA9IFg4Nl9SRUNP UkRfRVNfUkVHTlVNOwogCSAgYnJlYWs7CiAJY2FzZSAyOgotCSAgdG1wdTgg PSBJMzg2X1NTX1JFR05VTTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9TU19S RUdOVU07CiAJICBicmVhazsKIAljYXNlIDM6Ci0JICB0bXB1OCA9IEkzODZf RFNfUkVHTlVNOworCSAgdG1wdTggPSBYODZfUkVDT1JEX0RTX1JFR05VTTsK IAkgIGJyZWFrOwogCWNhc2UgNDoKLQkgIHRtcHU4ID0gSTM4Nl9GU19SRUdO VU07CisJICB0bXB1OCA9IFg4Nl9SRUNPUkRfRlNfUkVHTlVNOwogCSAgYnJl YWs7CiAJY2FzZSA1OgotCSAgdG1wdTggPSBJMzg2X0dTX1JFR05VTTsKKwkg IHRtcHU4ID0gWDg2X1JFQ09SRF9HU19SRUdOVU07CiAJICBicmVhazsKIAlk ZWZhdWx0OgogCSAgaXIuYWRkciAtPSAyOwpAQCAtMzgwNCwzOCArMzkxMCw4 IEBAIHJlc3dpdGNoOgogCSAgZ290byBub19zdXBwb3J0OwogCSAgYnJlYWs7 CiAJfQotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIHRtcHU4KSkKLQlyZXR1cm4gLTE7Ci0KLSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VG TEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIGJyZWFrOwotCi0g ICAgICAvKiBtb3Ygc2VnICovCi0gICAgY2FzZSAweDhjOgotICAgICAgaWYg KGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQotCXJldHVybiAtMTsKLSAgICAg IGlmIChpci5yZWcgPiA1KQotCXsKLQkgIGlyLmFkZHIgLT0gMjsKLQkgIG9w Y29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07Ci0JICBnb3RvIG5vX3N1 cHBvcnQ7Ci0JfQotCi0gICAgICBpZiAoaXIubW9kID09IDMpCi0JewotCSAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGly LnJtKSkKLQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0J ICBpci5vdCA9IE9UX1dPUkQ7Ci0JICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21v ZHJtICgmaXIpKQotCSAgICByZXR1cm4gLTE7Ci0JfQotCi0gICAgICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9F RkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAodG1wdTgpOworICAgICAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05V TSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogbW92emJTICovCkBAIC0z ODQ4LDggKzM5MjQsNyBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4MGZiZjoK ICAgICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4g LTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgaXIucmVnKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucmVnIHwgcmV4X3IpOwogICAg ICAgYnJlYWs7CiAKICAgICAgIC8qIGxlYSAqLwpAQCAtMzg2MiwxMiArMzkz NywxMSBAQCByZXN3aXRjaDoKIAkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwg aXIubW9kcm07CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJfQotCiAgICAgICBp ci5vdCA9IGlyLmRmbGFnOwotICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUp CisgICAgICBpci5yZWcgfD0gcmV4X3I7CisgICAgICBpZiAoaXIub3QgPT0g T1RfQllURSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkK IAlpci5yZWcgJj0gMHgzOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJlZykpCi0JcmV0dXJuIC0xOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJlZyk7 CiAgICAgICBicmVhazsKIAogICAgICAgLyogbW92IEVBWCAqLwpAQCAtMzg3 NSw2MiArMzk0OSw3MSBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4YTE6CiAg ICAgICAvKiB4bGF0ICovCiAgICAgY2FzZSAweGQ3OgotICAgICAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUFY X1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVBWF9SRUdOVU0pOwogICAg ICAgYnJlYWs7CiAKICAgICAgIC8qIG1vdiBFQVggKi8KICAgICBjYXNlIDB4 YTI6CiAgICAgY2FzZSAweGEzOgotICAgICAgewotCXVpbnQzMl90IGFkZHI7 Ci0KLQlpZiAoaXIub3ZlcnJpZGUpCi0JICB7Ci0JICAgIGlmIChyZWNvcmRf ZGVidWcpCi0JICAgICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3Mg cmVjb3JkIGlnbm9yZXMgdGhlIG1lbW9yeSBjaGFuZ2UgIgotCQkJCSAgICJv ZiBpbnN0cnVjdGlvbiBhdCBhZGRyZXNzICVzIGJlY2F1c2UgIgotCQkJCSAg ICJpdCBjYW4ndCBnZXQgdGhlIHZhbHVlIG9mIHRoZSBzZWdtZW50ICIKLQkJ CQkgICAicmVnaXN0ZXIuXG4iKSwKLQkJCQkgcGFkZHJlc3MgKGdkYmFyY2gs IGlyLmFkZHIpKTsKLQkgIH0KLQllbHNlCi0JICB7Ci0JICAgIGlmICgob3Bj b2RlICYgMSkgPT0gMCkKLQkgICAgICBpci5vdCA9IE9UX0JZVEU7Ci0JICAg IGVsc2UKLQkgICAgICBpci5vdCA9IGlyLmRmbGFnICsgT1RfV09SRDsKLQkg ICAgaWYgKGlyLmFmbGFnKQotCSAgICAgIHsKLQkJaWYgKHRhcmdldF9yZWFk X21lbW9yeQotCQkgICAgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSAmIGFkZHIs IDQpKQotCQkgIHsKLQkJICAgIGlmIChyZWNvcmRfZGVidWcpCi0JCSAgICAg IHByaW50Zl91bmZpbHRlcmVkIChfKCJQcm9jZXNzIHJlY29yZDogZXJyb3Ig cmVhZGluZyAiCi0JCQkJCSAgICJtZW1vcnkgYXQgYWRkciAlcyBsZW4gPSA0 LlxuIiksCi0JCQkJCSBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIuYWRkcikpOwot CQkgICAgcmV0dXJuIC0xOwotCQkgIH0KLQkJaXIuYWRkciArPSA0OwotCSAg ICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJaWYgKHRhcmdldF9yZWFk X21lbW9yeQotCQkgICAgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSAmIHRtcHUx NiwgNCkpCi0JCSAgewotCQkgICAgaWYgKHJlY29yZF9kZWJ1ZykKLQkJICAg ICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkOiBlcnJv ciByZWFkaW5nICIKLQkJCQkJICAgIm1lbW9yeSBhdCBhZGRyICVzIGxlbiA9 IDQuXG4iKSwKLQkJCQkJIHBhZGRyZXNzIChnZGJhcmNoLCBpci5hZGRyKSk7 Ci0JCSAgICByZXR1cm4gLTE7Ci0JCSAgfQotCQlpci5hZGRyICs9IDI7Ci0J CWFkZHIgPSB0bXB1MTY7Ci0JICAgICAgfQotCSAgICBpZiAocmVjb3JkX2Fy Y2hfbGlzdF9hZGRfbWVtIChhZGRyLCAxIDw8IGlyLm90KSkKLQkgICAgICBy ZXR1cm4gLTE7Ci0JICB9Ci0gICAgICB9CisgICAgICBpZiAoaXIub3ZlcnJp ZGUgPj0gMCkKKyAgICAgICAgeworCSAgaWYgKHJlY29yZF9kZWJ1ZykKKwkg ICAgcHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkIGlnbm9y ZXMgdGhlIG1lbW9yeSBjaGFuZ2UgIgorCQkJCSAib2YgaW5zdHJ1Y3Rpb24g YXQgYWRkcmVzcyAweCVzIGJlY2F1c2UgIgorCQkJCSAiaXQgY2FuJ3QgZ2V0 IHRoZSB2YWx1ZSBvZiB0aGUgc2VnbWVudCAiCisJCQkJICJyZWdpc3Rlci5c biIpLAorCQkJICAgICAgIHBhZGRyZXNzIChnZGJhcmNoLCBpci5hZGRyKSk7 CisJfQorICAgICAgZWxzZQorCXsKKyAgICAgICAgICBpZiAoKG9wY29kZSAm IDEpID09IDApCisJICAgIGlyLm90ID0gT1RfQllURTsKKwkgIGVsc2UKKwkg ICAgaXIub3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7CisJICBpZiAoaXIuYWZs YWcgPT0gMikKKwkgICAgeworICAgICAgICAgICAgICBpZiAodGFyZ2V0X3Jl YWRfbWVtb3J5CisJCSAgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSZhZGRyLCA4 KSkKKwkJeworCSAgICAgICAgICBpZiAocmVjb3JkX2RlYnVnKQorCQkgICAg cHJpbnRmX3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkOiBlcnJvciBy ZWFkaW5nICIKKwkgICAgICAgICAgICAgICAgICAgIAkJICJtZW1vcnkgYXQg YWRkciAweCVzIGxlbiA9IDguXG4iKSwKKwkJCQkgICAgICAgcGFkZHJlc3Mg KGdkYmFyY2gsIGlyLmFkZHIpKTsKKwkJICByZXR1cm4gLTE7CisJCX0KKwkg ICAgICBpci5hZGRyICs9IDg7CisJICAgIH0KKyAgICAgICAgICBlbHNlIGlm IChpci5hZmxhZykKKwkgICAgeworICAgICAgICAgICAgICBpZiAodGFyZ2V0 X3JlYWRfbWVtb3J5CisJCSAgKGlyLmFkZHIsIChnZGJfYnl0ZSAqKSZ0bXB1 MzIsIDQpKQorCQl7CisJICAgICAgICAgIGlmIChyZWNvcmRfZGVidWcpCisJ CSAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQ6IGVy cm9yIHJlYWRpbmcgIgorCSAgICAgICAgICAgICAgICAgICAgCQkgIm1lbW9y eSBhdCBhZGRyIDB4JXMgbGVuID0gNC5cbiIpLAorCQkJCSAgICAgICBwYWRk cmVzcyAoZ2RiYXJjaCwgaXIuYWRkcikpOworCQkgIHJldHVybiAtMTsKKwkJ fQorCSAgICAgIGlyLmFkZHIgKz0gNDsKKyAgICAgICAgICAgICAgYWRkciA9 IHRtcHUzMjsKKwkgICAgfQorICAgICAgICAgIGVsc2UKKwkgICAgeworICAg ICAgICAgICAgICBpZiAodGFyZ2V0X3JlYWRfbWVtb3J5CisJCSAgKGlyLmFk ZHIsIChnZGJfYnl0ZSAqKSZ0bXB1MTYsIDIpKQorCQl7CisJICAgICAgICAg IGlmIChyZWNvcmRfZGVidWcpCisJCSAgICBwcmludGZfdW5maWx0ZXJlZCAo XygiUHJvY2VzcyByZWNvcmQ6IGVycm9yIHJlYWRpbmcgIgorCSAgICAgICAg ICAgICAgICAgICAgCQkgIm1lbW9yeSBhdCBhZGRyIDB4JXMgbGVuID0gMi5c biIpLAorCQkJCSAgICAgICBwYWRkcmVzcyAoZ2RiYXJjaCwgaXIuYWRkcikp OworCQkgIHJldHVybiAtMTsKKwkJfQorCSAgICAgIGlyLmFkZHIgKz0gMjsK KyAgICAgICAgICAgICAgYWRkciA9IHRtcHUxNjsKKwkgICAgfQorCSAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgMSA8PCBpci5vdCkp CisJICAgIHJldHVybiAtMTsKKyAgICAgICAgfQogICAgICAgYnJlYWs7CiAK ICAgICAgIC8qIG1vdiBSLCBJYiAqLwpAQCAtMzk0Miw4ICs0MDI1LDkgQEAg cmVzd2l0Y2g6CiAgICAgY2FzZSAweGI1OgogICAgIGNhc2UgMHhiNjoKICAg ICBjYXNlIDB4Yjc6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgKG9wY29kZSAmIDB4NykgJiAweDMpKQotCXJl dHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVH ICgoaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkgPworCQkJCSAg ICAgKChvcGNvZGUgJiAweDcpIHwgaXIucmV4X2IpIDoKKwkJCQkgICAgICgo b3Bjb2RlICYgMHg3KSAmIDB4MykpOwogICAgICAgYnJlYWs7CiAKICAgICAg IC8qIG1vdiBSLCBJdiAqLwpAQCAtMzk1NSw4ICs0MDM5LDcgQEAgcmVzd2l0 Y2g6CiAgICAgY2FzZSAweGJkOgogICAgIGNhc2UgMHhiZToKICAgICBjYXNl IDB4YmY6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgb3Bjb2RlICYgMHg3KSkKLQlyZXR1cm4gLTE7CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoKG9wY29kZSAmIDB4 NykgfCBpci5yZXhfYik7CiAgICAgICBicmVhazsKIAogICAgICAgLyogeGNo ZyBSLCBFQVggKi8KQEAgLTM5NjcsMTAgKzQwNTAsOCBAQCByZXN3aXRjaDoK ICAgICBjYXNlIDB4OTU6CiAgICAgY2FzZSAweDk2OgogICAgIGNhc2UgMHg5 NzoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBJMzg2X0VBWF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBv cGNvZGUgJiAweDcpKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JE X0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFQVhfUkVHTlVNKTsK KyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChvcGNvZGUg JiAweDcpOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHhjaGcgRXYsIEd2 ICovCkBAIC0zOTgwLDMzICs0MDYxLDM1IEBAIHJlc3dpdGNoOgogCWlyLm90 ID0gT1RfQllURTsKICAgICAgIGVsc2UKIAlpci5vdCA9IGlyLmRmbGFnICsg T1RfV09SRDsKLQogICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIp KQogCXJldHVybiAtMTsKLQogICAgICAgaWYgKGlyLm1vZCA9PSAzKQogCXsK LQkgIGlmIChpci5vdCA9PSBPVF9CWVRFKQorCSAgaXIucm0gIT0gaXIucmV4 X2I7CisJICBpZiAoaXIub3QgPT0gT1RfQllURSAmJiAhaXIucmVnbWFwW1g4 Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAkgICAgaXIucm0gJj0gMHgzOwotCSAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGly LnJtKSkKLQkgICAgcmV0dXJuIC0xOworCSAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKGlyLnJtKTsKIAl9CiAgICAgICBlbHNlCiAJewogCSAg aWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKIAkgICAgcmV0dXJu IC0xOwogCX0KLQotICAgICAgaWYgKGlyLm90ID09IE9UX0JZVEUpCisgICAg ICBpci5yZWcgfD0gcmV4X3I7CisgICAgICBpZiAoaXIub3QgPT0gT1RfQllU RSAmJiAhaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKIAlpci5y ZWcgJj0gMHgzOwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3Jl ZyAoaXIucmVnY2FjaGUsIGlyLnJlZykpCi0JcmV0dXJuIC0xOworICAgICAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJlZyk7CiAgICAg ICBicmVhazsKIAogICAgICAgLyogbGVzIEd2ICovCiAgICAgY2FzZSAweGM0 OgogICAgICAgLyogbGRzIEd2ICovCiAgICAgY2FzZSAweGM1OgorICAgICAg aWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAg IHsKKwkgIGlyLmFkZHIgLT0gMTsKKwkgIGdvdG8gbm9fc3VwcG9ydDsKKwl9 CiAgICAgICAvKiBsc3MgR3YgKi8KICAgICBjYXNlIDB4MGZiMjoKICAgICAg IC8qIGxmcyBHdiAqLwpAQCAtNDAyNCwzNSArNDEwNywzMiBAQCByZXN3aXRj aDoKIAkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIubW9kcm07CiAJICBn b3RvIG5vX3N1cHBvcnQ7CiAJfQotCiAgICAgICBzd2l0Y2ggKG9wY29kZSkK IAl7CiAJICAvKiBsZXMgR3YgKi8KIAljYXNlIDB4YzQ6Ci0JICB0bXB1OCA9 IEkzODZfRVNfUkVHTlVNOworCSAgdG1wdTggPSBYODZfUkVDT1JEX0VTX1JF R05VTTsKIAkgIGJyZWFrOwogCSAgLyogbGRzIEd2ICovCiAJY2FzZSAweGM1 OgotCSAgdG1wdTggPSBJMzg2X0RTX1JFR05VTTsKKwkgIHRtcHU4ID0gWDg2 X1JFQ09SRF9EU19SRUdOVU07CiAJICBicmVhazsKIAkgIC8qIGxzcyBHdiAq LwogCWNhc2UgMHgwZmIyOgotCSAgdG1wdTggPSBJMzg2X1NTX1JFR05VTTsK KwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9TU19SRUdOVU07CiAJICBicmVhazsK IAkgIC8qIGxmcyBHdiAqLwogCWNhc2UgMHgwZmI0OgotCSAgdG1wdTggPSBJ Mzg2X0ZTX1JFR05VTTsKKwkgIHRtcHU4ID0gWDg2X1JFQ09SRF9GU19SRUdO VU07CiAJICBicmVhazsKIAkgIC8qIGxncyBHdiAqLwogCWNhc2UgMHgwZmI1 OgotCSAgdG1wdTggPSBJMzg2X0dTX1JFR05VTTsKKwkgIHRtcHU4ID0gWDg2 X1JFQ09SRF9HU19SRUdOVU07CiAJICBicmVhazsKIAl9Ci0gICAgICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgdG1wdTgp KQotCXJldHVybiAtMTsKLQotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIGlyLnJlZykpCi0JcmV0dXJuIC0xOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKHRtcHU4KTsK KyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5yZWcg fCByZXhfcik7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JF RyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwog CiAgICAgICAvKiBzaGlmdHMgKi8KQEAgLTQwNjYsMTAgKzQxNDYsOCBAQCBy ZXN3aXRjaDoKIAlpci5vdCA9IE9UX0JZVEU7CiAgICAgICBlbHNlCiAJaXIu b3QgPSBpci5kZmxhZyArIE9UX1dPUkQ7Ci0KICAgICAgIGlmIChpMzg2X3Jl Y29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7Ci0KICAgICAgIGlmIChp ci5tb2QgIT0gMyAmJiAob3Bjb2RlID09IDB4ZDIgfHwgb3Bjb2RlID09IDB4 ZDMpKQogCXsKIAkgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9kcm0gKCZpcikp CkBAIC00MDc3LDE0ICs0MTU1LDEyIEBAIHJlc3dpdGNoOgogCX0KICAgICAg IGVsc2UKIAl7Ci0JICBpZiAoaXIub3QgPT0gT1RfQllURSkKKwkgIGlyLnJt IHw9IGlyLnJleF9iOworCSAgaWYgKGlyLm90ID09IE9UX0JZVEUgJiYgIWly LnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCiAJICAgIGlyLnJtICY9 IDB4MzsKLQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJl Z2NhY2hlLCBpci5ybSkpCi0JICAgIHJldHVybiAtMTsKKwkgIEkzODZfUkVD T1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSk7CiAJfQotCi0gICAgICBp ZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4 Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVH TlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDBmYTQ6CkBAIC00 MTIxLDkgKzQxOTcsOSBAQCByZXN3aXRjaDoKICAgICAgIGlmIChpci5tb2Qg IT0gMykKIAl7CiAJICAvKiBtZW1vcnkgKi8KLQkgIHVpbnQzMl90IGFkZHI7 CisJICB1aW50NjRfdCB0bXB1NjQ7CiAKLQkgIGlmIChpMzg2X3JlY29yZF9s ZWFfbW9kcm1fYWRkciAoJmlyLCAmYWRkcikpCisJICBpZiAoaTM4Nl9yZWNv cmRfbGVhX21vZHJtX2FkZHIgKCZpciwgJnRtcHU2NCkpCiAJICAgIHJldHVy biAtMTsKIAkgIHN3aXRjaCAoaXIucmVnKQogCSAgICB7CkBAIC00MTgzLDE2 ICs0MjU5LDE2IEBAIHJlc3dpdGNoOgogCQkgIHN3aXRjaCAoaXIucmVnID4+ IDQpCiAJCSAgICB7CiAJCSAgICBjYXNlIDA6Ci0JCSAgICAgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9tZW0gKGFkZHIsIDQpKQorCQkgICAgICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtICh0bXB1NjQsIDQpKQogCQkJcmV0 dXJuIC0xOwogCQkgICAgICBicmVhazsKIAkJICAgIGNhc2UgMjoKLQkJICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgOCkpCisJ CSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwg OCkpCiAJCQlyZXR1cm4gLTE7CiAJCSAgICAgIGJyZWFrOwogCQkgICAgY2Fz ZSAzOgogCQkgICAgZGVmYXVsdDoKLQkJICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX21lbSAoYWRkciwgMikpCisJCSAgICAgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgMikpCiAJCQlyZXR1cm4gLTE7 CiAJCSAgICAgIGJyZWFrOwogCQkgICAgfQpAQCAtNDIwMiwxNiArNDI3OCwx NiBAQCByZXN3aXRjaDoKIAkJICAgIHsKIAkJICAgIGNhc2UgMDoKIAkJICAg IGNhc2UgMToKLQkJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21l bSAoYWRkciwgNCkpCisJCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKHRtcHU2NCwgNCkpCiAJCQlyZXR1cm4gLTE7CiAJCSAgICAgIGJy ZWFrOwogCQkgICAgY2FzZSAyOgotCQkgICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfbWVtIChhZGRyLCA4KSkKKwkJICAgICAgaWYgKHJlY29yZF9h cmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCA4KSkKIAkJCXJldHVybiAtMTsK IAkJICAgICAgYnJlYWs7CiAJCSAgICBjYXNlIDM6CiAJCSAgICBkZWZhdWx0 OgotCQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRy LCAyKSkKKwkJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo dG1wdTY0LCAyKSkKIAkJCXJldHVybiAtMTsKIAkJICAgICAgYnJlYWs7CiAJ CSAgICB9CkBAIC00MjI4LDQzICs0MzA0LDQzIEBAIHJlc3dpdGNoOgogCSAg ICBjYXNlIDB4MGU6CiAJICAgICAgaWYgKGlyLmRmbGFnKQogCQl7Ci0JCSAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgMjgpKQorCQkg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgMjgpKQog CQkgICAgcmV0dXJuIC0xOwogCQl9CiAJICAgICAgZWxzZQogCQl7Ci0JCSAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRkciwgMTQpKQorCQkg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgMTQpKQog CQkgICAgcmV0dXJuIC0xOwogCQl9CiAJICAgICAgYnJlYWs7CiAJICAgIGNh c2UgMHgwZjoKIAkgICAgY2FzZSAweDJmOgotCSAgICAgIGlmIChyZWNvcmRf YXJjaF9saXN0X2FkZF9tZW0gKGFkZHIsIDIpKQorCSAgICAgIGlmIChyZWNv cmRfYXJjaF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgMikpCiAJCXJldHVybiAt MTsKIAkgICAgICBicmVhazsKIAkgICAgY2FzZSAweDFmOgogCSAgICBjYXNl IDB4M2U6Ci0JICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo YWRkciwgMTApKQorCSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9t ZW0gKHRtcHU2NCwgMTApKQogCQlyZXR1cm4gLTE7CiAJICAgICAgYnJlYWs7 CiAJICAgIGNhc2UgMHgyZToKIAkgICAgICBpZiAoaXIuZGZsYWcpCiAJCXsK LQkJICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyLCAyOCkp CisJCSAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCAy OCkpCiAJCSAgICByZXR1cm4gLTE7Ci0JCSAgYWRkciArPSAyODsKKwkJICB0 bXB1NjQgKz0gMjg7CiAJCX0KIAkgICAgICBlbHNlCiAJCXsKLQkJICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtIChhZGRyLCAxNCkpCisJCSAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCAxNCkpCiAJCSAg ICByZXR1cm4gLTE7Ci0JCSAgYWRkciArPSAxNDsKKwkJICB0bXB1NjQgKz0g MTQ7CiAJCX0KLQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVt IChhZGRyLCA4MCkpCisJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRk X21lbSAodG1wdTY0LCA4MCkpCiAJCXJldHVybiAtMTsKIAkgICAgICBicmVh azsKIAkgICAgY2FzZSAweDNmOgotCSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9tZW0gKGFkZHIsIDgpKQorCSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9tZW0gKHRtcHU2NCwgOCkpCiAJCXJldHVybiAtMTsKIAkg ICAgICBicmVhazsKIAkgICAgZGVmYXVsdDoKQEAgLTQyODYsMTIzICs0MzYy LDg4IEBAIHJlc3dpdGNoOgogICAgICAgLyogaW5zUyAqLwogICAgIGNhc2Ug MHg2YzoKICAgICBjYXNlIDB4NmQ6Ci0gICAgICB7Ci0JdWludDMyX3QgYWRk cjsKLQotCWlmICgob3Bjb2RlICYgMSkgPT0gMCkKLQkgIGlyLm90ID0gT1Rf QllURTsKLQllbHNlCi0JICBpci5vdCA9IGlyLmRmbGFnICsgT1RfV09SRDsK LQlpZiAob3Bjb2RlID09IDB4YTQgfHwgb3Bjb2RlID09IDB4YTUpCi0JICB7 Ci0JICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBJMzg2X0VTSV9SRUdOVU0pKQotCSAgICAgIHJldHVybiAtMTsKLQkg IH0KLQlpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNo ZSwgSTM4Nl9FRElfUkVHTlVNKSkKLQkgIHJldHVybiAtMTsKLQotCXJlZ2Nh Y2hlX3Jhd19yZWFkIChpci5yZWdjYWNoZSwgSTM4Nl9FRElfUkVHTlVNLAot CQkJICAgKGdkYl9ieXRlICopICYgYWRkcik7Ci0JaWYgKCFpci5hZmxhZykK LQkgIHsKLQkgICAgYWRkciAmPSAweGZmZmY7Ci0JICAgIC8qIGFkZHIgKz0g KCh1aW50MzJfdClyZWFkX3JlZ2lzdGVyIChJMzg2X0VTX1JFR05VTSkpIDw8 IDQ7ICovCi0JICAgIGlmIChyZWNvcmRfZGVidWcpCi0JICAgICAgcHJpbnRm X3VuZmlsdGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkIGlnbm9yZXMgdGhlIG1l bW9yeSBjaGFuZ2UgIgotCQkJCSAgICJvZiBpbnN0cnVjdGlvbiBhdCBhZGRy ZXNzICVzIGJlY2F1c2UgIgotCQkJCSAgICJpdCBjYW4ndCBnZXQgdGhlIHZh bHVlIG9mIHRoZSBzZWdtZW50ICIKLQkJCQkgICAicmVnaXN0ZXIuXG4iKSwK LQkJCQkgcGFkZHJlc3MgKGdkYmFyY2gsIGlyLmFkZHIpKTsKLQkgIH0KLQot CWlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8IFBSRUZJWF9SRVBOWikp Ci0JICB7Ci0JICAgIHVpbnQzMl90IGNvdW50OwotCi0JICAgIHJlZ2NhY2hl X3Jhd19yZWFkIChpci5yZWdjYWNoZSwgSTM4Nl9FQ1hfUkVHTlVNLAotCQkJ ICAgICAgIChnZGJfYnl0ZSAqKSAmIGNvdW50KTsKLQkgICAgaWYgKCFpci5h ZmxhZykKLQkgICAgICBjb3VudCAmPSAweGZmZmY7Ci0KLQkgICAgcmVnY2Fj aGVfcmF3X3JlYWQgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0s Ci0JCQkgICAgICAgKGdkYl9ieXRlICopICYgdG1wdTMyKTsKLQkgICAgaWYg KCh0bXB1MzIgPj4gMTApICYgMHgxKQotCSAgICAgIGFkZHIgLT0gKGNvdW50 IC0gMSkgKiAoMSA8PCBpci5vdCk7Ci0KLQkgICAgaWYgKGlyLmFmbGFnKQot CSAgICAgIHsKLQkJaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRk ciwgY291bnQgKiAoMSA8PCBpci5vdCkpKQotCQkgIHJldHVybiAtMTsKLQkg ICAgICB9CisgICAgICBpZiAoKG9wY29kZSAmIDEpID09IDApCisJaXIub3Qg PSBPVF9CWVRFOworICAgICAgZWxzZQorCWlyLm90ID0gaXIuZGZsYWcgKyBP VF9XT1JEOworICAgICAgcmVnY2FjaGVfcmF3X3JlYWRfdW5zaWduZWQgKGly LnJlZ2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IGlyLnJlZ21hcFtYODZfUkVDT1JEX1JFRElfUkVHTlVNXSwKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworICAg ICAgaWYgKCFpci5hZmxhZykKKyAgICAgICAgeworICAgICAgICAgIHRtcHVs b25nZXN0ICY9IDB4ZmZmZjsKKyAgICAgICAgICAvKiBhZGRyICs9ICgodWlu dDMyX3QpcmVhZF9yZWdpc3RlciAoSTM4Nl9FU19SRUdOVU0pKSA8PCA0OyAq LworICAgICAgICAgIGlmIChyZWNvcmRfZGVidWcpCisgICAgICAgICAgICBw cmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQgaWdub3JlcyB0 aGUgbWVtb3J5IGNoYW5nZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAib2YgaW5zdHJ1Y3Rpb24gYXQgYWRkcmVzcyAweCVzIGJlY2F1 c2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIml0IGNh bid0IGdldCB0aGUgdmFsdWUgb2YgdGhlIHNlZ21lbnQgIgorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgInJlZ2lzdGVyLlxuIiksCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFkZHJlc3MgKGdkYmFyY2gs IGlyLmFkZHIpKTsKKyAgICAgICAgfQorICAgICAgaWYgKHByZWZpeGVzICYg KFBSRUZJWF9SRVBaIHwgUFJFRklYX1JFUE5aKSkKKyAgICAgICAgeworICAg ICAgICAgIFVMT05HRVNUIGNvdW50LCBlZmxhZ3M7CisgICAgICAgICAgcmVn Y2FjaGVfcmF3X3JlYWRfdW5zaWduZWQgKGlyLnJlZ2NhY2hlLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpci5yZWdtYXBbWDg2 X1JFQ09SRF9SRURJX1JFR05VTV0sCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICZjb3VudCk7CisgICAgICAgICAgaWYgKCFpci5h ZmxhZykKKyAgICAgICAgICAgIGNvdW50ICY9IDB4ZmZmZjsKKyAgICAgICAg ICByZWdjYWNoZV9yYXdfcmVhZF91bnNpZ25lZCAoaXIucmVnY2FjaGUsCisg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlyLnJlZ21h cFtYODZfUkVDT1JEX0VGTEFHU19SRUdOVU1dLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAmZWZsYWdzKTsKKyAgICAgICAgICBp ZiAoKGVmbGFncyA+PiAxMCkgJiAweDEpCisgICAgICAgICAgICB0bXB1bG9u Z2VzdCAtPSAoY291bnQgLSAxKSAqICgxIDw8IGlyLm90KTsKKyAgICAgICAg ICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfbWVtICh0bXB1bG9uZ2VzdCwg Y291bnQgKiAoMSA8PCBpci5vdCkpKQorICAgICAgICAgICAgcmV0dXJuIC0x OworICAgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChY ODZfUkVDT1JEX1JFQ1hfUkVHTlVNKTsKKyAgICAgICAgfQorICAgICAgZWxz ZQorICAgICAgICB7CisgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX21lbSAodG1wdWxvbmdlc3QsIDEgPDwgaXIub3QpKQorICAgICAgICAg ICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBpZiAob3Bjb2RlID09 IDB4YTQgfHwgb3Bjb2RlID09IDB4YTUpCisgICAgICAgIEkzODZfUkVDT1JE X0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU0lfUkVHTlVNKTsK KyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVD T1JEX1JFRElfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOworICAgICAg YnJlYWs7CiAKLQkgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIEkzODZfRUNYX1JFR05VTSkpCi0JICAgICAgcmV0dXJu IC0xOwotCSAgfQotCWVsc2UKLQkgIHsKLQkgICAgaWYgKGlyLmFmbGFnKQot CSAgICAgIHsKLQkJaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAoYWRk ciwgMSA8PCBpci5vdCkpCi0JCSAgcmV0dXJuIC0xOwotCSAgICAgIH0KLQkg IH0KLSAgICAgIH0KKyAgICAgIC8qIGNtcHNTICovCisgICAgY2FzZSAweGE2 OgorICAgIGNhc2UgMHhhNzoKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX1JFRElfUkVHTlVNKTsKKyAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX1JFU0lf UkVHTlVNKTsKKyAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhfUkVQWiB8 IFBSRUZJWF9SRVBOWikpCisgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX1JFQ1hfUkVHTlVNKTsKKyAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFH U19SRUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGxvZHNTICov CiAgICAgY2FzZSAweGFjOgogICAgIGNhc2UgMHhhZDoKLSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VB WF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VTSV9SRUdOVU0p KQotCXJldHVybiAtMTsKLSAgICAgIGlmIChwcmVmaXhlcyAmIChQUkVGSVhf UkVQWiB8IFBSRUZJWF9SRVBOWikpCi0JewotCSAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUNYX1JFR05VTSkp Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBicmVhazsKLQotICAgICAg Lyogb3V0c1MgKi8KLSAgICBjYXNlIDB4NmU6Ci0gICAgY2FzZSAweDZmOgot ICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2Fj aGUsIEkzODZfRVNJX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVBWF9S RUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfUkVTSV9SRUdOVU0pOwogICAgICAgaWYgKHByZWZpeGVz ICYgKFBSRUZJWF9SRVBaIHwgUFJFRklYX1JFUE5aKSkKLQl7Ci0JICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9F Q1hfUkVHTlVNKSkKLQkgICAgcmV0dXJuIC0xOwotCX0KKyAgICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVDWF9S RUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsKIAog ICAgICAgLyogc2Nhc1MgKi8KICAgICBjYXNlIDB4YWU6CiAgICAgY2FzZSAw eGFmOgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIu cmVnY2FjaGUsIEkzODZfRURJX1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAg ICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRf UkVESV9SRUdOVU0pOwogICAgICAgaWYgKHByZWZpeGVzICYgKFBSRUZJWF9S RVBaIHwgUFJFRklYX1JFUE5aKSkKLQl7Ci0JICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQ1hfUkVHTlVNKSkK LQkgICAgcmV0dXJuIC0xOwotCX0KLSAgICAgIGlmIChyZWNvcmRfYXJjaF9s aXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0p KQotCXJldHVybiAtMTsKKyAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNU X0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVDWF9SRUdOVU0pOworICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdT X1JFR05VTSk7CiAgICAgICBicmVhazsKIAotICAgICAgLyogY21wc1MgKi8K LSAgICBjYXNlIDB4YTY6Ci0gICAgY2FzZSAweGE3OgotICAgICAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRURJ X1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRVNJX1JFR05VTSkp Ci0JcmV0dXJuIC0xOworICAgICAgLyogb3V0c1MgKi8KKyAgICBjYXNlIDB4 NmU6CisgICAgY2FzZSAweDZmOgorICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9M SVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTSV9SRUdOVU0pOwogICAgICAg aWYgKHByZWZpeGVzICYgKFBSRUZJWF9SRVBaIHwgUFJFRklYX1JFUE5aKSkK LQl7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdj YWNoZSwgSTM4Nl9FQ1hfUkVHTlVNKSkKLQkgICAgcmV0dXJuIC0xOwotCX0K LSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2Nh Y2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAtMTsKKyAgICAg ICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRf UkVDWF9SRUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVh azsKIAogICAgICAgLyogcG9ydCBJL08gKi8KQEAgLTQ0MTAsOCArNDQ1MSw4 IEBAIHJlc3dpdGNoOgogICAgIGNhc2UgMHhlNToKICAgICBjYXNlIDB4ZWM6 CiAgICAgY2FzZSAweGVkOgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUFYX1JFR05VTSkpCi0JcmV0 dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRUFYX1JFR05VTSk7 CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHhlNjoKQEAgLTQ0MjUsNDgg KzQ0NjYsMzIgQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweGMyOgogICAgICAg LyogcmV0ICovCiAgICAgY2FzZSAweGMzOgorICAgICAgSTM4Nl9SRUNPUkRf QVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVTUF9SRUdOVU0pOwor ICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNP UkRfRUZMQUdTX1JFR05VTSk7CisgICAgICBicmVhazsKKwogICAgICAgLyog bHJldCBpbSAqLwogICAgIGNhc2UgMHhjYToKICAgICAgIC8qIGxyZXQgKi8K ICAgICBjYXNlIDB4Y2I6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9h ZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNKSkKLQlyZXR1 cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgSTM4Nl9DU19SRUdOVU0pKQotCXJldHVybiAtMTsKLSAg ICAgIGJyZWFrOwotCiAgICAgICAvKiBpcmV0ICovCiAgICAgY2FzZSAweGNm OgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVn Y2FjaGUsIEkzODZfRVNQX1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkz ODZfQ1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1Nf UkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9DU19SRUdOVU0pOworICAgICAg STM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVT UF9SRUdOVU0pOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9S RUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05VTSk7CiAgICAgICBicmVhazsK IAogICAgICAgLyogY2FsbCBpbSAqLwogICAgIGNhc2UgMHhlODoKLSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJ Mzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIHJlZ2NhY2hl X3Jhd19yZWFkIChpci5yZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNLAotCQkJ IChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0gICAgICBpZiAocmVjb3JkX2Fy Y2hfbGlzdF9hZGRfbWVtCi0JICAoKENPUkVfQUREUikgdG1wdTMyIC0gKDEg PDwgKGlyLmRmbGFnICsgMSkpLCAoMSA8PCAoaXIuZGZsYWcgKyAxKSkpKQot CXJldHVybiAtMTsKKyAgICAgIGlmIChpMzg2X3JlY29yZF9wdXNoICgmaXIs IDEgPDwgKGlyLmRmbGFnICsgMSkpKQorICAgICAgICByZXR1cm4gLTE7CiAg ICAgICBicmVhazsKIAogICAgICAgLyogbGNhbGwgaW0gKi8KICAgICBjYXNl IDB4OWE6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgSTM4Nl9DU19SRUdOVU0pKQotCXJldHVybiAtMTsKLSAg ICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hl LCBJMzg2X0VTUF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIHJlZ2Nh Y2hlX3Jhd19yZWFkIChpci5yZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNLAot CQkJIChnZGJfYnl0ZSAqKSAmIHRtcHUzMik7Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfbWVtCi0JICAoKENPUkVfQUREUikgdG1wdTMyIC0g KDEgPDwgKGlyLmRmbGFnICsgMikpLCAoMSA8PCAoaXIuZGZsYWcgKyAyKSkp KQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9B RERfUkVHIChYODZfUkVDT1JEX0NTX1JFR05VTSk7CisgICAgICBpZiAoaTM4 Nl9yZWNvcmRfcHVzaCAoJmlyLCAxIDw8IChpci5kZmxhZyArIDEpKSkKKyAg ICAgICAgcmV0dXJuIC0xOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGpt cCBpbSAqLwpAQCAtNDUyOCwxNCArNDU1MywxMyBAQCByZXN3aXRjaDoKICAg ICBjYXNlIDB4MGY5ZDoKICAgICBjYXNlIDB4MGY5ZToKICAgICBjYXNlIDB4 MGY5ZjoKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChY ODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgaXIub3QgPSBPVF9C WVRFOwogICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJl dHVybiAtMTsKICAgICAgIGlmIChpci5tb2QgPT0gMykKLQl7Ci0JICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgaXIucm0g JiAweDMpKQotCSAgICByZXR1cm4gLTE7Ci0JfQorICAgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoaXIucmV4X2IgPyAoaXIucm0gfCBp ci5yZXhfYik6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIChpci5ybSAmIDB4MykpOwogICAgICAgZWxzZQog CXsKIAkgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9kcm0gKCZpcikpCkBAIC00 NTYyLDM0ICs0NTg2LDMzIEBAIHJlc3dpdGNoOgogICAgIGNhc2UgMHgwZjRm OgogICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQogCXJldHVy biAtMTsKKyAgICAgIGlyLnJlZyB8PSByZXhfcjsKICAgICAgIGlmIChpci5k ZmxhZyA9PSBPVF9CWVRFKQogCWlyLnJlZyAmPSAweDM7Ci0gICAgICBpZiAo cmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgaXIucmVn ICYgMHgzKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoaXIucmVnKTsKICAgICAgIGJyZWFrOwogCiAgICAg ICAvKiBmbGFncyAqLwogICAgICAgLyogcHVzaGYgKi8KICAgICBjYXNlIDB4 OWM6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgSTM4Nl9FU1BfUkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAg ICByZWdjYWNoZV9yYXdfcmVhZCAoaXIucmVnY2FjaGUsIEkzODZfRVNQX1JF R05VTSwKLQkJCSAoZ2RiX2J5dGUgKikgJiB0bXB1MzIpOwotICAgICAgaWYg KHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbQotCSAgKChDT1JFX0FERFIpIHRt cHUzMiAtICgxIDw8IChpci5kZmxhZyArIDEpKSwgKDEgPDwgKGlyLmRmbGFn ICsgMSkpKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKKyAg ICAgIGlmIChpMzg2X3JlY29yZF9wdXNoICgmaXIsIDEgPDwgKGlyLmRmbGFn ICsgMSkpKQorICAgICAgICByZXR1cm4gLTE7CiAgICAgICBicmVhazsKIAog ICAgICAgLyogcG9wZiAqLwogICAgIGNhc2UgMHg5ZDoKLSAgICAgIGlmIChy ZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VT UF9SRUdOVU0pKQotCXJldHVybiAtMTsKLSAgICAgIGlmIChyZWNvcmRfYXJj aF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdO VU0pKQotCXJldHVybiAtMTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElT VF9BRERfUkVHIChYODZfUkVDT1JEX1JFU1BfUkVHTlVNKTsKKyAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFH U19SRUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIHNhaGYgKi8K ICAgICBjYXNlIDB4OWU6CisgICAgICBpZiAoaXIucmVnbWFwW1g4Nl9SRUNP UkRfUjhfUkVHTlVNXSkKKyAgICAgICAgeworICAgICAgICAgIGlyLmFkZHIg LT0gMTsKKyAgICAgICAgICBnb3RvIG5vX3N1cHBvcnQ7CisgICAgICAgIH0K ICAgICAgIC8qIGNtYyAqLwogICAgIGNhc2UgMHhmNToKICAgICAgIC8qIGNs YyAqLwpAQCAtNDYwMCw2NiArNDYyMyw5NSBAQCByZXN3aXRjaDoKICAgICBj YXNlIDB4ZmM6CiAgICAgICAvKiBzdGQgKi8KICAgICBjYXNlIDB4ZmQ6Ci0g ICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNo ZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxB R1NfUkVHTlVNKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBsYWhmICov CiAgICAgY2FzZSAweDlmOgotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3Rf YWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUFYX1JFR05VTSkpCi0JcmV0 dXJuIC0xOworICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JF R05VTV0pCisgICAgICAgIHsKKyAgICAgICAgICBpci5hZGRyIC09IDE7Cisg ICAgICAgICAgZ290byBub19zdXBwb3J0OworICAgICAgICB9CisgICAgICBJ Mzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxB R1NfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX1JFQVhfUkVHTlVNKTsKICAgICAgIGJyZWFrOwog CiAgICAgICAvKiBiaXQgb3BlcmF0aW9ucyAqLwogICAgICAgLyogYnQvYnRz L2J0ci9idGMgR3YsIGltICovCiAgICAgY2FzZSAweDBmYmE6Ci0gICAgICAv KiBidHMgKi8KLSAgICBjYXNlIDB4MGZhYjoKLSAgICAgIC8qIGJ0ciAqLwot ICAgIGNhc2UgMHgwZmIzOgotICAgICAgLyogYnRjICovCi0gICAgY2FzZSAw eDBmYmI6CiAgICAgICBpci5vdCA9IGlyLmRmbGFnICsgT1RfV09SRDsKICAg ICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7 CiAgICAgICBpZiAoaXIucmVnIDwgNCkKIAl7Ci0JICBpci5hZGRyIC09IDM7 CisJICBpci5hZGRyIC09IDI7CiAJICBvcGNvZGUgPSBvcGNvZGUgPDwgOCB8 IGlyLm1vZHJtOwogCSAgZ290byBub19zdXBwb3J0OwogCX0KLSAgICAgIGly LnJlZyAtPSA0OwotICAgICAgaWYgKGlyLnJlZyAhPSAwKQorICAgICAgaWYg KGlyLnJlZyAhPSA0KQogCXsKLQkgIGlmIChpci5tb2QgIT0gMykKLQkgICAg ewotCSAgICAgIGlmIChpMzg2X3JlY29yZF9sZWFfbW9kcm0gKCZpcikpCi0J CXJldHVybiAtMTsKLQkgICAgfQorICAgICAgICAgIGlmIChpci5tb2QgPT0z KQorICAgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KGlyLnJtIHwgaXIucmV4X2IpOwogCSAgZWxzZQogCSAgICB7Ci0JICAgICAg aWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIGly LnJtKSkKKwkgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIp KQogCQlyZXR1cm4gLTE7CiAJICAgIH0KIAl9Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1Nf UkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICBJMzg2X1JFQ09SRF9BUkNI X0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAg ICAgIGJyZWFrOwogCiAgICAgICAvKiBidCBHdiwgRXYgKi8KICAgICBjYXNl IDB4MGZhMzoKLSAgICAgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcg KGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCXJldHVybiAt MTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZf UkVDT1JEX0VGTEFHU19SRUdOVU0pOworICAgICAgYnJlYWs7CisKKyAgICAg IC8qIGJ0cyAqLworICAgIGNhc2UgMHgwZmFiOgorICAgICAgLyogYnRyICov CisgICAgY2FzZSAweDBmYjM6CisgICAgICAvKiBidGMgKi8KKyAgICBjYXNl IDB4MGZiYjoKKyAgICAgIGlyLm90ID0gaXIuZGZsYWcgKyBPVF9XT1JEOwor ICAgICAgaWYgKGkzODZfcmVjb3JkX21vZHJtICgmaXIpKQorICAgICAgICBy ZXR1cm4gLTE7CisgICAgICBpZiAoaXIubW9kID09IDMpCisgICAgICAgIEkz ODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSB8IGlyLnJleF9i KTsKKyAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgIHVpbnQ2NF90 IHRtcHU2NDsKKyAgICAgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJt X2FkZHIgKCZpciwgJnRtcHU2NCkpCisgICAgICAgICAgICByZXR1cm4gLTE7 CisgICAgICAgICAgcmVnY2FjaGVfcmF3X3JlYWRfdW5zaWduZWQgKGlyLnJl Z2NhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBpci5yZWdtYXBbaXIucmVnIHwgcmV4X3JdLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAmdG1wdWxvbmdlc3QpOworICAgICAg ICAgIHN3aXRjaCAoaXIuZGZsYWcpCisgICAgICAgICAgICB7CisgICAgICAg ICAgICBjYXNlIDA6CisgICAgICAgICAgICAgIHRtcHU2NCArPSAoKGludDE2 X3QpdG1wdWxvbmdlc3QgPj4gNCk8PCA0OworICAgICAgICAgICAgICBicmVh azsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgdG1wdTY0 ICs9ICgoaW50MzJfdCl0bXB1bG9uZ2VzdCA+PiA1KTw8IDU7CisgICAgICAg ICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAg ICAgICB0bXB1NjQgKz0gKChpbnQ2NF90KXRtcHVsb25nZXN0ID4+IDYpPDwg NjsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAg ICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCAx IDw8IGlyLm90KSkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAg ICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIpKQorICAgICAgICAg ICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsK ICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBic2YgKi8KICAgICBjYXNlIDB4 MGZiYzoKICAgICAgIC8qIGJzciAqLwogICAgIGNhc2UgMHgwZmJkOgotICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUs IGlyLnJlZykpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05V TSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNU X0FERF9SRUcgKGlyLnJlZyB8IHJleF9yKTsKKyAgICAgIEkzODZfUkVDT1JE X0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0p OwogICAgICAgYnJlYWs7CiAKICAgICAgIC8qIGJjZCAqLwpAQCAtNDY3NSwx MCArNDcyNywxMyBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4ZDQ6CiAgICAg ICAvKiBhYWQgKi8KICAgICBjYXNlIDB4ZDU6Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQVhfUkVH TlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlz dF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1NfUkVHTlVNKSkK LQlyZXR1cm4gLTE7CisgICAgICBpZiAoaXIucmVnbWFwW1g4Nl9SRUNPUkRf UjhfUkVHTlVNXSkKKyAgICAgICAgeworICAgICAgICAgIGlyLmFkZHIgLT0g MTsKKyAgICAgICAgICBnb3RvIG5vX3N1cHBvcnQ7CisgICAgICAgIH0KKyAg ICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JE X1JFQVhfUkVHTlVNKTsKKyAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9B RERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogICAgICAgYnJl YWs7CiAKICAgICAgIC8qIG1pc2MgKi8KQEAgLTQ3NzAsMTYgKzQ4MjUsMTgg QEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDBmY2Q6CiAgICAgY2FzZSAweDBm Y2U6CiAgICAgY2FzZSAweDBmY2Y6Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgb3Bjb2RlICYgNykpCi0JcmV0 dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KChvcGNvZGUgJiA3KSB8IGlyLnJleF9iKTsKICAgICAgIGJyZWFrOwogCiAg ICAgICAvKiBzYWxjICovCiAgICAgY2FzZSAweGQ2OgotICAgICAgaWYgKHJl Y29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUFY X1JFR05VTSkpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdTX1JFR05V TSkpCi0JcmV0dXJuIC0xOworICAgICAgaWYgKGlyLnJlZ21hcFtYODZfUkVD T1JEX1I4X1JFR05VTV0pCisgICAgICAgIHsKKyAgICAgICAgICBpci5hZGRy IC09IDE7CisgICAgICAgICAgZ290byBub19zdXBwb3J0OworICAgICAgICB9 CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JF Q09SRF9SRUFYX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJ U1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAg IGJyZWFrOwogCiAgICAgICAvKiBsb29wbnogKi8KQEAgLTQ3OTAsOCArNDg0 Nyw4IEBAIHJlc3dpdGNoOgogICAgIGNhc2UgMHhlMjoKICAgICAgIC8qIGpl Y3h6ICovCiAgICAgY2FzZSAweGUzOgotICAgICAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUNYX1JFR05VTSkp Ci0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FE RF9SRUcgKFg4Nl9SRUNPUkRfUkVDWF9SRUdOVU0pOworICAgICAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JF R05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAgLyogd3Jtc3IgKi8KQEAg LTQ4MjIsNiArNDg3OSwxMSBAQCByZXN3aXRjaDoKICAgICBjYXNlIDB4MGYz NDoKICAgICAgIHsKIAlpbnQgcmV0OworICAgICAgICBpZiAoaXIucmVnbWFw W1g4Nl9SRUNPUkRfUjhfUkVHTlVNXSkKKyAgICAgICAgICB7CisgICAgICAg ICAgICBpci5hZGRyIC09IDI7CisgICAgICAgICAgICBnb3RvIG5vX3N1cHBv cnQ7CisgICAgICAgICAgfQogCWlmIChnZGJhcmNoX3RkZXAgKGdkYmFyY2gp LT5pMzg2X3N5c2VudGVyX3JlY29yZCA9PSBOVUxMKQogCSAgewogCSAgICBw cmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQgZG9lc24ndCBz dXBwb3J0ICIKQEAgLTQ4NDMsMTYgKzQ5MDUsMzcgQEAgcmVzd2l0Y2g6CiAg ICAgICBnb3RvIG5vX3N1cHBvcnQ7CiAgICAgICBicmVhazsKIAorICAgICAg Lyogc3lzY2FsbCAqLworICAgIGNhc2UgMHgwZjA1OgorICAgICAgeworCWlu dCByZXQ7CisJaWYgKGdkYmFyY2hfdGRlcCAoZ2RiYXJjaCktPmkzODZfc3lz Y2FsbF9yZWNvcmQgPT0gTlVMTCkKKwkgIHsKKwkgICAgcHJpbnRmX3VuZmls dGVyZWQgKF8oIlByb2Nlc3MgcmVjb3JkIGRvZXNuJ3Qgc3VwcG9ydCAiCisJ CQkJICJpbnN0cnVjdGlvbiBzeXNjYWxsLlxuIikpOworCSAgICBpci5hZGRy IC09IDI7CisJICAgIGdvdG8gbm9fc3VwcG9ydDsKKwkgIH0KKwlyZXQgPSBn ZGJhcmNoX3RkZXAgKGdkYmFyY2gpLT5pMzg2X3N5c2NhbGxfcmVjb3JkIChp ci5yZWdjYWNoZSk7CisJaWYgKHJldCkKKwkgIHJldHVybiByZXQ7CisgICAg ICB9CisgICAgICBicmVhazsKKworICAgICAgLyogc3lzcmV0ICovCisgICAg Y2FzZSAweDBmMDc6CisgICAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJv Y2VzcyByZWNvcmQgZG9lc24ndCBzdXBwb3J0ICIKKyAgICAgICAgICAiaW5z dHJ1Y3Rpb24gc3lzcmV0LlxuIikpOworICAgICAgaXIuYWRkciAtPSAyOwor ICAgICAgZ290byBub19zdXBwb3J0OworICAgICAgYnJlYWs7CisKICAgICAg IC8qIGNwdWlkICovCiAgICAgY2FzZSAweDBmYTI6Ci0gICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQVhf UkVHTlVNKSkKLQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hf bGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FQ1hfUkVHTlVNKSkK LQlyZXR1cm4gLTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRFhfUkVHTlVNKSkKLQlyZXR1cm4g LTE7Ci0gICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5y ZWdjYWNoZSwgSTM4Nl9FQlhfUkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAg ICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9S RUFYX1JFR05VTSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQURE X1JFRyAoWDg2X1JFQ09SRF9SRUNYX1JFR05VTSk7CisgICAgICBJMzg2X1JF Q09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9SRURYX1JFR05V TSk7CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2 X1JFQ09SRF9SRUJYX1JFR05VTSk7CiAgICAgICBicmVhazsKIAogICAgICAg LyogaGx0ICovCkBAIC00ODczLDEwICs0OTU2LDcgQEAgcmVzd2l0Y2g6CiAJ ICAvKiBzdHIgKi8KIAljYXNlIDE6CiAJICBpZiAoaXIubW9kID09IDMpCi0J ICAgIHsKLQkgICAgICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfcmVnIChp ci5yZWdjYWNoZSwgaXIucm0pKQotCQlyZXR1cm4gLTE7Ci0JICAgIH0KKyAg ICAgICAgICAgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5y bSB8IGlyLnJleF9iKTsKIAkgIGVsc2UKIAkgICAgewogCSAgICAgIGlyLm90 ID0gT1RfV09SRDsKQEAgLTQ4OTMsOCArNDk3Myw3IEBAIHJlc3dpdGNoOgog CWNhc2UgNDoKIAkgIC8qIHZlcncgKi8KIAljYXNlIDU6Ci0JICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxB R1NfUkVHTlVNKSkKLQkgICAgcmV0dXJuIC0xOworICAgICAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19S RUdOVU0pOwogCSAgYnJlYWs7CiAJZGVmYXVsdDoKIAkgIGlyLmFkZHIgLT0g MzsKQEAgLTQ5MTIsNyArNDk5MSw3IEBAIHJlc3dpdGNoOgogCSAgLyogc2dk dCAqLwogCWNhc2UgMDoKIAkgIHsKLQkgICAgdWludDMyX3QgYWRkcjsKKwkg ICAgdWludDY0X3QgdG1wdTY0OwogCiAJICAgIGlmIChpci5tb2QgPT0gMykK IAkgICAgICB7CkBAIC00OTIwLDggKzQ5OTksNyBAQCByZXN3aXRjaDoKIAkJ b3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKIAkJZ290byBub19z dXBwb3J0OwogCSAgICAgIH0KLQotCSAgICBpZiAoaXIub3ZlcnJpZGUpCisJ ICAgIGlmIChpci5vdmVycmlkZSA+PSAwKQogCSAgICAgIHsKIAkJaWYgKHJl Y29yZF9kZWJ1ZykKIAkJICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2Vz cyByZWNvcmQgaWdub3JlcyB0aGUgbWVtb3J5ICIKQEAgLTQ5MzMsMTMgKzUw MTEsMjEgQEAgcmVzd2l0Y2g6CiAJICAgICAgfQogCSAgICBlbHNlCiAJICAg ICAgewotCQlpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtX2FkZHIgKCZpciwg JmFkZHIpKQotCQkgIHJldHVybiAtMTsKLQkJaWYgKHJlY29yZF9hcmNoX2xp c3RfYWRkX21lbSAoYWRkciwgMikpCisJCWlmIChpMzg2X3JlY29yZF9sZWFf bW9kcm1fYWRkciAoJmlyLCAmdG1wdTY0KSkKIAkJICByZXR1cm4gLTE7Ci0J CWFkZHIgKz0gMjsKLQkJaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo YWRkciwgNCkpCisJCWlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKHRt cHU2NCwgMikpCiAJCSAgcmV0dXJuIC0xOworCQl0bXB1NjQgKz0gMjsKKyAg ICAgICAgICAgICAgICBpZiAoaXIucmVnbWFwW1g4Nl9SRUNPUkRfUjhfUkVH TlVNXSkKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAg ICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAodG1wdTY0LCA4KSkK KwkJICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgfQorICAg ICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgIHsKKyAgICAg ICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo dG1wdTY0LCA0KSkKKwkJICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAg ICAgICAgfQogCSAgICAgIH0KIAkgIH0KIAkgIGJyZWFrOwpAQCAtNDk1Myw4 ICs1MDM5LDcgQEAgcmVzd2l0Y2g6CiAJCSAgYnJlYWs7CiAJCSAgLyogbXdh aXQgKi8KIAkJY2FzZSAxOgotCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9yZWcgKGlyLnJlZ2NhY2hlLCBJMzg2X0VGTEFHU19SRUdOVU0pKQotCQkg ICAgcmV0dXJuIC0xOworCQkgIEkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERf UkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogCQkgIGJyZWFrOwog CQlkZWZhdWx0OgogCQkgIGlyLmFkZHIgLT0gMzsKQEAgLTQ5NjYsNyArNTA1 MSw3IEBAIHJlc3dpdGNoOgogCSAgZWxzZQogCSAgICB7CiAJICAgICAgLyog c2lkdCAqLwotCSAgICAgIGlmIChpci5vdmVycmlkZSkKKwkgICAgICBpZiAo aXIub3ZlcnJpZGUgPj0gMCkKIAkJewogCQkgIGlmIChyZWNvcmRfZGVidWcp CiAJCSAgICBwcmludGZfdW5maWx0ZXJlZCAoXygiUHJvY2VzcyByZWNvcmQg aWdub3JlcyB0aGUgbWVtb3J5ICIKQEAgLTQ5NzgsMTUgKzUwNjMsMjMgQEAg cmVzd2l0Y2g6CiAJCX0KIAkgICAgICBlbHNlCiAJCXsKLQkJICB1aW50MzJf dCBhZGRyOworCQkgIHVpbnQ2NF90IHRtcHU2NDsKIAotCQkgIGlmIChpMzg2 X3JlY29yZF9sZWFfbW9kcm1fYWRkciAoJmlyLCAmYWRkcikpCisJCSAgaWYg KGkzODZfcmVjb3JkX2xlYV9tb2RybV9hZGRyICgmaXIsICZ0bXB1NjQpKQog CQkgICAgcmV0dXJuIC0xOwotCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKGFkZHIsIDIpKQorCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2Fk ZF9tZW0gKHRtcHU2NCwgMikpCiAJCSAgICByZXR1cm4gLTE7CiAJCSAgYWRk ciArPSAyOwotCQkgIGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9tZW0gKGFk ZHIsIDQpKQotCQkgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAg aWYgKGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisgICAgICAg ICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAocmVj b3JkX2FyY2hfbGlzdF9hZGRfbWVtICh0bXB1NjQsIDgpKQorCQkgICAgICAg IHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAg ICAgICAgICAgICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX21lbSAo dG1wdTY0LCA0KSkKKwkJICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAg ICAgICAgICAgIH0KIAkJfQogCSAgICB9CiAJICBicmVhazsKQEAgLTQ5OTQs OSArNTA4Nyw2IEBAIHJlc3dpdGNoOgogCWNhc2UgMjoKIAkgIC8qIGxpZHQg Ki8KIAljYXNlIDM6Ci0JICAvKiBpbnZscGcgKi8KLQljYXNlIDc6Ci0JZGVm YXVsdDoKIAkgIGlmIChpci5tb2QgPT0gMykKIAkgICAgewogCSAgICAgIGly LmFkZHIgLT0gMzsKQEAgLTUwMDgsNyArNTA5OCw3IEBAIHJlc3dpdGNoOgog CWNhc2UgNDoKIAkgIGlmIChpci5tb2QgPT0gMykKIAkgICAgewotCSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBp ci5ybSkpCisJICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAo aXIucmVnY2FjaGUsIGlyLnJtIHwgaXIucmV4X2IpKQogCQlyZXR1cm4gLTE7 CiAJICAgIH0KIAkgIGVsc2UKQEAgLTUwMTcsOSArNTEwNywzMiBAQCByZXN3 aXRjaDoKIAkgICAgICBpZiAoaTM4Nl9yZWNvcmRfbGVhX21vZHJtICgmaXIp KQogCQlyZXR1cm4gLTE7CiAJICAgIH0KKwkgIEkzODZfUkVDT1JEX0FSQ0hf TElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19SRUdOVU0pOwogCSAg YnJlYWs7CiAJICAvKiBsbXN3ICovCiAJY2FzZSA2OgorCSAgSTM4Nl9SRUNP UkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JFR05V TSk7CisJICBicmVhazsKKwkgIC8qIGludmxwZyAqLworCWNhc2UgNzoKKwkg IGlmIChpci5tb2QgPT0gMykKKwkgICAgeworCSAgICAgIGlmIChpci5ybSA9 PSAwICYmIGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0pCisJICAg ICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09S RF9HU19SRUdOVU0pOworCSAgICAgIGVsc2UKKwkgICAgICAgIHsKKwkgICAg ICAgICAgaXIuYWRkciAtPSAzOworCSAgICAgICAgICBvcGNvZGUgPSBvcGNv ZGUgPDwgOCB8IGlyLm1vZHJtOworCSAgICAgICAgICBnb3RvIG5vX3N1cHBv cnQ7CisJICAgICAgICB9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfRUZMQUdTX1JF R05VTSk7CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgaXIuYWRkciAtPSAz OworCSAgb3Bjb2RlID0gb3Bjb2RlIDw8IDggfCBpci5tb2RybTsKKwkgIGdv dG8gbm9fc3VwcG9ydDsKIAkgIGJyZWFrOwogCX0KICAgICAgIGJyZWFrOwpA QCAtNTAzMiwyMSArNTE0NSwyMSBAQCByZXN3aXRjaDoKIAogICAgICAgLyog YXJwbCAqLwogICAgIGNhc2UgMHg2MzoKLSAgICAgIGlyLm90ID0gaXIuZGZs YWcgPyBPVF9MT05HIDogT1RfV09SRDsKICAgICAgIGlmIChpMzg2X3JlY29y ZF9tb2RybSAoJmlyKSkKIAlyZXR1cm4gLTE7Ci0gICAgICBpZiAoaXIubW9k ICE9IDMpCi0JewotCSAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmly KSkKLQkgICAgcmV0dXJuIC0xOwotCX0KKyAgICAgIGlmIChpci5tb2QgPT0g MyB8fCBpci5yZWdtYXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAg ICB7CisgICAgICAgICAgSTM4Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcg KGlyLnJlZ21hcFtYODZfUkVDT1JEX1I4X1JFR05VTV0/CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlyLnJlZyB8IHJl eF9yKSA6IGlyLnJtKTsKKyAgICAgICAgfQogICAgICAgZWxzZQotCXsKLQkg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBp ci5ybSkpCi0JICAgIHJldHVybiAtMTsKLQl9Ci0gICAgICBpZiAocmVjb3Jk X2FyY2hfbGlzdF9hZGRfcmVnIChpci5yZWdjYWNoZSwgSTM4Nl9FRkxBR1Nf UkVHTlVNKSkKLQlyZXR1cm4gLTE7CisgICAgICAgIHsKKyAgICAgICAgICBp ci5vdCA9IGlyLmRmbGFnID8gT1RfTE9ORyA6IE9UX1dPUkQ7CisgICAgICAg ICAgaWYgKGkzODZfcmVjb3JkX2xlYV9tb2RybSAoJmlyKSkKKyAgICAgICAg ICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgaWYgKCFpci5yZWdt YXBbWDg2X1JFQ09SRF9SOF9SRUdOVU1dKQorICAgICAgICBJMzg2X1JFQ09S RF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVN KTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBsYXIgKi8KQEAgLTUwNTUs MTMgKzUxNjgsMTkgQEAgcmVzd2l0Y2g6CiAgICAgY2FzZSAweDBmMDM6CiAg ICAgICBpZiAoaTM4Nl9yZWNvcmRfbW9kcm0gKCZpcikpCiAJcmV0dXJuIC0x OwotICAgICAgaWYgKHJlY29yZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVn Y2FjaGUsIGlyLnJlZykpCi0JcmV0dXJuIC0xOwotICAgICAgaWYgKHJlY29y ZF9hcmNoX2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUZMQUdT X1JFR05VTSkpCi0JcmV0dXJuIC0xOworICAgICAgSTM4Nl9SRUNPUkRfQVJD SF9MSVNUX0FERF9SRUcgKGlyLnJlZyB8IHJleF9yKTsKKyAgICAgIEkzODZf UkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChYODZfUkVDT1JEX0VGTEFHU19S RUdOVU0pOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIDB4MGYxODoKKyAg ICAgIGlmIChpMzg2X3JlY29yZF9tb2RybSAoJmlyKSkKKwlyZXR1cm4gLTE7 CisgICAgICBpZiAoaXIubW9kID09IDMgJiYgaXIucmVnID09IDMpCisgICAg ICAgIHsKKwkgIGlyLmFkZHIgLT0gMzsKKwkgIG9wY29kZSA9IG9wY29kZSA8 PCA4IHwgaXIubW9kcm07CisJICBnb3RvIG5vX3N1cHBvcnQ7CisJfQogICAg ICAgYnJlYWs7CiAKICAgICAgIC8qIG5vcCAobXVsdGkgYnl0ZSkgKi8KQEAg LTUwODIsNyArNTIwMSw3IEBAIHJlc3dpdGNoOgogCXJldHVybiAtMTsKICAg ICAgIGlmICgoaXIubW9kcm0gJiAweGMwKSAhPSAweGMwKQogCXsKLQkgIGly LmFkZHIgLT0gMjsKKwkgIGlyLmFkZHIgLT0gMzsKIAkgIG9wY29kZSA9IG9w Y29kZSA8PCA4IHwgaXIubW9kcm07CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJ fQpAQCAtNTA5NCwxNiArNTIxMywxMiBAQCByZXN3aXRjaDoKIAljYXNlIDQ6 CiAJY2FzZSA4OgogCSAgaWYgKG9wY29kZSAmIDIpCi0JICAgIHsKLQkgICAg fQorCSAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1RfQUREX1JFRyAoWDg2X1JF Q09SRF9FRkxBR1NfUkVHTlVNKTsKIAkgIGVsc2UKLQkgICAgewotCSAgICAg IGlmIChyZWNvcmRfYXJjaF9saXN0X2FkZF9yZWcgKGlyLnJlZ2NhY2hlLCBp ci5ybSkpCi0JCXJldHVybiAtMTsKLQkgICAgfQorICAgICAgICAgICAgSTM4 Nl9SRUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKGlyLnJtIHwgaXIucmV4X2Ip OwogCSAgYnJlYWs7CiAJZGVmYXVsdDoKLQkgIGlyLmFkZHIgLT0gMjsKKwkg IGlyLmFkZHIgLT0gMzsKIAkgIG9wY29kZSA9IG9wY29kZSA8PCA4IHwgaXIu bW9kcm07CiAJICBnb3RvIG5vX3N1cHBvcnQ7CiAJICBicmVhazsKQEAgLTUx MTksMjIgKzUyMzQsMTkgQEAgcmVzd2l0Y2g6CiAgICAgICBpZiAoKGlyLm1v ZHJtICYgMHhjMCkgIT0gMHhjMCB8fCBpci5yZWcgPT0gNAogCSAgfHwgaXIu cmVnID09IDUgfHwgaXIucmVnID49IDgpCiAJewotCSAgaXIuYWRkciAtPSAy OworCSAgaXIuYWRkciAtPSAzOwogCSAgb3Bjb2RlID0gb3Bjb2RlIDw8IDgg fCBpci5tb2RybTsKIAkgIGdvdG8gbm9fc3VwcG9ydDsKIAl9CiAgICAgICBp ZiAob3Bjb2RlICYgMikKLQl7Ci0JfQorICAgICAgICBJMzg2X1JFQ09SRF9B UkNIX0xJU1RfQUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsK ICAgICAgIGVsc2UKLQl7Ci0JICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRf cmVnIChpci5yZWdjYWNoZSwgaXIucm0pKQotCSAgICByZXR1cm4gLTE7Ci0J fQorCUkzODZfUkVDT1JEX0FSQ0hfTElTVF9BRERfUkVHIChpci5ybSB8IGly LnJleF9iKTsKICAgICAgIGJyZWFrOwogCiAgICAgICAvKiBjbHRzICovCiAg ICAgY2FzZSAweDBmMDY6CisgICAgICBJMzg2X1JFQ09SRF9BUkNIX0xJU1Rf QUREX1JFRyAoWDg2X1JFQ09SRF9FRkxBR1NfUkVHTlVNKTsKICAgICAgIGJy ZWFrOwogCiAgICAgICAvKiBNTVgvU1NFL1NTRTIvUE5JIHN1cHBvcnQgKi8K QEAgLTUxNDksOSArNTI2MSw4IEBAIHJlc3dpdGNoOgogICAgICAgYnJlYWs7 CiAgICAgfQogCi0vKiBJbiB0aGUgZnV0dXJlLCBNYXliZSBzdGlsbCBuZWVk IHRvIGRlYWwgd2l0aCBuZWVkX2Rhc20gKi8KLSAgaWYgKHJlY29yZF9hcmNo X2xpc3RfYWRkX3JlZyAoaXIucmVnY2FjaGUsIEkzODZfRUlQX1JFR05VTSkp Ci0gICAgcmV0dXJuIC0xOworICAvKiBJbiB0aGUgZnV0dXJlLCBNYXliZSBz dGlsbCBuZWVkIHRvIGRlYWwgd2l0aCBuZWVkX2Rhc20gKi8KKyAgSTM4Nl9S RUNPUkRfQVJDSF9MSVNUX0FERF9SRUcgKFg4Nl9SRUNPUkRfUkVJUF9SRUdO VU0pOwogICBpZiAocmVjb3JkX2FyY2hfbGlzdF9hZGRfZW5kICgpKQogICAg IHJldHVybiAtMTsKIApAQCAtNTE2NCw2ICs1Mjc1LDE1IEBAIG5vX3N1cHBv cnQ6CiAgIHJldHVybiAtMTsKIH0KIAorc3RhdGljIGNvbnN0IGludCBpMzg2 X3JlY29yZF9yZWdtYXBbXSA9Cit7CisgIEkzODZfRUFYX1JFR05VTSwgSTM4 Nl9FQ1hfUkVHTlVNLCBJMzg2X0VEWF9SRUdOVU0sIEkzODZfRUJYX1JFR05V TSwKKyAgSTM4Nl9FU1BfUkVHTlVNLCBJMzg2X0VCUF9SRUdOVU0sIEkzODZf RVNJX1JFR05VTSwgSTM4Nl9FRElfUkVHTlVNLAorICAwLCAwLCAwLCAwLCAw LCAwLCAwLCAwLAorICBJMzg2X0VJUF9SRUdOVU0sIEkzODZfRUZMQUdTX1JF R05VTSwgSTM4Nl9DU19SRUdOVU0sIEkzODZfU1NfUkVHTlVNLAorICBJMzg2 X0RTX1JFR05VTSwgSTM4Nl9FU19SRUdOVU0sIEkzODZfRlNfUkVHTlVNLCBJ Mzg2X0dTX1JFR05VTQorfTsKKwogDAogc3RhdGljIHN0cnVjdCBnZGJhcmNo ICoKIGkzODZfZ2RiYXJjaF9pbml0IChzdHJ1Y3QgZ2RiYXJjaF9pbmZvIGlu Zm8sIHN0cnVjdCBnZGJhcmNoX2xpc3QgKmFyY2hlcykKQEAgLTUyMjQsNiAr NTM0NCw4IEBAIGkzODZfZ2RiYXJjaF9pbml0IChzdHJ1Y3QgZ2RiYXJjaF9p bmZvIGkKICAgdGRlcC0+c2NfcGNfb2Zmc2V0ID0gLTE7CiAgIHRkZXAtPnNj X3NwX29mZnNldCA9IC0xOwogCisgIHRkZXAtPnJlY29yZF9yZWdtYXAgPSBp Mzg2X3JlY29yZF9yZWdtYXA7CisKICAgLyogVGhlIGZvcm1hdCB1c2VkIGZv ciBgbG9uZyBkb3VibGUnIG9uIGFsbW9zdCBhbGwgaTM4NiB0YXJnZXRzIGlz CiAgICAgIHRoZSBpMzg3IGV4dGVuZGVkIGZsb2F0aW5nLXBvaW50IGZvcm1h dC4gIEluIGZhY3QsIG9mIGFsbCB0YXJnZXRzCiAgICAgIGluIHRoZSBHQ0Mg Mi45NSB0cmVlLCBvbmx5IE9TRi8xIGRvZXMgaXQgZGlmZmVyZW50LCBhbmQg aW5zaXN0cwotLS0gYS9pMzg2LXRkZXAuaAorKysgYi9pMzg2LXRkZXAuaApA QCAtMTExLDEwICsxMTEsMTUgQEAgc3RydWN0IGdkYmFyY2hfdGRlcAogICBz dHJ1Y3QgdHlwZSAqaTM4N19leHRfdHlwZTsKIAogICAvKiBQcm9jZXNzIHJl Y29yZC9yZXBsYXkgdGFyZ2V0LiAgKi8KKyAgLyogVGhlIG1hcCBmb3IgcmVn aXN0ZXJzIGJlY2F1c2UgdGhlIEFNRDY0J3MgcmVnaXN0ZXJzIG9yZGVyIGlu IEdEQiBpcyBub3QKKyAgICAgc2FtZSB3aXRoIEkzODYgaW5zdHJ1Y3Rpb25z LiAgKi8KKyAgY29uc3QgaW50ICpyZWNvcmRfcmVnbWFwOwogICAvKiBQYXJz ZSBpbnR4ODAgYXJncy4gICovCiAgIGludCAoKmkzODZfaW50eDgwX3JlY29y ZCkgKHN0cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUpOwogICAvKiBQYXJzZSBz eXNlbnRlciBhcmdzLiAgKi8KICAgaW50ICgqaTM4Nl9zeXNlbnRlcl9yZWNv cmQpIChzdHJ1Y3QgcmVnY2FjaGUgKnJlZ2NhY2hlKTsKKyAgLyogUGFyc2Ug c3lzY2FsbCBhcmdzLiAgKi8KKyAgaW50ICgqaTM4Nl9zeXNjYWxsX3JlY29y ZCkgKHN0cnVjdCByZWdjYWNoZSAqcmVnY2FjaGUpOwogfTsKIAogLyogRmxv YXRpbmctcG9pbnQgcmVnaXN0ZXJzLiAgKi8KQEAgLTE1MSw2ICsxNTYsMzYg QEAgZW51bSBpMzg2X3JlZ251bQogICBJMzg2X1NUMF9SRUdOVU0JCS8qICVz dCgwKSAqLwogfTsKIAorLyogUmVnaXN0ZXIgbnVtYmVycyBvZiBSRUNPUkRf UkVHTUFQLiAgKi8KKworZW51bSByZWNvcmRfaTM4Nl9yZWdudW0KK3sKKyAg WDg2X1JFQ09SRF9SRUFYX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRUNYX1JF R05VTSwKKyAgWDg2X1JFQ09SRF9SRURYX1JFR05VTSwKKyAgWDg2X1JFQ09S RF9SRUJYX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRVNQX1JFR05VTSwKKyAg WDg2X1JFQ09SRF9SRUJQX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9SRVNJX1JF R05VTSwKKyAgWDg2X1JFQ09SRF9SRURJX1JFR05VTSwKKyAgWDg2X1JFQ09S RF9SOF9SRUdOVU0sCisgIFg4Nl9SRUNPUkRfUjlfUkVHTlVNLAorICBYODZf UkVDT1JEX1IxMF9SRUdOVU0sCisgIFg4Nl9SRUNPUkRfUjExX1JFR05VTSwK KyAgWDg2X1JFQ09SRF9SMTJfUkVHTlVNLAorICBYODZfUkVDT1JEX1IxM19S RUdOVU0sCisgIFg4Nl9SRUNPUkRfUjE0X1JFR05VTSwKKyAgWDg2X1JFQ09S RF9SMTVfUkVHTlVNLAorICBYODZfUkVDT1JEX1JFSVBfUkVHTlVNLAorICBY ODZfUkVDT1JEX0VGTEFHU19SRUdOVU0sCisgIFg4Nl9SRUNPUkRfQ1NfUkVH TlVNLAorICBYODZfUkVDT1JEX1NTX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9E U19SRUdOVU0sCisgIFg4Nl9SRUNPUkRfRVNfUkVHTlVNLAorICBYODZfUkVD T1JEX0ZTX1JFR05VTSwKKyAgWDg2X1JFQ09SRF9HU19SRUdOVU0sCit9Owor CiAjZGVmaW5lIEkzODZfTlVNX0dSRUdTCTE2CiAjZGVmaW5lIEkzODZfTlVN X0ZSRUdTCTE2CiAjZGVmaW5lIEkzODZfTlVNX1hSRUdTICA5Cg== --001636e0a91c42a6ae046e1481d3--