From mboxrd@z Thu Jan 1 00:00:00 1970 From: Noboru Iwamatsu Subject: [RFC][PATCH 2/4] PVUSB: frontend driver Date: Tue, 17 Mar 2009 09:47:30 +0900 Message-ID: <49BEF322.6080308@jp.fujitsu.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------000208080901030502080408" Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xensource.com Errors-To: xen-devel-bounces@lists.xensource.com To: xen-devel@lists.xensource.com List-Id: xen-devel@lists.xenproject.org This is a multi-part message in MIME format. --------------000208080901030502080408 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit This patch adds the PVUSB frontend driver. Signed-off-by: Noboru Iwamatsu --------------000208080901030502080408 Content-Type: text/plain; name="pvusb_usbfront.patch" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="pvusb_usbfront.patch" ZGlmZiAtciA1MWRlY2MzOWU1ZTcgLXIgOWVmMmU4YzZjZjNkIGRyaXZlcnMveGVuL3VzYmZy b250L01ha2VmaWxlCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcwICsw MDAwCisrKyBiL2RyaXZlcnMveGVuL3VzYmZyb250L01ha2VmaWxlCU1vbiBNYXIgMTYgMTg6 NDE6MTIgMjAwOSArMDkwMApAQCAtMCwwICsxLDcgQEAKK29iai0kKENPTkZJR19YRU5fVVNC X0ZST05URU5EKSA6PSB4ZW4taGNkLm8KKworeGVuLWhjZC15ICAgOj0gdXNiZnJvbnQtaGNk Lm8geGVuYnVzLm8KKworaWZlcSAoJChDT05GSUdfWEVOX1VTQl9GUk9OVEVORF9IQ0RfU1RB VFMpLHkpCitFWFRSQV9DRkxBR1MgKz0gLURYRU5IQ0RfU1RBVFMKK2VuZGlmCmRpZmYgLXIg NTFkZWNjMzllNWU3IC1yIDllZjJlOGM2Y2YzZCBkcml2ZXJzL3hlbi91c2Jmcm9udC91c2Jm cm9udC1kYmcuYwotLS0gL2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAw MAorKysgYi9kcml2ZXJzL3hlbi91c2Jmcm9udC91c2Jmcm9udC1kYmcuYwlNb24gTWFyIDE2 IDE4OjQxOjEyIDIwMDkgKzA5MDAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIHVzYmZyb250 LWRiZy5jCisgKgorICogWGVuIFVTQiBWaXJ0dWFsIEhvc3QgQ29udHJvbGxlciAtIGRlYnVn Z2luZworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgRlVKSVRTVSBMQUJPUkFUT1JJRVMg TFRELgorICogQXV0aG9yOiBOb2JvcnUgSXdhbWF0c3UgPG5faXdhbWF0c3VAanAuZnVqaXRz dS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBM aWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq CisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3 aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBl dmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJh bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl CisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cu Z251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIG9yLAorICoKKyAqIFdoZW4gZGlzdHJpYnV0 ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGlu dG8KKyAqIG90aGVyIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dp bmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVl IG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlz IHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29m dHdhcmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rp b24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNl LCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNl LCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1p dCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8g c28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBh Ym92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxs IGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25z IG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFT IElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1Q TElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBN RVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMg T1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMg T1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4g Q09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBE RUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworc3RhdGljIHNzaXplX3Qgc2hvd19z dGF0aXN0aWNzKHN0cnVjdCBjbGFzc19kZXZpY2UgKmNsYXNzX2RldiwgY2hhciAqYnVmKQor eworCXN0cnVjdCB1c2JfYnVzICpidXM7CisJc3RydWN0IHVzYl9oY2QgKmhjZDsKKwlzdHJ1 Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2ln bmVkIHRlbXAsIHNpemU7CisJY2hhciAqbmV4dDsKKworCWJ1cyA9IGNsYXNzX2dldF9kZXZk YXRhKGNsYXNzX2Rldik7CisJaGNkID0gYnVzLT5oY3ByaXY7CisJaW5mbyA9IGhjZF90b19p bmZvKGhjZCk7CisJbmV4dCA9IGJ1ZjsKKwlzaXplID0gUEFHRV9TSVpFOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCXRlbXAgPSBzY25wcmludGYg KG5leHQsIHNpemUsCisJCQkiYnVzICVzLCBkZXZpY2UgJXNcbiIKKwkJCSIlc1xuIgorCQkJ InhlbmhjZCwgaGNkIHN0YXRlICVkXG4iLAorCQkJaGNkLT5zZWxmLmNvbnRyb2xsZXItPmJ1 cy0+bmFtZSwKKwkJCWhjZC0+c2VsZi5jb250cm9sbGVyLT5idXNfaWQsCisJCQloY2QtPnBy b2R1Y3RfZGVzYywKKwkJCWhjZC0+c3RhdGUpOworCXNpemUgLT0gdGVtcDsKKwluZXh0ICs9 IHRlbXA7CisKKyNpZmRlZiBYRU5IQ0RfU1RBVFMKKwl0ZW1wID0gc2NucHJpbnRmKG5leHQs IHNpemUsCisJCSJjb21wbGV0ZSAlbGQgdW5saW5rICVsZCByaW5nX2Z1bGwgJWxkXG4iLAor CQlpbmZvLT5zdGF0cy5jb21wbGV0ZSwgaW5mby0+c3RhdHMudW5saW5rLCBpbmZvLT5zdGF0 cy5yaW5nX2Z1bGwpOworCXNpemUgLT0gdGVtcDsKKwluZXh0ICs9IHRlbXA7CisjZW5kaWYK KworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCXJl dHVybiBQQUdFX1NJWkUgLSBzaXplOworfQorCitzdGF0aWMgQ0xBU1NfREVWSUNFX0FUVFIo c3RhdGlzdGljcywgU19JUlVHTywgc2hvd19zdGF0aXN0aWNzLCBOVUxMKTsKKworc3RhdGlj IGlubGluZSB2b2lkIGNyZWF0ZV9kZWJ1Z19maWxlKHN0cnVjdCB1c2Jmcm9udF9pbmZvICpp bmZvKQoreworCXN0cnVjdCBjbGFzc19kZXZpY2UgKmNsZGV2ID0gaW5mb190b19oY2QoaW5m byktPnNlbGYuY2xhc3NfZGV2OworCWNsYXNzX2RldmljZV9jcmVhdGVfZmlsZShjbGRldiwg JmNsYXNzX2RldmljZV9hdHRyX3N0YXRpc3RpY3MpOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgcmVtb3ZlX2RlYnVnX2ZpbGUoc3RydWN0IHVzYmZyb250X2luZm8gKmluZm8pCit7CisJ c3RydWN0IGNsYXNzX2RldmljZSAqY2xkZXYgPSBpbmZvX3RvX2hjZChpbmZvKS0+c2VsZi5j bGFzc19kZXY7CisJY2xhc3NfZGV2aWNlX3JlbW92ZV9maWxlKGNsZGV2LCAmY2xhc3NfZGV2 aWNlX2F0dHJfc3RhdGlzdGljcyk7Cit9CmRpZmYgLXIgNTFkZWNjMzllNWU3IC1yIDllZjJl OGM2Y2YzZCBkcml2ZXJzL3hlbi91c2Jmcm9udC91c2Jmcm9udC1oY2QuYwotLS0gL2Rldi9u dWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9kcml2ZXJzL3hlbi91 c2Jmcm9udC91c2Jmcm9udC1oY2QuYwlNb24gTWFyIDE2IDE4OjQxOjEyIDIwMDkgKzA5MDAK QEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiB1c2Jmcm9udC1oY2QuYworICoKKyAqIFhlbiBV U0IgVmlydHVhbCBIb3N0IENvbnRyb2xsZXIgZHJpdmVyCisgKgorICogQ29weXJpZ2h0IChD KSAyMDA5LCBGVUpJVFNVIExBQk9SQVRPUklFUyBMVEQuCisgKiBBdXRob3I6IE5vYm9ydSBJ d2FtYXRzdSA8bl9pd2FtYXRzdUBqcC5mdWppdHN1LmNvbT4KKyAqCisgKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMg TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBv cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0 cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS UE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl IGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9n cmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKgor ICogb3IsCisgKgorICogV2hlbiBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIExp bnV4IGtlcm5lbCBvciBpbmNvcnBvcmF0ZWQgaW50bworICogb3RoZXIgc29mdHdhcmUgcGFj a2FnZXMsIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBsaWNlbnNlOgorICoKKyAqIFBlcm1p c3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29u IG9idGFpbmluZyBhIGNvcHkKKyAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQg ZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0bworICogZGVhbCBpbiB0 aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGlt aXRhdGlvbiB0aGUKKyAqIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1 Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vcgorICogc2VsbCBjb3BpZXMg b2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29m dHdhcmUgaXMKKyAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93 aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5k IHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBj b3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAq IFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9G IEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBM SU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5F U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5P IEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBM SUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFS SVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRX QVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4K KyAqLworCisjaW5jbHVkZSAidXNiZnJvbnQuaCIKKyNpbmNsdWRlICJ1c2Jmcm9udC1kYmcu YyIKKyNpbmNsdWRlICJ1c2Jmcm9udC1odWIuYyIKKyNpbmNsdWRlICJ1c2Jmcm9udC1xLmMi CisKK3N0YXRpYyB2b2lkIHhlbmhjZF93YXRjaGRvZyh1bnNpZ25lZCBsb25nIHBhcmFtKQor eworCXN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvID0gKHN0cnVjdCB1c2Jmcm9udF9pbmZv ICopIHBhcmFtOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2 ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCWlmIChIQ19JU19SVU5OSU5HKGluZm9fdG9faGNk KGluZm8pLT5zdGF0ZSkpIHsKKwkJdGltZXJfYWN0aW9uX2RvbmUoaW5mbywgVElNRVJfUklO R19XQVRDSERPRyk7CisJCXhlbmhjZF9naXZlYmFja191bmxpbmtlZF91cmJzKGluZm8pOwor CQl4ZW5oY2Rfa2lja19wZW5kaW5nX3VyYnMoaW5mbyk7CisJfQorCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIG9uZS10aW1lIEhD IGluaXQKKyAqLworc3RhdGljIGludCB4ZW5oY2Rfc2V0dXAoc3RydWN0IHVzYl9oY2QgKmhj ZCkKK3sKKwlzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbyA9IGhjZF90b19pbmZvKGhjZCk7 CisKKwlzcGluX2xvY2tfaW5pdCgmaW5mby0+bG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJmlu Zm8tPnBlbmRpbmdfdXJicyk7CisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPmlucHJvZ3Jlc3Nf dXJicyk7CisJSU5JVF9MSVNUX0hFQUQoJmluZm8tPnVubGlua2VkX3VyYnMpOworCWluaXRf dGltZXIoJmluZm8tPndhdGNoZG9nKTsKKwlpbmZvLT53YXRjaGRvZy5mdW5jdGlvbiA9IHhl bmhjZF93YXRjaGRvZzsKKwlpbmZvLT53YXRjaGRvZy5kYXRhID0gKHVuc2lnbmVkIGxvbmcp IGluZm87CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBzdGFydCBIQyBydW5uaW5nCisgKi8K K3N0YXRpYyBpbnQgeGVuaGNkX3J1bihzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCWhjZC0+ dXNlc19uZXdfcG9sbGluZyA9IDE7CisJaGNkLT5wb2xsX3JoID0gMDsKKwloY2QtPnN0YXRl ID0gSENfU1RBVEVfUlVOTklORzsKKwljcmVhdGVfZGVidWdfZmlsZShoY2RfdG9faW5mbyho Y2QpKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIHN0b3AgcnVubmluZyBIQworICovCitz dGF0aWMgdm9pZCB4ZW5oY2Rfc3RvcChzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXN0cnVj dCB1c2Jmcm9udF9pbmZvICppbmZvID0gaGNkX3RvX2luZm8oaGNkKTsKKworCWRlbF90aW1l cl9zeW5jKCZpbmZvLT53YXRjaGRvZyk7CisJcmVtb3ZlX2RlYnVnX2ZpbGUoaW5mbyk7CisJ c3Bpbl9sb2NrX2lycSgmaW5mby0+bG9jayk7CisJLyoKKwkgKiBUT0RPOiBwb3J0IHBvd2Vy IG9mZiwgY2FuY2VsIGFsbCB1cmJzLgorCSAqLworCisJaWYgKEhDX0lTX1JVTk5JTkcoaGNk LT5zdGF0ZSkpCisJCWhjZC0+c3RhdGUgPSBIQ19TVEFURV9IQUxUOworCXNwaW5fdW5sb2Nr X2lycSgmaW5mby0+bG9jayk7Cit9CisKKy8qCisgKiBUT0RPOiBpbmNvbXBsZXRlIHN1c3Bl bmQvcmVzdW1lIGZ1bmN0aW9ucyEKKyAqLworI2lmIDAKKyNpZmRlZiBDT05GSUdfUE0KKy8q CisgKiBzdXNwZW5kIHJ1bm5pbmcgSEMKKyAqLworc3RhdGljIGludCB4ZW5oY2Rfc3VzcGVu ZChzdHJ1Y3QgdXNiX2hjZCAqaGNkLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1 Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbyA9IGhjZF90b19pbmZvKGhjZCk7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZpbmZv LT5sb2NrLCBmbGFncyk7CisJaWYgKGhjZC0+c3RhdGUgIT0gSENfU1RBVEVfU1VTUEVOREVE KSB7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8gZG9uZTsKKwl9CisKKwkvKgorCSAqIFRP RE86CisJICogCWNhbmNlbGluZyBhbGwgdHJhbnNmZXIsIGNsZWFyIGFsbCBoYyBxdWV1ZSwK KwkgKiAJc3RvcCBrdGhyZWFkLAorCSAqLworCisJY2xlYXJfYml0KEhDRF9GTEFHX0hXX0FD Q0VTU0lCTEUsICZoY2QtPmZsYWdzKTsKK2RvbmU6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIHJl c3VtZSBIQworICovCitzdGF0aWMgaW50IHhlbmhjZF9yZXN1bWUoc3RydWN0IHVzYl9oY2Qg KmhjZCkKK3sKKwlzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbyA9IGhjZF90b19pbmZvKGhj ZCk7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzZXRfYml0KEhDRF9GTEFHX0hXX0FDQ0VT U0lCTEUsICZoY2QtPmZsYWdzKTsKKworCS8qCisJICogVE9ETzoKKwkgKiAJcmUtaW5pdCBI Qy4KKwkgKiAJcmVzdW1lIGFsbCByb290aHViIHBvcnRzLgorCSAqLworCisJcmV0dXJuIHJl dDsKK30KKyNlbmRpZgorI2VuZGlmCisKKy8qCisgKiBjYWxsZWQgYXMgLnVyYl9lbnF1ZXVl KCkKKyAqIG5vbi1lcnJvciByZXR1cm5zIGFyZSBwcm9taXNlIHRvIGdpdmViYWNrIHRoZSB1 cmIgbGF0ZXIKKyAqLworc3RhdGljIGludCB4ZW5oY2RfdXJiX2VucXVldWUoc3RydWN0IHVz Yl9oY2QgKmhjZCwKKwkJCQkgICAgc3RydWN0IHVzYl9ob3N0X2VuZHBvaW50ICplcCwKKwkJ CQkgICAgc3RydWN0IHVyYiAqdXJiLAorCQkJCSAgICBnZnBfdCBtZW1fZmxhZ3MpCit7CisJ c3RydWN0IHVzYmZyb250X2luZm8gKmluZm8gPSBoY2RfdG9faW5mbyhoY2QpOworCXN0cnVj dCB1cmJfcHJpdiAqdXJicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAw OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCXVyYnAg PSBhbGxvY191cmJfcHJpdih1cmIpOworCWlmICghdXJicCkgeworCQlyZXQgPSAtRU5PTUVN OworCQlnb3RvIGRvbmU7CisJfQorCisJcmV0ID0geGVuaGNkX3N1Ym1pdF91cmIoaW5mbywg dXJicCk7CisJaWYgKHJldCAhPSAwKQorCQlmcmVlX3VyYl9wcml2KHVyYnApOworCitkb25l OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1 cm4gcmV0OworfQorCisvKgorICogY2FsbGVkIGFzIC51cmJfZGVxdWV1ZSgpCisgKgorICog anVzdCBtYXJrIHRoZSB1cmIgYXMgdW5saW5rZWQKKyAqIGlmIHRoZSB1cmIgaXMgaW4gcGVu ZGluZ191cmJzLCBtb3ZlIHRvIHVubGlua2VkX3VyYnMKKyAqIFRPRE86CisgKiAJY2FuY2Vs aW5nIHRoZSB1cmIgdHJhbnNmZXIgaW4gYmFja2VuZAorICovCitzdGF0aWMgaW50IHhlbmhj ZF91cmJfZGVxdWV1ZShzdHJ1Y3QgdXNiX2hjZCAqaGNkLAorCQkJCSAgICBzdHJ1Y3QgdXJi ICp1cmIpCit7CisJc3RydWN0IHVzYmZyb250X2luZm8gKmluZm8gPSBoY2RfdG9faW5mbyho Y2QpOworCXN0cnVjdCB1cmJfcHJpdiAqdXJicDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdz KTsKKworCXVyYnAgPSB1cmItPmhjcHJpdjsKKwlpZiAoIXVyYnApCisJCWdvdG8gZG9uZTsK KworCXJldCA9IHhlbmhjZF91bmxpbmtfdXJiKGluZm8sIHVyYnApOworCitkb25lOgorCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0 OworfQorCisvKgorICogY2FsbGVkIGZyb20gdXNiX2dldF9jdXJyZW50X2ZyYW1lX251bWJl cigpLAorICogYnV0LCBhbG1vc3QgYWxsIGRyaXZlcnMgbm90IHVzZSBzdWNoIGZ1bmN0aW9u LgorICovCitzdGF0aWMgaW50IHhlbmhjZF9nZXRfZnJhbWUoc3RydWN0IHVzYl9oY2QgKmhj ZCkKK3sKKwkvKiBpdCBtZWFucyBlcnJvciwgYnV0IHByb2JhYmx5IG5vIHByb2JsZW0gOi0p ICovCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUT0RPOgorICogc3VzcGVuZC9yZXN1bWUg d2hvbGUgaGNkIGFuZCByb290aHViCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGhjZF9uYW1l W10gPSAieGVuX2hjZCI7CisKK3N0cnVjdCBoY19kcml2ZXIgdXNiZnJvbnRfaGNfZHJpdmVy ID0geworCS5kZXNjcmlwdGlvbiA9IGhjZF9uYW1lLAorCS5wcm9kdWN0X2Rlc2MgPSBEUklW RVJfREVTQywKKwkuaGNkX3ByaXZfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgdXNiZnJvbnRfaW5m byksCisJLmZsYWdzID0gSENEX1VTQjIsCisKKwkvKgorCSAqIGJhc2ljIEhDIGxpZmVjeWNs ZSBvcGVyYXRpb25zCisJICovCisJLnJlc2V0ID0geGVuaGNkX3NldHVwLAorCS5zdGFydCA9 IHhlbmhjZF9ydW4sCisJLnN0b3AgPSB4ZW5oY2Rfc3RvcCwKKyNpZiAwCisjaWZkZWYgQ09O RklHX1BNCisJLnN1c3BlbmQgPSB4ZW5oY2Rfc3VzcGVuZCwKKwkucmVzdW1lID0geGVuaGNk X3Jlc3VtZSwKKyNlbmRpZgorI2VuZGlmCisJLyoKKwkgKiBtYW5hZ2luZyB1cmIgSS9PCisJ ICovCisJLnVyYl9lbnF1ZXVlID0geGVuaGNkX3VyYl9lbnF1ZXVlLAorCS51cmJfZGVxdWV1 ZSA9IHhlbmhjZF91cmJfZGVxdWV1ZSwKKwkuZ2V0X2ZyYW1lX251bWJlciA9IHhlbmhjZF9n ZXRfZnJhbWUsCisKKwkvKgorCSAqIHJvb3QgaHViIG9wZXJhdGlvbnMKKwkgKi8KKwkuaHVi X3N0YXR1c19kYXRhID0geGVuaGNkX2h1Yl9zdGF0dXNfZGF0YSwKKwkuaHViX2NvbnRyb2wg PSB4ZW5oY2RfaHViX2NvbnRyb2wsCisjaWYgMAorI2lmZGVmIENPTkZJR19QTQorCS5idXNf c3VzcGVuZCA9IHhlbmhjZF9idXNfc3VzcGVuZCwKKwkuYnVzX3Jlc3VtZSA9IHhlbmhjZF9i dXNfcmVzdW1lLAorI2VuZGlmCisjZW5kaWYKK307CmRpZmYgLXIgNTFkZWNjMzllNWU3IC1y IDllZjJlOGM2Y2YzZCBkcml2ZXJzL3hlbi91c2Jmcm9udC91c2Jmcm9udC1odWIuYwotLS0g L2Rldi9udWxsCVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9kcml2ZXJz L3hlbi91c2Jmcm9udC91c2Jmcm9udC1odWIuYwlNb24gTWFyIDE2IDE4OjQxOjEyIDIwMDkg KzA5MDAKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiB1c2Jmcm9udC1odWIuYworICoKKyAq IFhlbiBVU0IgVmlydHVhbCBIb3N0IENvbnRyb2xsZXIgLSBSb290IEh1YiBFbXVsYXRpb25z CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBGVUpJVFNVIExBQk9SQVRPUklFUyBMVEQu CisgKiBBdXRob3I6IE5vYm9ydSBJd2FtYXRzdSA8bl9pd2FtYXRzdUBqcC5mdWppdHN1LmNv bT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBG cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu c2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAq IFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAq IGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLz4uCisgKi8KKworLyoKKyAqIHNldCB2aXJ0dWFsIHBvcnQgY29ubmVj dGlvbiBzdGF0dXMKKyAqLwordm9pZCBzZXRfY29ubmVjdF9zdGF0ZShzdHJ1Y3QgdXNiZnJv bnRfaW5mbyAqaW5mbywgaW50IHBvcnRudW0pCit7CisJaW50IHBvcnQ7CisKKwlwb3J0ID0g cG9ydG51bSAtMTsKKwlpZiAoaW5mby0+cG9ydHNbcG9ydF0uc3RhdHVzICYgVVNCX1BPUlRf U1RBVF9QT1dFUikgeworCQlzd2l0Y2ggKGluZm8tPmRldmljZXNbcG9ydF0uc3BlZWQpIHsK KwkJY2FzZSBVU0JfU1BFRURfVU5LTk9XTjoKKwkJCWluZm8tPnBvcnRzW3BvcnRdLnN0YXR1 cyAmPSB+KFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiB8CisJCQkJCQkJVVNCX1BPUlRfU1RB VF9FTkFCTEUgfAorCQkJCQkJCVVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEIHwKKwkJCQkJCQlV U0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQgfAorCQkJCQkJCVVTQl9QT1JUX1NUQVRfU1VTUEVO RCk7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfTE9XOgorCQkJaW5mby0+cG9ydHNb cG9ydF0uc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTjsKKwkJCWluZm8tPnBv cnRzW3BvcnRdLnN0YXR1cyB8PSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJCWJyZWFr OworCQljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQkJaW5mby0+cG9ydHNbcG9ydF0uc3RhdHVz IHw9IFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTjsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9T UEVFRF9ISUdIOgorCQkJaW5mby0+cG9ydHNbcG9ydF0uc3RhdHVzIHw9IFVTQl9QT1JUX1NU QVRfQ09OTkVDVElPTjsKKwkJCWluZm8tPnBvcnRzW3BvcnRdLnN0YXR1cyB8PSBVU0JfUE9S VF9TVEFUX0hJR0hfU1BFRUQ7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogZXJyb3IgKi8K KwkJCXJldHVybjsKKwkJfQorCQlpbmZvLT5wb3J0c1twb3J0XS5zdGF0dXMgfD0gKFVTQl9Q T1JUX1NUQVRfQ19DT05ORUNUSU9OIDw8IDE2KTsKKwl9Cit9CisKKy8qCisgKiBzZXQgdmly dHVhbCBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKKyAqLwordm9pZCByaHBvcnRfY29ubmVj dChzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbywKKwkJCQlpbnQgcG9ydG51bSwgZW51bSB1 c2JfZGV2aWNlX3NwZWVkIHNwZWVkKQoreworCWludCBwb3J0OworCisJcG9ydCA9IHBvcnRu dW0gLSAxOworCWlmIChpbmZvLT5kZXZpY2VzW3BvcnRdLnNwZWVkICE9IHNwZWVkKSB7CisJ CXN3aXRjaCAoc3BlZWQpIHsKKwkJY2FzZSBVU0JfU1BFRURfVU5LTk9XTjogLyogZGlzY29u bmVjdCAqLworCQkJaW5mby0+ZGV2aWNlc1twb3J0XS5zdGF0dXMgPSBVU0JfU1RBVEVfTk9U QVRUQUNIRUQ7CisJCQlicmVhazsKKwkJY2FzZSBVU0JfU1BFRURfTE9XOgorCQljYXNlIFVT Ql9TUEVFRF9GVUxMOgorCQljYXNlIFVTQl9TUEVFRF9ISUdIOgorCQkJaW5mby0+ZGV2aWNl c1twb3J0XS5zdGF0dXMgPSBVU0JfU1RBVEVfQVRUQUNIRUQ7CisJCQlicmVhazsKKwkJZGVm YXVsdDogLyogZXJyb3IgKi8KKwkJCXJldHVybjsKKwkJfQorCQlpbmZvLT5kZXZpY2VzW3Bv cnRdLnNwZWVkID0gc3BlZWQ7CisJCWluZm8tPnBvcnRzW3BvcnRdLmNfY29ubmVjdGlvbiA9 IDE7CisKKwkJc2V0X2Nvbm5lY3Rfc3RhdGUoaW5mbywgcG9ydG51bSk7CisJfQorfQorCit2 b2lkIHJocG9ydF9kaXNjb25uZWN0KHN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvLCBpbnQg cG9ydG51bSkKK3sKKwlyaHBvcnRfY29ubmVjdChpbmZvLCBwb3J0bnVtLCBVU0JfU1BFRURf VU5LTk9XTik7Cit9CisKK3ZvaWQgeGVuaGNkX3JocG9ydF9zdGF0ZV9jaGFuZ2Uoc3RydWN0 IHVzYmZyb250X2luZm8gKmluZm8sCisJCQkJaW50IHBvcnRudW0sIGVudW0gdXNiX2Rldmlj ZV9zcGVlZCBzcGVlZCkKK3sKKwlpbnQgY2hhbmdlZCA9IDA7CisJdW5zaWduZWQgbG9uZyBm bGFnczsKKworCWlmIChwb3J0bnVtIDwgMSB8fCBwb3J0bnVtID4gaW5mby0+cmhfbnVtcG9y dHMpCisJCXJldHVybjsgLyogaW52YWxpZCBwb3J0IG51bWJlciAqLworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlyaHBvcnRfY29ubmVjdChpbmZvLCBw b3J0bnVtLCBzcGVlZCk7CisJaWYgKGluZm8tPnBvcnRzW3BvcnRudW0tMV0uY19jb25uZWN0 aW9uKQorCQljaGFuZ2VkID0gMTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpbmZvLT5s b2NrLCBmbGFncyk7CisKKwlpZiAoY2hhbmdlZCkKKwkJdXNiX2hjZF9wb2xsX3JoX3N0YXR1 cyhpbmZvX3RvX2hjZChpbmZvKSk7Cit9CisKKy8qCisgKiBTZXRQb3J0RmVhdHVyZShQT1JU X1NVU1BFTkRFRCkKKyAqLwordm9pZCByaHBvcnRfc3VzcGVuZChzdHJ1Y3QgdXNiZnJvbnRf aW5mbyAqaW5mbywgaW50IHBvcnRudW0pCit7CisJaW50IHBvcnQ7CisKKwlwb3J0ID0gcG9y dG51bSAtIDE7CisJaW5mby0+cG9ydHNbcG9ydF0uc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRf U1VTUEVORDsKKwlpbmZvLT5kZXZpY2VzW3BvcnRdLnN0YXR1cyA9IFVTQl9TVEFURV9TVVNQ RU5ERUQ7Cit9CisKKy8qCisgKiBDbGVhclBvcnRGZWF0dXJlKFBPUlRfU1VTUEVOREVEKQor ICovCit2b2lkIHJocG9ydF9yZXN1bWUoc3RydWN0IHVzYmZyb250X2luZm8gKmluZm8sIGlu dCBwb3J0bnVtKQoreworCWludCBwb3J0OworCisJcG9ydCA9IHBvcnRudW0gLSAxOworCWlm IChpbmZvLT5wb3J0c1twb3J0XS5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpIHsK KwkJaW5mby0+cG9ydHNbcG9ydF0ucmVzdW1pbmcgPSAxOworCQlpbmZvLT5wb3J0c1twb3J0 XS50aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3RvX2ppZmZpZXMoMjApOworCX0KK30KKwor LyoKKyAqIFNldFBvcnRGZWF0dXJlKFBPUlRfUE9XRVIpCisgKi8KK3ZvaWQgcmhwb3J0X3Bv d2VyX29uKHN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvLCBpbnQgcG9ydG51bSkKK3sKKwlp bnQgcG9ydDsKKworCXBvcnQgPSBwb3J0bnVtIC0gMTsKKwlpZiAoKGluZm8tPnBvcnRzW3Bv cnRdLnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfUE9XRVIpID09IDApIHsKKwkJaW5mby0+cG9y dHNbcG9ydF0uc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisJCWlmIChpbmZvLT5k ZXZpY2VzW3BvcnRdLnN0YXR1cyAhPSBVU0JfU1RBVEVfTk9UQVRUQUNIRUQpCisJCQlpbmZv LT5kZXZpY2VzW3BvcnRdLnN0YXR1cyA9IFVTQl9TVEFURV9QT1dFUkVEOworCQlpZiAoaW5m by0+cG9ydHNbcG9ydF0uY19jb25uZWN0aW9uKQorCQkJc2V0X2Nvbm5lY3Rfc3RhdGUoaW5m bywgcG9ydG51bSk7CisJfQorfQorCisvKgorICogQ2xlYXJQb3J0RmVhdHVyZShQT1JUX1BP V0VSKQorICogU2V0Q29uZmlndXJhdGlvbihub24temVybykKKyAqIFBvd2VyX1NvdXJjZV9P ZmYKKyAqIE92ZXItY3VycmVudAorICovCit2b2lkIHJocG9ydF9wb3dlcl9vZmYoc3RydWN0 IHVzYmZyb250X2luZm8gKmluZm8sIGludCBwb3J0bnVtKQoreworCWludCBwb3J0OworCisJ cG9ydCA9IHBvcnRudW0gLSAxOworCWlmIChpbmZvLT5wb3J0c1twb3J0XS5zdGF0dXMgJiBV U0JfUE9SVF9TVEFUX1BPV0VSKSB7CisJCWluZm8tPnBvcnRzW3BvcnRdLnN0YXR1cyA9IDA7 CisJCWlmIChpbmZvLT5kZXZpY2VzW3BvcnRdLnN0YXR1cyAhPSBVU0JfU1RBVEVfTk9UQVRU QUNIRUQpCisJCQlpbmZvLT5kZXZpY2VzW3BvcnRdLnN0YXR1cyA9IFVTQl9TVEFURV9BVFRB Q0hFRDsKKwl9Cit9CisKKy8qCisgKiBDbGVhclBvcnRGZWF0dXJlKFBPUlRfRU5BQkxFKQor ICovCit2b2lkIHJocG9ydF9kaXNhYmxlKHN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvLCBp bnQgcG9ydG51bSkKK3sKKwlpbnQgcG9ydDsKKworCXBvcnQgPSBwb3J0bnVtIC0gMTsKKwlp bmZvLT5wb3J0c1twb3J0XS5zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfRU5BQkxFOworCWlu Zm8tPnBvcnRzW3BvcnRdLnN0YXR1cyAmPSB+VVNCX1BPUlRfU1RBVF9TVVNQRU5EOworCWlu Zm8tPnBvcnRzW3BvcnRdLnJlc3VtaW5nID0gMDsKKwlpZiAoaW5mby0+ZGV2aWNlc1twb3J0 XS5zdGF0dXMgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQorCQlpbmZvLT5kZXZpY2VzW3Bv cnRdLnN0YXR1cyA9IFVTQl9TVEFURV9QT1dFUkVEOworfQorCisvKgorICogU2V0UG9ydEZl YXR1cmUoUE9SVF9SRVNFVCkKKyAqLwordm9pZCByaHBvcnRfcmVzZXQoc3RydWN0IHVzYmZy b250X2luZm8gKmluZm8sIGludCBwb3J0bnVtKQoreworCWludCBwb3J0OworCisJcG9ydCA9 IHBvcnRudW0gLTE7CisJaW5mby0+cG9ydHNbcG9ydF0uc3RhdHVzICY9IH4oVVNCX1BPUlRf U1RBVF9FTkFCTEUKKwkJCQkJfCBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRAorCQkJCQl8IFVT Ql9QT1JUX1NUQVRfSElHSF9TUEVFRCk7CisJaW5mby0+cG9ydHNbcG9ydF0uc3RhdHVzIHw9 IFVTQl9QT1JUX1NUQVRfUkVTRVQ7CisKKwlpZiAoaW5mby0+ZGV2aWNlc1twb3J0XS5zdGF0 dXMgIT0gVVNCX1NUQVRFX05PVEFUVEFDSEVEKQorCQlpbmZvLT5kZXZpY2VzW3BvcnRdLnN0 YXR1cyA9IFVTQl9TVEFURV9BVFRBQ0hFRDsKKworCS8qIDEwbXNlYyByZXNldCBzaWduYWxp bmcgKi8KKwlpbmZvLT5wb3J0c1twb3J0XS50aW1lb3V0ID0gamlmZmllcyArIG1zZWNzX3Rv X2ppZmZpZXMoMTApOworfQorCisjaWYgMAorI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGlu dCB4ZW5oY2RfYnVzX3N1c3BlbmQoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3Qg dXNiZnJvbnRfaW5mbyAqaW5mbyA9IGhjZF90b19pbmZvKGhjZCk7CisJaW50IGksIHBvcnRz OworCisJcG9ydHMgPSBpbmZvLT5yaF9udW1wb3J0czsKKworCXNwaW5fbG9ja19pcnEoJmlu Zm8tPmxvY2spOworCisJaWYgKEhDX0lTX1JVTk5JTkcoaGNkLT5zdGF0ZSkpIHsKKwkJLyoK KwkJICogVE9ETzoKKwkJICogY2xlYW4gcXVldWUsCisJCSAqIHN0b3AgYWxsIHRyYW5zZmVy cywKKwkJICogLi4uCisJCSAqLworCQloY2QtPnN0YXRlID0gSENfU1RBVEVfUVVJRVNDSU5H OworCX0KKworCS8qIHN1c3BlbmQgYW55IGFjdGl2ZSBwb3J0cyovCisJZm9yIChpID0gMTsg aSA8PSBwb3J0czsgaSsrKSB7CisJCXJocG9ydF9zdXNwZW5kKGluZm8sIGkpOworCX0KKwor CWRlbF90aW1lcl9zeW5jKCZpbmZvLT53YXRjaGRvZyk7CisKKwlzcGluX3VubG9ja19pcnEo JmluZm8tPmxvY2spOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGVuaGNkX2J1 c19yZXN1bWUoc3RydWN0IHVzYl9oY2QgKmhjZCkKK3sKKwlzdHJ1Y3QgdXNiZnJvbnRfaW5m byAqaW5mbyA9IGhjZF90b19pbmZvKGhjZCk7CisJaW50IGksIHBvcnRzOworCisJcG9ydHMg PSBpbmZvLT5yaF9udW1wb3J0czsKKworCXNwaW5fbG9ja19pcnEoJmluZm8tPmxvY2spOwor CS8qIHJlc3VtZSBhbnkgc3VzcGVuZGVkIHBvcnRzKi8KKwlmb3IgKGkgPSAxOyBpIDw9IHBv cnRzOyBpKyspIHsKKwkJcmhwb3J0X3Jlc3VtZShpbmZvLCBpKTsKKwl9CisJaGNkLT5zdGF0 ZSA9IEhDX1NUQVRFX1JVTk5JTkc7CisJc3Bpbl91bmxvY2tfaXJxKCZpbmZvLT5sb2NrKTsK KwlyZXR1cm4gMDsKK30KKyNlbmRpZgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHhlbmhjZF9o dWJfZGVzY3JpcHRvcihzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbywKKwkJCQkgIHN0cnVj dCB1c2JfaHViX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJdTE2IHRlbXA7CisJaW50IHBvcnRz ID0gaW5mby0+cmhfbnVtcG9ydHM7CisKKwlkZXNjLT5iRGVzY3JpcHRvclR5cGUgPSAweDI5 OworCWRlc2MtPmJQd3JPbjJQd3JHb29kID0gMTA7IC8qIEVIQ0kgc2F5cyAyMG1zIG1heCAq LworCWRlc2MtPmJIdWJDb250ckN1cnJlbnQgPSAwOworCWRlc2MtPmJOYnJQb3J0cyA9IHBv cnRzOworCisJLyogc2l6ZSBvZiBEZXZpY2VSZW1vdmFibGUgYW5kIFBvcnRQd3JDdHJsTWFz ayBmaWVsZHMqLworCXRlbXAgPSAxICsgKHBvcnRzIC8gOCk7CisJZGVzYy0+YkRlc2NMZW5n dGggPSA3ICsgMiAqIHRlbXA7CisKKwkvKiBiaXRtYXBzIGZvciBEZXZpY2VSZW1vdmFibGUg YW5kIFBvcnRQd3JDdHJsTWFzayAqLworCW1lbXNldCAoJmRlc2MtPmJpdG1hcFswXSwgMCwg dGVtcCk7CisJbWVtc2V0ICgmZGVzYy0+Yml0bWFwW3RlbXBdLCAweGZmLCB0ZW1wKTsKKwor CS8qIHBlci1wb3J0IG92ZXIgY3VycmVudCByZXBvcnRpbmcgYW5kIG5vIHBvd2VyIHN3aXRj aGluZyAqLworCXRlbXAgPSAweDAwMGE7CisJZGVzYy0+d0h1YkNoYXJhY3RlcmlzdGljcyA9 IGNwdV90b19sZTE2KHRlbXApOworfQorCisvKiBwb3J0IHN0YXR1cyBjaGFuZ2UgbWFzayBm b3IgaHViX3N0YXR1c19kYXRhICovCisjZGVmaW5lIFBPUlRfQ19NQVNLIFwKKwkoKFVTQl9Q T1JUX1NUQVRfQ19DT05ORUNUSU9OIFwKKwl8IFVTQl9QT1JUX1NUQVRfQ19FTkFCTEUgXAor CXwgVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgXAorCXwgVVNCX1BPUlRfU1RBVF9DX09WRVJD VVJSRU5UIFwKKwl8IFVTQl9QT1JUX1NUQVRfQ19SRVNFVCkgPDwgMTYpCisKKy8qCisgKiBT ZWUgVVNCIDIuMCBTcGVjLCAxMS4xMi40IEh1YiBhbmQgUG9ydCBTdGF0dXMgQ2hhbmdlIEJp dG1hcC4KKyAqIElmIHBvcnQgc3RhdHVzIGNoYW5nZWQsIHdyaXRlcyB0aGUgYml0bWFwIHRv IGJ1ZiBhbmQgcmV0dXJuCisgKiB0aGF0IGxlbmd0aChudW1iZXIgb2YgYnl0ZXMpLgorICog SWYgTm90aGluZyBjaGFuZ2VkLCByZXR1cm4gMC4KKyAqLworc3RhdGljIGludCB4ZW5oY2Rf aHViX3N0YXR1c19kYXRhKHN0cnVjdCB1c2JfaGNkICpoY2QsIGNoYXIgKmJ1ZikKK3sKKwlz dHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbyA9IGhjZF90b19pbmZvKGhjZCk7CisKKwlpbnQg cG9ydHM7CisJaW50IGk7CisJaW50IGxlbmd0aDsKKworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisJaW50IHJldCA9IDA7CisKKwlpbnQgY2hhbmdlZCA9IDA7CisKKwlpZiAoIUhDX0lTX1JV Tk5JTkcoaGNkLT5zdGF0ZSkpCisJCXJldHVybiAwOworCisJLyogaW5pdGlhbGl6ZSB0aGUg c3RhdHVzIHRvIG5vLWNoYW5nZXMgKi8KKwlwb3J0cyA9IGluZm8tPnJoX251bXBvcnRzOwor CWxlbmd0aCA9IDEgKyAocG9ydHMgLyA4KTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBp KyspIHsKKwkJYnVmW2ldID0gMDsKKwkJcmV0Kys7CisJfQorCisJc3Bpbl9sb2NrX2lycXNh dmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0czsgaSsr KSB7CisJCS8qIGNoZWNrIHN0YXR1cyBmb3IgZWFjaCBwb3J0ICovCisJCWlmIChpbmZvLT5w b3J0c1tpXS5zdGF0dXMgJiBQT1JUX0NfTUFTSykgeworCQkJaWYgKGkgPCA3KQorCQkJCWJ1 ZlswXSB8PSAxIDw8IChpICsgMSk7CisJCQllbHNlIGlmIChpIDwgMTUpCisJCQkJYnVmWzFd IHw9IDEgPDwgKGkgLSA3KTsKKwkJCWVsc2UgaWYgKGkgPCAyMykKKwkJCQlidWZbMl0gfD0g MSA8PCAoaSAtIDE1KTsKKwkJCWVsc2UKKwkJCQlidWZbM10gfD0gMSA8PCAoaSAtIDIzKTsK KwkJCWNoYW5nZWQgPSAxOworCQl9CisJfQorCisJaWYgKCFjaGFuZ2VkKQorCQlyZXQgPSAw OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB4ZW5oY2RfaHViX2NvbnRyb2woc3RydWN0 IHVzYl9oY2QgKmhjZCwKKwkJCSAgICAgICB1MTYgdHlwZVJlcSwKKwkJCSAgICAgICB1MTYg d1ZhbHVlLAorCQkJICAgICAgIHUxNiB3SW5kZXgsCisJCQkgICAgICAgY2hhciAqYnVmLAor CQkJICAgICAgIHUxNiB3TGVuZ3RoKQoreworCXN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZv ID0gaGNkX3RvX2luZm8oaGNkKTsKKwlpbnQgcG9ydHMgPSBpbmZvLT5yaF9udW1wb3J0czsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCWludCBpOworCWludCBj aGFuZ2VkID0gMDsKKworI2lmZGVmIFVTQkZST05UX0RFQlVHCisJV1BSSU5USygieGVudXNi X2h1Yl9jb250cm9sKHR5cGVSZXEgJXggd1ZhbHVlICV4IHdJbmRleCAleClcbiIsCisJICAg ICAgIHR5cGVSZXEsIHdWYWx1ZSwgd0luZGV4KTsKKyNlbmRpZgorCisJc3Bpbl9sb2NrX2ly cXNhdmUoJmluZm8tPmxvY2ssIGZsYWdzKTsKKwlzd2l0Y2ggKHR5cGVSZXEpIHsKKwljYXNl IENsZWFySHViRmVhdHVyZToKKwkJLyogaWdub3JlIHRoaXMgcmVxdWVzdCAqLworCQlicmVh azsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCWlmICghd0luZGV4IHx8IHdJbmRleCA+ IHBvcnRzKQorCQkJZ290byBlcnJvcjsKKworCQlzd2l0Y2god1ZhbHVlKSB7CisJCWNhc2Ug VVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQkJcmhwb3J0X3Jlc3VtZShpbmZvLCB3SW5kZXgp OworCQkJYnJlYWs7CisJCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwkJCXJocG9ydF9w b3dlcl9vZmYoaW5mbywgd0luZGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZF QVRfRU5BQkxFOgorCQkJcmhwb3J0X2Rpc2FibGUoaW5mbywgd0luZGV4KTsKKwkJCWJyZWFr OworCQljYXNlIFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OOgorCQkJaW5mby0+cG9ydHNb d0luZGV4LTFdLmNfY29ubmVjdGlvbiA9IDA7CisJCQkvKiBmYWxsaW5nIHRocm91Z2ggKi8K KwkJZGVmYXVsdDoKKwkJCWluZm8tPnBvcnRzW3dJbmRleC0xXS5zdGF0dXMgJj0gfigxIDw8 IHdWYWx1ZSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEdldEh1YkRlc2Ny aXB0b3I6CisJCXhlbmhjZF9odWJfZGVzY3JpcHRvcihpbmZvLAorCQkJCSAgICAgIChzdHJ1 Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yKikgYnVmKTsKKwkJYnJlYWs7CisJY2FzZSBHZXRIdWJT dGF0dXM6CisJCS8qIGFsd2F5cyBsb2NhbCBwb3dlciBzdXBwbHkgZ29vZCBhbmQgbm8gb3Zl ci1jdXJyZW50IGV4aXN0cy4gKi8KKwkJKihfX2xlMzIgKilidWYgPSBjcHVfdG9fbGUzMigw KTsKKwkJYnJlYWs7CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlpZiAoIXdJbmRleCB8fCB3 SW5kZXggPiBwb3J0cykKKwkJCWdvdG8gZXJyb3I7CisKKwkJd0luZGV4LS07CisKKwkJLyog cmVzdW1lIGNvbXBsZXRpb24gKi8KKwkJaWYgKGluZm8tPnBvcnRzW3dJbmRleF0ucmVzdW1p bmcgJiYKKwkJCXRpbWVfYWZ0ZXJfZXEoamlmZmllcywgaW5mby0+cG9ydHNbd0luZGV4XS50 aW1lb3V0KSkgeworCQkJaW5mby0+cG9ydHNbd0luZGV4XS5zdGF0dXMgfD0gKFVTQl9QT1JU X1NUQVRfQ19TVVNQRU5EIDw8IDE2KTsKKwkJCWluZm8tPnBvcnRzW3dJbmRleF0uc3RhdHVz ICY9IH5VU0JfUE9SVF9TVEFUX1NVU1BFTkQ7CisJCX0KKworCQkvKiByZXNldCBjb21wbGV0 aW9uICovCisJCWlmICgoaW5mby0+cG9ydHNbd0luZGV4XS5zdGF0dXMgJiBVU0JfUE9SVF9T VEFUX1JFU0VUKSAhPSAwICYmCisJCQl0aW1lX2FmdGVyX2VxKGppZmZpZXMsIGluZm8tPnBv cnRzW3dJbmRleF0udGltZW91dCkpIHsKKwkJCWluZm8tPnBvcnRzW3dJbmRleF0uc3RhdHVz IHw9IChVU0JfUE9SVF9TVEFUX0NfUkVTRVQgPDwgMTYpOworCQkJaW5mby0+cG9ydHNbd0lu ZGV4XS5zdGF0dXMgJj0gflVTQl9QT1JUX1NUQVRfUkVTRVQ7CisKKwkJCWlmIChpbmZvLT5k ZXZpY2VzW3dJbmRleF0uc3RhdHVzICE9IFVTQl9TVEFURV9OT1RBVFRBQ0hFRCkgeworCQkJ CWluZm8tPnBvcnRzW3dJbmRleF0uc3RhdHVzIHw9IFVTQl9QT1JUX1NUQVRfRU5BQkxFOwor CQkJCWluZm8tPmRldmljZXNbd0luZGV4XS5zdGF0dXMgPSBVU0JfU1RBVEVfREVGQVVMVDsK KwkJCX0KKworCQkJc3dpdGNoKGluZm8tPmRldmljZXNbd0luZGV4XS5zcGVlZCkgeworCQkJ Y2FzZSBVU0JfU1BFRURfTE9XOgorCQkJCWluZm8tPnBvcnRzW3dJbmRleF0uc3RhdHVzIHw9 IFVTQl9QT1JUX1NUQVRfTE9XX1NQRUVEOworCQkJCWJyZWFrOworCQkJY2FzZSBVU0JfU1BF RURfSElHSDoKKwkJCQlpbmZvLT5wb3J0c1t3SW5kZXhdLnN0YXR1cyB8PSBVU0JfUE9SVF9T VEFUX0hJR0hfU1BFRUQ7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOwor CQkJfQorCQl9CisKKwkJKCh1MTYgKikgYnVmKVswXSA9IGNwdV90b19sZTE2IChpbmZvLT5w b3J0c1t3SW5kZXhdLnN0YXR1cyk7CisJCSgodTE2ICopIGJ1ZilbMV0gPSBjcHVfdG9fbGUx NiAoaW5mby0+cG9ydHNbd0luZGV4XS5zdGF0dXMgPj4gMTYpOworCQlicmVhazsKKwljYXNl IFNldEh1YkZlYXR1cmU6CisJCS8qIG5vdCBzdXBwb3J0ZWQgKi8KKwkJZ290byBlcnJvcjsK KwljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlpZiAoIXdJbmRleCB8fCB3SW5kZXggPiBwb3J0 cykKKwkJCWdvdG8gZXJyb3I7CisKKwkJc3dpdGNoKHdWYWx1ZSkgeworCQljYXNlIFVTQl9Q T1JUX0ZFQVRfUE9XRVI6CisJCQlyaHBvcnRfcG93ZXJfb24oaW5mbywgd0luZGV4KTsKKwkJ CWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCQlyaHBvcnRfcmVzZXQo aW5mbywgd0luZGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9QT1JUX0ZFQVRfU1VTUEVO RDoKKwkJCXJocG9ydF9zdXNwZW5kKGluZm8sIHdJbmRleCk7CisJCQlicmVhazsKKwkJZGVm YXVsdDoKKwkJCWlmICgoaW5mby0+cG9ydHNbd0luZGV4LTFdLnN0YXR1cyAmIFVTQl9QT1JU X1NUQVRfUE9XRVIpICE9IDApIHsKKwkJCQlpbmZvLT5wb3J0c1t3SW5kZXgtMV0uc3RhdHVz IHw9ICgxIDw8IHdWYWx1ZSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0Ogor ZXJyb3I6CisJCXJldCA9IC1FUElQRTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm aW5mby0+bG9jaywgZmxhZ3MpOworCisJLyogY2hlY2sgc3RhdHVzIGZvciBlYWNoIHBvcnQg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgcG9ydHM7IGkrKykgeworCQlpZiAoaW5mby0+cG9ydHNb aV0uc3RhdHVzICYgUE9SVF9DX01BU0spIHsKKwkJCWNoYW5nZWQgPSAxOworCQl9CisJfQor CWlmIChjaGFuZ2VkKQorCQl1c2JfaGNkX3BvbGxfcmhfc3RhdHVzKGhjZCk7CisKKwlyZXR1 cm4gcmV0OworfQpkaWZmIC1yIDUxZGVjYzM5ZTVlNyAtciA5ZWYyZThjNmNmM2QgZHJpdmVy cy94ZW4vdXNiZnJvbnQvdXNiZnJvbnQtcS5jCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAw MDowMDowMCAxOTcwICswMDAwCisrKyBiL2RyaXZlcnMveGVuL3VzYmZyb250L3VzYmZyb250 LXEuYwlNb24gTWFyIDE2IDE4OjQxOjEyIDIwMDkgKzA5MDAKQEAgLTAsMCArMSw0MTggQEAK Ky8qCisgKiB1c2Jmcm9udC1xLmMKKyAqCisgKiBYZW4gVVNCIFZpcnR1YWwgSG9zdCBDb250 cm9sbGVyIC0gUklORyBvcGVyYXRpb25zLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwg RlVKSVRTVSBMQUJPUkFUT1JJRVMgTFRELgorICogQXV0aG9yOiBOb2JvcnUgSXdhbWF0c3Ug PG5faXdhbWF0c3VAanAuZnVqaXRzdS5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAq IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug YXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBh bnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQg aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxz LgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYg bm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIG9yLAor ICoKKyAqIFdoZW4gZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJu ZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8KKyAqIG90aGVyIHNvZnR3YXJlIHBhY2thZ2VzLCBz dWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgbGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlz IGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5p bmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50 YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3 YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24g dGhlCisgKiByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBk aXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBT b2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlz CisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25k aXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBl cm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lO RCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBU TyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBT SEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZP UiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJ TiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisg KiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBU SEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKwor c3RydWN0IGttZW1fY2FjaGUgKnhlbmhjZF91cmJwX2NhY2hlcDsKKworc3RhdGljIHN0cnVj dCB1cmJfcHJpdiAqYWxsb2NfdXJiX3ByaXYoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVj dCB1cmJfcHJpdiAqdXJicDsKKworCXVyYnAgPSBrbWVtX2NhY2hlX3phbGxvYyh4ZW5oY2Rf dXJicF9jYWNoZXAsIEdGUF9BVE9NSUMpOworCWlmICghdXJicCkgeworCQlyZXR1cm4gTlVM TDsKKwl9CisKKwl1cmJwLT51cmIgPSB1cmI7CisJdXJiLT5oY3ByaXYgPSB1cmJwOworCXVy YnAtPnJlcV9pZCA9IH4wOworCUlOSVRfTElTVF9IRUFEKCZ1cmJwLT5saXN0KTsKKworCXJl dHVybiB1cmJwOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3VyYl9wcml2KHN0cnVjdCB1cmJf cHJpdiAqdXJicCkKK3sKKwl1cmJwLT51cmItPmhjcHJpdiA9IE5VTEw7CisJa21lbV9jYWNo ZV9mcmVlKHhlbmhjZF91cmJwX2NhY2hlcCwgdXJicCk7Cit9CisKK3N0YXRpYyBpbmxpbmUg aW50IGdldF9pZF9mcm9tX2ZyZWVsaXN0KAorCXN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZv KQoreworCXVuc2lnbmVkIGxvbmcgZnJlZTsKKwlmcmVlID0gaW5mby0+c2hhZG93X2ZyZWU7 CisJQlVHX09OKGZyZWUgPiBVU0JfUklOR19TSVpFKTsKKwlpbmZvLT5zaGFkb3dfZnJlZSA9 IGluZm8tPnNoYWRvd1tmcmVlXS5yZXEuaWQ7CisJaW5mby0+c2hhZG93W2ZyZWVdLnJlcS5p ZCA9ICh1bnNpZ25lZCBpbnQpMHgwZmZmOyAvKiBkZWJ1ZyAqLworCXJldHVybiBmcmVlOwor fQorCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX2lkX3RvX2ZyZWVsaXN0KAorCXN0cnVjdCB1 c2Jmcm9udF9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGlkKQoreworCWluZm8tPnNoYWRv d1tpZF0ucmVxLmlkICA9IGluZm8tPnNoYWRvd19mcmVlOworCWluZm8tPnNoYWRvd1tpZF0u dXJiID0gTlVMTDsKKwlpbmZvLT5zaGFkb3dfZnJlZSA9IGlkOworfQorCitzdGF0aWMgaW5s aW5lIGludCBjb3VudF9wYWdlcyh2b2lkICphZGRyLCBpbnQgbGVuZ3RoKQoreworCXVuc2ln bmVkIGxvbmcgc3RhcnQgPSAodW5zaWduZWQgbG9uZykgYWRkciA+PiBQQUdFX1NISUZUOwor CXVuc2lnbmVkIGxvbmcgZW5kID0gKHVuc2lnbmVkIGxvbmcpIChhZGRyICsgbGVuZ3RoICsg UEFHRV9TSVpFIC0xKSA+PiBQQUdFX1NISUZUOworCXJldHVybiBlbmQgLSBzdGFydDsKK30K Kworc3RhdGljIGlubGluZSB2b2lkIHhlbmhjZF9nbnR0YWJfbWFwKHN0cnVjdCB1c2Jmcm9u dF9pbmZvICppbmZvLAorCQl2b2lkICphZGRyLCBpbnQgbGVuZ3RoLCBncmFudF9yZWZfdCAq Z3JlZl9oZWFkLAorCQlzdHJ1Y3QgdXNiaWZfcmVxdWVzdF9zZWdtZW50ICpzZWcsIGludCBu cl9wYWdlcywgaW50IGZsYWdzKQoreworCWdyYW50X3JlZl90IHJlZjsKKwlzdHJ1Y3QgcGFn ZSAqcGFnZTsKKwl1bnNpZ25lZCBsb25nIGJ1ZmZlcl9wZm47CisJdW5zaWduZWQgaW50IG9m ZnNldDsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXVuc2lnbmVkIGludCBieXRlczsKKwlpbnQg aTsKKworCXBhZ2UgPSB2aXJ0X3RvX3BhZ2UoYWRkcik7CisJYnVmZmVyX3BmbiA9IHBhZ2Vf dG9fcGh5cyhwYWdlKSA+PiBQQUdFX1NISUZUOworCW9mZnNldCA9IG9mZnNldF9pbl9wYWdl KGFkZHIpOworCWxlbiA9IGxlbmd0aDsKKworCWZvcihpID0gMDtpIDwgbnJfcGFnZXM7aSsr KXsKKwkJYnl0ZXMgPSBQQUdFX1NJWkUgLSBvZmZzZXQ7CisJCWlmKGJ5dGVzID4gbGVuKQor CQkJYnl0ZXMgPSBsZW47CisKKwkJcmVmID0gZ250dGFiX2NsYWltX2dyYW50X3JlZmVyZW5j ZShncmVmX2hlYWQpOworCQlCVUdfT04ocmVmID09IC1FTk9TUEMpOworCQlnbnR0YWJfZ3Jh bnRfZm9yZWlnbl9hY2Nlc3NfcmVmKHJlZiwgaW5mby0+eGJkZXYtPm90aGVyZW5kX2lkLCBi dWZmZXJfcGZuLCBmbGFncyk7CisJCXNlZ1tpXS5ncmVmID0gcmVmOworCQlzZWdbaV0ub2Zm c2V0ID0gKHVpbnQxNl90KW9mZnNldDsKKwkJc2VnW2ldLmxlbmd0aCA9ICh1aW50MTZfdCli eXRlczsKKworCQlidWZmZXJfcGZuKys7CisJCWxlbiAtPSBieXRlczsKKwkJb2Zmc2V0ID0g MDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgbWFwX3VyYl9mb3JfcmVxdWVzdChzdHJ1Y3QgdXNi ZnJvbnRfaW5mbyAqaW5mbywgc3RydWN0IHVyYiAqdXJiLAorCQl1c2JpZl9yZXF1ZXN0X3Qg KnJlcSkKK3sKKwlncmFudF9yZWZfdCBncmVmX2hlYWQ7CisJaW50IG5yX2J1ZmZfcGFnZXMg PSAwOworCWludCBucl9pc29kZXNjX3BhZ2VzID0gMDsKKwlpbnQgcmV0ID0gMDsKKworCWlm ICh1cmItPnRyYW5zZmVyX2J1ZmZlcl9sZW5ndGgpIHsKKwkJbnJfYnVmZl9wYWdlcyA9IGNv dW50X3BhZ2VzKHVyYi0+dHJhbnNmZXJfYnVmZmVyLCB1cmItPnRyYW5zZmVyX2J1ZmZlcl9s ZW5ndGgpOworCisJCWlmICh1c2JfcGlwZWlzb2ModXJiLT5waXBlKSkKKwkJCW5yX2lzb2Rl c2NfcGFnZXMgPSBjb3VudF9wYWdlcygmdXJiLT5pc29fZnJhbWVfZGVzY1swXSwKKwkJCQkJ c2l6ZW9mKHN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNjcmlwdG9yKSAqIHVyYi0+bnVtYmVy X29mX3BhY2tldHMpOworCisJCWlmIChucl9idWZmX3BhZ2VzICsgbnJfaXNvZGVzY19wYWdl cyA+IFVTQklGX01BWF9TRUdNRU5UU19QRVJfUkVRVUVTVCkKKwkJCXJldHVybiAtRTJCSUc7 CisKKwkJcmV0ID0gZ250dGFiX2FsbG9jX2dyYW50X3JlZmVyZW5jZXMoVVNCSUZfTUFYX1NF R01FTlRTX1BFUl9SRVFVRVNULCAmZ3JlZl9oZWFkKTsKKwkJaWYgKHJldCkgeworCQkJcHJp bnRrKEtFUk5fRVJSICJ1c2Jmcm9udDogZ250dGFiX2FsbG9jX2dyYW50X3JlZmVyZW5jZXMo KSBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCXhlbmhjZF9nbnR0 YWJfbWFwKGluZm8sIHVyYi0+dHJhbnNmZXJfYnVmZmVyLAorCQkJCXVyYi0+dHJhbnNmZXJf YnVmZmVyX2xlbmd0aCwKKwkJCQkmZ3JlZl9oZWFkLCAmcmVxLT5zZWdbMF0sIG5yX2J1ZmZf cGFnZXMsCisJCQkJdXNiX3BpcGVpbih1cmItPnBpcGUpID8gMCA6IEdURl9yZWFkb25seSk7 CisKKwkJaWYgKCF1c2JfcGlwZWlzb2ModXJiLT5waXBlKSkKKwkJCWdudHRhYl9mcmVlX2dy YW50X3JlZmVyZW5jZXMoZ3JlZl9oZWFkKTsKKwl9CisKKwlyZXEtPnBpcGUgPSB1c2JpZl9z ZXRwb3J0bnVtX3BpcGUodXJiLT5waXBlLCB1cmItPmRldi0+cG9ydG51bSk7CisJcmVxLT50 cmFuc2Zlcl9mbGFncyA9IHVyYi0+dHJhbnNmZXJfZmxhZ3M7CisJcmVxLT5idWZmZXJfbGVu Z3RoID0gdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoOworCXJlcS0+bnJfYnVmZmVyX3Nl Z3MgPSBucl9idWZmX3BhZ2VzOworCisJc3dpdGNoICh1c2JfcGlwZXR5cGUodXJiLT5waXBl KSkgeworCWNhc2UgUElQRV9JU09DSFJPTk9VUzoKKwkJcmVxLT51Lmlzb2MuaW50ZXJ2YWwg PSB1cmItPmludGVydmFsOworCQlyZXEtPnUuaXNvYy5zdGFydF9mcmFtZSA9IHVyYi0+c3Rh cnRfZnJhbWU7CisJCXJlcS0+dS5pc29jLm51bWJlcl9vZl9wYWNrZXRzID0gdXJiLT5udW1i ZXJfb2ZfcGFja2V0czsKKwkJcmVxLT51Lmlzb2MubnJfZnJhbWVfZGVzY19zZWdzID0gbnJf aXNvZGVzY19wYWdlczsKKwkJLyoKKwkJICogdXJiLT5udW1iZXJfb2ZfcGFja2V0cyBtdXN0 IGJlID4gMAorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHVyYi0+bnVtYmVyX29mX3BhY2tldHMg PD0gMCkpCisJCQlCVUcoKTsKKwkJeGVuaGNkX2dudHRhYl9tYXAoaW5mbywgJnVyYi0+aXNv X2ZyYW1lX2Rlc2NbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCB1c2JfaXNvX3BhY2tldF9kZXNj cmlwdG9yKSAqIHVyYi0+bnVtYmVyX29mX3BhY2tldHMsCisJCQkJJmdyZWZfaGVhZCwgJnJl cS0+c2VnW25yX2J1ZmZfcGFnZXNdLCBucl9pc29kZXNjX3BhZ2VzLCAwKTsKKwkJZ250dGFi X2ZyZWVfZ3JhbnRfcmVmZXJlbmNlcyhncmVmX2hlYWQpOworCQlicmVhazsKKwljYXNlIFBJ UEVfSU5URVJSVVBUOgorCQlyZXEtPnUuaW50ci5pbnRlcnZhbCA9IHVyYi0+aW50ZXJ2YWw7 CisJCWJyZWFrOworCWNhc2UgUElQRV9DT05UUk9MOgorCQlpZiAodXJiLT5zZXR1cF9wYWNr ZXQpCisJCQltZW1jcHkocmVxLT51LmN0cmwsIHVyYi0+c2V0dXBfcGFja2V0LCA4KTsKKwkJ YnJlYWs7CisJY2FzZSBQSVBFX0JVTEs6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9 IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgeGVuaGNk X2dudHRhYl9kb25lKHN0cnVjdCB1c2Jfc2hhZG93ICpzaGFkb3cpCit7CisJaW50IG5yX3Nl Z3MgPSAwOworCWludCBpOworCisJbnJfc2VncyA9IHNoYWRvdy0+cmVxLm5yX2J1ZmZlcl9z ZWdzOworCisJaWYgKHVzYl9waXBlaXNvYyhzaGFkb3ctPnJlcS5waXBlKSkKKwkJbnJfc2Vn cyArPSAgc2hhZG93LT5yZXEudS5pc29jLm5yX2ZyYW1lX2Rlc2Nfc2VnczsKKworCWZvciAo aSA9IDA7IGkgPCBucl9zZWdzOyBpKyspCisJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3Mo c2hhZG93LT5yZXEuc2VnW2ldLmdyZWYsIDBVTCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbmhj ZF9naXZlYmFja191cmIoc3RydWN0IHVzYmZyb250X2luZm8gKmluZm8sIHN0cnVjdCB1cmIg KnVyYikKK19fcmVsZWFzZXMoaW5mby0+bG9jaykKK19fYWNxdWlyZXMoaW5mby0+bG9jaykK K3sKKwlzdHJ1Y3QgdXJiX3ByaXYgKnVyYnAgPSAoc3RydWN0IHVyYl9wcml2ICopIHVyYi0+ aGNwcml2OworCisJbGlzdF9kZWxfaW5pdCgmdXJicC0+bGlzdCk7CisJZnJlZV91cmJfcHJp dih1cmJwKTsKKwlzd2l0Y2ggKHVyYi0+c3RhdHVzKSB7CisJY2FzZSAtRUNPTk5SRVNFVDoK KwljYXNlIC1FTk9FTlQ6CisJCUNPVU5UKGluZm8tPnN0YXRzLnVubGluayk7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCUNPVU5UKGluZm8tPnN0YXRzLmNvbXBsZXRlKTsKKwl9CisJc3Bp bl91bmxvY2soJmluZm8tPmxvY2spOworCXVzYl9oY2RfZ2l2ZWJhY2tfdXJiKGluZm9fdG9f aGNkKGluZm8pLCB1cmIsIE5VTEwpOworCXNwaW5fbG9jaygmaW5mby0+bG9jayk7Cit9CisK K3N0YXRpYyBpbmxpbmUgaW50IHhlbmhjZF9kb19yZXF1ZXN0KHN0cnVjdCB1c2Jmcm9udF9p bmZvICppbmZvLCBzdHJ1Y3QgdXJiX3ByaXYgKnVyYnApCit7CisJdXNiaWZfcmVxdWVzdF90 ICpyaW5nX3JlcTsKKwlzdHJ1Y3QgdXJiICp1cmIgPSB1cmJwLT51cmI7CisJdWludDE2X3Qg aWQ7CisJaW50IG5vdGlmeTsKKwlpbnQgcmV0ID0gMDsKKworCXJpbmdfcmVxID0gUklOR19H RVRfUkVRVUVTVCgmaW5mby0+cmluZywgaW5mby0+cmluZy5yZXFfcHJvZF9wdnQpOworCWlk ID0gZ2V0X2lkX2Zyb21fZnJlZWxpc3QoaW5mbyk7CisJcmluZ19yZXEtPmlkID0gaWQ7CisK KwlyZXQgPSBtYXBfdXJiX2Zvcl9yZXF1ZXN0KGluZm8sIHVyYiwgcmluZ19yZXEpOworCWlm IChyZXQgPCAwKSB7CisJCWFkZF9pZF90b19mcmVlbGlzdChpbmZvLCBpZCk7CisJCXJldHVy biByZXQ7CisJfQorCisJaW5mby0+cmluZy5yZXFfcHJvZF9wdnQrKzsKKwlpbmZvLT5zaGFk b3dbaWRdLnVyYiA9IHVyYjsKKwlpbmZvLT5zaGFkb3dbaWRdLnJlcSA9ICpyaW5nX3JlcTsK Kwl1cmJwLT5yZXFfaWQgPSBpZDsKKworCVJJTkdfUFVTSF9SRVFVRVNUU19BTkRfQ0hFQ0tf Tk9USUZZKCZpbmZvLT5yaW5nLCBub3RpZnkpOworCWlmIChub3RpZnkpCisJCW5vdGlmeV9y ZW1vdGVfdmlhX2lycShpbmZvLT5pcnEpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGlj IHZvaWQgeGVuaGNkX2tpY2tfcGVuZGluZ191cmJzKHN0cnVjdCB1c2Jmcm9udF9pbmZvICpp bmZvKQoreworCXN0cnVjdCB1cmJfcHJpdiAqdXJicDsKKwlpbnQgcmV0OworCisJd2hpbGUg KCFsaXN0X2VtcHR5KCZpbmZvLT5wZW5kaW5nX3VyYnMpKSB7CisJCWlmIChSSU5HX0ZVTEwo JmluZm8tPnJpbmcpKSB7CisJCQlDT1VOVChpbmZvLT5zdGF0cy5yaW5nX2Z1bGwpOworCQkJ dGltZXJfYWN0aW9uKGluZm8sIFRJTUVSX1JJTkdfV0FUQ0hET0cpOworCQkJZ290byBkb25l OworCQl9CisKKwkJdXJicCA9IGxpc3RfZW50cnkoaW5mby0+cGVuZGluZ191cmJzLm5leHQs IHN0cnVjdCB1cmJfcHJpdiwgbGlzdCk7CisJCXJldCA9IHhlbmhjZF9kb19yZXF1ZXN0KGlu Zm8sIHVyYnApOworCQlpZiAocmV0ID09IDApCisJCQlsaXN0X21vdmVfdGFpbCgmdXJicC0+ bGlzdCwgJmluZm8tPmlucHJvZ3Jlc3NfdXJicyk7CisJCWVsc2UKKwkJCXhlbmhjZF9naXZl YmFja191cmIoaW5mbywgdXJicC0+dXJiKTsKKwl9CisJdGltZXJfYWN0aW9uX2RvbmUoaW5m bywgVElNRVJfU0NBTl9QRU5ESU5HX1VSQlMpOworCitkb25lOgorCXJldHVybjsKK30KKwor c3RhdGljIHZvaWQgeGVuaGNkX2dpdmViYWNrX3VubGlua2VkX3VyYnMoc3RydWN0IHVzYmZy b250X2luZm8gKmluZm8pCit7CisJc3RydWN0IHVyYl9wcml2ICp1cmJwLCAqdG1wOworCisJ bGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVyYnAsIHRtcCwgJmluZm8tPnVubGlua2VkX3Vy YnMsIGxpc3QpIHsKKwkJeGVuaGNkX2dpdmViYWNrX3VyYihpbmZvLCB1cmJwLT51cmIpOwor CX0KK30KKworc3RhdGljIGludCB4ZW5oY2Rfc3VibWl0X3VyYihzdHJ1Y3QgdXNiZnJvbnRf aW5mbyAqaW5mbywgc3RydWN0IHVyYl9wcml2ICp1cmJwKQoreworCWludCByZXQgPSAwOwor CisJaWYgKFJJTkdfRlVMTCgmaW5mby0+cmluZykpIHsKKwkJbGlzdF9hZGRfdGFpbCgmdXJi cC0+bGlzdCwgJmluZm8tPnBlbmRpbmdfdXJicyk7CisJCUNPVU5UKGluZm8tPnN0YXRzLnJp bmdfZnVsbCk7CisJCXRpbWVyX2FjdGlvbihpbmZvLCBUSU1FUl9SSU5HX1dBVENIRE9HKTsK KwkJZ290byBkb25lOworCX0KKworCWlmICghbGlzdF9lbXB0eSgmaW5mby0+cGVuZGluZ191 cmJzKSkgeworCQlsaXN0X2FkZF90YWlsKCZ1cmJwLT5saXN0LCAmaW5mby0+cGVuZGluZ191 cmJzKTsKKwkJdGltZXJfYWN0aW9uKGluZm8sIFRJTUVSX1NDQU5fUEVORElOR19VUkJTKTsK KwkJZ290byBkb25lOworCX0KKworCXJldCA9IHhlbmhjZF9kb19yZXF1ZXN0KGluZm8sIHVy YnApOworCWlmIChyZXQgPT0gMCkKKwkJbGlzdF9hZGRfdGFpbCgmdXJicC0+bGlzdCwgJmlu Zm8tPmlucHJvZ3Jlc3NfdXJicyk7CisKK2RvbmU6CisJcmV0dXJuIHJldDsKK30KKworc3Rh dGljIGludCB4ZW5oY2RfdW5saW5rX3VyYihzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbywg c3RydWN0IHVyYl9wcml2ICp1cmJwKQoreworCWlmICh1cmJwLT51bmxpbmtlZCkKKwkJcmV0 dXJuIC1FQlVTWTsKKwl1cmJwLT51bmxpbmtlZCA9IDE7CisKKwkvKiBpZiB0aGUgdXJiIGlz IGluIHBlbmRpbmdfdXJicyAqLworCWlmICh1cmJwLT5yZXFfaWQgPT0gfjApIHsKKwkJbGlz dF9tb3ZlX3RhaWwoJnVyYnAtPmxpc3QsICZpbmZvLT51bmxpbmtlZF91cmJzKTsKKwkJdGlt ZXJfYWN0aW9uKGluZm8sIFRJTUVSX1NDQU5fUEVORElOR19VUkJTKTsKKwl9CisKKwkvKiBU T0RPOiBzZW5kIGNhbmNlbCByZXF1ZXN0IHRvIGJhY2tlbmQgKi8KKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IHhlbmhjZF9lbmRfc3VibWl0X3VyYihzdHJ1Y3QgdXNiZnJvbnRf aW5mbyAqaW5mbykKK3sKKwl1c2JpZl9yZXNwb25zZV90ICpyaW5nX3JlczsKKwlzdHJ1Y3Qg dXJiICp1cmI7CisJc3RydWN0IHVyYl9wcml2ICp1cmJwOworCisJUklOR19JRFggaSwgcnA7 CisJdWludDE2X3QgaWQ7CisJaW50IG1vcmVfdG9fZG8gPSAwOworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW5mby0+bG9jaywgZmxhZ3MpOworCXJw ID0gaW5mby0+cmluZy5zcmluZy0+cnNwX3Byb2Q7CisJcm1iKCk7IC8qIGVuc3VyZSB3ZSBz ZWUgcXVldWVkIHJlc3BvbnNlcyB1cCB0byAicnAiICovCisKKwlmb3IgKGkgPSBpbmZvLT5y aW5nLnJzcF9jb25zOyBpICE9IHJwOyBpKyspIHsKKwkJcmluZ19yZXMgPSBSSU5HX0dFVF9S RVNQT05TRSgmaW5mby0+cmluZywgaSk7CisJCWlkID0gcmluZ19yZXMtPmlkOworCQl4ZW5o Y2RfZ250dGFiX2RvbmUoJmluZm8tPnNoYWRvd1tpZF0pOworCQl1cmIgPSBpbmZvLT5zaGFk b3dbaWRdLnVyYjsKKwkJYmFycmllcigpOworCQlhZGRfaWRfdG9fZnJlZWxpc3QoaW5mbywg aWQpOworCisJCXVyYnAgPSAoc3RydWN0IHVyYl9wcml2ICopdXJiLT5oY3ByaXY7CisJCWlm IChsaWtlbHkoIXVyYnAtPnVubGlua2VkKSkgeworCQkJdXJiLT5zdGF0dXMgPSByaW5nX3Jl cy0+c3RhdHVzOworCQkJdXJiLT5hY3R1YWxfbGVuZ3RoID0gcmluZ19yZXMtPmFjdHVhbF9s ZW5ndGg7CisJCQl1cmItPmVycm9yX2NvdW50ID0gcmluZ19yZXMtPmVycm9yX2NvdW50Owor CQkJdXJiLT5zdGFydF9mcmFtZSA9IHJpbmdfcmVzLT5zdGFydF9mcmFtZTsKKwkJfQorCQli YXJyaWVyKCk7CisJCXhlbmhjZF9naXZlYmFja191cmIoaW5mbywgdXJiKTsKKwl9CisJaW5m by0+cmluZy5yc3BfY29ucyA9IGk7CisKKwlpZiAoaSAhPSBpbmZvLT5yaW5nLnJlcV9wcm9k X3B2dCkKKwkJUklOR19GSU5BTF9DSEVDS19GT1JfUkVTUE9OU0VTKCZpbmZvLT5yaW5nLCBt b3JlX3RvX2RvKTsKKwllbHNlCisJCWluZm8tPnJpbmcuc3JpbmctPnJzcF9ldmVudCA9IGkg KyAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW5mby0+bG9jaywgZmxhZ3MpOwor CisJY29uZF9yZXNjaGVkKCk7CisKKwlyZXR1cm4gbW9yZV90b19kbzsKK30KKworaW50IHhl bmhjZF9zY2hlZHVsZSh2b2lkICphcmcpCit7CisJc3RydWN0IHVzYmZyb250X2luZm8gKmlu Zm8gPSAoc3RydWN0IHVzYmZyb250X2luZm8gKikgYXJnOworCisJd2hpbGUgKCFrdGhyZWFk X3Nob3VsZF9zdG9wKCkpIHsKKwkJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKAorCQkJCWlu Zm8tPndxLAorCQkJCWluZm8tPndhaXRpbmdfcmVzcCB8fCBrdGhyZWFkX3Nob3VsZF9zdG9w KCkpOworCQlpbmZvLT53YWl0aW5nX3Jlc3AgPSAwOworCQlzbXBfbWIoKTsKKworCQlpZiAo eGVuaGNkX2VuZF9zdWJtaXRfdXJiKGluZm8pKQorCQkJaW5mby0+d2FpdGluZ19yZXNwID0g MTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeGVuaGNkX25vdGlmeV93 b3JrKHN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvKQoreworCWluZm8tPndhaXRpbmdfcmVz cCA9IDE7CisJd2FrZV91cCgmaW5mby0+d3EpOworfQorCitpcnFyZXR1cm5fdCB4ZW5oY2Rf aW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnB0cmVncykKK3sK Kwl4ZW5oY2Rfbm90aWZ5X3dvcmsoKHN0cnVjdCB1c2Jmcm9udF9pbmZvICopIGRldl9pZCk7 CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQpkaWZmIC1yIDUxZGVjYzM5ZTVlNyAtciA5ZWYy ZThjNmNmM2QgZHJpdmVycy94ZW4vdXNiZnJvbnQvdXNiZnJvbnQuaAotLS0gL2Rldi9udWxs CVRodSBKYW4gMDEgMDA6MDA6MDAgMTk3MCArMDAwMAorKysgYi9kcml2ZXJzL3hlbi91c2Jm cm9udC91c2Jmcm9udC5oCU1vbiBNYXIgMTYgMTg6NDE6MTIgMjAwOSArMDkwMApAQCAtMCww ICsxLDIxNiBAQAorLyoKKyAqIHVzYmZyb250LmgKKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFy dCBvZiBYZW4gVVNCIFZpcnR1YWwgSG9zdCBDb250cm9sbGVyIGRyaXZlci4KKyAqCisgKiBD b3B5cmlnaHQgKEMpIDIwMDksIEZVSklUU1UgTEFCT1JBVE9SSUVTIExURC4KKyAqIEF1dGhv cjogTm9ib3J1IEl3YW1hdHN1IDxuX2l3YW1hdHN1QGpwLmZ1aml0c3UuY29tPgorICoKKyAq IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5l cmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAq IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9n cmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFS VElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg YSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0 aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5z ZXMvPi4KKyAqCisgKiBvciwKKyAqCisgKiBXaGVuIGRpc3RyaWJ1dGVkIHNlcGFyYXRlbHkg ZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvCisgKiBvdGhlciBz b2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6Cisg KgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRv IGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQg YXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvCisg KiBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcg d2l0aG91dCBsaW1pdGF0aW9uIHRoZQorICogcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5 LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yCisgKiBz ZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3 aG9tIHRoZSBTb2Z0d2FyZSBpcworICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0 IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBp bgorICogYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdh cmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQg V0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElO RyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ LAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdF TUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFCisgKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBI T0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBM SUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9U SEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lU SCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUgorICogREVBTElOR1MgSU4gVEhF IFNPRlRXQVJFLgorICovCisKKyNpZm5kZWYgX19YRU5fVVNCRlJPTlRfSF9fCisjZGVmaW5l IF9fWEVOX1VTQkZST05UX0hfXworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5j bHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUg PGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisjaW5jbHVkZSA8 YXNtL2lvLmg+CisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorI2luY2x1ZGUgPHhlbi9ldnRj aG4uaD4KKyNpbmNsdWRlIDx4ZW4vZ250dGFiLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFj ZS94ZW4uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL2lvL3VzYmlmLmg+CisKKy8qCisg KiB1c2Jmcm9udCBuZWVkcyBVU0IgSENEIGhlYWRlcnMsCisgKiBkcml2ZXJzL3VzYi9jb3Jl L2hjZC5oIGFuZCBkcml2ZXJzL3VzYi9jb3JlL2h1Yi5oLAorICogYnV0LCB0aGV5IGFyZSBu b3QgaW4gcHVibGljIGluY2x1ZGUgcGF0aC4KKyAqLworI2luY2x1ZGUgIi4uLy4uL3VzYi9j b3JlL2hjZC5oIgorI2luY2x1ZGUgIi4uLy4uL3VzYi9jb3JlL2h1Yi5oIgorCisjZGVmaW5l IERSSVZFUl9ERVNDICJYZW4gVVNCMi4wIFZpcnR1YWwgSG9zdCBDb250cm9sbGVyIGRyaXZl ciAodXNiZnJvbnQpIgorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB1c2Jmcm9udF9pbmZvICpo Y2RfdG9faW5mbyhzdHJ1Y3QgdXNiX2hjZCAqaGNkKQoreworCXJldHVybiAoc3RydWN0IHVz YmZyb250X2luZm8gKikgKGhjZC0+aGNkX3ByaXYpOworfQorCitzdGF0aWMgaW5saW5lIHN0 cnVjdCB1c2JfaGNkICppbmZvX3RvX2hjZChzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbykK K3sKKwlyZXR1cm4gY29udGFpbmVyX29mICgodm9pZCAqKSBpbmZvLCBzdHJ1Y3QgdXNiX2hj ZCwgaGNkX3ByaXYpOworfQorCisvKgorICogUHJpdmF0ZSBwZXItVVJCIGRhdGEKKyAqLwor c3RydWN0IHVyYl9wcml2IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisJc3RydWN0IHVy YiAqdXJiOworCWludCByZXFfaWQ7CS8qIFJJTkdfUkVRVUVTVCBpZCAqLworCXVuc2lnbmVk IHVubGlua2VkOjE7IC8qIGRlcXVldWVkIHVyYiBqdXN0IG1hcmtlZCAqLworfTsKKworLyog dmlydHVhbCByb290aHViIHBvcnQgc3RhdHVzICovCitzdHJ1Y3Qgcmhwb3J0X3N0YXR1cyB7 CisJdTMyIHN0YXR1czsKKwl1bnNpZ25lZCByZXN1bWluZzoxOyAvKiBpbiByZXN1bWluZyAq LworCXVuc2lnbmVkIGNfY29ubmVjdGlvbjoxOyAvKiBjb25uZWN0aW9uIGNoYW5nZWQgKi8K Kwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Cit9OworCisvKiBzdGF0dXMgb2YgYXR0YWNoZWQg ZGV2aWNlICovCitzdHJ1Y3QgdmRldmljZV9zdGF0dXMgeworCWludCBkZXZudW07CisJZW51 bSB1c2JfZGV2aWNlX3N0YXRlIHN0YXR1czsKKwllbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3Bl ZWQ7Cit9OworCisvKiBSSU5HIHJlcXVlc3Qgc2hhZG93ICovCitzdHJ1Y3QgdXNiX3NoYWRv dyB7CisJdXNiaWZfcmVxdWVzdF90IHJlcTsKKwlzdHJ1Y3QgdXJiICp1cmI7Cit9OworCisv KiBzdGF0aXN0aWNzIGZvciB0dW5pbmcsIG1vbml0b3JpbmcsIC4uLiAqLworc3RydWN0IHhl bmhjZF9zdGF0cyB7CisJdW5zaWduZWQgbG9uZyByaW5nX2Z1bGw7IC8qIFJJTkdfRlVMTCBj b25kaXRpb25zICovCisJdW5zaWduZWQgbG9uZyBjb21wbGV0ZTsgLyogbm9ybWFsIGdpdmVi YWNrZWQgdXJicyAqLworCXVuc2lnbmVkIGxvbmcgdW5saW5rOyAvKiB1bmxpbmtlZCB1cmJz ICovCit9OworCitzdHJ1Y3QgdXNiZnJvbnRfaW5mbyB7CisJLyoKKwkgKiBWaXJ0dWFsIEhv c3QgQ29udHJvbGxlciBoYXMgMyBxdWV1ZXMuCisJICoKKwkgKiBwZW5kaW5nX3VyYnM6CisJ ICogCUlmIHhlbmhjZF91cmJfZW5xdWV1ZSgpIGNhbGxlZCBpbiBSSU5HX0ZVTEwgc3RhdGUs CisJICogCXRoZSBlbnF1ZXVlZCB1cmJzIGFyZSBhZGRlZCB0byB0aGlzIHF1ZXVlLCBhbmQg d2FpdHMKKwkgKiAJdG8gYmUgc2VudCB0byB0aGUgYmFja2VuZC4KKwkgKgorCSAqIGlucHJv Z3Jlc3NfdXJiczoKKwkgKiAJQWZ0ZXIgeGVuaGNkX3VyYl9lbnF1ZXVlKCkgY2FsbGVkIGFu ZCBSSU5HX1JFUVVFU1Qgc2VudCwKKwkgKiAJdGhlIHVyYnMgYXJlIGFkZGVkIHRvIHRoaXMg cXVldWUgYW5kIHdhaXRzIGZvciBSSU5HX1JFU1BPTlNFLgorCSAqCisJICogdW5saW5rZWRf dXJiczoKKwkgKglXaGVuIHhlbmhjZF91cmJfZGVxdWV1ZSgpIGNhbGxlZCwgaWYgdGhlIGRl cXVldWVkIHVyYiBpcworCSAqCWxpc3RlZCBpbiBwZW5kaW5nX3VyYnMsIHRoYXQgdXJiIGlz IG1vdmVkIHRvIHRoaXMgcXVldWUKKwkgKglhbmQgd2FpdHMgdG8gYmUgZ2l2ZW4gYmFjayB0 byB0aGUgVVNCIGNvcmUuCisJICovCisJc3RydWN0IGxpc3RfaGVhZCBwZW5kaW5nX3VyYnM7 CisJc3RydWN0IGxpc3RfaGVhZCBpbnByb2dyZXNzX3VyYnM7CisJc3RydWN0IGxpc3RfaGVh ZCB1bmxpbmtlZF91cmJzOworCXNwaW5sb2NrX3QgbG9jazsKKworCS8qCisJICogdGltZXIg ZnVuY3Rpb24gdGhhdCBraWNrIHBlbmRpbmdfdXJicyBhbmQgdW5saW5rX3VyYnMuCisJICov CisJdW5zaWduZWQgbG9uZyBhY3Rpb25zOworCXN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9n OworCisJLyoKKwkgKiBWaXJ0dWFsIHJvb3RodWI6CisJICogRW11bGF0ZXMgdGhlIGh1YiBw b3J0cyBhbmQgdGhlIGF0dGFjaGVkIGRldmljZXMgc3RhdHVzLgorCSAqIFVTQl9NQVhDSElM RFJFTiBpcyBkZWZpbmVkICgxNikgaW4gaW5jbHVkZS9saW51eC91c2IuaAorCSAqLworCWlu dCByaF9udW1wb3J0czsKKwlzdHJ1Y3Qgcmhwb3J0X3N0YXR1cyBwb3J0c1tVU0JfTUFYQ0hJ TERSRU5dOworCXN0cnVjdCB2ZGV2aWNlX3N0YXR1cyBkZXZpY2VzW1VTQl9NQVhDSElMRFJF Tl07CisKKyNpZmRlZiBYRU5IQ0RfU1RBVFMKKwlzdHJ1Y3QgeGVuaGNkX3N0YXRzIHN0YXRz OworI2RlZmluZSBDT1VOVCh4KSBkbyB7ICh4KSsrOyB9IHdoaWxlICgwKQorI2Vsc2UKKyNk ZWZpbmUgQ09VTlQoeCkgZG8ge30gd2hpbGUgKDApCisjZW5kaWYKKworCS8qIFhlbiByZWxh dGVkIHN0YWZmICovCisJc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhiZGV2OworCWludCByaW5n X3JlZjsKKwl1c2JpZl9mcm9udF9yaW5nX3QgcmluZzsKKwl1bnNpZ25lZCBpbnQgaXJxOwor CXN0cnVjdCB1c2Jfc2hhZG93IHNoYWRvd1tVU0JfUklOR19TSVpFXTsKKwl1bnNpZ25lZCBs b25nIHNoYWRvd19mcmVlOworCisJLyogUklOR19SRVNQT05TRSB0aHJlYWQgKi8KKwlzdHJ1 Y3QgdGFza19zdHJ1Y3QgKmt0aHJlYWQ7CisJd2FpdF9xdWV1ZV9oZWFkX3Qgd3E7CisJdW5z aWduZWQgaW50IHdhaXRpbmdfcmVzcDsKK307CisKKyNkZWZpbmUgWEVOSENEX1JJTkdfSklG RklFUyAoSFovMjAwKQorI2RlZmluZSBYRU5IQ0RfU0NBTl9KSUZGSUVTIDEKKworZW51bSB4 ZW5oY2RfdGltZXJfYWN0aW9uIHsKKwlUSU1FUl9SSU5HX1dBVENIRE9HLAorCVRJTUVSX1ND QU5fUEVORElOR19VUkJTLAorfTsKKworc3RhdGljIGlubGluZSB2b2lkCit0aW1lcl9hY3Rp b25fZG9uZShzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbywgZW51bSB4ZW5oY2RfdGltZXJf YWN0aW9uIGFjdGlvbikKK3sKKwljbGVhcl9iaXQoYWN0aW9uLCAmaW5mby0+YWN0aW9ucyk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAordGltZXJfYWN0aW9uKHN0cnVjdCB1c2Jmcm9u dF9pbmZvICppbmZvLCBlbnVtIHhlbmhjZF90aW1lcl9hY3Rpb24gYWN0aW9uKQoreworCWlm ICh0aW1lcl9wZW5kaW5nKCZpbmZvLT53YXRjaGRvZykKKwkJCSYmIHRlc3RfYml0KFRJTUVS X1NDQU5fUEVORElOR19VUkJTLCAmaW5mby0+YWN0aW9ucykpCisJCXJldHVybjsKKworCWlm ICghdGVzdF9hbmRfc2V0X2JpdChhY3Rpb24sICZpbmZvLT5hY3Rpb25zKSkgeworCQl1bnNp Z25lZCBsb25nIHQ7CisKKwkJc3dpdGNoKGFjdGlvbikgeworCQljYXNlIFRJTUVSX1JJTkdf V0FUQ0hET0c6CisJCQl0ID0gWEVOSENEX1JJTkdfSklGRklFUzsKKwkJCWJyZWFrOworCQlk ZWZhdWx0OgorCQkJdCA9IFhFTkhDRF9TQ0FOX0pJRkZJRVM7CisJCQlicmVhazsKKwkJfQor CQltb2RfdGltZXIoJmluZm8tPndhdGNoZG9nLCB0ICsgamlmZmllcyk7CisJfQorfQorCitp cnFyZXR1cm5fdCB4ZW5oY2RfaW50KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0 X3JlZ3MgKnB0cmVncyk7CisKKyNlbmRpZiAvKiBfX1hFTl9VU0JGUk9OVF9IX18gKi8KZGlm ZiAtciA1MWRlY2MzOWU1ZTcgLXIgOWVmMmU4YzZjZjNkIGRyaXZlcnMveGVuL3VzYmZyb250 L3hlbmJ1cy5jCi0tLSAvZGV2L251bGwJVGh1IEphbiAwMSAwMDowMDowMCAxOTcwICswMDAw CisrKyBiL2RyaXZlcnMveGVuL3VzYmZyb250L3hlbmJ1cy5jCU1vbiBNYXIgMTYgMTg6NDE6 MTIgMjAwOSArMDkwMApAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIHhlbmJ1cy5jCisgKgor ICogWGVuYnVzIGludGVyZmFjZSBmb3IgWGVuIFVTQiBWaXJ0dWFsIEhvc3QgQ29udHJvbGxl cgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgRlVKSVRTVSBMQUJPUkFUT1JJRVMgTFRE LgorICogQXV0aG9yOiBOb2JvcnUgSXdhbWF0c3UgPG5faXdhbWF0c3VAanAuZnVqaXRzdS5j b20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNl bnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg KiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2 ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg KiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+LgorICoKKyAqIG9yLAorICoKKyAqIFdoZW4gZGlzdHJpYnV0ZWQg c2VwYXJhdGVseSBmcm9tIHRoZSBMaW51eCBrZXJuZWwgb3IgaW5jb3Jwb3JhdGVkIGludG8K KyAqIG90aGVyIHNvZnR3YXJlIHBhY2thZ2VzLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcg bGljZW5zZToKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9m IGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNv ZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdh cmUiKSwgdG8KKyAqIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24s IGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlCisgKiByaWdodHMgdG8gdXNlLCBj b3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBh bmQvb3IKKyAqIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBw ZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28s IHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92 ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJl IGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9m IHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElT IiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElF RCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJD SEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQg Tk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1Ig Q09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Ig T1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1Qs IFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09O TkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFM SU5HUyBJTiBUSEUgU09GVFdBUkUuCisgKi8KKworI2luY2x1ZGUgInVzYmZyb250LmgiCisK K2V4dGVybiBzdHJ1Y3QgaGNfZHJpdmVyIHVzYmZyb250X2hjX2RyaXZlcjsKK2V4dGVybiBz dHJ1Y3Qga21lbV9jYWNoZSAqeGVuaGNkX3VyYnBfY2FjaGVwOworZXh0ZXJuIHZvaWQgeGVu aGNkX3JocG9ydF9zdGF0ZV9jaGFuZ2Uoc3RydWN0IHVzYmZyb250X2luZm8gKmluZm8sCisJ CQkJCWludCBwb3J0LCBlbnVtIHVzYl9kZXZpY2Vfc3BlZWQgc3BlZWQpOworZXh0ZXJuIGlu dCB4ZW5oY2Rfc2NoZWR1bGUodm9pZCAqYXJnKTsKKworI2RlZmluZSBHUkFOVF9JTlZBTElE X1JFRiAwCisKK3N0YXRpYyB2b2lkIHVzYmlmX2ZyZWUoc3RydWN0IHVzYmZyb250X2luZm8g KmluZm8pCit7CisJaWYgKGluZm8tPnJpbmdfcmVmICE9IEdSQU5UX0lOVkFMSURfUkVGKSB7 CisJCWdudHRhYl9lbmRfZm9yZWlnbl9hY2Nlc3MoaW5mby0+cmluZ19yZWYsCisJCQkJCSAg KHVuc2lnbmVkIGxvbmcpaW5mby0+cmluZy5zcmluZyk7CisJCWluZm8tPnJpbmdfcmVmID0g R1JBTlRfSU5WQUxJRF9SRUY7CisJCWluZm8tPnJpbmcuc3JpbmcgPSBOVUxMOworCX0KKwlp ZiAoaW5mby0+aXJxKQorCQl1bmJpbmRfZnJvbV9pcnFoYW5kbGVyKGluZm8tPmlycSwgaW5m byk7CisJaW5mby0+aXJxID0gMDsKK30KKworc3RhdGljIGludCBzZXR1cF91c2JyaW5nKHN0 cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsCisJCQkgICBzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAq aW5mbykKK3sKKwl1c2JpZl9zcmluZ190ICpzcmluZzsKKwlpbnQgZXJyOworCisJaW5mby0+ cmluZ19yZWY9IEdSQU5UX0lOVkFMSURfUkVGOworCisJc3JpbmcgPSAodXNiaWZfc3Jpbmdf dCAqKWdldF96ZXJvZWRfcGFnZShHRlBfTk9JT3xfX0dGUF9ISUdIKTsKKwlpZiAoIXNyaW5n KSB7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCAtRU5PTUVNLCAiYWxsb2NhdGluZyBzaGFy ZWQgcmluZyIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJU0hBUkVEX1JJTkdfSU5JVChz cmluZyk7CisJRlJPTlRfUklOR19JTklUKCZpbmZvLT5yaW5nLCBzcmluZywgUEFHRV9TSVpF KTsKKworCWVyciA9IHhlbmJ1c19ncmFudF9yaW5nKGRldiwgdmlydF90b19tZm4oaW5mby0+ cmluZy5zcmluZykpOworCWlmIChlcnIgPCAwKSB7CisJCWZyZWVfcGFnZSgodW5zaWduZWQg bG9uZylzcmluZyk7CisJCWluZm8tPnJpbmcuc3JpbmcgPSBOVUxMOworCQlnb3RvIGZhaWw7 CisJfQorCWluZm8tPnJpbmdfcmVmID0gZXJyOworCisJZXJyID0gYmluZF9saXN0ZW5pbmdf cG9ydF90b19pcnFoYW5kbGVyKAorCQlkZXYtPm90aGVyZW5kX2lkLCB4ZW5oY2RfaW50LCBT QV9TQU1QTEVfUkFORE9NLCAidXNiaWYiLCBpbmZvKTsKKwlpZiAoZXJyIDw9IDApIHsKKwkJ eGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwKKwkJCQkgImJpbmRfbGlzdGVuaW5nX3BvcnRf dG9faXJxaGFuZGxlciIpOworCQlnb3RvIGZhaWw7CisJfQorCWluZm8tPmlycSA9IGVycjsK KworCXJldHVybiAwOworZmFpbDoKKwl1c2JpZl9mcmVlKGluZm8pOworCXJldHVybiBlcnI7 Cit9CisKK3N0YXRpYyBpbnQgdGFsa190b19iYWNrZW5kKHN0cnVjdCB4ZW5idXNfZGV2aWNl ICpkZXYsCisJCQkgICBzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5mbykKK3sKKwljb25zdCBj aGFyICptZXNzYWdlOworCXN0cnVjdCB4ZW5idXNfdHJhbnNhY3Rpb24geGJ0OworCWludCBl cnI7CisKKwllcnIgPSBzZXR1cF91c2JyaW5nKGRldiwgaW5mbyk7CisJaWYgKGVycikKKwkJ Z290byBvdXQ7CisKK2FnYWluOgorCWVyciA9IHhlbmJ1c190cmFuc2FjdGlvbl9zdGFydCgm eGJ0KTsKKwlpZiAoZXJyKSB7CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJzdGFy dGluZyB0cmFuc2FjdGlvbiIpOworCQlnb3RvIGRlc3Ryb3lfcmluZzsKKwl9CisKKwllcnIg PSB4ZW5idXNfcHJpbnRmKHhidCwgZGV2LT5ub2RlbmFtZSwgInJpbmctcmVmIiwgIiV1IiwK KwkJCSAgICBpbmZvLT5yaW5nX3JlZik7CisJaWYgKGVycikgeworCQltZXNzYWdlID0gIndy aXRpbmcgcmluZy1yZWYiOworCQlnb3RvIGFib3J0X3RyYW5zYWN0aW9uOworCX0KKworCWVy ciA9IHhlbmJ1c19wcmludGYoeGJ0LCBkZXYtPm5vZGVuYW1lLCAiZXZlbnQtY2hhbm5lbCIs ICIldSIsCisJCQkgICAgaXJxX3RvX2V2dGNobl9wb3J0KGluZm8tPmlycSkpOworCWlmIChl cnIpIHsKKwkJbWVzc2FnZSA9ICJ3cml0aW5nIGV2ZW50LWNoYW5uZWwiOworCQlnb3RvIGFi b3J0X3RyYW5zYWN0aW9uOworCX0KKworCWVyciA9IHhlbmJ1c190cmFuc2FjdGlvbl9lbmQo eGJ0LCAwKTsKKwlpZiAoZXJyKSB7CisJCWlmIChlcnIgPT0gLUVBR0FJTikKKwkJCWdvdG8g YWdhaW47CisJCXhlbmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJjb21wbGV0aW5nIHRyYW5z YWN0aW9uIik7CisJCWdvdG8gZGVzdHJveV9yaW5nOworCX0KKworCXhlbmJ1c19zd2l0Y2hf c3RhdGUoZGV2LCBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKTsKKworCXJldHVybiAwOworCith Ym9ydF90cmFuc2FjdGlvbjoKKwl4ZW5idXNfdHJhbnNhY3Rpb25fZW5kKHhidCwgMSk7CisJ eGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgIiVzIiwgbWVzc2FnZSk7CisKK2Rlc3Ryb3lf cmluZzoKKwl1c2JpZl9mcmVlKGluZm8pOworCitvdXQ6CisJcmV0dXJuIGVycjsKK30KKwor c3RhdGljIHN0cnVjdCB1c2JfaGNkICpjcmVhdGVfaGNkKHN0cnVjdCB4ZW5idXNfZGV2aWNl ICpkZXYpCit7CisJaW50IGk7CisJaW50IGVyciA9IDA7CisJaW50IG51bV9wb3J0czsKKwlz dHJ1Y3QgdXNiX2hjZCAqaGNkID0gTlVMTDsKKwlzdHJ1Y3QgdXNiZnJvbnRfaW5mbyAqaW5m byA9IE5VTEw7CisKKwllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgZGV2LT5vdGhlcmVu ZCwKKwkJCQkJIm51bS1wb3J0cyIsICIlZCIsICZudW1fcG9ydHMpOworCWlmIChlcnIgIT0g MSkgeworCQl4ZW5idXNfZGV2X2ZhdGFsKGRldiwgZXJyLCAicmVhZGluZyBudW0tcG9ydHMi KTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJfQorCWlmIChudW1fcG9ydHMgPCAx IHx8IG51bV9wb3J0cyA+IFVTQl9NQVhDSElMRFJFTikgeworCQl4ZW5idXNfZGV2X2ZhdGFs KGRldiwgZXJyLCAiaW52YWxpZCBudW0tcG9ydHMiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVJ TlZBTCk7CisJfQorCisJaGNkID0gdXNiX2NyZWF0ZV9oY2QoJnVzYmZyb250X2hjX2RyaXZl ciwgJmRldi0+ZGV2LCBkZXYtPmRldi5idXNfaWQpOworCWlmICghaGNkKSB7CisJCXhlbmJ1 c19kZXZfZmF0YWwoZGV2LCBlcnIsICJmYWlsIHRvIGFsbG9jYXRlIFVTQiBob3N0IGNvbnRy b2xsZXIiKTsKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisJfQorCWluZm8gPSBoY2Rf dG9faW5mbyhoY2QpOworCWluZm8tPnhiZGV2ID0gZGV2OworCWluZm8tPnJoX251bXBvcnRz ID0gbnVtX3BvcnRzOworCisJZm9yIChpID0gMDsgaSA8IFVTQl9SSU5HX1NJWkU7IGkrKykg eworCQlpbmZvLT5zaGFkb3dbaV0ucmVxLmlkID0gaSsxOworCQlpbmZvLT5zaGFkb3dbaV0u dXJiID0gTlVMTDsKKwl9CisJaW5mby0+c2hhZG93W1VTQl9SSU5HX1NJWkUtMV0ucmVxLmlk ID0gMHgwZmZmOworCisJcmV0dXJuIGhjZDsKK30KKworc3RhdGljIGludCB1c2Jmcm9udF9w cm9iZShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2LAorCQkJICBjb25zdCBzdHJ1Y3QgeGVu YnVzX2RldmljZV9pZCAqaWQpCit7CisJaW50IGVycjsKKwlzdHJ1Y3QgdXNiX2hjZCAqaGNk OworCXN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvOworCWNoYXIgbmFtZVtUQVNLX0NPTU1f TEVOXTsKKworCWlmICh1c2JfZGlzYWJsZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlo Y2QgPSBjcmVhdGVfaGNkKGRldik7CisJaWYgKElTX0VSUihoY2QpKSB7CisJCWVyciA9IFBU Ul9FUlIoaGNkKTsKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIGVyciwgImZhaWwgdG8gY3Jl YXRlIHVzYiBob3N0IGNvbnRyb2xsZXIiKTsKKwkJZ290byBmYWlsOworCX0KKworCWluZm8g PSBoY2RfdG9faW5mbyhoY2QpOworCWRldi0+ZGV2LmRyaXZlcl9kYXRhID0gaW5mbzsKKwor CWVyciA9IHVzYl9hZGRfaGNkKGhjZCwgMCwgMCk7CisJaWYgKGVyciAhPSAwKSB7CisJCXhl bmJ1c19kZXZfZmF0YWwoZGV2LCBlcnIsICJmYWlsIHRvIGFkZGluZyBVU0IgaG9zdCBjb250 cm9sbGVyIik7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpbml0X3dhaXRxdWV1ZV9oZWFkKCZp bmZvLT53cSk7CisJc25wcmludGYobmFtZSwgVEFTS19DT01NX0xFTiwgInhlbmhjZC4lZCIs IGhjZC0+c2VsZi5idXNudW0pOworCWluZm8tPmt0aHJlYWQgPSBrdGhyZWFkX3J1bih4ZW5o Y2Rfc2NoZWR1bGUsIGluZm8sIG5hbWUpOworICAgICAgICBpZiAoSVNfRVJSKGluZm8tPmt0 aHJlYWQpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gUFRSX0VSUihpbmZvLT5rdGhyZWFk KTsKKyAgICAgICAgICAgICAgICBpbmZvLT5rdGhyZWFkID0gTlVMTDsKKyAgICAgICAgICAg ICAgICBnb3RvIGZhaWw7CisgICAgICAgIH0KKworCWVyciA9IHRhbGtfdG9fYmFja2VuZChk ZXYsIGluZm8pOworCWlmIChlcnIpCisJCWdvdG8gZmFpbDsKKworCXJldHVybiAwOworCitm YWlsOgorCXVzYl9wdXRfaGNkKGhjZCk7CisJZGV2LT5kZXYuZHJpdmVyX2RhdGEgPSBOVUxM OworCXJldHVybiBlcnI7Cit9CisKKy8qCisgKiAwPWRpc2Nvbm5lY3RlZCwgMT1sb3dfc3Bl ZWQsIDI9ZnVsbF9zcGVlZCwgMz1oaWdoX3NwZWVkCisgKi8KK3N0YXRpYyB2b2lkIHVzYmZy b250X2RvX2hvdHBsdWcoc3RydWN0IHVzYmZyb250X2luZm8gKmluZm8pCit7CisJY2hhciBw b3J0X3N0cls4XTsKKwlpbnQgaTsKKwlpbnQgZXJyOworCWludCBzdGF0ZTsKKworCWZvciAo aSA9IDE7IGkgPD0gaW5mby0+cmhfbnVtcG9ydHM7IGkrKykgeworCQlzcHJpbnRmKHBvcnRf c3RyLCAicG9ydC0lZCIsIGkpOworCQllcnIgPSB4ZW5idXNfc2NhbmYoWEJUX05JTCwgaW5m by0+eGJkZXYtPm90aGVyZW5kLAorCQkJCQlwb3J0X3N0ciwgIiVkIiwgJnN0YXRlKTsKKwkJ aWYgKGVyciA9PSAxKQorCQkJeGVuaGNkX3JocG9ydF9zdGF0ZV9jaGFuZ2UoaW5mbywgaSwg c3RhdGUpOworCX0KK30KKworc3RhdGljIHZvaWQgYmFja2VuZF9jaGFuZ2VkKHN0cnVjdCB4 ZW5idXNfZGV2aWNlICpkZXYsCisJCQkJICAgICBlbnVtIHhlbmJ1c19zdGF0ZSBiYWNrZW5k X3N0YXRlKQoreworCXN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvID0gZGV2LT5kZXYuZHJp dmVyX2RhdGE7CisKKwlzd2l0Y2ggKGJhY2tlbmRfc3RhdGUpIHsKKwljYXNlIFhlbmJ1c1N0 YXRlSW5pdGlhbGlzaW5nOgorCWNhc2UgWGVuYnVzU3RhdGVJbml0V2FpdDoKKwljYXNlIFhl bmJ1c1N0YXRlSW5pdGlhbGlzZWQ6CisJY2FzZSBYZW5idXNTdGF0ZVVua25vd246CisJY2Fz ZSBYZW5idXNTdGF0ZUNsb3NlZDoKKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0YXRlQ29u bmVjdGVkOgorCQlpZiAoZGV2LT5zdGF0ZSA9PSBYZW5idXNTdGF0ZUNvbm5lY3RlZCkKKwkJ CWJyZWFrOworCQlpZiAoZGV2LT5zdGF0ZSA9PSBYZW5idXNTdGF0ZUluaXRpYWxpc2VkKQor CQkJdXNiZnJvbnRfZG9faG90cGx1ZyhpbmZvKTsKKwkJeGVuYnVzX3N3aXRjaF9zdGF0ZShk ZXYsIFhlbmJ1c1N0YXRlQ29ubmVjdGVkKTsKKwkJYnJlYWs7CisKKwljYXNlIFhlbmJ1c1N0 YXRlQ2xvc2luZzoKKwkJeGVuYnVzX2Zyb250ZW5kX2Nsb3NlZChkZXYpOworCQlicmVhazsK KworCWNhc2UgWGVuYnVzU3RhdGVSZWNvbmZpZ3VyaW5nOgorCQlpZiAoZGV2LT5zdGF0ZSA9 PSBYZW5idXNTdGF0ZUNvbm5lY3RlZCkKKwkJCXhlbmJ1c19zd2l0Y2hfc3RhdGUoZGV2LCBY ZW5idXNTdGF0ZVJlY29uZmlndXJpbmcpOworCQlicmVhazsKKworCWNhc2UgWGVuYnVzU3Rh dGVSZWNvbmZpZ3VyZWQ6CisJCXVzYmZyb250X2RvX2hvdHBsdWcoaW5mbyk7CisJCXhlbmJ1 c19zd2l0Y2hfc3RhdGUoZGV2LCBYZW5idXNTdGF0ZUNvbm5lY3RlZCk7CisJCWJyZWFrOwor CisJZGVmYXVsdDoKKwkJeGVuYnVzX2Rldl9mYXRhbChkZXYsIC1FSU5WQUwsICJzYXcgc3Rh dGUgJWQgYXQgZnJvbnRlbmQiLAorCQkJCSBiYWNrZW5kX3N0YXRlKTsKKwkJYnJlYWs7CisJ fQorfQorCitzdGF0aWMgaW50IHVzYmZyb250X3JlbW92ZShzdHJ1Y3QgeGVuYnVzX2Rldmlj ZSAqZGV2KQoreworCXN0cnVjdCB1c2Jmcm9udF9pbmZvICppbmZvID0gZGV2LT5kZXYuZHJp dmVyX2RhdGE7CisJc3RydWN0IHVzYl9oY2QgKmhjZCA9IGluZm9fdG9faGNkKGluZm8pOwor CisJdXNiX3JlbW92ZV9oY2QoaGNkKTsKKwlpZiAoaW5mby0+a3RocmVhZCkgeworCQlrdGhy ZWFkX3N0b3AoaW5mby0+a3RocmVhZCk7CisJCWluZm8tPmt0aHJlYWQgPSBOVUxMOworCX0K Kwl1c2JpZl9mcmVlKGluZm8pOworCXVzYl9wdXRfaGNkKGhjZCk7CisKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB4ZW5idXNfZGV2aWNlX2lkIHVzYmZyb250X2lk c1tdID0geworCXsgInZ1c2IiIH0sCisJeyAiIiB9LAorfTsKKworc3RhdGljIHN0cnVjdCB4 ZW5idXNfZHJpdmVyIHVzYmZyb250X2RyaXZlciA9IHsKKwkubmFtZSA9ICJ2dXNiIiwKKwku b3duZXIgPSBUSElTX01PRFVMRSwKKwkuaWRzID0gdXNiZnJvbnRfaWRzLAorCS5wcm9iZSA9 IHVzYmZyb250X3Byb2JlLAorCS5vdGhlcmVuZF9jaGFuZ2VkID0gYmFja2VuZF9jaGFuZ2Vk LAorCS5yZW1vdmUgPSB1c2Jmcm9udF9yZW1vdmUsCit9OworCitzdGF0aWMgaW50IF9faW5p dCB1c2Jmcm9udF9pbml0KHZvaWQpCit7CisJaWYgKCFpc19ydW5uaW5nX29uX3hlbigpKQor CQlyZXR1cm4gLUVOT0RFVjsKKworCXhlbmhjZF91cmJwX2NhY2hlcCA9IGttZW1fY2FjaGVf Y3JlYXRlKCJ4ZW5oY2RfdXJiX3ByaXYiLAorCQkJc2l6ZW9mKHN0cnVjdCB1cmJfcHJpdiks IDAsIDAsIE5VTEwsIE5VTEwpOworCWlmICgheGVuaGNkX3VyYnBfY2FjaGVwKSB7CisJCXBy aW50ayhLRVJOX0VSUiAidXNiZnJvbnQgZmFpbGVkIHRvIGNyZWF0ZSBrbWVtIGNhY2hlXG4i KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmV0dXJuIHhlbmJ1c19yZWdpc3Rlcl9m cm9udGVuZCgmdXNiZnJvbnRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHVz YmZyb250X2V4aXQodm9pZCkKK3sKKwlrbWVtX2NhY2hlX2Rlc3Ryb3koeGVuaGNkX3VyYnBf Y2FjaGVwKTsKKwl4ZW5idXNfdW5yZWdpc3Rlcl9kcml2ZXIoJnVzYmZyb250X2RyaXZlcik7 Cit9CisKK21vZHVsZV9pbml0KHVzYmZyb250X2luaXQpOworbW9kdWxlX2V4aXQodXNiZnJv bnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIiIpOworTU9EVUxFX0RFU0NSSVBUSU9OKERS SVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNFKCJEdWFsIEJTRC9HUEwiKTsK --------------000208080901030502080408 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Xen-devel mailing list Xen-devel@lists.xensource.com http://lists.xensource.com/xen-devel --------------000208080901030502080408--