From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4397 invoked by alias); 12 Feb 2019 01:10:23 -0000 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 Received: (qmail 4387 invoked by uid 89); 12 Feb 2019 01:10:23 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-24.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_HELO_PASS,UNSUBSCRIBE_BODY autolearn=ham version=3.3.2 spammy=watched X-HELO: userp2120.oracle.com Received: from userp2120.oracle.com (HELO userp2120.oracle.com) (156.151.31.85) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 12 Feb 2019 01:10:20 +0000 Received: from pps.filterd (userp2120.oracle.com [127.0.0.1]) by userp2120.oracle.com (8.16.0.27/8.16.0.27) with SMTP id x1C18fJk181766; Tue, 12 Feb 2019 01:10:14 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oracle.com; h=subject : to : cc : references : from : message-id : date : mime-version : in-reply-to : content-type; s=corp-2018-07-02; bh=DDgpUTjbqh+JIWo1xlLThYKaG8GkzaiiQckmPo1Y4GQ=; b=eQs3VopiVglkH3ipms66qF3Fgb5S1urKsGmV8VYLjK1ZxJ7DYlblnvLWzAahmQ9dS8nf ajm6W+qno+RE2M/WRFpALftNtjbKkI+qGIRgmxiUG4nfNjDHBlj0KxBsaf336IjznRdM mhbbwG8oYB98yjMBWFl9n0BU5Kw5RIinZenE+Hj4rYinmyWsxiCpl9mS+Yo08wUYkqWS B+6dmlkDOjWTbdrNEamT07PjHxZJ4qnMtF+82pspkcb8ww22a5sMl+VMQDEKRP1VqSSg 2jOIJx5p2ajmCIwKxaC/3sM+KxtVojqCbW+jDvTosyyJJ5jJPRSWbEFVQ3qR/iapAjgz +A== Received: from aserv0021.oracle.com (aserv0021.oracle.com [141.146.126.233]) by userp2120.oracle.com with ESMTP id 2qhreds589-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Feb 2019 01:10:14 +0000 Received: from aserv0121.oracle.com (aserv0121.oracle.com [141.146.126.235]) by aserv0021.oracle.com (8.14.4/8.14.4) with ESMTP id x1C1ADjT027240 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 12 Feb 2019 01:10:13 GMT Received: from abhmp0011.oracle.com (abhmp0011.oracle.com [141.146.116.17]) by aserv0121.oracle.com (8.14.4/8.13.8) with ESMTP id x1C1ADpQ017892; Tue, 12 Feb 2019 01:10:13 GMT Received: from [10.132.96.98] (/10.132.96.98) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 11 Feb 2019 17:10:13 -0800 Subject: Re: [PING][PATCH v2 PR gdb/21870] aarch64: Leftover uncleared debug registers To: Alan Hayward Cc: "gdb-patches@sourceware.org" , nd References: <1530148222-12558-1-git-send-email-weimin.pan@oracle.com> <145f2e8d-4321-00a6-650a-bf8f0a483b6f@oracle.com> <7861E9FA-0293-4C16-857A-6935579C7042@arm.com> <3eea53e4-dfc6-ef59-f88f-d35797c26ba6@oracle.com> <31396591-A287-40C5-A4D0-6EAEC8077D6B@arm.com> From: Weimin Pan Message-ID: <563997a0-cd3c-cf6e-8418-bbd452436b2b@oracle.com> Date: Tue, 12 Feb 2019 01:10:00 -0000 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.5.0 MIME-Version: 1.0 In-Reply-To: <31396591-A287-40C5-A4D0-6EAEC8077D6B@arm.com> Content-Type: multipart/mixed; boundary="------------C55B8ED5D1B100B137B51A40" X-SW-Source: 2019-02/txt/msg00127.txt.bz2 This is a multi-part message in MIME format. --------------C55B8ED5D1B100B137B51A40 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-length: 10230 On 2/11/2019 7:24 AM, Alan Hayward wrote: > >>>>>>>> diff --git a/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c b/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c >>>>>>>> new file mode 100644 >>>>>>>> index 0000000..85d4a03 >>>>>>>> --- /dev/null >>>>>>>> +++ b/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.c >>>>>>>> @@ -0,0 +1,179 @@ >>>>>>>> +/* Test case for setting a memory-write unaligned watchpoint on aarch64. >>>>>>>> + >>>>>>>> + This software is provided 'as-is', without any express or implied >>>>>>>> + warranty. In no event will the authors be held liable for any damages >>>>>>>> + arising from the use of this software. >>>>>>>> + >>>>>>>> + Permission is granted to anyone to use this software for any purpose, >>>>>>>> + including commercial applications, and to alter it and redistribute it >>>>>>>> + freely. */ >>>>>>>> + >>>>>>>> +#define _GNU_SOURCE 1 >>>>>>>> +#ifdef __ia64__ >>>>>>>> +#define ia64_fpreg ia64_fpreg_DISABLE >>>>>>>> +#define pt_all_user_regs pt_all_user_regs_DISABLE >>>>>>>> +#endif /* __ia64__ */ >>>>>>>> +#include >>>>>>>> +#ifdef __ia64__ >>>>>>>> +#undef ia64_fpreg >>>>>>>> +#undef pt_all_user_regs >>>>>>>> +#endif /* __ia64__ */ >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#if defined __i386__ || defined __x86_64__ >>>>>>>> +#include >>>>>>>> +#endif >>>>>>>> + > I’m not sure why you have all the x86 and IA64 checks. > The test will only be executed on AArch64 (because of the checks in the .exp file). > Could you remove all of those checks please. The test case is likely to have been used for other targets as well. I've removed all non-aarch64 code and unused header files. >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> +#include >>>>>>>> + >>>>>>>> +static __attribute__((unused)) pid_t child; >>>>>>>> + >>>>>>>> +static __attribute__((unused)) void > Why are these marked as "static __attribute__((unused))” ? It instructs GCC not to produce a warning if the function is unused. >>>>>>>> +cleanup (void) >>>>>>>> +{ >>>>>>>> + if (child > 0) >>>>>>>> + kill (child, SIGKILL); >>>>>>>> + child = 0; >>>>>>>> +} >>>>>>>> + >>>>>>>> +static __attribute__((unused)) void > Same as above. > >>>>>>>> +handler_fail (int signo) >>>>>>>> +{ >>>>>>>> + cleanup (); >>>>>>>> + signal (signo, SIG_DFL); >>>>>>>> + raise (signo); >>>>>>>> +} >>>>>>>> + >>>>>>>> +#ifdef __aarch64__ > Again, as before, you shouldn’t need this check. If the test is only run > on AArch64 then it isn’t needed. Done. > >>>>>>>> + >>>>>>>> +#define SET_WATCHPOINT set_watchpoint >>>>>>>> + >>>>>>>> +/* Macros to extract fields from the hardware debug information word. */ >>>>>>>> +#define AARCH64_DEBUG_NUM_SLOTS(x) ((x) & 0xff) >>>>>>>> +#define AARCH64_DEBUG_ARCH(x) (((x) >> 8) & 0xff) >>>>>>>> +/* Macro for the expected version of the ARMv8-A debug architecture. */ >>>>>>>> +#define AARCH64_DEBUG_ARCH_V8 0x6 >>>>>>>> +#define DR_CONTROL_ENABLED(ctrl) (((ctrl) & 0x1) == 1) >>>>>>>> +#define DR_CONTROL_LENGTH(ctrl) (((ctrl) >> 5) & 0xff) >>>>>>>> + >>>>>>>> +static void >>>>>>>> +set_watchpoint (pid_t pid, volatile void *addr, unsigned len_mask) >>>>>>>> +{ >>>>>>>> + struct user_hwdebug_state dreg_state; >>>>>>>> + struct iovec iov; >>>>>>>> + long l; >>>>>>>> + >>>>>>>> + assert (len_mask >= 0x01); >>>>>>>> + assert (len_mask <= 0xff); >>>>>>>> + >>>>>>>> + iov.iov_base = &dreg_state; >>>>>>>> + iov.iov_len = sizeof (dreg_state); >>>>>>>> + errno = 0; >>>>>>>> + l = ptrace (PTRACE_GETREGSET, pid, NT_ARM_HW_WATCH, &iov); >>>>>>>> + assert (l == 0); >>>>>>>> + assert (AARCH64_DEBUG_ARCH (dreg_state.dbg_info) == AARCH64_DEBUG_ARCH_V8); >>>>>>>> + assert (AARCH64_DEBUG_NUM_SLOTS (dreg_state.dbg_info) >= 1); >>>>>>>> + >>>>>>>> + assert (!DR_CONTROL_ENABLED (dreg_state.dbg_regs[0].ctrl)); >>>>>>>> + dreg_state.dbg_regs[0].ctrl |= 1; >>>>>>>> + assert ( DR_CONTROL_ENABLED (dreg_state.dbg_regs[0].ctrl)); >>>>>>>> + >>>>>>>> + assert (DR_CONTROL_LENGTH (dreg_state.dbg_regs[0].ctrl) == 0); >>>>>>>> + dreg_state.dbg_regs[0].ctrl |= len_mask << 5; >>>>>>>> + assert (DR_CONTROL_LENGTH (dreg_state.dbg_regs[0].ctrl) == len_mask); >>>>>>>> + >>>>>>>> + dreg_state.dbg_regs[0].ctrl |= 2 << 3; // write >>>>>>>> + dreg_state.dbg_regs[0].ctrl |= 2 << 1; // GDB: ???: enabled at el0 >>>>>>>> + //printf("ctrl=0x%x\n",dreg_state.dbg_regs[0].ctrl); > Remove the commented out code. > >>>>>>>> + dreg_state.dbg_regs[0].addr = (uintptr_t) addr; >>>>>>>> + >>>>>>>> + iov.iov_base = &dreg_state; >>>>>>>> + iov.iov_len = (offsetof (struct user_hwdebug_state, dbg_regs) >>>>>>>> + + sizeof (dreg_state.dbg_regs[0])); >>>>>>>> + errno = 0; >>>>>>>> + l = ptrace (PTRACE_SETREGSET, pid, NT_ARM_HW_WATCH, &iov); >>>>>>>> + if (errno != 0) >>>>>>>> + error (1, errno, "PTRACE_SETREGSET: NT_ARM_HW_WATCH"); >>>>>>>> + assert (l == 0); >>>>>>>> +} >>>>>>>> + >>>>>>>> +#endif >>>>>>>> + >>>>>>>> +#ifndef SET_WATCHPOINT >>>>>>>> + >>>>>>>> +int >>>>>>>> +main (void) >>>>>>>> +{ >>>>>>>> + return 77; >>>>>>>> +} >>>>>>>> +#else > Having the executable exit with error on not AArch64 is not useful. > Again, this can be cut. > > >>>>>>>> + >>>>>>>> +static volatile long long check; >>>>>>>> + >>>>>>>> +int >>>>>>>> +main (void) >>>>>>>> +{ >>>>>>>> + pid_t got_pid; >>>>>>>> + int i, status; >>>>>>>> + long l; >>>>>>>> + >>>>>>>> + atexit (cleanup); >>>>>>>> + signal (SIGABRT, handler_fail); >>>>>>>> + signal (SIGINT, handler_fail); > I’m not sure on the point of the handler_fail? > Would the test be simpler without them? Yes, and the function is removed. > >>>>>>>> + >>>>>>>> + child = fork (); >>>>>>>> + assert (child >= 0); >>>>>>>> + if (child == 0) >>>>>>>> + { >>>>>>>> + l = ptrace (PTRACE_TRACEME, 0, NULL, NULL); >>>>>>>> + assert (l == 0); >>>>>>>> + i = raise (SIGUSR1); >>>>>>>> + assert (i == 0); >>>>>>>> + check = -1; >>>>>>>> + i = raise (SIGUSR2); >>>>>>>> + /* NOTREACHED */ >>>>>>>> + assert (0); >>>>>>>> + } >>>>>>>> + >>>>>>>> + got_pid = waitpid (child, &status, 0); >>>>>>>> + assert (got_pid == child); >>>>>>>> + assert (WIFSTOPPED (status)); >>>>>>>> + assert (WSTOPSIG (status) == SIGUSR1); >>>>>>>> + >>>>>>>> + // PASS: >>>>>>>> + //SET_WATCHPOINT (child, &check, 0xff); >>>>>>>> + // FAIL: > Remove the commented out code. > >>>>>>>> + SET_WATCHPOINT (child, &check, 0x02); >>>>>>>> + >>>>>>>> + errno = 0; >>>>>>>> + l = ptrace (PTRACE_CONT, child, 0l, 0l); >>>>>>>> + assert_perror (errno); >>>>>>>> + assert (l == 0); >>>>>>>> + >>>>>>>> + got_pid = waitpid (child, &status, 0); >>>>>>>> + assert (got_pid == child); >>>>>>>> + assert (WIFSTOPPED (status)); >>>>>>>> + if (WSTOPSIG (status) == SIGUSR2) >>>>>>>> + { >>>>>>>> + /* We missed the watchpoint - unsupported by hardware? */ >>>>>>>> + cleanup (); >>>>>>>> + return 2; >>>>>>>> + } >>>>>>>> + assert (WSTOPSIG (status) == SIGTRAP); >>>>>>>> + > It’s not immediately clear to me what is going on above. > A few comments are probably needed to make it clear: > *Add a watchpoint to check. > *Restart the child. It will write to check. > *Check child has stopped on the watchpoint. > >>>>>>>> + cleanup (); >>>>>>>> + return 0; >>>>>>>> +} >>>>>>>> + >>>>>>>> +#endif >>>>>>>> + >>>>>>>> diff --git a/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.exp b/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.exp >>>>>>>> new file mode 100644 >>>>>>>> index 0000000..6aa23b0 >>>>>>>> --- /dev/null >>>>>>>> +++ b/gdb/testsuite/gdb.arch/aarch64-dbreg-contents.exp >>>>>>>> @@ -0,0 +1,40 @@ >>>>>>>> +# Copyright 2018 Free Software Foundation, Inc. > 2019 > >>>>>>>> + >>>>>>>> +# This program is free software; you can redistribute it and/or modify >>>>>>>> +# it under the terms of the GNU General Public License as published by >>>>>>>> +# the Free Software Foundation; either version 3 of the License, or >>>>>>>> +# (at your option) any later version. >>>>>>>> +# >>>>>>>> +# This program is distributed in the hope that it will be useful, >>>>>>>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >>>>>>>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >>>>>>>> +# GNU General Public License for more details. >>>>>>>> +# >>>>>>>> +# You should have received a copy of the GNU General Public License >>>>>>>> +# along with this program. If not, see . >>>>>>>> +# >>>>>>>> +# Make sure that the inferior doesn't assert and exits successfully. > Could you expand the description here please. Add something to state the error > case being tested. Something like: > > “This test checks that GDB does not alter watchpoints set by an inferior. The > tests sets a watchpoint on memory then writes to the watched memory. It will exit > with 1 if the watchpoint is not reached." > > Also add a reference to the PR bug number in the correct format. Done. I'm attaching the revised patch. Thanks for your comments. >>>>>>>> + >>>>>>>> +if {![is_aarch64_target]} { >>>>>>>> + verbose "Skipping ${gdb_test_file_name}." >>>>>>>> + return >>>>>>>> +} >>>>>>>> + >>>>>>>> +standard_testfile .c >>>>>>>> + >>>>>>>> +if { [gdb_compile ${srcdir}/${subdir}/${srcfile} ${binfile} executable {debug}] != "" } { >>>>>>>> + untested "failed to compile" >>>>>>>> + return -1 >>>>>>>> +} >>>>>>>> + >>>>>>>> +clean_restart $testfile >>>>>>>> + >>>>>>>> +set test "run to exit" >>>>>>>> +gdb_test_multiple "run" "$test" { >>>>>>>> + -re "exited with code 01.*$gdb_prompt $" { >>>>>>>> + pass "$test" >>>>>>>> + } >>>>>>>> + -re "exited normally.*$gdb_prompt $" { >>>>>>>> + pass "$test" >>>>>>>> + } > The whole .exp is a little strange as it doesn’t do anything - but - it’s > probably the easiest way to test the bug. So, I’m ok with this. > >>>>>>>> +} > > Alan. > > --------------C55B8ED5D1B100B137B51A40 Content-Type: text/plain; charset=UTF-8; name="0001-Adding-a-test-case.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="0001-Adding-a-test-case.patch" Content-length: 8723 RnJvbSA2OTQ5OTU4N2M2MGEyYWUyNGFhMzU4ZjQwZTE3YWU4ZjkyNzUwZDBh IE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBXZWltaW4gUGFuIDx3 ZWltaW4ucGFuQG9yYWNsZS5jb20+CkRhdGU6IE1vbiwgMTEgRmViIDIwMTkg MTY6MDc6MDkgLTA4MDAKU3ViamVjdDogW1BBVENIIFBSIGdkYi8yMTg3MF0g YWFyY2g2NDogTGVmdG92ZXIgdW5jbGVhcmVkIGRlYnVnIHJlZ2lzdGVycwoK QWRkaW5nIGEgdGVzdCBjYXNlCgpnZGIvdGVzdHN1aXRlL0NoYW5nZUxvZwoy MDE5LTAyLTExICBXZWltaW4gUGFuICA8d2VpbWluLnBhbkBvcmFjbGUuY29t PgoKICAgICAgICAgICAgUFIgYnJlYWtwb2ludHMvMjE4NzAKICAgICAgICAg ICAgKiBnZGIuYXJjaC9hYXJjaDY0LWRicmVnLWNvbnRlbnRzLmV4cDogTmV3 IGZpbGUuCiAgICAgICAgICAgICogZ2RiLmFyY2gvYWFyY2g2NC1kYnJlZy1j b250ZW50cy5jOiBOZXcgZmlsZS4KLS0tCiBnZGIvdGVzdHN1aXRlL2dkYi5h cmNoL2FhcmNoNjQtZGJyZWctY29udGVudHMuYyAgIHwgMTI5ICsrKysrKysr KysrKysrKysrKysrKysKIGdkYi90ZXN0c3VpdGUvZ2RiLmFyY2gvYWFyY2g2 NC1kYnJlZy1jb250ZW50cy5leHAgfCAgNDYgKysrKysrKysKIDIgZmlsZXMg Y2hhbmdlZCwgMTc1IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBnZGIvdGVzdHN1aXRlL2dkYi5hcmNoL2FhcmNoNjQtZGJyZWctY29udGVu dHMuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGdkYi90ZXN0c3VpdGUvZ2RiLmFy Y2gvYWFyY2g2NC1kYnJlZy1jb250ZW50cy5leHAKCmRpZmYgLS1naXQgYS9n ZGIvdGVzdHN1aXRlL2dkYi5hcmNoL2FhcmNoNjQtZGJyZWctY29udGVudHMu YyBiL2dkYi90ZXN0c3VpdGUvZ2RiLmFyY2gvYWFyY2g2NC1kYnJlZy1jb250 ZW50cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1 MzAzN2QKLS0tIC9kZXYvbnVsbAorKysgYi9nZGIvdGVzdHN1aXRlL2dkYi5h cmNoL2FhcmNoNjQtZGJyZWctY29udGVudHMuYwpAQCAtMCwwICsxLDEyOSBA QAorCisvKiBUZXN0IGNhc2UgZm9yIHNldHRpbmcgYSBtZW1vcnktd3JpdGUg dW5hbGlnbmVkIHdhdGNocG9pbnQgb24gYWFyY2g2NC4KKworICBUaGlzIHNv ZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJl c3Mgb3IgaW1wbGllZAorICB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwg dGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisg IGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisKKyAg UGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBz b2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisgIGluY2x1ZGluZyBjb21tZXJj aWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3Ry aWJ1dGUgaXQKKyAgZnJlZWx5LiAgKi8KKworI2RlZmluZSBfR05VX1NPVVJD RSAxCisjaW5jbHVkZSA8c3lzL3B0cmFjZS5oPgorI2luY2x1ZGUgPGFzc2Vy dC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8c3RkZGVm Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdWlvLmg+ CisjaW5jbHVkZSA8ZWxmLmg+CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKCh1 bnVzZWQpKSBwaWRfdCBjaGlsZDsKKworc3RhdGljIF9fYXR0cmlidXRlX18o KHVudXNlZCkpIHZvaWQKK2NsZWFudXAgKHZvaWQpCit7CisgIGlmIChjaGls ZCA+IDApCisgICAga2lsbCAoY2hpbGQsIFNJR0tJTEwpOworICBjaGlsZCA9 IDA7Cit9CisKKyNkZWZpbmUgU0VUX1dBVENIUE9JTlQgc2V0X3dhdGNocG9p bnQKKworLyogTWFjcm9zIHRvIGV4dHJhY3QgZmllbGRzIGZyb20gdGhlIGhh cmR3YXJlIGRlYnVnIGluZm9ybWF0aW9uIHdvcmQuICAqLworI2RlZmluZSBB QVJDSDY0X0RFQlVHX05VTV9TTE9UUyh4KSAoKHgpICYgMHhmZikKKyNkZWZp bmUgQUFSQ0g2NF9ERUJVR19BUkNIKHgpICgoKHgpID4+IDgpICYgMHhmZikK Ky8qIE1hY3JvIGZvciB0aGUgZXhwZWN0ZWQgdmVyc2lvbiBvZiB0aGUgQVJN djgtQSBkZWJ1ZyBhcmNoaXRlY3R1cmUuICAqLworI2RlZmluZSBBQVJDSDY0 X0RFQlVHX0FSQ0hfVjggMHg2CisjZGVmaW5lIERSX0NPTlRST0xfRU5BQkxF RChjdHJsKSAgICAgICAgKCgoY3RybCkgJiAweDEpID09IDEpCisjZGVmaW5l IERSX0NPTlRST0xfTEVOR1RIKGN0cmwpICAgICAgICAgKCgoY3RybCkgPj4g NSkgJiAweGZmKQorCitzdGF0aWMgdm9pZAorc2V0X3dhdGNocG9pbnQgKHBp ZF90IHBpZCwgdm9sYXRpbGUgdm9pZCAqYWRkciwgdW5zaWduZWQgbGVuX21h c2spCit7CisgIHN0cnVjdCB1c2VyX2h3ZGVidWdfc3RhdGUgZHJlZ19zdGF0 ZTsKKyAgc3RydWN0IGlvdmVjIGlvdjsKKyAgbG9uZyBsOworCisgIGFzc2Vy dCAobGVuX21hc2sgPj0gMHgwMSk7CisgIGFzc2VydCAobGVuX21hc2sgPD0g MHhmZik7CisKKyAgaW92Lmlvdl9iYXNlID0gJmRyZWdfc3RhdGU7CisgIGlv di5pb3ZfbGVuID0gc2l6ZW9mIChkcmVnX3N0YXRlKTsKKyAgZXJybm8gPSAw OworICBsID0gcHRyYWNlIChQVFJBQ0VfR0VUUkVHU0VULCBwaWQsIE5UX0FS TV9IV19XQVRDSCwgJmlvdik7CisgIGFzc2VydCAobCA9PSAwKTsKKyAgYXNz ZXJ0IChBQVJDSDY0X0RFQlVHX0FSQ0ggKGRyZWdfc3RhdGUuZGJnX2luZm8p ID09IEFBUkNINjRfREVCVUdfQVJDSF9WOCk7CisgIGFzc2VydCAoQUFSQ0g2 NF9ERUJVR19OVU1fU0xPVFMgKGRyZWdfc3RhdGUuZGJnX2luZm8pID49IDEp OworCisgIGFzc2VydCAoIURSX0NPTlRST0xfRU5BQkxFRCAoZHJlZ19zdGF0 ZS5kYmdfcmVnc1swXS5jdHJsKSk7CisgIGRyZWdfc3RhdGUuZGJnX3JlZ3Nb MF0uY3RybCB8PSAxOworICBhc3NlcnQgKCBEUl9DT05UUk9MX0VOQUJMRUQg KGRyZWdfc3RhdGUuZGJnX3JlZ3NbMF0uY3RybCkpOworCisgIGFzc2VydCAo RFJfQ09OVFJPTF9MRU5HVEggKGRyZWdfc3RhdGUuZGJnX3JlZ3NbMF0uY3Ry bCkgPT0gMCk7CisgIGRyZWdfc3RhdGUuZGJnX3JlZ3NbMF0uY3RybCB8PSBs ZW5fbWFzayA8PCA1OworICBhc3NlcnQgKERSX0NPTlRST0xfTEVOR1RIIChk cmVnX3N0YXRlLmRiZ19yZWdzWzBdLmN0cmwpID09IGxlbl9tYXNrKTsKKwor ICBkcmVnX3N0YXRlLmRiZ19yZWdzWzBdLmN0cmwgfD0gMiA8PCAzOyAvLyB3 cml0ZQorICBkcmVnX3N0YXRlLmRiZ19yZWdzWzBdLmN0cmwgfD0gMiA8PCAx OyAvLyBHREI6ID8/PzogZW5hYmxlZCBhdCBlbDAKKyAgZHJlZ19zdGF0ZS5k YmdfcmVnc1swXS5hZGRyID0gKHVpbnRwdHJfdCkgYWRkcjsKKworICBpb3Yu aW92X2Jhc2UgPSAmZHJlZ19zdGF0ZTsKKyAgaW92Lmlvdl9sZW4gPSAob2Zm c2V0b2YgKHN0cnVjdCB1c2VyX2h3ZGVidWdfc3RhdGUsIGRiZ19yZWdzKQor ICAgICAgICAgICAgICAgICArIHNpemVvZiAoZHJlZ19zdGF0ZS5kYmdfcmVn c1swXSkpOworICBlcnJubyA9IDA7CisgIGwgPSBwdHJhY2UgKFBUUkFDRV9T RVRSRUdTRVQsIHBpZCwgTlRfQVJNX0hXX1dBVENILCAmaW92KTsKKyAgaWYg KGVycm5vICE9IDApCisgICAgZXJyb3IgKDEsIGVycm5vLCAiUFRSQUNFX1NF VFJFR1NFVDogTlRfQVJNX0hXX1dBVENIIik7CisgIGFzc2VydCAobCA9PSAw KTsKK30KKworc3RhdGljIHZvbGF0aWxlIGxvbmcgbG9uZyBjaGVjazsKKwor aW50CittYWluICh2b2lkKQoreworICBwaWRfdCBnb3RfcGlkOworICBpbnQg aSwgc3RhdHVzOworICBsb25nIGw7CisKKyAgYXRleGl0IChjbGVhbnVwKTsK KworICBjaGlsZCA9IGZvcmsgKCk7CisgIGFzc2VydCAoY2hpbGQgPj0gMCk7 CisgIGlmIChjaGlsZCA9PSAwKQorICAgIHsKKyAgICAgIGwgPSBwdHJhY2Ug KFBUUkFDRV9UUkFDRU1FLCAwLCBOVUxMLCBOVUxMKTsKKyAgICAgIGFzc2Vy dCAobCA9PSAwKTsKKyAgICAgIGkgPSByYWlzZSAoU0lHVVNSMSk7CisgICAg ICBhc3NlcnQgKGkgPT0gMCk7CisgICAgICBjaGVjayA9IC0xOworICAgICAg aSA9IHJhaXNlIChTSUdVU1IyKTsKKyAgICAgIC8qIE5PVFJFQUNIRUQgKi8K KyAgICAgIGFzc2VydCAoMCk7CisgICAgfQorCisgIGdvdF9waWQgPSB3YWl0 cGlkIChjaGlsZCwgJnN0YXR1cywgMCk7CisgIGFzc2VydCAoZ290X3BpZCA9 PSBjaGlsZCk7CisgIGFzc2VydCAoV0lGU1RPUFBFRCAoc3RhdHVzKSk7Cisg IGFzc2VydCAoV1NUT1BTSUcgKHN0YXR1cykgPT0gU0lHVVNSMSk7CisKKyAg ZXJybm8gPSAwOworICBsID0gcHRyYWNlIChQVFJBQ0VfQ09OVCwgY2hpbGQs IDBsLCAwbCk7CisgIGFzc2VydF9wZXJyb3IgKGVycm5vKTsKKyAgYXNzZXJ0 IChsID09IDApOworCisgIGdvdF9waWQgPSB3YWl0cGlkIChjaGlsZCwgJnN0 YXR1cywgMCk7CisgIGFzc2VydCAoZ290X3BpZCA9PSBjaGlsZCk7CisgIGFz c2VydCAoV0lGU1RPUFBFRCAoc3RhdHVzKSk7CisgIGlmIChXU1RPUFNJRyAo c3RhdHVzKSA9PSBTSUdVU1IyKQorICAgIHsKKyAgICAgIC8qIFdlIG1pc3Nl ZCB0aGUgd2F0Y2hwb2ludCAtIHVuc3VwcG9ydGVkIGJ5IGhhcmR3YXJlPyAg Ki8KKyAgICAgIGNsZWFudXAgKCk7CisgICAgICByZXR1cm4gMjsKKyAgICB9 CisgIGFzc2VydCAoV1NUT1BTSUcgKHN0YXR1cykgPT0gU0lHVFJBUCk7CisK KyAgY2xlYW51cCAoKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9n ZGIvdGVzdHN1aXRlL2dkYi5hcmNoL2FhcmNoNjQtZGJyZWctY29udGVudHMu ZXhwIGIvZ2RiL3Rlc3RzdWl0ZS9nZGIuYXJjaC9hYXJjaDY0LWRicmVnLWNv bnRlbnRzLmV4cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5mNmJlZTAyCi0tLSAvZGV2L251bGwKKysrIGIvZ2RiL3Rlc3RzdWl0ZS9n ZGIuYXJjaC9hYXJjaDY0LWRicmVnLWNvbnRlbnRzLmV4cApAQCAtMCwwICsx LDQ2IEBACisjIENvcHlyaWdodCAyMDE5IEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbiwgSW5jLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisjIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExp Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisjIHRoZSBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9y CisjIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisjCisj IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0 IGl0IHdpbGwgYmUgdXNlZnVsLAorIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFO VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UuICBTZWUgdGhlCisjIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl IGZvciBtb3JlIGRldGFpbHMuCisjCisjIFlvdSBzaG91bGQgaGF2ZSByZWNl aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl CisjIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0 dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorIworIyBNYWtlIHN1cmUg dGhhdCB0aGUgaW5mZXJpb3IgZG9lc24ndCBhc3NlcnQgYW5kIGV4aXRzIHN1 Y2Nlc3NmdWxseS4KKyMKKyMgVGhpcyB0ZXN0IGNoZWNrcyB0aGF0IEdEQiBk b2VzIG5vdCBhbHRlciB3YXRjaHBvaW50cyBzZXQgYnkgYW4gaW5mZXJpb3Iu CisjIEl0IHNldHMgYSB3YXRjaHBvaW50IG9uIG1lbW9yeSB0aGVuIHdyaXRl cyB0byB0aGUgd2F0Y2hlZCBtZW1vcnkuCisjIEl0IHdpbGwgZXhpdCB3aXRo IDEgaWYgdGhlIHdhdGNocG9pbnQgaXMgbm90IHJlYWNoZWQuCisjCisjIFNl ZSBQUiBicmVha3BvaW50cy8yMTg3MC4KKworaWYgeyFbaXNfYWFyY2g2NF90 YXJnZXRdfSB7CisgICAgdmVyYm9zZSAiU2tpcHBpbmcgJHtnZGJfdGVzdF9m aWxlX25hbWV9LiIKKyAgICByZXR1cm4KK30KKworc3RhbmRhcmRfdGVzdGZp bGUgLmMKKworaWYgeyBbZ2RiX2NvbXBpbGUgJHtzcmNkaXJ9LyR7c3ViZGly fS8ke3NyY2ZpbGV9ICR7YmluZmlsZX0gZXhlY3V0YWJsZSB7ZGVidWd9XSAh PSAiIiB9IHsKKyAgICAgdW50ZXN0ZWQgImZhaWxlZCB0byBjb21waWxlIgor ICAgICByZXR1cm4gLTEKK30KKworY2xlYW5fcmVzdGFydCAkdGVzdGZpbGUK Kworc2V0IHRlc3QgInJ1biB0byBleGl0IgorZ2RiX3Rlc3RfbXVsdGlwbGUg InJ1biIgIiR0ZXN0IiB7CisgICAgLXJlICJleGl0ZWQgd2l0aCBjb2RlIDAx LiokZ2RiX3Byb21wdCAkIiB7CisgICAgICAgIHBhc3MgIiR0ZXN0IgorICAg IH0KKyAgICAtcmUgImV4aXRlZCBub3JtYWxseS4qJGdkYl9wcm9tcHQgJCIg eworICAgICAgICBwYXNzICIkdGVzdCIKKyAgICB9Cit9Ci0tIAoxLjkuMQo= --------------C55B8ED5D1B100B137B51A40--