From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 43902C7EE2E for ; Fri, 9 Jun 2023 04:01:48 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=hdPoX9YXM8JMYJEBpPebkIxqjhZAxNp6UdFUEd8cR+8=; b=1vBr28RCW3/r+X h0JFEEJ4H2sEpPEmjj2+77BxvwUwF3ZcIiIVXN3TECnIQlBHosT5qpQ0OqzXWwPeOieMgoZWZFE+6 WRZ3SuZ0MPCK9VkvUPbNL7ZzcRhe2kz3TUFg+UkCukh5qkFcrAOcdEUoqEyZLnZFIaF9A2keKrQ0b +jz5/fq8/M9J+1b2h6qNlYz9MiLmz41mLcL+jX6Ca9MIivEigeYiu81otqjT+4t2HLFyvDiW5TJYG 7jorx2U8waKiQEZ33G9d/zUbHnxgkpxGgYKT0ghsOL4U2R5xu9t/Wqhx0rAbit8zLV+pBxJA+UJgD z4ae1Zin/Qq466GbJWgA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q7TJW-00BXhM-0G; Fri, 09 Jun 2023 04:01:26 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1q7TJS-00BXfb-0D for linux-arm-kernel@lists.infradead.org; Fri, 09 Jun 2023 04:01:24 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E5FCDAB6; Thu, 8 Jun 2023 21:02:00 -0700 (PDT) Received: from [10.163.44.201] (unknown [10.163.44.201]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E4B263F587; Thu, 8 Jun 2023 21:01:07 -0700 (PDT) Message-ID: <78cb22e2-c46e-d62d-fefc-b7963737499e@arm.com> Date: Fri, 9 Jun 2023 09:30:59 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 Subject: Re: [PATCH V11 05/10] arm64/perf: Add branch stack support in ARMV8 PMU Content-Language: en-US To: Suzuki K Poulose , Mark Rutland Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, catalin.marinas@arm.com, Mark Brown , James Clark , Rob Herring , Marc Zyngier , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , linux-perf-users@vger.kernel.org References: <20230531040428.501523-1-anshuman.khandual@arm.com> <20230531040428.501523-6-anshuman.khandual@arm.com> <290b577c-4740-d2e2-d236-c8bbe2f907b9@arm.com> From: Anshuman Khandual In-Reply-To: <290b577c-4740-d2e2-d236-c8bbe2f907b9@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230608_210122_217898_7838977E X-CRM114-Status: GOOD ( 32.95 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpPbiA2LzgvMjMgMTU6NDMsIFN1enVraSBLIFBvdWxvc2Ugd3JvdGU6Cj4gT24gMDYvMDYvMjAy MyAxMTozNCwgQW5zaHVtYW4gS2hhbmR1YWwgd3JvdGU6Cj4+Cj4+Cj4+IE9uIDYvNS8yMyAxNzoz NSwgTWFyayBSdXRsYW5kIHdyb3RlOgo+Pj4gT24gV2VkLCBNYXkgMzEsIDIwMjMgYXQgMDk6MzQ6 MjNBTSArMDUzMCwgQW5zaHVtYW4gS2hhbmR1YWwgd3JvdGU6Cj4+Pj4gVGhpcyBlbmFibGVzIHN1 cHBvcnQgZm9yIGJyYW5jaCBzdGFjayBzYW1wbGluZyBldmVudCBpbiBBUk1WOCBQTVUsIGNoZWNr aW5nCj4+Pj4gaGFzX2JyYW5jaF9zdGFjaygpIG9uIHRoZSBldmVudCBpbnNpZGUgJ3N0cnVjdCBh cm1fcG11JyBjYWxsYmFja3MuIEFsdGhvdWdoCj4+Pj4gdGhlc2UgYnJhbmNoIHN0YWNrIGhlbHBl cnMgYXJtdjhwbXVfYnJhbmNoX1hYWFhYKCkgYXJlIGp1c3QgZHVtbXkgZnVuY3Rpb25zCj4+Pj4g Zm9yIG5vdy4gV2hpbGUgaGVyZSwgdGhpcyBhbHNvIGRlZmluZXMgYXJtX3BtdSdzIHNjaGVkX3Rh c2soKSBjYWxsYmFjayB3aXRoCj4+Pj4gYXJtdjhwbXVfc2NoZWRfdGFzaygpLCB3aGljaCByZXNl dHMgdGhlIGJyYW5jaCByZWNvcmQgYnVmZmVyIG9uIGEgc2NoZWRfaW4uCj4+Pgo+Pj4gVGhpcyBn ZW5lcmFsbHkgbG9va3MgZ29vZCwgYnV0IEkgaGF2ZSBhIGZldyBjb21tZW50cyBiZWxvdy4KPj4+ Cj4+PiBbLi4uXQo+Pj4KPj4+PiArc3RhdGljIGlubGluZSBib29sIGFybXY4cG11X2JyYW5jaF92 YWxpZChzdHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIFdBUk5f T05fT05DRSghaGFzX2JyYW5jaF9zdGFjayhldmVudCkpOwo+Pj4+ICvCoMKgwqAgcmV0dXJuIGZh bHNlOwo+Pj4+ICt9Cj4+Pgo+Pj4gSUlVQyB0aGlzIGlzIGZvciB2YWxpZGF0aW5nIHRoZSBhdHRy LCBzbyBjb3VsZCB3ZSBwbGVhc2UgbmFtZSB0aGlzCj4+PiBhcm12OHBtdV9icmFuY2hfYXR0cl92 YWxpZCgpID8KPj4KPj4gU3VyZSwgd2lsbCBjaGFuZ2UgdGhlIG5hbWUgYW5kIHVwZGF0ZWQgY2Fs bCBzaXRlcy4KPj4KPj4+Cj4+PiBbLi4uXQo+Pj4KPj4+PiArc3RhdGljIGludCBicmFuY2hfcmVj b3Jkc19hbGxvYyhzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBz dHJ1Y3QgcG11X2h3X2V2ZW50cyAqZXZlbnRzOwo+Pj4+ICvCoMKgwqAgaW50IGNwdTsKPj4+PiAr Cj4+Pj4gK8KgwqDCoCBmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Cj4gCj4gU2hvdWxkbid0 IHRoaXMgYmUgc3VwcG9ydGVkX3BtdXMgPyBpLmUuCj4gwqDCoMKgwqBmb3JfZWFjaF9jcHUoY3B1 LCAmYXJtcG11LT5zdXBwb3J0ZWRfY3B1cykgewo+IAo+IAo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBl dmVudHMgPSBwZXJfY3B1X3B0cihhcm1wbXUtPmh3X2V2ZW50cywgY3B1KTsKPj4+PiArwqDCoMKg wqDCoMKgwqAgZXZlbnRzLT5icmFuY2hlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBicmFuY2hf cmVjb3JkcyksIEdGUF9LRVJORUwpOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIWV2ZW50cy0+ YnJhbmNoZXMpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIC1FTk9NRU07Cj4g Cj4gRG8gd2UgbmVlZCB0byBmcmVlIHRoZSBhbGxvY2F0ZWQgYnJhbmNoZXMgYWxyZWFkeSA/CgpU aGlzIGdldHMgZml4ZWQgaW4gdGhlIG5leHQgcGF0Y2ggdmlhIHBlci1jcHUgYWxsb2NhdGlvbi4g SSB3aWxsCm1vdmUgYW5kIGZvbGQgdGhlIGNvZGUgYmxvY2sgaW4gaGVyZS4gVXBkYXRlZCBmdW5j dGlvbiB3aWxsIGxvb2sKbGlrZSB0aGUgZm9sbG93aW5nLgoKc3RhdGljIGludCBicmFuY2hfcmVj b3Jkc19hbGxvYyhzdHJ1Y3QgYXJtX3BtdSAqYXJtcG11KQp7CiAgICAgICAgc3RydWN0IGJyYW5j aF9yZWNvcmRzIF9fcGVyY3B1ICpyZWNvcmRzOwogICAgICAgIGludCBjcHU7CgogICAgICAgIHJl Y29yZHMgPSBhbGxvY19wZXJjcHVfZ2ZwKHN0cnVjdCBicmFuY2hfcmVjb3JkcywgR0ZQX0tFUk5F TCk7CiAgICAgICAgaWYgKCFyZWNvcmRzKQogICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07 CgogICAgICAgIC8qCiAgICAgICAgICogRklYTUU6IE1lbW9yeSBhbGxvY2F0ZWQgdmlhIHJlY29y ZHMgZ2V0cyBjb21wbGV0ZWx5CiAgICAgICAgICogY29uc3VtZWQgaGVyZSwgbmV2ZXIgcmVxdWly ZWQgdG8gYmUgZnJlZWQgdXAgbGF0ZXIuIEhlbmNlCiAgICAgICAgICogbG9zaW5nIGFjY2VzcyB0 byBvbiBzdGFjayAncmVjb3JkcycgaXMgYWNjZXB0YWJsZS4KICAgICAgICAgKiBPdGhlcndpc2Ug dGhpcyBhbGxvYyBoYW5kbGUgaGFzIHRvIGJlIHNhdmVkIHNvbWUgd2hlcmUuCiAgICAgICAgICov CiAgICAgICAgZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgewogICAgICAgICAgICAgICAgc3Ry dWN0IHBtdV9od19ldmVudHMgKmV2ZW50c19jcHU7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgYnJh bmNoX3JlY29yZHMgKnJlY29yZHNfY3B1OwoKICAgICAgICAgICAgICAgIGV2ZW50c19jcHUgPSBw ZXJfY3B1X3B0cihhcm1wbXUtPmh3X2V2ZW50cywgY3B1KTsKICAgICAgICAgICAgICAgIHJlY29y ZHNfY3B1ID0gcGVyX2NwdV9wdHIocmVjb3JkcywgY3B1KTsKICAgICAgICAgICAgICAgIGV2ZW50 c19jcHUtPmJyYW5jaGVzID0gcmVjb3Jkc19jcHU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAw Owp9CgpSZWdhcmRpbmcgdGhlIGNwdW1hc2sgYXJndW1lbnQgaW4gZm9yX2VhY2hfY3B1KCkuCgot IGh3X2V2ZW50cyBpcyBhIF9fcGVyY3B1IHBvaW50ZXIgaW4gc3RydWN0IGFybV9wbXUKCgktIHBt dS0+aHdfZXZlbnRzID0gYWxsb2NfcGVyY3B1X2dmcChzdHJ1Y3QgcG11X2h3X2V2ZW50cywgR0ZQ X0tFUk5FTCkKCgotICdyZWNvcmRzJyBhYm92ZSBpcyBiZWluZyBhbGxvY2F0ZWQgdmlhIGFsbG9j X3BlcmNwdV9nZnAoKQoKCS0gcmVjb3JkcyA9IGFsbG9jX3BlcmNwdV9nZnAoc3RydWN0IGJyYW5j aF9yZWNvcmRzLCBHRlBfS0VSTkVMKQoKSWYgJ2FybXBtdS0+c3VwcG9ydGVkX2NwdXMnIG1hc2sg Z2V0cyB1c2VkIGluc3RlYWQgb2YgcG9zc2libGUgY3B1IG1hc2ssCndvdWxkIG5vdCB0aGVyZSBi ZSBzb21lIGRhbmdsaW5nIHBlci1jcHUgYnJhbmNoX3JlY29yZCBhbGxvY2F0ZWQgYXJlYXMsCnRo YXQgcmVtYWluIHVuc2lnbmVkID8gQXNzaWduaW5nIGFsbCBvZiB0aGVtIGJhY2sgaW50byBod19l dmVudHMgc2hvdWxkCmJlIGhhcm1sZXNzLgoKPiAKPj4+PiArwqDCoMKgIH0KPiAKPiAKPiBNYXkg YmU6Cj4gwqDCoMKgwqBpbnQgcmV0ID0gMDsKPiAKPiDCoMKgwqDCoGZvcl9lYWNoX2NwdShjcHUs ICZhcm1wbXUtPnN1cHBvcnRlZF9jcHVzKSB7Cj4gwqDCoMKgwqDCoMKgwqAgZXZlbnRzID0gcGVy X2NwdV9wdHIoYXJtcG11LT5od19ldmVudHMsIGNwdSk7Cj4gwqDCoMKgwqDCoMKgwqAgZXZlbnRz LT5icmFuY2hlcyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdMKgwqDCoMKgwqDCoMKgwqAgYnJhbmNo X3JlY29yZHMpLCBHRlBfS0VSTkVMKTsKPiDCoMKgwqDCoMKgwqDCoAo+IMKgwqDCoMKgwqDCoMKg IGlmICghZXZlbnRzLT5icmFuY2hlcykgewo+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0g LUVOT01FTTsKPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGJyZWFrOwo+IMKgwqDCoMKgwqDCoMKg IH0KPiDCoMKgwqDCoH0KPiAKPiDCoMKgwqDCoGlmICghcmV0KQo+IMKgwqDCoMKgwqDCoMKgIHJl dHVybiAwOwo+IAo+IMKgwqDCoMKgZm9yX2VhY2hfY3B1KGNwdSwgJmFybXBtdS0+c3VwcG9ydGVk X2NwdXMpIHsKPiDCoMKgwqDCoMKgwqDCoCBldmVudHMgPSBwZXJfY3B1X3B0cihhcm1wbXUtPmh3 X2V2ZW50cywgY3B1KTsKPiDCoMKgwqDCoMKgwqDCoCBpZiAoIWV2ZW50cy0+YnJhbmNoZXMpCj4g wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBicmVhazsKPiDCoMKgwqDCoMKgwqDCoCBrZnJlZShldmVu dHMtPmJyYW5jaGVzKTsKPiDCoMKgwqDCoH0KPiDCoMKgwqDCoHJldHVybiByZXQ7Cj4gwqDCoMKg wqAKPj4+PiArwqDCoMKgIHJldHVybiAwOwo+Pj4KPj4+IFRoaXMgbGVha3MgbWVtb3J5IGlmIGFu eSBhbGxvY2F0aW9uIGZhaWxzLCBhbmQgdGhlIG5leHQgcGF0Y2ggcmVwbGFjZXMgdGhpcwo+Pj4g Y29kZSBlbnRpcmVseS4KPj4KPj4gT2theS4KPj4KPj4+Cj4+PiBQbGVhc2UgYWRkIHRoaXMgb25j ZSBpbiBhIHdvcmtpbmcgc3RhdGUuIEVpdGhlciB1c2UgdGhlIHBlcmNwdSBhbGxvY2F0aW9uCj4+ PiB0cmljayBpbiB0aGUgbmV4dCBwYXRjaCBmcm9tIHRoZSBzdGFydCwgb3IgaGF2ZSB0aGlzIGt6 YWxsb2MoKSB3aXRoIGEKPj4+IGNvcnJlc3BvbmRpbmcga2ZyZWUoKSBpbiBhbiBlcnJvciBwYXRo Lgo+Pgo+PiBJIHdpbGwgY2hhbmdlIGJyYW5jaF9yZWNvcmRzX2FsbG9jKCkgYXMgc3VnZ2VzdGVk IGluIHRoZSBuZXh0IHBhdGNoJ3MgdGhyZWFkCj4+IGFuZCBmb2xkIHRob3NlIGNoYW5nZXMgaGVy ZSBpbiB0aGlzIHBhdGNoLgo+Pgo+Pj4KPj4+PiDCoCB9Cj4+Pj4gwqAgwqAgc3RhdGljIGludCBh cm12OHBtdV9wcm9iZV9wbXUoc3RydWN0IGFybV9wbXUgKmNwdV9wbXUpCj4+Pj4gQEAgLTExNDUs MTIgKzExNjIsMjQgQEAgc3RhdGljIGludCBhcm12OHBtdV9wcm9iZV9wbXUoc3RydWN0IGFybV9w bXUgKmNwdV9wbXUpCj4+Pj4gwqDCoMKgwqDCoCB9Owo+Pj4+IMKgwqDCoMKgwqAgaW50IHJldDsK Pj4+PiDCoCArwqDCoMKgIHJldCA9IGFybXY4cG11X3ByaXZhdGVfYWxsb2MoY3B1X3BtdSk7Cj4+ Pj4gK8KgwqDCoCBpZiAocmV0KQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gcmV0Owo+Pj4+ ICsKPj4+PiDCoMKgwqDCoMKgIHJldCA9IHNtcF9jYWxsX2Z1bmN0aW9uX2FueSgmY3B1X3BtdS0+ c3VwcG9ydGVkX2NwdXMsCj4+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIF9fYXJtdjhwbXVfcHJvYmVfcG11LAo+Pj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoCAmcHJvYmUsIDEpOwo+Pj4+IMKgwqDCoMKgwqAgaWYgKHJldCkK Pj4+PiDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsKPj4+PiDCoCArwqDCoMKgIGlmIChh cm1fcG11X2JyYW5jaF9zdGFja19zdXBwb3J0ZWQoY3B1X3BtdSkpIHsKPj4+PiArwqDCoMKgwqDC oMKgwqAgcmV0ID0gYnJhbmNoX3JlY29yZHNfYWxsb2MoY3B1X3BtdSk7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGlmIChyZXQpCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsK Pj4+PiArwqDCoMKgIH0gZWxzZSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGFybXY4cG11X3ByaXZh dGVfZnJlZShjcHVfcG11KTsKPj4+PiArwqDCoMKgIH0KPj4+Cj4+PiBJIHNlZSBmcm9tIHRoZSBu ZXh0IHBhdGNoIHRoYXQgInByaXZhdGUiIGlzIGZvdXIgaW50cywgc28gcGxlYXNlIGp1c3QgYWRk IHRoYXQKPj4+IHRvIHN0cnVjdCBhcm1fcG11IHVuZGVyIGFuIGlmZGVmIENPTkZJR19BUk02NF9C UkJFLiBUaGF0J2xsIHNpbXBsaWZ5IHRoaXMsIGFuZAo+Pj4gaWYgd2UgZW5kIHVwIG5lZWRpbmcg bW9yZSBzcGFjZSBpbiBmdXR1cmUgd2UgY2FuIGNvbnNpZGVyIGZhY3RvcmluZyBpdCBvdXQuCj4+ Cj4+IHN0cnVjdCBhcm1fcG11IHsKPj4gwqDCoMKgwqAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4u Li4uLi4uLi4uLi4uLi4uCj4+IMKgwqDCoMKgwqDCoMKgwqAgLyogSW1wbGVtZW50YXRpb24gc3Bl Y2lmaWMgYXR0cmlidXRlcyAqLwo+PiDCoMKgwqDCoMKgwqDCoMKgIHZvaWTCoMKgwqDCoMKgwqDC oMKgwqDCoMKgICpwcml2YXRlOwo+PiB9Cj4+Cj4+IHByaXZhdGUgcG9pbnRlciBoZXJlIGNyZWF0 ZXMgYW4gYWJzdHJhY3Rpb24gZm9yIGdpdmVuIHBtdSBpbXBsZW1lbnRhdGlvbgo+PiB0byBoaWRl IGF0dHJpYnV0ZSBkZXRhaWxzIHdpdGhvdXQgbWFraW5nIGl0IGtub3duIHRvIGNvcmUgYXJtIHBt dSBsYXllci4KPj4gQWx0aG91Z2ggYWRkaW5nIGlmZGVmIENPTkZJR19BUk02NF9CUkJFIHNvbHZl cyB0aGUgcHJvYmxlbSBhcyBtZW50aW9uZWQKPj4gYWJvdmUsIGl0IGRvZXMgYnJlYWsgdGhhdCBh YnN0cmFjdGlvbi4gQ3VycmVudGx5IGFybV9wbXUgbGF5ZXIgaXMgYXdhcmUKPj4gYWJvdXQgJ2Jy YW5jaCByZWNvcmRzJyBidXQgbm90IGFib3V0IEJSQkUgaW4gcGFydGljdWxhciB3aGljaCB0aGUg ZHJpdmVyCj4+IGFkZHMgbGF0ZXIgb24uIEkgc3VnZ2VzdCB3ZSBzaG91bGQgbm90IGJyZWFrIHRo YXQgYWJzdHJhY3Rpb24uCj4+Cj4+IEluc3RlYWQgYSBnbG9iYWwgJ3N0YXRpYyBzdHJ1Y3QgYnJi ZV9od19hdHRyJyBpbiBkcml2ZXJzL3BlcmYvYXJtX2JyYmUuYwo+PiBjYW4gYmUgaW5pdGlhbGl6 ZWQgaW50byBhcm1fcG11LT5wcml2YXRlIGR1cmluZyBhcm12OHBtdV9icmFuY2hfcHJvYmUoKSwK Pj4gd2hpY2ggd2lsbCBhbHNvIHNvbHZlIHRoZSBhbGxvY2F0aW9uLWZyZWUgcHJvYmxlbS4gQWxz byBzaW1pbGFyIGhlbHBlcnMKPj4gYXJtdjhwbXVfdGFza19jdHhfYWxsb2MoKS9mcmVlKCkgY291 bGQgYmUgZGVmaW5lZCB0byBtYW5hZ2UgdGFzayBjb250ZXh0Cj4+IGNhY2hlIGkuZSBhcm1fcG11 LT5wbXUudGFza19jdHhfY2FjaGUgaW5kZXBlbmRlbnRseS4KPj4KPj4gQnV0IG5vdyBhcm12OHBt dV90YXNrX2N0eF9hbGxvYygpIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgcG11IHByb2JlIGNvbmZpcm1z Cj4+IHRvIGhhdmUgYXJtX3BtdS0+aGFzX2JyYW5jaF9zdGFjay4KPj4KPj4+Cj4+Pj4gKwo+Pj4+ IMKgwqDCoMKgwqAgcmV0dXJuIHByb2JlLnByZXNlbnQgPyAwIDogLUVOT0RFVjsKPj4+PiDCoCB9 Cj4+Pgo+Pj4gSXQgYWxzbyBzZWVtcyBvZGQgdG8gY2VjayBwcm9iZS5wcmVzZW50ICphZnRlciog Y2hlY2tpbmcKPj4+IGFybV9wbXVfYnJhbmNoX3N0YWNrX3N1cHBvcnRlZCgpLgo+Pgo+PiBJIHdp bGwgcmVvcmdhbml6ZSBhcyBzdWdnZXN0ZWQgYmVsb3cuCj4+Cj4+Pgo+Pj4gV2l0aCB0aGUgYWxs b2NhdGlvbiByZW1vdmVkIEkgdGhpbmsgdGhpcyBjYW4gYmUgd3JpdHRlbiBtb3JlIGNsZWFybHkg YXM6Cj4+Pgo+Pj4gfCBzdGF0aWMgaW50IGFybXY4cG11X3Byb2JlX3BtdShzdHJ1Y3QgYXJtX3Bt dSAqY3B1X3BtdSkKPj4+IHwgewo+Pj4gfMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGFybXY4cG11 X3Byb2JlX2luZm8gcHJvYmUgPSB7Cj4+PiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqAgLnBtdSA9IGNwdV9wbXUsCj4+PiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAg LnByZXNlbnQgPSBmYWxzZSwKPj4+IHzCoMKgwqDCoMKgwqDCoMKgIH07Cj4+PiB8wqDCoMKgwqDC oMKgwqDCoCBpbnQgcmV0Owo+Pj4gfAo+Pj4gfMKgwqDCoMKgwqDCoMKgwqAgcmV0ID0gc21wX2Nh bGxfZnVuY3Rpb25fYW55KCZjcHVfcG11LT5zdXBwb3J0ZWRfY3B1cywKPj4+IHzCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqAgX19hcm12OHBtdV9wcm9iZV9wbXUsCj4+PiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICZwcm9iZSwg MSk7Cj4+PiB8wqDCoMKgwqDCoMKgwqDCoCBpZiAocmV0KQo+Pj4gfMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7ID4gfAo+Pj4gfMKgwqDCoMKgwqDCoMKgwqAgaWYg KCFwcm9iZS5wcmVzZW50KQo+Pj4gfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJl dHVybiAtRU5PREVWOwo+Pj4gfAo+Pj4gfMKgwqDCoMKgwqDCoMKgwqAgaWYgKGFybV9wbXVfYnJh bmNoX3N0YWNrX3N1cHBvcnRlZChjcHVfcG11KSkKPj4+IHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCByZXQgPSBicmFuY2hfcmVjb3Jkc19hbGxvYyhjcHVfcG11KTsKPj4+IHwKPj4+ IHzCoMKgwqDCoMKgwqDCoMKgIHJldHVybiByZXQ7Cj4+PiB8IH0KPiAKPiBDb3VsZCB3ZSBub3Qg c2ltcGxpZnkgdGhpcyBhcyBiZWxvdyBhbmQga2VlcCB0aGUgYWJzdHJhY3Rpb24sIHNpbmNlIHdl Cj4gYWxyZWFkeSBoYXZlIGl0ID8KCk5vLCB0aGVyZSBpcyBhbiBhbGxvY2F0aW9uIGRlcGVuZGVu Y3kgYmVmb3JlIHRoZSBzbXAgY2FsbCBjb250ZXh0LgogCj4gCj4+PiB8IHN0YXRpYyBpbnQgYXJt djhwbXVfcHJvYmVfcG11KHN0cnVjdCBhcm1fcG11ICpjcHVfcG11KQo+Pj4gfCB7Cj4+PiB8wqDC oMKgwqDCoMKgwqDCoCBzdHJ1Y3QgYXJtdjhwbXVfcHJvYmVfaW5mbyBwcm9iZSA9IHsKPj4+IHzC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAucG11ID0gY3B1X3BtdSwKPj4+IHzCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAucHJlc2VudCA9IGZhbHNlLAo+Pj4gfMKgwqDC oMKgwqDCoMKgwqAgfTsKPj4+IHzCoMKgwqDCoMKgwqDCoMKgIGludCByZXQ7Cj4+PiB8Cj4+PiB8 wqDCoMKgwqDCoMKgwqDCoCByZXQgPSBzbXBfY2FsbF9mdW5jdGlvbl9hbnkoJmNwdV9wbXUtPnN1 cHBvcnRlZF9jcHVzLAo+Pj4gfMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBfX2FybXY4cG11X3Byb2JlX3BtdSwK Pj4+IHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgJnByb2JlLCAxKTsKPj4+IHzCoMKgwqDCoMKgwqDCoMKgIGlm IChyZXQpCj4+PiB8wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHJldDsK Pj4+IHzCoMKgwqDCoMKgwqDCoMKgIGlmICghcHJvYmUucHJlc2VudCkKPj4+IHzCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT0RFVjsKPj4+IHwKPj4+IHzCoMKgwqDC oMKgwqDCoMKgwqDCoCBpZiAoIWFybV9wbXVfYnJhbmNoX3N0YWNrX3N1cHBvcnRlZChjcHVfcG11 KSkKPj4+IHzCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+PiB8Cj4+PiB8wqDC oMKgwqDCoMKgwqDCoCByZXQgPSBhcm12OHBtdV9wcml2YXRlX2FsbG9jKGNwdV9wbXUpOwoKVGhp cyBuZWVkcyB0byBiZSBhbGxvY2F0ZWQgYmVmb3JlIGVhY2ggc3VwcG9ydGVkIFBNVSBnZXRzIHBy b2JlZCB2aWEKX19hcm12OHBtdV9wcm9iZV9wbXUoKSBpbnNpZGUgc21wX2NhbGxfZnVuY3Rpb25f YW55KCkgY2FsbGJhY2tzIHRoYXQKdW5mb3J0dW5hdGVseSBjYW5ub3QgZG8gbWVtb3J5IGFsbG9j YXRpb24uCgo+Pj4gfMKgwqDCoMKgwqDCoMKgwqAgaWYgKHJldCkKPj4+IHzCoMKgwqDCoMKgwqDC oMKgIHJldHVybiByZXQ7Cj4+PiB8wqDCoMKgwqDCoMKgwqAKPj4+IHzCoMKgwqDCoMKgwqDCoMKg wqAgcmV0ID0gYnJhbmNoX3JlY29yZHNfYWxsb2MoY3B1X3BtdSk7Cj4+PiB8wqDCoMKgwqDCoMKg wqDCoMKgIGlmIChyZXQpCj4+PiB8wqDCoMKgwqDCoMKgwqDCoMKgIGFybXY4cG11X3ByaXZhdGVf ZnJlZShjcHVfcG11KTsKPj4+IHzCoMKgwqDCoMKgwqDCoAo+Pj4gfMKgwqDCoMKgwqDCoMKgIHJl dHVybiByZXQ7Cj4+PiB8IH0KCkNoYW5naW5nIHRoZSBhYnN0cmFjdGlvbiB3aWxsIGNhdXNlIHRv byBtdWNoIGNvZGUgY2h1cm4sIHRoaXMgbGF0ZSBpbgp0aGUgZGV2ZWxvcG1lbnQgcGhhc2UsIHdo aWNoIHNob3VsZCBiZSBhdm9pZGVkIElNSE8uCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1h cm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcv bWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==