From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 6FDFF1E898 for ; Tue, 30 Jan 2024 03:41:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706586099; cv=none; b=UAbNEBFNfYhKDoGnzOjot7ko270jdbp/m2nN0xkGrkMHUteQdancJ8UxpnN6u+ht+HWgQhmx/6H5hz8Ba0WRLEt+7FGGALkUu9BRmdxST0/W8TARn4UX5QQSciVWNHXRtKG6r7WFZg8dAV6OFuAbMVrD64R+V7gVi3dbf8gn7bc= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1706586099; c=relaxed/simple; bh=MS9XkrHIxAOgVMwkPgUdkJNkZsvXrigVFaMPH+MQ3tg=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=G4c7qY+2+qfpPolS4Vur3iUf+g3Wkzf49raIc7dAmDNOWmPbzD4TPOXyK5d8pk1L9hrwXsZRKraVvAfN5pBqn+m8JVndXSrsMLCKkeIy5xhnnGg8wJf/bVZ76ZUqaXNsZT1aLE2RJJanpsjvCy62C/0Lg4sx9lZXMJJ5lXM72ZI= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com 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 B6419DA7; Mon, 29 Jan 2024 19:42:20 -0800 (PST) Received: from [10.163.41.110] (unknown [10.163.41.110]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CE7BE3F738; Mon, 29 Jan 2024 19:41:30 -0800 (PST) Message-ID: Date: Tue, 30 Jan 2024 09:11:30 +0530 Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH V16 5/8] KVM: arm64: nvhe: Disable branch generation in nVHE guests Content-Language: en-US To: Suzuki K Poulose , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, catalin.marinas@arm.com, mark.rutland@arm.com Cc: Mark Brown , James Clark , Rob Herring , Marc Zyngier , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , linux-perf-users@vger.kernel.org, Oliver Upton , James Morse , kvmarm@lists.linux.dev References: <20240125094119.2542332-1-anshuman.khandual@arm.com> <20240125094119.2542332-6-anshuman.khandual@arm.com> From: Anshuman Khandual In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 1/29/24 17:50, Suzuki K Poulose wrote: > On 25/01/2024 09:41, Anshuman Khandual wrote: >> Disable the BRBE before we enter the guest, saving the status and enable it >> back once we get out of the guest. This avoids capturing branch records in >> the guest kernel or userspace, which would be confusing the host samples. >> >> Cc: Marc Zyngier >> Cc: Oliver Upton >> Cc: James Morse >> Cc: Suzuki K Poulose >> Cc: Catalin Marinas >> Cc: Will Deacon >> Cc: kvmarm@lists.linux.dev >> Cc: linux-arm-kernel@lists.infradead.org >> CC: linux-kernel@vger.kernel.org >> Signed-off-by: Anshuman Khandual >> --- >> Changes in V16: >> >> - Dropped BRBCR_EL1 and BRBFCR_EL1 from enum vcpu_sysreg >> - Reverted back the KVM NVHE patch - used host_debug_state based 'brbcr_el1' >>    element, and dropped the previous dependency on Jame's coresight series >> >>   arch/arm64/include/asm/kvm_host.h  |  5 ++++- >>   arch/arm64/kvm/debug.c             |  5 +++++ >>   arch/arm64/kvm/hyp/nvhe/debug-sr.c | 33 ++++++++++++++++++++++++++++++ >>   3 files changed, 42 insertions(+), 1 deletion(-) >> >> diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h >> index 21c57b812569..bce8792092af 100644 >> --- a/arch/arm64/include/asm/kvm_host.h >> +++ b/arch/arm64/include/asm/kvm_host.h >> @@ -569,7 +569,7 @@ struct kvm_vcpu_arch { >>       u8 cflags; >>         /* Input flags to the hypervisor code, potentially cleared after use */ >> -    u8 iflags; >> +    u16 iflags; >>         /* State flags for kernel bookkeeping, unused by the hypervisor code */ >>       u8 sflags; >> @@ -610,6 +610,7 @@ struct kvm_vcpu_arch { >>           u64 pmscr_el1; >>           /* Self-hosted trace */ >>           u64 trfcr_el1; >> +        u64 brbcr_el1; >>       } host_debug_state; >>         /* VGIC state */ >> @@ -779,6 +780,8 @@ struct kvm_vcpu_arch { >>   #define DEBUG_STATE_SAVE_TRBE    __vcpu_single_flag(iflags, BIT(6)) >>   /* vcpu running in HYP context */ >>   #define VCPU_HYP_CONTEXT    __vcpu_single_flag(iflags, BIT(7)) >> +/* Save BRBE context if active  */ >> +#define DEBUG_STATE_SAVE_BRBE    __vcpu_single_flag(iflags, BIT(8)) >>     /* SVE enabled for host EL0 */ >>   #define HOST_SVE_ENABLED    __vcpu_single_flag(sflags, BIT(0)) >> diff --git a/arch/arm64/kvm/debug.c b/arch/arm64/kvm/debug.c >> index 8725291cb00a..99f85d8acbf3 100644 >> --- a/arch/arm64/kvm/debug.c >> +++ b/arch/arm64/kvm/debug.c >> @@ -335,10 +335,15 @@ void kvm_arch_vcpu_load_debug_state_flags(struct kvm_vcpu *vcpu) >>       if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_TraceBuffer_SHIFT) && >>           !(read_sysreg_s(SYS_TRBIDR_EL1) & TRBIDR_EL1_P)) >>           vcpu_set_flag(vcpu, DEBUG_STATE_SAVE_TRBE); >> + >> +    /* Check if we have BRBE implemented and available at the host */ >> +    if (cpuid_feature_extract_unsigned_field(dfr0, ID_AA64DFR0_EL1_BRBE_SHIFT)) >> +        vcpu_set_flag(vcpu, DEBUG_STATE_SAVE_BRBE); >>   } >>     void kvm_arch_vcpu_put_debug_state_flags(struct kvm_vcpu *vcpu) >>   { >>       vcpu_clear_flag(vcpu, DEBUG_STATE_SAVE_SPE); >>       vcpu_clear_flag(vcpu, DEBUG_STATE_SAVE_TRBE); >> +    vcpu_clear_flag(vcpu, DEBUG_STATE_SAVE_BRBE); >>   } >> diff --git a/arch/arm64/kvm/hyp/nvhe/debug-sr.c b/arch/arm64/kvm/hyp/nvhe/debug-sr.c >> index 4558c02eb352..79bcf0fb1326 100644 >> --- a/arch/arm64/kvm/hyp/nvhe/debug-sr.c >> +++ b/arch/arm64/kvm/hyp/nvhe/debug-sr.c >> @@ -79,6 +79,34 @@ static void __debug_restore_trace(u64 trfcr_el1) >>       write_sysreg_s(trfcr_el1, SYS_TRFCR_EL1); >>   } >>   +static void __debug_save_brbe(u64 *brbcr_el1) >> +{ >> +    *brbcr_el1 = 0; >> + >> +    /* Check if the BRBE is enabled */ >> +    if (!(read_sysreg_s(SYS_BRBCR_EL1) & (BRBCR_ELx_E0BRE | BRBCR_ELx_ExBRE))) >> +        return; >> + >> +    /* >> +     * Prohibit branch record generation while we are in guest. >> +     * Since access to BRBCR_EL1 is trapped, the guest can't >> +     * modify the filtering set by the host. >> +     */ >> +    *brbcr_el1 = read_sysreg_s(SYS_BRBCR_EL1); >> +    write_sysreg_s(0, SYS_BRBCR_EL1); >> +    isb(); > > Is this isb() required here ? This can be synchronised with the Guest entry ? > >> +} >> + >> +static void __debug_restore_brbe(u64 brbcr_el1) >> +{ >> +    if (!brbcr_el1) >> +        return; >> + >> +    /* Restore BRBE controls */ >> +    write_sysreg_s(brbcr_el1, SYS_BRBCR_EL1); >> +    isb(); > > Similarly here, exit back to EL1 host can synchronise the setting ? Sure, will drop both the isb() here. 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 A41EAC47DA9 for ; Tue, 30 Jan 2024 03:41:51 +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=wrqrkGF82C0FK7moTLhlsOM5cLs7rn5PJsmC+7a3H24=; b=fFCXpEXJdWWJc0 JA9V5Zwi2CWGbtm21v8aMKjqiquRvXEmAX/8n6c1qrHBUckZBENB0sPpUVYwxH5fvdhW61qkpfBoC MX9SpUSeCmnZ5NAzB3DcLFmYu29Ysj5bM7vAJyvbCegcUPBSwKqX86VceCfYicE0h50U+Y1lx4kFf Bkl2FUm7GhHfIVigZn3TY2cKDKXGumfb5DA6LERfuGqhbVGtlCvkdA4L8B1ukRJUSzJZN89Kw0bc2 AZDQGkMcKXXq4xWoPDP/oflcLc59bo/ztoJa1fL0MywmLTK4rLF/Mt5+33z94e+gNLzAvALTW8LUL Umybv6gHsSUl/QBVSwig==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rUf0I-0000000F9xA-0jw0; Tue, 30 Jan 2024 03:41:42 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rUf0F-0000000F9wU-2P75 for linux-arm-kernel@lists.infradead.org; Tue, 30 Jan 2024 03:41:41 +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 B6419DA7; Mon, 29 Jan 2024 19:42:20 -0800 (PST) Received: from [10.163.41.110] (unknown [10.163.41.110]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id CE7BE3F738; Mon, 29 Jan 2024 19:41:30 -0800 (PST) Message-ID: Date: Tue, 30 Jan 2024 09:11:30 +0530 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH V16 5/8] KVM: arm64: nvhe: Disable branch generation in nVHE guests Content-Language: en-US To: Suzuki K Poulose , linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, will@kernel.org, catalin.marinas@arm.com, mark.rutland@arm.com Cc: Mark Brown , James Clark , Rob Herring , Marc Zyngier , Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , linux-perf-users@vger.kernel.org, Oliver Upton , James Morse , kvmarm@lists.linux.dev References: <20240125094119.2542332-1-anshuman.khandual@arm.com> <20240125094119.2542332-6-anshuman.khandual@arm.com> From: Anshuman Khandual In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240129_194139_731690_3FCAFDFA X-CRM114-Status: GOOD ( 22.06 ) 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 CgpPbiAxLzI5LzI0IDE3OjUwLCBTdXp1a2kgSyBQb3Vsb3NlIHdyb3RlOgo+IE9uIDI1LzAxLzIw MjQgMDk6NDEsIEFuc2h1bWFuIEtoYW5kdWFsIHdyb3RlOgo+PiBEaXNhYmxlIHRoZSBCUkJFIGJl Zm9yZSB3ZSBlbnRlciB0aGUgZ3Vlc3QsIHNhdmluZyB0aGUgc3RhdHVzIGFuZCBlbmFibGUgaXQK Pj4gYmFjayBvbmNlIHdlIGdldCBvdXQgb2YgdGhlIGd1ZXN0LiBUaGlzIGF2b2lkcyBjYXB0dXJp bmcgYnJhbmNoIHJlY29yZHMgaW4KPj4gdGhlIGd1ZXN0IGtlcm5lbCBvciB1c2Vyc3BhY2UsIHdo aWNoIHdvdWxkIGJlIGNvbmZ1c2luZyB0aGUgaG9zdCBzYW1wbGVzLgo+Pgo+PiBDYzogTWFyYyBa eW5naWVyIDxtYXpAa2VybmVsLm9yZz4KPj4gQ2M6IE9saXZlciBVcHRvbiA8b2xpdmVyLnVwdG9u QGxpbnV4LmRldj4KPj4gQ2M6IEphbWVzIE1vcnNlIDxqYW1lcy5tb3JzZUBhcm0uY29tPgo+PiBD YzogU3V6dWtpIEsgUG91bG9zZSA8c3V6dWtpLnBvdWxvc2VAYXJtLmNvbT4KPj4gQ2M6IENhdGFs aW4gTWFyaW5hcyA8Y2F0YWxpbi5tYXJpbmFzQGFybS5jb20+Cj4+IENjOiBXaWxsIERlYWNvbiA8 d2lsbEBrZXJuZWwub3JnPgo+PiBDYzoga3ZtYXJtQGxpc3RzLmxpbnV4LmRldgo+PiBDYzogbGlu dXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCj4+IENDOiBsaW51eC1rZXJuZWxAdmdl ci5rZXJuZWwub3JnCj4+IFNpZ25lZC1vZmYtYnk6IEFuc2h1bWFuIEtoYW5kdWFsIDxhbnNodW1h bi5raGFuZHVhbEBhcm0uY29tPgo+PiAtLS0KPj4gQ2hhbmdlcyBpbiBWMTY6Cj4+Cj4+IC0gRHJv cHBlZCBCUkJDUl9FTDEgYW5kIEJSQkZDUl9FTDEgZnJvbSBlbnVtIHZjcHVfc3lzcmVnCj4+IC0g UmV2ZXJ0ZWQgYmFjayB0aGUgS1ZNIE5WSEUgcGF0Y2ggLSB1c2VkIGhvc3RfZGVidWdfc3RhdGUg YmFzZWQgJ2JyYmNyX2VsMScKPj4gwqDCoCBlbGVtZW50LCBhbmQgZHJvcHBlZCB0aGUgcHJldmlv dXMgZGVwZW5kZW5jeSBvbiBKYW1lJ3MgY29yZXNpZ2h0IHNlcmllcwo+Pgo+PiDCoCBhcmNoL2Fy bTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmjCoCB8wqAgNSArKysrLQo+PiDCoCBhcmNoL2FybTY0 L2t2bS9kZWJ1Zy5jwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHzCoCA1ICsrKysrCj4+IMKgIGFy Y2gvYXJtNjQva3ZtL2h5cC9udmhlL2RlYnVnLXNyLmMgfCAzMyArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKPj4gwqAgMyBmaWxlcyBjaGFuZ2VkLCA0MiBpbnNlcnRpb25zKCspLCAxIGRl bGV0aW9uKC0pCj4+Cj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9o b3N0LmggYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgKPj4gaW5kZXggMjFjNTdi ODEyNTY5Li5iY2U4NzkyMDkyYWYgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQvaW5jbHVkZS9h c20va3ZtX2hvc3QuaAo+PiArKysgYi9hcmNoL2FybTY0L2luY2x1ZGUvYXNtL2t2bV9ob3N0LmgK Pj4gQEAgLTU2OSw3ICs1NjksNyBAQCBzdHJ1Y3Qga3ZtX3ZjcHVfYXJjaCB7Cj4+IMKgwqDCoMKg wqAgdTggY2ZsYWdzOwo+PiDCoCDCoMKgwqDCoMKgIC8qIElucHV0IGZsYWdzIHRvIHRoZSBoeXBl cnZpc29yIGNvZGUsIHBvdGVudGlhbGx5IGNsZWFyZWQgYWZ0ZXIgdXNlICovCj4+IC3CoMKgwqAg dTggaWZsYWdzOwo+PiArwqDCoMKgIHUxNiBpZmxhZ3M7Cj4+IMKgIMKgwqDCoMKgwqAgLyogU3Rh dGUgZmxhZ3MgZm9yIGtlcm5lbCBib29ra2VlcGluZywgdW51c2VkIGJ5IHRoZSBoeXBlcnZpc29y IGNvZGUgKi8KPj4gwqDCoMKgwqDCoCB1OCBzZmxhZ3M7Cj4+IEBAIC02MTAsNiArNjEwLDcgQEAg c3RydWN0IGt2bV92Y3B1X2FyY2ggewo+PiDCoMKgwqDCoMKgwqDCoMKgwqAgdTY0IHBtc2NyX2Vs MTsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgIC8qIFNlbGYtaG9zdGVkIHRyYWNlICovCj4+IMKgwqDC oMKgwqDCoMKgwqDCoCB1NjQgdHJmY3JfZWwxOwo+PiArwqDCoMKgwqDCoMKgwqAgdTY0IGJyYmNy X2VsMTsKPj4gwqDCoMKgwqDCoCB9IGhvc3RfZGVidWdfc3RhdGU7Cj4+IMKgIMKgwqDCoMKgwqAg LyogVkdJQyBzdGF0ZSAqLwo+PiBAQCAtNzc5LDYgKzc4MCw4IEBAIHN0cnVjdCBrdm1fdmNwdV9h cmNoIHsKPj4gwqAgI2RlZmluZSBERUJVR19TVEFURV9TQVZFX1RSQkXCoMKgwqAgX192Y3B1X3Np bmdsZV9mbGFnKGlmbGFncywgQklUKDYpKQo+PiDCoCAvKiB2Y3B1IHJ1bm5pbmcgaW4gSFlQIGNv bnRleHQgKi8KPj4gwqAgI2RlZmluZSBWQ1BVX0hZUF9DT05URVhUwqDCoMKgIF9fdmNwdV9zaW5n bGVfZmxhZyhpZmxhZ3MsIEJJVCg3KSkKPj4gKy8qIFNhdmUgQlJCRSBjb250ZXh0IGlmIGFjdGl2 ZcKgICovCj4+ICsjZGVmaW5lIERFQlVHX1NUQVRFX1NBVkVfQlJCRcKgwqDCoCBfX3ZjcHVfc2lu Z2xlX2ZsYWcoaWZsYWdzLCBCSVQoOCkpCj4+IMKgIMKgIC8qIFNWRSBlbmFibGVkIGZvciBob3N0 IEVMMCAqLwo+PiDCoCAjZGVmaW5lIEhPU1RfU1ZFX0VOQUJMRUTCoMKgwqAgX192Y3B1X3Npbmds ZV9mbGFnKHNmbGFncywgQklUKDApKQo+PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vZGVi dWcuYyBiL2FyY2gvYXJtNjQva3ZtL2RlYnVnLmMKPj4gaW5kZXggODcyNTI5MWNiMDBhLi45OWY4 NWQ4YWNiZjMgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL2RlYnVnLmMKPj4gKysrIGIv YXJjaC9hcm02NC9rdm0vZGVidWcuYwo+PiBAQCAtMzM1LDEwICszMzUsMTUgQEAgdm9pZCBrdm1f YXJjaF92Y3B1X2xvYWRfZGVidWdfc3RhdGVfZmxhZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+ PiDCoMKgwqDCoMKgIGlmIChjcHVpZF9mZWF0dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoZGZy MCwgSURfQUE2NERGUjBfRUwxX1RyYWNlQnVmZmVyX1NISUZUKSAmJgo+PiDCoMKgwqDCoMKgwqDC oMKgwqAgIShyZWFkX3N5c3JlZ19zKFNZU19UUkJJRFJfRUwxKSAmIFRSQklEUl9FTDFfUCkpCj4+ IMKgwqDCoMKgwqDCoMKgwqDCoCB2Y3B1X3NldF9mbGFnKHZjcHUsIERFQlVHX1NUQVRFX1NBVkVf VFJCRSk7Cj4+ICsKPj4gK8KgwqDCoCAvKiBDaGVjayBpZiB3ZSBoYXZlIEJSQkUgaW1wbGVtZW50 ZWQgYW5kIGF2YWlsYWJsZSBhdCB0aGUgaG9zdCAqLwo+PiArwqDCoMKgIGlmIChjcHVpZF9mZWF0 dXJlX2V4dHJhY3RfdW5zaWduZWRfZmllbGQoZGZyMCwgSURfQUE2NERGUjBfRUwxX0JSQkVfU0hJ RlQpKQo+PiArwqDCoMKgwqDCoMKgwqAgdmNwdV9zZXRfZmxhZyh2Y3B1LCBERUJVR19TVEFURV9T QVZFX0JSQkUpOwo+PiDCoCB9Cj4+IMKgIMKgIHZvaWQga3ZtX2FyY2hfdmNwdV9wdXRfZGVidWdf c3RhdGVfZmxhZ3Moc3RydWN0IGt2bV92Y3B1ICp2Y3B1KQo+PiDCoCB7Cj4+IMKgwqDCoMKgwqAg dmNwdV9jbGVhcl9mbGFnKHZjcHUsIERFQlVHX1NUQVRFX1NBVkVfU1BFKTsKPj4gwqDCoMKgwqDC oCB2Y3B1X2NsZWFyX2ZsYWcodmNwdSwgREVCVUdfU1RBVEVfU0FWRV9UUkJFKTsKPj4gK8KgwqDC oCB2Y3B1X2NsZWFyX2ZsYWcodmNwdSwgREVCVUdfU1RBVEVfU0FWRV9CUkJFKTsKPj4gwqAgfQo+ PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvZGVidWctc3IuYyBiL2FyY2gv YXJtNjQva3ZtL2h5cC9udmhlL2RlYnVnLXNyLmMKPj4gaW5kZXggNDU1OGMwMmViMzUyLi43OWJj ZjBmYjEzMjYgMTAwNjQ0Cj4+IC0tLSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9udmhlL2RlYnVnLXNy LmMKPj4gKysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvZGVidWctc3IuYwo+PiBAQCAtNzks NiArNzksMzQgQEAgc3RhdGljIHZvaWQgX19kZWJ1Z19yZXN0b3JlX3RyYWNlKHU2NCB0cmZjcl9l bDEpCj4+IMKgwqDCoMKgwqAgd3JpdGVfc3lzcmVnX3ModHJmY3JfZWwxLCBTWVNfVFJGQ1JfRUwx KTsKPj4gwqAgfQo+PiDCoCArc3RhdGljIHZvaWQgX19kZWJ1Z19zYXZlX2JyYmUodTY0ICpicmJj cl9lbDEpCj4+ICt7Cj4+ICvCoMKgwqAgKmJyYmNyX2VsMSA9IDA7Cj4+ICsKPj4gK8KgwqDCoCAv KiBDaGVjayBpZiB0aGUgQlJCRSBpcyBlbmFibGVkICovCj4+ICvCoMKgwqAgaWYgKCEocmVhZF9z eXNyZWdfcyhTWVNfQlJCQ1JfRUwxKSAmIChCUkJDUl9FTHhfRTBCUkUgfCBCUkJDUl9FTHhfRXhC UkUpKSkKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4gKwo+PiArwqDCoMKgIC8qCj4+ICvC oMKgwqDCoCAqIFByb2hpYml0IGJyYW5jaCByZWNvcmQgZ2VuZXJhdGlvbiB3aGlsZSB3ZSBhcmUg aW4gZ3Vlc3QuCj4+ICvCoMKgwqDCoCAqIFNpbmNlIGFjY2VzcyB0byBCUkJDUl9FTDEgaXMgdHJh cHBlZCwgdGhlIGd1ZXN0IGNhbid0Cj4+ICvCoMKgwqDCoCAqIG1vZGlmeSB0aGUgZmlsdGVyaW5n IHNldCBieSB0aGUgaG9zdC4KPj4gK8KgwqDCoMKgICovCj4+ICvCoMKgwqAgKmJyYmNyX2VsMSA9 IHJlYWRfc3lzcmVnX3MoU1lTX0JSQkNSX0VMMSk7Cj4+ICvCoMKgwqAgd3JpdGVfc3lzcmVnX3Mo MCwgU1lTX0JSQkNSX0VMMSk7Cj4+ICvCoMKgwqAgaXNiKCk7Cj4gCj4gSXMgdGhpcyBpc2IoKSBy ZXF1aXJlZCBoZXJlID8gVGhpcyBjYW4gYmUgc3luY2hyb25pc2VkIHdpdGggdGhlIEd1ZXN0IGVu dHJ5ID8KPiAKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgX19kZWJ1Z19yZXN0b3JlX2JyYmUo dTY0IGJyYmNyX2VsMSkKPj4gK3sKPj4gK8KgwqDCoCBpZiAoIWJyYmNyX2VsMSkKPj4gK8KgwqDC oMKgwqDCoMKgIHJldHVybjsKPj4gKwo+PiArwqDCoMKgIC8qIFJlc3RvcmUgQlJCRSBjb250cm9s cyAqLwo+PiArwqDCoMKgIHdyaXRlX3N5c3JlZ19zKGJyYmNyX2VsMSwgU1lTX0JSQkNSX0VMMSk7 Cj4+ICvCoMKgwqAgaXNiKCk7Cj4gCj4gU2ltaWxhcmx5IGhlcmUsIGV4aXQgYmFjayB0byBFTDEg aG9zdCBjYW4gc3luY2hyb25pc2UgdGhlIHNldHRpbmcgPwoKU3VyZSwgd2lsbCBkcm9wIGJvdGgg dGhlIGlzYigpIGhlcmUuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxp c3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0 aW5mby9saW51eC1hcm0ta2VybmVsCg==