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=-9.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,USER_AGENT_NEOMUTT 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 A30AAC43219 for ; Wed, 1 May 2019 19:55:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6FEC820651 for ; Wed, 1 May 2019 19:55:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726196AbfEATzD (ORCPT ); Wed, 1 May 2019 15:55:03 -0400 Received: from mout.kundenserver.de ([212.227.126.133]:58361 "EHLO mout.kundenserver.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726004AbfEATzD (ORCPT ); Wed, 1 May 2019 15:55:03 -0400 Received: from excalibur.cnev.de ([213.196.200.188]) by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1M9WeC-1hRPUo41DA-005VNG; Wed, 01 May 2019 21:54:47 +0200 Received: from karsten by excalibur.cnev.de with local (Exim 4.89) (envelope-from ) id 1hLvJT-0000Cx-TE; Wed, 01 May 2019 21:54:43 +0200 Date: Wed, 1 May 2019 21:54:43 +0200 From: Karsten Merker To: Anup Patel Cc: Mark Rutland , "aou@eecs.berkeley.edu" , Palmer Dabbelt , "linux-kernel@vger.kernel.org" , "zong@andestech.com" , Atish Patra , "linux-riscv@lists.infradead.org" Subject: Re: [PATCH] RISC-V: Add an Image header that boot loader can parse. Message-ID: <20190501195443.trgjv6tujctsw5sw@excalibur.cnev.de> References: <20190501170053.GG11740@lakrids.cambridge.arm.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: X-No-Archive: yes User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:Wcvbk2phACwbUNrWanmcgvaG/SC1Qa2xqLynbBepDlxoWVqQ4EY Fk4o8lLOXe7Qyzqn5JoguFhonrfnGSpZ6l4q4tzGLSz2KFSBdPUCB7d4kfAEGaxjahIHdyp SlDodHWHDtDmnplGuKoJUWruDbJ3tzt8IQsyW8iR+KzpZ189HwyNhx8HI/cH54jKHaMbKuB 4ZWxGgAMRvkXt7LlylWkw== X-UI-Out-Filterresults: notjunk:1;V03:K0:J9tQ4OSZ3ao=:dzfbPsQ3MnrH1ztAiTmZ2B M1AuxzxvjtbGbGSa2DXCW7u6jfchZljqRTBBUaXGbVwN/3sK8XniHlx9tEm2wjO9sZzTkz0Tt eXw+lWbpOwAq4zOTBcR3729m0n600y6dqOVU1ZFwOhYCeTzxpn0UyQFDcx/i6Ut2khFjWjypZ FF965xlxk9joK+TrlEdnXqc07g+q5foKln6KVyL25UeNAT+gimLJVSEfBOcIFT4dOElj/VBOT FK2wWfVEOmw7wpyzIBGggfGvUyCekiBrDBHk/GJ+kjAAuhTBiTlue8f1cPz5vkLhFR8D4meTO L62RN1uAGYF7zJ+Sv40erBWz5JR5Uxu+Y8s6VelzQyF18Zj1I3oHXdV/Ql2dQ4PTI7CVNXtha TrkBxAWOXNqyl1BkC5ykYSTERZqG9jyYj8sgjMwOjANAM0YiyMWuOQoeb4lA+DW/hvOvIHpSa Z9egQj2ChHNTy94b74uIZCXr/etDH1ogIAGzeNL4wArefPlxLrisidR7D8wMVmk4w0S0Mbnaf v/V2V91qzPbwC6906PQ4OI3KIsAgp9EipA7SCHqagHbWcBaa6PbonXT/Zm4/rkwC8wUOYRTJE B1EgzfkBL8E4oE9mPlFWmE8qcEDcZGYX0FNrTZQc+26kzcQfdrGJmoQr+OuClPW26mVZPE7kh zpVHt0InM8kNJ1B5iT1WoVwYjr0+4dQwob6z8HosF2X2J8O5p8ah8waYUowMGFXeOCKxtk86Z 5yQ1kbjcMubeKe88OZ31WtLgmCTs20fJGzLrqA== Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 01, 2019 at 10:41:52PM +0530, Anup Patel wrote: > On Wed, May 1, 2019 at 10:30 PM Mark Rutland wrote: > > On Mon, Apr 29, 2019 at 10:42:40PM -0700, Atish Patra wrote: > > > On 4/29/19 4:40 PM, Palmer Dabbelt wrote: > > > > On Tue, 23 Apr 2019 16:25:06 PDT (-0700), atish.patra@wdc.com wrote: > > > > > Currently, last stage boot loaders such as U-Boot can accept only > > > > > uImage which is an unnecessary additional step in automating boot flows. > > > > > > > > > > Add a simple image header that boot loaders can parse and directly > > > > > load kernel flat Image. The existing booting methods will continue to > > > > > work as it is. > > > > > > > > > > Tested on both QEMU and HiFive Unleashed using OpenSBI + U-Boot + Linux. > > > > > > > > > > Signed-off-by: Atish Patra > > > > > --- > > > > > arch/riscv/include/asm/image.h | 32 ++++++++++++++++++++++++++++++++ > > > > > arch/riscv/kernel/head.S | 28 ++++++++++++++++++++++++++++ > > > > > 2 files changed, 60 insertions(+) > > > > > create mode 100644 arch/riscv/include/asm/image.h > > > > > > > > > > diff --git a/arch/riscv/include/asm/image.h b/arch/riscv/include/asm/image.h > > > > > new file mode 100644 > > > > > index 000000000000..76a7e0d4068a > > > > > --- /dev/null > > > > > +++ b/arch/riscv/include/asm/image.h > > > > > @@ -0,0 +1,32 @@ > > > > > +/* SPDX-License-Identifier: GPL-2.0 */ > > > > > + > > > > > +#ifndef __ASM_IMAGE_H > > > > > +#define __ASM_IMAGE_H > > > > > + > > > > > +#define RISCV_IMAGE_MAGIC "RISCV" > > > > > + > > > > > +#ifndef __ASSEMBLY__ > > > > > +/* > > > > > + * struct riscv_image_header - riscv kernel image header > > > > > + * > > > > > + * @code0: Executable code > > > > > + * @code1: Executable code > > > > > + * @text_offset: Image load offset > > > > > + * @image_size: Effective Image size > > > > > + * @reserved: reserved > > > > > + * @magic: Magic number > > > > > + * @reserved: reserved > > > > > + */ > > > > > + > > > > > +struct riscv_image_header { > > > > > + u32 code0; > > > > > + u32 code1; > > > > > + u64 text_offset; > > > > > + u64 image_size; > > > > > + u64 res1; > > > > > + u64 magic; > > > > > + u32 res2; > > > > > + u32 res3; > > > > > +}; > > > > > > > > I don't want to invent our own file format. Is there a reason we can't just > > > > use something standard? Off the top of my head I can think of ELF files and > > > > multiboot. > > > > > > Additional header is required to accommodate PE header format. Currently, > > > this is only used for booti command but it will be reused for EFI headers as > > > well. Linux kernel Image can pretend as an EFI application if PE/COFF header > > > is present. This removes the need of an explicit EFI boot loader and EFI > > > firmware can directly load Linux (obviously after EFI stub implementation > > > for RISC-V). > > > > Adding the EFI stub on arm64 required very careful consideration of our > > Image header and the EFI spec, along with the PE/COFF spec. > > > > For example, to be a compliant PE/COFF header, the first two bytes of > > your kernel image need to be "MZ" in ASCII. On arm64 we happened to find > > a valid instruction that we could rely upon that met this requirement... > > The "MZ" ASCII (i.e. 0x5a4d) is "li s4,-13" instruction in RISC-V so this > modifies "s4" register which is pretty harmless from Linux RISC-V booting > perspective. > > Of course, we should only add "MZ" ASCII in Linux RISC-V image header > when CONFIG_EFI is enabled (just like Linux ARM64). Probably I'm missing something obvious, but I cannot completely follow you here. My understanding is as follows: The kernel gets executed by jumping to the _start label, where it currently immediately starts with setting up everything (mask interrupts, disable FPU, etc). Now we insert a structure before the actual init code where the first 64 bits of the structure (the code0 and code1 fields) are filled with values that constitute a valid jump opcode to the actual init code behind the end of the new structure. If the first byte in a PE/COFF header has to be an ASCII "M", that is 01001101 in binary. RISC-V is little-endian and the last two bits of the lowest-value byte define the type of instruction. According to the chapter "Base Instruction-Length Encoding" in the RISC-V ISA spec everything except 11 as the lowest bits denotes a compressed instruction and if I have puzzeled together the the various instruction bits correctly, ASCII "MZ" would be excuted as a compressed load immediate to x9/s1, wouldn't it? If my previous thoughts are correct, this would also mean that having a PE/COFF-compatible header for EFI boot would make a kernel image inherently incompatible with performing a non-EFI boot of the same image on systems that don't implement the C extension. As the work-in-progress RISC-V Unix platform spec will probably mandate C, that probably won't be much of a practical problem, though. Regards, Karsten -- Ich widerspreche hiermit ausdrücklich der Nutzung sowie der Weitergabe meiner personenbezogenen Daten für Zwecke der Werbung sowie der Markt- oder Meinungsforschung. 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=-9.1 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,USER_AGENT_NEOMUTT 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 219D7C04AA8 for ; Wed, 1 May 2019 19:55:05 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id E6A832089E for ; Wed, 1 May 2019 19:55:04 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="f48ABJia" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E6A832089E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=debian.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject: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=nHUfqJHNINew08Y8UAZWt93a/VOTbh3Npv2PWKK1f1A=; b=f48ABJialMIEDe eV5pOiUWi735UBQC9BJfDRV7+AQrexkWnSl81y8wifTz/XPFvQyVCHV0hFGqtN78+LIkweu8g3imQ l7FDMgaIW4KW6LwIb2LyaZv5aJ27BL0Pn+hHanxZuDw26nyi+xmlDGj0MxgsRfNCaHeanDlcRQ/4S vtEy2fyBdQO8sx6Pf7uBLe++5ufaF0hS4soKmMxyLdnrBcXbFar8KlKstG2UCXKoGxVIjJ/Gg2lc5 XkD04LaIpXR1kPL0j4cIjmUXDxAXIye+M9NONB0rbfbGmdhy8Jel0BmToib52fenQMQMwXmM9AI13 /B1OBmg51z+VAdbz4wBw==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1hLvJm-0005fr-Mc; Wed, 01 May 2019 19:55:02 +0000 Received: from mout.kundenserver.de ([212.227.126.133]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1hLvJj-0005Vh-BT for linux-riscv@lists.infradead.org; Wed, 01 May 2019 19:55:01 +0000 Received: from excalibur.cnev.de ([213.196.200.188]) by mrelayeu.kundenserver.de (mreue010 [212.227.15.167]) with ESMTPSA (Nemesis) id 1M9WeC-1hRPUo41DA-005VNG; Wed, 01 May 2019 21:54:47 +0200 Received: from karsten by excalibur.cnev.de with local (Exim 4.89) (envelope-from ) id 1hLvJT-0000Cx-TE; Wed, 01 May 2019 21:54:43 +0200 Date: Wed, 1 May 2019 21:54:43 +0200 From: Karsten Merker To: Anup Patel Subject: Re: [PATCH] RISC-V: Add an Image header that boot loader can parse. Message-ID: <20190501195443.trgjv6tujctsw5sw@excalibur.cnev.de> References: <20190501170053.GG11740@lakrids.cambridge.arm.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-No-Archive: yes User-Agent: NeoMutt/20170113 (1.7.2) X-Provags-ID: V03:K1:Wcvbk2phACwbUNrWanmcgvaG/SC1Qa2xqLynbBepDlxoWVqQ4EY Fk4o8lLOXe7Qyzqn5JoguFhonrfnGSpZ6l4q4tzGLSz2KFSBdPUCB7d4kfAEGaxjahIHdyp SlDodHWHDtDmnplGuKoJUWruDbJ3tzt8IQsyW8iR+KzpZ189HwyNhx8HI/cH54jKHaMbKuB 4ZWxGgAMRvkXt7LlylWkw== X-UI-Out-Filterresults: notjunk:1;V03:K0:J9tQ4OSZ3ao=:dzfbPsQ3MnrH1ztAiTmZ2B M1AuxzxvjtbGbGSa2DXCW7u6jfchZljqRTBBUaXGbVwN/3sK8XniHlx9tEm2wjO9sZzTkz0Tt eXw+lWbpOwAq4zOTBcR3729m0n600y6dqOVU1ZFwOhYCeTzxpn0UyQFDcx/i6Ut2khFjWjypZ FF965xlxk9joK+TrlEdnXqc07g+q5foKln6KVyL25UeNAT+gimLJVSEfBOcIFT4dOElj/VBOT FK2wWfVEOmw7wpyzIBGggfGvUyCekiBrDBHk/GJ+kjAAuhTBiTlue8f1cPz5vkLhFR8D4meTO L62RN1uAGYF7zJ+Sv40erBWz5JR5Uxu+Y8s6VelzQyF18Zj1I3oHXdV/Ql2dQ4PTI7CVNXtha TrkBxAWOXNqyl1BkC5ykYSTERZqG9jyYj8sgjMwOjANAM0YiyMWuOQoeb4lA+DW/hvOvIHpSa Z9egQj2ChHNTy94b74uIZCXr/etDH1ogIAGzeNL4wArefPlxLrisidR7D8wMVmk4w0S0Mbnaf v/V2V91qzPbwC6906PQ4OI3KIsAgp9EipA7SCHqagHbWcBaa6PbonXT/Zm4/rkwC8wUOYRTJE B1EgzfkBL8E4oE9mPlFWmE8qcEDcZGYX0FNrTZQc+26kzcQfdrGJmoQr+OuClPW26mVZPE7kh zpVHt0InM8kNJ1B5iT1WoVwYjr0+4dQwob6z8HosF2X2J8O5p8ah8waYUowMGFXeOCKxtk86Z 5yQ1kbjcMubeKe88OZ31WtLgmCTs20fJGzLrqA== X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190501_125459_697522_2C7253B3 X-CRM114-Status: GOOD ( 25.22 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Mark Rutland , "aou@eecs.berkeley.edu" , Palmer Dabbelt , "linux-kernel@vger.kernel.org" , "zong@andestech.com" , Atish Patra , "linux-riscv@lists.infradead.org" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org T24gV2VkLCBNYXkgMDEsIDIwMTkgYXQgMTA6NDE6NTJQTSArMDUzMCwgQW51cCBQYXRlbCB3cm90 ZToKPiBPbiBXZWQsIE1heSAxLCAyMDE5IGF0IDEwOjMwIFBNIE1hcmsgUnV0bGFuZCA8bWFyay5y dXRsYW5kQGFybS5jb20+IHdyb3RlOgo+ID4gT24gTW9uLCBBcHIgMjksIDIwMTkgYXQgMTA6NDI6 NDBQTSAtMDcwMCwgQXRpc2ggUGF0cmEgd3JvdGU6Cj4gPiA+IE9uIDQvMjkvMTkgNDo0MCBQTSwg UGFsbWVyIERhYmJlbHQgd3JvdGU6Cj4gPiA+ID4gT24gVHVlLCAyMyBBcHIgMjAxOSAxNjoyNTow NiBQRFQgKC0wNzAwKSwgYXRpc2gucGF0cmFAd2RjLmNvbSB3cm90ZToKPiA+ID4gPiA+IEN1cnJl bnRseSwgbGFzdCBzdGFnZSBib290IGxvYWRlcnMgc3VjaCBhcyBVLUJvb3QgY2FuIGFjY2VwdCBv bmx5Cj4gPiA+ID4gPiB1SW1hZ2Ugd2hpY2ggaXMgYW4gdW5uZWNlc3NhcnkgYWRkaXRpb25hbCBz dGVwIGluIGF1dG9tYXRpbmcgYm9vdCBmbG93cy4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBBZGQgYSBz aW1wbGUgaW1hZ2UgaGVhZGVyIHRoYXQgYm9vdCBsb2FkZXJzIGNhbiBwYXJzZSBhbmQgZGlyZWN0 bHkKPiA+ID4gPiA+IGxvYWQga2VybmVsIGZsYXQgSW1hZ2UuIFRoZSBleGlzdGluZyBib290aW5n IG1ldGhvZHMgd2lsbCBjb250aW51ZSB0bwo+ID4gPiA+ID4gd29yayBhcyBpdCBpcy4KPiA+ID4g PiA+Cj4gPiA+ID4gPiBUZXN0ZWQgb24gYm90aCBRRU1VIGFuZCBIaUZpdmUgVW5sZWFzaGVkIHVz aW5nIE9wZW5TQkkgKyBVLUJvb3QgKyBMaW51eC4KPiA+ID4gPiA+Cj4gPiA+ID4gPiBTaWduZWQt b2ZmLWJ5OiBBdGlzaCBQYXRyYSA8YXRpc2gucGF0cmFAd2RjLmNvbT4KPiA+ID4gPiA+IC0tLQo+ ID4gPiA+ID4gICBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2ltYWdlLmggfCAzMiArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwo+ID4gPiA+ID4gICBhcmNoL3Jpc2N2L2tlcm5lbC9oZWFk LlMgICAgICAgfCAyOCArKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gPiA+ID4gPiAgIDIg ZmlsZXMgY2hhbmdlZCwgNjAgaW5zZXJ0aW9ucygrKQo+ID4gPiA+ID4gICBjcmVhdGUgbW9kZSAx MDA2NDQgYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9pbWFnZS5oCj4gPiA+ID4gPgo+ID4gPiA+ID4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vaW1hZ2UuaCBiL2FyY2gvcmlzY3Yv aW5jbHVkZS9hc20vaW1hZ2UuaAo+ID4gPiA+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiA+ID4g PiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uNzZhN2UwZDQwNjhhCj4gPiA+ID4gPiAtLS0gL2Rldi9u dWxsCj4gPiA+ID4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2ltYWdlLmgKPiA+ID4g PiA+IEBAIC0wLDAgKzEsMzIgQEAKPiA+ID4gPiA+ICsvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmll cjogR1BMLTIuMCAqLwo+ID4gPiA+ID4gKwo+ID4gPiA+ID4gKyNpZm5kZWYgX19BU01fSU1BR0Vf SAo+ID4gPiA+ID4gKyNkZWZpbmUgX19BU01fSU1BR0VfSAo+ID4gPiA+ID4gKwo+ID4gPiA+ID4g KyNkZWZpbmUgUklTQ1ZfSU1BR0VfTUFHSUMgICAgICAgICJSSVNDViIKPiA+ID4gPiA+ICsKPiA+ ID4gPiA+ICsjaWZuZGVmIF9fQVNTRU1CTFlfXwo+ID4gPiA+ID4gKy8qCj4gPiA+ID4gPiArICog c3RydWN0IHJpc2N2X2ltYWdlX2hlYWRlciAtIHJpc2N2IGtlcm5lbCBpbWFnZSBoZWFkZXIKPiA+ ID4gPiA+ICsgKgo+ID4gPiA+ID4gKyAqIEBjb2RlMDogICAgICAgICAgICAgICBFeGVjdXRhYmxl IGNvZGUKPiA+ID4gPiA+ICsgKiBAY29kZTE6ICAgICAgICAgICAgICAgRXhlY3V0YWJsZSBjb2Rl Cj4gPiA+ID4gPiArICogQHRleHRfb2Zmc2V0OiBJbWFnZSBsb2FkIG9mZnNldAo+ID4gPiA+ID4g KyAqIEBpbWFnZV9zaXplOiAgICAgICAgICBFZmZlY3RpdmUgSW1hZ2Ugc2l6ZQo+ID4gPiA+ID4g KyAqIEByZXNlcnZlZDogICAgICAgICAgICByZXNlcnZlZAo+ID4gPiA+ID4gKyAqIEBtYWdpYzog ICAgICAgICAgICAgICBNYWdpYyBudW1iZXIKPiA+ID4gPiA+ICsgKiBAcmVzZXJ2ZWQ6ICAgICAg ICAgICAgcmVzZXJ2ZWQKPiA+ID4gPiA+ICsgKi8KPiA+ID4gPiA+ICsKPiA+ID4gPiA+ICtzdHJ1 Y3QgcmlzY3ZfaW1hZ2VfaGVhZGVyIHsKPiA+ID4gPiA+ICsgdTMyIGNvZGUwOwo+ID4gPiA+ID4g KyB1MzIgY29kZTE7Cj4gPiA+ID4gPiArIHU2NCB0ZXh0X29mZnNldDsKPiA+ID4gPiA+ICsgdTY0 IGltYWdlX3NpemU7Cj4gPiA+ID4gPiArIHU2NCByZXMxOwo+ID4gPiA+ID4gKyB1NjQgbWFnaWM7 Cj4gPiA+ID4gPiArIHUzMiByZXMyOwo+ID4gPiA+ID4gKyB1MzIgcmVzMzsKPiA+ID4gPiA+ICt9 Owo+ID4gPiA+Cj4gPiA+ID4gSSBkb24ndCB3YW50IHRvIGludmVudCBvdXIgb3duIGZpbGUgZm9y bWF0LiAgSXMgdGhlcmUgYSByZWFzb24gd2UgY2FuJ3QganVzdAo+ID4gPiA+IHVzZSBzb21ldGhp bmcgc3RhbmRhcmQ/ICBPZmYgdGhlIHRvcCBvZiBteSBoZWFkIEkgY2FuIHRoaW5rIG9mIEVMRiBm aWxlcyBhbmQKPiA+ID4gPiBtdWx0aWJvb3QuCj4gPiA+Cj4gPiA+IEFkZGl0aW9uYWwgaGVhZGVy IGlzIHJlcXVpcmVkIHRvIGFjY29tbW9kYXRlIFBFIGhlYWRlciBmb3JtYXQuIEN1cnJlbnRseSwK PiA+ID4gdGhpcyBpcyBvbmx5IHVzZWQgZm9yIGJvb3RpIGNvbW1hbmQgYnV0IGl0IHdpbGwgYmUg cmV1c2VkIGZvciBFRkkgaGVhZGVycyBhcwo+ID4gPiB3ZWxsLiBMaW51eCBrZXJuZWwgSW1hZ2Ug Y2FuIHByZXRlbmQgYXMgYW4gRUZJIGFwcGxpY2F0aW9uIGlmIFBFL0NPRkYgaGVhZGVyCj4gPiA+ IGlzIHByZXNlbnQuIFRoaXMgcmVtb3ZlcyB0aGUgbmVlZCBvZiBhbiBleHBsaWNpdCBFRkkgYm9v dCBsb2FkZXIgYW5kIEVGSQo+ID4gPiBmaXJtd2FyZSBjYW4gZGlyZWN0bHkgbG9hZCBMaW51eCAo b2J2aW91c2x5IGFmdGVyIEVGSSBzdHViIGltcGxlbWVudGF0aW9uCj4gPiA+IGZvciBSSVNDLVYp Lgo+ID4KPiA+IEFkZGluZyB0aGUgRUZJIHN0dWIgb24gYXJtNjQgcmVxdWlyZWQgdmVyeSBjYXJl ZnVsIGNvbnNpZGVyYXRpb24gb2Ygb3VyCj4gPiBJbWFnZSBoZWFkZXIgYW5kIHRoZSBFRkkgc3Bl YywgYWxvbmcgd2l0aCB0aGUgUEUvQ09GRiBzcGVjLgo+ID4KPiA+IEZvciBleGFtcGxlLCB0byBi ZSBhIGNvbXBsaWFudCBQRS9DT0ZGIGhlYWRlciwgdGhlIGZpcnN0IHR3byBieXRlcyBvZgo+ID4g eW91ciBrZXJuZWwgaW1hZ2UgbmVlZCB0byBiZSAiTVoiIGluIEFTQ0lJLiBPbiBhcm02NCB3ZSBo YXBwZW5lZCB0byBmaW5kCj4gPiBhIHZhbGlkIGluc3RydWN0aW9uIHRoYXQgd2UgY291bGQgcmVs eSB1cG9uIHRoYXQgbWV0IHRoaXMgcmVxdWlyZW1lbnQuLi4KPiAKPiBUaGUgIk1aIiBBU0NJSSAo aS5lLiAweDVhNGQpIGlzICJsaSBzNCwtMTMiIGluc3RydWN0aW9uIGluIFJJU0MtViBzbyB0aGlz Cj4gbW9kaWZpZXMgInM0IiByZWdpc3RlciB3aGljaCBpcyBwcmV0dHkgaGFybWxlc3MgZnJvbSBM aW51eCBSSVNDLVYgYm9vdGluZwo+IHBlcnNwZWN0aXZlLgo+IAo+IE9mIGNvdXJzZSwgd2Ugc2hv dWxkIG9ubHkgYWRkICJNWiIgQVNDSUkgaW4gTGludXggUklTQy1WIGltYWdlIGhlYWRlcgo+IHdo ZW4gQ09ORklHX0VGSSBpcyBlbmFibGVkIChqdXN0IGxpa2UgTGludXggQVJNNjQpLgoKUHJvYmFi bHkgSSdtIG1pc3Npbmcgc29tZXRoaW5nIG9idmlvdXMsIGJ1dCBJIGNhbm5vdCBjb21wbGV0ZWx5 CmZvbGxvdyB5b3UgaGVyZS4gTXkgdW5kZXJzdGFuZGluZyBpcyBhcyBmb2xsb3dzOgoKVGhlIGtl cm5lbCBnZXRzIGV4ZWN1dGVkIGJ5IGp1bXBpbmcgdG8gdGhlIF9zdGFydCBsYWJlbCwgd2hlcmUg aXQKY3VycmVudGx5IGltbWVkaWF0ZWx5IHN0YXJ0cyB3aXRoIHNldHRpbmcgdXAgZXZlcnl0aGlu ZyAobWFzawppbnRlcnJ1cHRzLCBkaXNhYmxlIEZQVSwgZXRjKS4gIE5vdyB3ZSBpbnNlcnQgYSBz dHJ1Y3R1cmUgYmVmb3JlCnRoZSBhY3R1YWwgaW5pdCBjb2RlIHdoZXJlIHRoZSBmaXJzdCA2NCBi aXRzIG9mIHRoZSBzdHJ1Y3R1cmUKKHRoZSBjb2RlMCBhbmQgY29kZTEgZmllbGRzKSBhcmUgZmls bGVkIHdpdGggdmFsdWVzIHRoYXQKY29uc3RpdHV0ZSBhIHZhbGlkIGp1bXAgb3Bjb2RlIHRvIHRo ZSBhY3R1YWwgaW5pdCBjb2RlIGJlaGluZCB0aGUKZW5kIG9mIHRoZSBuZXcgc3RydWN0dXJlLgoK SWYgdGhlIGZpcnN0IGJ5dGUgaW4gYSBQRS9DT0ZGIGhlYWRlciBoYXMgdG8gYmUgYW4gQVNDSUkg Ik0iLAp0aGF0IGlzIDAxMDAxMTAxIGluIGJpbmFyeS4gIFJJU0MtViBpcyBsaXR0bGUtZW5kaWFu IGFuZCB0aGUgbGFzdAp0d28gYml0cyBvZiB0aGUgbG93ZXN0LXZhbHVlIGJ5dGUgZGVmaW5lIHRo ZSB0eXBlIG9mIGluc3RydWN0aW9uLiAKQWNjb3JkaW5nIHRvIHRoZSBjaGFwdGVyICJCYXNlIElu c3RydWN0aW9uLUxlbmd0aCBFbmNvZGluZyIgaW4KdGhlIFJJU0MtViBJU0Egc3BlYyBldmVyeXRo aW5nIGV4Y2VwdCAxMSBhcyB0aGUgbG93ZXN0IGJpdHMKZGVub3RlcyBhIGNvbXByZXNzZWQgaW5z dHJ1Y3Rpb24gYW5kIGlmIEkgaGF2ZSBwdXp6ZWxlZCB0b2dldGhlcgp0aGUgdGhlIHZhcmlvdXMg aW5zdHJ1Y3Rpb24gYml0cyBjb3JyZWN0bHksIEFTQ0lJICJNWiIgd291bGQgYmUKZXhjdXRlZCBh cyBhIGNvbXByZXNzZWQgbG9hZCBpbW1lZGlhdGUgdG8geDkvczEsIHdvdWxkbid0IGl0PwoKSWYg bXkgcHJldmlvdXMgdGhvdWdodHMgYXJlIGNvcnJlY3QsIHRoaXMgd291bGQgYWxzbyBtZWFuIHRo YXQKaGF2aW5nIGEgUEUvQ09GRi1jb21wYXRpYmxlIGhlYWRlciBmb3IgRUZJIGJvb3Qgd291bGQg bWFrZSBhCmtlcm5lbCBpbWFnZSBpbmhlcmVudGx5IGluY29tcGF0aWJsZSB3aXRoIHBlcmZvcm1p bmcgYSBub24tRUZJCmJvb3Qgb2YgdGhlIHNhbWUgaW1hZ2Ugb24gc3lzdGVtcyB0aGF0IGRvbid0 IGltcGxlbWVudCB0aGUgQwpleHRlbnNpb24uICBBcyB0aGUgd29yay1pbi1wcm9ncmVzcyBSSVND LVYgVW5peCBwbGF0Zm9ybSBzcGVjCndpbGwgcHJvYmFibHkgbWFuZGF0ZSBDLCB0aGF0IHByb2Jh Ymx5IHdvbid0IGJlIG11Y2ggb2YgYQpwcmFjdGljYWwgcHJvYmxlbSwgdGhvdWdoLgoKUmVnYXJk cywKS2Fyc3RlbgotLSAKSWNoIHdpZGVyc3ByZWNoZSBoaWVybWl0IGF1c2Ryw7xja2xpY2ggZGVy IE51dHp1bmcgc293aWUgZGVyCldlaXRlcmdhYmUgbWVpbmVyIHBlcnNvbmVuYmV6b2dlbmVuIERh dGVuIGbDvHIgWndlY2tlIGRlciBXZXJidW5nCnNvd2llIGRlciBNYXJrdC0gb2RlciBNZWludW5n c2ZvcnNjaHVuZy4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQu b3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlz Y3YK