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=-12.3 required=3.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED,DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN, FREEMAIL_FROM,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT 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 7BC52C55179 for ; Sun, 25 Oct 2020 15:41:35 +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 306BF20790 for ; Sun, 25 Oct 2020 15:41:35 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="cCz7rkD8" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 306BF20790 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.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 004246E9DB; Sun, 25 Oct 2020 15:41:32 +0000 (UTC) Received: from mail-ed1-x52d.google.com (mail-ed1-x52d.google.com [IPv6:2a00:1450:4864:20::52d]) by gabe.freedesktop.org (Postfix) with ESMTPS id 06A5A6E9E0 for ; Sun, 25 Oct 2020 15:41:17 +0000 (UTC) Received: by mail-ed1-x52d.google.com with SMTP id v19so6851528edx.9 for ; Sun, 25 Oct 2020 08:41:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=SdiyAL2KxunTvPynkj2ylQ2sucpAvxwUm5E2HDtquj4=; b=cCz7rkD8RCJxtGz547u4EBo6ip01KLdtr+D17vFPV9nYxzrEoVWuwIVI7ndtV33MDJ SSIV+lulYNG3IDbQw5arPuMZrfJTYvdNgsZyi9qqzjebEbqcFwYjqsRzmH4veumyhWzF C1kGgIhzhtE4Iwd0SIYRaK1/Z42gVcpoVENEn6ve3RT+f5J+B4VgPjbeudNxGs9jlnK2 8J3rxCtTBTQgd/3CEgSMQ80yP0HGO9/7sw/7r+cFdDKgpSiwvEoKKPk/1ZrYRhOvbyMY t6fxCVpnO9CwUmW78CGa03SFf3kKjUNl4mjsL1IDyyGCIEehC3VzlCilv1g8oqCFO46t jWXQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=SdiyAL2KxunTvPynkj2ylQ2sucpAvxwUm5E2HDtquj4=; b=taBs/JM5cHx0BaBgb8lbyonNk+gdhIFFqYm3V/t6dp756Dl/rv19FXZHmLP3GxGreC nImF9Z2cJQGUfl2+irEeolXt6dpeNdgwrORK11YdpcYkTeDouR2bYA78jeg6YuWAEGig 5si3C88v2yGF5Cla2T9wZ65iW3fjG0hvnK7Yz1iExNL8UOdTYCnSW8S+DSiVn4kUEVm+ 7YCtW2z/R26VTAb9NA5laMWcDp/POY3dq8Sj+b8lnKeoKuLYyD1jJeekyNJ1cogpPKho BYYc94vVp4JH7o8JMoZSsMaUiIlv2csqQhaFykE2P+rp+U7UL3U9UDus/ZBI0H78F03t 3Ctg== X-Gm-Message-State: AOAM5300TnHbq/jV7RzC/6XaMoGpPI6LUSYWBVUcuc1enURA5SpagnJE RXnp7Vh+7xuHryJ+eWDP73Jz1YMkN2k= X-Google-Smtp-Source: ABdhPJx4Xo9l2Oka73qJOmq+JvHFGymj0PSuqAaBOIx3g3F6XEDOTDwFmM71zGtcZR7eEMMSyrpObA== X-Received: by 2002:a05:6402:1a56:: with SMTP id bf22mr11906024edb.216.1603640474170; Sun, 25 Oct 2020 08:41:14 -0700 (PDT) Received: from abel.fritz.box ([2a02:908:1252:fb60:d13a:1a76:8d61:cf5c]) by smtp.gmail.com with ESMTPSA id g8sm4141931ejp.73.2020.10.25.08.41.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 25 Oct 2020 08:41:13 -0700 (PDT) From: "=?UTF-8?q?Christian=20K=C3=B6nig?=" X-Google-Original-From: =?UTF-8?q?Christian=20K=C3=B6nig?= To: Madhav.Chauhan@amd.com, dri-devel@lists.freedesktop.org Subject: [PATCH 13/13] drm/ttm: nuke old page allocator Date: Sun, 25 Oct 2020 16:41:00 +0100 Message-Id: <20201025154100.16400-14-christian.koenig@amd.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201025154100.16400-1-christian.koenig@amd.com> References: <20201025154100.16400-1-christian.koenig@amd.com> MIME-Version: 1.0 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: Ray.Huang@amd.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" Tm90IHVzZWQgYW55IG1vcmUuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpc3RpYW4gS8O2bmlnIDxjaHJp c3RpYW4ua29lbmlnQGFtZC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL0tjb25maWcgICAgICAg ICAgICAgICAgICB8ICAgIDcgLQogZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZSAgICAgICAg ICAgICB8ICAgIDMgKy0KIGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2FncF9iYWNrZW5kLmMgICAg fCAgICAxIC0KIGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2JvLmMgICAgICAgICAgICAgfCAgICAx IC0KIGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jICAgICAgICAgfCAgICA1IC0KIGRy aXZlcnMvZ3B1L2RybS90dG0vdHRtX3BhZ2VfYWxsb2MuYyAgICAgfCAxMTc2IC0tLS0tLS0tLS0t LS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fcGFnZV9hbGxvY19kbWEuYyB8IDEy MjYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fc2V0X21l bW9yeS5oICAgICB8ICAgODQgLS0KIGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMgICAgICAg ICAgICAgfCAgICA0IC0KIGluY2x1ZGUvZHJtL3R0bS90dG1fYm9fZHJpdmVyLmggICAgICAgICAg fCAgICAyIC0KIGluY2x1ZGUvZHJtL3R0bS90dG1fcGFnZV9hbGxvYy5oICAgICAgICAgfCAgMTIy IC0tLQogaW5jbHVkZS9kcm0vdHRtL3R0bV90dC5oICAgICAgICAgICAgICAgICB8ICAgIDIgLQog MTIgZmlsZXMgY2hhbmdlZCwgMSBpbnNlcnRpb24oKyksIDI2MzIgZGVsZXRpb25zKC0pCiBkZWxl dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fcGFnZV9hbGxvYy5jCiBkZWxl dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fcGFnZV9hbGxvY19kbWEuYwog ZGVsZXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3NldF9tZW1vcnkuaAog ZGVsZXRlIG1vZGUgMTAwNjQ0IGluY2x1ZGUvZHJtL3R0bS90dG1fcGFnZV9hbGxvYy5oCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL0tjb25maWcgYi9kcml2ZXJzL2dwdS9kcm0vS2NvbmZp ZwppbmRleCAzMjI1NzE4OWUwOWIuLjY0Mzc2ZGQyOThlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL0tjb25maWcKKysrIGIvZHJpdmVycy9ncHUvZHJtL0tjb25maWcKQEAgLTE4MiwxMyAr MTgyLDYgQEAgY29uZmlnIERSTV9UVE0KIAkgIEdQVSBtZW1vcnkgdHlwZXMuIFdpbGwgYmUgZW5h YmxlZCBhdXRvbWF0aWNhbGx5IGlmIGEgZGV2aWNlIGRyaXZlcgogCSAgdXNlcyBpdC4KIAotY29u ZmlnIERSTV9UVE1fRE1BX1BBR0VfUE9PTAotCWJvb2wKLQlkZXBlbmRzIG9uIERSTV9UVE0gJiYg KFNXSU9UTEIgfHwgSU5URUxfSU9NTVUpCi0JZGVmYXVsdCB5Ci0JaGVscAotCSAgQ2hvb3NlIHRo aXMgaWYgeW91IG5lZWQgdGhlIFRUTSBkbWEgcGFnZSBwb29sCi0KIGNvbmZpZyBEUk1fVlJBTV9I RUxQRVIKIAl0cmlzdGF0ZQogCWRlcGVuZHMgb24gRFJNCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vdHRtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL3R0bS9NYWtlZmlsZQppbmRleCAw MDk2YmFjYmNmMzIuLmI2ZjVmODdiMjcwZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0 bS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL01ha2VmaWxlCkBAIC00LDkgKzQs OCBAQAogCiB0dG0teSA6PSB0dG1fbWVtb3J5Lm8gdHRtX3R0Lm8gdHRtX2JvLm8gXAogCXR0bV9i b191dGlsLm8gdHRtX2JvX3ZtLm8gdHRtX21vZHVsZS5vIFwKLQl0dG1fZXhlY2J1Zl91dGlsLm8g dHRtX3BhZ2VfYWxsb2MubyB0dG1fcmFuZ2VfbWFuYWdlci5vIFwKKwl0dG1fZXhlY2J1Zl91dGls Lm8gdHRtX3JhbmdlX21hbmFnZXIubyBcCiAJdHRtX3Jlc291cmNlLm8gdHRtX3Bvb2wubwogdHRt LSQoQ09ORklHX0FHUCkgKz0gdHRtX2FncF9iYWNrZW5kLm8KLXR0bS0kKENPTkZJR19EUk1fVFRN X0RNQV9QQUdFX1BPT0wpICs9IHR0bV9wYWdlX2FsbG9jX2RtYS5vCiAKIG9iai0kKENPTkZJR19E Uk1fVFRNKSArPSB0dG0ubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYWdw X2JhY2tlbmQuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX2FncF9iYWNrZW5kLmMKaW5kZXgg NGY3NmM5Mjg3MTU5Li4wM2M4NjYyOGU0YWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS90 dG0vdHRtX2FncF9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYWdwX2Jh Y2tlbmQuYwpAQCAtMzQsNyArMzQsNiBAQAogCiAjaW5jbHVkZSA8ZHJtL3R0bS90dG1fbW9kdWxl Lmg+CiAjaW5jbHVkZSA8ZHJtL3R0bS90dG1fYm9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8ZHJtL3R0 bS90dG1fcGFnZV9hbGxvYy5oPgogI2luY2x1ZGUgPGRybS90dG0vdHRtX3BsYWNlbWVudC5oPgog I2luY2x1ZGUgPGxpbnV4L2FncF9iYWNrZW5kLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9iby5jIGIvZHJpdmVycy9ncHUv ZHJtL3R0bS90dG1fYm8uYwppbmRleCBlOWY5MWNmY2U1ZTkuLjUzMGM5YTRhZjA5ZiAxMDA2NDQK LS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fYm8uYworKysgYi9kcml2ZXJzL2dwdS9kcm0v dHRtL3R0bV9iby5jCkBAIC0xMzMzLDcgKzEzMzMsNiBAQCBpbnQgdHRtX2JvX2RldmljZV9pbml0 KHN0cnVjdCB0dG1fYm9fZGV2aWNlICpiZGV2LAogCUlOSVRfREVMQVlFRF9XT1JLKCZiZGV2LT53 cSwgdHRtX2JvX2RlbGF5ZWRfd29ya3F1ZXVlKTsKIAlJTklUX0xJU1RfSEVBRCgmYmRldi0+ZGRl c3Ryb3kpOwogCWJkZXYtPmRldl9tYXBwaW5nID0gbWFwcGluZzsKLQliZGV2LT5uZWVkX2RtYTMy ID0gdXNlX2RtYTMyOwogCW11dGV4X2xvY2soJnR0bV9nbG9iYWxfbXV0ZXgpOwogCWxpc3RfYWRk X3RhaWwoJmJkZXYtPmRldmljZV9saXN0LCAmZ2xvYi0+ZGV2aWNlX2xpc3QpOwogCW11dGV4X3Vu bG9jaygmdHRtX2dsb2JhbF9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vdHRt L3R0bV9tZW1vcnkuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX21lbW9yeS5jCmluZGV4IDMw MTJkMDM4OGM1MS4uZjlhOTBiZmFhM2MxIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRt L3R0bV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9tZW1vcnkuYwpAQCAt MzAsNyArMzAsNiBAQAogCiAjaW5jbHVkZSA8ZHJtL3R0bS90dG1fbWVtb3J5Lmg+CiAjaW5jbHVk ZSA8ZHJtL3R0bS90dG1fbW9kdWxlLmg+Ci0jaW5jbHVkZSA8ZHJtL3R0bS90dG1fcGFnZV9hbGxv Yy5oPgogI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQu aD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CkBAIC00NTIsOCArNDUxLDYgQEAgaW50IHR0bV9t ZW1fZ2xvYmFsX2luaXQoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iKQogCQlwcl9pbmZvKCJa b25lICU3czogQXZhaWxhYmxlIGdyYXBoaWNzIG1lbW9yeTogJWxsdSBLaUJcbiIsCiAJCQl6b25l LT5uYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXpvbmUtPm1heF9tZW0gPj4gMTApOwogCX0KLQl0 dG1fcGFnZV9hbGxvY19pbml0KGdsb2IsIGdsb2ItPnpvbmVfa2VybmVsLT5tYXhfbWVtLygyKlBB R0VfU0laRSkpOwotCXR0bV9kbWFfcGFnZV9hbGxvY19pbml0KGdsb2IsIGdsb2ItPnpvbmVfa2Vy bmVsLT5tYXhfbWVtLygyKlBBR0VfU0laRSkpOwogCXR0bV9wb29sX21ncl9pbml0KGdsb2ItPnpv bmVfa2VybmVsLT5tYXhfbWVtLygyKlBBR0VfU0laRSkpOwogCXJldHVybiAwOwogb3V0X25vX3pv bmU6CkBAIC00NjcsOCArNDY0LDYgQEAgdm9pZCB0dG1fbWVtX2dsb2JhbF9yZWxlYXNlKHN0cnVj dCB0dG1fbWVtX2dsb2JhbCAqZ2xvYikKIAl1bnNpZ25lZCBpbnQgaTsKIAogCS8qIGxldCB0aGUg cGFnZSBhbGxvY2F0b3IgZmlyc3Qgc3RvcCB0aGUgc2hyaW5rIHdvcmsuICovCi0JdHRtX3BhZ2Vf YWxsb2NfZmluaSgpOwotCXR0bV9kbWFfcGFnZV9hbGxvY19maW5pKCk7CiAJdHRtX3Bvb2xfbWdy X2ZpbmkoKTsKIAogCWZsdXNoX3dvcmtxdWV1ZShnbG9iLT5zd2FwX3F1ZXVlKTsKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3BhZ2VfYWxsb2MuYyBiL2RyaXZlcnMvZ3B1L2Ry bS90dG0vdHRtX3BhZ2VfYWxsb2MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjll NmMyOWFkNjBlLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fcGFn ZV9hbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NiArMCwwIEBACi0vKgotICogQ29weXJp Z2h0IChjKSBSZWQgSGF0IEluYy4KLQotICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwg ZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKLSAqIGNvcHkgb2YgdGhp cyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3 YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBp bmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwg bW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3ViIGxpY2Vuc2UsCi0gKiBhbmQv b3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8g d2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0 aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3Rp Y2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKLSAqIG5leHQgcGFy YWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBv cnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhFIFNPRlRXQVJFIElTIFBST1ZJ REVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKLSAq IElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Yg TUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5E IE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0gKiBUSEUgQVVUSE9SUyBPUiBD T1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhF UgotICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBP UiBPVEhFUldJU0UsIEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJ VEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLSAqIERFQUxJTkdTIElOIFRIRSBT T0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOiBEYXZlIEFpcmxpZSA8YWlybGllZEByZWRoYXQuY29t PgotICogICAgICAgICAgSmVyb21lIEdsaXNzZSA8amdsaXNzZUByZWRoYXQuY29tPgotICogICAg ICAgICAgUGF1bGkgTmllbWluZW4gPHN1b2trb3NAZ21haWwuY29tPgotICovCi0KLS8qIHNpbXBs ZSBsaXN0IGJhc2VkIHVuY2FjaGVkIHBhZ2UgcG9vbAotICogLSBQb29sIGNvbGxlY3RzIHJlc2Vu dGx5IGZyZWVkIHBhZ2VzIGZvciByZXVzZQotICogLSBVc2UgcGFnZS0+bHJ1IHRvIGtlZXAgYSBm cmVlIGxpc3QKLSAqIC0gZG9lc24ndCB0cmFjayBjdXJyZW50bHkgaW4gdXNlIHBhZ2VzCi0gKi8K LQotI2RlZmluZSBwcl9mbXQoZm10KSAiW1RUTV0gIiBmbXQKLQotI2luY2x1ZGUgPGxpbnV4L2xp c3QuaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2hpZ2ht ZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9tbV90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVs ZS5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4g LyogZm9yIHNlcV9wcmludGYgKi8KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8 bGludXgvZG1hLW1hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGxpbnV4L2F0b21pYy5oPgotCi0jaW5j bHVkZSA8ZHJtL3R0bS90dG1fYm9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8ZHJtL3R0bS90dG1fcGFn ZV9hbGxvYy5oPgotCi0jaW5jbHVkZSAidHRtX3NldF9tZW1vcnkuaCIKLQotI2RlZmluZSBOVU1f UEFHRVNfVE9fQUxMT0MJCShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBwYWdlICopKQotI2RlZmlu ZSBTTUFMTF9BTExPQ0FUSU9OCQkxNgotI2RlZmluZSBGUkVFX0FMTF9QQUdFUwkJCSh+MFUpCi0v KiB0aW1lcyBhcmUgaW4gbXNlY3MgKi8KLSNkZWZpbmUgUEFHRV9GUkVFX0lOVEVSVkFMCQkxMDAw Ci0KLS8qKgotICogc3RydWN0IHR0bV9wYWdlX3Bvb2wgLSBQb29sIHRvIHJldXNlIHJlY2VudGx5 IGFsbG9jYXRlZCB1Yy93YyBwYWdlcy4KLSAqCi0gKiBAbG9jazogUHJvdGVjdHMgdGhlIHNoYXJl ZCBwb29sIGZyb20gY29uY3Vycm5ldCBhY2Nlc3MuIE11c3QgYmUgdXNlZCB3aXRoCi0gKiBpcnFz YXZlL2lycXJlc3RvcmUgdmFyaWFudHMgYmVjYXVzZSBwb29sIGFsbG9jYXRvciBtYXliZSBjYWxs ZWQgZnJvbQotICogZGVsYXllZCB3b3JrLgotICogQGZpbGxfbG9jazogUHJldmVudCBjb25jdXJy ZW50IGNhbGxzIHRvIGZpbGwuCi0gKiBAbGlzdDogUG9vbCBvZiBmcmVlIHVjL3djIHBhZ2VzIGZv ciBmYXN0IHJldXNlLgotICogQGdmcF9mbGFnczogRmxhZ3MgdG8gcGFzcyBmb3IgYWxsb2NfcGFn ZS4KLSAqIEBucGFnZXM6IE51bWJlciBvZiBwYWdlcyBpbiBwb29sLgotICovCi1zdHJ1Y3QgdHRt X3BhZ2VfcG9vbCB7Ci0Jc3BpbmxvY2tfdAkJbG9jazsKLQlib29sCQkJZmlsbF9sb2NrOwotCXN0 cnVjdCBsaXN0X2hlYWQJbGlzdDsKLQlnZnBfdAkJCWdmcF9mbGFnczsKLQl1bnNpZ25lZAkJbnBh Z2VzOwotCWNoYXIJCQkqbmFtZTsKLQl1bnNpZ25lZCBsb25nCQluZnJlZXM7Ci0JdW5zaWduZWQg bG9uZwkJbnJlZmlsbHM7Ci0JdW5zaWduZWQgaW50CQlvcmRlcjsKLX07Ci0KLS8qKgotICogTGlt aXRzIGZvciB0aGUgcG9vbC4gVGhleSBhcmUgaGFuZGxlZCB3aXRob3V0IGxvY2tzIGJlY2F1c2Ug b25seSBwbGFjZSB3aGVyZQotICogdGhleSBtYXkgY2hhbmdlIGlzIGluIHN5c2ZzIHN0b3JlLiBU aGV5IHdvbid0IGhhdmUgaW1tZWRpYXRlIGVmZmVjdCBhbnl3YXkKLSAqIHNvIGZvcmNpbmcgc2Vy aWFsaXphdGlvbiB0byBhY2Nlc3MgdGhlbSBpcyBwb2ludGxlc3MuCi0gKi8KLQotc3RydWN0IHR0 bV9wb29sX29wdHMgewotCXVuc2lnbmVkCWFsbG9jX3NpemU7Ci0JdW5zaWduZWQJbWF4X3NpemU7 Ci0JdW5zaWduZWQJc21hbGw7Ci19OwotCi0jZGVmaW5lIE5VTV9QT09MUyA2Ci0KLS8qKgotICog c3RydWN0IHR0bV9wb29sX21hbmFnZXIgLSBIb2xkcyBtZW1vcnkgcG9vbHMgZm9yIGZzdCBhbGxv Y2F0aW9uCi0gKgotICogTWFuYWdlciBpcyByZWFkIG9ubHkgb2JqZWN0IGZvciBwb29sIGNvZGUg c28gaXQgZG9lc24ndCBuZWVkIGxvY2tpbmcuCi0gKgotICogQGZyZWVfaW50ZXJ2YWw6IG1pbmlt dW0gbnVtYmVyIG9mIGppZmZpZXMgYmV0d2VlbiBmcmVlaW5nIHBhZ2VzIGZyb20gcG9vbC4KLSAq IEBwYWdlX2FsbG9jX2luaXRlZDogcmVmZXJlbmNlIGNvdW50aW5nIGZvciBwb29sIGFsbG9jYXRp b24uCi0gKiBAd29yazogV29yayB0aGF0IGlzIHVzZWQgdG8gc2hyaW5rIHRoZSBwb29sLiBXb3Jr IGlzIG9ubHkgcnVuIHdoZW4gdGhlcmUgaXMKLSAqIHNvbWUgcGFnZXMgdG8gZnJlZS4KLSAqIEBz bWFsbF9hbGxvY2F0aW9uOiBMaW1pdCBpbiBudW1iZXIgb2YgcGFnZXMgd2hhdCBpcyBzbWFsbCBh bGxvY2F0aW9uLgotICoKLSAqIEBwb29sczogQWxsIHBvb2wgb2JqZWN0cyBpbiB1c2UuCi0gKiov Ci1zdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciB7Ci0Jc3RydWN0IGtvYmplY3QJCWtvYmo7Ci0Jc3Ry dWN0IHNocmlua2VyCQltbV9zaHJpbms7Ci0Jc3RydWN0IHR0bV9wb29sX29wdHMJb3B0aW9uczsK LQotCXVuaW9uIHsKLQkJc3RydWN0IHR0bV9wYWdlX3Bvb2wJcG9vbHNbTlVNX1BPT0xTXTsKLQkJ c3RydWN0IHsKLQkJCXN0cnVjdCB0dG1fcGFnZV9wb29sCXdjX3Bvb2w7Ci0JCQlzdHJ1Y3QgdHRt X3BhZ2VfcG9vbAl1Y19wb29sOwotCQkJc3RydWN0IHR0bV9wYWdlX3Bvb2wJd2NfcG9vbF9kbWEz MjsKLQkJCXN0cnVjdCB0dG1fcGFnZV9wb29sCXVjX3Bvb2xfZG1hMzI7Ci0JCQlzdHJ1Y3QgdHRt X3BhZ2VfcG9vbAl3Y19wb29sX2h1Z2U7Ci0JCQlzdHJ1Y3QgdHRtX3BhZ2VfcG9vbAl1Y19wb29s X2h1Z2U7Ci0JCX0gOwotCX07Ci19OwotCi1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSB0dG1fcGFn ZV9wb29sX21heCA9IHsKLQkubmFtZSA9ICJwb29sX21heF9zaXplIiwKLQkubW9kZSA9IFNfSVJV R08gfCBTX0lXVVNSCi19Owotc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgdHRtX3BhZ2VfcG9vbF9z bWFsbCA9IHsKLQkubmFtZSA9ICJwb29sX3NtYWxsX2FsbG9jYXRpb24iLAotCS5tb2RlID0gU19J UlVHTyB8IFNfSVdVU1IKLX07Ci1zdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSB0dG1fcGFnZV9wb29s X2FsbG9jX3NpemUgPSB7Ci0JLm5hbWUgPSAicG9vbF9hbGxvY2F0aW9uX3NpemUiLAotCS5tb2Rl ID0gU19JUlVHTyB8IFNfSVdVU1IKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0dG1f cG9vbF9hdHRyc1tdID0gewotCSZ0dG1fcGFnZV9wb29sX21heCwKLQkmdHRtX3BhZ2VfcG9vbF9z bWFsbCwKLQkmdHRtX3BhZ2VfcG9vbF9hbGxvY19zaXplLAotCU5VTEwKLX07Ci0KLXN0YXRpYyB2 b2lkIHR0bV9wb29sX2tvYmpfcmVsZWFzZShzdHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzdHJ1 Y3QgdHRtX3Bvb2xfbWFuYWdlciAqbSA9Ci0JCWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdHRt X3Bvb2xfbWFuYWdlciwga29iaik7Ci0Ja2ZyZWUobSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHR0 bV9wb29sX3N0b3JlKHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYXR0cmlidXRlICph dHRyLCBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKQotewotCXN0cnVjdCB0dG1fcG9v bF9tYW5hZ2VyICptID0KLQkJY29udGFpbmVyX29mKGtvYmosIHN0cnVjdCB0dG1fcG9vbF9tYW5h Z2VyLCBrb2JqKTsKLQlpbnQgY2hhcnM7Ci0JdW5zaWduZWQgdmFsOwotCWNoYXJzID0gc3NjYW5m KGJ1ZmZlciwgIiV1IiwgJnZhbCk7Ci0JaWYgKGNoYXJzID09IDApCi0JCXJldHVybiBzaXplOwot Ci0JLyogQ29udmVydCBrYiB0byBudW1iZXIgb2YgcGFnZXMgKi8KLQl2YWwgPSB2YWwgLyAoUEFH RV9TSVpFID4+IDEwKTsKLQotCWlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX21heCkKLQkJbS0+ b3B0aW9ucy5tYXhfc2l6ZSA9IHZhbDsKLQllbHNlIGlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29s X3NtYWxsKQotCQltLT5vcHRpb25zLnNtYWxsID0gdmFsOwotCWVsc2UgaWYgKGF0dHIgPT0gJnR0 bV9wYWdlX3Bvb2xfYWxsb2Nfc2l6ZSkgewotCQlpZiAodmFsID4gTlVNX1BBR0VTX1RPX0FMTE9D KjgpIHsKLQkJCXByX2VycigiU2V0dGluZyBhbGxvY2F0aW9uIHNpemUgdG8gJWx1IGlzIG5vdCBh bGxvd2VkLiBSZWNvbW1lbmRlZCBzaXplIGlzICVsdVxuIiwKLQkJCSAgICAgICBOVU1fUEFHRVNf VE9fQUxMT0MqKFBBR0VfU0laRSA+PiA3KSwKLQkJCSAgICAgICBOVU1fUEFHRVNfVE9fQUxMT0Mq KFBBR0VfU0laRSA+PiAxMCkpOwotCQkJcmV0dXJuIHNpemU7Ci0JCX0gZWxzZSBpZiAodmFsID4g TlVNX1BBR0VTX1RPX0FMTE9DKSB7Ci0JCQlwcl93YXJuKCJTZXR0aW5nIGFsbG9jYXRpb24gc2l6 ZSB0byBsYXJnZXIgdGhhbiAlbHUgaXMgbm90IHJlY29tbWVuZGVkXG4iLAotCQkJCU5VTV9QQUdF U19UT19BTExPQyooUEFHRV9TSVpFID4+IDEwKSk7Ci0JCX0KLQkJbS0+b3B0aW9ucy5hbGxvY19z aXplID0gdmFsOwotCX0KLQotCXJldHVybiBzaXplOwotfQotCi1zdGF0aWMgc3NpemVfdCB0dG1f cG9vbF9zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAotCQlzdHJ1Y3QgYXR0cmlidXRlICphdHRy LCBjaGFyICpidWZmZXIpCi17Ci0Jc3RydWN0IHR0bV9wb29sX21hbmFnZXIgKm0gPQotCQljb250 YWluZXJfb2Yoa29iaiwgc3RydWN0IHR0bV9wb29sX21hbmFnZXIsIGtvYmopOwotCXVuc2lnbmVk IHZhbCA9IDA7Ci0KLQlpZiAoYXR0ciA9PSAmdHRtX3BhZ2VfcG9vbF9tYXgpCi0JCXZhbCA9IG0t Pm9wdGlvbnMubWF4X3NpemU7Ci0JZWxzZSBpZiAoYXR0ciA9PSAmdHRtX3BhZ2VfcG9vbF9zbWFs bCkKLQkJdmFsID0gbS0+b3B0aW9ucy5zbWFsbDsKLQllbHNlIGlmIChhdHRyID09ICZ0dG1fcGFn ZV9wb29sX2FsbG9jX3NpemUpCi0JCXZhbCA9IG0tPm9wdGlvbnMuYWxsb2Nfc2l6ZTsKLQotCXZh bCA9IHZhbCAqIChQQUdFX1NJWkUgPj4gMTApOwotCi0JcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwg UEFHRV9TSVpFLCAiJXVcbiIsIHZhbCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3lzZnNf b3BzIHR0bV9wb29sX3N5c2ZzX29wcyA9IHsKLQkuc2hvdyA9ICZ0dG1fcG9vbF9zaG93LAotCS5z dG9yZSA9ICZ0dG1fcG9vbF9zdG9yZSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3Qga29ial90eXBlIHR0 bV9wb29sX2tvYmpfdHlwZSA9IHsKLQkucmVsZWFzZSA9ICZ0dG1fcG9vbF9rb2JqX3JlbGVhc2Us Ci0JLnN5c2ZzX29wcyA9ICZ0dG1fcG9vbF9zeXNmc19vcHMsCi0JLmRlZmF1bHRfYXR0cnMgPSB0 dG1fcG9vbF9hdHRycywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAqX21h bmFnZXI7Ci0KLS8qKgotICogU2VsZWN0IHRoZSByaWdodCBwb29sIG9yIHJlcXVlc3RlZCBjYWNo aW5nIHN0YXRlIGFuZCB0dG0gZmxhZ3MuICovCi1zdGF0aWMgc3RydWN0IHR0bV9wYWdlX3Bvb2wg KnR0bV9nZXRfcG9vbChpbnQgZmxhZ3MsIGJvb2wgaHVnZSwKLQkJCQkJICBlbnVtIHR0bV9jYWNo aW5nIGNzdGF0ZSkKLXsKLQlpbnQgcG9vbF9pbmRleDsKLQotCWlmIChjc3RhdGUgPT0gdHRtX2Nh Y2hlZCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAoY3N0YXRlID09IHR0bV93cml0ZV9jb21iaW5l ZCkKLQkJcG9vbF9pbmRleCA9IDB4MDsKLQllbHNlCi0JCXBvb2xfaW5kZXggPSAweDE7Ci0KLQlp ZiAoZmxhZ3MgJiBUVE1fUEFHRV9GTEFHX0RNQTMyKSB7Ci0JCWlmIChodWdlKQotCQkJcmV0dXJu IE5VTEw7Ci0JCXBvb2xfaW5kZXggfD0gMHgyOwotCi0JfSBlbHNlIGlmIChodWdlKSB7Ci0JCXBv b2xfaW5kZXggfD0gMHg0OwotCX0KLQotCXJldHVybiAmX21hbmFnZXItPnBvb2xzW3Bvb2xfaW5k ZXhdOwotfQotCi0vKiBzZXQgbWVtb3J5IGJhY2sgdG8gd2IgYW5kIGZyZWUgdGhlIHBhZ2VzLiAq Lwotc3RhdGljIHZvaWQgdHRtX3BhZ2VzX3B1dChzdHJ1Y3QgcGFnZSAqcGFnZXNbXSwgdW5zaWdu ZWQgbnBhZ2VzLAotCQl1bnNpZ25lZCBpbnQgb3JkZXIpCi17Ci0JdW5zaWduZWQgaW50IGksIHBh Z2VzX25yID0gKDEgPDwgb3JkZXIpOwotCi0JaWYgKG9yZGVyID09IDApIHsKLQkJaWYgKHR0bV9z ZXRfcGFnZXNfYXJyYXlfd2IocGFnZXMsIG5wYWdlcykpCi0JCQlwcl9lcnIoIkZhaWxlZCB0byBz ZXQgJWQgcGFnZXMgdG8gd2IhXG4iLCBucGFnZXMpOwotCX0KLQotCWZvciAoaSA9IDA7IGkgPCBu cGFnZXM7ICsraSkgewotCQlpZiAob3JkZXIgPiAwKSB7Ci0JCQlpZiAodHRtX3NldF9wYWdlc193 YihwYWdlc1tpXSwgcGFnZXNfbnIpKQotCQkJCXByX2VycigiRmFpbGVkIHRvIHNldCAlZCBwYWdl cyB0byB3YiFcbiIsIHBhZ2VzX25yKTsKLQkJfQotCQlfX2ZyZWVfcGFnZXMocGFnZXNbaV0sIG9y ZGVyKTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHR0bV9wb29sX3VwZGF0ZV9mcmVlX2xvY2tlZChz dHJ1Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbCwKLQkJdW5zaWduZWQgZnJlZWRfcGFnZXMpCi17Ci0J cG9vbC0+bnBhZ2VzIC09IGZyZWVkX3BhZ2VzOwotCXBvb2wtPm5mcmVlcyArPSBmcmVlZF9wYWdl czsKLX0KLQotLyoqCi0gKiBGcmVlIHBhZ2VzIGZyb20gcG9vbC4KLSAqCi0gKiBUbyBwcmV2ZW50 IGhvZ2dpbmcgdGhlIHR0bV9zd2FwIHByb2Nlc3Mgd2Ugb25seSBmcmVlIE5VTV9QQUdFU19UT19B TExPQwotICogbnVtYmVyIG9mIHBhZ2VzIGluIG9uZSBnby4KLSAqCi0gKiBAcG9vbDogdG8gZnJl ZSB0aGUgcGFnZXMgZnJvbQotICogQGZyZWVfYWxsOiBJZiBzZXQgdG8gdHJ1ZSB3aWxsIGZyZWUg YWxsIHBhZ2VzIGluIHBvb2wKLSAqIEB1c2Vfc3RhdGljOiBTYWZlIHRvIHVzZSBzdGF0aWMgYnVm ZmVyCi0gKiovCi1zdGF0aWMgaW50IHR0bV9wYWdlX3Bvb2xfZnJlZShzdHJ1Y3QgdHRtX3BhZ2Vf cG9vbCAqcG9vbCwgdW5zaWduZWQgbnJfZnJlZSwKLQkJCSAgICAgIGJvb2wgdXNlX3N0YXRpYykK LXsKLQlzdGF0aWMgc3RydWN0IHBhZ2UgKnN0YXRpY19idWZbTlVNX1BBR0VTX1RPX0FMTE9DXTsK LQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgcGFnZSAqcDsKLQlzdHJ1Y3QgcGFn ZSAqKnBhZ2VzX3RvX2ZyZWU7Ci0JdW5zaWduZWQgZnJlZWRfcGFnZXMgPSAwLAotCQkgbnBhZ2Vz X3RvX2ZyZWUgPSBucl9mcmVlOwotCi0JaWYgKE5VTV9QQUdFU19UT19BTExPQyA8IG5yX2ZyZWUp Ci0JCW5wYWdlc190b19mcmVlID0gTlVNX1BBR0VTX1RPX0FMTE9DOwotCi0JaWYgKHVzZV9zdGF0 aWMpCi0JCXBhZ2VzX3RvX2ZyZWUgPSBzdGF0aWNfYnVmOwotCWVsc2UKLQkJcGFnZXNfdG9fZnJl ZSA9IGttYWxsb2NfYXJyYXkobnBhZ2VzX3RvX2ZyZWUsCi0JCQkJCSAgICAgIHNpemVvZihzdHJ1 Y3QgcGFnZSAqKSwKLQkJCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwYWdlc190b19mcmVl KSB7Ci0JCXByX2RlYnVnKCJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBwb29sIGZyZWUg b3BlcmF0aW9uXG4iKTsKLQkJcmV0dXJuIDA7Ci0JfQotCi1yZXN0YXJ0OgotCXNwaW5fbG9ja19p cnFzYXZlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9y ZXZlcnNlKHAsICZwb29sLT5saXN0LCBscnUpIHsKLQkJaWYgKGZyZWVkX3BhZ2VzID49IG5wYWdl c190b19mcmVlKQotCQkJYnJlYWs7Ci0KLQkJcGFnZXNfdG9fZnJlZVtmcmVlZF9wYWdlcysrXSA9 IHA7Ci0JCS8qIFdlIGNhbiBvbmx5IHJlbW92ZSBOVU1fUEFHRVNfVE9fQUxMT0MgYXQgYSB0aW1l LiAqLwotCQlpZiAoZnJlZWRfcGFnZXMgPj0gTlVNX1BBR0VTX1RPX0FMTE9DKSB7Ci0JCQkvKiBy ZW1vdmUgcmFuZ2Ugb2YgcGFnZXMgZnJvbSB0aGUgcG9vbCAqLwotCQkJX19saXN0X2RlbChwLT5s cnUucHJldiwgJnBvb2wtPmxpc3QpOwotCi0JCQl0dG1fcG9vbF91cGRhdGVfZnJlZV9sb2NrZWQo cG9vbCwgZnJlZWRfcGFnZXMpOwotCQkJLyoqCi0JCQkgKiBCZWNhdXNlIGNoYW5naW5nIHBhZ2Ug Y2FjaGluZyBpcyBjb3N0bHkKLQkJCSAqIHdlIHVubG9jayB0aGUgcG9vbCB0byBwcmV2ZW50IHN0 YWxsaW5nLgotCQkJICovCi0JCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBp cnFfZmxhZ3MpOwotCi0JCQl0dG1fcGFnZXNfcHV0KHBhZ2VzX3RvX2ZyZWUsIGZyZWVkX3BhZ2Vz LCBwb29sLT5vcmRlcik7Ci0JCQlpZiAobGlrZWx5KG5yX2ZyZWUgIT0gRlJFRV9BTExfUEFHRVMp KQotCQkJCW5yX2ZyZWUgLT0gZnJlZWRfcGFnZXM7Ci0KLQkJCWlmIChOVU1fUEFHRVNfVE9fQUxM T0MgPj0gbnJfZnJlZSkKLQkJCQlucGFnZXNfdG9fZnJlZSA9IG5yX2ZyZWU7Ci0JCQllbHNlCi0J CQkJbnBhZ2VzX3RvX2ZyZWUgPSBOVU1fUEFHRVNfVE9fQUxMT0M7Ci0KLQkJCWZyZWVkX3BhZ2Vz ID0gMDsKLQotCQkJLyogZnJlZSBhbGwgc28gcmVzdGFydCB0aGUgcHJvY2Vzc2luZyAqLwotCQkJ aWYgKG5yX2ZyZWUpCi0JCQkJZ290byByZXN0YXJ0OwotCi0JCQkvKiBOb3QgYWxsb3dlZCB0byBm YWxsIHRocm91Z2ggb3IgYnJlYWsgYmVjYXVzZQotCQkJICogZm9sbG93aW5nIGNvbnRleHQgaXMg aW5zaWRlIHNwaW5sb2NrIHdoaWxlIHdlIGFyZQotCQkJICogb3V0c2lkZSBoZXJlLgotCQkJICov Ci0JCQlnb3RvIG91dDsKLQotCQl9Ci0JfQotCi0JLyogcmVtb3ZlIHJhbmdlIG9mIHBhZ2VzIGZy b20gdGhlIHBvb2wgKi8KLQlpZiAoZnJlZWRfcGFnZXMpIHsKLQkJX19saXN0X2RlbCgmcC0+bHJ1 LCAmcG9vbC0+bGlzdCk7Ci0KLQkJdHRtX3Bvb2xfdXBkYXRlX2ZyZWVfbG9ja2VkKHBvb2wsIGZy ZWVkX3BhZ2VzKTsKLQkJbnJfZnJlZSAtPSBmcmVlZF9wYWdlczsKLQl9Ci0KLQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOwotCi0JaWYgKGZyZWVkX3BhZ2Vz KQotCQl0dG1fcGFnZXNfcHV0KHBhZ2VzX3RvX2ZyZWUsIGZyZWVkX3BhZ2VzLCBwb29sLT5vcmRl cik7Ci1vdXQ6Ci0JaWYgKHBhZ2VzX3RvX2ZyZWUgIT0gc3RhdGljX2J1ZikKLQkJa2ZyZWUocGFn ZXNfdG9fZnJlZSk7Ci0JcmV0dXJuIG5yX2ZyZWU7Ci19Ci0KLS8qKgotICogQ2FsbGJhY2sgZm9y IG1tIHRvIHJlcXVlc3QgcG9vbCB0byByZWR1Y2UgbnVtYmVyIG9mIHBhZ2UgaGVsZC4KLSAqCi0g KiBYWFg6IChkY2hpbm5lcikgRGVhZGxvY2sgd2FybmluZyEKLSAqCi0gKiBUaGlzIGNvZGUgaXMg Y3J5aW5nIG91dCBmb3IgYSBzaHJpbmtlciBwZXIgcG9vbC4uLi4KLSAqLwotc3RhdGljIHVuc2ln bmVkIGxvbmcKLXR0bV9wb29sX3Nocmlua19zY2FuKHN0cnVjdCBzaHJpbmtlciAqc2hyaW5rLCBz dHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQotewotCXN0YXRpYyBERUZJTkVfTVVURVgobG9jayk7 Ci0Jc3RhdGljIHVuc2lnbmVkIHN0YXJ0X3Bvb2w7Ci0JdW5zaWduZWQgaTsKLQl1bnNpZ25lZCBw b29sX29mZnNldDsKLQlzdHJ1Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbDsKLQlpbnQgc2hyaW5rX3Bh Z2VzID0gc2MtPm5yX3RvX3NjYW47Ci0JdW5zaWduZWQgbG9uZyBmcmVlZCA9IDA7Ci0JdW5zaWdu ZWQgaW50IG5yX2ZyZWVfcG9vbDsKLQotCWlmICghbXV0ZXhfdHJ5bG9jaygmbG9jaykpCi0JCXJl dHVybiBTSFJJTktfU1RPUDsKLQlwb29sX29mZnNldCA9ICsrc3RhcnRfcG9vbCAlIE5VTV9QT09M UzsKLQkvKiBzZWxlY3Qgc3RhcnQgcG9vbCBpbiByb3VuZCByb2JpbiBmYXNoaW9uICovCi0JZm9y IChpID0gMDsgaSA8IE5VTV9QT09MUzsgKytpKSB7Ci0JCXVuc2lnbmVkIG5yX2ZyZWUgPSBzaHJp bmtfcGFnZXM7Ci0JCXVuc2lnbmVkIHBhZ2VfbnI7Ci0KLQkJaWYgKHNocmlua19wYWdlcyA9PSAw KQotCQkJYnJlYWs7Ci0KLQkJcG9vbCA9ICZfbWFuYWdlci0+cG9vbHNbKGkgKyBwb29sX29mZnNl dCklTlVNX1BPT0xTXTsKLQkJcGFnZV9uciA9ICgxIDw8IHBvb2wtPm9yZGVyKTsKLQkJLyogT0sg dG8gdXNlIHN0YXRpYyBidWZmZXIgc2luY2UgZ2xvYmFsIG11dGV4IGlzIGhlbGQuICovCi0JCW5y X2ZyZWVfcG9vbCA9IHJvdW5kdXAobnJfZnJlZSwgcGFnZV9ucikgPj4gcG9vbC0+b3JkZXI7Ci0J CXNocmlua19wYWdlcyA9IHR0bV9wYWdlX3Bvb2xfZnJlZShwb29sLCBucl9mcmVlX3Bvb2wsIHRy dWUpOwotCQlmcmVlZCArPSAobnJfZnJlZV9wb29sIC0gc2hyaW5rX3BhZ2VzKSA8PCBwb29sLT5v cmRlcjsKLQkJaWYgKGZyZWVkID49IHNjLT5ucl90b19zY2FuKQotCQkJYnJlYWs7Ci0JCXNocmlu a19wYWdlcyA8PD0gcG9vbC0+b3JkZXI7Ci0JfQotCW11dGV4X3VubG9jaygmbG9jayk7Ci0JcmV0 dXJuIGZyZWVkOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi10dG1fcG9vbF9zaHJpbmtf Y291bnQoc3RydWN0IHNocmlua2VyICpzaHJpbmssIHN0cnVjdCBzaHJpbmtfY29udHJvbCAqc2Mp Ci17Ci0JdW5zaWduZWQgaTsKLQl1bnNpZ25lZCBsb25nIGNvdW50ID0gMDsKLQlzdHJ1Y3QgdHRt X3BhZ2VfcG9vbCAqcG9vbDsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fUE9PTFM7ICsraSkgewot CQlwb29sID0gJl9tYW5hZ2VyLT5wb29sc1tpXTsKLQkJY291bnQgKz0gKHBvb2wtPm5wYWdlcyA8 PCBwb29sLT5vcmRlcik7Ci0JfQotCi0JcmV0dXJuIGNvdW50OwotfQotCi1zdGF0aWMgaW50IHR0 bV9wb29sX21tX3Nocmlua19pbml0KHN0cnVjdCB0dG1fcG9vbF9tYW5hZ2VyICptYW5hZ2VyKQot ewotCW1hbmFnZXItPm1tX3Nocmluay5jb3VudF9vYmplY3RzID0gdHRtX3Bvb2xfc2hyaW5rX2Nv dW50OwotCW1hbmFnZXItPm1tX3Nocmluay5zY2FuX29iamVjdHMgPSB0dG1fcG9vbF9zaHJpbmtf c2NhbjsKLQltYW5hZ2VyLT5tbV9zaHJpbmsuc2Vla3MgPSAxOwotCXJldHVybiByZWdpc3Rlcl9z aHJpbmtlcigmbWFuYWdlci0+bW1fc2hyaW5rKTsKLX0KLQotc3RhdGljIHZvaWQgdHRtX3Bvb2xf bW1fc2hyaW5rX2Zpbmkoc3RydWN0IHR0bV9wb29sX21hbmFnZXIgKm1hbmFnZXIpCi17Ci0JdW5y ZWdpc3Rlcl9zaHJpbmtlcigmbWFuYWdlci0+bW1fc2hyaW5rKTsKLX0KLQotc3RhdGljIGludCB0 dG1fc2V0X3BhZ2VzX2NhY2hpbmcoc3RydWN0IHBhZ2UgKipwYWdlcywKLQkJZW51bSB0dG1fY2Fj aGluZyBjc3RhdGUsIHVuc2lnbmVkIGNwYWdlcykKLXsKLQlpbnQgciA9IDA7Ci0JLyogU2V0IHBh Z2UgY2FjaGluZyAqLwotCXN3aXRjaCAoY3N0YXRlKSB7Ci0JY2FzZSB0dG1fdW5jYWNoZWQ6Ci0J CXIgPSB0dG1fc2V0X3BhZ2VzX2FycmF5X3VjKHBhZ2VzLCBjcGFnZXMpOwotCQlpZiAocikKLQkJ CXByX2VycigiRmFpbGVkIHRvIHNldCAlZCBwYWdlcyB0byB1YyFcbiIsIGNwYWdlcyk7Ci0JCWJy ZWFrOwotCWNhc2UgdHRtX3dyaXRlX2NvbWJpbmVkOgotCQlyID0gdHRtX3NldF9wYWdlc19hcnJh eV93YyhwYWdlcywgY3BhZ2VzKTsKLQkJaWYgKHIpCi0JCQlwcl9lcnIoIkZhaWxlZCB0byBzZXQg JWQgcGFnZXMgdG8gd2MhXG4iLCBjcGFnZXMpOwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlicmVh azsKLQl9Ci0JcmV0dXJuIHI7Ci19Ci0KLS8qKgotICogRnJlZSBwYWdlcyB0aGUgcGFnZXMgdGhh dCBmYWlsZWQgdG8gY2hhbmdlIHRoZSBjYWNoaW5nIHN0YXRlLiBJZiB0aGVyZSBpcwotICogYW55 IHBhZ2VzIHRoYXQgaGF2ZSBjaGFuZ2VkIHRoZWlyIGNhY2hpbmcgc3RhdGUgYWxyZWFkeSBwdXQg dGhlbSB0byB0aGUKLSAqIHBvb2wuCi0gKi8KLXN0YXRpYyB2b2lkIHR0bV9oYW5kbGVfY2FjaGlu Z19mYWlsdXJlKHN0cnVjdCBwYWdlICoqZmFpbGVkX3BhZ2VzLAotCQkJCSAgICAgICB1bnNpZ25l ZCBjcGFnZXMpCi17Ci0JdW5zaWduZWQgaTsKLQotCS8qIEZhaWxlZCBwYWdlcyBoYXZlIHRvIGJl IGZyZWVkICovCi0JZm9yIChpID0gMDsgaSA8IGNwYWdlczsgKytpKSB7Ci0JCWxpc3RfZGVsKCZm YWlsZWRfcGFnZXNbaV0tPmxydSk7Ci0JCV9fZnJlZV9wYWdlKGZhaWxlZF9wYWdlc1tpXSk7Ci0J fQotfQotCi0vKioKLSAqIEFsbG9jYXRlIG5ldyBwYWdlcyB3aXRoIGNvcnJlY3QgY2FjaGluZy4K LSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIHJlZW50cmFudCBpZiBjYWxsZXIgdXBkYXRlcyBjb3Vu dCBkZXBlbmRpbmcgb24gbnVtYmVyIG9mCi0gKiBwYWdlcyByZXR1cm5lZCBpbiBwYWdlcyBhcnJh eS4KLSAqLwotc3RhdGljIGludCB0dG1fYWxsb2NfbmV3X3BhZ2VzKHN0cnVjdCBsaXN0X2hlYWQg KnBhZ2VzLCBnZnBfdCBnZnBfZmxhZ3MsCi0JCQkgICAgICAgaW50IHR0bV9mbGFncywgZW51bSB0 dG1fY2FjaGluZyBjc3RhdGUsCi0JCQkgICAgICAgdW5zaWduZWQgY291bnQsIHVuc2lnbmVkIG9y ZGVyKQotewotCXN0cnVjdCBwYWdlICoqY2FjaGluZ19hcnJheTsKLQlzdHJ1Y3QgcGFnZSAqcDsK LQlpbnQgciA9IDA7Ci0JdW5zaWduZWQgaSwgaiwgY3BhZ2VzOwotCXVuc2lnbmVkIG5wYWdlcyA9 IDEgPDwgb3JkZXI7Ci0JdW5zaWduZWQgbWF4X2NwYWdlcyA9IG1pbihjb3VudCA8PCBvcmRlciwg KHVuc2lnbmVkKU5VTV9QQUdFU19UT19BTExPQyk7Ci0KLQkvKiBhbGxvY2F0ZSBhcnJheSBmb3Ig cGFnZSBjYWNoaW5nIGNoYW5nZSAqLwotCWNhY2hpbmdfYXJyYXkgPSBrbWFsbG9jX2FycmF5KG1h eF9jcGFnZXMsIHNpemVvZihzdHJ1Y3QgcGFnZSAqKSwKLQkJCQkgICAgICBHRlBfS0VSTkVMKTsK LQotCWlmICghY2FjaGluZ19hcnJheSkgewotCQlwcl9kZWJ1ZygiVW5hYmxlIHRvIGFsbG9jYXRl IHRhYmxlIGZvciBuZXcgcGFnZXNcbiIpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlmb3Ig KGkgPSAwLCBjcGFnZXMgPSAwOyBpIDwgY291bnQ7ICsraSkgewotCQlwID0gYWxsb2NfcGFnZXMo Z2ZwX2ZsYWdzLCBvcmRlcik7Ci0KLQkJaWYgKCFwKSB7Ci0JCQlwcl9kZWJ1ZygiVW5hYmxlIHRv IGdldCBwYWdlICV1XG4iLCBpKTsKLQotCQkJLyogc3RvcmUgYWxyZWFkeSBhbGxvY2F0ZWQgcGFn ZXMgaW4gdGhlIHBvb2wgYWZ0ZXIKLQkJCSAqIHNldHRpbmcgdGhlIGNhY2hpbmcgc3RhdGUgKi8K LQkJCWlmIChjcGFnZXMpIHsKLQkJCQlyID0gdHRtX3NldF9wYWdlc19jYWNoaW5nKGNhY2hpbmdf YXJyYXksCi0JCQkJCQkJICBjc3RhdGUsIGNwYWdlcyk7Ci0JCQkJaWYgKHIpCi0JCQkJCXR0bV9o YW5kbGVfY2FjaGluZ19mYWlsdXJlKGNhY2hpbmdfYXJyYXksCi0JCQkJCQkJCSAgIGNwYWdlcyk7 Ci0JCQl9Ci0JCQlyID0gLUVOT01FTTsKLQkJCWdvdG8gb3V0OwotCQl9Ci0KLQkJbGlzdF9hZGQo JnAtPmxydSwgcGFnZXMpOwotCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkJLyogZ2ZwIGZsYWdz IG9mIGhpZ2htZW0gcGFnZSBzaG91bGQgbmV2ZXIgYmUgZG1hMzIgc28gd2UKLQkJICogd2Ugc2hv dWxkIGJlIGZpbmUgaW4gc3VjaCBjYXNlCi0JCSAqLwotCQlpZiAoUGFnZUhpZ2hNZW0ocCkpCi0J CQljb250aW51ZTsKLQotI2VuZGlmCi0JCWZvciAoaiA9IDA7IGogPCBucGFnZXM7ICsraikgewot CQkJY2FjaGluZ19hcnJheVtjcGFnZXMrK10gPSBwKys7Ci0JCQlpZiAoY3BhZ2VzID09IG1heF9j cGFnZXMpIHsKLQotCQkJCXIgPSB0dG1fc2V0X3BhZ2VzX2NhY2hpbmcoY2FjaGluZ19hcnJheSwK LQkJCQkJCWNzdGF0ZSwgY3BhZ2VzKTsKLQkJCQlpZiAocikgewotCQkJCQl0dG1faGFuZGxlX2Nh Y2hpbmdfZmFpbHVyZShjYWNoaW5nX2FycmF5LAotCQkJCQkJCQkgICBjcGFnZXMpOwotCQkJCQln b3RvIG91dDsKLQkJCQl9Ci0JCQkJY3BhZ2VzID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCWlmIChj cGFnZXMpIHsKLQkJciA9IHR0bV9zZXRfcGFnZXNfY2FjaGluZyhjYWNoaW5nX2FycmF5LCBjc3Rh dGUsIGNwYWdlcyk7Ci0JCWlmIChyKQotCQkJdHRtX2hhbmRsZV9jYWNoaW5nX2ZhaWx1cmUoY2Fj aGluZ19hcnJheSwgY3BhZ2VzKTsKLQl9Ci1vdXQ6Ci0Ja2ZyZWUoY2FjaGluZ19hcnJheSk7Ci0K LQlyZXR1cm4gcjsKLX0KLQotLyoqCi0gKiBGaWxsIHRoZSBnaXZlbiBwb29sIGlmIHRoZXJlIGFy ZW4ndCBlbm91Z2ggcGFnZXMgYW5kIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mCi0gKiBwYWdlcyBp cyBzbWFsbC4KLSAqLwotc3RhdGljIHZvaWQgdHRtX3BhZ2VfcG9vbF9maWxsX2xvY2tlZChzdHJ1 Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbCwgaW50IHR0bV9mbGFncywKLQkJCQkgICAgICBlbnVtIHR0 bV9jYWNoaW5nIGNzdGF0ZSwKLQkJCQkgICAgICB1bnNpZ25lZCBjb3VudCwgdW5zaWduZWQgbG9u ZyAqaXJxX2ZsYWdzKQotewotCXN0cnVjdCBwYWdlICpwOwotCWludCByOwotCXVuc2lnbmVkIGNw YWdlcyA9IDA7Ci0JLyoqCi0JICogT25seSBhbGxvdyBvbmUgcG9vbCBmaWxsIG9wZXJhdGlvbiBh dCBhIHRpbWUuCi0JICogSWYgcG9vbCBkb2Vzbid0IGhhdmUgZW5vdWdoIHBhZ2VzIGZvciB0aGUg YWxsb2NhdGlvbiBuZXcgcGFnZXMgYXJlCi0JICogYWxsb2NhdGVkIGZyb20gb3V0c2lkZSBvZiBw b29sLgotCSAqLwotCWlmIChwb29sLT5maWxsX2xvY2spCi0JCXJldHVybjsKLQotCXBvb2wtPmZp bGxfbG9jayA9IHRydWU7Ci0KLQkvKiBJZiBhbGxvY2F0aW9uIHJlcXVlc3QgaXMgc21hbGwgYW5k IHRoZXJlIGFyZSBub3QgZW5vdWdoCi0JICogcGFnZXMgaW4gYSBwb29sIHdlIGZpbGwgdGhlIHBv b2wgdXAgZmlyc3QuICovCi0JaWYgKGNvdW50IDwgX21hbmFnZXItPm9wdGlvbnMuc21hbGwKLQkJ JiYgY291bnQgPiBwb29sLT5ucGFnZXMpIHsKLQkJc3RydWN0IGxpc3RfaGVhZCBuZXdfcGFnZXM7 Ci0JCXVuc2lnbmVkIGFsbG9jX3NpemUgPSBfbWFuYWdlci0+b3B0aW9ucy5hbGxvY19zaXplOwot Ci0JCS8qKgotCQkgKiBDYW4ndCBjaGFuZ2UgcGFnZSBjYWNoaW5nIGlmIGluIGlycXNhdmUgY29u dGV4dC4gV2UgaGF2ZSB0bwotCQkgKiBkcm9wIHRoZSBwb29sLT5sb2NrLgotCQkgKi8KLQkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgKmlycV9mbGFncyk7Ci0KLQkJSU5JVF9M SVNUX0hFQUQoJm5ld19wYWdlcyk7Ci0JCXIgPSB0dG1fYWxsb2NfbmV3X3BhZ2VzKCZuZXdfcGFn ZXMsIHBvb2wtPmdmcF9mbGFncywgdHRtX2ZsYWdzLAotCQkJCQljc3RhdGUsIGFsbG9jX3NpemUs IDApOwotCQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+bG9jaywgKmlycV9mbGFncyk7Ci0KLQkJ aWYgKCFyKSB7Ci0JCQlsaXN0X3NwbGljZSgmbmV3X3BhZ2VzLCAmcG9vbC0+bGlzdCk7Ci0JCQkr K3Bvb2wtPm5yZWZpbGxzOwotCQkJcG9vbC0+bnBhZ2VzICs9IGFsbG9jX3NpemU7Ci0JCX0gZWxz ZSB7Ci0JCQlwcl9kZWJ1ZygiRmFpbGVkIHRvIGZpbGwgcG9vbCAoJXApXG4iLCBwb29sKTsKLQkJ CS8qIElmIHdlIGhhdmUgYW55IHBhZ2VzIGxlZnQgcHV0IHRoZW0gdG8gdGhlIHBvb2wuICovCi0J CQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZuZXdfcGFnZXMsIGxydSkgewotCQkJCSsrY3BhZ2Vz OwotCQkJfQotCQkJbGlzdF9zcGxpY2UoJm5ld19wYWdlcywgJnBvb2wtPmxpc3QpOwotCQkJcG9v bC0+bnBhZ2VzICs9IGNwYWdlczsKLQkJfQotCi0JfQotCXBvb2wtPmZpbGxfbG9jayA9IGZhbHNl OwotfQotCi0vKioKLSAqIEFsbG9jYXRlIHBhZ2VzIGZyb20gdGhlIHBvb2wgYW5kIHB1dCB0aGVt IG9uIHRoZSByZXR1cm4gbGlzdC4KLSAqCi0gKiBAcmV0dXJuIHplcm8gZm9yIHN1Y2Nlc3Mgb3Ig bmVnYXRpdmUgZXJyb3IgY29kZS4KLSAqLwotc3RhdGljIGludCB0dG1fcGFnZV9wb29sX2dldF9w YWdlcyhzdHJ1Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbCwKLQkJCQkgICBzdHJ1Y3QgbGlzdF9oZWFk ICpwYWdlcywKLQkJCQkgICBpbnQgdHRtX2ZsYWdzLAotCQkJCSAgIGVudW0gdHRtX2NhY2hpbmcg Y3N0YXRlLAotCQkJCSAgIHVuc2lnbmVkIGNvdW50LCB1bnNpZ25lZCBvcmRlcikKLXsKLQl1bnNp Z25lZCBsb25nIGlycV9mbGFnczsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpwOwotCXVuc2lnbmVkIGk7 Ci0JaW50IHIgPSAwOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssIGlycV9mbGFn cyk7Ci0JaWYgKCFvcmRlcikKLQkJdHRtX3BhZ2VfcG9vbF9maWxsX2xvY2tlZChwb29sLCB0dG1f ZmxhZ3MsIGNzdGF0ZSwgY291bnQsCi0JCQkJCSAgJmlycV9mbGFncyk7Ci0KLQlpZiAoY291bnQg Pj0gcG9vbC0+bnBhZ2VzKSB7Ci0JCS8qIHRha2UgYWxsIHBhZ2VzIGZyb20gdGhlIHBvb2wgKi8K LQkJbGlzdF9zcGxpY2VfaW5pdCgmcG9vbC0+bGlzdCwgcGFnZXMpOwotCQljb3VudCAtPSBwb29s LT5ucGFnZXM7Ci0JCXBvb2wtPm5wYWdlcyA9IDA7Ci0JCWdvdG8gb3V0OwotCX0KLQkvKiBmaW5k IHRoZSBsYXN0IHBhZ2VzIHRvIGluY2x1ZGUgZm9yIHJlcXVlc3RlZCBudW1iZXIgb2YgcGFnZXMu IFNwbGl0Ci0JICogcG9vbCB0byBiZWdpbiBhbmQgaGFsdmUgaXQgdG8gcmVkdWNlIHNlYXJjaCBz cGFjZS4gKi8KLQlpZiAoY291bnQgPD0gcG9vbC0+bnBhZ2VzLzIpIHsKLQkJaSA9IDA7Ci0JCWxp c3RfZm9yX2VhY2gocCwgJnBvb2wtPmxpc3QpIHsKLQkJCWlmICgrK2kgPT0gY291bnQpCi0JCQkJ YnJlYWs7Ci0JCX0KLQl9IGVsc2UgewotCQlpID0gcG9vbC0+bnBhZ2VzICsgMTsKLQkJbGlzdF9m b3JfZWFjaF9wcmV2KHAsICZwb29sLT5saXN0KSB7Ci0JCQlpZiAoLS1pID09IGNvdW50KQotCQkJ CWJyZWFrOwotCQl9Ci0JfQotCS8qIEN1dCAnY291bnQnIG51bWJlciBvZiBwYWdlcyBmcm9tIHRo ZSBwb29sICovCi0JbGlzdF9jdXRfcG9zaXRpb24ocGFnZXMsICZwb29sLT5saXN0LCBwKTsKLQlw b29sLT5ucGFnZXMgLT0gY291bnQ7Ci0JY291bnQgPSAwOwotb3V0OgotCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnBvb2wtPmxvY2ssIGlycV9mbGFncyk7Ci0KLQkvKiBjbGVhciB0aGUgcGFnZXMg Y29taW5nIGZyb20gdGhlIHBvb2wgaWYgcmVxdWVzdGVkICovCi0JaWYgKHR0bV9mbGFncyAmIFRU TV9QQUdFX0ZMQUdfWkVST19BTExPQykgewotCQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQotCQlsaXN0 X2Zvcl9lYWNoX2VudHJ5KHBhZ2UsIHBhZ2VzLCBscnUpIHsKLQkJCWlmIChQYWdlSGlnaE1lbShw YWdlKSkKLQkJCQljbGVhcl9oaWdocGFnZShwYWdlKTsKLQkJCWVsc2UKLQkJCQljbGVhcl9wYWdl KHBhZ2VfYWRkcmVzcyhwYWdlKSk7Ci0JCX0KLQl9Ci0KLQkvKiBJZiBwb29sIGRpZG4ndCBoYXZl IGVub3VnaCBwYWdlcyBhbGxvY2F0ZSBuZXcgb25lLiAqLwotCWlmIChjb3VudCkgewotCQlnZnBf dCBnZnBfZmxhZ3MgPSBwb29sLT5nZnBfZmxhZ3M7Ci0KLQkJLyogc2V0IHplcm8gZmxhZyBmb3Ig cGFnZSBhbGxvY2F0aW9uIGlmIHJlcXVpcmVkICovCi0JCWlmICh0dG1fZmxhZ3MgJiBUVE1fUEFH RV9GTEFHX1pFUk9fQUxMT0MpCi0JCQlnZnBfZmxhZ3MgfD0gX19HRlBfWkVSTzsKLQotCQlpZiAo dHRtX2ZsYWdzICYgVFRNX1BBR0VfRkxBR19OT19SRVRSWSkKLQkJCWdmcF9mbGFncyB8PSBfX0dG UF9SRVRSWV9NQVlGQUlMOwotCi0JCS8qIHR0bV9hbGxvY19uZXdfcGFnZXMgZG9lc24ndCByZWZl cmVuY2UgcG9vbCBzbyB3ZSBjYW4gcnVuCi0JCSAqIG11bHRpcGxlIHJlcXVlc3RzIGluIHBhcmFs bGVsLgotCQkgKiovCi0JCXIgPSB0dG1fYWxsb2NfbmV3X3BhZ2VzKHBhZ2VzLCBnZnBfZmxhZ3Ms IHR0bV9mbGFncywgY3N0YXRlLAotCQkJCQljb3VudCwgb3JkZXIpOwotCX0KLQotCXJldHVybiBy OwotfQotCi0vKiBQdXQgYWxsIHBhZ2VzIGluIHBhZ2VzIGxpc3QgdG8gY29ycmVjdCBwb29sIHRv IHdhaXQgZm9yIHJldXNlICovCi1zdGF0aWMgdm9pZCB0dG1fcHV0X3BhZ2VzKHN0cnVjdCBwYWdl ICoqcGFnZXMsIHVuc2lnbmVkIG5wYWdlcywgaW50IGZsYWdzLAotCQkJICBlbnVtIHR0bV9jYWNo aW5nIGNzdGF0ZSkKLXsKLQlzdHJ1Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbCA9IHR0bV9nZXRfcG9v bChmbGFncywgZmFsc2UsIGNzdGF0ZSk7Ci0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQ QUdFCi0Jc3RydWN0IHR0bV9wYWdlX3Bvb2wgKmh1Z2UgPSB0dG1fZ2V0X3Bvb2woZmxhZ3MsIHRy dWUsIGNzdGF0ZSk7Ci0jZW5kaWYKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLQl1bnNpZ25l ZCBpOwotCi0JaWYgKHBvb2wgPT0gTlVMTCkgewotCQkvKiBObyBwb29sIGZvciB0aGlzIG1lbW9y eSB0eXBlIHNvIGZyZWUgdGhlIHBhZ2VzICovCi0JCWkgPSAwOwotCQl3aGlsZSAoaSA8IG5wYWdl cykgewotI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQotCQkJc3RydWN0IHBhZ2Ug KnAgPSBwYWdlc1tpXTsKLSNlbmRpZgotCQkJdW5zaWduZWQgb3JkZXIgPSAwLCBqOwotCi0JCQlp ZiAoIXBhZ2VzW2ldKSB7Ci0JCQkJKytpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0jaWZkZWYg Q09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCi0JCQlpZiAoIShmbGFncyAmIFRUTV9QQUdFX0ZM QUdfRE1BMzIpICYmCi0JCQkgICAgKG5wYWdlcyAtIGkpID49IEhQQUdFX1BNRF9OUikgewotCQkJ CWZvciAoaiA9IDE7IGogPCBIUEFHRV9QTURfTlI7ICsraikKLQkJCQkJaWYgKCsrcCAhPSBwYWdl c1tpICsgal0pCi0JCQkJCSAgICBicmVhazsKLQotCQkJCWlmIChqID09IEhQQUdFX1BNRF9OUikK LQkJCQkJb3JkZXIgPSBIUEFHRV9QTURfT1JERVI7Ci0JCQl9Ci0jZW5kaWYKLQotCQkJaWYgKHBh Z2VfY291bnQocGFnZXNbaV0pICE9IDEpCi0JCQkJcHJfZXJyKCJFcnJvbmVvdXMgcGFnZSBjb3Vu dC4gTGVha2luZyBwYWdlcy5cbiIpOwotCQkJX19mcmVlX3BhZ2VzKHBhZ2VzW2ldLCBvcmRlcik7 Ci0KLQkJCWogPSAxIDw8IG9yZGVyOwotCQkJd2hpbGUgKGopIHsKLQkJCQlwYWdlc1tpKytdID0g TlVMTDsKLQkJCQktLWo7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuOwotCX0KLQotCWkgPSAwOwotI2lm ZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQotCWlmIChodWdlKSB7Ci0JCXVuc2lnbmVk IG1heF9zaXplLCBuMmZyZWU7Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmh1Z2UtPmxvY2ssIGly cV9mbGFncyk7Ci0JCXdoaWxlICgobnBhZ2VzIC0gaSkgPj0gSFBBR0VfUE1EX05SKSB7Ci0JCQlz dHJ1Y3QgcGFnZSAqcCA9IHBhZ2VzW2ldOwotCQkJdW5zaWduZWQgajsKLQotCQkJaWYgKCFwKQot CQkJCWJyZWFrOwotCi0JCQlmb3IgKGogPSAxOyBqIDwgSFBBR0VfUE1EX05SOyArK2opCi0JCQkJ aWYgKCsrcCAhPSBwYWdlc1tpICsgal0pCi0JCQkJICAgIGJyZWFrOwotCi0JCQlpZiAoaiAhPSBI UEFHRV9QTURfTlIpCi0JCQkJYnJlYWs7Ci0KLQkJCWxpc3RfYWRkX3RhaWwoJnBhZ2VzW2ldLT5s cnUsICZodWdlLT5saXN0KTsKLQotCQkJZm9yIChqID0gMDsgaiA8IEhQQUdFX1BNRF9OUjsgKytq KQotCQkJCXBhZ2VzW2krK10gPSBOVUxMOwotCQkJaHVnZS0+bnBhZ2VzKys7Ci0JCX0KLQotCQkv KiBDaGVjayB0aGF0IHdlIGRvbid0IGdvIG92ZXIgdGhlIHBvb2wgbGltaXQgKi8KLQkJbWF4X3Np emUgPSBfbWFuYWdlci0+b3B0aW9ucy5tYXhfc2l6ZTsKLQkJbWF4X3NpemUgLz0gSFBBR0VfUE1E X05SOwotCQlpZiAoaHVnZS0+bnBhZ2VzID4gbWF4X3NpemUpCi0JCQluMmZyZWUgPSBodWdlLT5u cGFnZXMgLSBtYXhfc2l6ZTsKLQkJZWxzZQotCQkJbjJmcmVlID0gMDsKLQkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmaHVnZS0+bG9jaywgaXJxX2ZsYWdzKTsKLQkJaWYgKG4yZnJlZSkKLQkJCXR0 bV9wYWdlX3Bvb2xfZnJlZShodWdlLCBuMmZyZWUsIGZhbHNlKTsKLQl9Ci0jZW5kaWYKLQotCXNw aW5fbG9ja19pcnFzYXZlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOwotCXdoaWxlIChpIDwgbnBh Z2VzKSB7Ci0JCWlmIChwYWdlc1tpXSkgewotCQkJaWYgKHBhZ2VfY291bnQocGFnZXNbaV0pICE9 IDEpCi0JCQkJcHJfZXJyKCJFcnJvbmVvdXMgcGFnZSBjb3VudC4gTGVha2luZyBwYWdlcy5cbiIp OwotCQkJbGlzdF9hZGRfdGFpbCgmcGFnZXNbaV0tPmxydSwgJnBvb2wtPmxpc3QpOwotCQkJcGFn ZXNbaV0gPSBOVUxMOwotCQkJcG9vbC0+bnBhZ2VzKys7Ci0JCX0KLQkJKytpOwotCX0KLQkvKiBD aGVjayB0aGF0IHdlIGRvbid0IGdvIG92ZXIgdGhlIHBvb2wgbGltaXQgKi8KLQlucGFnZXMgPSAw OwotCWlmIChwb29sLT5ucGFnZXMgPiBfbWFuYWdlci0+b3B0aW9ucy5tYXhfc2l6ZSkgewotCQlu cGFnZXMgPSBwb29sLT5ucGFnZXMgLSBfbWFuYWdlci0+b3B0aW9ucy5tYXhfc2l6ZTsKLQkJLyog ZnJlZSBhdCBsZWFzdCBOVU1fUEFHRVNfVE9fQUxMT0MgbnVtYmVyIG9mIHBhZ2VzCi0JCSAqIHRv IHJlZHVjZSBjYWxscyB0byBzZXRfbWVtb3J5X3diICovCi0JCWlmIChucGFnZXMgPCBOVU1fUEFH RVNfVE9fQUxMT0MpCi0JCQlucGFnZXMgPSBOVU1fUEFHRVNfVE9fQUxMT0M7Ci0JfQotCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxvY2ssIGlycV9mbGFncyk7Ci0JaWYgKG5wYWdlcykK LQkJdHRtX3BhZ2VfcG9vbF9mcmVlKHBvb2wsIG5wYWdlcywgZmFsc2UpOwotfQotCi0vKgotICog T24gc3VjY2VzcyBwYWdlcyBsaXN0IHdpbGwgaG9sZCBjb3VudCBudW1iZXIgb2YgY29ycmVjdGx5 Ci0gKiBjYWNoZWQgcGFnZXMuCi0gKi8KLXN0YXRpYyBpbnQgdHRtX2dldF9wYWdlcyhzdHJ1Y3Qg cGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBucGFnZXMsIGludCBmbGFncywKLQkJCSBlbnVtIHR0bV9j YWNoaW5nIGNzdGF0ZSkKLXsKLQlzdHJ1Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbCA9IHR0bV9nZXRf cG9vbChmbGFncywgZmFsc2UsIGNzdGF0ZSk7Ci0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hV R0VQQUdFCi0Jc3RydWN0IHR0bV9wYWdlX3Bvb2wgKmh1Z2UgPSB0dG1fZ2V0X3Bvb2woZmxhZ3Ms IHRydWUsIGNzdGF0ZSk7Ci0jZW5kaWYKLQlzdHJ1Y3QgbGlzdF9oZWFkIHBsaXN0OwotCXN0cnVj dCBwYWdlICpwID0gTlVMTDsKLQl1bnNpZ25lZCBjb3VudCwgZmlyc3Q7Ci0JaW50IHI7Ci0KLQkv KiBObyBwb29sIGZvciBjYWNoZWQgcGFnZXMgKi8KLQlpZiAocG9vbCA9PSBOVUxMKSB7Ci0JCWdm cF90IGdmcF9mbGFncyA9IEdGUF9VU0VSOwotCQl1bnNpZ25lZCBpOwotI2lmZGVmIENPTkZJR19U UkFOU1BBUkVOVF9IVUdFUEFHRQotCQl1bnNpZ25lZCBqOwotI2VuZGlmCi0KLQkJLyogc2V0IHpl cm8gZmxhZyBmb3IgcGFnZSBhbGxvY2F0aW9uIGlmIHJlcXVpcmVkICovCi0JCWlmIChmbGFncyAm IFRUTV9QQUdFX0ZMQUdfWkVST19BTExPQykKLQkJCWdmcF9mbGFncyB8PSBfX0dGUF9aRVJPOwot Ci0JCWlmIChmbGFncyAmIFRUTV9QQUdFX0ZMQUdfTk9fUkVUUlkpCi0JCQlnZnBfZmxhZ3MgfD0g X19HRlBfUkVUUllfTUFZRkFJTDsKLQotCQlpZiAoZmxhZ3MgJiBUVE1fUEFHRV9GTEFHX0RNQTMy KQotCQkJZ2ZwX2ZsYWdzIHw9IEdGUF9ETUEzMjsKLQkJZWxzZQotCQkJZ2ZwX2ZsYWdzIHw9IEdG UF9ISUdIVVNFUjsKLQotCQlpID0gMDsKLSNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVHRVBB R0UKLQkJaWYgKCEoZ2ZwX2ZsYWdzICYgR0ZQX0RNQTMyKSkgewotCQkJd2hpbGUgKG5wYWdlcyA+ PSBIUEFHRV9QTURfTlIpIHsKLQkJCQlnZnBfdCBodWdlX2ZsYWdzID0gZ2ZwX2ZsYWdzOwotCi0J CQkJaHVnZV9mbGFncyB8PSBHRlBfVFJBTlNIVUdFX0xJR0hUIHwgX19HRlBfTk9SRVRSWSB8Ci0J CQkJCV9fR0ZQX0tTV0FQRF9SRUNMQUlNOwotCQkJCWh1Z2VfZmxhZ3MgJj0gfl9fR0ZQX01PVkFC TEU7Ci0JCQkJaHVnZV9mbGFncyAmPSB+X19HRlBfQ09NUDsKLQkJCQlwID0gYWxsb2NfcGFnZXMo aHVnZV9mbGFncywgSFBBR0VfUE1EX09SREVSKTsKLQkJCQlpZiAoIXApCi0JCQkJCWJyZWFrOwot Ci0JCQkJZm9yIChqID0gMDsgaiA8IEhQQUdFX1BNRF9OUjsgKytqKQotCQkJCQlwYWdlc1tpKytd ID0gcCsrOwotCi0JCQkJbnBhZ2VzIC09IEhQQUdFX1BNRF9OUjsKLQkJCX0KLQkJfQotI2VuZGlm Ci0KLQkJZmlyc3QgPSBpOwotCQl3aGlsZSAobnBhZ2VzKSB7Ci0JCQlwID0gYWxsb2NfcGFnZShn ZnBfZmxhZ3MpOwotCQkJaWYgKCFwKSB7Ci0JCQkJcHJfZGVidWcoIlVuYWJsZSB0byBhbGxvY2F0 ZSBwYWdlXG4iKTsKLQkJCQlyZXR1cm4gLUVOT01FTTsKLQkJCX0KLQotCQkJLyogU3dhcCB0aGUg cGFnZXMgaWYgd2UgZGV0ZWN0IGNvbnNlY3V0aXZlIG9yZGVyICovCi0JCQlpZiAoaSA+IGZpcnN0 ICYmIHBhZ2VzW2kgLSAxXSA9PSBwIC0gMSkKLQkJCQlzd2FwKHAsIHBhZ2VzW2kgLSAxXSk7Ci0K LQkJCXBhZ2VzW2krK10gPSBwOwotCQkJLS1ucGFnZXM7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQot Ci0JY291bnQgPSAwOwotCi0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCi0JaWYg KGh1Z2UgJiYgbnBhZ2VzID49IEhQQUdFX1BNRF9OUikgewotCQlJTklUX0xJU1RfSEVBRCgmcGxp c3QpOwotCQl0dG1fcGFnZV9wb29sX2dldF9wYWdlcyhodWdlLCAmcGxpc3QsIGZsYWdzLCBjc3Rh dGUsCi0JCQkJCW5wYWdlcyAvIEhQQUdFX1BNRF9OUiwKLQkJCQkJSFBBR0VfUE1EX09SREVSKTsK LQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwbGlzdCwgbHJ1KSB7Ci0JCQl1bnNpZ25lZCBq OwotCi0JCQlmb3IgKGogPSAwOyBqIDwgSFBBR0VfUE1EX05SOyArK2opCi0JCQkJcGFnZXNbY291 bnQrK10gPSAmcFtqXTsKLQkJfQotCX0KLSNlbmRpZgotCi0JSU5JVF9MSVNUX0hFQUQoJnBsaXN0 KTsKLQlyID0gdHRtX3BhZ2VfcG9vbF9nZXRfcGFnZXMocG9vbCwgJnBsaXN0LCBmbGFncywgY3N0 YXRlLAotCQkJCSAgICBucGFnZXMgLSBjb3VudCwgMCk7Ci0KLQlmaXJzdCA9IGNvdW50OwotCWxp c3RfZm9yX2VhY2hfZW50cnkocCwgJnBsaXN0LCBscnUpIHsKLQkJc3RydWN0IHBhZ2UgKnRtcCA9 IHA7Ci0KLQkJLyogU3dhcCB0aGUgcGFnZXMgaWYgd2UgZGV0ZWN0IGNvbnNlY3V0aXZlIG9yZGVy ICovCi0JCWlmIChjb3VudCA+IGZpcnN0ICYmIHBhZ2VzW2NvdW50IC0gMV0gPT0gdG1wIC0gMSkK LQkJCXN3YXAodG1wLCBwYWdlc1tjb3VudCAtIDFdKTsKLQkJcGFnZXNbY291bnQrK10gPSB0bXA7 Ci0JfQotCi0JaWYgKHIpIHsKLQkJLyogSWYgdGhlcmUgaXMgYW55IHBhZ2VzIGluIHRoZSBsaXN0 IHB1dCB0aGVtIGJhY2sgdG8KLQkJICogdGhlIHBvb2wuCi0JCSAqLwotCQlwcl9kZWJ1ZygiRmFp bGVkIHRvIGFsbG9jYXRlIGV4dHJhIHBhZ2VzIGZvciBsYXJnZSByZXF1ZXN0XG4iKTsKLQkJdHRt X3B1dF9wYWdlcyhwYWdlcywgY291bnQsIGZsYWdzLCBjc3RhdGUpOwotCQlyZXR1cm4gcjsKLQl9 Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgdHRtX3BhZ2VfcG9vbF9pbml0X2xvY2tl ZChzdHJ1Y3QgdHRtX3BhZ2VfcG9vbCAqcG9vbCwgZ2ZwX3QgZmxhZ3MsCi0JCWNoYXIgKm5hbWUs IHVuc2lnbmVkIGludCBvcmRlcikKLXsKLQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7Ci0J cG9vbC0+ZmlsbF9sb2NrID0gZmFsc2U7Ci0JSU5JVF9MSVNUX0hFQUQoJnBvb2wtPmxpc3QpOwot CXBvb2wtPm5wYWdlcyA9IHBvb2wtPm5mcmVlcyA9IDA7Ci0JcG9vbC0+Z2ZwX2ZsYWdzID0gZmxh Z3M7Ci0JcG9vbC0+bmFtZSA9IG5hbWU7Ci0JcG9vbC0+b3JkZXIgPSBvcmRlcjsKLX0KLQotaW50 IHR0bV9wYWdlX2FsbG9jX2luaXQoc3RydWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iLCB1bnNpZ25l ZCBtYXhfcGFnZXMpCi17Ci0JaW50IHJldDsKLSNpZmRlZiBDT05GSUdfVFJBTlNQQVJFTlRfSFVH RVBBR0UKLQl1bnNpZ25lZCBvcmRlciA9IEhQQUdFX1BNRF9PUkRFUjsKLSNlbHNlCi0JdW5zaWdu ZWQgb3JkZXIgPSAwOwotI2VuZGlmCi0KLQlXQVJOX09OKF9tYW5hZ2VyKTsKLQotCXByX2luZm8o IkluaXRpYWxpemluZyBwb29sIGFsbG9jYXRvclxuIik7Ci0KLQlfbWFuYWdlciA9IGt6YWxsb2Mo c2l6ZW9mKCpfbWFuYWdlciksIEdGUF9LRVJORUwpOwotCWlmICghX21hbmFnZXIpCi0JCXJldHVy biAtRU5PTUVNOwotCi0JdHRtX3BhZ2VfcG9vbF9pbml0X2xvY2tlZCgmX21hbmFnZXItPndjX3Bv b2wsIEdGUF9ISUdIVVNFUiwgIndjIiwgMCk7Ci0KLQl0dG1fcGFnZV9wb29sX2luaXRfbG9ja2Vk KCZfbWFuYWdlci0+dWNfcG9vbCwgR0ZQX0hJR0hVU0VSLCAidWMiLCAwKTsKLQotCXR0bV9wYWdl X3Bvb2xfaW5pdF9sb2NrZWQoJl9tYW5hZ2VyLT53Y19wb29sX2RtYTMyLAotCQkJCSAgR0ZQX1VT RVIgfCBHRlBfRE1BMzIsICJ3YyBkbWEiLCAwKTsKLQotCXR0bV9wYWdlX3Bvb2xfaW5pdF9sb2Nr ZWQoJl9tYW5hZ2VyLT51Y19wb29sX2RtYTMyLAotCQkJCSAgR0ZQX1VTRVIgfCBHRlBfRE1BMzIs ICJ1YyBkbWEiLCAwKTsKLQotCXR0bV9wYWdlX3Bvb2xfaW5pdF9sb2NrZWQoJl9tYW5hZ2VyLT53 Y19wb29sX2h1Z2UsCi0JCQkJICAoR0ZQX1RSQU5TSFVHRV9MSUdIVCB8IF9fR0ZQX05PUkVUUlkg fAotCQkJCSAgIF9fR0ZQX0tTV0FQRF9SRUNMQUlNKSAmCi0JCQkJICB+KF9fR0ZQX01PVkFCTEUg fCBfX0dGUF9DT01QKSwKLQkJCQkgICJ3YyBodWdlIiwgb3JkZXIpOwotCi0JdHRtX3BhZ2VfcG9v bF9pbml0X2xvY2tlZCgmX21hbmFnZXItPnVjX3Bvb2xfaHVnZSwKLQkJCQkgIChHRlBfVFJBTlNI VUdFX0xJR0hUIHwgX19HRlBfTk9SRVRSWSB8Ci0JCQkJICAgX19HRlBfS1NXQVBEX1JFQ0xBSU0p ICYKLQkJCQkgIH4oX19HRlBfTU9WQUJMRSB8IF9fR0ZQX0NPTVApCi0JCQkJICAsICJ1YyBodWdl Iiwgb3JkZXIpOwotCi0JX21hbmFnZXItPm9wdGlvbnMubWF4X3NpemUgPSBtYXhfcGFnZXM7Ci0J X21hbmFnZXItPm9wdGlvbnMuc21hbGwgPSBTTUFMTF9BTExPQ0FUSU9OOwotCV9tYW5hZ2VyLT5v cHRpb25zLmFsbG9jX3NpemUgPSBOVU1fUEFHRVNfVE9fQUxMT0M7Ci0KLQlyZXQgPSBrb2JqZWN0 X2luaXRfYW5kX2FkZCgmX21hbmFnZXItPmtvYmosICZ0dG1fcG9vbF9rb2JqX3R5cGUsCi0JCQkJ ICAgJmdsb2ItPmtvYmosICJwb29sIik7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290 byBlcnJvcjsKLQotCXJldCA9IHR0bV9wb29sX21tX3Nocmlua19pbml0KF9tYW5hZ2VyKTsKLQlp ZiAodW5saWtlbHkocmV0ICE9IDApKQotCQlnb3RvIGVycm9yOwotCXJldHVybiAwOwotCi1lcnJv cjoKLQlrb2JqZWN0X3B1dCgmX21hbmFnZXItPmtvYmopOwotCV9tYW5hZ2VyID0gTlVMTDsKLQly ZXR1cm4gcmV0OwotfQotCi12b2lkIHR0bV9wYWdlX2FsbG9jX2Zpbmkodm9pZCkKLXsKLQlpbnQg aTsKLQotCXByX2luZm8oIkZpbmFsaXppbmcgcG9vbCBhbGxvY2F0b3JcbiIpOwotCXR0bV9wb29s X21tX3Nocmlua19maW5pKF9tYW5hZ2VyKTsKLQotCS8qIE9LIHRvIHVzZSBzdGF0aWMgYnVmZmVy IHNpbmNlIGdsb2JhbCBtdXRleCBpcyBubyBsb25nZXIgdXNlZC4gKi8KLQlmb3IgKGkgPSAwOyBp IDwgTlVNX1BPT0xTOyArK2kpCi0JCXR0bV9wYWdlX3Bvb2xfZnJlZSgmX21hbmFnZXItPnBvb2xz W2ldLCBGUkVFX0FMTF9QQUdFUywgdHJ1ZSk7Ci0KLQlrb2JqZWN0X3B1dCgmX21hbmFnZXItPmtv YmopOwotCV9tYW5hZ2VyID0gTlVMTDsKLX0KLQotc3RhdGljIHZvaWQKLXR0bV9wb29sX3VucG9w dWxhdGVfaGVscGVyKHN0cnVjdCB0dG1fdHQgKnR0bSwgdW5zaWduZWQgbWVtX2NvdW50X3VwZGF0 ZSkKLXsKLQlzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gJnR0bV9tZW1fZ2xvYjsK LQl1bnNpZ25lZCBpOwotCi0JaWYgKG1lbV9jb3VudF91cGRhdGUgPT0gMCkKLQkJZ290byBwdXRf cGFnZXM7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbWVtX2NvdW50X3VwZGF0ZTsgKytpKSB7Ci0JCWlm ICghdHRtLT5wYWdlc1tpXSkKLQkJCWNvbnRpbnVlOwotCi0JCXR0bV9tZW1fZ2xvYmFsX2ZyZWVf cGFnZShtZW1fZ2xvYiwgdHRtLT5wYWdlc1tpXSwgUEFHRV9TSVpFKTsKLQl9Ci0KLXB1dF9wYWdl czoKLQl0dG1fcHV0X3BhZ2VzKHR0bS0+cGFnZXMsIHR0bS0+bnVtX3BhZ2VzLCB0dG0tPnBhZ2Vf ZmxhZ3MsCi0JCSAgICAgIHR0bS0+Y2FjaGluZyk7Ci19Ci0KLWludCB0dG1fcG9vbF9wb3B1bGF0 ZShzdHJ1Y3QgdHRtX3R0ICp0dG0sIHN0cnVjdCB0dG1fb3BlcmF0aW9uX2N0eCAqY3R4KQotewot CXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPSAmdHRtX21lbV9nbG9iOwotCXVuc2ln bmVkIGk7Ci0JaW50IHJldDsKLQotCWlmICh0dG1fdHRfaXNfcG9wdWxhdGVkKHR0bSkpCi0JCXJl dHVybiAwOwotCi0JaWYgKHR0bV9jaGVja191bmRlcl9sb3dlcmxpbWl0KG1lbV9nbG9iLCB0dG0t Pm51bV9wYWdlcywgY3R4KSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQlyZXQgPSB0dG1fZ2V0X3Bh Z2VzKHR0bS0+cGFnZXMsIHR0bS0+bnVtX3BhZ2VzLCB0dG0tPnBhZ2VfZmxhZ3MsCi0JCQkgICAg dHRtLT5jYWNoaW5nKTsKLQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCXR0bV9wb29sX3Vu cG9wdWxhdGVfaGVscGVyKHR0bSwgMCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JZm9yIChpID0g MDsgaSA8IHR0bS0+bnVtX3BhZ2VzOyArK2kpIHsKLQkJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxs b2NfcGFnZShtZW1fZ2xvYiwgdHRtLT5wYWdlc1tpXSwKLQkJCQkJCVBBR0VfU0laRSwgY3R4KTsK LQkJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkgewotCQkJdHRtX3Bvb2xfdW5wb3B1bGF0ZV9oZWxw ZXIodHRtLCBpKTsKLQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19 Ci1FWFBPUlRfU1lNQk9MKHR0bV9wb29sX3BvcHVsYXRlKTsKLQotdm9pZCB0dG1fcG9vbF91bnBv cHVsYXRlKHN0cnVjdCB0dG1fdHQgKnR0bSkKLXsKLQl0dG1fcG9vbF91bnBvcHVsYXRlX2hlbHBl cih0dG0sIHR0bS0+bnVtX3BhZ2VzKTsKLX0KLUVYUE9SVF9TWU1CT0wodHRtX3Bvb2xfdW5wb3B1 bGF0ZSk7Ci0KLWludCB0dG1fcG9wdWxhdGVfYW5kX21hcF9wYWdlcyhzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCB0dG1fdHQgKnR0LAotCQkJCQlzdHJ1Y3QgdHRtX29wZXJhdGlvbl9jdHggKmN0 eCkKLXsKLQl1bnNpZ25lZCBpLCBqOwotCWludCByOwotCi0JciA9IHR0bV9wb29sX3BvcHVsYXRl KHR0LCBjdHgpOwotCWlmIChyKQotCQlyZXR1cm4gcjsKLQotCWZvciAoaSA9IDA7IGkgPCB0dC0+ bnVtX3BhZ2VzOyArK2kpIHsKLQkJc3RydWN0IHBhZ2UgKnAgPSB0dC0+cGFnZXNbaV07Ci0JCXNp emVfdCBudW1fcGFnZXMgPSAxOwotCi0JCWZvciAoaiA9IGkgKyAxOyBqIDwgdHQtPm51bV9wYWdl czsgKytqKSB7Ci0JCQlpZiAoKytwICE9IHR0LT5wYWdlc1tqXSkKLQkJCQlicmVhazsKLQotCQkJ KytudW1fcGFnZXM7Ci0JCX0KLQotCQl0dC0+ZG1hX2FkZHJlc3NbaV0gPSBkbWFfbWFwX3BhZ2Uo ZGV2LCB0dC0+cGFnZXNbaV0sCi0JCQkJCQkgIDAsIG51bV9wYWdlcyAqIFBBR0VfU0laRSwKLQkJ CQkJCSAgRE1BX0JJRElSRUNUSU9OQUwpOwotCQlpZiAoZG1hX21hcHBpbmdfZXJyb3IoZGV2LCB0 dC0+ZG1hX2FkZHJlc3NbaV0pKSB7Ci0JCQl3aGlsZSAoaS0tKSB7Ci0JCQkJZG1hX3VubWFwX3Bh Z2UoZGV2LCB0dC0+ZG1hX2FkZHJlc3NbaV0sCi0JCQkJCSAgICAgICBQQUdFX1NJWkUsIERNQV9C SURJUkVDVElPTkFMKTsKLQkJCQl0dC0+ZG1hX2FkZHJlc3NbaV0gPSAwOwotCQkJfQotCQkJdHRt X3Bvb2xfdW5wb3B1bGF0ZSh0dCk7Ci0JCQlyZXR1cm4gLUVGQVVMVDsKLQkJfQotCi0JCWZvciAo aiA9IDE7IGogPCBudW1fcGFnZXM7ICsraikgewotCQkJdHQtPmRtYV9hZGRyZXNzW2kgKyAxXSA9 IHR0LT5kbWFfYWRkcmVzc1tpXSArIFBBR0VfU0laRTsKLQkJCSsraTsKLQkJfQotCX0KLQlyZXR1 cm4gMDsKLX0KLUVYUE9SVF9TWU1CT0wodHRtX3BvcHVsYXRlX2FuZF9tYXBfcGFnZXMpOwotCi12 b2lkIHR0bV91bm1hcF9hbmRfdW5wb3B1bGF0ZV9wYWdlcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0 cnVjdCB0dG1fdHQgKnR0KQotewotCXVuc2lnbmVkIGksIGo7Ci0KLQlmb3IgKGkgPSAwOyBpIDwg dHQtPm51bV9wYWdlczspIHsKLQkJc3RydWN0IHBhZ2UgKnAgPSB0dC0+cGFnZXNbaV07Ci0JCXNp emVfdCBudW1fcGFnZXMgPSAxOwotCi0JCWlmICghdHQtPmRtYV9hZGRyZXNzW2ldIHx8ICF0dC0+ cGFnZXNbaV0pIHsKLQkJCSsraTsKLQkJCWNvbnRpbnVlOwotCQl9Ci0KLQkJZm9yIChqID0gaSAr IDE7IGogPCB0dC0+bnVtX3BhZ2VzOyArK2opIHsKLQkJCWlmICgrK3AgIT0gdHQtPnBhZ2VzW2pd KQotCQkJCWJyZWFrOwotCi0JCQkrK251bV9wYWdlczsKLQkJfQotCi0JCWRtYV91bm1hcF9wYWdl KGRldiwgdHQtPmRtYV9hZGRyZXNzW2ldLCBudW1fcGFnZXMgKiBQQUdFX1NJWkUsCi0JCQkgICAg ICAgRE1BX0JJRElSRUNUSU9OQUwpOwotCi0JCWkgKz0gbnVtX3BhZ2VzOwotCX0KLQl0dG1fcG9v bF91bnBvcHVsYXRlKHR0KTsKLX0KLUVYUE9SVF9TWU1CT0wodHRtX3VubWFwX2FuZF91bnBvcHVs YXRlX3BhZ2VzKTsKLQotaW50IHR0bV9wYWdlX2FsbG9jX2RlYnVnZnMoc3RydWN0IHNlcV9maWxl ICptLCB2b2lkICpkYXRhKQotewotCXN0cnVjdCB0dG1fcGFnZV9wb29sICpwOwotCXVuc2lnbmVk IGk7Ci0JY2hhciAqaFtdID0geyJwb29sIiwgInJlZmlsbHMiLCAicGFnZXMgZnJlZWQiLCAic2l6 ZSJ9OwotCWlmICghX21hbmFnZXIpIHsKLQkJc2VxX3ByaW50ZihtLCAiTm8gcG9vbCBhbGxvY2F0 b3IgcnVubmluZy5cbiIpOwotCQlyZXR1cm4gMDsKLQl9Ci0Jc2VxX3ByaW50ZihtLCAiJTdzICUx MnMgJTEzcyAlOHNcbiIsCi0JCQloWzBdLCBoWzFdLCBoWzJdLCBoWzNdKTsKLQlmb3IgKGkgPSAw OyBpIDwgTlVNX1BPT0xTOyArK2kpIHsKLQkJcCA9ICZfbWFuYWdlci0+cG9vbHNbaV07Ci0KLQkJ c2VxX3ByaW50ZihtLCAiJTdzICUxMmxkICUxM2xkICU4ZFxuIiwKLQkJCQlwLT5uYW1lLCBwLT5u cmVmaWxscywKLQkJCQlwLT5uZnJlZXMsIHAtPm5wYWdlcyk7Ci0JfQotCXJldHVybiAwOwotfQot RVhQT1JUX1NZTUJPTCh0dG1fcGFnZV9hbGxvY19kZWJ1Z2ZzKTsKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS90dG0vdHRtX3BhZ2VfYWxsb2NfZG1hLmMgYi9kcml2ZXJzL2dwdS9kcm0vdHRt L3R0bV9wYWdlX2FsbG9jX2RtYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDM1 M2MyNWVmZDYuLjAwMDAwMDAwMDAwMAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vdHRtL3R0bV9wYWdl X2FsbG9jX2RtYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNiArMCwwIEBACi0vKgotICogQ29w eXJpZ2h0IDIwMTEgKGMpIE9yYWNsZSBDb3JwLgotCi0gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBn cmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQotICogY29w eSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRo ZSAiU29mdHdhcmUiKSwKLSAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJp Y3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KLSAqIHRoZSByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwK LSAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVy c29ucyB0byB3aG9tIHRoZQotICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJq ZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLSAqCi0gKiBUaGUgYWJvdmUgY29weXJp Z2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZQotICog bmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3Rh bnRpYWwgcG9ydGlvbnMKLSAqIG9mIHRoZSBTb2Z0d2FyZS4KLSAqCi0gKiBUSEUgU09GVFdBUkUg SVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVT UyBPUgotICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFO VElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCi0gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRSBBTkQgTk9OLUlORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwKLSAqIFRIRSBBVVRI T1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VT IE9SIE9USEVSCi0gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNU LCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORwotICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5F Q1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgotICogREVBTElOR1Mg SU4gVEhFIFNPRlRXQVJFLgotICoKLSAqIEF1dGhvcjogS29ucmFkIFJ6ZXN6dXRlayBXaWxrIDxr b25yYWQud2lsa0BvcmFjbGUuY29tPgotICovCi0KLS8qCi0gKiBBIHNpbXBsZSBETUEgcG9vbCBs b3NlbHkgYmFzZWQgb24gZG1hcG9vbC5jLiBJdCBoYXMgY2VydGFpbiBhZHZhbnRhZ2VzCi0gKiBv dmVyIHRoZSBETUEgcG9vbHM6Ci0gKiAtIFBvb2wgY29sbGVjdHMgcmVzZW50bHkgZnJlZWQgcGFn ZXMgZm9yIHJldXNlIChhbmQgaG9va3MgdXAgdG8KLSAqICAgdGhlIHNocmlua2VyKS4KLSAqIC0g VHJhY2tzIGN1cnJlbnRseSBpbiB1c2UgcGFnZXMKLSAqIC0gVHJhY2tzIHdoZXRoZXIgdGhlIHBh Z2UgaXMgVUMsIFdCIG9yIGNhY2hlZCAoYW5kIHJldmVydHMgdG8gV0IKLSAqICAgd2hlbiBmcmVl ZCkuCi0gKi8KLQotI2RlZmluZSBwcl9mbXQoZm10KSAiW1RUTV0gIiBmbXQKLQotI2luY2x1ZGUg PGxpbnV4L2RtYS1tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvbGlzdC5oPgotI2luY2x1ZGUg PGxpbnV4L3NlcV9maWxlLmg+IC8qIGZvciBzZXFfcHJpbnRmICovCi0jaW5jbHVkZSA8bGludXgv c2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvaGln aG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L21tX3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9hdG9taWMuaD4K LSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+Ci0j aW5jbHVkZSA8ZHJtL3R0bS90dG1fYm9fZHJpdmVyLmg+Ci0jaW5jbHVkZSA8ZHJtL3R0bS90dG1f cGFnZV9hbGxvYy5oPgotCi0jaW5jbHVkZSAidHRtX3NldF9tZW1vcnkuaCIKLQotI2RlZmluZSBO VU1fUEFHRVNfVE9fQUxMT0MJCShQQUdFX1NJWkUvc2l6ZW9mKHN0cnVjdCBwYWdlICopKQotI2Rl ZmluZSBTTUFMTF9BTExPQ0FUSU9OCQk0Ci0jZGVmaW5lIEZSRUVfQUxMX1BBR0VTCQkJKH4wVSkK LSNkZWZpbmUgVkFERFJfRkxBR19IVUdFX1BPT0wJCTFVTAotI2RlZmluZSBWQUREUl9GTEFHX1VQ REFURURfQ09VTlQJMlVMCi0KLWVudW0gcG9vbF90eXBlIHsKLQlJU19VTkRFRklORUQJPSAwLAot CUlTX1dDCQk9IDEgPDwgMSwKLQlJU19VQwkJPSAxIDw8IDIsCi0JSVNfQ0FDSEVECT0gMSA8PCAz LAotCUlTX0RNQTMyCT0gMSA8PCA0LAotCUlTX0hVR0UJCT0gMSA8PCA1Ci19OwotCi0vKgotICog VGhlIHBvb2wgc3RydWN0dXJlLiBUaGVyZSBhcmUgdXAgdG8gbmluZSBwb29sczoKLSAqICAtIGdl bmVyaWMgKG5vdCByZXN0cmljdGVkIHRvIERNQTMyKToKLSAqICAgICAgLSB3cml0ZSBjb21iaW5l ZCwgdW5jYWNoZWQsIGNhY2hlZC4KLSAqICAtIGRtYTMyICh1cCB0byAyXjMyIC0gc28gdXAgNEdC KToKLSAqICAgICAgLSB3cml0ZSBjb21iaW5lZCwgdW5jYWNoZWQsIGNhY2hlZC4KLSAqICAtIGh1 Z2UgKG5vdCByZXN0cmljdGVkIHRvIERNQTMyKToKLSAqICAgICAgLSB3cml0ZSBjb21iaW5lZCwg dW5jYWNoZWQsIGNhY2hlZC4KLSAqIGZvciBlYWNoICdzdHJ1Y3QgZGV2aWNlJy4gVGhlICdjYWNo ZWQnIGlzIGZvciBwYWdlcyB0aGF0IGFyZSBhY3RpdmVseSB1c2VkLgotICogVGhlIG90aGVyIG9u ZXMgY2FuIGJlIHNocnVuayBieSB0aGUgc2hyaW5rZXIgQVBJIGlmIG5lY2Nlc3NhcnkuCi0gKiBA cG9vbHM6IFRoZSAnc3RydWN0IGRldmljZS0+ZG1hX3Bvb2xzJyBsaW5rLgotICogQHR5cGU6IFR5 cGUgb2YgdGhlIHBvb2wKLSAqIEBsb2NrOiBQcm90ZWN0cyB0aGUgZnJlZV9saXN0IGZyb20gY29u Y3Vycm5ldCBhY2Nlc3MuIE11c3QgYmUKLSAqIHVzZWQgd2l0aCBpcnFzYXZlL2lycXJlc3RvcmUg dmFyaWFudHMgYmVjYXVzZSBwb29sIGFsbG9jYXRvciBtYXliZSBjYWxsZWQKLSAqIGZyb20gZGVs YXllZCB3b3JrLgotICogQGZyZWVfbGlzdDogUG9vbCBvZiBwYWdlcyB0aGF0IGFyZSBmcmVlIHRv IGJlIHVzZWQuIE5vIG9yZGVyIHJlcXVpcmVtZW50cy4KLSAqIEBkZXY6IFRoZSBkZXZpY2UgdGhh dCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlc2UgcG9vbHMuCi0gKiBAc2l6ZTogU2l6ZSB1c2VkIGR1 cmluZyBETUEgYWxsb2NhdGlvbi4KLSAqIEBucGFnZXNfZnJlZTogQ291bnQgb2YgYXZhaWxhYmxl IHBhZ2VzIGZvciByZS11c2UuCi0gKiBAbnBhZ2VzX2luX3VzZTogQ291bnQgb2YgcGFnZXMgdGhh dCBhcmUgaW4gdXNlLgotICogQG5mcmVlczogU3RhdHMgd2hlbiBwb29sIGlzIHNocmlua2luZy4K LSAqIEBucmVmaWxsczogU3RhdHMgd2hlbiB0aGUgcG9vbCBpcyBncm93bi4KLSAqIEBnZnBfZmxh Z3M6IEZsYWdzIHRvIHBhc3MgZm9yIGFsbG9jX3BhZ2UuCi0gKiBAbmFtZTogTmFtZSBvZiB0aGUg cG9vbC4KLSAqIEBkZXZfbmFtZTogTmFtZSBkZXJpZXZlZCBmcm9tIGRldiAtIHNpbWlsYXIgdG8g aG93IGRldl9pbmZvIHdvcmtzLgotICogICBVc2VkIGR1cmluZyBzaHV0ZG93biBhcyB0aGUgZGV2 X2luZm8gZHVyaW5nIHJlbGVhc2UgaXMgdW5hdmFpbGFibGUuCi0gKi8KLXN0cnVjdCBkbWFfcG9v bCB7Ci0Jc3RydWN0IGxpc3RfaGVhZCBwb29sczsgLyogVGhlICdzdHJ1Y3QgZGV2aWNlLT5kbWFf cG9vbHMgbGluayAqLwotCWVudW0gcG9vbF90eXBlIHR5cGU7Ci0Jc3BpbmxvY2tfdCBsb2NrOwot CXN0cnVjdCBsaXN0X2hlYWQgZnJlZV9saXN0OwotCXN0cnVjdCBkZXZpY2UgKmRldjsKLQl1bnNp Z25lZCBzaXplOwotCXVuc2lnbmVkIG5wYWdlc19mcmVlOwotCXVuc2lnbmVkIG5wYWdlc19pbl91 c2U7Ci0JdW5zaWduZWQgbG9uZyBuZnJlZXM7IC8qIFN0YXRzIHdoZW4gc2hydW5rLiAqLwotCXVu c2lnbmVkIGxvbmcgbnJlZmlsbHM7IC8qIFN0YXRzIHdoZW4gZ3Jvd24uICovCi0JZ2ZwX3QgZ2Zw X2ZsYWdzOwotCWNoYXIgbmFtZVsxM107IC8qICJjYWNoZWQgZG1hMzIiICovCi0JY2hhciBkZXZf bmFtZVs2NF07IC8qIENvbnN0cnVjdGVkIGZyb20gZGV2ICovCi19OwotCi0vKgotICogVGhlIGFj Y291bnRpbmcgcGFnZSBrZWVwaW5nIHRyYWNrIG9mIHRoZSBhbGxvY2F0ZWQgcGFnZSBhbG9uZyB3 aXRoCi0gKiB0aGUgRE1BIGFkZHJlc3MuCi0gKiBAcGFnZV9saXN0OiBUaGUgbGluayB0byB0aGUg J3BhZ2VfbGlzdCcgaW4gJ3N0cnVjdCBkbWFfcG9vbCcuCi0gKiBAdmFkZHI6IFRoZSB2aXJ0dWFs IGFkZHJlc3Mgb2YgdGhlIHBhZ2UgYW5kIGEgZmxhZyBpZiB0aGUgcGFnZSBiZWxvbmdzIHRvIGEK LSAqIGh1Z2UgcG9vbAotICogQGRtYTogVGhlIGJ1cyBhZGRyZXNzIG9mIHRoZSBwYWdlLiBJZiB0 aGUgcGFnZSBpcyBub3QgYWxsb2NhdGVkCi0gKiAgIHZpYSB0aGUgRE1BIEFQSSwgaXQgd2lsbCBi ZSAtMS4KLSAqLwotc3RydWN0IGRtYV9wYWdlIHsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHBhZ2VfbGlz dDsKLQl1bnNpZ25lZCBsb25nIHZhZGRyOwotCXN0cnVjdCBwYWdlICpwOwotCWRtYV9hZGRyX3Qg ZG1hOwotfTsKLQotLyoKLSAqIExpbWl0cyBmb3IgdGhlIHBvb2wuIFRoZXkgYXJlIGhhbmRsZWQg d2l0aG91dCBsb2NrcyBiZWNhdXNlIG9ubHkgcGxhY2Ugd2hlcmUKLSAqIHRoZXkgbWF5IGNoYW5n ZSBpcyBpbiBzeXNmcyBzdG9yZS4gVGhleSB3b24ndCBoYXZlIGltbWVkaWF0ZSBlZmZlY3QgYW55 d2F5Ci0gKiBzbyBmb3JjaW5nIHNlcmlhbGl6YXRpb24gdG8gYWNjZXNzIHRoZW0gaXMgcG9pbnRs ZXNzLgotICovCi0KLXN0cnVjdCB0dG1fcG9vbF9vcHRzIHsKLQl1bnNpZ25lZAlhbGxvY19zaXpl OwotCXVuc2lnbmVkCW1heF9zaXplOwotCXVuc2lnbmVkCXNtYWxsOwotfTsKLQotLyoKLSAqIENv bnRhaW5zIHRoZSBsaXN0IG9mIGFsbCBvZiB0aGUgJ3N0cnVjdCBkZXZpY2UnIGFuZCB0aGVpciBj b3JyZXNwb25kaW5nCi0gKiBETUEgcG9vbHMuIEd1YXJkZWQgYnkgX211dGV4LT5sb2NrLgotICog QHBvb2xzOiBUaGUgbGluayB0byAnc3RydWN0IHR0bV9wb29sX21hbmFnZXItPnBvb2xzJwotICog QGRldjogVGhlICdzdHJ1Y3QgZGV2aWNlJyBhc3NvY2lhdGVkIHdpdGggdGhlICdwb29sJwotICog QHBvb2w6IFRoZSAnc3RydWN0IGRtYV9wb29sJyBhc3NvY2lhdGVkIHdpdGggdGhlICdkZXYnCi0g Ki8KLXN0cnVjdCBkZXZpY2VfcG9vbHMgewotCXN0cnVjdCBsaXN0X2hlYWQgcG9vbHM7Ci0Jc3Ry dWN0IGRldmljZSAqZGV2OwotCXN0cnVjdCBkbWFfcG9vbCAqcG9vbDsKLX07Ci0KLS8qCi0gKiBz dHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAtIEhvbGRzIG1lbW9yeSBwb29scyBmb3IgZmFzdCBhbGxv Y2F0aW9uCi0gKgotICogQGxvY2s6IExvY2sgdXNlZCB3aGVuIGFkZGluZy9yZW1vdmluZyBmcm9t IHBvb2xzCi0gKiBAcG9vbHM6IExpc3Qgb2YgJ3N0cnVjdCBkZXZpY2UnIGFuZCAnc3RydWN0IGRt YV9wb29sJyB0dXBsZXMuCi0gKiBAb3B0aW9uczogTGltaXRzIGZvciB0aGUgcG9vbC4KLSAqIEBu cG9vbHM6IFRvdGFsIGFtb3VudCBvZiBwb29scyBpbiBleGlzdGVuY2UuCi0gKiBAc2hyaW5rZXI6 IFRoZSBzdHJ1Y3R1cmUgdXNlZCBieSBbdW58XXJlZ2lzdGVyX3Nocmlua2VyCi0gKi8KLXN0cnVj dCB0dG1fcG9vbF9tYW5hZ2VyIHsKLQlzdHJ1Y3QgbXV0ZXgJCWxvY2s7Ci0Jc3RydWN0IGxpc3Rf aGVhZAlwb29sczsKLQlzdHJ1Y3QgdHRtX3Bvb2xfb3B0cwlvcHRpb25zOwotCXVuc2lnbmVkCQlu cG9vbHM7Ci0Jc3RydWN0IHNocmlua2VyCQltbV9zaHJpbms7Ci0Jc3RydWN0IGtvYmplY3QJCWtv Ymo7Ci19OwotCi1zdGF0aWMgc3RydWN0IHR0bV9wb29sX21hbmFnZXIgKl9tYW5hZ2VyOwotCi1z dGF0aWMgc3RydWN0IGF0dHJpYnV0ZSB0dG1fcGFnZV9wb29sX21heCA9IHsKLQkubmFtZSA9ICJw b29sX21heF9zaXplIiwKLQkubW9kZSA9IFNfSVJVR08gfCBTX0lXVVNSCi19Owotc3RhdGljIHN0 cnVjdCBhdHRyaWJ1dGUgdHRtX3BhZ2VfcG9vbF9zbWFsbCA9IHsKLQkubmFtZSA9ICJwb29sX3Nt YWxsX2FsbG9jYXRpb24iLAotCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IKLX07Ci1zdGF0aWMg c3RydWN0IGF0dHJpYnV0ZSB0dG1fcGFnZV9wb29sX2FsbG9jX3NpemUgPSB7Ci0JLm5hbWUgPSAi cG9vbF9hbGxvY2F0aW9uX3NpemUiLAotCS5tb2RlID0gU19JUlVHTyB8IFNfSVdVU1IKLX07Ci0K LXN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlICp0dG1fcG9vbF9hdHRyc1tdID0gewotCSZ0dG1fcGFn ZV9wb29sX21heCwKLQkmdHRtX3BhZ2VfcG9vbF9zbWFsbCwKLQkmdHRtX3BhZ2VfcG9vbF9hbGxv Y19zaXplLAotCU5VTEwKLX07Ci0KLXN0YXRpYyB2b2lkIHR0bV9wb29sX2tvYmpfcmVsZWFzZShz dHJ1Y3Qga29iamVjdCAqa29iaikKLXsKLQlzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAqbSA9Ci0J CWNvbnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciwga29iaik7Ci0Ja2Zy ZWUobSk7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHR0bV9wb29sX3N0b3JlKHN0cnVjdCBrb2JqZWN0 ICprb2JqLCBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAotCQkJICAgICAgY29uc3QgY2hhciAqYnVm ZmVyLCBzaXplX3Qgc2l6ZSkKLXsKLQlzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAqbSA9Ci0JCWNv bnRhaW5lcl9vZihrb2JqLCBzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciwga29iaik7Ci0JaW50IGNo YXJzOwotCXVuc2lnbmVkIHZhbDsKLQotCWNoYXJzID0gc3NjYW5mKGJ1ZmZlciwgIiV1IiwgJnZh bCk7Ci0JaWYgKGNoYXJzID09IDApCi0JCXJldHVybiBzaXplOwotCi0JLyogQ29udmVydCBrYiB0 byBudW1iZXIgb2YgcGFnZXMgKi8KLQl2YWwgPSB2YWwgLyAoUEFHRV9TSVpFID4+IDEwKTsKLQot CWlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX21heCkgewotCQltLT5vcHRpb25zLm1heF9zaXpl ID0gdmFsOwotCX0gZWxzZSBpZiAoYXR0ciA9PSAmdHRtX3BhZ2VfcG9vbF9zbWFsbCkgewotCQlt LT5vcHRpb25zLnNtYWxsID0gdmFsOwotCX0gZWxzZSBpZiAoYXR0ciA9PSAmdHRtX3BhZ2VfcG9v bF9hbGxvY19zaXplKSB7Ci0JCWlmICh2YWwgPiBOVU1fUEFHRVNfVE9fQUxMT0MqOCkgewotCQkJ cHJfZXJyKCJTZXR0aW5nIGFsbG9jYXRpb24gc2l6ZSB0byAlbHUgaXMgbm90IGFsbG93ZWQuIFJl Y29tbWVuZGVkIHNpemUgaXMgJWx1XG4iLAotCQkJICAgICAgIE5VTV9QQUdFU19UT19BTExPQyoo UEFHRV9TSVpFID4+IDcpLAotCQkJICAgICAgIE5VTV9QQUdFU19UT19BTExPQyooUEFHRV9TSVpF ID4+IDEwKSk7Ci0JCQlyZXR1cm4gc2l6ZTsKLQkJfSBlbHNlIGlmICh2YWwgPiBOVU1fUEFHRVNf VE9fQUxMT0MpIHsKLQkJCXByX3dhcm4oIlNldHRpbmcgYWxsb2NhdGlvbiBzaXplIHRvIGxhcmdl ciB0aGFuICVsdSBpcyBub3QgcmVjb21tZW5kZWRcbiIsCi0JCQkJTlVNX1BBR0VTX1RPX0FMTE9D KihQQUdFX1NJWkUgPj4gMTApKTsKLQkJfQotCQltLT5vcHRpb25zLmFsbG9jX3NpemUgPSB2YWw7 Ci0JfQotCi0JcmV0dXJuIHNpemU7Ci19Ci0KLXN0YXRpYyBzc2l6ZV90IHR0bV9wb29sX3Nob3co c3RydWN0IGtvYmplY3QgKmtvYmosIHN0cnVjdCBhdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgIGNo YXIgKmJ1ZmZlcikKLXsKLQlzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciAqbSA9Ci0JCWNvbnRhaW5l cl9vZihrb2JqLCBzdHJ1Y3QgdHRtX3Bvb2xfbWFuYWdlciwga29iaik7Ci0JdW5zaWduZWQgdmFs ID0gMDsKLQotCWlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX21heCkKLQkJdmFsID0gbS0+b3B0 aW9ucy5tYXhfc2l6ZTsKLQllbHNlIGlmIChhdHRyID09ICZ0dG1fcGFnZV9wb29sX3NtYWxsKQot CQl2YWwgPSBtLT5vcHRpb25zLnNtYWxsOwotCWVsc2UgaWYgKGF0dHIgPT0gJnR0bV9wYWdlX3Bv b2xfYWxsb2Nfc2l6ZSkKLQkJdmFsID0gbS0+b3B0aW9ucy5hbGxvY19zaXplOwotCi0JdmFsID0g dmFsICogKFBBR0VfU0laRSA+PiAxMCk7Ci0KLQlyZXR1cm4gc25wcmludGYoYnVmZmVyLCBQQUdF X1NJWkUsICIldVxuIiwgdmFsKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBzeXNmc19vcHMg dHRtX3Bvb2xfc3lzZnNfb3BzID0gewotCS5zaG93ID0gJnR0bV9wb29sX3Nob3csCi0JLnN0b3Jl ID0gJnR0bV9wb29sX3N0b3JlLAotfTsKLQotc3RhdGljIHN0cnVjdCBrb2JqX3R5cGUgdHRtX3Bv b2xfa29ial90eXBlID0gewotCS5yZWxlYXNlID0gJnR0bV9wb29sX2tvYmpfcmVsZWFzZSwKLQku c3lzZnNfb3BzID0gJnR0bV9wb29sX3N5c2ZzX29wcywKLQkuZGVmYXVsdF9hdHRycyA9IHR0bV9w b29sX2F0dHJzLAotfTsKLQotc3RhdGljIGludCB0dG1fc2V0X3BhZ2VzX2NhY2hpbmcoc3RydWN0 IGRtYV9wb29sICpwb29sLAotCQkJCSBzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCB1bnNpZ25lZCBjcGFn ZXMpCi17Ci0JaW50IHIgPSAwOwotCS8qIFNldCBwYWdlIGNhY2hpbmcgKi8KLQlpZiAocG9vbC0+ dHlwZSAmIElTX1VDKSB7Ci0JCXIgPSB0dG1fc2V0X3BhZ2VzX2FycmF5X3VjKHBhZ2VzLCBjcGFn ZXMpOwotCQlpZiAocikKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgJWQgcGFnZXMgdG8g dWMhXG4iLAotCQkJICAgICAgIHBvb2wtPmRldl9uYW1lLCBjcGFnZXMpOwotCX0KLQlpZiAocG9v bC0+dHlwZSAmIElTX1dDKSB7Ci0JCXIgPSB0dG1fc2V0X3BhZ2VzX2FycmF5X3djKHBhZ2VzLCBj cGFnZXMpOwotCQlpZiAocikKLQkJCXByX2VycigiJXM6IEZhaWxlZCB0byBzZXQgJWQgcGFnZXMg dG8gd2MhXG4iLAotCQkJICAgICAgIHBvb2wtPmRldl9uYW1lLCBjcGFnZXMpOwotCX0KLQlyZXR1 cm4gcjsKLX0KLQotc3RhdGljIHZvaWQgX190dG1fZG1hX2ZyZWVfcGFnZShzdHJ1Y3QgZG1hX3Bv b2wgKnBvb2wsIHN0cnVjdCBkbWFfcGFnZSAqZF9wYWdlKQotewotCXVuc2lnbmVkIGxvbmcgYXR0 cnMgPSAwOwotCWRtYV9hZGRyX3QgZG1hID0gZF9wYWdlLT5kbWE7Ci0JZF9wYWdlLT52YWRkciAm PSB+VkFERFJfRkxBR19IVUdFX1BPT0w7Ci0JaWYgKHBvb2wtPnR5cGUgJiBJU19IVUdFKQotCQlh dHRycyA9IERNQV9BVFRSX05PX1dBUk47Ci0KLQlkbWFfZnJlZV9hdHRycyhwb29sLT5kZXYsIHBv b2wtPnNpemUsICh2b2lkICopZF9wYWdlLT52YWRkciwgZG1hLCBhdHRycyk7Ci0KLQlrZnJlZShk X3BhZ2UpOwotCWRfcGFnZSA9IE5VTEw7Ci19Ci1zdGF0aWMgc3RydWN0IGRtYV9wYWdlICpfX3R0 bV9kbWFfYWxsb2NfcGFnZShzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wpCi17Ci0Jc3RydWN0IGRtYV9w YWdlICpkX3BhZ2U7Ci0JdW5zaWduZWQgbG9uZyBhdHRycyA9IDA7Ci0Jdm9pZCAqdmFkZHI7Ci0K LQlkX3BhZ2UgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgZG1hX3BhZ2UpLCBHRlBfS0VSTkVMKTsK LQlpZiAoIWRfcGFnZSkKLQkJcmV0dXJuIE5VTEw7Ci0KLQlpZiAocG9vbC0+dHlwZSAmIElTX0hV R0UpCi0JCWF0dHJzID0gRE1BX0FUVFJfTk9fV0FSTjsKLQotCXZhZGRyID0gZG1hX2FsbG9jX2F0 dHJzKHBvb2wtPmRldiwgcG9vbC0+c2l6ZSwgJmRfcGFnZS0+ZG1hLAotCQkJCXBvb2wtPmdmcF9m bGFncywgYXR0cnMpOwotCWlmICh2YWRkcikgewotCQlpZiAoaXNfdm1hbGxvY19hZGRyKHZhZGRy KSkKLQkJCWRfcGFnZS0+cCA9IHZtYWxsb2NfdG9fcGFnZSh2YWRkcik7Ci0JCWVsc2UKLQkJCWRf cGFnZS0+cCA9IHZpcnRfdG9fcGFnZSh2YWRkcik7Ci0JCWRfcGFnZS0+dmFkZHIgPSAodW5zaWdu ZWQgbG9uZyl2YWRkcjsKLQkJaWYgKHBvb2wtPnR5cGUgJiBJU19IVUdFKQotCQkJZF9wYWdlLT52 YWRkciB8PSBWQUREUl9GTEFHX0hVR0VfUE9PTDsKLQl9IGVsc2UgewotCQlrZnJlZShkX3BhZ2Up OwotCQlkX3BhZ2UgPSBOVUxMOwotCX0KLQlyZXR1cm4gZF9wYWdlOwotfQotc3RhdGljIGVudW0g cG9vbF90eXBlIHR0bV90b190eXBlKGludCBmbGFncywgZW51bSB0dG1fY2FjaGluZyBjc3RhdGUp Ci17Ci0JZW51bSBwb29sX3R5cGUgdHlwZSA9IElTX1VOREVGSU5FRDsKLQotCWlmIChmbGFncyAm IFRUTV9QQUdFX0ZMQUdfRE1BMzIpCi0JCXR5cGUgfD0gSVNfRE1BMzI7Ci0JaWYgKGNzdGF0ZSA9 PSB0dG1fY2FjaGVkKQotCQl0eXBlIHw9IElTX0NBQ0hFRDsKLQllbHNlIGlmIChjc3RhdGUgPT0g dHRtX3VuY2FjaGVkKQotCQl0eXBlIHw9IElTX1VDOwotCWVsc2UKLQkJdHlwZSB8PSBJU19XQzsK LQotCXJldHVybiB0eXBlOwotfQotCi1zdGF0aWMgdm9pZCB0dG1fcG9vbF91cGRhdGVfZnJlZV9s b2NrZWQoc3RydWN0IGRtYV9wb29sICpwb29sLAotCQkJCQl1bnNpZ25lZCBmcmVlZF9wYWdlcykK LXsKLQlwb29sLT5ucGFnZXNfZnJlZSAtPSBmcmVlZF9wYWdlczsKLQlwb29sLT5uZnJlZXMgKz0g ZnJlZWRfcGFnZXM7Ci0KLX0KLQotLyogc2V0IG1lbW9yeSBiYWNrIHRvIHdiIGFuZCBmcmVlIHRo ZSBwYWdlcy4gKi8KLXN0YXRpYyB2b2lkIHR0bV9kbWFfcGFnZV9wdXQoc3RydWN0IGRtYV9wb29s ICpwb29sLCBzdHJ1Y3QgZG1hX3BhZ2UgKmRfcGFnZSkKLXsKLQlzdHJ1Y3QgcGFnZSAqcGFnZSA9 IGRfcGFnZS0+cDsKLQl1bnNpZ25lZCBudW1fcGFnZXM7Ci0KLQkvKiBEb24ndCBzZXQgV0Igb24g V0IgcGFnZSBwb29sLiAqLwotCWlmICghKHBvb2wtPnR5cGUgJiBJU19DQUNIRUQpKSB7Ci0JCW51 bV9wYWdlcyA9IHBvb2wtPnNpemUgLyBQQUdFX1NJWkU7Ci0JCWlmICh0dG1fc2V0X3BhZ2VzX3di KHBhZ2UsIG51bV9wYWdlcykpCi0JCQlwcl9lcnIoIiVzOiBGYWlsZWQgdG8gc2V0ICVkIHBhZ2Vz IHRvIHdiIVxuIiwKLQkJCSAgICAgICBwb29sLT5kZXZfbmFtZSwgbnVtX3BhZ2VzKTsKLQl9Ci0K LQlsaXN0X2RlbCgmZF9wYWdlLT5wYWdlX2xpc3QpOwotCV9fdHRtX2RtYV9mcmVlX3BhZ2UocG9v bCwgZF9wYWdlKTsKLX0KLQotc3RhdGljIHZvaWQgdHRtX2RtYV9wYWdlc19wdXQoc3RydWN0IGRt YV9wb29sICpwb29sLCBzdHJ1Y3QgbGlzdF9oZWFkICpkX3BhZ2VzLAotCQkJICAgICAgc3RydWN0 IHBhZ2UgKnBhZ2VzW10sIHVuc2lnbmVkIG5wYWdlcykKLXsKLQlzdHJ1Y3QgZG1hX3BhZ2UgKmRf cGFnZSwgKnRtcDsKLQotCWlmIChwb29sLT50eXBlICYgSVNfSFVHRSkgewotCQlsaXN0X2Zvcl9l YWNoX2VudHJ5X3NhZmUoZF9wYWdlLCB0bXAsIGRfcGFnZXMsIHBhZ2VfbGlzdCkKLQkJCXR0bV9k bWFfcGFnZV9wdXQocG9vbCwgZF9wYWdlKTsKLQotCQlyZXR1cm47Ci0JfQotCi0JLyogRG9uJ3Qg c2V0IFdCIG9uIFdCIHBhZ2UgcG9vbC4gKi8KLQlpZiAobnBhZ2VzICYmICEocG9vbC0+dHlwZSAm IElTX0NBQ0hFRCkgJiYKLQkgICAgdHRtX3NldF9wYWdlc19hcnJheV93YihwYWdlcywgbnBhZ2Vz KSkKLQkJcHJfZXJyKCIlczogRmFpbGVkIHRvIHNldCAlZCBwYWdlcyB0byB3YiFcbiIsCi0JCSAg ICAgICBwb29sLT5kZXZfbmFtZSwgbnBhZ2VzKTsKLQotCWxpc3RfZm9yX2VhY2hfZW50cnlfc2Fm ZShkX3BhZ2UsIHRtcCwgZF9wYWdlcywgcGFnZV9saXN0KSB7Ci0JCWxpc3RfZGVsKCZkX3BhZ2Ut PnBhZ2VfbGlzdCk7Ci0JCV9fdHRtX2RtYV9mcmVlX3BhZ2UocG9vbCwgZF9wYWdlKTsKLQl9Ci19 Ci0KLS8qCi0gKiBGcmVlIHBhZ2VzIGZyb20gcG9vbC4KLSAqCi0gKiBUbyBwcmV2ZW50IGhvZ2dp bmcgdGhlIHR0bV9zd2FwIHByb2Nlc3Mgd2Ugb25seSBmcmVlIE5VTV9QQUdFU19UT19BTExPQwot ICogbnVtYmVyIG9mIHBhZ2VzIGluIG9uZSBnby4KLSAqCi0gKiBAcG9vbDogdG8gZnJlZSB0aGUg cGFnZXMgZnJvbQotICogQG5yX2ZyZWU6IElmIHNldCB0byB0cnVlIHdpbGwgZnJlZSBhbGwgcGFn ZXMgaW4gcG9vbAotICogQHVzZV9zdGF0aWM6IFNhZmUgdG8gdXNlIHN0YXRpYyBidWZmZXIKLSAq Ki8KLXN0YXRpYyB1bnNpZ25lZCB0dG1fZG1hX3BhZ2VfcG9vbF9mcmVlKHN0cnVjdCBkbWFfcG9v bCAqcG9vbCwgdW5zaWduZWQgbnJfZnJlZSwKLQkJCQkgICAgICAgYm9vbCB1c2Vfc3RhdGljKQot ewotCXN0YXRpYyBzdHJ1Y3QgcGFnZSAqc3RhdGljX2J1ZltOVU1fUEFHRVNfVE9fQUxMT0NdOwot CXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOwotCXN0cnVjdCBkbWFfcGFnZSAqZG1hX3AsICp0bXA7 Ci0Jc3RydWN0IHBhZ2UgKipwYWdlc190b19mcmVlOwotCXN0cnVjdCBsaXN0X2hlYWQgZF9wYWdl czsKLQl1bnNpZ25lZCBmcmVlZF9wYWdlcyA9IDAsCi0JCSBucGFnZXNfdG9fZnJlZSA9IG5yX2Zy ZWU7Ci0KLQlpZiAoTlVNX1BBR0VTX1RPX0FMTE9DIDwgbnJfZnJlZSkKLQkJbnBhZ2VzX3RvX2Zy ZWUgPSBOVU1fUEFHRVNfVE9fQUxMT0M7Ci0KLQlpZiAodXNlX3N0YXRpYykKLQkJcGFnZXNfdG9f ZnJlZSA9IHN0YXRpY19idWY7Ci0JZWxzZQotCQlwYWdlc190b19mcmVlID0ga21hbGxvY19hcnJh eShucGFnZXNfdG9fZnJlZSwKLQkJCQkJICAgICAgc2l6ZW9mKHN0cnVjdCBwYWdlICopLAotCQkJ CQkgICAgICBHRlBfS0VSTkVMKTsKLQotCWlmICghcGFnZXNfdG9fZnJlZSkgewotCQlwcl9kZWJ1 ZygiJXM6IEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHBvb2wgZnJlZSBvcGVyYXRpb25c biIsCi0JCSAgICAgICBwb29sLT5kZXZfbmFtZSk7Ci0JCXJldHVybiAwOwotCX0KLQlJTklUX0xJ U1RfSEVBRCgmZF9wYWdlcyk7Ci1yZXN0YXJ0OgotCXNwaW5fbG9ja19pcnFzYXZlKCZwb29sLT5s b2NrLCBpcnFfZmxhZ3MpOwotCi0JLyogV2UgcGlja2luZyB0aGUgb2xkZXN0IG9uZXMgb2ZmIHRo ZSBsaXN0ICovCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UoZG1hX3AsIHRtcCwg JnBvb2wtPmZyZWVfbGlzdCwKLQkJCQkJIHBhZ2VfbGlzdCkgewotCQlpZiAoZnJlZWRfcGFnZXMg Pj0gbnBhZ2VzX3RvX2ZyZWUpCi0JCQlicmVhazsKLQotCQkvKiBNb3ZlIHRoZSBkbWFfcGFnZSBm cm9tIG9uZSBsaXN0IHRvIGFub3RoZXIuICovCi0JCWxpc3RfbW92ZSgmZG1hX3AtPnBhZ2VfbGlz dCwgJmRfcGFnZXMpOwotCi0JCXBhZ2VzX3RvX2ZyZWVbZnJlZWRfcGFnZXMrK10gPSBkbWFfcC0+ cDsKLQkJLyogV2UgY2FuIG9ubHkgcmVtb3ZlIE5VTV9QQUdFU19UT19BTExPQyBhdCBhIHRpbWUu ICovCi0JCWlmIChmcmVlZF9wYWdlcyA+PSBOVU1fUEFHRVNfVE9fQUxMT0MpIHsKLQotCQkJdHRt X3Bvb2xfdXBkYXRlX2ZyZWVfbG9ja2VkKHBvb2wsIGZyZWVkX3BhZ2VzKTsKLQkJCS8qKgotCQkJ ICogQmVjYXVzZSBjaGFuZ2luZyBwYWdlIGNhY2hpbmcgaXMgY29zdGx5Ci0JCQkgKiB3ZSB1bmxv Y2sgdGhlIHBvb2wgdG8gcHJldmVudCBzdGFsbGluZy4KLQkJCSAqLwotCQkJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmcG9vbC0+bG9jaywgaXJxX2ZsYWdzKTsKLQotCQkJdHRtX2RtYV9wYWdlc19w dXQocG9vbCwgJmRfcGFnZXMsIHBhZ2VzX3RvX2ZyZWUsCi0JCQkJCSAgZnJlZWRfcGFnZXMpOwot Ci0JCQlJTklUX0xJU1RfSEVBRCgmZF9wYWdlcyk7Ci0KLQkJCWlmIChsaWtlbHkobnJfZnJlZSAh PSBGUkVFX0FMTF9QQUdFUykpCi0JCQkJbnJfZnJlZSAtPSBmcmVlZF9wYWdlczsKLQotCQkJaWYg KE5VTV9QQUdFU19UT19BTExPQyA+PSBucl9mcmVlKQotCQkJCW5wYWdlc190b19mcmVlID0gbnJf ZnJlZTsKLQkJCWVsc2UKLQkJCQlucGFnZXNfdG9fZnJlZSA9IE5VTV9QQUdFU19UT19BTExPQzsK LQotCQkJZnJlZWRfcGFnZXMgPSAwOwotCi0JCQkvKiBmcmVlIGFsbCBzbyByZXN0YXJ0IHRoZSBw cm9jZXNzaW5nICovCi0JCQlpZiAobnJfZnJlZSkKLQkJCQlnb3RvIHJlc3RhcnQ7Ci0KLQkJCS8q IE5vdCBhbGxvd2VkIHRvIGZhbGwgdGhyb3VnaCBvciBicmVhayBiZWNhdXNlCi0JCQkgKiBmb2xs b3dpbmcgY29udGV4dCBpcyBpbnNpZGUgc3BpbmxvY2sgd2hpbGUgd2UgYXJlCi0JCQkgKiBvdXRz aWRlIGhlcmUuCi0JCQkgKi8KLQkJCWdvdG8gb3V0OwotCi0JCX0KLQl9Ci0KLQkvKiByZW1vdmUg cmFuZ2Ugb2YgcGFnZXMgZnJvbSB0aGUgcG9vbCAqLwotCWlmIChmcmVlZF9wYWdlcykgewotCQl0 dG1fcG9vbF91cGRhdGVfZnJlZV9sb2NrZWQocG9vbCwgZnJlZWRfcGFnZXMpOwotCQlucl9mcmVl IC09IGZyZWVkX3BhZ2VzOwotCX0KLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBvb2wtPmxv Y2ssIGlycV9mbGFncyk7Ci0KLQlpZiAoZnJlZWRfcGFnZXMpCi0JCXR0bV9kbWFfcGFnZXNfcHV0 KHBvb2wsICZkX3BhZ2VzLCBwYWdlc190b19mcmVlLCBmcmVlZF9wYWdlcyk7Ci1vdXQ6Ci0JaWYg KHBhZ2VzX3RvX2ZyZWUgIT0gc3RhdGljX2J1ZikKLQkJa2ZyZWUocGFnZXNfdG9fZnJlZSk7Ci0J cmV0dXJuIG5yX2ZyZWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHR0bV9kbWFfZnJlZV9wb29sKHN0cnVj dCBkZXZpY2UgKmRldiwgZW51bSBwb29sX3R5cGUgdHlwZSkKLXsKLQlzdHJ1Y3QgZGV2aWNlX3Bv b2xzICpwOwotCXN0cnVjdCBkbWFfcG9vbCAqcG9vbDsKLQotCWlmICghZGV2KQotCQlyZXR1cm47 Ci0KLQltdXRleF9sb2NrKCZfbWFuYWdlci0+bG9jayk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9y ZXZlcnNlKHAsICZfbWFuYWdlci0+cG9vbHMsIHBvb2xzKSB7Ci0JCWlmIChwLT5kZXYgIT0gZGV2 KQotCQkJY29udGludWU7Ci0JCXBvb2wgPSBwLT5wb29sOwotCQlpZiAocG9vbC0+dHlwZSAhPSB0 eXBlKQotCQkJY29udGludWU7Ci0KLQkJbGlzdF9kZWwoJnAtPnBvb2xzKTsKLQkJa2ZyZWUocCk7 Ci0JCV9tYW5hZ2VyLT5ucG9vbHMtLTsKLQkJYnJlYWs7Ci0JfQotCWxpc3RfZm9yX2VhY2hfZW50 cnlfcmV2ZXJzZShwb29sLCAmZGV2LT5kbWFfcG9vbHMsIHBvb2xzKSB7Ci0JCWlmIChwb29sLT50 eXBlICE9IHR5cGUpCi0JCQljb250aW51ZTsKLQkJLyogVGFrZXMgYSBzcGlubG9jay4uICovCi0J CS8qIE9LIHRvIHVzZSBzdGF0aWMgYnVmZmVyIHNpbmNlIGdsb2JhbCBtdXRleCBpcyBoZWxkLiAq LwotCQl0dG1fZG1hX3BhZ2VfcG9vbF9mcmVlKHBvb2wsIEZSRUVfQUxMX1BBR0VTLCB0cnVlKTsK LQkJV0FSTl9PTigoKHBvb2wtPm5wYWdlc19pbl91c2UgKyBwb29sLT5ucGFnZXNfZnJlZSkgIT0g MCkpOwotCQkvKiBUaGlzIGNvZGUgcGF0aCBpcyBjYWxsZWQgYWZ0ZXIgX2FsbF8gcmVmZXJlbmNl cyB0byB0aGUKLQkJICogc3RydWN0IGRldmljZSBoYXMgYmVlbiBkcm9wcGVkIC0gc28gbm9ib2R5 IHNob3VsZCBiZQotCQkgKiB0b3VjaGluZyBpdC4gSW4gY2FzZSBzb21lYm9keSBpcyB0cnlpbmcg dG8gX2FkZF8gd2UgYXJlCi0JCSAqIGd1YXJkZWQgYnkgdGhlIG11dGV4LiAqLwotCQlsaXN0X2Rl bCgmcG9vbC0+cG9vbHMpOwotCQlrZnJlZShwb29sKTsKLQkJYnJlYWs7Ci0JfQotCW11dGV4X3Vu bG9jaygmX21hbmFnZXItPmxvY2spOwotfQotCi0vKgotICogT24gZnJlZS1pbmcgb2YgdGhlICdz dHJ1Y3QgZGV2aWNlJyB0aGlzIGRlY29uc3RydWN0b3IgaXMgcnVuLgotICogQWxiZWl0IHRoZSBw b29sIG1pZ2h0IGhhdmUgYWxyZWFkeSBiZWVuIGZyZWVkIGVhcmxpZXIuCi0gKi8KLXN0YXRpYyB2 b2lkIHR0bV9kbWFfcG9vbF9yZWxlYXNlKHN0cnVjdCBkZXZpY2UgKmRldiwgdm9pZCAqcmVzKQot ewotCXN0cnVjdCBkbWFfcG9vbCAqcG9vbCA9ICooc3RydWN0IGRtYV9wb29sICoqKXJlczsKLQot CWlmIChwb29sKQotCQl0dG1fZG1hX2ZyZWVfcG9vbChkZXYsIHBvb2wtPnR5cGUpOwotfQotCi1z dGF0aWMgaW50IHR0bV9kbWFfcG9vbF9tYXRjaChzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKnJl cywgdm9pZCAqbWF0Y2hfZGF0YSkKLXsKLQlyZXR1cm4gKihzdHJ1Y3QgZG1hX3Bvb2wgKiopcmVz ID09IG1hdGNoX2RhdGE7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3QgZG1hX3Bvb2wgKnR0bV9kbWFfcG9v bF9pbml0KHN0cnVjdCBkZXZpY2UgKmRldiwgZ2ZwX3QgZmxhZ3MsCi0JCQkJCSAgZW51bSBwb29s X3R5cGUgdHlwZSkKLXsKLQljb25zdCBjaGFyICpuW10gPSB7IndjIiwgInVjIiwgImNhY2hlZCIs ICIgZG1hMzIiLCAiaHVnZSJ9OwotCWVudW0gcG9vbF90eXBlIHRbXSA9IHtJU19XQywgSVNfVUMs IElTX0NBQ0hFRCwgSVNfRE1BMzIsIElTX0hVR0V9OwotCXN0cnVjdCBkZXZpY2VfcG9vbHMgKnNl Y19wb29sID0gTlVMTDsKLQlzdHJ1Y3QgZG1hX3Bvb2wgKnBvb2wgPSBOVUxMLCAqKnB0cjsKLQl1 bnNpZ25lZCBpOwotCWludCByZXQgPSAtRU5PREVWOwotCWNoYXIgKnA7Ci0KLQlpZiAoIWRldikK LQkJcmV0dXJuIE5VTEw7Ci0KLQlwdHIgPSBkZXZyZXNfYWxsb2ModHRtX2RtYV9wb29sX3JlbGVh c2UsIHNpemVvZigqcHRyKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwdHIpCi0JCXJldHVybiBOVUxM OwotCi0JcmV0ID0gLUVOT01FTTsKLQotCXBvb2wgPSBrbWFsbG9jX25vZGUoc2l6ZW9mKHN0cnVj dCBkbWFfcG9vbCksIEdGUF9LRVJORUwsCi0JCQkgICAgZGV2X3RvX25vZGUoZGV2KSk7Ci0JaWYg KCFwb29sKQotCQlnb3RvIGVycl9tZW07Ci0KLQlzZWNfcG9vbCA9IGttYWxsb2Nfbm9kZShzaXpl b2Yoc3RydWN0IGRldmljZV9wb29scyksIEdGUF9LRVJORUwsCi0JCQkJZGV2X3RvX25vZGUoZGV2 KSk7Ci0JaWYgKCFzZWNfcG9vbCkKLQkJZ290byBlcnJfbWVtOwotCi0JSU5JVF9MSVNUX0hFQUQo JnNlY19wb29sLT5wb29scyk7Ci0Jc2VjX3Bvb2wtPmRldiA9IGRldjsKLQlzZWNfcG9vbC0+cG9v bCA9ICBwb29sOwotCi0JSU5JVF9MSVNUX0hFQUQoJnBvb2wtPmZyZWVfbGlzdCk7Ci0JSU5JVF9M SVNUX0hFQUQoJnBvb2wtPnBvb2xzKTsKLQlzcGluX2xvY2tfaW5pdCgmcG9vbC0+bG9jayk7Ci0J cG9vbC0+ZGV2ID0gZGV2OwotCXBvb2wtPm5wYWdlc19mcmVlID0gcG9vbC0+bnBhZ2VzX2luX3Vz ZSA9IDA7Ci0JcG9vbC0+bmZyZWVzID0gMDsKLQlwb29sLT5nZnBfZmxhZ3MgPSBmbGFnczsKLQlp ZiAodHlwZSAmIElTX0hVR0UpCi0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQQUdFCi0J CXBvb2wtPnNpemUgPSBIUEFHRV9QTURfU0laRTsKLSNlbHNlCi0JCUJVRygpOwotI2VuZGlmCi0J ZWxzZQotCQlwb29sLT5zaXplID0gUEFHRV9TSVpFOwotCXBvb2wtPnR5cGUgPSB0eXBlOwotCXBv b2wtPm5yZWZpbGxzID0gMDsKLQlwID0gcG9vbC0+bmFtZTsKLQlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRSh0KTsgaSsrKSB7Ci0JCWlmICh0eXBlICYgdFtpXSkgewotCQkJcCArPSBzY25wcmlu dGYocCwgc2l6ZW9mKHBvb2wtPm5hbWUpIC0gKHAgLSBwb29sLT5uYW1lKSwKLQkJCQkgICAgICAi JXMiLCBuW2ldKTsKLQkJfQotCX0KLQkqcCA9IDA7Ci0JLyogV2UgY29weSB0aGUgbmFtZSBmb3Ig cHJfIGNhbGxzIGIvYyB3aGVuIGRtYV9wb29sX2Rlc3Ryb3kgaXMgY2FsbGVkCi0JICogLSB0aGUg a29iai0+bmFtZSBoYXMgYWxyZWFkeSBiZWVuIGRlYWxsb2NhdGVkLiovCi0Jc25wcmludGYocG9v bC0+ZGV2X25hbWUsIHNpemVvZihwb29sLT5kZXZfbmFtZSksICIlcyAlcyIsCi0JCSBkZXZfZHJp dmVyX3N0cmluZyhkZXYpLCBkZXZfbmFtZShkZXYpKTsKLQltdXRleF9sb2NrKCZfbWFuYWdlci0+ bG9jayk7Ci0JLyogWW91IGNhbiBnZXQgdGhlIGRtYV9wb29sIGZyb20gZWl0aGVyIHRoZSBnbG9i YWw6ICovCi0JbGlzdF9hZGQoJnNlY19wb29sLT5wb29scywgJl9tYW5hZ2VyLT5wb29scyk7Ci0J X21hbmFnZXItPm5wb29scysrOwotCS8qIG9yIGZyb20gJ3N0cnVjdCBkZXZpY2UnOiAqLwotCWxp c3RfYWRkKCZwb29sLT5wb29scywgJmRldi0+ZG1hX3Bvb2xzKTsKLQltdXRleF91bmxvY2soJl9t YW5hZ2VyLT5sb2NrKTsKLQotCSpwdHIgPSBwb29sOwotCWRldnJlc19hZGQoZGV2LCBwdHIpOwot Ci0JcmV0dXJuIHBvb2w7Ci1lcnJfbWVtOgotCWRldnJlc19mcmVlKHB0cik7Ci0Ja2ZyZWUoc2Vj X3Bvb2wpOwotCWtmcmVlKHBvb2wpOwotCXJldHVybiBFUlJfUFRSKHJldCk7Ci19Ci0KLXN0YXRp YyBzdHJ1Y3QgZG1hX3Bvb2wgKnR0bV9kbWFfZmluZF9wb29sKHN0cnVjdCBkZXZpY2UgKmRldiwK LQkJCQkJICBlbnVtIHBvb2xfdHlwZSB0eXBlKQotewotCXN0cnVjdCBkbWFfcG9vbCAqcG9vbCwg KnRtcDsKLQotCWlmICh0eXBlID09IElTX1VOREVGSU5FRCkKLQkJcmV0dXJuIE5VTEw7Ci0KLQkv KiBOQjogV2UgaXRlcmF0ZSBvbiB0aGUgJ3N0cnVjdCBkZXYnIHdoaWNoIGhhcyBubyBzcGlubG9j aywgYnV0Ci0JICogaXQgZG9lcyBoYXZlIGEga3JlZiB3aGljaCB3ZSBoYXZlIHRha2VuLiBUaGUg a3JlZiBpcyB0YWtlbiBkdXJpbmcKLQkgKiBncmFwaGljIGRyaXZlciBsb2FkaW5nIC0gaW4gdGhl IGRybV9wY2lfaW5pdCBpdCBjYWxscyBlaXRoZXIKLQkgKiBwY2lfZGV2X2dldCBvciBwY2lfcmVn aXN0ZXJfZHJpdmVyIHdoaWNoIGJvdGggZW5kIHVwIHRha2luZyBhIGtyZWYKLQkgKiBvbiAnc3Ry dWN0IGRldmljZScuCi0JICoKLQkgKiBPbiB0ZWFyZG93biwgdGhlIGdyYXBoaWMgZHJpdmVycyBl bmQgdXAgcXVpZXNjaW5nIHRoZSBUVE0gKHB1dF9wYWdlcykKLQkgKiBhbmQgY2FsbHMgdGhlIGRl dl9yZXMgZGVjb25zdHJ1Y3RvcnM6IHR0bV9kbWFfcG9vbF9yZWxlYXNlLiBUaGUgbmljZQotCSAq IHRoaW5nIGlzIGF0IHRoYXQgcG9pbnQgb2YgdGltZSB0aGVyZSBhcmUgbm8gcGFnZXMgYXNzb2Np YXRlZCB3aXRoIHRoZQotCSAqIGRyaXZlciBzbyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNh bGxlZC4KLQkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9vbCwgdG1wLCAmZGV2LT5k bWFfcG9vbHMsIHBvb2xzKQotCQlpZiAocG9vbC0+dHlwZSA9PSB0eXBlKQotCQkJcmV0dXJuIHBv b2w7Ci0JcmV0dXJuIE5VTEw7Ci19Ci0KLS8qCi0gKiBGcmVlIHBhZ2VzIHRoZSBwYWdlcyB0aGF0 IGZhaWxlZCB0byBjaGFuZ2UgdGhlIGNhY2hpbmcgc3RhdGUuIElmIHRoZXJlCi0gKiBhcmUgcGFn ZXMgdGhhdCBoYXZlIGNoYW5nZWQgdGhlaXIgY2FjaGluZyBzdGF0ZSBhbHJlYWR5IHB1dCB0aGVt IHRvIHRoZQotICogcG9vbC4KLSAqLwotc3RhdGljIHZvaWQgdHRtX2RtYV9oYW5kbGVfY2FjaGlu Z19mYWlsdXJlKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwKLQkJCQkJCSBzdHJ1Y3QgbGlzdF9oZWFk ICpkX3BhZ2VzLAotCQkJCQkJIHN0cnVjdCBwYWdlICoqZmFpbGVkX3BhZ2VzLAotCQkJCQkJIHVu c2lnbmVkIGNwYWdlcykKLXsKLQlzdHJ1Y3QgZG1hX3BhZ2UgKmRfcGFnZSwgKnRtcDsKLQlzdHJ1 Y3QgcGFnZSAqcDsKLQl1bnNpZ25lZCBpID0gMDsKLQotCXAgPSBmYWlsZWRfcGFnZXNbMF07Ci0J aWYgKCFwKQotCQlyZXR1cm47Ci0JLyogRmluZCB0aGUgZmFpbGVkIHBhZ2UuICovCi0JbGlzdF9m b3JfZWFjaF9lbnRyeV9zYWZlKGRfcGFnZSwgdG1wLCBkX3BhZ2VzLCBwYWdlX2xpc3QpIHsKLQkJ aWYgKGRfcGFnZS0+cCAhPSBwKQotCQkJY29udGludWU7Ci0JCS8qIC4uIGFuZCB0aGVuIHByb2dy ZXNzIG92ZXIgdGhlIGZ1bGwgbGlzdC4gKi8KLQkJbGlzdF9kZWwoJmRfcGFnZS0+cGFnZV9saXN0 KTsKLQkJX190dG1fZG1hX2ZyZWVfcGFnZShwb29sLCBkX3BhZ2UpOwotCQlpZiAoKytpIDwgY3Bh Z2VzKQotCQkJcCA9IGZhaWxlZF9wYWdlc1tpXTsKLQkJZWxzZQotCQkJYnJlYWs7Ci0JfQotCi19 Ci0KLS8qCi0gKiBBbGxvY2F0ZSAnY291bnQnIHBhZ2VzLCBhbmQgcHV0ICduZWVkJyBudW1iZXIg b2YgdGhlbSBvbiB0aGUKLSAqICdwYWdlcycgYW5kIGFzIHdlbGwgb24gdGhlICdkbWFfYWRkcmVz cycgc3RhcnRpbmcgYXQgJ2RtYV9vZmZzZXQnIG9mZnNldC4KLSAqIFRoZSBmdWxsIGxpc3Qgb2Yg cGFnZXMgc2hvdWxkIGFsc28gYmUgb24gJ2RfcGFnZXMnLgotICogV2UgcmV0dXJuIHplcm8gZm9y IHN1Y2Nlc3MsIGFuZCBuZWdhdGl2ZSBudW1iZXJzIGFzIGVycm9ycy4KLSAqLwotc3RhdGljIGlu dCB0dG1fZG1hX3Bvb2xfYWxsb2NfbmV3X3BhZ2VzKHN0cnVjdCBkbWFfcG9vbCAqcG9vbCwKLQkJ CQkJc3RydWN0IGxpc3RfaGVhZCAqZF9wYWdlcywKLQkJCQkJdW5zaWduZWQgY291bnQpCi17Ci0J c3RydWN0IHBhZ2UgKipjYWNoaW5nX2FycmF5OwotCXN0cnVjdCBkbWFfcGFnZSAqZG1hX3A7Ci0J c3RydWN0IHBhZ2UgKnA7Ci0JaW50IHIgPSAwOwotCXVuc2lnbmVkIGksIGosIG5wYWdlcywgY3Bh Z2VzOwotCXVuc2lnbmVkIG1heF9jcGFnZXMgPSBtaW4oY291bnQsCi0JCQkodW5zaWduZWQpKFBB R0VfU0laRS9zaXplb2Yoc3RydWN0IHBhZ2UgKikpKTsKLQotCS8qIGFsbG9jYXRlIGFycmF5IGZv ciBwYWdlIGNhY2hpbmcgY2hhbmdlICovCi0JY2FjaGluZ19hcnJheSA9IGttYWxsb2NfYXJyYXko bWF4X2NwYWdlcywgc2l6ZW9mKHN0cnVjdCBwYWdlICopLAotCQkJCSAgICAgIEdGUF9LRVJORUwp OwotCi0JaWYgKCFjYWNoaW5nX2FycmF5KSB7Ci0JCXByX2RlYnVnKCIlczogVW5hYmxlIHRvIGFs bG9jYXRlIHRhYmxlIGZvciBuZXcgcGFnZXNcbiIsCi0JCSAgICAgICBwb29sLT5kZXZfbmFtZSk7 Ci0JCXJldHVybiAtRU5PTUVNOwotCX0KLQotCWlmIChjb3VudCA+IDEpCi0JCXByX2RlYnVnKCIl czogKCVzOiVkKSBHZXR0aW5nICVkIHBhZ2VzXG4iLAotCQkJIHBvb2wtPmRldl9uYW1lLCBwb29s LT5uYW1lLCBjdXJyZW50LT5waWQsIGNvdW50KTsKLQotCWZvciAoaSA9IDAsIGNwYWdlcyA9IDA7 IGkgPCBjb3VudDsgKytpKSB7Ci0JCWRtYV9wID0gX190dG1fZG1hX2FsbG9jX3BhZ2UocG9vbCk7 Ci0JCWlmICghZG1hX3ApIHsKLQkJCXByX2RlYnVnKCIlczogVW5hYmxlIHRvIGdldCBwYWdlICV1 XG4iLAotCQkJCSBwb29sLT5kZXZfbmFtZSwgaSk7Ci0KLQkJCS8qIHN0b3JlIGFscmVhZHkgYWxs b2NhdGVkIHBhZ2VzIGluIHRoZSBwb29sIGFmdGVyCi0JCQkgKiBzZXR0aW5nIHRoZSBjYWNoaW5n IHN0YXRlICovCi0JCQlpZiAoY3BhZ2VzKSB7Ci0JCQkJciA9IHR0bV9zZXRfcGFnZXNfY2FjaGlu Zyhwb29sLCBjYWNoaW5nX2FycmF5LAotCQkJCQkJCSAgY3BhZ2VzKTsKLQkJCQlpZiAocikKLQkJ CQkJdHRtX2RtYV9oYW5kbGVfY2FjaGluZ19mYWlsdXJlKAotCQkJCQkJcG9vbCwgZF9wYWdlcywg Y2FjaGluZ19hcnJheSwKLQkJCQkJCWNwYWdlcyk7Ci0JCQl9Ci0JCQlyID0gLUVOT01FTTsKLQkJ CWdvdG8gb3V0OwotCQl9Ci0JCXAgPSBkbWFfcC0+cDsKLQkJbGlzdF9hZGQoJmRtYV9wLT5wYWdl X2xpc3QsIGRfcGFnZXMpOwotCi0jaWZkZWYgQ09ORklHX0hJR0hNRU0KLQkJLyogZ2ZwIGZsYWdz IG9mIGhpZ2htZW0gcGFnZSBzaG91bGQgbmV2ZXIgYmUgZG1hMzIgc28gd2UKLQkJICogd2Ugc2hv dWxkIGJlIGZpbmUgaW4gc3VjaCBjYXNlCi0JCSAqLwotCQlpZiAoUGFnZUhpZ2hNZW0ocCkpCi0J CQljb250aW51ZTsKLSNlbmRpZgotCi0JCW5wYWdlcyA9IHBvb2wtPnNpemUgLyBQQUdFX1NJWkU7 Ci0JCWZvciAoaiA9IDA7IGogPCBucGFnZXM7ICsraikgewotCQkJY2FjaGluZ19hcnJheVtjcGFn ZXMrK10gPSBwICsgajsKLQkJCWlmIChjcGFnZXMgPT0gbWF4X2NwYWdlcykgewotCQkJCS8qIE5v dGU6IENhbm5vdCBob2xkIHRoZSBzcGlubG9jayAqLwotCQkJCXIgPSB0dG1fc2V0X3BhZ2VzX2Nh Y2hpbmcocG9vbCwgY2FjaGluZ19hcnJheSwKLQkJCQkJCQkgIGNwYWdlcyk7Ci0JCQkJaWYgKHIp IHsKLQkJCQkJdHRtX2RtYV9oYW5kbGVfY2FjaGluZ19mYWlsdXJlKAotCQkJCQkgICAgIHBvb2ws IGRfcGFnZXMsIGNhY2hpbmdfYXJyYXksCi0JCQkJCSAgICAgY3BhZ2VzKTsKLQkJCQkJZ290byBv dXQ7Ci0JCQkJfQotCQkJCWNwYWdlcyA9IDA7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlpZiAoY3BhZ2Vz KSB7Ci0JCXIgPSB0dG1fc2V0X3BhZ2VzX2NhY2hpbmcocG9vbCwgY2FjaGluZ19hcnJheSwgY3Bh Z2VzKTsKLQkJaWYgKHIpCi0JCQl0dG1fZG1hX2hhbmRsZV9jYWNoaW5nX2ZhaWx1cmUocG9vbCwg ZF9wYWdlcywKLQkJCQkJY2FjaGluZ19hcnJheSwgY3BhZ2VzKTsKLQl9Ci1vdXQ6Ci0Ja2ZyZWUo Y2FjaGluZ19hcnJheSk7Ci0JcmV0dXJuIHI7Ci19Ci0KLS8qCi0gKiBAcmV0dXJuIGNvdW50IG9m IHBhZ2VzIHN0aWxsIHJlcXVpcmVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QuCi0gKi8KLXN0YXRp YyBpbnQgdHRtX2RtYV9wYWdlX3Bvb2xfZmlsbF9sb2NrZWQoc3RydWN0IGRtYV9wb29sICpwb29s LAotCQkJCQkgdW5zaWduZWQgbG9uZyAqaXJxX2ZsYWdzKQotewotCXVuc2lnbmVkIGNvdW50ID0g X21hbmFnZXItPm9wdGlvbnMuc21hbGw7Ci0JaW50IHIgPSBwb29sLT5ucGFnZXNfZnJlZTsKLQot CWlmIChjb3VudCA+IHBvb2wtPm5wYWdlc19mcmVlKSB7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgZF9w YWdlczsKLQotCQlJTklUX0xJU1RfSEVBRCgmZF9wYWdlcyk7Ci0KLQkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmcG9vbC0+bG9jaywgKmlycV9mbGFncyk7Ci0KLQkJLyogUmV0dXJucyBob3cgbWFu eSBtb3JlIGFyZSBuZWNjZXNzYXJ5IHRvIGZ1bGZpbGwgdGhlCi0JCSAqIHJlcXVlc3QuICovCi0J CXIgPSB0dG1fZG1hX3Bvb2xfYWxsb2NfbmV3X3BhZ2VzKHBvb2wsICZkX3BhZ2VzLCBjb3VudCk7 Ci0KLQkJc3Bpbl9sb2NrX2lycXNhdmUoJnBvb2wtPmxvY2ssICppcnFfZmxhZ3MpOwotCQlpZiAo IXIpIHsKLQkJCS8qIEFkZCB0aGUgZnJlc2ggdG8gdGhlIGVuZC4uICovCi0JCQlsaXN0X3NwbGlj ZSgmZF9wYWdlcywgJnBvb2wtPmZyZWVfbGlzdCk7Ci0JCQkrK3Bvb2wtPm5yZWZpbGxzOwotCQkJ cG9vbC0+bnBhZ2VzX2ZyZWUgKz0gY291bnQ7Ci0JCQlyID0gY291bnQ7Ci0JCX0gZWxzZSB7Ci0J CQlzdHJ1Y3QgZG1hX3BhZ2UgKmRfcGFnZTsKLQkJCXVuc2lnbmVkIGNwYWdlcyA9IDA7Ci0KLQkJ CXByX2RlYnVnKCIlczogRmFpbGVkIHRvIGZpbGwgJXMgcG9vbCAocjolZCkhXG4iLAotCQkJCSBw b29sLT5kZXZfbmFtZSwgcG9vbC0+bmFtZSwgcik7Ci0KLQkJCWxpc3RfZm9yX2VhY2hfZW50cnko ZF9wYWdlLCAmZF9wYWdlcywgcGFnZV9saXN0KSB7Ci0JCQkJY3BhZ2VzKys7Ci0JCQl9Ci0JCQls aXN0X3NwbGljZV90YWlsKCZkX3BhZ2VzLCAmcG9vbC0+ZnJlZV9saXN0KTsKLQkJCXBvb2wtPm5w YWdlc19mcmVlICs9IGNwYWdlczsKLQkJCXIgPSBjcGFnZXM7Ci0JCX0KLQl9Ci0JcmV0dXJuIHI7 Ci19Ci0KLS8qCi0gKiBUaGUgcG9wdWxhdGUgbGlzdCBpcyBhY3R1YWxseSBhIHN0YWNrIChub3Qg dGhhdCBpcyBtYXR0ZXJzIGFzIFRUTQotICogYWxsb2NhdGVzIG9uZSBwYWdlIGF0IGEgdGltZS4K LSAqIHJldHVybiBkbWFfcGFnZSBwb2ludGVyIGlmIHN1Y2Nlc3MsIG90aGVyd2lzZSBOVUxMLgot ICovCi1zdGF0aWMgc3RydWN0IGRtYV9wYWdlICp0dG1fZG1hX3Bvb2xfZ2V0X3BhZ2VzKHN0cnVj dCBkbWFfcG9vbCAqcG9vbCwKLQkJCQkgIHN0cnVjdCB0dG1fdHQgKnR0bSwKLQkJCQkgIHVuc2ln bmVkIGluZGV4KQotewotCXN0cnVjdCBkbWFfcGFnZSAqZF9wYWdlID0gTlVMTDsKLQl1bnNpZ25l ZCBsb25nIGlycV9mbGFnczsKLQlpbnQgY291bnQ7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9v bC0+bG9jaywgaXJxX2ZsYWdzKTsKLQljb3VudCA9IHR0bV9kbWFfcGFnZV9wb29sX2ZpbGxfbG9j a2VkKHBvb2wsICZpcnFfZmxhZ3MpOwotCWlmIChjb3VudCkgewotCQlkX3BhZ2UgPSBsaXN0X2Zp cnN0X2VudHJ5KCZwb29sLT5mcmVlX2xpc3QsIHN0cnVjdCBkbWFfcGFnZSwgcGFnZV9saXN0KTsK LQkJdHRtLT5wYWdlc1tpbmRleF0gPSBkX3BhZ2UtPnA7Ci0JCXR0bS0+ZG1hX2FkZHJlc3NbaW5k ZXhdID0gZF9wYWdlLT5kbWE7Ci0JCWxpc3RfbW92ZV90YWlsKCZkX3BhZ2UtPnBhZ2VfbGlzdCwg JnR0bS0+cGFnZXNfbGlzdCk7Ci0JCXBvb2wtPm5wYWdlc19pbl91c2UgKz0gMTsKLQkJcG9vbC0+ bnBhZ2VzX2ZyZWUgLT0gMTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+bG9j aywgaXJxX2ZsYWdzKTsKLQlyZXR1cm4gZF9wYWdlOwotfQotCi1zdGF0aWMgZ2ZwX3QgdHRtX2Rt YV9wb29sX2dmcF9mbGFncyhzdHJ1Y3QgdHRtX3R0ICp0dG0sIGJvb2wgaHVnZSkKLXsKLQlnZnBf dCBnZnBfZmxhZ3M7Ci0KLQlpZiAodHRtLT5wYWdlX2ZsYWdzICYgVFRNX1BBR0VfRkxBR19ETUEz MikKLQkJZ2ZwX2ZsYWdzID0gR0ZQX1VTRVIgfCBHRlBfRE1BMzI7Ci0JZWxzZQotCQlnZnBfZmxh Z3MgPSBHRlBfSElHSFVTRVI7Ci0JaWYgKHR0bS0+cGFnZV9mbGFncyAmIFRUTV9QQUdFX0ZMQUdf WkVST19BTExPQykKLQkJZ2ZwX2ZsYWdzIHw9IF9fR0ZQX1pFUk87Ci0KLQlpZiAoaHVnZSkgewot CQlnZnBfZmxhZ3MgfD0gR0ZQX1RSQU5TSFVHRV9MSUdIVCB8IF9fR0ZQX05PUkVUUlkgfAotCQkJ X19HRlBfS1NXQVBEX1JFQ0xBSU07Ci0JCWdmcF9mbGFncyAmPSB+X19HRlBfTU9WQUJMRTsKLQkJ Z2ZwX2ZsYWdzICY9IH5fX0dGUF9DT01QOwotCX0KLQotCWlmICh0dG0tPnBhZ2VfZmxhZ3MgJiBU VE1fUEFHRV9GTEFHX05PX1JFVFJZKQotCQlnZnBfZmxhZ3MgfD0gX19HRlBfUkVUUllfTUFZRkFJ TDsKLQotCXJldHVybiBnZnBfZmxhZ3M7Ci19Ci0KLS8qCi0gKiBPbiBzdWNjZXNzIHBhZ2VzIGxp c3Qgd2lsbCBob2xkIGNvdW50IG51bWJlciBvZiBjb3JyZWN0bHkKLSAqIGNhY2hlZCBwYWdlcy4g T24gZmFpbHVyZSB3aWxsIGhvbGQgdGhlIG5lZ2F0aXZlIHJldHVybiB2YWx1ZSAoLUVOT01FTSwg ZXRjKS4KLSAqLwotaW50IHR0bV9kbWFfcG9wdWxhdGUoc3RydWN0IHR0bV90dCAqdHRtLCBzdHJ1 Y3QgZGV2aWNlICpkZXYsCi0JCQlzdHJ1Y3QgdHRtX29wZXJhdGlvbl9jdHggKmN0eCkKLXsKLQlz dHJ1Y3QgdHRtX21lbV9nbG9iYWwgKm1lbV9nbG9iID0gJnR0bV9tZW1fZ2xvYjsKLQl1bnNpZ25l ZCBsb25nIG51bV9wYWdlcyA9IHR0bS0+bnVtX3BhZ2VzOwotCXN0cnVjdCBkbWFfcG9vbCAqcG9v bDsKLQlzdHJ1Y3QgZG1hX3BhZ2UgKmRfcGFnZTsKLQllbnVtIHBvb2xfdHlwZSB0eXBlOwotCXVu c2lnbmVkIGk7Ci0JaW50IHJldDsKLQotCWlmICh0dG1fdHRfaXNfcG9wdWxhdGVkKHR0bSkpCi0J CXJldHVybiAwOwotCi0JaWYgKHR0bV9jaGVja191bmRlcl9sb3dlcmxpbWl0KG1lbV9nbG9iLCBu dW1fcGFnZXMsIGN0eCkpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JSU5JVF9MSVNUX0hFQUQoJnR0 bS0+cGFnZXNfbGlzdCk7Ci0JaSA9IDA7Ci0KLQl0eXBlID0gdHRtX3RvX3R5cGUodHRtLT5wYWdl X2ZsYWdzLCB0dG0tPmNhY2hpbmcpOwotCi0jaWZkZWYgQ09ORklHX1RSQU5TUEFSRU5UX0hVR0VQ QUdFCi0JaWYgKHR0bS0+cGFnZV9mbGFncyAmIFRUTV9QQUdFX0ZMQUdfRE1BMzIpCi0JCWdvdG8g c2tpcF9odWdlOwotCi0JcG9vbCA9IHR0bV9kbWFfZmluZF9wb29sKGRldiwgdHlwZSB8IElTX0hV R0UpOwotCWlmICghcG9vbCkgewotCQlnZnBfdCBnZnBfZmxhZ3MgPSB0dG1fZG1hX3Bvb2xfZ2Zw X2ZsYWdzKHR0bSwgdHJ1ZSk7Ci0KLQkJcG9vbCA9IHR0bV9kbWFfcG9vbF9pbml0KGRldiwgZ2Zw X2ZsYWdzLCB0eXBlIHwgSVNfSFVHRSk7Ci0JCWlmIChJU19FUlJfT1JfTlVMTChwb29sKSkKLQkJ CWdvdG8gc2tpcF9odWdlOwotCX0KLQotCXdoaWxlIChudW1fcGFnZXMgPj0gSFBBR0VfUE1EX05S KSB7Ci0JCXVuc2lnbmVkIGo7Ci0KLQkJZF9wYWdlID0gdHRtX2RtYV9wb29sX2dldF9wYWdlcyhw b29sLCB0dG0sIGkpOwotCQlpZiAoIWRfcGFnZSkKLQkJCWJyZWFrOwotCi0JCXJldCA9IHR0bV9t ZW1fZ2xvYmFsX2FsbG9jX3BhZ2UobWVtX2dsb2IsIHR0bS0+cGFnZXNbaV0sCi0JCQkJCQlwb29s LT5zaXplLCBjdHgpOwotCQlpZiAodW5saWtlbHkocmV0ICE9IDApKSB7Ci0JCQl0dG1fZG1hX3Vu cG9wdWxhdGUodHRtLCBkZXYpOwotCQkJcmV0dXJuIC1FTk9NRU07Ci0JCX0KLQotCQlkX3BhZ2Ut PnZhZGRyIHw9IFZBRERSX0ZMQUdfVVBEQVRFRF9DT1VOVDsKLQkJZm9yIChqID0gaSArIDE7IGog PCAoaSArIEhQQUdFX1BNRF9OUik7ICsraikgewotCQkJdHRtLT5wYWdlc1tqXSA9IHR0bS0+cGFn ZXNbaiAtIDFdICsgMTsKLQkJCXR0bS0+ZG1hX2FkZHJlc3Nbal0gPSB0dG0tPmRtYV9hZGRyZXNz W2ogLSAxXSArCi0JCQkJUEFHRV9TSVpFOwotCQl9Ci0KLQkJaSArPSBIUEFHRV9QTURfTlI7Ci0J CW51bV9wYWdlcyAtPSBIUEFHRV9QTURfTlI7Ci0JfQotCi1za2lwX2h1Z2U6Ci0jZW5kaWYKLQot CXBvb2wgPSB0dG1fZG1hX2ZpbmRfcG9vbChkZXYsIHR5cGUpOwotCWlmICghcG9vbCkgewotCQln ZnBfdCBnZnBfZmxhZ3MgPSB0dG1fZG1hX3Bvb2xfZ2ZwX2ZsYWdzKHR0bSwgZmFsc2UpOwotCi0J CXBvb2wgPSB0dG1fZG1hX3Bvb2xfaW5pdChkZXYsIGdmcF9mbGFncywgdHlwZSk7Ci0JCWlmIChJ U19FUlJfT1JfTlVMTChwb29sKSkKLQkJCXJldHVybiAtRU5PTUVNOwotCX0KLQotCXdoaWxlIChu dW1fcGFnZXMpIHsKLQkJZF9wYWdlID0gdHRtX2RtYV9wb29sX2dldF9wYWdlcyhwb29sLCB0dG0s IGkpOwotCQlpZiAoIWRfcGFnZSkgewotCQkJdHRtX2RtYV91bnBvcHVsYXRlKHR0bSwgZGV2KTsK LQkJCXJldHVybiAtRU5PTUVNOwotCQl9Ci0KLQkJcmV0ID0gdHRtX21lbV9nbG9iYWxfYWxsb2Nf cGFnZShtZW1fZ2xvYiwgdHRtLT5wYWdlc1tpXSwKLQkJCQkJCXBvb2wtPnNpemUsIGN0eCk7Ci0J CWlmICh1bmxpa2VseShyZXQgIT0gMCkpIHsKLQkJCXR0bV9kbWFfdW5wb3B1bGF0ZSh0dG0sIGRl dik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKLQkJfQotCi0JCWRfcGFnZS0+dmFkZHIgfD0gVkFERFJf RkxBR19VUERBVEVEX0NPVU5UOwotCQkrK2k7Ci0JCS0tbnVtX3BhZ2VzOwotCX0KLQotCXJldHVy biAwOwotfQotRVhQT1JUX1NZTUJPTF9HUEwodHRtX2RtYV9wb3B1bGF0ZSk7Ci0KLS8qIFB1dCBh bGwgcGFnZXMgaW4gcGFnZXMgbGlzdCB0byBjb3JyZWN0IHBvb2wgdG8gd2FpdCBmb3IgcmV1c2Ug Ki8KLXZvaWQgdHRtX2RtYV91bnBvcHVsYXRlKHN0cnVjdCB0dG1fdHQgKnR0bSwgc3RydWN0IGRl dmljZSAqZGV2KQotewotCXN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqbWVtX2dsb2IgPSAmdHRtX21l bV9nbG9iOwotCXN0cnVjdCBkbWFfcG9vbCAqcG9vbDsKLQlzdHJ1Y3QgZG1hX3BhZ2UgKmRfcGFn ZSwgKm5leHQ7Ci0JZW51bSBwb29sX3R5cGUgdHlwZTsKLQlib29sIGlzX2NhY2hlZCA9IGZhbHNl OwotCXVuc2lnbmVkIGNvdW50LCBpLCBucGFnZXMgPSAwOwotCXVuc2lnbmVkIGxvbmcgaXJxX2Zs YWdzOwotCi0JdHlwZSA9IHR0bV90b190eXBlKHR0bS0+cGFnZV9mbGFncywgdHRtLT5jYWNoaW5n KTsKLQotI2lmZGVmIENPTkZJR19UUkFOU1BBUkVOVF9IVUdFUEFHRQotCXBvb2wgPSB0dG1fZG1h X2ZpbmRfcG9vbChkZXYsIHR5cGUgfCBJU19IVUdFKTsKLQlpZiAocG9vbCkgewotCQljb3VudCA9 IDA7Ci0JCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShkX3BhZ2UsIG5leHQsICZ0dG0tPnBhZ2Vz X2xpc3QsCi0JCQkJCSBwYWdlX2xpc3QpIHsKLQkJCWlmICghKGRfcGFnZS0+dmFkZHIgJiBWQURE Ul9GTEFHX0hVR0VfUE9PTCkpCi0JCQkJY29udGludWU7Ci0KLQkJCWNvdW50Kys7Ci0JCQlpZiAo ZF9wYWdlLT52YWRkciAmIFZBRERSX0ZMQUdfVVBEQVRFRF9DT1VOVCkgewotCQkJCXR0bV9tZW1f Z2xvYmFsX2ZyZWVfcGFnZShtZW1fZ2xvYiwgZF9wYWdlLT5wLAotCQkJCQkJCSBwb29sLT5zaXpl KTsKLQkJCQlkX3BhZ2UtPnZhZGRyICY9IH5WQUREUl9GTEFHX1VQREFURURfQ09VTlQ7Ci0JCQl9 Ci0JCQl0dG1fZG1hX3BhZ2VfcHV0KHBvb2wsIGRfcGFnZSk7Ci0JCX0KLQotCQlzcGluX2xvY2tf aXJxc2F2ZSgmcG9vbC0+bG9jaywgaXJxX2ZsYWdzKTsKLQkJcG9vbC0+bnBhZ2VzX2luX3VzZSAt PSBjb3VudDsKLQkJcG9vbC0+bmZyZWVzICs9IGNvdW50OwotCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZwb29sLT5sb2NrLCBpcnFfZmxhZ3MpOwotCX0KLSNlbmRpZgotCi0JcG9vbCA9IHR0bV9k bWFfZmluZF9wb29sKGRldiwgdHlwZSk7Ci0JaWYgKCFwb29sKQotCQlyZXR1cm47Ci0KLQlpc19j YWNoZWQgPSAodHRtX2RtYV9maW5kX3Bvb2wocG9vbC0+ZGV2LAotCQkgICAgIHR0bV90b190eXBl KHR0bS0+cGFnZV9mbGFncywgdHRtX2NhY2hlZCkpID09IHBvb2wpOwotCi0JLyogbWFrZSBzdXJl IHBhZ2VzIGFycmF5IG1hdGNoIGxpc3QgYW5kIGNvdW50IG51bWJlciBvZiBwYWdlcyAqLwotCWNv dW50ID0gMDsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZF9wYWdlLCBuZXh0LCAmdHRtLT5w YWdlc19saXN0LAotCQkJCSBwYWdlX2xpc3QpIHsKLQkJdHRtLT5wYWdlc1tjb3VudF0gPSBkX3Bh Z2UtPnA7Ci0JCWNvdW50Kys7Ci0KLQkJaWYgKGRfcGFnZS0+dmFkZHIgJiBWQUREUl9GTEFHX1VQ REFURURfQ09VTlQpIHsKLQkJCXR0bV9tZW1fZ2xvYmFsX2ZyZWVfcGFnZShtZW1fZ2xvYiwgZF9w YWdlLT5wLAotCQkJCQkJIHBvb2wtPnNpemUpOwotCQkJZF9wYWdlLT52YWRkciAmPSB+VkFERFJf RkxBR19VUERBVEVEX0NPVU5UOwotCQl9Ci0KLQkJaWYgKGlzX2NhY2hlZCkKLQkJCXR0bV9kbWFf cGFnZV9wdXQocG9vbCwgZF9wYWdlKTsKLQl9Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmcG9vbC0+ bG9jaywgaXJxX2ZsYWdzKTsKLQlwb29sLT5ucGFnZXNfaW5fdXNlIC09IGNvdW50OwotCWlmIChp c19jYWNoZWQpIHsKLQkJcG9vbC0+bmZyZWVzICs9IGNvdW50OwotCX0gZWxzZSB7Ci0JCXBvb2wt Pm5wYWdlc19mcmVlICs9IGNvdW50OwotCQlsaXN0X3NwbGljZSgmdHRtLT5wYWdlc19saXN0LCAm cG9vbC0+ZnJlZV9saXN0KTsKLQkJLyoKLQkJICogV2FpdCB0byBoYXZlIGF0IGF0IGxlYXN0IE5V TV9QQUdFU19UT19BTExPQyBudW1iZXIgb2YgcGFnZXMKLQkJICogdG8gZnJlZSBpbiBvcmRlciB0 byBtaW5pbWl6ZSBjYWxscyB0byBzZXRfbWVtb3J5X3diKCkuCi0JCSAqLwotCQlpZiAocG9vbC0+ bnBhZ2VzX2ZyZWUgPj0gKF9tYW5hZ2VyLT5vcHRpb25zLm1heF9zaXplICsKLQkJCQkJICBOVU1f UEFHRVNfVE9fQUxMT0MpKQotCQkJbnBhZ2VzID0gcG9vbC0+bnBhZ2VzX2ZyZWUgLSBfbWFuYWdl ci0+b3B0aW9ucy5tYXhfc2l6ZTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcG9vbC0+ bG9jaywgaXJxX2ZsYWdzKTsKLQotCUlOSVRfTElTVF9IRUFEKCZ0dG0tPnBhZ2VzX2xpc3QpOwot CWZvciAoaSA9IDA7IGkgPCB0dG0tPm51bV9wYWdlczsgaSsrKSB7Ci0JCXR0bS0+cGFnZXNbaV0g PSBOVUxMOwotCQl0dG0tPmRtYV9hZGRyZXNzW2ldID0gMDsKLQl9Ci0KLQkvKiBzaHJpbmsgcG9v bCBpZiBuZWNlc3NhcnkgKG9ubHkgb24gIWlzX2NhY2hlZCBwb29scykqLwotCWlmIChucGFnZXMp Ci0JCXR0bV9kbWFfcGFnZV9wb29sX2ZyZWUocG9vbCwgbnBhZ2VzLCBmYWxzZSk7Ci19Ci1FWFBP UlRfU1lNQk9MX0dQTCh0dG1fZG1hX3VucG9wdWxhdGUpOwotCi0vKioKLSAqIENhbGxiYWNrIGZv ciBtbSB0byByZXF1ZXN0IHBvb2wgdG8gcmVkdWNlIG51bWJlciBvZiBwYWdlIGhlbGQuCi0gKgot ICogWFhYOiAoZGNoaW5uZXIpIERlYWRsb2NrIHdhcm5pbmchCi0gKgotICogSSdtIGdldHRpbmcg c2FkZGVyIGFzIEkgaGVhciBtb3JlIHBhdGhldGljYWwgd2hpbXBlcnMgYWJvdXQgbmVlZGluZyBw ZXItcG9vbAotICogc2hyaW5rZXJzCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBsb25nCi10dG1fZG1h X3Bvb2xfc2hyaW5rX3NjYW4oc3RydWN0IHNocmlua2VyICpzaHJpbmssIHN0cnVjdCBzaHJpbmtf Y29udHJvbCAqc2MpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIHN0YXJ0X3Bvb2w7Ci0JdW5zaWduZWQg aWR4ID0gMDsKLQl1bnNpZ25lZCBwb29sX29mZnNldDsKLQl1bnNpZ25lZCBzaHJpbmtfcGFnZXMg PSBzYy0+bnJfdG9fc2NhbjsKLQlzdHJ1Y3QgZGV2aWNlX3Bvb2xzICpwOwotCXVuc2lnbmVkIGxv bmcgZnJlZWQgPSAwOwotCi0JaWYgKGxpc3RfZW1wdHkoJl9tYW5hZ2VyLT5wb29scykpCi0JCXJl dHVybiBTSFJJTktfU1RPUDsKLQotCWlmICghbXV0ZXhfdHJ5bG9jaygmX21hbmFnZXItPmxvY2sp KQotCQlyZXR1cm4gU0hSSU5LX1NUT1A7Ci0JaWYgKCFfbWFuYWdlci0+bnBvb2xzKQotCQlnb3Rv IG91dDsKLQlwb29sX29mZnNldCA9ICsrc3RhcnRfcG9vbCAlIF9tYW5hZ2VyLT5ucG9vbHM7Ci0J bGlzdF9mb3JfZWFjaF9lbnRyeShwLCAmX21hbmFnZXItPnBvb2xzLCBwb29scykgewotCQl1bnNp Z25lZCBucl9mcmVlOwotCi0JCWlmICghcC0+ZGV2KQotCQkJY29udGludWU7Ci0JCWlmIChzaHJp bmtfcGFnZXMgPT0gMCkKLQkJCWJyZWFrOwotCQkvKiBEbyBpdCBpbiByb3VuZC1yb2JpbiBmYXNo aW9uLiAqLwotCQlpZiAoKytpZHggPCBwb29sX29mZnNldCkKLQkJCWNvbnRpbnVlOwotCQlucl9m cmVlID0gc2hyaW5rX3BhZ2VzOwotCQkvKiBPSyB0byB1c2Ugc3RhdGljIGJ1ZmZlciBzaW5jZSBn bG9iYWwgbXV0ZXggaXMgaGVsZC4gKi8KLQkJc2hyaW5rX3BhZ2VzID0gdHRtX2RtYV9wYWdlX3Bv b2xfZnJlZShwLT5wb29sLCBucl9mcmVlLCB0cnVlKTsKLQkJZnJlZWQgKz0gbnJfZnJlZSAtIHNo cmlua19wYWdlczsKLQotCQlwcl9kZWJ1ZygiJXM6ICglczolZCkgQXNrZWQgdG8gc2hyaW5rICVk LCBoYXZlICVkIG1vcmUgdG8gZ29cbiIsCi0JCQkgcC0+cG9vbC0+ZGV2X25hbWUsIHAtPnBvb2wt Pm5hbWUsIGN1cnJlbnQtPnBpZCwKLQkJCSBucl9mcmVlLCBzaHJpbmtfcGFnZXMpOwotCX0KLW91 dDoKLQltdXRleF91bmxvY2soJl9tYW5hZ2VyLT5sb2NrKTsKLQlyZXR1cm4gZnJlZWQ7Ci19Ci0K LXN0YXRpYyB1bnNpZ25lZCBsb25nCi10dG1fZG1hX3Bvb2xfc2hyaW5rX2NvdW50KHN0cnVjdCBz aHJpbmtlciAqc2hyaW5rLCBzdHJ1Y3Qgc2hyaW5rX2NvbnRyb2wgKnNjKQotewotCXN0cnVjdCBk ZXZpY2VfcG9vbHMgKnA7Ci0JdW5zaWduZWQgbG9uZyBjb3VudCA9IDA7Ci0KLQlpZiAoIW11dGV4 X3RyeWxvY2soJl9tYW5hZ2VyLT5sb2NrKSkKLQkJcmV0dXJuIDA7Ci0JbGlzdF9mb3JfZWFjaF9l bnRyeShwLCAmX21hbmFnZXItPnBvb2xzLCBwb29scykKLQkJY291bnQgKz0gcC0+cG9vbC0+bnBh Z2VzX2ZyZWU7Ci0JbXV0ZXhfdW5sb2NrKCZfbWFuYWdlci0+bG9jayk7Ci0JcmV0dXJuIGNvdW50 OwotfQotCi1zdGF0aWMgaW50IHR0bV9kbWFfcG9vbF9tbV9zaHJpbmtfaW5pdChzdHJ1Y3QgdHRt X3Bvb2xfbWFuYWdlciAqbWFuYWdlcikKLXsKLQltYW5hZ2VyLT5tbV9zaHJpbmsuY291bnRfb2Jq ZWN0cyA9IHR0bV9kbWFfcG9vbF9zaHJpbmtfY291bnQ7Ci0JbWFuYWdlci0+bW1fc2hyaW5rLnNj YW5fb2JqZWN0cyA9ICZ0dG1fZG1hX3Bvb2xfc2hyaW5rX3NjYW47Ci0JbWFuYWdlci0+bW1fc2hy aW5rLnNlZWtzID0gMTsKLQlyZXR1cm4gcmVnaXN0ZXJfc2hyaW5rZXIoJm1hbmFnZXItPm1tX3No cmluayk7Ci19Ci0KLXN0YXRpYyB2b2lkIHR0bV9kbWFfcG9vbF9tbV9zaHJpbmtfZmluaShzdHJ1 Y3QgdHRtX3Bvb2xfbWFuYWdlciAqbWFuYWdlcikKLXsKLQl1bnJlZ2lzdGVyX3Nocmlua2VyKCZt YW5hZ2VyLT5tbV9zaHJpbmspOwotfQotCi1pbnQgdHRtX2RtYV9wYWdlX2FsbG9jX2luaXQoc3Ry dWN0IHR0bV9tZW1fZ2xvYmFsICpnbG9iLCB1bnNpZ25lZCBtYXhfcGFnZXMpCi17Ci0JaW50IHJl dDsKLQotCVdBUk5fT04oX21hbmFnZXIpOwotCi0JcHJfaW5mbygiSW5pdGlhbGl6aW5nIERNQSBw b29sIGFsbG9jYXRvclxuIik7Ci0KLQlfbWFuYWdlciA9IGt6YWxsb2Moc2l6ZW9mKCpfbWFuYWdl ciksIEdGUF9LRVJORUwpOwotCWlmICghX21hbmFnZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0J bXV0ZXhfaW5pdCgmX21hbmFnZXItPmxvY2spOwotCUlOSVRfTElTVF9IRUFEKCZfbWFuYWdlci0+ cG9vbHMpOwotCi0JX21hbmFnZXItPm9wdGlvbnMubWF4X3NpemUgPSBtYXhfcGFnZXM7Ci0JX21h bmFnZXItPm9wdGlvbnMuc21hbGwgPSBTTUFMTF9BTExPQ0FUSU9OOwotCV9tYW5hZ2VyLT5vcHRp b25zLmFsbG9jX3NpemUgPSBOVU1fUEFHRVNfVE9fQUxMT0M7Ci0KLQkvKiBUaGlzIHRha2VzIGNh cmUgb2YgYXV0by1mcmVlaW5nIHRoZSBfbWFuYWdlciAqLwotCXJldCA9IGtvYmplY3RfaW5pdF9h bmRfYWRkKCZfbWFuYWdlci0+a29iaiwgJnR0bV9wb29sX2tvYmpfdHlwZSwKLQkJCQkgICAmZ2xv Yi0+a29iaiwgImRtYV9wb29sIik7Ci0JaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBl cnJvcjsKLQotCXJldCA9IHR0bV9kbWFfcG9vbF9tbV9zaHJpbmtfaW5pdChfbWFuYWdlcik7Ci0J aWYgKHVubGlrZWx5KHJldCAhPSAwKSkKLQkJZ290byBlcnJvcjsKLQlyZXR1cm4gMDsKLQotZXJy b3I6Ci0Ja29iamVjdF9wdXQoJl9tYW5hZ2VyLT5rb2JqKTsKLQlfbWFuYWdlciA9IE5VTEw7Ci0J cmV0dXJuIHJldDsKLX0KLQotdm9pZCB0dG1fZG1hX3BhZ2VfYWxsb2NfZmluaSh2b2lkKQotewot CXN0cnVjdCBkZXZpY2VfcG9vbHMgKnAsICp0OwotCi0JcHJfaW5mbygiRmluYWxpemluZyBETUEg cG9vbCBhbGxvY2F0b3JcbiIpOwotCXR0bV9kbWFfcG9vbF9tbV9zaHJpbmtfZmluaShfbWFuYWdl cik7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZShwLCB0LCAmX21hbmFnZXIt PnBvb2xzLCBwb29scykgewotCQlkZXZfZGJnKHAtPmRldiwgIiglczolZCkgRnJlZWluZy5cbiIs IHAtPnBvb2wtPm5hbWUsCi0JCQljdXJyZW50LT5waWQpOwotCQlXQVJOX09OKGRldnJlc19kZXN0 cm95KHAtPmRldiwgdHRtX2RtYV9wb29sX3JlbGVhc2UsCi0JCQl0dG1fZG1hX3Bvb2xfbWF0Y2gs IHAtPnBvb2wpKTsKLQkJdHRtX2RtYV9mcmVlX3Bvb2wocC0+ZGV2LCBwLT5wb29sLT50eXBlKTsK LQl9Ci0Ja29iamVjdF9wdXQoJl9tYW5hZ2VyLT5rb2JqKTsKLQlfbWFuYWdlciA9IE5VTEw7Ci19 Ci0KLWludCB0dG1fZG1hX3BhZ2VfYWxsb2NfZGVidWdmcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZv aWQgKmRhdGEpCi17Ci0Jc3RydWN0IGRldmljZV9wb29scyAqcDsKLQlzdHJ1Y3QgZG1hX3Bvb2wg KnBvb2wgPSBOVUxMOwotCi0JaWYgKCFfbWFuYWdlcikgewotCQlzZXFfcHJpbnRmKG0sICJObyBw b29sIGFsbG9jYXRvciBydW5uaW5nLlxuIik7Ci0JCXJldHVybiAwOwotCX0KLQlzZXFfcHJpbnRm KG0sICIgICAgICAgICBwb29sICAgICAgcmVmaWxscyAgIHBhZ2VzIGZyZWVkICAgIGludXNlIGF2 YWlsYWJsZSAgICAgbmFtZVxuIik7Ci0JbXV0ZXhfbG9jaygmX21hbmFnZXItPmxvY2spOwotCWxp c3RfZm9yX2VhY2hfZW50cnkocCwgJl9tYW5hZ2VyLT5wb29scywgcG9vbHMpIHsKLQkJc3RydWN0 IGRldmljZSAqZGV2ID0gcC0+ZGV2OwotCQlpZiAoIWRldikKLQkJCWNvbnRpbnVlOwotCQlwb29s ID0gcC0+cG9vbDsKLQkJc2VxX3ByaW50ZihtLCAiJTEzcyAlMTJsZCAlMTNsZCAlOGQgJThkICU4 c1xuIiwKLQkJCQlwb29sLT5uYW1lLCBwb29sLT5ucmVmaWxscywKLQkJCQlwb29sLT5uZnJlZXMs IHBvb2wtPm5wYWdlc19pbl91c2UsCi0JCQkJcG9vbC0+bnBhZ2VzX2ZyZWUsCi0JCQkJcG9vbC0+ ZGV2X25hbWUpOwotCX0KLQltdXRleF91bmxvY2soJl9tYW5hZ2VyLT5sb2NrKTsKLQlyZXR1cm4g MDsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKHR0bV9kbWFfcGFnZV9hbGxvY19kZWJ1Z2ZzKTsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3NldF9tZW1vcnkuaCBiL2RyaXZlcnMv Z3B1L2RybS90dG0vdHRtX3NldF9tZW1vcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMjM0M2MxOGE2MTMzLi4wMDAwMDAwMDAwMDAKLS0tIGEvZHJpdmVycy9ncHUvZHJtL3R0bS90 dG1fc2V0X21lbW9yeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDE4IEFkdmFuY2VkIE1pY3JvIERldmlj ZXMsIEluYy4KLSAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogUGVybWlzc2lvbiBpcyBo ZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEK LSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZp bGVzICh0aGUKLSAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0 IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKLSAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRz IHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKLSAqIGRpc3RyaWJ1dGUsIHN1 YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KLSAq IHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0bwotICogdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotICoKLSAqIFRoZSBh Ym92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRp bmcgdGhlCi0gKiBuZXh0IHBhcmFncmFwaCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGll cyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucwotICogb2YgdGhlIFNvZnR3YXJlLgotICoKLSAqIFRI RSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBL SU5ELCBFWFBSRVNTIE9SCi0gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRP IFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKLSAqIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAot ICogVEhFIENPUFlSSUdIVCBIT0xERVJTLCBBVVRIT1JTIEFORC9PUiBJVFMgU1VQUExJRVJTIEJF IExJQUJMRSBGT1IgQU5ZIENMQUlNLAotICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdI RVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCi0gKiBPVEhFUldJU0UsIEFS SVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1Ig VEhFCi0gKiBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgotICoKLSAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKi8KLS8qCi0gKiBBdXRob3JzOiBIdWFuZyBSdWkgPHJheS5odWFuZ0BhbWQu Y29tPgotICovCi0KLSNpZm5kZWYgVFRNX1NFVF9NRU1PUlkKLSNkZWZpbmUgVFRNX1NFVF9NRU1P UlkKLQotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0KLSNpZmRlZiBDT05GSUdfWDg2Ci0KLSNpbmNs dWRlIDxhc20vc2V0X21lbW9yeS5oPgotCi1zdGF0aWMgaW5saW5lIGludCB0dG1fc2V0X3BhZ2Vz X2FycmF5X3diKHN0cnVjdCBwYWdlICoqcGFnZXMsIGludCBhZGRyaW5hcnJheSkKLXsKLQlyZXR1 cm4gc2V0X3BhZ2VzX2FycmF5X3diKHBhZ2VzLCBhZGRyaW5hcnJheSk7Ci19Ci0KLXN0YXRpYyBp bmxpbmUgaW50IHR0bV9zZXRfcGFnZXNfYXJyYXlfd2Moc3RydWN0IHBhZ2UgKipwYWdlcywgaW50 IGFkZHJpbmFycmF5KQotewotCXJldHVybiBzZXRfcGFnZXNfYXJyYXlfd2MocGFnZXMsIGFkZHJp bmFycmF5KTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQgdHRtX3NldF9wYWdlc19hcnJheV91Yyhz dHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgYWRkcmluYXJyYXkpCi17Ci0JcmV0dXJuIHNldF9wYWdl c19hcnJheV91YyhwYWdlcywgYWRkcmluYXJyYXkpOwotfQotCi1zdGF0aWMgaW5saW5lIGludCB0 dG1fc2V0X3BhZ2VzX3diKHN0cnVjdCBwYWdlICpwYWdlLCBpbnQgbnVtcGFnZXMpCi17Ci0JcmV0 dXJuIHNldF9wYWdlc193YihwYWdlLCBudW1wYWdlcyk7Ci19Ci0KLSNlbHNlIC8qIGZvciBDT05G SUdfWDg2ICovCi0KLXN0YXRpYyBpbmxpbmUgaW50IHR0bV9zZXRfcGFnZXNfYXJyYXlfd2Ioc3Ry dWN0IHBhZ2UgKipwYWdlcywgaW50IGFkZHJpbmFycmF5KQotewotCXJldHVybiAwOwotfQotCi1z dGF0aWMgaW5saW5lIGludCB0dG1fc2V0X3BhZ2VzX2FycmF5X3djKHN0cnVjdCBwYWdlICoqcGFn ZXMsIGludCBhZGRyaW5hcnJheSkKLXsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGlubGluZSBp bnQgdHRtX3NldF9wYWdlc19hcnJheV91YyhzdHJ1Y3QgcGFnZSAqKnBhZ2VzLCBpbnQgYWRkcmlu YXJyYXkpCi17Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IHR0bV9zZXRfcGFn ZXNfd2Ioc3RydWN0IHBhZ2UgKnBhZ2UsIGludCBudW1wYWdlcykKLXsKLQlyZXR1cm4gMDsKLX0K LQotI2VuZGlmIC8qIGZvciBDT05GSUdfWDg2ICovCi0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvZHJp dmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYyBiL2RyaXZlcnMvZ3B1L2RybS90dG0vdHRtX3R0LmMK aW5kZXggOTAwNTQyODBjZDhmLi44ODYxYTc0YWMzMzUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS90dG0vdHRtX3R0LmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL3R0bS90dG1fdHQuYwpAQCAt NTEsOSArNTEsNiBAQCBpbnQgdHRtX3R0X2NyZWF0ZShzdHJ1Y3QgdHRtX2J1ZmZlcl9vYmplY3Qg KmJvLCBib29sIHplcm9fYWxsb2MpCiAJaWYgKGJvLT50dG0pCiAJCXJldHVybiAwOwogCi0JaWYg KGJkZXYtPm5lZWRfZG1hMzIpCi0JCXBhZ2VfZmxhZ3MgfD0gVFRNX1BBR0VfRkxBR19ETUEzMjsK LQogCWlmIChiZGV2LT5ub19yZXRyeSkKIAkJcGFnZV9mbGFncyB8PSBUVE1fUEFHRV9GTEFHX05P X1JFVFJZOwogCkBAIC0xNDEsNyArMTM4LDYgQEAgc3RhdGljIHZvaWQgdHRtX3R0X2luaXRfZmll bGRzKHN0cnVjdCB0dG1fdHQgKnR0bSwKIAl0dG0tPmRtYV9hZGRyZXNzID0gTlVMTDsKIAl0dG0t PnN3YXBfc3RvcmFnZSA9IE5VTEw7CiAJdHRtLT5zZyA9IGJvLT5zZzsKLQlJTklUX0xJU1RfSEVB RCgmdHRtLT5wYWdlc19saXN0KTsKIAl0dG0tPmNhY2hpbmcgPSBjYWNoaW5nOwogfQogCmRpZmYg LS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX2JvX2RyaXZlci5oIGIvaW5jbHVkZS9kcm0vdHRt L3R0bV9ib19kcml2ZXIuaAppbmRleCA0NWFlODc2NDA5MDkuLmU5ZjY4M2ZhNzJkYyAxMDA2NDQK LS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV9ib19kcml2ZXIuaAorKysgYi9pbmNsdWRlL2RybS90 dG0vdHRtX2JvX2RyaXZlci5oCkBAIC0zMTUsOCArMzE1LDYgQEAgc3RydWN0IHR0bV9ib19kZXZp Y2UgewogCiAJc3RydWN0IGRlbGF5ZWRfd29yayB3cTsKIAotCWJvb2wgbmVlZF9kbWEzMjsKLQog CWJvb2wgbm9fcmV0cnk7CiB9OwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS90dG0vdHRtX3Bh Z2VfYWxsb2MuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fcGFnZV9hbGxvYy5oCmRlbGV0ZWQgZmls ZSBtb2RlIDEwMDY0NAppbmRleCA4ZmExZTdkZjYyMTMuLjAwMDAwMDAwMDAwMAotLS0gYS9pbmNs dWRlL2RybS90dG0vdHRtX3BhZ2VfYWxsb2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCww IEBACi0vKgotICogQ29weXJpZ2h0IChjKSBSZWQgSGF0IEluYy4KLQotICogUGVybWlzc2lvbiBp cyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5n IGEKLSAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9u IGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCi0gKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRo b3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCi0gKiB0aGUgcmln aHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3Vi IGxpY2Vuc2UsCi0gKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8g cGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKLSAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBk byBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0gKgotICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGlu ZyB0aGUKLSAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVz IG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCi0gKiBvZiB0aGUgU29mdHdhcmUuCi0gKgotICogVEhF IFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJ TkQsIEVYUFJFU1MgT1IKLSAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAotICogRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCi0g KiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJ TSwgREFNQUdFUyBPUiBPVEhFUgotICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBP RiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKLSAqIEZST00sIE9VVCBPRiBP UiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKLSAq IERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KLSAqCi0gKiBBdXRob3JzOiBEYXZlIEFpcmxpZSA8 YWlybGllZEByZWRoYXQuY29tPgotICogICAgICAgICAgSmVyb21lIEdsaXNzZSA8amdsaXNzZUBy ZWRoYXQuY29tPgotICovCi0jaWZuZGVmIFRUTV9QQUdFX0FMTE9DCi0jZGVmaW5lIFRUTV9QQUdF X0FMTE9DCi0KLSNpbmNsdWRlIDxkcm0vdHRtL3R0bV9ib19kcml2ZXIuaD4KLSNpbmNsdWRlIDxk cm0vdHRtL3R0bV9tZW1vcnkuaD4KLQotc3RydWN0IGRldmljZTsKLQotLyoqCi0gKiBJbml0aWFs aXplIHBvb2wgYWxsb2NhdG9yLgotICovCi1pbnQgdHRtX3BhZ2VfYWxsb2NfaW5pdChzdHJ1Y3Qg dHRtX21lbV9nbG9iYWwgKmdsb2IsIHVuc2lnbmVkIG1heF9wYWdlcyk7Ci0vKioKLSAqIEZyZWUg cG9vbCBhbGxvY2F0b3IuCi0gKi8KLXZvaWQgdHRtX3BhZ2VfYWxsb2NfZmluaSh2b2lkKTsKLQot LyoqCi0gKiB0dG1fcG9vbF9wb3B1bGF0ZToKLSAqCi0gKiBAdHRtOiBUaGUgc3RydWN0IHR0bV90 dCB0byBjb250YWluIHRoZSBiYWNraW5nIHBhZ2VzLgotICoKLSAqIEFkZCBiYWNraW5nIHBhZ2Vz IHRvIGFsbCBvZiBAdHRtCi0gKi8KLWludCB0dG1fcG9vbF9wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0 ICp0dG0sIHN0cnVjdCB0dG1fb3BlcmF0aW9uX2N0eCAqY3R4KTsKLQotLyoqCi0gKiB0dG1fcG9v bF91bnBvcHVsYXRlOgotICoKLSAqIEB0dG06IFRoZSBzdHJ1Y3QgdHRtX3R0IHdoaWNoIHRvIGZy ZWUgYmFja2luZyBwYWdlcy4KLSAqCi0gKiBGcmVlIGFsbCBwYWdlcyBvZiBAdHRtCi0gKi8KLXZv aWQgdHRtX3Bvb2xfdW5wb3B1bGF0ZShzdHJ1Y3QgdHRtX3R0ICp0dG0pOwotCi0vKioKLSAqIFBv cHVsYXRlcyBhbmQgRE1BIG1hcHMgcGFnZXMgdG8gZnVsbGZpbCBhIHR0bV9kbWFfcG9wdWxhdGUo KSByZXF1ZXN0Ci0gKi8KLWludCB0dG1fcG9wdWxhdGVfYW5kX21hcF9wYWdlcyhzdHJ1Y3QgZGV2 aWNlICpkZXYsIHN0cnVjdCB0dG1fdHQgKnR0LAotCQkJCXN0cnVjdCB0dG1fb3BlcmF0aW9uX2N0 eCAqY3R4KTsKLQotLyoqCi0gKiBVbnBvcHVsYXRlcyBhbmQgRE1BIHVubWFwcyBwYWdlcyBhcyBw YXJ0IG9mIGEKLSAqIHR0bV9kbWFfdW5wb3B1bGF0ZSgpIHJlcXVlc3QgKi8KLXZvaWQgdHRtX3Vu bWFwX2FuZF91bnBvcHVsYXRlX3BhZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHR0bV90 dCAqdHQpOwotCi0vKioKLSAqIE91dHB1dCB0aGUgc3RhdGUgb2YgcG9vbHMgdG8gZGVidWdmcyBm aWxlCi0gKi8KLWludCB0dG1fcGFnZV9hbGxvY19kZWJ1Z2ZzKHN0cnVjdCBzZXFfZmlsZSAqbSwg dm9pZCAqZGF0YSk7Ci0KLSNpZiBkZWZpbmVkKENPTkZJR19EUk1fVFRNX0RNQV9QQUdFX1BPT0wp Ci0vKioKLSAqIEluaXRpYWxpemUgcG9vbCBhbGxvY2F0b3IuCi0gKi8KLWludCB0dG1fZG1hX3Bh Z2VfYWxsb2NfaW5pdChzdHJ1Y3QgdHRtX21lbV9nbG9iYWwgKmdsb2IsIHVuc2lnbmVkIG1heF9w YWdlcyk7Ci0KLS8qKgotICogRnJlZSBwb29sIGFsbG9jYXRvci4KLSAqLwotdm9pZCB0dG1fZG1h X3BhZ2VfYWxsb2NfZmluaSh2b2lkKTsKLQotLyoqCi0gKiBPdXRwdXQgdGhlIHN0YXRlIG9mIHBv b2xzIHRvIGRlYnVnZnMgZmlsZQotICovCi1pbnQgdHRtX2RtYV9wYWdlX2FsbG9jX2RlYnVnZnMo c3RydWN0IHNlcV9maWxlICptLCB2b2lkICpkYXRhKTsKLQotaW50IHR0bV9kbWFfcG9wdWxhdGUo c3RydWN0IHR0bV90dCAqdHRtX2RtYSwgc3RydWN0IGRldmljZSAqZGV2LAotCQkJc3RydWN0IHR0 bV9vcGVyYXRpb25fY3R4ICpjdHgpOwotdm9pZCB0dG1fZG1hX3VucG9wdWxhdGUoc3RydWN0IHR0 bV90dCAqdHRtX2RtYSwgc3RydWN0IGRldmljZSAqZGV2KTsKLQotI2Vsc2UKLXN0YXRpYyBpbmxp bmUgaW50IHR0bV9kbWFfcGFnZV9hbGxvY19pbml0KHN0cnVjdCB0dG1fbWVtX2dsb2JhbCAqZ2xv YiwKLQkJCQkJICB1bnNpZ25lZCBtYXhfcGFnZXMpCi17Ci0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0K LXN0YXRpYyBpbmxpbmUgdm9pZCB0dG1fZG1hX3BhZ2VfYWxsb2NfZmluaSh2b2lkKSB7IHJldHVy bjsgfQotCi1zdGF0aWMgaW5saW5lIGludCB0dG1fZG1hX3BhZ2VfYWxsb2NfZGVidWdmcyhzdHJ1 Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKmRhdGEpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0aWMgaW5s aW5lIGludCB0dG1fZG1hX3BvcHVsYXRlKHN0cnVjdCB0dG1fdHQgKnR0bV9kbWEsCi0JCQkJc3Ry dWN0IGRldmljZSAqZGV2LAotCQkJCXN0cnVjdCB0dG1fb3BlcmF0aW9uX2N0eCAqY3R4KQotewot CXJldHVybiAtRU5PTUVNOwotfQotc3RhdGljIGlubGluZSB2b2lkIHR0bV9kbWFfdW5wb3B1bGF0 ZShzdHJ1Y3QgdHRtX3R0ICp0dG1fZG1hLAotCQkJCSAgICAgIHN0cnVjdCBkZXZpY2UgKmRldikK LXsKLX0KLSNlbmRpZgotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL3R0bS90dG1f dHQuaCBiL2luY2x1ZGUvZHJtL3R0bS90dG1fdHQuaAppbmRleCBkZjlhODA2NTBmZWIuLmRhMjdl OWQ4ZmE2NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcm0vdHRtL3R0bV90dC5oCisrKyBiL2luY2x1 ZGUvZHJtL3R0bS90dG1fdHQuaApAQCAtMzcsNyArMzcsNiBAQCBzdHJ1Y3QgdHRtX29wZXJhdGlv bl9jdHg7CiAKICNkZWZpbmUgVFRNX1BBR0VfRkxBR19TV0FQUEVEICAgICAgICAgKDEgPDwgNCkK ICNkZWZpbmUgVFRNX1BBR0VfRkxBR19aRVJPX0FMTE9DICAgICAgKDEgPDwgNikKLSNkZWZpbmUg VFRNX1BBR0VfRkxBR19ETUEzMiAgICAgICAgICAgKDEgPDwgNykKICNkZWZpbmUgVFRNX1BBR0Vf RkxBR19TRyAgICAgICAgICAgICAgKDEgPDwgOCkKICNkZWZpbmUgVFRNX1BBR0VfRkxBR19OT19S RVRSWQkgICAgICAoMSA8PCA5KQogCkBAIC02Niw3ICs2NSw2IEBAIHN0cnVjdCB0dG1fdHQgewog CXN0cnVjdCBzZ190YWJsZSAqc2c7CiAJZG1hX2FkZHJfdCAqZG1hX2FkZHJlc3M7CiAJc3RydWN0 IGZpbGUgKnN3YXBfc3RvcmFnZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkIHBhZ2VzX2xpc3Q7CiAJZW51 bSB0dG1fY2FjaGluZyBjYWNoaW5nOwogfTsKIAotLSAKMi4xNy4xCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRy aS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5v cmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWwK