From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF1332F2C for ; Fri, 10 Mar 2023 08:41:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678437672; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sJKDeaVvGNYM0/OBvIPM+hWXGH8vO4WQMCZIenqufGw=; b=fhA9HOGUXTwYaD6nU9TMFNWrHrQhzF6eM5UXrvaVHLbW8e5roMfFa1A+aeiY6wXFUG1lrI OLj4f6+246kDuM07dsoyaDpDbrYbWaGOzU5lcYq7CUjRkc4yB4qz7gLaidlYaznV7x+IBd hkRRPQzLQPTMjMm4NauQFSIYZhByT2Q= Received: from mail-qk1-f197.google.com (mail-qk1-f197.google.com [209.85.222.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-104-mPOBFQhqNRW2QbGazwrdvQ-1; Fri, 10 Mar 2023 03:41:11 -0500 X-MC-Unique: mPOBFQhqNRW2QbGazwrdvQ-1 Received: by mail-qk1-f197.google.com with SMTP id d10-20020a05620a240a00b0073baf1de8ebso2682980qkn.19 for ; Fri, 10 Mar 2023 00:41:11 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678437666; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=sJKDeaVvGNYM0/OBvIPM+hWXGH8vO4WQMCZIenqufGw=; b=tE+/DwkQkUhMCuZ2qrTqa/DBQErwInbrT+gES2wKqky2XddPy/+khtUR/kQePu0j5e vd/ORrt0JaEWjkUMsOBbezNCGt+f19vhlWQDrrcNVk3EwOGDeBDKyT2teVCrlJzs8UyE zHX2jE0oPVb50LaNVJcTofQQBqvs46XSJkmWHeJJESTYDWTubqi4tBTRqhtoZJCx7uRI st+Q7z5sePiIpQuhB1/zquROGFe6ET/ZchMbJgbsnnFyLcXEQP7JruKg7cHvdB/1U5Y1 pihgHyyqsG54R69NOW4AMsSAVWAKsRnmrwihQ3POi9u3sCyMVURDkcC0GBwL/GbUa/Lj gYZQ== X-Gm-Message-State: AO0yUKXAzezxLyqR4NCZn+WYBY0BCDHktvbHOPXi4NqxpYdQSDoaCm/r +s6S06h95XziwN/MfgGev3UJLY5laelAtvnJbJ2WdAP82fuBXOx89WVfQUbMLB6A6VMVgOTfWDU JZ05cyPeqCmEGtj8= X-Received: by 2002:a05:622a:13ce:b0:3bd:155c:3ac8 with SMTP id p14-20020a05622a13ce00b003bd155c3ac8mr7701714qtk.67.1678437666318; Fri, 10 Mar 2023 00:41:06 -0800 (PST) X-Google-Smtp-Source: AK7set8h9oMj1wekRX/xF2bEqHa9Ccq96u/Lgbi5xXTL/325tGX/oS2wL654uUNa4ebzaEO9jMnGZA== X-Received: by 2002:a05:622a:13ce:b0:3bd:155c:3ac8 with SMTP id p14-20020a05622a13ce00b003bd155c3ac8mr7701700qtk.67.1678437666036; Fri, 10 Mar 2023 00:41:06 -0800 (PST) Received: from ?IPV6:2a01:e0a:59e:9d80:527b:9dff:feef:3874? ([2a01:e0a:59e:9d80:527b:9dff:feef:3874]) by smtp.gmail.com with ESMTPSA id t14-20020ac865ce000000b003bfbfd9a4aesm990030qto.56.2023.03.10.00.41.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 10 Mar 2023 00:41:05 -0800 (PST) Message-ID: <4938b20b-14d8-86f8-e80b-9d8ed9d8f28d@redhat.com> Date: Fri, 10 Mar 2023 09:41:01 +0100 Precedence: bulk X-Mailing-List: iommu@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.5.0 Reply-To: eric.auger@redhat.com Subject: Re: [PATCH v1 01/14] iommu: Add iommu_get_unmanaged_domain helper To: Robin Murphy , Nicolin Chen , jgg@nvidia.com, will@kernel.org Cc: kevin.tian@intel.com, baolu.lu@linux.intel.com, joro@8bytes.org, shameerali.kolothum.thodi@huawei.com, jean-philippe@linaro.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org References: <9b1077601cace998533129327f5e7ad946752d29.1678348754.git.nicolinc@nvidia.com> <2118a147-ac95-d846-ad6f-85d7cebca46a@arm.com> From: Eric Auger In-Reply-To: <2118a147-ac95-d846-ad6f-85d7cebca46a@arm.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Hi, On 3/9/23 13:51, Robin Murphy wrote: > On 2023-03-09 10:53, Nicolin Chen wrote: >> The nature of ITS virtualization on ARM is done via hypercalls, so >> kernel >> handles all IOVA mappings for the MSI doorbell in >> iommu_dma_prepare_msi() >> and iommu_dma_compose_msi_msg(). The current virtualization solution >> with >> a 2-stage nested translation setup is to do 1:1 IOVA mappings at stage-1 >> guest-level IO page table via a RMR region in guest-level IORT, aligning >> with an IOVA region that's predefined and mapped in the host kernel: >> >>    [stage-2 host level] >>    #define MSI_IOVA_BASE        0x8000000 >>    #define MSI_IOVA_LENGTH    0x100000 >>    ... >>    iommu_get_msi_cookie(): >>     cookie->msi_iova = MSI_IOVA_BASE; >>    ... >>    iommu_dma_prepare_msi(its_pa): >>     domain = iommu_get_domain_for_dev(dev); >>     iommu_dma_get_msi_page(its_pa, domain): >>         cookie = domain->iova_cookie; >>         iova = iommu_dma_alloc_iova(): >>             return cookie->msi_iova - size; >>         iommu_map(iova, its_pa, ...); >> >>    [stage-1 guest level] >>    // Define in IORT a RMR [MSI_IOVA_BASE, MSI_IOVA_LENGTH] >>    ... >>    iommu_create_device_direct_mappings(): >>     iommu_map(iova=MSI_IOVA_BASE, pa=MSI_IOVA_BASE, >> len=MSI_IOVA_LENGTH); >> >> This solution calling iommu_get_domain_for_dev() needs the device to get >> attached to a host-level iommu_domain that has the msi_cookie. >> >> On the other hand, IOMMUFD designs two iommu_domain objects to represent >> the two stages: a stage-1 domain (IOMMU_DOMAIN_NESTED type) and a >> stage-2 >> domain (IOMMU_DOMAIN_UNMANAGED type). In this design, the device will be >> attached to the stage-1 domain representing a guest-level IO page table, >> or a Context Descriptor Table in SMMU's term. >> >> This is obviously a mismatch, as the iommu_get_domain_for_dev() does not >> return the correct domain pointer in iommu_dma_prepare_msi(). >> >> Add an iommu_get_unmanaged_domain helper to allow drivers to return the >> correct IOMMU_DOMAIN_UNMANAGED iommu_domain having the IOVA mappings for >> the msi_cookie. Keep it in the iommu-priv header for internal use only. >> >> Suggested-by: Jason Gunthorpe >> Signed-off-by: Nicolin Chen >> --- >>   drivers/iommu/dma-iommu.c  |  5 +++-- >>   drivers/iommu/iommu-priv.h | 15 +++++++++++++++ >>   include/linux/iommu.h      |  2 ++ >>   3 files changed, 20 insertions(+), 2 deletions(-) >> >> diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c >> index 99b2646cb5c7..6b0409d0ff85 100644 >> --- a/drivers/iommu/dma-iommu.c >> +++ b/drivers/iommu/dma-iommu.c >> @@ -31,6 +31,7 @@ >>   #include >>     #include "dma-iommu.h" >> +#include "iommu-priv.h" >>     struct iommu_dma_msi_page { >>       struct list_head    list; >> @@ -1652,7 +1653,7 @@ static struct iommu_dma_msi_page >> *iommu_dma_get_msi_page(struct device *dev, >>   int iommu_dma_prepare_msi(struct msi_desc *desc, phys_addr_t msi_addr) >>   { >>       struct device *dev = msi_desc_to_dev(desc); >> -    struct iommu_domain *domain = iommu_get_domain_for_dev(dev); >> +    struct iommu_domain *domain = iommu_get_unmanaged_domain(dev); > > This still doesn't make sense - most of the time this will be expected > to return the default DMA/identity domain if that's what the device is > currently using. We can't know whether the current domain is managed > or not until we look at it. I tend to agree with Robin here. This was first introduced by [PATCH v7 21/22] iommu/dma: Add support for mapping MSIs https://lore.kernel.org/all/2273af20d844bd618c6a90b57e639700328ebf7f.1473695704.git.robin.murphy@arm.com/ even before the support un VFIO use case which came later on. So using the "unmanaged" terminology sounds improper to me, at least. Couldn't we use a parent/child terminology as used in the past in [RFC v2] /dev/iommu uAPI proposal This would still hold for the former use case. Thanks Eric > > Just like every other caller of iommu_get_domain_for_dev(), what we > want here is the current kernel-owned domain that we can inspect and > maybe do standard IOMMU API things with. Why can't > iommu_get_domain_for_dev() simply maintain that established usage > model and return the kernel-owned s2_domain from a nested domain > automatically? No IOMMU API user expects or needs it to return > anything else (and IOMMUFD should certainly not be losing track of a > nested domain within its own higher-level abstractions and needing to > fall back on iommu_get_domain_for_dev()), so I really don't see a > valid reason to overcomplicate things. > > Please note I stress "valid" since I'm not buying arbitrarily made-up > conceptual purity arguments. A nested domain cannot be the "one true > domain" that is an opaque combination of S1+S2; the IOMMU API view has > to be more like the device is attached to both the nested domain and > the parent stage 2 domain somewhat in parallel. Even when nesting is > active, the S2 domain still exists as a domain in its own right, and > still needs to be visible and operated on as such, for instance if > memory is hotplugged in or out of the VM. > > TBH I'd also move the s2_domain pointer into the iommu_domain itself, > since it's going to be a common feature for all nesting > implementations, thus there seems little need to indirect lookups > through the drivers at all. > > Thanks, > Robin. > >>       struct iommu_dma_msi_page *msi_page; >>       static DEFINE_MUTEX(msi_prepare_lock); /* see below */ >>   @@ -1685,7 +1686,7 @@ int iommu_dma_prepare_msi(struct msi_desc >> *desc, phys_addr_t msi_addr) >>   void iommu_dma_compose_msi_msg(struct msi_desc *desc, struct >> msi_msg *msg) >>   { >>       struct device *dev = msi_desc_to_dev(desc); >> -    const struct iommu_domain *domain = iommu_get_domain_for_dev(dev); >> +    const struct iommu_domain *domain = >> iommu_get_unmanaged_domain(dev); >>       const struct iommu_dma_msi_page *msi_page; >>         msi_page = msi_desc_get_iommu_cookie(desc); >> diff --git a/drivers/iommu/iommu-priv.h b/drivers/iommu/iommu-priv.h >> index a6e694f59f64..da8044da9ad8 100644 >> --- a/drivers/iommu/iommu-priv.h >> +++ b/drivers/iommu/iommu-priv.h >> @@ -15,6 +15,21 @@ static inline const struct iommu_ops >> *dev_iommu_ops(struct device *dev) >>       return dev->iommu->iommu_dev->ops; >>   } >>   +static inline struct iommu_domain >> *iommu_get_unmanaged_domain(struct device *dev) >> +{ >> +    const struct iommu_ops *ops; >> + >> +    if (!dev->iommu || !dev->iommu->iommu_dev) >> +        goto attached_domain; >> + >> +    ops = dev_iommu_ops(dev); >> +    if (ops->get_unmanaged_domain) >> +        return ops->get_unmanaged_domain(dev); >> + >> +attached_domain: >> +    return iommu_get_domain_for_dev(dev); >> +} >> + >>   int iommu_group_replace_domain(struct iommu_group *group, >>                      struct iommu_domain *new_domain); >>   diff --git a/include/linux/iommu.h b/include/linux/iommu.h >> index 080278c8154d..76c65cc4fc15 100644 >> --- a/include/linux/iommu.h >> +++ b/include/linux/iommu.h >> @@ -275,6 +275,8 @@ struct iommu_ops { >>                             struct iommu_domain *parent, >>                             const void *user_data); >>   +    struct iommu_domain *(*get_unmanaged_domain)(struct device *dev); >> + >>       struct iommu_device *(*probe_device)(struct device *dev); >>       void (*release_device)(struct device *dev); >>       void (*probe_finalize)(struct device *dev); > 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 935DEC64EC4 for ; Fri, 10 Mar 2023 08:44:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:Reply-To:List-Subscribe:List-Help: List-Post:List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References: Cc:To:Subject:MIME-Version:Date:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=TA8QPay3Xote0XagMdX0wcuaV0LbHoh4aUvT5VTctjY=; b=axVHhr2STcBX3k G0PLWGyu2N2VGDVVlRddBD4q/w30k6iOtbYkE228GV8RI6bUrtdOq1HG46ZV/8G3Pv8035BT4EAih dcR+Ri66HFrwyCATxRMyR4yHMeZNv49yy1RLf0dKz+RuniA4IHHBJn40AseqKeg64nbZ85uPlxvR3 vE+AwJAoihiQC3Z66I1rEqylJ7XJ4/5aiVCYKqhLfq7P0YlyNOw/Mh6HBA9I9O5U8+V1QIGm/HhHc k4yBEgW7oU3lInB8eSkZxREMKe3+LVZ8KJSTNgPHLPsOdL0hIAWClKN4T1PXdk0ge4AUisVKfr0fy +a2sMYjT5zVn0kGrRgKg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1paYLF-00Djqc-Me; Fri, 10 Mar 2023 08:43:10 +0000 Received: from us-smtp-delivery-124.mimecast.com ([170.10.133.124]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1paYL9-00Djob-O2 for linux-arm-kernel@lists.infradead.org; Fri, 10 Mar 2023 08:43:06 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1678437781; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sJKDeaVvGNYM0/OBvIPM+hWXGH8vO4WQMCZIenqufGw=; b=IRfRHShSHlIIgkuv22mNw9th0BfY20+1H3xDoO8JT/p3uhSyslBrNaPOrE8YecpKxaUF8a do0o0gLAgg5QlKPZUNKW1LP0Rqbyhqebb6tBDB/8VxfthkKSsc/5iKKT+w1pb+0YEt1fQx gOIaP+VsryfA5+k4p35ceyTRnk46w9g= Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-528-gKw_cqcUPeirkGIkXA5XMA-1; Fri, 10 Mar 2023 03:41:10 -0500 X-MC-Unique: gKw_cqcUPeirkGIkXA5XMA-1 Received: by mail-qt1-f197.google.com with SMTP id w16-20020ac843d0000000b003bfe50a4105so2549933qtn.10 for ; Fri, 10 Mar 2023 00:41:10 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1678437666; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:reply-to:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=sJKDeaVvGNYM0/OBvIPM+hWXGH8vO4WQMCZIenqufGw=; b=E79xH7teZg1o3mo4ZDxYZZQ7HVsmhRSapissNpATvOw56rKFaa+TYojrfTIWblhBQa g96xI9M84YktmBw9BeacGQoyUfAREum5K/8RKxtEEgaq/Y6eHhrIObszx/2BHP9ciVsG m+upbrtXmuu1AihvYLH/Mag6MatTGE1s0jAcdjl3X5UBJCFLbn6vMpFJcPTBDLmhqVWc SjnkMVivT6fxQKRuqU1Td8T3cYv4Y5D5dIvO3VvMyaLKFWoeTBHdlnTmua1+aMWOk38b bQQ1UqVsjam3x8ZURvX8SknBu6IbbiK+AhKt4qX/lOhMu223aeLoYeWWzpE53ZEaj0LZ TTkg== X-Gm-Message-State: AO0yUKVxyMK6uC6Yh/FLteZ1sV6MzJ72J/fSiRcLMqrNlf6JbO905ksA ykMyWYkLTfUJ4Olt/QmsVuR34hl8euo1x4mFr08MY6iKChawH7gXj1CgsiZdVGzHXLRZ2NEQp/D Pa69Su6P2HiSA5rnlRHXPVaXVEKocVvV1Hj4= X-Received: by 2002:a05:622a:13ce:b0:3bd:155c:3ac8 with SMTP id p14-20020a05622a13ce00b003bd155c3ac8mr7701715qtk.67.1678437666319; Fri, 10 Mar 2023 00:41:06 -0800 (PST) X-Google-Smtp-Source: AK7set8h9oMj1wekRX/xF2bEqHa9Ccq96u/Lgbi5xXTL/325tGX/oS2wL654uUNa4ebzaEO9jMnGZA== X-Received: by 2002:a05:622a:13ce:b0:3bd:155c:3ac8 with SMTP id p14-20020a05622a13ce00b003bd155c3ac8mr7701700qtk.67.1678437666036; Fri, 10 Mar 2023 00:41:06 -0800 (PST) Received: from ?IPV6:2a01:e0a:59e:9d80:527b:9dff:feef:3874? ([2a01:e0a:59e:9d80:527b:9dff:feef:3874]) by smtp.gmail.com with ESMTPSA id t14-20020ac865ce000000b003bfbfd9a4aesm990030qto.56.2023.03.10.00.41.03 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 10 Mar 2023 00:41:05 -0800 (PST) Message-ID: <4938b20b-14d8-86f8-e80b-9d8ed9d8f28d@redhat.com> Date: Fri, 10 Mar 2023 09:41:01 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.5.0 Subject: Re: [PATCH v1 01/14] iommu: Add iommu_get_unmanaged_domain helper To: Robin Murphy , Nicolin Chen , jgg@nvidia.com, will@kernel.org Cc: kevin.tian@intel.com, baolu.lu@linux.intel.com, joro@8bytes.org, shameerali.kolothum.thodi@huawei.com, jean-philippe@linaro.org, linux-arm-kernel@lists.infradead.org, iommu@lists.linux.dev, linux-kernel@vger.kernel.org References: <9b1077601cace998533129327f5e7ad946752d29.1678348754.git.nicolinc@nvidia.com> <2118a147-ac95-d846-ad6f-85d7cebca46a@arm.com> From: Eric Auger In-Reply-To: <2118a147-ac95-d846-ad6f-85d7cebca46a@arm.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230310_004303_917416_94315D2C X-CRM114-Status: GOOD ( 38.62 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: eric.auger@redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGksCgpPbiAzLzkvMjMgMTM6NTEsIFJvYmluIE11cnBoeSB3cm90ZToKPiBPbiAyMDIzLTAzLTA5 IDEwOjUzLCBOaWNvbGluIENoZW4gd3JvdGU6Cj4+IFRoZSBuYXR1cmUgb2YgSVRTIHZpcnR1YWxp emF0aW9uIG9uIEFSTSBpcyBkb25lIHZpYSBoeXBlcmNhbGxzLCBzbwo+PiBrZXJuZWwKPj4gaGFu ZGxlcyBhbGwgSU9WQSBtYXBwaW5ncyBmb3IgdGhlIE1TSSBkb29yYmVsbCBpbgo+PiBpb21tdV9k bWFfcHJlcGFyZV9tc2koKQo+PiBhbmQgaW9tbXVfZG1hX2NvbXBvc2VfbXNpX21zZygpLiBUaGUg Y3VycmVudCB2aXJ0dWFsaXphdGlvbiBzb2x1dGlvbgo+PiB3aXRoCj4+IGEgMi1zdGFnZSBuZXN0 ZWQgdHJhbnNsYXRpb24gc2V0dXAgaXMgdG8gZG8gMToxIElPVkEgbWFwcGluZ3MgYXQgc3RhZ2Ut MQo+PiBndWVzdC1sZXZlbCBJTyBwYWdlIHRhYmxlIHZpYSBhIFJNUiByZWdpb24gaW4gZ3Vlc3Qt bGV2ZWwgSU9SVCwgYWxpZ25pbmcKPj4gd2l0aCBhbiBJT1ZBIHJlZ2lvbiB0aGF0J3MgcHJlZGVm aW5lZCBhbmQgbWFwcGVkIGluIHRoZSBob3N0IGtlcm5lbDoKPj4KPj4gwqDCoCBbc3RhZ2UtMiBo b3N0IGxldmVsXQo+PiDCoMKgICNkZWZpbmUgTVNJX0lPVkFfQkFTRcKgwqDCoMKgwqDCoMKgIDB4 ODAwMDAwMAo+PiDCoMKgICNkZWZpbmUgTVNJX0lPVkFfTEVOR1RIwqDCoMKgIDB4MTAwMDAwCj4+ IMKgwqAgLi4uCj4+IMKgwqAgaW9tbXVfZ2V0X21zaV9jb29raWUoKToKPj4gwqDCoMKgwqBjb29r aWUtPm1zaV9pb3ZhID0gTVNJX0lPVkFfQkFTRTsKPj4gwqDCoCAuLi4KPj4gwqDCoCBpb21tdV9k bWFfcHJlcGFyZV9tc2koaXRzX3BhKToKPj4gwqDCoMKgwqBkb21haW4gPSBpb21tdV9nZXRfZG9t YWluX2Zvcl9kZXYoZGV2KTsKPj4gwqDCoMKgwqBpb21tdV9kbWFfZ2V0X21zaV9wYWdlKGl0c19w YSwgZG9tYWluKToKPj4gwqDCoMKgwqDCoMKgwqAgY29va2llID0gZG9tYWluLT5pb3ZhX2Nvb2tp ZTsKPj4gwqDCoMKgwqDCoMKgwqAgaW92YSA9IGlvbW11X2RtYV9hbGxvY19pb3ZhKCk6Cj4+IMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIGNvb2tpZS0+bXNpX2lvdmEgLSBzaXplOwo+PiDC oMKgwqDCoMKgwqDCoCBpb21tdV9tYXAoaW92YSwgaXRzX3BhLCAuLi4pOwo+Pgo+PiDCoMKgIFtz dGFnZS0xIGd1ZXN0IGxldmVsXQo+PiDCoMKgIC8vIERlZmluZSBpbiBJT1JUIGEgUk1SIFtNU0lf SU9WQV9CQVNFLCBNU0lfSU9WQV9MRU5HVEhdCj4+IMKgwqAgLi4uCj4+IMKgwqAgaW9tbXVfY3Jl YXRlX2RldmljZV9kaXJlY3RfbWFwcGluZ3MoKToKPj4gwqDCoMKgwqBpb21tdV9tYXAoaW92YT1N U0lfSU9WQV9CQVNFLCBwYT1NU0lfSU9WQV9CQVNFLAo+PiBsZW49TVNJX0lPVkFfTEVOR1RIKTsK Pj4KPj4gVGhpcyBzb2x1dGlvbiBjYWxsaW5nIGlvbW11X2dldF9kb21haW5fZm9yX2RldigpIG5l ZWRzIHRoZSBkZXZpY2UgdG8gZ2V0Cj4+IGF0dGFjaGVkIHRvIGEgaG9zdC1sZXZlbCBpb21tdV9k b21haW4gdGhhdCBoYXMgdGhlIG1zaV9jb29raWUuCj4+Cj4+IE9uIHRoZSBvdGhlciBoYW5kLCBJ T01NVUZEIGRlc2lnbnMgdHdvIGlvbW11X2RvbWFpbiBvYmplY3RzIHRvIHJlcHJlc2VudAo+PiB0 aGUgdHdvIHN0YWdlczogYSBzdGFnZS0xIGRvbWFpbiAoSU9NTVVfRE9NQUlOX05FU1RFRCB0eXBl KSBhbmQgYQo+PiBzdGFnZS0yCj4+IGRvbWFpbiAoSU9NTVVfRE9NQUlOX1VOTUFOQUdFRCB0eXBl KS4gSW4gdGhpcyBkZXNpZ24sIHRoZSBkZXZpY2Ugd2lsbCBiZQo+PiBhdHRhY2hlZCB0byB0aGUg c3RhZ2UtMSBkb21haW4gcmVwcmVzZW50aW5nIGEgZ3Vlc3QtbGV2ZWwgSU8gcGFnZSB0YWJsZSwK Pj4gb3IgYSBDb250ZXh0IERlc2NyaXB0b3IgVGFibGUgaW4gU01NVSdzIHRlcm0uCj4+Cj4+IFRo aXMgaXMgb2J2aW91c2x5IGEgbWlzbWF0Y2gsIGFzIHRoZSBpb21tdV9nZXRfZG9tYWluX2Zvcl9k ZXYoKSBkb2VzIG5vdAo+PiByZXR1cm4gdGhlIGNvcnJlY3QgZG9tYWluIHBvaW50ZXIgaW4gaW9t bXVfZG1hX3ByZXBhcmVfbXNpKCkuCj4+Cj4+IEFkZCBhbiBpb21tdV9nZXRfdW5tYW5hZ2VkX2Rv bWFpbiBoZWxwZXIgdG8gYWxsb3cgZHJpdmVycyB0byByZXR1cm4gdGhlCj4+IGNvcnJlY3QgSU9N TVVfRE9NQUlOX1VOTUFOQUdFRCBpb21tdV9kb21haW4gaGF2aW5nIHRoZSBJT1ZBIG1hcHBpbmdz IGZvcgo+PiB0aGUgbXNpX2Nvb2tpZS4gS2VlcCBpdCBpbiB0aGUgaW9tbXUtcHJpdiBoZWFkZXIg Zm9yIGludGVybmFsIHVzZSBvbmx5Lgo+Pgo+PiBTdWdnZXN0ZWQtYnk6IEphc29uIEd1bnRob3Jw ZSA8amdnQG52aWRpYS5jb20+Cj4+IFNpZ25lZC1vZmYtYnk6IE5pY29saW4gQ2hlbiA8bmljb2xp bmNAbnZpZGlhLmNvbT4KPj4gLS0tCj4+IMKgIGRyaXZlcnMvaW9tbXUvZG1hLWlvbW11LmPCoCB8 wqAgNSArKystLQo+PiDCoCBkcml2ZXJzL2lvbW11L2lvbW11LXByaXYuaCB8IDE1ICsrKysrKysr KysrKysrKwo+PiDCoCBpbmNsdWRlL2xpbnV4L2lvbW11LmjCoMKgwqDCoMKgIHzCoCAyICsrCj4+ IMKgIDMgZmlsZXMgY2hhbmdlZCwgMjAgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKPj4K Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvZG1hLWlvbW11LmMgYi9kcml2ZXJzL2lvbW11 L2RtYS1pb21tdS5jCj4+IGluZGV4IDk5YjI2NDZjYjVjNy4uNmIwNDA5ZDBmZjg1IDEwMDY0NAo+ PiAtLS0gYS9kcml2ZXJzL2lvbW11L2RtYS1pb21tdS5jCj4+ICsrKyBiL2RyaXZlcnMvaW9tbXUv ZG1hLWlvbW11LmMKPj4gQEAgLTMxLDYgKzMxLDcgQEAKPj4gwqAgI2luY2x1ZGUgPGxpbnV4L3Zt YWxsb2MuaD4KPj4gwqAgwqAgI2luY2x1ZGUgImRtYS1pb21tdS5oIgo+PiArI2luY2x1ZGUgImlv bW11LXByaXYuaCIKPj4gwqAgwqAgc3RydWN0IGlvbW11X2RtYV9tc2lfcGFnZSB7Cj4+IMKgwqDC oMKgwqAgc3RydWN0IGxpc3RfaGVhZMKgwqDCoCBsaXN0Owo+PiBAQCAtMTY1Miw3ICsxNjUzLDcg QEAgc3RhdGljIHN0cnVjdCBpb21tdV9kbWFfbXNpX3BhZ2UKPj4gKmlvbW11X2RtYV9nZXRfbXNp X3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LAo+PiDCoCBpbnQgaW9tbXVfZG1hX3ByZXBhcmVfbXNp KHN0cnVjdCBtc2lfZGVzYyAqZGVzYywgcGh5c19hZGRyX3QgbXNpX2FkZHIpCj4+IMKgIHsKPj4g wqDCoMKgwqDCoCBzdHJ1Y3QgZGV2aWNlICpkZXYgPSBtc2lfZGVzY190b19kZXYoZGVzYyk7Cj4+ IC3CoMKgwqAgc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluID0gaW9tbXVfZ2V0X2RvbWFpbl9m b3JfZGV2KGRldik7Cj4+ICvCoMKgwqAgc3RydWN0IGlvbW11X2RvbWFpbiAqZG9tYWluID0gaW9t bXVfZ2V0X3VubWFuYWdlZF9kb21haW4oZGV2KTsKPgo+IFRoaXMgc3RpbGwgZG9lc24ndCBtYWtl IHNlbnNlIC0gbW9zdCBvZiB0aGUgdGltZSB0aGlzIHdpbGwgYmUgZXhwZWN0ZWQKPiB0byByZXR1 cm4gdGhlIGRlZmF1bHQgRE1BL2lkZW50aXR5IGRvbWFpbiBpZiB0aGF0J3Mgd2hhdCB0aGUgZGV2 aWNlIGlzCj4gY3VycmVudGx5IHVzaW5nLiBXZSBjYW4ndCBrbm93IHdoZXRoZXIgdGhlIGN1cnJl bnQgZG9tYWluIGlzIG1hbmFnZWQKPiBvciBub3QgdW50aWwgd2UgbG9vayBhdCBpdC4KCkkgdGVu ZCB0byBhZ3JlZSB3aXRoIFJvYmluIGhlcmUuIFRoaXMgd2FzIGZpcnN0IGludHJvZHVjZWQgYnkK CltQQVRDSCB2NyAyMS8yMl0gaW9tbXUvZG1hOiBBZGQgc3VwcG9ydCBmb3IgbWFwcGluZyBNU0lz IDxodHRwczovL2xvcmUua2VybmVsLm9yZy9hbGwvMjI3M2FmMjBkODQ0YmQ2MThjNmE5MGI1N2U2 Mzk3MDAzMjhlYmY3Zi4xNDczNjk1NzA0LmdpdC5yb2Jpbi5tdXJwaHlAYXJtLmNvbS8jcj4KaHR0 cHM6Ly9sb3JlLmtlcm5lbC5vcmcvYWxsLzIyNzNhZjIwZDg0NGJkNjE4YzZhOTBiNTdlNjM5NzAw MzI4ZWJmN2YuMTQ3MzY5NTcwNC5naXQucm9iaW4ubXVycGh5QGFybS5jb20vCgpldmVuIGJlZm9y ZSB0aGUgc3VwcG9ydCB1biBWRklPIHVzZSBjYXNlIHdoaWNoIGNhbWUgbGF0ZXIgb24uIFNvIHVz aW5nIHRoZSAidW5tYW5hZ2VkIiB0ZXJtaW5vbG9neSBzb3VuZHMgaW1wcm9wZXIgdG8gbWUsIGF0 IGxlYXN0LgpDb3VsZG4ndCB3ZSB1c2UgYSBwYXJlbnQvY2hpbGQgdGVybWlub2xvZ3kgYXMgdXNl ZCBpbiB0aGUgcGFzdCBpbiAKW1JGQyB2Ml0gL2Rldi9pb21tdSB1QVBJIHByb3Bvc2FsIDxodHRw czovL2xvcmUua2VybmVsLm9yZy9hbGwvQk45UFIxMU1CNTQzM0IxRTRBRTVCMDQ4MDM2OUY5NzE3 OEMxODlAQk45UFIxMU1CNTQzMy5uYW1wcmQxMS5wcm9kLm91dGxvb2suY29tLyNyPgoKVGhpcyB3 b3VsZCBzdGlsbCBob2xkIGZvciB0aGUgZm9ybWVyIHVzZSBjYXNlLgoKVGhhbmtzCgpFcmljCgoK Cj4KPiBKdXN0IGxpa2UgZXZlcnkgb3RoZXIgY2FsbGVyIG9mIGlvbW11X2dldF9kb21haW5fZm9y X2RldigpLCB3aGF0IHdlCj4gd2FudCBoZXJlIGlzIHRoZSBjdXJyZW50IGtlcm5lbC1vd25lZCBk b21haW4gdGhhdCB3ZSBjYW4gaW5zcGVjdCBhbmQKPiBtYXliZSBkbyBzdGFuZGFyZCBJT01NVSBB UEkgdGhpbmdzIHdpdGguIFdoeSBjYW4ndAo+IGlvbW11X2dldF9kb21haW5fZm9yX2RldigpIHNp bXBseSBtYWludGFpbiB0aGF0IGVzdGFibGlzaGVkIHVzYWdlCj4gbW9kZWwgYW5kIHJldHVybiB0 aGUga2VybmVsLW93bmVkIHMyX2RvbWFpbiBmcm9tIGEgbmVzdGVkIGRvbWFpbgo+IGF1dG9tYXRp Y2FsbHk/IE5vIElPTU1VIEFQSSB1c2VyIGV4cGVjdHMgb3IgbmVlZHMgaXQgdG8gcmV0dXJuCj4g YW55dGhpbmcgZWxzZSAoYW5kIElPTU1VRkQgc2hvdWxkIGNlcnRhaW5seSBub3QgYmUgbG9zaW5n IHRyYWNrIG9mIGEKPiBuZXN0ZWQgZG9tYWluIHdpdGhpbiBpdHMgb3duIGhpZ2hlci1sZXZlbCBh YnN0cmFjdGlvbnMgYW5kIG5lZWRpbmcgdG8KPiBmYWxsIGJhY2sgb24gaW9tbXVfZ2V0X2RvbWFp bl9mb3JfZGV2KCkpLCBzbyBJIHJlYWxseSBkb24ndCBzZWUgYQo+IHZhbGlkIHJlYXNvbiB0byBv dmVyY29tcGxpY2F0ZSB0aGluZ3MuCj4KPiBQbGVhc2Ugbm90ZSBJIHN0cmVzcyAidmFsaWQiIHNp bmNlIEknbSBub3QgYnV5aW5nIGFyYml0cmFyaWx5IG1hZGUtdXAKPiBjb25jZXB0dWFsIHB1cml0 eSBhcmd1bWVudHMuIEEgbmVzdGVkIGRvbWFpbiBjYW5ub3QgYmUgdGhlICJvbmUgdHJ1ZQo+IGRv bWFpbiIgdGhhdCBpcyBhbiBvcGFxdWUgY29tYmluYXRpb24gb2YgUzErUzI7IHRoZSBJT01NVSBB UEkgdmlldyBoYXMKPiB0byBiZSBtb3JlIGxpa2UgdGhlIGRldmljZSBpcyBhdHRhY2hlZCB0byBi b3RoIHRoZSBuZXN0ZWQgZG9tYWluIGFuZAo+IHRoZSBwYXJlbnQgc3RhZ2UgMiBkb21haW4gc29t ZXdoYXQgaW4gcGFyYWxsZWwuIEV2ZW4gd2hlbiBuZXN0aW5nIGlzCj4gYWN0aXZlLCB0aGUgUzIg ZG9tYWluIHN0aWxsIGV4aXN0cyBhcyBhIGRvbWFpbiBpbiBpdHMgb3duIHJpZ2h0LCBhbmQKPiBz dGlsbCBuZWVkcyB0byBiZSB2aXNpYmxlIGFuZCBvcGVyYXRlZCBvbiBhcyBzdWNoLCBmb3IgaW5z dGFuY2UgaWYKPiBtZW1vcnkgaXMgaG90cGx1Z2dlZCBpbiBvciBvdXQgb2YgdGhlIFZNLgo+Cj4g VEJIIEknZCBhbHNvIG1vdmUgdGhlIHMyX2RvbWFpbiBwb2ludGVyIGludG8gdGhlIGlvbW11X2Rv bWFpbiBpdHNlbGYsCj4gc2luY2UgaXQncyBnb2luZyB0byBiZSBhIGNvbW1vbiBmZWF0dXJlIGZv ciBhbGwgbmVzdGluZwo+IGltcGxlbWVudGF0aW9ucywgdGh1cyB0aGVyZSBzZWVtcyBsaXR0bGUg bmVlZCB0byBpbmRpcmVjdCBsb29rdXBzCj4gdGhyb3VnaCB0aGUgZHJpdmVycyBhdCBhbGwuCj4K PiBUaGFua3MsCj4gUm9iaW4uCj4KPj4gwqDCoMKgwqDCoCBzdHJ1Y3QgaW9tbXVfZG1hX21zaV9w YWdlICptc2lfcGFnZTsKPj4gwqDCoMKgwqDCoCBzdGF0aWMgREVGSU5FX01VVEVYKG1zaV9wcmVw YXJlX2xvY2spOyAvKiBzZWUgYmVsb3cgKi8KPj4gwqAgQEAgLTE2ODUsNyArMTY4Niw3IEBAIGlu dCBpb21tdV9kbWFfcHJlcGFyZV9tc2koc3RydWN0IG1zaV9kZXNjCj4+ICpkZXNjLCBwaHlzX2Fk ZHJfdCBtc2lfYWRkcikKPj4gwqAgdm9pZCBpb21tdV9kbWFfY29tcG9zZV9tc2lfbXNnKHN0cnVj dCBtc2lfZGVzYyAqZGVzYywgc3RydWN0Cj4+IG1zaV9tc2cgKm1zZykKPj4gwqAgewo+PiDCoMKg wqDCoMKgIHN0cnVjdCBkZXZpY2UgKmRldiA9IG1zaV9kZXNjX3RvX2RldihkZXNjKTsKPj4gLcKg wqDCoCBjb25zdCBzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21haW4gPSBpb21tdV9nZXRfZG9tYWlu X2Zvcl9kZXYoZGV2KTsKPj4gK8KgwqDCoCBjb25zdCBzdHJ1Y3QgaW9tbXVfZG9tYWluICpkb21h aW4gPQo+PiBpb21tdV9nZXRfdW5tYW5hZ2VkX2RvbWFpbihkZXYpOwo+PiDCoMKgwqDCoMKgIGNv bnN0IHN0cnVjdCBpb21tdV9kbWFfbXNpX3BhZ2UgKm1zaV9wYWdlOwo+PiDCoCDCoMKgwqDCoMKg IG1zaV9wYWdlID0gbXNpX2Rlc2NfZ2V0X2lvbW11X2Nvb2tpZShkZXNjKTsKPj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvaW9tbXUvaW9tbXUtcHJpdi5oIGIvZHJpdmVycy9pb21tdS9pb21tdS1wcml2 LmgKPj4gaW5kZXggYTZlNjk0ZjU5ZjY0Li5kYTgwNDRkYTlhZDggMTAwNjQ0Cj4+IC0tLSBhL2Ry aXZlcnMvaW9tbXUvaW9tbXUtcHJpdi5oCj4+ICsrKyBiL2RyaXZlcnMvaW9tbXUvaW9tbXUtcHJp di5oCj4+IEBAIC0xNSw2ICsxNSwyMSBAQCBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cnVjdCBpb21t dV9vcHMKPj4gKmRldl9pb21tdV9vcHMoc3RydWN0IGRldmljZSAqZGV2KQo+PiDCoMKgwqDCoMKg IHJldHVybiBkZXYtPmlvbW11LT5pb21tdV9kZXYtPm9wczsKPj4gwqAgfQo+PiDCoCArc3RhdGlj IGlubGluZSBzdHJ1Y3QgaW9tbXVfZG9tYWluCj4+ICppb21tdV9nZXRfdW5tYW5hZ2VkX2RvbWFp bihzdHJ1Y3QgZGV2aWNlICpkZXYpCj4+ICt7Cj4+ICvCoMKgwqAgY29uc3Qgc3RydWN0IGlvbW11 X29wcyAqb3BzOwo+PiArCj4+ICvCoMKgwqAgaWYgKCFkZXYtPmlvbW11IHx8ICFkZXYtPmlvbW11 LT5pb21tdV9kZXYpCj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIGF0dGFjaGVkX2RvbWFpbjsKPj4g Kwo+PiArwqDCoMKgIG9wcyA9IGRldl9pb21tdV9vcHMoZGV2KTsKPj4gK8KgwqDCoCBpZiAob3Bz LT5nZXRfdW5tYW5hZ2VkX2RvbWFpbikKPj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBvcHMtPmdl dF91bm1hbmFnZWRfZG9tYWluKGRldik7Cj4+ICsKPj4gK2F0dGFjaGVkX2RvbWFpbjoKPj4gK8Kg wqDCoCByZXR1cm4gaW9tbXVfZ2V0X2RvbWFpbl9mb3JfZGV2KGRldik7Cj4+ICt9Cj4+ICsKPj4g wqAgaW50IGlvbW11X2dyb3VwX3JlcGxhY2VfZG9tYWluKHN0cnVjdCBpb21tdV9ncm91cCAqZ3Jv dXAsCj4+IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IGlv bW11X2RvbWFpbiAqbmV3X2RvbWFpbik7Cj4+IMKgIGRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4 L2lvbW11LmggYi9pbmNsdWRlL2xpbnV4L2lvbW11LmgKPj4gaW5kZXggMDgwMjc4YzgxNTRkLi43 NmM2NWNjNGZjMTUgMTAwNjQ0Cj4+IC0tLSBhL2luY2x1ZGUvbGludXgvaW9tbXUuaAo+PiArKysg Yi9pbmNsdWRlL2xpbnV4L2lvbW11LmgKPj4gQEAgLTI3NSw2ICsyNzUsOCBAQCBzdHJ1Y3QgaW9t bXVfb3BzIHsKPj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHN0cnVjdCBpb21tdV9kb21haW4gKnBhcmVudCwKPj4gwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIGNvbnN0IHZvaWQgKnVzZXJf ZGF0YSk7Cj4+IMKgICvCoMKgwqAgc3RydWN0IGlvbW11X2RvbWFpbiAqKCpnZXRfdW5tYW5hZ2Vk X2RvbWFpbikoc3RydWN0IGRldmljZSAqZGV2KTsKPj4gKwo+PiDCoMKgwqDCoMKgIHN0cnVjdCBp b21tdV9kZXZpY2UgKigqcHJvYmVfZGV2aWNlKShzdHJ1Y3QgZGV2aWNlICpkZXYpOwo+PiDCoMKg wqDCoMKgIHZvaWQgKCpyZWxlYXNlX2RldmljZSkoc3RydWN0IGRldmljZSAqZGV2KTsKPj4gwqDC oMKgwqDCoCB2b2lkICgqcHJvYmVfZmluYWxpemUpKHN0cnVjdCBkZXZpY2UgKmRldik7Cj4KCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0t a2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcK aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2Vy bmVsCg==