From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?utf-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Subject: [PATCH 03/11] PM: Implement wakelock api. Date: Tue, 13 Jan 2009 17:27:48 -0800 Message-ID: <1231896476-22445-4-git-send-email-arve@android.com> References: <1231896476-22445-1-git-send-email-arve@android.com> <1231896476-22445-2-git-send-email-arve@android.com> <1231896476-22445-3-git-send-email-arve@android.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1231896476-22445-3-git-send-email-arve@android.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linux-pm-bounces@lists.linux-foundation.org Errors-To: linux-pm-bounces@lists.linux-foundation.org To: linux-pm@lists.linux-foundation.org Cc: swetland@google.com List-Id: linux-pm@vger.kernel.org U2lnbmVkLW9mZi1ieTogQXJ2ZSBIasO4bm5ldsOlZyA8YXJ2ZUBhbmRyb2lkLmNvbT4KLS0tCiBr ZXJuZWwvcG93ZXIvS2NvbmZpZyAgICB8ICAgMTkgKysKIGtlcm5lbC9wb3dlci9NYWtlZmlsZSAg IHwgICAgMSArCiBrZXJuZWwvcG93ZXIvcG93ZXIuaCAgICB8ICAgIDcgKwoga2VybmVsL3Bvd2Vy L3dha2Vsb2NrLmMgfCAgNTk4ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDYyNSBpbnNlcnRpb25zKCspLCAwIGRlbGV0aW9u cygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGtlcm5lbC9wb3dlci93YWtlbG9jay5jCgpkaWZmIC0t Z2l0IGEva2VybmVsL3Bvd2VyL0tjb25maWcgYi9rZXJuZWwvcG93ZXIvS2NvbmZpZwppbmRleCAy M2JkNGRhLi42ZTNkYTZlIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvS2NvbmZpZworKysgYi9r ZXJuZWwvcG93ZXIvS2NvbmZpZwpAQCAtMTE2LDYgKzExNiwyNSBAQCBjb25maWcgU1VTUEVORF9G UkVFWkVSCiAKIAkgIFR1cm5pbmcgT0ZGIHRoaXMgc2V0dGluZyBpcyBOT1QgcmVjb21tZW5kZWQh IElmIGluIGRvdWJ0LCBzYXkgWS4KIAorY29uZmlnIEhBU19XQUtFTE9DSworCWJvb2wKKworY29u ZmlnIFdBS0VMT0NLCisJYm9vbCAiV2FrZSBsb2NrIgorCWRlcGVuZHMgb24gUE0gJiYgUlRDX0NM QVNTCisJZGVmYXVsdCBuCisJc2VsZWN0IEhBU19XQUtFTE9DSworCS0tLWhlbHAtLS0KKwkgIEVu YWJsZSB3YWtlbG9ja3MuIFdoZW4gdXNlciBzcGFjZSByZXF1ZXN0IGEgc2xlZXAgc3RhdGUgdGhl CisJICBzbGVlcCByZXF1ZXN0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCBubyB3YWtlIGxvY2tzIGFy ZSBoZWxkLgorCitjb25maWcgV0FLRUxPQ0tfU1RBVAorCWJvb2wgIldha2UgbG9jayBzdGF0cyIK KwlkZXBlbmRzIG9uIFdBS0VMT0NLCisJZGVmYXVsdCB5CisJLS0taGVscC0tLQorCSAgUmVwb3J0 IHdha2UgbG9jayBzdGF0cyBpbiAvcHJvYy93YWtlbG9ja3MKKwogY29uZmlnIEhJQkVSTkFUSU9O CiAJYm9vbCAiSGliZXJuYXRpb24gKGFrYSAnc3VzcGVuZCB0byBkaXNrJykiCiAJZGVwZW5kcyBv biBQTSAmJiBTV0FQICYmIEFSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEUKZGlmZiAtLWdpdCBhL2tl cm5lbC9wb3dlci9NYWtlZmlsZSBiL2tlcm5lbC9wb3dlci9NYWtlZmlsZQppbmRleCA1OTc4MjNi Li40MDFkZGZlIDEwMDY0NAotLS0gYS9rZXJuZWwvcG93ZXIvTWFrZWZpbGUKKysrIGIva2VybmVs L3Bvd2VyL01ha2VmaWxlCkBAIC01LDYgKzUsNyBAQCBlbmRpZgogCiBvYmoteQkJCQk6PSBtYWlu Lm8KIG9iai0kKENPTkZJR19QTV9TTEVFUCkJCSs9IHByb2Nlc3MubyBjb25zb2xlLm8KK29iai0k KENPTkZJR19XQUtFTE9DSykJCSs9IHdha2Vsb2NrLm8KIG9iai0kKENPTkZJR19ISUJFUk5BVElP TikJKz0gc3dzdXNwLm8gZGlzay5vIHNuYXBzaG90Lm8gc3dhcC5vIHVzZXIubwogCiBvYmotJChD T05GSUdfTUFHSUNfU1lTUlEpCSs9IHBvd2Vyb2ZmLm8KZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dl ci9wb3dlci5oIGIva2VybmVsL3Bvd2VyL3Bvd2VyLmgKaW5kZXggNDZiNWVjNy4uMTUyNzE3NCAx MDA2NDQKLS0tIGEva2VybmVsL3Bvd2VyL3Bvd2VyLmgKKysrIGIva2VybmVsL3Bvd2VyL3Bvd2Vy LmgKQEAgLTIyMywzICsyMjMsMTAgQEAgc3RhdGljIGlubGluZSB2b2lkIHN1c3BlbmRfdGhhd19w cm9jZXNzZXModm9pZCkKIHsKIH0KICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1dBS0VMT0NLCisv KiBrZXJuZWwvcG93ZXIvd2FrZWxvY2suYyAqLworZXh0ZXJuIHN0cnVjdCB3b3JrcXVldWVfc3Ry dWN0ICpzdXNwZW5kX3dvcmtfcXVldWU7CitleHRlcm4gc3RydWN0IHdha2VfbG9jayBtYWluX3dh a2VfbG9jazsKK2V4dGVybiBzdXNwZW5kX3N0YXRlX3QgcmVxdWVzdGVkX3N1c3BlbmRfc3RhdGU7 CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC9wb3dlci93YWtlbG9jay5jIGIva2VybmVsL3Bv d2VyL3dha2Vsb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzllMjJm OQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC9wb3dlci93YWtlbG9jay5jCkBAIC0wLDAgKzEs NTk4IEBACisvKiBrZXJuZWwvcG93ZXIvd2FrZWxvY2suYworICoKKyAqIENvcHlyaWdodCAoQykg MjAwNS0yMDA4IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQg dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgdmVy c2lvbiAyLCBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgYW5k CisgKiBtYXkgYmUgY29waWVkLCBkaXN0cmlidXRlZCwgYW5kIG1vZGlmaWVkIHVuZGVyIHRob3Nl IHRlcm1zLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0 aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICovCisKKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNs dWRlIDxsaW51eC9ydGMuaD4KKyNpbmNsdWRlIDxsaW51eC9zdXNwZW5kLmg+CisjaW5jbHVkZSA8 bGludXgvc3lzY2FsbHMuaD4gLyogc3lzX3N5bmMgKi8KKyNpbmNsdWRlIDxsaW51eC93YWtlbG9j ay5oPgorI2lmZGVmIENPTkZJR19XQUtFTE9DS19TVEFUCisjaW5jbHVkZSA8bGludXgvcHJvY19m cy5oPgorI2VuZGlmCisjaW5jbHVkZSAicG93ZXIuaCIKKworZW51bSB7CisJREVCVUdfRVhJVF9T VVNQRU5EID0gMVUgPDwgMCwKKwlERUJVR19XQUtFVVAgPSAxVSA8PCAxLAorCURFQlVHX1NVU1BF TkQgPSAxVSA8PCAyLAorCURFQlVHX0VYUElSRSA9IDFVIDw8IDMsCisJREVCVUdfV0FLRV9MT0NL ID0gMVUgPDwgNCwKK307CitzdGF0aWMgaW50IGRlYnVnX21hc2sgPSBERUJVR19FWElUX1NVU1BF TkQgfCBERUJVR19XQUtFVVA7Cittb2R1bGVfcGFyYW1fbmFtZWQoZGVidWdfbWFzaywgZGVidWdf bWFzaywgaW50LCBTX0lSVUdPIHwgU19JV1VTUiB8IFNfSVdHUlApOworCisjZGVmaW5lIFdBS0Vf TE9DS19UWVBFX01BU0sgICAgICAgICAgICAgICgweDBmKQorI2RlZmluZSBXQUtFX0xPQ0tfSU5J VElBTElaRUQgICAgICAgICAgICAoMVUgPDwgOCkKKyNkZWZpbmUgV0FLRV9MT0NLX0FDVElWRSAg ICAgICAgICAgICAgICAgKDFVIDw8IDkpCisjZGVmaW5lIFdBS0VfTE9DS19BVVRPX0VYUElSRSAg ICAgICAgICAgICgxVSA8PCAxMCkKKyNkZWZpbmUgV0FLRV9MT0NLX1BSRVZFTlRJTkdfU1VTUEVO RCAgICAgKDFVIDw8IDExKQorCitzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxpc3RfbG9jayk7Citz dGF0aWMgTElTVF9IRUFEKGluYWN0aXZlX2xvY2tzKTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFk IGFjdGl2ZV93YWtlX2xvY2tzW1dBS0VfTE9DS19UWVBFX0NPVU5UXTsKK3N0YXRpYyBpbnQgY3Vy cmVudF9ldmVudF9udW07CitzdHJ1Y3Qgd29ya3F1ZXVlX3N0cnVjdCAqc3VzcGVuZF93b3JrX3F1 ZXVlOworc3RydWN0IHdha2VfbG9jayBtYWluX3dha2VfbG9jazsKK3N1c3BlbmRfc3RhdGVfdCBy ZXF1ZXN0ZWRfc3VzcGVuZF9zdGF0ZSA9IFBNX1NVU1BFTkRfTUVNOworc3RhdGljIHN0cnVjdCB3 YWtlX2xvY2sgdW5rbm93bl93YWtldXA7CisKKyNpZmRlZiBDT05GSUdfV0FLRUxPQ0tfU1RBVAor c3RhdGljIHN0cnVjdCB3YWtlX2xvY2sgZGVsZXRlZF93YWtlX2xvY2tzOworc3RhdGljIGt0aW1l X3QgbGFzdF9zbGVlcF90aW1lX3VwZGF0ZTsKK3N0YXRpYyBpbnQgd2FpdF9mb3Jfd2FrZXVwOwor CitpbnQgZ2V0X2V4cGlyZWRfdGltZShzdHJ1Y3Qgd2FrZV9sb2NrICpsb2NrLCBrdGltZV90ICpl eHBpcmVfdGltZSkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJc3RydWN0IHRpbWVzcGVjIGt0 OworCXN0cnVjdCB0aW1lc3BlYyB0b21vbm87CisJc3RydWN0IHRpbWVzcGVjIGRlbHRhOworCXVu c2lnbmVkIGxvbmcgc2VxOworCWxvbmcgdGltZW91dDsKKworCWlmICghKGxvY2stPmZsYWdzICYg V0FLRV9MT0NLX0FVVE9fRVhQSVJFKSkKKwkJcmV0dXJuIDA7CisJZG8geworCQlzZXEgPSByZWFk X3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJdGltZW91dCA9IGxvY2stPmV4cGlyZXMgLSBqaWZm aWVzOworCQlpZiAodGltZW91dCA+IDApCisJCQlyZXR1cm4gMDsKKwkJa3QgPSBjdXJyZW50X2tl cm5lbF90aW1lKCk7CisJCXRvbW9ubyA9IHdhbGxfdG9fbW9ub3RvbmljOworCX0gd2hpbGUgKHJl YWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCWppZmZpZXNfdG9fdGltZXNwZWMoLXRp bWVvdXQsICZkZWx0YSk7CisJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnRzLCBrdC50dl9zZWMg KyB0b21vbm8udHZfc2VjIC0gZGVsdGEudHZfc2VjLAorCQkJCWt0LnR2X25zZWMgKyB0b21vbm8u dHZfbnNlYyAtIGRlbHRhLnR2X25zZWMpOworCSpleHBpcmVfdGltZSA9IHRpbWVzcGVjX3RvX2t0 aW1lKHRzKTsKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50IHByaW50X2xvY2tfc3RhdChj aGFyICpidWYsIHN0cnVjdCB3YWtlX2xvY2sgKmxvY2spCit7CisJaW50IGxvY2tfY291bnQgPSBs b2NrLT5zdGF0LmNvdW50OworCWludCBleHBpcmVfY291bnQgPSBsb2NrLT5zdGF0LmV4cGlyZV9j b3VudDsKKwlrdGltZV90IGFjdGl2ZV90aW1lID0ga3RpbWVfc2V0KDAsIDApOworCWt0aW1lX3Qg dG90YWxfdGltZSA9IGxvY2stPnN0YXQudG90YWxfdGltZTsKKwlrdGltZV90IG1heF90aW1lID0g bG9jay0+c3RhdC5tYXhfdGltZTsKKwlrdGltZV90IHByZXZlbnRfc3VzcGVuZF90aW1lID0gbG9j ay0+c3RhdC5wcmV2ZW50X3N1c3BlbmRfdGltZTsKKwlpZiAobG9jay0+ZmxhZ3MgJiBXQUtFX0xP Q0tfQUNUSVZFKSB7CisJCWt0aW1lX3Qgbm93LCBhZGRfdGltZTsKKwkJaW50IGV4cGlyZWQgPSBn ZXRfZXhwaXJlZF90aW1lKGxvY2ssICZub3cpOworCQlpZiAoIWV4cGlyZWQpCisJCQlub3cgPSBr dGltZV9nZXQoKTsKKwkJYWRkX3RpbWUgPSBrdGltZV9zdWIobm93LCBsb2NrLT5zdGF0Lmxhc3Rf dGltZSk7CisJCWxvY2tfY291bnQrKzsKKwkJaWYgKCFleHBpcmVkKQorCQkJYWN0aXZlX3RpbWUg PSBhZGRfdGltZTsKKwkJZWxzZQorCQkJZXhwaXJlX2NvdW50Kys7CisJCXRvdGFsX3RpbWUgPSBr dGltZV9hZGQodG90YWxfdGltZSwgYWRkX3RpbWUpOworCQlpZiAobG9jay0+ZmxhZ3MgJiBXQUtF X0xPQ0tfUFJFVkVOVElOR19TVVNQRU5EKQorCQkJcHJldmVudF9zdXNwZW5kX3RpbWUgPSBrdGlt ZV9hZGQocHJldmVudF9zdXNwZW5kX3RpbWUsCisJCQkJCWt0aW1lX3N1Yihub3csIGxhc3Rfc2xl ZXBfdGltZV91cGRhdGUpKTsKKwkJaWYgKGFkZF90aW1lLnR2NjQgPiBtYXhfdGltZS50djY0KQor CQkJbWF4X3RpbWUgPSBhZGRfdGltZTsKKwl9CisKKwlyZXR1cm4gc3ByaW50ZihidWYsICJcIiVz XCJcdCVkXHQlZFx0JWRcdCVsbGRcdCVsbGRcdCVsbGRcdCVsbGRcdCIKKwkJICAgICAgICIlbGxk XG4iLCBsb2NrLT5uYW1lLCBsb2NrX2NvdW50LCBleHBpcmVfY291bnQsCisJCSAgICAgICBsb2Nr LT5zdGF0Lndha2V1cF9jb3VudCwga3RpbWVfdG9fbnMoYWN0aXZlX3RpbWUpLAorCQkgICAgICAg a3RpbWVfdG9fbnModG90YWxfdGltZSksCisJCSAgICAgICBrdGltZV90b19ucyhwcmV2ZW50X3N1 c3BlbmRfdGltZSksIGt0aW1lX3RvX25zKG1heF90aW1lKSwKKwkJICAgICAgIGt0aW1lX3RvX25z KGxvY2stPnN0YXQubGFzdF90aW1lKSk7Cit9CisKKworc3RhdGljIGludCB3YWtlbG9ja3NfcmVh ZF9wcm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLAorCQkJICAgICAgIGlu dCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpCit7CisJdW5zaWduZWQgbG9uZyBpcnFmbGFn czsKKwlzdHJ1Y3Qgd2FrZV9sb2NrICpsb2NrOworCWludCBsZW4gPSAwOworCWNoYXIgKnAgPSBw YWdlOworCWludCB0eXBlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgaXJxZmxh Z3MpOworCisJcCArPSBzcHJpbnRmKHAsICJuYW1lXHRjb3VudFx0ZXhwaXJlX2NvdW50XHR3YWtl X2NvdW50XHRhY3RpdmVfc2luY2UiCisJCSAgICAgIlx0dG90YWxfdGltZVx0c2xlZXBfdGltZVx0 bWF4X3RpbWVcdGxhc3RfY2hhbmdlXG4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGxvY2ssICZp bmFjdGl2ZV9sb2NrcywgbGluaykgeworCQlwICs9IHByaW50X2xvY2tfc3RhdChwLCBsb2NrKTsK Kwl9CisJZm9yICh0eXBlID0gMDsgdHlwZSA8IFdBS0VfTE9DS19UWVBFX0NPVU5UOyB0eXBlKysp IHsKKwkJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCAmYWN0aXZlX3dha2VfbG9ja3NbdHlwZV0s IGxpbmspCisJCQlwICs9IHByaW50X2xvY2tfc3RhdChwLCBsb2NrKTsKKwl9CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBpcnFmbGFncyk7CisKKwkqc3RhcnQgPSBwYWdlICsg b2ZmOworCisJbGVuID0gcCAtIHBhZ2U7CisJaWYgKGxlbiA+IG9mZikKKwkJbGVuIC09IG9mZjsK KwllbHNlCisJCWxlbiA9IDA7CisKKwlyZXR1cm4gbGVuIDwgY291bnQgPyBsZW4gIDogY291bnQ7 Cit9CisKK3N0YXRpYyB2b2lkIHdha2VfdW5sb2NrX3N0YXRfbG9ja2VkKHN0cnVjdCB3YWtlX2xv Y2sgKmxvY2ssIGludCBleHBpcmVkKQoreworCWt0aW1lX3QgZHVyYXRpb247CisJa3RpbWVfdCBu b3c7CisJaWYgKCEobG9jay0+ZmxhZ3MgJiBXQUtFX0xPQ0tfQUNUSVZFKSkKKwkJcmV0dXJuOwor CWlmIChnZXRfZXhwaXJlZF90aW1lKGxvY2ssICZub3cpKQorCQlleHBpcmVkID0gMTsKKwllbHNl CisJCW5vdyA9IGt0aW1lX2dldCgpOworCWxvY2stPnN0YXQuY291bnQrKzsKKwlpZiAoZXhwaXJl ZCkKKwkJbG9jay0+c3RhdC5leHBpcmVfY291bnQrKzsKKwlkdXJhdGlvbiA9IGt0aW1lX3N1Yihu b3csIGxvY2stPnN0YXQubGFzdF90aW1lKTsKKwlsb2NrLT5zdGF0LnRvdGFsX3RpbWUgPSBrdGlt ZV9hZGQobG9jay0+c3RhdC50b3RhbF90aW1lLCBkdXJhdGlvbik7CisJaWYgKGt0aW1lX3RvX25z KGR1cmF0aW9uKSA+IGt0aW1lX3RvX25zKGxvY2stPnN0YXQubWF4X3RpbWUpKQorCQlsb2NrLT5z dGF0Lm1heF90aW1lID0gZHVyYXRpb247CisJbG9jay0+c3RhdC5sYXN0X3RpbWUgPSBrdGltZV9n ZXQoKTsKKwlpZiAobG9jay0+ZmxhZ3MgJiBXQUtFX0xPQ0tfUFJFVkVOVElOR19TVVNQRU5EKSB7 CisJCWR1cmF0aW9uID0ga3RpbWVfc3ViKG5vdywgbGFzdF9zbGVlcF90aW1lX3VwZGF0ZSk7CisJ CWxvY2stPnN0YXQucHJldmVudF9zdXNwZW5kX3RpbWUgPSBrdGltZV9hZGQoCisJCQlsb2NrLT5z dGF0LnByZXZlbnRfc3VzcGVuZF90aW1lLCBkdXJhdGlvbik7CisJCWxvY2stPmZsYWdzICY9IH5X QUtFX0xPQ0tfUFJFVkVOVElOR19TVVNQRU5EOworCX0KK30KKworc3RhdGljIHZvaWQgdXBkYXRl X3NsZWVwX3dhaXRfc3RhdHNfbG9ja2VkKGludCBkb25lKQoreworCXN0cnVjdCB3YWtlX2xvY2sg KmxvY2s7CisJa3RpbWVfdCBub3csIGV0aW1lLCBlbGFwc2VkLCBhZGQ7CisJaW50IGV4cGlyZWQ7 CisKKwlub3cgPSBrdGltZV9nZXQoKTsKKwllbGFwc2VkID0ga3RpbWVfc3ViKG5vdywgbGFzdF9z bGVlcF90aW1lX3VwZGF0ZSk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShsb2NrLCAmYWN0aXZlX3dh a2VfbG9ja3NbV0FLRV9MT0NLX1NVU1BFTkRdLCBsaW5rKSB7CisJCWV4cGlyZWQgPSBnZXRfZXhw aXJlZF90aW1lKGxvY2ssICZldGltZSk7CisJCWlmIChsb2NrLT5mbGFncyAmIFdBS0VfTE9DS19Q UkVWRU5USU5HX1NVU1BFTkQpIHsKKwkJCWlmIChleHBpcmVkKQorCQkJCWFkZCA9IGt0aW1lX3N1 YihldGltZSwgbGFzdF9zbGVlcF90aW1lX3VwZGF0ZSk7CisJCQllbHNlCisJCQkJYWRkID0gZWxh cHNlZDsKKwkJCWxvY2stPnN0YXQucHJldmVudF9zdXNwZW5kX3RpbWUgPSBrdGltZV9hZGQoCisJ CQkJbG9jay0+c3RhdC5wcmV2ZW50X3N1c3BlbmRfdGltZSwgYWRkKTsKKwkJfQorCQlpZiAoZG9u ZSB8fCBleHBpcmVkKQorCQkJbG9jay0+ZmxhZ3MgJj0gfldBS0VfTE9DS19QUkVWRU5USU5HX1NV U1BFTkQ7CisJCWVsc2UKKwkJCWxvY2stPmZsYWdzIHw9IFdBS0VfTE9DS19QUkVWRU5USU5HX1NV U1BFTkQ7CisJfQorCWxhc3Rfc2xlZXBfdGltZV91cGRhdGUgPSBub3c7Cit9CisjZW5kaWYKKwor CitzdGF0aWMgdm9pZCBleHBpcmVfd2FrZV9sb2NrKHN0cnVjdCB3YWtlX2xvY2sgKmxvY2spCit7 CisjaWZkZWYgQ09ORklHX1dBS0VMT0NLX1NUQVQKKwl3YWtlX3VubG9ja19zdGF0X2xvY2tlZChs b2NrLCAxKTsKKyNlbmRpZgorCWxvY2stPmZsYWdzICY9IH4oV0FLRV9MT0NLX0FDVElWRSB8IFdB S0VfTE9DS19BVVRPX0VYUElSRSk7CisJbGlzdF9kZWwoJmxvY2stPmxpbmspOworCWxpc3RfYWRk KCZsb2NrLT5saW5rLCAmaW5hY3RpdmVfbG9ja3MpOworCWlmIChkZWJ1Z19tYXNrICYgKERFQlVH X1dBS0VfTE9DSyB8IERFQlVHX0VYUElSRSkpCisJCXByX2luZm8oImV4cGlyZWQgd2FrZSBsb2Nr ICVzXG4iLCBsb2NrLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfYWN0aXZlX2xvY2tz KGludCB0eXBlKQoreworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJc3RydWN0IHdha2VfbG9j ayAqbG9jazsKKworCUJVR19PTih0eXBlID49IFdBS0VfTE9DS19UWVBFX0NPVU5UKTsKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBpcnFmbGFncyk7CisJbGlzdF9mb3JfZWFjaF9lbnRy eShsb2NrLCAmYWN0aXZlX3dha2VfbG9ja3NbdHlwZV0sIGxpbmspIHsKKwkJaWYgKGxvY2stPmZs YWdzICYgV0FLRV9MT0NLX0FVVE9fRVhQSVJFKSB7CisJCQlsb25nIHRpbWVvdXQgPSBsb2NrLT5l eHBpcmVzIC0gamlmZmllczsKKwkJCWlmICh0aW1lb3V0IDw9IDApCisJCQkJcHJfaW5mbygid2Fr ZSBsb2NrICVzLCBleHBpcmVkXG4iLCBsb2NrLT5uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcl9pbmZv KCJhY3RpdmUgd2FrZSBsb2NrICVzLCB0aW1lIGxlZnQgJWxkXG4iLAorCQkJCQlsb2NrLT5uYW1l LCB0aW1lb3V0KTsKKwkJfSBlbHNlCisJCQlwcl9pbmZvKCJhY3RpdmUgd2FrZSBsb2NrICVzXG4i LCBsb2NrLT5uYW1lKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBp cnFmbGFncyk7Cit9CisKK3N0YXRpYyBsb25nIGhhc193YWtlX2xvY2tfbG9ja2VkKGludCB0eXBl KQoreworCXN0cnVjdCB3YWtlX2xvY2sgKmxvY2ssICpuOworCWxvbmcgbWF4X3RpbWVvdXQgPSAw OworCisJQlVHX09OKHR5cGUgPj0gV0FLRV9MT0NLX1RZUEVfQ09VTlQpOworCWxpc3RfZm9yX2Vh Y2hfZW50cnlfc2FmZShsb2NrLCBuLCAmYWN0aXZlX3dha2VfbG9ja3NbdHlwZV0sIGxpbmspIHsK KwkJaWYgKGxvY2stPmZsYWdzICYgV0FLRV9MT0NLX0FVVE9fRVhQSVJFKSB7CisJCQlsb25nIHRp bWVvdXQgPSBsb2NrLT5leHBpcmVzIC0gamlmZmllczsKKwkJCWlmICh0aW1lb3V0IDw9IDApCisJ CQkJZXhwaXJlX3dha2VfbG9jayhsb2NrKTsKKwkJCWVsc2UgaWYgKHRpbWVvdXQgPiBtYXhfdGlt ZW91dCkKKwkJCQltYXhfdGltZW91dCA9IHRpbWVvdXQ7CisJCX0gZWxzZQorCQkJcmV0dXJuIC0x OworCX0KKwlyZXR1cm4gbWF4X3RpbWVvdXQ7Cit9CisKK2xvbmcgaGFzX3dha2VfbG9jayhpbnQg dHlwZSkKK3sKKwlsb25nIHJldDsKKwl1bnNpZ25lZCBsb25nIGlycWZsYWdzOworCXNwaW5fbG9j a19pcnFzYXZlKCZsaXN0X2xvY2ssIGlycWZsYWdzKTsKKwlyZXQgPSBoYXNfd2FrZV9sb2NrX2xv Y2tlZCh0eXBlKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsaXN0X2xvY2ssIGlycWZsYWdz KTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzdXNwZW5kKHN0cnVjdCB3b3JrX3N0 cnVjdCAqd29yaykKK3sKKwlpbnQgcmV0OworCWludCBlbnRyeV9ldmVudF9udW07CisKKwlpZiAo aGFzX3dha2VfbG9jayhXQUtFX0xPQ0tfU1VTUEVORCkpIHsKKwkJaWYgKGRlYnVnX21hc2sgJiBE RUJVR19TVVNQRU5EKQorCQkJcHJfaW5mbygic3VzcGVuZDogYWJvcnQgc3VzcGVuZFxuIik7CisJ CXJldHVybjsKKwl9CisKKwllbnRyeV9ldmVudF9udW0gPSBjdXJyZW50X2V2ZW50X251bTsKKwlz eXNfc3luYygpOworCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfU1VTUEVORCkKKwkJcHJfaW5mbygi c3VzcGVuZDogZW50ZXIgc3VzcGVuZFxuIik7CisJcmV0ID0gcG1fc3VzcGVuZChyZXF1ZXN0ZWRf c3VzcGVuZF9zdGF0ZSk7CisJaWYgKGRlYnVnX21hc2sgJiBERUJVR19FWElUX1NVU1BFTkQpIHsK KwkJc3RydWN0IHRpbWVzcGVjIHRzOworCQlzdHJ1Y3QgcnRjX3RpbWUgdG07CisJCWdldG5zdGlt ZW9mZGF5KCZ0cyk7CisJCXJ0Y190aW1lX3RvX3RtKHRzLnR2X3NlYywgJnRtKTsKKwkJcHJfaW5m bygic3VzcGVuZDogZXhpdCBzdXNwZW5kLCByZXQgPSAlZCAiCisJCQkiKCVkLSUwMmQtJTAyZCAl MDJkOiUwMmQ6JTAyZC4lMDlsdSBVVEMpXG4iLCByZXQsCisJCQl0bS50bV95ZWFyICsgMTkwMCwg dG0udG1fbW9uICsgMSwgdG0udG1fbWRheSwKKwkJCXRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0u dG1fc2VjLCB0cy50dl9uc2VjKTsKKwl9CisJaWYgKGN1cnJlbnRfZXZlbnRfbnVtID09IGVudHJ5 X2V2ZW50X251bSkgeworCQlpZiAoZGVidWdfbWFzayAmIERFQlVHX1NVU1BFTkQpCisJCQlwcl9p bmZvKCJzdXNwZW5kOiBwbV9zdXNwZW5kIHJldHVybmVkIHdpdGggbm8gZXZlbnRcbiIpOworCQl3 YWtlX2xvY2tfdGltZW91dCgmdW5rbm93bl93YWtldXAsIEhaIC8gMik7CisJfQorfQorc3RhdGlj IERFQ0xBUkVfV09SSyhzdXNwZW5kX3dvcmssIHN1c3BlbmQpOworCitzdGF0aWMgdm9pZCBleHBp cmVfd2FrZV9sb2Nrcyh1bnNpZ25lZCBsb25nIGRhdGEpCit7CisJbG9uZyBoYXNfbG9jazsKKwl1 bnNpZ25lZCBsb25nIGlycWZsYWdzOworCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfRVhQSVJFKQor CQlwcl9pbmZvKCJleHBpcmVfd2FrZV9sb2Nrczogc3RhcnRcbiIpOworCWlmIChkZWJ1Z19tYXNr ICYgREVCVUdfU1VTUEVORCkKKwkJcHJpbnRfYWN0aXZlX2xvY2tzKFdBS0VfTE9DS19TVVNQRU5E KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBpcnFmbGFncyk7CisJaGFzX2xvY2sg PSBoYXNfd2FrZV9sb2NrX2xvY2tlZChXQUtFX0xPQ0tfU1VTUEVORCk7CisJaWYgKGRlYnVnX21h c2sgJiBERUJVR19FWFBJUkUpCisJCXByX2luZm8oImV4cGlyZV93YWtlX2xvY2tzOiBkb25lLCBo YXNfbG9jayAlbGRcbiIsIGhhc19sb2NrKTsKKwlpZiAoaGFzX2xvY2sgPT0gMCkKKwkJcXVldWVf d29yayhzdXNwZW5kX3dvcmtfcXVldWUsICZzdXNwZW5kX3dvcmspOworCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmxpc3RfbG9jaywgaXJxZmxhZ3MpOworfQorc3RhdGljIERFRklORV9USU1FUihl eHBpcmVfdGltZXIsIGV4cGlyZV93YWtlX2xvY2tzLCAwLCAwKTsKKworc3RhdGljIGludCBwb3dl cl9zdXNwZW5kX2xhdGUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldiwgcG1fbWVzc2FnZV90 IHN0YXRlKQoreworCWludCByZXQgPSBoYXNfd2FrZV9sb2NrKFdBS0VfTE9DS19TVVNQRU5EKSA/ IC1FQUdBSU4gOiAwOworI2lmZGVmIENPTkZJR19XQUtFTE9DS19TVEFUCisJd2FpdF9mb3Jfd2Fr ZXVwID0gMTsKKyNlbmRpZgorCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfU1VTUEVORCkKKwkJcHJf aW5mbygicG93ZXJfc3VzcGVuZF9sYXRlIHJldHVybiAlZFxuIiwgcmV0KTsKKwlyZXR1cm4gcmV0 OworfQorCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBwb3dlcl9kcml2ZXIgPSB7CisJ LmRyaXZlci5uYW1lID0gInBvd2VyIiwKKwkuc3VzcGVuZF9sYXRlID0gcG93ZXJfc3VzcGVuZF9s YXRlLAorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHBvd2VyX2RldmljZSA9IHsK KwkubmFtZSA9ICJwb3dlciIsCit9OworCit2b2lkIHdha2VfbG9ja19pbml0KHN0cnVjdCB3YWtl X2xvY2sgKmxvY2ssIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxv bmcgaXJxZmxhZ3MgPSAwOworCisJaWYgKG5hbWUpCisJCWxvY2stPm5hbWUgPSBuYW1lOworCUJV R19PTighbG9jay0+bmFtZSk7CisKKwlpZiAoZGVidWdfbWFzayAmIERFQlVHX1dBS0VfTE9DSykK KwkJcHJfaW5mbygid2FrZV9sb2NrX2luaXQgbmFtZT0lc1xuIiwgbG9jay0+bmFtZSk7CisjaWZk ZWYgQ09ORklHX1dBS0VMT0NLX1NUQVQKKwlsb2NrLT5zdGF0LmNvdW50ID0gMDsKKwlsb2NrLT5z dGF0LmV4cGlyZV9jb3VudCA9IDA7CisJbG9jay0+c3RhdC53YWtldXBfY291bnQgPSAwOworCWxv Y2stPnN0YXQudG90YWxfdGltZSA9IGt0aW1lX3NldCgwLCAwKTsKKwlsb2NrLT5zdGF0LnByZXZl bnRfc3VzcGVuZF90aW1lID0ga3RpbWVfc2V0KDAsIDApOworCWxvY2stPnN0YXQubWF4X3RpbWUg PSBrdGltZV9zZXQoMCwgMCk7CisJbG9jay0+c3RhdC5sYXN0X3RpbWUgPSBrdGltZV9zZXQoMCwg MCk7CisjZW5kaWYKKwlsb2NrLT5mbGFncyA9ICh0eXBlICYgV0FLRV9MT0NLX1RZUEVfTUFTSykg fCBXQUtFX0xPQ0tfSU5JVElBTElaRUQ7CisKKwlJTklUX0xJU1RfSEVBRCgmbG9jay0+bGluayk7 CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgaXJxZmxhZ3MpOworCWxpc3RfYWRkKCZs b2NrLT5saW5rLCAmaW5hY3RpdmVfbG9ja3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmxp c3RfbG9jaywgaXJxZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTCh3YWtlX2xvY2tfaW5pdCk7CisK K3ZvaWQgd2FrZV9sb2NrX2Rlc3Ryb3koc3RydWN0IHdha2VfbG9jayAqbG9jaykKK3sKKwl1bnNp Z25lZCBsb25nIGlycWZsYWdzOworCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfV0FLRV9MT0NLKQor CQlwcl9pbmZvKCJ3YWtlX2xvY2tfZGVzdHJveSBuYW1lPSVzXG4iLCBsb2NrLT5uYW1lKTsKKwlz cGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBpcnFmbGFncyk7CisJbG9jay0+ZmxhZ3MgJj0g fldBS0VfTE9DS19JTklUSUFMSVpFRDsKKyNpZmRlZiBDT05GSUdfV0FLRUxPQ0tfU1RBVAorCWlm IChsb2NrLT5zdGF0LmNvdW50KSB7CisJCWRlbGV0ZWRfd2FrZV9sb2Nrcy5zdGF0LmNvdW50ICs9 IGxvY2stPnN0YXQuY291bnQ7CisJCWRlbGV0ZWRfd2FrZV9sb2Nrcy5zdGF0LmV4cGlyZV9jb3Vu dCArPSBsb2NrLT5zdGF0LmV4cGlyZV9jb3VudDsKKwkJZGVsZXRlZF93YWtlX2xvY2tzLnN0YXQu dG90YWxfdGltZSA9CisJCQlrdGltZV9hZGQoZGVsZXRlZF93YWtlX2xvY2tzLnN0YXQudG90YWxf dGltZSwKKwkJCQkgIGxvY2stPnN0YXQudG90YWxfdGltZSk7CisJCWRlbGV0ZWRfd2FrZV9sb2Nr cy5zdGF0LnByZXZlbnRfc3VzcGVuZF90aW1lID0KKwkJCWt0aW1lX2FkZChkZWxldGVkX3dha2Vf bG9ja3Muc3RhdC5wcmV2ZW50X3N1c3BlbmRfdGltZSwKKwkJCQkgIGxvY2stPnN0YXQucHJldmVu dF9zdXNwZW5kX3RpbWUpOworCQlkZWxldGVkX3dha2VfbG9ja3Muc3RhdC5tYXhfdGltZSA9CisJ CQlrdGltZV9hZGQoZGVsZXRlZF93YWtlX2xvY2tzLnN0YXQubWF4X3RpbWUsCisJCQkJICBsb2Nr LT5zdGF0Lm1heF90aW1lKTsKKwl9CisjZW5kaWYKKwlsaXN0X2RlbCgmbG9jay0+bGluayk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBpcnFmbGFncyk7Cit9CitFWFBPUlRf U1lNQk9MKHdha2VfbG9ja19kZXN0cm95KTsKKworc3RhdGljIHZvaWQgd2FrZV9sb2NrX2ludGVy bmFsKAorCXN0cnVjdCB3YWtlX2xvY2sgKmxvY2ssIGxvbmcgdGltZW91dCwgaW50IGhhc190aW1l b3V0KQoreworCWludCB0eXBlOworCXVuc2lnbmVkIGxvbmcgaXJxZmxhZ3M7CisJbG9uZyBleHBp cmVfaW47CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmbGlzdF9sb2NrLCBpcnFmbGFncyk7CisJdHlw ZSA9IGxvY2stPmZsYWdzICYgV0FLRV9MT0NLX1RZUEVfTUFTSzsKKwlCVUdfT04odHlwZSA+PSBX QUtFX0xPQ0tfVFlQRV9DT1VOVCk7CisJQlVHX09OKCEobG9jay0+ZmxhZ3MgJiBXQUtFX0xPQ0tf SU5JVElBTElaRUQpKTsKKyNpZmRlZiBDT05GSUdfV0FLRUxPQ0tfU1RBVAorCWlmICh0eXBlID09 IFdBS0VfTE9DS19TVVNQRU5EICYmIHdhaXRfZm9yX3dha2V1cCkgeworCQlpZiAoZGVidWdfbWFz ayAmIERFQlVHX1dBS0VVUCkKKwkJCXByX2luZm8oIndha2V1cCB3YWtlIGxvY2s6ICVzXG4iLCBs b2NrLT5uYW1lKTsKKwkJd2FpdF9mb3Jfd2FrZXVwID0gMDsKKwkJbG9jay0+c3RhdC53YWtldXBf Y291bnQrKzsKKwl9CisJaWYgKChsb2NrLT5mbGFncyAmIFdBS0VfTE9DS19BVVRPX0VYUElSRSkg JiYKKwkgICAgKGxvbmcpKGxvY2stPmV4cGlyZXMgLSBqaWZmaWVzKSA8PSAwKSB7CisJCXdha2Vf dW5sb2NrX3N0YXRfbG9ja2VkKGxvY2ssIDApOworCQlsb2NrLT5zdGF0Lmxhc3RfdGltZSA9IGt0 aW1lX2dldCgpOworCX0KKyNlbmRpZgorCWlmICghKGxvY2stPmZsYWdzICYgV0FLRV9MT0NLX0FD VElWRSkpIHsKKwkJbG9jay0+ZmxhZ3MgfD0gV0FLRV9MT0NLX0FDVElWRTsKKyNpZmRlZiBDT05G SUdfV0FLRUxPQ0tfU1RBVAorCQlsb2NrLT5zdGF0Lmxhc3RfdGltZSA9IGt0aW1lX2dldCgpOwor I2VuZGlmCisJfQorCWxpc3RfZGVsKCZsb2NrLT5saW5rKTsKKwlpZiAoaGFzX3RpbWVvdXQpIHsK KwkJaWYgKGRlYnVnX21hc2sgJiBERUJVR19XQUtFX0xPQ0spCisJCQlwcl9pbmZvKCJ3YWtlX2xv Y2s6ICVzLCB0eXBlICVkLCB0aW1lb3V0ICVsZC4lMDNsdVxuIiwKKwkJCQlsb2NrLT5uYW1lLCB0 eXBlLCB0aW1lb3V0IC8gSFosCisJCQkJKHRpbWVvdXQgJSBIWikgKiBNU0VDX1BFUl9TRUMgLyBI Wik7CisJCWxvY2stPmV4cGlyZXMgPSBqaWZmaWVzICsgdGltZW91dDsKKwkJbG9jay0+ZmxhZ3Mg fD0gV0FLRV9MT0NLX0FVVE9fRVhQSVJFOworCQlsaXN0X2FkZF90YWlsKCZsb2NrLT5saW5rLCAm YWN0aXZlX3dha2VfbG9ja3NbdHlwZV0pOworCX0gZWxzZSB7CisJCWlmIChkZWJ1Z19tYXNrICYg REVCVUdfV0FLRV9MT0NLKQorCQkJcHJfaW5mbygid2FrZV9sb2NrOiAlcywgdHlwZSAlZFxuIiwg bG9jay0+bmFtZSwgdHlwZSk7CisJCWxvY2stPmV4cGlyZXMgPSBMT05HX01BWDsKKwkJbG9jay0+ ZmxhZ3MgJj0gfldBS0VfTE9DS19BVVRPX0VYUElSRTsKKwkJbGlzdF9hZGQoJmxvY2stPmxpbmss ICZhY3RpdmVfd2FrZV9sb2Nrc1t0eXBlXSk7CisJfQorCWlmICh0eXBlID09IFdBS0VfTE9DS19T VVNQRU5EKSB7CisJCWN1cnJlbnRfZXZlbnRfbnVtKys7CisjaWZkZWYgQ09ORklHX1dBS0VMT0NL X1NUQVQKKwkJaWYgKGxvY2sgPT0gJm1haW5fd2FrZV9sb2NrKQorCQkJdXBkYXRlX3NsZWVwX3dh aXRfc3RhdHNfbG9ja2VkKDEpOworCQllbHNlIGlmICghd2FrZV9sb2NrX2FjdGl2ZSgmbWFpbl93 YWtlX2xvY2spKQorCQkJdXBkYXRlX3NsZWVwX3dhaXRfc3RhdHNfbG9ja2VkKDApOworI2VuZGlm CisJCWlmIChoYXNfdGltZW91dCkKKwkJCWV4cGlyZV9pbiA9IGhhc193YWtlX2xvY2tfbG9ja2Vk KHR5cGUpOworCQllbHNlCisJCQlleHBpcmVfaW4gPSAtMTsKKwkJaWYgKGV4cGlyZV9pbiA+IDAp IHsKKwkJCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfRVhQSVJFKQorCQkJCXByX2luZm8oIndha2Vf bG9jazogJXMsIHN0YXJ0IGV4cGlyZSB0aW1lciwgIgorCQkJCQkiJWxkXG4iLCBsb2NrLT5uYW1l LCBleHBpcmVfaW4pOworCQkJbW9kX3RpbWVyKCZleHBpcmVfdGltZXIsIGppZmZpZXMgKyBleHBp cmVfaW4pOworCQl9IGVsc2UgeworCQkJaWYgKGRlbF90aW1lcigmZXhwaXJlX3RpbWVyKSkKKwkJ CQlpZiAoZGVidWdfbWFzayAmIERFQlVHX0VYUElSRSkKKwkJCQkJcHJfaW5mbygid2FrZV9sb2Nr OiAlcywgc3RvcCBleHBpcmUgIgorCQkJCQkJInRpbWVyXG4iLCBsb2NrLT5uYW1lKTsKKwkJCWlm IChleHBpcmVfaW4gPT0gMCkKKwkJCQlxdWV1ZV93b3JrKHN1c3BlbmRfd29ya19xdWV1ZSwgJnN1 c3BlbmRfd29yayk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2Nr LCBpcnFmbGFncyk7Cit9CisKK3ZvaWQgd2FrZV9sb2NrKHN0cnVjdCB3YWtlX2xvY2sgKmxvY2sp Cit7CisJd2FrZV9sb2NrX2ludGVybmFsKGxvY2ssIDAsIDApOworfQorRVhQT1JUX1NZTUJPTCh3 YWtlX2xvY2spOworCit2b2lkIHdha2VfbG9ja190aW1lb3V0KHN0cnVjdCB3YWtlX2xvY2sgKmxv Y2ssIGxvbmcgdGltZW91dCkKK3sKKwl3YWtlX2xvY2tfaW50ZXJuYWwobG9jaywgdGltZW91dCwg MSk7Cit9CitFWFBPUlRfU1lNQk9MKHdha2VfbG9ja190aW1lb3V0KTsKKwordm9pZCB3YWtlX3Vu bG9jayhzdHJ1Y3Qgd2FrZV9sb2NrICpsb2NrKQoreworCWludCB0eXBlOworCXVuc2lnbmVkIGxv bmcgaXJxZmxhZ3M7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmxpc3RfbG9jaywgaXJxZmxhZ3MpOwor CXR5cGUgPSBsb2NrLT5mbGFncyAmIFdBS0VfTE9DS19UWVBFX01BU0s7CisjaWZkZWYgQ09ORklH X1dBS0VMT0NLX1NUQVQKKwl3YWtlX3VubG9ja19zdGF0X2xvY2tlZChsb2NrLCAwKTsKKyNlbmRp ZgorCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfV0FLRV9MT0NLKQorCQlwcl9pbmZvKCJ3YWtlX3Vu bG9jazogJXNcbiIsIGxvY2stPm5hbWUpOworCWxvY2stPmZsYWdzICY9IH4oV0FLRV9MT0NLX0FD VElWRSB8IFdBS0VfTE9DS19BVVRPX0VYUElSRSk7CisJbGlzdF9kZWwoJmxvY2stPmxpbmspOwor CWxpc3RfYWRkKCZsb2NrLT5saW5rLCAmaW5hY3RpdmVfbG9ja3MpOworCWlmICh0eXBlID09IFdB S0VfTE9DS19TVVNQRU5EKSB7CisJCWxvbmcgaGFzX2xvY2sgPSBoYXNfd2FrZV9sb2NrX2xvY2tl ZCh0eXBlKTsKKwkJaWYgKGhhc19sb2NrID4gMCkgeworCQkJaWYgKGRlYnVnX21hc2sgJiBERUJV R19FWFBJUkUpCisJCQkJcHJfaW5mbygid2FrZV91bmxvY2s6ICVzLCBzdGFydCBleHBpcmUgdGlt ZXIsICIKKwkJCQkJIiVsZFxuIiwgbG9jay0+bmFtZSwgaGFzX2xvY2spOworCQkJbW9kX3RpbWVy KCZleHBpcmVfdGltZXIsIGppZmZpZXMgKyBoYXNfbG9jayk7CisJCX0gZWxzZSB7CisJCQlpZiAo ZGVsX3RpbWVyKCZleHBpcmVfdGltZXIpKQorCQkJCWlmIChkZWJ1Z19tYXNrICYgREVCVUdfRVhQ SVJFKQorCQkJCQlwcl9pbmZvKCJ3YWtlX3VubG9jazogJXMsIHN0b3AgZXhwaXJlICIKKwkJCQkJ CSJ0aW1lclxuIiwgbG9jay0+bmFtZSk7CisJCQlpZiAoaGFzX2xvY2sgPT0gMCkKKwkJCQlxdWV1 ZV93b3JrKHN1c3BlbmRfd29ya19xdWV1ZSwgJnN1c3BlbmRfd29yayk7CisJCX0KKwkJaWYgKGxv Y2sgPT0gJm1haW5fd2FrZV9sb2NrKSB7CisJCQlpZiAoZGVidWdfbWFzayAmIERFQlVHX1NVU1BF TkQpCisJCQkJcHJpbnRfYWN0aXZlX2xvY2tzKFdBS0VfTE9DS19TVVNQRU5EKTsKKyNpZmRlZiBD T05GSUdfV0FLRUxPQ0tfU1RBVAorCQkJdXBkYXRlX3NsZWVwX3dhaXRfc3RhdHNfbG9ja2VkKDAp OworI2VuZGlmCisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbGlzdF9sb2NrLCBp cnFmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKHdha2VfdW5sb2NrKTsKKworaW50IHdha2VfbG9j a19hY3RpdmUoc3RydWN0IHdha2VfbG9jayAqbG9jaykKK3sKKwlyZXR1cm4gISEobG9jay0+Zmxh Z3MgJiBXQUtFX0xPQ0tfQUNUSVZFKTsKK30KK0VYUE9SVF9TWU1CT0wod2FrZV9sb2NrX2FjdGl2 ZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHdha2Vsb2Nrc19pbml0KHZvaWQpCit7CisJaW50IHJl dDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGFjdGl2ZV93YWtlX2xv Y2tzKTsgaSsrKQorCQlJTklUX0xJU1RfSEVBRCgmYWN0aXZlX3dha2VfbG9ja3NbaV0pOworCisj aWZkZWYgQ09ORklHX1dBS0VMT0NLX1NUQVQKKwl3YWtlX2xvY2tfaW5pdCgmZGVsZXRlZF93YWtl X2xvY2tzLCBXQUtFX0xPQ0tfU1VTUEVORCwKKwkJCSJkZWxldGVkX3dha2VfbG9ja3MiKTsKKyNl bmRpZgorCXdha2VfbG9ja19pbml0KCZtYWluX3dha2VfbG9jaywgV0FLRV9MT0NLX1NVU1BFTkQs ICJtYWluIik7CisJd2FrZV9sb2NrKCZtYWluX3dha2VfbG9jayk7CisJd2FrZV9sb2NrX2luaXQo JnVua25vd25fd2FrZXVwLCBXQUtFX0xPQ0tfU1VTUEVORCwgInVua25vd25fd2FrZXVwcyIpOwor CisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKCZwb3dlcl9kZXZpY2UpOworCWlmIChy ZXQpIHsKKwkJcHJfZXJyKCJ3YWtlbG9ja3NfaW5pdDogcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVy IGZhaWxlZFxuIik7CisJCWdvdG8gZXJyX3BsYXRmb3JtX2RldmljZV9yZWdpc3RlcjsKKwl9CisJ cmV0ID0gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZwb3dlcl9kcml2ZXIpOworCWlmIChyZXQp IHsKKwkJcHJfZXJyKCJ3YWtlbG9ja3NfaW5pdDogcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyIGZh aWxlZFxuIik7CisJCWdvdG8gZXJyX3BsYXRmb3JtX2RyaXZlcl9yZWdpc3RlcjsKKwl9CisKKwlz dXNwZW5kX3dvcmtfcXVldWUgPSBjcmVhdGVfc2luZ2xldGhyZWFkX3dvcmtxdWV1ZSgic3VzcGVu ZCIpOworCWlmIChzdXNwZW5kX3dvcmtfcXVldWUgPT0gTlVMTCkgeworCQlyZXQgPSAtRU5PTUVN OworCQlnb3RvIGVycl9zdXNwZW5kX3dvcmtfcXVldWU7CisJfQorCisjaWZkZWYgQ09ORklHX1dB S0VMT0NLX1NUQVQKKwljcmVhdGVfcHJvY19yZWFkX2VudHJ5KCJ3YWtlbG9ja3MiLCBTX0lSVUdP LCBOVUxMLAorCQkJCXdha2Vsb2Nrc19yZWFkX3Byb2MsIE5VTEwpOworI2VuZGlmCisKKwlyZXR1 cm4gMDsKKworZXJyX3N1c3BlbmRfd29ya19xdWV1ZToKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdp c3RlcigmcG93ZXJfZHJpdmVyKTsKK2Vycl9wbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXI6CisJcGxh dGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoJnBvd2VyX2RldmljZSk7CitlcnJfcGxhdGZvcm1fZGV2 aWNlX3JlZ2lzdGVyOgorCXdha2VfbG9ja19kZXN0cm95KCZ1bmtub3duX3dha2V1cCk7CisJd2Fr ZV9sb2NrX2Rlc3Ryb3koJm1haW5fd2FrZV9sb2NrKTsKKyNpZmRlZiBDT05GSUdfV0FLRUxPQ0tf U1RBVAorCXdha2VfbG9ja19kZXN0cm95KCZkZWxldGVkX3dha2VfbG9ja3MpOworI2VuZGlmCisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgIF9fZXhpdCB3YWtlbG9ja3NfZXhpdCh2b2lk KQoreworI2lmZGVmIENPTkZJR19XQUtFTE9DS19TVEFUCisJcmVtb3ZlX3Byb2NfZW50cnkoIndh a2Vsb2NrcyIsIE5VTEwpOworI2VuZGlmCisJZGVzdHJveV93b3JrcXVldWUoc3VzcGVuZF93b3Jr X3F1ZXVlKTsKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3RlcigmcG93ZXJfZHJpdmVyKTsKKwlw bGF0Zm9ybV9kZXZpY2VfdW5yZWdpc3RlcigmcG93ZXJfZGV2aWNlKTsKKwl3YWtlX2xvY2tfZGVz dHJveSgmdW5rbm93bl93YWtldXApOworCXdha2VfbG9ja19kZXN0cm95KCZtYWluX3dha2VfbG9j ayk7CisjaWZkZWYgQ09ORklHX1dBS0VMT0NLX1NUQVQKKwl3YWtlX2xvY2tfZGVzdHJveSgmZGVs ZXRlZF93YWtlX2xvY2tzKTsKKyNlbmRpZgorfQorCitjb3JlX2luaXRjYWxsKHdha2Vsb2Nrc19p bml0KTsKK21vZHVsZV9leGl0KHdha2Vsb2Nrc19leGl0KTsKLS0gCjEuNi4xCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1wbSBtYWlsaW5nIGxp c3QKbGludXgtcG1AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51 eC1mb3VuZGF0aW9uLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXBt