Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757234AbXFZM5u (ORCPT ); Tue, 26 Jun 2007 08:57:50 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1752236AbXFZM5n (ORCPT ); Tue, 26 Jun 2007 08:57:43 -0400 Received: from wa-out-1112.google.com ([209.85.146.183]:14920 "EHLO wa-out-1112.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752193AbXFZM5l (ORCPT ); Tue, 26 Jun 2007 08:57:41 -0400 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=beta; h=received:message-id:date:from:to:subject:cc:mime-version:content-type; b=A9XMrlWr4E6SJy7iDnp3Pr3mhii2WpBKuc7tCVSBPFhWZI1wYHTDdOORCad1O0qkBZOqCBXtouw+r9yURXBUZLSwn4uB4rhyz2qUZNKRtTVimNGHRq85yqln1wMBA7exgx1smDEACIYS33YnvGlPMBMWAu0GzCvAJ2QShvqsJOg= Message-ID: <5d5443650706260557v2ed41444g8cc8e63ca1d2a605@mail.gmail.com> Date: Tue, 26 Jun 2007 18:27:40 +0530 From: "Trilok Soni" To: linux-fbdev-devel@lists.sourceforge.net, adaplas@gmail.com, akpm@linux-foundation.org Subject: [PATCH 08/17] OMAP: Add external Epson Blizzard LCD controller support Cc: "Tony Lindgren" , imre.deak@solidboot.com, juha.yrjola@solidboot.com, linux-kernel@vger.kernel.org MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_17649_32930072.1182862660335" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 61255 Lines: 807 ------=_Part_17649_32930072.1182862660335 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline -- --Trilok Soni ------=_Part_17649_32930072.1182862660335 Content-Type: text/x-patch; name=0008-OMAP-Add-external-Epson-Blizzard-LCD-controller-support.patch; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_f3eduxmc Content-Disposition: attachment; filename="0008-OMAP-Add-external-Epson-Blizzard-LCD-controller-support.patch" RnJvbSA0YWJhMGEzYzYyMTZmODNhNjIxYTkwYzAyMTlkNmE3MDdkMjA1NDllIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBJbXJlIERlYWsgPGltcmUuZGVha0Bzb2xpZGJvb3QuY29tPgpE YXRlOiBTYXQsIDI2IE1heSAyMDA3IDE5OjE5OjE5ICswNTMwClN1YmplY3Q6IFtQQVRDSCAwOC8x N10gT01BUDogQWRkIGV4dGVybmFsIEVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyIHN1cHBv cnQKCi0gQWRkcyBFcHNvbiBCbGl6emFyZCBsY2QgY29udHJvbGxlciBkcml2ZXI7IHVzZWQgaW4K ICBOb2tpYSBJbnRlcm5ldCBUYWJsZXQgcHJvZHVjdHMuCgpTaWduZWQtb2ZmLWJ5OiBUcmlsb2sg U29uaSA8c29uaS50cmlsb2tAZ21haWwuY29tPgotLS0KIGRyaXZlcnMvdmlkZW8vb21hcC9LY29u ZmlnICAgIHwgICAgNiArCiBkcml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUgICB8ICAgIDEgKwog ZHJpdmVycy92aWRlby9vbWFwL2JsaXp6YXJkLmMgfCAxNTY4ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDE1NzUgaW5zZXJ0aW9ucygr KSwgMCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3ZpZGVvL29tYXAv YmxpenphcmQuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vb21hcC9LY29uZmlnIGIvZHJp dmVycy92aWRlby9vbWFwL0tjb25maWcKaW5kZXggM2QzNmU2Mi4uN2Y0ZDI1YiAxMDA2NDQKLS0t IGEvZHJpdmVycy92aWRlby9vbWFwL0tjb25maWcKKysrIGIvZHJpdmVycy92aWRlby9vbWFwL0tj b25maWcKQEAgLTUwLDMgKzUwLDkgQEAgY29uZmlnIEZCX09NQVBfTENEQ19IV0E3NDIKIAkgIFNh eSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgZXh0ZXJuYWwKIAkg IEVwc29uIEhXQTc0MiBMQ0QgY29udHJvbGxlci4KIAorY29uZmlnIEZCX09NQVBfTENEQ19CTEla WkFSRAorCWJvb2wgIkVwc29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyIHN1cHBvcnQiCisJZGVw ZW5kcyBvbiBGQl9PTUFQICYmIEZCX09NQVBfTENEQ19FWFRFUk5BTAorCWhlbHAKKwkgIFNheSBZ IGhlcmUgaWYgeW91IHdhbnQgdG8gaGF2ZSBzdXBwb3J0IGZvciB0aGUgZXh0ZXJuYWwKKwkgIEVw c29uIEJsaXp6YXJkIExDRCBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvZHJpdmVycy92aWRlby9v bWFwL01ha2VmaWxlIGIvZHJpdmVycy92aWRlby9vbWFwL01ha2VmaWxlCmluZGV4IGQxY2M0NzAu LjQxNjEwNTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vb21hcC9NYWtlZmlsZQorKysgYi9k cml2ZXJzL3ZpZGVvL29tYXAvTWFrZWZpbGUKQEAgLTEzLDYgKzEzLDcgQEAgb2Jqcy0kKENPTkZJ R19BUkNIX09NQVAxKSQoQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCkgKz0gc29zc2kubwog b2Jqcy0kKENPTkZJR19BUkNIX09NQVAyKSQoQ09ORklHX0ZCX09NQVBfTENEQ19FWFRFUk5BTCkg Kz0gcmZiaS5vCiAKIG9ianMteSQoQ09ORklHX0ZCX09NQVBfTENEQ19IV0E3NDIpICs9IGh3YTc0 Mi5vCitvYmpzLXkkKENPTkZJR19GQl9PTUFQX0xDRENfQkxJWlpBUkQpICs9IGJsaXp6YXJkLm8K IAogb21hcGZiLW9ianMgOj0gJChvYmpzLXl5KQogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVv L29tYXAvYmxpenphcmQuYyBiL2RyaXZlcnMvdmlkZW8vb21hcC9ibGl6emFyZC5jCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODI5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL3ZpZGVvL29tYXAvYmxpenphcmQuYwpAQCAtMCwwICsxLDE1NjggQEAKKy8qCisgKiBF cHNvbiBCbGl6emFyZCBMQ0QgY29udHJvbGxlciBkcml2ZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMp IDIwMDQtMjAwNSBOb2tpYSBDb3Jwb3JhdGlvbgorICogQXV0aG9yczogICAgIEp1aGEgWXJqb2xh ICAgPGp1aGEueXJqb2xhQG5va2lhLmNvbT4KKyAqCSAgICAgICAgSW1yZSBEZWFrICAgICA8aW1y ZS5kZWFrQG5va2lhLmNvbT4KKyAqIFlVViBzdXBwb3J0OiBKdXNzaSBMYWFrbyAgIDxqdXNzaS5s YWFrb0Bub2tpYS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAqIHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQor ICogRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNl bnNlLCBvciAoYXQgeW91cgorICogb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwgYnV0CisgKiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg b2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJv Z3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu LAorICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3 LCBVU0EuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9t bS5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNp bmNsdWRlIDxsaW51eC9jbGsuaD4KKworI2luY2x1ZGUgPGFzbS9hcmNoL2RtYS5oPgorI2luY2x1 ZGUgPGFzbS9hcmNoL29tYXBmYi5oPgorI2luY2x1ZGUgPGFzbS9hcmNoL2JsaXp6YXJkLmg+CisK KyNpbmNsdWRlICJkaXNwYy5oIgorCisjZGVmaW5lIE1PRFVMRV9OQU1FCQkJCSJibGl6emFyZCIK KworI2RlZmluZSBCTElaWkFSRF9SRVZfQ09ERQkJCTB4MDAKKyNkZWZpbmUgQkxJWlpBUkRfQ09O RklHCQkJCTB4MDIKKyNkZWZpbmUgQkxJWlpBUkRfUExMX0RJVgkJCTB4MDQKKyNkZWZpbmUgQkxJ WlpBUkRfUExMX0xPQ0tfUkFOR0UJCQkweDA2CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19T WU5USF8wCQkweDA4CisjZGVmaW5lIEJMSVpaQVJEX1BMTF9DTE9DS19TWU5USF8xCQkweDBhCisj ZGVmaW5lIEJMSVpaQVJEX1BMTF9NT0RFCQkJMHgwYworI2RlZmluZSBCTElaWkFSRF9DTEtfU1JD CQkJMHgwZQorI2RlZmluZSBCTElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUJCTB4MTAKKyNkZWZp bmUgQkxJWlpBUkRfTUVNX0JBTkswX1NUQVRVUwkJMHgxNAorI2RlZmluZSBCTElaWkFSRF9IRElT UAkJCQkweDJhCisjZGVmaW5lIEJMSVpaQVJEX0hORFAJCQkJMHgyYworI2RlZmluZSBCTElaWkFS RF9WRElTUDAJCQkJMHgyZQorI2RlZmluZSBCTElaWkFSRF9WRElTUDEJCQkJMHgzMAorI2RlZmlu ZSBCTElaWkFSRF9WTkRQCQkJCTB4MzIKKyNkZWZpbmUgQkxJWlpBUkRfSFNXCQkJCTB4MzQKKyNk ZWZpbmUgQkxJWlpBUkRfVlNXCQkJCTB4MzgKKyNkZWZpbmUgQkxJWlpBUkRfRElTUExBWV9NT0RF CQkJMHg2OAorI2RlZmluZSBCTElaWkFSRF9JTlBVVF9XSU5fWF9TVEFSVF8wCQkweDZjCisjZGVm aW5lIEJMSVpaQVJEX0RBVEFfU09VUkNFX1NFTEVDVAkJMHg4ZQorI2RlZmluZSBCTElaWkFSRF9E SVNQX01FTV9EQVRBX1BPUlQJCTB4OTAKKyNkZWZpbmUgQkxJWlpBUkRfRElTUF9NRU1fUkVBRF9B RERSMAkJMHg5MgorI2RlZmluZSBCTElaWkFSRF9QT1dFUl9TQVZFCQkJMHhFNgorI2RlZmluZSBC TElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUwkJMHhFOAorCisvKiBEYXRhIHNvdXJjZSBzZWxlY3Qg Ki8KKy8qIEZvciBTMUQxMzc0NSAqLworI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0JB Q0tHUk9VTkQJMHgwMAorI2RlZmluZSBCTElaWkFSRF9TUkNfV1JJVEVfTENEX0RFU1RSVUNUSVZF CTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfU1JDX1dSSVRFX09WRVJMQVlfRU5BQkxFCTB4MDQKKyNk ZWZpbmUgQkxJWlpBUkRfU1JDX0RJU0FCTEVfT1ZFUkxBWQkJMHgwNQorLyogRm9yIFMxRDEzNzQ0 ICovCisjZGVmaW5lIEJMSVpaQVJEX1NSQ19XUklURV9MQ0QJCQkweDAwCisjZGVmaW5lIEJMSVpa QVJEX1NSQ19CTFRfTENECQkJMHgwNgorCisjZGVmaW5lIEJMSVpaQVJEX0NPTE9SX1JHQjU2NQkJ CTB4MDEKKyNkZWZpbmUgQkxJWlpBUkRfQ09MT1JfWVVWNDIwCQkJMHgwOQorCisjZGVmaW5lIEJM SVpaQVJEX1ZFUlNJT05fUzFEMTM3NDUJCTB4MDEJLyogSGFpbHN0b3JtICovCisjZGVmaW5lIEJM SVpaQVJEX1ZFUlNJT05fUzFEMTM3NDQJCTB4MDIJLyogQmxpenphcmQgKi8KKworI2RlZmluZSBC TElaWkFSRF9BVVRPX1VQREFURV9USU1FCQkoSFogLyAyMCkKKworLyogUmVzZXJ2ZSA0IHJlcXVl c3Qgc2xvdHMgZm9yIHJlcXVlc3RzIGluIGlycSBjb250ZXh0ICovCisjZGVmaW5lIFJFUV9QT09M X1NJWkUJCQkyNAorI2RlZmluZSBJUlFfUkVRX1BPT0xfU0laRQkJNAorCisjZGVmaW5lIFJFUV9G Uk9NX0lSUV9QT09MIDB4MDEKKworI2RlZmluZSBSRVFfQ09NUExFVEUJMAorI2RlZmluZSBSRVFf UEVORElORwkxCisKK3N0cnVjdCBibGl6emFyZF9yZWdfbGlzdCB7CisJaW50CXN0YXJ0OworCWlu dAllbmQ7Cit9OworCisvKiBUaGVzZSBuZWVkIHRvIGJlIHNhdmVkIC8gcmVzdG9yZWQgc2VwYXJh dGVseSBmcm9tIHRoZSByZXN0LiAqLworc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBi bGl6emFyZF9wbGxfcmVnc1tdID0geworCXsKKwkJLnN0YXJ0CT0gMHgwNCwJCS8qIERvbid0IHNh dmUgUExMIGN0cmwgKDB4MEMpICovCisJCS5lbmQJPSAweDBhLAorCX0sCisJeworCQkuc3RhcnQJ PSAweDBlLAkJLyogQ2xvY2sgY29uZmlndXJhdGlvbiAqLworCQkuZW5kCT0gMHgwZSwKKwl9LAor fTsKKworc3RhdGljIHN0cnVjdCBibGl6emFyZF9yZWdfbGlzdCBibGl6emFyZF9nZW5fcmVnc1td ID0geworCXsKKwkJLnN0YXJ0CT0gMHgxOCwJCS8qIFNEUkFNIGNvbnRyb2wgKi8KKwkJLmVuZAk9 IDB4MjAsCisJfSwKKwl7CisJCS5zdGFydAk9IDB4MjgsCQkvKiBMQ0QgUGFuZWwgY29uZmlndXJh dGlvbiAqLworCQkuZW5kCT0gMHg1YSwJCS8qIEhTU0kgaW50ZXJmYWNlLCBUViBjb25maWd1cmF0 aW9uICovCisJfSwKK307CisKK3N0YXRpYyB1OCBibGl6emFyZF9yZWdfY2FjaGVbMHg1YSAvIDJd OworCitzdHJ1Y3QgdXBkYXRlX3BhcmFtIHsKKwlpbnQJcGxhbmU7CisJaW50CXgsIHksIHdpZHRo LCBoZWlnaHQ7CisJaW50CW91dF94LCBvdXRfeTsKKwlpbnQJb3V0X3dpZHRoLCBvdXRfaGVpZ2h0 OworCWludAljb2xvcl9tb2RlOworCWludAlicHA7CisJaW50CWZsYWdzOworfTsKKworc3RydWN0 IGJsaXp6YXJkX3JlcXVlc3QgeworCXN0cnVjdCBsaXN0X2hlYWQgZW50cnk7CisJdW5zaWduZWQg aW50CSBmbGFnczsKKworCWludAkJICgqaGFuZGxlcikoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3Qg KnJlcSk7CisJdm9pZAkJICgqY29tcGxldGUpKHZvaWQgKmRhdGEpOworCXZvaWQJCSAqY29tcGxl dGVfZGF0YTsKKworCXVuaW9uIHsKKwkJc3RydWN0IHVwZGF0ZV9wYXJhbQl1cGRhdGU7CisJCXN0 cnVjdCBjb21wbGV0aW9uCSpzeW5jOworCX0gcGFyOworfTsKKworc3RydWN0IHBsYW5lX2luZm8g eworCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWludCBwb3NfeCwgcG9zX3k7CisJaW50IHdpZHRo LCBoZWlnaHQ7CisJaW50IG91dF93aWR0aCwgb3V0X2hlaWdodDsKKwlpbnQgc2NyX3dpZHRoOwor CWludCBjb2xvcl9tb2RlOworCWludCBicHA7Cit9OworCitzdHJ1Y3QgYmxpenphcmRfc3RydWN0 IHsKKwllbnVtIG9tYXBmYl91cGRhdGVfbW9kZQl1cGRhdGVfbW9kZTsKKwllbnVtIG9tYXBmYl91 cGRhdGVfbW9kZQl1cGRhdGVfbW9kZV9iZWZvcmVfc3VzcGVuZDsKKworCXN0cnVjdCB0aW1lcl9s aXN0CWF1dG9fdXBkYXRlX3RpbWVyOworCWludAkJCXN0b3BfYXV0b191cGRhdGU7CisJc3RydWN0 IG9tYXBmYl91cGRhdGVfd2luZG93CWF1dG9fdXBkYXRlX3dpbmRvdzsKKwlpbnQJCQllbmFibGVk X3BsYW5lczsKKwlpbnQJCQl2aWRfbm9uc3RkX2NvbG9yOworCWludAkJCXZpZF9zY2FsZWQ7CisJ aW50CQkJbGFzdF9jb2xvcl9tb2RlOworCWludAkJCXpvb21fb247CisJaW50CQkJc2NyZWVuX3dp ZHRoOworCWludAkJCXNjcmVlbl9oZWlnaHQ7CisJdW5zaWduZWQJCXRlX2Nvbm5lY3RlZDoxOwor CXVuc2lnbmVkCQl2c3luY19vbmx5OjE7CisKKwlzdHJ1Y3QgcGxhbmVfaW5mbwlwbGFuZVtPTUFQ RkJfUExBTkVfTlVNXTsKKworCXN0cnVjdCBibGl6emFyZF9yZXF1ZXN0CXJlcV9wb29sW1JFUV9Q T09MX1NJWkVdOworCXN0cnVjdCBsaXN0X2hlYWQJcGVuZGluZ19yZXFfbGlzdDsKKwlzdHJ1Y3Qg bGlzdF9oZWFkCWZyZWVfcmVxX2xpc3Q7CisJc3RydWN0IHNlbWFwaG9yZQlyZXFfc2VtYTsKKwlz cGlubG9ja190CQlyZXFfbG9jazsKKworCXVuc2lnbmVkIGxvbmcJCXN5c19ja19yYXRlOworCXN0 cnVjdCBleHRpZl90aW1pbmdzCXJlZ190aW1pbmdzLCBsdXRfdGltaW5nczsKKworCXUzMgkJCW1h eF90cmFuc21pdF9zaXplOworCXUzMgkJCWV4dGlmX2Nsa19wZXJpb2Q7CisJaW50CQkJZXh0aWZf Y2xrX2RpdjsKKwl1bnNpZ25lZCBsb25nCQlwaXhfdHhfdGltZTsKKwl1bnNpZ25lZCBsb25nCQls aW5lX3VwZF90aW1lOworCisJc3RydWN0IG9tYXBmYl9kZXZpY2UJKmZiZGV2OworCXN0cnVjdCBs Y2RfY3RybF9leHRpZgkqZXh0aWY7CisJc3RydWN0IGxjZF9jdHJsCQkqaW50X2N0cmw7CisKKwl2 b2lkCQkJKCpwb3dlcl91cCkoc3RydWN0IGRldmljZSAqZGV2KTsKKwl2b2lkCQkJKCpwb3dlcl9k b3duKShzdHJ1Y3QgZGV2aWNlICpkZXYpOworCisJaW50CQkJdmVyc2lvbjsKK30gYmxpenphcmQ7 CisKK3N0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsOworCitzdGF0aWMgdTggYmxpenphcmRf cmVhZF9yZWcodTggcmVnKQoreworCXU4IGRhdGE7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2Jp dHNfcGVyX2N5Y2xlKDgpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9jb21tYW5kKCZyZWcsIDEp OworCWJsaXp6YXJkLmV4dGlmLT5yZWFkX2RhdGEoJmRhdGEsIDEpOworCisJcmV0dXJuIGRhdGE7 Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3dyaXRlX3JlZyh1OCByZWcsIHU4IHZhbCkKK3sK KwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xlKDgpOworCWJsaXp6YXJkLmV4dGlm LT53cml0ZV9jb21tYW5kKCZyZWcsIDEpOworCWJsaXp6YXJkLmV4dGlmLT53cml0ZV9kYXRhKCZ2 YWwsIDEpOworfQorCitzdGF0aWMgdm9pZCBibGl6emFyZF9yZXN0YXJ0X3NkcmFtKHZvaWQpCit7 CisJdW5zaWduZWQgbG9uZyB0bW87CisKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfTUVN X0JBTkswX0FDVElWQVRFLCAwKTsKKwl1ZGVsYXkoNTApOworCWJsaXp6YXJkX3dyaXRlX3JlZyhC TElaWkFSRF9NRU1fQkFOSzBfQUNUSVZBVEUsIDEpOworCXRtbyA9IGppZmZpZXMgKyBtc2Vjc190 b19qaWZmaWVzKDIwMCk7CisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfTUVN X0JBTkswX1NUQVRVUykgJiAweDAxKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8p KSB7CisJCQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJCSJzMWQxMzc0eDogU0RS QU0gbm90IHJlYWR5Iik7CisJCQlicmVhazsKKwkJfQorCQltc2xlZXAoMSk7CisJfQorfQorCitz dGF0aWMgdm9pZCBibGl6emFyZF9zdG9wX3NkcmFtKHZvaWQpCit7CisJYmxpenphcmRfd3JpdGVf cmVnKEJMSVpaQVJEX01FTV9CQU5LMF9BQ1RJVkFURSwgMCk7Cit9CisKKy8qIFdhaXQgdW50aWwg dGhlIGxhc3Qgd2luZG93IHdhcyBjb21wbGV0ZWx5IHdyaXR0ZW4gaW50byB0aGUgY29udHJvbGxl cnMKKyAqIFNEUkFNIGFuZCB3ZSBjYW4gc3RhcnQgdHJhbnNmZXJyaW5nIHRoZSBuZXh0IHdpbmRv dy4KKyAqLworc3RhdGljIHZvaWQgYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcih2b2lkKQorewor CXVuc2lnbmVkIGxvbmcgdG1vID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMzApOworCisJ d2hpbGUgKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX05ESVNQX0NUUkxfU1RBVFVTKSAmICgx IDw8IDcpKSB7CisJCWlmICh0aW1lX2FmdGVyKGppZmZpZXMsIHRtbykpIHsKKwkJCWlmIChwcmlu dGtfcmF0ZWxpbWl0KCkpCisJCQkJZGV2X2VycihibGl6emFyZC5mYmRldi0+ZGV2LAorCQkJCQki czFkMTM3NHg6IGxpbmUgYnVmZmVyIG5vdCByZWFkeVxuIik7CisJCQlicmVhazsKKwkJfQorCX0K K30KKworLyogV2FpdCB1bnRpbCB0aGUgWVlDIGNvbG9yIHNwYWNlIGNvbnZlcnRlciBpcyBpZGxl LiAqLworc3RhdGljIHZvaWQgYmxpenphcmRfd2FpdF95eWModm9pZCkKK3sKKwl1bnNpZ25lZCBs b25nIHRtbyA9IGppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKDMwKTsKKworCXdoaWxlIChibGl6 emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUykgJiAoMSA8PCA0KSkgewor CQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJCQlpZiAocHJpbnRrX3JhdGVsaW1p dCgpKQorCQkJCWRldl9lcnIoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJCQkJInMxZDEzNzR4OiBZ WUMgbm90IHJlYWR5XG4iKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBk aXNhYmxlX292ZXJsYXkodm9pZCkKK3sKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfREFU QV9TT1VSQ0VfU0VMRUNULAorCQkJCUJMSVpaQVJEX1NSQ19ESVNBQkxFX09WRVJMQVkpOworfQor CitzdGF0aWMgdm9pZCBzZXRfd2luZG93X3JlZ3MoaW50IHhfc3RhcnQsIGludCB5X3N0YXJ0LCBp bnQgeF9lbmQsIGludCB5X2VuZCwKKwkJCSAgICBpbnQgeF9vdXRfc3RhcnQsIGludCB5X291dF9z dGFydCwKKwkJCSAgICBpbnQgeF9vdXRfZW5kLCBpbnQgeV9vdXRfZW5kLCBpbnQgY29sb3JfbW9k ZSwKKwkJCSAgICBpbnQgem9vbV9vZmYsIGludCBmbGFncykKK3sKKwl1OCB0bXBbMThdOworCXU4 IGNtZDsKKworCXhfZW5kLS07CisJeV9lbmQtLTsKKwl0bXBbMF0gPSB4X3N0YXJ0OworCXRtcFsx XSA9IHhfc3RhcnQgPj4gODsKKwl0bXBbMl0gPSB5X3N0YXJ0OworCXRtcFszXSA9IHlfc3RhcnQg Pj4gODsKKwl0bXBbNF0gPSB4X2VuZDsKKwl0bXBbNV0gPSB4X2VuZCA+PiA4OworCXRtcFs2XSA9 IHlfZW5kOworCXRtcFs3XSA9IHlfZW5kID4+IDg7CisKKwl4X291dF9lbmQtLTsKKwl5X291dF9l bmQtLTsKKwl0bXBbOF0gID0geF9vdXRfc3RhcnQ7CisJdG1wWzldICA9IHhfb3V0X3N0YXJ0ID4+ IDg7CisJdG1wWzEwXSA9IHlfb3V0X3N0YXJ0OworCXRtcFsxMV0gPSB5X291dF9zdGFydCA+PiA4 OworCXRtcFsxMl0gPSB4X291dF9lbmQ7CisJdG1wWzEzXSA9IHhfb3V0X2VuZCA+PiA4OworCXRt cFsxNF0gPSB5X291dF9lbmQ7CisJdG1wWzE1XSA9IHlfb3V0X2VuZCA+PiA4OworCisJdG1wWzE2 XSA9IGNvbG9yX21vZGU7CisJaWYgKHpvb21fb2ZmICYmIGJsaXp6YXJkLnZlcnNpb24gPT0gQkxJ WlpBUkRfVkVSU0lPTl9TMUQxMzc0NSkKKwkJdG1wWzE3XSA9IEJMSVpaQVJEX1NSQ19XUklURV9M Q0RfQkFDS0dST1VORDsKKwllbHNlIGlmIChmbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19FTkFC TEVfT1ZFUkxBWSkKKwkJdG1wWzE3XSA9IEJMSVpaQVJEX1NSQ19XUklURV9PVkVSTEFZX0VOQUJM RTsKKwllbHNlCisJCXRtcFsxN10gPSBibGl6emFyZC52ZXJzaW9uID09IEJMSVpaQVJEX1ZFUlNJ T05fUzFEMTM3NDQgPworCQkJCUJMSVpaQVJEX1NSQ19XUklURV9MQ0QgOgorCQkJCUJMSVpaQVJE X1NSQ19XUklURV9MQ0RfREVTVFJVQ1RJVkU7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNf cGVyX2N5Y2xlKDgpOworCWNtZCA9IEJMSVpaQVJEX0lOUFVUX1dJTl9YX1NUQVJUXzA7CisJYmxp enphcmQuZXh0aWYtPndyaXRlX2NvbW1hbmQoJmNtZCwgMSk7CisJYmxpenphcmQuZXh0aWYtPndy aXRlX2RhdGEodG1wLCAxOCk7Cit9CisKK3N0YXRpYyB2b2lkIGVuYWJsZV90ZWFyc3luYyhpbnQg eSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc2NyZWVuX2hlaWdodCwKKwkJCSAgICBpbnQg b3V0X2hlaWdodCwgaW50IGZvcmNlX3ZzeW5jKQoreworCXU4IGI7CisKKwliID0gYmxpenphcmRf cmVhZF9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMpOworCWIgfD0gMSA8PCAzOworCWJs aXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUywgYik7CisKKwlpZiAo bGlrZWx5KGJsaXp6YXJkLnZzeW5jX29ubHkgfHwgZm9yY2VfdnN5bmMpKSB7CisJCWJsaXp6YXJk LmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAod2lk dGggKiBibGl6emFyZC5waXhfdHhfdGltZSA8IGJsaXp6YXJkLmxpbmVfdXBkX3RpbWUpIHsKKwkJ YmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0KKwor CWlmICgod2lkdGggKiBibGl6emFyZC5waXhfdHhfdGltZSAvIDEwMDApICogaGVpZ2h0IDwKKwkg ICAgKHkgKyBvdXRfaGVpZ2h0KSAqIChibGl6emFyZC5saW5lX3VwZF90aW1lIC8gMTAwMCkpIHsK KwkJYmxpenphcmQuZXh0aWYtPmVuYWJsZV90ZWFyc3luYygxLCAwKTsKKwkJcmV0dXJuOworCX0K KworCWJsaXp6YXJkLmV4dGlmLT5lbmFibGVfdGVhcnN5bmMoMSwgeSArIDEpOworfQorCitzdGF0 aWMgdm9pZCBkaXNhYmxlX3RlYXJzeW5jKHZvaWQpCit7CisJdTggYjsKKworCWJsaXp6YXJkLmV4 dGlmLT5lbmFibGVfdGVhcnN5bmMoMCwgMCk7CisJYiA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpa QVJEX05ESVNQX0NUUkxfU1RBVFVTKTsKKwliICY9IH4oMSA8PCAzKTsKKwlibGl6emFyZF93cml0 ZV9yZWcoQkxJWlpBUkRfTkRJU1BfQ1RSTF9TVEFUVVMsIGIpOworCWIgPSBibGl6emFyZF9yZWFk X3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCBzZXRfZXh0aWZfdGltaW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCk7CisKK3N0 YXRpYyBpbmxpbmUgc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmFsbG9jX3JlcSh2b2lkKQorewor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcTsKKwlp bnQgcmVxX2ZsYWdzID0gMDsKKworCWlmICghaW5faW50ZXJydXB0KCkpCisJCWRvd24oJmJsaXp6 YXJkLnJlcV9zZW1hKTsKKwllbHNlCisJCXJlcV9mbGFncyA9IFJFUV9GUk9NX0lSUV9QT09MOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFncyk7CisJQlVHX09O KGxpc3RfZW1wdHkoJmJsaXp6YXJkLmZyZWVfcmVxX2xpc3QpKTsKKwlyZXEgPSBsaXN0X2VudHJ5 KGJsaXp6YXJkLmZyZWVfcmVxX2xpc3QubmV4dCwKKwkJCSBzdHJ1Y3QgYmxpenphcmRfcmVxdWVz dCwgZW50cnkpOworCWxpc3RfZGVsKCZyZXEtPmVudHJ5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3MpOworCisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+ ZW50cnkpOworCXJlcS0+ZmxhZ3MgPSByZXFfZmxhZ3M7CisKKwlyZXR1cm4gcmVxOworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgZnJlZV9yZXEoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkK K3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmJsaXp6YXJk LnJlcV9sb2NrLCBmbGFncyk7CisKKwlsaXN0X2RlbCgmcmVxLT5lbnRyeSk7CisJbGlzdF9hZGQo JnJlcS0+ZW50cnksICZibGl6emFyZC5mcmVlX3JlcV9saXN0KTsKKwlpZiAoIShyZXEtPmZsYWdz ICYgUkVRX0ZST01fSVJRX1BPT0wpKQorCQl1cCgmYmxpenphcmQucmVxX3NlbWEpOworCisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmYmxpenphcmQucmVxX2xvY2ssIGZsYWdzKTsKK30KKworc3Rh dGljIHZvaWQgcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKHZvaWQpCit7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3Mp OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZibGl6emFyZC5wZW5kaW5nX3JlcV9saXN0KSkgewor CQlzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCAqcmVxOworCQl2b2lkICgqY29tcGxldGUpKHZvaWQg Kik7CisJCXZvaWQgKmNvbXBsZXRlX2RhdGE7CisKKwkJcmVxID0gbGlzdF9lbnRyeShibGl6emFy ZC5wZW5kaW5nX3JlcV9saXN0Lm5leHQsCisJCQkJIHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0LCBl bnRyeSk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9sb2NrLCBmbGFn cyk7CisKKwkJaWYgKHJlcS0+aGFuZGxlcihyZXEpID09IFJFUV9QRU5ESU5HKQorCQkJcmV0dXJu OworCisJCWNvbXBsZXRlID0gcmVxLT5jb21wbGV0ZTsKKwkJY29tcGxldGVfZGF0YSA9IHJlcS0+ Y29tcGxldGVfZGF0YTsKKwkJZnJlZV9yZXEocmVxKTsKKworCQlpZiAoY29tcGxldGUpCisJCQlj b21wbGV0ZShjb21wbGV0ZV9kYXRhKTsKKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmxpenphcmQu cmVxX2xvY2ssIGZsYWdzKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZibGl6emFy ZC5yZXFfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBzdWJtaXRfcmVxX2xpc3Qoc3Ry dWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBwcm9j ZXNzID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZibGl6emFyZC5yZXFfbG9jaywgZmxhZ3Mp OworCWlmIChsaWtlbHkoIWxpc3RfZW1wdHkoJmJsaXp6YXJkLnBlbmRpbmdfcmVxX2xpc3QpKSkK KwkJcHJvY2VzcyA9IDA7CisJbGlzdF9zcGxpY2VfaW5pdChoZWFkLCBibGl6emFyZC5wZW5kaW5n X3JlcV9saXN0LnByZXYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJsaXp6YXJkLnJlcV9s b2NrLCBmbGFncyk7CisKKwlpZiAocHJvY2VzcykKKwkJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3Rz KCk7Cit9CisKK3N0YXRpYyB2b2lkIHJlcXVlc3RfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlz dHJ1Y3QgYmxpenphcmRfcmVxdWVzdAkqcmVxID0gKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICop ZGF0YTsKKwl2b2lkCQkJKCpjb21wbGV0ZSkodm9pZCAqKTsKKwl2b2lkCQkJKmNvbXBsZXRlX2Rh dGE7CisKKwljb21wbGV0ZSA9IHJlcS0+Y29tcGxldGU7CisJY29tcGxldGVfZGF0YSA9IHJlcS0+ Y29tcGxldGVfZGF0YTsKKworCWZyZWVfcmVxKHJlcSk7CisKKwlpZiAoY29tcGxldGUpCisJCWNv bXBsZXRlKGNvbXBsZXRlX2RhdGEpOworCisJcHJvY2Vzc19wZW5kaW5nX3JlcXVlc3RzKCk7Cit9 CisKKworc3RhdGljIGludCBkb19mdWxsX3NjcmVlbl91cGRhdGUoc3RydWN0IGJsaXp6YXJkX3Jl cXVlc3QgKnJlcSkKK3sKKwlpbnQgaTsKKwlpbnQgZmxhZ3M7CisKKwlmb3IgKGkgPSAwOyBpIDwg MzsgaSsrKSB7CisJCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW2ldOwor CQlpZiAoIShibGl6emFyZC5lbmFibGVkX3BsYW5lcyAmICgxIDw8IGkpKSkgeworCQkJYmxpenph cmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWRl dl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInB3ICVkIHBoICVkXG4iLAorCQkJcC0+d2lkdGgs IHAtPmhlaWdodCk7CisJCWJsaXp6YXJkLmludF9jdHJsLT5zZXR1cF9wbGFuZShpLAorCQkJCU9N QVBGQl9DSEFOTkVMX09VVF9MQ0QsIHAtPm9mZnNldCwKKwkJCQlwLT5zY3Jfd2lkdGgsIHAtPnBv c194LCBwLT5wb3NfeSwKKwkJCQlwLT53aWR0aCwgcC0+aGVpZ2h0LAorCQkJCXAtPmNvbG9yX21v ZGUpOworCQlibGl6emFyZC5pbnRfY3RybC0+ZW5hYmxlX3BsYW5lKGksIDEpOworCX0KKworCWRl dl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgInN3ICVkIHNoICVkXG4iLAorCQlibGl6emFyZC5z Y3JlZW5fd2lkdGgsIGJsaXp6YXJkLnNjcmVlbl9oZWlnaHQpOworCWJsaXp6YXJkX3dhaXRfbGlu ZV9idWZmZXIoKTsKKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAoZmxhZ3Mg JiBPTUFQRkJfRk9STUFUX0ZMQUdfVEVBUlNZTkMpCisJCWVuYWJsZV90ZWFyc3luYygwLCBibGl6 emFyZC5zY3JlZW5fd2lkdGgsCisJCQkJYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCQlibGl6 emFyZC5zY3JlZW5faGVpZ2h0LAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJZmxh Z3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UKKwkJZGlzYWJsZV90 ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKDAsIDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0 aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCTAsIDAsIGJsaXp6YXJkLnNjcmVlbl93aWR0 aCwgYmxpenphcmQuc2NyZWVuX2hlaWdodCwKKwkJCUJMSVpaQVJEX0NPTE9SX1JHQjU2NSwgYmxp enphcmQuem9vbV9vbiwgZmxhZ3MpOworCWJsaXp6YXJkLnpvb21fb24gPSAwOworCisJYmxpenph cmQuZXh0aWYtPnNldF9iaXRzX3Blcl9jeWNsZSgxNik7CisJLyogc2V0X3dpbmRvd19yZWdzIGhh cyBsZWZ0IHRoZSByZWdpc3RlciBpbmRleCBhdCB0aGUgcmlnaHQKKwkgKiBwbGFjZSwgc28gbm8g bmVlZCB0byBzZXQgaXQgaGVyZS4KKwkgKi8KKwlibGl6emFyZC5leHRpZi0+dHJhbnNmZXJfYXJl YShibGl6emFyZC5zY3JlZW5fd2lkdGgsCisJCQkJICAgICAgYmxpenphcmQuc2NyZWVuX2hlaWdo dCwKKwkJCQkgICAgICByZXF1ZXN0X2NvbXBsZXRlLCByZXEpOworCXJldHVybiBSRVFfUEVORElO RzsKK30KKworLyogU2V0dXAgYWxsIHBsYW5lcyB3aXRoIGFuIG92ZXJsYXBwaW5nIGFyZWEgd2l0 aCB0aGUgdXBkYXRlIHdpbmRvdy4gKi8KK3N0YXRpYyBpbnQgZG9fcGFydGlhbF91cGRhdGUoc3Ry dWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSwgaW50IHBsYW5lLAorCQkJICAgICBpbnQgeCwgaW50 IHksIGludCB3LCBpbnQgaCwKKwkJCSAgICAgaW50IHhfb3V0LCBpbnQgeV9vdXQsIGludCB3X291 dCwgaW50IGhfb3V0LAorCQkJICAgICBpbnQgd25kX2NvbG9yX21vZGUsIGludCBicHApCit7CisJ aW50IGk7CisJaW50IGd4MSwgZ3kxLCBneDIsIGd5MjsKKwlpbnQgZ3gxX291dCwgZ3kxX291dCwg Z3gyX291dCwgZ3kyX291dDsKKwlpbnQgY29sb3JfbW9kZTsKKwlpbnQgZmxhZ3M7CisJaW50IHpv b21fb2ZmOworCisJLyogR2xvYmFsIGNvb3JkaW5hdGVzLCByZWxhdGl2ZSB0byBwaXhlbCAwLDAg b2YgdGhlIExDRCAqLworCWd4MSA9IHggKyBibGl6emFyZC5wbGFuZVtwbGFuZV0ucG9zX3g7CisJ Z3kxID0geSArIGJsaXp6YXJkLnBsYW5lW3BsYW5lXS5wb3NfeTsKKwlneDIgPSBneDEgKyB3Owor CWd5MiA9IGd5MSArIGg7CisKKwlmbGFncyA9IHJlcS0+cGFyLnVwZGF0ZS5mbGFnczsKKwlpZiAo ZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRE9VQkxFKSB7CisJCWd4MV9vdXQgPSBneDE7CisJ CWd5MV9vdXQgPSBneTE7CisJCWd4Ml9vdXQgPSBneDEgKyB3ICogMjsKKwkJZ3kyX291dCA9IGd5 MSArIGggKiAyOworCX0gZWxzZSB7CisJCWd4MV9vdXQgPSB4X291dCArIGJsaXp6YXJkLnBsYW5l W3BsYW5lXS5wb3NfeDsKKwkJZ3kxX291dCA9IHlfb3V0ICsgYmxpenphcmQucGxhbmVbcGxhbmVd LnBvc195OworCQlneDJfb3V0ID0gZ3gxX291dCArIHdfb3V0OworCQlneTJfb3V0ID0gZ3kxX291 dCArIGhfb3V0OworCX0KKwl6b29tX29mZiA9IGJsaXp6YXJkLnpvb21fb24gJiYgZ3gxID09IDAg JiYgZ3kxID09IDAgJiYKKwkJdyA9PSBibGl6emFyZC5zY3JlZW5fd2lkdGggJiYgaCA9PSBibGl6 emFyZC5zY3JlZW5faGVpZ2h0OworCWJsaXp6YXJkLnpvb21fb24gPSAoIXpvb21fb2ZmICYmIGJs aXp6YXJkLnpvb21fb24pIHx8CisJCQkgICAodyA8IHdfb3V0IHx8IGggPCBoX291dCk7CisKKwlm b3IgKGkgPSAwOyBpIDwgT01BUEZCX1BMQU5FX05VTTsgaSsrKSB7CisJCXN0cnVjdCBwbGFuZV9p bmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW2ldOworCQlpbnQgcHgxLCBweTE7CisJCWludCBweDIs IHB5MjsKKwkJaW50IHB3LCBwaDsKKwkJaW50IHBwb3N4LCBwcG9zeTsKKwkJdW5zaWduZWQgbG9u ZyBvZmZzZXQ7CisKKwkJaWYgKCEoYmxpenphcmQuZW5hYmxlZF9wbGFuZXMgJiAoMSA8PCBpKSkg IHx8CisJCSAgICAod25kX2NvbG9yX21vZGUgJiYgaSAhPSBwbGFuZSkpIHsKKwkJCWJsaXp6YXJk LmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBQ bGFuZSBjb29yZGluYXRlcyAqLworCQlpZiAoaSA9PSBwbGFuZSkgeworCQkJLyogUGxhbmUgaW4g d2hpY2ggd2UgYXJlIGRvaW5nIHRoZSB1cGRhdGUuCisJCQkgKiBMb2NhbCBjb29yZGluYXRlcyBh cmUgdGhlIG9uZSBpbiB0aGUgdXBkYXRlCisJCQkgKiByZXF1ZXN0LgorCQkJICovCisJCQlweDEg PSB4OworCQkJcHkxID0geTsKKwkJCXB4MiA9IHggKyB3OworCQkJcHkyID0geSArIGg7CisJCQlw cG9zeCA9IDA7CisJCQlwcG9zeSA9IDA7CisJCX0gZWxzZSB7CisJCQkvKiBDaGVjayBpZiB0aGlz IHBsYW5lIGhhcyBhbiBvdmVybGFwcGluZyBwYXJ0ICovCisJCQlweDEgPSBneDEgLSBwLT5wb3Nf eDsKKwkJCXB5MSA9IGd5MSAtIHAtPnBvc195OworCQkJcHgyID0gZ3gyIC0gcC0+cG9zX3g7CisJ CQlweTIgPSBneTIgLSBwLT5wb3NfeTsKKwkJCWlmIChweDEgPj0gcC0+d2lkdGggfHwgcHkxID49 IHAtPmhlaWdodCB8fAorCQkJICAgIHB4MiA8PSAwIHx8IHB5MiA8PSAwKSB7CisJCQkJYmxpenph cmQuaW50X2N0cmwtPmVuYWJsZV9wbGFuZShpLCAwKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJ CS8qIENhbGN1bGF0ZSB0aGUgY29vcmRpbmF0ZXMgZm9yIHRoZSBvdmVybGFwcGluZworCQkJICog cGFydCBpbiB0aGUgcGxhbmUncyBsb2NhbCBjb29yZGluYXRlcy4KKwkJCSAqLworCQkJcHBvc3gg PSAtcHgxOworCQkJcHBvc3kgPSAtcHkxOworCQkJaWYgKHB4MSA8IDApCisJCQkJcHgxID0gMDsK KwkJCWlmIChweTEgPCAwKQorCQkJCXB5MSA9IDA7CisJCQlpZiAocHgyID4gcC0+d2lkdGgpCisJ CQkJcHgyID0gcC0+d2lkdGg7CisJCQlpZiAocHkyID4gcC0+aGVpZ2h0KQorCQkJCXB5MiA9IHAt PmhlaWdodDsKKwkJCWlmIChwcG9zeCA8IDApCisJCQkJcHBvc3ggPSAwOworCQkJaWYgKHBwb3N5 IDwgMCkKKwkJCQlwcG9zeSA9IDA7CisJCX0KKwkJcHcgPSBweDIgLSBweDE7CisJCXBoID0gcHky IC0gcHkxOworCQlvZmZzZXQgPSBwLT5vZmZzZXQgKyAocC0+c2NyX3dpZHRoICogcHkxICsgcHgx KSAqIHAtPmJwcCAvIDg7CisJCWlmICh3bmRfY29sb3JfbW9kZSkKKwkJCS8qIFdpbmRvdyBlbWJl ZGRlZCBpbiB0aGUgcGxhbmUgd2l0aCBhIGRpZmZlcmluZworCQkJICogY29sb3IgbW9kZSAvIGJw cC4gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgRE1BCisJCQkgKiB0cmFuc2ZlciBlbGVtZW50cyBp biB0ZXJtcyBvZiB0aGUgcGxhbmUncyBicHAuCisJCQkgKi8KKwkJCXB3ID0gKHB3ICsgMSkgKiBi cHAgLyBwLT5icHA7CisjaWZkZWYgVkVSQk9TRQorCQlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5k ZXYsCisJCQkicGxhbmUgJWQgb2Zmc2V0ICUjMDhseCBwcG9zeCAlZCBwcG9zeSAlZCAiCisJCQki cHgxICVkIHB5MSAlZCBwdyAlZCBwaCAlZFxuIiwKKwkJCWksIG9mZnNldCwgcHBvc3gsIHBwb3N5 LCBweDEsIHB5MSwgcHcsIHBoKTsKKyNlbmRpZgorCQlibGl6emFyZC5pbnRfY3RybC0+c2V0dXBf cGxhbmUoaSwKKwkJCQlPTUFQRkJfQ0hBTk5FTF9PVVRfTENELCBvZmZzZXQsCisJCQkJcC0+c2Ny X3dpZHRoLAorCQkJCXBwb3N4LCBwcG9zeSwgcHcsIHBoLAorCQkJCXAtPmNvbG9yX21vZGUpOwor CisJCWJsaXp6YXJkLmludF9jdHJsLT5lbmFibGVfcGxhbmUoaSwgMSk7CisJfQorCisJc3dpdGNo ICh3bmRfY29sb3JfbW9kZSkgeworCWNhc2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJY29sb3Jf bW9kZSA9IEJMSVpaQVJEX0NPTE9SX1lVVjQyMDsKKwkJLyogQ3VycmVudGx5IG9ubHkgdGhlIDE2 IGJpdHMvcGl4ZWwgY3ljbGUgZm9ybWF0IGlzCisJCSAqIHN1cHBvcnRlZCBvbiB0aGUgZXh0ZXJu YWwgaW50ZXJmYWNlLiBBZGp1c3QgdGhlIG51bWJlcgorCQkgKiBvZiB0cmFuc2ZlciBlbGVtZW50 cyBwZXIgbGluZSBmb3IgMTJicHAgZm9ybWF0LgorCQkgKi8KKwkJdyA9ICh3ICsgMSkgKiAzIC8g NDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY29sb3JfbW9kZSA9IEJMSVpaQVJEX0NPTE9SX1JH QjU2NTsKKwkJYnJlYWs7CisJfQorCisJYmxpenphcmRfd2FpdF9saW5lX2J1ZmZlcigpOworCWlm IChibGl6emFyZC5sYXN0X2NvbG9yX21vZGUgPT0gQkxJWlpBUkRfQ09MT1JfWVVWNDIwKQorCQli bGl6emFyZF93YWl0X3l5YygpOworCWJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSA9IGNvbG9yX21v ZGU7CisJaWYgKGZsYWdzICYgT01BUEZCX0ZPUk1BVF9GTEFHX1RFQVJTWU5DKQorCQllbmFibGVf dGVhcnN5bmMoZ3kxLCB3LCBoLAorCQkJCWJsaXp6YXJkLnNjcmVlbl9oZWlnaHQsCisJCQkJaF9v dXQsCisJCQkJZmxhZ3MgJiBPTUFQRkJfRk9STUFUX0ZMQUdfRk9SQ0VfVlNZTkMpOworCWVsc2UK KwkJZGlzYWJsZV90ZWFyc3luYygpOworCisJc2V0X3dpbmRvd19yZWdzKGd4MSwgZ3kxLCBneDIs IGd5MiwgZ3gxX291dCwgZ3kxX291dCwgZ3gyX291dCwgZ3kyX291dCwKKwkJCWNvbG9yX21vZGUs IHpvb21fb2ZmLCBmbGFncyk7CisKKwlibGl6emFyZC5leHRpZi0+c2V0X2JpdHNfcGVyX2N5Y2xl KDE2KTsKKwkvKiBzZXRfd2luZG93X3JlZ3MgaGFzIGxlZnQgdGhlIHJlZ2lzdGVyIGluZGV4IGF0 IHRoZSByaWdodAorCSAqIHBsYWNlLCBzbyBubyBuZWVkIHRvIHNldCBpdCBoZXJlLgorCSAqLwor CWJsaXp6YXJkLmV4dGlmLT50cmFuc2Zlcl9hcmVhKHcsIGgsIHJlcXVlc3RfY29tcGxldGUsIHJl cSk7CisKKwlyZXR1cm4gUkVRX1BFTkRJTkc7Cit9CisKK3N0YXRpYyBpbnQgc2VuZF9mcmFtZV9o YW5kbGVyKHN0cnVjdCBibGl6emFyZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHVwZGF0ZV9w YXJhbSAqcGFyID0gJnJlcS0+cGFyLnVwZGF0ZTsKKwlpbnQgcGxhbmUgPSBwYXItPnBsYW5lOwor CisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInNlbmRf ZnJhbWU6IHggJWQgeSAlZCB3ICVkIGggJWQgIgorCQkieF9vdXQgJWQgeV9vdXQgJWQgd19vdXQg JWQgaF9vdXQgJWQgIgorCQkiY29sb3JfbW9kZSAlMDR4IGZsYWdzICUwNHggcGxhbmVzICUwMXhc biIsCisJCXBhci0+eCwgcGFyLT55LCBwYXItPndpZHRoLCBwYXItPmhlaWdodCwKKwkJcGFyLT5v dXRfeCwgcGFyLT5vdXRfeSwgcGFyLT5vdXRfd2lkdGgsIHBhci0+b3V0X2hlaWdodCwKKwkJcGFy LT5jb2xvcl9tb2RlLCBwYXItPmZsYWdzLCBibGl6emFyZC5lbmFibGVkX3BsYW5lcyk7CisjZW5k aWYKKwlpZiAocGFyLT5mbGFncyAmIE9NQVBGQl9GT1JNQVRfRkxBR19ESVNBQkxFX09WRVJMQVkp CisJCWRpc2FibGVfb3ZlcmxheSgpOworCisJaWYgKChibGl6emFyZC5lbmFibGVkX3BsYW5lcyAm IGJsaXp6YXJkLnZpZF9ub25zdGRfY29sb3IpIHx8CisJICAgICAoYmxpenphcmQuZW5hYmxlZF9w bGFuZXMgJiBibGl6emFyZC52aWRfc2NhbGVkKSkKKwkJcmV0dXJuIGRvX2Z1bGxfc2NyZWVuX3Vw ZGF0ZShyZXEpOworCisJcmV0dXJuIGRvX3BhcnRpYWxfdXBkYXRlKHJlcSwgcGxhbmUsIHBhci0+ eCwgcGFyLT55LAorCQkJCSBwYXItPndpZHRoLCBwYXItPmhlaWdodCwKKwkJCQkgcGFyLT5vdXRf eCwgcGFyLT5vdXRfeSwKKwkJCQkgcGFyLT5vdXRfd2lkdGgsIHBhci0+b3V0X2hlaWdodCwKKwkJ CQkgcGFyLT5jb2xvcl9tb2RlLCBwYXItPmJwcCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfZnJh bWVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKK30KKworI2RlZmluZSBBRERfUFJFUShfeCwgX3ks IF93LCBfaCwgX3hfb3V0LCBfeV9vdXQsIF93X291dCwgX2hfb3V0KSBkbyB7CVwKKwlyZXEgPSBh bGxvY19yZXEoKTsJCQlcCisJcmVxLT5oYW5kbGVyCT0gc2VuZF9mcmFtZV9oYW5kbGVyOwlcCisJ cmVxLT5jb21wbGV0ZQk9IHNlbmRfZnJhbWVfY29tcGxldGU7CVwKKwlyZXEtPnBhci51cGRhdGUu cGxhbmUgPSBwbGFuZV9pZHg7CVwKKwlyZXEtPnBhci51cGRhdGUueCA9IF94OwkJCVwKKwlyZXEt PnBhci51cGRhdGUueSA9IF95OwkJCVwKKwlyZXEtPnBhci51cGRhdGUud2lkdGggID0gX3c7CQlc CisJcmVxLT5wYXIudXBkYXRlLmhlaWdodCA9IF9oOwkJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRf eCA9IF94X291dDsJCVwKKwlyZXEtPnBhci51cGRhdGUub3V0X3kgPSBfeV9vdXQ7CQlcCisJcmVx LT5wYXIudXBkYXRlLm91dF93aWR0aCA9IF93X291dDsJXAorCXJlcS0+cGFyLnVwZGF0ZS5vdXRf aGVpZ2h0ID0gX2hfb3V0OwlcCisJcmVxLT5wYXIudXBkYXRlLmJwcCA9IGJwcDsJCVwKKwlyZXEt PnBhci51cGRhdGUuY29sb3JfbW9kZSA9IGNvbG9yX21vZGU7XAorCXJlcS0+cGFyLnVwZGF0ZS5m bGFncwkgID0gZmxhZ3M7CVwKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmVudHJ5LCByZXFfaGVhZCk7 CVwKK30gd2hpbGUoMCkKKworc3RhdGljIHZvaWQgY3JlYXRlX3JlcV9saXN0KGludCBwbGFuZV9p ZHgsCisJCQkgICAgc3RydWN0IG9tYXBmYl91cGRhdGVfd2luZG93ICp3aW4sCisJCQkgICAgc3Ry dWN0IGxpc3RfaGVhZCAqcmVxX2hlYWQpCit7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJl cTsKKwlpbnQgeCA9IHdpbi0+eDsKKwlpbnQgeSA9IHdpbi0+eTsKKwlpbnQgd2lkdGggPSB3aW4t PndpZHRoOworCWludCBoZWlnaHQgPSB3aW4tPmhlaWdodDsKKwlpbnQgeF9vdXQgPSB3aW4tPm91 dF94OworCWludCB5X291dCA9IHdpbi0+b3V0X3k7CisJaW50IHdpZHRoX291dCA9IHdpbi0+b3V0 X3dpZHRoOworCWludCBoZWlnaHRfb3V0ID0gd2luLT5vdXRfaGVpZ2h0OworCWludCBjb2xvcl9t b2RlOworCWludCBicHA7CisJaW50IGZsYWdzOworCXVuc2lnbmVkIGludCB5c3RhcnQgPSB5Owor CXVuc2lnbmVkIGludCB5c3BhbiA9IGhlaWdodDsKKwl1bnNpZ25lZCBpbnQgeXN0YXJ0X291dCA9 IHlfb3V0OworCXVuc2lnbmVkIGludCB5c3Bhbl9vdXQgPSBoZWlnaHRfb3V0OworCisJZmxhZ3Mg PSB3aW4tPmZvcm1hdCAmIH5PTUFQRkJfRk9STUFUX01BU0s7CisJY29sb3JfbW9kZSA9IHdpbi0+ Zm9ybWF0ICYgT01BUEZCX0ZPUk1BVF9NQVNLOworCXN3aXRjaCAoY29sb3JfbW9kZSkgeworCWNh c2UgT01BUEZCX0NPTE9SX1lVVjQyMDoKKwkJLyogRW1iZWRkZWQgd2luZG93IHdpdGggZGlmZmVy ZW50IGNvbG9yIG1vZGUgKi8KKwkJYnBwID0gMTI7CisJCS8qIFgsIFksIGhlaWdodCBtdXN0IGJl IGFsaWduZWQgYXQgMiwgd2lkdGggYXQgNCBwaXhlbHMgKi8KKwkJeCAmPSB+MTsKKwkJeSAmPSB+ MTsKKwkJaGVpZ2h0ID0geXNwYW4gPSBoZWlnaHQgJiB+MTsKKwkJd2lkdGggPSB3aWR0aCAmIH4z OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBTYW1lIGFzIHRoZSBwbGFuZSBjb2xvciBtb2Rl ICovCisJCWJwcCA9IGJsaXp6YXJkLnBsYW5lW3BsYW5lX2lkeF0uYnBwOworCQlicmVhazsKKwl9 CisJaWYgKHdpZHRoICogaGVpZ2h0ICogYnBwIC8gOCA+IGJsaXp6YXJkLm1heF90cmFuc21pdF9z aXplKSB7CisJCXlzcGFuID0gYmxpenphcmQubWF4X3RyYW5zbWl0X3NpemUgLyAod2lkdGggKiBi cHAgLyA4KTsKKwkJeXNwYW5fb3V0ID0geXNwYW4gKiBoZWlnaHRfb3V0IC8gaGVpZ2h0OworCQlB RERfUFJFUSh4LCB5c3RhcnQsIHdpZHRoLCB5c3BhbiwgeF9vdXQsIHlzdGFydF9vdXQsCisJCQkg d2lkdGhfb3V0LCB5c3Bhbl9vdXQpOworCQl5c3RhcnQgKz0geXNwYW47CisJCXlzdGFydF9vdXQg Kz0geXNwYW5fb3V0OworCQl5c3BhbiA9IGhlaWdodCAtIHlzcGFuOworCQl5c3Bhbl9vdXQgPSBo ZWlnaHRfb3V0IC0geXNwYW5fb3V0OworCQlmbGFncyAmPSB+T01BUEZCX0ZPUk1BVF9GTEFHX1RF QVJTWU5DOworCX0KKworCUFERF9QUkVRKHgsIHlzdGFydCwgd2lkdGgsIHlzcGFuLCB4X291dCwg eXN0YXJ0X291dCwKKwkJIHdpZHRoX291dCwgeXNwYW5fb3V0KTsKK30KKworc3RhdGljIHZvaWQg YXV0b191cGRhdGVfY29tcGxldGUodm9pZCAqZGF0YSkKK3sKKwlpZiAoIWJsaXp6YXJkLnN0b3Bf YXV0b191cGRhdGUpCisJCW1vZF90aW1lcigmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIsCisJ CQkgIGppZmZpZXMgKyBCTElaWkFSRF9BVVRPX1VQREFURV9USU1FKTsKK30KKworc3RhdGljIHZv aWQgYmxpenphcmRfdXBkYXRlX3dpbmRvd19hdXRvKHVuc2lnbmVkIGxvbmcgYXJnKQoreworCUxJ U1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmxhc3Q7CisJc3Ry dWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lOworCisJcGxhbmUgPSBibGl6emFyZC5mYmRl di0+ZmJfaW5mb1swXS0+cGFyOworCWNyZWF0ZV9yZXFfbGlzdChwbGFuZS0+aWR4LAorCQkJJmJs aXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdywgJnJlcV9saXN0KTsKKwlsYXN0ID0gbGlzdF9lbnRy eShyZXFfbGlzdC5wcmV2LCBzdHJ1Y3QgYmxpenphcmRfcmVxdWVzdCwgZW50cnkpOworCisJbGFz dC0+Y29tcGxldGUgPSBhdXRvX3VwZGF0ZV9jb21wbGV0ZTsKKwlsYXN0LT5jb21wbGV0ZV9kYXRh ID0gTlVMTDsKKworCXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworfQorCitpbnQgYmxpenph cmRfdXBkYXRlX3dpbmRvd19hc3luYyhzdHJ1Y3QgZmJfaW5mbyAqZmJpLAorCQkJCSBzdHJ1Y3Qg b21hcGZiX3VwZGF0ZV93aW5kb3cgKndpbiwKKwkJCQkgdm9pZCAoKmNvbXBsZXRlX2NhbGxiYWNr KSh2b2lkICphcmcpLAorCQkJCSB2b2lkICpjb21wbGV0ZV9jYWxsYmFja19kYXRhKQoreworCUxJ U1RfSEVBRChyZXFfbGlzdCk7CisJc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKmxhc3Q7CisJc3Ry dWN0IG9tYXBmYl9wbGFuZV9zdHJ1Y3QgKnBsYW5lID0gZmJpLT5wYXI7CisKKwlpZiAodW5saWtl bHkoYmxpenphcmQudXBkYXRlX21vZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUpKQorCQlyZXR1 cm4gLUVJTlZBTDsKKwlpZiAodW5saWtlbHkoIWJsaXp6YXJkLnRlX2Nvbm5lY3RlZCAmJgorCQkg ICAgICh3aW4tPmZvcm1hdCAmIE9NQVBGQl9GT1JNQVRfRkxBR19URUFSU1lOQykpKQorCQlyZXR1 cm4gLUVJTlZBTDsKKworCWNyZWF0ZV9yZXFfbGlzdChwbGFuZS0+aWR4LCB3aW4sICZyZXFfbGlz dCk7CisJbGFzdCA9IGxpc3RfZW50cnkocmVxX2xpc3QucHJldiwgc3RydWN0IGJsaXp6YXJkX3Jl cXVlc3QsIGVudHJ5KTsKKworCWxhc3QtPmNvbXBsZXRlID0gY29tcGxldGVfY2FsbGJhY2s7CisJ bGFzdC0+Y29tcGxldGVfZGF0YSA9ICh2b2lkICopY29tcGxldGVfY2FsbGJhY2tfZGF0YTsKKwor CXN1Ym1pdF9yZXFfbGlzdCgmcmVxX2xpc3QpOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lN Qk9MKGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5bmMpOworCitzdGF0aWMgaW50IHVwZGF0ZV9m dWxsX3NjcmVlbih2b2lkKQoreworCXJldHVybiBibGl6emFyZF91cGRhdGVfd2luZG93X2FzeW5j KGJsaXp6YXJkLmZiZGV2LT5mYl9pbmZvWzBdLAorCQkJCSAgICAgJmJsaXp6YXJkLmF1dG9fdXBk YXRlX3dpbmRvdywgTlVMTCwgTlVMTCk7CisKK30KKworc3RhdGljIGludCBibGl6emFyZF9zZXR1 cF9wbGFuZShpbnQgcGxhbmUsIGludCBjaGFubmVsX291dCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcg b2Zmc2V0LCBpbnQgc2NyZWVuX3dpZHRoLAorCQkJCSAgaW50IHBvc194LCBpbnQgcG9zX3ksIGlu dCB3aWR0aCwgaW50IGhlaWdodCwKKwkJCQkgIGludCBjb2xvcl9tb2RlKQoreworCXN0cnVjdCBw bGFuZV9pbmZvICpwOworCisjaWZkZWYgVkVSQk9TRQorCWRldl9kYmcoYmxpenphcmQuZmJkZXYt PmRldiwKKwkJICAgICJwbGFuZSAlZCBjaF9vdXQgJWQgb2Zmc2V0ICUjMDhseCBzY3Jfd2lkdGgg JWQgIgorCQkgICAgInBvc194ICVkIHBvc195ICVkIHdpZHRoICVkIGhlaWdodCAlZCBjb2xvcl9t b2RlICVkXG4iLAorCQkgICAgcGxhbmUsIGNoYW5uZWxfb3V0LCBvZmZzZXQsIHNjcmVlbl93aWR0 aCwKKwkJICAgIHBvc194LCBwb3NfeSwgd2lkdGgsIGhlaWdodCwgY29sb3JfbW9kZSk7CisjZW5k aWYKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZCX1BMQU5FX05VTSkKKwkJcmV0dXJuIC1F SU5WQUw7CisJcCA9ICZibGl6emFyZC5wbGFuZVtwbGFuZV07CisKKwlzd2l0Y2ggKGNvbG9yX21v ZGUpIHsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjI6CisJY2FzZSBPTUFQRkJfQ09MT1JfWVVZ NDIyOgorCQlwLT5icHAgPSAxNjsKKwkJYmxpenphcmQudmlkX25vbnN0ZF9jb2xvciAmPSB+KDEg PDwgcGxhbmUpOworCQlicmVhazsKKwljYXNlIE9NQVBGQl9DT0xPUl9ZVVY0MjA6CisJCXAtPmJw cCA9IDEyOworCQlibGl6emFyZC52aWRfbm9uc3RkX2NvbG9yIHw9IDEgPDwgcGxhbmU7CisJCWJy ZWFrOworCWNhc2UgT01BUEZCX0NPTE9SX1JHQjU2NToKKwkJcC0+YnBwID0gMTY7CisJCWJsaXp6 YXJkLnZpZF9ub25zdGRfY29sb3IgJj0gfigxIDw8IHBsYW5lKTsKKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcC0+b2Zmc2V0ID0gb2Zmc2V0OworCXAtPnBv c194ID0gcG9zX3g7CisJcC0+cG9zX3kgPSBwb3NfeTsKKwlwLT53aWR0aCA9IHdpZHRoOworCXAt PmhlaWdodCA9IGhlaWdodDsKKwlwLT5zY3Jfd2lkdGggPSBzY3JlZW5fd2lkdGg7CisJaWYgKCFw LT5vdXRfd2lkdGgpCisJCXAtPm91dF93aWR0aCA9IHdpZHRoOworCWlmICghcC0+b3V0X2hlaWdo dCkKKwkJcC0+b3V0X2hlaWdodCA9IGhlaWdodDsKKworCXAtPmNvbG9yX21vZGUgPSBjb2xvcl9t b2RlOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0X3NjYWxlKGlu dCBwbGFuZSwgaW50IG9yaWdfdywgaW50IG9yaWdfaCwKKwkJCSAgICAgIGludCBvdXRfdywgaW50 IG91dF9oKQoreworCXN0cnVjdCBwbGFuZV9pbmZvICpwID0gJmJsaXp6YXJkLnBsYW5lW3BsYW5l XTsKKwlpbnQgcjsKKworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwKKwkJInBsYW5lICVk IG9yaWdfdyAlZCBvcmlnX2ggJWQgb3V0X3cgJWQgb3V0X2ggJWRcbiIsCisJCXBsYW5lLCBvcmln X3csIG9yaWdfaCwgb3V0X3csIG91dF9oKTsKKwlpZiAoKHVuc2lnbmVkKXBsYW5lID4gT01BUEZC X1BMQU5FX05VTSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlyID0gYmxpenphcmQuaW50X2N0cmwt PnNldF9zY2FsZShwbGFuZSwgb3JpZ193LCBvcmlnX2gsIG91dF93LCBvdXRfaCk7CisJaWYgKHIg PCAwKQorCQlyZXR1cm4gcjsKKworCXAtPndpZHRoID0gb3JpZ193OworCXAtPmhlaWdodCA9IG9y aWdfaDsKKwlwLT5vdXRfd2lkdGggPSBvdXRfdzsKKwlwLT5vdXRfaGVpZ2h0ID0gb3V0X2g7CisJ aWYgKG9yaWdfdyA9PSBvdXRfdyAmJiBvcmlnX2ggPT0gb3V0X2gpCisJCWJsaXp6YXJkLnZpZF9z Y2FsZWQgJj0gfigxIDw8IHBsYW5lKTsKKwllbHNlCisJCWJsaXp6YXJkLnZpZF9zY2FsZWQgfD0g MSA8PCBwbGFuZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJsaXp6YXJkX2VuYWJs ZV9wbGFuZShpbnQgcGxhbmUsIGludCBlbmFibGUpCit7CisJaWYgKGVuYWJsZSkKKwkJYmxpenph cmQuZW5hYmxlZF9wbGFuZXMgfD0gMSA8PCBwbGFuZTsKKwllbHNlCisJCWJsaXp6YXJkLmVuYWJs ZWRfcGxhbmVzICY9IH4oMSA8PCBwbGFuZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBzeW5jX2hhbmRsZXIoc3RydWN0IGJsaXp6YXJkX3JlcXVlc3QgKnJlcSkKK3sKKwljb21wbGV0 ZShyZXEtPnBhci5zeW5jKTsKKwlyZXR1cm4gUkVRX0NPTVBMRVRFOworfQorCitzdGF0aWMgdm9p ZCBibGl6emFyZF9zeW5jKHZvaWQpCit7CisJTElTVF9IRUFEKHJlcV9saXN0KTsKKwlzdHJ1Y3Qg YmxpenphcmRfcmVxdWVzdCAqcmVxOworCXN0cnVjdCBjb21wbGV0aW9uIGNvbXA7CisKKwlyZXEg PSBhbGxvY19yZXEoKTsKKworCXJlcS0+aGFuZGxlciA9IHN5bmNfaGFuZGxlcjsKKwlyZXEtPmNv bXBsZXRlID0gTlVMTDsKKwlpbml0X2NvbXBsZXRpb24oJmNvbXApOworCXJlcS0+cGFyLnN5bmMg PSAmY29tcDsKKworCWxpc3RfYWRkKCZyZXEtPmVudHJ5LCAmcmVxX2xpc3QpOworCXN1Ym1pdF9y ZXFfbGlzdCgmcmVxX2xpc3QpOworCisJd2FpdF9mb3JfY29tcGxldGlvbigmY29tcCk7Cit9CisK Kworc3RhdGljIHZvaWQgYmxpenphcmRfYmluZF9jbGllbnQoc3RydWN0IG9tYXBmYl9ub3RpZmll cl9ibG9jayAqbmIpCit7CisJaWYgKGJsaXp6YXJkLnVwZGF0ZV9tb2RlID09IE9NQVBGQl9NQU5V QUxfVVBEQVRFKSB7CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFyZC5mYmRldiwgT01B UEZCX0VWRU5UX1JFQURZKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYmxpenphcmRfc2V0X3VwZGF0 ZV9tb2RlKGVudW0gb21hcGZiX3VwZGF0ZV9tb2RlIG1vZGUpCit7CisJaWYgKHVubGlrZWx5KG1v ZGUgIT0gT01BUEZCX01BTlVBTF9VUERBVEUgJiYKKwkJICAgICBtb2RlICE9IE9NQVBGQl9BVVRP X1VQREFURSAmJgorCQkgICAgIG1vZGUgIT0gT01BUEZCX1VQREFURV9ESVNBQkxFRCkpCisJCXJl dHVybiAtRUlOVkFMOworCisJaWYgKG1vZGUgPT0gYmxpenphcmQudXBkYXRlX21vZGUpCisJCXJl dHVybiAwOworCisJZGV2X2luZm8oYmxpenphcmQuZmJkZXYtPmRldiwgInMxZDEzNzR4OiBzZXR0 aW5nIHVwZGF0ZSBtb2RlIHRvICVzXG4iLAorCQkJbW9kZSA9PSBPTUFQRkJfVVBEQVRFX0RJU0FC TEVEID8gImRpc2FibGVkIiA6CisJCQkobW9kZSA9PSBPTUFQRkJfQVVUT19VUERBVEUgPyAiYXV0 byIgOiAibWFudWFsIikpOworCisJc3dpdGNoIChibGl6emFyZC51cGRhdGVfbW9kZSkgeworCWNh c2UgT01BUEZCX01BTlVBTF9VUERBVEU6CisJCW9tYXBmYl9ub3RpZnlfY2xpZW50cyhibGl6emFy ZC5mYmRldiwgT01BUEZCX0VWRU5UX0RJU0FCTEVEKTsKKwkJYnJlYWs7CisJY2FzZSBPTUFQRkJf QVVUT19VUERBVEU6CisJCWJsaXp6YXJkLnN0b3BfYXV0b191cGRhdGUgPSAxOworCQlkZWxfdGlt ZXJfc3luYygmYmxpenphcmQuYXV0b191cGRhdGVfdGltZXIpOworCQlicmVhazsKKwljYXNlIE9N QVBGQl9VUERBVEVfRElTQUJMRUQ6CisJCWJyZWFrOworCX0KKworCWJsaXp6YXJkLnVwZGF0ZV9t b2RlID0gbW9kZTsKKwlibGl6emFyZF9zeW5jKCk7CisJYmxpenphcmQuc3RvcF9hdXRvX3VwZGF0 ZSA9IDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIE9NQVBGQl9NQU5VQUxfVVBEQVRFOgor CQlvbWFwZmJfbm90aWZ5X2NsaWVudHMoYmxpenphcmQuZmJkZXYsIE9NQVBGQl9FVkVOVF9SRUFE WSk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX0FVVE9fVVBEQVRFOgorCQlibGl6emFyZF91cGRh dGVfd2luZG93X2F1dG8oMCk7CisJCWJyZWFrOworCWNhc2UgT01BUEZCX1VQREFURV9ESVNBQkxF RDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBlbnVtIG9tYXBmYl91 cGRhdGVfbW9kZSBibGl6emFyZF9nZXRfdXBkYXRlX21vZGUodm9pZCkKK3sKKwlyZXR1cm4gYmxp enphcmQudXBkYXRlX21vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfZXh0aWZfdGlt aW5ncyhjb25zdCBzdHJ1Y3QgZXh0aWZfdGltaW5ncyAqdCkKK3sKKwlibGl6emFyZC5leHRpZi0+ c2V0X3RpbWluZ3ModCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyByb3VuZF90 b19leHRpZl90aWNrcyh1bnNpZ25lZCBsb25nIHBzLCBpbnQgZGl2KQoreworCWludCBidXNfdGlj ayA9IGJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QgKiBkaXY7CisJcmV0dXJuIChwcyArIGJ1c190 aWNrIC0gMSkgLyBidXNfdGljayAqIGJ1c190aWNrOworfQorCitzdGF0aWMgaW50IGNhbGNfcmVn X3RpbWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZf dGltaW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdF T25UaW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgMTIuMiBu cyAocmVncyksCisJICogV0VPZmZUaW1lID0gV0VPblRpbWUgKyAxIG5zLAorCSAqIFJFT2ZmVGlt ZSA9IFJFT25UaW1lICsgMTIgbnMgKHJlZ3MpLAorCSAqIENTT2ZmVGltZSA9IFJFT2ZmVGltZSAr IDEgbnMKKwkgKiBSZWFkQ3ljbGUgPSAybnMgKyAyKlNZU0NMSyAgKHJlZ3MpLAorCSAqIFdyaXRl Q3ljbGUgPSAyKlNZU0NMSyArIDIgbnMsCisJICogQ1NQdWxzZVdpZHRoID0gMTAgbnMgKi8KKwor CXN5c3RpbSA9IDEwMDAwMDAwMDAgLyAoc3lzY2xrIC8gMTAwMCk7CisJZGV2X2RiZyhibGl6emFy ZC5mYmRldi0+ZGV2LAorCQkgICJCbGl6emFyZCBzeXN0aW0gJWx1IHBzIGV4dGlmX2Nsa19wZXJp b2QgJXUgZGl2ICVkXG4iLAorCQkgIHN5c3RpbSwgYmxpenphcmQuZXh0aWZfY2xrX3BlcmlvZCwg ZGl2KTsKKworCXQgPSAmYmxpenphcmQucmVnX3RpbWluZ3M7CisJbWVtc2V0KHQsIDAsIHNpemVv ZigqdCkpOworCisJdC0+Y2xrX2RpdiA9IGRpdjsKKworCXQtPmNzX29uX3RpbWUgPSAwOworCXQt PndlX29uX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0LT5jc19vbl90aW1lICsgMjAwMCwg ZGl2KTsKKwl0LT5yZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nfb25fdGlt ZSArIDIwMDAsIGRpdik7CisJdC0+YWNjZXNzX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcyh0 LT5yZV9vbl90aW1lICsgMTIyMDAsIGRpdik7CisJdC0+d2Vfb2ZmX3RpbWUgPSByb3VuZF90b19l eHRpZl90aWNrcyh0LT53ZV9vbl90aW1lICsgMTAwMCwgZGl2KTsKKwl0LT5yZV9vZmZfdGltZSA9 IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29uX3RpbWUgKyAxMzAwMCwgZGl2KTsKKwl0LT5j c19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1lICsgMTAwMCwg ZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3MoMiAqIHN5c3Rp bSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9vZmZfdGltZSkK KwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5Y2xlX3RpbWUg PSByb3VuZF90b19leHRpZl90aWNrcygyICogc3lzdGltICsgMjAwMCwgZGl2KTsKKwlpZiAodC0+ cmVfY3ljbGVfdGltZSA8IHQtPnJlX29mZl90aW1lKQorCQl0LT5yZV9jeWNsZV90aW1lID0gdC0+ cmVfb2ZmX3RpbWU7CisJdC0+Y3NfcHVsc2Vfd2lkdGggPSAwOworCisJZGV2X2RiZyhibGl6emFy ZC5mYmRldi0+ZGV2LCAiW3JlZ11jc29uICVkIGNzb2ZmICVkIHJlb24gJWQgcmVvZmYgJWRcbiIs CisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwgdC0+cmVfb25fdGltZSwgdC0+cmVf b2ZmX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltyZWddd2VvbiAlZCB3 ZW9mZiAlZCByZWN5YyAlZCB3ZWN5YyAlZFxuIiwKKwkJIHQtPndlX29uX3RpbWUsIHQtPndlX29m Zl90aW1lLCB0LT5yZV9jeWNsZV90aW1lLAorCQkgdC0+d2VfY3ljbGVfdGltZSk7CisJZGV2X2Ri ZyhibGl6emFyZC5mYmRldi0+ZGV2LCAiW3JlZ11yZGFjY2VzcyAlZCBjc3B1bHNlICVkXG4iLAor CQkgdC0+YWNjZXNzX3RpbWUsIHQtPmNzX3B1bHNlX3dpZHRoKTsKKworCXJldHVybiBibGl6emFy ZC5leHRpZi0+Y29udmVydF90aW1pbmdzKHQpOworfQorCitzdGF0aWMgaW50IGNhbGNfbHV0X3Rp bWluZyh1bnNpZ25lZCBsb25nIHN5c2NsaywgaW50IGRpdikKK3sKKwlzdHJ1Y3QgZXh0aWZfdGlt aW5ncyAqdDsKKwl1bnNpZ25lZCBsb25nIHN5c3RpbTsKKworCS8qIENTT25UaW1lIDAsIFdFT25U aW1lIDIgbnMsIFJFT25UaW1lIDIgbnMsCisJICogQWNjZXNzVGltZSAyIG5zICsgNCAqIFNZU0NM SyArIDI2IChsdXQpLAorCSAqIFdFT2ZmVGltZSA9IFdFT25UaW1lICsgMSBucywKKwkgKiBSRU9m ZlRpbWUgPSBSRU9uVGltZSArIDQqU1lTQ0xLICsgMjYgbnMgKGx1dCksCisJICogQ1NPZmZUaW1l ID0gUkVPZmZUaW1lICsgMSBucworCSAqIFJlYWRDeWNsZSA9IDJucyArIDQqU1lTQ0xLICsgMjYg bnMgKGx1dCksCisJICogV3JpdGVDeWNsZSA9IDIqU1lTQ0xLICsgMiBucywKKwkgKiBDU1B1bHNl V2lkdGggPSAxMCBucyAqLworCisJc3lzdGltID0gMTAwMDAwMDAwMCAvIChzeXNjbGsgLyAxMDAw KTsKKwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSJCbGl6emFyZCBzeXN0aW0gJWx1 IHBzIGV4dGlmX2Nsa19wZXJpb2QgJXUgZGl2ICVkXG4iLAorCQlzeXN0aW0sIGJsaXp6YXJkLmV4 dGlmX2Nsa19wZXJpb2QsIGRpdik7CisKKwl0ID0gJmJsaXp6YXJkLmx1dF90aW1pbmdzOworCW1l bXNldCh0LCAwLCBzaXplb2YoKnQpKTsKKworCXQtPmNsa19kaXYgPSBkaXY7CisKKwl0LT5jc19v bl90aW1lID0gMDsKKwl0LT53ZV9vbl90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3ModC0+Y3Nf b25fdGltZSArIDIwMDAsIGRpdik7CisJdC0+cmVfb25fdGltZSA9IHJvdW5kX3RvX2V4dGlmX3Rp Y2tzKHQtPmNzX29uX3RpbWUgKyAyMDAwLCBkaXYpOworCXQtPmFjY2Vzc190aW1lID0gcm91bmRf dG9fZXh0aWZfdGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAy NjAwMCwgZGl2KTsKKwl0LT53ZV9vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPndl X29uX3RpbWUgKyAxMDAwLCBkaXYpOworCXQtPnJlX29mZl90aW1lID0gcm91bmRfdG9fZXh0aWZf dGlja3ModC0+cmVfb25fdGltZSArIDQgKiBzeXN0aW0gKworCQkJCQkgICAgICAyNjAwMCwgZGl2 KTsKKwl0LT5jc19vZmZfdGltZSA9IHJvdW5kX3RvX2V4dGlmX3RpY2tzKHQtPnJlX29mZl90aW1l ICsgMTAwMCwgZGl2KTsKKwl0LT53ZV9jeWNsZV90aW1lID0gcm91bmRfdG9fZXh0aWZfdGlja3Mo MiAqIHN5c3RpbSArIDIwMDAsIGRpdik7CisJaWYgKHQtPndlX2N5Y2xlX3RpbWUgPCB0LT53ZV9v ZmZfdGltZSkKKwkJdC0+d2VfY3ljbGVfdGltZSA9IHQtPndlX29mZl90aW1lOworCXQtPnJlX2N5 Y2xlX3RpbWUgPSByb3VuZF90b19leHRpZl90aWNrcygyMDAwICsgNCAqIHN5c3RpbSArIDI2MDAw LCBkaXYpOworCWlmICh0LT5yZV9jeWNsZV90aW1lIDwgdC0+cmVfb2ZmX3RpbWUpCisJCXQtPnJl X2N5Y2xlX3RpbWUgPSB0LT5yZV9vZmZfdGltZTsKKwl0LT5jc19wdWxzZV93aWR0aCA9IDA7CisK KwlkZXZfZGJnKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCSAiW2x1dF1jc29uICVkIGNzb2ZmICVk IHJlb24gJWQgcmVvZmYgJWRcbiIsCisJCSB0LT5jc19vbl90aW1lLCB0LT5jc19vZmZfdGltZSwg dC0+cmVfb25fdGltZSwgdC0+cmVfb2ZmX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYt PmRldiwKKwkJICJbbHV0XXdlb24gJWQgd2VvZmYgJWQgcmVjeWMgJWQgd2VjeWMgJWRcbiIsCisJ CSB0LT53ZV9vbl90aW1lLCB0LT53ZV9vZmZfdGltZSwgdC0+cmVfY3ljbGVfdGltZSwKKwkJIHQt PndlX2N5Y2xlX3RpbWUpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwgIltsdXRdcmRh Y2Nlc3MgJWQgY3NwdWxzZSAlZFxuIiwKKwkJIHQtPmFjY2Vzc190aW1lLCB0LT5jc19wdWxzZV93 aWR0aCk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPmNvbnZlcnRfdGltaW5ncyh0KTsKK30K Kworc3RhdGljIGludCBjYWxjX2V4dGlmX3RpbWluZ3ModW5zaWduZWQgbG9uZyBzeXNjbGssIGlu dCAqZXh0aWZfbWVtX2RpdikKK3sKKwlpbnQgbWF4X2Nsa19kaXY7CisJaW50IGRpdjsKKworCWJs aXp6YXJkLmV4dGlmLT5nZXRfY2xrX2luZm8oJmJsaXp6YXJkLmV4dGlmX2Nsa19wZXJpb2QsICZt YXhfY2xrX2Rpdik7CisJZm9yIChkaXYgPSAxOyBkaXYgPD0gbWF4X2Nsa19kaXY7IGRpdisrKSB7 CisJCWlmIChjYWxjX3JlZ190aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9 CisJaWYgKGRpdiA+IG1heF9jbGtfZGl2KSB7CisJCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRl diwgInJlZyB0aW1pbmcgZmFpbGVkXG4iKTsKKwkJZ290byBlcnI7CisJfQorCSpleHRpZl9tZW1f ZGl2ID0gZGl2OworCisJZm9yIChkaXYgPSAxOyBkaXYgPD0gbWF4X2Nsa19kaXY7IGRpdisrKSB7 CisJCWlmIChjYWxjX2x1dF90aW1pbmcoc3lzY2xrLCBkaXYpID09IDApCisJCQlicmVhazsKKwl9 CisKKwlpZiAoZGl2ID4gbWF4X2Nsa19kaXYpCisJCWdvdG8gZXJyOworCisJYmxpenphcmQuZXh0 aWZfY2xrX2RpdiA9IGRpdjsKKworCXJldHVybiAwOworZXJyOgorCWRldl9lcnIoYmxpenphcmQu ZmJkZXYtPmRldiwgImNhbid0IHNldHVwIHRpbWluZ3NcbiIpOworCXJldHVybiAtMTsKK30KKwor c3RhdGljIHZvaWQgY2FsY19ibGl6emFyZF9jbGtfcmF0ZXModW5zaWduZWQgbG9uZyBleHRfY2xr LAorCQkJCXVuc2lnbmVkIGxvbmcgKnN5c19jbGssIHVuc2lnbmVkIGxvbmcgKnBpeF9jbGspCit7 CisJaW50IHBpeF9jbGtfc3JjOworCWludCBzeXNfZGl2ID0gMCwgc3lzX211bCA9IDA7CisJaW50 IHBpeF9kaXY7CisKKwlwaXhfY2xrX3NyYyA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0NM S19TUkMpOworCXBpeF9kaXYgPSAoKHBpeF9jbGtfc3JjID4+IDMpICYgMHgxZikgKyAxOworCWlm ICgocGl4X2Nsa19zcmMgJiAoMHgzIDw8IDEpKSA9PSAwKSB7CisJCS8qIFNvdXJjZSBpcyB0aGUg UExMICovCisJCXN5c19kaXYgPSAoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikg JiAweDNmKSArIDE7CisJCXN5c19tdWwgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9QTExf Q0xPQ0tfU1lOVEhfMCk7CisJCXN5c19tdWwgfD0gKChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFS RF9QTExfQ0xPQ0tfU1lOVEhfMSkKKwkJCQkmIDB4MGYpCTw8IDExKTsKKwkJKnN5c19jbGsgPSBl eHRfY2xrICogc3lzX211bCAvIHN5c19kaXY7CisJfSBlbHNlCS8qIGVsc2Ugc291cmNlIGlzIGV4 dCBjbGssIG9yIG9zY2lsbGF0b3IgKi8KKwkJKnN5c19jbGsgPSBleHRfY2xrOworCisJKnBpeF9j bGsgPSAqc3lzX2NsayAvIHBpeF9kaXY7CQkJLyogSFogKi8KKwlkZXZfZGJnKGJsaXp6YXJkLmZi ZGV2LT5kZXYsCisJCSJleHRfY2xrICVsZCBwaXhfc3JjICVkIHBpeF9kaXYgJWQgc3lzX2RpdiAl ZCBzeXNfbXVsICVkXG4iLAorCQlleHRfY2xrLCBwaXhfY2xrX3NyYyAmICgweDMgPDwgMSksIHBp eF9kaXYsIHN5c19kaXYsIHN5c19tdWwpOworCWRldl9kYmcoYmxpenphcmQuZmJkZXYtPmRldiwg InN5c19jbGsgJWxkIHBpeF9jbGsgJWxkXG4iLAorCQkqc3lzX2NsaywgKnBpeF9jbGspOworfQor CitzdGF0aWMgaW50IHNldHVwX3RlYXJzeW5jKHVuc2lnbmVkIGxvbmcgcGl4X2NsaywgaW50IGV4 dGlmX2RpdikKK3sKKwlpbnQgaGRpc3AsIHZkaXNwOworCWludCBobmRwLCB2bmRwOworCWludCBo c3csIHZzdzsKKwlpbnQgaHMsIHZzOworCWludCBoc19wb2xfaW52LCB2c19wb2xfaW52OworCWlu dCB1c2VfaHN2cywgdXNlX25kcDsKKwl1OCAgYjsKKworCWhzdyA9IGJsaXp6YXJkX3JlYWRfcmVn KEJMSVpaQVJEX0hTVyk7CisJdnN3ID0gYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfVlNXKTsK Kwloc19wb2xfaW52ID0gIShoc3cgJiAweDgwKTsKKwl2c19wb2xfaW52ID0gISh2c3cgJiAweDgw KTsKKwloc3cgPSBoc3cgJiAweDdmOworCXZzdyA9IHZzdyAmIDB4M2Y7CisKKwloZGlzcCA9IGJs aXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX0hESVNQKSAqIDg7CisJdmRpc3AgPSBibGl6emFyZF9y ZWFkX3JlZyhCTElaWkFSRF9WRElTUDApICsKKwkJKChibGl6emFyZF9yZWFkX3JlZyhCTElaWkFS RF9WRElTUDEpICYgMHgzKSA8PCA4KTsKKworCWhuZHAgPSBibGl6emFyZF9yZWFkX3JlZyhCTEla WkFSRF9ITkRQKSAmIDB4M2Y7CisJdm5kcCA9IGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1ZO RFApOworCisJLyogdGltZSB0byB0cmFuc2ZlciBvbmUgcGl4ZWwgKDE2YnBwKSBpbiBwcyAqLwor CWJsaXp6YXJkLnBpeF90eF90aW1lID0gYmxpenphcmQucmVnX3RpbWluZ3Mud2VfY3ljbGVfdGlt ZTsKKwlpZiAoYmxpenphcmQuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSAhPSBOVUxMKSB7CisJCS8q IFRoZSBleHRlcm5hbCBpbnRlcmZhY2UgbWlnaHQgaGF2ZSBhIHJhdGUgbGltaXRhdGlvbiwKKwkJ ICogaWYgc28sIHdlIGhhdmUgdG8gbWF4aW1pemUgb3VyIHRyYW5zZmVyIHJhdGUuCisJCSAqLwor CQl1bnNpZ25lZCBsb25nIG1pbl90eF90aW1lOworCQl1bnNpZ25lZCBsb25nIG1heF90eF9yYXRl ID0gYmxpenphcmQuZXh0aWYtPmdldF9tYXhfdHhfcmF0ZSgpOworCisJCWRldl9kYmcoYmxpenph cmQuZmJkZXYtPmRldiwgIm1heF90eF9yYXRlICVsZCBIWlxuIiwKKwkJCW1heF90eF9yYXRlKTsK KwkJbWluX3R4X3RpbWUgPSAxMDAwMDAwMDAwIC8gKG1heF90eF9yYXRlIC8gMTAwMCk7ICAvKiBw cyAqLworCQlpZiAoYmxpenphcmQucGl4X3R4X3RpbWUgPCBtaW5fdHhfdGltZSkKKwkJCWJsaXp6 YXJkLnBpeF90eF90aW1lID0gbWluX3R4X3RpbWU7CisJfQorCisJLyogdGltZSB0byB1cGRhdGUg b25lIGxpbmUgaW4gcHMgKi8KKwlibGl6emFyZC5saW5lX3VwZF90aW1lID0gKGhkaXNwICsgaG5k cCkgKiAxMDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsKKwlibGl6emFyZC5saW5lX3VwZF90aW1l ICo9IDEwMDA7CisJaWYgKGhkaXNwICogYmxpenphcmQucGl4X3R4X3RpbWUgPiBibGl6emFyZC5s aW5lX3VwZF90aW1lKQorCQkvKiB0cmFuc2ZlciBzcGVlZCB0b28gbG93LCB3ZSBtaWdodCBoYXZl IHRvIHVzZSBib3RoCisJCSAqIEhTIGFuZCBWUyAqLworCQl1c2VfaHN2cyA9IDE7CisJZWxzZQor CQkvKiBkZWNlbnQgdHJhbnNmZXIgc3BlZWQsIHdlJ2xsIGFsd2F5cyB1c2Ugb25seSBWUyAqLwor CQl1c2VfaHN2cyA9IDA7CisKKwlpZiAodXNlX2hzdnMgJiYgKGhzX3BvbF9pbnYgfHwgdnNfcG9s X2ludikpIHsKKwkJLyogSFMgb3InZWQgd2l0aCBWUyBkb2Vzbid0IHdvcmssIHVzZSB0aGUgYWN0 aXZlIGhpZ2gKKwkJICogVEUgc2lnbmFsIGJhc2VkIG9uIEhORFAgLyBWTkRQICovCisJCXVzZV9u ZHAgPSAxOworCQloc19wb2xfaW52ID0gMDsKKwkJdnNfcG9sX2ludiA9IDA7CisJCWhzID0gaG5k cDsKKwkJdnMgPSB2bmRwOworCX0gZWxzZSB7CisJCS8qIFVzZSBIUyBvcidlZCB3aXRoIFZTIGFz IGEgVEUgc2lnbmFsIGlmIGJvdGggYXJlIG5lZWRlZAorCQkgKiBvciBWTkRQIGlmIG9ubHkgdnN5 bmMgaXMgbmVlZGVkLiAqLworCQl1c2VfbmRwID0gMDsKKwkJaHMgPSBoc3c7CisJCXZzID0gdnN3 OworCQlpZiAoIXVzZV9oc3ZzKSB7CisJCQloc19wb2xfaW52ID0gMDsKKwkJCXZzX3BvbF9pbnYg PSAwOworCQl9CisJfQorCisJaHMgPSBocyAqIDEwMDAwMDAgLyAocGl4X2NsayAvIDEwMDApOwkJ ICAvKiBwcyAqLworCWhzICo9IDEwMDA7CisKKwl2cyA9IHZzICogKGhkaXNwICsgaG5kcCkgKiAx MDAwMDAwIC8gKHBpeF9jbGsgLyAxMDAwKTsgLyogcHMgKi8KKwl2cyAqPSAxMDAwOworCisJaWYg KHZzIDw9IGhzKQorCQlyZXR1cm4gLUVET007CisJLyogc2V0IFZTIHRvIDEyMCUgb2YgSFMgdG8g bWluaW1pemUgVlMgZGV0ZWN0aW9uIHRpbWUgKi8KKwl2cyA9IGhzICogMTIgLyAxMDsKKwkvKiBt aW5pbWl6ZSBIUyB0b28gKi8KKwlpZiAoaHMgPiAxMDAwMCkKKwkJaHMgPSAxMDAwMDsKKworCWIg PSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRVUyk7CisJYiAmPSB+ MHgzOworCWIgfD0gdXNlX2hzdnMgPyAxIDogMDsKKwliIHw9ICh1c2VfbmRwICYmIHVzZV9oc3Zz KSA/IDAgOiAyOworCWJsaXp6YXJkX3dyaXRlX3JlZyhCTElaWkFSRF9ORElTUF9DVFJMX1NUQVRV UywgYik7CisKKwlibGl6emFyZC52c3luY19vbmx5ID0gIXVzZV9oc3ZzOworCisJZGV2X2RiZyhi bGl6emFyZC5mYmRldi0+ZGV2LAorCQkicGl4X2NsayAlbGQgSFogcGl4X3R4X3RpbWUgJWxkIHBz IGxpbmVfdXBkX3RpbWUgJWxkIHBzXG4iLAorCQlwaXhfY2xrLCBibGl6emFyZC5waXhfdHhfdGlt ZSwgYmxpenphcmQubGluZV91cGRfdGltZSk7CisJZGV2X2RiZyhibGl6emFyZC5mYmRldi0+ZGV2 LAorCQkiaHMgJWQgcHMgdnMgJWQgcHMgbW9kZSAlZCB2c3luY19vbmx5ICVkXG4iLAorCQlocywg dnMsIGIgJiAweDMsICF1c2VfaHN2cyk7CisKKwlyZXR1cm4gYmxpenphcmQuZXh0aWYtPnNldHVw X3RlYXJzeW5jKDEsIGhzLCB2cywKKwkJCQkJICAgICAgaHNfcG9sX2ludiwgdnNfcG9sX2ludiwK KwkJCQkJICAgICAgZXh0aWZfZGl2KTsKK30KKworc3RhdGljIHZvaWQgYmxpenphcmRfZ2V0X2Nh cHMoaW50IHBsYW5lLCBzdHJ1Y3Qgb21hcGZiX2NhcHMgKmNhcHMpCit7CisJYmxpenphcmQuaW50 X2N0cmwtPmdldF9jYXBzKHBsYW5lLCBjYXBzKTsKKwljYXBzLT5jdHJsIHw9IE9NQVBGQl9DQVBT X01BTlVBTF9VUERBVEUgfAorCQlPTUFQRkJfQ0FQU19XSU5ET1dfUElYRUxfRE9VQkxFIHwKKwkJ T01BUEZCX0NBUFNfV0lORE9XX1NDQUxFIHwKKwkJT01BUEZCX0NBUFNfV0lORE9XX09WRVJMQVk7 CisJaWYgKGJsaXp6YXJkLnRlX2Nvbm5lY3RlZCkKKwkJY2Fwcy0+Y3RybCB8PSBPTUFQRkJfQ0FQ U19URUFSU1lOQzsKKwljYXBzLT53bmRfY29sb3IgfD0gKDEgPDwgT01BUEZCX0NPTE9SX1JHQjU2 NSkgfAorCQkJICAgKDEgPDwgT01BUEZCX0NPTE9SX1lVVjQyMCk7Cit9CisKK3N0YXRpYyB2b2lk IF9zYXZlX3JlZ3Moc3RydWN0IGJsaXp6YXJkX3JlZ19saXN0ICpsaXN0LCBpbnQgY250KQorewor CWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrLCBsaXN0KyspIHsKKwkJaW50IHJl ZzsKKwkJZm9yIChyZWcgPSBsaXN0LT5zdGFydDsgcmVnIDw9IGxpc3QtPmVuZDsgcmVnICs9IDIp CisJCQlibGl6emFyZF9yZWdfY2FjaGVbcmVnIC8gMl0gPSBibGl6emFyZF9yZWFkX3JlZyhyZWcp OworCX0KK30KKworc3RhdGljIHZvaWQgX3Jlc3RvcmVfcmVncyhzdHJ1Y3QgYmxpenphcmRfcmVn X2xpc3QgKmxpc3QsIGludCBjbnQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250 OyBpKyssIGxpc3QrKykgeworCQlpbnQgcmVnOworCQlmb3IgKHJlZyA9IGxpc3QtPnN0YXJ0OyBy ZWcgPD0gbGlzdC0+ZW5kOyByZWcgKz0gMikKKwkJCWJsaXp6YXJkX3dyaXRlX3JlZyhyZWcsIGJs aXp6YXJkX3JlZ19jYWNoZVtyZWcgLyAyXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBibGl6emFy ZF9zYXZlX2FsbF9yZWdzKHZvaWQpCit7CisJX3NhdmVfcmVncyhibGl6emFyZF9wbGxfcmVncywg QVJSQVlfU0laRShibGl6emFyZF9wbGxfcmVncykpOworCV9zYXZlX3JlZ3MoYmxpenphcmRfZ2Vu X3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfZ2VuX3JlZ3MpKTsKK30KKworc3RhdGljIHZvaWQg YmxpenphcmRfcmVzdG9yZV9wbGxfcmVncyh2b2lkKQoreworCV9yZXN0b3JlX3JlZ3MoYmxpenph cmRfcGxsX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfcGxsX3JlZ3MpKTsKK30KKworc3RhdGlj IHZvaWQgYmxpenphcmRfcmVzdG9yZV9nZW5fcmVncyh2b2lkKQoreworCV9yZXN0b3JlX3JlZ3Mo YmxpenphcmRfZ2VuX3JlZ3MsIEFSUkFZX1NJWkUoYmxpenphcmRfZ2VuX3JlZ3MpKTsKK30KKwor c3RhdGljIHZvaWQgYmxpenphcmRfc3VzcGVuZCh2b2lkKQoreworCXUzMiBsOworCXVuc2lnbmVk IGxvbmcgdG1vOworCisJaWYgKGJsaXp6YXJkLmxhc3RfY29sb3JfbW9kZSkgeworCQl1cGRhdGVf ZnVsbF9zY3JlZW4oKTsKKwkJYmxpenphcmRfc3luYygpOworCX0KKwlibGl6emFyZC51cGRhdGVf bW9kZV9iZWZvcmVfc3VzcGVuZCA9IGJsaXp6YXJkLnVwZGF0ZV9tb2RlOworCS8qIHRoZSBmb2xs b3dpbmcgd2lsbCBkaXNhYmxlIGNsb2NrcyBhcyB3ZWxsICovCisJYmxpenphcmRfc2V0X3VwZGF0 ZV9tb2RlKE9NQVBGQl9VUERBVEVfRElTQUJMRUQpOworCisJYmxpenphcmRfc2F2ZV9hbGxfcmVn cygpOworCisJYmxpenphcmRfc3RvcF9zZHJhbSgpOworCisJbCA9IGJsaXp6YXJkX3JlYWRfcmVn KEJMSVpaQVJEX1BPV0VSX1NBVkUpOworCS8qIFN0YW5kYnksIFNsZWVwLiBXZSBhc3N1bWUgd2Ug dXNlIGFuIGV4dGVybmFsIGNsb2NrLiAqLworCWwgfD0gMHgwMzsKKwlibGl6emFyZF93cml0ZV9y ZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSwgbCk7CisKKwl0bW8gPSBqaWZmaWVzICsgbXNlY3NfdG9f amlmZmllcygxMDApOworCXdoaWxlICghKGJsaXp6YXJkX3JlYWRfcmVnKEJMSVpaQVJEX1BMTF9N T0RFKSAmICgxIDw8IDEpKSkgeworCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0bW8pKSB7CisJ CQlkZXZfZXJyKGJsaXp6YXJkLmZiZGV2LT5kZXYsCisJCQkJInMxZDEzNzR4OiBzbGVlcCB0aW1l b3V0LCBzdG9wcGluZyBQTEwgbWFudWFsbHlcbiIpOworCQkJbCA9IGJsaXp6YXJkX3JlYWRfcmVn KEJMSVpaQVJEX1BMTF9NT0RFKTsKKwkJCWwgJj0gfjB4MDM7CisJCQkvKiBEaXNhYmxlIFBMTCwg Y291bnRlciBmdW5jdGlvbiAqLworCQkJbCB8PSAweDI7CisJCQlibGl6emFyZF93cml0ZV9yZWco QkxJWlpBUkRfUExMX01PREUsIGwpOworCQkJYnJlYWs7CisJCX0KKwkJbXNsZWVwKDEpOworCX0K KworCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rv d24oYmxpenphcmQuZmJkZXYtPmRldik7Cit9CisKK3N0YXRpYyB2b2lkIGJsaXp6YXJkX3Jlc3Vt ZSh2b2lkKQoreworCXUzMiBsOworCisJaWYgKGJsaXp6YXJkLnBvd2VyX3VwICE9IE5VTEwpCisJ CWJsaXp6YXJkLnBvd2VyX3VwKGJsaXp6YXJkLmZiZGV2LT5kZXYpOworCisJbCA9IGJsaXp6YXJk X3JlYWRfcmVnKEJMSVpaQVJEX1BPV0VSX1NBVkUpOworCS8qIFN0YW5kYnksIFNsZWVwICovCisJ bCAmPSB+MHgwMzsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRfUE9XRVJfU0FWRSwgbCk7 CisKKwlibGl6emFyZF9yZXN0b3JlX3BsbF9yZWdzKCk7CisJbCA9IGJsaXp6YXJkX3JlYWRfcmVn KEJMSVpaQVJEX1BMTF9NT0RFKTsKKwlsICY9IH4weDAzOworCS8qIEVuYWJsZSBQTEwsIGNvdW50 ZXIgZnVuY3Rpb24gKi8KKwlsIHw9IDB4MTsKKwlibGl6emFyZF93cml0ZV9yZWcoQkxJWlpBUkRf UExMX01PREUsIGwpOworCisJd2hpbGUgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExM X0RJVikgJiAoMSA8PCA3KSkpCisJCW1zbGVlcCgxKTsKKworCWJsaXp6YXJkX3Jlc3RhcnRfc2Ry YW0oKTsKKworCWJsaXp6YXJkX3Jlc3RvcmVfZ2VuX3JlZ3MoKTsKKworCS8qIEVuYWJsZSBkaXNw bGF5ICovCisJYmxpenphcmRfd3JpdGVfcmVnKEJMSVpaQVJEX0RJU1BMQVlfTU9ERSwgMHgwMSk7 CisKKwkvKiB0aGUgZm9sbG93aW5nIHdpbGwgZW5hYmxlIGNsb2NrcyBhcyBuZWNlc3NhcnkgKi8K KwlibGl6emFyZF9zZXRfdXBkYXRlX21vZGUoYmxpenphcmQudXBkYXRlX21vZGVfYmVmb3JlX3N1 c3BlbmQpOworCisJLyogRm9yY2UgYSBiYWNrZ3JvdW5kIHVwZGF0ZSAqLworCWJsaXp6YXJkLnpv b21fb24gPSAxOworCXVwZGF0ZV9mdWxsX3NjcmVlbigpOworCWJsaXp6YXJkX3N5bmMoKTsKK30K Kworc3RhdGljIGludCBibGl6emFyZF9pbml0KHN0cnVjdCBvbWFwZmJfZGV2aWNlICpmYmRldiwg aW50IGV4dF9tb2RlLAorCQkJIHN0cnVjdCBvbWFwZmJfbWVtX2Rlc2MgKnJlcV92cmFtKQorewor CWludCByID0gMCwgaTsKKwl1OCByZXYsIGNvbmY7CisJdW5zaWduZWQgbG9uZyBleHRfY2xrOwor CWludCBleHRpZl9kaXY7CisJdW5zaWduZWQgbG9uZyBzeXNfY2xrLCBwaXhfY2xrOworCXN0cnVj dCBvbWFwZmJfcGxhdGZvcm1fZGF0YSAqb21hcGZiX2NvbmY7CisJc3RydWN0IGJsaXp6YXJkX3Bs YXRmb3JtX2RhdGEgKmN0cmxfY29uZjsKKworCWJsaXp6YXJkLmZiZGV2ID0gZmJkZXY7CisKKwlC VUdfT04oIWZiZGV2LT5leHRfaWYgfHwgIWZiZGV2LT5pbnRfY3RybCk7CisKKwlibGl6emFyZC5m YmRldiA9IGZiZGV2OworCWJsaXp6YXJkLmV4dGlmID0gZmJkZXYtPmV4dF9pZjsKKwlibGl6emFy ZC5pbnRfY3RybCA9IGZiZGV2LT5pbnRfY3RybDsKKworCW9tYXBmYl9jb25mID0gZmJkZXYtPmRl di0+cGxhdGZvcm1fZGF0YTsKKwljdHJsX2NvbmYgPSBvbWFwZmJfY29uZi0+Y3RybF9wbGF0Zm9y bV9kYXRhOworCWlmIChjdHJsX2NvbmYgPT0gTlVMTCB8fCBjdHJsX2NvbmYtPmdldF9jbG9ja19y YXRlID09IE5VTEwpIHsKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiczFkMTM3NHg6IG1pc3Npbmcg cGxhdGZvcm0gZGF0YVxuIik7CisJCXIgPSAtRU5PRU5UOworCQlnb3RvIGVycjE7CisJfQorCisJ YmxpenphcmQucG93ZXJfZG93biA9IGN0cmxfY29uZi0+cG93ZXJfZG93bjsKKwlibGl6emFyZC5w b3dlcl91cCA9IGN0cmxfY29uZi0+cG93ZXJfdXA7CisKKwlzcGluX2xvY2tfaW5pdCgmYmxpenph cmQucmVxX2xvY2spOworCisJaWYgKChyID0gYmxpenphcmQuaW50X2N0cmwtPmluaXQoZmJkZXYs IDEsIHJlcV92cmFtKSkgPCAwKQorCQlnb3RvIGVycjE7CisKKwlpZiAoKHIgPSBibGl6emFyZC5l eHRpZi0+aW5pdChmYmRldikpIDwgMCkKKwkJZ290byBlcnIyOworCisJYmxpenphcmRfY3RybC5z ZXRfY29sb3Jfa2V5ID0gYmxpenphcmQuaW50X2N0cmwtPnNldF9jb2xvcl9rZXk7CisJYmxpenph cmRfY3RybC5nZXRfY29sb3Jfa2V5ID0gYmxpenphcmQuaW50X2N0cmwtPmdldF9jb2xvcl9rZXk7 CisJYmxpenphcmRfY3RybC5zZXR1cF9tZW0gPSBibGl6emFyZC5pbnRfY3RybC0+c2V0dXBfbWVt OworCWJsaXp6YXJkX2N0cmwubW1hcCA9IGJsaXp6YXJkLmludF9jdHJsLT5tbWFwOworCisJZXh0 X2NsayA9IGN0cmxfY29uZi0+Z2V0X2Nsb2NrX3JhdGUoZmJkZXYtPmRldik7CisJaWYgKChyID0g Y2FsY19leHRpZl90aW1pbmdzKGV4dF9jbGssICZleHRpZl9kaXYpKSA8IDApCisJCWdvdG8gZXJy MzsKKworCXNldF9leHRpZl90aW1pbmdzKCZibGl6emFyZC5yZWdfdGltaW5ncyk7CisKKwlpZiAo YmxpenphcmQucG93ZXJfdXAgIT0gTlVMTCkKKwkJYmxpenphcmQucG93ZXJfdXAoZmJkZXYtPmRl dik7CisKKwljYWxjX2JsaXp6YXJkX2Nsa19yYXRlcyhleHRfY2xrLCAmc3lzX2NsaywgJnBpeF9j bGspOworCisJaWYgKChyID0gY2FsY19leHRpZl90aW1pbmdzKHN5c19jbGssICZleHRpZl9kaXYp KSA8IDApCisJCWdvdG8gZXJyMzsKKwlzZXRfZXh0aWZfdGltaW5ncygmYmxpenphcmQucmVnX3Rp bWluZ3MpOworCisJaWYgKCEoYmxpenphcmRfcmVhZF9yZWcoQkxJWlpBUkRfUExMX0RJVikgJiAw eDgwKSkgeworCQlkZXZfZXJyKGZiZGV2LT5kZXYsCisJCQkiY29udHJvbGxlciBub3QgaW5pdGlh bGl6ZWQgYnkgdGhlIGJvb3Rsb2FkZXJcbiIpOworCQlyID0gLUVOT0RFVjsKKwkJZ290byBlcnIz OworCX0KKworCWlmIChjdHJsX2NvbmYtPnRlX2Nvbm5lY3RlZCkgeworCQlpZiAoKHIgPSBzZXR1 cF90ZWFyc3luYyhwaXhfY2xrLCBleHRpZl9kaXYpKSA8IDApCisJCQlnb3RvIGVycjM7CisJCWJs aXp6YXJkLnRlX2Nvbm5lY3RlZCA9IDE7CisJfQorCisJcmV2ID0gYmxpenphcmRfcmVhZF9yZWco QkxJWlpBUkRfUkVWX0NPREUpOworCWNvbmYgPSBibGl6emFyZF9yZWFkX3JlZyhCTElaWkFSRF9D T05GSUcpOworCisJc3dpdGNoIChyZXYgJiAweGZjKSB7CisJY2FzZSAweDljOgorCQlibGl6emFy ZC52ZXJzaW9uID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NDsKKwkJcHJfaW5mbygib21hcGZi OiBzMWQxMzc0NCBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImluaXRpYWxpemVkIChDTkYg cGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKwkJYnJlYWs7CisJY2FzZSAw eGE0OgorCQlibGl6emFyZC52ZXJzaW9uID0gQkxJWlpBUkRfVkVSU0lPTl9TMUQxMzc0NTsKKwkJ cHJfaW5mbygib21hcGZiOiBzMWQxMzc0NSBMQ0QgY29udHJvbGxlciByZXYgJWQgIgorCQkJImlu aXRpYWxpemVkIChDTkYgcGlucyAleClcbiIsIHJldiAmIDB4MDMsIGNvbmYgJiAweDA3KTsKKwkJ YnJlYWs7CisJZGVmYXVsdDoKKwkJZGV2X2VycihmYmRldi0+ZGV2LCAiaW52YWxpZCBzMWQxMzc0 eCByZXZpc2lvbiAlMDJ4XG4iLAorCQkJcmV2KTsKKwkJciA9IC1FTk9ERVY7CisJCWdvdG8gZXJy MzsKKwl9CisKKwlibGl6emFyZC5tYXhfdHJhbnNtaXRfc2l6ZSA9IGJsaXp6YXJkLmV4dGlmLT5t YXhfdHJhbnNtaXRfc2l6ZTsKKworCWJsaXp6YXJkLnVwZGF0ZV9tb2RlID0gT01BUEZCX1VQREFU RV9ESVNBQkxFRDsKKworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy54ID0gMDsKKwlibGl6 emFyZC5hdXRvX3VwZGF0ZV93aW5kb3cueSA9IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2lu ZG93LndpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV93 aW5kb3cuaGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKwlibGl6emFyZC5hdXRvX3VwZGF0 ZV93aW5kb3cub3V0X3ggPSAwOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5vdXRfeCA9 IDA7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF93aWR0aCA9IGZiZGV2LT5wYW5l bC0+eF9yZXM7CisJYmxpenphcmQuYXV0b191cGRhdGVfd2luZG93Lm91dF9oZWlnaHQgPSBmYmRl di0+cGFuZWwtPnlfcmVzOworCWJsaXp6YXJkLmF1dG9fdXBkYXRlX3dpbmRvdy5mb3JtYXQgPSAw OworCisJYmxpenphcmQuc2NyZWVuX3dpZHRoID0gZmJkZXYtPnBhbmVsLT54X3JlczsKKwlibGl6 emFyZC5zY3JlZW5faGVpZ2h0ID0gZmJkZXYtPnBhbmVsLT55X3JlczsKKworCWluaXRfdGltZXIo JmJsaXp6YXJkLmF1dG9fdXBkYXRlX3RpbWVyKTsKKwlibGl6emFyZC5hdXRvX3VwZGF0ZV90aW1l ci5mdW5jdGlvbiA9IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXV0bzsKKwlibGl6emFyZC5hdXRv X3VwZGF0ZV90aW1lci5kYXRhID0gMDsKKworCUlOSVRfTElTVF9IRUFEKCZibGl6emFyZC5mcmVl X3JlcV9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmYmxpenphcmQucGVuZGluZ19yZXFfbGlzdCk7 CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYmxpenphcmQucmVxX3Bvb2wpOyBpKyspCisJ CWxpc3RfYWRkKCZibGl6emFyZC5yZXFfcG9vbFtpXS5lbnRyeSwgJmJsaXp6YXJkLmZyZWVfcmVx X2xpc3QpOworCUJVR19PTihpIDw9IElSUV9SRVFfUE9PTF9TSVpFKTsKKwlzZW1hX2luaXQoJmJs aXp6YXJkLnJlcV9zZW1hLCBpIC0gSVJRX1JFUV9QT09MX1NJWkUpOworCisJcmV0dXJuIDA7Citl cnIzOgorCWlmIChibGl6emFyZC5wb3dlcl9kb3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2Vy X2Rvd24oZmJkZXYtPmRldik7CisJYmxpenphcmQuZXh0aWYtPmNsZWFudXAoKTsKK2VycjI6CisJ YmxpenphcmQuaW50X2N0cmwtPmNsZWFudXAoKTsKK2VycjE6CisJcmV0dXJuIHI7Cit9CisKK3N0 YXRpYyB2b2lkIGJsaXp6YXJkX2NsZWFudXAodm9pZCkKK3sKKwlibGl6emFyZF9zZXRfdXBkYXRl X21vZGUoT01BUEZCX1VQREFURV9ESVNBQkxFRCk7CisJYmxpenphcmQuZXh0aWYtPmNsZWFudXAo KTsKKwlibGl6emFyZC5pbnRfY3RybC0+Y2xlYW51cCgpOworCWlmIChibGl6emFyZC5wb3dlcl9k b3duICE9IE5VTEwpCisJCWJsaXp6YXJkLnBvd2VyX2Rvd24oYmxpenphcmQuZmJkZXYtPmRldik7 Cit9CisKK3N0cnVjdCBsY2RfY3RybCBibGl6emFyZF9jdHJsID0geworCS5uYW1lCQkJPSAiYmxp enphcmQiLAorCS5pbml0CQkJPSBibGl6emFyZF9pbml0LAorCS5jbGVhbnVwCQk9IGJsaXp6YXJk X2NsZWFudXAsCisJLmJpbmRfY2xpZW50CQk9IGJsaXp6YXJkX2JpbmRfY2xpZW50LAorCS5nZXRf Y2FwcwkJPSBibGl6emFyZF9nZXRfY2FwcywKKwkuc2V0X3VwZGF0ZV9tb2RlCT0gYmxpenphcmRf c2V0X3VwZGF0ZV9tb2RlLAorCS5nZXRfdXBkYXRlX21vZGUJPSBibGl6emFyZF9nZXRfdXBkYXRl X21vZGUsCisJLnNldHVwX3BsYW5lCQk9IGJsaXp6YXJkX3NldHVwX3BsYW5lLAorCS5zZXRfc2Nh bGUJCT0gYmxpenphcmRfc2V0X3NjYWxlLAorCS5lbmFibGVfcGxhbmUJCT0gYmxpenphcmRfZW5h YmxlX3BsYW5lLAorCS51cGRhdGVfd2luZG93CQk9IGJsaXp6YXJkX3VwZGF0ZV93aW5kb3dfYXN5 bmMsCisJLnN5bmMJCQk9IGJsaXp6YXJkX3N5bmMsCisJLnN1c3BlbmQJCT0gYmxpenphcmRfc3Vz cGVuZCwKKwkucmVzdW1lCQkJPSBibGl6emFyZF9yZXN1bWUsCit9OworCi0tIAoxLjUuMAoK ------=_Part_17649_32930072.1182862660335-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/