From mboxrd@z Thu Jan 1 00:00:00 1970 From: Francisco Jerez Subject: [PATCH 6/9] cpufreq/intel_pstate: Implement variably low-pass filtering controller for small core. Date: Tue, 27 Mar 2018 23:38:42 -0700 Message-ID: <20180328063845.4884-7-currojerez@riseup.net> References: <20180328063845.4884-1-currojerez@riseup.net> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20180328063845.4884-1-currojerez@riseup.net> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: linux-pm@vger.kernel.org, intel-gfx@lists.freedesktop.org, Srinivas Pandruvada Cc: Eero Tamminen , "Rafael J. Wysocki" List-Id: linux-pm@vger.kernel.org VGhpcyBpbnRyb2R1Y2VzIGEgY29udHJvbGxlciBmb3IgbG93LXBvd2VyIHBhcnRzIHRoYXQgdGFr ZXMgYWR2YW50YWdlCm9mIHRoZSBJTyBhY3RpdmUgdGltZSBzdGF0aXN0aWMgaW50cm9kdWNlZCBl YXJsaWVyIGluIG9yZGVyIHRvIGFkanVzdAp0aGUgdHJhZGUtb2ZmIGJldHdlZW4gcmVzcG9uc2l2 ZW5lc3MgYW5kIGVuZXJneSBlZmZpY2llbmN5IG9mIHRoZQpoZXVyaXN0aWMgZHluYW1pY2FsbHku ICBUaGlzIGFsbG93cyBpdCB0byBhY2hpZXZlIGxvd2VyIGVuZXJneQpjb25zdW1wdGlvbiB3aGVu IHRoZSBzeXN0ZW0gaXMgZmFyIGVub3VnaCBmcm9tIHRoZSBDUFUtYm91bmQgZW5kIG9mCnRoZSBJ TyB1dGlsaXphdGlvbiBzdGF0aXN0aWMuICBJbiBsb3ctbGF0ZW5jeSBtb2RlIHRoZSBjb250cm9s bGVyIGlzCmFjdHVhbGx5IHNvbWV3aGF0IG1vcmUgYWdncmVzc2l2ZSB0aGFuIHRoZSBjdXJyZW50 IG9uZSBkdWUgdG8gaXRzIHVzZQpvZiB0aGUgQVBFUi9NUEVSRiByYXRpbyAocGFydGljdWxhcmx5 IGlmIEMwIHJlc2lkZW5jeSBpcyBsb3csIHdoaWNoIGJ5Cml0c2VsZiBwYXJ0bHkgbWl0aWdhdGVz IHRoZSBsb3dlciBlbmVyZ3kgZWZmaWNpZW5jeSBvZiB0aGUgYWdncmVzc2l2ZQpoZXVyaXN0aWMp IC0tIFNlZSB0aGUgY29tbWVudHMgYmVsb3cgZm9yIHRoZSByYXRpb25hbGUuCgpUaGUgaGV1cmlz dGljIGlzIHR1bmVkIHRvIHJvdWdobHkgbWF0Y2ggdGhlIHBlcmZvcm1hbmNlIG51bWJlcnMgb2Yg dGhlCmN1cnJlbnQgZ292ZXJub3IgKHdoaWNoIGlzIHJhdGhlciBhZ2dyZXNzaXZlKSBpbiBsYXRl bmN5LWJvdW5kCnRlc3QtY2FzZXMsIHNvIHRoZSBlbmVyZ3ktc2F2aW5nIGJlaGF2aW9yIHdvbid0 IGtpY2sgaW4gd2l0aCB0aGUKY3VycmVudCBjYWxpYnJhdGlvbiBleGNlcHQgd2hlbiBoZWF2aWx5 IElPLWJvdW5kIGZvciBzb21lIHRpbWUuICBUaGUKUlQgYW5kIERMIHNjaGVkdWxpbmcgZmxhZ3Mg Y291bGQgcG90ZW50aWFsbHkgcHJvdmlkZSBhIHVzZWZ1bAphZGRpdGlvbmFsIHZhcmlhYmxlIGZv ciB0aGUgaGV1cmlzdGljIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSB3b3JrbG9hZAppcyBsYXRlbmN5 LXNlbnNpdGl2ZSwgYWxsb3dpbmcgaXQgdG8gc2F2ZSBwb3dlciBpbiBvdGhlcgoobm9uLUlPLWJv dW5kKSBjYXNlcywgYnV0IHRoaXMgaXMgbm90IGF0dGVtcHRlZCBpbiB0aGlzIHNlcmllcyBzaW5j ZQp0aGVyZSB3b3VsZCBiZSBhbiBpbmNyZWFzZWQgcmlzayBvZiBwZXJmb3JtYW5jZSByZWdyZXNz aW9ucyBkdWUgdG8KbGF0ZW5jeS1zZW5zaXRpdmUgdGFza3Mgbm90IG1hcmtlZCBSVCBvciBETC4K CkZvciB0aGUgbW9tZW50IHRoaXMgaXMgb25seSBlbmFibGVkIG9uIEJYVCBpbiBvcmRlciB0byBy ZWR1Y2UgdGhlCmV4dGVudCBvZiBhbnkgdW5leHBlY3RlZCBmYWxsb3V0LCBidXQgaXQgc2hvdWxk IHdvcmsgb24gb3RoZXIKbG93LXBvd2VyIHBsYXRmb3JtcyBpZiBpdCdzIGhvb2tlZCB1cCB0byB0 aGUgcmlnaHQgcHN0YXRlX2Z1bmNzIHRhYmxlCihhdCB5b3VyIG93biByaXNrKS4KClNpZ25lZC1v ZmYtYnk6IEZyYW5jaXNjbyBKZXJleiA8Y3Vycm9qZXJlekByaXNldXAubmV0PgotLS0KIGRyaXZl cnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYyB8IDM1NyArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrLQogMSBmaWxlIGNoYW5nZWQsIDM1MyBpbnNlcnRpb25zKCspLCA0IGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYyBi L2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwppbmRleCBlZjY5OWEzYTIzOGYuLmQ0YjVk MGFhYTI4MiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2ludGVsX3BzdGF0ZS5jCisrKyBi L2RyaXZlcnMvY3B1ZnJlcS9pbnRlbF9wc3RhdGUuYwpAQCAtNjEsNiArNjEsMTEgQEAgc3RhdGlj IGlubGluZSBpbnQzMl90IG11bF9mcChpbnQzMl90IHgsIGludDMyX3QgeSkKIAlyZXR1cm4gKChp bnQ2NF90KXggKiAoaW50NjRfdCl5KSA+PiBGUkFDX0JJVFM7CiB9CiAKK3N0YXRpYyBpbmxpbmUg aW50IHJuZF9mcChpbnQzMl90IHgpCit7CisJcmV0dXJuICh4ICsgKDEgPDwgKEZSQUNfQklUUyAt IDEpKSkgPj4gRlJBQ19CSVRTOworfQorCiBzdGF0aWMgaW5saW5lIGludDMyX3QgZGl2X2ZwKHM2 NCB4LCBzNjQgeSkKIHsKIAlyZXR1cm4gZGl2NjRfczY0KChpbnQ2NF90KXggPDwgRlJBQ19CSVRT LCB5KTsKQEAgLTE3MSw2ICsxNzYsMjMgQEAgc3RydWN0IHZpZF9kYXRhIHsKIAlpbnQzMl90IHJh dGlvOwogfTsKIAorLyoqCisgKiBzdHJ1Y3QgbHBfZGF0YSAtIExQIGNvbnRyb2xsZXIgcGFyYW1l dGVycyBhbmQgc3RhdGUuCisgKiBAc2FtcGxlX2ludGVydmFsX25zOiAgVXBkYXRlIGludGVydmFs IGluIG5zCisgKiBAbGFzdF9pb19hY3RpdmVfbnM6ICAgQ3VtdWxhdGl2ZSBJTyBhY3RpdmUgdGlt ZSBpbiBucyBvYnNlcnZlZCBhdCB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICBsYXN0IHNh bXBsZS4KKyAqIEBzZXRwb2ludDogICAgICAgICAgICBUYXJnZXQgQ1BVIHV0aWxpemF0aW9uIGF0 IHdoaWNoIHRoZSBjb250cm9sbGVyIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0 ZWQgdG8gbGVhdmUgdGhlIGN1cnJlbnQgUC1zdGF0ZSB1bnRvdWNoZWQsIGFzCisgKiAgICAgICAg ICAgICAgICAgICAgICAgYSBmaXhlZC1wb2ludCBmcmFjdGlvbi4KKyAqIEBwX2Jhc2U6ICAgICAg ICAgICAgICBMb3ctcGFzcyBmaWx0ZXJlZCBQLXN0YXRlIGFzIGEgZml4ZWQtcG9pbnQgZnJhY3Rp b24uCisgKi8KK3N0cnVjdCBscF9kYXRhIHsKKwlzNjQgc2FtcGxlX2ludGVydmFsX25zOworCXVp bnQ2NF90IGxhc3RfaW9fYWN0aXZlX25zOworCWludDMyX3Qgc2V0cG9pbnQ7CisJaW50MzJfdCBw X2Jhc2U7Cit9OworCiAvKioKICAqIHN0cnVjdCBnbG9iYWxfcGFyYW1zIC0gR2xvYmFsIHBhcmFt ZXRlcnMsIG1vc3RseSB0dW5hYmxlIHZpYSBzeXNmcy4KICAqIEBub190dXJibzoJCVdoZXRoZXIg b3Igbm90IHRvIHVzZSB0dXJibyBQLXN0YXRlcy4KQEAgLTIzNCw2ICsyNTYsNyBAQCBzdHJ1Y3Qg Y3B1ZGF0YSB7CiAKIAlzdHJ1Y3QgcHN0YXRlX2RhdGEgcHN0YXRlOwogCXN0cnVjdCB2aWRfZGF0 YSB2aWQ7CisJc3RydWN0IGxwX2RhdGEgbHA7CiAKIAl1NjQJbGFzdF91cGRhdGU7CiAJdTY0CWxh c3Rfc2FtcGxlX3RpbWU7CkBAIC0yNTgsNiArMjgxLDI4IEBAIHN0cnVjdCBjcHVkYXRhIHsKIAog c3RhdGljIHN0cnVjdCBjcHVkYXRhICoqYWxsX2NwdV9kYXRhOwogCisvKioKKyAqIHN0cnVjdCBs cF9wYXJhbXMgLSBMUCBjb250cm9sbGVyIHN0YXRpYyBjb25maWd1cmF0aW9uCisgKiBAc2FtcGxl X2ludGVydmFsX21zOiAgICAgIFVwZGF0ZSBpbnRlcnZhbCBpbiBtcworICogQHNldHBvaW50X3Bt bDogICAgICAgICAgICBUYXJnZXQgQ1BVIHV0aWxpemF0aW9uIGF0IHdoaWNoIHRoZSBjb250cm9s bGVyIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIHRvIGxlYXZlIHRo ZSBjdXJyZW50IFAtc3RhdGUgdW50b3VjaGVkLAorICogICAgICAgICAgICAgICAgICAgICAgICAg ICBhcyBhbiBpbnRlZ2VyIHBlciBtaWxsZS4KKyAqIEBwX2Jhc2VfYXZnX2h6OiAgICAgICAgICAg RXhwb25lbnRpYWwgYXZlcmFnaW5nIGZyZXF1ZW5jeSBvZiB0aGUgUC1zdGF0ZQorICogICAgICAg ICAgICAgICAgICAgICAgICAgICBsb3ctcGFzcyBmaWx0ZXIgYXMgYW4gaW50ZWdlciBpbiBIei4K KyAqIEBpb19hY3RpdmVfdGhyZXNob2xkX3BtbDogSU8gdXRpbGl6YXRpb24gdGhyZXNob2xkIGF0 IHdoaWNoIHRoZSBjb250cm9sbGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3Vs ZCB0cmFuc2l0aW9uIHRvIGEgaGlnaGVyIGxhdGVuY3kgbG93LXBhc3MKKyAqICAgICAgICAgICAg ICAgICAgICAgICAgICAgZmlsdGVyaW5nIG1vZGUsIGFzIGFuIGludGVnZXIgcGVyIG1pbGxlLgor ICogQGlvX2FjdGl2ZV9hdmdfaHo6ICAgICAgICBFeHBvbmVudGlhbCBhdmVyYWdpbmcgZnJlcXVl bmN5IG9mIHRoZSBJTworICogICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsaXphdGlvbiBz dGF0aXN0aWMgYXMgYW4gaW50ZWdlciBpbiBIei4KKyAqLworc3RydWN0IGxwX3BhcmFtcyB7CisJ aW50IHNhbXBsZV9pbnRlcnZhbF9tczsKKwlpbnQgc2V0cG9pbnRfcG1sOworCWludCBwX2Jhc2Vf YXZnX2h6OworCWludCBpb19hY3RpdmVfdGhyZXNob2xkX3BtbDsKKwlpbnQgaW9fYWN0aXZlX2F2 Z19oejsKK307CisKIC8qKgogICogc3RydWN0IHBzdGF0ZV9mdW5jcyAtIFBlciBDUFUgbW9kZWwg c3BlY2lmaWMgY2FsbGJhY2tzCiAgKiBAZ2V0X21heDoJCUNhbGxiYWNrIHRvIGdldCBtYXhpbXVt IG5vbiB0dXJibyBlZmZlY3RpdmUgUCBzdGF0ZQpAQCAtMjg2LDYgKzMzMSwxMyBAQCBzdHJ1Y3Qg cHN0YXRlX2Z1bmNzIHsKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgcHN0YXRlX2Z1bmNzIHBzdGF0ZV9m dW5jcyBfX3JlYWRfbW9zdGx5Oworc3RhdGljIHN0cnVjdCBscF9wYXJhbXMgbHBfcGFyYW1zIF9f cmVhZF9tb3N0bHkgPSB7CisJLnNhbXBsZV9pbnRlcnZhbF9tcyA9IDEwLAorCS5zZXRwb2ludF9w bWwgPSA3MDAsCisJLnBfYmFzZV9hdmdfaHogPSAzLAorCS5pb19hY3RpdmVfdGhyZXNob2xkX3Bt bCA9IDk4MywKKwkuaW9fYWN0aXZlX2F2Z19oeiA9IDMKK307CiAKIHN0YXRpYyBpbnQgaHdwX2Fj dGl2ZSBfX3JlYWRfbW9zdGx5Owogc3RhdGljIGJvb2wgcGVyX2NwdV9saW1pdHMgX19yZWFkX21v c3RseTsKQEAgLTE0ODMsNiArMTUzNSwyODUgQEAgc3RhdGljIGlubGluZSBpbnQzMl90IGdldF90 YXJnZXRfcHN0YXRlX3VzZV9jcHVfbG9hZChzdHJ1Y3QgY3B1ZGF0YSAqY3B1KQogCXJldHVybiB0 YXJnZXQ7CiB9CiAKKy8qKgorICogSW5pdGlhbGl6ZSB0aGUgc3RydWN0IGxwX2RhdGEgb2YgdGhl IHNwZWNpZmllZCBDUFUgdG8gdGhlIGRlZmF1bHRzCisgKiBjYWxjdWxhdGVkIGZyb20gQGxwX3Bh cmFtcy4KKyAqLworc3RhdGljIHZvaWQgaW50ZWxfcHN0YXRlX2xwX3Jlc2V0KHN0cnVjdCBjcHVk YXRhICpjcHUpCit7CisJc3RydWN0IGxwX2RhdGEgKmxwID0gJmNwdS0+bHA7CisKKwlscC0+c2Ft cGxlX2ludGVydmFsX25zID0gbHBfcGFyYW1zLnNhbXBsZV9pbnRlcnZhbF9tcyAqIE5TRUNfUEVS X01TRUM7CisJbHAtPnNldHBvaW50ID0gZGl2X2ZwKGxwX3BhcmFtcy5zZXRwb2ludF9wbWwsIDEw MDApOworCWxwLT5wX2Jhc2UgPSBpbnRfdG9mcChjcHUtPnBzdGF0ZS5jdXJyZW50X3BzdGF0ZSk7 Cit9CisKKy8qKgorICogVW5pdCByYW1wIGZ1bmN0aW9uIHVzZWQgYXMgYnVpbGRpbmcgYmxvY2sg Zm9yIG1vcmUgY29tcGxleAorICogcGllY2V3aXNlIGxpbmVhciBmdW5jdGlvbnMuCisgKi8KK3N0 YXRpYyBpbnQzMl90IHJhbXAoaW50MzJfdCB4MCwgaW50MzJfdCB4MSwgaW50MzJfdCB4KQorewor CXJldHVybiB4IDw9IHgwID8gMCA6CisJICAgICAgIHggPj0geDEgPyBpbnRfdG9mcCgxKSA6CisJ ICAgICAgIGRpdl9mcCh4IC0geDAsIHgxIC0geDApOworfQorCisvKioKKyAqIEZpeGVkIHBvaW50 IHJlcHJlc2VudGF0aW9uIHdpdGggdHdpY2UgdGhlIHVzdWFsIG51bWJlciBvZgorICogZnJhY3Rp b25hbCBiaXRzLgorICovCisjZGVmaW5lIERGUkFDX0JJVFMgMTYKKyNkZWZpbmUgREZSQUNfT05F ICgxIDw8IERGUkFDX0JJVFMpCisjZGVmaW5lIERGUkFDX01BWF9JTlQgKDB1IC0gKHVpbnQzMl90 KURGUkFDX09ORSkKKworLyoqCisgKiBGYXN0IGJ1dCByYXRoZXIgaW5hY2N1cmF0ZSBwaWVjZXdp c2UtbGluZWFyIGFwcHJveGltYXRpb24gb2YgYQorICogZml4ZWQtcG9pbnQgcHJvZHVjdCBieSBh biBpbnZlcnNlIGV4cG9uZW50aWFsOgorICoKKyAqICBkZWNheShhLCBwKSA9IGEgKiAyIF4gKC1w IC8gREZSQUNfT05FKSArIE8oYSkKKyAqCisgKiBUaGUgZXJyb3IgdGVybSBzaG91bGQgYmUgbG93 ZXIgaW4gbWFnbml0dWRlIHRoYW4gMC4wNDQgKiBhLgorICovCitzdGF0aWMgaW50MzJfdCBkZWNh eShpbnQzMl90IGEsIHVpbnQzMl90IHApCit7CisJaWYgKGEgPCAwKSB7CisJCS8qCisJCSAqIEF2 b2lkIGltcGxlbWVudGF0aW9uLWRlZmluZWQgYmVoYXZpb3IgaW4gc2lnbmVkCisJCSAqIHJpZ2h0 IHNoaWZ0IG9mIG5lZ2F0aXZlIGludGVnZXIuCisJCSAqLworCQlyZXR1cm4gLWRlY2F5KC1hLCBw KTsKKworCX0gZWxzZSBpZiAocCA8IDMyICogREZSQUNfT05FKSB7CisJCS8qIEludGVycG9sYXRl IGJldHdlZW4gMl4tZmxvb3IocCkgYW5kIDJeLWNlaWwocCkuICovCisJCWNvbnN0IHVpbnQzMl90 IGZsb29yX3AgPSBwID4+IERGUkFDX0JJVFM7CisJCWNvbnN0IHVpbnQzMl90IGNlaWxfcCA9IChw ICsgREZSQUNfT05FIC0gMSkgPj4gREZSQUNfQklUUzsKKwkJY29uc3QgdWludDY0X3QgZnJhY19w ID0gcCAtIChmbG9vcl9wIDw8IERGUkFDX0JJVFMpOworCisJCXJldHVybiAoKGEgPj4gZmxvb3Jf cCkgKiAoREZSQUNfT05FIC0gZnJhY19wKSArCisJCQkoY2VpbF9wID49IDMyID8gMCA6IGEgPj4g Y2VpbF9wKSAqIGZyYWNfcCkgPj4KKwkJICAgICAgIERGUkFDX0JJVFM7CisJfQorCisJLyogU2hv cnQtY2lyY3VpdCB0byBhdm9pZCBvdmVyZmxvdy4gKi8KKwlyZXR1cm4gMDsKK30KKworLyoqCisg KiBDYWxjdWxhdGUgdGhlIHRhcmdldCBQLXN0YXRlIGZvciB0aGUgbmV4dCB1cGRhdGUgcGVyaW9k LiAgVXNlcyBhCisgKiAodmFyaWFibHkpIGxvdy1wYXNzLWZpbHRlcmluZyBjb250cm9sbGVyIGlu dGVuZGVkIHRvIGltcHJvdmUgZW5lcmd5CisgKiBlZmZpY2llbmN5IHVuZGVyIHNvbWUgY29uZGl0 aW9ucyBjb250cm9sbGVkIGhldXJpc3RpY2FsbHkuCisgKi8KK3N0YXRpYyBpbnQzMl90IGdldF90 YXJnZXRfcHN0YXRlX2xwKHN0cnVjdCBjcHVkYXRhICpjcHUpCit7CisJc3RydWN0IGxwX2RhdGEg KmxwID0gJmNwdS0+bHA7CisJLyoKKwkgKiBFc3RpbWF0ZSB0aGUgYXZlcmFnZSBJTyB1dGlsaXph dGlvbiBvdmVyIHRoZSBzYW1wbGluZworCSAqIGludGVydmFsLgorCSAqLworCWNvbnN0IHVpbnQ2 NF90IGRlbHRhX25zID0gY3B1LT5zYW1wbGUudGltZSAtIGNwdS0+bGFzdF9zYW1wbGVfdGltZTsK Kwljb25zdCB1aW50NjRfdCBpb19hY3RpdmVfbnMgPSBjcHVmcmVxX2lvX2FjdGl2ZV90aW1lX25z KCk7CisJY29uc3QgdWludDMyX3QgaW9fYWN0aXZlX3BtbCA9IGRpdl9mcCgKKwkJKGlvX2FjdGl2 ZV9ucyAtIGxwLT5sYXN0X2lvX2FjdGl2ZV9ucykgKiAxMDAwLAorCQlkZWx0YV9ucyk7CisJLyoK KwkgKiBBcHByb3hpbWF0ZSwgYnV0IHNhdmVzIHR3byA2NC1iaXQgaW50ZWdlciBkaXZpc2lvbnMg YmVsb3cKKwkgKiBhbmQgc2hvdWxkIGJlIGZ1bGx5IGV2YWx1YXRlZCBhdCBjb21waWxlLXRpbWUu ICBDYXVzZXMgdGhlCisJICogZXhwb25lbnRpYWwgYXZlcmFnaW5nIHRvIGhhdmUgYW4gZWZmZWN0 aXZlIGJhc2Ugb2YKKwkgKiAxLjkwNzAyMzQzNzQ5LCB3aGljaCBoYXMgbGl0dGxlIGZ1bmN0aW9u YWwgaW1wbGljYXRpb25zIGFzCisJICogbG9uZyBhcyB0aGUgaW9fYWN0aXZlX2F2Z19oeiBhbmQg cF9iYXNlX2F2Z19oeiBwYXJhbWV0ZXJzCisJICogYXJlIHNjYWxlZCBhY2NvcmRpbmdseS4KKwkg Ki8KKwljb25zdCB1aW50MzJfdCBuc19wZXJfc19zaGlmdCA9IG9yZGVyX2Jhc2VfMihOU0VDX1BF Ul9TRUMpOworCS8qCisJICogRXhwb25lbnRpYWxseSBhdmVyYWdlIHRoZSBJTyB1dGlsaXphdGlv biBvYnNlcnZlZCBkdXJpbmcKKwkgKiB0aGUgbGFzdCBpbnRlcnZhbCBpbiBvcmRlciB0byBvYnRh aW4gYSBtb3JlIGxvbmctdGVybQorCSAqIHN0YXRpc3RpYy4gIFRoZSBleHBvbmVudCBwIGlzIHRo ZSByYXRpbyBiZXR3ZWVuIHRoZSBlbGFwc2VkCisJICogdGltZSBhbmQgYW4gZXhwb25lbnRpYWwg YXZlcmFnaW5nIHRpbWUgY29uc3RhbnQ6CisJICoKKwkgKiAgIFQwID0gcyAvIGlvX2FjdGl2ZV9h dmdfaHoKKwkgKgorCSAqIFRoaXMgdGltZSBjb25zdGFudCBzaG91bGQgdHlwaWNhbGx5IGJlIG9m IHRoZSBvcmRlciBvZgorCSAqIG1hZ25pdHVkZSBvZiB0aGUgdGltZSBjb25zdGFudCBUMSBvZiB0 aGUgbG93LXBhc3MgZmlsdGVyIGluCisJICogb3JkZXIgZm9yIHRoZSBJTyB1dGlsaXphdGlvbiBz dGF0aXN0aWMgdG8gY29udGFpbiBhCisJICogbm9uLW5lZ2xpZ2libGUgY29udHJpYnV0aW9uIGZy b20gdGhlIGJlaGF2aW9yIG9mIHRoZSBzeXN0ZW0KKwkgKiBpbiB0aGUgd2luZG93IG9mIHRpbWUg aW4gd2hpY2ggdGhlIGxvdy1wYXNzIGZpbHRlciB3aWxsIGJlCisJICogcmVhcnJhbmdpbmcgdGhl IHdvcmtsb2FkLiAgQSBsb25nZXIgdGltZSBjb25zdGFudCBwcm92aWRlcworCSAqIGEgbW9yZSBz dGFibGUgc3RhdGlzdGljIGF0IHRoZSBjb3N0IG9mIG1ha2luZyBpdCBsZXNzCisJICogcmVzcG9u c2l2ZSB0byBjaGFuZ2VzIGluIHRoZSBiZWhhdmlvciBvZiB0aGUgc3lzdGVtLgorCSAqLworCWNv bnN0IHVpbnQzMl90IHAgPSBtaW4oKHVpbnQ2NF90KURGUkFDX01BWF9JTlQsCisJCQkgICAgICAg KGxwX3BhcmFtcy5pb19hY3RpdmVfYXZnX2h6ICogZGVsdGFfbnMpID4+CisJCQkgICAgICAgKG5z X3Blcl9zX3NoaWZ0IC0gREZSQUNfQklUUykpOworCWNvbnN0IHVpbnQzMl90IGlvX2FjdGl2ZV9h dmdfcG1sID0gaW9fYWN0aXZlX3BtbCArCisJCWRlY2F5KGNwdS0+aW93YWl0X2Jvb3N0IC0gaW9f YWN0aXZlX3BtbCwgcCk7CisJLyoKKwkgKiBXaGV0aGVyIHRoZSBzeXN0ZW0gaXMgdW5kZXIgY2xv c2UgdG8gZnVsbCBJTyB1dGlsaXphdGlvbiwKKwkgKiB3aGljaCBjYXVzZXMgdGhlIGNvbnRyb2xs ZXIgdG8gbWFrZSBhIG1vcmUgY29uc2VydmF0aXZlCisJICogdHJhZGUtb2ZmIGJldHdlZW4gbGF0 ZW5jeSBhbmQgZW5lcmd5IHVzYWdlLCBzaW5jZSB0aGUKKwkgKiBzeXN0ZW0gaXMgY2xvc2UgdG8g SU8tYm91bmQgc28gcGVyZm9ybWFuY2UgaXNuJ3QgZ3VhcmFudGVlZAorCSAqIHRvIHNjYWxlIGZ1 cnRoZXIgd2l0aCBpbmNyZWFzaW5nIENQVSBmcmVxdWVuY3kuCisJICoKKwkgKiBJZiB0aGUgd29y a2xvYWQgKmlzKiBsYXRlbmN5LWJvdW5kIGRlc3BpdGUgdGhlIG5lYXJseSBmdWxsCisJICogSU8g dXRpbGl6YXRpb24sIHRoZSBtb3JlIGNvbnNlcnZhdGl2ZSBiZWhhdmlvciBvZiB0aGUKKwkgKiBj b250cm9sbGVyIHdpbGwgcmVzdWx0IGluIG5lZ2F0aXZlIGZlZWQtYmFjayBjYXVzaW5nIHRoZSBJ TworCSAqIHV0aWxpemF0aW9uIHRvIGRyb3AgdW5kZXIgaW9fYWN0aXZlX3RocmVzaG9sZF9wbWws IGF0IHdoaWNoCisJICogcG9pbnQgdGhlIGNvbnRyb2xsZXIgd2lsbCBzd2l0Y2ggYmFjayB0byB0 aGUgbW9yZQorCSAqIGFnZ3Jlc3NpdmVseSBsYXRlbmN5LW1pbmltaXppbmcgbW9kZSwgd2hpY2gg d2lsbCBjYXVzZSB0aGUKKwkgKiBJTyB1dGlsaXphdGlvbiB0byBpbmNyZWFzZS4KKwkgKgorCSAq IFRoaXMgbWVhbnMgdGhhdCBpb19hY3RpdmVfdGhyZXNob2xkX3BtbCBhY3RzIGFzIGEgcG9pbnQg b2YKKwkgKiBzdGFibGUgZXF1aWxpYnJpdW0gb2YgdGhlIHN5c3RlbSBmb3IgbGF0ZW5jeS1ib3Vu ZCBJTworCSAqIHdvcmtsb2Fkcywgc28gaXQgc2hvdWxkIGJlIHJhdGhlciBoaWdoIGluIG9yZGVy IHRvIGF2b2lkCisJICogdW5kZXJ1dGlsaXppbmcgSU8gZGV2aWNlcyBhcm91bmQgZXF1aWxpYnJp dW0sIHdoaWNoIG1heQorCSAqIGh1cnQgcGVyZm9ybWFuY2UgZm9yIHN1Y2ggKHJhdGhlciBwYXRo b2xvZ2ljYWwpIHdvcmtsb2Fkcy4KKwkgKiBBcHBsaWNhdGlvbnMgdGhhdCBwaXBlbGluZSBDUFUg YW5kIElPIHdvcmsgc2hvdWxkbid0IGJlCisJICogYXBwcmVjaWFibHkgbGF0ZW5jeS1ib3VuZCBh bmQgd2lsbCBiZSBhYmxlIHRvIGFjaGlldmUgZnVsbAorCSAqIElPIHV0aWxpemF0aW9uIHJlZ2Fy ZGxlc3Mgb2YgaW9fYWN0aXZlX3RocmVzaG9sZF9wbWwuICBJbgorCSAqIGFkZGl0aW9uIHRoZXkg d2lsbCBvYnRhaW4gY29tcGFyYXRpdmVseSBsb3dlciBlbmVyZ3kgdXNhZ2UKKwkgKiBzaW5jZSB0 aGUgY29udHJvbGxlciBzaG91bGQgaGFyZGx5IGV2ZXIgaGF2ZSB0byBzd2l0Y2ggdG8KKwkgKiBs YXRlbmN5LW1pbmltaXppbmcgbW9kZSBpbiB0aGUgc3RlYWR5IHN0YXRlLgorCSAqLworCWNvbnN0 IGJvb2wgcmVsYXggPSBybmRfZnAoaW9fYWN0aXZlX2F2Z19wbWwpID49CisJCQkgICBscF9wYXJh bXMuaW9fYWN0aXZlX3RocmVzaG9sZF9wbWw7CisJLyoKKwkgKiBQLXN0YXRlIGxpbWl0cyBpbiBm aXhlZC1wb2ludCBhcyBhbGxvd2VkIGJ5IHRoZSBwb2xpY3kuCisJICovCisJY29uc3QgaW50MzJf dCBwX21pbiA9IGludF90b2ZwKG1heChjcHUtPnBzdGF0ZS5taW5fcHN0YXRlLAorCQkJCQkgICBj cHUtPm1pbl9wZXJmX3JhdGlvKSk7CisJY29uc3QgaW50MzJfdCBwX21heCA9IGludF90b2ZwKGNw dS0+bWF4X3BlcmZfcmF0aW8pOworCWNvbnN0IGludDMyX3QgcF9jdXIgPSBpbnRfdG9mcChjcHUt PnBzdGF0ZS5jdXJyZW50X3BzdGF0ZSk7CisJLyoKKwkgKiBPYnNlcnZlZCBhdmVyYWdlIFAtc3Rh dGUgZHVyaW5nIChhIHBhcnQgb2YpIHRoZSBzYW1wbGluZworCSAqIHBlcmlvZC4gIFRoZSBjb25z ZXJ2YXRpdmUgcGF0aCB1c2VzIHRoZSBUU0MgaW5jcmVtZW50IGFzCisJICogZGVub21pbmF0b3Ig d2hpY2ggd2lsbCBnaXZlIHRoZSBtaW5pbXVtIChhcmd1YWJseSBtb3N0CisJICogZW5lcmd5LWVm ZmljaWVudCkgUC1zdGF0ZSBhYmxlIHRvIGFjY29tcGxpc2ggdGhlIG9ic2VydmVkCisJICogYW1v dW50IG9mIHdvcmsgZHVyaW5nIHRoZSBzYW1wbGluZyBwZXJpb2QuCisJICoKKwkgKiBUaGUgZG93 bnNpZGUgb2YgdGhhdCBzb21ld2hhdCBvcHRpbWlzdGljIGVzdGltYXRlIGlzIHRoYXQKKwkgKiBp dCBjYW4gZ2l2ZSBhIHJhdGhlciBiaWFzZWQgcmVzdWx0IGZvciBpbnRlcm1pdHRlbnQKKwkgKiBs YXRlbmN5LXNlbnNpdGl2ZSB3b3JrbG9hZHMsIHdoaWNoIG1heSBoYXZlIHRvIGJlIGNvbXBsZXRl ZAorCSAqIGluIGEgc2hvcnQgd2luZG93IG9mIHRpbWUgZm9yIHRoZSBzeXN0ZW0gdG8gYWNoaWV2 ZSBtYXhpbXVtCisJICogcGVyZm9ybWFuY2UsIGV2ZW4gdGhvdWdoIHRoZSBhdmVyYWdlIENQVSB1 dGlsaXphdGlvbiBpcworCSAqIGxvdy4gIEZvciB0aGF0IHJlYXNvbiB0aGUgbGF0ZW5jeS1taW5p bWl6aW5nIGhldXJpc3RpYyB1c2VzCisJICogdGhlIE1QRVJGIGluY3JlbWVudCBhcyBkZW5vbWlu YXRvciBpbnN0ZWFkLCB3aGljaCB3aWxsIGdpdmUKKwkgKiB0aGUgUC1zdGF0ZSBhYmxlIHRvIGFj Y29tcGxpc2ggdGhlIG9ic2VydmVkIGFtb3VudCBvZiB3b3JrCisJICogZHVyaW5nIHRoZSB0aW1l IHRoYXQgdGhlIHByb2Nlc3NvciB3YXMgYWN0dWFsbHkgYXdha2UgKGluCisJICogQzAgc3RhdGUg c3BlY2lmaWNhbGx5KSwgd2hpY2ggaXMgYXBwcm94aW1hdGVseSBvcHRpbWFsCisJICogdW5kZXIg dGhlIHJhdGhlciBwZXNzaW1pc3RpYyBhc3N1bXB0aW9uIHRoYXQgdGhlIENQVSB3b3JrCisJICog Y2Fubm90IGJlIHBhcmFsbGVsaXplZCB3aXRoIGFueSBvdGhlciBkZXBlbmRlbnQgSU8gd29yawor CSAqIHRoYXQgc3Vic2VxdWVudGx5IGtlZXBzIHRoZSBDUFUgaWRsZSAoYXJndWFibHkgaW4gQzEr CisJICogc3RhdGVzKSwgc28gTVBFUkYgcHJvdmlkZXMgYW4gZXN0aW1hdGUgb2YgdGhlIHRpbWUg dGhlIENQVQorCSAqIGFjdHVhbGx5IGhhZCBhdmFpbGFibGUgdG8gYWNjb21wbGlzaCB0aGUgb2Jz ZXJ2ZWQgd29yay4KKwkgKi8KKwljb25zdCBzNjQgbl9vYnMgPSBjcHUtPnNhbXBsZS5hcGVyZiA8 PCBjcHUtPmFwZXJmX21wZXJmX3NoaWZ0OworCWNvbnN0IHM2NCBuX21heCA9IChyZWxheCA/IGNw dS0+c2FtcGxlLnRzYyA6CisJCQkgICBjcHUtPnNhbXBsZS5tcGVyZiA8PCBjcHUtPmFwZXJmX21w ZXJmX3NoaWZ0KTsKKwljb25zdCBpbnQzMl90IHBfb2JzID0gbWluKHBfY3VyLCBkaXZfZnAoCisJ CQkJICAgICBuX29icyAqIGNwdS0+cHN0YXRlLm1heF9wc3RhdGVfcGh5c2ljYWwsCisJCQkJICAg ICBuX21heCkpOworCS8qCisJICogQXZlcmFnZSBQLXN0YXRlIHRoYXQgd291bGQgaGF2ZSBiZWVu IG9ic2VydmVkIGF0IHRoZSB0YXJnZXQKKwkgKiBDUFUgdXRpbGl6YXRpb24uICBBIGxvd2VyIHNl dHBvaW50IGZyYWN0aW9uIGdpdmVzIHRoZQorCSAqIGNvbnRyb2xsZXIgYSBzdHJvbmdlciB1cHdh cmQgYmlhcyBhbmQgYSBsYXJnZXIgcm9vbSBmb3IgdGhlCisJICogc3lzdGVtIGxvYWQgdG8gZmx1 Y3R1YXRlIGJldHdlZW4gdXBkYXRlIHBlcmlvZHMsIGF0IHRoZQorCSAqIGNvc3Qgb2YgaW5jcmVh c2luZyBlbmVyZ3kgdXNhZ2UuCisJICovCisJY29uc3QgaW50MzJfdCBwX3RndCA9IG11bF9mcChs cC0+c2V0cG9pbnQsIHBfY3VyKTsKKwkvKgorCSAqIFVuZmlsdGVyZWQgY29udHJvbGxlciByZXNw b25zZSBmb3IgdGhlIG9ic2VydmVkIGF2ZXJhZ2UKKwkgKiBwZXJmb3JtYW5jZSBkdXJpbmcgdGhl IGxhc3Qgc2FtcGxpbmcgcGVyaW9kLgkgVGhpcyBpcyB0aGUKKwkgKiBzaW1wbGVzdCBwaWVjZXdp c2UtbGluZWFyIGZ1bmN0aW9uIG9mIHBfb2JzIHRoYXQgc2F0aXNmaWVzCisJICogdGhlIGZvbGxv d2luZyBwcm9wZXJ0aWVzOgorCSAqCisJICogICAtIHBfZXN0KDApID0gcF9taW4KKwkgKiAgIC0g cF9lc3QocF90Z3QpID0gcF9jdXIKKwkgKiAgIC0gcF9lc3QocF9jdXIpID0gcF9tYXgKKwkgKgor CSAqIHdoaWNoIGVuc3VyZSB0aGF0IHRoZSBQLXN0YXRlIHJhbmdlIHNwZWNpZmllZCBieSB0aGUg cG9saWN5CisJICogaXMgaG9ub3JlZCBhbmQgdGhhdCB0aGUgY29udHJvbGxlciBoYXMgYSBmaXhl ZCBwb2ludCBhdCB0aGUKKwkgKiB0YXJnZXQgdXRpbGl6YXRpb24uCisJICovCisJY29uc3QgaW50 MzJfdCBwX2VzdCA9IG1heChwX21pbiwKKwkJCQkgIG11bF9mcChwX2N1ciwgcmFtcCgwLCBwX3Rn dCwgcF9vYnMpKSArCisJCQkJICBtdWxfZnAocF9tYXggLSBwX2N1ciwKKwkJCQkJIHJhbXAocF90 Z3QsIHBfY3VyLCBwX29icykpKTsKKwkvKgorCSAqIExvdy1wYXNzIGZpbHRlciB0aGUgUC1zdGF0 ZSBlc3RpbWF0ZSBhYm92ZSBieSBleHBvbmVudGlhbAorCSAqIGF2ZXJhZ2luZy4gIEZvciBhbiBv c2NpbGxhdGluZyB3b3JrbG9hZCAoZS5nLiBzdWJtaXR0aW5nCisJICogd29yayByZXBlYXRlZGx5 IHRvIGEgZGV2aWNlIGxpa2UgYSBzb3VuZGNhcmQgb3IgR1BVKSB0aGlzCisJICogd2lsbCBhcHBy b3hpbWF0ZSB0aGUgbWluaW11bSBQLXN0YXRlIHRoYXQgd291bGQgYmUgYWJsZSB0bworCSAqIGFj Y29tcGxpc2ggdGhlIG9ic2VydmVkIGFtb3VudCBvZiB3b3JrIGR1cmluZyB0aGUgYXZlcmFnaW5n CisJICogcGVyaW9kLCB3aGljaCBpcyBhbHNvIHRoZSBvcHRpbWFsbHkgZW5lcmd5LWVmZmljaWVu dCBvbmUsCisJICogdW5kZXIgdGhlIGFzc3VtcHRpb25zIHRoYXQ6CisJICoKKwkgKiAgLSBUaGUg cG93ZXIgY3VydmUgb2YgdGhlIHN5c3RlbSBpcyBjb252ZXggdGhyb3VnaG91dCB0aGUKKwkgKiAg ICByYW5nZSBvZiBQLXN0YXRlcyBhbGxvd2VkIGJ5IHRoZSBwb2xpY3kuCUkuZS4gZW5lcmd5CisJ ICogICAgZWZmaWNpZW5jeSBpcyBzdGVhZGlseSBkZWNyZWFzaW5nIHdpdGggZnJlcXVlbmN5IHBh c3QKKwkgKiAgICBwX21pbiAod2hpY2ggaXMgdHlwaWNhbGx5IGNsb3NlIHRvIHRoZQorCSAqICAg IG1heGltdW0tZWZmaWNpZW5jeSByYXRpbykuICBJbiBwcmFjdGljZSBmb3IgdGhlIGxvd2VyCisJ ICogICAgcmFuZ2Ugb2YgUC1zdGF0ZXMgdGhpcyBtYXkgb25seSBiZSBhcHByb3hpbWF0ZWx5IHRy dWUKKwkgKiAgICBkdWUgdG8gdGhlIGludGVyYWN0aW9uIGJldHdlZW4gZGlmZmVyZW50IGNvbXBv bmVudHMgb2YKKwkgKiAgICB0aGUgc3lzdGVtLgorCSAqCisJICogIC0gUGFyYWxsZWxpc20gY29u c3RyYWludHMgb2YgdGhlIHdvcmtsb2FkIGRvbid0IHByZXZlbnQgaXQKKwkgKiAgICBmcm9tIGFj aGlldmluZyB0aGUgc2FtZSB0aHJvdWdocHV0IGF0IHRoZSBsb3dlciBQLXN0YXRlLgorCSAqICAg IFRoaXMgd2lsbCBoYXBwZW4gaW4gY2FzZXMgd2hlcmUgdGhlIGFwcGxpY2F0aW9uIGlzCisJICog ICAgZGVzaWduZWQgaW4gYSB3YXkgdGhhdCBkb2Vzbid0IGFsbG93IGZvciBkZXBlbmRlbnQgQ1BV CisJICogICAgYW5kIElPIGpvYnMgdG8gYmUgcGlwZWxpbmVkLCBsZWFkaW5nIHRvIGFsdGVybmF0 aW5nIGZ1bGwKKwkgKiAgICBhbmQgemVybyB1dGlsaXphdGlvbiBvZiB0aGUgQ1BVIGFuZCBJTyBk ZXZpY2UuICBUaGlzCisJICogICAgd2lsbCBnaXZlIGFuIGF2ZXJhZ2UgSU8gZGV2aWNlIHV0aWxp emF0aW9uIGxvd2VyIHRoYW4KKwkgKiAgICAxMDAlIHJlZ2FyZGxlc3Mgb2YgdGhlIENQVSBmcmVx dWVuY3ksIHdoaWNoIGlzIGV4cGVjdGVkCisJICogICAgdG8gY2F1c2UgdGhlIGNvbnRyb2xsZXIg dG8gdHJhbnNpdGlvbiB0byBsb3ctbGF0ZW5jeQorCSAqICAgIG1vZGUgb25jZSB0aGUgSU8gdXRp bGl6YXRpb24gZHJvcHMgYmVsb3cKKwkgKiAgICBpb19hY3RpdmVfdGhyZXNob2xkX3BtbCwgYXQg d2hpY2ggcG9pbnQgcF9iYXNlIHdpbGwgbm8KKwkgKiAgICBsb25nZXIgaGF2ZSBhbiBpbmZsdWVu Y2Ugb24gdGhlIGNvbnRyb2xsZXIgcmVzcG9uc2UuCisJICoKKwkgKiAgLSBUaGUgcGVyaW9kIG9m IHRoZSBvc2NpbGxhdGluZyB3b3JrbG9hZCBpcyBzaWduaWZpY2FudGx5CisJICogICAgc2hvcnRl ciB0aGFuIHRoZSB0aW1lIGNvbnN0YW50IG9mIHRoZSBleHBvbmVudGlhbAorCSAqICAgIGF2ZXJh Z2U6CisJICoKKwkgKglUMSA9IHMgLyBwX2Jhc2VfYXZnX2h6CisJICoKKwkgKiAgICBPdGhlcndp c2UgZm9yIG1vcmUgc2xvd2x5IG9zY2lsbGF0aW5nIHdvcmtsb2FkcyB0aGUKKwkgKiAgICBjb250 cm9sbGVyIHJlc3BvbnNlIHdpbGwgcm91Z2hseSBmb2xsb3cgdGhlIG9zY2lsbGF0aW9uLAorCSAq ICAgIGxlYWRpbmcgdG8gZGVjcmVhc2VkIGVuZXJneSBlZmZpY2llbmN5LgorCSAqCisJICogIC0g VGhlIGJlaGF2aW9yIG9mIHRoZSB3b3JrbG9hZCBkb2Vzbid0IGNoYW5nZQorCSAqICAgIHF1YWxp dGF0aXZlbHkgZHVyaW5nIHRoZSBuZXh0IHVwZGF0ZSBpbnRlcnZhbC4gIFRoaXMgaXMKKwkgKiAg ICBvbmx5IHRydWUgaW4gdGhlIHN0ZWFkeSBzdGF0ZSwgYW5kIGNvdWxkIHBvc3NpYmx5IGxlYWQK KwkgKiAgICB0byBhIHRyYW5zaXRvcnkgcGVyaW9kIGluIHdoaWNoIHRoZSBjb250cm9sbGVyIHJl c3BvbnNlCisJICogICAgZGV2aWF0ZXMgZnJvbSB0aGUgbW9zdCBlbmVyZ3ktZWZmaWNpZW50IHJh dGlvIHVudGlsIHRoZQorCSAqICAgIHdvcmtsb2FkIHJlYWNoZXMgYSBzdGVhZHkgc3RhdGUgYWdh aW4uICBUaGlzIGNvdWxkIGJlCisJICogICAgbWl0aWdhdGVkIHRvIGEgY2VydGFpbiBleHRlbnQg d2l0aCBzb21lIGZvcm0gb2YKKwkgKiAgICBwZXItZW50aXR5IGxvYWQgdHJhY2tpbmcuCisJICov CisJY29uc3QgdWludDMyX3QgcSA9IG1pbigodWludDY0X3QpREZSQUNfTUFYX0lOVCwKKwkJCSAg ICAgICAobHBfcGFyYW1zLnBfYmFzZV9hdmdfaHogKiBkZWx0YV9ucykgPj4KKwkJCSAgICAgICAo bnNfcGVyX3Nfc2hpZnQgLSBERlJBQ19CSVRTKSk7CisJbHAtPnBfYmFzZSA9IHBfZXN0ICsgZGVj YXkobHAtPnBfYmFzZSAtIHBfZXN0LCBxKTsKKwkvKgorCSAqIFVwZGF0ZSBidXN5X3NjYWxlZCB3 aXRoIHRoZSB1dGlsaXphdGlvbiBmcmFjdGlvbiByZWxhdGl2ZQorCSAqIHRvIHRoZSBUU0MgYmFz ZSBmcmVxdWVuY3kuICBVc2VkIGZvciB0cmFjaW5nLiAgMTAwJQorCSAqIGluZGljYXRlcyBmdWxs IHV0aWxpemF0aW9uIGF0IHRoZSBtYXhpbXVtIG5vbi10dXJibworCSAqIGZyZXF1ZW5jeS4KKwkg Ki8KKwljcHUtPnNhbXBsZS5idXN5X3NjYWxlZCA9IGRpdl9mcCgxMDAgKiBuX29icywgY3B1LT5z YW1wbGUudHNjKTsKKwkvKgorCSAqIFRyYWNrIHRoZSBJTyB1dGlsaXphdGlvbiBzdGF0aXN0aWMg YXMgaW93YWl0X2Jvb3N0IGZvciBpdAorCSAqIHRvIHNob3cgdXAgaW4gdHJhY2VzIGluc3RlYWQg b2YgdGhlIGlvd2FpdF9ib29zdCBmcmFjdGlvbi4KKwkgKi8KKwljcHUtPmlvd2FpdF9ib29zdCA9 IGlvX2FjdGl2ZV9hdmdfcG1sOworCWxwLT5sYXN0X2lvX2FjdGl2ZV9ucyA9IGlvX2FjdGl2ZV9u czsKKwkvKgorCSAqIFVzZSB0aGUgbG93LXBhc3MtZmlsdGVyZWQgY29udHJvbGxlciByZXNwb25z ZSBmb3IgYmV0dGVyCisJICogZW5lcmd5IGVmZmljaWVuY3kgdW5sZXNzIHdlIGhhdmUgcmVhc29u cyB0byBiZWxpZXZlIHRoYXQKKwkgKiBzb21lIG9mIHRoZSBvcHRpbWFsaXR5IGFzc3VtcHRpb25z IGRpc2N1c3NlZCBhYm92ZSBtYXkgbm90CisJICogaG9sZC4KKwkgKi8KKwlyZXR1cm4gcm5kX2Zw KHJlbGF4ID8gbHAtPnBfYmFzZSA6IHBfZXN0KTsKK30KKwogc3RhdGljIGludCBpbnRlbF9wc3Rh dGVfcHJlcGFyZV9yZXF1ZXN0KHN0cnVjdCBjcHVkYXRhICpjcHUsIGludCBwc3RhdGUpCiB7CiAJ aW50IG1heF9wc3RhdGUgPSBpbnRlbF9wc3RhdGVfZ2V0X2Jhc2VfcHN0YXRlKGNwdSk7CkBAIC0x NTY2LDYgKzE4OTcsMjIgQEAgc3RhdGljIHZvaWQgaW50ZWxfcHN0YXRlX3VwZGF0ZV91dGlsKHN0 cnVjdCB1cGRhdGVfdXRpbF9kYXRhICpkYXRhLCB1NjQgdGltZSwKIAl9CiB9CiAKKy8qKgorICog SW1wbGVtZW50YXRpb24gb2YgdGhlIGNwdWZyZXEgdXBkYXRlX3V0aWwgaG9vayBiYXNlZCBvbiB0 aGUgTFAKKyAqIGNvbnRyb2xsZXIgKHNlZSBnZXRfdGFyZ2V0X3BzdGF0ZV9scCgpKS4KKyAqLwor c3RhdGljIHZvaWQgaW50ZWxfcHN0YXRlX3VwZGF0ZV91dGlsX2xwKHN0cnVjdCB1cGRhdGVfdXRp bF9kYXRhICpkYXRhLAorCQkJCQl1NjQgdGltZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXN0 cnVjdCBjcHVkYXRhICpjcHUgPSBjb250YWluZXJfb2YoZGF0YSwgc3RydWN0IGNwdWRhdGEsIHVw ZGF0ZV91dGlsKTsKKwljb25zdCB1NjQgZGVsdGFfbnMgPSB0aW1lIC0gY3B1LT5zYW1wbGUudGlt ZTsKKworCWlmIChzbXBfcHJvY2Vzc29yX2lkKCkgPT0gY3B1LT5jcHUgJiYKKwkgICAgZGVsdGFf bnMgPj0gY3B1LT5scC5zYW1wbGVfaW50ZXJ2YWxfbnMgJiYKKwkgICAgaW50ZWxfcHN0YXRlX3Nh bXBsZShjcHUsIHRpbWUpKQorCQlpbnRlbF9wc3RhdGVfYWRqdXN0X3BzdGF0ZShjcHUsIGdldF90 YXJnZXRfcHN0YXRlX2xwKGNwdSkpOworfQorCiBzdGF0aWMgc3RydWN0IHBzdGF0ZV9mdW5jcyBj b3JlX2Z1bmNzID0gewogCS5nZXRfbWF4ID0gY29yZV9nZXRfbWF4X3BzdGF0ZSwKIAkuZ2V0X21h eF9waHlzaWNhbCA9IGNvcmVfZ2V0X21heF9wc3RhdGVfcGh5c2ljYWwsCkBAIC0xNjE2LDcgKzE5 NjMsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHBzdGF0ZV9mdW5jcyBieHRfZnVuY3MgPSB7CiAJ LmdldF90dXJibyA9IGNvcmVfZ2V0X3R1cmJvX3BzdGF0ZSwKIAkuZ2V0X3NjYWxpbmcgPSBjb3Jl X2dldF9zY2FsaW5nLAogCS5nZXRfdmFsID0gY29yZV9nZXRfdmFsLAotCS51cGRhdGVfdXRpbCA9 IGludGVsX3BzdGF0ZV91cGRhdGVfdXRpbCwKKwkudXBkYXRlX3V0aWwgPSBpbnRlbF9wc3RhdGVf dXBkYXRlX3V0aWxfbHAsCiB9OwogCiAjZGVmaW5lIElDUFUobW9kZWwsIHBvbGljeSkgXApAQCAt MTY5NSw2ICsyMDQyLDEwIEBAIHN0YXRpYyBpbnQgaW50ZWxfcHN0YXRlX2luaXRfY3B1KHVuc2ln bmVkIGludCBjcHVudW0pCiAKIAlpbnRlbF9wc3RhdGVfZ2V0X2NwdV9wc3RhdGVzKGNwdSk7CiAK KwlpZiAoIWh3cF9hY3RpdmUgJiYKKwkgICAgcHN0YXRlX2Z1bmNzLnVwZGF0ZV91dGlsID09IGlu dGVsX3BzdGF0ZV91cGRhdGVfdXRpbF9scCkKKwkJaW50ZWxfcHN0YXRlX2xwX3Jlc2V0KGNwdSk7 CisKIAlwcl9kZWJ1ZygiY29udHJvbGxpbmc6IGNwdSAlZFxuIiwgY3B1bnVtKTsKIAogCXJldHVy biAwOwpAQCAtMjI4Nyw5ICsyNjM4LDcgQEAgc3RhdGljIGludCBfX2luaXQgaW50ZWxfcHN0YXRl X2luaXQodm9pZCkKIAogCWlmICh4ODZfbWF0Y2hfY3B1KGh3cF9zdXBwb3J0X2lkcykpIHsKIAkJ Y29weV9jcHVfZnVuY3MoJmNvcmVfZnVuY3MpOwotCQlpZiAobm9faHdwKSB7Ci0JCQlwc3RhdGVf ZnVuY3MudXBkYXRlX3V0aWwgPSBpbnRlbF9wc3RhdGVfdXBkYXRlX3V0aWw7Ci0JCX0gZWxzZSB7 CisJCWlmICghbm9faHdwKSB7CiAJCQlod3BfYWN0aXZlKys7CiAJCQlpbnRlbF9wc3RhdGUuYXR0 ciA9IGh3cF9jcHVmcmVxX2F0dHJzOwogCQkJZ290byBod3BfY3B1X21hdGNoZWQ7Ci0tIAoyLjE2 LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVs LWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=