From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ug-out-1314.google.com (ug-out-1314.google.com [66.249.92.168]) by ozlabs.org (Postfix) with ESMTP id 8D7AF67A3E for ; Thu, 8 Jun 2006 15:16:12 +1000 (EST) Received: by ug-out-1314.google.com with SMTP id m3so576459uge for ; Wed, 07 Jun 2006 22:16:09 -0700 (PDT) Message-ID: Date: Thu, 8 Jun 2006 10:46:09 +0530 From: "Shantanu Nalage" To: "Antonio Di Bacco" , linuxppc-embedded@ozlabs.org Subject: Re: Making Two ethernet interfaces up in Linux In-Reply-To: <200606032255.05997.antonio.dibacco@aruba.it> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_12803_12685075.1149743769587" References: <200606032255.05997.antonio.dibacco@aruba.it> List-Id: Linux on Embedded PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , ------=_Part_12803_12685075.1149743769587 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline Thanks for the reply. The driver which we are using for the ethernet is provided by Xilinx. In the Linux kernel source, it is located in net/xilinx_enet directory. We are attaching the adapter file for the driver provided by Xilinx for the ethernet. When we gave a first try, it showed two ethernet interfaces eth0 and eth1 as an output of ifconfig command but only eth0 works, when eth1 is disabled. When both interfaces are up, neither interface works. While even when eth0 is disabled, eth1 interface doesn't work. With regards, Shantanu. On 6/4/06, Antonio Di Bacco wrote: > > We are trying to port Linux on Xilinx Board XUPV2Pro which is > > similar in most aspects to the Xilinx ML300 board. Linux is up and > > running for the original board i.e. having only one ethrnet interface. > > Now since we wanted to have the board working as router, we designed a > > daughter board with two ethernet phy interfaces. The MACs required for > > that are instantiated in Xilinx .... > > You have already the driver for the first MAC, then you should start from that > modifying the init procedure for example and all the others. Your driver > should initialize both the MACs and also create two devices calling > init_etherdev tow times. If you post your driver I can suggest what to > change. It is not so difficult. > > Bye, > Antonio. > > ------=_Part_12803_12685075.1149743769587 Content-Type: text/plain; name=adapter.c; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_eo6nvxya Content-Disposition: attachment; filename="adapter.c" LyoKICogYWRhcHRlci5jCiAqCiAqIFhpbGlueCBFdGhlcm5ldCBBZGFwdGVyIGNvbXBvbmVudCB0 byBpbnRlcmZhY2UgWEVtYWMgY29tcG9uZW50IHRvIExpbnV4CiAqCiAqIEF1dGhvcjogTW9udGFW aXN0YSBTb2Z0d2FyZSwgSW5jLgogKiAgICAgICAgIHNvdXJjZUBtdmlzdGEuY29tCiAqCiAqIDIw MDIgKGMpIE1vbnRhVmlzdGEsIFNvZnR3YXJlLCBJbmMuICBUaGlzIGZpbGUgaXMgbGljZW5zZWQg dW5kZXIgdGhlIHRlcm1zCiAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJz aW9uIDIuMS4gIFRoaXMgcHJvZ3JhbSBpcyBsaWNlbnNlZAogKiAiYXMgaXMiIHdpdGhvdXQgYW55 IHdhcnJhbnR5IG9mIGFueSBraW5kLCB3aGV0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICovCgov KgogKiBUaGlzIGRyaXZlciBpcyBhIGJpdCB1bnVzdWFsIGluIHRoYXQgaXQgaXMgY29tcG9zZWQg b2YgdHdvIGxvZ2ljYWwKICogcGFydHMgd2hlcmUgb25lIHBhcnQgaXMgdGhlIE9TIGluZGVwZW5k ZW50IGNvZGUgYW5kIHRoZSBvdGhlciBwYXJ0IGlzCiAqIHRoZSBPUyBkZXBlbmRlbnQgY29kZS4g IFhpbGlueCBwcm92aWRlcyB0aGVpciBkcml2ZXJzIHNwbGl0IGluIHRoaXMKICogZmFzaGlvbi4g IFRoaXMgZmlsZSByZXByZXNlbnRzIHRoZSBMaW51eCBPUyBkZXBlbmRlbnQgcGFydCBrbm93biBh cwogKiB0aGUgTGludXggYWRhcHRlci4gIFRoZSBvdGhlciBmaWxlcyBpbiB0aGlzIGRpcmVjdG9y eSBhcmUgdGhlIE9TCiAqIGluZGVwZW5kZW50IGZpbGVzIGFzIHByb3ZpZGVkIGJ5IFhpbGlueCB3 aXRoIG5vIGNoYW5nZXMgbWFkZSB0byB0aGVtLgogKiBUaGUgbmFtZXMgZXhwb3J0ZWQgYnkgdGhv c2UgZmlsZXMgYmVnaW4gd2l0aCBYRW1hY18uICBBbGwgZnVuY3Rpb25zCiAqIGluIHRoaXMgZmls ZSB0aGF0IGFyZSBjYWxsZWQgYnkgTGludXggaGF2ZSBuYW1lcyB0aGF0IGJlZ2luIHdpdGgKICog eGVuZXRfLiAgVGhlIGZ1bmN0aW9ucyBpbiB0aGlzIGZpbGUgdGhhdCBoYXZlIEhhbmRsZXIgaW4g dGhlaXIgbmFtZQogKiBhcmUgcmVnaXN0ZXJlZCBhcyBjYWxsYmFja3Mgd2l0aCB0aGUgdW5kZXJs eWluZyBYaWxpbnggT1MgaW5kZXBlbmRlbnQKICogbGF5ZXIuICBBbnkgb3RoZXIgZnVuY3Rpb25z IGFyZSBzdGF0aWMgaGVscGVyIGZ1bmN0aW9ucy4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxl Lmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5j bHVkZSA8bGludXgvbmV0ZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgoj aW5jbHVkZSA8bGludXgvc2tidWZmLmg+CiNpbmNsdWRlIDxsaW51eC9taWkuaD4KI2luY2x1ZGUg PGxpbnV4L3BjaS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vaXJxLmg+CiNp bmNsdWRlIDxhc20vYXRvbWljLmg+CiNpbmNsdWRlIDxsaW51eC9ldGh0b29sLmg+CgojaW5jbHVk ZSA8eGJhc2ljX3R5cGVzLmg+CiNpbmNsdWRlICJ4ZW1hYy5oIgojaW5jbHVkZSAieGVtYWNfaS5o IgojaW5jbHVkZSAieGlwaWZfdjFfMjNfYi5oIgoKI3VuZGVmIFhFTV9ERlRfU0VORF9ERVNDCiNk ZWZpbmUgWEVNX0RGVF9TRU5EX0RFU0MgICAgNjQKI3VuZGVmIFhFTV9ERlRfUkVDVl9ERVNDCiNk ZWZpbmUgWEVNX0RGVF9SRUNWX0RFU0MgICAyNTYKCiNkZWZpbmUgRFJJVkVSX05BTUUgIlhpbGlu eCBFdGggTUFDIGRyaXZlciIKI2RlZmluZSBEUklWRVJfVkVSU0lPTiAiMS4wIgoKTU9EVUxFX0FV VEhPUigiTW9udGFWaXN0YSBTb2Z0d2FyZSwgSW5jLiA8c291cmNlQG12aXN0YS5jb20+Iik7Ck1P RFVMRV9ERVNDUklQVElPTihEUklWRVJfTkFNRSk7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCiNk ZWZpbmUgVFhfVElNRU9VVCAgICg2MCpIWikJLyogVHJhbnNtaXNzaW9uIHRpbWVvdXQgaXMgNjAg c2Vjb25kcy4gKi8KCi8qIE9uIHRoZSBPUEIsIHRoZSAxMC8xMDAgRU1BQyByZXF1aXJlcyBkYXRh IHRvIGJlIGFsaWduZWQgdG8gNCBieXRlcy4KICogT24gdGhlIFBMQiwgdGhlIDEwLzEwMCBFTUFD IHJlcXVpcmVzIGRhdGEgdG8gYmUgYWxpZ25lZCB0byA4IGJ5dGVzLgogKiBGb3Igc2ltcGxpY2l0 eSwgd2UgYWx3YXlzIGFsaWduIHRvIDggYnl0ZXMuCiAqLwojZGVmaW5lIEFMSUdOTUVOVCAgICAg ICAgICAgMzIKCi8qIEJVRkZFUl9BTElHTihhZHIpIGNhbGN1bGF0ZXMgdGhlIG51bWJlciBvZiBi eXRlcyB0byB0aGUgbmV4dCBhbGlnbm1lbnQuICovCiNkZWZpbmUgQlVGRkVSX0FMSUdOKGFkcikg KChBTElHTk1FTlQgLSAoKHUzMikgYWRyKSkgJSBBTElHTk1FTlQpCgovKiBwaHlzaWNhbCB0byB2 aXJ0dWFsIHBvaW50ZXIgY29udmVyc2lvbiAqLwojZGVmaW5lIFBfVE9fVihJbnN0YW5jZVB0ciwg cCkgXAoJKChwKSA/IFwKCSAoKEluc3RhbmNlUHRyKS0+VmlydFB0ciArICgodTMyKShwKSAtICh1 MzIpKEluc3RhbmNlUHRyKS0+UGh5UHRyKSkgOiBcCgkgMCkKCmludCBiaF9lbnRyeSA9IDA7Cgov KgogKiBPdXIgcHJpdmF0ZSBwZXIgZGV2aWNlIGRhdGEuICBXaGVuIGEgbmV0X2RldmljZSBpcyBh bGxvY2F0ZWQgd2Ugd2lsbAogKiBhc2sgZm9yIGVub3VnaCBleHRyYSBzcGFjZSBmb3IgdGhpcy4K ICovCnN0cnVjdCBuZXRfbG9jYWwgewoJc3RydWN0IGxpc3RfaGVhZCByY3Y7CglYQnVmRGVzY3Jp cHRvciAqIHJjdkJkUHRyOwoJaW50IHJjdkJkczsKCXN0cnVjdCBsaXN0X2hlYWQgeG1pdDsKCVhC dWZEZXNjcmlwdG9yICogeG1pdEJkUHRyOwoJaW50IHhtaXRCZHM7CgoJc3RydWN0IG5ldF9kZXZp Y2Vfc3RhdHMgc3RhdHM7CS8qIFN0YXRpc3RpY3MgZm9yIHRoaXMgZGV2aWNlICovCglzdHJ1Y3Qg bmV0X2RldmljZSAqbmV4dF9kZXY7CS8qIFRoZSBuZXh0IGRldmljZSBpbiBkZXZfbGlzdCAqLwoJ c3RydWN0IG5ldF9kZXZpY2UgKmRldjsJCS8qIHRoaXMgZGV2aWNlICovCglzdHJ1Y3QgdGltZXJf bGlzdCBwaHlfdGltZXI7CS8qIFBIWSBtb25pdG9yaW5nIHRpbWVyICovCgl1MzIgaW5kZXg7CQkv KiBXaGljaCBpbnRlcmZhY2UgaXMgdGhpcyAqLwoJWEludGVycnVwdEhhbmRsZXIgSXNyOwkvKiBQ b2ludGVyIHRvIHRoZSBYRW1hYyBJU1Igcm91dGluZSAqLwoJdTggbWlpX2FkZHI7CQkvKiBUaGUg TUlJIGFkZHJlc3Mgb2YgdGhlIFBIWSAqLwoJLyoKCSAqIFRoZSB1bmRlcmx5aW5nIE9TIGluZGVw ZW5kZW50IGNvZGUgbmVlZHMgc3BhY2UgYXMgd2VsbC4gIEEKCSAqIHBvaW50ZXIgdG8gdGhlIGZv bGxvd2luZyBYRW1hYyBzdHJ1Y3R1cmUgd2lsbCBiZSBwYXNzZWQgdG8KCSAqIGFueSBYRW1hY18g ZnVuY3Rpb24gdGhhdCByZXF1aXJlcyBpdC4gIEhvd2V2ZXIsIHdlIHRyZWF0IHRoZQoJICogZGF0 YSBhcyBhbiBvcGFxdWUgb2JqZWN0IGluIHRoaXMgZmlsZSAobWVhbmluZyB0aGF0IHdlIG5ldmVy CgkgKiByZWZlcmVuY2UgYW55IG9mIHRoZSBmaWVsZHMgaW5zaWRlIG9mIHRoZSBzdHJ1Y3R1cmUp LgoJICovCglYRW1hYyBFbWFjOwoKCXZvaWQgKmRlc2Nfc3BhY2U7CglkbWFfYWRkcl90IGRlc2Nf c3BhY2VfaGFuZGxlOwoJaW50IGRlc2Nfc3BhY2Vfc2l6ZTsKICAgIAogICAgICAgIHU4ICpkZHJW aXJ0UHRyOwogICAgICAgIHUzMiBkZHJPZmZzZXQ7CiAgICAgICAgdTMyIGRkclNpemU7CgoJc3Ry dWN0IHNrX2J1ZmYqIGRlZmVycmVkX3NrYjsKCiAgICAgICAgYXRvbWljX3QgYXZhaWxTZW5kQmRz Owp9OwoKLyogTGlzdCBvZiBkZXZpY2VzIHdlJ3JlIGhhbmRsaW5nIGFuZCBhIGxvY2sgdG8gZ2l2 ZSB1cyBhdG9taWMgYWNjZXNzLiAqLwpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2UgKmRldl9saXN0 ID0gTlVMTDsKc3RhdGljIHNwaW5sb2NrX3QgZGV2X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7 CgovKiBmb3IgZXhjbHVzaW9uIG9mIGFsbCBwcm9ncmFtIGZsb3dzIChwcm9jZXNzZXMsIElTUnMg YW5kIEJIcykgcG9zc2libGUgdG8gc2hhcmUgZGF0YSB3aXRoIGN1cnJlbnQgb25lICovCnN0YXRp YyBzcGlubG9ja190IHJlc2V0X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CgovKiBIZWxwZXIg ZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gWEVtYWMgZXJyb3Igd2FycmFudHMgYSBy ZXNldC4gKi8KZXh0ZXJuIGlubGluZSBpbnQKc3RhdHVzX3JlcXVpcmVzX3Jlc2V0KFhTdGF0dXMg cykKewoJcmV0dXJuIChzID09IFhTVF9ETUFfRVJST1IgfHwgcyA9PSBYU1RfRklGT19FUlJPUiB8 fAoJCXMgPT0gWFNUX1JFU0VUX0VSUk9SIHx8IHMgPT0gWFNUX0RNQV9TR19OT19MSVNUIHx8CgkJ cyA9PSBYU1RfRE1BX1NHX0xJU1RfRU1QVFkpOwp9CgovKiBCSCBzdGF0aWNzICovCkxJU1RfSEVB RChyZWNlaXZlZFF1ZXVlKTsKc3RhdGljIHNwaW5sb2NrX3QgcmN2U3BpbiA9IFNQSU5fTE9DS19V TkxPQ0tFRDsKTElTVF9IRUFEKHNlbnRRdWV1ZSk7CnN0YXRpYyBzcGlubG9ja190IHhtaXRTcGlu ID0gU1BJTl9MT0NLX1VOTE9DS0VEOwoKLyogU0FBVE9ETzogVGhpcyBmdW5jdGlvbiB3aWxsIGJl IG1vdmVkIGludG8gdGhlIFhpbGlueCBjb2RlLiAqLwovKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8q KgoqCiogTG9va3VwIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbiBiYXNlZCBvbiB0aGUgZW1hYyBp bnN0YW5jZS4gIFRoZSB0YWJsZQoqIEVtYWNDb25maWdUYWJsZSBjb250YWlucyB0aGUgY29uZmln dXJhdGlvbiBpbmZvIGZvciBlYWNoIGRldmljZSBpbiB0aGUgc3lzdGVtLgoqCiogQHBhcmFtIElu c3RhbmNlIGlzIHRoZSBpbmRleCBvZiB0aGUgZW1hYyBiZWluZyBsb29rZWQgdXAuCioKKiBAcmV0 dXJuCioKKiBBIHBvaW50ZXIgdG8gdGhlIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cnkgY29ycmVz cG9uZGluZyB0byB0aGUgZ2l2ZW4KKiBkZXZpY2UgSUQsIG9yIE5VTEwgaWYgbm8gbWF0Y2ggaXMg Zm91bmQuCioKKiBAbm90ZQoqCiogTm9uZS4KKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClhFbWFj X0NvbmZpZyAqClhFbWFjX0dldENvbmZpZyhpbnQgSW5zdGFuY2UpCnsKCWlmIChJbnN0YW5jZSA8 IDAgfHwgSW5zdGFuY2UgPj0gWFBBUl9YRU1BQ19OVU1fSU5TVEFOQ0VTKSB7CgkJcmV0dXJuIE5V TEw7Cgl9CgoJcmV0dXJuICZYRW1hY19Db25maWdUYWJsZVtJbnN0YW5jZV07Cn0KCi8qCiAqIFRo ZSBmb2xsb3dpbmcgYXJlIG5vdGVzIHJlZ2FyZGluZyB0aGUgY3JpdGljYWwgc2VjdGlvbnMgaW4g dGhpcwogKiBkcml2ZXIgYW5kIGhvdyB0aGV5IGFyZSBwcm90ZWN0ZWQuCiAqCiAqIGRldl9saXN0 CiAqIFRoZXJlIGlzIGEgc3BpbmxvY2sgcHJvdGVjdGluZyB0aGUgZGV2aWNlIGxpc3QuICBJdCBp c24ndCByZWFsbHkKICogbmVjZXNzYXJ5IHlldCBiZWNhdXNlIHRoZSBsaXN0IGlzIG9ubHkgbWFu aXB1bGF0ZWQgYXQgaW5pdCBhbmQKICogY2xlYW51cCwgYnV0IGl0J3MgdGhlcmUgYmVjYXVzZSBp dCBpcyBiYXNpY2FsbHkgZnJlZSBhbmQgaWYgd2Ugc3RhcnQKICogZG9pbmcgaG90IGFkZCBhbmQg cmVtb3ZhbCBvZiBldGhlcm5ldCBkZXZpY2VzIHdoZW4gdGhlIEZQR0EgaXMKICogcmVwcm9ncmFt bWVkIHdoaWxlIHRoZSBzeXN0ZW0gaXMgdXAsIHdlJ2xsIG5lZWQgdG8gcHJvdGVjdCB0aGUgbGlz dC4KICoKICogWEVtYWNfU3RhcnQsIFhFbWFjX1N0b3AgYW5kIFhFbWFjX1NldE9wdGlvbnMgYXJl IG5vdCB0aHJlYWQgc2FmZS4KICogVGhlc2UgZnVuY3Rpb25zIGFyZSBjYWxsZWQgZnJvbSB4ZW5l dF9vcGVuKCksIHhlbmV0X2Nsb3NlKCksIHJlc2V0KCksCiAqIGFuZCB4ZW5ldF9zZXRfbXVsdGlj YXN0X2xpc3QoKS4gIHhlbmV0X29wZW4oKSBhbmQgeGVuZXRfY2xvc2UoKQogKiBzaG91bGQgYmUg c2FmZSBiZWNhdXNlIHdoZW4gdGhleSBkbyBzdGFydCBhbmQgc3RvcCwgdGhleSBkb24ndCBoYXZl CiAqIGludGVycnVwdHMgb3IgdGltZXJzIGVuYWJsZWQuICBUaGUgb3RoZXIgc2lkZSBpcyB0aGF0 IHRoZXkgd29uJ3QgYmUKICogY2FsbGVkIHdoaWxlIGEgdGltZXIgb3IgaW50ZXJydXB0IGlzIGJl aW5nIGhhbmRsZWQuCiAqCiAqIFhFbWFjX1BoeVJlYWQgYW5kIFhFbWFjX1BoeVdyaXRlIGFyZSBu b3QgdGhyZWFkIHNhZmUuCiAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGZyb20gZ2V0X3Bo eV9zdGF0dXMoKSwgeGVuZXRfaW9jdGwoKSBhbmQKICogcHJvYmUoKS4gIHByb2JlKCkgaXMgb25s eSBjYWxsZWQgZnJvbSB4ZW5ldF9pbml0KCkgc28gaXQgaXMgbm90IGFuCiAqIGlzc3VlIChub3Ro aW5nIGlzIHJlYWxseSB1cCBhbmQgcnVubmluZyB5ZXQpLiAgZ2V0X3BoeV9zdGF0dXMoKSBpcwog KiBjYWxsZWQgZnJvbSBib3RoIHBvbGxfbWlpKCkgKGEgdGltZXIgYm90dG9tIGhhbGYpIGFuZCB4 ZW5ldF9vcGVuKCkuCiAqIFRoZXNlIHNob3VsZG4ndCBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVy IGJlY2F1c2UgeGVuZXRfb3BlbigpIGlzCiAqIHdoYXQgc3RhcnRzIHRoZSBwb2xsX21paSgpIHRp bWVyLiAgeGVuZXRfb3BlbigpIGFuZCB4ZW5ldF9pb2N0bCgpCiAqIHNob3VsZCBiZSBzYWZlIGFz IHdlbGwgYmVjYXVzZSB0aGV5IHdpbGwgYmUgc2VxdWVudGlhbC4gIFRoYXQgbGVhdmVzCiAqIHRo ZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHBvbGxfbWlpKCkgYW5kIHhlbmV0X2lvY3RsKCkuICBXaGls ZSB0aGUKICogdGltZXIgYm90dG9tIGhhbGYgaXMgZXhlY3V0aW5nLCBhIG5ldyBpb2N0bCB3b24n dCBjb21lIGluIHNvIHRoYXQgaXMKICogdGFrZW4gY2FyZSBvZi4gIFRoYXQgbGVhdmVzIHRoZSBv bmUgY2FzZSBvZiB0aGUgcG9sbF9taWkgdGltZXIKICogcG9wcGluZyB3aGlsZSBoYW5kbGluZyBh biBpb2N0bC4gIFRvIHRha2UgY2FyZSBvZiB0aGF0IGNhc2UsIHRoZQogKiB0aW1lciBpcyBkZWxl dGVkIHdoZW4gdGhlIGlvY3RsIGNvbWVzIGluIGFuZCB0aGVuIGFkZGVkIGJhY2sgaW4gYWZ0ZXIK ICogdGhlIGlvY3RsIGlzIGZpbmlzaGVkLgogKi8KCnR5cGVkZWYgZW51bSBEVVBMRVggeyBVTktO T1dOX0RVUExFWCwgSEFMRl9EVVBMRVgsIEZVTExfRFVQTEVYIH0gRFVQTEVYOwpzdGF0aWMgdm9p ZApyZXNldChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2LCBEVVBMRVggZHVwbGV4KQp7CglzdHJ1Y3Qg bmV0X2xvY2FsICpscCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKCXUzMiBPcHRp b25zOwoJdTggSWZnUGFydDE7Cgl1OCBJZmdQYXJ0MjsKCXU4IFNlbmRUaHJlc2hvbGQ7Cgl1MzIg U2VuZFdhaXRCb3VuZDsKCXU4IFJlY3ZUaHJlc2hvbGQ7Cgl1MzIgUmVjdldhaXRCb3VuZDsKCWlu dCBkbWFfd29ya3M7CgoJLyogU2hvdWxkbid0IHJlYWxseSBiZSBuZWNlc3NhcnksIGJ1dCBzaG91 bGRuJ3QgaHVydC4gKi8KCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCgkvKgoJICogWEVtYWNfUmVz ZXQgcHV0cyB0aGUgZGV2aWNlIGJhY2sgdG8gdGhlIGRlZmF1bHQgc3RhdGUuICBXZSBuZWVkCgkg KiB0byBzYXZlIGFsbCB0aGUgc2V0dGluZ3Mgd2UgZG9uJ3QgYWxyZWFkeSBrbm93LCByZXNldCwg cmVzdG9yZQoJICogdGhlIHNldHRpbmdzLCBhbmQgdGhlbiByZXN0YXJ0IHRoZSBlbWFjLgoJICov CglYRW1hY19HZXRJbnRlcmZyYW1lR2FwKCZscC0+RW1hYywgJklmZ1BhcnQxLCAmSWZnUGFydDIp OwoJT3B0aW9ucyA9IFhFbWFjX0dldE9wdGlvbnMoJmxwLT5FbWFjKTsKCXN3aXRjaCAoZHVwbGV4 KSB7CgljYXNlIEhBTEZfRFVQTEVYOgoJCU9wdGlvbnMgJj0gflhFTV9GRFVQTEVYX09QVElPTjsK CQlicmVhazsKCWNhc2UgRlVMTF9EVVBMRVg6CgkJT3B0aW9ucyB8PSBYRU1fRkRVUExFWF9PUFRJ T047CgkJYnJlYWs7CgljYXNlIFVOS05PV05fRFVQTEVYOgoJCWJyZWFrOwoJfQoKCWlmIChYRW1h Y19tSXNTZ0RtYSgmbHAtPkVtYWMpKSB7CgkJLyoKCQkgKiBUaGUgZm9sbG93aW5nIGZvdXIgZnVu Y3Rpb25zIHdpbGwgcmV0dXJuIGFuIGVycm9yIGlmIHdlIGFyZQoJCSAqIG5vdCBkb2luZyBzY2F0 dGVyLWdhdGhlciBETUEuICBXZSBqdXN0IGNoZWNrZWQgdGhhdCBzbyB3ZQoJCSAqIGNhbiBzYWZl bHkgaWdub3JlIHRoZSByZXR1cm4gdmFsdWVzLiAgV2UgY2FzdCB0aGVtIHRvIHZvaWQKCQkgKiB0 byBtYWtlIHRoYXQgZXhwbGljaXQuCgkJICovCgkJZG1hX3dvcmtzID0gMTsKCQkodm9pZCkgWEVt YWNfR2V0UGt0VGhyZXNob2xkKCZscC0+RW1hYywgWEVNX1NFTkQsCgkJCQkJICAgICAmU2VuZFRo cmVzaG9sZCk7CgkJKHZvaWQpIFhFbWFjX0dldFBrdFdhaXRCb3VuZCgmbHAtPkVtYWMsIFhFTV9T RU5ELAoJCQkJCSAgICAgJlNlbmRXYWl0Qm91bmQpOwoJCSh2b2lkKSBYRW1hY19HZXRQa3RUaHJl c2hvbGQoJmxwLT5FbWFjLCBYRU1fUkVDViwKCQkJCQkgICAgICZSZWN2VGhyZXNob2xkKTsKCQko dm9pZCkgWEVtYWNfR2V0UGt0V2FpdEJvdW5kKCZscC0+RW1hYywgWEVNX1JFQ1YsCgkJCQkJICAg ICAmUmVjdldhaXRCb3VuZCk7Cgl9IGVsc2UKCQlkbWFfd29ya3MgPSAwOwoKCVhFbWFjX1Jlc2V0 KCZscC0+RW1hYyk7CgoJLyoKCSAqIFRoZSBmb2xsb3dpbmcgdGhyZWUgZnVuY3Rpb25zIHdpbGwg cmV0dXJuIGFuIGVycm9yIGlmIHRoZQoJICogRU1BQyBpcyBhbHJlYWR5IHN0YXJ0ZWQuICBXZSBq dXN0IHN0b3BwZWQgaXQgYnkgY2FsbGluZwoJICogWEVtYWNfUmVzZXQoKSBzbyB3ZSBjYW4gc2Fm ZWx5IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlcy4KCSAqIFdlIGNhc3QgdGhlbSB0byB2b2lkIHRv IG1ha2UgdGhhdCBleHBsaWNpdC4KCSAqLwoJKHZvaWQpIFhFbWFjX1NldE1hY0FkZHJlc3MoJmxw LT5FbWFjLCBkZXYtPmRldl9hZGRyKTsKCSh2b2lkKSBYRW1hY19TZXRJbnRlcmZyYW1lR2FwKCZs cC0+RW1hYywgSWZnUGFydDEsIElmZ1BhcnQyKTsKCSh2b2lkKSBYRW1hY19TZXRPcHRpb25zKCZs cC0+RW1hYywgT3B0aW9ucyk7CglpZiAoWEVtYWNfbUlzU2dEbWEoJmxwLT5FbWFjKSkgewoJCS8q CgkJICogVGhlIGZvbGxvd2luZyBmb3VyIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhbiBlcnJvciBp ZgoJCSAqIHdlIGFyZSBub3QgZG9pbmcgc2NhdHRlci1nYXRoZXIgRE1BIG9yIGlmIHRoZSBFTUFD IGlzCgkJICogYWxyZWFkeSBzdGFydGVkLiAgV2UganVzdCBjaGVja2VkIHRoYXQgd2UgYXJlIGlu ZGVlZAoJCSAqIGRvaW5nIHNjYXR0ZXItZ2F0aGVyIGFuZCB3ZSBqdXN0IHN0b3BwZWQgdGhlIEVN QUMgc28KCQkgKiB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgcmV0dXJuIHZhbHVlcy4gIFdlIGNh c3QgdGhlbQoJCSAqIHRvIHZvaWQgdG8gbWFrZSB0aGF0IGV4cGxpY2l0LgoJCSAqLwoJCSh2b2lk KSBYRW1hY19TZXRQa3RUaHJlc2hvbGQoJmxwLT5FbWFjLCBYRU1fU0VORCwKCQkJCQkgICAgIFNl bmRUaHJlc2hvbGQpOwoJCSh2b2lkKSBYRW1hY19TZXRQa3RXYWl0Qm91bmQoJmxwLT5FbWFjLCBY RU1fU0VORCwKCQkJCQkgICAgIFNlbmRXYWl0Qm91bmQpOwoJCSh2b2lkKSBYRW1hY19TZXRQa3RU aHJlc2hvbGQoJmxwLT5FbWFjLCBYRU1fUkVDViwKCQkJCQkgICAgIFJlY3ZUaHJlc2hvbGQpOwoJ CSh2b2lkKSBYRW1hY19TZXRQa3RXYWl0Qm91bmQoJmxwLT5FbWFjLCBYRU1fUkVDViwKCQkJCQkg ICAgIFJlY3ZXYWl0Qm91bmQpOwoJfQoKCS8qCgkgKiBYRW1hY19TdGFydCByZXR1cm5zIGFuIGVy cm9yIHdoZW46IGl0IGlzIGFscmVhZHkgc3RhcnRlZCwgdGhlIHNlbmQKCSAqIGFuZCByZWNlaXZl IGhhbmRsZXJzIGFyZSBub3Qgc2V0LCBvciBhIHNjYXR0ZXItZ2F0aGVyIERNQSBsaXN0IGlzCgkg KiBtaXNzaW5nLiAgTm9uZSBvZiB0aGVzZSBjYW4gaGFwcGVuIGF0IHRoaXMgcG9pbnQsIHNvIHdl IGNhc3QgdGhlCgkgKiByZXR1cm4gdG8gdm9pZCB0byBtYWtlIHRoYXQgZXhwbGljaXQuCgkgKi8K CglpZiAoZG1hX3dvcmtzKSB7CgkJaW50IGF2YWlsX3BsdXMgPSAwOwoJCXdoaWxlICghKFhEbWFD aGFubmVsX0lzU2dMaXN0RW1wdHkoJihscC0+RW1hYy5TZW5kQ2hhbm5lbCkpKSkgewkvKiBsaXN0 IGlzbid0IGVtcHR5LCBoYXMgdG8gYmUgY2xlYXJlZCAqLwoJCQlYU3RhdHVzIHJldDsKCQkJWEJ1 ZkRlc2NyaXB0b3IqIEJkUHRyOwoKCQkJaWYgKChyZXQgPSBYRG1hQ2hhbm5lbF9HZXREZXNjcmlw dG9yICgmKGxwLT5FbWFjLlNlbmRDaGFubmVsKSwgJkJkUHRyKSkgIT0gWFNUX1NVQ0NFU1MpIHsK CQkJCXByaW50ayAoS0VSTl9FUlIgIlNnRG1hIHJpbmcgc3RydWN0dXJlIEVSUk9SICVkXG4iLCBy ZXQpOwoJCQkJYnJlYWs7CgkJCX0KCQkJYXZhaWxfcGx1cysrOwoJCQlYQnVmRGVzY3JpcHRvcl9V bmxvY2soQmRQdHIpOwoJCQlwY2lfdW5tYXBfc2luZ2xlKE5VTEwsCgkJCQkodTMyKSBYQnVmRGVz Y3JpcHRvcl9HZXRTcmNBZGRyZXNzKEJkUHRyKSwKCQkJCSBYQnVmRGVzY3JpcHRvcl9HZXRMZW5n dGgoQmRQdHIpLCBQQ0lfRE1BX1RPREVWSUNFKTsKCQkJbHAtPnN0YXRzLnR4X2Vycm9ycysrOwoJ CX0KICAgICAgICAJYXRvbWljX2FkZChhdmFpbF9wbHVzLCZscC0+YXZhaWxTZW5kQmRzKTsKCX0g ZWxzZSB7CgkJaWYgKGxwLT5kZWZlcnJlZF9za2IpIHsKCQkJZGV2X2tmcmVlX3NrYihscC0+ZGVm ZXJyZWRfc2tiKTsKCQkJbHAtPmRlZmVycmVkX3NrYiA9IE5VTEw7CgkJCWxwLT5zdGF0cy50eF9l cnJvcnMrKzsKCQl9Cgl9CgoJZGV2LT50cmFuc19zdGFydCA9IDB4ZmZmZmZmZmYgLSBUWF9USU1F T1VUIC0gVFhfVElNRU9VVDsJLyogdG8gZXhjbHVkZSB0eCB0aW1lb3V0ICovCgkodm9pZCkgWEVt YWNfU3RhcnQoJmxwLT5FbWFjKTsKCS8qIFdlJ3JlIGFsbCByZWFkeSB0byBnby4gIFN0YXJ0IHRo ZSBxdWV1ZSBpbiBjYXNlIGl0IHdhcyBzdG9wcGVkLiAqLwoJaWYgKCFiaF9lbnRyeSkKCQluZXRp Zl93YWtlX3F1ZXVlKGRldik7Cn0KCnN0YXRpYyBpbnQKZ2V0X3BoeV9zdGF0dXMoc3RydWN0IG5l dF9kZXZpY2UgKmRldiwgRFVQTEVYICogZHVwbGV4LCBpbnQgKmxpbmt1cCkKewoJc3RydWN0IG5l dF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7Cgl1MTYgcmVnOwoJ WFN0YXR1cyB4czsKCgl4cyA9IFhFbWFjX1BoeVJlYWQoJmxwLT5FbWFjLCBscC0+bWlpX2FkZHIs IE1JSV9CTUNSLCAmcmVnKTsKCWlmICh4cyAhPSBYU1RfU1VDQ0VTUykgewoJCXByaW50ayhLRVJO X0VSUgoJCSAgICAgICAiJXM6IENvdWxkIG5vdCByZWFkIFBIWSBjb250cm9sIHJlZ2lzdGVyOyBl cnJvciAlZFxuIiwKCQkgICAgICAgZGV2LT5uYW1lLCB4cyk7CgkJcmV0dXJuIC0xOwoJfQoKCWlm ICghKHJlZyAmIEJNQ1JfQU5FTkFCTEUpKSB7CgkJLyoKCQkgKiBBdXRvLW5lZ290aWF0aW9uIGlz IGRpc2FibGVkIHNvIHRoZSBmdWxsIGR1cGxleCBiaXQgaW4KCQkgKiB0aGUgY29udHJvbCByZWdp c3RlciB0ZWxscyB1cyBpZiB0aGUgUEhZIGlzIHJ1bm5pbmcKCQkgKiBoYWxmIG9yIGZ1bGwgZHVw bGV4LgoJCSAqLwoJCSpkdXBsZXggPSAocmVnICYgQk1DUl9GVUxMRFBMWCkgPyBGVUxMX0RVUExF WCA6IEhBTEZfRFVQTEVYOwoJfSBlbHNlIHsKCQkvKgoJCSAqIEF1dG8tbmVnb3RpYXRpb24gaXMg ZW5hYmxlZC4gIEZpZ3VyZSBvdXQgd2hhdCB3YXMKCQkgKiBuZWdvdGlhdGVkIGJ5IGxvb2tpbmcg Zm9yIHRoZSBiZXN0IG1vZGUgaW4gdGhlIHVuaW9uCgkJICogb2Ygd2hhdCB3ZSBhbmQgb3VyIHBh cnRuZXIgYWR2ZXJ0aXNlLgoJCSAqLwoJCXUxNiBhZHZlcnRpc2UsIHBhcnRuZXIsIG5lZ290aWF0 ZWQ7CgoJCXhzID0gWEVtYWNfUGh5UmVhZCgmbHAtPkVtYWMsIGxwLT5taWlfYWRkciwKCQkJCSAg IE1JSV9BRFZFUlRJU0UsICZhZHZlcnRpc2UpOwoJCWlmICh4cyAhPSBYU1RfU1VDQ0VTUykgewoJ CQlwcmludGsoS0VSTl9FUlIKCQkJICAgICAgICIlczogQ291bGQgbm90IHJlYWQgUEhZIGFkdmVy dGlzZW1lbnQ7IGVycm9yICVkXG4iLAoJCQkgICAgICAgZGV2LT5uYW1lLCB4cyk7CgkJCXJldHVy biAtMTsKCQl9CgkJeHMgPSBYRW1hY19QaHlSZWFkKCZscC0+RW1hYywgbHAtPm1paV9hZGRyLCBN SUlfTFBBLCAmcGFydG5lcik7CgkJaWYgKHhzICE9IFhTVF9TVUNDRVNTKSB7CgkJCXByaW50ayhL RVJOX0VSUgoJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgcmVhZCBQSFkgTFBBOyBlcnJvciAlZFxu IiwKCQkJICAgICAgIGRldi0+bmFtZSwgeHMpOwoJCQlyZXR1cm4gLTE7CgkJfQoKCQluZWdvdGlh dGVkID0gYWR2ZXJ0aXNlICYgcGFydG5lciAmIEFEVkVSVElTRV9BTEw7CgkJaWYgKG5lZ290aWF0 ZWQgJiBBRFZFUlRJU0VfMTAwRlVMTCkKCQkJKmR1cGxleCA9IEZVTExfRFVQTEVYOwoJCWVsc2Ug aWYgKG5lZ290aWF0ZWQgJiBBRFZFUlRJU0VfMTAwSEFMRikKCQkJKmR1cGxleCA9IEhBTEZfRFVQ TEVYOwoJCWVsc2UgaWYgKG5lZ290aWF0ZWQgJiBBRFZFUlRJU0VfMTBGVUxMKQoJCQkqZHVwbGV4 ID0gRlVMTF9EVVBMRVg7CgkJZWxzZQoJCQkqZHVwbGV4ID0gSEFMRl9EVVBMRVg7Cgl9CgoJeHMg PSBYRW1hY19QaHlSZWFkKCZscC0+RW1hYywgbHAtPm1paV9hZGRyLCBNSUlfQk1TUiwgJnJlZyk7 CglpZiAoeHMgIT0gWFNUX1NVQ0NFU1MpIHsKCQlwcmludGsoS0VSTl9FUlIKCQkgICAgICAgIiVz OiBDb3VsZCBub3QgcmVhZCBQSFkgc3RhdHVzIHJlZ2lzdGVyOyBlcnJvciAlZFxuIiwKCQkgICAg ICAgZGV2LT5uYW1lLCB4cyk7CgkJcmV0dXJuIC0xOwoJfQoKCSpsaW5rdXAgPSAocmVnICYgQk1T Ul9MU1RBVFVTKSAhPSAwOwoKCXJldHVybiAwOwp9CgovKgogKiBUaGlzIHJvdXRpbmUgaXMgdXNl ZCBmb3IgdHdvIHB1cnBvc2VzLiAgVGhlIGZpcnN0IGlzIHRvIGtlZXAgdGhlCiAqIEVNQUMncyBk dXBsZXggc2V0dGluZyBpbiBzeW5jIHdpdGggdGhlIFBIWSdzLiAgVGhlIHNlY29uZCBpcyB0byBr ZWVwCiAqIHRoZSBzeXN0ZW0gYXBwcmlzZWQgb2YgdGhlIHN0YXRlIG9mIHRoZSBsaW5rLiAgTm90 ZSB0aGF0IHRoaXMgZHJpdmVyCiAqIGRvZXMgbm90IGNvbmZpZ3VyZSB0aGUgUEhZLiAgRWl0aGVy IHRoZSBQSFkgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZm9yCiAqIGF1dG8tbmVnb3RpYXRpb24gb3Ig aXQgc2hvdWxkIGJlIGhhbmRsZWQgYnkgc29tZXRoaW5nIGxpa2UgbWlpLXRvb2wuCiAqLwpzdGF0 aWMgdm9pZApwb2xsX21paSh1bnNpZ25lZCBsb25nIGRhdGEpCnsKCXN0cnVjdCBuZXRfZGV2aWNl ICpkZXYgPSAoc3RydWN0IG5ldF9kZXZpY2UgKikgZGF0YTsKCXN0cnVjdCBuZXRfbG9jYWwgKmxw ID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJdTMyIE9wdGlvbnM7CglEVVBMRVgg cGh5X2R1cGxleCwgbWFjX2R1cGxleDsKCWludCBwaHlfY2FycmllciwgbmV0aWZfY2FycmllcjsK CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyogRmlyc3QsIGZpbmQgb3V0IHdoYXQncyBnb2luZyBv biB3aXRoIHRoZSBQSFkuICovCglpZiAoZ2V0X3BoeV9zdGF0dXMoZGV2LCAmcGh5X2R1cGxleCwg JnBoeV9jYXJyaWVyKSkgewoJCXByaW50ayhLRVJOX0VSUiAiJXM6IFRlcm1pbmF0aW5nIGxpbmsg bW9uaXRvcmluZy5cbiIsCgkJICAgICAgIGRldi0+bmFtZSk7CgkJcmV0dXJuOwoJfQoKCS8qIFNl Y29uZCwgZmlndXJlIG91dCBpZiB3ZSBoYXZlIHRoZSBFTUFDIGluIGhhbGYgb3IgZnVsbCBkdXBs ZXguICovCglPcHRpb25zID0gWEVtYWNfR2V0T3B0aW9ucygmbHAtPkVtYWMpOwoJbWFjX2R1cGxl eCA9IChPcHRpb25zICYgWEVNX0ZEVVBMRVhfT1BUSU9OKSA/IEZVTExfRFVQTEVYIDogSEFMRl9E VVBMRVg7CgoJLyogTm93IHNlZSBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLiAqLwoJaWYgKG1hY19k dXBsZXggIT0gcGh5X2R1cGxleCkgewoJCS8qCgkJICogTWFrZSBzdXJlIHRoYXQgbm8gaW50ZXJy dXB0cyBjb21lIGluIHRoYXQgY291bGQgY2F1c2UKCQkgKiByZWVudHJhbmN5IHByb2JsZW1zIGlu IHJlc2V0LgoJCSAqLwoJCXNwaW5fbG9ja19pcnFzYXZlKHJlc2V0X2xvY2ssIGZsYWdzKTsKCQly ZXNldChkZXYsIHBoeV9kdXBsZXgpOwkJLyogdGhlIGZ1bmN0aW9uIHNldHMgRW1hYyBvcHRpb25z IHRvIG1hdGNoIHRoZSBQSFkgKi8KCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJlc2V0X2xvY2ss IGZsYWdzKTsKCQlpZiAobWFjX2R1cGxleCA9PSBGVUxMX0RVUExFWCkKCQkJcHJpbnRrKEtFUk5f SU5GTyAiJXM6IER1cGxleCBoYXMgYmVlbiBjaGFuZ2VkOiBub3cgJXNcbiIsCgkJCQlkZXYtPm5h bWUsICJIQUxGX0RVUExFWCIpOwoJCWVsc2UKCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IER1cGxl eCBoYXMgYmVlbiBjaGFuZ2VkOiBub3cgJXNcbiIsCgkJCQlkZXYtPm5hbWUsICJGVUxMX0RVUExF WCIpOwoJfQoJbmV0aWZfY2FycmllciA9IG5ldGlmX2NhcnJpZXJfb2soZGV2KSAhPSAwOwoKCWlm IChwaHlfY2FycmllciAhPSBuZXRpZl9jYXJyaWVyKSB7CgkJaWYgKHBoeV9jYXJyaWVyKSB7CgkJ CXByaW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGNhcnJpZXIgcmVzdG9yZWQuXG4iLAoJCQkgICAg ICAgZGV2LT5uYW1lKTsKCQkJbmV0aWZfY2Fycmllcl9vbihkZXYpOwoJCX0gZWxzZSB7CgkJCXBy aW50ayhLRVJOX0lORk8gIiVzOiBMaW5rIGNhcnJpZXIgbG9zdC5cbiIsIGRldi0+bmFtZSk7CgkJ CW5ldGlmX2NhcnJpZXJfb2ZmKGRldik7CgkJfQoJfQoKCS8qIFNldCB1cCB0aGUgdGltZXIgc28g d2UnbGwgZ2V0IGNhbGxlZCBhZ2FpbiBpbiAyIHNlY29uZHMuICovCglscC0+cGh5X3RpbWVyLmV4 cGlyZXMgPSBqaWZmaWVzICsgMiAqIEhaOwoJYWRkX3RpbWVyKCZscC0+cGh5X3RpbWVyKTsKfQoK LyoKICogVGhpcyByb3V0aW5lIGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT1MgYXMgdGhlIGZ1bmN0 aW9uIHRvIGNhbGwgd2hlbgogKiB0aGUgRU1BQyBpbnRlcnJ1cHRzLiAgSXQgaW4gdHVybiwgY2Fs bHMgdGhlIFhpbGlueCBPUyBpbmRlcGVuZGVudAogKiBpbnRlcnJ1cHQgZnVuY3Rpb24uICBUaGVy ZSBhcmUgZGlmZmVyZW50IGludGVycnVwdCBmdW5jdGlvbnMgZm9yIEZJRk8KICogYW5kIHNjYXR0 ZXItZ2F0aGVyIHNvIHdlIGp1c3Qgc2V0IGEgcG9pbnRlciAoSXNyKSBpbnRvIG91ciBwcml2YXRl CiAqIGRhdGEgc28gd2UgZG9uJ3QgaGF2ZSB0byBmaWd1cmUgaXQgb3V0IGhlcmUuICBUaGUgWGls aW54IE9TCiAqIGluZGVwZW5kZW50IGludGVycnVwdCBmdW5jdGlvbiB3aWxsIGluIHR1cm4gY2Fs bCBhbnkgY2FsbGJhY2tzIHRoYXQKICogd2UgaGF2ZSByZWdpc3RlcmVkIGZvciB2YXJpb3VzIGNv bmRpdGlvbnMuCiAqLwpzdGF0aWMgdm9pZAp4ZW5ldF9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAq ZGV2X2lkLCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9 IGRldl9pZDsKCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2 LT5wcml2OwoKCS8qIENhbGwgaXQuICovCgkoKihscC0+SXNyKSkgKCZscC0+RW1hYyk7Cn0KCnN0 YXRpYyBpbnQKeGVuZXRfb3BlbihzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgbmV0 X2xvY2FsICpscCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKCXUzMiBPcHRpb25z OwoJRFVQTEVYIHBoeV9kdXBsZXgsIG1hY19kdXBsZXg7CglpbnQgcGh5X2NhcnJpZXI7CgoJLyoK CSAqIEp1c3QgdG8gYmUgc2FmZSwgc3RvcCB0aGUgZGV2aWNlIGZpcnN0LiAgSWYgdGhlIGRldmlj ZSBpcyBhbHJlYWR5CgkgKiBzdG9wcGVkLCBhbiBlcnJvciB3aWxsIGJlIHJldHVybmVkLiAgSW4g dGhpcyBjYXNlLCB3ZSBkb24ndCByZWFsbHkKCSAqIGNhcmUsIHNvIGNhc3QgaXQgdG8gdm9pZCB0 byBtYWtlIGl0IGV4cGxpY2l0LgoJICovCgkodm9pZCkgWEVtYWNfU3RvcCgmbHAtPkVtYWMpOwoJ LyogU2V0IHRoZSBNQUMgYWRkcmVzcyBlYWNoIHRpbWUgb3BlbmVkLiAqLwoJaWYgKFhFbWFjX1Nl dE1hY0FkZHJlc3MoJmxwLT5FbWFjLCBkZXYtPmRldl9hZGRyKSAhPSBYU1RfU1VDQ0VTUykgewoJ CXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBzZXQgTUFDIGFkZHJlc3MuXG4iLCBkZXYt Pm5hbWUpOwoJCXJldHVybiAtRUlPOwoJfQoKCS8qCgkgKiBJZiB0aGUgZGV2aWNlIGlzIG5vdCBj b25maWd1cmVkIGZvciBwb2xsZWQgbW9kZSwgY29ubmVjdCB0byB0aGUKCSAqIGludGVycnVwdCBj b250cm9sbGVyIGFuZCBlbmFibGUgaW50ZXJydXB0cy4gIEN1cnJlbnRseSwgdGhlcmUKCSAqIGlz bid0IGFueSBjb2RlIHRvIHNldCBwb2xsZWQgbW9kZSwgc28gdGhpcyBjaGVjayBpcyBwcm9iYWJs eQoJICogc3VwZXJmbHVvdXMuCgkgKi8KCU9wdGlvbnMgPSBYRW1hY19HZXRPcHRpb25zKCZscC0+ RW1hYyk7CglpZiAoKE9wdGlvbnMgJiBYRU1fUE9MTEVEX09QVElPTikgPT0gMCkgewoJCWludCBy ZXR2YWw7CgkJLyogR3JhYiB0aGUgSVJRICovCgkJcmV0dmFsID0KCQkgICAgcmVxdWVzdF9pcnEo ZGV2LT5pcnEsICZ4ZW5ldF9pbnRlcnJ1cHQsIDAsIGRldi0+bmFtZSwgZGV2KTsKCQlpZiAocmV0 dmFsKSB7CgkJCXByaW50ayhLRVJOX0VSUgoJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgYWxsb2Nh dGUgaW50ZXJydXB0ICVkLlxuIiwKCQkJICAgICAgIGRldi0+bmFtZSwgZGV2LT5pcnEpOwoJCQly ZXR1cm4gcmV0dmFsOwoJCX0KCX0KCgkvKiBTZXQgdGhlIEVNQUMncyBkdXBsZXggc2V0dGluZyBi YXNlZCB1cG9uIHdoYXQgdGhlIFBIWSBzYXlzLiAqLwoJaWYgKCFnZXRfcGh5X3N0YXR1cyhkZXYs ICZwaHlfZHVwbGV4LCAmcGh5X2NhcnJpZXIpKSB7CgkJLyogV2Ugc3VjY2Vzc2Z1bGx5IGdvdCB0 aGUgUEhZIHN0YXR1cy4gKi8KCQltYWNfZHVwbGV4ID0gKChPcHRpb25zICYgWEVNX0ZEVVBMRVhf T1BUSU9OKQoJCQkgICAgICA/IEZVTExfRFVQTEVYIDogSEFMRl9EVVBMRVgpOwoJCWlmIChtYWNf ZHVwbGV4ICE9IHBoeV9kdXBsZXgpIHsKCQkJc3dpdGNoIChwaHlfZHVwbGV4KSB7CgkJCWNhc2Ug SEFMRl9EVVBMRVg6CgkJCQlPcHRpb25zICY9IH5YRU1fRkRVUExFWF9PUFRJT047CgkJCQlicmVh azsKCQkJY2FzZSBGVUxMX0RVUExFWDoKCQkJCU9wdGlvbnMgfD0gWEVNX0ZEVVBMRVhfT1BUSU9O OwoJCQkJYnJlYWs7CgkJCWNhc2UgVU5LTk9XTl9EVVBMRVg6CgkJCQlicmVhazsKCQkJfQoJCQkv KgoJCQkgKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGFuIGVycm9yCgkJCSAq IGlmIHRoZSBFTUFDIGlzIGFscmVhZHkgc3RhcnRlZC4gIFdlIGtub3cgaXQKCQkJICogaXNuJ3Qg c3RhcnRlZCBzbyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUKCQkJICogcmV0dXJuIHZhbHVlLiAg V2UgY2FzdCBpdCB0byB2b2lkIHRvIG1ha2UKCQkJICogdGhhdCBleHBsaWNpdC4KCQkJICovCgkJ fQoJfQoJT3B0aW9ucyB8PSBYRU1fRkxPV19DT05UUk9MX09QVElPTjsKCSh2b2lkKSBYRW1hY19T ZXRPcHRpb25zKCZscC0+RW1hYywgT3B0aW9ucyk7CgoJSU5JVF9MSVNUX0hFQUQoJihscC0+cmN2 KSk7CglscC0+cmN2QmRzID0gMDsKCUlOSVRfTElTVF9IRUFEKCYobHAtPnhtaXQpKTsKCWxwLT54 bWl0QmRzID0gMDsKCglpZiAoWEVtYWNfU3RhcnQoJmxwLT5FbWFjKSAhPSBYU1RfU1VDQ0VTUykg ewoJCXByaW50ayhLRVJOX0VSUiAiJXM6IENvdWxkIG5vdCBzdGFydCBkZXZpY2UuXG4iLCBkZXYt Pm5hbWUpOwoJCWZyZWVfaXJxKGRldi0+aXJxLCBkZXYpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJ LyogV2UncmUgcmVhZHkgdG8gZ28uICovCglNT0RfSU5DX1VTRV9DT1VOVDsKCW5ldGlmX3N0YXJ0 X3F1ZXVlKGRldik7CgoJLyogU2V0IHVwIHRoZSBQSFkgbW9uaXRvcmluZyB0aW1lci4gKi8KCWxw LT5waHlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAyICogSFo7CglscC0+cGh5X3RpbWVyLmRh dGEgPSAodW5zaWduZWQgbG9uZykgZGV2OwoJbHAtPnBoeV90aW1lci5mdW5jdGlvbiA9ICZwb2xs X21paTsKCWFkZF90aW1lcigmbHAtPnBoeV90aW1lcik7CglyZXR1cm4gMDsKfQpzdGF0aWMgaW50 CnhlbmV0X2Nsb3NlKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBuZXRfbG9jYWwg KmxwID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJdW5zaWduZWQgbG9uZyBmbGFn czsKCgkvKiBTaHV0IGRvd24gdGhlIFBIWSBtb25pdG9yaW5nIHRpbWVyLiAqLwoJZGVsX3RpbWVy X3N5bmMoJmxwLT5waHlfdGltZXIpOwoKCW5ldGlmX3N0b3BfcXVldWUoZGV2KTsKCgkvKgoJICog SWYgbm90IGluIHBvbGxlZCBtb2RlLCBmcmVlIHRoZSBpbnRlcnJ1cHQuICBDdXJyZW50bHksIHRo ZXJlCgkgKiBpc24ndCBhbnkgY29kZSB0byBzZXQgcG9sbGVkIG1vZGUsIHNvIHRoaXMgY2hlY2sg aXMgcHJvYmFibHkKCSAqIHN1cGVyZmx1b3VzLgoJICovCglpZiAoKFhFbWFjX0dldE9wdGlvbnMo JmxwLT5FbWFjKSAmIFhFTV9QT0xMRURfT1BUSU9OKSA9PSAwKQoJCWZyZWVfaXJxKGRldi0+aXJx LCBkZXYpOwoKCXNwaW5fbG9ja19pcnFzYXZlKHJjdlNwaW4sIGZsYWdzKTsKCWxpc3RfZGVsKCYo bHAtPnJjdikpOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyY3ZTcGluLCBmbGFncyk7CglzcGlu X2xvY2tfaXJxc2F2ZSh4bWl0U3BpbiwgZmxhZ3MpOwoJbGlzdF9kZWwoJihscC0+eG1pdCkpOwoJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh4bWl0U3BpbiwgZmxhZ3MpOwoKCWlmIChYRW1hY19TdG9w KCZscC0+RW1hYykgIT0gWFNUX1NVQ0NFU1MpIHsKCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3Vs ZCBub3Qgc3RvcCBkZXZpY2UuXG4iLCBkZXYtPm5hbWUpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJ TU9EX0RFQ19VU0VfQ09VTlQ7CglyZXR1cm4gMDsKfQpzdGF0aWMgc3RydWN0IG5ldF9kZXZpY2Vf c3RhdHMgKgp4ZW5ldF9nZXRfc3RhdHMoc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0 IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CglyZXR1cm4g JmxwLT5zdGF0czsKfQoKc3RhdGljIGludAp4ZW5ldF9GaWZvU2VuZChzdHJ1Y3Qgc2tfYnVmZiAq b3JpZ19za2IsIHN0cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBuZXRfbG9jYWwgKmxw ID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJc3RydWN0IHNrX2J1ZmYgKm5ld19z a2I7Cgl1bnNpZ25lZCBpbnQgbGVuLCBhbGlnbjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJbGVu ID0gb3JpZ19za2ItPmxlbjsKCiAgICAgICAgLyogUFIgRklYTUU6IHdoYXQgZm9sbG93cyBjYW4g YmUgcmVtb3ZlZCBpZiB0aGUgYXNzZXJ0cyBpbiB0aGUgWGlsaW54CiAgICAgICAgICogaW5kZXBl bmRlbnQgZHJpdmVycyBjaGFuZ2UuIFRoZXJlIGlzIHJlYWxseSBubyBuZWVkIHRvIGFsaWduIHRo ZQogICAgICAgICAqIGJ1ZmZlcnMgaW4gRklGTyBtb2RlLiBUaGUgc3RvcnkgaXMgZGlmZmVyZW50 IGZvciBzaW1wbGUgRE1BLgogICAgICAgICAqLwoKICAgICAgICAvKgoJICogVGhlIHBhY2tldCBG SUZPIHJlcXVpcmVzIHRoZSBidWZmZXJzIHRvIGJlIDMyLzY0IGJpdCBhbGlnbmVkLgoJICogVGhl IHNrX2J1ZmYgZGF0YSBpcyBub3QgMzIvNjQgYml0IGFsaWduZWQsIHNvIHdlIGhhdmUgdG8gZG8g dGhpcwoJICogY29weS4gIEFzIHlvdSBwcm9iYWJseSB3ZWxsIGtub3csIHRoaXMgaXMgbm90IG9w dGltYWwuCgkgKi8KCWlmICghKG5ld19za2IgPSBhbGxvY19za2IobGVuICsgQUxJR05NRU5ULCBH RlBfQVRPTUlDKSkpIHsKCQkvKiBXZSBjb3VsZG4ndCBnZXQgYW5vdGhlciBza2IuICovCgkJZGV2 X2tmcmVlX3NrYihvcmlnX3NrYik7CgkJbHAtPnN0YXRzLnR4X2Ryb3BwZWQrKzsKCQlwcmludGso S0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgYWxsb2NhdGUgdHJhbnNtaXQgYnVmZmVyLlxuIiwKCQkg ICAgICAgZGV2LT5uYW1lKTsKCQluZXRpZl93YWtlX3F1ZXVlKGRldik7CgkJcmV0dXJuIC1FQlVT WTsKCX0KCS8qCgkgKiBBIG5ldyBza2Igc2hvdWxkIGhhdmUgdGhlIGRhdGEgd29yZCBhbGlnbmVk LCBidXQgdGhpcyBjb2RlIGlzCgkgKiBoZXJlIGp1c3QgaW4gY2FzZSB0aGF0IGlzbid0IHRydWUu Li4gIENhbGN1bGF0ZSBob3cgbWFueQoJICogYnl0ZXMgd2Ugc2hvdWxkIHJlc2VydmUgdG8gZ2V0 IHRoZSBkYXRhIHRvIHN0YXJ0IG9uIGEgd29yZAoJICogYm91bmRhcnkuICAqLwoJYWxpZ24gPSBC VUZGRVJfQUxJR04obmV3X3NrYi0+ZGF0YSk7CglpZiAoYWxpZ24pCgkJc2tiX3Jlc2VydmUobmV3 X3NrYiwgYWxpZ24pOwoKCS8qIENvcHkgdGhlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgc2tiIHRv IHRoZSBuZXcgb25lLiAqLwoJc2tiX3B1dChuZXdfc2tiLCBsZW4pOwoJbWVtY3B5KG5ld19za2It PmRhdGEsIG9yaWdfc2tiLT5kYXRhLCBsZW4pOwogICAgICAgIAoJLyogR2V0IHJpZCBvZiB0aGUg b3JpZ2luYWwgc2tiLiAqLwoJZGV2X2tmcmVlX3NrYihvcmlnX3NrYik7CiAgICAgICAgc3Bpbl9s b2NrX2lycXNhdmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJaWYgKFhFbWFjX0ZpZm9TZW5kKCZscC0+ RW1hYywgKHU4ICopIG5ld19za2ItPmRhdGEsIGxlbikgIT0gWFNUX1NVQ0NFU1MpIHsKCQluZXRp Zl9zdG9wX3F1ZXVlKGRldik7CgkJbHAtPmRlZmVycmVkX3NrYiA9IG5ld19za2I7CgkJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZShyZXNldF9sb2NrLCBmbGFncyk7CgkJcmV0dXJuIDA7Cgl9CglzcGlu X3VubG9ja19pcnFyZXN0b3JlKHJlc2V0X2xvY2ssIGZsYWdzKTsKCglscC0+c3RhdHMudHhfYnl0 ZXMgKz0gbGVuOwogICAgICAgIGRldl9rZnJlZV9za2IobmV3X3NrYik7CglkZXYtPnRyYW5zX3N0 YXJ0ID0gamlmZmllczsKCglyZXR1cm4gMDsKfQoKLyogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZv ciBjb21wbGV0ZWQgZnJhbWVzIHNlbnQgaW4gRklGTyBtb2RlLiAqLwpzdGF0aWMgdm9pZApGaWZv U2VuZEhhbmRsZXIodm9pZCAqQ2FsbGJhY2tSZWYpCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXYg PSAoc3RydWN0IG5ldF9kZXZpY2UgKikgQ2FsbGJhY2tSZWY7CglzdHJ1Y3QgbmV0X2xvY2FsICps cCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKCglpZiAobHAtPmRlZmVycmVkX3Nr YikgewoJCWlmIChYRW1hY19GaWZvU2VuZCgmbHAtPkVtYWMsICh1OCAqKSBscC0+ZGVmZXJyZWRf c2tiLT5kYXRhLCBscC0+ZGVmZXJyZWRfc2tiLT5sZW4pICE9IFhTVF9TVUNDRVNTKSB7CgkJCXJl dHVybjsKCQl9IGVsc2UgewoJCQlkZXZfa2ZyZWVfc2tiKGxwLT5kZWZlcnJlZF9za2IpOwoJCQls cC0+ZGVmZXJyZWRfc2tiID0gTlVMTDsKCQkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwoJCX0KCX0K CWxwLT5zdGF0cy50eF9wYWNrZXRzKys7Cn0KCi8qIFRoZSBzZW5kIGZ1bmN0aW9uIGZvciBmcmFt ZXMgc2VudCBpbiBETUEgbW9kZS4gKi8Kc3RhdGljIGludAp4ZW5ldF9TZ1NlbmQoc3RydWN0IHNr X2J1ZmYgKnNrYiwgc3RydWN0IG5ldF9kZXZpY2UgKmRldikKewogICAgICAgIHN0cnVjdCBuZXRf bG9jYWwgKmxwID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJdW5zaWduZWQgaW50 IGxlbjsKCVhCdWZEZXNjcmlwdG9yIGJkOwoJaW50IHJlc3VsdDsKICAgICAgICB1MzIgcGh5c0Fk ZHI7CiAgICAgICAgdTggKnZpcnRBZGRyOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCiAgICAgICAg bGVuID0gc2tiLT5sZW47CiAgICAgICAgdmlydEFkZHIgPSBscC0+ZGRyVmlydFB0ciArIGxwLT5k ZHJPZmZzZXQ7CgogICAgICAgIGlmIChza2ItPmlwX3N1bW1lZCA9PSBDSEVDS1NVTV9OT05FKQog ICAgICAgICAgLypjYWNoZWFibGVfKi9tZW1jcHkodmlydEFkZHIsIHNrYi0+ZGF0YSwgbGVuKTsK ICAgICAgICBlbHNlCiAgICAgICAgICBza2JfY29weV9hbmRfY3N1bV9kZXYoc2tiLCB2aXJ0QWRk cik7CiAgICAgICAgCiAgICAgICAgZGV2X2tmcmVlX3NrYihza2IpOwoKCXBoeXNBZGRyID0gKHUz MikgcGNpX21hcF9zaW5nbGUoTlVMTCwgdmlydEFkZHIsIGxlbiwgUENJX0RNQV9UT0RFVklDRSk7 CgkvKgoJICogbG9jayB0aGUgYnVmZmVyIGRlc2NyaXB0b3IgdG8gcHJldmVudCBsb3dlciBsYXll cnMgZnJvbSByZXVzaW5nCgkgKiBpdCBiZWZvcmUgdGhlIGFkYXB0ZXIgaGFzIGEgY2hhbmNlIHRv IGRlYWxsb2NhdGUgdGhlIGJ1ZmZlcgoJICogYXR0YWNoZWQgdG8gaXQuIFRoZSBhZGFwdGVyIHdp bGwgdW5sb2NrIGl0IGluIHRoZSBjYWxsYmFjayBmdW5jdGlvbgoJICogdGhhdCBoYW5kbGVzIGNv bmZpcm1hdGlvbiBvZiB0cmFuc21pdHMKCSAqLwoJWEJ1ZkRlc2NyaXB0b3JfSW5pdGlhbGl6ZSgm YmQpOwoJWEJ1ZkRlc2NyaXB0b3JfTG9jaygmYmQpOwoJWEJ1ZkRlc2NyaXB0b3JfU2V0U3JjQWRk cmVzcygmYmQsIHBoeXNBZGRyKTsKCVhCdWZEZXNjcmlwdG9yX1NldExlbmd0aCgmYmQsIGxlbik7 CglYQnVmRGVzY3JpcHRvcl9TZXRMYXN0KCZiZCk7CgogICAgICAgIGxwLT5kZHJPZmZzZXQgKz0g bGVuICsgQlVGRkVSX0FMSUdOKGxlbik7CiAgICAgICAgaWYgKGxwLT5kZHJPZmZzZXQgKyBYRU1f TUFYX0ZSQU1FX1NJWkUgPiBscC0+ZGRyU2l6ZSkKICAgICAgICAgIGxwLT5kZHJPZmZzZXQgPSAw OwoKCXNwaW5fbG9ja19pcnFzYXZlKHJlc2V0X2xvY2ssIGZsYWdzKTsKICAgICAgICByZXN1bHQg PSBYRW1hY19TZ1NlbmQoJmxwLT5FbWFjLCAmYmQsIFhFTV9TR0RNQV9OT0RFTEFZKTsKCWlmIChy ZXN1bHQgIT0gWFNUX1NVQ0NFU1MpIHsKCQlscC0+c3RhdHMudHhfZHJvcHBlZCsrOwoJCXByaW50 ayhLRVJOX0VSUiAiJXM6IEVSUk9SLCBjb3VsZCBub3Qgc2VuZCB0cmFuc21pdCBidWZmZXIgKCVk KS5cbiIsCgkJICAgICAgIGRldi0+bmFtZSwgcmVzdWx0KTsKICAgICAgICAgICAgICAgIC8qIHdl IHNob3VsZCBuZXZlciBnZXQgaGVyZSBpbiB0aGUgZmlyc3QgcGxhY2UsIGJ1dAogICAgICAgICAg ICAgICAgICogZm9yIHNvbWUgcmVhc29uIHRoZSBrZXJuZWwgZG9lc24ndCBsaWtlIC1FQlVTWSBo ZXJlLAogICAgICAgICAgICAgICAgICogc28ganVzdCByZXR1cm4gMCBhbmQgbGV0IHRoZSBzdGFj ayBoYW5kbGUgZHJvcHBlZCBwYWNrZXRzLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAg ICAgICAvKgkJcmV0dXJuIC1FQlVTWTsgKi8KCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKHJlc2V0 X2xvY2ssIGZsYWdzKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwoJfQogICAgICAgIAogICAg ICAgIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZscC0+YXZhaWxTZW5kQmRzKSkgewoJCW5ldGlm X3N0b3BfcXVldWUoZGV2KTsKICAgICAgICB9CgoJZGV2LT50cmFuc19zdGFydCA9IGppZmZpZXM7 CglzcGluX3VubG9ja19pcnFyZXN0b3JlKHJlc2V0X2xvY2ssIGZsYWdzKTsKCXJldHVybiAwOwp9 CgovKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGNvbXBsZXRlZCBmcmFtZXMgc2VudCBpbiBE TUEgbW9kZS4gKi8Kc3RhdGljIHZvaWQgU2dTZW5kSGFuZGxlckJIICh1bnNpZ25lZCBsb25nIHAp OwpzdGF0aWMgdm9pZCBTZ1JlY3ZIYW5kbGVyQkggKHVuc2lnbmVkIGxvbmcgcCk7CgpERUNMQVJF X1RBU0tMRVQgKFNnU2VuZEJILCBTZ1NlbmRIYW5kbGVyQkgsIDApOwpERUNMQVJFX1RBU0tMRVQg KFNnUmVjdkJILCBTZ1JlY3ZIYW5kbGVyQkgsIDApOwoKc3RhdGljIHZvaWQKU2dTZW5kSGFuZGxl ckJIICh1bnNpZ25lZCBsb25nIHApCnsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CglzdHJ1Y3Qg bmV0X2xvY2FsICpscDsKCVhCdWZEZXNjcmlwdG9yICogQmRQdHI7Cgl1MzIgTnVtQmRzOwoJdTMy IGxlbjsKCVhCdWZEZXNjcmlwdG9yICpjdXJiZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJd2hp bGUgKDEpIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSh4bWl0U3BpbixmbGFncyk7CgkJaWYgKGxpc3Rf ZW1wdHkoJnNlbnRRdWV1ZSkpIHsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh4bWl0U3Bpbixm bGFncyk7CgkJCWJyZWFrOwoJCX0KCQlscCA9IGxpc3RfZW50cnkoc2VudFF1ZXVlLm5leHQsIHN0 cnVjdCBuZXRfbG9jYWwsIHhtaXQpOwoJCWxpc3RfZGVsX2luaXQoJihscC0+eG1pdCkpOwoJCU51 bUJkcyA9IGxwLT54bWl0QmRzOwoJCUJkUHRyID0gbHAtPnhtaXRCZFB0cjsKCQlkZXYgPSBscC0+ ZGV2OwoJCWF0b21pY19hZGQoTnVtQmRzLCAmbHAtPmF2YWlsU2VuZEJkcyk7CgkJd2hpbGUoTnVt QmRzICE9IDApIHsKCQkJTnVtQmRzLS07CgoJCQlsZW4gPSBYQnVmRGVzY3JpcHRvcl9HZXRMZW5n dGgoQmRQdHIpOwoJCQlwY2lfdW5tYXBfc2luZ2xlKE5VTEwsCgkJCQkodTMyKSBYQnVmRGVzY3Jp cHRvcl9HZXRTcmNBZGRyZXNzKEJkUHRyKSwKCQkJCSBsZW4sIFBDSV9ETUFfVE9ERVZJQ0UpOwoK CQkJbHAtPnN0YXRzLnR4X2J5dGVzICs9IGxlbjsKCQkJbHAtPnN0YXRzLnR4X3BhY2tldHMrKzsK CgkJCWN1cmJkID0gQmRQdHI7CgkJCUJkUHRyID0gUF9UT19WKCZscC0+RW1hYy5TZW5kQ2hhbm5l bCwKCQkJCVhCdWZEZXNjcmlwdG9yX0dldE5leHRQdHIoQmRQdHIpKTsKCQkJWEJ1ZkRlc2NyaXB0 b3JfVW5sb2NrKGN1cmJkKTsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSh4bWl0U3Bpbixm bGFncyk7CgkJbmV0aWZfd2FrZV9xdWV1ZShkZXYpOwoJfQp9CgpzdGF0aWMgdm9pZApTZ1NlbmRI YW5kbGVyKHZvaWQgKkNhbGxCYWNrUmVmLCBYQnVmRGVzY3JpcHRvciAqIEJkUHRyLCB1MzIgTnVt QmRzKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNlICopIENh bGxCYWNrUmVmOwoJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBk ZXYtPnByaXY7CglzdHJ1Y3QgbGlzdF9oZWFkKiBjdXJfbHAgPSBOVUxMOwoKCXNwaW5fbG9jayh4 bWl0U3Bpbik7CglsaXN0X2Zvcl9lYWNoIChjdXJfbHAsICZzZW50UXVldWUpIHsKCQlpZiAoY3Vy X2xwID09ICYobHAtPnhtaXQpKSB7CgkJCWxwLT54bWl0QmRzICs9IE51bUJkczsKCQkJYnJlYWs7 CgkJfQoJfQoJaWYgKGN1cl9scCAhPSAmKGxwLT54bWl0KSkgewoJCWxwLT54bWl0QmRzID0gTnVt QmRzOwoJCWxwLT54bWl0QmRQdHIgPSBCZFB0cjsKCQlsaXN0X2FkZF90YWlsKCZscC0+eG1pdCwm c2VudFF1ZXVlKTsKCQliaF9lbnRyeSsrOwoJCXRhc2tsZXRfc2NoZWR1bGUgKCZTZ1NlbmRCSCk7 Cgl9CglzcGluX3VubG9jayh4bWl0U3Bpbik7Cn0KCnN0YXRpYyB2b2lkClNnUmVjdkhhbmRsZXJC SCAodW5zaWduZWQgbG9uZyBwKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2OwoJc3RydWN0IG5l dF9sb2NhbCAqbHA7CglYQnVmRGVzY3JpcHRvciogQmRQdHI7CglpbnQgTnVtQmRzOwoJc3RydWN0 IHNrX2J1ZmYgKnNrYiwgKm5ld19za2I7Cgl1MzIgbGVuLCBuZXdfc2tiX3ZhZGRyOwoJZG1hX2Fk ZHJfdCBza2JfdmFkZHI7Cgl1MzIgYWxpZ247CglYU3RhdHVzIHJlc3VsdDsKCVhCdWZEZXNjcmlw dG9yICpjdXJiZDsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJd2hpbGUgKDEpIHsKCQlzcGluX2xv Y2tfaXJxc2F2ZShyY3ZTcGluLGZsYWdzKTsKCQlpZiAobGlzdF9lbXB0eSgmcmVjZWl2ZWRRdWV1 ZSkpIHsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyY3ZTcGluLGZsYWdzKTsKCQkJYnJlYWs7 CgkJfQoJCWxwID0gbGlzdF9lbnRyeShyZWNlaXZlZFF1ZXVlLm5leHQsIHN0cnVjdCBuZXRfbG9j YWwsIHJjdik7CgkJbGlzdF9kZWxfaW5pdCgmKGxwLT5yY3YpKTsKCQlOdW1CZHMgPSBscC0+cmN2 QmRzOwoJCUJkUHRyID0gbHAtPnJjdkJkUHRyOwoJCWRldiA9IGxwLT5kZXY7CgkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZShyY3ZTcGluLGZsYWdzKTsKCQl3aGlsZSAoTnVtQmRzICE9IDApIHsKCQkJ TnVtQmRzLS07CgoJCQkvKiBnZXQgcHRyIHRvIHNrYiAqLwoJCQlza2IgPSAoc3RydWN0IHNrX2J1 ZmYgKikgWEJ1ZkRlc2NyaXB0b3JfR2V0SWQoQmRQdHIpOwoJCQlsZW4gPSBYQnVmRGVzY3JpcHRv cl9HZXRMZW5ndGgoQmRQdHIpOwoKCQkJLyogd2UgaGF2ZSBhbGwgdGhlIGluZm9ybWF0aW9uIHdl IG5lZWQgLSBtb3ZlIG9uICovCgkJCWN1cmJkID0gQmRQdHI7CgkJCUJkUHRyID0gUF9UT19WKCZs cC0+RW1hYy5SZWN2Q2hhbm5lbCwKCQkJCVhCdWZEZXNjcmlwdG9yX0dldE5leHRQdHIoY3VyYmQp KTsKCgkJCXNrYl92YWRkciA9IChkbWFfYWRkcl90KVhCdWZEZXNjcmlwdG9yX0dldERlc3RBZGRy ZXNzKGN1cmJkKTsKCQkJcGNpX3VubWFwX3NpbmdsZShOVUxMLCBza2JfdmFkZHIsIGxlbiwgUENJ X0RNQV9GUk9NREVWSUNFKTsKCgkJCS8qIHJlcGxhY2Ugc2tiIHdpdGggYSBuZXcgb25lICovCgkJ CW5ld19za2IgPSBhbGxvY19za2IoWEVNX01BWF9GUkFNRV9TSVpFICsgQUxJR05NRU5ULCBHRlBf QVRPTUlDKTsKCQkJaWYgKG5ld19za2IgPT0gMCkgewoJCQkJcHJpbnRrKCJTZ1JlY3ZIYW5kbGVy OiBubyBtZW0gZm9yIG5ld19za2JcbiIpOwoJCQkJcmV0dXJuOwoJCQl9CgoJCQkvKiBtYWtlIHN1 cmUgd2UncmUgbG9uZy13b3JkIGFsaWduZWQgKi8KCQkJYWxpZ24gPSBCVUZGRVJfQUxJR04obmV3 X3NrYi0+ZGF0YSk7CgkJCWlmIChhbGlnbikgewoJCQkJc2tiX3Jlc2VydmUobmV3X3NrYiwgYWxp Z24pOwoJCQl9CgoJCQluZXdfc2tiX3ZhZGRyID0gKHUzMikgcGNpX21hcF9zaW5nbGUoTlVMTCwg bmV3X3NrYi0+ZGF0YSwKCQkJCQkJICAgICBYRU1fTUFYX0ZSQU1FX1NJWkUsCgkJCQkJCSAgICAg UENJX0RNQV9GUk9NREVWSUNFKTsKCgkJCVhCdWZEZXNjcmlwdG9yX1NldERlc3RBZGRyZXNzKGN1 cmJkLCBuZXdfc2tiX3ZhZGRyKTsKCQkJWEJ1ZkRlc2NyaXB0b3JfU2V0TGVuZ3RoKGN1cmJkLCBY RU1fTUFYX0ZSQU1FX1NJWkUpOwoJCQlYQnVmRGVzY3JpcHRvcl9TZXRJZChjdXJiZCwgbmV3X3Nr Yik7CgkJCVhCdWZEZXNjcmlwdG9yX1VubG9jayhjdXJiZCk7CgoJCQkvKiBnaXZlIHRoZSBkZXNj cmlwdG9yIGJhY2sgdG8gdGhlIGRyaXZlciAqLwoJCQlyZXN1bHQgPSBYRW1hY19TZ1JlY3YoJmxw LT5FbWFjLCBjdXJiZCk7CgkJCWlmIChyZXN1bHQgIT0gWFNUX1NVQ0NFU1MpIHsKCQkJCXByaW50 aygiU2dSZWN2SGFuZGxlcjogU2dSZWN2IHVuc3VjY2Vzc2Z1bFxuIik7CgkJCQlyZXR1cm47CgkJ CX0KCgkJCS8qIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHNrYiAqLwoJCQlza2ItPmxlbiA9IGxlbjsK CQkJc2tiLT5kZXYgPSBkZXY7CgkJCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2Is IGRldik7CgkJCXNrYi0+aXBfc3VtbWVkID0gQ0hFQ0tTVU1fTk9ORTsKCgkJCWxwLT5zdGF0cy5y eF9wYWNrZXRzKys7CgkJCWxwLT5zdGF0cy5yeF9ieXRlcyArPSBsZW47CgoJCQluZXRpZl9yeChz a2IpOyAgICAgICAgICAvKiBTZW5kIHRoZSBwYWNrZXQgdXBzdHJlYW0uICovCgkJfQoJfQp9Cgpz dGF0aWMgdm9pZApTZ1JlY3ZIYW5kbGVyKHZvaWQgKkNhbGxCYWNrUmVmLCBYQnVmRGVzY3JpcHRv ciAqIEJkUHRyLCB1MzIgTnVtQmRzKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVj dCBuZXRfZGV2aWNlICopIENhbGxCYWNrUmVmOwoJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3Ry dWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7CglzdHJ1Y3QgbGlzdF9oZWFkKiBjdXJfbHAgPSBO VUxMOwoKCXNwaW5fbG9jayhyY3ZTcGluKTsKCWxpc3RfZm9yX2VhY2ggKGN1cl9scCwgJnJlY2Vp dmVkUXVldWUpIHsKCQlpZiAoY3VyX2xwID09ICYobHAtPnJjdikpIHsKCQkJbHAtPnJjdkJkcyAr PSBOdW1CZHM7CgkJCWJyZWFrOwoJCX0KCX0KCWlmIChjdXJfbHAgIT0gJihscC0+cmN2KSkgewoJ CWxwLT5yY3ZCZHMgPSBOdW1CZHM7CgkJbHAtPnJjdkJkUHRyID0gQmRQdHI7CgkJbGlzdF9hZGRf dGFpbCgmbHAtPnJjdiwgJnJlY2VpdmVkUXVldWUpOwoJCXRhc2tsZXRfc2NoZWR1bGUgKCZTZ1Jl Y3ZCSCk7Cgl9CglzcGluX3VubG9jayhyY3ZTcGluKTsKfQoKc3RhdGljIHZvaWQKeGVuZXRfdHhf dGltZW91dChzdHJ1Y3QgbmV0X2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgbmV0X2xvY2FsICpscCA9 IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJ cHJpbnRrKCIlczogRXhjZWVkZWQgdHJhbnNtaXQgdGltZW91dCBvZiAlbHUgbXMuXG4iLAoJICAg ICAgIGRldi0+bmFtZSwgVFhfVElNRU9VVCAqIDEwMDBVTCAvIEhaKTsKCglscC0+c3RhdHMudHhf ZXJyb3JzKys7CglzcGluX2xvY2tfaXJxc2F2ZShyZXNldF9sb2NrLCBmbGFncyk7CglyZXNldChk ZXYsIFVOS05PV05fRFVQTEVYKTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVzZXRfbG9jaywg ZmxhZ3MpOwp9CgovKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gZm9yIGZyYW1lcyByZWNlaXZlZCB3 aGVuIGluIEZJRk8gbW9kZS4gKi8Kc3RhdGljIHZvaWQKRmlmb1JlY3ZIYW5kbGVyKHZvaWQgKkNh bGxiYWNrUmVmKQp7CglzdHJ1Y3QgbmV0X2RldmljZSAqZGV2ID0gKHN0cnVjdCBuZXRfZGV2aWNl ICopIENhbGxiYWNrUmVmOwoJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2Nh bCAqKSBkZXYtPnByaXY7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJdW5zaWduZWQgaW50IGFsaWdu OwoJdTMyIGxlbjsKCVhTdGF0dXMgUmVzdWx0OwoKCS8qCgkgKiBUaGUgT1MgaW5kZXBlbmRlbnQg WGlsaW54IEVNQUMgY29kZSBkb2VzIG5vdCBwcm92aWRlIGEKCSAqIGZ1bmN0aW9uIHRvIGdldCB0 aGUgbGVuZ3RoIG9mIGFuIGluY29taW5nIHBhY2tldCBhbmQgYQoJICogc2VwYXJhdGUgY2FsbCB0 byBhY3R1YWxseSBnZXQgdGhlIHBhY2tldCBkYXRhLiAgSXQgZG9lcyB0aGlzCgkgKiBiZWNhdXNl IHRoZXkgZGlkbid0IGFkZCBhbnkgY29kZSB0byBrZWVwIHRoZSBoYXJkd2FyZSdzCgkgKiByZWNl aXZlIGxlbmd0aCBhbmQgZGF0YSBGSUZPcyBpbiBzeW5jLiAgSW5zdGVhZCwgdGhleSByZXF1aXJl CgkgKiB0aGF0IHlvdSBzZW5kIGEgbWF4aW1hbCBsZW5ndGggYnVmZmVyIHNvIHRoYXQgdGhleSBj YW4gcmVhZAoJICogdGhlIGxlbmd0aCBhbmQgZGF0YSBGSUZPcyBpbiBhIHNpbmdsZSBjaHVuayBv ZiBjb2RlIHNvIHRoYXQKCSAqIHRoZXkgY2FuJ3QgZ2V0IG91dCBvZiBzeW5jLiAgU28sIHdlIG5l ZWQgdG8gYWxsb2NhdGUgYW4gc2tiCgkgKiB0aGF0IGNhbiBob2xkIGEgbWF4aW1hbCBzaXplZCBw YWNrZXQuICBUaGUgT1MgaW5kZXBlbmRlbnQKCSAqIGNvZGUgbmVlZHMgdG8gc2VlIHRoZSBkYXRh IDMyLzY0LWJpdCBhbGlnbmVkLCBzbyB3ZSB0YWNrIG9uIGFuCgkgKiBleHRyYSBmb3VyIGp1c3Qg aW4gY2FzZSB3ZSBuZWVkIHRvIGRvIGFuIHNrYl9yZXNlcnZlIHRvIGdldAoJICogaXQgdGhhdCB3 YXkuCgkgKi8KCWxlbiA9IFhFTV9NQVhfRlJBTUVfU0laRTsKCWlmICghKHNrYiA9IGFsbG9jX3Nr YihsZW4gKyBBTElHTk1FTlQsIEdGUF9BVE9NSUMpKSkgewoJCS8qIENvdWxkbid0IGdldCBtZW1v cnkuICovCgkJbHAtPnN0YXRzLnJ4X2Ryb3BwZWQrKzsKCQlwcmludGsoS0VSTl9FUlIgIiVzOiBD b3VsZCBub3QgYWxsb2NhdGUgcmVjZWl2ZSBidWZmZXIuXG4iLAoJCSAgICAgICBkZXYtPm5hbWUp OwoJCXJldHVybjsKCX0KCgkvKgoJICogQSBuZXcgc2tiIHNob3VsZCBoYXZlIHRoZSBkYXRhIHdv cmQgYWxpZ25lZCwgYnV0IHRoaXMgY29kZSBpcwoJICogaGVyZSBqdXN0IGluIGNhc2UgdGhhdCBp c24ndCB0cnVlLi4uICBDYWxjdWxhdGUgaG93IG1hbnkKCSAqIGJ5dGVzIHdlIHNob3VsZCByZXNl cnZlIHRvIGdldCB0aGUgZGF0YSB0byBzdGFydCBvbiBhIHdvcmQKCSAqIGJvdW5kYXJ5LiAgKi8K CWFsaWduID0gQlVGRkVSX0FMSUdOKHNrYi0+ZGF0YSk7CglpZiAoYWxpZ24pCgkJc2tiX3Jlc2Vy dmUoc2tiLCBhbGlnbik7CgoJUmVzdWx0ID0gWEVtYWNfRmlmb1JlY3YoJmxwLT5FbWFjLCAodTgg Kikgc2tiLT5kYXRhLCAmbGVuKTsKCWlmIChSZXN1bHQgIT0gWFNUX1NVQ0NFU1MpIHsKCQlpbnQg bmVlZF9yZXNldCA9IHN0YXR1c19yZXF1aXJlc19yZXNldChSZXN1bHQpOwoKCQlscC0+c3RhdHMu cnhfZXJyb3JzKys7CgkJZGV2X2tmcmVlX3NrYihza2IpOwoJCXByaW50ayhLRVJOX0VSUiAiJXM6 IENvdWxkIG5vdCByZWNlaXZlIGJ1ZmZlciwgZXJyb3I9JWQlcy5cbiIsCgkJICAgICAgIGRldi0+ bmFtZSwgUmVzdWx0LAoJCQluZWVkX3Jlc2V0ID8gIiwgcmVzZXR0aW5nIGRldmljZS4iIDogIiIp OwoJCWlmIChuZWVkX3Jlc2V0KSB7CgkJCXNwaW5fbG9jayhyZXNldF9sb2NrKTsKCQkJcmVzZXQo ZGV2LCBVTktOT1dOX0RVUExFWCk7CgkJCXNwaW5fdW5sb2NrKHJlc2V0X2xvY2spOwoJCX0KCgkJ cmV0dXJuOwoJfQoKCXNrYl9wdXQoc2tiLCBsZW4pOwkvKiBUZWxsIHRoZSBza2IgaG93IG11Y2gg ZGF0YSB3ZSBnb3QuICovCglza2ItPmRldiA9IGRldjsJCS8qIEZpbGwgb3V0IHJlcXVpcmVkIG1l dGEtZGF0YS4gKi8KCXNrYi0+cHJvdG9jb2wgPSBldGhfdHlwZV90cmFucyhza2IsIGRldik7CiAg ICAgICAgc2tiLT5pcF9zdW1tZWQgPSBDSEVDS1NVTV9OT05FOwoKCWxwLT5zdGF0cy5yeF9wYWNr ZXRzKys7CglscC0+c3RhdHMucnhfYnl0ZXMgKz0gbGVuOwoKCW5ldGlmX3J4KHNrYik7CQkvKiBT ZW5kIHRoZSBwYWNrZXQgdXBzdHJlYW0uICovCn0KCi8qIFRoZSBjYWxsYmFjayBmdW5jdGlvbiBm b3IgZXJyb3JzLiAqLwpzdGF0aWMgdm9pZApFcnJvckhhbmRsZXIodm9pZCAqQ2FsbGJhY2tSZWYs IFhTdGF0dXMgQ29kZSkKewoJc3RydWN0IG5ldF9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgbmV0X2Rl dmljZSAqKSBDYWxsYmFja1JlZjsKCWludCBuZWVkX3Jlc2V0ID0gc3RhdHVzX3JlcXVpcmVzX3Jl c2V0KENvZGUpOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCiAgICAgICAgLyogaWdub3JlIHNvbWUg ZXJyb3JzICovCiAgICAgICAgaWYgKENvZGUgPT0gWFNUX0RNQV9FUlJPUikKICAgICAgICAgIHJl dHVybjsKCXByaW50ayhLRVJOX0VSUiAiJXM6IGRldmljZSBlcnJvciAlZCVzXG4iLAoJICAgICAg IGRldi0+bmFtZSwgQ29kZSxuZWVkX3Jlc2V0ID8gIiwgcmVzZXR0aW5nIGRldmljZS4iIDogIiIp OwoJaWYgKG5lZWRfcmVzZXQpIHsKCQlzcGluX2xvY2tfaXJxc2F2ZShyZXNldF9sb2NrLCBmbGFn cyk7CgkJcmVzZXQoZGV2LCBVTktOT1dOX0RVUExFWCk7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZShyZXNldF9sb2NrLCBmbGFncyk7Cgl9Cn0KCnN0YXRpYyBpbnQKZGVzY3JpcHRvcl9pbml0KHN0 cnVjdCBuZXRfZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gKHN0cnVjdCBu ZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJaW50IGksIHJlY3ZzaXplLCBzZW5kc2l6ZTsKCWludCBk ZnRzaXplOwoJdTMyICpyZWN2cG9vbHB0ciwgKnNlbmRwb29scHRyOwoJdm9pZCAqcmVjdnBvb2xw aHksICpzZW5kcG9vbHBoeTsKCgkvKiBjYWxjIHNpemUgb2YgZGVzY3JpcHRvciBzcGFjZSBwb29s OyBhbGxvYyBmcm9tIG5vbi1jYWNoZWQgbWVtb3J5ICovCglkZnRzaXplID0gKFhFTV9ERlRfUkVD Vl9ERVNDICsgWEVNX0RGVF9TRU5EX0RFU0MpICoKCSAgICBzaXplb2YgKFhCdWZEZXNjcmlwdG9y KTsKICAgICAgICAKCWxwLT5kZXNjX3NwYWNlID0gY29uc2lzdGVudF9hbGxvYyhHRlBfQVRPTUlD LCBkZnRzaXplLAoJCQkJCSAgJmxwLT5kZXNjX3NwYWNlX2hhbmRsZSk7CglpZiAobHAtPmRlc2Nf c3BhY2UgPT0gMCkgewoJCXJldHVybiAtMTsKCX0KCWxwLT5kZXNjX3NwYWNlX3NpemUgPSBkZnRz aXplOwoKICAgICAgICBscC0+ZGRyU2l6ZSA9IFhFTV9ERlRfU0VORF9ERVNDICogKFhFTV9NQVhf RlJBTUVfU0laRSArIEFMSUdOTUVOVCk7CiAgICAgICAgbHAtPmRkck9mZnNldCA9IDA7CiAgICAg ICAgbHAtPmRkclZpcnRQdHIgPSBrbWFsbG9jKGxwLT5kZHJTaXplLCBHRlBfQVRPTUlDKTsKICAg ICAgICAKICAgICAgICBpZiAobHAtPmRkclZpcnRQdHIgPT0gMCkKICAgICAgICAgIHJldHVybiAt MTsKCiAgICAgICAgYXRvbWljX3NldCgmbHAtPmF2YWlsU2VuZEJkcywgWEVNX0RGVF9TRU5EX0RF U0MpOwoKCS8qIGNhbGMgc2l6ZSBvZiBzZW5kIGFuZCByZWN2IGRlc2NyaXB0b3Igc3BhY2UgKi8K CXJlY3ZzaXplID0gWEVNX0RGVF9SRUNWX0RFU0MgKiBzaXplb2YgKFhCdWZEZXNjcmlwdG9yKTsK CXNlbmRzaXplID0gWEVNX0RGVF9TRU5EX0RFU0MgKiBzaXplb2YgKFhCdWZEZXNjcmlwdG9yKTsK CglyZWN2cG9vbHB0ciA9IGxwLT5kZXNjX3NwYWNlOwoJc2VuZHBvb2xwdHIgPSAodm9pZCAqKSAo KHUzMikgbHAtPmRlc2Nfc3BhY2UgKyByZWN2c2l6ZSk7CgoJcmVjdnBvb2xwaHkgPSAodm9pZCAq KSBscC0+ZGVzY19zcGFjZV9oYW5kbGU7CglzZW5kcG9vbHBoeSA9ICh2b2lkICopICgodTMyKSBs cC0+ZGVzY19zcGFjZV9oYW5kbGUgKyByZWN2c2l6ZSk7CgoJLyogYWRkIHB0ciB0byBkZXNjcmlw dG9yIHNwYWNlIHRvIHRoZSBkcml2ZXIgKi8KCVhFbWFjX1NldFNnUmVjdlNwYWNlKCZscC0+RW1h YywgcmVjdnBvb2xwdHIsIHJlY3ZzaXplLCByZWN2cG9vbHBoeSk7CglYRW1hY19TZXRTZ1NlbmRT cGFjZSgmbHAtPkVtYWMsIHNlbmRwb29scHRyLCBzZW5kc2l6ZSwgc2VuZHBvb2xwaHkpOwoKCS8q IGFsbG9jYXRlIHNrYidzIGFuZCBnaXZlIHRoZW0gdG8gdGhlIGRtYSBlbmdpbmUgKi8KCWZvciAo aSA9IDA7IGkgPCBYRU1fREZUX1JFQ1ZfREVTQzsgaSsrKSB7CgkJc3RydWN0IHNrX2J1ZmYgKnNr YjsKCQlYQnVmRGVzY3JpcHRvciBiZDsKCQlpbnQgcmVzdWx0OwoJCXUzMiBza2JfdmFkZHIsIGFs aWduOwoKCQlza2IgPSBhbGxvY19za2IoWEVNX01BWF9GUkFNRV9TSVpFICsgQUxJR05NRU5ULCBH RlBfQVRPTUlDKTsKCQlpZiAoc2tiID09IDApIHsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJYWxpZ24g PSBCVUZGRVJfQUxJR04oc2tiLT5kYXRhKTsKCQlpZiAoYWxpZ24pCgkJCXNrYl9yZXNlcnZlKHNr YiwgYWxpZ24pOwoKCQlza2JfdmFkZHIgPSAodTMyKSBwY2lfbWFwX3NpbmdsZShOVUxMLCBza2It PmRhdGEsCgkJCQkJCSBYRU1fTUFYX0ZSQU1FX1NJWkUsCgkJCQkJCSBQQ0lfRE1BX0ZST01ERVZJ Q0UpOwoKCQkvKgoJCSAqIGluaXRpYWxpemUgZGVzY3JpcHRvcnMgYW5kIHNldCBidWZmZXIgYWRk cmVzcwoJCSAqIGJ1ZmZlciBsZW5ndGggZ2V0cyBtYXggZnJhbWUgc2l6ZQoJCSAqLwoJCVhCdWZE ZXNjcmlwdG9yX0luaXRpYWxpemUoJmJkKTsKCQlYQnVmRGVzY3JpcHRvcl9Mb2NrKCZiZCk7CgkJ WEJ1ZkRlc2NyaXB0b3JfU2V0RGVzdEFkZHJlc3MoJmJkLCBza2JfdmFkZHIpOwoJCVhCdWZEZXNj cmlwdG9yX1NldExlbmd0aCgmYmQsIFhFTV9NQVhfRlJBTUVfU0laRSk7CgkJWEJ1ZkRlc2NyaXB0 b3JfU2V0SWQoJmJkLCBza2IpOwoKCQkvKgoJCSAqIGRlc2NyaXB0b3Igd2l0aCBhdHRhY2hlZCBi dWZmZXIgdG8gdGhlIGRyaXZlciBhbmQKCQkgKiBsZXQgaXQgbWFrZSBpdCByZWFkeSBmb3IgZnJh bWUgcmVjZXB0aW9uCgkJICovCgkJcmVzdWx0ID0gWEVtYWNfU2dSZWN2KCZscC0+RW1hYywgJmJk KTsKCQlpZiAocmVzdWx0ICE9IFhTVF9TVUNDRVNTKSB7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJ cmV0dXJuIDA7Cn0KCnZvaWQKZnJlZV9kZXNjcmlwdG9yX3NrYiAoc3RydWN0IG5ldF9kZXZpY2Ug KmRldikKewoJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYt PnByaXY7CglpbnQgaTsKCVhCdWZEZXNjcmlwdG9yKiBCZFB0cjsKCXN0cnVjdCBza19idWZmKiBz a2I7CgoJQmRQdHIgPSAoWEJ1ZkRlc2NyaXB0b3IqKWxwLT5FbWFjLlJlY3ZDaGFubmVsLlZpcnRQ dHI7Cglmb3IgKGk9MDsgaTxYRU1fREZUX1JFQ1ZfREVTQzsgaSsrKSB7CgkJc2tiID0gKHN0cnVj dCBza19idWZmKilYQnVmRGVzY3JpcHRvcl9HZXRJZChCZFB0cik7CgkJcGNpX3VubWFwX3Npbmds ZShOVUxMLCB2aXJ0X3RvX2J1cyhza2ItPmRhdGEpLCBYQnVmRGVzY3JpcHRvcl9HZXRMZW5ndGgo QmRQdHIpLCBQQ0lfRE1BX0ZST01ERVZJQ0UpOwoJCWRldl9rZnJlZV9za2Ioc2tiKTsKCQlCZFB0 ciA9IFBfVE9fVigmbHAtPkVtYWMuUmVjdkNoYW5uZWwsWEJ1ZkRlc2NyaXB0b3JfR2V0TmV4dFB0 cihCZFB0cikpOwoJfQp9CgpzdGF0aWMgdm9pZAp4ZW5ldF9zZXRfbXVsdGljYXN0X2xpc3Qoc3Ry dWN0IG5ldF9kZXZpY2UgKmRldikKewoJc3RydWN0IG5ldF9sb2NhbCAqbHAgPSAoc3RydWN0IG5l dF9sb2NhbCAqKSBkZXYtPnByaXY7Cgl1MzIgT3B0aW9uczsKCWludCByZXQgPSAwOwoJdW5zaWdu ZWQgbG9uZyBmbGFnczsKCgkvKgoJICogWEVtYWNfU3RhcnQsIFhFbWFjX1N0b3AgYW5kIFhFbWFj X1NldE9wdGlvbnMgYXJlIHN1cHBvc2VkIHRvCgkgKiBiZSBwcm90ZWN0ZWQgYnkgYSBzZW1hcGhv cmUuIFdlIGRvIGhhdmUgb25lIGFyZWEgaW4gd2hpY2gKCSAqIHRoaXMgaXMgYSBwcm9ibGVtLgoJ ICoKCSAqIHhlbmV0X3NldF9tdWx0aWNhc3RfbGlzdCgpIGlzIGNhbGxlZCB3aGlsZSB0aGUgbGlu ayBpcyB1cCBhbmQKCSAqIGludGVycnVwdHMgYXJlIGVuYWJsZWQsIHNvIGF0IGFueSBwb2ludCBp biB0aW1lIHdlIGNvdWxkIGdldAoJICogYW4gZXJyb3IgdGhhdCBjYXVzZXMgb3VyIHJlc2V0KCkg dG8gYmUgY2FsbGVkLiAgcmVzZXQoKSBjYWxscwoJICogdGhlIGFmb3JlbWVudGlvbmVkIGZ1bmN0 aW9ucywgYW5kIHdlIG5lZWQgdG8gY2FsbCB0aGVtIGZyb20KCSAqIGhlcmUgYXMgd2VsbC4KCSAq CgkgKiBUaGUgc29sdXRpb24gaXMgdG8gbWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IGludGVy cnVwdHMgb3IKCSAqIHRpbWVycyBwb3BwaW5nIHdoaWxlIHdlIGFyZSBpbiB0aGlzIGZ1bmN0aW9u LgoJICovCiAgICAgICAgc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywgZmxhZ3MpOwoKCWlm ICgocmV0ID0gWEVtYWNfU3RvcCgmbHAtPkVtYWMpKSA9PSBYU1RfU1VDQ0VTUykgewoKCQlPcHRp b25zID0gWEVtYWNfR2V0T3B0aW9ucygmbHAtPkVtYWMpOwoKCQkvKiBDbGVhciBvdXQgdGhlIGJp dHMgd2UgbWF5IHNldC4gKi8KCQlPcHRpb25zICY9IH4oWEVNX1BST01JU0NfT1BUSU9OIHwgWEVN X01VTFRJQ0FTVF9PUFRJT04pOwoKCQlpZiAoZGV2LT5mbGFncyAmIElGRl9QUk9NSVNDKQoJCQlP cHRpb25zIHw9IFhFTV9QUk9NSVNDX09QVElPTjsKI2lmIDAKCQllbHNlIHsKCQkJLyoKCQkJICog U0FBVE9ETzogWGlsaW54IGlzIGdvaW5nIHRvIGFkZCBtdWx0aWNhc3Qgc3VwcG9ydCB0byB0aGVp cgoJCQkgKiBWeFdvcmtzIGFkYXB0ZXIgYW5kIE9TIGluZGVwZW5kZW50IGxheWVyLiAgQWZ0ZXIg dGhhdCBpcwoJCQkgKiBkb25lLCB0aGlzIHNrZWxldG9uIGNvZGUgc2hvdWxkIGJlIGZsZXNoZWQg b3V0LiAgTm90ZSB0aGF0CgkJCSAqIElGRl9NVUxUSUNBU1QgaXMgYmVpbmcgbWFza2VkIG91dCBm cm9tIGRldi0+ZmxhZ3MgaW4gcHJvYmUsCgkJCSAqIHNvIHRoYXQgd2lsbCBuZWVkIHRvIGJlIHJl bW92ZWQgdG8gYWN0dWFsbHkgZG8gbXVsdGlkcm9wLgoJCQkgKi8KCQkJaWYgKChkZXYtPmZsYWdz ICYgSUZGX0FMTE1VTFRJKQoJCQkgICAgfHwgZGV2LT5tY19jb3VudCA+IE1BWF9NVUxUSUNBU1Qg PyA/ID8pIHsKCQkJCXhlbWFjX2dldF9hbGxfbXVsdGljYXN0ID8gPyA/ICgpOwoJCQkJT3B0aW9u cyB8PSBYRU1fTVVMVElDQVNUX09QVElPTjsKCQkJfSBlbHNlIGlmIChkZXYtPm1jX2NvdW50ICE9 IDApIHsKCQkJCXN0cnVjdCBkZXZfbWNfbGlzdCAqbWM7CgoJCQkJWEVtYWNfTXVsdGljYXN0Q2xl YXIoJmxwLT5FbWFjKTsKCQkJCWZvciAobWMgPSBkZXYtPm1jX2xpc3Q7IG1jOyBtYyA9IG1jLT5u ZXh0KQoJCQkJCQlYRW1hY19NdWx0aWNhc3RBZGQoJmxwLT5FbWFjLCBtYy0+ZG1pX2FkZHIpOwoJ CQkJCU9wdGlvbnMgfD0gWEVNX01VTFRJQ0FTVF9PUFRJT047CgkJCX0KCQl9CiNlbmRpZgoKCQkv KgoJCSAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgdGhl IEVNQUMgaXMgYWxyZWFkeQoJCSAqIHN0YXJ0ZWQuICBXZSBrbm93IGl0IGlzbid0IHN0YXJ0ZWQg c28gd2UgY2FuIHNhZmVseSBpZ25vcmUgdGhlCgkJICogcmV0dXJuIHZhbHVlLiAgV2UgY2FzdCBp dCB0byB2b2lkIHRvIG1ha2UgdGhhdCBleHBsaWNpdC4KCQkgKi8KCQkodm9pZCkgWEVtYWNfU2V0 T3B0aW9ucygmbHAtPkVtYWMsIE9wdGlvbnMpOwoKCQkvKgoJCSAqIFhFbWFjX1N0YXJ0IHJldHVy bnMgYW4gZXJyb3Igd2hlbjogaXQgaXMgYWxyZWFkeSBzdGFydGVkLCB0aGUgc2VuZAoJCSAqIGFu ZCByZWNlaXZlIGhhbmRsZXJzIGFyZSBub3Qgc2V0LCBvciBhIHNjYXR0ZXItZ2F0aGVyIERNQSBs aXN0IGlzCgkJICogbWlzc2luZy4gIE5vbmUgb2YgdGhlc2UgY2FuIGhhcHBlbiBhdCB0aGlzIHBv aW50LCBzbyB3ZSBjYXN0IHRoZQoJCSAqIHJldHVybiB0byB2b2lkIHRvIG1ha2UgdGhhdCBleHBs aWNpdC4KCQkgKi8KCQkodm9pZCkgWEVtYWNfU3RhcnQoJmxwLT5FbWFjKTsKCX0KCS8qIEFsbCBk b25lLCBnZXQgdGhvc2UgaW50ZXJydXB0cyBhbmQgdGltZXJzIGdvaW5nIGFnYWluLiAqLwoJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZShyZXNldF9sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbnQKeGVu ZXRfZXRodG9vbF9nZXRfc2V0dGluZ3MgKHN0cnVjdCBuZXRfZGV2aWNlICpkZXYsIHN0cnVjdCBl dGh0b29sX2NtZCogZWNtZCkKewoJaW50IHJldDsKCXN0cnVjdCBuZXRfbG9jYWwgKmxwID0gKHN0 cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJdTMyIG1hY19vcHRpb25zOwoJdTggdGhyZXNo b2xkOwoJdTE2IG1paV9jbWQ7Cgl1MTYgbWlpX3N0YXR1czsKCXUxNiBtaWlfYWR2Q29udHJvbDsK CVhTdGF0dXMgeHM7CgoJbWVtc2V0IChlY21kLCAwLCBzaXplb2Yoc3RydWN0IGV0aHRvb2xfY21k KSk7CgltYWNfb3B0aW9ucyA9IFhFbWFjX0dldE9wdGlvbnMgKCYobHAtPkVtYWMpKTsKCXhzID0g WEVtYWNfUGh5UmVhZCgmbHAtPkVtYWMsIGxwLT5taWlfYWRkciwgTUlJX0JNQ1IsICZtaWlfY21k KTsKCWlmICh4cyAhPSBYU1RfU1VDQ0VTUykgewoJCXByaW50ayhLRVJOX0VSUgoJCSAgICAgICAi JXM6IENvdWxkIG5vdCByZWFkIG1paSBjb21tYW5kIHJlZ2lzdGVyOyBlcnJvciAlZFxuIiwKCQkg ICAgICAgZGV2LT5uYW1lLCB4cyk7CgkJcmV0dXJuIC0xOwoJfQoJeHMgPSBYRW1hY19QaHlSZWFk KCZscC0+RW1hYywgbHAtPm1paV9hZGRyLCBNSUlfQk1TUiwgJm1paV9zdGF0dXMpOwoJaWYgKHhz ICE9IFhTVF9TVUNDRVNTKSB7CgkJcHJpbnRrKEtFUk5fRVJSCgkJICAgICAgICIlczogQ291bGQg bm90IHJlYWQgbWlpIHN0YXR1cyByZWdpc3RlcjsgZXJyb3IgJWRcbiIsCgkJICAgICAgIGRldi0+ bmFtZSwgeHMpOwoJCXJldHVybiAtMTsKCX0KCXhzID0gWEVtYWNfUGh5UmVhZCgmbHAtPkVtYWMs IGxwLT5taWlfYWRkciwgTUlJX0FEVkVSVElTRSwgJm1paV9hZHZDb250cm9sKTsKCWlmICh4cyAh PSBYU1RfU1VDQ0VTUykgewoJCXByaW50ayhLRVJOX0VSUgoJCSAgICAgICAiJXM6IENvdWxkIG5v dCByZWFkIG1paSBhZHZlcnRpc2VtZW50IGNvbnRyb2wgcmVnaXN0ZXI7IGVycm9yICVkXG4iLAoJ CSAgICAgICBkZXYtPm5hbWUsIHhzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKG1hY19vcHRpb25z ICYgWEVNX0ZEVVBMRVhfT1BUSU9OKQoJCWVjbWQtPmR1cGxleCA9IERVUExFWF9GVUxMOwoJZWxz ZQoJCWVjbWQtPmR1cGxleCA9IERVUExFWF9IQUxGOwoJaWYgKG1paV9zdGF0dXMgJiBCTVNSXzEw MEZVTEwpCgkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMDBiYXNlVF9GdWxsOwoJaWYg KG1paV9zdGF0dXMgJiBCTVNSXzEwMEhBTEYpCgkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRF RF8xMDBiYXNlVF9IYWxmOwoJaWYgKG1paV9zdGF0dXMgJiBCTVNSXzEwRlVMTCkKCQllY21kLT5z dXBwb3J0ZWQgfD0gU1VQUE9SVEVEXzEwYmFzZVRfRnVsbDsKCWlmIChtaWlfc3RhdHVzICYgQk1T Ul8xMEhBTEYpCgkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBPUlRFRF8xMGJhc2VUX0hhbGY7Cglp ZiAoWEVtYWNfbUhhc01paSgmKGxwLT5FbWFjKSkpCgkJZWNtZC0+c3VwcG9ydGVkIHw9IFNVUFBP UlRFRF9NSUk7CgllbHNlCgkJZWNtZC0+c3VwcG9ydGVkICY9ICh+U1VQUE9SVEVEX01JSSk7Cglp ZiAobWlpX3N0YXR1cyAmIEJNU1JfQU5FR0NBUEFCTEUpCgkJZWNtZC0+c3VwcG9ydGVkIHw9IFNV UFBPUlRFRF9BdXRvbmVnOwoJaWYgKG1paV9zdGF0dXMgJiBCTVNSX0FORUdDT01QTEVURSkgewoJ CWVjbWQtPmF1dG9uZWcgPSBBVVRPTkVHX0VOQUJMRTsKCQllY21kLT5hZHZlcnRpc2luZyB8PSBB RFZFUlRJU0VEX0F1dG9uZWc7CgkJaWYgKChtaWlfYWR2Q29udHJvbCAmIEFEVkVSVElTRV8xMDBG VUxMKSB8fCAobWlpX2FkdkNvbnRyb2wgJiBBRFZFUlRJU0VfMTAwSEFMRikpCgkJCWVjbWQtPnNw ZWVkID0gU1BFRURfMTAwOwoJCWVsc2UKCQkJZWNtZC0+c3BlZWQgPSBTUEVFRF8xMDsKCX0gZWxz ZSB7CgkJZWNtZC0+YXV0b25lZyA9IEFVVE9ORUdfRElTQUJMRTsKCQlpZiAobWlpX2NtZCAmIEJN Q1JfU1BFRUQxMDApCgkJCWVjbWQtPnNwZWVkID0gU1BFRURfMTAwOwoJCWVsc2UKCQkJZWNtZC0+ c3BlZWQgPSBTUEVFRF8xMDsKCX0KCWlmIChtaWlfYWR2Q29udHJvbCAmIEFEVkVSVElTRV8xMEZV TEwpCgkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMGJhc2VUX0Z1bGw7CglpZiAo bWlpX2FkdkNvbnRyb2wgJiBBRFZFUlRJU0VfMTBIQUxGKQoJCWVjbWQtPmFkdmVydGlzaW5nIHw9 IEFEVkVSVElTRURfMTBiYXNlVF9IYWxmOwoJaWYgKG1paV9hZHZDb250cm9sICYgQURWRVJUSVNF XzEwMEZVTEwpCgkJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9GdWxs OwoJaWYgKG1paV9hZHZDb250cm9sICYgQURWRVJUSVNFXzEwMEhBTEYpCgkJZWNtZC0+YWR2ZXJ0 aXNpbmcgfD0gQURWRVJUSVNFRF8xMDBiYXNlVF9IYWxmOwoJZWNtZC0+YWR2ZXJ0aXNpbmcgfD0g QURWRVJUSVNFRF9NSUk7CgllY21kLT5wb3J0ID0gUE9SVF9NSUk7CgllY21kLT5waHlfYWRkcmVz cyA9IGxwLT5FbWFjLlBoeXNBZGRyZXNzOwoJZWNtZC0+dHJhbnNjZWl2ZXIgPSBYQ1ZSX0lOVEVS TkFMOwoJaWYgKFhFbWFjX21Jc1NnRG1hKCZscC0+RW1hYykpIHsKCQlpZiAoKHJldCA9IFhFbWFj X0dldFBrdFRocmVzaG9sZCgmbHAtPkVtYWMsIFhFTV9TRU5ELCAmdGhyZXNob2xkKSkgPT0gWFNU X1NVQ0NFU1MpIHsKCQkJZWNtZC0+bWF4dHhwa3QgPSB0aHJlc2hvbGQ7CgkJfSBlbHNlCgkJCXJl dHVybiAtRUlPOwoJCWlmICgocmV0ID0gWEVtYWNfR2V0UGt0VGhyZXNob2xkKCZscC0+RW1hYywg WEVNX1JFQ1YsICZ0aHJlc2hvbGQpKSA9PSBYU1RfU1VDQ0VTUykgewoJCQllY21kLT5tYXhyeHBr dCA9IHRocmVzaG9sZDsKCQl9IGVsc2UKCQkJcmV0dXJuIC1FSU87Cgl9CglyZXR1cm4gMDsKfQoK c3RhdGljIGludAp4ZW5ldF9ldGh0b29sX2dldF9jb2FsZXNjZSAoc3RydWN0IG5ldF9kZXZpY2Ug KmRldiwgc3RydWN0IGV0aHRvb2xfY29hbGVzY2UqIGVjKQp7CglpbnQgcmV0OwoJc3RydWN0IG5l dF9sb2NhbCAqbHAgPSAoc3RydWN0IG5ldF9sb2NhbCAqKSBkZXYtPnByaXY7Cgl1OCB0aHJlc2hv bGQ7CgoJbWVtc2V0IChlYywgMCwgc2l6ZW9mKHN0cnVjdCBldGh0b29sX2NvYWxlc2NlKSk7Cglp ZiAoKHJldCA9IFhFbWFjX0dldFBrdFRocmVzaG9sZCgmbHAtPkVtYWMsIFhFTV9SRUNWLCAmdGhy ZXNob2xkKSkgIT0gWFNUX1NVQ0NFU1MpIHsKCQlwcmludGsoS0VSTl9JTkZPICJYRW1hY19HZXRQ a3RUaHJlc2hvbGQgZXJyb3IgJWRcbiIsIHJldCk7CgkJcmV0dXJuIC1FSU87Cgl9CgllYy0+cnhf bWF4X2NvYWxlc2NlZF9mcmFtZXMgPSB0aHJlc2hvbGQ7CglpZiAoKHJldCA9IFhFbWFjX0dldFBr dFdhaXRCb3VuZCAoJmxwLT5FbWFjLCBYRU1fUkVDViwgJihlYy0+cnhfY29hbGVzY2VfdXNlY3Mp KSkgIT0gWFNUX1NVQ0NFU1MpIHsKCQlwcmludGsgKEtFUk5fSU5GTyAiWEVtYWNfR2V0UGt0V2Fp dEJvdW5kIGVycm9yICVkXG4iLCByZXQpOwoJCXJldHVybiAtRUlPOwoJfQoJaWYgKChyZXQgPSBY RW1hY19HZXRQa3RUaHJlc2hvbGQoJmxwLT5FbWFjLCBYRU1fU0VORCwgJnRocmVzaG9sZCkpICE9 IFhTVF9TVUNDRVNTKSB7CgkJcHJpbnRrIChLRVJOX0lORk8gIlhFbWFjX0dldFBrdFRocmVzaG9s ZCBzZW5kIGVycm9yICVkXG4iLCByZXQpOwoJCXJldHVybiAtRUlPOwoJfQoJZWMtPnR4X21heF9j b2FsZXNjZWRfZnJhbWVzID0gdGhyZXNob2xkOyAKCWlmICgocmV0ID0gWEVtYWNfR2V0UGt0V2Fp dEJvdW5kICgmbHAtPkVtYWMsIFhFTV9TRU5ELCAmKGVjLT50eF9jb2FsZXNjZV91c2VjcykpKSAh PSBYU1RfU1VDQ0VTUykgewoJCXByaW50ayAoS0VSTl9JTkZPICJYRW1hY19HZXRQa3RXYWl0Qm91 bmQgc2VuZCBlcnJvciAlZFxuIiwgcmV0KTsKCQlyZXR1cm4gLUVJTzsKCX0KCXJldHVybiAwOwp9 CgpzdGF0aWMgaW50CnhlbmV0X2V0aHRvb2xfc2V0X2NvYWxlc2NlIChzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSogZWMpCnsKCWludCByZXQ7CglzdHJ1Y3Qg bmV0X2xvY2FsICpscCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJaWYg KChyZXQgPSBYRW1hY19TdG9wKCZscC0+RW1hYykpICE9IFhTVF9TVUNDRVNTKQoJCXJldHVybiAt RUlPOwoJaWYgKChyZXQgPSBYRW1hY19TZXRQa3RUaHJlc2hvbGQoJmxwLT5FbWFjLCBYRU1fUkVD ViwgZWMtPnJ4X21heF9jb2FsZXNjZWRfZnJhbWVzKSkgIT0gWFNUX1NVQ0NFU1MpIHsKCQlwcmlu dGsgKEtFUk5fSU5GTyAiWEVtYWNfU2V0UGt0VGhyZXNob2xkIGVycm9yICVkXG4iLCByZXQpOwoJ CXJldHVybiAtRUlPOwoJfSAKCWlmICgocmV0ID0gWEVtYWNfU2V0UGt0V2FpdEJvdW5kICgmbHAt PkVtYWMsIFhFTV9SRUNWLCBlYy0+cnhfY29hbGVzY2VfdXNlY3MpKSAhPSBYU1RfU1VDQ0VTUykg ewoJCXByaW50ayAoS0VSTl9JTkZPICJYRW1hY19TZXRQa3RXYWl0Qm91bmQgZXJyb3IgJWRcbiIs IHJldCk7CgkJcmV0dXJuIC1FSU87Cgl9CglpZiAoKHJldCA9IFhFbWFjX1NldFBrdFRocmVzaG9s ZCgmbHAtPkVtYWMsIFhFTV9TRU5ELCBlYy0+dHhfbWF4X2NvYWxlc2NlZF9mcmFtZXMpKSAhPSBY U1RfU1VDQ0VTUykgewoJCXByaW50ayAoS0VSTl9JTkZPICJYRW1hY19TZXRQa3RUaHJlc2hvbGQg c2VuZCBlcnJvciAlZFxuIiwgcmV0KTsKCQlyZXR1cm4gLUVJTzsKCX0gCglpZiAoKHJldCA9IFhF bWFjX1NldFBrdFdhaXRCb3VuZCAoJmxwLT5FbWFjLCBYRU1fU0VORCwgZWMtPnR4X2NvYWxlc2Nl X3VzZWNzKSkgIT0gWFNUX1NVQ0NFU1MpIHsKCQlwcmludGsgKEtFUk5fSU5GTyAiWEVtYWNfU2V0 UGt0V2FpdEJvdW5kIHNlbmQgZXJyb3IgJWRcbiIsIHJldCk7CgkJcmV0dXJuIC1FSU87Cgl9Cglp ZiAoKHJldCA9IFhFbWFjX1N0YXJ0KCZscC0+RW1hYykpICE9IFhTVF9TVUNDRVNTKQoJCXJldHVy biAtRUlPOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZXNldF9sb2NrLCBmbGFncyk7CglyZXR1 cm4gMDsKfQoKc3RhdGljIGludAp4ZW5ldF9ldGh0b29sX2dldF9kcnZpbmZvIChzdHJ1Y3QgbmV0 X2RldmljZSAqZGV2LCBzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvKiBlZCkKewoJbWVtc2V0IChlZCwg MCwgc2l6ZW9mKHN0cnVjdCBldGh0b29sX2RydmluZm8pKTsKCXN0cmNweSAoZWQtPmRyaXZlciwg RFJJVkVSX05BTUUpOwoJc3RyY3B5IChlZC0+dmVyc2lvbiwgRFJJVkVSX1ZFUlNJT04pOwoJcmV0 dXJuIDA7IAp9CgpzdGF0aWMgaW50CnhlbmV0X2V0aHRvb2xfZ2V0X3JpbmdwYXJhbSAoc3RydWN0 IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtKiBlcnApCnsKCW1lbXNl dCAoZXJwLCAwLCBzaXplb2Yoc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtKSk7CgllcnAtPnJ4X21h eF9wZW5kaW5nID0gWEVNX0RGVF9SRUNWX0RFU0M7CgllcnAtPnR4X21heF9wZW5kaW5nID0gWEVN X0RGVF9TRU5EX0RFU0M7CgllcnAtPnJ4X3BlbmRpbmcgPSBYRU1fREZUX1JFQ1ZfREVTQzsKCWVy cC0+dHhfcGVuZGluZyA9IFhFTV9ERlRfU0VORF9ERVNDOwoJcmV0dXJuIDA7Cn0KCiNkZWZpbmUg RU1BR19SRUdTX04JMzIKc3RydWN0IG1hY19yZWdzRHVtcCB7CglzdHJ1Y3QgZXRodG9vbF9yZWdz IGhkOwoJdTE2IGRhdGFbRU1BR19SRUdTX05dOwp9OwoKc3RhdGljIHZvaWQKeGVuZXRfZXRodG9v bF9nZXRfcmVncyAoc3RydWN0IG5ldF9kZXZpY2UgKmRldiwgc3RydWN0IGV0aHRvb2xfcmVncyog cmVncywgdm9pZCogcmV0KQp7CglzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IChzdHJ1Y3QgbmV0X2xv Y2FsICopIGRldi0+cHJpdjsKCXN0cnVjdCBtYWNfcmVnc0R1bXAqIGR1bXAgPSAoc3RydWN0IG1h Y19yZWdzRHVtcCopcmVnczsKCWludCBpOwoJWFN0YXR1cyByOwoKCWR1bXAtPmhkLnZlcnNpb24g PSAwOwoJZHVtcC0+aGQubGVuID0gRU1BR19SRUdTX04gKiBzaXplb2YoZHVtcC0+ZGF0YSk7Cglm b3IgKGk9MDsgaTxFTUFHX1JFR1NfTjsgaSsrKSB7CgkJaWYgKChyID0gWEVtYWNfUGh5UmVhZCAo JihscC0+RW1hYyksIGxwLT5taWlfYWRkciwgaSwgJihkdW1wLT5kYXRhW2ldKSkpICE9IFhTVF9T VUNDRVNTKSB7CgkJCXByaW50ayAoS0VSTl9JTkZPICJQaHlSZWFkIEVSUk9SICVkXG4iLCByKTsK CQkJKihpbnQqKXJldCA9IC1FSU87CgkJCXJldHVybjsKCQl9Cgl9CgkqKGludCopcmV0ID0gMDsK fQoKc3RhdGljIGludAp4ZW5ldF9kb19ldGh0b29sX2lvY3RsIChzdHJ1Y3QgbmV0X2RldmljZSAq ZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxKQp7CglzdHJ1Y3QgbmV0X2xvY2FsICpscCA9IChzdHJ1Y3Qg bmV0X2xvY2FsICopIGRldi0+cHJpdjsKCXN0cnVjdCBldGh0b29sX2NtZCBlY21kOwoJc3RydWN0 IGV0aHRvb2xfY29hbGVzY2UgZWNvOwoJc3RydWN0IGV0aHRvb2xfZHJ2aW5mbyBlZHJ2OwoJc3Ry dWN0IGV0aHRvb2xfcmluZ3BhcmFtIGVycDsKCXN0cnVjdCBldGh0b29sX3BhdXNlcGFyYW0gZXBw OwoJc3RydWN0IG1hY19yZWdzRHVtcCByZWdzOwoJaW50IHJldCA9IC1FT1BOT1RTVVBQOwoJWFN0 YXR1cyByZXN1bHQ7Cgl1MzIgT3B0aW9uczsKCXUxNiBtaWlfcmVnX3NzZXQ7Cgl1MTYgbWlpX3Jl Z19zcGF1c2U7Cgl1MTYgbWlpX3JlZ19hdXRvbmVnOwoJdTMyIGZsYWdzOwoKCWlmIChjb3B5X2Zy b21fdXNlcigmZWNtZCwgcnEtPmlmcl9kYXRhLCBzaXplb2YgKGVjbWQuY21kKSkpCgkJcmV0dXJu IC1FRkFVTFQ7Cglzd2l0Y2ggKGVjbWQuY21kKSB7CgljYXNlIEVUSFRPT0xfR1NFVDoKCQlyZXQg PSB4ZW5ldF9ldGh0b29sX2dldF9zZXR0aW5ncyhkZXYsICZlY21kKTsKCQlpZiAocmV0ID49IDAp IHsKCQkJaWYgKGNvcHlfdG9fdXNlcihycS0+aWZyX2RhdGEsICZlY21kLCBzaXplb2YgKGVjbWQp KSkKCQkJCXJldCA9IC1FRkFVTFQ7CgkJfQoJCWJyZWFrOwoJY2FzZSBFVEhUT09MX1NTRVQ6CgkJ aWYgKGNvcHlfZnJvbV91c2VyKCZlY21kLCBycS0+aWZyX2RhdGEsIHNpemVvZiAoc3RydWN0IGV0 aHRvb2xfY21kKSkpCgkJCXJldHVybiAtRUZBVUxUOwoJCW1paV9yZWdfc3NldCA9IDA7CgkJaWYg KGVjbWQuc3BlZWQgPT0gU1BFRURfMTAwKQoJCQltaWlfcmVnX3NzZXQgfD0gQk1DUl9TUEVFRDEw MDsKCQlpZiAoZWNtZC5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpCgkJCW1paV9yZWdfc3NldCB8PSBC TUNSX0ZVTExEUExYOwoJCWlmIChlY21kLmF1dG9uZWcgPT0gQVVUT05FR19FTkFCTEUpIHsKCQkJ bWlpX3JlZ19zc2V0IHw9IChCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RBUlQpOwoJCQlzcGlu X2xvY2tfaXJxc2F2ZShyZXNldF9sb2NrLCBmbGFncyk7CgkJCXJlc3VsdCA9IFhFbWFjX1BoeVdy aXRlKCZscC0+RW1hYywgbHAtPm1paV9hZGRyLAoJCQkJCQlNSUlfQk1DUiwgbWlpX3JlZ19zc2V0 KTsKCQkJaWYgKHJlc3VsdCAhPSBYU1RfU1VDQ0VTUykgewoJCQkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZShyZXNldF9sb2NrLCBmbGFncyk7CgkJCQlyZXQgPSAtRUlPOwoJCQkJYnJlYWs7CgkJCX0K CQkJcmVzdWx0ID0gWEVtYWNfUGh5UmVhZCgmbHAtPkVtYWMsIGxwLT5taWlfYWRkciwgTUlJX0FE VkVSVElTRSwgJm1paV9yZWdfc3NldCk7CgkJCWlmIChyZXN1bHQgIT0gWFNUX1NVQ0NFU1MpIHsK CQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJCQkJcmV0ID0g LUVJTzsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChlY21kLnNwZWVkID09IFNQRUVEXzEwMCkgewoJ CQkJaWYgKGVjbWQuZHVwbGV4ID09IERVUExFWF9GVUxMKSB7CgkJCQkJbWlpX3JlZ19zc2V0IHw9 IChBRFZFUlRJU0VfMTBGVUxMIHwgQURWRVJUSVNFXzEwMEZVTEwgfAoJCQkJCQlBRFZFUlRJU0Vf MTBIQUxGIHwgQURWRVJUSVNFXzEwMEhBTEYpOwoJCQkJfSBlbHNlIHsKCQkJCQltaWlfcmVnX3Nz ZXQgfD0gKEFEVkVSVElTRV8xMEhBTEYgfCBBRFZFUlRJU0VfMTAwSEFMRik7CgkJCQkJbWlpX3Jl Z19zc2V0ICY9IH4oQURWRVJUSVNFXzEwRlVMTCB8IEFEVkVSVElTRV8xMDBGVUxMKTsKCQkJCX0K CQkJfSBlbHNlIHsKCQkJCWlmIChlY21kLmR1cGxleCA9PSBEVVBMRVhfRlVMTCkgewoJCQkJCW1p aV9yZWdfc3NldCB8PSAoQURWRVJUSVNFXzEwRlVMTCB8IEFEVkVSVElTRV8xMEhBTEYpOwoJCQkJ CW1paV9yZWdfc3NldCAmPSB+KEFEVkVSVElTRV8xMDBGVUxMfCBBRFZFUlRJU0VfMTAwSEFMRik7 CgkJCQl9IGVsc2UgewoJCQkJCW1paV9yZWdfc3NldCB8PSAoQURWRVJUSVNFXzEwSEFMRik7CgkJ CQkJbWlpX3JlZ19zc2V0ICY9IH4oQURWRVJUSVNFXzEwMEZVTEx8IEFEVkVSVElTRV8xMDBIQUxG IHwgQURWRVJUSVNFXzEwRlVMTCk7CgkJCQl9CgkJCX0KCQkJcmVzdWx0ID0gWEVtYWNfUGh5V3Jp dGUoJmxwLT5FbWFjLCBscC0+bWlpX2FkZHIsIE1JSV9BRFZFUlRJU0UsIG1paV9yZWdfc3NldCk7 CgkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJCQlpZiAocmVz dWx0ICE9IFhTVF9TVUNDRVNTKSB7CgkJCQlyZXQgPSAtRUlPOwoJCQkJYnJlYWs7CgkJCX0KCQl9 IGVsc2UgewoJCQltaWlfcmVnX3NzZXQgJj0gfihCTUNSX0FORU5BQkxFIHwgQk1DUl9BTlJFU1RB UlQpOwoJCQlpZiAoZWNtZC5kdXBsZXggPT0gRFVQTEVYX0ZVTEwpIHsKCQkJCW1paV9yZWdfc3Nl dCB8PSBCTUNSX0ZVTExEUExYOwoJCQl9IGVsc2UgewoJCQkJbWlpX3JlZ19zc2V0ICY9IH5CTUNS X0ZVTExEUExYOwoJCQl9CgkJCWlmIChlY21kLnNwZWVkID09IFNQRUVEXzEwMCkgewoJCQkJbWlp X3JlZ19zc2V0IHw9IEJNQ1JfU1BFRUQxMDA7CgkJCX0gZWxzZSB7CgkJCQltaWlfcmVnX3NzZXQg Jj0gfkJNQ1JfU1BFRUQxMDA7CgkJCX0KCQkJc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywg ZmxhZ3MpOwoJCQlyZXN1bHQgPSBYRW1hY19QaHlXcml0ZSgmbHAtPkVtYWMsIGxwLT5taWlfYWRk ciwKCQkJCQkJTUlJX0JNQ1IsIG1paV9yZWdfc3NldCk7CgkJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJCQlpZiAocmVzdWx0ICE9IFhTVF9TVUNDRVNTKSB7CgkJ CQlyZXQgPSAtRUlPOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJcmV0ID0gMDsKCQlicmVhazsKCWNh c2UgRVRIVE9PTF9HUEFVU0VQQVJBTToKCQlyZXQgPSB4ZW5ldF9ldGh0b29sX2dldF9zZXR0aW5n cyhkZXYsICZlY21kKTsKCQlpZiAocmV0IDwgMCkgewoJCQlicmVhazsKCQl9CgkJZXBwLmNtZCA9 IGVjbWQuY21kOwoJCWVwcC5hdXRvbmVnID0gZWNtZC5hdXRvbmVnOwoJCU9wdGlvbnMgPSBYRW1h Y19HZXRPcHRpb25zKCZscC0+RW1hYyk7CgkJaWYgKE9wdGlvbnMgJiBYRU1fSU5TRVJUX1BBRF9P UFRJT04pIHsKCQkJZXBwLnJ4X3BhdXNlID0gMTsKCQkJZXBwLnR4X3BhdXNlID0gMTsKCQl9IGVs c2UgewoJCQllcHAucnhfcGF1c2UgPSAwOwoJCQllcHAudHhfcGF1c2UgPSAwOwoJCX0KCQlpZiAo Y29weV90b191c2VyKHJxLT5pZnJfZGF0YSwgJmVwcCwgc2l6ZW9mKHN0cnVjdCBldGh0b29sX3Bh dXNlcGFyYW0pKSkKCQkJcmV0ID0gLUVGQVVMVDsKCQllbHNlCgkJCXJldCA9IDA7CgkJYnJlYWs7 CgljYXNlIEVUSFRPT0xfU1BBVVNFUEFSQU06CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZlcHAsIHJx LT5pZnJfZGF0YSwgc2l6ZW9mIChzdHJ1Y3QgZXRodG9vbF9wYXVzZXBhcmFtKSkpCgkJCXJldHVy biAtRUZBVUxUOwoJCXJldCA9IHhlbmV0X2V0aHRvb2xfZ2V0X3NldHRpbmdzKGRldiwgJmVjbWQp OwoJCWlmIChyZXQgPCAwKSB7CgkJCWJyZWFrOwoJCX0KCQllcHAuY21kID0gZWNtZC5jbWQ7CgkJ bWlpX3JlZ19zcGF1c2UgPSAwOwoJCWlmIChlcHAuYXV0b25lZyA9PSBBVVRPTkVHX0VOQUJMRSkg ewoJCQltaWlfcmVnX3NwYXVzZSB8PSAoQk1DUl9BTkVOQUJMRSB8IEJNQ1JfQU5SRVNUQVJUKTsK CQl9IGVsc2UgewoJCQlpZiAoZWNtZC5zcGVlZCA9PSBTUEVFRF8xMDApCgkJCQltaWlfcmVnX3Nw YXVzZSB8PSBCTUNSX1NQRUVEMTAwOwoJCQlpZiAoZWNtZC5kdXBsZXggPT0gRFVQTEVYX0ZVTEwp CgkJCQltaWlfcmVnX3NwYXVzZSB8PSBCTUNSX0ZVTExEUExYOwoJCX0KCQlzcGluX2xvY2tfaXJx c2F2ZShyZXNldF9sb2NrLCBmbGFncyk7CgkJcmVzdWx0ID0gWEVtYWNfUGh5V3JpdGUoJmxwLT5F bWFjLCBscC0+bWlpX2FkZHIsCgkJCQkJTUlJX0JNQ1IsIG1paV9yZWdfc3BhdXNlKTsKCQlzcGlu X3VubG9ja19pcnFyZXN0b3JlKHJlc2V0X2xvY2ssIGZsYWdzKTsKCQlpZiAocmVzdWx0ICE9IFhT VF9TVUNDRVNTKSB7CgkJCXJldCA9IC1FSU87CgkJCWJyZWFrOwoJCX0KCQlpZiAoZXBwLnJ4X3Bh dXNlICE9IGVwcC50eF9wYXVzZSkgewoJCQlyZXQgPSAwOwoJCQlicmVhazsKCQl9IGVsc2UgewoJ CQlzcGluX2xvY2tfaXJxc2F2ZShyZXNldF9sb2NrLCBmbGFncyk7CgkJCSh2b2lkKVhFbWFjX1N0 b3AoJihscC0+RW1hYykpOwoJCQlPcHRpb25zID0gWEVtYWNfR2V0T3B0aW9ucygmbHAtPkVtYWMp OwoJCQlpZiAoZXBwLnJ4X3BhdXNlKQoJCQkJT3B0aW9ucyB8PSBYRU1fSU5TRVJUX1BBRF9PUFRJ T047CgkJCWVsc2UKCQkJCU9wdGlvbnMgJj0gflhFTV9JTlNFUlRfUEFEX09QVElPTjsKCQkJKHZv aWQpWEVtYWNfU2V0T3B0aW9ucygmbHAtPkVtYWMsT3B0aW9ucyk7CgkJCSh2b2lkKVhFbWFjX1N0 YXJ0KCYobHAtPkVtYWMpKTsKCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZXNldF9sb2NrLCBm bGFncyk7CgkJfQoJCXJldCA9IDA7CgkJYnJlYWs7CgljYXNlIEVUSFRPT0xfR0NPQUxFU0NFOgoJ CWVjby5jbWQgPSBlY21kLmNtZDsKCQlyZXQgPSB4ZW5ldF9ldGh0b29sX2dldF9jb2FsZXNjZShk ZXYsICZlY28pOwoJCWlmIChyZXQgPj0gMCkgewoJCQlpZiAoY29weV90b191c2VyKHJxLT5pZnJf ZGF0YSwgJmVjbywgc2l6ZW9mIChzdHJ1Y3QgZXRodG9vbF9jb2FsZXNjZSkpKQoJCQkJcmV0ID0g LUVGQVVMVDsKCQl9CgkJYnJlYWs7CgljYXNlIEVUSFRPT0xfU0NPQUxFU0NFOgoJCWlmIChjb3B5 X2Zyb21fdXNlcigmZWNvLCBycS0+aWZyX2RhdGEsIHNpemVvZiAoc3RydWN0IGV0aHRvb2xfY29h bGVzY2UpKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJcmV0ID0geGVuZXRfZXRodG9vbF9zZXRfY29h bGVzY2UoZGV2LCAmZWNvKTsKCQlicmVhazsKCWNhc2UgRVRIVE9PTF9HRFJWSU5GTzoKCQllZHJ2 LmNtZCA9IGVkcnYuY21kOwoJCXJldCA9IHhlbmV0X2V0aHRvb2xfZ2V0X2RydmluZm8oZGV2LCAm ZWRydik7CgkJaWYgKHJldCA+PSAwKSB7CgkJCWlmIChjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRh LCAmZWRydiwgc2l6ZW9mIChzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvKSkpCgkJCQlyZXQgPSAtRUZB VUxUOwoJCX0KCQlicmVhazsKCWNhc2UgRVRIVE9PTF9HUkVHUzoKCQlyZWdzLmhkLmNtZCA9IGVk cnYuY21kOwoJCXhlbmV0X2V0aHRvb2xfZ2V0X3JlZ3MgKGRldiwgJihyZWdzLmhkKSwgJnJldCk7 CgkJaWYgKHJldCA+PSAwKSB7CgkJCWlmIChjb3B5X3RvX3VzZXIocnEtPmlmcl9kYXRhLCAmcmVn cywgc2l6ZW9mIChzdHJ1Y3QgbWFjX3JlZ3NEdW1wKSkpCgkJCQlyZXQgPSAtRUZBVUxUOwoJCX0K CQlicmVhazsKCWNhc2UgRVRIVE9PTF9HUklOR1BBUkFNOgoJCWVycC5jbWQgPSBlZHJ2LmNtZDsK CQlyZXQgPSB4ZW5ldF9ldGh0b29sX2dldF9yaW5ncGFyYW0gKGRldiwgJihlcnApKTsKCQlpZiAo cmV0ID49IDApIHsKCQkJaWYgKGNvcHlfdG9fdXNlcihycS0+aWZyX2RhdGEsICZlcnAsIHNpemVv ZiAoc3RydWN0IGV0aHRvb2xfcmluZ3BhcmFtKSkpCgkJCQlyZXQgPSAtRUZBVUxUOwoJCX0KCQli cmVhazsKCWNhc2UgRVRIVE9PTF9OV0FZX1JTVDoKCQllcHAuY21kID0gZWNtZC5jbWQ7CgkJbWlp X3JlZ19hdXRvbmVnID0gMDsKCQltaWlfcmVnX2F1dG9uZWcgfD0gKEJNQ1JfQU5FTkFCTEUgfCBC TUNSX0FOUkVTVEFSVCk7CgkJc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJ CXJlc3VsdCA9IFhFbWFjX1BoeVdyaXRlKCZscC0+RW1hYywgbHAtPm1paV9hZGRyLAoJCQkJCU1J SV9CTUNSLCBtaWlfcmVnX2F1dG9uZWcpOwoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUocmVzZXRf bG9jaywgZmxhZ3MpOwoJCWlmIChyZXN1bHQgIT0gWFNUX1NVQ0NFU1MpIHsKCQkJcmV0ID0gLUVJ TzsKCQkJYnJlYWs7CgkJfQoJCXJldCA9IDA7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJyZWFrOwoJ fQoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludAp4ZW5ldF9pb2N0bChzdHJ1Y3QgbmV0X2Rldmlj ZSAqZGV2LCBzdHJ1Y3QgaWZyZXEgKnJxLCBpbnQgY21kKQp7CglzdHJ1Y3QgbmV0X2xvY2FsICps cCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRldi0+cHJpdjsKCS8qIG1paV9pb2N0bF9kYXRhIGhh cyA0IHUxNiBmaWVsZHM6IHBoeV9pZCwgcmVnX251bSwgdmFsX2luICYgdmFsX291dCAqLwoJc3Ry dWN0IG1paV9pb2N0bF9kYXRhICpkYXRhID0gKHN0cnVjdCBtaWlfaW9jdGxfZGF0YSAqKSAmcnEt Pmlmcl9kYXRhOwoJc3RydWN0IHsKCQlfX3U4IHRocmVzaG9sZDsKCQlfX3UzMiBkaXJlY3Rpb247 Cgl9IHRocl9hcmc7CglzdHJ1Y3QgewoJCV9fdTMyIHdhaXRib3VuZDsKCQlfX3UzMiBkaXJlY3Rp b247Cgl9IHdibmRfYXJnIDsKCVhTdGF0dXMgcmV0OwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglY U3RhdHVzIFJlc3VsdDsKCglzd2l0Y2ggKGNtZCkgewoJY2FzZSBTSU9DRVRIVE9PTDoKCQlyZXR1 cm4geGVuZXRfZG9fZXRodG9vbF9pb2N0bChkZXYsIHJxKTsKCWNhc2UgU0lPQ0dNSUlQSFk6CS8q IEdldCBhZGRyZXNzIG9mIE1JSSBQSFkgaW4gdXNlLiAqLwoJY2FzZSBTSU9DREVWUFJJVkFURToJ LyogZm9yIGJpbmFyeSBjb21wYXQsIHJlbW92ZSBpbiAyLjUgKi8KCQlkYXRhLT5waHlfaWQgPSBs cC0+bWlpX2FkZHI7CgkJLyogRmFsbCBUaHJvdWdoICovCgoJY2FzZSBTSU9DR01JSVJFRzoJLyog UmVhZCBNSUkgUEhZIHJlZ2lzdGVyLiAqLwoJY2FzZSBTSU9DREVWUFJJVkFURSArIDE6CS8qIGZv ciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCgkJaWYgKGRhdGEtPnBoeV9pZCA+IDMx IHx8IGRhdGEtPnJlZ19udW0gPiAzMSkKCQkJcmV0dXJuIC1FTlhJTzsKCgkJLyogU3RvcCB0aGUg UEhZIHRpbWVyIHRvIHByZXZlbnQgcmVlbnRyYW5jeS4gKi8KCQlkZWxfdGltZXJfc3luYygmbHAt PnBoeV90aW1lcik7CgkJc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywgZmxhZ3MpOwoJCVJl c3VsdCA9IFhFbWFjX1BoeVJlYWQoJmxwLT5FbWFjLCBkYXRhLT5waHlfaWQsCgkJCQkgICAgICAg ZGF0YS0+cmVnX251bSwgJmRhdGEtPnZhbF9vdXQpOwoJCS8qIFN0YXJ0IHRoZSBQSFkgdGltZXIg dXAgYWdhaW4uICovCgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZShyZXNldF9sb2NrLCBmbGFncyk7 CgkJbHAtPnBoeV90aW1lci5leHBpcmVzID0gamlmZmllcyArIDIgKiBIWjsKCQlhZGRfdGltZXIo JmxwLT5waHlfdGltZXIpOwoKCQlpZiAoUmVzdWx0ICE9IFhTVF9TVUNDRVNTKSB7CgkJCXByaW50 ayhLRVJOX0VSUgoJCQkgICAgICAgIiVzOiBDb3VsZCBub3QgcmVhZCBmcm9tIFBIWSwgZXJyb3I9 JWQuXG4iLAoJCQkgICAgICAgZGV2LT5uYW1lLCBSZXN1bHQpOwoJCQlyZXR1cm4gKFJlc3VsdCA9 PSBYU1RfRU1BQ19NSUlfQlVTWSkgPyAtRUJVU1kgOiAtRUlPOwoJCX0KCQlyZXR1cm4gMDsKCglj YXNlIFNJT0NTTUlJUkVHOgkvKiBXcml0ZSBNSUkgUEhZIHJlZ2lzdGVyLiAqLwoJY2FzZSBTSU9D REVWUFJJVkFURSArIDI6CS8qIGZvciBiaW5hcnkgY29tcGF0LCByZW1vdmUgaW4gMi41ICovCgkJ aWYgKCFjYXBhYmxlKENBUF9ORVRfQURNSU4pKQoJCQlyZXR1cm4gLUVQRVJNOwoKCQlpZiAoZGF0 YS0+cGh5X2lkID4gMzEgfHwgZGF0YS0+cmVnX251bSA+IDMxKQoJCQlyZXR1cm4gLUVOWElPOwoK CQkvKiBTdG9wIHRoZSBQSFkgdGltZXIgdG8gcHJldmVudCByZWVudHJhbmN5LiAqLwoJCWRlbF90 aW1lcl9zeW5jKCZscC0+cGh5X3RpbWVyKTsKCQlzcGluX2xvY2tfaXJxc2F2ZShyZXNldF9sb2Nr LCBmbGFncyk7CgkJUmVzdWx0ID0gWEVtYWNfUGh5V3JpdGUoJmxwLT5FbWFjLCBkYXRhLT5waHlf aWQsCgkJCQkJZGF0YS0+cmVnX251bSwgZGF0YS0+dmFsX2luKTsKCQlzcGluX3VubG9ja19pcnFy ZXN0b3JlKHJlc2V0X2xvY2ssIGZsYWdzKTsKCQkvKiBTdGFydCB0aGUgUEhZIHRpbWVyIHVwIGFn YWluLiAqLwoJCWxwLT5waHlfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyAyICogSFo7CgkJYWRk X3RpbWVyKCZscC0+cGh5X3RpbWVyKTsKCgkJaWYgKFJlc3VsdCAhPSBYU1RfU1VDQ0VTUykgewoJ CQlwcmludGsoS0VSTl9FUlIKCQkJICAgICAgICIlczogQ291bGQgbm90IHdyaXRlIHRvIFBIWSwg ZXJyb3I9JWQuXG4iLAoJCQkgICAgICAgZGV2LT5uYW1lLCBSZXN1bHQpOwoJCQlyZXR1cm4gKFJl c3VsdCA9PSBYU1RfRU1BQ19NSUlfQlVTWSkgPyAtRUJVU1kgOiAtRUlPOwoJCX0KCQlyZXR1cm4g MDsKCgljYXNlIFNJT0NERVZQUklWQVRFICsgMzoJCS8qIHNldCBUSFJFU0hPTEQgKi8KCQlpZiAo Y29weV9mcm9tX3VzZXIoJnRocl9hcmcsIHJxLT5pZnJfZGF0YSwgc2l6ZW9mKHRocl9hcmcpKSkg ewoJCQlyZXR1cm4gLUVGQVVMVDsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywg ZmxhZ3MpOwoJCWlmICgocmV0ID0gWEVtYWNfU3RvcCgmbHAtPkVtYWMpKSAhPSBYU1RfU1VDQ0VT UykgewoJCQlyZXR1cm4gLUVJTzsKCQl9CgkJaWYgKChyZXQgPSBYRW1hY19TZXRQa3RUaHJlc2hv bGQoJmxwLT5FbWFjLCB0aHJfYXJnLmRpcmVjdGlvbiwgdGhyX2FyZy50aHJlc2hvbGQpKSAhPSBY U1RfU1VDQ0VTUykgewoJCQlyZXR1cm4gLUVJTzsKCQl9CgkJaWYgKChyZXQgPSBYRW1hY19TdGFy dCgmbHAtPkVtYWMpKSAhPSBYU1RfU1VDQ0VTUykgewoJCQlyZXR1cm4gLUVJTzsKCQl9CgkJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZShyZXNldF9sb2NrLCBmbGFncyk7CgkJcmV0dXJuIDA7CgoJY2Fz ZSBTSU9DREVWUFJJVkFURSArIDQ6CQkvKiBzZXQgV0FJVEJPVU5EICovCgkJaWYgKGNvcHlfZnJv bV91c2VyKCZ3Ym5kX2FyZywgcnEtPmlmcl9kYXRhLCBzaXplb2Yod2JuZF9hcmcpKSkgewoJCQly ZXR1cm4gLUVGQVVMVDsKCQl9CgkJc3Bpbl9sb2NrX2lycXNhdmUocmVzZXRfbG9jaywgZmxhZ3Mp OwoJCWlmICgocmV0ID0gWEVtYWNfU3RvcCgmbHAtPkVtYWMpKSAhPSBYU1RfU1VDQ0VTUykgewoJ CQlyZXR1cm4gLUVJTzsKCQl9CgkJaWYgKChyZXQgPSBYRW1hY19TZXRQa3RXYWl0Qm91bmQoJmxw LT5FbWFjLCB3Ym5kX2FyZy5kaXJlY3Rpb24sIHdibmRfYXJnLndhaXRib3VuZCkpICE9IFhTVF9T VUNDRVNTKSB7CgkJCXJldHVybiAtRUlPOwoJCX0KCQlpZiAoKHJldCA9IFhFbWFjX1N0YXJ0KCZs cC0+RW1hYykpICE9IFhTVF9TVUNDRVNTKSB7CgkJCXJldHVybiAtRUlPOwoJCX0KCQlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKHJlc2V0X2xvY2ssIGZsYWdzKTsKCQlyZXR1cm4gMDsKCgljYXNlIFNJ T0NERVZQUklWQVRFICsgNToJCS8qIGdldCBUSFJFU0hPTEQgKi8KCQlpZiAoY29weV9mcm9tX3Vz ZXIoJnRocl9hcmcsIHJxLT5pZnJfZGF0YSwgc2l6ZW9mKHRocl9hcmcpKSkgewoJCQlyZXR1cm4g LUVGQVVMVDsKCQl9CgkJaWYgKChyZXQgPSBYRW1hY19HZXRQa3RUaHJlc2hvbGQoJmxwLT5FbWFj LCB0aHJfYXJnLmRpcmVjdGlvbiwgJih0aHJfYXJnLnRocmVzaG9sZCkpKSAhPSBYU1RfU1VDQ0VT UykgewoJCQlyZXR1cm4gLUVJTzsKCQl9CgkJaWYgKGNvcHlfdG9fdXNlcihycS0+aWZyX2RhdGEs ICZ0aHJfYXJnLCBzaXplb2YodGhyX2FyZykpKSB7CgkJCXJldHVybiAtRUZBVUxUOwoJCX0KCQly ZXR1cm4gMDsKCgoJY2FzZSBTSU9DREVWUFJJVkFURSArIDY6CQkvKiBnZXQgV0FJVEJPVU5EICov CgkJaWYgKGNvcHlfZnJvbV91c2VyKCZ3Ym5kX2FyZywgcnEtPmlmcl9kYXRhLCBzaXplb2Yod2Ju ZF9hcmcpKSkgewoJCQlyZXR1cm4gLUVGQVVMVDsKCQl9CgkJaWYgKChyZXQgPSBYRW1hY19HZXRQ a3RXYWl0Qm91bmQoJmxwLT5FbWFjLCB3Ym5kX2FyZy5kaXJlY3Rpb24sICYod2JuZF9hcmcud2Fp dGJvdW5kKSkpICE9IFhTVF9TVUNDRVNTKSB7CgkJCXJldHVybiAtRUlPOwoJCX0KCQlpZiAoY29w eV90b191c2VyKHJxLT5pZnJfZGF0YSwgJndibmRfYXJnLCBzaXplb2Yod2JuZF9hcmcpKSkgewoJ CQlyZXR1cm4gLUVGQVVMVDsKCQl9CgkJcmV0dXJuIDA7CgoJZGVmYXVsdDoKCQlyZXR1cm4gLUVP UE5PVFNVUFA7Cgl9Cn0KCnN0YXRpYyB2b2lkCnJlbW92ZV9oZWFkX2Rldih2b2lkKQp7CglzdHJ1 Y3QgbmV0X2xvY2FsICpscDsKCXN0cnVjdCBuZXRfZGV2aWNlICpkZXY7CglYRW1hY19Db25maWcg KmNmZzsKCgkvKiBQdWxsIHRoZSBoZWFkIG9mZiBvZiBkZXZfbGlzdC4gKi8KCXNwaW5fbG9jaygm ZGV2X2xvY2spOwoJZGV2ID0gZGV2X2xpc3Q7CglscCA9IChzdHJ1Y3QgbmV0X2xvY2FsICopIGRl di0+cHJpdjsKCWRldl9saXN0ID0gbHAtPm5leHRfZGV2OwoJc3Bpbl91bmxvY2soJmRldl9sb2Nr KTsKCgkvKiBQdXQgdGhlIHBoeXNpY2FsIGFkZHJlc3MgYmFjayAqLwoJY2ZnID0gWEVtYWNfR2V0 Q29uZmlnKGxwLT5pbmRleCk7Cglpb3VubWFwKCh2b2lkICopIGNmZy0+QmFzZUFkZHJlc3MpOwoJ Y2ZnLT5CYXNlQWRkcmVzcyA9IGNmZy0+UGh5c0FkZHJlc3M7CgoJLyogRnJlZSB1cCB0aGUgbWVt b3J5LiAqLwoJaWYgKGxwLT5kZXNjX3NwYWNlKQogICAgICAgIHsKCQlmcmVlX2Rlc2NyaXB0b3Jf c2tiKGRldik7CgkJY29uc2lzdGVudF9mcmVlKGxwLT5kZXNjX3NwYWNlKTsKICAgICAgICB9Cgog ICAgICAgIGlmIChscC0+ZGRyVmlydFB0cikgewoJIAlrZnJlZSAobHAtPmRkclZpcnRQdHIpOwoJ fQoKCXVucmVnaXN0ZXJfbmV0ZGV2KGRldik7CglrZnJlZShkZXYpOwp9CgpzdGF0aWMgaW50IF9f aW5pdApwcm9iZShpbnQgaW5kZXgpCnsKCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIHJlbWFw X3NpemUKCSAgICA9IFhQQVJfRU1BQ18wX0hJR0hBRERSIC0gWFBBUl9FTUFDXzBfQkFTRUFERFIg KyAxOwoJc3RydWN0IG5ldF9kZXZpY2UgKmRldjsKCXN0cnVjdCBuZXRfbG9jYWwgKmxwOwoJWEVt YWNfQ29uZmlnICpjZmc7Cgl1bnNpZ25lZCBpbnQgaXJxOwoJdTMyIG1hZGRyOwoKCXN3aXRjaCAo aW5kZXgpIHsKI2lmIGRlZmluZWQoWFBBUl9JTlRDXzBfRU1BQ18wX1ZFQ19JRCkKCWNhc2UgMDoK CQlpcnEgPSAzMSAtIFhQQVJfSU5UQ18wX0VNQUNfMF9WRUNfSUQ7CgkJYnJlYWs7CiNpZiBkZWZp bmVkKFhQQVJfSU5UQ18wX0VNQUNfMV9WRUNfSUQpCgljYXNlIDE6CgkJaXJxID0gMzEgLSBYUEFS X0lOVENfMF9FTUFDXzFfVkVDX0lEOwoJCWJyZWFrOwojaWYgZGVmaW5lZChYUEFSX0lOVENfMF9F TUFDXzJfVkVDX0lEKQoJY2FzZSAyOgoJCWlycSA9IDMxIC0gWFBBUl9JTlRDXzBfRU1BQ18yX1ZF Q19JRDsKCQlicmVhazsKI2lmIGRlZmluZWQoWFBBUl9JTlRDXzBfRU1BQ18zX1ZFQ19JRCkKI2Vy cm9yIEVkaXQgdGhpcyBmaWxlIHRvIGFkZCBtb3JlIGRldmljZXMuCiNlbmRpZgkJCQkvKiAzICov CiNlbmRpZgkJCQkvKiAyICovCiNlbmRpZgkJCQkvKiAxICovCiNlbmRpZgkJCQkvKiAwICovCglk ZWZhdWx0OgoJCXJldHVybiAtRU5PREVWOwoJfQoKCS8qIEZpbmQgdGhlIGNvbmZpZyBmb3Igb3Vy IGRldmljZS4gKi8KCWNmZyA9IFhFbWFjX0dldENvbmZpZyhpbmRleCk7CglpZiAoIWNmZykKCQly ZXR1cm4gLUVOT0RFVjsKCglkZXYgPSBpbml0X2V0aGVyZGV2KDAsIHNpemVvZiAoc3RydWN0IG5l dF9sb2NhbCkpOwoJaWYgKCFkZXYpIHsKCQlwcmludGsoS0VSTl9FUlIgIkNvdWxkIG5vdCBhbGxv Y2F0ZSBYaWxpbnggZW5ldCBkZXZpY2UgJWQuXG4iLAoJCSAgICAgICBpbmRleCk7CgkJcmV0dXJu IC1FTk9NRU07Cgl9CglTRVRfTU9EVUxFX09XTkVSKGRldik7CgoJZXRoZXJfc2V0dXAoZGV2KTsK CWRldi0+aXJxID0gaXJxOwoKCS8qIEluaXRpYWxpemUgb3VyIHByaXZhdGUgZGF0YS4gKi8KCWxw ID0gKHN0cnVjdCBuZXRfbG9jYWwgKikgZGV2LT5wcml2OwoJbWVtc2V0KGxwLCAwLCBzaXplb2Yg KHN0cnVjdCBuZXRfbG9jYWwpKTsKCWxwLT5pbmRleCA9IGluZGV4OwoJbHAtPmRldiA9IGRldjsK CgkvKiBNYWtlIGl0IHRoZSBoZWFkIG9mIGRldl9saXN0LiAqLwoJc3Bpbl9sb2NrKCZkZXZfbG9j ayk7CglscC0+bmV4dF9kZXYgPSBkZXZfbGlzdDsKCWRldl9saXN0ID0gZGV2OwoJc3Bpbl91bmxv Y2soJmRldl9sb2NrKTsKCgkvKiBDaGFuZ2UgdGhlIGFkZHJlc3NlcyB0byBiZSB2aXJ0dWFsICov CgljZmctPlBoeXNBZGRyZXNzID0gY2ZnLT5CYXNlQWRkcmVzczsKCWNmZy0+QmFzZUFkZHJlc3Mg PSAodTMyKSBpb3JlbWFwKGNmZy0+UGh5c0FkZHJlc3MsIHJlbWFwX3NpemUpOwoKCWlmIChYRW1h Y19Jbml0aWFsaXplKCZscC0+RW1hYywgY2ZnLT5EZXZpY2VJZCkgIT0gWFNUX1NVQ0NFU1MpIHsK CQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3QgaW5pdGlhbGl6ZSBkZXZpY2UuXG4iLAoJ CSAgICAgICBkZXYtPm5hbWUpOwoJCXJlbW92ZV9oZWFkX2RldigpOwoJCXJldHVybiAtRU5PREVW OwoJfQoKCW1lbWNweShkZXYtPmRldl9hZGRyLCAoKGJkX3QgKikgX19yZXMpLT5iaV9lbmV0YWRk ciwgNik7CglpZiAoWEVtYWNfU2V0TWFjQWRkcmVzcygmbHAtPkVtYWMsIGRldi0+ZGV2X2FkZHIp ICE9IFhTVF9TVUNDRVNTKSB7CgkJLyogc2hvdWxkIG5vdCBmYWlsIHJpZ2h0IGFmdGVyIGFuIGlu aXRpYWxpemUgKi8KCQlwcmludGsoS0VSTl9FUlIgIiVzOiBDb3VsZCBub3Qgc2V0IE1BQyBhZGRy ZXNzLlxuIiwgZGV2LT5uYW1lKTsKCQlyZW1vdmVfaGVhZF9kZXYoKTsKCQlyZXR1cm4gLUVJTzsK CX0KCglpZiAoWEVtYWNfbUlzU2dEbWEoJmxwLT5FbWFjKSkgewoJCWludCByZXN1bHQ7CgoJCXBy aW50ayhLRVJOX0VSUiAiJXM6IHVzaW5nIHNnRE1BIG1vZGUuXG4iLCBkZXYtPm5hbWUpOwoJCVhF bWFjX1NldFNnUmVjdkhhbmRsZXIoJmxwLT5FbWFjLCBkZXYsIFNnUmVjdkhhbmRsZXIpOwoJCVhF bWFjX1NldFNnU2VuZEhhbmRsZXIoJmxwLT5FbWFjLCBkZXYsIFNnU2VuZEhhbmRsZXIpOwoJCWRl di0+aGFyZF9zdGFydF94bWl0ID0geGVuZXRfU2dTZW5kOwoJCWxwLT5Jc3IgPSBYRW1hY19JbnRy SGFuZGxlckRtYTsKCgkJcmVzdWx0ID0gZGVzY3JpcHRvcl9pbml0KGRldik7CgkJaWYgKHJlc3Vs dCkgewoJCQlyZW1vdmVfaGVhZF9kZXYoKTsKCQkJcmV0dXJuIC1FSU87CgkJfQoKICAgICAgICAg ICAgICAgIC8qIHNldCB0aGUgcGFja2V0IHRocmVzaG9sZCBhbmQgd2FpdGJvdW5kKi8KICAgICAg ICAgICAgICAgIFhFbWFjX1NldFBrdFRocmVzaG9sZCgmbHAtPkVtYWMsIFhFTV9TRU5ELCAzMSk7 CiAgICAgICAgICAgICAgICBYRW1hY19TZXRQa3RUaHJlc2hvbGQoJmxwLT5FbWFjLCBYRU1fUkVD ViwgMzEpOyAgCiAgICAgICAgICAgICAgICAodm9pZCkgWEVtYWNfU2V0UGt0V2FpdEJvdW5kKCZs cC0+RW1hYywgWEVNX1NFTkQsIDUpOwogICAgICAgICAgICAgICAgKHZvaWQpIFhFbWFjX1NldFBr dFdhaXRCb3VuZCgmbHAtPkVtYWMsIFhFTV9SRUNWLCA1KTsKCiAgICAgICAgICAgICAgICAvKiBk aXNhYmxlIFNHRU5EIGludGVycnVwdCAqLwogICAgICAgICAgICAgICAgWEVtYWNfU2V0T3B0aW9u cygmbHAtPkVtYWMsIFhFbWFjX0dldE9wdGlvbnMoJmxwLT5FbWFjKSB8CiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFhFTV9OT19TR0VORF9JTlRfT1BUSU9OKTsKCX0gZWxzZSB7CgkJ cHJpbnRrKEtFUk5fRVJSICIlczogdXNpbmcgZmlmbyBtb2RlLlxuIiwgZGV2LT5uYW1lKTsKCQlY RW1hY19TZXRGaWZvUmVjdkhhbmRsZXIoJmxwLT5FbWFjLCBkZXYsIEZpZm9SZWN2SGFuZGxlcik7 CgkJWEVtYWNfU2V0Rmlmb1NlbmRIYW5kbGVyKCZscC0+RW1hYywgZGV2LCBGaWZvU2VuZEhhbmRs ZXIpOwoJCWRldi0+aGFyZF9zdGFydF94bWl0ID0geGVuZXRfRmlmb1NlbmQ7CgkJbHAtPklzciA9 IFhFbWFjX0ludHJIYW5kbGVyRmlmbzsKCX0KCVhFbWFjX1NldEVycm9ySGFuZGxlcigmbHAtPkVt YWMsIGRldiwgRXJyb3JIYW5kbGVyKTsKCgkvKiBTY2FuIHRvIGZpbmQgdGhlIFBIWS4gKi8KCWxw LT5taWlfYWRkciA9IDB4RkY7Cglmb3IgKG1hZGRyID0gMDsgbWFkZHIgPCAzMTsgbWFkZHIrKykg ewoJCVhTdGF0dXMgUmVzdWx0OwoJCXUxNiByZWc7CgoJCVJlc3VsdCA9IFhFbWFjX1BoeVJlYWQo JmxwLT5FbWFjLCBtYWRkciwgTUlJX0JNQ1IsICZyZWcpOwoJCS8qCgkJICogWEVtYWNfUGh5UmVh ZCBpcyBjdXJyZW50bHkgcmV0dXJuaW5nIFhTVF9TVUNDRVNTIGV2ZW4KCQkgKiB3aGVuIHJlYWRp bmcgZnJvbSBub24tZXhpc3RlbnQgYWRkcmVzc2VzLiAgV29yawoJCSAqIGFyb3VuZCB0aGlzIGJ5 IGRvaW5nIGEgcHJpbWl0aXZlIHZhbGlkYXRpb24gb24gdGhlCgkJICogY29udHJvbCB3b3JkIHdl IGdldCBiYWNrLgoJCSAqLwoJCWlmIChSZXN1bHQgPT0gWFNUX1NVQ0NFU1MgJiYgKHJlZyAmIEJN Q1JfUkVTVikgPT0gMCkgewoJCQlscC0+bWlpX2FkZHIgPSBtYWRkcjsKCQkJYnJlYWs7CgkJfQoJ fQoJaWYgKGxwLT5taWlfYWRkciA9PSAweEZGKSB7CgkJbHAtPm1paV9hZGRyID0gMDsKCQlwcmlu dGsoS0VSTl9XQVJOSU5HCgkJICAgICAgICIlczogTm8gUEhZIGRldGVjdGVkLiAgQXNzdW1pbmcg YSBQSFkgYXQgYWRkcmVzcyAlZC5cbiIsCgkJICAgICAgIGRldi0+bmFtZSwgbHAtPm1paV9hZGRy KTsKCX0KCglkZXYtPm9wZW4gPSB4ZW5ldF9vcGVuOwoJZGV2LT5zdG9wID0geGVuZXRfY2xvc2U7 CglkZXYtPmdldF9zdGF0cyA9IHhlbmV0X2dldF9zdGF0czsKCWRldi0+ZmxhZ3MgJj0gfklGRl9N VUxUSUNBU1Q7CglkZXYtPnNldF9tdWx0aWNhc3RfbGlzdCA9IHhlbmV0X3NldF9tdWx0aWNhc3Rf bGlzdDsKCWRldi0+ZG9faW9jdGwgPSB4ZW5ldF9pb2N0bDsKCWRldi0+dHhfdGltZW91dCA9IHhl bmV0X3R4X3RpbWVvdXQ7CglkZXYtPndhdGNoZG9nX3RpbWVvID0gVFhfVElNRU9VVDsKCiAgICAg ICAgZGV2LT5mZWF0dXJlcyA9IE5FVElGX0ZfU0cgfCBORVRJRl9GX0ZSQUdMSVNUIHwgTkVUSUZf Rl9IV19DU1VNOwoKCXByaW50ayhLRVJOX0lORk8KCSAgICAgICAiJXM6IFhpbGlueCBFTUFDICMl ZCBhdCAweCUwOFggbWFwcGVkIHRvIDB4JTA4WCwgaXJxPSVkXG4iLAoJICAgICAgIGRldi0+bmFt ZSwgaW5kZXgsIGNmZy0+UGh5c0FkZHJlc3MsIGNmZy0+QmFzZUFkZHJlc3MsIGRldi0+aXJxKTsK CgkvKiBwcmludCBoL3cgaWQgICovCgl7CgkJdTMyIGlkID0gWElvX0luMzIoY2ZnLT5CYXNlQWRk cmVzcyArIFhJSUZfVjEyM0JfUkVTRVRSX09GRlNFVCk7CgoJCXByaW50aygiJXM6IGlkICVkLiVk JWM7IGJsb2NrIGlkICVkLCB0eXBlICVkXG4iLAoJCSAgICAgICBkZXYtPm5hbWUsIChpZCA+PiAy OCkgJiAweGYsIChpZCA+PiAyMSkgJiAweDdmLAoJCSAgICAgICAoKGlkID4+IDE2KSAmIDB4MWYp ICsgJ2EnLAoJCSAgICAgICAoaWQgPj4gMTYpICYgMHhmZiwgKGlkID4+IDApICYgMHhmZik7Cgl9 CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19pbml0CnhlbmV0X2luaXQodm9pZCkKewoJaW50 IGluZGV4ID0gMDsKCgl3aGlsZSAocHJvYmUoaW5kZXgrKykgPT0gMCkgOwoJLyogSWYgd2UgZm91 bmQgYXQgbGVhc3Qgb25lLCByZXBvcnQgc3VjY2Vzcy4gKi8KCXJldHVybiAoaW5kZXggPiAxKSA/ IDAgOiAtRU5PREVWOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQKeGVuZXRfY2xlYW51cCh2b2lkKQp7 Cgl3aGlsZSAoZGV2X2xpc3QpCgkJcmVtb3ZlX2hlYWRfZGV2KCk7Cn0KCkVYUE9SVF9OT19TWU1C T0xTOwoKbW9kdWxlX2luaXQoeGVuZXRfaW5pdCk7Cm1vZHVsZV9leGl0KHhlbmV0X2NsZWFudXAp Owo= ------=_Part_12803_12685075.1149743769587--