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=-8.2 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,SIGNED_OFF_BY,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 EE870C54FCB for ; Wed, 22 Apr 2020 17:52:56 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B5DBA20882 for ; Wed, 22 Apr 2020 17:52:56 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="xDufRllK" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726453AbgDVRw4 (ORCPT ); Wed, 22 Apr 2020 13:52:56 -0400 Received: from mail-bn7nam10on2057.outbound.protection.outlook.com ([40.107.92.57]:6267 "EHLO NAM10-BN7-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1726057AbgDVRwz (ORCPT ); Wed, 22 Apr 2020 13:52:55 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fTVhhybvo5wjFOdPvCFKmhZy0WZX+nwUaDxB2dzQh8tdmSU/8GL9bh967AWbpbLWgc0WKTesZNysh7F0YOtCyQuJXgeWKAyMqgIlWbazxQ7WgQvwkJhO+tSRiVwEfOGPpSpOHU4DDhAu0CTWRdxxcIW7MsN0yUMqwaLaV1k4ev7hiiaJx4Md8Qvuaz80p9Gzg6BS/jZlxbeF/ZCMB2at1M06eTHICbaScWTTnQ0g1C4I5O9RyVIxCkbRqsQRmLD61Y0EiSl4qJCX29+6JZ73iSZ1Nx0HJ3JrVN6QutXIoX0oHAslPfHOr7VJ4PGobVDKydyZwFWA1vrhSmXyDXLD4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=eiNqWGaoAMNNDZ9SdRVYyTPfveVXJ4QiIgCQN0cfr+UKONUTRwz4eh/vIJBPOm9o9q09pBvWJa2RK5VjXbe9b7RFSuyXmJxCeV1e8AUQ1+3jLvtbDvwskTMmRAZT13CfveDNyHtqNoRBoTmqa+UKUxoyfqxn7VmBMRhhPxJu1j0iNlqKvDMWYLFB5TmFKr1p0k4wu0j0klrC0jPRoF05a0Kj9zOvltfMCmwxHJi5Kb6i6WbYyx26rLLoH5rUfQ0F6ORLVlD9CF4q7MiGpWX1pM3/ifbKpZ1BsyFM2hAMarqE+7IxXlcIVzWJmIz7qX9ZGxa/GtUdXRiUPwJGn1sbZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=xDufRllKZNptCO2HErv7emJj8Lv0dVLBRRRL9bR1ADmVhQpBDMAZT0H3h9VaBNeh8FL5uA3S6ucwU/1Xs2ytPjBTnArGhuZxljuvTmziOyiT+eOIskoJslPVJX3Dr1AdTtqqIvhPJtrcz7uohk/xsCFh0nqZDc2lGsFKqs/j0is= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Kuehling@amd.com; Received: from SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) by SN1PR12MB2432.namprd12.prod.outlook.com (2603:10b6:802:29::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Wed, 22 Apr 2020 17:52:36 +0000 Received: from SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806]) by SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806%7]) with mapi id 15.20.2921.030; Wed, 22 Apr 2020 17:52:36 +0000 Subject: Re: [PATCH hmm 5/5] mm/hmm: remove the customizable pfn format from hmm_range_fault To: Jason Gunthorpe , linux-mm@kvack.org, Ralph Campbell , "Yang, Philip" Cc: Alex Deucher , amd-gfx@lists.freedesktop.org, Ben Skeggs , =?UTF-8?Q?Christian_K=c3=b6nig?= , "David (ChunMing) Zhou" , dri-devel@lists.freedesktop.org, Christoph Hellwig , intel-gfx@lists.freedesktop.org, =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , John Hubbard , linux-kernel@vger.kernel.org, Niranjana Vishwanathapura , nouveau@lists.freedesktop.org References: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> From: Felix Kuehling Message-ID: Date: Wed, 22 Apr 2020 13:52:32 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 In-Reply-To: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Content-Language: en-US X-ClientProxiedBy: YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) To SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.2.100] (142.116.63.128) by YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13 via Frontend Transport; Wed, 22 Apr 2020 17:52:34 +0000 X-Originating-IP: [142.116.63.128] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-TrafficTypeDiagnostic: SN1PR12MB2432:|SN1PR12MB2432: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 03818C953D X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SN1PR12MB2414.namprd12.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(366004)(136003)(396003)(346002)(376002)(39860400002)(86362001)(31686004)(66556008)(44832011)(2616005)(4326008)(956004)(31696002)(66476007)(186003)(6486002)(66946007)(16526019)(26005)(36756003)(54906003)(110136005)(7416002)(316002)(16576012)(8936002)(5660300002)(478600001)(30864003)(2906002)(8676002)(6636002)(81156014)(52116002)(21314003);DIR:OUT;SFP:1101; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3bJqRGyQuymUYqx3R2Di2ElOTQ+GG984VY+gG7SmF3RJWjdcQ/LGQ/vqxIYMoNHNlZR/WBSi0AUI+n74ZcPUwu6igN5knW13BQl5Z6udwhWxpC9Hd0Jx7JbCuwpctZlyKv2r6e+tapSTDybB3X7YeTn1pXVEJ1Di8lL9zI+FzHnJ/mOqHLDW1t/v/X7vklc8gPjtxaeOB0LWNTVxT/agLlAQ6g1P+EeI8+uH8UOkC9L9nkBLkzCA3dIMDzSHfaKJE1HP1G/5aSNfZNBau6ZaKzVKvzKwWFaHyjqWcXTZ9uc9mGZ/GTNBUFK13WYK0X1yujId90dMLhGJ1CR60v5p0tnzuZBCbEhnlxPy3acIFU1hcJFPa0hYmAmLUnhXnTijjvgdPZoxRAEv16t3c3e8l4nt4Z3NkWAlJQzMGNDRkw901ilOfpy6fvtS/Yu/E4as8j6iuW3wRANJDO3Sb6btb8h5L7RnPBlwxmF21ZhXIZI= X-MS-Exchange-AntiSpam-MessageData: A/p+nH/3LM4XiR/cMcwuziDTYW5C5gGM9FDiDY/+410MT9g1zjqJob0o1KrmHpn7zOkmrtbzE0JJ7VSlYMdOKqCeTMy888QaUFLUWBuqAwzYyAK1ZjA6jgrL3MNVvq3byYL9FzWUffY34mk2qoaKhQ== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2020 17:52:35.8751 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vyV1rsnAsduW7VxFHfLYG3sE2GmBr6piPWuszR6qTa5uhCrqrTDZjF6jFlasjYNpfePf4gpA+dnpGIsu1Rdcvw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB2432 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org [+Philip Yang] Am 2020-04-21 um 8:21 p.m. schrieb Jason Gunthorpe: > From: Jason Gunthorpe > > Presumably the intent here was that hmm_range_fault() could put the data > into some HW specific format and thus avoid some work. However, nothing > actually does that, and it isn't clear how anything actually could do that > as hmm_range_fault() provides CPU addresses which must be DMA mapped. > > Perhaps there is some special HW that does not need DMA mapping, but we > don't have any examples of this, and the theoretical performance win of > avoiding an extra scan over the pfns array doesn't seem worth the > complexity. Plus pfns needs to be scanned anyhow to sort out any > DEVICE_PRIVATE pages. > > This version replaces the uint64_t with an usigned long containing a pfn > and fix flags. On input flags is filled with the HMM_PFN_REQ_* values, on > successful output it is filled with HMM_PFN_* values, describing the state > of the pages. > > amdgpu is simple to convert, it doesn't use snapshot and doesn't use > per-page flags. > > nouveau uses only 16 hmm_pte entries at most (ie fits in a few cache > lines), and it sweeps over its pfns array a couple of times anyhow. > > Signed-off-by: Jason Gunthorpe > Signed-off-by: Christoph Hellwig Hi Jason, I pointed out a typo in the documentation inline. Other than that, the series is Acked-by: Felix Kuehling I'll try to build it and run some basic tests later. > --- > Documentation/vm/hmm.rst | 26 ++-- > drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 35 ++---- > drivers/gpu/drm/nouveau/nouveau_dmem.c | 60 +++++++-- > drivers/gpu/drm/nouveau/nouveau_dmem.h | 4 +- > drivers/gpu/drm/nouveau/nouveau_svm.c | 52 ++++---- > include/linux/hmm.h | 99 ++++++--------- > mm/hmm.c | 160 +++++++++++------------- > 7 files changed, 204 insertions(+), 232 deletions(-) > > diff --git a/Documentation/vm/hmm.rst b/Documentation/vm/hmm.rst > index 9924f2caa0184c..73a9b8c858e5d9 100644 > --- a/Documentation/vm/hmm.rst > +++ b/Documentation/vm/hmm.rst > @@ -185,9 +185,6 @@ The usage pattern is:: > range.start = ...; > range.end = ...; > range.pfns = ...; > - range.flags = ...; > - range.values = ...; > - range.pfn_shift = ...; > > if (!mmget_not_zero(interval_sub->notifier.mm)) > return -EFAULT; > @@ -229,15 +226,10 @@ The hmm_range struct has 2 fields, default_flags and pfn_flags_mask, that specif > fault or snapshot policy for the whole range instead of having to set them > for each entry in the pfns array. > > -For instance, if the device flags for range.flags are:: > +For instance if the device driver wants pages for a range with at least read > +permission, it sets:: > > - range.flags[HMM_PFN_VALID] = (1 << 63); > - range.flags[HMM_PFN_WRITE] = (1 << 62); > - > -and the device driver wants pages for a range with at least read permission, > -it sets:: > - > - range->default_flags = (1 << 63); > + range->default_flags = HMM_PFN_REQ_VALID; This should be HMM_PFN_REQ_FAULT. > range->pfn_flags_mask = 0; > > and calls hmm_range_fault() as described above. This will fill fault all pages > @@ -246,18 +238,18 @@ in the range with at least read permission. > Now let's say the driver wants to do the same except for one page in the range for > which it wants to have write permission. Now driver set:: > > - range->default_flags = (1 << 63); > - range->pfn_flags_mask = (1 << 62); > - range->pfns[index_of_write] = (1 << 62); > + range->default_flags = HMM_PFN_REQ_VALID; HMM_PFN_REQ_FAULT Regards,   Felix > + range->pfn_flags_mask = HMM_PFN_REQ_WRITE; > + range->pfns[index_of_write] = HMM_PFN_REQ_WRITE; > > With this, HMM will fault in all pages with at least read (i.e., valid) and for the > address == range->start + (index_of_write << PAGE_SHIFT) it will fault with > write permission i.e., if the CPU pte does not have write permission set then HMM > will call handle_mm_fault(). > > -Note that HMM will populate the pfns array with write permission for any page > -that is mapped with CPU write permission no matter what values are set > -in default_flags or pfn_flags_mask. > +After hmm_range_fault completes the flag bits are set to the current state of > +the page tables, ie HMM_PFN_VALID | HMM_PFN_WRITE will be set if the page is > +writable. > > > Represent and manage device memory from core kernel point of view > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > index 449083f9f8a2bf..bcfa8c26647d5e 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c > @@ -766,17 +766,6 @@ struct amdgpu_ttm_tt { > }; > > #ifdef CONFIG_DRM_AMDGPU_USERPTR > -/* flags used by HMM internal, not related to CPU/GPU PTE flags */ > -static const uint64_t hmm_range_flags[HMM_PFN_FLAG_MAX] = { > - (1 << 0), /* HMM_PFN_VALID */ > - (1 << 1), /* HMM_PFN_WRITE */ > -}; > - > -static const uint64_t hmm_range_values[HMM_PFN_VALUE_MAX] = { > - 0xfffffffffffffffeUL, /* HMM_PFN_ERROR */ > - 0, /* HMM_PFN_NONE */ > -}; > - > /** > * amdgpu_ttm_tt_get_user_pages - get device accessible pages that back user > * memory and start HMM tracking CPU page table update > @@ -815,18 +804,15 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages) > goto out; > } > range->notifier = &bo->notifier; > - range->flags = hmm_range_flags; > - range->values = hmm_range_values; > - range->pfn_shift = PAGE_SHIFT; > range->start = bo->notifier.interval_tree.start; > range->end = bo->notifier.interval_tree.last + 1; > - range->default_flags = hmm_range_flags[HMM_PFN_VALID]; > + range->default_flags = HMM_PFN_REQ_FAULT; > if (!amdgpu_ttm_tt_is_readonly(ttm)) > - range->default_flags |= range->flags[HMM_PFN_WRITE]; > + range->default_flags |= HMM_PFN_REQ_WRITE; > > - range->pfns = kvmalloc_array(ttm->num_pages, sizeof(*range->pfns), > - GFP_KERNEL); > - if (unlikely(!range->pfns)) { > + range->hmm_pfns = kvmalloc_array(ttm->num_pages, > + sizeof(*range->hmm_pfns), GFP_KERNEL); > + if (unlikely(!range->hmm_pfns)) { > r = -ENOMEM; > goto out_free_ranges; > } > @@ -867,7 +853,7 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages) > * the notifier_lock, and mmu_interval_read_retry() must be done first. > */ > for (i = 0; i < ttm->num_pages; i++) > - pages[i] = hmm_device_entry_to_page(range, range->pfns[i]); > + pages[i] = hmm_pfn_to_page(range->hmm_pfns[i]); > > gtt->range = range; > mmput(mm); > @@ -877,7 +863,7 @@ int amdgpu_ttm_tt_get_user_pages(struct amdgpu_bo *bo, struct page **pages) > out_unlock: > up_read(&mm->mmap_sem); > out_free_pfns: > - kvfree(range->pfns); > + kvfree(range->hmm_pfns); > out_free_ranges: > kfree(range); > out: > @@ -902,7 +888,7 @@ bool amdgpu_ttm_tt_get_user_pages_done(struct ttm_tt *ttm) > DRM_DEBUG_DRIVER("user_pages_done 0x%llx pages 0x%lx\n", > gtt->userptr, ttm->num_pages); > > - WARN_ONCE(!gtt->range || !gtt->range->pfns, > + WARN_ONCE(!gtt->range || !gtt->range->hmm_pfns, > "No user pages to check\n"); > > if (gtt->range) { > @@ -912,7 +898,7 @@ bool amdgpu_ttm_tt_get_user_pages_done(struct ttm_tt *ttm) > */ > r = mmu_interval_read_retry(gtt->range->notifier, > gtt->range->notifier_seq); > - kvfree(gtt->range->pfns); > + kvfree(gtt->range->hmm_pfns); > kfree(gtt->range); > gtt->range = NULL; > } > @@ -1003,8 +989,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) > > for (i = 0; i < ttm->num_pages; i++) { > if (ttm->pages[i] != > - hmm_device_entry_to_page(gtt->range, > - gtt->range->pfns[i])) > + hmm_pfn_to_page(gtt->range->hmm_pfns[i])) > break; > } > > diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.c b/drivers/gpu/drm/nouveau/nouveau_dmem.c > index ad89e09a0be39a..07876fb0e1d665 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_dmem.c > +++ b/drivers/gpu/drm/nouveau/nouveau_dmem.c > @@ -672,27 +672,61 @@ nouveau_dmem_migrate_vma(struct nouveau_drm *drm, > return ret; > } > > -void > -nouveau_dmem_convert_pfn(struct nouveau_drm *drm, > - struct hmm_range *range) > +void nouveau_hmm_convert_pfn(struct nouveau_drm *drm, struct hmm_range *range, > + u64 *ioctl_addr) > { > unsigned long i, npages; > > + /* > + * The ioctl_addr prepared here is passed through nvif_object_ioctl() > + * to an eventual DMA map on some call chain like: > + * nouveau_svm_fault(): > + * args.i.m.method = NVIF_VMM_V0_PFNMAP > + * nouveau_range_fault() > + * nvif_object_ioctl() > + * client->driver->ioctl() > + * struct nvif_driver nvif_driver_nvkm: > + * .ioctl = nvkm_client_ioctl > + * nvkm_ioctl() > + * nvkm_ioctl_path() > + * nvkm_ioctl_v0[type].func(..) > + * nvkm_ioctl_mthd() > + * nvkm_object_mthd() > + * struct nvkm_object_func nvkm_uvmm: > + * .mthd = nvkm_uvmm_mthd > + * nvkm_uvmm_mthd() > + * nvkm_uvmm_mthd_pfnmap() > + * nvkm_vmm_pfn_map() > + * nvkm_vmm_ptes_get_map() > + * func == gp100_vmm_pgt_pfn > + * struct nvkm_vmm_desc_func gp100_vmm_desc_spt: > + * .pfn = gp100_vmm_pgt_pfn > + * nvkm_vmm_iter() > + * REF_PTES == func == gp100_vmm_pgt_pfn() > + * dma_map_page() > + * > + * This is all just encoding the internal hmm reprensetation into a > + * different nouveau internal representation. > + */ > npages = (range->end - range->start) >> PAGE_SHIFT; > for (i = 0; i < npages; ++i) { > struct page *page; > - uint64_t addr; > > - page = hmm_device_entry_to_page(range, range->pfns[i]); > - if (page == NULL) > - continue; > - > - if (!is_device_private_page(page)) > + if (!(range->hmm_pfns[i] & HMM_PFN_VALID)) { > + ioctl_addr[i] = 0; > continue; > + } > > - addr = nouveau_dmem_page_addr(page); > - range->pfns[i] &= ((1UL << range->pfn_shift) - 1); > - range->pfns[i] |= (addr >> PAGE_SHIFT) << range->pfn_shift; > - range->pfns[i] |= NVIF_VMM_PFNMAP_V0_VRAM; > + page = hmm_pfn_to_page(range->hmm_pfns[i]); > + if (is_device_private_page(page)) > + ioctl_addr[i] = nouveau_dmem_page_addr(page) | > + NVIF_VMM_PFNMAP_V0_V | > + NVIF_VMM_PFNMAP_V0_VRAM; > + else > + ioctl_addr[i] = page_to_phys(page) | > + NVIF_VMM_PFNMAP_V0_V | > + NVIF_VMM_PFNMAP_V0_HOST; > + if (range->hmm_pfns[i] & HMM_PFN_WRITE) > + ioctl_addr[i] |= NVIF_VMM_PFNMAP_V0_W; > } > } > diff --git a/drivers/gpu/drm/nouveau/nouveau_dmem.h b/drivers/gpu/drm/nouveau/nouveau_dmem.h > index 92394be5d64923..4607c0be7dd062 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_dmem.h > +++ b/drivers/gpu/drm/nouveau/nouveau_dmem.h > @@ -38,8 +38,8 @@ int nouveau_dmem_migrate_vma(struct nouveau_drm *drm, > unsigned long start, > unsigned long end); > > -void nouveau_dmem_convert_pfn(struct nouveau_drm *drm, > - struct hmm_range *range); > +void nouveau_hmm_convert_pfn(struct nouveau_drm *drm, struct hmm_range *range, > + u64 *ioctl_addr); > #else /* IS_ENABLED(CONFIG_DRM_NOUVEAU_SVM) */ > static inline void nouveau_dmem_init(struct nouveau_drm *drm) {} > static inline void nouveau_dmem_fini(struct nouveau_drm *drm) {} > diff --git a/drivers/gpu/drm/nouveau/nouveau_svm.c b/drivers/gpu/drm/nouveau/nouveau_svm.c > index cf0d9bd61bebf9..d1059bce091192 100644 > --- a/drivers/gpu/drm/nouveau/nouveau_svm.c > +++ b/drivers/gpu/drm/nouveau/nouveau_svm.c > @@ -369,18 +369,6 @@ nouveau_svmm_init(struct drm_device *dev, void *data, > return ret; > } > > -static const u64 > -nouveau_svm_pfn_flags[HMM_PFN_FLAG_MAX] = { > - [HMM_PFN_VALID ] = NVIF_VMM_PFNMAP_V0_V, > - [HMM_PFN_WRITE ] = NVIF_VMM_PFNMAP_V0_W, > -}; > - > -static const u64 > -nouveau_svm_pfn_values[HMM_PFN_VALUE_MAX] = { > - [HMM_PFN_ERROR ] = ~NVIF_VMM_PFNMAP_V0_V, > - [HMM_PFN_NONE ] = NVIF_VMM_PFNMAP_V0_NONE, > -}; > - > /* Issue fault replay for GPU to retry accesses that faulted previously. */ > static void > nouveau_svm_fault_replay(struct nouveau_svm *svm) > @@ -520,7 +508,8 @@ static const struct mmu_interval_notifier_ops nouveau_svm_mni_ops = { > > static int nouveau_range_fault(struct nouveau_svmm *svmm, > struct nouveau_drm *drm, void *data, u32 size, > - u64 *pfns, struct svm_notifier *notifier) > + unsigned long hmm_pfns[], u64 *ioctl_addr, > + struct svm_notifier *notifier) > { > unsigned long timeout = > jiffies + msecs_to_jiffies(HMM_RANGE_DEFAULT_TIMEOUT); > @@ -529,10 +518,8 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm, > .notifier = ¬ifier->notifier, > .start = notifier->notifier.interval_tree.start, > .end = notifier->notifier.interval_tree.last + 1, > - .pfns = pfns, > - .flags = nouveau_svm_pfn_flags, > - .values = nouveau_svm_pfn_values, > - .pfn_shift = NVIF_VMM_PFNMAP_V0_ADDR_SHIFT, > + .pfn_flags_mask = HMM_PFN_REQ_FAULT | HMM_PFN_REQ_WRITE, > + .hmm_pfns = hmm_pfns, > }; > struct mm_struct *mm = notifier->notifier.mm; > int ret; > @@ -542,12 +529,15 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm, > return -EBUSY; > > range.notifier_seq = mmu_interval_read_begin(range.notifier); > - range.default_flags = 0; > - range.pfn_flags_mask = -1UL; > down_read(&mm->mmap_sem); > ret = hmm_range_fault(&range); > up_read(&mm->mmap_sem); > if (ret) { > + /* > + * FIXME: the input PFN_REQ flags are destroyed on > + * -EBUSY, we need to regenerate them, also for the > + * other continue below > + */ > if (ret == -EBUSY) > continue; > return ret; > @@ -562,7 +552,7 @@ static int nouveau_range_fault(struct nouveau_svmm *svmm, > break; > } > > - nouveau_dmem_convert_pfn(drm, &range); > + nouveau_hmm_convert_pfn(drm, &range, ioctl_addr); > > svmm->vmm->vmm.object.client->super = true; > ret = nvif_object_ioctl(&svmm->vmm->vmm.object, data, size, NULL); > @@ -589,6 +579,7 @@ nouveau_svm_fault(struct nvif_notify *notify) > } i; > u64 phys[16]; > } args; > + unsigned long hmm_pfns[ARRAY_SIZE(args.phys)]; > struct vm_area_struct *vma; > u64 inst, start, limit; > int fi, fn, pi, fill; > @@ -704,12 +695,17 @@ nouveau_svm_fault(struct nvif_notify *notify) > * access flags. > *XXX: atomic? > */ > - if (buffer->fault[fn]->access != 0 /* READ. */ && > - buffer->fault[fn]->access != 3 /* PREFETCH. */) { > - args.phys[pi++] = NVIF_VMM_PFNMAP_V0_V | > - NVIF_VMM_PFNMAP_V0_W; > - } else { > - args.phys[pi++] = NVIF_VMM_PFNMAP_V0_V; > + switch (buffer->fault[fn]->access) { > + case 0: /* READ. */ > + hmm_pfns[pi++] = HMM_PFN_REQ_FAULT; > + break; > + case 3: /* PREFETCH. */ > + hmm_pfns[pi++] = 0; > + break; > + default: > + hmm_pfns[pi++] = HMM_PFN_REQ_FAULT | > + HMM_PFN_REQ_WRITE; > + break; > } > args.i.p.size = pi << PAGE_SHIFT; > > @@ -737,7 +733,7 @@ nouveau_svm_fault(struct nvif_notify *notify) > fill = (buffer->fault[fn ]->addr - > buffer->fault[fn - 1]->addr) >> PAGE_SHIFT; > while (--fill) > - args.phys[pi++] = NVIF_VMM_PFNMAP_V0_NONE; > + hmm_pfns[pi++] = 0; > } > > SVMM_DBG(svmm, "wndw %016llx-%016llx covering %d fault(s)", > @@ -753,7 +749,7 @@ nouveau_svm_fault(struct nvif_notify *notify) > ret = nouveau_range_fault( > svmm, svm->drm, &args, > sizeof(args.i) + pi * sizeof(args.phys[0]), > - args.phys, ¬ifier); > + hmm_pfns, args.phys, ¬ifier); > mmu_interval_notifier_remove(¬ifier.notifier); > } > mmput(mm); > diff --git a/include/linux/hmm.h b/include/linux/hmm.h > index 81c302c884c0e3..e72529786f16f8 100644 > --- a/include/linux/hmm.h > +++ b/include/linux/hmm.h > @@ -19,45 +19,45 @@ > #include > > /* > - * hmm_pfn_flag_e - HMM flag enums > + * On output: > + * 0 - The page is faultable and a future call with > + * HMM_PFN_REQ_FAULT could succeed. > + * HMM_PFN_VALID - the pfn field points to a valid PFN. This PFN is at > + * least readable. If dev_private_owner is !NULL then this could > + * point at a DEVICE_PRIVATE page. > + * HMM_PFN_WRITE - if the page memory can be written to (requires HMM_PFN_VALID) > + * HMM_PFN_ERROR - accessing the pfn is impossible and the device should > + * fail. ie poisoned memory, special pages, no vma, etc > * > - * Flags: > - * HMM_PFN_VALID: pfn is valid. It has, at least, read permission. > - * HMM_PFN_WRITE: CPU page table has write permission set > - * > - * The driver provides a flags array for mapping page protections to device > - * PTE bits. If the driver valid bit for an entry is bit 3, > - * i.e., (entry & (1 << 3)), then the driver must provide > - * an array in hmm_range.flags with hmm_range.flags[HMM_PFN_VALID] == 1 << 3. > - * Same logic apply to all flags. This is the same idea as vm_page_prot in vma > - * except that this is per device driver rather than per architecture. > + * On input: > + * 0 - Return the current state of the page, do not fault it. > + * HMM_PFN_REQ_FAULT - The output must have HMM_PFN_VALID or hmm_range_fault() > + * will fail > + * HMM_PFN_REQ_WRITE - The output must have HMM_PFN_WRITE or hmm_range_fault() > + * will fail. Must be combined with HMM_PFN_REQ_FAULT. > */ > -enum hmm_pfn_flag_e { > - HMM_PFN_VALID = 0, > - HMM_PFN_WRITE, > - HMM_PFN_FLAG_MAX > +enum hmm_pfn_flags { > + HMM_PFN_VALID = 1UL << (BITS_PER_LONG - 1), > + HMM_PFN_WRITE = 1UL << (BITS_PER_LONG - 2), > + HMM_PFN_ERROR = 1UL << (BITS_PER_LONG - 3), > + > + HMM_PFN_REQ_FAULT = HMM_PFN_VALID, > + HMM_PFN_REQ_WRITE = HMM_PFN_WRITE, > + > + HMM_PFN_FLAGS = HMM_PFN_VALID | HMM_PFN_WRITE | HMM_PFN_ERROR, > }; > > /* > - * hmm_pfn_value_e - HMM pfn special value > - * > - * Flags: > - * HMM_PFN_ERROR: corresponding CPU page table entry points to poisoned memory > - * HMM_PFN_NONE: corresponding CPU page table entry is pte_none() > + * hmm_pfn_to_page() - return struct page pointed to by a device entry > * > - * Driver provides values for none entry, error entry, and special entry. > - * Driver can alias (i.e., use same value) error and special, but > - * it should not alias none with error or special. > - * > - * HMM pfn value returned by hmm_vma_get_pfns() or hmm_vma_fault() will be: > - * hmm_range.values[HMM_PFN_ERROR] if CPU page table entry is poisonous, > - * hmm_range.values[HMM_PFN_NONE] if there is no CPU page table entry, > + * This must be called under the caller 'user_lock' after a successful > + * mmu_interval_read_begin(). The caller must have tested for HMM_PFN_VALID > + * already. > */ > -enum hmm_pfn_value_e { > - HMM_PFN_ERROR, > - HMM_PFN_NONE, > - HMM_PFN_VALUE_MAX > -}; > +static inline struct page *hmm_pfn_to_page(unsigned long hmm_pfn) > +{ > + return pfn_to_page(hmm_pfn & ~HMM_PFN_FLAGS); > +} > > /* > * struct hmm_range - track invalidation lock on virtual address range > @@ -66,12 +66,9 @@ enum hmm_pfn_value_e { > * @notifier_seq: result of mmu_interval_read_begin() > * @start: range virtual start address (inclusive) > * @end: range virtual end address (exclusive) > - * @pfns: array of pfns (big enough for the range) > - * @flags: pfn flags to match device driver page table > - * @values: pfn value for some special case (none, special, error, ...) > + * @hmm_pfns: array of pfns (big enough for the range) > * @default_flags: default flags for the range (write, read, ... see hmm doc) > * @pfn_flags_mask: allows to mask pfn flags so that only default_flags matter > - * @pfn_shift: pfn shift value (should be <= PAGE_SHIFT) > * @dev_private_owner: owner of device private pages > */ > struct hmm_range { > @@ -79,36 +76,12 @@ struct hmm_range { > unsigned long notifier_seq; > unsigned long start; > unsigned long end; > - uint64_t *pfns; > - const uint64_t *flags; > - const uint64_t *values; > - uint64_t default_flags; > - uint64_t pfn_flags_mask; > - uint8_t pfn_shift; > + unsigned long *hmm_pfns; > + unsigned long default_flags; > + unsigned long pfn_flags_mask; > void *dev_private_owner; > }; > > -/* > - * hmm_device_entry_to_page() - return struct page pointed to by a device entry > - * @range: range use to decode device entry value > - * @entry: device entry value to get corresponding struct page from > - * Return: struct page pointer if entry is a valid, NULL otherwise > - * > - * If the device entry is valid (ie valid flag set) then return the struct page > - * matching the entry value. Otherwise return NULL. > - */ > -static inline struct page *hmm_device_entry_to_page(const struct hmm_range *range, > - uint64_t entry) > -{ > - if (entry == range->values[HMM_PFN_NONE]) > - return NULL; > - if (entry == range->values[HMM_PFN_ERROR]) > - return NULL; > - if (!(entry & range->flags[HMM_PFN_VALID])) > - return NULL; > - return pfn_to_page(entry >> range->pfn_shift); > -} > - > /* > * Please see Documentation/vm/hmm.rst for how to use the range API. > */ > diff --git a/mm/hmm.c b/mm/hmm.c > index 2693393dc14b30..c1c96d4cc0554c 100644 > --- a/mm/hmm.c > +++ b/mm/hmm.c > @@ -37,28 +37,13 @@ enum { > HMM_NEED_ALL_BITS = HMM_NEED_FAULT | HMM_NEED_WRITE_FAULT, > }; > > -/* > - * hmm_device_entry_from_pfn() - create a valid device entry value from pfn > - * @range: range use to encode HMM pfn value > - * @pfn: pfn value for which to create the device entry > - * Return: valid device entry for the pfn > - */ > -static uint64_t hmm_device_entry_from_pfn(const struct hmm_range *range, > - unsigned long pfn) > -{ > - return (pfn << range->pfn_shift) | range->flags[HMM_PFN_VALID]; > -} > - > static int hmm_pfns_fill(unsigned long addr, unsigned long end, > - struct hmm_range *range, enum hmm_pfn_value_e value) > + struct hmm_range *range, unsigned long cpu_flags) > { > - uint64_t *pfns = range->pfns; > - unsigned long i; > + unsigned long i = (addr - range->start) >> PAGE_SHIFT; > > - i = (addr - range->start) >> PAGE_SHIFT; > for (; addr < end; addr += PAGE_SIZE, i++) > - pfns[i] = range->values[value]; > - > + range->hmm_pfns[i] = cpu_flags; > return 0; > } > > @@ -96,7 +81,8 @@ static int hmm_vma_fault(unsigned long addr, unsigned long end, > } > > static unsigned int hmm_pte_need_fault(const struct hmm_vma_walk *hmm_vma_walk, > - uint64_t pfns, uint64_t cpu_flags) > + unsigned long pfn_req_flags, > + unsigned long cpu_flags) > { > struct hmm_range *range = hmm_vma_walk->range; > > @@ -110,27 +96,28 @@ static unsigned int hmm_pte_need_fault(const struct hmm_vma_walk *hmm_vma_walk, > * waste to have the user pre-fill the pfn arrays with a default > * flags value. > */ > - pfns = (pfns & range->pfn_flags_mask) | range->default_flags; > + pfn_req_flags &= range->pfn_flags_mask; > + pfn_req_flags |= range->default_flags; > > /* We aren't ask to do anything ... */ > - if (!(pfns & range->flags[HMM_PFN_VALID])) > + if (!(pfn_req_flags & HMM_PFN_REQ_FAULT)) > return 0; > > /* Need to write fault ? */ > - if ((pfns & range->flags[HMM_PFN_WRITE]) && > - !(cpu_flags & range->flags[HMM_PFN_WRITE])) > + if ((pfn_req_flags & HMM_PFN_REQ_WRITE) && > + !(cpu_flags & HMM_PFN_WRITE)) > return HMM_NEED_FAULT | HMM_NEED_WRITE_FAULT; > > /* If CPU page table is not valid then we need to fault */ > - if (!(cpu_flags & range->flags[HMM_PFN_VALID])) > + if (!(cpu_flags & HMM_PFN_VALID)) > return HMM_NEED_FAULT; > return 0; > } > > static unsigned int > hmm_range_need_fault(const struct hmm_vma_walk *hmm_vma_walk, > - const uint64_t *pfns, unsigned long npages, > - uint64_t cpu_flags) > + const unsigned long hmm_pfns[], unsigned long npages, > + unsigned long cpu_flags) > { > struct hmm_range *range = hmm_vma_walk->range; > unsigned int required_fault = 0; > @@ -142,12 +129,12 @@ hmm_range_need_fault(const struct hmm_vma_walk *hmm_vma_walk, > * hmm_pte_need_fault() will always return 0. > */ > if (!((range->default_flags | range->pfn_flags_mask) & > - range->flags[HMM_PFN_VALID])) > + HMM_PFN_REQ_FAULT)) > return 0; > > for (i = 0; i < npages; ++i) { > - required_fault |= > - hmm_pte_need_fault(hmm_vma_walk, pfns[i], cpu_flags); > + required_fault |= hmm_pte_need_fault(hmm_vma_walk, hmm_pfns[i], > + cpu_flags); > if (required_fault == HMM_NEED_ALL_BITS) > return required_fault; > } > @@ -161,12 +148,13 @@ static int hmm_vma_walk_hole(unsigned long addr, unsigned long end, > struct hmm_range *range = hmm_vma_walk->range; > unsigned int required_fault; > unsigned long i, npages; > - uint64_t *pfns; > + unsigned long *hmm_pfns; > > i = (addr - range->start) >> PAGE_SHIFT; > npages = (end - addr) >> PAGE_SHIFT; > - pfns = &range->pfns[i]; > - required_fault = hmm_range_need_fault(hmm_vma_walk, pfns, npages, 0); > + hmm_pfns = &range->hmm_pfns[i]; > + required_fault = > + hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0); > if (!walk->vma) { > if (required_fault) > return -EFAULT; > @@ -174,44 +162,44 @@ static int hmm_vma_walk_hole(unsigned long addr, unsigned long end, > } > if (required_fault) > return hmm_vma_fault(addr, end, required_fault, walk); > - return hmm_pfns_fill(addr, end, range, HMM_PFN_NONE); > + return hmm_pfns_fill(addr, end, range, 0); > } > > -static inline uint64_t pmd_to_hmm_pfn_flags(struct hmm_range *range, pmd_t pmd) > +static inline unsigned long pmd_to_hmm_pfn_flags(struct hmm_range *range, > + pmd_t pmd) > { > if (pmd_protnone(pmd)) > return 0; > - return pmd_write(pmd) ? range->flags[HMM_PFN_VALID] | > - range->flags[HMM_PFN_WRITE] : > - range->flags[HMM_PFN_VALID]; > + return pmd_write(pmd) ? (HMM_PFN_VALID | HMM_PFN_WRITE) : HMM_PFN_VALID; > } > > #ifdef CONFIG_TRANSPARENT_HUGEPAGE > static int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr, > - unsigned long end, uint64_t *pfns, pmd_t pmd) > + unsigned long end, unsigned long hmm_pfns[], > + pmd_t pmd) > { > struct hmm_vma_walk *hmm_vma_walk = walk->private; > struct hmm_range *range = hmm_vma_walk->range; > unsigned long pfn, npages, i; > unsigned int required_fault; > - uint64_t cpu_flags; > + unsigned long cpu_flags; > > npages = (end - addr) >> PAGE_SHIFT; > cpu_flags = pmd_to_hmm_pfn_flags(range, pmd); > required_fault = > - hmm_range_need_fault(hmm_vma_walk, pfns, npages, cpu_flags); > + hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, cpu_flags); > if (required_fault) > return hmm_vma_fault(addr, end, required_fault, walk); > > pfn = pmd_pfn(pmd) + ((addr & ~PMD_MASK) >> PAGE_SHIFT); > for (i = 0; addr < end; addr += PAGE_SIZE, i++, pfn++) > - pfns[i] = hmm_device_entry_from_pfn(range, pfn) | cpu_flags; > + hmm_pfns[i] = pfn | cpu_flags; > return 0; > } > #else /* CONFIG_TRANSPARENT_HUGEPAGE */ > /* stub to allow the code below to compile */ > int hmm_vma_handle_pmd(struct mm_walk *walk, unsigned long addr, > - unsigned long end, uint64_t *pfns, pmd_t pmd); > + unsigned long end, unsigned long hmm_pfns[], pmd_t pmd); > #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ > > static inline bool hmm_is_device_private_entry(struct hmm_range *range, > @@ -222,31 +210,31 @@ static inline bool hmm_is_device_private_entry(struct hmm_range *range, > range->dev_private_owner; > } > > -static inline uint64_t pte_to_hmm_pfn_flags(struct hmm_range *range, pte_t pte) > +static inline unsigned long pte_to_hmm_pfn_flags(struct hmm_range *range, > + pte_t pte) > { > if (pte_none(pte) || !pte_present(pte) || pte_protnone(pte)) > return 0; > - return pte_write(pte) ? range->flags[HMM_PFN_VALID] | > - range->flags[HMM_PFN_WRITE] : > - range->flags[HMM_PFN_VALID]; > + return pte_write(pte) ? (HMM_PFN_VALID | HMM_PFN_WRITE) : HMM_PFN_VALID; > } > > static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, > unsigned long end, pmd_t *pmdp, pte_t *ptep, > - uint64_t *pfn) > + unsigned long *hmm_pfn) > { > struct hmm_vma_walk *hmm_vma_walk = walk->private; > struct hmm_range *range = hmm_vma_walk->range; > unsigned int required_fault; > - uint64_t cpu_flags; > + unsigned long cpu_flags; > pte_t pte = *ptep; > - uint64_t orig_pfn = *pfn; > + uint64_t pfn_req_flags = *hmm_pfn; > > if (pte_none(pte)) { > - required_fault = hmm_pte_need_fault(hmm_vma_walk, orig_pfn, 0); > + required_fault = > + hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0); > if (required_fault) > goto fault; > - *pfn = range->values[HMM_PFN_NONE]; > + *hmm_pfn = 0; > return 0; > } > > @@ -258,17 +246,18 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, > * the PFN even if not present. > */ > if (hmm_is_device_private_entry(range, entry)) { > - *pfn = hmm_device_entry_from_pfn(range, > - device_private_entry_to_pfn(entry)); > - *pfn |= range->flags[HMM_PFN_VALID]; > + cpu_flags = HMM_PFN_VALID; > if (is_write_device_private_entry(entry)) > - *pfn |= range->flags[HMM_PFN_WRITE]; > + cpu_flags |= HMM_PFN_WRITE; > + *hmm_pfn = device_private_entry_to_pfn(entry) | > + cpu_flags; > return 0; > } > > - required_fault = hmm_pte_need_fault(hmm_vma_walk, orig_pfn, 0); > + required_fault = > + hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0); > if (!required_fault) { > - *pfn = range->values[HMM_PFN_NONE]; > + *hmm_pfn = 0; > return 0; > } > > @@ -288,7 +277,8 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, > } > > cpu_flags = pte_to_hmm_pfn_flags(range, pte); > - required_fault = hmm_pte_need_fault(hmm_vma_walk, orig_pfn, cpu_flags); > + required_fault = > + hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, cpu_flags); > if (required_fault) > goto fault; > > @@ -297,15 +287,15 @@ static int hmm_vma_handle_pte(struct mm_walk *walk, unsigned long addr, > * fall through and treat it like a normal page. > */ > if (pte_special(pte) && !is_zero_pfn(pte_pfn(pte))) { > - if (hmm_pte_need_fault(hmm_vma_walk, orig_pfn, 0)) { > + if (hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, 0)) { > pte_unmap(ptep); > return -EFAULT; > } > - *pfn = range->values[HMM_PFN_ERROR]; > + *hmm_pfn = HMM_PFN_ERROR; > return 0; > } > > - *pfn = hmm_device_entry_from_pfn(range, pte_pfn(pte)) | cpu_flags; > + *hmm_pfn = pte_pfn(pte) | cpu_flags; > return 0; > > fault: > @@ -321,7 +311,8 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > { > struct hmm_vma_walk *hmm_vma_walk = walk->private; > struct hmm_range *range = hmm_vma_walk->range; > - uint64_t *pfns = &range->pfns[(start - range->start) >> PAGE_SHIFT]; > + unsigned long *hmm_pfns = > + &range->hmm_pfns[(start - range->start) >> PAGE_SHIFT]; > unsigned long npages = (end - start) >> PAGE_SHIFT; > unsigned long addr = start; > pte_t *ptep; > @@ -333,16 +324,16 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > return hmm_vma_walk_hole(start, end, -1, walk); > > if (thp_migration_supported() && is_pmd_migration_entry(pmd)) { > - if (hmm_range_need_fault(hmm_vma_walk, pfns, npages, 0)) { > + if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0)) { > hmm_vma_walk->last = addr; > pmd_migration_entry_wait(walk->mm, pmdp); > return -EBUSY; > } > - return hmm_pfns_fill(start, end, range, HMM_PFN_NONE); > + return hmm_pfns_fill(start, end, range, 0); > } > > if (!pmd_present(pmd)) { > - if (hmm_range_need_fault(hmm_vma_walk, pfns, npages, 0)) > + if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0)) > return -EFAULT; > return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR); > } > @@ -362,7 +353,7 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > if (!pmd_devmap(pmd) && !pmd_trans_huge(pmd)) > goto again; > > - return hmm_vma_handle_pmd(walk, addr, end, pfns, pmd); > + return hmm_vma_handle_pmd(walk, addr, end, hmm_pfns, pmd); > } > > /* > @@ -372,16 +363,16 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > * recover. > */ > if (pmd_bad(pmd)) { > - if (hmm_range_need_fault(hmm_vma_walk, pfns, npages, 0)) > + if (hmm_range_need_fault(hmm_vma_walk, hmm_pfns, npages, 0)) > return -EFAULT; > return hmm_pfns_fill(start, end, range, HMM_PFN_ERROR); > } > > ptep = pte_offset_map(pmdp, addr); > - for (; addr < end; addr += PAGE_SIZE, ptep++, pfns++) { > + for (; addr < end; addr += PAGE_SIZE, ptep++, hmm_pfns++) { > int r; > > - r = hmm_vma_handle_pte(walk, addr, end, pmdp, ptep, pfns); > + r = hmm_vma_handle_pte(walk, addr, end, pmdp, ptep, hmm_pfns); > if (r) { > /* hmm_vma_handle_pte() did pte_unmap() */ > return r; > @@ -393,13 +384,12 @@ static int hmm_vma_walk_pmd(pmd_t *pmdp, > > #if defined(CONFIG_ARCH_HAS_PTE_DEVMAP) && \ > defined(CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD) > -static inline uint64_t pud_to_hmm_pfn_flags(struct hmm_range *range, pud_t pud) > +static inline unsigned long pud_to_hmm_pfn_flags(struct hmm_range *range, > + pud_t pud) > { > if (!pud_present(pud)) > return 0; > - return pud_write(pud) ? range->flags[HMM_PFN_VALID] | > - range->flags[HMM_PFN_WRITE] : > - range->flags[HMM_PFN_VALID]; > + return pud_write(pud) ? (HMM_PFN_VALID | HMM_PFN_WRITE) : HMM_PFN_VALID; > } > > static int hmm_vma_walk_pud(pud_t *pudp, unsigned long start, unsigned long end, > @@ -427,7 +417,8 @@ static int hmm_vma_walk_pud(pud_t *pudp, unsigned long start, unsigned long end, > if (pud_huge(pud) && pud_devmap(pud)) { > unsigned long i, npages, pfn; > unsigned int required_fault; > - uint64_t *pfns, cpu_flags; > + unsigned long *hmm_pfns; > + unsigned long cpu_flags; > > if (!pud_present(pud)) { > spin_unlock(ptl); > @@ -436,10 +427,10 @@ static int hmm_vma_walk_pud(pud_t *pudp, unsigned long start, unsigned long end, > > i = (addr - range->start) >> PAGE_SHIFT; > npages = (end - addr) >> PAGE_SHIFT; > - pfns = &range->pfns[i]; > + hmm_pfns = &range->hmm_pfns[i]; > > cpu_flags = pud_to_hmm_pfn_flags(range, pud); > - required_fault = hmm_range_need_fault(hmm_vma_walk, pfns, > + required_fault = hmm_range_need_fault(hmm_vma_walk, hmm_pfns, > npages, cpu_flags); > if (required_fault) { > spin_unlock(ptl); > @@ -448,8 +439,7 @@ static int hmm_vma_walk_pud(pud_t *pudp, unsigned long start, unsigned long end, > > pfn = pud_pfn(pud) + ((addr & ~PUD_MASK) >> PAGE_SHIFT); > for (i = 0; i < npages; ++i, ++pfn) > - pfns[i] = hmm_device_entry_from_pfn(range, pfn) | > - cpu_flags; > + hmm_pfns[i] = pfn | cpu_flags; > goto out_unlock; > } > > @@ -473,8 +463,9 @@ static int hmm_vma_walk_hugetlb_entry(pte_t *pte, unsigned long hmask, > struct hmm_vma_walk *hmm_vma_walk = walk->private; > struct hmm_range *range = hmm_vma_walk->range; > struct vm_area_struct *vma = walk->vma; > - uint64_t orig_pfn, cpu_flags; > unsigned int required_fault; > + unsigned long pfn_req_flags; > + unsigned long cpu_flags; > spinlock_t *ptl; > pte_t entry; > > @@ -482,9 +473,10 @@ static int hmm_vma_walk_hugetlb_entry(pte_t *pte, unsigned long hmask, > entry = huge_ptep_get(pte); > > i = (start - range->start) >> PAGE_SHIFT; > - orig_pfn = range->pfns[i]; > + pfn_req_flags = range->hmm_pfns[i]; > cpu_flags = pte_to_hmm_pfn_flags(range, entry); > - required_fault = hmm_pte_need_fault(hmm_vma_walk, orig_pfn, cpu_flags); > + required_fault = > + hmm_pte_need_fault(hmm_vma_walk, pfn_req_flags, cpu_flags); > if (required_fault) { > spin_unlock(ptl); > return hmm_vma_fault(addr, end, required_fault, walk); > @@ -492,8 +484,8 @@ static int hmm_vma_walk_hugetlb_entry(pte_t *pte, unsigned long hmask, > > pfn = pte_pfn(entry) + ((start & ~hmask) >> PAGE_SHIFT); > for (; addr < end; addr += PAGE_SIZE, i++, pfn++) > - range->pfns[i] = hmm_device_entry_from_pfn(range, pfn) | > - cpu_flags; > + range->hmm_pfns[i] = pfn | cpu_flags; > + > spin_unlock(ptl); > return 0; > } > @@ -524,7 +516,7 @@ static int hmm_vma_walk_test(unsigned long start, unsigned long end, > * failure. > */ > if (hmm_range_need_fault(hmm_vma_walk, > - range->pfns + > + range->hmm_pfns + > ((start - range->start) >> PAGE_SHIFT), > (end - start) >> PAGE_SHIFT, 0)) > return -EFAULT; From mboxrd@z Thu Jan 1 00:00:00 1970 From: Felix Kuehling Subject: Re: [PATCH hmm 5/5] mm/hmm: remove the customizable pfn format from hmm_range_fault Date: Wed, 22 Apr 2020 13:52:32 -0400 Message-ID: References: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg-VPRAkNaXOzVWk0Htik3J/w@public.gmane.org> Content-Language: en-US List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Jason Gunthorpe , linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, Ralph Campbell , "Yang, Philip" Cc: "David (ChunMing) Zhou" , amd-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, intel-gfx-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Christoph Hellwig , Ben Skeggs , nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, Alex Deucher , Niranjana Vishwanathapura , =?UTF-8?Q?Christian_K=c3=b6nig?= List-Id: nouveau.vger.kernel.org WytQaGlsaXAgWWFuZ10KCkFtIDIwMjAtMDQtMjEgdW0gODoyMSBwLm0uIHNjaHJpZWIgSmFzb24g R3VudGhvcnBlOgo+IEZyb206IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4KPgo+ IFByZXN1bWFibHkgdGhlIGludGVudCBoZXJlIHdhcyB0aGF0IGhtbV9yYW5nZV9mYXVsdCgpIGNv dWxkIHB1dCB0aGUgZGF0YQo+IGludG8gc29tZSBIVyBzcGVjaWZpYyBmb3JtYXQgYW5kIHRodXMg YXZvaWQgc29tZSB3b3JrLiBIb3dldmVyLCBub3RoaW5nCj4gYWN0dWFsbHkgZG9lcyB0aGF0LCBh bmQgaXQgaXNuJ3QgY2xlYXIgaG93IGFueXRoaW5nIGFjdHVhbGx5IGNvdWxkIGRvIHRoYXQKPiBh cyBobW1fcmFuZ2VfZmF1bHQoKSBwcm92aWRlcyBDUFUgYWRkcmVzc2VzIHdoaWNoIG11c3QgYmUg RE1BIG1hcHBlZC4KPgo+IFBlcmhhcHMgdGhlcmUgaXMgc29tZSBzcGVjaWFsIEhXIHRoYXQgZG9l cyBub3QgbmVlZCBETUEgbWFwcGluZywgYnV0IHdlCj4gZG9uJ3QgaGF2ZSBhbnkgZXhhbXBsZXMg b2YgdGhpcywgYW5kIHRoZSB0aGVvcmV0aWNhbCBwZXJmb3JtYW5jZSB3aW4gb2YKPiBhdm9pZGlu ZyBhbiBleHRyYSBzY2FuIG92ZXIgdGhlIHBmbnMgYXJyYXkgZG9lc24ndCBzZWVtIHdvcnRoIHRo ZQo+IGNvbXBsZXhpdHkuIFBsdXMgcGZucyBuZWVkcyB0byBiZSBzY2FubmVkIGFueWhvdyB0byBz b3J0IG91dCBhbnkKPiBERVZJQ0VfUFJJVkFURSBwYWdlcy4KPgo+IFRoaXMgdmVyc2lvbiByZXBs YWNlcyB0aGUgdWludDY0X3Qgd2l0aCBhbiB1c2lnbmVkIGxvbmcgY29udGFpbmluZyBhIHBmbgo+ IGFuZCBmaXggZmxhZ3MuIE9uIGlucHV0IGZsYWdzIGlzIGZpbGxlZCB3aXRoIHRoZSBITU1fUEZO X1JFUV8qIHZhbHVlcywgb24KPiBzdWNjZXNzZnVsIG91dHB1dCBpdCBpcyBmaWxsZWQgd2l0aCBI TU1fUEZOXyogdmFsdWVzLCBkZXNjcmliaW5nIHRoZSBzdGF0ZQo+IG9mIHRoZSBwYWdlcy4KPgo+ IGFtZGdwdSBpcyBzaW1wbGUgdG8gY29udmVydCwgaXQgZG9lc24ndCB1c2Ugc25hcHNob3QgYW5k IGRvZXNuJ3QgdXNlCj4gcGVyLXBhZ2UgZmxhZ3MuCj4KPiBub3V2ZWF1IHVzZXMgb25seSAxNiBo bW1fcHRlIGVudHJpZXMgYXQgbW9zdCAoaWUgZml0cyBpbiBhIGZldyBjYWNoZQo+IGxpbmVzKSwg YW5kIGl0IHN3ZWVwcyBvdmVyIGl0cyBwZm5zIGFycmF5IGEgY291cGxlIG9mIHRpbWVzIGFueWhv dy4KPgo+IFNpZ25lZC1vZmYtYnk6IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4K PiBTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KCkhpIEphc29u LAoKSSBwb2ludGVkIG91dCBhIHR5cG8gaW4gdGhlIGRvY3VtZW50YXRpb24gaW5saW5lLiBPdGhl ciB0aGFuIHRoYXQsIHRoZQpzZXJpZXMgaXMKCkFja2VkLWJ5OiBGZWxpeCBLdWVobGluZyA8RmVs aXguS3VlaGxpbmdAYW1kLmNvbT4KCkknbGwgdHJ5IHRvIGJ1aWxkIGl0IGFuZCBydW4gc29tZSBi YXNpYyB0ZXN0cyBsYXRlci4KCgo+IC0tLQo+ICBEb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QgICAg ICAgICAgICAgICAgfCAgMjYgKystLQo+ICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRn cHVfdHRtLmMgfCAgMzUgKystLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVf ZG1lbS5jICB8ICA2MCArKysrKysrLS0KPiAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVh dV9kbWVtLmggIHwgICA0ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3Zt LmMgICB8ICA1MiArKysrLS0tLQo+ICBpbmNsdWRlL2xpbnV4L2htbS5oICAgICAgICAgICAgICAg ICAgICAgfCAgOTkgKysrKysrLS0tLS0tLS0tCj4gIG1tL2htbS5jICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDE2MCArKysrKysrKysrKy0tLS0tLS0tLS0tLS0KPiAgNyBmaWxlcyBj aGFuZ2VkLCAyMDQgaW5zZXJ0aW9ucygrKSwgMjMyIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdp dCBhL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdCBiL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdAo+ IGluZGV4IDk5MjRmMmNhYTAxODRjLi43M2E5YjhjODU4ZTVkOSAxMDA2NDQKPiAtLS0gYS9Eb2N1 bWVudGF0aW9uL3ZtL2htbS5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QKPiBA QCAtMTg1LDkgKzE4NSw2IEBAIFRoZSB1c2FnZSBwYXR0ZXJuIGlzOjoKPiAgICAgICAgcmFuZ2Uu c3RhcnQgPSAuLi47Cj4gICAgICAgIHJhbmdlLmVuZCA9IC4uLjsKPiAgICAgICAgcmFuZ2UucGZu cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UuZmxhZ3MgPSAuLi47Cj4gLSAgICAgIHJhbmdlLnZhbHVl cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UucGZuX3NoaWZ0ID0gLi4uOwo+ICAKPiAgICAgICAgaWYg KCFtbWdldF9ub3RfemVybyhpbnRlcnZhbF9zdWItPm5vdGlmaWVyLm1tKSkKPiAgICAgICAgICAg IHJldHVybiAtRUZBVUxUOwo+IEBAIC0yMjksMTUgKzIyNiwxMCBAQCBUaGUgaG1tX3JhbmdlIHN0 cnVjdCBoYXMgMiBmaWVsZHMsIGRlZmF1bHRfZmxhZ3MgYW5kIHBmbl9mbGFnc19tYXNrLCB0aGF0 IHNwZWNpZgo+ICBmYXVsdCBvciBzbmFwc2hvdCBwb2xpY3kgZm9yIHRoZSB3aG9sZSByYW5nZSBp bnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgdGhlbQo+ICBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgcGZu cyBhcnJheS4KPiAgCj4gLUZvciBpbnN0YW5jZSwgaWYgdGhlIGRldmljZSBmbGFncyBmb3IgcmFu Z2UuZmxhZ3MgYXJlOjoKPiArRm9yIGluc3RhbmNlIGlmIHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRz IHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3QgcmVhZAo+ICtwZXJtaXNzaW9uLCBpdCBz ZXRzOjoKPiAgCj4gLSAgICByYW5nZS5mbGFnc1tITU1fUEZOX1ZBTElEXSA9ICgxIDw8IDYzKTsK PiAtICAgIHJhbmdlLmZsYWdzW0hNTV9QRk5fV1JJVEVdID0gKDEgPDwgNjIpOwo+IC0KPiAtYW5k IHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRzIHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3Qg cmVhZCBwZXJtaXNzaW9uLAo+IC1pdCBzZXRzOjoKPiAtCj4gLSAgICByYW5nZS0+ZGVmYXVsdF9m bGFncyA9ICgxIDw8IDYzKTsKPiArICAgIHJhbmdlLT5kZWZhdWx0X2ZsYWdzID0gSE1NX1BGTl9S RVFfVkFMSUQ7CgpUaGlzIHNob3VsZCBiZSBITU1fUEZOX1JFUV9GQVVMVC4KCgo+ICAgICAgcmFu Z2UtPnBmbl9mbGFnc19tYXNrID0gMDsKPiAgCj4gIGFuZCBjYWxscyBobW1fcmFuZ2VfZmF1bHQo KSBhcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgd2lsbCBmaWxsIGZhdWx0IGFsbCBwYWdlcwo+IEBA IC0yNDYsMTggKzIzOCwxOCBAQCBpbiB0aGUgcmFuZ2Ugd2l0aCBhdCBsZWFzdCByZWFkIHBlcm1p c3Npb24uCj4gIE5vdyBsZXQncyBzYXkgdGhlIGRyaXZlciB3YW50cyB0byBkbyB0aGUgc2FtZSBl eGNlcHQgZm9yIG9uZSBwYWdlIGluIHRoZSByYW5nZSBmb3IKPiAgd2hpY2ggaXQgd2FudHMgdG8g aGF2ZSB3cml0ZSBwZXJtaXNzaW9uLiBOb3cgZHJpdmVyIHNldDo6Cj4gIAo+IC0gICAgcmFuZ2Ut PmRlZmF1bHRfZmxhZ3MgPSAoMSA8PCA2Myk7Cj4gLSAgICByYW5nZS0+cGZuX2ZsYWdzX21hc2sg PSAoMSA8PCA2Mik7Cj4gLSAgICByYW5nZS0+cGZuc1tpbmRleF9vZl93cml0ZV0gPSAoMSA8PCA2 Mik7Cj4gKyAgICByYW5nZS0+ZGVmYXVsdF9mbGFncyA9IEhNTV9QRk5fUkVRX1ZBTElEOwoKSE1N X1BGTl9SRVFfRkFVTFQKClJlZ2FyZHMsCsKgIEZlbGl4CgoKPiArICAgIHJhbmdlLT5wZm5fZmxh Z3NfbWFzayA9IEhNTV9QRk5fUkVRX1dSSVRFOwo+ICsgICAgcmFuZ2UtPnBmbnNbaW5kZXhfb2Zf d3JpdGVdID0gSE1NX1BGTl9SRVFfV1JJVEU7Cj4gIAo+ICBXaXRoIHRoaXMsIEhNTSB3aWxsIGZh dWx0IGluIGFsbCBwYWdlcyB3aXRoIGF0IGxlYXN0IHJlYWQgKGkuZS4sIHZhbGlkKSBhbmQgZm9y IHRoZQo+ICBhZGRyZXNzID09IHJhbmdlLT5zdGFydCArIChpbmRleF9vZl93cml0ZSA8PCBQQUdF X1NISUZUKSBpdCB3aWxsIGZhdWx0IHdpdGgKPiAgd3JpdGUgcGVybWlzc2lvbiBpLmUuLCBpZiB0 aGUgQ1BVIHB0ZSBkb2VzIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gc2V0IHRoZW4gSE1NCj4g IHdpbGwgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKS4KPiAgCj4gLU5vdGUgdGhhdCBITU0gd2lsbCBw b3B1bGF0ZSB0aGUgcGZucyBhcnJheSB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIGFueSBwYWdl Cj4gLXRoYXQgaXMgbWFwcGVkIHdpdGggQ1BVIHdyaXRlIHBlcm1pc3Npb24gbm8gbWF0dGVyIHdo YXQgdmFsdWVzIGFyZSBzZXQKPiAtaW4gZGVmYXVsdF9mbGFncyBvciBwZm5fZmxhZ3NfbWFzay4K PiArQWZ0ZXIgaG1tX3JhbmdlX2ZhdWx0IGNvbXBsZXRlcyB0aGUgZmxhZyBiaXRzIGFyZSBzZXQg dG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YKPiArdGhlIHBhZ2UgdGFibGVzLCBpZSBITU1fUEZOX1ZB TElEIHwgSE1NX1BGTl9XUklURSB3aWxsIGJlIHNldCBpZiB0aGUgcGFnZSBpcwo+ICt3cml0YWJs ZS4KPiAgCj4gIAo+ICBSZXByZXNlbnQgYW5kIG1hbmFnZSBkZXZpY2UgbWVtb3J5IGZyb20gY29y ZSBrZXJuZWwgcG9pbnQgb2Ygdmlldwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVf dHRtLmMKPiBpbmRleCA0NDkwODNmOWY4YTJiZi4uYmNmYThjMjY2NDdkNWUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gQEAgLTc2NiwxNyArNzY2LDYgQEAg c3RydWN0IGFtZGdwdV90dG1fdHQgewo+ICB9Owo+ICAKPiAgI2lmZGVmIENPTkZJR19EUk1fQU1E R1BVX1VTRVJQVFIKPiAtLyogZmxhZ3MgdXNlZCBieSBITU0gaW50ZXJuYWwsIG5vdCByZWxhdGVk IHRvIENQVS9HUFUgUFRFIGZsYWdzICovCj4gLXN0YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFu Z2VfZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQkoMSA8PCAwKSwgLyogSE1NX1BGTl9W QUxJRCAqLwo+IC0JKDEgPDwgMSksIC8qIEhNTV9QRk5fV1JJVEUgKi8KPiAtfTsKPiAtCj4gLXN0 YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFuZ2VfdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFYXSA9 IHsKPiAtCTB4ZmZmZmZmZmZmZmZmZmZmZVVMLCAvKiBITU1fUEZOX0VSUk9SICovCj4gLQkwLCAv KiBITU1fUEZOX05PTkUgKi8KPiAtfTsKPiAtCj4gIC8qKgo+ICAgKiBhbWRncHVfdHRtX3R0X2dl dF91c2VyX3BhZ2VzIC0gZ2V0IGRldmljZSBhY2Nlc3NpYmxlIHBhZ2VzIHRoYXQgYmFjayB1c2Vy Cj4gICAqIG1lbW9yeSBhbmQgc3RhcnQgSE1NIHRyYWNraW5nIENQVSBwYWdlIHRhYmxlIHVwZGF0 ZQo+IEBAIC04MTUsMTggKzgwNCwxNSBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdl cyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCQlnb3RvIG91 dDsKPiAgCX0KPiAgCXJhbmdlLT5ub3RpZmllciA9ICZiby0+bm90aWZpZXI7Cj4gLQlyYW5nZS0+ ZmxhZ3MgPSBobW1fcmFuZ2VfZmxhZ3M7Cj4gLQlyYW5nZS0+dmFsdWVzID0gaG1tX3JhbmdlX3Zh bHVlczsKPiAtCXJhbmdlLT5wZm5fc2hpZnQgPSBQQUdFX1NISUZUOwo+ICAJcmFuZ2UtPnN0YXJ0 ID0gYm8tPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQ7Cj4gIAlyYW5nZS0+ZW5kID0gYm8t Pm5vdGlmaWVyLmludGVydmFsX3RyZWUubGFzdCArIDE7Cj4gLQlyYW5nZS0+ZGVmYXVsdF9mbGFn cyA9IGhtbV9yYW5nZV9mbGFnc1tITU1fUEZOX1ZBTElEXTsKPiArCXJhbmdlLT5kZWZhdWx0X2Zs YWdzID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gIAlpZiAoIWFtZGdwdV90dG1fdHRfaXNfcmVhZG9u bHkodHRtKSkKPiAtCQlyYW5nZS0+ZGVmYXVsdF9mbGFncyB8PSByYW5nZS0+ZmxhZ3NbSE1NX1BG Tl9XUklURV07Cj4gKwkJcmFuZ2UtPmRlZmF1bHRfZmxhZ3MgfD0gSE1NX1BGTl9SRVFfV1JJVEU7 Cj4gIAo+IC0JcmFuZ2UtPnBmbnMgPSBrdm1hbGxvY19hcnJheSh0dG0tPm51bV9wYWdlcywgc2l6 ZW9mKCpyYW5nZS0+cGZucyksCj4gLQkJCQkgICAgIEdGUF9LRVJORUwpOwo+IC0JaWYgKHVubGlr ZWx5KCFyYW5nZS0+cGZucykpIHsKPiArCXJhbmdlLT5obW1fcGZucyA9IGt2bWFsbG9jX2FycmF5 KHR0bS0+bnVtX3BhZ2VzLAo+ICsJCQkJCSBzaXplb2YoKnJhbmdlLT5obW1fcGZucyksIEdGUF9L RVJORUwpOwo+ICsJaWYgKHVubGlrZWx5KCFyYW5nZS0+aG1tX3BmbnMpKSB7Cj4gIAkJciA9IC1F Tk9NRU07Cj4gIAkJZ290byBvdXRfZnJlZV9yYW5nZXM7Cj4gIAl9Cj4gQEAgLTg2Nyw3ICs4NTMs NyBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpi bywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCSAqIHRoZSBub3RpZmllcl9sb2NrLCBhbmQgbW11 X2ludGVydmFsX3JlYWRfcmV0cnkoKSBtdXN0IGJlIGRvbmUgZmlyc3QuCj4gIAkgKi8KPiAgCWZv ciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKQo+IC0JCXBhZ2VzW2ldID0gaG1tX2Rl dmljZV9lbnRyeV90b19wYWdlKHJhbmdlLCByYW5nZS0+cGZuc1tpXSk7Cj4gKwkJcGFnZXNbaV0g PSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiAgCj4gIAlndHQtPnJhbmdl ID0gcmFuZ2U7Cj4gIAltbXB1dChtbSk7Cj4gQEAgLTg3Nyw3ICs4NjMsNyBAQCBpbnQgYW1kZ3B1 X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2Ug KipwYWdlcykKPiAgb3V0X3VubG9jazoKPiAgCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIG91 dF9mcmVlX3BmbnM6Cj4gLQlrdmZyZWUocmFuZ2UtPnBmbnMpOwo+ICsJa3ZmcmVlKHJhbmdlLT5o bW1fcGZucyk7Cj4gIG91dF9mcmVlX3JhbmdlczoKPiAgCWtmcmVlKHJhbmdlKTsKPiAgb3V0Ogo+ IEBAIC05MDIsNyArODg4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJRFJNX0RFQlVHX0RSSVZFUigidXNlcl9wYWdlc19k b25lIDB4JWxseCBwYWdlcyAweCVseFxuIiwKPiAgCQlndHQtPnVzZXJwdHIsIHR0bS0+bnVtX3Bh Z2VzKTsKPiAgCj4gLQlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPnBmbnMs Cj4gKwlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPmhtbV9wZm5zLAo+ICAJ CSJObyB1c2VyIHBhZ2VzIHRvIGNoZWNrXG4iKTsKPiAgCj4gIAlpZiAoZ3R0LT5yYW5nZSkgewo+ IEBAIC05MTIsNyArODk4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJCSAqLwo+ICAJCXIgPSBtbXVfaW50ZXJ2YWxfcmVh ZF9yZXRyeShndHQtPnJhbmdlLT5ub3RpZmllciwKPiAgCQkJCQkgZ3R0LT5yYW5nZS0+bm90aWZp ZXJfc2VxKTsKPiAtCQlrdmZyZWUoZ3R0LT5yYW5nZS0+cGZucyk7Cj4gKwkJa3ZmcmVlKGd0dC0+ cmFuZ2UtPmhtbV9wZm5zKTsKPiAgCQlrZnJlZShndHQtPnJhbmdlKTsKPiAgCQlndHQtPnJhbmdl ID0gTlVMTDsKPiAgCX0KPiBAQCAtMTAwMyw4ICs5ODksNyBAQCBzdGF0aWMgdm9pZCBhbWRncHVf dHRtX3R0X3VucGluX3VzZXJwdHIoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAKPiAgCQlmb3IgKGkg PSAwOyBpIDwgdHRtLT5udW1fcGFnZXM7IGkrKykgewo+ICAJCQlpZiAodHRtLT5wYWdlc1tpXSAh PQo+IC0JCQkJaG1tX2RldmljZV9lbnRyeV90b19wYWdlKGd0dC0+cmFuZ2UsCj4gLQkJCQkJICAg ICAgZ3R0LT5yYW5nZS0+cGZuc1tpXSkpCj4gKwkJCSAgICBobW1fcGZuX3RvX3BhZ2UoZ3R0LT5y YW5nZS0+aG1tX3BmbnNbaV0pKQo+ICAJCQkJYnJlYWs7Cj4gIAkJfQo+ICAKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmMgYi9kcml2ZXJzL2dwdS9k cm0vbm91dmVhdS9ub3V2ZWF1X2RtZW0uYwo+IGluZGV4IGFkODllMDlhMGJlMzlhLi4wNzg3NmZi MGUxZDY2NSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rt ZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5jCj4gQEAg LTY3MiwyNyArNjcyLDYxIEBAIG5vdXZlYXVfZG1lbV9taWdyYXRlX3ZtYShzdHJ1Y3Qgbm91dmVh dV9kcm0gKmRybSwKPiAgCXJldHVybiByZXQ7Cj4gIH0KPiAgCj4gLXZvaWQKPiAtbm91dmVhdV9k bWVtX2NvbnZlcnRfcGZuKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+IC0JCQkgc3RydWN0IGht bV9yYW5nZSAqcmFuZ2UpCj4gK3ZvaWQgbm91dmVhdV9obW1fY29udmVydF9wZm4oc3RydWN0IG5v dXZlYXVfZHJtICpkcm0sIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkgICAgIHU2NCAq aW9jdGxfYWRkcikKPiAgewo+ICAJdW5zaWduZWQgbG9uZyBpLCBucGFnZXM7Cj4gIAo+ICsJLyoK PiArCSAqIFRoZSBpb2N0bF9hZGRyIHByZXBhcmVkIGhlcmUgaXMgcGFzc2VkIHRocm91Z2ggbnZp Zl9vYmplY3RfaW9jdGwoKQo+ICsJICogdG8gYW4gZXZlbnR1YWwgRE1BIG1hcCBvbiBzb21lIGNh bGwgY2hhaW4gbGlrZToKPiArCSAqICAgIG5vdXZlYXVfc3ZtX2ZhdWx0KCk6Cj4gKwkgKiAgICAg IGFyZ3MuaS5tLm1ldGhvZCA9IE5WSUZfVk1NX1YwX1BGTk1BUAo+ICsJICogICAgICBub3V2ZWF1 X3JhbmdlX2ZhdWx0KCkKPiArCSAqICAgICAgIG52aWZfb2JqZWN0X2lvY3RsKCkKPiArCSAqICAg ICAgICBjbGllbnQtPmRyaXZlci0+aW9jdGwoKQo+ICsJICogICAgICAgICAgIHN0cnVjdCBudmlm X2RyaXZlciBudmlmX2RyaXZlcl9udmttOgo+ICsJICogICAgICAgICAgICAgLmlvY3RsID0gbnZr bV9jbGllbnRfaW9jdGwKPiArCSAqICAgICAgICAgICAgbnZrbV9pb2N0bCgpCj4gKwkgKiAgICAg ICAgICAgICBudmttX2lvY3RsX3BhdGgoKQo+ICsJICogICAgICAgICAgICAgICBudmttX2lvY3Rs X3YwW3R5cGVdLmZ1bmMoLi4pCj4gKwkgKiAgICAgICAgICAgICAgIG52a21faW9jdGxfbXRoZCgp Cj4gKwkgKiAgICAgICAgICAgICAgICBudmttX29iamVjdF9tdGhkKCkKPiArCSAqICAgICAgICAg ICAgICAgICAgIHN0cnVjdCBudmttX29iamVjdF9mdW5jIG52a21fdXZtbToKPiArCSAqICAgICAg ICAgICAgICAgICAgICAgLm10aGQgPSBudmttX3V2bW1fbXRoZAo+ICsJICogICAgICAgICAgICAg ICAgICAgIG52a21fdXZtbV9tdGhkKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgbnZrbV91 dm1tX210aGRfcGZubWFwKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3Bm bl9tYXAoKQo+ICsJICogICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3B0ZXNfZ2V0X21h cCgpCj4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPT0gZ3AxMDBfdm1tX3BndF9w Zm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudmttX3ZtbV9kZXNjX2Z1 bmMgZ3AxMDBfdm1tX2Rlc2Nfc3B0Ogo+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAu cGZuID0gZ3AxMDBfdm1tX3BndF9wZm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBu dmttX3ZtbV9pdGVyKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1BURVMg PT0gZnVuYyA9PSBncDEwMF92bW1fcGd0X3BmbigpCj4gKwkgKgkJCSAgICAgIGRtYV9tYXBfcGFn ZSgpCj4gKwkgKgo+ICsJICogVGhpcyBpcyBhbGwganVzdCBlbmNvZGluZyB0aGUgaW50ZXJuYWwg aG1tIHJlcHJlbnNldGF0aW9uIGludG8gYQo+ICsJICogZGlmZmVyZW50IG5vdXZlYXUgaW50ZXJu YWwgcmVwcmVzZW50YXRpb24uCj4gKwkgKi8KPiAgCW5wYWdlcyA9IChyYW5nZS0+ZW5kIC0gcmFu Z2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytp KSB7Cj4gIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Cj4gLQkJdWludDY0X3QgYWRkcjsKPiAgCj4gLQkJ cGFnZSA9IGhtbV9kZXZpY2VfZW50cnlfdG9fcGFnZShyYW5nZSwgcmFuZ2UtPnBmbnNbaV0pOwo+ IC0JCWlmIChwYWdlID09IE5VTEwpCj4gLQkJCWNvbnRpbnVlOwo+IC0KPiAtCQlpZiAoIWlzX2Rl dmljZV9wcml2YXRlX3BhZ2UocGFnZSkpCj4gKwkJaWYgKCEocmFuZ2UtPmhtbV9wZm5zW2ldICYg SE1NX1BGTl9WQUxJRCkpIHsKPiArCQkJaW9jdGxfYWRkcltpXSA9IDA7Cj4gIAkJCWNvbnRpbnVl Owo+ICsJCX0KPiAgCj4gLQkJYWRkciA9IG5vdXZlYXVfZG1lbV9wYWdlX2FkZHIocGFnZSk7Cj4g LQkJcmFuZ2UtPnBmbnNbaV0gJj0gKCgxVUwgPDwgcmFuZ2UtPnBmbl9zaGlmdCkgLSAxKTsKPiAt CQlyYW5nZS0+cGZuc1tpXSB8PSAoYWRkciA+PiBQQUdFX1NISUZUKSA8PCByYW5nZS0+cGZuX3No aWZ0Owo+IC0JCXJhbmdlLT5wZm5zW2ldIHw9IE5WSUZfVk1NX1BGTk1BUF9WMF9WUkFNOwo+ICsJ CXBhZ2UgPSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiArCQlpZiAoaXNf ZGV2aWNlX3ByaXZhdGVfcGFnZShwYWdlKSkKPiArCQkJaW9jdGxfYWRkcltpXSA9IG5vdXZlYXVf ZG1lbV9wYWdlX2FkZHIocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwKPiAr CQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfVlJBTTsKPiArCQllbHNlCj4gKwkJCWlvY3RsX2FkZHJb aV0gPSBwYWdlX3RvX3BoeXMocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwK PiArCQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfSE9TVDsKPiArCQlpZiAocmFuZ2UtPmhtbV9wZm5z W2ldICYgSE1NX1BGTl9XUklURSkKPiArCQkJaW9jdGxfYWRkcltpXSB8PSBOVklGX1ZNTV9QRk5N QVBfVjBfVzsKPiAgCX0KPiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVh dS9ub3V2ZWF1X2RtZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5o Cj4gaW5kZXggOTIzOTRiZTVkNjQ5MjMuLjQ2MDdjMGJlN2RkMDYyIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5oCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmgKPiBAQCAtMzgsOCArMzgsOCBAQCBpbnQgbm91dmVh dV9kbWVtX21pZ3JhdGVfdm1hKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+ICAJCQkgICAgIHVu c2lnbmVkIGxvbmcgc3RhcnQsCj4gIAkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpOwo+ICAKPiAt dm9pZCBub3V2ZWF1X2RtZW1fY29udmVydF9wZm4oc3RydWN0IG5vdXZlYXVfZHJtICpkcm0sCj4g LQkJCSAgICAgIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlKTsKPiArdm9pZCBub3V2ZWF1X2htbV9j b252ZXJ0X3BmbihzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSwgc3RydWN0IGhtbV9yYW5nZSAqcmFu Z2UsCj4gKwkJCSAgICAgdTY0ICppb2N0bF9hZGRyKTsKPiAgI2Vsc2UgLyogSVNfRU5BQkxFRChD T05GSUdfRFJNX05PVVZFQVVfU1ZNKSAqLwo+ICBzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9k bWVtX2luaXQoc3RydWN0IG5vdXZlYXVfZHJtICpkcm0pIHt9Cj4gIHN0YXRpYyBpbmxpbmUgdm9p ZCBub3V2ZWF1X2RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSkge30KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdm0uYyBiL2RyaXZlcnMvZ3B1 L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBpbmRleCBjZjBkOWJkNjFiZWJmOS4uZDEwNTli Y2UwOTExOTIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9z dm0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBAQCAt MzY5LDE4ICszNjksNiBAQCBub3V2ZWF1X3N2bW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB2b2lkICpkYXRhLAo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiAtc3RhdGljIGNvbnN0IHU2 NAo+IC1ub3V2ZWF1X3N2bV9wZm5fZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQlbSE1N X1BGTl9WQUxJRCAgICAgICAgIF0gPSBOVklGX1ZNTV9QRk5NQVBfVjBfViwKPiAtCVtITU1fUEZO X1dSSVRFICAgICAgICAgXSA9IE5WSUZfVk1NX1BGTk1BUF9WMF9XLAo+IC19Owo+IC0KPiAtc3Rh dGljIGNvbnN0IHU2NAo+IC1ub3V2ZWF1X3N2bV9wZm5fdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFY XSA9IHsKPiAtCVtITU1fUEZOX0VSUk9SICBdID0gfk5WSUZfVk1NX1BGTk1BUF9WMF9WLAo+IC0J W0hNTV9QRk5fTk9ORSAgIF0gPSAgTlZJRl9WTU1fUEZOTUFQX1YwX05PTkUsCj4gLX07Cj4gLQo+ ICAvKiBJc3N1ZSBmYXVsdCByZXBsYXkgZm9yIEdQVSB0byByZXRyeSBhY2Nlc3NlcyB0aGF0IGZh dWx0ZWQgcHJldmlvdXNseS4gKi8KPiAgc3RhdGljIHZvaWQKPiAgbm91dmVhdV9zdm1fZmF1bHRf cmVwbGF5KHN0cnVjdCBub3V2ZWF1X3N2bSAqc3ZtKQo+IEBAIC01MjAsNyArNTA4LDggQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBtbXVfaW50ZXJ2YWxfbm90aWZpZXJfb3BzIG5vdXZlYXVfc3ZtX21u aV9vcHMgPSB7Cj4gIAo+ICBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQoc3RydWN0IG5v dXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLCB2 b2lkICpkYXRhLCB1MzIgc2l6ZSwKPiAtCQkJICAgICAgIHU2NCAqcGZucywgc3RydWN0IHN2bV9u b3RpZmllciAqbm90aWZpZXIpCj4gKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGhtbV9wZm5zW10s IHU2NCAqaW9jdGxfYWRkciwKPiArCQkJICAgICAgIHN0cnVjdCBzdm1fbm90aWZpZXIgKm5vdGlm aWVyKQo+ICB7Cj4gIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPQo+ICAJCWppZmZpZXMgKyBtc2Vj c190b19qaWZmaWVzKEhNTV9SQU5HRV9ERUZBVUxUX1RJTUVPVVQpOwo+IEBAIC01MjksMTAgKzUx OCw4IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVsdChzdHJ1Y3Qgbm91dmVhdV9zdm1t ICpzdm1tLAo+ICAJCS5ub3RpZmllciA9ICZub3RpZmllci0+bm90aWZpZXIsCj4gIAkJLnN0YXJ0 ID0gbm90aWZpZXItPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQsCj4gIAkJLmVuZCA9IG5v dGlmaWVyLT5ub3RpZmllci5pbnRlcnZhbF90cmVlLmxhc3QgKyAxLAo+IC0JCS5wZm5zID0gcGZu cywKPiAtCQkuZmxhZ3MgPSBub3V2ZWF1X3N2bV9wZm5fZmxhZ3MsCj4gLQkJLnZhbHVlcyA9IG5v dXZlYXVfc3ZtX3Bmbl92YWx1ZXMsCj4gLQkJLnBmbl9zaGlmdCA9IE5WSUZfVk1NX1BGTk1BUF9W MF9BRERSX1NISUZULAo+ICsJCS5wZm5fZmxhZ3NfbWFzayA9IEhNTV9QRk5fUkVRX0ZBVUxUIHwg SE1NX1BGTl9SRVFfV1JJVEUsCj4gKwkJLmhtbV9wZm5zID0gaG1tX3BmbnMsCj4gIAl9Owo+ICAJ c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBub3RpZmllci0+bm90aWZpZXIubW07Cj4gIAlpbnQgcmV0 Owo+IEBAIC01NDIsMTIgKzUyOSwxNSBAQCBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQo c3RydWN0IG5vdXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJcmV0dXJuIC1FQlVTWTsKPiAgCj4gIAkJ cmFuZ2Uubm90aWZpZXJfc2VxID0gbW11X2ludGVydmFsX3JlYWRfYmVnaW4ocmFuZ2Uubm90aWZp ZXIpOwo+IC0JCXJhbmdlLmRlZmF1bHRfZmxhZ3MgPSAwOwo+IC0JCXJhbmdlLnBmbl9mbGFnc19t YXNrID0gLTFVTDsKPiAgCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIAkJcmV0ID0gaG1t X3JhbmdlX2ZhdWx0KCZyYW5nZSk7Cj4gIAkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKPiAgCQlp ZiAocmV0KSB7Cj4gKwkJCS8qCj4gKwkJCSAqIEZJWE1FOiB0aGUgaW5wdXQgUEZOX1JFUSBmbGFn cyBhcmUgZGVzdHJveWVkIG9uCj4gKwkJCSAqIC1FQlVTWSwgd2UgbmVlZCB0byByZWdlbmVyYXRl IHRoZW0sIGFsc28gZm9yIHRoZQo+ICsJCQkgKiBvdGhlciBjb250aW51ZSBiZWxvdwo+ICsJCQkg Ki8KPiAgCQkJaWYgKHJldCA9PSAtRUJVU1kpCj4gIAkJCQljb250aW51ZTsKPiAgCQkJcmV0dXJu IHJldDsKPiBAQCAtNTYyLDcgKzU1Miw3IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVs dChzdHJ1Y3Qgbm91dmVhdV9zdm1tICpzdm1tLAo+ICAJCWJyZWFrOwo+ICAJfQo+ICAKPiAtCW5v dXZlYXVfZG1lbV9jb252ZXJ0X3Bmbihkcm0sICZyYW5nZSk7Cj4gKwlub3V2ZWF1X2htbV9jb252 ZXJ0X3Bmbihkcm0sICZyYW5nZSwgaW9jdGxfYWRkcik7Cj4gIAo+ICAJc3ZtbS0+dm1tLT52bW0u b2JqZWN0LmNsaWVudC0+c3VwZXIgPSB0cnVlOwo+ICAJcmV0ID0gbnZpZl9vYmplY3RfaW9jdGwo JnN2bW0tPnZtbS0+dm1tLm9iamVjdCwgZGF0YSwgc2l6ZSwgTlVMTCk7Cj4gQEAgLTU4OSw2ICs1 NzksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlmeSkKPiAg CQl9IGk7Cj4gIAkJdTY0IHBoeXNbMTZdOwo+ICAJfSBhcmdzOwo+ICsJdW5zaWduZWQgbG9uZyBo bW1fcGZuc1tBUlJBWV9TSVpFKGFyZ3MucGh5cyldOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWE7Cj4gIAl1NjQgaW5zdCwgc3RhcnQsIGxpbWl0Owo+ICAJaW50IGZpLCBmbiwgcGksIGZp bGw7Cj4gQEAgLTcwNCwxMiArNjk1LDE3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlm X25vdGlmeSAqbm90aWZ5KQo+ICAJCQkgKiBhY2Nlc3MgZmxhZ3MuCj4gIAkJCSAqWFhYOiBhdG9t aWM/Cj4gIAkJCSAqLwo+IC0JCQlpZiAoYnVmZmVyLT5mYXVsdFtmbl0tPmFjY2VzcyAhPSAwIC8q IFJFQUQuICovICYmCj4gLQkJCSAgICBidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzICE9IDMgLyog UFJFRkVUQ0guICovKSB7Cj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBf VjBfViB8Cj4gLQkJCQkJCSAgTlZJRl9WTU1fUEZOTUFQX1YwX1c7Cj4gLQkJCX0gZWxzZSB7Cj4g LQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfVjsKPiArCQkJc3dpdGNo IChidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzKSB7Cj4gKwkJCWNhc2UgMDogLyogUkVBRC4gKi8K PiArCQkJCWhtbV9wZm5zW3BpKytdID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gKwkJCQlicmVhazsK PiArCQkJY2FzZSAzOiAvKiBQUkVGRVRDSC4gKi8KPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsK PiArCQkJCWJyZWFrOwo+ICsJCQlkZWZhdWx0Ogo+ICsJCQkJaG1tX3BmbnNbcGkrK10gPSBITU1f UEZOX1JFUV9GQVVMVCB8Cj4gKwkJCQkJCSBITU1fUEZOX1JFUV9XUklURTsKPiArCQkJCWJyZWFr Owo+ICAJCQl9Cj4gIAkJCWFyZ3MuaS5wLnNpemUgPSBwaSA8PCBQQUdFX1NISUZUOwo+ICAKPiBA QCAtNzM3LDcgKzczMyw3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlmX25vdGlmeSAq bm90aWZ5KQo+ICAJCQlmaWxsID0gKGJ1ZmZlci0+ZmF1bHRbZm4gICAgXS0+YWRkciAtCj4gIAkJ CQlidWZmZXItPmZhdWx0W2ZuIC0gMV0tPmFkZHIpID4+IFBBR0VfU0hJRlQ7Cj4gIAkJCXdoaWxl ICgtLWZpbGwpCj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfTk9O RTsKPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsKPiAgCQl9Cj4gIAo+ICAJCVNWTU1fREJHKHN2 bW0sICJ3bmR3ICUwMTZsbHgtJTAxNmxseCBjb3ZlcmluZyAlZCBmYXVsdChzKSIsCj4gQEAgLTc1 Myw3ICs3NDksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlm eSkKPiAgCQkJcmV0ID0gbm91dmVhdV9yYW5nZV9mYXVsdCgKPiAgCQkJCXN2bW0sIHN2bS0+ZHJt LCAmYXJncywKPiAgCQkJCXNpemVvZihhcmdzLmkpICsgcGkgKiBzaXplb2YoYXJncy5waHlzWzBd KSwKPiAtCQkJCWFyZ3MucGh5cywgJm5vdGlmaWVyKTsKPiArCQkJCWhtbV9wZm5zLCBhcmdzLnBo eXMsICZub3RpZmllcik7Cj4gIAkJCW1tdV9pbnRlcnZhbF9ub3RpZmllcl9yZW1vdmUoJm5vdGlm aWVyLm5vdGlmaWVyKTsKPiAgCQl9Cj4gIAkJbW1wdXQobW0pOwo+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2htbS5oIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IGluZGV4IDgxYzMwMmM4ODRj MGUzLi5lNzI1Mjk3ODZmMTZmOCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2htbS5oCj4g KysrIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IEBAIC0xOSw0NSArMTksNDUgQEAKPiAgI2luY2x1 ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl9mbGFnX2Ug LSBITU0gZmxhZyBlbnVtcwo+ICsgKiBPbiBvdXRwdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgLSBU aGUgcGFnZSBpcyBmYXVsdGFibGUgYW5kIGEgZnV0dXJlIGNhbGwgd2l0aCAKPiArICogICAgICAg ICAgICAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUIGNvdWxkIHN1Y2NlZWQuCj4gKyAqIEhNTV9QRk5f VkFMSUQgLSB0aGUgcGZuIGZpZWxkIHBvaW50cyB0byBhIHZhbGlkIFBGTi4gVGhpcyBQRk4gaXMg YXQKPiArICogICAgICAgICAgICAgICAgIGxlYXN0IHJlYWRhYmxlLiBJZiBkZXZfcHJpdmF0ZV9v d25lciBpcyAhTlVMTCB0aGVuIHRoaXMgY291bGQKPiArICogICAgICAgICAgICAgICAgIHBvaW50 IGF0IGEgREVWSUNFX1BSSVZBVEUgcGFnZS4KPiArICogSE1NX1BGTl9XUklURSAtIGlmIHRoZSBw YWdlIG1lbW9yeSBjYW4gYmUgd3JpdHRlbiB0byAocmVxdWlyZXMgSE1NX1BGTl9WQUxJRCkKPiAr ICogSE1NX1BGTl9FUlJPUiAtIGFjY2Vzc2luZyB0aGUgcGZuIGlzIGltcG9zc2libGUgYW5kIHRo ZSBkZXZpY2Ugc2hvdWxkCj4gKyAqICAgICAgICAgICAgICAgICBmYWlsLiBpZSBwb2lzb25lZCBt ZW1vcnksIHNwZWNpYWwgcGFnZXMsIG5vIHZtYSwgZXRjCj4gICAqCj4gLSAqIEZsYWdzOgo+IC0g KiBITU1fUEZOX1ZBTElEOiBwZm4gaXMgdmFsaWQuIEl0IGhhcywgYXQgbGVhc3QsIHJlYWQgcGVy bWlzc2lvbi4KPiAtICogSE1NX1BGTl9XUklURTogQ1BVIHBhZ2UgdGFibGUgaGFzIHdyaXRlIHBl cm1pc3Npb24gc2V0Cj4gLSAqCj4gLSAqIFRoZSBkcml2ZXIgcHJvdmlkZXMgYSBmbGFncyBhcnJh eSBmb3IgbWFwcGluZyBwYWdlIHByb3RlY3Rpb25zIHRvIGRldmljZQo+IC0gKiBQVEUgYml0cy4g SWYgdGhlIGRyaXZlciB2YWxpZCBiaXQgZm9yIGFuIGVudHJ5IGlzIGJpdCAzLAo+IC0gKiBpLmUu LCAoZW50cnkgJiAoMSA8PCAzKSksIHRoZW4gdGhlIGRyaXZlciBtdXN0IHByb3ZpZGUKPiAtICog YW4gYXJyYXkgaW4gaG1tX3JhbmdlLmZsYWdzIHdpdGggaG1tX3JhbmdlLmZsYWdzW0hNTV9QRk5f VkFMSURdID09IDEgPDwgMy4KPiAtICogU2FtZSBsb2dpYyBhcHBseSB0byBhbGwgZmxhZ3MuIFRo aXMgaXMgdGhlIHNhbWUgaWRlYSBhcyB2bV9wYWdlX3Byb3QgaW4gdm1hCj4gLSAqIGV4Y2VwdCB0 aGF0IHRoaXMgaXMgcGVyIGRldmljZSBkcml2ZXIgcmF0aGVyIHRoYW4gcGVyIGFyY2hpdGVjdHVy ZS4KPiArICogT24gaW5wdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgICAgIC0gUmV0dXJuIHRoZSBj dXJyZW50IHN0YXRlIG9mIHRoZSBwYWdlLCBkbyBub3QgZmF1bHQgaXQuCj4gKyAqIEhNTV9QRk5f UkVRX0ZBVUxUIC0gVGhlIG91dHB1dCBtdXN0IGhhdmUgSE1NX1BGTl9WQUxJRCBvciBobW1fcmFu Z2VfZmF1bHQoKQo+ICsgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgZmFpbAo+ICsgKiBITU1f UEZOX1JFUV9XUklURSAtIFRoZSBvdXRwdXQgbXVzdCBoYXZlIEhNTV9QRk5fV1JJVEUgb3IgaG1t X3JhbmdlX2ZhdWx0KCkKPiArICogICAgICAgICAgICAgICAgICAgICB3aWxsIGZhaWwuIE11c3Qg YmUgY29tYmluZWQgd2l0aCBITU1fUEZOX1JFUV9GQVVMVC4KPiAgICovCj4gLWVudW0gaG1tX3Bm bl9mbGFnX2Ugewo+IC0JSE1NX1BGTl9WQUxJRCA9IDAsCj4gLQlITU1fUEZOX1dSSVRFLAo+IC0J SE1NX1BGTl9GTEFHX01BWAo+ICtlbnVtIGhtbV9wZm5fZmxhZ3Mgewo+ICsJSE1NX1BGTl9WQUxJ RCA9IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIDEpLAo+ICsJSE1NX1BGTl9XUklURSA9IDFVTCA8 PCAoQklUU19QRVJfTE9ORyAtIDIpLAo+ICsJSE1NX1BGTl9FUlJPUiA9IDFVTCA8PCAoQklUU19Q RVJfTE9ORyAtIDMpLAo+ICsKPiArCUhNTV9QRk5fUkVRX0ZBVUxUID0gSE1NX1BGTl9WQUxJRCwK PiArCUhNTV9QRk5fUkVRX1dSSVRFID0gSE1NX1BGTl9XUklURSwKPiArCj4gKwlITU1fUEZOX0ZM QUdTID0gSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUgfCBITU1fUEZOX0VSUk9SLAo+ICB9 Owo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl92YWx1ZV9lIC0gSE1NIHBmbiBzcGVjaWFsIHZhbHVl Cj4gLSAqCj4gLSAqIEZsYWdzOgo+IC0gKiBITU1fUEZOX0VSUk9SOiBjb3JyZXNwb25kaW5nIENQ VSBwYWdlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBwb2lzb25lZCBtZW1vcnkKPiAtICogSE1NX1BG Tl9OT05FOiBjb3JyZXNwb25kaW5nIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHB0ZV9ub25lKCkK PiArICogaG1tX3Bmbl90b19wYWdlKCkgLSByZXR1cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBi eSBhIGRldmljZSBlbnRyeQo+ICAgKgo+IC0gKiBEcml2ZXIgcHJvdmlkZXMgdmFsdWVzIGZvciBu b25lIGVudHJ5LCBlcnJvciBlbnRyeSwgYW5kIHNwZWNpYWwgZW50cnkuCj4gLSAqIERyaXZlciBj YW4gYWxpYXMgKGkuZS4sIHVzZSBzYW1lIHZhbHVlKSBlcnJvciBhbmQgc3BlY2lhbCwgYnV0Cj4g LSAqIGl0IHNob3VsZCBub3QgYWxpYXMgbm9uZSB3aXRoIGVycm9yIG9yIHNwZWNpYWwuCj4gLSAq Cj4gLSAqIEhNTSBwZm4gdmFsdWUgcmV0dXJuZWQgYnkgaG1tX3ZtYV9nZXRfcGZucygpIG9yIGht bV92bWFfZmF1bHQoKSB3aWxsIGJlOgo+IC0gKiBobW1fcmFuZ2UudmFsdWVzW0hNTV9QRk5fRVJS T1JdIGlmIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHBvaXNvbm91cywKPiAtICogaG1tX3Jhbmdl LnZhbHVlc1tITU1fUEZOX05PTkVdIGlmIHRoZXJlIGlzIG5vIENQVSBwYWdlIHRhYmxlIGVudHJ5 LAo+ICsgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBjYWxsZXIgJ3VzZXJfbG9jaycg YWZ0ZXIgYSBzdWNjZXNzZnVsCj4gKyAqIG1tdV9pbnRlcnZhbF9yZWFkX2JlZ2luKCkuIFRoZSBj YWxsZXIgbXVzdCBoYXZlIHRlc3RlZCBmb3IgSE1NX1BGTl9WQUxJRAo+ICsgKiBhbHJlYWR5Lgo+ ICAgKi8KPiAtZW51bSBobW1fcGZuX3ZhbHVlX2Ugewo+IC0JSE1NX1BGTl9FUlJPUiwKPiAtCUhN TV9QRk5fTk9ORSwKPiAtCUhNTV9QRk5fVkFMVUVfTUFYCj4gLX07Cj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHBhZ2UgKmhtbV9wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIGhtbV9wZm4pCj4gK3sK PiArCXJldHVybiBwZm5fdG9fcGFnZShobW1fcGZuICYgfkhNTV9QRk5fRkxBR1MpOwo+ICt9Cj4g IAo+ICAvKgo+ICAgKiBzdHJ1Y3QgaG1tX3JhbmdlIC0gdHJhY2sgaW52YWxpZGF0aW9uIGxvY2sg b24gdmlydHVhbCBhZGRyZXNzIHJhbmdlCj4gQEAgLTY2LDEyICs2Niw5IEBAIGVudW0gaG1tX3Bm bl92YWx1ZV9lIHsKPiAgICogQG5vdGlmaWVyX3NlcTogcmVzdWx0IG9mIG1tdV9pbnRlcnZhbF9y ZWFkX2JlZ2luKCkKPiAgICogQHN0YXJ0OiByYW5nZSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MgKGlu Y2x1c2l2ZSkKPiAgICogQGVuZDogcmFuZ2UgdmlydHVhbCBlbmQgYWRkcmVzcyAoZXhjbHVzaXZl KQo+IC0gKiBAcGZuczogYXJyYXkgb2YgcGZucyAoYmlnIGVub3VnaCBmb3IgdGhlIHJhbmdlKQo+ IC0gKiBAZmxhZ3M6IHBmbiBmbGFncyB0byBtYXRjaCBkZXZpY2UgZHJpdmVyIHBhZ2UgdGFibGUK PiAtICogQHZhbHVlczogcGZuIHZhbHVlIGZvciBzb21lIHNwZWNpYWwgY2FzZSAobm9uZSwgc3Bl Y2lhbCwgZXJyb3IsIC4uLikKPiArICogQGhtbV9wZm5zOiBhcnJheSBvZiBwZm5zIChiaWcgZW5v dWdoIGZvciB0aGUgcmFuZ2UpCj4gICAqIEBkZWZhdWx0X2ZsYWdzOiBkZWZhdWx0IGZsYWdzIGZv ciB0aGUgcmFuZ2UgKHdyaXRlLCByZWFkLCAuLi4gc2VlIGhtbSBkb2MpCj4gICAqIEBwZm5fZmxh Z3NfbWFzazogYWxsb3dzIHRvIG1hc2sgcGZuIGZsYWdzIHNvIHRoYXQgb25seSBkZWZhdWx0X2Zs YWdzIG1hdHRlcgo+IC0gKiBAcGZuX3NoaWZ0OiBwZm4gc2hpZnQgdmFsdWUgKHNob3VsZCBiZSA8 PSBQQUdFX1NISUZUKQo+ICAgKiBAZGV2X3ByaXZhdGVfb3duZXI6IG93bmVyIG9mIGRldmljZSBw cml2YXRlIHBhZ2VzCj4gICAqLwo+ICBzdHJ1Y3QgaG1tX3JhbmdlIHsKPiBAQCAtNzksMzYgKzc2 LDEyIEBAIHN0cnVjdCBobW1fcmFuZ2Ugewo+ICAJdW5zaWduZWQgbG9uZwkJbm90aWZpZXJfc2Vx Owo+ICAJdW5zaWduZWQgbG9uZwkJc3RhcnQ7Cj4gIAl1bnNpZ25lZCBsb25nCQllbmQ7Cj4gLQl1 aW50NjRfdAkJKnBmbnM7Cj4gLQljb25zdCB1aW50NjRfdAkJKmZsYWdzOwo+IC0JY29uc3QgdWlu dDY0X3QJCSp2YWx1ZXM7Cj4gLQl1aW50NjRfdAkJZGVmYXVsdF9mbGFnczsKPiAtCXVpbnQ2NF90 CQlwZm5fZmxhZ3NfbWFzazsKPiAtCXVpbnQ4X3QJCQlwZm5fc2hpZnQ7Cj4gKwl1bnNpZ25lZCBs b25nCQkqaG1tX3BmbnM7Cj4gKwl1bnNpZ25lZCBsb25nCQlkZWZhdWx0X2ZsYWdzOwo+ICsJdW5z aWduZWQgbG9uZwkJcGZuX2ZsYWdzX21hc2s7Cj4gIAl2b2lkCQkJKmRldl9wcml2YXRlX293bmVy Owo+ICB9Owo+ICAKPiAtLyoKPiAtICogaG1tX2RldmljZV9lbnRyeV90b19wYWdlKCkgLSByZXR1 cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBieSBhIGRldmljZSBlbnRyeQo+IC0gKiBAcmFuZ2U6 IHJhbmdlIHVzZSB0byBkZWNvZGUgZGV2aWNlIGVudHJ5IHZhbHVlCj4gLSAqIEBlbnRyeTogZGV2 aWNlIGVudHJ5IHZhbHVlIHRvIGdldCBjb3JyZXNwb25kaW5nIHN0cnVjdCBwYWdlIGZyb20KPiAt ICogUmV0dXJuOiBzdHJ1Y3QgcGFnZSBwb2ludGVyIGlmIGVudHJ5IGlzIGEgdmFsaWQsIE5VTEwg b3RoZXJ3aXNlCj4gLSAqCj4gLSAqIElmIHRoZSBkZXZpY2UgZW50cnkgaXMgdmFsaWQgKGllIHZh bGlkIGZsYWcgc2V0KSB0aGVuIHJldHVybiB0aGUgc3RydWN0IHBhZ2UKPiAtICogbWF0Y2hpbmcg dGhlIGVudHJ5IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCj4gLSAqLwo+IC1zdGF0aWMg aW5saW5lIHN0cnVjdCBwYWdlICpobW1fZGV2aWNlX2VudHJ5X3RvX3BhZ2UoY29uc3Qgc3RydWN0 IGhtbV9yYW5nZSAqcmFuZ2UsCj4gLQkJCQkJCSAgICB1aW50NjRfdCBlbnRyeSkKPiAtewo+IC0J aWYgKGVudHJ5ID09IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXSkKPiAtCQlyZXR1cm4gTlVM TDsKPiAtCWlmIChlbnRyeSA9PSByYW5nZS0+dmFsdWVzW0hNTV9QRk5fRVJST1JdKQo+IC0JCXJl dHVybiBOVUxMOwo+IC0JaWYgKCEoZW50cnkgJiByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0p KQo+IC0JCXJldHVybiBOVUxMOwo+IC0JcmV0dXJuIHBmbl90b19wYWdlKGVudHJ5ID4+IHJhbmdl LT5wZm5fc2hpZnQpOwo+IC19Cj4gLQo+ICAvKgo+ICAgKiBQbGVhc2Ugc2VlIERvY3VtZW50YXRp b24vdm0vaG1tLnJzdCBmb3IgaG93IHRvIHVzZSB0aGUgcmFuZ2UgQVBJLgo+ICAgKi8KPiBkaWZm IC0tZ2l0IGEvbW0vaG1tLmMgYi9tbS9obW0uYwo+IGluZGV4IDI2OTMzOTNkYzE0YjMwLi5jMWM5 NmQ0Y2MwNTU0YyAxMDA2NDQKPiAtLS0gYS9tbS9obW0uYwo+ICsrKyBiL21tL2htbS5jCj4gQEAg LTM3LDI4ICszNywxMyBAQCBlbnVtIHsKPiAgCUhNTV9ORUVEX0FMTF9CSVRTID0gSE1NX05FRURf RkFVTFQgfCBITU1fTkVFRF9XUklURV9GQVVMVCwKPiAgfTsKPiAgCj4gLS8qCj4gLSAqIGhtbV9k ZXZpY2VfZW50cnlfZnJvbV9wZm4oKSAtIGNyZWF0ZSBhIHZhbGlkIGRldmljZSBlbnRyeSB2YWx1 ZSBmcm9tIHBmbgo+IC0gKiBAcmFuZ2U6IHJhbmdlIHVzZSB0byBlbmNvZGUgSE1NIHBmbiB2YWx1 ZQo+IC0gKiBAcGZuOiBwZm4gdmFsdWUgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZGV2aWNlIGVu dHJ5Cj4gLSAqIFJldHVybjogdmFsaWQgZGV2aWNlIGVudHJ5IGZvciB0aGUgcGZuCj4gLSAqLwo+ IC1zdGF0aWMgdWludDY0X3QgaG1tX2RldmljZV9lbnRyeV9mcm9tX3Bmbihjb25zdCBzdHJ1Y3Qg aG1tX3JhbmdlICpyYW5nZSwKPiAtCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQo+IC17Cj4gLQly ZXR1cm4gKHBmbiA8PCByYW5nZS0+cGZuX3NoaWZ0KSB8IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXTsKPiAtfQo+IC0KPiAgc3RhdGljIGludCBobW1fcGZuc19maWxsKHVuc2lnbmVkIGxvbmcg YWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCj4gLQkJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIGVu dW0gaG1tX3Bmbl92YWx1ZV9lIHZhbHVlKQo+ICsJCQkgc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzKQo+ICB7Cj4gLQl1aW50NjRfdCAqcGZucyA9IHJhbmdl LT5wZm5zOwo+IC0JdW5zaWduZWQgbG9uZyBpOwo+ICsJdW5zaWduZWQgbG9uZyBpID0gKGFkZHIg LSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAo+IC0JaSA9IChhZGRyIC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yICg7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFH RV9TSVpFLCBpKyspCj4gLQkJcGZuc1tpXSA9IHJhbmdlLT52YWx1ZXNbdmFsdWVdOwo+IC0KPiAr CQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAK PiBAQCAtOTYsNyArODEsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfZmF1bHQodW5zaWduZWQgbG9u ZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKPiAgfQo+ICAKPiAgc3RhdGljIHVuc2lnbmVkIGlu dCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93 YWxrLAo+IC0JCQkJICAgICAgIHVpbnQ2NF90IHBmbnMsIHVpbnQ2NF90IGNwdV9mbGFncykKPiAr CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBmbl9yZXFfZmxhZ3MsCj4gKwkJCQkgICAgICAgdW5z aWduZWQgbG9uZyBjcHVfZmxhZ3MpCj4gIHsKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0g aG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCj4gQEAgLTExMCwyNyArOTYsMjggQEAgc3RhdGljIHVu c2lnbmVkIGludCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAq aG1tX3ZtYV93YWxrLAo+ICAJICogd2FzdGUgdG8gaGF2ZSB0aGUgdXNlciBwcmUtZmlsbCB0aGUg cGZuIGFycmF5cyB3aXRoIGEgZGVmYXVsdAo+ICAJICogZmxhZ3MgdmFsdWUuCj4gIAkgKi8KPiAt CXBmbnMgPSAocGZucyAmIHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgfCByYW5nZS0+ZGVmYXVsdF9m bGFnczsKPiArCXBmbl9yZXFfZmxhZ3MgJj0gcmFuZ2UtPnBmbl9mbGFnc19tYXNrOwo+ICsJcGZu X3JlcV9mbGFncyB8PSByYW5nZS0+ZGVmYXVsdF9mbGFnczsKPiAgCj4gIAkvKiBXZSBhcmVuJ3Qg YXNrIHRvIGRvIGFueXRoaW5nIC4uLiAqLwo+IC0JaWYgKCEocGZucyAmIHJhbmdlLT5mbGFnc1tI TU1fUEZOX1ZBTElEXSkpCj4gKwlpZiAoIShwZm5fcmVxX2ZsYWdzICYgSE1NX1BGTl9SRVFfRkFV TFQpKQo+ICAJCXJldHVybiAwOwo+ICAKPiAgCS8qIE5lZWQgdG8gd3JpdGUgZmF1bHQgPyAqLwo+ IC0JaWYgKChwZm5zICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSAmJgo+IC0JICAgICEo Y3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSkKPiArCWlmICgocGZuX3Jl cV9mbGFncyAmIEhNTV9QRk5fUkVRX1dSSVRFKSAmJgo+ICsJICAgICEoY3B1X2ZsYWdzICYgSE1N X1BGTl9XUklURSkpCj4gIAkJcmV0dXJuIEhNTV9ORUVEX0ZBVUxUIHwgSE1NX05FRURfV1JJVEVf RkFVTFQ7Cj4gIAo+ICAJLyogSWYgQ1BVIHBhZ2UgdGFibGUgaXMgbm90IHZhbGlkIHRoZW4gd2Ug bmVlZCB0byBmYXVsdCAqLwo+IC0JaWYgKCEoY3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9Q Rk5fVkFMSURdKSkKPiArCWlmICghKGNwdV9mbGFncyAmIEhNTV9QRk5fVkFMSUQpKQo+ICAJCXJl dHVybiBITU1fTkVFRF9GQVVMVDsKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdW5z aWduZWQgaW50Cj4gIGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGNvbnN0IHN0cnVjdCBobW1fdm1hX3dh bGsgKmhtbV92bWFfd2FsaywKPiAtCQkgICAgIGNvbnN0IHVpbnQ2NF90ICpwZm5zLCB1bnNpZ25l ZCBsb25nIG5wYWdlcywKPiAtCQkgICAgIHVpbnQ2NF90IGNwdV9mbGFncykKPiArCQkgICAgIGNv bnN0IHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgdW5zaWduZWQgbG9uZyBucGFnZXMsCj4gKwkJ ICAgICB1bnNpZ25lZCBsb25nIGNwdV9mbGFncykKPiAgewo+ICAJc3RydWN0IGhtbV9yYW5nZSAq cmFuZ2UgPSBobW1fdm1hX3dhbGstPnJhbmdlOwo+ICAJdW5zaWduZWQgaW50IHJlcXVpcmVkX2Zh dWx0ID0gMDsKPiBAQCAtMTQyLDEyICsxMjksMTIgQEAgaG1tX3JhbmdlX25lZWRfZmF1bHQoY29u c3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrLAo+ICAJICogaG1tX3B0ZV9uZWVk X2ZhdWx0KCkgd2lsbCBhbHdheXMgcmV0dXJuIDAuCj4gIAkgKi8KPiAgCWlmICghKChyYW5nZS0+ ZGVmYXVsdF9mbGFncyB8IHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgJgo+IC0JICAgICAgcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdKSkKPiArCSAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUKSkKPiAg CQlyZXR1cm4gMDsKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKPiAtCQly ZXF1aXJlZF9mYXVsdCB8PQo+IC0JCQlobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBw Zm5zW2ldLCBjcHVfZmxhZ3MpOwo+ICsJCXJlcXVpcmVkX2ZhdWx0IHw9IGhtbV9wdGVfbmVlZF9m YXVsdChobW1fdm1hX3dhbGssIGhtbV9wZm5zW2ldLAo+ICsJCQkJCQkgICAgIGNwdV9mbGFncyk7 Cj4gIAkJaWYgKHJlcXVpcmVkX2ZhdWx0ID09IEhNTV9ORUVEX0FMTF9CSVRTKQo+ICAJCQlyZXR1 cm4gcmVxdWlyZWRfZmF1bHQ7Cj4gIAl9Cj4gQEAgLTE2MSwxMiArMTQ4LDEzIEBAIHN0YXRpYyBp bnQgaG1tX3ZtYV93YWxrX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVu ZCwKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAg CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAgCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2Vz Owo+IC0JdWludDY0X3QgKnBmbnM7Cj4gKwl1bnNpZ25lZCBsb25nICpobW1fcGZuczsKPiAgCj4g IAlpID0gKGFkZHIgLSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAlucGFnZXMgPSAo ZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAtCXBmbnMgPSAmcmFuZ2UtPnBmbnNbaV07Cj4g LQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZu cywgbnBhZ2VzLCAwKTsKPiArCWhtbV9wZm5zID0gJnJhbmdlLT5obW1fcGZuc1tpXTsKPiArCXJl cXVpcmVkX2ZhdWx0ID0KPiArCQlobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIGht bV9wZm5zLCBucGFnZXMsIDApOwo+ICAJaWYgKCF3YWxrLT52bWEpIHsKPiAgCQlpZiAocmVxdWly ZWRfZmF1bHQpCj4gIAkJCXJldHVybiAtRUZBVUxUOwo+IEBAIC0xNzQsNDQgKzE2Miw0NCBAQCBz dGF0aWMgaW50IGhtbV92bWFfd2Fsa19ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQg bG9uZyBlbmQsCj4gIAl9Cj4gIAlpZiAocmVxdWlyZWRfZmF1bHQpCj4gIAkJcmV0dXJuIGhtbV92 bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7Cj4gLQlyZXR1cm4gaG1t X3BmbnNfZmlsbChhZGRyLCBlbmQsIHJhbmdlLCBITU1fUEZOX05PTkUpOwo+ICsJcmV0dXJuIGht bV9wZm5zX2ZpbGwoYWRkciwgZW5kLCByYW5nZSwgMCk7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxp bmUgdWludDY0X3QgcG1kX3RvX2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHBtZF90IHBtZCkKPiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBtZF90b19obW1fcGZu X2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcG1kX3QgcG1kKQo+ICB7 Cj4gIAlpZiAocG1kX3Byb3Rub25lKHBtZCkpCj4gIAkJcmV0dXJuIDA7Cj4gLQlyZXR1cm4gcG1k X3dyaXRlKHBtZCkgPyByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0gfAo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fV1JJVEVdIDoKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1ZBTElE XTsKPiArCXJldHVybiBwbWRfd3JpdGUocG1kKSA/IChITU1fUEZOX1ZBTElEIHwgSE1NX1BGTl9X UklURSkgOiBITU1fUEZOX1ZBTElEOwo+ICB9Cj4gIAo+ICAjaWZkZWYgQ09ORklHX1RSQU5TUEFS RU5UX0hVR0VQQUdFCj4gIHN0YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcG1kKHN0cnVjdCBtbV93 YWxrICp3YWxrLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4gLQkJdW5zaWduZWQgbG9uZyBlbmQsIHVp bnQ2NF90ICpwZm5zLCBwbWRfdCBwbWQpCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCB1 bnNpZ25lZCBsb25nIGhtbV9wZm5zW10sCj4gKwkJCSAgICAgIHBtZF90IHBtZCkKPiAgewo+ICAJ c3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrID0gd2Fsay0+cHJpdmF0ZTsKPiAgCXN0 cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCXVuc2lnbmVk IGxvbmcgcGZuLCBucGFnZXMsIGk7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4g LQl1aW50NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCj4g IAlucGFnZXMgPSAoZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAgCWNwdV9mbGFncyA9IHBt ZF90b19obW1fcGZuX2ZsYWdzKHJhbmdlLCBwbWQpOwo+ICAJcmVxdWlyZWRfZmF1bHQgPQo+IC0J CWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2VzLCBjcHVfZmxh Z3MpOwo+ICsJCWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5w YWdlcywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlyZXR1cm4gaG1t X3ZtYV9mYXVsdChhZGRyLCBlbmQsIHJlcXVpcmVkX2ZhdWx0LCB3YWxrKTsKPiAgCj4gIAlwZm4g PSBwbWRfcGZuKHBtZCkgKyAoKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQpOwo+ICAJ Zm9yIChpID0gMDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIGkrKywgcGZuKyspCj4g LQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfCBjcHVf ZmxhZ3M7Cj4gKwkJaG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsK PiAgfQo+ICAjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAgLyogc3R1 YiB0byBhbGxvdyB0aGUgY29kZSBiZWxvdyB0byBjb21waWxlICovCj4gIGludCBobW1fdm1hX2hh bmRsZV9wbWQoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAtCQl1 bnNpZ25lZCBsb25nIGVuZCwgdWludDY0X3QgKnBmbnMsIHBtZF90IHBtZCk7Cj4gKwkJdW5zaWdu ZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgcG1kX3QgcG1kKTsKPiAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAKPiAgc3RhdGljIGlubGlu ZSBib29sIGhtbV9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5n ZSwKPiBAQCAtMjIyLDMxICsyMTAsMzEgQEAgc3RhdGljIGlubGluZSBib29sIGhtbV9pc19kZXZp Y2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSwKPiAgCQlyYW5nZS0+ZGV2 X3ByaXZhdGVfb3duZXI7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxpbmUgdWludDY0X3QgcHRlX3Rv X2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIHB0ZV90IHB0ZSkKPiArc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB0ZV90b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1f cmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcHRlX3QgcHRlKQo+ICB7Cj4gIAlpZiAocHRlX25vbmUo cHRlKSB8fCAhcHRlX3ByZXNlbnQocHRlKSB8fCBwdGVfcHJvdG5vbmUocHRlKSkKPiAgCQlyZXR1 cm4gMDsKPiAtCXJldHVybiBwdGVfd3JpdGUocHRlKSA/IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXSB8Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9XUklURV0gOgo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdOwo+ICsJcmV0dXJuIHB0ZV93cml0ZShwdGUpID8gKEhNTV9Q Rk5fVkFMSUQgfCBITU1fUEZOX1dSSVRFKSA6IEhNTV9QRk5fVkFMSUQ7Cj4gIH0KPiAgCj4gIHN0 YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcHRlKHN0cnVjdCBtbV93YWxrICp3YWxrLCB1bnNpZ25l ZCBsb25nIGFkZHIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kcCwg cHRlX3QgKnB0ZXAsCj4gLQkJCSAgICAgIHVpbnQ2NF90ICpwZm4pCj4gKwkJCSAgICAgIHVuc2ln bmVkIGxvbmcgKmhtbV9wZm4pCj4gIHsKPiAgCXN0cnVjdCBobW1fdm1hX3dhbGsgKmhtbV92bWFf d2FsayA9IHdhbGstPnByaXZhdGU7Cj4gIAlzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSA9IGhtbV92 bWFfd2Fsay0+cmFuZ2U7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4gLQl1aW50 NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCXB0ZV90IHB0 ZSA9ICpwdGVwOwo+IC0JdWludDY0X3Qgb3JpZ19wZm4gPSAqcGZuOwo+ICsJdWludDY0X3QgcGZu X3JlcV9mbGFncyA9ICpobW1fcGZuOwo+ICAKPiAgCWlmIChwdGVfbm9uZShwdGUpKSB7Cj4gLQkJ cmVxdWlyZWRfZmF1bHQgPSBobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3Bm biwgMCk7Cj4gKwkJcmVxdWlyZWRfZmF1bHQgPQo+ICsJCQlobW1fcHRlX25lZWRfZmF1bHQoaG1t X3ZtYV93YWxrLCBwZm5fcmVxX2ZsYWdzLCAwKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1bHQpCj4g IAkJCWdvdG8gZmF1bHQ7Cj4gLQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsK PiArCQkqaG1tX3BmbiA9IDA7Cj4gIAkJcmV0dXJuIDA7Cj4gIAl9Cj4gIAo+IEBAIC0yNTgsMTcg KzI0NiwxOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfaGFuZGxlX3B0ZShzdHJ1Y3QgbW1fd2FsayAq d2FsaywgdW5zaWduZWQgbG9uZyBhZGRyLAo+ICAJCSAqIHRoZSBQRk4gZXZlbiBpZiBub3QgcHJl c2VudC4KPiAgCQkgKi8KPiAgCQlpZiAoaG1tX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KHJhbmdl LCBlbnRyeSkpIHsKPiAtCQkJKnBmbiA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2Us Cj4gLQkJCQlkZXZpY2VfcHJpdmF0ZV9lbnRyeV90b19wZm4oZW50cnkpKTsKPiAtCQkJKnBmbiB8 PSByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwkJCWNwdV9mbGFncyA9IEhNTV9QRk5f VkFMSUQ7Cj4gIAkJCWlmIChpc193cml0ZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShlbnRyeSkpCj4g LQkJCQkqcGZuIHw9IHJhbmdlLT5mbGFnc1tITU1fUEZOX1dSSVRFXTsKPiArCQkJCWNwdV9mbGFn cyB8PSBITU1fUEZOX1dSSVRFOwo+ICsJCQkqaG1tX3BmbiA9IGRldmljZV9wcml2YXRlX2VudHJ5 X3RvX3BmbihlbnRyeSkgfAo+ICsJCQkJCWNwdV9mbGFnczsKPiAgCQkJcmV0dXJuIDA7Cj4gIAkJ fQo+ICAKPiAtCQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9wdGVfbmVlZF9mYXVsdChobW1fdm1hX3dh bGssIG9yaWdfcGZuLCAwKTsKPiArCQlyZXF1aXJlZF9mYXVsdCA9Cj4gKwkJCWhtbV9wdGVfbmVl ZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbl9yZXFfZmxhZ3MsIDApOwo+ICAJCWlmICghcmVxdWly ZWRfZmF1bHQpIHsKPiAtCQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsKPiAr CQkJKmhtbV9wZm4gPSAwOwo+ICAJCQlyZXR1cm4gMDsKPiAgCQl9Cj4gIAo+IEBAIC0yODgsNyAr Mjc3LDggQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9wdGUoc3RydWN0IG1tX3dhbGsgKndh bGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCX0KPiAgCj4gIAljcHVfZmxhZ3MgPSBwdGVfdG9f aG1tX3Bmbl9mbGFncyhyYW5nZSwgcHRlKTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9u ZWVkX2ZhdWx0KGhtbV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJl ZF9mYXVsdCA9Cj4gKwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9m bGFncywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlnb3RvIGZhdWx0 Owo+ICAKPiBAQCAtMjk3LDE1ICsyODcsMTUgQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9w dGUoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCSAqIGZhbGwg dGhyb3VnaCBhbmQgdHJlYXQgaXQgbGlrZSBhIG5vcm1hbCBwYWdlLgo+ICAJICovCj4gIAlpZiAo cHRlX3NwZWNpYWwocHRlKSAmJiAhaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkgewo+IC0JCWlm IChobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3BmbiwgMCkpIHsKPiArCQlp ZiAoaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgMCkpIHsK PiAgCQkJcHRlX3VubWFwKHB0ZXApOwo+ICAJCQlyZXR1cm4gLUVGQVVMVDsKPiAgCQl9Cj4gLQkJ KnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9FUlJPUl07Cj4gKwkJKmhtbV9wZm4gPSBITU1f UEZOX0VSUk9SOwo+ICAJCXJldHVybiAwOwo+ICAJfQo+ICAKPiAtCSpwZm4gPSBobW1fZGV2aWNl X2VudHJ5X2Zyb21fcGZuKHJhbmdlLCBwdGVfcGZuKHB0ZSkpIHwgY3B1X2ZsYWdzOwo+ICsJKmht bV9wZm4gPSBwdGVfcGZuKHB0ZSkgfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgCj4gIGZh dWx0Ogo+IEBAIC0zMjEsNyArMzExLDggQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBt ZF90ICpwbWRwLAo+ICB7Cj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dhbGsgPSB3 YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1hX3dhbGst PnJhbmdlOwo+IC0JdWludDY0X3QgKnBmbnMgPSAmcmFuZ2UtPnBmbnNbKHN0YXJ0IC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUXTsKPiArCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zID0KPiAr CQkmcmFuZ2UtPmhtbV9wZm5zWyhzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9TSElGVF07 Cj4gIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVDsK PiAgCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0Owo+ICAJcHRlX3QgKnB0ZXA7Cj4gQEAgLTMz MywxNiArMzI0LDE2IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwK PiAgCQlyZXR1cm4gaG1tX3ZtYV93YWxrX2hvbGUoc3RhcnQsIGVuZCwgLTEsIHdhbGspOwo+ICAK PiAgCWlmICh0aHBfbWlncmF0aW9uX3N1cHBvcnRlZCgpICYmIGlzX3BtZF9taWdyYXRpb25fZW50 cnkocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBm bnMsIG5wYWdlcywgMCkpIHsKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93 YWxrLCBobW1fcGZucywgbnBhZ2VzLCAwKSkgewo+ICAJCQlobW1fdm1hX3dhbGstPmxhc3QgPSBh ZGRyOwo+ICAJCQlwbWRfbWlncmF0aW9uX2VudHJ5X3dhaXQod2Fsay0+bW0sIHBtZHApOwo+ICAJ CQlyZXR1cm4gLUVCVVNZOwo+ICAJCX0KPiAtCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFydCwg ZW5kLCByYW5nZSwgSE1NX1BGTl9OT05FKTsKPiArCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFy dCwgZW5kLCByYW5nZSwgMCk7Cj4gIAl9Cj4gIAo+ICAJaWYgKCFwbWRfcHJlc2VudChwbWQpKSB7 Cj4gLQkJaWYgKGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2Vz LCAwKSkKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBobW1fcGZu cywgbnBhZ2VzLCAwKSkKPiAgCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gIAkJcmV0dXJuIGhtbV9wZm5z X2ZpbGwoc3RhcnQsIGVuZCwgcmFuZ2UsIEhNTV9QRk5fRVJST1IpOwo+ICAJfQo+IEBAIC0zNjIs NyArMzUzLDcgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJ CWlmICghcG1kX2Rldm1hcChwbWQpICYmICFwbWRfdHJhbnNfaHVnZShwbWQpKQo+ICAJCQlnb3Rv IGFnYWluOwo+ICAKPiAtCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIsIGVu ZCwgcGZucywgcG1kKTsKPiArCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIs IGVuZCwgaG1tX3BmbnMsIHBtZCk7Cj4gIAl9Cj4gIAo+ICAJLyoKPiBAQCAtMzcyLDE2ICszNjMs MTYgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJICogcmVj b3Zlci4KPiAgCSAqLwo+ICAJaWYgKHBtZF9iYWQocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2Vf bmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbnMsIG5wYWdlcywgMCkpCj4gKwkJaWYgKGhtbV9y YW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5wYWdlcywgMCkpCj4gIAkJ CXJldHVybiAtRUZBVUxUOwo+ICAJCXJldHVybiBobW1fcGZuc19maWxsKHN0YXJ0LCBlbmQsIHJh bmdlLCBITU1fUEZOX0VSUk9SKTsKPiAgCX0KPiAgCj4gIAlwdGVwID0gcHRlX29mZnNldF9tYXAo cG1kcCwgYWRkcik7Cj4gLQlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIHB0 ZXArKywgcGZucysrKSB7Cj4gKwlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUs IHB0ZXArKywgaG1tX3BmbnMrKykgewo+ICAJCWludCByOwo+ICAKPiAtCQlyID0gaG1tX3ZtYV9o YW5kbGVfcHRlKHdhbGssIGFkZHIsIGVuZCwgcG1kcCwgcHRlcCwgcGZucyk7Cj4gKwkJciA9IGht bV92bWFfaGFuZGxlX3B0ZSh3YWxrLCBhZGRyLCBlbmQsIHBtZHAsIHB0ZXAsIGhtbV9wZm5zKTsK PiAgCQlpZiAocikgewo+ICAJCQkvKiBobW1fdm1hX2hhbmRsZV9wdGUoKSBkaWQgcHRlX3VubWFw KCkgKi8KPiAgCQkJcmV0dXJuIHI7Cj4gQEAgLTM5MywxMyArMzg0LDEyIEBAIHN0YXRpYyBpbnQg aG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwKPiAgCj4gICNpZiBkZWZpbmVkKENPTkZJR19B UkNIX0hBU19QVEVfREVWTUFQKSAmJiBcCj4gICAgICBkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hf VFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEKQo+IC1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IHB1ZF90 b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLCBwdWRfdCBwdWQpCj4gK3N0 YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdWRfdG9faG1tX3Bmbl9mbGFncyhzdHJ1Y3QgaG1t X3JhbmdlICpyYW5nZSwKPiArCQkJCQkJIHB1ZF90IHB1ZCkKPiAgewo+ICAJaWYgKCFwdWRfcHJl c2VudChwdWQpKQo+ICAJCXJldHVybiAwOwo+IC0JcmV0dXJuIHB1ZF93cml0ZShwdWQpID8gcmFu Z2UtPmZsYWdzW0hNTV9QRk5fVkFMSURdIHwKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1dS SVRFXSA6Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwlyZXR1cm4gcHVk X3dyaXRlKHB1ZCkgPyAoSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUpIDogSE1NX1BGTl9W QUxJRDsKPiAgfQo+ICAKPiAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcHVkKHB1ZF90ICpwdWRw LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKPiBAQCAtNDI3LDcgKzQx Nyw4IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQg bG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCj4gIAlpZiAocHVkX2h1Z2UocHVkKSAmJiBw dWRfZGV2bWFwKHB1ZCkpIHsKPiAgCQl1bnNpZ25lZCBsb25nIGksIG5wYWdlcywgcGZuOwo+ICAJ CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAtCQl1aW50NjRfdCAqcGZucywgY3B1X2Zs YWdzOwo+ICsJCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zOwo+ICsJCXVuc2lnbmVkIGxvbmcgY3B1 X2ZsYWdzOwo+ICAKPiAgCQlpZiAoIXB1ZF9wcmVzZW50KHB1ZCkpIHsKPiAgCQkJc3Bpbl91bmxv Y2socHRsKTsKPiBAQCAtNDM2LDEwICs0MjcsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtf cHVkKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwK PiAgCj4gIAkJaSA9IChhZGRyIC0gcmFuZ2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJCW5w YWdlcyA9IChlbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUOwo+IC0JCXBmbnMgPSAmcmFuZ2UtPnBm bnNbaV07Cj4gKwkJaG1tX3BmbnMgPSAmcmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAKPiAgCQljcHVf ZmxhZ3MgPSBwdWRfdG9faG1tX3Bmbl9mbGFncyhyYW5nZSwgcHVkKTsKPiAtCQlyZXF1aXJlZF9m YXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywKPiArCQlyZXF1 aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMs Cj4gIAkJCQkJCSAgICAgIG5wYWdlcywgY3B1X2ZsYWdzKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1 bHQpIHsKPiAgCQkJc3Bpbl91bmxvY2socHRsKTsKPiBAQCAtNDQ4LDggKzQzOSw3IEBAIHN0YXRp YyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBzdGFydCwg dW5zaWduZWQgbG9uZyBlbmQsCj4gIAo+ICAJCXBmbiA9IHB1ZF9wZm4ocHVkKSArICgoYWRkciAm IH5QVURfTUFTSykgPj4gUEFHRV9TSElGVCk7Cj4gIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsg KytpLCArK3BmbikKPiAtCQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFu Z2UsIHBmbikgfAo+IC0JCQkJICBjcHVfZmxhZ3M7Cj4gKwkJCWhtbV9wZm5zW2ldID0gcGZuIHwg Y3B1X2ZsYWdzOwo+ICAJCWdvdG8gb3V0X3VubG9jazsKPiAgCX0KPiAgCj4gQEAgLTQ3Myw4ICs0 NjMsOSBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2VudHJ5KHB0ZV90ICpwdGUs IHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dh bGsgPSB3YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1h X3dhbGstPnJhbmdlOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB3YWxrLT52bWE7 Cj4gLQl1aW50NjRfdCBvcmlnX3BmbiwgY3B1X2ZsYWdzOwo+ICAJdW5zaWduZWQgaW50IHJlcXVp cmVkX2ZhdWx0Owo+ICsJdW5zaWduZWQgbG9uZyBwZm5fcmVxX2ZsYWdzOwo+ICsJdW5zaWduZWQg bG9uZyBjcHVfZmxhZ3M7Cj4gIAlzcGlubG9ja190ICpwdGw7Cj4gIAlwdGVfdCBlbnRyeTsKPiAg Cj4gQEAgLTQ4Miw5ICs0NzMsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfaHVnZXRsYl9l bnRyeShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLAo+ICAJZW50cnkgPSBodWdlX3B0 ZXBfZ2V0KHB0ZSk7Cj4gIAo+ICAJaSA9IChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9T SElGVDsKPiAtCW9yaWdfcGZuID0gcmFuZ2UtPnBmbnNbaV07Cj4gKwlwZm5fcmVxX2ZsYWdzID0g cmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAJY3B1X2ZsYWdzID0gcHRlX3RvX2htbV9wZm5fZmxhZ3Mo cmFuZ2UsIGVudHJ5KTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9uZWVkX2ZhdWx0KGht bV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJlZF9mYXVsdCA9Cj4g KwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgY3B1X2Zs YWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkgewo+ICAJCXNwaW5fdW5sb2NrKHB0bCk7Cj4g IAkJcmV0dXJuIGhtbV92bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7 Cj4gQEAgLTQ5Miw4ICs0ODQsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2Vu dHJ5KHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAo+ICAJcGZuID0gcHRlX3Bm bihlbnRyeSkgKyAoKHN0YXJ0ICYgfmhtYXNrKSA+PiBQQUdFX1NISUZUKTsKPiAgCWZvciAoOyBh ZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSwgaSsrLCBwZm4rKykKPiAtCQlyYW5nZS0+cGZu c1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfAo+IC0JCQkJIGNw dV9mbGFnczsKPiArCQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gKwo+ ICAJc3Bpbl91bmxvY2socHRsKTsKPiAgCXJldHVybiAwOwo+ICB9Cj4gQEAgLTUyNCw3ICs1MTYs NyBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa190ZXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVu c2lnbmVkIGxvbmcgZW5kLAo+ICAJICogZmFpbHVyZS4KPiAgCSAqLwo+ICAJaWYgKGhtbV9yYW5n ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywKPiAtCQkJCSByYW5nZS0+cGZucyArCj4gKwkJCQkg cmFuZ2UtPmhtbV9wZm5zICsKPiAgCQkJCQkgKChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFH RV9TSElGVCksCj4gIAkJCQkgKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZULCAwKSkKPiAgCQly ZXR1cm4gLUVGQVVMVDsKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KTm91dmVhdSBtYWlsaW5nIGxpc3QKTm91dmVhdUBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9ub3V2ZWF1Cg== 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=-8.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 40106C5518C for ; Wed, 22 Apr 2020 17:52:44 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 1AD3820882 for ; Wed, 22 Apr 2020 17:52:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="xDufRllK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1AD3820882 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id DEC976E1F7; Wed, 22 Apr 2020 17:52:40 +0000 (UTC) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2055.outbound.protection.outlook.com [40.107.92.55]) by gabe.freedesktop.org (Postfix) with ESMTPS id AD1256E0AC; Wed, 22 Apr 2020 17:52:38 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fTVhhybvo5wjFOdPvCFKmhZy0WZX+nwUaDxB2dzQh8tdmSU/8GL9bh967AWbpbLWgc0WKTesZNysh7F0YOtCyQuJXgeWKAyMqgIlWbazxQ7WgQvwkJhO+tSRiVwEfOGPpSpOHU4DDhAu0CTWRdxxcIW7MsN0yUMqwaLaV1k4ev7hiiaJx4Md8Qvuaz80p9Gzg6BS/jZlxbeF/ZCMB2at1M06eTHICbaScWTTnQ0g1C4I5O9RyVIxCkbRqsQRmLD61Y0EiSl4qJCX29+6JZ73iSZ1Nx0HJ3JrVN6QutXIoX0oHAslPfHOr7VJ4PGobVDKydyZwFWA1vrhSmXyDXLD4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=eiNqWGaoAMNNDZ9SdRVYyTPfveVXJ4QiIgCQN0cfr+UKONUTRwz4eh/vIJBPOm9o9q09pBvWJa2RK5VjXbe9b7RFSuyXmJxCeV1e8AUQ1+3jLvtbDvwskTMmRAZT13CfveDNyHtqNoRBoTmqa+UKUxoyfqxn7VmBMRhhPxJu1j0iNlqKvDMWYLFB5TmFKr1p0k4wu0j0klrC0jPRoF05a0Kj9zOvltfMCmwxHJi5Kb6i6WbYyx26rLLoH5rUfQ0F6ORLVlD9CF4q7MiGpWX1pM3/ifbKpZ1BsyFM2hAMarqE+7IxXlcIVzWJmIz7qX9ZGxa/GtUdXRiUPwJGn1sbZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=xDufRllKZNptCO2HErv7emJj8Lv0dVLBRRRL9bR1ADmVhQpBDMAZT0H3h9VaBNeh8FL5uA3S6ucwU/1Xs2ytPjBTnArGhuZxljuvTmziOyiT+eOIskoJslPVJX3Dr1AdTtqqIvhPJtrcz7uohk/xsCFh0nqZDc2lGsFKqs/j0is= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Kuehling@amd.com; Received: from SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) by SN1PR12MB2432.namprd12.prod.outlook.com (2603:10b6:802:29::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Wed, 22 Apr 2020 17:52:36 +0000 Received: from SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806]) by SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806%7]) with mapi id 15.20.2921.030; Wed, 22 Apr 2020 17:52:36 +0000 Subject: Re: [PATCH hmm 5/5] mm/hmm: remove the customizable pfn format from hmm_range_fault To: Jason Gunthorpe , linux-mm@kvack.org, Ralph Campbell , "Yang, Philip" References: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> From: Felix Kuehling Message-ID: Date: Wed, 22 Apr 2020 13:52:32 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 In-Reply-To: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> Content-Language: en-US X-ClientProxiedBy: YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) To SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.2.100] (142.116.63.128) by YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13 via Frontend Transport; Wed, 22 Apr 2020 17:52:34 +0000 X-Originating-IP: [142.116.63.128] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-TrafficTypeDiagnostic: SN1PR12MB2432:|SN1PR12MB2432: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 03818C953D X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN1PR12MB2414.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(366004)(136003)(396003)(346002)(376002)(39860400002)(86362001)(31686004)(66556008)(44832011)(2616005)(4326008)(956004)(31696002)(66476007)(186003)(6486002)(66946007)(16526019)(26005)(36756003)(54906003)(110136005)(7416002)(316002)(16576012)(8936002)(5660300002)(478600001)(30864003)(2906002)(8676002)(6636002)(81156014)(52116002)(21314003); DIR:OUT; SFP:1101; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3bJqRGyQuymUYqx3R2Di2ElOTQ+GG984VY+gG7SmF3RJWjdcQ/LGQ/vqxIYMoNHNlZR/WBSi0AUI+n74ZcPUwu6igN5knW13BQl5Z6udwhWxpC9Hd0Jx7JbCuwpctZlyKv2r6e+tapSTDybB3X7YeTn1pXVEJ1Di8lL9zI+FzHnJ/mOqHLDW1t/v/X7vklc8gPjtxaeOB0LWNTVxT/agLlAQ6g1P+EeI8+uH8UOkC9L9nkBLkzCA3dIMDzSHfaKJE1HP1G/5aSNfZNBau6ZaKzVKvzKwWFaHyjqWcXTZ9uc9mGZ/GTNBUFK13WYK0X1yujId90dMLhGJ1CR60v5p0tnzuZBCbEhnlxPy3acIFU1hcJFPa0hYmAmLUnhXnTijjvgdPZoxRAEv16t3c3e8l4nt4Z3NkWAlJQzMGNDRkw901ilOfpy6fvtS/Yu/E4as8j6iuW3wRANJDO3Sb6btb8h5L7RnPBlwxmF21ZhXIZI= X-MS-Exchange-AntiSpam-MessageData: A/p+nH/3LM4XiR/cMcwuziDTYW5C5gGM9FDiDY/+410MT9g1zjqJob0o1KrmHpn7zOkmrtbzE0JJ7VSlYMdOKqCeTMy888QaUFLUWBuqAwzYyAK1ZjA6jgrL3MNVvq3byYL9FzWUffY34mk2qoaKhQ== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2020 17:52:35.8751 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vyV1rsnAsduW7VxFHfLYG3sE2GmBr6piPWuszR6qTa5uhCrqrTDZjF6jFlasjYNpfePf4gpA+dnpGIsu1Rdcvw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB2432 X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: amd-gfx@lists.freedesktop.org, John Hubbard , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Christoph Hellwig , =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , Ben Skeggs , nouveau@lists.freedesktop.org, Alex Deucher , Niranjana Vishwanathapura , =?UTF-8?Q?Christian_K=c3=b6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" WytQaGlsaXAgWWFuZ10KCkFtIDIwMjAtMDQtMjEgdW0gODoyMSBwLm0uIHNjaHJpZWIgSmFzb24g R3VudGhvcnBlOgo+IEZyb206IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4KPgo+ IFByZXN1bWFibHkgdGhlIGludGVudCBoZXJlIHdhcyB0aGF0IGhtbV9yYW5nZV9mYXVsdCgpIGNv dWxkIHB1dCB0aGUgZGF0YQo+IGludG8gc29tZSBIVyBzcGVjaWZpYyBmb3JtYXQgYW5kIHRodXMg YXZvaWQgc29tZSB3b3JrLiBIb3dldmVyLCBub3RoaW5nCj4gYWN0dWFsbHkgZG9lcyB0aGF0LCBh bmQgaXQgaXNuJ3QgY2xlYXIgaG93IGFueXRoaW5nIGFjdHVhbGx5IGNvdWxkIGRvIHRoYXQKPiBh cyBobW1fcmFuZ2VfZmF1bHQoKSBwcm92aWRlcyBDUFUgYWRkcmVzc2VzIHdoaWNoIG11c3QgYmUg RE1BIG1hcHBlZC4KPgo+IFBlcmhhcHMgdGhlcmUgaXMgc29tZSBzcGVjaWFsIEhXIHRoYXQgZG9l cyBub3QgbmVlZCBETUEgbWFwcGluZywgYnV0IHdlCj4gZG9uJ3QgaGF2ZSBhbnkgZXhhbXBsZXMg b2YgdGhpcywgYW5kIHRoZSB0aGVvcmV0aWNhbCBwZXJmb3JtYW5jZSB3aW4gb2YKPiBhdm9pZGlu ZyBhbiBleHRyYSBzY2FuIG92ZXIgdGhlIHBmbnMgYXJyYXkgZG9lc24ndCBzZWVtIHdvcnRoIHRo ZQo+IGNvbXBsZXhpdHkuIFBsdXMgcGZucyBuZWVkcyB0byBiZSBzY2FubmVkIGFueWhvdyB0byBz b3J0IG91dCBhbnkKPiBERVZJQ0VfUFJJVkFURSBwYWdlcy4KPgo+IFRoaXMgdmVyc2lvbiByZXBs YWNlcyB0aGUgdWludDY0X3Qgd2l0aCBhbiB1c2lnbmVkIGxvbmcgY29udGFpbmluZyBhIHBmbgo+ IGFuZCBmaXggZmxhZ3MuIE9uIGlucHV0IGZsYWdzIGlzIGZpbGxlZCB3aXRoIHRoZSBITU1fUEZO X1JFUV8qIHZhbHVlcywgb24KPiBzdWNjZXNzZnVsIG91dHB1dCBpdCBpcyBmaWxsZWQgd2l0aCBI TU1fUEZOXyogdmFsdWVzLCBkZXNjcmliaW5nIHRoZSBzdGF0ZQo+IG9mIHRoZSBwYWdlcy4KPgo+ IGFtZGdwdSBpcyBzaW1wbGUgdG8gY29udmVydCwgaXQgZG9lc24ndCB1c2Ugc25hcHNob3QgYW5k IGRvZXNuJ3QgdXNlCj4gcGVyLXBhZ2UgZmxhZ3MuCj4KPiBub3V2ZWF1IHVzZXMgb25seSAxNiBo bW1fcHRlIGVudHJpZXMgYXQgbW9zdCAoaWUgZml0cyBpbiBhIGZldyBjYWNoZQo+IGxpbmVzKSwg YW5kIGl0IHN3ZWVwcyBvdmVyIGl0cyBwZm5zIGFycmF5IGEgY291cGxlIG9mIHRpbWVzIGFueWhv dy4KPgo+IFNpZ25lZC1vZmYtYnk6IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4K PiBTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KCkhpIEphc29u LAoKSSBwb2ludGVkIG91dCBhIHR5cG8gaW4gdGhlIGRvY3VtZW50YXRpb24gaW5saW5lLiBPdGhl ciB0aGFuIHRoYXQsIHRoZQpzZXJpZXMgaXMKCkFja2VkLWJ5OiBGZWxpeCBLdWVobGluZyA8RmVs aXguS3VlaGxpbmdAYW1kLmNvbT4KCkknbGwgdHJ5IHRvIGJ1aWxkIGl0IGFuZCBydW4gc29tZSBi YXNpYyB0ZXN0cyBsYXRlci4KCgo+IC0tLQo+ICBEb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QgICAg ICAgICAgICAgICAgfCAgMjYgKystLQo+ICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRn cHVfdHRtLmMgfCAgMzUgKystLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVf ZG1lbS5jICB8ICA2MCArKysrKysrLS0KPiAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVh dV9kbWVtLmggIHwgICA0ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3Zt LmMgICB8ICA1MiArKysrLS0tLQo+ICBpbmNsdWRlL2xpbnV4L2htbS5oICAgICAgICAgICAgICAg ICAgICAgfCAgOTkgKysrKysrLS0tLS0tLS0tCj4gIG1tL2htbS5jICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDE2MCArKysrKysrKysrKy0tLS0tLS0tLS0tLS0KPiAgNyBmaWxlcyBj aGFuZ2VkLCAyMDQgaW5zZXJ0aW9ucygrKSwgMjMyIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdp dCBhL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdCBiL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdAo+ IGluZGV4IDk5MjRmMmNhYTAxODRjLi43M2E5YjhjODU4ZTVkOSAxMDA2NDQKPiAtLS0gYS9Eb2N1 bWVudGF0aW9uL3ZtL2htbS5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QKPiBA QCAtMTg1LDkgKzE4NSw2IEBAIFRoZSB1c2FnZSBwYXR0ZXJuIGlzOjoKPiAgICAgICAgcmFuZ2Uu c3RhcnQgPSAuLi47Cj4gICAgICAgIHJhbmdlLmVuZCA9IC4uLjsKPiAgICAgICAgcmFuZ2UucGZu cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UuZmxhZ3MgPSAuLi47Cj4gLSAgICAgIHJhbmdlLnZhbHVl cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UucGZuX3NoaWZ0ID0gLi4uOwo+ICAKPiAgICAgICAgaWYg KCFtbWdldF9ub3RfemVybyhpbnRlcnZhbF9zdWItPm5vdGlmaWVyLm1tKSkKPiAgICAgICAgICAg IHJldHVybiAtRUZBVUxUOwo+IEBAIC0yMjksMTUgKzIyNiwxMCBAQCBUaGUgaG1tX3JhbmdlIHN0 cnVjdCBoYXMgMiBmaWVsZHMsIGRlZmF1bHRfZmxhZ3MgYW5kIHBmbl9mbGFnc19tYXNrLCB0aGF0 IHNwZWNpZgo+ICBmYXVsdCBvciBzbmFwc2hvdCBwb2xpY3kgZm9yIHRoZSB3aG9sZSByYW5nZSBp bnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgdGhlbQo+ICBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgcGZu cyBhcnJheS4KPiAgCj4gLUZvciBpbnN0YW5jZSwgaWYgdGhlIGRldmljZSBmbGFncyBmb3IgcmFu Z2UuZmxhZ3MgYXJlOjoKPiArRm9yIGluc3RhbmNlIGlmIHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRz IHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3QgcmVhZAo+ICtwZXJtaXNzaW9uLCBpdCBz ZXRzOjoKPiAgCj4gLSAgICByYW5nZS5mbGFnc1tITU1fUEZOX1ZBTElEXSA9ICgxIDw8IDYzKTsK PiAtICAgIHJhbmdlLmZsYWdzW0hNTV9QRk5fV1JJVEVdID0gKDEgPDwgNjIpOwo+IC0KPiAtYW5k IHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRzIHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3Qg cmVhZCBwZXJtaXNzaW9uLAo+IC1pdCBzZXRzOjoKPiAtCj4gLSAgICByYW5nZS0+ZGVmYXVsdF9m bGFncyA9ICgxIDw8IDYzKTsKPiArICAgIHJhbmdlLT5kZWZhdWx0X2ZsYWdzID0gSE1NX1BGTl9S RVFfVkFMSUQ7CgpUaGlzIHNob3VsZCBiZSBITU1fUEZOX1JFUV9GQVVMVC4KCgo+ICAgICAgcmFu Z2UtPnBmbl9mbGFnc19tYXNrID0gMDsKPiAgCj4gIGFuZCBjYWxscyBobW1fcmFuZ2VfZmF1bHQo KSBhcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgd2lsbCBmaWxsIGZhdWx0IGFsbCBwYWdlcwo+IEBA IC0yNDYsMTggKzIzOCwxOCBAQCBpbiB0aGUgcmFuZ2Ugd2l0aCBhdCBsZWFzdCByZWFkIHBlcm1p c3Npb24uCj4gIE5vdyBsZXQncyBzYXkgdGhlIGRyaXZlciB3YW50cyB0byBkbyB0aGUgc2FtZSBl eGNlcHQgZm9yIG9uZSBwYWdlIGluIHRoZSByYW5nZSBmb3IKPiAgd2hpY2ggaXQgd2FudHMgdG8g aGF2ZSB3cml0ZSBwZXJtaXNzaW9uLiBOb3cgZHJpdmVyIHNldDo6Cj4gIAo+IC0gICAgcmFuZ2Ut PmRlZmF1bHRfZmxhZ3MgPSAoMSA8PCA2Myk7Cj4gLSAgICByYW5nZS0+cGZuX2ZsYWdzX21hc2sg PSAoMSA8PCA2Mik7Cj4gLSAgICByYW5nZS0+cGZuc1tpbmRleF9vZl93cml0ZV0gPSAoMSA8PCA2 Mik7Cj4gKyAgICByYW5nZS0+ZGVmYXVsdF9mbGFncyA9IEhNTV9QRk5fUkVRX1ZBTElEOwoKSE1N X1BGTl9SRVFfRkFVTFQKClJlZ2FyZHMsCsKgIEZlbGl4CgoKPiArICAgIHJhbmdlLT5wZm5fZmxh Z3NfbWFzayA9IEhNTV9QRk5fUkVRX1dSSVRFOwo+ICsgICAgcmFuZ2UtPnBmbnNbaW5kZXhfb2Zf d3JpdGVdID0gSE1NX1BGTl9SRVFfV1JJVEU7Cj4gIAo+ICBXaXRoIHRoaXMsIEhNTSB3aWxsIGZh dWx0IGluIGFsbCBwYWdlcyB3aXRoIGF0IGxlYXN0IHJlYWQgKGkuZS4sIHZhbGlkKSBhbmQgZm9y IHRoZQo+ICBhZGRyZXNzID09IHJhbmdlLT5zdGFydCArIChpbmRleF9vZl93cml0ZSA8PCBQQUdF X1NISUZUKSBpdCB3aWxsIGZhdWx0IHdpdGgKPiAgd3JpdGUgcGVybWlzc2lvbiBpLmUuLCBpZiB0 aGUgQ1BVIHB0ZSBkb2VzIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gc2V0IHRoZW4gSE1NCj4g IHdpbGwgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKS4KPiAgCj4gLU5vdGUgdGhhdCBITU0gd2lsbCBw b3B1bGF0ZSB0aGUgcGZucyBhcnJheSB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIGFueSBwYWdl Cj4gLXRoYXQgaXMgbWFwcGVkIHdpdGggQ1BVIHdyaXRlIHBlcm1pc3Npb24gbm8gbWF0dGVyIHdo YXQgdmFsdWVzIGFyZSBzZXQKPiAtaW4gZGVmYXVsdF9mbGFncyBvciBwZm5fZmxhZ3NfbWFzay4K PiArQWZ0ZXIgaG1tX3JhbmdlX2ZhdWx0IGNvbXBsZXRlcyB0aGUgZmxhZyBiaXRzIGFyZSBzZXQg dG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YKPiArdGhlIHBhZ2UgdGFibGVzLCBpZSBITU1fUEZOX1ZB TElEIHwgSE1NX1BGTl9XUklURSB3aWxsIGJlIHNldCBpZiB0aGUgcGFnZSBpcwo+ICt3cml0YWJs ZS4KPiAgCj4gIAo+ICBSZXByZXNlbnQgYW5kIG1hbmFnZSBkZXZpY2UgbWVtb3J5IGZyb20gY29y ZSBrZXJuZWwgcG9pbnQgb2Ygdmlldwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVf dHRtLmMKPiBpbmRleCA0NDkwODNmOWY4YTJiZi4uYmNmYThjMjY2NDdkNWUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gQEAgLTc2NiwxNyArNzY2LDYgQEAg c3RydWN0IGFtZGdwdV90dG1fdHQgewo+ICB9Owo+ICAKPiAgI2lmZGVmIENPTkZJR19EUk1fQU1E R1BVX1VTRVJQVFIKPiAtLyogZmxhZ3MgdXNlZCBieSBITU0gaW50ZXJuYWwsIG5vdCByZWxhdGVk IHRvIENQVS9HUFUgUFRFIGZsYWdzICovCj4gLXN0YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFu Z2VfZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQkoMSA8PCAwKSwgLyogSE1NX1BGTl9W QUxJRCAqLwo+IC0JKDEgPDwgMSksIC8qIEhNTV9QRk5fV1JJVEUgKi8KPiAtfTsKPiAtCj4gLXN0 YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFuZ2VfdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFYXSA9 IHsKPiAtCTB4ZmZmZmZmZmZmZmZmZmZmZVVMLCAvKiBITU1fUEZOX0VSUk9SICovCj4gLQkwLCAv KiBITU1fUEZOX05PTkUgKi8KPiAtfTsKPiAtCj4gIC8qKgo+ICAgKiBhbWRncHVfdHRtX3R0X2dl dF91c2VyX3BhZ2VzIC0gZ2V0IGRldmljZSBhY2Nlc3NpYmxlIHBhZ2VzIHRoYXQgYmFjayB1c2Vy Cj4gICAqIG1lbW9yeSBhbmQgc3RhcnQgSE1NIHRyYWNraW5nIENQVSBwYWdlIHRhYmxlIHVwZGF0 ZQo+IEBAIC04MTUsMTggKzgwNCwxNSBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdl cyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCQlnb3RvIG91 dDsKPiAgCX0KPiAgCXJhbmdlLT5ub3RpZmllciA9ICZiby0+bm90aWZpZXI7Cj4gLQlyYW5nZS0+ ZmxhZ3MgPSBobW1fcmFuZ2VfZmxhZ3M7Cj4gLQlyYW5nZS0+dmFsdWVzID0gaG1tX3JhbmdlX3Zh bHVlczsKPiAtCXJhbmdlLT5wZm5fc2hpZnQgPSBQQUdFX1NISUZUOwo+ICAJcmFuZ2UtPnN0YXJ0 ID0gYm8tPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQ7Cj4gIAlyYW5nZS0+ZW5kID0gYm8t Pm5vdGlmaWVyLmludGVydmFsX3RyZWUubGFzdCArIDE7Cj4gLQlyYW5nZS0+ZGVmYXVsdF9mbGFn cyA9IGhtbV9yYW5nZV9mbGFnc1tITU1fUEZOX1ZBTElEXTsKPiArCXJhbmdlLT5kZWZhdWx0X2Zs YWdzID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gIAlpZiAoIWFtZGdwdV90dG1fdHRfaXNfcmVhZG9u bHkodHRtKSkKPiAtCQlyYW5nZS0+ZGVmYXVsdF9mbGFncyB8PSByYW5nZS0+ZmxhZ3NbSE1NX1BG Tl9XUklURV07Cj4gKwkJcmFuZ2UtPmRlZmF1bHRfZmxhZ3MgfD0gSE1NX1BGTl9SRVFfV1JJVEU7 Cj4gIAo+IC0JcmFuZ2UtPnBmbnMgPSBrdm1hbGxvY19hcnJheSh0dG0tPm51bV9wYWdlcywgc2l6 ZW9mKCpyYW5nZS0+cGZucyksCj4gLQkJCQkgICAgIEdGUF9LRVJORUwpOwo+IC0JaWYgKHVubGlr ZWx5KCFyYW5nZS0+cGZucykpIHsKPiArCXJhbmdlLT5obW1fcGZucyA9IGt2bWFsbG9jX2FycmF5 KHR0bS0+bnVtX3BhZ2VzLAo+ICsJCQkJCSBzaXplb2YoKnJhbmdlLT5obW1fcGZucyksIEdGUF9L RVJORUwpOwo+ICsJaWYgKHVubGlrZWx5KCFyYW5nZS0+aG1tX3BmbnMpKSB7Cj4gIAkJciA9IC1F Tk9NRU07Cj4gIAkJZ290byBvdXRfZnJlZV9yYW5nZXM7Cj4gIAl9Cj4gQEAgLTg2Nyw3ICs4NTMs NyBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpi bywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCSAqIHRoZSBub3RpZmllcl9sb2NrLCBhbmQgbW11 X2ludGVydmFsX3JlYWRfcmV0cnkoKSBtdXN0IGJlIGRvbmUgZmlyc3QuCj4gIAkgKi8KPiAgCWZv ciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKQo+IC0JCXBhZ2VzW2ldID0gaG1tX2Rl dmljZV9lbnRyeV90b19wYWdlKHJhbmdlLCByYW5nZS0+cGZuc1tpXSk7Cj4gKwkJcGFnZXNbaV0g PSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiAgCj4gIAlndHQtPnJhbmdl ID0gcmFuZ2U7Cj4gIAltbXB1dChtbSk7Cj4gQEAgLTg3Nyw3ICs4NjMsNyBAQCBpbnQgYW1kZ3B1 X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2Ug KipwYWdlcykKPiAgb3V0X3VubG9jazoKPiAgCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIG91 dF9mcmVlX3BmbnM6Cj4gLQlrdmZyZWUocmFuZ2UtPnBmbnMpOwo+ICsJa3ZmcmVlKHJhbmdlLT5o bW1fcGZucyk7Cj4gIG91dF9mcmVlX3JhbmdlczoKPiAgCWtmcmVlKHJhbmdlKTsKPiAgb3V0Ogo+ IEBAIC05MDIsNyArODg4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJRFJNX0RFQlVHX0RSSVZFUigidXNlcl9wYWdlc19k b25lIDB4JWxseCBwYWdlcyAweCVseFxuIiwKPiAgCQlndHQtPnVzZXJwdHIsIHR0bS0+bnVtX3Bh Z2VzKTsKPiAgCj4gLQlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPnBmbnMs Cj4gKwlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPmhtbV9wZm5zLAo+ICAJ CSJObyB1c2VyIHBhZ2VzIHRvIGNoZWNrXG4iKTsKPiAgCj4gIAlpZiAoZ3R0LT5yYW5nZSkgewo+ IEBAIC05MTIsNyArODk4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJCSAqLwo+ICAJCXIgPSBtbXVfaW50ZXJ2YWxfcmVh ZF9yZXRyeShndHQtPnJhbmdlLT5ub3RpZmllciwKPiAgCQkJCQkgZ3R0LT5yYW5nZS0+bm90aWZp ZXJfc2VxKTsKPiAtCQlrdmZyZWUoZ3R0LT5yYW5nZS0+cGZucyk7Cj4gKwkJa3ZmcmVlKGd0dC0+ cmFuZ2UtPmhtbV9wZm5zKTsKPiAgCQlrZnJlZShndHQtPnJhbmdlKTsKPiAgCQlndHQtPnJhbmdl ID0gTlVMTDsKPiAgCX0KPiBAQCAtMTAwMyw4ICs5ODksNyBAQCBzdGF0aWMgdm9pZCBhbWRncHVf dHRtX3R0X3VucGluX3VzZXJwdHIoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAKPiAgCQlmb3IgKGkg PSAwOyBpIDwgdHRtLT5udW1fcGFnZXM7IGkrKykgewo+ICAJCQlpZiAodHRtLT5wYWdlc1tpXSAh PQo+IC0JCQkJaG1tX2RldmljZV9lbnRyeV90b19wYWdlKGd0dC0+cmFuZ2UsCj4gLQkJCQkJICAg ICAgZ3R0LT5yYW5nZS0+cGZuc1tpXSkpCj4gKwkJCSAgICBobW1fcGZuX3RvX3BhZ2UoZ3R0LT5y YW5nZS0+aG1tX3BmbnNbaV0pKQo+ICAJCQkJYnJlYWs7Cj4gIAkJfQo+ICAKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmMgYi9kcml2ZXJzL2dwdS9k cm0vbm91dmVhdS9ub3V2ZWF1X2RtZW0uYwo+IGluZGV4IGFkODllMDlhMGJlMzlhLi4wNzg3NmZi MGUxZDY2NSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rt ZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5jCj4gQEAg LTY3MiwyNyArNjcyLDYxIEBAIG5vdXZlYXVfZG1lbV9taWdyYXRlX3ZtYShzdHJ1Y3Qgbm91dmVh dV9kcm0gKmRybSwKPiAgCXJldHVybiByZXQ7Cj4gIH0KPiAgCj4gLXZvaWQKPiAtbm91dmVhdV9k bWVtX2NvbnZlcnRfcGZuKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+IC0JCQkgc3RydWN0IGht bV9yYW5nZSAqcmFuZ2UpCj4gK3ZvaWQgbm91dmVhdV9obW1fY29udmVydF9wZm4oc3RydWN0IG5v dXZlYXVfZHJtICpkcm0sIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkgICAgIHU2NCAq aW9jdGxfYWRkcikKPiAgewo+ICAJdW5zaWduZWQgbG9uZyBpLCBucGFnZXM7Cj4gIAo+ICsJLyoK PiArCSAqIFRoZSBpb2N0bF9hZGRyIHByZXBhcmVkIGhlcmUgaXMgcGFzc2VkIHRocm91Z2ggbnZp Zl9vYmplY3RfaW9jdGwoKQo+ICsJICogdG8gYW4gZXZlbnR1YWwgRE1BIG1hcCBvbiBzb21lIGNh bGwgY2hhaW4gbGlrZToKPiArCSAqICAgIG5vdXZlYXVfc3ZtX2ZhdWx0KCk6Cj4gKwkgKiAgICAg IGFyZ3MuaS5tLm1ldGhvZCA9IE5WSUZfVk1NX1YwX1BGTk1BUAo+ICsJICogICAgICBub3V2ZWF1 X3JhbmdlX2ZhdWx0KCkKPiArCSAqICAgICAgIG52aWZfb2JqZWN0X2lvY3RsKCkKPiArCSAqICAg ICAgICBjbGllbnQtPmRyaXZlci0+aW9jdGwoKQo+ICsJICogICAgICAgICAgIHN0cnVjdCBudmlm X2RyaXZlciBudmlmX2RyaXZlcl9udmttOgo+ICsJICogICAgICAgICAgICAgLmlvY3RsID0gbnZr bV9jbGllbnRfaW9jdGwKPiArCSAqICAgICAgICAgICAgbnZrbV9pb2N0bCgpCj4gKwkgKiAgICAg ICAgICAgICBudmttX2lvY3RsX3BhdGgoKQo+ICsJICogICAgICAgICAgICAgICBudmttX2lvY3Rs X3YwW3R5cGVdLmZ1bmMoLi4pCj4gKwkgKiAgICAgICAgICAgICAgIG52a21faW9jdGxfbXRoZCgp Cj4gKwkgKiAgICAgICAgICAgICAgICBudmttX29iamVjdF9tdGhkKCkKPiArCSAqICAgICAgICAg ICAgICAgICAgIHN0cnVjdCBudmttX29iamVjdF9mdW5jIG52a21fdXZtbToKPiArCSAqICAgICAg ICAgICAgICAgICAgICAgLm10aGQgPSBudmttX3V2bW1fbXRoZAo+ICsJICogICAgICAgICAgICAg ICAgICAgIG52a21fdXZtbV9tdGhkKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgbnZrbV91 dm1tX210aGRfcGZubWFwKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3Bm bl9tYXAoKQo+ICsJICogICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3B0ZXNfZ2V0X21h cCgpCj4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPT0gZ3AxMDBfdm1tX3BndF9w Zm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudmttX3ZtbV9kZXNjX2Z1 bmMgZ3AxMDBfdm1tX2Rlc2Nfc3B0Ogo+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAu cGZuID0gZ3AxMDBfdm1tX3BndF9wZm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBu dmttX3ZtbV9pdGVyKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1BURVMg PT0gZnVuYyA9PSBncDEwMF92bW1fcGd0X3BmbigpCj4gKwkgKgkJCSAgICAgIGRtYV9tYXBfcGFn ZSgpCj4gKwkgKgo+ICsJICogVGhpcyBpcyBhbGwganVzdCBlbmNvZGluZyB0aGUgaW50ZXJuYWwg aG1tIHJlcHJlbnNldGF0aW9uIGludG8gYQo+ICsJICogZGlmZmVyZW50IG5vdXZlYXUgaW50ZXJu YWwgcmVwcmVzZW50YXRpb24uCj4gKwkgKi8KPiAgCW5wYWdlcyA9IChyYW5nZS0+ZW5kIC0gcmFu Z2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytp KSB7Cj4gIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Cj4gLQkJdWludDY0X3QgYWRkcjsKPiAgCj4gLQkJ cGFnZSA9IGhtbV9kZXZpY2VfZW50cnlfdG9fcGFnZShyYW5nZSwgcmFuZ2UtPnBmbnNbaV0pOwo+ IC0JCWlmIChwYWdlID09IE5VTEwpCj4gLQkJCWNvbnRpbnVlOwo+IC0KPiAtCQlpZiAoIWlzX2Rl dmljZV9wcml2YXRlX3BhZ2UocGFnZSkpCj4gKwkJaWYgKCEocmFuZ2UtPmhtbV9wZm5zW2ldICYg SE1NX1BGTl9WQUxJRCkpIHsKPiArCQkJaW9jdGxfYWRkcltpXSA9IDA7Cj4gIAkJCWNvbnRpbnVl Owo+ICsJCX0KPiAgCj4gLQkJYWRkciA9IG5vdXZlYXVfZG1lbV9wYWdlX2FkZHIocGFnZSk7Cj4g LQkJcmFuZ2UtPnBmbnNbaV0gJj0gKCgxVUwgPDwgcmFuZ2UtPnBmbl9zaGlmdCkgLSAxKTsKPiAt CQlyYW5nZS0+cGZuc1tpXSB8PSAoYWRkciA+PiBQQUdFX1NISUZUKSA8PCByYW5nZS0+cGZuX3No aWZ0Owo+IC0JCXJhbmdlLT5wZm5zW2ldIHw9IE5WSUZfVk1NX1BGTk1BUF9WMF9WUkFNOwo+ICsJ CXBhZ2UgPSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiArCQlpZiAoaXNf ZGV2aWNlX3ByaXZhdGVfcGFnZShwYWdlKSkKPiArCQkJaW9jdGxfYWRkcltpXSA9IG5vdXZlYXVf ZG1lbV9wYWdlX2FkZHIocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwKPiAr CQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfVlJBTTsKPiArCQllbHNlCj4gKwkJCWlvY3RsX2FkZHJb aV0gPSBwYWdlX3RvX3BoeXMocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwK PiArCQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfSE9TVDsKPiArCQlpZiAocmFuZ2UtPmhtbV9wZm5z W2ldICYgSE1NX1BGTl9XUklURSkKPiArCQkJaW9jdGxfYWRkcltpXSB8PSBOVklGX1ZNTV9QRk5N QVBfVjBfVzsKPiAgCX0KPiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVh dS9ub3V2ZWF1X2RtZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5o Cj4gaW5kZXggOTIzOTRiZTVkNjQ5MjMuLjQ2MDdjMGJlN2RkMDYyIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5oCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmgKPiBAQCAtMzgsOCArMzgsOCBAQCBpbnQgbm91dmVh dV9kbWVtX21pZ3JhdGVfdm1hKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+ICAJCQkgICAgIHVu c2lnbmVkIGxvbmcgc3RhcnQsCj4gIAkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpOwo+ICAKPiAt dm9pZCBub3V2ZWF1X2RtZW1fY29udmVydF9wZm4oc3RydWN0IG5vdXZlYXVfZHJtICpkcm0sCj4g LQkJCSAgICAgIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlKTsKPiArdm9pZCBub3V2ZWF1X2htbV9j b252ZXJ0X3BmbihzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSwgc3RydWN0IGhtbV9yYW5nZSAqcmFu Z2UsCj4gKwkJCSAgICAgdTY0ICppb2N0bF9hZGRyKTsKPiAgI2Vsc2UgLyogSVNfRU5BQkxFRChD T05GSUdfRFJNX05PVVZFQVVfU1ZNKSAqLwo+ICBzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9k bWVtX2luaXQoc3RydWN0IG5vdXZlYXVfZHJtICpkcm0pIHt9Cj4gIHN0YXRpYyBpbmxpbmUgdm9p ZCBub3V2ZWF1X2RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSkge30KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdm0uYyBiL2RyaXZlcnMvZ3B1 L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBpbmRleCBjZjBkOWJkNjFiZWJmOS4uZDEwNTli Y2UwOTExOTIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9z dm0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBAQCAt MzY5LDE4ICszNjksNiBAQCBub3V2ZWF1X3N2bW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB2b2lkICpkYXRhLAo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiAtc3RhdGljIGNvbnN0IHU2 NAo+IC1ub3V2ZWF1X3N2bV9wZm5fZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQlbSE1N X1BGTl9WQUxJRCAgICAgICAgIF0gPSBOVklGX1ZNTV9QRk5NQVBfVjBfViwKPiAtCVtITU1fUEZO X1dSSVRFICAgICAgICAgXSA9IE5WSUZfVk1NX1BGTk1BUF9WMF9XLAo+IC19Owo+IC0KPiAtc3Rh dGljIGNvbnN0IHU2NAo+IC1ub3V2ZWF1X3N2bV9wZm5fdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFY XSA9IHsKPiAtCVtITU1fUEZOX0VSUk9SICBdID0gfk5WSUZfVk1NX1BGTk1BUF9WMF9WLAo+IC0J W0hNTV9QRk5fTk9ORSAgIF0gPSAgTlZJRl9WTU1fUEZOTUFQX1YwX05PTkUsCj4gLX07Cj4gLQo+ ICAvKiBJc3N1ZSBmYXVsdCByZXBsYXkgZm9yIEdQVSB0byByZXRyeSBhY2Nlc3NlcyB0aGF0IGZh dWx0ZWQgcHJldmlvdXNseS4gKi8KPiAgc3RhdGljIHZvaWQKPiAgbm91dmVhdV9zdm1fZmF1bHRf cmVwbGF5KHN0cnVjdCBub3V2ZWF1X3N2bSAqc3ZtKQo+IEBAIC01MjAsNyArNTA4LDggQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBtbXVfaW50ZXJ2YWxfbm90aWZpZXJfb3BzIG5vdXZlYXVfc3ZtX21u aV9vcHMgPSB7Cj4gIAo+ICBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQoc3RydWN0IG5v dXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLCB2 b2lkICpkYXRhLCB1MzIgc2l6ZSwKPiAtCQkJICAgICAgIHU2NCAqcGZucywgc3RydWN0IHN2bV9u b3RpZmllciAqbm90aWZpZXIpCj4gKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGhtbV9wZm5zW10s IHU2NCAqaW9jdGxfYWRkciwKPiArCQkJICAgICAgIHN0cnVjdCBzdm1fbm90aWZpZXIgKm5vdGlm aWVyKQo+ICB7Cj4gIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPQo+ICAJCWppZmZpZXMgKyBtc2Vj c190b19qaWZmaWVzKEhNTV9SQU5HRV9ERUZBVUxUX1RJTUVPVVQpOwo+IEBAIC01MjksMTAgKzUx OCw4IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVsdChzdHJ1Y3Qgbm91dmVhdV9zdm1t ICpzdm1tLAo+ICAJCS5ub3RpZmllciA9ICZub3RpZmllci0+bm90aWZpZXIsCj4gIAkJLnN0YXJ0 ID0gbm90aWZpZXItPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQsCj4gIAkJLmVuZCA9IG5v dGlmaWVyLT5ub3RpZmllci5pbnRlcnZhbF90cmVlLmxhc3QgKyAxLAo+IC0JCS5wZm5zID0gcGZu cywKPiAtCQkuZmxhZ3MgPSBub3V2ZWF1X3N2bV9wZm5fZmxhZ3MsCj4gLQkJLnZhbHVlcyA9IG5v dXZlYXVfc3ZtX3Bmbl92YWx1ZXMsCj4gLQkJLnBmbl9zaGlmdCA9IE5WSUZfVk1NX1BGTk1BUF9W MF9BRERSX1NISUZULAo+ICsJCS5wZm5fZmxhZ3NfbWFzayA9IEhNTV9QRk5fUkVRX0ZBVUxUIHwg SE1NX1BGTl9SRVFfV1JJVEUsCj4gKwkJLmhtbV9wZm5zID0gaG1tX3BmbnMsCj4gIAl9Owo+ICAJ c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBub3RpZmllci0+bm90aWZpZXIubW07Cj4gIAlpbnQgcmV0 Owo+IEBAIC01NDIsMTIgKzUyOSwxNSBAQCBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQo c3RydWN0IG5vdXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJcmV0dXJuIC1FQlVTWTsKPiAgCj4gIAkJ cmFuZ2Uubm90aWZpZXJfc2VxID0gbW11X2ludGVydmFsX3JlYWRfYmVnaW4ocmFuZ2Uubm90aWZp ZXIpOwo+IC0JCXJhbmdlLmRlZmF1bHRfZmxhZ3MgPSAwOwo+IC0JCXJhbmdlLnBmbl9mbGFnc19t YXNrID0gLTFVTDsKPiAgCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIAkJcmV0ID0gaG1t X3JhbmdlX2ZhdWx0KCZyYW5nZSk7Cj4gIAkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKPiAgCQlp ZiAocmV0KSB7Cj4gKwkJCS8qCj4gKwkJCSAqIEZJWE1FOiB0aGUgaW5wdXQgUEZOX1JFUSBmbGFn cyBhcmUgZGVzdHJveWVkIG9uCj4gKwkJCSAqIC1FQlVTWSwgd2UgbmVlZCB0byByZWdlbmVyYXRl IHRoZW0sIGFsc28gZm9yIHRoZQo+ICsJCQkgKiBvdGhlciBjb250aW51ZSBiZWxvdwo+ICsJCQkg Ki8KPiAgCQkJaWYgKHJldCA9PSAtRUJVU1kpCj4gIAkJCQljb250aW51ZTsKPiAgCQkJcmV0dXJu IHJldDsKPiBAQCAtNTYyLDcgKzU1Miw3IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVs dChzdHJ1Y3Qgbm91dmVhdV9zdm1tICpzdm1tLAo+ICAJCWJyZWFrOwo+ICAJfQo+ICAKPiAtCW5v dXZlYXVfZG1lbV9jb252ZXJ0X3Bmbihkcm0sICZyYW5nZSk7Cj4gKwlub3V2ZWF1X2htbV9jb252 ZXJ0X3Bmbihkcm0sICZyYW5nZSwgaW9jdGxfYWRkcik7Cj4gIAo+ICAJc3ZtbS0+dm1tLT52bW0u b2JqZWN0LmNsaWVudC0+c3VwZXIgPSB0cnVlOwo+ICAJcmV0ID0gbnZpZl9vYmplY3RfaW9jdGwo JnN2bW0tPnZtbS0+dm1tLm9iamVjdCwgZGF0YSwgc2l6ZSwgTlVMTCk7Cj4gQEAgLTU4OSw2ICs1 NzksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlmeSkKPiAg CQl9IGk7Cj4gIAkJdTY0IHBoeXNbMTZdOwo+ICAJfSBhcmdzOwo+ICsJdW5zaWduZWQgbG9uZyBo bW1fcGZuc1tBUlJBWV9TSVpFKGFyZ3MucGh5cyldOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWE7Cj4gIAl1NjQgaW5zdCwgc3RhcnQsIGxpbWl0Owo+ICAJaW50IGZpLCBmbiwgcGksIGZp bGw7Cj4gQEAgLTcwNCwxMiArNjk1LDE3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlm X25vdGlmeSAqbm90aWZ5KQo+ICAJCQkgKiBhY2Nlc3MgZmxhZ3MuCj4gIAkJCSAqWFhYOiBhdG9t aWM/Cj4gIAkJCSAqLwo+IC0JCQlpZiAoYnVmZmVyLT5mYXVsdFtmbl0tPmFjY2VzcyAhPSAwIC8q IFJFQUQuICovICYmCj4gLQkJCSAgICBidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzICE9IDMgLyog UFJFRkVUQ0guICovKSB7Cj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBf VjBfViB8Cj4gLQkJCQkJCSAgTlZJRl9WTU1fUEZOTUFQX1YwX1c7Cj4gLQkJCX0gZWxzZSB7Cj4g LQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfVjsKPiArCQkJc3dpdGNo IChidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzKSB7Cj4gKwkJCWNhc2UgMDogLyogUkVBRC4gKi8K PiArCQkJCWhtbV9wZm5zW3BpKytdID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gKwkJCQlicmVhazsK PiArCQkJY2FzZSAzOiAvKiBQUkVGRVRDSC4gKi8KPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsK PiArCQkJCWJyZWFrOwo+ICsJCQlkZWZhdWx0Ogo+ICsJCQkJaG1tX3BmbnNbcGkrK10gPSBITU1f UEZOX1JFUV9GQVVMVCB8Cj4gKwkJCQkJCSBITU1fUEZOX1JFUV9XUklURTsKPiArCQkJCWJyZWFr Owo+ICAJCQl9Cj4gIAkJCWFyZ3MuaS5wLnNpemUgPSBwaSA8PCBQQUdFX1NISUZUOwo+ICAKPiBA QCAtNzM3LDcgKzczMyw3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlmX25vdGlmeSAq bm90aWZ5KQo+ICAJCQlmaWxsID0gKGJ1ZmZlci0+ZmF1bHRbZm4gICAgXS0+YWRkciAtCj4gIAkJ CQlidWZmZXItPmZhdWx0W2ZuIC0gMV0tPmFkZHIpID4+IFBBR0VfU0hJRlQ7Cj4gIAkJCXdoaWxl ICgtLWZpbGwpCj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfTk9O RTsKPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsKPiAgCQl9Cj4gIAo+ICAJCVNWTU1fREJHKHN2 bW0sICJ3bmR3ICUwMTZsbHgtJTAxNmxseCBjb3ZlcmluZyAlZCBmYXVsdChzKSIsCj4gQEAgLTc1 Myw3ICs3NDksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlm eSkKPiAgCQkJcmV0ID0gbm91dmVhdV9yYW5nZV9mYXVsdCgKPiAgCQkJCXN2bW0sIHN2bS0+ZHJt LCAmYXJncywKPiAgCQkJCXNpemVvZihhcmdzLmkpICsgcGkgKiBzaXplb2YoYXJncy5waHlzWzBd KSwKPiAtCQkJCWFyZ3MucGh5cywgJm5vdGlmaWVyKTsKPiArCQkJCWhtbV9wZm5zLCBhcmdzLnBo eXMsICZub3RpZmllcik7Cj4gIAkJCW1tdV9pbnRlcnZhbF9ub3RpZmllcl9yZW1vdmUoJm5vdGlm aWVyLm5vdGlmaWVyKTsKPiAgCQl9Cj4gIAkJbW1wdXQobW0pOwo+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2htbS5oIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IGluZGV4IDgxYzMwMmM4ODRj MGUzLi5lNzI1Mjk3ODZmMTZmOCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2htbS5oCj4g KysrIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IEBAIC0xOSw0NSArMTksNDUgQEAKPiAgI2luY2x1 ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl9mbGFnX2Ug LSBITU0gZmxhZyBlbnVtcwo+ICsgKiBPbiBvdXRwdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgLSBU aGUgcGFnZSBpcyBmYXVsdGFibGUgYW5kIGEgZnV0dXJlIGNhbGwgd2l0aCAKPiArICogICAgICAg ICAgICAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUIGNvdWxkIHN1Y2NlZWQuCj4gKyAqIEhNTV9QRk5f VkFMSUQgLSB0aGUgcGZuIGZpZWxkIHBvaW50cyB0byBhIHZhbGlkIFBGTi4gVGhpcyBQRk4gaXMg YXQKPiArICogICAgICAgICAgICAgICAgIGxlYXN0IHJlYWRhYmxlLiBJZiBkZXZfcHJpdmF0ZV9v d25lciBpcyAhTlVMTCB0aGVuIHRoaXMgY291bGQKPiArICogICAgICAgICAgICAgICAgIHBvaW50 IGF0IGEgREVWSUNFX1BSSVZBVEUgcGFnZS4KPiArICogSE1NX1BGTl9XUklURSAtIGlmIHRoZSBw YWdlIG1lbW9yeSBjYW4gYmUgd3JpdHRlbiB0byAocmVxdWlyZXMgSE1NX1BGTl9WQUxJRCkKPiAr ICogSE1NX1BGTl9FUlJPUiAtIGFjY2Vzc2luZyB0aGUgcGZuIGlzIGltcG9zc2libGUgYW5kIHRo ZSBkZXZpY2Ugc2hvdWxkCj4gKyAqICAgICAgICAgICAgICAgICBmYWlsLiBpZSBwb2lzb25lZCBt ZW1vcnksIHNwZWNpYWwgcGFnZXMsIG5vIHZtYSwgZXRjCj4gICAqCj4gLSAqIEZsYWdzOgo+IC0g KiBITU1fUEZOX1ZBTElEOiBwZm4gaXMgdmFsaWQuIEl0IGhhcywgYXQgbGVhc3QsIHJlYWQgcGVy bWlzc2lvbi4KPiAtICogSE1NX1BGTl9XUklURTogQ1BVIHBhZ2UgdGFibGUgaGFzIHdyaXRlIHBl cm1pc3Npb24gc2V0Cj4gLSAqCj4gLSAqIFRoZSBkcml2ZXIgcHJvdmlkZXMgYSBmbGFncyBhcnJh eSBmb3IgbWFwcGluZyBwYWdlIHByb3RlY3Rpb25zIHRvIGRldmljZQo+IC0gKiBQVEUgYml0cy4g SWYgdGhlIGRyaXZlciB2YWxpZCBiaXQgZm9yIGFuIGVudHJ5IGlzIGJpdCAzLAo+IC0gKiBpLmUu LCAoZW50cnkgJiAoMSA8PCAzKSksIHRoZW4gdGhlIGRyaXZlciBtdXN0IHByb3ZpZGUKPiAtICog YW4gYXJyYXkgaW4gaG1tX3JhbmdlLmZsYWdzIHdpdGggaG1tX3JhbmdlLmZsYWdzW0hNTV9QRk5f VkFMSURdID09IDEgPDwgMy4KPiAtICogU2FtZSBsb2dpYyBhcHBseSB0byBhbGwgZmxhZ3MuIFRo aXMgaXMgdGhlIHNhbWUgaWRlYSBhcyB2bV9wYWdlX3Byb3QgaW4gdm1hCj4gLSAqIGV4Y2VwdCB0 aGF0IHRoaXMgaXMgcGVyIGRldmljZSBkcml2ZXIgcmF0aGVyIHRoYW4gcGVyIGFyY2hpdGVjdHVy ZS4KPiArICogT24gaW5wdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgICAgIC0gUmV0dXJuIHRoZSBj dXJyZW50IHN0YXRlIG9mIHRoZSBwYWdlLCBkbyBub3QgZmF1bHQgaXQuCj4gKyAqIEhNTV9QRk5f UkVRX0ZBVUxUIC0gVGhlIG91dHB1dCBtdXN0IGhhdmUgSE1NX1BGTl9WQUxJRCBvciBobW1fcmFu Z2VfZmF1bHQoKQo+ICsgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgZmFpbAo+ICsgKiBITU1f UEZOX1JFUV9XUklURSAtIFRoZSBvdXRwdXQgbXVzdCBoYXZlIEhNTV9QRk5fV1JJVEUgb3IgaG1t X3JhbmdlX2ZhdWx0KCkKPiArICogICAgICAgICAgICAgICAgICAgICB3aWxsIGZhaWwuIE11c3Qg YmUgY29tYmluZWQgd2l0aCBITU1fUEZOX1JFUV9GQVVMVC4KPiAgICovCj4gLWVudW0gaG1tX3Bm bl9mbGFnX2Ugewo+IC0JSE1NX1BGTl9WQUxJRCA9IDAsCj4gLQlITU1fUEZOX1dSSVRFLAo+IC0J SE1NX1BGTl9GTEFHX01BWAo+ICtlbnVtIGhtbV9wZm5fZmxhZ3Mgewo+ICsJSE1NX1BGTl9WQUxJ RCA9IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIDEpLAo+ICsJSE1NX1BGTl9XUklURSA9IDFVTCA8 PCAoQklUU19QRVJfTE9ORyAtIDIpLAo+ICsJSE1NX1BGTl9FUlJPUiA9IDFVTCA8PCAoQklUU19Q RVJfTE9ORyAtIDMpLAo+ICsKPiArCUhNTV9QRk5fUkVRX0ZBVUxUID0gSE1NX1BGTl9WQUxJRCwK PiArCUhNTV9QRk5fUkVRX1dSSVRFID0gSE1NX1BGTl9XUklURSwKPiArCj4gKwlITU1fUEZOX0ZM QUdTID0gSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUgfCBITU1fUEZOX0VSUk9SLAo+ICB9 Owo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl92YWx1ZV9lIC0gSE1NIHBmbiBzcGVjaWFsIHZhbHVl Cj4gLSAqCj4gLSAqIEZsYWdzOgo+IC0gKiBITU1fUEZOX0VSUk9SOiBjb3JyZXNwb25kaW5nIENQ VSBwYWdlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBwb2lzb25lZCBtZW1vcnkKPiAtICogSE1NX1BG Tl9OT05FOiBjb3JyZXNwb25kaW5nIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHB0ZV9ub25lKCkK PiArICogaG1tX3Bmbl90b19wYWdlKCkgLSByZXR1cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBi eSBhIGRldmljZSBlbnRyeQo+ICAgKgo+IC0gKiBEcml2ZXIgcHJvdmlkZXMgdmFsdWVzIGZvciBu b25lIGVudHJ5LCBlcnJvciBlbnRyeSwgYW5kIHNwZWNpYWwgZW50cnkuCj4gLSAqIERyaXZlciBj YW4gYWxpYXMgKGkuZS4sIHVzZSBzYW1lIHZhbHVlKSBlcnJvciBhbmQgc3BlY2lhbCwgYnV0Cj4g LSAqIGl0IHNob3VsZCBub3QgYWxpYXMgbm9uZSB3aXRoIGVycm9yIG9yIHNwZWNpYWwuCj4gLSAq Cj4gLSAqIEhNTSBwZm4gdmFsdWUgcmV0dXJuZWQgYnkgaG1tX3ZtYV9nZXRfcGZucygpIG9yIGht bV92bWFfZmF1bHQoKSB3aWxsIGJlOgo+IC0gKiBobW1fcmFuZ2UudmFsdWVzW0hNTV9QRk5fRVJS T1JdIGlmIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHBvaXNvbm91cywKPiAtICogaG1tX3Jhbmdl LnZhbHVlc1tITU1fUEZOX05PTkVdIGlmIHRoZXJlIGlzIG5vIENQVSBwYWdlIHRhYmxlIGVudHJ5 LAo+ICsgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBjYWxsZXIgJ3VzZXJfbG9jaycg YWZ0ZXIgYSBzdWNjZXNzZnVsCj4gKyAqIG1tdV9pbnRlcnZhbF9yZWFkX2JlZ2luKCkuIFRoZSBj YWxsZXIgbXVzdCBoYXZlIHRlc3RlZCBmb3IgSE1NX1BGTl9WQUxJRAo+ICsgKiBhbHJlYWR5Lgo+ ICAgKi8KPiAtZW51bSBobW1fcGZuX3ZhbHVlX2Ugewo+IC0JSE1NX1BGTl9FUlJPUiwKPiAtCUhN TV9QRk5fTk9ORSwKPiAtCUhNTV9QRk5fVkFMVUVfTUFYCj4gLX07Cj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHBhZ2UgKmhtbV9wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIGhtbV9wZm4pCj4gK3sK PiArCXJldHVybiBwZm5fdG9fcGFnZShobW1fcGZuICYgfkhNTV9QRk5fRkxBR1MpOwo+ICt9Cj4g IAo+ICAvKgo+ICAgKiBzdHJ1Y3QgaG1tX3JhbmdlIC0gdHJhY2sgaW52YWxpZGF0aW9uIGxvY2sg b24gdmlydHVhbCBhZGRyZXNzIHJhbmdlCj4gQEAgLTY2LDEyICs2Niw5IEBAIGVudW0gaG1tX3Bm bl92YWx1ZV9lIHsKPiAgICogQG5vdGlmaWVyX3NlcTogcmVzdWx0IG9mIG1tdV9pbnRlcnZhbF9y ZWFkX2JlZ2luKCkKPiAgICogQHN0YXJ0OiByYW5nZSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MgKGlu Y2x1c2l2ZSkKPiAgICogQGVuZDogcmFuZ2UgdmlydHVhbCBlbmQgYWRkcmVzcyAoZXhjbHVzaXZl KQo+IC0gKiBAcGZuczogYXJyYXkgb2YgcGZucyAoYmlnIGVub3VnaCBmb3IgdGhlIHJhbmdlKQo+ IC0gKiBAZmxhZ3M6IHBmbiBmbGFncyB0byBtYXRjaCBkZXZpY2UgZHJpdmVyIHBhZ2UgdGFibGUK PiAtICogQHZhbHVlczogcGZuIHZhbHVlIGZvciBzb21lIHNwZWNpYWwgY2FzZSAobm9uZSwgc3Bl Y2lhbCwgZXJyb3IsIC4uLikKPiArICogQGhtbV9wZm5zOiBhcnJheSBvZiBwZm5zIChiaWcgZW5v dWdoIGZvciB0aGUgcmFuZ2UpCj4gICAqIEBkZWZhdWx0X2ZsYWdzOiBkZWZhdWx0IGZsYWdzIGZv ciB0aGUgcmFuZ2UgKHdyaXRlLCByZWFkLCAuLi4gc2VlIGhtbSBkb2MpCj4gICAqIEBwZm5fZmxh Z3NfbWFzazogYWxsb3dzIHRvIG1hc2sgcGZuIGZsYWdzIHNvIHRoYXQgb25seSBkZWZhdWx0X2Zs YWdzIG1hdHRlcgo+IC0gKiBAcGZuX3NoaWZ0OiBwZm4gc2hpZnQgdmFsdWUgKHNob3VsZCBiZSA8 PSBQQUdFX1NISUZUKQo+ICAgKiBAZGV2X3ByaXZhdGVfb3duZXI6IG93bmVyIG9mIGRldmljZSBw cml2YXRlIHBhZ2VzCj4gICAqLwo+ICBzdHJ1Y3QgaG1tX3JhbmdlIHsKPiBAQCAtNzksMzYgKzc2 LDEyIEBAIHN0cnVjdCBobW1fcmFuZ2Ugewo+ICAJdW5zaWduZWQgbG9uZwkJbm90aWZpZXJfc2Vx Owo+ICAJdW5zaWduZWQgbG9uZwkJc3RhcnQ7Cj4gIAl1bnNpZ25lZCBsb25nCQllbmQ7Cj4gLQl1 aW50NjRfdAkJKnBmbnM7Cj4gLQljb25zdCB1aW50NjRfdAkJKmZsYWdzOwo+IC0JY29uc3QgdWlu dDY0X3QJCSp2YWx1ZXM7Cj4gLQl1aW50NjRfdAkJZGVmYXVsdF9mbGFnczsKPiAtCXVpbnQ2NF90 CQlwZm5fZmxhZ3NfbWFzazsKPiAtCXVpbnQ4X3QJCQlwZm5fc2hpZnQ7Cj4gKwl1bnNpZ25lZCBs b25nCQkqaG1tX3BmbnM7Cj4gKwl1bnNpZ25lZCBsb25nCQlkZWZhdWx0X2ZsYWdzOwo+ICsJdW5z aWduZWQgbG9uZwkJcGZuX2ZsYWdzX21hc2s7Cj4gIAl2b2lkCQkJKmRldl9wcml2YXRlX293bmVy Owo+ICB9Owo+ICAKPiAtLyoKPiAtICogaG1tX2RldmljZV9lbnRyeV90b19wYWdlKCkgLSByZXR1 cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBieSBhIGRldmljZSBlbnRyeQo+IC0gKiBAcmFuZ2U6 IHJhbmdlIHVzZSB0byBkZWNvZGUgZGV2aWNlIGVudHJ5IHZhbHVlCj4gLSAqIEBlbnRyeTogZGV2 aWNlIGVudHJ5IHZhbHVlIHRvIGdldCBjb3JyZXNwb25kaW5nIHN0cnVjdCBwYWdlIGZyb20KPiAt ICogUmV0dXJuOiBzdHJ1Y3QgcGFnZSBwb2ludGVyIGlmIGVudHJ5IGlzIGEgdmFsaWQsIE5VTEwg b3RoZXJ3aXNlCj4gLSAqCj4gLSAqIElmIHRoZSBkZXZpY2UgZW50cnkgaXMgdmFsaWQgKGllIHZh bGlkIGZsYWcgc2V0KSB0aGVuIHJldHVybiB0aGUgc3RydWN0IHBhZ2UKPiAtICogbWF0Y2hpbmcg dGhlIGVudHJ5IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCj4gLSAqLwo+IC1zdGF0aWMg aW5saW5lIHN0cnVjdCBwYWdlICpobW1fZGV2aWNlX2VudHJ5X3RvX3BhZ2UoY29uc3Qgc3RydWN0 IGhtbV9yYW5nZSAqcmFuZ2UsCj4gLQkJCQkJCSAgICB1aW50NjRfdCBlbnRyeSkKPiAtewo+IC0J aWYgKGVudHJ5ID09IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXSkKPiAtCQlyZXR1cm4gTlVM TDsKPiAtCWlmIChlbnRyeSA9PSByYW5nZS0+dmFsdWVzW0hNTV9QRk5fRVJST1JdKQo+IC0JCXJl dHVybiBOVUxMOwo+IC0JaWYgKCEoZW50cnkgJiByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0p KQo+IC0JCXJldHVybiBOVUxMOwo+IC0JcmV0dXJuIHBmbl90b19wYWdlKGVudHJ5ID4+IHJhbmdl LT5wZm5fc2hpZnQpOwo+IC19Cj4gLQo+ICAvKgo+ICAgKiBQbGVhc2Ugc2VlIERvY3VtZW50YXRp b24vdm0vaG1tLnJzdCBmb3IgaG93IHRvIHVzZSB0aGUgcmFuZ2UgQVBJLgo+ICAgKi8KPiBkaWZm IC0tZ2l0IGEvbW0vaG1tLmMgYi9tbS9obW0uYwo+IGluZGV4IDI2OTMzOTNkYzE0YjMwLi5jMWM5 NmQ0Y2MwNTU0YyAxMDA2NDQKPiAtLS0gYS9tbS9obW0uYwo+ICsrKyBiL21tL2htbS5jCj4gQEAg LTM3LDI4ICszNywxMyBAQCBlbnVtIHsKPiAgCUhNTV9ORUVEX0FMTF9CSVRTID0gSE1NX05FRURf RkFVTFQgfCBITU1fTkVFRF9XUklURV9GQVVMVCwKPiAgfTsKPiAgCj4gLS8qCj4gLSAqIGhtbV9k ZXZpY2VfZW50cnlfZnJvbV9wZm4oKSAtIGNyZWF0ZSBhIHZhbGlkIGRldmljZSBlbnRyeSB2YWx1 ZSBmcm9tIHBmbgo+IC0gKiBAcmFuZ2U6IHJhbmdlIHVzZSB0byBlbmNvZGUgSE1NIHBmbiB2YWx1 ZQo+IC0gKiBAcGZuOiBwZm4gdmFsdWUgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZGV2aWNlIGVu dHJ5Cj4gLSAqIFJldHVybjogdmFsaWQgZGV2aWNlIGVudHJ5IGZvciB0aGUgcGZuCj4gLSAqLwo+ IC1zdGF0aWMgdWludDY0X3QgaG1tX2RldmljZV9lbnRyeV9mcm9tX3Bmbihjb25zdCBzdHJ1Y3Qg aG1tX3JhbmdlICpyYW5nZSwKPiAtCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQo+IC17Cj4gLQly ZXR1cm4gKHBmbiA8PCByYW5nZS0+cGZuX3NoaWZ0KSB8IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXTsKPiAtfQo+IC0KPiAgc3RhdGljIGludCBobW1fcGZuc19maWxsKHVuc2lnbmVkIGxvbmcg YWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCj4gLQkJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIGVu dW0gaG1tX3Bmbl92YWx1ZV9lIHZhbHVlKQo+ICsJCQkgc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzKQo+ICB7Cj4gLQl1aW50NjRfdCAqcGZucyA9IHJhbmdl LT5wZm5zOwo+IC0JdW5zaWduZWQgbG9uZyBpOwo+ICsJdW5zaWduZWQgbG9uZyBpID0gKGFkZHIg LSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAo+IC0JaSA9IChhZGRyIC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yICg7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFH RV9TSVpFLCBpKyspCj4gLQkJcGZuc1tpXSA9IHJhbmdlLT52YWx1ZXNbdmFsdWVdOwo+IC0KPiAr CQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAK PiBAQCAtOTYsNyArODEsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfZmF1bHQodW5zaWduZWQgbG9u ZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKPiAgfQo+ICAKPiAgc3RhdGljIHVuc2lnbmVkIGlu dCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93 YWxrLAo+IC0JCQkJICAgICAgIHVpbnQ2NF90IHBmbnMsIHVpbnQ2NF90IGNwdV9mbGFncykKPiAr CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBmbl9yZXFfZmxhZ3MsCj4gKwkJCQkgICAgICAgdW5z aWduZWQgbG9uZyBjcHVfZmxhZ3MpCj4gIHsKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0g aG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCj4gQEAgLTExMCwyNyArOTYsMjggQEAgc3RhdGljIHVu c2lnbmVkIGludCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAq aG1tX3ZtYV93YWxrLAo+ICAJICogd2FzdGUgdG8gaGF2ZSB0aGUgdXNlciBwcmUtZmlsbCB0aGUg cGZuIGFycmF5cyB3aXRoIGEgZGVmYXVsdAo+ICAJICogZmxhZ3MgdmFsdWUuCj4gIAkgKi8KPiAt CXBmbnMgPSAocGZucyAmIHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgfCByYW5nZS0+ZGVmYXVsdF9m bGFnczsKPiArCXBmbl9yZXFfZmxhZ3MgJj0gcmFuZ2UtPnBmbl9mbGFnc19tYXNrOwo+ICsJcGZu X3JlcV9mbGFncyB8PSByYW5nZS0+ZGVmYXVsdF9mbGFnczsKPiAgCj4gIAkvKiBXZSBhcmVuJ3Qg YXNrIHRvIGRvIGFueXRoaW5nIC4uLiAqLwo+IC0JaWYgKCEocGZucyAmIHJhbmdlLT5mbGFnc1tI TU1fUEZOX1ZBTElEXSkpCj4gKwlpZiAoIShwZm5fcmVxX2ZsYWdzICYgSE1NX1BGTl9SRVFfRkFV TFQpKQo+ICAJCXJldHVybiAwOwo+ICAKPiAgCS8qIE5lZWQgdG8gd3JpdGUgZmF1bHQgPyAqLwo+ IC0JaWYgKChwZm5zICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSAmJgo+IC0JICAgICEo Y3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSkKPiArCWlmICgocGZuX3Jl cV9mbGFncyAmIEhNTV9QRk5fUkVRX1dSSVRFKSAmJgo+ICsJICAgICEoY3B1X2ZsYWdzICYgSE1N X1BGTl9XUklURSkpCj4gIAkJcmV0dXJuIEhNTV9ORUVEX0ZBVUxUIHwgSE1NX05FRURfV1JJVEVf RkFVTFQ7Cj4gIAo+ICAJLyogSWYgQ1BVIHBhZ2UgdGFibGUgaXMgbm90IHZhbGlkIHRoZW4gd2Ug bmVlZCB0byBmYXVsdCAqLwo+IC0JaWYgKCEoY3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9Q Rk5fVkFMSURdKSkKPiArCWlmICghKGNwdV9mbGFncyAmIEhNTV9QRk5fVkFMSUQpKQo+ICAJCXJl dHVybiBITU1fTkVFRF9GQVVMVDsKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdW5z aWduZWQgaW50Cj4gIGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGNvbnN0IHN0cnVjdCBobW1fdm1hX3dh bGsgKmhtbV92bWFfd2FsaywKPiAtCQkgICAgIGNvbnN0IHVpbnQ2NF90ICpwZm5zLCB1bnNpZ25l ZCBsb25nIG5wYWdlcywKPiAtCQkgICAgIHVpbnQ2NF90IGNwdV9mbGFncykKPiArCQkgICAgIGNv bnN0IHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgdW5zaWduZWQgbG9uZyBucGFnZXMsCj4gKwkJ ICAgICB1bnNpZ25lZCBsb25nIGNwdV9mbGFncykKPiAgewo+ICAJc3RydWN0IGhtbV9yYW5nZSAq cmFuZ2UgPSBobW1fdm1hX3dhbGstPnJhbmdlOwo+ICAJdW5zaWduZWQgaW50IHJlcXVpcmVkX2Zh dWx0ID0gMDsKPiBAQCAtMTQyLDEyICsxMjksMTIgQEAgaG1tX3JhbmdlX25lZWRfZmF1bHQoY29u c3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrLAo+ICAJICogaG1tX3B0ZV9uZWVk X2ZhdWx0KCkgd2lsbCBhbHdheXMgcmV0dXJuIDAuCj4gIAkgKi8KPiAgCWlmICghKChyYW5nZS0+ ZGVmYXVsdF9mbGFncyB8IHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgJgo+IC0JICAgICAgcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdKSkKPiArCSAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUKSkKPiAg CQlyZXR1cm4gMDsKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKPiAtCQly ZXF1aXJlZF9mYXVsdCB8PQo+IC0JCQlobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBw Zm5zW2ldLCBjcHVfZmxhZ3MpOwo+ICsJCXJlcXVpcmVkX2ZhdWx0IHw9IGhtbV9wdGVfbmVlZF9m YXVsdChobW1fdm1hX3dhbGssIGhtbV9wZm5zW2ldLAo+ICsJCQkJCQkgICAgIGNwdV9mbGFncyk7 Cj4gIAkJaWYgKHJlcXVpcmVkX2ZhdWx0ID09IEhNTV9ORUVEX0FMTF9CSVRTKQo+ICAJCQlyZXR1 cm4gcmVxdWlyZWRfZmF1bHQ7Cj4gIAl9Cj4gQEAgLTE2MSwxMiArMTQ4LDEzIEBAIHN0YXRpYyBp bnQgaG1tX3ZtYV93YWxrX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVu ZCwKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAg CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAgCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2Vz Owo+IC0JdWludDY0X3QgKnBmbnM7Cj4gKwl1bnNpZ25lZCBsb25nICpobW1fcGZuczsKPiAgCj4g IAlpID0gKGFkZHIgLSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAlucGFnZXMgPSAo ZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAtCXBmbnMgPSAmcmFuZ2UtPnBmbnNbaV07Cj4g LQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZu cywgbnBhZ2VzLCAwKTsKPiArCWhtbV9wZm5zID0gJnJhbmdlLT5obW1fcGZuc1tpXTsKPiArCXJl cXVpcmVkX2ZhdWx0ID0KPiArCQlobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIGht bV9wZm5zLCBucGFnZXMsIDApOwo+ICAJaWYgKCF3YWxrLT52bWEpIHsKPiAgCQlpZiAocmVxdWly ZWRfZmF1bHQpCj4gIAkJCXJldHVybiAtRUZBVUxUOwo+IEBAIC0xNzQsNDQgKzE2Miw0NCBAQCBz dGF0aWMgaW50IGhtbV92bWFfd2Fsa19ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQg bG9uZyBlbmQsCj4gIAl9Cj4gIAlpZiAocmVxdWlyZWRfZmF1bHQpCj4gIAkJcmV0dXJuIGhtbV92 bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7Cj4gLQlyZXR1cm4gaG1t X3BmbnNfZmlsbChhZGRyLCBlbmQsIHJhbmdlLCBITU1fUEZOX05PTkUpOwo+ICsJcmV0dXJuIGht bV9wZm5zX2ZpbGwoYWRkciwgZW5kLCByYW5nZSwgMCk7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxp bmUgdWludDY0X3QgcG1kX3RvX2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHBtZF90IHBtZCkKPiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBtZF90b19obW1fcGZu X2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcG1kX3QgcG1kKQo+ICB7 Cj4gIAlpZiAocG1kX3Byb3Rub25lKHBtZCkpCj4gIAkJcmV0dXJuIDA7Cj4gLQlyZXR1cm4gcG1k X3dyaXRlKHBtZCkgPyByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0gfAo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fV1JJVEVdIDoKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1ZBTElE XTsKPiArCXJldHVybiBwbWRfd3JpdGUocG1kKSA/IChITU1fUEZOX1ZBTElEIHwgSE1NX1BGTl9X UklURSkgOiBITU1fUEZOX1ZBTElEOwo+ICB9Cj4gIAo+ICAjaWZkZWYgQ09ORklHX1RSQU5TUEFS RU5UX0hVR0VQQUdFCj4gIHN0YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcG1kKHN0cnVjdCBtbV93 YWxrICp3YWxrLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4gLQkJdW5zaWduZWQgbG9uZyBlbmQsIHVp bnQ2NF90ICpwZm5zLCBwbWRfdCBwbWQpCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCB1 bnNpZ25lZCBsb25nIGhtbV9wZm5zW10sCj4gKwkJCSAgICAgIHBtZF90IHBtZCkKPiAgewo+ICAJ c3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrID0gd2Fsay0+cHJpdmF0ZTsKPiAgCXN0 cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCXVuc2lnbmVk IGxvbmcgcGZuLCBucGFnZXMsIGk7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4g LQl1aW50NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCj4g IAlucGFnZXMgPSAoZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAgCWNwdV9mbGFncyA9IHBt ZF90b19obW1fcGZuX2ZsYWdzKHJhbmdlLCBwbWQpOwo+ICAJcmVxdWlyZWRfZmF1bHQgPQo+IC0J CWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2VzLCBjcHVfZmxh Z3MpOwo+ICsJCWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5w YWdlcywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlyZXR1cm4gaG1t X3ZtYV9mYXVsdChhZGRyLCBlbmQsIHJlcXVpcmVkX2ZhdWx0LCB3YWxrKTsKPiAgCj4gIAlwZm4g PSBwbWRfcGZuKHBtZCkgKyAoKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQpOwo+ICAJ Zm9yIChpID0gMDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIGkrKywgcGZuKyspCj4g LQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfCBjcHVf ZmxhZ3M7Cj4gKwkJaG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsK PiAgfQo+ICAjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAgLyogc3R1 YiB0byBhbGxvdyB0aGUgY29kZSBiZWxvdyB0byBjb21waWxlICovCj4gIGludCBobW1fdm1hX2hh bmRsZV9wbWQoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAtCQl1 bnNpZ25lZCBsb25nIGVuZCwgdWludDY0X3QgKnBmbnMsIHBtZF90IHBtZCk7Cj4gKwkJdW5zaWdu ZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgcG1kX3QgcG1kKTsKPiAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAKPiAgc3RhdGljIGlubGlu ZSBib29sIGhtbV9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5n ZSwKPiBAQCAtMjIyLDMxICsyMTAsMzEgQEAgc3RhdGljIGlubGluZSBib29sIGhtbV9pc19kZXZp Y2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSwKPiAgCQlyYW5nZS0+ZGV2 X3ByaXZhdGVfb3duZXI7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxpbmUgdWludDY0X3QgcHRlX3Rv X2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIHB0ZV90IHB0ZSkKPiArc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB0ZV90b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1f cmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcHRlX3QgcHRlKQo+ICB7Cj4gIAlpZiAocHRlX25vbmUo cHRlKSB8fCAhcHRlX3ByZXNlbnQocHRlKSB8fCBwdGVfcHJvdG5vbmUocHRlKSkKPiAgCQlyZXR1 cm4gMDsKPiAtCXJldHVybiBwdGVfd3JpdGUocHRlKSA/IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXSB8Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9XUklURV0gOgo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdOwo+ICsJcmV0dXJuIHB0ZV93cml0ZShwdGUpID8gKEhNTV9Q Rk5fVkFMSUQgfCBITU1fUEZOX1dSSVRFKSA6IEhNTV9QRk5fVkFMSUQ7Cj4gIH0KPiAgCj4gIHN0 YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcHRlKHN0cnVjdCBtbV93YWxrICp3YWxrLCB1bnNpZ25l ZCBsb25nIGFkZHIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kcCwg cHRlX3QgKnB0ZXAsCj4gLQkJCSAgICAgIHVpbnQ2NF90ICpwZm4pCj4gKwkJCSAgICAgIHVuc2ln bmVkIGxvbmcgKmhtbV9wZm4pCj4gIHsKPiAgCXN0cnVjdCBobW1fdm1hX3dhbGsgKmhtbV92bWFf d2FsayA9IHdhbGstPnByaXZhdGU7Cj4gIAlzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSA9IGhtbV92 bWFfd2Fsay0+cmFuZ2U7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4gLQl1aW50 NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCXB0ZV90IHB0 ZSA9ICpwdGVwOwo+IC0JdWludDY0X3Qgb3JpZ19wZm4gPSAqcGZuOwo+ICsJdWludDY0X3QgcGZu X3JlcV9mbGFncyA9ICpobW1fcGZuOwo+ICAKPiAgCWlmIChwdGVfbm9uZShwdGUpKSB7Cj4gLQkJ cmVxdWlyZWRfZmF1bHQgPSBobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3Bm biwgMCk7Cj4gKwkJcmVxdWlyZWRfZmF1bHQgPQo+ICsJCQlobW1fcHRlX25lZWRfZmF1bHQoaG1t X3ZtYV93YWxrLCBwZm5fcmVxX2ZsYWdzLCAwKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1bHQpCj4g IAkJCWdvdG8gZmF1bHQ7Cj4gLQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsK PiArCQkqaG1tX3BmbiA9IDA7Cj4gIAkJcmV0dXJuIDA7Cj4gIAl9Cj4gIAo+IEBAIC0yNTgsMTcg KzI0NiwxOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfaGFuZGxlX3B0ZShzdHJ1Y3QgbW1fd2FsayAq d2FsaywgdW5zaWduZWQgbG9uZyBhZGRyLAo+ICAJCSAqIHRoZSBQRk4gZXZlbiBpZiBub3QgcHJl c2VudC4KPiAgCQkgKi8KPiAgCQlpZiAoaG1tX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KHJhbmdl LCBlbnRyeSkpIHsKPiAtCQkJKnBmbiA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2Us Cj4gLQkJCQlkZXZpY2VfcHJpdmF0ZV9lbnRyeV90b19wZm4oZW50cnkpKTsKPiAtCQkJKnBmbiB8 PSByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwkJCWNwdV9mbGFncyA9IEhNTV9QRk5f VkFMSUQ7Cj4gIAkJCWlmIChpc193cml0ZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShlbnRyeSkpCj4g LQkJCQkqcGZuIHw9IHJhbmdlLT5mbGFnc1tITU1fUEZOX1dSSVRFXTsKPiArCQkJCWNwdV9mbGFn cyB8PSBITU1fUEZOX1dSSVRFOwo+ICsJCQkqaG1tX3BmbiA9IGRldmljZV9wcml2YXRlX2VudHJ5 X3RvX3BmbihlbnRyeSkgfAo+ICsJCQkJCWNwdV9mbGFnczsKPiAgCQkJcmV0dXJuIDA7Cj4gIAkJ fQo+ICAKPiAtCQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9wdGVfbmVlZF9mYXVsdChobW1fdm1hX3dh bGssIG9yaWdfcGZuLCAwKTsKPiArCQlyZXF1aXJlZF9mYXVsdCA9Cj4gKwkJCWhtbV9wdGVfbmVl ZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbl9yZXFfZmxhZ3MsIDApOwo+ICAJCWlmICghcmVxdWly ZWRfZmF1bHQpIHsKPiAtCQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsKPiAr CQkJKmhtbV9wZm4gPSAwOwo+ICAJCQlyZXR1cm4gMDsKPiAgCQl9Cj4gIAo+IEBAIC0yODgsNyAr Mjc3LDggQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9wdGUoc3RydWN0IG1tX3dhbGsgKndh bGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCX0KPiAgCj4gIAljcHVfZmxhZ3MgPSBwdGVfdG9f aG1tX3Bmbl9mbGFncyhyYW5nZSwgcHRlKTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9u ZWVkX2ZhdWx0KGhtbV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJl ZF9mYXVsdCA9Cj4gKwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9m bGFncywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlnb3RvIGZhdWx0 Owo+ICAKPiBAQCAtMjk3LDE1ICsyODcsMTUgQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9w dGUoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCSAqIGZhbGwg dGhyb3VnaCBhbmQgdHJlYXQgaXQgbGlrZSBhIG5vcm1hbCBwYWdlLgo+ICAJICovCj4gIAlpZiAo cHRlX3NwZWNpYWwocHRlKSAmJiAhaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkgewo+IC0JCWlm IChobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3BmbiwgMCkpIHsKPiArCQlp ZiAoaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgMCkpIHsK PiAgCQkJcHRlX3VubWFwKHB0ZXApOwo+ICAJCQlyZXR1cm4gLUVGQVVMVDsKPiAgCQl9Cj4gLQkJ KnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9FUlJPUl07Cj4gKwkJKmhtbV9wZm4gPSBITU1f UEZOX0VSUk9SOwo+ICAJCXJldHVybiAwOwo+ICAJfQo+ICAKPiAtCSpwZm4gPSBobW1fZGV2aWNl X2VudHJ5X2Zyb21fcGZuKHJhbmdlLCBwdGVfcGZuKHB0ZSkpIHwgY3B1X2ZsYWdzOwo+ICsJKmht bV9wZm4gPSBwdGVfcGZuKHB0ZSkgfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgCj4gIGZh dWx0Ogo+IEBAIC0zMjEsNyArMzExLDggQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBt ZF90ICpwbWRwLAo+ICB7Cj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dhbGsgPSB3 YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1hX3dhbGst PnJhbmdlOwo+IC0JdWludDY0X3QgKnBmbnMgPSAmcmFuZ2UtPnBmbnNbKHN0YXJ0IC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUXTsKPiArCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zID0KPiAr CQkmcmFuZ2UtPmhtbV9wZm5zWyhzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9TSElGVF07 Cj4gIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVDsK PiAgCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0Owo+ICAJcHRlX3QgKnB0ZXA7Cj4gQEAgLTMz MywxNiArMzI0LDE2IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwK PiAgCQlyZXR1cm4gaG1tX3ZtYV93YWxrX2hvbGUoc3RhcnQsIGVuZCwgLTEsIHdhbGspOwo+ICAK PiAgCWlmICh0aHBfbWlncmF0aW9uX3N1cHBvcnRlZCgpICYmIGlzX3BtZF9taWdyYXRpb25fZW50 cnkocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBm bnMsIG5wYWdlcywgMCkpIHsKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93 YWxrLCBobW1fcGZucywgbnBhZ2VzLCAwKSkgewo+ICAJCQlobW1fdm1hX3dhbGstPmxhc3QgPSBh ZGRyOwo+ICAJCQlwbWRfbWlncmF0aW9uX2VudHJ5X3dhaXQod2Fsay0+bW0sIHBtZHApOwo+ICAJ CQlyZXR1cm4gLUVCVVNZOwo+ICAJCX0KPiAtCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFydCwg ZW5kLCByYW5nZSwgSE1NX1BGTl9OT05FKTsKPiArCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFy dCwgZW5kLCByYW5nZSwgMCk7Cj4gIAl9Cj4gIAo+ICAJaWYgKCFwbWRfcHJlc2VudChwbWQpKSB7 Cj4gLQkJaWYgKGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2Vz LCAwKSkKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBobW1fcGZu cywgbnBhZ2VzLCAwKSkKPiAgCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gIAkJcmV0dXJuIGhtbV9wZm5z X2ZpbGwoc3RhcnQsIGVuZCwgcmFuZ2UsIEhNTV9QRk5fRVJST1IpOwo+ICAJfQo+IEBAIC0zNjIs NyArMzUzLDcgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJ CWlmICghcG1kX2Rldm1hcChwbWQpICYmICFwbWRfdHJhbnNfaHVnZShwbWQpKQo+ICAJCQlnb3Rv IGFnYWluOwo+ICAKPiAtCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIsIGVu ZCwgcGZucywgcG1kKTsKPiArCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIs IGVuZCwgaG1tX3BmbnMsIHBtZCk7Cj4gIAl9Cj4gIAo+ICAJLyoKPiBAQCAtMzcyLDE2ICszNjMs MTYgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJICogcmVj b3Zlci4KPiAgCSAqLwo+ICAJaWYgKHBtZF9iYWQocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2Vf bmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbnMsIG5wYWdlcywgMCkpCj4gKwkJaWYgKGhtbV9y YW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5wYWdlcywgMCkpCj4gIAkJ CXJldHVybiAtRUZBVUxUOwo+ICAJCXJldHVybiBobW1fcGZuc19maWxsKHN0YXJ0LCBlbmQsIHJh bmdlLCBITU1fUEZOX0VSUk9SKTsKPiAgCX0KPiAgCj4gIAlwdGVwID0gcHRlX29mZnNldF9tYXAo cG1kcCwgYWRkcik7Cj4gLQlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIHB0 ZXArKywgcGZucysrKSB7Cj4gKwlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUs IHB0ZXArKywgaG1tX3BmbnMrKykgewo+ICAJCWludCByOwo+ICAKPiAtCQlyID0gaG1tX3ZtYV9o YW5kbGVfcHRlKHdhbGssIGFkZHIsIGVuZCwgcG1kcCwgcHRlcCwgcGZucyk7Cj4gKwkJciA9IGht bV92bWFfaGFuZGxlX3B0ZSh3YWxrLCBhZGRyLCBlbmQsIHBtZHAsIHB0ZXAsIGhtbV9wZm5zKTsK PiAgCQlpZiAocikgewo+ICAJCQkvKiBobW1fdm1hX2hhbmRsZV9wdGUoKSBkaWQgcHRlX3VubWFw KCkgKi8KPiAgCQkJcmV0dXJuIHI7Cj4gQEAgLTM5MywxMyArMzg0LDEyIEBAIHN0YXRpYyBpbnQg aG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwKPiAgCj4gICNpZiBkZWZpbmVkKENPTkZJR19B UkNIX0hBU19QVEVfREVWTUFQKSAmJiBcCj4gICAgICBkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hf VFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEKQo+IC1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IHB1ZF90 b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLCBwdWRfdCBwdWQpCj4gK3N0 YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdWRfdG9faG1tX3Bmbl9mbGFncyhzdHJ1Y3QgaG1t X3JhbmdlICpyYW5nZSwKPiArCQkJCQkJIHB1ZF90IHB1ZCkKPiAgewo+ICAJaWYgKCFwdWRfcHJl c2VudChwdWQpKQo+ICAJCXJldHVybiAwOwo+IC0JcmV0dXJuIHB1ZF93cml0ZShwdWQpID8gcmFu Z2UtPmZsYWdzW0hNTV9QRk5fVkFMSURdIHwKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1dS SVRFXSA6Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwlyZXR1cm4gcHVk X3dyaXRlKHB1ZCkgPyAoSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUpIDogSE1NX1BGTl9W QUxJRDsKPiAgfQo+ICAKPiAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcHVkKHB1ZF90ICpwdWRw LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKPiBAQCAtNDI3LDcgKzQx Nyw4IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQg bG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCj4gIAlpZiAocHVkX2h1Z2UocHVkKSAmJiBw dWRfZGV2bWFwKHB1ZCkpIHsKPiAgCQl1bnNpZ25lZCBsb25nIGksIG5wYWdlcywgcGZuOwo+ICAJ CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAtCQl1aW50NjRfdCAqcGZucywgY3B1X2Zs YWdzOwo+ICsJCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zOwo+ICsJCXVuc2lnbmVkIGxvbmcgY3B1 X2ZsYWdzOwo+ICAKPiAgCQlpZiAoIXB1ZF9wcmVzZW50KHB1ZCkpIHsKPiAgCQkJc3Bpbl91bmxv Y2socHRsKTsKPiBAQCAtNDM2LDEwICs0MjcsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtf cHVkKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwK PiAgCj4gIAkJaSA9IChhZGRyIC0gcmFuZ2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJCW5w YWdlcyA9IChlbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUOwo+IC0JCXBmbnMgPSAmcmFuZ2UtPnBm bnNbaV07Cj4gKwkJaG1tX3BmbnMgPSAmcmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAKPiAgCQljcHVf ZmxhZ3MgPSBwdWRfdG9faG1tX3Bmbl9mbGFncyhyYW5nZSwgcHVkKTsKPiAtCQlyZXF1aXJlZF9m YXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywKPiArCQlyZXF1 aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMs Cj4gIAkJCQkJCSAgICAgIG5wYWdlcywgY3B1X2ZsYWdzKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1 bHQpIHsKPiAgCQkJc3Bpbl91bmxvY2socHRsKTsKPiBAQCAtNDQ4LDggKzQzOSw3IEBAIHN0YXRp YyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBzdGFydCwg dW5zaWduZWQgbG9uZyBlbmQsCj4gIAo+ICAJCXBmbiA9IHB1ZF9wZm4ocHVkKSArICgoYWRkciAm IH5QVURfTUFTSykgPj4gUEFHRV9TSElGVCk7Cj4gIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsg KytpLCArK3BmbikKPiAtCQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFu Z2UsIHBmbikgfAo+IC0JCQkJICBjcHVfZmxhZ3M7Cj4gKwkJCWhtbV9wZm5zW2ldID0gcGZuIHwg Y3B1X2ZsYWdzOwo+ICAJCWdvdG8gb3V0X3VubG9jazsKPiAgCX0KPiAgCj4gQEAgLTQ3Myw4ICs0 NjMsOSBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2VudHJ5KHB0ZV90ICpwdGUs IHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dh bGsgPSB3YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1h X3dhbGstPnJhbmdlOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB3YWxrLT52bWE7 Cj4gLQl1aW50NjRfdCBvcmlnX3BmbiwgY3B1X2ZsYWdzOwo+ICAJdW5zaWduZWQgaW50IHJlcXVp cmVkX2ZhdWx0Owo+ICsJdW5zaWduZWQgbG9uZyBwZm5fcmVxX2ZsYWdzOwo+ICsJdW5zaWduZWQg bG9uZyBjcHVfZmxhZ3M7Cj4gIAlzcGlubG9ja190ICpwdGw7Cj4gIAlwdGVfdCBlbnRyeTsKPiAg Cj4gQEAgLTQ4Miw5ICs0NzMsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfaHVnZXRsYl9l bnRyeShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLAo+ICAJZW50cnkgPSBodWdlX3B0 ZXBfZ2V0KHB0ZSk7Cj4gIAo+ICAJaSA9IChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9T SElGVDsKPiAtCW9yaWdfcGZuID0gcmFuZ2UtPnBmbnNbaV07Cj4gKwlwZm5fcmVxX2ZsYWdzID0g cmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAJY3B1X2ZsYWdzID0gcHRlX3RvX2htbV9wZm5fZmxhZ3Mo cmFuZ2UsIGVudHJ5KTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9uZWVkX2ZhdWx0KGht bV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJlZF9mYXVsdCA9Cj4g KwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgY3B1X2Zs YWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkgewo+ICAJCXNwaW5fdW5sb2NrKHB0bCk7Cj4g IAkJcmV0dXJuIGhtbV92bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7 Cj4gQEAgLTQ5Miw4ICs0ODQsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2Vu dHJ5KHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAo+ICAJcGZuID0gcHRlX3Bm bihlbnRyeSkgKyAoKHN0YXJ0ICYgfmhtYXNrKSA+PiBQQUdFX1NISUZUKTsKPiAgCWZvciAoOyBh ZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSwgaSsrLCBwZm4rKykKPiAtCQlyYW5nZS0+cGZu c1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfAo+IC0JCQkJIGNw dV9mbGFnczsKPiArCQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gKwo+ ICAJc3Bpbl91bmxvY2socHRsKTsKPiAgCXJldHVybiAwOwo+ICB9Cj4gQEAgLTUyNCw3ICs1MTYs NyBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa190ZXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVu c2lnbmVkIGxvbmcgZW5kLAo+ICAJICogZmFpbHVyZS4KPiAgCSAqLwo+ICAJaWYgKGhtbV9yYW5n ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywKPiAtCQkJCSByYW5nZS0+cGZucyArCj4gKwkJCQkg cmFuZ2UtPmhtbV9wZm5zICsKPiAgCQkJCQkgKChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFH RV9TSElGVCksCj4gIAkJCQkgKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZULCAwKSkKPiAgCQly ZXR1cm4gLUVGQVVMVDsKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRl dmVsCg== 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=-8.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id B899FC5518B for ; Wed, 22 Apr 2020 17:52:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 8FFC420882 for ; Wed, 22 Apr 2020 17:52:47 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="xDufRllK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8FFC420882 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 2A8E66E2A0; Wed, 22 Apr 2020 17:52:41 +0000 (UTC) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2055.outbound.protection.outlook.com [40.107.92.55]) by gabe.freedesktop.org (Postfix) with ESMTPS id AD1256E0AC; Wed, 22 Apr 2020 17:52:38 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fTVhhybvo5wjFOdPvCFKmhZy0WZX+nwUaDxB2dzQh8tdmSU/8GL9bh967AWbpbLWgc0WKTesZNysh7F0YOtCyQuJXgeWKAyMqgIlWbazxQ7WgQvwkJhO+tSRiVwEfOGPpSpOHU4DDhAu0CTWRdxxcIW7MsN0yUMqwaLaV1k4ev7hiiaJx4Md8Qvuaz80p9Gzg6BS/jZlxbeF/ZCMB2at1M06eTHICbaScWTTnQ0g1C4I5O9RyVIxCkbRqsQRmLD61Y0EiSl4qJCX29+6JZ73iSZ1Nx0HJ3JrVN6QutXIoX0oHAslPfHOr7VJ4PGobVDKydyZwFWA1vrhSmXyDXLD4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=eiNqWGaoAMNNDZ9SdRVYyTPfveVXJ4QiIgCQN0cfr+UKONUTRwz4eh/vIJBPOm9o9q09pBvWJa2RK5VjXbe9b7RFSuyXmJxCeV1e8AUQ1+3jLvtbDvwskTMmRAZT13CfveDNyHtqNoRBoTmqa+UKUxoyfqxn7VmBMRhhPxJu1j0iNlqKvDMWYLFB5TmFKr1p0k4wu0j0klrC0jPRoF05a0Kj9zOvltfMCmwxHJi5Kb6i6WbYyx26rLLoH5rUfQ0F6ORLVlD9CF4q7MiGpWX1pM3/ifbKpZ1BsyFM2hAMarqE+7IxXlcIVzWJmIz7qX9ZGxa/GtUdXRiUPwJGn1sbZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=xDufRllKZNptCO2HErv7emJj8Lv0dVLBRRRL9bR1ADmVhQpBDMAZT0H3h9VaBNeh8FL5uA3S6ucwU/1Xs2ytPjBTnArGhuZxljuvTmziOyiT+eOIskoJslPVJX3Dr1AdTtqqIvhPJtrcz7uohk/xsCFh0nqZDc2lGsFKqs/j0is= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Kuehling@amd.com; Received: from SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) by SN1PR12MB2432.namprd12.prod.outlook.com (2603:10b6:802:29::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Wed, 22 Apr 2020 17:52:36 +0000 Received: from SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806]) by SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806%7]) with mapi id 15.20.2921.030; Wed, 22 Apr 2020 17:52:36 +0000 To: Jason Gunthorpe , linux-mm@kvack.org, Ralph Campbell , "Yang, Philip" References: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> From: Felix Kuehling Message-ID: Date: Wed, 22 Apr 2020 13:52:32 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 In-Reply-To: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> Content-Language: en-US X-ClientProxiedBy: YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) To SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.2.100] (142.116.63.128) by YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13 via Frontend Transport; Wed, 22 Apr 2020 17:52:34 +0000 X-Originating-IP: [142.116.63.128] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-TrafficTypeDiagnostic: SN1PR12MB2432:|SN1PR12MB2432: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 03818C953D X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN1PR12MB2414.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(366004)(136003)(396003)(346002)(376002)(39860400002)(86362001)(31686004)(66556008)(44832011)(2616005)(4326008)(956004)(31696002)(66476007)(186003)(6486002)(66946007)(16526019)(26005)(36756003)(54906003)(110136005)(7416002)(316002)(16576012)(8936002)(5660300002)(478600001)(30864003)(2906002)(8676002)(6636002)(81156014)(52116002)(21314003); DIR:OUT; SFP:1101; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3bJqRGyQuymUYqx3R2Di2ElOTQ+GG984VY+gG7SmF3RJWjdcQ/LGQ/vqxIYMoNHNlZR/WBSi0AUI+n74ZcPUwu6igN5knW13BQl5Z6udwhWxpC9Hd0Jx7JbCuwpctZlyKv2r6e+tapSTDybB3X7YeTn1pXVEJ1Di8lL9zI+FzHnJ/mOqHLDW1t/v/X7vklc8gPjtxaeOB0LWNTVxT/agLlAQ6g1P+EeI8+uH8UOkC9L9nkBLkzCA3dIMDzSHfaKJE1HP1G/5aSNfZNBau6ZaKzVKvzKwWFaHyjqWcXTZ9uc9mGZ/GTNBUFK13WYK0X1yujId90dMLhGJ1CR60v5p0tnzuZBCbEhnlxPy3acIFU1hcJFPa0hYmAmLUnhXnTijjvgdPZoxRAEv16t3c3e8l4nt4Z3NkWAlJQzMGNDRkw901ilOfpy6fvtS/Yu/E4as8j6iuW3wRANJDO3Sb6btb8h5L7RnPBlwxmF21ZhXIZI= X-MS-Exchange-AntiSpam-MessageData: A/p+nH/3LM4XiR/cMcwuziDTYW5C5gGM9FDiDY/+410MT9g1zjqJob0o1KrmHpn7zOkmrtbzE0JJ7VSlYMdOKqCeTMy888QaUFLUWBuqAwzYyAK1ZjA6jgrL3MNVvq3byYL9FzWUffY34mk2qoaKhQ== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2020 17:52:35.8751 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vyV1rsnAsduW7VxFHfLYG3sE2GmBr6piPWuszR6qTa5uhCrqrTDZjF6jFlasjYNpfePf4gpA+dnpGIsu1Rdcvw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB2432 Subject: Re: [Intel-gfx] [PATCH hmm 5/5] mm/hmm: remove the customizable pfn format from hmm_range_fault X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "David \(ChunMing\) Zhou" , amd-gfx@lists.freedesktop.org, John Hubbard , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Christoph Hellwig , =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , Ben Skeggs , nouveau@lists.freedesktop.org, Alex Deucher , =?UTF-8?Q?Christian_K=c3=b6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" WytQaGlsaXAgWWFuZ10KCkFtIDIwMjAtMDQtMjEgdW0gODoyMSBwLm0uIHNjaHJpZWIgSmFzb24g R3VudGhvcnBlOgo+IEZyb206IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4KPgo+ IFByZXN1bWFibHkgdGhlIGludGVudCBoZXJlIHdhcyB0aGF0IGhtbV9yYW5nZV9mYXVsdCgpIGNv dWxkIHB1dCB0aGUgZGF0YQo+IGludG8gc29tZSBIVyBzcGVjaWZpYyBmb3JtYXQgYW5kIHRodXMg YXZvaWQgc29tZSB3b3JrLiBIb3dldmVyLCBub3RoaW5nCj4gYWN0dWFsbHkgZG9lcyB0aGF0LCBh bmQgaXQgaXNuJ3QgY2xlYXIgaG93IGFueXRoaW5nIGFjdHVhbGx5IGNvdWxkIGRvIHRoYXQKPiBh cyBobW1fcmFuZ2VfZmF1bHQoKSBwcm92aWRlcyBDUFUgYWRkcmVzc2VzIHdoaWNoIG11c3QgYmUg RE1BIG1hcHBlZC4KPgo+IFBlcmhhcHMgdGhlcmUgaXMgc29tZSBzcGVjaWFsIEhXIHRoYXQgZG9l cyBub3QgbmVlZCBETUEgbWFwcGluZywgYnV0IHdlCj4gZG9uJ3QgaGF2ZSBhbnkgZXhhbXBsZXMg b2YgdGhpcywgYW5kIHRoZSB0aGVvcmV0aWNhbCBwZXJmb3JtYW5jZSB3aW4gb2YKPiBhdm9pZGlu ZyBhbiBleHRyYSBzY2FuIG92ZXIgdGhlIHBmbnMgYXJyYXkgZG9lc24ndCBzZWVtIHdvcnRoIHRo ZQo+IGNvbXBsZXhpdHkuIFBsdXMgcGZucyBuZWVkcyB0byBiZSBzY2FubmVkIGFueWhvdyB0byBz b3J0IG91dCBhbnkKPiBERVZJQ0VfUFJJVkFURSBwYWdlcy4KPgo+IFRoaXMgdmVyc2lvbiByZXBs YWNlcyB0aGUgdWludDY0X3Qgd2l0aCBhbiB1c2lnbmVkIGxvbmcgY29udGFpbmluZyBhIHBmbgo+ IGFuZCBmaXggZmxhZ3MuIE9uIGlucHV0IGZsYWdzIGlzIGZpbGxlZCB3aXRoIHRoZSBITU1fUEZO X1JFUV8qIHZhbHVlcywgb24KPiBzdWNjZXNzZnVsIG91dHB1dCBpdCBpcyBmaWxsZWQgd2l0aCBI TU1fUEZOXyogdmFsdWVzLCBkZXNjcmliaW5nIHRoZSBzdGF0ZQo+IG9mIHRoZSBwYWdlcy4KPgo+ IGFtZGdwdSBpcyBzaW1wbGUgdG8gY29udmVydCwgaXQgZG9lc24ndCB1c2Ugc25hcHNob3QgYW5k IGRvZXNuJ3QgdXNlCj4gcGVyLXBhZ2UgZmxhZ3MuCj4KPiBub3V2ZWF1IHVzZXMgb25seSAxNiBo bW1fcHRlIGVudHJpZXMgYXQgbW9zdCAoaWUgZml0cyBpbiBhIGZldyBjYWNoZQo+IGxpbmVzKSwg YW5kIGl0IHN3ZWVwcyBvdmVyIGl0cyBwZm5zIGFycmF5IGEgY291cGxlIG9mIHRpbWVzIGFueWhv dy4KPgo+IFNpZ25lZC1vZmYtYnk6IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4K PiBTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KCkhpIEphc29u LAoKSSBwb2ludGVkIG91dCBhIHR5cG8gaW4gdGhlIGRvY3VtZW50YXRpb24gaW5saW5lLiBPdGhl ciB0aGFuIHRoYXQsIHRoZQpzZXJpZXMgaXMKCkFja2VkLWJ5OiBGZWxpeCBLdWVobGluZyA8RmVs aXguS3VlaGxpbmdAYW1kLmNvbT4KCkknbGwgdHJ5IHRvIGJ1aWxkIGl0IGFuZCBydW4gc29tZSBi YXNpYyB0ZXN0cyBsYXRlci4KCgo+IC0tLQo+ICBEb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QgICAg ICAgICAgICAgICAgfCAgMjYgKystLQo+ICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRn cHVfdHRtLmMgfCAgMzUgKystLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVf ZG1lbS5jICB8ICA2MCArKysrKysrLS0KPiAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVh dV9kbWVtLmggIHwgICA0ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3Zt LmMgICB8ICA1MiArKysrLS0tLQo+ICBpbmNsdWRlL2xpbnV4L2htbS5oICAgICAgICAgICAgICAg ICAgICAgfCAgOTkgKysrKysrLS0tLS0tLS0tCj4gIG1tL2htbS5jICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDE2MCArKysrKysrKysrKy0tLS0tLS0tLS0tLS0KPiAgNyBmaWxlcyBj aGFuZ2VkLCAyMDQgaW5zZXJ0aW9ucygrKSwgMjMyIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdp dCBhL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdCBiL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdAo+ IGluZGV4IDk5MjRmMmNhYTAxODRjLi43M2E5YjhjODU4ZTVkOSAxMDA2NDQKPiAtLS0gYS9Eb2N1 bWVudGF0aW9uL3ZtL2htbS5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QKPiBA QCAtMTg1LDkgKzE4NSw2IEBAIFRoZSB1c2FnZSBwYXR0ZXJuIGlzOjoKPiAgICAgICAgcmFuZ2Uu c3RhcnQgPSAuLi47Cj4gICAgICAgIHJhbmdlLmVuZCA9IC4uLjsKPiAgICAgICAgcmFuZ2UucGZu cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UuZmxhZ3MgPSAuLi47Cj4gLSAgICAgIHJhbmdlLnZhbHVl cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UucGZuX3NoaWZ0ID0gLi4uOwo+ICAKPiAgICAgICAgaWYg KCFtbWdldF9ub3RfemVybyhpbnRlcnZhbF9zdWItPm5vdGlmaWVyLm1tKSkKPiAgICAgICAgICAg IHJldHVybiAtRUZBVUxUOwo+IEBAIC0yMjksMTUgKzIyNiwxMCBAQCBUaGUgaG1tX3JhbmdlIHN0 cnVjdCBoYXMgMiBmaWVsZHMsIGRlZmF1bHRfZmxhZ3MgYW5kIHBmbl9mbGFnc19tYXNrLCB0aGF0 IHNwZWNpZgo+ICBmYXVsdCBvciBzbmFwc2hvdCBwb2xpY3kgZm9yIHRoZSB3aG9sZSByYW5nZSBp bnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgdGhlbQo+ICBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgcGZu cyBhcnJheS4KPiAgCj4gLUZvciBpbnN0YW5jZSwgaWYgdGhlIGRldmljZSBmbGFncyBmb3IgcmFu Z2UuZmxhZ3MgYXJlOjoKPiArRm9yIGluc3RhbmNlIGlmIHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRz IHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3QgcmVhZAo+ICtwZXJtaXNzaW9uLCBpdCBz ZXRzOjoKPiAgCj4gLSAgICByYW5nZS5mbGFnc1tITU1fUEZOX1ZBTElEXSA9ICgxIDw8IDYzKTsK PiAtICAgIHJhbmdlLmZsYWdzW0hNTV9QRk5fV1JJVEVdID0gKDEgPDwgNjIpOwo+IC0KPiAtYW5k IHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRzIHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3Qg cmVhZCBwZXJtaXNzaW9uLAo+IC1pdCBzZXRzOjoKPiAtCj4gLSAgICByYW5nZS0+ZGVmYXVsdF9m bGFncyA9ICgxIDw8IDYzKTsKPiArICAgIHJhbmdlLT5kZWZhdWx0X2ZsYWdzID0gSE1NX1BGTl9S RVFfVkFMSUQ7CgpUaGlzIHNob3VsZCBiZSBITU1fUEZOX1JFUV9GQVVMVC4KCgo+ICAgICAgcmFu Z2UtPnBmbl9mbGFnc19tYXNrID0gMDsKPiAgCj4gIGFuZCBjYWxscyBobW1fcmFuZ2VfZmF1bHQo KSBhcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgd2lsbCBmaWxsIGZhdWx0IGFsbCBwYWdlcwo+IEBA IC0yNDYsMTggKzIzOCwxOCBAQCBpbiB0aGUgcmFuZ2Ugd2l0aCBhdCBsZWFzdCByZWFkIHBlcm1p c3Npb24uCj4gIE5vdyBsZXQncyBzYXkgdGhlIGRyaXZlciB3YW50cyB0byBkbyB0aGUgc2FtZSBl eGNlcHQgZm9yIG9uZSBwYWdlIGluIHRoZSByYW5nZSBmb3IKPiAgd2hpY2ggaXQgd2FudHMgdG8g aGF2ZSB3cml0ZSBwZXJtaXNzaW9uLiBOb3cgZHJpdmVyIHNldDo6Cj4gIAo+IC0gICAgcmFuZ2Ut PmRlZmF1bHRfZmxhZ3MgPSAoMSA8PCA2Myk7Cj4gLSAgICByYW5nZS0+cGZuX2ZsYWdzX21hc2sg PSAoMSA8PCA2Mik7Cj4gLSAgICByYW5nZS0+cGZuc1tpbmRleF9vZl93cml0ZV0gPSAoMSA8PCA2 Mik7Cj4gKyAgICByYW5nZS0+ZGVmYXVsdF9mbGFncyA9IEhNTV9QRk5fUkVRX1ZBTElEOwoKSE1N X1BGTl9SRVFfRkFVTFQKClJlZ2FyZHMsCsKgIEZlbGl4CgoKPiArICAgIHJhbmdlLT5wZm5fZmxh Z3NfbWFzayA9IEhNTV9QRk5fUkVRX1dSSVRFOwo+ICsgICAgcmFuZ2UtPnBmbnNbaW5kZXhfb2Zf d3JpdGVdID0gSE1NX1BGTl9SRVFfV1JJVEU7Cj4gIAo+ICBXaXRoIHRoaXMsIEhNTSB3aWxsIGZh dWx0IGluIGFsbCBwYWdlcyB3aXRoIGF0IGxlYXN0IHJlYWQgKGkuZS4sIHZhbGlkKSBhbmQgZm9y IHRoZQo+ICBhZGRyZXNzID09IHJhbmdlLT5zdGFydCArIChpbmRleF9vZl93cml0ZSA8PCBQQUdF X1NISUZUKSBpdCB3aWxsIGZhdWx0IHdpdGgKPiAgd3JpdGUgcGVybWlzc2lvbiBpLmUuLCBpZiB0 aGUgQ1BVIHB0ZSBkb2VzIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gc2V0IHRoZW4gSE1NCj4g IHdpbGwgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKS4KPiAgCj4gLU5vdGUgdGhhdCBITU0gd2lsbCBw b3B1bGF0ZSB0aGUgcGZucyBhcnJheSB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIGFueSBwYWdl Cj4gLXRoYXQgaXMgbWFwcGVkIHdpdGggQ1BVIHdyaXRlIHBlcm1pc3Npb24gbm8gbWF0dGVyIHdo YXQgdmFsdWVzIGFyZSBzZXQKPiAtaW4gZGVmYXVsdF9mbGFncyBvciBwZm5fZmxhZ3NfbWFzay4K PiArQWZ0ZXIgaG1tX3JhbmdlX2ZhdWx0IGNvbXBsZXRlcyB0aGUgZmxhZyBiaXRzIGFyZSBzZXQg dG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YKPiArdGhlIHBhZ2UgdGFibGVzLCBpZSBITU1fUEZOX1ZB TElEIHwgSE1NX1BGTl9XUklURSB3aWxsIGJlIHNldCBpZiB0aGUgcGFnZSBpcwo+ICt3cml0YWJs ZS4KPiAgCj4gIAo+ICBSZXByZXNlbnQgYW5kIG1hbmFnZSBkZXZpY2UgbWVtb3J5IGZyb20gY29y ZSBrZXJuZWwgcG9pbnQgb2Ygdmlldwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVf dHRtLmMKPiBpbmRleCA0NDkwODNmOWY4YTJiZi4uYmNmYThjMjY2NDdkNWUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gQEAgLTc2NiwxNyArNzY2LDYgQEAg c3RydWN0IGFtZGdwdV90dG1fdHQgewo+ICB9Owo+ICAKPiAgI2lmZGVmIENPTkZJR19EUk1fQU1E R1BVX1VTRVJQVFIKPiAtLyogZmxhZ3MgdXNlZCBieSBITU0gaW50ZXJuYWwsIG5vdCByZWxhdGVk IHRvIENQVS9HUFUgUFRFIGZsYWdzICovCj4gLXN0YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFu Z2VfZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQkoMSA8PCAwKSwgLyogSE1NX1BGTl9W QUxJRCAqLwo+IC0JKDEgPDwgMSksIC8qIEhNTV9QRk5fV1JJVEUgKi8KPiAtfTsKPiAtCj4gLXN0 YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFuZ2VfdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFYXSA9 IHsKPiAtCTB4ZmZmZmZmZmZmZmZmZmZmZVVMLCAvKiBITU1fUEZOX0VSUk9SICovCj4gLQkwLCAv KiBITU1fUEZOX05PTkUgKi8KPiAtfTsKPiAtCj4gIC8qKgo+ICAgKiBhbWRncHVfdHRtX3R0X2dl dF91c2VyX3BhZ2VzIC0gZ2V0IGRldmljZSBhY2Nlc3NpYmxlIHBhZ2VzIHRoYXQgYmFjayB1c2Vy Cj4gICAqIG1lbW9yeSBhbmQgc3RhcnQgSE1NIHRyYWNraW5nIENQVSBwYWdlIHRhYmxlIHVwZGF0 ZQo+IEBAIC04MTUsMTggKzgwNCwxNSBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdl cyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCQlnb3RvIG91 dDsKPiAgCX0KPiAgCXJhbmdlLT5ub3RpZmllciA9ICZiby0+bm90aWZpZXI7Cj4gLQlyYW5nZS0+ ZmxhZ3MgPSBobW1fcmFuZ2VfZmxhZ3M7Cj4gLQlyYW5nZS0+dmFsdWVzID0gaG1tX3JhbmdlX3Zh bHVlczsKPiAtCXJhbmdlLT5wZm5fc2hpZnQgPSBQQUdFX1NISUZUOwo+ICAJcmFuZ2UtPnN0YXJ0 ID0gYm8tPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQ7Cj4gIAlyYW5nZS0+ZW5kID0gYm8t Pm5vdGlmaWVyLmludGVydmFsX3RyZWUubGFzdCArIDE7Cj4gLQlyYW5nZS0+ZGVmYXVsdF9mbGFn cyA9IGhtbV9yYW5nZV9mbGFnc1tITU1fUEZOX1ZBTElEXTsKPiArCXJhbmdlLT5kZWZhdWx0X2Zs YWdzID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gIAlpZiAoIWFtZGdwdV90dG1fdHRfaXNfcmVhZG9u bHkodHRtKSkKPiAtCQlyYW5nZS0+ZGVmYXVsdF9mbGFncyB8PSByYW5nZS0+ZmxhZ3NbSE1NX1BG Tl9XUklURV07Cj4gKwkJcmFuZ2UtPmRlZmF1bHRfZmxhZ3MgfD0gSE1NX1BGTl9SRVFfV1JJVEU7 Cj4gIAo+IC0JcmFuZ2UtPnBmbnMgPSBrdm1hbGxvY19hcnJheSh0dG0tPm51bV9wYWdlcywgc2l6 ZW9mKCpyYW5nZS0+cGZucyksCj4gLQkJCQkgICAgIEdGUF9LRVJORUwpOwo+IC0JaWYgKHVubGlr ZWx5KCFyYW5nZS0+cGZucykpIHsKPiArCXJhbmdlLT5obW1fcGZucyA9IGt2bWFsbG9jX2FycmF5 KHR0bS0+bnVtX3BhZ2VzLAo+ICsJCQkJCSBzaXplb2YoKnJhbmdlLT5obW1fcGZucyksIEdGUF9L RVJORUwpOwo+ICsJaWYgKHVubGlrZWx5KCFyYW5nZS0+aG1tX3BmbnMpKSB7Cj4gIAkJciA9IC1F Tk9NRU07Cj4gIAkJZ290byBvdXRfZnJlZV9yYW5nZXM7Cj4gIAl9Cj4gQEAgLTg2Nyw3ICs4NTMs NyBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpi bywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCSAqIHRoZSBub3RpZmllcl9sb2NrLCBhbmQgbW11 X2ludGVydmFsX3JlYWRfcmV0cnkoKSBtdXN0IGJlIGRvbmUgZmlyc3QuCj4gIAkgKi8KPiAgCWZv ciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKQo+IC0JCXBhZ2VzW2ldID0gaG1tX2Rl dmljZV9lbnRyeV90b19wYWdlKHJhbmdlLCByYW5nZS0+cGZuc1tpXSk7Cj4gKwkJcGFnZXNbaV0g PSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiAgCj4gIAlndHQtPnJhbmdl ID0gcmFuZ2U7Cj4gIAltbXB1dChtbSk7Cj4gQEAgLTg3Nyw3ICs4NjMsNyBAQCBpbnQgYW1kZ3B1 X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2Ug KipwYWdlcykKPiAgb3V0X3VubG9jazoKPiAgCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIG91 dF9mcmVlX3BmbnM6Cj4gLQlrdmZyZWUocmFuZ2UtPnBmbnMpOwo+ICsJa3ZmcmVlKHJhbmdlLT5o bW1fcGZucyk7Cj4gIG91dF9mcmVlX3JhbmdlczoKPiAgCWtmcmVlKHJhbmdlKTsKPiAgb3V0Ogo+ IEBAIC05MDIsNyArODg4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJRFJNX0RFQlVHX0RSSVZFUigidXNlcl9wYWdlc19k b25lIDB4JWxseCBwYWdlcyAweCVseFxuIiwKPiAgCQlndHQtPnVzZXJwdHIsIHR0bS0+bnVtX3Bh Z2VzKTsKPiAgCj4gLQlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPnBmbnMs Cj4gKwlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPmhtbV9wZm5zLAo+ICAJ CSJObyB1c2VyIHBhZ2VzIHRvIGNoZWNrXG4iKTsKPiAgCj4gIAlpZiAoZ3R0LT5yYW5nZSkgewo+ IEBAIC05MTIsNyArODk4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJCSAqLwo+ICAJCXIgPSBtbXVfaW50ZXJ2YWxfcmVh ZF9yZXRyeShndHQtPnJhbmdlLT5ub3RpZmllciwKPiAgCQkJCQkgZ3R0LT5yYW5nZS0+bm90aWZp ZXJfc2VxKTsKPiAtCQlrdmZyZWUoZ3R0LT5yYW5nZS0+cGZucyk7Cj4gKwkJa3ZmcmVlKGd0dC0+ cmFuZ2UtPmhtbV9wZm5zKTsKPiAgCQlrZnJlZShndHQtPnJhbmdlKTsKPiAgCQlndHQtPnJhbmdl ID0gTlVMTDsKPiAgCX0KPiBAQCAtMTAwMyw4ICs5ODksNyBAQCBzdGF0aWMgdm9pZCBhbWRncHVf dHRtX3R0X3VucGluX3VzZXJwdHIoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAKPiAgCQlmb3IgKGkg PSAwOyBpIDwgdHRtLT5udW1fcGFnZXM7IGkrKykgewo+ICAJCQlpZiAodHRtLT5wYWdlc1tpXSAh PQo+IC0JCQkJaG1tX2RldmljZV9lbnRyeV90b19wYWdlKGd0dC0+cmFuZ2UsCj4gLQkJCQkJICAg ICAgZ3R0LT5yYW5nZS0+cGZuc1tpXSkpCj4gKwkJCSAgICBobW1fcGZuX3RvX3BhZ2UoZ3R0LT5y YW5nZS0+aG1tX3BmbnNbaV0pKQo+ICAJCQkJYnJlYWs7Cj4gIAkJfQo+ICAKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmMgYi9kcml2ZXJzL2dwdS9k cm0vbm91dmVhdS9ub3V2ZWF1X2RtZW0uYwo+IGluZGV4IGFkODllMDlhMGJlMzlhLi4wNzg3NmZi MGUxZDY2NSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rt ZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5jCj4gQEAg LTY3MiwyNyArNjcyLDYxIEBAIG5vdXZlYXVfZG1lbV9taWdyYXRlX3ZtYShzdHJ1Y3Qgbm91dmVh dV9kcm0gKmRybSwKPiAgCXJldHVybiByZXQ7Cj4gIH0KPiAgCj4gLXZvaWQKPiAtbm91dmVhdV9k bWVtX2NvbnZlcnRfcGZuKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+IC0JCQkgc3RydWN0IGht bV9yYW5nZSAqcmFuZ2UpCj4gK3ZvaWQgbm91dmVhdV9obW1fY29udmVydF9wZm4oc3RydWN0IG5v dXZlYXVfZHJtICpkcm0sIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkgICAgIHU2NCAq aW9jdGxfYWRkcikKPiAgewo+ICAJdW5zaWduZWQgbG9uZyBpLCBucGFnZXM7Cj4gIAo+ICsJLyoK PiArCSAqIFRoZSBpb2N0bF9hZGRyIHByZXBhcmVkIGhlcmUgaXMgcGFzc2VkIHRocm91Z2ggbnZp Zl9vYmplY3RfaW9jdGwoKQo+ICsJICogdG8gYW4gZXZlbnR1YWwgRE1BIG1hcCBvbiBzb21lIGNh bGwgY2hhaW4gbGlrZToKPiArCSAqICAgIG5vdXZlYXVfc3ZtX2ZhdWx0KCk6Cj4gKwkgKiAgICAg IGFyZ3MuaS5tLm1ldGhvZCA9IE5WSUZfVk1NX1YwX1BGTk1BUAo+ICsJICogICAgICBub3V2ZWF1 X3JhbmdlX2ZhdWx0KCkKPiArCSAqICAgICAgIG52aWZfb2JqZWN0X2lvY3RsKCkKPiArCSAqICAg ICAgICBjbGllbnQtPmRyaXZlci0+aW9jdGwoKQo+ICsJICogICAgICAgICAgIHN0cnVjdCBudmlm X2RyaXZlciBudmlmX2RyaXZlcl9udmttOgo+ICsJICogICAgICAgICAgICAgLmlvY3RsID0gbnZr bV9jbGllbnRfaW9jdGwKPiArCSAqICAgICAgICAgICAgbnZrbV9pb2N0bCgpCj4gKwkgKiAgICAg ICAgICAgICBudmttX2lvY3RsX3BhdGgoKQo+ICsJICogICAgICAgICAgICAgICBudmttX2lvY3Rs X3YwW3R5cGVdLmZ1bmMoLi4pCj4gKwkgKiAgICAgICAgICAgICAgIG52a21faW9jdGxfbXRoZCgp Cj4gKwkgKiAgICAgICAgICAgICAgICBudmttX29iamVjdF9tdGhkKCkKPiArCSAqICAgICAgICAg ICAgICAgICAgIHN0cnVjdCBudmttX29iamVjdF9mdW5jIG52a21fdXZtbToKPiArCSAqICAgICAg ICAgICAgICAgICAgICAgLm10aGQgPSBudmttX3V2bW1fbXRoZAo+ICsJICogICAgICAgICAgICAg ICAgICAgIG52a21fdXZtbV9tdGhkKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgbnZrbV91 dm1tX210aGRfcGZubWFwKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3Bm bl9tYXAoKQo+ICsJICogICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3B0ZXNfZ2V0X21h cCgpCj4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPT0gZ3AxMDBfdm1tX3BndF9w Zm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudmttX3ZtbV9kZXNjX2Z1 bmMgZ3AxMDBfdm1tX2Rlc2Nfc3B0Ogo+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAu cGZuID0gZ3AxMDBfdm1tX3BndF9wZm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBu dmttX3ZtbV9pdGVyKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1BURVMg PT0gZnVuYyA9PSBncDEwMF92bW1fcGd0X3BmbigpCj4gKwkgKgkJCSAgICAgIGRtYV9tYXBfcGFn ZSgpCj4gKwkgKgo+ICsJICogVGhpcyBpcyBhbGwganVzdCBlbmNvZGluZyB0aGUgaW50ZXJuYWwg aG1tIHJlcHJlbnNldGF0aW9uIGludG8gYQo+ICsJICogZGlmZmVyZW50IG5vdXZlYXUgaW50ZXJu YWwgcmVwcmVzZW50YXRpb24uCj4gKwkgKi8KPiAgCW5wYWdlcyA9IChyYW5nZS0+ZW5kIC0gcmFu Z2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytp KSB7Cj4gIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Cj4gLQkJdWludDY0X3QgYWRkcjsKPiAgCj4gLQkJ cGFnZSA9IGhtbV9kZXZpY2VfZW50cnlfdG9fcGFnZShyYW5nZSwgcmFuZ2UtPnBmbnNbaV0pOwo+ IC0JCWlmIChwYWdlID09IE5VTEwpCj4gLQkJCWNvbnRpbnVlOwo+IC0KPiAtCQlpZiAoIWlzX2Rl dmljZV9wcml2YXRlX3BhZ2UocGFnZSkpCj4gKwkJaWYgKCEocmFuZ2UtPmhtbV9wZm5zW2ldICYg SE1NX1BGTl9WQUxJRCkpIHsKPiArCQkJaW9jdGxfYWRkcltpXSA9IDA7Cj4gIAkJCWNvbnRpbnVl Owo+ICsJCX0KPiAgCj4gLQkJYWRkciA9IG5vdXZlYXVfZG1lbV9wYWdlX2FkZHIocGFnZSk7Cj4g LQkJcmFuZ2UtPnBmbnNbaV0gJj0gKCgxVUwgPDwgcmFuZ2UtPnBmbl9zaGlmdCkgLSAxKTsKPiAt CQlyYW5nZS0+cGZuc1tpXSB8PSAoYWRkciA+PiBQQUdFX1NISUZUKSA8PCByYW5nZS0+cGZuX3No aWZ0Owo+IC0JCXJhbmdlLT5wZm5zW2ldIHw9IE5WSUZfVk1NX1BGTk1BUF9WMF9WUkFNOwo+ICsJ CXBhZ2UgPSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiArCQlpZiAoaXNf ZGV2aWNlX3ByaXZhdGVfcGFnZShwYWdlKSkKPiArCQkJaW9jdGxfYWRkcltpXSA9IG5vdXZlYXVf ZG1lbV9wYWdlX2FkZHIocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwKPiAr CQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfVlJBTTsKPiArCQllbHNlCj4gKwkJCWlvY3RsX2FkZHJb aV0gPSBwYWdlX3RvX3BoeXMocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwK PiArCQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfSE9TVDsKPiArCQlpZiAocmFuZ2UtPmhtbV9wZm5z W2ldICYgSE1NX1BGTl9XUklURSkKPiArCQkJaW9jdGxfYWRkcltpXSB8PSBOVklGX1ZNTV9QRk5N QVBfVjBfVzsKPiAgCX0KPiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVh dS9ub3V2ZWF1X2RtZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5o Cj4gaW5kZXggOTIzOTRiZTVkNjQ5MjMuLjQ2MDdjMGJlN2RkMDYyIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5oCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmgKPiBAQCAtMzgsOCArMzgsOCBAQCBpbnQgbm91dmVh dV9kbWVtX21pZ3JhdGVfdm1hKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+ICAJCQkgICAgIHVu c2lnbmVkIGxvbmcgc3RhcnQsCj4gIAkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpOwo+ICAKPiAt dm9pZCBub3V2ZWF1X2RtZW1fY29udmVydF9wZm4oc3RydWN0IG5vdXZlYXVfZHJtICpkcm0sCj4g LQkJCSAgICAgIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlKTsKPiArdm9pZCBub3V2ZWF1X2htbV9j b252ZXJ0X3BmbihzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSwgc3RydWN0IGhtbV9yYW5nZSAqcmFu Z2UsCj4gKwkJCSAgICAgdTY0ICppb2N0bF9hZGRyKTsKPiAgI2Vsc2UgLyogSVNfRU5BQkxFRChD T05GSUdfRFJNX05PVVZFQVVfU1ZNKSAqLwo+ICBzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9k bWVtX2luaXQoc3RydWN0IG5vdXZlYXVfZHJtICpkcm0pIHt9Cj4gIHN0YXRpYyBpbmxpbmUgdm9p ZCBub3V2ZWF1X2RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSkge30KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdm0uYyBiL2RyaXZlcnMvZ3B1 L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBpbmRleCBjZjBkOWJkNjFiZWJmOS4uZDEwNTli Y2UwOTExOTIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9z dm0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBAQCAt MzY5LDE4ICszNjksNiBAQCBub3V2ZWF1X3N2bW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB2b2lkICpkYXRhLAo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiAtc3RhdGljIGNvbnN0IHU2 NAo+IC1ub3V2ZWF1X3N2bV9wZm5fZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQlbSE1N X1BGTl9WQUxJRCAgICAgICAgIF0gPSBOVklGX1ZNTV9QRk5NQVBfVjBfViwKPiAtCVtITU1fUEZO X1dSSVRFICAgICAgICAgXSA9IE5WSUZfVk1NX1BGTk1BUF9WMF9XLAo+IC19Owo+IC0KPiAtc3Rh dGljIGNvbnN0IHU2NAo+IC1ub3V2ZWF1X3N2bV9wZm5fdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFY XSA9IHsKPiAtCVtITU1fUEZOX0VSUk9SICBdID0gfk5WSUZfVk1NX1BGTk1BUF9WMF9WLAo+IC0J W0hNTV9QRk5fTk9ORSAgIF0gPSAgTlZJRl9WTU1fUEZOTUFQX1YwX05PTkUsCj4gLX07Cj4gLQo+ ICAvKiBJc3N1ZSBmYXVsdCByZXBsYXkgZm9yIEdQVSB0byByZXRyeSBhY2Nlc3NlcyB0aGF0IGZh dWx0ZWQgcHJldmlvdXNseS4gKi8KPiAgc3RhdGljIHZvaWQKPiAgbm91dmVhdV9zdm1fZmF1bHRf cmVwbGF5KHN0cnVjdCBub3V2ZWF1X3N2bSAqc3ZtKQo+IEBAIC01MjAsNyArNTA4LDggQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBtbXVfaW50ZXJ2YWxfbm90aWZpZXJfb3BzIG5vdXZlYXVfc3ZtX21u aV9vcHMgPSB7Cj4gIAo+ICBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQoc3RydWN0IG5v dXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLCB2 b2lkICpkYXRhLCB1MzIgc2l6ZSwKPiAtCQkJICAgICAgIHU2NCAqcGZucywgc3RydWN0IHN2bV9u b3RpZmllciAqbm90aWZpZXIpCj4gKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGhtbV9wZm5zW10s IHU2NCAqaW9jdGxfYWRkciwKPiArCQkJICAgICAgIHN0cnVjdCBzdm1fbm90aWZpZXIgKm5vdGlm aWVyKQo+ICB7Cj4gIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPQo+ICAJCWppZmZpZXMgKyBtc2Vj c190b19qaWZmaWVzKEhNTV9SQU5HRV9ERUZBVUxUX1RJTUVPVVQpOwo+IEBAIC01MjksMTAgKzUx OCw4IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVsdChzdHJ1Y3Qgbm91dmVhdV9zdm1t ICpzdm1tLAo+ICAJCS5ub3RpZmllciA9ICZub3RpZmllci0+bm90aWZpZXIsCj4gIAkJLnN0YXJ0 ID0gbm90aWZpZXItPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQsCj4gIAkJLmVuZCA9IG5v dGlmaWVyLT5ub3RpZmllci5pbnRlcnZhbF90cmVlLmxhc3QgKyAxLAo+IC0JCS5wZm5zID0gcGZu cywKPiAtCQkuZmxhZ3MgPSBub3V2ZWF1X3N2bV9wZm5fZmxhZ3MsCj4gLQkJLnZhbHVlcyA9IG5v dXZlYXVfc3ZtX3Bmbl92YWx1ZXMsCj4gLQkJLnBmbl9zaGlmdCA9IE5WSUZfVk1NX1BGTk1BUF9W MF9BRERSX1NISUZULAo+ICsJCS5wZm5fZmxhZ3NfbWFzayA9IEhNTV9QRk5fUkVRX0ZBVUxUIHwg SE1NX1BGTl9SRVFfV1JJVEUsCj4gKwkJLmhtbV9wZm5zID0gaG1tX3BmbnMsCj4gIAl9Owo+ICAJ c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBub3RpZmllci0+bm90aWZpZXIubW07Cj4gIAlpbnQgcmV0 Owo+IEBAIC01NDIsMTIgKzUyOSwxNSBAQCBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQo c3RydWN0IG5vdXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJcmV0dXJuIC1FQlVTWTsKPiAgCj4gIAkJ cmFuZ2Uubm90aWZpZXJfc2VxID0gbW11X2ludGVydmFsX3JlYWRfYmVnaW4ocmFuZ2Uubm90aWZp ZXIpOwo+IC0JCXJhbmdlLmRlZmF1bHRfZmxhZ3MgPSAwOwo+IC0JCXJhbmdlLnBmbl9mbGFnc19t YXNrID0gLTFVTDsKPiAgCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIAkJcmV0ID0gaG1t X3JhbmdlX2ZhdWx0KCZyYW5nZSk7Cj4gIAkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKPiAgCQlp ZiAocmV0KSB7Cj4gKwkJCS8qCj4gKwkJCSAqIEZJWE1FOiB0aGUgaW5wdXQgUEZOX1JFUSBmbGFn cyBhcmUgZGVzdHJveWVkIG9uCj4gKwkJCSAqIC1FQlVTWSwgd2UgbmVlZCB0byByZWdlbmVyYXRl IHRoZW0sIGFsc28gZm9yIHRoZQo+ICsJCQkgKiBvdGhlciBjb250aW51ZSBiZWxvdwo+ICsJCQkg Ki8KPiAgCQkJaWYgKHJldCA9PSAtRUJVU1kpCj4gIAkJCQljb250aW51ZTsKPiAgCQkJcmV0dXJu IHJldDsKPiBAQCAtNTYyLDcgKzU1Miw3IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVs dChzdHJ1Y3Qgbm91dmVhdV9zdm1tICpzdm1tLAo+ICAJCWJyZWFrOwo+ICAJfQo+ICAKPiAtCW5v dXZlYXVfZG1lbV9jb252ZXJ0X3Bmbihkcm0sICZyYW5nZSk7Cj4gKwlub3V2ZWF1X2htbV9jb252 ZXJ0X3Bmbihkcm0sICZyYW5nZSwgaW9jdGxfYWRkcik7Cj4gIAo+ICAJc3ZtbS0+dm1tLT52bW0u b2JqZWN0LmNsaWVudC0+c3VwZXIgPSB0cnVlOwo+ICAJcmV0ID0gbnZpZl9vYmplY3RfaW9jdGwo JnN2bW0tPnZtbS0+dm1tLm9iamVjdCwgZGF0YSwgc2l6ZSwgTlVMTCk7Cj4gQEAgLTU4OSw2ICs1 NzksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlmeSkKPiAg CQl9IGk7Cj4gIAkJdTY0IHBoeXNbMTZdOwo+ICAJfSBhcmdzOwo+ICsJdW5zaWduZWQgbG9uZyBo bW1fcGZuc1tBUlJBWV9TSVpFKGFyZ3MucGh5cyldOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWE7Cj4gIAl1NjQgaW5zdCwgc3RhcnQsIGxpbWl0Owo+ICAJaW50IGZpLCBmbiwgcGksIGZp bGw7Cj4gQEAgLTcwNCwxMiArNjk1LDE3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlm X25vdGlmeSAqbm90aWZ5KQo+ICAJCQkgKiBhY2Nlc3MgZmxhZ3MuCj4gIAkJCSAqWFhYOiBhdG9t aWM/Cj4gIAkJCSAqLwo+IC0JCQlpZiAoYnVmZmVyLT5mYXVsdFtmbl0tPmFjY2VzcyAhPSAwIC8q IFJFQUQuICovICYmCj4gLQkJCSAgICBidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzICE9IDMgLyog UFJFRkVUQ0guICovKSB7Cj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBf VjBfViB8Cj4gLQkJCQkJCSAgTlZJRl9WTU1fUEZOTUFQX1YwX1c7Cj4gLQkJCX0gZWxzZSB7Cj4g LQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfVjsKPiArCQkJc3dpdGNo IChidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzKSB7Cj4gKwkJCWNhc2UgMDogLyogUkVBRC4gKi8K PiArCQkJCWhtbV9wZm5zW3BpKytdID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gKwkJCQlicmVhazsK PiArCQkJY2FzZSAzOiAvKiBQUkVGRVRDSC4gKi8KPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsK PiArCQkJCWJyZWFrOwo+ICsJCQlkZWZhdWx0Ogo+ICsJCQkJaG1tX3BmbnNbcGkrK10gPSBITU1f UEZOX1JFUV9GQVVMVCB8Cj4gKwkJCQkJCSBITU1fUEZOX1JFUV9XUklURTsKPiArCQkJCWJyZWFr Owo+ICAJCQl9Cj4gIAkJCWFyZ3MuaS5wLnNpemUgPSBwaSA8PCBQQUdFX1NISUZUOwo+ICAKPiBA QCAtNzM3LDcgKzczMyw3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlmX25vdGlmeSAq bm90aWZ5KQo+ICAJCQlmaWxsID0gKGJ1ZmZlci0+ZmF1bHRbZm4gICAgXS0+YWRkciAtCj4gIAkJ CQlidWZmZXItPmZhdWx0W2ZuIC0gMV0tPmFkZHIpID4+IFBBR0VfU0hJRlQ7Cj4gIAkJCXdoaWxl ICgtLWZpbGwpCj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfTk9O RTsKPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsKPiAgCQl9Cj4gIAo+ICAJCVNWTU1fREJHKHN2 bW0sICJ3bmR3ICUwMTZsbHgtJTAxNmxseCBjb3ZlcmluZyAlZCBmYXVsdChzKSIsCj4gQEAgLTc1 Myw3ICs3NDksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlm eSkKPiAgCQkJcmV0ID0gbm91dmVhdV9yYW5nZV9mYXVsdCgKPiAgCQkJCXN2bW0sIHN2bS0+ZHJt LCAmYXJncywKPiAgCQkJCXNpemVvZihhcmdzLmkpICsgcGkgKiBzaXplb2YoYXJncy5waHlzWzBd KSwKPiAtCQkJCWFyZ3MucGh5cywgJm5vdGlmaWVyKTsKPiArCQkJCWhtbV9wZm5zLCBhcmdzLnBo eXMsICZub3RpZmllcik7Cj4gIAkJCW1tdV9pbnRlcnZhbF9ub3RpZmllcl9yZW1vdmUoJm5vdGlm aWVyLm5vdGlmaWVyKTsKPiAgCQl9Cj4gIAkJbW1wdXQobW0pOwo+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2htbS5oIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IGluZGV4IDgxYzMwMmM4ODRj MGUzLi5lNzI1Mjk3ODZmMTZmOCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2htbS5oCj4g KysrIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IEBAIC0xOSw0NSArMTksNDUgQEAKPiAgI2luY2x1 ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl9mbGFnX2Ug LSBITU0gZmxhZyBlbnVtcwo+ICsgKiBPbiBvdXRwdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgLSBU aGUgcGFnZSBpcyBmYXVsdGFibGUgYW5kIGEgZnV0dXJlIGNhbGwgd2l0aCAKPiArICogICAgICAg ICAgICAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUIGNvdWxkIHN1Y2NlZWQuCj4gKyAqIEhNTV9QRk5f VkFMSUQgLSB0aGUgcGZuIGZpZWxkIHBvaW50cyB0byBhIHZhbGlkIFBGTi4gVGhpcyBQRk4gaXMg YXQKPiArICogICAgICAgICAgICAgICAgIGxlYXN0IHJlYWRhYmxlLiBJZiBkZXZfcHJpdmF0ZV9v d25lciBpcyAhTlVMTCB0aGVuIHRoaXMgY291bGQKPiArICogICAgICAgICAgICAgICAgIHBvaW50 IGF0IGEgREVWSUNFX1BSSVZBVEUgcGFnZS4KPiArICogSE1NX1BGTl9XUklURSAtIGlmIHRoZSBw YWdlIG1lbW9yeSBjYW4gYmUgd3JpdHRlbiB0byAocmVxdWlyZXMgSE1NX1BGTl9WQUxJRCkKPiAr ICogSE1NX1BGTl9FUlJPUiAtIGFjY2Vzc2luZyB0aGUgcGZuIGlzIGltcG9zc2libGUgYW5kIHRo ZSBkZXZpY2Ugc2hvdWxkCj4gKyAqICAgICAgICAgICAgICAgICBmYWlsLiBpZSBwb2lzb25lZCBt ZW1vcnksIHNwZWNpYWwgcGFnZXMsIG5vIHZtYSwgZXRjCj4gICAqCj4gLSAqIEZsYWdzOgo+IC0g KiBITU1fUEZOX1ZBTElEOiBwZm4gaXMgdmFsaWQuIEl0IGhhcywgYXQgbGVhc3QsIHJlYWQgcGVy bWlzc2lvbi4KPiAtICogSE1NX1BGTl9XUklURTogQ1BVIHBhZ2UgdGFibGUgaGFzIHdyaXRlIHBl cm1pc3Npb24gc2V0Cj4gLSAqCj4gLSAqIFRoZSBkcml2ZXIgcHJvdmlkZXMgYSBmbGFncyBhcnJh eSBmb3IgbWFwcGluZyBwYWdlIHByb3RlY3Rpb25zIHRvIGRldmljZQo+IC0gKiBQVEUgYml0cy4g SWYgdGhlIGRyaXZlciB2YWxpZCBiaXQgZm9yIGFuIGVudHJ5IGlzIGJpdCAzLAo+IC0gKiBpLmUu LCAoZW50cnkgJiAoMSA8PCAzKSksIHRoZW4gdGhlIGRyaXZlciBtdXN0IHByb3ZpZGUKPiAtICog YW4gYXJyYXkgaW4gaG1tX3JhbmdlLmZsYWdzIHdpdGggaG1tX3JhbmdlLmZsYWdzW0hNTV9QRk5f VkFMSURdID09IDEgPDwgMy4KPiAtICogU2FtZSBsb2dpYyBhcHBseSB0byBhbGwgZmxhZ3MuIFRo aXMgaXMgdGhlIHNhbWUgaWRlYSBhcyB2bV9wYWdlX3Byb3QgaW4gdm1hCj4gLSAqIGV4Y2VwdCB0 aGF0IHRoaXMgaXMgcGVyIGRldmljZSBkcml2ZXIgcmF0aGVyIHRoYW4gcGVyIGFyY2hpdGVjdHVy ZS4KPiArICogT24gaW5wdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgICAgIC0gUmV0dXJuIHRoZSBj dXJyZW50IHN0YXRlIG9mIHRoZSBwYWdlLCBkbyBub3QgZmF1bHQgaXQuCj4gKyAqIEhNTV9QRk5f UkVRX0ZBVUxUIC0gVGhlIG91dHB1dCBtdXN0IGhhdmUgSE1NX1BGTl9WQUxJRCBvciBobW1fcmFu Z2VfZmF1bHQoKQo+ICsgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgZmFpbAo+ICsgKiBITU1f UEZOX1JFUV9XUklURSAtIFRoZSBvdXRwdXQgbXVzdCBoYXZlIEhNTV9QRk5fV1JJVEUgb3IgaG1t X3JhbmdlX2ZhdWx0KCkKPiArICogICAgICAgICAgICAgICAgICAgICB3aWxsIGZhaWwuIE11c3Qg YmUgY29tYmluZWQgd2l0aCBITU1fUEZOX1JFUV9GQVVMVC4KPiAgICovCj4gLWVudW0gaG1tX3Bm bl9mbGFnX2Ugewo+IC0JSE1NX1BGTl9WQUxJRCA9IDAsCj4gLQlITU1fUEZOX1dSSVRFLAo+IC0J SE1NX1BGTl9GTEFHX01BWAo+ICtlbnVtIGhtbV9wZm5fZmxhZ3Mgewo+ICsJSE1NX1BGTl9WQUxJ RCA9IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIDEpLAo+ICsJSE1NX1BGTl9XUklURSA9IDFVTCA8 PCAoQklUU19QRVJfTE9ORyAtIDIpLAo+ICsJSE1NX1BGTl9FUlJPUiA9IDFVTCA8PCAoQklUU19Q RVJfTE9ORyAtIDMpLAo+ICsKPiArCUhNTV9QRk5fUkVRX0ZBVUxUID0gSE1NX1BGTl9WQUxJRCwK PiArCUhNTV9QRk5fUkVRX1dSSVRFID0gSE1NX1BGTl9XUklURSwKPiArCj4gKwlITU1fUEZOX0ZM QUdTID0gSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUgfCBITU1fUEZOX0VSUk9SLAo+ICB9 Owo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl92YWx1ZV9lIC0gSE1NIHBmbiBzcGVjaWFsIHZhbHVl Cj4gLSAqCj4gLSAqIEZsYWdzOgo+IC0gKiBITU1fUEZOX0VSUk9SOiBjb3JyZXNwb25kaW5nIENQ VSBwYWdlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBwb2lzb25lZCBtZW1vcnkKPiAtICogSE1NX1BG Tl9OT05FOiBjb3JyZXNwb25kaW5nIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHB0ZV9ub25lKCkK PiArICogaG1tX3Bmbl90b19wYWdlKCkgLSByZXR1cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBi eSBhIGRldmljZSBlbnRyeQo+ICAgKgo+IC0gKiBEcml2ZXIgcHJvdmlkZXMgdmFsdWVzIGZvciBu b25lIGVudHJ5LCBlcnJvciBlbnRyeSwgYW5kIHNwZWNpYWwgZW50cnkuCj4gLSAqIERyaXZlciBj YW4gYWxpYXMgKGkuZS4sIHVzZSBzYW1lIHZhbHVlKSBlcnJvciBhbmQgc3BlY2lhbCwgYnV0Cj4g LSAqIGl0IHNob3VsZCBub3QgYWxpYXMgbm9uZSB3aXRoIGVycm9yIG9yIHNwZWNpYWwuCj4gLSAq Cj4gLSAqIEhNTSBwZm4gdmFsdWUgcmV0dXJuZWQgYnkgaG1tX3ZtYV9nZXRfcGZucygpIG9yIGht bV92bWFfZmF1bHQoKSB3aWxsIGJlOgo+IC0gKiBobW1fcmFuZ2UudmFsdWVzW0hNTV9QRk5fRVJS T1JdIGlmIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHBvaXNvbm91cywKPiAtICogaG1tX3Jhbmdl LnZhbHVlc1tITU1fUEZOX05PTkVdIGlmIHRoZXJlIGlzIG5vIENQVSBwYWdlIHRhYmxlIGVudHJ5 LAo+ICsgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBjYWxsZXIgJ3VzZXJfbG9jaycg YWZ0ZXIgYSBzdWNjZXNzZnVsCj4gKyAqIG1tdV9pbnRlcnZhbF9yZWFkX2JlZ2luKCkuIFRoZSBj YWxsZXIgbXVzdCBoYXZlIHRlc3RlZCBmb3IgSE1NX1BGTl9WQUxJRAo+ICsgKiBhbHJlYWR5Lgo+ ICAgKi8KPiAtZW51bSBobW1fcGZuX3ZhbHVlX2Ugewo+IC0JSE1NX1BGTl9FUlJPUiwKPiAtCUhN TV9QRk5fTk9ORSwKPiAtCUhNTV9QRk5fVkFMVUVfTUFYCj4gLX07Cj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHBhZ2UgKmhtbV9wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIGhtbV9wZm4pCj4gK3sK PiArCXJldHVybiBwZm5fdG9fcGFnZShobW1fcGZuICYgfkhNTV9QRk5fRkxBR1MpOwo+ICt9Cj4g IAo+ICAvKgo+ICAgKiBzdHJ1Y3QgaG1tX3JhbmdlIC0gdHJhY2sgaW52YWxpZGF0aW9uIGxvY2sg b24gdmlydHVhbCBhZGRyZXNzIHJhbmdlCj4gQEAgLTY2LDEyICs2Niw5IEBAIGVudW0gaG1tX3Bm bl92YWx1ZV9lIHsKPiAgICogQG5vdGlmaWVyX3NlcTogcmVzdWx0IG9mIG1tdV9pbnRlcnZhbF9y ZWFkX2JlZ2luKCkKPiAgICogQHN0YXJ0OiByYW5nZSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MgKGlu Y2x1c2l2ZSkKPiAgICogQGVuZDogcmFuZ2UgdmlydHVhbCBlbmQgYWRkcmVzcyAoZXhjbHVzaXZl KQo+IC0gKiBAcGZuczogYXJyYXkgb2YgcGZucyAoYmlnIGVub3VnaCBmb3IgdGhlIHJhbmdlKQo+ IC0gKiBAZmxhZ3M6IHBmbiBmbGFncyB0byBtYXRjaCBkZXZpY2UgZHJpdmVyIHBhZ2UgdGFibGUK PiAtICogQHZhbHVlczogcGZuIHZhbHVlIGZvciBzb21lIHNwZWNpYWwgY2FzZSAobm9uZSwgc3Bl Y2lhbCwgZXJyb3IsIC4uLikKPiArICogQGhtbV9wZm5zOiBhcnJheSBvZiBwZm5zIChiaWcgZW5v dWdoIGZvciB0aGUgcmFuZ2UpCj4gICAqIEBkZWZhdWx0X2ZsYWdzOiBkZWZhdWx0IGZsYWdzIGZv ciB0aGUgcmFuZ2UgKHdyaXRlLCByZWFkLCAuLi4gc2VlIGhtbSBkb2MpCj4gICAqIEBwZm5fZmxh Z3NfbWFzazogYWxsb3dzIHRvIG1hc2sgcGZuIGZsYWdzIHNvIHRoYXQgb25seSBkZWZhdWx0X2Zs YWdzIG1hdHRlcgo+IC0gKiBAcGZuX3NoaWZ0OiBwZm4gc2hpZnQgdmFsdWUgKHNob3VsZCBiZSA8 PSBQQUdFX1NISUZUKQo+ICAgKiBAZGV2X3ByaXZhdGVfb3duZXI6IG93bmVyIG9mIGRldmljZSBw cml2YXRlIHBhZ2VzCj4gICAqLwo+ICBzdHJ1Y3QgaG1tX3JhbmdlIHsKPiBAQCAtNzksMzYgKzc2 LDEyIEBAIHN0cnVjdCBobW1fcmFuZ2Ugewo+ICAJdW5zaWduZWQgbG9uZwkJbm90aWZpZXJfc2Vx Owo+ICAJdW5zaWduZWQgbG9uZwkJc3RhcnQ7Cj4gIAl1bnNpZ25lZCBsb25nCQllbmQ7Cj4gLQl1 aW50NjRfdAkJKnBmbnM7Cj4gLQljb25zdCB1aW50NjRfdAkJKmZsYWdzOwo+IC0JY29uc3QgdWlu dDY0X3QJCSp2YWx1ZXM7Cj4gLQl1aW50NjRfdAkJZGVmYXVsdF9mbGFnczsKPiAtCXVpbnQ2NF90 CQlwZm5fZmxhZ3NfbWFzazsKPiAtCXVpbnQ4X3QJCQlwZm5fc2hpZnQ7Cj4gKwl1bnNpZ25lZCBs b25nCQkqaG1tX3BmbnM7Cj4gKwl1bnNpZ25lZCBsb25nCQlkZWZhdWx0X2ZsYWdzOwo+ICsJdW5z aWduZWQgbG9uZwkJcGZuX2ZsYWdzX21hc2s7Cj4gIAl2b2lkCQkJKmRldl9wcml2YXRlX293bmVy Owo+ICB9Owo+ICAKPiAtLyoKPiAtICogaG1tX2RldmljZV9lbnRyeV90b19wYWdlKCkgLSByZXR1 cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBieSBhIGRldmljZSBlbnRyeQo+IC0gKiBAcmFuZ2U6 IHJhbmdlIHVzZSB0byBkZWNvZGUgZGV2aWNlIGVudHJ5IHZhbHVlCj4gLSAqIEBlbnRyeTogZGV2 aWNlIGVudHJ5IHZhbHVlIHRvIGdldCBjb3JyZXNwb25kaW5nIHN0cnVjdCBwYWdlIGZyb20KPiAt ICogUmV0dXJuOiBzdHJ1Y3QgcGFnZSBwb2ludGVyIGlmIGVudHJ5IGlzIGEgdmFsaWQsIE5VTEwg b3RoZXJ3aXNlCj4gLSAqCj4gLSAqIElmIHRoZSBkZXZpY2UgZW50cnkgaXMgdmFsaWQgKGllIHZh bGlkIGZsYWcgc2V0KSB0aGVuIHJldHVybiB0aGUgc3RydWN0IHBhZ2UKPiAtICogbWF0Y2hpbmcg dGhlIGVudHJ5IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCj4gLSAqLwo+IC1zdGF0aWMg aW5saW5lIHN0cnVjdCBwYWdlICpobW1fZGV2aWNlX2VudHJ5X3RvX3BhZ2UoY29uc3Qgc3RydWN0 IGhtbV9yYW5nZSAqcmFuZ2UsCj4gLQkJCQkJCSAgICB1aW50NjRfdCBlbnRyeSkKPiAtewo+IC0J aWYgKGVudHJ5ID09IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXSkKPiAtCQlyZXR1cm4gTlVM TDsKPiAtCWlmIChlbnRyeSA9PSByYW5nZS0+dmFsdWVzW0hNTV9QRk5fRVJST1JdKQo+IC0JCXJl dHVybiBOVUxMOwo+IC0JaWYgKCEoZW50cnkgJiByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0p KQo+IC0JCXJldHVybiBOVUxMOwo+IC0JcmV0dXJuIHBmbl90b19wYWdlKGVudHJ5ID4+IHJhbmdl LT5wZm5fc2hpZnQpOwo+IC19Cj4gLQo+ICAvKgo+ICAgKiBQbGVhc2Ugc2VlIERvY3VtZW50YXRp b24vdm0vaG1tLnJzdCBmb3IgaG93IHRvIHVzZSB0aGUgcmFuZ2UgQVBJLgo+ICAgKi8KPiBkaWZm IC0tZ2l0IGEvbW0vaG1tLmMgYi9tbS9obW0uYwo+IGluZGV4IDI2OTMzOTNkYzE0YjMwLi5jMWM5 NmQ0Y2MwNTU0YyAxMDA2NDQKPiAtLS0gYS9tbS9obW0uYwo+ICsrKyBiL21tL2htbS5jCj4gQEAg LTM3LDI4ICszNywxMyBAQCBlbnVtIHsKPiAgCUhNTV9ORUVEX0FMTF9CSVRTID0gSE1NX05FRURf RkFVTFQgfCBITU1fTkVFRF9XUklURV9GQVVMVCwKPiAgfTsKPiAgCj4gLS8qCj4gLSAqIGhtbV9k ZXZpY2VfZW50cnlfZnJvbV9wZm4oKSAtIGNyZWF0ZSBhIHZhbGlkIGRldmljZSBlbnRyeSB2YWx1 ZSBmcm9tIHBmbgo+IC0gKiBAcmFuZ2U6IHJhbmdlIHVzZSB0byBlbmNvZGUgSE1NIHBmbiB2YWx1 ZQo+IC0gKiBAcGZuOiBwZm4gdmFsdWUgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZGV2aWNlIGVu dHJ5Cj4gLSAqIFJldHVybjogdmFsaWQgZGV2aWNlIGVudHJ5IGZvciB0aGUgcGZuCj4gLSAqLwo+ IC1zdGF0aWMgdWludDY0X3QgaG1tX2RldmljZV9lbnRyeV9mcm9tX3Bmbihjb25zdCBzdHJ1Y3Qg aG1tX3JhbmdlICpyYW5nZSwKPiAtCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQo+IC17Cj4gLQly ZXR1cm4gKHBmbiA8PCByYW5nZS0+cGZuX3NoaWZ0KSB8IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXTsKPiAtfQo+IC0KPiAgc3RhdGljIGludCBobW1fcGZuc19maWxsKHVuc2lnbmVkIGxvbmcg YWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCj4gLQkJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIGVu dW0gaG1tX3Bmbl92YWx1ZV9lIHZhbHVlKQo+ICsJCQkgc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzKQo+ICB7Cj4gLQl1aW50NjRfdCAqcGZucyA9IHJhbmdl LT5wZm5zOwo+IC0JdW5zaWduZWQgbG9uZyBpOwo+ICsJdW5zaWduZWQgbG9uZyBpID0gKGFkZHIg LSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAo+IC0JaSA9IChhZGRyIC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yICg7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFH RV9TSVpFLCBpKyspCj4gLQkJcGZuc1tpXSA9IHJhbmdlLT52YWx1ZXNbdmFsdWVdOwo+IC0KPiAr CQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAK PiBAQCAtOTYsNyArODEsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfZmF1bHQodW5zaWduZWQgbG9u ZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKPiAgfQo+ICAKPiAgc3RhdGljIHVuc2lnbmVkIGlu dCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93 YWxrLAo+IC0JCQkJICAgICAgIHVpbnQ2NF90IHBmbnMsIHVpbnQ2NF90IGNwdV9mbGFncykKPiAr CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBmbl9yZXFfZmxhZ3MsCj4gKwkJCQkgICAgICAgdW5z aWduZWQgbG9uZyBjcHVfZmxhZ3MpCj4gIHsKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0g aG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCj4gQEAgLTExMCwyNyArOTYsMjggQEAgc3RhdGljIHVu c2lnbmVkIGludCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAq aG1tX3ZtYV93YWxrLAo+ICAJICogd2FzdGUgdG8gaGF2ZSB0aGUgdXNlciBwcmUtZmlsbCB0aGUg cGZuIGFycmF5cyB3aXRoIGEgZGVmYXVsdAo+ICAJICogZmxhZ3MgdmFsdWUuCj4gIAkgKi8KPiAt CXBmbnMgPSAocGZucyAmIHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgfCByYW5nZS0+ZGVmYXVsdF9m bGFnczsKPiArCXBmbl9yZXFfZmxhZ3MgJj0gcmFuZ2UtPnBmbl9mbGFnc19tYXNrOwo+ICsJcGZu X3JlcV9mbGFncyB8PSByYW5nZS0+ZGVmYXVsdF9mbGFnczsKPiAgCj4gIAkvKiBXZSBhcmVuJ3Qg YXNrIHRvIGRvIGFueXRoaW5nIC4uLiAqLwo+IC0JaWYgKCEocGZucyAmIHJhbmdlLT5mbGFnc1tI TU1fUEZOX1ZBTElEXSkpCj4gKwlpZiAoIShwZm5fcmVxX2ZsYWdzICYgSE1NX1BGTl9SRVFfRkFV TFQpKQo+ICAJCXJldHVybiAwOwo+ICAKPiAgCS8qIE5lZWQgdG8gd3JpdGUgZmF1bHQgPyAqLwo+ IC0JaWYgKChwZm5zICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSAmJgo+IC0JICAgICEo Y3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSkKPiArCWlmICgocGZuX3Jl cV9mbGFncyAmIEhNTV9QRk5fUkVRX1dSSVRFKSAmJgo+ICsJICAgICEoY3B1X2ZsYWdzICYgSE1N X1BGTl9XUklURSkpCj4gIAkJcmV0dXJuIEhNTV9ORUVEX0ZBVUxUIHwgSE1NX05FRURfV1JJVEVf RkFVTFQ7Cj4gIAo+ICAJLyogSWYgQ1BVIHBhZ2UgdGFibGUgaXMgbm90IHZhbGlkIHRoZW4gd2Ug bmVlZCB0byBmYXVsdCAqLwo+IC0JaWYgKCEoY3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9Q Rk5fVkFMSURdKSkKPiArCWlmICghKGNwdV9mbGFncyAmIEhNTV9QRk5fVkFMSUQpKQo+ICAJCXJl dHVybiBITU1fTkVFRF9GQVVMVDsKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdW5z aWduZWQgaW50Cj4gIGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGNvbnN0IHN0cnVjdCBobW1fdm1hX3dh bGsgKmhtbV92bWFfd2FsaywKPiAtCQkgICAgIGNvbnN0IHVpbnQ2NF90ICpwZm5zLCB1bnNpZ25l ZCBsb25nIG5wYWdlcywKPiAtCQkgICAgIHVpbnQ2NF90IGNwdV9mbGFncykKPiArCQkgICAgIGNv bnN0IHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgdW5zaWduZWQgbG9uZyBucGFnZXMsCj4gKwkJ ICAgICB1bnNpZ25lZCBsb25nIGNwdV9mbGFncykKPiAgewo+ICAJc3RydWN0IGhtbV9yYW5nZSAq cmFuZ2UgPSBobW1fdm1hX3dhbGstPnJhbmdlOwo+ICAJdW5zaWduZWQgaW50IHJlcXVpcmVkX2Zh dWx0ID0gMDsKPiBAQCAtMTQyLDEyICsxMjksMTIgQEAgaG1tX3JhbmdlX25lZWRfZmF1bHQoY29u c3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrLAo+ICAJICogaG1tX3B0ZV9uZWVk X2ZhdWx0KCkgd2lsbCBhbHdheXMgcmV0dXJuIDAuCj4gIAkgKi8KPiAgCWlmICghKChyYW5nZS0+ ZGVmYXVsdF9mbGFncyB8IHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgJgo+IC0JICAgICAgcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdKSkKPiArCSAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUKSkKPiAg CQlyZXR1cm4gMDsKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKPiAtCQly ZXF1aXJlZF9mYXVsdCB8PQo+IC0JCQlobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBw Zm5zW2ldLCBjcHVfZmxhZ3MpOwo+ICsJCXJlcXVpcmVkX2ZhdWx0IHw9IGhtbV9wdGVfbmVlZF9m YXVsdChobW1fdm1hX3dhbGssIGhtbV9wZm5zW2ldLAo+ICsJCQkJCQkgICAgIGNwdV9mbGFncyk7 Cj4gIAkJaWYgKHJlcXVpcmVkX2ZhdWx0ID09IEhNTV9ORUVEX0FMTF9CSVRTKQo+ICAJCQlyZXR1 cm4gcmVxdWlyZWRfZmF1bHQ7Cj4gIAl9Cj4gQEAgLTE2MSwxMiArMTQ4LDEzIEBAIHN0YXRpYyBp bnQgaG1tX3ZtYV93YWxrX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVu ZCwKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAg CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAgCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2Vz Owo+IC0JdWludDY0X3QgKnBmbnM7Cj4gKwl1bnNpZ25lZCBsb25nICpobW1fcGZuczsKPiAgCj4g IAlpID0gKGFkZHIgLSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAlucGFnZXMgPSAo ZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAtCXBmbnMgPSAmcmFuZ2UtPnBmbnNbaV07Cj4g LQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZu cywgbnBhZ2VzLCAwKTsKPiArCWhtbV9wZm5zID0gJnJhbmdlLT5obW1fcGZuc1tpXTsKPiArCXJl cXVpcmVkX2ZhdWx0ID0KPiArCQlobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIGht bV9wZm5zLCBucGFnZXMsIDApOwo+ICAJaWYgKCF3YWxrLT52bWEpIHsKPiAgCQlpZiAocmVxdWly ZWRfZmF1bHQpCj4gIAkJCXJldHVybiAtRUZBVUxUOwo+IEBAIC0xNzQsNDQgKzE2Miw0NCBAQCBz dGF0aWMgaW50IGhtbV92bWFfd2Fsa19ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQg bG9uZyBlbmQsCj4gIAl9Cj4gIAlpZiAocmVxdWlyZWRfZmF1bHQpCj4gIAkJcmV0dXJuIGhtbV92 bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7Cj4gLQlyZXR1cm4gaG1t X3BmbnNfZmlsbChhZGRyLCBlbmQsIHJhbmdlLCBITU1fUEZOX05PTkUpOwo+ICsJcmV0dXJuIGht bV9wZm5zX2ZpbGwoYWRkciwgZW5kLCByYW5nZSwgMCk7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxp bmUgdWludDY0X3QgcG1kX3RvX2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHBtZF90IHBtZCkKPiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBtZF90b19obW1fcGZu X2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcG1kX3QgcG1kKQo+ICB7 Cj4gIAlpZiAocG1kX3Byb3Rub25lKHBtZCkpCj4gIAkJcmV0dXJuIDA7Cj4gLQlyZXR1cm4gcG1k X3dyaXRlKHBtZCkgPyByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0gfAo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fV1JJVEVdIDoKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1ZBTElE XTsKPiArCXJldHVybiBwbWRfd3JpdGUocG1kKSA/IChITU1fUEZOX1ZBTElEIHwgSE1NX1BGTl9X UklURSkgOiBITU1fUEZOX1ZBTElEOwo+ICB9Cj4gIAo+ICAjaWZkZWYgQ09ORklHX1RSQU5TUEFS RU5UX0hVR0VQQUdFCj4gIHN0YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcG1kKHN0cnVjdCBtbV93 YWxrICp3YWxrLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4gLQkJdW5zaWduZWQgbG9uZyBlbmQsIHVp bnQ2NF90ICpwZm5zLCBwbWRfdCBwbWQpCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCB1 bnNpZ25lZCBsb25nIGhtbV9wZm5zW10sCj4gKwkJCSAgICAgIHBtZF90IHBtZCkKPiAgewo+ICAJ c3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrID0gd2Fsay0+cHJpdmF0ZTsKPiAgCXN0 cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCXVuc2lnbmVk IGxvbmcgcGZuLCBucGFnZXMsIGk7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4g LQl1aW50NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCj4g IAlucGFnZXMgPSAoZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAgCWNwdV9mbGFncyA9IHBt ZF90b19obW1fcGZuX2ZsYWdzKHJhbmdlLCBwbWQpOwo+ICAJcmVxdWlyZWRfZmF1bHQgPQo+IC0J CWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2VzLCBjcHVfZmxh Z3MpOwo+ICsJCWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5w YWdlcywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlyZXR1cm4gaG1t X3ZtYV9mYXVsdChhZGRyLCBlbmQsIHJlcXVpcmVkX2ZhdWx0LCB3YWxrKTsKPiAgCj4gIAlwZm4g PSBwbWRfcGZuKHBtZCkgKyAoKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQpOwo+ICAJ Zm9yIChpID0gMDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIGkrKywgcGZuKyspCj4g LQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfCBjcHVf ZmxhZ3M7Cj4gKwkJaG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsK PiAgfQo+ICAjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAgLyogc3R1 YiB0byBhbGxvdyB0aGUgY29kZSBiZWxvdyB0byBjb21waWxlICovCj4gIGludCBobW1fdm1hX2hh bmRsZV9wbWQoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAtCQl1 bnNpZ25lZCBsb25nIGVuZCwgdWludDY0X3QgKnBmbnMsIHBtZF90IHBtZCk7Cj4gKwkJdW5zaWdu ZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgcG1kX3QgcG1kKTsKPiAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAKPiAgc3RhdGljIGlubGlu ZSBib29sIGhtbV9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5n ZSwKPiBAQCAtMjIyLDMxICsyMTAsMzEgQEAgc3RhdGljIGlubGluZSBib29sIGhtbV9pc19kZXZp Y2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSwKPiAgCQlyYW5nZS0+ZGV2 X3ByaXZhdGVfb3duZXI7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxpbmUgdWludDY0X3QgcHRlX3Rv X2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIHB0ZV90IHB0ZSkKPiArc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB0ZV90b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1f cmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcHRlX3QgcHRlKQo+ICB7Cj4gIAlpZiAocHRlX25vbmUo cHRlKSB8fCAhcHRlX3ByZXNlbnQocHRlKSB8fCBwdGVfcHJvdG5vbmUocHRlKSkKPiAgCQlyZXR1 cm4gMDsKPiAtCXJldHVybiBwdGVfd3JpdGUocHRlKSA/IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXSB8Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9XUklURV0gOgo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdOwo+ICsJcmV0dXJuIHB0ZV93cml0ZShwdGUpID8gKEhNTV9Q Rk5fVkFMSUQgfCBITU1fUEZOX1dSSVRFKSA6IEhNTV9QRk5fVkFMSUQ7Cj4gIH0KPiAgCj4gIHN0 YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcHRlKHN0cnVjdCBtbV93YWxrICp3YWxrLCB1bnNpZ25l ZCBsb25nIGFkZHIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kcCwg cHRlX3QgKnB0ZXAsCj4gLQkJCSAgICAgIHVpbnQ2NF90ICpwZm4pCj4gKwkJCSAgICAgIHVuc2ln bmVkIGxvbmcgKmhtbV9wZm4pCj4gIHsKPiAgCXN0cnVjdCBobW1fdm1hX3dhbGsgKmhtbV92bWFf d2FsayA9IHdhbGstPnByaXZhdGU7Cj4gIAlzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSA9IGhtbV92 bWFfd2Fsay0+cmFuZ2U7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4gLQl1aW50 NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCXB0ZV90IHB0 ZSA9ICpwdGVwOwo+IC0JdWludDY0X3Qgb3JpZ19wZm4gPSAqcGZuOwo+ICsJdWludDY0X3QgcGZu X3JlcV9mbGFncyA9ICpobW1fcGZuOwo+ICAKPiAgCWlmIChwdGVfbm9uZShwdGUpKSB7Cj4gLQkJ cmVxdWlyZWRfZmF1bHQgPSBobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3Bm biwgMCk7Cj4gKwkJcmVxdWlyZWRfZmF1bHQgPQo+ICsJCQlobW1fcHRlX25lZWRfZmF1bHQoaG1t X3ZtYV93YWxrLCBwZm5fcmVxX2ZsYWdzLCAwKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1bHQpCj4g IAkJCWdvdG8gZmF1bHQ7Cj4gLQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsK PiArCQkqaG1tX3BmbiA9IDA7Cj4gIAkJcmV0dXJuIDA7Cj4gIAl9Cj4gIAo+IEBAIC0yNTgsMTcg KzI0NiwxOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfaGFuZGxlX3B0ZShzdHJ1Y3QgbW1fd2FsayAq d2FsaywgdW5zaWduZWQgbG9uZyBhZGRyLAo+ICAJCSAqIHRoZSBQRk4gZXZlbiBpZiBub3QgcHJl c2VudC4KPiAgCQkgKi8KPiAgCQlpZiAoaG1tX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KHJhbmdl LCBlbnRyeSkpIHsKPiAtCQkJKnBmbiA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2Us Cj4gLQkJCQlkZXZpY2VfcHJpdmF0ZV9lbnRyeV90b19wZm4oZW50cnkpKTsKPiAtCQkJKnBmbiB8 PSByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwkJCWNwdV9mbGFncyA9IEhNTV9QRk5f VkFMSUQ7Cj4gIAkJCWlmIChpc193cml0ZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShlbnRyeSkpCj4g LQkJCQkqcGZuIHw9IHJhbmdlLT5mbGFnc1tITU1fUEZOX1dSSVRFXTsKPiArCQkJCWNwdV9mbGFn cyB8PSBITU1fUEZOX1dSSVRFOwo+ICsJCQkqaG1tX3BmbiA9IGRldmljZV9wcml2YXRlX2VudHJ5 X3RvX3BmbihlbnRyeSkgfAo+ICsJCQkJCWNwdV9mbGFnczsKPiAgCQkJcmV0dXJuIDA7Cj4gIAkJ fQo+ICAKPiAtCQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9wdGVfbmVlZF9mYXVsdChobW1fdm1hX3dh bGssIG9yaWdfcGZuLCAwKTsKPiArCQlyZXF1aXJlZF9mYXVsdCA9Cj4gKwkJCWhtbV9wdGVfbmVl ZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbl9yZXFfZmxhZ3MsIDApOwo+ICAJCWlmICghcmVxdWly ZWRfZmF1bHQpIHsKPiAtCQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsKPiAr CQkJKmhtbV9wZm4gPSAwOwo+ICAJCQlyZXR1cm4gMDsKPiAgCQl9Cj4gIAo+IEBAIC0yODgsNyAr Mjc3LDggQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9wdGUoc3RydWN0IG1tX3dhbGsgKndh bGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCX0KPiAgCj4gIAljcHVfZmxhZ3MgPSBwdGVfdG9f aG1tX3Bmbl9mbGFncyhyYW5nZSwgcHRlKTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9u ZWVkX2ZhdWx0KGhtbV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJl ZF9mYXVsdCA9Cj4gKwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9m bGFncywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlnb3RvIGZhdWx0 Owo+ICAKPiBAQCAtMjk3LDE1ICsyODcsMTUgQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9w dGUoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCSAqIGZhbGwg dGhyb3VnaCBhbmQgdHJlYXQgaXQgbGlrZSBhIG5vcm1hbCBwYWdlLgo+ICAJICovCj4gIAlpZiAo cHRlX3NwZWNpYWwocHRlKSAmJiAhaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkgewo+IC0JCWlm IChobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3BmbiwgMCkpIHsKPiArCQlp ZiAoaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgMCkpIHsK PiAgCQkJcHRlX3VubWFwKHB0ZXApOwo+ICAJCQlyZXR1cm4gLUVGQVVMVDsKPiAgCQl9Cj4gLQkJ KnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9FUlJPUl07Cj4gKwkJKmhtbV9wZm4gPSBITU1f UEZOX0VSUk9SOwo+ICAJCXJldHVybiAwOwo+ICAJfQo+ICAKPiAtCSpwZm4gPSBobW1fZGV2aWNl X2VudHJ5X2Zyb21fcGZuKHJhbmdlLCBwdGVfcGZuKHB0ZSkpIHwgY3B1X2ZsYWdzOwo+ICsJKmht bV9wZm4gPSBwdGVfcGZuKHB0ZSkgfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgCj4gIGZh dWx0Ogo+IEBAIC0zMjEsNyArMzExLDggQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBt ZF90ICpwbWRwLAo+ICB7Cj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dhbGsgPSB3 YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1hX3dhbGst PnJhbmdlOwo+IC0JdWludDY0X3QgKnBmbnMgPSAmcmFuZ2UtPnBmbnNbKHN0YXJ0IC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUXTsKPiArCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zID0KPiAr CQkmcmFuZ2UtPmhtbV9wZm5zWyhzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9TSElGVF07 Cj4gIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVDsK PiAgCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0Owo+ICAJcHRlX3QgKnB0ZXA7Cj4gQEAgLTMz MywxNiArMzI0LDE2IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwK PiAgCQlyZXR1cm4gaG1tX3ZtYV93YWxrX2hvbGUoc3RhcnQsIGVuZCwgLTEsIHdhbGspOwo+ICAK PiAgCWlmICh0aHBfbWlncmF0aW9uX3N1cHBvcnRlZCgpICYmIGlzX3BtZF9taWdyYXRpb25fZW50 cnkocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBm bnMsIG5wYWdlcywgMCkpIHsKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93 YWxrLCBobW1fcGZucywgbnBhZ2VzLCAwKSkgewo+ICAJCQlobW1fdm1hX3dhbGstPmxhc3QgPSBh ZGRyOwo+ICAJCQlwbWRfbWlncmF0aW9uX2VudHJ5X3dhaXQod2Fsay0+bW0sIHBtZHApOwo+ICAJ CQlyZXR1cm4gLUVCVVNZOwo+ICAJCX0KPiAtCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFydCwg ZW5kLCByYW5nZSwgSE1NX1BGTl9OT05FKTsKPiArCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFy dCwgZW5kLCByYW5nZSwgMCk7Cj4gIAl9Cj4gIAo+ICAJaWYgKCFwbWRfcHJlc2VudChwbWQpKSB7 Cj4gLQkJaWYgKGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2Vz LCAwKSkKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBobW1fcGZu cywgbnBhZ2VzLCAwKSkKPiAgCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gIAkJcmV0dXJuIGhtbV9wZm5z X2ZpbGwoc3RhcnQsIGVuZCwgcmFuZ2UsIEhNTV9QRk5fRVJST1IpOwo+ICAJfQo+IEBAIC0zNjIs NyArMzUzLDcgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJ CWlmICghcG1kX2Rldm1hcChwbWQpICYmICFwbWRfdHJhbnNfaHVnZShwbWQpKQo+ICAJCQlnb3Rv IGFnYWluOwo+ICAKPiAtCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIsIGVu ZCwgcGZucywgcG1kKTsKPiArCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIs IGVuZCwgaG1tX3BmbnMsIHBtZCk7Cj4gIAl9Cj4gIAo+ICAJLyoKPiBAQCAtMzcyLDE2ICszNjMs MTYgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJICogcmVj b3Zlci4KPiAgCSAqLwo+ICAJaWYgKHBtZF9iYWQocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2Vf bmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbnMsIG5wYWdlcywgMCkpCj4gKwkJaWYgKGhtbV9y YW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5wYWdlcywgMCkpCj4gIAkJ CXJldHVybiAtRUZBVUxUOwo+ICAJCXJldHVybiBobW1fcGZuc19maWxsKHN0YXJ0LCBlbmQsIHJh bmdlLCBITU1fUEZOX0VSUk9SKTsKPiAgCX0KPiAgCj4gIAlwdGVwID0gcHRlX29mZnNldF9tYXAo cG1kcCwgYWRkcik7Cj4gLQlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIHB0 ZXArKywgcGZucysrKSB7Cj4gKwlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUs IHB0ZXArKywgaG1tX3BmbnMrKykgewo+ICAJCWludCByOwo+ICAKPiAtCQlyID0gaG1tX3ZtYV9o YW5kbGVfcHRlKHdhbGssIGFkZHIsIGVuZCwgcG1kcCwgcHRlcCwgcGZucyk7Cj4gKwkJciA9IGht bV92bWFfaGFuZGxlX3B0ZSh3YWxrLCBhZGRyLCBlbmQsIHBtZHAsIHB0ZXAsIGhtbV9wZm5zKTsK PiAgCQlpZiAocikgewo+ICAJCQkvKiBobW1fdm1hX2hhbmRsZV9wdGUoKSBkaWQgcHRlX3VubWFw KCkgKi8KPiAgCQkJcmV0dXJuIHI7Cj4gQEAgLTM5MywxMyArMzg0LDEyIEBAIHN0YXRpYyBpbnQg aG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwKPiAgCj4gICNpZiBkZWZpbmVkKENPTkZJR19B UkNIX0hBU19QVEVfREVWTUFQKSAmJiBcCj4gICAgICBkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hf VFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEKQo+IC1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IHB1ZF90 b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLCBwdWRfdCBwdWQpCj4gK3N0 YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdWRfdG9faG1tX3Bmbl9mbGFncyhzdHJ1Y3QgaG1t X3JhbmdlICpyYW5nZSwKPiArCQkJCQkJIHB1ZF90IHB1ZCkKPiAgewo+ICAJaWYgKCFwdWRfcHJl c2VudChwdWQpKQo+ICAJCXJldHVybiAwOwo+IC0JcmV0dXJuIHB1ZF93cml0ZShwdWQpID8gcmFu Z2UtPmZsYWdzW0hNTV9QRk5fVkFMSURdIHwKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1dS SVRFXSA6Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwlyZXR1cm4gcHVk X3dyaXRlKHB1ZCkgPyAoSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUpIDogSE1NX1BGTl9W QUxJRDsKPiAgfQo+ICAKPiAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcHVkKHB1ZF90ICpwdWRw LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKPiBAQCAtNDI3LDcgKzQx Nyw4IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQg bG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCj4gIAlpZiAocHVkX2h1Z2UocHVkKSAmJiBw dWRfZGV2bWFwKHB1ZCkpIHsKPiAgCQl1bnNpZ25lZCBsb25nIGksIG5wYWdlcywgcGZuOwo+ICAJ CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAtCQl1aW50NjRfdCAqcGZucywgY3B1X2Zs YWdzOwo+ICsJCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zOwo+ICsJCXVuc2lnbmVkIGxvbmcgY3B1 X2ZsYWdzOwo+ICAKPiAgCQlpZiAoIXB1ZF9wcmVzZW50KHB1ZCkpIHsKPiAgCQkJc3Bpbl91bmxv Y2socHRsKTsKPiBAQCAtNDM2LDEwICs0MjcsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtf cHVkKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwK PiAgCj4gIAkJaSA9IChhZGRyIC0gcmFuZ2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJCW5w YWdlcyA9IChlbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUOwo+IC0JCXBmbnMgPSAmcmFuZ2UtPnBm bnNbaV07Cj4gKwkJaG1tX3BmbnMgPSAmcmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAKPiAgCQljcHVf ZmxhZ3MgPSBwdWRfdG9faG1tX3Bmbl9mbGFncyhyYW5nZSwgcHVkKTsKPiAtCQlyZXF1aXJlZF9m YXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywKPiArCQlyZXF1 aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMs Cj4gIAkJCQkJCSAgICAgIG5wYWdlcywgY3B1X2ZsYWdzKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1 bHQpIHsKPiAgCQkJc3Bpbl91bmxvY2socHRsKTsKPiBAQCAtNDQ4LDggKzQzOSw3IEBAIHN0YXRp YyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBzdGFydCwg dW5zaWduZWQgbG9uZyBlbmQsCj4gIAo+ICAJCXBmbiA9IHB1ZF9wZm4ocHVkKSArICgoYWRkciAm IH5QVURfTUFTSykgPj4gUEFHRV9TSElGVCk7Cj4gIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsg KytpLCArK3BmbikKPiAtCQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFu Z2UsIHBmbikgfAo+IC0JCQkJICBjcHVfZmxhZ3M7Cj4gKwkJCWhtbV9wZm5zW2ldID0gcGZuIHwg Y3B1X2ZsYWdzOwo+ICAJCWdvdG8gb3V0X3VubG9jazsKPiAgCX0KPiAgCj4gQEAgLTQ3Myw4ICs0 NjMsOSBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2VudHJ5KHB0ZV90ICpwdGUs IHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dh bGsgPSB3YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1h X3dhbGstPnJhbmdlOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB3YWxrLT52bWE7 Cj4gLQl1aW50NjRfdCBvcmlnX3BmbiwgY3B1X2ZsYWdzOwo+ICAJdW5zaWduZWQgaW50IHJlcXVp cmVkX2ZhdWx0Owo+ICsJdW5zaWduZWQgbG9uZyBwZm5fcmVxX2ZsYWdzOwo+ICsJdW5zaWduZWQg bG9uZyBjcHVfZmxhZ3M7Cj4gIAlzcGlubG9ja190ICpwdGw7Cj4gIAlwdGVfdCBlbnRyeTsKPiAg Cj4gQEAgLTQ4Miw5ICs0NzMsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfaHVnZXRsYl9l bnRyeShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLAo+ICAJZW50cnkgPSBodWdlX3B0 ZXBfZ2V0KHB0ZSk7Cj4gIAo+ICAJaSA9IChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9T SElGVDsKPiAtCW9yaWdfcGZuID0gcmFuZ2UtPnBmbnNbaV07Cj4gKwlwZm5fcmVxX2ZsYWdzID0g cmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAJY3B1X2ZsYWdzID0gcHRlX3RvX2htbV9wZm5fZmxhZ3Mo cmFuZ2UsIGVudHJ5KTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9uZWVkX2ZhdWx0KGht bV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJlZF9mYXVsdCA9Cj4g KwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgY3B1X2Zs YWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkgewo+ICAJCXNwaW5fdW5sb2NrKHB0bCk7Cj4g IAkJcmV0dXJuIGhtbV92bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7 Cj4gQEAgLTQ5Miw4ICs0ODQsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2Vu dHJ5KHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAo+ICAJcGZuID0gcHRlX3Bm bihlbnRyeSkgKyAoKHN0YXJ0ICYgfmhtYXNrKSA+PiBQQUdFX1NISUZUKTsKPiAgCWZvciAoOyBh ZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSwgaSsrLCBwZm4rKykKPiAtCQlyYW5nZS0+cGZu c1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfAo+IC0JCQkJIGNw dV9mbGFnczsKPiArCQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gKwo+ ICAJc3Bpbl91bmxvY2socHRsKTsKPiAgCXJldHVybiAwOwo+ICB9Cj4gQEAgLTUyNCw3ICs1MTYs NyBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa190ZXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVu c2lnbmVkIGxvbmcgZW5kLAo+ICAJICogZmFpbHVyZS4KPiAgCSAqLwo+ICAJaWYgKGhtbV9yYW5n ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywKPiAtCQkJCSByYW5nZS0+cGZucyArCj4gKwkJCQkg cmFuZ2UtPmhtbV9wZm5zICsKPiAgCQkJCQkgKChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFH RV9TSElGVCksCj4gIAkJCQkgKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZULCAwKSkKPiAgCQly ZXR1cm4gLUVGQVVMVDsKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Au b3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwt Z2Z4Cg== 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=-8.0 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER,SIGNED_OFF_BY,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 E5742C55185 for ; Wed, 22 Apr 2020 17:52:42 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 BD25720882 for ; Wed, 22 Apr 2020 17:52:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=amdcloud.onmicrosoft.com header.i=@amdcloud.onmicrosoft.com header.b="xDufRllK" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BD25720882 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=amd.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=amd-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id BF8516E117; Wed, 22 Apr 2020 17:52:40 +0000 (UTC) Received: from NAM10-BN7-obe.outbound.protection.outlook.com (mail-bn7nam10on2055.outbound.protection.outlook.com [40.107.92.55]) by gabe.freedesktop.org (Postfix) with ESMTPS id AD1256E0AC; Wed, 22 Apr 2020 17:52:38 +0000 (UTC) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=fTVhhybvo5wjFOdPvCFKmhZy0WZX+nwUaDxB2dzQh8tdmSU/8GL9bh967AWbpbLWgc0WKTesZNysh7F0YOtCyQuJXgeWKAyMqgIlWbazxQ7WgQvwkJhO+tSRiVwEfOGPpSpOHU4DDhAu0CTWRdxxcIW7MsN0yUMqwaLaV1k4ev7hiiaJx4Md8Qvuaz80p9Gzg6BS/jZlxbeF/ZCMB2at1M06eTHICbaScWTTnQ0g1C4I5O9RyVIxCkbRqsQRmLD61Y0EiSl4qJCX29+6JZ73iSZ1Nx0HJ3JrVN6QutXIoX0oHAslPfHOr7VJ4PGobVDKydyZwFWA1vrhSmXyDXLD4A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=eiNqWGaoAMNNDZ9SdRVYyTPfveVXJ4QiIgCQN0cfr+UKONUTRwz4eh/vIJBPOm9o9q09pBvWJa2RK5VjXbe9b7RFSuyXmJxCeV1e8AUQ1+3jLvtbDvwskTMmRAZT13CfveDNyHtqNoRBoTmqa+UKUxoyfqxn7VmBMRhhPxJu1j0iNlqKvDMWYLFB5TmFKr1p0k4wu0j0klrC0jPRoF05a0Kj9zOvltfMCmwxHJi5Kb6i6WbYyx26rLLoH5rUfQ0F6ORLVlD9CF4q7MiGpWX1pM3/ifbKpZ1BsyFM2hAMarqE+7IxXlcIVzWJmIz7qX9ZGxa/GtUdXRiUPwJGn1sbZw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=amd.com; dmarc=pass action=none header.from=amd.com; dkim=pass header.d=amd.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amdcloud.onmicrosoft.com; s=selector2-amdcloud-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=suVau5EiBBUObCzCKexirZYCHmeuzKwKnG2q4nEOzeo=; b=xDufRllKZNptCO2HErv7emJj8Lv0dVLBRRRL9bR1ADmVhQpBDMAZT0H3h9VaBNeh8FL5uA3S6ucwU/1Xs2ytPjBTnArGhuZxljuvTmziOyiT+eOIskoJslPVJX3Dr1AdTtqqIvhPJtrcz7uohk/xsCFh0nqZDc2lGsFKqs/j0is= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Felix.Kuehling@amd.com; Received: from SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) by SN1PR12MB2432.namprd12.prod.outlook.com (2603:10b6:802:29::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13; Wed, 22 Apr 2020 17:52:36 +0000 Received: from SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806]) by SN1PR12MB2414.namprd12.prod.outlook.com ([fe80::38ef:1510:9525:f806%7]) with mapi id 15.20.2921.030; Wed, 22 Apr 2020 17:52:36 +0000 Subject: Re: [PATCH hmm 5/5] mm/hmm: remove the customizable pfn format from hmm_range_fault To: Jason Gunthorpe , linux-mm@kvack.org, Ralph Campbell , "Yang, Philip" References: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> From: Felix Kuehling Message-ID: Date: Wed, 22 Apr 2020 13:52:32 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.7.0 In-Reply-To: <5-v1-4eb72686de3c+5062-hmm_no_flags_jgg@mellanox.com> Content-Language: en-US X-ClientProxiedBy: YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) To SN1PR12MB2414.namprd12.prod.outlook.com (2603:10b6:802:2e::31) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.2.100] (142.116.63.128) by YQBPR01CA0086.CANPRD01.PROD.OUTLOOK.COM (2603:10b6:c01:3::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2937.13 via Frontend Transport; Wed, 22 Apr 2020 17:52:34 +0000 X-Originating-IP: [142.116.63.128] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-TrafficTypeDiagnostic: SN1PR12MB2432:|SN1PR12MB2432: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:10000; X-Forefront-PRVS: 03818C953D X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:SN1PR12MB2414.namprd12.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(366004)(136003)(396003)(346002)(376002)(39860400002)(86362001)(31686004)(66556008)(44832011)(2616005)(4326008)(956004)(31696002)(66476007)(186003)(6486002)(66946007)(16526019)(26005)(36756003)(54906003)(110136005)(7416002)(316002)(16576012)(8936002)(5660300002)(478600001)(30864003)(2906002)(8676002)(6636002)(81156014)(52116002)(21314003); DIR:OUT; SFP:1101; Received-SPF: None (protection.outlook.com: amd.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3bJqRGyQuymUYqx3R2Di2ElOTQ+GG984VY+gG7SmF3RJWjdcQ/LGQ/vqxIYMoNHNlZR/WBSi0AUI+n74ZcPUwu6igN5knW13BQl5Z6udwhWxpC9Hd0Jx7JbCuwpctZlyKv2r6e+tapSTDybB3X7YeTn1pXVEJ1Di8lL9zI+FzHnJ/mOqHLDW1t/v/X7vklc8gPjtxaeOB0LWNTVxT/agLlAQ6g1P+EeI8+uH8UOkC9L9nkBLkzCA3dIMDzSHfaKJE1HP1G/5aSNfZNBau6ZaKzVKvzKwWFaHyjqWcXTZ9uc9mGZ/GTNBUFK13WYK0X1yujId90dMLhGJ1CR60v5p0tnzuZBCbEhnlxPy3acIFU1hcJFPa0hYmAmLUnhXnTijjvgdPZoxRAEv16t3c3e8l4nt4Z3NkWAlJQzMGNDRkw901ilOfpy6fvtS/Yu/E4as8j6iuW3wRANJDO3Sb6btb8h5L7RnPBlwxmF21ZhXIZI= X-MS-Exchange-AntiSpam-MessageData: A/p+nH/3LM4XiR/cMcwuziDTYW5C5gGM9FDiDY/+410MT9g1zjqJob0o1KrmHpn7zOkmrtbzE0JJ7VSlYMdOKqCeTMy888QaUFLUWBuqAwzYyAK1ZjA6jgrL3MNVvq3byYL9FzWUffY34mk2qoaKhQ== X-OriginatorOrg: amd.com X-MS-Exchange-CrossTenant-Network-Message-Id: 38dbb970-3dde-4c64-16c6-08d7e6e5f091 X-MS-Exchange-CrossTenant-OriginalArrivalTime: 22 Apr 2020 17:52:35.8751 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 3dd8961f-e488-4e60-8e11-a82d994e183d X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: vyV1rsnAsduW7VxFHfLYG3sE2GmBr6piPWuszR6qTa5uhCrqrTDZjF6jFlasjYNpfePf4gpA+dnpGIsu1Rdcvw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN1PR12MB2432 X-BeenThere: amd-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Discussion list for AMD gfx List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "David \(ChunMing\) Zhou" , amd-gfx@lists.freedesktop.org, John Hubbard , intel-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, Christoph Hellwig , =?UTF-8?B?SsOpcsO0bWUgR2xpc3Nl?= , Ben Skeggs , nouveau@lists.freedesktop.org, Alex Deucher , Niranjana Vishwanathapura , =?UTF-8?Q?Christian_K=c3=b6nig?= Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: amd-gfx-bounces@lists.freedesktop.org Sender: "amd-gfx" WytQaGlsaXAgWWFuZ10KCkFtIDIwMjAtMDQtMjEgdW0gODoyMSBwLm0uIHNjaHJpZWIgSmFzb24g R3VudGhvcnBlOgo+IEZyb206IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4KPgo+ IFByZXN1bWFibHkgdGhlIGludGVudCBoZXJlIHdhcyB0aGF0IGhtbV9yYW5nZV9mYXVsdCgpIGNv dWxkIHB1dCB0aGUgZGF0YQo+IGludG8gc29tZSBIVyBzcGVjaWZpYyBmb3JtYXQgYW5kIHRodXMg YXZvaWQgc29tZSB3b3JrLiBIb3dldmVyLCBub3RoaW5nCj4gYWN0dWFsbHkgZG9lcyB0aGF0LCBh bmQgaXQgaXNuJ3QgY2xlYXIgaG93IGFueXRoaW5nIGFjdHVhbGx5IGNvdWxkIGRvIHRoYXQKPiBh cyBobW1fcmFuZ2VfZmF1bHQoKSBwcm92aWRlcyBDUFUgYWRkcmVzc2VzIHdoaWNoIG11c3QgYmUg RE1BIG1hcHBlZC4KPgo+IFBlcmhhcHMgdGhlcmUgaXMgc29tZSBzcGVjaWFsIEhXIHRoYXQgZG9l cyBub3QgbmVlZCBETUEgbWFwcGluZywgYnV0IHdlCj4gZG9uJ3QgaGF2ZSBhbnkgZXhhbXBsZXMg b2YgdGhpcywgYW5kIHRoZSB0aGVvcmV0aWNhbCBwZXJmb3JtYW5jZSB3aW4gb2YKPiBhdm9pZGlu ZyBhbiBleHRyYSBzY2FuIG92ZXIgdGhlIHBmbnMgYXJyYXkgZG9lc24ndCBzZWVtIHdvcnRoIHRo ZQo+IGNvbXBsZXhpdHkuIFBsdXMgcGZucyBuZWVkcyB0byBiZSBzY2FubmVkIGFueWhvdyB0byBz b3J0IG91dCBhbnkKPiBERVZJQ0VfUFJJVkFURSBwYWdlcy4KPgo+IFRoaXMgdmVyc2lvbiByZXBs YWNlcyB0aGUgdWludDY0X3Qgd2l0aCBhbiB1c2lnbmVkIGxvbmcgY29udGFpbmluZyBhIHBmbgo+ IGFuZCBmaXggZmxhZ3MuIE9uIGlucHV0IGZsYWdzIGlzIGZpbGxlZCB3aXRoIHRoZSBITU1fUEZO X1JFUV8qIHZhbHVlcywgb24KPiBzdWNjZXNzZnVsIG91dHB1dCBpdCBpcyBmaWxsZWQgd2l0aCBI TU1fUEZOXyogdmFsdWVzLCBkZXNjcmliaW5nIHRoZSBzdGF0ZQo+IG9mIHRoZSBwYWdlcy4KPgo+ IGFtZGdwdSBpcyBzaW1wbGUgdG8gY29udmVydCwgaXQgZG9lc24ndCB1c2Ugc25hcHNob3QgYW5k IGRvZXNuJ3QgdXNlCj4gcGVyLXBhZ2UgZmxhZ3MuCj4KPiBub3V2ZWF1IHVzZXMgb25seSAxNiBo bW1fcHRlIGVudHJpZXMgYXQgbW9zdCAoaWUgZml0cyBpbiBhIGZldyBjYWNoZQo+IGxpbmVzKSwg YW5kIGl0IHN3ZWVwcyBvdmVyIGl0cyBwZm5zIGFycmF5IGEgY291cGxlIG9mIHRpbWVzIGFueWhv dy4KPgo+IFNpZ25lZC1vZmYtYnk6IEphc29uIEd1bnRob3JwZSA8amdnQG1lbGxhbm94LmNvbT4K PiBTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4KCkhpIEphc29u LAoKSSBwb2ludGVkIG91dCBhIHR5cG8gaW4gdGhlIGRvY3VtZW50YXRpb24gaW5saW5lLiBPdGhl ciB0aGFuIHRoYXQsIHRoZQpzZXJpZXMgaXMKCkFja2VkLWJ5OiBGZWxpeCBLdWVobGluZyA8RmVs aXguS3VlaGxpbmdAYW1kLmNvbT4KCkknbGwgdHJ5IHRvIGJ1aWxkIGl0IGFuZCBydW4gc29tZSBi YXNpYyB0ZXN0cyBsYXRlci4KCgo+IC0tLQo+ICBEb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QgICAg ICAgICAgICAgICAgfCAgMjYgKystLQo+ICBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRn cHVfdHRtLmMgfCAgMzUgKystLS0tCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVf ZG1lbS5jICB8ICA2MCArKysrKysrLS0KPiAgZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVh dV9kbWVtLmggIHwgICA0ICstCj4gIGRyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3Zt LmMgICB8ICA1MiArKysrLS0tLQo+ICBpbmNsdWRlL2xpbnV4L2htbS5oICAgICAgICAgICAgICAg ICAgICAgfCAgOTkgKysrKysrLS0tLS0tLS0tCj4gIG1tL2htbS5jICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICB8IDE2MCArKysrKysrKysrKy0tLS0tLS0tLS0tLS0KPiAgNyBmaWxlcyBj aGFuZ2VkLCAyMDQgaW5zZXJ0aW9ucygrKSwgMjMyIGRlbGV0aW9ucygtKQo+Cj4gZGlmZiAtLWdp dCBhL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdCBiL0RvY3VtZW50YXRpb24vdm0vaG1tLnJzdAo+ IGluZGV4IDk5MjRmMmNhYTAxODRjLi43M2E5YjhjODU4ZTVkOSAxMDA2NDQKPiAtLS0gYS9Eb2N1 bWVudGF0aW9uL3ZtL2htbS5yc3QKPiArKysgYi9Eb2N1bWVudGF0aW9uL3ZtL2htbS5yc3QKPiBA QCAtMTg1LDkgKzE4NSw2IEBAIFRoZSB1c2FnZSBwYXR0ZXJuIGlzOjoKPiAgICAgICAgcmFuZ2Uu c3RhcnQgPSAuLi47Cj4gICAgICAgIHJhbmdlLmVuZCA9IC4uLjsKPiAgICAgICAgcmFuZ2UucGZu cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UuZmxhZ3MgPSAuLi47Cj4gLSAgICAgIHJhbmdlLnZhbHVl cyA9IC4uLjsKPiAtICAgICAgcmFuZ2UucGZuX3NoaWZ0ID0gLi4uOwo+ICAKPiAgICAgICAgaWYg KCFtbWdldF9ub3RfemVybyhpbnRlcnZhbF9zdWItPm5vdGlmaWVyLm1tKSkKPiAgICAgICAgICAg IHJldHVybiAtRUZBVUxUOwo+IEBAIC0yMjksMTUgKzIyNiwxMCBAQCBUaGUgaG1tX3JhbmdlIHN0 cnVjdCBoYXMgMiBmaWVsZHMsIGRlZmF1bHRfZmxhZ3MgYW5kIHBmbl9mbGFnc19tYXNrLCB0aGF0 IHNwZWNpZgo+ICBmYXVsdCBvciBzbmFwc2hvdCBwb2xpY3kgZm9yIHRoZSB3aG9sZSByYW5nZSBp bnN0ZWFkIG9mIGhhdmluZyB0byBzZXQgdGhlbQo+ICBmb3IgZWFjaCBlbnRyeSBpbiB0aGUgcGZu cyBhcnJheS4KPiAgCj4gLUZvciBpbnN0YW5jZSwgaWYgdGhlIGRldmljZSBmbGFncyBmb3IgcmFu Z2UuZmxhZ3MgYXJlOjoKPiArRm9yIGluc3RhbmNlIGlmIHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRz IHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3QgcmVhZAo+ICtwZXJtaXNzaW9uLCBpdCBz ZXRzOjoKPiAgCj4gLSAgICByYW5nZS5mbGFnc1tITU1fUEZOX1ZBTElEXSA9ICgxIDw8IDYzKTsK PiAtICAgIHJhbmdlLmZsYWdzW0hNTV9QRk5fV1JJVEVdID0gKDEgPDwgNjIpOwo+IC0KPiAtYW5k IHRoZSBkZXZpY2UgZHJpdmVyIHdhbnRzIHBhZ2VzIGZvciBhIHJhbmdlIHdpdGggYXQgbGVhc3Qg cmVhZCBwZXJtaXNzaW9uLAo+IC1pdCBzZXRzOjoKPiAtCj4gLSAgICByYW5nZS0+ZGVmYXVsdF9m bGFncyA9ICgxIDw8IDYzKTsKPiArICAgIHJhbmdlLT5kZWZhdWx0X2ZsYWdzID0gSE1NX1BGTl9S RVFfVkFMSUQ7CgpUaGlzIHNob3VsZCBiZSBITU1fUEZOX1JFUV9GQVVMVC4KCgo+ICAgICAgcmFu Z2UtPnBmbl9mbGFnc19tYXNrID0gMDsKPiAgCj4gIGFuZCBjYWxscyBobW1fcmFuZ2VfZmF1bHQo KSBhcyBkZXNjcmliZWQgYWJvdmUuIFRoaXMgd2lsbCBmaWxsIGZhdWx0IGFsbCBwYWdlcwo+IEBA IC0yNDYsMTggKzIzOCwxOCBAQCBpbiB0aGUgcmFuZ2Ugd2l0aCBhdCBsZWFzdCByZWFkIHBlcm1p c3Npb24uCj4gIE5vdyBsZXQncyBzYXkgdGhlIGRyaXZlciB3YW50cyB0byBkbyB0aGUgc2FtZSBl eGNlcHQgZm9yIG9uZSBwYWdlIGluIHRoZSByYW5nZSBmb3IKPiAgd2hpY2ggaXQgd2FudHMgdG8g aGF2ZSB3cml0ZSBwZXJtaXNzaW9uLiBOb3cgZHJpdmVyIHNldDo6Cj4gIAo+IC0gICAgcmFuZ2Ut PmRlZmF1bHRfZmxhZ3MgPSAoMSA8PCA2Myk7Cj4gLSAgICByYW5nZS0+cGZuX2ZsYWdzX21hc2sg PSAoMSA8PCA2Mik7Cj4gLSAgICByYW5nZS0+cGZuc1tpbmRleF9vZl93cml0ZV0gPSAoMSA8PCA2 Mik7Cj4gKyAgICByYW5nZS0+ZGVmYXVsdF9mbGFncyA9IEhNTV9QRk5fUkVRX1ZBTElEOwoKSE1N X1BGTl9SRVFfRkFVTFQKClJlZ2FyZHMsCsKgIEZlbGl4CgoKPiArICAgIHJhbmdlLT5wZm5fZmxh Z3NfbWFzayA9IEhNTV9QRk5fUkVRX1dSSVRFOwo+ICsgICAgcmFuZ2UtPnBmbnNbaW5kZXhfb2Zf d3JpdGVdID0gSE1NX1BGTl9SRVFfV1JJVEU7Cj4gIAo+ICBXaXRoIHRoaXMsIEhNTSB3aWxsIGZh dWx0IGluIGFsbCBwYWdlcyB3aXRoIGF0IGxlYXN0IHJlYWQgKGkuZS4sIHZhbGlkKSBhbmQgZm9y IHRoZQo+ICBhZGRyZXNzID09IHJhbmdlLT5zdGFydCArIChpbmRleF9vZl93cml0ZSA8PCBQQUdF X1NISUZUKSBpdCB3aWxsIGZhdWx0IHdpdGgKPiAgd3JpdGUgcGVybWlzc2lvbiBpLmUuLCBpZiB0 aGUgQ1BVIHB0ZSBkb2VzIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gc2V0IHRoZW4gSE1NCj4g IHdpbGwgY2FsbCBoYW5kbGVfbW1fZmF1bHQoKS4KPiAgCj4gLU5vdGUgdGhhdCBITU0gd2lsbCBw b3B1bGF0ZSB0aGUgcGZucyBhcnJheSB3aXRoIHdyaXRlIHBlcm1pc3Npb24gZm9yIGFueSBwYWdl Cj4gLXRoYXQgaXMgbWFwcGVkIHdpdGggQ1BVIHdyaXRlIHBlcm1pc3Npb24gbm8gbWF0dGVyIHdo YXQgdmFsdWVzIGFyZSBzZXQKPiAtaW4gZGVmYXVsdF9mbGFncyBvciBwZm5fZmxhZ3NfbWFzay4K PiArQWZ0ZXIgaG1tX3JhbmdlX2ZhdWx0IGNvbXBsZXRlcyB0aGUgZmxhZyBiaXRzIGFyZSBzZXQg dG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YKPiArdGhlIHBhZ2UgdGFibGVzLCBpZSBITU1fUEZOX1ZB TElEIHwgSE1NX1BGTl9XUklURSB3aWxsIGJlIHNldCBpZiB0aGUgcGFnZSBpcwo+ICt3cml0YWJs ZS4KPiAgCj4gIAo+ICBSZXByZXNlbnQgYW5kIG1hbmFnZSBkZXZpY2UgbWVtb3J5IGZyb20gY29y ZSBrZXJuZWwgcG9pbnQgb2Ygdmlldwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vYW1k L2FtZGdwdS9hbWRncHVfdHRtLmMgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVf dHRtLmMKPiBpbmRleCA0NDkwODNmOWY4YTJiZi4uYmNmYThjMjY2NDdkNWUgMTAwNjQ0Cj4gLS0t IGEvZHJpdmVycy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gKysrIGIvZHJpdmVy cy9ncHUvZHJtL2FtZC9hbWRncHUvYW1kZ3B1X3R0bS5jCj4gQEAgLTc2NiwxNyArNzY2LDYgQEAg c3RydWN0IGFtZGdwdV90dG1fdHQgewo+ICB9Owo+ICAKPiAgI2lmZGVmIENPTkZJR19EUk1fQU1E R1BVX1VTRVJQVFIKPiAtLyogZmxhZ3MgdXNlZCBieSBITU0gaW50ZXJuYWwsIG5vdCByZWxhdGVk IHRvIENQVS9HUFUgUFRFIGZsYWdzICovCj4gLXN0YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFu Z2VfZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQkoMSA8PCAwKSwgLyogSE1NX1BGTl9W QUxJRCAqLwo+IC0JKDEgPDwgMSksIC8qIEhNTV9QRk5fV1JJVEUgKi8KPiAtfTsKPiAtCj4gLXN0 YXRpYyBjb25zdCB1aW50NjRfdCBobW1fcmFuZ2VfdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFYXSA9 IHsKPiAtCTB4ZmZmZmZmZmZmZmZmZmZmZVVMLCAvKiBITU1fUEZOX0VSUk9SICovCj4gLQkwLCAv KiBITU1fUEZOX05PTkUgKi8KPiAtfTsKPiAtCj4gIC8qKgo+ICAgKiBhbWRncHVfdHRtX3R0X2dl dF91c2VyX3BhZ2VzIC0gZ2V0IGRldmljZSBhY2Nlc3NpYmxlIHBhZ2VzIHRoYXQgYmFjayB1c2Vy Cj4gICAqIG1lbW9yeSBhbmQgc3RhcnQgSE1NIHRyYWNraW5nIENQVSBwYWdlIHRhYmxlIHVwZGF0 ZQo+IEBAIC04MTUsMTggKzgwNCwxNSBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdl cyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCQlnb3RvIG91 dDsKPiAgCX0KPiAgCXJhbmdlLT5ub3RpZmllciA9ICZiby0+bm90aWZpZXI7Cj4gLQlyYW5nZS0+ ZmxhZ3MgPSBobW1fcmFuZ2VfZmxhZ3M7Cj4gLQlyYW5nZS0+dmFsdWVzID0gaG1tX3JhbmdlX3Zh bHVlczsKPiAtCXJhbmdlLT5wZm5fc2hpZnQgPSBQQUdFX1NISUZUOwo+ICAJcmFuZ2UtPnN0YXJ0 ID0gYm8tPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQ7Cj4gIAlyYW5nZS0+ZW5kID0gYm8t Pm5vdGlmaWVyLmludGVydmFsX3RyZWUubGFzdCArIDE7Cj4gLQlyYW5nZS0+ZGVmYXVsdF9mbGFn cyA9IGhtbV9yYW5nZV9mbGFnc1tITU1fUEZOX1ZBTElEXTsKPiArCXJhbmdlLT5kZWZhdWx0X2Zs YWdzID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gIAlpZiAoIWFtZGdwdV90dG1fdHRfaXNfcmVhZG9u bHkodHRtKSkKPiAtCQlyYW5nZS0+ZGVmYXVsdF9mbGFncyB8PSByYW5nZS0+ZmxhZ3NbSE1NX1BG Tl9XUklURV07Cj4gKwkJcmFuZ2UtPmRlZmF1bHRfZmxhZ3MgfD0gSE1NX1BGTl9SRVFfV1JJVEU7 Cj4gIAo+IC0JcmFuZ2UtPnBmbnMgPSBrdm1hbGxvY19hcnJheSh0dG0tPm51bV9wYWdlcywgc2l6 ZW9mKCpyYW5nZS0+cGZucyksCj4gLQkJCQkgICAgIEdGUF9LRVJORUwpOwo+IC0JaWYgKHVubGlr ZWx5KCFyYW5nZS0+cGZucykpIHsKPiArCXJhbmdlLT5obW1fcGZucyA9IGt2bWFsbG9jX2FycmF5 KHR0bS0+bnVtX3BhZ2VzLAo+ICsJCQkJCSBzaXplb2YoKnJhbmdlLT5obW1fcGZucyksIEdGUF9L RVJORUwpOwo+ICsJaWYgKHVubGlrZWx5KCFyYW5nZS0+aG1tX3BmbnMpKSB7Cj4gIAkJciA9IC1F Tk9NRU07Cj4gIAkJZ290byBvdXRfZnJlZV9yYW5nZXM7Cj4gIAl9Cj4gQEAgLTg2Nyw3ICs4NTMs NyBAQCBpbnQgYW1kZ3B1X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpi bywgc3RydWN0IHBhZ2UgKipwYWdlcykKPiAgCSAqIHRoZSBub3RpZmllcl9sb2NrLCBhbmQgbW11 X2ludGVydmFsX3JlYWRfcmV0cnkoKSBtdXN0IGJlIGRvbmUgZmlyc3QuCj4gIAkgKi8KPiAgCWZv ciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKQo+IC0JCXBhZ2VzW2ldID0gaG1tX2Rl dmljZV9lbnRyeV90b19wYWdlKHJhbmdlLCByYW5nZS0+cGZuc1tpXSk7Cj4gKwkJcGFnZXNbaV0g PSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiAgCj4gIAlndHQtPnJhbmdl ID0gcmFuZ2U7Cj4gIAltbXB1dChtbSk7Cj4gQEAgLTg3Nyw3ICs4NjMsNyBAQCBpbnQgYW1kZ3B1 X3R0bV90dF9nZXRfdXNlcl9wYWdlcyhzdHJ1Y3QgYW1kZ3B1X2JvICpibywgc3RydWN0IHBhZ2Ug KipwYWdlcykKPiAgb3V0X3VubG9jazoKPiAgCXVwX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIG91 dF9mcmVlX3BmbnM6Cj4gLQlrdmZyZWUocmFuZ2UtPnBmbnMpOwo+ICsJa3ZmcmVlKHJhbmdlLT5o bW1fcGZucyk7Cj4gIG91dF9mcmVlX3JhbmdlczoKPiAgCWtmcmVlKHJhbmdlKTsKPiAgb3V0Ogo+ IEBAIC05MDIsNyArODg4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJRFJNX0RFQlVHX0RSSVZFUigidXNlcl9wYWdlc19k b25lIDB4JWxseCBwYWdlcyAweCVseFxuIiwKPiAgCQlndHQtPnVzZXJwdHIsIHR0bS0+bnVtX3Bh Z2VzKTsKPiAgCj4gLQlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPnBmbnMs Cj4gKwlXQVJOX09OQ0UoIWd0dC0+cmFuZ2UgfHwgIWd0dC0+cmFuZ2UtPmhtbV9wZm5zLAo+ICAJ CSJObyB1c2VyIHBhZ2VzIHRvIGNoZWNrXG4iKTsKPiAgCj4gIAlpZiAoZ3R0LT5yYW5nZSkgewo+ IEBAIC05MTIsNyArODk4LDcgQEAgYm9vbCBhbWRncHVfdHRtX3R0X2dldF91c2VyX3BhZ2VzX2Rv bmUoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAJCSAqLwo+ICAJCXIgPSBtbXVfaW50ZXJ2YWxfcmVh ZF9yZXRyeShndHQtPnJhbmdlLT5ub3RpZmllciwKPiAgCQkJCQkgZ3R0LT5yYW5nZS0+bm90aWZp ZXJfc2VxKTsKPiAtCQlrdmZyZWUoZ3R0LT5yYW5nZS0+cGZucyk7Cj4gKwkJa3ZmcmVlKGd0dC0+ cmFuZ2UtPmhtbV9wZm5zKTsKPiAgCQlrZnJlZShndHQtPnJhbmdlKTsKPiAgCQlndHQtPnJhbmdl ID0gTlVMTDsKPiAgCX0KPiBAQCAtMTAwMyw4ICs5ODksNyBAQCBzdGF0aWMgdm9pZCBhbWRncHVf dHRtX3R0X3VucGluX3VzZXJwdHIoc3RydWN0IHR0bV90dCAqdHRtKQo+ICAKPiAgCQlmb3IgKGkg PSAwOyBpIDwgdHRtLT5udW1fcGFnZXM7IGkrKykgewo+ICAJCQlpZiAodHRtLT5wYWdlc1tpXSAh PQo+IC0JCQkJaG1tX2RldmljZV9lbnRyeV90b19wYWdlKGd0dC0+cmFuZ2UsCj4gLQkJCQkJICAg ICAgZ3R0LT5yYW5nZS0+cGZuc1tpXSkpCj4gKwkJCSAgICBobW1fcGZuX3RvX3BhZ2UoZ3R0LT5y YW5nZS0+aG1tX3BmbnNbaV0pKQo+ICAJCQkJYnJlYWs7Cj4gIAkJfQo+ICAKPiBkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmMgYi9kcml2ZXJzL2dwdS9k cm0vbm91dmVhdS9ub3V2ZWF1X2RtZW0uYwo+IGluZGV4IGFkODllMDlhMGJlMzlhLi4wNzg3NmZi MGUxZDY2NSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVhdS9ub3V2ZWF1X2Rt ZW0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5jCj4gQEAg LTY3MiwyNyArNjcyLDYxIEBAIG5vdXZlYXVfZG1lbV9taWdyYXRlX3ZtYShzdHJ1Y3Qgbm91dmVh dV9kcm0gKmRybSwKPiAgCXJldHVybiByZXQ7Cj4gIH0KPiAgCj4gLXZvaWQKPiAtbm91dmVhdV9k bWVtX2NvbnZlcnRfcGZuKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+IC0JCQkgc3RydWN0IGht bV9yYW5nZSAqcmFuZ2UpCj4gK3ZvaWQgbm91dmVhdV9obW1fY29udmVydF9wZm4oc3RydWN0IG5v dXZlYXVfZHJtICpkcm0sIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkgICAgIHU2NCAq aW9jdGxfYWRkcikKPiAgewo+ICAJdW5zaWduZWQgbG9uZyBpLCBucGFnZXM7Cj4gIAo+ICsJLyoK PiArCSAqIFRoZSBpb2N0bF9hZGRyIHByZXBhcmVkIGhlcmUgaXMgcGFzc2VkIHRocm91Z2ggbnZp Zl9vYmplY3RfaW9jdGwoKQo+ICsJICogdG8gYW4gZXZlbnR1YWwgRE1BIG1hcCBvbiBzb21lIGNh bGwgY2hhaW4gbGlrZToKPiArCSAqICAgIG5vdXZlYXVfc3ZtX2ZhdWx0KCk6Cj4gKwkgKiAgICAg IGFyZ3MuaS5tLm1ldGhvZCA9IE5WSUZfVk1NX1YwX1BGTk1BUAo+ICsJICogICAgICBub3V2ZWF1 X3JhbmdlX2ZhdWx0KCkKPiArCSAqICAgICAgIG52aWZfb2JqZWN0X2lvY3RsKCkKPiArCSAqICAg ICAgICBjbGllbnQtPmRyaXZlci0+aW9jdGwoKQo+ICsJICogICAgICAgICAgIHN0cnVjdCBudmlm X2RyaXZlciBudmlmX2RyaXZlcl9udmttOgo+ICsJICogICAgICAgICAgICAgLmlvY3RsID0gbnZr bV9jbGllbnRfaW9jdGwKPiArCSAqICAgICAgICAgICAgbnZrbV9pb2N0bCgpCj4gKwkgKiAgICAg ICAgICAgICBudmttX2lvY3RsX3BhdGgoKQo+ICsJICogICAgICAgICAgICAgICBudmttX2lvY3Rs X3YwW3R5cGVdLmZ1bmMoLi4pCj4gKwkgKiAgICAgICAgICAgICAgIG52a21faW9jdGxfbXRoZCgp Cj4gKwkgKiAgICAgICAgICAgICAgICBudmttX29iamVjdF9tdGhkKCkKPiArCSAqICAgICAgICAg ICAgICAgICAgIHN0cnVjdCBudmttX29iamVjdF9mdW5jIG52a21fdXZtbToKPiArCSAqICAgICAg ICAgICAgICAgICAgICAgLm10aGQgPSBudmttX3V2bW1fbXRoZAo+ICsJICogICAgICAgICAgICAg ICAgICAgIG52a21fdXZtbV9tdGhkKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgbnZrbV91 dm1tX210aGRfcGZubWFwKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3Bm bl9tYXAoKQo+ICsJICogICAgICAgICAgICAgICAgICAgICAgIG52a21fdm1tX3B0ZXNfZ2V0X21h cCgpCj4gKwkgKiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmMgPT0gZ3AxMDBfdm1tX3BndF9w Zm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBudmttX3ZtbV9kZXNjX2Z1 bmMgZ3AxMDBfdm1tX2Rlc2Nfc3B0Ogo+ICsJICogICAgICAgICAgICAgICAgICAgICAgICAgICAu cGZuID0gZ3AxMDBfdm1tX3BndF9wZm4KPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICBu dmttX3ZtbV9pdGVyKCkKPiArCSAqICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVGX1BURVMg PT0gZnVuYyA9PSBncDEwMF92bW1fcGd0X3BmbigpCj4gKwkgKgkJCSAgICAgIGRtYV9tYXBfcGFn ZSgpCj4gKwkgKgo+ICsJICogVGhpcyBpcyBhbGwganVzdCBlbmNvZGluZyB0aGUgaW50ZXJuYWwg aG1tIHJlcHJlbnNldGF0aW9uIGludG8gYQo+ICsJICogZGlmZmVyZW50IG5vdXZlYXUgaW50ZXJu YWwgcmVwcmVzZW50YXRpb24uCj4gKwkgKi8KPiAgCW5wYWdlcyA9IChyYW5nZS0+ZW5kIC0gcmFu Z2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yIChpID0gMDsgaSA8IG5wYWdlczsgKytp KSB7Cj4gIAkJc3RydWN0IHBhZ2UgKnBhZ2U7Cj4gLQkJdWludDY0X3QgYWRkcjsKPiAgCj4gLQkJ cGFnZSA9IGhtbV9kZXZpY2VfZW50cnlfdG9fcGFnZShyYW5nZSwgcmFuZ2UtPnBmbnNbaV0pOwo+ IC0JCWlmIChwYWdlID09IE5VTEwpCj4gLQkJCWNvbnRpbnVlOwo+IC0KPiAtCQlpZiAoIWlzX2Rl dmljZV9wcml2YXRlX3BhZ2UocGFnZSkpCj4gKwkJaWYgKCEocmFuZ2UtPmhtbV9wZm5zW2ldICYg SE1NX1BGTl9WQUxJRCkpIHsKPiArCQkJaW9jdGxfYWRkcltpXSA9IDA7Cj4gIAkJCWNvbnRpbnVl Owo+ICsJCX0KPiAgCj4gLQkJYWRkciA9IG5vdXZlYXVfZG1lbV9wYWdlX2FkZHIocGFnZSk7Cj4g LQkJcmFuZ2UtPnBmbnNbaV0gJj0gKCgxVUwgPDwgcmFuZ2UtPnBmbl9zaGlmdCkgLSAxKTsKPiAt CQlyYW5nZS0+cGZuc1tpXSB8PSAoYWRkciA+PiBQQUdFX1NISUZUKSA8PCByYW5nZS0+cGZuX3No aWZ0Owo+IC0JCXJhbmdlLT5wZm5zW2ldIHw9IE5WSUZfVk1NX1BGTk1BUF9WMF9WUkFNOwo+ICsJ CXBhZ2UgPSBobW1fcGZuX3RvX3BhZ2UocmFuZ2UtPmhtbV9wZm5zW2ldKTsKPiArCQlpZiAoaXNf ZGV2aWNlX3ByaXZhdGVfcGFnZShwYWdlKSkKPiArCQkJaW9jdGxfYWRkcltpXSA9IG5vdXZlYXVf ZG1lbV9wYWdlX2FkZHIocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwKPiAr CQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfVlJBTTsKPiArCQllbHNlCj4gKwkJCWlvY3RsX2FkZHJb aV0gPSBwYWdlX3RvX3BoeXMocGFnZSkgfAo+ICsJCQkJCU5WSUZfVk1NX1BGTk1BUF9WMF9WIHwK PiArCQkJCQlOVklGX1ZNTV9QRk5NQVBfVjBfSE9TVDsKPiArCQlpZiAocmFuZ2UtPmhtbV9wZm5z W2ldICYgSE1NX1BGTl9XUklURSkKPiArCQkJaW9jdGxfYWRkcltpXSB8PSBOVklGX1ZNTV9QRk5N QVBfVjBfVzsKPiAgCX0KPiAgfQo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vbm91dmVh dS9ub3V2ZWF1X2RtZW0uaCBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5o Cj4gaW5kZXggOTIzOTRiZTVkNjQ5MjMuLjQ2MDdjMGJlN2RkMDYyIDEwMDY0NAo+IC0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfZG1lbS5oCj4gKysrIGIvZHJpdmVycy9ncHUv ZHJtL25vdXZlYXUvbm91dmVhdV9kbWVtLmgKPiBAQCAtMzgsOCArMzgsOCBAQCBpbnQgbm91dmVh dV9kbWVtX21pZ3JhdGVfdm1hKHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLAo+ICAJCQkgICAgIHVu c2lnbmVkIGxvbmcgc3RhcnQsCj4gIAkJCSAgICAgdW5zaWduZWQgbG9uZyBlbmQpOwo+ICAKPiAt dm9pZCBub3V2ZWF1X2RtZW1fY29udmVydF9wZm4oc3RydWN0IG5vdXZlYXVfZHJtICpkcm0sCj4g LQkJCSAgICAgIHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlKTsKPiArdm9pZCBub3V2ZWF1X2htbV9j b252ZXJ0X3BmbihzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSwgc3RydWN0IGhtbV9yYW5nZSAqcmFu Z2UsCj4gKwkJCSAgICAgdTY0ICppb2N0bF9hZGRyKTsKPiAgI2Vsc2UgLyogSVNfRU5BQkxFRChD T05GSUdfRFJNX05PVVZFQVVfU1ZNKSAqLwo+ICBzdGF0aWMgaW5saW5lIHZvaWQgbm91dmVhdV9k bWVtX2luaXQoc3RydWN0IG5vdXZlYXVfZHJtICpkcm0pIHt9Cj4gIHN0YXRpYyBpbmxpbmUgdm9p ZCBub3V2ZWF1X2RtZW1fZmluaShzdHJ1Y3Qgbm91dmVhdV9kcm0gKmRybSkge30KPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9zdm0uYyBiL2RyaXZlcnMvZ3B1 L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBpbmRleCBjZjBkOWJkNjFiZWJmOS4uZDEwNTli Y2UwOTExOTIgMTAwNjQ0Cj4gLS0tIGEvZHJpdmVycy9ncHUvZHJtL25vdXZlYXUvbm91dmVhdV9z dm0uYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9ub3V2ZWF1L25vdXZlYXVfc3ZtLmMKPiBAQCAt MzY5LDE4ICszNjksNiBAQCBub3V2ZWF1X3N2bW1faW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 LCB2b2lkICpkYXRhLAo+ICAJcmV0dXJuIHJldDsKPiAgfQo+ICAKPiAtc3RhdGljIGNvbnN0IHU2 NAo+IC1ub3V2ZWF1X3N2bV9wZm5fZmxhZ3NbSE1NX1BGTl9GTEFHX01BWF0gPSB7Cj4gLQlbSE1N X1BGTl9WQUxJRCAgICAgICAgIF0gPSBOVklGX1ZNTV9QRk5NQVBfVjBfViwKPiAtCVtITU1fUEZO X1dSSVRFICAgICAgICAgXSA9IE5WSUZfVk1NX1BGTk1BUF9WMF9XLAo+IC19Owo+IC0KPiAtc3Rh dGljIGNvbnN0IHU2NAo+IC1ub3V2ZWF1X3N2bV9wZm5fdmFsdWVzW0hNTV9QRk5fVkFMVUVfTUFY XSA9IHsKPiAtCVtITU1fUEZOX0VSUk9SICBdID0gfk5WSUZfVk1NX1BGTk1BUF9WMF9WLAo+IC0J W0hNTV9QRk5fTk9ORSAgIF0gPSAgTlZJRl9WTU1fUEZOTUFQX1YwX05PTkUsCj4gLX07Cj4gLQo+ ICAvKiBJc3N1ZSBmYXVsdCByZXBsYXkgZm9yIEdQVSB0byByZXRyeSBhY2Nlc3NlcyB0aGF0IGZh dWx0ZWQgcHJldmlvdXNseS4gKi8KPiAgc3RhdGljIHZvaWQKPiAgbm91dmVhdV9zdm1fZmF1bHRf cmVwbGF5KHN0cnVjdCBub3V2ZWF1X3N2bSAqc3ZtKQo+IEBAIC01MjAsNyArNTA4LDggQEAgc3Rh dGljIGNvbnN0IHN0cnVjdCBtbXVfaW50ZXJ2YWxfbm90aWZpZXJfb3BzIG5vdXZlYXVfc3ZtX21u aV9vcHMgPSB7Cj4gIAo+ICBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQoc3RydWN0IG5v dXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJICAgICAgIHN0cnVjdCBub3V2ZWF1X2RybSAqZHJtLCB2 b2lkICpkYXRhLCB1MzIgc2l6ZSwKPiAtCQkJICAgICAgIHU2NCAqcGZucywgc3RydWN0IHN2bV9u b3RpZmllciAqbm90aWZpZXIpCj4gKwkJCSAgICAgICB1bnNpZ25lZCBsb25nIGhtbV9wZm5zW10s IHU2NCAqaW9jdGxfYWRkciwKPiArCQkJICAgICAgIHN0cnVjdCBzdm1fbm90aWZpZXIgKm5vdGlm aWVyKQo+ICB7Cj4gIAl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPQo+ICAJCWppZmZpZXMgKyBtc2Vj c190b19qaWZmaWVzKEhNTV9SQU5HRV9ERUZBVUxUX1RJTUVPVVQpOwo+IEBAIC01MjksMTAgKzUx OCw4IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVsdChzdHJ1Y3Qgbm91dmVhdV9zdm1t ICpzdm1tLAo+ICAJCS5ub3RpZmllciA9ICZub3RpZmllci0+bm90aWZpZXIsCj4gIAkJLnN0YXJ0 ID0gbm90aWZpZXItPm5vdGlmaWVyLmludGVydmFsX3RyZWUuc3RhcnQsCj4gIAkJLmVuZCA9IG5v dGlmaWVyLT5ub3RpZmllci5pbnRlcnZhbF90cmVlLmxhc3QgKyAxLAo+IC0JCS5wZm5zID0gcGZu cywKPiAtCQkuZmxhZ3MgPSBub3V2ZWF1X3N2bV9wZm5fZmxhZ3MsCj4gLQkJLnZhbHVlcyA9IG5v dXZlYXVfc3ZtX3Bmbl92YWx1ZXMsCj4gLQkJLnBmbl9zaGlmdCA9IE5WSUZfVk1NX1BGTk1BUF9W MF9BRERSX1NISUZULAo+ICsJCS5wZm5fZmxhZ3NfbWFzayA9IEhNTV9QRk5fUkVRX0ZBVUxUIHwg SE1NX1BGTl9SRVFfV1JJVEUsCj4gKwkJLmhtbV9wZm5zID0gaG1tX3BmbnMsCj4gIAl9Owo+ICAJ c3RydWN0IG1tX3N0cnVjdCAqbW0gPSBub3RpZmllci0+bm90aWZpZXIubW07Cj4gIAlpbnQgcmV0 Owo+IEBAIC01NDIsMTIgKzUyOSwxNSBAQCBzdGF0aWMgaW50IG5vdXZlYXVfcmFuZ2VfZmF1bHQo c3RydWN0IG5vdXZlYXVfc3ZtbSAqc3ZtbSwKPiAgCQkJcmV0dXJuIC1FQlVTWTsKPiAgCj4gIAkJ cmFuZ2Uubm90aWZpZXJfc2VxID0gbW11X2ludGVydmFsX3JlYWRfYmVnaW4ocmFuZ2Uubm90aWZp ZXIpOwo+IC0JCXJhbmdlLmRlZmF1bHRfZmxhZ3MgPSAwOwo+IC0JCXJhbmdlLnBmbl9mbGFnc19t YXNrID0gLTFVTDsKPiAgCQlkb3duX3JlYWQoJm1tLT5tbWFwX3NlbSk7Cj4gIAkJcmV0ID0gaG1t X3JhbmdlX2ZhdWx0KCZyYW5nZSk7Cj4gIAkJdXBfcmVhZCgmbW0tPm1tYXBfc2VtKTsKPiAgCQlp ZiAocmV0KSB7Cj4gKwkJCS8qCj4gKwkJCSAqIEZJWE1FOiB0aGUgaW5wdXQgUEZOX1JFUSBmbGFn cyBhcmUgZGVzdHJveWVkIG9uCj4gKwkJCSAqIC1FQlVTWSwgd2UgbmVlZCB0byByZWdlbmVyYXRl IHRoZW0sIGFsc28gZm9yIHRoZQo+ICsJCQkgKiBvdGhlciBjb250aW51ZSBiZWxvdwo+ICsJCQkg Ki8KPiAgCQkJaWYgKHJldCA9PSAtRUJVU1kpCj4gIAkJCQljb250aW51ZTsKPiAgCQkJcmV0dXJu IHJldDsKPiBAQCAtNTYyLDcgKzU1Miw3IEBAIHN0YXRpYyBpbnQgbm91dmVhdV9yYW5nZV9mYXVs dChzdHJ1Y3Qgbm91dmVhdV9zdm1tICpzdm1tLAo+ICAJCWJyZWFrOwo+ICAJfQo+ICAKPiAtCW5v dXZlYXVfZG1lbV9jb252ZXJ0X3Bmbihkcm0sICZyYW5nZSk7Cj4gKwlub3V2ZWF1X2htbV9jb252 ZXJ0X3Bmbihkcm0sICZyYW5nZSwgaW9jdGxfYWRkcik7Cj4gIAo+ICAJc3ZtbS0+dm1tLT52bW0u b2JqZWN0LmNsaWVudC0+c3VwZXIgPSB0cnVlOwo+ICAJcmV0ID0gbnZpZl9vYmplY3RfaW9jdGwo JnN2bW0tPnZtbS0+dm1tLm9iamVjdCwgZGF0YSwgc2l6ZSwgTlVMTCk7Cj4gQEAgLTU4OSw2ICs1 NzksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlmeSkKPiAg CQl9IGk7Cj4gIAkJdTY0IHBoeXNbMTZdOwo+ICAJfSBhcmdzOwo+ICsJdW5zaWduZWQgbG9uZyBo bW1fcGZuc1tBUlJBWV9TSVpFKGFyZ3MucGh5cyldOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0 ICp2bWE7Cj4gIAl1NjQgaW5zdCwgc3RhcnQsIGxpbWl0Owo+ICAJaW50IGZpLCBmbiwgcGksIGZp bGw7Cj4gQEAgLTcwNCwxMiArNjk1LDE3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlm X25vdGlmeSAqbm90aWZ5KQo+ICAJCQkgKiBhY2Nlc3MgZmxhZ3MuCj4gIAkJCSAqWFhYOiBhdG9t aWM/Cj4gIAkJCSAqLwo+IC0JCQlpZiAoYnVmZmVyLT5mYXVsdFtmbl0tPmFjY2VzcyAhPSAwIC8q IFJFQUQuICovICYmCj4gLQkJCSAgICBidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzICE9IDMgLyog UFJFRkVUQ0guICovKSB7Cj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBf VjBfViB8Cj4gLQkJCQkJCSAgTlZJRl9WTU1fUEZOTUFQX1YwX1c7Cj4gLQkJCX0gZWxzZSB7Cj4g LQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfVjsKPiArCQkJc3dpdGNo IChidWZmZXItPmZhdWx0W2ZuXS0+YWNjZXNzKSB7Cj4gKwkJCWNhc2UgMDogLyogUkVBRC4gKi8K PiArCQkJCWhtbV9wZm5zW3BpKytdID0gSE1NX1BGTl9SRVFfRkFVTFQ7Cj4gKwkJCQlicmVhazsK PiArCQkJY2FzZSAzOiAvKiBQUkVGRVRDSC4gKi8KPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsK PiArCQkJCWJyZWFrOwo+ICsJCQlkZWZhdWx0Ogo+ICsJCQkJaG1tX3BmbnNbcGkrK10gPSBITU1f UEZOX1JFUV9GQVVMVCB8Cj4gKwkJCQkJCSBITU1fUEZOX1JFUV9XUklURTsKPiArCQkJCWJyZWFr Owo+ICAJCQl9Cj4gIAkJCWFyZ3MuaS5wLnNpemUgPSBwaSA8PCBQQUdFX1NISUZUOwo+ICAKPiBA QCAtNzM3LDcgKzczMyw3IEBAIG5vdXZlYXVfc3ZtX2ZhdWx0KHN0cnVjdCBudmlmX25vdGlmeSAq bm90aWZ5KQo+ICAJCQlmaWxsID0gKGJ1ZmZlci0+ZmF1bHRbZm4gICAgXS0+YWRkciAtCj4gIAkJ CQlidWZmZXItPmZhdWx0W2ZuIC0gMV0tPmFkZHIpID4+IFBBR0VfU0hJRlQ7Cj4gIAkJCXdoaWxl ICgtLWZpbGwpCj4gLQkJCQlhcmdzLnBoeXNbcGkrK10gPSBOVklGX1ZNTV9QRk5NQVBfVjBfTk9O RTsKPiArCQkJCWhtbV9wZm5zW3BpKytdID0gMDsKPiAgCQl9Cj4gIAo+ICAJCVNWTU1fREJHKHN2 bW0sICJ3bmR3ICUwMTZsbHgtJTAxNmxseCBjb3ZlcmluZyAlZCBmYXVsdChzKSIsCj4gQEAgLTc1 Myw3ICs3NDksNyBAQCBub3V2ZWF1X3N2bV9mYXVsdChzdHJ1Y3QgbnZpZl9ub3RpZnkgKm5vdGlm eSkKPiAgCQkJcmV0ID0gbm91dmVhdV9yYW5nZV9mYXVsdCgKPiAgCQkJCXN2bW0sIHN2bS0+ZHJt LCAmYXJncywKPiAgCQkJCXNpemVvZihhcmdzLmkpICsgcGkgKiBzaXplb2YoYXJncy5waHlzWzBd KSwKPiAtCQkJCWFyZ3MucGh5cywgJm5vdGlmaWVyKTsKPiArCQkJCWhtbV9wZm5zLCBhcmdzLnBo eXMsICZub3RpZmllcik7Cj4gIAkJCW1tdV9pbnRlcnZhbF9ub3RpZmllcl9yZW1vdmUoJm5vdGlm aWVyLm5vdGlmaWVyKTsKPiAgCQl9Cj4gIAkJbW1wdXQobW0pOwo+IGRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L2htbS5oIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IGluZGV4IDgxYzMwMmM4ODRj MGUzLi5lNzI1Mjk3ODZmMTZmOCAxMDA2NDQKPiAtLS0gYS9pbmNsdWRlL2xpbnV4L2htbS5oCj4g KysrIGIvaW5jbHVkZS9saW51eC9obW0uaAo+IEBAIC0xOSw0NSArMTksNDUgQEAKPiAgI2luY2x1 ZGUgPGxpbnV4L21tdV9ub3RpZmllci5oPgo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl9mbGFnX2Ug LSBITU0gZmxhZyBlbnVtcwo+ICsgKiBPbiBvdXRwdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgLSBU aGUgcGFnZSBpcyBmYXVsdGFibGUgYW5kIGEgZnV0dXJlIGNhbGwgd2l0aCAKPiArICogICAgICAg ICAgICAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUIGNvdWxkIHN1Y2NlZWQuCj4gKyAqIEhNTV9QRk5f VkFMSUQgLSB0aGUgcGZuIGZpZWxkIHBvaW50cyB0byBhIHZhbGlkIFBGTi4gVGhpcyBQRk4gaXMg YXQKPiArICogICAgICAgICAgICAgICAgIGxlYXN0IHJlYWRhYmxlLiBJZiBkZXZfcHJpdmF0ZV9v d25lciBpcyAhTlVMTCB0aGVuIHRoaXMgY291bGQKPiArICogICAgICAgICAgICAgICAgIHBvaW50 IGF0IGEgREVWSUNFX1BSSVZBVEUgcGFnZS4KPiArICogSE1NX1BGTl9XUklURSAtIGlmIHRoZSBw YWdlIG1lbW9yeSBjYW4gYmUgd3JpdHRlbiB0byAocmVxdWlyZXMgSE1NX1BGTl9WQUxJRCkKPiAr ICogSE1NX1BGTl9FUlJPUiAtIGFjY2Vzc2luZyB0aGUgcGZuIGlzIGltcG9zc2libGUgYW5kIHRo ZSBkZXZpY2Ugc2hvdWxkCj4gKyAqICAgICAgICAgICAgICAgICBmYWlsLiBpZSBwb2lzb25lZCBt ZW1vcnksIHNwZWNpYWwgcGFnZXMsIG5vIHZtYSwgZXRjCj4gICAqCj4gLSAqIEZsYWdzOgo+IC0g KiBITU1fUEZOX1ZBTElEOiBwZm4gaXMgdmFsaWQuIEl0IGhhcywgYXQgbGVhc3QsIHJlYWQgcGVy bWlzc2lvbi4KPiAtICogSE1NX1BGTl9XUklURTogQ1BVIHBhZ2UgdGFibGUgaGFzIHdyaXRlIHBl cm1pc3Npb24gc2V0Cj4gLSAqCj4gLSAqIFRoZSBkcml2ZXIgcHJvdmlkZXMgYSBmbGFncyBhcnJh eSBmb3IgbWFwcGluZyBwYWdlIHByb3RlY3Rpb25zIHRvIGRldmljZQo+IC0gKiBQVEUgYml0cy4g SWYgdGhlIGRyaXZlciB2YWxpZCBiaXQgZm9yIGFuIGVudHJ5IGlzIGJpdCAzLAo+IC0gKiBpLmUu LCAoZW50cnkgJiAoMSA8PCAzKSksIHRoZW4gdGhlIGRyaXZlciBtdXN0IHByb3ZpZGUKPiAtICog YW4gYXJyYXkgaW4gaG1tX3JhbmdlLmZsYWdzIHdpdGggaG1tX3JhbmdlLmZsYWdzW0hNTV9QRk5f VkFMSURdID09IDEgPDwgMy4KPiAtICogU2FtZSBsb2dpYyBhcHBseSB0byBhbGwgZmxhZ3MuIFRo aXMgaXMgdGhlIHNhbWUgaWRlYSBhcyB2bV9wYWdlX3Byb3QgaW4gdm1hCj4gLSAqIGV4Y2VwdCB0 aGF0IHRoaXMgaXMgcGVyIGRldmljZSBkcml2ZXIgcmF0aGVyIHRoYW4gcGVyIGFyY2hpdGVjdHVy ZS4KPiArICogT24gaW5wdXQ6Cj4gKyAqIDAgICAgICAgICAgICAgICAgIC0gUmV0dXJuIHRoZSBj dXJyZW50IHN0YXRlIG9mIHRoZSBwYWdlLCBkbyBub3QgZmF1bHQgaXQuCj4gKyAqIEhNTV9QRk5f UkVRX0ZBVUxUIC0gVGhlIG91dHB1dCBtdXN0IGhhdmUgSE1NX1BGTl9WQUxJRCBvciBobW1fcmFu Z2VfZmF1bHQoKQo+ICsgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgZmFpbAo+ICsgKiBITU1f UEZOX1JFUV9XUklURSAtIFRoZSBvdXRwdXQgbXVzdCBoYXZlIEhNTV9QRk5fV1JJVEUgb3IgaG1t X3JhbmdlX2ZhdWx0KCkKPiArICogICAgICAgICAgICAgICAgICAgICB3aWxsIGZhaWwuIE11c3Qg YmUgY29tYmluZWQgd2l0aCBITU1fUEZOX1JFUV9GQVVMVC4KPiAgICovCj4gLWVudW0gaG1tX3Bm bl9mbGFnX2Ugewo+IC0JSE1NX1BGTl9WQUxJRCA9IDAsCj4gLQlITU1fUEZOX1dSSVRFLAo+IC0J SE1NX1BGTl9GTEFHX01BWAo+ICtlbnVtIGhtbV9wZm5fZmxhZ3Mgewo+ICsJSE1NX1BGTl9WQUxJ RCA9IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIDEpLAo+ICsJSE1NX1BGTl9XUklURSA9IDFVTCA8 PCAoQklUU19QRVJfTE9ORyAtIDIpLAo+ICsJSE1NX1BGTl9FUlJPUiA9IDFVTCA8PCAoQklUU19Q RVJfTE9ORyAtIDMpLAo+ICsKPiArCUhNTV9QRk5fUkVRX0ZBVUxUID0gSE1NX1BGTl9WQUxJRCwK PiArCUhNTV9QRk5fUkVRX1dSSVRFID0gSE1NX1BGTl9XUklURSwKPiArCj4gKwlITU1fUEZOX0ZM QUdTID0gSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUgfCBITU1fUEZOX0VSUk9SLAo+ICB9 Owo+ICAKPiAgLyoKPiAtICogaG1tX3Bmbl92YWx1ZV9lIC0gSE1NIHBmbiBzcGVjaWFsIHZhbHVl Cj4gLSAqCj4gLSAqIEZsYWdzOgo+IC0gKiBITU1fUEZOX0VSUk9SOiBjb3JyZXNwb25kaW5nIENQ VSBwYWdlIHRhYmxlIGVudHJ5IHBvaW50cyB0byBwb2lzb25lZCBtZW1vcnkKPiAtICogSE1NX1BG Tl9OT05FOiBjb3JyZXNwb25kaW5nIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHB0ZV9ub25lKCkK PiArICogaG1tX3Bmbl90b19wYWdlKCkgLSByZXR1cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBi eSBhIGRldmljZSBlbnRyeQo+ICAgKgo+IC0gKiBEcml2ZXIgcHJvdmlkZXMgdmFsdWVzIGZvciBu b25lIGVudHJ5LCBlcnJvciBlbnRyeSwgYW5kIHNwZWNpYWwgZW50cnkuCj4gLSAqIERyaXZlciBj YW4gYWxpYXMgKGkuZS4sIHVzZSBzYW1lIHZhbHVlKSBlcnJvciBhbmQgc3BlY2lhbCwgYnV0Cj4g LSAqIGl0IHNob3VsZCBub3QgYWxpYXMgbm9uZSB3aXRoIGVycm9yIG9yIHNwZWNpYWwuCj4gLSAq Cj4gLSAqIEhNTSBwZm4gdmFsdWUgcmV0dXJuZWQgYnkgaG1tX3ZtYV9nZXRfcGZucygpIG9yIGht bV92bWFfZmF1bHQoKSB3aWxsIGJlOgo+IC0gKiBobW1fcmFuZ2UudmFsdWVzW0hNTV9QRk5fRVJS T1JdIGlmIENQVSBwYWdlIHRhYmxlIGVudHJ5IGlzIHBvaXNvbm91cywKPiAtICogaG1tX3Jhbmdl LnZhbHVlc1tITU1fUEZOX05PTkVdIGlmIHRoZXJlIGlzIG5vIENQVSBwYWdlIHRhYmxlIGVudHJ5 LAo+ICsgKiBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIHRoZSBjYWxsZXIgJ3VzZXJfbG9jaycg YWZ0ZXIgYSBzdWNjZXNzZnVsCj4gKyAqIG1tdV9pbnRlcnZhbF9yZWFkX2JlZ2luKCkuIFRoZSBj YWxsZXIgbXVzdCBoYXZlIHRlc3RlZCBmb3IgSE1NX1BGTl9WQUxJRAo+ICsgKiBhbHJlYWR5Lgo+ ICAgKi8KPiAtZW51bSBobW1fcGZuX3ZhbHVlX2Ugewo+IC0JSE1NX1BGTl9FUlJPUiwKPiAtCUhN TV9QRk5fTk9ORSwKPiAtCUhNTV9QRk5fVkFMVUVfTUFYCj4gLX07Cj4gK3N0YXRpYyBpbmxpbmUg c3RydWN0IHBhZ2UgKmhtbV9wZm5fdG9fcGFnZSh1bnNpZ25lZCBsb25nIGhtbV9wZm4pCj4gK3sK PiArCXJldHVybiBwZm5fdG9fcGFnZShobW1fcGZuICYgfkhNTV9QRk5fRkxBR1MpOwo+ICt9Cj4g IAo+ICAvKgo+ICAgKiBzdHJ1Y3QgaG1tX3JhbmdlIC0gdHJhY2sgaW52YWxpZGF0aW9uIGxvY2sg b24gdmlydHVhbCBhZGRyZXNzIHJhbmdlCj4gQEAgLTY2LDEyICs2Niw5IEBAIGVudW0gaG1tX3Bm bl92YWx1ZV9lIHsKPiAgICogQG5vdGlmaWVyX3NlcTogcmVzdWx0IG9mIG1tdV9pbnRlcnZhbF9y ZWFkX2JlZ2luKCkKPiAgICogQHN0YXJ0OiByYW5nZSB2aXJ0dWFsIHN0YXJ0IGFkZHJlc3MgKGlu Y2x1c2l2ZSkKPiAgICogQGVuZDogcmFuZ2UgdmlydHVhbCBlbmQgYWRkcmVzcyAoZXhjbHVzaXZl KQo+IC0gKiBAcGZuczogYXJyYXkgb2YgcGZucyAoYmlnIGVub3VnaCBmb3IgdGhlIHJhbmdlKQo+ IC0gKiBAZmxhZ3M6IHBmbiBmbGFncyB0byBtYXRjaCBkZXZpY2UgZHJpdmVyIHBhZ2UgdGFibGUK PiAtICogQHZhbHVlczogcGZuIHZhbHVlIGZvciBzb21lIHNwZWNpYWwgY2FzZSAobm9uZSwgc3Bl Y2lhbCwgZXJyb3IsIC4uLikKPiArICogQGhtbV9wZm5zOiBhcnJheSBvZiBwZm5zIChiaWcgZW5v dWdoIGZvciB0aGUgcmFuZ2UpCj4gICAqIEBkZWZhdWx0X2ZsYWdzOiBkZWZhdWx0IGZsYWdzIGZv ciB0aGUgcmFuZ2UgKHdyaXRlLCByZWFkLCAuLi4gc2VlIGhtbSBkb2MpCj4gICAqIEBwZm5fZmxh Z3NfbWFzazogYWxsb3dzIHRvIG1hc2sgcGZuIGZsYWdzIHNvIHRoYXQgb25seSBkZWZhdWx0X2Zs YWdzIG1hdHRlcgo+IC0gKiBAcGZuX3NoaWZ0OiBwZm4gc2hpZnQgdmFsdWUgKHNob3VsZCBiZSA8 PSBQQUdFX1NISUZUKQo+ICAgKiBAZGV2X3ByaXZhdGVfb3duZXI6IG93bmVyIG9mIGRldmljZSBw cml2YXRlIHBhZ2VzCj4gICAqLwo+ICBzdHJ1Y3QgaG1tX3JhbmdlIHsKPiBAQCAtNzksMzYgKzc2 LDEyIEBAIHN0cnVjdCBobW1fcmFuZ2Ugewo+ICAJdW5zaWduZWQgbG9uZwkJbm90aWZpZXJfc2Vx Owo+ICAJdW5zaWduZWQgbG9uZwkJc3RhcnQ7Cj4gIAl1bnNpZ25lZCBsb25nCQllbmQ7Cj4gLQl1 aW50NjRfdAkJKnBmbnM7Cj4gLQljb25zdCB1aW50NjRfdAkJKmZsYWdzOwo+IC0JY29uc3QgdWlu dDY0X3QJCSp2YWx1ZXM7Cj4gLQl1aW50NjRfdAkJZGVmYXVsdF9mbGFnczsKPiAtCXVpbnQ2NF90 CQlwZm5fZmxhZ3NfbWFzazsKPiAtCXVpbnQ4X3QJCQlwZm5fc2hpZnQ7Cj4gKwl1bnNpZ25lZCBs b25nCQkqaG1tX3BmbnM7Cj4gKwl1bnNpZ25lZCBsb25nCQlkZWZhdWx0X2ZsYWdzOwo+ICsJdW5z aWduZWQgbG9uZwkJcGZuX2ZsYWdzX21hc2s7Cj4gIAl2b2lkCQkJKmRldl9wcml2YXRlX293bmVy Owo+ICB9Owo+ICAKPiAtLyoKPiAtICogaG1tX2RldmljZV9lbnRyeV90b19wYWdlKCkgLSByZXR1 cm4gc3RydWN0IHBhZ2UgcG9pbnRlZCB0byBieSBhIGRldmljZSBlbnRyeQo+IC0gKiBAcmFuZ2U6 IHJhbmdlIHVzZSB0byBkZWNvZGUgZGV2aWNlIGVudHJ5IHZhbHVlCj4gLSAqIEBlbnRyeTogZGV2 aWNlIGVudHJ5IHZhbHVlIHRvIGdldCBjb3JyZXNwb25kaW5nIHN0cnVjdCBwYWdlIGZyb20KPiAt ICogUmV0dXJuOiBzdHJ1Y3QgcGFnZSBwb2ludGVyIGlmIGVudHJ5IGlzIGEgdmFsaWQsIE5VTEwg b3RoZXJ3aXNlCj4gLSAqCj4gLSAqIElmIHRoZSBkZXZpY2UgZW50cnkgaXMgdmFsaWQgKGllIHZh bGlkIGZsYWcgc2V0KSB0aGVuIHJldHVybiB0aGUgc3RydWN0IHBhZ2UKPiAtICogbWF0Y2hpbmcg dGhlIGVudHJ5IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCj4gLSAqLwo+IC1zdGF0aWMg aW5saW5lIHN0cnVjdCBwYWdlICpobW1fZGV2aWNlX2VudHJ5X3RvX3BhZ2UoY29uc3Qgc3RydWN0 IGhtbV9yYW5nZSAqcmFuZ2UsCj4gLQkJCQkJCSAgICB1aW50NjRfdCBlbnRyeSkKPiAtewo+IC0J aWYgKGVudHJ5ID09IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXSkKPiAtCQlyZXR1cm4gTlVM TDsKPiAtCWlmIChlbnRyeSA9PSByYW5nZS0+dmFsdWVzW0hNTV9QRk5fRVJST1JdKQo+IC0JCXJl dHVybiBOVUxMOwo+IC0JaWYgKCEoZW50cnkgJiByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0p KQo+IC0JCXJldHVybiBOVUxMOwo+IC0JcmV0dXJuIHBmbl90b19wYWdlKGVudHJ5ID4+IHJhbmdl LT5wZm5fc2hpZnQpOwo+IC19Cj4gLQo+ICAvKgo+ICAgKiBQbGVhc2Ugc2VlIERvY3VtZW50YXRp b24vdm0vaG1tLnJzdCBmb3IgaG93IHRvIHVzZSB0aGUgcmFuZ2UgQVBJLgo+ICAgKi8KPiBkaWZm IC0tZ2l0IGEvbW0vaG1tLmMgYi9tbS9obW0uYwo+IGluZGV4IDI2OTMzOTNkYzE0YjMwLi5jMWM5 NmQ0Y2MwNTU0YyAxMDA2NDQKPiAtLS0gYS9tbS9obW0uYwo+ICsrKyBiL21tL2htbS5jCj4gQEAg LTM3LDI4ICszNywxMyBAQCBlbnVtIHsKPiAgCUhNTV9ORUVEX0FMTF9CSVRTID0gSE1NX05FRURf RkFVTFQgfCBITU1fTkVFRF9XUklURV9GQVVMVCwKPiAgfTsKPiAgCj4gLS8qCj4gLSAqIGhtbV9k ZXZpY2VfZW50cnlfZnJvbV9wZm4oKSAtIGNyZWF0ZSBhIHZhbGlkIGRldmljZSBlbnRyeSB2YWx1 ZSBmcm9tIHBmbgo+IC0gKiBAcmFuZ2U6IHJhbmdlIHVzZSB0byBlbmNvZGUgSE1NIHBmbiB2YWx1 ZQo+IC0gKiBAcGZuOiBwZm4gdmFsdWUgZm9yIHdoaWNoIHRvIGNyZWF0ZSB0aGUgZGV2aWNlIGVu dHJ5Cj4gLSAqIFJldHVybjogdmFsaWQgZGV2aWNlIGVudHJ5IGZvciB0aGUgcGZuCj4gLSAqLwo+ IC1zdGF0aWMgdWludDY0X3QgaG1tX2RldmljZV9lbnRyeV9mcm9tX3Bmbihjb25zdCBzdHJ1Y3Qg aG1tX3JhbmdlICpyYW5nZSwKPiAtCQkJCQkgIHVuc2lnbmVkIGxvbmcgcGZuKQo+IC17Cj4gLQly ZXR1cm4gKHBmbiA8PCByYW5nZS0+cGZuX3NoaWZ0KSB8IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXTsKPiAtfQo+IC0KPiAgc3RhdGljIGludCBobW1fcGZuc19maWxsKHVuc2lnbmVkIGxvbmcg YWRkciwgdW5zaWduZWQgbG9uZyBlbmQsCj4gLQkJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIGVu dW0gaG1tX3Bmbl92YWx1ZV9lIHZhbHVlKQo+ICsJCQkgc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHVuc2lnbmVkIGxvbmcgY3B1X2ZsYWdzKQo+ICB7Cj4gLQl1aW50NjRfdCAqcGZucyA9IHJhbmdl LT5wZm5zOwo+IC0JdW5zaWduZWQgbG9uZyBpOwo+ICsJdW5zaWduZWQgbG9uZyBpID0gKGFkZHIg LSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAo+IC0JaSA9IChhZGRyIC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJZm9yICg7IGFkZHIgPCBlbmQ7IGFkZHIgKz0gUEFH RV9TSVpFLCBpKyspCj4gLQkJcGZuc1tpXSA9IHJhbmdlLT52YWx1ZXNbdmFsdWVdOwo+IC0KPiAr CQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgfQo+ICAK PiBAQCAtOTYsNyArODEsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfZmF1bHQodW5zaWduZWQgbG9u ZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVuZCwKPiAgfQo+ICAKPiAgc3RhdGljIHVuc2lnbmVkIGlu dCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93 YWxrLAo+IC0JCQkJICAgICAgIHVpbnQ2NF90IHBmbnMsIHVpbnQ2NF90IGNwdV9mbGFncykKPiAr CQkJCSAgICAgICB1bnNpZ25lZCBsb25nIHBmbl9yZXFfZmxhZ3MsCj4gKwkJCQkgICAgICAgdW5z aWduZWQgbG9uZyBjcHVfZmxhZ3MpCj4gIHsKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0g aG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCj4gQEAgLTExMCwyNyArOTYsMjggQEAgc3RhdGljIHVu c2lnbmVkIGludCBobW1fcHRlX25lZWRfZmF1bHQoY29uc3Qgc3RydWN0IGhtbV92bWFfd2FsayAq aG1tX3ZtYV93YWxrLAo+ICAJICogd2FzdGUgdG8gaGF2ZSB0aGUgdXNlciBwcmUtZmlsbCB0aGUg cGZuIGFycmF5cyB3aXRoIGEgZGVmYXVsdAo+ICAJICogZmxhZ3MgdmFsdWUuCj4gIAkgKi8KPiAt CXBmbnMgPSAocGZucyAmIHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgfCByYW5nZS0+ZGVmYXVsdF9m bGFnczsKPiArCXBmbl9yZXFfZmxhZ3MgJj0gcmFuZ2UtPnBmbl9mbGFnc19tYXNrOwo+ICsJcGZu X3JlcV9mbGFncyB8PSByYW5nZS0+ZGVmYXVsdF9mbGFnczsKPiAgCj4gIAkvKiBXZSBhcmVuJ3Qg YXNrIHRvIGRvIGFueXRoaW5nIC4uLiAqLwo+IC0JaWYgKCEocGZucyAmIHJhbmdlLT5mbGFnc1tI TU1fUEZOX1ZBTElEXSkpCj4gKwlpZiAoIShwZm5fcmVxX2ZsYWdzICYgSE1NX1BGTl9SRVFfRkFV TFQpKQo+ICAJCXJldHVybiAwOwo+ICAKPiAgCS8qIE5lZWQgdG8gd3JpdGUgZmF1bHQgPyAqLwo+ IC0JaWYgKChwZm5zICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSAmJgo+IC0JICAgICEo Y3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9QRk5fV1JJVEVdKSkKPiArCWlmICgocGZuX3Jl cV9mbGFncyAmIEhNTV9QRk5fUkVRX1dSSVRFKSAmJgo+ICsJICAgICEoY3B1X2ZsYWdzICYgSE1N X1BGTl9XUklURSkpCj4gIAkJcmV0dXJuIEhNTV9ORUVEX0ZBVUxUIHwgSE1NX05FRURfV1JJVEVf RkFVTFQ7Cj4gIAo+ICAJLyogSWYgQ1BVIHBhZ2UgdGFibGUgaXMgbm90IHZhbGlkIHRoZW4gd2Ug bmVlZCB0byBmYXVsdCAqLwo+IC0JaWYgKCEoY3B1X2ZsYWdzICYgcmFuZ2UtPmZsYWdzW0hNTV9Q Rk5fVkFMSURdKSkKPiArCWlmICghKGNwdV9mbGFncyAmIEhNTV9QRk5fVkFMSUQpKQo+ICAJCXJl dHVybiBITU1fTkVFRF9GQVVMVDsKPiAgCXJldHVybiAwOwo+ICB9Cj4gIAo+ICBzdGF0aWMgdW5z aWduZWQgaW50Cj4gIGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGNvbnN0IHN0cnVjdCBobW1fdm1hX3dh bGsgKmhtbV92bWFfd2FsaywKPiAtCQkgICAgIGNvbnN0IHVpbnQ2NF90ICpwZm5zLCB1bnNpZ25l ZCBsb25nIG5wYWdlcywKPiAtCQkgICAgIHVpbnQ2NF90IGNwdV9mbGFncykKPiArCQkgICAgIGNv bnN0IHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgdW5zaWduZWQgbG9uZyBucGFnZXMsCj4gKwkJ ICAgICB1bnNpZ25lZCBsb25nIGNwdV9mbGFncykKPiAgewo+ICAJc3RydWN0IGhtbV9yYW5nZSAq cmFuZ2UgPSBobW1fdm1hX3dhbGstPnJhbmdlOwo+ICAJdW5zaWduZWQgaW50IHJlcXVpcmVkX2Zh dWx0ID0gMDsKPiBAQCAtMTQyLDEyICsxMjksMTIgQEAgaG1tX3JhbmdlX25lZWRfZmF1bHQoY29u c3Qgc3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrLAo+ICAJICogaG1tX3B0ZV9uZWVk X2ZhdWx0KCkgd2lsbCBhbHdheXMgcmV0dXJuIDAuCj4gIAkgKi8KPiAgCWlmICghKChyYW5nZS0+ ZGVmYXVsdF9mbGFncyB8IHJhbmdlLT5wZm5fZmxhZ3NfbWFzaykgJgo+IC0JICAgICAgcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdKSkKPiArCSAgICAgIEhNTV9QRk5fUkVRX0ZBVUxUKSkKPiAg CQlyZXR1cm4gMDsKPiAgCj4gIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyArK2kpIHsKPiAtCQly ZXF1aXJlZF9mYXVsdCB8PQo+IC0JCQlobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBw Zm5zW2ldLCBjcHVfZmxhZ3MpOwo+ICsJCXJlcXVpcmVkX2ZhdWx0IHw9IGhtbV9wdGVfbmVlZF9m YXVsdChobW1fdm1hX3dhbGssIGhtbV9wZm5zW2ldLAo+ICsJCQkJCQkgICAgIGNwdV9mbGFncyk7 Cj4gIAkJaWYgKHJlcXVpcmVkX2ZhdWx0ID09IEhNTV9ORUVEX0FMTF9CSVRTKQo+ICAJCQlyZXR1 cm4gcmVxdWlyZWRfZmF1bHQ7Cj4gIAl9Cj4gQEAgLTE2MSwxMiArMTQ4LDEzIEBAIHN0YXRpYyBp bnQgaG1tX3ZtYV93YWxrX2hvbGUodW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIGVu ZCwKPiAgCXN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAg CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAgCXVuc2lnbmVkIGxvbmcgaSwgbnBhZ2Vz Owo+IC0JdWludDY0X3QgKnBmbnM7Cj4gKwl1bnNpZ25lZCBsb25nICpobW1fcGZuczsKPiAgCj4g IAlpID0gKGFkZHIgLSByYW5nZS0+c3RhcnQpID4+IFBBR0VfU0hJRlQ7Cj4gIAlucGFnZXMgPSAo ZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAtCXBmbnMgPSAmcmFuZ2UtPnBmbnNbaV07Cj4g LQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZu cywgbnBhZ2VzLCAwKTsKPiArCWhtbV9wZm5zID0gJnJhbmdlLT5obW1fcGZuc1tpXTsKPiArCXJl cXVpcmVkX2ZhdWx0ID0KPiArCQlobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIGht bV9wZm5zLCBucGFnZXMsIDApOwo+ICAJaWYgKCF3YWxrLT52bWEpIHsKPiAgCQlpZiAocmVxdWly ZWRfZmF1bHQpCj4gIAkJCXJldHVybiAtRUZBVUxUOwo+IEBAIC0xNzQsNDQgKzE2Miw0NCBAQCBz dGF0aWMgaW50IGhtbV92bWFfd2Fsa19ob2xlKHVuc2lnbmVkIGxvbmcgYWRkciwgdW5zaWduZWQg bG9uZyBlbmQsCj4gIAl9Cj4gIAlpZiAocmVxdWlyZWRfZmF1bHQpCj4gIAkJcmV0dXJuIGhtbV92 bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7Cj4gLQlyZXR1cm4gaG1t X3BmbnNfZmlsbChhZGRyLCBlbmQsIHJhbmdlLCBITU1fUEZOX05PTkUpOwo+ICsJcmV0dXJuIGht bV9wZm5zX2ZpbGwoYWRkciwgZW5kLCByYW5nZSwgMCk7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxp bmUgdWludDY0X3QgcG1kX3RvX2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2Us IHBtZF90IHBtZCkKPiArc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBtZF90b19obW1fcGZu X2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcG1kX3QgcG1kKQo+ICB7 Cj4gIAlpZiAocG1kX3Byb3Rub25lKHBtZCkpCj4gIAkJcmV0dXJuIDA7Cj4gLQlyZXR1cm4gcG1k X3dyaXRlKHBtZCkgPyByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF0gfAo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fV1JJVEVdIDoKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1ZBTElE XTsKPiArCXJldHVybiBwbWRfd3JpdGUocG1kKSA/IChITU1fUEZOX1ZBTElEIHwgSE1NX1BGTl9X UklURSkgOiBITU1fUEZOX1ZBTElEOwo+ICB9Cj4gIAo+ICAjaWZkZWYgQ09ORklHX1RSQU5TUEFS RU5UX0hVR0VQQUdFCj4gIHN0YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcG1kKHN0cnVjdCBtbV93 YWxrICp3YWxrLCB1bnNpZ25lZCBsb25nIGFkZHIsCj4gLQkJdW5zaWduZWQgbG9uZyBlbmQsIHVp bnQ2NF90ICpwZm5zLCBwbWRfdCBwbWQpCj4gKwkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCB1 bnNpZ25lZCBsb25nIGhtbV9wZm5zW10sCj4gKwkJCSAgICAgIHBtZF90IHBtZCkKPiAgewo+ICAJ c3RydWN0IGhtbV92bWFfd2FsayAqaG1tX3ZtYV93YWxrID0gd2Fsay0+cHJpdmF0ZTsKPiAgCXN0 cnVjdCBobW1fcmFuZ2UgKnJhbmdlID0gaG1tX3ZtYV93YWxrLT5yYW5nZTsKPiAgCXVuc2lnbmVk IGxvbmcgcGZuLCBucGFnZXMsIGk7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4g LQl1aW50NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCj4g IAlucGFnZXMgPSAoZW5kIC0gYWRkcikgPj4gUEFHRV9TSElGVDsKPiAgCWNwdV9mbGFncyA9IHBt ZF90b19obW1fcGZuX2ZsYWdzKHJhbmdlLCBwbWQpOwo+ICAJcmVxdWlyZWRfZmF1bHQgPQo+IC0J CWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2VzLCBjcHVfZmxh Z3MpOwo+ICsJCWhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5w YWdlcywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlyZXR1cm4gaG1t X3ZtYV9mYXVsdChhZGRyLCBlbmQsIHJlcXVpcmVkX2ZhdWx0LCB3YWxrKTsKPiAgCj4gIAlwZm4g PSBwbWRfcGZuKHBtZCkgKyAoKGFkZHIgJiB+UE1EX01BU0spID4+IFBBR0VfU0hJRlQpOwo+ICAJ Zm9yIChpID0gMDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIGkrKywgcGZuKyspCj4g LQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfCBjcHVf ZmxhZ3M7Cj4gKwkJaG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsK PiAgfQo+ICAjZWxzZSAvKiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBBR0UgKi8KPiAgLyogc3R1 YiB0byBhbGxvdyB0aGUgY29kZSBiZWxvdyB0byBjb21waWxlICovCj4gIGludCBobW1fdm1hX2hh bmRsZV9wbWQoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAtCQl1 bnNpZ25lZCBsb25nIGVuZCwgdWludDY0X3QgKnBmbnMsIHBtZF90IHBtZCk7Cj4gKwkJdW5zaWdu ZWQgbG9uZyBlbmQsIHVuc2lnbmVkIGxvbmcgaG1tX3BmbnNbXSwgcG1kX3QgcG1kKTsKPiAgI2Vu ZGlmIC8qIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRSAqLwo+ICAKPiAgc3RhdGljIGlubGlu ZSBib29sIGhtbV9pc19kZXZpY2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5n ZSwKPiBAQCAtMjIyLDMxICsyMTAsMzEgQEAgc3RhdGljIGlubGluZSBib29sIGhtbV9pc19kZXZp Y2VfcHJpdmF0ZV9lbnRyeShzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSwKPiAgCQlyYW5nZS0+ZGV2 X3ByaXZhdGVfb3duZXI7Cj4gIH0KPiAgCj4gLXN0YXRpYyBpbmxpbmUgdWludDY0X3QgcHRlX3Rv X2htbV9wZm5fZmxhZ3Moc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UsIHB0ZV90IHB0ZSkKPiArc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB0ZV90b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1f cmFuZ2UgKnJhbmdlLAo+ICsJCQkJCQkgcHRlX3QgcHRlKQo+ICB7Cj4gIAlpZiAocHRlX25vbmUo cHRlKSB8fCAhcHRlX3ByZXNlbnQocHRlKSB8fCBwdGVfcHJvdG5vbmUocHRlKSkKPiAgCQlyZXR1 cm4gMDsKPiAtCXJldHVybiBwdGVfd3JpdGUocHRlKSA/IHJhbmdlLT5mbGFnc1tITU1fUEZOX1ZB TElEXSB8Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9XUklURV0gOgo+IC0JCQkJcmFuZ2Ut PmZsYWdzW0hNTV9QRk5fVkFMSURdOwo+ICsJcmV0dXJuIHB0ZV93cml0ZShwdGUpID8gKEhNTV9Q Rk5fVkFMSUQgfCBITU1fUEZOX1dSSVRFKSA6IEhNTV9QRk5fVkFMSUQ7Cj4gIH0KPiAgCj4gIHN0 YXRpYyBpbnQgaG1tX3ZtYV9oYW5kbGVfcHRlKHN0cnVjdCBtbV93YWxrICp3YWxrLCB1bnNpZ25l ZCBsb25nIGFkZHIsCj4gIAkJCSAgICAgIHVuc2lnbmVkIGxvbmcgZW5kLCBwbWRfdCAqcG1kcCwg cHRlX3QgKnB0ZXAsCj4gLQkJCSAgICAgIHVpbnQ2NF90ICpwZm4pCj4gKwkJCSAgICAgIHVuc2ln bmVkIGxvbmcgKmhtbV9wZm4pCj4gIHsKPiAgCXN0cnVjdCBobW1fdm1hX3dhbGsgKmhtbV92bWFf d2FsayA9IHdhbGstPnByaXZhdGU7Cj4gIAlzdHJ1Y3QgaG1tX3JhbmdlICpyYW5nZSA9IGhtbV92 bWFfd2Fsay0+cmFuZ2U7Cj4gIAl1bnNpZ25lZCBpbnQgcmVxdWlyZWRfZmF1bHQ7Cj4gLQl1aW50 NjRfdCBjcHVfZmxhZ3M7Cj4gKwl1bnNpZ25lZCBsb25nIGNwdV9mbGFnczsKPiAgCXB0ZV90IHB0 ZSA9ICpwdGVwOwo+IC0JdWludDY0X3Qgb3JpZ19wZm4gPSAqcGZuOwo+ICsJdWludDY0X3QgcGZu X3JlcV9mbGFncyA9ICpobW1fcGZuOwo+ICAKPiAgCWlmIChwdGVfbm9uZShwdGUpKSB7Cj4gLQkJ cmVxdWlyZWRfZmF1bHQgPSBobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3Bm biwgMCk7Cj4gKwkJcmVxdWlyZWRfZmF1bHQgPQo+ICsJCQlobW1fcHRlX25lZWRfZmF1bHQoaG1t X3ZtYV93YWxrLCBwZm5fcmVxX2ZsYWdzLCAwKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1bHQpCj4g IAkJCWdvdG8gZmF1bHQ7Cj4gLQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsK PiArCQkqaG1tX3BmbiA9IDA7Cj4gIAkJcmV0dXJuIDA7Cj4gIAl9Cj4gIAo+IEBAIC0yNTgsMTcg KzI0NiwxOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfaGFuZGxlX3B0ZShzdHJ1Y3QgbW1fd2FsayAq d2FsaywgdW5zaWduZWQgbG9uZyBhZGRyLAo+ICAJCSAqIHRoZSBQRk4gZXZlbiBpZiBub3QgcHJl c2VudC4KPiAgCQkgKi8KPiAgCQlpZiAoaG1tX2lzX2RldmljZV9wcml2YXRlX2VudHJ5KHJhbmdl LCBlbnRyeSkpIHsKPiAtCQkJKnBmbiA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2Us Cj4gLQkJCQlkZXZpY2VfcHJpdmF0ZV9lbnRyeV90b19wZm4oZW50cnkpKTsKPiAtCQkJKnBmbiB8 PSByYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwkJCWNwdV9mbGFncyA9IEhNTV9QRk5f VkFMSUQ7Cj4gIAkJCWlmIChpc193cml0ZV9kZXZpY2VfcHJpdmF0ZV9lbnRyeShlbnRyeSkpCj4g LQkJCQkqcGZuIHw9IHJhbmdlLT5mbGFnc1tITU1fUEZOX1dSSVRFXTsKPiArCQkJCWNwdV9mbGFn cyB8PSBITU1fUEZOX1dSSVRFOwo+ICsJCQkqaG1tX3BmbiA9IGRldmljZV9wcml2YXRlX2VudHJ5 X3RvX3BmbihlbnRyeSkgfAo+ICsJCQkJCWNwdV9mbGFnczsKPiAgCQkJcmV0dXJuIDA7Cj4gIAkJ fQo+ICAKPiAtCQlyZXF1aXJlZF9mYXVsdCA9IGhtbV9wdGVfbmVlZF9mYXVsdChobW1fdm1hX3dh bGssIG9yaWdfcGZuLCAwKTsKPiArCQlyZXF1aXJlZF9mYXVsdCA9Cj4gKwkJCWhtbV9wdGVfbmVl ZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbl9yZXFfZmxhZ3MsIDApOwo+ICAJCWlmICghcmVxdWly ZWRfZmF1bHQpIHsKPiAtCQkJKnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9OT05FXTsKPiAr CQkJKmhtbV9wZm4gPSAwOwo+ICAJCQlyZXR1cm4gMDsKPiAgCQl9Cj4gIAo+IEBAIC0yODgsNyAr Mjc3LDggQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9wdGUoc3RydWN0IG1tX3dhbGsgKndh bGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCX0KPiAgCj4gIAljcHVfZmxhZ3MgPSBwdGVfdG9f aG1tX3Bmbl9mbGFncyhyYW5nZSwgcHRlKTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9u ZWVkX2ZhdWx0KGhtbV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJl ZF9mYXVsdCA9Cj4gKwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9m bGFncywgY3B1X2ZsYWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkKPiAgCQlnb3RvIGZhdWx0 Owo+ICAKPiBAQCAtMjk3LDE1ICsyODcsMTUgQEAgc3RhdGljIGludCBobW1fdm1hX2hhbmRsZV9w dGUoc3RydWN0IG1tX3dhbGsgKndhbGssIHVuc2lnbmVkIGxvbmcgYWRkciwKPiAgCSAqIGZhbGwg dGhyb3VnaCBhbmQgdHJlYXQgaXQgbGlrZSBhIG5vcm1hbCBwYWdlLgo+ICAJICovCj4gIAlpZiAo cHRlX3NwZWNpYWwocHRlKSAmJiAhaXNfemVyb19wZm4ocHRlX3BmbihwdGUpKSkgewo+IC0JCWlm IChobW1fcHRlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBvcmlnX3BmbiwgMCkpIHsKPiArCQlp ZiAoaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgMCkpIHsK PiAgCQkJcHRlX3VubWFwKHB0ZXApOwo+ICAJCQlyZXR1cm4gLUVGQVVMVDsKPiAgCQl9Cj4gLQkJ KnBmbiA9IHJhbmdlLT52YWx1ZXNbSE1NX1BGTl9FUlJPUl07Cj4gKwkJKmhtbV9wZm4gPSBITU1f UEZOX0VSUk9SOwo+ICAJCXJldHVybiAwOwo+ICAJfQo+ICAKPiAtCSpwZm4gPSBobW1fZGV2aWNl X2VudHJ5X2Zyb21fcGZuKHJhbmdlLCBwdGVfcGZuKHB0ZSkpIHwgY3B1X2ZsYWdzOwo+ICsJKmht bV9wZm4gPSBwdGVfcGZuKHB0ZSkgfCBjcHVfZmxhZ3M7Cj4gIAlyZXR1cm4gMDsKPiAgCj4gIGZh dWx0Ogo+IEBAIC0zMjEsNyArMzExLDggQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBt ZF90ICpwbWRwLAo+ICB7Cj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dhbGsgPSB3 YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1hX3dhbGst PnJhbmdlOwo+IC0JdWludDY0X3QgKnBmbnMgPSAmcmFuZ2UtPnBmbnNbKHN0YXJ0IC0gcmFuZ2Ut PnN0YXJ0KSA+PiBQQUdFX1NISUZUXTsKPiArCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zID0KPiAr CQkmcmFuZ2UtPmhtbV9wZm5zWyhzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9TSElGVF07 Cj4gIAl1bnNpZ25lZCBsb25nIG5wYWdlcyA9IChlbmQgLSBzdGFydCkgPj4gUEFHRV9TSElGVDsK PiAgCXVuc2lnbmVkIGxvbmcgYWRkciA9IHN0YXJ0Owo+ICAJcHRlX3QgKnB0ZXA7Cj4gQEAgLTMz MywxNiArMzI0LDE2IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwK PiAgCQlyZXR1cm4gaG1tX3ZtYV93YWxrX2hvbGUoc3RhcnQsIGVuZCwgLTEsIHdhbGspOwo+ICAK PiAgCWlmICh0aHBfbWlncmF0aW9uX3N1cHBvcnRlZCgpICYmIGlzX3BtZF9taWdyYXRpb25fZW50 cnkocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2VfbmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBm bnMsIG5wYWdlcywgMCkpIHsKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93 YWxrLCBobW1fcGZucywgbnBhZ2VzLCAwKSkgewo+ICAJCQlobW1fdm1hX3dhbGstPmxhc3QgPSBh ZGRyOwo+ICAJCQlwbWRfbWlncmF0aW9uX2VudHJ5X3dhaXQod2Fsay0+bW0sIHBtZHApOwo+ICAJ CQlyZXR1cm4gLUVCVVNZOwo+ICAJCX0KPiAtCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFydCwg ZW5kLCByYW5nZSwgSE1NX1BGTl9OT05FKTsKPiArCQlyZXR1cm4gaG1tX3BmbnNfZmlsbChzdGFy dCwgZW5kLCByYW5nZSwgMCk7Cj4gIAl9Cj4gIAo+ICAJaWYgKCFwbWRfcHJlc2VudChwbWQpKSB7 Cj4gLQkJaWYgKGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywgbnBhZ2Vz LCAwKSkKPiArCQlpZiAoaG1tX3JhbmdlX25lZWRfZmF1bHQoaG1tX3ZtYV93YWxrLCBobW1fcGZu cywgbnBhZ2VzLCAwKSkKPiAgCQkJcmV0dXJuIC1FRkFVTFQ7Cj4gIAkJcmV0dXJuIGhtbV9wZm5z X2ZpbGwoc3RhcnQsIGVuZCwgcmFuZ2UsIEhNTV9QRk5fRVJST1IpOwo+ICAJfQo+IEBAIC0zNjIs NyArMzUzLDcgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJ CWlmICghcG1kX2Rldm1hcChwbWQpICYmICFwbWRfdHJhbnNfaHVnZShwbWQpKQo+ICAJCQlnb3Rv IGFnYWluOwo+ICAKPiAtCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIsIGVu ZCwgcGZucywgcG1kKTsKPiArCQlyZXR1cm4gaG1tX3ZtYV9oYW5kbGVfcG1kKHdhbGssIGFkZHIs IGVuZCwgaG1tX3BmbnMsIHBtZCk7Cj4gIAl9Cj4gIAo+ICAJLyoKPiBAQCAtMzcyLDE2ICszNjMs MTYgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcG1kKHBtZF90ICpwbWRwLAo+ICAJICogcmVj b3Zlci4KPiAgCSAqLwo+ICAJaWYgKHBtZF9iYWQocG1kKSkgewo+IC0JCWlmIChobW1fcmFuZ2Vf bmVlZF9mYXVsdChobW1fdm1hX3dhbGssIHBmbnMsIG5wYWdlcywgMCkpCj4gKwkJaWYgKGhtbV9y YW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMsIG5wYWdlcywgMCkpCj4gIAkJ CXJldHVybiAtRUZBVUxUOwo+ICAJCXJldHVybiBobW1fcGZuc19maWxsKHN0YXJ0LCBlbmQsIHJh bmdlLCBITU1fUEZOX0VSUk9SKTsKPiAgCX0KPiAgCj4gIAlwdGVwID0gcHRlX29mZnNldF9tYXAo cG1kcCwgYWRkcik7Cj4gLQlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUsIHB0 ZXArKywgcGZucysrKSB7Cj4gKwlmb3IgKDsgYWRkciA8IGVuZDsgYWRkciArPSBQQUdFX1NJWkUs IHB0ZXArKywgaG1tX3BmbnMrKykgewo+ICAJCWludCByOwo+ICAKPiAtCQlyID0gaG1tX3ZtYV9o YW5kbGVfcHRlKHdhbGssIGFkZHIsIGVuZCwgcG1kcCwgcHRlcCwgcGZucyk7Cj4gKwkJciA9IGht bV92bWFfaGFuZGxlX3B0ZSh3YWxrLCBhZGRyLCBlbmQsIHBtZHAsIHB0ZXAsIGhtbV9wZm5zKTsK PiAgCQlpZiAocikgewo+ICAJCQkvKiBobW1fdm1hX2hhbmRsZV9wdGUoKSBkaWQgcHRlX3VubWFw KCkgKi8KPiAgCQkJcmV0dXJuIHI7Cj4gQEAgLTM5MywxMyArMzg0LDEyIEBAIHN0YXRpYyBpbnQg aG1tX3ZtYV93YWxrX3BtZChwbWRfdCAqcG1kcCwKPiAgCj4gICNpZiBkZWZpbmVkKENPTkZJR19B UkNIX0hBU19QVEVfREVWTUFQKSAmJiBcCj4gICAgICBkZWZpbmVkKENPTkZJR19IQVZFX0FSQ0hf VFJBTlNQQVJFTlRfSFVHRVBBR0VfUFVEKQo+IC1zdGF0aWMgaW5saW5lIHVpbnQ2NF90IHB1ZF90 b19obW1fcGZuX2ZsYWdzKHN0cnVjdCBobW1fcmFuZ2UgKnJhbmdlLCBwdWRfdCBwdWQpCj4gK3N0 YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwdWRfdG9faG1tX3Bmbl9mbGFncyhzdHJ1Y3QgaG1t X3JhbmdlICpyYW5nZSwKPiArCQkJCQkJIHB1ZF90IHB1ZCkKPiAgewo+ICAJaWYgKCFwdWRfcHJl c2VudChwdWQpKQo+ICAJCXJldHVybiAwOwo+IC0JcmV0dXJuIHB1ZF93cml0ZShwdWQpID8gcmFu Z2UtPmZsYWdzW0hNTV9QRk5fVkFMSURdIHwKPiAtCQkJCXJhbmdlLT5mbGFnc1tITU1fUEZOX1dS SVRFXSA6Cj4gLQkJCQlyYW5nZS0+ZmxhZ3NbSE1NX1BGTl9WQUxJRF07Cj4gKwlyZXR1cm4gcHVk X3dyaXRlKHB1ZCkgPyAoSE1NX1BGTl9WQUxJRCB8IEhNTV9QRk5fV1JJVEUpIDogSE1NX1BGTl9W QUxJRDsKPiAgfQo+ICAKPiAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfcHVkKHB1ZF90ICpwdWRw LCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwKPiBAQCAtNDI3LDcgKzQx Nyw4IEBAIHN0YXRpYyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQg bG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCj4gIAlpZiAocHVkX2h1Z2UocHVkKSAmJiBw dWRfZGV2bWFwKHB1ZCkpIHsKPiAgCQl1bnNpZ25lZCBsb25nIGksIG5wYWdlcywgcGZuOwo+ICAJ CXVuc2lnbmVkIGludCByZXF1aXJlZF9mYXVsdDsKPiAtCQl1aW50NjRfdCAqcGZucywgY3B1X2Zs YWdzOwo+ICsJCXVuc2lnbmVkIGxvbmcgKmhtbV9wZm5zOwo+ICsJCXVuc2lnbmVkIGxvbmcgY3B1 X2ZsYWdzOwo+ICAKPiAgCQlpZiAoIXB1ZF9wcmVzZW50KHB1ZCkpIHsKPiAgCQkJc3Bpbl91bmxv Y2socHRsKTsKPiBAQCAtNDM2LDEwICs0MjcsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtf cHVkKHB1ZF90ICpwdWRwLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCwK PiAgCj4gIAkJaSA9IChhZGRyIC0gcmFuZ2UtPnN0YXJ0KSA+PiBQQUdFX1NISUZUOwo+ICAJCW5w YWdlcyA9IChlbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUOwo+IC0JCXBmbnMgPSAmcmFuZ2UtPnBm bnNbaV07Cj4gKwkJaG1tX3BmbnMgPSAmcmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAKPiAgCQljcHVf ZmxhZ3MgPSBwdWRfdG9faG1tX3Bmbl9mbGFncyhyYW5nZSwgcHVkKTsKPiAtCQlyZXF1aXJlZF9m YXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZucywKPiArCQlyZXF1 aXJlZF9mYXVsdCA9IGhtbV9yYW5nZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgaG1tX3BmbnMs Cj4gIAkJCQkJCSAgICAgIG5wYWdlcywgY3B1X2ZsYWdzKTsKPiAgCQlpZiAocmVxdWlyZWRfZmF1 bHQpIHsKPiAgCQkJc3Bpbl91bmxvY2socHRsKTsKPiBAQCAtNDQ4LDggKzQzOSw3IEBAIHN0YXRp YyBpbnQgaG1tX3ZtYV93YWxrX3B1ZChwdWRfdCAqcHVkcCwgdW5zaWduZWQgbG9uZyBzdGFydCwg dW5zaWduZWQgbG9uZyBlbmQsCj4gIAo+ICAJCXBmbiA9IHB1ZF9wZm4ocHVkKSArICgoYWRkciAm IH5QVURfTUFTSykgPj4gUEFHRV9TSElGVCk7Cj4gIAkJZm9yIChpID0gMDsgaSA8IG5wYWdlczsg KytpLCArK3BmbikKPiAtCQkJcGZuc1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFu Z2UsIHBmbikgfAo+IC0JCQkJICBjcHVfZmxhZ3M7Cj4gKwkJCWhtbV9wZm5zW2ldID0gcGZuIHwg Y3B1X2ZsYWdzOwo+ICAJCWdvdG8gb3V0X3VubG9jazsKPiAgCX0KPiAgCj4gQEAgLTQ3Myw4ICs0 NjMsOSBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2VudHJ5KHB0ZV90ICpwdGUs IHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAlzdHJ1Y3QgaG1tX3ZtYV93YWxrICpobW1fdm1hX3dh bGsgPSB3YWxrLT5wcml2YXRlOwo+ICAJc3RydWN0IGhtbV9yYW5nZSAqcmFuZ2UgPSBobW1fdm1h X3dhbGstPnJhbmdlOwo+ICAJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSB3YWxrLT52bWE7 Cj4gLQl1aW50NjRfdCBvcmlnX3BmbiwgY3B1X2ZsYWdzOwo+ICAJdW5zaWduZWQgaW50IHJlcXVp cmVkX2ZhdWx0Owo+ICsJdW5zaWduZWQgbG9uZyBwZm5fcmVxX2ZsYWdzOwo+ICsJdW5zaWduZWQg bG9uZyBjcHVfZmxhZ3M7Cj4gIAlzcGlubG9ja190ICpwdGw7Cj4gIAlwdGVfdCBlbnRyeTsKPiAg Cj4gQEAgLTQ4Miw5ICs0NzMsMTAgQEAgc3RhdGljIGludCBobW1fdm1hX3dhbGtfaHVnZXRsYl9l bnRyeShwdGVfdCAqcHRlLCB1bnNpZ25lZCBsb25nIGhtYXNrLAo+ICAJZW50cnkgPSBodWdlX3B0 ZXBfZ2V0KHB0ZSk7Cj4gIAo+ICAJaSA9IChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFHRV9T SElGVDsKPiAtCW9yaWdfcGZuID0gcmFuZ2UtPnBmbnNbaV07Cj4gKwlwZm5fcmVxX2ZsYWdzID0g cmFuZ2UtPmhtbV9wZm5zW2ldOwo+ICAJY3B1X2ZsYWdzID0gcHRlX3RvX2htbV9wZm5fZmxhZ3Mo cmFuZ2UsIGVudHJ5KTsKPiAtCXJlcXVpcmVkX2ZhdWx0ID0gaG1tX3B0ZV9uZWVkX2ZhdWx0KGht bV92bWFfd2Fsaywgb3JpZ19wZm4sIGNwdV9mbGFncyk7Cj4gKwlyZXF1aXJlZF9mYXVsdCA9Cj4g KwkJaG1tX3B0ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywgcGZuX3JlcV9mbGFncywgY3B1X2Zs YWdzKTsKPiAgCWlmIChyZXF1aXJlZF9mYXVsdCkgewo+ICAJCXNwaW5fdW5sb2NrKHB0bCk7Cj4g IAkJcmV0dXJuIGhtbV92bWFfZmF1bHQoYWRkciwgZW5kLCByZXF1aXJlZF9mYXVsdCwgd2Fsayk7 Cj4gQEAgLTQ5Miw4ICs0ODQsOCBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa19odWdldGxiX2Vu dHJ5KHB0ZV90ICpwdGUsIHVuc2lnbmVkIGxvbmcgaG1hc2ssCj4gIAo+ICAJcGZuID0gcHRlX3Bm bihlbnRyeSkgKyAoKHN0YXJ0ICYgfmhtYXNrKSA+PiBQQUdFX1NISUZUKTsKPiAgCWZvciAoOyBh ZGRyIDwgZW5kOyBhZGRyICs9IFBBR0VfU0laRSwgaSsrLCBwZm4rKykKPiAtCQlyYW5nZS0+cGZu c1tpXSA9IGhtbV9kZXZpY2VfZW50cnlfZnJvbV9wZm4ocmFuZ2UsIHBmbikgfAo+IC0JCQkJIGNw dV9mbGFnczsKPiArCQlyYW5nZS0+aG1tX3BmbnNbaV0gPSBwZm4gfCBjcHVfZmxhZ3M7Cj4gKwo+ ICAJc3Bpbl91bmxvY2socHRsKTsKPiAgCXJldHVybiAwOwo+ICB9Cj4gQEAgLTUyNCw3ICs1MTYs NyBAQCBzdGF0aWMgaW50IGhtbV92bWFfd2Fsa190ZXN0KHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVu c2lnbmVkIGxvbmcgZW5kLAo+ICAJICogZmFpbHVyZS4KPiAgCSAqLwo+ICAJaWYgKGhtbV9yYW5n ZV9uZWVkX2ZhdWx0KGhtbV92bWFfd2FsaywKPiAtCQkJCSByYW5nZS0+cGZucyArCj4gKwkJCQkg cmFuZ2UtPmhtbV9wZm5zICsKPiAgCQkJCQkgKChzdGFydCAtIHJhbmdlLT5zdGFydCkgPj4gUEFH RV9TSElGVCksCj4gIAkJCQkgKGVuZCAtIHN0YXJ0KSA+PiBQQUdFX1NISUZULCAwKSkKPiAgCQly ZXR1cm4gLUVGQVVMVDsKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KYW1kLWdmeCBtYWlsaW5nIGxpc3QKYW1kLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbWQtZ2Z4Cg==