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=-10.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 8CC37C43603 for ; Wed, 3 Mar 2021 07:23:23 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5FC1964EDF for ; Wed, 3 Mar 2021 07:23:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1356211AbhCCHRY (ORCPT ); Wed, 3 Mar 2021 02:17:24 -0500 Received: from foss.arm.com ([217.140.110.172]:57360 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235463AbhCBSX7 (ORCPT ); Tue, 2 Mar 2021 13:23:59 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E946F31B; Tue, 2 Mar 2021 09:56:46 -0800 (PST) Received: from [192.168.0.110] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E9E923F766; Tue, 2 Mar 2021 09:56:45 -0800 (PST) Subject: Re: [PATCH kvmtool v2 00/22] Unify I/O port and MMIO trap handling To: Andre Przywara , Will Deacon , Julien Thierry Cc: kvm@vger.kernel.org, kvmarm@lists.cs.columbia.edu, Marc Zyngier , Sami Mujawar References: <20210225005915.26423-1-andre.przywara@arm.com> From: Alexandru Elisei Message-ID: Date: Tue, 2 Mar 2021 17:57:05 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: <20210225005915.26423-1-andre.przywara@arm.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Language: en-US Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org Hi Andre, I've started to review this iteration and I've come across this error when trying to apply the patches: $ git am --reject patches/unify-ioport-and-mmio/v2/Unify-I-O-port-and-MMIO-trap-handling.patch Applying: ioport: Remove ioport__setup_arch() Checking patch arm/ioport.c... Checking patch include/kvm/ioport.h... Checking patch ioport.c... Checking patch mips/kvm.c... Checking patch powerpc/ioport.c... Checking patch x86/ioport.c... Applied patch arm/ioport.c cleanly. Applied patch include/kvm/ioport.h cleanly. Applied patch ioport.c cleanly. Applied patch mips/kvm.c cleanly. Applied patch powerpc/ioport.c cleanly. Applied patch x86/ioport.c cleanly. Applying: hw/serial: Use device abstraction for FDT generator function Checking patch hw/serial.c... Checking patch include/kvm/kvm.h... Applied patch hw/serial.c cleanly. Applied patch include/kvm/kvm.h cleanly. Applying: ioport: Retire .generate_fdt_node functionality Checking patch include/kvm/ioport.h... Checking patch ioport.c... Applied patch include/kvm/ioport.h cleanly. Applied patch ioport.c cleanly. Applying: mmio: Extend handling to include ioport emulation Checking patch include/kvm/kvm.h... Checking patch ioport.c... Checking patch mmio.c... Applied patch include/kvm/kvm.h cleanly. Applied patch ioport.c cleanly. Applied patch mmio.c cleanly. Applying: hw/i8042: Clean up data types Checking patch hw/i8042.c... Applied patch hw/i8042.c cleanly. Applying: hw/i8042: Refactor trap handler Checking patch hw/i8042.c... Applied patch hw/i8042.c cleanly. Applying: hw/i8042: Switch to new trap handlers Checking patch hw/i8042.c... error: while searching for:         ioport__write8(data, value); } /*  * Called when the OS has written to one of the keyboard's ports (0x60 or 0x64)  */ static bool kbd_in(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) {     kbd_io(vcpu, port, data, size, false, NULL);     return true; } static bool kbd_out(struct ioport *ioport, struct kvm_cpu *vcpu, u16 port, void *data, int size) {     kbd_io(vcpu, port, data, size, true, NULL);     return true; } static struct ioport_operations kbd_ops = {     .io_in        = kbd_in,     .io_out        = kbd_out, }; int kbd__init(struct kvm *kvm) {     int r;     kbd_reset();     state.kvm = kvm;     r = ioport__register(kvm, I8042_DATA_REG, &kbd_ops, 2, NULL);     if (r < 0)         return r;     r = ioport__register(kvm, I8042_COMMAND_REG, &kbd_ops, 2, NULL);     if (r < 0) {         ioport__unregister(kvm, I8042_DATA_REG);         return r;     } error: patch failed: hw/i8042.c:325 Checking patch include/kvm/i8042.h... Applying patch hw/i8042.c with 1 reject... Rejected hunk #1. Applied patch include/kvm/i8042.h cleanly. Patch failed at 0007 hw/i8042: Switch to new trap handlers hint: Use 'git am --show-current-patch=diff' to see the failed patch When you have resolved this problem, run "git am --continue". If you prefer to skip this patch, run "git am --skip" instead. To restore the original branch and stop patching, run "git am --abort". where the patch file is from patchwork.kernel.org [1], created when clicking on the "series" button on the top right. I'm not sure what is causing the error, everything looks the same to me. Regardless, I've applied the reject manually and everything looks ok. [1] https://patchwork.kernel.org/project/kvm/patch/20210225005915.26423-2-andre.przywara@arm.com/ Thanks, Alex On 2/25/21 12:58 AM, Andre Przywara wrote: > Compared to v1 this has a few fixes, as suggested by Alex. > There is a new patch 20/22, which cleans up the ARM memory map > definition and adds some chart to make it more obvious what is going on. > For a changelog, see below. > > ============== > > At the moment we use two separate code paths to handle exits for > KVM_EXIT_IO (ioport.c) and KVM_EXIT_MMIO (mmio.c), even though they > are semantically very similar. Because the trap handler callback routine > is different, devices need to decide on one conduit or need to provide > different handler functions for both of them. > > This is not only unnecessary code duplication, but makes switching > devices from I/O port to MMIO a tedious task, even though there is no > real difference between the two, especially on ARM and PowerPC. > > For ARM we aim at providing a flexible memory layout, and also have > trouble with the UART and RTC device overlapping with the PCI I/O area, > so it seems indicated to tackle this once and for all. > > The first three patches do some cleanup, to simplify things later. > > Patch 04/22 lays the groundwork, by extending mmio.c to be able to also > register I/O port trap handlers, using the same callback prototype as > we use for MMIO. > > The next 14 patches then convert devices that use the I/O port > interface over to the new joint interface. This requires to rework > the trap handler routine to adhere to the same prototype as the existing > MMIO handlers. For most devices this is done in two steps: a first to > introduce the reworked handler routine, and a second to switch to the new > joint registration routine. For some devices the first step is trivial, > so it's done in one patch. > > Patch 19/22 then retires the old I/O port interface, by removing ioport.c > and friends. > Patch 20/22 uses the opportunity to clean up the memory map description, > also declares a new region (from 16MB on), where the final two patches > switch the UART and the RTC device to. They are now registered > on the MMIO "bus", when running on ARM or arm64. This moves them away > from the first 64KB, so they are not in the PCI I/O area anymore. > > Please have a look and comment! > > Cheers, > Andre > > Changelog v1 .. v2: > - rework memory map definition > - add explicit debug output for debug I/O port > - add explicit check for MMIO coalescing on I/O ports > - drop usage of ioport__{read,write}8() from serial > - drop explicit I/O port cleanup routine (to mimic MMIO operation) > - add comment for IOTRAP_BUS_MASK > - minor cleanups / formatting changes > > Andre Przywara (22): > ioport: Remove ioport__setup_arch() > hw/serial: Use device abstraction for FDT generator function > ioport: Retire .generate_fdt_node functionality > mmio: Extend handling to include ioport emulation > hw/i8042: Clean up data types > hw/i8042: Refactor trap handler > hw/i8042: Switch to new trap handlers > x86/ioport: Refactor trap handlers > x86/ioport: Switch to new trap handlers > hw/rtc: Refactor trap handlers > hw/rtc: Switch to new trap handler > hw/vesa: Switch trap handling to use MMIO handler > hw/serial: Refactor trap handler > hw/serial: Switch to new trap handlers > vfio: Refactor ioport trap handler > vfio: Switch to new ioport trap handlers > virtio: Switch trap handling to use MMIO handler > pci: Switch trap handling to use MMIO handler > Remove ioport specific routines > arm: Reorganise and document memory map > hw/serial: ARM/arm64: Use MMIO at higher addresses > hw/rtc: ARM/arm64: Use MMIO at higher addresses > > Makefile | 1 - > arm/include/arm-common/kvm-arch.h | 47 ++++-- > arm/ioport.c | 5 - > hw/i8042.c | 94 +++++------- > hw/rtc.c | 91 ++++++------ > hw/serial.c | 160 ++++++++++++-------- > hw/vesa.c | 19 +-- > include/kvm/i8042.h | 1 - > include/kvm/ioport.h | 32 ---- > include/kvm/kvm.h | 49 ++++++- > ioport.c | 235 ------------------------------ > mips/kvm.c | 5 - > mmio.c | 65 +++++++-- > pci.c | 82 +++-------- > powerpc/ioport.c | 6 - > vfio/core.c | 50 ++++--- > virtio/pci.c | 46 ++---- > x86/ioport.c | 107 +++++++------- > 18 files changed, 433 insertions(+), 662 deletions(-) > delete mode 100644 ioport.c > 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=-10.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 73BB5C433E0 for ; Tue, 2 Mar 2021 17:56:53 +0000 (UTC) Received: from mm01.cs.columbia.edu (mm01.cs.columbia.edu [128.59.11.253]) by mail.kernel.org (Postfix) with ESMTP id B2C8064F1F for ; Tue, 2 Mar 2021 17:56:52 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org B2C8064F1F Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=kvmarm-bounces@lists.cs.columbia.edu Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 1A5824B5CB; Tue, 2 Mar 2021 12:56:52 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id TbxcXPIoYWv0; Tue, 2 Mar 2021 12:56:50 -0500 (EST) Received: from mm01.cs.columbia.edu (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 79FB44B5D7; Tue, 2 Mar 2021 12:56:50 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 6A8224B5D7 for ; Tue, 2 Mar 2021 12:56:49 -0500 (EST) X-Virus-Scanned: at lists.cs.columbia.edu Received: from mm01.cs.columbia.edu ([127.0.0.1]) by localhost (mm01.cs.columbia.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 39ehsKFXDE5U for ; Tue, 2 Mar 2021 12:56:47 -0500 (EST) Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mm01.cs.columbia.edu (Postfix) with ESMTP id 9080C4B5CB for ; Tue, 2 Mar 2021 12:56:47 -0500 (EST) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E946F31B; Tue, 2 Mar 2021 09:56:46 -0800 (PST) Received: from [192.168.0.110] (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E9E923F766; Tue, 2 Mar 2021 09:56:45 -0800 (PST) Subject: Re: [PATCH kvmtool v2 00/22] Unify I/O port and MMIO trap handling To: Andre Przywara , Will Deacon , Julien Thierry References: <20210225005915.26423-1-andre.przywara@arm.com> From: Alexandru Elisei Message-ID: Date: Tue, 2 Mar 2021 17:57:05 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 MIME-Version: 1.0 In-Reply-To: <20210225005915.26423-1-andre.przywara@arm.com> Content-Language: en-US Cc: Marc Zyngier , Sami Mujawar , kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org X-BeenThere: kvmarm@lists.cs.columbia.edu X-Mailman-Version: 2.1.14 Precedence: list List-Id: Where KVM/ARM decisions are made List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: kvmarm-bounces@lists.cs.columbia.edu Sender: kvmarm-bounces@lists.cs.columbia.edu SGkgQW5kcmUsCgpJJ3ZlIHN0YXJ0ZWQgdG8gcmV2aWV3IHRoaXMgaXRlcmF0aW9uIGFuZCBJJ3Zl IGNvbWUgYWNyb3NzIHRoaXMgZXJyb3Igd2hlbiB0cnlpbmcKdG8gYXBwbHkgdGhlIHBhdGNoZXM6 CgokIGdpdCBhbSAtLXJlamVjdApwYXRjaGVzL3VuaWZ5LWlvcG9ydC1hbmQtbW1pby92Mi9Vbmlm eS1JLU8tcG9ydC1hbmQtTU1JTy10cmFwLWhhbmRsaW5nLnBhdGNoCkFwcGx5aW5nOiBpb3BvcnQ6 IFJlbW92ZSBpb3BvcnRfX3NldHVwX2FyY2goKQpDaGVja2luZyBwYXRjaCBhcm0vaW9wb3J0LmMu Li4KQ2hlY2tpbmcgcGF0Y2ggaW5jbHVkZS9rdm0vaW9wb3J0LmguLi4KQ2hlY2tpbmcgcGF0Y2gg aW9wb3J0LmMuLi4KQ2hlY2tpbmcgcGF0Y2ggbWlwcy9rdm0uYy4uLgpDaGVja2luZyBwYXRjaCBw b3dlcnBjL2lvcG9ydC5jLi4uCkNoZWNraW5nIHBhdGNoIHg4Ni9pb3BvcnQuYy4uLgpBcHBsaWVk IHBhdGNoIGFybS9pb3BvcnQuYyBjbGVhbmx5LgpBcHBsaWVkIHBhdGNoIGluY2x1ZGUva3ZtL2lv cG9ydC5oIGNsZWFubHkuCkFwcGxpZWQgcGF0Y2ggaW9wb3J0LmMgY2xlYW5seS4KQXBwbGllZCBw YXRjaCBtaXBzL2t2bS5jIGNsZWFubHkuCkFwcGxpZWQgcGF0Y2ggcG93ZXJwYy9pb3BvcnQuYyBj bGVhbmx5LgpBcHBsaWVkIHBhdGNoIHg4Ni9pb3BvcnQuYyBjbGVhbmx5LgpBcHBseWluZzogaHcv c2VyaWFsOiBVc2UgZGV2aWNlIGFic3RyYWN0aW9uIGZvciBGRFQgZ2VuZXJhdG9yIGZ1bmN0aW9u CkNoZWNraW5nIHBhdGNoIGh3L3NlcmlhbC5jLi4uCkNoZWNraW5nIHBhdGNoIGluY2x1ZGUva3Zt L2t2bS5oLi4uCkFwcGxpZWQgcGF0Y2ggaHcvc2VyaWFsLmMgY2xlYW5seS4KQXBwbGllZCBwYXRj aCBpbmNsdWRlL2t2bS9rdm0uaCBjbGVhbmx5LgpBcHBseWluZzogaW9wb3J0OiBSZXRpcmUgLmdl bmVyYXRlX2ZkdF9ub2RlIGZ1bmN0aW9uYWxpdHkKQ2hlY2tpbmcgcGF0Y2ggaW5jbHVkZS9rdm0v aW9wb3J0LmguLi4KQ2hlY2tpbmcgcGF0Y2ggaW9wb3J0LmMuLi4KQXBwbGllZCBwYXRjaCBpbmNs dWRlL2t2bS9pb3BvcnQuaCBjbGVhbmx5LgpBcHBsaWVkIHBhdGNoIGlvcG9ydC5jIGNsZWFubHku CkFwcGx5aW5nOiBtbWlvOiBFeHRlbmQgaGFuZGxpbmcgdG8gaW5jbHVkZSBpb3BvcnQgZW11bGF0 aW9uCkNoZWNraW5nIHBhdGNoIGluY2x1ZGUva3ZtL2t2bS5oLi4uCkNoZWNraW5nIHBhdGNoIGlv cG9ydC5jLi4uCkNoZWNraW5nIHBhdGNoIG1taW8uYy4uLgpBcHBsaWVkIHBhdGNoIGluY2x1ZGUv a3ZtL2t2bS5oIGNsZWFubHkuCkFwcGxpZWQgcGF0Y2ggaW9wb3J0LmMgY2xlYW5seS4KQXBwbGll ZCBwYXRjaCBtbWlvLmMgY2xlYW5seS4KQXBwbHlpbmc6IGh3L2k4MDQyOiBDbGVhbiB1cCBkYXRh IHR5cGVzCkNoZWNraW5nIHBhdGNoIGh3L2k4MDQyLmMuLi4KQXBwbGllZCBwYXRjaCBody9pODA0 Mi5jIGNsZWFubHkuCkFwcGx5aW5nOiBody9pODA0MjogUmVmYWN0b3IgdHJhcCBoYW5kbGVyCkNo ZWNraW5nIHBhdGNoIGh3L2k4MDQyLmMuLi4KQXBwbGllZCBwYXRjaCBody9pODA0Mi5jIGNsZWFu bHkuCkFwcGx5aW5nOiBody9pODA0MjogU3dpdGNoIHRvIG5ldyB0cmFwIGhhbmRsZXJzCkNoZWNr aW5nIHBhdGNoIGh3L2k4MDQyLmMuLi4KZXJyb3I6IHdoaWxlIHNlYXJjaGluZyBmb3I6CsKgwqDC oCDCoMKgwqAgaW9wb3J0X193cml0ZTgoZGF0YSwgdmFsdWUpOwp9CgovKgrCoCogQ2FsbGVkIHdo ZW4gdGhlIE9TIGhhcyB3cml0dGVuIHRvIG9uZSBvZiB0aGUga2V5Ym9hcmQncyBwb3J0cyAoMHg2 MCBvciAweDY0KQrCoCovCnN0YXRpYyBib29sIGtiZF9pbihzdHJ1Y3QgaW9wb3J0ICppb3BvcnQs IHN0cnVjdCBrdm1fY3B1ICp2Y3B1LCB1MTYgcG9ydCwgdm9pZAoqZGF0YSwgaW50IHNpemUpCnsK wqDCoMKgIGtiZF9pbyh2Y3B1LCBwb3J0LCBkYXRhLCBzaXplLCBmYWxzZSwgTlVMTCk7CgrCoMKg wqAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyBib29sIGtiZF9vdXQoc3RydWN0IGlvcG9ydCAqaW9w b3J0LCBzdHJ1Y3Qga3ZtX2NwdSAqdmNwdSwgdTE2IHBvcnQsIHZvaWQKKmRhdGEsIGludCBzaXpl KQp7CsKgwqDCoCBrYmRfaW8odmNwdSwgcG9ydCwgZGF0YSwgc2l6ZSwgdHJ1ZSwgTlVMTCk7CgrC oMKgwqAgcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyBzdHJ1Y3QgaW9wb3J0X29wZXJhdGlvbnMga2Jk X29wcyA9IHsKwqDCoMKgIC5pb19pbsKgwqDCoCDCoMKgwqAgPSBrYmRfaW4sCsKgwqDCoCAuaW9f b3V0wqDCoMKgIMKgwqDCoCA9IGtiZF9vdXQsCn07CgppbnQga2JkX19pbml0KHN0cnVjdCBrdm0g Kmt2bSkKewrCoMKgwqAgaW50IHI7CgrCoMKgwqAga2JkX3Jlc2V0KCk7CsKgwqDCoCBzdGF0ZS5r dm0gPSBrdm07CsKgwqDCoCByID0gaW9wb3J0X19yZWdpc3Rlcihrdm0sIEk4MDQyX0RBVEFfUkVH LCAma2JkX29wcywgMiwgTlVMTCk7CsKgwqDCoCBpZiAociA8IDApCsKgwqDCoCDCoMKgwqAgcmV0 dXJuIHI7CsKgwqDCoCByID0gaW9wb3J0X19yZWdpc3Rlcihrdm0sIEk4MDQyX0NPTU1BTkRfUkVH LCAma2JkX29wcywgMiwgTlVMTCk7CsKgwqDCoCBpZiAociA8IDApIHsKwqDCoMKgIMKgwqDCoCBp b3BvcnRfX3VucmVnaXN0ZXIoa3ZtLCBJODA0Ml9EQVRBX1JFRyk7CsKgwqDCoCDCoMKgwqAgcmV0 dXJuIHI7CsKgwqDCoCB9CgoKZXJyb3I6IHBhdGNoIGZhaWxlZDogaHcvaTgwNDIuYzozMjUKQ2hl Y2tpbmcgcGF0Y2ggaW5jbHVkZS9rdm0vaTgwNDIuaC4uLgpBcHBseWluZyBwYXRjaCBody9pODA0 Mi5jIHdpdGggMSByZWplY3QuLi4KUmVqZWN0ZWQgaHVuayAjMS4KQXBwbGllZCBwYXRjaCBpbmNs dWRlL2t2bS9pODA0Mi5oIGNsZWFubHkuClBhdGNoIGZhaWxlZCBhdCAwMDA3IGh3L2k4MDQyOiBT d2l0Y2ggdG8gbmV3IHRyYXAgaGFuZGxlcnMKaGludDogVXNlICdnaXQgYW0gLS1zaG93LWN1cnJl bnQtcGF0Y2g9ZGlmZicgdG8gc2VlIHRoZSBmYWlsZWQgcGF0Y2gKV2hlbiB5b3UgaGF2ZSByZXNv bHZlZCB0aGlzIHByb2JsZW0sIHJ1biAiZ2l0IGFtIC0tY29udGludWUiLgpJZiB5b3UgcHJlZmVy IHRvIHNraXAgdGhpcyBwYXRjaCwgcnVuICJnaXQgYW0gLS1za2lwIiBpbnN0ZWFkLgpUbyByZXN0 b3JlIHRoZSBvcmlnaW5hbCBicmFuY2ggYW5kIHN0b3AgcGF0Y2hpbmcsIHJ1biAiZ2l0IGFtIC0t YWJvcnQiLgoKd2hlcmUgdGhlIHBhdGNoIGZpbGUgaXMgZnJvbSBwYXRjaHdvcmsua2VybmVsLm9y ZyBbMV0sIGNyZWF0ZWQgd2hlbiBjbGlja2luZyBvbgp0aGUgInNlcmllcyIgYnV0dG9uIG9uIHRo ZSB0b3AgcmlnaHQuIEknbSBub3Qgc3VyZSB3aGF0IGlzIGNhdXNpbmcgdGhlIGVycm9yLApldmVy eXRoaW5nIGxvb2tzIHRoZSBzYW1lIHRvIG1lLgoKUmVnYXJkbGVzcywgSSd2ZSBhcHBsaWVkIHRo ZSByZWplY3QgbWFudWFsbHkgYW5kIGV2ZXJ5dGhpbmcgbG9va3Mgb2suCgpbMV0KaHR0cHM6Ly9w YXRjaHdvcmsua2VybmVsLm9yZy9wcm9qZWN0L2t2bS9wYXRjaC8yMDIxMDIyNTAwNTkxNS4yNjQy My0yLWFuZHJlLnByenl3YXJhQGFybS5jb20vCgpUaGFua3MsCgpBbGV4CgpPbiAyLzI1LzIxIDEy OjU4IEFNLCBBbmRyZSBQcnp5d2FyYSB3cm90ZToKPiBDb21wYXJlZCB0byB2MSB0aGlzIGhhcyBh IGZldyBmaXhlcywgYXMgc3VnZ2VzdGVkIGJ5IEFsZXguCj4gVGhlcmUgaXMgYSBuZXcgcGF0Y2gg MjAvMjIsIHdoaWNoIGNsZWFucyB1cCB0aGUgQVJNIG1lbW9yeSBtYXAKPiBkZWZpbml0aW9uIGFu ZCBhZGRzIHNvbWUgY2hhcnQgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgd2hhdCBpcyBnb2luZyBv bi4KPiBGb3IgYSBjaGFuZ2Vsb2csIHNlZSBiZWxvdy4KPgo+ID09PT09PT09PT09PT09Cj4KPiBB dCB0aGUgbW9tZW50IHdlIHVzZSB0d28gc2VwYXJhdGUgY29kZSBwYXRocyB0byBoYW5kbGUgZXhp dHMgZm9yCj4gS1ZNX0VYSVRfSU8gKGlvcG9ydC5jKSBhbmQgS1ZNX0VYSVRfTU1JTyAobW1pby5j KSwgZXZlbiB0aG91Z2ggdGhleQo+IGFyZSBzZW1hbnRpY2FsbHkgdmVyeSBzaW1pbGFyLiBCZWNh dXNlIHRoZSB0cmFwIGhhbmRsZXIgY2FsbGJhY2sgcm91dGluZQo+IGlzIGRpZmZlcmVudCwgZGV2 aWNlcyBuZWVkIHRvIGRlY2lkZSBvbiBvbmUgY29uZHVpdCBvciBuZWVkIHRvIHByb3ZpZGUKPiBk aWZmZXJlbnQgaGFuZGxlciBmdW5jdGlvbnMgZm9yIGJvdGggb2YgdGhlbS4KPgo+IFRoaXMgaXMg bm90IG9ubHkgdW5uZWNlc3NhcnkgY29kZSBkdXBsaWNhdGlvbiwgYnV0IG1ha2VzIHN3aXRjaGlu Zwo+IGRldmljZXMgZnJvbSBJL08gcG9ydCB0byBNTUlPIGEgdGVkaW91cyB0YXNrLCBldmVuIHRo b3VnaCB0aGVyZSBpcyBubwo+IHJlYWwgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28sIGVzcGVj aWFsbHkgb24gQVJNIGFuZCBQb3dlclBDLgo+Cj4gRm9yIEFSTSB3ZSBhaW0gYXQgcHJvdmlkaW5n IGEgZmxleGlibGUgbWVtb3J5IGxheW91dCwgYW5kIGFsc28gaGF2ZQo+IHRyb3VibGUgd2l0aCB0 aGUgVUFSVCBhbmQgUlRDIGRldmljZSBvdmVybGFwcGluZyB3aXRoIHRoZSBQQ0kgSS9PIGFyZWEs Cj4gc28gaXQgc2VlbXMgaW5kaWNhdGVkIHRvIHRhY2tsZSB0aGlzIG9uY2UgYW5kIGZvciBhbGwu Cj4KPiBUaGUgZmlyc3QgdGhyZWUgcGF0Y2hlcyBkbyBzb21lIGNsZWFudXAsIHRvIHNpbXBsaWZ5 IHRoaW5ncyBsYXRlci4KPgo+IFBhdGNoIDA0LzIyIGxheXMgdGhlIGdyb3VuZHdvcmssIGJ5IGV4 dGVuZGluZyBtbWlvLmMgdG8gYmUgYWJsZSB0byBhbHNvCj4gcmVnaXN0ZXIgSS9PIHBvcnQgdHJh cCBoYW5kbGVycywgdXNpbmcgdGhlIHNhbWUgY2FsbGJhY2sgcHJvdG90eXBlIGFzCj4gd2UgdXNl IGZvciBNTUlPLgo+Cj4gVGhlIG5leHQgMTQgcGF0Y2hlcyB0aGVuIGNvbnZlcnQgZGV2aWNlcyB0 aGF0IHVzZSB0aGUgSS9PIHBvcnQKPiBpbnRlcmZhY2Ugb3ZlciB0byB0aGUgbmV3IGpvaW50IGlu dGVyZmFjZS4gVGhpcyByZXF1aXJlcyB0byByZXdvcmsKPiB0aGUgdHJhcCBoYW5kbGVyIHJvdXRp bmUgdG8gYWRoZXJlIHRvIHRoZSBzYW1lIHByb3RvdHlwZSBhcyB0aGUgZXhpc3RpbmcKPiBNTUlP IGhhbmRsZXJzLiBGb3IgbW9zdCBkZXZpY2VzIHRoaXMgaXMgZG9uZSBpbiB0d28gc3RlcHM6IGEg Zmlyc3QgdG8KPiBpbnRyb2R1Y2UgdGhlIHJld29ya2VkIGhhbmRsZXIgcm91dGluZSwgYW5kIGEg c2Vjb25kIHRvIHN3aXRjaCB0byB0aGUgbmV3Cj4gam9pbnQgcmVnaXN0cmF0aW9uIHJvdXRpbmUu IEZvciBzb21lIGRldmljZXMgdGhlIGZpcnN0IHN0ZXAgaXMgdHJpdmlhbCwKPiBzbyBpdCdzIGRv bmUgaW4gb25lIHBhdGNoLgo+Cj4gUGF0Y2ggMTkvMjIgdGhlbiByZXRpcmVzIHRoZSBvbGQgSS9P IHBvcnQgaW50ZXJmYWNlLCBieSByZW1vdmluZyBpb3BvcnQuYwo+IGFuZCBmcmllbmRzLgo+IFBh dGNoIDIwLzIyIHVzZXMgdGhlIG9wcG9ydHVuaXR5IHRvIGNsZWFuIHVwIHRoZSBtZW1vcnkgbWFw IGRlc2NyaXB0aW9uLAo+IGFsc28gZGVjbGFyZXMgYSBuZXcgcmVnaW9uIChmcm9tIDE2TUIgb24p LCB3aGVyZSB0aGUgZmluYWwgdHdvIHBhdGNoZXMKPiBzd2l0Y2ggdGhlIFVBUlQgYW5kIHRoZSBS VEMgZGV2aWNlIHRvLiBUaGV5IGFyZSBub3cgcmVnaXN0ZXJlZAo+IG9uIHRoZSBNTUlPICJidXMi LCB3aGVuIHJ1bm5pbmcgb24gQVJNIG9yIGFybTY0LiBUaGlzIG1vdmVzIHRoZW0gYXdheQo+IGZy b20gdGhlIGZpcnN0IDY0S0IsIHNvIHRoZXkgYXJlIG5vdCBpbiB0aGUgUENJIEkvTyBhcmVhIGFu eW1vcmUuCj4KPiBQbGVhc2UgaGF2ZSBhIGxvb2sgYW5kIGNvbW1lbnQhCj4KPiBDaGVlcnMsCj4g QW5kcmUKPgo+IENoYW5nZWxvZyB2MSAuLiB2MjoKPiAtIHJld29yayBtZW1vcnkgbWFwIGRlZmlu aXRpb24KPiAtIGFkZCBleHBsaWNpdCBkZWJ1ZyBvdXRwdXQgZm9yIGRlYnVnIEkvTyBwb3J0Cj4g LSBhZGQgZXhwbGljaXQgY2hlY2sgZm9yIE1NSU8gY29hbGVzY2luZyBvbiBJL08gcG9ydHMKPiAt IGRyb3AgdXNhZ2Ugb2YgaW9wb3J0X197cmVhZCx3cml0ZX04KCkgZnJvbSBzZXJpYWwKPiAtIGRy b3AgZXhwbGljaXQgSS9PIHBvcnQgY2xlYW51cCByb3V0aW5lICh0byBtaW1pYyBNTUlPIG9wZXJh dGlvbikKPiAtIGFkZCBjb21tZW50IGZvciBJT1RSQVBfQlVTX01BU0sKPiAtIG1pbm9yIGNsZWFu dXBzIC8gZm9ybWF0dGluZyBjaGFuZ2VzCj4KPiBBbmRyZSBQcnp5d2FyYSAoMjIpOgo+ICAgaW9w b3J0OiBSZW1vdmUgaW9wb3J0X19zZXR1cF9hcmNoKCkKPiAgIGh3L3NlcmlhbDogVXNlIGRldmlj ZSBhYnN0cmFjdGlvbiBmb3IgRkRUIGdlbmVyYXRvciBmdW5jdGlvbgo+ICAgaW9wb3J0OiBSZXRp cmUgLmdlbmVyYXRlX2ZkdF9ub2RlIGZ1bmN0aW9uYWxpdHkKPiAgIG1taW86IEV4dGVuZCBoYW5k bGluZyB0byBpbmNsdWRlIGlvcG9ydCBlbXVsYXRpb24KPiAgIGh3L2k4MDQyOiBDbGVhbiB1cCBk YXRhIHR5cGVzCj4gICBody9pODA0MjogUmVmYWN0b3IgdHJhcCBoYW5kbGVyCj4gICBody9pODA0 MjogU3dpdGNoIHRvIG5ldyB0cmFwIGhhbmRsZXJzCj4gICB4ODYvaW9wb3J0OiBSZWZhY3RvciB0 cmFwIGhhbmRsZXJzCj4gICB4ODYvaW9wb3J0OiBTd2l0Y2ggdG8gbmV3IHRyYXAgaGFuZGxlcnMK PiAgIGh3L3J0YzogUmVmYWN0b3IgdHJhcCBoYW5kbGVycwo+ICAgaHcvcnRjOiBTd2l0Y2ggdG8g bmV3IHRyYXAgaGFuZGxlcgo+ICAgaHcvdmVzYTogU3dpdGNoIHRyYXAgaGFuZGxpbmcgdG8gdXNl IE1NSU8gaGFuZGxlcgo+ICAgaHcvc2VyaWFsOiBSZWZhY3RvciB0cmFwIGhhbmRsZXIKPiAgIGh3 L3NlcmlhbDogU3dpdGNoIHRvIG5ldyB0cmFwIGhhbmRsZXJzCj4gICB2ZmlvOiBSZWZhY3RvciBp b3BvcnQgdHJhcCBoYW5kbGVyCj4gICB2ZmlvOiBTd2l0Y2ggdG8gbmV3IGlvcG9ydCB0cmFwIGhh bmRsZXJzCj4gICB2aXJ0aW86IFN3aXRjaCB0cmFwIGhhbmRsaW5nIHRvIHVzZSBNTUlPIGhhbmRs ZXIKPiAgIHBjaTogU3dpdGNoIHRyYXAgaGFuZGxpbmcgdG8gdXNlIE1NSU8gaGFuZGxlcgo+ICAg UmVtb3ZlIGlvcG9ydCBzcGVjaWZpYyByb3V0aW5lcwo+ICAgYXJtOiBSZW9yZ2FuaXNlIGFuZCBk b2N1bWVudCBtZW1vcnkgbWFwCj4gICBody9zZXJpYWw6IEFSTS9hcm02NDogVXNlIE1NSU8gYXQg aGlnaGVyIGFkZHJlc3Nlcwo+ICAgaHcvcnRjOiBBUk0vYXJtNjQ6IFVzZSBNTUlPIGF0IGhpZ2hl ciBhZGRyZXNzZXMKPgo+ICBNYWtlZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIDEg LQo+ICBhcm0vaW5jbHVkZS9hcm0tY29tbW9uL2t2bS1hcmNoLmggfCAgNDcgKysrKy0tCj4gIGFy bS9pb3BvcnQuYyAgICAgICAgICAgICAgICAgICAgICB8ICAgNSAtCj4gIGh3L2k4MDQyLmMgICAg ICAgICAgICAgICAgICAgICAgICB8ICA5NCArKysrKy0tLS0tLS0KPiAgaHcvcnRjLmMgICAgICAg ICAgICAgICAgICAgICAgICAgIHwgIDkxICsrKysrKy0tLS0tLQo+ICBody9zZXJpYWwuYyAgICAg ICAgICAgICAgICAgICAgICAgfCAxNjAgKysrKysrKysrKysrLS0tLS0tLS0KPiAgaHcvdmVzYS5j ICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDE5ICstLQo+ICBpbmNsdWRlL2t2bS9pODA0Mi5o ICAgICAgICAgICAgICAgfCAgIDEgLQo+ICBpbmNsdWRlL2t2bS9pb3BvcnQuaCAgICAgICAgICAg ICAgfCAgMzIgLS0tLQo+ICBpbmNsdWRlL2t2bS9rdm0uaCAgICAgICAgICAgICAgICAgfCAgNDkg KysrKysrLQo+ICBpb3BvcnQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyMzUgLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gIG1pcHMva3ZtLmMgICAgICAgICAgICAgICAgICAg ICAgICB8ICAgNSAtCj4gIG1taW8uYyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICA2NSAr KysrKysrLS0KPiAgcGNpLmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIDgyICsrKy0t LS0tLS0tCj4gIHBvd2VycGMvaW9wb3J0LmMgICAgICAgICAgICAgICAgICB8ICAgNiAtCj4gIHZm aW8vY29yZS5jICAgICAgICAgICAgICAgICAgICAgICB8ICA1MCArKysrLS0tCj4gIHZpcnRpby9w Y2kuYyAgICAgICAgICAgICAgICAgICAgICB8ICA0NiArKy0tLS0KPiAgeDg2L2lvcG9ydC5jICAg ICAgICAgICAgICAgICAgICAgIHwgMTA3ICsrKysrKystLS0tLS0tCj4gIDE4IGZpbGVzIGNoYW5n ZWQsIDQzMyBpbnNlcnRpb25zKCspLCA2NjIgZGVsZXRpb25zKC0pCj4gIGRlbGV0ZSBtb2RlIDEw MDY0NCBpb3BvcnQuYwo+Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmt2bWFybSBtYWlsaW5nIGxpc3QKa3ZtYXJtQGxpc3RzLmNzLmNvbHVtYmlhLmVkdQpo dHRwczovL2xpc3RzLmNzLmNvbHVtYmlhLmVkdS9tYWlsbWFuL2xpc3RpbmZvL2t2bWFybQo=