From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ben Widawsky Subject: Re: [PATCH 2/2] intel_frequency: A tool to manipulate Intel GPU frequency Date: Sat, 10 Jan 2015 20:36:59 -0800 Message-ID: <20150111043658.GA3787@bwidawsk.net> References: <1420949969-877-1-git-send-email-benjamin.widawsky@intel.com> <1420949969-877-2-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 mail.bwidawsk.net (bwidawsk.net [166.78.191.112]) by gabe.freedesktop.org (Postfix) with ESMTP id C419E89F5B for ; Sat, 10 Jan 2015 20:37:07 -0800 (PST) Content-Disposition: inline In-Reply-To: <1420949969-877-2-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 List-Id: intel-gfx@lists.freedesktop.org S2VuIGdhdmUgbWUgdGhlIGdvb2QgaWRlYSBvZiAtZCwgLS1kZWZhdWx0cyB0byBnbyBiYWNrIHRv IHRoZSBoYXJkd2FyZSBzcGVjaWZpZWQKZGVmYXVsdHMuIEkgd2lsbCBzZW5kIG91dCBhIHYyIGlm IG5vYm9keSBlbHNlIGhhcyBhbnkgY29tcGxhaW50cy4KCk9uIFNhdCwgSmFuIDEwLCAyMDE1IGF0 IDA4OjE5OjI5UE0gLTA4MDAsIEJlbiBXaWRhd3NreSB3cm90ZToKPiBXQVJOSU5HOiB2ZXJ5IG1p bmltYWxseSB0ZXN0ZWQKPiAKPiBJbiBnZW5lcmFsIHlvdSBzaG91bGQgbm90IG5lZWQgdGhpcyB0 b29sLiBJdCdzIHByaW1hcnkgcHVycG9zZSBpcyBmb3IKPiBiZW5jaG1hcmtpbmcsIGFuZCBmb3Ig ZGVidWdnaW5nIHBlcmZvcm1hbmNlIGlzc3Vlcy4KPiAKPiBGb3IgbWFueSBrZXJuZWwgcmVsZWFz ZXMgbm93IHN5c2ZzIGhhcyBzdXBwb3J0ZWQgcmVhZGluZyBhbmQgd3JpdGluZyB0aGUgR1BVCj4g ZnJlcXVlbmN5LiBUaGVyZWZvcmUsIHRoaXMgdG9vbCBwcm92aWRlcyBubyBuZXcgZnVuY3Rpb25h bGl0eS4gV2hhdCBpdCBkb2VzCj4gcHJvdmlkZSBpcyBhbiBlYXN5IHRvIHBhY2thZ2UgKGZvciBk aXN0cm9zKSB0b29sIHRoYXQgaGFuZGxlcyB0aGUgbW9zdCBjb21tb24KPiBzY2VuYXJpb3MuCj4g Cj4gU2lnbmVkLW9mZi1ieTogQmVuIFdpZGF3c2t5IDxiZW5AYndpZGF3c2submV0Pgo+IAo+IEhl cmUgYXJlIHNvbWUgc2FtcGxlIHVzYWdlczoKPiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0t Z2V0PWN1cixtaW4sbWF4LGVmZgo+IGN1cjogMjAwIE1Iego+IG1pbjogMjAwIE1Iego+IFJQMTog MjAwIE1Iego+IG1heDogMTIwMCBNSHoKPiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC1nCj4g Y3VyOiAyMDAgTUh6Cj4gbWluOiAyMDAgTUh6Cj4gUlAxOiAyMDAgTUh6Cj4gbWF4OiAxMjAwIE1I ego+IAo+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWdlZmYKPiBSUDE6IDIwMCBNSHoKPiAKPiAk IHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tc2V0IG1pbj0zMDAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVl bmN5IC0tZ2V0IG1pbgo+IGN1cjogMzAwIE1Iego+IG1pbjogMzAwIE1Iego+IFJQMTogMjAwIE1I ego+IG1heDogMTIwMCBNSHoKPiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tY3VzdG9tIG1h eD05MDAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5IC0tZ2V0IG1heAo+IGN1cjogMzAwIE1Iego+ IG1pbjogMzAwIE1Iego+IFJQMTogMjAwIE1Iego+IG1heDogOTAwIE1Iego+IAo+ICQgc3VkbyAu L3Rvb2xzL2ludGVsX2ZyZXF1ZW5jeSAtLW1heAo+ICQgc3VkbyAuL3Rvb2xzL2ludGVsX2ZyZXF1 ZW5jeSAtZwo+IGN1cjogMTIwMCBNSHoKPiBtaW46IDEyMDAgTUh6Cj4gUlAxOiAyMDAgTUh6Cj4g bWF4OiAxMjAwIE1Iego+IAo+ICQgc3VkbyBpbnRlbF9mcmVxdWVuY3kgLWUKPiAkIHN1ZG8gaW50 ZWxfZnJlcXVlbmN5IC1nCj4gY3VyOiAyMDAgTUh6Cj4gbWluOiAyMDAgTUh6Cj4gUlAxOiAyMDAg TUh6Cj4gbWF4OiAyMDAgTUh6Cj4gCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtLW1heAo+ICQg c3VkbyBpbnRlbF9mcmVxdWVuY3kgLWcKPiBjdXI6IDEyMDAgTUh6Cj4gbWluOiAxMjAwIE1Iego+ IFJQMTogMjAwIE1Iego+IG1heDogMTIwMCBNSHoKPiAKPiAkIHN1ZG8gaW50ZWxfZnJlcXVlbmN5 IC0tbWluCj4gJCBzdWRvIGludGVsX2ZyZXF1ZW5jeSAtZwo+IGN1cjogMjAwIE1Iego+IG1pbjog MjAwIE1Iego+IFJQMTogMjAwIE1Iego+IG1heDogMjAwIE1Iego+IC0tLQo+ICB0b29scy9NYWtl ZmlsZS5zb3VyY2VzICB8ICAgMSArCj4gIHRvb2xzL2ludGVsX2ZyZXF1ZW5jeS5jIHwgMzI1ICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+ICAyIGZpbGVz IGNoYW5nZWQsIDMyNiBpbnNlcnRpb25zKCspCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCB0b29scy9p bnRlbF9mcmVxdWVuY3kuYwo+IAo+IGRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5zb3VyY2Vz IGIvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+IGluZGV4IGI4NWE2YjguLjJiZWEzODkgMTAwNjQ0 Cj4gLS0tIGEvdG9vbHMvTWFrZWZpbGUuc291cmNlcwo+ICsrKyBiL3Rvb2xzL01ha2VmaWxlLnNv dXJjZXMKPiBAQCAtMTQsNiArMTQsNyBAQCBiaW5fUFJPR1JBTVMgPSAJCQkJXAo+ICAJaW50ZWxf ZHVtcF9kZWNvZGUgCQlcCj4gIAlpbnRlbF9lcnJvcl9kZWNvZGUgCQlcCj4gIAlpbnRlbF9mb3Jj ZXdha2VkCQlcCj4gKwlpbnRlbF9mcmVxdWVuY3kJCQlcCj4gIAlpbnRlbF9mcmFtZWJ1ZmZlcl9k dW1wIAkJXAo+ICAJaW50ZWxfZ3B1X3RpbWUgCQkJXAo+ICAJaW50ZWxfZ3B1X3RvcCAJCQlcCj4g ZGlmZiAtLWdpdCBhL3Rvb2xzL2ludGVsX2ZyZXF1ZW5jeS5jIGIvdG9vbHMvaW50ZWxfZnJlcXVl bmN5LmMKPiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAuLjg3YjE3NDEKPiAt LS0gL2Rldi9udWxsCj4gKysrIGIvdG9vbHMvaW50ZWxfZnJlcXVlbmN5LmMKPiBAQCAtMCwwICsx LDMyNSBAQAo+ICsvKgo+ICsgKiBDb3B5cmlnaHQgwqkgMjAxNSBJbnRlbCBDb3Jwb3JhdGlvbgo+ ICsgKgo+ICsgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwg dG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQo+ICsgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5k IGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAo+ICsgKiB0 byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0 aG91dCBsaW1pdGF0aW9uCj4gKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1l cmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAo+ICsgKiBhbmQvb3Igc2VsbCBj b3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUK PiArICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xs b3dpbmcgY29uZGl0aW9uczoKPiArICoKPiArICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug YW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAo+ICsgKiBwYXJh Z3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9y dGlvbnMgb2YgdGhlCj4gKyAqIFNvZnR3YXJlLgo+ICsgKgo+ICsgKiBUSEUgU09GVFdBUkUgSVMg UFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBP Ugo+ICsgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKPiArICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV UlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCj4gKyAqIFRIRSBB VVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1B R0VTIE9SIE9USEVSCj4gKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09O VFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCj4gKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKPiArICog REVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgo+ICsgKgo+ICsgKi8KPiArCj4gKyNkZWZpbmUgX0dO VV9TT1VSQ0UKPiArI2luY2x1ZGUgPGFzc2VydC5oPgo+ICsjaW5jbHVkZSA8Z2V0b3B0Lmg+Cj4g KyNpbmNsdWRlIDxzdGRpby5oPgo+ICsjaW5jbHVkZSA8dGltZS5oPgo+ICsjaW5jbHVkZSA8dW5p c3RkLmg+Cj4gKwo+ICsjaW5jbHVkZSAiZHJtdGVzdC5oIgo+ICsjaW5jbHVkZSAiaW50ZWxfY2hp cHNldC5oIgo+ICsKPiArc3RhdGljIGludCBkZXZpY2UsIGRldmlkOwo+ICsKPiArZW51bSB7Cj4g KwlDVVI9MCwKPiArCU1JTiwKPiArCUVGRiwKPiArCU1BWCwKPiArCVJQMCwKPiArCVJQbgo+ICt9 Owo+ICsKPiArc3RydWN0IGZyZXFfaW5mbyB7Cj4gKwljb25zdCBjaGFyICpuYW1lOwo+ICsJY29u c3QgY2hhciAqbW9kZTsKPiArCUZJTEUgKmZpbHA7Cj4gKwljaGFyICpwYXRoOwo+ICt9Owo+ICsK PiArc3RhdGljIHN0cnVjdCBmcmVxX2luZm8gaW5mb1tdID0gewo+ICsJeyAiY3VyIiwgInIiICB9 LAo+ICsJeyAibWluIiwgInJiKyIgfSwKPiArCXsgIlJQMSIsICJyIiB9LAo+ICsJeyAibWF4Iiwg InJiKyIgfSwKPiArCXsgIlJQMCIsICJyIiB9LAo+ICsJeyAiUlBuIiwgInIiIH0KPiArfTsKPiAr Cj4gK3N0YXRpYyBjaGFyICoKPiArZ2V0X3N5c2ZzX3BhdGgoY29uc3QgY2hhciAqd2hpY2gpCj4g K3sKPiArCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gIi9zeXMvY2xhc3MvZHJtL2NhcmQlMWQv Z3RfJTNzX2ZyZXFfbWh6IjsKPiArCWNoYXIgKnBhdGg7Cj4gKwlpbnQgcmV0Owo+ICsKPiArI2Rl ZmluZSBTVEFUSUNfU1RSTEVOKHN0cmluZykgKHNpemVvZihzdHJpbmcpIC8gc2l6ZW9mKHN0cmlu ZyBbMF0pKQo+ICsJcmV0ID0gYXNwcmludGYoJnBhdGgsIGZtdCwgZGV2aWNlLCB3aGljaCk7Cj4g Kwlhc3NlcnQocmV0ID09IChTVEFUSUNfU1RSTEVOKGZtdCkgLSAzKSk7Cj4gKyN1bmRlZiBTVEFU SUNfU1RSTEVOCj4gKwo+ICsJcmV0dXJuIHBhdGg7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkCj4g K2luaXRpYWxpemVfZnJlcV9pbmZvKHN0cnVjdCBmcmVxX2luZm8gKmZyZXFfaW5mbykKPiArewo+ ICsJaWYgKGZyZXFfaW5mby0+ZmlscCkKPiArCQlyZXR1cm47Cj4gKwo+ICsJZnJlcV9pbmZvLT5w YXRoID0gZ2V0X3N5c2ZzX3BhdGgoZnJlcV9pbmZvLT5uYW1lKTsKPiArCWFzc2VydChmcmVxX2lu Zm8tPnBhdGgpOwo+ICsJZnJlcV9pbmZvLT5maWxwID0gZm9wZW4oZnJlcV9pbmZvLT5wYXRoLCBm cmVxX2luZm8tPm1vZGUpOwo+ICsJYXNzZXJ0KGZyZXFfaW5mby0+ZmlscCk7Cj4gK30KPiArCj4g K3N0YXRpYyB2b2lkIHdhaXRfZnJlcV9zZXR0bGUodm9pZCkKPiArewo+ICsJc3RydWN0IHRpbWVz cGVjIHRzOwo+ICsKPiArCS8qIEZJWE1FOiBMYXp5IHNsZWVwIHdpdGhvdXQgY2hlY2suICovCj4g Kwl0cy50dl9zZWMgPSAwOwo+ICsJdHMudHZfbnNlYyA9IDIwMDAwOwo+ICsJY2xvY2tfbmFub3Ns ZWVwKENMT0NLX01PTk9UT05JQywgMCwgJnRzLCBOVUxMKTsKPiArfQo+ICsKPiArc3RhdGljIHZv aWQgc2V0X2ZyZXF1ZW5jeShzdHJ1Y3QgZnJlcV9pbmZvICpmcmVxX2luZm8sIGludCB2YWwpCj4g K3sKPiArCWluaXRpYWxpemVfZnJlcV9pbmZvKGZyZXFfaW5mbyk7Cj4gKwlyZXdpbmQoZnJlcV9p bmZvLT5maWxwKTsKPiArCWFzc2VydChmcHJpbnRmKGZyZXFfaW5mby0+ZmlscCwgIiVkIiwgdmFs KSA+IDApOwo+ICsKPiArCXdhaXRfZnJlcV9zZXR0bGUoKTsKPiArfQo+ICsKPiArc3RhdGljIGlu dCBnZXRfZnJlcXVlbmN5KHN0cnVjdCBmcmVxX2luZm8gKmZyZXFfaW5mbykKPiArewo+ICsJaW50 IHZhbDsKPiArCj4gKwlpbml0aWFsaXplX2ZyZXFfaW5mbyhmcmVxX2luZm8pOwo+ICsJcmV3aW5k KGZyZXFfaW5mby0+ZmlscCk7Cj4gKwlhc3NlcnQoZnNjYW5mKGZyZXFfaW5mby0+ZmlscCwgIiVk IiwgJnZhbCk9PTEpOwo+ICsKPiArCXJldHVybiB2YWw7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lk Cj4gK3VzYWdlKGNvbnN0IGNoYXIgKnByb2cpCj4gK3sKPiArCXByaW50ZigiVXNhZ2U6ICVzIFst ZWZdIFstLW1pbiB8IC0tbWF4XSBbLWcgKG1pbnxtYXh8ZWZmaWNpZW50KV1bLXMgZnJlcXVlbmN5 X21oel1cblxuIiwgcHJvZyk7Cj4gKwlwcmludGYoIiVzIEEgcHJvZ3JhbSB0byBtYW5pcHVsYXRl IEludGVsIEdQVSBmcmVxdWVuY2llcy5cblxuIiwgcHJvZyk7Cj4gKwlwcmludGYoIk9wdGlvbnM6 IFxuIik7Cj4gKwlwcmludGYoIiAgLWUJCUxvY2sgZnJlcXVlbmN5IHRvIHRoZSBtb3N0IGVmZmlj aWVudCBmcmVxdWVuY3lcbiIpOwo+ICsJcHJpbnRmKCIgIC1nLCAtLWdldD0gICAgR2V0IHRoZSBm cmVxdWVuY3kgKG9wdGlvbmFsIGFyZzogXCJjdXJcInxcIm1pblwifFwibWF4XCJ8XCJlZmZcIilc biIpOwo+ICsJcHJpbnRmKCIgIC1zLCAtLXNldCAgICAgTG9jayBmcmVxdWVuY3kgdG8gYW4gYWJz b2x1dGUgdmFsdWUgKE1IeilcbiIpOwo+ICsJcHJpbnRmKCIgIC1jLCAtLWN1c3RvbSAgU2V0IGEg bWluLCBvciBtYXggZnJlcXVlbmN5IFwibWluPVggfCBtYXg9WVwiXG4iKTsKPiArCXByaW50Zigi ICAtbSAgLS1tYXggICAgIExvY2sgZnJlcXVlbmN5IHRvIG1heCBmcmVxdWVuY3lcbiIpOwo+ICsJ cHJpbnRmKCIgICAgICAtLW1pbiAgICAgTG9jayBmcmVxdWVuY3kgdG8gbWluIChuZXZlciBhIGdv b2QgaWRlYSwgREVCVUcgT05MWSlcbiIpOwo+ICsJcHJpbnRmKCJFeGFtcGxlczpcbiIpOwo+ICsJ cHJpbnRmKCJcdGludGVsX2ZyZXF1ZW5jeSAtZ21pbixjdXIgR2V0IHRoZSBjdXJyZW50IGFuZCBt aW5pbXVtIGZyZXF1ZW5jeVxuIik7Cj4gKwlwcmludGYoIlx0aW50ZWxfZnJlcXVlbmN5IC1zIDQw MCAgICBMb2NrIGZyZXF1ZW5jeSB0byA0MDBNaHpcbiIpOwo+ICsJZXhpdChFWElUX0ZBSUxVUkUp Owo+ICt9Cj4gKwo+ICsvKiBSZXR1cm5zIHJlYWQgb3Igd3JpdGUgb3BlcmF0aW9uICovCj4gK3N0 YXRpYyBib29sCj4gK3BhcnNlKGludCBhcmdjLCBjaGFyICphcmd2W10sIGJvb2wgKmFjdF91cG9u LCBpbnQgKm5ld19mcmVxKQo+ICt7Cj4gKwlpbnQgYywgdG1wOwo+ICsJYm9vbCB3cml0ZSA9IGZh bHNlOwo+ICsKPiArCWNoYXIgKnRva2VuW10gPSB7Cj4gKwkJKGNoYXIgKilpbmZvW0NVUl0ubmFt ZSwKPiArCQkoY2hhciAqKWluZm9bTUlOXS5uYW1lLAo+ICsJCShjaGFyICopImVmZiIsCj4gKwkJ KGNoYXIgKilpbmZvW01BWF0ubmFtZQo+ICsJfTsKPiArCj4gKwkvKiBObyBhcmdzIG1lYW5zIC1n IiAqLwo+ICsJaWYgKGFyZ2MgPT0gMSkgewo+ICsJCWZvciAoYyA9IDA7IGMgPCBBUlJBWV9TSVpF KGFjdF91cG9uKTsgYysrKQo+ICsJCQlhY3RfdXBvbltjXSA9IHRydWU7Cj4gKwkJZ290byBkb25l Owo+ICsJfQo+ICsJd2hpbGUgKDEpIHsKPiArCQlpbnQgb3B0aW9uX2luZGV4ID0gMDsKPiArCQlz dGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29wdGlvbnNbXSA9IHsKPiArCQkJeyAiZ2V0Iiwgb3B0 aW9uYWxfYXJndW1lbnQsIE5VTEwsICdnJyB9LAo+ICsJCQl7ICJzZXQiLCByZXF1aXJlZF9hcmd1 bWVudCwgTlVMTCwgJ3MnIH0sCj4gKwkJCXsgImN1c3RvbSIsIHJlcXVpcmVkX2FyZ3VtZW50LCBO VUxMLCAnYyd9LAo+ICsJCQl7ICJtaW4iLCBub19hcmd1bWVudCwgTlVMTCwgJ2knIH0sCj4gKwkJ CXsgIm1heCIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnbScgfSwKPiArCQkJeyAiaGVscCIsIG5vX2Fy Z3VtZW50LCBOVUxMLCAnaCcgfSwKPiArCQkJeyBOVUxMLCAwLCBOVUxMLCAwfQo+ICsJCX07Cj4g Kwo+ICsJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiZWc6OnM6YzptaWgiLCBsb25nX29w dGlvbnMsICZvcHRpb25faW5kZXgpOwo+ICsJCWlmIChjID09IC0xKQo+ICsJCQlicmVhazsKPiAr Cj4gKwkJc3dpdGNoIChjKSB7Cj4gKwkJY2FzZSAnZyc6Cj4gKwkJCWlmICh3cml0ZSA9PSB0cnVl KQo+ICsJCQkJZnByaW50ZihzdGRlcnIsICJSZWFkIGFuZCB3cml0ZSBvcGVyYXRpb25zIG5vdCBz dXBwb3J0IHNpbXVsdGFuZW91c2x5LlxuIik7Cj4gKwo+ICsJCQlpZiAob3B0YXJnKSB7Cj4gKwkJ CQljaGFyICp2YWx1ZSwgKnN1Ym9wdHMgPSBvcHRhcmc7Cj4gKwkJCQlpbnQgeDsKPiArCQkJCXdo aWxlICgqc3Vib3B0cyAhPSAnXDAnKSB7Cj4gKwkJCQkJeCA9IGdldHN1Ym9wdCgmc3Vib3B0cywg dG9rZW4sICZ2YWx1ZSk7Cj4gKwkJCQkJaWYgKHggPT0gLTEpIHsKPiArCQkJCQkJZnByaW50Zihz dGRlcnIsICJVbnJlY29nbml6ZWQgb3B0aW9uICglcylcbiIsIHZhbHVlKTsKPiArCQkJCQkJYnJl YWs7Cj4gKwkJCQkJfSBlbHNlCj4gKwkJCQkJCWFjdF91cG9uW3hdID0gdHJ1ZTsKPiArCQkJCX0K PiArCQkJfSBlbHNlIHsKPiArCQkJCWludCBpOwo+ICsJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZ X1NJWkUoYWN0X3Vwb24pOyBpKyspCj4gKwkJCQkJYWN0X3Vwb25baV0gPSB0cnVlOwo+ICsJCQl9 Cj4gKwkJCWJyZWFrOwo+ICsJCWNhc2UgJ3MnOgo+ICsJCQlpZiAoIW9wdGFyZykKPiArCQkJCXVz YWdlKGFyZ3ZbMF0pOwo+ICsKPiArCQkJaWYgKHdyaXRlID09IHRydWUpIHsKPiArCQkJCWZwcmlu dGYoc3RkZXJyLCAiT25seSBvbmUgd3JpdGUgbWF5IGJlIHNwZWNpZmllZCBhdCBhIHRpbWVcbiIp Owo+ICsJCQkJZXhpdChFWElUX0ZBSUxVUkUpOwo+ICsJCQl9Cj4gKwo+ICsJCQl3cml0ZSA9IHRy dWU7Cj4gKwkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQlhY3RfdXBvbltNQVhdID0gdHJ1 ZTsKPiArCQkJc3NjYW5mKG9wdGFyZywgIiVkIiwgJm5ld19mcmVxW01BWF0pOwo+ICsJCQluZXdf ZnJlcVtNSU5dID0gbmV3X2ZyZXFbTUFYXTsKPiArCQkJYnJlYWs7Cj4gKwkJY2FzZSAnYyc6Cj4g KwkJCWlmICghb3B0YXJnKQo+ICsJCQkJdXNhZ2UoYXJndlswXSk7Cj4gKwo+ICsJCQlpZiAod3Jp dGUgPT0gdHJ1ZSkgewo+ICsJCQkJZnByaW50ZihzdGRlcnIsICJPbmx5IG9uZSB3cml0ZSBtYXkg YmUgc3BlY2lmaWVkIGF0IGEgdGltZVxuIik7Cj4gKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7Cj4g KwkJCX0KPiArCj4gKwkJCXdyaXRlID0gdHJ1ZTsKPiArCj4gKwkJCWlmICghc3RybmNtcCgibWlu PSIsIG9wdGFyZywgNCkpIHsKPiArCQkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQkJc3Nj YW5mKG9wdGFyZys0LCAiJWQiLCAmbmV3X2ZyZXFbTUlOXSk7Cj4gKwkJCX0gZWxzZSBpZiAoIXN0 cm5jbXAoIm1heD0iLCBvcHRhcmcsIDQpKSB7Cj4gKwkJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsK PiArCQkJCXNzY2FuZihvcHRhcmcrNCwgIiVkIiwgJm5ld19mcmVxW01BWF0pOwo+ICsJCQl9IGVs c2Ugewo+ICsJCQkJZnByaW50ZihzdGRlcnIsICJTZWxlY3RlZCB1bm1vZGlmaWFibGUgZnJlcXVl bmN5XG4iKTsKPiArCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKPiArCQkJfQo+ICsJCQlicmVhazsK PiArCQljYXNlICdlJzoKPiArCQkJaWYgKElTX1ZBTExFWVZJRVcoZGV2aWQpIHx8IElTX0NIRVJS WVZJRVcoZGV2aWQpKSB7Cj4gKwkJCQkvKiB0aGUgTFAgcGFydHMgaGF2ZSBzcGVjaWFsIGVmZmlj aWVudCBmcmVxdWVuY2llcyAqLwo+ICsJCQkJZnByaW50ZihzdGRlcnIsICJGSVhNRTogV2Fybmlu ZyBlZmZpY2llbnQgZnJlcXVlbmN5IGluZm9ybWF0aW9uIGlzIGluY29ycmVjdC5cbiIpOwo+ICsJ CQkJZXhpdChFWElUX0ZBSUxVUkUpOwo+ICsJCQl9Cj4gKwkJCXRtcCA9IGdldF9mcmVxdWVuY3ko JmluZm9bRUZGXSk7Cj4gKwkJCW5ld19mcmVxW01JTl0gPSB0bXA7Cj4gKwkJCW5ld19mcmVxW01B WF0gPSB0bXA7Cj4gKwkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJCQlhY3RfdXBvbltNQVhd ID0gdHJ1ZTsKPiArCQkJd3JpdGUgPSB0cnVlOwo+ICsJCQlicmVhazsKPiArCQljYXNlICdpJzog LyogbUluICovCj4gKwkJCXRtcCA9IGdldF9mcmVxdWVuY3koJmluZm9bUlBuXSk7Cj4gKwkJCW5l d19mcmVxW01JTl0gPSB0bXA7Cj4gKwkJCW5ld19mcmVxW01BWF0gPSB0bXA7Cj4gKwkJCWFjdF91 cG9uW01JTl0gPSB0cnVlOwo+ICsJCQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKPiArCQkJd3JpdGUg PSB0cnVlOwo+ICsJCQlicmVhazsKPiArCQljYXNlICdtJzogLyogbWF4ICovCj4gKwkJCXRtcCA9 IGdldF9mcmVxdWVuY3koJmluZm9bUlAwXSk7Cj4gKwkJCW5ld19mcmVxW01JTl0gPSB0bXA7Cj4g KwkJCW5ld19mcmVxW01BWF0gPSB0bXA7Cj4gKwkJCWFjdF91cG9uW01JTl0gPSB0cnVlOwo+ICsJ CQlhY3RfdXBvbltNQVhdID0gdHJ1ZTsKPiArCQkJd3JpdGUgPSB0cnVlOwo+ICsJCQlicmVhazsK PiArCQljYXNlICdoJzoKPiArCQlkZWZhdWx0Ogo+ICsJCQl1c2FnZShhcmd2WzBdKTsKPiArCQl9 Cj4gKwl9Cj4gKwo+ICtkb25lOgo+ICsJcmV0dXJuIHdyaXRlOwo+ICt9Cj4gKwo+ICtpbnQgbWFp bihpbnQgYXJnYywgY2hhciAqYXJndltdKQo+ICt7Cj4gKwo+ICsJYm9vbCB3cml0ZSwgZmFpbCwg dGFyZ2V0c1tNQVgrMV0gPSB7ZmFsc2V9Owo+ICsJaW50IGksIHRyeSA9IDEsIHNldF9mcmVxW01B WCsxXSA9IHswfTsKPiArCj4gKwlkZXZpZCA9IGludGVsX2dldF9kcm1fZGV2aWQoZHJtX29wZW5f YW55KCkpOwo+ICsJZGV2aWNlID0gZHJtX2dldF9jYXJkKCk7Cj4gKwo+ICsJd3JpdGUgPSBwYXJz ZShhcmdjLCBhcmd2LCB0YXJnZXRzLCBzZXRfZnJlcSk7Cj4gKwlmYWlsID0gd3JpdGU7Cj4gKwo+ ICsJLyogSWYgd2UndmUgcHJldmlvdXNseSBsb2NrZWQgdGhlIGZyZXF1ZW5jeSwgd2UgbmVlZCB0 byBtYWtlIHN1cmUgdG8gc2V0IHRoaW5ncwo+ICsJICogaW4gdGhlIGNvcnJlY3Qgb3JkZXIsIG9y IGVsc2UgdGhlIG9wZXJhdGlvbiB3aWxsIGZhaWwgKGllLiBtaW4gPSBtYXggPSAyMDAsCj4gKwkg KiBhbmQgd2Ugc2V0IG1pbiB0byAzMDAsIHdlIGZhaWwgYmVjYXVzZSBpdCB3b3VsZCB0cnkgdG8g c2V0IG1pbiA+Cj4gKwkgKiBtYXgpLiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgYmUgZ29pbmcg ZWl0aGVyIGZvcndhcmQgb3IgcmV2ZXJzZQo+ICsJICogdGhyb3VnaCB0aGUgbG9vcC4gTUlOIGlz IGFsd2F5cyBiZWZvcmUgTUFYLgo+ICsJICoKPiArCSAqIFhYWDogU2luY2Ugb25seSBtaW4gYW5k IG1heCBhcmUgYXQgcGxheSwgdGhlIHN1cGVyIGxhenkgd2F5IGlzIHRvIGRvIHRoaXMKPiArCSAq IDMgdGltZXMgYW5kIGlmIHdlIHN0aWxsIGZhaWwgYWZ0ZXIgMywgaXQncyBmb3IgcmVhbC4KPiAr CSAqLwo+ICthZ2FpbjoKPiArCWlmICh0cnkgPiAyKSB7Cj4gKwkJZnByaW50ZihzdGRlcnIsICJE aWQgbm90IGFjaGlldmUgZGVzaXJlZCBmcmVxLlxuIik7Cj4gKwkJZXhpdChFWElUX0ZBSUxVUkUp Owo+ICsJfQo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUodGFyZ2V0cyk7IGkrKykgewo+ ICsJCWlmICh0YXJnZXRzW2ldID09IGZhbHNlKQo+ICsJCQljb250aW51ZTsKPiArCj4gKwkJaWYg KHdyaXRlKSB7Cj4gKwkJCXNldF9mcmVxdWVuY3koJmluZm9baV0sIHNldF9mcmVxW2ldKTsKPiAr CQkJaWYgKGdldF9mcmVxdWVuY3koJmluZm9baV0pICE9IHNldF9mcmVxW2ldKQo+ICsJCQkJZmFp bCA9IHRydWU7Cj4gKwkJCWVsc2UKPiArCQkJCWZhaWwgPSBmYWxzZTsKPiArCQl9IGVsc2Ugewo+ ICsJCQlwcmludGYoIiVzOiAlZCBNSHpcbiIsIGluZm9baV0ubmFtZSwgZ2V0X2ZyZXF1ZW5jeSgm aW5mb1tpXSkpOwo+ICsJCX0KPiArCX0KPiArCj4gKwlpZiAoZmFpbCkgewo+ICsJCXRyeSsrOwo+ ICsJCWdvdG8gYWdhaW47Cj4gKwl9Cj4gKwo+ICsJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUo dGFyZ2V0cyk7IGkrKykgewo+ICsJCWlmIChpbmZvW2ldLmZpbHApIHsKPiArCQkJZmNsb3NlKGlu Zm9baV0uZmlscCk7Cj4gKwkJCWZyZWUoaW5mb1tpXS5wYXRoKTsKPiArCQl9Cj4gKwl9Cj4gKwo+ ICsJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKPiArfQo+IC0tIAo+IDIuMi4xCj4gCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxp c3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwOi8vbGlzdHMuZnJlZWRlc2t0 b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==