From mboxrd@z Thu Jan 1 00:00:00 1970 From: Igal.Liberman Subject: [RFC,v2,02/12] soc/fman: Add the FMan FLIB Date: Wed, 1 Apr 2015 14:36:08 +0300 Message-ID: <1427888168-24145-1-git-send-email-igal.liberman@freescale.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Cc: scottwood@freescale.com, Igal Liberman , madalin.bucur@freescale.com To: , , Return-path: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: linuxppc-dev-bounces+glppe-linuxppc-embedded-2=m.gmane.org@lists.ozlabs.org Sender: "Linuxppc-dev" List-Id: netdev.vger.kernel.org RnJvbTogSWdhbCBMaWJlcm1hbiA8SWdhbC5MaWJlcm1hbkBmcmVlc2NhbGUuY29tPgoKVGhlIEZN YW4gRkxpYiBwcm92aWRlcyB0aGUgYmFzaWMgQVBJIHVzZWQgYnkgdGhlIEZNYW4gZHJpdmVycyB0 bwpjb25maWd1cmUgYW5kIGNvbnRyb2wgdGhlIEZNYW4gaGFyZHdhcmUuCgpTaWduZWQtb2ZmLWJ5 OiBJZ2FsIExpYmVybWFuIDxJZ2FsLkxpYmVybWFuQGZyZWVzY2FsZS5jb20+Ci0tLQogZHJpdmVy cy9zb2MvZnNsL0tjb25maWcgICAgICAgfCAgICAyICsKIGRyaXZlcnMvc29jL2ZzbC9NYWtlZmls ZSAgICAgIHwgICAgMiArCiBkcml2ZXJzL3NvYy9mc2wvZm1hbi9LY29uZmlnICB8ICAgIDcgKwog ZHJpdmVycy9zb2MvZnNsL2ZtYW4vTWFrZWZpbGUgfCAgICA1ICsKIGRyaXZlcnMvc29jL2ZzbC9m bWFuL2ZtYW4uYyAgIHwgIDk3OCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKwogNSBmaWxlcyBjaGFuZ2VkLCA5OTQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvc29jL2ZzbC9mbWFuL0tjb25maWcKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL3NvYy9mc2wvZm1hbi9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvc29j L2ZzbC9mbWFuL2ZtYW4uYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL2ZzbC9LY29uZmlnIGIv ZHJpdmVycy9zb2MvZnNsL0tjb25maWcKaW5kZXggMjkxMTIzYS4uMjk4MTMwNiAxMDA2NDQKLS0t IGEvZHJpdmVycy9zb2MvZnNsL0tjb25maWcKKysrIGIvZHJpdmVycy9zb2MvZnNsL0tjb25maWcK QEAgLTE4OSw0ICsxODksNiBAQCBjb25maWcgRlNMX1FNQU5fSU5JVF9USU1FT1VUCiAKIGVuZGlm ICMgRlNMX1FNQU4KIAorc291cmNlICJkcml2ZXJzL3NvYy9mc2wvZm1hbi9LY29uZmlnIgorCiBl bmRpZiAjIEZTTF9EUEEKZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL2ZzbC9NYWtlZmlsZSBiL2Ry aXZlcnMvc29jL2ZzbC9NYWtlZmlsZQppbmRleCBjY2UxZjcwLi5iMmY3NmU5IDEwMDY0NAotLS0g YS9kcml2ZXJzL3NvYy9mc2wvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9zb2MvZnNsL01ha2VmaWxl CkBAIC0xOCwzICsxOCw1IEBAIHFtYW4tdGVzdC15CQkJCQkgPSBxbWFuX3Rlc3QubwogcW1hbi10 ZXN0LSQoQ09ORklHX0ZTTF9RTUFOX1RFU1RfQVBJKQkJKz0gcW1hbl90ZXN0X2FwaS5vCiBxbWFu LXRlc3QtJChDT05GSUdfRlNMX1FNQU5fVEVTVF9TVEFTSCkJCSs9IHFtYW5fdGVzdF9zdGFzaC5v CiBvYmotJChDT05GSUdfRlNMX1FNQU5fREVCVUdGUykJCQkrPSBxbWFuLWRlYnVnZnMubworCitv YmotJChDT05GSUdfRlNMX0ZNQU4pCQkJCSs9IGZtYW4vCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Nv Yy9mc2wvZm1hbi9LY29uZmlnIGIvZHJpdmVycy9zb2MvZnNsL2ZtYW4vS2NvbmZpZwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVhZTI5Ci0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy9zb2MvZnNsL2ZtYW4vS2NvbmZpZwpAQCAtMCwwICsxLDcgQEAKK2NvbmZpZyBGU0xf Rk1BTgorCWJvb2wgIkZNYW4gc3VwcG9ydCIKKwlkZXBlbmRzIG9uIEZTTF9TT0MgfHwgQ09NUElM RV9URVNUCisJZGVmYXVsdCBuCisJaGVscAorCQlGcmVlc2NhbGUgRGF0YS1QYXRoIEFjY2VsZXJh dGlvbiBBcmNoaXRlY3R1cmUgRnJhbWUgTWFuYWdlcgorCQkoRk1hbikgc3VwcG9ydApkaWZmIC0t Z2l0IGEvZHJpdmVycy9zb2MvZnNsL2ZtYW4vTWFrZWZpbGUgYi9kcml2ZXJzL3NvYy9mc2wvZm1h bi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM0ZmJjCi0t LSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb2MvZnNsL2ZtYW4vTWFrZWZpbGUKQEAgLTAsMCAr MSw1IEBACitzdWJkaXItY2NmbGFncy15ICs9IC1JJChzcmN0cmVlKS9kcml2ZXJzL3NvYy9mc2wv Zm1hbi9mbGliCisKK29iai15CQkrPSBmc2xfZm1hbi5vCisKK2ZzbF9mbWFuLW9ianMJCQk6PSBm bWFuLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvc29jL2ZzbC9mbWFuL2ZtYW4uYyBiL2RyaXZlcnMv c29jL2ZzbC9mbWFuL2ZtYW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5k OWVhMWU4Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9zb2MvZnNsL2ZtYW4vZm1hbi5jCkBA IC0wLDAgKzEsOTc4IEBACisvKgorICogQ29weXJpZ2h0IDIwMDggLSAyMDE1IEZyZWVzY2FsZSBT ZW1pY29uZHVjdG9yIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0 OgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo ZSBhYm92ZSBjb3B5cmlnaHQKKyAqCSBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4g YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICoJIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp biB0aGUKKyAqCSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBGcmVl c2NhbGUgU2VtaWNvbmR1Y3RvciBub3IgdGhlCisgKgkgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9y cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAqCSBkZXJpdmVk IGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz c2lvbi4KKyAqCisgKiBBTFRFUk5BVElWRUxZLCB0aGlzIHNvZnR3YXJlIG1heSBiZSBkaXN0cmli dXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSAoIkdQTCIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlv biwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGF0IExpY2Vuc2Ugb3IgKGF0IHlvdXIgb3B0aW9uKSBh bnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC WSBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB TEwgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwg SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB TCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwg T1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQK KyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdB UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisg Ki8KKworI2luY2x1ZGUgImZzbF9mbWFuLmgiCisKK3VpbnQzMl90IGZtYW5fZ2V0X2JtaV9lcnJf ZXZlbnQoc3RydWN0IGZtYW5fYm1pX3JlZ3MgX19pb21lbSAqYm1pX3JnKQoreworCXVpbnQzMl90 IGV2ZW50LCBtYXNrLCBmb3JjZTsKKworCWV2ZW50ID0gaW9yZWFkMzJiZSgmYm1pX3JnLT5mbWJt X2lldnIpOworCW1hc2sgPSBpb3JlYWQzMmJlKCZibWlfcmctPmZtYm1faWVyKTsKKwlldmVudCAm PSBtYXNrOworCS8qIGNsZWFyIHRoZSBmb3JjZWQgZXZlbnRzICovCisJZm9yY2UgPSBpb3JlYWQz MmJlKCZibWlfcmctPmZtYm1faWZyKTsKKwlpZiAoZm9yY2UgJiBldmVudCkKKwkJaW93cml0ZTMy YmUoZm9yY2UgJiB+ZXZlbnQsICZibWlfcmctPmZtYm1faWZyKTsKKwkvKiBjbGVhciB0aGUgYWNr bm93bGVkZ2VkIGV2ZW50cyAqLworCWlvd3JpdGUzMmJlKGV2ZW50LCAmYm1pX3JnLT5mbWJtX2ll dnIpOworCXJldHVybiBldmVudDsKK30KKwordWludDMyX3QgZm1hbl9nZXRfcW1pX2Vycl9ldmVu dChzdHJ1Y3QgZm1hbl9xbWlfcmVncyBfX2lvbWVtICpxbWlfcmcpCit7CisJdWludDMyX3QgZXZl bnQsIG1hc2ssIGZvcmNlOworCisJZXZlbnQgPSBpb3JlYWQzMmJlKCZxbWlfcmctPmZtcW1fZWll KTsKKwltYXNrID0gaW9yZWFkMzJiZSgmcW1pX3JnLT5mbXFtX2VpZW4pOworCWV2ZW50ICY9IG1h c2s7CisKKwkvKiBjbGVhciB0aGUgZm9yY2VkIGV2ZW50cyAqLworCWZvcmNlID0gaW9yZWFkMzJi ZSgmcW1pX3JnLT5mbXFtX2VpZik7CisJaWYgKGZvcmNlICYgZXZlbnQpCisJCWlvd3JpdGUzMmJl KGZvcmNlICYgfmV2ZW50LCAmcW1pX3JnLT5mbXFtX2VpZik7CisJLyogY2xlYXIgdGhlIGFja25v d2xlZGdlZCBldmVudHMgKi8KKwlpb3dyaXRlMzJiZShldmVudCwgJnFtaV9yZy0+Zm1xbV9laWUp OworCXJldHVybiBldmVudDsKK30KKwordWludDMyX3QgZm1hbl9nZXRfZG1hX2NvbV9pZChzdHJ1 Y3QgZm1hbl9kbWFfcmVncyBfX2lvbWVtICpkbWFfcmcpCit7CisJcmV0dXJuIGlvcmVhZDMyYmUo JmRtYV9yZy0+Zm1kbXRjaWQpOworfQorCit1aW50NjRfdCBmbWFuX2dldF9kbWFfYWRkcihzdHJ1 Y3QgZm1hbl9kbWFfcmVncyBfX2lvbWVtICpkbWFfcmcpCit7CisJdWludDY0X3QgYWRkcjsKKwor CWFkZHIgPSAodWludDY0X3QpaW9yZWFkMzJiZSgmZG1hX3JnLT5mbWRtdGFsKTsKKwlhZGRyIHw9 ICgodWludDY0X3QpKGlvcmVhZDMyYmUoJmRtYV9yZy0+Zm1kbXRhaCkpIDw8IDMyKTsKKworCXJl dHVybiBhZGRyOworfQorCit1aW50MzJfdCBmbWFuX2dldF9kbWFfZXJyX2V2ZW50KHN0cnVjdCBm bWFuX2RtYV9yZWdzIF9faW9tZW0gKmRtYV9yZykKK3sKKwl1aW50MzJfdCBzdGF0dXMsIG1hc2s7 CisKKwlzdGF0dXMgPSBpb3JlYWQzMmJlKCZkbWFfcmctPmZtZG1zcik7CisJbWFzayA9IGlvcmVh ZDMyYmUoJmRtYV9yZy0+Zm1kbW1yKTsKKworCS8qIGNsZWFyIERNQV9TVEFUVVNfQlVTX0VSUiBp ZiBtYXNrIGhhcyBubyBETUFfTU9ERV9CRVIgKi8KKwlpZiAoKG1hc2sgJiBETUFfTU9ERV9CRVIp ICE9IERNQV9NT0RFX0JFUikKKwkJc3RhdHVzICY9IH5ETUFfU1RBVFVTX0JVU19FUlI7CisKKwkv KiBjbGVhciByZWxldmFudCBiaXRzIGlmIG1hc2sgaGFzIG5vIERNQV9NT0RFX0VDQyAqLworCWlm ICgobWFzayAmIERNQV9NT0RFX0VDQykgIT0gRE1BX01PREVfRUNDKQorCQlzdGF0dXMgJj0gfihE TUFfU1RBVFVTX0ZNX1NQREFUX0VDQyB8CisJCQkgICAgRE1BX1NUQVRVU19SRUFEX0VDQyB8CisJ CQkgICAgRE1BX1NUQVRVU19TWVNURU1fV1JJVEVfRUNDIHwKKwkJCSAgICBETUFfU1RBVFVTX0ZN X1dSSVRFX0VDQyk7CisKKwkvKiBjbGVhciBzZXQgZXZlbnRzICovCisJaW93cml0ZTMyYmUoc3Rh dHVzLCAmZG1hX3JnLT5mbWRtc3IpOworCisJcmV0dXJuIHN0YXR1czsKK30KKwordWludDMyX3Qg Zm1hbl9nZXRfZnBtX2Vycl9ldmVudChzdHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lvbWVtICpmcG1f cmcpCit7CisJdWludDMyX3QgZXZlbnQ7CisKKwlldmVudCA9IGlvcmVhZDMyYmUoJmZwbV9yZy0+ Zm1mcF9lZSk7CisJLyogY2xlYXIgdGhlIGFsbCBvY2N1cnJlZCBldmVudHMgKi8KKwlpb3dyaXRl MzJiZShldmVudCwgJmZwbV9yZy0+Zm1mcF9lZSk7CisJcmV0dXJuIGV2ZW50OworfQorCit1aW50 MzJfdCBmbWFuX2dldF9tdXJhbV9lcnJfZXZlbnQoc3RydWN0IGZtYW5fZnBtX3JlZ3MgX19pb21l bSAqZnBtX3JnKQoreworCXVpbnQzMl90IGV2ZW50LCBtYXNrOworCisJZXZlbnQgPSBpb3JlYWQz MmJlKCZmcG1fcmctPmZtX3Jjcik7CisJbWFzayA9IGlvcmVhZDMyYmUoJmZwbV9yZy0+Zm1fcmll KTsKKworCS8qIGNsZWFyIE1VUkFNIGV2ZW50IGJpdCAoZG8gbm90IGNsZWFyIElSQU0gZXZlbnQp ICovCisJaW93cml0ZTMyYmUoZXZlbnQgJiB+RlBNX1JBTV9JUkFNX0VDQywgJmZwbV9yZy0+Zm1f cmNyKTsKKworCWlmICgobWFzayAmIEZQTV9NVVJBTV9FQ0NfRVJSX0VYX0VOKSkKKwkJcmV0dXJu IGV2ZW50OworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3VpbnQzMl90IGZtYW5fZ2V0X2lyYW1f ZXJyX2V2ZW50KHN0cnVjdCBmbWFuX2ZwbV9yZWdzIF9faW9tZW0gKmZwbV9yZykKK3sKKwl1aW50 MzJfdCBldmVudCwgbWFzazsKKworCWV2ZW50ID0gaW9yZWFkMzJiZSgmZnBtX3JnLT5mbV9yY3Ip OworCW1hc2sgPSBpb3JlYWQzMmJlKCZmcG1fcmctPmZtX3JpZSk7CisJLyogY2xlYXIgSVJBTSBl dmVudCBiaXQgKGRvIG5vdCBjbGVhciBNVVJBTSBldmVudCkgKi8KKwlpb3dyaXRlMzJiZShldmVu dCAmIH5GUE1fUkFNX01VUkFNX0VDQywgJmZwbV9yZy0+Zm1fcmNyKTsKKworCWlmICgobWFzayAm IEZQTV9JUkFNX0VDQ19FUlJfRVhfRU4pKQorCQlyZXR1cm4gZXZlbnQ7CisJZWxzZQorCQlyZXR1 cm4gMDsKK30KKwordWludDMyX3QgZm1hbl9nZXRfcW1pX2V2ZW50KHN0cnVjdCBmbWFuX3FtaV9y ZWdzIF9faW9tZW0gKnFtaV9yZykKK3sKKwl1aW50MzJfdCBldmVudCwgbWFzaywgZm9yY2U7CisK KwlldmVudCA9IGlvcmVhZDMyYmUoJnFtaV9yZy0+Zm1xbV9pZSk7CisJbWFzayA9IGlvcmVhZDMy YmUoJnFtaV9yZy0+Zm1xbV9pZW4pOworCWV2ZW50ICY9IG1hc2s7CisJLyogY2xlYXIgdGhlIGZv cmNlZCBldmVudHMgKi8KKwlmb3JjZSA9IGlvcmVhZDMyYmUoJnFtaV9yZy0+Zm1xbV9pZik7CisJ aWYgKGZvcmNlICYgZXZlbnQpCisJCWlvd3JpdGUzMmJlKGZvcmNlICYgfmV2ZW50LCAmcW1pX3Jn LT5mbXFtX2lmKTsKKwkvKiBjbGVhciB0aGUgYWNrbm93bGVkZ2VkIGV2ZW50cyAqLworCWlvd3Jp dGUzMmJlKGV2ZW50LCAmcW1pX3JnLT5mbXFtX2llKTsKKwlyZXR1cm4gZXZlbnQ7Cit9CisKK3Zv aWQgZm1hbl9lbmFibGVfdGltZV9zdGFtcChzdHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lvbWVtICpm cG1fcmcsCisJCQkgICAgdWludDhfdCBjb3VudDF1Yml0LCB1aW50MTZfdCBmbV9jbGtfZnJlcSkK K3sKKwl1aW50MzJfdCB0bXA7CisJdWludDY0X3QgZnJhYzsKKwl1aW50MzJfdCBpbnRncjsKKwl1 aW50MzJfdCB0c19mcmVxID0gKHVpbnQzMl90KSgxIDw8IGNvdW50MXViaXQpOwkvKiBpbiBNaHog Ki8KKworCS8qIGNvbmZpZ3VyZSB0aW1lc3RhbXAgc28gdGhhdCBiaXQgOCB3aWxsIGNvdW50IDEg bWljcm9zZWNvbmQKKwkgKiBGaW5kIGVmZmVjdGl2ZSBjb3VudCByYXRlIGF0IFRJTUVTVEFNUCBs ZWFzdCBzaWduaWZpY2FudCBiaXRzOgorCSAqIEVmZmVjdGl2ZV9Db3VudF9SYXRlID0gMU1IeiB4 IDJeOCA9IDI1Nk1IegorCSAqIEZpbmQgZnJlcXVlbmN5IHJhdGlvIGJldHdlZW4gZWZmZWN0aXZl IGNvdW50IHJhdGUgYW5kIHRoZSBjbG9jazoKKwkgKiBFZmZlY3RpdmVfQ291bnRfUmF0ZSAvIENM SyBlLmcuIGZvciA2MDAgTUh6IGNsb2NrOgorCSAqIDI1Ni82MDAgPSAwLjQyNjY2NjYuLi4KKwkg Ki8KKworCWludGdyID0gdHNfZnJlcSAvIGZtX2Nsa19mcmVxOworCS8qIHdlIG11bHRpcGx5IGJ5 IDJeMTYgdG8ga2VlcCB0aGUgZnJhY3Rpb24gb2YgdGhlIGRpdmlzaW9uCisJICogd2UgZG8gbm90 IGRpdiBiYWNrLCBzaW5jZSB3ZSB3cml0ZSB0aGlzIHZhbHVlIGFzIGEgZnJhY3Rpb24KKwkgKiBz ZWUgc3BlYworCSAqLworCisJZnJhYyA9ICgodHNfZnJlcSA8PCAxNikgLSAoaW50Z3IgPDwgMTYp ICogZm1fY2xrX2ZyZXEpIC8gZm1fY2xrX2ZyZXE7CisJLyogd2UgY2hlY2sgcmVtYWluZGVyIG9m IHRoZSBkaXZpc2lvbiBpbiBvcmRlciB0byByb3VuZCB1cCBpZiBub3QgaW50ICovCisJaWYgKCgo dHNfZnJlcSA8PCAxNikgLSAoaW50Z3IgPDwgMTYpICogZm1fY2xrX2ZyZXEpICUgZm1fY2xrX2Zy ZXEpCisJCWZyYWMrKzsKKworCXRtcCA9IChpbnRnciA8PCBGUE1fVFNfSU5UX1NISUZUKSB8ICh1 aW50MTZfdClmcmFjOworCWlvd3JpdGUzMmJlKHRtcCwgJmZwbV9yZy0+Zm1mcF90c2MyKTsKKwor CS8qIGVuYWJsZSB0aW1lc3RhbXAgd2l0aCBvcmlnaW5hbCBjbG9jayAqLworCWlvd3JpdGUzMmJl KEZQTV9UU19DVExfRU4sICZmcG1fcmctPmZtZnBfdHNjMSk7Cit9CisKK3VpbnQzMl90IGZtYW5f Z2V0X2ZwbV9lcnJvcl9pbnRlcnJ1cHRzKHN0cnVjdCBmbWFuX2ZwbV9yZWdzIF9faW9tZW0gKmZw bV9yZykKK3sKKwlyZXR1cm4gaW9yZWFkMzJiZSgmZnBtX3JnLT5mbV9lcGkpOworfQorCitpbnQg Zm1hbl9zZXRfZXJyYXR1bV8xMGdtYWNfYTAwNF93YShzdHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lv bWVtICpmcG1fcmcpCit7CisJaW50IHRpbWVvdXQgPSAxMDA7CisKKwlpb3dyaXRlMzJiZSgweDQw MDAwMDAwLCAmZnBtX3JnLT5mbWZwX2V4dGMpOworCisJd2hpbGUgKChpb3JlYWQzMmJlKCZmcG1f cmctPmZtZnBfZXh0YykgJiAweDQwMDAwMDAwKSAmJiAtLXRpbWVvdXQpCisJCXVzbGVlcF9yYW5n ZSgxMCwgMTEpOworCisJaWYgKCF0aW1lb3V0KQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsK K30KKwordm9pZCBmbWFuX3NldF9vcmRlcl9yZXN0b3JhdGlvbl9wZXJfcG9ydChzdHJ1Y3QgZm1h bl9mcG1fcmVncyBfX2lvbWVtICpmcG1fcmcsCisJCQkJCSB1aW50OF90IHBvcnRfaWQsIGJvb2wg aXNfcnhfcG9ydCkKK3sKKwl1aW50MzJfdCB0bXAgPSAwOworCisJdG1wID0gKHVpbnQzMl90KShw b3J0X2lkIDw8IEZQTV9QT1JUX0ZNX0NUTF9QT1JUSURfU0hJRlQpOworCisJdG1wIHw9IChGUE1f UFJUX0ZNX0NUTDIgfCBGUE1fUFJUX0ZNX0NUTDEpOworCisJLyogb3JkZXIgcmVzdG9yYXRpb24g Ki8KKwlpZiAocG9ydF9pZCAlIDIpCisJCXRtcCB8PSAoRlBNX1BSVF9GTV9DVEwxIDw8IEZQTV9Q UkNfT1JBX0ZNX0NUTF9TRUxfU0hJRlQpOworCWVsc2UKKwkJdG1wIHw9IChGUE1fUFJUX0ZNX0NU TDIgPDwgRlBNX1BSQ19PUkFfRk1fQ1RMX1NFTF9TSElGVCk7CisKKwlpb3dyaXRlMzJiZSh0bXAs ICZmcG1fcmctPmZtZnBfcHJjKTsKK30KKwordWludDhfdCBmbWFuX2dldF9xbWlfZGVxX3RoKHN0 cnVjdCBmbWFuX3FtaV9yZWdzIF9faW9tZW0gKnFtaV9yZykKK3sKKwlyZXR1cm4gKHVpbnQ4X3Qp aW9yZWFkMzJiZSgmcW1pX3JnLT5mbXFtX2djKTsKK30KKwordWludDhfdCBmbWFuX2dldF9xbWlf ZW5xX3RoKHN0cnVjdCBmbWFuX3FtaV9yZWdzIF9faW9tZW0gKnFtaV9yZykKK3sKKwlyZXR1cm4g KHVpbnQ4X3QpKGlvcmVhZDMyYmUoJnFtaV9yZy0+Zm1xbV9nYykgPj4gOCk7Cit9CisKK3ZvaWQg Zm1hbl9zZXRfcW1pX2VucV90aChzdHJ1Y3QgZm1hbl9xbWlfcmVncyBfX2lvbWVtICpxbWlfcmcs IHVpbnQ4X3QgdmFsKQoreworCXVpbnQzMl90IHRtcF9yZWc7CisKKwl0bXBfcmVnID0gaW9yZWFk MzJiZSgmcW1pX3JnLT5mbXFtX2djKTsKKwl0bXBfcmVnICY9IH5RTUlfQ0ZHX0VOUV9NQVNLOwor CXRtcF9yZWcgfD0gKCh1aW50MzJfdCl2YWwgPDwgOCk7CisJaW93cml0ZTMyYmUodG1wX3JlZywg JnFtaV9yZy0+Zm1xbV9nYyk7Cit9CisKK3ZvaWQgZm1hbl9zZXRfcW1pX2RlcV90aChzdHJ1Y3Qg Zm1hbl9xbWlfcmVncyBfX2lvbWVtICpxbWlfcmcsIHVpbnQ4X3QgdmFsKQoreworCXVpbnQzMl90 IHRtcF9yZWc7CisKKwl0bXBfcmVnID0gaW9yZWFkMzJiZSgmcW1pX3JnLT5mbXFtX2djKTsKKwl0 bXBfcmVnICY9IH5RTUlfQ0ZHX0RFUV9NQVNLOworCXRtcF9yZWcgfD0gKHVpbnQzMl90KXZhbDsK Kwlpb3dyaXRlMzJiZSh0bXBfcmVnLCAmcW1pX3JnLT5mbXFtX2djKTsKK30KKwordm9pZCBmbWFu X3NldF9saW9kbl9wZXJfcG9ydChzdHJ1Y3QgZm1hbl9yZyAqZm1hbl9yZywgdWludDhfdCBwb3J0 X2lkLAorCQkJICAgICB1aW50MTZfdCBsaW9kbl9iYXNlLCB1aW50MTZfdCBsaW9kbl9vZnN0KQor eworCXVpbnQzMl90IHRtcDsKKworCS8qIHNldCBMSU9ETiBiYXNlIGZvciB0aGlzIHBvcnQgKi8K Kwl0bXAgPSBpb3JlYWQzMmJlKCZmbWFuX3JnLT5kbWFfcmctPmZtZG1wbHJbcG9ydF9pZCAvIDJd KTsKKwlpZiAocG9ydF9pZCAlIDIpIHsKKwkJdG1wICY9IH5GTV9MSU9ETl9CQVNFX01BU0s7CisJ CXRtcCB8PSAodWludDMyX3QpbGlvZG5fYmFzZTsKKwl9IGVsc2UgeworCQl0bXAgJj0gfihGTV9M SU9ETl9CQVNFX01BU0sgPDwgRE1BX0xJT0ROX1NISUZUKTsKKwkJdG1wIHw9ICh1aW50MzJfdCls aW9kbl9iYXNlIDw8IERNQV9MSU9ETl9TSElGVDsKKwl9CisJaW93cml0ZTMyYmUodG1wLCAmZm1h bl9yZy0+ZG1hX3JnLT5mbWRtcGxyW3BvcnRfaWQgLyAyXSk7CisJaW93cml0ZTMyYmUoKHVpbnQz Ml90KWxpb2RuX29mc3QsCisJCSAgICAmZm1hbl9yZy0+Ym1pX3JnLT5mbWJtX3NwbGlvZG5bcG9y dF9pZCAtIDFdKTsKK30KKworaW50IGZtYW5fcmVzZXRfbWFjKHN0cnVjdCBmbWFuX2ZwbV9yZWdz IF9faW9tZW0gKmZwbV9yZywgdWludDhfdCBtYWNfaWQpCit7CisJdWludDMyX3QgbXNrLCB0aW1l b3V0ID0gMTAwOworCisJLyogR2V0IHRoZSByZWxldmFudCBiaXQgbWFzayAqLworCXN3aXRjaCAo bWFjX2lkKSB7CisJY2FzZSAwOgorCQltc2sgPSBGUE1fUlNUQ19NQUMwX1JFU0VUOworCQlicmVh azsKKwljYXNlIDE6CisJCW1zayA9IEZQTV9SU1RDX01BQzFfUkVTRVQ7CisJCWJyZWFrOworCWNh c2UgMjoKKwkJbXNrID0gRlBNX1JTVENfTUFDMl9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSAzOgor CQltc2sgPSBGUE1fUlNUQ19NQUMzX1JFU0VUOworCQlicmVhazsKKwljYXNlIDQ6CisJCW1zayA9 IEZQTV9SU1RDX01BQzRfUkVTRVQ7CisJCWJyZWFrOworCWNhc2UgNToKKwkJbXNrID0gRlBNX1JT VENfTUFDNV9SRVNFVDsKKwkJYnJlYWs7CisJY2FzZSA2OgorCQltc2sgPSBGUE1fUlNUQ19NQUM2 X1JFU0VUOworCQlicmVhazsKKwljYXNlIDc6CisJCW1zayA9IEZQTV9SU1RDX01BQzdfUkVTRVQ7 CisJCWJyZWFrOworCWNhc2UgODoKKwkJbXNrID0gRlBNX1JTVENfTUFDOF9SRVNFVDsKKwkJYnJl YWs7CisJY2FzZSA5OgorCQltc2sgPSBGUE1fUlNUQ19NQUM5X1JFU0VUOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiByZXNldCAqLworCWlvd3JpdGUz MmJlKG1zaywgJmZwbV9yZy0+Zm1fcnN0Yyk7CisJd2hpbGUgKChpb3JlYWQzMmJlKCZmcG1fcmct PmZtX3JzdGMpICYgbXNrKSAmJiAtLXRpbWVvdXQpCisJCXVzbGVlcF9yYW5nZSgxMCwgMTEpOwor CisJaWYgKCF0aW1lb3V0KQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gMDsKK30KKwordWludDE2 X3QgZm1hbl9nZXRfc2l6ZV9vZl9maWZvKHN0cnVjdCBmbWFuX2JtaV9yZWdzIF9faW9tZW0gKmJt aV9yZywKKwkJCSAgICAgICB1aW50OF90IHBvcnRfaWQpCit7CisJdWludDMyX3QgdG1wX3JlZzsK KworCXRtcF9yZWcgPSBpb3JlYWQzMmJlKCZibWlfcmctPmZtYm1fcGZzW3BvcnRfaWQgLSAxXSk7 CisJcmV0dXJuICh1aW50MTZfdCkoKHRtcF9yZWcgJiBCTUlfRklGT19TSVpFX01BU0spICsgMSk7 Cit9CisKK3VpbnQxNl90IGZtYW5fZ2V0X3NpemVfb2ZfZXh0cmFfZmlmbyhzdHJ1Y3QgZm1hbl9i bWlfcmVncyBfX2lvbWVtICpibWlfcmcsCisJCQkJICAgICB1aW50OF90IHBvcnRfaWQpCit7CisJ dWludDMyX3QgdG1wX3JlZzsKKworCXRtcF9yZWcgPSBpb3JlYWQzMmJlKCZibWlfcmctPmZtYm1f cGZzW3BvcnRfaWQgLSAxXSk7CisJcmV0dXJuICh1aW50MTZfdCkoKHRtcF9yZWcgJiBCTUlfRVhU UkFfRklGT19TSVpFX01BU0spID4+CisJCQkgICBCTUlfRVhUUkFfRklGT19TSVpFX1NISUZUKTsK K30KKwordm9pZCBmbWFuX3NldF9zaXplX29mX2ZpZm8oc3RydWN0IGZtYW5fYm1pX3JlZ3MgX19p b21lbSAqYm1pX3JnLAorCQkJICAgdWludDhfdCBwb3J0X2lkLCB1aW50MzJfdCBzel9maWZvLAor CQkJICAgdWludDMyX3QgZXh0cmFfc3pfZmlmbykKK3sKKwl1aW50MzJfdCB0bXA7CisKKwkvKiBj YWxjdWxhdGUgcmVnICovCisJdG1wID0gKHVpbnQzMl90KSgoc3pfZmlmbyAvIEZNQU5fQk1JX0ZJ Rk9fVU5JVFMgLSAxKSB8CisJCQkgICgoZXh0cmFfc3pfZmlmbyAvIEZNQU5fQk1JX0ZJRk9fVU5J VFMpIDw8CisJCQkgICBCTUlfRVhUUkFfRklGT19TSVpFX1NISUZUKSk7CisJaW93cml0ZTMyYmUo dG1wLCAmYm1pX3JnLT5mbWJtX3Bmc1twb3J0X2lkIC0gMV0pOworfQorCit1aW50OF90IGZtYW5f Z2V0X251bV9vZl90YXNrcyhzdHJ1Y3QgZm1hbl9ibWlfcmVncyBfX2lvbWVtICpibWlfcmcsCisJ CQkgICAgICB1aW50OF90IHBvcnRfaWQpCit7CisJdWludDMyX3QgdG1wOworCisJdG1wID0gaW9y ZWFkMzJiZSgmYm1pX3JnLT5mbWJtX3BwW3BvcnRfaWQgLSAxXSk7CisJcmV0dXJuICh1aW50OF90 KSgoKHRtcCAmIEJNSV9OVU1fT0ZfVEFTS1NfTUFTSykgPj4KKwkJCSAgIEJNSV9OVU1fT0ZfVEFT S1NfU0hJRlQpICsgMSk7Cit9CisKK3VpbnQ4X3QgZm1hbl9nZXRfbnVtX2V4dHJhX3Rhc2tzKHN0 cnVjdCBmbWFuX2JtaV9yZWdzIF9faW9tZW0gKmJtaV9yZywKKwkJCQkgdWludDhfdCBwb3J0X2lk KQoreworCXVpbnQzMl90IHRtcDsKKworCXRtcCA9IGlvcmVhZDMyYmUoJmJtaV9yZy0+Zm1ibV9w cFtwb3J0X2lkIC0gMV0pOworCXJldHVybiAodWludDhfdCkoKHRtcCAmIEJNSV9OVU1fT0ZfRVhU UkFfVEFTS1NfTUFTSykgPj4KKwkJCSAgQk1JX0VYVFJBX05VTV9PRl9UQVNLU19TSElGVCk7Cit9 CisKK3ZvaWQgZm1hbl9zZXRfbnVtX29mX3Rhc2tzKHN0cnVjdCBmbWFuX2JtaV9yZWdzIF9faW9t ZW0gKmJtaV9yZywKKwkJCSAgIHVpbnQ4X3QgcG9ydF9pZCwgdWludDhfdCBudW1fdGFza3MsCisJ CQkgICB1aW50OF90IG51bV9leHRyYV90YXNrcykKK3sKKwl1aW50MzJfdCB0bXA7CisKKwkvKiBj YWxjdWxhdGUgcmVnICovCisJdG1wID0gaW9yZWFkMzJiZSgmYm1pX3JnLT5mbWJtX3BwW3BvcnRf aWQgLSAxXSkgJgorCSAgICB+KEJNSV9OVU1fT0ZfVEFTS1NfTUFTSyB8IEJNSV9OVU1fT0ZfRVhU UkFfVEFTS1NfTUFTSyk7CisJdG1wIHw9ICgodWludDMyX3QpKChudW1fdGFza3MgLSAxKSA8PCBC TUlfTlVNX09GX1RBU0tTX1NISUZUKSB8CisJCSh1aW50MzJfdCkobnVtX2V4dHJhX3Rhc2tzIDw8 IEJNSV9FWFRSQV9OVU1fT0ZfVEFTS1NfU0hJRlQpKTsKKwlpb3dyaXRlMzJiZSh0bXAsICZibWlf cmctPmZtYm1fcHBbcG9ydF9pZCAtIDFdKTsKK30KKwordWludDhfdCBmbWFuX2dldF9udW1fb2Zf ZG1hcyhzdHJ1Y3QgZm1hbl9ibWlfcmVncyBfX2lvbWVtICpibWlfcmcsCisJCQkgICAgIHVpbnQ4 X3QgcG9ydF9pZCkKK3sKKwl1aW50MzJfdCB0bXA7CisKKwl0bXAgPSBpb3JlYWQzMmJlKCZibWlf cmctPmZtYm1fcHBbcG9ydF9pZCAtIDFdKTsKKwlyZXR1cm4gKHVpbnQ4X3QpKCgodG1wICYgQk1J X05VTV9PRl9ETUFTX01BU0spID4+CisJCQkgICBCTUlfTlVNX09GX0RNQVNfU0hJRlQpICsgMSk7 Cit9CisKK3VpbnQ4X3QgZm1hbl9nZXRfbnVtX2V4dHJhX2RtYXMoc3RydWN0IGZtYW5fYm1pX3Jl Z3MgX19pb21lbSAqYm1pX3JnLAorCQkJCXVpbnQ4X3QgcG9ydF9pZCkKK3sKKwl1aW50MzJfdCB0 bXA7CisKKwl0bXAgPSBpb3JlYWQzMmJlKCZibWlfcmctPmZtYm1fcHBbcG9ydF9pZCAtIDFdKTsK KwlyZXR1cm4gKHVpbnQ4X3QpKCh0bXAgJiBCTUlfTlVNX09GX0VYVFJBX0RNQVNfTUFTSykgPj4K KwkJCSAgQk1JX0VYVFJBX05VTV9PRl9ETUFTX1NISUZUKTsKK30KKwordm9pZCBmbWFuX3NldF9u dW1fb2Zfb3Blbl9kbWFzKHN0cnVjdCBmbWFuX2JtaV9yZWdzIF9faW9tZW0gKmJtaV9yZywKKwkJ CSAgICAgICB1aW50OF90IHBvcnRfaWQsIHVpbnQ4X3QgbnVtX29wZW5fZG1hcywKKwkJCSAgICAg ICB1aW50OF90IG51bV9leHRyYV9vcGVuX2RtYXMsCisJCQkgICAgICAgdWludDhfdCB0b3RhbF9u dW1fZG1hcykKK3sKKwl1aW50MzJfdCB0bXAgPSAwOworCisJLyogY2FsY3VsYXRlIHJlZyAqLwor CXRtcCA9IGlvcmVhZDMyYmUoJmJtaV9yZy0+Zm1ibV9wcFtwb3J0X2lkIC0gMV0pICYKKwkgICAg fihCTUlfTlVNX09GX0RNQVNfTUFTSyB8IEJNSV9OVU1fT0ZfRVhUUkFfRE1BU19NQVNLKTsKKwl0 bXAgfD0gKHVpbnQzMl90KSgoKG51bV9vcGVuX2RtYXMgLSAxKSA8PCBCTUlfTlVNX09GX0RNQVNf U0hJRlQpIHwKKwkJCSAgIChudW1fZXh0cmFfb3Blbl9kbWFzIDw8CisJCQkgICAgQk1JX0VYVFJB X05VTV9PRl9ETUFTX1NISUZUKSk7CisJaW93cml0ZTMyYmUodG1wLCAmYm1pX3JnLT5mbWJtX3Bw W3BvcnRfaWQgLSAxXSk7CisKKwkvKiB1cGRhdGUgdG90YWwgbnVtIG9mIERNQSdzIHdpdGggY29t bWl0dGVkIG51bWJlciBvZiBvcGVuIERNQVMsCisJICogYW5kIG1heCB1bmNvbW1pdHRlZCBwb29s LgorCSAqLworCWlmICh0b3RhbF9udW1fZG1hcykgeworCQl0bXAgPSBpb3JlYWQzMmJlKCZibWlf cmctPmZtYm1fY2ZnMikgJiB+Qk1JX0NGRzJfRE1BU19NQVNLOworCQl0bXAgfD0gKHVpbnQzMl90 KSh0b3RhbF9udW1fZG1hcyAtIDEpIDw8IEJNSV9DRkcyX0RNQVNfU0hJRlQ7CisJCWlvd3JpdGUz MmJlKHRtcCwgJmJtaV9yZy0+Zm1ibV9jZmcyKTsKKwl9Cit9CisKKy8qIEFQSSBJbml0IHVuaXQg ZnVuY3Rpb25zICovCisKK3ZvaWQgZm1hbl9kZWZjb25maWcoc3RydWN0IGZtYW5fY2ZnICpjZmcp Cit7CisJbWVtc2V0KGNmZywgMCwgc2l6ZW9mKHN0cnVjdCBmbWFuX2NmZykpOworCisJY2ZnLT5j YXRhc3Ryb3BoaWNfZXJyID0gREVGQVVMVF9DQVRBU1RST1BISUNfRVJSOworCWNmZy0+ZG1hX2Vy ciA9IERFRkFVTFRfRE1BX0VSUjsKKwljZmctPmhhbHRfb25fZXh0ZXJuYWxfYWN0aXYgPSBERUZB VUxUX0hBTFRfT05fRVhURVJOQUxfQUNUSVZBVElPTjsKKwljZmctPmhhbHRfb25fdW5yZWNvdl9l Y2NfZXJyID0gREVGQVVMVF9IQUxUX09OX1VOUkVDT1ZFUkFCTEVfRUNDX0VSUk9SOworCWNmZy0+ ZW5faXJhbV90ZXN0X21vZGUgPSBmYWxzZTsKKwljZmctPmVuX211cmFtX3Rlc3RfbW9kZSA9IGZh bHNlOworCWNmZy0+ZXh0ZXJuYWxfZWNjX3JhbXNfZW5hYmxlID0gREVGQVVMVF9FWFRFUk5BTF9F Q0NfUkFNU19FTkFCTEU7CisKKwljZmctPmRtYV9haWRfb3ZlcnJpZGUgPSBERUZBVUxUX0FJRF9P VkVSUklERTsKKwljZmctPmRtYV9haWRfbW9kZSA9IERFRkFVTFRfQUlEX01PREU7CisJY2ZnLT5k bWFfY29tbV9xdHNoX2Nscl9lbWVyID0gREVGQVVMVF9ETUFfQ09NTV9RX0xPVzsKKwljZmctPmRt YV9jb21tX3F0c2hfYXNydF9lbWVyID0gREVGQVVMVF9ETUFfQ09NTV9RX0hJR0g7CisJY2ZnLT5k bWFfY2FjaGVfb3ZlcnJpZGUgPSBERUZBVUxUX0NBQ0hFX09WRVJSSURFOworCWNmZy0+ZG1hX2Nh bV9udW1fb2ZfZW50cmllcyA9IERFRkFVTFRfRE1BX0NBTV9OVU1fT0ZfRU5UUklFUzsKKwljZmct PmRtYV9kYmdfY250X21vZGUgPSBERUZBVUxUX0RNQV9EQkdfQ05UX01PREU7CisJY2ZnLT5kbWFf ZW5fZW1lcmdlbmN5ID0gREVGQVVMVF9ETUFfRU5fRU1FUkdFTkNZOworCWNmZy0+ZG1hX3Nvc19l bWVyZ2VuY3kgPSBERUZBVUxUX0RNQV9TT1NfRU1FUkdFTkNZOworCWNmZy0+ZG1hX3dhdGNoZG9n ID0gREVGQVVMVF9ETUFfV0FUQ0hET0c7CisJY2ZnLT5kbWFfZW5fZW1lcmdlbmN5X3Ntb290aGVy ID0gREVGQVVMVF9ETUFfRU5fRU1FUkdFTkNZX1NNT09USEVSOworCWNmZy0+ZG1hX2VtZXJnZW5j eV9zd2l0Y2hfY291bnRlciA9CisJICAgIERFRkFVTFRfRE1BX0VNRVJHRU5DWV9TV0lUQ0hfQ09V TlRFUjsKKwljZmctPmRpc3BfbGltaXRfdHNoID0gREVGQVVMVF9ESVNQX0xJTUlUOworCWNmZy0+ cHJzX2Rpc3BfdHNoID0gREVGQVVMVF9QUlNfRElTUF9USDsKKwljZmctPnBsY3JfZGlzcF90c2gg PSBERUZBVUxUX1BMQ1JfRElTUF9USDsKKwljZmctPmtnX2Rpc3BfdHNoID0gREVGQVVMVF9LR19E SVNQX1RIOworCWNmZy0+Ym1pX2Rpc3BfdHNoID0gREVGQVVMVF9CTUlfRElTUF9USDsKKwljZmct PnFtaV9lbnFfZGlzcF90c2ggPSBERUZBVUxUX1FNSV9FTlFfRElTUF9USDsKKwljZmctPnFtaV9k ZXFfZGlzcF90c2ggPSBERUZBVUxUX1FNSV9ERVFfRElTUF9USDsKKwljZmctPmZtX2N0bDFfZGlz cF90c2ggPSBERUZBVUxUX0ZNX0NUTDFfRElTUF9USDsKKwljZmctPmZtX2N0bDJfZGlzcF90c2gg PSBERUZBVUxUX0ZNX0NUTDJfRElTUF9USDsKKworCWNmZy0+cGVkYW50aWNfZG1hID0gZmFsc2U7 CisJY2ZnLT50bnVtX2FnaW5nX3BlcmlvZCA9IERFRkFVTFRfVE5VTV9BR0lOR19QRVJJT0Q7CisJ Y2ZnLT5kbWFfc3RvcF9vbl9idXNfZXJyb3IgPSBmYWxzZTsKKwljZmctPnFtaV9kZXFfb3B0aW9u X3N1cHBvcnQgPSBmYWxzZTsKK30KKworLyogIGZtX2luaXQKKyAqICBJbml0aWFsaXplcyB0aGUg Rk0gbW9kdWxlCisgKiAgaF9mbSAtIEZNIG1vZHVsZSBkZXNjcmlwdG9yCisgKiAgUmV0dXJuCSAg MCBvbiBzdWNjZXNzOyBFcnJvciBjb2RlIG90aGVyd2lzZS4KKyAqLworaW50IGZtYW5fZG1hX2lu aXQoc3RydWN0IGZtYW5fZG1hX3JlZ3MgX19pb21lbSAqZG1hX3JnLCBzdHJ1Y3QgZm1hbl9jZmcg KmNmZykKK3sKKwl1aW50MzJfdCB0bXBfcmVnOworCisJLyogSW5pdCBETUEgUmVnaXN0ZXJzICov CisKKwkvKiBjbGVhciBzdGF0dXMgcmVnIGV2ZW50cyAqLworCXRtcF9yZWcgPSAoRE1BX1NUQVRV U19CVVNfRVJSIHwgRE1BX1NUQVRVU19SRUFEX0VDQyB8CisJCSAgIERNQV9TVEFUVVNfU1lTVEVN X1dSSVRFX0VDQyB8IERNQV9TVEFUVVNfRk1fV1JJVEVfRUNDKTsKKwlpb3dyaXRlMzJiZShpb3Jl YWQzMmJlKCZkbWFfcmctPmZtZG1zcikgfCB0bXBfcmVnLCAmZG1hX3JnLT5mbWRtc3IpOworCisJ LyogY29uZmlndXJlIG1vZGUgcmVnaXN0ZXIgKi8KKwl0bXBfcmVnID0gMDsKKwl0bXBfcmVnIHw9 IGNmZy0+ZG1hX2NhY2hlX292ZXJyaWRlIDw8IERNQV9NT0RFX0NBQ0hFX09SX1NISUZUOworCWlm IChjZmctPmRtYV9haWRfb3ZlcnJpZGUpCisJCXRtcF9yZWcgfD0gRE1BX01PREVfQUlEX09SOwor CWlmIChjZmctPmV4Y2VwdGlvbnMgJiBGTUFOX0VYX0RNQV9CVVNfRVJST1IpCisJCXRtcF9yZWcg fD0gRE1BX01PREVfQkVSOworCWlmICgoY2ZnLT5leGNlcHRpb25zICYgRk1BTl9FWF9ETUFfU1lT VEVNX1dSSVRFX0VDQykgfAorCSAgICAoY2ZnLT5leGNlcHRpb25zICYgRk1BTl9FWF9ETUFfUkVB RF9FQ0MpIHwKKwkgICAgKGNmZy0+ZXhjZXB0aW9ucyAmIEZNQU5fRVhfRE1BX0ZNX1dSSVRFX0VD QykpCisJCXRtcF9yZWcgfD0gRE1BX01PREVfRUNDOworCWlmIChjZmctPmRtYV9zdG9wX29uX2J1 c19lcnJvcikKKwkJdG1wX3JlZyB8PSBETUFfTU9ERV9TQkVSOworCWlmIChjZmctPmRtYV9heGlf ZGJnX251bV9vZl9iZWF0cykKKwkJdG1wX3JlZyB8PSAodWludDMyX3QpKERNQV9NT0RFX0FYSV9E QkdfTUFTSyAmCisJCQkJICAgICAgICgoY2ZnLT5kbWFfYXhpX2RiZ19udW1fb2ZfYmVhdHMgLQor CQkJCQkgMSkgPDwgRE1BX01PREVfQVhJX0RCR19TSElGVCkpOworCisJaWYgKGNmZy0+ZG1hX2Vu X2VtZXJnZW5jeSkgeworCQl0bXBfcmVnIHw9IGNmZy0+ZG1hX2VtZXJnZW5jeV9idXNfc2VsZWN0 OworCQl0bXBfcmVnIHw9IGNmZy0+ZG1hX2VtZXJnZW5jeV9sZXZlbCA8PCBETUFfTU9ERV9FTUVS X0xWTF9TSElGVDsKKwkJaWYgKGNmZy0+ZG1hX2VuX2VtZXJnZW5jeV9zbW9vdGhlcikKKwkJCWlv d3JpdGUzMmJlKGNmZy0+ZG1hX2VtZXJnZW5jeV9zd2l0Y2hfY291bnRlciwKKwkJCQkgICAgJmRt YV9yZy0+Zm1kbWVtc3IpOworCX0KKwl0bXBfcmVnIHw9ICgoY2ZnLT5kbWFfY2FtX251bV9vZl9l bnRyaWVzIC8gRE1BX0NBTV9VTklUUykgLSAxKSA8PAorCSAgICBETUFfTU9ERV9DRU5fU0hJRlQ7 CisJdG1wX3JlZyB8PSBETUFfTU9ERV9TRUNVUkVfUFJPVDsKKwl0bXBfcmVnIHw9IGNmZy0+ZG1h X2RiZ19jbnRfbW9kZSA8PCBETUFfTU9ERV9EQkdfU0hJRlQ7CisJdG1wX3JlZyB8PSBjZmctPmRt YV9haWRfbW9kZSA8PCBETUFfTU9ERV9BSURfTU9ERV9TSElGVDsKKworCWlmIChjZmctPnBlZGFu dGljX2RtYSkKKwkJdG1wX3JlZyB8PSBETUFfTU9ERV9FTUVSX1JFQUQ7CisKKwlpb3dyaXRlMzJi ZSh0bXBfcmVnLCAmZG1hX3JnLT5mbWRtbXIpOworCisJLyogY29uZmlndXJlIHRocmVzaG9sZHMg cmVnaXN0ZXIgKi8KKwl0bXBfcmVnID0gKCh1aW50MzJfdCljZmctPmRtYV9jb21tX3F0c2hfYXNy dF9lbWVyIDw8CisJCSAgIERNQV9USFJFU0hfQ09NTVFfU0hJRlQpIHwKKwkgICAgKCh1aW50MzJf dCljZmctPmRtYV9yZWFkX2J1Zl90c2hfYXNydF9lbWVyIDw8CisJICAgICBETUFfVEhSRVNIX1JF QURfSU5UX0JVRl9TSElGVCkgfAorCSAgICAoKHVpbnQzMl90KWNmZy0+ZG1hX3dyaXRlX2J1Zl90 c2hfYXNydF9lbWVyKTsKKworCWlvd3JpdGUzMmJlKHRtcF9yZWcsICZkbWFfcmctPmZtZG10cik7 CisKKwkvKiBjb25maWd1cmUgaHlzdGVyZXNpcyByZWdpc3RlciAqLworCXRtcF9yZWcgPSAoKHVp bnQzMl90KWNmZy0+ZG1hX2NvbW1fcXRzaF9jbHJfZW1lciA8PAorCQkgICBETUFfVEhSRVNIX0NP TU1RX1NISUZUKSB8CisJICAgICgodWludDMyX3QpY2ZnLT5kbWFfcmVhZF9idWZfdHNoX2Nscl9l bWVyIDw8CisJICAgICBETUFfVEhSRVNIX1JFQURfSU5UX0JVRl9TSElGVCkgfAorCSAgICAoKHVp bnQzMl90KWNmZy0+ZG1hX3dyaXRlX2J1Zl90c2hfY2xyX2VtZXIpOworCisJaW93cml0ZTMyYmUo dG1wX3JlZywgJmRtYV9yZy0+Zm1kbWh5KTsKKworCS8qIGNvbmZpZ3VyZSBlbWVyZ2VuY3kgdGhy ZXNob2xkICovCisJaW93cml0ZTMyYmUoY2ZnLT5kbWFfc29zX2VtZXJnZW5jeSwgJmRtYV9yZy0+ Zm1kbXNldHIpOworCisJLyogY29uZmlndXJlIFdhdGNoZG9nICovCisJaW93cml0ZTMyYmUoKGNm Zy0+ZG1hX3dhdGNoZG9nICogY2ZnLT5jbGtfZnJlcSksICZkbWFfcmctPmZtZG13Y3IpOworCisJ aW93cml0ZTMyYmUoY2ZnLT5jYW1fYmFzZV9hZGRyLCAmZG1hX3JnLT5mbWRtZWJjcik7CisKKwly ZXR1cm4gMDsKK30KKworaW50IGZtYW5fZnBtX2luaXQoc3RydWN0IGZtYW5fZnBtX3JlZ3MgX19p b21lbSAqZnBtX3JnLCBzdHJ1Y3QgZm1hbl9jZmcgKmNmZykKK3sKKwl1aW50MzJfdCB0bXBfcmVn OworCWludCBpOworCisJLyogSW5pdCBGUE0gUmVnaXN0ZXJzICovCisKKwl0bXBfcmVnID0gKHVp bnQzMl90KShjZmctPmRpc3BfbGltaXRfdHNoIDw8IEZQTV9ESVNQX0xJTUlUX1NISUZUKTsKKwlp b3dyaXRlMzJiZSh0bXBfcmVnLCAmZnBtX3JnLT5mbWZwX214ZCk7CisKKwl0bXBfcmVnID0gKCgo dWludDMyX3QpY2ZnLT5wcnNfZGlzcF90c2ggPDwgRlBNX1RIUjFfUFJTX1NISUZUKSB8CisJCSAg ICgodWludDMyX3QpY2ZnLT5rZ19kaXNwX3RzaCA8PCBGUE1fVEhSMV9LR19TSElGVCkgfAorCQkg ICAoKHVpbnQzMl90KWNmZy0+cGxjcl9kaXNwX3RzaCA8PCBGUE1fVEhSMV9QTENSX1NISUZUKSB8 CisJCSAgICgodWludDMyX3QpY2ZnLT5ibWlfZGlzcF90c2ggPDwgRlBNX1RIUjFfQk1JX1NISUZU KSk7CisJaW93cml0ZTMyYmUodG1wX3JlZywgJmZwbV9yZy0+Zm1mcF9kaXN0MSk7CisKKwl0bXBf cmVnID0KKwkJKCgodWludDMyX3QpY2ZnLT5xbWlfZW5xX2Rpc3BfdHNoIDw8IEZQTV9USFIyX1FN SV9FTlFfU0hJRlQpIHwKKwkJICgodWludDMyX3QpY2ZnLT5xbWlfZGVxX2Rpc3BfdHNoIDw8IEZQ TV9USFIyX1FNSV9ERVFfU0hJRlQpIHwKKwkJICgodWludDMyX3QpY2ZnLT5mbV9jdGwxX2Rpc3Bf dHNoIDw8IEZQTV9USFIyX0ZNX0NUTDFfU0hJRlQpIHwKKwkJICgodWludDMyX3QpY2ZnLT5mbV9j dGwyX2Rpc3BfdHNoIDw8IEZQTV9USFIyX0ZNX0NUTDJfU0hJRlQpKTsKKwlpb3dyaXRlMzJiZSh0 bXBfcmVnLCAmZnBtX3JnLT5mbWZwX2Rpc3QyKTsKKworCS8qIGRlZmluZSBleGNlcHRpb25zIGFu ZCBlcnJvciBiZWhhdmlvciAqLworCXRtcF9yZWcgPSAwOworCS8qIENsZWFyIGV2ZW50cyAqLwor CXRtcF9yZWcgfD0gKEZQTV9FVl9NQVNLX1NUQUxMIHwgRlBNX0VWX01BU0tfRE9VQkxFX0VDQyB8 CisJCSAgICBGUE1fRVZfTUFTS19TSU5HTEVfRUNDKTsKKwkvKiBlbmFibGUgaW50ZXJydXB0cyAq LworCWlmIChjZmctPmV4Y2VwdGlvbnMgJiBGTUFOX0VYX0ZQTV9TVEFMTF9PTl9UQVNLUykKKwkJ dG1wX3JlZyB8PSBGUE1fRVZfTUFTS19TVEFMTF9FTjsKKwlpZiAoY2ZnLT5leGNlcHRpb25zICYg Rk1BTl9FWF9GUE1fU0lOR0xFX0VDQykKKwkJdG1wX3JlZyB8PSBGUE1fRVZfTUFTS19TSU5HTEVf RUNDX0VOOworCWlmIChjZmctPmV4Y2VwdGlvbnMgJiBGTUFOX0VYX0ZQTV9ET1VCTEVfRUNDKQor CQl0bXBfcmVnIHw9IEZQTV9FVl9NQVNLX0RPVUJMRV9FQ0NfRU47CisJdG1wX3JlZyB8PSAoY2Zn LT5jYXRhc3Ryb3BoaWNfZXJyIDw8IEZQTV9FVl9NQVNLX0NBVF9FUlJfU0hJRlQpOworCXRtcF9y ZWcgfD0gKGNmZy0+ZG1hX2VyciA8PCBGUE1fRVZfTUFTS19ETUFfRVJSX1NISUZUKTsKKwlpZiAo IWNmZy0+aGFsdF9vbl9leHRlcm5hbF9hY3RpdikKKwkJdG1wX3JlZyB8PSBGUE1fRVZfTUFTS19F WFRFUk5BTF9IQUxUOworCWlmICghY2ZnLT5oYWx0X29uX3VucmVjb3ZfZWNjX2VycikKKwkJdG1w X3JlZyB8PSBGUE1fRVZfTUFTS19FQ0NfRVJSX0hBTFQ7CisJaW93cml0ZTMyYmUodG1wX3JlZywg JmZwbV9yZy0+Zm1mcF9lZSk7CisKKwkvKiBjbGVhciBhbGwgZm1DdGxzIGV2ZW50IHJlZ2lzdGVy cyAqLworCWZvciAoaSA9IDA7IGkgPCBjZmctPm51bV9vZl9mbWFuX2N0cmxfZXZudF9yZWdzOyBp KyspCisJCWlvd3JpdGUzMmJlKDB4RkZGRkZGRkYsICZmcG1fcmctPmZtZnBfY2V2W2ldKTsKKwor CS8qIFJBTSBFQ0MgLSAgZW5hYmxlIGFuZCBjbGVhciBldmVudHMgKi8KKwkvKiBmaXJzdCB3ZSBu ZWVkIHRvIGNsZWFyIGFsbCBwYXJzZXIgbWVtb3J5LAorCSAqIGFzIGl0IGlzIHVuaW5pdGlhbGl6 ZWQgYW5kIG1heSBjYXVzZSBFQ0MgZXJyb3JzCisJICovCisJLyogZXZlbnQgYml0cyAqLworCXRt cF9yZWcgPSAoRlBNX1JBTV9NVVJBTV9FQ0MgfCBGUE1fUkFNX0lSQU1fRUNDKTsKKwkvKiBSYW1z IGVuYWJsZSBub3QgZWZmZWN0ZWQgYnkgUkNSIGJpdCwKKwkgKiBidXQgYnkgYSBDT1AgY29uZmln dXJhdGlvbgorCSAqLworCWlmIChjZmctPmV4dGVybmFsX2VjY19yYW1zX2VuYWJsZSkKKwkJdG1w X3JlZyB8PSBGUE1fUkFNX1JBTVNfRUNDX0VOX1NSQ19TRUw7CisKKwkvKiBlbmFibGUgdGVzdCBt b2RlICovCisJaWYgKGNmZy0+ZW5fbXVyYW1fdGVzdF9tb2RlKQorCQl0bXBfcmVnIHw9IEZQTV9S QU1fTVVSQU1fVEVTVF9FQ0M7CisJaWYgKGNmZy0+ZW5faXJhbV90ZXN0X21vZGUpCisJCXRtcF9y ZWcgfD0gRlBNX1JBTV9JUkFNX1RFU1RfRUNDOworCWlvd3JpdGUzMmJlKHRtcF9yZWcsICZmcG1f cmctPmZtX3Jjcik7CisKKwl0bXBfcmVnID0gMDsKKwlpZiAoY2ZnLT5leGNlcHRpb25zICYgRk1B Tl9FWF9JUkFNX0VDQykgeworCQl0bXBfcmVnIHw9IEZQTV9JUkFNX0VDQ19FUlJfRVhfRU47CisJ CWZtYW5fZW5hYmxlX3JhbXNfZWNjKGZwbV9yZyk7CisJfQorCWlmIChjZmctPmV4Y2VwdGlvbnMg JiBGTUFOX0VYX05VUkFNX0VDQykgeworCQl0bXBfcmVnIHw9IEZQTV9NVVJBTV9FQ0NfRVJSX0VY X0VOOworCQlmbWFuX2VuYWJsZV9yYW1zX2VjYyhmcG1fcmcpOworCX0KKwlpb3dyaXRlMzJiZSh0 bXBfcmVnLCAmZnBtX3JnLT5mbV9yaWUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBmbWFuX2Jt aV9pbml0KHN0cnVjdCBmbWFuX2JtaV9yZWdzIF9faW9tZW0gKmJtaV9yZywgc3RydWN0IGZtYW5f Y2ZnICpjZmcpCit7CisJdWludDMyX3QgdG1wX3JlZzsKKworCS8qIEluaXQgQk1JIFJlZ2lzdGVy cyAqLworCisJLyogZGVmaW5lIGNvbW1vbiByZXNvdXJjZXMgKi8KKwl0bXBfcmVnID0gY2ZnLT5m aWZvX2Jhc2VfYWRkcjsKKwl0bXBfcmVnID0gdG1wX3JlZyAvIEJNSV9GSUZPX0FMSUdOOworCisJ dG1wX3JlZyB8PSAoKGNmZy0+dG90YWxfZmlmb19zaXplIC8gRk1BTl9CTUlfRklGT19VTklUUyAt IDEpIDw8CisJCSAgICBCTUlfQ0ZHMV9GSUZPX1NJWkVfU0hJRlQpOworCWlvd3JpdGUzMmJlKHRt cF9yZWcsICZibWlfcmctPmZtYm1fY2ZnMSk7CisKKwl0bXBfcmVnID0gKCh1aW50MzJfdCkoY2Zn LT50b3RhbF9udW1fb2ZfdGFza3MgLSAxKSA8PAorCQkgICBCTUlfQ0ZHMl9UQVNLU19TSElGVCk7 CisJLyogbnVtIG9mIERNQSdzIHdpbGwgYmUgZHluYW1pY2FsbHkgdXBkYXRlZCB3aGVuIGVhY2gg cG9ydCBpcyBzZXQgKi8KKwlpb3dyaXRlMzJiZSh0bXBfcmVnLCAmYm1pX3JnLT5mbWJtX2NmZzIp OworCisJLyogZGVmaW5lIHVubWFza2FibGUgZXhjZXB0aW9ucywgZW5hYmxlIGFuZCBjbGVhciBl dmVudHMgKi8KKwl0bXBfcmVnID0gMDsKKwlpb3dyaXRlMzJiZShCTUlfRVJSX0lOVFJfRU5fTElT VF9SQU1fRUNDIHwKKwkJICAgIEJNSV9FUlJfSU5UUl9FTl9TVE9SQUdFX1BST0ZJTEVfRUNDIHwK KwkJICAgIEJNSV9FUlJfSU5UUl9FTl9TVEFUSVNUSUNTX1JBTV9FQ0MgfAorCQkgICAgQk1JX0VS Ul9JTlRSX0VOX0RJU1BBVENIX1JBTV9FQ0MsICZibWlfcmctPmZtYm1faWV2cik7CisKKwlpZiAo Y2ZnLT5leGNlcHRpb25zICYgRk1BTl9FWF9CTUlfTElTVF9SQU1fRUNDKQorCQl0bXBfcmVnIHw9 IEJNSV9FUlJfSU5UUl9FTl9MSVNUX1JBTV9FQ0M7CisJaWYgKGNmZy0+ZXhjZXB0aW9ucyAmIEZN QU5fRVhfQk1JX1BJUEVMSU5FX0VDQykKKwkJdG1wX3JlZyB8PSBCTUlfRVJSX0lOVFJfRU5fU1RP UkFHRV9QUk9GSUxFX0VDQzsKKwlpZiAoY2ZnLT5leGNlcHRpb25zICYgRk1BTl9FWF9CTUlfU1RB VElTVElDU19SQU1fRUNDKQorCQl0bXBfcmVnIHw9IEJNSV9FUlJfSU5UUl9FTl9TVEFUSVNUSUNT X1JBTV9FQ0M7CisJaWYgKGNmZy0+ZXhjZXB0aW9ucyAmIEZNQU5fRVhfQk1JX0RJU1BBVENIX1JB TV9FQ0MpCisJCXRtcF9yZWcgfD0gQk1JX0VSUl9JTlRSX0VOX0RJU1BBVENIX1JBTV9FQ0M7CisJ aW93cml0ZTMyYmUodG1wX3JlZywgJmJtaV9yZy0+Zm1ibV9pZXIpOworCisJcmV0dXJuIDA7Cit9 CisKK2ludCBmbWFuX3FtaV9pbml0KHN0cnVjdCBmbWFuX3FtaV9yZWdzIF9faW9tZW0gKnFtaV9y Zywgc3RydWN0IGZtYW5fY2ZnICpjZmcpCit7CisJdWludDMyX3QgdG1wX3JlZzsKKwl1aW50MTZf dCBwZXJpb2RfaW5fZm1fY2xvY2tzOworCXVpbnQ4X3QgcmVtYWluZGVyOworCisJLyogSW5pdCBR TUkgUmVnaXN0ZXJzICovCisKKwkvKiBDbGVhciBlcnJvciBpbnRlcnJ1cHQgZXZlbnRzICovCisK Kwlpb3dyaXRlMzJiZShRTUlfRVJSX0lOVFJfRU5fRE9VQkxFX0VDQyB8IFFNSV9FUlJfSU5UUl9F Tl9ERVFfRlJPTV9ERUYsCisJCSAgICAmcW1pX3JnLT5mbXFtX2VpZSk7CisJdG1wX3JlZyA9IDA7 CisJaWYgKGNmZy0+ZXhjZXB0aW9ucyAmIEZNQU5fRVhfUU1JX0RFUV9GUk9NX1VOS05PV05fUE9S VElEKQorCQl0bXBfcmVnIHw9IFFNSV9FUlJfSU5UUl9FTl9ERVFfRlJPTV9ERUY7CisJaWYgKGNm Zy0+ZXhjZXB0aW9ucyAmIEZNQU5fRVhfUU1JX0RPVUJMRV9FQ0MpCisJCXRtcF9yZWcgfD0gUU1J X0VSUl9JTlRSX0VOX0RPVUJMRV9FQ0M7CisJLyogZW5hYmxlIGV2ZW50cyAqLworCWlvd3JpdGUz MmJlKHRtcF9yZWcsICZxbWlfcmctPmZtcW1fZWllbik7CisKKwlpZiAoY2ZnLT50bnVtX2FnaW5n X3BlcmlvZCkgeworCQkvKiB0bnVtX2FnaW5nX3BlcmlvZCBpcyBpbiB1bml0cyBvZiB1c2VjLAor CQkgKiBwX2ZtQ2xvY2tGcmVxIGluIE1oegorCQkgKi8KKwkJcGVyaW9kX2luX2ZtX2Nsb2NrcyA9 ICh1aW50MTZfdCkKKwkJCShjZmctPnRudW1fYWdpbmdfcGVyaW9kICogY2ZnLT5jbGtfZnJlcSk7 CisJCS8qIHBlcmlvZF9pbl9mbV9jbG9ja3MgbXVzdCBiZSBhIDY0IG11bHRpcGxlICovCisJCXJl bWFpbmRlciA9IHBlcmlvZF9pbl9mbV9jbG9ja3MgJSA2NDsKKwkJaWYgKHJlbWFpbmRlcikgewor CQkJdG1wX3JlZyA9ICh1aW50MzJfdCkoKHBlcmlvZF9pbl9mbV9jbG9ja3MgLyA2NCkgKyAxKTsK KwkJfSBlbHNlIHsKKwkJCXRtcF9yZWcgPSAodWludDMyX3QpKHBlcmlvZF9pbl9mbV9jbG9ja3Mg LyA2NCk7CisJCQlpZiAoIXRtcF9yZWcpCisJCQkJdG1wX3JlZyA9IDE7CisJCX0KKwkJdG1wX3Jl ZyA8PD0gUU1JX1RBUENfVEFQOworCQlpb3dyaXRlMzJiZSh0bXBfcmVnLCAmcW1pX3JnLT5mbXFt X3RhcGMpOworCX0KKwl0bXBfcmVnID0gMDsKKwkvKiBDbGVhciBpbnRlcnJ1cHQgZXZlbnRzICov CisJaW93cml0ZTMyYmUoUU1JX0lOVFJfRU5fU0lOR0xFX0VDQywgJnFtaV9yZy0+Zm1xbV9pZSk7 CisJaWYgKGNmZy0+ZXhjZXB0aW9ucyAmIEZNQU5fRVhfUU1JX1NJTkdMRV9FQ0MpCisJCXRtcF9y ZWcgfD0gUU1JX0lOVFJfRU5fU0lOR0xFX0VDQzsKKwkvKiBlbmFibGUgZXZlbnRzICovCisJaW93 cml0ZTMyYmUodG1wX3JlZywgJnFtaV9yZy0+Zm1xbV9pZW4pOworCisJcmV0dXJuIDA7Cit9CisK K2ludCBmbWFuX2VuYWJsZShzdHJ1Y3QgZm1hbl9yZyAqZm1hbl9yZywgc3RydWN0IGZtYW5fY2Zn ICpjZmcpCit7CisJdWludDMyX3QgY2ZnX3JlZyA9IDA7CisKKwkvKiBFbmFibGUgYWxsIG1vZHVs ZXMgKi8KKworCS8qIGNsZWFyJmVuYWJsZSBnbG9iYWwgY291bnRlcnMJIC0gY2FsY3VsYXRlIHJl ZyBhbmQgc2F2ZSBmb3IgbGF0ZXIsCisJICogYmVjYXVzZSBpdCdzIHRoZSBzYW1lIHJlZyBmb3Ig UU1JIGVuYWJsZQorCSAqLworCWNmZ19yZWcgPSBRTUlfQ0ZHX0VOX0NPVU5URVJTOworCWlmIChj ZmctPnFtaV9kZXFfb3B0aW9uX3N1cHBvcnQpCisJCWNmZ19yZWcgfD0gKHVpbnQzMl90KSgoKGNm Zy0+cW1pX2RlZl90bnVtc190aHJlc2gpIDw8IDgpIHwKKwkJCQkgICAgICAgY2ZnLT5xbWlfZGVm X3RudW1zX3RocmVzaCk7CisKKwlpb3dyaXRlMzJiZShCTUlfSU5JVF9TVEFSVCwgJmZtYW5fcmct PmJtaV9yZy0+Zm1ibV9pbml0KTsKKwlpb3dyaXRlMzJiZShjZmdfcmVnIHwgUU1JX0NGR19FTlFf RU4gfCBRTUlfQ0ZHX0RFUV9FTiwKKwkJICAgICZmbWFuX3JnLT5xbWlfcmctPmZtcW1fZ2MpOwor CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgZm1hbl9mcmVlX3Jlc291cmNlcyhzdHJ1Y3QgZm1hbl9y ZyAqZm1hbl9yZykKK3sKKwkvKiBkaXNhYmxlIEJNSSBhbmQgUU1JICovCisJaW93cml0ZTMyYmUo MCwgJmZtYW5fcmctPmJtaV9yZy0+Zm1ibV9pbml0KTsKKwlpb3dyaXRlMzJiZSgwLCAmZm1hbl9y Zy0+cW1pX3JnLT5mbXFtX2djKTsKKworCS8qIHJlbGVhc2UgQk1JIHJlc291cmNlcyAqLworCWlv d3JpdGUzMmJlKDAsICZmbWFuX3JnLT5ibWlfcmctPmZtYm1fY2ZnMik7CisJaW93cml0ZTMyYmUo MCwgJmZtYW5fcmctPmJtaV9yZy0+Zm1ibV9jZmcxKTsKKworCS8qIGRpc2FibGUgRUNDICovCisJ aW93cml0ZTMyYmUoMCwgJmZtYW5fcmctPmZwbV9yZy0+Zm1fcmNyKTsKK30KKworLyogQVBJIFJ1 bi10aW1lIENvbnRyb2wgdWludCBmdW5jdGlvbnMJICAqLworCit1aW50MzJfdCBmbWFuX2dldF9u b3JtYWxfcGVuZGluZyhzdHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lvbWVtICpmcG1fcmcpCit7CisJ cmV0dXJuIGlvcmVhZDMyYmUoJmZwbV9yZy0+Zm1fbnBpKTsKK30KKwordWludDMyX3QgZm1hbl9n ZXRfZXJyb3JfcGVuZGluZyhzdHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lvbWVtICpmcG1fcmcpCit7 CisJcmV0dXJuIGlvcmVhZDMyYmUoJmZwbV9yZy0+Zm1fZXBpKTsKK30KKwordm9pZCBmbWFuX2Vu YWJsZV9yYW1zX2VjYyhzdHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lvbWVtICpmcG1fcmcpCit7CisJ dWludDMyX3QgdG1wOworCisJdG1wID0gaW9yZWFkMzJiZSgmZnBtX3JnLT5mbV9yY3IpOworCWlm ICh0bXAgJiBGUE1fUkFNX1JBTVNfRUNDX0VOX1NSQ19TRUwpCisJCWlvd3JpdGUzMmJlKHRtcCB8 IEZQTV9SQU1fSVJBTV9FQ0NfRU4sICZmcG1fcmctPmZtX3Jjcik7CisJZWxzZQorCQlpb3dyaXRl MzJiZSh0bXAgfCBGUE1fUkFNX1JBTVNfRUNDX0VOIHwKKwkJCSAgICBGUE1fUkFNX0lSQU1fRUND X0VOLCAmZnBtX3JnLT5mbV9yY3IpOworfQorCit2b2lkIGZtYW5fZGlzYWJsZV9yYW1zX2VjYyhz dHJ1Y3QgZm1hbl9mcG1fcmVncyBfX2lvbWVtICpmcG1fcmcpCit7CisJdWludDMyX3QgdG1wOwor CisJdG1wID0gaW9yZWFkMzJiZSgmZnBtX3JnLT5mbV9yY3IpOworCWlmICh0bXAgJiBGUE1fUkFN X1JBTVNfRUNDX0VOX1NSQ19TRUwpCisJCWlvd3JpdGUzMmJlKHRtcCAmIH5GUE1fUkFNX0lSQU1f RUNDX0VOLCAmZnBtX3JnLT5mbV9yY3IpOworCWVsc2UKKwkJaW93cml0ZTMyYmUodG1wICYgfihG UE1fUkFNX1JBTVNfRUNDX0VOIHwgRlBNX1JBTV9JUkFNX0VDQ19FTiksCisJCQkgICAgJmZwbV9y Zy0+Zm1fcmNyKTsKK30KKworaW50IGZtYW5fc2V0X2V4Y2VwdGlvbihzdHJ1Y3QgZm1hbl9yZyAq Zm1hbl9yZywKKwkJICAgICAgIGVudW0gZm1hbl9leGNlcHRpb25zIGV4Y2VwdGlvbiwgYm9vbCBl bmFibGUpCit7CisJdWludDMyX3QgdG1wOworCisJc3dpdGNoIChleGNlcHRpb24pIHsKKwljYXNl IEVfRk1BTl9FWF9ETUFfQlVTX0VSUk9SOgorCQl0bXAgPSBpb3JlYWQzMmJlKCZmbWFuX3JnLT5k bWFfcmctPmZtZG1tcik7CisJCWlmIChlbmFibGUpCisJCQl0bXAgfD0gRE1BX01PREVfQkVSOwor CQllbHNlCisJCQl0bXAgJj0gfkRNQV9NT0RFX0JFUjsKKwkJLyogZGlzYWJsZSBidXMgZXJyb3Ig Ki8KKwkJaW93cml0ZTMyYmUodG1wLCAmZm1hbl9yZy0+ZG1hX3JnLT5mbWRtbXIpOworCQlicmVh azsKKwljYXNlIEVfRk1BTl9FWF9ETUFfUkVBRF9FQ0M6CisJY2FzZSBFX0ZNQU5fRVhfRE1BX1NZ U1RFTV9XUklURV9FQ0M6CisJY2FzZSBFX0ZNQU5fRVhfRE1BX0ZNX1dSSVRFX0VDQzoKKwkJdG1w ID0gaW9yZWFkMzJiZSgmZm1hbl9yZy0+ZG1hX3JnLT5mbWRtbXIpOworCQlpZiAoZW5hYmxlKQor CQkJdG1wIHw9IERNQV9NT0RFX0VDQzsKKwkJZWxzZQorCQkJdG1wICY9IH5ETUFfTU9ERV9FQ0M7 CisJCWlvd3JpdGUzMmJlKHRtcCwgJmZtYW5fcmctPmRtYV9yZy0+Zm1kbW1yKTsKKwkJYnJlYWs7 CisJY2FzZSBFX0ZNQU5fRVhfRlBNX1NUQUxMX09OX1RBU0tTOgorCQl0bXAgPSBpb3JlYWQzMmJl KCZmbWFuX3JnLT5mcG1fcmctPmZtZnBfZWUpOworCQlpZiAoZW5hYmxlKQorCQkJdG1wIHw9IEZQ TV9FVl9NQVNLX1NUQUxMX0VOOworCQllbHNlCisJCQl0bXAgJj0gfkZQTV9FVl9NQVNLX1NUQUxM X0VOOworCQlpb3dyaXRlMzJiZSh0bXAsICZmbWFuX3JnLT5mcG1fcmctPmZtZnBfZWUpOworCQli cmVhazsKKwljYXNlIEVfRk1BTl9FWF9GUE1fU0lOR0xFX0VDQzoKKwkJdG1wID0gaW9yZWFkMzJi ZSgmZm1hbl9yZy0+ZnBtX3JnLT5mbWZwX2VlKTsKKwkJaWYgKGVuYWJsZSkKKwkJCXRtcCB8PSBG UE1fRVZfTUFTS19TSU5HTEVfRUNDX0VOOworCQllbHNlCisJCQl0bXAgJj0gfkZQTV9FVl9NQVNL X1NJTkdMRV9FQ0NfRU47CisJCWlvd3JpdGUzMmJlKHRtcCwgJmZtYW5fcmctPmZwbV9yZy0+Zm1m cF9lZSk7CisJCWJyZWFrOworCWNhc2UgRV9GTUFOX0VYX0ZQTV9ET1VCTEVfRUNDOgorCQl0bXAg PSBpb3JlYWQzMmJlKCZmbWFuX3JnLT5mcG1fcmctPmZtZnBfZWUpOworCQlpZiAoZW5hYmxlKQor CQkJdG1wIHw9IEZQTV9FVl9NQVNLX0RPVUJMRV9FQ0NfRU47CisJCWVsc2UKKwkJCXRtcCAmPSB+ RlBNX0VWX01BU0tfRE9VQkxFX0VDQ19FTjsKKwkJaW93cml0ZTMyYmUodG1wLCAmZm1hbl9yZy0+ ZnBtX3JnLT5mbWZwX2VlKTsKKwkJYnJlYWs7CisJY2FzZSBFX0ZNQU5fRVhfUU1JX1NJTkdMRV9F Q0M6CisJCXRtcCA9IGlvcmVhZDMyYmUoJmZtYW5fcmctPnFtaV9yZy0+Zm1xbV9pZW4pOworCQlp ZiAoZW5hYmxlKQorCQkJdG1wIHw9IFFNSV9JTlRSX0VOX1NJTkdMRV9FQ0M7CisJCWVsc2UKKwkJ CXRtcCAmPSB+UU1JX0lOVFJfRU5fU0lOR0xFX0VDQzsKKwkJaW93cml0ZTMyYmUodG1wLCAmZm1h bl9yZy0+cW1pX3JnLT5mbXFtX2llbik7CisJCWJyZWFrOworCWNhc2UgRV9GTUFOX0VYX1FNSV9E T1VCTEVfRUNDOgorCQl0bXAgPSBpb3JlYWQzMmJlKCZmbWFuX3JnLT5xbWlfcmctPmZtcW1fZWll bik7CisJCWlmIChlbmFibGUpCisJCQl0bXAgfD0gUU1JX0VSUl9JTlRSX0VOX0RPVUJMRV9FQ0M7 CisJCWVsc2UKKwkJCXRtcCAmPSB+UU1JX0VSUl9JTlRSX0VOX0RPVUJMRV9FQ0M7CisJCWlvd3Jp dGUzMmJlKHRtcCwgJmZtYW5fcmctPnFtaV9yZy0+Zm1xbV9laWVuKTsKKwkJYnJlYWs7CisJY2Fz ZSBFX0ZNQU5fRVhfUU1JX0RFUV9GUk9NX1VOS05PV05fUE9SVElEOgorCQl0bXAgPSBpb3JlYWQz MmJlKCZmbWFuX3JnLT5xbWlfcmctPmZtcW1fZWllbik7CisJCWlmIChlbmFibGUpCisJCQl0bXAg fD0gUU1JX0VSUl9JTlRSX0VOX0RFUV9GUk9NX0RFRjsKKwkJZWxzZQorCQkJdG1wICY9IH5RTUlf RVJSX0lOVFJfRU5fREVRX0ZST01fREVGOworCQlpb3dyaXRlMzJiZSh0bXAsICZmbWFuX3JnLT5x bWlfcmctPmZtcW1fZWllbik7CisJCWJyZWFrOworCWNhc2UgRV9GTUFOX0VYX0JNSV9MSVNUX1JB TV9FQ0M6CisJCXRtcCA9IGlvcmVhZDMyYmUoJmZtYW5fcmctPmJtaV9yZy0+Zm1ibV9pZXIpOwor CQlpZiAoZW5hYmxlKQorCQkJdG1wIHw9IEJNSV9FUlJfSU5UUl9FTl9MSVNUX1JBTV9FQ0M7CisJ CWVsc2UKKwkJCXRtcCAmPSB+Qk1JX0VSUl9JTlRSX0VOX0xJU1RfUkFNX0VDQzsKKwkJaW93cml0 ZTMyYmUodG1wLCAmZm1hbl9yZy0+Ym1pX3JnLT5mbWJtX2llcik7CisJCWJyZWFrOworCWNhc2Ug RV9GTUFOX0VYX0JNSV9TVE9SQUdFX1BST0ZJTEVfRUNDOgorCQl0bXAgPSBpb3JlYWQzMmJlKCZm bWFuX3JnLT5ibWlfcmctPmZtYm1faWVyKTsKKwkJaWYgKGVuYWJsZSkKKwkJCXRtcCB8PSBCTUlf RVJSX0lOVFJfRU5fU1RPUkFHRV9QUk9GSUxFX0VDQzsKKwkJZWxzZQorCQkJdG1wICY9IH5CTUlf RVJSX0lOVFJfRU5fU1RPUkFHRV9QUk9GSUxFX0VDQzsKKwkJaW93cml0ZTMyYmUodG1wLCAmZm1h bl9yZy0+Ym1pX3JnLT5mbWJtX2llcik7CisJCWJyZWFrOworCWNhc2UgRV9GTUFOX0VYX0JNSV9T VEFUSVNUSUNTX1JBTV9FQ0M6CisJCXRtcCA9IGlvcmVhZDMyYmUoJmZtYW5fcmctPmJtaV9yZy0+ Zm1ibV9pZXIpOworCQlpZiAoZW5hYmxlKQorCQkJdG1wIHw9IEJNSV9FUlJfSU5UUl9FTl9TVEFU SVNUSUNTX1JBTV9FQ0M7CisJCWVsc2UKKwkJCXRtcCAmPSB+Qk1JX0VSUl9JTlRSX0VOX1NUQVRJ U1RJQ1NfUkFNX0VDQzsKKwkJaW93cml0ZTMyYmUodG1wLCAmZm1hbl9yZy0+Ym1pX3JnLT5mbWJt X2llcik7CisJCWJyZWFrOworCWNhc2UgRV9GTUFOX0VYX0JNSV9ESVNQQVRDSF9SQU1fRUNDOgor CQl0bXAgPSBpb3JlYWQzMmJlKCZmbWFuX3JnLT5ibWlfcmctPmZtYm1faWVyKTsKKwkJaWYgKGVu YWJsZSkKKwkJCXRtcCB8PSBCTUlfRVJSX0lOVFJfRU5fRElTUEFUQ0hfUkFNX0VDQzsKKwkJZWxz ZQorCQkJdG1wICY9IH5CTUlfRVJSX0lOVFJfRU5fRElTUEFUQ0hfUkFNX0VDQzsKKwkJaW93cml0 ZTMyYmUodG1wLCAmZm1hbl9yZy0+Ym1pX3JnLT5mbWJtX2llcik7CisJCWJyZWFrOworCWNhc2Ug RV9GTUFOX0VYX0lSQU1fRUNDOgorCQl0bXAgPSBpb3JlYWQzMmJlKCZmbWFuX3JnLT5mcG1fcmct PmZtX3JpZSk7CisJCWlmIChlbmFibGUpIHsKKwkJCS8qIGVuYWJsZSBFQ0MgaWYgbm90IGVuYWJs ZWQgKi8KKwkJCWZtYW5fZW5hYmxlX3JhbXNfZWNjKGZtYW5fcmctPmZwbV9yZyk7CisJCQkvKiBl bmFibGUgRUNDIGludGVycnVwdHMgKi8KKwkJCXRtcCB8PSBGUE1fSVJBTV9FQ0NfRVJSX0VYX0VO OworCQl9IGVsc2UgeworCQkJLyogRUNDIG1lY2hhbmlzbSBtYXkgYmUgZGlzYWJsZWQsCisJCQkg KiBkZXBlbmRpbmcgb24gZHJpdmVyIHN0YXR1cworCQkJICovCisJCQlmbWFuX2Rpc2FibGVfcmFt c19lY2MoZm1hbl9yZy0+ZnBtX3JnKTsKKwkJCXRtcCAmPSB+RlBNX0lSQU1fRUNDX0VSUl9FWF9F TjsKKwkJfQorCQlpb3dyaXRlMzJiZSh0bXAsICZmbWFuX3JnLT5mcG1fcmctPmZtX3JpZSk7CisJ CWJyZWFrOworCWNhc2UgRV9GTUFOX0VYX01VUkFNX0VDQzoKKwkJdG1wID0gaW9yZWFkMzJiZSgm Zm1hbl9yZy0+ZnBtX3JnLT5mbV9yaWUpOworCQlpZiAoZW5hYmxlKSB7CisJCQkvKiBlbmFibGUg RUNDIGlmIG5vdCBlbmFibGVkICovCisJCQlmbWFuX2VuYWJsZV9yYW1zX2VjYyhmbWFuX3JnLT5m cG1fcmcpOworCQkJLyogZW5hYmxlIEVDQyBpbnRlcnJ1cHRzICovCisJCQl0bXAgfD0gRlBNX01V UkFNX0VDQ19FUlJfRVhfRU47CisJCX0gZWxzZSB7CisJCQkvKiBFQ0MgbWVjaGFuaXNtIG1heSBi ZSBkaXNhYmxlZCwKKwkJCSAqIGRlcGVuZGluZyBvbiBkcml2ZXIgc3RhdHVzCisJCQkgKi8KKwkJ CWZtYW5fZGlzYWJsZV9yYW1zX2VjYyhmbWFuX3JnLT5mcG1fcmcpOworCQkJdG1wICY9IH5GUE1f TVVSQU1fRUNDX0VSUl9FWF9FTjsKKwkJfQorCQlpb3dyaXRlMzJiZSh0bXAsICZmbWFuX3JnLT5m cG1fcmctPmZtX3JpZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOwor CX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBmbWFuX2dldF9yZXZpc2lvbihzdHJ1Y3QgZm1hbl9m cG1fcmVncyBfX2lvbWVtICpmcG1fcmcsCisJCSAgICAgICB1aW50OF90ICptYWpvciwgdWludDhf dCAqbWlub3IpCit7CisJdWludDMyX3QgdG1wOworCisJdG1wID0gaW9yZWFkMzJiZSgmZnBtX3Jn LT5mbV9pcF9yZXZfMSk7CisJKm1ham9yID0KKwkgICAgKHVpbnQ4X3QpKCh0bXAgJiBGUE1fUkVW MV9NQUpPUl9NQVNLKSA+PiBGUE1fUkVWMV9NQUpPUl9TSElGVCk7CisJKm1pbm9yID0KKwkgICAg KHVpbnQ4X3QpKCh0bXAgJiBGUE1fUkVWMV9NSU5PUl9NQVNLKSA+PiBGUE1fUkVWMV9NSU5PUl9T SElGVCk7Cit9CisKK2Jvb2wgZm1hbl9pc19xbWlfaGFsdF9ub3RfYnVzeV9zdGF0ZShzdHJ1Y3Qg Zm1hbl9xbWlfcmVncyBfX2lvbWVtICpxbWlfcmcpCit7CisJcmV0dXJuICEhKGlvcmVhZDMyYmUo JnFtaV9yZy0+Zm1xbV9ncykgJiBRTUlfR1NfSEFMVF9OT1RfQlVTWSk7Cit9CisKK3ZvaWQgZm1h bl9yZXN1bWUoc3RydWN0IGZtYW5fZnBtX3JlZ3MgX19pb21lbSAqZnBtX3JnKQoreworCXVpbnQz Ml90IHRtcDsKKworCXRtcCA9IGlvcmVhZDMyYmUoJmZwbV9yZy0+Zm1mcF9lZSk7CisJLyogY2xl YXIgdG1wX3JlZyBldmVudCBiaXRzIGluIG9yZGVyIG5vdCB0byBjbGVhciBzdGFuZGluZyBldmVu dHMgKi8KKwl0bXAgJj0gfihGUE1fRVZfTUFTS19ET1VCTEVfRUNDIHwKKwkJIEZQTV9FVl9NQVNL X1NUQUxMIHwgRlBNX0VWX01BU0tfU0lOR0xFX0VDQyk7CisJdG1wIHw9IEZQTV9FVl9NQVNLX1JF TEVBU0VfRk07CisKKwlpb3dyaXRlMzJiZSh0bXAsICZmcG1fcmctPmZtZnBfZWUpOworfQotLSAK MS43LjkuNQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K TGludXhwcGMtZGV2IG1haWxpbmcgbGlzdApMaW51eHBwYy1kZXZAbGlzdHMub3psYWJzLm9yZwpo dHRwczovL2xpc3RzLm96bGFicy5vcmcvbGlzdGluZm8vbGludXhwcGMtZGV2