From owner-freebsd-virtualization@freebsd.org Sat Feb 27 13:12:16 2016 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 A90EAAB5E43 for ; Sat, 27 Feb 2016 13:12:16 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: from phabric-backend.rbsd.freebsd.org (unknown [IPv6:2607:fc50:2000:101::1bb:73]) by mx1.freebsd.org (Postfix) with ESMTP id 8E751D1 for ; Sat, 27 Feb 2016 13:12:16 +0000 (UTC) (envelope-from daemon-user@freebsd.org) Received: by phabric-backend.rbsd.freebsd.org (Postfix, from userid 1346) id 8727733212FA; Sat, 27 Feb 2016 13:12:16 +0000 (UTC) Date: Sat, 27 Feb 2016 13:12:16 +0000 To: freebsd-virtualization@freebsd.org From: "iateaca (Teaca)" Reply-to: D5473+333+79492675d52ac1ab@reviews.freebsd.org Subject: [Differential] [Request, 2, 605 lines] D5473: ATA/ATAPI6 device emulation in bhyve Message-ID: 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: Precedence: bulk Thread-Index: ZmQ1YjBmNDNhNWVhZDYwNjJmNTU3Y2FmMjRk MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="b1_370e5c04a721b87eab23b165702327c0" X-Mailman-Approved-At: Sat, 27 Feb 2016 17:31:47 +0000 X-BeenThere: freebsd-virtualization@freebsd.org X-Mailman-Version: 2.1.20 List-Id: "Discussion of various virtualization techniques FreeBSD supports." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 27 Feb 2016 13:12:16 -0000 --b1_370e5c04a721b87eab23b165702327c0 Content-Type: text/plain; charset = "utf-8" Content-Transfer-Encoding: 8bit iateaca created this revision. iateaca added reviewers: grehan, mav, neel, tychon. iateaca added a subscriber: freebsd-virtualization-list. REVISION SUMMARY This patch implements the ATA/ATAPI6 device emulation in bhyve. The userspace bhyve tree sources must be patched. For example: patch -d bhyve/ < bhyve_ata_atapi6.patch REVISION DETAIL https://reviews.freebsd.org/D5473 AFFECTED FILES Makefile ata.c pci_lpc.c EMAIL PREFERENCES https://reviews.freebsd.org/settings/panel/emailpreferences/ To: iateaca, grehan, mav, neel, tychon Cc: freebsd-virtualization-list --b1_370e5c04a721b87eab23b165702327c0 Content-Type: text/x-patch; charset=utf-8; name="D5473.13829.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="D5473.13829.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 QCAtMCwwICsxLDI1ODAgQEAKKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lz L2F0YS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisj aW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcu aD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8Y2FtL3Njc2kvc2NzaV9hbGwuaD4K KyNpbmNsdWRlIDxtYWNoaW5lL3ZtbS5oPgorI2luY2x1ZGUgPHZtbWFwaS5oPgorCisjaW5jbHVk ZSAiYmxvY2tfaWYuaCIKKyNpbmNsdWRlICJiaHl2ZXJ1bi5oIgorI2luY2x1ZGUgInBjaV9lbXVs LmgiCisjaW5jbHVkZSAicGNpX2lycS5oIgorI2luY2x1ZGUgImlub3V0LmgiCisKKworLyoKKyAq IEFUQSBEZWJ1ZyBMb2cKKyAqLworI2RlZmluZQlERUJVR19BVEEJCQkxCisjaWYgREVCVUdfQVRB ID09IDEKKwordHlwZWRlZiBlbnVtIHsKKwlMT0dfREVCVUcgPSAwLAorCUxPR19FUlIgPSAxLAor fSBMT0dfTEVWRUw7CisKK3N0YXRpYyBGSUxFICpkYmc7CisKK3N0YXRpYyB2b2lkIGF0YV9vcGVu X2RiZ19maWxlKHZvaWQpCit7CisJZGJnID0gZm9wZW4oIi90bXAvYmh5dmVfYXRhLmxvZyIsICJ3 KyIpOworCXJldHVybjsKK30KKworI2RlZmluZSBkcHJpbnQobGV2ZWwsIGZvcm1hdCwgYXJnLi4u KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG97ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAorCQlpZiAobGV2ZWwgPT0gTE9HX0RFQlVHKSB7ZnByaW50ZihkYmcsIGZvcm1hdCwgIyNhcmcp O30gICAgICAgXAorCQllbHNlIHtmcHJpbnRmKGRiZywgIkxPR19FUlI6ICJmb3JtYXQsICMjYXJn KTt9ICAgICAgICAgICAgICAgXAorCQlmZmx1c2goZGJnKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX13aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUg YXRhX29wZW5fZGJnX2ZpbGUoKQk7CisjZGVmaW5lIGRwcmludChsZXZlbCwgZm10LCAuLi4pIGRv IHt9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyoKKyAqIEFUQSBkZWZpbmVzCisgKi8KKworI2Rl ZmluZSBQQ0lfQVRBX0NIX1NFUAkJCSc7JworCisvKiBBVEEgQ2hhbm5lbHMgKi8KKyNkZWZpbmUg QVRBX0NIQU5ORUxTCQkJMHgwMgorI2RlZmluZQlBVEFfWAkJCQkweDAwCisjZGVmaW5lCUFUQV9Z CQkJCTB4MDEKKworI2RlZmluZQlBVEFfRFJJVkVTCQkJMHgwMgorI2RlZmluZQlBVEFfTUFTVEVS CQkJMHgwMAorI2RlZmluZQlBVEFfU0xBVkUJCQkweDAxCisKKyNkZWZpbmUJQVRBX0RSSVZFX0FC U0VOVAkJMHhmOAorCisjZGVmaW5lCUFUQV9ERVYodW5pdCkJCQkoKHVuaXQgPiAwKSA/IDB4MTAg OiAwKQorCisjZGVmaW5lIEFUQV9JT1NJWkUJCQkweDA4CisjZGVmaW5lIEFUQV9DVExJT1NJWkUJ CQkweDAxCisjZGVmaW5lIEFUQV9CTUlPU0laRQkJCTB4MDgKKworI2RlZmluZQlBVEFfU0VDVE9S X1NJWkUJCQk1MTIKKyNkZWZpbmUJQVRBX1NFQ1RPUlNfUEVSX0JMT0NLCQkxMjgKKyNkZWZpbmUJ QVRBX01BWF9TRUNfQ09VTlQJCTI1NgorI2RlZmluZQlBVEFfQkxPQ0tfU0laRQkJCShBVEFfU0VD VE9SU19QRVJfQkxPQ0sgKiBBVEFfU0VDVE9SX1NJWkUpCisjZGVmaW5lCUFUQV9JTkJVRl9TSVpF CQkJKEFUQV9NQVhfU0VDX0NPVU5UICogQVRBX1NFQ1RPUl9TSVpFKQorI2RlZmluZQlBVEFfTEJB XzI3XzI0X01BU0sJCTB4MGYKKworI2RlZmluZSBBVEFQSV9QQUNLRVRfU0laRQkJMTIKKyNkZWZp bmUgQVRBUElfQkxPQ0tfU0laRQkJMjA0OAorCisjZGVmaW5lCUFUQV9XUklURV9NVUxfQ09NUExF VEUJCTAKKyNkZWZpbmUJQVRBX1JFQURfTVVMX0NPTVBMRVRFCQkwCisKKyNkZWZpbmUJQVRBX0RN QV9NQVhfUFJEX0NPVU5UCQk2NTUzNgorI2RlZmluZQlBVEFfRE1BX1BSRFRfU0laRQkJNjU1MzYK KyNkZWZpbmUJQVRBX0RNQV9QUkRUX0VPVAkJMHg4MDAwCisKKyNkZWZpbmUJQVRBX0RNQV9SRUFE CQkJKDApCisjZGVmaW5lCUFUQV9ETUFfV1JJVEUJCQkoMSkKKworI2RlZmluZQlBVEFfV19ETUEy CQkJMHgwNAorI2RlZmluZQlBVEFfTU9ERV9QSU80CQkJMHgwMgorCisjZGVmaW5lCUFUQV9BVEFQ SV82CQkJMHg0MAorCisjZGVmaW5lIEFUQVBJX01BR0lDX0xTQgkJCTB4MTQKKyNkZWZpbmUgQVRB UElfTUFHSUNfTVNCCQkJMHhlYgorCisvKiBQQ0kgQkFSUyBpZHggKi8KKyNkZWZpbmUJUENJX0JB UjAJCQkwCisjZGVmaW5lCVBDSV9CQVIxCQkJMQorI2RlZmluZQlQQ0lfQkFSMgkJCTIKKyNkZWZp bmUJUENJX0JBUjMJCQkzCisjZGVmaW5lCVBDSV9CQVI0CQkJNAorCisvKiBBVEEgQnVzIE1hc3Rl ciBSZWdpc3RlciBPZmZzZXRzIGFuZCBWYWx1ZXMqLworI2RlZmluZQlBVEFfQk1DTURfWF9SRUcJ CQkweDAwCisjZGVmaW5lCUFUQV9CTUNNRF9ZX1JFRwkJCTB4MDgKKyNkZWZpbmUJCUFUQV9CTUNN RF9TVEFSVF9TVE9QCTB4MDEKKyNkZWZpbmUJCUFUQV9CTUNNRF9XUklURV9SRUFECTB4MDgKKwor I2RlZmluZQlBVEFfQk1TVEFUX1hfUkVHCQkweDAyCisjZGVmaW5lCUFUQV9CTVNUQVRfWV9SRUcJ CTB4MEEKKyNkZWZpbmUJCUFUQV9CTVNUQVRfQUNUSVZFCTB4MDEKKyNkZWZpbmUJCUFUQV9CTVNU QVRfRVJST1IJMHgwMgorI2RlZmluZQkJQVRBX0JNU1RBVF9JTlRFUlJVUFQJMHgwNAorI2RlZmlu ZQkJQVRBX0JNU1RBVF9NQVNLCQkweDA3CisjZGVmaW5lCQlBVEFfQk1TVEFUX0RNQV9NQVNURVIJ MHgyMAorI2RlZmluZQkJQVRBX0JNU1RBVF9ETUFfU0xBVkUJMHg0MAorI2RlZmluZQkJQVRBX0JN U1RBVF9ETUFfU0lNUExFWAkweDgwCisKKyNkZWZpbmUJQVRBX0JNUFJEVF9YX1JFRwkJMHgwNAor I2RlZmluZQlBVEFfQk1QUkRUX1lfUkVHCQkweDBDCisKKy8qIFRoZSBDb21tYW5kIEJsb2NrIHJl Z2lzdGVycyAqLworI2RlZmluZQlBVEFfREFUQV9SRUcJCQkweDAwCisjZGVmaW5lCUFUQV9FUlJP Ul9SRUcJCQkweDAxCisjZGVmaW5lCQlBVEFfRV9JTEkJCTB4MDEgICAgLyogaWxsZWdhbCBsZW5n dGggKi8KKyNkZWZpbmUgICAgICAgICBBVEFfRV9BQk9SVCAgICAgICAgICAgICAweDA0ICAgIC8q IGNvbW1hbmQgYWJvcnRlZCAqLworI2RlZmluZQlBVEFfRkVBVFVSRVNfUkVHCQkweDAxCisjZGVm aW5lCUFUQV9TRUNDT1VOVF9SRUcJCTB4MDIKKyNkZWZpbmUJCUFUQV9JX0NNRAkJMHgwMSAgICAv KiBjbWQgKDEpIHwgZGF0YSAoMCkgKi8KKyNkZWZpbmUJCUFUQV9JX0lOCQkweDAyICAgIC8qIHJl YWQgKDEpIHwgd3JpdGUgKDApICovCisjZGVmaW5lCQlBVEFfSV9SRUxFQVNFCQkweDA0ICAgIC8q IHJlbGVhc2VkIGJ1cyAoMSkgKi8KKyNkZWZpbmUJQVRBX0xCQV9MT1dfUkVHCQkJMHgwMworI2Rl ZmluZQlBVEFfTEJBX01JRF9SRUcJCQkweDA0CisjZGVmaW5lCUFUQV9MQkFfSElHSF9SRUcJCTB4 MDUKKyNkZWZpbmUJQVRBX0hEREVWU0VMX1JFRwkJMHgwNgorI2RlZmluZQkJQVRBX0RfTEJBCQkw eDQwICAgIC8qIHVzZSBMQkEgYWRkcmVzc2luZyAqLworI2RlZmluZQkJQVRBX0RfSUJNCQkweGEw ICAgIC8qIDUxMiBieXRlIHNlY3RvcnMsIEVDQyAqLworI2RlZmluZQlBVEFfQ09NTUFORF9SRUcJ CQkweDA3CisjZGVmaW5lCUFUQV9TVEFUVVNfUkVHCQkJMHgwNworI2RlZmluZQkJQVRBX1NfQlVT WQkJMHg4MCAgICAvKiBidXN5ICovCisjZGVmaW5lCQlBVEFfU19SRUFEWQkJMHg0MCAgICAvKiBk cml2ZSByZWFkeSAqLworI2RlZmluZQkJQVRBX1NfRFdGCQkweDIwICAgIC8qIGRyaXZlIHdyaXRl IGZhdWx0ICovCisjZGVmaW5lCQlBVEFfU19EUlEJCTB4MDggICAgLyogZGF0YSByZXF1ZXN0ICov CisjZGVmaW5lCQlBVEFfU19EU0MJCTB4MTAgICAgLyogZHJpdmUgc2VlayBjb21wbGV0ZWQgKi8K KyNkZWZpbmUJCUFUQV9TX0VSUk9SCQkweDAxICAgIC8qIGVycm9yICovCisKKy8qIFRoZSBDb250 cm9sIEJsb2NrIHJlZ2lzdGVycyAqLworI2RlZmluZQlBVEFfQ09OVFJPTF9SRUcJCQkweDBDCisj ZGVmaW5lCQlBVEFfQV9JRFMJCTB4MDIgICAgLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovCisjZGVm aW5lCQlBVEFfQV9SRVNFVAkJMHgwNCAgICAvKiBSRVNFVCBjb250cm9sbGVyICovCisjZGVmaW5l CUFUQV9BTFRTVEFUVVNfUkVHCQkweDBDCisKKyNkZWZpbmUgUkVBRF9UT0MJCQkweDQzCisKK3N0 cnVjdCBhdGFfY2hhbm5lbDsKKwordHlwZWRlZiB2b2lkICgqYXRhX2ludHJfZnVuY190KSh2b2lk ICphcmcpOwordHlwZWRlZiB2b2lkICgqYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190KShzdHJ1 Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCit0eXBlZGVmIGVudW0geworCUFUQV9IRCwKKwlB VEFQSV9DRCwKKwlBVEFfRFJJVkVfRU1QVFkKK30gYXRhX2RyaXZlX3R5cGU7CisKKy8qCisgKiBB VEEgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KK3N0cnVjdCBhdGFfcGlvX2J1ZmZlciB7CisJdWludDhf dCAgZGF0YVtBVEFfSU5CVUZfU0laRV07CisJdWludDY0X3QgY3VycmVudF9wb3M7Cit9OworCitz dHJ1Y3QgYXRhX3Bpb19zZXR1cCB7CisJdWludDhfdCB1c2Vfd29yZDsKKwlzdHJ1Y3QgYmxvY2tp Zl9yZXEgYnJlcTsKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgcGlvX2J1ZmZlcjsKKworCXVpbnQ2 NF90IHNpemVfdHJhbnNmZXI7CisJYXRhX3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFu c2ZlcjsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7Cit9OworCitzdHJ1Y3QgcHJkX2Vu dHJ5IHsKKwl1aW50MzJfdCBwcmRfYWRkcmVzczsKKwl1aW50MTZfdCBieXRlX2NvdW50OworCXVp bnQxNl90IHZlbmRvcl9zcGVjaWZpYzsKK30gX19hdHRyaWJ1dGVfXygoX19wYWNrZWRfXykpOwor CitzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24geworCXN0cnVjdCBibG9ja2lmX3JlcSBi cmVxOworCXVpbnQ4X3QgaXNfZW90OworCXVpbnQ4X3Qgc3RhcnRlZDsKKwl1aW50NjRfdCBvZmZz ZXQ7CisJdWludDY0X3QgbmJ5dGVzOworCXVpbnQ4X3QgIG9wX2RpcjsKK307CisKK3N0cnVjdCBh dGFfZHJpdmUgeworCS8qIEFUQSBEcml2ZSBSZWdpc3RlcnMgKi8KKworCS8qIHRoZSBpbyBwb3J0 IHJhbmdlIHNpemUgPSAweDA4ICovCisJdWludDhfdCBkYXRhOworCXVpbnQ4X3QgZXJyb3I7CisJ dWludDhfdCBmZWF0dXJlczsKKwl1aW50OF90IHNlY2NvdW50OworCXVpbnQ4X3QgbGJhX2xvdzsK Kwl1aW50OF90IGxiYV9taWQ7CisJdWludDhfdCBsYmFfaGlnaDsKKwl1aW50OF90IGhkZGV2c2Vs OworCXVpbnQ4X3QgY29tbWFuZDsKKwl1aW50OF90IHN0YXR1czsKKworCS8qIHRoZSBhbHRwb3J0 IHJhbmdlIHNpemUgPSAweDAxICovCisJdWludDhfdCBhbHRzdGF0dXM7CisKKwlhdGFfZHJpdmVf dHlwZSB0eXBlOworCXVpbnQxNl90IGJ5dGVfY291bnQ7CisJdWludDY0X3Qgb2Zmc2V0OworCXVp bnQ2NF90IGNvdW50OworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOworCXN0cnVjdCBibG9ja2lmX2N0 eHQgKmJjdHh0OworCXN0cnVjdCBhdGFfcGlvX3NldHVwIHBpb19zZXR1cDsKK307CisKK3N0cnVj dCBhdGFfY2hhbm5lbCB7CisJLyogQVRBIENoYW5uZWwgU3RhdGUgVmFyaWFibGVzICovCisJdWlu dDMyX3Qgc2l6ZTsKKwl1aW50OF90IGludGVyZmFjZTsKKwl1aW50OF90IGRyaXZlOworCXVpbnQ4 X3QgaGFzX3NsYXZlOworCXVpbnQ4X3QgbW9kZTsKKwl1aW50OF90IHNlY3RvcnNfcGVyX2Jsb2Nr OworCXVpbnQ4X3QgdXNlXzE2Yml0OworCisJc3RydWN0IGJsb2NraWZfcmVxIGZsdXNoX2JyZXE7 CisKKwlzdHJ1Y3QgYXRhX2RyaXZlIGRyaXZlc1tBVEFfRFJJVkVTXTsKKworCXN0cnVjdCB2bWN0 eCAqdm1fY3R4OworCXZvaWQgKnByX3NjOworCisJLyogSW50ZXJydXB0cyBjYWxsYmFja3MgKFBD SSBvciBMUEMpICovCisJYXRhX2ludHJfZnVuY190IGludHJfYXNzZXJ0OworCWF0YV9pbnRyX2Z1 bmNfdCBpbnRyX2RlYXNzZXJ0OworCXVpbnQ4X3QgbGludHI7Cit9OworCitzdHJ1Y3QgcGNpX2F0 YV9zb2Z0YyB7CisJLyogQVRBIEJ1cyBNYXN0ZXIgUmVnaXN0ZXIgKi8KKwl1aW50OF90ICBjbWRb QVRBX0NIQU5ORUxTXTsKKwl1aW50OF90ICBzdGF0W0FUQV9DSEFOTkVMU107CisJdWludDMyX3Qg cHJkdFtBVEFfQ0hBTk5FTFNdOworCisJc3RydWN0IHBjaV9hdGFfZG1hX3RyYW5zYWN0aW9uIGRt YV90cmFuc2FjdGlvbnNbQVRBX0NIQU5ORUxTXTsKKworCXN0cnVjdCBwY2lfZGV2aW5zdCAqYXNj X3BpOworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbHNbQVRBX0NIQU5ORUxTXTsKK307CisK K3N0cnVjdCBscGNfYXRhX3NvZnRjIHsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWw7CisJ aW50IGlycTsKKwlpbnQgYmFzZV9hZGRyX2lvOworCWludCBiYXNlX2FkZHJfaW9jdGw7CisJY29u c3QgY2hhciAqbmFtZV9pbzsKKwljb25zdCBjaGFyICpuYW1lX2lvY3RsOworfTsKKworCisvKgor ICogQVRBIG1vZHVsZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMKKyAqLworc3RhdGljIHZvaWQKK2F0 YV9pcnFfcmFpc2Uoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCith dGFfaXJxX2xvd2VyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBhdGFf ZHJpdmVfdHlwZQorYXRhX2RyaXZlX3R5cGVfYnlfbmFtZShjaGFyICpkcml2ZV9uYW1lKTsKK3N0 YXRpYyBpbnQKK2F0YV9wYXJzZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgaW50ICpjaGFubmVs LCBjaGFyICpkaXNrX21hc3RlciwKKwkJIGNoYXIgKmRpc2tfc2xhdmUsIHVpbnQ4X3QgKmhhc19z bGF2ZSk7CitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0YV9pbml0KHN0cnVjdCB2bWN0 eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0YV9pbnRyX2Z1bmNfdCBpbnRy X2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAqb3B0cywgdWludDhfdCBpc2Ff YXQpOworCitzdGF0aWMgdm9pZAorYXRhX3Nyc3Qoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs KTsKK3N0YXRpYyB2b2lkCithdGFfaW5pdGlhbGl6ZV9pZGVudChzdHJ1Y3QgYXRhX2NoYW5uZWwg KmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50KHN0cnVj dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyBpbnQKK2F0YV9jaGFubmVsX2lzX29r KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCBjaCk7CitzdGF0aWMgaW50Cith dGFfc2VsZWN0X2RyaXZlX2lzX29rKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0 aWMgdm9pZAorYXRhX3NldF9zdGF0dXNfb2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsK K3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFfYmxvY2tfcmVhZHkoc3RydWN0IGF0YV9jaGFubmVs ICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfY29tbWFuZF9hYm9ydGVkKHN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3NldF9zaWduYXR1cmUoc3RydWN0 IGF0YV9kcml2ZSAqZHJpdmUpOworCitzdGF0aWMgdm9pZAorYXRhX2FkZHJlc3Npbmdfc2VjX2Nv dW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2X3QgKnBfc2VjdG9yX2NvdW50 KTsKK3N0YXRpYyB2b2lkCithdGFfYWRkcmVzc2luZ18yOF9sYmEoc3RydWN0IGF0YV9jaGFubmVs ICpjaGFubmVsLCB1aW50MzJfdCAqcF9sYmFfYWRkcmVzcyk7CisKK3N0YXRpYyB2b2lkCithdGFf aW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSwgc3RydWN0IGF0YV9j aGFubmVsICpjaGFubmVsLAorCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0LCB1aW50NjRfdCBuYnl0 ZXMsIHZvaWQgKmJ1ZmZlcik7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0 KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJyKTsKKworc3RhdGljIHZvaWQKK2F0YV9w aW9fZG9fdHJhbnNmZXIoc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCwgdWludDY0X3Qg c2l6ZV90cmFuc2ZlciwKKwkJICAgICBhdGFfcGlvX2VuZF90cmFuc2Zlcl9mdW5jX3QgZW5kX3Ry YW5zZmVyLCB1aW50OF90IHVzZV93b3JkKTsKK3N0YXRpYyBpbnQKK2F0YV9waW9faW5fcHJvZ3Jl c3Moc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCk7CitzdGF0aWMgdWludDhfdCAqCith dGFfcGlvX2dldF9idWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsK K3N0YXRpYyB2b2lkCithdGFfcGlvX2NoZWNrX2VuZF90cmFuc2ZlcihzdHJ1Y3QgYXRhX3Bpb19z ZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB1aW50MzJfdAorYXRhX3Bpb19nZXRfdWludChzdHJ1 Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX3B1dF91 aW50KHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAsIHVpbnQzMl90IHdyaXRlX3ZhbHVl KTsKK3N0YXRpYyB2b2lkCithdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFfcmVhZF9tdWx0aXBsZV9ibG9j a19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX3dy aXRlX211bHRpcGxlX2Jsb2NrX2RvbmUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKKwor c3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5l bCAqY2hhbm5lbCk7CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2lkZW50aWZ5KHN0cnVjdCBh dGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9zZXRmZWF0dXJl cyhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVf c2V0X211bHRpKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRh X2hhbmRsZV9yZWFkX211bHRpcGxlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0 aWMgdm9pZAorYXRhX2hhbmRsZV9yZWFkX3ZlcmlmeShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5u ZWwpOworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfd3JpdGVfbXVsdGlwbGUoc3RydWN0IGF0YV9j aGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2RtYShzdHJ1Y3QgYXRh X2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3Qgb3BfZGlyKTsKK3N0YXRpYyB2b2lkCithdGFfaGFu ZGxlX2ZsdXNoY2FjaGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2b2lk CithdGFfaGFuZGxlX3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKTsKK3N0YXRpYyB2 b2lkCithdGFfaGFuZGxlX2F0YXBpX2lkZW50aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l bCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9wYWNrZXRfY21kKHN0cnVjdCBhdGFfY2hhbm5l bCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9jbWQoc3RydWN0IGF0YV9jaGFu bmVsICpjaGFubmVsLCB1aW50OF90IGNtZCk7CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfZGF0 YV9yZXF1ZXN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9pZAorYXRh X2F0YXBpX2NtZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCk7CitzdGF0aWMgdm9p ZAorYXRhX2F0YXBpX2hhbmRsZV9pbnF1aXJ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwg dWludDhfdCAqcGFja2V0KTsKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfaGFuZGxlX3JlYWRfY2Fw YWNpdHkoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3Rh dGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVfcmVhZF90b2Moc3RydWN0IGF0YV9jaGFubmVsICpj aGFubmVsLCB1aW50OF90ICpwYWNrZXQpOworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9oYW5kbGVf cmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwsIHVpbnQ4X3QgKnBhY2tldCk7CitzdGF0 aWMgdm9pZAorYXRhX2F0YXBpX2NtZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworCitz dGF0aWMgdWludDY0X3QKK2F0YV9jb21tYW5kX2Jsb2NrX3JlYWQoc3RydWN0IGF0YV9jaGFubmVs ICpjaGFubmVsLCB1aW50NjRfdCBvZmZzZXQpOworc3RhdGljIHZvaWQKK2F0YV9jb21tYW5kX2Js b2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJdWludDY0X3Qgb2Zmc2V0 LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpOworCitzdGF0aWMgdWludDY0X3QKK2F0YV9hbHRz dGF0dXNfcmVhZChzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpOworc3RhdGljIHZvaWQKK2F0 YV9jb250cm9sX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJaW50IHNpemUs IHVpbnQ2NF90IHZhbHVlKTsKKworLyoKKyAqIFBDSSBBVEEgZnVuY3Rpb24gZGVjbGFyYXRpb25z CisgKi8KK3N0YXRpYyB2b2lkCitwY2lfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZyk7CitzdGF0 aWMgdm9pZAorcGNpX2F0YV9pbnRyX2RlYXNzZXJ0KHZvaWQgKmFyZyk7CisKK3N0YXRpYyBpbnQK K3BjaV9hdGFfcGFyc2VfcGFyYW1zKGNvbnN0IGNoYXIgKm9wdHMsIGNoYXIgKm9wdDAsIGNoYXIg Km9wdDEsIHVpbnQ4X3QgKm5yX2NoYW5uZWxzKTsKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaW5pdChz dHJ1Y3Qgdm1jdHggKmN0eCwgc3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cywgaW50 IGF0YXBpKTsKK3N0YXRpYyBpbnQKK3BjaV9hdGFfaGRfaW5pdChzdHJ1Y3Qgdm1jdHggKmN0eCwg c3RydWN0IHBjaV9kZXZpbnN0ICpwaSwgY2hhciAqb3B0cyk7CisKK3N0YXRpYyB2b2lkCitwY2lf YXRhX2RtYV9zdGFydChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ4X3QgY2gpOworc3Rh dGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0b3Aoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50 OF90IGNoKTsKK3N0YXRpYyB1aW50NjRfdAorcGNpX2F0YV9idXNfbWFzdGVyX3JlYWQoc3RydWN0 IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50NjRfdCBvZmZzZXQpOworc3RhdGljIHZvaWQKK3BjaV9h dGFfYnVzX21hc3Rlcl93cml0ZShzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsCisJCXVpbnQ2NF90 IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKTsKKworc3RhdGljIHVpbnQ2NF90Citw Y2lfYXRhX3JlYWQoc3RydWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1LCBzdHJ1Y3QgcGNpX2Rldmlu c3QgKnBpLCBpbnQgYmFyaWR4LAorCQl1aW50NjRfdCBvZmZzZXQsIGludCBzaXplKTsKK3N0YXRp YyB2b2lkCitwY2lfYXRhX3dyaXRlKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwgc3RydWN0 IHBjaV9kZXZpbnN0ICpwaSwKKwkJaW50IGJhcmlkeCwgdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6 ZSwgdWludDY0X3QgdmFsdWUpOworCisvKgorICogTFBDIEFUQSBmdW5jdGlvbiBkZWNsYXJhdGlv bnMKKyAqLworc3RhdGljIHZvaWQKK2xwY19hdGFfaW50cl9hc3NlcnQodm9pZCAqYXJnKTsKK3N0 YXRpYyB2b2lkCitscGNfYXRhX2ludHJfZGVhc3NlcnQodm9pZCAqYXJnKTsKKworaW50CitscGNf YXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIGNvbnN0IGNoYXIgKm9wdHMpOworCitzdGF0aWMg aW50CitscGNfYXRhX2lvX2hhbmRsZXIoc3RydWN0IHZtY3R4ICpjdHgsIGludCB2Y3B1LAorCQkg ICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMsIHVpbnQzMl90ICplYXgsIHZvaWQgKmFyZyk7 CitzdGF0aWMgaW50CitscGNfYXRhX2lvY3RsX2hhbmRsZXIoc3RydWN0IHZtY3R4ICpjdHgsIGlu dCB2Y3B1LAorCQkgICBpbnQgaW4sIGludCBwb3J0LCBpbnQgYnl0ZXMsIHVpbnQzMl90ICplYXgs IHZvaWQgKmFyZyk7CisKKworLyoKKyAqIEFUQSBnbG9iYWwgZGF0YQorICovCitzdHJ1Y3QgcGNp X2RldmVtdSBwY2lfZGVfYXRhX2hkID0geworCS5wZV9lbXUgPQkiYXRhLWhkIiwKKwkucGVfaW5p dCA9CXBjaV9hdGFfaGRfaW5pdCwKKwkucGVfYmFyd3JpdGUgPQlwY2lfYXRhX3dyaXRlLAorCS5w ZV9iYXJyZWFkID0JcGNpX2F0YV9yZWFkCit9OworUENJX0VNVUxfU0VUKHBjaV9kZV9hdGFfaGQp OworCitzdGF0aWMgc3RydWN0IGxwY19hdGFfc29mdGMgbHBjX2F0YV9zY1tBVEFfQ0hBTk5FTFNd ID0geworCXtOVUxMLCAxNCwgMHgxZjAsIDB4M2Y2LCAiYXRhMF9pb3BvcnQiLCAiYXRhMF9pb2N0 bHBvcnQifSwKKwl7TlVMTCwgMTUsIDB4MTcwLCAweDM3NiwgImF0YTFfaW9wb3J0IiwgImF0YTFf aW9jdGxwb3J0In0KK307CisKKworLyoKKyAqIEFUQSBtb2R1bGUgZnVuY3Rpb24gZGVmaW5pdGlv bnMKKyAqLworc3RhdGljIHZvaWQKK2F0YV9pcnFfcmFpc2Uoc3RydWN0IGF0YV9jaGFubmVsICpj aGFubmVsKQoreworCXVpbnQ4X3QgaXJxX2Rpc2FibGVkOworCisJaXJxX2Rpc2FibGVkID0gY2hh bm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5pcnFfZGlzYWJsZWQ7CisKKwlpZiAoIWlycV9k aXNhYmxlZCAmJiAhY2hhbm5lbC0+bGludHIpIHsKKwkJY2hhbm5lbC0+bGludHIgPSAxOworCQlj aGFubmVsLT5pbnRyX2Fzc2VydChjaGFubmVsLT5wcl9zYyk7CisJfQorCisJcmV0dXJuOworfQor CitzdGF0aWMgdm9pZAorYXRhX2lycV9sb3dlcihzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwp Cit7CisJaWYgKGNoYW5uZWwtPmxpbnRyKSB7CisJCWNoYW5uZWwtPmxpbnRyID0gMDsKKwkJY2hh bm5lbC0+aW50cl9kZWFzc2VydChjaGFubmVsLT5wcl9zYyk7CisJfQorCisJcmV0dXJuOworfQor CitzdGF0aWMgYXRhX2RyaXZlX3R5cGUKK2F0YV9kcml2ZV90eXBlX2J5X25hbWUoY2hhciAqZHJp dmVfbmFtZSkKK3sKKwlpbnQgaSwgbGVuOworCWNoYXIgKmV4dCA9IE5VTEw7CisKKwlpZiAoIWRy aXZlX25hbWUpCisJCXJldHVybiBBVEFfRFJJVkVfRU1QVFk7CisKKwlsZW4gPSBzdHJsZW4oZHJp dmVfbmFtZSk7CisKKwlmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IGktLSkgeworCQlpZiAoZHJp dmVfbmFtZVtpXSA9PSAnLicpIHsKKwkJCWV4dCA9IGRyaXZlX25hbWUgKyBpICsgMTsKKwkJCWlm IChzdHJjbXAoZXh0LCAiaXNvIikgPT0gMCkKKwkJCQlyZXR1cm4gQVRBUElfQ0Q7CisJCQlicmVh azsKKwkJfQorCX0KKworCXJldHVybiBBVEFfSEQ7Cit9CisKK3N0YXRpYyBpbnQKK2F0YV9wYXJz ZV9wYXJhbXMoY29uc3QgY2hhciAqb3B0cywgaW50ICpjaGFubmVsLCBjaGFyICpkaXNrX21hc3Rl ciwKKwkJIGNoYXIgKmRpc2tfc2xhdmUsIHVpbnQ4X3QgKmhhc19zbGF2ZSkKK3sKKwl1aW50OF90 IGxlbjsKKwljaGFyIHBhcmFtWzY0XTsKKwljaGFyICpwYXJhbXNbM107CisJdWludDhfdCBpLCBq OworCWludCBjaDsKKworCXBhcmFtc1swXSA9IE5VTEw7CisJcGFyYW1zWzFdID0gTlVMTDsKKwlw YXJhbXNbMl0gPSBOVUxMOworCisJaWYgKCFvcHRzKSB7CisJCWRwcmludChMT0dfRVJSLCAiYXRh X3BhcnNlX3BhcmFtczogb3B0cyBzaG91bGQgYmUgbGlrZTogWCxNQVNURVJbLFNMQVZFXVxuIik7 CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSBzdHJsZW4ob3B0cyk7CisJaWYgKGxlbiA+PSA2 NCkgeworCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9wYXJzZV9wYXJhbXM6IEFUQSBzdHJpbmcgcGFy YW0gdG9vIGJpZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJjcHkocGFyYW0sIG9wdHMp OworCisJaiA9IDA7CisJcGFyYW1zW2pdID0gcGFyYW07CisJZm9yIChpID0gMDsgaSA8IGxlbjsg aSsrKSB7CisJCWlmIChwYXJhbVtpXSA9PSAnLCcpIHsKKwkJCWorKzsKKwkJCWlmIChqID4gMikg eworCQkJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNlX3BhcmFtczogdG8gbWFueSBwYXJhbXNc biIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXBhcmFtW2ldID0gJ1wwJzsKKwkJCXBhcmFt c1tqXSA9IHBhcmFtICsgaSArIDE7CisJCX0KKwl9CisKKwljaCA9IGF0b2kocGFyYW1zWzBdKTsK KwlpZiAoY2ggIT0gQVRBX1ggJiYgY2ggIT0gQVRBX1kpIHsKKwkJZHByaW50KExPR19FUlIsICJh dGFfcGFyc2VfcGFyYW1zOiB0aGUgY2hhbm5lbCBzaG91bGQgYmUgMCBvciAxXG4iKTsKKwkJcmV0 dXJuIC0xOworCX0KKwkqY2hhbm5lbCA9IGNoOworCisJaWYgKHBhcmFtc1sxXSA9PSBOVUxMIHx8 IHN0cmxlbihwYXJhbXNbMV0pID49IDMyKSB7CisJCWRwcmludChMT0dfRVJSLCAiYXRhX3BhcnNl X3BhcmFtczogdGhlIG5hbWUgb2YgTUFTVEVSIHNob3VsZCBiZSBnaXZlblxuIik7CisJCXJldHVy biAtMTsKKwl9CisJc3RyY3B5KGRpc2tfbWFzdGVyLCBwYXJhbXNbMV0pOworCisJaWYgKHBhcmFt c1syXSAhPSBOVUxMICYmIHN0cmxlbihwYXJhbXNbMl0pIDwgMzIpIHsKKwkJc3RyY3B5KGRpc2tf c2xhdmUsICBwYXJhbXNbMl0pOworCQkqaGFzX3NsYXZlID0gMTsKKwl9CisKKwlyZXR1cm4gMDsK KworfQorCitzdGF0aWMgc3RydWN0IGF0YV9jaGFubmVsICoKK2F0YV9pbml0KHN0cnVjdCB2bWN0 eCAqY3R4LCBhdGFfaW50cl9mdW5jX3QgaW50cl9hc3NlcnQsIGF0YV9pbnRyX2Z1bmNfdCBpbnRy X2RlYXNzZXJ0LCB2b2lkICpwcl9zYywKKwkgY29uc3QgY2hhciAqb3B0cywgdWludDhfdCBpc2Ff YXQpCit7CisJY2hhciBiaWRlbnRbc2l6ZW9mKCJYWDpYOlg6WCIpXTsKKwlzdHJ1Y3QgYmxvY2tp Zl9jdHh0ICpiY3R4dCA9IE5VTEwsICpiY3R4dF9zID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX2NoYW5u ZWwgKmNoYW5uZWwgPSBOVUxMOworCWludCByZXQ7CisJaW50IGNoX2F0YSA9IC0xOworCWNoYXIg ZGlza19tYXN0ZXJbMzJdOworCWNoYXIgZGlza19zbGF2ZVszMl07CisJdWludDhfdCBoYXNfc2xh dmUgPSAwOworCWF0YV9kcml2ZV90eXBlIG1hc3Rlcl90eXBlID0gQVRBX0RSSVZFX0VNUFRZOwor CWF0YV9kcml2ZV90eXBlIHNsYXZlX3R5cGUgPSBBVEFfRFJJVkVfRU1QVFk7CisKKwlyZXQgPSBh dGFfcGFyc2VfcGFyYW1zKG9wdHMsICZjaF9hdGEsIGRpc2tfbWFzdGVyLCBkaXNrX3NsYXZlLCAm aGFzX3NsYXZlKTsKKwlpZiAocmV0ICE9IDApIHsKKwkJZHByaW50KExPR19FUlIsICJhdGFfaW5p dDogc29tZSBlcnJvcnMgd2l0aCB0aGUgaW5wdXQgY2hlY2tpbmdcbiIpOworCQlyZXR1cm4gTlVM TDsKKwl9CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGNoX2F0YTogJWRcbiIsIGNo X2F0YSk7CisKKwkvKgorCSAqIEF0dGVtcHQgdG8gb3BlbiB0aGUgYmFja2luZyBpbWFnZXMuIFVz ZSB0aGUKKwkgKiAiUENJL0lTQTpjaDpkcml2ZSIgZm9yIHRoZSBpZGVudGlmaWVyIHN0cmluZy4K KwkgKi8KKwlzbnByaW50ZihiaWRlbnQsIHNpemVvZihiaWRlbnQpLCAiJWQ6JWQ6JWQiLCBpc2Ff YXQsIGNoX2F0YSwgQVRBX01BU1RFUik7CisJYmN0eHQgPSBibG9ja2lmX29wZW4oZGlza19tYXN0 ZXIsIGJpZGVudCk7CisJaWYgKGJjdHh0ID09IE5VTEwpIHsKKwkJZ290byBvcGVuX2ZhaWw7CisJ fQorCisJbWFzdGVyX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGRpc2tfbWFzdGVyKTsK KwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfbWFzdGVyOiAlcyB0eXBlOiAlc1xu IiwKKwkgICAgICAgZGlza19tYXN0ZXIsIG1hc3Rlcl90eXBlID09IEFUQV9IRCA/ICJhdGFfaGQi IDogImF0YXBpX2NkIik7CisKKwlpZiAoaGFzX3NsYXZlKSB7CisJCXNucHJpbnRmKGJpZGVudCwg c2l6ZW9mKGJpZGVudCksICIlZDolZDolZCIsIGlzYV9hdCwgY2hfYXRhLCBBVEFfU0xBVkUpOwor CQliY3R4dF9zID0gYmxvY2tpZl9vcGVuKGRpc2tfc2xhdmUsIGJpZGVudCk7CisJCWlmIChiY3R4 dF9zID09IE5VTEwpIHsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG9wZW5fZmFpbDsKKwkJfQorCisJ CXNsYXZlX3R5cGUgPSBhdGFfZHJpdmVfdHlwZV9ieV9uYW1lKGRpc2tfc2xhdmUpOworCQlkcHJp bnQoTE9HX0RFQlVHLCAiYXRhX2luaXQ6IGRpc2tfc2xhdmU6ICVzIHR5cGU6ICVzXG4iLAorCQkg ICAgICAgZGlza19zbGF2ZSwgc2xhdmVfdHlwZSA9PSBBVEFfSEQgPyAiYXRhX2hkIiA6ICJhdGFw aV9jZCIpOworCX0KKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaW5pdDogb3B0czogJXMsIGF0 YXBpOiAlZFxuIiwgb3B0cywgMCk7CisKKwljaGFubmVsID0gY2FsbG9jKDEsIHNpemVvZihzdHJ1 Y3QgYXRhX2NoYW5uZWwpKTsKKworCWNoYW5uZWwtPnZtX2N0eCA9IGN0eDsKKwljaGFubmVsLT5p bnRlcmZhY2UgPSBjaF9hdGE7CisJY2hhbm5lbC0+aGFzX3NsYXZlID0gaGFzX3NsYXZlOworCisJ Y2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdLnR5cGUgPSBtYXN0ZXJfdHlwZTsKKwljaGFubmVs LT5kcml2ZXNbQVRBX1NMQVZFXS50eXBlID0gc2xhdmVfdHlwZTsKKworCWNoYW5uZWwtPmRyaXZl c1tBVEFfTUFTVEVSXS5iY3R4dCA9IGJjdHh0OworCWNoYW5uZWwtPmRyaXZlc1tBVEFfU0xBVkVd LmJjdHh0ICA9IGJjdHh0X3M7CisKKwljaGFubmVsLT5kcml2ZXNbQVRBX01BU1RFUl0ucGlvX3Nl dHVwLmNoYW5uZWwgPSBjaGFubmVsOworCWNoYW5uZWwtPmRyaXZlc1tBVEFfU0xBVkVdLnBpb19z ZXR1cC5jaGFubmVsICA9IGNoYW5uZWw7CisKKwljaGFubmVsLT5pbnRyX2Fzc2VydCA9IGludHJf YXNzZXJ0OworCWNoYW5uZWwtPmludHJfZGVhc3NlcnQgPSBpbnRyX2RlYXNzZXJ0OworCWNoYW5u ZWwtPnByX3NjID0gcHJfc2M7CisKKwlyZXR1cm4gY2hhbm5lbDsKKworb3Blbl9mYWlsOgorCWlm IChyZXQpIHsKKwkJYmxvY2tpZl9jbG9zZShiY3R4dCk7CisJCWlmIChiY3R4dF9zICE9IE5VTEwp IHsKKwkJCWJsb2NraWZfY2xvc2UoYmN0eHRfcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsK K30KKworc3RhdGljIHZvaWQKK2F0YV9zcnN0KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkK K3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9IE5VTEw7CisJaW50IGRldjsKKworCWRwcmlu dChMT0dfREVCVUcsICJhdGFfc3JzdDogU29mdHdhcmUgUmVzZXRcbiIpOworCisJZm9yIChkZXYg PSAwOyBkZXYgPCBBVEFfRFJJVkVTOyBkZXYrKykgeworCQlkcml2ZSA9ICZjaGFubmVsLT5kcml2 ZXNbZGV2XTsKKworCQlpZiAoZHJpdmUtPnR5cGUgIT0gQVRBX0RSSVZFX0VNUFRZKSB7CisKKwkJ CWRyaXZlLT5lcnJvciAgPSBBVEFfRV9JTEk7CisJCQlkcml2ZS0+c3RhdHVzID0gQVRBX1NfUkVB RFk7CisKKwkJCWF0YV9zZXRfc2lnbmF0dXJlKGRyaXZlKTsKKwkJfQorCX0KKworCXJldHVybjsK K30KKworc3RhdGljIHZvaWQKK2F0YV9pbml0aWFsaXplX2lkZW50KHN0cnVjdCBhdGFfY2hhbm5l bCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2 ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsK KwlzdHJ1Y3QgYXRhX3BhcmFtcyAqaWRlbnRfZGF0YSA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9f c2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisKKwl1aW50MTZfdCBjeWxpbmRlcnM7CisJdWludDhf dCAgaGVhZHM7CisJdWludDhfdCAgc2VjdG9yczsKKwl1aW50MzJfdCB0b3RhbF9zZWN0b3JzOwor CisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7 CisJaWRlbnRfZGF0YSA9IChzdHJ1Y3QgYXRhX3BhcmFtcyAqKWF0YV9waW9fZ2V0X2J1ZmZlcl9k YXRhKHBpb19zZXR1cCk7CisKKwl0b3RhbF9zZWN0b3JzID0gYmxvY2tpZl9zaXplKGJjdHh0KSAv IEFUQV9TRUNUT1JfU0laRTsKKworCW1lbXNldChpZGVudF9kYXRhLCAwLCBzaXplb2Yoc3RydWN0 IGF0YV9wYXJhbXMpKTsKKworCS8qIE51bWJlciBvZiBzZWN0b3JzIHBlciBibG9jayB1c2VkIGlu IHJlYWQgLyB3cml0ZSBtdWx0aSBjb21tYW5kcyAqLworCWlkZW50X2RhdGEtPnNlY3RvcnNfaW50 ciB8PSAweDgwIDw8IDg7CisJaWRlbnRfZGF0YS0+c2VjdG9yc19pbnRyIHw9IEFUQV9TRUNUT1JT X1BFUl9CTE9DSzsKKworCS8qIFVzZSBETUEyIG1vZGUgKi8KKwlpZGVudF9kYXRhLT5jYXBhYmls aXRpZXMxIHw9IEFUQV9TVVBQT1JUX0RNQTsKKwlpZGVudF9kYXRhLT5td2RtYW1vZGVzIHw9IEFU QV9XX0RNQTI7CisKKwkvKiBVc2UgUElPNCBtb2RlICovCisJaWRlbnRfZGF0YS0+YXRhdmFsaWQg IHw9IEFUQV9GTEFHXzY0XzcwOworCWlkZW50X2RhdGEtPmFwaW9tb2RlcyB8PSBBVEFfTU9ERV9Q SU80OworCisJLyogV2UgdXNlIDI4LWJpdCBMQkEgYWRkcmVzc2luZyBiZWNhdXNlIENIUyBhZGRy ZXNzaW5nIGlzIG9ic29sZXRlIGluIEFUQS9BVEFQSSA2ICovCisJaWRlbnRfZGF0YS0+Y2FwYWJp bGl0aWVzMSB8PSBBVEFfU1VQUE9SVF9MQkE7CisJaWRlbnRfZGF0YS0+bGJhX3NpemVfMSA9IHRv dGFsX3NlY3RvcnM7CisJaWRlbnRfZGF0YS0+bGJhX3NpemVfMiA9IHRvdGFsX3NlY3RvcnMgPj4g MTY7CisKKwkvKiBTdXBwb3J0IHdyaXRlLXJlYWQtdmVyaWZ5ICovCisJaWRlbnRfZGF0YS0+c3Vw cG9ydDIgfD0gQVRBX1NVUFBPUlRfV1JJVEVSRUFEVkVSSUZZOworCWlkZW50X2RhdGEtPmVuYWJs ZWQyIHw9IEFUQV9TVVBQT1JUX1dSSVRFUkVBRFZFUklGWTsKKworCS8qIFN1cHBvcnQgQVRBIEZM VVNIQ0FDSEUgKi8KKwlpZGVudF9kYXRhLT5zdXBwb3J0LmNvbW1hbmQyIHw9IEFUQV9TVVBQT1JU X0ZMVVNIQ0FDSEU7CisJaWRlbnRfZGF0YS0+ZW5hYmxlZC5jb21tYW5kMiB8PSBBVEFfU1VQUE9S VF9GTFVTSENBQ0hFOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgPSBBVEEvQVRBUEktNiAq LworCWlkZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FUQVBJXzY7CisKKwkvKiBUaGlz IGluZm9ybWF0aW9uIGFyZSB1c2VkIG9ubHkgZm9yIHByaW50aW5nIHB1cnBvc2VzICovCisJYmxv Y2tpZl9jaHMoYmN0eHQsICZjeWxpbmRlcnMsICZoZWFkcywgJnNlY3RvcnMpOworCisJaWRlbnRf ZGF0YS0+Y3lsaW5kZXJzID0gY3lsaW5kZXJzOworCWlkZW50X2RhdGEtPmhlYWRzICAgICA9IGhl YWRzOworCWlkZW50X2RhdGEtPnNlY3RvcnMgICA9IHNlY3RvcnM7CisKKwkvKiBNb2RlbDogQkhZ VkUgQVRBIElERSBESVNLICovCisJbWVtY3B5KGlkZW50X2RhdGEtPm1vZGVsLCAgICAiSEJWWSBF VEEgQURJIEVJREtTICAgICAgICAgICAgICAgICAgICAgICIsIDQwKTsKKwkvKiBTZXJpYWwgbnVt YmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+c2VyaWFsLCAgICIyMTQzNjUgICAg ICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJzaW9uOiAxLjAgKi8KKwltZW1jcHko aWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgpOworCisJZHByaW50KExPR19ERUJV RywgImF0YV9pbml0aWFsaXplX2lkZW50OiBjaGFubmVsOiAlZCwgZHJpdmU6ICVkIEM6ICVkLCBI OiAlZCwgUzogJWQsIHRvdGFsX3NlY3RvcnM6ICVkXG4iLAorCQkJY2hhbm5lbC0+aW50ZXJmYWNl LCBjaGFubmVsLT5kcml2ZSwgY3lsaW5kZXJzLCBoZWFkcywgc2VjdG9ycywgdG90YWxfc2VjdG9y cyk7CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgc2l6ZW9mKHN0cnVjdCBhdGFf cGFyYW1zKSwgYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2ZlciwgY2hhbm5lbC0+dXNlXzE2Yml0 KTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9pbml0aWFsaXplX2lk ZW50KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpk cml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfcGFy YW1zICppZGVudF9kYXRhID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVw ID0gTlVMTDsKKworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWlkZW50X2RhdGEg PSAoc3RydWN0IGF0YV9wYXJhbXMgKilhdGFfcGlvX2dldF9idWZmZXJfZGF0YShwaW9fc2V0dXAp OworCisJbWVtc2V0KGlkZW50X2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYXRhX3BhcmFtcykpOwor CisJLyogQ0RST00gZGV2aWNlICovCisJaWRlbnRfZGF0YS0+Y29uZmlnIHw9IChBVEFfUFJPVE9f QVRBUElfMTIgfCBBVEFfQVRBUElfVFlQRV9DRFJPTSB8IEFUQV9EUlFfRkFTVCk7CisKKwkvKiBV c2UgRE1BMiBtb2RlICovCisJaWRlbnRfZGF0YS0+Y2FwYWJpbGl0aWVzMSB8PSBBVEFfU1VQUE9S VF9ETUE7CisJaWRlbnRfZGF0YS0+bXdkbWFtb2RlcyB8PSBBVEFfV19ETUEyOworCisJLyogVXNl IFBJTzQgbW9kZSAqLworCWlkZW50X2RhdGEtPmF0YXZhbGlkICB8PSBBVEFfRkxBR182NF83MDsK KwlpZGVudF9kYXRhLT5hcGlvbW9kZXMgfD0gQVRBX01PREVfUElPNDsKKworCS8qIFdlIHVzZSAy OC1iaXQgTEJBIGFkZHJlc3NpbmcgYmVjYXVzZSBDSFMgYWRkcmVzc2luZyBpcyBvYnNvbGV0ZSBp biBBVEEvQVRBUEkgNiAqLworCWlkZW50X2RhdGEtPmNhcGFiaWxpdGllczEgfD0gQVRBX1NVUFBP UlRfTEJBOworCisJLyogTWFqb3IgdmVyc2lvbiBudW1iZXIgPSBBVEEvQVRBUEktNiAqLworCWlk ZW50X2RhdGEtPnZlcnNpb25fbWFqb3IgfD0gQVRBX0FUQVBJXzY7CisKKwkvKiBNb2RlbDogQkhZ VkUgQVRBUEkgSURFIENEUk9NICovCisJbWVtY3B5KGlkZW50X2RhdGEtPm1vZGVsLCAgICAiSEJW WSBFVEFQQSBJREkgRURDT1IgTSAgICAgICAgICAgICAgICAgICIsIDQwKTsKKwkvKiBTZXJpYWwg bnVtYmVyOiAxMjM0NTYgKi8KKwltZW1jcHkoaWRlbnRfZGF0YS0+c2VyaWFsLCAgICIyMTQzNjUg ICAgICAgICAgICAgICIsIDIwKTsKKwkvKiBGaXJtd2FyZSB2ZXJzaW9uOiAxLjAgKi8KKwltZW1j cHkoaWRlbnRfZGF0YS0+cmV2aXNpb24sICIuMSAwICAgICIsIDgpOworCisJZHByaW50KExPR19E RUJVRywgImF0YV9hdGFwaV9pbml0aWFsaXplX2lkZW50OiBjaGFubmVsOiAlZCwgZHJpdmU6ICVk XG4iLAorCSAgICAgICBjaGFubmVsLT5pbnRlcmZhY2UsIGNoYW5uZWwtPmRyaXZlKTsKKworCWF0 YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplb2Yoc3RydWN0IGF0YV9wYXJhbXMpLCBh dGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJcmV0 dXJuOworfQorCitzdGF0aWMgaW50CithdGFfY2hhbm5lbF9pc19vayhzdHJ1Y3QgYXRhX2NoYW5u ZWwgKmNoYW5uZWwsIHVpbnQ4X3QgY2gpCit7CisJaWYgKGNoYW5uZWwtPmludGVyZmFjZSA9PSBj aCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorYXRhX3NlbGVj dF9kcml2ZV9pc19vayhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJaWYgKGNoYW5u ZWwtPmRyaXZlID09IEFUQV9TTEFWRSAmJiAhY2hhbm5lbC0+aGFzX3NsYXZlKSB7CisJCXJldHVy biAwOworCX0KKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZAorYXRhX3NldF9zdGF0dXNf b2soc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRy aXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+c3RhdHVz ICY9IH5BVEFfU19CVVNZOworCWRyaXZlLT5zdGF0dXMgfD0gQVRBX1NfUkVBRFk7CisJZHJpdmUt PnN0YXR1cyAmPSB+QVRBX1NfRFdGOworCWRyaXZlLT5zdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlk cml2ZS0+c3RhdHVzICY9IH5BVEFfU19FUlJPUjsKKworCWRyaXZlLT5lcnJvciA9IDA7CisKKwly ZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfc2V0X2RhdGFfYmxvY2tfcmVhZHkoc3RydWN0 IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNo YW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+YWx0c3RhdHVzICY9IH5B VEFfU19CVVNZOworCWRyaXZlLT5hbHRzdGF0dXMgfD0gQVRBX1NfRFJROworCWRyaXZlLT5hbHRz dGF0dXMgfD0gQVRBX1NfUkVBRFk7CisKKwlkcml2ZS0+c3RhdHVzIHw9IEFUQV9TX0RSUTsKKwor CXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9jb21tYW5kX2Fib3J0ZWQoc3RydWN0IGF0 YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5u ZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcml2ZS0+c3RhdHVzICY9IH5BVEFfU19C VVNZOworCWRyaXZlLT5zdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlkcml2ZS0+c3RhdHVzIHw9IEFU QV9TX0VSUk9SOworCisJZHJpdmUtPmVycm9yIHw9IEFUQV9FX0FCT1JUOworCisJcmV0dXJuOwor fQorCitzdGF0aWMgdm9pZAorYXRhX3NldF9zaWduYXR1cmUoc3RydWN0IGF0YV9kcml2ZSAqZHJp dmUpCit7CisJZHJpdmUtPnNlY2NvdW50ID0gMHgwMTsKKwlkcml2ZS0+bGJhX2xvdyAgPSAweDAx OworCisJaWYgKGRyaXZlLT50eXBlID09IEFUQV9IRCkgeworCQlkcml2ZS0+bGJhX21pZCAgPSAw eDAwOworCQlkcml2ZS0+bGJhX2hpZ2ggPSAweDAwOworCQlkcml2ZS0+aGRkZXZzZWwgPSAweDAw OworCX0KKwllbHNlIGlmIChkcml2ZS0+dHlwZSA9PSBBVEFQSV9DRCkgeworCQlkcml2ZS0+bGJh X21pZCAgPSBBVEFQSV9NQUdJQ19MU0I7CisJCWRyaXZlLT5sYmFfaGlnaCA9IEFUQVBJX01BR0lD X01TQjsKKwkJZHJpdmUtPmhkZGV2c2VsICY9IDB4MTA7CisJfQorCWVsc2UKKwkJYXNzZXJ0KDAp OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50 KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDE2X3QgKnBfc2VjdG9yX2NvdW50KQor eworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5k cml2ZV07CisJdWludDE2X3Qgc2VjdG9yX2NvdW50OworCisJc2VjdG9yX2NvdW50ID0gZHJpdmUt PnNlY2NvdW50ID8gZHJpdmUtPnNlY2NvdW50IDogQVRBX01BWF9TRUNfQ09VTlQ7CisJKnBfc2Vj dG9yX2NvdW50ID0gc2VjdG9yX2NvdW50OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAor YXRhX2FkZHJlc3NpbmdfMjhfbGJhKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDMy X3QgKnBfbGJhX2FkZHJlc3MpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5l bC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwl1aW50MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisK KwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+bGJhX2xvdzsKKwlsYmFfYWRkcmVzcyB8PSBkcml2ZS0+ bGJhX21pZCA8PCA4OworCWxiYV9hZGRyZXNzIHw9IGRyaXZlLT5sYmFfaGlnaCA8PCAxNjsKKwls YmFfYWRkcmVzcyB8PSAoZHJpdmUtPmhkZGV2c2VsICYgQVRBX0xCQV8yN18yNF9NQVNLKSA8PCAy NDsKKworCSpwX2xiYV9hZGRyZXNzID0gbGJhX2FkZHJlc3M7CisKKwlyZXR1cm47Cit9CisKK3N0 YXRpYyB2b2lkCithdGFfaW5pdF9ibG9ja19yZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqYnJl cSwgc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLAorCQkgICAgICAgdWludDY0X3Qgb2Zmc2V0 LCB1aW50NjRfdCBuYnl0ZXMsIHZvaWQgKmJ1ZmZlcikKK3sKKwlicmVxLT5icl9wYXJhbSA9IGNo YW5uZWw7CisJYnJlcS0+YnJfY2FsbGJhY2sgPSBhdGFfaGFuZGxlX2Jsb2NrX3JlcXVlc3Q7CisJ YnJlcS0+YnJfb2Zmc2V0ID0gb2Zmc2V0OworCWJyZXEtPmJyX2lvdmNudCA9IDE7CisJYnJlcS0+ YnJfaW92WzBdLmlvdl9sZW4gPSBuYnl0ZXM7CisJYnJlcS0+YnJfaW92WzBdLmlvdl9iYXNlID0g YnVmZmVyOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9ibG9ja19y ZXF1ZXN0KHN0cnVjdCBibG9ja2lmX3JlcSAqcmVxLCBpbnQgZXJyKQoreworCXN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCA9IChzdHJ1Y3QgYXRhX2NoYW5uZWwgKilyZXEtPmJyX3BhcmFtOwor CisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX3NldF9kYXRhX2Jsb2NrX3JlYWR5 KGNoYW5uZWwpOworCWF0YV9pcnFfcmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0 YXRpYyB2b2lkCithdGFfcGlvX2RvX3RyYW5zZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9f c2V0dXAsIHVpbnQ2NF90IHNpemVfdHJhbnNmZXIsCisJCSAgICAgYXRhX3Bpb19lbmRfdHJhbnNm ZXJfZnVuY190IGVuZF90cmFuc2ZlciwgdWludDhfdCB1c2Vfd29yZCkKK3sKKwlhc3NlcnQoc2l6 ZV90cmFuc2ZlciA8PSBBVEFfSU5CVUZfU0laRSk7CisJYXNzZXJ0KCFhdGFfcGlvX2luX3Byb2dy ZXNzKHBpb19zZXR1cCkpOworCisJcGlvX3NldHVwLT51c2Vfd29yZCA9IHVzZV93b3JkOworCXBp b19zZXR1cC0+cGlvX2J1ZmZlci5jdXJyZW50X3BvcyA9IDA7CisJcGlvX3NldHVwLT5zaXplX3Ry YW5zZmVyID0gc2l6ZV90cmFuc2ZlcjsKKwlwaW9fc2V0dXAtPmVuZF90cmFuc2ZlciA9IGVuZF90 cmFuc2ZlcjsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorYXRhX3Bpb19pbl9wcm9ncmVz cyhzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXJldHVybiAoaW50KXBpb19z ZXR1cC0+ZW5kX3RyYW5zZmVyOworfQorCitzdGF0aWMgdWludDhfdCAqCithdGFfcGlvX2dldF9i dWZmZXJfZGF0YShzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXJldHVybiBw aW9fc2V0dXAtPnBpb19idWZmZXIuZGF0YTsKK30KKworc3RhdGljIHZvaWQKK2F0YV9waW9fY2hl Y2tfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXApCit7CisJc3Ry dWN0IGF0YV9jaGFubmVsICpjaGFubmVsID0gcGlvX3NldHVwLT5jaGFubmVsOworCXN0cnVjdCBh dGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9fc2V0dXAtPnBpb19idWZmZXI7CisJYXRh X3Bpb19lbmRfdHJhbnNmZXJfZnVuY190IGVuZF90cmFuc2ZlciA9IHBpb19zZXR1cC0+ZW5kX3Ry YW5zZmVyOworCisJaWYgKHBpb19idWZmZXItPmN1cnJlbnRfcG9zID09IHBpb19zZXR1cC0+c2l6 ZV90cmFuc2ZlcikgeworCQlwaW9fc2V0dXAtPmVuZF90cmFuc2ZlciA9IE5VTEw7CisJCWVuZF90 cmFuc2ZlcihjaGFubmVsKTsKKwl9CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB1aW50MzJfdAor YXRhX3Bpb19nZXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwKQoreworCXN0 cnVjdCBhdGFfcGlvX2J1ZmZlciAqcGlvX2J1ZmZlciA9ICZwaW9fc2V0dXAtPnBpb19idWZmZXI7 CisJdWludDMyX3QgdmFsdWU7CisKKwlhc3NlcnQocGlvX2J1ZmZlci0+Y3VycmVudF9wb3MgPCBw aW9fc2V0dXAtPnNpemVfdHJhbnNmZXIpOworCisJaWYgKHBpb19zZXR1cC0+dXNlX3dvcmQpIHsK KwkJdmFsdWUgPSAqKHVpbnQxNl90ICopKHBpb19idWZmZXItPmRhdGEgKyBwaW9fYnVmZmVyLT5j dXJyZW50X3Bvcyk7CisJCXBpb19idWZmZXItPmN1cnJlbnRfcG9zICs9IHNpemVvZih1aW50MTZf dCk7CisJfQorCWVsc2UgeworCQl2YWx1ZSA9ICoodWludDMyX3QgKikocGlvX2J1ZmZlci0+ZGF0 YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKTsKKwkJcGlvX2J1ZmZlci0+Y3VycmVudF9wb3Mg Kz0gc2l6ZW9mKHVpbnQzMl90KTsKKwl9CisKKwlhdGFfcGlvX2NoZWNrX2VuZF90cmFuc2Zlcihw aW9fc2V0dXApOworCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorYXRhX3Bpb19w dXRfdWludChzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwLCB1aW50MzJfdCB3cml0ZV92 YWx1ZSkKK3sKKwlzdHJ1Y3QgYXRhX3Bpb19idWZmZXIgKnBpb19idWZmZXIgPSAmcGlvX3NldHVw LT5waW9fYnVmZmVyOworCisJYXNzZXJ0KHBpb19idWZmZXItPmN1cnJlbnRfcG9zIDwgcGlvX3Nl dHVwLT5zaXplX3RyYW5zZmVyKTsKKworCWlmIChwaW9fc2V0dXAtPnVzZV93b3JkKSB7CisJCSoo dWludDE2X3QgKikocGlvX2J1ZmZlci0+ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKSA9 ICh1aW50MTZfdCl3cml0ZV92YWx1ZTsKKwkJcGlvX2J1ZmZlci0+Y3VycmVudF9wb3MgKz0gc2l6 ZW9mKHVpbnQxNl90KTsKKwl9CisJZWxzZSB7CisJCSoodWludDMyX3QgKikocGlvX2J1ZmZlci0+ ZGF0YSArIHBpb19idWZmZXItPmN1cnJlbnRfcG9zKSA9IHdyaXRlX3ZhbHVlOworCQlwaW9fYnVm ZmVyLT5jdXJyZW50X3BvcyArPSBzaXplb2YodWludDMyX3QpOworCX0KKworCWF0YV9waW9fY2hl Y2tfZW5kX3RyYW5zZmVyKHBpb19zZXR1cCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lk CithdGFfcGlvX2dlbmVyaWNfZW5kX3RyYW5zZmVyKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l bCkKK3sKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX3Bpb19nZW5lcmljX2VuZF90cmFuc2Zlcjog Y2g6ICVkIGRyaXZlOiAlZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+aW50ZXJmYWNlLCBjaGFubmVs LT5kcml2ZSk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfcmVhZF9tdWx0aXBs ZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRh X2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVj dCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX3Bpb19zZXR1cCAqcGlv X3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJyZXEgPSBOVUxMOworCXVpbnQ2 NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsKKworCWJjdHh0 ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEg PSAmcGlvX3NldHVwLT5icmVxOworCisJZHJpdmUtPm9mZnNldCArPSBwaW9fc2V0dXAtPnNpemVf dHJhbnNmZXI7CisJZHJpdmUtPmNvdW50IC09IHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlcjsKKwor CWNvdW50ID0gZHJpdmUtPmNvdW50OworCisJaWYgKGNvdW50KSB7CisJCXNpemVfdHJhbnNmZXIg PSBjb3VudCA+PSBBVEFfQkxPQ0tfU0laRSA/IEFUQV9CTE9DS19TSVpFIDogY291bnQ7CisJCWF0 YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5zZmVyLCBhdGFfcmVhZF9tdWx0 aXBsZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJCWF0YV9pbml0X2Jsb2Nr X3JlcXVlc3QoYnJlcSwgY2hhbm5lbCwgZHJpdmUtPm9mZnNldCwKKwkJCQkgICAgICAgc2l6ZV90 cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKSk7CisKKwkJZXJyID0g YmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsKKwkJYXNzZXJ0KCFlcnIpOworCX0KKwllbHNlIHsK KwkJZHByaW50KExPR19ERUJVRywgImF0YV9yZWFkX211bHRpcGxlX2Jsb2NrX2RvbmU6IEFUQV9S RUFEX01VTCBjb21wbGV0ZWRcbiIpOworCX0KKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQK K2F0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l bC0+ZHJpdmVdOworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3Qg YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKwlzdHJ1Y3QgYmxvY2tpZl9yZXEgKmJy ZXEgPSBOVUxMOworCXVpbnQ2NF90IGNvdW50OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJ aW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+ cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJYXRhX2luaXRfYmxvY2tf cmVxdWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAorCQkJICAgICAgIHBpb19zZXR1 cC0+c2l6ZV90cmFuc2ZlciwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKSk7CisK Kwlkcml2ZS0+b2Zmc2V0ICs9IHBpb19zZXR1cC0+c2l6ZV90cmFuc2ZlcjsKKwlkcml2ZS0+Y291 bnQgLT0gcGlvX3NldHVwLT5zaXplX3RyYW5zZmVyOworCisJY291bnQgPSBkcml2ZS0+Y291bnQ7 CisKKwlpZiAoY291bnQpIHsKKwkJc2l6ZV90cmFuc2ZlciA9IGNvdW50ID49IEFUQV9CTE9DS19T SVpFID8gQVRBX0JMT0NLX1NJWkUgOiBjb3VudDsKKwkJYXRhX3Bpb19kb190cmFuc2ZlcihwaW9f c2V0dXAsIHNpemVfdHJhbnNmZXIsIGF0YV93cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFu bmVsLT51c2VfMTZiaXQpOworCX0KKwllbHNlIHsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV93 cml0ZV9tdWx0aXBsZV9ibG9ja19kb25lOiBBVEFfV1JJVEVfTVVMIGNvbXBsZXRlZFxuIik7CisJ fQorCisJZXJyID0gYmxvY2tpZl93cml0ZShiY3R4dCwgYnJlcSk7CisJYXNzZXJ0KCFlcnIpOwor CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmUo c3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZl ID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGJsb2NraWZfY3R4 dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxM OworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisJdWludDY0X3QgY291bnQ7CisJ aW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+ cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3NldHVwLT5icmVxOworCisJZHJpdmUtPm9mZnNldCAr PSBBVEFQSV9CTE9DS19TSVpFOworCWRyaXZlLT5jb3VudCAtPSBBVEFQSV9CTE9DS19TSVpFOwor CisJY291bnQgPSBkcml2ZS0+Y291bnQ7CisKKwlpZiAoY291bnQpIHsKKwkJYXNzZXJ0KGNvdW50 ID49IEFUQVBJX0JMT0NLX1NJWkUpOworCisJCWRyaXZlLT5zZWNjb3VudCA9IEFUQV9JX0lOOwor CisJCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBBVEFQSV9CTE9DS19TSVpFLCBhdGFf YXRhcGlfaGFuZGxlX3JlYWRfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKworCQlhdGFfaW5p dF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRyaXZlLT5vZmZzZXQsCisJCQkJICAgICAg IEFUQVBJX0JMT0NLX1NJWkUsIGF0YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCkpOwor CisJCWVyciA9IGJsb2NraWZfcmVhZChiY3R4dCwgYnJlcSk7CisJCWFzc2VydCghZXJyKTsKKwl9 CisJZWxzZSB7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfYXRhcGlfaGFuZGxlX3JlYWRfZG9u ZTogUkVBRCBjb21wbGV0ZWRcbiIpOworCQlhdGFfYXRhcGlfY21kX2RvbmUoY2hhbm5lbCk7CisJ fQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9pZGVudGlmeShzdHJ1 Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAm Y2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCWlmIChkcml2ZS0+dHlwZSA9PSBB VEFfSEQpIHsKKwkJYXRhX2luaXRpYWxpemVfaWRlbnQoY2hhbm5lbCk7CisKKwkJYXRhX3NldF9k YXRhX2Jsb2NrX3JlYWR5KGNoYW5uZWwpOworCQlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsK KwkJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKwl9CisJZWxzZSBpZiAoZHJpdmUtPnR5cGUgPT0g QVRBUElfQ0QpIHsKKwkJYXRhX2NvbW1hbmRfYWJvcnRlZChjaGFubmVsKTsKKwkJYXRhX3NldF9z aWduYXR1cmUoZHJpdmUpOworCX0KKwllbHNlCisJCWFzc2VydCgwKTsKKworCXJldHVybjsKK30K Kworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoc3RydWN0IGF0YV9jaGFubmVs ICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZl c1tjaGFubmVsLT5kcml2ZV07CisKKwlzd2l0Y2ggKGRyaXZlLT5mZWF0dXJlcykgeworCWNhc2Ug QVRBX1NGX1NFVFhGRVI6CisJCWNoYW5uZWwtPm1vZGUgPSBkcml2ZS0+c2VjY291bnQ7CisJCWRw cmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3NldGZlYXR1cmVzIEFUQV9TRl9TRVRYRkVSOiBt b2RlOiAlZFxuIiwKKwkJICAgICAgIGNoYW5uZWwtPm1vZGUpOworCQlicmVhazsKKwljYXNlIEFU QV9TRl9FTkFCX1dDQUNIRToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRElTX1dDQUNIRToKKwkJ YnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9QVUlTOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9E SVNfUFVJUzoKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfUFVJU19TUElOVVA6CisJCWJyZWFrOwor CWNhc2UgQVRBX1NGX0VOQUJfUkNBQ0hFOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9ESVNfUkNB Q0hFOgorCQlicmVhazsKKwljYXNlIEFUQV9TRl9FTkFCX1JFTElSUToKKwkJYnJlYWs7CisJY2Fz ZSBBVEFfU0ZfRElTX1JFTElSUToKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0ZfRU5BQl9TUlZJUlE6 CisJCWJyZWFrOworCWNhc2UgQVRBX1NGX0RJU19TUlZJUlE6CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCWJyZWFrOworCX0KKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5uZWwpOworCWF0YV9pcnFf cmFpc2UoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl X3NldF9tdWx0aShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9k cml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKworCWNoYW5u ZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID0gZHJpdmUtPnNlY2NvdW50OworCisJYXNzZXJ0KGNoYW5u ZWwtPnNlY3RvcnNfcGVyX2Jsb2NrID09IEFUQV9TRUNUT1JTX1BFUl9CTE9DSyk7CisKKwlkcHJp bnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV9zZXRfbXVsdGk6IHNlY3RvcnNfcGVyX2Jsb2NrOiAl ZFxuIiwKKwkgICAgICAgY2hhbm5lbC0+c2VjdG9yc19wZXJfYmxvY2spOworCisJYXRhX3NldF9z dGF0dXNfb2soY2hhbm5lbCk7CisJYXRhX2lycV9yYWlzZShjaGFubmVsKTsKKworCXJldHVybjsK K30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfcmVhZF9tdWx0aXBsZShzdHJ1Y3QgYXRhX2No YW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9jdHh0ICpiY3R4dCA9IE5V TEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJc3RydWN0IGJs b2NraWZfcmVxICpicmVxID0gTlVMTDsKKworCXVpbnQxNl90IHNlY3Rvcl9jb3VudDsKKwl1aW50 MzJfdCBsYmFfYWRkcmVzcyA9IDA7CisJdWludDY0X3Qgb2Zmc2V0OworCXVpbnQ2NF90IGNvdW50 OworCXVpbnQ2NF90IHNpemVfdHJhbnNmZXI7CisJaW50IGVycjsKKworCWJjdHh0ID0gZHJpdmUt PmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlvX3Nl dHVwLT5icmVxOworCisJYXRhX2FkZHJlc3Npbmdfc2VjX2NvdW50KGNoYW5uZWwsICZzZWN0b3Jf Y291bnQpOworCWF0YV9hZGRyZXNzaW5nXzI4X2xiYShjaGFubmVsLCAmbGJhX2FkZHJlc3MpOwor CisJZHByaW50KExPR19ERUJVRywgImF0YV9oYW5kbGVfcmVhZF9tdWx0aXBsZTogc2VjdG9yX2Nv dW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9jb3VudCwgbGJh X2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRBX1NFQ1RP Ul9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3VudCAqIEFUQV9TRUNUT1JfU0la RTsKKworCWRyaXZlLT5jb3VudCA9IGNvdW50OworCWRyaXZlLT5vZmZzZXQgPSBvZmZzZXQ7CisK KwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJWkUgPyBBVEFfQkxPQ0tfU0la RSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5zZmVy LCBhdGFfcmVhZF9tdWx0aXBsZV9ibG9ja19kb25lLCBjaGFubmVsLT51c2VfMTZiaXQpOworCisJ YXRhX2luaXRfYmxvY2tfcmVxdWVzdChicmVxLCBjaGFubmVsLCBkcml2ZS0+b2Zmc2V0LAorCQkJ ICAgICAgIHNpemVfdHJhbnNmZXIsIGF0YV9waW9fZ2V0X2J1ZmZlcl9kYXRhKHBpb19zZXR1cCkp OworCisJZXJyID0gYmxvY2tpZl9yZWFkKGJjdHh0LCBicmVxKTsKKwlhc3NlcnQoIWVycik7CisK KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX3JlYWRfdmVyaWZ5KHN0cnVj dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCWRwcmludChMT0dfREVCVUcsICJhdGFf aGFuZGxlX3JlYWRfdmVyaWZ5XG4iKTsKKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5uZWwpOwor CWRyaXZlLT5hbHRzdGF0dXMgJj0gfkFUQV9TX0RSUTsKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwp OworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV93cml0ZV9tdWx0aXBs ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGF0YV9kcml2ZSAqZHJp dmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYmxvY2tpZl9j dHh0ICpiY3R4dCA9IE5VTEw7CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5V TEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7CisJdWludDMyX3QgbGJhX2FkZHJlc3MgPSAw OworCXVpbnQ2NF90IG9mZnNldDsKKwl1aW50NjRfdCBjb3VudDsKKwl1aW50NjRfdCBzaXplX3Ry YW5zZmVyOworCisJYmN0eHQgPSBkcml2ZS0+YmN0eHQ7CisJcGlvX3NldHVwID0gJmRyaXZlLT5w aW9fc2V0dXA7CisKKwlhdGFfYWRkcmVzc2luZ19zZWNfY291bnQoY2hhbm5lbCwgJnNlY3Rvcl9j b3VudCk7CisJYXRhX2FkZHJlc3NpbmdfMjhfbGJhKGNoYW5uZWwsICZsYmFfYWRkcmVzcyk7CisK KwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hhbmRsZV93cml0ZV9tdWx0aXBsZTogc2VjdG9yX2Nv dW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9jb3VudCwgbGJh X2FkZHJlc3MpOworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRBX1NFQ1RP Ul9TSVpFOworCWNvdW50ID0gKHVpbnQ2NF90KXNlY3Rvcl9jb3VudCAqIEFUQV9TRUNUT1JfU0la RTsKKworCWRyaXZlLT5vZmZzZXQgPSBvZmZzZXQ7CisJZHJpdmUtPmNvdW50ID0gY291bnQ7CisK KwlzaXplX3RyYW5zZmVyID0gY291bnQgPj0gQVRBX0JMT0NLX1NJWkUgPyBBVEFfQkxPQ0tfU0la RSA6IGNvdW50OworCWF0YV9waW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCBzaXplX3RyYW5zZmVy LCBhdGFfd3JpdGVfbXVsdGlwbGVfYmxvY2tfZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwor CXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfZG1hKHN0cnVjdCBhdGFfY2hh bm5lbCAqY2hhbm5lbCwgdWludDhfdCBvcF9kaXIpCit7CisJc3RydWN0IHBjaV9hdGFfc29mdGMg KnNjID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9kbWFfdHJhbnNhY3Rpb24gKmRtYV90cmFuc2Fj dGlvbiA9IE5VTEw7CisKKwl1aW50MTZfdCBzZWN0b3JfY291bnQ7CisJdWludDMyX3QgbGJhX2Fk ZHJlc3MgPSAwOworCisJc2MgPSBjaGFubmVsLT5wcl9zYzsKKwlkbWFfdHJhbnNhY3Rpb24gPSAm c2MtPmRtYV90cmFuc2FjdGlvbnNbY2hhbm5lbC0+aW50ZXJmYWNlXTsKKworCWFzc2VydCghZG1h X3RyYW5zYWN0aW9uLT5zdGFydGVkKTsKKworCWF0YV9hZGRyZXNzaW5nX3NlY19jb3VudChjaGFu bmVsLCAmc2VjdG9yX2NvdW50KTsKKwlhdGFfYWRkcmVzc2luZ18yOF9sYmEoY2hhbm5lbCwgJmxi YV9hZGRyZXNzKTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX2RtYTogc2VjdG9y X2NvdW50OiAlZCwgbGJhX2FkZHJlc3M6IDB4JXggRElSOiAlZFxuIiwKKwkJCXNlY3Rvcl9jb3Vu dCwgbGJhX2FkZHJlc3MsIG9wX2Rpcik7CisKKwlkbWFfdHJhbnNhY3Rpb24tPnN0YXJ0ZWQgPSAx OworCWRtYV90cmFuc2FjdGlvbi0+b2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRB X1NFQ1RPUl9TSVpFOworCWRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzID0gKHVpbnQ2NF90KXNlY3Rv cl9jb3VudCAqIEFUQV9TRUNUT1JfU0laRTsKKwlkbWFfdHJhbnNhY3Rpb24tPm9wX2RpciA9IG9w X2RpcjsKKworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9oYW5kbGVfZmx1c2hjYWNo ZShzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwpCit7CisJc3RydWN0IGJsb2NraWZfY3R4dCAq YmN0eHQgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisJaW50IGVy cjsKKworCWJjdHh0ID0gY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5iY3R4dDsKKwli cmVxID0gJmNoYW5uZWwtPmZsdXNoX2JyZXE7CisKKwlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2hh bmRsZV9mbHVzaGNhY2hlXG4iKTsKKworCWF0YV9pbml0X2Jsb2NrX3JlcXVlc3QoYnJlcSwgY2hh bm5lbCwgMCwgMCwgTlVMTCk7CisKKwllcnIgPSBibG9ja2lmX2ZsdXNoKGJjdHh0LCBicmVxKTsK Kwlhc3NlcnQoIWVycik7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxl X3NlZWsoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUg KmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisKKwlkcHJpbnQoTE9H X0RFQlVHLCAiYXRhX2hhbmRsZV9zZWVrXG4iKTsKKworCWF0YV9zZXRfc3RhdHVzX29rKGNoYW5u ZWwpOworCWRyaXZlLT5zdGF0dXMgfD0gQVRBX1NfRFNDOworCWF0YV9pcnFfcmFpc2UoY2hhbm5l bCk7CisKKwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfaGFuZGxlX2F0YXBpX2lkZW50 aWZ5KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlhdGFfYXRhcGlfaW5pdGlhbGl6 ZV9pZGVudChjaGFubmVsKTsKKworCWF0YV9zZXRfZGF0YV9ibG9ja19yZWFkeShjaGFubmVsKTsK KwlhdGFfc2V0X3N0YXR1c19vayhjaGFubmVsKTsKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOwor CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2hhbmRsZV9wYWNrZXRfY21kKHN0cnVj dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpw aW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlk cml2ZS0+Ynl0ZV9jb3VudCA9IGRyaXZlLT5sYmFfbWlkIHwgKGRyaXZlLT5sYmFfaGlnaCA8PCA4 KTsKKworCWRwcmludChMT0dfREVCVUcsICJhdGFfaGFuZGxlX3BhY2tldF9jbWQ6IGJ5dGVfY291 bnQ6ICVkXG4iLCBkcml2ZS0+Ynl0ZV9jb3VudCk7CisKKwlhdGFfc2V0X3N0YXR1c19vayhjaGFu bmVsKTsKKwlkcml2ZS0+c2VjY291bnQgPSBBVEFfSV9DTUQ7CisJZHJpdmUtPnN0YXR1cyB8PSBB VEFfU19EUlE7CisKKwkvKiBUaGUgUGFja2V0IGNtZCBpcyByZWNlaXZlZCBhcyA2IHdvcmRzIG9u IGJvdGggTFBDIGFuZCBQQ0kgKi8KKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgQVRB UElfUEFDS0VUX1NJWkUsIGF0YV9hdGFwaV9jbWQsIDEpOworCisJcmV0dXJuOworfQorCitzdGF0 aWMgdm9pZAorYXRhX2hhbmRsZV9jbWQoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVsLCB1aW50 OF90IGNtZCkKK3sKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgQVRBX0FUQV9JREVOVElGWToKKwkJ YXRhX2hhbmRsZV9pZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU0VURkVB VFVSRVM6CisJCWF0YV9oYW5kbGVfc2V0ZmVhdHVyZXMoY2hhbm5lbCk7CisJCWJyZWFrOworCWNh c2UgQVRBX1NFVF9NVUxUSToKKwkJYXRhX2hhbmRsZV9zZXRfbXVsdGkoY2hhbm5lbCk7CisJCWJy ZWFrOworCWNhc2UgQVRBX1JFQUQ6CisJY2FzZSBBVEFfUkVBRF9NVUw6CisJCWF0YV9oYW5kbGVf cmVhZF9tdWx0aXBsZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRF9WRVJJRlk6 CisJCWF0YV9oYW5kbGVfcmVhZF92ZXJpZnkoY2hhbm5lbCk7CisJCWJyZWFrOworCWNhc2UgQVRB X1dSSVRFOgorCWNhc2UgQVRBX1dSSVRFX01VTDoKKwkJYXRhX2hhbmRsZV93cml0ZV9tdWx0aXBs ZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUkVBRF9ETUE6CisJCWF0YV9oYW5kbGVf ZG1hKGNoYW5uZWwsIEFUQV9ETUFfUkVBRCk7CisJCWJyZWFrOworCWNhc2UgQVRBX1dSSVRFX0RN QToKKwkJYXRhX2hhbmRsZV9kbWEoY2hhbm5lbCwgQVRBX0RNQV9XUklURSk7CisJCWJyZWFrOwor CWNhc2UgQVRBX0ZMVVNIQ0FDSEU6CisJCWF0YV9oYW5kbGVfZmx1c2hjYWNoZShjaGFubmVsKTsK KwkJYnJlYWs7CisJY2FzZSBBVEFfU0VFSzoKKwkJYXRhX2hhbmRsZV9zZWVrKGNoYW5uZWwpOwor CQlicmVhazsKKwljYXNlIEFUQV9BVEFQSV9JREVOVElGWToKKwkJYXRhX2hhbmRsZV9hdGFwaV9p ZGVudGlmeShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfUEFDS0VUX0NNRDoKKwkJYXRh X2hhbmRsZV9wYWNrZXRfY21kKGNoYW5uZWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJp bnQoTE9HX0VSUiwgImF0YV9oYW5kbGVfY21kOiB1bnN1cHBvcnRlZCBjbWQ6ICUwMnhcbiIsIGNt ZCk7CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCisvKgorICog YXRhX2NwdV90b19iZTMyIHRyYW5zbGF0ZXMgZnJvbSBsaXR0bGUgZW5kaWFuIHRvIGJpZyBlbmRp YW4KKyAqIHRoZSBsaXR0bGUgZW5kaWFuIGZvcm1hdCBpcyB1c2VkIGJ5IHRoZSBjcHUKKyAqIEB2 YWwgLSB0aGUgaW50ZWdlciB2YWx1ZSBiZWluZyB0cmFuc2xhdGVkCisgKiBAYnVmIC0gdGhlIGFk ZHJlc3Mgd2hlcmUgdGhlIHJlc3VsdCBpcyBzdG9yZWQKKyAqLworc3RhdGljIGlubGluZSB2b2lk CithdGFfY3B1X3RvX2JlMzIodWludDhfdCAqYnVmLCB1aW50MzJfdCB2YWwpCit7CisJYnVmWzBd ID0gdmFsID4+IDI0OworCWJ1ZlsxXSA9IHZhbCA+PiAxNjsKKwlidWZbMl0gPSB2YWwgPj4gODsK KwlidWZbM10gPSB2YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfY3B1X3RvX2JlMTYg dHJhbnNsYXRlcyBmcm9tIGxpdHRsZSBlbmRpYW4gdG8gYmlnIGVuZGlhbgorICogdGhlIGxpdHRs ZSBlbmRpYW4gZm9ybWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSB3b3JkIGJl aW5nIHRyYW5zbGF0ZWQKKyAqIEBidWYgLSB0aGUgYWRkcmVzcyB3aGVyZSB0aGUgcmVzdWx0IGlz IHN0b3JlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2F0YV9jcHVfdG9fYmUxNih1aW50OF90 ICpidWYsIHVpbnQxNl90IHZhbCkKK3sKKwlidWZbMF0gPSB2YWwgPj4gODsKKwlidWZbMV0gPSB2 YWw7CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBhdGFfYmUzMl90b19jcHUgdHJhbnNsYXRlcyBm cm9tIGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9y bWF0IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSByZXR1cm4gaW50ZWdlciB2YWx1 ZQorICogQGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBiZWluZyB0cmFuc2xhdGVkCisg Ki8KK3N0YXRpYyBpbmxpbmUgdWludDMyX3QKK2F0YV9iZTMyX3RvX2NwdSh1aW50OF90ICpidWYp Cit7CisJdWludDMyX3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZbMF0gPDwgMjQ7CisJdmFsIHw9 IGJ1ZlsxXSA8PCAxNjsKKwl2YWwgfD0gYnVmWzJdIDw8IDg7CisJdmFsIHw9IGJ1ZlszXTsKKwor CXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBhdGFfYmUxNl90b19jcHUgdHJhbnNsYXRlcyBmcm9t IGJpZyBlbmRpYW4gdG8gbGl0dGxlIGVuZGlhbgorICogdGhlIGxpdHRsZSBlbmRpYW4gZm9ybWF0 IGlzIHVzZWQgYnkgdGhlIGNwdQorICogQHZhbCAtIHRoZSByZXR1cm4gd29yZCB2YWx1ZQorICog QGJ1ZiAtIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZSBiZWluZyB0cmFuc2xhdGVkCisgKi8KK3N0 YXRpYyBpbmxpbmUgdWludDE2X3QKK2F0YV9iZTE2X3RvX2NwdSh1aW50OF90ICpidWYpCit7CisJ dWludDE2X3QgdmFsID0gMDsKKworCXZhbCB8PSBidWZbMF0gPDwgODsKKwl2YWwgfD0gYnVmWzFd OworCisJcmV0dXJuIHZhbDsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9wcmludF9wYWNr ZXQodWludDhfdCAqcGFja2V0KQoreworCWludCBpOworCisJZHByaW50KExPR19ERUJVRywgImF0 YV9hdGFwaV9wcmludF9wYWNrZXQgY21kOiAweCV4IHBhY2tldDogIiwgcGFja2V0WzBdKTsKKwlm b3IgKGkgPSAwOyBpIDwgQVRBUElfUEFDS0VUX1NJWkU7IGkrKykgeworCQlkcHJpbnQoTE9HX0RF QlVHLCAiJXggIiwgcGFja2V0W2ldKTsKKwl9CisJZHByaW50KExPR19ERUJVRywgIlxuIik7CisK KwlyZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkCithdGFfYXRhcGlfZGF0YV9yZXF1ZXN0KHN0cnVj dCBhdGFfY2hhbm5lbCAqY2hhbm5lbCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hh bm5lbCk7CisJZHJpdmUtPnNlY2NvdW50ID0gQVRBX0lfSU47CisJZHJpdmUtPnN0YXR1cyB8PSBB VEFfU19EUlE7CisKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOworCisJcmV0dXJuOworfQorCitz dGF0aWMgdm9pZAorYXRhX2F0YXBpX2NtZF9kb25lKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5l bCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5l bC0+ZHJpdmVdOworCisJYXRhX3NldF9zdGF0dXNfb2soY2hhbm5lbCk7CisJZHJpdmUtPnNlY2Nv dW50ID0gQVRBX0lfSU4gfCBBVEFfSV9DTUQ7CisKKwlhdGFfaXJxX3JhaXNlKGNoYW5uZWwpOwor CisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9pbnF1aXJ5KHN0 cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBh dGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3Ry dWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJc3RydWN0IHNjc2lfaW5xdWly eV9kYXRhICppbnF1aXJ5X2RhdGEgPSAoc3RydWN0IHNjc2lfaW5xdWlyeV9kYXRhICopcGFja2V0 OworCXVpbnQ4X3QgbWF4X2xlbiA9IDA7CisKKwlwaW9fc2V0dXAgPSAmZHJpdmUtPnBpb19zZXR1 cDsKKworCW1heF9sZW4gPSBwYWNrZXRbNF07CisJYXNzZXJ0KG1heF9sZW4gPj0gU0hPUlRfSU5R VUlSWV9MRU5HVEgpOworCisJLyogZm9yIG5vdyB3ZSBpbXBsZW1lbnQgb25seSB0aGUgc2hvcnQg aW5xdWlyeSBjbWQgKi8KKwlpZiAocGFja2V0WzFdICYgMHgwMSkgeworCQlhc3NlcnQoMCk7CisJ fSBlbHNlIHsKKwkJbWVtc2V0KGlucXVpcnlfZGF0YSwgMCwgU0hPUlRfSU5RVUlSWV9MRU5HVEgp OworCisJCWlucXVpcnlfZGF0YS0+ZGV2aWNlID0gVF9DRFJPTTsKKwkJaW5xdWlyeV9kYXRhLT5k ZXZfcXVhbDIgPSBTSURfUk1COworCQlpbnF1aXJ5X2RhdGEtPnZlcnNpb24gPSBTQ1NJX1JFVl8w OworCQlpbnF1aXJ5X2RhdGEtPnJlc3BvbnNlX2Zvcm1hdCA9IDI7CisJCWlucXVpcnlfZGF0YS0+ YWRkaXRpb25hbF9sZW5ndGggPSBTSE9SVF9JTlFVSVJZX0xFTkdUSCAtIDU7CisKKwkJbWVtY3B5 KGlucXVpcnlfZGF0YS0+dmVuZG9yLCAiQkhZVkUgICAiLCBTSURfVkVORE9SX1NJWkUpOworCQlt ZW1jcHkoaW5xdWlyeV9kYXRhLT5wcm9kdWN0LCAiQVRBUEkgSURFIENEUk9NICIsIFNJRF9QUk9E VUNUX1NJWkUpOworCQltZW1jcHkoaW5xdWlyeV9kYXRhLT5yZXZpc2lvbiwgIjEuMSAiLCBTSURf UkVWSVNJT05fU0laRSk7CisKKwkJYXRhX3Bpb19kb190cmFuc2ZlcihwaW9fc2V0dXAsIFNIT1JU X0lOUVVJUllfTEVOR1RILCBhdGFfYXRhcGlfY21kX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7 CisJCWF0YV9hdGFwaV9kYXRhX3JlcXVlc3QoY2hhbm5lbCk7CisJfQorCisJcmV0dXJuOworfQor CitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2NhcGFjaXR5KHN0cnVjdCBhdGFf Y2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVjdCBhdGFfZHJpdmUg KmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9w aW9fc2V0dXAgKnBpb19zZXR1cCA9IE5VTEw7CisJaW50IG5zZWN0b3JzID0gYmxvY2tpZl9zaXpl KGRyaXZlLT5iY3R4dCkgLyBBVEFQSV9CTE9DS19TSVpFOworCisJcGlvX3NldHVwID0gJmRyaXZl LT5waW9fc2V0dXA7CisKKwlhdGFfY3B1X3RvX2JlMzIocGFja2V0LCBuc2VjdG9ycyAtIDEpOwor CWF0YV9jcHVfdG9fYmUzMihwYWNrZXQgKyA0LCBBVEFQSV9CTE9DS19TSVpFKTsKKworCWF0YV9w aW9fZG9fdHJhbnNmZXIocGlvX3NldHVwLCA4LCBhdGFfYXRhcGlfY21kX2RvbmUsIGNoYW5uZWwt PnVzZV8xNmJpdCk7CisJYXRhX2F0YXBpX2RhdGFfcmVxdWVzdChjaGFubmVsKTsKKworCXJldHVy bjsKK30KKworc3RhdGljIHZvaWQgbGJhX3RvX21zZih1aW50OF90ICpidWYsIGludCBsYmEpCit7 CisJbGJhICs9IDE1MDsKKwlidWZbMF0gPSAobGJhIC8gNzUpIC8gNjA7CisJYnVmWzFdID0gKGxi YSAvIDc1KSAlIDYwOworCWJ1ZlsyXSA9IGxiYSAlIDc1OworCisJcmV0dXJuOworfQorCitzdGF0 aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNo YW5uZWwsIHVpbnQ4X3QgKnBhY2tldCkKK3sKKwlzdHJ1Y3QgYXRhX2RyaXZlICpkcml2ZSA9ICZj aGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFfcGlvX3NldHVwICpw aW9fc2V0dXAgPSBOVUxMOworCWludCBuc2VjdG9ycyA9IGJsb2NraWZfc2l6ZShkcml2ZS0+YmN0 eHQpIC8gQVRBUElfQkxPQ0tfU0laRTsKKworCXVpbnQ4X3QgbXNmID0gcGFja2V0WzFdICYgMjsK Kwl1aW50OF90IGZvcm1hdCA9IHBhY2tldFsyXSAmIDB4MGY7CisJdWludDhfdCB0cmFja19udW1i ZXIgPSBwYWNrZXRbNl07CisJdWludDE2X3QgYWxsb2NhdGlvbl9sZW5ndGggPSAocGFja2V0Wzdd IDw8IDgpIHwgcGFja2V0WzhdOworCisJdWludDE2X3QgZGF0YV9sZW4gPSAwOworCXVpbnQ4X3Qg KmRhdGFfem9uZSA9IE5VTEw7CisJdWludDhfdCAqbGVhZF9vdXQgPSBOVUxMOworCisJcGlvX3Nl dHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlhc3NlcnQodHJhY2tfbnVtYmVyIDw9IDEgfHwg dHJhY2tfbnVtYmVyID09IDB4YWEpOworCWFzc2VydCghZm9ybWF0KTsKKworCXBhY2tldFsyXSA9 IDE7CQkvKiBGaXJzdCBUcmFjayAqLworCXBhY2tldFszXSA9IDE7CQkvKiBMYXN0IFRyYWNrICov CisKKwlsZWFkX291dCA9IHBhY2tldCArIDQ7CisKKwlpZiAodHJhY2tfbnVtYmVyIDw9IDEpIHsK KwkJZGF0YV96b25lID0gcGFja2V0ICsgNDsKKwkJbGVhZF9vdXQgPSBwYWNrZXQgKyAxMjsKKwor CQlkYXRhX3pvbmVbMF0gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwkJZGF0YV96b25lWzFdID0gMHgx NDsJCS8qIEFEUiwgY29udHJvbCAqLworCQlkYXRhX3pvbmVbMl0gPSAxOwkJLyogdHJhY2sgbnVt YmVyICovCisJCWRhdGFfem9uZVszXSA9IDA7CQkvKiBSZXNlcnZlZCAqLworCQlpZiAobXNmKSB7 CisJCQlkYXRhX3pvbmVbNF0gPSAwOworCQkJbGJhX3RvX21zZihkYXRhX3pvbmUgKyA1LCAwKTsK KwkJfQorCQllbHNlIHsKKwkJCWF0YV9jcHVfdG9fYmUzMihkYXRhX3pvbmUgKyA0LCAwKTsKKwkJ fQorCX0KKworCWxlYWRfb3V0WzBdID0gMDsJCS8qIFJlc2VydmVkICovCisJbGVhZF9vdXRbMV0g PSAweDE2OwkJLyogQURSLCBjb250cm9sICovCisJbGVhZF9vdXRbMl0gPSAweGFhOwkJLyogdHJh Y2sgbnVtYmVyICovCisJbGVhZF9vdXRbM10gPSAwOwkJLyogUmVzZXJ2ZWQgKi8KKwlpZiAobXNm KSB7CisJCWxlYWRfb3V0WzRdID0gMDsKKwkJbGJhX3RvX21zZihsZWFkX291dCArIDUsIG5zZWN0 b3JzKTsKKwl9CisJZWxzZSB7CisJCWF0YV9jcHVfdG9fYmUzMihsZWFkX291dCArIDQsIG5zZWN0 b3JzKTsKKwl9CisKKwlkYXRhX2xlbiA9IChsZWFkX291dCAtIHBhY2tldCkgKyA4OworCWF0YV9j cHVfdG9fYmUxNihwYWNrZXQsIGRhdGFfbGVuIC0gMik7CisKKwlkYXRhX2xlbiA9IChkYXRhX2xl biA8IGFsbG9jYXRpb25fbGVuZ3RoKSA/IGRhdGFfbGVuIDogYWxsb2NhdGlvbl9sZW5ndGg7CisK KwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgZGF0YV9sZW4sIGF0YV9hdGFwaV9jbWRf ZG9uZSwgY2hhbm5lbC0+dXNlXzE2Yml0KTsKKwlhdGFfYXRhcGlfZGF0YV9yZXF1ZXN0KGNoYW5u ZWwpOworCisJcmV0dXJuOworfQorCitzdGF0aWMgdm9pZAorYXRhX2F0YXBpX2hhbmRsZV9yZWFk KHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWludDhfdCAqcGFja2V0KQoreworCXN0cnVj dCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJ c3RydWN0IGJsb2NraWZfY3R4dCAqYmN0eHQgPSBOVUxMOworCXN0cnVjdCBhdGFfcGlvX3NldHVw ICpwaW9fc2V0dXAgPSBOVUxMOworCXN0cnVjdCBibG9ja2lmX3JlcSAqYnJlcSA9IE5VTEw7CisK Kwl1aW50MTZfdCBzZWN0b3JfY291bnQgPSAwOworCXVpbnQzMl90IGxiYV9hZGRyZXNzID0gMDsK Kwl1aW50NjRfdCBvZmZzZXQ7CisJdWludDY0X3QgY291bnQ7CisJaW50IGVycjsKKworCWFzc2Vy dChkcml2ZS0+Ynl0ZV9jb3VudCA+PSBBVEFQSV9CTE9DS19TSVpFKTsKKworCWJjdHh0ID0gZHJp dmUtPmJjdHh0OworCXBpb19zZXR1cCA9ICZkcml2ZS0+cGlvX3NldHVwOworCWJyZXEgPSAmcGlv X3NldHVwLT5icmVxOworCisJbGJhX2FkZHJlc3MgPSBhdGFfYmUzMl90b19jcHUocGFja2V0ICsg Mik7CisJc2VjdG9yX2NvdW50ID0gYXRhX2JlMTZfdG9fY3B1KHBhY2tldCArIDcpOworCisJZHBy aW50KExPR19ERUJVRywgImF0YV9hdGFwaV9oYW5kbGVfcmVhZDogc2VjdG9yX2NvdW50OiAlZCwg bGJhX2FkZHJlc3M6IDB4JXhcbiIsCisJICAgICAgIHNlY3Rvcl9jb3VudCwgbGJhX2FkZHJlc3Mp OworCisJb2Zmc2V0ID0gKHVpbnQ2NF90KWxiYV9hZGRyZXNzICogQVRBUElfQkxPQ0tfU0laRTsK Kwljb3VudCA9ICh1aW50NjRfdClzZWN0b3JfY291bnQgKiBBVEFQSV9CTE9DS19TSVpFOworCisJ ZHJpdmUtPmNvdW50ID0gY291bnQ7CisJZHJpdmUtPm9mZnNldCA9IG9mZnNldDsKKworCWRyaXZl LT5sYmFfbWlkID0gQVRBUElfQkxPQ0tfU0laRSAmIDB4ZmY7CisJZHJpdmUtPmxiYV9oaWdoID0g KEFUQVBJX0JMT0NLX1NJWkUgPj4gOCkgJiAweGZmOworCisJZHJpdmUtPnNlY2NvdW50ID0gQVRB X0lfSU47CisKKwlhdGFfcGlvX2RvX3RyYW5zZmVyKHBpb19zZXR1cCwgQVRBUElfQkxPQ0tfU0la RSwgYXRhX2F0YXBpX2hhbmRsZV9yZWFkX2RvbmUsIGNoYW5uZWwtPnVzZV8xNmJpdCk7CisKKwlh dGFfaW5pdF9ibG9ja19yZXF1ZXN0KGJyZXEsIGNoYW5uZWwsIGRyaXZlLT5vZmZzZXQsCisJCQkg ICAgICAgQVRBUElfQkxPQ0tfU0laRSwgYXRhX3Bpb19nZXRfYnVmZmVyX2RhdGEocGlvX3NldHVw KSk7CisKKwllcnIgPSBibG9ja2lmX3JlYWQoYmN0eHQsIGJyZXEpOworCWFzc2VydCghZXJyKTsK KworCXJldHVybjsKK30KKworc3RhdGljIHZvaWQKK2F0YV9hdGFwaV9jbWQoc3RydWN0IGF0YV9j aGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5uZWwt PmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJc3RydWN0IGF0YV9waW9fc2V0dXAgKnBpb19zZXR1 cCA9IE5VTEw7CisJdWludDhfdCAqcGFja2V0ID0gTlVMTDsKKwl1aW50OF90IG9wX2NvZGUgPSAw OworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisJcGFja2V0ID0gYXRhX3Bpb19n ZXRfYnVmZmVyX2RhdGEocGlvX3NldHVwKTsKKworCWF0YV9hdGFwaV9wcmludF9wYWNrZXQocGFj a2V0KTsKKworCW9wX2NvZGUgPSBwYWNrZXRbMF07CisKKwlzd2l0Y2ggKG9wX2NvZGUpIHsKKwlj YXNlIElOUVVJUlk6CisJCWF0YV9hdGFwaV9oYW5kbGVfaW5xdWlyeShjaGFubmVsLCBwYWNrZXQp OworCQlicmVhazsKKwljYXNlIFJFQURfQ0FQQUNJVFk6CisJCWF0YV9hdGFwaV9oYW5kbGVfcmVh ZF9jYXBhY2l0eShjaGFubmVsLCBwYWNrZXQpOworCQlicmVhazsKKwljYXNlIFBSRVZFTlRfQUxM T1c6CisJCWF0YV9hdGFwaV9jbWRfZG9uZShjaGFubmVsKTsKKwkJYnJlYWs7CisJY2FzZSBSRUFE X1RPQzoKKwkJYXRhX2F0YXBpX2hhbmRsZV9yZWFkX3RvYyhjaGFubmVsLCBwYWNrZXQpOworCQli cmVhazsKKwljYXNlIFJFQURfMTA6CisJCWF0YV9hdGFwaV9oYW5kbGVfcmVhZChjaGFubmVsLCBw YWNrZXQpOworCQlicmVhazsKKwljYXNlIFRFU1RfVU5JVF9SRUFEWToKKwkJYXRhX2F0YXBpX2Nt ZF9kb25lKGNoYW5uZWwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkcHJpbnQoTE9HX0VSUiwg ImF0YV9hdGFwaV9jbWQ6IHVuc3VwcG9ydGVkIGNtZDogJTAyeFxuIiwgb3BfY29kZSk7CisJCWFz c2VydCgwKTsKKwkJYnJlYWs7CisJfTsKKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90 CithdGFfY29tbWFuZF9ibG9ja19yZWFkKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwgdWlu dDY0X3Qgb2Zmc2V0KQoreworCXVpbnQ2NF90IHZhbHVlID0gMDsKKwlzdHJ1Y3QgYXRhX2RyaXZl ICpkcml2ZSA9ICZjaGFubmVsLT5kcml2ZXNbY2hhbm5lbC0+ZHJpdmVdOworCXN0cnVjdCBhdGFf cGlvX3NldHVwICpwaW9fc2V0dXAgPSBOVUxMOworCisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9f c2V0dXA7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRBX0RBVEFfUkVHOgorCQl2YWx1 ZSA9IGF0YV9waW9fZ2V0X3VpbnQocGlvX3NldHVwKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfRVJS T1JfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5lcnJvcjsKKwkJZHByaW50KExPR19ERUJVRywgImF0 YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9FUlJPUl9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJ YnJlYWs7CisJY2FzZSBBVEFfU0VDQ09VTlRfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5zZWNjb3Vu dDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9TRUND T1VOVF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX0xPV19S RUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9sb3c7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFf Y29tbWFuZF9ibG9ja19yZWFkOiBBVEFfTEJBX0xPV19SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJ YnJlYWs7CisJY2FzZSBBVEFfTEJBX01JRF9SRUc6CisJCXZhbHVlID0gZHJpdmUtPmxiYV9taWQ7 CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja19yZWFkOiBBVEFfTEJBX01J RF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfTEJBX0hJR0hfUkVH OgorCQl2YWx1ZSA9IGRyaXZlLT5sYmFfaGlnaDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9j b21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9MQkFfSElHSF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJ YnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQl2YWx1ZSA9IGRyaXZlLT5oZGRldnNl bDsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3JlYWQ6IEFUQV9IRERF VlNFTF9SRUc6ICVseGhcbiIsIHZhbHVlKTsKKwkJYnJlYWs7CisJY2FzZSBBVEFfU1RBVFVTX1JF RzoKKwkJYXRhX2lycV9sb3dlcihjaGFubmVsKTsKKworCQl2YWx1ZSA9IGRyaXZlLT5zdGF0dXM7 CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja19yZWFkOiBBVEFfU1RBVFVT X1JFRzogJWx4aFxuIiwgdmFsdWUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWx1ZSA9IDA7 CisJCWJyZWFrOworCX0KKworCXJldHVybiB2YWx1ZTsKK30KKworc3RhdGljIHZvaWQKK2F0YV9j b21tYW5kX2Jsb2NrX3dyaXRlKHN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCwKKwkJdWludDY0 X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJc3RydWN0IGF0YV9kcml2 ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXTsKKwlzdHJ1Y3QgYXRh X2RyaXZlICpkcml2ZTAgPSAmY2hhbm5lbC0+ZHJpdmVzW0FUQV9NQVNURVJdOworCXN0cnVjdCBh dGFfZHJpdmUgKmRyaXZlMSA9ICZjaGFubmVsLT5kcml2ZXNbQVRBX1NMQVZFXTsKKwlzdHJ1Y3Qg YXRhX3Bpb19zZXR1cCAqcGlvX3NldHVwID0gTlVMTDsKKworCXVpbnQ4X3QgcmVnX3ZhbHVlOwor CisJcGlvX3NldHVwID0gJmRyaXZlLT5waW9fc2V0dXA7CisKKwlzd2l0Y2ggKG9mZnNldCkgewor CWNhc2UgQVRBX0RBVEFfUkVHOgorCQlhdGFfcGlvX3B1dF91aW50KHBpb19zZXR1cCwgdmFsdWUp OworCQlicmVhazsKKwljYXNlIEFUQV9GRUFUVVJFU19SRUc6CisJCWRyaXZlMC0+ZmVhdHVyZXMg PSB2YWx1ZTsKKwkJZHJpdmUxLT5mZWF0dXJlcyA9IHZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVH LCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9GRUFUVVJFU19SRUc6ICV4aFxuIiwgKHVp bnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9TRUNDT1VOVF9SRUc6CisJCWRyaXZl MC0+c2VjY291bnQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5zZWNjb3VudCA9IHZhbHVlOworCQlkcHJp bnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9TRUNDT1VOVF9SRUc6 ICV4aFxuIiwgKHVpbnQ4X3QpdmFsdWUpOworCQlicmVhazsKKwljYXNlIEFUQV9MQkFfTE9XX1JF RzoKKwkJZHJpdmUwLT5sYmFfbG93ID0gdmFsdWU7CisJCWRyaXZlMS0+bGJhX2xvdyA9IHZhbHVl OworCQlkcHJpbnQoTE9HX0RFQlVHLCAiYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGU6IEFUQV9MQkFf TE9XX1JFRzogJXhoXG4iLCAodWludDhfdCl2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0xC QV9NSURfUkVHOgorCQlkcml2ZTAtPmxiYV9taWQgPSB2YWx1ZTsKKwkJZHJpdmUxLT5sYmFfbWlk ID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFuZF9ibG9ja193cml0ZTog QVRBX0xCQV9NSURfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVlKTsKKwkJYnJlYWs7CisJY2Fz ZSBBVEFfTEJBX0hJR0hfUkVHOgorCQlkcml2ZTAtPmxiYV9oaWdoID0gdmFsdWU7CisJCWRyaXZl MS0+bGJhX2hpZ2ggPSB2YWx1ZTsKKwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Js b2NrX3dyaXRlOiBBVEFfTEJBX0hJR0hfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVlKTsKKwkJ YnJlYWs7CisJY2FzZSBBVEFfSERERVZTRUxfUkVHOgorCQlyZWdfdmFsdWUgPSB2YWx1ZTsKKwor CQlkcml2ZTAtPmhkZGV2c2VsID0gdmFsdWU7CisJCWRyaXZlMS0+aGRkZXZzZWwgPSB2YWx1ZTsK KwkJZHByaW50KExPR19ERUJVRywgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiBBVEFfSERERVZT RUxfUkVHOiAleGhcbiIsIHJlZ192YWx1ZSk7CisKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9EX0lC TSkKKwkJCWNoYW5uZWwtPnNpemUgPSBBVEFfU0VDVE9SX1NJWkU7CisJCWlmIChyZWdfdmFsdWUg JiBBVEFfREVWKEFUQV9TTEFWRSkpIHsKKwkJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29tbWFu ZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9TTEFWRVxuIik7CisJCQljaGFubmVsLT5kcml2ZSA9 IEFUQV9TTEFWRTsKKwkJfQorCQllbHNlIHsKKwkJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29t bWFuZF9ibG9ja193cml0ZTogc2VsZWN0IEFUQV9NQVNURVJcbiIpOworCQkJY2hhbm5lbC0+ZHJp dmUgPSBBVEFfTUFTVEVSOworCQl9CisJCWlmICghYXRhX3NlbGVjdF9kcml2ZV9pc19vayhjaGFu bmVsKSkgeworCQkJZHJpdmUxLT5zdGF0dXMgPSBBVEFfRFJJVkVfQUJTRU5UOworCQl9CisJCWJy ZWFrOworCWNhc2UgQVRBX0NPTU1BTkRfUkVHOgorCQlkcml2ZTAtPmNvbW1hbmQgPSB2YWx1ZTsK KwkJZHJpdmUxLT5jb21tYW5kID0gdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJhdGFfY29t bWFuZF9ibG9ja193cml0ZTogQVRBX0NPTU1BTkRfUkVHOiAleGhcbiIsICh1aW50OF90KXZhbHVl KTsKKwkJYXRhX2hhbmRsZV9jbWQoY2hhbm5lbCwgdmFsdWUpOworCQlicmVhazsKKwlkZWZhdWx0 OgorCQlkcHJpbnQoTE9HX0VSUiwgImF0YV9jb21tYW5kX2Jsb2NrX3dyaXRlOiB1bnN1cHBvcnRl ZCByZWc6JWx4XG4iLCBvZmZzZXQpOworCQlhc3NlcnQoMCk7CisJCWJyZWFrOworCX0KKworCXJl dHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90CithdGFfYWx0c3RhdHVzX3JlYWQoc3RydWN0IGF0 YV9jaGFubmVsICpjaGFubmVsKQoreworCXN0cnVjdCBhdGFfZHJpdmUgKmRyaXZlID0gJmNoYW5u ZWwtPmRyaXZlc1tjaGFubmVsLT5kcml2ZV07CisJdWludDY0X3QgdmFsdWUgPSAwOworCisJdmFs dWUgPSBkcml2ZS0+YWx0c3RhdHVzOworCisJZHByaW50KExPR19ERUJVRywgImF0YV9hbHRzdGF0 dXNfcmVhZDogdmFsdWU6ICVsdVxuIiwgdmFsdWUpOworCisJcmV0dXJuIHZhbHVlOworfQorCitz dGF0aWMgdm9pZAorYXRhX2NvbnRyb2xfd3JpdGUoc3RydWN0IGF0YV9jaGFubmVsICpjaGFubmVs LAorCQlpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisJdWludDhfdCByZWdfdmFsdWU7CisJ c3RydWN0IGF0YV9kcml2ZSAqZHJpdmUgPSAmY2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZl XTsKKworCXJlZ192YWx1ZSA9ICh1aW50OF90KXZhbHVlOworCisJZHByaW50KExPR19ERUJVRywg ImF0YV9jb250cm9sX3dyaXRlOiBpcnFfZGlzYWJsZWQ6ICVkXG4iLCByZWdfdmFsdWUgJiBBVEFf QV9JRFMpOworCisJaWYgKHJlZ192YWx1ZSAmIEFUQV9BX0lEUykKKwkJZHJpdmUtPmlycV9kaXNh YmxlZCA9IDE7CisJZWxzZQorCQlkcml2ZS0+aXJxX2Rpc2FibGVkID0gMDsKKworCWlmIChyZWdf dmFsdWUgJiBBVEFfQV9SRVNFVCkKKwkJYXRhX3Nyc3QoY2hhbm5lbCk7CisKKwlyZXR1cm47Cit9 CisKKy8qCisgKiBQQ0kgQVRBIGZ1bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0YXRpYyB2b2lk CitwY2lfYXRhX2ludHJfYXNzZXJ0KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcGNpX2F0YV9zb2Z0 YyAqc2MgPSAoc3RydWN0IHBjaV9hdGFfc29mdGMgKilhcmc7CisJc3RydWN0IHBjaV9kZXZpbnN0 ICpwaSA9IHNjLT5hc2NfcGk7CisKKwlwY2lfbGludHJfYXNzZXJ0KHBpKTsKKworCXJldHVybjsK K30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpCit7CisJ c3RydWN0IHBjaV9hdGFfc29mdGMgKnNjID0gKHN0cnVjdCBwY2lfYXRhX3NvZnRjICopYXJnOwor CXN0cnVjdCBwY2lfZGV2aW5zdCAqcGkgPSBzYy0+YXNjX3BpOworCisJcGNpX2xpbnRyX2RlYXNz ZXJ0KHBpKTsKKworCXJldHVybjsKK30KKworc3RhdGljIGludAorcGNpX2F0YV9wYXJzZV9wYXJh bXMoY29uc3QgY2hhciAqb3B0cywgY2hhciAqb3B0MCwgY2hhciAqb3B0MSwgdWludDhfdCAqbnJf Y2hhbm5lbHMpCit7CisJdWludDhfdCBsZW47CisJY2hhciB0bXBfb3B0c1sxMjhdOworCWNoYXIg KmNoMCA9IE5VTEwsICpjaDEgPSBOVUxMOworCXVpbnQ4X3QgaTsKKworCWlmICghb3B0cykgewor CQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfcGFyc2VfcGFyYW1zOiBvcHRzIHNob3VsZCBiZSBs aWtlOiAlc1xuIiwKKwkJICAgICAgICJYLE1BU1RFUl9YWyxTTEFWRV9YXVs7WSxNQVNURVJfWVss U0xBVkVfWV1dIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW4gPSBzdHJsZW4ob3B0cyk7CisJ aWYgKGxlbiA+PSAxMjgpIHsKKwkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX3BhcnNlX3BhcmFt czogUENJIEFUQSBzdHJpbmcgcGFyYW1zIHRvbyBiaWdcbiIpOworCQlyZXR1cm4gLTE7CisJfQor CisJc3RyY3B5KHRtcF9vcHRzLCBvcHRzKTsKKworCWNoMCA9IHRtcF9vcHRzOworCisJZm9yIChp ID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWlmICh0bXBfb3B0c1tpXSA9PSBQQ0lfQVRBX0NIX1NF UCkgeworCQkJaWYgKGNoMSkgeworCQkJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9wYXJzZV9w YXJhbXM6IHRvIG1hbnkgY2hhbm5lbHNcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXRt cF9vcHRzW2ldID0gJ1wwJzsKKwkJCWNoMSA9IHRtcF9vcHRzICsgaSArIDE7CisJCX0KKwl9CisK KwlpZiAoc3RybGVuKGNoMCkgPj0gNjQpIHsKKwkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX3Bh cnNlX3BhcmFtczogdGhlIG5hbWUgb2YgQVRBX1ggY2hhbm5lbCB0b28gYmlnXG4iKTsKKwkJcmV0 dXJuIC0xOworCX0KKwlzdHJjcHkob3B0MCwgY2gwKTsKKwkqbnJfY2hhbm5lbHMgPSAxOworCisJ aWYgKGNoMSAhPSBOVUxMICYmIHN0cmxlbihjaDEpIDwgNjQpIHsKKwkJc3RyY3B5KG9wdDEsICBj aDEpOworCQkqbnJfY2hhbm5lbHMgPSAyOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50CitwY2lfYXRhX2luaXQoc3RydWN0IHZtY3R4ICpjdHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAq cGksIGNoYXIgKm9wdHMsIGludCBhdGFwaSkKK3sKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5u ZWwgPSBOVUxMOworCXN0cnVjdCBwY2lfYXRhX3NvZnRjICpwY2lfYXRhX3NjID0gTlVMTDsKKwlj aGFyIGNoX29wdHNbMl1bNjRdOworCXVpbnQ4X3QgbnJfY2hhbm5lbHMgPSAwOworCWludCByZXQs IGk7CisKKwlhdGFfb3Blbl9kYmdfZmlsZSgpOworCisJcmV0ID0gcGNpX2F0YV9wYXJzZV9wYXJh bXMob3B0cywgY2hfb3B0c1swXSwgY2hfb3B0c1sxXSwgJm5yX2NoYW5uZWxzKTsKKwlpZiAocmV0 KSB7CisJCWRwcmludChMT0dfRVJSLCAicGNpX2F0YV9pbml0OiBzb21lIGVycm9ycyB3aXRoIHRo ZSBpbnB1dCBjaGVja2luZ1xuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwY2lfYXRhX3NjID0g Y2FsbG9jKDEsIHNpemVvZihzdHJ1Y3QgcGNpX2F0YV9zb2Z0YykpOworCWlmICghcGNpX2F0YV9z YykKKwkJcmV0dXJuIC0xOworCisJcGNpX2F0YV9zYy0+Y2hhbm5lbHNbQVRBX1hdID0gTlVMTDsK KwlwY2lfYXRhX3NjLT5jaGFubmVsc1tBVEFfWV0gPSBOVUxMOworCisJZm9yIChpID0gMDsgaSA8 IG5yX2NoYW5uZWxzOyBpKyspIHsKKwkJY2hhbm5lbCA9IGF0YV9pbml0KGN0eCwgcGNpX2F0YV9p bnRyX2Fzc2VydCwgcGNpX2F0YV9pbnRyX2RlYXNzZXJ0LAorCQkJCSAgIHBjaV9hdGFfc2MsIGNo X29wdHNbaV0sIDApOworCQlpZiAoIWNoYW5uZWwpCisJCQljb250aW51ZTsKKwkJY2hhbm5lbC0+ dXNlXzE2Yml0ID0gMDsKKwkJYXNzZXJ0KCFwY2lfYXRhX3NjLT5jaGFubmVsc1tjaGFubmVsLT5p bnRlcmZhY2VdKTsKKwkJcGNpX2F0YV9zYy0+Y2hhbm5lbHNbY2hhbm5lbC0+aW50ZXJmYWNlXSA9 IGNoYW5uZWw7CisJfQorCisJLyogZXhpdCBpZiBub25lIG9mIHRoZSBjaGFubmVscyBhcmUgaW5p dGlhbGl6ZWQgKi8KKwlpZiAoIXBjaV9hdGFfc2MtPmNoYW5uZWxzW0FUQV9YXSAmJiAhcGNpX2F0 YV9zYy0+Y2hhbm5lbHNbQVRBX1ldKSB7CisJCWZyZWUocGNpX2F0YV9zYyk7CisJCXJldHVybiAt MTsKKwl9CisKKwlwaS0+cGlfYXJnID0gcGNpX2F0YV9zYzsKKwlwY2lfYXRhX3NjLT5hc2NfcGkg PSBwaTsKKworCS8qIGdlbmVyaWMgUENJIEFUQS9BVEFQSSBkZXZpY2UgQVRBX0lUODIxMUYgKi8K KwlwY2lfc2V0X2NmZ2RhdGExNihwaSwgUENJUl9ERVZJQ0UsIDB4ODIxMSk7CS8qIEFUQS9BVEFQ SSBDb250cm9sbGVyICovCisJcGNpX3NldF9jZmdkYXRhMTYocGksIFBDSVJfVkVORE9SLCAweDEy ODMpOwkvKiBXYWxkbyAqLworCisJLyogdGhpcyBpcyBhIHN0b3JhZ2UgY2xhc3MgZGV2aWNlICov CisJcGNpX3NldF9jZmdkYXRhOChwaSwgUENJUl9DTEFTUywgUENJQ19TVE9SQUdFKTsKKwkvKiB0 aGlzIGlzIGFuIElERS9BVEEgdHlwZSBkZXZpY2UgKi8KKwlwY2lfc2V0X2NmZ2RhdGE4KHBpLCBQ Q0lSX1NVQkNMQVNTLCBQQ0lTX1NUT1JBR0VfSURFKTsKKworCXBjaV9zZXRfY2ZnZGF0YTgocGks IFBDSVJfUFJPR0lGLCBQQ0lQX1NUT1JBR0VfSURFX01BU1RFUkRFViB8CisJCQkgUENJUF9TVE9S QUdFX0lERV9NT0RFUFJJTSB8IFBDSVBfU1RPUkFHRV9JREVfTU9ERVNFQyk7CisKKwlwY2lfZW11 bF9hbGxvY19iYXIocGksIFBDSV9CQVIwLCBQQ0lCQVJfSU8sIEFUQV9JT1NJWkUpOworCXBjaV9l bXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjEsIFBDSUJBUl9JTywgQVRBX0NUTElPU0laRSk7CisJ cGNpX2VtdWxfYWxsb2NfYmFyKHBpLCBQQ0lfQkFSMiwgUENJQkFSX0lPLCBBVEFfSU9TSVpFKTsK KwlwY2lfZW11bF9hbGxvY19iYXIocGksIFBDSV9CQVIzLCBQQ0lCQVJfSU8sIEFUQV9DVExJT1NJ WkUpOworCXBjaV9lbXVsX2FsbG9jX2JhcihwaSwgUENJX0JBUjQsIFBDSUJBUl9JTywgQVRBX0NI QU5ORUxTICogQVRBX0JNSU9TSVpFKTsKKworCXBjaV9saW50cl9yZXF1ZXN0KHBpKTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50CitwY2lfYXRhX2hkX2luaXQoc3RydWN0IHZtY3R4ICpj dHgsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGNoYXIgKm9wdHMpCit7CisJcmV0dXJuIChwY2lf YXRhX2luaXQoY3R4LCBwaSwgb3B0cywgMCkpOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV9k bWFfc3RhcnQoc3RydWN0IHBjaV9hdGFfc29mdGMgKnNjLCB1aW50OF90IGNoKQoreworCXN0cnVj dCB2bWN0eCAqY3R4ID0gTlVMTDsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxM OworCXN0cnVjdCBibG9ja2lmX2N0eHQgKmJjdHh0ID0gTlVMTDsKKwlzdHJ1Y3QgcGNpX2F0YV9k bWFfdHJhbnNhY3Rpb24gKmRtYV90cmFuc2FjdGlvbiA9IE5VTEw7CisJc3RydWN0IGJsb2NraWZf cmVxICpicmVxID0gTlVMTDsKKworCXN0cnVjdCBwcmRfZW50cnkgKnByZHQgPSBOVUxMOworCXN0 cnVjdCBwcmRfZW50cnkgKmVudHJ5ID0gTlVMTDsKKwl1aW50MzJfdCBwcmR0X2FkZHJlc3M7CisJ dWludDMyX3QgaW5kZXg7CisJdWludDMyX3QgYnl0ZV9jb3VudDsKKwl2b2lkICplbnRyeV9idWZm ID0gTlVMTDsKKwlpbnQgZXJyOworCisJY2hhbm5lbCA9IHNjLT5jaGFubmVsc1tjaF07CisKKwlj dHggPSBjaGFubmVsLT52bV9jdHg7CisJYXNzZXJ0KGN0eCAhPSBOVUxMKTsKKworCWJjdHh0ID0g Y2hhbm5lbC0+ZHJpdmVzW2NoYW5uZWwtPmRyaXZlXS5iY3R4dDsKKwlkbWFfdHJhbnNhY3Rpb24g PSAmc2MtPmRtYV90cmFuc2FjdGlvbnNbY2hdOworCisJYXNzZXJ0KGRtYV90cmFuc2FjdGlvbi0+ c3RhcnRlZCk7CisKKwlhc3NlcnQoKChzYy0+Y21kW2NoXSAmIEFUQV9CTUNNRF9XUklURV9SRUFE KSAmJiBkbWFfdHJhbnNhY3Rpb24tPm9wX2RpciA9PSBBVEFfRE1BX1JFQUQpIHx8CisJCSghKHNj LT5jbWRbY2hdICYgQVRBX0JNQ01EX1dSSVRFX1JFQUQpICYmIGRtYV90cmFuc2FjdGlvbi0+b3Bf ZGlyID09IEFUQV9ETUFfV1JJVEUpKTsKKworCXNjLT5zdGF0W2NoXSB8PSBBVEFfQk1TVEFUX0FD VElWRTsKKworCS8qIHByZHRfYWRkcmVzcyBpcyB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUg cHJkdCBpbiB0aGUgZ3Vlc3QgbWVtb3J5ICovCisJcHJkdF9hZGRyZXNzID0gc2MtPnByZHRbY2hd OworCisJLyogbWFwIHRoZSBndWVzdCBwaHlzaWNhbCBhZGRyZXNzIGludG8gdGhlIGhvc3Qgdmly dHVhbCBhZGRyZXNzICovCisJcHJkdCA9IHBhZGRyX2d1ZXN0Mmhvc3QoY3R4LCBwcmR0X2FkZHJl c3MsIEFUQV9ETUFfUFJEVF9TSVpFKTsKKwlhc3NlcnQocHJkdCAhPSBOVUxMKTsKKworCWJyZXEg PSAmZG1hX3RyYW5zYWN0aW9uLT5icmVxOworCWJyZXEtPmJyX3BhcmFtID0gY2hhbm5lbDsKKwli cmVxLT5icl9jYWxsYmFjayA9IGF0YV9oYW5kbGVfYmxvY2tfcmVxdWVzdDsKKwlicmVxLT5icl9v ZmZzZXQgPSBkbWFfdHJhbnNhY3Rpb24tPm9mZnNldDsKKworCWRtYV90cmFuc2FjdGlvbi0+aXNf ZW90ID0gMDsKKwlpbmRleCA9IDA7CisJd2hpbGUgKCFkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCAm JiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA+IDApIHsKKwkJZW50cnkgPSBwcmR0ICsgaW5kZXg7 CisKKwkJZW50cnlfYnVmZiA9IHBhZGRyX2d1ZXN0Mmhvc3QoY3R4LCBlbnRyeS0+cHJkX2FkZHJl c3MsIGVudHJ5LT5ieXRlX2NvdW50KTsKKwkJYnl0ZV9jb3VudCA9IGVudHJ5LT5ieXRlX2NvdW50 ID8gZW50cnktPmJ5dGVfY291bnQgOiBBVEFfRE1BX01BWF9QUkRfQ09VTlQ7CisKKwkJaWYgKGJ5 dGVfY291bnQgPiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcykgeworCQkJZHByaW50KExPR19FUlIs ICJwY2lfYXRhX2RtYV9zdGFydDogdGhlIFBSRCBlbnRyeSBjb250YWlucyAlcyIsCisJCQkgICAg ICAgIm1vcmUgYnl0ZXMgdGhhbiB0aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCQkJYnl0ZV9j b3VudCA9IGRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzOworCQl9CisKKwkJaWYgKGluZGV4ID09IEJM T0NLSUZfSU9WX01BWCkgeworCQkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX2RtYV9zdGFydDog dGhlIFBSRCBUYWJsZSBjb250YWlucyAlcyIsCisJCQkgICAgICAgIm1vcmUgdGhhbiBCTE9DS0lG X0lPVl9NQVggZW50cmllc1xuIik7CisJCQlicmVhazsKKwkJfQorCisJCWJyZXEtPmJyX2lvdltp bmRleF0uaW92X2xlbiA9IGJ5dGVfY291bnQ7CisJCWJyZXEtPmJyX2lvdltpbmRleF0uaW92X2Jh c2UgPSBlbnRyeV9idWZmOworCisJCWRtYV90cmFuc2FjdGlvbi0+bmJ5dGVzIC09IGJ5dGVfY291 bnQ7CisKKwkJaWYgKGVudHJ5LT52ZW5kb3Jfc3BlY2lmaWMgJiBBVEFfRE1BX1BSRFRfRU9UKQor CQkJZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgPSAxOworCisJCWluZGV4Kys7CisJfQorCisJYnJl cS0+YnJfaW92Y250ID0gaW5kZXg7CisKKwlzYy0+c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9JTlRF UlJVUFQ7CisKKwkvKgorCSAqIFVzZSBhc3luY2hyb25vdXMgb3BlcmF0aW9ucyBmb3IgcmVhZCAv IHdyaXRlIG9uIHRoZSBibG9jazsKKwkgKiB1cGRhdGUgdGhlIHN0YXR1cyByZWdpc3RlcnMgYW5k IG5vdGlmeSB0aGUgZ3Vlc3Qgb3BlcmF0aW5nCisJICogc3lzdGVtIHVzaW5nIGFuIGludGVycnVw dCBpbiB0aGUgYXRhX2hhbmRsZV9ibG9ja19yZXF1ZXN0IGNhbGxiYWNrCisJICovCisJaWYgKGRt YV90cmFuc2FjdGlvbi0+b3BfZGlyID09IEFUQV9ETUFfUkVBRCkgeworCQllcnIgPSBibG9ja2lm X3JlYWQoYmN0eHQsIGJyZXEpOworCX0KKwllbHNlIGlmIChkbWFfdHJhbnNhY3Rpb24tPm9wX2Rp ciA9PSBBVEFfRE1BX1dSSVRFKSB7CisJCWVyciA9IGJsb2NraWZfd3JpdGUoYmN0eHQsIGJyZXEp OworCX0KKwllbHNlIHsKKwkJYXNzZXJ0KDApOworCX0KKworCWFzc2VydCghZXJyKTsKKworCXJl dHVybjsKK30KKworc3RhdGljIHZvaWQKK3BjaV9hdGFfZG1hX3N0b3Aoc3RydWN0IHBjaV9hdGFf c29mdGMgKnNjLCB1aW50OF90IGNoKQoreworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9 IE5VTEw7CisJc3RydWN0IHBjaV9hdGFfZG1hX3RyYW5zYWN0aW9uICpkbWFfdHJhbnNhY3Rpb24g PSBOVUxMOworCisJY2hhbm5lbCA9IHNjLT5jaGFubmVsc1tjaF07CisJZG1hX3RyYW5zYWN0aW9u ID0gJnNjLT5kbWFfdHJhbnNhY3Rpb25zW2NoXTsKKworCWlmKCFkbWFfdHJhbnNhY3Rpb24tPnN0 YXJ0ZWQpIHsKKwkJcmV0dXJuOworCX0KKworCWlmIChkbWFfdHJhbnNhY3Rpb24tPmlzX2VvdCAm JiBkbWFfdHJhbnNhY3Rpb24tPm5ieXRlcyA9PSAwKSB7CisJCXNjLT5zdGF0W2NoXSB8PSBBVEFf Qk1TVEFUX0lOVEVSUlVQVDsKKwkJc2MtPnN0YXRbY2hdICY9IH5BVEFfQk1TVEFUX0VSUk9SOwor CQlzYy0+c3RhdFtjaF0gJj0gfkFUQV9CTVNUQVRfQUNUSVZFOworCX0KKwllbHNlIGlmICghZG1h X3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPT0gMCkgewor CQlzYy0+c3RhdFtjaF0gfD0gQVRBX0JNU1RBVF9JTlRFUlJVUFQ7CisJCXNjLT5zdGF0W2NoXSAm PSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJc2MtPnN0YXRbY2hdIHw9IEFUQV9CTVNUQVRfQUNUSVZF OworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0b3A6IERNQSBQUkRUIHRyYW5zZmVy IHdhcyAlcyIsCisJCSAgICAgICAibGFyZ2VyIHRoYW4gdGhlIEFUQSB0cmFuc2ZlciBzaXplXG4i KTsKKwl9CisJZWxzZSBpZiAoZG1hX3RyYW5zYWN0aW9uLT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0 aW9uLT5uYnl0ZXMgPiAwKSB7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9JTlRFUlJV UFQ7CisJCXNjLT5zdGF0W2NoXSAmPSB+QVRBX0JNU1RBVF9FUlJPUjsKKwkJc2MtPnN0YXRbY2hd ICY9IH5BVEFfQk1TVEFUX0FDVElWRTsKKwkJZHByaW50KExPR19FUlIsICJwY2lfYXRhX2RtYV9z dG9wOiBETUEgUFJEVCB0cmFuc2ZlciB3YXMgJXMiLAorCQkgICAgICAgInNtYWxsZXIgdGhhbiB0 aGUgQVRBIHRyYW5zZmVyIHNpemVcbiIpOworCX0KKwllbHNlIGlmICghZG1hX3RyYW5zYWN0aW9u LT5pc19lb3QgJiYgZG1hX3RyYW5zYWN0aW9uLT5uYnl0ZXMgPiAwKSB7CisJCXNjLT5zdGF0W2No XSB8PSBBVEFfQk1TVEFUX0VSUk9SOworCQlkcHJpbnQoTE9HX0VSUiwgInBjaV9hdGFfZG1hX3N0 b3A6IHRoZSBQUkQgVGFibGUgY29udGFpbnMgJXMiLAorCQkgICAgICAgIm1vcmUgdGhhbiBCTE9D S0lGX0lPVl9NQVggZW50cmllc1xuIik7CisJfQorCisJZG1hX3RyYW5zYWN0aW9uLT5zdGFydGVk ID0gMDsKKworCXJldHVybjsKK30KKworc3RhdGljIHVpbnQ2NF90CitwY2lfYXRhX2J1c19tYXN0 ZXJfcmVhZChzdHJ1Y3QgcGNpX2F0YV9zb2Z0YyAqc2MsIHVpbnQ2NF90IG9mZnNldCkKK3sKKwl1 aW50NjRfdCB2YWx1ZSA9IDA7CisKKwlzd2l0Y2ggKG9mZnNldCkgeworCWNhc2UgQVRBX0JNQ01E X1hfUkVHOgorCQl2YWx1ZSA9IHNjLT5jbWRbQVRBX1hdOworCQlkcHJpbnQoTE9HX0RFQlVHLCAi cGNpX2F0YV9idXNfbWFzdGVyX3JlYWQ6IEFUQV9CTUNNRF9YX1JFRzogJWx1XG4iLCB2YWx1ZSk7 CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJdmFsdWUgPSBzYy0+c3RhdFtB VEFfWF07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRB X0JNU1RBVF9YX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJE VF9YX1JFRzoKKwkJdmFsdWUgPSBzYy0+cHJkdFtBVEFfWF07CisJCWRwcmludChMT0dfREVCVUcs ICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNUFJEVF9YX1JFRzogJWx1XG4iLCB2YWx1 ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgorCQl2YWx1ZSA9IHNjLT5jbWRb QVRBX1ldOworCQlkcHJpbnQoTE9HX0RFQlVHLCAicGNpX2F0YV9idXNfbWFzdGVyX3JlYWQ6IEFU QV9CTUNNRF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNU1RB VF9ZX1JFRzoKKwkJdmFsdWUgPSBzYy0+c3RhdFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcs ICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDogQVRBX0JNU1RBVF9ZX1JFRzogJWx1XG4iLCB2YWx1 ZSk7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9ZX1JFRzoKKwkJdmFsdWUgPSBzYy0+cHJk dFtBVEFfWV07CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfcmVhZDog QVRBX0JNUFJEVF9ZX1JFRzogJWx1XG4iLCB2YWx1ZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJ CXZhbHVlID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMg dm9pZAorcGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlKHN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYywK KwkJdWludDY0X3Qgb2Zmc2V0LCBpbnQgc2l6ZSwgdWludDY0X3QgdmFsdWUpCit7CisKKwl1aW50 OF90IHJlZ192YWx1ZTsKKworCWlmIChvZmZzZXQgIT0gQVRBX0JNUFJEVF9YX1JFRyAmJiBvZmZz ZXQgIT0gQVRBX0JNUFJEVF9ZX1JFRyAmJiBzaXplICE9IDEpCisJCXJldHVybjsKKwlpZiAoKG9m ZnNldCA9PSBBVEFfQk1QUkRUX1hfUkVHIHx8IG9mZnNldCA9PSBBVEFfQk1QUkRUX1lfUkVHKSAm JiBzaXplICE9IDQpCisJCXJldHVybjsKKworCXN3aXRjaCAob2Zmc2V0KSB7CisJY2FzZSBBVEFf Qk1DTURfWF9SRUc6CisJCXJlZ192YWx1ZSA9IHNjLT5jbWRbQVRBX1hdID0gKHVpbnQ4X3QpdmFs dWU7CisKKwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtYXTog QVRBX0JNQ01EX1NUQVJUX1NUT1A6ICVkXG4iLAorCQkgICAgICAgcmVnX3ZhbHVlICYgQVRBX0JN Q01EX1NUQVJUX1NUT1ApOworCQlpZiAocmVnX3ZhbHVlICYgQVRBX0JNQ01EX1NUQVJUX1NUT1Ap IHsKKwkJCXBjaV9hdGFfZG1hX3N0YXJ0KHNjLCBBVEFfWCk7CisJCX0KKwkJZWxzZSB7CisJCQlw Y2lfYXRhX2RtYV9zdG9wKHNjLCBBVEFfWCk7CisJCX0KKworCQlkcHJpbnQoTE9HX0RFQlVHLCAi cGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1hdOiBBVEFfQk1DTURfV1JJVEVfUkVBRDogJWRcbiIs CisJCSAgICAgICByZWdfdmFsdWUgJiBBVEFfQk1DTURfV1JJVEVfUkVBRCk7CisJCWJyZWFrOwor CWNhc2UgQVRBX0JNU1RBVF9YX1JFRzoKKwkJcmVnX3ZhbHVlID0gc2MtPnN0YXRbQVRBX1hdID0g KHVpbnQ4X3QpdmFsdWU7CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJf d3JpdGVbWF06IEFUQV9CTVNUQVRfSU5URVJSVVBUOiAlZCwgQVRBX0JNU1RBVF9FUlJPUjogJWRc biIsCisJCQkJcmVnX3ZhbHVlICAmIEFUQV9CTVNUQVRfSU5URVJSVVBULCByZWdfdmFsdWUgJiBB VEFfQk1TVEFUX0VSUk9SKTsKKwkJaWYgKHJlZ192YWx1ZSAmIEFUQV9CTVNUQVRfSU5URVJSVVBU KQorCQkJc2MtPnN0YXRbQVRBX1hdICY9IH5BVEFfQk1TVEFUX0lOVEVSUlVQVDsKKwkJaWYgKHJl Z192YWx1ZSAmIEFUQV9CTVNUQVRfRVJST1IpCisJCQlzYy0+c3RhdFtBVEFfWF0gJj0gfkFUQV9C TVNUQVRfRVJST1I7CisJCWJyZWFrOworCWNhc2UgQVRBX0JNUFJEVF9YX1JFRzoKKwkJZHByaW50 KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtYXTogQVRBX0JNUFJEVF9YX1JF RzogMHgleFxuIiwgKHVpbnQzMl90KXZhbHVlKTsKKwkJc2MtPnByZHRbQVRBX1hdID0gdmFsdWU7 CisJCWJyZWFrOworCWNhc2UgQVRBX0JNQ01EX1lfUkVHOgorCQlyZWdfdmFsdWUgPSBzYy0+Y21k W0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOworCisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRh X2J1c19tYXN0ZXJfd3JpdGVbWV06IEFUQV9CTUNNRF9TVEFSVF9TVE9QOiAlZFxuIiwKKwkJICAg ICAgIHJlZ192YWx1ZSAmIEFUQV9CTUNNRF9TVEFSVF9TVE9QKTsKKwkJaWYgKHJlZ192YWx1ZSAm IEFUQV9CTUNNRF9TVEFSVF9TVE9QKSB7CisJCQlwY2lfYXRhX2RtYV9zdGFydChzYywgQVRBX1kp OworCQl9CisJCWVsc2UgeworCQkJcGNpX2F0YV9kbWFfc3RvcChzYywgQVRBX1kpOworCQl9CisK KwkJZHByaW50KExPR19ERUJVRywgInBjaV9hdGFfYnVzX21hc3Rlcl93cml0ZVtZXTogQVRBX0JN Q01EX1dSSVRFX1JFQUQ6ICVkXG4iLAorCQkgICAgICAgcmVnX3ZhbHVlICYgQVRBX0JNQ01EX1dS SVRFX1JFQUQpOworCQlicmVhazsKKwljYXNlIEFUQV9CTVNUQVRfWV9SRUc6CisJCXJlZ192YWx1 ZSA9IHNjLT5zdGF0W0FUQV9ZXSA9ICh1aW50OF90KXZhbHVlOworCQlkcHJpbnQoTE9HX0RFQlVH LCAicGNpX2F0YV9idXNfbWFzdGVyX3dyaXRlW1ldOiBBVEFfQk1TVEFUX0lOVEVSUlVQVDogJWQs IEFUQV9CTVNUQVRfRVJST1I6ICVkXG4iLAorCQkJCXJlZ192YWx1ZSAgJiBBVEFfQk1TVEFUX0lO VEVSUlVQVCwgcmVnX3ZhbHVlICYgQVRBX0JNU1RBVF9FUlJPUik7CisJCWlmIChyZWdfdmFsdWUg JiBBVEFfQk1TVEFUX0lOVEVSUlVQVCkKKwkJCXNjLT5zdGF0W0FUQV9ZXSAmPSB+QVRBX0JNU1RB VF9JTlRFUlJVUFQ7CisJCWlmIChyZWdfdmFsdWUgJiBBVEFfQk1TVEFUX0VSUk9SKQorCQkJc2Mt PnN0YXRbQVRBX1ldICY9IH5BVEFfQk1TVEFUX0VSUk9SOworCQlicmVhazsKKwljYXNlIEFUQV9C TVBSRFRfWV9SRUc6CisJCWRwcmludChMT0dfREVCVUcsICJwY2lfYXRhX2J1c19tYXN0ZXJfd3Jp dGVbWV06IEFUQV9CTVBSRFRfWF9SRUc6IDB4JXhcbiIsICh1aW50MzJfdCl2YWx1ZSk7CisJCXNj LT5wcmR0W0FUQV9ZXSA9ICh1aW50MzJfdCl2YWx1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ YnJlYWs7CisJfQorCisJcmV0dXJuOworfQorCitzdGF0aWMgdWludDY0X3QKK3BjaV9hdGFfcmVh ZChzdHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksIGlu dCBiYXJpZHgsCisJCXVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUpCit7CisJc3RydWN0IHBjaV9h dGFfc29mdGMgKnNjID0gcGktPnBpX2FyZzsKKwl1aW50NjRfdCB2YWx1ZSA9IDA7CisKKwlzd2l0 Y2ggKGJhcmlkeCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9Y XSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FU QV9YXSwgQVRBX1gpKTsKKwkJdmFsdWUgPSBhdGFfY29tbWFuZF9ibG9ja19yZWFkKHNjLT5jaGFu bmVsc1tBVEFfWF0sIG9mZnNldCk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjE6CisJCWlmICgh c2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNf b2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJdmFsdWUgPSBhdGFfYWx0c3RhdHVz X3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9YXSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjI6CisJ CWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5u ZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsKKwkJdmFsdWUgPSBhdGFfY29t bWFuZF9ibG9ja19yZWFkKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9mZnNldCk7CisJCWJyZWFrOwor CWNhc2UgUENJX0JBUjM6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9ZXSkKKwkJCWJyZWFrOwor CQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9ZXSwgQVRBX1kpKTsK KwkJdmFsdWUgPSBhdGFfYWx0c3RhdHVzX3JlYWQoc2MtPmNoYW5uZWxzW0FUQV9ZXSk7CisJCWJy ZWFrOworCWNhc2UgUENJX0JBUjQ6CisJCXZhbHVlID0gcGNpX2F0YV9idXNfbWFzdGVyX3JlYWQo c2MsIG9mZnNldCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydCgwKTsKKwkJYnJlYWs7 CisJfQorCisJcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZAorcGNpX2F0YV93cml0ZShz dHJ1Y3Qgdm1jdHggKmN0eCwgaW50IHZjcHUsIHN0cnVjdCBwY2lfZGV2aW5zdCAqcGksCisJCWlu dCBiYXJpZHgsIHVpbnQ2NF90IG9mZnNldCwgaW50IHNpemUsIHVpbnQ2NF90IHZhbHVlKQorewor CXN0cnVjdCBwY2lfYXRhX3NvZnRjICpzYyA9IHBpLT5waV9hcmc7CisKKwlzd2l0Y2ggKGJhcmlk eCkgeworCWNhc2UgUENJX0JBUjA6CisJCWlmICghc2MtPmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJy ZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2soc2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRB X1gpKTsKKwkJYXRhX2NvbW1hbmRfYmxvY2tfd3JpdGUoc2MtPmNoYW5uZWxzW0FUQV9YXSwgb2Zm c2V0LCBzaXplLCB2YWx1ZSk7CisJCWJyZWFrOworCWNhc2UgUENJX0JBUjE6CisJCWlmICghc2Mt PmNoYW5uZWxzW0FUQV9YXSkKKwkJCWJyZWFrOworCQlhc3NlcnQoYXRhX2NoYW5uZWxfaXNfb2so c2MtPmNoYW5uZWxzW0FUQV9YXSwgQVRBX1gpKTsKKwkJYXRhX2NvbnRyb2xfd3JpdGUoc2MtPmNo YW5uZWxzW0FUQV9YXSwgc2l6ZSwgdmFsdWUpOworCQlicmVhazsKKwljYXNlIFBDSV9CQVIyOgor CQlpZiAoIXNjLT5jaGFubmVsc1tBVEFfWV0pCisJCQlicmVhazsKKwkJYXNzZXJ0KGF0YV9jaGFu bmVsX2lzX29rKHNjLT5jaGFubmVsc1tBVEFfWV0sIEFUQV9ZKSk7CisJCWF0YV9jb21tYW5kX2Js b2NrX3dyaXRlKHNjLT5jaGFubmVsc1tBVEFfWV0sIG9mZnNldCwgc2l6ZSwgdmFsdWUpOworCQli cmVhazsKKwljYXNlIFBDSV9CQVIzOgorCQlpZiAoIXNjLT5jaGFubmVsc1tBVEFfWV0pCisJCQli cmVhazsKKwkJYXNzZXJ0KGF0YV9jaGFubmVsX2lzX29rKHNjLT5jaGFubmVsc1tBVEFfWV0sIEFU QV9ZKSk7CisJCWF0YV9jb250cm9sX3dyaXRlKHNjLT5jaGFubmVsc1tBVEFfWV0sIHNpemUsIHZh bHVlKTsKKwkJYnJlYWs7CisJY2FzZSBQQ0lfQkFSNDoKKwkJcGNpX2F0YV9idXNfbWFzdGVyX3dy aXRlKHNjLCBvZmZzZXQsIHNpemUsIHZhbHVlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYXNz ZXJ0KDApOworCQlicmVhazsKKwl9CisKKwlyZXR1cm47Cit9CisKKy8qCisgKiBMUEMgQVRBIGZ1 bmN0aW9uIGRlZmluaXRpb25zCisgKi8KK3N0YXRpYyB2b2lkCitscGNfYXRhX2ludHJfYXNzZXJ0 KHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAqc2NfbHBjX2F0YSA9IChzdHJ1 Y3QgbHBjX2F0YV9zb2Z0YyAqKWFyZzsKKwlzdHJ1Y3Qgdm1jdHggKmxwY19jdHggPSBzY19scGNf YXRhLT5jaGFubmVsLT52bV9jdHg7CisKKwl2bV9pc2FfcHVsc2VfaXJxKGxwY19jdHgsIHNjX2xw Y19hdGEtPmlycSwgc2NfbHBjX2F0YS0+aXJxKTsKKworCXJldHVybjsKK30KKworc3RhdGljIHZv aWQKK2xwY19hdGFfaW50cl9kZWFzc2VydCh2b2lkICphcmcpCit7CisJLyoKKwkgKiBUaGUgQVRB IGRldmljZXMgb24gdGhlIExQQyBidXMgZ2VuZXJhdGUgZWRnZSB0cmlnZ2VyZWQgaW50ZXJydXB0 cworCSAqIHNvIG5vdGhpbmcgbW9yZSB0byBkbyBoZXJlCisJICovCisKKwlyZXR1cm47Cit9CisK K2ludAorbHBjX2F0YV9pbml0KHN0cnVjdCB2bWN0eCAqY3R4LCBjb25zdCBjaGFyICpvcHRzKQor eworCXN0cnVjdCBhdGFfY2hhbm5lbCAqY2hhbm5lbCA9IE5VTEw7CisJc3RydWN0IGlub3V0X3Bv cnQgaW9wLCBpb2N0bHA7CisJaW50IGNoX2F0YSA9IC0xOworCWludCBlcnI7CisKKwlhdGFfb3Bl bl9kYmdfZmlsZSgpOworCisJYXNzZXJ0KG9wdHNbMF0gPT0gJzAnIHx8IG9wdHNbMF0gPT0gJzEn KTsKKwljaF9hdGEgPSBvcHRzWzBdIC0gJzAnOworCisJaWYgKGxwY19hdGFfc2NbY2hfYXRhXS5j aGFubmVsKSB7CisJCWRwcmludChMT0dfRVJSLCAibHBjX2F0YV9pbml0OiB0aGUgTFBDIGF0YSVk IGlzIGluaXRpYWxpemVkXG4iLCBjaF9hdGEpOworCQlyZXR1cm4gLTE7CisJfQorCisJY2hhbm5l bCA9IGF0YV9pbml0KGN0eCwgbHBjX2F0YV9pbnRyX2Fzc2VydCwgbHBjX2F0YV9pbnRyX2RlYXNz ZXJ0LCAmbHBjX2F0YV9zY1tjaF9hdGFdLCBvcHRzLCAxKTsKKwlpZiAoIWNoYW5uZWwpCisJCXJl dHVybiAtMTsKKworCWFzc2VydChjaF9hdGEgPT0gY2hhbm5lbC0+aW50ZXJmYWNlKTsKKwljaGFu bmVsLT51c2VfMTZiaXQgPSAxOworCisJbHBjX2F0YV9zY1tjaF9hdGFdLmNoYW5uZWwgPSBjaGFu bmVsOworCisJYnplcm8oJmlvcCwgc2l6ZW9mKHN0cnVjdCBpbm91dF9wb3J0KSk7CisJaW9wLm5h bWUgPSBscGNfYXRhX3NjW2NoX2F0YV0ubmFtZV9pbzsKKwlpb3AucG9ydCA9IGxwY19hdGFfc2Nb Y2hfYXRhXS5iYXNlX2FkZHJfaW87CisJaW9wLnNpemUgPSBBVEFfSU9TSVpFOworCWlvcC5mbGFn cyA9IElPUE9SVF9GX0lOT1VUOworCWlvcC5oYW5kbGVyID0gbHBjX2F0YV9pb19oYW5kbGVyOwor CWlvcC5hcmcgPSAmbHBjX2F0YV9zY1tjaF9hdGFdOworCisJZXJyID0gcmVnaXN0ZXJfaW5vdXQo JmlvcCk7CisJYXNzZXJ0KGVyciA9PSAwKTsKKworCWJ6ZXJvKCZpb2N0bHAsIHNpemVvZihzdHJ1 Y3QgaW5vdXRfcG9ydCkpOworCWlvY3RscC5uYW1lID0gbHBjX2F0YV9zY1tjaF9hdGFdLm5hbWVf aW9jdGw7CisJaW9jdGxwLnBvcnQgPSBscGNfYXRhX3NjW2NoX2F0YV0uYmFzZV9hZGRyX2lvY3Rs OworCWlvY3RscC5zaXplID0gQVRBX0NUTElPU0laRTsKKwlpb2N0bHAuZmxhZ3MgPSBJT1BPUlRf Rl9JTk9VVDsKKwlpb2N0bHAuaGFuZGxlciA9IGxwY19hdGFfaW9jdGxfaGFuZGxlcjsKKwlpb2N0 bHAuYXJnID0gJmxwY19hdGFfc2NbY2hfYXRhXTsKKworCWVyciA9IHJlZ2lzdGVyX2lub3V0KCZp b2N0bHApOworCWFzc2VydChlcnIgPT0gMCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dAorbHBjX2F0YV9pb19oYW5kbGVyKHN0cnVjdCB2bWN0eCAqY3R4LCBpbnQgdmNwdSwKKwkJICAg aW50IGluLCBpbnQgcG9ydCwgaW50IGJ5dGVzLCB1aW50MzJfdCAqZWF4LCB2b2lkICphcmcpCit7 CisJc3RydWN0IGxwY19hdGFfc29mdGMgKmxwY19zYyA9IChzdHJ1Y3QgbHBjX2F0YV9zb2Z0YyAq KWFyZzsKKwlzdHJ1Y3QgYXRhX2NoYW5uZWwgKmNoYW5uZWwgPSBOVUxMOworCXVpbnQ4X3Qgb2Zm c2V0ID0gMDsKKworCWFzc2VydChscGNfc2MpOworCWNoYW5uZWwgPSBscGNfc2MtPmNoYW5uZWw7 CisJYXNzZXJ0KGNoYW5uZWwpOworCisJb2Zmc2V0ID0gcG9ydCAtIGxwY19zYy0+YmFzZV9hZGRy X2lvOworCWFzc2VydChvZmZzZXQgPCBBVEFfSU9TSVpFKTsKKworCWlmIChpbikKKwkJKmVheCA9 IGF0YV9jb21tYW5kX2Jsb2NrX3JlYWQoY2hhbm5lbCwgb2Zmc2V0KTsKKwllbHNlCisJCWF0YV9j b21tYW5kX2Jsb2NrX3dyaXRlKGNoYW5uZWwsIG9mZnNldCwgYnl0ZXMsICplYXgpOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2xwY19hdGFfaW9jdGxfaGFuZGxlcihzdHJ1Y3Qgdm1j dHggKmN0eCwgaW50IHZjcHUsCisJCSAgIGludCBpbiwgaW50IHBvcnQsIGludCBieXRlcywgdWlu dDMyX3QgKmVheCwgdm9pZCAqYXJnKQoreworCXN0cnVjdCBscGNfYXRhX3NvZnRjICpscGNfc2Mg PSAoc3RydWN0IGxwY19hdGFfc29mdGMgKilhcmc7CisJc3RydWN0IGF0YV9jaGFubmVsICpjaGFu bmVsID0gTlVMTDsKKwl1aW50OF90IG9mZnNldCA9IDA7CisKKwlhc3NlcnQobHBjX3NjKTsKKwlj aGFubmVsID0gbHBjX3NjLT5jaGFubmVsOworCWFzc2VydChjaGFubmVsKTsKKworCW9mZnNldCA9 IHBvcnQgLSBscGNfc2MtPmJhc2VfYWRkcl9pb2N0bDsKKwlhc3NlcnQob2Zmc2V0IDwgQVRBX0NU TElPU0laRSk7CisKKwlpZiAoaW4pCisJCSplYXggPSBhdGFfYWx0c3RhdHVzX3JlYWQoY2hhbm5l bCk7CisJZWxzZQorCQlhdGFfY29udHJvbF93cml0ZShjaGFubmVsLCBieXRlcywgKmVheCk7CisK KwlyZXR1cm4gMDsKK30KKwoK --b1_370e5c04a721b87eab23b165702327c0--