From mboxrd@z Thu Jan 1 00:00:00 1970 From: Daniel Vetter Subject: [PATCH] drm: Extract drm_vblank.[hc] Date: Wed, 31 May 2017 11:21:46 +0200 Message-ID: <20170531092146.12528-1-daniel.vetter@ffwll.ch> References: <20170524145212.27837-8-daniel.vetter@ffwll.ch> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id B047A6E1B5 for ; Wed, 31 May 2017 09:21:57 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id b84so2168860wmh.0 for ; Wed, 31 May 2017 02:21:57 -0700 (PDT) In-Reply-To: <20170524145212.27837-8-daniel.vetter@ffwll.ch> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: DRI Development Cc: Daniel Vetter , Intel Graphics Development , Daniel Vetter List-Id: dri-devel@lists.freedesktop.org ZHJtX2lycS5jIGNvbnRhaW5zIGJvdGggdGhlIGlycSBoZWxwZXIgbGlicmFyeSAob3B0aW9uYWwp IGFuZCB0aGUKdmJsYW5rIHN1cHBvcnQgKG9wdGlvbmFsLCBidXQgcGFydCBvZiB0aGUgbW9kZXNl dCB1YXBpLCBhbmQgZG9lc24ndApyZXF1aXJlIHRoZSB1c2Ugb2YgdGhlIGlycSBoZWxwZXJzIGF0 IGFsbC4KClNwbGl0IHRoaXMgdXAgZm9yIG1vcmUgY2xhcml0eSBvZiB0aGUgc2NvcGUgb2YgdGhl IGluZGl2aWR1YWwgYml0cy4KCnYyOiBNb3ZlIG1pc3BsYWNlZCBodW5rcyB0byB0aGlzIHBhdGNo IChTdGVmYW4pLgoKQ2M6IFN0ZWZhbiBBZ25lciA8c3RlZmFuQGFnbmVyLmNoPgpTaWduZWQtb2Zm LWJ5OiBEYW5pZWwgVmV0dGVyIDxkYW5pZWwudmV0dGVyQGludGVsLmNvbT4KLS0tCiBEb2N1bWVu dGF0aW9uL2dwdS9kcm0taW50ZXJuYWxzLnJzdCB8ICAgIDkgKwogRG9jdW1lbnRhdGlvbi9ncHUv ZHJtLWttcy5yc3QgICAgICAgfCAgICA0ICstCiBkcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgICAg ICAgICAgICB8ICAgIDIgKy0KIGRyaXZlcnMvZ3B1L2RybS9kcm1faW50ZXJuYWwuaCAgICAgIHwg ICAgMyArLQogZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYyAgICAgICAgICAgfCAxNjIzICstLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9kcm1fdmJsYW5r LmMgICAgICAgIHwgMTY0NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogaW5j bHVkZS9kcm0vZHJtUC5oICAgICAgICAgICAgICAgICAgfCAgICA1ICstCiBpbmNsdWRlL2RybS9k cm1fZmlsZS5oICAgICAgICAgICAgICB8ICAgIDEgKwogaW5jbHVkZS9kcm0vZHJtX2lycS5oICAg ICAgICAgICAgICAgfCAgMTU4ICstLS0KIGluY2x1ZGUvZHJtL2RybV9wcmltZS5oICAgICAgICAg ICAgIHwgICAgMiArCiBpbmNsdWRlL2RybS9kcm1fdmJsYW5rLmggICAgICAgICAgICB8ICAxODEg KysrKwogMTEgZmlsZXMgY2hhbmdlZCwgMTg2OSBpbnNlcnRpb25zKCspLCAxNzY0IGRlbGV0aW9u cygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9kcm1fdmJsYW5rLmMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2RybS9kcm1fdmJsYW5rLmgKCmRpZmYgLS1naXQgYS9E b2N1bWVudGF0aW9uL2dwdS9kcm0taW50ZXJuYWxzLnJzdCBiL0RvY3VtZW50YXRpb24vZ3B1L2Ry bS1pbnRlcm5hbHMucnN0CmluZGV4IGQyMThkZDI5MjIxYS4uZGQyOGUzOWNmOTY2IDEwMDY0NAot LS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9kcm0taW50ZXJuYWxzLnJzdAorKysgYi9Eb2N1bWVudGF0 aW9uL2dwdS9kcm0taW50ZXJuYWxzLnJzdApAQCAtMjA0LDYgKzIwNCwxNSBAQCBkcm1fZGV2aWNl IDxkcm1fZGV2aWNlPmAgaXJxX2VuYWJsZWQgZmllbGQgdG8gMSB1cG9uCiByZWdpc3RyYXRpb24g b2YgdGhlIElSUXMsIGFuZCBjbGVhciBpdCB0byAwIGFmdGVyIHVucmVnaXN0ZXJpbmcgdGhlCiBJ UlFzLgogCitJUlEgSGVscGVyIExpYnJhcnkKK35+fn5+fn5+fn5+fn5+fn5+fgorCisuLiBrZXJu ZWwtZG9jOjogZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYworICAgOmRvYzogaXJxIGhlbHBlcnMK KworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKKyAgIDpleHBvcnQ6 CisKIE1lbW9yeSBNYW5hZ2VyIEluaXRpYWxpemF0aW9uCiB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+ fn5+fn5+fgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwdS9kcm0ta21zLnJzdCBiL0Rv Y3VtZW50YXRpb24vZ3B1L2RybS1rbXMucnN0CmluZGV4IGJmZWNkMjFhOGNkZi4uMmQ3N2M5NTgw MTY0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwdS9kcm0ta21zLnJzdAorKysgYi9Eb2N1 bWVudGF0aW9uL2dwdS9kcm0ta21zLnJzdApAQCAtNjEyLDggKzYxMiw4IEBAIG9wZXJhdGlvbiBo YW5kbGVyLgogVmVydGljYWwgQmxhbmtpbmcgYW5kIEludGVycnVwdCBIYW5kbGluZyBGdW5jdGlv bnMgUmVmZXJlbmNlCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0KIAotLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvZHJtL2RybV9pcnEu aAorLi4ga2VybmVsLWRvYzo6IGluY2x1ZGUvZHJtL2RybV92YmxhbmsuaAogICAgOmludGVybmFs OgogCi0uLiBrZXJuZWwtZG9jOjogZHJpdmVycy9ncHUvZHJtL2RybV9pcnEuYworLi4ga2VybmVs LWRvYzo6IGRyaXZlcnMvZ3B1L2RybS9kcm1fdmJsYW5rLmMKICAgIDpleHBvcnQ6CmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUK aW5kZXggYzE1NmZlY2ZiMzYyLi5hY2M4ODk0MmMyZTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1 L2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKQEAgLTE2LDcgKzE2 LDcgQEAgZHJtLXkgICAgICAgOj0JZHJtX2F1dGgubyBkcm1fYnVmcy5vIGRybV9jYWNoZS5vIFwK IAkJZHJtX2ZyYW1lYnVmZmVyLm8gZHJtX2Nvbm5lY3Rvci5vIGRybV9ibGVuZC5vIFwKIAkJZHJt X2VuY29kZXIubyBkcm1fbW9kZV9vYmplY3QubyBkcm1fcHJvcGVydHkubyBcCiAJCWRybV9wbGFu ZS5vIGRybV9jb2xvcl9tZ210Lm8gZHJtX3ByaW50Lm8gXAotCQlkcm1fZHVtYl9idWZmZXJzLm8g ZHJtX21vZGVfY29uZmlnLm8KKwkJZHJtX2R1bWJfYnVmZmVycy5vIGRybV9tb2RlX2NvbmZpZy5v IGRybV92YmxhbmsubwogCiBkcm0tJChDT05GSUdfRFJNX0xJQl9SQU5ET00pICs9IGxpYi9kcm1f cmFuZG9tLm8KIGRybS0kKENPTkZJR19EUk1fVk0pICs9IGRybV92bS5vCmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vZHJtX2ludGVybmFsLmggYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ludGVy bmFsLmgKaW5kZXggYmNhMmM2NmM1ZDI4Li42YTBjYmNjODQ1MzQgMTAwNjQ0Ci0tLSBhL2RyaXZl cnMvZ3B1L2RybS9kcm1faW50ZXJuYWwuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2ludGVy bmFsLmgKQEAgLTU0LDggKzU0LDkgQEAgaW50IGRybV9uYW1lX2luZm8oc3RydWN0IHNlcV9maWxl ICptLCB2b2lkICpkYXRhKTsKIGludCBkcm1fY2xpZW50c19pbmZvKHN0cnVjdCBzZXFfZmlsZSAq bSwgdm9pZCogZGF0YSk7CiBpbnQgZHJtX2dlbV9uYW1lX2luZm8oc3RydWN0IHNlcV9maWxlICpt LCB2b2lkICpkYXRhKTsKIAotLyogZHJtX2lycS5jICovCisvKiBkcm1fdmJsYW5rLmMgKi8KIGV4 dGVybiB1bnNpZ25lZCBpbnQgZHJtX3RpbWVzdGFtcF9tb25vdG9uaWM7Cit2b2lkIGRybV92Ymxh bmtfZGlzYWJsZV9hbmRfc2F2ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQg cGlwZSk7CiAKIC8qIElPQ1RMUyAqLwogaW50IGRybV93YWl0X3ZibGFuayhzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LCB2b2lkICpkYXRhLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9p cnEuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKaW5kZXggYzdkZWJhYWQ2N2Y4Li4yOGQ3 MzZjM2ZjYjQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9kcm1faXJxLmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL2RybV9pcnEuYwpAQCAtMyw2ICszLDI1IEBACiAgKgogICogXGF1dGhvciBS aWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4KICAqIFxhdXRob3IgR2Fy ZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVy ZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisg KiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxl cyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCBy ZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0 byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0 IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywg c3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUg bmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1 YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRX QVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVY UFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdB UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBWQSBM SU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlN LCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9G IENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9S IElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICogT1RIRVIg REVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgogICovCiAKIC8qCkBAIC0zMiw0MjkgKzUxLDE1IEBA CiAgKiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAgKi8KIAorI2luY2x1ZGUgPGRy bS9kcm1faXJxLmg+CiAjaW5jbHVkZSA8ZHJtL2RybVAuaD4KLSNpbmNsdWRlICJkcm1fdHJhY2Uu aCIKLSNpbmNsdWRlICJkcm1faW50ZXJuYWwuaCIKIAogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgkvKiBGb3IgdGFzayBxdWV1ZSBzdXBwb3J0ICovCi0jaW5jbHVkZSA8bGludXgvc2xhYi5o PgogCiAjaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CiAjaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+ CiAKLS8qIFJldHJ5IHRpbWVzdGFtcCBjYWxjdWxhdGlvbiB1cCB0byAzIHRpbWVzIHRvIHNhdGlz ZnkKLSAqIGRybV90aW1lc3RhbXBfcHJlY2lzaW9uIGJlZm9yZSBnaXZpbmcgdXAuCi0gKi8KLSNk ZWZpbmUgRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTIDMKLQotLyogVGhyZXNob2xkIGluIG5hbm9z ZWNvbmRzIGZvciBkZXRlY3Rpb24gb2YgcmVkdW5kYW50Ci0gKiB2YmxhbmsgaXJxIGluIGRybV9o YW5kbGVfdmJsYW5rKCkuIDEgbXNlYyBzaG91bGQgYmUgb2suCi0gKi8KLSNkZWZpbmUgRFJNX1JF RFVOREFOVF9WQkxJUlFfVEhSRVNIX05TIDEwMDAwMDAKLQotc3RhdGljIGJvb2wKLWRybV9nZXRf bGFzdF92Ymx0aW1lc3RhbXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBp cGUsCi0JCQkgIHN0cnVjdCB0aW1ldmFsICp0dmJsYW5rLCBib29sIGluX3ZibGFua19pcnEpOwot Ci1zdGF0aWMgdW5zaWduZWQgaW50IGRybV90aW1lc3RhbXBfcHJlY2lzaW9uID0gMjA7ICAvKiBE ZWZhdWx0IHRvIDIwIHVzZWNzLiAqLwotCi0vKgotICogRGVmYXVsdCB0byB1c2UgbW9ub3Rvbmlj IHRpbWVzdGFtcHMgZm9yIHdhaXQtZm9yLXZibGFuayBhbmQgcGFnZS1mbGlwCi0gKiBjb21wbGV0 ZSBldmVudHMuCi0gKi8KLXVuc2lnbmVkIGludCBkcm1fdGltZXN0YW1wX21vbm90b25pYyA9IDE7 Ci0KLXN0YXRpYyBpbnQgZHJtX3ZibGFua19vZmZkZWxheSA9IDUwMDA7ICAgIC8qIERlZmF1bHQg dG8gNTAwMCBtc2Vjcy4gKi8KLQotbW9kdWxlX3BhcmFtX25hbWVkKHZibGFua29mZmRlbGF5LCBk cm1fdmJsYW5rX29mZmRlbGF5LCBpbnQsIDA2MDApOwotbW9kdWxlX3BhcmFtX25hbWVkKHRpbWVz dGFtcF9wcmVjaXNpb25fdXNlYywgZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24sIGludCwgMDYwMCk7 Ci1tb2R1bGVfcGFyYW1fbmFtZWQodGltZXN0YW1wX21vbm90b25pYywgZHJtX3RpbWVzdGFtcF9t b25vdG9uaWMsIGludCwgMDYwMCk7Ci1NT0RVTEVfUEFSTV9ERVNDKHZibGFua29mZmRlbGF5LCAi RGVsYXkgdW50aWwgdmJsYW5rIGlycSBhdXRvLWRpc2FibGUgW21zZWNzXSAoMDogbmV2ZXIgZGlz YWJsZSwgPDA6IGRpc2FibGUgaW1tZWRpYXRlbHkpIik7Ci1NT0RVTEVfUEFSTV9ERVNDKHRpbWVz dGFtcF9wcmVjaXNpb25fdXNlYywgIk1heC4gZXJyb3Igb24gdGltZXN0YW1wcyBbdXNlY3NdIik7 Ci1NT0RVTEVfUEFSTV9ERVNDKHRpbWVzdGFtcF9tb25vdG9uaWMsICJVc2UgbW9ub3RvbmljIHRp bWVzdGFtcHMiKTsKLQotc3RhdGljIHZvaWQgc3RvcmVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYsIHVuc2lnbmVkIGludCBwaXBlLAotCQkJIHUzMiB2YmxhbmtfY291bnRfaW5jLAotCQkJ IHN0cnVjdCB0aW1ldmFsICp0X3ZibGFuaywgdTMyIGxhc3QpCi17Ci0Jc3RydWN0IGRybV92Ymxh bmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOwotCi0JYXNzZXJ0X3NwaW5fbG9j a2VkKCZkZXYtPnZibGFua190aW1lX2xvY2spOwotCi0JdmJsYW5rLT5sYXN0ID0gbGFzdDsKLQot CXdyaXRlX3NlcWxvY2soJnZibGFuay0+c2VxbG9jayk7Ci0JdmJsYW5rLT50aW1lID0gKnRfdmJs YW5rOwotCXZibGFuay0+Y291bnQgKz0gdmJsYW5rX2NvdW50X2luYzsKLQl3cml0ZV9zZXF1bmxv Y2soJnZibGFuay0+c2VxbG9jayk7Ci19Ci0KLS8qCi0gKiAiTm8gaHcgY291bnRlciIgZmFsbGJh Y2sgaW1wbGVtZW50YXRpb24gb2YgLmdldF92YmxhbmtfY291bnRlcigpIGhvb2ssCi0gKiBpZiB0 aGVyZSBpcyBubyB1c2VhYmxlIGhhcmR3YXJlIGZyYW1lIGNvdW50ZXIgYXZhaWxhYmxlLgotICov Ci1zdGF0aWMgdTMyIGRybV92Ymxhbmtfbm9faHdfY291bnRlcihzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKLXsKLQlXQVJOX09OX09OQ0UoZGV2LT5tYXhfdmJsYW5r X2NvdW50ICE9IDApOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdTMyIF9fZ2V0X3ZibGFua19j b3VudGVyKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQotewotCWlm IChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7Ci0JCXN0cnVj dCBkcm1fY3J0YyAqY3J0YyA9IGRybV9jcnRjX2Zyb21faW5kZXgoZGV2LCBwaXBlKTsKLQotCQlp ZiAoY3J0Yy0+ZnVuY3MtPmdldF92YmxhbmtfY291bnRlcikKLQkJCXJldHVybiBjcnRjLT5mdW5j cy0+Z2V0X3ZibGFua19jb3VudGVyKGNydGMpOwotCX0KLQotCWlmIChkZXYtPmRyaXZlci0+Z2V0 X3ZibGFua19jb3VudGVyKQotCQlyZXR1cm4gZGV2LT5kcml2ZXItPmdldF92YmxhbmtfY291bnRl cihkZXYsIHBpcGUpOwotCi0JcmV0dXJuIGRybV92Ymxhbmtfbm9faHdfY291bnRlcihkZXYsIHBp cGUpOwotfQotCi0vKgotICogUmVzZXQgdGhlIHN0b3JlZCB0aW1lc3RhbXAgZm9yIHRoZSBjdXJy ZW50IHZibGFuayBjb3VudCB0byBjb3JyZXNwb25kCi0gKiB0byB0aGUgbGFzdCB2Ymxhbmsgb2Nj dXJyZWQuCi0gKgotICogT25seSB0byBiZSBjYWxsZWQgZnJvbSBkcm1fY3J0Y192Ymxhbmtfb24o KS4KLSAqCi0gKiBOb3RlOiBjYWxsZXIgbXVzdCBob2xkICZkcm1fZGV2aWNlLnZibF9sb2NrIHNp bmNlIHRoaXMgcmVhZHMgJiB3cml0ZXMKLSAqIGRldmljZSB2YmxhbmsgZmllbGRzLgotICovCi1z dGF0aWMgdm9pZCBkcm1fcmVzZXRfdmJsYW5rX3RpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKLXsKLQl1MzIgY3VyX3ZibGFuazsKLQlib29sIHJjOwot CXN0cnVjdCB0aW1ldmFsIHRfdmJsYW5rOwotCWludCBjb3VudCA9IERSTV9USU1FU1RBTVBfTUFY UkVUUklFUzsKLQotCXNwaW5fbG9jaygmZGV2LT52YmxhbmtfdGltZV9sb2NrKTsKLQotCS8qCi0J ICogc2FtcGxlIHRoZSBjdXJyZW50IGNvdW50ZXIgdG8gYXZvaWQgcmFuZG9tIGp1bXBzCi0JICog d2hlbiBkcm1fdmJsYW5rX2VuYWJsZSgpIGFwcGxpZXMgdGhlIGRpZmYKLQkgKi8KLQlkbyB7Ci0J CWN1cl92YmxhbmsgPSBfX2dldF92YmxhbmtfY291bnRlcihkZXYsIHBpcGUpOwotCQlyYyA9IGRy bV9nZXRfbGFzdF92Ymx0aW1lc3RhbXAoZGV2LCBwaXBlLCAmdF92YmxhbmssIGZhbHNlKTsKLQl9 IHdoaWxlIChjdXJfdmJsYW5rICE9IF9fZ2V0X3ZibGFua19jb3VudGVyKGRldiwgcGlwZSkgJiYg LS1jb3VudCA+IDApOwotCi0JLyoKLQkgKiBPbmx5IHJlaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5n IHZibGFuayB0aW1lc3RhbXAgaWYgaGlnaC1wcmVjaXNpb24gcXVlcnkKLQkgKiBhdmFpbGFibGUg YW5kIGRpZG4ndCBmYWlsLiBPdGhlcndpc2UgcmVpbml0aWFsaXplIGRlbGF5ZWQgYXQgbmV4dCB2 YmxhbmsKLQkgKiBpbnRlcnJ1cHQgYW5kIGFzc2lnbiAwIGZvciBub3csIHRvIG1hcmsgdGhlIHZi bGFua3RpbWVzdGFtcCBhcyBpbnZhbGlkLgotCSAqLwotCWlmICghcmMpCi0JCXRfdmJsYW5rID0g KHN0cnVjdCB0aW1ldmFsKSB7MCwgMH07Ci0KLQkvKgotCSAqICsxIHRvIG1ha2Ugc3VyZSB1c2Vy IHdpbGwgbmV2ZXIgc2VlIHRoZSBzYW1lCi0JICogdmJsYW5rIGNvdW50ZXIgdmFsdWUgYmVmb3Jl IGFuZCBhZnRlciBhIG1vZGVzZXQKLQkgKi8KLQlzdG9yZV92YmxhbmsoZGV2LCBwaXBlLCAxLCAm dF92YmxhbmssIGN1cl92YmxhbmspOwotCi0Jc3Bpbl91bmxvY2soJmRldi0+dmJsYW5rX3RpbWVf bG9jayk7Ci19Ci0KLS8qCi0gKiBDYWxsIGJhY2sgaW50byB0aGUgZHJpdmVyIHRvIHVwZGF0ZSB0 aGUgYXBwcm9wcmlhdGUgdmJsYW5rIGNvdW50ZXIKLSAqIChzcGVjaWZpZWQgYnkgQHBpcGUpLiAg RGVhbCB3aXRoIHdyYXBhcm91bmQsIGlmIGl0IG9jY3VycmVkLCBhbmQKLSAqIHVwZGF0ZSB0aGUg bGFzdCByZWFkIHZhbHVlIHNvIHdlIGNhbiBkZWFsIHdpdGggd3JhcGFyb3VuZCBvbiB0aGUgbmV4 dAotICogY2FsbCBpZiBuZWNlc3NhcnkuCi0gKgotICogT25seSBuZWNlc3Nhcnkgd2hlbiBnb2lu ZyBmcm9tIG9mZi0+b24sIHRvIGFjY291bnQgZm9yIGZyYW1lcyB3ZQotICogZGlkbid0IGdldCBh biBpbnRlcnJ1cHQgZm9yLgotICoKLSAqIE5vdGU6IGNhbGxlciBtdXN0IGhvbGQgJmRybV9kZXZp Y2UudmJsX2xvY2sgc2luY2UgdGhpcyByZWFkcyAmIHdyaXRlcwotICogZGV2aWNlIHZibGFuayBm aWVsZHMuCi0gKi8KLXN0YXRpYyB2b2lkIGRybV91cGRhdGVfdmJsYW5rX2NvdW50KHN0cnVjdCBk cm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlLAotCQkJCSAgICBib29sIGluX3ZibGFu a19pcnEpCi17Ci0Jc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5r W3BpcGVdOwotCXUzMiBjdXJfdmJsYW5rLCBkaWZmOwotCWJvb2wgcmM7Ci0Jc3RydWN0IHRpbWV2 YWwgdF92Ymxhbms7Ci0JaW50IGNvdW50ID0gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTOwotCWlu dCBmcmFtZWR1cl9ucyA9IHZibGFuay0+ZnJhbWVkdXJfbnM7Ci0KLQkvKgotCSAqIEludGVycnVw dHMgd2VyZSBkaXNhYmxlZCBwcmlvciB0byB0aGlzIGNhbGwsIHNvIGRlYWwgd2l0aCBjb3VudGVy Ci0JICogd3JhcCBpZiBuZWVkZWQuCi0JICogTk9URSEgIEl0J3MgcG9zc2libGUgd2UgbG9zdCBh IGZ1bGwgZGV2LT5tYXhfdmJsYW5rX2NvdW50ICsgMSBldmVudHMKLQkgKiBoZXJlIGlmIHRoZSBy ZWdpc3RlciBpcyBzbWFsbCBvciB3ZSBoYWQgdmJsYW5rIGludGVycnVwdHMgb2ZmIGZvcgotCSAq IGEgbG9uZyB0aW1lLgotCSAqCi0JICogV2UgcmVwZWF0IHRoZSBoYXJkd2FyZSB2YmxhbmsgY291 bnRlciAmIHRpbWVzdGFtcCBxdWVyeSB1bnRpbAotCSAqIHdlIGdldCBjb25zaXN0ZW50IHJlc3Vs dHMuIFRoaXMgdG8gcHJldmVudCByYWNlcyBiZXR3ZWVuIGdwdQotCSAqIHVwZGF0aW5nIGl0cyBo YXJkd2FyZSBjb3VudGVyIHdoaWxlIHdlIGFyZSByZXRyaWV2aW5nIHRoZQotCSAqIGNvcnJlc3Bv bmRpbmcgdmJsYW5rIHRpbWVzdGFtcC4KLQkgKi8KLQlkbyB7Ci0JCWN1cl92YmxhbmsgPSBfX2dl dF92YmxhbmtfY291bnRlcihkZXYsIHBpcGUpOwotCQlyYyA9IGRybV9nZXRfbGFzdF92Ymx0aW1l c3RhbXAoZGV2LCBwaXBlLCAmdF92YmxhbmssIGluX3ZibGFua19pcnEpOwotCX0gd2hpbGUgKGN1 cl92YmxhbmsgIT0gX19nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBwaXBlKSAmJiAtLWNvdW50ID4g MCk7Ci0KLQlpZiAoZGV2LT5tYXhfdmJsYW5rX2NvdW50ICE9IDApIHsKLQkJLyogdHJ1c3QgdGhl IGh3IGNvdW50ZXIgd2hlbiBpdCdzIGFyb3VuZCAqLwotCQlkaWZmID0gKGN1cl92YmxhbmsgLSB2 YmxhbmstPmxhc3QpICYgZGV2LT5tYXhfdmJsYW5rX2NvdW50OwotCX0gZWxzZSBpZiAocmMgJiYg ZnJhbWVkdXJfbnMpIHsKLQkJY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRfb2xkOwotCQl1NjQgZGlm Zl9uczsKLQotCQl0X29sZCA9ICZ2YmxhbmstPnRpbWU7Ci0JCWRpZmZfbnMgPSB0aW1ldmFsX3Rv X25zKCZ0X3ZibGFuaykgLSB0aW1ldmFsX3RvX25zKHRfb2xkKTsKLQotCQkvKgotCQkgKiBGaWd1 cmUgb3V0IGhvdyBtYW55IHZibGFua3Mgd2UndmUgbWlzc2VkIGJhc2VkCi0JCSAqIG9uIHRoZSBk aWZmZXJlbmNlIGluIHRoZSB0aW1lc3RhbXBzIGFuZCB0aGUKLQkJICogZnJhbWUvZmllbGQgZHVy YXRpb24uCi0JCSAqLwotCQlkaWZmID0gRElWX1JPVU5EX0NMT1NFU1RfVUxMKGRpZmZfbnMsIGZy YW1lZHVyX25zKTsKLQotCQlpZiAoZGlmZiA9PSAwICYmIGluX3ZibGFua19pcnEpCi0JCQlEUk1f REVCVUdfVkJMKCJjcnRjICV1OiBSZWR1bmRhbnQgdmJsaXJxIGlnbm9yZWQuIgotCQkJCSAgICAg ICIgZGlmZl9ucyA9ICVsbGQsIGZyYW1lZHVyX25zID0gJWQpXG4iLAotCQkJCSAgICAgIHBpcGUs IChsb25nIGxvbmcpIGRpZmZfbnMsIGZyYW1lZHVyX25zKTsKLQl9IGVsc2UgewotCQkvKiBzb21l IGtpbmQgb2YgZGVmYXVsdCBmb3IgZHJpdmVycyB3L28gYWNjdXJhdGUgdmJsIHRpbWVzdGFtcGlu ZyAqLwotCQlkaWZmID0gaW5fdmJsYW5rX2lycSA/IDEgOiAwOwotCX0KLQotCS8qCi0JICogV2l0 aGluIGEgZHJtX3ZibGFua19wcmVfbW9kZXNldCAtIGRybV92YmxhbmtfcG9zdF9tb2Rlc2V0Ci0J ICogaW50ZXJ2YWw/IElmIHNvIHRoZW4gdmJsYW5rIGlycXMga2VlcCBydW5uaW5nIGFuZCBpdCB3 aWxsIGxpa2VseQotCSAqIGhhcHBlbiB0aGF0IHRoZSBoYXJkd2FyZSB2YmxhbmsgY291bnRlciBp cyBub3QgdHJ1c3R3b3J0aHkgYXMgaXQKLQkgKiBtaWdodCByZXNldCBhdCBzb21lIHBvaW50IGlu IHRoYXQgaW50ZXJ2YWwgYW5kIHZibGFuayB0aW1lc3RhbXBzCi0JICogYXJlIG5vdCB0cnVzdHdv cnRoeSBlaXRoZXIgaW4gdGhhdCBpbnRlcnZhbC4gSW93LiB0aGlzIGNhbiByZXN1bHQKLQkgKiBp biBhIGJvZ3VzIGRpZmYgPj4gMSB3aGljaCBtdXN0IGJlIGF2b2lkZWQgYXMgaXQgd291bGQgY2F1 c2UKLQkgKiByYW5kb20gbGFyZ2UgZm9yd2FyZCBqdW1wcyBvZiB0aGUgc29mdHdhcmUgdmJsYW5r IGNvdW50ZXIuCi0JICovCi0JaWYgKGRpZmYgPiAxICYmICh2YmxhbmstPmlubW9kZXNldCAmIDB4 MikpIHsKLQkJRFJNX0RFQlVHX1ZCTCgiY2xhbXBpbmcgdmJsYW5rIGJ1bXAgdG8gMSBvbiBjcnRj ICV1OiBkaWZmcj0ldSIKLQkJCSAgICAgICIgZHVlIHRvIHByZS1tb2Rlc2V0LlxuIiwgcGlwZSwg ZGlmZik7Ci0JCWRpZmYgPSAxOwotCX0KLQotCURSTV9ERUJVR19WQkwoInVwZGF0aW5nIHZibGFu ayBjb3VudCBvbiBjcnRjICV1OiIKLQkJICAgICAgIiBjdXJyZW50PSV1LCBkaWZmPSV1LCBodz0l dSBod19sYXN0PSV1XG4iLAotCQkgICAgICBwaXBlLCB2YmxhbmstPmNvdW50LCBkaWZmLCBjdXJf dmJsYW5rLCB2YmxhbmstPmxhc3QpOwotCi0JaWYgKGRpZmYgPT0gMCkgewotCQlXQVJOX09OX09O Q0UoY3VyX3ZibGFuayAhPSB2YmxhbmstPmxhc3QpOwotCQlyZXR1cm47Ci0JfQotCi0JLyoKLQkg KiBPbmx5IHJlaW5pdGlhbGl6ZSBjb3JyZXNwb25kaW5nIHZibGFuayB0aW1lc3RhbXAgaWYgaGln aC1wcmVjaXNpb24gcXVlcnkKLQkgKiBhdmFpbGFibGUgYW5kIGRpZG4ndCBmYWlsLCBvciB3ZSB3 ZXJlIGNhbGxlZCBmcm9tIHRoZSB2YmxhbmsgaW50ZXJydXB0LgotCSAqIE90aGVyd2lzZSByZWlu aXRpYWxpemUgZGVsYXllZCBhdCBuZXh0IHZibGFuayBpbnRlcnJ1cHQgYW5kIGFzc2lnbiAwCi0J ICogZm9yIG5vdywgdG8gbWFyayB0aGUgdmJsYW5rdGltZXN0YW1wIGFzIGludmFsaWQuCi0JICov Ci0JaWYgKCFyYyAmJiBpbl92YmxhbmtfaXJxKQotCQl0X3ZibGFuayA9IChzdHJ1Y3QgdGltZXZh bCkgezAsIDB9OwotCi0Jc3RvcmVfdmJsYW5rKGRldiwgcGlwZSwgZGlmZiwgJnRfdmJsYW5rLCBj dXJfdmJsYW5rKTsKLX0KLQotc3RhdGljIHUzMiBkcm1fdmJsYW5rX2NvdW50KHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQotewotCXN0cnVjdCBkcm1fdmJsYW5rX2Ny dGMgKnZibGFuayA9ICZkZXYtPnZibGFua1twaXBlXTsKLQotCWlmIChXQVJOX09OKHBpcGUgPj0g ZGV2LT5udW1fY3J0Y3MpKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiB2YmxhbmstPmNvdW50Owot fQotCi0vKioKLSAqIGRybV9hY2N1cmF0ZV92YmxhbmtfY291bnQgLSByZXRyaWV2ZSB0aGUgbWFz dGVyIHZibGFuayBjb3VudGVyCi0gKiBAY3J0Yzogd2hpY2ggY291bnRlciB0byByZXRyaWV2ZQot ICoKLSAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byBAZHJtX2NydGNfdmJsYW5rX2NvdW50 IGJ1dCB0aGlzCi0gKiBmdW5jdGlvbiBpbnRlcnBvbGF0ZXMgdG8gaGFuZGxlIGEgcmFjZSB3aXRo IHZibGFuayBpcnEncy4KLSAqCi0gKiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGhhcmR3YXJl IHRoYXQgY2FuIG9idGFpbiB0aGUgc2Nhbm91dAotICogcG9zaXRpb24sIGJ1dCBkb2Vzbid0IGhh dmUgYSBmcmFtZSBjb3VudGVyLgotICovCi11MzIgZHJtX2FjY3VyYXRlX3ZibGFua19jb3VudChz dHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMt PmRldjsKLQl1bnNpZ25lZCBpbnQgcGlwZSA9IGRybV9jcnRjX2luZGV4KGNydGMpOwotCXUzMiB2 Ymxhbms7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCVdBUk4oIWRldi0+ZHJpdmVyLT5nZXRf dmJsYW5rX3RpbWVzdGFtcCwKLQkgICAgICJUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIHN1cHBvcnQg Zm9yIGFjY3VyYXRlIHZibGFuayB0aW1lc3RhbXBzLiIpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUo JmRldi0+dmJsYW5rX3RpbWVfbG9jaywgZmxhZ3MpOwotCi0JZHJtX3VwZGF0ZV92YmxhbmtfY291 bnQoZGV2LCBwaXBlLCBmYWxzZSk7Ci0JdmJsYW5rID0gZHJtX3ZibGFua19jb3VudChkZXYsIHBp cGUpOwotCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxhbmtfdGltZV9sb2NrLCBm bGFncyk7Ci0KLQlyZXR1cm4gdmJsYW5rOwotfQotRVhQT1JUX1NZTUJPTChkcm1fYWNjdXJhdGVf dmJsYW5rX2NvdW50KTsKLQotc3RhdGljIHZvaWQgX19kaXNhYmxlX3ZibGFuayhzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKLXsKLQlpZiAoZHJtX2NvcmVfY2hlY2tf ZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgewotCQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMg PSBkcm1fY3J0Y19mcm9tX2luZGV4KGRldiwgcGlwZSk7Ci0KLQkJaWYgKGNydGMtPmZ1bmNzLT5k aXNhYmxlX3ZibGFuaykgewotCQkJY3J0Yy0+ZnVuY3MtPmRpc2FibGVfdmJsYW5rKGNydGMpOwot CQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JZGV2LT5kcml2ZXItPmRpc2FibGVfdmJsYW5rKGRldiwg cGlwZSk7Ci19Ci0KLS8qCi0gKiBEaXNhYmxlIHZibGFuayBpcnEncyBvbiBjcnRjLCBtYWtlIHN1 cmUgdGhhdCBsYXN0IHZibGFuayBjb3VudAotICogb2YgaGFyZHdhcmUgYW5kIGNvcnJlc3BvbmRp bmcgY29uc2lzdGVudCBzb2Z0d2FyZSB2YmxhbmsgY291bnRlcgotICogYXJlIHByZXNlcnZlZCwg ZXZlbiBpZiB0aGVyZSBhcmUgYW55IHNwdXJpb3VzIHZibGFuayBpcnEncyBhZnRlcgotICogZGlz YWJsZS4KLSAqLwotc3RhdGljIHZvaWQgdmJsYW5rX2Rpc2FibGVfYW5kX3NhdmUoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCi17Ci0Jc3RydWN0IGRybV92Ymxhbmtf Y3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxh Z3M7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+dmJsX2xvY2spOwotCi0JLyogUHJldmVu dCB2YmxhbmsgaXJxIHByb2Nlc3Npbmcgd2hpbGUgZGlzYWJsaW5nIHZibGFuayBpcnFzLAotCSAq IHNvIG5vIHVwZGF0ZXMgb2YgdGltZXN0YW1wcyBvciBjb3VudCBjYW4gaGFwcGVuIGFmdGVyIHdl J3ZlCi0JICogZGlzYWJsZWQuIE5lZWRlZCB0byBwcmV2ZW50IHJhY2VzIGluIGNhc2Ugb2YgZGVs YXllZCBpcnEncy4KLQkgKi8KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52YmxhbmtfdGltZV9s b2NrLCBpcnFmbGFncyk7Ci0KLQkvKgotCSAqIE9ubHkgZGlzYWJsZSB2YmxhbmsgaW50ZXJydXB0 cyBpZiB0aGV5J3JlIGVuYWJsZWQuIFRoaXMgYXZvaWRzCi0JICogY2FsbGluZyB0aGUgLT5kaXNh YmxlX3ZibGFuaygpIG9wZXJhdGlvbiBpbiBhdG9taWMgY29udGV4dCB3aXRoIHRoZQotCSAqIGhh cmR3YXJlIHBvdGVudGlhbGx5IHJ1bnRpbWUgc3VzcGVuZGVkLgotCSAqLwotCWlmICh2Ymxhbmst PmVuYWJsZWQpIHsKLQkJX19kaXNhYmxlX3ZibGFuayhkZXYsIHBpcGUpOwotCQl2YmxhbmstPmVu YWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEFsd2F5cyB1cGRhdGUgdGhlIGNvdW50IGFu ZCB0aW1lc3RhbXAgdG8gbWFpbnRhaW4gdGhlCi0JICogYXBwZWFyYW5jZSB0aGF0IHRoZSBjb3Vu dGVyIGhhcyBiZWVuIHRpY2tpbmcgYWxsIGFsb25nIHVudGlsCi0JICogdGhpcyB0aW1lLiBUaGlz IG1ha2VzIHRoZSBjb3VudCBhY2NvdW50IGZvciB0aGUgZW50aXJlIHRpbWUKLQkgKiBiZXR3ZWVu IGRybV9jcnRjX3ZibGFua19vbigpIGFuZCBkcm1fY3J0Y192Ymxhbmtfb2ZmKCkuCi0JICovCi0J ZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoZGV2LCBwaXBlLCBmYWxzZSk7Ci0KLQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZkZXYtPnZibGFua190aW1lX2xvY2ssIGlycWZsYWdzKTsKLX0KLQotc3Rh dGljIHZvaWQgdmJsYW5rX2Rpc2FibGVfZm4odW5zaWduZWQgbG9uZyBhcmcpCi17Ci0Jc3RydWN0 IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gKHZvaWQgKilhcmc7Ci0Jc3RydWN0IGRybV9kZXZp Y2UgKmRldiA9IHZibGFuay0+ZGV2OwotCXVuc2lnbmVkIGludCBwaXBlID0gdmJsYW5rLT5waXBl OwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0KLQlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT52 YmxfbG9jaywgaXJxZmxhZ3MpOwotCWlmIChhdG9taWNfcmVhZCgmdmJsYW5rLT5yZWZjb3VudCkg PT0gMCAmJiB2YmxhbmstPmVuYWJsZWQpIHsKLQkJRFJNX0RFQlVHKCJkaXNhYmxpbmcgdmJsYW5r IG9uIGNydGMgJXVcbiIsIHBpcGUpOwotCQl2YmxhbmtfZGlzYWJsZV9hbmRfc2F2ZShkZXYsIHBp cGUpOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFn cyk7Ci19Ci0KLS8qKgotICogZHJtX3ZibGFua19jbGVhbnVwIC0gY2xlYW51cCB2Ymxhbmsgc3Vw cG9ydAotICogQGRldjogRFJNIGRldmljZQotICoKLSAqIFRoaXMgZnVuY3Rpb24gY2xlYW5zIHVw IGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGluIGRybV92YmxhbmtfaW5pdC4KLSAqLwotdm9pZCBk cm1fdmJsYW5rX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKLXsKLQl1bnNpZ25lZCBp bnQgcGlwZTsKLQotCS8qIEJhaWwgaWYgdGhlIGRyaXZlciBkaWRuJ3QgY2FsbCBkcm1fdmJsYW5r X2luaXQoKSAqLwotCWlmIChkZXYtPm51bV9jcnRjcyA9PSAwKQotCQlyZXR1cm47Ci0KLQlmb3Ig KHBpcGUgPSAwOyBwaXBlIDwgZGV2LT5udW1fY3J0Y3M7IHBpcGUrKykgewotCQlzdHJ1Y3QgZHJt X3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07Ci0KLQkJV0FSTl9PTihS RUFEX09OQ0UodmJsYW5rLT5lbmFibGVkKSAmJgotCQkJZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShk ZXYsIERSSVZFUl9NT0RFU0VUKSk7Ci0KLQkJZGVsX3RpbWVyX3N5bmMoJnZibGFuay0+ZGlzYWJs ZV90aW1lcik7Ci0JfQotCi0Ja2ZyZWUoZGV2LT52YmxhbmspOwotCi0JZGV2LT5udW1fY3J0Y3Mg PSAwOwotfQotRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX2NsZWFudXApOwotCi0vKioKLSAqIGRy bV92YmxhbmtfaW5pdCAtIGluaXRpYWxpemUgdmJsYW5rIHN1cHBvcnQKLSAqIEBkZXY6IERSTSBk ZXZpY2UKLSAqIEBudW1fY3J0Y3M6IG51bWJlciBvZiBDUlRDcyBzdXBwb3J0ZWQgYnkgQGRldgot ICoKLSAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdmJsYW5rIHN1cHBvcnQgZm9yIEBudW1f Y3J0Y3MgZGlzcGxheSBwaXBlbGluZXMuCi0gKgotICogUmV0dXJuczoKLSAqIFplcm8gb24gc3Vj Y2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotaW50IGRybV92 YmxhbmtfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgbnVtX2NydGNz KQotewotCWludCByZXQgPSAtRU5PTUVNOwotCXVuc2lnbmVkIGludCBpOwotCi0Jc3Bpbl9sb2Nr X2luaXQoJmRldi0+dmJsX2xvY2spOwotCXNwaW5fbG9ja19pbml0KCZkZXYtPnZibGFua190aW1l X2xvY2spOwotCi0JZGV2LT5udW1fY3J0Y3MgPSBudW1fY3J0Y3M7Ci0KLQlkZXYtPnZibGFuayA9 IGtjYWxsb2MobnVtX2NydGNzLCBzaXplb2YoKmRldi0+dmJsYW5rKSwgR0ZQX0tFUk5FTCk7Ci0J aWYgKCFkZXYtPnZibGFuaykKLQkJZ290byBlcnI7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgbnVtX2Ny dGNzOyBpKyspIHsKLQkJc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJs YW5rW2ldOwotCi0JCXZibGFuay0+ZGV2ID0gZGV2OwotCQl2YmxhbmstPnBpcGUgPSBpOwotCQlp bml0X3dhaXRxdWV1ZV9oZWFkKCZ2YmxhbmstPnF1ZXVlKTsKLQkJc2V0dXBfdGltZXIoJnZibGFu ay0+ZGlzYWJsZV90aW1lciwgdmJsYW5rX2Rpc2FibGVfZm4sCi0JCQkgICAgKHVuc2lnbmVkIGxv bmcpdmJsYW5rKTsKLQkJc2VxbG9ja19pbml0KCZ2YmxhbmstPnNlcWxvY2spOwotCX0KLQotCURS TV9JTkZPKCJTdXBwb3J0cyB2YmxhbmsgdGltZXN0YW1wIGNhY2hpbmcgUmV2IDIgKDIxLjEwLjIw MTMpLlxuIik7Ci0KLQkvKiBEcml2ZXIgc3BlY2lmaWMgaGlnaC1wcmVjaXNpb24gdmJsYW5rIHRp bWVzdGFtcGluZyBzdXBwb3J0ZWQ/ICovCi0JaWYgKGRldi0+ZHJpdmVyLT5nZXRfdmJsYW5rX3Rp bWVzdGFtcCkKLQkJRFJNX0lORk8oIkRyaXZlciBzdXBwb3J0cyBwcmVjaXNlIHZibGFuayB0aW1l c3RhbXAgcXVlcnkuXG4iKTsKLQllbHNlCi0JCURSTV9JTkZPKCJObyBkcml2ZXIgc3VwcG9ydCBm b3IgdmJsYW5rIHRpbWVzdGFtcCBxdWVyeS5cbiIpOwotCi0JLyogTXVzdCBoYXZlIHByZWNpc2Ug dGltZXN0YW1waW5nIGZvciByZWxpYWJsZSB2YmxhbmsgaW5zdGFudCBkaXNhYmxlICovCi0JaWYg KGRldi0+dmJsYW5rX2Rpc2FibGVfaW1tZWRpYXRlICYmICFkZXYtPmRyaXZlci0+Z2V0X3ZibGFu a190aW1lc3RhbXApIHsKLQkJZGV2LT52YmxhbmtfZGlzYWJsZV9pbW1lZGlhdGUgPSBmYWxzZTsK LQkJRFJNX0lORk8oIlNldHRpbmcgdmJsYW5rX2Rpc2FibGVfaW1tZWRpYXRlIHRvIGZhbHNlIGJl Y2F1c2UgIgotCQkJICJnZXRfdmJsYW5rX3RpbWVzdGFtcCA9PSBOVUxMXG4iKTsKLQl9Ci0KLQly ZXR1cm4gMDsKLQotZXJyOgotCWRldi0+bnVtX2NydGNzID0gMDsKLQlyZXR1cm4gcmV0OwotfQot RVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX2luaXQpOworI2luY2x1ZGUgImRybV9pbnRlcm5hbC5o IgogCiAvKioKICAqIGRybV9pcnFfaW5zdGFsbCAtIGluc3RhbGwgSVJRIGhhbmRsZXIKQEAgLTU3 MSw3ICsxNzYsNyBAQCBpbnQgZHJtX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRl dikKIAogCQkJV0FSTl9PTihkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVT RVQpKTsKIAotCQkJdmJsYW5rX2Rpc2FibGVfYW5kX3NhdmUoZGV2LCBpKTsKKwkJCWRybV92Ymxh bmtfZGlzYWJsZV9hbmRfc2F2ZShkZXYsIGkpOwogCQkJd2FrZV91cCgmdmJsYW5rLT5xdWV1ZSk7 CiAJCX0KIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3Mp OwpAQCAtNjM0LDExODcgKzIzOSwzIEBAIGludCBkcm1fbGVnYWN5X2lycV9jb250cm9sKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEsCiAJCXJldHVybiAtRUlOVkFMOwogCX0KIH0K LQotLyoqCi0gKiBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzIC0gY2FsY3VsYXRlIHZi bGFuayB0aW1lc3RhbXAgY29uc3RhbnRzCi0gKiBAY3J0YzogZHJtX2NydGMgd2hvc2UgdGltZXN0 YW1wIGNvbnN0YW50cyBzaG91bGQgYmUgdXBkYXRlZC4KLSAqIEBtb2RlOiBkaXNwbGF5IG1vZGUg Y29udGFpbmluZyB0aGUgc2Nhbm91dCB0aW1pbmdzCi0gKgotICogQ2FsY3VsYXRlIGFuZCBzdG9y ZSB2YXJpb3VzIGNvbnN0YW50cyB3aGljaCBhcmUgbGF0ZXIKLSAqIG5lZWRlZCBieSB2Ymxhbmsg YW5kIHN3YXAtY29tcGxldGlvbiB0aW1lc3RhbXBpbmcsIGUuZywKLSAqIGJ5IGRybV9jYWxjX3Zi bHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MoKS4gVGhleSBhcmUKLSAqIGRlcml2ZWQgZnJvbSBD UlRDJ3MgdHJ1ZSBzY2Fub3V0IHRpbWluZywgc28gdGhleSB0YWtlCi0gKiB0aGluZ3MgbGlrZSBw YW5lbCBzY2FsaW5nIG9yIG90aGVyIGFkanVzdG1lbnRzIGludG8gYWNjb3VudC4KLSAqLwotdm9p ZCBkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywK LQkJCQkgICAgIGNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlKQotewotCXN0cnVj dCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0JdW5zaWduZWQgaW50IHBpcGUgPSBkcm1f Y3J0Y19pbmRleChjcnRjKTsKLQlzdHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2 LT52YmxhbmtbcGlwZV07Ci0JaW50IGxpbmVkdXJfbnMgPSAwLCBmcmFtZWR1cl9ucyA9IDA7Ci0J aW50IGRvdGNsb2NrID0gbW9kZS0+Y3J0Y19jbG9jazsKLQotCWlmICghZGV2LT5udW1fY3J0Y3Mp Ci0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0Y3MpKQotCQly ZXR1cm47Ci0KLQkvKiBWYWxpZCBkb3RjbG9jaz8gKi8KLQlpZiAoZG90Y2xvY2sgPiAwKSB7Ci0J CWludCBmcmFtZV9zaXplID0gbW9kZS0+Y3J0Y19odG90YWwgKiBtb2RlLT5jcnRjX3Z0b3RhbDsK LQotCQkvKgotCQkgKiBDb252ZXJ0IHNjYW5saW5lIGxlbmd0aCBpbiBwaXhlbHMgYW5kIHZpZGVv Ci0JCSAqIGRvdCBjbG9jayB0byBsaW5lIGR1cmF0aW9uIGFuZCBmcmFtZSBkdXJhdGlvbgotCQkg KiBpbiBuYW5vc2Vjb25kczoKLQkJICovCi0JCWxpbmVkdXJfbnMgID0gZGl2X3U2NCgodTY0KSBt b2RlLT5jcnRjX2h0b3RhbCAqIDEwMDAwMDAsIGRvdGNsb2NrKTsKLQkJZnJhbWVkdXJfbnMgPSBk aXZfdTY0KCh1NjQpIGZyYW1lX3NpemUgKiAxMDAwMDAwLCBkb3RjbG9jayk7Ci0KLQkJLyoKLQkJ ICogRmllbGRzIG9mIGludGVybGFjZWQgc2Nhbm91dCBtb2RlcyBhcmUgb25seSBoYWxmIGEgZnJh bWUgZHVyYXRpb24uCi0JCSAqLwotCQlpZiAobW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lO VEVSTEFDRSkKLQkJCWZyYW1lZHVyX25zIC89IDI7Ci0JfSBlbHNlCi0JCURSTV9FUlJPUigiY3J0 YyAldTogQ2FuJ3QgY2FsY3VsYXRlIGNvbnN0YW50cywgZG90Y2xvY2sgPSAwIVxuIiwKLQkJCSAg Y3J0Yy0+YmFzZS5pZCk7Ci0KLQl2YmxhbmstPmxpbmVkdXJfbnMgID0gbGluZWR1cl9uczsKLQl2 YmxhbmstPmZyYW1lZHVyX25zID0gZnJhbWVkdXJfbnM7Ci0JdmJsYW5rLT5od21vZGUgPSAqbW9k ZTsKLQotCURSTV9ERUJVRygiY3J0YyAldTogaHdtb2RlOiBodG90YWwgJWQsIHZ0b3RhbCAlZCwg dmRpc3BsYXkgJWRcbiIsCi0JCSAgY3J0Yy0+YmFzZS5pZCwgbW9kZS0+Y3J0Y19odG90YWwsCi0J CSAgbW9kZS0+Y3J0Y192dG90YWwsIG1vZGUtPmNydGNfdmRpc3BsYXkpOwotCURSTV9ERUJVRygi Y3J0YyAldTogY2xvY2sgJWQga0h6IGZyYW1lZHVyICVkIGxpbmVkdXIgJWRcbiIsCi0JCSAgY3J0 Yy0+YmFzZS5pZCwgZG90Y2xvY2ssIGZyYW1lZHVyX25zLCBsaW5lZHVyX25zKTsKLX0KLUVYUE9S VF9TWU1CT0woZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyk7Ci0KLS8qKgotICogZHJt X2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyAtIHByZWNpc2UgdmJsYW5rIHRpbWVz dGFtcCBoZWxwZXIKLSAqIEBkZXY6IERSTSBkZXZpY2UKLSAqIEBwaXBlOiBpbmRleCBvZiBDUlRD IHdob3NlIHZibGFuayB0aW1lc3RhbXAgdG8gcmV0cmlldmUKLSAqIEBtYXhfZXJyb3I6IERlc2ly ZWQgbWF4aW11bSBhbGxvd2FibGUgZXJyb3IgaW4gdGltZXN0YW1wcyAobmFub3NlY3MpCi0gKiAg ICAgICAgICAgICBPbiByZXR1cm4gY29udGFpbnMgdHJ1ZSBtYXhpbXVtIGVycm9yIG9mIHRpbWVz dGFtcAotICogQHZibGFua190aW1lOiBQb2ludGVyIHRvIHN0cnVjdCB0aW1ldmFsIHdoaWNoIHNo b3VsZCByZWNlaXZlIHRoZSB0aW1lc3RhbXAKLSAqIEBpbl92YmxhbmtfaXJxOgotICogICAgIFRy dWUgd2hlbiBjYWxsZWQgZnJvbSBkcm1fY3J0Y19oYW5kbGVfdmJsYW5rKCkuICBTb21lIGRyaXZl cnMKLSAqICAgICBuZWVkIHRvIGFwcGx5IHNvbWUgd29ya2Fyb3VuZHMgZm9yIGdwdS1zcGVjaWZp YyB2YmxhbmsgaXJxIHF1aXJrcwotICogICAgIGlmIGZsYWcgaXMgc2V0LgotICoKLSAqIEltcGxl bWVudHMgY2FsY3VsYXRpb24gb2YgZXhhY3QgdmJsYW5rIHRpbWVzdGFtcHMgZnJvbSBnaXZlbiBk cm1fZGlzcGxheV9tb2RlCi0gKiB0aW1pbmdzIGFuZCBjdXJyZW50IHZpZGVvIHNjYW5vdXQgcG9z aXRpb24gb2YgYSBDUlRDLiBUaGlzIGNhbiBiZSBjYWxsZWQgZnJvbQotICogd2l0aGluIGdldF92 YmxhbmtfdGltZXN0YW1wKCkgaW1wbGVtZW50YXRpb24gb2YgYSBrbXMgZHJpdmVyIHRvIGltcGxl bWVudCB0aGUKLSAqIGFjdHVhbCB0aW1lc3RhbXBpbmcuCi0gKgotICogU2hvdWxkIHJldHVybiB0 aW1lc3RhbXBzIGNvbmZvcm1pbmcgdG8gdGhlIE9NTF9zeW5jX2NvbnRyb2wgT3Blbk1MCi0gKiBl eHRlbnNpb24gc3BlY2lmaWNhdGlvbi4gVGhlIHRpbWVzdGFtcCBjb3JyZXNwb25kcyB0byB0aGUg ZW5kIG9mCi0gKiB0aGUgdmJsYW5rIGludGVydmFsLCBha2Egc3RhcnQgb2Ygc2Nhbm91dCBvZiB0 b3Btb3N0LWxlZnRtb3N0IGRpc3BsYXkKLSAqIHBpeGVsIGluIHRoZSBmb2xsb3dpbmcgdmlkZW8g ZnJhbWUuCi0gKgotICogUmVxdWlyZXMgc3VwcG9ydCBmb3Igb3B0aW9uYWwgZGV2LT5kcml2ZXIt PmdldF9zY2Fub3V0X3Bvc2l0aW9uKCkKLSAqIGluIGttcyBkcml2ZXIsIHBsdXMgYSBiaXQgb2Yg c2V0dXAgY29kZSB0byBwcm92aWRlIGEgZHJtX2Rpc3BsYXlfbW9kZQotICogdGhhdCBjb3JyZXNw b25kcyB0byB0aGUgdHJ1ZSBzY2Fub3V0IHRpbWluZy4KLSAqCi0gKiBUaGUgY3VycmVudCBpbXBs ZW1lbnRhdGlvbiBvbmx5IGhhbmRsZXMgc3RhbmRhcmQgdmlkZW8gbW9kZXMuIEl0Ci0gKiByZXR1 cm5zIGFzIG5vIG9wZXJhdGlvbiBpZiBhIGRvdWJsZXNjYW4gb3IgaW50ZXJsYWNlZCB2aWRlbyBt b2RlIGlzCi0gKiBhY3RpdmUuIEhpZ2hlciBsZXZlbCBjb2RlIGlzIGV4cGVjdGVkIHRvIGhhbmRs ZSB0aGlzLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRo ZSAmZHJtX2RyaXZlci5nZXRfdmJsYW5rX3RpbWVzdGFtcAotICogZGlyZWN0bHksIGlmIHRoZSBk cml2ZXIgaW1wbGVtZW50cyB0aGUgJmRybV9kcml2ZXIuZ2V0X3NjYW5vdXRfcG9zaXRpb24gaG9v ay4KLSAqCi0gKiBOb3RlIHRoYXQgYXRvbWljIGRyaXZlcnMgbXVzdCBjYWxsIGRybV9jYWxjX3Rp bWVzdGFtcGluZ19jb25zdGFudHMoKSBiZWZvcmUKLSAqIGVuYWJsaW5nIGEgQ1JUQy4gVGhlIGF0 b21pYyBoZWxwZXJzIGFscmVhZHkgdGFrZSBjYXJlIG9mIHRoYXQgaW4KLSAqIGRybV9hdG9taWNf aGVscGVyX3VwZGF0ZV9sZWdhY3lfbW9kZXNldF9zdGF0ZSgpLgotICoKLSAqIFJldHVybnM6Ci0g KgotICogUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGFuZCBmYWxzZSBvbiBmYWlsdXJlLCBpLmUu IHdoZW4gbm8gYWNjdXJhdGUKLSAqIHRpbWVzdGFtcCBjb3VsZCBiZSBhY3F1aXJlZC4KLSAqLwot Ym9vbCBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsCi0JCQkJCSAgIHVuc2lnbmVkIGludCBwaXBlLAotCQkJCQkgICBpbnQgKm1heF9l cnJvciwKLQkJCQkJICAgc3RydWN0IHRpbWV2YWwgKnZibGFua190aW1lLAotCQkJCQkgICBib29s IGluX3ZibGFua19pcnEpCi17Ci0Jc3RydWN0IHRpbWV2YWwgdHZfZXRpbWU7Ci0Ja3RpbWVfdCBz dGltZSwgZXRpbWU7Ci0JYm9vbCB2Ymxfc3RhdHVzOwotCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsK LQljb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKLQlzdHJ1Y3QgZHJtX3ZibGFu a19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07Ci0JaW50IHZwb3MsIGhwb3MsIGk7 Ci0JaW50IGRlbHRhX25zLCBkdXJhdGlvbl9uczsKLQotCWlmICghZHJtX2NvcmVfY2hlY2tfZmVh dHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JY3J0YyA9IGRy bV9jcnRjX2Zyb21faW5kZXgoZGV2LCBwaXBlKTsKLQotCWlmIChwaXBlID49IGRldi0+bnVtX2Ny dGNzIHx8ICFjcnRjKSB7Ci0JCURSTV9FUlJPUigiSW52YWxpZCBjcnRjICV1XG4iLCBwaXBlKTsK LQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qIFNjYW5vdXQgcG9zaXRpb24gcXVlcnkgbm90IHN1 cHBvcnRlZD8gU2hvdWxkIG5vdCBoYXBwZW4uICovCi0JaWYgKCFkZXYtPmRyaXZlci0+Z2V0X3Nj YW5vdXRfcG9zaXRpb24pIHsKLQkJRFJNX0VSUk9SKCJDYWxsZWQgZnJvbSBkcml2ZXIgdy9vIGdl dF9zY2Fub3V0X3Bvc2l0aW9uKCkhP1xuIik7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlpZiAo ZHJtX2Rydl91c2VzX2F0b21pY19tb2Rlc2V0KGRldikpCi0JCW1vZGUgPSAmdmJsYW5rLT5od21v ZGU7Ci0JZWxzZQotCQltb2RlID0gJmNydGMtPmh3bW9kZTsKLQotCS8qIElmIG1vZGUgdGltaW5n IHVuZGVmaW5lZCwganVzdCByZXR1cm4gYXMgbm8tb3A6Ci0JICogSGFwcGVucyBkdXJpbmcgaW5p dGlhbCBtb2Rlc2V0dGluZyBvZiBhIGNydGMuCi0JICovCi0JaWYgKG1vZGUtPmNydGNfY2xvY2sg PT0gMCkgewotCQlEUk1fREVCVUcoImNydGMgJXU6IE5vb3AgZHVlIHRvIHVuaW5pdGlhbGl6ZWQg bW9kZS5cbiIsIHBpcGUpOwotCQlXQVJOX09OX09OQ0UoZHJtX2Rydl91c2VzX2F0b21pY19tb2Rl c2V0KGRldikpOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKiBHZXQgY3VycmVudCBzY2Fu b3V0IHBvc2l0aW9uIHdpdGggc3lzdGVtIHRpbWVzdGFtcC4KLQkgKiBSZXBlYXQgcXVlcnkgdXAg dG8gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTIHRpbWVzCi0JICogaWYgc2luZ2xlIHF1ZXJ5IHRh a2VzIGxvbmdlciB0aGFuIG1heF9lcnJvciBuYW5vc2Vjb25kcy4KLQkgKgotCSAqIFRoaXMgZ3Vh cmFudGVlcyBhIHRpZ2h0IGJvdW5kIG9uIG1heGltdW0gZXJyb3IgaWYKLQkgKiBjb2RlIGdldHMg cHJlZW1wdGVkIG9yIGRlbGF5ZWQgZm9yIHNvbWUgcmVhc29uLgotCSAqLwotCWZvciAoaSA9IDA7 IGkgPCBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVM7IGkrKykgewotCQkvKgotCQkgKiBHZXQgdmVy dGljYWwgYW5kIGhvcml6b250YWwgc2Nhbm91dCBwb3NpdGlvbiB2cG9zLCBocG9zLAotCQkgKiBh bmQgYm91bmRpbmcgdGltZXN0YW1wcyBzdGltZSwgZXRpbWUsIHByZS9wb3N0IHF1ZXJ5LgotCQkg Ki8KLQkJdmJsX3N0YXR1cyA9IGRldi0+ZHJpdmVyLT5nZXRfc2Nhbm91dF9wb3NpdGlvbihkZXYs IHBpcGUsCi0JCQkJCQkJICAgICAgIGluX3ZibGFua19pcnEsCi0JCQkJCQkJICAgICAgICZ2cG9z LCAmaHBvcywKLQkJCQkJCQkgICAgICAgJnN0aW1lLCAmZXRpbWUsCi0JCQkJCQkJICAgICAgIG1v ZGUpOwotCi0JCS8qIFJldHVybiBhcyBuby1vcCBpZiBzY2Fub3V0IHF1ZXJ5IHVuc3VwcG9ydGVk IG9yIGZhaWxlZC4gKi8KLQkJaWYgKCF2Ymxfc3RhdHVzKSB7Ci0JCQlEUk1fREVCVUcoImNydGMg JXUgOiBzY2Fub3V0cG9zIHF1ZXJ5IGZhaWxlZC5cbiIsCi0JCQkJICBwaXBlKTsKLQkJCXJldHVy biBmYWxzZTsKLQkJfQotCi0JCS8qIENvbXB1dGUgdW5jZXJ0YWludHkgaW4gdGltZXN0YW1wIG9m IHNjYW5vdXQgcG9zaXRpb24gcXVlcnkuICovCi0JCWR1cmF0aW9uX25zID0ga3RpbWVfdG9fbnMo ZXRpbWUpIC0ga3RpbWVfdG9fbnMoc3RpbWUpOwotCi0JCS8qIEFjY2VwdCByZXN1bHQgd2l0aCA8 ICBtYXhfZXJyb3IgbnNlY3MgdGltaW5nIHVuY2VydGFpbnR5LiAqLwotCQlpZiAoZHVyYXRpb25f bnMgPD0gKm1heF9lcnJvcikKLQkJCWJyZWFrOwotCX0KLQotCS8qIE5vaXN5IHN5c3RlbSB0aW1p bmc/ICovCi0JaWYgKGkgPT0gRFJNX1RJTUVTVEFNUF9NQVhSRVRSSUVTKSB7Ci0JCURSTV9ERUJV RygiY3J0YyAldTogTm9pc3kgdGltZXN0YW1wICVkIHVzID4gJWQgdXMgWyVkIHJlcHNdLlxuIiwK LQkJCSAgcGlwZSwgZHVyYXRpb25fbnMvMTAwMCwgKm1heF9lcnJvci8xMDAwLCBpKTsKLQl9Ci0K LQkvKiBSZXR1cm4gdXBwZXIgYm91bmQgb2YgdGltZXN0YW1wIHByZWNpc2lvbiBlcnJvci4gKi8K LQkqbWF4X2Vycm9yID0gZHVyYXRpb25fbnM7Ci0KLQkvKiBDb252ZXJ0IHNjYW5vdXQgcG9zaXRp b24gaW50byBlbGFwc2VkIHRpbWUgYXQgcmF3X3RpbWUgcXVlcnkKLQkgKiBzaW5jZSBzdGFydCBv ZiBzY2Fub3V0IGF0IGZpcnN0IGRpc3BsYXkgc2NhbmxpbmUuIGRlbHRhX25zCi0JICogY2FuIGJl IG5lZ2F0aXZlIGlmIHN0YXJ0IG9mIHNjYW5vdXQgaGFzbid0IGhhcHBlbmVkIHlldC4KLQkgKi8K LQlkZWx0YV9ucyA9IGRpdl9zNjQoMTAwMDAwMExMICogKHZwb3MgKiBtb2RlLT5jcnRjX2h0b3Rh bCArIGhwb3MpLAotCQkJICAgbW9kZS0+Y3J0Y19jbG9jayk7Ci0KLQlpZiAoIWRybV90aW1lc3Rh bXBfbW9ub3RvbmljKQotCQlldGltZSA9IGt0aW1lX21vbm9fdG9fcmVhbChldGltZSk7Ci0KLQkv KiBzYXZlIHRoaXMgb25seSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzICovCi0JdHZfZXRpbWUgPSBr dGltZV90b190aW1ldmFsKGV0aW1lKTsKLQkvKiBTdWJ0cmFjdCB0aW1lIGRlbHRhIGZyb20gcmF3 IHRpbWVzdGFtcCB0byBnZXQgZmluYWwKLQkgKiB2YmxhbmtfdGltZSB0aW1lc3RhbXAgZm9yIGVu ZCBvZiB2YmxhbmsuCi0JICovCi0JZXRpbWUgPSBrdGltZV9zdWJfbnMoZXRpbWUsIGRlbHRhX25z KTsKLQkqdmJsYW5rX3RpbWUgPSBrdGltZV90b190aW1ldmFsKGV0aW1lKTsKLQotCURSTV9ERUJV R19WQkwoImNydGMgJXUgOiB2IHAoJWQsJWQpQCAlbGQuJWxkIC0+ICVsZC4lbGQgW2UgJWQgdXMs ICVkIHJlcF1cbiIsCi0JCSAgICAgIHBpcGUsIGhwb3MsIHZwb3MsCi0JCSAgICAgIChsb25nKXR2 X2V0aW1lLnR2X3NlYywgKGxvbmcpdHZfZXRpbWUudHZfdXNlYywKLQkJICAgICAgKGxvbmcpdmJs YW5rX3RpbWUtPnR2X3NlYywgKGxvbmcpdmJsYW5rX3RpbWUtPnR2X3VzZWMsCi0JCSAgICAgIGR1 cmF0aW9uX25zLzEwMDAsIGkpOwotCi0JcmV0dXJuIHRydWU7Ci19Ci1FWFBPUlRfU1lNQk9MKGRy bV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3MpOwotCi1zdGF0aWMgc3RydWN0IHRp bWV2YWwgZ2V0X2RybV90aW1lc3RhbXAodm9pZCkKLXsKLQlrdGltZV90IG5vdzsKLQotCW5vdyA9 IGRybV90aW1lc3RhbXBfbW9ub3RvbmljID8ga3RpbWVfZ2V0KCkgOiBrdGltZV9nZXRfcmVhbCgp OwotCXJldHVybiBrdGltZV90b190aW1ldmFsKG5vdyk7Ci19Ci0KLS8qKgotICogZHJtX2dldF9s YXN0X3ZibHRpbWVzdGFtcCAtIHJldHJpZXZlIHJhdyB0aW1lc3RhbXAgZm9yIHRoZSBtb3N0IHJl Y2VudAotICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZibGFuayBpbnRlcnZhbAotICog QGRldjogRFJNIGRldmljZQotICogQHBpcGU6IGluZGV4IG9mIENSVEMgd2hvc2UgdmJsYW5rIHRp bWVzdGFtcCB0byByZXRyaWV2ZQotICogQHR2Ymxhbms6IFBvaW50ZXIgdG8gdGFyZ2V0IHN0cnVj dCB0aW1ldmFsIHdoaWNoIHNob3VsZCByZWNlaXZlIHRoZSB0aW1lc3RhbXAKLSAqIEBpbl92Ymxh bmtfaXJxOgotICogICAgIFRydWUgd2hlbiBjYWxsZWQgZnJvbSBkcm1fY3J0Y19oYW5kbGVfdmJs YW5rKCkuICBTb21lIGRyaXZlcnMKLSAqICAgICBuZWVkIHRvIGFwcGx5IHNvbWUgd29ya2Fyb3Vu ZHMgZm9yIGdwdS1zcGVjaWZpYyB2YmxhbmsgaXJxIHF1aXJrcwotICogICAgIGlmIGZsYWcgaXMg c2V0LgotICoKLSAqIEZldGNoZXMgdGhlIHN5c3RlbSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0 byB0aGUgdGltZSBvZiB0aGUgbW9zdCByZWNlbnQKLSAqIHZibGFuayBpbnRlcnZhbCBvbiBzcGVj aWZpZWQgQ1JUQy4gTWF5IGNhbGwgaW50byBrbXMtZHJpdmVyIHRvCi0gKiBjb21wdXRlIHRoZSB0 aW1lc3RhbXAgd2l0aCBhIGhpZ2gtcHJlY2lzaW9uIEdQVSBzcGVjaWZpYyBtZXRob2QuCi0gKgot ICogUmV0dXJucyB6ZXJvIGlmIHRpbWVzdGFtcCBvcmlnaW5hdGVzIGZyb20gdW5jb3JyZWN0ZWQg ZG9fZ2V0dGltZW9mZGF5KCkKLSAqIGNhbGwsIGkuZS4sIGl0IGlzbid0IHZlcnkgcHJlY2lzZWx5 IGxvY2tlZCB0byB0aGUgdHJ1ZSB2YmxhbmsuCi0gKgotICogUmV0dXJuczoKLSAqIFRydWUgaWYg dGltZXN0YW1wIGlzIGNvbnNpZGVyZWQgdG8gYmUgdmVyeSBwcmVjaXNlLCBmYWxzZSBvdGhlcndp c2UuCi0gKi8KLXN0YXRpYyBib29sCi1kcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wKHN0cnVjdCBk cm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlLAotCQkJICBzdHJ1Y3QgdGltZXZhbCAq dHZibGFuaywgYm9vbCBpbl92YmxhbmtfaXJxKQotewotCWJvb2wgcmV0ID0gZmFsc2U7Ci0KLQkv KiBEZWZpbmUgcmVxdWVzdGVkIG1heGltdW0gZXJyb3Igb24gdGltZXN0YW1wcyAobmFub3NlY29u ZHMpLiAqLwotCWludCBtYXhfZXJyb3IgPSAoaW50KSBkcm1fdGltZXN0YW1wX3ByZWNpc2lvbiAq IDEwMDA7Ci0KLQkvKiBRdWVyeSBkcml2ZXIgaWYgcG9zc2libGUgYW5kIHByZWNpc2lvbiB0aW1l c3RhbXBpbmcgZW5hYmxlZC4gKi8KLQlpZiAoZGV2LT5kcml2ZXItPmdldF92YmxhbmtfdGltZXN0 YW1wICYmIChtYXhfZXJyb3IgPiAwKSkKLQkJcmV0ID0gZGV2LT5kcml2ZXItPmdldF92Ymxhbmtf dGltZXN0YW1wKGRldiwgcGlwZSwgJm1heF9lcnJvciwKLQkJCQkJCQl0dmJsYW5rLCBpbl92Ymxh bmtfaXJxKTsKLQotCS8qIEdQVSBoaWdoIHByZWNpc2lvbiB0aW1lc3RhbXAgcXVlcnkgdW5zdXBw b3J0ZWQgb3IgZmFpbGVkLgotCSAqIFJldHVybiBjdXJyZW50IG1vbm90b25pYy9nZXR0aW1lb2Zk YXkgdGltZXN0YW1wIGFzIGJlc3QgZXN0aW1hdGUuCi0JICovCi0JaWYgKCFyZXQpCi0JCSp0dmJs YW5rID0gZ2V0X2RybV90aW1lc3RhbXAoKTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLS8qKgotICog ZHJtX2NydGNfdmJsYW5rX2NvdW50IC0gcmV0cmlldmUgImNvb2tlZCIgdmJsYW5rIGNvdW50ZXIg dmFsdWUKLSAqIEBjcnRjOiB3aGljaCBjb3VudGVyIHRvIHJldHJpZXZlCi0gKgotICogRmV0Y2hl cyB0aGUgImNvb2tlZCIgdmJsYW5rIGNvdW50IHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGUgbnVt YmVyIG9mCi0gKiB2YmxhbmsgZXZlbnRzIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIGJvb3RlZCwgaW5j bHVkaW5nIGxvc3QgZXZlbnRzIGR1ZSB0bwotICogbW9kZXNldHRpbmcgYWN0aXZpdHkuCi0gKgot ICogUmV0dXJuczoKLSAqIFRoZSBzb2Z0d2FyZSB2YmxhbmsgY291bnRlci4KLSAqLwotdTMyIGRy bV9jcnRjX3ZibGFua19jb3VudChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0JcmV0dXJuIGRy bV92YmxhbmtfY291bnQoY3J0Yy0+ZGV2LCBkcm1fY3J0Y19pbmRleChjcnRjKSk7Ci19Ci1FWFBP UlRfU1lNQk9MKGRybV9jcnRjX3ZibGFua19jb3VudCk7Ci0KLS8qKgotICogZHJtX3ZibGFua19j b3VudF9hbmRfdGltZSAtIHJldHJpZXZlICJjb29rZWQiIHZibGFuayBjb3VudGVyIHZhbHVlIGFu ZCB0aGUKLSAqICAgICBzeXN0ZW0gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCB2Ymxh bmsgY291bnRlciB2YWx1ZS4KLSAqIEBkZXY6IERSTSBkZXZpY2UKLSAqIEBwaXBlOiBpbmRleCBv ZiBDUlRDIHdob3NlIGNvdW50ZXIgdG8gcmV0cmlldmUKLSAqIEB2Ymxhbmt0aW1lOiBQb2ludGVy IHRvIHN0cnVjdCB0aW1ldmFsIHRvIHJlY2VpdmUgdGhlIHZibGFuayB0aW1lc3RhbXAuCi0gKgot ICogRmV0Y2hlcyB0aGUgImNvb2tlZCIgdmJsYW5rIGNvdW50IHZhbHVlIHRoYXQgcmVwcmVzZW50 cyB0aGUgbnVtYmVyIG9mCi0gKiB2YmxhbmsgZXZlbnRzIHNpbmNlIHRoZSBzeXN0ZW0gd2FzIGJv b3RlZCwgaW5jbHVkaW5nIGxvc3QgZXZlbnRzIGR1ZSB0bwotICogbW9kZXNldHRpbmcgYWN0aXZp dHkuIFJldHVybnMgY29ycmVzcG9uZGluZyBzeXN0ZW0gdGltZXN0YW1wIG9mIHRoZSB0aW1lCi0g KiBvZiB0aGUgdmJsYW5rIGludGVydmFsIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQg dmJsYW5rIGNvdW50ZXIgdmFsdWUuCi0gKgotICogVGhpcyBpcyB0aGUgbGVnYWN5IHZlcnNpb24g b2YgZHJtX2NydGNfdmJsYW5rX2NvdW50X2FuZF90aW1lKCkuCi0gKi8KLXN0YXRpYyB1MzIgZHJt X3ZibGFua19jb3VudF9hbmRfdGltZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBp bnQgcGlwZSwKLQkJCQkgICAgIHN0cnVjdCB0aW1ldmFsICp2Ymxhbmt0aW1lKQotewotCXN0cnVj dCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFua1twaXBlXTsKLQl1MzIgdmJs YW5rX2NvdW50OwotCXVuc2lnbmVkIGludCBzZXE7Ci0KLQlpZiAoV0FSTl9PTihwaXBlID49IGRl di0+bnVtX2NydGNzKSkgewotCQkqdmJsYW5rdGltZSA9IChzdHJ1Y3QgdGltZXZhbCkgeyAwIH07 Ci0JCXJldHVybiAwOwotCX0KLQotCWRvIHsKLQkJc2VxID0gcmVhZF9zZXFiZWdpbigmdmJsYW5r LT5zZXFsb2NrKTsKLQkJdmJsYW5rX2NvdW50ID0gdmJsYW5rLT5jb3VudDsKLQkJKnZibGFua3Rp bWUgPSB2YmxhbmstPnRpbWU7Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmdmJsYW5rLT5zZXFs b2NrLCBzZXEpKTsKLQotCXJldHVybiB2YmxhbmtfY291bnQ7Ci19Ci0KLS8qKgotICogZHJtX2Ny dGNfdmJsYW5rX2NvdW50X2FuZF90aW1lIC0gcmV0cmlldmUgImNvb2tlZCIgdmJsYW5rIGNvdW50 ZXIgdmFsdWUKLSAqICAgICBhbmQgdGhlIHN5c3RlbSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0 byB0aGF0IHZibGFuayBjb3VudGVyIHZhbHVlCi0gKiBAY3J0Yzogd2hpY2ggY291bnRlciB0byBy ZXRyaWV2ZQotICogQHZibGFua3RpbWU6IFBvaW50ZXIgdG8gc3RydWN0IHRpbWV2YWwgdG8gcmVj ZWl2ZSB0aGUgdmJsYW5rIHRpbWVzdGFtcC4KLSAqCi0gKiBGZXRjaGVzIHRoZSAiY29va2VkIiB2 YmxhbmsgY291bnQgdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YKLSAqIHZibGFu ayBldmVudHMgc2luY2UgdGhlIHN5c3RlbSB3YXMgYm9vdGVkLCBpbmNsdWRpbmcgbG9zdCBldmVu dHMgZHVlIHRvCi0gKiBtb2Rlc2V0dGluZyBhY3Rpdml0eS4gUmV0dXJucyBjb3JyZXNwb25kaW5n IHN5c3RlbSB0aW1lc3RhbXAgb2YgdGhlIHRpbWUKLSAqIG9mIHRoZSB2YmxhbmsgaW50ZXJ2YWwg dGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCB2YmxhbmsgY291bnRlciB2YWx1ZS4KLSAq LwotdTMyIGRybV9jcnRjX3ZibGFua19jb3VudF9hbmRfdGltZShzdHJ1Y3QgZHJtX2NydGMgKmNy dGMsCi0JCQkJICAgc3RydWN0IHRpbWV2YWwgKnZibGFua3RpbWUpCi17Ci0JcmV0dXJuIGRybV92 YmxhbmtfY291bnRfYW5kX3RpbWUoY3J0Yy0+ZGV2LCBkcm1fY3J0Y19pbmRleChjcnRjKSwKLQkJ CQkJIHZibGFua3RpbWUpOwotfQotRVhQT1JUX1NZTUJPTChkcm1fY3J0Y192YmxhbmtfY291bnRf YW5kX3RpbWUpOwotCi1zdGF0aWMgdm9pZCBzZW5kX3ZibGFua19ldmVudChzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAotCQlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplLAotCQl1bnNp Z25lZCBsb25nIHNlcSwgc3RydWN0IHRpbWV2YWwgKm5vdykKLXsKLQllLT5ldmVudC5zZXF1ZW5j ZSA9IHNlcTsKLQllLT5ldmVudC50dl9zZWMgPSBub3ctPnR2X3NlYzsKLQllLT5ldmVudC50dl91 c2VjID0gbm93LT50dl91c2VjOwotCi0JdHJhY2VfZHJtX3ZibGFua19ldmVudF9kZWxpdmVyZWQo ZS0+YmFzZS5maWxlX3ByaXYsIGUtPnBpcGUsCi0JCQkJCSBlLT5ldmVudC5zZXF1ZW5jZSk7Ci0K LQlkcm1fc2VuZF9ldmVudF9sb2NrZWQoZGV2LCAmZS0+YmFzZSk7Ci19Ci0KLS8qKgotICogZHJt X2NydGNfYXJtX3ZibGFua19ldmVudCAtIGFybSB2YmxhbmsgZXZlbnQgYWZ0ZXIgcGFnZWZsaXAK LSAqIEBjcnRjOiB0aGUgc291cmNlIENSVEMgb2YgdGhlIHZibGFuayBldmVudAotICogQGU6IHRo ZSBldmVudCB0byBzZW5kCi0gKgotICogQSBsb3Qgb2YgZHJpdmVycyBuZWVkIHRvIGdlbmVyYXRl IHZibGFuayBldmVudHMgZm9yIHRoZSB2ZXJ5IG5leHQgdmJsYW5rCi0gKiBpbnRlcnJ1cHQuIEZv ciBleGFtcGxlIHdoZW4gdGhlIHBhZ2UgZmxpcCBpbnRlcnJ1cHQgaGFwcGVucyB3aGVuIHRoZSBw YWdlCi0gKiBmbGlwIGdldHMgYXJtZWQsIGJ1dCBub3Qgd2hlbiBpdCBhY3R1YWxseSBleGVjdXRl cyB3aXRoaW4gdGhlIG5leHQgdmJsYW5rCi0gKiBwZXJpb2QuIFRoaXMgaGVscGVyIGZ1bmN0aW9u IGltcGxlbWVudHMgZXhhY3RseSB0aGUgcmVxdWlyZWQgdmJsYW5rIGFybWluZwotICogYmVoYXZp b3VyLgotICoKLSAqIE5PVEU6IERyaXZlcnMgdXNpbmcgdGhpcyB0byBzZW5kIG91dCB0aGUgJmRy bV9jcnRjX3N0YXRlLmV2ZW50IGFzIHBhcnQgb2YgYW4KLSAqIGF0b21pYyBjb21taXQgbXVzdCBl bnN1cmUgdGhhdCB0aGUgbmV4dCB2YmxhbmsgaGFwcGVucyBhdCBleGFjdGx5IHRoZSBzYW1lCi0g KiB0aW1lIGFzIHRoZSBhdG9taWMgY29tbWl0IGlzIGNvbW1pdHRlZCB0byB0aGUgaGFyZHdhcmUu IFRoaXMgZnVuY3Rpb24gaXRzZWxmCi0gKiBkb2VzICoqbm90KiogcHJvdGVjdCBhZ2FpbiB0aGUg bmV4dCB2YmxhbmsgaW50ZXJydXB0IHJhY2luZyB3aXRoIGVpdGhlciB0aGlzCi0gKiBmdW5jdGlv biBjYWxsIG9yIHRoZSBhdG9taWMgY29tbWl0IG9wZXJhdGlvbi4gQSBwb3NzaWJsZSBzZXF1ZW5j ZSBjb3VsZCBiZToKLSAqCi0gKiAxLiBEcml2ZXIgY29tbWl0cyBuZXcgaGFyZHdhcmUgc3RhdGUg aW50byB2Ymxhbmstc3luY2hyb25pemVkIHJlZ2lzdGVycy4KLSAqIDIuIEEgdmJsYW5rIGhhcHBl bnMsIGNvbW1pdHRpbmcgdGhlIGhhcmR3YXJlIHN0YXRlLiBBbHNvIHRoZSBjb3JyZXNwb25kaW5n Ci0gKiAgICB2YmxhbmsgaW50ZXJydXB0IGlzIGZpcmVkIG9mZiBhbmQgZnVsbHkgcHJvY2Vzc2Vk IGJ5IHRoZSBpbnRlcnJ1cHQKLSAqICAgIGhhbmRsZXIuCi0gKiAzLiBUaGUgYXRvbWljIGNvbW1p dCBvcGVyYXRpb24gcHJvY2VlZHMgdG8gY2FsbCBkcm1fY3J0Y19hcm1fdmJsYW5rX2V2ZW50KCku Ci0gKiA0LiBUaGUgZXZlbnQgaXMgb25seSBzZW5kIG91dCBmb3IgdGhlIG5leHQgdmJsYW5rLCB3 aGljaCBpcyB3cm9uZy4KLSAqCi0gKiBBbiBlcXVpdmFsZW50IHJhY2UgY2FuIGhhcHBlbiB3aGVu IHRoZSBkcml2ZXIgY2FsbHMKLSAqIGRybV9jcnRjX2FybV92YmxhbmtfZXZlbnQoKSBiZWZvcmUg d3JpdGluZyBvdXQgdGhlIG5ldyBoYXJkd2FyZSBzdGF0ZS4KLSAqCi0gKiBUaGUgb25seSB3YXkg dG8gbWFrZSB0aGlzIHdvcmsgc2FmZWx5IGlzIHRvIHByZXZlbnQgdGhlIHZibGFuayBmcm9tIGZp cmluZwotICogKGFuZCB0aGUgaGFyZHdhcmUgZnJvbSBjb21taXR0aW5nIGFueXRoaW5nIGVsc2Up IHVudGlsIHRoZSBlbnRpcmUgYXRvbWljCi0gKiBjb21taXQgc2VxdWVuY2UgaGFzIHJ1biB0byBj b21wbGV0aW9uLiBJZiB0aGUgaGFyZHdhcmUgZG9lcyBub3QgaGF2ZSBzdWNoIGEKLSAqIGZlYXR1 cmUgKGUuZy4gdXNpbmcgYSAiZ28iIGJpdCksIHRoZW4gaXQgaXMgdW5zYWZlIHRvIHVzZSB0aGlz IGZ1bmN0aW9ucy4KLSAqIEluc3RlYWQgZHJpdmVycyBuZWVkIHRvIG1hbnVhbGx5IHNlbmQgb3V0 IHRoZSBldmVudCBmcm9tIHRoZWlyIGludGVycnVwdAotICogaGFuZGxlciBieSBjYWxsaW5nIGRy bV9jcnRjX3NlbmRfdmJsYW5rX2V2ZW50KCkgYW5kIG1ha2Ugc3VyZSB0aGF0IHRoZXJlJ3Mgbm8K LSAqIHBvc3NpYmxlIHJhY2Ugd2l0aCB0aGUgaGFyZHdhcmUgY29tbWl0dGluZyB0aGUgYXRvbWlj IHVwZGF0ZS4KLSAqCi0gKiBDYWxsZXIgbXVzdCBob2xkIGV2ZW50IGxvY2suIENhbGxlciBtdXN0 IGFsc28gaG9sZCBhIHZibGFuayByZWZlcmVuY2UgZm9yCi0gKiB0aGUgZXZlbnQgQGUsIHdoaWNo IHdpbGwgYmUgZHJvcHBlZCB3aGVuIHRoZSBuZXh0IHZibGFuayBhcnJpdmVzLgotICovCi12b2lk IGRybV9jcnRjX2FybV92YmxhbmtfZXZlbnQoc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkJICAg ICAgIHN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmUpCi17Ci0Jc3RydWN0IGRybV9k ZXZpY2UgKmRldiA9IGNydGMtPmRldjsKLQl1bnNpZ25lZCBpbnQgcGlwZSA9IGRybV9jcnRjX2lu ZGV4KGNydGMpOwotCi0JYXNzZXJ0X3NwaW5fbG9ja2VkKCZkZXYtPmV2ZW50X2xvY2spOwotCi0J ZS0+cGlwZSA9IHBpcGU7Ci0JZS0+ZXZlbnQuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50KGRl diwgcGlwZSk7Ci0JZS0+ZXZlbnQuY3J0Y19pZCA9IGNydGMtPmJhc2UuaWQ7Ci0JbGlzdF9hZGRf dGFpbCgmZS0+YmFzZS5saW5rLCAmZGV2LT52YmxhbmtfZXZlbnRfbGlzdCk7Ci19Ci1FWFBPUlRf U1lNQk9MKGRybV9jcnRjX2FybV92YmxhbmtfZXZlbnQpOwotCi0vKioKLSAqIGRybV9jcnRjX3Nl bmRfdmJsYW5rX2V2ZW50IC0gaGVscGVyIHRvIHNlbmQgdmJsYW5rIGV2ZW50IGFmdGVyIHBhZ2Vm bGlwCi0gKiBAY3J0YzogdGhlIHNvdXJjZSBDUlRDIG9mIHRoZSB2YmxhbmsgZXZlbnQKLSAqIEBl OiB0aGUgZXZlbnQgdG8gc2VuZAotICoKLSAqIFVwZGF0ZXMgc2VxdWVuY2UgIyBhbmQgdGltZXN0 YW1wIG9uIGV2ZW50IGZvciB0aGUgbW9zdCByZWNlbnRseSBwcm9jZXNzZWQKLSAqIHZibGFuaywg YW5kIHNlbmRzIGl0IHRvIHVzZXJzcGFjZS4gIENhbGxlciBtdXN0IGhvbGQgZXZlbnQgbG9jay4K LSAqCi0gKiBTZWUgZHJtX2NydGNfYXJtX3ZibGFua19ldmVudCgpIGZvciBhIGhlbHBlciB3aGlj aCBjYW4gYmUgdXNlZCBpbiBjZXJ0YWluCi0gKiBzaXR1YXRpb24sIGVzcGVjaWFsbHkgdG8gc2Vu ZCBvdXQgZXZlbnRzIGZvciBhdG9taWMgY29tbWl0IG9wZXJhdGlvbnMuCi0gKi8KLXZvaWQgZHJt X2NydGNfc2VuZF92YmxhbmtfZXZlbnQoc3RydWN0IGRybV9jcnRjICpjcnRjLAotCQkJCXN0cnVj dCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmUpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGNydGMtPmRldjsKLQl1bnNpZ25lZCBpbnQgc2VxLCBwaXBlID0gZHJtX2NydGNfaW5kZXgo Y3J0Yyk7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCi0JaWYgKGRldi0+bnVtX2NydGNzID4gMCkg ewotCQlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgcGlwZSwgJm5vdyk7Ci0J fSBlbHNlIHsKLQkJc2VxID0gMDsKLQotCQlub3cgPSBnZXRfZHJtX3RpbWVzdGFtcCgpOwotCX0K LQllLT5waXBlID0gcGlwZTsKLQllLT5ldmVudC5jcnRjX2lkID0gY3J0Yy0+YmFzZS5pZDsKLQlz ZW5kX3ZibGFua19ldmVudChkZXYsIGUsIHNlcSwgJm5vdyk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRy bV9jcnRjX3NlbmRfdmJsYW5rX2V2ZW50KTsKLQotc3RhdGljIGludCBfX2VuYWJsZV92Ymxhbmso c3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCi17Ci0JaWYgKGRybV9j b3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsKLQkJc3RydWN0IGRybV9j cnRjICpjcnRjID0gZHJtX2NydGNfZnJvbV9pbmRleChkZXYsIHBpcGUpOwotCi0JCWlmIChjcnRj LT5mdW5jcy0+ZW5hYmxlX3ZibGFuaykKLQkJCXJldHVybiBjcnRjLT5mdW5jcy0+ZW5hYmxlX3Zi bGFuayhjcnRjKTsKLQl9Ci0KLQlyZXR1cm4gZGV2LT5kcml2ZXItPmVuYWJsZV92YmxhbmsoZGV2 LCBwaXBlKTsKLX0KLQotLyoqCi0gKiBkcm1fdmJsYW5rX2VuYWJsZSAtIGVuYWJsZSB0aGUgdmJs YW5rIGludGVycnVwdCBvbiBhIENSVEMKLSAqIEBkZXY6IERSTSBkZXZpY2UKLSAqIEBwaXBlOiBD UlRDIGluZGV4Ci0gKgotICogUmV0dXJuczoKLSAqIFplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0 aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGludCBkcm1fdmJsYW5rX2Vu YWJsZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKLXsKLQlzdHJ1 Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07Ci0JaW50IHJl dCA9IDA7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+dmJsX2xvY2spOwotCi0Jc3Bpbl9s b2NrKCZkZXYtPnZibGFua190aW1lX2xvY2spOwotCi0JaWYgKCF2YmxhbmstPmVuYWJsZWQpIHsK LQkJLyoKLQkJICogRW5hYmxlIHZibGFuayBpcnFzIHVuZGVyIHZibGFua190aW1lX2xvY2sgcHJv dGVjdGlvbi4KLQkJICogQWxsIHZibGFuayBjb3VudCAmIHRpbWVzdGFtcCB1cGRhdGVzIGFyZSBo ZWxkIG9mZgotCQkgKiB1bnRpbCB3ZSBhcmUgZG9uZSByZWluaXRpYWxpemluZyBtYXN0ZXIgY291 bnRlciBhbmQKLQkJICogdGltZXN0YW1wcy4gRmlsdGVyY29kZSBpbiBkcm1faGFuZGxlX3ZibGFu aygpIHdpbGwKLQkJICogcHJldmVudCBkb3VibGUtYWNjb3VudGluZyBvZiBzYW1lIHZibGFuayBp bnRlcnZhbC4KLQkJICovCi0JCXJldCA9IF9fZW5hYmxlX3ZibGFuayhkZXYsIHBpcGUpOwotCQlE Uk1fREVCVUcoImVuYWJsaW5nIHZibGFuayBvbiBjcnRjICV1LCByZXQ6ICVkXG4iLCBwaXBlLCBy ZXQpOwotCQlpZiAocmV0KSB7Ci0JCQlhdG9taWNfZGVjKCZ2YmxhbmstPnJlZmNvdW50KTsKLQkJ fSBlbHNlIHsKLQkJCWRybV91cGRhdGVfdmJsYW5rX2NvdW50KGRldiwgcGlwZSwgMCk7Ci0JCQkv KiBkcm1fdXBkYXRlX3ZibGFua19jb3VudCgpIGluY2x1ZGVzIGEgd21iIHNvIHdlIGp1c3QKLQkJ CSAqIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbXBpbGVyIGVtaXRzIHRoZSB3cml0ZQotCQkJ ICogdG8gbWFyayB0aGUgdmJsYW5rIGFzIGVuYWJsZWQgYWZ0ZXIgdGhlIGNhbGwKLQkJCSAqIHRv IGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkuCi0JCQkgKi8KLQkJCVdSSVRFX09OQ0UodmJsYW5r LT5lbmFibGVkLCB0cnVlKTsKLQkJfQotCX0KLQotCXNwaW5fdW5sb2NrKCZkZXYtPnZibGFua190 aW1lX2xvY2spOwotCi0JcmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBkcm1fdmJsYW5rX2dldCAt IGdldCBhIHJlZmVyZW5jZSBjb3VudCBvbiB2YmxhbmsgZXZlbnRzCi0gKiBAZGV2OiBEUk0gZGV2 aWNlCi0gKiBAcGlwZTogaW5kZXggb2YgQ1JUQyB0byBvd24KLSAqCi0gKiBBY3F1aXJlIGEgcmVm ZXJlbmNlIGNvdW50IG9uIHZibGFuayBldmVudHMgdG8gYXZvaWQgaGF2aW5nIHRoZW0gZGlzYWJs ZWQKLSAqIHdoaWxlIGluIHVzZS4KLSAqCi0gKiBUaGlzIGlzIHRoZSBsZWdhY3kgdmVyc2lvbiBv ZiBkcm1fY3J0Y192YmxhbmtfZ2V0KCkuCi0gKgotICogUmV0dXJuczoKLSAqIFplcm8gb24gc3Vj Y2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KLSAqLwotc3RhdGljIGlu dCBkcm1fdmJsYW5rX2dldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlw ZSkKLXsKLQlzdHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlw ZV07Ci0JdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKLQlpbnQgcmV0ID0gMDsKLQotCWlmICghZGV2 LT5udW1fY3J0Y3MpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JaWYgKFdBUk5fT04ocGlwZSA+PSBk ZXYtPm51bV9jcnRjcykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUo JmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKLQkvKiBHb2luZyBmcm9tIDAtPjEgbWVhbnMgd2Ug aGF2ZSB0byBlbmFibGUgaW50ZXJydXB0cyBhZ2FpbiAqLwotCWlmIChhdG9taWNfYWRkX3JldHVy bigxLCAmdmJsYW5rLT5yZWZjb3VudCkgPT0gMSkgewotCQlyZXQgPSBkcm1fdmJsYW5rX2VuYWJs ZShkZXYsIHBpcGUpOwotCX0gZWxzZSB7Ci0JCWlmICghdmJsYW5rLT5lbmFibGVkKSB7Ci0JCQlh dG9taWNfZGVjKCZ2YmxhbmstPnJlZmNvdW50KTsKLQkJCXJldCA9IC1FSU5WQUw7Ci0JCX0KLQl9 Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotCi0J cmV0dXJuIHJldDsKLX0KLQotLyoqCi0gKiBkcm1fY3J0Y192YmxhbmtfZ2V0IC0gZ2V0IGEgcmVm ZXJlbmNlIGNvdW50IG9uIHZibGFuayBldmVudHMKLSAqIEBjcnRjOiB3aGljaCBDUlRDIHRvIG93 bgotICoKLSAqIEFjcXVpcmUgYSByZWZlcmVuY2UgY291bnQgb24gdmJsYW5rIGV2ZW50cyB0byBh dm9pZCBoYXZpbmcgdGhlbSBkaXNhYmxlZAotICogd2hpbGUgaW4gdXNlLgotICoKLSAqIFJldHVy bnM6Ci0gKiBaZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1 cmUuCi0gKi8KLWludCBkcm1fY3J0Y192YmxhbmtfZ2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykK LXsKLQlyZXR1cm4gZHJtX3ZibGFua19nZXQoY3J0Yy0+ZGV2LCBkcm1fY3J0Y19pbmRleChjcnRj KSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9jcnRjX3ZibGFua19nZXQpOwotCi0vKioKLSAqIGRy bV92YmxhbmtfcHV0IC0gcmVsZWFzZSBvd25lcnNoaXAgb2YgdmJsYW5rIGV2ZW50cwotICogQGRl djogRFJNIGRldmljZQotICogQHBpcGU6IGluZGV4IG9mIENSVEMgdG8gcmVsZWFzZQotICoKLSAq IFJlbGVhc2Ugb3duZXJzaGlwIG9mIGEgZ2l2ZW4gdmJsYW5rIGNvdW50ZXIsIHR1cm5pbmcgb2Zm IGludGVycnVwdHMKLSAqIGlmIHBvc3NpYmxlLiBEaXNhYmxlIGludGVycnVwdHMgYWZ0ZXIgZHJt X3ZibGFua19vZmZkZWxheSBtaWxsaXNlY29uZHMuCi0gKgotICogVGhpcyBpcyB0aGUgbGVnYWN5 IHZlcnNpb24gb2YgZHJtX2NydGNfdmJsYW5rX3B1dCgpLgotICovCi1zdGF0aWMgdm9pZCBkcm1f dmJsYW5rX3B1dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKLXsK LQlzdHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07Ci0K LQlpZiAoV0FSTl9PTihwaXBlID49IGRldi0+bnVtX2NydGNzKSkKLQkJcmV0dXJuOwotCi0JaWYg KFdBUk5fT04oYXRvbWljX3JlYWQoJnZibGFuay0+cmVmY291bnQpID09IDApKQotCQlyZXR1cm47 Ci0KLQkvKiBMYXN0IHVzZXIgc2NoZWR1bGVzIGludGVycnVwdCBkaXNhYmxlICovCi0JaWYgKGF0 b21pY19kZWNfYW5kX3Rlc3QoJnZibGFuay0+cmVmY291bnQpKSB7Ci0JCWlmIChkcm1fdmJsYW5r X29mZmRlbGF5ID09IDApCi0JCQlyZXR1cm47Ci0JCWVsc2UgaWYgKGRybV92Ymxhbmtfb2ZmZGVs YXkgPCAwKQotCQkJdmJsYW5rX2Rpc2FibGVfZm4oKHVuc2lnbmVkIGxvbmcpdmJsYW5rKTsKLQkJ ZWxzZSBpZiAoIWRldi0+dmJsYW5rX2Rpc2FibGVfaW1tZWRpYXRlKQotCQkJbW9kX3RpbWVyKCZ2 YmxhbmstPmRpc2FibGVfdGltZXIsCi0JCQkJICBqaWZmaWVzICsgKChkcm1fdmJsYW5rX29mZmRl bGF5ICogSFopLzEwMDApKTsKLQl9Ci19Ci0KLS8qKgotICogZHJtX2NydGNfdmJsYW5rX3B1dCAt IGdpdmUgdXAgb3duZXJzaGlwIG9mIHZibGFuayBldmVudHMKLSAqIEBjcnRjOiB3aGljaCBjb3Vu dGVyIHRvIGdpdmUgdXAKLSAqCi0gKiBSZWxlYXNlIG93bmVyc2hpcCBvZiBhIGdpdmVuIHZibGFu ayBjb3VudGVyLCB0dXJuaW5nIG9mZiBpbnRlcnJ1cHRzCi0gKiBpZiBwb3NzaWJsZS4gRGlzYWJs ZSBpbnRlcnJ1cHRzIGFmdGVyIGRybV92Ymxhbmtfb2ZmZGVsYXkgbWlsbGlzZWNvbmRzLgotICov Ci12b2lkIGRybV9jcnRjX3ZibGFua19wdXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQotewotCWRy bV92YmxhbmtfcHV0KGNydGMtPmRldiwgZHJtX2NydGNfaW5kZXgoY3J0YykpOwotfQotRVhQT1JU X1NZTUJPTChkcm1fY3J0Y192YmxhbmtfcHV0KTsKLQotLyoqCi0gKiBkcm1fd2FpdF9vbmVfdmJs YW5rIC0gd2FpdCBmb3Igb25lIHZibGFuawotICogQGRldjogRFJNIGRldmljZQotICogQHBpcGU6 IENSVEMgaW5kZXgKLSAqCi0gKiBUaGlzIHdhaXRzIGZvciBvbmUgdmJsYW5rIHRvIHBhc3Mgb24g QHBpcGUsIHVzaW5nIHRoZSBpcnEgZHJpdmVyIGludGVyZmFjZXMuCi0gKiBJdCBpcyBhIGZhaWx1 cmUgdG8gY2FsbCB0aGlzIHdoZW4gdGhlIHZibGFuayBpcnEgZm9yIEBwaXBlIGlzIGRpc2FibGVk LCBlLmcuCi0gKiBkdWUgdG8gbGFjayBvZiBkcml2ZXIgc3VwcG9ydCBvciBiZWNhdXNlIHRoZSBj cnRjIGlzIG9mZi4KLSAqLwotdm9pZCBkcm1fd2FpdF9vbmVfdmJsYW5rKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQotewotCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMg KnZibGFuayA9ICZkZXYtPnZibGFua1twaXBlXTsKLQlpbnQgcmV0OwotCXUzMiBsYXN0OwotCi0J aWYgKFdBUk5fT04ocGlwZSA+PSBkZXYtPm51bV9jcnRjcykpCi0JCXJldHVybjsKLQotCXJldCA9 IGRybV92YmxhbmtfZ2V0KGRldiwgcGlwZSk7Ci0JaWYgKFdBUk4ocmV0LCAidmJsYW5rIG5vdCBh dmFpbGFibGUgb24gY3J0YyAlaSwgcmV0PSVpXG4iLCBwaXBlLCByZXQpKQotCQlyZXR1cm47Ci0K LQlsYXN0ID0gZHJtX3ZibGFua19jb3VudChkZXYsIHBpcGUpOwotCi0JcmV0ID0gd2FpdF9ldmVu dF90aW1lb3V0KHZibGFuay0+cXVldWUsCi0JCQkJIGxhc3QgIT0gZHJtX3ZibGFua19jb3VudChk ZXYsIHBpcGUpLAotCQkJCSBtc2Vjc190b19qaWZmaWVzKDEwMCkpOwotCi0JV0FSTihyZXQgPT0g MCwgInZibGFuayB3YWl0IHRpbWVkIG91dCBvbiBjcnRjICVpXG4iLCBwaXBlKTsKLQotCWRybV92 YmxhbmtfcHV0KGRldiwgcGlwZSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV93YWl0X29uZV92Ymxh bmspOwotCi0vKioKLSAqIGRybV9jcnRjX3dhaXRfb25lX3ZibGFuayAtIHdhaXQgZm9yIG9uZSB2 YmxhbmsKLSAqIEBjcnRjOiBEUk0gY3J0YwotICoKLSAqIFRoaXMgd2FpdHMgZm9yIG9uZSB2Ymxh bmsgdG8gcGFzcyBvbiBAY3J0YywgdXNpbmcgdGhlIGlycSBkcml2ZXIgaW50ZXJmYWNlcy4KLSAq IEl0IGlzIGEgZmFpbHVyZSB0byBjYWxsIHRoaXMgd2hlbiB0aGUgdmJsYW5rIGlycSBmb3IgQGNy dGMgaXMgZGlzYWJsZWQsIGUuZy4KLSAqIGR1ZSB0byBsYWNrIG9mIGRyaXZlciBzdXBwb3J0IG9y IGJlY2F1c2UgdGhlIGNydGMgaXMgb2ZmLgotICovCi12b2lkIGRybV9jcnRjX3dhaXRfb25lX3Zi bGFuayhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0JZHJtX3dhaXRfb25lX3ZibGFuayhjcnRj LT5kZXYsIGRybV9jcnRjX2luZGV4KGNydGMpKTsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2NydGNf d2FpdF9vbmVfdmJsYW5rKTsKLQotLyoqCi0gKiBkcm1fY3J0Y192Ymxhbmtfb2ZmIC0gZGlzYWJs ZSB2YmxhbmsgZXZlbnRzIG9uIGEgQ1JUQwotICogQGNydGM6IENSVEMgaW4gcXVlc3Rpb24KLSAq Ci0gKiBEcml2ZXJzIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBzaHV0IGRvd24gdGhlIHZibGFu ayBpbnRlcnJ1cHQgaGFuZGxpbmcgd2hlbgotICogZGlzYWJsaW5nIGEgY3J0Yy4gVGhpcyBmdW5j dGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxhdGVzdCB2YmxhbmsgZnJhbWUgY291bnQgaXMKLSAqIHN0 b3JlZCBzbyB0aGF0IGRybV92Ymxhbmtfb24gY2FuIHJlc3RvcmUgaXQgYWdhaW4uCi0gKgotICog RHJpdmVycyBtdXN0IHVzZSB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIGhhcmR3YXJlIHZibGFuayBj b3VudGVyIGNhbiBnZXQKLSAqIHJlc2V0LCBlLmcuIHdoZW4gc3VzcGVuZGluZy4KLSAqLwotdm9p ZCBkcm1fY3J0Y192Ymxhbmtfb2ZmKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXVuc2lnbmVkIGludCBwaXBlID0gZHJtX2Ny dGNfaW5kZXgoY3J0Yyk7Ci0Jc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+ dmJsYW5rW3BpcGVdOwotCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmUsICp0Owot CXN0cnVjdCB0aW1ldmFsIG5vdzsKLQl1bnNpZ25lZCBsb25nIGlycWZsYWdzOwotCXVuc2lnbmVk IGludCBzZXE7Ci0KLQlpZiAoV0FSTl9PTihwaXBlID49IGRldi0+bnVtX2NydGNzKSkKLQkJcmV0 dXJuOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxZmxhZ3MpOwot Ci0Jc3Bpbl9sb2NrKCZkZXYtPnZibF9sb2NrKTsKLQlEUk1fREVCVUdfVkJMKCJjcnRjICVkLCB2 YmxhbmsgZW5hYmxlZCAlZCwgaW5tb2Rlc2V0ICVkXG4iLAotCQkgICAgICBwaXBlLCB2Ymxhbmst PmVuYWJsZWQsIHZibGFuay0+aW5tb2Rlc2V0KTsKLQotCS8qIEF2b2lkIHJlZHVuZGFudCB2Ymxh bmsgZGlzYWJsZXMgd2l0aG91dCBwcmV2aW91cwotCSAqIGRybV9jcnRjX3ZibGFua19vbigpLiAq LwotCWlmIChkcm1fY29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX0FUT01JQykgfHwgIXZi bGFuay0+aW5tb2Rlc2V0KQotCQl2YmxhbmtfZGlzYWJsZV9hbmRfc2F2ZShkZXYsIHBpcGUpOwot Ci0Jd2FrZV91cCgmdmJsYW5rLT5xdWV1ZSk7Ci0KLQkvKgotCSAqIFByZXZlbnQgc3Vic2VxdWVu dCBkcm1fdmJsYW5rX2dldCgpIGZyb20gcmUtZW5hYmxpbmcKLQkgKiB0aGUgdmJsYW5rIGludGVy cnVwdCBieSBidW1waW5nIHRoZSByZWZjb3VudC4KLQkgKi8KLQlpZiAoIXZibGFuay0+aW5tb2Rl c2V0KSB7Ci0JCWF0b21pY19pbmMoJnZibGFuay0+cmVmY291bnQpOwotCQl2YmxhbmstPmlubW9k ZXNldCA9IDE7Ci0JfQotCXNwaW5fdW5sb2NrKCZkZXYtPnZibF9sb2NrKTsKLQotCS8qIFNlbmQg YW55IHF1ZXVlZCB2YmxhbmsgZXZlbnRzLCBsZXN0IHRoZSBuYXRpdmVzIGdyb3cgZGlzcXVpZXQg Ki8KLQlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgcGlwZSwgJm5vdyk7Ci0K LQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdCwgJmRldi0+dmJsYW5rX2V2ZW50X2xpc3Qs IGJhc2UubGluaykgewotCQlpZiAoZS0+cGlwZSAhPSBwaXBlKQotCQkJY29udGludWU7Ci0JCURS TV9ERUJVRygiU2VuZGluZyBwcmVtYXR1cmUgdmJsYW5rIGV2ZW50IG9uIGRpc2FibGU6ICIKLQkJ CSAgIndhbnRlZCAldSwgY3VycmVudCAldVxuIiwKLQkJCSAgZS0+ZXZlbnQuc2VxdWVuY2UsIHNl cSk7Ci0JCWxpc3RfZGVsKCZlLT5iYXNlLmxpbmspOwotCQlkcm1fdmJsYW5rX3B1dChkZXYsIHBp cGUpOwotCQlzZW5kX3ZibGFua19ldmVudChkZXYsIGUsIHNlcSwgJm5vdyk7Ci0JfQotCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxZmxhZ3MpOwotCi0JLyogV2ls bCBiZSByZXNldCBieSB0aGUgbW9kZXNldCBoZWxwZXJzIHdoZW4gcmUtZW5hYmxpbmcgdGhlIGNy dGMgYnkKLQkgKiBjYWxsaW5nIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMoKS4gKi8K LQl2YmxhbmstPmh3bW9kZS5jcnRjX2Nsb2NrID0gMDsKLX0KLUVYUE9SVF9TWU1CT0woZHJtX2Ny dGNfdmJsYW5rX29mZik7Ci0KLS8qKgotICogZHJtX2NydGNfdmJsYW5rX3Jlc2V0IC0gcmVzZXQg dmJsYW5rIHN0YXRlIHRvIG9mZiBvbiBhIENSVEMKLSAqIEBjcnRjOiBDUlRDIGluIHF1ZXN0aW9u Ci0gKgotICogRHJpdmVycyBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gcmVzZXQgdGhlIHZibGFu ayBzdGF0ZSB0byBvZmYgYXQgbG9hZCB0aW1lLgotICogRHJpdmVycyBzaG91bGQgdXNlIHRoaXMg dG9nZXRoZXIgd2l0aCB0aGUgZHJtX2NydGNfdmJsYW5rX29mZigpIGFuZAotICogZHJtX2NydGNf dmJsYW5rX29uKCkgZnVuY3Rpb25zLiBUaGUgZGlmZmVyZW5jZSBjb21wYXJlZCB0bwotICogZHJt X2NydGNfdmJsYW5rX29mZigpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2Vzbid0IHNhdmUgdGhl IHZibGFuayBjb3VudGVyCi0gKiBhbmQgaGVuY2UgZG9lc24ndCBuZWVkIHRvIGNhbGwgYW55IGRy aXZlciBob29rcy4KLSAqLwotdm9pZCBkcm1fY3J0Y192YmxhbmtfcmVzZXQoc3RydWN0IGRybV9j cnRjICpjcnRjKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0JdW5z aWduZWQgbG9uZyBpcnFmbGFnczsKLQl1bnNpZ25lZCBpbnQgcGlwZSA9IGRybV9jcnRjX2luZGV4 KGNydGMpOwotCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFua1tw aXBlXTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7Ci0J LyoKLQkgKiBQcmV2ZW50IHN1YnNlcXVlbnQgZHJtX3ZibGFua19nZXQoKSBmcm9tIGVuYWJsaW5n IHRoZSB2YmxhbmsKLQkgKiBpbnRlcnJ1cHQgYnkgYnVtcGluZyB0aGUgcmVmY291bnQuCi0JICov Ci0JaWYgKCF2YmxhbmstPmlubW9kZXNldCkgewotCQlhdG9taWNfaW5jKCZ2YmxhbmstPnJlZmNv dW50KTsKLQkJdmJsYW5rLT5pbm1vZGVzZXQgPSAxOwotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7Ci0KLQlXQVJOX09OKCFsaXN0X2VtcHR5KCZk ZXYtPnZibGFua19ldmVudF9saXN0KSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9jcnRjX3ZibGFu a19yZXNldCk7Ci0KLS8qKgotICogZHJtX2NydGNfdmJsYW5rX29uIC0gZW5hYmxlIHZibGFuayBl dmVudHMgb24gYSBDUlRDCi0gKiBAY3J0YzogQ1JUQyBpbiBxdWVzdGlvbgotICoKLSAqIFRoaXMg ZnVuY3Rpb25zIHJlc3RvcmVzIHRoZSB2YmxhbmsgaW50ZXJydXB0IHN0YXRlIGNhcHR1cmVkIHdp dGgKLSAqIGRybV9jcnRjX3ZibGFua19vZmYoKSBhZ2Fpbi4gTm90ZSB0aGF0IGNhbGxzIHRvIGRy bV9jcnRjX3ZibGFua19vbigpIGFuZAotICogZHJtX2NydGNfdmJsYW5rX29mZigpIGNhbiBiZSB1 bmJhbGFuY2VkIGFuZCBzbyBjYW4gYWxzbyBiZSB1bmNvbmRpdGlvbmFsbHkgY2FsbGVkCi0gKiBp biBkcml2ZXIgbG9hZCBjb2RlIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQgaGFyZHdhcmUgc3RhdGUg b2YgdGhlIGNydGMuCi0gKi8KLXZvaWQgZHJtX2NydGNfdmJsYW5rX29uKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwotCXVuc2ln bmVkIGludCBwaXBlID0gZHJtX2NydGNfaW5kZXgoY3J0Yyk7Ci0Jc3RydWN0IGRybV92Ymxhbmtf Y3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxh Z3M7Ci0KLQlpZiAoV0FSTl9PTihwaXBlID49IGRldi0+bnVtX2NydGNzKSkKLQkJcmV0dXJuOwot Ci0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKLQlEUk1fREVC VUdfVkJMKCJjcnRjICVkLCB2YmxhbmsgZW5hYmxlZCAlZCwgaW5tb2Rlc2V0ICVkXG4iLAotCQkg ICAgICBwaXBlLCB2YmxhbmstPmVuYWJsZWQsIHZibGFuay0+aW5tb2Rlc2V0KTsKLQotCS8qIERy b3Agb3VyIHByaXZhdGUgInByZXZlbnQgZHJtX3ZibGFua19nZXQiIHJlZmNvdW50ICovCi0JaWYg KHZibGFuay0+aW5tb2Rlc2V0KSB7Ci0JCWF0b21pY19kZWMoJnZibGFuay0+cmVmY291bnQpOwot CQl2YmxhbmstPmlubW9kZXNldCA9IDA7Ci0JfQotCi0JZHJtX3Jlc2V0X3ZibGFua190aW1lc3Rh bXAoZGV2LCBwaXBlKTsKLQotCS8qCi0JICogcmUtZW5hYmxlIGludGVycnVwdHMgaWYgdGhlcmUg YXJlIHVzZXJzIGxlZnQsIG9yIHRoZQotCSAqIHVzZXIgd2lzaGVzIHZibGFuayBpbnRlcnJ1cHRz IHRvIGJlIGVuYWJsZWQgYWxsIHRoZSB0aW1lLgotCSAqLwotCWlmIChhdG9taWNfcmVhZCgmdmJs YW5rLT5yZWZjb3VudCkgIT0gMCB8fCBkcm1fdmJsYW5rX29mZmRlbGF5ID09IDApCi0JCVdBUk5f T04oZHJtX3ZibGFua19lbmFibGUoZGV2LCBwaXBlKSk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOwotfQotRVhQT1JUX1NZTUJPTChkcm1fY3J0Y192 Ymxhbmtfb24pOwotCi1zdGF0aWMgdm9pZCBkcm1fbGVnYWN5X3ZibGFua19wcmVfbW9kZXNldChz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LAotCQkJCQkgIHVuc2lnbmVkIGludCBwaXBlKQotewotCXN0 cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFua1twaXBlXTsKLQotCS8q IHZibGFuayBpcyBub3QgaW5pdGlhbGl6ZWQgKElSUSBub3QgaW5zdGFsbGVkID8pLCBvciBoYXMg YmVlbiBmcmVlZCAqLwotCWlmICghZGV2LT5udW1fY3J0Y3MpCi0JCXJldHVybjsKLQotCWlmIChX QVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0Y3MpKQotCQlyZXR1cm47Ci0KLQkvKgotCSAqIFRv IGF2b2lkIGFsbCB0aGUgcHJvYmxlbXMgdGhhdCBtaWdodCBoYXBwZW4gaWYgaW50ZXJydXB0cwot CSAqIHdlcmUgZW5hYmxlZC9kaXNhYmxlZCBhcm91bmQgb3IgYmV0d2VlbiB0aGVzZSBjYWxscywg d2UganVzdAotCSAqIGhhdmUgdGhlIGtlcm5lbCB0YWtlIGEgcmVmZXJlbmNlIG9uIHRoZSBDUlRD IChqdXN0IG9uY2UgdGhvdWdoCi0JICogdG8gYXZvaWQgY29ycnVwdGluZyB0aGUgY291bnQgaWYg bXVsdGlwbGUsIG1pc21hdGNoIGNhbGxzIG9jY3VyKSwKLQkgKiBzbyB0aGF0IGludGVycnVwdHMg cmVtYWluIGVuYWJsZWQgaW4gdGhlIGludGVyaW0uCi0JICovCi0JaWYgKCF2YmxhbmstPmlubW9k ZXNldCkgewotCQl2YmxhbmstPmlubW9kZXNldCA9IDB4MTsKLQkJaWYgKGRybV92YmxhbmtfZ2V0 KGRldiwgcGlwZSkgPT0gMCkKLQkJCXZibGFuay0+aW5tb2Rlc2V0IHw9IDB4MjsKLQl9Ci19Ci0K LXN0YXRpYyB2b2lkIGRybV9sZWdhY3lfdmJsYW5rX3Bvc3RfbW9kZXNldChzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAotCQkJCQkgICB1bnNpZ25lZCBpbnQgcGlwZSkKLXsKLQlzdHJ1Y3QgZHJtX3Zi bGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07Ci0JdW5zaWduZWQgbG9uZyBp cnFmbGFnczsKLQotCS8qIHZibGFuayBpcyBub3QgaW5pdGlhbGl6ZWQgKElSUSBub3QgaW5zdGFs bGVkID8pLCBvciBoYXMgYmVlbiBmcmVlZCAqLwotCWlmICghZGV2LT5udW1fY3J0Y3MpCi0JCXJl dHVybjsKLQotCWlmIChXQVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0Y3MpKQotCQlyZXR1cm47 Ci0KLQlpZiAodmJsYW5rLT5pbm1vZGVzZXQpIHsKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ dmJsX2xvY2ssIGlycWZsYWdzKTsKLQkJZHJtX3Jlc2V0X3ZibGFua190aW1lc3RhbXAoZGV2LCBw aXBlKTsKLQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3Mp OwotCi0JCWlmICh2YmxhbmstPmlubW9kZXNldCAmIDB4MikKLQkJCWRybV92YmxhbmtfcHV0KGRl diwgcGlwZSk7Ci0KLQkJdmJsYW5rLT5pbm1vZGVzZXQgPSAwOwotCX0KLX0KLQotaW50IGRybV9s ZWdhY3lfbW9kZXNldF9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0YSwKLQkJ CSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQotewotCXN0cnVjdCBkcm1fbW9kZXNldF9j dGwgKm1vZGVzZXQgPSBkYXRhOwotCXVuc2lnbmVkIGludCBwaXBlOwotCi0JLyogSWYgZHJtX3Zi bGFua19pbml0KCkgaGFzbid0IGJlZW4gY2FsbGVkIHlldCwganVzdCBuby1vcCAqLwotCWlmICgh ZGV2LT5udW1fY3J0Y3MpCi0JCXJldHVybiAwOwotCi0JLyogS01TIGRyaXZlcnMgaGFuZGxlIHRo aXMgaW50ZXJuYWxseSAqLwotCWlmICghZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZF Ul9MRUdBQ1kpKQotCQlyZXR1cm4gMDsKLQotCXBpcGUgPSBtb2Rlc2V0LT5jcnRjOwotCWlmIChw aXBlID49IGRldi0+bnVtX2NydGNzKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCXN3aXRjaCAobW9k ZXNldC0+Y21kKSB7Ci0JY2FzZSBfRFJNX1BSRV9NT0RFU0VUOgotCQlkcm1fbGVnYWN5X3ZibGFu a19wcmVfbW9kZXNldChkZXYsIHBpcGUpOwotCQlicmVhazsKLQljYXNlIF9EUk1fUE9TVF9NT0RF U0VUOgotCQlkcm1fbGVnYWN5X3ZibGFua19wb3N0X21vZGVzZXQoZGV2LCBwaXBlKTsKLQkJYnJl YWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0K LXN0YXRpYyBpbmxpbmUgYm9vbCB2YmxhbmtfcGFzc2VkKHUzMiBzZXEsIHUzMiByZWYpCi17Ci0J cmV0dXJuIChzZXEgLSByZWYpIDw9ICgxIDw8IDIzKTsKLX0KLQotc3RhdGljIGludCBkcm1fcXVl dWVfdmJsYW5rX2V2ZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBl LAotCQkJCSAgdW5pb24gZHJtX3dhaXRfdmJsYW5rICp2Ymx3YWl0LAotCQkJCSAgc3RydWN0IGRy bV9maWxlICpmaWxlX3ByaXYpCi17Ci0Jc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0g JmRldi0+dmJsYW5rW3BpcGVdOwotCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgKmU7 Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQg aW50IHNlcTsKLQlpbnQgcmV0OwotCi0JZSA9IGt6YWxsb2Moc2l6ZW9mKCplKSwgR0ZQX0tFUk5F TCk7Ci0JaWYgKGUgPT0gTlVMTCkgewotCQlyZXQgPSAtRU5PTUVNOwotCQlnb3RvIGVycl9wdXQ7 Ci0JfQotCi0JZS0+cGlwZSA9IHBpcGU7Ci0JZS0+ZXZlbnQuYmFzZS50eXBlID0gRFJNX0VWRU5U X1ZCTEFOSzsKLQllLT5ldmVudC5iYXNlLmxlbmd0aCA9IHNpemVvZihlLT5ldmVudCk7Ci0JZS0+ ZXZlbnQudXNlcl9kYXRhID0gdmJsd2FpdC0+cmVxdWVzdC5zaWduYWw7Ci0KLQlzcGluX2xvY2tf aXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Ci0KLQkvKgotCSAqIGRybV9jcnRjX3Zi bGFua19vZmYoKSBtaWdodCBoYXZlIGJlZW4gY2FsbGVkIGFmdGVyIHdlIGNhbGxlZAotCSAqIGRy bV92YmxhbmtfZ2V0KCkuIGRybV9jcnRjX3ZibGFua19vZmYoKSBob2xkcyBldmVudF9sb2NrIGFy b3VuZCB0aGUKLQkgKiB2YmxhbmsgZGlzYWJsZSwgc28gbm8gbmVlZCBmb3IgZnVydGhlciBsb2Nr aW5nLiAgVGhlIHJlZmVyZW5jZSBmcm9tCi0JICogZHJtX3ZibGFua19nZXQoKSBwcm90ZWN0cyBh Z2FpbnN0IHZibGFuayBkaXNhYmxlIGZyb20gYW5vdGhlciBzb3VyY2UuCi0JICovCi0JaWYgKCFS RUFEX09OQ0UodmJsYW5rLT5lbmFibGVkKSkgewotCQlyZXQgPSAtRUlOVkFMOwotCQlnb3RvIGVy cl91bmxvY2s7Ci0JfQotCi0JcmV0ID0gZHJtX2V2ZW50X3Jlc2VydmVfaW5pdF9sb2NrZWQoZGV2 LCBmaWxlX3ByaXYsICZlLT5iYXNlLAotCQkJCQkgICAgJmUtPmV2ZW50LmJhc2UpOwotCi0JaWYg KHJldCkKLQkJZ290byBlcnJfdW5sb2NrOwotCi0Jc2VxID0gZHJtX3ZibGFua19jb3VudF9hbmRf dGltZShkZXYsIHBpcGUsICZub3cpOwotCi0JRFJNX0RFQlVHKCJldmVudCBvbiB2YmxhbmsgY291 bnQgJXUsIGN1cnJlbnQgJXUsIGNydGMgJXVcbiIsCi0JCSAgdmJsd2FpdC0+cmVxdWVzdC5zZXF1 ZW5jZSwgc2VxLCBwaXBlKTsKLQotCXRyYWNlX2RybV92YmxhbmtfZXZlbnRfcXVldWVkKGZpbGVf cHJpdiwgcGlwZSwKLQkJCQkgICAgICB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlKTsKLQotCWUt PmV2ZW50LnNlcXVlbmNlID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZTsKLQlpZiAodmJsYW5r X3Bhc3NlZChzZXEsIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpKSB7Ci0JCWRybV92Ymxhbmtf cHV0KGRldiwgcGlwZSk7Ci0JCXNlbmRfdmJsYW5rX2V2ZW50KGRldiwgZSwgc2VxLCAmbm93KTsK LQkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UgPSBzZXE7Ci0JfSBlbHNlIHsKLQkJLyogZHJtX2hh bmRsZV92YmxhbmtfZXZlbnRzIHdpbGwgY2FsbCBkcm1fdmJsYW5rX3B1dCAqLwotCQlsaXN0X2Fk ZF90YWlsKCZlLT5iYXNlLmxpbmssICZkZXYtPnZibGFua19ldmVudF9saXN0KTsKLQkJdmJsd2Fp dC0+cmVwbHkuc2VxdWVuY2UgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVlbmNlOwotCX0KLQotCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwotCi0JcmV0dXJu IDA7Ci0KLWVycl91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9s b2NrLCBmbGFncyk7Ci0Ja2ZyZWUoZSk7Ci1lcnJfcHV0OgotCWRybV92YmxhbmtfcHV0KGRldiwg cGlwZSk7Ci0JcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIGJvb2wgZHJtX3dhaXRfdmJsYW5rX2lz X3F1ZXJ5KHVuaW9uIGRybV93YWl0X3ZibGFuayAqdmJsd2FpdCkKLXsKLQlpZiAodmJsd2FpdC0+ cmVxdWVzdC5zZXF1ZW5jZSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JcmV0dXJuIF9EUk1fVkJMQU5L X1JFTEFUSVZFID09Ci0JCSh2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJiAoX0RSTV9WQkxBTktfVFlQ RVNfTUFTSyB8Ci0JCQkJCSAgX0RSTV9WQkxBTktfRVZFTlQgfAotCQkJCQkgIF9EUk1fVkJMQU5L X05FWFRPTk1JU1MpKTsKLX0KLQotLyoKLSAqIFdhaXQgZm9yIFZCTEFOSy4KLSAqCi0gKiBccGFy YW0gaW5vZGUgZGV2aWNlIGlub2RlLgotICogXHBhcmFtIGZpbGVfcHJpdiBEUk0gZmlsZSBwcml2 YXRlLgotICogXHBhcmFtIGNtZCBjb21tYW5kLgotICogXHBhcmFtIGRhdGEgdXNlciBhcmd1bWVu dCwgcG9pbnRpbmcgdG8gYSBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJlLgotICogXHJldHVybiB6 ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFpbHVyZS4KLSAqCi0gKiBU aGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIHZibGFuayBpbnRlcnJ1cHQgb24gdGhlIHBpcGUgcmVx dWVzdGVkLCB0aGVuCi0gKiBzbGVlcHMgd2FpdGluZyBmb3IgdGhlIHJlcXVlc3RlZCBzZXF1ZW5j ZSBudW1iZXIgdG8gb2NjdXIsIGFuZCBkcm9wcwotICogdGhlIHZibGFuayBpbnRlcnJ1cHQgcmVm Y291bnQgYWZ0ZXJ3YXJkcy4gKHZibGFuayBJUlEgZGlzYWJsZSBmb2xsb3dzIHRoYXQKLSAqIGFm dGVyIGEgdGltZW91dCB3aXRoIG5vIGZ1cnRoZXIgdmJsYW5rIHdhaXRzIHNjaGVkdWxlZCkuCi0g Ki8KLWludCBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0 YSwKLQkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQotewotCXN0cnVjdCBkcm1fdmJs YW5rX2NydGMgKnZibGFuazsKLQl1bmlvbiBkcm1fd2FpdF92YmxhbmsgKnZibHdhaXQgPSBkYXRh OwotCWludCByZXQ7Ci0JdW5zaWduZWQgaW50IGZsYWdzLCBzZXEsIHBpcGUsIGhpZ2hfcGlwZTsK LQotCWlmICghZGV2LT5pcnFfZW5hYmxlZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlpZiAodmJs d2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfU0lHTkFMKQotCQlyZXR1cm4gLUVJTlZB TDsKLQotCWlmICh2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJgotCSAgICB+KF9EUk1fVkJMQU5LX1RZ UEVTX01BU0sgfCBfRFJNX1ZCTEFOS19GTEFHU19NQVNLIHwKLQkgICAgICBfRFJNX1ZCTEFOS19I SUdIX0NSVENfTUFTSykpIHsKLQkJRFJNX0VSUk9SKCJVbnN1cHBvcnRlZCB0eXBlIHZhbHVlIDB4 JXgsIHN1cHBvcnRlZCBtYXNrIDB4JXhcbiIsCi0JCQkgIHZibHdhaXQtPnJlcXVlc3QudHlwZSwK LQkJCSAgKF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgfCBfRFJNX1ZCTEFOS19GTEFHU19NQVNLIHwK LQkJCSAgIF9EUk1fVkJMQU5LX0hJR0hfQ1JUQ19NQVNLKSk7Ci0JCXJldHVybiAtRUlOVkFMOwot CX0KLQotCWZsYWdzID0gdmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfRkxBR1Nf TUFTSzsKLQloaWdoX3BpcGUgPSAodmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktf SElHSF9DUlRDX01BU0spOwotCWlmIChoaWdoX3BpcGUpCi0JCXBpcGUgPSBoaWdoX3BpcGUgPj4g X0RSTV9WQkxBTktfSElHSF9DUlRDX1NISUZUOwotCWVsc2UKLQkJcGlwZSA9IGZsYWdzICYgX0RS TV9WQkxBTktfU0VDT05EQVJZID8gMSA6IDA7Ci0JaWYgKHBpcGUgPj0gZGV2LT5udW1fY3J0Y3Mp Ci0JCXJldHVybiAtRUlOVkFMOwotCi0JdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOwotCi0J LyogSWYgdGhlIGNvdW50ZXIgaXMgY3VycmVudGx5IGVuYWJsZWQgYW5kIGFjY3VyYXRlLCBzaG9y dC1jaXJjdWl0Ci0JICogcXVlcmllcyB0byByZXR1cm4gdGhlIGNhY2hlZCB0aW1lc3RhbXAgb2Yg dGhlIGxhc3QgdmJsYW5rLgotCSAqLwotCWlmIChkZXYtPnZibGFua19kaXNhYmxlX2ltbWVkaWF0 ZSAmJgotCSAgICBkcm1fd2FpdF92YmxhbmtfaXNfcXVlcnkodmJsd2FpdCkgJiYKLQkgICAgUkVB RF9PTkNFKHZibGFuay0+ZW5hYmxlZCkpIHsKLQkJc3RydWN0IHRpbWV2YWwgbm93OwotCi0JCXZi bHdhaXQtPnJlcGx5LnNlcXVlbmNlID0KLQkJCWRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoZGV2 LCBwaXBlLCAmbm93KTsKLQkJdmJsd2FpdC0+cmVwbHkudHZhbF9zZWMgPSBub3cudHZfc2VjOwot CQl2Ymx3YWl0LT5yZXBseS50dmFsX3VzZWMgPSBub3cudHZfdXNlYzsKLQkJcmV0dXJuIDA7Ci0J fQotCi0JcmV0ID0gZHJtX3ZibGFua19nZXQoZGV2LCBwaXBlKTsKLQlpZiAocmV0KSB7Ci0JCURS TV9ERUJVRygiY3J0YyAlZCBmYWlsZWQgdG8gYWNxdWlyZSB2YmxhbmsgY291bnRlciwgJWRcbiIs IHBpcGUsIHJldCk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCXNlcSA9IGRybV92YmxhbmtfY291bnQo ZGV2LCBwaXBlKTsKLQotCXN3aXRjaCAodmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxB TktfVFlQRVNfTUFTSykgewotCWNhc2UgX0RSTV9WQkxBTktfUkVMQVRJVkU6Ci0JCXZibHdhaXQt PnJlcXVlc3Quc2VxdWVuY2UgKz0gc2VxOwotCQl2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJj0gfl9E Uk1fVkJMQU5LX1JFTEFUSVZFOwotCWNhc2UgX0RSTV9WQkxBTktfQUJTT0xVVEU6Ci0JCWJyZWFr OwotCWRlZmF1bHQ6Ci0JCXJldCA9IC1FSU5WQUw7Ci0JCWdvdG8gZG9uZTsKLQl9Ci0KLQlpZiAo KGZsYWdzICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgJiYKLQkgICAgdmJsYW5rX3Bhc3NlZChz ZXEsIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpKQotCQl2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVl bmNlID0gc2VxICsgMTsKLQotCWlmIChmbGFncyAmIF9EUk1fVkJMQU5LX0VWRU5UKSB7Ci0JCS8q IG11c3QgaG9sZCBvbiB0byB0aGUgdmJsYW5rIHJlZiB1bnRpbCB0aGUgZXZlbnQgZmlyZXMKLQkJ ICogZHJtX3ZibGFua19wdXQgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9ub3VzbHkKLQkJICovCi0J CXJldHVybiBkcm1fcXVldWVfdmJsYW5rX2V2ZW50KGRldiwgcGlwZSwgdmJsd2FpdCwgZmlsZV9w cml2KTsKLQl9Ci0KLQlpZiAodmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSAhPSBzZXEpIHsKLQkJ RFJNX0RFQlVHKCJ3YWl0aW5nIG9uIHZibGFuayBjb3VudCAldSwgY3J0YyAldVxuIiwKLQkJCSAg dmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSwgcGlwZSk7Ci0JCURSTV9XQUlUX09OKHJldCwgdmJs YW5rLT5xdWV1ZSwgMyAqIEhaLAotCQkJICAgIHZibGFua19wYXNzZWQoZHJtX3ZibGFua19jb3Vu dChkZXYsIHBpcGUpLAotCQkJCQkgIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpIHx8Ci0JCQkg ICAgIVJFQURfT05DRSh2YmxhbmstPmVuYWJsZWQpKTsKLQl9Ci0KLQlpZiAocmV0ICE9IC1FSU5U UikgewotCQlzdHJ1Y3QgdGltZXZhbCBub3c7Ci0KLQkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2Ug PSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgcGlwZSwgJm5vdyk7Ci0JCXZibHdhaXQt PnJlcGx5LnR2YWxfc2VjID0gbm93LnR2X3NlYzsKLQkJdmJsd2FpdC0+cmVwbHkudHZhbF91c2Vj ID0gbm93LnR2X3VzZWM7Ci0KLQkJRFJNX0RFQlVHKCJjcnRjICVkIHJldHVybmluZyAldSB0byBj bGllbnRcbiIsCi0JCQkgIHBpcGUsIHZibHdhaXQtPnJlcGx5LnNlcXVlbmNlKTsKLQl9IGVsc2Ug ewotCQlEUk1fREVCVUcoImNydGMgJWQgdmJsYW5rIHdhaXQgaW50ZXJydXB0ZWQgYnkgc2lnbmFs XG4iLCBwaXBlKTsKLQl9Ci0KLWRvbmU6Ci0JZHJtX3ZibGFua19wdXQoZGV2LCBwaXBlKTsKLQly ZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBkcm1faGFuZGxlX3ZibGFua19ldmVudHMoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCi17Ci0Jc3RydWN0IGRybV9w ZW5kaW5nX3ZibGFua19ldmVudCAqZSwgKnQ7Ci0Jc3RydWN0IHRpbWV2YWwgbm93OwotCXVuc2ln bmVkIGludCBzZXE7Ci0KLQlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+ZXZlbnRfbG9jayk7Ci0K LQlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgcGlwZSwgJm5vdyk7Ci0KLQls aXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdCwgJmRldi0+dmJsYW5rX2V2ZW50X2xpc3QsIGJh c2UubGluaykgewotCQlpZiAoZS0+cGlwZSAhPSBwaXBlKQotCQkJY29udGludWU7Ci0JCWlmICgh dmJsYW5rX3Bhc3NlZChzZXEsIGUtPmV2ZW50LnNlcXVlbmNlKSkKLQkJCWNvbnRpbnVlOwotCi0J CURSTV9ERUJVRygidmJsYW5rIGV2ZW50IG9uICV1LCBjdXJyZW50ICV1XG4iLAotCQkJICBlLT5l dmVudC5zZXF1ZW5jZSwgc2VxKTsKLQotCQlsaXN0X2RlbCgmZS0+YmFzZS5saW5rKTsKLQkJZHJt X3ZibGFua19wdXQoZGV2LCBwaXBlKTsKLQkJc2VuZF92YmxhbmtfZXZlbnQoZGV2LCBlLCBzZXEs ICZub3cpOwotCX0KLQotCXRyYWNlX2RybV92YmxhbmtfZXZlbnQocGlwZSwgc2VxKTsKLX0KLQot LyoqCi0gKiBkcm1faGFuZGxlX3ZibGFuayAtIGhhbmRsZSBhIHZibGFuayBldmVudAotICogQGRl djogRFJNIGRldmljZQotICogQHBpcGU6IGluZGV4IG9mIENSVEMgd2hlcmUgdGhpcyBldmVudCBv Y2N1cnJlZAotICoKLSAqIERyaXZlcnMgc2hvdWxkIGNhbGwgdGhpcyByb3V0aW5lIGluIHRoZWly IHZibGFuayBpbnRlcnJ1cHQgaGFuZGxlcnMgdG8KLSAqIHVwZGF0ZSB0aGUgdmJsYW5rIGNvdW50 ZXIgYW5kIHNlbmQgYW55IHNpZ25hbHMgdGhhdCBtYXkgYmUgcGVuZGluZy4KLSAqCi0gKiBUaGlz IGlzIHRoZSBsZWdhY3kgdmVyc2lvbiBvZiBkcm1fY3J0Y19oYW5kbGVfdmJsYW5rKCkuCi0gKi8K LWJvb2wgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQg aW50IHBpcGUpCi17Ci0Jc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJs YW5rW3BpcGVdOwotCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7Ci0JYm9vbCBkaXNhYmxlX2lycTsK LQotCWlmIChXQVJOX09OX09OQ0UoIWRldi0+bnVtX2NydGNzKSkKLQkJcmV0dXJuIGZhbHNlOwot Ci0JaWYgKFdBUk5fT04ocGlwZSA+PSBkZXYtPm51bV9jcnRjcykpCi0JCXJldHVybiBmYWxzZTsK LQotCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGlycWZsYWdzKTsKLQotCS8q IE5lZWQgdGltZXN0YW1wIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50IGV4ZWN1dGlvbiB3aXRo Ci0JICogdmJsYW5rIGVuYWJsZS9kaXNhYmxlLCBhcyB0aGlzIHdvdWxkIGNhdXNlIGluY29uc2lz dGVudAotCSAqIG9yIGNvcnJ1cHRlZCB0aW1lc3RhbXBzIGFuZCB2YmxhbmsgY291bnRzLgotCSAq LwotCXNwaW5fbG9jaygmZGV2LT52YmxhbmtfdGltZV9sb2NrKTsKLQotCS8qIFZibGFuayBpcnEg aGFuZGxpbmcgZGlzYWJsZWQuIE5vdGhpbmcgdG8gZG8uICovCi0JaWYgKCF2YmxhbmstPmVuYWJs ZWQpIHsKLQkJc3Bpbl91bmxvY2soJmRldi0+dmJsYW5rX3RpbWVfbG9jayk7Ci0JCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxZmxhZ3MpOwotCQlyZXR1cm4gZmFs c2U7Ci0JfQotCi0JZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoZGV2LCBwaXBlLCB0cnVlKTsKLQot CXNwaW5fdW5sb2NrKCZkZXYtPnZibGFua190aW1lX2xvY2spOwotCi0Jd2FrZV91cCgmdmJsYW5r LT5xdWV1ZSk7Ci0KLQkvKiBXaXRoIGluc3RhbnQtb2ZmLCB3ZSBkZWZlciBkaXNhYmxpbmcgdGhl IGludGVycnVwdCB1bnRpbCBhZnRlcgotCSAqIHdlIGZpbmlzaCBwcm9jZXNzaW5nIHRoZSBmb2xs b3dpbmcgdmJsYW5rIGFmdGVyIGFsbCBldmVudHMgaGF2ZQotCSAqIGJlZW4gc2lnbmFsZWQuIFRo ZSBkaXNhYmxlIGhhcyB0byBiZSBsYXN0IChhZnRlcgotCSAqIGRybV9oYW5kbGVfdmJsYW5rX2V2 ZW50cykgc28gdGhhdCB0aGUgdGltZXN0YW1wIGlzIGFsd2F5cyBhY2N1cmF0ZS4KLQkgKi8KLQlk aXNhYmxlX2lycSA9IChkZXYtPnZibGFua19kaXNhYmxlX2ltbWVkaWF0ZSAmJgotCQkgICAgICAg ZHJtX3ZibGFua19vZmZkZWxheSA+IDAgJiYKLQkJICAgICAgICFhdG9taWNfcmVhZCgmdmJsYW5r LT5yZWZjb3VudCkpOwotCi0JZHJtX2hhbmRsZV92YmxhbmtfZXZlbnRzKGRldiwgcGlwZSk7Ci0K LQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGlycWZsYWdzKTsKLQot CWlmIChkaXNhYmxlX2lycSkKLQkJdmJsYW5rX2Rpc2FibGVfZm4oKHVuc2lnbmVkIGxvbmcpdmJs YW5rKTsKLQotCXJldHVybiB0cnVlOwotfQotRVhQT1JUX1NZTUJPTChkcm1faGFuZGxlX3ZibGFu ayk7Ci0KLS8qKgotICogZHJtX2NydGNfaGFuZGxlX3ZibGFuayAtIGhhbmRsZSBhIHZibGFuayBl dmVudAotICogQGNydGM6IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWQKLSAqCi0gKiBEcml2ZXJz IHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBpbiB0aGVpciB2YmxhbmsgaW50ZXJydXB0IGhhbmRs ZXJzIHRvCi0gKiB1cGRhdGUgdGhlIHZibGFuayBjb3VudGVyIGFuZCBzZW5kIGFueSBzaWduYWxz IHRoYXQgbWF5IGJlIHBlbmRpbmcuCi0gKgotICogVGhpcyBpcyB0aGUgbmF0aXZlIEtNUyB2ZXJz aW9uIG9mIGRybV9oYW5kbGVfdmJsYW5rKCkuCi0gKgotICogUmV0dXJuczoKLSAqIFRydWUgaWYg dGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgaGFuZGxlZCwgZmFsc2Ugb24gZmFpbHVyZS4KLSAq LwotYm9vbCBkcm1fY3J0Y19oYW5kbGVfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsK LQlyZXR1cm4gZHJtX2hhbmRsZV92YmxhbmsoY3J0Yy0+ZGV2LCBkcm1fY3J0Y19pbmRleChjcnRj KSk7Ci19Ci1FWFBPUlRfU1lNQk9MKGRybV9jcnRjX2hhbmRsZV92YmxhbmspOwpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2RybV92YmxhbmsuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fdmJs YW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi42MzBkYzI2Mzc5 YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX3ZibGFuay5jCkBAIC0w LDAgKzEsMTY0NSBAQAorLyoKKyAqIGRybV9pcnEuYyBJUlEgYW5kIHZibGFuayBzdXBwb3J0Cisg KgorICogXGF1dGhvciBSaWNrYXJkIEUuIChSaWspIEZhaXRoIDxmYWl0aEB2YWxpbnV4LmNvbT4K KyAqIFxhdXRob3IgR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgorICoKKyAqIFBl cm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29u IG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9j dW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29m dHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgor ICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3Ry aWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJl LCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5p c2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgor ICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ug KGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBh bGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisg KgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkg T0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJ TUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBG T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5U IFNIQUxMCisgKiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJM RSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIg SU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcg RlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVT RSBPUgorICogT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRl IDxkcm0vZHJtX3ZibGFuay5oPgorI2luY2x1ZGUgPGRybS9kcm1QLmg+CisjaW5jbHVkZSA8bGlu dXgvZXhwb3J0Lmg+CisKKyNpbmNsdWRlICJkcm1fdHJhY2UuaCIKKyNpbmNsdWRlICJkcm1faW50 ZXJuYWwuaCIKKworLyogUmV0cnkgdGltZXN0YW1wIGNhbGN1bGF0aW9uIHVwIHRvIDMgdGltZXMg dG8gc2F0aXNmeQorICogZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24gYmVmb3JlIGdpdmluZyB1cC4K KyAqLworI2RlZmluZSBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVMgMworCisvKiBUaHJlc2hvbGQg aW4gbmFub3NlY29uZHMgZm9yIGRldGVjdGlvbiBvZiByZWR1bmRhbnQKKyAqIHZibGFuayBpcnEg aW4gZHJtX2hhbmRsZV92YmxhbmsoKS4gMSBtc2VjIHNob3VsZCBiZSBvay4KKyAqLworI2RlZmlu ZSBEUk1fUkVEVU5EQU5UX1ZCTElSUV9USFJFU0hfTlMgMTAwMDAwMAorCitzdGF0aWMgYm9vbAor ZHJtX2dldF9sYXN0X3ZibHRpbWVzdGFtcChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25l ZCBpbnQgcGlwZSwKKwkJCSAgc3RydWN0IHRpbWV2YWwgKnR2YmxhbmssIGJvb2wgaW5fdmJsYW5r X2lycSk7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZHJtX3RpbWVzdGFtcF9wcmVjaXNpb24gPSAy MDsgIC8qIERlZmF1bHQgdG8gMjAgdXNlY3MuICovCisKKy8qCisgKiBEZWZhdWx0IHRvIHVzZSBt b25vdG9uaWMgdGltZXN0YW1wcyBmb3Igd2FpdC1mb3ItdmJsYW5rIGFuZCBwYWdlLWZsaXAKKyAq IGNvbXBsZXRlIGV2ZW50cy4KKyAqLwordW5zaWduZWQgaW50IGRybV90aW1lc3RhbXBfbW9ub3Rv bmljID0gMTsKKworc3RhdGljIGludCBkcm1fdmJsYW5rX29mZmRlbGF5ID0gNTAwMDsgICAgLyog RGVmYXVsdCB0byA1MDAwIG1zZWNzLiAqLworCittb2R1bGVfcGFyYW1fbmFtZWQodmJsYW5rb2Zm ZGVsYXksIGRybV92Ymxhbmtfb2ZmZGVsYXksIGludCwgMDYwMCk7Cittb2R1bGVfcGFyYW1fbmFt ZWQodGltZXN0YW1wX3ByZWNpc2lvbl91c2VjLCBkcm1fdGltZXN0YW1wX3ByZWNpc2lvbiwgaW50 LCAwNjAwKTsKK21vZHVsZV9wYXJhbV9uYW1lZCh0aW1lc3RhbXBfbW9ub3RvbmljLCBkcm1fdGlt ZXN0YW1wX21vbm90b25pYywgaW50LCAwNjAwKTsKK01PRFVMRV9QQVJNX0RFU0ModmJsYW5rb2Zm ZGVsYXksICJEZWxheSB1bnRpbCB2YmxhbmsgaXJxIGF1dG8tZGlzYWJsZSBbbXNlY3NdICgwOiBu ZXZlciBkaXNhYmxlLCA8MDogZGlzYWJsZSBpbW1lZGlhdGVseSkiKTsKK01PRFVMRV9QQVJNX0RF U0ModGltZXN0YW1wX3ByZWNpc2lvbl91c2VjLCAiTWF4LiBlcnJvciBvbiB0aW1lc3RhbXBzIFt1 c2Vjc10iKTsKK01PRFVMRV9QQVJNX0RFU0ModGltZXN0YW1wX21vbm90b25pYywgIlVzZSBtb25v dG9uaWMgdGltZXN0YW1wcyIpOworCitzdGF0aWMgdm9pZCBzdG9yZV92Ymxhbmsoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkgdTMyIHZibGFua19jb3VudF9p bmMsCisJCQkgc3RydWN0IHRpbWV2YWwgKnRfdmJsYW5rLCB1MzIgbGFzdCkKK3sKKwlzdHJ1Y3Qg ZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07CisKKwlhc3NlcnRf c3Bpbl9sb2NrZWQoJmRldi0+dmJsYW5rX3RpbWVfbG9jayk7CisKKwl2YmxhbmstPmxhc3QgPSBs YXN0OworCisJd3JpdGVfc2VxbG9jaygmdmJsYW5rLT5zZXFsb2NrKTsKKwl2YmxhbmstPnRpbWUg PSAqdF92Ymxhbms7CisJdmJsYW5rLT5jb3VudCArPSB2YmxhbmtfY291bnRfaW5jOworCXdyaXRl X3NlcXVubG9jaygmdmJsYW5rLT5zZXFsb2NrKTsKK30KKworLyoKKyAqICJObyBodyBjb3VudGVy IiBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiBvZiAuZ2V0X3ZibGFua19jb3VudGVyKCkgaG9vaywK KyAqIGlmIHRoZXJlIGlzIG5vIHVzZWFibGUgaGFyZHdhcmUgZnJhbWUgY291bnRlciBhdmFpbGFi bGUuCisgKi8KK3N0YXRpYyB1MzIgZHJtX3ZibGFua19ub19od19jb3VudGVyKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQoreworCVdBUk5fT05fT05DRShkZXYtPm1h eF92YmxhbmtfY291bnQgIT0gMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1MzIgX19nZXRf dmJsYW5rX2NvdW50ZXIoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUp Cit7CisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfTU9ERVNFVCkpIHsK KwkJc3RydWN0IGRybV9jcnRjICpjcnRjID0gZHJtX2NydGNfZnJvbV9pbmRleChkZXYsIHBpcGUp OworCisJCWlmIChjcnRjLT5mdW5jcy0+Z2V0X3ZibGFua19jb3VudGVyKQorCQkJcmV0dXJuIGNy dGMtPmZ1bmNzLT5nZXRfdmJsYW5rX2NvdW50ZXIoY3J0Yyk7CisJfQorCisJaWYgKGRldi0+ZHJp dmVyLT5nZXRfdmJsYW5rX2NvdW50ZXIpCisJCXJldHVybiBkZXYtPmRyaXZlci0+Z2V0X3ZibGFu a19jb3VudGVyKGRldiwgcGlwZSk7CisKKwlyZXR1cm4gZHJtX3ZibGFua19ub19od19jb3VudGVy KGRldiwgcGlwZSk7Cit9CisKKy8qCisgKiBSZXNldCB0aGUgc3RvcmVkIHRpbWVzdGFtcCBmb3Ig dGhlIGN1cnJlbnQgdmJsYW5rIGNvdW50IHRvIGNvcnJlc3BvbmQKKyAqIHRvIHRoZSBsYXN0IHZi bGFuayBvY2N1cnJlZC4KKyAqCisgKiBPbmx5IHRvIGJlIGNhbGxlZCBmcm9tIGRybV9jcnRjX3Zi bGFua19vbigpLgorICoKKyAqIE5vdGU6IGNhbGxlciBtdXN0IGhvbGQgJmRybV9kZXZpY2UudmJs X2xvY2sgc2luY2UgdGhpcyByZWFkcyAmIHdyaXRlcworICogZGV2aWNlIHZibGFuayBmaWVsZHMu CisgKi8KK3N0YXRpYyB2b2lkIGRybV9yZXNldF92YmxhbmtfdGltZXN0YW1wKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQoreworCXUzMiBjdXJfdmJsYW5rOworCWJv b2wgcmM7CisJc3RydWN0IHRpbWV2YWwgdF92Ymxhbms7CisJaW50IGNvdW50ID0gRFJNX1RJTUVT VEFNUF9NQVhSRVRSSUVTOworCisJc3Bpbl9sb2NrKCZkZXYtPnZibGFua190aW1lX2xvY2spOwor CisJLyoKKwkgKiBzYW1wbGUgdGhlIGN1cnJlbnQgY291bnRlciB0byBhdm9pZCByYW5kb20ganVt cHMKKwkgKiB3aGVuIGRybV92YmxhbmtfZW5hYmxlKCkgYXBwbGllcyB0aGUgZGlmZgorCSAqLwor CWRvIHsKKwkJY3VyX3ZibGFuayA9IF9fZ2V0X3ZibGFua19jb3VudGVyKGRldiwgcGlwZSk7CisJ CXJjID0gZHJtX2dldF9sYXN0X3ZibHRpbWVzdGFtcChkZXYsIHBpcGUsICZ0X3ZibGFuaywgZmFs c2UpOworCX0gd2hpbGUgKGN1cl92YmxhbmsgIT0gX19nZXRfdmJsYW5rX2NvdW50ZXIoZGV2LCBw aXBlKSAmJiAtLWNvdW50ID4gMCk7CisKKwkvKgorCSAqIE9ubHkgcmVpbml0aWFsaXplIGNvcnJl c3BvbmRpbmcgdmJsYW5rIHRpbWVzdGFtcCBpZiBoaWdoLXByZWNpc2lvbiBxdWVyeQorCSAqIGF2 YWlsYWJsZSBhbmQgZGlkbid0IGZhaWwuIE90aGVyd2lzZSByZWluaXRpYWxpemUgZGVsYXllZCBh dCBuZXh0IHZibGFuaworCSAqIGludGVycnVwdCBhbmQgYXNzaWduIDAgZm9yIG5vdywgdG8gbWFy ayB0aGUgdmJsYW5rdGltZXN0YW1wIGFzIGludmFsaWQuCisJICovCisJaWYgKCFyYykKKwkJdF92 YmxhbmsgPSAoc3RydWN0IHRpbWV2YWwpIHswLCAwfTsKKworCS8qCisJICogKzEgdG8gbWFrZSBz dXJlIHVzZXIgd2lsbCBuZXZlciBzZWUgdGhlIHNhbWUKKwkgKiB2YmxhbmsgY291bnRlciB2YWx1 ZSBiZWZvcmUgYW5kIGFmdGVyIGEgbW9kZXNldAorCSAqLworCXN0b3JlX3ZibGFuayhkZXYsIHBp cGUsIDEsICZ0X3ZibGFuaywgY3VyX3ZibGFuayk7CisKKwlzcGluX3VubG9jaygmZGV2LT52Ymxh bmtfdGltZV9sb2NrKTsKK30KKworLyoKKyAqIENhbGwgYmFjayBpbnRvIHRoZSBkcml2ZXIgdG8g dXBkYXRlIHRoZSBhcHByb3ByaWF0ZSB2YmxhbmsgY291bnRlcgorICogKHNwZWNpZmllZCBieSBA cGlwZSkuICBEZWFsIHdpdGggd3JhcGFyb3VuZCwgaWYgaXQgb2NjdXJyZWQsIGFuZAorICogdXBk YXRlIHRoZSBsYXN0IHJlYWQgdmFsdWUgc28gd2UgY2FuIGRlYWwgd2l0aCB3cmFwYXJvdW5kIG9u IHRoZSBuZXh0CisgKiBjYWxsIGlmIG5lY2Vzc2FyeS4KKyAqCisgKiBPbmx5IG5lY2Vzc2FyeSB3 aGVuIGdvaW5nIGZyb20gb2ZmLT5vbiwgdG8gYWNjb3VudCBmb3IgZnJhbWVzIHdlCisgKiBkaWRu J3QgZ2V0IGFuIGludGVycnVwdCBmb3IuCisgKgorICogTm90ZTogY2FsbGVyIG11c3QgaG9sZCAm ZHJtX2RldmljZS52YmxfbG9jayBzaW5jZSB0aGlzIHJlYWRzICYgd3JpdGVzCisgKiBkZXZpY2Ug dmJsYW5rIGZpZWxkcy4KKyAqLworc3RhdGljIHZvaWQgZHJtX3VwZGF0ZV92YmxhbmtfY291bnQo c3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkJICAgIGJvb2wg aW5fdmJsYW5rX2lycSkKK3sKKwlzdHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2 LT52YmxhbmtbcGlwZV07CisJdTMyIGN1cl92YmxhbmssIGRpZmY7CisJYm9vbCByYzsKKwlzdHJ1 Y3QgdGltZXZhbCB0X3ZibGFuazsKKwlpbnQgY291bnQgPSBEUk1fVElNRVNUQU1QX01BWFJFVFJJ RVM7CisJaW50IGZyYW1lZHVyX25zID0gdmJsYW5rLT5mcmFtZWR1cl9uczsKKworCS8qCisJICog SW50ZXJydXB0cyB3ZXJlIGRpc2FibGVkIHByaW9yIHRvIHRoaXMgY2FsbCwgc28gZGVhbCB3aXRo IGNvdW50ZXIKKwkgKiB3cmFwIGlmIG5lZWRlZC4KKwkgKiBOT1RFISAgSXQncyBwb3NzaWJsZSB3 ZSBsb3N0IGEgZnVsbCBkZXYtPm1heF92YmxhbmtfY291bnQgKyAxIGV2ZW50cworCSAqIGhlcmUg aWYgdGhlIHJlZ2lzdGVyIGlzIHNtYWxsIG9yIHdlIGhhZCB2YmxhbmsgaW50ZXJydXB0cyBvZmYg Zm9yCisJICogYSBsb25nIHRpbWUuCisJICoKKwkgKiBXZSByZXBlYXQgdGhlIGhhcmR3YXJlIHZi bGFuayBjb3VudGVyICYgdGltZXN0YW1wIHF1ZXJ5IHVudGlsCisJICogd2UgZ2V0IGNvbnNpc3Rl bnQgcmVzdWx0cy4gVGhpcyB0byBwcmV2ZW50IHJhY2VzIGJldHdlZW4gZ3B1CisJICogdXBkYXRp bmcgaXRzIGhhcmR3YXJlIGNvdW50ZXIgd2hpbGUgd2UgYXJlIHJldHJpZXZpbmcgdGhlCisJICog Y29ycmVzcG9uZGluZyB2YmxhbmsgdGltZXN0YW1wLgorCSAqLworCWRvIHsKKwkJY3VyX3ZibGFu ayA9IF9fZ2V0X3ZibGFua19jb3VudGVyKGRldiwgcGlwZSk7CisJCXJjID0gZHJtX2dldF9sYXN0 X3ZibHRpbWVzdGFtcChkZXYsIHBpcGUsICZ0X3ZibGFuaywgaW5fdmJsYW5rX2lycSk7CisJfSB3 aGlsZSAoY3VyX3ZibGFuayAhPSBfX2dldF92YmxhbmtfY291bnRlcihkZXYsIHBpcGUpICYmIC0t Y291bnQgPiAwKTsKKworCWlmIChkZXYtPm1heF92YmxhbmtfY291bnQgIT0gMCkgeworCQkvKiB0 cnVzdCB0aGUgaHcgY291bnRlciB3aGVuIGl0J3MgYXJvdW5kICovCisJCWRpZmYgPSAoY3VyX3Zi bGFuayAtIHZibGFuay0+bGFzdCkgJiBkZXYtPm1heF92YmxhbmtfY291bnQ7CisJfSBlbHNlIGlm IChyYyAmJiBmcmFtZWR1cl9ucykgeworCQljb25zdCBzdHJ1Y3QgdGltZXZhbCAqdF9vbGQ7CisJ CXU2NCBkaWZmX25zOworCisJCXRfb2xkID0gJnZibGFuay0+dGltZTsKKwkJZGlmZl9ucyA9IHRp bWV2YWxfdG9fbnMoJnRfdmJsYW5rKSAtIHRpbWV2YWxfdG9fbnModF9vbGQpOworCisJCS8qCisJ CSAqIEZpZ3VyZSBvdXQgaG93IG1hbnkgdmJsYW5rcyB3ZSd2ZSBtaXNzZWQgYmFzZWQKKwkJICog b24gdGhlIGRpZmZlcmVuY2UgaW4gdGhlIHRpbWVzdGFtcHMgYW5kIHRoZQorCQkgKiBmcmFtZS9m aWVsZCBkdXJhdGlvbi4KKwkJICovCisJCWRpZmYgPSBESVZfUk9VTkRfQ0xPU0VTVF9VTEwoZGlm Zl9ucywgZnJhbWVkdXJfbnMpOworCisJCWlmIChkaWZmID09IDAgJiYgaW5fdmJsYW5rX2lycSkK KwkJCURSTV9ERUJVR19WQkwoImNydGMgJXU6IFJlZHVuZGFudCB2YmxpcnEgaWdub3JlZC4iCisJ CQkJICAgICAgIiBkaWZmX25zID0gJWxsZCwgZnJhbWVkdXJfbnMgPSAlZClcbiIsCisJCQkJICAg ICAgcGlwZSwgKGxvbmcgbG9uZykgZGlmZl9ucywgZnJhbWVkdXJfbnMpOworCX0gZWxzZSB7CisJ CS8qIHNvbWUga2luZCBvZiBkZWZhdWx0IGZvciBkcml2ZXJzIHcvbyBhY2N1cmF0ZSB2YmwgdGlt ZXN0YW1waW5nICovCisJCWRpZmYgPSBpbl92YmxhbmtfaXJxID8gMSA6IDA7CisJfQorCisJLyoK KwkgKiBXaXRoaW4gYSBkcm1fdmJsYW5rX3ByZV9tb2Rlc2V0IC0gZHJtX3ZibGFua19wb3N0X21v ZGVzZXQKKwkgKiBpbnRlcnZhbD8gSWYgc28gdGhlbiB2YmxhbmsgaXJxcyBrZWVwIHJ1bm5pbmcg YW5kIGl0IHdpbGwgbGlrZWx5CisJICogaGFwcGVuIHRoYXQgdGhlIGhhcmR3YXJlIHZibGFuayBj b3VudGVyIGlzIG5vdCB0cnVzdHdvcnRoeSBhcyBpdAorCSAqIG1pZ2h0IHJlc2V0IGF0IHNvbWUg cG9pbnQgaW4gdGhhdCBpbnRlcnZhbCBhbmQgdmJsYW5rIHRpbWVzdGFtcHMKKwkgKiBhcmUgbm90 IHRydXN0d29ydGh5IGVpdGhlciBpbiB0aGF0IGludGVydmFsLiBJb3cuIHRoaXMgY2FuIHJlc3Vs dAorCSAqIGluIGEgYm9ndXMgZGlmZiA+PiAxIHdoaWNoIG11c3QgYmUgYXZvaWRlZCBhcyBpdCB3 b3VsZCBjYXVzZQorCSAqIHJhbmRvbSBsYXJnZSBmb3J3YXJkIGp1bXBzIG9mIHRoZSBzb2Z0d2Fy ZSB2YmxhbmsgY291bnRlci4KKwkgKi8KKwlpZiAoZGlmZiA+IDEgJiYgKHZibGFuay0+aW5tb2Rl c2V0ICYgMHgyKSkgeworCQlEUk1fREVCVUdfVkJMKCJjbGFtcGluZyB2YmxhbmsgYnVtcCB0byAx IG9uIGNydGMgJXU6IGRpZmZyPSV1IgorCQkJICAgICAgIiBkdWUgdG8gcHJlLW1vZGVzZXQuXG4i LCBwaXBlLCBkaWZmKTsKKwkJZGlmZiA9IDE7CisJfQorCisJRFJNX0RFQlVHX1ZCTCgidXBkYXRp bmcgdmJsYW5rIGNvdW50IG9uIGNydGMgJXU6IgorCQkgICAgICAiIGN1cnJlbnQ9JXUsIGRpZmY9 JXUsIGh3PSV1IGh3X2xhc3Q9JXVcbiIsCisJCSAgICAgIHBpcGUsIHZibGFuay0+Y291bnQsIGRp ZmYsIGN1cl92YmxhbmssIHZibGFuay0+bGFzdCk7CisKKwlpZiAoZGlmZiA9PSAwKSB7CisJCVdB Uk5fT05fT05DRShjdXJfdmJsYW5rICE9IHZibGFuay0+bGFzdCk7CisJCXJldHVybjsKKwl9CisK KwkvKgorCSAqIE9ubHkgcmVpbml0aWFsaXplIGNvcnJlc3BvbmRpbmcgdmJsYW5rIHRpbWVzdGFt cCBpZiBoaWdoLXByZWNpc2lvbiBxdWVyeQorCSAqIGF2YWlsYWJsZSBhbmQgZGlkbid0IGZhaWws IG9yIHdlIHdlcmUgY2FsbGVkIGZyb20gdGhlIHZibGFuayBpbnRlcnJ1cHQuCisJICogT3RoZXJ3 aXNlIHJlaW5pdGlhbGl6ZSBkZWxheWVkIGF0IG5leHQgdmJsYW5rIGludGVycnVwdCBhbmQgYXNz aWduIDAKKwkgKiBmb3Igbm93LCB0byBtYXJrIHRoZSB2Ymxhbmt0aW1lc3RhbXAgYXMgaW52YWxp ZC4KKwkgKi8KKwlpZiAoIXJjICYmIGluX3ZibGFua19pcnEpCisJCXRfdmJsYW5rID0gKHN0cnVj dCB0aW1ldmFsKSB7MCwgMH07CisKKwlzdG9yZV92YmxhbmsoZGV2LCBwaXBlLCBkaWZmLCAmdF92 YmxhbmssIGN1cl92YmxhbmspOworfQorCitzdGF0aWMgdTMyIGRybV92YmxhbmtfY291bnQoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCit7CisJc3RydWN0IGRybV92 YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOworCisJaWYgKFdBUk5fT04o cGlwZSA+PSBkZXYtPm51bV9jcnRjcykpCisJCXJldHVybiAwOworCisJcmV0dXJuIHZibGFuay0+ Y291bnQ7Cit9CisKKy8qKgorICogZHJtX2FjY3VyYXRlX3ZibGFua19jb3VudCAtIHJldHJpZXZl IHRoZSBtYXN0ZXIgdmJsYW5rIGNvdW50ZXIKKyAqIEBjcnRjOiB3aGljaCBjb3VudGVyIHRvIHJl dHJpZXZlCisgKgorICogVGhpcyBmdW5jdGlvbiBpcyBzaW1pbGFyIHRvIEBkcm1fY3J0Y192Ymxh bmtfY291bnQgYnV0IHRoaXMKKyAqIGZ1bmN0aW9uIGludGVycG9sYXRlcyB0byBoYW5kbGUgYSBy YWNlIHdpdGggdmJsYW5rIGlycSdzLgorICoKKyAqIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3Ig aGFyZHdhcmUgdGhhdCBjYW4gb2J0YWluIHRoZSBzY2Fub3V0CisgKiBwb3NpdGlvbiwgYnV0IGRv ZXNuJ3QgaGF2ZSBhIGZyYW1lIGNvdW50ZXIuCisgKi8KK3UzMiBkcm1fYWNjdXJhdGVfdmJsYW5r X2NvdW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 ID0gY3J0Yy0+ZGV2OworCXVuc2lnbmVkIGludCBwaXBlID0gZHJtX2NydGNfaW5kZXgoY3J0Yyk7 CisJdTMyIHZibGFuazsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJV0FSTighZGV2LT5kcml2 ZXItPmdldF92YmxhbmtfdGltZXN0YW1wLAorCSAgICAgIlRoaXMgZnVuY3Rpb24gcmVxdWlyZXMg c3VwcG9ydCBmb3IgYWNjdXJhdGUgdmJsYW5rIHRpbWVzdGFtcHMuIik7CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmZGV2LT52YmxhbmtfdGltZV9sb2NrLCBmbGFncyk7CisKKwlkcm1fdXBkYXRlX3Zi bGFua19jb3VudChkZXYsIHBpcGUsIGZhbHNlKTsKKwl2YmxhbmsgPSBkcm1fdmJsYW5rX2NvdW50 KGRldiwgcGlwZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibGFua190aW1l X2xvY2ssIGZsYWdzKTsKKworCXJldHVybiB2Ymxhbms7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9h Y2N1cmF0ZV92YmxhbmtfY291bnQpOworCitzdGF0aWMgdm9pZCBfX2Rpc2FibGVfdmJsYW5rKHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBlKQoreworCWlmIChkcm1fY29y ZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKSB7CisJCXN0cnVjdCBkcm1fY3J0 YyAqY3J0YyA9IGRybV9jcnRjX2Zyb21faW5kZXgoZGV2LCBwaXBlKTsKKworCQlpZiAoY3J0Yy0+ ZnVuY3MtPmRpc2FibGVfdmJsYW5rKSB7CisJCQljcnRjLT5mdW5jcy0+ZGlzYWJsZV92Ymxhbmso Y3J0Yyk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlkZXYtPmRyaXZlci0+ZGlzYWJsZV92Ymxh bmsoZGV2LCBwaXBlKTsKK30KKworLyoKKyAqIERpc2FibGUgdmJsYW5rIGlycSdzIG9uIGNydGMs IG1ha2Ugc3VyZSB0aGF0IGxhc3QgdmJsYW5rIGNvdW50CisgKiBvZiBoYXJkd2FyZSBhbmQgY29y cmVzcG9uZGluZyBjb25zaXN0ZW50IHNvZnR3YXJlIHZibGFuayBjb3VudGVyCisgKiBhcmUgcHJl c2VydmVkLCBldmVuIGlmIHRoZXJlIGFyZSBhbnkgc3B1cmlvdXMgdmJsYW5rIGlycSdzIGFmdGVy CisgKiBkaXNhYmxlLgorICovCit2b2lkIGRybV92YmxhbmtfZGlzYWJsZV9hbmRfc2F2ZShzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKK3sKKwlzdHJ1Y3QgZHJtX3Zi bGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07CisJdW5zaWduZWQgbG9uZyBp cnFmbGFnczsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2LT52YmxfbG9jayk7CisKKwkvKiBQ cmV2ZW50IHZibGFuayBpcnEgcHJvY2Vzc2luZyB3aGlsZSBkaXNhYmxpbmcgdmJsYW5rIGlycXMs CisJICogc28gbm8gdXBkYXRlcyBvZiB0aW1lc3RhbXBzIG9yIGNvdW50IGNhbiBoYXBwZW4gYWZ0 ZXIgd2UndmUKKwkgKiBkaXNhYmxlZC4gTmVlZGVkIHRvIHByZXZlbnQgcmFjZXMgaW4gY2FzZSBv ZiBkZWxheWVkIGlycSdzLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibGFua190 aW1lX2xvY2ssIGlycWZsYWdzKTsKKworCS8qCisJICogT25seSBkaXNhYmxlIHZibGFuayBpbnRl cnJ1cHRzIGlmIHRoZXkncmUgZW5hYmxlZC4gVGhpcyBhdm9pZHMKKwkgKiBjYWxsaW5nIHRoZSAt PmRpc2FibGVfdmJsYW5rKCkgb3BlcmF0aW9uIGluIGF0b21pYyBjb250ZXh0IHdpdGggdGhlCisJ ICogaGFyZHdhcmUgcG90ZW50aWFsbHkgcnVudGltZSBzdXNwZW5kZWQuCisJICovCisJaWYgKHZi bGFuay0+ZW5hYmxlZCkgeworCQlfX2Rpc2FibGVfdmJsYW5rKGRldiwgcGlwZSk7CisJCXZibGFu ay0+ZW5hYmxlZCA9IGZhbHNlOworCX0KKworCS8qCisJICogQWx3YXlzIHVwZGF0ZSB0aGUgY291 bnQgYW5kIHRpbWVzdGFtcCB0byBtYWludGFpbiB0aGUKKwkgKiBhcHBlYXJhbmNlIHRoYXQgdGhl IGNvdW50ZXIgaGFzIGJlZW4gdGlja2luZyBhbGwgYWxvbmcgdW50aWwKKwkgKiB0aGlzIHRpbWUu IFRoaXMgbWFrZXMgdGhlIGNvdW50IGFjY291bnQgZm9yIHRoZSBlbnRpcmUgdGltZQorCSAqIGJl dHdlZW4gZHJtX2NydGNfdmJsYW5rX29uKCkgYW5kIGRybV9jcnRjX3ZibGFua19vZmYoKS4KKwkg Ki8KKwlkcm1fdXBkYXRlX3ZibGFua19jb3VudChkZXYsIHBpcGUsIGZhbHNlKTsKKworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmRldi0+dmJsYW5rX3RpbWVfbG9jaywgaXJxZmxhZ3MpOworfQor CitzdGF0aWMgdm9pZCB2YmxhbmtfZGlzYWJsZV9mbih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlz dHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAodm9pZCAqKWFyZzsKKwlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gdmJsYW5rLT5kZXY7CisJdW5zaWduZWQgaW50IHBpcGUgPSB2Ymxhbmst PnBpcGU7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZk ZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisJaWYgKGF0b21pY19yZWFkKCZ2YmxhbmstPnJlZmNv dW50KSA9PSAwICYmIHZibGFuay0+ZW5hYmxlZCkgeworCQlEUk1fREVCVUcoImRpc2FibGluZyB2 Ymxhbmsgb24gY3J0YyAldVxuIiwgcGlwZSk7CisJCWRybV92YmxhbmtfZGlzYWJsZV9hbmRfc2F2 ZShkZXYsIHBpcGUpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2Nr LCBpcnFmbGFncyk7Cit9CisKKy8qKgorICogZHJtX3ZibGFua19jbGVhbnVwIC0gY2xlYW51cCB2 Ymxhbmsgc3VwcG9ydAorICogQGRldjogRFJNIGRldmljZQorICoKKyAqIFRoaXMgZnVuY3Rpb24g Y2xlYW5zIHVwIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkIGluIGRybV92YmxhbmtfaW5pdC4KKyAq Lwordm9pZCBkcm1fdmJsYW5rX2NsZWFudXAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKK3sKKwl1 bnNpZ25lZCBpbnQgcGlwZTsKKworCS8qIEJhaWwgaWYgdGhlIGRyaXZlciBkaWRuJ3QgY2FsbCBk cm1fdmJsYW5rX2luaXQoKSAqLworCWlmIChkZXYtPm51bV9jcnRjcyA9PSAwKQorCQlyZXR1cm47 CisKKwlmb3IgKHBpcGUgPSAwOyBwaXBlIDwgZGV2LT5udW1fY3J0Y3M7IHBpcGUrKykgeworCQlz dHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07CisKKwkJ V0FSTl9PTihSRUFEX09OQ0UodmJsYW5rLT5lbmFibGVkKSAmJgorCQkJZHJtX2NvcmVfY2hlY2tf ZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSk7CisKKwkJZGVsX3RpbWVyX3N5bmMoJnZibGFu ay0+ZGlzYWJsZV90aW1lcik7CisJfQorCisJa2ZyZWUoZGV2LT52YmxhbmspOworCisJZGV2LT5u dW1fY3J0Y3MgPSAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX2NsZWFudXApOworCisv KioKKyAqIGRybV92YmxhbmtfaW5pdCAtIGluaXRpYWxpemUgdmJsYW5rIHN1cHBvcnQKKyAqIEBk ZXY6IERSTSBkZXZpY2UKKyAqIEBudW1fY3J0Y3M6IG51bWJlciBvZiBDUlRDcyBzdXBwb3J0ZWQg YnkgQGRldgorICoKKyAqIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdmJsYW5rIHN1cHBvcnQg Zm9yIEBudW1fY3J0Y3MgZGlzcGxheSBwaXBlbGluZXMuCisgKgorICogUmV0dXJuczoKKyAqIFpl cm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24gZmFpbHVyZS4KKyAqLwor aW50IGRybV92YmxhbmtfaW5pdChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQg bnVtX2NydGNzKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXVuc2lnbmVkIGludCBpOworCisJ c3Bpbl9sb2NrX2luaXQoJmRldi0+dmJsX2xvY2spOworCXNwaW5fbG9ja19pbml0KCZkZXYtPnZi bGFua190aW1lX2xvY2spOworCisJZGV2LT5udW1fY3J0Y3MgPSBudW1fY3J0Y3M7CisKKwlkZXYt PnZibGFuayA9IGtjYWxsb2MobnVtX2NydGNzLCBzaXplb2YoKmRldi0+dmJsYW5rKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFkZXYtPnZibGFuaykKKwkJZ290byBlcnI7CisKKwlmb3IgKGkgPSAwOyBp IDwgbnVtX2NydGNzOyBpKyspIHsKKwkJc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0g JmRldi0+dmJsYW5rW2ldOworCisJCXZibGFuay0+ZGV2ID0gZGV2OworCQl2YmxhbmstPnBpcGUg PSBpOworCQlpbml0X3dhaXRxdWV1ZV9oZWFkKCZ2YmxhbmstPnF1ZXVlKTsKKwkJc2V0dXBfdGlt ZXIoJnZibGFuay0+ZGlzYWJsZV90aW1lciwgdmJsYW5rX2Rpc2FibGVfZm4sCisJCQkgICAgKHVu c2lnbmVkIGxvbmcpdmJsYW5rKTsKKwkJc2VxbG9ja19pbml0KCZ2YmxhbmstPnNlcWxvY2spOwor CX0KKworCURSTV9JTkZPKCJTdXBwb3J0cyB2YmxhbmsgdGltZXN0YW1wIGNhY2hpbmcgUmV2IDIg KDIxLjEwLjIwMTMpLlxuIik7CisKKwkvKiBEcml2ZXIgc3BlY2lmaWMgaGlnaC1wcmVjaXNpb24g dmJsYW5rIHRpbWVzdGFtcGluZyBzdXBwb3J0ZWQ/ICovCisJaWYgKGRldi0+ZHJpdmVyLT5nZXRf dmJsYW5rX3RpbWVzdGFtcCkKKwkJRFJNX0lORk8oIkRyaXZlciBzdXBwb3J0cyBwcmVjaXNlIHZi bGFuayB0aW1lc3RhbXAgcXVlcnkuXG4iKTsKKwllbHNlCisJCURSTV9JTkZPKCJObyBkcml2ZXIg c3VwcG9ydCBmb3IgdmJsYW5rIHRpbWVzdGFtcCBxdWVyeS5cbiIpOworCisJLyogTXVzdCBoYXZl IHByZWNpc2UgdGltZXN0YW1waW5nIGZvciByZWxpYWJsZSB2YmxhbmsgaW5zdGFudCBkaXNhYmxl ICovCisJaWYgKGRldi0+dmJsYW5rX2Rpc2FibGVfaW1tZWRpYXRlICYmICFkZXYtPmRyaXZlci0+ Z2V0X3ZibGFua190aW1lc3RhbXApIHsKKwkJZGV2LT52YmxhbmtfZGlzYWJsZV9pbW1lZGlhdGUg PSBmYWxzZTsKKwkJRFJNX0lORk8oIlNldHRpbmcgdmJsYW5rX2Rpc2FibGVfaW1tZWRpYXRlIHRv IGZhbHNlIGJlY2F1c2UgIgorCQkJICJnZXRfdmJsYW5rX3RpbWVzdGFtcCA9PSBOVUxMXG4iKTsK Kwl9CisKKwlyZXR1cm4gMDsKKworZXJyOgorCWRldi0+bnVtX2NydGNzID0gMDsKKwlyZXR1cm4g cmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1fdmJsYW5rX2luaXQpOworCisvKioKKyAqIGRybV9j cnRjX3ZibGFua193YWl0cXVldWUgLSBnZXQgdmJsYW5rIHdhaXRxdWV1ZSBmb3IgdGhlIENSVEMK KyAqIEBjcnRjOiB3aGljaCBDUlRDJ3MgdmJsYW5rIHdhaXRxdWV1ZSB0byByZXRyaWV2ZQorICoK KyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHZibGFuayB3YWl0cXVl dWUgZm9yIHRoZSBDUlRDLgorICogRHJpdmVycyBjYW4gdXNlIHRoaXMgdG8gaW1wbGVtZW50IHZi bGFuayB3YWl0cyB1c2luZyB3YWl0X2V2ZW50KCkgYW5kIHJlbGF0ZWQKKyAqIGZ1bmN0aW9ucy4K KyAqLword2FpdF9xdWV1ZV9oZWFkX3QgKmRybV9jcnRjX3ZibGFua193YWl0cXVldWUoc3RydWN0 IGRybV9jcnRjICpjcnRjKQoreworCXJldHVybiAmY3J0Yy0+ZGV2LT52YmxhbmtbZHJtX2NydGNf aW5kZXgoY3J0YyldLnF1ZXVlOworfQorRVhQT1JUX1NZTUJPTChkcm1fY3J0Y192Ymxhbmtfd2Fp dHF1ZXVlKTsKKworCisvKioKKyAqIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMgLSBj YWxjdWxhdGUgdmJsYW5rIHRpbWVzdGFtcCBjb25zdGFudHMKKyAqIEBjcnRjOiBkcm1fY3J0YyB3 aG9zZSB0aW1lc3RhbXAgY29uc3RhbnRzIHNob3VsZCBiZSB1cGRhdGVkLgorICogQG1vZGU6IGRp c3BsYXkgbW9kZSBjb250YWluaW5nIHRoZSBzY2Fub3V0IHRpbWluZ3MKKyAqCisgKiBDYWxjdWxh dGUgYW5kIHN0b3JlIHZhcmlvdXMgY29uc3RhbnRzIHdoaWNoIGFyZSBsYXRlcgorICogbmVlZGVk IGJ5IHZibGFuayBhbmQgc3dhcC1jb21wbGV0aW9uIHRpbWVzdGFtcGluZywgZS5nLAorICogYnkg ZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcygpLiBUaGV5IGFyZQorICogZGVy aXZlZCBmcm9tIENSVEMncyB0cnVlIHNjYW5vdXQgdGltaW5nLCBzbyB0aGV5IHRha2UKKyAqIHRo aW5ncyBsaWtlIHBhbmVsIHNjYWxpbmcgb3Igb3RoZXIgYWRqdXN0bWVudHMgaW50byBhY2NvdW50 LgorICovCit2b2lkIGRybV9jYWxjX3RpbWVzdGFtcGluZ19jb25zdGFudHMoc3RydWN0IGRybV9j cnRjICpjcnRjLAorCQkJCSAgICAgY29uc3Qgc3RydWN0IGRybV9kaXNwbGF5X21vZGUgKm1vZGUp Cit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKKwl1bnNpZ25lZCBpbnQg cGlwZSA9IGRybV9jcnRjX2luZGV4KGNydGMpOworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZi bGFuayA9ICZkZXYtPnZibGFua1twaXBlXTsKKwlpbnQgbGluZWR1cl9ucyA9IDAsIGZyYW1lZHVy X25zID0gMDsKKwlpbnQgZG90Y2xvY2sgPSBtb2RlLT5jcnRjX2Nsb2NrOworCisJaWYgKCFkZXYt Pm51bV9jcnRjcykKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04ocGlwZSA+PSBkZXYtPm51bV9j cnRjcykpCisJCXJldHVybjsKKworCS8qIFZhbGlkIGRvdGNsb2NrPyAqLworCWlmIChkb3RjbG9j ayA+IDApIHsKKwkJaW50IGZyYW1lX3NpemUgPSBtb2RlLT5jcnRjX2h0b3RhbCAqIG1vZGUtPmNy dGNfdnRvdGFsOworCisJCS8qCisJCSAqIENvbnZlcnQgc2NhbmxpbmUgbGVuZ3RoIGluIHBpeGVs cyBhbmQgdmlkZW8KKwkJICogZG90IGNsb2NrIHRvIGxpbmUgZHVyYXRpb24gYW5kIGZyYW1lIGR1 cmF0aW9uCisJCSAqIGluIG5hbm9zZWNvbmRzOgorCQkgKi8KKwkJbGluZWR1cl9ucyAgPSBkaXZf dTY0KCh1NjQpIG1vZGUtPmNydGNfaHRvdGFsICogMTAwMDAwMCwgZG90Y2xvY2spOworCQlmcmFt ZWR1cl9ucyA9IGRpdl91NjQoKHU2NCkgZnJhbWVfc2l6ZSAqIDEwMDAwMDAsIGRvdGNsb2NrKTsK KworCQkvKgorCQkgKiBGaWVsZHMgb2YgaW50ZXJsYWNlZCBzY2Fub3V0IG1vZGVzIGFyZSBvbmx5 IGhhbGYgYSBmcmFtZSBkdXJhdGlvbi4KKwkJICovCisJCWlmIChtb2RlLT5mbGFncyAmIERSTV9N T0RFX0ZMQUdfSU5URVJMQUNFKQorCQkJZnJhbWVkdXJfbnMgLz0gMjsKKwl9IGVsc2UKKwkJRFJN X0VSUk9SKCJjcnRjICV1OiBDYW4ndCBjYWxjdWxhdGUgY29uc3RhbnRzLCBkb3RjbG9jayA9IDAh XG4iLAorCQkJICBjcnRjLT5iYXNlLmlkKTsKKworCXZibGFuay0+bGluZWR1cl9ucyAgPSBsaW5l ZHVyX25zOworCXZibGFuay0+ZnJhbWVkdXJfbnMgPSBmcmFtZWR1cl9uczsKKwl2YmxhbmstPmh3 bW9kZSA9ICptb2RlOworCisJRFJNX0RFQlVHKCJjcnRjICV1OiBod21vZGU6IGh0b3RhbCAlZCwg dnRvdGFsICVkLCB2ZGlzcGxheSAlZFxuIiwKKwkJICBjcnRjLT5iYXNlLmlkLCBtb2RlLT5jcnRj X2h0b3RhbCwKKwkJICBtb2RlLT5jcnRjX3Z0b3RhbCwgbW9kZS0+Y3J0Y192ZGlzcGxheSk7CisJ RFJNX0RFQlVHKCJjcnRjICV1OiBjbG9jayAlZCBrSHogZnJhbWVkdXIgJWQgbGluZWR1ciAlZFxu IiwKKwkJICBjcnRjLT5iYXNlLmlkLCBkb3RjbG9jaywgZnJhbWVkdXJfbnMsIGxpbmVkdXJfbnMp OworfQorRVhQT1JUX1NZTUJPTChkcm1fY2FsY190aW1lc3RhbXBpbmdfY29uc3RhbnRzKTsKKwor LyoqCisgKiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zIC0gcHJlY2lzZSB2 YmxhbmsgdGltZXN0YW1wIGhlbHBlcgorICogQGRldjogRFJNIGRldmljZQorICogQHBpcGU6IGlu ZGV4IG9mIENSVEMgd2hvc2UgdmJsYW5rIHRpbWVzdGFtcCB0byByZXRyaWV2ZQorICogQG1heF9l cnJvcjogRGVzaXJlZCBtYXhpbXVtIGFsbG93YWJsZSBlcnJvciBpbiB0aW1lc3RhbXBzIChuYW5v c2VjcykKKyAqICAgICAgICAgICAgIE9uIHJldHVybiBjb250YWlucyB0cnVlIG1heGltdW0gZXJy b3Igb2YgdGltZXN0YW1wCisgKiBAdmJsYW5rX3RpbWU6IFBvaW50ZXIgdG8gc3RydWN0IHRpbWV2 YWwgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIHRpbWVzdGFtcAorICogQGluX3ZibGFua19pcnE6 CisgKiAgICAgVHJ1ZSB3aGVuIGNhbGxlZCBmcm9tIGRybV9jcnRjX2hhbmRsZV92YmxhbmsoKS4g IFNvbWUgZHJpdmVycworICogICAgIG5lZWQgdG8gYXBwbHkgc29tZSB3b3JrYXJvdW5kcyBmb3Ig Z3B1LXNwZWNpZmljIHZibGFuayBpcnEgcXVpcmtzCisgKiAgICAgaWYgZmxhZyBpcyBzZXQuCisg KgorICogSW1wbGVtZW50cyBjYWxjdWxhdGlvbiBvZiBleGFjdCB2YmxhbmsgdGltZXN0YW1wcyBm cm9tIGdpdmVuIGRybV9kaXNwbGF5X21vZGUKKyAqIHRpbWluZ3MgYW5kIGN1cnJlbnQgdmlkZW8g c2Nhbm91dCBwb3NpdGlvbiBvZiBhIENSVEMuIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tCisgKiB3 aXRoaW4gZ2V0X3ZibGFua190aW1lc3RhbXAoKSBpbXBsZW1lbnRhdGlvbiBvZiBhIGttcyBkcml2 ZXIgdG8gaW1wbGVtZW50IHRoZQorICogYWN0dWFsIHRpbWVzdGFtcGluZy4KKyAqCisgKiBTaG91 bGQgcmV0dXJuIHRpbWVzdGFtcHMgY29uZm9ybWluZyB0byB0aGUgT01MX3N5bmNfY29udHJvbCBP cGVuTUwKKyAqIGV4dGVuc2lvbiBzcGVjaWZpY2F0aW9uLiBUaGUgdGltZXN0YW1wIGNvcnJlc3Bv bmRzIHRvIHRoZSBlbmQgb2YKKyAqIHRoZSB2YmxhbmsgaW50ZXJ2YWwsIGFrYSBzdGFydCBvZiBz Y2Fub3V0IG9mIHRvcG1vc3QtbGVmdG1vc3QgZGlzcGxheQorICogcGl4ZWwgaW4gdGhlIGZvbGxv d2luZyB2aWRlbyBmcmFtZS4KKyAqCisgKiBSZXF1aXJlcyBzdXBwb3J0IGZvciBvcHRpb25hbCBk ZXYtPmRyaXZlci0+Z2V0X3NjYW5vdXRfcG9zaXRpb24oKQorICogaW4ga21zIGRyaXZlciwgcGx1 cyBhIGJpdCBvZiBzZXR1cCBjb2RlIHRvIHByb3ZpZGUgYSBkcm1fZGlzcGxheV9tb2RlCisgKiB0 aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSB0cnVlIHNjYW5vdXQgdGltaW5nLgorICoKKyAqIFRoZSBj dXJyZW50IGltcGxlbWVudGF0aW9uIG9ubHkgaGFuZGxlcyBzdGFuZGFyZCB2aWRlbyBtb2Rlcy4g SXQKKyAqIHJldHVybnMgYXMgbm8gb3BlcmF0aW9uIGlmIGEgZG91Ymxlc2NhbiBvciBpbnRlcmxh Y2VkIHZpZGVvIG1vZGUgaXMKKyAqIGFjdGl2ZS4gSGlnaGVyIGxldmVsIGNvZGUgaXMgZXhwZWN0 ZWQgdG8gaGFuZGxlIHRoaXMuCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBp bXBsZW1lbnQgdGhlICZkcm1fZHJpdmVyLmdldF92YmxhbmtfdGltZXN0YW1wCisgKiBkaXJlY3Rs eSwgaWYgdGhlIGRyaXZlciBpbXBsZW1lbnRzIHRoZSAmZHJtX2RyaXZlci5nZXRfc2Nhbm91dF9w b3NpdGlvbiBob29rLgorICoKKyAqIE5vdGUgdGhhdCBhdG9taWMgZHJpdmVycyBtdXN0IGNhbGwg ZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cygpIGJlZm9yZQorICogZW5hYmxpbmcgYSBD UlRDLiBUaGUgYXRvbWljIGhlbHBlcnMgYWxyZWFkeSB0YWtlIGNhcmUgb2YgdGhhdCBpbgorICog ZHJtX2F0b21pY19oZWxwZXJfdXBkYXRlX2xlZ2FjeV9tb2Rlc2V0X3N0YXRlKCkuCisgKgorICog UmV0dXJuczoKKyAqCisgKiBSZXR1cm5zIHRydWUgb24gc3VjY2VzcywgYW5kIGZhbHNlIG9uIGZh aWx1cmUsIGkuZS4gd2hlbiBubyBhY2N1cmF0ZQorICogdGltZXN0YW1wIGNvdWxkIGJlIGFjcXVp cmVkLgorICovCitib29sIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3NjYW5vdXRwb3Moc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwKKwkJCQkJICAgdW5zaWduZWQgaW50IHBpcGUsCisJCQkJCSAg IGludCAqbWF4X2Vycm9yLAorCQkJCQkgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rX3RpbWUsCisJ CQkJCSAgIGJvb2wgaW5fdmJsYW5rX2lycSkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0dl9ldGltZTsK KwlrdGltZV90IHN0aW1lLCBldGltZTsKKwlib29sIHZibF9zdGF0dXM7CisJc3RydWN0IGRybV9j cnRjICpjcnRjOworCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlOworCXN0cnVj dCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFua1twaXBlXTsKKwlpbnQgdnBv cywgaHBvcywgaTsKKwlpbnQgZGVsdGFfbnMsIGR1cmF0aW9uX25zOworCisJaWYgKCFkcm1fY29y ZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQorCQlyZXR1cm4gZmFsc2U7CisK KwljcnRjID0gZHJtX2NydGNfZnJvbV9pbmRleChkZXYsIHBpcGUpOworCisJaWYgKHBpcGUgPj0g ZGV2LT5udW1fY3J0Y3MgfHwgIWNydGMpIHsKKwkJRFJNX0VSUk9SKCJJbnZhbGlkIGNydGMgJXVc biIsIHBpcGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyogU2Nhbm91dCBwb3NpdGlvbiBx dWVyeSBub3Qgc3VwcG9ydGVkPyBTaG91bGQgbm90IGhhcHBlbi4gKi8KKwlpZiAoIWRldi0+ZHJp dmVyLT5nZXRfc2Nhbm91dF9wb3NpdGlvbikgeworCQlEUk1fRVJST1IoIkNhbGxlZCBmcm9tIGRy aXZlciB3L28gZ2V0X3NjYW5vdXRfcG9zaXRpb24oKSE/XG4iKTsKKwkJcmV0dXJuIGZhbHNlOwor CX0KKworCWlmIChkcm1fZHJ2X3VzZXNfYXRvbWljX21vZGVzZXQoZGV2KSkKKwkJbW9kZSA9ICZ2 YmxhbmstPmh3bW9kZTsKKwllbHNlCisJCW1vZGUgPSAmY3J0Yy0+aHdtb2RlOworCisJLyogSWYg bW9kZSB0aW1pbmcgdW5kZWZpbmVkLCBqdXN0IHJldHVybiBhcyBuby1vcDoKKwkgKiBIYXBwZW5z IGR1cmluZyBpbml0aWFsIG1vZGVzZXR0aW5nIG9mIGEgY3J0Yy4KKwkgKi8KKwlpZiAobW9kZS0+ Y3J0Y19jbG9jayA9PSAwKSB7CisJCURSTV9ERUJVRygiY3J0YyAldTogTm9vcCBkdWUgdG8gdW5p bml0aWFsaXplZCBtb2RlLlxuIiwgcGlwZSk7CisJCVdBUk5fT05fT05DRShkcm1fZHJ2X3VzZXNf YXRvbWljX21vZGVzZXQoZGV2KSk7CisKKwkJcmV0dXJuIGZhbHNlOworCX0KKworCS8qIEdldCBj dXJyZW50IHNjYW5vdXQgcG9zaXRpb24gd2l0aCBzeXN0ZW0gdGltZXN0YW1wLgorCSAqIFJlcGVh dCBxdWVyeSB1cCB0byBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVMgdGltZXMKKwkgKiBpZiBzaW5n bGUgcXVlcnkgdGFrZXMgbG9uZ2VyIHRoYW4gbWF4X2Vycm9yIG5hbm9zZWNvbmRzLgorCSAqCisJ ICogVGhpcyBndWFyYW50ZWVzIGEgdGlnaHQgYm91bmQgb24gbWF4aW11bSBlcnJvciBpZgorCSAq IGNvZGUgZ2V0cyBwcmVlbXB0ZWQgb3IgZGVsYXllZCBmb3Igc29tZSByZWFzb24uCisJICovCisJ Zm9yIChpID0gMDsgaSA8IERSTV9USU1FU1RBTVBfTUFYUkVUUklFUzsgaSsrKSB7CisJCS8qCisJ CSAqIEdldCB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBzY2Fub3V0IHBvc2l0aW9uIHZwb3MsIGhw b3MsCisJCSAqIGFuZCBib3VuZGluZyB0aW1lc3RhbXBzIHN0aW1lLCBldGltZSwgcHJlL3Bvc3Qg cXVlcnkuCisJCSAqLworCQl2Ymxfc3RhdHVzID0gZGV2LT5kcml2ZXItPmdldF9zY2Fub3V0X3Bv c2l0aW9uKGRldiwgcGlwZSwKKwkJCQkJCQkgICAgICAgaW5fdmJsYW5rX2lycSwKKwkJCQkJCQkg ICAgICAgJnZwb3MsICZocG9zLAorCQkJCQkJCSAgICAgICAmc3RpbWUsICZldGltZSwKKwkJCQkJ CQkgICAgICAgbW9kZSk7CisKKwkJLyogUmV0dXJuIGFzIG5vLW9wIGlmIHNjYW5vdXQgcXVlcnkg dW5zdXBwb3J0ZWQgb3IgZmFpbGVkLiAqLworCQlpZiAoIXZibF9zdGF0dXMpIHsKKwkJCURSTV9E RUJVRygiY3J0YyAldSA6IHNjYW5vdXRwb3MgcXVlcnkgZmFpbGVkLlxuIiwKKwkJCQkgIHBpcGUp OworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJLyogQ29tcHV0ZSB1bmNlcnRhaW50eSBpbiB0 aW1lc3RhbXAgb2Ygc2Nhbm91dCBwb3NpdGlvbiBxdWVyeS4gKi8KKwkJZHVyYXRpb25fbnMgPSBr dGltZV90b19ucyhldGltZSkgLSBrdGltZV90b19ucyhzdGltZSk7CisKKwkJLyogQWNjZXB0IHJl c3VsdCB3aXRoIDwgIG1heF9lcnJvciBuc2VjcyB0aW1pbmcgdW5jZXJ0YWludHkuICovCisJCWlm IChkdXJhdGlvbl9ucyA8PSAqbWF4X2Vycm9yKQorCQkJYnJlYWs7CisJfQorCisJLyogTm9pc3kg c3lzdGVtIHRpbWluZz8gKi8KKwlpZiAoaSA9PSBEUk1fVElNRVNUQU1QX01BWFJFVFJJRVMpIHsK KwkJRFJNX0RFQlVHKCJjcnRjICV1OiBOb2lzeSB0aW1lc3RhbXAgJWQgdXMgPiAlZCB1cyBbJWQg cmVwc10uXG4iLAorCQkJICBwaXBlLCBkdXJhdGlvbl9ucy8xMDAwLCAqbWF4X2Vycm9yLzEwMDAs IGkpOworCX0KKworCS8qIFJldHVybiB1cHBlciBib3VuZCBvZiB0aW1lc3RhbXAgcHJlY2lzaW9u IGVycm9yLiAqLworCSptYXhfZXJyb3IgPSBkdXJhdGlvbl9uczsKKworCS8qIENvbnZlcnQgc2Nh bm91dCBwb3NpdGlvbiBpbnRvIGVsYXBzZWQgdGltZSBhdCByYXdfdGltZSBxdWVyeQorCSAqIHNp bmNlIHN0YXJ0IG9mIHNjYW5vdXQgYXQgZmlyc3QgZGlzcGxheSBzY2FubGluZS4gZGVsdGFfbnMK KwkgKiBjYW4gYmUgbmVnYXRpdmUgaWYgc3RhcnQgb2Ygc2Nhbm91dCBoYXNuJ3QgaGFwcGVuZWQg eWV0LgorCSAqLworCWRlbHRhX25zID0gZGl2X3M2NCgxMDAwMDAwTEwgKiAodnBvcyAqIG1vZGUt PmNydGNfaHRvdGFsICsgaHBvcyksCisJCQkgICBtb2RlLT5jcnRjX2Nsb2NrKTsKKworCWlmICgh ZHJtX3RpbWVzdGFtcF9tb25vdG9uaWMpCisJCWV0aW1lID0ga3RpbWVfbW9ub190b19yZWFsKGV0 aW1lKTsKKworCS8qIHNhdmUgdGhpcyBvbmx5IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMgKi8KKwl0 dl9ldGltZSA9IGt0aW1lX3RvX3RpbWV2YWwoZXRpbWUpOworCS8qIFN1YnRyYWN0IHRpbWUgZGVs dGEgZnJvbSByYXcgdGltZXN0YW1wIHRvIGdldCBmaW5hbAorCSAqIHZibGFua190aW1lIHRpbWVz dGFtcCBmb3IgZW5kIG9mIHZibGFuay4KKwkgKi8KKwlldGltZSA9IGt0aW1lX3N1Yl9ucyhldGlt ZSwgZGVsdGFfbnMpOworCSp2YmxhbmtfdGltZSA9IGt0aW1lX3RvX3RpbWV2YWwoZXRpbWUpOwor CisJRFJNX0RFQlVHX1ZCTCgiY3J0YyAldSA6IHYgcCglZCwlZClAICVsZC4lbGQgLT4gJWxkLiVs ZCBbZSAlZCB1cywgJWQgcmVwXVxuIiwKKwkJICAgICAgcGlwZSwgaHBvcywgdnBvcywKKwkJICAg ICAgKGxvbmcpdHZfZXRpbWUudHZfc2VjLCAobG9uZyl0dl9ldGltZS50dl91c2VjLAorCQkgICAg ICAobG9uZyl2YmxhbmtfdGltZS0+dHZfc2VjLCAobG9uZyl2YmxhbmtfdGltZS0+dHZfdXNlYywK KwkJICAgICAgZHVyYXRpb25fbnMvMTAwMCwgaSk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KK0VYUE9S VF9TWU1CT0woZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyk7CisKK3N0YXRp YyBzdHJ1Y3QgdGltZXZhbCBnZXRfZHJtX3RpbWVzdGFtcCh2b2lkKQoreworCWt0aW1lX3Qgbm93 OworCisJbm93ID0gZHJtX3RpbWVzdGFtcF9tb25vdG9uaWMgPyBrdGltZV9nZXQoKSA6IGt0aW1l X2dldF9yZWFsKCk7CisJcmV0dXJuIGt0aW1lX3RvX3RpbWV2YWwobm93KTsKK30KKworLyoqCisg KiBkcm1fZ2V0X2xhc3RfdmJsdGltZXN0YW1wIC0gcmV0cmlldmUgcmF3IHRpbWVzdGFtcCBmb3Ig dGhlIG1vc3QgcmVjZW50CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmJsYW5rIGlu dGVydmFsCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAcGlwZTogaW5kZXggb2YgQ1JUQyB3aG9z ZSB2YmxhbmsgdGltZXN0YW1wIHRvIHJldHJpZXZlCisgKiBAdHZibGFuazogUG9pbnRlciB0byB0 YXJnZXQgc3RydWN0IHRpbWV2YWwgd2hpY2ggc2hvdWxkIHJlY2VpdmUgdGhlIHRpbWVzdGFtcAor ICogQGluX3ZibGFua19pcnE6CisgKiAgICAgVHJ1ZSB3aGVuIGNhbGxlZCBmcm9tIGRybV9jcnRj X2hhbmRsZV92YmxhbmsoKS4gIFNvbWUgZHJpdmVycworICogICAgIG5lZWQgdG8gYXBwbHkgc29t ZSB3b3JrYXJvdW5kcyBmb3IgZ3B1LXNwZWNpZmljIHZibGFuayBpcnEgcXVpcmtzCisgKiAgICAg aWYgZmxhZyBpcyBzZXQuCisgKgorICogRmV0Y2hlcyB0aGUgc3lzdGVtIHRpbWVzdGFtcCBjb3Jy ZXNwb25kaW5nIHRvIHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudAorICogdmJsYW5rIGludGVy dmFsIG9uIHNwZWNpZmllZCBDUlRDLiBNYXkgY2FsbCBpbnRvIGttcy1kcml2ZXIgdG8KKyAqIGNv bXB1dGUgdGhlIHRpbWVzdGFtcCB3aXRoIGEgaGlnaC1wcmVjaXNpb24gR1BVIHNwZWNpZmljIG1l dGhvZC4KKyAqCisgKiBSZXR1cm5zIHplcm8gaWYgdGltZXN0YW1wIG9yaWdpbmF0ZXMgZnJvbSB1 bmNvcnJlY3RlZCBkb19nZXR0aW1lb2ZkYXkoKQorICogY2FsbCwgaS5lLiwgaXQgaXNuJ3QgdmVy eSBwcmVjaXNlbHkgbG9ja2VkIHRvIHRoZSB0cnVlIHZibGFuay4KKyAqCisgKiBSZXR1cm5zOgor ICogVHJ1ZSBpZiB0aW1lc3RhbXAgaXMgY29uc2lkZXJlZCB0byBiZSB2ZXJ5IHByZWNpc2UsIGZh bHNlIG90aGVyd2lzZS4KKyAqLworc3RhdGljIGJvb2wKK2RybV9nZXRfbGFzdF92Ymx0aW1lc3Rh bXAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUsCisJCQkgIHN0cnVj dCB0aW1ldmFsICp0dmJsYW5rLCBib29sIGluX3ZibGFua19pcnEpCit7CisJYm9vbCByZXQgPSBm YWxzZTsKKworCS8qIERlZmluZSByZXF1ZXN0ZWQgbWF4aW11bSBlcnJvciBvbiB0aW1lc3RhbXBz IChuYW5vc2Vjb25kcykuICovCisJaW50IG1heF9lcnJvciA9IChpbnQpIGRybV90aW1lc3RhbXBf cHJlY2lzaW9uICogMTAwMDsKKworCS8qIFF1ZXJ5IGRyaXZlciBpZiBwb3NzaWJsZSBhbmQgcHJl Y2lzaW9uIHRpbWVzdGFtcGluZyBlbmFibGVkLiAqLworCWlmIChkZXYtPmRyaXZlci0+Z2V0X3Zi bGFua190aW1lc3RhbXAgJiYgKG1heF9lcnJvciA+IDApKQorCQlyZXQgPSBkZXYtPmRyaXZlci0+ Z2V0X3ZibGFua190aW1lc3RhbXAoZGV2LCBwaXBlLCAmbWF4X2Vycm9yLAorCQkJCQkJCXR2Ymxh bmssIGluX3ZibGFua19pcnEpOworCisJLyogR1BVIGhpZ2ggcHJlY2lzaW9uIHRpbWVzdGFtcCBx dWVyeSB1bnN1cHBvcnRlZCBvciBmYWlsZWQuCisJICogUmV0dXJuIGN1cnJlbnQgbW9ub3Rvbmlj L2dldHRpbWVvZmRheSB0aW1lc3RhbXAgYXMgYmVzdCBlc3RpbWF0ZS4KKwkgKi8KKwlpZiAoIXJl dCkKKwkJKnR2YmxhbmsgPSBnZXRfZHJtX3RpbWVzdGFtcCgpOworCisJcmV0dXJuIHJldDsKK30K KworLyoqCisgKiBkcm1fY3J0Y192YmxhbmtfY291bnQgLSByZXRyaWV2ZSAiY29va2VkIiB2Ymxh bmsgY291bnRlciB2YWx1ZQorICogQGNydGM6IHdoaWNoIGNvdW50ZXIgdG8gcmV0cmlldmUKKyAq CisgKiBGZXRjaGVzIHRoZSAiY29va2VkIiB2YmxhbmsgY291bnQgdmFsdWUgdGhhdCByZXByZXNl bnRzIHRoZSBudW1iZXIgb2YKKyAqIHZibGFuayBldmVudHMgc2luY2UgdGhlIHN5c3RlbSB3YXMg Ym9vdGVkLCBpbmNsdWRpbmcgbG9zdCBldmVudHMgZHVlIHRvCisgKiBtb2Rlc2V0dGluZyBhY3Rp dml0eS4KKyAqCisgKiBSZXR1cm5zOgorICogVGhlIHNvZnR3YXJlIHZibGFuayBjb3VudGVyLgor ICovCit1MzIgZHJtX2NydGNfdmJsYW5rX2NvdW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sK KwlyZXR1cm4gZHJtX3ZibGFua19jb3VudChjcnRjLT5kZXYsIGRybV9jcnRjX2luZGV4KGNydGMp KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NydGNfdmJsYW5rX2NvdW50KTsKKworLyoqCisgKiBk cm1fdmJsYW5rX2NvdW50X2FuZF90aW1lIC0gcmV0cmlldmUgImNvb2tlZCIgdmJsYW5rIGNvdW50 ZXIgdmFsdWUgYW5kIHRoZQorICogICAgIHN5c3RlbSB0aW1lc3RhbXAgY29ycmVzcG9uZGluZyB0 byB0aGF0IHZibGFuayBjb3VudGVyIHZhbHVlLgorICogQGRldjogRFJNIGRldmljZQorICogQHBp cGU6IGluZGV4IG9mIENSVEMgd2hvc2UgY291bnRlciB0byByZXRyaWV2ZQorICogQHZibGFua3Rp bWU6IFBvaW50ZXIgdG8gc3RydWN0IHRpbWV2YWwgdG8gcmVjZWl2ZSB0aGUgdmJsYW5rIHRpbWVz dGFtcC4KKyAqCisgKiBGZXRjaGVzIHRoZSAiY29va2VkIiB2YmxhbmsgY291bnQgdmFsdWUgdGhh dCByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YKKyAqIHZibGFuayBldmVudHMgc2luY2UgdGhlIHN5 c3RlbSB3YXMgYm9vdGVkLCBpbmNsdWRpbmcgbG9zdCBldmVudHMgZHVlIHRvCisgKiBtb2Rlc2V0 dGluZyBhY3Rpdml0eS4gUmV0dXJucyBjb3JyZXNwb25kaW5nIHN5c3RlbSB0aW1lc3RhbXAgb2Yg dGhlIHRpbWUKKyAqIG9mIHRoZSB2YmxhbmsgaW50ZXJ2YWwgdGhhdCBjb3JyZXNwb25kcyB0byB0 aGUgY3VycmVudCB2YmxhbmsgY291bnRlciB2YWx1ZS4KKyAqCisgKiBUaGlzIGlzIHRoZSBsZWdh Y3kgdmVyc2lvbiBvZiBkcm1fY3J0Y192YmxhbmtfY291bnRfYW5kX3RpbWUoKS4KKyAqLworc3Rh dGljIHUzMiBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYs IHVuc2lnbmVkIGludCBwaXBlLAorCQkJCSAgICAgc3RydWN0IHRpbWV2YWwgKnZibGFua3RpbWUp Cit7CisJc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVd OworCXUzMiB2YmxhbmtfY291bnQ7CisJdW5zaWduZWQgaW50IHNlcTsKKworCWlmIChXQVJOX09O KHBpcGUgPj0gZGV2LT5udW1fY3J0Y3MpKSB7CisJCSp2Ymxhbmt0aW1lID0gKHN0cnVjdCB0aW1l dmFsKSB7IDAgfTsKKwkJcmV0dXJuIDA7CisJfQorCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJl Z2luKCZ2YmxhbmstPnNlcWxvY2spOworCQl2YmxhbmtfY291bnQgPSB2YmxhbmstPmNvdW50Owor CQkqdmJsYW5rdGltZSA9IHZibGFuay0+dGltZTsKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ2 YmxhbmstPnNlcWxvY2ssIHNlcSkpOworCisJcmV0dXJuIHZibGFua19jb3VudDsKK30KKworLyoq CisgKiBkcm1fY3J0Y192YmxhbmtfY291bnRfYW5kX3RpbWUgLSByZXRyaWV2ZSAiY29va2VkIiB2 YmxhbmsgY291bnRlciB2YWx1ZQorICogICAgIGFuZCB0aGUgc3lzdGVtIHRpbWVzdGFtcCBjb3Jy ZXNwb25kaW5nIHRvIHRoYXQgdmJsYW5rIGNvdW50ZXIgdmFsdWUKKyAqIEBjcnRjOiB3aGljaCBj b3VudGVyIHRvIHJldHJpZXZlCisgKiBAdmJsYW5rdGltZTogUG9pbnRlciB0byBzdHJ1Y3QgdGlt ZXZhbCB0byByZWNlaXZlIHRoZSB2YmxhbmsgdGltZXN0YW1wLgorICoKKyAqIEZldGNoZXMgdGhl ICJjb29rZWQiIHZibGFuayBjb3VudCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciBv ZgorICogdmJsYW5rIGV2ZW50cyBzaW5jZSB0aGUgc3lzdGVtIHdhcyBib290ZWQsIGluY2x1ZGlu ZyBsb3N0IGV2ZW50cyBkdWUgdG8KKyAqIG1vZGVzZXR0aW5nIGFjdGl2aXR5LiBSZXR1cm5zIGNv cnJlc3BvbmRpbmcgc3lzdGVtIHRpbWVzdGFtcCBvZiB0aGUgdGltZQorICogb2YgdGhlIHZibGFu ayBpbnRlcnZhbCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IHZibGFuayBjb3VudGVy IHZhbHVlLgorICovCit1MzIgZHJtX2NydGNfdmJsYW5rX2NvdW50X2FuZF90aW1lKHN0cnVjdCBk cm1fY3J0YyAqY3J0YywKKwkJCQkgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSkKK3sKKwly ZXR1cm4gZHJtX3ZibGFua19jb3VudF9hbmRfdGltZShjcnRjLT5kZXYsIGRybV9jcnRjX2luZGV4 KGNydGMpLAorCQkJCQkgdmJsYW5rdGltZSk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jcnRjX3Zi bGFua19jb3VudF9hbmRfdGltZSk7CisKK3N0YXRpYyB2b2lkIHNlbmRfdmJsYW5rX2V2ZW50KHN0 cnVjdCBkcm1fZGV2aWNlICpkZXYsCisJCXN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQg KmUsCisJCXVuc2lnbmVkIGxvbmcgc2VxLCBzdHJ1Y3QgdGltZXZhbCAqbm93KQoreworCWUtPmV2 ZW50LnNlcXVlbmNlID0gc2VxOworCWUtPmV2ZW50LnR2X3NlYyA9IG5vdy0+dHZfc2VjOworCWUt PmV2ZW50LnR2X3VzZWMgPSBub3ctPnR2X3VzZWM7CisKKwl0cmFjZV9kcm1fdmJsYW5rX2V2ZW50 X2RlbGl2ZXJlZChlLT5iYXNlLmZpbGVfcHJpdiwgZS0+cGlwZSwKKwkJCQkJIGUtPmV2ZW50LnNl cXVlbmNlKTsKKworCWRybV9zZW5kX2V2ZW50X2xvY2tlZChkZXYsICZlLT5iYXNlKTsKK30KKwor LyoqCisgKiBkcm1fY3J0Y19hcm1fdmJsYW5rX2V2ZW50IC0gYXJtIHZibGFuayBldmVudCBhZnRl ciBwYWdlZmxpcAorICogQGNydGM6IHRoZSBzb3VyY2UgQ1JUQyBvZiB0aGUgdmJsYW5rIGV2ZW50 CisgKiBAZTogdGhlIGV2ZW50IHRvIHNlbmQKKyAqCisgKiBBIGxvdCBvZiBkcml2ZXJzIG5lZWQg dG8gZ2VuZXJhdGUgdmJsYW5rIGV2ZW50cyBmb3IgdGhlIHZlcnkgbmV4dCB2YmxhbmsKKyAqIGlu dGVycnVwdC4gRm9yIGV4YW1wbGUgd2hlbiB0aGUgcGFnZSBmbGlwIGludGVycnVwdCBoYXBwZW5z IHdoZW4gdGhlIHBhZ2UKKyAqIGZsaXAgZ2V0cyBhcm1lZCwgYnV0IG5vdCB3aGVuIGl0IGFjdHVh bGx5IGV4ZWN1dGVzIHdpdGhpbiB0aGUgbmV4dCB2YmxhbmsKKyAqIHBlcmlvZC4gVGhpcyBoZWxw ZXIgZnVuY3Rpb24gaW1wbGVtZW50cyBleGFjdGx5IHRoZSByZXF1aXJlZCB2YmxhbmsgYXJtaW5n CisgKiBiZWhhdmlvdXIuCisgKgorICogTk9URTogRHJpdmVycyB1c2luZyB0aGlzIHRvIHNlbmQg b3V0IHRoZSAmZHJtX2NydGNfc3RhdGUuZXZlbnQgYXMgcGFydCBvZiBhbgorICogYXRvbWljIGNv bW1pdCBtdXN0IGVuc3VyZSB0aGF0IHRoZSBuZXh0IHZibGFuayBoYXBwZW5zIGF0IGV4YWN0bHkg dGhlIHNhbWUKKyAqIHRpbWUgYXMgdGhlIGF0b21pYyBjb21taXQgaXMgY29tbWl0dGVkIHRvIHRo ZSBoYXJkd2FyZS4gVGhpcyBmdW5jdGlvbiBpdHNlbGYKKyAqIGRvZXMgKipub3QqKiBwcm90ZWN0 IGFnYWluIHRoZSBuZXh0IHZibGFuayBpbnRlcnJ1cHQgcmFjaW5nIHdpdGggZWl0aGVyIHRoaXMK KyAqIGZ1bmN0aW9uIGNhbGwgb3IgdGhlIGF0b21pYyBjb21taXQgb3BlcmF0aW9uLiBBIHBvc3Np YmxlIHNlcXVlbmNlIGNvdWxkIGJlOgorICoKKyAqIDEuIERyaXZlciBjb21taXRzIG5ldyBoYXJk d2FyZSBzdGF0ZSBpbnRvIHZibGFuay1zeW5jaHJvbml6ZWQgcmVnaXN0ZXJzLgorICogMi4gQSB2 YmxhbmsgaGFwcGVucywgY29tbWl0dGluZyB0aGUgaGFyZHdhcmUgc3RhdGUuIEFsc28gdGhlIGNv cnJlc3BvbmRpbmcKKyAqICAgIHZibGFuayBpbnRlcnJ1cHQgaXMgZmlyZWQgb2ZmIGFuZCBmdWxs eSBwcm9jZXNzZWQgYnkgdGhlIGludGVycnVwdAorICogICAgaGFuZGxlci4KKyAqIDMuIFRoZSBh dG9taWMgY29tbWl0IG9wZXJhdGlvbiBwcm9jZWVkcyB0byBjYWxsIGRybV9jcnRjX2FybV92Ymxh bmtfZXZlbnQoKS4KKyAqIDQuIFRoZSBldmVudCBpcyBvbmx5IHNlbmQgb3V0IGZvciB0aGUgbmV4 dCB2YmxhbmssIHdoaWNoIGlzIHdyb25nLgorICoKKyAqIEFuIGVxdWl2YWxlbnQgcmFjZSBjYW4g aGFwcGVuIHdoZW4gdGhlIGRyaXZlciBjYWxscworICogZHJtX2NydGNfYXJtX3ZibGFua19ldmVu dCgpIGJlZm9yZSB3cml0aW5nIG91dCB0aGUgbmV3IGhhcmR3YXJlIHN0YXRlLgorICoKKyAqIFRo ZSBvbmx5IHdheSB0byBtYWtlIHRoaXMgd29yayBzYWZlbHkgaXMgdG8gcHJldmVudCB0aGUgdmJs YW5rIGZyb20gZmlyaW5nCisgKiAoYW5kIHRoZSBoYXJkd2FyZSBmcm9tIGNvbW1pdHRpbmcgYW55 dGhpbmcgZWxzZSkgdW50aWwgdGhlIGVudGlyZSBhdG9taWMKKyAqIGNvbW1pdCBzZXF1ZW5jZSBo YXMgcnVuIHRvIGNvbXBsZXRpb24uIElmIHRoZSBoYXJkd2FyZSBkb2VzIG5vdCBoYXZlIHN1Y2gg YQorICogZmVhdHVyZSAoZS5nLiB1c2luZyBhICJnbyIgYml0KSwgdGhlbiBpdCBpcyB1bnNhZmUg dG8gdXNlIHRoaXMgZnVuY3Rpb25zLgorICogSW5zdGVhZCBkcml2ZXJzIG5lZWQgdG8gbWFudWFs bHkgc2VuZCBvdXQgdGhlIGV2ZW50IGZyb20gdGhlaXIgaW50ZXJydXB0CisgKiBoYW5kbGVyIGJ5 IGNhbGxpbmcgZHJtX2NydGNfc2VuZF92YmxhbmtfZXZlbnQoKSBhbmQgbWFrZSBzdXJlIHRoYXQg dGhlcmUncyBubworICogcG9zc2libGUgcmFjZSB3aXRoIHRoZSBoYXJkd2FyZSBjb21taXR0aW5n IHRoZSBhdG9taWMgdXBkYXRlLgorICoKKyAqIENhbGxlciBtdXN0IGhvbGQgZXZlbnQgbG9jay4g Q2FsbGVyIG11c3QgYWxzbyBob2xkIGEgdmJsYW5rIHJlZmVyZW5jZSBmb3IKKyAqIHRoZSBldmVu dCBAZSwgd2hpY2ggd2lsbCBiZSBkcm9wcGVkIHdoZW4gdGhlIG5leHQgdmJsYW5rIGFycml2ZXMu CisgKi8KK3ZvaWQgZHJtX2NydGNfYXJtX3ZibGFua19ldmVudChzdHJ1Y3QgZHJtX2NydGMgKmNy dGMsCisJCQkgICAgICAgc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZSkKK3sKKwlz dHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXVuc2lnbmVkIGludCBwaXBlID0g ZHJtX2NydGNfaW5kZXgoY3J0Yyk7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+ZXZlbnRf bG9jayk7CisKKwllLT5waXBlID0gcGlwZTsKKwllLT5ldmVudC5zZXF1ZW5jZSA9IGRybV92Ymxh bmtfY291bnQoZGV2LCBwaXBlKTsKKwllLT5ldmVudC5jcnRjX2lkID0gY3J0Yy0+YmFzZS5pZDsK KwlsaXN0X2FkZF90YWlsKCZlLT5iYXNlLmxpbmssICZkZXYtPnZibGFua19ldmVudF9saXN0KTsK K30KK0VYUE9SVF9TWU1CT0woZHJtX2NydGNfYXJtX3ZibGFua19ldmVudCk7CisKKy8qKgorICog ZHJtX2NydGNfc2VuZF92YmxhbmtfZXZlbnQgLSBoZWxwZXIgdG8gc2VuZCB2YmxhbmsgZXZlbnQg YWZ0ZXIgcGFnZWZsaXAKKyAqIEBjcnRjOiB0aGUgc291cmNlIENSVEMgb2YgdGhlIHZibGFuayBl dmVudAorICogQGU6IHRoZSBldmVudCB0byBzZW5kCisgKgorICogVXBkYXRlcyBzZXF1ZW5jZSAj IGFuZCB0aW1lc3RhbXAgb24gZXZlbnQgZm9yIHRoZSBtb3N0IHJlY2VudGx5IHByb2Nlc3NlZAor ICogdmJsYW5rLCBhbmQgc2VuZHMgaXQgdG8gdXNlcnNwYWNlLiAgQ2FsbGVyIG11c3QgaG9sZCBl dmVudCBsb2NrLgorICoKKyAqIFNlZSBkcm1fY3J0Y19hcm1fdmJsYW5rX2V2ZW50KCkgZm9yIGEg aGVscGVyIHdoaWNoIGNhbiBiZSB1c2VkIGluIGNlcnRhaW4KKyAqIHNpdHVhdGlvbiwgZXNwZWNp YWxseSB0byBzZW5kIG91dCBldmVudHMgZm9yIGF0b21pYyBjb21taXQgb3BlcmF0aW9ucy4KKyAq Lwordm9pZCBkcm1fY3J0Y19zZW5kX3ZibGFua19ldmVudChzdHJ1Y3QgZHJtX2NydGMgKmNydGMs CisJCQkJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZSkKK3sKKwlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXVuc2lnbmVkIGludCBzZXEsIHBpcGUgPSBkcm1f Y3J0Y19pbmRleChjcnRjKTsKKwlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwlpZiAoZGV2LT5udW1f Y3J0Y3MgPiAwKSB7CisJCXNlcSA9IGRybV92YmxhbmtfY291bnRfYW5kX3RpbWUoZGV2LCBwaXBl LCAmbm93KTsKKwl9IGVsc2UgeworCQlzZXEgPSAwOworCisJCW5vdyA9IGdldF9kcm1fdGltZXN0 YW1wKCk7CisJfQorCWUtPnBpcGUgPSBwaXBlOworCWUtPmV2ZW50LmNydGNfaWQgPSBjcnRjLT5i YXNlLmlkOworCXNlbmRfdmJsYW5rX2V2ZW50KGRldiwgZSwgc2VxLCAmbm93KTsKK30KK0VYUE9S VF9TWU1CT0woZHJtX2NydGNfc2VuZF92YmxhbmtfZXZlbnQpOworCitzdGF0aWMgaW50IF9fZW5h YmxlX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB1bnNpZ25lZCBpbnQgcGlwZSkKK3sK KwlpZiAoZHJtX2NvcmVfY2hlY2tfZmVhdHVyZShkZXYsIERSSVZFUl9NT0RFU0VUKSkgeworCQlz dHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBkcm1fY3J0Y19mcm9tX2luZGV4KGRldiwgcGlwZSk7CisK KwkJaWYgKGNydGMtPmZ1bmNzLT5lbmFibGVfdmJsYW5rKQorCQkJcmV0dXJuIGNydGMtPmZ1bmNz LT5lbmFibGVfdmJsYW5rKGNydGMpOworCX0KKworCXJldHVybiBkZXYtPmRyaXZlci0+ZW5hYmxl X3ZibGFuayhkZXYsIHBpcGUpOworfQorCisvKioKKyAqIGRybV92YmxhbmtfZW5hYmxlIC0gZW5h YmxlIHRoZSB2YmxhbmsgaW50ZXJydXB0IG9uIGEgQ1JUQworICogQGRldjogRFJNIGRldmljZQor ICogQHBpcGU6IENSVEMgaW5kZXgKKyAqCisgKiBSZXR1cm5zOgorICogWmVybyBvbiBzdWNjZXNz IG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICovCitzdGF0aWMgaW50IGRy bV92YmxhbmtfZW5hYmxlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGludCBwaXBl KQoreworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFua1twaXBl XTsKKwlpbnQgcmV0ID0gMDsKKworCWFzc2VydF9zcGluX2xvY2tlZCgmZGV2LT52YmxfbG9jayk7 CisKKwlzcGluX2xvY2soJmRldi0+dmJsYW5rX3RpbWVfbG9jayk7CisKKwlpZiAoIXZibGFuay0+ ZW5hYmxlZCkgeworCQkvKgorCQkgKiBFbmFibGUgdmJsYW5rIGlycXMgdW5kZXIgdmJsYW5rX3Rp bWVfbG9jayBwcm90ZWN0aW9uLgorCQkgKiBBbGwgdmJsYW5rIGNvdW50ICYgdGltZXN0YW1wIHVw ZGF0ZXMgYXJlIGhlbGQgb2ZmCisJCSAqIHVudGlsIHdlIGFyZSBkb25lIHJlaW5pdGlhbGl6aW5n IG1hc3RlciBjb3VudGVyIGFuZAorCQkgKiB0aW1lc3RhbXBzLiBGaWx0ZXJjb2RlIGluIGRybV9o YW5kbGVfdmJsYW5rKCkgd2lsbAorCQkgKiBwcmV2ZW50IGRvdWJsZS1hY2NvdW50aW5nIG9mIHNh bWUgdmJsYW5rIGludGVydmFsLgorCQkgKi8KKwkJcmV0ID0gX19lbmFibGVfdmJsYW5rKGRldiwg cGlwZSk7CisJCURSTV9ERUJVRygiZW5hYmxpbmcgdmJsYW5rIG9uIGNydGMgJXUsIHJldDogJWRc biIsIHBpcGUsIHJldCk7CisJCWlmIChyZXQpIHsKKwkJCWF0b21pY19kZWMoJnZibGFuay0+cmVm Y291bnQpOworCQl9IGVsc2UgeworCQkJZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoZGV2LCBwaXBl LCAwKTsKKwkJCS8qIGRybV91cGRhdGVfdmJsYW5rX2NvdW50KCkgaW5jbHVkZXMgYSB3bWIgc28g d2UganVzdAorCQkJICogbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgY29tcGlsZXIgZW1pdHMgdGhl IHdyaXRlCisJCQkgKiB0byBtYXJrIHRoZSB2YmxhbmsgYXMgZW5hYmxlZCBhZnRlciB0aGUgY2Fs bAorCQkJICogdG8gZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoKS4KKwkJCSAqLworCQkJV1JJVEVf T05DRSh2YmxhbmstPmVuYWJsZWQsIHRydWUpOworCQl9CisJfQorCisJc3Bpbl91bmxvY2soJmRl di0+dmJsYW5rX3RpbWVfbG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRybV92 YmxhbmtfZ2V0IC0gZ2V0IGEgcmVmZXJlbmNlIGNvdW50IG9uIHZibGFuayBldmVudHMKKyAqIEBk ZXY6IERSTSBkZXZpY2UKKyAqIEBwaXBlOiBpbmRleCBvZiBDUlRDIHRvIG93bgorICoKKyAqIEFj cXVpcmUgYSByZWZlcmVuY2UgY291bnQgb24gdmJsYW5rIGV2ZW50cyB0byBhdm9pZCBoYXZpbmcg dGhlbSBkaXNhYmxlZAorICogd2hpbGUgaW4gdXNlLgorICoKKyAqIFRoaXMgaXMgdGhlIGxlZ2Fj eSB2ZXJzaW9uIG9mIGRybV9jcnRjX3ZibGFua19nZXQoKS4KKyAqCisgKiBSZXR1cm5zOgorICog WmVybyBvbiBzdWNjZXNzIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBvbiBmYWlsdXJlLgorICov CitzdGF0aWMgaW50IGRybV92YmxhbmtfZ2V0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2ln bmVkIGludCBwaXBlKQoreworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYt PnZibGFua1twaXBlXTsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCWludCByZXQgPSAwOwor CisJaWYgKCFkZXYtPm51bV9jcnRjcykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoV0FSTl9P TihwaXBlID49IGRldi0+bnVtX2NydGNzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworCS8qIEdvaW5nIGZyb20gMC0+ MSBtZWFucyB3ZSBoYXZlIHRvIGVuYWJsZSBpbnRlcnJ1cHRzIGFnYWluICovCisJaWYgKGF0b21p Y19hZGRfcmV0dXJuKDEsICZ2YmxhbmstPnJlZmNvdW50KSA9PSAxKSB7CisJCXJldCA9IGRybV92 YmxhbmtfZW5hYmxlKGRldiwgcGlwZSk7CisJfSBlbHNlIHsKKwkJaWYgKCF2YmxhbmstPmVuYWJs ZWQpIHsKKwkJCWF0b21pY19kZWMoJnZibGFuay0+cmVmY291bnQpOworCQkJcmV0ID0gLUVJTlZB TDsKKwkJfQorCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFm bGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGRybV9jcnRjX3ZibGFua19nZXQg LSBnZXQgYSByZWZlcmVuY2UgY291bnQgb24gdmJsYW5rIGV2ZW50cworICogQGNydGM6IHdoaWNo IENSVEMgdG8gb3duCisgKgorICogQWNxdWlyZSBhIHJlZmVyZW5jZSBjb3VudCBvbiB2Ymxhbmsg ZXZlbnRzIHRvIGF2b2lkIGhhdmluZyB0aGVtIGRpc2FibGVkCisgKiB3aGlsZSBpbiB1c2UuCisg KgorICogUmV0dXJuczoKKyAqIFplcm8gb24gc3VjY2VzcyBvciBhIG5lZ2F0aXZlIGVycm9yIGNv ZGUgb24gZmFpbHVyZS4KKyAqLworaW50IGRybV9jcnRjX3ZibGFua19nZXQoc3RydWN0IGRybV9j cnRjICpjcnRjKQoreworCXJldHVybiBkcm1fdmJsYW5rX2dldChjcnRjLT5kZXYsIGRybV9jcnRj X2luZGV4KGNydGMpKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2NydGNfdmJsYW5rX2dldCk7CisK Ky8qKgorICogZHJtX3ZibGFua19wdXQgLSByZWxlYXNlIG93bmVyc2hpcCBvZiB2YmxhbmsgZXZl bnRzCisgKiBAZGV2OiBEUk0gZGV2aWNlCisgKiBAcGlwZTogaW5kZXggb2YgQ1JUQyB0byByZWxl YXNlCisgKgorICogUmVsZWFzZSBvd25lcnNoaXAgb2YgYSBnaXZlbiB2YmxhbmsgY291bnRlciwg dHVybmluZyBvZmYgaW50ZXJydXB0cworICogaWYgcG9zc2libGUuIERpc2FibGUgaW50ZXJydXB0 cyBhZnRlciBkcm1fdmJsYW5rX29mZmRlbGF5IG1pbGxpc2Vjb25kcy4KKyAqCisgKiBUaGlzIGlz IHRoZSBsZWdhY3kgdmVyc2lvbiBvZiBkcm1fY3J0Y192YmxhbmtfcHV0KCkuCisgKi8KK3N0YXRp YyB2b2lkIGRybV92YmxhbmtfcHV0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVuc2lnbmVkIGlu dCBwaXBlKQoreworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFu a1twaXBlXTsKKworCWlmIChXQVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0Y3MpKQorCQlyZXR1 cm47CisKKwlpZiAoV0FSTl9PTihhdG9taWNfcmVhZCgmdmJsYW5rLT5yZWZjb3VudCkgPT0gMCkp CisJCXJldHVybjsKKworCS8qIExhc3QgdXNlciBzY2hlZHVsZXMgaW50ZXJydXB0IGRpc2FibGUg Ki8KKwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdmJsYW5rLT5yZWZjb3VudCkpIHsKKwkJaWYg KGRybV92Ymxhbmtfb2ZmZGVsYXkgPT0gMCkKKwkJCXJldHVybjsKKwkJZWxzZSBpZiAoZHJtX3Zi bGFua19vZmZkZWxheSA8IDApCisJCQl2YmxhbmtfZGlzYWJsZV9mbigodW5zaWduZWQgbG9uZyl2 YmxhbmspOworCQllbHNlIGlmICghZGV2LT52YmxhbmtfZGlzYWJsZV9pbW1lZGlhdGUpCisJCQlt b2RfdGltZXIoJnZibGFuay0+ZGlzYWJsZV90aW1lciwKKwkJCQkgIGppZmZpZXMgKyAoKGRybV92 Ymxhbmtfb2ZmZGVsYXkgKiBIWikvMTAwMCkpOworCX0KK30KKworLyoqCisgKiBkcm1fY3J0Y192 YmxhbmtfcHV0IC0gZ2l2ZSB1cCBvd25lcnNoaXAgb2YgdmJsYW5rIGV2ZW50cworICogQGNydGM6 IHdoaWNoIGNvdW50ZXIgdG8gZ2l2ZSB1cAorICoKKyAqIFJlbGVhc2Ugb3duZXJzaGlwIG9mIGEg Z2l2ZW4gdmJsYW5rIGNvdW50ZXIsIHR1cm5pbmcgb2ZmIGludGVycnVwdHMKKyAqIGlmIHBvc3Np YmxlLiBEaXNhYmxlIGludGVycnVwdHMgYWZ0ZXIgZHJtX3ZibGFua19vZmZkZWxheSBtaWxsaXNl Y29uZHMuCisgKi8KK3ZvaWQgZHJtX2NydGNfdmJsYW5rX3B1dChzdHJ1Y3QgZHJtX2NydGMgKmNy dGMpCit7CisJZHJtX3ZibGFua19wdXQoY3J0Yy0+ZGV2LCBkcm1fY3J0Y19pbmRleChjcnRjKSk7 Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jcnRjX3ZibGFua19wdXQpOworCisvKioKKyAqIGRybV93 YWl0X29uZV92YmxhbmsgLSB3YWl0IGZvciBvbmUgdmJsYW5rCisgKiBAZGV2OiBEUk0gZGV2aWNl CisgKiBAcGlwZTogQ1JUQyBpbmRleAorICoKKyAqIFRoaXMgd2FpdHMgZm9yIG9uZSB2Ymxhbmsg dG8gcGFzcyBvbiBAcGlwZSwgdXNpbmcgdGhlIGlycSBkcml2ZXIgaW50ZXJmYWNlcy4KKyAqIEl0 IGlzIGEgZmFpbHVyZSB0byBjYWxsIHRoaXMgd2hlbiB0aGUgdmJsYW5rIGlycSBmb3IgQHBpcGUg aXMgZGlzYWJsZWQsIGUuZy4KKyAqIGR1ZSB0byBsYWNrIG9mIGRyaXZlciBzdXBwb3J0IG9yIGJl Y2F1c2UgdGhlIGNydGMgaXMgb2ZmLgorICovCit2b2lkIGRybV93YWl0X29uZV92Ymxhbmsoc3Ry dWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCit7CisJc3RydWN0IGRybV92 YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOworCWludCByZXQ7CisJdTMy IGxhc3Q7CisKKwlpZiAoV0FSTl9PTihwaXBlID49IGRldi0+bnVtX2NydGNzKSkKKwkJcmV0dXJu OworCisJcmV0ID0gZHJtX3ZibGFua19nZXQoZGV2LCBwaXBlKTsKKwlpZiAoV0FSTihyZXQsICJ2 Ymxhbmsgbm90IGF2YWlsYWJsZSBvbiBjcnRjICVpLCByZXQ9JWlcbiIsIHBpcGUsIHJldCkpCisJ CXJldHVybjsKKworCWxhc3QgPSBkcm1fdmJsYW5rX2NvdW50KGRldiwgcGlwZSk7CisKKwlyZXQg PSB3YWl0X2V2ZW50X3RpbWVvdXQodmJsYW5rLT5xdWV1ZSwKKwkJCQkgbGFzdCAhPSBkcm1fdmJs YW5rX2NvdW50KGRldiwgcGlwZSksCisJCQkJIG1zZWNzX3RvX2ppZmZpZXMoMTAwKSk7CisKKwlX QVJOKHJldCA9PSAwLCAidmJsYW5rIHdhaXQgdGltZWQgb3V0IG9uIGNydGMgJWlcbiIsIHBpcGUp OworCisJZHJtX3ZibGFua19wdXQoZGV2LCBwaXBlKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX3dh aXRfb25lX3ZibGFuayk7CisKKy8qKgorICogZHJtX2NydGNfd2FpdF9vbmVfdmJsYW5rIC0gd2Fp dCBmb3Igb25lIHZibGFuaworICogQGNydGM6IERSTSBjcnRjCisgKgorICogVGhpcyB3YWl0cyBm b3Igb25lIHZibGFuayB0byBwYXNzIG9uIEBjcnRjLCB1c2luZyB0aGUgaXJxIGRyaXZlciBpbnRl cmZhY2VzLgorICogSXQgaXMgYSBmYWlsdXJlIHRvIGNhbGwgdGhpcyB3aGVuIHRoZSB2Ymxhbmsg aXJxIGZvciBAY3J0YyBpcyBkaXNhYmxlZCwgZS5nLgorICogZHVlIHRvIGxhY2sgb2YgZHJpdmVy IHN1cHBvcnQgb3IgYmVjYXVzZSB0aGUgY3J0YyBpcyBvZmYuCisgKi8KK3ZvaWQgZHJtX2NydGNf d2FpdF9vbmVfdmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlkcm1fd2FpdF9vbmVf dmJsYW5rKGNydGMtPmRldiwgZHJtX2NydGNfaW5kZXgoY3J0YykpOworfQorRVhQT1JUX1NZTUJP TChkcm1fY3J0Y193YWl0X29uZV92YmxhbmspOworCisvKioKKyAqIGRybV9jcnRjX3ZibGFua19v ZmYgLSBkaXNhYmxlIHZibGFuayBldmVudHMgb24gYSBDUlRDCisgKiBAY3J0YzogQ1JUQyBpbiBx dWVzdGlvbgorICoKKyAqIERyaXZlcnMgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNodXQgZG93 biB0aGUgdmJsYW5rIGludGVycnVwdCBoYW5kbGluZyB3aGVuCisgKiBkaXNhYmxpbmcgYSBjcnRj LiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCB0aGUgbGF0ZXN0IHZibGFuayBmcmFtZSBjb3Vu dCBpcworICogc3RvcmVkIHNvIHRoYXQgZHJtX3ZibGFua19vbiBjYW4gcmVzdG9yZSBpdCBhZ2Fp bi4KKyAqCisgKiBEcml2ZXJzIG11c3QgdXNlIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgaGFyZHdh cmUgdmJsYW5rIGNvdW50ZXIgY2FuIGdldAorICogcmVzZXQsIGUuZy4gd2hlbiBzdXNwZW5kaW5n LgorICovCit2b2lkIGRybV9jcnRjX3ZibGFua19vZmYoc3RydWN0IGRybV9jcnRjICpjcnRjKQor eworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CisJdW5zaWduZWQgaW50IHBp cGUgPSBkcm1fY3J0Y19pbmRleChjcnRjKTsKKwlzdHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2Ymxh bmsgPSAmZGV2LT52YmxhbmtbcGlwZV07CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVu dCAqZSwgKnQ7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7 CisJdW5zaWduZWQgaW50IHNlcTsKKworCWlmIChXQVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0 Y3MpKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBp cnFmbGFncyk7CisKKwlzcGluX2xvY2soJmRldi0+dmJsX2xvY2spOworCURSTV9ERUJVR19WQkwo ImNydGMgJWQsIHZibGFuayBlbmFibGVkICVkLCBpbm1vZGVzZXQgJWRcbiIsCisJCSAgICAgIHBp cGUsIHZibGFuay0+ZW5hYmxlZCwgdmJsYW5rLT5pbm1vZGVzZXQpOworCisJLyogQXZvaWQgcmVk dW5kYW50IHZibGFuayBkaXNhYmxlcyB3aXRob3V0IHByZXZpb3VzCisJICogZHJtX2NydGNfdmJs YW5rX29uKCkuICovCisJaWYgKGRybV9jb3JlX2NoZWNrX2ZlYXR1cmUoZGV2LCBEUklWRVJfQVRP TUlDKSB8fCAhdmJsYW5rLT5pbm1vZGVzZXQpCisJCWRybV92YmxhbmtfZGlzYWJsZV9hbmRfc2F2 ZShkZXYsIHBpcGUpOworCisJd2FrZV91cCgmdmJsYW5rLT5xdWV1ZSk7CisKKwkvKgorCSAqIFBy ZXZlbnQgc3Vic2VxdWVudCBkcm1fdmJsYW5rX2dldCgpIGZyb20gcmUtZW5hYmxpbmcKKwkgKiB0 aGUgdmJsYW5rIGludGVycnVwdCBieSBidW1waW5nIHRoZSByZWZjb3VudC4KKwkgKi8KKwlpZiAo IXZibGFuay0+aW5tb2Rlc2V0KSB7CisJCWF0b21pY19pbmMoJnZibGFuay0+cmVmY291bnQpOwor CQl2YmxhbmstPmlubW9kZXNldCA9IDE7CisJfQorCXNwaW5fdW5sb2NrKCZkZXYtPnZibF9sb2Nr KTsKKworCS8qIFNlbmQgYW55IHF1ZXVlZCB2YmxhbmsgZXZlbnRzLCBsZXN0IHRoZSBuYXRpdmVz IGdyb3cgZGlzcXVpZXQgKi8KKwlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwg cGlwZSwgJm5vdyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdCwgJmRldi0+dmJs YW5rX2V2ZW50X2xpc3QsIGJhc2UubGluaykgeworCQlpZiAoZS0+cGlwZSAhPSBwaXBlKQorCQkJ Y29udGludWU7CisJCURSTV9ERUJVRygiU2VuZGluZyBwcmVtYXR1cmUgdmJsYW5rIGV2ZW50IG9u IGRpc2FibGU6ICIKKwkJCSAgIndhbnRlZCAldSwgY3VycmVudCAldVxuIiwKKwkJCSAgZS0+ZXZl bnQuc2VxdWVuY2UsIHNlcSk7CisJCWxpc3RfZGVsKCZlLT5iYXNlLmxpbmspOworCQlkcm1fdmJs YW5rX3B1dChkZXYsIHBpcGUpOworCQlzZW5kX3ZibGFua19ldmVudChkZXYsIGUsIHNlcSwgJm5v dyk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxZmxh Z3MpOworCisJLyogV2lsbCBiZSByZXNldCBieSB0aGUgbW9kZXNldCBoZWxwZXJzIHdoZW4gcmUt ZW5hYmxpbmcgdGhlIGNydGMgYnkKKwkgKiBjYWxsaW5nIGRybV9jYWxjX3RpbWVzdGFtcGluZ19j b25zdGFudHMoKS4gKi8KKwl2YmxhbmstPmh3bW9kZS5jcnRjX2Nsb2NrID0gMDsKK30KK0VYUE9S VF9TWU1CT0woZHJtX2NydGNfdmJsYW5rX29mZik7CisKKy8qKgorICogZHJtX2NydGNfdmJsYW5r X3Jlc2V0IC0gcmVzZXQgdmJsYW5rIHN0YXRlIHRvIG9mZiBvbiBhIENSVEMKKyAqIEBjcnRjOiBD UlRDIGluIHF1ZXN0aW9uCisgKgorICogRHJpdmVycyBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8g cmVzZXQgdGhlIHZibGFuayBzdGF0ZSB0byBvZmYgYXQgbG9hZCB0aW1lLgorICogRHJpdmVycyBz aG91bGQgdXNlIHRoaXMgdG9nZXRoZXIgd2l0aCB0aGUgZHJtX2NydGNfdmJsYW5rX29mZigpIGFu ZAorICogZHJtX2NydGNfdmJsYW5rX29uKCkgZnVuY3Rpb25zLiBUaGUgZGlmZmVyZW5jZSBjb21w YXJlZCB0bworICogZHJtX2NydGNfdmJsYW5rX29mZigpIGlzIHRoYXQgdGhpcyBmdW5jdGlvbiBk b2Vzbid0IHNhdmUgdGhlIHZibGFuayBjb3VudGVyCisgKiBhbmQgaGVuY2UgZG9lc24ndCBuZWVk IHRvIGNhbGwgYW55IGRyaXZlciBob29rcy4KKyAqLwordm9pZCBkcm1fY3J0Y192YmxhbmtfcmVz ZXQoc3RydWN0IGRybV9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBj cnRjLT5kZXY7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKwl1bnNpZ25lZCBpbnQgcGlwZSA9 IGRybV9jcnRjX2luZGV4KGNydGMpOworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9 ICZkZXYtPnZibGFua1twaXBlXTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPnZibF9sb2Nr LCBpcnFmbGFncyk7CisJLyoKKwkgKiBQcmV2ZW50IHN1YnNlcXVlbnQgZHJtX3ZibGFua19nZXQo KSBmcm9tIGVuYWJsaW5nIHRoZSB2YmxhbmsKKwkgKiBpbnRlcnJ1cHQgYnkgYnVtcGluZyB0aGUg cmVmY291bnQuCisJICovCisJaWYgKCF2YmxhbmstPmlubW9kZXNldCkgeworCQlhdG9taWNfaW5j KCZ2YmxhbmstPnJlZmNvdW50KTsKKwkJdmJsYW5rLT5pbm1vZGVzZXQgPSAxOworCX0KKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPnZibF9sb2NrLCBpcnFmbGFncyk7CisKKwlXQVJOX09O KCFsaXN0X2VtcHR5KCZkZXYtPnZibGFua19ldmVudF9saXN0KSk7Cit9CitFWFBPUlRfU1lNQk9M KGRybV9jcnRjX3ZibGFua19yZXNldCk7CisKKy8qKgorICogZHJtX2NydGNfdmJsYW5rX29uIC0g ZW5hYmxlIHZibGFuayBldmVudHMgb24gYSBDUlRDCisgKiBAY3J0YzogQ1JUQyBpbiBxdWVzdGlv bgorICoKKyAqIFRoaXMgZnVuY3Rpb25zIHJlc3RvcmVzIHRoZSB2YmxhbmsgaW50ZXJydXB0IHN0 YXRlIGNhcHR1cmVkIHdpdGgKKyAqIGRybV9jcnRjX3ZibGFua19vZmYoKSBhZ2Fpbi4gTm90ZSB0 aGF0IGNhbGxzIHRvIGRybV9jcnRjX3ZibGFua19vbigpIGFuZAorICogZHJtX2NydGNfdmJsYW5r X29mZigpIGNhbiBiZSB1bmJhbGFuY2VkIGFuZCBzbyBjYW4gYWxzbyBiZSB1bmNvbmRpdGlvbmFs bHkgY2FsbGVkCisgKiBpbiBkcml2ZXIgbG9hZCBjb2RlIHRvIHJlZmxlY3QgdGhlIGN1cnJlbnQg aGFyZHdhcmUgc3RhdGUgb2YgdGhlIGNydGMuCisgKi8KK3ZvaWQgZHJtX2NydGNfdmJsYW5rX29u KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0 Yy0+ZGV2OworCXVuc2lnbmVkIGludCBwaXBlID0gZHJtX2NydGNfaW5kZXgoY3J0Yyk7CisJc3Ry dWN0IGRybV92YmxhbmtfY3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOworCXVuc2ln bmVkIGxvbmcgaXJxZmxhZ3M7CisKKwlpZiAoV0FSTl9PTihwaXBlID49IGRldi0+bnVtX2NydGNz KSkKKwkJcmV0dXJuOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZs YWdzKTsKKwlEUk1fREVCVUdfVkJMKCJjcnRjICVkLCB2YmxhbmsgZW5hYmxlZCAlZCwgaW5tb2Rl c2V0ICVkXG4iLAorCQkgICAgICBwaXBlLCB2YmxhbmstPmVuYWJsZWQsIHZibGFuay0+aW5tb2Rl c2V0KTsKKworCS8qIERyb3Agb3VyIHByaXZhdGUgInByZXZlbnQgZHJtX3ZibGFua19nZXQiIHJl ZmNvdW50ICovCisJaWYgKHZibGFuay0+aW5tb2Rlc2V0KSB7CisJCWF0b21pY19kZWMoJnZibGFu ay0+cmVmY291bnQpOworCQl2YmxhbmstPmlubW9kZXNldCA9IDA7CisJfQorCisJZHJtX3Jlc2V0 X3ZibGFua190aW1lc3RhbXAoZGV2LCBwaXBlKTsKKworCS8qCisJICogcmUtZW5hYmxlIGludGVy cnVwdHMgaWYgdGhlcmUgYXJlIHVzZXJzIGxlZnQsIG9yIHRoZQorCSAqIHVzZXIgd2lzaGVzIHZi bGFuayBpbnRlcnJ1cHRzIHRvIGJlIGVuYWJsZWQgYWxsIHRoZSB0aW1lLgorCSAqLworCWlmIChh dG9taWNfcmVhZCgmdmJsYW5rLT5yZWZjb3VudCkgIT0gMCB8fCBkcm1fdmJsYW5rX29mZmRlbGF5 ID09IDApCisJCVdBUk5fT04oZHJtX3ZibGFua19lbmFibGUoZGV2LCBwaXBlKSk7CisJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52YmxfbG9jaywgaXJxZmxhZ3MpOworfQorRVhQT1JUX1NZ TUJPTChkcm1fY3J0Y192Ymxhbmtfb24pOworCitzdGF0aWMgdm9pZCBkcm1fbGVnYWN5X3ZibGFu a19wcmVfbW9kZXNldChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgIHVuc2lnbmVkIGlu dCBwaXBlKQoreworCXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuayA9ICZkZXYtPnZibGFu a1twaXBlXTsKKworCS8qIHZibGFuayBpcyBub3QgaW5pdGlhbGl6ZWQgKElSUSBub3QgaW5zdGFs bGVkID8pLCBvciBoYXMgYmVlbiBmcmVlZCAqLworCWlmICghZGV2LT5udW1fY3J0Y3MpCisJCXJl dHVybjsKKworCWlmIChXQVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0Y3MpKQorCQlyZXR1cm47 CisKKwkvKgorCSAqIFRvIGF2b2lkIGFsbCB0aGUgcHJvYmxlbXMgdGhhdCBtaWdodCBoYXBwZW4g aWYgaW50ZXJydXB0cworCSAqIHdlcmUgZW5hYmxlZC9kaXNhYmxlZCBhcm91bmQgb3IgYmV0d2Vl biB0aGVzZSBjYWxscywgd2UganVzdAorCSAqIGhhdmUgdGhlIGtlcm5lbCB0YWtlIGEgcmVmZXJl bmNlIG9uIHRoZSBDUlRDIChqdXN0IG9uY2UgdGhvdWdoCisJICogdG8gYXZvaWQgY29ycnVwdGlu ZyB0aGUgY291bnQgaWYgbXVsdGlwbGUsIG1pc21hdGNoIGNhbGxzIG9jY3VyKSwKKwkgKiBzbyB0 aGF0IGludGVycnVwdHMgcmVtYWluIGVuYWJsZWQgaW4gdGhlIGludGVyaW0uCisJICovCisJaWYg KCF2YmxhbmstPmlubW9kZXNldCkgeworCQl2YmxhbmstPmlubW9kZXNldCA9IDB4MTsKKwkJaWYg KGRybV92YmxhbmtfZ2V0KGRldiwgcGlwZSkgPT0gMCkKKwkJCXZibGFuay0+aW5tb2Rlc2V0IHw9 IDB4MjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9sZWdhY3lfdmJsYW5rX3Bvc3RfbW9kZXNl dChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcGlwZSkKK3sK KwlzdHJ1Y3QgZHJtX3ZibGFua19jcnRjICp2YmxhbmsgPSAmZGV2LT52YmxhbmtbcGlwZV07CisJ dW5zaWduZWQgbG9uZyBpcnFmbGFnczsKKworCS8qIHZibGFuayBpcyBub3QgaW5pdGlhbGl6ZWQg KElSUSBub3QgaW5zdGFsbGVkID8pLCBvciBoYXMgYmVlbiBmcmVlZCAqLworCWlmICghZGV2LT5u dW1fY3J0Y3MpCisJCXJldHVybjsKKworCWlmIChXQVJOX09OKHBpcGUgPj0gZGV2LT5udW1fY3J0 Y3MpKQorCQlyZXR1cm47CisKKwlpZiAodmJsYW5rLT5pbm1vZGVzZXQpIHsKKwkJc3Bpbl9sb2Nr X2lycXNhdmUoJmRldi0+dmJsX2xvY2ssIGlycWZsYWdzKTsKKwkJZHJtX3Jlc2V0X3ZibGFua190 aW1lc3RhbXAoZGV2LCBwaXBlKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT52Ymxf bG9jaywgaXJxZmxhZ3MpOworCisJCWlmICh2YmxhbmstPmlubW9kZXNldCAmIDB4MikKKwkJCWRy bV92YmxhbmtfcHV0KGRldiwgcGlwZSk7CisKKwkJdmJsYW5rLT5pbm1vZGVzZXQgPSAwOworCX0K K30KKworaW50IGRybV9sZWdhY3lfbW9kZXNldF9jdGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwg dm9pZCAqZGF0YSwKKwkJCSAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQoreworCXN0cnVj dCBkcm1fbW9kZXNldF9jdGwgKm1vZGVzZXQgPSBkYXRhOworCXVuc2lnbmVkIGludCBwaXBlOwor CisJLyogSWYgZHJtX3ZibGFua19pbml0KCkgaGFzbid0IGJlZW4gY2FsbGVkIHlldCwganVzdCBu by1vcCAqLworCWlmICghZGV2LT5udW1fY3J0Y3MpCisJCXJldHVybiAwOworCisJLyogS01TIGRy aXZlcnMgaGFuZGxlIHRoaXMgaW50ZXJuYWxseSAqLworCWlmICghZHJtX2NvcmVfY2hlY2tfZmVh dHVyZShkZXYsIERSSVZFUl9MRUdBQ1kpKQorCQlyZXR1cm4gMDsKKworCXBpcGUgPSBtb2Rlc2V0 LT5jcnRjOworCWlmIChwaXBlID49IGRldi0+bnVtX2NydGNzKQorCQlyZXR1cm4gLUVJTlZBTDsK KworCXN3aXRjaCAobW9kZXNldC0+Y21kKSB7CisJY2FzZSBfRFJNX1BSRV9NT0RFU0VUOgorCQlk cm1fbGVnYWN5X3ZibGFua19wcmVfbW9kZXNldChkZXYsIHBpcGUpOworCQlicmVhazsKKwljYXNl IF9EUk1fUE9TVF9NT0RFU0VUOgorCQlkcm1fbGVnYWN5X3ZibGFua19wb3N0X21vZGVzZXQoZGV2 LCBwaXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCB2YmxhbmtfcGFzc2VkKHUzMiBzZXEs IHUzMiByZWYpCit7CisJcmV0dXJuIChzZXEgLSByZWYpIDw9ICgxIDw8IDIzKTsKK30KKworc3Rh dGljIGludCBkcm1fcXVldWVfdmJsYW5rX2V2ZW50KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIHVu c2lnbmVkIGludCBwaXBlLAorCQkJCSAgdW5pb24gZHJtX3dhaXRfdmJsYW5rICp2Ymx3YWl0LAor CQkJCSAgc3RydWN0IGRybV9maWxlICpmaWxlX3ByaXYpCit7CisJc3RydWN0IGRybV92Ymxhbmtf Y3J0YyAqdmJsYW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOworCXN0cnVjdCBkcm1fcGVuZGluZ192 YmxhbmtfZXZlbnQgKmU7CisJc3RydWN0IHRpbWV2YWwgbm93OworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisJdW5zaWduZWQgaW50IHNlcTsKKwlpbnQgcmV0OworCisJZSA9IGt6YWxsb2Moc2l6ZW9m KCplKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVNOwor CQlnb3RvIGVycl9wdXQ7CisJfQorCisJZS0+cGlwZSA9IHBpcGU7CisJZS0+ZXZlbnQuYmFzZS50 eXBlID0gRFJNX0VWRU5UX1ZCTEFOSzsKKwllLT5ldmVudC5iYXNlLmxlbmd0aCA9IHNpemVvZihl LT5ldmVudCk7CisJZS0+ZXZlbnQudXNlcl9kYXRhID0gdmJsd2FpdC0+cmVxdWVzdC5zaWduYWw7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisKKwkvKgor CSAqIGRybV9jcnRjX3ZibGFua19vZmYoKSBtaWdodCBoYXZlIGJlZW4gY2FsbGVkIGFmdGVyIHdl IGNhbGxlZAorCSAqIGRybV92YmxhbmtfZ2V0KCkuIGRybV9jcnRjX3ZibGFua19vZmYoKSBob2xk cyBldmVudF9sb2NrIGFyb3VuZCB0aGUKKwkgKiB2YmxhbmsgZGlzYWJsZSwgc28gbm8gbmVlZCBm b3IgZnVydGhlciBsb2NraW5nLiAgVGhlIHJlZmVyZW5jZSBmcm9tCisJICogZHJtX3ZibGFua19n ZXQoKSBwcm90ZWN0cyBhZ2FpbnN0IHZibGFuayBkaXNhYmxlIGZyb20gYW5vdGhlciBzb3VyY2Uu CisJICovCisJaWYgKCFSRUFEX09OQ0UodmJsYW5rLT5lbmFibGVkKSkgeworCQlyZXQgPSAtRUlO VkFMOworCQlnb3RvIGVycl91bmxvY2s7CisJfQorCisJcmV0ID0gZHJtX2V2ZW50X3Jlc2VydmVf aW5pdF9sb2NrZWQoZGV2LCBmaWxlX3ByaXYsICZlLT5iYXNlLAorCQkJCQkgICAgJmUtPmV2ZW50 LmJhc2UpOworCisJaWYgKHJldCkKKwkJZ290byBlcnJfdW5sb2NrOworCisJc2VxID0gZHJtX3Zi bGFua19jb3VudF9hbmRfdGltZShkZXYsIHBpcGUsICZub3cpOworCisJRFJNX0RFQlVHKCJldmVu dCBvbiB2YmxhbmsgY291bnQgJXUsIGN1cnJlbnQgJXUsIGNydGMgJXVcbiIsCisJCSAgdmJsd2Fp dC0+cmVxdWVzdC5zZXF1ZW5jZSwgc2VxLCBwaXBlKTsKKworCXRyYWNlX2RybV92YmxhbmtfZXZl bnRfcXVldWVkKGZpbGVfcHJpdiwgcGlwZSwKKwkJCQkgICAgICB2Ymx3YWl0LT5yZXF1ZXN0LnNl cXVlbmNlKTsKKworCWUtPmV2ZW50LnNlcXVlbmNlID0gdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5j ZTsKKwlpZiAodmJsYW5rX3Bhc3NlZChzZXEsIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpKSB7 CisJCWRybV92YmxhbmtfcHV0KGRldiwgcGlwZSk7CisJCXNlbmRfdmJsYW5rX2V2ZW50KGRldiwg ZSwgc2VxLCAmbm93KTsKKwkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UgPSBzZXE7CisJfSBlbHNl IHsKKwkJLyogZHJtX2hhbmRsZV92YmxhbmtfZXZlbnRzIHdpbGwgY2FsbCBkcm1fdmJsYW5rX3B1 dCAqLworCQlsaXN0X2FkZF90YWlsKCZlLT5iYXNlLmxpbmssICZkZXYtPnZibGFua19ldmVudF9s aXN0KTsKKwkJdmJsd2FpdC0+cmVwbHkuc2VxdWVuY2UgPSB2Ymx3YWl0LT5yZXF1ZXN0LnNlcXVl bmNlOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxh Z3MpOworCisJcmV0dXJuIDA7CisKK2Vycl91bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7CisJa2ZyZWUoZSk7CitlcnJfcHV0OgorCWRybV92 YmxhbmtfcHV0KGRldiwgcGlwZSk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGJvb2wgZHJt X3dhaXRfdmJsYW5rX2lzX3F1ZXJ5KHVuaW9uIGRybV93YWl0X3ZibGFuayAqdmJsd2FpdCkKK3sK KwlpZiAodmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSkKKwkJcmV0dXJuIGZhbHNlOworCisJcmV0 dXJuIF9EUk1fVkJMQU5LX1JFTEFUSVZFID09CisJCSh2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJiAo X0RSTV9WQkxBTktfVFlQRVNfTUFTSyB8CisJCQkJCSAgX0RSTV9WQkxBTktfRVZFTlQgfAorCQkJ CQkgIF9EUk1fVkJMQU5LX05FWFRPTk1JU1MpKTsKK30KKworLyoKKyAqIFdhaXQgZm9yIFZCTEFO Sy4KKyAqCisgKiBccGFyYW0gaW5vZGUgZGV2aWNlIGlub2RlLgorICogXHBhcmFtIGZpbGVfcHJp diBEUk0gZmlsZSBwcml2YXRlLgorICogXHBhcmFtIGNtZCBjb21tYW5kLgorICogXHBhcmFtIGRh dGEgdXNlciBhcmd1bWVudCwgcG9pbnRpbmcgdG8gYSBkcm1fd2FpdF92Ymxhbmsgc3RydWN0dXJl LgorICogXHJldHVybiB6ZXJvIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBudW1iZXIgb24gZmFp bHVyZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIHZibGFuayBpbnRlcnJ1cHQg b24gdGhlIHBpcGUgcmVxdWVzdGVkLCB0aGVuCisgKiBzbGVlcHMgd2FpdGluZyBmb3IgdGhlIHJl cXVlc3RlZCBzZXF1ZW5jZSBudW1iZXIgdG8gb2NjdXIsIGFuZCBkcm9wcworICogdGhlIHZibGFu ayBpbnRlcnJ1cHQgcmVmY291bnQgYWZ0ZXJ3YXJkcy4gKHZibGFuayBJUlEgZGlzYWJsZSBmb2xs b3dzIHRoYXQKKyAqIGFmdGVyIGEgdGltZW91dCB3aXRoIG5vIGZ1cnRoZXIgdmJsYW5rIHdhaXRz IHNjaGVkdWxlZCkuCisgKi8KK2ludCBkcm1fd2FpdF92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgdm9pZCAqZGF0YSwKKwkJICAgIHN0cnVjdCBkcm1fZmlsZSAqZmlsZV9wcml2KQorewor CXN0cnVjdCBkcm1fdmJsYW5rX2NydGMgKnZibGFuazsKKwl1bmlvbiBkcm1fd2FpdF92Ymxhbmsg KnZibHdhaXQgPSBkYXRhOworCWludCByZXQ7CisJdW5zaWduZWQgaW50IGZsYWdzLCBzZXEsIHBp cGUsIGhpZ2hfcGlwZTsKKworCWlmICghZGV2LT5pcnFfZW5hYmxlZCkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwlpZiAodmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RSTV9WQkxBTktfU0lHTkFMKQor CQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2Ymx3YWl0LT5yZXF1ZXN0LnR5cGUgJgorCSAgICB+ KF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgfCBfRFJNX1ZCTEFOS19GTEFHU19NQVNLIHwKKwkgICAg ICBfRFJNX1ZCTEFOS19ISUdIX0NSVENfTUFTSykpIHsKKwkJRFJNX0VSUk9SKCJVbnN1cHBvcnRl ZCB0eXBlIHZhbHVlIDB4JXgsIHN1cHBvcnRlZCBtYXNrIDB4JXhcbiIsCisJCQkgIHZibHdhaXQt PnJlcXVlc3QudHlwZSwKKwkJCSAgKF9EUk1fVkJMQU5LX1RZUEVTX01BU0sgfCBfRFJNX1ZCTEFO S19GTEFHU19NQVNLIHwKKwkJCSAgIF9EUk1fVkJMQU5LX0hJR0hfQ1JUQ19NQVNLKSk7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCWZsYWdzID0gdmJsd2FpdC0+cmVxdWVzdC50eXBlICYgX0RS TV9WQkxBTktfRkxBR1NfTUFTSzsKKwloaWdoX3BpcGUgPSAodmJsd2FpdC0+cmVxdWVzdC50eXBl ICYgX0RSTV9WQkxBTktfSElHSF9DUlRDX01BU0spOworCWlmIChoaWdoX3BpcGUpCisJCXBpcGUg PSBoaWdoX3BpcGUgPj4gX0RSTV9WQkxBTktfSElHSF9DUlRDX1NISUZUOworCWVsc2UKKwkJcGlw ZSA9IGZsYWdzICYgX0RSTV9WQkxBTktfU0VDT05EQVJZID8gMSA6IDA7CisJaWYgKHBpcGUgPj0g ZGV2LT5udW1fY3J0Y3MpCisJCXJldHVybiAtRUlOVkFMOworCisJdmJsYW5rID0gJmRldi0+dmJs YW5rW3BpcGVdOworCisJLyogSWYgdGhlIGNvdW50ZXIgaXMgY3VycmVudGx5IGVuYWJsZWQgYW5k IGFjY3VyYXRlLCBzaG9ydC1jaXJjdWl0CisJICogcXVlcmllcyB0byByZXR1cm4gdGhlIGNhY2hl ZCB0aW1lc3RhbXAgb2YgdGhlIGxhc3QgdmJsYW5rLgorCSAqLworCWlmIChkZXYtPnZibGFua19k aXNhYmxlX2ltbWVkaWF0ZSAmJgorCSAgICBkcm1fd2FpdF92YmxhbmtfaXNfcXVlcnkodmJsd2Fp dCkgJiYKKwkgICAgUkVBRF9PTkNFKHZibGFuay0+ZW5hYmxlZCkpIHsKKwkJc3RydWN0IHRpbWV2 YWwgbm93OworCisJCXZibHdhaXQtPnJlcGx5LnNlcXVlbmNlID0KKwkJCWRybV92YmxhbmtfY291 bnRfYW5kX3RpbWUoZGV2LCBwaXBlLCAmbm93KTsKKwkJdmJsd2FpdC0+cmVwbHkudHZhbF9zZWMg PSBub3cudHZfc2VjOworCQl2Ymx3YWl0LT5yZXBseS50dmFsX3VzZWMgPSBub3cudHZfdXNlYzsK KwkJcmV0dXJuIDA7CisJfQorCisJcmV0ID0gZHJtX3ZibGFua19nZXQoZGV2LCBwaXBlKTsKKwlp ZiAocmV0KSB7CisJCURSTV9ERUJVRygiY3J0YyAlZCBmYWlsZWQgdG8gYWNxdWlyZSB2Ymxhbmsg Y291bnRlciwgJWRcbiIsIHBpcGUsIHJldCk7CisJCXJldHVybiByZXQ7CisJfQorCXNlcSA9IGRy bV92YmxhbmtfY291bnQoZGV2LCBwaXBlKTsKKworCXN3aXRjaCAodmJsd2FpdC0+cmVxdWVzdC50 eXBlICYgX0RSTV9WQkxBTktfVFlQRVNfTUFTSykgeworCWNhc2UgX0RSTV9WQkxBTktfUkVMQVRJ VkU6CisJCXZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UgKz0gc2VxOworCQl2Ymx3YWl0LT5yZXF1 ZXN0LnR5cGUgJj0gfl9EUk1fVkJMQU5LX1JFTEFUSVZFOworCWNhc2UgX0RSTV9WQkxBTktfQUJT T0xVVEU6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9u ZTsKKwl9CisKKwlpZiAoKGZsYWdzICYgX0RSTV9WQkxBTktfTkVYVE9OTUlTUykgJiYKKwkgICAg dmJsYW5rX3Bhc3NlZChzZXEsIHZibHdhaXQtPnJlcXVlc3Quc2VxdWVuY2UpKQorCQl2Ymx3YWl0 LT5yZXF1ZXN0LnNlcXVlbmNlID0gc2VxICsgMTsKKworCWlmIChmbGFncyAmIF9EUk1fVkJMQU5L X0VWRU5UKSB7CisJCS8qIG11c3QgaG9sZCBvbiB0byB0aGUgdmJsYW5rIHJlZiB1bnRpbCB0aGUg ZXZlbnQgZmlyZXMKKwkJICogZHJtX3ZibGFua19wdXQgd2lsbCBiZSBjYWxsZWQgYXN5bmNocm9u b3VzbHkKKwkJICovCisJCXJldHVybiBkcm1fcXVldWVfdmJsYW5rX2V2ZW50KGRldiwgcGlwZSwg dmJsd2FpdCwgZmlsZV9wcml2KTsKKwl9CisKKwlpZiAodmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5j ZSAhPSBzZXEpIHsKKwkJRFJNX0RFQlVHKCJ3YWl0aW5nIG9uIHZibGFuayBjb3VudCAldSwgY3J0 YyAldVxuIiwKKwkJCSAgdmJsd2FpdC0+cmVxdWVzdC5zZXF1ZW5jZSwgcGlwZSk7CisJCURSTV9X QUlUX09OKHJldCwgdmJsYW5rLT5xdWV1ZSwgMyAqIEhaLAorCQkJICAgIHZibGFua19wYXNzZWQo ZHJtX3ZibGFua19jb3VudChkZXYsIHBpcGUpLAorCQkJCQkgIHZibHdhaXQtPnJlcXVlc3Quc2Vx dWVuY2UpIHx8CisJCQkgICAgIVJFQURfT05DRSh2YmxhbmstPmVuYWJsZWQpKTsKKwl9CisKKwlp ZiAocmV0ICE9IC1FSU5UUikgeworCQlzdHJ1Y3QgdGltZXZhbCBub3c7CisKKwkJdmJsd2FpdC0+ cmVwbHkuc2VxdWVuY2UgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgcGlwZSwgJm5v dyk7CisJCXZibHdhaXQtPnJlcGx5LnR2YWxfc2VjID0gbm93LnR2X3NlYzsKKwkJdmJsd2FpdC0+ cmVwbHkudHZhbF91c2VjID0gbm93LnR2X3VzZWM7CisKKwkJRFJNX0RFQlVHKCJjcnRjICVkIHJl dHVybmluZyAldSB0byBjbGllbnRcbiIsCisJCQkgIHBpcGUsIHZibHdhaXQtPnJlcGx5LnNlcXVl bmNlKTsKKwl9IGVsc2UgeworCQlEUk1fREVCVUcoImNydGMgJWQgdmJsYW5rIHdhaXQgaW50ZXJy dXB0ZWQgYnkgc2lnbmFsXG4iLCBwaXBlKTsKKwl9CisKK2RvbmU6CisJZHJtX3ZibGFua19wdXQo ZGV2LCBwaXBlKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBkcm1faGFuZGxlX3Zi bGFua19ldmVudHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpCit7 CisJc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCAqZSwgKnQ7CisJc3RydWN0IHRpbWV2 YWwgbm93OworCXVuc2lnbmVkIGludCBzZXE7CisKKwlhc3NlcnRfc3Bpbl9sb2NrZWQoJmRldi0+ ZXZlbnRfbG9jayk7CisKKwlzZXEgPSBkcm1fdmJsYW5rX2NvdW50X2FuZF90aW1lKGRldiwgcGlw ZSwgJm5vdyk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoZSwgdCwgJmRldi0+dmJsYW5r X2V2ZW50X2xpc3QsIGJhc2UubGluaykgeworCQlpZiAoZS0+cGlwZSAhPSBwaXBlKQorCQkJY29u dGludWU7CisJCWlmICghdmJsYW5rX3Bhc3NlZChzZXEsIGUtPmV2ZW50LnNlcXVlbmNlKSkKKwkJ CWNvbnRpbnVlOworCisJCURSTV9ERUJVRygidmJsYW5rIGV2ZW50IG9uICV1LCBjdXJyZW50ICV1 XG4iLAorCQkJICBlLT5ldmVudC5zZXF1ZW5jZSwgc2VxKTsKKworCQlsaXN0X2RlbCgmZS0+YmFz ZS5saW5rKTsKKwkJZHJtX3ZibGFua19wdXQoZGV2LCBwaXBlKTsKKwkJc2VuZF92YmxhbmtfZXZl bnQoZGV2LCBlLCBzZXEsICZub3cpOworCX0KKworCXRyYWNlX2RybV92YmxhbmtfZXZlbnQocGlw ZSwgc2VxKTsKK30KKworLyoqCisgKiBkcm1faGFuZGxlX3ZibGFuayAtIGhhbmRsZSBhIHZibGFu ayBldmVudAorICogQGRldjogRFJNIGRldmljZQorICogQHBpcGU6IGluZGV4IG9mIENSVEMgd2hl cmUgdGhpcyBldmVudCBvY2N1cnJlZAorICoKKyAqIERyaXZlcnMgc2hvdWxkIGNhbGwgdGhpcyBy b3V0aW5lIGluIHRoZWlyIHZibGFuayBpbnRlcnJ1cHQgaGFuZGxlcnMgdG8KKyAqIHVwZGF0ZSB0 aGUgdmJsYW5rIGNvdW50ZXIgYW5kIHNlbmQgYW55IHNpZ25hbHMgdGhhdCBtYXkgYmUgcGVuZGlu Zy4KKyAqCisgKiBUaGlzIGlzIHRoZSBsZWdhY3kgdmVyc2lvbiBvZiBkcm1fY3J0Y19oYW5kbGVf dmJsYW5rKCkuCisgKi8KK2Jvb2wgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgdW5zaWduZWQgaW50IHBpcGUpCit7CisJc3RydWN0IGRybV92YmxhbmtfY3J0YyAqdmJs YW5rID0gJmRldi0+dmJsYW5rW3BpcGVdOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJYm9v bCBkaXNhYmxlX2lycTsKKworCWlmIChXQVJOX09OX09OQ0UoIWRldi0+bnVtX2NydGNzKSkKKwkJ cmV0dXJuIGZhbHNlOworCisJaWYgKFdBUk5fT04ocGlwZSA+PSBkZXYtPm51bV9jcnRjcykpCisJ CXJldHVybiBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkZXYtPmV2ZW50X2xvY2ssIGly cWZsYWdzKTsKKworCS8qIE5lZWQgdGltZXN0YW1wIGxvY2sgdG8gcHJldmVudCBjb25jdXJyZW50 IGV4ZWN1dGlvbiB3aXRoCisJICogdmJsYW5rIGVuYWJsZS9kaXNhYmxlLCBhcyB0aGlzIHdvdWxk IGNhdXNlIGluY29uc2lzdGVudAorCSAqIG9yIGNvcnJ1cHRlZCB0aW1lc3RhbXBzIGFuZCB2Ymxh bmsgY291bnRzLgorCSAqLworCXNwaW5fbG9jaygmZGV2LT52YmxhbmtfdGltZV9sb2NrKTsKKwor CS8qIFZibGFuayBpcnEgaGFuZGxpbmcgZGlzYWJsZWQuIE5vdGhpbmcgdG8gZG8uICovCisJaWYg KCF2YmxhbmstPmVuYWJsZWQpIHsKKwkJc3Bpbl91bmxvY2soJmRldi0+dmJsYW5rX3RpbWVfbG9j ayk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgaXJxZmxhZ3Mp OworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJZHJtX3VwZGF0ZV92YmxhbmtfY291bnQoZGV2LCBw aXBlLCB0cnVlKTsKKworCXNwaW5fdW5sb2NrKCZkZXYtPnZibGFua190aW1lX2xvY2spOworCisJ d2FrZV91cCgmdmJsYW5rLT5xdWV1ZSk7CisKKwkvKiBXaXRoIGluc3RhbnQtb2ZmLCB3ZSBkZWZl ciBkaXNhYmxpbmcgdGhlIGludGVycnVwdCB1bnRpbCBhZnRlcgorCSAqIHdlIGZpbmlzaCBwcm9j ZXNzaW5nIHRoZSBmb2xsb3dpbmcgdmJsYW5rIGFmdGVyIGFsbCBldmVudHMgaGF2ZQorCSAqIGJl ZW4gc2lnbmFsZWQuIFRoZSBkaXNhYmxlIGhhcyB0byBiZSBsYXN0IChhZnRlcgorCSAqIGRybV9o YW5kbGVfdmJsYW5rX2V2ZW50cykgc28gdGhhdCB0aGUgdGltZXN0YW1wIGlzIGFsd2F5cyBhY2N1 cmF0ZS4KKwkgKi8KKwlkaXNhYmxlX2lycSA9IChkZXYtPnZibGFua19kaXNhYmxlX2ltbWVkaWF0 ZSAmJgorCQkgICAgICAgZHJtX3ZibGFua19vZmZkZWxheSA+IDAgJiYKKwkJICAgICAgICFhdG9t aWNfcmVhZCgmdmJsYW5rLT5yZWZjb3VudCkpOworCisJZHJtX2hhbmRsZV92YmxhbmtfZXZlbnRz KGRldiwgcGlwZSk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ss IGlycWZsYWdzKTsKKworCWlmIChkaXNhYmxlX2lycSkKKwkJdmJsYW5rX2Rpc2FibGVfZm4oKHVu c2lnbmVkIGxvbmcpdmJsYW5rKTsKKworCXJldHVybiB0cnVlOworfQorRVhQT1JUX1NZTUJPTChk cm1faGFuZGxlX3ZibGFuayk7CisKKy8qKgorICogZHJtX2NydGNfaGFuZGxlX3ZibGFuayAtIGhh bmRsZSBhIHZibGFuayBldmVudAorICogQGNydGM6IHdoZXJlIHRoaXMgZXZlbnQgb2NjdXJyZWQK KyAqCisgKiBEcml2ZXJzIHNob3VsZCBjYWxsIHRoaXMgcm91dGluZSBpbiB0aGVpciB2Ymxhbmsg aW50ZXJydXB0IGhhbmRsZXJzIHRvCisgKiB1cGRhdGUgdGhlIHZibGFuayBjb3VudGVyIGFuZCBz ZW5kIGFueSBzaWduYWxzIHRoYXQgbWF5IGJlIHBlbmRpbmcuCisgKgorICogVGhpcyBpcyB0aGUg bmF0aXZlIEtNUyB2ZXJzaW9uIG9mIGRybV9oYW5kbGVfdmJsYW5rKCkuCisgKgorICogUmV0dXJu czoKKyAqIFRydWUgaWYgdGhlIGV2ZW50IHdhcyBzdWNjZXNzZnVsbHkgaGFuZGxlZCwgZmFsc2Ug b24gZmFpbHVyZS4KKyAqLworYm9vbCBkcm1fY3J0Y19oYW5kbGVfdmJsYW5rKHN0cnVjdCBkcm1f Y3J0YyAqY3J0YykKK3sKKwlyZXR1cm4gZHJtX2hhbmRsZV92YmxhbmsoY3J0Yy0+ZGV2LCBkcm1f Y3J0Y19pbmRleChjcnRjKSk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9jcnRjX2hhbmRsZV92Ymxh bmspOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJtUC5oIGIvaW5jbHVkZS9kcm0vZHJtUC5o CmluZGV4IGMzNjNmMmZkZmYzMS4uMmUwYjc2Y2NlYjk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2Ry bS9kcm1QLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtUC5oCkBAIC04MCw2ICs4MCw5IEBACiAjaW5j bHVkZSA8ZHJtL2RybV9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8ZHJtL2RybV9pb2N0bC5oPgogI2lu Y2x1ZGUgPGRybS9kcm1fc3lzZnMuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX3ZibGFuay5oPgorI2lu Y2x1ZGUgPGRybS9kcm1faXJxLmg+CisKIAogc3RydWN0IG1vZHVsZTsKIApAQCAtNDQ3LDggKzQ1 MCw2IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBkcm1fZHJ2X3VzZXNfYXRvbWljX21vZGVzZXQoc3Ry dWN0IGRybV9kZXZpY2UgKmRldikKIAlyZXR1cm4gZGV2LT5tb2RlX2NvbmZpZy5mdW5jcy0+YXRv bWljX2NvbW1pdCAhPSBOVUxMOwogfQogCi0jaW5jbHVkZSA8ZHJtL2RybV9pcnEuaD4KLQogI2Rl ZmluZSBEUk1fU1dJVENIX1BPV0VSX09OIDAKICNkZWZpbmUgRFJNX1NXSVRDSF9QT1dFUl9PRkYg MQogI2RlZmluZSBEUk1fU1dJVENIX1BPV0VSX0NIQU5HSU5HIDIKZGlmZiAtLWdpdCBhL2luY2x1 ZGUvZHJtL2RybV9maWxlLmggYi9pbmNsdWRlL2RybS9kcm1fZmlsZS5oCmluZGV4IDVkZDI3YWU1 YzQ3Yy4uZDY2ZjdlZTA3ZmI1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1fZmlsZS5oCisr KyBiL2luY2x1ZGUvZHJtL2RybV9maWxlLmgKQEAgLTQwLDYgKzQwLDcgQEAKIHN0cnVjdCBkbWFf ZmVuY2U7CiBzdHJ1Y3QgZHJtX2ZpbGU7CiBzdHJ1Y3QgZHJtX2RldmljZTsKK3N0cnVjdCBkZXZp Y2U7CiAKIC8qCiAgKiBGSVhNRTogTm90IHN1cmUgd2Ugd2FudCB0byBoYXZlIGRybV9taW5vciBo ZXJlIGluIHRoZSBlbmQsIGJ1dCB0byBhdm9pZApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcm0vZHJt X2lycS5oIGIvaW5jbHVkZS9kcm0vZHJtX2lycS5oCmluZGV4IDU2OWNhODZkNGUxZi4uZDc3ZjZl NjViMWM2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9kcm1faXJxLmgKKysrIGIvaW5jbHVkZS9k cm0vZHJtX2lycS5oCkBAIC0yNCwxNjUgKzI0LDkgQEAKICNpZm5kZWYgX0RSTV9JUlFfSF8KICNk ZWZpbmUgX0RSTV9JUlFfSF8KIAotI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2suaD4KLQotLyoqCi0g KiBzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50IC0gcGVuZGluZyB2YmxhbmsgZXZlbnQg dHJhY2tpbmcKLSAqLwotc3RydWN0IGRybV9wZW5kaW5nX3ZibGFua19ldmVudCB7Ci0JLyoqCi0J ICogQGJhc2U6IEJhc2Ugc3RydWN0dXJlIGZvciB0cmFja2luZyBwZW5kaW5nIERSTSBldmVudHMu Ci0JICovCi0Jc3RydWN0IGRybV9wZW5kaW5nX2V2ZW50IGJhc2U7Ci0JLyoqCi0JICogQHBpcGU6 IGRybV9jcnRjX2luZGV4KCkgb2YgdGhlICZkcm1fY3J0YyB0aGlzIGV2ZW50IGlzIGZvci4KLQkg Ki8KLQl1bnNpZ25lZCBpbnQgcGlwZTsKLQkvKioKLQkgKiBAZXZlbnQ6IEFjdHVhbCBldmVudCB3 aGljaCB3aWxsIGJlIHNlbnQgdG8gdXNlcnNwYWNlLgotCSAqLwotCXN0cnVjdCBkcm1fZXZlbnRf dmJsYW5rIGV2ZW50OwotfTsKLQotLyoqCi0gKiBzdHJ1Y3QgZHJtX3ZibGFua19jcnRjIC0gdmJs YW5rIHRyYWNraW5nIGZvciBhIENSVEMKLSAqCi0gKiBUaGlzIHN0cnVjdHVyZSB0cmFja3MgdGhl IHZibGFuayBzdGF0ZSBmb3Igb25lIENSVEMuCi0gKgotICogTm90ZSB0aGF0IGZvciBoaXN0b3Jp Y2FsIHJlYXNvbnMgLSB0aGUgdmJsYW5rIGhhbmRsaW5nIGNvZGUgaXMgc3RpbGwgc2hhcmVkCi0g KiB3aXRoIGxlZ2FjeS9ub24ta21zIGRyaXZlcnMgLSB0aGlzIGlzIGEgZnJlZS1zdGFuZGluZyBz dHJ1Y3R1cmUgbm90IGRpcmVjdGx5Ci0gKiBjb25uZWN0ZWQgdG8gJnN0cnVjdCBkcm1fY3J0Yy4g QnV0IGFsbCBwdWJsaWMgaW50ZXJmYWNlIGZ1bmN0aW9ucyBhcmUgdGFraW5nCi0gKiBhICZzdHJ1 Y3QgZHJtX2NydGMgdG8gaGlkZSB0aGlzIGltcGxlbWVudGF0aW9uIGRldGFpbC4KLSAqLwotc3Ry dWN0IGRybV92YmxhbmtfY3J0YyB7Ci0JLyoqCi0JICogQGRldjogUG9pbnRlciB0byB0aGUgJmRy bV9kZXZpY2UuCi0JICovCi0Jc3RydWN0IGRybV9kZXZpY2UgKmRldjsKLQkvKioKLQkgKiBAcXVl dWU6IFdhaXQgcXVldWUgZm9yIHZibGFuayB3YWl0ZXJzLgotCSAqLwotCXdhaXRfcXVldWVfaGVh ZF90IHF1ZXVlOwkvKio8IFZCTEFOSyB3YWl0IHF1ZXVlICovCi0JLyoqCi0JICogQGRpc2FibGVf dGltZXI6IERpc2FibGUgdGltZXIgZm9yIHRoZSBkZWxheWVkIHZibGFuayBkaXNhYmxpbmcKLQkg KiBoeXN0ZXJlc2lzIGxvZ2ljLiBWYmxhbmsgZGlzYWJsaW5nIGlzIGNvbnRyb2xsZWQgdGhyb3Vn aCB0aGUKLQkgKiBkcm1fdmJsYW5rX29mZmRlbGF5IG1vZHVsZSBvcHRpb24gYW5kIHRoZSBzZXR0 aW5nIG9mIHRoZQotCSAqICZkcm1fZGV2aWNlLm1heF92YmxhbmtfY291bnQgdmFsdWUuCi0JICov Ci0Jc3RydWN0IHRpbWVyX2xpc3QgZGlzYWJsZV90aW1lcjsKLQotCS8qKgotCSAqIEBzZXFsb2Nr OiBQcm90ZWN0IHZibGFuayBjb3VudCBhbmQgdGltZS4KLQkgKi8KLQlzZXFsb2NrX3Qgc2VxbG9j azsJCS8qIHByb3RlY3RzIHZibGFuayBjb3VudCBhbmQgdGltZSAqLwotCi0JLyoqCi0JICogQGNv dW50OiBDdXJyZW50IHNvZnR3YXJlIHZibGFuayBjb3VudGVyLgotCSAqLwotCXUzMiBjb3VudDsK LQkvKioKLQkgKiBAdGltZTogVmJsYW5rIHRpbWVzdGFtcCBjb3JyZXNwb25kaW5nIHRvIEBjb3Vu dC4KLQkgKi8KLQlzdHJ1Y3QgdGltZXZhbCB0aW1lOwotCi0JLyoqCi0JICogQHJlZmNvdW50OiBO dW1iZXIgb2YgdXNlcnMvd2FpdGVycyBvZiB0aGUgdmJsYW5rIGludGVycnVwdC4gT25seSB3aGVu Ci0JICogdGhpcyByZWZjb3VudCByZWFjaGVzIDAgY2FuIHRoZSBoYXJkd2FyZSBpbnRlcnJ1cHQg YmUgZGlzYWJsZWQgdXNpbmcKLQkgKiBAZGlzYWJsZV90aW1lci4KLQkgKi8KLQlhdG9taWNfdCBy ZWZjb3VudDsJCS8qIG51bWJlciBvZiB1c2VycyBvZiB2YmxhbmsgaW50ZXJydXB0c3BlciBjcnRj ICovCi0JLyoqCi0JICogQGxhc3Q6IFByb3RlY3RlZCBieSAmZHJtX2RldmljZS52YmxfbG9jaywg dXNlZCBmb3Igd3JhcGFyb3VuZCBoYW5kbGluZy4KLQkgKi8KLQl1MzIgbGFzdDsKLQkvKioKLQkg KiBAaW5tb2Rlc2V0OiBUcmFja3Mgd2hldGhlciB0aGUgdmJsYW5rIGlzIGRpc2FibGVkIGR1ZSB0 byBhIG1vZGVzZXQuCi0JICogRm9yIGxlZ2FjeSBkcml2ZXIgYml0IDIgYWRkaXRpb25hbGx5IHRy YWNrcyB3aGV0aGVyIGFuIGFkZGl0aW9uYWwKLQkgKiB0ZW1wb3JhcnkgdmJsYW5rIHJlZmVyZW5j ZSBoYXMgYmVlbiBhY3F1aXJlZCB0byBwYXBlciBvdmVyIHRoZQotCSAqIGhhcmR3YXJlIGNvdW50 ZXIgcmVzZXR0aW5nL2p1bXBpbmcuIEtNUyBkcml2ZXJzIHNob3VsZCBpbnN0ZWFkIGp1c3QKLQkg KiBjYWxsIGRybV9jcnRjX3ZibGFua19vZmYoKSBhbmQgZHJtX2NydGNfdmJsYW5rX29uKCksIHdo aWNoIGV4cGxpY2l0bHkKLQkgKiBzYXZlIGFuZCByZXN0b3JlIHRoZSB2YmxhbmsgY291bnQuCi0J ICovCi0JdW5zaWduZWQgaW50IGlubW9kZXNldDsJCS8qIERpc3BsYXkgZHJpdmVyIGlzIHNldHRp bmcgbW9kZSAqLwotCS8qKgotCSAqIEBwaXBlOiBkcm1fY3J0Y19pbmRleCgpIG9mIHRoZSAmZHJt X2NydGMgY29ycmVzcG9uZGluZyB0byB0aGlzCi0JICogc3RydWN0dXJlLgotCSAqLwotCXVuc2ln bmVkIGludCBwaXBlOwotCS8qKgotCSAqIEBmcmFtZWR1cl9uczogRnJhbWUvRmllbGQgZHVyYXRp b24gaW4gbnMsIHVzZWQgYnkKLQkgKiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0 cG9zKCkgYW5kIGNvbXB1dGVkIGJ5Ci0JICogZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50 cygpLgotCSAqLwotCWludCBmcmFtZWR1cl9uczsKLQkvKioKLQkgKiBAbGluZWR1cl9uczogTGlu ZSBkdXJhdGlvbiBpbiBucywgdXNlZCBieQotCSAqIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9t X3NjYW5vdXRwb3MoKSBhbmQgY29tcHV0ZWQgYnkKLQkgKiBkcm1fY2FsY190aW1lc3RhbXBpbmdf Y29uc3RhbnRzKCkuCi0JICovCi0JaW50IGxpbmVkdXJfbnM7Ci0KLQkvKioKLQkgKiBAaHdtb2Rl OgotCSAqCi0JICogQ2FjaGUgb2YgdGhlIGN1cnJlbnQgaGFyZHdhcmUgZGlzcGxheSBtb2RlLiBP bmx5IHZhbGlkIHdoZW4gQGVuYWJsZWQKLQkgKiBpcyBzZXQuIFRoaXMgaXMgdXNlZCBieSBoZWxw ZXJzIGxpa2UKLQkgKiBkcm1fY2FsY192Ymx0aW1lc3RhbXBfZnJvbV9zY2Fub3V0cG9zKCkuIFdl IGNhbid0IGp1c3QgYWNjZXNzIHRoZQotCSAqIGhhcmR3YXJlIG1vZGUgYnkgZS5nLiBsb29raW5n IGF0ICZkcm1fY3J0Y19zdGF0ZS5hZGp1c3RlZF9tb2RlLAotCSAqIGJlY2F1c2UgdGhhdCBvbmUg aXMgcmVhbGx5IGhhcmQgdG8gZ2V0IGZyb20gaW50ZXJydXB0IGNvbnRleHQuCi0JICovCi0Jc3Ry dWN0IGRybV9kaXNwbGF5X21vZGUgaHdtb2RlOwotCi0JLyoqCi0JICogQGVuYWJsZWQ6IFRyYWNr cyB0aGUgZW5hYmxpbmcgc3RhdGUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgJmRybV9jcnRjIHRvCi0J ICogYXZvaWQgZG91YmxlLWRpc2FibGluZyBhbmQgaGVuY2UgY29ycnVwdGluZyBzYXZlZCBzdGF0 ZS4gTmVlZGVkIGJ5Ci0JICogZHJpdmVycyBub3QgdXNpbmcgYXRvbWljIEtNUywgc2luY2UgdGhv c2UgbWlnaHQgZ28gdGhyb3VnaCB0aGVpciBDUlRDCi0JICogZGlzYWJsaW5nIGZ1bmN0aW9ucyBt dWx0aXBsZSB0aW1lcy4KLQkgKi8KLQlib29sIGVuYWJsZWQ7Ci19Oworc3RydWN0IGRybV9kZXZp Y2U7CiAKIGludCBkcm1faXJxX2luc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGly cSk7CiBpbnQgZHJtX2lycV91bmluc3RhbGwoc3RydWN0IGRybV9kZXZpY2UgKmRldik7CiAKLWlu dCBkcm1fdmJsYW5rX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IG51 bV9jcnRjcyk7Ci11MzIgZHJtX2NydGNfdmJsYW5rX2NvdW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0 Yyk7Ci11MzIgZHJtX2NydGNfdmJsYW5rX2NvdW50X2FuZF90aW1lKHN0cnVjdCBkcm1fY3J0YyAq Y3J0YywKLQkJCQkgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSk7Ci12b2lkIGRybV9jcnRj X3NlbmRfdmJsYW5rX2V2ZW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKLQkJCSAgICAgICBzdHJ1 Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplKTsKLXZvaWQgZHJtX2NydGNfYXJtX3ZibGFu a19ldmVudChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCi0JCQkgICAgICBzdHJ1Y3QgZHJtX3BlbmRp bmdfdmJsYW5rX2V2ZW50ICplKTsKLWJvb2wgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRybV9k ZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpOwotYm9vbCBkcm1fY3J0Y19oYW5kbGVfdmJs YW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Ci1pbnQgZHJtX2NydGNfdmJsYW5rX2dldChzdHJ1 Y3QgZHJtX2NydGMgKmNydGMpOwotdm9pZCBkcm1fY3J0Y192YmxhbmtfcHV0KHN0cnVjdCBkcm1f Y3J0YyAqY3J0Yyk7Ci12b2lkIGRybV93YWl0X29uZV92Ymxhbmsoc3RydWN0IGRybV9kZXZpY2Ug KmRldiwgdW5zaWduZWQgaW50IHBpcGUpOwotdm9pZCBkcm1fY3J0Y193YWl0X29uZV92Ymxhbmso c3RydWN0IGRybV9jcnRjICpjcnRjKTsKLXZvaWQgZHJtX2NydGNfdmJsYW5rX29mZihzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMpOwotdm9pZCBkcm1fY3J0Y192YmxhbmtfcmVzZXQoc3RydWN0IGRybV9j cnRjICpjcnRjKTsKLXZvaWQgZHJtX2NydGNfdmJsYW5rX29uKHN0cnVjdCBkcm1fY3J0YyAqY3J0 Yyk7Ci12b2lkIGRybV92YmxhbmtfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKLXUz MiBkcm1fYWNjdXJhdGVfdmJsYW5rX2NvdW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7Ci0KLWJv b2wgZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2LAotCQkJCQkgICB1bnNpZ25lZCBpbnQgcGlwZSwgaW50ICptYXhfZXJyb3IsCi0JCQkJ CSAgIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKLQkJCQkJICAgYm9vbCBpbl92Ymxhbmtf aXJxKTsKLXZvaWQgZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhzdHJ1Y3QgZHJtX2Ny dGMgKmNydGMsCi0JCQkJICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSk7 Ci0KLS8qKgotICogZHJtX2NydGNfdmJsYW5rX3dhaXRxdWV1ZSAtIGdldCB2Ymxhbmsgd2FpdHF1 ZXVlIGZvciB0aGUgQ1JUQwotICogQGNydGM6IHdoaWNoIENSVEMncyB2Ymxhbmsgd2FpdHF1ZXVl IHRvIHJldHJpZXZlCi0gKgotICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byB0 aGUgdmJsYW5rIHdhaXRxdWV1ZSBmb3IgdGhlIENSVEMuCi0gKiBEcml2ZXJzIGNhbiB1c2UgdGhp cyB0byBpbXBsZW1lbnQgdmJsYW5rIHdhaXRzIHVzaW5nIHdhaXRfZXZlbnQoKSBhbmQgcmVsYXRl ZAotICogZnVuY3Rpb25zLgotICovCi1zdGF0aWMgaW5saW5lIHdhaXRfcXVldWVfaGVhZF90ICpk cm1fY3J0Y192Ymxhbmtfd2FpdHF1ZXVlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKLXsKLQlyZXR1 cm4gJmNydGMtPmRldi0+dmJsYW5rW2RybV9jcnRjX2luZGV4KGNydGMpXS5xdWV1ZTsKLX0KLQog I2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fcHJpbWUuaCBiL2luY2x1ZGUvZHJt L2RybV9wcmltZS5oCmluZGV4IDU5Y2NhYjQwMmU4NS4uOWNkOWUzNmY3N2I1IDEwMDY0NAotLS0g YS9pbmNsdWRlL2RybS9kcm1fcHJpbWUuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fcHJpbWUuaApA QCAtNTksNiArNTksOCBAQCBzdHJ1Y3QgZHJtX2RldmljZTsKIHN0cnVjdCBkcm1fZ2VtX29iamVj dDsKIHN0cnVjdCBkcm1fZmlsZTsKIAorc3RydWN0IGRldmljZTsKKwogc3RydWN0IGRtYV9idWYg KmRybV9nZW1fcHJpbWVfZXhwb3J0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCiAJCQkJICAgICBz dHJ1Y3QgZHJtX2dlbV9vYmplY3QgKm9iaiwKIAkJCQkgICAgIGludCBmbGFncyk7CmRpZmYgLS1n aXQgYS9pbmNsdWRlL2RybS9kcm1fdmJsYW5rLmggYi9pbmNsdWRlL2RybS9kcm1fdmJsYW5rLmgK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi40Y2RlNDczMzJkZmEKLS0t IC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2RybS9kcm1fdmJsYW5rLmgKQEAgLTAsMCArMSwxODEg QEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBJbnRlbCBDb3JwLgorICoKKyAqIFBlcm1pc3Npb24g aXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmlu ZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlv biBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0 aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJp Z2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1 YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8g cGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBk byBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGlu ZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVz IG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhF IFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJ TkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8g VEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisg KiBWQSBMSU5VWCBTWVNURU1TIEFORC9PUiBJVFMgU1VQUExJRVJTIEJFIExJQUJMRSBGT1IgQU5Z IENMQUlNLCBEQU1BR0VTIE9SCisgKiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNU SU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwKKyAqIEFSSVNJTkcgRlJPTSwgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUgorICog T1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX0RSTV9WQkxB TktfSF8KKyNkZWZpbmUgX0RSTV9WQkxBTktfSF8KKworI2luY2x1ZGUgPGxpbnV4L3NlcWxvY2su aD4KKyNpbmNsdWRlIDxsaW51eC9pZHIuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisKKyNp bmNsdWRlIDxkcm0vZHJtX2ZpbGUuaD4KKyNpbmNsdWRlIDxkcm0vZHJtX21vZGVzLmg+CisjaW5j bHVkZSA8dWFwaS9kcm0vZHJtLmg+CisKK3N0cnVjdCBkcm1fZGV2aWNlOworc3RydWN0IGRybV9j cnRjOworCisvKioKKyAqIHN0cnVjdCBkcm1fcGVuZGluZ192YmxhbmtfZXZlbnQgLSBwZW5kaW5n IHZibGFuayBldmVudCB0cmFja2luZworICovCitzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2 ZW50IHsKKwkvKioKKwkgKiBAYmFzZTogQmFzZSBzdHJ1Y3R1cmUgZm9yIHRyYWNraW5nIHBlbmRp bmcgRFJNIGV2ZW50cy4KKwkgKi8KKwlzdHJ1Y3QgZHJtX3BlbmRpbmdfZXZlbnQgYmFzZTsKKwkv KioKKwkgKiBAcGlwZTogZHJtX2NydGNfaW5kZXgoKSBvZiB0aGUgJmRybV9jcnRjIHRoaXMgZXZl bnQgaXMgZm9yLgorCSAqLworCXVuc2lnbmVkIGludCBwaXBlOworCS8qKgorCSAqIEBldmVudDog QWN0dWFsIGV2ZW50IHdoaWNoIHdpbGwgYmUgc2VudCB0byB1c2Vyc3BhY2UuCisJICovCisJc3Ry dWN0IGRybV9ldmVudF92YmxhbmsgZXZlbnQ7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fdmJs YW5rX2NydGMgLSB2YmxhbmsgdHJhY2tpbmcgZm9yIGEgQ1JUQworICoKKyAqIFRoaXMgc3RydWN0 dXJlIHRyYWNrcyB0aGUgdmJsYW5rIHN0YXRlIGZvciBvbmUgQ1JUQy4KKyAqCisgKiBOb3RlIHRo YXQgZm9yIGhpc3RvcmljYWwgcmVhc29ucyAtIHRoZSB2YmxhbmsgaGFuZGxpbmcgY29kZSBpcyBz dGlsbCBzaGFyZWQKKyAqIHdpdGggbGVnYWN5L25vbi1rbXMgZHJpdmVycyAtIHRoaXMgaXMgYSBm cmVlLXN0YW5kaW5nIHN0cnVjdHVyZSBub3QgZGlyZWN0bHkKKyAqIGNvbm5lY3RlZCB0byAmc3Ry dWN0IGRybV9jcnRjLiBCdXQgYWxsIHB1YmxpYyBpbnRlcmZhY2UgZnVuY3Rpb25zIGFyZSB0YWtp bmcKKyAqIGEgJnN0cnVjdCBkcm1fY3J0YyB0byBoaWRlIHRoaXMgaW1wbGVtZW50YXRpb24gZGV0 YWlsLgorICovCitzdHJ1Y3QgZHJtX3ZibGFua19jcnRjIHsKKwkvKioKKwkgKiBAZGV2OiBQb2lu dGVyIHRvIHRoZSAmZHJtX2RldmljZS4KKwkgKi8KKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2Owor CS8qKgorCSAqIEBxdWV1ZTogV2FpdCBxdWV1ZSBmb3IgdmJsYW5rIHdhaXRlcnMuCisJICovCisJ d2FpdF9xdWV1ZV9oZWFkX3QgcXVldWU7CS8qKjwgVkJMQU5LIHdhaXQgcXVldWUgKi8KKwkvKioK KwkgKiBAZGlzYWJsZV90aW1lcjogRGlzYWJsZSB0aW1lciBmb3IgdGhlIGRlbGF5ZWQgdmJsYW5r IGRpc2FibGluZworCSAqIGh5c3RlcmVzaXMgbG9naWMuIFZibGFuayBkaXNhYmxpbmcgaXMgY29u dHJvbGxlZCB0aHJvdWdoIHRoZQorCSAqIGRybV92Ymxhbmtfb2ZmZGVsYXkgbW9kdWxlIG9wdGlv biBhbmQgdGhlIHNldHRpbmcgb2YgdGhlCisJICogJmRybV9kZXZpY2UubWF4X3ZibGFua19jb3Vu dCB2YWx1ZS4KKwkgKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBkaXNhYmxlX3RpbWVyOworCisJLyoq CisJICogQHNlcWxvY2s6IFByb3RlY3QgdmJsYW5rIGNvdW50IGFuZCB0aW1lLgorCSAqLworCXNl cWxvY2tfdCBzZXFsb2NrOwkJLyogcHJvdGVjdHMgdmJsYW5rIGNvdW50IGFuZCB0aW1lICovCisK KwkvKioKKwkgKiBAY291bnQ6IEN1cnJlbnQgc29mdHdhcmUgdmJsYW5rIGNvdW50ZXIuCisJICov CisJdTMyIGNvdW50OworCS8qKgorCSAqIEB0aW1lOiBWYmxhbmsgdGltZXN0YW1wIGNvcnJlc3Bv bmRpbmcgdG8gQGNvdW50LgorCSAqLworCXN0cnVjdCB0aW1ldmFsIHRpbWU7CisKKwkvKioKKwkg KiBAcmVmY291bnQ6IE51bWJlciBvZiB1c2Vycy93YWl0ZXJzIG9mIHRoZSB2YmxhbmsgaW50ZXJy dXB0LiBPbmx5IHdoZW4KKwkgKiB0aGlzIHJlZmNvdW50IHJlYWNoZXMgMCBjYW4gdGhlIGhhcmR3 YXJlIGludGVycnVwdCBiZSBkaXNhYmxlZCB1c2luZworCSAqIEBkaXNhYmxlX3RpbWVyLgorCSAq LworCWF0b21pY190IHJlZmNvdW50OwkJLyogbnVtYmVyIG9mIHVzZXJzIG9mIHZibGFuayBpbnRl cnJ1cHRzcGVyIGNydGMgKi8KKwkvKioKKwkgKiBAbGFzdDogUHJvdGVjdGVkIGJ5ICZkcm1fZGV2 aWNlLnZibF9sb2NrLCB1c2VkIGZvciB3cmFwYXJvdW5kIGhhbmRsaW5nLgorCSAqLworCXUzMiBs YXN0OworCS8qKgorCSAqIEBpbm1vZGVzZXQ6IFRyYWNrcyB3aGV0aGVyIHRoZSB2YmxhbmsgaXMg ZGlzYWJsZWQgZHVlIHRvIGEgbW9kZXNldC4KKwkgKiBGb3IgbGVnYWN5IGRyaXZlciBiaXQgMiBh ZGRpdGlvbmFsbHkgdHJhY2tzIHdoZXRoZXIgYW4gYWRkaXRpb25hbAorCSAqIHRlbXBvcmFyeSB2 YmxhbmsgcmVmZXJlbmNlIGhhcyBiZWVuIGFjcXVpcmVkIHRvIHBhcGVyIG92ZXIgdGhlCisJICog aGFyZHdhcmUgY291bnRlciByZXNldHRpbmcvanVtcGluZy4gS01TIGRyaXZlcnMgc2hvdWxkIGlu c3RlYWQganVzdAorCSAqIGNhbGwgZHJtX2NydGNfdmJsYW5rX29mZigpIGFuZCBkcm1fY3J0Y192 Ymxhbmtfb24oKSwgd2hpY2ggZXhwbGljaXRseQorCSAqIHNhdmUgYW5kIHJlc3RvcmUgdGhlIHZi bGFuayBjb3VudC4KKwkgKi8KKwl1bnNpZ25lZCBpbnQgaW5tb2Rlc2V0OwkJLyogRGlzcGxheSBk cml2ZXIgaXMgc2V0dGluZyBtb2RlICovCisJLyoqCisJICogQHBpcGU6IGRybV9jcnRjX2luZGV4 KCkgb2YgdGhlICZkcm1fY3J0YyBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKwkgKiBzdHJ1Y3R1cmUu CisJICovCisJdW5zaWduZWQgaW50IHBpcGU7CisJLyoqCisJICogQGZyYW1lZHVyX25zOiBGcmFt ZS9GaWVsZCBkdXJhdGlvbiBpbiBucywgdXNlZCBieQorCSAqIGRybV9jYWxjX3ZibHRpbWVzdGFt cF9mcm9tX3NjYW5vdXRwb3MoKSBhbmQgY29tcHV0ZWQgYnkKKwkgKiBkcm1fY2FsY190aW1lc3Rh bXBpbmdfY29uc3RhbnRzKCkuCisJICovCisJaW50IGZyYW1lZHVyX25zOworCS8qKgorCSAqIEBs aW5lZHVyX25zOiBMaW5lIGR1cmF0aW9uIGluIG5zLCB1c2VkIGJ5CisJICogZHJtX2NhbGNfdmJs dGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcygpIGFuZCBjb21wdXRlZCBieQorCSAqIGRybV9jYWxj X3RpbWVzdGFtcGluZ19jb25zdGFudHMoKS4KKwkgKi8KKwlpbnQgbGluZWR1cl9uczsKKworCS8q KgorCSAqIEBod21vZGU6CisJICoKKwkgKiBDYWNoZSBvZiB0aGUgY3VycmVudCBoYXJkd2FyZSBk aXNwbGF5IG1vZGUuIE9ubHkgdmFsaWQgd2hlbiBAZW5hYmxlZAorCSAqIGlzIHNldC4gVGhpcyBp cyB1c2VkIGJ5IGhlbHBlcnMgbGlrZQorCSAqIGRybV9jYWxjX3ZibHRpbWVzdGFtcF9mcm9tX3Nj YW5vdXRwb3MoKS4gV2UgY2FuJ3QganVzdCBhY2Nlc3MgdGhlCisJICogaGFyZHdhcmUgbW9kZSBi eSBlLmcuIGxvb2tpbmcgYXQgJmRybV9jcnRjX3N0YXRlLmFkanVzdGVkX21vZGUsCisJICogYmVj YXVzZSB0aGF0IG9uZSBpcyByZWFsbHkgaGFyZCB0byBnZXQgZnJvbSBpbnRlcnJ1cHQgY29udGV4 dC4KKwkgKi8KKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSBod21vZGU7CisKKwkvKioKKwkgKiBA ZW5hYmxlZDogVHJhY2tzIHRoZSBlbmFibGluZyBzdGF0ZSBvZiB0aGUgY29ycmVzcG9uZGluZyAm ZHJtX2NydGMgdG8KKwkgKiBhdm9pZCBkb3VibGUtZGlzYWJsaW5nIGFuZCBoZW5jZSBjb3JydXB0 aW5nIHNhdmVkIHN0YXRlLiBOZWVkZWQgYnkKKwkgKiBkcml2ZXJzIG5vdCB1c2luZyBhdG9taWMg S01TLCBzaW5jZSB0aG9zZSBtaWdodCBnbyB0aHJvdWdoIHRoZWlyIENSVEMKKwkgKiBkaXNhYmxp bmcgZnVuY3Rpb25zIG11bHRpcGxlIHRpbWVzLgorCSAqLworCWJvb2wgZW5hYmxlZDsKK307CisK K2ludCBkcm1fdmJsYW5rX2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50 IG51bV9jcnRjcyk7Cit1MzIgZHJtX2NydGNfdmJsYW5rX2NvdW50KHN0cnVjdCBkcm1fY3J0YyAq Y3J0Yyk7Cit1MzIgZHJtX2NydGNfdmJsYW5rX2NvdW50X2FuZF90aW1lKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YywKKwkJCQkgICBzdHJ1Y3QgdGltZXZhbCAqdmJsYW5rdGltZSk7Cit2b2lkIGRybV9j cnRjX3NlbmRfdmJsYW5rX2V2ZW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKKwkJCSAgICAgICBz dHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICplKTsKK3ZvaWQgZHJtX2NydGNfYXJtX3Zi bGFua19ldmVudChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsCisJCQkgICAgICBzdHJ1Y3QgZHJtX3Bl bmRpbmdfdmJsYW5rX2V2ZW50ICplKTsKK2Jvb2wgZHJtX2hhbmRsZV92Ymxhbmsoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpOworYm9vbCBkcm1fY3J0Y19oYW5kbGVf dmJsYW5rKHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CitpbnQgZHJtX2NydGNfdmJsYW5rX2dldChz dHJ1Y3QgZHJtX2NydGMgKmNydGMpOwordm9pZCBkcm1fY3J0Y192YmxhbmtfcHV0KHN0cnVjdCBk cm1fY3J0YyAqY3J0Yyk7Cit2b2lkIGRybV93YWl0X29uZV92Ymxhbmsoc3RydWN0IGRybV9kZXZp Y2UgKmRldiwgdW5zaWduZWQgaW50IHBpcGUpOwordm9pZCBkcm1fY3J0Y193YWl0X29uZV92Ymxh bmsoc3RydWN0IGRybV9jcnRjICpjcnRjKTsKK3ZvaWQgZHJtX2NydGNfdmJsYW5rX29mZihzdHJ1 Y3QgZHJtX2NydGMgKmNydGMpOwordm9pZCBkcm1fY3J0Y192YmxhbmtfcmVzZXQoc3RydWN0IGRy bV9jcnRjICpjcnRjKTsKK3ZvaWQgZHJtX2NydGNfdmJsYW5rX29uKHN0cnVjdCBkcm1fY3J0YyAq Y3J0Yyk7Cit2b2lkIGRybV92YmxhbmtfY2xlYW51cChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsK K3UzMiBkcm1fYWNjdXJhdGVfdmJsYW5rX2NvdW50KHN0cnVjdCBkcm1fY3J0YyAqY3J0Yyk7CisK K2Jvb2wgZHJtX2NhbGNfdmJsdGltZXN0YW1wX2Zyb21fc2Nhbm91dHBvcyhzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LAorCQkJCQkgICB1bnNpZ25lZCBpbnQgcGlwZSwgaW50ICptYXhfZXJyb3IsCisJ CQkJCSAgIHN0cnVjdCB0aW1ldmFsICp2YmxhbmtfdGltZSwKKwkJCQkJICAgYm9vbCBpbl92Ymxh bmtfaXJxKTsKK3ZvaWQgZHJtX2NhbGNfdGltZXN0YW1waW5nX2NvbnN0YW50cyhzdHJ1Y3QgZHJt X2NydGMgKmNydGMsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9k ZSk7Cit3YWl0X3F1ZXVlX2hlYWRfdCAqZHJtX2NydGNfdmJsYW5rX3dhaXRxdWV1ZShzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMpOworI2VuZGlmCi0tIAoyLjExLjAKCl9fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRl dmVsQGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9t YWlsbWFuL2xpc3RpbmZvL2RyaS1kZXZlbAo=