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 X-Spam-Level: X-Spam-Status: No, score=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E11F2ECE58C for ; Mon, 7 Oct 2019 17:13:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A7635206C0 for ; Mon, 7 Oct 2019 17:13:11 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729215AbfJGRNK convert rfc822-to-8bit (ORCPT ); Mon, 7 Oct 2019 13:13:10 -0400 Received: from out03.mta.xmission.com ([166.70.13.233]:38255 "EHLO out03.mta.xmission.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728031AbfJGRNJ (ORCPT ); Mon, 7 Oct 2019 13:13:09 -0400 Received: from in01.mta.xmission.com ([166.70.13.51]) by out03.mta.xmission.com with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.87) (envelope-from ) id 1iHWZD-0003Yx-EL; Mon, 07 Oct 2019 11:13:03 -0600 Received: from ip68-227-160-95.om.om.cox.net ([68.227.160.95] helo=x220.xmission.com) by in01.mta.xmission.com with esmtpsa (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.87) (envelope-from ) id 1iHWZB-0006FD-OE; Mon, 07 Oct 2019 11:13:03 -0600 From: ebiederm@xmission.com (Eric W. Biederman) To: lijiang Cc: Dave Young , linux-kernel@vger.kernel.org, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, x86@kernel.org, bhe@redhat.com, jgross@suse.com, dhowells@redhat.com, Thomas.Lendacky@amd.com, vgoyal@redhat.com, kexec@lists.infradead.org References: <20191007070844.15935-1-lijiang@redhat.com> <20191007093338.GA4710@dhcp-128-65.nay.redhat.com> Date: Mon, 07 Oct 2019 12:12:17 -0500 In-Reply-To: (lijiang's message of "Mon, 7 Oct 2019 19:53:57 +0800") Message-ID: <87bluseaz2.fsf@x220.int.ebiederm.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8BIT X-XM-SPF: eid=1iHWZB-0006FD-OE;;;mid=<87bluseaz2.fsf@x220.int.ebiederm.org>;;;hst=in01.mta.xmission.com;;;ip=68.227.160.95;;;frm=ebiederm@xmission.com;;;spf=neutral X-XM-AID: U2FsdGVkX1+gQMszSm+ZkbXzH79qaWxb0n7iQC2kol4= X-SA-Exim-Connect-IP: 68.227.160.95 X-SA-Exim-Mail-From: ebiederm@xmission.com Subject: Re: [PATCH v2] x86/kdump: Fix 'kmem -s' reported an invalid freepointer when SME was active X-SA-Exim-Version: 4.2.1 (built Thu, 05 May 2016 13:38:54 -0600) X-SA-Exim-Scanned: Yes (on in01.mta.xmission.com) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org lijiang writes: > 在 2019年10月07日 17:33, Dave Young 写道: >> Hi Lianbo, >> On 10/07/19 at 03:08pm, Lianbo Jiang wrote: >>> Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204793 >>> >>> Kdump kernel will reuse the first 640k region because of some reasons, >>> for example: the trampline and conventional PC system BIOS region may >>> require to allocate memory in this area. Obviously, kdump kernel will >>> also overwrite the first 640k region, therefore, kernel has to copy >>> the contents of the first 640k area to a backup area, which is done in >>> purgatory(), because vmcore may need the old memory. When vmcore is >>> dumped, kdump kernel will read the old memory from the backup area of >>> the first 640k area. >>> >>> Basically, the main reason should be clear, kernel does not correctly >>> handle the first 640k region when SME is active, which causes that >>> kernel does not properly copy these old memory to the backup area in >>> purgatory(). Therefore, kdump kernel reads out the incorrect contents >>> from the backup area when dumping vmcore. Finally, the phenomenon is >>> as follow: >>> >>> [root linux]$ crash vmlinux /var/crash/127.0.0.1-2019-09-19-08\:31\:27/vmcore >>> WARNING: kernel relocated [240MB]: patching 97110 gdb minimal_symbol values >>> >>> KERNEL: /var/crash/127.0.0.1-2019-09-19-08:31:27/vmlinux >>> DUMPFILE: /var/crash/127.0.0.1-2019-09-19-08:31:27/vmcore [PARTIAL DUMP] >>> CPUS: 128 >>> DATE: Thu Sep 19 08:31:18 2019 >>> UPTIME: 00:01:21 >>> LOAD AVERAGE: 0.16, 0.07, 0.02 >>> TASKS: 1343 >>> NODENAME: amd-ethanol >>> RELEASE: 5.3.0-rc7+ >>> VERSION: #4 SMP Thu Sep 19 08:14:00 EDT 2019 >>> MACHINE: x86_64 (2195 Mhz) >>> MEMORY: 127.9 GB >>> PANIC: "Kernel panic - not syncing: sysrq triggered crash" >>> PID: 9789 >>> COMMAND: "bash" >>> TASK: "ffff89711894ae80 [THREAD_INFO: ffff89711894ae80]" >>> CPU: 83 >>> STATE: TASK_RUNNING (PANIC) >>> >>> crash> kmem -s|grep -i invalid >>> kmem: dma-kmalloc-512: slab:ffffd77680001c00 invalid freepointer:a6086ac099f0c5a4 >>> kmem: dma-kmalloc-512: slab:ffffd77680001c00 invalid freepointer:a6086ac099f0c5a4 >>> crash> >>> >>> BTW: I also tried to fix the above problem in purgatory(), but there >>> are too many restricts in purgatory() context, for example: i can't >>> allocate new memory to create the identity mapping page table for SME >>> situation. >>> >>> Currently, there are two places where the first 640k area is needed, >>> the first one is in the find_trampoline_placement(), another one is >>> in the reserve_real_mode(), and their content doesn't matter. To avoid >>> the above error, lets occupy the remain memory of the first 640k region >>> (expect for the trampoline and real mode) so that the allocated memory >>> does not fall into the first 640k area when SME is active, which makes >>> us not to worry about whether kernel can correctly copy the contents of >>> the first 640k area to a backup region in the purgatory(). >>> >>> Signed-off-by: Lianbo Jiang >>> --- >>> Changes since v1: >>> 1. Improve patch log >>> 2. Change the checking condition from sme_active() to sme_active() >>> && strstr(boot_command_line, "crashkernel=") >>> >>> arch/x86/kernel/setup.c | 3 +++ >>> 1 file changed, 3 insertions(+) >>> >>> diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c >>> index 77ea96b794bd..bdb1a02a84fd 100644 >>> --- a/arch/x86/kernel/setup.c >>> +++ b/arch/x86/kernel/setup.c >>> @@ -1148,6 +1148,9 @@ void __init setup_arch(char **cmdline_p) >>> >>> reserve_real_mode(); >>> >>> + if (sme_active() && strstr(boot_command_line, "crashkernel=")) >>> + memblock_reserve(0, 640*1024); >>> + >> >> Seems you missed the comment about "unconditionally do it", only check >> crashkernel param looks better. >> > If so, it means that copying the first 640k to a backup region is no longer needed, and > i should post a patch series to remove the copy_backup_region(). Any idea? > >> Also I noticed reserve_crashkernel is called after initmem_init, I'm not >> sure if memblock_reserve is good enough in early code before >> initmem_init. >> > The first zero page and real mode are also reserved before the initmem_init(), > and seems that they work well until now. > > Thanks. > Lianbo This has only been boot tested but I think this is about what we need. I feel like I haven't found and deleted all of the backup region code. I think it is important to have the reservation code in reseve_real_mode as the logic is fundamentally intertwined. Eric From: "Eric W. Biederman" Date: Mon, 7 Oct 2019 11:57:24 -0500 Subject: [PATCH] x86/kexec: Always reserve the low 1MiB When the crashkernel kernel command line option is specified always reserve the low 1MiB. That way it does not need to be included in crash dumps or used for anything execept the processor trampolines that must live in the low 1MiB. The current handling of copying the low 1MiB runs into problems when SME is active. So just simplify everything and make it unnecessary to do anything with the low 1MiB. This comes at a cost of 640KiB. But when crash kernels need 32MiB or more to run this isn't much more, and it makes everything much more reliable. Signed-off-by: "Eric W. Biederman" --- arch/x86/include/asm/kexec.h | 4 ---- arch/x86/kernel/crash.c | 19 ------------------- arch/x86/purgatory/purgatory.c | 15 --------------- arch/x86/realmode/init.c | 10 ++++++++++ 4 files changed, 10 insertions(+), 38 deletions(-) diff --git a/arch/x86/include/asm/kexec.h b/arch/x86/include/asm/kexec.h index 5e7d6b46de97..e36307ac324d 100644 --- a/arch/x86/include/asm/kexec.h +++ b/arch/x86/include/asm/kexec.h @@ -66,10 +66,6 @@ struct kimage; # define KEXEC_ARCH KEXEC_ARCH_X86_64 #endif -/* Memory to backup during crash kdump */ -#define KEXEC_BACKUP_SRC_START (0UL) -#define KEXEC_BACKUP_SRC_END (640 * 1024UL - 1) /* 640K */ - /* * This function is responsible for capturing register states if coming * via panic otherwise just fix up the ss and sp if coming via kernel diff --git a/arch/x86/kernel/crash.c b/arch/x86/kernel/crash.c index eb651fbde92a..dc4773d2f4a6 100644 --- a/arch/x86/kernel/crash.c +++ b/arch/x86/kernel/crash.c @@ -409,31 +409,12 @@ int crash_setup_memmap_entries(struct kimage *image, struct boot_params *params) return ret; } -static int determine_backup_region(struct resource *res, void *arg) -{ - struct kimage *image = arg; - - image->arch.backup_src_start = res->start; - image->arch.backup_src_sz = resource_size(res); - - /* Expecting only one range for backup region */ - return 1; -} - int crash_load_segments(struct kimage *image) { int ret; struct kexec_buf kbuf = { .image = image, .buf_min = 0, .buf_max = ULONG_MAX, .top_down = false }; - /* - * Determine and load a segment for backup area. First 640K RAM - * region is backup source - */ - - ret = walk_system_ram_res(KEXEC_BACKUP_SRC_START, KEXEC_BACKUP_SRC_END, - image, determine_backup_region); - /* Zero or postive return values are ok */ if (ret < 0) return ret; diff --git a/arch/x86/purgatory/purgatory.c b/arch/x86/purgatory/purgatory.c index 3b95410ff0f8..448de04703ba 100644 --- a/arch/x86/purgatory/purgatory.c +++ b/arch/x86/purgatory/purgatory.c @@ -22,20 +22,6 @@ u8 purgatory_sha256_digest[SHA256_DIGEST_SIZE] __section(.kexec-purgatory); struct kexec_sha_region purgatory_sha_regions[KEXEC_SEGMENT_MAX] __section(.kexec-purgatory); -/* - * On x86, second kernel requries first 640K of memory to boot. Copy - * first 640K to a backup region in reserved memory range so that second - * kernel can use first 640K. - */ -static int copy_backup_region(void) -{ - if (purgatory_backup_dest) { - memcpy((void *)purgatory_backup_dest, - (void *)purgatory_backup_src, purgatory_backup_sz); - } - return 0; -} - static int verify_sha256_digest(void) { struct kexec_sha_region *ptr, *end; @@ -66,7 +52,6 @@ void purgatory(void) for (;;) ; } - copy_backup_region(); } /* diff --git a/arch/x86/realmode/init.c b/arch/x86/realmode/init.c index 7dce39c8c034..76c680ad23a1 100644 --- a/arch/x86/realmode/init.c +++ b/arch/x86/realmode/init.c @@ -34,6 +34,16 @@ void __init reserve_real_mode(void) memblock_reserve(mem, size); set_real_mode_mem(mem); + +#ifdef CONFIG_KEXEC_CORE + /* When crashkernel is specified only use the low 1MiB for the + * real mode trampolines. + */ + if (strstr(boot_command_line, "crashkernel=")) { + memblock_reserve(0, 1<<20); + pr_info("Reserving low 1MiB of memory for crashkernel\n"); + } +#endif /* CONFIG_KEXEC_CORE */ } static void __init setup_real_mode(void) -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from out03.mta.xmission.com ([166.70.13.233]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iHWZk-0007J6-JE for kexec@lists.infradead.org; Mon, 07 Oct 2019 17:13:38 +0000 From: ebiederm@xmission.com (Eric W. Biederman) References: <20191007070844.15935-1-lijiang@redhat.com> <20191007093338.GA4710@dhcp-128-65.nay.redhat.com> Date: Mon, 07 Oct 2019 12:12:17 -0500 In-Reply-To: (lijiang's message of "Mon, 7 Oct 2019 19:53:57 +0800") Message-ID: <87bluseaz2.fsf@x220.int.ebiederm.org> MIME-Version: 1.0 Subject: Re: [PATCH v2] x86/kdump: Fix 'kmem -s' reported an invalid freepointer when SME was active 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+dwmw2=infradead.org@lists.infradead.org To: lijiang Cc: jgross@suse.com, Thomas.Lendacky@amd.com, bhe@redhat.com, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, dhowells@redhat.com, mingo@redhat.com, bp@alien8.de, hpa@zytor.com, tglx@linutronix.de, Dave Young , vgoyal@redhat.com bGlqaWFuZyA8bGlqaWFuZ0ByZWRoYXQuY29tPiB3cml0ZXM6Cgo+IOWcqCAyMDE55bm0MTDmnIgw N+aXpSAxNzozMywgRGF2ZSBZb3VuZyDlhpnpgZM6Cj4+IEhpIExpYW5ibywKPj4gT24gMTAvMDcv MTkgYXQgMDM6MDhwbSwgTGlhbmJvIEppYW5nIHdyb3RlOgo+Pj4gQnVnemlsbGE6IGh0dHBzOi8v YnVnemlsbGEua2VybmVsLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA0NzkzCj4+Pgo+Pj4gS2R1bXAg a2VybmVsIHdpbGwgcmV1c2UgdGhlIGZpcnN0IDY0MGsgcmVnaW9uIGJlY2F1c2Ugb2Ygc29tZSBy ZWFzb25zLAo+Pj4gZm9yIGV4YW1wbGU6IHRoZSB0cmFtcGxpbmUgYW5kIGNvbnZlbnRpb25hbCBQ QyBzeXN0ZW0gQklPUyByZWdpb24gbWF5Cj4+PiByZXF1aXJlIHRvIGFsbG9jYXRlIG1lbW9yeSBp biB0aGlzIGFyZWEuIE9idmlvdXNseSwga2R1bXAga2VybmVsIHdpbGwKPj4+IGFsc28gb3Zlcndy aXRlIHRoZSBmaXJzdCA2NDBrIHJlZ2lvbiwgdGhlcmVmb3JlLCBrZXJuZWwgaGFzIHRvIGNvcHkK Pj4+IHRoZSBjb250ZW50cyBvZiB0aGUgZmlyc3QgNjQwayBhcmVhIHRvIGEgYmFja3VwIGFyZWEs IHdoaWNoIGlzIGRvbmUgaW4KPj4+IHB1cmdhdG9yeSgpLCBiZWNhdXNlIHZtY29yZSBtYXkgbmVl ZCB0aGUgb2xkIG1lbW9yeS4gV2hlbiB2bWNvcmUgaXMKPj4+IGR1bXBlZCwga2R1bXAga2VybmVs IHdpbGwgcmVhZCB0aGUgb2xkIG1lbW9yeSBmcm9tIHRoZSBiYWNrdXAgYXJlYSBvZgo+Pj4gdGhl IGZpcnN0IDY0MGsgYXJlYS4KPj4+Cj4+PiBCYXNpY2FsbHksIHRoZSBtYWluIHJlYXNvbiBzaG91 bGQgYmUgY2xlYXIsIGtlcm5lbCBkb2VzIG5vdCBjb3JyZWN0bHkKPj4+IGhhbmRsZSB0aGUgZmly c3QgNjQwayByZWdpb24gd2hlbiBTTUUgaXMgYWN0aXZlLCB3aGljaCBjYXVzZXMgdGhhdAo+Pj4g a2VybmVsIGRvZXMgbm90IHByb3Blcmx5IGNvcHkgdGhlc2Ugb2xkIG1lbW9yeSB0byB0aGUgYmFj a3VwIGFyZWEgaW4KPj4+IHB1cmdhdG9yeSgpLiBUaGVyZWZvcmUsIGtkdW1wIGtlcm5lbCByZWFk cyBvdXQgdGhlIGluY29ycmVjdCBjb250ZW50cwo+Pj4gZnJvbSB0aGUgYmFja3VwIGFyZWEgd2hl biBkdW1waW5nIHZtY29yZS4gRmluYWxseSwgdGhlIHBoZW5vbWVub24gaXMKPj4+IGFzIGZvbGxv dzoKPj4+Cj4+PiBbcm9vdCBsaW51eF0kIGNyYXNoIHZtbGludXggL3Zhci9jcmFzaC8xMjcuMC4w LjEtMjAxOS0wOS0xOS0wOFw6MzFcOjI3L3ZtY29yZQo+Pj4gV0FSTklORzoga2VybmVsIHJlbG9j YXRlZCBbMjQwTUJdOiBwYXRjaGluZyA5NzExMCBnZGIgbWluaW1hbF9zeW1ib2wgdmFsdWVzCj4+ Pgo+Pj4gICAgICAgS0VSTkVMOiAvdmFyL2NyYXNoLzEyNy4wLjAuMS0yMDE5LTA5LTE5LTA4OjMx OjI3L3ZtbGludXgKPj4+ICAgICBEVU1QRklMRTogL3Zhci9jcmFzaC8xMjcuMC4wLjEtMjAxOS0w OS0xOS0wODozMToyNy92bWNvcmUgIFtQQVJUSUFMIERVTVBdCj4+PiAgICAgICAgIENQVVM6IDEy OAo+Pj4gICAgICAgICBEQVRFOiBUaHUgU2VwIDE5IDA4OjMxOjE4IDIwMTkKPj4+ICAgICAgIFVQ VElNRTogMDA6MDE6MjEKPj4+IExPQUQgQVZFUkFHRTogMC4xNiwgMC4wNywgMC4wMgo+Pj4gICAg ICAgIFRBU0tTOiAxMzQzCj4+PiAgICAgTk9ERU5BTUU6IGFtZC1ldGhhbm9sCj4+PiAgICAgIFJF TEVBU0U6IDUuMy4wLXJjNysKPj4+ICAgICAgVkVSU0lPTjogIzQgU01QIFRodSBTZXAgMTkgMDg6 MTQ6MDAgRURUIDIwMTkKPj4+ICAgICAgTUFDSElORTogeDg2XzY0ICAoMjE5NSBNaHopCj4+PiAg ICAgICBNRU1PUlk6IDEyNy45IEdCCj4+PiAgICAgICAgUEFOSUM6ICJLZXJuZWwgcGFuaWMgLSBu b3Qgc3luY2luZzogc3lzcnEgdHJpZ2dlcmVkIGNyYXNoIgo+Pj4gICAgICAgICAgUElEOiA5Nzg5 Cj4+PiAgICAgIENPTU1BTkQ6ICJiYXNoIgo+Pj4gICAgICAgICBUQVNLOiAiZmZmZjg5NzExODk0 YWU4MCAgW1RIUkVBRF9JTkZPOiBmZmZmODk3MTE4OTRhZTgwXSIKPj4+ICAgICAgICAgIENQVTog ODMKPj4+ICAgICAgICBTVEFURTogVEFTS19SVU5OSU5HIChQQU5JQykKPj4+Cj4+PiBjcmFzaD4g a21lbSAtc3xncmVwIC1pIGludmFsaWQKPj4+IGttZW06IGRtYS1rbWFsbG9jLTUxMjogc2xhYjpm ZmZmZDc3NjgwMDAxYzAwIGludmFsaWQgZnJlZXBvaW50ZXI6YTYwODZhYzA5OWYwYzVhNAo+Pj4g a21lbTogZG1hLWttYWxsb2MtNTEyOiBzbGFiOmZmZmZkNzc2ODAwMDFjMDAgaW52YWxpZCBmcmVl cG9pbnRlcjphNjA4NmFjMDk5ZjBjNWE0Cj4+PiBjcmFzaD4KPj4+Cj4+PiBCVFc6IEkgYWxzbyB0 cmllZCB0byBmaXggdGhlIGFib3ZlIHByb2JsZW0gaW4gcHVyZ2F0b3J5KCksIGJ1dCB0aGVyZQo+ Pj4gYXJlIHRvbyBtYW55IHJlc3RyaWN0cyBpbiBwdXJnYXRvcnkoKSBjb250ZXh0LCBmb3IgZXhh bXBsZTogaSBjYW4ndAo+Pj4gYWxsb2NhdGUgbmV3IG1lbW9yeSB0byBjcmVhdGUgdGhlIGlkZW50 aXR5IG1hcHBpbmcgcGFnZSB0YWJsZSBmb3IgU01FCj4+PiBzaXR1YXRpb24uCj4+Pgo+Pj4gQ3Vy cmVudGx5LCB0aGVyZSBhcmUgdHdvIHBsYWNlcyB3aGVyZSB0aGUgZmlyc3QgNjQwayBhcmVhIGlz IG5lZWRlZCwKPj4+IHRoZSBmaXJzdCBvbmUgaXMgaW4gdGhlIGZpbmRfdHJhbXBvbGluZV9wbGFj ZW1lbnQoKSwgYW5vdGhlciBvbmUgaXMKPj4+IGluIHRoZSByZXNlcnZlX3JlYWxfbW9kZSgpLCBh bmQgdGhlaXIgY29udGVudCBkb2Vzbid0IG1hdHRlci4gVG8gYXZvaWQKPj4+IHRoZSBhYm92ZSBl cnJvciwgbGV0cyBvY2N1cHkgdGhlIHJlbWFpbiBtZW1vcnkgb2YgdGhlIGZpcnN0IDY0MGsgcmVn aW9uCj4+PiAoZXhwZWN0IGZvciB0aGUgdHJhbXBvbGluZSBhbmQgcmVhbCBtb2RlKSBzbyB0aGF0 IHRoZSBhbGxvY2F0ZWQgbWVtb3J5Cj4+PiBkb2VzIG5vdCBmYWxsIGludG8gdGhlIGZpcnN0IDY0 MGsgYXJlYSB3aGVuIFNNRSBpcyBhY3RpdmUsIHdoaWNoIG1ha2VzCj4+PiB1cyBub3QgdG8gd29y cnkgYWJvdXQgd2hldGhlciBrZXJuZWwgY2FuIGNvcnJlY3RseSBjb3B5IHRoZSBjb250ZW50cyBv Zgo+Pj4gdGhlIGZpcnN0IDY0MGsgYXJlYSB0byBhIGJhY2t1cCByZWdpb24gaW4gdGhlIHB1cmdh dG9yeSgpLgo+Pj4KPj4+IFNpZ25lZC1vZmYtYnk6IExpYW5ibyBKaWFuZyA8bGlqaWFuZ0ByZWRo YXQuY29tPgo+Pj4gLS0tCj4+PiBDaGFuZ2VzIHNpbmNlIHYxOgo+Pj4gMS4gSW1wcm92ZSBwYXRj aCBsb2cKPj4+IDIuIENoYW5nZSB0aGUgY2hlY2tpbmcgY29uZGl0aW9uIGZyb20gc21lX2FjdGl2 ZSgpIHRvIHNtZV9hY3RpdmUoKQo+Pj4gICAgJiYgc3Ryc3RyKGJvb3RfY29tbWFuZF9saW5lLCAi Y3Jhc2hrZXJuZWw9IikKPj4+Cj4+PiAgYXJjaC94ODYva2VybmVsL3NldHVwLmMgfCAzICsrKwo+ Pj4gIDEgZmlsZSBjaGFuZ2VkLCAzIGluc2VydGlvbnMoKykKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEv YXJjaC94ODYva2VybmVsL3NldHVwLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYwo+Pj4gaW5k ZXggNzdlYTk2Yjc5NGJkLi5iZGIxYTAyYTg0ZmQgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL3g4Ni9r ZXJuZWwvc2V0dXAuYwo+Pj4gKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwLmMKPj4+IEBAIC0x MTQ4LDYgKzExNDgsOSBAQCB2b2lkIF9faW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3Ap Cj4+PiAgCj4+PiAgCXJlc2VydmVfcmVhbF9tb2RlKCk7Cj4+PiAgCj4+PiArCWlmIChzbWVfYWN0 aXZlKCkgJiYgc3Ryc3RyKGJvb3RfY29tbWFuZF9saW5lLCAiY3Jhc2hrZXJuZWw9IikpCj4+PiAr CQltZW1ibG9ja19yZXNlcnZlKDAsIDY0MCoxMDI0KTsKPj4+ICsKPj4gCj4+IFNlZW1zIHlvdSBt aXNzZWQgdGhlIGNvbW1lbnQgYWJvdXQgInVuY29uZGl0aW9uYWxseSBkbyBpdCIsIG9ubHkgY2hl Y2sKPj4gY3Jhc2hrZXJuZWwgcGFyYW0gbG9va3MgYmV0dGVyLgo+PiAKPiBJZiBzbywgaXQgbWVh bnMgdGhhdCBjb3B5aW5nIHRoZSBmaXJzdCA2NDBrIHRvIGEgYmFja3VwIHJlZ2lvbiBpcyBubyBs b25nZXIgbmVlZGVkLCBhbmQKPiBpIHNob3VsZCBwb3N0IGEgcGF0Y2ggc2VyaWVzIHRvIHJlbW92 ZSB0aGUgY29weV9iYWNrdXBfcmVnaW9uKCkuIEFueSBpZGVhPwo+Cj4+IEFsc28gSSBub3RpY2Vk IHJlc2VydmVfY3Jhc2hrZXJuZWwgaXMgY2FsbGVkIGFmdGVyIGluaXRtZW1faW5pdCwgSSdtIG5v dAo+PiBzdXJlIGlmIG1lbWJsb2NrX3Jlc2VydmUgaXMgZ29vZCBlbm91Z2ggaW4gZWFybHkgY29k ZSBiZWZvcmUKPj4gaW5pdG1lbV9pbml0LiAKPj4KPiBUaGUgZmlyc3QgemVybyBwYWdlIGFuZCBy ZWFsIG1vZGUgYXJlIGFsc28gcmVzZXJ2ZWQgYmVmb3JlIHRoZSBpbml0bWVtX2luaXQoKSwKPiBh bmQgc2VlbXMgdGhhdCB0aGV5IHdvcmsgd2VsbCB1bnRpbCBub3cuCj4KPiBUaGFua3MuCj4gTGlh bmJvCgpUaGlzIGhhcyBvbmx5IGJlZW4gYm9vdCB0ZXN0ZWQgYnV0IEkgdGhpbmsgdGhpcyBpcyBh Ym91dCB3aGF0IHdlIG5lZWQuCgpJIGZlZWwgbGlrZSBJIGhhdmVuJ3QgZm91bmQgYW5kIGRlbGV0 ZWQgYWxsIG9mIHRoZSBiYWNrdXAgcmVnaW9uIGNvZGUuCgpJIHRoaW5rIGl0IGlzIGltcG9ydGFu dCB0byBoYXZlIHRoZSByZXNlcnZhdGlvbiBjb2RlIGluIHJlc2V2ZV9yZWFsX21vZGUKYXMgdGhl IGxvZ2ljIGlzIGZ1bmRhbWVudGFsbHkgaW50ZXJ0d2luZWQuCgpFcmljCgoKRnJvbTogIkVyaWMg Vy4gQmllZGVybWFuIiA8ZWJpZWRlcm1AeG1pc3Npb24uY29tPgpEYXRlOiBNb24sIDcgT2N0IDIw MTkgMTE6NTc6MjQgLTA1MDAKU3ViamVjdDogW1BBVENIXSB4ODYva2V4ZWM6IEFsd2F5cyByZXNl cnZlIHRoZSBsb3cgMU1pQgoKV2hlbiB0aGUgY3Jhc2hrZXJuZWwga2VybmVsIGNvbW1hbmQgbGlu ZSBvcHRpb24gaXMgc3BlY2lmaWVkIGFsd2F5cwpyZXNlcnZlIHRoZSBsb3cgMU1pQi4gICAgVGhh dCB3YXkgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBpbmNsdWRlZAppbiBjcmFzaCBkdW1wcyBvciB1 c2VkIGZvciBhbnl0aGluZyBleGVjZXB0IHRoZSBwcm9jZXNzb3IgdHJhbXBvbGluZXMKdGhhdCBt dXN0IGxpdmUgaW4gdGhlIGxvdyAxTWlCLgoKVGhlIGN1cnJlbnQgaGFuZGxpbmcgb2YgY29weWlu ZyB0aGUgbG93IDFNaUIgcnVucyBpbnRvIHByb2JsZW1zIHdoZW4KU01FIGlzIGFjdGl2ZS4gIFNv IGp1c3Qgc2ltcGxpZnkgZXZlcnl0aGluZyBhbmQgbWFrZSBpdCB1bm5lY2Vzc2FyeQp0byBkbyBh bnl0aGluZyB3aXRoIHRoZSBsb3cgMU1pQi4KClRoaXMgY29tZXMgYXQgYSBjb3N0IG9mIDY0MEtp Qi4gIEJ1dCB3aGVuIGNyYXNoIGtlcm5lbHMgbmVlZCAzMk1pQiBvcgptb3JlIHRvIHJ1biB0aGlz IGlzbid0IG11Y2ggbW9yZSwgYW5kIGl0IG1ha2VzIGV2ZXJ5dGhpbmcgbXVjaCBtb3JlCnJlbGlh YmxlLgoKU2lnbmVkLW9mZi1ieTogIkVyaWMgVy4gQmllZGVybWFuIiA8ZWJpZWRlcm1AeG1pc3Np b24uY29tPgotLS0KIGFyY2gveDg2L2luY2x1ZGUvYXNtL2tleGVjLmggICB8ICA0IC0tLS0KIGFy Y2gveDg2L2tlcm5lbC9jcmFzaC5jICAgICAgICB8IDE5IC0tLS0tLS0tLS0tLS0tLS0tLS0KIGFy Y2gveDg2L3B1cmdhdG9yeS9wdXJnYXRvcnkuYyB8IDE1IC0tLS0tLS0tLS0tLS0tLQogYXJjaC94 ODYvcmVhbG1vZGUvaW5pdC5jICAgICAgIHwgMTAgKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2Vk LCAxMCBpbnNlcnRpb25zKCspLCAzOCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9hcmNoL3g4 Ni9pbmNsdWRlL2FzbS9rZXhlYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20va2V4ZWMuaAppbmRl eCA1ZTdkNmI0NmRlOTcuLmUzNjMwN2FjMzI0ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVk ZS9hc20va2V4ZWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rZXhlYy5oCkBAIC02Niwx MCArNjYsNiBAQCBzdHJ1Y3Qga2ltYWdlOwogIyBkZWZpbmUgS0VYRUNfQVJDSCBLRVhFQ19BUkNI X1g4Nl82NAogI2VuZGlmCiAKLS8qIE1lbW9yeSB0byBiYWNrdXAgZHVyaW5nIGNyYXNoIGtkdW1w ICovCi0jZGVmaW5lIEtFWEVDX0JBQ0tVUF9TUkNfU1RBUlQJKDBVTCkKLSNkZWZpbmUgS0VYRUNf QkFDS1VQX1NSQ19FTkQJKDY0MCAqIDEwMjRVTCAtIDEpCS8qIDY0MEsgKi8KLQogLyoKICAqIFRo aXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGNhcHR1cmluZyByZWdpc3RlciBzdGF0ZXMg aWYgY29taW5nCiAgKiB2aWEgcGFuaWMgb3RoZXJ3aXNlIGp1c3QgZml4IHVwIHRoZSBzcyBhbmQg c3AgaWYgY29taW5nIHZpYSBrZXJuZWwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcmFz aC5jIGIvYXJjaC94ODYva2VybmVsL2NyYXNoLmMKaW5kZXggZWI2NTFmYmRlOTJhLi5kYzQ3NzNk MmY0YTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcmFzaC5jCisrKyBiL2FyY2gveDg2 L2tlcm5lbC9jcmFzaC5jCkBAIC00MDksMzEgKzQwOSwxMiBAQCBpbnQgY3Jhc2hfc2V0dXBfbWVt bWFwX2VudHJpZXMoc3RydWN0IGtpbWFnZSAqaW1hZ2UsIHN0cnVjdCBib290X3BhcmFtcyAqcGFy YW1zKQogCXJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgZGV0ZXJtaW5lX2JhY2t1cF9yZWdp b24oc3RydWN0IHJlc291cmNlICpyZXMsIHZvaWQgKmFyZykKLXsKLQlzdHJ1Y3Qga2ltYWdlICpp bWFnZSA9IGFyZzsKLQotCWltYWdlLT5hcmNoLmJhY2t1cF9zcmNfc3RhcnQgPSByZXMtPnN0YXJ0 OwotCWltYWdlLT5hcmNoLmJhY2t1cF9zcmNfc3ogPSByZXNvdXJjZV9zaXplKHJlcyk7Ci0KLQkv KiBFeHBlY3Rpbmcgb25seSBvbmUgcmFuZ2UgZm9yIGJhY2t1cCByZWdpb24gKi8KLQlyZXR1cm4g MTsKLX0KLQogaW50IGNyYXNoX2xvYWRfc2VnbWVudHMoc3RydWN0IGtpbWFnZSAqaW1hZ2UpCiB7 CiAJaW50IHJldDsKIAlzdHJ1Y3Qga2V4ZWNfYnVmIGtidWYgPSB7IC5pbWFnZSA9IGltYWdlLCAu YnVmX21pbiA9IDAsCiAJCQkJICAuYnVmX21heCA9IFVMT05HX01BWCwgLnRvcF9kb3duID0gZmFs c2UgfTsKIAotCS8qCi0JICogRGV0ZXJtaW5lIGFuZCBsb2FkIGEgc2VnbWVudCBmb3IgYmFja3Vw IGFyZWEuIEZpcnN0IDY0MEsgUkFNCi0JICogcmVnaW9uIGlzIGJhY2t1cCBzb3VyY2UKLQkgKi8K LQotCXJldCA9IHdhbGtfc3lzdGVtX3JhbV9yZXMoS0VYRUNfQkFDS1VQX1NSQ19TVEFSVCwgS0VY RUNfQkFDS1VQX1NSQ19FTkQsCi0JCQkJaW1hZ2UsIGRldGVybWluZV9iYWNrdXBfcmVnaW9uKTsK LQogCS8qIFplcm8gb3IgcG9zdGl2ZSByZXR1cm4gdmFsdWVzIGFyZSBvayAqLwogCWlmIChyZXQg PCAwKQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvcHVyZ2F0b3J5L3B1cmdh dG9yeS5jIGIvYXJjaC94ODYvcHVyZ2F0b3J5L3B1cmdhdG9yeS5jCmluZGV4IDNiOTU0MTBmZjBm OC4uNDQ4ZGUwNDcwM2JhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wdXJnYXRvcnkvcHVyZ2F0b3J5 LmMKKysrIGIvYXJjaC94ODYvcHVyZ2F0b3J5L3B1cmdhdG9yeS5jCkBAIC0yMiwyMCArMjIsNiBA QCB1OCBwdXJnYXRvcnlfc2hhMjU2X2RpZ2VzdFtTSEEyNTZfRElHRVNUX1NJWkVdIF9fc2VjdGlv bigua2V4ZWMtcHVyZ2F0b3J5KTsKIAogc3RydWN0IGtleGVjX3NoYV9yZWdpb24gcHVyZ2F0b3J5 X3NoYV9yZWdpb25zW0tFWEVDX1NFR01FTlRfTUFYXSBfX3NlY3Rpb24oLmtleGVjLXB1cmdhdG9y eSk7CiAKLS8qCi0gKiBPbiB4ODYsIHNlY29uZCBrZXJuZWwgcmVxdXJpZXMgZmlyc3QgNjQwSyBv ZiBtZW1vcnkgdG8gYm9vdC4gQ29weQotICogZmlyc3QgNjQwSyB0byBhIGJhY2t1cCByZWdpb24g aW4gcmVzZXJ2ZWQgbWVtb3J5IHJhbmdlIHNvIHRoYXQgc2Vjb25kCi0gKiBrZXJuZWwgY2FuIHVz ZSBmaXJzdCA2NDBLLgotICovCi1zdGF0aWMgaW50IGNvcHlfYmFja3VwX3JlZ2lvbih2b2lkKQot ewotCWlmIChwdXJnYXRvcnlfYmFja3VwX2Rlc3QpIHsKLQkJbWVtY3B5KCh2b2lkICopcHVyZ2F0 b3J5X2JhY2t1cF9kZXN0LAotCQkgICAgICAgKHZvaWQgKilwdXJnYXRvcnlfYmFja3VwX3NyYywg cHVyZ2F0b3J5X2JhY2t1cF9zeik7Ci0JfQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgaW50IHZl cmlmeV9zaGEyNTZfZGlnZXN0KHZvaWQpCiB7CiAJc3RydWN0IGtleGVjX3NoYV9yZWdpb24gKnB0 ciwgKmVuZDsKQEAgLTY2LDcgKzUyLDYgQEAgdm9pZCBwdXJnYXRvcnkodm9pZCkKIAkJZm9yICg7 OykKIAkJCTsKIAl9Ci0JY29weV9iYWNrdXBfcmVnaW9uKCk7CiB9CiAKIC8qCmRpZmYgLS1naXQg YS9hcmNoL3g4Ni9yZWFsbW9kZS9pbml0LmMgYi9hcmNoL3g4Ni9yZWFsbW9kZS9pbml0LmMKaW5k ZXggN2RjZTM5YzhjMDM0Li43NmM2ODBhZDIzYTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3JlYWxt b2RlL2luaXQuYworKysgYi9hcmNoL3g4Ni9yZWFsbW9kZS9pbml0LmMKQEAgLTM0LDYgKzM0LDE2 IEBAIHZvaWQgX19pbml0IHJlc2VydmVfcmVhbF9tb2RlKHZvaWQpCiAKIAltZW1ibG9ja19yZXNl cnZlKG1lbSwgc2l6ZSk7CiAJc2V0X3JlYWxfbW9kZV9tZW0obWVtKTsKKworI2lmZGVmIENPTkZJ R19LRVhFQ19DT1JFCisJLyogV2hlbiBjcmFzaGtlcm5lbCBpcyBzcGVjaWZpZWQgb25seSB1c2Ug dGhlIGxvdyAxTWlCIGZvciB0aGUKKwkgKiByZWFsIG1vZGUgdHJhbXBvbGluZXMuCisJICovCisJ aWYgKHN0cnN0cihib290X2NvbW1hbmRfbGluZSwgImNyYXNoa2VybmVsPSIpKSB7CisJCW1lbWJs b2NrX3Jlc2VydmUoMCwgMTw8MjApOworCQlwcl9pbmZvKCJSZXNlcnZpbmcgbG93IDFNaUIgb2Yg bWVtb3J5IGZvciBjcmFzaGtlcm5lbFxuIik7CisJfQorI2VuZGlmIC8qIENPTkZJR19LRVhFQ19D T1JFICovCiB9CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9yZWFsX21vZGUodm9pZCkKLS0g CjIuMjAuMQoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwprZXhlYyBtYWlsaW5nIGxpc3QKa2V4ZWNAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2tleGVjCg==