From owner-freebsd-virtualization@freebsd.org Tue Aug 15 09:48:57 2017 Return-Path: Delivered-To: freebsd-virtualization@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 9373ADC865F for ; Tue, 15 Aug 2017 09:48:57 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from reviews.nyi.freebsd.org (reviews.nyi.freebsd.org [IPv6:2610:1c1:1:607c::16:b]) by mx1.freebsd.org (Postfix) with ESMTP id 1AB5367DAD for ; Tue, 15 Aug 2017 09:48:57 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by reviews.nyi.freebsd.org (Postfix, from userid 1346) id 33FEA5465A; Tue, 15 Aug 2017 09:48:56 +0000 (UTC) Date: Tue, 15 Aug 2017 09:48:56 +0000 To: freebsd-virtualization@freebsd.org From: "iateaca (Teaca)" Reply-to: D5473+333+79492675d52ac1ab@reviews.freebsd.org Subject: [Differential] D5473: ATA/ATAPI6 device emulation in bhyve Message-ID: <3f564b781b1c7f1f6a251004cff0fd1c@localhost.localdomain> X-Priority: 3 X-Phabricator-Sent-This-Message: Yes X-Mail-Transport-Agent: MetaMTA X-Auto-Response-Suppress: All X-Phabricator-Mail-Tags: , Thread-Topic: D5473: ATA/ATAPI6 device emulation in bhyve X-Herald-Rules: none X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-To: X-Phabricator-Cc: X-Phabricator-Cc: Precedence: bulk In-Reply-To: References: Thread-Index: ZmQ1YjBmNDNhNWVhZDYwNjJmNTU3Y2FmMjRkIFmSw4g= MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_3f564b781b1c7f1f6a251004cff0fd1c" X-BeenThere: freebsd-virtualization@freebsd.org X-Mailman-Version: 2.1.23 List-Id: "Discussion of various virtualization techniques FreeBSD supports." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Aug 2017 09:48:57 -0000 --b1_3f564b781b1c7f1f6a251004cff0fd1c Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: base64 aWF0ZWFjYSB1cGRhdGVkIHRoaXMgcmV2aXNpb24gdG8gRGlmZiAzMjA4MS4KaWF0ZWFjYSBhZGRl ZCBhIGNvbW1lbnQuCgoKICBhZGQgQ29weXJpZ2h0IGFuZCBsaWNlbnNlCgpDSEFOR0VTIFNJTkNF IExBU1QgVVBEQVRFCiAgaHR0cHM6Ly9yZXZpZXdzLmZyZWVic2Qub3JnL0Q1NDczP3ZzPTEzODI5 JmlkPTMyMDgxCgpSRVZJU0lPTiBERVRBSUwKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcv RDU0NzMKCkFGRkVDVEVEIEZJTEVTCiAgTWFrZWZpbGUKICBhdGEuYwogIHBjaV9scGMuYwoKRU1B SUwgUFJFRkVSRU5DRVMKICBodHRwczovL3Jldmlld3MuZnJlZWJzZC5vcmcvc2V0dGluZ3MvcGFu ZWwvZW1haWxwcmVmZXJlbmNlcy8KClRvOiBpYXRlYWNhLCBncmVoYW4sIHR5Y2hvbiwgbmVlbCwg bWF2CkNjOiBlZGl0b3JfY2FsbGZvcnRlc3Rpbmcub3JnLCBmcmVlYnNkLXZpcnR1YWxpemF0aW9u LWxpc3QK --b1_3f564b781b1c7f1f6a251004cff0fd1c Content-Type: text/x-patch; charset=utf-8; name="D5473.32081.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D5473.32081.patch" ZGlmZiAtLWdpdCBhL3BjaV9scGMuYyBiL3BjaV9scGMuYwotLS0gYS9wY2lfbHBjLmMKKysrIGIv cGNpX2xwYy5jCkBAIC03Myw2ICs3MywxMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqbHBjX3Vh cnRfbmFtZXNbTFBDX1VBUlRfTlVNXSA9IHsgIkNPTTEiLCAiQ09NMiIgfTsKIAorZXh0ZXJuIGlu dAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBjb25zdCBjaGFyICpvcHRzKTsKK3N0 YXRpYyBjb25zdCBjaGFyICpscGNfYXRhMF9vcHRzID0gTlVMTDsKK3N0YXRpYyBjb25zdCBjaGFy ICpscGNfYXRhMV9vcHRzID0gTlVMTDsKKwogLyoKICAqIExQQyBkZXZpY2UgY29uZmlndXJhdGlv biBpcyBpbiB0aGUgZm9sbG93aW5nIGZvcm06CiAgKiA8bHBjX2RldmljZV9uYW1lPlssPG9wdGlv bnM+XQpAQCAtOTUsNiArMTAwLDE2IEBACiAJCQkJZ290byBkb25lOwogCQkJfQogCQl9CisKKwkJ aWYgKHN0cmNhc2VjbXAobHBjZGV2LCAiYXRhLWhkIikgPT0gMCkgeworCQkJaWYgKHN0clswXSA9 PSAnMCcpCisJCQkJbHBjX2F0YTBfb3B0cyA9IHN0cjsKKwkJCWVsc2UgaWYgKHN0clswXSA9PSAn MScpCisJCQkJbHBjX2F0YTFfb3B0cyA9IHN0cjsKKworCQkJZXJyb3IgPSAwOworCQkJZ290byBk b25lOworCQl9CiAJfQogCiBkb25lOgpAQCAtMTk3LDYgKzIxMiwxMSBAQAogCQlzYy0+ZW5hYmxl ZCA9IDE7CiAJfQogCisJaWYgKGxwY19hdGEwX29wdHMpCisJCWxwY19hdGFfaW5pdChscGNfYnJp ZGdlLT5waV92bWN0eCwgbHBjX2F0YTBfb3B0cyk7CisJaWYgKGxwY19hdGExX29wdHMpCisJCWxw Y19hdGFfaW5pdChscGNfYnJpZGdlLT5waV92bWN0eCwgbHBjX2F0YTFfb3B0cyk7CisKIAlyZXR1 cm4gKDApOwogfQogCkBAIC0zNzksNiArMzk5LDggQEAKIAkJcmV0dXJuICgtMSk7CiAJfQogCisJ bHBjX2JyaWRnZSA9IHBpOworCiAJaWYgKGxwY19pbml0KCkgIT0gMCkKIAkJcmV0dXJuICgtMSk7 CiAKQEAgLTM4OCw4ICs0MTAsNiBAQAogCXBjaV9zZXRfY2ZnZGF0YTgocGksIFBDSVJfQ0xBU1Ms IFBDSUNfQlJJREdFKTsKIAlwY2lfc2V0X2NmZ2RhdGE4KHBpLCBQQ0lSX1NVQkNMQVNTLCBQQ0lT X0JSSURHRV9JU0EpOwogCi0JbHBjX2JyaWRnZSA9IHBpOwotCiAJcmV0dXJuICgwKTsKIH0KIApk aWZmIC0tZ2l0IGEvTWFrZWZpbGUgYi9NYWtlZmlsZQotLS0gYS9NYWtlZmlsZQorKysgYi9NYWtl ZmlsZQpAQCAtMTEsNiArMTEsNyBAQAogU1JDUz0JXAogCWF0a2JkYy5jCQlcCiAJYWNwaS5jCQkJ XAorCWF0YS5jCQkJXAogCWJoeXZlcnVuLmMJCVwKIAlibG9ja19pZi5jCQlcCiAJY29uc3BvcnQu YwkJXApkaWZmIC0tZ2l0IGEvYXRhLmMgYi9hdGEuYwotLS0gYS9hdGEuYworKysgYi9hdGEuYwpA QCAtMCwwICsxLDI2MDYgQEAKKy8qLQorICogQ29weXJpZ2h0IChjKSAyMDE2IEFsZXggVGVhY2Eg PGlhdGVhY2FAZnJlZWJzZC5vcmc+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0 aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycg QU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xB SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgT1IgQ09OVFJJQlVUT1JTIEJFIExJ QUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJW SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ VElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xV RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQg T0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ QklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0 Lmg+CisjaW5jbHVkZSA8c3lzL2F0YS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1 ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4K KyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y2Ft L3Njc2kvc2NzaV9hbGwuaD4KKyNpbmNsdWRlIDxtYWNoaW5lL3ZtbS5oPgorI2luY2x1ZGUgPHZt bWFwaS5oPgorCisjaW5jbHVkZSAiYmxvY2tfaWYuaCIKKyNpbmNsdWRlICJiaHl2ZXJ1bi5oIgor I2luY2x1ZGUgInBjaV9lbXVsLmgiCisjaW5jbHVkZSAicGNpX2lycS5oIgorI2luY2x1ZGUgImlu b3V0LmgiCisKKworLyoKKyAqIEFUQSBEZWJ1ZyBMb2cKKyAqLworI2RlZmluZQlERUJVR19BVEEJ CQkxCisjaWYgREVCVUdfQVRBID09IDEKKwordHlwZWRlZiBlbnVtIHsKKwlMT0dfREVCVUcgPSAw LAorCUxPR19FUlIgPSAxLAorfSBMT0dfTEVWRUw7CisKK3N0YXRpYyBGSUxFICpkYmc7CisKK3N0 YXRpYyB2b2lkIGF0YV9vcGVuX2RiZ19maWxlKHZvaWQpCit7CisJZGJnID0gZm9wZW4oIi90bXAv Ymh5dmVfYXRhLmxvZyIsICJ3KyIpOworCXJldHVybjsKK30KKworI2RlZmluZSBkcHJpbnQobGV2 ZWwsIGZvcm1hdCwgYXJnLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCisJZG97ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAorCQlpZiAobGV2ZWwgPT0gTE9HX0RFQlVHKSB7ZnByaW50Zihk YmcsIGZvcm1hdCwgIyNhcmcpO30gICAgICAgXAorCQllbHNlIHtmcHJpbnRmKGRiZywgIkxPR19F UlI6ICJmb3JtYXQsICMjYXJnKTt9ICAgICAgICAgICAgICAgXAorCQlmZmx1c2goZGJnKTsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX13aGlsZSgw KQorI2Vsc2UKKyNkZWZpbmUgYXRhX29wZW5fZGJnX2ZpbGUoKQk7CisjZGVmaW5lIGRwcmludChs ZXZlbCwgZm10LCAuLi4pIGRvIHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFUQSBk ZWZpbmVzCisgKi8KKworI2RlZmluZSBQQ0lfQVRBX0NIX1NFUAkJCSc7JworCisvKiBBVEEgQ2hh bm5lbHMgKi8KKyNkZWZpbmUgQVRBX0NIQU5ORUxTCQkJMHgwMgorI2RlZmluZQlBVEFfWAkJCQkw eDAwCisjZGVmaW5lCUFUQV9ZCQkJCTB4MDEKKworI2RlZmluZQlBVEFfRFJJVkVTCQkJMHgwMgor I2RlZmluZQlBVEFfTUFTVEVSCQkJMHgwMAorI2RlZmluZQlBVEFfU0xBVkUJCQkweDAxCisKKyNk ZWZpbmUJQVRBX0RSSVZFX0FCU0VOVAkJMHhmOAorCisjZGVmaW5lCUFUQV9ERVYodW5pdCkJCQko KHVuaXQgPiAwKSA/IDB4MTAgOiAwKQorCisjZGVmaW5lIEFUQV9JT1NJWkUJCQkweDA4CisjZGVm aW5lIEFUQV9DVExJT1NJWkUJCQkweDAxCisjZGVmaW5lIEFUQV9CTUlPU0laRQkJCTB4MDgKKwor I2RlZmluZQlBVEFfU0VDVE9SX1NJWkUJCQk1MTIKKyNkZWZpbmUJQVRBX1NFQ1RPUlNfUEVSX0JM T0NLCQkxMjgKKyNkZWZpbmUJQVRBX01BWF9TRUNfQ09VTlQJCTI1NgorI2RlZmluZQlBVEFfQkxP Q0tfU0laRQkJCShBVEFfU0VDVE9SU19QRVJfQkxPQ0sgKiBBVEFfU0VDVE9SX1NJWkUpCisjZGVm aW5lCUFUQV9JTkJVRl9TSVpFCQkJKEFUQV9NQVhfU0VDX0NPVU5UICogQVRBX1NFQ1RPUl9TSVpF KQorI2RlZmluZQlBVEFfTEJBXzI3XzI0X01BU0sJCTB4MGYKKworI2RlZmluZSBBVEFQSV9QQUNL RVRfU0laRQkJMTIKKyNkZWZpbmUgQVRBUElfQkxPQ0tfU0laRQkJMjA0OAorCisjZGVmaW5lCUFU QV9XUklURV9NVUxfQ09NUExFVEUJCTAKKyNkZWZpbmUJQVRBX1JFQURfTVVMX0NPTVBMRVRFCQkw CisKKyNkZWZpbmUJQVRBX0RNQV9NQVhfUFJEX0NPVU5UCQk2NTUzNgorI2RlZmluZQlBVEFfRE1B X1BSRFRfU0laRQkJNjU1MzYKKyNkZWZpbmUJQVRBX0RNQV9QUkRUX0VPVAkJMHg4MDAwCisKKyNk ZWZpbmUJQVRBX0RNQV9SRUFECQkJKDApCisjZGVmaW5lCUFUQV9ETUFfV1JJVEUJCQkoMSkKKwor I2RlZmluZQlBVEFfV19ETUEyCQkJMHgwNAorI2RlZmluZQlBVEFfTU9ERV9QSU80CQkJMHgwMgor CisjZGVmaW5lCUFUQV9BVEFQSV82CQkJMHg0MAorCisjZGVmaW5lIEFUQVBJX01BR0lDX0xTQgkJ CTB4MTQKKyNkZWZpbmUgQVRBUElfTUFHSUNfTVNCCQkJMHhlYgorCisvKiBQQ0kgQkFSUyBpZHgg Ki8KKyNkZWZpbmUJUENJX0JBUjAJCQkwCisjZGVmaW5lCVBDSV9CQVIxCQkJMQorI2RlZmluZQlQ Q0lfQkFSMgkJCTIKKyNkZWZpbmUJUENJX0JBUjMJCQkzCisjZGVmaW5lCVBDSV9CQVI0CQkJNAor CisvKiBBVEEgQnVzIE1hc3RlciBSZWdpc3RlciBPZmZzZXRzIGFuZCBWYWx1ZXMqLworI2RlZmlu ZQlBVEFfQk1DTURfWF9SRUcJCQkweDAwCisjZGVmaW5lCUFUQV9CTUNNRF9ZX1JFRwkJCTB4MDgK KyNkZWZpbmUJCUFUQV9CTUNNRF9TVEFSVF9TVE9QCTB4MDEKKyNkZWZpbmUJCUFUQV9CTUNNRF9X UklURV9SRUFECTB4MDgKKworI2RlZmluZQlBVEFfQk1TVEFUX1hfUkVHCQkweDAyCisjZGVmaW5l CUFUQV9CTVNUQVRfWV9SRUcJCTB4MEEKKyNkZWZpbmUJCUFUQV9CTVNUQVRfQUNUSVZFCTB4MDEK KyNkZWZpbmUJCUFUQV9CTVNUQVRfRVJST1IJMHgwMgorI2RlZmluZQkJQVRBX0JNU1RBVF9JTlRF UlJVUFQJMHgwNAorI2RlZmluZQkJQVRBX0JNU1RBVF9NQVNLCQkweDA3CisjZGVmaW5lCQlBVEFf Qk1TVEFUX0RNQV9NQVNURVIJMHgyMAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0xBVkUJMHg0 MAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0lNUExFWAkweDgwCisKKyNkZWZpbmUJQVRBX0JN UFJEVF9YX1JFRwkJMHgwNAorI2RlZmluZQlBVEFfQk1QUkRUX1lfUkVHCQkweDBDCisKKy8qIFRo ZSBDb21tYW5kIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfREFUQV9SRUcJCQkweDAw CisjZGVmaW5lCUFUQV9FUlJPUl9SRUcJCQkweDAxCisjZGVmaW5lCQlBVEFfRV9JTEkJCTB4MDEg ICAgLyogaWxsZWdhbCBsZW5ndGggKi8KKyNkZWZpbmUgICAgICAgICBBVEFfRV9BQk9SVCAgICAg ICAgICAgICAweDA0ICAgIC8qIGNvbW1hbmQgYWJvcnRlZCAqLworI2RlZmluZQlBVEFfRkVBVFVS RVNfUkVHCQkweDAxCisjZGVmaW5lCUFUQV9TRUNDT1VOVF9SRUcJCTB4MDIKKyNkZWZpbmUJCUFU QV9JX0NNRAkJMHgwMSAgICAvKiBjbWQgKDEpIHwgZGF0YSAoMCkgKi8KKyNkZWZpbmUJCUFUQV9J X0lOCQkweDAyICAgIC8qIHJlYWQgKDEpIHwgd3JpdGUgKDApICovCisjZGVmaW5lCQlBVEFfSV9S RUxFQVNFCQkweDA0ICAgIC8qIHJlbGVhc2VkIGJ1cyAoMSkgKi8KKyNkZWZpbmUJQVRBX0xCQV9M T1dfUkVHCQkJMHgwMworI2RlZmluZQlBVEFfTEJBX01JRF9SRUcJCQkweDA0CisjZGVmaW5lCUFU QV9MQkFfSElHSF9SRUcJCTB4MDUKKyNkZWZpbmUJQVRBX0hEREVWU0VMX1JFRwkJMHgwNgorI2Rl ZmluZQkJQVRBX0RfTEJBCQkweDQwICAgIC8qIHVzZSBMQkEgYWRkcmVzc2luZyAqLworI2RlZmlu ZQkJQVRBX0RfSUJNCQkweGEwICAgIC8qIDUxMiBieXRlIHNlY3RvcnMsIEVDQyAqLworI2RlZmlu ZQlBVEFfQ09NTUFORF9SRUcJCQkweDA3CisjZGVmaW5lCUFUQV9TVEFUVVNfUkVHCQkJMHgwNwor I2RlZmluZQkJQVRBX1NfQlVTWQkJMHg4MCAgICAvKiBidXN5ICovCisjZGVmaW5lCQlBVEFfU19S RUFEWQkJMHg0MCAgICAvKiBkcml2ZSByZWFkeSAqLworI2RlZmluZQkJQVRBX1NfRFdGCQkweDIw ICAgIC8qIGRyaXZlIHdyaXRlIGZhdWx0ICovCisjZGVmaW5lCQlBVEFfU19EUlEJCTB4MDggICAg LyogZGF0YSByZXF1ZXN0ICovCisjZGVmaW5lCQlBVEFfU19EU0MJCTB4MTAgICAgLyogZHJpdmUg c2VlayBjb21wbGV0ZWQgKi8KKyNkZWZpbmUJCUFUQV9TX0VSUk9SCQkweDAxICAgIC8qIGVycm9y ICovCisKKy8qIFRoZSBDb250cm9sIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfQ09O VFJPTF9SRUcJCQkweDBDCisjZGVmaW5lCQlBVEFfQV9JRFMJCTB4MDIgICAgLyogZGlzYWJsZSBp bnRlcnJ1cHRzICovCisjZGVmaW5lCQlBVEFfQV9SRVNFVAkJMHgwNCAgICAvKiBSRVNFVCBjb250 cm9sbGVyICovCisjZGVmaW5lCUFUQV9BTFRTVEFUVVNfUkVHCQkweDBDCisKKyNkZWZpbmUgUkVB RF9UT0MJCQkweDQzCisKK3N0cnVjdCBhdGFfY2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqYXRh X2ludHJfZnVuY190KSh2b2lkICphcmcpOwordHlwZWRlZiB2b2lkICgqYXRhX3Bpb19lbmRfdHJh bnNmZXJfZnVuY190KShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCit0eXBlZGVmIGVu dW0geworCUFUQV9IRCwKKwlBVEFQSV9DRCwKKwlBVEFfRFJJVkVfRU1QVFkKK30gYXRhX2RyaXZl X3R5cGU7CisKKy8qCisgKiBBVEEgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBhdGFfcGlv X2J1ZmZlciB7CisJdWludDhfdCAgZGF0YVtBVEFfSU5CVUZfU0laRV07CisJdWludDY0X3QgY3Vy cmVudF9wb3M7Cit9OworCitzdHJ1Y3QgYXRhX3Bpb19zZXR1cCB7CisJdWludDhfdCB1c2Vfd29y ZDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgYnJlcTsKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgcGlv X2J1ZmZlcjsKKworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNm ZXJfZnVuY190IGVuZF90cmFuc2ZlcjsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7Cit9 OworCitzdHJ1Y3QgcHJkX2VudHJ5IHsKKwl1aW50MzJfdCBwcmRfYWRkcmVzczsKKwl1aW50MTZf dCBieXRlX2NvdW50OworCXVpbnQxNl90IHZlbmRvcl9zcGVjaWZpYzsKK30gX19hdHRyaWJ1dGVf XygoX19wYWNrZWRfXykpOworCitzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24geworCXN0 cnVjdCBibG9ja2lmX3JlcSBicmVxOworCXVpbnQ4X3QgaXNfZW90OworCXVpbnQ4X3Qgc3RhcnRl ZDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgbmJ5dGVzOworCXVpbnQ4X3QgIG9wX2Rp cjsKK307CisKK3N0cnVjdCBhdGFfZHJpdmUgeworCS8qIEFUQSBEcml2ZSBSZWdpc3RlcnMgKi8K KworCS8qIHRoZSBpbyBwb3J0IHJhbmdlIHNpemUgPSAweDA4ICovCisJdWludDhfdCBkYXRhOwor CXVpbnQ4X3QgZXJyb3I7CisJdWludDhfdCBmZWF0dXJlczsKKwl1aW50OF90IHNlY2NvdW50Owor CXVpbnQ4X3QgbGJhX2xvdzsKKwl1aW50OF90IGxiYV9taWQ7CisJdWludDhfdCBsYmFfaGlnaDsK Kwl1aW50OF90IGhkZGV2c2VsOworCXVpbnQ4X3QgY29tbWFuZDsKKwl1aW50OF90IHN0YXR1czsK KworCS8qIHRoZSBhbHRwb3J0IHJhbmdlIHNpemUgPSAweDAxICovCisJdWludDhfdCBhbHRzdGF0 dXM7CisKKwlhdGFfZHJpdmVfdHlwZSB0eXBlOworCXVpbnQxNl90IGJ5dGVfY291bnQ7CisJdWlu dDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOwor CXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0OworCXN0cnVjdCBhdGFfcGlvX3NldHVwIHBpb19z ZXR1cDsKK307CisKK3N0cnVjdCBhdGFfY2hhbm5lbCB7CisJLyogQVRBIENoYW5uZWwgU3RhdGUg VmFyaWFibGVzICovCisJdWludDMyX3Qgc2l6ZTsKKwl1aW50OF90IGludGVyZmFjZTsKKwl1aW50 OF90IGRyaXZlOworCXVpbnQ4X3QgaGFzX3NsYXZlOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90 IHNlY3RvcnNfcGVyX2Jsb2NrOworCXVpbnQ4X3QgdXNlXzE2Yml0OworCisJc3RydWN0IGJsb2Nr aWZfcmVxIGZsdXNoX2JyZXE7CisKKwlzdHJ1Y3QgYXRhX2RyaXZlIGRyaXZlc1tBVEFfRFJJVkVT XTsKKworCXN0cnVjdCB2bWN0eCAqdm1fY3R4OworCXZvaWQgKnByX3NjOworCisJLyogSW50ZXJy dXB0cyBjYWxsYmFja3MgKFBDSSBvciBMUEMpICovCisJYXRhX2ludHJfZnVuY190IGludHJfYXNz ZXJ0OworCWF0YV9pbnRyX2Z1bmNfdCBpbnRyX2RlYXNzZXJ0OworCXVpbnQ4X3QgbGludHI7Cit9 OworCitzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyB7CisJLyogQVRBIEJ1cyBNYXN0ZXIgUmVnaXN0ZXIg Ki8KKwl1aW50OF90ICBjbWRbQVRBX0NIQU5ORUxTXTsKKwl1aW50OF90ICBzdGF0W0FUQV9DSEFO TkVMU107CisJdWludDMyX3QgcHJkdFtBVEFfQ0hBTk5FTFNdOworCisJc3RydWN0IHBjaV9hdGFf ZG1hX3RyYW5zYWN0aW9uIGRtYV90cmFuc2FjdGlvbnNbQVRBX0NIQU5ORUxTXTsKKworCXN0cnVj dCBwY2lfZGV2aW5zdCAqYXNjX3BpOworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbHNbQVRB X0NIQU5ORUxTXTsKK307CisKK3N0cnVjdCBscGNfYXRhX3NvZnRjIHsKKwlzdHJ1Y3QgYXRhX2No YW5uZWwgKmNoYW5uZWw7CisJaW50IGlycTsKKwlpbnQgYmFzZV9hZGRyX2lvOworCWludCBiYXNl X2FkZHJfaW9jdGw7CisJY29uc3QgY2hhciAqbmFtZV9pbzsKKwljb25zdCBjaGFyICpuYW1lX2lv Y3RsOworfTsKKworCisvKgorICogQVRBIG1vZHVsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAq Lworc3RhdGljIHZvaWQKK2F0YV9pcnFfcmFpc2Uoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs KTsKK3N0YXRpYyB2b2lkCithdGFfaXJxX2xvd2VyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l bCk7CisKK3N0YXRpYyBhdGFfZHJpdmVfdHlwZQorYXRhX2RyaXZlX3R5cGVfYnlfbmFtZShjaGFy ICpkcml2ZV9uYW1lKTsKK3N0YXRpYyBpbnQKK2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAq b3B0cywgaW50ICpjaGFubmVsLCBjaGFyICpkaXNrX21hc3RlciwKKwkJIGNoYXIgKmRpc2tfc2xh dmUsIHVpbnQ4X3QgKmhhc19zbGF2ZSk7CitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0 YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0 YV9pbnRyX2Z1bmNfdCBpbnRyX2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAq b3B0cywgdWludDhfdCBpc2FfYXQpOworCitzdGF0aWMgdm9pZAorYXRhX3Nyc3Qoc3RydWN0IGF0 YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaW5pdGlhbGl6ZV9pZGVudChz dHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9pbml0 aWFsaXplX2lkZW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBpbnQK K2F0YV9jaGFubmVsX2lzX29rKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCBj aCk7CitzdGF0aWMgaW50CithdGFfc2VsZWN0X2RyaXZlX2lzX29rKHN0cnVjdCBhdGFfY2hhbm5l bCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3NldF9zdGF0dXNfb2soc3RydWN0IGF0YV9j aGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFfYmxvY2tfcmVhZHko c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfY29tbWFuZF9h Ym9ydGVkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3Nl dF9zaWduYXR1cmUoc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUpOworCitzdGF0aWMgdm9pZAorYXRh X2FkZHJlc3Npbmdfc2VjX2NvdW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2 X3QgKnBfc2VjdG9yX2NvdW50KTsKK3N0YXRpYyB2b2lkCithdGFfYWRkcmVzc2luZ18yOF9sYmEo c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50MzJfdCAqcF9sYmFfYWRkcmVzcyk7CisK K3N0YXRpYyB2b2lkCithdGFfaW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAq YnJlcSwgc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLAorCQkgICAgICAgdWludDY0X3Qgb2Zm c2V0LCB1aW50NjRfdCBuYnl0ZXMsIHZvaWQgKmJ1ZmZlcik7CitzdGF0aWMgdm9pZAorYXRhX2hh bmRsZV9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJyKTsKKwor c3RhdGljIHZvaWQKK2F0YV9waW9fZG9fdHJhbnNmZXIoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBp b19zZXR1cCwgdWludDY0X3Qgc2l6ZV90cmFuc2ZlciwKKwkJICAgICBhdGFfcGlvX2VuZF90cmFu c2Zlcl9mdW5jX3QgZW5kX3RyYW5zZmVyLCB1aW50OF90IHVzZV93b3JkKTsKK3N0YXRpYyBpbnQK K2F0YV9waW9faW5fcHJvZ3Jlc3Moc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCk7Citz dGF0aWMgdWludDhfdCAqCithdGFfcGlvX2dldF9idWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19z ZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX2NoZWNrX2VuZF90cmFuc2Zl cihzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB1aW50MzJfdAorYXRh X3Bpb19nZXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB2 b2lkCithdGFfcGlvX3B1dF91aW50KHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVp bnQzMl90IHdyaXRlX3ZhbHVlKTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX2dlbmVyaWNfZW5kX3Ry YW5zZmVyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFf cmVhZF9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7Citz dGF0aWMgdm9pZAorYXRhX3dyaXRlX211bHRpcGxlX2Jsb2NrX2RvbmUoc3RydWN0IGF0YV9jaGFu bmVsICpjaGFubmVsKTsKKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF9kb25l KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl X2lkZW50aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRh X2hhbmRsZV9zZXRmZWF0dXJlcyhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGlj IHZvaWQKK2F0YV9oYW5kbGVfc2V0X211bHRpKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7 CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9yZWFkX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5l bCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9yZWFkX3ZlcmlmeShzdHJ1Y3Qg YXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfd3JpdGVfbXVs dGlwbGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFu ZGxlX2RtYShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3Qgb3BfZGlyKTsKK3N0 YXRpYyB2b2lkCithdGFfaGFuZGxlX2ZsdXNoY2FjaGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFu bmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpj aGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2F0YXBpX2lkZW50aWZ5KHN0cnVjdCBh dGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9wYWNrZXRfY21k KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9j bWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90IGNtZCk7CisKK3N0YXRpYyB2 b2lkCithdGFfYXRhcGlfZGF0YV9yZXF1ZXN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7 CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hh bm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9pbnF1aXJ5KHN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KTsKK3N0YXRpYyB2b2lkCithdGFfYXRh cGlfaGFuZGxlX3JlYWRfY2FwYWNpdHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50 OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF90b2Moc3Ry dWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQK K2F0YV9hdGFwaV9oYW5kbGVfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4 X3QgKnBhY2tldCk7CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZChzdHJ1Y3QgYXRhX2NoYW5u ZWwgKmNoYW5uZWwpOworCitzdGF0aWMgdWludDY0X3QKK2F0YV9jb21tYW5kX2Jsb2NrX3JlYWQo c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50NjRfdCBvZmZzZXQpOworc3RhdGljIHZv aWQKK2F0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwK KwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpOworCitzdGF0aWMg dWludDY0X3QKK2F0YV9hbHRzdGF0dXNfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp Oworc3RhdGljIHZvaWQKK2F0YV9jb250cm9sX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hh bm5lbCwKKwkJaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKTsKKworLyoKKyAqIFBDSSBBVEEgZnVu Y3Rpb24gZGVjbGFyYXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCitwY2lfYXRhX2ludHJfYXNzZXJ0 KHZvaWQgKmFyZyk7CitzdGF0aWMgdm9pZAorcGNpX2F0YV9pbnRyX2RlYXNzZXJ0KHZvaWQgKmFy Zyk7CisKK3N0YXRpYyBpbnQKK3BjaV9hdGFfcGFyc2VfcGFyYW1zKGNvbnN0IGNoYXIgKm9wdHMs IGNoYXIgKm9wdDAsIGNoYXIgKm9wdDEsIHVpbnQ4X3QgKm5yX2NoYW5uZWxzKTsKK3N0YXRpYyBp bnQKK3BjaV9hdGFfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpw aSwgY2hhciAqb3B0cywgaW50IGF0YXBpKTsKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaGRfaW5pdChz dHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cyk7CisK K3N0YXRpYyB2b2lkCitwY2lfYXRhX2RtYV9zdGFydChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2Ms IHVpbnQ4X3QgY2gpOworc3RhdGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0b3Aoc3RydWN0IHBjaV9h dGFfc29mdGMgKnNjLCB1aW50OF90IGNoKTsKK3N0YXRpYyB1aW50NjRfdAorcGNpX2F0YV9idXNf bWFzdGVyX3JlYWQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50NjRfdCBvZmZzZXQpOwor c3RhdGljIHZvaWQKK3BjaV9hdGFfYnVzX21hc3Rlcl93cml0ZShzdHJ1Y3QgcGNpX2F0YV9zb2Z0 YyAqc2MsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKTsKKwor c3RhdGljIHVpbnQ2NF90CitwY2lfYXRhX3JlYWQoc3RydWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1 LCBzdHJ1Y3QgcGNpX2Rldmluc3QgKnBpLCBpbnQgYmFyaWR4LAorCQl1aW50NjRfdCBvZmZzZXQs IGludCBzaXplKTsKK3N0YXRpYyB2b2lkCitwY2lfYXRhX3dyaXRlKHN0cnVjdCB2bWN0eCAqY3R4 LCBpbnQgdmNwdSwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwKKwkJaW50IGJhcmlkeCwgdWludDY0 X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpOworCisvKgorICogTFBDIEFUQSBm dW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2xwY19hdGFfaW50cl9hc3Nl cnQodm9pZCAqYXJnKTsKK3N0YXRpYyB2b2lkCitscGNfYXRhX2ludHJfZGVhc3NlcnQodm9pZCAq YXJnKTsKKworaW50CitscGNfYXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIGNvbnN0IGNoYXIg Km9wdHMpOworCitzdGF0aWMgaW50CitscGNfYXRhX2lvX2hhbmRsZXIoc3RydWN0IHZtY3R4ICpj dHgsIGludCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMsIHVpbnQzMl90 ICplYXgsIHZvaWQgKmFyZyk7CitzdGF0aWMgaW50CitscGNfYXRhX2lvY3RsX2hhbmRsZXIoc3Ry dWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0 ZXMsIHVpbnQzMl90ICplYXgsIHZvaWQgKmFyZyk7CisKKworLyoKKyAqIEFUQSBnbG9iYWwgZGF0 YQorICovCitzdHJ1Y3QgcGNpX2RldmVtdSBwY2lfZGVfYXRhX2hkID0geworCS5wZV9lbXUgPQki YXRhLWhkIiwKKwkucGVfaW5pdCA9CXBjaV9hdGFfaGRfaW5pdCwKKwkucGVfYmFyd3JpdGUgPQlw Y2lfYXRhX3dyaXRlLAorCS5wZV9iYXJyZWFkID0JcGNpX2F0YV9yZWFkCit9OworUENJX0VNVUxf U0VUKHBjaV9kZV9hdGFfaGQpOworCitzdGF0aWMgc3RydWN0IGxwY19hdGFfc29mdGMgbHBjX2F0 YV9zY1tBVEFfQ0hBTk5FTFNdID0geworCXtOVUxMLCAxNCwgMHgxZjAsIDB4M2Y2LCAiYXRhMF9p b3BvcnQiLCAiYXRhMF9pb2N0bHBvcnQifSwKKwl7TlVMTCwgMTUsIDB4MTcwLCAweDM3NiwgImF0 YTFfaW9wb3J0IiwgImF0YTFfaW9jdGxwb3J0In0KK307CisKKworLyoKKyAqIEFUQSBtb2R1bGUg ZnVuY3Rpb24gZGVmaW5pdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2F0YV9pcnFfcmFpc2Uoc3Ry dWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOworCisJ aXJxX2Rpc2FibGVkID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5pcnFfZGlzYWJs ZWQ7CisKKwlpZiAoIWlycV9kaXNhYmxlZCAmJiAhY2hhbm5lbC0+bGludHIpIHsKKwkJY2hhbm5l bC0+bGludHIgPSAxOworCQljaGFubmVsLT5pbnRyX2Fzc2VydChjaGFubmVsLT5wcl9zYyk7CisJ fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2lycV9sb3dlcihzdHJ1Y3QgYXRh X2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKGNoYW5uZWwtPmxpbnRyKSB7CisJCWNoYW5uZWwt PmxpbnRyID0gMDsKKwkJY2hhbm5lbC0+aW50cl9kZWFzc2VydChjaGFubmVsLT5wcl9zYyk7CisJ fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgYXRhX2RyaXZlX3R5cGUKK2F0YV9kcml2ZV90eXBl X2J5X25hbWUoY2hhciAqZHJpdmVfbmFtZSkKK3sKKwlpbnQgaSwgbGVuOworCWNoYXIgKmV4dCA9 IE5VTEw7CisKKwlpZiAoIWRyaXZlX25hbWUpCisJCXJldHVybiBBVEFfRFJJVkVfRU1QVFk7CisK KwlsZW4gPSBzdHJsZW4oZHJpdmVfbmFtZSk7CisKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7 IGktLSkgeworCQlpZiAoZHJpdmVfbmFtZVtpXSA9PSAnLicpIHsKKwkJCWV4dCA9IGRyaXZlX25h bWUgKyBpICsgMTsKKwkJCWlmIChzdHJjbXAoZXh0LCAiaXNvIikgPT0gMCkKKwkJCQlyZXR1cm4g QVRBUElfQ0Q7CisJCQlicmVhazsKKwkJfQorCX0KKworCXJldHVybiBBVEFfSEQ7Cit9CisKK3N0 YXRpYyBpbnQKK2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgaW50ICpjaGFubmVs LCBjaGFyICpkaXNrX21hc3RlciwKKwkJIGNoYXIgKmRpc2tfc2xhdmUsIHVpbnQ4X3QgKmhhc19z bGF2ZSkKK3sKKwl1aW50OF90IGxlbjsKKwljaGFyIHBhcmFtWzY0XTsKKwljaGFyICpwYXJhbXNb M107CisJdWludDhfdCBpLCBqOworCWludCBjaDsKKworCXBhcmFtc1swXSA9IE5VTEw7CisJcGFy YW1zWzFdID0gTlVMTDsKKwlwYXJhbXNbMl0gPSBOVUxMOworCisJaWYgKCFvcHRzKSB7CisJCWRw cmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFtczogb3B0cyBzaG91bGQgYmUgbGlrZTogWCxN QVNURVJbLFNMQVZFXVxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSBzdHJsZW4ob3B0 cyk7CisJaWYgKGxlbiA+PSA2NCkgeworCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJh bXM6IEFUQSBzdHJpbmcgcGFyYW0gdG9vIGJpZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlz dHJjcHkocGFyYW0sIG9wdHMpOworCisJaiA9IDA7CisJcGFyYW1zW2pdID0gcGFyYW07CisJZm9y IChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmIChwYXJhbVtpXSA9PSAnLCcpIHsKKwkJCWor KzsKKwkJCWlmIChqID4gMikgeworCQkJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFt czogdG8gbWFueSBwYXJhbXNcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXBhcmFtW2ld ID0gJ1wwJzsKKwkJCXBhcmFtc1tqXSA9IHBhcmFtICsgaSArIDE7CisJCX0KKwl9CisKKwljaCA9 IGF0b2kocGFyYW1zWzBdKTsKKwlpZiAoY2ggIT0gQVRBX1ggJiYgY2ggIT0gQVRBX1kpIHsKKwkJ ZHByaW50KExPR19FUlIsICJhdGFfcGFyc2VfcGFyYW1zOiB0aGUgY2hhbm5lbCBzaG91bGQgYmUg MCBvciAxXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwkqY2hhbm5lbCA9IGNoOworCisJaWYgKHBh cmFtc1sxXSA9PSBOVUxMIHx8IHN0cmxlbihwYXJhbXNbMV0pID49IDMyKSB7CisJCWRwcmludChM T0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFtczogdGhlIG5hbWUgb2YgTUFTVEVSIHNob3VsZCBiZSBn aXZlblxuIik7CisJCXJldHVybiAtMTsKKwl9CisJc3RyY3B5KGRpc2tfbWFzdGVyLCBwYXJhbXNb MV0pOworCisJaWYgKHBhcmFtc1syXSAhPSBOVUxMICYmIHN0cmxlbihwYXJhbXNbMl0pIDwgMzIp IHsKKwkJc3RyY3B5KGRpc2tfc2xhdmUsICBwYXJhbXNbMl0pOworCQkqaGFzX3NsYXZlID0gMTsK Kwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0 YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0 YV9pbnRyX2Z1bmNfdCBpbnRyX2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAq b3B0cywgdWludDhfdCBpc2FfYXQpCit7CisJY2hhciBiaWRlbnRbc2l6ZW9mKCJYWDpYOlg6WCIp XTsKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEwsICpiY3R4dF9zID0gTlVMTDsK KwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCWludCByZXQ7CisJaW50IGNo X2F0YSA9IC0xOworCWNoYXIgZGlza19tYXN0ZXJbMzJdOworCWNoYXIgZGlza19zbGF2ZVszMl07 CisJdWludDhfdCBoYXNfc2xhdmUgPSAwOworCWF0YV9kcml2ZV90eXBlIG1hc3Rlcl90eXBlID0g QVRBX0RSSVZFX0VNUFRZOworCWF0YV9kcml2ZV90eXBlIHNsYXZlX3R5cGUgPSBBVEFfRFJJVkVf RU1QVFk7CisKKwlyZXQgPSBhdGFfcGFyc2VfcGFyYW1zKG9wdHMsICZjaF9hdGEsIGRpc2tfbWFz dGVyLCBkaXNrX3NsYXZlLCAmaGFzX3NsYXZlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZHByaW50 KExPR19FUlIsICJhdGFfaW5pdDogc29tZSBlcnJvcnMgd2l0aCB0aGUgaW5wdXQgY2hlY2tpbmdc biIpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6 IGNoX2F0YTogJWRcbiIsIGNoX2F0YSk7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gb3BlbiB0aGUg YmFja2luZyBpbWFnZXMuIFVzZSB0aGUKKwkgKiAiUENJL0lTQTpjaDpkcml2ZSIgZm9yIHRoZSBp ZGVudGlmaWVyIHN0cmluZy4KKwkgKi8KKwlzbnByaW50ZihiaWRlbnQsIHNpemVvZihiaWRlbnQp LCAiJWQ6JWQ6JWQiLCBpc2FfYXQsIGNoX2F0YSwgQVRBX01BU1RFUik7CisJYmN0eHQgPSBibG9j a2lmX29wZW4oZGlza19tYXN0ZXIsIGJpZGVudCk7CisJaWYgKGJjdHh0ID09IE5VTEwpIHsKKwkJ Z290byBvcGVuX2ZhaWw7CisJfQorCisJbWFzdGVyX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9u YW1lKGRpc2tfbWFzdGVyKTsKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfbWFz dGVyOiAlcyB0eXBlOiAlc1xuIiwKKwkgICAgICAgZGlza19tYXN0ZXIsIG1hc3Rlcl90eXBlID09 IEFUQV9IRCA/ICJhdGFfaGQiIDogImF0YXBpX2NkIik7CisKKwlpZiAoaGFzX3NsYXZlKSB7CisJ CXNucHJpbnRmKGJpZGVudCwgc2l6ZW9mKGJpZGVudCksICIlZDolZDolZCIsIGlzYV9hdCwgY2hf YXRhLCBBVEFfU0xBVkUpOworCQliY3R4dF9zID0gYmxvY2tpZl9vcGVuKGRpc2tfc2xhdmUsIGJp ZGVudCk7CisJCWlmIChiY3R4dF9zID09IE5VTEwpIHsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG9w ZW5fZmFpbDsKKwkJfQorCisJCXNsYXZlX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGRp c2tfc2xhdmUpOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfc2xhdmU6ICVz IHR5cGU6ICVzXG4iLAorCQkgICAgICAgZGlza19zbGF2ZSwgc2xhdmVfdHlwZSA9PSBBVEFfSEQg PyAiYXRhX2hkIiA6ICJhdGFwaV9jZCIpOworCX0KKworCWRwcmludChMT0dfREVCVUcsICJhdGFf aW5pdDogb3B0czogJXMsIGF0YXBpOiAlZFxuIiwgb3B0cywgMCk7CisKKwljaGFubmVsID0gY2Fs bG9jKDEsIHNpemVvZihzdHJ1Y3QgYXRhX2NoYW5uZWwpKTsKKworCWNoYW5uZWwtPnZtX2N0eCA9 IGN0eDsKKwljaGFubmVsLT5pbnRlcmZhY2UgPSBjaF9hdGE7CisJY2hhbm5lbC0+aGFzX3NsYXZl ID0gaGFzX3NsYXZlOworCisJY2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdLnR5cGUgPSBtYXN0 ZXJfdHlwZTsKKwljaGFubmVsLT5kcml2ZXNbQVRBX1NMQVZFXS50eXBlID0gc2xhdmVfdHlwZTsK KworCWNoYW5uZWwtPmRyaXZlc1tBVEFfTUFTVEVSXS5iY3R4dCA9IGJjdHh0OworCWNoYW5uZWwt PmRyaXZlc1tBVEFfU0xBVkVdLmJjdHh0ICA9IGJjdHh0X3M7CisKKwljaGFubmVsLT5kcml2ZXNb QVRBX01BU1RFUl0ucGlvX3NldHVwLmNoYW5uZWwgPSBjaGFubmVsOworCWNoYW5uZWwtPmRyaXZl c1tBVEFfU0xBVkVdLnBpb19zZXR1cC5jaGFubmVsICA9IGNoYW5uZWw7CisKKwljaGFubmVsLT5p bnRyX2Fzc2VydCA9IGludHJfYXNzZXJ0OworCWNoYW5uZWwtPmludHJfZGVhc3NlcnQgPSBpbnRy X2RlYXNzZXJ0OworCWNoYW5uZWwtPnByX3NjID0gcHJfc2M7CisKKwlyZXR1cm4gY2hhbm5lbDsK Kworb3Blbl9mYWlsOgorCWlmIChyZXQpIHsKKwkJYmxvY2tpZl9jbG9zZShiY3R4dCk7CisJCWlm IChiY3R4dF9zICE9IE5VTEwpIHsKKwkJCWJsb2NraWZfY2xvc2UoYmN0eHRfcyk7CisJCX0KKwl9 CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQKK2F0YV9zcnN0KHN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9IE5VTEw7CisJ aW50IGRldjsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfc3JzdDogU29mdHdhcmUgUmVzZXRc biIpOworCisJZm9yIChkZXYgPSAwOyBkZXYgPCBBVEFfRFJJVkVTOyBkZXYrKykgeworCQlkcml2 ZSA9ICZjaGFubmVsLT5kcml2ZXNbZGV2XTsKKworCQlpZiAoZHJpdmUtPnR5cGUgIT0gQVRBX0RS SVZFX0VNUFRZKSB7CisKKwkJCWRyaXZlLT5lcnJvciAgPSBBVEFfRV9JTEk7CisJCQlkcml2ZS0+ c3RhdHVzID0gQVRBX1NfUkVBRFk7CisKKwkJCWF0YV9zZXRfc2lnbmF0dXJlKGRyaXZlKTsKKwkJ fQorCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9pbml0aWFsaXplX2lkZW50 KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2 ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0 eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3BhcmFtcyAqaWRlbnRfZGF0YSA9IE5VTEw7 CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwl1aW50MTZfdCBj eWxpbmRlcnM7CisJdWludDhfdCAgaGVhZHM7CisJdWludDhfdCAgc2VjdG9yczsKKwl1aW50MzJf dCB0b3RhbF9zZWN0b3JzOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0g JmRyaXZlLT5waW9fc2V0dXA7CisJaWRlbnRfZGF0YSA9IChzdHJ1Y3QgYXRhX3BhcmFtcyAqKWF0 YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCk7CisKKwl0b3RhbF9zZWN0b3JzID0gYmxv Y2tpZl9zaXplKGJjdHh0KSAvIEFUQV9TRUNUT1JfU0laRTsKKworCW1lbXNldChpZGVudF9kYXRh LCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wYXJhbXMpKTsKKworCS8qIE51bWJlciBvZiBzZWN0b3Jz IHBlciBibG9jayB1c2VkIGluIHJlYWQgLyB3cml0ZSBtdWx0aSBjb21tYW5kcyAqLworCWlkZW50 X2RhdGEtPnNlY3RvcnNfaW50ciB8PSAweDgwIDw8IDg7CisJaWRlbnRfZGF0YS0+c2VjdG9yc19p bnRyIHw9IEFUQV9TRUNUT1JTX1BFUl9CTE9DSzsKKworCS8qIFVzZSBETUEyIG1vZGUgKi8KKwlp ZGVudF9kYXRhLT5jYXBhYmlsaXRpZXMxIHw9IEFUQV9TVVBQT1JUX0RNQTsKKwlpZGVudF9kYXRh LT5td2RtYW1vZGVzIHw9IEFUQV9XX0RNQTI7CisKKwkvKiBVc2UgUElPNCBtb2RlICovCisJaWRl bnRfZGF0YS0+YXRhdmFsaWQgIHw9IEFUQV9GTEFHXzY0XzcwOworCWlkZW50X2RhdGEtPmFwaW9t b2RlcyB8PSBBVEFfTU9ERV9QSU80OworCisJLyogV2UgdXNlIDI4LWJpdCBMQkEgYWRkcmVzc2lu ZyBiZWNhdXNlIENIUyBhZGRyZXNzaW5nIGlzIG9ic29sZXRlIGluIEFUQS9BVEFQSSA2ICovCisJ aWRlbnRfZGF0YS0+Y2FwYWJpbGl0aWVzMSB8PSBBVEFfU1VQUE9SVF9MQkE7CisJaWRlbnRfZGF0 YS0+bGJhX3NpemVfMSA9IHRvdGFsX3NlY3RvcnM7CisJaWRlbnRfZGF0YS0+bGJhX3NpemVfMiA9 IHRvdGFsX3NlY3RvcnMgPj4gMTY7CisKKwkvKiBTdXBwb3J0IHdyaXRlLXJlYWQtdmVyaWZ5ICov CisJaWRlbnRfZGF0YS0+c3VwcG9ydDIgfD0gQVRBX1NVUFBPUlRfV1JJVEVSRUFEVkVSSUZZOwor CWlkZW50X2RhdGEtPmVuYWJsZWQyIHw9IEFUQV9TVVBQT1JUX1dSSVRFUkVBRFZFUklGWTsKKwor CS8qIFN1cHBvcnQgQVRBIEZMVVNIQ0FDSEUgKi8KKwlpZGVudF9kYXRhLT5zdXBwb3J0LmNvbW1h bmQyIHw9IEFUQV9TVVBQT1JUX0ZMVVNIQ0FDSEU7CisJaWRlbnRfZGF0YS0+ZW5hYmxlZC5jb21t YW5kMiB8PSBBVEFfU1VQUE9SVF9GTFVTSENBQ0hFOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1i ZXIgPSBBVEEvQVRBUEktNiAqLworCWlkZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FU QVBJXzY7CisKKwkvKiBUaGlzIGluZm9ybWF0aW9uIGFyZSB1c2VkIG9ubHkgZm9yIHByaW50aW5n IHB1cnBvc2VzICovCisJYmxvY2tpZl9jaHMoYmN0eHQsICZjeWxpbmRlcnMsICZoZWFkcywgJnNl Y3RvcnMpOworCisJaWRlbnRfZGF0YS0+Y3lsaW5kZXJzID0gY3lsaW5kZXJzOworCWlkZW50X2Rh dGEtPmhlYWRzICAgICA9IGhlYWRzOworCWlkZW50X2RhdGEtPnNlY3RvcnMgICA9IHNlY3RvcnM7 CisKKwkvKiBNb2RlbDogQkhZVkUgQVRBIElERSBESVNLICovCisJbWVtY3B5KGlkZW50X2RhdGEt Pm1vZGVsLCAgICAiSEJWWSBFVEEgQURJIEVJREtTICAgICAgICAgICAgICAgICAgICAgICIsIDQw KTsKKwkvKiBTZXJpYWwgbnVtYmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+c2Vy aWFsLCAgICIyMTQzNjUgICAgICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJzaW9u OiAxLjAgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgpOwor CisJZHByaW50KExPR19ERUJVRywgImF0YV9pbml0aWFsaXplX2lkZW50OiBjaGFubmVsOiAlZCwg ZHJpdmU6ICVkIEM6ICVkLCBIOiAlZCwgUzogJWQsIHRvdGFsX3NlY3RvcnM6ICVkXG4iLAorCQkJ Y2hhbm5lbC0+aW50ZXJmYWNlLCBjaGFubmVsLT5kcml2ZSwgY3lsaW5kZXJzLCBoZWFkcywgc2Vj dG9ycywgdG90YWxfc2VjdG9ycyk7CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwg c2l6ZW9mKHN0cnVjdCBhdGFfcGFyYW1zKSwgYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2Zlciwg Y2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9h dGFwaV9pbml0aWFsaXplX2lkZW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlz dHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVd OworCXN0cnVjdCBhdGFfcGFyYW1zICppZGVudF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bp b19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3Nl dHVwOworCWlkZW50X2RhdGEgPSAoc3RydWN0IGF0YV9wYXJhbXMgKilhdGFfcGlvX2dldF9idWZm ZXJfZGF0YShwaW9fc2V0dXApOworCisJbWVtc2V0KGlkZW50X2RhdGEsIDAsIHNpemVvZihzdHJ1 Y3QgYXRhX3BhcmFtcykpOworCisJLyogQ0RST00gZGV2aWNlICovCisJaWRlbnRfZGF0YS0+Y29u ZmlnIHw9IChBVEFfUFJPVE9fQVRBUElfMTIgfCBBVEFfQVRBUElfVFlQRV9DRFJPTSB8IEFUQV9E UlFfRkFTVCk7CisKKwkvKiBVc2UgRE1BMiBtb2RlICovCisJaWRlbnRfZGF0YS0+Y2FwYWJpbGl0 aWVzMSB8PSBBVEFfU1VQUE9SVF9ETUE7CisJaWRlbnRfZGF0YS0+bXdkbWFtb2RlcyB8PSBBVEFf V19ETUEyOworCisJLyogVXNlIFBJTzQgbW9kZSAqLworCWlkZW50X2RhdGEtPmF0YXZhbGlkICB8 PSBBVEFfRkxBR182NF83MDsKKwlpZGVudF9kYXRhLT5hcGlvbW9kZXMgfD0gQVRBX01PREVfUElP NDsKKworCS8qIFdlIHVzZSAyOC1iaXQgTEJBIGFkZHJlc3NpbmcgYmVjYXVzZSBDSFMgYWRkcmVz c2luZyBpcyBvYnNvbGV0ZSBpbiBBVEEvQVRBUEkgNiAqLworCWlkZW50X2RhdGEtPmNhcGFiaWxp dGllczEgfD0gQVRBX1NVUFBPUlRfTEJBOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgPSBB VEEvQVRBUEktNiAqLworCWlkZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FUQVBJXzY7 CisKKwkvKiBNb2RlbDogQkhZVkUgQVRBUEkgSURFIENEUk9NICovCisJbWVtY3B5KGlkZW50X2Rh dGEtPm1vZGVsLCAgICAiSEJWWSBFVEFQQSBJREkgRURDT1IgTSAgICAgICAgICAgICAgICAgICIs IDQwKTsKKwkvKiBTZXJpYWwgbnVtYmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+ c2VyaWFsLCAgICIyMTQzNjUgICAgICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJz aW9uOiAxLjAgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgp OworCisJZHByaW50KExPR19ERUJVRywgImF0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50OiBjaGFu bmVsOiAlZCwgZHJpdmU6ICVkXG4iLAorCSAgICAgICBjaGFubmVsLT5pbnRlcmZhY2UsIGNoYW5u ZWwtPmRyaXZlKTsKKworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplb2Yoc3Ry dWN0IGF0YV9wYXJhbXMpLCBhdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyLCBjaGFubmVsLT51 c2VfMTZiaXQpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgaW50CithdGFfY2hhbm5lbF9pc19v ayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgY2gpCit7CisJaWYgKGNoYW5u ZWwtPmludGVyZmFjZSA9PSBjaCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGludAorYXRhX3NlbGVjdF9kcml2ZV9pc19vayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5u ZWwpCit7CisJaWYgKGNoYW5uZWwtPmRyaXZlID09IEFUQV9TTEFWRSAmJiAhY2hhbm5lbC0+aGFz X3NsYXZlKSB7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9p ZAorYXRhX3NldF9zdGF0dXNfb2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0 cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07 CisKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5zdGF0dXMgfD0gQVRB X1NfUkVBRFk7CisJZHJpdmUtPnN0YXR1cyAmPSB+QVRBX1NfRFdGOworCWRyaXZlLT5zdGF0dXMg Jj0gfkFUQV9TX0RSUTsKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19FUlJPUjsKKworCWRyaXZl LT5lcnJvciA9IDA7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFf YmxvY2tfcmVhZHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFf ZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2 ZS0+YWx0c3RhdHVzICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5hbHRzdGF0dXMgfD0gQVRBX1Nf RFJROworCWRyaXZlLT5hbHRzdGF0dXMgfD0gQVRBX1NfUkVBRFk7CisKKwlkcml2ZS0+c3RhdHVz IHw9IEFUQV9TX0RSUTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9jb21tYW5k X2Fib3J0ZWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJp dmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+ c3RhdHVzICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5zdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlk cml2ZS0+c3RhdHVzIHw9IEFUQV9TX0VSUk9SOworCisJZHJpdmUtPmVycm9yIHw9IEFUQV9FX0FC T1JUOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX3NldF9zaWduYXR1cmUoc3Ry dWN0IGF0YV9kcml2ZSAqZHJpdmUpCit7CisJZHJpdmUtPnNlY2NvdW50ID0gMHgwMTsKKwlkcml2 ZS0+bGJhX2xvdyAgPSAweDAxOworCisJaWYgKGRyaXZlLT50eXBlID09IEFUQV9IRCkgeworCQlk cml2ZS0+bGJhX21pZCAgPSAweDAwOworCQlkcml2ZS0+bGJhX2hpZ2ggPSAweDAwOworCQlkcml2 ZS0+aGRkZXZzZWwgPSAweDAwOworCX0KKwllbHNlIGlmIChkcml2ZS0+dHlwZSA9PSBBVEFQSV9D RCkgeworCQlkcml2ZS0+bGJhX21pZCAgPSBBVEFQSV9NQUdJQ19MU0I7CisJCWRyaXZlLT5sYmFf aGlnaCA9IEFUQVBJX01BR0lDX01TQjsKKwkJZHJpdmUtPmhkZGV2c2VsICY9IDB4MTA7CisJfQor CWVsc2UKKwkJYXNzZXJ0KDApOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2Fk ZHJlc3Npbmdfc2VjX2NvdW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2X3Qg KnBfc2VjdG9yX2NvdW50KQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwt PmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJdWludDE2X3Qgc2VjdG9yX2NvdW50OworCisJc2Vj dG9yX2NvdW50ID0gZHJpdmUtPnNlY2NvdW50ID8gZHJpdmUtPnNlY2NvdW50IDogQVRBX01BWF9T RUNfQ09VTlQ7CisJKnBfc2VjdG9yX2NvdW50ID0gc2VjdG9yX2NvdW50OworCisJcmV0dXJuOwor fQorCitzdGF0aWMgdm9pZAorYXRhX2FkZHJlc3NpbmdfMjhfbGJhKHN0cnVjdCBhdGFfY2hhbm5l bCAqY2hhbm5lbCwgdWludDMyX3QgKnBfbGJhX2FkZHJlc3MpCit7CisJc3RydWN0IGF0YV9kcml2 ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwl1aW50MzJfdCBs YmFfYWRkcmVzcyA9IDA7CisKKwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+bGJhX2xvdzsKKwlsYmFf YWRkcmVzcyB8PSBkcml2ZS0+bGJhX21pZCA8PCA4OworCWxiYV9hZGRyZXNzIHw9IGRyaXZlLT5s YmFfaGlnaCA8PCAxNjsKKwlsYmFfYWRkcmVzcyB8PSAoZHJpdmUtPmhkZGV2c2VsICYgQVRBX0xC QV8yN18yNF9NQVNLKSA8PCAyNDsKKworCSpwX2xiYV9hZGRyZXNzID0gbGJhX2FkZHJlc3M7CisK KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVj dCBibG9ja2lmX3JlcSAqYnJlcSwgc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLAorCQkgICAg ICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBuYnl0ZXMsIHZvaWQgKmJ1ZmZlcikKK3sKKwli cmVxLT5icl9wYXJhbSA9IGNoYW5uZWw7CisJYnJlcS0+YnJfY2FsbGJhY2sgPSBhdGFfaGFuZGxl X2Jsb2NrX3JlcXVlc3Q7CisJYnJlcS0+YnJfb2Zmc2V0ID0gb2Zmc2V0OworCWJyZXEtPmJyX2lv dmNudCA9IDE7CisJYnJlcS0+YnJfaW92WzBdLmlvdl9sZW4gPSBuYnl0ZXM7CisJYnJlcS0+YnJf aW92WzBdLmlvdl9iYXNlID0gYnVmZmVyOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor YXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJy KQoreworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3QgYXRhX2NoYW5uZWwg KilyZXEtPmJyX3BhcmFtOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX3Nl dF9kYXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisK KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcGlvX2RvX3RyYW5zZmVyKHN0cnVjdCBh dGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVpbnQ2NF90IHNpemVfdHJhbnNmZXIsCisJCSAgICAg YXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciwgdWludDhfdCB1c2Vfd29y ZCkKK3sKKwlhc3NlcnQoc2l6ZV90cmFuc2ZlciA8PSBBVEFfSU5CVUZfU0laRSk7CisJYXNzZXJ0 KCFhdGFfcGlvX2luX3Byb2dyZXNzKHBpb19zZXR1cCkpOworCisJcGlvX3NldHVwLT51c2Vfd29y ZCA9IHVzZV93b3JkOworCXBpb19zZXR1cC0+cGlvX2J1ZmZlci5jdXJyZW50X3BvcyA9IDA7CisJ cGlvX3NldHVwLT5zaXplX3RyYW5zZmVyID0gc2l6ZV90cmFuc2ZlcjsKKwlwaW9fc2V0dXAtPmVu ZF90cmFuc2ZlciA9IGVuZF90cmFuc2ZlcjsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAor YXRhX3Bpb19pbl9wcm9ncmVzcyhzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQorewor CXJldHVybiAoaW50KXBpb19zZXR1cC0+ZW5kX3RyYW5zZmVyOworfQorCitzdGF0aWMgdWludDhf dCAqCithdGFfcGlvX2dldF9idWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3Nl dHVwKQoreworCXJldHVybiBwaW9fc2V0dXAtPnBpb19idWZmZXIuZGF0YTsKK30KKworc3RhdGlj IHZvaWQKK2F0YV9waW9fY2hlY2tfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpw aW9fc2V0dXApCit7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsID0gcGlvX3NldHVwLT5j aGFubmVsOworCXN0cnVjdCBhdGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9fc2V0dXAt PnBpb19idWZmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciA9 IHBpb19zZXR1cC0+ZW5kX3RyYW5zZmVyOworCisJaWYgKHBpb19idWZmZXItPmN1cnJlbnRfcG9z ID09IHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlcikgeworCQlwaW9fc2V0dXAtPmVuZF90cmFuc2Zl ciA9IE5VTEw7CisJCWVuZF90cmFuc2ZlcihjaGFubmVsKTsKKwl9CisKKwlyZXR1cm47Cit9CisK K3N0YXRpYyB1aW50MzJfdAorYXRhX3Bpb19nZXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAq cGlvX3NldHVwKQoreworCXN0cnVjdCBhdGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9f c2V0dXAtPnBpb19idWZmZXI7CisJdWludDMyX3QgdmFsdWU7CisKKwlhc3NlcnQocGlvX2J1ZmZl ci0+Y3VycmVudF9wb3MgPCBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXIpOworCisJaWYgKHBpb19z ZXR1cC0+dXNlX3dvcmQpIHsKKwkJdmFsdWUgPSAqKHVpbnQxNl90ICopKHBpb19idWZmZXItPmRh dGEgKyBwaW9fYnVmZmVyLT5jdXJyZW50X3Bvcyk7CisJCXBpb19idWZmZXItPmN1cnJlbnRfcG9z ICs9IHNpemVvZih1aW50MTZfdCk7CisJfQorCWVsc2UgeworCQl2YWx1ZSA9ICoodWludDMyX3Qg KikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKTsKKwkJcGlvX2J1 ZmZlci0+Y3VycmVudF9wb3MgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlhdGFfcGlvX2No ZWNrX2VuZF90cmFuc2ZlcihwaW9fc2V0dXApOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0 aWMgdm9pZAorYXRhX3Bpb19wdXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVw LCB1aW50MzJfdCB3cml0ZV92YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgKnBpb19i dWZmZXIgPSAmcGlvX3NldHVwLT5waW9fYnVmZmVyOworCisJYXNzZXJ0KHBpb19idWZmZXItPmN1 cnJlbnRfcG9zIDwgcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyKTsKKworCWlmIChwaW9fc2V0dXAt PnVzZV93b3JkKSB7CisJCSoodWludDE2X3QgKikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZm ZXItPmN1cnJlbnRfcG9zKSA9ICh1aW50MTZfdCl3cml0ZV92YWx1ZTsKKwkJcGlvX2J1ZmZlci0+ Y3VycmVudF9wb3MgKz0gc2l6ZW9mKHVpbnQxNl90KTsKKwl9CisJZWxzZSB7CisJCSoodWludDMy X3QgKikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKSA9IHdyaXRl X3ZhbHVlOworCQlwaW9fYnVmZmVyLT5jdXJyZW50X3BvcyArPSBzaXplb2YodWludDMyX3QpOwor CX0KKworCWF0YV9waW9fY2hlY2tfZW5kX3RyYW5zZmVyKHBpb19zZXR1cCk7CisKKwlyZXR1cm47 Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyKHN0cnVjdCBh dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX3Bpb19nZW5l cmljX2VuZF90cmFuc2ZlcjogY2g6ICVkIGRyaXZlOiAlZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+ aW50ZXJmYWNlLCBjaGFubmVsLT5kcml2ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk CithdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l bC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3Qg YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJy ZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJ aW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+ cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJZHJpdmUtPm9mZnNldCAr PSBwaW9fc2V0dXAtPnNpemVfdHJhbnNmZXI7CisJZHJpdmUtPmNvdW50IC09IHBpb19zZXR1cC0+ c2l6ZV90cmFuc2ZlcjsKKworCWNvdW50ID0gZHJpdmUtPmNvdW50OworCisJaWYgKGNvdW50KSB7 CisJCXNpemVfdHJhbnNmZXIgPSBjb3VudCA+PSBBVEFfQkxPQ0tfU0laRSA/IEFUQV9CTE9DS19T SVpFIDogY291bnQ7CisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5z ZmVyLCBhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOwor CisJCWF0YV9pbml0X2Jsb2NrX3JlcXVlc3QoYnJlcSwgY2hhbm5lbCwgZHJpdmUtPm9mZnNldCwK KwkJCQkgICAgICAgc2l6ZV90cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3Nl dHVwKSk7CisKKwkJZXJyID0gYmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsKKwkJYXNzZXJ0KCFl cnIpOworCX0KKwllbHNlIHsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9yZWFkX211bHRpcGxl X2Jsb2NrX2RvbmU6IEFUQV9SRUFEX01VTCBjb21wbGV0ZWRcbiIpOworCX0KKworCXJldHVybjsK K30KKworc3RhdGljIHZvaWQKK2F0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBh dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFu bmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0 ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1 Y3QgYmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90 IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBp b19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOwor CisJYXRhX2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAor CQkJICAgICAgIHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2Rh dGEocGlvX3NldHVwKSk7CisKKwlkcml2ZS0+b2Zmc2V0ICs9IHBpb19zZXR1cC0+c2l6ZV90cmFu c2ZlcjsKKwlkcml2ZS0+Y291bnQgLT0gcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyOworCisJY291 bnQgPSBkcml2ZS0+Y291bnQ7CisKKwlpZiAoY291bnQpIHsKKwkJc2l6ZV90cmFuc2ZlciA9IGNv dW50ID49IEFUQV9CTE9DS19TSVpFID8gQVRBX0JMT0NLX1NJWkUgOiBjb3VudDsKKwkJYXRhX3Bp b19kb190cmFuc2ZlcihwaW9fc2V0dXAsIHNpemVfdHJhbnNmZXIsIGF0YV93cml0ZV9tdWx0aXBs ZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCX0KKwllbHNlIHsKKwkJZHByaW50 KExPR19ERUJVRywgImF0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lOiBBVEFfV1JJVEVfTVVM IGNvbXBsZXRlZFxuIik7CisJfQorCisJZXJyID0gYmxvY2tpZl93cml0ZShiY3R4dCwgYnJlcSk7 CisJYXNzZXJ0KCFlcnIpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBp X2hhbmRsZV9yZWFkX2RvbmUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVj dCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJ c3RydWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVw ICpwaW9fc2V0dXAgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisJ dWludDY0X3QgY291bnQ7CisJaW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBp b19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOwor CisJZHJpdmUtPm9mZnNldCArPSBBVEFQSV9CTE9DS19TSVpFOworCWRyaXZlLT5jb3VudCAtPSBB VEFQSV9CTE9DS19TSVpFOworCisJY291bnQgPSBkcml2ZS0+Y291bnQ7CisKKwlpZiAoY291bnQp IHsKKwkJYXNzZXJ0KGNvdW50ID49IEFUQVBJX0JMT0NLX1NJWkUpOworCisJCWRyaXZlLT5zZWNj b3VudCA9IEFUQV9JX0lOOworCisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBBVEFQ SV9CTE9DS19TSVpFLCBhdGFfYXRhcGlfaGFuZGxlX3JlYWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2 Yml0KTsKKworCQlhdGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRyaXZlLT5v ZmZzZXQsCisJCQkJICAgICAgIEFUQVBJX0JMT0NLX1NJWkUsIGF0YV9waW9fZ2V0X2J1ZmZlcl9k YXRhKHBpb19zZXR1cCkpOworCisJCWVyciA9IGJsb2NraWZfcmVhZChiY3R4dCwgYnJlcSk7CisJ CWFzc2VydCghZXJyKTsKKwl9CisJZWxzZSB7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfYXRh cGlfaGFuZGxlX3JlYWRfZG9uZTogUkVBRCBjb21wbGV0ZWRcbiIpOworCQlhdGFfYXRhcGlfY21k X2RvbmUoY2hhbm5lbCk7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hh bmRsZV9pZGVudGlmeShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0 YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCWlm IChkcml2ZS0+dHlwZSA9PSBBVEFfSEQpIHsKKwkJYXRhX2luaXRpYWxpemVfaWRlbnQoY2hhbm5l bCk7CisKKwkJYXRhX3NldF9kYXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCQlhdGFfc2V0X3N0 YXR1c19vayhjaGFubmVsKTsKKwkJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKwl9CisJZWxzZSBp ZiAoZHJpdmUtPnR5cGUgPT0gQVRBUElfQ0QpIHsKKwkJYXRhX2NvbW1hbmRfYWJvcnRlZChjaGFu bmVsKTsKKwkJYXRhX3NldF9zaWduYXR1cmUoZHJpdmUpOworCX0KKwllbHNlCisJCWFzc2VydCgw KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfc2V0ZmVhdHVyZXMo c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZl ID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlzd2l0Y2ggKGRyaXZlLT5m ZWF0dXJlcykgeworCWNhc2UgQVRBX1NGX1NFVFhGRVI6CisJCWNoYW5uZWwtPm1vZGUgPSBkcml2 ZS0+c2VjY291bnQ7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3NldGZlYXR1cmVz IEFUQV9TRl9TRVRYRkVSOiBtb2RlOiAlZFxuIiwKKwkJICAgICAgIGNoYW5uZWwtPm1vZGUpOwor CQlicmVhazsKKwljYXNlIEFUQV9TRl9FTkFCX1dDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFf U0ZfRElTX1dDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9QVUlTOgorCQlicmVh azsKKwljYXNlIEFUQV9TRl9ESVNfUFVJUzoKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfUFVJU19T UElOVVA6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0VOQUJfUkNBQ0hFOgorCQlicmVhazsKKwlj YXNlIEFUQV9TRl9ESVNfUkNBQ0hFOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9FTkFCX1JFTElS UToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRElTX1JFTElSUToKKwkJYnJlYWs7CisJY2FzZSBB VEFfU0ZfRU5BQl9TUlZJUlE6CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0RJU19TUlZJUlE6CisJ CWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWF0YV9zZXRfc3RhdHVzX29rKGNo YW5uZWwpOworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRp YyB2b2lkCithdGFfaGFuZGxlX3NldF9tdWx0aShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp Cit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwt PmRyaXZlXTsKKworCWNoYW5uZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID0gZHJpdmUtPnNlY2NvdW50 OworCisJYXNzZXJ0KGNoYW5uZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID09IEFUQV9TRUNUT1JTX1BF Ul9CTE9DSyk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9zZXRfbXVsdGk6IHNl Y3RvcnNfcGVyX2Jsb2NrOiAlZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+c2VjdG9yc19wZXJfYmxv Y2spOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX2lycV9yYWlzZShjaGFu bmVsKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfcmVhZF9tdWx0 aXBsZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAq ZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tp Zl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9 IE5VTEw7CisJc3RydWN0IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXVpbnQxNl90IHNl Y3Rvcl9jb3VudDsKKwl1aW50MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisJdWludDY0X3Qgb2Zmc2V0 OworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsK KworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVw OworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJYXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50 KGNoYW5uZWwsICZzZWN0b3JfY291bnQpOworCWF0YV9hZGRyZXNzaW5nXzI4X2xiYShjaGFubmVs LCAmbGJhX2FkZHJlc3MpOworCisJZHByaW50KExPR19ERUJVRywgImF0YV9oYW5kbGVfcmVhZF9t dWx0aXBsZTogc2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAg IHNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9h ZGRyZXNzICogQVRBX1NFQ1RPUl9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3Vu dCAqIEFUQV9TRUNUT1JfU0laRTsKKworCWRyaXZlLT5jb3VudCA9IGNvdW50OworCWRyaXZlLT5v ZmZzZXQgPSBvZmZzZXQ7CisKKwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJ WkUgPyBBVEFfQkxPQ0tfU0laRSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3Nl dHVwLCBzaXplX3RyYW5zZmVyLCBhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFubmVs LT51c2VfMTZiaXQpOworCisJYXRhX2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCBk cml2ZS0+b2Zmc2V0LAorCQkJICAgICAgIHNpemVfdHJhbnNmZXIsIGF0YV9waW9fZ2V0X2J1ZmZl cl9kYXRhKHBpb19zZXR1cCkpOworCisJZXJyID0gYmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsK Kwlhc3NlcnQoIWVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl X3JlYWRfdmVyaWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCWRwcmlu dChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3JlYWRfdmVyaWZ5XG4iKTsKKworCWF0YV9zZXRfc3Rh dHVzX29rKGNoYW5uZWwpOworCWRyaXZlLT5hbHRzdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlhdGFf aXJxX3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hh bmRsZV93cml0ZV9tdWx0aXBsZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Ry dWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsK KwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0 dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7CisJdWludDMy X3QgbGJhX2FkZHJlc3MgPSAwOworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBjb3VudDsK Kwl1aW50NjRfdCBzaXplX3RyYW5zZmVyOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlv X3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhdGFfYWRkcmVzc2luZ19zZWNfY291bnQo Y2hhbm5lbCwgJnNlY3Rvcl9jb3VudCk7CisJYXRhX2FkZHJlc3NpbmdfMjhfbGJhKGNoYW5uZWws ICZsYmFfYWRkcmVzcyk7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV93cml0ZV9t dWx0aXBsZTogc2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAg IHNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9h ZGRyZXNzICogQVRBX1NFQ1RPUl9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3Vu dCAqIEFUQV9TRUNUT1JfU0laRTsKKworCWRyaXZlLT5vZmZzZXQgPSBvZmZzZXQ7CisJZHJpdmUt PmNvdW50ID0gY291bnQ7CisKKwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJ WkUgPyBBVEFfQkxPQ0tfU0laRSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3Nl dHVwLCBzaXplX3RyYW5zZmVyLCBhdGFfd3JpdGVfbXVsdGlwbGVfYmxvY2tfZG9uZSwgY2hhbm5l bC0+dXNlXzE2Yml0KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVf ZG1hKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCBvcF9kaXIpCit7CisJc3Ry dWN0IHBjaV9hdGFfc29mdGMgKnNjID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNh Y3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7 CisJdWludDMyX3QgbGJhX2FkZHJlc3MgPSAwOworCisJc2MgPSBjaGFubmVsLT5wcl9zYzsKKwlk bWFfdHJhbnNhY3Rpb24gPSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hhbm5lbC0+aW50ZXJmYWNl XTsKKworCWFzc2VydCghZG1hX3RyYW5zYWN0aW9uLT5zdGFydGVkKTsKKworCWF0YV9hZGRyZXNz aW5nX3NlY19jb3VudChjaGFubmVsLCAmc2VjdG9yX2NvdW50KTsKKwlhdGFfYWRkcmVzc2luZ18y OF9sYmEoY2hhbm5lbCwgJmxiYV9hZGRyZXNzKTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFf aGFuZGxlX2RtYTogc2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXggRElSOiAlZFxu IiwKKwkJCXNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3MsIG9wX2Rpcik7CisKKwlkbWFfdHJhbnNh Y3Rpb24tPnN0YXJ0ZWQgPSAxOworCWRtYV90cmFuc2FjdGlvbi0+b2Zmc2V0ID0gKHVpbnQ2NF90 KWxiYV9hZGRyZXNzICogQVRBX1NFQ1RPUl9TSVpFOworCWRtYV90cmFuc2FjdGlvbi0+bmJ5dGVz ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3VudCAqIEFUQV9TRUNUT1JfU0laRTsKKwlkbWFfdHJhbnNh Y3Rpb24tPm9wX2RpciA9IG9wX2RpcjsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0 YV9oYW5kbGVfZmx1c2hjYWNoZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3Ry dWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJl cSA9IE5VTEw7CisJaW50IGVycjsKKworCWJjdHh0ID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwt PmRyaXZlXS5iY3R4dDsKKwlicmVxID0gJmNoYW5uZWwtPmZsdXNoX2JyZXE7CisKKwlkcHJpbnQo TE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9mbHVzaGNhY2hlXG4iKTsKKworCWF0YV9pbml0X2Jsb2Nr X3JlcXVlc3QoYnJlcSwgY2hhbm5lbCwgMCwgMCwgTlVMTCk7CisKKwllcnIgPSBibG9ja2lmX2Zs dXNoKGJjdHh0LCBicmVxKTsKKwlhc3NlcnQoIWVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRp YyB2b2lkCithdGFfaGFuZGxlX3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQorewor CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2 ZV07CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9zZWVrXG4iKTsKKworCWF0YV9z ZXRfc3RhdHVzX29rKGNoYW5uZWwpOworCWRyaXZlLT5zdGF0dXMgfD0gQVRBX1NfRFNDOworCWF0 YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFf aGFuZGxlX2F0YXBpX2lkZW50aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlh dGFfYXRhcGlfaW5pdGlhbGl6ZV9pZGVudChjaGFubmVsKTsKKworCWF0YV9zZXRfZGF0YV9ibG9j a19yZWFkeShjaGFubmVsKTsKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlhdGFfaXJx X3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRs ZV9wYWNrZXRfY21kKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVj dCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZl LT5waW9fc2V0dXA7CisKKwlkcml2ZS0+Ynl0ZV9jb3VudCA9IGRyaXZlLT5sYmFfbWlkIHwgKGRy aXZlLT5sYmFfaGlnaCA8PCA4KTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3Bh Y2tldF9jbWQ6IGJ5dGVfY291bnQ6ICVkXG4iLCBkcml2ZS0+Ynl0ZV9jb3VudCk7CisKKwlhdGFf c2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9DTUQ7CisJ ZHJpdmUtPnN0YXR1cyB8PSBBVEFfU19EUlE7CisKKwkvKiBUaGUgUGFja2V0IGNtZCBpcyByZWNl aXZlZCBhcyA2IHdvcmRzIG9uIGJvdGggTFBDIGFuZCBQQ0kgKi8KKwlhdGFfcGlvX2RvX3RyYW5z ZmVyKHBpb19zZXR1cCwgQVRBUElfUEFDS0VUX1NJWkUsIGF0YV9hdGFwaV9jbWQsIDEpOworCisJ cmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9jbWQoc3RydWN0IGF0YV9jaGFu bmVsICpjaGFubmVsLCB1aW50OF90IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVRB X0FUQV9JREVOVElGWToKKwkJYXRhX2hhbmRsZV9pZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7 CisJY2FzZSBBVEFfU0VURkVBVFVSRVM6CisJCWF0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoY2hhbm5l bCk7CisJCWJyZWFrOworCWNhc2UgQVRBX1NFVF9NVUxUSToKKwkJYXRhX2hhbmRsZV9zZXRfbXVs dGkoY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgQVRBX1JFQUQ6CisJY2FzZSBBVEFfUkVBRF9N VUw6CisJCWF0YV9oYW5kbGVfcmVhZF9tdWx0aXBsZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2Fz ZSBBVEFfUkVBRF9WRVJJRlk6CisJCWF0YV9oYW5kbGVfcmVhZF92ZXJpZnkoY2hhbm5lbCk7CisJ CWJyZWFrOworCWNhc2UgQVRBX1dSSVRFOgorCWNhc2UgQVRBX1dSSVRFX01VTDoKKwkJYXRhX2hh bmRsZV93cml0ZV9tdWx0aXBsZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRF9E TUE6CisJCWF0YV9oYW5kbGVfZG1hKGNoYW5uZWwsIEFUQV9ETUFfUkVBRCk7CisJCWJyZWFrOwor CWNhc2UgQVRBX1dSSVRFX0RNQToKKwkJYXRhX2hhbmRsZV9kbWEoY2hhbm5lbCwgQVRBX0RNQV9X UklURSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0ZMVVNIQ0FDSEU6CisJCWF0YV9oYW5kbGVfZmx1 c2hjYWNoZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VFSzoKKwkJYXRhX2hhbmRs ZV9zZWVrKGNoYW5uZWwpOworCQlicmVhazsKKwljYXNlIEFUQV9BVEFQSV9JREVOVElGWToKKwkJ YXRhX2hhbmRsZV9hdGFwaV9pZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFf UEFDS0VUX0NNRDoKKwkJYXRhX2hhbmRsZV9wYWNrZXRfY21kKGNoYW5uZWwpOworCQlicmVhazsK KwlkZWZhdWx0OgorCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9oYW5kbGVfY21kOiB1bnN1cHBvcnRl ZCBjbWQ6ICUwMnhcbiIsIGNtZCk7CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0 dXJuOworfQorCisvKgorICogYXRhX2NwdV90b19iZTMyIHRyYW5zbGF0ZXMgZnJvbSBsaXR0bGUg ZW5kaWFuIHRvIGJpZyBlbmRpYW4KKyAqIHRoZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCBpcyB1c2Vk IGJ5IHRoZSBjcHUKKyAqIEB2YWwgLSB0aGUgaW50ZWdlciB2YWx1ZSBiZWluZyB0cmFuc2xhdGVk CisgKiBAYnVmIC0gdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQKKyAqLwor c3RhdGljIGlubGluZSB2b2lkCithdGFfY3B1X3RvX2JlMzIodWludDhfdCAqYnVmLCB1aW50MzJf dCB2YWwpCit7CisJYnVmWzBdID0gdmFsID4+IDI0OworCWJ1ZlsxXSA9IHZhbCA+PiAxNjsKKwli dWZbMl0gPSB2YWwgPj4gODsKKwlidWZbM10gPSB2YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisg KiBhdGFfY3B1X3RvX2JlMTYgdHJhbnNsYXRlcyBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVu ZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICog QHZhbCAtIHRoZSB3b3JkIGJlaW5nIHRyYW5zbGF0ZWQKKyAqIEBidWYgLSB0aGUgYWRkcmVzcyB3 aGVyZSB0aGUgcmVzdWx0IGlzIHN0b3JlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0YV9j cHVfdG9fYmUxNih1aW50OF90ICpidWYsIHVpbnQxNl90IHZhbCkKK3sKKwlidWZbMF0gPSB2YWwg Pj4gODsKKwlidWZbMV0gPSB2YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfYmUzMl90 b19jcHUgdHJhbnNsYXRlcyBmcm9tIGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhl IGxpdHRsZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSBy ZXR1cm4gaW50ZWdlciB2YWx1ZQorICogQGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBi ZWluZyB0cmFuc2xhdGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2F0YV9iZTMyX3Rv X2NwdSh1aW50OF90ICpidWYpCit7CisJdWludDMyX3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZb MF0gPDwgMjQ7CisJdmFsIHw9IGJ1ZlsxXSA8PCAxNjsKKwl2YWwgfD0gYnVmWzJdIDw8IDg7CisJ dmFsIHw9IGJ1ZlszXTsKKworCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBhdGFfYmUxNl90b19j cHUgdHJhbnNsYXRlcyBmcm9tIGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhlIGxp dHRsZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSByZXR1 cm4gd29yZCB2YWx1ZQorICogQGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBiZWluZyB0 cmFuc2xhdGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgdWludDE2X3QKK2F0YV9iZTE2X3RvX2NwdSh1 aW50OF90ICpidWYpCit7CisJdWludDE2X3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZbMF0gPDwg ODsKKwl2YWwgfD0gYnVmWzFdOworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2F0 YV9hdGFwaV9wcmludF9wYWNrZXQodWludDhfdCAqcGFja2V0KQoreworCWludCBpOworCisJZHBy aW50KExPR19ERUJVRywgImF0YV9hdGFwaV9wcmludF9wYWNrZXQgY21kOiAweCV4IHBhY2tldDog IiwgcGFja2V0WzBdKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVRBUElfUEFDS0VUX1NJWkU7IGkrKykg eworCQlkcHJpbnQoTE9HX0RFQlVHLCAiJXggIiwgcGFja2V0W2ldKTsKKwl9CisJZHByaW50KExP R19ERUJVRywgIlxuIik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlf ZGF0YV9yZXF1ZXN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJYXRh X3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJZHJpdmUtPnNlY2NvdW50ID0gQVRBX0lfSU47CisJ ZHJpdmUtPnN0YXR1cyB8PSBBVEFfU19EUlE7CisKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOwor CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZF9kb25lKHN0cnVjdCBh dGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFu bmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5l bCk7CisJZHJpdmUtPnNlY2NvdW50ID0gQVRBX0lfSU4gfCBBVEFfSV9DTUQ7CisKKwlhdGFfaXJx X3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBp X2hhbmRsZV9pbnF1aXJ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFj a2V0KQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFu bmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJ c3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICppbnF1aXJ5X2RhdGEgPSAoc3RydWN0IHNjc2lfaW5x dWlyeV9kYXRhICopcGFja2V0OworCXVpbnQ4X3QgbWF4X2xlbiA9IDA7CisKKwlwaW9fc2V0dXAg PSAmZHJpdmUtPnBpb19zZXR1cDsKKworCW1heF9sZW4gPSBwYWNrZXRbNF07CisJYXNzZXJ0KG1h eF9sZW4gPj0gU0hPUlRfSU5RVUlSWV9MRU5HVEgpOworCisJLyogZm9yIG5vdyB3ZSBpbXBsZW1l bnQgb25seSB0aGUgc2hvcnQgaW5xdWlyeSBjbWQgKi8KKwlpZiAocGFja2V0WzFdICYgMHgwMSkg eworCQlhc3NlcnQoMCk7CisJfSBlbHNlIHsKKwkJbWVtc2V0KGlucXVpcnlfZGF0YSwgMCwgU0hP UlRfSU5RVUlSWV9MRU5HVEgpOworCisJCWlucXVpcnlfZGF0YS0+ZGV2aWNlID0gVF9DRFJPTTsK KwkJaW5xdWlyeV9kYXRhLT5kZXZfcXVhbDIgPSBTSURfUk1COworCQlpbnF1aXJ5X2RhdGEtPnZl cnNpb24gPSBTQ1NJX1JFVl8wOworCQlpbnF1aXJ5X2RhdGEtPnJlc3BvbnNlX2Zvcm1hdCA9IDI7 CisJCWlucXVpcnlfZGF0YS0+YWRkaXRpb25hbF9sZW5ndGggPSBTSE9SVF9JTlFVSVJZX0xFTkdU SCAtIDU7CisKKwkJbWVtY3B5KGlucXVpcnlfZGF0YS0+dmVuZG9yLCAiQkhZVkUgICAiLCBTSURf VkVORE9SX1NJWkUpOworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT5wcm9kdWN0LCAiQVRBUEkgSURF IENEUk9NICIsIFNJRF9QUk9EVUNUX1NJWkUpOworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT5yZXZp c2lvbiwgIjEuMSAiLCBTSURfUkVWSVNJT05fU0laRSk7CisKKwkJYXRhX3Bpb19kb190cmFuc2Zl cihwaW9fc2V0dXAsIFNIT1JUX0lOUVVJUllfTEVOR1RILCBhdGFfYXRhcGlfY21kX2RvbmUsIGNo YW5uZWwtPnVzZV8xNmJpdCk7CisJCWF0YV9hdGFwaV9kYXRhX3JlcXVlc3QoY2hhbm5lbCk7CisJ fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2Nh cGFjaXR5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQorewor CXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2 ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJaW50IG5zZWN0 b3JzID0gYmxvY2tpZl9zaXplKGRyaXZlLT5iY3R4dCkgLyBBVEFQSV9CTE9DS19TSVpFOworCisJ cGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhdGFfY3B1X3RvX2JlMzIocGFja2V0 LCBuc2VjdG9ycyAtIDEpOworCWF0YV9jcHVfdG9fYmUzMihwYWNrZXQgKyA0LCBBVEFQSV9CTE9D S19TSVpFKTsKKworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCA4LCBhdGFfYXRhcGlf Y21kX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisJYXRhX2F0YXBpX2RhdGFfcmVxdWVzdChj aGFubmVsKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQgbGJhX3RvX21zZih1aW50OF90 ICpidWYsIGludCBsYmEpCit7CisJbGJhICs9IDE1MDsKKwlidWZbMF0gPSAobGJhIC8gNzUpIC8g NjA7CisJYnVmWzFdID0gKGxiYSAvIDc1KSAlIDYwOworCWJ1ZlsyXSA9IGxiYSAlIDc1OworCisJ cmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhzdHJ1 Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgYXRh X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVj dCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCWludCBuc2VjdG9ycyA9IGJsb2Nr aWZfc2l6ZShkcml2ZS0+YmN0eHQpIC8gQVRBUElfQkxPQ0tfU0laRTsKKworCXVpbnQ4X3QgbXNm ID0gcGFja2V0WzFdICYgMjsKKwl1aW50OF90IGZvcm1hdCA9IHBhY2tldFsyXSAmIDB4MGY7CisJ dWludDhfdCB0cmFja19udW1iZXIgPSBwYWNrZXRbNl07CisJdWludDE2X3QgYWxsb2NhdGlvbl9s ZW5ndGggPSAocGFja2V0WzddIDw8IDgpIHwgcGFja2V0WzhdOworCisJdWludDE2X3QgZGF0YV9s ZW4gPSAwOworCXVpbnQ4X3QgKmRhdGFfem9uZSA9IE5VTEw7CisJdWludDhfdCAqbGVhZF9vdXQg PSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhc3NlcnQodHJh Y2tfbnVtYmVyIDw9IDEgfHwgdHJhY2tfbnVtYmVyID09IDB4YWEpOworCWFzc2VydCghZm9ybWF0 KTsKKworCXBhY2tldFsyXSA9IDE7CQkvKiBGaXJzdCBUcmFjayAqLworCXBhY2tldFszXSA9IDE7 CQkvKiBMYXN0IFRyYWNrICovCisKKwlsZWFkX291dCA9IHBhY2tldCArIDQ7CisKKwlpZiAodHJh Y2tfbnVtYmVyIDw9IDEpIHsKKwkJZGF0YV96b25lID0gcGFja2V0ICsgNDsKKwkJbGVhZF9vdXQg PSBwYWNrZXQgKyAxMjsKKworCQlkYXRhX3pvbmVbMF0gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwkJ ZGF0YV96b25lWzFdID0gMHgxNDsJCS8qIEFEUiwgY29udHJvbCAqLworCQlkYXRhX3pvbmVbMl0g PSAxOwkJLyogdHJhY2sgbnVtYmVyICovCisJCWRhdGFfem9uZVszXSA9IDA7CQkvKiBSZXNlcnZl ZCAqLworCQlpZiAobXNmKSB7CisJCQlkYXRhX3pvbmVbNF0gPSAwOworCQkJbGJhX3RvX21zZihk YXRhX3pvbmUgKyA1LCAwKTsKKwkJfQorCQllbHNlIHsKKwkJCWF0YV9jcHVfdG9fYmUzMihkYXRh X3pvbmUgKyA0LCAwKTsKKwkJfQorCX0KKworCWxlYWRfb3V0WzBdID0gMDsJCS8qIFJlc2VydmVk ICovCisJbGVhZF9vdXRbMV0gPSAweDE2OwkJLyogQURSLCBjb250cm9sICovCisJbGVhZF9vdXRb Ml0gPSAweGFhOwkJLyogdHJhY2sgbnVtYmVyICovCisJbGVhZF9vdXRbM10gPSAwOwkJLyogUmVz ZXJ2ZWQgKi8KKwlpZiAobXNmKSB7CisJCWxlYWRfb3V0WzRdID0gMDsKKwkJbGJhX3RvX21zZihs ZWFkX291dCArIDUsIG5zZWN0b3JzKTsKKwl9CisJZWxzZSB7CisJCWF0YV9jcHVfdG9fYmUzMihs ZWFkX291dCArIDQsIG5zZWN0b3JzKTsKKwl9CisKKwlkYXRhX2xlbiA9IChsZWFkX291dCAtIHBh Y2tldCkgKyA4OworCWF0YV9jcHVfdG9fYmUxNihwYWNrZXQsIGRhdGFfbGVuIC0gMik7CisKKwlk YXRhX2xlbiA9IChkYXRhX2xlbiA8IGFsbG9jYXRpb25fbGVuZ3RoKSA/IGRhdGFfbGVuIDogYWxs b2NhdGlvbl9sZW5ndGg7CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgZGF0YV9s ZW4sIGF0YV9hdGFwaV9jbWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwlhdGFfYXRhcGlf ZGF0YV9yZXF1ZXN0KGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRh X2F0YXBpX2hhbmRsZV9yZWFkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAq cGFja2V0KQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tj aGFubmVsLT5kcml2ZV07CisJc3RydWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0 cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3Jl cSAqYnJlcSA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQgPSAwOworCXVpbnQzMl90 IGxiYV9hZGRyZXNzID0gMDsKKwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgY291bnQ7CisJ aW50IGVycjsKKworCWFzc2VydChkcml2ZS0+Ynl0ZV9jb3VudCA+PSBBVEFQSV9CTE9DS19TSVpF KTsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3Nl dHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJbGJhX2FkZHJlc3MgPSBhdGFfYmUz Ml90b19jcHUocGFja2V0ICsgMik7CisJc2VjdG9yX2NvdW50ID0gYXRhX2JlMTZfdG9fY3B1KHBh Y2tldCArIDcpOworCisJZHByaW50KExPR19ERUJVRywgImF0YV9hdGFwaV9oYW5kbGVfcmVhZDog c2VjdG9yX2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9j b3VudCwgbGJhX2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICog QVRBUElfQkxPQ0tfU0laRTsKKwljb3VudCA9ICh1aW50NjRfdClzZWN0b3JfY291bnQgKiBBVEFQ SV9CTE9DS19TSVpFOworCisJZHJpdmUtPmNvdW50ID0gY291bnQ7CisJZHJpdmUtPm9mZnNldCA9 IG9mZnNldDsKKworCWRyaXZlLT5sYmFfbWlkID0gQVRBUElfQkxPQ0tfU0laRSAmIDB4ZmY7CisJ ZHJpdmUtPmxiYV9oaWdoID0gKEFUQVBJX0JMT0NLX1NJWkUgPj4gOCkgJiAweGZmOworCisJZHJp dmUtPnNlY2NvdW50ID0gQVRBX0lfSU47CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1 cCwgQVRBUElfQkxPQ0tfU0laRSwgYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmUsIGNoYW5uZWwt PnVzZV8xNmJpdCk7CisKKwlhdGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRy aXZlLT5vZmZzZXQsCisJCQkgICAgICAgQVRBUElfQkxPQ0tfU0laRSwgYXRhX3Bpb19nZXRfYnVm ZmVyX2RhdGEocGlvX3NldHVwKSk7CisKKwllcnIgPSBibG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEp OworCWFzc2VydCghZXJyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFw aV9jbWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUg KmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9w aW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJdWludDhfdCAqcGFja2V0ID0gTlVMTDsKKwl1 aW50OF90IG9wX2NvZGUgPSAwOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisJ cGFja2V0ID0gYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKTsKKworCWF0YV9hdGFw aV9wcmludF9wYWNrZXQocGFja2V0KTsKKworCW9wX2NvZGUgPSBwYWNrZXRbMF07CisKKwlzd2l0 Y2ggKG9wX2NvZGUpIHsKKwljYXNlIElOUVVJUlk6CisJCWF0YV9hdGFwaV9oYW5kbGVfaW5xdWly eShjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCWF0 YV9hdGFwaV9oYW5kbGVfcmVhZF9jYXBhY2l0eShjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsK KwljYXNlIFBSRVZFTlRfQUxMT1c6CisJCWF0YV9hdGFwaV9jbWRfZG9uZShjaGFubmVsKTsKKwkJ YnJlYWs7CisJY2FzZSBSRUFEX1RPQzoKKwkJYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhjaGFu bmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFJFQURfMTA6CisJCWF0YV9hdGFwaV9oYW5k bGVfcmVhZChjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFRFU1RfVU5JVF9SRUFE WToKKwkJYXRhX2F0YXBpX2NtZF9kb25lKGNoYW5uZWwpOworCQlicmVhazsKKwlkZWZhdWx0Ogor CQlkcHJpbnQoTE9HX0VSUiwgImF0YV9hdGFwaV9jbWQ6IHVuc3VwcG9ydGVkIGNtZDogJTAyeFxu Iiwgb3BfY29kZSk7CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybjsKK30K Kworc3RhdGljIHVpbnQ2NF90CithdGFfY29tbWFuZF9ibG9ja19yZWFkKHN0cnVjdCBhdGFfY2hh bm5lbCAqY2hhbm5lbCwgdWludDY0X3Qgb2Zmc2V0KQoreworCXVpbnQ2NF90IHZhbHVlID0gMDsK KwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJp dmVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3Nl dHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRB X0RBVEFfUkVHOgorCQl2YWx1ZSA9IGF0YV9waW9fZ2V0X3VpbnQocGlvX3NldHVwKTsKKwkJYnJl YWs7CisJY2FzZSBBVEFfRVJST1JfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5lcnJvcjsKKwkJZHBy aW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9FUlJPUl9SRUc6ICVs eGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VDQ09VTlRfUkVHOgorCQl2YWx1 ZSA9IGRyaXZlLT5zZWNjb3VudDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Js b2NrX3JlYWQ6IEFUQV9TRUNDT1VOVF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJ Y2FzZSBBVEFfTEJBX0xPV19SRUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9sb3c7CisJCWRwcmlu dChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja19yZWFkOiBBVEFfTEJBX0xPV19SRUc6ICVs eGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX01JRF9SRUc6CisJCXZhbHVl ID0gZHJpdmUtPmxiYV9taWQ7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9j a19yZWFkOiBBVEFfTEJBX01JRF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2Fz ZSBBVEFfTEJBX0hJR0hfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5sYmFfaGlnaDsKKwkJZHByaW50 KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9MQkFfSElHSF9SRUc6ICVs eGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQl2YWx1 ZSA9IGRyaXZlLT5oZGRldnNlbDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Js b2NrX3JlYWQ6IEFUQV9IRERFVlNFTF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJ Y2FzZSBBVEFfU1RBVFVTX1JFRzoKKwkJYXRhX2lycV9sb3dlcihjaGFubmVsKTsKKworCQl2YWx1 ZSA9IGRyaXZlLT5zdGF0dXM7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9j a19yZWFkOiBBVEFfU1RBVFVTX1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwlkZWZh dWx0OgorCQl2YWx1ZSA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKwor c3RhdGljIHZvaWQKK2F0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAq Y2hhbm5lbCwKKwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7 CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRy aXZlXTsKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZTAgPSAmY2hhbm5lbC0+ZHJpdmVzW0FUQV9N QVNURVJdOworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlMSA9ICZjaGFubmVsLT5kcml2ZXNbQVRB X1NMQVZFXTsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXVp bnQ4X3QgcmVnX3ZhbHVlOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlz d2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRBX0RBVEFfUkVHOgorCQlhdGFfcGlvX3B1dF91aW50 KHBpb19zZXR1cCwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9GRUFUVVJFU19SRUc6CisJ CWRyaXZlMC0+ZmVhdHVyZXMgPSB2YWx1ZTsKKwkJZHJpdmUxLT5mZWF0dXJlcyA9IHZhbHVlOwor CQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9GRUFUVVJF U19SRUc6ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9TRUND T1VOVF9SRUc6CisJCWRyaXZlMC0+c2VjY291bnQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5zZWNjb3Vu dCA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6 IEFUQV9TRUNDT1VOVF9SRUc6ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwlj YXNlIEFUQV9MQkFfTE9XX1JFRzoKKwkJZHJpdmUwLT5sYmFfbG93ID0gdmFsdWU7CisJCWRyaXZl MS0+bGJhX2xvdyA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxv Y2tfd3JpdGU6IEFUQV9MQkFfTE9XX1JFRzogJXhoXG4iLCAodWludDhfdCl2YWx1ZSk7CisJCWJy ZWFrOworCWNhc2UgQVRBX0xCQV9NSURfUkVHOgorCQlkcml2ZTAtPmxiYV9taWQgPSB2YWx1ZTsK KwkJZHJpdmUxLT5sYmFfbWlkID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29t bWFuZF9ibG9ja193cml0ZTogQVRBX0xCQV9NSURfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVl KTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX0hJR0hfUkVHOgorCQlkcml2ZTAtPmxiYV9oaWdo ID0gdmFsdWU7CisJCWRyaXZlMS0+bGJhX2hpZ2ggPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJV RywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBBVEFfTEJBX0hJR0hfUkVHOiAleGhcbiIsICh1 aW50OF90KXZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQlyZWdf dmFsdWUgPSB2YWx1ZTsKKworCQlkcml2ZTAtPmhkZGV2c2VsID0gdmFsdWU7CisJCWRyaXZlMS0+ aGRkZXZzZWwgPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2Nr X3dyaXRlOiBBVEFfSERERVZTRUxfUkVHOiAleGhcbiIsIHJlZ192YWx1ZSk7CisKKwkJaWYgKHJl Z192YWx1ZSAmIEFUQV9EX0lCTSkKKwkJCWNoYW5uZWwtPnNpemUgPSBBVEFfU0VDVE9SX1NJWkU7 CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfREVWKEFUQV9TTEFWRSkpIHsKKwkJCWRwcmludChMT0df REVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9TTEFWRVxuIik7CisJ CQljaGFubmVsLT5kcml2ZSA9IEFUQV9TTEFWRTsKKwkJfQorCQllbHNlIHsKKwkJCWRwcmludChM T0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9NQVNURVJcbiIp OworCQkJY2hhbm5lbC0+ZHJpdmUgPSBBVEFfTUFTVEVSOworCQl9CisJCWlmICghYXRhX3NlbGVj dF9kcml2ZV9pc19vayhjaGFubmVsKSkgeworCQkJZHJpdmUxLT5zdGF0dXMgPSBBVEFfRFJJVkVf QUJTRU5UOworCQl9CisJCWJyZWFrOworCWNhc2UgQVRBX0NPTU1BTkRfUkVHOgorCQlkcml2ZTAt PmNvbW1hbmQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5jb21tYW5kID0gdmFsdWU7CisJCWRwcmludChM T0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTogQVRBX0NPTU1BTkRfUkVHOiAleGhc biIsICh1aW50OF90KXZhbHVlKTsKKwkJYXRhX2hhbmRsZV9jbWQoY2hhbm5lbCwgdmFsdWUpOwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9jb21tYW5kX2Jsb2Nr X3dyaXRlOiB1bnN1cHBvcnRlZCByZWc6JWx4XG4iLCBvZmZzZXQpOworCQlhc3NlcnQoMCk7CisJ CWJyZWFrOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90CithdGFfYWx0c3Rh dHVzX3JlYWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJp dmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJdWludDY0X3Qg dmFsdWUgPSAwOworCisJdmFsdWUgPSBkcml2ZS0+YWx0c3RhdHVzOworCisJZHByaW50KExPR19E RUJVRywgImF0YV9hbHRzdGF0dXNfcmVhZDogdmFsdWU6ICVsdVxuIiwgdmFsdWUpOworCisJcmV0 dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorYXRhX2NvbnRyb2xfd3JpdGUoc3RydWN0IGF0 YV9jaGFubmVsICpjaGFubmVsLAorCQlpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJdWlu dDhfdCByZWdfdmFsdWU7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJp dmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCXJlZ192YWx1ZSA9ICh1aW50OF90KXZhbHVlOworCisJ ZHByaW50KExPR19ERUJVRywgImF0YV9jb250cm9sX3dyaXRlOiBpcnFfZGlzYWJsZWQ6ICVkXG4i LCByZWdfdmFsdWUgJiBBVEFfQV9JRFMpOworCisJaWYgKHJlZ192YWx1ZSAmIEFUQV9BX0lEUykK KwkJZHJpdmUtPmlycV9kaXNhYmxlZCA9IDE7CisJZWxzZQorCQlkcml2ZS0+aXJxX2Rpc2FibGVk ID0gMDsKKworCWlmIChyZWdfdmFsdWUgJiBBVEFfQV9SRVNFVCkKKwkJYXRhX3Nyc3QoY2hhbm5l bCk7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBQQ0kgQVRBIGZ1bmN0aW9uIGRlZmluaXRpb25z CisgKi8KK3N0YXRpYyB2b2lkCitwY2lfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlz dHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MgPSAoc3RydWN0IHBjaV9hdGFfc29mdGMgKilhcmc7CisJ c3RydWN0IHBjaV9kZXZpbnN0ICpwaSA9IHNjLT5hc2NfcGk7CisKKwlwY2lfbGludHJfYXNzZXJ0 KHBpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfaW50cl9kZWFzc2Vy dCh2b2lkICphcmcpCit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0gKHN0cnVjdCBwY2lf YXRhX3NvZnRjICopYXJnOworCXN0cnVjdCBwY2lfZGV2aW5zdCAqcGkgPSBzYy0+YXNjX3BpOwor CisJcGNpX2xpbnRyX2RlYXNzZXJ0KHBpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAor cGNpX2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgY2hhciAqb3B0MCwgY2hhciAq b3B0MSwgdWludDhfdCAqbnJfY2hhbm5lbHMpCit7CisJdWludDhfdCBsZW47CisJY2hhciB0bXBf b3B0c1sxMjhdOworCWNoYXIgKmNoMCA9IE5VTEwsICpjaDEgPSBOVUxMOworCXVpbnQ4X3QgaTsK KworCWlmICghb3B0cykgeworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfcGFyc2VfcGFyYW1z OiBvcHRzIHNob3VsZCBiZSBsaWtlOiAlc1xuIiwKKwkJICAgICAgICJYLE1BU1RFUl9YWyxTTEFW RV9YXVs7WSxNQVNURVJfWVssU0xBVkVfWV1dIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4g PSBzdHJsZW4ob3B0cyk7CisJaWYgKGxlbiA+PSAxMjgpIHsKKwkJZHByaW50KExPR19FUlIsICJw Y2lfYXRhX3BhcnNlX3BhcmFtczogUENJIEFUQSBzdHJpbmcgcGFyYW1zIHRvbyBiaWdcbiIpOwor CQlyZXR1cm4gLTE7CisJfQorCisJc3RyY3B5KHRtcF9vcHRzLCBvcHRzKTsKKworCWNoMCA9IHRt cF9vcHRzOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh0bXBfb3B0c1tp XSA9PSBQQ0lfQVRBX0NIX1NFUCkgeworCQkJaWYgKGNoMSkgeworCQkJCWRwcmludChMT0dfRVJS LCAicGNpX2F0YV9wYXJzZV9wYXJhbXM6IHRvIG1hbnkgY2hhbm5lbHNcbiIpOworCQkJCXJldHVy biAtMTsKKwkJCX0KKwkJCXRtcF9vcHRzW2ldID0gJ1wwJzsKKwkJCWNoMSA9IHRtcF9vcHRzICsg aSArIDE7CisJCX0KKwl9CisKKwlpZiAoc3RybGVuKGNoMCkgPj0gNjQpIHsKKwkJZHByaW50KExP R19FUlIsICJwY2lfYXRhX3BhcnNlX3BhcmFtczogdGhlIG5hbWUgb2YgQVRBX1ggY2hhbm5lbCB0 b28gYmlnXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJjcHkob3B0MCwgY2gwKTsKKwkqbnJf Y2hhbm5lbHMgPSAxOworCisJaWYgKGNoMSAhPSBOVUxMICYmIHN0cmxlbihjaDEpIDwgNjQpIHsK KwkJc3RyY3B5KG9wdDEsICBjaDEpOworCQkqbnJfY2hhbm5lbHMgPSAyOworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgaW50CitwY2lfYXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0 cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMsIGludCBhdGFwaSkKK3sKKwlzdHJ1Y3Qg YXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpwY2lf YXRhX3NjID0gTlVMTDsKKwljaGFyIGNoX29wdHNbMl1bNjRdOworCXVpbnQ4X3QgbnJfY2hhbm5l bHMgPSAwOworCWludCByZXQsIGk7CisKKwlhdGFfb3Blbl9kYmdfZmlsZSgpOworCisJcmV0ID0g cGNpX2F0YV9wYXJzZV9wYXJhbXMob3B0cywgY2hfb3B0c1swXSwgY2hfb3B0c1sxXSwgJm5yX2No YW5uZWxzKTsKKwlpZiAocmV0KSB7CisJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9pbml0OiBz b21lIGVycm9ycyB3aXRoIHRoZSBpbnB1dCBjaGVja2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9 CisKKwlwY2lfYXRhX3NjID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGNpX2F0YV9zb2Z0Yykp OworCWlmICghcGNpX2F0YV9zYykKKwkJcmV0dXJuIC0xOworCisJcGNpX2F0YV9zYy0+Y2hhbm5l bHNbQVRBX1hdID0gTlVMTDsKKwlwY2lfYXRhX3NjLT5jaGFubmVsc1tBVEFfWV0gPSBOVUxMOwor CisJZm9yIChpID0gMDsgaSA8IG5yX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbm5lbCA9IGF0YV9p bml0KGN0eCwgcGNpX2F0YV9pbnRyX2Fzc2VydCwgcGNpX2F0YV9pbnRyX2RlYXNzZXJ0LAorCQkJ CSAgIHBjaV9hdGFfc2MsIGNoX29wdHNbaV0sIDApOworCQlpZiAoIWNoYW5uZWwpCisJCQljb250 aW51ZTsKKwkJY2hhbm5lbC0+dXNlXzE2Yml0ID0gMDsKKwkJYXNzZXJ0KCFwY2lfYXRhX3NjLT5j aGFubmVsc1tjaGFubmVsLT5pbnRlcmZhY2VdKTsKKwkJcGNpX2F0YV9zYy0+Y2hhbm5lbHNbY2hh bm5lbC0+aW50ZXJmYWNlXSA9IGNoYW5uZWw7CisJfQorCisJLyogZXhpdCBpZiBub25lIG9mIHRo ZSBjaGFubmVscyBhcmUgaW5pdGlhbGl6ZWQgKi8KKwlpZiAoIXBjaV9hdGFfc2MtPmNoYW5uZWxz W0FUQV9YXSAmJiAhcGNpX2F0YV9zYy0+Y2hhbm5lbHNbQVRBX1ldKSB7CisJCWZyZWUocGNpX2F0 YV9zYyk7CisJCXJldHVybiAtMTsKKwl9CisKKwlwaS0+cGlfYXJnID0gcGNpX2F0YV9zYzsKKwlw Y2lfYXRhX3NjLT5hc2NfcGkgPSBwaTsKKworCS8qIGdlbmVyaWMgUENJIEFUQS9BVEFQSSBkZXZp Y2UgQVRBX0lUODIxMUYgKi8KKwlwY2lfc2V0X2NmZ2RhdGExNihwaSwgUENJUl9ERVZJQ0UsIDB4 ODIxMSk7CS8qIEFUQS9BVEFQSSBDb250cm9sbGVyICovCisJcGNpX3NldF9jZmdkYXRhMTYocGks IFBDSVJfVkVORE9SLCAweDEyODMpOwkvKiBXYWxkbyAqLworCisJLyogdGhpcyBpcyBhIHN0b3Jh Z2UgY2xhc3MgZGV2aWNlICovCisJcGNpX3NldF9jZmdkYXRhOChwaSwgUENJUl9DTEFTUywgUENJ Q19TVE9SQUdFKTsKKwkvKiB0aGlzIGlzIGFuIElERS9BVEEgdHlwZSBkZXZpY2UgKi8KKwlwY2lf c2V0X2NmZ2RhdGE4KHBpLCBQQ0lSX1NVQkNMQVNTLCBQQ0lTX1NUT1JBR0VfSURFKTsKKworCXBj aV9zZXRfY2ZnZGF0YTgocGksIFBDSVJfUFJPR0lGLCBQQ0lQX1NUT1JBR0VfSURFX01BU1RFUkRF ViB8CisJCQkgUENJUF9TVE9SQUdFX0lERV9NT0RFUFJJTSB8IFBDSVBfU1RPUkFHRV9JREVfTU9E RVNFQyk7CisKKwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9CQVIwLCBQQ0lCQVJfSU8sIEFU QV9JT1NJWkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjEsIFBDSUJBUl9JTywg QVRBX0NUTElPU0laRSk7CisJcGNpX2VtdWxfYWxsb2NfYmFyKHBpLCBQQ0lfQkFSMiwgUENJQkFS X0lPLCBBVEFfSU9TSVpFKTsKKwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9CQVIzLCBQQ0lC QVJfSU8sIEFUQV9DVExJT1NJWkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjQs IFBDSUJBUl9JTywgQVRBX0NIQU5ORUxTICogQVRBX0JNSU9TSVpFKTsKKworCXBjaV9saW50cl9y ZXF1ZXN0KHBpKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwY2lfYXRhX2hkX2lu aXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMp Cit7CisJcmV0dXJuIChwY2lfYXRhX2luaXQoY3R4LCBwaSwgb3B0cywgMCkpOworfQorCitzdGF0 aWMgdm9pZAorcGNpX2F0YV9kbWFfc3RhcnQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50 OF90IGNoKQoreworCXN0cnVjdCB2bWN0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX2NoYW5u ZWwgKmNoYW5uZWwgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsK KwlzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7 CisJc3RydWN0IGJsb2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXN0cnVjdCBwcmRfZW50cnkg KnByZHQgPSBOVUxMOworCXN0cnVjdCBwcmRfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwl1aW50MzJf dCBwcmR0X2FkZHJlc3M7CisJdWludDMyX3QgaW5kZXg7CisJdWludDMyX3QgYnl0ZV9jb3VudDsK Kwl2b2lkICplbnRyeV9idWZmID0gTlVMTDsKKwlpbnQgZXJyOworCisJY2hhbm5lbCA9IHNjLT5j aGFubmVsc1tjaF07CisKKwljdHggPSBjaGFubmVsLT52bV9jdHg7CisJYXNzZXJ0KGN0eCAhPSBO VUxMKTsKKworCWJjdHh0ID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5iY3R4dDsK KwlkbWFfdHJhbnNhY3Rpb24gPSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hdOworCisJYXNzZXJ0 KGRtYV90cmFuc2FjdGlvbi0+c3RhcnRlZCk7CisKKwlhc3NlcnQoKChzYy0+Y21kW2NoXSAmIEFU QV9CTUNNRF9XUklURV9SRUFEKSAmJiBkbWFfdHJhbnNhY3Rpb24tPm9wX2RpciA9PSBBVEFfRE1B X1JFQUQpIHx8CisJCSghKHNjLT5jbWRbY2hdICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpICYmIGRt YV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfV1JJVEUpKTsKKworCXNjLT5zdGF0W2No XSB8PSBBVEFfQk1TVEFUX0FDVElWRTsKKworCS8qIHByZHRfYWRkcmVzcyBpcyB0aGUgcGh5c2lj YWwgYWRkcmVzcyBvZiB0aGUgcHJkdCBpbiB0aGUgZ3Vlc3QgbWVtb3J5ICovCisJcHJkdF9hZGRy ZXNzID0gc2MtPnByZHRbY2hdOworCisJLyogbWFwIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNz IGludG8gdGhlIGhvc3QgdmlydHVhbCBhZGRyZXNzICovCisJcHJkdCA9IHBhZGRyX2d1ZXN0Mmhv c3QoY3R4LCBwcmR0X2FkZHJlc3MsIEFUQV9ETUFfUFJEVF9TSVpFKTsKKwlhc3NlcnQocHJkdCAh PSBOVUxMKTsKKworCWJyZXEgPSAmZG1hX3RyYW5zYWN0aW9uLT5icmVxOworCWJyZXEtPmJyX3Bh cmFtID0gY2hhbm5lbDsKKwlicmVxLT5icl9jYWxsYmFjayA9IGF0YV9oYW5kbGVfYmxvY2tfcmVx dWVzdDsKKwlicmVxLT5icl9vZmZzZXQgPSBkbWFfdHJhbnNhY3Rpb24tPm9mZnNldDsKKworCWRt YV90cmFuc2FjdGlvbi0+aXNfZW90ID0gMDsKKwlpbmRleCA9IDA7CisJd2hpbGUgKCFkbWFfdHJh bnNhY3Rpb24tPmlzX2VvdCAmJiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA+IDApIHsKKwkJZW50 cnkgPSBwcmR0ICsgaW5kZXg7CisKKwkJZW50cnlfYnVmZiA9IHBhZGRyX2d1ZXN0Mmhvc3QoY3R4 LCBlbnRyeS0+cHJkX2FkZHJlc3MsIGVudHJ5LT5ieXRlX2NvdW50KTsKKwkJYnl0ZV9jb3VudCA9 IGVudHJ5LT5ieXRlX2NvdW50ID8gZW50cnktPmJ5dGVfY291bnQgOiBBVEFfRE1BX01BWF9QUkRf Q09VTlQ7CisKKwkJaWYgKGJ5dGVfY291bnQgPiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcykgewor CQkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX2RtYV9zdGFydDogdGhlIFBSRCBlbnRyeSBjb250 YWlucyAlcyIsCisJCQkgICAgICAgIm1vcmUgYnl0ZXMgdGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNp emVcbiIpOworCQkJYnl0ZV9jb3VudCA9IGRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzOworCQl9CisK KwkJaWYgKGluZGV4ID09IEJMT0NLSUZfSU9WX01BWCkgeworCQkJZHByaW50KExPR19FUlIsICJw Y2lfYXRhX2RtYV9zdGFydDogdGhlIFBSRCBUYWJsZSBjb250YWlucyAlcyIsCisJCQkgICAgICAg Im1vcmUgdGhhbiBCTE9DS0lGX0lPVl9NQVggZW50cmllc1xuIik7CisJCQlicmVhazsKKwkJfQor CisJCWJyZXEtPmJyX2lvdltpbmRleF0uaW92X2xlbiA9IGJ5dGVfY291bnQ7CisJCWJyZXEtPmJy X2lvdltpbmRleF0uaW92X2Jhc2UgPSBlbnRyeV9idWZmOworCisJCWRtYV90cmFuc2FjdGlvbi0+ bmJ5dGVzIC09IGJ5dGVfY291bnQ7CisKKwkJaWYgKGVudHJ5LT52ZW5kb3Jfc3BlY2lmaWMgJiBB VEFfRE1BX1BSRFRfRU9UKQorCQkJZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgPSAxOworCisJCWlu ZGV4Kys7CisJfQorCisJYnJlcS0+YnJfaW92Y250ID0gaW5kZXg7CisKKwlzYy0+c3RhdFtjaF0g fD0gQVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisKKwkvKgorCSAqIFVzZSBhc3luY2hyb25vdXMgb3Bl cmF0aW9ucyBmb3IgcmVhZCAvIHdyaXRlIG9uIHRoZSBibG9jazsKKwkgKiB1cGRhdGUgdGhlIHN0 YXR1cyByZWdpc3RlcnMgYW5kIG5vdGlmeSB0aGUgZ3Vlc3Qgb3BlcmF0aW5nCisJICogc3lzdGVt IHVzaW5nIGFuIGludGVycnVwdCBpbiB0aGUgYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0IGNhbGxi YWNrCisJICovCisJaWYgKGRtYV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfUkVBRCkg eworCQllcnIgPSBibG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEpOworCX0KKwllbHNlIGlmIChkbWFf dHJhbnNhY3Rpb24tPm9wX2RpciA9PSBBVEFfRE1BX1dSSVRFKSB7CisJCWVyciA9IGJsb2NraWZf d3JpdGUoYmN0eHQsIGJyZXEpOworCX0KKwllbHNlIHsKKwkJYXNzZXJ0KDApOworCX0KKworCWFz c2VydCghZXJyKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0 b3Aoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50OF90IGNoKQoreworCXN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJc3RydWN0IHBjaV9hdGFfZG1hX3RyYW5zYWN0aW9u ICpkbWFfdHJhbnNhY3Rpb24gPSBOVUxMOworCisJY2hhbm5lbCA9IHNjLT5jaGFubmVsc1tjaF07 CisJZG1hX3RyYW5zYWN0aW9uID0gJnNjLT5kbWFfdHJhbnNhY3Rpb25zW2NoXTsKKworCWlmKCFk bWFfdHJhbnNhY3Rpb24tPnN0YXJ0ZWQpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChkbWFfdHJh bnNhY3Rpb24tPmlzX2VvdCAmJiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA9PSAwKSB7CisJCXNj LT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0lOVEVSUlVQVDsKKwkJc2MtPnN0YXRbY2hdICY9IH5B VEFfQk1TVEFUX0VSUk9SOworCQlzYy0+c3RhdFtjaF0gJj0gfkFUQV9CTVNUQVRfQUNUSVZFOwor CX0KKwllbHNlIGlmICghZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9u LT5uYnl0ZXMgPT0gMCkgeworCQlzYy0+c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9JTlRFUlJVUFQ7 CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJc2MtPnN0YXRbY2hdIHw9 IEFUQV9CTVNUQVRfQUNUSVZFOworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0b3A6 IERNQSBQUkRUIHRyYW5zZmVyIHdhcyAlcyIsCisJCSAgICAgICAibGFyZ2VyIHRoYW4gdGhlIEFU QSB0cmFuc2ZlciBzaXplXG4iKTsKKwl9CisJZWxzZSBpZiAoZG1hX3RyYW5zYWN0aW9uLT5pc19l b3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPiAwKSB7CisJCXNjLT5zdGF0W2NoXSAmPSB+ QVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9FUlJP UjsKKwkJc2MtPnN0YXRbY2hdICY9IH5BVEFfQk1TVEFUX0FDVElWRTsKKwkJZHByaW50KExPR19F UlIsICJwY2lfYXRhX2RtYV9zdG9wOiBETUEgUFJEVCB0cmFuc2ZlciB3YXMgJXMiLAorCQkgICAg ICAgInNtYWxsZXIgdGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCX0KKwllbHNlIGlm ICghZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPiAw KSB7CisJCXNjLT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0VSUk9SOworCQlkcHJpbnQoTE9HX0VS UiwgInBjaV9hdGFfZG1hX3N0b3A6IHRoZSBQUkQgVGFibGUgY29udGFpbnMgJXMiLAorCQkgICAg ICAgIm1vcmUgdGhhbiBCTE9DS0lGX0lPVl9NQVggZW50cmllc1xuIik7CisJfQorCisJZG1hX3Ry YW5zYWN0aW9uLT5zdGFydGVkID0gMDsKKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90 CitwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ2 NF90IG9mZnNldCkKK3sKKwl1aW50NjRfdCB2YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKG9mZnNldCkg eworCWNhc2UgQVRBX0JNQ01EX1hfUkVHOgorCQl2YWx1ZSA9IHNjLT5jbWRbQVRBX1hdOworCQlk cHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3JlYWQ6IEFUQV9CTUNNRF9YX1JF RzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJ dmFsdWUgPSBzYy0+c3RhdFtBVEFfWF07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1 c19tYXN0ZXJfcmVhZDogQVRBX0JNU1RBVF9YX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFr OworCWNhc2UgQVRBX0JNUFJEVF9YX1JFRzoKKwkJdmFsdWUgPSBzYy0+cHJkdFtBVEFfWF07CisJ CWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNUFJEVF9Y X1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgor CQl2YWx1ZSA9IHNjLT5jbWRbQVRBX1ldOworCQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9i dXNfbWFzdGVyX3JlYWQ6IEFUQV9CTUNNRF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFr OworCWNhc2UgQVRBX0JNU1RBVF9ZX1JFRzoKKwkJdmFsdWUgPSBzYy0+c3RhdFtBVEFfWV07CisJ CWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNU1RBVF9Z X1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9ZX1JFRzoK KwkJdmFsdWUgPSBzYy0+cHJkdFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRh X2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNUFJEVF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJy ZWFrOworCWRlZmF1bHQ6CisJCXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZh bHVlOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlKHN0cnVjdCBw Y2lfYXRhX3NvZnRjICpzYywKKwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3Qg dmFsdWUpCit7CisKKwl1aW50OF90IHJlZ192YWx1ZTsKKworCWlmIChvZmZzZXQgIT0gQVRBX0JN UFJEVF9YX1JFRyAmJiBvZmZzZXQgIT0gQVRBX0JNUFJEVF9ZX1JFRyAmJiBzaXplICE9IDEpCisJ CXJldHVybjsKKwlpZiAoKG9mZnNldCA9PSBBVEFfQk1QUkRUX1hfUkVHIHx8IG9mZnNldCA9PSBB VEFfQk1QUkRUX1lfUkVHKSAmJiBzaXplICE9IDQpCisJCXJldHVybjsKKworCXN3aXRjaCAob2Zm c2V0KSB7CisJY2FzZSBBVEFfQk1DTURfWF9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5jbWRbQVRB X1hdID0gKHVpbnQ4X3QpdmFsdWU7CisKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVz X21hc3Rlcl93cml0ZVtYXTogQVRBX0JNQ01EX1NUQVJUX1NUT1A6ICVkXG4iLAorCQkgICAgICAg cmVnX3ZhbHVlICYgQVRBX0JNQ01EX1NUQVJUX1NUT1ApOworCQlpZiAocmVnX3ZhbHVlICYgQVRB X0JNQ01EX1NUQVJUX1NUT1ApIHsKKwkJCXBjaV9hdGFfZG1hX3N0YXJ0KHNjLCBBVEFfWCk7CisJ CX0KKwkJZWxzZSB7CisJCQlwY2lfYXRhX2RtYV9zdG9wKHNjLCBBVEFfWCk7CisJCX0KKworCQlk cHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1hdOiBBVEFfQk1DTURf V1JJVEVfUkVBRDogJWRcbiIsCisJCSAgICAgICByZWdfdmFsdWUgJiBBVEFfQk1DTURfV1JJVEVf UkVBRCk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJcmVnX3ZhbHVlID0g c2MtPnN0YXRbQVRBX1hdID0gKHVpbnQ4X3QpdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJw Y2lfYXRhX2J1c19tYXN0ZXJfd3JpdGVbWF06IEFUQV9CTVNUQVRfSU5URVJSVVBUOiAlZCwgQVRB X0JNU1RBVF9FUlJPUjogJWRcbiIsCisJCQkJcmVnX3ZhbHVlICAmIEFUQV9CTVNUQVRfSU5URVJS VVBULCByZWdfdmFsdWUgJiBBVEFfQk1TVEFUX0VSUk9SKTsKKwkJaWYgKHJlZ192YWx1ZSAmIEFU QV9CTVNUQVRfSU5URVJSVVBUKQorCQkJc2MtPnN0YXRbQVRBX1hdICY9IH5BVEFfQk1TVEFUX0lO VEVSUlVQVDsKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTVNUQVRfRVJST1IpCisJCQlzYy0+c3Rh dFtBVEFfWF0gJj0gfkFUQV9CTVNUQVRfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJE VF9YX1JFRzoKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtY XTogQVRBX0JNUFJEVF9YX1JFRzogMHgleFxuIiwgKHVpbnQzMl90KXZhbHVlKTsKKwkJc2MtPnBy ZHRbQVRBX1hdID0gdmFsdWU7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgorCQly ZWdfdmFsdWUgPSBzYy0+Y21kW0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOworCisJCWRwcmludChM T0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfd3JpdGVbWV06IEFUQV9CTUNNRF9TVEFSVF9T VE9QOiAlZFxuIiwKKwkJICAgICAgIHJlZ192YWx1ZSAmIEFUQV9CTUNNRF9TVEFSVF9TVE9QKTsK KwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTUNNRF9TVEFSVF9TVE9QKSB7CisJCQlwY2lfYXRhX2Rt YV9zdGFydChzYywgQVRBX1kpOworCQl9CisJCWVsc2UgeworCQkJcGNpX2F0YV9kbWFfc3RvcChz YywgQVRBX1kpOworCQl9CisKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rl cl93cml0ZVtZXTogQVRBX0JNQ01EX1dSSVRFX1JFQUQ6ICVkXG4iLAorCQkgICAgICAgcmVnX3Zh bHVlICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpOworCQlicmVhazsKKwljYXNlIEFUQV9CTVNUQVRf WV9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5zdGF0W0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOwor CQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1ldOiBBVEFfQk1T VEFUX0lOVEVSUlVQVDogJWQsIEFUQV9CTVNUQVRfRVJST1I6ICVkXG4iLAorCQkJCXJlZ192YWx1 ZSAgJiBBVEFfQk1TVEFUX0lOVEVSUlVQVCwgcmVnX3ZhbHVlICYgQVRBX0JNU1RBVF9FUlJPUik7 CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfQk1TVEFUX0lOVEVSUlVQVCkKKwkJCXNjLT5zdGF0W0FU QV9ZXSAmPSB+QVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfQk1T VEFUX0VSUk9SKQorCQkJc2MtPnN0YXRbQVRBX1ldICY9IH5BVEFfQk1TVEFUX0VSUk9SOworCQli cmVhazsKKwljYXNlIEFUQV9CTVBSRFRfWV9SRUc6CisJCWRwcmludChMT0dfREVCVUcsICJwY2lf YXRhX2J1c19tYXN0ZXJfd3JpdGVbWV06IEFUQV9CTVBSRFRfWF9SRUc6IDB4JXhcbiIsICh1aW50 MzJfdCl2YWx1ZSk7CisJCXNjLT5wcmR0W0FUQV9ZXSA9ICh1aW50MzJfdCl2YWx1ZTsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdWlu dDY0X3QKK3BjaV9hdGFfcmVhZChzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBw Y2lfZGV2aW5zdCAqcGksIGludCBiYXJpZHgsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUp Cit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0gcGktPnBpX2FyZzsKKwl1aW50NjRfdCB2 YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKGJhcmlkeCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICgh c2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNf b2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJdmFsdWUgPSBhdGFfY29tbWFuZF9i bG9ja19yZWFkKHNjLT5jaGFubmVsc1tBVEFfWF0sIG9mZnNldCk7CisJCWJyZWFrOworCWNhc2Ug UENJX0JBUjE6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3Nl cnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJdmFs dWUgPSBhdGFfYWx0c3RhdHVzX3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9YXSk7CisJCWJyZWFrOwor CWNhc2UgUENJX0JBUjI6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOwor CQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsK KwkJdmFsdWUgPSBhdGFfY29tbWFuZF9ibG9ja19yZWFkKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9m ZnNldCk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjM6CisJCWlmICghc2MtPmNoYW5uZWxzW0FU QV9ZXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxz W0FUQV9ZXSwgQVRBX1kpKTsKKwkJdmFsdWUgPSBhdGFfYWx0c3RhdHVzX3JlYWQoc2MtPmNoYW5u ZWxzW0FUQV9ZXSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjQ6CisJCXZhbHVlID0gcGNpX2F0 YV9idXNfbWFzdGVyX3JlYWQoc2MsIG9mZnNldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFz c2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9p ZAorcGNpX2F0YV93cml0ZShzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lf ZGV2aW5zdCAqcGksCisJCWludCBiYXJpZHgsIHVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVp bnQ2NF90IHZhbHVlKQoreworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYyA9IHBpLT5waV9hcmc7 CisKKwlzd2l0Y2ggKGJhcmlkeCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICghc2MtPmNoYW5u ZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNo YW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoc2MtPmNo YW5uZWxzW0FUQV9YXSwgb2Zmc2V0LCBzaXplLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUENJ X0JBUjE6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQo YXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJYXRhX2Nv bnRyb2xfd3JpdGUoc2MtPmNoYW5uZWxzW0FUQV9YXSwgc2l6ZSwgdmFsdWUpOworCQlicmVhazsK KwljYXNlIFBDSV9CQVIyOgorCQlpZiAoIXNjLT5jaGFubmVsc1tBVEFfWV0pCisJCQlicmVhazsK KwkJYXNzZXJ0KGF0YV9jaGFubmVsX2lzX29rKHNjLT5jaGFubmVsc1tBVEFfWV0sIEFUQV9ZKSk7 CisJCWF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9mZnNldCwg c2l6ZSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFBDSV9CQVIzOgorCQlpZiAoIXNjLT5jaGFu bmVsc1tBVEFfWV0pCisJCQlicmVhazsKKwkJYXNzZXJ0KGF0YV9jaGFubmVsX2lzX29rKHNjLT5j aGFubmVsc1tBVEFfWV0sIEFUQV9ZKSk7CisJCWF0YV9jb250cm9sX3dyaXRlKHNjLT5jaGFubmVs c1tBVEFfWV0sIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSNDoKKwkJcGNp X2F0YV9idXNfbWFzdGVyX3dyaXRlKHNjLCBvZmZzZXQsIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7 CisJZGVmYXVsdDoKKwkJYXNzZXJ0KDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisK Ky8qCisgKiBMUEMgQVRBIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCits cGNfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAq c2NfbHBjX2F0YSA9IChzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3Qgdm1jdHgg KmxwY19jdHggPSBzY19scGNfYXRhLT5jaGFubmVsLT52bV9jdHg7CisKKwl2bV9pc2FfcHVsc2Vf aXJxKGxwY19jdHgsIHNjX2xwY19hdGEtPmlycSwgc2NfbHBjX2F0YS0+aXJxKTsKKworCXJldHVy bjsKK30KKworc3RhdGljIHZvaWQKK2xwY19hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpCit7 CisJLyoKKwkgKiBUaGUgQVRBIGRldmljZXMgb24gdGhlIExQQyBidXMgZ2VuZXJhdGUgZWRnZSB0 cmlnZ2VyZWQgaW50ZXJydXB0cworCSAqIHNvIG5vdGhpbmcgbW9yZSB0byBkbyBoZXJlCisJICov CisKKwlyZXR1cm47Cit9CisKK2ludAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBj b25zdCBjaGFyICpvcHRzKQoreworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7 CisJc3RydWN0IGlub3V0X3BvcnQgaW9wLCBpb2N0bHA7CisJaW50IGNoX2F0YSA9IC0xOworCWlu dCBlcnI7CisKKwlhdGFfb3Blbl9kYmdfZmlsZSgpOworCisJYXNzZXJ0KG9wdHNbMF0gPT0gJzAn IHx8IG9wdHNbMF0gPT0gJzEnKTsKKwljaF9hdGEgPSBvcHRzWzBdIC0gJzAnOworCisJaWYgKGxw Y19hdGFfc2NbY2hfYXRhXS5jaGFubmVsKSB7CisJCWRwcmludChMT0dfRVJSLCAibHBjX2F0YV9p bml0OiB0aGUgTFBDIGF0YSVkIGlzIGluaXRpYWxpemVkXG4iLCBjaF9hdGEpOworCQlyZXR1cm4g LTE7CisJfQorCisJY2hhbm5lbCA9IGF0YV9pbml0KGN0eCwgbHBjX2F0YV9pbnRyX2Fzc2VydCwg bHBjX2F0YV9pbnRyX2RlYXNzZXJ0LCAmbHBjX2F0YV9zY1tjaF9hdGFdLCBvcHRzLCAxKTsKKwlp ZiAoIWNoYW5uZWwpCisJCXJldHVybiAtMTsKKworCWFzc2VydChjaF9hdGEgPT0gY2hhbm5lbC0+ aW50ZXJmYWNlKTsKKwljaGFubmVsLT51c2VfMTZiaXQgPSAxOworCisJbHBjX2F0YV9zY1tjaF9h dGFdLmNoYW5uZWwgPSBjaGFubmVsOworCisJYnplcm8oJmlvcCwgc2l6ZW9mKHN0cnVjdCBpbm91 dF9wb3J0KSk7CisJaW9wLm5hbWUgPSBscGNfYXRhX3NjW2NoX2F0YV0ubmFtZV9pbzsKKwlpb3Au cG9ydCA9IGxwY19hdGFfc2NbY2hfYXRhXS5iYXNlX2FkZHJfaW87CisJaW9wLnNpemUgPSBBVEFf SU9TSVpFOworCWlvcC5mbGFncyA9IElPUE9SVF9GX0lOT1VUOworCWlvcC5oYW5kbGVyID0gbHBj X2F0YV9pb19oYW5kbGVyOworCWlvcC5hcmcgPSAmbHBjX2F0YV9zY1tjaF9hdGFdOworCisJZXJy ID0gcmVnaXN0ZXJfaW5vdXQoJmlvcCk7CisJYXNzZXJ0KGVyciA9PSAwKTsKKworCWJ6ZXJvKCZp b2N0bHAsIHNpemVvZihzdHJ1Y3QgaW5vdXRfcG9ydCkpOworCWlvY3RscC5uYW1lID0gbHBjX2F0 YV9zY1tjaF9hdGFdLm5hbWVfaW9jdGw7CisJaW9jdGxwLnBvcnQgPSBscGNfYXRhX3NjW2NoX2F0 YV0uYmFzZV9hZGRyX2lvY3RsOworCWlvY3RscC5zaXplID0gQVRBX0NUTElPU0laRTsKKwlpb2N0 bHAuZmxhZ3MgPSBJT1BPUlRfRl9JTk9VVDsKKwlpb2N0bHAuaGFuZGxlciA9IGxwY19hdGFfaW9j dGxfaGFuZGxlcjsKKwlpb2N0bHAuYXJnID0gJmxwY19hdGFfc2NbY2hfYXRhXTsKKworCWVyciA9 IHJlZ2lzdGVyX2lub3V0KCZpb2N0bHApOworCWFzc2VydChlcnIgPT0gMCk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludAorbHBjX2F0YV9pb19oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4 LCBpbnQgdmNwdSwKKwkJICAgaW50IGluLCBpbnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAq ZWF4LCB2b2lkICphcmcpCit7CisJc3RydWN0IGxwY19hdGFfc29mdGMgKmxwY19zYyA9IChzdHJ1 Y3QgbHBjX2F0YV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBO VUxMOworCXVpbnQ4X3Qgb2Zmc2V0ID0gMDsKKworCWFzc2VydChscGNfc2MpOworCWNoYW5uZWwg PSBscGNfc2MtPmNoYW5uZWw7CisJYXNzZXJ0KGNoYW5uZWwpOworCisJb2Zmc2V0ID0gcG9ydCAt IGxwY19zYy0+YmFzZV9hZGRyX2lvOworCWFzc2VydChvZmZzZXQgPCBBVEFfSU9TSVpFKTsKKwor CWlmIChpbikKKwkJKmVheCA9IGF0YV9jb21tYW5kX2Jsb2NrX3JlYWQoY2hhbm5lbCwgb2Zmc2V0 KTsKKwllbHNlCisJCWF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlKGNoYW5uZWwsIG9mZnNldCwgYnl0 ZXMsICplYXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xwY19hdGFfaW9jdGxf aGFuZGxlcihzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsCisJCSAgIGludCBpbiwgaW50IHBv cnQsIGludCBieXRlcywgdWludDMyX3QgKmVheCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBscGNf YXRhX3NvZnRjICpscGNfc2MgPSAoc3RydWN0IGxwY19hdGFfc29mdGMgKilhcmc7CisJc3RydWN0 IGF0YV9jaGFubmVsICpjaGFubmVsID0gTlVMTDsKKwl1aW50OF90IG9mZnNldCA9IDA7CisKKwlh c3NlcnQobHBjX3NjKTsKKwljaGFubmVsID0gbHBjX3NjLT5jaGFubmVsOworCWFzc2VydChjaGFu bmVsKTsKKworCW9mZnNldCA9IHBvcnQgLSBscGNfc2MtPmJhc2VfYWRkcl9pb2N0bDsKKwlhc3Nl cnQob2Zmc2V0IDwgQVRBX0NUTElPU0laRSk7CisKKwlpZiAoaW4pCisJCSplYXggPSBhdGFfYWx0 c3RhdHVzX3JlYWQoY2hhbm5lbCk7CisJZWxzZQorCQlhdGFfY29udHJvbF93cml0ZShjaGFubmVs LCBieXRlcywgKmVheCk7CisKKwlyZXR1cm4gMDsKK30KKwoK --b1_3f564b781b1c7f1f6a251004cff0fd1c--