From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Widawsky Subject: [PATCH 2/2] intel_frequency: A tool to manipulate Intel GPU frequency Date: Sat, 10 Jan 2015 20:19:29 -0800 Message-ID: <1420949969-877-2-git-send-email-benjamin.widawsky@intel.com> References: <1420949969-877-1-git-send-email-benjamin.widawsky@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTP id A22AB6E255 for ; Sat, 10 Jan 2015 20:19:31 -0800 (PST) In-Reply-To: <1420949969-877-1-git-send-email-benjamin.widawsky@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel GFX Cc: Ben Widawsky , Ben Widawsky List-Id: intel-gfx@lists.freedesktop.org V0FSTklORzogdmVyeSBtaW5pbWFsbHkgdGVzdGVkCgpJbiBnZW5lcmFsIHlvdSBzaG91bGQgbm90 IG5lZWQgdGhpcyB0b29sLiBJdCdzIHByaW1hcnkgcHVycG9zZSBpcyBmb3IKYmVuY2htYXJraW5n LCBhbmQgZm9yIGRlYnVnZ2luZyBwZXJmb3JtYW5jZSBpc3N1ZXMuCgpGb3IgbWFueSBrZXJuZWwg cmVsZWFzZXMgbm93IHN5c2ZzIGhhcyBzdXBwb3J0ZWQgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUg R1BVCmZyZXF1ZW5jeS4gVGhlcmVmb3JlLCB0aGlzIHRvb2wgcHJvdmlkZXMgbm8gbmV3IGZ1bmN0 aW9uYWxpdHkuIFdoYXQgaXQgZG9lcwpwcm92aWRlIGlzIGFuIGVhc3kgdG8gcGFja2FnZSAoZm9y IGRpc3Ryb3MpIHRvb2wgdGhhdCBoYW5kbGVzIHRoZSBtb3N0IGNvbW1vbgpzY2VuYXJpb3MuCgpT aWduZWQtb2ZmLWJ5OiBCZW4gV2lkYXdza3kgPGJlbkBid2lkYXdzay5uZXQ+CgpIZXJlIGFyZSBz b21lIHNhbXBsZSB1c2FnZXM6CgokIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tZ2V0PWN1cixtaW4s bWF4LGVmZgpjdXI6IDIwMCBNSHoKbWluOiAyMDAgTUh6ClJQMTogMjAwIE1IegptYXg6IDEyMDAg TUh6CgokIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1nCmN1cjogMjAwIE1IegptaW46IDIwMCBNSHoK UlAxOiAyMDAgTUh6Cm1heDogMTIwMCBNSHoKCiQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWdlZmYK UlAxOiAyMDAgTUh6CgokIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tc2V0IG1pbj0zMDAKJCBzdWRv IGludGVsX2ZyZXF1ZW5jeSAtLWdldCBtaW4KY3VyOiAzMDAgTUh6Cm1pbjogMzAwIE1IegpSUDE6 IDIwMCBNSHoKbWF4OiAxMjAwIE1IegoKJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLWN1c3RvbSBt YXg9OTAwCiQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLS1nZXQgbWF4CmN1cjogMzAwIE1IegptaW46 IDMwMCBNSHoKUlAxOiAyMDAgTUh6Cm1heDogOTAwIE1IegoKJCBzdWRvIC4vdG9vbHMvaW50ZWxf ZnJlcXVlbmN5IC0tbWF4CiQgc3VkbyAuL3Rvb2xzL2ludGVsX2ZyZXF1ZW5jeSAtZwpjdXI6IDEy MDAgTUh6Cm1pbjogMTIwMCBNSHoKUlAxOiAyMDAgTUh6Cm1heDogMTIwMCBNSHoKCiQgc3VkbyBp bnRlbF9mcmVxdWVuY3kgLWUKJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwpjdXI6IDIwMCBNSHoK bWluOiAyMDAgTUh6ClJQMTogMjAwIE1IegptYXg6IDIwMCBNSHoKCiQgc3VkbyBpbnRlbF9mcmVx dWVuY3kgLS1tYXgKJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwpjdXI6IDEyMDAgTUh6Cm1pbjog MTIwMCBNSHoKUlAxOiAyMDAgTUh6Cm1heDogMTIwMCBNSHoKCiQgc3VkbyBpbnRlbF9mcmVxdWVu Y3kgLS1taW4KJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwpjdXI6IDIwMCBNSHoKbWluOiAyMDAg TUh6ClJQMTogMjAwIE1IegptYXg6IDIwMCBNSHoKLS0tCiB0b29scy9NYWtlZmlsZS5zb3VyY2Vz ICB8ICAgMSArCiB0b29scy9pbnRlbF9mcmVxdWVuY3kuYyB8IDMyNSArKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMzI2IGlu c2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9pbnRlbF9mcmVxdWVuY3kuYwoK ZGlmZiAtLWdpdCBhL3Rvb2xzL01ha2VmaWxlLnNvdXJjZXMgYi90b29scy9NYWtlZmlsZS5zb3Vy Y2VzCmluZGV4IGI4NWE2YjguLjJiZWEzODkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlLnNv dXJjZXMKKysrIGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwpAQCAtMTQsNiArMTQsNyBAQCBiaW5f UFJPR1JBTVMgPSAJCQkJXAogCWludGVsX2R1bXBfZGVjb2RlIAkJXAogCWludGVsX2Vycm9yX2Rl Y29kZSAJCVwKIAlpbnRlbF9mb3JjZXdha2VkCQlcCisJaW50ZWxfZnJlcXVlbmN5CQkJXAogCWlu dGVsX2ZyYW1lYnVmZmVyX2R1bXAgCQlcCiAJaW50ZWxfZ3B1X3RpbWUgCQkJXAogCWludGVsX2dw dV90b3AgCQkJXApkaWZmIC0tZ2l0IGEvdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMgYi90b29scy9p bnRlbF9mcmVxdWVuY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2Ix NzQxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMKQEAgLTAsMCAr MSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgorICoK KyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkg cGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0 ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0 aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRh dGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gs IGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNv ZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlz IGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6 CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBu b3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRl ZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdh cmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FS UkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQg Tk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5P IEVWRU5UIFNIQUxMCisgKiBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFC TEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVS IElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAq IEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBV U0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2Rl ZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5o PgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0 ZC5oPgorCisjaW5jbHVkZSAiZHJtdGVzdC5oIgorI2luY2x1ZGUgImludGVsX2NoaXBzZXQuaCIK Kworc3RhdGljIGludCBkZXZpY2UsIGRldmlkOworCitlbnVtIHsKKwlDVVI9MCwKKwlNSU4sCisJ RUZGLAorCU1BWCwKKwlSUDAsCisJUlBuCit9OworCitzdHJ1Y3QgZnJlcV9pbmZvIHsKKwljb25z dCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKm1vZGU7CisJRklMRSAqZmlscDsKKwljaGFyICpw YXRoOworfTsKKworc3RhdGljIHN0cnVjdCBmcmVxX2luZm8gaW5mb1tdID0geworCXsgImN1ciIs ICJyIiAgfSwKKwl7ICJtaW4iLCAicmIrIiB9LAorCXsgIlJQMSIsICJyIiB9LAorCXsgIm1heCIs ICJyYisiIH0sCisJeyAiUlAwIiwgInIiIH0sCisJeyAiUlBuIiwgInIiIH0KK307CisKK3N0YXRp YyBjaGFyICoKK2dldF9zeXNmc19wYXRoKGNvbnN0IGNoYXIgKndoaWNoKQoreworCXN0YXRpYyBj b25zdCBjaGFyIGZtdFtdID0gIi9zeXMvY2xhc3MvZHJtL2NhcmQlMWQvZ3RfJTNzX2ZyZXFfbWh6 IjsKKwljaGFyICpwYXRoOworCWludCByZXQ7CisKKyNkZWZpbmUgU1RBVElDX1NUUkxFTihzdHJp bmcpIChzaXplb2Yoc3RyaW5nKSAvIHNpemVvZihzdHJpbmcgWzBdKSkKKwlyZXQgPSBhc3ByaW50 ZigmcGF0aCwgZm10LCBkZXZpY2UsIHdoaWNoKTsKKwlhc3NlcnQocmV0ID09IChTVEFUSUNfU1RS TEVOKGZtdCkgLSAzKSk7CisjdW5kZWYgU1RBVElDX1NUUkxFTgorCisJcmV0dXJuIHBhdGg7Cit9 CisKK3N0YXRpYyB2b2lkCitpbml0aWFsaXplX2ZyZXFfaW5mbyhzdHJ1Y3QgZnJlcV9pbmZvICpm cmVxX2luZm8pCit7CisJaWYgKGZyZXFfaW5mby0+ZmlscCkKKwkJcmV0dXJuOworCisJZnJlcV9p bmZvLT5wYXRoID0gZ2V0X3N5c2ZzX3BhdGgoZnJlcV9pbmZvLT5uYW1lKTsKKwlhc3NlcnQoZnJl cV9pbmZvLT5wYXRoKTsKKwlmcmVxX2luZm8tPmZpbHAgPSBmb3BlbihmcmVxX2luZm8tPnBhdGgs IGZyZXFfaW5mby0+bW9kZSk7CisJYXNzZXJ0KGZyZXFfaW5mby0+ZmlscCk7Cit9CisKK3N0YXRp YyB2b2lkIHdhaXRfZnJlcV9zZXR0bGUodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisK KwkvKiBGSVhNRTogTGF6eSBzbGVlcCB3aXRob3V0IGNoZWNrLiAqLworCXRzLnR2X3NlYyA9IDA7 CisJdHMudHZfbnNlYyA9IDIwMDAwOworCWNsb2NrX25hbm9zbGVlcChDTE9DS19NT05PVE9OSUMs IDAsICZ0cywgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mcmVxdWVuY3koc3RydWN0IGZy ZXFfaW5mbyAqZnJlcV9pbmZvLCBpbnQgdmFsKQoreworCWluaXRpYWxpemVfZnJlcV9pbmZvKGZy ZXFfaW5mbyk7CisJcmV3aW5kKGZyZXFfaW5mby0+ZmlscCk7CisJYXNzZXJ0KGZwcmludGYoZnJl cV9pbmZvLT5maWxwLCAiJWQiLCB2YWwpID4gMCk7CisKKwl3YWl0X2ZyZXFfc2V0dGxlKCk7Cit9 CisKK3N0YXRpYyBpbnQgZ2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZnJlcV9pbmZvICpmcmVxX2luZm8p Cit7CisJaW50IHZhbDsKKworCWluaXRpYWxpemVfZnJlcV9pbmZvKGZyZXFfaW5mbyk7CisJcmV3 aW5kKGZyZXFfaW5mby0+ZmlscCk7CisJYXNzZXJ0KGZzY2FuZihmcmVxX2luZm8tPmZpbHAsICIl ZCIsICZ2YWwpPT0xKTsKKworCXJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB2b2lkCit1c2FnZShj b25zdCBjaGFyICpwcm9nKQoreworCXByaW50ZigiVXNhZ2U6ICVzIFstZWZdIFstLW1pbiB8IC0t bWF4XSBbLWcgKG1pbnxtYXh8ZWZmaWNpZW50KV1bLXMgZnJlcXVlbmN5X21oel1cblxuIiwgcHJv Zyk7CisJcHJpbnRmKCIlcyBBIHByb2dyYW0gdG8gbWFuaXB1bGF0ZSBJbnRlbCBHUFUgZnJlcXVl bmNpZXMuXG5cbiIsIHByb2cpOworCXByaW50ZigiT3B0aW9uczogXG4iKTsKKwlwcmludGYoIiAg LWUJCUxvY2sgZnJlcXVlbmN5IHRvIHRoZSBtb3N0IGVmZmljaWVudCBmcmVxdWVuY3lcbiIpOwor CXByaW50ZigiICAtZywgLS1nZXQ9ICAgIEdldCB0aGUgZnJlcXVlbmN5IChvcHRpb25hbCBhcmc6 IFwiY3VyXCJ8XCJtaW5cInxcIm1heFwifFwiZWZmXCIpXG4iKTsKKwlwcmludGYoIiAgLXMsIC0t c2V0ICAgICBMb2NrIGZyZXF1ZW5jeSB0byBhbiBhYnNvbHV0ZSB2YWx1ZSAoTUh6KVxuIik7CisJ cHJpbnRmKCIgIC1jLCAtLWN1c3RvbSAgU2V0IGEgbWluLCBvciBtYXggZnJlcXVlbmN5IFwibWlu PVggfCBtYXg9WVwiXG4iKTsKKwlwcmludGYoIiAgLW0gIC0tbWF4ICAgICBMb2NrIGZyZXF1ZW5j eSB0byBtYXggZnJlcXVlbmN5XG4iKTsKKwlwcmludGYoIiAgICAgIC0tbWluICAgICBMb2NrIGZy ZXF1ZW5jeSB0byBtaW4gKG5ldmVyIGEgZ29vZCBpZGVhLCBERUJVRyBPTkxZKVxuIik7CisJcHJp bnRmKCJFeGFtcGxlczpcbiIpOworCXByaW50ZigiXHRpbnRlbF9mcmVxdWVuY3kgLWdtaW4sY3Vy IEdldCB0aGUgY3VycmVudCBhbmQgbWluaW11bSBmcmVxdWVuY3lcbiIpOworCXByaW50ZigiXHRp bnRlbF9mcmVxdWVuY3kgLXMgNDAwICAgIExvY2sgZnJlcXVlbmN5IHRvIDQwME1oelxuIik7CisJ ZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisvKiBSZXR1cm5zIHJlYWQgb3Igd3JpdGUgb3BlcmF0 aW9uICovCitzdGF0aWMgYm9vbAorcGFyc2UoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSwgYm9vbCAq YWN0X3Vwb24sIGludCAqbmV3X2ZyZXEpCit7CisJaW50IGMsIHRtcDsKKwlib29sIHdyaXRlID0g ZmFsc2U7CisKKwljaGFyICp0b2tlbltdID0geworCQkoY2hhciAqKWluZm9bQ1VSXS5uYW1lLAor CQkoY2hhciAqKWluZm9bTUlOXS5uYW1lLAorCQkoY2hhciAqKSJlZmYiLAorCQkoY2hhciAqKWlu Zm9bTUFYXS5uYW1lCisJfTsKKworCS8qIE5vIGFyZ3MgbWVhbnMgLWciICovCisJaWYgKGFyZ2Mg PT0gMSkgeworCQlmb3IgKGMgPSAwOyBjIDwgQVJSQVlfU0laRShhY3RfdXBvbik7IGMrKykKKwkJ CWFjdF91cG9uW2NdID0gdHJ1ZTsKKwkJZ290byBkb25lOworCX0KKwl3aGlsZSAoMSkgeworCQlp bnQgb3B0aW9uX2luZGV4ID0gMDsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25z W10gPSB7CisJCQl7ICJnZXQiLCBvcHRpb25hbF9hcmd1bWVudCwgTlVMTCwgJ2cnIH0sCisJCQl7 ICJzZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ3MnIH0sCisJCQl7ICJjdXN0b20iLCBy ZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ2MnfSwKKwkJCXsgIm1pbiIsIG5vX2FyZ3VtZW50LCBO VUxMLCAnaScgfSwKKwkJCXsgIm1heCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbScgfSwKKwkJCXsg ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJ2gnIH0sCisJCQl7IE5VTEwsIDAsIE5VTEwsIDB9 CisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJlZzo6czpjOm1paCIsIGxv bmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisK KwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2cnOgorCQkJaWYgKHdyaXRlID09IHRydWUpCisJCQkJ ZnByaW50ZihzdGRlcnIsICJSZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIG5vdCBzdXBwb3J0IHNp bXVsdGFuZW91c2x5LlxuIik7CisKKwkJCWlmIChvcHRhcmcpIHsKKwkJCQljaGFyICp2YWx1ZSwg KnN1Ym9wdHMgPSBvcHRhcmc7CisJCQkJaW50IHg7CisJCQkJd2hpbGUgKCpzdWJvcHRzICE9ICdc MCcpIHsKKwkJCQkJeCA9IGdldHN1Ym9wdCgmc3Vib3B0cywgdG9rZW4sICZ2YWx1ZSk7CisJCQkJ CWlmICh4ID09IC0xKSB7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlVucmVjb2duaXplZCBvcHRp b24gKCVzKVxuIiwgdmFsdWUpOworCQkJCQkJYnJlYWs7CisJCQkJCX0gZWxzZQorCQkJCQkJYWN0 X3Vwb25beF0gPSB0cnVlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaW50IGk7CisJCQkJZm9y IChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYWN0X3Vwb24pOyBpKyspCisJCQkJCWFjdF91cG9uW2ld ID0gdHJ1ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlmICghb3B0YXJnKQor CQkJCXVzYWdlKGFyZ3ZbMF0pOworCisJCQlpZiAod3JpdGUgPT0gdHJ1ZSkgeworCQkJCWZwcmlu dGYoc3RkZXJyLCAiT25seSBvbmUgd3JpdGUgbWF5IGJlIHNwZWNpZmllZCBhdCBhIHRpbWVcbiIp OworCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCX0KKworCQkJd3JpdGUgPSB0cnVlOworCQkJ YWN0X3Vwb25bTUlOXSA9IHRydWU7CisJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKKwkJCXNzY2Fu ZihvcHRhcmcsICIlZCIsICZuZXdfZnJlcVtNQVhdKTsKKwkJCW5ld19mcmVxW01JTl0gPSBuZXdf ZnJlcVtNQVhdOworCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJaWYgKCFvcHRhcmcpCisJCQkJ dXNhZ2UoYXJndlswXSk7CisKKwkJCWlmICh3cml0ZSA9PSB0cnVlKSB7CisJCQkJZnByaW50Zihz dGRlcnIsICJPbmx5IG9uZSB3cml0ZSBtYXkgYmUgc3BlY2lmaWVkIGF0IGEgdGltZVxuIik7CisJ CQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCisJCQl3cml0ZSA9IHRydWU7CisKKwkJCWlm ICghc3RybmNtcCgibWluPSIsIG9wdGFyZywgNCkpIHsKKwkJCQlhY3RfdXBvbltNSU5dID0gdHJ1 ZTsKKwkJCQlzc2NhbmYob3B0YXJnKzQsICIlZCIsICZuZXdfZnJlcVtNSU5dKTsKKwkJCX0gZWxz ZSBpZiAoIXN0cm5jbXAoIm1heD0iLCBvcHRhcmcsIDQpKSB7CisJCQkJYWN0X3Vwb25bTUFYXSA9 IHRydWU7CisJCQkJc3NjYW5mKG9wdGFyZys0LCAiJWQiLCAmbmV3X2ZyZXFbTUFYXSk7CisJCQl9 IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiU2VsZWN0ZWQgdW5tb2RpZmlhYmxlIGZyZXF1 ZW5jeVxuIik7CisJCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJYnJlYWs7CisJCWNh c2UgJ2UnOgorCQkJaWYgKElTX1ZBTExFWVZJRVcoZGV2aWQpIHx8IElTX0NIRVJSWVZJRVcoZGV2 aWQpKSB7CisJCQkJLyogdGhlIExQIHBhcnRzIGhhdmUgc3BlY2lhbCBlZmZpY2llbnQgZnJlcXVl bmNpZXMgKi8KKwkJCQlmcHJpbnRmKHN0ZGVyciwgIkZJWE1FOiBXYXJuaW5nIGVmZmljaWVudCBm cmVxdWVuY3kgaW5mb3JtYXRpb24gaXMgaW5jb3JyZWN0LlxuIik7CisJCQkJZXhpdChFWElUX0ZB SUxVUkUpOworCQkJfQorCQkJdG1wID0gZ2V0X2ZyZXF1ZW5jeSgmaW5mb1tFRkZdKTsKKwkJCW5l d19mcmVxW01JTl0gPSB0bXA7CisJCQluZXdfZnJlcVtNQVhdID0gdG1wOworCQkJYWN0X3Vwb25b TUlOXSA9IHRydWU7CisJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKKwkJCXdyaXRlID0gdHJ1ZTsK KwkJCWJyZWFrOworCQljYXNlICdpJzogLyogbUluICovCisJCQl0bXAgPSBnZXRfZnJlcXVlbmN5 KCZpbmZvW1JQbl0pOworCQkJbmV3X2ZyZXFbTUlOXSA9IHRtcDsKKwkJCW5ld19mcmVxW01BWF0g PSB0bXA7CisJCQlhY3RfdXBvbltNSU5dID0gdHJ1ZTsKKwkJCWFjdF91cG9uW01BWF0gPSB0cnVl OworCQkJd3JpdGUgPSB0cnVlOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOiAvKiBtYXggKi8KKwkJ CXRtcCA9IGdldF9mcmVxdWVuY3koJmluZm9bUlAwXSk7CisJCQluZXdfZnJlcVtNSU5dID0gdG1w OworCQkJbmV3X2ZyZXFbTUFYXSA9IHRtcDsKKwkJCWFjdF91cG9uW01JTl0gPSB0cnVlOworCQkJ YWN0X3Vwb25bTUFYXSA9IHRydWU7CisJCQl3cml0ZSA9IHRydWU7CisJCQlicmVhazsKKwkJY2Fz ZSAnaCc6CisJCWRlZmF1bHQ6CisJCQl1c2FnZShhcmd2WzBdKTsKKwkJfQorCX0KKworZG9uZToK KwlyZXR1cm4gd3JpdGU7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7 CisKKwlib29sIHdyaXRlLCBmYWlsLCB0YXJnZXRzW01BWCsxXSA9IHtmYWxzZX07CisJaW50IGks IHRyeSA9IDEsIHNldF9mcmVxW01BWCsxXSA9IHswfTsKKworCWRldmlkID0gaW50ZWxfZ2V0X2Ry bV9kZXZpZChkcm1fb3Blbl9hbnkoKSk7CisJZGV2aWNlID0gZHJtX2dldF9jYXJkKCk7CisKKwl3 cml0ZSA9IHBhcnNlKGFyZ2MsIGFyZ3YsIHRhcmdldHMsIHNldF9mcmVxKTsKKwlmYWlsID0gd3Jp dGU7CisKKwkvKiBJZiB3ZSd2ZSBwcmV2aW91c2x5IGxvY2tlZCB0aGUgZnJlcXVlbmN5LCB3ZSBu ZWVkIHRvIG1ha2Ugc3VyZSB0byBzZXQgdGhpbmdzCisJICogaW4gdGhlIGNvcnJlY3Qgb3JkZXIs IG9yIGVsc2UgdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgKGllLiBtaW4gPSBtYXggPSAyMDAsCisJ ICogYW5kIHdlIHNldCBtaW4gdG8gMzAwLCB3ZSBmYWlsIGJlY2F1c2UgaXQgd291bGQgdHJ5IHRv IHNldCBtaW4gPgorCSAqIG1heCkuIFRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBiZSBnb2luZyBl aXRoZXIgZm9yd2FyZCBvciByZXZlcnNlCisJICogdGhyb3VnaCB0aGUgbG9vcC4gTUlOIGlzIGFs d2F5cyBiZWZvcmUgTUFYLgorCSAqCisJICogWFhYOiBTaW5jZSBvbmx5IG1pbiBhbmQgbWF4IGFy ZSBhdCBwbGF5LCB0aGUgc3VwZXIgbGF6eSB3YXkgaXMgdG8gZG8gdGhpcworCSAqIDMgdGltZXMg YW5kIGlmIHdlIHN0aWxsIGZhaWwgYWZ0ZXIgMywgaXQncyBmb3IgcmVhbC4KKwkgKi8KK2FnYWlu OgorCWlmICh0cnkgPiAyKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRGlkIG5vdCBhY2hpZXZlIGRl c2lyZWQgZnJlcS5cbiIpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKHRhcmdldHMpOyBpKyspIHsKKwkJaWYgKHRhcmdldHNbaV0gPT0gZmFs c2UpCisJCQljb250aW51ZTsKKworCQlpZiAod3JpdGUpIHsKKwkJCXNldF9mcmVxdWVuY3koJmlu Zm9baV0sIHNldF9mcmVxW2ldKTsKKwkJCWlmIChnZXRfZnJlcXVlbmN5KCZpbmZvW2ldKSAhPSBz ZXRfZnJlcVtpXSkKKwkJCQlmYWlsID0gdHJ1ZTsKKwkJCWVsc2UKKwkJCQlmYWlsID0gZmFsc2U7 CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiVzOiAlZCBNSHpcbiIsIGluZm9baV0ubmFtZSwgZ2V0 X2ZyZXF1ZW5jeSgmaW5mb1tpXSkpOworCQl9CisJfQorCisJaWYgKGZhaWwpIHsKKwkJdHJ5Kys7 CisJCWdvdG8gYWdhaW47CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFyZ2V0 cyk7IGkrKykgeworCQlpZiAoaW5mb1tpXS5maWxwKSB7CisJCQlmY2xvc2UoaW5mb1tpXS5maWxw KTsKKwkJCWZyZWUoaW5mb1tpXS5wYXRoKTsKKwkJfQorCX0KKworCXJldHVybiBFWElUX1NVQ0NF U1M7Cit9Ci0tIAoyLjIuMQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0 b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRl bC1nZngK