From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BB2DF1E1C0 for ; Thu, 10 Aug 2023 17:09:58 +0000 (UTC) Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-3fbea14700bso10490415e9.3 for ; Thu, 10 Aug 2023 10:09:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1691687397; x=1692292197; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=5k2bgFIeP6rEvqhW+76MYexuUI5okzvmYLcGv7ImAA4=; b=348rKh2mB9+JZM1jeKzEc5ff04qfUKJElqfM7dcXuWR7WpqcsYyE0SR6pV+XKf3EXS EtRj6Pc2PahN400SFGd0Enu7oFvk/Y6fqGSqHRBevhWpSPC+eT3j/oza8H1lWhXds9bv ohZZ3YulUFTEuuWRPQjQe7hsBvCUvA42F3W65g10bk1Ey0D8p/7nmY8r+Bs/0pArjg/T ud1XhzVn+8MMJHmXAgHUxQc1oCGKFPmdEFRO0qRz4JfBMC4nDos7JeCDFomxzU1xCcsc 13mfewUufnuDbOxu3rAUm/0c53ed3097YyoBTxgIXYrNWctWltSW563BrMdaSVwy0N0d qcUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691687397; x=1692292197; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5k2bgFIeP6rEvqhW+76MYexuUI5okzvmYLcGv7ImAA4=; b=MDthIo7WfxezAv808I88cvkdFB6M3uJr4b16IBpLB2PH6LwVAQrduM34rMQ2w5kUJp /SnaOjv3rB3cI9MHDpfo5G7v0IUbUcug/7jOrZRv/SgnqktkjjERel37nG4tK7d50fxu qKoH7naj+k69yOcvDhv7QPXpYpiLvy/HP0qJi4ZjLroY/msO3VAAmLsunMFvTd38xPcp pmiPhnElPnvtTL08DrkXlul4Iy1wZxE1yPwB6Vg+tLOgfoJPtaBBa7or+oEemLxibRld HpzpioRX7haBOtrCNah9QTJIrkkxtjDs1oDbp5LVRrJiHr9fQqN/atg7MPCdKJhzpS+s /vFg== X-Gm-Message-State: AOJu0YyniG9tyokMWeaNw0qAQ+U1dNufWTgv2EfZJzx9U4ry90prC/yd W2nX6tI7JgJIz3+5+ZSiEh8+7A== X-Google-Smtp-Source: AGHT+IEWb/Xo7u8eP8qwVSZXPSJwXV2AwZhLO7gPmVS6pQLqyddlKtO7VqIGu2pqOFkudZuyrtfkwg== X-Received: by 2002:a05:6000:c8:b0:313:f548:25b9 with SMTP id q8-20020a05600000c800b00313f54825b9mr2591405wrx.40.1691687396520; Thu, 10 Aug 2023 10:09:56 -0700 (PDT) Received: from google.com (65.0.187.35.bc.googleusercontent.com. [35.187.0.65]) by smtp.gmail.com with ESMTPSA id f17-20020adff451000000b00317efb41e44sm2763727wrp.18.2023.08.10.10.09.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Aug 2023 10:09:55 -0700 (PDT) Date: Thu, 10 Aug 2023 18:09:51 +0100 From: Vincent Donnefort To: Kalesh Singh Cc: maz@kernel.org, oliver.upton@linux.dev, kvmarm@lists.linux.dev, qperret@google.com, smostafa@google.com, linux-arm-kernel@lists.infradead.org, kernel-team@android.com, will@kernel.org Subject: Re: [PATCH] KVM: arm64: Do not size-order align pkvm_alloc_private_va_range() Message-ID: References: <20230810133432.680392-1-vdonnefort@google.com> Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Thu, Aug 10, 2023 at 09:42:54AM -0700, Kalesh Singh wrote: > On Thu, Aug 10, 2023 at 6:34 AM Vincent Donnefort wrote: > > > > commit f922c13e778d ("KVM: arm64: Introduce pkvm_alloc_private_va_range()") > > added an alignment for the start address of any allocation into the nVHE > > protected hypervisor private VA range. > > > > This alignment (order of the size of the allocation) intends to enable > > efficient stack guard verification (if the PAGE_SHIFT bit is zero, the > > stack pointer is on the stack guard page, a stack overflow occurred). > > > > But a such alignment only makes sense for stack allocation and can waste > > a lot of VA space. So instead make a stack specific allocation function > > (hyp_create_stack()) handling the stack guard page requirements, while > > other users (e.g. fixmap) will only get page alignment. > > > > Signed-off-by: Vincent Donnefort > > > > diff --git a/arch/arm64/kvm/hyp/include/nvhe/mm.h b/arch/arm64/kvm/hyp/include/nvhe/mm.h > > index d5ec972b5c1e..71d17ddb562f 100644 > > --- a/arch/arm64/kvm/hyp/include/nvhe/mm.h > > +++ b/arch/arm64/kvm/hyp/include/nvhe/mm.h > > @@ -18,6 +18,7 @@ void *hyp_fixmap_map(phys_addr_t phys); > > void hyp_fixmap_unmap(void); > > > > int hyp_create_idmap(u32 hyp_va_bits); > > +int hyp_create_stack(unsigned long stack_pa, unsigned long *stack_va); > > int hyp_map_vectors(void); > > int hyp_back_vmemmap(phys_addr_t back); > > int pkvm_cpu_set_vector(enum arm64_hyp_spectre_vector slot); > > diff --git a/arch/arm64/kvm/hyp/nvhe/mm.c b/arch/arm64/kvm/hyp/nvhe/mm.c > > index 318298eb3d6b..275e33a8be9a 100644 > > --- a/arch/arm64/kvm/hyp/nvhe/mm.c > > +++ b/arch/arm64/kvm/hyp/nvhe/mm.c > > @@ -44,6 +44,28 @@ static int __pkvm_create_mappings(unsigned long start, unsigned long size, > > return err; > > } > > > > +static int __pkvm_alloc_private_va_range(unsigned long start, size_t size) > > +{ > > + unsigned long cur; > > + int ret = 0; > > + > > + hyp_assert_lock_held(&pkvm_pgd_lock); > > + > > + if (!start || start < __io_map_base) > > + return -EINVAL; > > + > > + /* The allocated size is always a multiple of PAGE_SIZE */ > > + cur = start + PAGE_ALIGN(size); > > + > > + /* Are we overflowing on the vmemmap ? */ > > + if (cur > __hyp_vmemmap) > > + ret = -ENOMEM; > > + else > > + __io_map_base = cur; > > + > > + return ret; > > +} > > + > > /** > > * pkvm_alloc_private_va_range - Allocates a private VA range. > > * @size: The size of the VA range to reserve. > > @@ -56,27 +78,16 @@ static int __pkvm_create_mappings(unsigned long start, unsigned long size, > > */ > > int pkvm_alloc_private_va_range(size_t size, unsigned long *haddr) > > { > > - unsigned long base, addr; > > - int ret = 0; > > + unsigned long addr; > > + int ret; > > > > hyp_spin_lock(&pkvm_pgd_lock); > > - > > - /* Align the allocation based on the order of its size */ > > - addr = ALIGN(__io_map_base, PAGE_SIZE << get_order(size)); > > - > > - /* The allocated size is always a multiple of PAGE_SIZE */ > > - base = addr + PAGE_ALIGN(size); > > - > > - /* Are we overflowing on the vmemmap ? */ > > - if (!addr || base > __hyp_vmemmap) > > - ret = -ENOMEM; > > - else { > > - __io_map_base = base; > > - *haddr = addr; > > - } > > - > > + addr = __io_map_base; > > + ret = __pkvm_alloc_private_va_range(addr, size); > > hyp_spin_unlock(&pkvm_pgd_lock); > > > > + *haddr = addr; > > + > > return ret; > > } > > > > @@ -340,6 +351,39 @@ int hyp_create_idmap(u32 hyp_va_bits) > > return __pkvm_create_mappings(start, end - start, start, PAGE_HYP_EXEC); > > } > > > > +int hyp_create_stack(unsigned long stack_pa, unsigned long *stack_va) > > +{ > > Hi Vincent, > > Can you rename this instead as pkvm_create_stack(), since it's for the > protected case. Not sure about the pkvm_create_stack(), I wanted to have something that looks like hyp_create_idmap() that is also pkvm only. And as the latter, the stack creation happens only during the setup, so I thought I'd better keep this format. Thoughts? > > And I assume we want the same thing for the conventional nVHE mode: > remove the alignment from hyp_alloc_private_va_range() into a > hyp_create_stack(). Ah yes, good catch, even though it'll be less of a problem for non-protected nVHE, it'd probably be a good thing of aligning both. Might do that in a separated patch though. > > Thanks, > Kalesh Thanks for having a look! > > > > + unsigned long addr; > > + size_t size; > > + int ret; > > + > > + hyp_spin_lock(&pkvm_pgd_lock); > > + > > + /* Make room for the guard page */ > > + size = PAGE_SIZE * 2; > > + addr = ALIGN(__io_map_base, size); > > + > > + ret = __pkvm_alloc_private_va_range(addr, size); > > + if (!ret) { > > + /* > > + * Since the stack grows downwards, map the stack to the page > > + * at the higher address and leave the lower guard page > > + * unbacked. > > + * > > + * Any valid stack address now has the PAGE_SHIFT bit as 1 > > + * and addresses corresponding to the guard page have the > > + * PAGE_SHIFT bit as 0 - this is used for overflow detection. > > + */ > > + ret = kvm_pgtable_hyp_map(&pkvm_pgtable, addr + PAGE_SIZE, > > + PAGE_SIZE, stack_pa, PAGE_HYP); > > + } > > + hyp_spin_unlock(&pkvm_pgd_lock); > > + > > + *stack_va = addr + size; > > + > > + return ret; > > +} > > + > > static void *admit_host_page(void *arg) > > { > > struct kvm_hyp_memcache *host_mc = arg; > > diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c > > index bb98630dfeaf..782c8d0fb905 100644 > > --- a/arch/arm64/kvm/hyp/nvhe/setup.c > > +++ b/arch/arm64/kvm/hyp/nvhe/setup.c > > @@ -121,33 +121,11 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size, > > if (ret) > > return ret; > > > > - /* > > - * Allocate a contiguous HYP private VA range for the stack > > - * and guard page. The allocation is also aligned based on > > - * the order of its size. > > - */ > > - ret = pkvm_alloc_private_va_range(PAGE_SIZE * 2, &hyp_addr); > > + ret = hyp_create_stack(params->stack_pa, &hyp_addr); > > if (ret) > > return ret; > > > > - /* > > - * Since the stack grows downwards, map the stack to the page > > - * at the higher address and leave the lower guard page > > - * unbacked. > > - * > > - * Any valid stack address now has the PAGE_SHIFT bit as 1 > > - * and addresses corresponding to the guard page have the > > - * PAGE_SHIFT bit as 0 - this is used for overflow detection. > > - */ > > - hyp_spin_lock(&pkvm_pgd_lock); > > - ret = kvm_pgtable_hyp_map(&pkvm_pgtable, hyp_addr + PAGE_SIZE, > > - PAGE_SIZE, params->stack_pa, PAGE_HYP); > > - hyp_spin_unlock(&pkvm_pgd_lock); > > - if (ret) > > - return ret; > > - > > - /* Update stack_hyp_va to end of the stack's private VA range */ > > - params->stack_hyp_va = hyp_addr + (2 * PAGE_SIZE); > > + params->stack_hyp_va = hyp_addr; > > } > > > > /* > > > > base-commit: 52a93d39b17dc7eb98b6aa3edb93943248e03b2f > > -- > > 2.41.0.640.ga95def55d0-goog > > 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 78BAEC001B0 for ; Thu, 10 Aug 2023 17:10:34 +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:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=/yUxZmcgycd9TZHghdQ4bo4iWj2NYaTQW89Sa6oHOAY=; b=hkb+1YMBKnE+oo yw+ldsnBeni3M1LA+BmlPy6pSQFyfHvsm0nsBJujFKyzZJ54Ee3enTpB+3kNMSYEk5xtLACO+xYxg Zva9NijByQhHvK8BQ8DZD26uR58kFwIoIovtUiVvIVSqkTmwZNOMkpa+EiT22Vu4o2HgRBBBTw+da 7ssDja10TK2TNkib6+APwLO8ytNX2bHNw6HdjEZj9/YRF7MPGF0w01FgArpL6Dr4abg7gdtTHaloH 3Qn7twTt1vn/Czmj0a9P+6QCVRjWZeXr+Ats3oW1vOtY+50bw6D8B7+/I/gAkVIwgLx7gWeJ/96+A Ct45qyFryJuKDcDeBA1g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qU9Ak-008GOh-2A; Thu, 10 Aug 2023 17:10:06 +0000 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qU9Ah-008GNs-11 for linux-arm-kernel@lists.infradead.org; Thu, 10 Aug 2023 17:10:05 +0000 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-3fe501e0b4cso10592915e9.1 for ; Thu, 10 Aug 2023 10:09:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20221208; t=1691687397; x=1692292197; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=5k2bgFIeP6rEvqhW+76MYexuUI5okzvmYLcGv7ImAA4=; b=348rKh2mB9+JZM1jeKzEc5ff04qfUKJElqfM7dcXuWR7WpqcsYyE0SR6pV+XKf3EXS EtRj6Pc2PahN400SFGd0Enu7oFvk/Y6fqGSqHRBevhWpSPC+eT3j/oza8H1lWhXds9bv ohZZ3YulUFTEuuWRPQjQe7hsBvCUvA42F3W65g10bk1Ey0D8p/7nmY8r+Bs/0pArjg/T ud1XhzVn+8MMJHmXAgHUxQc1oCGKFPmdEFRO0qRz4JfBMC4nDos7JeCDFomxzU1xCcsc 13mfewUufnuDbOxu3rAUm/0c53ed3097YyoBTxgIXYrNWctWltSW563BrMdaSVwy0N0d qcUw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1691687397; x=1692292197; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=5k2bgFIeP6rEvqhW+76MYexuUI5okzvmYLcGv7ImAA4=; b=dcalxHWomEN3oll5AqfB2MJAtXLcMUAnXFdD+81sH/TtiUV0og+9S0IGLeFmk08IFK UPEcEN/Oh3y4EvOmrPdzhpuAqqudXF4N0L/mbi4cKNSuaiNUr/CDfiiHqyIqiA271ffq MJKPxLFuvzEAPOGEFCzdshoFlKcFhyncxMEFLo1j+LAKT3ODpR2KPNvjHAkL6GodLYXU /xpOR2sU5DzchO4fQ4oip6YKKfkYYf1MiHxuqqdbSOggt5pdZ4oQ1Gi3RTYPLX+mYHE2 HC2SNgWUo6INj848jfTfrPxuTHJSwYAH7cCEiETKq6aBxAx17yUOBfS2f6Dhs1AVzDlK K+wg== X-Gm-Message-State: AOJu0YzviA9CjX5qW1mZHYoqUhx6WM9ZaWXt8U8uHLmdHkuVLcT211UZ 2azKHvcf54fn7g2Kpl/Easu6BQ== X-Google-Smtp-Source: AGHT+IEWb/Xo7u8eP8qwVSZXPSJwXV2AwZhLO7gPmVS6pQLqyddlKtO7VqIGu2pqOFkudZuyrtfkwg== X-Received: by 2002:a05:6000:c8:b0:313:f548:25b9 with SMTP id q8-20020a05600000c800b00313f54825b9mr2591405wrx.40.1691687396520; Thu, 10 Aug 2023 10:09:56 -0700 (PDT) Received: from google.com (65.0.187.35.bc.googleusercontent.com. [35.187.0.65]) by smtp.gmail.com with ESMTPSA id f17-20020adff451000000b00317efb41e44sm2763727wrp.18.2023.08.10.10.09.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 10 Aug 2023 10:09:55 -0700 (PDT) Date: Thu, 10 Aug 2023 18:09:51 +0100 From: Vincent Donnefort To: Kalesh Singh Cc: maz@kernel.org, oliver.upton@linux.dev, kvmarm@lists.linux.dev, qperret@google.com, smostafa@google.com, linux-arm-kernel@lists.infradead.org, kernel-team@android.com, will@kernel.org Subject: Re: [PATCH] KVM: arm64: Do not size-order align pkvm_alloc_private_va_range() Message-ID: References: <20230810133432.680392-1-vdonnefort@google.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230810_101003_362545_75C697FB X-CRM114-Status: GOOD ( 39.09 ) 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 T24gVGh1LCBBdWcgMTAsIDIwMjMgYXQgMDk6NDI6NTRBTSAtMDcwMCwgS2FsZXNoIFNpbmdoIHdy b3RlOgo+IE9uIFRodSwgQXVnIDEwLCAyMDIzIGF0IDY6MzTigK9BTSBWaW5jZW50IERvbm5lZm9y dCA8dmRvbm5lZm9ydEBnb29nbGUuY29tPiB3cm90ZToKPiA+Cj4gPiBjb21taXQgZjkyMmMxM2U3 NzhkICgiS1ZNOiBhcm02NDogSW50cm9kdWNlIHBrdm1fYWxsb2NfcHJpdmF0ZV92YV9yYW5nZSgp IikKPiA+IGFkZGVkIGFuIGFsaWdubWVudCBmb3IgdGhlIHN0YXJ0IGFkZHJlc3Mgb2YgYW55IGFs bG9jYXRpb24gaW50byB0aGUgblZIRQo+ID4gcHJvdGVjdGVkIGh5cGVydmlzb3IgcHJpdmF0ZSBW QSByYW5nZS4KPiA+Cj4gPiBUaGlzIGFsaWdubWVudCAob3JkZXIgb2YgdGhlIHNpemUgb2YgdGhl IGFsbG9jYXRpb24pIGludGVuZHMgdG8gZW5hYmxlCj4gPiBlZmZpY2llbnQgc3RhY2sgZ3VhcmQg dmVyaWZpY2F0aW9uIChpZiB0aGUgUEFHRV9TSElGVCBiaXQgaXMgemVybywgdGhlCj4gPiBzdGFj ayBwb2ludGVyIGlzIG9uIHRoZSBzdGFjayBndWFyZCBwYWdlLCBhIHN0YWNrIG92ZXJmbG93IG9j Y3VycmVkKS4KPiA+Cj4gPiBCdXQgYSBzdWNoIGFsaWdubWVudCBvbmx5IG1ha2VzIHNlbnNlIGZv ciBzdGFjayBhbGxvY2F0aW9uIGFuZCBjYW4gd2FzdGUKPiA+IGEgbG90IG9mIFZBIHNwYWNlLiBT byBpbnN0ZWFkIG1ha2UgYSBzdGFjayBzcGVjaWZpYyBhbGxvY2F0aW9uIGZ1bmN0aW9uCj4gPiAo aHlwX2NyZWF0ZV9zdGFjaygpKSBoYW5kbGluZyB0aGUgc3RhY2sgZ3VhcmQgcGFnZSByZXF1aXJl bWVudHMsIHdoaWxlCj4gPiBvdGhlciB1c2VycyAoZS5nLiBmaXhtYXApIHdpbGwgb25seSBnZXQg cGFnZSBhbGlnbm1lbnQuCj4gPgo+ID4gU2lnbmVkLW9mZi1ieTogVmluY2VudCBEb25uZWZvcnQg PHZkb25uZWZvcnRAZ29vZ2xlLmNvbT4KPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9r dm0vaHlwL2luY2x1ZGUvbnZoZS9tbS5oIGIvYXJjaC9hcm02NC9rdm0vaHlwL2luY2x1ZGUvbnZo ZS9tbS5oCj4gPiBpbmRleCBkNWVjOTcyYjVjMWUuLjcxZDE3ZGRiNTYyZiAxMDA2NDQKPiA+IC0t LSBhL2FyY2gvYXJtNjQva3ZtL2h5cC9pbmNsdWRlL252aGUvbW0uaAo+ID4gKysrIGIvYXJjaC9h cm02NC9rdm0vaHlwL2luY2x1ZGUvbnZoZS9tbS5oCj4gPiBAQCAtMTgsNiArMTgsNyBAQCB2b2lk ICpoeXBfZml4bWFwX21hcChwaHlzX2FkZHJfdCBwaHlzKTsKPiA+ICB2b2lkIGh5cF9maXhtYXBf dW5tYXAodm9pZCk7Cj4gPgo+ID4gIGludCBoeXBfY3JlYXRlX2lkbWFwKHUzMiBoeXBfdmFfYml0 cyk7Cj4gPiAraW50IGh5cF9jcmVhdGVfc3RhY2sodW5zaWduZWQgbG9uZyBzdGFja19wYSwgdW5z aWduZWQgbG9uZyAqc3RhY2tfdmEpOwo+ID4gIGludCBoeXBfbWFwX3ZlY3RvcnModm9pZCk7Cj4g PiAgaW50IGh5cF9iYWNrX3ZtZW1tYXAocGh5c19hZGRyX3QgYmFjayk7Cj4gPiAgaW50IHBrdm1f Y3B1X3NldF92ZWN0b3IoZW51bSBhcm02NF9oeXBfc3BlY3RyZV92ZWN0b3Igc2xvdCk7Cj4gPiBk aWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbW0uYyBiL2FyY2gvYXJtNjQva3Zt L2h5cC9udmhlL21tLmMKPiA+IGluZGV4IDMxODI5OGViM2Q2Yi4uMjc1ZTMzYThiZTlhIDEwMDY0 NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvbW0uYwo+ID4gKysrIGIvYXJjaC9h cm02NC9rdm0vaHlwL252aGUvbW0uYwo+ID4gQEAgLTQ0LDYgKzQ0LDI4IEBAIHN0YXRpYyBpbnQg X19wa3ZtX2NyZWF0ZV9tYXBwaW5ncyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25n IHNpemUsCj4gPiAgICAgICAgIHJldHVybiBlcnI7Cj4gPiAgfQo+ID4KPiA+ICtzdGF0aWMgaW50 IF9fcGt2bV9hbGxvY19wcml2YXRlX3ZhX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHNpemVf dCBzaXplKQo+ID4gK3sKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyBjdXI7Cj4gPiArICAgICAg IGludCByZXQgPSAwOwo+ID4gKwo+ID4gKyAgICAgICBoeXBfYXNzZXJ0X2xvY2tfaGVsZCgmcGt2 bV9wZ2RfbG9jayk7Cj4gPiArCj4gPiArICAgICAgIGlmICghc3RhcnQgfHwgc3RhcnQgPCBfX2lv X21hcF9iYXNlKQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4gKwo+ID4g KyAgICAgICAvKiBUaGUgYWxsb2NhdGVkIHNpemUgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgUEFH RV9TSVpFICovCj4gPiArICAgICAgIGN1ciA9IHN0YXJ0ICsgUEFHRV9BTElHTihzaXplKTsKPiA+ ICsKPiA+ICsgICAgICAgLyogQXJlIHdlIG92ZXJmbG93aW5nIG9uIHRoZSB2bWVtbWFwID8gKi8K PiA+ICsgICAgICAgaWYgKGN1ciA+IF9faHlwX3ZtZW1tYXApCj4gPiArICAgICAgICAgICAgICAg cmV0ID0gLUVOT01FTTsKPiA+ICsgICAgICAgZWxzZQo+ID4gKyAgICAgICAgICAgICAgIF9faW9f bWFwX2Jhc2UgPSBjdXI7Cj4gPiArCj4gPiArICAgICAgIHJldHVybiByZXQ7Cj4gPiArfQo+ID4g Kwo+ID4gIC8qKgo+ID4gICAqIHBrdm1fYWxsb2NfcHJpdmF0ZV92YV9yYW5nZSAtIEFsbG9jYXRl cyBhIHByaXZhdGUgVkEgcmFuZ2UuCj4gPiAgICogQHNpemU6ICAgICAgVGhlIHNpemUgb2YgdGhl IFZBIHJhbmdlIHRvIHJlc2VydmUuCj4gPiBAQCAtNTYsMjcgKzc4LDE2IEBAIHN0YXRpYyBpbnQg X19wa3ZtX2NyZWF0ZV9tYXBwaW5ncyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25n IHNpemUsCj4gPiAgICovCj4gPiAgaW50IHBrdm1fYWxsb2NfcHJpdmF0ZV92YV9yYW5nZShzaXpl X3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyAqaGFkZHIpCj4gPiAgewo+ID4gLSAgICAgICB1bnNpZ25l ZCBsb25nIGJhc2UsIGFkZHI7Cj4gPiAtICAgICAgIGludCByZXQgPSAwOwo+ID4gKyAgICAgICB1 bnNpZ25lZCBsb25nIGFkZHI7Cj4gPiArICAgICAgIGludCByZXQ7Cj4gPgo+ID4gICAgICAgICBo eXBfc3Bpbl9sb2NrKCZwa3ZtX3BnZF9sb2NrKTsKPiA+IC0KPiA+IC0gICAgICAgLyogQWxpZ24g dGhlIGFsbG9jYXRpb24gYmFzZWQgb24gdGhlIG9yZGVyIG9mIGl0cyBzaXplICovCj4gPiAtICAg ICAgIGFkZHIgPSBBTElHTihfX2lvX21hcF9iYXNlLCBQQUdFX1NJWkUgPDwgZ2V0X29yZGVyKHNp emUpKTsKPiA+IC0KPiA+IC0gICAgICAgLyogVGhlIGFsbG9jYXRlZCBzaXplIGlzIGFsd2F5cyBh IG11bHRpcGxlIG9mIFBBR0VfU0laRSAqLwo+ID4gLSAgICAgICBiYXNlID0gYWRkciArIFBBR0Vf QUxJR04oc2l6ZSk7Cj4gPiAtCj4gPiAtICAgICAgIC8qIEFyZSB3ZSBvdmVyZmxvd2luZyBvbiB0 aGUgdm1lbW1hcCA/ICovCj4gPiAtICAgICAgIGlmICghYWRkciB8fCBiYXNlID4gX19oeXBfdm1l bW1hcCkKPiA+IC0gICAgICAgICAgICAgICByZXQgPSAtRU5PTUVNOwo+ID4gLSAgICAgICBlbHNl IHsKPiA+IC0gICAgICAgICAgICAgICBfX2lvX21hcF9iYXNlID0gYmFzZTsKPiA+IC0gICAgICAg ICAgICAgICAqaGFkZHIgPSBhZGRyOwo+ID4gLSAgICAgICB9Cj4gPiAtCj4gPiArICAgICAgIGFk ZHIgPSBfX2lvX21hcF9iYXNlOwo+ID4gKyAgICAgICByZXQgPSBfX3Brdm1fYWxsb2NfcHJpdmF0 ZV92YV9yYW5nZShhZGRyLCBzaXplKTsKPiA+ICAgICAgICAgaHlwX3NwaW5fdW5sb2NrKCZwa3Zt X3BnZF9sb2NrKTsKPiA+Cj4gPiArICAgICAgICpoYWRkciA9IGFkZHI7Cj4gPiArCj4gPiAgICAg ICAgIHJldHVybiByZXQ7Cj4gPiAgfQo+ID4KPiA+IEBAIC0zNDAsNiArMzUxLDM5IEBAIGludCBo eXBfY3JlYXRlX2lkbWFwKHUzMiBoeXBfdmFfYml0cykKPiA+ICAgICAgICAgcmV0dXJuIF9fcGt2 bV9jcmVhdGVfbWFwcGluZ3Moc3RhcnQsIGVuZCAtIHN0YXJ0LCBzdGFydCwgUEFHRV9IWVBfRVhF Qyk7Cj4gPiAgfQo+ID4KPiA+ICtpbnQgaHlwX2NyZWF0ZV9zdGFjayh1bnNpZ25lZCBsb25nIHN0 YWNrX3BhLCB1bnNpZ25lZCBsb25nICpzdGFja192YSkKPiA+ICt7Cj4gCj4gSGkgVmluY2VudCwK PiAKPiBDYW4geW91IHJlbmFtZSB0aGlzIGluc3RlYWQgYXMgcGt2bV9jcmVhdGVfc3RhY2soKSwg c2luY2UgaXQncyBmb3IgdGhlCj4gcHJvdGVjdGVkIGNhc2UuCgpOb3Qgc3VyZSBhYm91dCB0aGUg cGt2bV9jcmVhdGVfc3RhY2soKSwgSSB3YW50ZWQgdG8gaGF2ZSBzb21ldGhpbmcgdGhhdCBsb29r cwpsaWtlIGh5cF9jcmVhdGVfaWRtYXAoKSB0aGF0IGlzIGFsc28gcGt2bSBvbmx5LiBBbmQgYXMg dGhlIGxhdHRlciwgdGhlIHN0YWNrCmNyZWF0aW9uIGhhcHBlbnMgb25seSBkdXJpbmcgdGhlIHNl dHVwLCBzbyBJIHRob3VnaHQgSSdkIGJldHRlciBrZWVwIHRoaXMKZm9ybWF0LgoKVGhvdWdodHM/ Cgo+IAo+IEFuZCBJIGFzc3VtZSB3ZSB3YW50IHRoZSBzYW1lIHRoaW5nIGZvciB0aGUgY29udmVu dGlvbmFsIG5WSEUgbW9kZToKPiByZW1vdmUgdGhlIGFsaWdubWVudCBmcm9tIGh5cF9hbGxvY19w cml2YXRlX3ZhX3JhbmdlKCkgaW50byBhCj4gaHlwX2NyZWF0ZV9zdGFjaygpLgoKQWggeWVzLCBn b29kIGNhdGNoLCBldmVuIHRob3VnaCBpdCdsbCBiZSBsZXNzIG9mIGEgcHJvYmxlbSBmb3Igbm9u LXByb3RlY3RlZApuVkhFLCBpdCdkIHByb2JhYmx5IGJlIGEgZ29vZCB0aGluZyBvZiBhbGlnbmlu ZyBib3RoLiBNaWdodCBkbyB0aGF0IGluIGEKc2VwYXJhdGVkIHBhdGNoIHRob3VnaC4KCj4gCj4g VGhhbmtzLAo+IEthbGVzaAoKVGhhbmtzIGZvciBoYXZpbmcgYSBsb29rIQoKPiAKPiAKPiA+ICsg ICAgICAgdW5zaWduZWQgbG9uZyBhZGRyOwo+ID4gKyAgICAgICBzaXplX3Qgc2l6ZTsKPiA+ICsg ICAgICAgaW50IHJldDsKPiA+ICsKPiA+ICsgICAgICAgaHlwX3NwaW5fbG9jaygmcGt2bV9wZ2Rf bG9jayk7Cj4gPiArCj4gPiArICAgICAgIC8qIE1ha2Ugcm9vbSBmb3IgdGhlIGd1YXJkIHBhZ2Ug Ki8KPiA+ICsgICAgICAgc2l6ZSA9IFBBR0VfU0laRSAqIDI7Cj4gPiArICAgICAgIGFkZHIgPSBB TElHTihfX2lvX21hcF9iYXNlLCBzaXplKTsKPiA+ICsKPiA+ICsgICAgICAgcmV0ID0gX19wa3Zt X2FsbG9jX3ByaXZhdGVfdmFfcmFuZ2UoYWRkciwgc2l6ZSk7Cj4gPiArICAgICAgIGlmICghcmV0 KSB7Cj4gPiArICAgICAgICAgICAgICAgLyoKPiA+ICsgICAgICAgICAgICAgICAgKiBTaW5jZSB0 aGUgc3RhY2sgZ3Jvd3MgZG93bndhcmRzLCBtYXAgdGhlIHN0YWNrIHRvIHRoZSBwYWdlCj4gPiAr ICAgICAgICAgICAgICAgICogYXQgdGhlIGhpZ2hlciBhZGRyZXNzIGFuZCBsZWF2ZSB0aGUgbG93 ZXIgZ3VhcmQgcGFnZQo+ID4gKyAgICAgICAgICAgICAgICAqIHVuYmFja2VkLgo+ID4gKyAgICAg ICAgICAgICAgICAqCj4gPiArICAgICAgICAgICAgICAgICogQW55IHZhbGlkIHN0YWNrIGFkZHJl c3Mgbm93IGhhcyB0aGUgUEFHRV9TSElGVCBiaXQgYXMgMQo+ID4gKyAgICAgICAgICAgICAgICAq IGFuZCBhZGRyZXNzZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZ3VhcmQgcGFnZSBoYXZlIHRoZQo+ ID4gKyAgICAgICAgICAgICAgICAqIFBBR0VfU0hJRlQgYml0IGFzIDAgLSB0aGlzIGlzIHVzZWQg Zm9yIG92ZXJmbG93IGRldGVjdGlvbi4KPiA+ICsgICAgICAgICAgICAgICAgKi8KPiA+ICsgICAg ICAgICAgICAgICByZXQgPSBrdm1fcGd0YWJsZV9oeXBfbWFwKCZwa3ZtX3BndGFibGUsIGFkZHIg KyBQQUdFX1NJWkUsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBQQUdFX1NJWkUsIHN0YWNrX3BhLCBQQUdFX0hZUCk7Cj4gPiArICAgICAgIH0KPiA+ICsgICAg ICAgaHlwX3NwaW5fdW5sb2NrKCZwa3ZtX3BnZF9sb2NrKTsKPiA+ICsKPiA+ICsgICAgICAgKnN0 YWNrX3ZhID0gYWRkciArIHNpemU7Cj4gPiArCj4gPiArICAgICAgIHJldHVybiByZXQ7Cj4gPiAr fQo+ID4gKwo+ID4gIHN0YXRpYyB2b2lkICphZG1pdF9ob3N0X3BhZ2Uodm9pZCAqYXJnKQo+ID4g IHsKPiA+ICAgICAgICAgc3RydWN0IGt2bV9oeXBfbWVtY2FjaGUgKmhvc3RfbWMgPSBhcmc7Cj4g PiBkaWZmIC0tZ2l0IGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvc2V0dXAuYyBiL2FyY2gvYXJt NjQva3ZtL2h5cC9udmhlL3NldHVwLmMKPiA+IGluZGV4IGJiOTg2MzBkZmVhZi4uNzgyYzhkMGZi OTA1IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvc2V0dXAuYwo+ID4g KysrIGIvYXJjaC9hcm02NC9rdm0vaHlwL252aGUvc2V0dXAuYwo+ID4gQEAgLTEyMSwzMyArMTIx LDExIEBAIHN0YXRpYyBpbnQgcmVjcmVhdGVfaHlwX21hcHBpbmdzKHBoeXNfYWRkcl90IHBoeXMs IHVuc2lnbmVkIGxvbmcgc2l6ZSwKPiA+ICAgICAgICAgICAgICAgICBpZiAocmV0KQo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+Cj4gPiAtICAgICAgICAgICAgICAg LyoKPiA+IC0gICAgICAgICAgICAgICAgKiBBbGxvY2F0ZSBhIGNvbnRpZ3VvdXMgSFlQIHByaXZh dGUgVkEgcmFuZ2UgZm9yIHRoZSBzdGFjawo+ID4gLSAgICAgICAgICAgICAgICAqIGFuZCBndWFy ZCBwYWdlLiBUaGUgYWxsb2NhdGlvbiBpcyBhbHNvIGFsaWduZWQgYmFzZWQgb24KPiA+IC0gICAg ICAgICAgICAgICAgKiB0aGUgb3JkZXIgb2YgaXRzIHNpemUuCj4gPiAtICAgICAgICAgICAgICAg ICovCj4gPiAtICAgICAgICAgICAgICAgcmV0ID0gcGt2bV9hbGxvY19wcml2YXRlX3ZhX3Jhbmdl KFBBR0VfU0laRSAqIDIsICZoeXBfYWRkcik7Cj4gPiArICAgICAgICAgICAgICAgcmV0ID0gaHlw X2NyZWF0ZV9zdGFjayhwYXJhbXMtPnN0YWNrX3BhLCAmaHlwX2FkZHIpOwo+ID4gICAgICAgICAg ICAgICAgIGlmIChyZXQpCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0Owo+ ID4KPiA+IC0gICAgICAgICAgICAgICAvKgo+ID4gLSAgICAgICAgICAgICAgICAqIFNpbmNlIHRo ZSBzdGFjayBncm93cyBkb3dud2FyZHMsIG1hcCB0aGUgc3RhY2sgdG8gdGhlIHBhZ2UKPiA+IC0g ICAgICAgICAgICAgICAgKiBhdCB0aGUgaGlnaGVyIGFkZHJlc3MgYW5kIGxlYXZlIHRoZSBsb3dl ciBndWFyZCBwYWdlCj4gPiAtICAgICAgICAgICAgICAgICogdW5iYWNrZWQuCj4gPiAtICAgICAg ICAgICAgICAgICoKPiA+IC0gICAgICAgICAgICAgICAgKiBBbnkgdmFsaWQgc3RhY2sgYWRkcmVz cyBub3cgaGFzIHRoZSBQQUdFX1NISUZUIGJpdCBhcyAxCj4gPiAtICAgICAgICAgICAgICAgICog YW5kIGFkZHJlc3NlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBndWFyZCBwYWdlIGhhdmUgdGhlCj4g PiAtICAgICAgICAgICAgICAgICogUEFHRV9TSElGVCBiaXQgYXMgMCAtIHRoaXMgaXMgdXNlZCBm b3Igb3ZlcmZsb3cgZGV0ZWN0aW9uLgo+ID4gLSAgICAgICAgICAgICAgICAqLwo+ID4gLSAgICAg ICAgICAgICAgIGh5cF9zcGluX2xvY2soJnBrdm1fcGdkX2xvY2spOwo+ID4gLSAgICAgICAgICAg ICAgIHJldCA9IGt2bV9wZ3RhYmxlX2h5cF9tYXAoJnBrdm1fcGd0YWJsZSwgaHlwX2FkZHIgKyBQ QUdFX1NJWkUsCj4gPiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFH RV9TSVpFLCBwYXJhbXMtPnN0YWNrX3BhLCBQQUdFX0hZUCk7Cj4gPiAtICAgICAgICAgICAgICAg aHlwX3NwaW5fdW5sb2NrKCZwa3ZtX3BnZF9sb2NrKTsKPiA+IC0gICAgICAgICAgICAgICBpZiAo cmV0KQo+ID4gLSAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiA+IC0KPiA+IC0g ICAgICAgICAgICAgICAvKiBVcGRhdGUgc3RhY2tfaHlwX3ZhIHRvIGVuZCBvZiB0aGUgc3RhY2sn cyBwcml2YXRlIFZBIHJhbmdlICovCj4gPiAtICAgICAgICAgICAgICAgcGFyYW1zLT5zdGFja19o eXBfdmEgPSBoeXBfYWRkciArICgyICogUEFHRV9TSVpFKTsKPiA+ICsgICAgICAgICAgICAgICBw YXJhbXMtPnN0YWNrX2h5cF92YSA9IGh5cF9hZGRyOwo+ID4gICAgICAgICB9Cj4gPgo+ID4gICAg ICAgICAvKgo+ID4KPiA+IGJhc2UtY29tbWl0OiA1MmE5M2QzOWIxN2RjN2ViOThiNmFhM2VkYjkz OTQzMjQ4ZTAzYjJmCj4gPiAtLQo+ID4gMi40MS4wLjY0MC5nYTk1ZGVmNTVkMC1nb29nCj4gPgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJt LWtlcm5lbCBtYWlsaW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtl cm5lbAo=