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=-5.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,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 B13A9C35250 for ; Sun, 9 Feb 2020 05:54:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 773B42072C for ; Sun, 9 Feb 2020 05:54:19 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1725943AbgBIFyS (ORCPT ); Sun, 9 Feb 2020 00:54:18 -0500 Received: from mga12.intel.com ([192.55.52.136]:57498 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725861AbgBIFyS (ORCPT ); Sun, 9 Feb 2020 00:54:18 -0500 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Feb 2020 21:54:16 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,420,1574150400"; d="scan'208";a="346819222" Received: from yilinxu-mobl.ccr.corp.intel.com (HELO [10.254.213.207]) ([10.254.213.207]) by fmsmga001.fm.intel.com with ESMTP; 08 Feb 2020 21:54:15 -0800 Subject: Re: warning from domain_get_iommu To: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org References: <20200204200714.u4ezhi6vhqhxog6e@cantor> <20200206174358.shzhieijle5wdshr@cantor> <20200207093413.oy4tclbrb3vqs3vz@cantor> <20200208101952.mrawika2wf4kwt3y@cantor> From: Lu Baolu Message-ID: <3543c012-4912-283f-8945-98d434c1e7a1@linux.intel.com> Date: Sun, 9 Feb 2020 13:54:14 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.4.2 MIME-Version: 1.0 In-Reply-To: <20200208101952.mrawika2wf4kwt3y@cantor> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi, On 2020/2/8 18:19, Jerry Snitselaar wrote: > On Sat Feb 08 20, Lu Baolu wrote: >> Hi Jerry, >> >> On 2020/2/7 17:34, Jerry Snitselaar wrote: >>> On Thu Feb 06 20, Jerry Snitselaar wrote: >>>> On Tue Feb 04 20, Jerry Snitselaar wrote: >>>>> I'm working on getting a system to reproduce this, and verify it >>>>> also occurs >>>>> with 5.5, but I have a report of a case where the kdump kernel gives >>>>> warnings like the following on a hp dl360 gen9: >>>>> >>>>> [    2.830589] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) >>>>> Driver >>>>> [    2.832615] ehci-pci: EHCI PCI platform driver >>>>> [    2.834190] ehci-pci 0000:00:1a.0: EHCI Host Controller >>>>> [    2.835974] ehci-pci 0000:00:1a.0: new USB bus registered, >>>>> assigned bus number 1 >>>>> [    2.838276] ehci-pci 0000:00:1a.0: debug port 2 >>>>> [    2.839700] WARNING: CPU: 0 PID: 1 at >>>>> drivers/iommu/intel-iommu.c:598 domain_get_iommu+0x55/0x60 >>>>> [    2.840671] Modules linked in: >>>>> [    2.840671] CPU: 0 PID: 1 Comm: swapper/0 Not tainted >>>>> 4.18.0-170.el8.kdump2.x86_64 #1 >>>>> [    2.840671] Hardware name: HP ProLiant DL360 Gen9/ProLiant DL360 >>>>> Gen9, BIOS P89 07/21/2019 >>>>> [    2.840671] RIP: 0010:domain_get_iommu+0x55/0x60 >>>>> [    2.840671] Code: c2 01 eb 0b 48 83 c0 01 8b 34 87 85 f6 75 0b >>>>> 48 63 c8 48 39 c2 75 ed 31 c0 c3 48 c1 e1 03 48 8b 05 70 f3 91 01 >>>>> 48 8b 04 08 c3 <0f> 0b 31 c0 c3 31 c9 eb eb 66 90 0f 1f 44 00 00 41 >>>>> 55 40 0f b6 f6 >>>>> [    2.840671] RSP: 0018:ffffc900000dfab8 EFLAGS: 00010202 >>>>> [    2.840671] RAX: ffff88ec7f1c8000 RBX: 0000006c7c867000 RCX: >>>>> 0000000000000000 >>>>> [    2.840671] RDX: 00000000fffffff0 RSI: 0000000000000000 RDI: >>>>> ffff88ec7f1c8000 >>>>> [    2.840671] RBP: ffff88ec6f7000b0 R08: ffff88ec7f19d000 R09: >>>>> ffff88ec7cbfcd00 >>>>> [    2.840671] R10: 0000000000000095 R11: ffffc900000df928 R12: >>>>> 0000000000000000 >>>>> [    2.840671] R13: ffff88ec7f1c8000 R14: 0000000000001000 R15: >>>>> 00000000ffffffff >>>>> [    2.840671] FS:  0000000000000000(0000) >>>>> GS:ffff88ec7f600000(0000) knlGS:0000000000000000 >>>>> [    2.840671] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033 >>>>> [    2.840671] CR2: 00007ff3e1713000 CR3: 0000006c7de0a004 CR4: >>>>> 00000000001606b0 >>>>> [    2.840671] Call Trace: >>>>> [    2.840671]  __intel_map_single+0x62/0x140 >>>>> [    2.840671]  intel_alloc_coherent+0xa6/0x130 >>>>> [    2.840671]  dma_pool_alloc+0xd8/0x1e0 >>>>> [    2.840671]  e_qh_alloc+0x55/0x130 >>>>> [    2.840671]  ehci_setup+0x284/0x7b0 >>>>> [    2.840671]  ehci_pci_setup+0xa3/0x530 >>>>> [    2.840671]  usb_add_hcd+0x2b6/0x800 >>>>> [    2.840671]  usb_hcd_pci_probe+0x375/0x460 >>>>> [    2.840671]  local_pci_probe+0x41/0x90 >>>>> [    2.840671]  pci_device_probe+0x105/0x1b0 >>>>> [    2.840671]  driver_probe_device+0x12d/0x460 >>>>> [    2.840671]  device_driver_attach+0x50/0x60 >>>>> [    2.840671]  __driver_attach+0x61/0x130 >>>>> [    2.840671]  ? device_driver_attach+0x60/0x60 >>>>> [    2.840671]  bus_for_each_dev+0x77/0xc0 >>>>> [    2.840671]  ? klist_add_tail+0x3b/0x70 >>>>> [    2.840671]  bus_add_driver+0x14d/0x1e0 >>>>> [    2.840671]  ? ehci_hcd_init+0xaa/0xaa >>>>> [    2.840671]  ? do_early_param+0x91/0x91 >>>>> [    2.840671]  driver_register+0x6b/0xb0 >>>>> [    2.840671]  ? ehci_hcd_init+0xaa/0xaa >>>>> [    2.840671]  do_one_initcall+0x46/0x1c3 >>>>> [    2.840671]  ? do_early_param+0x91/0x91 >>>>> [    2.840671]  kernel_init_freeable+0x1af/0x258 >>>>> [    2.840671]  ? rest_init+0xaa/0xaa >>>>> [    2.840671]  kernel_init+0xa/0xf9 >>>>> [    2.840671]  ret_from_fork+0x35/0x40 >>>>> [    2.840671] ---[ end trace e87b0d9a1c8135c4 ]--- >>>>> [    3.010848] ehci-pci 0000:00:1a.0: Using iommu dma mapping >>>>> [    3.012551] ehci-pci 0000:00:1a.0: 32bit DMA uses non-identity >>>>> mapping >>>>> [    3.018537] ehci-pci 0000:00:1a.0: cache line size of 64 is not >>>>> supported >>>>> [    3.021188] ehci-pci 0000:00:1a.0: irq 18, io mem 0x93002000 >>>>> [    3.029006] ehci-pci 0000:00:1a.0: USB 2.0 started, EHCI 1.00 >>>>> [    3.030918] usb usb1: New USB device found, idVendor=1d6b, >>>>> idProduct=0002, bcdDevice= 4.18 >>>>> [    3.033491] usb usb1: New USB device strings: Mfr=3, Product=2, >>>>> SerialNumber=1 >>>>> [    3.035900] usb usb1: Product: EHCI Host Controller >>>>> [    3.037423] usb usb1: Manufacturer: Linux >>>>> 4.18.0-170.el8.kdump2.x86_64 ehci_hcd >>>>> [    3.039691] usb usb1: SerialNumber: 0000:00:1a.0 >>>>> >>>>> It looks like the device finishes initializing once it figures out it >>>>> needs dma mapping instead of the default >>>>> passthrough. intel_alloc_coherent calls iommu_need_mapping, before it >>>>> calls __intel_map_single, so I'm not sure why it is tripping over the >>>>> WARN_ON in domain_get_iommu. >>>>> >>>>> one thing I noticed while looking at this is that domain_get_iommu can >>>>> return NULL. So should there be something like the following in >>>>> __intel_map_single after the domain_get_iommu call? >>>>> >>>>> if (!iommu) >>>>>  goto error; >>>>> >>>>> It is possible to deref the null pointer later otherwise. >>>>> >>>>> Regards, >>>>> Jerry >>>> >>>> I reproduced the warning with a 5.5 kernel on an Intel NUC5i5MYBE. >>> >>> Hi Baolu, >>> >>> I think I understand what is happening here. With the kdump boot >>> translation is pre-enabled, so in intel_iommu_add_device things are >>> getting set to DEFER_DEVICE_DOMAIN_INFO. When intel_alloc_coherent >>> calls iommu_need_mapping it returns true, but doesn't do the dma >>> domain switch because of DEFER_DEVICE_DOMAIN_INFO. Then >>> __intel_map_single gets called and it calls deferred_attach_domain, >>> which sets the domain to the group domain, which in this case is the >>> identity domain. Then it calls domain_get_iommu, which spits out the >>> warning because the domain type was dma and returns null. My >>> workaround was to add a call to iommu_need_mapping and find_domain >>> after the deferred_attach_domain, but I don't know if that is the >>> correct solution. There are a couple other spots like intel_map_sg >>> that have the deferred_attach_domain after iommu_need_mapping that >>> possibly will suffer from the same problem. >>> >>> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c >>> index b5c5ab58d395..063f45323cfc 100644 >>> --- a/drivers/iommu/intel-iommu.c >>> +++ b/drivers/iommu/intel-iommu.c >>> @@ -3515,6 +3515,10 @@ static dma_addr_t __intel_map_single(struct >>> device *dev, phys_addr_t paddr, >>>         if (!domain) >>>                 return DMA_MAPPING_ERROR; >>> >>> +       if (!iommu_need_mapping(dev)) >>> +               return paddr; >>> + >>> +       domain = find_domain(dev); >>>         iommu = domain_get_iommu(domain); >>>         size = aligned_nrpages(paddr, size); >>> >>> >>> I finally got a git repo over to one of these systems, and was >>> able to reproduce the issue with the head of linus's tree. With commit >>> 9235cb13d7d1 ("iommu/vt-d: Allow devices with RMRRs to use identity >>> domain") >>> there are more of the warnings, because devices are using identity that >>> weren't before. >>> >> >> Is it possible to move deferred domain attachment to identity_mapping()? >> >> diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c >> index 9dc37672bf89..234ab346198e 100644 >> --- a/drivers/iommu/intel-iommu.c >> +++ b/drivers/iommu/intel-iommu.c >> @@ -2913,13 +2913,11 @@ static int __init si_domain_init(int hw) >> >> static int identity_mapping(struct device *dev) >> { >> -       struct device_domain_info *info; >> +       struct dmar_domain *domain; >> >> -       info = dev->archdata.iommu; >> -       if (info && info != DUMMY_DEVICE_DOMAIN_INFO && info != >> DEFER_DEVICE_DOMAIN_INFO) >> -               return (info->domain == si_domain); >> +       domain = deferred_attach_domain(dev); >> >> -       return 0; >> +       return (!domain || domain_type_is_si(domain)); >> } >> >> static int domain_add_dev_info(struct dmar_domain *domain, struct >> device *dev) >> >> Best regards, >> baolu > > Hi Baolu, > > I think that would work, and then change the deferred_attach_domain > calls in __intel_map_single and intel_map_sg to find_domain? > Yes. > I did a quick test with it on the system where I've been looking at this. > Thanks! Best regards, baolu 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=-5.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,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 EFCCDC35250 for ; Sun, 9 Feb 2020 05:54:22 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (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 9D5602072C for ; Sun, 9 Feb 2020 05:54:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 9D5602072C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linux.intel.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=iommu-bounces@lists.linux-foundation.org Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id 63A1185F6E; Sun, 9 Feb 2020 05:54:22 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id s49mfXcim8sw; Sun, 9 Feb 2020 05:54:20 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by fraxinus.osuosl.org (Postfix) with ESMTP id 0D78285F6A; Sun, 9 Feb 2020 05:54:20 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id EA965C07FE; Sun, 9 Feb 2020 05:54:19 +0000 (UTC) Received: from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137]) by lists.linuxfoundation.org (Postfix) with ESMTP id 08C59C0171 for ; Sun, 9 Feb 2020 05:54:18 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by fraxinus.osuosl.org (Postfix) with ESMTP id E749085F6A for ; Sun, 9 Feb 2020 05:54:17 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from fraxinus.osuosl.org ([127.0.0.1]) by localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id Q5DZFCUjGda4 for ; Sun, 9 Feb 2020 05:54:16 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.7.6 Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by fraxinus.osuosl.org (Postfix) with ESMTPS id B2D2785F63 for ; Sun, 9 Feb 2020 05:54:16 +0000 (UTC) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by fmsmga105.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Feb 2020 21:54:16 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,420,1574150400"; d="scan'208";a="346819222" Received: from yilinxu-mobl.ccr.corp.intel.com (HELO [10.254.213.207]) ([10.254.213.207]) by fmsmga001.fm.intel.com with ESMTP; 08 Feb 2020 21:54:15 -0800 Subject: Re: warning from domain_get_iommu To: iommu@lists.linux-foundation.org, linux-kernel@vger.kernel.org References: <20200204200714.u4ezhi6vhqhxog6e@cantor> <20200206174358.shzhieijle5wdshr@cantor> <20200207093413.oy4tclbrb3vqs3vz@cantor> <20200208101952.mrawika2wf4kwt3y@cantor> From: Lu Baolu Message-ID: <3543c012-4912-283f-8945-98d434c1e7a1@linux.intel.com> Date: Sun, 9 Feb 2020 13:54:14 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.4.2 MIME-Version: 1.0 In-Reply-To: <20200208101952.mrawika2wf4kwt3y@cantor> Content-Language: en-US X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" SGksCgpPbiAyMDIwLzIvOCAxODoxOSwgSmVycnkgU25pdHNlbGFhciB3cm90ZToKPiBPbiBTYXQg RmViIDA4IDIwLCBMdSBCYW9sdSB3cm90ZToKPj4gSGkgSmVycnksCj4+Cj4+IE9uIDIwMjAvMi83 IDE3OjM0LCBKZXJyeSBTbml0c2VsYWFyIHdyb3RlOgo+Pj4gT24gVGh1IEZlYiAwNiAyMCwgSmVy cnkgU25pdHNlbGFhciB3cm90ZToKPj4+PiBPbiBUdWUgRmViIDA0IDIwLCBKZXJyeSBTbml0c2Vs YWFyIHdyb3RlOgo+Pj4+PiBJJ20gd29ya2luZyBvbiBnZXR0aW5nIGEgc3lzdGVtIHRvIHJlcHJv ZHVjZSB0aGlzLCBhbmQgdmVyaWZ5IGl0IAo+Pj4+PiBhbHNvIG9jY3Vycwo+Pj4+PiB3aXRoIDUu NSwgYnV0IEkgaGF2ZSBhIHJlcG9ydCBvZiBhIGNhc2Ugd2hlcmUgdGhlIGtkdW1wIGtlcm5lbCBn aXZlcwo+Pj4+PiB3YXJuaW5ncyBsaWtlIHRoZSBmb2xsb3dpbmcgb24gYSBocCBkbDM2MCBnZW45 Ogo+Pj4+Pgo+Pj4+PiBbwqDCoMKgIDIuODMwNTg5XSBlaGNpX2hjZDogVVNCIDIuMCAnRW5oYW5j ZWQnIEhvc3QgQ29udHJvbGxlciAoRUhDSSkgCj4+Pj4+IERyaXZlcgo+Pj4+PiBbwqDCoMKgIDIu ODMyNjE1XSBlaGNpLXBjaTogRUhDSSBQQ0kgcGxhdGZvcm0gZHJpdmVyCj4+Pj4+IFvCoMKgwqAg Mi44MzQxOTBdIGVoY2ktcGNpIDAwMDA6MDA6MWEuMDogRUhDSSBIb3N0IENvbnRyb2xsZXIKPj4+ Pj4gW8KgwqDCoCAyLjgzNTk3NF0gZWhjaS1wY2kgMDAwMDowMDoxYS4wOiBuZXcgVVNCIGJ1cyBy ZWdpc3RlcmVkLCAKPj4+Pj4gYXNzaWduZWQgYnVzIG51bWJlciAxCj4+Pj4+IFvCoMKgwqAgMi44 MzgyNzZdIGVoY2ktcGNpIDAwMDA6MDA6MWEuMDogZGVidWcgcG9ydCAyCj4+Pj4+IFvCoMKgwqAg Mi44Mzk3MDBdIFdBUk5JTkc6IENQVTogMCBQSUQ6IDEgYXQgCj4+Pj4+IGRyaXZlcnMvaW9tbXUv aW50ZWwtaW9tbXUuYzo1OTggZG9tYWluX2dldF9pb21tdSsweDU1LzB4NjAKPj4+Pj4gW8KgwqDC oCAyLjg0MDY3MV0gTW9kdWxlcyBsaW5rZWQgaW46Cj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdIENQ VTogMCBQSUQ6IDEgQ29tbTogc3dhcHBlci8wIE5vdCB0YWludGVkIAo+Pj4+PiA0LjE4LjAtMTcw LmVsOC5rZHVtcDIueDg2XzY0ICMxCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdIEhhcmR3YXJlIG5h bWU6IEhQIFByb0xpYW50IERMMzYwIEdlbjkvUHJvTGlhbnQgREwzNjAgCj4+Pj4+IEdlbjksIEJJ T1MgUDg5IDA3LzIxLzIwMTkKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV0gUklQOiAwMDEwOmRvbWFp bl9nZXRfaW9tbXUrMHg1NS8weDYwCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdIENvZGU6IGMyIDAx IGViIDBiIDQ4IDgzIGMwIDAxIDhiIDM0IDg3IDg1IGY2IDc1IDBiIAo+Pj4+PiA0OCA2MyBjOCA0 OCAzOSBjMiA3NSBlZCAzMSBjMCBjMyA0OCBjMSBlMSAwMyA0OCA4YiAwNSA3MCBmMyA5MSAwMSAK Pj4+Pj4gNDggOGIgMDQgMDggYzMgPDBmPiAwYiAzMSBjMCBjMyAzMSBjOSBlYiBlYiA2NiA5MCAw ZiAxZiA0NCAwMCAwMCA0MSAKPj4+Pj4gNTUgNDAgMGYgYjYgZjYKPj4+Pj4gW8KgwqDCoCAyLjg0 MDY3MV0gUlNQOiAwMDE4OmZmZmZjOTAwMDAwZGZhYjggRUZMQUdTOiAwMDAxMDIwMgo+Pj4+PiBb wqDCoMKgIDIuODQwNjcxXSBSQVg6IGZmZmY4OGVjN2YxYzgwMDAgUkJYOiAwMDAwMDA2YzdjODY3 MDAwIFJDWDogCj4+Pj4+IDAwMDAwMDAwMDAwMDAwMDAKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV0g UkRYOiAwMDAwMDAwMGZmZmZmZmYwIFJTSTogMDAwMDAwMDAwMDAwMDAwMCBSREk6IAo+Pj4+PiBm ZmZmODhlYzdmMWM4MDAwCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdIFJCUDogZmZmZjg4ZWM2Zjcw MDBiMCBSMDg6IGZmZmY4OGVjN2YxOWQwMDAgUjA5OiAKPj4+Pj4gZmZmZjg4ZWM3Y2JmY2QwMAo+ Pj4+PiBbwqDCoMKgIDIuODQwNjcxXSBSMTA6IDAwMDAwMDAwMDAwMDAwOTUgUjExOiBmZmZmYzkw MDAwMGRmOTI4IFIxMjogCj4+Pj4+IDAwMDAwMDAwMDAwMDAwMDAKPj4+Pj4gW8KgwqDCoCAyLjg0 MDY3MV0gUjEzOiBmZmZmODhlYzdmMWM4MDAwIFIxNDogMDAwMDAwMDAwMDAwMTAwMCBSMTU6IAo+ Pj4+PiAwMDAwMDAwMGZmZmZmZmZmCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdIEZTOsKgIDAwMDAw MDAwMDAwMDAwMDAoMDAwMCkgCj4+Pj4+IEdTOmZmZmY4OGVjN2Y2MDAwMDAoMDAwMCkga25sR1M6 MDAwMDAwMDAwMDAwMDAwMAo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXSBDUzrCoCAwMDEwIERTOiAw MDAwIEVTOiAwMDAwIENSMDogMDAwMDAwMDA4MDA1MDAzMwo+Pj4+PiBbwqDCoMKgIDIuODQwNjcx XSBDUjI6IDAwMDA3ZmYzZTE3MTMwMDAgQ1IzOiAwMDAwMDA2YzdkZTBhMDA0IENSNDogCj4+Pj4+ IDAwMDAwMDAwMDAxNjA2YjAKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV0gQ2FsbCBUcmFjZToKPj4+ Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCBfX2ludGVsX21hcF9zaW5nbGUrMHg2Mi8weDE0MAo+Pj4+ PiBbwqDCoMKgIDIuODQwNjcxXcKgIGludGVsX2FsbG9jX2NvaGVyZW50KzB4YTYvMHgxMzAKPj4+ Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCBkbWFfcG9vbF9hbGxvYysweGQ4LzB4MWUwCj4+Pj4+IFvC oMKgwqAgMi44NDA2NzFdwqAgZV9xaF9hbGxvYysweDU1LzB4MTMwCj4+Pj4+IFvCoMKgwqAgMi44 NDA2NzFdwqAgZWhjaV9zZXR1cCsweDI4NC8weDdiMAo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXcKg IGVoY2lfcGNpX3NldHVwKzB4YTMvMHg1MzAKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCB1c2Jf YWRkX2hjZCsweDJiNi8weDgwMAo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXcKgIHVzYl9oY2RfcGNp X3Byb2JlKzB4Mzc1LzB4NDYwCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdwqAgbG9jYWxfcGNpX3By b2JlKzB4NDEvMHg5MAo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXcKgIHBjaV9kZXZpY2VfcHJvYmUr MHgxMDUvMHgxYjAKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCBkcml2ZXJfcHJvYmVfZGV2aWNl KzB4MTJkLzB4NDYwCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdwqAgZGV2aWNlX2RyaXZlcl9hdHRh Y2grMHg1MC8weDYwCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdwqAgX19kcml2ZXJfYXR0YWNoKzB4 NjEvMHgxMzAKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCA/IGRldmljZV9kcml2ZXJfYXR0YWNo KzB4NjAvMHg2MAo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXcKgIGJ1c19mb3JfZWFjaF9kZXYrMHg3 Ny8weGMwCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdwqAgPyBrbGlzdF9hZGRfdGFpbCsweDNiLzB4 NzAKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCBidXNfYWRkX2RyaXZlcisweDE0ZC8weDFlMAo+ Pj4+PiBbwqDCoMKgIDIuODQwNjcxXcKgID8gZWhjaV9oY2RfaW5pdCsweGFhLzB4YWEKPj4+Pj4g W8KgwqDCoCAyLjg0MDY3MV3CoCA/IGRvX2Vhcmx5X3BhcmFtKzB4OTEvMHg5MQo+Pj4+PiBbwqDC oMKgIDIuODQwNjcxXcKgIGRyaXZlcl9yZWdpc3RlcisweDZiLzB4YjAKPj4+Pj4gW8KgwqDCoCAy Ljg0MDY3MV3CoCA/IGVoY2lfaGNkX2luaXQrMHhhYS8weGFhCj4+Pj4+IFvCoMKgwqAgMi44NDA2 NzFdwqAgZG9fb25lX2luaXRjYWxsKzB4NDYvMHgxYzMKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV3C oCA/IGRvX2Vhcmx5X3BhcmFtKzB4OTEvMHg5MQo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXcKgIGtl cm5lbF9pbml0X2ZyZWVhYmxlKzB4MWFmLzB4MjU4Cj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdwqAg PyByZXN0X2luaXQrMHhhYS8weGFhCj4+Pj4+IFvCoMKgwqAgMi44NDA2NzFdwqAga2VybmVsX2lu aXQrMHhhLzB4ZjkKPj4+Pj4gW8KgwqDCoCAyLjg0MDY3MV3CoCByZXRfZnJvbV9mb3JrKzB4MzUv MHg0MAo+Pj4+PiBbwqDCoMKgIDIuODQwNjcxXSAtLS1bIGVuZCB0cmFjZSBlODdiMGQ5YTFjODEz NWM0IF0tLS0KPj4+Pj4gW8KgwqDCoCAzLjAxMDg0OF0gZWhjaS1wY2kgMDAwMDowMDoxYS4wOiBV c2luZyBpb21tdSBkbWEgbWFwcGluZwo+Pj4+PiBbwqDCoMKgIDMuMDEyNTUxXSBlaGNpLXBjaSAw MDAwOjAwOjFhLjA6IDMyYml0IERNQSB1c2VzIG5vbi1pZGVudGl0eSAKPj4+Pj4gbWFwcGluZwo+ Pj4+PiBbwqDCoMKgIDMuMDE4NTM3XSBlaGNpLXBjaSAwMDAwOjAwOjFhLjA6IGNhY2hlIGxpbmUg c2l6ZSBvZiA2NCBpcyBub3QgCj4+Pj4+IHN1cHBvcnRlZAo+Pj4+PiBbwqDCoMKgIDMuMDIxMTg4 XSBlaGNpLXBjaSAwMDAwOjAwOjFhLjA6IGlycSAxOCwgaW8gbWVtIDB4OTMwMDIwMDAKPj4+Pj4g W8KgwqDCoCAzLjAyOTAwNl0gZWhjaS1wY2kgMDAwMDowMDoxYS4wOiBVU0IgMi4wIHN0YXJ0ZWQs IEVIQ0kgMS4wMAo+Pj4+PiBbwqDCoMKgIDMuMDMwOTE4XSB1c2IgdXNiMTogTmV3IFVTQiBkZXZp Y2UgZm91bmQsIGlkVmVuZG9yPTFkNmIsIAo+Pj4+PiBpZFByb2R1Y3Q9MDAwMiwgYmNkRGV2aWNl PSA0LjE4Cj4+Pj4+IFvCoMKgwqAgMy4wMzM0OTFdIHVzYiB1c2IxOiBOZXcgVVNCIGRldmljZSBz dHJpbmdzOiBNZnI9MywgUHJvZHVjdD0yLCAKPj4+Pj4gU2VyaWFsTnVtYmVyPTEKPj4+Pj4gW8Kg wqDCoCAzLjAzNTkwMF0gdXNiIHVzYjE6IFByb2R1Y3Q6IEVIQ0kgSG9zdCBDb250cm9sbGVyCj4+ Pj4+IFvCoMKgwqAgMy4wMzc0MjNdIHVzYiB1c2IxOiBNYW51ZmFjdHVyZXI6IExpbnV4IAo+Pj4+ PiA0LjE4LjAtMTcwLmVsOC5rZHVtcDIueDg2XzY0IGVoY2lfaGNkCj4+Pj4+IFvCoMKgwqAgMy4w Mzk2OTFdIHVzYiB1c2IxOiBTZXJpYWxOdW1iZXI6IDAwMDA6MDA6MWEuMAo+Pj4+Pgo+Pj4+PiBJ dCBsb29rcyBsaWtlIHRoZSBkZXZpY2UgZmluaXNoZXMgaW5pdGlhbGl6aW5nIG9uY2UgaXQgZmln dXJlcyBvdXQgaXQKPj4+Pj4gbmVlZHMgZG1hIG1hcHBpbmcgaW5zdGVhZCBvZiB0aGUgZGVmYXVs dAo+Pj4+PiBwYXNzdGhyb3VnaC4gaW50ZWxfYWxsb2NfY29oZXJlbnQgY2FsbHMgaW9tbXVfbmVl ZF9tYXBwaW5nLCBiZWZvcmUgaXQKPj4+Pj4gY2FsbHMgX19pbnRlbF9tYXBfc2luZ2xlLCBzbyBJ J20gbm90IHN1cmUgd2h5IGl0IGlzIHRyaXBwaW5nIG92ZXIgdGhlCj4+Pj4+IFdBUk5fT04gaW4g ZG9tYWluX2dldF9pb21tdS4KPj4+Pj4KPj4+Pj4gb25lIHRoaW5nIEkgbm90aWNlZCB3aGlsZSBs b29raW5nIGF0IHRoaXMgaXMgdGhhdCBkb21haW5fZ2V0X2lvbW11IGNhbgo+Pj4+PiByZXR1cm4g TlVMTC4gU28gc2hvdWxkIHRoZXJlIGJlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgaW4K Pj4+Pj4gX19pbnRlbF9tYXBfc2luZ2xlIGFmdGVyIHRoZSBkb21haW5fZ2V0X2lvbW11IGNhbGw/ Cj4+Pj4+Cj4+Pj4+IGlmICghaW9tbXUpCj4+Pj4+IMKgZ290byBlcnJvcjsKPj4+Pj4KPj4+Pj4g SXQgaXMgcG9zc2libGUgdG8gZGVyZWYgdGhlIG51bGwgcG9pbnRlciBsYXRlciBvdGhlcndpc2Uu Cj4+Pj4+Cj4+Pj4+IFJlZ2FyZHMsCj4+Pj4+IEplcnJ5Cj4+Pj4KPj4+PiBJIHJlcHJvZHVjZWQg dGhlIHdhcm5pbmcgd2l0aCBhIDUuNSBrZXJuZWwgb24gYW4gSW50ZWwgTlVDNWk1TVlCRS4KPj4+ Cj4+PiBIaSBCYW9sdSwKPj4+Cj4+PiBJIHRoaW5rIEkgdW5kZXJzdGFuZCB3aGF0IGlzIGhhcHBl bmluZyBoZXJlLiBXaXRoIHRoZSBrZHVtcCBib290Cj4+PiB0cmFuc2xhdGlvbiBpcyBwcmUtZW5h YmxlZCwgc28gaW4gaW50ZWxfaW9tbXVfYWRkX2RldmljZSB0aGluZ3MgYXJlCj4+PiBnZXR0aW5n IHNldCB0byBERUZFUl9ERVZJQ0VfRE9NQUlOX0lORk8uIFdoZW4gaW50ZWxfYWxsb2NfY29oZXJl bnQKPj4+IGNhbGxzIGlvbW11X25lZWRfbWFwcGluZyBpdCByZXR1cm5zIHRydWUsIGJ1dCBkb2Vz bid0IGRvIHRoZSBkbWEKPj4+IGRvbWFpbiBzd2l0Y2ggYmVjYXVzZSBvZiBERUZFUl9ERVZJQ0Vf RE9NQUlOX0lORk8uIFRoZW4KPj4+IF9faW50ZWxfbWFwX3NpbmdsZSBnZXRzIGNhbGxlZCBhbmQg aXQgY2FsbHMgZGVmZXJyZWRfYXR0YWNoX2RvbWFpbiwKPj4+IHdoaWNoIHNldHMgdGhlIGRvbWFp biB0byB0aGUgZ3JvdXAgZG9tYWluLCB3aGljaCBpbiB0aGlzIGNhc2UgaXMgdGhlCj4+PiBpZGVu dGl0eSBkb21haW4uIFRoZW4gaXQgY2FsbHMgZG9tYWluX2dldF9pb21tdSwgd2hpY2ggc3BpdHMg b3V0IHRoZQo+Pj4gd2FybmluZyBiZWNhdXNlIHRoZSBkb21haW4gdHlwZSB3YXMgZG1hIGFuZCBy ZXR1cm5zIG51bGwuIE15Cj4+PiB3b3JrYXJvdW5kIHdhcyB0byBhZGQgYSBjYWxsIHRvIGlvbW11 X25lZWRfbWFwcGluZyBhbmQgZmluZF9kb21haW4KPj4+IGFmdGVyIHRoZSBkZWZlcnJlZF9hdHRh Y2hfZG9tYWluLCBidXQgSSBkb24ndCBrbm93IGlmIHRoYXQgaXMgdGhlCj4+PiBjb3JyZWN0IHNv bHV0aW9uLiBUaGVyZSBhcmUgYSBjb3VwbGUgb3RoZXIgc3BvdHMgbGlrZSBpbnRlbF9tYXBfc2cK Pj4+IHRoYXQgaGF2ZSB0aGUgZGVmZXJyZWRfYXR0YWNoX2RvbWFpbiBhZnRlciBpb21tdV9uZWVk X21hcHBpbmcgdGhhdAo+Pj4gcG9zc2libHkgd2lsbCBzdWZmZXIgZnJvbSB0aGUgc2FtZSBwcm9i bGVtLgo+Pj4KPj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMgYi9k cml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKPj4+IGluZGV4IGI1YzVhYjU4ZDM5NS4uMDYzZjQ1 MzIzY2ZjIDEwMDY0NAo+Pj4gLS0tIGEvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCj4+PiAr KysgYi9kcml2ZXJzL2lvbW11L2ludGVsLWlvbW11LmMKPj4+IEBAIC0zNTE1LDYgKzM1MTUsMTAg QEAgc3RhdGljIGRtYV9hZGRyX3QgX19pbnRlbF9tYXBfc2luZ2xlKHN0cnVjdCAKPj4+IGRldmlj ZSAqZGV2LCBwaHlzX2FkZHJfdCBwYWRkciwKPj4+IMKgwqDCoMKgwqDCoMKgIGlmICghZG9tYWlu KQo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiBETUFfTUFQUElOR19F UlJPUjsKPj4+Cj4+PiArwqDCoMKgwqDCoMKgIGlmICghaW9tbXVfbmVlZF9tYXBwaW5nKGRldikp Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm4gcGFkZHI7Cj4+PiArCj4+ PiArwqDCoMKgwqDCoMKgIGRvbWFpbiA9IGZpbmRfZG9tYWluKGRldik7Cj4+PiDCoMKgwqDCoMKg wqDCoCBpb21tdSA9IGRvbWFpbl9nZXRfaW9tbXUoZG9tYWluKTsKPj4+IMKgwqDCoMKgwqDCoMKg IHNpemUgPSBhbGlnbmVkX25ycGFnZXMocGFkZHIsIHNpemUpOwo+Pj4KPj4+Cj4+PiBJIGZpbmFs bHkgZ290IGEgZ2l0IHJlcG8gb3ZlciB0byBvbmUgb2YgdGhlc2Ugc3lzdGVtcywgYW5kIHdhcwo+ Pj4gYWJsZSB0byByZXByb2R1Y2UgdGhlIGlzc3VlIHdpdGggdGhlIGhlYWQgb2YgbGludXMncyB0 cmVlLiBXaXRoIGNvbW1pdAo+Pj4gOTIzNWNiMTNkN2QxICgiaW9tbXUvdnQtZDogQWxsb3cgZGV2 aWNlcyB3aXRoIFJNUlJzIHRvIHVzZSBpZGVudGl0eSAKPj4+IGRvbWFpbiIpCj4+PiB0aGVyZSBh cmUgbW9yZSBvZiB0aGUgd2FybmluZ3MsIGJlY2F1c2UgZGV2aWNlcyBhcmUgdXNpbmcgaWRlbnRp dHkgdGhhdAo+Pj4gd2VyZW4ndCBiZWZvcmUuCj4+Pgo+Pgo+PiBJcyBpdCBwb3NzaWJsZSB0byBt b3ZlIGRlZmVycmVkIGRvbWFpbiBhdHRhY2htZW50IHRvIGlkZW50aXR5X21hcHBpbmcoKT8KPj4K Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvaW50ZWwtaW9tbXUuYyBiL2RyaXZlcnMvaW9t bXUvaW50ZWwtaW9tbXUuYwo+PiBpbmRleCA5ZGMzNzY3MmJmODkuLjIzNGFiMzQ2MTk4ZSAxMDA2 NDQKPj4gLS0tIGEvZHJpdmVycy9pb21tdS9pbnRlbC1pb21tdS5jCj4+ICsrKyBiL2RyaXZlcnMv aW9tbXUvaW50ZWwtaW9tbXUuYwo+PiBAQCAtMjkxMywxMyArMjkxMywxMSBAQCBzdGF0aWMgaW50 IF9faW5pdCBzaV9kb21haW5faW5pdChpbnQgaHcpCj4+Cj4+IHN0YXRpYyBpbnQgaWRlbnRpdHlf bWFwcGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+IHsKPj4gLcKgwqDCoMKgwqDCoCBzdHJ1Y3Qg ZGV2aWNlX2RvbWFpbl9pbmZvICppbmZvOwo+PiArwqDCoMKgwqDCoMKgIHN0cnVjdCBkbWFyX2Rv bWFpbiAqZG9tYWluOwo+Pgo+PiAtwqDCoMKgwqDCoMKgIGluZm8gPSBkZXYtPmFyY2hkYXRhLmlv bW11Owo+PiAtwqDCoMKgwqDCoMKgIGlmIChpbmZvICYmIGluZm8gIT0gRFVNTVlfREVWSUNFX0RP TUFJTl9JTkZPICYmIGluZm8gIT0gCj4+IERFRkVSX0RFVklDRV9ET01BSU5fSU5GTykKPj4gLcKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIChpbmZvLT5kb21haW4gPT0gc2lfZG9t YWluKTsKPj4gK8KgwqDCoMKgwqDCoCBkb21haW4gPSBkZWZlcnJlZF9hdHRhY2hfZG9tYWluKGRl dik7Cj4+Cj4+IC3CoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4+ICvCoMKgwqDCoMKgwqAgcmV0dXJu ICghZG9tYWluIHx8IGRvbWFpbl90eXBlX2lzX3NpKGRvbWFpbikpOwo+PiB9Cj4+Cj4+IHN0YXRp YyBpbnQgZG9tYWluX2FkZF9kZXZfaW5mbyhzdHJ1Y3QgZG1hcl9kb21haW4gKmRvbWFpbiwgc3Ry dWN0IAo+PiBkZXZpY2UgKmRldikKPj4KPj4gQmVzdCByZWdhcmRzLAo+PiBiYW9sdQo+IAo+IEhp IEJhb2x1LAo+IAo+IEkgdGhpbmsgdGhhdCB3b3VsZCB3b3JrLCBhbmQgdGhlbiBjaGFuZ2UgdGhl IGRlZmVycmVkX2F0dGFjaF9kb21haW4KPiBjYWxscyBpbiBfX2ludGVsX21hcF9zaW5nbGUgYW5k IGludGVsX21hcF9zZyB0byBmaW5kX2RvbWFpbj8KPiAKClllcy4KCj4gSSBkaWQgYSBxdWljayB0 ZXN0IHdpdGggaXQgb24gdGhlIHN5c3RlbSB3aGVyZSBJJ3ZlIGJlZW4gbG9va2luZyBhdCB0aGlz Lgo+IAoKVGhhbmtzIQoKQmVzdCByZWdhcmRzLApiYW9sdQpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwppb21tdSBtYWlsaW5nIGxpc3QKaW9tbXVAbGlzdHMu bGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21h aWxtYW4vbGlzdGluZm8vaW9tbXU=