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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 508C2C43334 for ; Fri, 8 Jul 2022 19:38:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239907AbiGHTiq (ORCPT ); Fri, 8 Jul 2022 15:38:46 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:46314 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239951AbiGHTih (ORCPT ); Fri, 8 Jul 2022 15:38:37 -0400 Received: from mail-wr1-x436.google.com (mail-wr1-x436.google.com [IPv6:2a00:1450:4864:20::436]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 42F8410FC2 for ; Fri, 8 Jul 2022 12:38:34 -0700 (PDT) Received: by mail-wr1-x436.google.com with SMTP id v14so31825499wra.5 for ; Fri, 08 Jul 2022 12:38:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FJI9Ehsx1DLhgOOTZFpXBygwtMTKmpvBdj5nkzZLTLY=; b=a2wrVl6zvNzyjpS74p8fzHi85oQNxgg+Gr9JWGaZuND/BBwhnekF1N+0OasRjtxTD5 rqunmOW1D28Sm3WZ9CgtmzKbYnjI9rP6yEDVsvbMiORvYYM4zbJPUsA3MiLeFJZg0C3R zyQ51hCYa31tPaMajBYHJUyGrtuUnKiPRIKg4SzHNGQXtbAqN9VzK0HUv9oZLOWG4WeO X+s2m/Fg1dY6vFl5OtfPmyXLceIkhmXF9sWN5lv96aTryBfYaCMNNbFxiSDy9YWcRVOM nwgPNp+zWeVAJerlfW0a0GpoqyoJ39OoeH/gVKB8hNU0pV7E0aTrdzgflmYE+vvpYx20 lhOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FJI9Ehsx1DLhgOOTZFpXBygwtMTKmpvBdj5nkzZLTLY=; b=awfx/2IT+tOOVgvc+xb9dq59PWDFt8z6pwzzekUMWFffLovHrafV2ksZYC87jR1uCr 3tfSqe9oM02QDrFy9tGhjctkoP2oKyBhB1RrcUBaU6kpRzlRFAw5Bcr+v104vm/keJus wJSyWBNhuCdNNfC4s+EGGMNdp7uxAJy+yCDuA5NBmFBbSGvCaDNVzZsWg6ckCf1I+bsk RP2rPAmsffs6kl7YPtLaIRqd6WHovZwo4L64uxj+OUXAldmhdmT7E/naPhGvWrV5SinI nrlnD6lKwh/6C+yOyj8xhWPjptbtb83sIr7z7Mc4b1kOZuOZzpDipkxKylDEC1tYPitf K0Vg== X-Gm-Message-State: AJIora9mJTcIiAE1KxtI2to0CWXs/eyCRvVfyTlRrE1ypOKGFtftIyjf N88/r2qm1uLhjf2S9+yiL2VG0639cB0G/g== X-Google-Smtp-Source: AGRyM1v3slCHWDgrE0apW0q146paDpoAX8/kc8ApkFjKpoSjFradJsGClHiO0X094PeVXwUAjolvgg== X-Received: by 2002:adf:e7c9:0:b0:21d:8716:e08d with SMTP id e9-20020adfe7c9000000b0021d8716e08dmr4822062wrn.328.1657309112010; Fri, 08 Jul 2022 12:38:32 -0700 (PDT) Received: from opensuse.localnet (host-95-235-102-55.retail.telecomitalia.it. [95.235.102.55]) by smtp.gmail.com with ESMTPSA id w13-20020adff9cd000000b0021d8b1656dfsm3973684wrr.93.2022.07.08.12.38.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Jul 2022 12:38:30 -0700 (PDT) From: "Fabio M. De Francesco" To: linux-kernel@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, ebiederm@xmission.com, dyoung@redhat.com, bhe@redhat.com, vgoyal@redhat.com, Eric DeVolder Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, hpa@zytor.com, nramas@linux.microsoft.com, thomas.lendacky@amd.com, robh@kernel.org, efault@gmx.de, rppt@kernel.org, david@redhat.com, sourabhjain@linux.ibm.com, konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, eric.devolder@oracle.com Subject: Re: [PATCH v9 7/7] x86/crash: Add x86 crash hotplug support Date: Fri, 08 Jul 2022 21:38:27 +0200 Message-ID: <2843978.e9J7NaK4W3@opensuse> In-Reply-To: <20220613224240.79400-8-eric.devolder@oracle.com> References: <20220613224240.79400-1-eric.devolder@oracle.com> <20220613224240.79400-8-eric.devolder@oracle.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On marted=C3=AC 14 giugno 2022 00:42:40 CEST Eric DeVolder wrote: > For x86_64, when CPU or memory is hot un/plugged, the crash > elfcorehdr, which describes the CPUs and memory in the system, > must also be updated. >=20 > When loading the crash kernel via kexec_load or kexec_file_load, > the elfcorehdr is identified at run time in > crash_core:handle_hotplug_event(). >=20 > To update the elfcorehdr for x86_64, a new elfcorehdr must be > generated from the available CPUs and memory. The new elfcorehdr > is prepared into a buffer, and then installed over the top of > the existing elfcorehdr. >=20 > In the patch 'kexec: exclude elfcorehdr from the segment digest' > the need to update purgatory due to the change in elfcorehdr was > eliminated. As a result, no changes to purgatory or boot_params > (as the elfcorehdr=3D kernel command line parameter pointer > remains unchanged and correct) are needed, just elfcorehdr. >=20 > To accommodate a growing number of resources via hotplug, the > elfcorehdr segment must be sufficiently large enough to accommodate > changes, see the CRASH_MAX_MEMORY_RANGES configure item. >=20 > With this change, crash hotplug for kexec_file_load syscall > is supported. The kexec_load is also supported, but also > requires a corresponding change to userspace kexec-tools. >=20 > Signed-off-by: Eric DeVolder > --- > arch/x86/Kconfig | 11 ++++ > arch/x86/kernel/crash.c | 116 ++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 127 insertions(+) >=20 > diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig > index 762a0b6ab8b6..e9eecff3b97d 100644 > --- a/arch/x86/Kconfig > +++ b/arch/x86/Kconfig > @@ -2082,6 +2082,17 @@ config CRASH_DUMP > (CONFIG_RELOCATABLE=3Dy). > For more details see Documentation/admin-guide/kdump/kdump.rst > =20 > +config CRASH_MAX_MEMORY_RANGES > + depends on CRASH_DUMP && KEXEC_FILE && (HOTPLUG_CPU ||=20 MEMORY_HOTPLUG) > + int > + default 32768 > + help > + For the kexec_file_load path, specify the maximum number of > + memory regions, eg. as represented by the 'System RAM' entries > + in /proc/iomem, that the elfcorehdr buffer/segment can=20 accommodate. > + This value is combined with NR_CPUS and multiplied by=20 Elf64_Phdr > + size to determine the final buffer size. > + > config KEXEC_JUMP > bool "kexec jump" > depends on KEXEC && HIBERNATION > diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c > index 9db41cce8d97..b9cdf7a0d868 100644 > --- a/arch/x86/kernel/crash.c > +++ b/arch/x86/kernel/crash.c > @@ -25,6 +25,7 @@ > #include > #include > #include > +#include > =20 > #include > #include > @@ -398,7 +399,17 @@ int crash_load_segments(struct kimage *image) > image->elf_headers =3D kbuf.buffer; > image->elf_headers_sz =3D kbuf.bufsz; > =20 > +#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_MEMORY_HOTPLUG) > + /* Ensure elfcorehdr segment large enough for hotplug changes */ > + kbuf.memsz =3D (CONFIG_NR_CPUS_DEFAULT +=20 CONFIG_CRASH_MAX_MEMORY_RANGES) * sizeof(Elf64_Phdr); > + /* For marking as usable to crash kernel */ > + image->elf_headers_sz =3D kbuf.memsz; > + /* Record the index of the elfcorehdr segment */ > + image->elfcorehdr_index =3D image->nr_segments; > + image->elfcorehdr_index_valid =3D true; > +#else > kbuf.memsz =3D kbuf.bufsz; > +#endif > kbuf.buf_align =3D ELF_CORE_HEADER_ALIGN; > kbuf.mem =3D KEXEC_BUF_MEM_UNKNOWN; > ret =3D kexec_add_buffer(&kbuf); > @@ -413,3 +424,108 @@ int crash_load_segments(struct kimage *image) > return ret; > } > #endif /* CONFIG_KEXEC_FILE */ > + > +#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_MEMORY_HOTPLUG) > +int crash_hotplug_support(void) { return 1; } > +void *arch_map_crash_pages(unsigned long paddr, unsigned long size) > +{ > + /* > + * NOTE: The addresses and sizes passed to this routine have > + * already been fully aligned on page boundaries. There is no > + * need for massaging the address or size. > + */ > + void *ptr =3D NULL; > + > + /* NOTE: requires arch_kexec_[un]protect_crashkres() for write=20 access */ > + if (size > 0) { > + struct page *page =3D pfn_to_page(paddr >> PAGE_SHIFT); > + > + ptr =3D kmap(page); > + } kmap_local_page() is preferred over kmap() which should be avoided in new=20 code (please take a look at highmem.rst which I recently updated). Can you please check if you can easily avoid using kmap()? Otherwise, this= =20 code will be added to my (long) queue and changed one day or the other :-) Thanks, =46abio > + > + return ptr; > +} > + > +void arch_unmap_crash_pages(void **ptr) > +{ > + if (ptr) { > + if (*ptr) > + kunmap(*ptr); > + *ptr =3D NULL; > + } > +} > + > +/** > + * arch_crash_handle_hotplug_event() - Handle hotplug elfcorehdr changes > + * @image: the active struct kimage > + * @hp_action: the hot un/plug action being handled > + * @cpu: when KEXEC_CRASH_HP_ADD/REMOVE_CPU, the cpu affected > + * > + * To accurately reflect hot un/plug changes, the elfcorehdr (which > + * is passed to the crash kernel via the elfcorehdr=3D parameter) > + * must be updated with the new list of CPUs and memories. The new > + * elfcorehdr is prepared in a kernel buffer, and then it is > + * written on top of the existing/old elfcorehdr. > + * > + * For hotplug changes to elfcorehdr to work, two conditions are > + * needed: > + * First, the segment containing the elfcorehdr must be large enough > + * to permit a growing number of resources. See the > + * CONFIG_CRASH_MAX_MEMORY_RANGES description. > + * Second, purgatory must explicitly exclude the elfcorehdr from the > + * list of segments it checks (since the elfcorehdr changes and thus > + * would require an update to purgatory itself to update the digest). > + * > + */ > +void arch_crash_handle_hotplug_event(struct kimage *image, > + unsigned int hp_action, unsigned int cpu) > +{ > + struct kexec_segment *ksegment; > + unsigned char *ptr =3D NULL; > + unsigned long elfsz =3D 0; > + void *elfbuf =3D NULL; > + unsigned long mem, memsz; > + > + /* > + * Elfcorehdr_index_valid checked in=20 crash_core:handle_hotplug_event() > + */ > + ksegment =3D &image->segment[image->elfcorehdr_index]; > + mem =3D ksegment->mem; > + memsz =3D ksegment->memsz; > + > + /* > + * Create the new elfcorehdr reflecting the changes to CPU and/or > + * memory resources. > + */ > + if (prepare_elf_headers(image, &elfbuf, &elfsz)) { > + pr_err("crash hp: unable to prepare elfcore headers"); > + goto out; > + } > + if (elfsz > memsz) { > + pr_err("crash hp: update elfcorehdr elfsz %lu > memsz=20 %lu", > + elfsz, memsz); > + goto out; > + } > + > + /* > + * At this point, we are all but assured of success. > + * Copy new elfcorehdr into destination. > + */ > + ptr =3D arch_map_crash_pages(mem, memsz); > + if (ptr) { > + /* > + * Temporarily invalidate the crash image while the > + * elfcorehdr is updated. > + */ > + xchg(&kexec_crash_image, NULL); > + memcpy_flushcache((void *)ptr, elfbuf, elfsz); > + xchg(&kexec_crash_image, image); > + } > + arch_unmap_crash_pages((void **)&ptr); > + pr_debug("crash hp: re-loaded elfcorehdr at 0x%lx\n", mem); > + > +out: > + if (elfbuf) > + vfree(elfbuf); > +} > +#endif > --=20 > 2.31.1 >=20 >=20 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 4EA25C433EF for ; Fri, 8 Jul 2022 19:38: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:MIME-Version:References:In-Reply-To: Message-ID:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=uWpoDGYVZfJhs4o9UBWPQOXxq8SPchgnLepo0OarX3A=; b=yMEpMD6BGANiu0 GUjg7TpR68TDhC96STNaPPxcHfp0+z2muHSNXoj3pidf701m4CWdtnaztNTED3IhDsxQKP5ztpH+P Q6VoCuo8Zj8Qv66guFU9NojFaRT09k2h0Lpqhb2Z21LEu72wqu6LwGY6IZwnnj9CqJFk56+nmWQoM 7x9xBU8tvSCvClpjIINHvLifYfn5D+D69mkCLr6b3J1HKl5waN3PR7ZQYFQyNpt20mqzIod06AEtc O+JJa/vhDVZgO15ZZ7v9GzaPkgqKYGIkZnoVtViJYcZzfw13imvZ1X7rxvnsCFKZw8i0veVykB/KH GppOdJjbjpUUGvVb4XoQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9toI-005dTp-HR; Fri, 08 Jul 2022 19:38:42 +0000 Received: from mail-wr1-x430.google.com ([2a00:1450:4864:20::430]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9toF-005dRw-Ka for kexec@lists.infradead.org; Fri, 08 Jul 2022 19:38:41 +0000 Received: by mail-wr1-x430.google.com with SMTP id bk26so16743732wrb.11 for ; Fri, 08 Jul 2022 12:38:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=FJI9Ehsx1DLhgOOTZFpXBygwtMTKmpvBdj5nkzZLTLY=; b=a2wrVl6zvNzyjpS74p8fzHi85oQNxgg+Gr9JWGaZuND/BBwhnekF1N+0OasRjtxTD5 rqunmOW1D28Sm3WZ9CgtmzKbYnjI9rP6yEDVsvbMiORvYYM4zbJPUsA3MiLeFJZg0C3R zyQ51hCYa31tPaMajBYHJUyGrtuUnKiPRIKg4SzHNGQXtbAqN9VzK0HUv9oZLOWG4WeO X+s2m/Fg1dY6vFl5OtfPmyXLceIkhmXF9sWN5lv96aTryBfYaCMNNbFxiSDy9YWcRVOM nwgPNp+zWeVAJerlfW0a0GpoqyoJ39OoeH/gVKB8hNU0pV7E0aTrdzgflmYE+vvpYx20 lhOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=FJI9Ehsx1DLhgOOTZFpXBygwtMTKmpvBdj5nkzZLTLY=; b=FvdKg2jxahDJwYSqGQwE2ifdQGnloFX/n0okCcHt+fZyAnoZ6pGgCD5NWoh+0pi7nR 6Bd1rCzULj0yhWG6eymYsdp6jJNqLvuGJpE+FNjSwdZueG2m7A4UlXJPA65rIBlYlmKf LIFU7rj/S6OGAO/xJkbqbro6IRFooJuCPtxcerJQP4meArXhj4KXAFIJ+N43lsfuvwKo nrpjCBLvcM7Zkomq9AMopO2nVvxPL9AH29pwrtgz+hKbUggh4SZ4YUmhtCPPFn0+x7Gm rzTq7aOyYJPf4371JWsQHnAf5Z2YpJFFCoVgqYs/unyZvzI6KiTjum2Uxj7BuUSsVyRZ viBA== X-Gm-Message-State: AJIora+sy7+SvlYtfhLfxTDk5RIvzrC/0il7pjSFfl1UAth/JUIqtzWt gC7WDv6chqAZrZF5d/2tLrc= X-Google-Smtp-Source: AGRyM1v3slCHWDgrE0apW0q146paDpoAX8/kc8ApkFjKpoSjFradJsGClHiO0X094PeVXwUAjolvgg== X-Received: by 2002:adf:e7c9:0:b0:21d:8716:e08d with SMTP id e9-20020adfe7c9000000b0021d8716e08dmr4822062wrn.328.1657309112010; Fri, 08 Jul 2022 12:38:32 -0700 (PDT) Received: from opensuse.localnet (host-95-235-102-55.retail.telecomitalia.it. [95.235.102.55]) by smtp.gmail.com with ESMTPSA id w13-20020adff9cd000000b0021d8b1656dfsm3973684wrr.93.2022.07.08.12.38.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 08 Jul 2022 12:38:30 -0700 (PDT) From: "Fabio M. De Francesco" To: linux-kernel@vger.kernel.org, x86@kernel.org, kexec@lists.infradead.org, ebiederm@xmission.com, dyoung@redhat.com, bhe@redhat.com, vgoyal@redhat.com, Eric DeVolder Cc: tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, hpa@zytor.com, nramas@linux.microsoft.com, thomas.lendacky@amd.com, robh@kernel.org, efault@gmx.de, rppt@kernel.org, david@redhat.com, sourabhjain@linux.ibm.com, konrad.wilk@oracle.com, boris.ostrovsky@oracle.com, eric.devolder@oracle.com Subject: Re: [PATCH v9 7/7] x86/crash: Add x86 crash hotplug support Date: Fri, 08 Jul 2022 21:38:27 +0200 Message-ID: <2843978.e9J7NaK4W3@opensuse> In-Reply-To: <20220613224240.79400-8-eric.devolder@oracle.com> References: <20220613224240.79400-1-eric.devolder@oracle.com> <20220613224240.79400-8-eric.devolder@oracle.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220708_123839_692632_E6B1C5F7 X-CRM114-Status: GOOD ( 38.78 ) X-BeenThere: kexec@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: "kexec" Errors-To: kexec-bounces+kexec=archiver.kernel.org@lists.infradead.org T24gbWFydGVkw6wgMTQgZ2l1Z25vIDIwMjIgMDA6NDI6NDAgQ0VTVCBFcmljIERlVm9sZGVyIHdy b3RlOgo+IEZvciB4ODZfNjQsIHdoZW4gQ1BVIG9yIG1lbW9yeSBpcyBob3QgdW4vcGx1Z2dlZCwg dGhlIGNyYXNoCj4gZWxmY29yZWhkciwgd2hpY2ggZGVzY3JpYmVzIHRoZSBDUFVzIGFuZCBtZW1v cnkgaW4gdGhlIHN5c3RlbSwKPiBtdXN0IGFsc28gYmUgdXBkYXRlZC4KPiAKPiBXaGVuIGxvYWRp bmcgdGhlIGNyYXNoIGtlcm5lbCB2aWEga2V4ZWNfbG9hZCBvciBrZXhlY19maWxlX2xvYWQsCj4g dGhlIGVsZmNvcmVoZHIgaXMgaWRlbnRpZmllZCBhdCBydW4gdGltZSBpbgo+IGNyYXNoX2NvcmU6 aGFuZGxlX2hvdHBsdWdfZXZlbnQoKS4KPiAKPiBUbyB1cGRhdGUgdGhlIGVsZmNvcmVoZHIgZm9y IHg4Nl82NCwgYSBuZXcgZWxmY29yZWhkciBtdXN0IGJlCj4gZ2VuZXJhdGVkIGZyb20gdGhlIGF2 YWlsYWJsZSBDUFVzIGFuZCBtZW1vcnkuIFRoZSBuZXcgZWxmY29yZWhkcgo+IGlzIHByZXBhcmVk IGludG8gYSBidWZmZXIsIGFuZCB0aGVuIGluc3RhbGxlZCBvdmVyIHRoZSB0b3Agb2YKPiB0aGUg ZXhpc3RpbmcgZWxmY29yZWhkci4KPiAKPiBJbiB0aGUgcGF0Y2ggJ2tleGVjOiBleGNsdWRlIGVs ZmNvcmVoZHIgZnJvbSB0aGUgc2VnbWVudCBkaWdlc3QnCj4gdGhlIG5lZWQgdG8gdXBkYXRlIHB1 cmdhdG9yeSBkdWUgdG8gdGhlIGNoYW5nZSBpbiBlbGZjb3JlaGRyIHdhcwo+IGVsaW1pbmF0ZWQu ICBBcyBhIHJlc3VsdCwgbm8gY2hhbmdlcyB0byBwdXJnYXRvcnkgb3IgYm9vdF9wYXJhbXMKPiAo YXMgdGhlIGVsZmNvcmVoZHI9IGtlcm5lbCBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIHBvaW50ZXIK PiByZW1haW5zIHVuY2hhbmdlZCBhbmQgY29ycmVjdCkgYXJlIG5lZWRlZCwganVzdCBlbGZjb3Jl aGRyLgo+IAo+IFRvIGFjY29tbW9kYXRlIGEgZ3Jvd2luZyBudW1iZXIgb2YgcmVzb3VyY2VzIHZp YSBob3RwbHVnLCB0aGUKPiBlbGZjb3JlaGRyIHNlZ21lbnQgbXVzdCBiZSBzdWZmaWNpZW50bHkg bGFyZ2UgZW5vdWdoIHRvIGFjY29tbW9kYXRlCj4gY2hhbmdlcywgc2VlIHRoZSBDUkFTSF9NQVhf TUVNT1JZX1JBTkdFUyBjb25maWd1cmUgaXRlbS4KPiAKPiBXaXRoIHRoaXMgY2hhbmdlLCBjcmFz aCBob3RwbHVnIGZvciBrZXhlY19maWxlX2xvYWQgc3lzY2FsbAo+IGlzIHN1cHBvcnRlZC4gVGhl IGtleGVjX2xvYWQgaXMgYWxzbyBzdXBwb3J0ZWQsIGJ1dCBhbHNvCj4gcmVxdWlyZXMgYSBjb3Jy ZXNwb25kaW5nIGNoYW5nZSB0byB1c2Vyc3BhY2Uga2V4ZWMtdG9vbHMuCj4gCj4gU2lnbmVkLW9m Zi1ieTogRXJpYyBEZVZvbGRlciA8ZXJpYy5kZXZvbGRlckBvcmFjbGUuY29tPgo+IC0tLQo+ICBh cmNoL3g4Ni9LY29uZmlnICAgICAgICB8ICAxMSArKysrCj4gIGFyY2gveDg2L2tlcm5lbC9jcmFz aC5jIHwgMTE2ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgMiBm aWxlcyBjaGFuZ2VkLCAxMjcgaW5zZXJ0aW9ucygrKQo+IAo+IGRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9LY29uZmlnIGIvYXJjaC94ODYvS2NvbmZpZwo+IGluZGV4IDc2MmEwYjZhYjhiNi4uZTllZWNm ZjNiOTdkIDEwMDY0NAo+IC0tLSBhL2FyY2gveDg2L0tjb25maWcKPiArKysgYi9hcmNoL3g4Ni9L Y29uZmlnCj4gQEAgLTIwODIsNiArMjA4MiwxNyBAQCBjb25maWcgQ1JBU0hfRFVNUAo+ICAJICAo Q09ORklHX1JFTE9DQVRBQkxFPXkpLgo+ICAJICBGb3IgbW9yZSBkZXRhaWxzIHNlZSBEb2N1bWVu dGF0aW9uL2FkbWluLWd1aWRlL2tkdW1wL2tkdW1wLnJzdAo+ICAKPiArY29uZmlnIENSQVNIX01B WF9NRU1PUllfUkFOR0VTCj4gKwlkZXBlbmRzIG9uIENSQVNIX0RVTVAgJiYgS0VYRUNfRklMRSAm JiAoSE9UUExVR19DUFUgfHwgCk1FTU9SWV9IT1RQTFVHKQo+ICsJaW50Cj4gKwlkZWZhdWx0IDMy NzY4Cj4gKwloZWxwCj4gKwkgIEZvciB0aGUga2V4ZWNfZmlsZV9sb2FkIHBhdGgsIHNwZWNpZnkg dGhlIG1heGltdW0gbnVtYmVyIG9mCj4gKwkgIG1lbW9yeSByZWdpb25zLCBlZy4gYXMgcmVwcmVz ZW50ZWQgYnkgdGhlICdTeXN0ZW0gUkFNJyBlbnRyaWVzCj4gKwkgIGluIC9wcm9jL2lvbWVtLCB0 aGF0IHRoZSBlbGZjb3JlaGRyIGJ1ZmZlci9zZWdtZW50IGNhbiAKYWNjb21tb2RhdGUuCj4gKwkg IFRoaXMgdmFsdWUgaXMgY29tYmluZWQgd2l0aCBOUl9DUFVTIGFuZCBtdWx0aXBsaWVkIGJ5IApF bGY2NF9QaGRyCj4gKwkgIHNpemUgdG8gZGV0ZXJtaW5lIHRoZSBmaW5hbCBidWZmZXIgc2l6ZS4K PiArCj4gIGNvbmZpZyBLRVhFQ19KVU1QCj4gIAlib29sICJrZXhlYyBqdW1wIgo+ICAJZGVwZW5k cyBvbiBLRVhFQyAmJiBISUJFUk5BVElPTgo+IGRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwv Y3Jhc2guYyBiL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCj4gaW5kZXggOWRiNDFjY2U4ZDk3Li5i OWNkZjdhMGQ4NjggMTAwNjQ0Cj4gLS0tIGEvYXJjaC94ODYva2VybmVsL2NyYXNoLmMKPiArKysg Yi9hcmNoL3g4Ni9rZXJuZWwvY3Jhc2guYwo+IEBAIC0yNSw2ICsyNSw3IEBACj4gICNpbmNsdWRl IDxsaW51eC9zbGFiLmg+Cj4gICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+Cj4gICNpbmNsdWRl IDxsaW51eC9tZW1ibG9jay5oPgo+ICsjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgo+ICAKPiAg I2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KPiAgI2luY2x1ZGUgPGFzbS9oYXJkaXJxLmg+Cj4g QEAgLTM5OCw3ICszOTksMTcgQEAgaW50IGNyYXNoX2xvYWRfc2VnbWVudHMoc3RydWN0IGtpbWFn ZSAqaW1hZ2UpCj4gIAlpbWFnZS0+ZWxmX2hlYWRlcnMgPSBrYnVmLmJ1ZmZlcjsKPiAgCWltYWdl LT5lbGZfaGVhZGVyc19zeiA9IGtidWYuYnVmc3o7Cj4gIAo+ICsjaWYgZGVmaW5lZChDT05GSUdf SE9UUExVR19DUFUpIHx8IGRlZmluZWQoQ09ORklHX01FTU9SWV9IT1RQTFVHKQo+ICsJLyogRW5z dXJlIGVsZmNvcmVoZHIgc2VnbWVudCBsYXJnZSBlbm91Z2ggZm9yIGhvdHBsdWcgY2hhbmdlcyAq Lwo+ICsJa2J1Zi5tZW1zeiA9IChDT05GSUdfTlJfQ1BVU19ERUZBVUxUICsgCkNPTkZJR19DUkFT SF9NQVhfTUVNT1JZX1JBTkdFUykgKiBzaXplb2YoRWxmNjRfUGhkcik7Cj4gKwkvKiBGb3IgbWFy a2luZyBhcyB1c2FibGUgdG8gY3Jhc2gga2VybmVsICovCj4gKwlpbWFnZS0+ZWxmX2hlYWRlcnNf c3ogPSBrYnVmLm1lbXN6Owo+ICsJLyogUmVjb3JkIHRoZSBpbmRleCBvZiB0aGUgZWxmY29yZWhk ciBzZWdtZW50ICovCj4gKwlpbWFnZS0+ZWxmY29yZWhkcl9pbmRleCA9IGltYWdlLT5ucl9zZWdt ZW50czsKPiArCWltYWdlLT5lbGZjb3JlaGRyX2luZGV4X3ZhbGlkID0gdHJ1ZTsKPiArI2Vsc2UK PiAgCWtidWYubWVtc3ogPSBrYnVmLmJ1ZnN6Owo+ICsjZW5kaWYKPiAgCWtidWYuYnVmX2FsaWdu ID0gRUxGX0NPUkVfSEVBREVSX0FMSUdOOwo+ICAJa2J1Zi5tZW0gPSBLRVhFQ19CVUZfTUVNX1VO S05PV047Cj4gIAlyZXQgPSBrZXhlY19hZGRfYnVmZmVyKCZrYnVmKTsKPiBAQCAtNDEzLDMgKzQy NCwxMDggQEAgaW50IGNyYXNoX2xvYWRfc2VnbWVudHMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCj4g IAlyZXR1cm4gcmV0Owo+ICB9Cj4gICNlbmRpZiAvKiBDT05GSUdfS0VYRUNfRklMRSAqLwo+ICsK PiArI2lmIGRlZmluZWQoQ09ORklHX0hPVFBMVUdfQ1BVKSB8fCBkZWZpbmVkKENPTkZJR19NRU1P UllfSE9UUExVRykKPiAraW50IGNyYXNoX2hvdHBsdWdfc3VwcG9ydCh2b2lkKSB7IHJldHVybiAx OyB9Cj4gK3ZvaWQgKmFyY2hfbWFwX2NyYXNoX3BhZ2VzKHVuc2lnbmVkIGxvbmcgcGFkZHIsIHVu c2lnbmVkIGxvbmcgc2l6ZSkKPiArewo+ICsJLyoKPiArCSAqIE5PVEU6IFRoZSBhZGRyZXNzZXMg YW5kIHNpemVzIHBhc3NlZCB0byB0aGlzIHJvdXRpbmUgaGF2ZQo+ICsJICogYWxyZWFkeSBiZWVu IGZ1bGx5IGFsaWduZWQgb24gcGFnZSBib3VuZGFyaWVzLiBUaGVyZSBpcyBubwo+ICsJICogbmVl ZCBmb3IgbWFzc2FnaW5nIHRoZSBhZGRyZXNzIG9yIHNpemUuCj4gKwkgKi8KPiArCXZvaWQgKnB0 ciA9IE5VTEw7Cj4gKwo+ICsJLyogTk9URTogcmVxdWlyZXMgYXJjaF9rZXhlY19bdW5dcHJvdGVj dF9jcmFzaGtyZXMoKSBmb3Igd3JpdGUgCmFjY2VzcyAqLwo+ICsJaWYgKHNpemUgPiAwKSB7Cj4g KwkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwYWRkciA+PiBQQUdFX1NISUZUKTsK PiArCj4gKwkJcHRyID0ga21hcChwYWdlKTsKPiArCX0KCmttYXBfbG9jYWxfcGFnZSgpIGlzIHBy ZWZlcnJlZCBvdmVyIGttYXAoKSB3aGljaCBzaG91bGQgYmUgYXZvaWRlZCBpbiBuZXcgCmNvZGUg KHBsZWFzZSB0YWtlIGEgbG9vayBhdCBoaWdobWVtLnJzdCB3aGljaCBJIHJlY2VudGx5IHVwZGF0 ZWQpLgoKQ2FuIHlvdSBwbGVhc2UgY2hlY2sgaWYgeW91IGNhbiBlYXNpbHkgYXZvaWQgdXNpbmcg a21hcCgpPyBPdGhlcndpc2UsIHRoaXMgCmNvZGUgd2lsbCBiZSBhZGRlZCB0byBteSAobG9uZykg cXVldWUgYW5kIGNoYW5nZWQgb25lIGRheSBvciB0aGUgb3RoZXIgOi0pCgpUaGFua3MsCgpGYWJp bwoKPiArCj4gKwlyZXR1cm4gcHRyOwo+ICt9Cj4gKwo+ICt2b2lkIGFyY2hfdW5tYXBfY3Jhc2hf cGFnZXModm9pZCAqKnB0cikKPiArewo+ICsJaWYgKHB0cikgewo+ICsJCWlmICgqcHRyKQo+ICsJ CQlrdW5tYXAoKnB0cik7Cj4gKwkJKnB0ciA9IE5VTEw7Cj4gKwl9Cj4gK30KPiArCj4gKy8qKgo+ ICsgKiBhcmNoX2NyYXNoX2hhbmRsZV9ob3RwbHVnX2V2ZW50KCkgLSBIYW5kbGUgaG90cGx1ZyBl bGZjb3JlaGRyIGNoYW5nZXMKPiArICogQGltYWdlOiB0aGUgYWN0aXZlIHN0cnVjdCBraW1hZ2UK PiArICogQGhwX2FjdGlvbjogdGhlIGhvdCB1bi9wbHVnIGFjdGlvbiBiZWluZyBoYW5kbGVkCj4g KyAqIEBjcHU6IHdoZW4gS0VYRUNfQ1JBU0hfSFBfQUREL1JFTU9WRV9DUFUsIHRoZSBjcHUgYWZm ZWN0ZWQKPiArICoKPiArICogVG8gYWNjdXJhdGVseSByZWZsZWN0IGhvdCB1bi9wbHVnIGNoYW5n ZXMsIHRoZSBlbGZjb3JlaGRyICh3aGljaAo+ICsgKiBpcyBwYXNzZWQgdG8gdGhlIGNyYXNoIGtl cm5lbCB2aWEgdGhlIGVsZmNvcmVoZHI9IHBhcmFtZXRlcikKPiArICogbXVzdCBiZSB1cGRhdGVk IHdpdGggdGhlIG5ldyBsaXN0IG9mIENQVXMgYW5kIG1lbW9yaWVzLiBUaGUgbmV3Cj4gKyAqIGVs ZmNvcmVoZHIgaXMgcHJlcGFyZWQgaW4gYSBrZXJuZWwgYnVmZmVyLCBhbmQgdGhlbiBpdCBpcwo+ ICsgKiB3cml0dGVuIG9uIHRvcCBvZiB0aGUgZXhpc3Rpbmcvb2xkIGVsZmNvcmVoZHIuCj4gKyAq Cj4gKyAqIEZvciBob3RwbHVnIGNoYW5nZXMgdG8gZWxmY29yZWhkciB0byB3b3JrLCB0d28gY29u ZGl0aW9ucyBhcmUKPiArICogbmVlZGVkOgo+ICsgKiBGaXJzdCwgdGhlIHNlZ21lbnQgY29udGFp bmluZyB0aGUgZWxmY29yZWhkciBtdXN0IGJlIGxhcmdlIGVub3VnaAo+ICsgKiB0byBwZXJtaXQg YSBncm93aW5nIG51bWJlciBvZiByZXNvdXJjZXMuIFNlZSB0aGUKPiArICogQ09ORklHX0NSQVNI X01BWF9NRU1PUllfUkFOR0VTIGRlc2NyaXB0aW9uLgo+ICsgKiBTZWNvbmQsIHB1cmdhdG9yeSBt dXN0IGV4cGxpY2l0bHkgZXhjbHVkZSB0aGUgZWxmY29yZWhkciBmcm9tIHRoZQo+ICsgKiBsaXN0 IG9mIHNlZ21lbnRzIGl0IGNoZWNrcyAoc2luY2UgdGhlIGVsZmNvcmVoZHIgY2hhbmdlcyBhbmQg dGh1cwo+ICsgKiB3b3VsZCByZXF1aXJlIGFuIHVwZGF0ZSB0byBwdXJnYXRvcnkgaXRzZWxmIHRv IHVwZGF0ZSB0aGUgZGlnZXN0KS4KPiArICoKPiArICovCj4gK3ZvaWQgYXJjaF9jcmFzaF9oYW5k bGVfaG90cGx1Z19ldmVudChzdHJ1Y3Qga2ltYWdlICppbWFnZSwKPiArCXVuc2lnbmVkIGludCBo cF9hY3Rpb24sIHVuc2lnbmVkIGludCBjcHUpCj4gK3sKPiArCXN0cnVjdCBrZXhlY19zZWdtZW50 ICprc2VnbWVudDsKPiArCXVuc2lnbmVkIGNoYXIgKnB0ciA9IE5VTEw7Cj4gKwl1bnNpZ25lZCBs b25nIGVsZnN6ID0gMDsKPiArCXZvaWQgKmVsZmJ1ZiA9IE5VTEw7Cj4gKwl1bnNpZ25lZCBsb25n IG1lbSwgbWVtc3o7Cj4gKwo+ICsJLyoKPiArCSAqIEVsZmNvcmVoZHJfaW5kZXhfdmFsaWQgY2hl Y2tlZCBpbiAKY3Jhc2hfY29yZTpoYW5kbGVfaG90cGx1Z19ldmVudCgpCj4gKwkgKi8KPiArCWtz ZWdtZW50ID0gJmltYWdlLT5zZWdtZW50W2ltYWdlLT5lbGZjb3JlaGRyX2luZGV4XTsKPiArCW1l bSA9IGtzZWdtZW50LT5tZW07Cj4gKwltZW1zeiA9IGtzZWdtZW50LT5tZW1zejsKPiArCj4gKwkv Kgo+ICsJICogQ3JlYXRlIHRoZSBuZXcgZWxmY29yZWhkciByZWZsZWN0aW5nIHRoZSBjaGFuZ2Vz IHRvIENQVSBhbmQvb3IKPiArCSAqIG1lbW9yeSByZXNvdXJjZXMuCj4gKwkgKi8KPiArCWlmIChw cmVwYXJlX2VsZl9oZWFkZXJzKGltYWdlLCAmZWxmYnVmLCAmZWxmc3opKSB7Cj4gKwkJcHJfZXJy KCJjcmFzaCBocDogdW5hYmxlIHRvIHByZXBhcmUgZWxmY29yZSBoZWFkZXJzIik7Cj4gKwkJZ290 byBvdXQ7Cj4gKwl9Cj4gKwlpZiAoZWxmc3ogPiBtZW1zeikgewo+ICsJCXByX2VycigiY3Jhc2gg aHA6IHVwZGF0ZSBlbGZjb3JlaGRyIGVsZnN6ICVsdSA+IG1lbXN6IAolbHUiLAo+ICsJCQllbGZz eiwgbWVtc3opOwo+ICsJCWdvdG8gb3V0Owo+ICsJfQo+ICsKPiArCS8qCj4gKwkgKiBBdCB0aGlz IHBvaW50LCB3ZSBhcmUgYWxsIGJ1dCBhc3N1cmVkIG9mIHN1Y2Nlc3MuCj4gKwkgKiBDb3B5IG5l dyBlbGZjb3JlaGRyIGludG8gZGVzdGluYXRpb24uCj4gKwkgKi8KPiArCXB0ciA9IGFyY2hfbWFw X2NyYXNoX3BhZ2VzKG1lbSwgbWVtc3opOwo+ICsJaWYgKHB0cikgewo+ICsJCS8qCj4gKwkJICog VGVtcG9yYXJpbHkgaW52YWxpZGF0ZSB0aGUgY3Jhc2ggaW1hZ2Ugd2hpbGUgdGhlCj4gKwkJICog ZWxmY29yZWhkciBpcyB1cGRhdGVkLgo+ICsJCSAqLwo+ICsJCXhjaGcoJmtleGVjX2NyYXNoX2lt YWdlLCBOVUxMKTsKPiArCQltZW1jcHlfZmx1c2hjYWNoZSgodm9pZCAqKXB0ciwgZWxmYnVmLCBl bGZzeik7Cj4gKwkJeGNoZygma2V4ZWNfY3Jhc2hfaW1hZ2UsIGltYWdlKTsKPiArCX0KPiArCWFy Y2hfdW5tYXBfY3Jhc2hfcGFnZXMoKHZvaWQgKiopJnB0cik7Cj4gKwlwcl9kZWJ1ZygiY3Jhc2gg aHA6IHJlLWxvYWRlZCBlbGZjb3JlaGRyIGF0IDB4JWx4XG4iLCBtZW0pOwo+ICsKPiArb3V0Ogo+ ICsJaWYgKGVsZmJ1ZikKPiArCQl2ZnJlZShlbGZidWYpOwo+ICt9Cj4gKyNlbmRpZgo+IC0tIAo+ IDIuMzEuMQo+IAo+IAoKCgoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmtleGVjIG1haWxpbmcgbGlzdAprZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8va2V4ZWMK