From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ua1-x931.google.com (mail-ua1-x931.google.com [IPv6:2607:f8b0:4864:20::931]) by sourceware.org (Postfix) with ESMTPS id B20443858406 for ; Mon, 22 Nov 2021 03:19:16 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B20443858406 Received: by mail-ua1-x931.google.com with SMTP id p2so33659307uad.11 for ; Sun, 21 Nov 2021 19:19:16 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=/AAXSh+jR8wqr1/TbQWq6BG9+0nAaD20yll1AHXYVEo=; b=o8y52GGkbzZgshzYqCRpdHINCrsbGgSSJRUKDqxrWIZ622yz3z9y6yGRdNWz88IxTY Hy1tS4M1X0ckwrLHH37ZYwx6Df0RinzspaD8Fg9iyB5+zgTH3RIJUbNkcKAVHy8LJKlZ WmcE58PQ0MTvF876RJbL0M+35enm/mV0RqMAamKsdsOz63FOzaBdCXsGdjE6HVpiuwtv cLz1w17zVJG7bo4PQQgyeS0GuU+srTK7tNZTLFIe4ED86lJCsYuRBe0yRq/KSp3lvOuV oDSBXqkokhLFa3SkYMkvjwlI1+z9AofqtpTWoR47/qI4F0P0zfDd5YjaOiPv6T+Vx3p8 BDeg== X-Gm-Message-State: AOAM530pkMSDOcYx9wBQU7dC1Aqg+doI7aTab9fBKKPsUSYj8X1Q0zbc JYPX1uGwP618YLummMjQfRCHOenj0qWK7iUsTWI= X-Google-Smtp-Source: ABdhPJxFVSP9c8WqDIVbVN5rMWeAejLEURENrsXu8ZgH/PtKJuVxNBw/Y3mx4WsUGcQEWH41MCq+tgi8b4nquFKyDIw= X-Received: by 2002:ab0:6354:: with SMTP id f20mr80793318uap.116.1637551156206; Sun, 21 Nov 2021 19:19:16 -0800 (PST) MIME-Version: 1.0 References: <20211119011429.59776-1-hongtao.liu@intel.com> In-Reply-To: From: Hongtao Liu Date: Mon, 22 Nov 2021 11:19:04 +0800 Message-ID: Subject: Re: [PATCH] Don't allow mask/sse/mmx mov in TLS code sequences. To: Uros Bizjak Cc: liuhongt , "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary="000000000000f7b68f05d1581689" X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 22 Nov 2021 03:19:19 -0000 --000000000000f7b68f05d1581689 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Fri, Nov 19, 2021 at 3:53 PM Uros Bizjak via Gcc-patches wrote: > > On Fri, Nov 19, 2021 at 8:50 AM Uros Bizjak wrote: > > > > On Fri, Nov 19, 2021 at 2:14 AM liuhongt wrote: > > > > > > >Why is the above declared as a special memory constraint? Also the > > > Change to define_memory_constraint since it's ok for > > > reload can make them match by converting the operand to the form > > > =E2=80=98(mem (reg X))=E2=80=99.where X is a base register (from the = register class specified > > > by BASE_REG_CLASS > > > > > > >predicate comment is missing and the description should say somethin= g > > > >like: > > > > > > > >@internal TLS address that allows insn using non-integer registers > > > Changed. > > > > > > >I think it is better to avoid negative logic. So, something like > > > > > > > >Return true if the TLS address requires insn using integer registers= . > > > > > > > >bool > > > >ix86_gpr_tls_address_pattern_p > > > > > > > >(and use not in the predicate) > > > > > > Changed. > > > > > > >> +{ > > > >> + gcc_assert (MEM_P (mem)); > > > >> + > > > >> + rtx addr =3D XEXP (mem, 0); > > > >> + subrtx_var_iterator::array_type array; > > > >> + FOR_EACH_SUBRTX_VAR (iter, array, addr, ALL) > > > >> + { > > > >> + rtx op =3D *iter; > > > >> + if (GET_CODE (op) =3D=3D UNSPEC) > > > >> + switch (XINT (op, 1)) > > > >> + { > > > >> + case UNSPEC_GOTNTPOFF: > > > >> + return false; > > > >> + case UNSPEC_TPOFF: > > > >> + if (!TARGET_64BIT) > > > >> + return false; > > > >> + break; > > > >> + default: > > > >> + break; > > > >> + } > > > >> + /* Should iter.skip_subrtxes (); > > > >> + if there's no inner UNSPEC in addr???. */ > > > > > > >You should figure the above before submitting the patch. > > > ix86_print_operand_address_as shows there could be inner UNSPEC in ad= dr, so > > > remove comments. > > > > > > >Can you please minimize the testcase? > > > Done; > > > > > > As change in assembler, refer to [1], this patch disallow mask/sse/mm= x > > > mov in TLS code sequences which require integer MOV instructions. > > > > > > [1] https://sourceware.org/git/?p=3Dbinutils-gdb.git;a=3Dpatch;h=3Dd7= e3e627027fcf37d63e284144fe27ff4eba36b5 > > > > > > gcc/ChangeLog: > > > > > > PR target/103275 > > > * config/i386/i386-protos.h (ix86_gpr_tls_address_pattern_p): > > > Declare. > > > * config/i386/i386.c (ix86_gpr_tls_address_pattern_p): New > > > function. > > > * config/i386/i386.md (*movsi_internal): Don't allow > > > mask/sse/mmx move in TLS code sequences. > > > (*movdi_internal): Ditto. > > > > > > gcc/testsuite/ChangeLog: > > > > > > * gcc.target/i386/pr103275.c: New test. > > > > OK, with a small comment adjustment below. > > Ops, sorry, I was too fast. You can simplify the patch to change the > constraint from > > *km to *kBk > > Then no renumbering is needed. Yes, changed, thanks for the review. this is the final patch i'm checking in. > > Uros. > > > > > Thanks, > > Uros. > > > > > --- > > > gcc/config/i386/constraints.md | 5 ++ > > > gcc/config/i386/i386-protos.h | 1 + > > > gcc/config/i386/i386.c | 32 +++++++++ > > > gcc/config/i386/i386.md | 18 ++--- > > > gcc/testsuite/gcc.target/i386/pr103275.c | 83 ++++++++++++++++++++++= ++ > > > 5 files changed, 130 insertions(+), 9 deletions(-) > > > create mode 100644 gcc/testsuite/gcc.target/i386/pr103275.c > > > > > > diff --git a/gcc/config/i386/constraints.md b/gcc/config/i386/constra= ints.md > > > index eaa582d2055..15c5950ee6f 100644 > > > --- a/gcc/config/i386/constraints.md > > > +++ b/gcc/config/i386/constraints.md > > > @@ -185,6 +185,11 @@ (define_special_memory_constraint "Bc" > > > (and (match_operand 0 "memory_operand") > > > (match_test "constant_address_p (XEXP (op, 0))"))) > > > > > > +(define_memory_constraint "Bk" > > > + "@internal TLS address that allows insn using non-integer register= s." > > > + (and (match_operand 0 "memory_operand") > > > + (not (match_test "ix86_gpr_tls_address_pattern_p (op)")))) > > > + > > > (define_special_memory_constraint "Bn" > > > "@internal Memory operand without REX prefix." > > > (match_operand 0 "norex_memory_operand")) > > > diff --git a/gcc/config/i386/i386-protos.h b/gcc/config/i386/i386-pro= tos.h > > > index 7782cf1163f..941e91636d8 100644 > > > --- a/gcc/config/i386/i386-protos.h > > > +++ b/gcc/config/i386/i386-protos.h > > > @@ -240,6 +240,7 @@ extern unsigned int ix86_get_callcvt (const_tree)= ; > > > #endif > > > > > > extern rtx ix86_tls_module_base (void); > > > +extern bool ix86_gpr_tls_address_pattern_p (rtx); > > > extern bool ix86_tls_address_pattern_p (rtx); > > > extern rtx ix86_rewrite_tls_address (rtx); > > > > > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > > > index 42c47d2b12b..68079e4230e 100644 > > > --- a/gcc/config/i386/i386.c > > > +++ b/gcc/config/i386/i386.c > > > @@ -11468,6 +11468,38 @@ legitimize_tls_address (rtx x, enum tls_mode= l model, bool for_mov) > > > return dest; > > > } > > > > > > +/* Return true if the TLS address requires insn using integer regist= ers. > > > + NB: it's different from ix86_tls_address_pattern_p since it also = matchs > > > + gottpoff/gotntpoff. > > > > The above NB comment is not needed, the fact is obvious from the code. > > > > > + It's used to prevent KMOV/VMOV in TLS code sequences which requir= e integer > > > + MOV instructions, refer to PR103275. */ > > > +bool > > > +ix86_gpr_tls_address_pattern_p (rtx mem) > > > +{ > > > + gcc_assert (MEM_P (mem)); > > > + > > > + rtx addr =3D XEXP (mem, 0); > > > + subrtx_var_iterator::array_type array; > > > + FOR_EACH_SUBRTX_VAR (iter, array, addr, ALL) > > > + { > > > + rtx op =3D *iter; > > > + if (GET_CODE (op) =3D=3D UNSPEC) > > > + switch (XINT (op, 1)) > > > + { > > > + case UNSPEC_GOTNTPOFF: > > > + return true; > > > + case UNSPEC_TPOFF: > > > + if (!TARGET_64BIT) > > > + return true; > > > + break; > > > + default: > > > + break; > > > + } > > > + } > > > + > > > + return false; > > > +} > > > + > > > /* Return true if OP refers to a TLS address. */ > > > bool > > > ix86_tls_address_pattern_p (rtx op) > > > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md > > > index 97325e38676..82b85b26059 100644 > > > --- a/gcc/config/i386/i386.md > > > +++ b/gcc/config/i386/i386.md > > > @@ -2085,9 +2085,9 @@ (define_split > > > > > > (define_insn "*movdi_internal" > > > [(set (match_operand:DI 0 "nonimmediate_operand" > > > - "=3Dr ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r,?*y,*v,*v,*v,m ,m,?r ,?*Y= d,?r,?*v,?*y,?*x,*k,*k ,*r,*m,*k") > > > + "=3Dr ,o ,r,r ,r,m ,*y,*y,?*y,?m,?r,?*y,*v,*v,*v,m ,m,?r ,?*Y= d,?r,?*v,?*y,?*x,*k,*k,*k ,*r,*m,*k") > > > (match_operand:DI 1 "general_operand" > > > - "riFo,riF,Z,rem,i,re,C ,*y,m ,*y,*y,r ,C ,*v,m ,*v,v,*Yd,r ,= *v,r ,*x ,*y ,*r,*km,*k,*k,CBC"))] > > > + "riFo,riF,Z,rem,i,re,C ,*y,Bk ,*y,*y,r ,C ,*v,Bk,*v,v,*Yd,r ,= *v,r ,*x ,*y ,*r,*k,*Bk,*k,*k,CBC"))] > > > "!(MEM_P (operands[0]) && MEM_P (operands[1])) > > > && ix86_hardreg_mov_ok (operands[0], operands[1])" > > > { > > > @@ -2149,7 +2149,7 @@ (define_insn "*movdi_internal" > > > [(set (attr "isa") > > > (cond [(eq_attr "alternative" "0,1,17,18") > > > (const_string "nox64") > > > - (eq_attr "alternative" "2,3,4,5,10,11,23,25") > > > + (eq_attr "alternative" "2,3,4,5,10,11,23,26") > > > (const_string "x64") > > > (eq_attr "alternative" "19,20") > > > (const_string "x64_sse2") > > > @@ -2170,9 +2170,9 @@ (define_insn "*movdi_internal" > > > (const_string "ssemov") > > > (eq_attr "alternative" "21,22") > > > (const_string "ssecvt") > > > - (eq_attr "alternative" "23,24,25,26") > > > + (eq_attr "alternative" "23,24,25,26,27") > > > (const_string "mskmov") > > > - (eq_attr "alternative" "27") > > > + (eq_attr "alternative" "28") > > > (const_string "msklog") > > > (and (match_operand 0 "register_operand") > > > (match_operand 1 "pic_32bit_operand")) > > > @@ -2306,9 +2306,9 @@ (define_peephole2 > > > > > > (define_insn "*movsi_internal" > > > [(set (match_operand:SI 0 "nonimmediate_operand" > > > - "=3Dr,m ,*y,*y,?*y,?m,?r,?*y,*v,*v,*v,m ,?r,?*v,*k,*k ,*rm,*k") > > > + "=3Dr,m ,*y,*y,?*y,?m,?r,?*y,*v,*v,*v,m ,?r,?*v,*k,*k ,*k,*rm,*k= ") > > > (match_operand:SI 1 "general_operand" > > > - "g ,re,C ,*y,m ,*y,*y,r ,C ,*v,m ,*v,*v,r ,*r,*km,*k ,CBC"))] > > > + "g ,re,C ,*y,Bk ,*y,*y,r ,C ,*v,Bk,*v,*v,r ,*r,*k, *Bk,*k ,CBC= "))] > > > "!(MEM_P (operands[0]) && MEM_P (operands[1])) > > > && ix86_hardreg_mov_ok (operands[0], operands[1])" > > > { > > > @@ -2373,9 +2373,9 @@ (define_insn "*movsi_internal" > > > (const_string "sselog1") > > > (eq_attr "alternative" "9,10,11,12,13") > > > (const_string "ssemov") > > > - (eq_attr "alternative" "14,15,16") > > > + (eq_attr "alternative" "14,15,16,17") > > > (const_string "mskmov") > > > - (eq_attr "alternative" "17") > > > + (eq_attr "alternative" "18") > > > (const_string "msklog") > > > (and (match_operand 0 "register_operand") > > > (match_operand 1 "pic_32bit_operand")) > > > diff --git a/gcc/testsuite/gcc.target/i386/pr103275.c b/gcc/testsuite= /gcc.target/i386/pr103275.c > > > new file mode 100644 > > > index 00000000000..c93413f3cde > > > --- /dev/null > > > +++ b/gcc/testsuite/gcc.target/i386/pr103275.c > > > @@ -0,0 +1,83 @@ > > > +/* { dg-do compile { target ia32 } } */ > > > +/* { dg-options "-O2 -march=3Dtigerlake -fPIC" } */ > > > +/* { dg-final { scan-assembler-not {(?n)kmovd.*@gotntpoff} } } */ > > > + > > > +typedef unsigned short uint16_t; > > > +typedef int int32_t; > > > +typedef unsigned int uint32_t; > > > +typedef unsigned char uint8_t; > > > + > > > +typedef uint32_t in_addr_t; > > > +struct in_addr { in_addr_t s_addr; }; > > > + > > > +extern __thread const uint16_t * __libc_tsd_CTYPE_B __attribute__ ((= tls_model ("initial-exec"))); > > > +extern __thread int __libc_errno __attribute__ ((tls_model ("initial= -exec"))); > > > + > > > +extern unsigned long strtoul (const char*, char**, int); > > > +extern uint32_t __bswap_32 (in_addr_t); > > > +int > > > +inet_aton_end (const char *cp, struct in_addr *addr, const char **en= dp) > > > +{ > > > + static const in_addr_t max[4] =3D { 0xffffffff, 0xffffff, 0xffff, = 0xff }; > > > + in_addr_t val; > > > + char c; > > > + union iaddr > > > + { > > > + uint8_t bytes[4]; > > > + uint32_t word; > > > + } res; > > > + uint8_t *pp =3D res.bytes; > > > + int digit; > > > + > > > + int saved_errno =3D __libc_errno; > > > + __libc_errno =3D 0; > > > + res.word =3D 0; > > > + c =3D *cp; > > > + > > > + for (;;) > > > + { > > > + if (c < '0' || c > '9') > > > + goto ret_0; > > > + { > > > + char *endp; > > > + unsigned long ul =3D strtoul (cp, &endp, 0); > > > + if (ul =3D=3D 0x7fffffffL && __libc_errno =3D=3D 34) > > > + goto ret_0; > > > + if (ul > 0xfffffffful) > > > + goto ret_0; > > > + val =3D ul; > > > + digit =3D cp !=3D endp; > > > + cp =3D endp; > > > + } > > > + c =3D *cp; > > > + if (c =3D=3D '.') > > > + { > > > + if (pp > res.bytes + 2 || val > 0xff) > > > + goto ret_0; > > > + *pp++ =3D val; > > > + c =3D *++cp; > > > + } > > > + else > > > + break; > > > + } > > > + > > > + if (!(__libc_tsd_CTYPE_B[(int)c] & 8192)) > > > + goto ret_0; > > > + > > > + if (!digit) > > > + goto ret_0; > > > + > > > + if (val > max[pp - res.bytes]) > > > + goto ret_0; > > > + > > > + if (addr !=3D 0) > > > + addr->s_addr =3D res.word | __bswap_32 (val); > > > + *endp =3D cp; > > > + > > > + __libc_errno =3D saved_errno; > > > + return 1; > > > + > > > + ret_0: > > > + __libc_errno =3D saved_errno; > > > + return 0; > > > +} > > > -- > > > 2.18.1 > > > --=20 BR, Hongtao --000000000000f7b68f05d1581689 Content-Type: application/octet-stream; name="0001-Don-t-allow-mask-sse-mmx-mov-in-TLS-code-sequences.patch" Content-Disposition: attachment; filename="0001-Don-t-allow-mask-sse-mmx-mov-in-TLS-code-sequences.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kwa3n7jt0 RnJvbSA4MDBhZDQ0Mzg0Mjg2YWNhMTcwYjIwZjlmMTBhYWY3MDc2YWVhY2JjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBXZWQsIDE3IE5vdiAyMDIxIDE1OjQ4OjM3ICswODAwClN1YmplY3Q6IFtQQVRDSF0gRG9uJ3Qg YWxsb3cgbWFzay9zc2UvbW14IG1vdiBpbiBUTFMgY29kZSBzZXF1ZW5jZXMuCgpBcyBjaGFuZ2Ug aW4gYXNzZW1ibGVyLCByZWZlciB0byBbMV0sIHRoaXMgcGF0Y2ggZGlzYWxsb3cgbWFzay9zc2Uv bW14Cm1vdiBpbiBUTFMgY29kZSBzZXF1ZW5jZXMgd2hpY2ggcmVxdWlyZSBpbnRlZ2VyIE1PViBp bnN0cnVjdGlvbnMuCgpbMV0gaHR0cHM6Ly9zb3VyY2V3YXJlLm9yZy9naXQvP3A9YmludXRpbHMt Z2RiLmdpdDthPXBhdGNoO2g9ZDdlM2U2MjcwMjdmY2YzN2Q2M2UyODQxNDRmZTI3ZmY0ZWJhMzZi NQoKZ2NjL0NoYW5nZUxvZzoKCglQUiB0YXJnZXQvMTAzMjc1CgkqIGNvbmZpZy9pMzg2L2NvbnN0 cmFpbnRzLm1kIChCayk6IE5ldwoJZGVmaW5lX21lbW9yeV9jb25zdHJhaW50LgoJKiBjb25maWcv aTM4Ni9pMzg2LXByb3Rvcy5oIChpeDg2X2dwcl90bHNfYWRkcmVzc19wYXR0ZXJuX3ApOgoJRGVj bGFyZS4KCSogY29uZmlnL2kzODYvaTM4Ni5jIChpeDg2X2dwcl90bHNfYWRkcmVzc19wYXR0ZXJu X3ApOiBOZXcKCWZ1bmN0aW9uLgoJKiBjb25maWcvaTM4Ni9pMzg2Lm1kICgqbW92c2lfaW50ZXJu YWwpOiBEb24ndCBhbGxvdwoJbWFzay9zc2UvbW14IG1vdmUgaW4gVExTIGNvZGUgc2VxdWVuY2Vz LgoJKCptb3ZkaV9pbnRlcm5hbCk6IERpdHRvLgoKZ2NjL3Rlc3RzdWl0ZS9DaGFuZ2VMb2c6CgoJ KiBnY2MudGFyZ2V0L2kzODYvcHIxMDMyNzUuYzogTmV3IHRlc3QuCi0tLQogZ2NjL2NvbmZpZy9p Mzg2L2NvbnN0cmFpbnRzLm1kICAgICAgICAgICB8ICA1ICsrCiBnY2MvY29uZmlnL2kzODYvaTM4 Ni1wcm90b3MuaCAgICAgICAgICAgIHwgIDEgKwogZ2NjL2NvbmZpZy9pMzg2L2kzODYuYyAgICAg ICAgICAgICAgICAgICB8IDMwICsrKysrKysrKwogZ2NjL2NvbmZpZy9pMzg2L2kzODYubWQgICAg ICAgICAgICAgICAgICB8ICA4ICstLQogZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIx MDMyNzUuYyB8IDgzICsrKysrKysrKysrKysrKysrKysrKysrKwogNSBmaWxlcyBjaGFuZ2VkLCAx MjMgaW5zZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjEwMzI3NS5jCgpkaWZmIC0tZ2l0IGEvZ2NjL2Nv bmZpZy9pMzg2L2NvbnN0cmFpbnRzLm1kIGIvZ2NjL2NvbmZpZy9pMzg2L2NvbnN0cmFpbnRzLm1k CmluZGV4IGVhYTU4MmQyMDU1Li4xNWM1OTUwZWU2ZiAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9p Mzg2L2NvbnN0cmFpbnRzLm1kCisrKyBiL2djYy9jb25maWcvaTM4Ni9jb25zdHJhaW50cy5tZApA QCAtMTg1LDYgKzE4NSwxMSBAQCAoZGVmaW5lX3NwZWNpYWxfbWVtb3J5X2NvbnN0cmFpbnQgIkJj IgogICAoYW5kIChtYXRjaF9vcGVyYW5kIDAgIm1lbW9yeV9vcGVyYW5kIikKICAgICAgICAobWF0 Y2hfdGVzdCAiY29uc3RhbnRfYWRkcmVzc19wIChYRVhQIChvcCwgMCkpIikpKQogCisoZGVmaW5l X21lbW9yeV9jb25zdHJhaW50ICJCayIKKyAgIkBpbnRlcm5hbCBUTFMgYWRkcmVzcyB0aGF0IGFs bG93cyBpbnNuIHVzaW5nIG5vbi1pbnRlZ2VyIHJlZ2lzdGVycy4iCisgIChhbmQgKG1hdGNoX29w ZXJhbmQgMCAibWVtb3J5X29wZXJhbmQiKQorICAgICAgIChub3QgKG1hdGNoX3Rlc3QgIml4ODZf Z3ByX3Rsc19hZGRyZXNzX3BhdHRlcm5fcCAob3ApIikpKSkKKwogKGRlZmluZV9zcGVjaWFsX21l bW9yeV9jb25zdHJhaW50ICJCbiIKICAgIkBpbnRlcm5hbCBNZW1vcnkgb3BlcmFuZCB3aXRob3V0 IFJFWCBwcmVmaXguIgogICAobWF0Y2hfb3BlcmFuZCAwICJub3JleF9tZW1vcnlfb3BlcmFuZCIp KQpkaWZmIC0tZ2l0IGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYtcHJvdG9zLmggYi9nY2MvY29uZmln L2kzODYvaTM4Ni1wcm90b3MuaAppbmRleCA3NzgyY2YxMTYzZi4uOTQxZTkxNjM2ZDggMTAwNjQ0 Ci0tLSBhL2djYy9jb25maWcvaTM4Ni9pMzg2LXByb3Rvcy5oCisrKyBiL2djYy9jb25maWcvaTM4 Ni9pMzg2LXByb3Rvcy5oCkBAIC0yNDAsNiArMjQwLDcgQEAgZXh0ZXJuIHVuc2lnbmVkIGludCBp eDg2X2dldF9jYWxsY3Z0IChjb25zdF90cmVlKTsKICNlbmRpZgogCiBleHRlcm4gcnR4IGl4ODZf dGxzX21vZHVsZV9iYXNlICh2b2lkKTsKK2V4dGVybiBib29sIGl4ODZfZ3ByX3Rsc19hZGRyZXNz X3BhdHRlcm5fcCAocnR4KTsKIGV4dGVybiBib29sIGl4ODZfdGxzX2FkZHJlc3NfcGF0dGVybl9w IChydHgpOwogZXh0ZXJuIHJ0eCBpeDg2X3Jld3JpdGVfdGxzX2FkZHJlc3MgKHJ0eCk7CiAKZGlm ZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2LmMgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5j CmluZGV4IDQyYzQ3ZDJiMTJiLi4xNDQ4ZjM2MDljMyAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9p Mzg2L2kzODYuYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5jCkBAIC0xMTQ2OCw2ICsxMTQ2 OCwzNiBAQCBsZWdpdGltaXplX3Rsc19hZGRyZXNzIChydHggeCwgZW51bSB0bHNfbW9kZWwgbW9k ZWwsIGJvb2wgZm9yX21vdikKICAgcmV0dXJuIGRlc3Q7CiB9CiAKKy8qIFJldHVybiB0cnVlIGlm IHRoZSBUTFMgYWRkcmVzcyByZXF1aXJlcyBpbnNuIHVzaW5nIGludGVnZXIgcmVnaXN0ZXJzLgor ICAgSXQncyB1c2VkIHRvIHByZXZlbnQgS01PVi9WTU9WIGluIFRMUyBjb2RlIHNlcXVlbmNlcyB3 aGljaCByZXF1aXJlIGludGVnZXIKKyAgIE1PViBpbnN0cnVjdGlvbnMsIHJlZmVyIHRvIFBSMTAz Mjc1LiAgKi8KK2Jvb2wKK2l4ODZfZ3ByX3Rsc19hZGRyZXNzX3BhdHRlcm5fcCAocnR4IG1lbSkK K3sKKyAgZ2NjX2Fzc2VydCAoTUVNX1AgKG1lbSkpOworCisgIHJ0eCBhZGRyID0gWEVYUCAobWVt LCAwKTsKKyAgc3VicnR4X3Zhcl9pdGVyYXRvcjo6YXJyYXlfdHlwZSBhcnJheTsKKyAgRk9SX0VB Q0hfU1VCUlRYX1ZBUiAoaXRlciwgYXJyYXksIGFkZHIsIEFMTCkKKyAgICB7CisgICAgICBydHgg b3AgPSAqaXRlcjsKKyAgICAgIGlmIChHRVRfQ09ERSAob3ApID09IFVOU1BFQykKKwlzd2l0Y2gg KFhJTlQgKG9wLCAxKSkKKwkgIHsKKwkgIGNhc2UgVU5TUEVDX0dPVE5UUE9GRjoKKwkgICAgcmV0 dXJuIHRydWU7CisJICBjYXNlIFVOU1BFQ19UUE9GRjoKKwkgICAgaWYgKCFUQVJHRVRfNjRCSVQp CisJICAgICAgcmV0dXJuIHRydWU7CisJICAgIGJyZWFrOworCSAgZGVmYXVsdDoKKwkgICAgYnJl YWs7CisJICB9CisgICAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwogLyogUmV0dXJuIHRydWUg aWYgT1AgcmVmZXJzIHRvIGEgVExTIGFkZHJlc3MuICAqLwogYm9vbAogaXg4Nl90bHNfYWRkcmVz c19wYXR0ZXJuX3AgKHJ0eCBvcCkKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2Lm1k IGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYubWQKaW5kZXggOTczMjVlMzg2NzYuLjU0YzMyY2IzMjI4 IDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5tZAorKysgYi9nY2MvY29uZmlnL2kz ODYvaTM4Ni5tZApAQCAtMjA4NSw5ICsyMDg1LDkgQEAgKGRlZmluZV9zcGxpdAogCiAoZGVmaW5l X2luc24gIiptb3ZkaV9pbnRlcm5hbCIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6REkgMCAibm9u aW1tZWRpYXRlX29wZXJhbmQiCi0gICAgIj1yICAsbyAgLHIsciAgLHIsbSAsKnksKnksPyp5LD9t LD9yLD8qeSwqdiwqdiwqdixtICxtLD9yICw/KllkLD9yLD8qdiw/KnksPyp4LCprLCprICwqciwq bSwqayIpCisgICAgIj1yICAsbyAgLHIsciAgLHIsbSAsKnksKnksPyp5LD9tLD9yLD8qeSwqdiwq diwqdixtICxtLD9yICw/KllkLD9yLD8qdiw/KnksPyp4LCprLCprICAsKnIsKm0sKmsiKQogCSht YXRjaF9vcGVyYW5kOkRJIDEgImdlbmVyYWxfb3BlcmFuZCIKLSAgICAicmlGbyxyaUYsWixyZW0s aSxyZSxDICwqeSxtICAsKnksKnksciAgLEMgLCp2LG0gLCp2LHYsKllkLHIgICAsKnYsciAgLCp4 ICwqeSAsKnIsKmttLCprLCprLENCQyIpKV0KKyAgICAicmlGbyxyaUYsWixyZW0saSxyZSxDICwq eSwqQmssKnksKnksciAgLEMgLCp2LEJrLCp2LHYsKllkLHIgICAsKnYsciAgLCp4ICwqeSAsKnIs KmtCaywqaywqayxDQkMiKSldCiAgICIhKE1FTV9QIChvcGVyYW5kc1swXSkgJiYgTUVNX1AgKG9w ZXJhbmRzWzFdKSkKICAgICYmIGl4ODZfaGFyZHJlZ19tb3Zfb2sgKG9wZXJhbmRzWzBdLCBvcGVy YW5kc1sxXSkiCiB7CkBAIC0yMzA2LDkgKzIzMDYsOSBAQCAoZGVmaW5lX3BlZXBob2xlMgogCiAo ZGVmaW5lX2luc24gIiptb3ZzaV9pbnRlcm5hbCIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6U0kg MCAibm9uaW1tZWRpYXRlX29wZXJhbmQiCi0gICAgIj1yLG0gLCp5LCp5LD8qeSw/bSw/ciw/Knks KnYsKnYsKnYsbSAsP3IsPyp2LCprLCprICwqcm0sKmsiKQorICAgICI9cixtICwqeSwqeSw/Knks P20sP3IsPyp5LCp2LCp2LCp2LG0gLD9yLD8qdiwqaywqayAgLCpybSwqayIpCiAJKG1hdGNoX29w ZXJhbmQ6U0kgMSAiZ2VuZXJhbF9vcGVyYW5kIgotICAgICJnICxyZSxDICwqeSxtICAsKnksKnks ciAgLEMgLCp2LG0gLCp2LCp2LHIgICwqciwqa20sKmsgLENCQyIpKV0KKyAgICAiZyAscmUsQyAs KnksQmsgLCp5LCp5LHIgICxDICwqdixCaywqdiwqdixyICAsKnIsKmtCaywqayAsQ0JDIikpXQog ICAiIShNRU1fUCAob3BlcmFuZHNbMF0pICYmIE1FTV9QIChvcGVyYW5kc1sxXSkpCiAgICAmJiBp eDg2X2hhcmRyZWdfbW92X29rIChvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0pIgogewpkaWZmIC0t Z2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIxMDMyNzUuYyBiL2djYy90ZXN0 c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3ByMTAzMjc1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAuLmM5MzQxM2YzY2RlCi0tLSAvZGV2L251bGwKKysrIGIvZ2NjL3Rlc3Rz dWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIxMDMyNzUuYwpAQCAtMCwwICsxLDgzIEBACisvKiB7IGRn LWRvIGNvbXBpbGUgeyB0YXJnZXQgaWEzMiB9IH0gICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAt bWFyY2g9dGlnZXJsYWtlIC1mUElDIiB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItbm90IHsoP24pa21vdmQuKkBnb3RudHBvZmZ9IH0gfSAgKi8KKwordHlwZWRlZiB1bnNpZ25l ZCBzaG9ydCB1aW50MTZfdDsKK3R5cGVkZWYgaW50IGludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVk IGludCB1aW50MzJfdDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciB1aW50OF90OworCit0eXBlZGVm IHVpbnQzMl90IGluX2FkZHJfdDsKK3N0cnVjdCBpbl9hZGRyIHsgaW5fYWRkcl90IHNfYWRkcjsg fTsKKworZXh0ZXJuIF9fdGhyZWFkIGNvbnN0IHVpbnQxNl90ICogX19saWJjX3RzZF9DVFlQRV9C IF9fYXR0cmlidXRlX18gKCh0bHNfbW9kZWwgKCJpbml0aWFsLWV4ZWMiKSkpOworZXh0ZXJuIF9f dGhyZWFkIGludCBfX2xpYmNfZXJybm8gX19hdHRyaWJ1dGVfXyAoKHRsc19tb2RlbCAoImluaXRp YWwtZXhlYyIpKSk7CisKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN0cnRvdWwgKGNvbnN0IGNoYXIq LCBjaGFyKiosIGludCk7CitleHRlcm4gdWludDMyX3QgX19ic3dhcF8zMiAoaW5fYWRkcl90KTsK K2ludAoraW5ldF9hdG9uX2VuZCAoY29uc3QgY2hhciAqY3AsIHN0cnVjdCBpbl9hZGRyICphZGRy LCBjb25zdCBjaGFyICoqZW5kcCkKK3sKKyAgc3RhdGljIGNvbnN0IGluX2FkZHJfdCBtYXhbNF0g PSB7IDB4ZmZmZmZmZmYsIDB4ZmZmZmZmLCAweGZmZmYsIDB4ZmYgfTsKKyAgaW5fYWRkcl90IHZh bDsKKyAgY2hhciBjOworICB1bmlvbiBpYWRkcgorICB7CisgICAgdWludDhfdCBieXRlc1s0XTsK KyAgICB1aW50MzJfdCB3b3JkOworICB9IHJlczsKKyAgdWludDhfdCAqcHAgPSByZXMuYnl0ZXM7 CisgIGludCBkaWdpdDsKKworICBpbnQgc2F2ZWRfZXJybm8gPSBfX2xpYmNfZXJybm87CisgIF9f bGliY19lcnJubyA9IDA7CisgIHJlcy53b3JkID0gMDsKKyAgYyA9ICpjcDsKKworICBmb3IgKDs7 KQorICAgIHsKKyAgICAgIGlmIChjIDwgJzAnIHx8IGMgPiAnOScpCisJZ290byByZXRfMDsKKyAg ICAgIHsKKwljaGFyICplbmRwOworCXVuc2lnbmVkIGxvbmcgdWwgPSBzdHJ0b3VsIChjcCwgJmVu ZHAsIDApOworCWlmICh1bCA9PSAweDdmZmZmZmZmTCAmJiBfX2xpYmNfZXJybm8gPT0gMzQpCisJ ICBnb3RvIHJldF8wOworCWlmICh1bCA+IDB4ZmZmZmZmZmZ1bCkKKwkgIGdvdG8gcmV0XzA7CisJ dmFsID0gdWw7CisJZGlnaXQgPSBjcCAhPSBlbmRwOworCWNwID0gZW5kcDsKKyAgICAgIH0KKyAg ICAgIGMgPSAqY3A7CisgICAgICBpZiAoYyA9PSAnLicpCisJeworCSAgaWYgKHBwID4gcmVzLmJ5 dGVzICsgMiB8fCB2YWwgPiAweGZmKQorCSAgICBnb3RvIHJldF8wOworCSAgKnBwKysgPSB2YWw7 CisJICBjID0gKisrY3A7CisJfQorICAgICAgZWxzZQorCWJyZWFrOworICAgIH0KKworICBpZiAo IShfX2xpYmNfdHNkX0NUWVBFX0JbKGludCljXSAmIDgxOTIpKQorICAgIGdvdG8gcmV0XzA7CisK KyAgaWYgKCFkaWdpdCkKKyAgICBnb3RvIHJldF8wOworCisgIGlmICh2YWwgPiBtYXhbcHAgLSBy ZXMuYnl0ZXNdKQorICAgIGdvdG8gcmV0XzA7CisKKyAgaWYgKGFkZHIgIT0gMCkKKyAgICBhZGRy LT5zX2FkZHIgPSByZXMud29yZCB8IF9fYnN3YXBfMzIgKHZhbCk7CisgICplbmRwID0gY3A7CisK KyAgX19saWJjX2Vycm5vID0gc2F2ZWRfZXJybm87CisgIHJldHVybiAxOworCisgcmV0XzA6Cisg IF9fbGliY19lcnJubyA9IHNhdmVkX2Vycm5vOworICByZXR1cm4gMDsKK30KLS0gCjIuMTguMQoK --000000000000f7b68f05d1581689--