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=-11.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=unavailable 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 0B436C43461 for ; Wed, 16 Sep 2020 02:14:59 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D060F206C9 for ; Wed, 16 Sep 2020 02:14:58 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726340AbgIPCO4 (ORCPT ); Tue, 15 Sep 2020 22:14:56 -0400 Received: from mail.loongson.cn ([114.242.206.163]:42788 "EHLO loongson.cn" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726125AbgIPCOr (ORCPT ); Tue, 15 Sep 2020 22:14:47 -0400 Received: from [10.130.0.60] (unknown [113.200.148.30]) by mail.loongson.cn (Coremail) with SMTP id AQAAf9DxyMUJdWFf2psVAA--.5896S3; Wed, 16 Sep 2020 10:14:35 +0800 (CST) Subject: Re: [PATCH] MIPS: Loongson64: Add kexec/kdump support To: Jiaxun Yang , Thomas Bogendoerfer , Huacai Chen References: <1600175263-7872-1-git-send-email-hejinyang@loongson.cn> <376B4B91-0736-43FA-87EA-43E12FF24EF1@flygoat.com> Cc: Youling Tang , linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org, kexec@lists.infradead.org, Xuefeng Li From: Jinyang He Message-ID: <7b78c4d4-7ee3-cf57-71d1-95611713de2b@loongson.cn> Date: Wed, 16 Sep 2020 10:14:33 +0800 User-Agent: Mozilla/5.0 (X11; Linux mips64; rv:45.0) Gecko/20100101 Thunderbird/45.4.0 MIME-Version: 1.0 In-Reply-To: <376B4B91-0736-43FA-87EA-43E12FF24EF1@flygoat.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-CM-TRANSID: AQAAf9DxyMUJdWFf2psVAA--.5896S3 X-Coremail-Antispam: 1UD129KBjvJXoW3Wr13Ar17JF1DJFy3Wr43trb_yoW7tw1kpa 4UCa1DKFs5Xr47ArnaqrWDZw1ru395JFy7AF4Skas5Wa4qkr18JFyrWF17ur97Ar45KF1I vFy0vr1rGF45K3DanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUvK14x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26ryj6F1UM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26F4j 6r4UJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26r 4UJVWxJr1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2Wl Yx0E2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbV WUJVW8JwACjcxG0xvEwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc7I2V7IY0VAS07Al zVAYIcxG8wCY02Avz4vE14v_Gr1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x0Yz7v_Jr 0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2zVAF1VAY 17CE14v26r1q6r43MIIYrxkI7VAKI48JMIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcV C0I7IYx2IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWrJr0_WFyUJwCI 42IY6I8E87Iv67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxh VjvjDU0xZFpf9x0JUHWlkUUUUU= X-CM-SenderInfo: pkhmx0p1dqwqxorr0wxvrqhubq/ Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 09/16/2020 09:33 AM, Jiaxun Yang wrote: > > 于 2020年9月15日 GMT+08:00 下午9:07:43, Jinyang He 写到: >> Add loongson_kexec_prepare(), loongson_kexec_shutdown() and >> loongson_kexec_crashdown() for passing the parameters of kexec_args. >> >> To start loongson64, CPU0 needs 3 parameters: >> fw_arg0: the number of cmd. >> fw_arg1: cmd structure which seems strange, the cmd array[index]'s >> value is cmd string's address, index >= 1. >> fw_arg2: environment. >> >> Secondary CPUs do not need parameter at once. They query their >> mailbox to get PC, SP and GP in a loop before CPU0 brings them up >> and passes these parameters via mailbox. >> >> loongson_kexec_prepare(): Alloc new memory to save cmd for kexec. >> Combine the kexec append option string as cmd structure, and the cmd >> struct will be parsed in fw_init_cmdline() of arch/mips/fw/lib/cmdline.c. >> image->control_code_page need pointing to a safe memory page. In order to >> maintain compatibility for the old firmware the low 2MB is reserverd >> and safe for Loongson. So let it points here. >> >> loongson_kexec_shutdown(): Wake up all present CPUs and let them go >> to reboot_code_buffer. Pass the kexec parameters to kexec_args. >> >> loongson_crash_shutdown(): Pass the kdump parameters to kexec_args. >> >> The assembly part provide a way like BIOS doing to keep secondary >> CPUs in a querying loop. >> >> This patch referenced [1][2][3]. >> >> [1] arch/mips/cavium-octeon/setup.c >> [2] https://patchwork.kernel.org/patch/10799217/ >> [3] https://gitee.com/loongsonlab/qemu/blob/master/hw/mips/loongson3a_rom.h >> >> Co-developed-by: Youling Tang >> Signed-off-by: Youling Tang >> Signed-off-by: Jinyang He >> --- >> arch/mips/kernel/relocate_kernel.S | 19 ++++++++ >> arch/mips/loongson64/reset.c | 88 ++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 107 insertions(+) >> >> diff --git a/arch/mips/kernel/relocate_kernel.S b/arch/mips/kernel/relocate_kernel.S >> index ac87089..061cbfb 100644 >> --- a/arch/mips/kernel/relocate_kernel.S >> +++ b/arch/mips/kernel/relocate_kernel.S >> @@ -133,6 +133,25 @@ LEAF(kexec_smp_wait) >> #else >> sync >> #endif >> + >> +#ifdef CONFIG_CPU_LOONGSON64 >> +#define MAILBOX_BASE 0x900000003ff01000 > Please avoid hardcoded SMP information. You're breaking Loongson 3B support. > Ok, I see. Since my machine is Loongson 3A. I'll send v2 after I test it in 3B. Thanks. - Jinyang >> + mfc0 t1, CP0_EBASE >> + andi t1, MIPS_EBASE_CPUNUM >> + dli t0, MAILBOX_BASE >> + andi t3, t1, 0x3 >> + sll t3, 8 >> + or t0, t0, t3 /* insert core id */ >> + andi t2, t1, 0xc >> + dsll t2, 42 >> + or t0, t0, t2 /* insert node id */ >> +1: ld s1, 0x20(t0) /* get PC via mailbox0 */ >> + beqz s1, 1b >> + ld sp, 0x28(t0) /* get SP via mailbox1 */ >> + ld gp, 0x30(t0) /* get GP via mailbox2 */ >> + ld a1, 0x38(t0) >> + jr s1 >> +#endif >> j s1 >> END(kexec_smp_wait) >> #endif >> diff --git a/arch/mips/loongson64/reset.c b/arch/mips/loongson64/reset.c >> index 3bb8a1e..322c326 100644 >> --- a/arch/mips/loongson64/reset.c >> +++ b/arch/mips/loongson64/reset.c >> @@ -47,12 +47,100 @@ static void loongson_halt(void) >> } >> } >> >> +#ifdef CONFIG_KEXEC >> +#include >> +#include >> + >> +#include >> + >> +#define CONTROL_CODE_PAGE 0xFFFFFFFF80000000UL >> +static int kexec_argc; >> +static int kdump_argc; >> +static void *kexec_argv; >> +static void *kdump_argv; >> + >> +static int loongson_kexec_prepare(struct kimage *image) >> +{ >> + int i, offt, argc = 0; >> + int *argv; >> + char *str, *ptr, *bootloader = "kexec"; >> + >> + argv = kmalloc(COMMAND_LINE_SIZE, GFP_KERNEL); >> + if (!argv) >> + return -ENOMEM; >> + >> + for (i = 0; i < image->nr_segments; i++) { >> + if (!strncmp(bootloader, (char *)image->segment[i].buf, >> + strlen(bootloader))) { >> + argv[argc++] = fw_arg1 + COMMAND_LINE_SIZE/2; >> + str = (char *)argv + COMMAND_LINE_SIZE/2; >> + memcpy(str, image->segment[i].buf, COMMAND_LINE_SIZE/2); >> + ptr = strchr(str, ' '); >> + while (ptr) { >> + *ptr = '\0'; >> + if (ptr[1] != ' ') { >> + offt = (int)(ptr - str + 1); >> + argv[argc++] = fw_arg1 + COMMAND_LINE_SIZE/2 + offt; >> + } >> + ptr = strchr(ptr + 1, ' '); >> + } >> + break; >> + } >> + } >> + >> + /* Kexec/kdump needs a safe page to save reboot_code_buffer. */ >> + image->control_code_page = virt_to_page((void *)CONTROL_CODE_PAGE); >> + >> + if (image->type == KEXEC_TYPE_CRASH) { >> + kfree(kdump_argv); >> + kdump_argc = argc; >> + kdump_argv = argv; >> + } else { >> + kfree(kexec_argv); >> + kexec_argc = argc; >> + kexec_argv = argv; >> + } >> + >> + return 0; >> +} >> + >> +static void loongson_kexec_shutdown(void) >> +{ >> +#ifdef CONFIG_SMP >> + bringup_nonboot_cpus(loongson_sysconf.nr_cpus); >> +#endif >> + fw_arg0 = kexec_argc; >> + memcpy((void *)fw_arg1, kexec_argv, COMMAND_LINE_SIZE); >> + >> + kexec_args[0] = fw_arg0; >> + kexec_args[1] = fw_arg1; >> + kexec_args[2] = fw_arg2; >> +} >> + >> +static void loongson_crash_shutdown(struct pt_regs *regs) >> +{ >> + default_machine_crash_shutdown(regs); >> + fw_arg0 = kdump_argc; >> + memcpy((void *)fw_arg1, kdump_argv, COMMAND_LINE_SIZE); >> + >> + kexec_args[0] = fw_arg0; >> + kexec_args[1] = fw_arg1; >> + kexec_args[2] = fw_arg2; >> +} >> +#endif >> + >> static int __init mips_reboot_setup(void) >> { >> _machine_restart = loongson_restart; >> _machine_halt = loongson_halt; >> pm_power_off = loongson_poweroff; >> >> +#ifdef CONFIG_KEXEC >> + _machine_kexec_prepare = loongson_kexec_prepare; >> + _machine_kexec_shutdown = loongson_kexec_shutdown; >> + _machine_crash_shutdown = loongson_crash_shutdown; >> +#endif >> + >> return 0; >> } >> From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mail.loongson.cn ([114.242.206.163] helo=loongson.cn) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1kIMy5-00016W-9r for kexec@lists.infradead.org; Wed, 16 Sep 2020 02:14:47 +0000 Subject: Re: [PATCH] MIPS: Loongson64: Add kexec/kdump support References: <1600175263-7872-1-git-send-email-hejinyang@loongson.cn> <376B4B91-0736-43FA-87EA-43E12FF24EF1@flygoat.com> From: Jinyang He Message-ID: <7b78c4d4-7ee3-cf57-71d1-95611713de2b@loongson.cn> Date: Wed, 16 Sep 2020 10:14:33 +0800 MIME-Version: 1.0 In-Reply-To: <376B4B91-0736-43FA-87EA-43E12FF24EF1@flygoat.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Jiaxun Yang , Thomas Bogendoerfer , Huacai Chen Cc: Xuefeng Li , kexec@lists.infradead.org, Youling Tang , linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org CgpPbiAwOS8xNi8yMDIwIDA5OjMzIEFNLCBKaWF4dW4gWWFuZyB3cm90ZToKPgo+IOS6jiAyMDIw 5bm0OeaciDE15pelIEdNVCswODowMCDkuIvljYg5OjA3OjQzLCBKaW55YW5nIEhlIDxoZWppbnlh bmdAbG9vbmdzb24uY24+IOWGmeWIsDoKPj4gQWRkIGxvb25nc29uX2tleGVjX3ByZXBhcmUoKSwg bG9vbmdzb25fa2V4ZWNfc2h1dGRvd24oKSBhbmQKPj4gbG9vbmdzb25fa2V4ZWNfY3Jhc2hkb3du KCkgZm9yIHBhc3NpbmcgdGhlIHBhcmFtZXRlcnMgb2Yga2V4ZWNfYXJncy4KPj4KPj4gVG8gc3Rh cnQgbG9vbmdzb242NCwgQ1BVMCBuZWVkcyAzIHBhcmFtZXRlcnM6Cj4+IGZ3X2FyZzA6IHRoZSBu dW1iZXIgb2YgY21kLgo+PiBmd19hcmcxOiBjbWQgc3RydWN0dXJlIHdoaWNoIHNlZW1zIHN0cmFu Z2UsIHRoZSBjbWQgYXJyYXlbaW5kZXhdJ3MKPj4gICAgICAgICAgdmFsdWUgaXMgY21kIHN0cmlu ZydzIGFkZHJlc3MsIGluZGV4ID49IDEuCj4+IGZ3X2FyZzI6IGVudmlyb25tZW50Lgo+Pgo+PiBT ZWNvbmRhcnkgQ1BVcyBkbyBub3QgbmVlZCBwYXJhbWV0ZXIgYXQgb25jZS4gVGhleSBxdWVyeSB0 aGVpcgo+PiBtYWlsYm94IHRvIGdldCBQQywgU1AgYW5kIEdQIGluIGEgbG9vcCBiZWZvcmUgQ1BV MCBicmluZ3MgdGhlbSB1cAo+PiBhbmQgcGFzc2VzIHRoZXNlIHBhcmFtZXRlcnMgdmlhIG1haWxi b3guCj4+Cj4+IGxvb25nc29uX2tleGVjX3ByZXBhcmUoKTogQWxsb2MgbmV3IG1lbW9yeSB0byBz YXZlIGNtZCBmb3Iga2V4ZWMuCj4+IENvbWJpbmUgdGhlIGtleGVjIGFwcGVuZCBvcHRpb24gc3Ry aW5nIGFzIGNtZCBzdHJ1Y3R1cmUsIGFuZCB0aGUgY21kCj4+IHN0cnVjdCB3aWxsIGJlIHBhcnNl ZCBpbiBmd19pbml0X2NtZGxpbmUoKSBvZiBhcmNoL21pcHMvZncvbGliL2NtZGxpbmUuYy4KPj4g aW1hZ2UtPmNvbnRyb2xfY29kZV9wYWdlIG5lZWQgcG9pbnRpbmcgdG8gYSBzYWZlIG1lbW9yeSBw YWdlLiBJbiBvcmRlciB0bwo+PiBtYWludGFpbiBjb21wYXRpYmlsaXR5IGZvciB0aGUgb2xkIGZp cm13YXJlIHRoZSBsb3cgMk1CIGlzIHJlc2VydmVyZAo+PiBhbmQgc2FmZSBmb3IgTG9vbmdzb24u IFNvIGxldCBpdCBwb2ludHMgaGVyZS4KPj4KPj4gbG9vbmdzb25fa2V4ZWNfc2h1dGRvd24oKTog V2FrZSB1cCBhbGwgcHJlc2VudCBDUFVzIGFuZCBsZXQgdGhlbSBnbwo+PiB0byByZWJvb3RfY29k ZV9idWZmZXIuIFBhc3MgdGhlIGtleGVjIHBhcmFtZXRlcnMgdG8ga2V4ZWNfYXJncy4KPj4KPj4g bG9vbmdzb25fY3Jhc2hfc2h1dGRvd24oKTogUGFzcyB0aGUga2R1bXAgcGFyYW1ldGVycyB0byBr ZXhlY19hcmdzLgo+Pgo+PiBUaGUgYXNzZW1ibHkgcGFydCBwcm92aWRlIGEgd2F5IGxpa2UgQklP UyBkb2luZyB0byBrZWVwIHNlY29uZGFyeQo+PiBDUFVzIGluIGEgcXVlcnlpbmcgbG9vcC4KPj4K Pj4gVGhpcyBwYXRjaCByZWZlcmVuY2VkIFsxXVsyXVszXS4KPj4KPj4gWzFdIGFyY2gvbWlwcy9j YXZpdW0tb2N0ZW9uL3NldHVwLmMKPj4gWzJdIGh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5lbC5vcmcv cGF0Y2gvMTA3OTkyMTcvCj4+IFszXSBodHRwczovL2dpdGVlLmNvbS9sb29uZ3NvbmxhYi9xZW11 L2Jsb2IvbWFzdGVyL2h3L21pcHMvbG9vbmdzb24zYV9yb20uaAo+Pgo+PiBDby1kZXZlbG9wZWQt Ynk6IFlvdWxpbmcgVGFuZyA8dGFuZ3lvdWxpbmdAbG9vbmdzb24uY24+Cj4+IFNpZ25lZC1vZmYt Ynk6IFlvdWxpbmcgVGFuZyA8dGFuZ3lvdWxpbmdAbG9vbmdzb24uY24+Cj4+IFNpZ25lZC1vZmYt Ynk6IEppbnlhbmcgSGUgPGhlamlueWFuZ0Bsb29uZ3Nvbi5jbj4KPj4gLS0tCj4+IGFyY2gvbWlw cy9rZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMgfCAxOSArKysrKysrKwo+PiBhcmNoL21pcHMvbG9v bmdzb242NC9yZXNldC5jICAgICAgIHwgODggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKPj4gMiBmaWxlcyBjaGFuZ2VkLCAxMDcgaW5zZXJ0aW9ucygrKQo+Pgo+PiBkaWZm IC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUyBiL2FyY2gvbWlwcy9r ZXJuZWwvcmVsb2NhdGVfa2VybmVsLlMKPj4gaW5kZXggYWM4NzA4OS4uMDYxY2JmYiAxMDA2NDQK Pj4gLS0tIGEvYXJjaC9taXBzL2tlcm5lbC9yZWxvY2F0ZV9rZXJuZWwuUwo+PiArKysgYi9hcmNo L21pcHMva2VybmVsL3JlbG9jYXRlX2tlcm5lbC5TCj4+IEBAIC0xMzMsNiArMTMzLDI1IEBAIExF QUYoa2V4ZWNfc21wX3dhaXQpCj4+ICNlbHNlCj4+IAlzeW5jCj4+ICNlbmRpZgo+PiArCj4+ICsj aWZkZWYgQ09ORklHX0NQVV9MT09OR1NPTjY0Cj4+ICsjZGVmaW5lIE1BSUxCT1hfQkFTRSAweDkw MDAwMDAwM2ZmMDEwMDAKPiBQbGVhc2UgYXZvaWQgaGFyZGNvZGVkIFNNUCBpbmZvcm1hdGlvbi4g WW91J3JlIGJyZWFraW5nIExvb25nc29uIDNCIHN1cHBvcnQuCj4KT2ssIEkgc2VlLiBTaW5jZSBt eSBtYWNoaW5lIGlzIExvb25nc29uIDNBLiBJJ2xsIHNlbmQgdjIKYWZ0ZXIgSSB0ZXN0IGl0IGlu IDNCLgoKVGhhbmtzLgoKLSBKaW55YW5nCj4+ICsJbWZjMCAgdDEsIENQMF9FQkFTRQo+PiArCWFu ZGkgIHQxLCBNSVBTX0VCQVNFX0NQVU5VTQo+PiArCWRsaSAgIHQwLCBNQUlMQk9YX0JBU0UKPj4g KwlhbmRpICB0MywgdDEsIDB4Mwo+PiArCXNsbCAgIHQzLCA4Cj4+ICsJb3IgICAgdDAsIHQwLCB0 MwkvKiBpbnNlcnQgY29yZSBpZCAqLwo+PiArCWFuZGkgIHQyLCB0MSwgMHhjCj4+ICsJZHNsbCAg dDIsIDQyCj4+ICsJb3IgICAgdDAsIHQwLCB0MgkvKiBpbnNlcnQgbm9kZSBpZCAqLwo+PiArMToJ bGQgICAgczEsIDB4MjAodDApCS8qIGdldCBQQyB2aWEgbWFpbGJveDAgKi8KPj4gKwliZXF6ICBz MSwgMWIKPj4gKwlsZCAgICBzcCwgMHgyOCh0MCkJLyogZ2V0IFNQIHZpYSBtYWlsYm94MSAqLwo+ PiArCWxkICAgIGdwLCAweDMwKHQwKQkvKiBnZXQgR1AgdmlhIG1haWxib3gyICovCj4+ICsJbGQg ICAgYTEsIDB4MzgodDApCj4+ICsJanIgICAgczEKPj4gKyNlbmRpZgo+PiAJagkJczEKPj4gCUVO RChrZXhlY19zbXBfd2FpdCkKPj4gI2VuZGlmCj4+IGRpZmYgLS1naXQgYS9hcmNoL21pcHMvbG9v bmdzb242NC9yZXNldC5jIGIvYXJjaC9taXBzL2xvb25nc29uNjQvcmVzZXQuYwo+PiBpbmRleCAz YmI4YTFlLi4zMjJjMzI2IDEwMDY0NAo+PiAtLS0gYS9hcmNoL21pcHMvbG9vbmdzb242NC9yZXNl dC5jCj4+ICsrKyBiL2FyY2gvbWlwcy9sb29uZ3NvbjY0L3Jlc2V0LmMKPj4gQEAgLTQ3LDEyICs0 NywxMDAgQEAgc3RhdGljIHZvaWQgbG9vbmdzb25faGFsdCh2b2lkKQo+PiAJfQo+PiB9Cj4+Cj4+ ICsjaWZkZWYgQ09ORklHX0tFWEVDCj4+ICsjaW5jbHVkZSA8bGludXgvY3B1Lmg+Cj4+ICsjaW5j bHVkZSA8bGludXgva2V4ZWMuaD4KPj4gKwo+PiArI2luY2x1ZGUgPGFzbS9ib290aW5mby5oPgo+ PiArCj4+ICsjZGVmaW5lIENPTlRST0xfQ09ERV9QQUdFICAgIDB4RkZGRkZGRkY4MDAwMDAwMFVM Cj4+ICtzdGF0aWMgaW50IGtleGVjX2FyZ2M7Cj4+ICtzdGF0aWMgaW50IGtkdW1wX2FyZ2M7Cj4+ ICtzdGF0aWMgdm9pZCAqa2V4ZWNfYXJndjsKPj4gK3N0YXRpYyB2b2lkICprZHVtcF9hcmd2Owo+ PiArCj4+ICtzdGF0aWMgaW50IGxvb25nc29uX2tleGVjX3ByZXBhcmUoc3RydWN0IGtpbWFnZSAq aW1hZ2UpCj4+ICt7Cj4+ICsJaW50IGksIG9mZnQsIGFyZ2MgPSAwOwo+PiArCWludCAqYXJndjsK Pj4gKwljaGFyICpzdHIsICpwdHIsICpib290bG9hZGVyID0gImtleGVjIjsKPj4gKwo+PiArCWFy Z3YgPSBrbWFsbG9jKENPTU1BTkRfTElORV9TSVpFLCBHRlBfS0VSTkVMKTsKPj4gKwlpZiAoIWFy Z3YpCj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCj4+ICsJZm9yIChpID0gMDsgaSA8IGltYWdl LT5ucl9zZWdtZW50czsgaSsrKSB7Cj4+ICsJCWlmICghc3RybmNtcChib290bG9hZGVyLCAoY2hh ciAqKWltYWdlLT5zZWdtZW50W2ldLmJ1ZiwKPj4gKwkJCQlzdHJsZW4oYm9vdGxvYWRlcikpKSB7 Cj4+ICsJCQlhcmd2W2FyZ2MrK10gPSBmd19hcmcxICsgQ09NTUFORF9MSU5FX1NJWkUvMjsKPj4g KwkJCXN0ciA9IChjaGFyICopYXJndiArIENPTU1BTkRfTElORV9TSVpFLzI7Cj4+ICsJCQltZW1j cHkoc3RyLCBpbWFnZS0+c2VnbWVudFtpXS5idWYsIENPTU1BTkRfTElORV9TSVpFLzIpOwo+PiAr CQkJcHRyID0gc3RyY2hyKHN0ciwgJyAnKTsKPj4gKwkJCXdoaWxlIChwdHIpIHsKPj4gKwkJCQkq cHRyID0gJ1wwJzsKPj4gKwkJCQlpZiAocHRyWzFdICE9ICcgJykgewo+PiArCQkJCQlvZmZ0ID0g KGludCkocHRyIC0gc3RyICsgMSk7Cj4+ICsJCQkJCWFyZ3ZbYXJnYysrXSA9IGZ3X2FyZzEgKyBD T01NQU5EX0xJTkVfU0laRS8yICsgb2ZmdDsKPj4gKwkJCQl9Cj4+ICsJCQkJcHRyID0gc3RyY2hy KHB0ciArIDEsICcgJyk7Cj4+ICsJCQl9Cj4+ICsJCQlicmVhazsKPj4gKwkJfQo+PiArCX0KPj4g Kwo+PiArCS8qIEtleGVjL2tkdW1wIG5lZWRzIGEgc2FmZSBwYWdlIHRvIHNhdmUgcmVib290X2Nv ZGVfYnVmZmVyLiAqLwo+PiArCWltYWdlLT5jb250cm9sX2NvZGVfcGFnZSA9IHZpcnRfdG9fcGFn ZSgodm9pZCAqKUNPTlRST0xfQ09ERV9QQUdFKTsKPj4gKwo+PiArCWlmIChpbWFnZS0+dHlwZSA9 PSBLRVhFQ19UWVBFX0NSQVNIKSB7Cj4+ICsJCWtmcmVlKGtkdW1wX2FyZ3YpOwo+PiArCQlrZHVt cF9hcmdjID0gYXJnYzsKPj4gKwkJa2R1bXBfYXJndiA9IGFyZ3Y7Cj4+ICsJfSBlbHNlIHsKPj4g KwkJa2ZyZWUoa2V4ZWNfYXJndik7Cj4+ICsJCWtleGVjX2FyZ2MgPSBhcmdjOwo+PiArCQlrZXhl Y19hcmd2ID0gYXJndjsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiAr c3RhdGljIHZvaWQgbG9vbmdzb25fa2V4ZWNfc2h1dGRvd24odm9pZCkKPj4gK3sKPj4gKyNpZmRl ZiBDT05GSUdfU01QCj4+ICsJYnJpbmd1cF9ub25ib290X2NwdXMobG9vbmdzb25fc3lzY29uZi5u cl9jcHVzKTsKPj4gKyNlbmRpZgo+PiArCWZ3X2FyZzAgPSBrZXhlY19hcmdjOwo+PiArCW1lbWNw eSgodm9pZCAqKWZ3X2FyZzEsIGtleGVjX2FyZ3YsIENPTU1BTkRfTElORV9TSVpFKTsKPj4gKwo+ PiArCWtleGVjX2FyZ3NbMF0gPSBmd19hcmcwOwo+PiArCWtleGVjX2FyZ3NbMV0gPSBmd19hcmcx Owo+PiArCWtleGVjX2FyZ3NbMl0gPSBmd19hcmcyOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9p ZCBsb29uZ3Nvbl9jcmFzaF9zaHV0ZG93bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKPj4gK3sKPj4g KwlkZWZhdWx0X21hY2hpbmVfY3Jhc2hfc2h1dGRvd24ocmVncyk7Cj4+ICsJZndfYXJnMCA9IGtk dW1wX2FyZ2M7Cj4+ICsJbWVtY3B5KCh2b2lkICopZndfYXJnMSwga2R1bXBfYXJndiwgQ09NTUFO RF9MSU5FX1NJWkUpOwo+PiArCj4+ICsJa2V4ZWNfYXJnc1swXSA9IGZ3X2FyZzA7Cj4+ICsJa2V4 ZWNfYXJnc1sxXSA9IGZ3X2FyZzE7Cj4+ICsJa2V4ZWNfYXJnc1syXSA9IGZ3X2FyZzI7Cj4+ICt9 Cj4+ICsjZW5kaWYKPj4gKwo+PiBzdGF0aWMgaW50IF9faW5pdCBtaXBzX3JlYm9vdF9zZXR1cCh2 b2lkKQo+PiB7Cj4+IAlfbWFjaGluZV9yZXN0YXJ0ID0gbG9vbmdzb25fcmVzdGFydDsKPj4gCV9t YWNoaW5lX2hhbHQgPSBsb29uZ3Nvbl9oYWx0Owo+PiAJcG1fcG93ZXJfb2ZmID0gbG9vbmdzb25f cG93ZXJvZmY7Cj4+Cj4+ICsjaWZkZWYgQ09ORklHX0tFWEVDCj4+ICsJX21hY2hpbmVfa2V4ZWNf cHJlcGFyZSA9IGxvb25nc29uX2tleGVjX3ByZXBhcmU7Cj4+ICsJX21hY2hpbmVfa2V4ZWNfc2h1 dGRvd24gPSBsb29uZ3Nvbl9rZXhlY19zaHV0ZG93bjsKPj4gKwlfbWFjaGluZV9jcmFzaF9zaHV0 ZG93biA9IGxvb25nc29uX2NyYXNoX3NodXRkb3duOwo+PiArI2VuZGlmCj4+ICsKPj4gCXJldHVy biAwOwo+PiB9Cj4+CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18Ka2V4ZWMgbWFpbGluZyBsaXN0CmtleGVjQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDov L2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9rZXhlYwo=