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=-6.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 D0390C433E0 for ; Wed, 13 May 2020 19:33:11 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 6D26D206A5 for ; Wed, 13 May 2020 19:33:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=ffwll.ch header.i=@ffwll.ch header.b="g120dPF2" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390680AbgEMTdL (ORCPT ); Wed, 13 May 2020 15:33:11 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55782 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S2389808AbgEMTdK (ORCPT ); Wed, 13 May 2020 15:33:10 -0400 Received: from mail-oi1-x244.google.com (mail-oi1-x244.google.com [IPv6:2607:f8b0:4864:20::244]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2DCFDC061A0C for ; Wed, 13 May 2020 12:33:10 -0700 (PDT) Received: by mail-oi1-x244.google.com with SMTP id j145so646801oib.5 for ; Wed, 13 May 2020 12:33:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=otXn7LersPgzIHI8cE7ZG+3L14O0eRmhgr2LFA57fHo=; b=g120dPF25WK/Xgfg3CfUd/yhFNPVZtBN18rNtZuiuv9z0ANGcbojbHdrDGIu1s8Wcr J8Jaf/9u4w9dwb5odTlC55Xaw+0klqYTokujtJGRXKeGi0XAugCJ8FjVzaxARCYOgB0F 373yW3rkEF1MSg61eaGougrD+qQCuq+1YunUU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=otXn7LersPgzIHI8cE7ZG+3L14O0eRmhgr2LFA57fHo=; b=joMH/TgLdcuTacFwUw+4t6hCm55ADv3aYXHNT6U8PCmYBjWTpk8h6uV81XV2ne24RW CH5yJrLCaLBVXZvN09pRj6vVigyBxlRuGgYFkZe5gQc0h/H++MjNKnhpo/fsY1DX6TrJ ybvcYDVzrpR0i5CRXrLXKJNuDHkeJQd6iIO6LF5QVr4slqRYgEvx7VAfVPWiyLap4NIe l9BJmcWzO4C0syMv9/q3a6oGERzXecWVYgF/Slq40YUSDRNlx4t2xiA4/uINVviGdIA6 7wQ4kns61qp6nFqfwvU/cbelehW5m7i4V7U+Picr8Xko7aB2u8bElx6Ot2Beq23E3B4g 4MWA== X-Gm-Message-State: AOAM531n/Z60l+PpOIoSfdBq8du7wEl03pJy6HtdjlrSUVUnZGYX7GYT LdOFjhAYXmmXQcnb7HVQ/XwzkEQVzP9KHJ9r303VTw== X-Google-Smtp-Source: ABdhPJxgXhDAIqKBPUxe20uIEycL/zvBggdp53MMPs/53w6SKv8jA4HdFXEazXoztR3T+rGUxFKr2L+d4tEeQzC9SQM= X-Received: by 2002:aca:fd14:: with SMTP id b20mr3627430oii.14.1589398389482; Wed, 13 May 2020 12:33:09 -0700 (PDT) MIME-Version: 1.0 References: <20200513114130.28641-1-wambui.karugax@gmail.com> <20200513114130.28641-2-wambui.karugax@gmail.com> <47bbbb51-7e53-7c87-6058-5848f9ccecfe@suse.de> In-Reply-To: From: Daniel Vetter Date: Wed, 13 May 2020 21:32:57 +0200 Message-ID: Subject: Re: [RFC PATCH 1/3] drm/debugfs: create debugfs files during drm_dev_register(). To: Wambui Karuga Cc: Thomas Zimmermann , Maarten Lankhorst , Maxime Ripard , Dave Airlie , dri-devel , Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, May 13, 2020 at 8:12 PM Wambui Karuga wr= ote: > > > > On Wed, 13 May 2020, Thomas Zimmermann wrote: > > > Hi > > > > Am 13.05.20 um 13:41 schrieb Wambui Karuga: > >> Introduce the ability to track requests for the addition of drm debugf= s > >> files at any time and have them added all at once during > >> drm_dev_register(). > >> > >> Drivers can add drm debugfs file requests to a new list tied to drm_de= vice. > >> During drm_dev_register(), the new function drm_debugfs_create_file() > >> will iterate over the list of added files on a given minor to create > >> them. > >> > >> Two new structs are introduced in this change: struct drm_simple_info > >> which represents a drm debugfs file entry and struct > >> drm_simple_info_entry which is used to track file requests and is the > >> main parameter of choice passed by functions. Each drm_simple_info_ent= ry is > >> added to the new struct drm_device->debugfs_list for file requests. > >> > >> Signed-off-by: Wambui Karuga > >> --- > >> drivers/gpu/drm/drm_debugfs.c | 59 ++++++++++++++++++++++++++++++++--= - > >> drivers/gpu/drm/drm_drv.c | 2 ++ > >> include/drm/drm_debugfs.h | 38 ++++++++++++++++++++++ > >> include/drm/drm_device.h | 12 +++++++ > >> 4 files changed, 107 insertions(+), 4 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/drm_debugfs.c b/drivers/gpu/drm/drm_debug= fs.c > >> index 2bea22130703..03b0588ede68 100644 > >> --- a/drivers/gpu/drm/drm_debugfs.c > >> +++ b/drivers/gpu/drm/drm_debugfs.c > >> @@ -145,9 +145,10 @@ static const struct drm_info_list drm_debugfs_lis= t[] =3D { > >> > >> static int drm_debugfs_open(struct inode *inode, struct file *file) > >> { > >> - struct drm_info_node *node =3D inode->i_private; > >> + struct drm_simple_info_entry *entry =3D inode->i_private; > >> + struct drm_simple_info *node =3D &entry->file; > >> > >> - return single_open(file, node->info_ent->show, node); > >> + return single_open(file, node->show_fn, entry); > >> } > >> > >> > >> @@ -159,6 +160,25 @@ static const struct file_operations drm_debugfs_f= ops =3D { > >> .release =3D single_release, > >> }; > >> > >> +/** > >> + * drm_debugfs_create_file - create DRM debugfs file. > >> + * @dev: drm_device that the file belongs to > >> + * > >> + * Create a DRM debugfs file from the list of files to be created > >> + * from dev->debugfs_list. > >> + */ > >> +static void drm_debugfs_create_file(struct drm_minor *minor) > > > > This function creates several files. I'd rather call it > > drm_debugfs_create_added_files(). > > > Okay, that makes sense. I can change that. > > >> +{ > >> + struct drm_device *dev =3D minor->dev; > >> + struct drm_simple_info_entry *entry; > >> + > >> + list_for_each_entry(entry, &dev->debugfs_list, list) { > >> + debugfs_create_file(entry->file.name, > >> + S_IFREG | S_IRUGO, minor->debugfs_roo= t, > >> + entry, > >> + &drm_debugfs_fops); > >> + } > > > > I think the created items should be removed from the list. That way, > > drivers can call the function multiple times without recreating the sam= e > > files again. > > > Hadn't thought of that - I can try add that. The function here is static, called once by the core. So no need for complicated logic, it's guaranteed to only be called once. I guess what confused Thomas is the kerneldoc. We generally only do that for functions exported to drivers, that drivers should call. Not the case here. The function name itself is descriptive enough I think (with Thomas' suggestion even better). So I'd just remove the kerneldoc here. -Daniel > >> +} > >> > >> /** > >> * drm_debugfs_create_files - Initialize a given set of debugfs files= for DRM > >> @@ -213,8 +233,7 @@ int drm_debugfs_init(struct drm_minor *minor, int = minor_id, > >> sprintf(name, "%d", minor_id); > >> minor->debugfs_root =3D debugfs_create_dir(name, root); > >> > >> - drm_debugfs_create_files(drm_debugfs_list, DRM_DEBUGFS_ENTRIES, > >> - minor->debugfs_root, minor); > > > > By removing these two lines, aren't you losing the files listed in > > DRM_DEBUGFS_ENTRIES? > > > Yes. > When using the new functions, drm_debugfs_create_files() should not > be called at this point, but for compatibility these two lines should > be put back, I think. > > >> + drm_debugfs_create_file(minor); > >> > >> if (drm_drv_uses_atomic_modeset(dev)) { > >> drm_atomic_debugfs_init(minor); > >> @@ -449,4 +468,36 @@ void drm_debugfs_crtc_remove(struct drm_crtc *crt= c) > >> crtc->debugfs_entry =3D NULL; > >> } > >> > >> +void drm_debugfs_add_file(struct drm_device *dev, const char *name, > >> + drm_simple_show_t show_fn, void *data) > >> +{ > >> + struct drm_simple_info_entry *entry =3D > >> + kzalloc(sizeof(*entry), GFP_KERNEL); > >> + > >> + if (!entry) > >> + return; > >> + > >> + entry->file.name =3D name; > >> + entry->file.show_fn =3D show_fn; > >> + entry->file.data =3D data; > >> + entry->dev =3D dev; > >> + > >> + mutex_lock(&dev->debugfs_mutex); > >> + list_add(&entry->list, &dev->debugfs_list); > >> + mutex_unlock(&dev->debugfs_mutex); > >> +} > >> +EXPORT_SYMBOL(drm_debugfs_add_file); > >> + > >> +void drm_debugfs_add_files(struct drm_device *dev, > >> + const struct drm_simple_info *files, int count= ) > >> +{ > >> + int i; > >> + > >> + for (i =3D 0; i < count; i++) { > >> + drm_debugfs_add_file(dev, files[i].name, files[i].show_fn= , > >> + files[i].data); > >> + } > >> +} > >> +EXPORT_SYMBOL(drm_debugfs_add_files); > >> + > >> #endif /* CONFIG_DEBUG_FS */ > >> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c > >> index bc38322f306e..c68df4e31aa0 100644 > >> --- a/drivers/gpu/drm/drm_drv.c > >> +++ b/drivers/gpu/drm/drm_drv.c > >> @@ -646,12 +646,14 @@ int drm_dev_init(struct drm_device *dev, > >> INIT_LIST_HEAD(&dev->filelist_internal); > >> INIT_LIST_HEAD(&dev->clientlist); > >> INIT_LIST_HEAD(&dev->vblank_event_list); > >> + INIT_LIST_HEAD(&dev->debugfs_list); > >> > >> spin_lock_init(&dev->event_lock); > >> mutex_init(&dev->struct_mutex); > >> mutex_init(&dev->filelist_mutex); > >> mutex_init(&dev->clientlist_mutex); > >> mutex_init(&dev->master_mutex); > >> + mutex_init(&dev->debugfs_mutex); > >> > >> ret =3D drmm_add_action(dev, drm_dev_init_release, NULL); > >> if (ret) > >> diff --git a/include/drm/drm_debugfs.h b/include/drm/drm_debugfs.h > >> index 2188dc83957f..bbce580c3b38 100644 > >> --- a/include/drm/drm_debugfs.h > >> +++ b/include/drm/drm_debugfs.h > >> @@ -34,6 +34,44 @@ > >> > >> #include > >> #include > >> + > >> +struct drm_device; > >> + > >> +typedef int (*drm_simple_show_t)(struct seq_file *, void *); > >> + > >> +/** > >> + * struct drm_simple_info - debugfs file entry > >> + * > >> + * This struct represents a debugfs file to be created. > >> + */ > >> +struct drm_simple_info { > > > > drm_simple_info and drm_simple_info_entry seem to be misnomers. They > > should probably have some reference to debugfs in their name. > > > I'll change the names. > > Thanks, > wambui karuga > > Best regards > > Thomas > > > > > >> + const char *name; > >> + drm_simple_show_t show_fn; > >> + u32 driver_features; > >> + void *data; > >> +}; > >> + > >> +/** > >> + * struct drm_simple_info_entry - debugfs list entry > >> + * > >> + * This struct is used in tracking requests for new debugfs files > >> + * to be created. > >> + */ > >> +struct drm_simple_info_entry { > >> + struct drm_device *dev; > >> + struct drm_simple_info file; > >> + struct list_head list; > >> +}; > >> + > >> +void drm_debugfs_add_file(struct drm_device *dev, > >> + const char *name, > >> + drm_simple_show_t show_fn, > >> + void *data); > >> + > >> +void drm_debugfs_add_files(struct drm_device *dev, > >> + const struct drm_simple_info *files, > >> + int count); > >> + > >> /** > >> * struct drm_info_list - debugfs info list entry > >> * > >> diff --git a/include/drm/drm_device.h b/include/drm/drm_device.h > >> index a55874db9dd4..b84dfdac27b7 100644 > >> --- a/include/drm/drm_device.h > >> +++ b/include/drm/drm_device.h > >> @@ -326,6 +326,18 @@ struct drm_device { > >> */ > >> struct drm_fb_helper *fb_helper; > >> > >> + /** > >> + * @debugfs_mutex: > >> + * Protects debugfs_list access. > >> + */ > >> + struct mutex debugfs_mutex; > >> + > >> + /** @debugfs_list: > >> + * List of debugfs files to add. > >> + * Files are added during drm_dev_register(). > >> + */ > >> + struct list_head debugfs_list; > >> + > >> /* Everything below here is for legacy driver, never use! */ > >> /* private: */ > >> #if IS_ENABLED(CONFIG_DRM_LEGACY) > >> > > > > -- > > Thomas Zimmermann > > Graphics Driver Developer > > SUSE Software Solutions Germany GmbH > > Maxfeldstr. 5, 90409 N=C3=BCrnberg, Germany > > (HRB 36809, AG N=C3=BCrnberg) > > Gesch=C3=A4ftsf=C3=BChrer: Felix Imend=C3=B6rffer > > > > --=20 Daniel Vetter Software Engineer, Intel Corporation +41 (0) 79 365 57 48 - http://blog.ffwll.ch 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=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED 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 EC7ADC433DF for ; Wed, 13 May 2020 19:33:11 +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 8F1D1206F5 for ; Wed, 13 May 2020 19:33:12 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=ffwll.ch header.i=@ffwll.ch header.b="g120dPF2" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8F1D1206F5 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ffwll.ch 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 181E06E283; Wed, 13 May 2020 19:33:11 +0000 (UTC) Received: from mail-oi1-x241.google.com (mail-oi1-x241.google.com [IPv6:2607:f8b0:4864:20::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 76FE86E283 for ; Wed, 13 May 2020 19:33:10 +0000 (UTC) Received: by mail-oi1-x241.google.com with SMTP id c12so21472159oic.1 for ; Wed, 13 May 2020 12:33:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:content-transfer-encoding; bh=otXn7LersPgzIHI8cE7ZG+3L14O0eRmhgr2LFA57fHo=; b=g120dPF25WK/Xgfg3CfUd/yhFNPVZtBN18rNtZuiuv9z0ANGcbojbHdrDGIu1s8Wcr J8Jaf/9u4w9dwb5odTlC55Xaw+0klqYTokujtJGRXKeGi0XAugCJ8FjVzaxARCYOgB0F 373yW3rkEF1MSg61eaGougrD+qQCuq+1YunUU= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=otXn7LersPgzIHI8cE7ZG+3L14O0eRmhgr2LFA57fHo=; b=A+pBo4JVyV+ORAHCEL07kuiCcZvzBtUVaMnH5e5fBj6+YD60FTxv7xKYEkvVgL3Q+X xtkL2Qg9xHH9iQk4iu4DUBEXTF7ULUjC5M3468SyiVuI/tKJydK5REr2pclhxXiNETpz psosCsXzpOh7mU6MAE7F7XGMTOtLU3wZr3VSryxi1EQi0bK5WuGFTOSt4S5mO79Gtkbe LmUZCdIFoor4jkhxSnv9F99APdZOHdSwpydwS6AIpK/+UasVCcLmuPuh4sQcy2LNu9WI 98lPJ1e3ZJkDMji5tTktfmcClVlnlYLKmsVMlY//ROGSNjpeTPIUAh9hgW+9v8r9fH9H 82Sw== X-Gm-Message-State: AOAM533aTxEr+OaLm4o4napuWpTO13dRU6e69RpGO2KFDUGJannXweyV KEX2Iq+iFVm77VgJNrQTXc9mJ/cLt0q/O3ZJK50Pag== X-Google-Smtp-Source: ABdhPJxgXhDAIqKBPUxe20uIEycL/zvBggdp53MMPs/53w6SKv8jA4HdFXEazXoztR3T+rGUxFKr2L+d4tEeQzC9SQM= X-Received: by 2002:aca:fd14:: with SMTP id b20mr3627430oii.14.1589398389482; Wed, 13 May 2020 12:33:09 -0700 (PDT) MIME-Version: 1.0 References: <20200513114130.28641-1-wambui.karugax@gmail.com> <20200513114130.28641-2-wambui.karugax@gmail.com> <47bbbb51-7e53-7c87-6058-5848f9ccecfe@suse.de> In-Reply-To: From: Daniel Vetter Date: Wed, 13 May 2020 21:32:57 +0200 Message-ID: Subject: Re: [RFC PATCH 1/3] drm/debugfs: create debugfs files during drm_dev_register(). To: Wambui Karuga 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: Dave Airlie , Linux Kernel Mailing List , dri-devel , Thomas Zimmermann Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gV2VkLCBNYXkgMTMsIDIwMjAgYXQgODoxMiBQTSBXYW1idWkgS2FydWdhIDx3YW1idWkua2Fy dWdheEBnbWFpbC5jb20+IHdyb3RlOgo+Cj4KPgo+IE9uIFdlZCwgMTMgTWF5IDIwMjAsIFRob21h cyBaaW1tZXJtYW5uIHdyb3RlOgo+Cj4gPiBIaQo+ID4KPiA+IEFtIDEzLjA1LjIwIHVtIDEzOjQx IHNjaHJpZWIgV2FtYnVpIEthcnVnYToKPiA+PiBJbnRyb2R1Y2UgdGhlIGFiaWxpdHkgdG8gdHJh Y2sgcmVxdWVzdHMgZm9yIHRoZSBhZGRpdGlvbiBvZiBkcm0gZGVidWdmcwo+ID4+IGZpbGVzIGF0 IGFueSB0aW1lIGFuZCBoYXZlIHRoZW0gYWRkZWQgYWxsIGF0IG9uY2UgZHVyaW5nCj4gPj4gZHJt X2Rldl9yZWdpc3RlcigpLgo+ID4+Cj4gPj4gRHJpdmVycyBjYW4gYWRkIGRybSBkZWJ1Z2ZzIGZp bGUgcmVxdWVzdHMgdG8gYSBuZXcgbGlzdCB0aWVkIHRvIGRybV9kZXZpY2UuCj4gPj4gRHVyaW5n IGRybV9kZXZfcmVnaXN0ZXIoKSwgdGhlIG5ldyBmdW5jdGlvbiBkcm1fZGVidWdmc19jcmVhdGVf ZmlsZSgpCj4gPj4gd2lsbCBpdGVyYXRlIG92ZXIgdGhlIGxpc3Qgb2YgYWRkZWQgZmlsZXMgb24g YSBnaXZlbiBtaW5vciB0byBjcmVhdGUKPiA+PiB0aGVtLgo+ID4+Cj4gPj4gVHdvIG5ldyBzdHJ1 Y3RzIGFyZSBpbnRyb2R1Y2VkIGluIHRoaXMgY2hhbmdlOiBzdHJ1Y3QgZHJtX3NpbXBsZV9pbmZv Cj4gPj4gd2hpY2ggcmVwcmVzZW50cyBhIGRybSBkZWJ1Z2ZzIGZpbGUgZW50cnkgYW5kIHN0cnVj dAo+ID4+IGRybV9zaW1wbGVfaW5mb19lbnRyeSB3aGljaCBpcyB1c2VkIHRvIHRyYWNrIGZpbGUg cmVxdWVzdHMgYW5kIGlzIHRoZQo+ID4+IG1haW4gcGFyYW1ldGVyIG9mIGNob2ljZSBwYXNzZWQg YnkgZnVuY3Rpb25zLiBFYWNoIGRybV9zaW1wbGVfaW5mb19lbnRyeSBpcwo+ID4+IGFkZGVkIHRv IHRoZSBuZXcgc3RydWN0IGRybV9kZXZpY2UtPmRlYnVnZnNfbGlzdCBmb3IgZmlsZSByZXF1ZXN0 cy4KPiA+Pgo+ID4+IFNpZ25lZC1vZmYtYnk6IFdhbWJ1aSBLYXJ1Z2EgPHdhbWJ1aS5rYXJ1Z2F4 QGdtYWlsLmNvbT4KPiA+PiAtLS0KPiA+PiAgZHJpdmVycy9ncHUvZHJtL2RybV9kZWJ1Z2ZzLmMg fCA1OSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLQo+ID4+ICBkcml2ZXJzL2dw dS9kcm0vZHJtX2Rydi5jICAgICB8ICAyICsrCj4gPj4gIGluY2x1ZGUvZHJtL2RybV9kZWJ1Z2Zz LmggICAgIHwgMzggKysrKysrKysrKysrKysrKysrKysrKwo+ID4+ICBpbmNsdWRlL2RybS9kcm1f ZGV2aWNlLmggICAgICB8IDEyICsrKysrKysKPiA+PiAgNCBmaWxlcyBjaGFuZ2VkLCAxMDcgaW5z ZXJ0aW9ucygrKSwgNCBkZWxldGlvbnMoLSkKPiA+Pgo+ID4+IGRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vZHJtX2RlYnVnZnMuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZGVidWdmcy5jCj4g Pj4gaW5kZXggMmJlYTIyMTMwNzAzLi4wM2IwNTg4ZWRlNjggMTAwNjQ0Cj4gPj4gLS0tIGEvZHJp dmVycy9ncHUvZHJtL2RybV9kZWJ1Z2ZzLmMKPiA+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJt X2RlYnVnZnMuYwo+ID4+IEBAIC0xNDUsOSArMTQ1LDEwIEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3Qg ZHJtX2luZm9fbGlzdCBkcm1fZGVidWdmc19saXN0W10gPSB7Cj4gPj4KPiA+PiAgc3RhdGljIGlu dCBkcm1fZGVidWdmc19vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxl KQo+ID4+ICB7Cj4gPj4gLSAgICBzdHJ1Y3QgZHJtX2luZm9fbm9kZSAqbm9kZSA9IGlub2RlLT5p X3ByaXZhdGU7Cj4gPj4gKyAgICBzdHJ1Y3QgZHJtX3NpbXBsZV9pbmZvX2VudHJ5ICplbnRyeSA9 IGlub2RlLT5pX3ByaXZhdGU7Cj4gPj4gKyAgICBzdHJ1Y3QgZHJtX3NpbXBsZV9pbmZvICpub2Rl ID0gJmVudHJ5LT5maWxlOwo+ID4+Cj4gPj4gLSAgICByZXR1cm4gc2luZ2xlX29wZW4oZmlsZSwg bm9kZS0+aW5mb19lbnQtPnNob3csIG5vZGUpOwo+ID4+ICsgICAgcmV0dXJuIHNpbmdsZV9vcGVu KGZpbGUsIG5vZGUtPnNob3dfZm4sIGVudHJ5KTsKPiA+PiAgfQo+ID4+Cj4gPj4KPiA+PiBAQCAt MTU5LDYgKzE2MCwyNSBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBkcm1f ZGVidWdmc19mb3BzID0gewo+ID4+ICAgICAgLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKPiA+ PiAgfTsKPiA+Pgo+ID4+ICsvKioKPiA+PiArICogZHJtX2RlYnVnZnNfY3JlYXRlX2ZpbGUgLSBj cmVhdGUgRFJNIGRlYnVnZnMgZmlsZS4KPiA+PiArICogQGRldjogZHJtX2RldmljZSB0aGF0IHRo ZSBmaWxlIGJlbG9uZ3MgdG8KPiA+PiArICoKPiA+PiArICogQ3JlYXRlIGEgRFJNIGRlYnVnZnMg ZmlsZSBmcm9tIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGJlIGNyZWF0ZWQKPiA+PiArICogZnJvbSBk ZXYtPmRlYnVnZnNfbGlzdC4KPiA+PiArICovCj4gPj4gK3N0YXRpYyB2b2lkIGRybV9kZWJ1Z2Zz X2NyZWF0ZV9maWxlKHN0cnVjdCBkcm1fbWlub3IgKm1pbm9yKQo+ID4KPiA+IFRoaXMgZnVuY3Rp b24gY3JlYXRlcyBzZXZlcmFsIGZpbGVzLiBJJ2QgcmF0aGVyIGNhbGwgaXQKPiA+IGRybV9kZWJ1 Z2ZzX2NyZWF0ZV9hZGRlZF9maWxlcygpLgo+ID4KPiBPa2F5LCB0aGF0IG1ha2VzIHNlbnNlLiBJ IGNhbiBjaGFuZ2UgdGhhdC4KPgo+ID4+ICt7Cj4gPj4gKyAgICBzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2ID0gbWlub3ItPmRldjsKPiA+PiArICAgIHN0cnVjdCBkcm1fc2ltcGxlX2luZm9fZW50cnkg KmVudHJ5Owo+ID4+ICsKPiA+PiArICAgIGxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkZXYt PmRlYnVnZnNfbGlzdCwgbGlzdCkgewo+ID4+ICsgICAgICAgICAgICBkZWJ1Z2ZzX2NyZWF0ZV9m aWxlKGVudHJ5LT5maWxlLm5hbWUsCj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgU19JRlJFRyB8IFNfSVJVR08sIG1pbm9yLT5kZWJ1Z2ZzX3Jvb3QsCj4gPj4gKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksCj4gPj4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgJmRybV9kZWJ1Z2ZzX2ZvcHMpOwo+ID4+ICsgICAgfQo+ID4KPiA+IEkgdGhp bmsgdGhlIGNyZWF0ZWQgaXRlbXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4gVGhh dCB3YXksCj4gPiBkcml2ZXJzIGNhbiBjYWxsIHRoZSBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyB3 aXRob3V0IHJlY3JlYXRpbmcgdGhlIHNhbWUKPiA+IGZpbGVzIGFnYWluLgo+ID4KPiBIYWRuJ3Qg dGhvdWdodCBvZiB0aGF0IC0gSSBjYW4gdHJ5IGFkZCB0aGF0LgoKVGhlIGZ1bmN0aW9uIGhlcmUg aXMgc3RhdGljLCBjYWxsZWQgb25jZSBieSB0aGUgY29yZS4gU28gbm8gbmVlZCBmb3IKY29tcGxp Y2F0ZWQgbG9naWMsIGl0J3MgZ3VhcmFudGVlZCB0byBvbmx5IGJlIGNhbGxlZCBvbmNlLgoKSSBn dWVzcyB3aGF0IGNvbmZ1c2VkIFRob21hcyBpcyB0aGUga2VybmVsZG9jLiBXZSBnZW5lcmFsbHkg b25seSBkbwp0aGF0IGZvciBmdW5jdGlvbnMgZXhwb3J0ZWQgdG8gZHJpdmVycywgdGhhdCBkcml2 ZXJzIHNob3VsZCBjYWxsLiBOb3QKdGhlIGNhc2UgaGVyZS4gVGhlIGZ1bmN0aW9uIG5hbWUgaXRz ZWxmIGlzIGRlc2NyaXB0aXZlIGVub3VnaCBJIHRoaW5rCih3aXRoIFRob21hcycgc3VnZ2VzdGlv biBldmVuIGJldHRlcikuIFNvIEknZCBqdXN0IHJlbW92ZSB0aGUKa2VybmVsZG9jIGhlcmUuCi1E YW5pZWwKCj4gPj4gK30KPiA+Pgo+ID4+ICAvKioKPiA+PiAgICogZHJtX2RlYnVnZnNfY3JlYXRl X2ZpbGVzIC0gSW5pdGlhbGl6ZSBhIGdpdmVuIHNldCBvZiBkZWJ1Z2ZzIGZpbGVzIGZvciBEUk0K PiA+PiBAQCAtMjEzLDggKzIzMyw3IEBAIGludCBkcm1fZGVidWdmc19pbml0KHN0cnVjdCBkcm1f bWlub3IgKm1pbm9yLCBpbnQgbWlub3JfaWQsCj4gPj4gICAgICBzcHJpbnRmKG5hbWUsICIlZCIs IG1pbm9yX2lkKTsKPiA+PiAgICAgIG1pbm9yLT5kZWJ1Z2ZzX3Jvb3QgPSBkZWJ1Z2ZzX2NyZWF0 ZV9kaXIobmFtZSwgcm9vdCk7Cj4gPj4KPiA+PiAtICAgIGRybV9kZWJ1Z2ZzX2NyZWF0ZV9maWxl cyhkcm1fZGVidWdmc19saXN0LCBEUk1fREVCVUdGU19FTlRSSUVTLAo+ID4+IC0gICAgICAgICAg ICAgICAgICAgICAgICAgICAgIG1pbm9yLT5kZWJ1Z2ZzX3Jvb3QsIG1pbm9yKTsKPiA+Cj4gPiBC eSByZW1vdmluZyB0aGVzZSB0d28gbGluZXMsIGFyZW4ndCB5b3UgbG9zaW5nIHRoZSBmaWxlcyBs aXN0ZWQgaW4KPiA+IERSTV9ERUJVR0ZTX0VOVFJJRVM/Cj4gPgo+IFllcy4KPiBXaGVuIHVzaW5n IHRoZSBuZXcgZnVuY3Rpb25zLCBkcm1fZGVidWdmc19jcmVhdGVfZmlsZXMoKSBzaG91bGQgbm90 Cj4gYmUgY2FsbGVkIGF0IHRoaXMgcG9pbnQsIGJ1dCBmb3IgY29tcGF0aWJpbGl0eSB0aGVzZSB0 d28gbGluZXMgc2hvdWxkCj4gYmUgcHV0IGJhY2ssIEkgdGhpbmsuCj4KPiA+PiArICAgIGRybV9k ZWJ1Z2ZzX2NyZWF0ZV9maWxlKG1pbm9yKTsKPiA+Pgo+ID4+ICAgICAgaWYgKGRybV9kcnZfdXNl c19hdG9taWNfbW9kZXNldChkZXYpKSB7Cj4gPj4gICAgICAgICAgICAgIGRybV9hdG9taWNfZGVi dWdmc19pbml0KG1pbm9yKTsKPiA+PiBAQCAtNDQ5LDQgKzQ2OCwzNiBAQCB2b2lkIGRybV9kZWJ1 Z2ZzX2NydGNfcmVtb3ZlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKPiA+PiAgICAgIGNydGMtPmRl YnVnZnNfZW50cnkgPSBOVUxMOwo+ID4+ICB9Cj4gPj4KPiA+PiArdm9pZCBkcm1fZGVidWdmc19h ZGRfZmlsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBjb25zdCBjaGFyICpuYW1lLAo+ID4+ICsg ICAgICAgICAgICAgICAgICAgICAgZHJtX3NpbXBsZV9zaG93X3Qgc2hvd19mbiwgdm9pZCAqZGF0 YSkKPiA+PiArewo+ID4+ICsgICAgc3RydWN0IGRybV9zaW1wbGVfaW5mb19lbnRyeSAqZW50cnkg PQo+ID4+ICsgICAgICAgICAgICBremFsbG9jKHNpemVvZigqZW50cnkpLCBHRlBfS0VSTkVMKTsK PiA+PiArCj4gPj4gKyAgICBpZiAoIWVudHJ5KQo+ID4+ICsgICAgICAgICAgICByZXR1cm47Cj4g Pj4gKwo+ID4+ICsgICAgZW50cnktPmZpbGUubmFtZSA9IG5hbWU7Cj4gPj4gKyAgICBlbnRyeS0+ ZmlsZS5zaG93X2ZuID0gc2hvd19mbjsKPiA+PiArICAgIGVudHJ5LT5maWxlLmRhdGEgPSBkYXRh Owo+ID4+ICsgICAgZW50cnktPmRldiA9IGRldjsKPiA+PiArCj4gPj4gKyAgICBtdXRleF9sb2Nr KCZkZXYtPmRlYnVnZnNfbXV0ZXgpOwo+ID4+ICsgICAgbGlzdF9hZGQoJmVudHJ5LT5saXN0LCAm ZGV2LT5kZWJ1Z2ZzX2xpc3QpOwo+ID4+ICsgICAgbXV0ZXhfdW5sb2NrKCZkZXYtPmRlYnVnZnNf bXV0ZXgpOwo+ID4+ICt9Cj4gPj4gK0VYUE9SVF9TWU1CT0woZHJtX2RlYnVnZnNfYWRkX2ZpbGUp Owo+ID4+ICsKPiA+PiArdm9pZCBkcm1fZGVidWdmc19hZGRfZmlsZXMoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZHJtX3Np bXBsZV9pbmZvICpmaWxlcywgaW50IGNvdW50KQo+ID4+ICt7Cj4gPj4gKyAgICBpbnQgaTsKPiA+ PiArCj4gPj4gKyAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewo+ID4+ICsgICAgICAg ICAgICBkcm1fZGVidWdmc19hZGRfZmlsZShkZXYsIGZpbGVzW2ldLm5hbWUsIGZpbGVzW2ldLnNo b3dfZm4sCj4gPj4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVzW2ldLmRh dGEpOwo+ID4+ICsgICAgfQo+ID4+ICt9Cj4gPj4gK0VYUE9SVF9TWU1CT0woZHJtX2RlYnVnZnNf YWRkX2ZpbGVzKTsKPiA+PiArCj4gPj4gICNlbmRpZiAvKiBDT05GSUdfREVCVUdfRlMgKi8KPiA+ PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcnYuYyBiL2RyaXZlcnMvZ3B1L2Ry bS9kcm1fZHJ2LmMKPiA+PiBpbmRleCBiYzM4MzIyZjMwNmUuLmM2OGRmNGUzMWFhMCAxMDA2NDQK PiA+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vZHJtX2Rydi5jCj4gPj4gKysrIGIvZHJpdmVycy9n cHUvZHJtL2RybV9kcnYuYwo+ID4+IEBAIC02NDYsMTIgKzY0NiwxNCBAQCBpbnQgZHJtX2Rldl9p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPj4gICAgICBJTklUX0xJU1RfSEVBRCgmZGV2 LT5maWxlbGlzdF9pbnRlcm5hbCk7Cj4gPj4gICAgICBJTklUX0xJU1RfSEVBRCgmZGV2LT5jbGll bnRsaXN0KTsKPiA+PiAgICAgIElOSVRfTElTVF9IRUFEKCZkZXYtPnZibGFua19ldmVudF9saXN0 KTsKPiA+PiArICAgIElOSVRfTElTVF9IRUFEKCZkZXYtPmRlYnVnZnNfbGlzdCk7Cj4gPj4KPiA+ PiAgICAgIHNwaW5fbG9ja19pbml0KCZkZXYtPmV2ZW50X2xvY2spOwo+ID4+ICAgICAgbXV0ZXhf aW5pdCgmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwo+ID4+ICAgICAgbXV0ZXhfaW5pdCgmZGV2LT5maWxl bGlzdF9tdXRleCk7Cj4gPj4gICAgICBtdXRleF9pbml0KCZkZXYtPmNsaWVudGxpc3RfbXV0ZXgp Owo+ID4+ICAgICAgbXV0ZXhfaW5pdCgmZGV2LT5tYXN0ZXJfbXV0ZXgpOwo+ID4+ICsgICAgbXV0 ZXhfaW5pdCgmZGV2LT5kZWJ1Z2ZzX211dGV4KTsKPiA+Pgo+ID4+ICAgICAgcmV0ID0gZHJtbV9h ZGRfYWN0aW9uKGRldiwgZHJtX2Rldl9pbml0X3JlbGVhc2UsIE5VTEwpOwo+ID4+ICAgICAgaWYg KHJldCkKPiA+PiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtX2RlYnVnZnMuaCBiL2luY2x1 ZGUvZHJtL2RybV9kZWJ1Z2ZzLmgKPiA+PiBpbmRleCAyMTg4ZGM4Mzk1N2YuLmJiY2U1ODBjM2Iz OCAxMDA2NDQKPiA+PiAtLS0gYS9pbmNsdWRlL2RybS9kcm1fZGVidWdmcy5oCj4gPj4gKysrIGIv aW5jbHVkZS9kcm0vZHJtX2RlYnVnZnMuaAo+ID4+IEBAIC0zNCw2ICszNCw0NCBAQAo+ID4+Cj4g Pj4gICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgo+ID4+ICAjaW5jbHVkZSA8bGludXgvc2VxX2Zp bGUuaD4KPiA+PiArCj4gPj4gK3N0cnVjdCBkcm1fZGV2aWNlOwo+ID4+ICsKPiA+PiArdHlwZWRl ZiBpbnQgKCpkcm1fc2ltcGxlX3Nob3dfdCkoc3RydWN0IHNlcV9maWxlICosIHZvaWQgKik7Cj4g Pj4gKwo+ID4+ICsvKioKPiA+PiArICogc3RydWN0IGRybV9zaW1wbGVfaW5mbyAtIGRlYnVnZnMg ZmlsZSBlbnRyeQo+ID4+ICsgKgo+ID4+ICsgKiBUaGlzIHN0cnVjdCByZXByZXNlbnRzIGEgZGVi dWdmcyBmaWxlIHRvIGJlIGNyZWF0ZWQuCj4gPj4gKyAqLwo+ID4+ICtzdHJ1Y3QgZHJtX3NpbXBs ZV9pbmZvIHsKPiA+Cj4gPiBkcm1fc2ltcGxlX2luZm8gYW5kIGRybV9zaW1wbGVfaW5mb19lbnRy eSBzZWVtIHRvIGJlIG1pc25vbWVycy4gVGhleQo+ID4gc2hvdWxkIHByb2JhYmx5IGhhdmUgc29t ZSByZWZlcmVuY2UgdG8gZGVidWdmcyBpbiB0aGVpciBuYW1lLgo+ID4KPiBJJ2xsIGNoYW5nZSB0 aGUgbmFtZXMuCj4KPiBUaGFua3MsCj4gd2FtYnVpIGthcnVnYQo+ID4gQmVzdCByZWdhcmRzCj4g PiBUaG9tYXMKPiA+Cj4gPgo+ID4+ICsgICAgY29uc3QgY2hhciAqbmFtZTsKPiA+PiArICAgIGRy bV9zaW1wbGVfc2hvd190IHNob3dfZm47Cj4gPj4gKyAgICB1MzIgZHJpdmVyX2ZlYXR1cmVzOwo+ ID4+ICsgICAgdm9pZCAqZGF0YTsKPiA+PiArfTsKPiA+PiArCj4gPj4gKy8qKgo+ID4+ICsgKiBz dHJ1Y3QgZHJtX3NpbXBsZV9pbmZvX2VudHJ5IC0gZGVidWdmcyBsaXN0IGVudHJ5Cj4gPj4gKyAq Cj4gPj4gKyAqIFRoaXMgc3RydWN0IGlzIHVzZWQgaW4gdHJhY2tpbmcgcmVxdWVzdHMgZm9yIG5l dyBkZWJ1Z2ZzIGZpbGVzCj4gPj4gKyAqIHRvIGJlIGNyZWF0ZWQuCj4gPj4gKyAqLwo+ID4+ICtz dHJ1Y3QgZHJtX3NpbXBsZV9pbmZvX2VudHJ5IHsKPiA+PiArICAgIHN0cnVjdCBkcm1fZGV2aWNl ICpkZXY7Cj4gPj4gKyAgICBzdHJ1Y3QgZHJtX3NpbXBsZV9pbmZvIGZpbGU7Cj4gPj4gKyAgICBz dHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cj4gPj4gK307Cj4gPj4gKwo+ID4+ICt2b2lkIGRybV9kZWJ1 Z2ZzX2FkZF9maWxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCj4gPj4gKyAgICAgICAgICAgICAg ICAgICAgICBjb25zdCBjaGFyICpuYW1lLAo+ID4+ICsgICAgICAgICAgICAgICAgICAgICAgZHJt X3NpbXBsZV9zaG93X3Qgc2hvd19mbiwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgIHZvaWQg KmRhdGEpOwo+ID4+ICsKPiA+PiArdm9pZCBkcm1fZGVidWdmc19hZGRfZmlsZXMoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qg ZHJtX3NpbXBsZV9pbmZvICpmaWxlcywKPiA+PiArICAgICAgICAgICAgICAgICAgICAgICBpbnQg Y291bnQpOwo+ID4+ICsKPiA+PiAgLyoqCj4gPj4gICAqIHN0cnVjdCBkcm1faW5mb19saXN0IC0g ZGVidWdmcyBpbmZvIGxpc3QgZW50cnkKPiA+PiAgICoKPiA+PiBkaWZmIC0tZ2l0IGEvaW5jbHVk ZS9kcm0vZHJtX2RldmljZS5oIGIvaW5jbHVkZS9kcm0vZHJtX2RldmljZS5oCj4gPj4gaW5kZXgg YTU1ODc0ZGI5ZGQ0Li5iODRkZmRhYzI3YjcgMTAwNjQ0Cj4gPj4gLS0tIGEvaW5jbHVkZS9kcm0v ZHJtX2RldmljZS5oCj4gPj4gKysrIGIvaW5jbHVkZS9kcm0vZHJtX2RldmljZS5oCj4gPj4gQEAg LTMyNiw2ICszMjYsMTggQEAgc3RydWN0IGRybV9kZXZpY2Ugewo+ID4+ICAgICAgICovCj4gPj4g ICAgICBzdHJ1Y3QgZHJtX2ZiX2hlbHBlciAqZmJfaGVscGVyOwo+ID4+Cj4gPj4gKyAgICAvKioK PiA+PiArICAgICAqIEBkZWJ1Z2ZzX211dGV4Ogo+ID4+ICsgICAgICogUHJvdGVjdHMgZGVidWdm c19saXN0IGFjY2Vzcy4KPiA+PiArICAgICAqLwo+ID4+ICsgICAgc3RydWN0IG11dGV4IGRlYnVn ZnNfbXV0ZXg7Cj4gPj4gKwo+ID4+ICsgICAgLyoqIEBkZWJ1Z2ZzX2xpc3Q6Cj4gPj4gKyAgICAg KiBMaXN0IG9mIGRlYnVnZnMgZmlsZXMgdG8gYWRkLgo+ID4+ICsgICAgICogRmlsZXMgYXJlIGFk ZGVkIGR1cmluZyBkcm1fZGV2X3JlZ2lzdGVyKCkuCj4gPj4gKyAgICAgKi8KPiA+PiArICAgIHN0 cnVjdCBsaXN0X2hlYWQgZGVidWdmc19saXN0Owo+ID4+ICsKPiA+PiAgICAgIC8qIEV2ZXJ5dGhp bmcgYmVsb3cgaGVyZSBpcyBmb3IgbGVnYWN5IGRyaXZlciwgbmV2ZXIgdXNlISAqLwo+ID4+ICAg ICAgLyogcHJpdmF0ZTogKi8KPiA+PiAgI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9MRUdBQ1kp Cj4gPj4KPiA+Cj4gPiAtLQo+ID4gVGhvbWFzIFppbW1lcm1hbm4KPiA+IEdyYXBoaWNzIERyaXZl ciBEZXZlbG9wZXIKPiA+IFNVU0UgU29mdHdhcmUgU29sdXRpb25zIEdlcm1hbnkgR21iSAo+ID4g TWF4ZmVsZHN0ci4gNSwgOTA0MDkgTsO8cm5iZXJnLCBHZXJtYW55Cj4gPiAoSFJCIDM2ODA5LCBB RyBOw7xybmJlcmcpCj4gPiBHZXNjaMOkZnRzZsO8aHJlcjogRmVsaXggSW1lbmTDtnJmZmVyCj4g Pgo+ID4KCgoKLS0gCkRhbmllbCBWZXR0ZXIKU29mdHdhcmUgRW5naW5lZXIsIEludGVsIENvcnBv cmF0aW9uCis0MSAoMCkgNzkgMzY1IDU3IDQ4IC0gaHR0cDovL2Jsb2cuZmZ3bGwuY2gKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxp bmcgbGlzdApkcmktZGV2ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJl ZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vZHJpLWRldmVsCg==