Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755967Ab2FPRSm (ORCPT ); Sat, 16 Jun 2012 13:18:42 -0400 Received: from mail-yx0-f174.google.com ([209.85.213.174]:34861 "EHLO mail-yx0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755086Ab2FPRSl (ORCPT ); Sat, 16 Jun 2012 13:18:41 -0400 MIME-Version: 1.0 Date: Sun, 17 Jun 2012 01:18:38 +0800 Message-ID: Subject: [PATCH][ANNOUNCE]RIFS-ES Scheduling V1 release. From: Chen To: linux-kernel@vger.kernel.org Cc: mou Chen Content-Type: multipart/mixed; boundary=20cf30244ca3ad66a004c29a1fb9 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 393128 Lines: 5128 --20cf30244ca3ad66a004c29a1fb9 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable This is the Googlecode link of RIFS series. http://code.google.com/p/rifs-scheduler/ Here is the download link for RIFS.ES-v1-kernel3.4.x: http://rifs-scheduler.googlecode.com/files/RIFS.ES-v1-kernel3.4.x The design of RIFS/ES: First let me list out the 3 equations of SystemV scheduling. =A0 0.cpu =3D cpu +1; 1.cpu =3D cpu/2; 2.priority =3D (cpu/2) + base level priority; These 3 equations are used to determine the scheduling priority if a task. Here there is no any complex detection of interactive task(O(1) failed on desktop because of the complex detection). O(1) did a hard-coding and kerp focusing on how to detect a whether the task is an interactive task or not. CFS is good with its beautiful design. But in my opinion i think the sleeper feature will destroy the beautiful design. RIFS-ES adopt the design of System V scheduler. It can be interactive. On my box everything is very smopth Chen --20cf30244ca3ad66a004c29a1fb9 Content-Type: application/octet-stream; name="RIFS.ES-v1-kernel3.4.x" Content-Disposition: attachment; filename="RIFS.ES-v1-kernel3.4.x" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h3iw90850 ZGlmZiAtcnVOIGxpbnV4LTMuNC4xL2ZzL3Byb2MvYmFzZS5jIGxpbnV4LTMuNC4xLVJJRlMvZnMv cHJvYy9iYXNlLmMKLS0tIGxpbnV4LTMuNC4xL2ZzL3Byb2MvYmFzZS5jCTIwMTItMDYtMDEgMTU6 MTg6NDQuMDAwMDAwMDAwICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2ZzL3Byb2MvYmFzZS5j CTIwMTItMDYtMDYgMTU6MDI6MTguMDAwMDAwMDAwICswODAwCkBAIC0zNDIsNyArMzQyLDcgQEAK IHN0YXRpYyBpbnQgcHJvY19waWRfc2NoZWRzdGF0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywg Y2hhciAqYnVmZmVyKQogewogCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVsbHUgJWxsdSAlbHVc biIsCi0JCQkodW5zaWduZWQgbG9uZyBsb25nKXRhc2stPnNlLnN1bV9leGVjX3J1bnRpbWUsCisJ CQkodW5zaWduZWQgbG9uZyBsb25nKXRza19zZXJ1bnRpbWUodGFzayksCiAJCQkodW5zaWduZWQg bG9uZyBsb25nKXRhc2stPnNjaGVkX2luZm8ucnVuX2RlbGF5LAogCQkJdGFzay0+c2NoZWRfaW5m by5wY291bnQpOwogfQpkaWZmIC1ydU4gbGludXgtMy40LjEvaW5jbHVkZS9saW51eC9pbml0X3Rh c2suaCBsaW51eC0zLjQuMS1SSUZTL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKLS0tIGxpbnV4 LTMuNC4xL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgJMjAxMi0wNi0wMSAxNToxODo0NC4wMDAw MDAwMDAgKzA4MDAKKysrIGxpbnV4LTMuNC4xLVJJRlMvaW5jbHVkZS9saW51eC9pbml0X3Rhc2su aAkyMDEyLTA2LTA2IDE0OjUwOjI5LjAwMDAwMDAwMCArMDgwMApAQCAtMTMyLDEyICsxMzIsNjgg QEAKICMgZGVmaW5lIElOSVRfUEVSRl9FVkVOVFModHNrKQogI2VuZGlmCiAKLSNkZWZpbmUgSU5J VF9UQVNLX0NPTU0gInN3YXBwZXIiCi0KIC8qCiAgKiAgSU5JVF9UQVNLIGlzIHVzZWQgdG8gc2V0 IHVwIHRoZSBmaXJzdCB0YXNrIHRhYmxlLCB0b3VjaCBhdAogICogeW91ciBvd24gcmlzayEuIEJh c2U9MCwgbGltaXQ9MHgxZmZmZmYgKD0yTUIpCiAgKi8KKyNpZmRlZiBDT05GSUdfU0NIRURfUklG UworI2RlZmluZSBJTklUX1RBU0tfQ09NTSAiUklGUyIKKyNkZWZpbmUgSU5JVF9UQVNLKHRzaykJ XAorewkJCQkJCQkJCVwKKwkuc3RhdGUJCT0gMCwJCQkJCQlcCisJLnN0YWNrCQk9ICZpbml0X3Ro cmVhZF9pbmZvLAkJCQlcCisJLnVzYWdlCQk9IEFUT01JQ19JTklUKDIpLAkJCQlcCisJLmZsYWdz CQk9IFBGX0tUSFJFQUQsCQkJCQlcCisJLnByaW8JCT0gTk9STUFMX1BSSU8sCQkJCQlcCisJLnN0 YXRpY19wcmlvCT0gTUFYX1BSSU8tMjAsCQkJCQlcCisJLm5vcm1hbF9wcmlvCT0gTk9STUFMX1BS SU8sCQkJCQlcCisJLnBvbGljeQkJPSBTQ0hFRF9OT1JNQUwsCQkJCQlcCisJLmNwdXNfYWxsb3dl ZAk9IENQVV9NQVNLX0FMTCwJCQkJCVwKKwkubW0JCT0gTlVMTCwJCQkJCQlcCisJLmFjdGl2ZV9t bQk9ICZpbml0X21tLAkJCQkJXAorCS5ydW5fbGlzdAk9IExJU1RfSEVBRF9JTklUKHRzay5ydW5f bGlzdCksCQkJXAorCS50aW1lX3NsaWNlCT0gSFosCQkJCQlcCisJLnRhc2tzCQk9IExJU1RfSEVB RF9JTklUKHRzay50YXNrcyksCQkJXAorCUlOSVRfUFVTSEFCTEVfVEFTS1ModHNrKQkJCQkJXAor CS5wdHJhY2VkCT0gTElTVF9IRUFEX0lOSVQodHNrLnB0cmFjZWQpLAkJCVwKKwkucHRyYWNlX2Vu dHJ5CT0gTElTVF9IRUFEX0lOSVQodHNrLnB0cmFjZV9lbnRyeSksCQlcCisJLnJlYWxfcGFyZW50 CT0gJnRzaywJCQkJCQlcCisJLnBhcmVudAkJPSAmdHNrLAkJCQkJCVwKKwkuY2hpbGRyZW4JPSBM SVNUX0hFQURfSU5JVCh0c2suY2hpbGRyZW4pLAkJCVwKKwkuc2libGluZwk9IExJU1RfSEVBRF9J TklUKHRzay5zaWJsaW5nKSwJCQlcCisJLmdyb3VwX2xlYWRlcgk9ICZ0c2ssCQkJCQkJXAorCVJD VV9JTklUX1BPSU5URVIoLnJlYWxfY3JlZCwgJmluaXRfY3JlZCksCQkJXAorCVJDVV9JTklUX1BP SU5URVIoLmNyZWQsICZpbml0X2NyZWQpLAkJCQlcCisJLmNvbW0JCT0gSU5JVF9UQVNLX0NPTU0s CQkJCVwKKwkudGhyZWFkCQk9IElOSVRfVEhSRUFELAkJCQkJXAorCS5mcwkJPSAmaW5pdF9mcywJ CQkJCVwKKwkuZmlsZXMJCT0gJmluaXRfZmlsZXMsCQkJCQlcCisJLnNpZ25hbAkJPSAmaW5pdF9z aWduYWxzLAkJCQlcCisJLnNpZ2hhbmQJPSAmaW5pdF9zaWdoYW5kLAkJCQlcCisJLm5zcHJveHkJ PSAmaW5pdF9uc3Byb3h5LAkJCQlcCisJLnBlbmRpbmcJPSB7CQkJCQkJXAorCQkubGlzdCA9IExJ U1RfSEVBRF9JTklUKHRzay5wZW5kaW5nLmxpc3QpLAkJXAorCQkuc2lnbmFsID0ge3swfX19LAkJ CQkJXAorCS5ibG9ja2VkCT0ge3swfX0sCQkJCQlcCisJLmFsbG9jX2xvY2sJPSBfX1NQSU5fTE9D S19VTkxPQ0tFRCh0c2suYWxsb2NfbG9jayksCQlcCisJLmpvdXJuYWxfaW5mbwk9IE5VTEwsCQkJ CQkJXAorCS5jcHVfdGltZXJzCT0gSU5JVF9DUFVfVElNRVJTKHRzay5jcHVfdGltZXJzKSwJCVwK KwkucGlfbG9jawk9IF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRCh0c2sucGlfbG9jayksCQlcCisJ LnRpbWVyX3NsYWNrX25zID0gNTAwMDAsIC8qIDUwIHVzZWMgZGVmYXVsdCBzbGFjayAqLwkJXAor CS5waWRzID0gewkJCQkJCQlcCisJCVtQSURUWVBFX1BJRF0gID0gSU5JVF9QSURfTElOSyhQSURU WVBFX1BJRCksCQlcCisJCVtQSURUWVBFX1BHSURdID0gSU5JVF9QSURfTElOSyhQSURUWVBFX1BH SUQpLAkJXAorCQlbUElEVFlQRV9TSURdICA9IElOSVRfUElEX0xJTksoUElEVFlQRV9TSUQpLAkJ XAorCX0sCQkJCQkJCQlcCisJSU5JVF9JRFMJCQkJCQkJXAorCUlOSVRfUEVSRl9FVkVOVFModHNr KQkJCQkJCVwKKwlJTklUX1RSQUNFX0lSUUZMQUdTCQkJCQkJXAorCUlOSVRfTE9DS0RFUAkJCQkJ CQlcCisJSU5JVF9GVFJBQ0VfR1JBUEgJCQkJCQlcCisJSU5JVF9UUkFDRV9SRUNVUlNJT04JCQkJ CQlcCisJSU5JVF9UQVNLX1JDVV9QUkVFTVBUKHRzaykJCQkJCVwKK30KKyNlbHNlIC8qIENPTkZJ R19TQ0hFRF9SSUZTICovCiAjZGVmaW5lIElOSVRfVEFTSyh0c2spCVwKIHsJCQkJCQkJCQlcCiAJ LnN0YXRlCQk9IDAsCQkJCQkJXApAQCAtMjAxLDcgKzI1Nyw3IEBACiAJSU5JVF9UQVNLX1JDVV9Q UkVFTVBUKHRzaykJCQkJCVwKIAlJTklUX0NQVVNFVF9TRVEJCQkJCQkJXAogfQotCisjZW5kaWYK IAogI2RlZmluZSBJTklUX0NQVV9USU1FUlMoY3B1X3RpbWVycykJCQkJCVwKIHsJCQkJCQkJCQlc CmRpZmYgLXJ1TiBsaW51eC0zLjQuMS9pbmNsdWRlL2xpbnV4L2luaXRfdGFzayAo5aSN5Lu2KS5o IGxpbnV4LTMuNC4xLVJJRlMvaW5jbHVkZS9saW51eC9pbml0X3Rhc2sgKOWkjeS7tikuaAotLS0g bGludXgtMy40LjEvaW5jbHVkZS9saW51eC9pbml0X3Rhc2sgKOWkjeS7tikuaAkxOTcwLTAxLTAx IDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9pbmNsdWRlL2xp bnV4L2luaXRfdGFzayAo5aSN5Lu2KS5oCTIwMTItMDYtMDEgMTU6MTg6NDQuMDAwMDAwMDAwICsw ODAwCkBAIC0wLDAgKzEsMjE3IEBACisjaWZuZGVmIF9MSU5VWF9fSU5JVF9UQVNLX0gKKyNkZWZp bmUgX0xJTlVYX19JTklUX1RBU0tfSAorCisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNp bmNsdWRlIDxsaW51eC9pcnFmbGFncy5oPgorI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KKyNp bmNsdWRlIDxsaW51eC9sb2NrZGVwLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5j bHVkZSA8bGludXgvaXBjLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L3VzZXJfbmFtZXNwYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJlYml0 cy5oPgorI2luY2x1ZGUgPG5ldC9uZXRfbmFtZXNwYWNlLmg+CisKKyNpZmRlZiBDT05GSUdfU01Q CisjIGRlZmluZSBJTklUX1BVU0hBQkxFX1RBU0tTKHRzaykJCQkJCVwKKwkucHVzaGFibGVfdGFz a3MgPSBQTElTVF9OT0RFX0lOSVQodHNrLnB1c2hhYmxlX3Rhc2tzLCBNQVhfUFJJTyksCisjZWxz ZQorIyBkZWZpbmUgSU5JVF9QVVNIQUJMRV9UQVNLUyh0c2spCisjZW5kaWYKKworZXh0ZXJuIHN0 cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlczsKK2V4dGVybiBzdHJ1Y3QgZnNfc3RydWN0IGlu aXRfZnM7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQUworI2RlZmluZSBJTklUX0dST1VQX1JXU0VN KHNpZykJCQkJCQlcCisJLmdyb3VwX3J3c2VtID0gX19SV1NFTV9JTklUSUFMSVpFUihzaWcuZ3Jv dXBfcndzZW0pLAorI2Vsc2UKKyNkZWZpbmUgSU5JVF9HUk9VUF9SV1NFTShzaWcpCisjZW5kaWYK KworI2lmZGVmIENPTkZJR19DUFVTRVRTCisjZGVmaW5lIElOSVRfQ1BVU0VUX1NFUQkJCQkJCQlc CisJLm1lbXNfYWxsb3dlZF9zZXEgPSBTRVFDTlRfWkVSTywKKyNlbHNlCisjZGVmaW5lIElOSVRf Q1BVU0VUX1NFUQorI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9TSUdOQUxTKHNpZykgewkJCQkJCVwK KwkubnJfdGhyZWFkcwk9IDEsCQkJCQkJXAorCS53YWl0X2NobGRleGl0CT0gX19XQUlUX1FVRVVF X0hFQURfSU5JVElBTElaRVIoc2lnLndhaXRfY2hsZGV4aXQpLFwKKwkuc2hhcmVkX3BlbmRpbmcJ PSB7IAkJCQkJCVwKKwkJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChzaWcuc2hhcmVkX3BlbmRpbmcu bGlzdCksCVwKKwkJLnNpZ25hbCA9ICB7ezB9fX0sCQkJCQlcCisJLnBvc2l4X3RpbWVycwkgPSBM SVNUX0hFQURfSU5JVChzaWcucG9zaXhfdGltZXJzKSwJCVwKKwkuY3B1X3RpbWVycwk9IElOSVRf Q1BVX1RJTUVSUyhzaWcuY3B1X3RpbWVycyksCQlcCisJLnJsaW0JCT0gSU5JVF9STElNSVRTLAkJ CQkJXAorCS5jcHV0aW1lcgk9IHsgCQkJCQkJXAorCQkuY3B1dGltZSA9IElOSVRfQ1BVVElNRSwJ CQkJXAorCQkucnVubmluZyA9IDAsCQkJCQkJXAorCQkubG9jayA9IF9fUkFXX1NQSU5fTE9DS19V TkxPQ0tFRChzaWcuY3B1dGltZXIubG9jayksCVwKKwl9LAkJCQkJCQkJXAorCS5jcmVkX2d1YXJk X211dGV4ID0JCQkJCQlcCisJCSBfX01VVEVYX0lOSVRJQUxJWkVSKHNpZy5jcmVkX2d1YXJkX211 dGV4KSwJCVwKKwlJTklUX0dST1VQX1JXU0VNKHNpZykJCQkJCQlcCit9CisKK2V4dGVybiBzdHJ1 Y3QgbnNwcm94eSBpbml0X25zcHJveHk7CisKKyNkZWZpbmUgSU5JVF9TSUdIQU5EKHNpZ2hhbmQp IHsJCQkJCQlcCisJLmNvdW50CQk9IEFUT01JQ19JTklUKDEpLCAJCQkJXAorCS5hY3Rpb24JCT0g eyB7IHsgLnNhX2hhbmRsZXIgPSBTSUdfREZMLCB9IH0sIH0sCQlcCisJLnNpZ2xvY2sJPSBfX1NQ SU5fTE9DS19VTkxPQ0tFRChzaWdoYW5kLnNpZ2xvY2spLAlcCisJLnNpZ25hbGZkX3dxaAk9IF9f V0FJVF9RVUVVRV9IRUFEX0lOSVRJQUxJWkVSKHNpZ2hhbmQuc2lnbmFsZmRfd3FoKSwJXAorfQor CitleHRlcm4gc3RydWN0IGdyb3VwX2luZm8gaW5pdF9ncm91cHM7CisKKyNkZWZpbmUgSU5JVF9T VFJVQ1RfUElEIHsJCQkJCQlcCisJLmNvdW50IAkJPSBBVE9NSUNfSU5JVCgxKSwJCQkJXAorCS50 YXNrcwkJPSB7CQkJCQkJXAorCQl7IC5maXJzdCA9IE5VTEwgfSwJCQkJCVwKKwkJeyAuZmlyc3Qg PSBOVUxMIH0sCQkJCQlcCisJCXsgLmZpcnN0ID0gTlVMTCB9LAkJCQkJXAorCX0sCQkJCQkJCQlc CisJLmxldmVsCQk9IDAsCQkJCQkJXAorCS5udW1iZXJzCT0geyB7CQkJCQkJXAorCQkubnIJCT0g MCwJCQkJCVwKKwkJLm5zCQk9ICZpbml0X3BpZF9ucywJCQkJXAorCQkucGlkX2NoYWluCT0geyAu bmV4dCA9IE5VTEwsIC5wcHJldiA9IE5VTEwgfSwJXAorCX0sIH0JCQkJCQkJCVwKK30KKworI2Rl ZmluZSBJTklUX1BJRF9MSU5LKHR5cGUpIAkJCQkJXAorewkJCQkJCQkJXAorCS5ub2RlID0gewkJ CQkJCVwKKwkJLm5leHQgPSBOVUxMLAkJCQkJXAorCQkucHByZXYgPSBOVUxMLAkJCQkJXAorCX0s CQkJCQkJCVwKKwkucGlkID0gJmluaXRfc3RydWN0X3BpZCwJCQkJXAorfQorCisjaWZkZWYgQ09O RklHX0FVRElUU1lTQ0FMTAorI2RlZmluZSBJTklUX0lEUyBcCisJLmxvZ2ludWlkID0gLTEsIFwK Kwkuc2Vzc2lvbmlkID0gLTEsCisjZWxzZQorI2RlZmluZSBJTklUX0lEUworI2VuZGlmCisKKyNp ZmRlZiBDT05GSUdfUkNVX0JPT1NUCisjZGVmaW5lIElOSVRfVEFTS19SQ1VfQk9PU1QoKQkJCQkJ CVwKKwkucmN1X2Jvb3N0X211dGV4ID0gTlVMTCwKKyNlbHNlCisjZGVmaW5lIElOSVRfVEFTS19S Q1VfQk9PU1QoKQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1UKKyNkZWZp bmUgSU5JVF9UQVNLX1JDVV9UUkVFX1BSRUVNUFQoKQkJCQkJXAorCS5yY3VfYmxvY2tlZF9ub2Rl ID0gTlVMTCwKKyNlbHNlCisjZGVmaW5lIElOSVRfVEFTS19SQ1VfVFJFRV9QUkVFTVBUKHRzaykK KyNlbmRpZgorI2lmZGVmIENPTkZJR19QUkVFTVBUX1JDVQorI2RlZmluZSBJTklUX1RBU0tfUkNV X1BSRUVNUFQodHNrKQkJCQkJXAorCS5yY3VfcmVhZF9sb2NrX25lc3RpbmcgPSAwLAkJCQkJXAor CS5yY3VfcmVhZF91bmxvY2tfc3BlY2lhbCA9IDAsCQkJCQlcCisJLnJjdV9ub2RlX2VudHJ5ID0g TElTVF9IRUFEX0lOSVQodHNrLnJjdV9ub2RlX2VudHJ5KSwJCVwKKwlJTklUX1RBU0tfUkNVX1RS RUVfUFJFRU1QVCgpCQkJCQlcCisJSU5JVF9UQVNLX1JDVV9CT09TVCgpCisjZWxzZQorI2RlZmlu ZSBJTklUX1RBU0tfUkNVX1BSRUVNUFQodHNrKQorI2VuZGlmCisKK2V4dGVybiBzdHJ1Y3QgY3Jl ZCBpbml0X2NyZWQ7CisKKyNpZmRlZiBDT05GSUdfUEVSRl9FVkVOVFMKKyMgZGVmaW5lIElOSVRf UEVSRl9FVkVOVFModHNrKQkJCQkJXAorCS5wZXJmX2V2ZW50X211dGV4ID0gCQkJCQkJXAorCQkg X19NVVRFWF9JTklUSUFMSVpFUih0c2sucGVyZl9ldmVudF9tdXRleCksCQlcCisJLnBlcmZfZXZl bnRfbGlzdCA9IExJU1RfSEVBRF9JTklUKHRzay5wZXJmX2V2ZW50X2xpc3QpLAorI2Vsc2UKKyMg ZGVmaW5lIElOSVRfUEVSRl9FVkVOVFModHNrKQorI2VuZGlmCisKKyNkZWZpbmUgSU5JVF9UQVNL X0NPTU0gInN3YXBwZXIiCisKKy8qCisgKiAgSU5JVF9UQVNLIGlzIHVzZWQgdG8gc2V0IHVwIHRo ZSBmaXJzdCB0YXNrIHRhYmxlLCB0b3VjaCBhdAorICogeW91ciBvd24gcmlzayEuIEJhc2U9MCwg bGltaXQ9MHgxZmZmZmYgKD0yTUIpCisgKi8KKyNkZWZpbmUgSU5JVF9UQVNLKHRzaykJXAorewkJ CQkJCQkJCVwKKwkuc3RhdGUJCT0gMCwJCQkJCQlcCisJLnN0YWNrCQk9ICZpbml0X3RocmVhZF9p bmZvLAkJCQlcCisJLnVzYWdlCQk9IEFUT01JQ19JTklUKDIpLAkJCQlcCisJLmZsYWdzCQk9IFBG X0tUSFJFQUQsCQkJCQlcCisJLnByaW8JCT0gTUFYX1BSSU8tMjAsCQkJCQlcCisJLnN0YXRpY19w cmlvCT0gTUFYX1BSSU8tMjAsCQkJCQlcCisJLm5vcm1hbF9wcmlvCT0gTUFYX1BSSU8tMjAsCQkJ CQlcCisJLnBvbGljeQkJPSBTQ0hFRF9OT1JNQUwsCQkJCQlcCisJLmNwdXNfYWxsb3dlZAk9IENQ VV9NQVNLX0FMTCwJCQkJCVwKKwkubW0JCT0gTlVMTCwJCQkJCQlcCisJLmFjdGl2ZV9tbQk9ICZp bml0X21tLAkJCQkJXAorCS5zZQkJPSB7CQkJCQkJXAorCQkuZ3JvdXBfbm9kZSAJPSBMSVNUX0hF QURfSU5JVCh0c2suc2UuZ3JvdXBfbm9kZSksCVwKKwl9LAkJCQkJCQkJXAorCS5ydAkJPSB7CQkJ CQkJXAorCQkucnVuX2xpc3QJPSBMSVNUX0hFQURfSU5JVCh0c2sucnQucnVuX2xpc3QpLAlcCisJ CS50aW1lX3NsaWNlCT0gUlJfVElNRVNMSUNFLAkJCQlcCisJCS5ucl9jcHVzX2FsbG93ZWQgPSBO Ul9DUFVTLAkJCQlcCisJfSwJCQkJCQkJCVwKKwkudGFza3MJCT0gTElTVF9IRUFEX0lOSVQodHNr LnRhc2tzKSwJCQlcCisJSU5JVF9QVVNIQUJMRV9UQVNLUyh0c2spCQkJCQlcCisJLnB0cmFjZWQJ PSBMSVNUX0hFQURfSU5JVCh0c2sucHRyYWNlZCksCQkJXAorCS5wdHJhY2VfZW50cnkJPSBMSVNU X0hFQURfSU5JVCh0c2sucHRyYWNlX2VudHJ5KSwJCVwKKwkucmVhbF9wYXJlbnQJPSAmdHNrLAkJ CQkJCVwKKwkucGFyZW50CQk9ICZ0c2ssCQkJCQkJXAorCS5jaGlsZHJlbgk9IExJU1RfSEVBRF9J TklUKHRzay5jaGlsZHJlbiksCQkJXAorCS5zaWJsaW5nCT0gTElTVF9IRUFEX0lOSVQodHNrLnNp YmxpbmcpLAkJCVwKKwkuZ3JvdXBfbGVhZGVyCT0gJnRzaywJCQkJCQlcCisJUkNVX0lOSVRfUE9J TlRFUigucmVhbF9jcmVkLCAmaW5pdF9jcmVkKSwJCQlcCisJUkNVX0lOSVRfUE9JTlRFUiguY3Jl ZCwgJmluaXRfY3JlZCksCQkJCVwKKwkuY29tbQkJPSBJTklUX1RBU0tfQ09NTSwJCQkJXAorCS50 aHJlYWQJCT0gSU5JVF9USFJFQUQsCQkJCQlcCisJLmZzCQk9ICZpbml0X2ZzLAkJCQkJXAorCS5m aWxlcwkJPSAmaW5pdF9maWxlcywJCQkJCVwKKwkuc2lnbmFsCQk9ICZpbml0X3NpZ25hbHMsCQkJ CVwKKwkuc2lnaGFuZAk9ICZpbml0X3NpZ2hhbmQsCQkJCVwKKwkubnNwcm94eQk9ICZpbml0X25z cHJveHksCQkJCVwKKwkucGVuZGluZwk9IHsJCQkJCQlcCisJCS5saXN0ID0gTElTVF9IRUFEX0lO SVQodHNrLnBlbmRpbmcubGlzdCksCQlcCisJCS5zaWduYWwgPSB7ezB9fX0sCQkJCQlcCisJLmJs b2NrZWQJPSB7ezB9fSwJCQkJCVwKKwkuYWxsb2NfbG9jawk9IF9fU1BJTl9MT0NLX1VOTE9DS0VE KHRzay5hbGxvY19sb2NrKSwJCVwKKwkuam91cm5hbF9pbmZvCT0gTlVMTCwJCQkJCQlcCisJLmNw dV90aW1lcnMJPSBJTklUX0NQVV9USU1FUlModHNrLmNwdV90aW1lcnMpLAkJXAorCS5waV9sb2Nr CT0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEKHRzay5waV9sb2NrKSwJXAorCS50aW1lcl9zbGFj a19ucyA9IDUwMDAwLCAvKiA1MCB1c2VjIGRlZmF1bHQgc2xhY2sgKi8JCVwKKwkucGlkcyA9IHsJ CQkJCQkJXAorCQlbUElEVFlQRV9QSURdICA9IElOSVRfUElEX0xJTksoUElEVFlQRV9QSUQpLAkJ XAorCQlbUElEVFlQRV9QR0lEXSA9IElOSVRfUElEX0xJTksoUElEVFlQRV9QR0lEKSwJCVwKKwkJ W1BJRFRZUEVfU0lEXSAgPSBJTklUX1BJRF9MSU5LKFBJRFRZUEVfU0lEKSwJCVwKKwl9LAkJCQkJ CQkJXAorCS50aHJlYWRfZ3JvdXAJPSBMSVNUX0hFQURfSU5JVCh0c2sudGhyZWFkX2dyb3VwKSwJ CVwKKwlJTklUX0lEUwkJCQkJCQlcCisJSU5JVF9QRVJGX0VWRU5UUyh0c2spCQkJCQkJXAorCUlO SVRfVFJBQ0VfSVJRRkxBR1MJCQkJCQlcCisJSU5JVF9MT0NLREVQCQkJCQkJCVwKKwlJTklUX0ZU UkFDRV9HUkFQSAkJCQkJCVwKKwlJTklUX1RSQUNFX1JFQ1VSU0lPTgkJCQkJCVwKKwlJTklUX1RB U0tfUkNVX1BSRUVNUFQodHNrKQkJCQkJXAorCUlOSVRfQ1BVU0VUX1NFUQkJCQkJCQlcCit9CisK KworI2RlZmluZSBJTklUX0NQVV9USU1FUlMoY3B1X3RpbWVycykJCQkJCVwKK3sJCQkJCQkJCQlc CisJTElTVF9IRUFEX0lOSVQoY3B1X3RpbWVyc1swXSksCQkJCQlcCisJTElTVF9IRUFEX0lOSVQo Y3B1X3RpbWVyc1sxXSksCQkJCQlcCisJTElTVF9IRUFEX0lOSVQoY3B1X3RpbWVyc1syXSksCQkJ CQlcCit9CisKKy8qIEF0dGFjaCB0byB0aGUgaW5pdF90YXNrIGRhdGEgc3RydWN0dXJlIGZvciBw cm9wZXIgYWxpZ25tZW50ICovCisjZGVmaW5lIF9faW5pdF90YXNrX2RhdGEgX19hdHRyaWJ1dGVf XygoX19zZWN0aW9uX18oIi5kYXRhLi5pbml0X3Rhc2siKSkpCisKKworI2VuZGlmCmRpZmYgLXJ1 TiBsaW51eC0zLjQuMS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggbGludXgtMy40LjEtUklGUy9pbmNs dWRlL2xpbnV4L3NjaGVkLmgKLS0tIGxpbnV4LTMuNC4xL2luY2x1ZGUvbGludXgvc2NoZWQuaAky MDEyLTA2LTAxIDE1OjE4OjQ0LjAwMDAwMDAwMCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9p bmNsdWRlL2xpbnV4L3NjaGVkLmgJMjAxMi0wNi0wNiAxNDo1NzowNi4wMDAwMDAwMDAgKzA4MDAK QEAgLTM3LDkgKzM3LDEzIEBACiAjZGVmaW5lIFNDSEVEX0ZJRk8JCTEKICNkZWZpbmUgU0NIRURf UlIJCTIKICNkZWZpbmUgU0NIRURfQkFUQ0gJCTMKLS8qIFNDSEVEX0lTTzogcmVzZXJ2ZWQgYnV0 IG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KICNkZWZpbmUgU0NIRURfSURMRQkJNQotLyogQ2FuIGJl IE9SZWQgaW4gdG8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIHJldmVydGVkIGJhY2sgdG8gU0NI RURfTk9STUFMIG9uIGZvcmsgKi8KKyNkZWZpbmUgU0NIRURfSURMRVBSSU8JCVNDSEVEX0lETEUK KyNpZmRlZiBDT05GSUdfU0NIRURfUklGUworI2RlZmluZSBTQ0hFRF9NQVgJCShTQ0hFRF9JRExF UFJJTykKKyNkZWZpbmUgU0NIRURfUkFOR0UocG9saWN5KQkoKHBvbGljeSkgPD0gU0NIRURfTUFY KQorI2VuZGlmCisKICNkZWZpbmUgU0NIRURfUkVTRVRfT05fRk9SSyAgICAgMHg0MDAwMDAwMAog CiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMjY4LDggKzI3Miw2IEBACiBleHRlcm4gdm9pZCBpbml0 X2lkbGUoc3RydWN0IHRhc2tfc3RydWN0ICppZGxlLCBpbnQgY3B1KTsKIGV4dGVybiB2b2lkIGlu aXRfaWRsZV9ib290dXBfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpOwogCi1leHRlcm4g aW50IHJ1bnF1ZXVlX2lzX2xvY2tlZChpbnQgY3B1KTsKLQogI2lmIGRlZmluZWQoQ09ORklHX1NN UCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFopCiBleHRlcm4gdm9pZCBzZWxlY3Rfbm9oel9sb2Fk X2JhbGFuY2VyKGludCBzdG9wX3RpY2spOwogZXh0ZXJuIHZvaWQgc2V0X2NwdV9zZF9zdGF0ZV9p ZGxlKHZvaWQpOwpAQCAtMTI3MCwxNSArMTI3MiwzMyBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAog CXN0cnVjdCBsbGlzdF9ub2RlIHdha2VfZW50cnk7Ci0JaW50IG9uX2NwdTsKICNlbmRpZgorI2lm bmRlZiBDT05GSUdfU0NIRURfUklGUworCWludCBvbl9jcHU7CiAJaW50IG9uX3JxOwotCisjZWxz ZQorCWJvb2wgb25fY3B1OworCWJvb2wgb25fcnE7CisjZW5kaWYKIAlpbnQgcHJpbywgc3RhdGlj X3ByaW8sIG5vcm1hbF9wcmlvOwogCXVuc2lnbmVkIGludCBydF9wcmlvcml0eTsKKyNpZmRlZiBD T05GSUdfU0NIRURfUklGUworCWludCB0aW1lX3NsaWNlOworCXU2NCBjcnRfdGltZTsKKwl1NjQg cnVuX3RpbWU7CisJdTY0IHJ1bl9zY2FsZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bl9saXN0Owor CXU2NCBsYXN0X3JhbjsKKwl1NjQgc2NoZWRfdGltZTsgLyogc2NoZWRfY2xvY2sgdGltZSBzcGVu dCBydW5uaW5nICovCisjaWZkZWYgQ09ORklHX1NNUAorCWJvb2wgc3RpY2t5OyAvKiBTb2Z0IGFm ZmluZWQgZmxhZyAqLworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBydF90aW1lb3V0OworI2Vsc2Ug LyogQ09ORklHX1NDSEVEX1JJRlMgKi8KIAljb25zdCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnNjaGVk X2NsYXNzOwogCXN0cnVjdCBzY2hlZF9lbnRpdHkgc2U7CiAJc3RydWN0IHNjaGVkX3J0X2VudGl0 eSBydDsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTCiAJLyogbGlz dCBvZiBzdHJ1Y3QgcHJlZW1wdF9ub3RpZmllcjogKi8KQEAgLTEzOTEsNiArMTQxMSw5IEBACiAK IAljcHV0aW1lX3QgdXRpbWUsIHN0aW1lLCB1dGltZXNjYWxlZCwgc3RpbWVzY2FsZWQ7CiAJY3B1 dGltZV90IGd0aW1lOworI2lmZGVmIENPTkZJR19TQ0hFRF9SSUZTCisJdW5zaWduZWQgbG9uZyB1 dGltZV9wYywgc3RpbWVfcGM7CisjZW5kaWYKICNpZm5kZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09V TlRJTkcKIAljcHV0aW1lX3QgcHJldl91dGltZSwgcHJldl9zdGltZTsKICNlbmRpZgpAQCAtMTYx OSw2ICsxNjQyLDU1IEBACiAjZW5kaWYKIH07CiAKKyNpZmRlZiBDT05GSUdfU0NIRURfUklGUwor Ym9vbCBncnVucXVldWVfaXNfbG9ja2VkKHZvaWQpOwordm9pZCBncnFfdW5sb2NrX3dhaXQodm9p ZCk7Cit2b2lkIGNwdV9zY2FsaW5nKGludCBjcHUpOwordm9pZCBjcHVfbm9uc2NhbGluZyhpbnQg Y3B1KTsKK2Jvb2wgYWJvdmVfYmFja2dyb3VuZF9sb2FkKHZvaWQpOworI2RlZmluZSB0c2tfc2Vy dW50aW1lKHQpCQkoKHQpLT5zY2hlZF90aW1lKQorI2RlZmluZSB0c2tfcnR0aW1lb3V0KHQpCQko KHQpLT5ydF90aW1lb3V0KQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHNrX2NwdXNfY3VycmVudChz dHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHJ1bnF1ZXVl X2lzX2xvY2tlZChpbnQgY3B1KQoreworCXJldHVybiBncnVucXVldWVfaXNfbG9ja2VkKCk7Cit9 CisKK3ZvaWQgcHJpbnRfc2NoZWR1bGVyX3ZlcnNpb24odm9pZCk7CisKKyNlbHNlIC8qIENGUyAq LworZXh0ZXJuIGludCBydW5xdWV1ZV9pc19sb2NrZWQoaW50IGNwdSk7CitzdGF0aWMgaW5saW5l IHZvaWQgY3B1X3NjYWxpbmcoaW50IGNwdSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNw dV9ub25zY2FsaW5nKGludCBjcHUpCit7Cit9CisjZGVmaW5lIHRza19zZXJ1bnRpbWUodCkJKCh0 KS0+c2Uuc3VtX2V4ZWNfcnVudGltZSkKKyNkZWZpbmUgdHNrX3J0dGltZW91dCh0KQkoKHQpLT5y dC50aW1lb3V0KQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHNrX2NwdXNfY3VycmVudChzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnApCit7CisJcC0+cnQubnJfY3B1c19hbGxvd2VkID0gY3VycmVudC0+cnQu bnJfY3B1c19hbGxvd2VkOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcHJpbnRfc2NoZWR1bGVy X3ZlcnNpb24odm9pZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPIkNGUyBDUFUgc2NoZWR1bGVyLlxu Iik7Cit9CisKKy8qIEFueW9uZSBmZWVsIGxpa2UgaW1wbGVtZW50aW5nIHRoaXM/ICovCitzdGF0 aWMgaW5saW5lIGJvb2wgYWJvdmVfYmFja2dyb3VuZF9sb2FkKHZvaWQpCit7CisJcmV0dXJuIGZh bHNlOworfQorI2VuZGlmIC8qIENPTkZJR19TQ0hFRF9SSUZTICovCisKIC8qIEZ1dHVyZS1zYWZl IGFjY2Vzc29yIGZvciBzdHJ1Y3QgdGFza19zdHJ1Y3QncyBjcHVzX2FsbG93ZWQuICovCiAjZGVm aW5lIHRza19jcHVzX2FsbG93ZWQodHNrKSAoJih0c2spLT5jcHVzX2FsbG93ZWQpCiAKQEAgLTE2 MzYsMTAgKzE3MDgsMjAgQEAKICAqLwogCiAjZGVmaW5lIE1BWF9VU0VSX1JUX1BSSU8JMTAwCi0j ZGVmaW5lIE1BWF9SVF9QUklPCQlNQVhfVVNFUl9SVF9QUklPCisjZGVmaW5lIE1BWF9SVF9QUklP CQkoTUFYX1VTRVJfUlRfUFJJTykKKyNkZWZpbmUgREVGQVVMVF9QUklPCQkoTUFYX1JUX1BSSU8g KyAyMCkKIAorI2lmZGVmIENPTkZJR19TQ0hFRF9SSUZTCisjZGVmaW5lIFBSSU9fUkFOR0UJCSg0 MCkKKyNkZWZpbmUgTUFYX1BSSU8JCShNQVhfUlRfUFJJTyArIFBSSU9fUkFOR0UpCisvLyNkZWZp bmUgSVNPX1BSSU8JCShNQVhfUlRfUFJJTykg5bey57uP6KKr5oiR5bmy5o6J77yM5ZOI5ZOICisj ZGVmaW5lIE5PUk1BTF9QUklPCQkoTUFYX1JUX1BSSU8gKyAxKQorI2RlZmluZSBJRExFX1BSSU8J CShNQVhfUFJJTyArIDEpCisjZGVmaW5lIFBSSU9fTElNSVQJCSgoSURMRV9QUklPKSArIDEpCisj ZWxzZSAvKiBDT05GSUdfU0NIRURfUklGUyAqLwogI2RlZmluZSBNQVhfUFJJTwkJKE1BWF9SVF9Q UklPICsgNDApCi0jZGVmaW5lIERFRkFVTFRfUFJJTwkJKE1BWF9SVF9QUklPICsgMjApCisjZGVm aW5lIE5PUk1BTF9QUklPCQkoREVGQVVMVF9QUklPKQorI2VuZGlmIC8qIENPTkZJR19TQ0hFRF9S SUZTICovCiAKIHN0YXRpYyBpbmxpbmUgaW50IHJ0X3ByaW8oaW50IHByaW8pCiB7CkBAIC0yMDAy LDcgKzIwODQsNyBAQAogdGFza19zY2hlZF9ydW50aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFz ayk7CiAKIC8qIHNjaGVkX2V4ZWMgaXMgY2FsbGVkIGJ5IHByb2Nlc3NlcyBwZXJmb3JtaW5nIGFu IGV4ZWMgKi8KLSNpZmRlZiBDT05GSUdfU01QCisjaWYgZGVmaW5lZChDT05GSUdfU01QKSAmJiAh ZGVmaW5lZChDT05GSUdfU0NIRURfUklGUykKIGV4dGVybiB2b2lkIHNjaGVkX2V4ZWModm9pZCk7 CiAjZWxzZQogI2RlZmluZSBzY2hlZF9leGVjKCkgICB7fQpkaWZmIC1ydU4gbGludXgtMy40LjEv aW5jbHVkZS9saW51eC9zY2hlZCAo5aSN5Lu2KS5oIGxpbnV4LTMuNC4xLVJJRlMvaW5jbHVkZS9s aW51eC9zY2hlZCAo5aSN5Lu2KS5oCi0tLSBsaW51eC0zLjQuMS9pbmNsdWRlL2xpbnV4L3NjaGVk ICjlpI3ku7YpLmgJMTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAgKzA4MDAKKysrIGxpbnV4 LTMuNC4xLVJJRlMvaW5jbHVkZS9saW51eC9zY2hlZCAo5aSN5Lu2KS5oCTIwMTItMDYtMDEgMTU6 MTg6NDQuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsMjgyMyBAQAorI2lmbmRlZiBfTElOVVhf U0NIRURfSAorI2RlZmluZSBfTElOVVhfU0NIRURfSAorCisvKgorICogY2xvbmluZyBmbGFnczoK KyAqLworI2RlZmluZSBDU0lHTkFMCQkweDAwMDAwMGZmCS8qIHNpZ25hbCBtYXNrIHRvIGJlIHNl bnQgYXQgZXhpdCAqLworI2RlZmluZSBDTE9ORV9WTQkweDAwMDAwMTAwCS8qIHNldCBpZiBWTSBz aGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgQ0xPTkVfRlMJMHgwMDAwMDIwMAkv KiBzZXQgaWYgZnMgaW5mbyBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMgKi8KKyNkZWZpbmUgQ0xP TkVfRklMRVMJMHgwMDAwMDQwMAkvKiBzZXQgaWYgb3BlbiBmaWxlcyBzaGFyZWQgYmV0d2VlbiBw cm9jZXNzZXMgKi8KKyNkZWZpbmUgQ0xPTkVfU0lHSEFORAkweDAwMDAwODAwCS8qIHNldCBpZiBz aWduYWwgaGFuZGxlcnMgYW5kIGJsb2NrZWQgc2lnbmFscyBzaGFyZWQgKi8KKyNkZWZpbmUgQ0xP TkVfUFRSQUNFCTB4MDAwMDIwMDAJLyogc2V0IGlmIHdlIHdhbnQgdG8gbGV0IHRyYWNpbmcgY29u dGludWUgb24gdGhlIGNoaWxkIHRvbyAqLworI2RlZmluZSBDTE9ORV9WRk9SSwkweDAwMDA0MDAw CS8qIHNldCBpZiB0aGUgcGFyZW50IHdhbnRzIHRoZSBjaGlsZCB0byB3YWtlIGl0IHVwIG9uIG1t X3JlbGVhc2UgKi8KKyNkZWZpbmUgQ0xPTkVfUEFSRU5UCTB4MDAwMDgwMDAJLyogc2V0IGlmIHdl IHdhbnQgdG8gaGF2ZSB0aGUgc2FtZSBwYXJlbnQgYXMgdGhlIGNsb25lciAqLworI2RlZmluZSBD TE9ORV9USFJFQUQJMHgwMDAxMDAwMAkvKiBTYW1lIHRocmVhZCBncm91cD8gKi8KKyNkZWZpbmUg Q0xPTkVfTkVXTlMJMHgwMDAyMDAwMAkvKiBOZXcgbmFtZXNwYWNlIGdyb3VwPyAqLworI2RlZmlu ZSBDTE9ORV9TWVNWU0VNCTB4MDAwNDAwMDAJLyogc2hhcmUgc3lzdGVtIFYgU0VNX1VORE8gc2Vt YW50aWNzICovCisjZGVmaW5lIENMT05FX1NFVFRMUwkweDAwMDgwMDAwCS8qIGNyZWF0ZSBhIG5l dyBUTFMgZm9yIHRoZSBjaGlsZCAqLworI2RlZmluZSBDTE9ORV9QQVJFTlRfU0VUVElECTB4MDAx MDAwMDAJLyogc2V0IHRoZSBUSUQgaW4gdGhlIHBhcmVudCAqLworI2RlZmluZSBDTE9ORV9DSElM RF9DTEVBUlRJRAkweDAwMjAwMDAwCS8qIGNsZWFyIHRoZSBUSUQgaW4gdGhlIGNoaWxkICovCisj ZGVmaW5lIENMT05FX0RFVEFDSEVECQkweDAwNDAwMDAwCS8qIFVudXNlZCwgaWdub3JlZCAqLwor I2RlZmluZSBDTE9ORV9VTlRSQUNFRAkJMHgwMDgwMDAwMAkvKiBzZXQgaWYgdGhlIHRyYWNpbmcg cHJvY2VzcyBjYW4ndCBmb3JjZSBDTE9ORV9QVFJBQ0Ugb24gdGhpcyBjbG9uZSAqLworI2RlZmlu ZSBDTE9ORV9DSElMRF9TRVRUSUQJMHgwMTAwMDAwMAkvKiBzZXQgdGhlIFRJRCBpbiB0aGUgY2hp bGQgKi8KKy8qIDB4MDIwMDAwMDAgd2FzIHByZXZpb3VzbHkgdGhlIHVudXNlZCBDTE9ORV9TVE9Q UEVEIChTdGFydCBpbiBzdG9wcGVkIHN0YXRlKQorICAgYW5kIGlzIG5vdyBhdmFpbGFibGUgZm9y IHJlLXVzZS4gKi8KKyNkZWZpbmUgQ0xPTkVfTkVXVVRTCQkweDA0MDAwMDAwCS8qIE5ldyB1dHNu YW1lIGdyb3VwPyAqLworI2RlZmluZSBDTE9ORV9ORVdJUEMJCTB4MDgwMDAwMDAJLyogTmV3IGlw Y3MgKi8KKyNkZWZpbmUgQ0xPTkVfTkVXVVNFUgkJMHgxMDAwMDAwMAkvKiBOZXcgdXNlciBuYW1l c3BhY2UgKi8KKyNkZWZpbmUgQ0xPTkVfTkVXUElECQkweDIwMDAwMDAwCS8qIE5ldyBwaWQgbmFt ZXNwYWNlICovCisjZGVmaW5lIENMT05FX05FV05FVAkJMHg0MDAwMDAwMAkvKiBOZXcgbmV0d29y ayBuYW1lc3BhY2UgKi8KKyNkZWZpbmUgQ0xPTkVfSU8JCTB4ODAwMDAwMDAJLyogQ2xvbmUgaW8g Y29udGV4dCAqLworCisvKgorICogU2NoZWR1bGluZyBwb2xpY2llcworICovCisjZGVmaW5lIFND SEVEX05PUk1BTAkJMAorI2RlZmluZSBTQ0hFRF9GSUZPCQkxCisjZGVmaW5lIFNDSEVEX1JSCQky CisjZGVmaW5lIFNDSEVEX0JBVENICQkzCisvKiBTQ0hFRF9JU086IHJlc2VydmVkIGJ1dCBub3Qg aW1wbGVtZW50ZWQgeWV0ICovCisjZGVmaW5lIFNDSEVEX0lETEUJCTUKKy8qIENhbiBiZSBPUmVk IGluIHRvIG1ha2Ugc3VyZSB0aGUgcHJvY2VzcyBpcyByZXZlcnRlZCBiYWNrIHRvIFNDSEVEX05P Uk1BTCBvbiBmb3JrICovCisjZGVmaW5lIFNDSEVEX1JFU0VUX09OX0ZPUksgICAgIDB4NDAwMDAw MDAKKworI2lmZGVmIF9fS0VSTkVMX18KKworc3RydWN0IHNjaGVkX3BhcmFtIHsKKwlpbnQgc2No ZWRfcHJpb3JpdHk7Cit9OworCisjaW5jbHVkZSA8YXNtL3BhcmFtLmg+CS8qIGZvciBIWiAqLwor CisjaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMu aD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgor I2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgorI2lu Y2x1ZGUgPGxpbnV4L3JidHJlZS5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZF9pbmZvLmg+Cisj aW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5j bHVkZSA8bGludXgvbm9kZW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9tbV90eXBlcy5oPgorCisj aW5jbHVkZSA8YXNtL3BhZ2UuaD4KKyNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CisjaW5jbHVkZSA8 YXNtL2NwdXRpbWUuaD4KKworI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4 L3NlbS5oPgorI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBp bGVyLmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3Bp ZC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3RvcG9sb2d5 Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvcG9ydGlvbnMuaD4KKyNpbmNsdWRlIDxsaW51eC9zZWNj b21wLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3Vs aXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcnRtdXRleC5oPgorCisjaW5jbHVkZSA8bGludXgvdGlt ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+CisjaW5jbHVkZSA8bGludXgvcmVzb3VyY2Uu aD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4K KyNpbmNsdWRlIDxsaW51eC90YXNrX2lvX2FjY291bnRpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9s YXRlbmN5dG9wLmg+CisjaW5jbHVkZSA8bGludXgvY3JlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2xs aXN0Lmg+CisKKyNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisKK3N0cnVjdCBleGVjX2RvbWFp bjsKK3N0cnVjdCBmdXRleF9waV9zdGF0ZTsKK3N0cnVjdCByb2J1c3RfbGlzdF9oZWFkOworc3Ry dWN0IGJpb19saXN0Oworc3RydWN0IGZzX3N0cnVjdDsKK3N0cnVjdCBwZXJmX2V2ZW50X2NvbnRl eHQ7CitzdHJ1Y3QgYmxrX3BsdWc7CisKKy8qCisgKiBMaXN0IG9mIGZsYWdzIHdlIHdhbnQgdG8g c2hhcmUgZm9yIGtlcm5lbCB0aHJlYWRzLAorICogaWYgb25seSBiZWNhdXNlIHRoZXkgYXJlIG5v dCB1c2VkIGJ5IHRoZW0gYW55d2F5LgorICovCisjZGVmaW5lIENMT05FX0tFUk5FTAkoQ0xPTkVf RlMgfCBDTE9ORV9GSUxFUyB8IENMT05FX1NJR0hBTkQpCisKKy8qCisgKiBUaGVzZSBhcmUgdGhl IGNvbnN0YW50IHVzZWQgdG8gZmFrZSB0aGUgZml4ZWQtcG9pbnQgbG9hZC1hdmVyYWdlCisgKiBj b3VudGluZy4gU29tZSBub3RlczoKKyAqICAtIDExIGJpdCBmcmFjdGlvbnMgZXhwYW5kIHRvIDIy IGJpdHMgYnkgdGhlIG11bHRpcGxpZXM6IHRoaXMgZ2l2ZXMKKyAqICAgIGEgbG9hZC1hdmVyYWdl IHByZWNpc2lvbiBvZiAxMCBiaXRzIGludGVnZXIgKyAxMSBiaXRzIGZyYWN0aW9uYWwKKyAqICAt IGlmIHlvdSB3YW50IHRvIGNvdW50IGxvYWQtYXZlcmFnZXMgbW9yZSBvZnRlbiwgeW91IG5lZWQg bW9yZQorICogICAgcHJlY2lzaW9uLCBvciByb3VuZGluZyB3aWxsIGdldCB5b3UuIFdpdGggMi1z ZWNvbmQgY291bnRpbmcgZnJlcSwKKyAqICAgIHRoZSBFWFBfbiB2YWx1ZXMgd291bGQgYmUgMTk4 MSwgMjAzNCBhbmQgMjA0MyBpZiBzdGlsbCB1c2luZyBvbmx5CisgKiAgICAxMSBiaXQgZnJhY3Rp b25zLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBhdmVucnVuW107CQkvKiBMb2FkIGF2ZXJh Z2VzICovCitleHRlcm4gdm9pZCBnZXRfYXZlbnJ1bih1bnNpZ25lZCBsb25nICpsb2FkcywgdW5z aWduZWQgbG9uZyBvZmZzZXQsIGludCBzaGlmdCk7CisKKyNkZWZpbmUgRlNISUZUCQkxMQkJLyog bnIgb2YgYml0cyBvZiBwcmVjaXNpb24gKi8KKyNkZWZpbmUgRklYRURfMQkJKDE8PEZTSElGVCkJ LyogMS4wIGFzIGZpeGVkLXBvaW50ICovCisjZGVmaW5lIExPQURfRlJFUQkoNSpIWisxKQkvKiA1 IHNlYyBpbnRlcnZhbHMgKi8KKyNkZWZpbmUgRVhQXzEJCTE4ODQJCS8qIDEvZXhwKDVzZWMvMW1p bikgYXMgZml4ZWQtcG9pbnQgKi8KKyNkZWZpbmUgRVhQXzUJCTIwMTQJCS8qIDEvZXhwKDVzZWMv NW1pbikgKi8KKyNkZWZpbmUgRVhQXzE1CQkyMDM3CQkvKiAxL2V4cCg1c2VjLzE1bWluKSAqLwor CisjZGVmaW5lIENBTENfTE9BRChsb2FkLGV4cCxuKSBcCisJbG9hZCAqPSBleHA7IFwKKwlsb2Fk ICs9IG4qKEZJWEVEXzEtZXhwKTsgXAorCWxvYWQgPj49IEZTSElGVDsKKworZXh0ZXJuIHVuc2ln bmVkIGxvbmcgdG90YWxfZm9ya3M7CitleHRlcm4gaW50IG5yX3RocmVhZHM7CitERUNMQVJFX1BF Ul9DUFUodW5zaWduZWQgbG9uZywgcHJvY2Vzc19jb3VudHMpOworZXh0ZXJuIGludCBucl9wcm9j ZXNzZXModm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nKHZvaWQpOworZXh0 ZXJuIHVuc2lnbmVkIGxvbmcgbnJfdW5pbnRlcnJ1cHRpYmxlKHZvaWQpOworZXh0ZXJuIHVuc2ln bmVkIGxvbmcgbnJfaW93YWl0KHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbnJfaW93YWl0 X2NwdShpbnQgY3B1KTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHRoaXNfY3B1X2xvYWQodm9pZCk7 CisKKworZXh0ZXJuIHZvaWQgY2FsY19nbG9iYWxfbG9hZCh1bnNpZ25lZCBsb25nIHRpY2tzKTsK KworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3BhcmVudF9pcCh1bnNpZ25lZCBsb25nIGFkZHIp OworCitzdHJ1Y3Qgc2VxX2ZpbGU7CitzdHJ1Y3QgY2ZzX3JxOworc3RydWN0IHRhc2tfZ3JvdXA7 CisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCitleHRlcm4gdm9pZCBwcm9jX3NjaGVkX3Nob3df dGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBzZXFfZmlsZSAqbSk7CitleHRlcm4g dm9pZCBwcm9jX3NjaGVkX3NldF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CitleHRlcm4g dm9pZAorcHJpbnRfY2ZzX3JxKHN0cnVjdCBzZXFfZmlsZSAqbSwgaW50IGNwdSwgc3RydWN0IGNm c19ycSAqY2ZzX3JxKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQKK3Byb2Nfc2NoZWRfc2hv d190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHNlcV9maWxlICptKQoreworfQor c3RhdGljIGlubGluZSB2b2lkIHByb2Nfc2NoZWRfc2V0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0 ICpwKQoreworfQorc3RhdGljIGlubGluZSB2b2lkCitwcmludF9jZnNfcnEoc3RydWN0IHNlcV9m aWxlICptLCBpbnQgY3B1LCBzdHJ1Y3QgY2ZzX3JxICpjZnNfcnEpCit7Cit9CisjZW5kaWYKKwor LyoKKyAqIFRhc2sgc3RhdGUgYml0bWFzay4gTk9URSEgVGhlc2UgYml0cyBhcmUgYWxzbworICog ZW5jb2RlZCBpbiBmcy9wcm9jL2FycmF5LmM6IGdldF90YXNrX3N0YXRlKCkuCisgKgorICogV2Ug aGF2ZSB0d28gc2VwYXJhdGUgc2V0cyBvZiBmbGFnczogdGFzay0+c3RhdGUKKyAqIGlzIGFib3V0 IHJ1bm5hYmlsaXR5LCB3aGlsZSB0YXNrLT5leGl0X3N0YXRlIGFyZQorICogYWJvdXQgdGhlIHRh c2sgZXhpdGluZy4gQ29uZnVzaW5nLCBidXQgdGhpcyB3YXkKKyAqIG1vZGlmeWluZyBvbmUgc2V0 IGNhbid0IG1vZGlmeSB0aGUgb3RoZXIgb25lIGJ5CisgKiBtaXN0YWtlLgorICovCisjZGVmaW5l IFRBU0tfUlVOTklORwkJMAorI2RlZmluZSBUQVNLX0lOVEVSUlVQVElCTEUJMQorI2RlZmluZSBU QVNLX1VOSU5URVJSVVBUSUJMRQkyCisjZGVmaW5lIF9fVEFTS19TVE9QUEVECQk0CisjZGVmaW5l IF9fVEFTS19UUkFDRUQJCTgKKy8qIGluIHRzay0+ZXhpdF9zdGF0ZSAqLworI2RlZmluZSBFWElU X1pPTUJJRQkJMTYKKyNkZWZpbmUgRVhJVF9ERUFECQkzMgorLyogaW4gdHNrLT5zdGF0ZSBhZ2Fp biAqLworI2RlZmluZSBUQVNLX0RFQUQJCTY0CisjZGVmaW5lIFRBU0tfV0FLRUtJTEwJCTEyOAor I2RlZmluZSBUQVNLX1dBS0lORwkJMjU2CisjZGVmaW5lIFRBU0tfU1RBVEVfTUFYCQk1MTIKKwor I2RlZmluZSBUQVNLX1NUQVRFX1RPX0NIQVJfU1RSICJSU0RUdFpYeEtXIgorCitleHRlcm4gY2hh ciBfX19hc3NlcnRfdGFza19zdGF0ZVsxIC0gMiohISgKKwkJc2l6ZW9mKFRBU0tfU1RBVEVfVE9f Q0hBUl9TVFIpLTEgIT0gaWxvZzIoVEFTS19TVEFURV9NQVgpKzEpXTsKKworLyogQ29udmVuaWVu Y2UgbWFjcm9zIGZvciB0aGUgc2FrZSBvZiBzZXRfdGFza19zdGF0ZSAqLworI2RlZmluZSBUQVNL X0tJTExBQkxFCQkoVEFTS19XQUtFS0lMTCB8IFRBU0tfVU5JTlRFUlJVUFRJQkxFKQorI2RlZmlu ZSBUQVNLX1NUT1BQRUQJCShUQVNLX1dBS0VLSUxMIHwgX19UQVNLX1NUT1BQRUQpCisjZGVmaW5l IFRBU0tfVFJBQ0VECQkoVEFTS19XQUtFS0lMTCB8IF9fVEFTS19UUkFDRUQpCisKKy8qIENvbnZl bmllbmNlIG1hY3JvcyBmb3IgdGhlIHNha2Ugb2Ygd2FrZV91cCAqLworI2RlZmluZSBUQVNLX05P Uk1BTAkJKFRBU0tfSU5URVJSVVBUSUJMRSB8IFRBU0tfVU5JTlRFUlJVUFRJQkxFKQorI2RlZmlu ZSBUQVNLX0FMTAkJKFRBU0tfTk9STUFMIHwgX19UQVNLX1NUT1BQRUQgfCBfX1RBU0tfVFJBQ0VE KQorCisvKiBnZXRfdGFza19zdGF0ZSgpICovCisjZGVmaW5lIFRBU0tfUkVQT1JUCQkoVEFTS19S VU5OSU5HIHwgVEFTS19JTlRFUlJVUFRJQkxFIHwgXAorCQkJCSBUQVNLX1VOSU5URVJSVVBUSUJM RSB8IF9fVEFTS19TVE9QUEVEIHwgXAorCQkJCSBfX1RBU0tfVFJBQ0VEKQorCisjZGVmaW5lIHRh c2tfaXNfdHJhY2VkKHRhc2spCSgodGFzay0+c3RhdGUgJiBfX1RBU0tfVFJBQ0VEKSAhPSAwKQor I2RlZmluZSB0YXNrX2lzX3N0b3BwZWQodGFzaykJKCh0YXNrLT5zdGF0ZSAmIF9fVEFTS19TVE9Q UEVEKSAhPSAwKQorI2RlZmluZSB0YXNrX2lzX2RlYWQodGFzaykJKCh0YXNrKS0+ZXhpdF9zdGF0 ZSAhPSAwKQorI2RlZmluZSB0YXNrX2lzX3N0b3BwZWRfb3JfdHJhY2VkKHRhc2spCVwKKwkJCSgo dGFzay0+c3RhdGUgJiAoX19UQVNLX1NUT1BQRUQgfCBfX1RBU0tfVFJBQ0VEKSkgIT0gMCkKKyNk ZWZpbmUgdGFza19jb250cmlidXRlc190b19sb2FkKHRhc2spCVwKKwkJCQkoKHRhc2stPnN0YXRl ICYgVEFTS19VTklOVEVSUlVQVElCTEUpICE9IDAgJiYgXAorCQkJCSAodGFzay0+ZmxhZ3MgJiBQ Rl9GUk9aRU4pID09IDApCisKKyNkZWZpbmUgX19zZXRfdGFza19zdGF0ZSh0c2ssIHN0YXRlX3Zh bHVlKQkJXAorCWRvIHsgKHRzayktPnN0YXRlID0gKHN0YXRlX3ZhbHVlKTsgfSB3aGlsZSAoMCkK KyNkZWZpbmUgc2V0X3Rhc2tfc3RhdGUodHNrLCBzdGF0ZV92YWx1ZSkJCVwKKwlzZXRfbWIoKHRz ayktPnN0YXRlLCAoc3RhdGVfdmFsdWUpKQorCisvKgorICogc2V0X2N1cnJlbnRfc3RhdGUoKSBp bmNsdWRlcyBhIGJhcnJpZXIgc28gdGhhdCB0aGUgd3JpdGUgb2YgY3VycmVudC0+c3RhdGUKKyAq IGlzIGNvcnJlY3RseSBzZXJpYWxpc2VkIHdydCB0aGUgY2FsbGVyJ3Mgc3Vic2VxdWVudCB0ZXN0 IG9mIHdoZXRoZXIgdG8KKyAqIGFjdHVhbGx5IHNsZWVwOgorICoKKyAqCXNldF9jdXJyZW50X3N0 YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKyAqCWlmIChkb19pX25lZWRfdG9fc2xlZXAoKSkK KyAqCQlzY2hlZHVsZSgpOworICoKKyAqIElmIHRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCBzdWNo IHNlcmlhbGlzYXRpb24gdGhlbiB1c2UgX19zZXRfY3VycmVudF9zdGF0ZSgpCisgKi8KKyNkZWZp bmUgX19zZXRfY3VycmVudF9zdGF0ZShzdGF0ZV92YWx1ZSkJCQlcCisJZG8geyBjdXJyZW50LT5z dGF0ZSA9IChzdGF0ZV92YWx1ZSk7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9jdXJyZW50X3N0 YXRlKHN0YXRlX3ZhbHVlKQkJXAorCXNldF9tYihjdXJyZW50LT5zdGF0ZSwgKHN0YXRlX3ZhbHVl KSkKKworLyogVGFzayBjb21tYW5kIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIFRBU0tfQ09NTV9M RU4gMTYKKworI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisKKy8qCisgKiBUaGlzIHNlcmlh bGl6ZXMgInNjaGVkdWxlKCkiIGFuZCBhbHNvIHByb3RlY3RzCisgKiB0aGUgcnVuLXF1ZXVlIGZy b20gZGVsZXRpb25zL21vZGlmaWNhdGlvbnMgKGJ1dAorICogX2FkZGluZ18gdG8gdGhlIGJlZ2lu bmluZyBvZiB0aGUgcnVuLXF1ZXVlIGhhcworICogYSBzZXBhcmF0ZSBsb2NrKS4KKyAqLworZXh0 ZXJuIHJ3bG9ja190IHRhc2tsaXN0X2xvY2s7CitleHRlcm4gc3BpbmxvY2tfdCBtbWxpc3RfbG9j azsKKworc3RydWN0IHRhc2tfc3RydWN0OworCisjaWZkZWYgQ09ORklHX1BST1ZFX1JDVQorZXh0 ZXJuIGludCBsb2NrZGVwX3Rhc2tsaXN0X2xvY2tfaXNfaGVsZCh2b2lkKTsKKyNlbmRpZiAvKiAj aWZkZWYgQ09ORklHX1BST1ZFX1JDVSAqLworCitleHRlcm4gdm9pZCBzY2hlZF9pbml0KHZvaWQp OworZXh0ZXJuIHZvaWQgc2NoZWRfaW5pdF9zbXAodm9pZCk7CitleHRlcm4gYXNtbGlua2FnZSB2 b2lkIHNjaGVkdWxlX3RhaWwoc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KTsKK2V4dGVybiB2b2lk IGluaXRfaWRsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUsIGludCBjcHUpOworZXh0ZXJuIHZv aWQgaW5pdF9pZGxlX2Jvb3R1cF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSk7CisKK2V4 dGVybiBpbnQgcnVucXVldWVfaXNfbG9ja2VkKGludCBjcHUpOworCisjaWYgZGVmaW5lZChDT05G SUdfU01QKSAmJiBkZWZpbmVkKENPTkZJR19OT19IWikKK2V4dGVybiB2b2lkIHNlbGVjdF9ub2h6 X2xvYWRfYmFsYW5jZXIoaW50IHN0b3BfdGljayk7CitleHRlcm4gdm9pZCBzZXRfY3B1X3NkX3N0 YXRlX2lkbGUodm9pZCk7CitleHRlcm4gaW50IGdldF9ub2h6X3RpbWVyX3RhcmdldCh2b2lkKTsK KyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2VsZWN0X25vaHpfbG9hZF9iYWxhbmNlcihpbnQg c3RvcF90aWNrKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1X3NkX3N0YXRlX2lkbGUo dm9pZCkgeyB9CisjZW5kaWYKKworLyoKKyAqIE9ubHkgZHVtcCBUQVNLXyogdGFza3MuICgwIGZv ciBhbGwgdGFza3MpCisgKi8KK2V4dGVybiB2b2lkIHNob3dfc3RhdGVfZmlsdGVyKHVuc2lnbmVk IGxvbmcgc3RhdGVfZmlsdGVyKTsKKworc3RhdGljIGlubGluZSB2b2lkIHNob3dfc3RhdGUodm9p ZCkKK3sKKwlzaG93X3N0YXRlX2ZpbHRlcigwKTsKK30KKworZXh0ZXJuIHZvaWQgc2hvd19yZWdz KHN0cnVjdCBwdF9yZWdzICopOworCisvKgorICogVEFTSyBpcyBhIHBvaW50ZXIgdG8gdGhlIHRh c2sgd2hvc2UgYmFja3RyYWNlIHdlIHdhbnQgdG8gc2VlIChvciBOVUxMIGZvciBjdXJyZW50Cisg KiB0YXNrKSwgU1AgaXMgdGhlIHN0YWNrIHBvaW50ZXIgb2YgdGhlIGZpcnN0IGZyYW1lIHRoYXQg c2hvdWxkIGJlIHNob3duIGluIHRoZSBiYWNrCisgKiB0cmFjZSAob3IgTlVMTCBpZiB0aGUgZW50 aXJlIGNhbGwtY2hhaW4gb2YgdGhlIHRhc2sgc2hvdWxkIGJlIHNob3duKS4KKyAqLworZXh0ZXJu IHZvaWQgc2hvd19zdGFjayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcg KnNwKTsKKwordm9pZCBpb19zY2hlZHVsZSh2b2lkKTsKK2xvbmcgaW9fc2NoZWR1bGVfdGltZW91 dChsb25nIHRpbWVvdXQpOworCitleHRlcm4gdm9pZCBjcHVfaW5pdCAodm9pZCk7CitleHRlcm4g dm9pZCB0cmFwX2luaXQodm9pZCk7CitleHRlcm4gdm9pZCB1cGRhdGVfcHJvY2Vzc190aW1lcyhp bnQgdXNlcik7CitleHRlcm4gdm9pZCBzY2hlZHVsZXJfdGljayh2b2lkKTsKKworZXh0ZXJuIHZv aWQgc2NoZWRfc2hvd190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKyNpZmRlZiBDT05G SUdfTE9DS1VQX0RFVEVDVE9SCitleHRlcm4gdm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9n KHZvaWQpOworZXh0ZXJuIHZvaWQgdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZ19zeW5jKHZvaWQp OworZXh0ZXJuIHZvaWQgdG91Y2hfYWxsX3NvZnRsb2NrdXBfd2F0Y2hkb2dzKHZvaWQpOworZXh0 ZXJuIGludCBwcm9jX2Rvd2F0Y2hkb2dfdGhyZXNoKHN0cnVjdCBjdGxfdGFibGUgKnRhYmxlLCBp bnQgd3JpdGUsCisJCQkJICB2b2lkIF9fdXNlciAqYnVmZmVyLAorCQkJCSAgc2l6ZV90ICpsZW5w LCBsb2ZmX3QgKnBwb3MpOworZXh0ZXJuIHVuc2lnbmVkIGludCAgc29mdGxvY2t1cF9wYW5pYzsK K3ZvaWQgbG9ja3VwX2RldGVjdG9yX2luaXQodm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2 b2lkIHRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2codm9pZCkKK3sKK30KK3N0YXRpYyBpbmxpbmUg dm9pZCB0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nX3N5bmModm9pZCkKK3sKK30KK3N0YXRpYyBp bmxpbmUgdm9pZCB0b3VjaF9hbGxfc29mdGxvY2t1cF93YXRjaGRvZ3Modm9pZCkKK3sKK30KK3N0 YXRpYyBpbmxpbmUgdm9pZCBsb2NrdXBfZGV0ZWN0b3JfaW5pdCh2b2lkKQoreworfQorI2VuZGlm CisKKyNpZmRlZiBDT05GSUdfREVURUNUX0hVTkdfVEFTSworZXh0ZXJuIHVuc2lnbmVkIGludCAg c3lzY3RsX2h1bmdfdGFza19wYW5pYzsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c2N0bF9odW5n X3Rhc2tfY2hlY2tfY291bnQ7CitleHRlcm4gdW5zaWduZWQgbG9uZyBzeXNjdGxfaHVuZ190YXNr X3RpbWVvdXRfc2VjczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHN5c2N0bF9odW5nX3Rhc2tfd2Fy bmluZ3M7CitleHRlcm4gaW50IHByb2NfZG9odW5nX3Rhc2tfdGltZW91dF9zZWNzKHN0cnVjdCBj dGxfdGFibGUgKnRhYmxlLCBpbnQgd3JpdGUsCisJCQkJCSB2b2lkIF9fdXNlciAqYnVmZmVyLAor CQkJCQkgc2l6ZV90ICpsZW5wLCBsb2ZmX3QgKnBwb3MpOworI2Vsc2UKKy8qIEF2b2lkIG5lZWQg Zm9yIGlmZGVmcyBlbHNld2hlcmUgaW4gdGhlIGNvZGUgKi8KK2VudW0geyBzeXNjdGxfaHVuZ190 YXNrX3RpbWVvdXRfc2VjcyA9IDAgfTsKKyNlbmRpZgorCisvKiBBdHRhY2ggdG8gYW55IGZ1bmN0 aW9ucyB3aGljaCBzaG91bGQgYmUgaWdub3JlZCBpbiB3Y2hhbiBvdXRwdXQuICovCisjZGVmaW5l IF9fc2NoZWQJCV9fYXR0cmlidXRlX18oKF9fc2VjdGlvbl9fKCIuc2NoZWQudGV4dCIpKSkKKwor LyogTGlua2VyIGFkZHMgdGhlc2U6IHN0YXJ0IGFuZCBlbmQgb2YgX19zY2hlZCBmdW5jdGlvbnMg Ki8KK2V4dGVybiBjaGFyIF9fc2NoZWRfdGV4dF9zdGFydFtdLCBfX3NjaGVkX3RleHRfZW5kW107 CisKKy8qIElzIHRoaXMgYWRkcmVzcyBpbiB0aGUgX19zY2hlZCBmdW5jdGlvbnM/ICovCitleHRl cm4gaW50IGluX3NjaGVkX2Z1bmN0aW9ucyh1bnNpZ25lZCBsb25nIGFkZHIpOworCisjZGVmaW5l CU1BWF9TQ0hFRFVMRV9USU1FT1VUCUxPTkdfTUFYCitleHRlcm4gc2lnbmVkIGxvbmcgc2NoZWR1 bGVfdGltZW91dChzaWduZWQgbG9uZyB0aW1lb3V0KTsKK2V4dGVybiBzaWduZWQgbG9uZyBzY2hl ZHVsZV90aW1lb3V0X2ludGVycnVwdGlibGUoc2lnbmVkIGxvbmcgdGltZW91dCk7CitleHRlcm4g c2lnbmVkIGxvbmcgc2NoZWR1bGVfdGltZW91dF9raWxsYWJsZShzaWduZWQgbG9uZyB0aW1lb3V0 KTsKK2V4dGVybiBzaWduZWQgbG9uZyBzY2hlZHVsZV90aW1lb3V0X3VuaW50ZXJydXB0aWJsZShz aWduZWQgbG9uZyB0aW1lb3V0KTsKK2FzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZSh2b2lkKTsKK2V4 dGVybiB2b2lkIHNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQodm9pZCk7CitleHRlcm4gaW50IG11 dGV4X3NwaW5fb25fb3duZXIoc3RydWN0IG11dGV4ICpsb2NrLCBzdHJ1Y3QgdGFza19zdHJ1Y3Qg Km93bmVyKTsKKworc3RydWN0IG5zcHJveHk7CitzdHJ1Y3QgdXNlcl9uYW1lc3BhY2U7CisKKy8q CisgKiBEZWZhdWx0IG1heGltdW0gbnVtYmVyIG9mIGFjdGl2ZSBtYXAgYXJlYXMsIHRoaXMgbGlt aXRzIHRoZSBudW1iZXIgb2Ygdm1hcworICogcGVyIG1tIHN0cnVjdC4gVXNlcnMgY2FuIG92ZXJ3 cml0ZSB0aGlzIG51bWJlciBieSBzeXNjdGwgYnV0IHRoZXJlIGlzIGEKKyAqIHByb2JsZW0uCisg KgorICogV2hlbiBhIHByb2dyYW0ncyBjb3JlZHVtcCBpcyBnZW5lcmF0ZWQgYXMgRUxGIGZvcm1h dCwgYSBzZWN0aW9uIGlzIGNyZWF0ZWQKKyAqIHBlciBhIHZtYS4gSW4gRUxGLCB0aGUgbnVtYmVy IG9mIHNlY3Rpb25zIGlzIHJlcHJlc2VudGVkIGluIHVuc2lnbmVkIHNob3J0LgorICogVGhpcyBt ZWFucyB0aGUgbnVtYmVyIG9mIHNlY3Rpb25zIHNob3VsZCBiZSBzbWFsbGVyIHRoYW4gNjU1MzUg YXQgY29yZWR1bXAuCisgKiBCZWNhdXNlIHRoZSBrZXJuZWwgYWRkcyBzb21lIGluZm9ybWF0aXZl IHNlY3Rpb25zIHRvIGEgaW1hZ2Ugb2YgcHJvZ3JhbSBhdAorICogZ2VuZXJhdGluZyBjb3JlZHVt cCwgd2UgbmVlZCBzb21lIG1hcmdpbi4gVGhlIG51bWJlciBvZiBleHRyYSBzZWN0aW9ucyBpcwor ICogMS0zIG5vdyBhbmQgZGVwZW5kcyBvbiBhcmNoLiBXZSB1c2UgIjUiIGFzIHNhZmUgbWFyZ2lu LCBoZXJlLgorICovCisjZGVmaW5lIE1BUENPVU5UX0VMRl9DT1JFX01BUkdJTgkoNSkKKyNkZWZp bmUgREVGQVVMVF9NQVhfTUFQX0NPVU5UCShVU0hSVF9NQVggLSBNQVBDT1VOVF9FTEZfQ09SRV9N QVJHSU4pCisKK2V4dGVybiBpbnQgc3lzY3RsX21heF9tYXBfY291bnQ7CisKKyNpbmNsdWRlIDxs aW51eC9haW8uaD4KKworI2lmZGVmIENPTkZJR19NTVUKK2V4dGVybiB2b2lkIGFyY2hfcGlja19t bWFwX2xheW91dChzdHJ1Y3QgbW1fc3RydWN0ICptbSk7CitleHRlcm4gdW5zaWduZWQgbG9uZwor YXJjaF9nZXRfdW5tYXBwZWRfYXJlYShzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBsb25nLCB1bnNp Z25lZCBsb25nLAorCQkgICAgICAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7CitleHRl cm4gdW5zaWduZWQgbG9uZworYXJjaF9nZXRfdW5tYXBwZWRfYXJlYV90b3Bkb3duKHN0cnVjdCBm aWxlICpmaWxwLCB1bnNpZ25lZCBsb25nIGFkZHIsCisJCQkgIHVuc2lnbmVkIGxvbmcgbGVuLCB1 bnNpZ25lZCBsb25nIHBnb2ZmLAorCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzKTsKK2V4dGVybiB2 b2lkIGFyY2hfdW5tYXBfYXJlYShzdHJ1Y3QgbW1fc3RydWN0ICosIHVuc2lnbmVkIGxvbmcpOwor ZXh0ZXJuIHZvaWQgYXJjaF91bm1hcF9hcmVhX3RvcGRvd24oc3RydWN0IG1tX3N0cnVjdCAqLCB1 bnNpZ25lZCBsb25nKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYXJjaF9waWNrX21tYXBf bGF5b3V0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKSB7fQorI2VuZGlmCisKKworZXh0ZXJuIHZvaWQg c2V0X2R1bXBhYmxlKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBpbnQgdmFsdWUpOworZXh0ZXJuIGlu dCBnZXRfZHVtcGFibGUoc3RydWN0IG1tX3N0cnVjdCAqbW0pOworCisvKiBtbSBmbGFncyAqLwor LyogZHVtcGFibGUgYml0cyAqLworI2RlZmluZSBNTUZfRFVNUEFCTEUgICAgICAwICAvKiBjb3Jl IGR1bXAgaXMgcGVybWl0dGVkICovCisjZGVmaW5lIE1NRl9EVU1QX1NFQ1VSRUxZIDEgIC8qIGNv cmUgZmlsZSBpcyByZWFkYWJsZSBvbmx5IGJ5IHJvb3QgKi8KKworI2RlZmluZSBNTUZfRFVNUEFC TEVfQklUUyAyCisjZGVmaW5lIE1NRl9EVU1QQUJMRV9NQVNLICgoMSA8PCBNTUZfRFVNUEFCTEVf QklUUykgLSAxKQorCisvKiBjb3JlZHVtcCBmaWx0ZXIgYml0cyAqLworI2RlZmluZSBNTUZfRFVN UF9BTk9OX1BSSVZBVEUJMgorI2RlZmluZSBNTUZfRFVNUF9BTk9OX1NIQVJFRAkzCisjZGVmaW5l IE1NRl9EVU1QX01BUFBFRF9QUklWQVRFCTQKKyNkZWZpbmUgTU1GX0RVTVBfTUFQUEVEX1NIQVJF RAk1CisjZGVmaW5lIE1NRl9EVU1QX0VMRl9IRUFERVJTCTYKKyNkZWZpbmUgTU1GX0RVTVBfSFVH RVRMQl9QUklWQVRFIDcKKyNkZWZpbmUgTU1GX0RVTVBfSFVHRVRMQl9TSEFSRUQgIDgKKworI2Rl ZmluZSBNTUZfRFVNUF9GSUxURVJfU0hJRlQJTU1GX0RVTVBBQkxFX0JJVFMKKyNkZWZpbmUgTU1G X0RVTVBfRklMVEVSX0JJVFMJNworI2RlZmluZSBNTUZfRFVNUF9GSUxURVJfTUFTSyBcCisJKCgo MSA8PCBNTUZfRFVNUF9GSUxURVJfQklUUykgLSAxKSA8PCBNTUZfRFVNUF9GSUxURVJfU0hJRlQp CisjZGVmaW5lIE1NRl9EVU1QX0ZJTFRFUl9ERUZBVUxUIFwKKwkoKDEgPDwgTU1GX0RVTVBfQU5P Tl9QUklWQVRFKSB8CSgxIDw8IE1NRl9EVU1QX0FOT05fU0hBUkVEKSB8XAorCSAoMSA8PCBNTUZf RFVNUF9IVUdFVExCX1BSSVZBVEUpIHwgTU1GX0RVTVBfTUFTS19ERUZBVUxUX0VMRikKKworI2lm ZGVmIENPTkZJR19DT1JFX0RVTVBfREVGQVVMVF9FTEZfSEVBREVSUworIyBkZWZpbmUgTU1GX0RV TVBfTUFTS19ERUZBVUxUX0VMRgkoMSA8PCBNTUZfRFVNUF9FTEZfSEVBREVSUykKKyNlbHNlCisj IGRlZmluZSBNTUZfRFVNUF9NQVNLX0RFRkFVTFRfRUxGCTAKKyNlbmRpZgorCQkJCQkvKiBsZWF2 ZSByb29tIGZvciBtb3JlIGR1bXAgZmxhZ3MgKi8KKyNkZWZpbmUgTU1GX1ZNX01FUkdFQUJMRQkx NgkvKiBLU00gbWF5IG1lcmdlIGlkZW50aWNhbCBwYWdlcyAqLworI2RlZmluZSBNTUZfVk1fSFVH RVBBR0UJCTE3CS8qIHNldCB3aGVuIFZNX0hVR0VQQUdFIGlzIHNldCBvbiB2bWEgKi8KKworI2Rl ZmluZSBNTUZfSU5JVF9NQVNLCQkoTU1GX0RVTVBBQkxFX01BU0sgfCBNTUZfRFVNUF9GSUxURVJf TUFTSykKKworc3RydWN0IHNpZ2hhbmRfc3RydWN0IHsKKwlhdG9taWNfdAkJY291bnQ7CisJc3Ry dWN0IGtfc2lnYWN0aW9uCWFjdGlvbltfTlNJR107CisJc3BpbmxvY2tfdAkJc2lnbG9jazsKKwl3 YWl0X3F1ZXVlX2hlYWRfdAlzaWduYWxmZF93cWg7Cit9OworCitzdHJ1Y3QgcGFjY3Rfc3RydWN0 IHsKKwlpbnQJCQlhY19mbGFnOworCWxvbmcJCQlhY19leGl0Y29kZTsKKwl1bnNpZ25lZCBsb25n CQlhY19tZW07CisJY3B1dGltZV90CQlhY191dGltZSwgYWNfc3RpbWU7CisJdW5zaWduZWQgbG9u ZwkJYWNfbWluZmx0LCBhY19tYWpmbHQ7Cit9OworCitzdHJ1Y3QgY3B1X2l0aW1lciB7CisJY3B1 dGltZV90IGV4cGlyZXM7CisJY3B1dGltZV90IGluY3I7CisJdTMyIGVycm9yOworCXUzMiBpbmNy X2Vycm9yOworfTsKKworLyoqCisgKiBzdHJ1Y3QgdGFza19jcHV0aW1lIC0gY29sbGVjdGVkIENQ VSB0aW1lIGNvdW50cworICogQHV0aW1lOgkJdGltZSBzcGVudCBpbiB1c2VyIG1vZGUsIGluICZj cHV0aW1lX3QgdW5pdHMKKyAqIEBzdGltZToJCXRpbWUgc3BlbnQgaW4ga2VybmVsIG1vZGUsIGlu ICZjcHV0aW1lX3QgdW5pdHMKKyAqIEBzdW1fZXhlY19ydW50aW1lOgl0b3RhbCB0aW1lIHNwZW50 IG9uIHRoZSBDUFUsIGluIG5hbm9zZWNvbmRzCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgZ3JvdXBz IHRvZ2V0aGVyIHRocmVlIGtpbmRzIG9mIENQVSB0aW1lIHRoYXQgYXJlCisgKiB0cmFja2VkIGZv ciB0aHJlYWRzIGFuZCB0aHJlYWQgZ3JvdXBzLiAgTW9zdCB0aGluZ3MgY29uc2lkZXJpbmcKKyAq IENQVSB0aW1lIHdhbnQgdG8gZ3JvdXAgdGhlc2UgY291bnRzIHRvZ2V0aGVyIGFuZCB0cmVhdCBh bGwgdGhyZWUKKyAqIG9mIHRoZW0gaW4gcGFyYWxsZWwuCisgKi8KK3N0cnVjdCB0YXNrX2NwdXRp bWUgeworCWNwdXRpbWVfdCB1dGltZTsKKwljcHV0aW1lX3Qgc3RpbWU7CisJdW5zaWduZWQgbG9u ZyBsb25nIHN1bV9leGVjX3J1bnRpbWU7Cit9OworLyogQWx0ZXJuYXRlIGZpZWxkIG5hbWVzIHdo ZW4gdXNlZCB0byBjYWNoZSBleHBpcmF0aW9ucy4gKi8KKyNkZWZpbmUgcHJvZl9leHAJc3RpbWUK KyNkZWZpbmUgdmlydF9leHAJdXRpbWUKKyNkZWZpbmUgc2NoZWRfZXhwCXN1bV9leGVjX3J1bnRp bWUKKworI2RlZmluZSBJTklUX0NQVVRJTUUJXAorCShzdHJ1Y3QgdGFza19jcHV0aW1lKSB7CQkJ CQlcCisJCS51dGltZSA9IDAsCQkJCQlcCisJCS5zdGltZSA9IDAsCQkJCQlcCisJCS5zdW1fZXhl Y19ydW50aW1lID0gMCwJCQkJXAorCX0KKworLyoKKyAqIERpc2FibGUgcHJlZW1wdGlvbiB1bnRp bCB0aGUgc2NoZWR1bGVyIGlzIHJ1bm5pbmcuCisgKiBSZXNldCBieSBzdGFydF9rZXJuZWwoKS0+ c2NoZWRfaW5pdCgpLT5pbml0X2lkbGUoKS4KKyAqCisgKiBXZSBpbmNsdWRlIFBSRUVNUFRfQUNU SVZFIHRvIGF2b2lkIGNvbmRfcmVzY2hlZCgpIGZyb20gd29ya2luZworICogYmVmb3JlIHRoZSBz Y2hlZHVsZXIgaXMgYWN0aXZlIC0tIHNlZSBzaG91bGRfcmVzY2hlZCgpLgorICovCisjZGVmaW5l IElOSVRfUFJFRU1QVF9DT1VOVAkoMSArIFBSRUVNUFRfQUNUSVZFKQorCisvKioKKyAqIHN0cnVj dCB0aHJlYWRfZ3JvdXBfY3B1dGltZXIgLSB0aHJlYWQgZ3JvdXAgaW50ZXJ2YWwgdGltZXIgY291 bnRzCisgKiBAY3B1dGltZToJCXRocmVhZCBncm91cCBpbnRlcnZhbCB0aW1lcnMuCisgKiBAcnVu bmluZzoJCW5vbi16ZXJvIHdoZW4gdGhlcmUgYXJlIHRpbWVycyBydW5uaW5nIGFuZAorICogCQkJ QGNwdXRpbWUgcmVjZWl2ZXMgdXBkYXRlcy4KKyAqIEBsb2NrOgkJbG9jayBmb3IgZmllbGRzIGlu IHRoaXMgc3RydWN0LgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRoZSB2ZXJzaW9u IG9mIHRhc2tfY3B1dGltZSwgYWJvdmUsIHRoYXQgaXMKKyAqIHVzZWQgZm9yIHRocmVhZCBncm91 cCBDUFUgdGltZXIgY2FsY3VsYXRpb25zLgorICovCitzdHJ1Y3QgdGhyZWFkX2dyb3VwX2NwdXRp bWVyIHsKKwlzdHJ1Y3QgdGFza19jcHV0aW1lIGNwdXRpbWU7CisJaW50IHJ1bm5pbmc7CisJcmF3 X3NwaW5sb2NrX3QgbG9jazsKK307CisKKyNpbmNsdWRlIDxsaW51eC9yd3NlbS5oPgorc3RydWN0 IGF1dG9ncm91cDsKKworLyoKKyAqIE5PVEUhICJzaWduYWxfc3RydWN0IiBkb2VzIG5vdCBoYXZl IGl0cyBvd24KKyAqIGxvY2tpbmcsIGJlY2F1c2UgYSBzaGFyZWQgc2lnbmFsX3N0cnVjdCBhbHdh eXMKKyAqIGltcGxpZXMgYSBzaGFyZWQgc2lnaGFuZF9zdHJ1Y3QsIHNvIGxvY2tpbmcKKyAqIHNp Z2hhbmRfc3RydWN0IGlzIGFsd2F5cyBhIHByb3BlciBzdXBlcnNldCBvZgorICogdGhlIGxvY2tp bmcgb2Ygc2lnbmFsX3N0cnVjdC4KKyAqLworc3RydWN0IHNpZ25hbF9zdHJ1Y3QgeworCWF0b21p Y190CQlzaWdjbnQ7CisJYXRvbWljX3QJCWxpdmU7CisJaW50CQkJbnJfdGhyZWFkczsKKworCXdh aXRfcXVldWVfaGVhZF90CXdhaXRfY2hsZGV4aXQ7CS8qIGZvciB3YWl0NCgpICovCisKKwkvKiBj dXJyZW50IHRocmVhZCBncm91cCBzaWduYWwgbG9hZC1iYWxhbmNpbmcgdGFyZ2V0OiAqLworCXN0 cnVjdCB0YXNrX3N0cnVjdAkqY3Vycl90YXJnZXQ7CisKKwkvKiBzaGFyZWQgc2lnbmFsIGhhbmRs aW5nOiAqLworCXN0cnVjdCBzaWdwZW5kaW5nCXNoYXJlZF9wZW5kaW5nOworCisJLyogdGhyZWFk IGdyb3VwIGV4aXQgc3VwcG9ydCAqLworCWludAkJCWdyb3VwX2V4aXRfY29kZTsKKwkvKiBvdmVy bG9hZGVkOgorCSAqIC0gbm90aWZ5IGdyb3VwX2V4aXRfdGFzayB3aGVuIC0+Y291bnQgaXMgZXF1 YWwgdG8gbm90aWZ5X2NvdW50CisJICogLSBldmVyeW9uZSBleGNlcHQgZ3JvdXBfZXhpdF90YXNr IGlzIHN0b3BwZWQgZHVyaW5nIHNpZ25hbCBkZWxpdmVyeQorCSAqICAgb2YgZmF0YWwgc2lnbmFs cywgZ3JvdXBfZXhpdF90YXNrIHByb2Nlc3NlcyB0aGUgc2lnbmFsLgorCSAqLworCWludAkJCW5v dGlmeV9jb3VudDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKmdyb3VwX2V4aXRfdGFzazsKKworCS8q IHRocmVhZCBncm91cCBzdG9wIHN1cHBvcnQsIG92ZXJsb2FkcyBncm91cF9leGl0X2NvZGUgdG9v ICovCisJaW50CQkJZ3JvdXBfc3RvcF9jb3VudDsKKwl1bnNpZ25lZCBpbnQJCWZsYWdzOyAvKiBz ZWUgU0lHTkFMXyogZmxhZ3MgYmVsb3cgKi8KKworCS8qCisJICogUFJfU0VUX0NISUxEX1NVQlJF QVBFUiBtYXJrcyBhIHByb2Nlc3MsIGxpa2UgYSBzZXJ2aWNlCisJICogbWFuYWdlciwgdG8gcmUt cGFyZW50IG9ycGhhbiAoZG91YmxlLWZvcmtpbmcpIGNoaWxkIHByb2Nlc3NlcworCSAqIHRvIHRo aXMgcHJvY2VzcyBpbnN0ZWFkIG9mICdpbml0Jy4gVGhlIHNlcnZpY2UgbWFuYWdlciBpcworCSAq IGFibGUgdG8gcmVjZWl2ZSBTSUdDSExEIHNpZ25hbHMgYW5kIGlzIGFibGUgdG8gaW52ZXN0aWdh dGUKKwkgKiB0aGUgcHJvY2VzcyB1bnRpbCBpdCBjYWxscyB3YWl0KCkuIEFsbCBjaGlsZHJlbiBv ZiB0aGlzCisJICogcHJvY2VzcyB3aWxsIGluaGVyaXQgYSBmbGFnIGlmIHRoZXkgc2hvdWxkIGxv b2sgZm9yIGEKKwkgKiBjaGlsZF9zdWJyZWFwZXIgcHJvY2VzcyBhdCBleGl0LgorCSAqLworCXVu c2lnbmVkIGludAkJaXNfY2hpbGRfc3VicmVhcGVyOjE7CisJdW5zaWduZWQgaW50CQloYXNfY2hp bGRfc3VicmVhcGVyOjE7CisKKwkvKiBQT1NJWC4xYiBJbnRlcnZhbCBUaW1lcnMgKi8KKwlzdHJ1 Y3QgbGlzdF9oZWFkIHBvc2l4X3RpbWVyczsKKworCS8qIElUSU1FUl9SRUFMIHRpbWVyIGZvciB0 aGUgcHJvY2VzcyAqLworCXN0cnVjdCBocnRpbWVyIHJlYWxfdGltZXI7CisJc3RydWN0IHBpZCAq bGVhZGVyX3BpZDsKKwlrdGltZV90IGl0X3JlYWxfaW5jcjsKKworCS8qCisJICogSVRJTUVSX1BS T0YgYW5kIElUSU1FUl9WSVJUVUFMIHRpbWVycyBmb3IgdGhlIHByb2Nlc3MsIHdlIHVzZQorCSAq IENQVUNMT0NLX1BST0YgYW5kIENQVUNMT0NLX1ZJUlQgZm9yIGluZGV4aW5nIGFycmF5IGFzIHRo ZXNlCisJICogdmFsdWVzIGFyZSBkZWZpbmVkIHRvIDAgYW5kIDEgcmVzcGVjdGl2ZWx5CisJICov CisJc3RydWN0IGNwdV9pdGltZXIgaXRbMl07CisKKwkvKgorCSAqIFRocmVhZCBncm91cCB0b3Rh bHMgZm9yIHByb2Nlc3MgQ1BVIHRpbWVycy4KKwkgKiBTZWUgdGhyZWFkX2dyb3VwX2NwdXRpbWVy KCksIGV0IGFsLCBmb3IgZGV0YWlscy4KKwkgKi8KKwlzdHJ1Y3QgdGhyZWFkX2dyb3VwX2NwdXRp bWVyIGNwdXRpbWVyOworCisJLyogRWFybGllc3QtZXhwaXJhdGlvbiBjYWNoZS4gKi8KKwlzdHJ1 Y3QgdGFza19jcHV0aW1lIGNwdXRpbWVfZXhwaXJlczsKKworCXN0cnVjdCBsaXN0X2hlYWQgY3B1 X3RpbWVyc1szXTsKKworCXN0cnVjdCBwaWQgKnR0eV9vbGRfcGdycDsKKworCS8qIGJvb2xlYW4g dmFsdWUgZm9yIHNlc3Npb24gZ3JvdXAgbGVhZGVyICovCisJaW50IGxlYWRlcjsKKworCXN0cnVj dCB0dHlfc3RydWN0ICp0dHk7IC8qIE5VTEwgaWYgbm8gdHR5ICovCisKKyNpZmRlZiBDT05GSUdf U0NIRURfQVVUT0dST1VQCisJc3RydWN0IGF1dG9ncm91cCAqYXV0b2dyb3VwOworI2VuZGlmCisJ LyoKKwkgKiBDdW11bGF0aXZlIHJlc291cmNlIGNvdW50ZXJzIGZvciBkZWFkIHRocmVhZHMgaW4g dGhlIGdyb3VwLAorCSAqIGFuZCBmb3IgcmVhcGVkIGRlYWQgY2hpbGQgcHJvY2Vzc2VzIGZvcmtl ZCBieSB0aGlzIGdyb3VwLgorCSAqIExpdmUgdGhyZWFkcyBtYWludGFpbiB0aGVpciBvd24gY291 bnRlcnMgYW5kIGFkZCB0byB0aGVzZQorCSAqIGluIF9fZXhpdF9zaWduYWwsIGV4Y2VwdCBmb3Ig dGhlIGdyb3VwIGxlYWRlci4KKwkgKi8KKwljcHV0aW1lX3QgdXRpbWUsIHN0aW1lLCBjdXRpbWUs IGNzdGltZTsKKwljcHV0aW1lX3QgZ3RpbWU7CisJY3B1dGltZV90IGNndGltZTsKKyNpZm5kZWYg Q09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKKwljcHV0aW1lX3QgcHJldl91dGltZSwgcHJldl9z dGltZTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbnZjc3csIG5pdmNzdywgY252Y3N3LCBjbml2 Y3N3OworCXVuc2lnbmVkIGxvbmcgbWluX2ZsdCwgbWFqX2ZsdCwgY21pbl9mbHQsIGNtYWpfZmx0 OworCXVuc2lnbmVkIGxvbmcgaW5ibG9jaywgb3VibG9jaywgY2luYmxvY2ssIGNvdWJsb2NrOwor CXVuc2lnbmVkIGxvbmcgbWF4cnNzLCBjbWF4cnNzOworCXN0cnVjdCB0YXNrX2lvX2FjY291bnRp bmcgaW9hYzsKKworCS8qCisJICogQ3VtdWxhdGl2ZSBucyBvZiBzY2hlZHVsZSBDUFUgdGltZSBm byBkZWFkIHRocmVhZHMgaW4gdGhlCisJICogZ3JvdXAsIG5vdCBpbmNsdWRpbmcgYSB6b21iaWUg Z3JvdXAgbGVhZGVyLCAoVGhpcyBvbmx5IGRpZmZlcnMKKwkgKiBmcm9tIGppZmZpZXNfdG9fbnMo dXRpbWUgKyBzdGltZSkgaWYgc2NoZWRfY2xvY2sgdXNlcyBzb21ldGhpbmcKKwkgKiBvdGhlciB0 aGFuIGppZmZpZXMuKQorCSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdW1fc2NoZWRfcnVudGlt ZTsKKworCS8qCisJICogV2UgZG9uJ3QgYm90aGVyIHRvIHN5bmNocm9uaXplIG1vc3QgcmVhZGVy cyBvZiB0aGlzIGF0IGFsbCwKKwkgKiBiZWNhdXNlIHRoZXJlIGlzIG5vIHJlYWRlciBjaGVja2lu ZyBhIGxpbWl0IHRoYXQgYWN0dWFsbHkgbmVlZHMKKwkgKiB0byBnZXQgYm90aCBybGltX2N1ciBh bmQgcmxpbV9tYXggYXRvbWljYWxseSwgYW5kIGVpdGhlciBvbmUKKwkgKiBhbG9uZSBpcyBhIHNp bmdsZSB3b3JkIHRoYXQgY2FuIHNhZmVseSBiZSByZWFkIG5vcm1hbGx5LgorCSAqIGdldHJsaW1p dC9zZXRybGltaXQgdXNlIHRhc2tfbG9jayhjdXJyZW50LT5ncm91cF9sZWFkZXIpIHRvCisJICog cHJvdGVjdCB0aGlzIGluc3RlYWQgb2YgdGhlIHNpZ2xvY2ssIGJlY2F1c2UgdGhleSByZWFsbHkK KwkgKiBoYXZlIG5vIG5lZWQgdG8gZGlzYWJsZSBpcnFzLgorCSAqLworCXN0cnVjdCBybGltaXQg cmxpbVtSTElNX05MSU1JVFNdOworCisjaWZkZWYgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1QKKwlz dHJ1Y3QgcGFjY3Rfc3RydWN0IHBhY2N0OwkvKiBwZXItcHJvY2VzcyBhY2NvdW50aW5nIGluZm9y bWF0aW9uICovCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfVEFTS1NUQVRTCisJc3RydWN0IHRhc2tz dGF0cyAqc3RhdHM7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfQVVESVQKKwl1bnNpZ25lZCBhdWRp dF90dHk7CisJc3RydWN0IHR0eV9hdWRpdF9idWYgKnR0eV9hdWRpdF9idWY7CisjZW5kaWYKKyNp ZmRlZiBDT05GSUdfQ0dST1VQUworCS8qCisJICogZ3JvdXBfcndzZW0gcHJldmVudHMgbmV3IHRh c2tzIGZyb20gZW50ZXJpbmcgdGhlIHRocmVhZGdyb3VwIGFuZAorCSAqIG1lbWJlciB0YXNrcyBm cm9tIGV4aXRpbmcsYSBtb3JlIHNwZWNpZmljYWxseSwgc2V0dGluZyBvZgorCSAqIFBGX0VYSVRJ TkcuICBmb3JrIGFuZCBleGl0IHBhdGhzIGFyZSBwcm90ZWN0ZWQgd2l0aCB0aGlzIHJ3c2VtCisJ ICogdXNpbmcgdGhyZWFkZ3JvdXBfY2hhbmdlX2JlZ2luL2VuZCgpLiAgVXNlcnMgd2hpY2ggcmVx dWlyZQorCSAqIHRocmVhZGdyb3VwIHRvIHJlbWFpbiBzdGFibGUgc2hvdWxkIHVzZSB0aHJlYWRn cm91cF9bdW5dbG9jaygpCisJICogd2hpY2ggYWxzbyB0YWtlcyBjYXJlIG9mIGV4ZWMgcGF0aC4g IEN1cnJlbnRseSwgY2dyb3VwIGlzIHRoZQorCSAqIG9ubHkgdXNlci4KKwkgKi8KKwlzdHJ1Y3Qg cndfc2VtYXBob3JlIGdyb3VwX3J3c2VtOworI2VuZGlmCisKKwlpbnQgb29tX2FkajsJCS8qIE9P TSBraWxsIHNjb3JlIGFkanVzdG1lbnQgKGJpdCBzaGlmdCkgKi8KKwlpbnQgb29tX3Njb3JlX2Fk ajsJLyogT09NIGtpbGwgc2NvcmUgYWRqdXN0bWVudCAqLworCWludCBvb21fc2NvcmVfYWRqX21p bjsJLyogT09NIGtpbGwgc2NvcmUgYWRqdXN0bWVudCBtaW5pbXVtIHZhbHVlLgorCQkJCSAqIE9u bHkgc2V0dGFibGUgYnkgQ0FQX1NZU19SRVNPVVJDRS4gKi8KKworCXN0cnVjdCBtdXRleCBjcmVk X2d1YXJkX211dGV4OwkvKiBndWFyZCBhZ2FpbnN0IGZvcmVpZ24gaW5mbHVlbmNlcyBvbgorCQkJ CQkgKiBjcmVkZW50aWFsIGNhbGN1bGF0aW9ucworCQkJCQkgKiAobm90YWJseS4gcHRyYWNlKSAq LworfTsKKworLyogQ29udGV4dCBzd2l0Y2ggbXVzdCBiZSB1bmxvY2tlZCBpZiBpbnRlcnJ1cHRz IGFyZSB0byBiZSBlbmFibGVkICovCisjaWZkZWYgX19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9D VFhTVworIyBkZWZpbmUgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKKyNlbmRpZgorCisvKgor ICogQml0cyBpbiBmbGFncyBmaWVsZCBvZiBzaWduYWxfc3RydWN0LgorICovCisjZGVmaW5lIFNJ R05BTF9TVE9QX1NUT1BQRUQJMHgwMDAwMDAwMSAvKiBqb2IgY29udHJvbCBzdG9wIGluIGVmZmVj dCAqLworI2RlZmluZSBTSUdOQUxfU1RPUF9DT05USU5VRUQJMHgwMDAwMDAwMiAvKiBTSUdDT05U IHNpbmNlIFdDT05USU5VRUQgcmVhcCAqLworI2RlZmluZSBTSUdOQUxfR1JPVVBfRVhJVAkweDAw MDAwMDA0IC8qIGdyb3VwIGV4aXQgaW4gcHJvZ3Jlc3MgKi8KKy8qCisgKiBQZW5kaW5nIG5vdGlm aWNhdGlvbnMgdG8gcGFyZW50LgorICovCisjZGVmaW5lIFNJR05BTF9DTERfU1RPUFBFRAkweDAw MDAwMDEwCisjZGVmaW5lIFNJR05BTF9DTERfQ09OVElOVUVECTB4MDAwMDAwMjAKKyNkZWZpbmUg U0lHTkFMX0NMRF9NQVNLCQkoU0lHTkFMX0NMRF9TVE9QUEVEfFNJR05BTF9DTERfQ09OVElOVUVE KQorCisjZGVmaW5lIFNJR05BTF9VTktJTExBQkxFCTB4MDAwMDAwNDAgLyogZm9yIGluaXQ6IGln bm9yZSBmYXRhbCBzaWduYWxzICovCisKKy8qIElmIHRydWUsIGFsbCB0aHJlYWRzIGV4Y2VwdCAt Pmdyb3VwX2V4aXRfdGFzayBoYXZlIHBlbmRpbmcgU0lHS0lMTCAqLworc3RhdGljIGlubGluZSBp bnQgc2lnbmFsX2dyb3VwX2V4aXQoY29uc3Qgc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZykKK3sK KwlyZXR1cm4JKHNpZy0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkgfHwKKwkJKHNpZy0+Z3Jv dXBfZXhpdF90YXNrICE9IE5VTEwpOworfQorCisvKgorICogU29tZSBkYXkgdGhpcyB3aWxsIGJl IGEgZnVsbC1mbGVkZ2VkIHVzZXIgdHJhY2tpbmcgc3lzdGVtLi4KKyAqLworc3RydWN0IHVzZXJf c3RydWN0IHsKKwlhdG9taWNfdCBfX2NvdW50OwkvKiByZWZlcmVuY2UgY291bnQgKi8KKwlhdG9t aWNfdCBwcm9jZXNzZXM7CS8qIEhvdyBtYW55IHByb2Nlc3NlcyBkb2VzIHRoaXMgdXNlciBoYXZl PyAqLworCWF0b21pY190IGZpbGVzOwkJLyogSG93IG1hbnkgb3BlbiBmaWxlcyBkb2VzIHRoaXMg dXNlciBoYXZlPyAqLworCWF0b21pY190IHNpZ3BlbmRpbmc7CS8qIEhvdyBtYW55IHBlbmRpbmcg c2lnbmFscyBkb2VzIHRoaXMgdXNlciBoYXZlPyAqLworI2lmZGVmIENPTkZJR19JTk9USUZZX1VT RVIKKwlhdG9taWNfdCBpbm90aWZ5X3dhdGNoZXM7IC8qIEhvdyBtYW55IGlub3RpZnkgd2F0Y2hl cyBkb2VzIHRoaXMgdXNlciBoYXZlPyAqLworCWF0b21pY190IGlub3RpZnlfZGV2czsJLyogSG93 IG1hbnkgaW5vdGlmeSBkZXZzIGRvZXMgdGhpcyB1c2VyIGhhdmUgb3BlbmVkPyAqLworI2VuZGlm CisjaWZkZWYgQ09ORklHX0ZBTk9USUZZCisJYXRvbWljX3QgZmFub3RpZnlfbGlzdGVuZXJzOwor I2VuZGlmCisjaWZkZWYgQ09ORklHX0VQT0xMCisJYXRvbWljX2xvbmdfdCBlcG9sbF93YXRjaGVz OyAvKiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY3VycmVudGx5IHdhdGNoZWQgKi8K KyNlbmRpZgorI2lmZGVmIENPTkZJR19QT1NJWF9NUVVFVUUKKwkvKiBwcm90ZWN0ZWQgYnkgbXFf bG9jawkqLworCXVuc2lnbmVkIGxvbmcgbXFfYnl0ZXM7CS8qIEhvdyBtYW55IGJ5dGVzIGNhbiBi ZSBhbGxvY2F0ZWQgdG8gbXF1ZXVlPyAqLworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBsb2NrZWRf c2htOyAvKiBIb3cgbWFueSBwYWdlcyBvZiBtbG9ja2VkIHNobSA/ICovCisKKyNpZmRlZiBDT05G SUdfS0VZUworCXN0cnVjdCBrZXkgKnVpZF9rZXlyaW5nOwkvKiBVSUQgc3BlY2lmaWMga2V5cmlu ZyAqLworCXN0cnVjdCBrZXkgKnNlc3Npb25fa2V5cmluZzsJLyogVUlEJ3MgZGVmYXVsdCBzZXNz aW9uIGtleXJpbmcgKi8KKyNlbmRpZgorCisJLyogSGFzaCB0YWJsZSBtYWludGVuYW5jZSBpbmZv cm1hdGlvbiAqLworCXN0cnVjdCBobGlzdF9ub2RlIHVpZGhhc2hfbm9kZTsKKwl1aWRfdCB1aWQ7 CisJc3RydWN0IHVzZXJfbmFtZXNwYWNlICp1c2VyX25zOworCisjaWZkZWYgQ09ORklHX1BFUkZf RVZFTlRTCisJYXRvbWljX2xvbmdfdCBsb2NrZWRfdm07CisjZW5kaWYKK307CisKK2V4dGVybiBp bnQgdWlkc19zeXNmc19pbml0KHZvaWQpOworCitleHRlcm4gc3RydWN0IHVzZXJfc3RydWN0ICpm aW5kX3VzZXIodWlkX3QpOworCitleHRlcm4gc3RydWN0IHVzZXJfc3RydWN0IHJvb3RfdXNlcjsK KyNkZWZpbmUgSU5JVF9VU0VSICgmcm9vdF91c2VyKQorCisKK3N0cnVjdCBiYWNraW5nX2Rldl9p bmZvOworc3RydWN0IHJlY2xhaW1fc3RhdGU7CisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRFNU QVRTKSB8fCBkZWZpbmVkKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpCitzdHJ1Y3Qgc2NoZWRfaW5m byB7CisJLyogY3VtdWxhdGl2ZSBjb3VudGVycyAqLworCXVuc2lnbmVkIGxvbmcgcGNvdW50Owkg ICAgICAvKiAjIG9mIHRpbWVzIHJ1biBvbiB0aGlzIGNwdSAqLworCXVuc2lnbmVkIGxvbmcgbG9u ZyBydW5fZGVsYXk7IC8qIHRpbWUgc3BlbnQgd2FpdGluZyBvbiBhIHJ1bnF1ZXVlICovCisKKwkv KiB0aW1lc3RhbXBzICovCisJdW5zaWduZWQgbG9uZyBsb25nIGxhc3RfYXJyaXZhbCwvKiB3aGVu IHdlIGxhc3QgcmFuIG9uIGEgY3B1ICovCisJCQkgICBsYXN0X3F1ZXVlZDsJLyogd2hlbiB3ZSB3 ZXJlIGxhc3QgcXVldWVkIHRvIHJ1biAqLworfTsKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19T Q0hFRFNUQVRTKSB8fCBkZWZpbmVkKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpICovCisKKyNpZmRl ZiBDT05GSUdfVEFTS19ERUxBWV9BQ0NUCitzdHJ1Y3QgdGFza19kZWxheV9pbmZvIHsKKwlzcGlu bG9ja190CWxvY2s7CisJdW5zaWduZWQgaW50CWZsYWdzOwkvKiBQcml2YXRlIHBlci10YXNrIGZs YWdzICovCisKKwkvKiBGb3IgZWFjaCBzdGF0IFhYWCwgYWRkIGZvbGxvd2luZywgYWxpZ25lZCBh cHByb3ByaWF0ZWx5CisJICoKKwkgKiBzdHJ1Y3QgdGltZXNwZWMgWFhYX3N0YXJ0LCBYWFhfZW5k OworCSAqIHU2NCBYWFhfZGVsYXk7CisJICogdTMyIFhYWF9jb3VudDsKKwkgKgorCSAqIEF0b21p Y2l0eSBvZiB1cGRhdGVzIHRvIFhYWF9kZWxheSwgWFhYX2NvdW50IHByb3RlY3RlZCBieQorCSAq IHNpbmdsZSBsb2NrIGFib3ZlIChzcGxpdCBpbnRvIFhYWF9sb2NrIGlmIGNvbnRlbnRpb24gaXMg YW4gaXNzdWUpLgorCSAqLworCisJLyoKKwkgKiBYWFhfY291bnQgaXMgaW5jcmVtZW50ZWQgb24g ZXZlcnkgWFhYIG9wZXJhdGlvbiwgdGhlIGRlbGF5CisJICogYXNzb2NpYXRlZCB3aXRoIHRoZSBv cGVyYXRpb24gaXMgYWRkZWQgdG8gWFhYX2RlbGF5LgorCSAqIFhYWF9kZWxheSBjb250YWlucyB0 aGUgYWNjdW11bGF0ZWQgZGVsYXkgdGltZSBpbiBuYW5vc2Vjb25kcy4KKwkgKi8KKwlzdHJ1Y3Qg dGltZXNwZWMgYmxraW9fc3RhcnQsIGJsa2lvX2VuZDsJLyogU2hhcmVkIGJ5IGJsa2lvLCBzd2Fw aW4gKi8KKwl1NjQgYmxraW9fZGVsYXk7CS8qIHdhaXQgZm9yIHN5bmMgYmxvY2sgaW8gY29tcGxl dGlvbiAqLworCXU2NCBzd2FwaW5fZGVsYXk7CS8qIHdhaXQgZm9yIHN3YXBpbiBibG9jayBpbyBj b21wbGV0aW9uICovCisJdTMyIGJsa2lvX2NvdW50OwkvKiB0b3RhbCBjb3VudCBvZiB0aGUgbnVt YmVyIG9mIHN5bmMgYmxvY2sgKi8KKwkJCQkvKiBpbyBvcGVyYXRpb25zIHBlcmZvcm1lZCAqLwor CXUzMiBzd2FwaW5fY291bnQ7CS8qIHRvdGFsIGNvdW50IG9mIHRoZSBudW1iZXIgb2Ygc3dhcGlu IGJsb2NrICovCisJCQkJLyogaW8gb3BlcmF0aW9ucyBwZXJmb3JtZWQgKi8KKworCXN0cnVjdCB0 aW1lc3BlYyBmcmVlcGFnZXNfc3RhcnQsIGZyZWVwYWdlc19lbmQ7CisJdTY0IGZyZWVwYWdlc19k ZWxheTsJLyogd2FpdCBmb3IgbWVtb3J5IHJlY2xhaW0gKi8KKwl1MzIgZnJlZXBhZ2VzX2NvdW50 OwkvKiB0b3RhbCBjb3VudCBvZiBtZW1vcnkgcmVjbGFpbSAqLworfTsKKyNlbmRpZgkvKiBDT05G SUdfVEFTS19ERUxBWV9BQ0NUICovCisKK3N0YXRpYyBpbmxpbmUgaW50IHNjaGVkX2luZm9fb24o dm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCXJldHVybiAxOworI2VsaWYgZGVm aW5lZChDT05GSUdfVEFTS19ERUxBWV9BQ0NUKQorCWV4dGVybiBpbnQgZGVsYXlhY2N0X29uOwor CXJldHVybiBkZWxheWFjY3Rfb247CisjZWxzZQorCXJldHVybiAwOworI2VuZGlmCit9CisKK2Vu dW0gY3B1X2lkbGVfdHlwZSB7CisJQ1BVX0lETEUsCisJQ1BVX05PVF9JRExFLAorCUNQVV9ORVdM WV9JRExFLAorCUNQVV9NQVhfSURMRV9UWVBFUworfTsKKworLyoKKyAqIEluY3JlYXNlIHJlc29s dXRpb24gb2YgbmljZS1sZXZlbCBjYWxjdWxhdGlvbnMgZm9yIDY0LWJpdCBhcmNoaXRlY3R1cmVz LgorICogVGhlIGV4dHJhIHJlc29sdXRpb24gaW1wcm92ZXMgc2hhcmVzIGRpc3RyaWJ1dGlvbiBh bmQgbG9hZCBiYWxhbmNpbmcgb2YKKyAqIGxvdy13ZWlnaHQgdGFzayBncm91cHMgKGVnLiBuaWNl ICsxOSBvbiBhbiBhdXRvZ3JvdXApLCBkZWVwZXIgdGFza2dyb3VwCisgKiBoaWVyYXJjaGllcywg ZXNwZWNpYWxseSBvbiBsYXJnZXIgc3lzdGVtcy4gVGhpcyBpcyBub3QgYSB1c2VyLXZpc2libGUg Y2hhbmdlCisgKiBhbmQgZG9lcyBub3QgY2hhbmdlIHRoZSB1c2VyLWludGVyZmFjZSBmb3Igc2V0 dGluZyBzaGFyZXMvd2VpZ2h0cy4KKyAqCisgKiBXZSBpbmNyZWFzZSByZXNvbHV0aW9uIG9ubHkg aWYgd2UgaGF2ZSBlbm91Z2ggYml0cyB0byBhbGxvdyB0aGlzIGluY3JlYXNlZAorICogcmVzb2x1 dGlvbiAoaS5lLiBCSVRTX1BFUl9MT05HID4gMzIpLiBUaGUgY29zdHMgZm9yIGluY3JlYXNpbmcg cmVzb2x1dGlvbgorICogd2hlbiBCSVRTX1BFUl9MT05HIDw9IDMyIGFyZSBwcmV0dHkgaGlnaCBh bmQgdGhlIHJldHVybnMgZG8gbm90IGp1c3RpZnkgdGhlCisgKiBpbmNyZWFzZWQgY29zdHMuCisg Ki8KKyNpZiAwIC8qIEJJVFNfUEVSX0xPTkcgPiAzMiAtLSBjdXJyZW50bHkgYnJva2VuOiBpdCBp bmNyZWFzZXMgcG93ZXIgdXNhZ2UgdW5kZXIgbGlnaHQgbG9hZCAgKi8KKyMgZGVmaW5lIFNDSEVE X0xPQURfUkVTT0xVVElPTgkxMAorIyBkZWZpbmUgc2NhbGVfbG9hZCh3KQkJKCh3KSA8PCBTQ0hF RF9MT0FEX1JFU09MVVRJT04pCisjIGRlZmluZSBzY2FsZV9sb2FkX2Rvd24odykJKCh3KSA+PiBT Q0hFRF9MT0FEX1JFU09MVVRJT04pCisjZWxzZQorIyBkZWZpbmUgU0NIRURfTE9BRF9SRVNPTFVU SU9OCTAKKyMgZGVmaW5lIHNjYWxlX2xvYWQodykJCSh3KQorIyBkZWZpbmUgc2NhbGVfbG9hZF9k b3duKHcpCSh3KQorI2VuZGlmCisKKyNkZWZpbmUgU0NIRURfTE9BRF9TSElGVAkoMTAgKyBTQ0hF RF9MT0FEX1JFU09MVVRJT04pCisjZGVmaW5lIFNDSEVEX0xPQURfU0NBTEUJKDFMIDw8IFNDSEVE X0xPQURfU0hJRlQpCisKKy8qCisgKiBJbmNyZWFzZSByZXNvbHV0aW9uIG9mIGNwdV9wb3dlciBj YWxjdWxhdGlvbnMKKyAqLworI2RlZmluZSBTQ0hFRF9QT1dFUl9TSElGVAkxMAorI2RlZmluZSBT Q0hFRF9QT1dFUl9TQ0FMRQkoMUwgPDwgU0NIRURfUE9XRVJfU0hJRlQpCisKKy8qCisgKiBzY2hl ZC1kb21haW5zIChtdWx0aXByb2Nlc3NvciBiYWxhbmNpbmcpIGRlY2xhcmF0aW9uczoKKyAqLwor I2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUgU0RfTE9BRF9CQUxBTkNFCQkweDAwMDEJLyogRG8g bG9hZCBiYWxhbmNpbmcgb24gdGhpcyBkb21haW4uICovCisjZGVmaW5lIFNEX0JBTEFOQ0VfTkVX SURMRQkweDAwMDIJLyogQmFsYW5jZSB3aGVuIGFib3V0IHRvIGJlY29tZSBpZGxlICovCisjZGVm aW5lIFNEX0JBTEFOQ0VfRVhFQwkJMHgwMDA0CS8qIEJhbGFuY2Ugb24gZXhlYyAqLworI2RlZmlu ZSBTRF9CQUxBTkNFX0ZPUksJCTB4MDAwOAkvKiBCYWxhbmNlIG9uIGZvcmssIGNsb25lICovCisj ZGVmaW5lIFNEX0JBTEFOQ0VfV0FLRQkJMHgwMDEwICAvKiBCYWxhbmNlIG9uIHdha2V1cCAqLwor I2RlZmluZSBTRF9XQUtFX0FGRklORQkJMHgwMDIwCS8qIFdha2UgdGFzayB0byB3YWtpbmcgQ1BV ICovCisjZGVmaW5lIFNEX1BSRUZFUl9MT0NBTAkJMHgwMDQwICAvKiBQcmVmZXIgdG8ga2VlcCB0 YXNrcyBsb2NhbCB0byB0aGlzIGRvbWFpbiAqLworI2RlZmluZSBTRF9TSEFSRV9DUFVQT1dFUgkw eDAwODAJLyogRG9tYWluIG1lbWJlcnMgc2hhcmUgY3B1IHBvd2VyICovCisjZGVmaW5lIFNEX1BP V0VSU0FWSU5HU19CQUxBTkNFCTB4MDEwMAkvKiBCYWxhbmNlIGZvciBwb3dlciBzYXZpbmdzICov CisjZGVmaW5lIFNEX1NIQVJFX1BLR19SRVNPVVJDRVMJMHgwMjAwCS8qIERvbWFpbiBtZW1iZXJz IHNoYXJlIGNwdSBwa2cgcmVzb3VyY2VzICovCisjZGVmaW5lIFNEX1NFUklBTElaRQkJMHgwNDAw CS8qIE9ubHkgYSBzaW5nbGUgbG9hZCBiYWxhbmNpbmcgaW5zdGFuY2UgKi8KKyNkZWZpbmUgU0Rf QVNZTV9QQUNLSU5HCQkweDA4MDAgIC8qIFBsYWNlIGJ1c3kgZ3JvdXBzIGVhcmxpZXIgaW4gdGhl IGRvbWFpbiAqLworI2RlZmluZSBTRF9QUkVGRVJfU0lCTElORwkweDEwMDAJLyogUHJlZmVyIHRv IHBsYWNlIHRhc2tzIGluIGEgc2libGluZyBkb21haW4gKi8KKyNkZWZpbmUgU0RfT1ZFUkxBUAkJ MHgyMDAwCS8qIHNjaGVkX2RvbWFpbnMgb2YgdGhpcyBsZXZlbCBvdmVybGFwICovCisKK2VudW0g cG93ZXJzYXZpbmdzX2JhbGFuY2VfbGV2ZWwgeworCVBPV0VSU0FWSU5HU19CQUxBTkNFX05PTkUg PSAwLCAgLyogTm8gcG93ZXIgc2F2aW5nIGxvYWQgYmFsYW5jZSAqLworCVBPV0VSU0FWSU5HU19C QUxBTkNFX0JBU0lDLAkvKiBGaWxsIG9uZSB0aHJlYWQvY29yZS9wYWNrYWdlCisJCQkJCSAqIGZp cnN0IGZvciBsb25nIHJ1bm5pbmcgdGhyZWFkcworCQkJCQkgKi8KKwlQT1dFUlNBVklOR1NfQkFM QU5DRV9XQUtFVVAsCS8qIEFsc28gYmlhcyB0YXNrIHdha2V1cHMgdG8gc2VtaS1pZGxlCisJCQkJ CSAqIGNwdSBwYWNrYWdlIGZvciBwb3dlciBzYXZpbmdzCisJCQkJCSAqLworCU1BWF9QT1dFUlNB VklOR1NfQkFMQU5DRV9MRVZFTFMKK307CisKK2V4dGVybiBpbnQgc2NoZWRfbWNfcG93ZXJfc2F2 aW5ncywgc2NoZWRfc210X3Bvd2VyX3NhdmluZ3M7CisKK3N0YXRpYyBpbmxpbmUgaW50IHNkX2Jh bGFuY2VfZm9yX21jX3Bvd2VyKHZvaWQpCit7CisJaWYgKHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdz KQorCQlyZXR1cm4gU0RfUE9XRVJTQVZJTkdTX0JBTEFOQ0U7CisKKwlpZiAoIXNjaGVkX21jX3Bv d2VyX3NhdmluZ3MpCisJCXJldHVybiBTRF9QUkVGRVJfU0lCTElORzsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgaW5saW5lIGludCBzZF9iYWxhbmNlX2Zvcl9wYWNrYWdlX3Bvd2VyKHZvaWQp Cit7CisJaWYgKHNjaGVkX21jX3Bvd2VyX3NhdmluZ3MgfCBzY2hlZF9zbXRfcG93ZXJfc2F2aW5n cykKKwkJcmV0dXJuIFNEX1BPV0VSU0FWSU5HU19CQUxBTkNFOworCisJcmV0dXJuIFNEX1BSRUZF Ul9TSUJMSU5HOworfQorCitleHRlcm4gaW50IF9fd2VhayBhcmNoX3NkX3NpYmlsaW5nX2FzeW1f cGFja2luZyh2b2lkKTsKKworLyoKKyAqIE9wdGltaXNlIFNEIGZsYWdzIGZvciBwb3dlciBzYXZp bmdzOgorICogU0RfQkFMQU5DRV9ORVdJRExFIGhlbHBzIGFnZ3Jlc3NpdmUgdGFzayBjb25zb2xp ZGF0aW9uIGFuZCBwb3dlciBzYXZpbmdzLgorICogS2VlcCBkZWZhdWx0IFNEIGZsYWdzIGlmIHNj aGVkX3tzbXQsbWN9X3Bvd2VyX3NhdmluZz0wCisgKi8KKworc3RhdGljIGlubGluZSBpbnQgc2Rf cG93ZXJfc2F2aW5nX2ZsYWdzKHZvaWQpCit7CisJaWYgKHNjaGVkX21jX3Bvd2VyX3NhdmluZ3Mg fCBzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncykKKwkJcmV0dXJuIFNEX0JBTEFOQ0VfTkVXSURMRTsK KworCXJldHVybiAwOworfQorCitzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93ZXIgeworCWF0b21pY190 IHJlZjsKKwkvKgorCSAqIENQVSBwb3dlciBvZiB0aGlzIGdyb3VwLCBTQ0hFRF9MT0FEX1NDQUxF IGJlaW5nIG1heCBwb3dlciBmb3IgYQorCSAqIHNpbmdsZSBDUFUuCisJICovCisJdW5zaWduZWQg aW50IHBvd2VyLCBwb3dlcl9vcmlnOworCXVuc2lnbmVkIGxvbmcgbmV4dF91cGRhdGU7CisJLyoK KwkgKiBOdW1iZXIgb2YgYnVzeSBjcHVzIGluIHRoaXMgZ3JvdXAuCisJICovCisJYXRvbWljX3Qg bnJfYnVzeV9jcHVzOworfTsKKworc3RydWN0IHNjaGVkX2dyb3VwIHsKKwlzdHJ1Y3Qgc2NoZWRf Z3JvdXAgKm5leHQ7CS8qIE11c3QgYmUgYSBjaXJjdWxhciBsaXN0ICovCisJYXRvbWljX3QgcmVm OworCisJdW5zaWduZWQgaW50IGdyb3VwX3dlaWdodDsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXBfcG93 ZXIgKnNncDsKKworCS8qCisJICogVGhlIENQVXMgdGhpcyBncm91cCBjb3ZlcnMuCisJICoKKwkg KiBOT1RFOiB0aGlzIGZpZWxkIGlzIHZhcmlhYmxlIGxlbmd0aC4gKEFsbG9jYXRlZCBkeW5hbWlj YWxseQorCSAqIGJ5IGF0dGFjaGluZyBleHRyYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBzdHJ1 Y3R1cmUsCisJICogZGVwZW5kaW5nIG9uIGhvdyBtYW55IENQVXMgdGhlIGtlcm5lbCBoYXMgYm9v dGVkIHVwIHdpdGgpCisJICovCisJdW5zaWduZWQgbG9uZyBjcHVtYXNrWzBdOworfTsKKworc3Rh dGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqc2NoZWRfZ3JvdXBfY3B1cyhzdHJ1Y3Qgc2NoZWRf Z3JvdXAgKnNnKQoreworCXJldHVybiB0b19jcHVtYXNrKHNnLT5jcHVtYXNrKTsKK30KKworLyoq CisgKiBncm91cF9maXJzdF9jcHUgLSBSZXR1cm5zIHRoZSBmaXJzdCBjcHUgaW4gdGhlIGNwdW1h c2sgb2YgYSBzY2hlZF9ncm91cC4KKyAqIEBncm91cDogVGhlIGdyb3VwIHdob3NlIGZpcnN0IGNw dSBpcyB0byBiZSByZXR1cm5lZC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ3Jv dXBfZmlyc3RfY3B1KHN0cnVjdCBzY2hlZF9ncm91cCAqZ3JvdXApCit7CisJcmV0dXJuIGNwdW1h c2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpOworfQorCitzdHJ1Y3Qgc2NoZWRfZG9t YWluX2F0dHIgeworCWludCByZWxheF9kb21haW5fbGV2ZWw7Cit9OworCisjZGVmaW5lIFNEX0FU VFJfSU5JVAkoc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyKSB7CVwKKwkucmVsYXhfZG9tYWluX2xl dmVsID0gLTEsCQkJXAorfQorCitleHRlcm4gaW50IHNjaGVkX2RvbWFpbl9sZXZlbF9tYXg7CisK K3N0cnVjdCBzY2hlZF9kb21haW4geworCS8qIFRoZXNlIGZpZWxkcyBtdXN0IGJlIHNldHVwICov CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqcGFyZW50OwkvKiB0b3AgZG9tYWluIG11c3QgYmUgbnVs bCB0ZXJtaW5hdGVkICovCisJc3RydWN0IHNjaGVkX2RvbWFpbiAqY2hpbGQ7CS8qIGJvdHRvbSBk b21haW4gbXVzdCBiZSBudWxsIHRlcm1pbmF0ZWQgKi8KKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmdy b3VwczsJLyogdGhlIGJhbGFuY2luZyBncm91cHMgb2YgdGhlIGRvbWFpbiAqLworCXVuc2lnbmVk IGxvbmcgbWluX2ludGVydmFsOwkvKiBNaW5pbXVtIGJhbGFuY2UgaW50ZXJ2YWwgbXMgKi8KKwl1 bnNpZ25lZCBsb25nIG1heF9pbnRlcnZhbDsJLyogTWF4aW11bSBiYWxhbmNlIGludGVydmFsIG1z ICovCisJdW5zaWduZWQgaW50IGJ1c3lfZmFjdG9yOwkvKiBsZXNzIGJhbGFuY2luZyBieSBmYWN0 b3IgaWYgYnVzeSAqLworCXVuc2lnbmVkIGludCBpbWJhbGFuY2VfcGN0OwkvKiBObyBiYWxhbmNl IHVudGlsIG92ZXIgd2F0ZXJtYXJrICovCisJdW5zaWduZWQgaW50IGNhY2hlX25pY2VfdHJpZXM7 CS8qIExlYXZlIGNhY2hlIGhvdCB0YXNrcyBmb3IgIyB0cmllcyAqLworCXVuc2lnbmVkIGludCBi dXN5X2lkeDsKKwl1bnNpZ25lZCBpbnQgaWRsZV9pZHg7CisJdW5zaWduZWQgaW50IG5ld2lkbGVf aWR4OworCXVuc2lnbmVkIGludCB3YWtlX2lkeDsKKwl1bnNpZ25lZCBpbnQgZm9ya2V4ZWNfaWR4 OworCXVuc2lnbmVkIGludCBzbXRfZ2FpbjsKKwlpbnQgZmxhZ3M7CQkJLyogU2VlIFNEXyogKi8K KwlpbnQgbGV2ZWw7CisKKwkvKiBSdW50aW1lIGZpZWxkcy4gKi8KKwl1bnNpZ25lZCBsb25nIGxh c3RfYmFsYW5jZTsJLyogaW5pdCB0byBqaWZmaWVzLiB1bml0cyBpbiBqaWZmaWVzICovCisJdW5z aWduZWQgaW50IGJhbGFuY2VfaW50ZXJ2YWw7CS8qIGluaXRpYWxpc2UgdG8gMS4gdW5pdHMgaW4g bXMuICovCisJdW5zaWduZWQgaW50IG5yX2JhbGFuY2VfZmFpbGVkOyAvKiBpbml0aWFsaXNlIHRv IDAgKi8KKworCXU2NCBsYXN0X3VwZGF0ZTsKKworI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCisJ LyogbG9hZF9iYWxhbmNlKCkgc3RhdHMgKi8KKwl1bnNpZ25lZCBpbnQgbGJfY291bnRbQ1BVX01B WF9JRExFX1RZUEVTXTsKKwl1bnNpZ25lZCBpbnQgbGJfZmFpbGVkW0NQVV9NQVhfSURMRV9UWVBF U107CisJdW5zaWduZWQgaW50IGxiX2JhbGFuY2VkW0NQVV9NQVhfSURMRV9UWVBFU107CisJdW5z aWduZWQgaW50IGxiX2ltYmFsYW5jZVtDUFVfTUFYX0lETEVfVFlQRVNdOworCXVuc2lnbmVkIGlu dCBsYl9nYWluZWRbQ1BVX01BWF9JRExFX1RZUEVTXTsKKwl1bnNpZ25lZCBpbnQgbGJfaG90X2dh aW5lZFtDUFVfTUFYX0lETEVfVFlQRVNdOworCXVuc2lnbmVkIGludCBsYl9ub2J1c3lnW0NQVV9N QVhfSURMRV9UWVBFU107CisJdW5zaWduZWQgaW50IGxiX25vYnVzeXFbQ1BVX01BWF9JRExFX1RZ UEVTXTsKKworCS8qIEFjdGl2ZSBsb2FkIGJhbGFuY2luZyAqLworCXVuc2lnbmVkIGludCBhbGJf Y291bnQ7CisJdW5zaWduZWQgaW50IGFsYl9mYWlsZWQ7CisJdW5zaWduZWQgaW50IGFsYl9wdXNo ZWQ7CisKKwkvKiBTRF9CQUxBTkNFX0VYRUMgc3RhdHMgKi8KKwl1bnNpZ25lZCBpbnQgc2JlX2Nv dW50OworCXVuc2lnbmVkIGludCBzYmVfYmFsYW5jZWQ7CisJdW5zaWduZWQgaW50IHNiZV9wdXNo ZWQ7CisKKwkvKiBTRF9CQUxBTkNFX0ZPUksgc3RhdHMgKi8KKwl1bnNpZ25lZCBpbnQgc2JmX2Nv dW50OworCXVuc2lnbmVkIGludCBzYmZfYmFsYW5jZWQ7CisJdW5zaWduZWQgaW50IHNiZl9wdXNo ZWQ7CisKKwkvKiB0cnlfdG9fd2FrZV91cCgpIHN0YXRzICovCisJdW5zaWduZWQgaW50IHR0d3Vf d2FrZV9yZW1vdGU7CisJdW5zaWduZWQgaW50IHR0d3VfbW92ZV9hZmZpbmU7CisJdW5zaWduZWQg aW50IHR0d3VfbW92ZV9iYWxhbmNlOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVH CisJY2hhciAqbmFtZTsKKyNlbmRpZgorCXVuaW9uIHsKKwkJdm9pZCAqcHJpdmF0ZTsJCS8qIHVz ZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiAqLworCQlzdHJ1Y3QgcmN1X2hlYWQgcmN1OwkvKiB1c2Vk IGR1cmluZyBkZXN0cnVjdGlvbiAqLworCX07CisKKwl1bnNpZ25lZCBpbnQgc3Bhbl93ZWlnaHQ7 CisJLyoKKwkgKiBTcGFuIG9mIGFsbCBDUFVzIGluIHRoaXMgZG9tYWluLgorCSAqCisJICogTk9U RTogdGhpcyBmaWVsZCBpcyB2YXJpYWJsZSBsZW5ndGguIChBbGxvY2F0ZWQgZHluYW1pY2FsbHkK KwkgKiBieSBhdHRhY2hpbmcgZXh0cmEgc3BhY2UgdG8gdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJl LAorCSAqIGRlcGVuZGluZyBvbiBob3cgbWFueSBDUFVzIHRoZSBrZXJuZWwgaGFzIGJvb3RlZCB1 cCB3aXRoKQorCSAqLworCXVuc2lnbmVkIGxvbmcgc3BhblswXTsKK307CisKK3N0YXRpYyBpbmxp bmUgc3RydWN0IGNwdW1hc2sgKnNjaGVkX2RvbWFpbl9zcGFuKHN0cnVjdCBzY2hlZF9kb21haW4g KnNkKQoreworCXJldHVybiB0b19jcHVtYXNrKHNkLT5zcGFuKTsKK30KKworZXh0ZXJuIHZvaWQg cGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoaW50IG5kb21zX25ldywgY3B1bWFza192YXJfdCBkb21z X25ld1tdLAorCQkJCSAgICBzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmRhdHRyX25ldyk7CisK Ky8qIEFsbG9jYXRlIGFuIGFycmF5IG9mIHNjaGVkIGRvbWFpbnMsIGZvciBwYXJ0aXRpb25fc2No ZWRfZG9tYWlucygpLiAqLworY3B1bWFza192YXJfdCAqYWxsb2Nfc2NoZWRfZG9tYWlucyh1bnNp Z25lZCBpbnQgbmRvbXMpOwordm9pZCBmcmVlX3NjaGVkX2RvbWFpbnMoY3B1bWFza192YXJfdCBk b21zW10sIHVuc2lnbmVkIGludCBuZG9tcyk7CisKKy8qIFRlc3QgYSBmbGFnIGluIHBhcmVudCBz Y2hlZCBkb21haW4gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRlc3Rfc2RfcGFyZW50KHN0cnVjdCBz Y2hlZF9kb21haW4gKnNkLCBpbnQgZmxhZykKK3sKKwlpZiAoc2QtPnBhcmVudCAmJiAoc2QtPnBh cmVudC0+ZmxhZ3MgJiBmbGFnKSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKwordW5z aWduZWQgbG9uZyBkZWZhdWx0X3NjYWxlX2ZyZXFfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAq c2QsIGludCBjcHUpOwordW5zaWduZWQgbG9uZyBkZWZhdWx0X3NjYWxlX3NtdF9wb3dlcihzdHJ1 Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSk7CisKK2Jvb2wgY3B1c19zaGFyZV9jYWNoZShp bnQgdGhpc19jcHUsIGludCB0aGF0X2NwdSk7CisKKyNlbHNlIC8qIENPTkZJR19TTVAgKi8KKwor c3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3BhcnRpdGlv bl9zY2hlZF9kb21haW5zKGludCBuZG9tc19uZXcsIGNwdW1hc2tfdmFyX3QgZG9tc19uZXdbXSwK KwkJCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHJfbmV3KQoreworfQorCitzdGF0aWMg aW5saW5lIGJvb2wgY3B1c19zaGFyZV9jYWNoZShpbnQgdGhpc19jcHUsIGludCB0aGF0X2NwdSkK K3sKKwlyZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmCS8qICFDT05GSUdfU01QICovCisKKworc3Ry dWN0IGlvX2NvbnRleHQ7CQkJLyogU2VlIGJsa2Rldi5oICovCisKKworI2lmZGVmIEFSQ0hfSEFT X1BSRUZFVENIX1NXSVRDSF9TVEFDSworZXh0ZXJuIHZvaWQgcHJlZmV0Y2hfc3RhY2soc3RydWN0 IHRhc2tfc3RydWN0ICp0KTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlZmV0Y2hfc3Rh Y2soc3RydWN0IHRhc2tfc3RydWN0ICp0KSB7IH0KKyNlbmRpZgorCitzdHJ1Y3QgYXVkaXRfY29u dGV4dDsJCS8qIFNlZSBhdWRpdC5jICovCitzdHJ1Y3QgbWVtcG9saWN5Oworc3RydWN0IHBpcGVf aW5vZGVfaW5mbzsKK3N0cnVjdCB1dHNfbmFtZXNwYWNlOworCitzdHJ1Y3QgcnE7CitzdHJ1Y3Qg c2NoZWRfZG9tYWluOworCisvKgorICogd2FrZSBmbGFncworICovCisjZGVmaW5lIFdGX1NZTkMJ CTB4MDEJCS8qIHdha2VyIGdvZXMgdG8gc2xlZXAgYWZ0ZXIgd2FrdXAgKi8KKyNkZWZpbmUgV0Zf Rk9SSwkJMHgwMgkJLyogY2hpbGQgd2FrZXVwIGFmdGVyIGZvcmsgKi8KKyNkZWZpbmUgV0ZfTUlH UkFURUQJMHgwNAkJLyogaW50ZXJuYWwgdXNlLCB0YXNrIGdvdCBtaWdyYXRlZCAqLworCisjZGVm aW5lIEVOUVVFVUVfV0FLRVVQCQkxCisjZGVmaW5lIEVOUVVFVUVfSEVBRAkJMgorI2lmZGVmIENP TkZJR19TTVAKKyNkZWZpbmUgRU5RVUVVRV9XQUtJTkcJCTQJLyogc2NoZWRfY2xhc3M6OnRhc2tf d2FraW5nIHdhcyBjYWxsZWQgKi8KKyNlbHNlCisjZGVmaW5lIEVOUVVFVUVfV0FLSU5HCQkwCisj ZW5kaWYKKworI2RlZmluZSBERVFVRVVFX1NMRUVQCQkxCisKK3N0cnVjdCBzY2hlZF9jbGFzcyB7 CisJY29uc3Qgc3RydWN0IHNjaGVkX2NsYXNzICpuZXh0OworCisJdm9pZCAoKmVucXVldWVfdGFz aykgKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGZsYWdzKTsKKwl2 b2lkICgqZGVxdWV1ZV90YXNrKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpw LCBpbnQgZmxhZ3MpOworCXZvaWQgKCp5aWVsZF90YXNrKSAoc3RydWN0IHJxICpycSk7CisJYm9v bCAoKnlpZWxkX3RvX3Rhc2spIChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAs IGJvb2wgcHJlZW1wdCk7CisKKwl2b2lkICgqY2hlY2tfcHJlZW1wdF9jdXJyKSAoc3RydWN0IHJx ICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgZmxhZ3MpOworCisJc3RydWN0IHRhc2tf c3RydWN0ICogKCpwaWNrX25leHRfdGFzaykgKHN0cnVjdCBycSAqcnEpOworCXZvaWQgKCpwdXRf cHJldl90YXNrKSAoc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKKworI2lm ZGVmIENPTkZJR19TTVAKKwlpbnQgICgqc2VsZWN0X3Rhc2tfcnEpKHN0cnVjdCB0YXNrX3N0cnVj dCAqcCwgaW50IHNkX2ZsYWcsIGludCBmbGFncyk7CisKKwl2b2lkICgqcHJlX3NjaGVkdWxlKSAo c3RydWN0IHJxICp0aGlzX3JxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCXZvaWQgKCpw b3N0X3NjaGVkdWxlKSAoc3RydWN0IHJxICp0aGlzX3JxKTsKKwl2b2lkICgqdGFza193YWtpbmcp IChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCXZvaWQgKCp0YXNrX3dva2VuKSAoc3RydWN0 IHJxICp0aGlzX3JxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOworCisJdm9pZCAoKnNldF9j cHVzX2FsbG93ZWQpKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQkgY29uc3Qgc3RydWN0IGNw dW1hc2sgKm5ld21hc2spOworCisJdm9pZCAoKnJxX29ubGluZSkoc3RydWN0IHJxICpycSk7CisJ dm9pZCAoKnJxX29mZmxpbmUpKHN0cnVjdCBycSAqcnEpOworI2VuZGlmCisKKwl2b2lkICgqc2V0 X2N1cnJfdGFzaykgKHN0cnVjdCBycSAqcnEpOworCXZvaWQgKCp0YXNrX3RpY2spIChzdHJ1Y3Qg cnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBxdWV1ZWQpOworCXZvaWQgKCp0YXNr X2ZvcmspIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCisJdm9pZCAoKnN3aXRjaGVkX2Zyb20p IChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CisJdm9pZCAo KnN3aXRjaGVkX3RvKSAoc3RydWN0IHJxICp0aGlzX3JxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRh c2spOworCXZvaWQgKCpwcmlvX2NoYW5nZWQpIChzdHJ1Y3QgcnEgKnRoaXNfcnEsIHN0cnVjdCB0 YXNrX3N0cnVjdCAqdGFzaywKKwkJCSAgICAgaW50IG9sZHByaW8pOworCisJdW5zaWduZWQgaW50 ICgqZ2V0X3JyX2ludGVydmFsKSAoc3RydWN0IHJxICpycSwKKwkJCQkJIHN0cnVjdCB0YXNrX3N0 cnVjdCAqdGFzayk7CisKKyNpZmRlZiBDT05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorCXZvaWQgKCp0 YXNrX21vdmVfZ3JvdXApIChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBvbl9ycSk7CisjZW5k aWYKK307CisKK3N0cnVjdCBsb2FkX3dlaWdodCB7CisJdW5zaWduZWQgbG9uZyB3ZWlnaHQsIGlu dl93ZWlnaHQ7Cit9OworCisjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKK3N0cnVjdCBzY2hlZF9z dGF0aXN0aWNzIHsKKwl1NjQJCQl3YWl0X3N0YXJ0OworCXU2NAkJCXdhaXRfbWF4OworCXU2NAkJ CXdhaXRfY291bnQ7CisJdTY0CQkJd2FpdF9zdW07CisJdTY0CQkJaW93YWl0X2NvdW50OworCXU2 NAkJCWlvd2FpdF9zdW07CisKKwl1NjQJCQlzbGVlcF9zdGFydDsKKwl1NjQJCQlzbGVlcF9tYXg7 CisJczY0CQkJc3VtX3NsZWVwX3J1bnRpbWU7CisKKwl1NjQJCQlibG9ja19zdGFydDsKKwl1NjQJ CQlibG9ja19tYXg7CisJdTY0CQkJZXhlY19tYXg7CisJdTY0CQkJc2xpY2VfbWF4OworCisJdTY0 CQkJbnJfbWlncmF0aW9uc19jb2xkOworCXU2NAkJCW5yX2ZhaWxlZF9taWdyYXRpb25zX2FmZmlu ZTsKKwl1NjQJCQlucl9mYWlsZWRfbWlncmF0aW9uc19ydW5uaW5nOworCXU2NAkJCW5yX2ZhaWxl ZF9taWdyYXRpb25zX2hvdDsKKwl1NjQJCQlucl9mb3JjZWRfbWlncmF0aW9uczsKKworCXU2NAkJ CW5yX3dha2V1cHM7CisJdTY0CQkJbnJfd2FrZXVwc19zeW5jOworCXU2NAkJCW5yX3dha2V1cHNf bWlncmF0ZTsKKwl1NjQJCQlucl93YWtldXBzX2xvY2FsOworCXU2NAkJCW5yX3dha2V1cHNfcmVt b3RlOworCXU2NAkJCW5yX3dha2V1cHNfYWZmaW5lOworCXU2NAkJCW5yX3dha2V1cHNfYWZmaW5l X2F0dGVtcHRzOworCXU2NAkJCW5yX3dha2V1cHNfcGFzc2l2ZTsKKwl1NjQJCQlucl93YWtldXBz X2lkbGU7Cit9OworI2VuZGlmCisKK3N0cnVjdCBzY2hlZF9lbnRpdHkgeworCXN0cnVjdCBsb2Fk X3dlaWdodAlsb2FkOwkJLyogZm9yIGxvYWQtYmFsYW5jaW5nICovCisJc3RydWN0IHJiX25vZGUJ CXJ1bl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJZ3JvdXBfbm9kZTsKKwl1bnNpZ25lZCBpbnQJ CW9uX3JxOworCisJdTY0CQkJZXhlY19zdGFydDsKKwl1NjQJCQlzdW1fZXhlY19ydW50aW1lOwor CXU2NAkJCXZydW50aW1lOworCXU2NAkJCXByZXZfc3VtX2V4ZWNfcnVudGltZTsKKworCXU2NAkJ CW5yX21pZ3JhdGlvbnM7CisKKyNpZmRlZiBDT05GSUdfU0NIRURTVEFUUworCXN0cnVjdCBzY2hl ZF9zdGF0aXN0aWNzIHN0YXRpc3RpY3M7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19GQUlSX0dS T1VQX1NDSEVECisJc3RydWN0IHNjaGVkX2VudGl0eQkqcGFyZW50OworCS8qIHJxIG9uIHdoaWNo IHRoaXMgZW50aXR5IGlzICh0byBiZSkgcXVldWVkOiAqLworCXN0cnVjdCBjZnNfcnEJCSpjZnNf cnE7CisJLyogcnEgIm93bmVkIiBieSB0aGlzIGVudGl0eS9ncm91cDogKi8KKwlzdHJ1Y3QgY2Zz X3JxCQkqbXlfcTsKKyNlbmRpZgorfTsKKworc3RydWN0IHNjaGVkX3J0X2VudGl0eSB7CisJc3Ry dWN0IGxpc3RfaGVhZCBydW5fbGlzdDsKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQ7CisJdW5zaWdu ZWQgaW50IHRpbWVfc2xpY2U7CisJaW50IG5yX2NwdXNfYWxsb3dlZDsKKworCXN0cnVjdCBzY2hl ZF9ydF9lbnRpdHkgKmJhY2s7CisjaWZkZWYgQ09ORklHX1JUX0dST1VQX1NDSEVECisJc3RydWN0 IHNjaGVkX3J0X2VudGl0eQkqcGFyZW50OworCS8qIHJxIG9uIHdoaWNoIHRoaXMgZW50aXR5IGlz ICh0byBiZSkgcXVldWVkOiAqLworCXN0cnVjdCBydF9ycQkJKnJ0X3JxOworCS8qIHJxICJvd25l ZCIgYnkgdGhpcyBlbnRpdHkvZ3JvdXA6ICovCisJc3RydWN0IHJ0X3JxCQkqbXlfcTsKKyNlbmRp ZgorfTsKKworLyoKKyAqIGRlZmF1bHQgdGltZXNsaWNlIGlzIDEwMCBtc2VjcyAodXNlZCBvbmx5 IGZvciBTQ0hFRF9SUiB0YXNrcykuCisgKiBUaW1lc2xpY2VzIGdldCByZWZpbGxlZCBhZnRlciB0 aGV5IGV4cGlyZS4KKyAqLworI2RlZmluZSBSUl9USU1FU0xJQ0UJCSgxMDAgKiBIWiAvIDEwMDAp CisKK3N0cnVjdCByY3Vfbm9kZTsKKworZW51bSBwZXJmX2V2ZW50X3Rhc2tfY29udGV4dCB7CisJ cGVyZl9pbnZhbGlkX2NvbnRleHQgPSAtMSwKKwlwZXJmX2h3X2NvbnRleHQgPSAwLAorCXBlcmZf c3dfY29udGV4dCwKKwlwZXJmX25yX3Rhc2tfY29udGV4dHMsCit9OworCitzdHJ1Y3QgdGFza19z dHJ1Y3QgeworCXZvbGF0aWxlIGxvbmcgc3RhdGU7CS8qIC0xIHVucnVubmFibGUsIDAgcnVubmFi bGUsID4wIHN0b3BwZWQgKi8KKwl2b2lkICpzdGFjazsKKwlhdG9taWNfdCB1c2FnZTsKKwl1bnNp Z25lZCBpbnQgZmxhZ3M7CS8qIHBlciBwcm9jZXNzIGZsYWdzLCBkZWZpbmVkIGJlbG93ICovCisJ dW5zaWduZWQgaW50IHB0cmFjZTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgbGxpc3Rf bm9kZSB3YWtlX2VudHJ5OworCWludCBvbl9jcHU7CisjZW5kaWYKKwlpbnQgb25fcnE7CisKKwlp bnQgcHJpbywgc3RhdGljX3ByaW8sIG5vcm1hbF9wcmlvOworCXVuc2lnbmVkIGludCBydF9wcmlv cml0eTsKKwljb25zdCBzdHJ1Y3Qgc2NoZWRfY2xhc3MgKnNjaGVkX2NsYXNzOworCXN0cnVjdCBz Y2hlZF9lbnRpdHkgc2U7CisJc3RydWN0IHNjaGVkX3J0X2VudGl0eSBydDsKKworI2lmZGVmIENP TkZJR19QUkVFTVBUX05PVElGSUVSUworCS8qIGxpc3Qgb2Ygc3RydWN0IHByZWVtcHRfbm90aWZp ZXI6ICovCisJc3RydWN0IGhsaXN0X2hlYWQgcHJlZW1wdF9ub3RpZmllcnM7CisjZW5kaWYKKwor CS8qCisJICogZnB1X2NvdW50ZXIgY29udGFpbnMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBj b250ZXh0IHN3aXRjaGVzCisJICogdGhhdCB0aGUgRlBVIGlzIHVzZWQuIElmIHRoaXMgaXMgb3Zl ciBhIHRocmVzaG9sZCwgdGhlIGxhenkgZnB1CisJICogc2F2aW5nIGJlY29tZXMgdW5sYXp5IHRv IHNhdmUgdGhlIHRyYXAuIFRoaXMgaXMgYW4gdW5zaWduZWQgY2hhcgorCSAqIHNvIHRoYXQgYWZ0 ZXIgMjU2IHRpbWVzIHRoZSBjb3VudGVyIHdyYXBzIGFuZCB0aGUgYmVoYXZpb3IgdHVybnMKKwkg KiBsYXp5IGFnYWluOyB0aGlzIHRvIGRlYWwgd2l0aCBidXJzdHkgYXBwcyB0aGF0IG9ubHkgdXNl IEZQVSBmb3IKKwkgKiBhIHNob3J0IHRpbWUKKwkgKi8KKwl1bnNpZ25lZCBjaGFyIGZwdV9jb3Vu dGVyOworI2lmZGVmIENPTkZJR19CTEtfREVWX0lPX1RSQUNFCisJdW5zaWduZWQgaW50IGJ0cmFj ZV9zZXE7CisjZW5kaWYKKworCXVuc2lnbmVkIGludCBwb2xpY3k7CisJY3B1bWFza190IGNwdXNf YWxsb3dlZDsKKworI2lmZGVmIENPTkZJR19QUkVFTVBUX1JDVQorCWludCByY3VfcmVhZF9sb2Nr X25lc3Rpbmc7CisJY2hhciByY3VfcmVhZF91bmxvY2tfc3BlY2lhbDsKKwlzdHJ1Y3QgbGlzdF9o ZWFkIHJjdV9ub2RlX2VudHJ5OworI2VuZGlmIC8qICNpZmRlZiBDT05GSUdfUFJFRU1QVF9SQ1Ug Ki8KKyNpZmRlZiBDT05GSUdfVFJFRV9QUkVFTVBUX1JDVQorCXN0cnVjdCByY3Vfbm9kZSAqcmN1 X2Jsb2NrZWRfbm9kZTsKKyNlbmRpZiAvKiAjaWZkZWYgQ09ORklHX1RSRUVfUFJFRU1QVF9SQ1Ug Ki8KKyNpZmRlZiBDT05GSUdfUkNVX0JPT1NUCisJc3RydWN0IHJ0X211dGV4ICpyY3VfYm9vc3Rf bXV0ZXg7CisjZW5kaWYgLyogI2lmZGVmIENPTkZJR19SQ1VfQk9PU1QgKi8KKworI2lmIGRlZmlu ZWQoQ09ORklHX1NDSEVEU1RBVFMpIHx8IGRlZmluZWQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkK KwlzdHJ1Y3Qgc2NoZWRfaW5mbyBzY2hlZF9pbmZvOworI2VuZGlmCisKKwlzdHJ1Y3QgbGlzdF9o ZWFkIHRhc2tzOworI2lmZGVmIENPTkZJR19TTVAKKwlzdHJ1Y3QgcGxpc3Rfbm9kZSBwdXNoYWJs ZV90YXNrczsKKyNlbmRpZgorCisJc3RydWN0IG1tX3N0cnVjdCAqbW0sICphY3RpdmVfbW07Cisj aWZkZWYgQ09ORklHX0NPTVBBVF9CUksKKwl1bnNpZ25lZCBicmtfcmFuZG9taXplZDoxOworI2Vu ZGlmCisjaWYgZGVmaW5lZChTUExJVF9SU1NfQ09VTlRJTkcpCisJc3RydWN0IHRhc2tfcnNzX3N0 YXQJcnNzX3N0YXQ7CisjZW5kaWYKKy8qIHRhc2sgc3RhdGUgKi8KKwlpbnQgZXhpdF9zdGF0ZTsK KwlpbnQgZXhpdF9jb2RlLCBleGl0X3NpZ25hbDsKKwlpbnQgcGRlYXRoX3NpZ25hbDsgIC8qICBU aGUgc2lnbmFsIHNlbnQgd2hlbiB0aGUgcGFyZW50IGRpZXMgICovCisJdW5zaWduZWQgaW50IGpv YmN0bDsJLyogSk9CQ1RMXyosIHNpZ2xvY2sgcHJvdGVjdGVkICovCisJLyogPz8/ICovCisJdW5z aWduZWQgaW50IHBlcnNvbmFsaXR5OworCXVuc2lnbmVkIGRpZF9leGVjOjE7CisJdW5zaWduZWQg aW5fZXhlY3ZlOjE7CS8qIFRlbGwgdGhlIExTTXMgdGhhdCB0aGUgcHJvY2VzcyBpcyBkb2luZyBh bgorCQkJCSAqIGV4ZWN2ZSAqLworCXVuc2lnbmVkIGluX2lvd2FpdDoxOworCisKKwkvKiBSZXZl cnQgdG8gZGVmYXVsdCBwcmlvcml0eS9wb2xpY3kgd2hlbiBmb3JraW5nICovCisJdW5zaWduZWQg c2NoZWRfcmVzZXRfb25fZm9yazoxOworCXVuc2lnbmVkIHNjaGVkX2NvbnRyaWJ1dGVzX3RvX2xv YWQ6MTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX0hBUkRJUlFTCisJLyogSVJRIGhhbmRsZXIg dGhyZWFkcyAqLworCXVuc2lnbmVkIGlycV90aHJlYWQ6MTsKKyNlbmRpZgorCisJcGlkX3QgcGlk OworCXBpZF90IHRnaWQ7CisKKyNpZmRlZiBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IKKwkvKiBD YW5hcnkgdmFsdWUgZm9yIHRoZSAtZnN0YWNrLXByb3RlY3RvciBnY2MgZmVhdHVyZSAqLworCXVu c2lnbmVkIGxvbmcgc3RhY2tfY2FuYXJ5OworI2VuZGlmCisKKwkvKiAKKwkgKiBwb2ludGVycyB0 byAob3JpZ2luYWwpIHBhcmVudCBwcm9jZXNzLCB5b3VuZ2VzdCBjaGlsZCwgeW91bmdlciBzaWJs aW5nLAorCSAqIG9sZGVyIHNpYmxpbmcsIHJlc3BlY3RpdmVseS4gIChwLT5mYXRoZXIgY2FuIGJl IHJlcGxhY2VkIHdpdGggCisJICogcC0+cmVhbF9wYXJlbnQtPnBpZCkKKwkgKi8KKwlzdHJ1Y3Qg dGFza19zdHJ1Y3QgX19yY3UgKnJlYWxfcGFyZW50OyAvKiByZWFsIHBhcmVudCBwcm9jZXNzICov CisJc3RydWN0IHRhc2tfc3RydWN0IF9fcmN1ICpwYXJlbnQ7IC8qIHJlY2lwaWVudCBvZiBTSUdD SExELCB3YWl0NCgpIHJlcG9ydHMgKi8KKwkvKgorCSAqIGNoaWxkcmVuL3NpYmxpbmcgZm9ybXMg dGhlIGxpc3Qgb2YgbXkgbmF0dXJhbCBjaGlsZHJlbgorCSAqLworCXN0cnVjdCBsaXN0X2hlYWQg Y2hpbGRyZW47CS8qIGxpc3Qgb2YgbXkgY2hpbGRyZW4gKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHNp Ymxpbmc7CS8qIGxpbmthZ2UgaW4gbXkgcGFyZW50J3MgY2hpbGRyZW4gbGlzdCAqLworCXN0cnVj dCB0YXNrX3N0cnVjdCAqZ3JvdXBfbGVhZGVyOwkvKiB0aHJlYWRncm91cCBsZWFkZXIgKi8KKwor CS8qCisJICogcHRyYWNlZCBpcyB0aGUgbGlzdCBvZiB0YXNrcyB0aGlzIHRhc2sgaXMgdXNpbmcg cHRyYWNlIG9uLgorCSAqIFRoaXMgaW5jbHVkZXMgYm90aCBuYXR1cmFsIGNoaWxkcmVuIGFuZCBQ VFJBQ0VfQVRUQUNIIHRhcmdldHMuCisJICogcC0+cHRyYWNlX2VudHJ5IGlzIHAncyBsaW5rIG9u IHRoZSBwLT5wYXJlbnQtPnB0cmFjZWQgbGlzdC4KKwkgKi8KKwlzdHJ1Y3QgbGlzdF9oZWFkIHB0 cmFjZWQ7CisJc3RydWN0IGxpc3RfaGVhZCBwdHJhY2VfZW50cnk7CisKKwkvKiBQSUQvUElEIGhh c2ggdGFibGUgbGlua2FnZS4gKi8KKwlzdHJ1Y3QgcGlkX2xpbmsgcGlkc1tQSURUWVBFX01BWF07 CisJc3RydWN0IGxpc3RfaGVhZCB0aHJlYWRfZ3JvdXA7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiAq dmZvcmtfZG9uZTsJCS8qIGZvciB2Zm9yaygpICovCisJaW50IF9fdXNlciAqc2V0X2NoaWxkX3Rp ZDsJCS8qIENMT05FX0NISUxEX1NFVFRJRCAqLworCWludCBfX3VzZXIgKmNsZWFyX2NoaWxkX3Rp ZDsJCS8qIENMT05FX0NISUxEX0NMRUFSVElEICovCisKKwljcHV0aW1lX3QgdXRpbWUsIHN0aW1l LCB1dGltZXNjYWxlZCwgc3RpbWVzY2FsZWQ7CisJY3B1dGltZV90IGd0aW1lOworI2lmbmRlZiBD T05GSUdfVklSVF9DUFVfQUNDT1VOVElORworCWNwdXRpbWVfdCBwcmV2X3V0aW1lLCBwcmV2X3N0 aW1lOworI2VuZGlmCisJdW5zaWduZWQgbG9uZyBudmNzdywgbml2Y3N3OyAvKiBjb250ZXh0IHN3 aXRjaCBjb3VudHMgKi8KKwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnRfdGltZTsgCQkvKiBtb25vdG9u aWMgdGltZSAqLworCXN0cnVjdCB0aW1lc3BlYyByZWFsX3N0YXJ0X3RpbWU7CS8qIGJvb3QgYmFz ZWQgdGltZSAqLworLyogbW0gZmF1bHQgYW5kIHN3YXAgaW5mbzogdGhpcyBjYW4gYXJndWFibHkg YmUgc2VlbiBhcyBlaXRoZXIgbW0tc3BlY2lmaWMgb3IgdGhyZWFkLXNwZWNpZmljICovCisJdW5z aWduZWQgbG9uZyBtaW5fZmx0LCBtYWpfZmx0OworCisJc3RydWN0IHRhc2tfY3B1dGltZSBjcHV0 aW1lX2V4cGlyZXM7CisJc3RydWN0IGxpc3RfaGVhZCBjcHVfdGltZXJzWzNdOworCisvKiBwcm9j ZXNzIGNyZWRlbnRpYWxzICovCisJY29uc3Qgc3RydWN0IGNyZWQgX19yY3UgKnJlYWxfY3JlZDsg Lyogb2JqZWN0aXZlIGFuZCByZWFsIHN1YmplY3RpdmUgdGFzaworCQkJCQkgKiBjcmVkZW50aWFs cyAoQ09XKSAqLworCWNvbnN0IHN0cnVjdCBjcmVkIF9fcmN1ICpjcmVkOwkvKiBlZmZlY3RpdmUg KG92ZXJyaWRhYmxlKSBzdWJqZWN0aXZlIHRhc2sKKwkJCQkJICogY3JlZGVudGlhbHMgKENPVykg Ki8KKwlzdHJ1Y3QgY3JlZCAqcmVwbGFjZW1lbnRfc2Vzc2lvbl9rZXlyaW5nOyAvKiBmb3IgS0VZ Q1RMX1NFU1NJT05fVE9fUEFSRU5UICovCisKKwljaGFyIGNvbW1bVEFTS19DT01NX0xFTl07IC8q IGV4ZWN1dGFibGUgbmFtZSBleGNsdWRpbmcgcGF0aAorCQkJCSAgICAgLSBhY2Nlc3Mgd2l0aCBb Z3NdZXRfdGFza19jb21tICh3aGljaCBsb2NrCisJCQkJICAgICAgIGl0IHdpdGggdGFza19sb2Nr KCkpCisJCQkJICAgICAtIGluaXRpYWxpemVkIG5vcm1hbGx5IGJ5IHNldHVwX25ld19leGVjICov CisvKiBmaWxlIHN5c3RlbSBpbmZvICovCisJaW50IGxpbmtfY291bnQsIHRvdGFsX2xpbmtfY291 bnQ7CisjaWZkZWYgQ09ORklHX1NZU1ZJUEMKKy8qIGlwYyBzdHVmZiAqLworCXN0cnVjdCBzeXN2 X3NlbSBzeXN2c2VtOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0RFVEVDVF9IVU5HX1RBU0sKKy8q IGh1bmcgdGFzayBkZXRlY3Rpb24gKi8KKwl1bnNpZ25lZCBsb25nIGxhc3Rfc3dpdGNoX2NvdW50 OworI2VuZGlmCisvKiBDUFUtc3BlY2lmaWMgc3RhdGUgb2YgdGhpcyB0YXNrICovCisJc3RydWN0 IHRocmVhZF9zdHJ1Y3QgdGhyZWFkOworLyogZmlsZXN5c3RlbSBpbmZvcm1hdGlvbiAqLworCXN0 cnVjdCBmc19zdHJ1Y3QgKmZzOworLyogb3BlbiBmaWxlIGluZm9ybWF0aW9uICovCisJc3RydWN0 IGZpbGVzX3N0cnVjdCAqZmlsZXM7CisvKiBuYW1lc3BhY2VzICovCisJc3RydWN0IG5zcHJveHkg Km5zcHJveHk7CisvKiBzaWduYWwgaGFuZGxlcnMgKi8KKwlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAq c2lnbmFsOworCXN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqc2lnaGFuZDsKKworCXNpZ3NldF90IGJs b2NrZWQsIHJlYWxfYmxvY2tlZDsKKwlzaWdzZXRfdCBzYXZlZF9zaWdtYXNrOwkvKiByZXN0b3Jl ZCBpZiBzZXRfcmVzdG9yZV9zaWdtYXNrKCkgd2FzIHVzZWQgKi8KKwlzdHJ1Y3Qgc2lncGVuZGlu ZyBwZW5kaW5nOworCisJdW5zaWduZWQgbG9uZyBzYXNfc3Nfc3A7CisJc2l6ZV90IHNhc19zc19z aXplOworCWludCAoKm5vdGlmaWVyKSh2b2lkICpwcml2KTsKKwl2b2lkICpub3RpZmllcl9kYXRh OworCXNpZ3NldF90ICpub3RpZmllcl9tYXNrOworCXN0cnVjdCBhdWRpdF9jb250ZXh0ICphdWRp dF9jb250ZXh0OworI2lmZGVmIENPTkZJR19BVURJVFNZU0NBTEwKKwl1aWRfdCBsb2dpbnVpZDsK Kwl1bnNpZ25lZCBpbnQgc2Vzc2lvbmlkOworI2VuZGlmCisJc2VjY29tcF90IHNlY2NvbXA7CisK Ky8qIFRocmVhZCBncm91cCB0cmFja2luZyAqLworICAgCXUzMiBwYXJlbnRfZXhlY19pZDsKKyAg IAl1MzIgc2VsZl9leGVjX2lkOworLyogUHJvdGVjdGlvbiBvZiAoZGUtKWFsbG9jYXRpb246IG1t LCBmaWxlcywgZnMsIHR0eSwga2V5cmluZ3MsIG1lbXNfYWxsb3dlZCwKKyAqIG1lbXBvbGljeSAq LworCXNwaW5sb2NrX3QgYWxsb2NfbG9jazsKKworCS8qIFByb3RlY3Rpb24gb2YgdGhlIFBJIGRh dGEgc3RydWN0dXJlczogKi8KKwlyYXdfc3BpbmxvY2tfdCBwaV9sb2NrOworCisjaWZkZWYgQ09O RklHX1JUX01VVEVYRVMKKwkvKiBQSSB3YWl0ZXJzIGJsb2NrZWQgb24gYSBydF9tdXRleCBoZWxk IGJ5IHRoaXMgdGFzayAqLworCXN0cnVjdCBwbGlzdF9oZWFkIHBpX3dhaXRlcnM7CisJLyogRGVh ZGxvY2sgZGV0ZWN0aW9uIGFuZCBwcmlvcml0eSBpbmhlcml0YW5jZSBoYW5kbGluZyAqLworCXN0 cnVjdCBydF9tdXRleF93YWl0ZXIgKnBpX2Jsb2NrZWRfb247CisjZW5kaWYKKworI2lmZGVmIENP TkZJR19ERUJVR19NVVRFWEVTCisJLyogbXV0ZXggZGVhZGxvY2sgZGV0ZWN0aW9uICovCisJc3Ry dWN0IG11dGV4X3dhaXRlciAqYmxvY2tlZF9vbjsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19UUkFD RV9JUlFGTEFHUworCXVuc2lnbmVkIGludCBpcnFfZXZlbnRzOworCXVuc2lnbmVkIGxvbmcgaGFy ZGlycV9lbmFibGVfaXA7CisJdW5zaWduZWQgbG9uZyBoYXJkaXJxX2Rpc2FibGVfaXA7CisJdW5z aWduZWQgaW50IGhhcmRpcnFfZW5hYmxlX2V2ZW50OworCXVuc2lnbmVkIGludCBoYXJkaXJxX2Rp c2FibGVfZXZlbnQ7CisJaW50IGhhcmRpcnFzX2VuYWJsZWQ7CisJaW50IGhhcmRpcnFfY29udGV4 dDsKKwl1bnNpZ25lZCBsb25nIHNvZnRpcnFfZGlzYWJsZV9pcDsKKwl1bnNpZ25lZCBsb25nIHNv ZnRpcnFfZW5hYmxlX2lwOworCXVuc2lnbmVkIGludCBzb2Z0aXJxX2Rpc2FibGVfZXZlbnQ7CisJ dW5zaWduZWQgaW50IHNvZnRpcnFfZW5hYmxlX2V2ZW50OworCWludCBzb2Z0aXJxc19lbmFibGVk OworCWludCBzb2Z0aXJxX2NvbnRleHQ7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfTE9DS0RFUAor IyBkZWZpbmUgTUFYX0xPQ0tfREVQVEggNDhVTAorCXU2NCBjdXJyX2NoYWluX2tleTsKKwlpbnQg bG9ja2RlcF9kZXB0aDsKKwl1bnNpZ25lZCBpbnQgbG9ja2RlcF9yZWN1cnNpb247CisJc3RydWN0 IGhlbGRfbG9jayBoZWxkX2xvY2tzW01BWF9MT0NLX0RFUFRIXTsKKwlnZnBfdCBsb2NrZGVwX3Jl Y2xhaW1fZ2ZwOworI2VuZGlmCisKKy8qIGpvdXJuYWxsaW5nIGZpbGVzeXN0ZW0gaW5mbyAqLwor CXZvaWQgKmpvdXJuYWxfaW5mbzsKKworLyogc3RhY2tlZCBibG9jayBkZXZpY2UgaW5mbyAqLwor CXN0cnVjdCBiaW9fbGlzdCAqYmlvX2xpc3Q7CisKKyNpZmRlZiBDT05GSUdfQkxPQ0sKKy8qIHN0 YWNrIHBsdWdnaW5nICovCisJc3RydWN0IGJsa19wbHVnICpwbHVnOworI2VuZGlmCisKKy8qIFZN IHN0YXRlICovCisJc3RydWN0IHJlY2xhaW1fc3RhdGUgKnJlY2xhaW1fc3RhdGU7CisKKwlzdHJ1 Y3QgYmFja2luZ19kZXZfaW5mbyAqYmFja2luZ19kZXZfaW5mbzsKKworCXN0cnVjdCBpb19jb250 ZXh0ICppb19jb250ZXh0OworCisJdW5zaWduZWQgbG9uZyBwdHJhY2VfbWVzc2FnZTsKKwlzaWdp bmZvX3QgKmxhc3Rfc2lnaW5mbzsgLyogRm9yIHB0cmFjZSB1c2UuICAqLworCXN0cnVjdCB0YXNr X2lvX2FjY291bnRpbmcgaW9hYzsKKyNpZiBkZWZpbmVkKENPTkZJR19UQVNLX1hBQ0NUKQorCXU2 NCBhY2N0X3Jzc19tZW0xOwkvKiBhY2N1bXVsYXRlZCByc3MgdXNhZ2UgKi8KKwl1NjQgYWNjdF92 bV9tZW0xOwkvKiBhY2N1bXVsYXRlZCB2aXJ0dWFsIG1lbW9yeSB1c2FnZSAqLworCWNwdXRpbWVf dCBhY2N0X3RpbWV4cGQ7CS8qIHN0aW1lICsgdXRpbWUgc2luY2UgbGFzdCB1cGRhdGUgKi8KKyNl bmRpZgorI2lmZGVmIENPTkZJR19DUFVTRVRTCisJbm9kZW1hc2tfdCBtZW1zX2FsbG93ZWQ7CS8q IFByb3RlY3RlZCBieSBhbGxvY19sb2NrICovCisJc2VxY291bnRfdCBtZW1zX2FsbG93ZWRfc2Vx OwkvKiBTZXFlbmNlIG5vIHRvIGNhdGNoIHVwZGF0ZXMgKi8KKwlpbnQgY3B1c2V0X21lbV9zcHJl YWRfcm90b3I7CisJaW50IGNwdXNldF9zbGFiX3NwcmVhZF9yb3RvcjsKKyNlbmRpZgorI2lmZGVm IENPTkZJR19DR1JPVVBTCisJLyogQ29udHJvbCBHcm91cCBpbmZvIHByb3RlY3RlZCBieSBjc3Nf c2V0X2xvY2sgKi8KKwlzdHJ1Y3QgY3NzX3NldCBfX3JjdSAqY2dyb3VwczsKKwkvKiBjZ19saXN0 IHByb3RlY3RlZCBieSBjc3Nfc2V0X2xvY2sgYW5kIHRzay0+YWxsb2NfbG9jayAqLworCXN0cnVj dCBsaXN0X2hlYWQgY2dfbGlzdDsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19GVVRFWAorCXN0cnVj dCByb2J1c3RfbGlzdF9oZWFkIF9fdXNlciAqcm9idXN0X2xpc3Q7CisjaWZkZWYgQ09ORklHX0NP TVBBVAorCXN0cnVjdCBjb21wYXRfcm9idXN0X2xpc3RfaGVhZCBfX3VzZXIgKmNvbXBhdF9yb2J1 c3RfbGlzdDsKKyNlbmRpZgorCXN0cnVjdCBsaXN0X2hlYWQgcGlfc3RhdGVfbGlzdDsKKwlzdHJ1 Y3QgZnV0ZXhfcGlfc3RhdGUgKnBpX3N0YXRlX2NhY2hlOworI2VuZGlmCisjaWZkZWYgQ09ORklH X1BFUkZfRVZFTlRTCisJc3RydWN0IHBlcmZfZXZlbnRfY29udGV4dCAqcGVyZl9ldmVudF9jdHhw W3BlcmZfbnJfdGFza19jb250ZXh0c107CisJc3RydWN0IG11dGV4IHBlcmZfZXZlbnRfbXV0ZXg7 CisJc3RydWN0IGxpc3RfaGVhZCBwZXJmX2V2ZW50X2xpc3Q7CisjZW5kaWYKKyNpZmRlZiBDT05G SUdfTlVNQQorCXN0cnVjdCBtZW1wb2xpY3kgKm1lbXBvbGljeTsJLyogUHJvdGVjdGVkIGJ5IGFs bG9jX2xvY2sgKi8KKwlzaG9ydCBpbF9uZXh0OworCXNob3J0IHByZWZfbm9kZV9mb3JrOworI2Vu ZGlmCisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKworCS8qCisJICogY2FjaGUgbGFzdCB1c2VkIHBp cGUgZm9yIHNwbGljZQorCSAqLworCXN0cnVjdCBwaXBlX2lub2RlX2luZm8gKnNwbGljZV9waXBl OworI2lmZGVmCUNPTkZJR19UQVNLX0RFTEFZX0FDQ1QKKwlzdHJ1Y3QgdGFza19kZWxheV9pbmZv ICpkZWxheXM7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRkFVTFRfSU5KRUNUSU9OCisJaW50IG1h a2VfaXRfZmFpbDsKKyNlbmRpZgorCS8qCisJICogd2hlbiAobnJfZGlydGllZCA+PSBucl9kaXJ0 aWVkX3BhdXNlKSwgaXQncyB0aW1lIHRvIGNhbGwKKwkgKiBiYWxhbmNlX2RpcnR5X3BhZ2VzKCkg Zm9yIHNvbWUgZGlydHkgdGhyb3R0bGluZyBwYXVzZQorCSAqLworCWludCBucl9kaXJ0aWVkOwor CWludCBucl9kaXJ0aWVkX3BhdXNlOworCXVuc2lnbmVkIGxvbmcgZGlydHlfcGF1c2VkX3doZW47 IC8qIHN0YXJ0IG9mIGEgd3JpdGUtYW5kLXBhdXNlIHBlcmlvZCAqLworCisjaWZkZWYgQ09ORklH X0xBVEVOQ1lUT1AKKwlpbnQgbGF0ZW5jeV9yZWNvcmRfY291bnQ7CisJc3RydWN0IGxhdGVuY3lf cmVjb3JkIGxhdGVuY3lfcmVjb3JkW0xUX1NBVkVDT1VOVF07CisjZW5kaWYKKwkvKgorCSAqIHRp bWUgc2xhY2sgdmFsdWVzOyB0aGVzZSBhcmUgdXNlZCB0byByb3VuZCB1cCBwb2xsKCkgYW5kCisJ ICogc2VsZWN0KCkgZXRjIHRpbWVvdXQgdmFsdWVzLiBUaGVzZSBhcmUgaW4gbmFub3NlY29uZHMu CisJICovCisJdW5zaWduZWQgbG9uZyB0aW1lcl9zbGFja19uczsKKwl1bnNpZ25lZCBsb25nIGRl ZmF1bHRfdGltZXJfc2xhY2tfbnM7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkCSpzY21fd29ya19saXN0 OworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwkvKiBJbmRleCBvZiBjdXJy ZW50IHN0b3JlZCBhZGRyZXNzIGluIHJldF9zdGFjayAqLworCWludCBjdXJyX3JldF9zdGFjazsK KwkvKiBTdGFjayBvZiByZXR1cm4gYWRkcmVzc2VzIGZvciByZXR1cm4gZnVuY3Rpb24gdHJhY2lu ZyAqLworCXN0cnVjdCBmdHJhY2VfcmV0X3N0YWNrCSpyZXRfc3RhY2s7CisJLyogdGltZSBzdGFt cCBmb3IgbGFzdCBzY2hlZHVsZSAqLworCXVuc2lnbmVkIGxvbmcgbG9uZyBmdHJhY2VfdGltZXN0 YW1wOworCS8qCisJICogTnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IGhhdmVuJ3QgYmVlbiB0cmFj ZWQKKwkgKiBiZWNhdXNlIG9mIGRlcHRoIG92ZXJydW4uCisJICovCisJYXRvbWljX3QgdHJhY2Vf b3ZlcnJ1bjsKKwkvKiBQYXVzZSBmb3IgdGhlIHRyYWNpbmcgKi8KKwlhdG9taWNfdCB0cmFjaW5n X2dyYXBoX3BhdXNlOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RSQUNJTkcKKwkvKiBzdGF0ZSBm bGFncyBmb3IgdXNlIGJ5IHRyYWNlcnMgKi8KKwl1bnNpZ25lZCBsb25nIHRyYWNlOworCS8qIGJp dG1hc2sgYW5kIGNvdW50ZXIgb2YgdHJhY2UgcmVjdXJzaW9uICovCisJdW5zaWduZWQgbG9uZyB0 cmFjZV9yZWN1cnNpb247CisjZW5kaWYgLyogQ09ORklHX1RSQUNJTkcgKi8KKyNpZmRlZiBDT05G SUdfQ0dST1VQX01FTV9SRVNfQ1RMUiAvKiBtZW1jZyB1c2VzIHRoaXMgdG8gZG8gYmF0Y2ggam9i ICovCisJc3RydWN0IG1lbWNnX2JhdGNoX2luZm8geworCQlpbnQgZG9fYmF0Y2g7CS8qIGluY3Jl bWVudGVkIHdoZW4gYmF0Y2ggdW5jaGFyZ2Ugc3RhcnRlZCAqLworCQlzdHJ1Y3QgbWVtX2Nncm91 cCAqbWVtY2c7IC8qIHRhcmdldCBtZW1jZyBvZiB1bmNoYXJnZSAqLworCQl1bnNpZ25lZCBsb25n IG5yX3BhZ2VzOwkvKiB1bmNoYXJnZWQgdXNhZ2UgKi8KKwkJdW5zaWduZWQgbG9uZyBtZW1zd19u cl9wYWdlczsgLyogdW5jaGFyZ2VkIG1lbStzd2FwIHVzYWdlICovCisJfSBtZW1jZ19iYXRjaDsK KyNlbmRpZgorI2lmZGVmIENPTkZJR19IQVZFX0hXX0JSRUFLUE9JTlQKKwlhdG9taWNfdCBwdHJh Y2VfYnBfcmVmY250OworI2VuZGlmCit9OworCisvKiBGdXR1cmUtc2FmZSBhY2Nlc3NvciBmb3Ig c3RydWN0IHRhc2tfc3RydWN0J3MgY3B1c19hbGxvd2VkLiAqLworI2RlZmluZSB0c2tfY3B1c19h bGxvd2VkKHRzaykgKCYodHNrKS0+Y3B1c19hbGxvd2VkKQorCisvKgorICogUHJpb3JpdHkgb2Yg YSBwcm9jZXNzIGdvZXMgZnJvbSAwLi5NQVhfUFJJTy0xLCB2YWxpZCBSVAorICogcHJpb3JpdHkg aXMgMC4uTUFYX1JUX1BSSU8tMSwgYW5kIFNDSEVEX05PUk1BTC9TQ0hFRF9CQVRDSAorICogdGFz a3MgYXJlIGluIHRoZSByYW5nZSBNQVhfUlRfUFJJTy4uTUFYX1BSSU8tMS4gUHJpb3JpdHkKKyAq IHZhbHVlcyBhcmUgaW52ZXJ0ZWQ6IGxvd2VyIHAtPnByaW8gdmFsdWUgbWVhbnMgaGlnaGVyIHBy aW9yaXR5LgorICoKKyAqIFRoZSBNQVhfVVNFUl9SVF9QUklPIHZhbHVlIGFsbG93cyB0aGUgYWN0 dWFsIG1heGltdW0KKyAqIFJUIHByaW9yaXR5IHRvIGJlIHNlcGFyYXRlIGZyb20gdGhlIHZhbHVl IGV4cG9ydGVkIHRvCisgKiB1c2VyLXNwYWNlLiAgVGhpcyBhbGxvd3Mga2VybmVsIHRocmVhZHMg dG8gc2V0IHRoZWlyCisgKiBwcmlvcml0eSB0byBhIHZhbHVlIGhpZ2hlciB0aGFuIGFueSB1c2Vy IHRhc2suIE5vdGU6CisgKiBNQVhfUlRfUFJJTyBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gTUFY X1VTRVJfUlRfUFJJTy4KKyAqLworCisjZGVmaW5lIE1BWF9VU0VSX1JUX1BSSU8JMTAwCisjZGVm aW5lIE1BWF9SVF9QUklPCQlNQVhfVVNFUl9SVF9QUklPCisKKyNkZWZpbmUgTUFYX1BSSU8JCShN QVhfUlRfUFJJTyArIDQwKQorI2RlZmluZSBERUZBVUxUX1BSSU8JCShNQVhfUlRfUFJJTyArIDIw KQorCitzdGF0aWMgaW5saW5lIGludCBydF9wcmlvKGludCBwcmlvKQoreworCWlmICh1bmxpa2Vs eShwcmlvIDwgTUFYX1JUX1BSSU8pKQorCQlyZXR1cm4gMTsKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIGlubGluZSBpbnQgcnRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJu IHJ0X3ByaW8ocC0+cHJpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza19w aWQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXJldHVybiB0YXNrLT5waWRzW1BJRFRZ UEVfUElEXS5waWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza190Z2lkKHN0 cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlyZXR1cm4gdGFzay0+Z3JvdXBfbGVhZGVyLT5w aWRzW1BJRFRZUEVfUElEXS5waWQ7Cit9CisKKy8qCisgKiBXaXRob3V0IHRhc2tsaXN0IG9yIHJj dSBsb2NrIGl0IGlzIG5vdCBzYWZlIHRvIGRlcmVmZXJlbmNlCisgKiB0aGUgcmVzdWx0IG9mIHRh c2tfcGdycC90YXNrX3Nlc3Npb24gZXZlbiBpZiB0YXNrID09IGN1cnJlbnQsCisgKiB3ZSBjYW4g cmFjZSB3aXRoIGFub3RoZXIgdGhyZWFkIGRvaW5nIHN5c19zZXRzaWQvc3lzX3NldHBnaWQuCisg Ki8KK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBpZCAqdGFza19wZ3JwKHN0cnVjdCB0YXNrX3N0cnVj dCAqdGFzaykKK3sKKwlyZXR1cm4gdGFzay0+Z3JvdXBfbGVhZGVyLT5waWRzW1BJRFRZUEVfUEdJ RF0ucGlkOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwaWQgKnRhc2tfc2Vzc2lvbihzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJcmV0dXJuIHRhc2stPmdyb3VwX2xlYWRlci0+cGlk c1tQSURUWVBFX1NJRF0ucGlkOworfQorCitzdHJ1Y3QgcGlkX25hbWVzcGFjZTsKKworLyoKKyAq IHRoZSBoZWxwZXJzIHRvIGdldCB0aGUgdGFzaydzIGRpZmZlcmVudCBwaWRzIGFzIHRoZXkgYXJl IHNlZW4KKyAqIGZyb20gdmFyaW91cyBuYW1lc3BhY2VzCisgKgorICogdGFza194aWRfbnIoKSAg ICAgOiBnbG9iYWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJvbSB0aGUgaW5pdCBuYW1lc3BhY2U7 CisgKiB0YXNrX3hpZF92bnIoKSAgICA6IHZpcnR1YWwgaWQsIGkuZS4gdGhlIGlkIHNlZW4gZnJv bSB0aGUgcGlkIG5hbWVzcGFjZSBvZgorICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50Lgor ICogdGFza194aWRfbnJfbnMoKSAgOiBpZCBzZWVuIGZyb20gdGhlIG5zIHNwZWNpZmllZDsKKyAq CisgKiBzZXRfdGFza192eGlkKCkgICA6IGFzc2lnbnMgYSB2aXJ0dWFsIGlkIHRvIGEgdGFzazsK KyAqCisgKiBzZWUgYWxzbyBwaWRfbnIoKSBldGMgaW4gaW5jbHVkZS9saW51eC9waWQuaAorICov CitwaWRfdCBfX3Rhc2tfcGlkX25yX25zKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgZW51bSBw aWRfdHlwZSB0eXBlLAorCQkJc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKKworc3RhdGljIGlu bGluZSBwaWRfdCB0YXNrX3BpZF9ucihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1 cm4gdHNrLT5waWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGlkX3QgdGFza19waWRfbnJfbnMoc3Ry dWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJCXN0cnVjdCBwaWRfbmFtZXNwYWNlICpucykKK3sK KwlyZXR1cm4gX190YXNrX3BpZF9ucl9ucyh0c2ssIFBJRFRZUEVfUElELCBucyk7Cit9CisKK3N0 YXRpYyBpbmxpbmUgcGlkX3QgdGFza19waWRfdm5yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQor eworCXJldHVybiBfX3Rhc2tfcGlkX25yX25zKHRzaywgUElEVFlQRV9QSUQsIE5VTEwpOworfQor CisKK3N0YXRpYyBpbmxpbmUgcGlkX3QgdGFza190Z2lkX25yKHN0cnVjdCB0YXNrX3N0cnVjdCAq dHNrKQoreworCXJldHVybiB0c2stPnRnaWQ7Cit9CisKK3BpZF90IHRhc2tfdGdpZF9ucl9ucyhz dHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHBpZF9uYW1lc3BhY2UgKm5zKTsKKworc3Rh dGljIGlubGluZSBwaWRfdCB0YXNrX3RnaWRfdm5yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQor eworCXJldHVybiBwaWRfdm5yKHRhc2tfdGdpZCh0c2spKTsKK30KKworCitzdGF0aWMgaW5saW5l IHBpZF90IHRhc2tfcGdycF9ucl9ucyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKKwkJCQkJc3Ry dWN0IHBpZF9uYW1lc3BhY2UgKm5zKQoreworCXJldHVybiBfX3Rhc2tfcGlkX25yX25zKHRzaywg UElEVFlQRV9QR0lELCBucyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGlkX3QgdGFza19wZ3JwX3Zu cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gX190YXNrX3BpZF9ucl9ucyh0 c2ssIFBJRFRZUEVfUEdJRCwgTlVMTCk7Cit9CisKKworc3RhdGljIGlubGluZSBwaWRfdCB0YXNr X3Nlc3Npb25fbnJfbnMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJCXN0cnVjdCBwaWRf bmFtZXNwYWNlICpucykKK3sKKwlyZXR1cm4gX190YXNrX3BpZF9ucl9ucyh0c2ssIFBJRFRZUEVf U0lELCBucyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgcGlkX3QgdGFza19zZXNzaW9uX3ZucihzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwlyZXR1cm4gX190YXNrX3BpZF9ucl9ucyh0c2ssIFBJ RFRZUEVfU0lELCBOVUxMKTsKK30KKworLyogb2Jzb2xldGUsIGRvIG5vdCB1c2UgKi8KK3N0YXRp YyBpbmxpbmUgcGlkX3QgdGFza19wZ3JwX25yKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorewor CXJldHVybiB0YXNrX3BncnBfbnJfbnModHNrLCAmaW5pdF9waWRfbnMpOworfQorCisvKioKKyAq IHBpZF9hbGl2ZSAtIGNoZWNrIHRoYXQgYSB0YXNrIHN0cnVjdHVyZSBpcyBub3Qgc3RhbGUKKyAq IEBwOiBUYXNrIHN0cnVjdHVyZSB0byBiZSBjaGVja2VkLgorICoKKyAqIFRlc3QgaWYgYSBwcm9j ZXNzIGlzIG5vdCB5ZXQgZGVhZCAoYXQgbW9zdCB6b21iaWUgc3RhdGUpCisgKiBJZiBwaWRfYWxp dmUgZmFpbHMsIHRoZW4gcG9pbnRlcnMgd2l0aGluIHRoZSB0YXNrIHN0cnVjdHVyZQorICogY2Fu IGJlIHN0YWxlIGFuZCBtdXN0IG5vdCBiZSBkZXJlZmVyZW5jZWQuCisgKi8KK3N0YXRpYyBpbmxp bmUgaW50IHBpZF9hbGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHAtPnBp ZHNbUElEVFlQRV9QSURdLnBpZCAhPSBOVUxMOworfQorCisvKioKKyAqIGlzX2dsb2JhbF9pbml0 IC0gY2hlY2sgaWYgYSB0YXNrIHN0cnVjdHVyZSBpcyBpbml0CisgKiBAdHNrOiBUYXNrIHN0cnVj dHVyZSB0byBiZSBjaGVja2VkLgorICoKKyAqIENoZWNrIGlmIGEgdGFzayBzdHJ1Y3R1cmUgaXMg dGhlIGZpcnN0IHVzZXIgc3BhY2UgdGFzayB0aGUga2VybmVsIGNyZWF0ZWQuCisgKi8KK3N0YXRp YyBpbmxpbmUgaW50IGlzX2dsb2JhbF9pbml0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQorewor CXJldHVybiB0c2stPnBpZCA9PSAxOworfQorCisvKgorICogaXNfY29udGFpbmVyX2luaXQ6Cisg KiBjaGVjayB3aGV0aGVyIGluIHRoZSB0YXNrIGlzIGluaXQgaW4gaXRzIG93biBwaWQgbmFtZXNw YWNlLgorICovCitleHRlcm4gaW50IGlzX2NvbnRhaW5lcl9pbml0KHN0cnVjdCB0YXNrX3N0cnVj dCAqdHNrKTsKKworZXh0ZXJuIHN0cnVjdCBwaWQgKmNhZF9waWQ7CisKK2V4dGVybiB2b2lkIGZy ZWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisjZGVmaW5lIGdldF90YXNrX3N0cnVj dCh0c2spIGRvIHsgYXRvbWljX2luYygmKHRzayktPnVzYWdlKTsgfSB3aGlsZSgwKQorCitleHRl cm4gdm9pZCBfX3B1dF90YXNrX3N0cnVjdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpOworCitzdGF0 aWMgaW5saW5lIHZvaWQgcHV0X3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKK3sK KwlpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmdC0+dXNhZ2UpKQorCQlfX3B1dF90YXNrX3N0cnVj dCh0KTsKK30KKworZXh0ZXJuIHZvaWQgdGFza190aW1lcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAs IGNwdXRpbWVfdCAqdXQsIGNwdXRpbWVfdCAqc3QpOworZXh0ZXJuIHZvaWQgdGhyZWFkX2dyb3Vw X3RpbWVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1dGltZV90ICp1dCwgY3B1dGltZV90ICpz dCk7CisKKy8qCisgKiBQZXIgcHJvY2VzcyBmbGFncworICovCisjZGVmaW5lIFBGX0VYSVRJTkcJ MHgwMDAwMDAwNAkvKiBnZXR0aW5nIHNodXQgZG93biAqLworI2RlZmluZSBQRl9FWElUUElET05F CTB4MDAwMDAwMDgJLyogcGkgZXhpdCBkb25lIG9uIHNodXQgZG93biAqLworI2RlZmluZSBQRl9W Q1BVCQkweDAwMDAwMDEwCS8qIEknbSBhIHZpcnR1YWwgQ1BVICovCisjZGVmaW5lIFBGX1dRX1dP UktFUgkweDAwMDAwMDIwCS8qIEknbSBhIHdvcmtxdWV1ZSB3b3JrZXIgKi8KKyNkZWZpbmUgUEZf Rk9SS05PRVhFQwkweDAwMDAwMDQwCS8qIGZvcmtlZCBidXQgZGlkbid0IGV4ZWMgKi8KKyNkZWZp bmUgUEZfTUNFX1BST0NFU1MgIDB4MDAwMDAwODAgICAgICAvKiBwcm9jZXNzIHBvbGljeSBvbiBt Y2UgZXJyb3JzICovCisjZGVmaW5lIFBGX1NVUEVSUFJJVgkweDAwMDAwMTAwCS8qIHVzZWQgc3Vw ZXItdXNlciBwcml2aWxlZ2VzICovCisjZGVmaW5lIFBGX0RVTVBDT1JFCTB4MDAwMDAyMDAJLyog ZHVtcGVkIGNvcmUgKi8KKyNkZWZpbmUgUEZfU0lHTkFMRUQJMHgwMDAwMDQwMAkvKiBraWxsZWQg YnkgYSBzaWduYWwgKi8KKyNkZWZpbmUgUEZfTUVNQUxMT0MJMHgwMDAwMDgwMAkvKiBBbGxvY2F0 aW5nIG1lbW9yeSAqLworI2RlZmluZSBQRl9OUFJPQ19FWENFRURFRCAweDAwMDAxMDAwCS8qIHNl dF91c2VyIG5vdGljZWQgdGhhdCBSTElNSVRfTlBST0Mgd2FzIGV4Y2VlZGVkICovCisjZGVmaW5l IFBGX1VTRURfTUFUSAkweDAwMDAyMDAwCS8qIGlmIHVuc2V0IHRoZSBmcHUgbXVzdCBiZSBpbml0 aWFsaXplZCBiZWZvcmUgdXNlICovCisjZGVmaW5lIFBGX05PRlJFRVpFCTB4MDAwMDgwMDAJLyog dGhpcyB0aHJlYWQgc2hvdWxkIG5vdCBiZSBmcm96ZW4gKi8KKyNkZWZpbmUgUEZfRlJPWkVOCTB4 MDAwMTAwMDAJLyogZnJvemVuIGZvciBzeXN0ZW0gc3VzcGVuZCAqLworI2RlZmluZSBQRl9GU1RS QU5TCTB4MDAwMjAwMDAJLyogaW5zaWRlIGEgZmlsZXN5c3RlbSB0cmFuc2FjdGlvbiAqLworI2Rl ZmluZSBQRl9LU1dBUEQJMHgwMDA0MDAwMAkvKiBJIGFtIGtzd2FwZCAqLworI2RlZmluZSBQRl9M RVNTX1RIUk9UVExFIDB4MDAxMDAwMDAJLyogVGhyb3R0bGUgbWUgbGVzczogSSBjbGVhbiBtZW1v cnkgKi8KKyNkZWZpbmUgUEZfS1RIUkVBRAkweDAwMjAwMDAwCS8qIEkgYW0gYSBrZXJuZWwgdGhy ZWFkICovCisjZGVmaW5lIFBGX1JBTkRPTUlaRQkweDAwNDAwMDAwCS8qIHJhbmRvbWl6ZSB2aXJ0 dWFsIGFkZHJlc3Mgc3BhY2UgKi8KKyNkZWZpbmUgUEZfU1dBUFdSSVRFCTB4MDA4MDAwMDAJLyog QWxsb3dlZCB0byB3cml0ZSB0byBzd2FwICovCisjZGVmaW5lIFBGX1NQUkVBRF9QQUdFCTB4MDEw MDAwMDAJLyogU3ByZWFkIHBhZ2UgY2FjaGUgb3ZlciBjcHVzZXQgKi8KKyNkZWZpbmUgUEZfU1BS RUFEX1NMQUIJMHgwMjAwMDAwMAkvKiBTcHJlYWQgc29tZSBzbGFiIGNhY2hlcyBvdmVyIGNwdXNl dCAqLworI2RlZmluZSBQRl9USFJFQURfQk9VTkQJMHgwNDAwMDAwMAkvKiBUaHJlYWQgYm91bmQg dG8gc3BlY2lmaWMgY3B1ICovCisjZGVmaW5lIFBGX01DRV9FQVJMWSAgICAweDA4MDAwMDAwICAg ICAgLyogRWFybHkga2lsbCBmb3IgbWNlIHByb2Nlc3MgcG9saWN5ICovCisjZGVmaW5lIFBGX01F TVBPTElDWQkweDEwMDAwMDAwCS8qIE5vbi1kZWZhdWx0IE5VTUEgbWVtcG9saWN5ICovCisjZGVm aW5lIFBGX01VVEVYX1RFU1RFUgkweDIwMDAwMDAwCS8qIFRocmVhZCBiZWxvbmdzIHRvIHRoZSBy dCBtdXRleCB0ZXN0ZXIgKi8KKyNkZWZpbmUgUEZfRlJFRVpFUl9TS0lQCTB4NDAwMDAwMDAJLyog RnJlZXplciBzaG91bGQgbm90IGNvdW50IGl0IGFzIGZyZWV6YWJsZSAqLworCisvKgorICogT25s eSB0aGUgX2N1cnJlbnRfIHRhc2sgY2FuIHJlYWQvd3JpdGUgdG8gdHNrLT5mbGFncywgYnV0IG90 aGVyCisgKiB0YXNrcyBjYW4gYWNjZXNzIHRzay0+ZmxhZ3MgaW4gcmVhZG9ubHkgbW9kZSBmb3Ig ZXhhbXBsZQorICogd2l0aCB0c2tfdXNlZF9tYXRoIChsaWtlIGR1cmluZyB0aHJlYWRlZCBjb3Jl IGR1bXBpbmcpLgorICogVGhlcmUgaXMgaG93ZXZlciBhbiBleGNlcHRpb24gdG8gdGhpcyBydWxl IGR1cmluZyBwdHJhY2UKKyAqIG9yIGR1cmluZyBmb3JrOiB0aGUgcHRyYWNlciB0YXNrIGlzIGFs bG93ZWQgdG8gd3JpdGUgdG8gdGhlCisgKiBjaGlsZC0+ZmxhZ3Mgb2YgaXRzIHRyYWNlZCBjaGls ZCAoc2FtZSBnb2VzIGZvciBmb3JrLCB0aGUgcGFyZW50CisgKiBjYW4gd3JpdGUgdG8gdGhlIGNo aWxkLT5mbGFncyksIGJlY2F1c2Ugd2UncmUgZ3VhcmFudGVlZCB0aGUKKyAqIGNoaWxkIGlzIG5v dCBydW5uaW5nIGFuZCBpbiB0dXJuIG5vdCBjaGFuZ2luZyBjaGlsZC0+ZmxhZ3MKKyAqIGF0IHRo ZSBzYW1lIHRpbWUgdGhlIHBhcmVudCBkb2VzIGl0LgorICovCisjZGVmaW5lIGNsZWFyX3N0b3Bw ZWRfY2hpbGRfdXNlZF9tYXRoKGNoaWxkKSBkbyB7IChjaGlsZCktPmZsYWdzICY9IH5QRl9VU0VE X01BVEg7IH0gd2hpbGUgKDApCisjZGVmaW5lIHNldF9zdG9wcGVkX2NoaWxkX3VzZWRfbWF0aChj aGlsZCkgZG8geyAoY2hpbGQpLT5mbGFncyB8PSBQRl9VU0VEX01BVEg7IH0gd2hpbGUgKDApCisj ZGVmaW5lIGNsZWFyX3VzZWRfbWF0aCgpIGNsZWFyX3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKGN1 cnJlbnQpCisjZGVmaW5lIHNldF91c2VkX21hdGgoKSBzZXRfc3RvcHBlZF9jaGlsZF91c2VkX21h dGgoY3VycmVudCkKKyNkZWZpbmUgY29uZGl0aW9uYWxfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgo Y29uZGl0aW9uLCBjaGlsZCkgXAorCWRvIHsgKGNoaWxkKS0+ZmxhZ3MgJj0gflBGX1VTRURfTUFU SCwgKGNoaWxkKS0+ZmxhZ3MgfD0gKGNvbmRpdGlvbikgPyBQRl9VU0VEX01BVEggOiAwOyB9IHdo aWxlICgwKQorI2RlZmluZSBjb25kaXRpb25hbF91c2VkX21hdGgoY29uZGl0aW9uKSBcCisJY29u ZGl0aW9uYWxfc3RvcHBlZF9jaGlsZF91c2VkX21hdGgoY29uZGl0aW9uLCBjdXJyZW50KQorI2Rl ZmluZSBjb3B5X3RvX3N0b3BwZWRfY2hpbGRfdXNlZF9tYXRoKGNoaWxkKSBcCisJZG8geyAoY2hp bGQpLT5mbGFncyAmPSB+UEZfVVNFRF9NQVRILCAoY2hpbGQpLT5mbGFncyB8PSBjdXJyZW50LT5m bGFncyAmIFBGX1VTRURfTUFUSDsgfSB3aGlsZSAoMCkKKy8qIE5PVEU6IHRoaXMgd2lsbCByZXR1 cm4gMCBvciBQRl9VU0VEX01BVEgsIGl0IHdpbGwgbmV2ZXIgcmV0dXJuIDEgKi8KKyNkZWZpbmUg dHNrX3VzZWRfbWF0aChwKSAoKHApLT5mbGFncyAmIFBGX1VTRURfTUFUSCkKKyNkZWZpbmUgdXNl ZF9tYXRoKCkgdHNrX3VzZWRfbWF0aChjdXJyZW50KQorCisvKgorICogdGFzay0+am9iY3RsIGZs YWdzCisgKi8KKyNkZWZpbmUgSk9CQ1RMX1NUT1BfU0lHTUFTSwkweGZmZmYJLyogc2lnbnIgb2Yg dGhlIGxhc3QgZ3JvdXAgc3RvcCAqLworCisjZGVmaW5lIEpPQkNUTF9TVE9QX0RFUVVFVUVEX0JJ VCAxNgkvKiBzdG9wIHNpZ25hbCBkZXF1ZXVlZCAqLworI2RlZmluZSBKT0JDVExfU1RPUF9QRU5E SU5HX0JJVAkxNwkvKiB0YXNrIHNob3VsZCBzdG9wIGZvciBncm91cCBzdG9wICovCisjZGVmaW5l IEpPQkNUTF9TVE9QX0NPTlNVTUVfQklUCTE4CS8qIGNvbnN1bWUgZ3JvdXAgc3RvcCBjb3VudCAq LworI2RlZmluZSBKT0JDVExfVFJBUF9TVE9QX0JJVAkxOQkvKiB0cmFwIGZvciBTVE9QICovCisj ZGVmaW5lIEpPQkNUTF9UUkFQX05PVElGWV9CSVQJMjAJLyogdHJhcCBmb3IgTk9USUZZICovCisj ZGVmaW5lIEpPQkNUTF9UUkFQUElOR19CSVQJMjEJLyogc3dpdGNoaW5nIHRvIFRSQUNFRCAqLwor I2RlZmluZSBKT0JDVExfTElTVEVOSU5HX0JJVAkyMgkvKiBwdHJhY2VyIGlzIGxpc3RlbmluZyBm b3IgZXZlbnRzICovCisKKyNkZWZpbmUgSk9CQ1RMX1NUT1BfREVRVUVVRUQJKDEgPDwgSk9CQ1RM X1NUT1BfREVRVUVVRURfQklUKQorI2RlZmluZSBKT0JDVExfU1RPUF9QRU5ESU5HCSgxIDw8IEpP QkNUTF9TVE9QX1BFTkRJTkdfQklUKQorI2RlZmluZSBKT0JDVExfU1RPUF9DT05TVU1FCSgxIDw8 IEpPQkNUTF9TVE9QX0NPTlNVTUVfQklUKQorI2RlZmluZSBKT0JDVExfVFJBUF9TVE9QCSgxIDw8 IEpPQkNUTF9UUkFQX1NUT1BfQklUKQorI2RlZmluZSBKT0JDVExfVFJBUF9OT1RJRlkJKDEgPDwg Sk9CQ1RMX1RSQVBfTk9USUZZX0JJVCkKKyNkZWZpbmUgSk9CQ1RMX1RSQVBQSU5HCQkoMSA8PCBK T0JDVExfVFJBUFBJTkdfQklUKQorI2RlZmluZSBKT0JDVExfTElTVEVOSU5HCSgxIDw8IEpPQkNU TF9MSVNURU5JTkdfQklUKQorCisjZGVmaW5lIEpPQkNUTF9UUkFQX01BU0sJKEpPQkNUTF9UUkFQ X1NUT1AgfCBKT0JDVExfVFJBUF9OT1RJRlkpCisjZGVmaW5lIEpPQkNUTF9QRU5ESU5HX01BU0sJ KEpPQkNUTF9TVE9QX1BFTkRJTkcgfCBKT0JDVExfVFJBUF9NQVNLKQorCitleHRlcm4gYm9vbCB0 YXNrX3NldF9qb2JjdGxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJICAg IHVuc2lnbmVkIGludCBtYXNrKTsKK2V4dGVybiB2b2lkIHRhc2tfY2xlYXJfam9iY3RsX3RyYXBw aW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzayk7CitleHRlcm4gdm9pZCB0YXNrX2NsZWFyX2pv YmN0bF9wZW5kaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgICB1bnNpZ25l ZCBpbnQgbWFzayk7CisKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9SQ1UKKworI2RlZmluZSBSQ1Vf UkVBRF9VTkxPQ0tfQkxPQ0tFRCAoMSA8PCAwKSAvKiBibG9ja2VkIHdoaWxlIGluIFJDVSByZWFk LXNpZGUuICovCisjZGVmaW5lIFJDVV9SRUFEX1VOTE9DS19ORUVEX1FTICgxIDw8IDEpIC8qIFJD VSBjb3JlIG5lZWRzIENQVSByZXNwb25zZS4gKi8KKworc3RhdGljIGlubGluZSB2b2lkIHJjdV9j b3B5X3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXAtPnJjdV9yZWFkX2xvY2tf bmVzdGluZyA9IDA7CisJcC0+cmN1X3JlYWRfdW5sb2NrX3NwZWNpYWwgPSAwOworI2lmZGVmIENP TkZJR19UUkVFX1BSRUVNUFRfUkNVCisJcC0+cmN1X2Jsb2NrZWRfbm9kZSA9IE5VTEw7CisjZW5k aWYgLyogI2lmZGVmIENPTkZJR19UUkVFX1BSRUVNUFRfUkNVICovCisjaWZkZWYgQ09ORklHX1JD VV9CT09TVAorCXAtPnJjdV9ib29zdF9tdXRleCA9IE5VTEw7CisjZW5kaWYgLyogI2lmZGVmIENP TkZJR19SQ1VfQk9PU1QgKi8KKwlJTklUX0xJU1RfSEVBRCgmcC0+cmN1X25vZGVfZW50cnkpOwor fQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmN1X2NvcHlfcHJvY2VzcyhzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnApCit7Cit9CisKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorZXh0 ZXJuIHZvaWQgZG9fc2V0X2NwdXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkg ICAgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm5ld19tYXNrKTsKKworZXh0ZXJuIGludCBzZXRf Y3B1c19hbGxvd2VkX3B0cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJY29uc3Qgc3RydWN0 IGNwdW1hc2sgKm5ld19tYXNrKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgZG9fc2V0X2Nw dXNfYWxsb3dlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJICAgICAgY29uc3Qgc3RydWN0 IGNwdW1hc2sgKm5ld19tYXNrKQoreworfQorc3RhdGljIGlubGluZSBpbnQgc2V0X2NwdXNfYWxs b3dlZF9wdHIoc3RydWN0IHRhc2tfc3RydWN0ICpwLAorCQkJCSAgICAgICBjb25zdCBzdHJ1Y3Qg Y3B1bWFzayAqbmV3X21hc2spCit7CisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KDAsIG5ld19tYXNr KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBD T05GSUdfQ1BVTUFTS19PRkZTVEFDSworc3RhdGljIGlubGluZSBpbnQgc2V0X2NwdXNfYWxsb3dl ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdW1hc2tfdCBuZXdfbWFzaykKK3sKKwlyZXR1cm4g c2V0X2NwdXNfYWxsb3dlZF9wdHIocCwgJm5ld19tYXNrKTsKK30KKyNlbmRpZgorCisvKgorICog RG8gbm90IHVzZSBvdXRzaWRlIG9mIGFyY2hpdGVjdHVyZSBjb2RlIHdoaWNoIGtub3dzIGl0cyBs aW1pdGF0aW9ucy4KKyAqCisgKiBzY2hlZF9jbG9jaygpIGhhcyBubyBwcm9taXNlIG9mIG1vbm90 b25pY2l0eSBvciBib3VuZGVkIGRyaWZ0IGJldHdlZW4KKyAqIENQVXMsIHVzZSAod2hpY2ggeW91 IHNob3VsZCBub3QpIHJlcXVpcmVzIGRpc2FibGluZyBJUlFzLgorICoKKyAqIFBsZWFzZSB1c2Ug b25lIG9mIHRoZSB0aHJlZSBpbnRlcmZhY2VzIGJlbG93LgorICovCitleHRlcm4gdW5zaWduZWQg bG9uZyBsb25nIG5vdHJhY2Ugc2NoZWRfY2xvY2sodm9pZCk7CisvKgorICogU2VlIHRoZSBjb21t ZW50IGluIGtlcm5lbC9zY2hlZF9jbG9jay5jCisgKi8KK2V4dGVybiB1NjQgY3B1X2Nsb2NrKGlu dCBjcHUpOworZXh0ZXJuIHU2NCBsb2NhbF9jbG9jayh2b2lkKTsKK2V4dGVybiB1NjQgc2NoZWRf Y2xvY2tfY3B1KGludCBjcHUpOworCisKK2V4dGVybiB2b2lkIHNjaGVkX2Nsb2NrX2luaXQodm9p ZCk7CisKKyNpZm5kZWYgQ09ORklHX0hBVkVfVU5TVEFCTEVfU0NIRURfQ0xPQ0sKK3N0YXRpYyBp bmxpbmUgdm9pZCBzY2hlZF9jbG9ja190aWNrKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUg dm9pZCBzY2hlZF9jbG9ja19pZGxlX3NsZWVwX2V2ZW50KHZvaWQpCit7Cit9CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBzY2hlZF9jbG9ja19pZGxlX3dha2V1cF9ldmVudCh1NjQgZGVsdGFfbnMpCit7 Cit9CisjZWxzZQorLyoKKyAqIEFyY2hpdGVjdHVyZXMgY2FuIHNldCB0aGlzIHRvIDEgaWYgdGhl eSBoYXZlIHNwZWNpZmllZAorICogQ09ORklHX0hBVkVfVU5TVEFCTEVfU0NIRURfQ0xPQ0sgaW4g dGhlaXIgYXJjaCBLY29uZmlnLAorICogYnV0IHRoZW4gZHVyaW5nIGJvb3R1cCBpdCB0dXJucyBv dXQgdGhhdCBzY2hlZF9jbG9jaygpCisgKiBpcyByZWxpYWJsZSBhZnRlciBhbGw6CisgKi8KK2V4 dGVybiBpbnQgc2NoZWRfY2xvY2tfc3RhYmxlOworCitleHRlcm4gdm9pZCBzY2hlZF9jbG9ja190 aWNrKHZvaWQpOworZXh0ZXJuIHZvaWQgc2NoZWRfY2xvY2tfaWRsZV9zbGVlcF9ldmVudCh2b2lk KTsKK2V4dGVybiB2b2lkIHNjaGVkX2Nsb2NrX2lkbGVfd2FrZXVwX2V2ZW50KHU2NCBkZWx0YV9u cyk7CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCisvKgorICog QW4gaS9mIHRvIHJ1bnRpbWUgb3B0LWluIGZvciBpcnEgdGltZSBhY2NvdW50aW5nIGJhc2VkIG9m ZiBvZiBzY2hlZF9jbG9jay4KKyAqIFRoZSByZWFzb24gZm9yIHRoaXMgZXhwbGljaXQgb3B0LWlu IGlzIG5vdCB0byBoYXZlIHBlcmYgcGVuYWx0eSB3aXRoCisgKiBzbG93IHNjaGVkX2Nsb2Nrcy4K KyAqLworZXh0ZXJuIHZvaWQgZW5hYmxlX3NjaGVkX2Nsb2NrX2lycXRpbWUodm9pZCk7CitleHRl cm4gdm9pZCBkaXNhYmxlX3NjaGVkX2Nsb2NrX2lycXRpbWUodm9pZCk7CisjZWxzZQorc3RhdGlj IGlubGluZSB2b2lkIGVuYWJsZV9zY2hlZF9jbG9ja19pcnF0aW1lKHZvaWQpIHt9CitzdGF0aWMg aW5saW5lIHZvaWQgZGlzYWJsZV9zY2hlZF9jbG9ja19pcnF0aW1lKHZvaWQpIHt9CisjZW5kaWYK KworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZwordGFza19zY2hlZF9ydW50aW1lKHN0cnVjdCB0 YXNrX3N0cnVjdCAqdGFzayk7CisKKy8qIHNjaGVkX2V4ZWMgaXMgY2FsbGVkIGJ5IHByb2Nlc3Nl cyBwZXJmb3JtaW5nIGFuIGV4ZWMgKi8KKyNpZmRlZiBDT05GSUdfU01QCitleHRlcm4gdm9pZCBz Y2hlZF9leGVjKHZvaWQpOworI2Vsc2UKKyNkZWZpbmUgc2NoZWRfZXhlYygpICAge30KKyNlbmRp ZgorCitleHRlcm4gdm9pZCBzY2hlZF9jbG9ja19pZGxlX3NsZWVwX2V2ZW50KHZvaWQpOworZXh0 ZXJuIHZvaWQgc2NoZWRfY2xvY2tfaWRsZV93YWtldXBfZXZlbnQodTY0IGRlbHRhX25zKTsKKwor I2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorZXh0ZXJuIHZvaWQgaWRsZV90YXNrX2V4aXQodm9p ZCk7CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGlkbGVfdGFza19leGl0KHZvaWQpIHt9Cisj ZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX05PX0haKSAmJiBkZWZpbmVkKENPTkZJR19TTVAp CitleHRlcm4gdm9pZCB3YWtlX3VwX2lkbGVfY3B1KGludCBjcHUpOworI2Vsc2UKK3N0YXRpYyBp bmxpbmUgdm9pZCB3YWtlX3VwX2lkbGVfY3B1KGludCBjcHUpIHsgfQorI2VuZGlmCisKK2V4dGVy biB1bnNpZ25lZCBpbnQgc3lzY3RsX3NjaGVkX2xhdGVuY3k7CitleHRlcm4gdW5zaWduZWQgaW50 IHN5c2N0bF9zY2hlZF9taW5fZ3JhbnVsYXJpdHk7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0 bF9zY2hlZF93YWtldXBfZ3JhbnVsYXJpdHk7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9z Y2hlZF9jaGlsZF9ydW5zX2ZpcnN0OworCitlbnVtIHNjaGVkX3R1bmFibGVfc2NhbGluZyB7CisJ U0NIRURfVFVOQUJMRVNDQUxJTkdfTk9ORSwKKwlTQ0hFRF9UVU5BQkxFU0NBTElOR19MT0csCisJ U0NIRURfVFVOQUJMRVNDQUxJTkdfTElORUFSLAorCVNDSEVEX1RVTkFCTEVTQ0FMSU5HX0VORCwK K307CitleHRlcm4gZW51bSBzY2hlZF90dW5hYmxlX3NjYWxpbmcgc3lzY3RsX3NjaGVkX3R1bmFi bGVfc2NhbGluZzsKKworI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRworZXh0ZXJuIHVuc2lnbmVk IGludCBzeXNjdGxfc2NoZWRfbWlncmF0aW9uX2Nvc3Q7CitleHRlcm4gdW5zaWduZWQgaW50IHN5 c2N0bF9zY2hlZF9ucl9taWdyYXRlOworZXh0ZXJuIHVuc2lnbmVkIGludCBzeXNjdGxfc2NoZWRf dGltZV9hdmc7CitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF90aW1lcl9taWdyYXRpb247Citl eHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9zaGFyZXNfd2luZG93OworCitpbnQgc2No ZWRfcHJvY191cGRhdGVfaGFuZGxlcihzdHJ1Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRl LAorCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCwKKwkJbG9mZl90ICpwcG9z KTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRworc3RhdGljIGlubGluZSB1bnNp Z25lZCBpbnQgZ2V0X3N5c2N0bF90aW1lcl9taWdyYXRpb24odm9pZCkKK3sKKwlyZXR1cm4gc3lz Y3RsX3RpbWVyX21pZ3JhdGlvbjsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGlu dCBnZXRfc3lzY3RsX3RpbWVyX21pZ3JhdGlvbih2b2lkKQoreworCXJldHVybiAxOworfQorI2Vu ZGlmCitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9ydF9wZXJpb2Q7CitleHRlcm4g aW50IHN5c2N0bF9zY2hlZF9ydF9ydW50aW1lOworCitpbnQgc2NoZWRfcnRfaGFuZGxlcihzdHJ1 Y3QgY3RsX3RhYmxlICp0YWJsZSwgaW50IHdyaXRlLAorCQl2b2lkIF9fdXNlciAqYnVmZmVyLCBz aXplX3QgKmxlbnAsCisJCWxvZmZfdCAqcHBvcyk7CisKKyNpZmRlZiBDT05GSUdfU0NIRURfQVVU T0dST1VQCitleHRlcm4gdW5zaWduZWQgaW50IHN5c2N0bF9zY2hlZF9hdXRvZ3JvdXBfZW5hYmxl ZDsKKworZXh0ZXJuIHZvaWQgc2NoZWRfYXV0b2dyb3VwX2NyZWF0ZV9hdHRhY2goc3RydWN0IHRh c2tfc3RydWN0ICpwKTsKK2V4dGVybiB2b2lkIHNjaGVkX2F1dG9ncm91cF9kZXRhY2goc3RydWN0 IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiB2b2lkIHNjaGVkX2F1dG9ncm91cF9mb3JrKHN0cnVj dCBzaWduYWxfc3RydWN0ICpzaWcpOworZXh0ZXJuIHZvaWQgc2NoZWRfYXV0b2dyb3VwX2V4aXQo c3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyk7CisjaWZkZWYgQ09ORklHX1BST0NfRlMKK2V4dGVy biB2b2lkIHByb2Nfc2NoZWRfYXV0b2dyb3VwX3Nob3dfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnAsIHN0cnVjdCBzZXFfZmlsZSAqbSk7CitleHRlcm4gaW50IHByb2Nfc2NoZWRfYXV0b2dyb3Vw X3NldF9uaWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG5pY2UpOworI2VuZGlmCisjZWxz ZQorc3RhdGljIGlubGluZSB2b2lkIHNjaGVkX2F1dG9ncm91cF9jcmVhdGVfYXR0YWNoKHN0cnVj dCB0YXNrX3N0cnVjdCAqcCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgc2NoZWRfYXV0b2dyb3Vw X2RldGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHNj aGVkX2F1dG9ncm91cF9mb3JrKHN0cnVjdCBzaWduYWxfc3RydWN0ICpzaWcpIHsgfQorc3RhdGlj IGlubGluZSB2b2lkIHNjaGVkX2F1dG9ncm91cF9leGl0KHN0cnVjdCBzaWduYWxfc3RydWN0ICpz aWcpIHsgfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfQ0ZTX0JBTkRXSURUSAorZXh0ZXJuIHVu c2lnbmVkIGludCBzeXNjdGxfc2NoZWRfY2ZzX2JhbmR3aWR0aF9zbGljZTsKKyNlbmRpZgorCisj aWZkZWYgQ09ORklHX1JUX01VVEVYRVMKK2V4dGVybiBpbnQgcnRfbXV0ZXhfZ2V0cHJpbyhzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIHZvaWQgcnRfbXV0ZXhfc2V0cHJpbyhzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnAsIGludCBwcmlvKTsKK2V4dGVybiB2b2lkIHJ0X211dGV4X2FkanVzdF9w aShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworc3RhdGljIGlubGluZSBib29sIHRza19pc19waV9i bG9ja2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXJldHVybiB0c2stPnBpX2Jsb2Nr ZWRfb24gIT0gTlVMTDsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBydF9tdXRleF9nZXRw cmlvKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+bm9ybWFsX3ByaW87Cit9 CisjIGRlZmluZSBydF9tdXRleF9hZGp1c3RfcGkocCkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRp YyBpbmxpbmUgYm9vbCB0c2tfaXNfcGlfYmxvY2tlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykK K3sKKwlyZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYKKworZXh0ZXJuIGJvb2wgeWllbGRfdG8oc3Ry dWN0IHRhc2tfc3RydWN0ICpwLCBib29sIHByZWVtcHQpOworZXh0ZXJuIHZvaWQgc2V0X3VzZXJf bmljZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgbmljZSk7CitleHRlcm4gaW50IHRhc2tf cHJpbyhjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIGludCB0YXNrX25pY2Uo Y29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiBpbnQgY2FuX25pY2UoY29uc3Qg c3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBpbnQgbmljZSk7CitleHRlcm4gaW50IHRhc2tf Y3Vycihjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworZXh0ZXJuIGludCBpZGxlX2NwdShp bnQgY3B1KTsKK2V4dGVybiBpbnQgc2NoZWRfc2V0c2NoZWR1bGVyKHN0cnVjdCB0YXNrX3N0cnVj dCAqLCBpbnQsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKik7CitleHRlcm4g aW50IHNjaGVkX3NldHNjaGVkdWxlcl9ub2NoZWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBpbnQs CisJCQkJICAgICAgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICopOworZXh0ZXJuIHN0cnVjdCB0 YXNrX3N0cnVjdCAqaWRsZV90YXNrKGludCBjcHUpOworLyoqCisgKiBpc19pZGxlX3Rhc2sgLSBp cyB0aGUgc3BlY2lmaWVkIHRhc2sgYW4gaWRsZSB0YXNrPworICogQHA6IHRoZSB0YXNrIGluIHF1 ZXN0aW9uLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaXNfaWRsZV90YXNrKGNvbnN0IHN0cnVj dCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+cGlkID09IDA7Cit9CitleHRlcm4gc3Ry dWN0IHRhc2tfc3RydWN0ICpjdXJyX3Rhc2soaW50IGNwdSk7CitleHRlcm4gdm9pZCBzZXRfY3Vy cl90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKK3ZvaWQgeWllbGQodm9p ZCk7CisKKy8qCisgKiBUaGUgZGVmYXVsdCAoTGludXgpIGV4ZWN1dGlvbiBkb21haW4uCisgKi8K K2V4dGVybiBzdHJ1Y3QgZXhlY19kb21haW4JZGVmYXVsdF9leGVjX2RvbWFpbjsKKwordW5pb24g dGhyZWFkX3VuaW9uIHsKKwlzdHJ1Y3QgdGhyZWFkX2luZm8gdGhyZWFkX2luZm87CisJdW5zaWdu ZWQgbG9uZyBzdGFja1tUSFJFQURfU0laRS9zaXplb2YobG9uZyldOworfTsKKworI2lmbmRlZiBf X0hBVkVfQVJDSF9LU1RBQ0tfRU5ECitzdGF0aWMgaW5saW5lIGludCBrc3RhY2tfZW5kKHZvaWQg KmFkZHIpCit7CisJLyogUmVsaWFibGUgZW5kIG9mIHN0YWNrIGRldGVjdGlvbjoKKwkgKiBTb21l IEFQTSBiaW9zIHZlcnNpb25zIG1pc2FsaWduIHRoZSBzdGFjaworCSAqLworCXJldHVybiAhKCgo dW5zaWduZWQgbG9uZylhZGRyK3NpemVvZih2b2lkKiktMSkgJiAoVEhSRUFEX1NJWkUtc2l6ZW9m KHZvaWQqKSkpOworfQorI2VuZGlmCisKK2V4dGVybiB1bmlvbiB0aHJlYWRfdW5pb24gaW5pdF90 aHJlYWRfdW5pb247CitleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0IGluaXRfdGFzazsKKworZXh0 ZXJuIHN0cnVjdCAgIG1tX3N0cnVjdCBpbml0X21tOworCitleHRlcm4gc3RydWN0IHBpZF9uYW1l c3BhY2UgaW5pdF9waWRfbnM7CisKKy8qCisgKiBmaW5kIGEgdGFzayBieSBvbmUgb2YgaXRzIG51 bWVyaWNhbCBpZHMKKyAqCisgKiBmaW5kX3Rhc2tfYnlfcGlkX25zKCk6CisgKiAgICAgIGZpbmRz IGEgdGFzayBieSBpdHMgcGlkIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlCisgKiBmaW5kX3Rh c2tfYnlfdnBpZCgpOgorICogICAgICBmaW5kcyBhIHRhc2sgYnkgaXRzIHZpcnR1YWwgcGlkCisg KgorICogc2VlIGFsc28gZmluZF92cGlkKCkgZXRjIGluIGluY2x1ZGUvbGludXgvcGlkLmgKKyAq LworCitleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpmaW5kX3Rhc2tfYnlfdnBpZChwaWRfdCBu cik7CitleHRlcm4gc3RydWN0IHRhc2tfc3RydWN0ICpmaW5kX3Rhc2tfYnlfcGlkX25zKHBpZF90 IG5yLAorCQlzdHJ1Y3QgcGlkX25hbWVzcGFjZSAqbnMpOworCitleHRlcm4gdm9pZCBfX3NldF9z cGVjaWFsX3BpZHMoc3RydWN0IHBpZCAqcGlkKTsKKworLyogcGVyLVVJRCBwcm9jZXNzIGNoYXJn aW5nLiAqLworZXh0ZXJuIHN0cnVjdCB1c2VyX3N0cnVjdCAqIGFsbG9jX3VpZChzdHJ1Y3QgdXNl cl9uYW1lc3BhY2UgKiwgdWlkX3QpOworc3RhdGljIGlubGluZSBzdHJ1Y3QgdXNlcl9zdHJ1Y3Qg KmdldF91aWQoc3RydWN0IHVzZXJfc3RydWN0ICp1KQoreworCWF0b21pY19pbmMoJnUtPl9fY291 bnQpOworCXJldHVybiB1OworfQorZXh0ZXJuIHZvaWQgZnJlZV91aWQoc3RydWN0IHVzZXJfc3Ry dWN0ICopOworZXh0ZXJuIHZvaWQgcmVsZWFzZV91aWRzKHN0cnVjdCB1c2VyX25hbWVzcGFjZSAq bnMpOworCisjaW5jbHVkZSA8YXNtL2N1cnJlbnQuaD4KKworZXh0ZXJuIHZvaWQgeHRpbWVfdXBk YXRlKHVuc2lnbmVkIGxvbmcgdGlja3MpOworCitleHRlcm4gaW50IHdha2VfdXBfc3RhdGUoc3Ry dWN0IHRhc2tfc3RydWN0ICp0c2ssIHVuc2lnbmVkIGludCBzdGF0ZSk7CitleHRlcm4gaW50IHdh a2VfdXBfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CitleHRlcm4gdm9pZCB3YWtl X3VwX25ld190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKyNpZmRlZiBDT05GSUdfU01Q CisgZXh0ZXJuIHZvaWQga2lja19wcm9jZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKyNl bHNlCisgc3RhdGljIGlubGluZSB2b2lkIGtpY2tfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnRzaykgeyB9CisjZW5kaWYKK2V4dGVybiB2b2lkIHNjaGVkX2Zvcmsoc3RydWN0IHRhc2tfc3Ry dWN0ICpwKTsKK2V4dGVybiB2b2lkIHNjaGVkX2RlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsK KworZXh0ZXJuIHZvaWQgcHJvY19jYWNoZXNfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZsdXNo X3NpZ25hbHMoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQgX19mbHVzaF9zaWdu YWxzKHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIGlnbm9yZV9zaWduYWxzKHN0 cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiB2b2lkIGZsdXNoX3NpZ25hbF9oYW5kbGVycyhz dHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50IGZvcmNlX2RlZmF1bHQpOworZXh0ZXJuIGludCBkZXF1 ZXVlX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc2lnc2V0X3QgKm1hc2ssIHNpZ2lu Zm9fdCAqaW5mbyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGRlcXVldWVfc2lnbmFsX2xvY2soc3Ry dWN0IHRhc2tfc3RydWN0ICp0c2ssIHNpZ3NldF90ICptYXNrLCBzaWdpbmZvX3QgKmluZm8pCit7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrX2lycXNhdmUo JnRzay0+c2lnaGFuZC0+c2lnbG9jaywgZmxhZ3MpOworCXJldCA9IGRlcXVldWVfc2lnbmFsKHRz aywgbWFzaywgaW5mbyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHNrLT5zaWdoYW5kLT5z aWdsb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitleHRlcm4gdm9pZCBibG9ja19h bGxfc2lnbmFscyhpbnQgKCpub3RpZmllcikodm9pZCAqcHJpdiksIHZvaWQgKnByaXYsCisJCQkg ICAgICBzaWdzZXRfdCAqbWFzayk7CitleHRlcm4gdm9pZCB1bmJsb2NrX2FsbF9zaWduYWxzKHZv aWQpOworZXh0ZXJuIHZvaWQgcmVsZWFzZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHApOwor ZXh0ZXJuIGludCBzZW5kX3NpZ19pbmZvKGludCwgc3RydWN0IHNpZ2luZm8gKiwgc3RydWN0IHRh c2tfc3RydWN0ICopOworZXh0ZXJuIGludCBmb3JjZV9zaWdzZWd2KGludCwgc3RydWN0IHRhc2tf c3RydWN0ICopOworZXh0ZXJuIGludCBmb3JjZV9zaWdfaW5mbyhpbnQsIHN0cnVjdCBzaWdpbmZv ICosIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiBpbnQgX19raWxsX3BncnBfaW5mbyhp bnQgc2lnLCBzdHJ1Y3Qgc2lnaW5mbyAqaW5mbywgc3RydWN0IHBpZCAqcGdycCk7CitleHRlcm4g aW50IGtpbGxfcGlkX2luZm8oaW50IHNpZywgc3RydWN0IHNpZ2luZm8gKmluZm8sIHN0cnVjdCBw aWQgKnBpZCk7CitleHRlcm4gaW50IGtpbGxfcGlkX2luZm9fYXNfY3JlZChpbnQsIHN0cnVjdCBz aWdpbmZvICosIHN0cnVjdCBwaWQgKiwKKwkJCQljb25zdCBzdHJ1Y3QgY3JlZCAqLCB1MzIpOwor ZXh0ZXJuIGludCBraWxsX3BncnAoc3RydWN0IHBpZCAqcGlkLCBpbnQgc2lnLCBpbnQgcHJpdik7 CitleHRlcm4gaW50IGtpbGxfcGlkKHN0cnVjdCBwaWQgKnBpZCwgaW50IHNpZywgaW50IHByaXYp OworZXh0ZXJuIGludCBraWxsX3Byb2NfaW5mbyhpbnQsIHN0cnVjdCBzaWdpbmZvICosIHBpZF90 KTsKK2V4dGVybiBfX211c3RfY2hlY2sgYm9vbCBkb19ub3RpZnlfcGFyZW50KHN0cnVjdCB0YXNr X3N0cnVjdCAqLCBpbnQpOworZXh0ZXJuIHZvaWQgX193YWtlX3VwX3BhcmVudChzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50KTsKK2V4dGVybiB2b2lkIGZv cmNlX3NpZyhpbnQsIHN0cnVjdCB0YXNrX3N0cnVjdCAqKTsKK2V4dGVybiBpbnQgc2VuZF9zaWco aW50LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50KTsKK2V4dGVybiBpbnQgemFwX290aGVyX3Ro cmVhZHMoc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKK2V4dGVybiBzdHJ1Y3Qgc2lncXVldWUgKnNp Z3F1ZXVlX2FsbG9jKHZvaWQpOworZXh0ZXJuIHZvaWQgc2lncXVldWVfZnJlZShzdHJ1Y3Qgc2ln cXVldWUgKik7CitleHRlcm4gaW50IHNlbmRfc2lncXVldWUoc3RydWN0IHNpZ3F1ZXVlICosICBz dHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50IGdyb3VwKTsKK2V4dGVybiBpbnQgZG9fc2lnYWN0aW9u KGludCwgc3RydWN0IGtfc2lnYWN0aW9uICosIHN0cnVjdCBrX3NpZ2FjdGlvbiAqKTsKK2V4dGVy biBpbnQgZG9fc2lnYWx0c3RhY2soY29uc3Qgc3RhY2tfdCBfX3VzZXIgKiwgc3RhY2tfdCBfX3Vz ZXIgKiwgdW5zaWduZWQgbG9uZyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGtpbGxfY2FkX3BpZChp bnQgc2lnLCBpbnQgcHJpdikKK3sKKwlyZXR1cm4ga2lsbF9waWQoY2FkX3BpZCwgc2lnLCBwcml2 KTsKK30KKworLyogVGhlc2UgY2FuIGJlIHRoZSBzZWNvbmQgYXJnIHRvIHNlbmRfc2lnX2luZm8v c2VuZF9ncm91cF9zaWdfaW5mby4gICovCisjZGVmaW5lIFNFTkRfU0lHX05PSU5GTyAoKHN0cnVj dCBzaWdpbmZvICopIDApCisjZGVmaW5lIFNFTkRfU0lHX1BSSVYJKChzdHJ1Y3Qgc2lnaW5mbyAq KSAxKQorI2RlZmluZSBTRU5EX1NJR19GT1JDRUQJKChzdHJ1Y3Qgc2lnaW5mbyAqKSAyKQorCisv KgorICogVHJ1ZSBpZiB3ZSBhcmUgb24gdGhlIGFsdGVybmF0ZSBzaWduYWwgc3RhY2suCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50IG9uX3NpZ19zdGFjayh1bnNpZ25lZCBsb25nIHNwKQoreworI2lm ZGVmIENPTkZJR19TVEFDS19HUk9XU1VQCisJcmV0dXJuIHNwID49IGN1cnJlbnQtPnNhc19zc19z cCAmJgorCQlzcCAtIGN1cnJlbnQtPnNhc19zc19zcCA8IGN1cnJlbnQtPnNhc19zc19zaXplOwor I2Vsc2UKKwlyZXR1cm4gc3AgPiBjdXJyZW50LT5zYXNfc3Nfc3AgJiYKKwkJc3AgLSBjdXJyZW50 LT5zYXNfc3Nfc3AgPD0gY3VycmVudC0+c2FzX3NzX3NpemU7CisjZW5kaWYKK30KKworc3RhdGlj IGlubGluZSBpbnQgc2FzX3NzX2ZsYWdzKHVuc2lnbmVkIGxvbmcgc3ApCit7CisJcmV0dXJuIChj dXJyZW50LT5zYXNfc3Nfc2l6ZSA9PSAwID8gU1NfRElTQUJMRQorCQk6IG9uX3NpZ19zdGFjayhz cCkgPyBTU19PTlNUQUNLIDogMCk7Cit9CisKKy8qCisgKiBSb3V0aW5lcyBmb3IgaGFuZGxpbmcg bW1fc3RydWN0cworICovCitleHRlcm4gc3RydWN0IG1tX3N0cnVjdCAqIG1tX2FsbG9jKHZvaWQp OworCisvKiBtbWRyb3AgZHJvcHMgdGhlIG1tIGFuZCB0aGUgcGFnZSB0YWJsZXMgKi8KK2V4dGVy biB2b2lkIF9fbW1kcm9wKHN0cnVjdCBtbV9zdHJ1Y3QgKik7CitzdGF0aWMgaW5saW5lIHZvaWQg bW1kcm9wKHN0cnVjdCBtbV9zdHJ1Y3QgKiBtbSkKK3sKKwlpZiAodW5saWtlbHkoYXRvbWljX2Rl Y19hbmRfdGVzdCgmbW0tPm1tX2NvdW50KSkpCisJCV9fbW1kcm9wKG1tKTsKK30KKworLyogbW1w dXQgZ2V0cyByaWQgb2YgdGhlIG1hcHBpbmdzIGFuZCBhbGwgdXNlci1zcGFjZSAqLworZXh0ZXJu IHZvaWQgbW1wdXQoc3RydWN0IG1tX3N0cnVjdCAqKTsKKy8qIEdyYWIgYSByZWZlcmVuY2UgdG8g YSB0YXNrJ3MgbW0sIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGdvaW5nIGF3YXkgKi8KK2V4dGVybiBz dHJ1Y3QgbW1fc3RydWN0ICpnZXRfdGFza19tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spOwor LyoKKyAqIEdyYWIgYSByZWZlcmVuY2UgdG8gYSB0YXNrJ3MgbW0sIGlmIGl0IGlzIG5vdCBhbHJl YWR5IGdvaW5nIGF3YXkKKyAqIGFuZCBwdHJhY2VfbWF5X2FjY2VzcyB3aXRoIHRoZSBtb2RlIHBh cmFtZXRlciBwYXNzZWQgdG8gaXQKKyAqIHN1Y2NlZWRzLgorICovCitleHRlcm4gc3RydWN0IG1t X3N0cnVjdCAqbW1fYWNjZXNzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgdW5zaWduZWQgaW50 IG1vZGUpOworLyogUmVtb3ZlIHRoZSBjdXJyZW50IHRhc2tzIHN0YWxlIHJlZmVyZW5jZXMgdG8g dGhlIG9sZCBtbV9zdHJ1Y3QgKi8KK2V4dGVybiB2b2lkIG1tX3JlbGVhc2Uoc3RydWN0IHRhc2tf c3RydWN0ICosIHN0cnVjdCBtbV9zdHJ1Y3QgKik7CisvKiBBbGxvY2F0ZSBhIG5ldyBtbSBzdHJ1 Y3R1cmUgYW5kIGNvcHkgY29udGVudHMgZnJvbSB0c2stPm1tICovCitleHRlcm4gc3RydWN0IG1t X3N0cnVjdCAqZHVwX21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKworZXh0ZXJuIGludCBj b3B5X3RocmVhZCh1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLCB1bnNpZ25lZCBsb25nLAor CQkJc3RydWN0IHRhc2tfc3RydWN0ICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQg Zmx1c2hfdGhyZWFkKHZvaWQpOworZXh0ZXJuIHZvaWQgZXhpdF90aHJlYWQodm9pZCk7CisKK2V4 dGVybiB2b2lkIGV4aXRfZmlsZXMoc3RydWN0IHRhc2tfc3RydWN0ICopOworZXh0ZXJuIHZvaWQg X19jbGVhbnVwX3NpZ2hhbmQoc3RydWN0IHNpZ2hhbmRfc3RydWN0ICopOworCitleHRlcm4gdm9p ZCBleGl0X2l0aW1lcnMoc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKik7CitleHRlcm4gdm9pZCBmbHVz aF9pdGltZXJfc2lnbmFscyh2b2lkKTsKKworZXh0ZXJuIHZvaWQgZG9fZ3JvdXBfZXhpdChpbnQp OworCitleHRlcm4gdm9pZCBkYWVtb25pemUoY29uc3QgY2hhciAqLCAuLi4pOworZXh0ZXJuIGlu dCBhbGxvd19zaWduYWwoaW50KTsKK2V4dGVybiBpbnQgZGlzYWxsb3dfc2lnbmFsKGludCk7CisK K2V4dGVybiBpbnQgZG9fZXhlY3ZlKGNvbnN0IGNoYXIgKiwKKwkJICAgICBjb25zdCBjaGFyIF9f dXNlciAqIGNvbnN0IF9fdXNlciAqLAorCQkgICAgIGNvbnN0IGNoYXIgX191c2VyICogY29uc3Qg X191c2VyICosIHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIGxvbmcgZG9fZm9yayh1bnNpZ25l ZCBsb25nLCB1bnNpZ25lZCBsb25nLCBzdHJ1Y3QgcHRfcmVncyAqLCB1bnNpZ25lZCBsb25nLCBp bnQgX191c2VyICosIGludCBfX3VzZXIgKik7CitzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZvcmtfaWRs ZShpbnQpOworCitleHRlcm4gdm9pZCBzZXRfdGFza19jb21tKHN0cnVjdCB0YXNrX3N0cnVjdCAq dHNrLCBjaGFyICpmcm9tKTsKK2V4dGVybiBjaGFyICpnZXRfdGFza19jb21tKGNoYXIgKnRvLCBz dHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayk7CisKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIHNjaGVk dWxlcl9pcGkodm9pZCk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB3YWl0X3Rhc2tfaW5hY3RpdmUo c3RydWN0IHRhc2tfc3RydWN0ICosIGxvbmcgbWF0Y2hfc3RhdGUpOworI2Vsc2UKK3N0YXRpYyBp bmxpbmUgdm9pZCBzY2hlZHVsZXJfaXBpKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB1bnNpZ25l ZCBsb25nIHdhaXRfdGFza19pbmFjdGl2ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkJCSAg ICAgICBsb25nIG1hdGNoX3N0YXRlKQoreworCXJldHVybiAxOworfQorI2VuZGlmCisKKyNkZWZp bmUgbmV4dF90YXNrKHApIFwKKwlsaXN0X2VudHJ5X3JjdSgocCktPnRhc2tzLm5leHQsIHN0cnVj dCB0YXNrX3N0cnVjdCwgdGFza3MpCisKKyNkZWZpbmUgZm9yX2VhY2hfcHJvY2VzcyhwKSBcCisJ Zm9yIChwID0gJmluaXRfdGFzayA7IChwID0gbmV4dF90YXNrKHApKSAhPSAmaW5pdF90YXNrIDsg KQorCitleHRlcm4gYm9vbCBjdXJyZW50X2lzX3NpbmdsZV90aHJlYWRlZCh2b2lkKTsKKworLyoK KyAqIENhcmVmdWw6IGRvX2VhY2hfdGhyZWFkL3doaWxlX2VhY2hfdGhyZWFkIGlzIGEgZG91Ymxl IGxvb3Agc28KKyAqICAgICAgICAgICdicmVhaycgd2lsbCBub3Qgd29yayBhcyBleHBlY3RlZCAt IHVzZSBnb3RvIGluc3RlYWQuCisgKi8KKyNkZWZpbmUgZG9fZWFjaF90aHJlYWQoZywgdCkgXAor CWZvciAoZyA9IHQgPSAmaW5pdF90YXNrIDsgKGcgPSB0ID0gbmV4dF90YXNrKGcpKSAhPSAmaW5p dF90YXNrIDsgKSBkbworCisjZGVmaW5lIHdoaWxlX2VhY2hfdGhyZWFkKGcsIHQpIFwKKwl3aGls ZSAoKHQgPSBuZXh0X3RocmVhZCh0KSkgIT0gZykKKworc3RhdGljIGlubGluZSBpbnQgZ2V0X25y X3RocmVhZHMoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJcmV0dXJuIHRzay0+c2lnbmFs LT5ucl90aHJlYWRzOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGhyZWFkX2dyb3VwX2xlYWRl cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHAtPmV4aXRfc2lnbmFsID49IDA7 Cit9CisKKy8qIERvIHRvIHRoZSBpbnNhbml0aWVzIG9mIGRlX3RocmVhZCBpdCBpcyBwb3NzaWJs ZSBmb3IgYSBwcm9jZXNzCisgKiB0byBoYXZlIHRoZSBwaWQgb2YgdGhlIHRocmVhZCBncm91cCBs ZWFkZXIgd2l0aG91dCBhY3R1YWxseSBiZWluZworICogdGhlIHRocmVhZCBncm91cCBsZWFkZXIu ICBGb3IgaXRlcmF0aW9uIHRocm91Z2ggdGhlIHBpZHMgaW4gcHJvYworICogYWxsIHdlIGNhcmUg YWJvdXQgaXMgdGhhdCB3ZSBoYXZlIGEgdGFzayB3aXRoIHRoZSBhcHByb3ByaWF0ZQorICogcGlk LCB3ZSBkb24ndCBhY3R1YWxseSBjYXJlIGlmIHdlIGhhdmUgdGhlIHJpZ2h0IHRhc2suCisgKi8K K3N0YXRpYyBpbmxpbmUgaW50IGhhc19ncm91cF9sZWFkZXJfcGlkKHN0cnVjdCB0YXNrX3N0cnVj dCAqcCkKK3sKKwlyZXR1cm4gcC0+cGlkID09IHAtPnRnaWQ7Cit9CisKK3N0YXRpYyBpbmxpbmUK K2ludCBzYW1lX3RocmVhZF9ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAxLCBzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnAyKQoreworCXJldHVybiBwMS0+dGdpZCA9PSBwMi0+dGdpZDsKK30KKworc3Rh dGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfdGhyZWFkKGNvbnN0IHN0cnVjdCB0 YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gbGlzdF9lbnRyeV9yY3UocC0+dGhyZWFkX2dyb3Vw Lm5leHQsCisJCQkgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZF9ncm91cCk7Cit9CisK K3N0YXRpYyBpbmxpbmUgaW50IHRocmVhZF9ncm91cF9lbXB0eShzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnApCit7CisJcmV0dXJuIGxpc3RfZW1wdHkoJnAtPnRocmVhZF9ncm91cCk7Cit9CisKKyNkZWZp bmUgZGVsYXlfZ3JvdXBfbGVhZGVyKHApIFwKKwkJKHRocmVhZF9ncm91cF9sZWFkZXIocCkgJiYg IXRocmVhZF9ncm91cF9lbXB0eShwKSkKKworLyoKKyAqIFByb3RlY3RzIC0+ZnMsIC0+ZmlsZXMs IC0+bW0sIC0+Z3JvdXBfaW5mbywgLT5jb21tLCBrZXlyaW5nCisgKiBzdWJzY3JpcHRpb25zIGFu ZCBzeW5jaHJvbmlzZXMgd2l0aCB3YWl0NCgpLiAgQWxzbyB1c2VkIGluIHByb2Nmcy4gIEFsc28K KyAqIHBpbnMgdGhlIGZpbmFsIHJlbGVhc2Ugb2YgdGFzay5pb19jb250ZXh0LiAgQWxzbyBwcm90 ZWN0cyAtPmNwdXNldCBhbmQKKyAqIC0+Y2dyb3VwLnN1YnN5c1tdLiBBbmQgLT52Zm9ya19kb25l LgorICoKKyAqIE5lc3RzIGJvdGggaW5zaWRlIGFuZCBvdXRzaWRlIG9mIHJlYWRfbG9jaygmdGFz a2xpc3RfbG9jaykuCisgKiBJdCBtdXN0IG5vdCBiZSBuZXN0ZWQgd2l0aCB3cml0ZV9sb2NrX2ly cSgmdGFza2xpc3RfbG9jayksCisgKiBuZWl0aGVyIGluc2lkZSBub3Igb3V0c2lkZS4KKyAqLwor c3RhdGljIGlubGluZSB2b2lkIHRhc2tfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJ c3Bpbl9sb2NrKCZwLT5hbGxvY19sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRhc2tf dW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlzcGluX3VubG9jaygmcC0+YWxsb2Nf bG9jayk7Cit9CisKK2V4dGVybiBzdHJ1Y3Qgc2lnaGFuZF9zdHJ1Y3QgKl9fbG9ja190YXNrX3Np Z2hhbmQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJCQkJdW5zaWduZWQgbG9uZyAqZmxh Z3MpOworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzaWdoYW5kX3N0cnVjdCAqbG9ja190YXNrX3Np Z2hhbmQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJCQkgICAgICAgdW5zaWduZWQgbG9u ZyAqZmxhZ3MpCit7CisJc3RydWN0IHNpZ2hhbmRfc3RydWN0ICpyZXQ7CisKKwlyZXQgPSBfX2xv Y2tfdGFza19zaWdoYW5kKHRzaywgZmxhZ3MpOworCSh2b2lkKV9fY29uZF9sb2NrKCZ0c2stPnNp Z2hhbmQtPnNpZ2xvY2ssIHJldCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlubGluZSB2 b2lkIHVubG9ja190YXNrX3NpZ2hhbmQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCisJCQkJCQl1 bnNpZ25lZCBsb25nICpmbGFncykKK3sKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c2stPnNp Z2hhbmQtPnNpZ2xvY2ssICpmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQUworc3Rh dGljIGlubGluZSB2b2lkIHRocmVhZGdyb3VwX2NoYW5nZV9iZWdpbihzdHJ1Y3QgdGFza19zdHJ1 Y3QgKnRzaykKK3sKKwlkb3duX3JlYWQoJnRzay0+c2lnbmFsLT5ncm91cF9yd3NlbSk7Cit9Citz dGF0aWMgaW5saW5lIHZvaWQgdGhyZWFkZ3JvdXBfY2hhbmdlX2VuZChzdHJ1Y3QgdGFza19zdHJ1 Y3QgKnRzaykKK3sKKwl1cF9yZWFkKCZ0c2stPnNpZ25hbC0+Z3JvdXBfcndzZW0pOworfQorCisv KioKKyAqIHRocmVhZGdyb3VwX2xvY2sgLSBsb2NrIHRocmVhZGdyb3VwCisgKiBAdHNrOiBtZW1i ZXIgdGFzayBvZiB0aGUgdGhyZWFkZ3JvdXAgdG8gbG9jaworICoKKyAqIExvY2sgdGhlIHRocmVh ZGdyb3VwIEB0c2sgYmVsb25ncyB0by4gIE5vIG5ldyB0YXNrIGlzIGFsbG93ZWQgdG8gZW50ZXIK KyAqIGFuZCBtZW1iZXIgdGFza3MgYXJlbid0IGFsbG93ZWQgdG8gZXhpdCAoYXMgaW5kaWNhdGVk IGJ5IFBGX0VYSVRJTkcpIG9yCisgKiBwZXJmb3JtIGV4ZWMuICBUaGlzIGlzIHVzZWZ1bCBmb3Ig Y2FzZXMgd2hlcmUgdGhlIHRocmVhZGdyb3VwIG5lZWRzIHRvCisgKiBzdGF5IHN0YWJsZSBhY3Jv c3MgYmxvY2thYmxlIG9wZXJhdGlvbnMuCisgKgorICogZm9yayBhbmQgZXhpdCBwYXRocyBleHBs aWNpdGx5IGNhbGwgdGhyZWFkZ3JvdXBfY2hhbmdlX3tiZWdpbnxlbmR9KCkgZm9yCisgKiBzeW5j aHJvbml6YXRpb24uICBXaGlsZSBoZWxkLCBubyBuZXcgdGFzayB3aWxsIGJlIGFkZGVkIHRvIHRo cmVhZGdyb3VwCisgKiBhbmQgbm8gZXhpc3RpbmcgbGl2ZSB0YXNrIHdpbGwgaGF2ZSBpdHMgUEZf RVhJVElORyBzZXQuCisgKgorICogRHVyaW5nIGV4ZWMsIGEgdGFzayBnb2VzIGFuZCBwdXRzIGl0 cyB0aHJlYWQgZ3JvdXAgdGhyb3VnaCB1bnVzdWFsCisgKiBjaGFuZ2VzLiAgQWZ0ZXIgZGUtdGhy ZWFkaW5nLCBleGNsdXNpdmUgYWNjZXNzIGlzIGFzc3VtZWQgdG8gcmVzb3VyY2VzCisgKiB3aGlj aCBhcmUgdXN1YWxseSBzaGFyZWQgYnkgdGFza3MgaW4gdGhlIHNhbWUgZ3JvdXAgLSBlLmcuIHNp Z2hhbmQgbWF5CisgKiBiZSByZXBsYWNlZCB3aXRoIGEgbmV3IG9uZS4gIEFsc28sIHRoZSBleGVj J2luZyB0YXNrIHRha2VzIG92ZXIgZ3JvdXAKKyAqIGxlYWRlciByb2xlIGluY2x1ZGluZyBpdHMg cGlkLiAgRXhjbHVkZSB0aGVzZSBjaGFuZ2VzIHdoaWxlIGxvY2tlZCBieQorICogZ3JhYmJpbmcg Y3JlZF9ndWFyZF9tdXRleCB3aGljaCBpcyB1c2VkIHRvIHN5bmNocm9uaXplIGV4ZWMgcGF0aC4K KyAqLworc3RhdGljIGlubGluZSB2b2lkIHRocmVhZGdyb3VwX2xvY2soc3RydWN0IHRhc2tfc3Ry dWN0ICp0c2spCit7CisJLyoKKwkgKiBleGVjIHVzZXMgZXhpdCBmb3IgZGUtdGhyZWFkaW5nIG5l c3RpbmcgZ3JvdXBfcndzZW0gaW5zaWRlCisJICogY3JlZF9ndWFyZF9tdXRleC4gR3JhYiBjcmVk X2d1YXJkX211dGV4IGZpcnN0LgorCSAqLworCW11dGV4X2xvY2soJnRzay0+c2lnbmFsLT5jcmVk X2d1YXJkX211dGV4KTsKKwlkb3duX3dyaXRlKCZ0c2stPnNpZ25hbC0+Z3JvdXBfcndzZW0pOwor fQorCisvKioKKyAqIHRocmVhZGdyb3VwX3VubG9jayAtIHVubG9jayB0aHJlYWRncm91cAorICog QHRzazogbWVtYmVyIHRhc2sgb2YgdGhlIHRocmVhZGdyb3VwIHRvIHVubG9jaworICoKKyAqIFJl dmVyc2UgdGhyZWFkZ3JvdXBfbG9jaygpLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGhyZWFk Z3JvdXBfdW5sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQoreworCXVwX3dyaXRlKCZ0c2st PnNpZ25hbC0+Z3JvdXBfcndzZW0pOworCW11dGV4X3VubG9jaygmdHNrLT5zaWduYWwtPmNyZWRf Z3VhcmRfbXV0ZXgpOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aHJlYWRncm91cF9j aGFuZ2VfYmVnaW4oc3RydWN0IHRhc2tfc3RydWN0ICp0c2spIHt9CitzdGF0aWMgaW5saW5lIHZv aWQgdGhyZWFkZ3JvdXBfY2hhbmdlX2VuZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykge30KK3N0 YXRpYyBpbmxpbmUgdm9pZCB0aHJlYWRncm91cF9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNr KSB7fQorc3RhdGljIGlubGluZSB2b2lkIHRocmVhZGdyb3VwX3VubG9jayhzdHJ1Y3QgdGFza19z dHJ1Y3QgKnRzaykge30KKyNlbmRpZgorCisjaWZuZGVmIF9fSEFWRV9USFJFQURfRlVOQ1RJT05T CisKKyNkZWZpbmUgdGFza190aHJlYWRfaW5mbyh0YXNrKQkoKHN0cnVjdCB0aHJlYWRfaW5mbyAq KSh0YXNrKS0+c3RhY2spCisjZGVmaW5lIHRhc2tfc3RhY2tfcGFnZSh0YXNrKQkoKHRhc2spLT5z dGFjaykKKworc3RhdGljIGlubGluZSB2b2lkIHNldHVwX3RocmVhZF9zdGFjayhzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqb3JnKQoreworCSp0YXNrX3RocmVhZF9p bmZvKHApID0gKnRhc2tfdGhyZWFkX2luZm8ob3JnKTsKKwl0YXNrX3RocmVhZF9pbmZvKHApLT50 YXNrID0gcDsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nICplbmRfb2Zfc3RhY2so c3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiAodW5zaWduZWQgbG9uZyAqKSh0YXNr X3RocmVhZF9pbmZvKHApICsgMSk7Cit9CisKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIGludCBv YmplY3RfaXNfb25fc3RhY2sodm9pZCAqb2JqKQoreworCXZvaWQgKnN0YWNrID0gdGFza19zdGFj a19wYWdlKGN1cnJlbnQpOworCisJcmV0dXJuIChvYmogPj0gc3RhY2spICYmIChvYmogPCAoc3Rh Y2sgKyBUSFJFQURfU0laRSkpOworfQorCitleHRlcm4gdm9pZCB0aHJlYWRfaW5mb19jYWNoZV9p bml0KHZvaWQpOworCisjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGxvbmcgc3RhY2tfbm90X3VzZWQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQor eworCXVuc2lnbmVkIGxvbmcgKm4gPSBlbmRfb2Zfc3RhY2socCk7CisKKwlkbyB7IAkvKiBTa2lw IG92ZXIgY2FuYXJ5ICovCisJCW4rKzsKKwl9IHdoaWxlICghKm4pOworCisJcmV0dXJuICh1bnNp Z25lZCBsb25nKW4gLSAodW5zaWduZWQgbG9uZyllbmRfb2Zfc3RhY2socCk7Cit9CisjZW5kaWYK KworLyogc2V0IHRocmVhZCBmbGFncyBpbiBvdGhlciB0YXNrJ3Mgc3RydWN0dXJlcworICogLSBz ZWUgYXNtL3RocmVhZF9pbmZvLmggZm9yIFRJRl94eHh4IGZsYWdzIGF2YWlsYWJsZQorICovCitz dGF0aWMgaW5saW5lIHZvaWQgc2V0X3Rza190aHJlYWRfZmxhZyhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnRzaywgaW50IGZsYWcpCit7CisJc2V0X3RpX3RocmVhZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8o dHNrKSwgZmxhZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl90c2tfdGhyZWFkX2Zs YWcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBmbGFnKQoreworCWNsZWFyX3RpX3RocmVh ZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8odHNrKSwgZmxhZyk7Cit9CisKK3N0YXRpYyBpbmxpbmUg aW50IHRlc3RfYW5kX3NldF90c2tfdGhyZWFkX2ZsYWcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ss IGludCBmbGFnKQoreworCXJldHVybiB0ZXN0X2FuZF9zZXRfdGlfdGhyZWFkX2ZsYWcodGFza190 aHJlYWRfaW5mbyh0c2spLCBmbGFnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF9hbmRf Y2xlYXJfdHNrX3RocmVhZF9mbGFnKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBpbnQgZmxhZykK K3sKKwlyZXR1cm4gdGVzdF9hbmRfY2xlYXJfdGlfdGhyZWFkX2ZsYWcodGFza190aHJlYWRfaW5m byh0c2spLCBmbGFnKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF90c2tfdGhyZWFkX2Zs YWcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGludCBmbGFnKQoreworCXJldHVybiB0ZXN0X3Rp X3RocmVhZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8odHNrKSwgZmxhZyk7Cit9CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBzZXRfdHNrX25lZWRfcmVzY2hlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykK K3sKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHRzayxUSUZfTkVFRF9SRVNDSEVEKTsKK30KKworc3Rh dGljIGlubGluZSB2b2lkIGNsZWFyX3Rza19uZWVkX3Jlc2NoZWQoc3RydWN0IHRhc2tfc3RydWN0 ICp0c2spCit7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRzayxUSUZfTkVFRF9SRVNDSEVEKTsK K30KKworc3RhdGljIGlubGluZSBpbnQgdGVzdF90c2tfbmVlZF9yZXNjaGVkKHN0cnVjdCB0YXNr X3N0cnVjdCAqdHNrKQoreworCXJldHVybiB1bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyh0 c2ssVElGX05FRURfUkVTQ0hFRCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCByZXN0YXJ0X3N5 c2NhbGwodm9pZCkKK3sKKwlzZXRfdHNrX3RocmVhZF9mbGFnKGN1cnJlbnQsIFRJRl9TSUdQRU5E SU5HKTsKKwlyZXR1cm4gLUVSRVNUQVJUTk9JTlRSOworfQorCitzdGF0aWMgaW5saW5lIGludCBz aWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHVubGlrZWx5 KHRlc3RfdHNrX3RocmVhZF9mbGFnKHAsVElGX1NJR1BFTkRJTkcpKTsKK30KKworc3RhdGljIGlu bGluZSBpbnQgX19mYXRhbF9zaWduYWxfcGVuZGluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7 CisJcmV0dXJuIHVubGlrZWx5KHNpZ2lzbWVtYmVyKCZwLT5wZW5kaW5nLnNpZ25hbCwgU0lHS0lM TCkpOworfQorCitzdGF0aWMgaW5saW5lIGludCBmYXRhbF9zaWduYWxfcGVuZGluZyhzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHNpZ25hbF9wZW5kaW5nKHApICYmIF9fZmF0YWxf c2lnbmFsX3BlbmRpbmcocCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHNpZ25hbF9wZW5kaW5n X3N0YXRlKGxvbmcgc3RhdGUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlpZiAoIShzdGF0 ZSAmIChUQVNLX0lOVEVSUlVQVElCTEUgfCBUQVNLX1dBS0VLSUxMKSkpCisJCXJldHVybiAwOwor CWlmICghc2lnbmFsX3BlbmRpbmcocCkpCisJCXJldHVybiAwOworCisJcmV0dXJuIChzdGF0ZSAm IFRBU0tfSU5URVJSVVBUSUJMRSkgfHwgX19mYXRhbF9zaWduYWxfcGVuZGluZyhwKTsKK30KKwor c3RhdGljIGlubGluZSBpbnQgbmVlZF9yZXNjaGVkKHZvaWQpCit7CisJcmV0dXJuIHVubGlrZWx5 KHRlc3RfdGhyZWFkX2ZsYWcoVElGX05FRURfUkVTQ0hFRCkpOworfQorCisvKgorICogY29uZF9y ZXNjaGVkKCkgYW5kIGNvbmRfcmVzY2hlZF9sb2NrKCk6IGxhdGVuY3kgcmVkdWN0aW9uIHZpYQor ICogZXhwbGljaXQgcmVzY2hlZHVsaW5nIGluIHBsYWNlcyB0aGF0IGFyZSBzYWZlLiBUaGUgcmV0 dXJuCisgKiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBhIHJlc2NoZWR1bGUgd2FzIGRvbmUgaW4g ZmFjdC4KKyAqIGNvbmRfcmVzY2hlZF9sb2NrKCkgd2lsbCBkcm9wIHRoZSBzcGlubG9jayBiZWZv cmUgc2NoZWR1bGluZywKKyAqIGNvbmRfcmVzY2hlZF9zb2Z0aXJxKCkgd2lsbCBlbmFibGUgYmhz IGJlZm9yZSBzY2hlZHVsaW5nLgorICovCitleHRlcm4gaW50IF9jb25kX3Jlc2NoZWQodm9pZCk7 CisKKyNkZWZpbmUgY29uZF9yZXNjaGVkKCkgKHsJCQlcCisJX19taWdodF9zbGVlcChfX0ZJTEVf XywgX19MSU5FX18sIDApOwlcCisJX2NvbmRfcmVzY2hlZCgpOwkJCVwKK30pCisKK2V4dGVybiBp bnQgX19jb25kX3Jlc2NoZWRfbG9jayhzcGlubG9ja190ICpsb2NrKTsKKworI2lmZGVmIENPTkZJ R19QUkVFTVBUX0NPVU5UCisjZGVmaW5lIFBSRUVNUFRfTE9DS19PRkZTRVQJUFJFRU1QVF9PRkZT RVQKKyNlbHNlCisjZGVmaW5lIFBSRUVNUFRfTE9DS19PRkZTRVQJMAorI2VuZGlmCisKKyNkZWZp bmUgY29uZF9yZXNjaGVkX2xvY2sobG9jaykgKHsJCQkJXAorCV9fbWlnaHRfc2xlZXAoX19GSUxF X18sIF9fTElORV9fLCBQUkVFTVBUX0xPQ0tfT0ZGU0VUKTsJXAorCV9fY29uZF9yZXNjaGVkX2xv Y2sobG9jayk7CQkJCVwKK30pCisKK2V4dGVybiBpbnQgX19jb25kX3Jlc2NoZWRfc29mdGlycSh2 b2lkKTsKKworI2RlZmluZSBjb25kX3Jlc2NoZWRfc29mdGlycSgpICh7CQkJCQlcCisJX19taWdo dF9zbGVlcChfX0ZJTEVfXywgX19MSU5FX18sIFNPRlRJUlFfRElTQUJMRV9PRkZTRVQpOwlcCisJ X19jb25kX3Jlc2NoZWRfc29mdGlycSgpOwkJCQkJXAorfSkKKworLyoKKyAqIERvZXMgYSBjcml0 aWNhbCBzZWN0aW9uIG5lZWQgdG8gYmUgYnJva2VuIGR1ZSB0byBhbm90aGVyCisgKiB0YXNrIHdh aXRpbmc/OiAodGVjaG5pY2FsbHkgZG9lcyBub3QgZGVwZW5kIG9uIENPTkZJR19QUkVFTVBULAor ICogYnV0IGEgZ2VuZXJhbCBuZWVkIGZvciBsb3cgbGF0ZW5jeSkKKyAqLworc3RhdGljIGlubGlu ZSBpbnQgc3Bpbl9uZWVkYnJlYWsoc3BpbmxvY2tfdCAqbG9jaykKK3sKKyNpZmRlZiBDT05GSUdf UFJFRU1QVAorCXJldHVybiBzcGluX2lzX2NvbnRlbmRlZChsb2NrKTsKKyNlbHNlCisJcmV0dXJu IDA7CisjZW5kaWYKK30KKworLyoKKyAqIFRocmVhZCBncm91cCBDUFUgdGltZSBhY2NvdW50aW5n LgorICovCit2b2lkIHRocmVhZF9ncm91cF9jcHV0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNr LCBzdHJ1Y3QgdGFza19jcHV0aW1lICp0aW1lcyk7Cit2b2lkIHRocmVhZF9ncm91cF9jcHV0aW1l cihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHRhc2tfY3B1dGltZSAqdGltZXMpOwor CitzdGF0aWMgaW5saW5lIHZvaWQgdGhyZWFkX2dyb3VwX2NwdXRpbWVfaW5pdChzdHJ1Y3Qgc2ln bmFsX3N0cnVjdCAqc2lnKQoreworCXJhd19zcGluX2xvY2tfaW5pdCgmc2lnLT5jcHV0aW1lci5s b2NrKTsKK30KKworLyoKKyAqIFJlZXZhbHVhdGUgd2hldGhlciB0aGUgdGFzayBoYXMgc2lnbmFs cyBwZW5kaW5nIGRlbGl2ZXJ5LgorICogV2FrZSB0aGUgdGFzayBpZiBzby4KKyAqIFRoaXMgaXMg cmVxdWlyZWQgZXZlcnkgdGltZSB0aGUgYmxvY2tlZCBzaWdzZXRfdCBjaGFuZ2VzLgorICogY2Fs bGVycyBtdXN0IGhvbGQgc2lnaGFuZC0+c2lnbG9jay4KKyAqLworZXh0ZXJuIHZvaWQgcmVjYWxj X3NpZ3BlbmRpbmdfYW5kX3dha2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0KTsKK2V4dGVybiB2b2lk IHJlY2FsY19zaWdwZW5kaW5nKHZvaWQpOworCitleHRlcm4gdm9pZCBzaWduYWxfd2FrZV91cChz dHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCByZXN1bWVfc3RvcHBlZCk7CisKKy8qCisgKiBXcmFw cGVycyBmb3IgcC0+dGhyZWFkX2luZm8tPmNwdSBhY2Nlc3MuIE5vLW9wIG9uIFVQLgorICovCisj aWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0YXNrX2NwdShj b25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHRhc2tfdGhyZWFkX2luZm8o cCktPmNwdTsKK30KKworZXh0ZXJuIHZvaWQgc2V0X3Rhc2tfY3B1KHN0cnVjdCB0YXNrX3N0cnVj dCAqcCwgdW5zaWduZWQgaW50IGNwdSk7CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdW5zaWdu ZWQgaW50IHRhc2tfY3B1KGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF90YXNrX2NwdShzdHJ1Y3QgdGFza19zdHJ1 Y3QgKnAsIHVuc2lnbmVkIGludCBjcHUpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfU01QICov CisKK2V4dGVybiBsb25nIHNjaGVkX3NldGFmZmluaXR5KHBpZF90IHBpZCwgY29uc3Qgc3RydWN0 IGNwdW1hc2sgKm5ld19tYXNrKTsKK2V4dGVybiBsb25nIHNjaGVkX2dldGFmZmluaXR5KHBpZF90 IHBpZCwgc3RydWN0IGNwdW1hc2sgKm1hc2spOworCitleHRlcm4gdm9pZCBub3JtYWxpemVfcnRf dGFza3Modm9pZCk7CisKKyNpZmRlZiBDT05GSUdfQ0dST1VQX1NDSEVECisKK2V4dGVybiBzdHJ1 Y3QgdGFza19ncm91cCByb290X3Rhc2tfZ3JvdXA7CisKK2V4dGVybiBzdHJ1Y3QgdGFza19ncm91 cCAqc2NoZWRfY3JlYXRlX2dyb3VwKHN0cnVjdCB0YXNrX2dyb3VwICpwYXJlbnQpOworZXh0ZXJu IHZvaWQgc2NoZWRfZGVzdHJveV9ncm91cChzdHJ1Y3QgdGFza19ncm91cCAqdGcpOworZXh0ZXJu IHZvaWQgc2NoZWRfbW92ZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKyNpZmRlZiBD T05GSUdfRkFJUl9HUk9VUF9TQ0hFRAorZXh0ZXJuIGludCBzY2hlZF9ncm91cF9zZXRfc2hhcmVz KHN0cnVjdCB0YXNrX2dyb3VwICp0ZywgdW5zaWduZWQgbG9uZyBzaGFyZXMpOworZXh0ZXJuIHVu c2lnbmVkIGxvbmcgc2NoZWRfZ3JvdXBfc2hhcmVzKHN0cnVjdCB0YXNrX2dyb3VwICp0Zyk7Cisj ZW5kaWYKKyNpZmRlZiBDT05GSUdfUlRfR1JPVVBfU0NIRUQKK2V4dGVybiBpbnQgc2NoZWRfZ3Jv dXBfc2V0X3J0X3J1bnRpbWUoc3RydWN0IHRhc2tfZ3JvdXAgKnRnLAorCQkJCSAgICAgIGxvbmcg cnRfcnVudGltZV91cyk7CitleHRlcm4gbG9uZyBzY2hlZF9ncm91cF9ydF9ydW50aW1lKHN0cnVj dCB0YXNrX2dyb3VwICp0Zyk7CitleHRlcm4gaW50IHNjaGVkX2dyb3VwX3NldF9ydF9wZXJpb2Qo c3RydWN0IHRhc2tfZ3JvdXAgKnRnLAorCQkJCSAgICAgIGxvbmcgcnRfcGVyaW9kX3VzKTsKK2V4 dGVybiBsb25nIHNjaGVkX2dyb3VwX3J0X3BlcmlvZChzdHJ1Y3QgdGFza19ncm91cCAqdGcpOwor ZXh0ZXJuIGludCBzY2hlZF9ydF9jYW5fYXR0YWNoKHN0cnVjdCB0YXNrX2dyb3VwICp0Zywgc3Ry dWN0IHRhc2tfc3RydWN0ICp0c2spOworI2VuZGlmCisjZW5kaWYKKworZXh0ZXJuIGludCB0YXNr X2Nhbl9zd2l0Y2hfdXNlcihzdHJ1Y3QgdXNlcl9zdHJ1Y3QgKnVwLAorCQkJCQlzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnRzayk7CisKKyNpZmRlZiBDT05GSUdfVEFTS19YQUNDVAorc3RhdGljIGlubGlu ZSB2b2lkIGFkZF9yY2hhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3NpemVfdCBhbXQpCit7 CisJdHNrLT5pb2FjLnJjaGFyICs9IGFtdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGFkZF93 Y2hhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3NpemVfdCBhbXQpCit7CisJdHNrLT5pb2Fj LndjaGFyICs9IGFtdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluY19zeXNjcihzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnRzaykKK3sKKwl0c2stPmlvYWMuc3lzY3IrKzsKK30KKworc3RhdGljIGlu bGluZSB2b2lkIGluY19zeXNjdyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKK3sKKwl0c2stPmlv YWMuc3lzY3crKzsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgYWRkX3JjaGFyKHN0cnVj dCB0YXNrX3N0cnVjdCAqdHNrLCBzc2l6ZV90IGFtdCkKK3sKK30KKworc3RhdGljIGlubGluZSB2 b2lkIGFkZF93Y2hhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3NpemVfdCBhbXQpCit7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfc3lzY3Ioc3RydWN0IHRhc2tfc3RydWN0ICp0c2sp Cit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfc3lzY3coc3RydWN0IHRhc2tfc3RydWN0 ICp0c2spCit7Cit9CisjZW5kaWYKKworI2lmbmRlZiBUQVNLX1NJWkVfT0YKKyNkZWZpbmUgVEFT S19TSVpFX09GKHRzaykJVEFTS19TSVpFCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19NTV9PV05F UgorZXh0ZXJuIHZvaWQgbW1fdXBkYXRlX25leHRfb3duZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0p OworZXh0ZXJuIHZvaWQgbW1faW5pdF9vd25lcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc3RydWN0 IHRhc2tfc3RydWN0ICpwKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgbW1fdXBkYXRlX25l eHRfb3duZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0pCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCBtbV9pbml0X293bmVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnApCit7Cit9CisjZW5kaWYgLyogQ09ORklHX01NX09XTkVSICovCisKK3N0YXRpYyBpbmxpbmUg dW5zaWduZWQgbG9uZyB0YXNrX3JsaW1pdChjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywK KwkJdW5zaWduZWQgaW50IGxpbWl0KQoreworCXJldHVybiBBQ0NFU1NfT05DRSh0c2stPnNpZ25h bC0+cmxpbVtsaW1pdF0ucmxpbV9jdXIpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxv bmcgdGFza19ybGltaXRfbWF4KGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAorCQl1bnNp Z25lZCBpbnQgbGltaXQpCit7CisJcmV0dXJuIEFDQ0VTU19PTkNFKHRzay0+c2lnbmFsLT5ybGlt W2xpbWl0XS5ybGltX21heCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBybGlt aXQodW5zaWduZWQgaW50IGxpbWl0KQoreworCXJldHVybiB0YXNrX3JsaW1pdChjdXJyZW50LCBs aW1pdCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBybGltaXRfbWF4KHVuc2ln bmVkIGludCBsaW1pdCkKK3sKKwlyZXR1cm4gdGFza19ybGltaXRfbWF4KGN1cnJlbnQsIGxpbWl0 KTsKK30KKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKworI2VuZGlmCmRpZmYgLXJ1TiBsaW51 eC0zLjQuMS9pbml0L0tjb25maWcgbGludXgtMy40LjEtUklGUy9pbml0L0tjb25maWcKLS0tIGxp bnV4LTMuNC4xL2luaXQvS2NvbmZpZwkyMDEyLTA2LTAxIDE1OjE4OjQ0LjAwMDAwMDAwMCArMDgw MAorKysgbGludXgtMy40LjEtUklGUy9pbml0L0tjb25maWcJMjAxMi0wNi0wOCAyMjoxNTozMC4w MDAwMDAwMDAgKzA4MDAKQEAgLTI5LDYgKzI5LDE4IEBACiAKIG1lbnUgIkdlbmVyYWwgc2V0dXAi CiAKK2NvbmZpZyBTQ0hFRF9SSUZTCisJYm9vbCAiUklGUyBjcHUgc2NoZWR1bGVyIgorCS0tLWhl bHAtLS0KKwkgIFRoZSBSSUZTIGNwdSBzY2hlZHVsZXIgaXMgZGVzaWduZWQgZm9yIGV4Y2VsbGVu dCBpbnRlcmFjdGl2aXR5IGFuZAorCSAgcmVzcG9uc2l2ZW5lc3MuCisKKwkgIEN1cnJlbnRseSBp bmNvbXBhdGlibGUgd2l0aCB0aGUgR3JvdXAgQ1BVIHNjaGVkdWxlciwgYW5kIFJDVSBUT1JUVVJF CisgICAgICAgICAgVEVTVCBzbyB0aGVzZSBvcHRpb25zIGFyZSBkaXNhYmxlZC4KKworICAgICAg ICAgIFNheSBZIGhlcmUuCisJZGVmYXVsdCB5CisKIGNvbmZpZyBFWFBFUklNRU5UQUwKIAlib29s ICJQcm9tcHQgZm9yIGRldmVsb3BtZW50IGFuZC9vciBpbmNvbXBsZXRlIGNvZGUvZHJpdmVycyIK IAktLS1oZWxwLS0tCkBAIC02MzEsNiArNjQzLDcgQEAKIAogY29uZmlnIENHUk9VUF9DUFVBQ0NU CiAJYm9vbCAiU2ltcGxlIENQVSBhY2NvdW50aW5nIGNncm91cCBzdWJzeXN0ZW0iCisJZGVwZW5k cyBvbiAhU0NIRURfUklGUwogCWhlbHAKIAkgIFByb3ZpZGVzIGEgc2ltcGxlIFJlc291cmNlIENv bnRyb2xsZXIgZm9yIG1vbml0b3JpbmcgdGhlCiAJICB0b3RhbCBDUFUgY29uc3VtZWQgYnkgdGhl IHRhc2tzIGluIGEgY2dyb3VwLgpAQCAtNzE4LDYgKzczMSw3IEBACiAKIG1lbnVjb25maWcgQ0dS T1VQX1NDSEVECiAJYm9vbCAiR3JvdXAgQ1BVIHNjaGVkdWxlciIKKwlkZXBlbmRzIG9uICFTQ0hF RF9SSUZTCiAJZGVmYXVsdCBuCiAJaGVscAogCSAgVGhpcyBmZWF0dXJlIGxldHMgQ1BVIHNjaGVk dWxlciByZWNvZ25pemUgdGFzayBncm91cHMgYW5kIGNvbnRyb2wgQ1BVCkBAIC04NTQsNiArODY4 LDcgQEAKIAogY29uZmlnIFNDSEVEX0FVVE9HUk9VUAogCWJvb2wgIkF1dG9tYXRpYyBwcm9jZXNz IGdyb3VwIHNjaGVkdWxpbmciCisJZGVwZW5kcyBvbiAhU0NIRURfUklGUwogCXNlbGVjdCBFVkVO VEZECiAJc2VsZWN0IENHUk9VUFMKIAlzZWxlY3QgQ0dST1VQX1NDSEVECmRpZmYgLXJ1TiBsaW51 eC0zLjQuMS9rZXJuZWwvZGVsYXlhY2N0LmMgbGludXgtMy40LjEtUklGUy9rZXJuZWwvZGVsYXlh Y2N0LmMKLS0tIGxpbnV4LTMuNC4xL2tlcm5lbC9kZWxheWFjY3QuYwkyMDEyLTA2LTAxIDE1OjE4 OjQ0LjAwMDAwMDAwMCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9rZXJuZWwvZGVsYXlhY2N0 LmMJMjAxMi0wNi0wNiAxNTowMzozMC4wMDAwMDAwMDAgKzA4MDAKQEAgLTEzMCw3ICsxMzAsNyBA QAogCSAqLwogCXQxID0gdHNrLT5zY2hlZF9pbmZvLnBjb3VudDsKIAl0MiA9IHRzay0+c2NoZWRf aW5mby5ydW5fZGVsYXk7Ci0JdDMgPSB0c2stPnNlLnN1bV9leGVjX3J1bnRpbWU7CisJdDMgPSB0 c2tfc2VydW50aW1lKHRzayk7CiAKIAlkLT5jcHVfY291bnQgKz0gdDE7CiAKZGlmZiAtcnVOIGxp bnV4LTMuNC4xL2tlcm5lbC9leGl0LmMgbGludXgtMy40LjEtUklGUy9rZXJuZWwvZXhpdC5jCi0t LSBsaW51eC0zLjQuMS9rZXJuZWwvZXhpdC5jCTIwMTItMDYtMDEgMTU6MTg6NDQuMDAwMDAwMDAw ICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9leGl0LmMJMjAxMi0wNi0wNSAyMDo0 Njo0NS4wMDAwMDAwMDAgKzA4MDAKQEAgLTEzMyw3ICsxMzMsNyBAQAogCQlzaWctPmluYmxvY2sg Kz0gdGFza19pb19nZXRfaW5ibG9jayh0c2spOwogCQlzaWctPm91YmxvY2sgKz0gdGFza19pb19n ZXRfb3VibG9jayh0c2spOwogCQl0YXNrX2lvX2FjY291bnRpbmdfYWRkKCZzaWctPmlvYWMsICZ0 c2stPmlvYWMpOwotCQlzaWctPnN1bV9zY2hlZF9ydW50aW1lICs9IHRzay0+c2Uuc3VtX2V4ZWNf cnVudGltZTsKKwkJc2lnLT5zdW1fc2NoZWRfcnVudGltZSArPSB0c2tfc2VydW50aW1lKHRzayk7 CiAJfQogCiAJc2lnLT5ucl90aHJlYWRzLS07CmRpZmYgLXJ1TiBsaW51eC0zLjQuMS9rZXJuZWwv cG9zaXgtY3B1LXRpbWVycy5jIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3Bvc2l4LWNwdS10aW1l cnMuYwotLS0gbGludXgtMy40LjEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYwkyMDEyLTA2LTAx IDE1OjE4OjQ0LjAwMDAwMDAwMCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9rZXJuZWwvcG9z aXgtY3B1LXRpbWVycy5jCTIwMTItMDYtMDYgMTQ6Mzc6MzUuMDAwMDAwMDAwICswODAwCkBAIC00 OTUsNyArNDk1LDcgQEAKIHZvaWQgcG9zaXhfY3B1X3RpbWVyc19leGl0KHN0cnVjdCB0YXNrX3N0 cnVjdCAqdHNrKQogewogCWNsZWFudXBfdGltZXJzKHRzay0+Y3B1X3RpbWVycywKLQkJICAgICAg IHRzay0+dXRpbWUsIHRzay0+c3RpbWUsIHRzay0+c2Uuc3VtX2V4ZWNfcnVudGltZSk7CisJCSAg ICAgICB0c2stPnV0aW1lLCB0c2stPnN0aW1lLCB0c2tfc2VydW50aW1lKHRzaykpOwogCiB9CiB2 b2lkIHBvc2l4X2NwdV90aW1lcnNfZXhpdF9ncm91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykK QEAgLTUwNCw3ICs1MDQsNyBAQAogCiAJY2xlYW51cF90aW1lcnModHNrLT5zaWduYWwtPmNwdV90 aW1lcnMsCiAJCSAgICAgICB0c2stPnV0aW1lICsgc2lnLT51dGltZSwgdHNrLT5zdGltZSArIHNp Zy0+c3RpbWUsCi0JCSAgICAgICB0c2stPnNlLnN1bV9leGVjX3J1bnRpbWUgKyBzaWctPnN1bV9z Y2hlZF9ydW50aW1lKTsKKwkJICAgICAgIHRza19zZXJ1bnRpbWUodHNrKSArIHNpZy0+c3VtX3Nj aGVkX3J1bnRpbWUpOwogfQogCiBzdGF0aWMgdm9pZCBjbGVhcl9kZWFkX3Rhc2soc3RydWN0IGtf aXRpbWVyICp0aW1lciwgdW5pb24gY3B1X3RpbWVfY291bnQgbm93KQpAQCAtOTM0LDcgKzkzNCw3 IEBACiAJCXN0cnVjdCBjcHVfdGltZXJfbGlzdCAqdCA9IGxpc3RfZmlyc3RfZW50cnkodGltZXJz LAogCQkJCQkJICAgICAgc3RydWN0IGNwdV90aW1lcl9saXN0LAogCQkJCQkJICAgICAgZW50cnkp OwotCQlpZiAoIS0tbWF4ZmlyZSB8fCB0c2stPnNlLnN1bV9leGVjX3J1bnRpbWUgPCB0LT5leHBp cmVzLnNjaGVkKSB7CisJCWlmICghLS1tYXhmaXJlIHx8IHRza19zZXJ1bnRpbWUodHNrKSA8IHQt PmV4cGlyZXMuc2NoZWQpIHsKIAkJCXRzay0+Y3B1dGltZV9leHBpcmVzLnNjaGVkX2V4cCA9IHQt PmV4cGlyZXMuc2NoZWQ7CiAJCQlicmVhazsKIAkJfQpAQCAtOTUxLDcgKzk1MSw3IEBACiAJCQlB Q0NFU1NfT05DRShzaWctPnJsaW1bUkxJTUlUX1JUVElNRV0ucmxpbV9tYXgpOwogCiAJCWlmICho YXJkICE9IFJMSU1fSU5GSU5JVFkgJiYKLQkJICAgIHRzay0+cnQudGltZW91dCA+IERJVl9ST1VO RF9VUChoYXJkLCBVU0VDX1BFUl9TRUMvSFopKSB7CisJCSAgICB0c2tfcnR0aW1lb3V0KHRzaykg PiBESVZfUk9VTkRfVVAoaGFyZCwgVVNFQ19QRVJfU0VDL0haKSkgewogCQkJLyoKIAkJCSAqIEF0 IHRoZSBoYXJkIGxpbWl0LCB3ZSBqdXN0IGRpZS4KIAkJCSAqIE5vIG5lZWQgdG8gY2FsY3VsYXRl IGFueXRoaW5nIGVsc2Ugbm93LgpAQCAtOTU5LDcgKzk1OSw3IEBACiAJCQlfX2dyb3VwX3NlbmRf c2lnX2luZm8oU0lHS0lMTCwgU0VORF9TSUdfUFJJViwgdHNrKTsKIAkJCXJldHVybjsKIAkJfQot CQlpZiAodHNrLT5ydC50aW1lb3V0ID4gRElWX1JPVU5EX1VQKHNvZnQsIFVTRUNfUEVSX1NFQy9I WikpIHsKKwkJaWYgKHRza19ydHRpbWVvdXQodHNrKSA+IERJVl9ST1VORF9VUChzb2Z0LCBVU0VD X1BFUl9TRUMvSFopKSB7CiAJCQkvKgogCQkJICogQXQgdGhlIHNvZnQgbGltaXQsIHNlbmQgYSBT SUdYQ1BVIGV2ZXJ5IHNlY29uZC4KIAkJCSAqLwpAQCAtMTI1Miw3ICsxMjUyLDcgQEAKIAkJc3Ry dWN0IHRhc2tfY3B1dGltZSB0YXNrX3NhbXBsZSA9IHsKIAkJCS51dGltZSA9IHRzay0+dXRpbWUs CiAJCQkuc3RpbWUgPSB0c2stPnN0aW1lLAotCQkJLnN1bV9leGVjX3J1bnRpbWUgPSB0c2stPnNl LnN1bV9leGVjX3J1bnRpbWUKKwkJCS5zdW1fZXhlY19ydW50aW1lID0gdHNrX3NlcnVudGltZSh0 c2spCiAJCX07CiAKIAkJaWYgKHRhc2tfY3B1dGltZV9leHBpcmVkKCZ0YXNrX3NhbXBsZSwgJnRz ay0+Y3B1dGltZV9leHBpcmVzKSkKZGlmZiAtcnVOIGxpbnV4LTMuNC4xL2tlcm5lbC9zY2hlZC9N YWtlZmlsZSBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9zY2hlZC9NYWtlZmlsZQotLS0gbGludXgt My40LjEva2VybmVsL3NjaGVkL01ha2VmaWxlCTIwMTItMDYtMDEgMTU6MTg6NDQuMDAwMDAwMDAw ICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9zY2hlZC9NYWtlZmlsZQkyMDEyLTA2 LTA1IDIwOjQyOjIyLjAwMDAwMDAwMCArMDgwMApAQCAtMTEsMTAgKzExLDEzIEBACiBDRkxBR1Nf Y29yZS5vIDo9ICQoUFJPRklMSU5HKSAtZm5vLW9taXQtZnJhbWUtcG9pbnRlcgogZW5kaWYKIAor aWZkZWYgQ09ORklHX1NDSEVEX1JJRlMKK29iai15ICs9IHJpZnMubyBjbG9jay5vCitlbHNlCiBv YmoteSArPSBjb3JlLm8gY2xvY2subyBpZGxlX3Rhc2subyBmYWlyLm8gcnQubyBzdG9wX3Rhc2su bwotb2JqLSQoQ09ORklHX1NNUCkgKz0gY3B1cHJpLm8KIG9iai0kKENPTkZJR19TQ0hFRF9BVVRP R1JPVVApICs9IGF1dG9fZ3JvdXAubwotb2JqLSQoQ09ORklHX1NDSEVEU1RBVFMpICs9IHN0YXRz Lm8KIG9iai0kKENPTkZJR19TQ0hFRF9ERUJVRykgKz0gZGVidWcubworZW5kaWYKK29iai0kKENP TkZJR19TTVApICs9IGNwdXByaS5vCiAKIApkaWZmIC1ydU4gbGludXgtMy40LjEva2VybmVsL3Nj aGVkL3JpZnMuYyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9zY2hlZC9yaWZzLmMKLS0tIGxpbnV4 LTMuNC4xL2tlcm5lbC9zY2hlZC9yaWZzLmMJMTk3MC0wMS0wMSAwODowMDowMC4wMDAwMDAwMDAg KzA4MDAKKysrIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3NjaGVkL3JpZnMuYwkyMDEyLTA2LTE2 IDIyOjU3OjUwLjAwMDAwMDAwMCArMDgwMApAQCAtMCwwICsxLDY2OTIgQEAKKy8qCisgKiAga2Vy bmVsL3NjaGVkL3JpZnMuYworICoKKyAqICBLZXJuZWwgc2NoZWR1bGVyIGFuZCByZWxhdGVkIHN5 c2NhbGxzCisgKgorICogIENvcHlyaWdodCAoQykgMTk5MS0yMDAyICBMaW51cyBUb3J2YWxkcwor ICoKKyAqICAxOTk2LTEyLTIzICBNb2RpZmllZCBieSBEYXZlIEdyb3RoZSB0byBmaXggYnVncyBp biBzZW1hcGhvcmVzIGFuZAorICoJCW1ha2Ugc2VtYXBob3JlcyBTTVAgc2FmZQorICogIDE5OTgt MTEtMTkJSW1wbGVtZW50ZWQgc2NoZWR1bGVfdGltZW91dCgpIGFuZCByZWxhdGVkIHN0dWZmCisg KgkJYnkgQW5kcmVhIEFyY2FuZ2VsaQorICogIDIwMDItMDEtMDQJTmV3IHVsdHJhLXNjYWxhYmxl IE8oMSkgc2NoZWR1bGVyIGJ5IEluZ28gTW9sbmFyOgorICoJCWh5YnJpZCBwcmlvcml0eS1saXN0 IGFuZCByb3VuZC1yb2JpbiBkZXNpZ24gd2l0aAorICoJCWFuIGFycmF5LXN3aXRjaCBtZXRob2Qg b2YgZGlzdHJpYnV0aW5nIHRpbWVzbGljZXMKKyAqCQlhbmQgcGVyLUNQVSBydW5xdWV1ZXMuICBD bGVhbnVwcyBhbmQgdXNlZnVsIHN1Z2dlc3Rpb25zCisgKgkJYnkgRGF2aWRlIExpYmVuemksIHBy ZWVtcHRpYmxlIGtlcm5lbCBiaXRzIGJ5IFJvYmVydCBMb3ZlLgorICogIDIwMDMtMDktMDMJSW50 ZXJhY3Rpdml0eSB0dW5pbmcgYnkgQ29uIEtvbGl2YXMuCisgKiAgMjAwNC0wNC0wMglTY2hlZHVs ZXIgZG9tYWlucyBjb2RlIGJ5IE5pY2sgUGlnZ2luCisgKiAgMjAwNy0wNC0xNSAgV29yayBiZWd1 biBvbiByZXBsYWNpbmcgYWxsIGludGVyYWN0aXZpdHkgdHVuaW5nIHdpdGggYQorICoJCQkgIGZh aXIgc2NoZWR1bGluZyBkZXNpZ24gYnkgQ29uIEtvbGl2YXMuCisgKiAgMjAwNy0wNS0wNSAgTG9h ZCBiYWxhbmNpbmcgKHNtcC1uaWNlKSBhbmQgb3RoZXIgaW1wcm92ZW1lbnRzCisgKgkJCSAgYnkg UGV0ZXIgV2lsbGlhbXMKKyAqICAyMDA3LTA1LTA2ICBJbnRlcmFjdGl2aXR5IGltcHJvdmVtZW50 cyB0byBDRlMgYnkgTWlrZSBHYWxicmFpdGgKKyAqICAyMDA3LTA3LTAxICBHcm91cCBzY2hlZHVs aW5nIGVuaGFuY2VtZW50cyBieSBTcml2YXRzYSBWYWRkYWdpcmkKKyAqICAyMDA3LTExLTI5ICBS VCBiYWxhbmNpbmcgaW1wcm92ZW1lbnRzIGJ5IFN0ZXZlbiBSb3N0ZWR0LCBHcmVnb3J5IEhhc2tp bnMsCisgKgkJCSAgVGhvbWFzIEdsZWl4bmVyLCBNaWtlIEtyYXZldHoKKyAqLworCisjaW5jbHVk ZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51 eC9ubWkuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8YXNtL3VhY2Nlc3Mu aD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0 Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvY2FwYWJp bGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9r ZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CisjaW5jbHVkZSA8 bGludXgvcGVyZl9ldmVudC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlY3VyaXR5Lmg+CisjaW5jbHVk ZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVk ZSA8bGludXgvZnJlZXplci5oPgorI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KKyNpbmNsdWRl IDxsaW51eC9ibGtkZXYuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxp bnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RocmVhZHMuaD4KKyNpbmNsdWRlIDxsaW51eC90 aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CisjaW5jbHVkZSA8bGludXgvY3B1 Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5o PgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4K KyNpbmNsdWRlIDxsaW51eC9zZXFfZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+ CisjaW5jbHVkZSA8bGludXgvdGltZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90c2FjY3Rfa2Vybi5o PgorI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheWFjY3Qu aD4KKyNpbmNsdWRlIDxsaW51eC9sb2cyLmg+CisjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgor I2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNs dWRlIDxsaW51eC9pbml0X3Rhc2suaD4KKyNpbmNsdWRlIDxsaW51eC9tYXRoNjQuaD4KKworI2lu Y2x1ZGUgPGFzbS9zd2l0Y2hfdG8uaD4KKyNpbmNsdWRlIDxhc20vdGxiLmg+CisjaW5jbHVkZSA8 YXNtL3VuaXN0ZC5oPgorI2luY2x1ZGUgPGFzbS9tdXRleC5oPgorCisjaW5jbHVkZSAiY3B1cHJp LmgiCisjaW5jbHVkZSAiLi4vd29ya3F1ZXVlX3NjaGVkLmgiCisKKyNkZWZpbmUgQ1JFQVRFX1RS QUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgorCisjZGVmaW5lIE1B WF9USUNLX1VTRUQJCShycl9pbnRlcnZhbCAqIDMpCisjZGVmaW5lIE1BWF9TTEVFUF9DT1VOVAkJ KHJyX2ludGVydmFsICogMykKKyNkZWZpbmUgcnRfcHJpbyhwcmlvKQkJdW5saWtlbHkoKHByaW8p IDwgTUFYX1JUX1BSSU8pCisjZGVmaW5lIHJ0X3Rhc2socCkJCXJ0X3ByaW8oKHApLT5wcmlvKQor I2RlZmluZSBydF9xdWV1ZShycSkJCXJ0X3ByaW8oKHJxKS0+cnFfcHJpbykKKyNkZWZpbmUgYmF0 Y2hfdGFzayhwKQkJKHVubGlrZWx5KChwKS0+cG9saWN5ID09IFNDSEVEX0JBVENIKSkKKyNkZWZp bmUgaXNfcnRfcG9saWN5KHBvbGljeSkJKChwb2xpY3kpID09IFNDSEVEX0ZJRk8gfHwgXAorCQkJ CQkocG9saWN5KSA9PSBTQ0hFRF9SUikKKyNkZWZpbmUgaGFzX3J0X3BvbGljeShwKQl1bmxpa2Vs eShpc19ydF9wb2xpY3koKHApLT5wb2xpY3kpKQorI2RlZmluZSBpZGxlcHJpb190YXNrKHApCXVu bGlrZWx5KChwKS0+cG9saWN5ID09IFNDSEVEX0lETEVQUklPKQorI2RlZmluZSByZXZlcnNlKG1h eCwgdmFsKQkobWF4IC0gdmFsKQorCisvKgorICogQ29udmVydCB1c2VyLW5pY2UgdmFsdWVzIFsg LTIwIC4uLiAwIC4uLiAxOSBdCisgKiB0byBzdGF0aWMgcHJpb3JpdHkgWyBNQVhfUlRfUFJJTy4u TUFYX1BSSU8tMSBdLAorICogYW5kIGJhY2suCisgKi8KKyNkZWZpbmUgTklDRV9UT19QUklPKG5p Y2UpCShNQVhfUlRfUFJJTyArIChuaWNlKSArIDIwKQorI2RlZmluZSBQUklPX1RPX05JQ0UocHJp bykJKChwcmlvKSAtIE1BWF9SVF9QUklPIC0gMjApCisjZGVmaW5lIFRBU0tfTklDRShwKQkJUFJJ T19UT19OSUNFKChwKS0+c3RhdGljX3ByaW8pCisKKy8qCisgKiAnVXNlciBwcmlvcml0eScgaXMg dGhlIG5pY2UgdmFsdWUgY29udmVydGVkIHRvIHNvbWV0aGluZyB3ZQorICogY2FuIHdvcmsgd2l0 aCBiZXR0ZXIgd2hlbiBzY2FsaW5nIHZhcmlvdXMgc2NoZWR1bGVyIHBhcmFtZXRlcnMsCisgKiBp dCdzIGEgWyAwIC4uLiAzOSBdIHJhbmdlLgorICovCisjZGVmaW5lIFVTRVJfUFJJTyhwKQkJKChw KSAtIE1BWF9SVF9QUklPKQorI2RlZmluZSBUQVNLX1VTRVJfUFJJTyhwKQlVU0VSX1BSSU8oKHAp LT5zdGF0aWNfcHJpbykKKyNkZWZpbmUgTUFYX1VTRVJfUFJJTwkJKFVTRVJfUFJJTyhNQVhfUFJJ TykpCisjZGVmaW5lIFNDSEVEX1BSSU8ocCkJCSgocCkgKyBNQVhfUlRfUFJJTykKKyNkZWZpbmUg U1RPUF9QUklPCQkoTUFYX1JUX1BSSU8gLSAxKQorCisvKgorICogU29tZSBoZWxwZXJzIGZvciBj b252ZXJ0aW5nIHRvL2Zyb20gdmFyaW91cyBzY2FsZXMuIFVzZSBzaGlmdHMgdG8gZ2V0CisgKiBh cHByb3hpbWF0ZSBtdWx0aXBsZXMgb2YgdGVuIGZvciBsZXNzIG92ZXJoZWFkLgorICovCisjZGVm aW5lIEpJRkZJRVNfVE9fTlMoVElNRSkJKChUSU1FKSAqICgxMDAwMDAwMDAwIC8gSFopKQorI2Rl ZmluZSBKSUZGWV9OUwkJKDEwMDAwMDAwMDAgLyBIWikKKyNkZWZpbmUgSEFMRl9KSUZGWV9OUwkJ KDEwMDAwMDAwMDAgLyBIWiAvIDIpCisjZGVmaW5lIEhBTEZfSklGRllfVVMJCSgxMDAwMDAwIC8g SFogLyAyKQorI2RlZmluZSBNU19UT19OUyhUSU1FKQkJKChUSU1FKSA8PCAyMCkKKyNkZWZpbmUg TVNfVE9fVVMoVElNRSkJCSgoVElNRSkgPDwgMTApCisjZGVmaW5lIE5TX1RPX01TKFRJTUUpCQko KFRJTUUpID4+IDIwKQorI2RlZmluZSBOU19UT19VUyhUSU1FKQkJKChUSU1FKSA+PiAxMCkKKwor I2RlZmluZSBSRVNDSEVEX1VTCSgxMDApIC8qIFJlc2NoZWR1bGUgaWYgbGVzcyB0aGFuIHRoaXMg bWFueSDOvHMgbGVmdCAqLworCit2b2lkIHByaW50X3NjaGVkdWxlcl92ZXJzaW9uKHZvaWQpCit7 CisJcHJpbnRrKEtFUk5fSU5GTyAiUm90YXJ5IEludGVyYWN0aXZpdHkgRmF2b3IgU2NoZWR1bGVy IC0gUklGUyBCeSBRUTozNzY2NjkxLlxuIik7Cit9CisKKy8qCisgKiBUaGlzIGlzIHRoZSB0aW1l IGFsbCB0YXNrcyB3aXRoaW4gdGhlIHNhbWUgcHJpb3JpdHkgcm91bmQgcm9iaW4uCisgKiBWYWx1 ZSBpcyBpbiBtcyBhbmQgc2V0IHRvIGEgbWluaW11bSBvZiA2bXMuIFNjYWxlcyB3aXRoIG51bWJl ciBvZiBjcHVzLgorICogVHVuYWJsZSB2aWEgL3Byb2MgaW50ZXJmYWNlLgorICovCitpbnQgcnJf aW50ZXJ2YWwgX19yZWFkX21vc3RseSA9IDY7CisKKy8qCisgKiDlhbzlrrnjgIIKKyAqLworaW50 IHNjaGVkX2lzb19jcHUgX19yZWFkX21vc3RseSA9IDA7CisKKy8qCisgKiB0aW1lX3NsaWNlIGZv ciBlYWNoIHByb2Nlc3MKKyAqLworI2RlZmluZSB0aW1lc2xpY2UoKSBNU19UT19VUyhycl9pbnRl cnZhbCkKKworI2RlZmluZSBnZXRfdGltZV9zbGljZShwKSB7IFwKKwlwLT50aW1lX3NsaWNlID0g dGltZXNsaWNlKCk7CVwKK30KKworLyoKKyAqIFRoZSBnbG9iYWwgcnVucXVldWUgZGF0YSB0aGF0 IGFsbCBDUFVzIHdvcmsgb2ZmLiBEYXRhIGlzIHByb3RlY3RlZCBlaXRoZXIKKyAqIGJ5IHRoZSBn bG9iYWwgZ3JxIGxvY2ssIG9yIHRoZSBkaXNjcmV0ZSBsb2NrIHRoYXQgcHJlY2VkZXMgdGhlIGRh dGEgaW4gdGhpcworICogc3RydWN0LgorICovCitzdHJ1Y3QgZ2xvYmFsX3JxIHsKKwlyYXdfc3Bp bmxvY2tfdCBsb2NrOworCXVuc2lnbmVkIGxvbmcgbnJfcnVubmluZzsKKwl1bnNpZ25lZCBsb25n IG5yX3VuaW50ZXJydXB0aWJsZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbnJfc3dpdGNoZXM7CisJ c3RydWN0IGxpc3RfaGVhZCBxdWV1ZVtQUklPX0xJTUlUXTsKKwlERUNMQVJFX0JJVE1BUChwcmlv X2JpdG1hcCwgUFJJT19MSU1JVCArIDEpOworI2lmZGVmIENPTkZJR19TTVAKKwl1bnNpZ25lZCBs b25nIHFucjsgLyogcXVldWVkIG5vdCBydW5uaW5nICovCisJY3B1bWFza190IGNwdV9pZGxlX21h cDsKKwlib29sIGlkbGVfY3B1czsKKyNlbmRpZgorCWludCBub2M7IC8qIG51bV9vbmxpbmVfY3B1 cyBzdG9yZWQgYW5kIHVwZGF0ZWQgd2hlbiBpdCBjaGFuZ2VzICovCit9OworCisjaWZkZWYgQ09O RklHX1NNUAorCisvKgorICogV2UgYWRkIHRoZSBub3Rpb24gb2YgYSByb290LWRvbWFpbiB3aGlj aCB3aWxsIGJlIHVzZWQgdG8gZGVmaW5lIHBlci1kb21haW4KKyAqIHZhcmlhYmxlcy4gRWFjaCBl eGNsdXNpdmUgY3B1c2V0IGVzc2VudGlhbGx5IGRlZmluZXMgYW4gaXNsYW5kIGRvbWFpbiBieQor ICogZnVsbHkgcGFydGl0aW9uaW5nIHRoZSBtZW1iZXIgY3B1cyBmcm9tIGFueSBvdGhlciBjcHVz ZXQuIFdoZW5ldmVyIGEgbmV3CisgKiBleGNsdXNpdmUgY3B1c2V0IGlzIGNyZWF0ZWQsIHdlIGFs c28gY3JlYXRlIGFuZCBhdHRhY2ggYSBuZXcgcm9vdC1kb21haW4KKyAqIG9iamVjdC4KKyAqCisg Ki8KK3N0cnVjdCByb290X2RvbWFpbiB7CisJYXRvbWljX3QgcmVmY291bnQ7CisJYXRvbWljX3Qg cnRvX2NvdW50OworCXN0cnVjdCByY3VfaGVhZCByY3U7CisJY3B1bWFza192YXJfdCBzcGFuOwor CWNwdW1hc2tfdmFyX3Qgb25saW5lOworCisJLyoKKwkgKiBUaGUgIlJUIG92ZXJsb2FkIiBmbGFn OiBpdCBnZXRzIHNldCBpZiBhIENQVSBoYXMgbW9yZSB0aGFuCisJICogb25lIHJ1bm5hYmxlIFJU IHRhc2suCisJICovCisJY3B1bWFza192YXJfdCBydG9fbWFzazsKKwlzdHJ1Y3QgY3B1cHJpIGNw dXByaTsKK307CisKKy8qCisgKiBCeSBkZWZhdWx0IHRoZSBzeXN0ZW0gY3JlYXRlcyBhIHNpbmds ZSByb290LWRvbWFpbiB3aXRoIGFsbCBjcHVzIGFzCisgKiBtZW1iZXJzIChtaW1pY2tpbmcgdGhl IGdsb2JhbCBzdGF0ZSB3ZSBoYXZlIHRvZGF5KS4KKyAqLworc3RhdGljIHN0cnVjdCByb290X2Rv bWFpbiBkZWZfcm9vdF9kb21haW47CisKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCisKKy8qIFRo ZXJlIGNhbiBiZSBvbmx5IG9uZSAqLworc3RhdGljIHN0cnVjdCBnbG9iYWxfcnEgZ3JxOworCisv KgorICogVGhpcyBpcyB0aGUgbWFpbiwgcGVyLUNQVSBydW5xdWV1ZSBkYXRhIHN0cnVjdHVyZS4K KyAqIFRoaXMgZGF0YSBzaG91bGQgb25seSBiZSBtb2RpZmllZCBieSB0aGUgbG9jYWwgY3B1Lgor ICovCitzdHJ1Y3QgcnEgeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwgKmlkbGUsICpzdG9w OworCXN0cnVjdCBtbV9zdHJ1Y3QgKnByZXZfbW07CisJdTY0IGxhc3RfcnVuX3NjYWxlOworCisJ dW5zaWduZWQgaW50IHJxX3BvbGljeTsKKwl1NjQgcnFfbGFzdF9yYW47CisJaW50IHJxX3ByaW87 CisJYm9vbCBycV9ydW5uaW5nOyAvKiBUaGVyZSBpcyBhIHRhc2sgcnVubmluZyAqLworCisJLyog QWNjdXJhdGUgdGltZWtlZXBpbmcgZGF0YSAqLworCXU2NCB0aW1la2VlcF9jbG9jazsKKwl1bnNp Z25lZCBsb25nIHVzZXJfcGMsIG5pY2VfcGMsIGlycV9wYywgc29mdGlycV9wYywgc3lzdGVtX3Bj LAorCQlpb3dhaXRfcGMsIGlkbGVfcGM7CisJbG9uZyBhY2NvdW50X3BjOworCWF0b21pY190IG5y X2lvd2FpdDsKKworI2lmZGVmIENPTkZJR19TTVAKKwlpbnQgY3B1OwkJLyogY3B1IG9mIHRoaXMg cnVucXVldWUgKi8KKwlib29sIG9ubGluZTsKKwlib29sIHNjYWxpbmc7IC8qIFRoaXMgQ1BVIGlz IG1hbmFnZWQgYnkgYSBzY2FsaW5nIENQVSBmcmVxIGdvdmVybm9yICovCisJc3RydWN0IHRhc2tf c3RydWN0ICpzdGlja3lfdGFzazsKKworCXN0cnVjdCByb290X2RvbWFpbiAqcmQ7CisJc3RydWN0 IHNjaGVkX2RvbWFpbiAqc2Q7CisJaW50ICpjcHVfbG9jYWxpdHk7IC8qIENQVSByZWxhdGl2ZSBj YWNoZSBkaXN0YW5jZSAqLworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwlib29sICgqc2libGlu Z3NfaWRsZSkoaW50IGNwdSk7CisJLyogU2VlIGlmIGFsbCBzbXQgc2libGluZ3MgYXJlIGlkbGUg Ki8KKwljcHVtYXNrX3Qgc210X3NpYmxpbmdzOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVE X01DCisJYm9vbCAoKmNhY2hlX2lkbGUpKGludCBjcHUpOworCS8qIFNlZSBpZiBhbGwgY2FjaGUg c2libGluZ3MgYXJlIGlkbGUgKi8KKwljcHVtYXNrX3QgY2FjaGVfc2libGluZ3M7CisjZW5kaWYK KyNlbmRpZgorI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCisJdTY0IHByZXZfaXJx X3RpbWU7CisjZW5kaWYKKworCXU2NCBjbG9jazsKKwl1NjQgY2xvY2tfdGFzazsKK307CisKK0RF RklORV9QRVJfQ1BVX1NIQVJFRF9BTElHTkVEKHN0cnVjdCBycSwgcnVucXVldWVzKTsKK3N0YXRp YyBERUZJTkVfTVVURVgoc2NoZWRfaG90Y3B1X211dGV4KTsKKworI2lmZGVmIENPTkZJR19TTVAK Ky8qCisgKiBzY2hlZF9kb21haW5zX211dGV4IHNlcmlhbGlzZXMgY2FsbHMgdG8gaW5pdF9zY2hl ZF9kb21haW5zLAorICogZGV0YWNoX2Rlc3Ryb3lfZG9tYWlucyBhbmQgcGFydGl0aW9uX3NjaGVk X2RvbWFpbnMuCisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoc2NoZWRfZG9tYWluc19tdXRleCk7 CisKKy8qCisgKiBCeSBkZWZhdWx0IHRoZSBzeXN0ZW0gY3JlYXRlcyBhIHNpbmdsZSByb290LWRv bWFpbiB3aXRoIGFsbCBjcHVzIGFzCisgKiBtZW1iZXJzIChtaW1pY2tpbmcgdGhlIGdsb2JhbCBz dGF0ZSB3ZSBoYXZlIHRvZGF5KS4KKyAqLworc3RhdGljIHN0cnVjdCByb290X2RvbWFpbiBkZWZf cm9vdF9kb21haW47CisKK2ludCBfX3dlYWsgYXJjaF9zZF9zaWJsaW5nX2FzeW1fcGFja2luZyh2 b2lkKQoreworCSAgIHJldHVybiAwKlNEX0FTWU1fUEFDS0lORzsKK30KKyNlbmRpZgorCisjZGVm aW5lIHJjdV9kZXJlZmVyZW5jZV9jaGVja19zY2hlZF9kb21haW4ocCkgXAorCXJjdV9kZXJlZmVy ZW5jZV9jaGVjaygocCksIFwKKwkJCQkgIGxvY2tkZXBfaXNfaGVsZCgmc2NoZWRfZG9tYWluc19t dXRleCkpCisKKy8qCisgKiBUaGUgZG9tYWluIHRyZWUgKHJxLT5zZCkgaXMgcHJvdGVjdGVkIGJ5 IFJDVSdzIHF1aWVzY2VudCBzdGF0ZSB0cmFuc2l0aW9uLgorICogU2VlIGRldGFjaF9kZXN0cm95 X2RvbWFpbnM6IHN5bmNocm9uaXplX3NjaGVkIGZvciBkZXRhaWxzLgorICoKKyAqIFRoZSBkb21h aW4gdHJlZSBvZiBhbnkgQ1BVIG1heSBvbmx5IGJlIGFjY2Vzc2VkIGZyb20gd2l0aGluCisgKiBw cmVlbXB0LWRpc2FibGVkIHNlY3Rpb25zLgorICovCisjZGVmaW5lIGZvcl9lYWNoX2RvbWFpbihj cHUsIF9fc2QpIFwKKwlmb3IgKF9fc2QgPSByY3VfZGVyZWZlcmVuY2VfY2hlY2tfc2NoZWRfZG9t YWluKGNwdV9ycShjcHUpLT5zZCk7IF9fc2Q7IF9fc2QgPSBfX3NkLT5wYXJlbnQpCisKK3N0YXRp YyBpbmxpbmUgdm9pZCB1cGRhdGVfcnFfY2xvY2soc3RydWN0IHJxICpycSk7CisKKy8qCisgKiBT YW5pdHkgY2hlY2sgc2hvdWxkIHNjaGVkX2Nsb2NrIHJldHVybiBib2d1cyB2YWx1ZXMuIFdlIG1h a2Ugc3VyZSBpdCBkb2VzCisgKiBub3QgYXBwZWFyIHRvIGdvIGJhY2t3YXJkcywgYW5kIHVzZSBq aWZmaWVzIHRvIGRldGVybWluZSB0aGUgbWF4aW11bSBhbmQKKyAqIG1pbmltdW0gaXQgY291bGQg cG9zc2libHkgaGF2ZSBpbmNyZWFzZWQsIGFuZCByb3VuZCBkb3duIHRvIHRoZSBuZWFyZXN0Cisg KiBqaWZmeSB3aGVuIGl0IGZhbGxzIG91dHNpZGUgdGhpcy4KKyAqLworc3RhdGljIGlubGluZSB2 b2lkIG5pZmZ5X2RpZmYoczY0ICpuaWZmX2RpZmYsIGludCBqaWZmX2RpZmYpCit7CisJdW5zaWdu ZWQgbG9uZyBtaW5fZGlmZiwgbWF4X2RpZmY7CisKKwlpZiAoamlmZl9kaWZmID4gMSkKKwkJbWlu X2RpZmYgPSBKSUZGSUVTX1RPX05TKGppZmZfZGlmZiAtIDEpOworCWVsc2UKKwkJbWluX2RpZmYg PSAxOworCS8qICBSb3VuZCB1cCB0byB0aGUgbmVhcmVzdCB0aWNrIGZvciBtYXhpbXVtICovCisJ bWF4X2RpZmYgPSBKSUZGSUVTX1RPX05TKGppZmZfZGlmZiArIDEpOworCisJaWYgKHVubGlrZWx5 KCpuaWZmX2RpZmYgPCBtaW5fZGlmZiB8fCAqbmlmZl9kaWZmID4gbWF4X2RpZmYpKQorCQkqbmlm Zl9kaWZmID0gbWluX2RpZmY7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCisjZGVmaW5lIGNwdV9y cShjcHUpCQkoJnBlcl9jcHUocnVucXVldWVzLCAoY3B1KSkpCisjZGVmaW5lIHRoaXNfcnEoKQkJ KCZfX2dldF9jcHVfdmFyKHJ1bnF1ZXVlcykpCisjZGVmaW5lIHRhc2tfcnEocCkJCWNwdV9ycSh0 YXNrX2NwdShwKSkKKyNkZWZpbmUgY3B1X2N1cnIoY3B1KQkJKGNwdV9ycShjcHUpLT5jdXJyKQor c3RhdGljIGlubGluZSBpbnQgY3B1X29mKHN0cnVjdCBycSAqcnEpCit7CisJcmV0dXJuIHJxLT5j cHU7Cit9CisKKyNlbHNlIC8qIENPTkZJR19TTVAgKi8KK3N0YXRpYyBzdHJ1Y3QgcnEgKnVwcnE7 CisjZGVmaW5lIGNwdV9ycShjcHUpCSh1cHJxKQorI2RlZmluZSB0aGlzX3JxKCkJKHVwcnEpCisj ZGVmaW5lIHRhc2tfcnEocCkJKHVwcnEpCisjZGVmaW5lIGNwdV9jdXJyKGNwdSkJKCh1cHJxKS0+ Y3VycikKK3N0YXRpYyBpbmxpbmUgaW50IGNwdV9vZihzdHJ1Y3QgcnEgKnJxKQoreworCXJldHVy biAwOworfQorCisjZW5kaWYKKyNkZWZpbmUgcmF3X3JxKCkJKCZfX3Jhd19nZXRfY3B1X3Zhcihy dW5xdWV1ZXMpKQorCisjaW5jbHVkZSAic3RhdHMuaCIKKworI2lmbmRlZiBwcmVwYXJlX2FyY2hf c3dpdGNoCisjIGRlZmluZSBwcmVwYXJlX2FyY2hfc3dpdGNoKG5leHQpCWRvIHsgfSB3aGlsZSAo MCkKKyNlbmRpZgorI2lmbmRlZiBmaW5pc2hfYXJjaF9zd2l0Y2gKKyMgZGVmaW5lIGZpbmlzaF9h cmNoX3N3aXRjaChwcmV2KQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLyoKKyAqIEFsbCBj b21tb24gbG9ja2luZyBmdW5jdGlvbnMgcGVyZm9ybWVkIG9uIGdycS5sb2NrLiBycS0+Y2xvY2sg aXMgbG9jYWwgdG8KKyAqIHRoZSBDUFUgYWNjZXNzaW5nIGl0IHNvIGl0IGNhbiBiZSBtb2RpZmll ZCBqdXN0IHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorICogd2hlbiB3ZSdyZSBub3QgdXBkYXRp bmcgdGhlIHRpbWUuCisgKiBMb29raW5nIHVwIHRhc2tfcnEgbXVzdCBiZSBkb25lIHVuZGVyIGdy cS5sb2NrIHRvIGJlIHNhZmUuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9ycV9jbG9ja190YXNr KHN0cnVjdCBycSAqcnEsIHM2NCBkZWx0YSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1cGRhdGVf cnFfY2xvY2soc3RydWN0IHJxICpycSkKK3sKKwlzNjQgZGVsdGEgPSBzY2hlZF9jbG9ja19jcHUo Y3B1X29mKHJxKSkgLSBycS0+Y2xvY2s7CisKKwlycS0+Y2xvY2sgKz0gZGVsdGE7CisJdXBkYXRl X3JxX2Nsb2NrX3Rhc2socnEsIGRlbHRhKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHRhc2tf cnVubmluZyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHAtPm9uX2NwdTsKK30K Kworc3RhdGljIGlubGluZSB2b2lkIGdycV9sb2NrKHZvaWQpCisJX19hY3F1aXJlcyhncnEubG9j aykKK3sKKwlyYXdfc3Bpbl9sb2NrKCZncnEubG9jayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCBncnFfdW5sb2NrKHZvaWQpCisJX19yZWxlYXNlcyhncnEubG9jaykKK3sKKwlyYXdfc3Bpbl91 bmxvY2soJmdycS5sb2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdycV9sb2NrX2lycSh2 b2lkKQorCV9fYWNxdWlyZXMoZ3JxLmxvY2spCit7CisJcmF3X3NwaW5fbG9ja19pcnEoJmdycS5s b2NrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVfbG9ja19ncnEoc3RydWN0IHJxICpy cSkKKwlfX2FjcXVpcmVzKGdycS5sb2NrKQoreworCWdycV9sb2NrKCk7Cit9CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBncnFfdW5sb2NrX2lycSh2b2lkKQorCV9fcmVsZWFzZXMoZ3JxLmxvY2spCit7 CisJcmF3X3NwaW5fdW5sb2NrX2lycSgmZ3JxLmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgZ3JxX2xvY2tfaXJxc2F2ZSh1bnNpZ25lZCBsb25nICpmbGFncykKKwlfX2FjcXVpcmVzKGdy cS5sb2NrKQoreworCXJhd19zcGluX2xvY2tfaXJxc2F2ZSgmZ3JxLmxvY2ssICpmbGFncyk7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBncnFfdW5sb2NrX2lycXJlc3RvcmUodW5zaWduZWQgbG9u ZyAqZmxhZ3MpCisJX19yZWxlYXNlcyhncnEubG9jaykKK3sKKwlyYXdfc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmZ3JxLmxvY2ssICpmbGFncyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJx CisqdGFza19ncnFfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGxvbmcgKmZs YWdzKQorCV9fYWNxdWlyZXMoZ3JxLmxvY2spCit7CisJZ3JxX2xvY2tfaXJxc2F2ZShmbGFncyk7 CisJcmV0dXJuIHRhc2tfcnEocCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJxCisqdGlt ZV90YXNrX2dycV9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9uZyAqZmxh Z3MpCisJX19hY3F1aXJlcyhncnEubG9jaykKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gdGFza19ncnFf bG9jayhwLCBmbGFncyk7CisJcmV0dXJuIHJxOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBy cSAqdGFza19ncnFfbG9ja19pcnEoc3RydWN0IHRhc2tfc3RydWN0ICpwKQorCV9fYWNxdWlyZXMo Z3JxLmxvY2spCit7CisJZ3JxX2xvY2tfaXJxKCk7CisJcmV0dXJuIHRhc2tfcnEocCk7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCB0YXNrX2dycV91bmxvY2tfaXJxKHZvaWQpCisJX19yZWxlYXNl cyhncnEubG9jaykKK3sKKwlncnFfdW5sb2NrX2lycSgpOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQgdGFza19ncnFfdW5sb2NrKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorCV9fcmVsZWFzZXMoZ3Jx LmxvY2spCit7CisJZ3JxX3VubG9ja19pcnFyZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiBn cnVucXVldWVfaXNfbG9ja2VkCisgKgorICogUmV0dXJucyB0cnVlIGlmIHRoZSBnbG9iYWwgcnVu cXVldWUgaXMgbG9ja2VkLgorICogVGhpcyBpbnRlcmZhY2UgYWxsb3dzIHByaW50ayB0byBiZSBj YWxsZWQgd2l0aCB0aGUgcnVucXVldWUgbG9jaworICogaGVsZCBhbmQga25vdyB3aGV0aGVyIG9y IG5vdCBpdCBpcyBPSyB0byB3YWtlIHVwIHRoZSBrbG9nZC4KKyAqLworYm9vbCBncnVucXVldWVf aXNfbG9ja2VkKHZvaWQpCit7CisJcmV0dXJuIHJhd19zcGluX2lzX2xvY2tlZCgmZ3JxLmxvY2sp OworfQorCit2b2lkIGdycV91bmxvY2tfd2FpdCh2b2lkKQorCV9fcmVsZWFzZXMoZ3JxLmxvY2sp Cit7CisJc21wX21iKCk7IC8qIHNwaW4tdW5sb2NrLXdhaXQgaXMgbm90IGEgZnVsbCBtZW1vcnkg YmFycmllciAqLworCXJhd19zcGluX3VubG9ja193YWl0KCZncnEubG9jayk7Cit9CisKK3N0YXRp YyBpbmxpbmUgdm9pZCB0aW1lX2dycV9sb2NrKHN0cnVjdCBycSAqcnEsIHVuc2lnbmVkIGxvbmcg KmZsYWdzKQorCV9fYWNxdWlyZXMoZ3JxLmxvY2spCit7CisJbG9jYWxfaXJxX3NhdmUoKmZsYWdz KTsKKwl0aW1lX2xvY2tfZ3JxKHJxKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcnEgKl9f dGFza19ncnFfbG9jayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCisJX19hY3F1aXJlcyhncnEubG9j aykKK3sKKwlncnFfbG9jaygpOworCXJldHVybiB0YXNrX3JxKHApOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgX190YXNrX2dycV91bmxvY2sodm9pZCkKKwlfX3JlbGVhc2VzKGdycS5sb2NrKQor eworCWdycV91bmxvY2soKTsKK30KKworLyoKKyAqIExvb2sgZm9yIGFueSB0YXNrcyAqYW55d2hl cmUqIHRoYXQgYXJlIHJ1bm5pbmcgbmljZSAwIG9yIGJldHRlci4gV2UgZG8KKyAqIHRoaXMgbG9j a2xlc3MgZm9yIG92ZXJoZWFkIHJlYXNvbnMgc2luY2UgdGhlIG9jY2FzaW9uYWwgd3JvbmcgcmVz dWx0CisgKiBpcyBoYXJtbGVzcy4KKyAqLworYm9vbCBhYm92ZV9iYWNrZ3JvdW5kX2xvYWQodm9p ZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0 IHRhc2tfc3RydWN0ICpjcHVfY3VyciA9IGNwdV9ycShjcHUpLT5jdXJyOworCisJCWlmICh1bmxp a2VseSghY3B1X2N1cnIpKQorCQkJY29udGludWU7CisJCWlmIChQUklPX1RPX05JQ0UoY3B1X2N1 cnItPnN0YXRpY19wcmlvKSA8IDEpIHsKKwkJCXJldHVybiB0cnVlOworCQl9CisJfQorCXJldHVy biBmYWxzZTsKK30KKworI2lmbmRlZiBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9DVFhTVworc3RhdGlj IGlubGluZSB2b2lkIHByZXBhcmVfbG9ja19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRh c2tfc3RydWN0ICpuZXh0KQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2xvY2tf c3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKyNpZmRl ZiBDT05GSUdfREVCVUdfU1BJTkxPQ0sKKwkvKiB0aGlzIGlzIGEgdmFsaWQgY2FzZSB3aGVuIGFu b3RoZXIgdGFzayByZWxlYXNlcyB0aGUgc3BpbmxvY2sgKi8KKwlncnEubG9jay5vd25lciA9IGN1 cnJlbnQ7CisjZW5kaWYKKwkvKgorCSAqIElmIHdlIGFyZSB0cmFja2luZyBzcGlubG9jayBkZXBl bmRlbmNpZXMgdGhlbiB3ZSBoYXZlIHRvCisJICogZml4IHVwIHRoZSBydW5xdWV1ZSBsb2NrIC0g d2hpY2ggZ2V0cyAnY2FycmllZCBvdmVyJyBmcm9tCisJICogcHJldiBpbnRvIGN1cnJlbnQ6CisJ ICovCisJc3Bpbl9hY3F1aXJlKCZncnEubG9jay5kZXBfbWFwLCAwLCAwLCBfVEhJU19JUF8pOwor CisJZ3JxX3VubG9ja19pcnEoKTsKK30KKworI2Vsc2UgLyogX19BUkNIX1dBTlRfVU5MT0NLRURf Q1RYU1cgKi8KKworc3RhdGljIGlubGluZSB2b2lkIHByZXBhcmVfbG9ja19zd2l0Y2goc3RydWN0 IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQoreworI2lmZGVmIF9fQVJDSF9XQU5U X0lOVEVSUlVQVFNfT05fQ1RYU1cKKwlncnFfdW5sb2NrX2lycSgpOworI2Vsc2UKKwlncnFfdW5s b2NrKCk7CisjZW5kaWYKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZpbmlzaF9sb2NrX3N3aXRj aChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpCit7CisJc21wX3dtYigp OworI2lmbmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCisJbG9jYWxfaXJxX2Vu YWJsZSgpOworI2VuZGlmCit9CisjZW5kaWYgLyogX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cg Ki8KKworLyoKKyAqIEEgdGFzayB0aGF0IGlzIHF1ZXVlZCBidXQgbm90IHJ1bm5pbmcgd2lsbCBi ZSBvbiB0aGUgZ3JxIHJ1biBsaXN0LgorICogQSB0YXNrIHRoYXQgaXMgbm90IHJ1bm5pbmcgb3Ig cXVldWVkIHdpbGwgbm90IGJlIG9uIHRoZSBncnEgcnVuIGxpc3QuCisgKiBBIHRhc2sgdGhhdCBp cyBjdXJyZW50bHkgcnVubmluZyB3aWxsIGhhdmUgLT5vbl9jcHUgc2V0IGJ1dCBub3Qgb24gdGhl CisgKiBncnEgcnVuIGxpc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCB0YXNrX3F1ZXVlZChz dHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuICghbGlzdF9lbXB0eSgmcC0+cnVuX2xp c3QpKTsKK30KKworLyoKKyAqIFJlbW92aW5nIGZyb20gdGhlIGdsb2JhbCBydW5xdWV1ZS4gRW50 ZXIgd2l0aCBncnEgbG9ja2VkLgorICovCitzdGF0aWMgdm9pZCBkZXF1ZXVlX3Rhc2soc3RydWN0 IHRhc2tfc3RydWN0ICpwKQoreworCWludCBwcmlvID0gcC0+cHJpbzsKKwlsaXN0X2RlbF9pbml0 KCZwLT5ydW5fbGlzdCk7CisJaWYgKGxpc3RfZW1wdHkoZ3JxLnF1ZXVlICsgcHJpbykpCisJCV9f Y2xlYXJfYml0KHByaW8sIGdycS5wcmlvX2JpdG1hcCk7Cit9CisKKy8qCisgKiBBZGRpbmcgdG8g dGhlIGdsb2JhbCBydW5xdWV1ZS4gRW50ZXIgd2l0aCBncnEgbG9ja2VkLgorICovCitzdGF0aWMg dm9pZCBlbnF1ZXVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWludCBwcmlvID0g cC0+cHJpbzsKKwlfX3NldF9iaXQocHJpbywgZ3JxLnByaW9fYml0bWFwKTsKKwlsaXN0X2FkZF90 YWlsKCZwLT5ydW5fbGlzdCwgZ3JxLnF1ZXVlICsgcHJpbyk7Cit9CisKKy8qIE9ubHkgaWRsZSB0 YXNrIGRvZXMgdGhpcyBhcyBhIHJlYWwgdGltZSB0YXNrKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBl bnF1ZXVlX3Rhc2tfaGVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaW50IHByaW8gPSBw LT5wcmlvOworCV9fc2V0X2JpdChwcmlvLCBncnEucHJpb19iaXRtYXApOworCWxpc3RfYWRkKCZw LT5ydW5fbGlzdCwgZ3JxLnF1ZXVlICsgcHJpbyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBy ZXF1ZXVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorCisjaWZkZWYgQ09ORklH X1NNUAorLyoKKyAqIHFuciBpcyB0aGUgInF1ZXVlZCBidXQgbm90IHJ1bm5pbmciIGNvdW50IHdo aWNoIGlzIHRoZSB0b3RhbCBudW1iZXIgb2YKKyAqIHRhc2tzIG9uIHRoZSBnbG9iYWwgcnVucXVl dWUgbGlzdCB3YWl0aW5nIGZvciBjcHUgdGltZSBidXQgbm90IGFjdHVhbGx5CisgKiBjdXJyZW50 bHkgcnVubmluZyBvbiBhIGNwdS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGluY19xbnIodm9p ZCkKK3sKKwlncnEucW5yKys7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNfcW5yKHZvaWQp Cit7CisJZ3JxLnFuci0tOworfQorCitzdGF0aWMgaW5saW5lIGludCBxdWV1ZWRfbm90cnVubmlu Zyh2b2lkKQoreworCXJldHVybiBncnEucW5yOworfQorCisvKgorICogVGhlIGNwdV9pZGxlX21h cCBzdG9yZXMgYSBiaXRtYXAgb2YgYWxsIHRoZSBDUFVzIGN1cnJlbnRseSBpZGxlIHRvCisgKiBh bGxvdyBlYXN5IGxvb2t1cCBvZiB3aGV0aGVyIGFueSBzdWl0YWJsZSBpZGxlIENQVXMgYXJlIGF2 YWlsYWJsZS4KKyAqIEl0J3MgY2hlYXBlciB0byBtYWludGFpbiBhIGJpbmFyeSB5ZXMvbm8gaWYg dGhlcmUgYXJlIGFueSBpZGxlIENQVXMgb24gdGhlCisgKiBpZGxlX2NwdXMgdmFyaWFibGUgdGhh biB0byBkbyBhIGZ1bGwgYml0bWFzayBjaGVjayB3aGVuIHdlIGFyZSBidXN5LgorICovCitzdGF0 aWMgaW5saW5lIHZvaWQgc2V0X2NwdWlkbGVfbWFwKGludCBjcHUpCit7CisJaWYgKGxpa2VseShj cHVfb25saW5lKGNwdSkpKSB7CisJCWNwdV9zZXQoY3B1LCBncnEuY3B1X2lkbGVfbWFwKTsKKwkJ Z3JxLmlkbGVfY3B1cyA9IHRydWU7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJf Y3B1aWRsZV9tYXAoaW50IGNwdSkKK3sKKwljcHVfY2xlYXIoY3B1LCBncnEuY3B1X2lkbGVfbWFw KTsKKwlpZiAoY3B1c19lbXB0eShncnEuY3B1X2lkbGVfbWFwKSkKKwkJZ3JxLmlkbGVfY3B1cyA9 IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBzdWl0YWJsZV9pZGxlX2NwdXMoc3RydWN0IHRhc2tf c3RydWN0ICpwKQoreworCWlmICghZ3JxLmlkbGVfY3B1cykKKwkJcmV0dXJuIGZhbHNlOworCXJl dHVybiAoY3B1c19pbnRlcnNlY3RzKHAtPmNwdXNfYWxsb3dlZCwgZ3JxLmNwdV9pZGxlX21hcCkp OworfQorCisjZGVmaW5lIENQVUlETEVfRElGRl9USFJFQUQJKDEpCisjZGVmaW5lIENQVUlETEVf RElGRl9DT1JFCSgyKQorI2RlZmluZSBDUFVJRExFX0NBQ0hFX0JVU1kJKDQpCisjZGVmaW5lIENQ VUlETEVfRElGRl9DUFUJKDgpCisjZGVmaW5lIENQVUlETEVfVEhSRUFEX0JVU1kJKDE2KQorI2Rl ZmluZSBDUFVJRExFX0RJRkZfTk9ERQkoMzIpCisKK3N0YXRpYyB2b2lkIHJlc2NoZWRfdGFzayhz dHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCisvKgorICogVGhlIGJlc3QgaWRsZSBDUFUgaXMgY2hv c2VuIGFjY29yZGluZyB0byB0aGUgQ1BVSURMRSByYW5raW5nIGFib3ZlIHdoZXJlIHRoZQorICog bG93ZXN0IHZhbHVlIHdvdWxkIGdpdmUgdGhlIG1vc3Qgc3VpdGFibGUgQ1BVIHRvIHNjaGVkdWxl IHAgb250byBuZXh0LiBUaGUKKyAqIG9yZGVyIHdvcmtzIG91dCB0byBiZSB0aGUgZm9sbG93aW5n OgorICoKKyAqIFNhbWUgY29yZSwgaWRsZSBvciBidXN5IGNhY2hlLCBpZGxlIG9yIGJ1c3kgdGhy ZWFkcworICogT3RoZXIgY29yZSwgc2FtZSBjYWNoZSwgaWRsZSBvciBidXN5IGNhY2hlLCBpZGxl IHRocmVhZHMuCisgKiBTYW1lIG5vZGUsIG90aGVyIENQVSwgaWRsZSBjYWNoZSwgaWRsZSB0aHJl YWRzLgorICogU2FtZSBub2RlLCBvdGhlciBDUFUsIGJ1c3kgY2FjaGUsIGlkbGUgdGhyZWFkcy4K KyAqIE90aGVyIGNvcmUsIHNhbWUgY2FjaGUsIGJ1c3kgdGhyZWFkcy4KKyAqIFNhbWUgbm9kZSwg b3RoZXIgQ1BVLCBidXN5IHRocmVhZHMuCisgKiBPdGhlciBub2RlLCBvdGhlciBDUFUsIGlkbGUg Y2FjaGUsIGlkbGUgdGhyZWFkcy4KKyAqIE90aGVyIG5vZGUsIG90aGVyIENQVSwgYnVzeSBjYWNo ZSwgaWRsZSB0aHJlYWRzLgorICogT3RoZXIgbm9kZSwgb3RoZXIgQ1BVLCBidXN5IHRocmVhZHMu CisgKi8KK3N0YXRpYyB2b2lkCityZXNjaGVkX2Jlc3RfbWFzayhpbnQgYmVzdF9jcHUsIHN0cnVj dCBycSAqcnEsIGNwdW1hc2tfdCAqdG1wbWFzaykKK3sKKwl1bnNpZ25lZCBpbnQgYmVzdF9yYW5r aW5nID0gQ1BVSURMRV9ESUZGX05PREUgfCBDUFVJRExFX1RIUkVBRF9CVVNZIHwKKwkJQ1BVSURM RV9ESUZGX0NQVSB8IENQVUlETEVfQ0FDSEVfQlVTWSB8IENQVUlETEVfRElGRl9DT1JFIHwKKwkJ Q1BVSURMRV9ESUZGX1RIUkVBRDsKKwlpbnQgY3B1X3RtcDsKKworCWlmIChjcHVfaXNzZXQoYmVz dF9jcHUsICp0bXBtYXNrKSkKKwkJZ290byBvdXQ7CisKKwlmb3JfZWFjaF9jcHVfbWFzayhjcHVf dG1wLCAqdG1wbWFzaykgeworCQl1bnNpZ25lZCBpbnQgcmFua2luZzsKKwkJc3RydWN0IHJxICp0 bXBfcnE7CisKKwkJcmFua2luZyA9IDA7CisJCXRtcF9ycSA9IGNwdV9ycShjcHVfdG1wKTsKKwor I2lmZGVmIENPTkZJR19OVU1BCisJCWlmIChycS0+Y3B1X2xvY2FsaXR5W2NwdV90bXBdID4gMykK KwkJCXJhbmtpbmcgfD0gQ1BVSURMRV9ESUZGX05PREU7CisJCWVsc2UKKyNlbmRpZgorCQlpZiAo cnEtPmNwdV9sb2NhbGl0eVtjcHVfdG1wXSA+IDIpCisJCQlyYW5raW5nIHw9IENQVUlETEVfRElG Rl9DUFU7CisjaWZkZWYgQ09ORklHX1NDSEVEX01DCisJCWlmIChycS0+Y3B1X2xvY2FsaXR5W2Nw dV90bXBdID09IDIpCisJCQlyYW5raW5nIHw9IENQVUlETEVfRElGRl9DT1JFOworCQlpZiAoISh0 bXBfcnEtPmNhY2hlX2lkbGUoY3B1X3RtcCkpKQorCQkJcmFua2luZyB8PSBDUFVJRExFX0NBQ0hF X0JVU1k7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisJCWlmIChycS0+Y3B1X2xv Y2FsaXR5W2NwdV90bXBdID09IDEpCisJCQlyYW5raW5nIHw9IENQVUlETEVfRElGRl9USFJFQUQ7 CisJCWlmICghKHRtcF9ycS0+c2libGluZ3NfaWRsZShjcHVfdG1wKSkpCisJCQlyYW5raW5nIHw9 IENQVUlETEVfVEhSRUFEX0JVU1k7CisjZW5kaWYKKwkJaWYgKHJhbmtpbmcgPCBiZXN0X3Jhbmtp bmcpIHsKKwkJCWJlc3RfY3B1ID0gY3B1X3RtcDsKKwkJCWJlc3RfcmFua2luZyA9IHJhbmtpbmc7 CisJCX0KKwl9CitvdXQ6CisJcmVzY2hlZF90YXNrKGNwdV9ycShiZXN0X2NwdSktPmN1cnIpOwor fQorCitzdGF0aWMgdm9pZCByZXNjaGVkX2Jlc3RfaWRsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAp Cit7CisJY3B1bWFza190IHRtcG1hc2s7CisKKwljcHVzX2FuZCh0bXBtYXNrLCBwLT5jcHVzX2Fs bG93ZWQsIGdycS5jcHVfaWRsZV9tYXApOworCXJlc2NoZWRfYmVzdF9tYXNrKHRhc2tfY3B1KHAp LCB0YXNrX3JxKHApLCAmdG1wbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNjaGVk X3N1aXRhYmxlX2lkbGUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWlmIChzdWl0YWJsZV9p ZGxlX2NwdXMocCkpCisJCXJlc2NoZWRfYmVzdF9pZGxlKHApOworfQorLyoKKyAqIEZsYWdzIHRv IHRlbGwgdXMgd2hldGhlciB0aGlzIENQVSBpcyBydW5uaW5nIGEgQ1BVIGZyZXF1ZW5jeSBnb3Zl cm5vciB0aGF0CisgKiBoYXMgc2xvd2VkIGl0cyBzcGVlZCBvciBub3QuIE5vIGxvY2tpbmcgcmVx dWlyZWQgYXMgdGhlIHZlcnkgcmFyZSB3cm9uZ2x5CisgKiByZWFkIHZhbHVlIHdvdWxkIGJlIGhh cm1sZXNzLgorICovCit2b2lkIGNwdV9zY2FsaW5nKGludCBjcHUpCit7CisJY3B1X3JxKGNwdSkt PnNjYWxpbmcgPSB0cnVlOworfQorCit2b2lkIGNwdV9ub25zY2FsaW5nKGludCBjcHUpCit7CisJ Y3B1X3JxKGNwdSktPnNjYWxpbmcgPSBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHNj YWxpbmdfcnEoc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4gcnEtPnNjYWxpbmc7Cit9CisKK3N0 YXRpYyBpbmxpbmUgaW50IGxvY2FsaXR5X2RpZmYoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1 Y3QgcnEgKnJxKQoreworCXJldHVybiBycS0+Y3B1X2xvY2FsaXR5W3Rhc2tfY3B1KHApXTsKK30K KyNlbHNlIC8qIENPTkZJR19TTVAgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpbmNfcW5yKHZvaWQp Cit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWNfcW5yKHZvaWQpCit7Cit9CisKK3N0YXRp YyBpbmxpbmUgaW50IHF1ZXVlZF9ub3RydW5uaW5nKHZvaWQpCit7CisJcmV0dXJuIGdycS5ucl9y dW5uaW5nOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X2NwdWlkbGVfbWFwKGludCBjcHUp Cit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9jcHVpZGxlX21hcChpbnQgY3B1KQor eworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3VpdGFibGVfaWRsZV9jcHVzKHN0cnVjdCB0YXNr X3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gY3VycmVudCA9PSB1cHJxLT5pZGxlOworfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgcmVzY2hlZF9zdWl0YWJsZV9pZGxlKHN0cnVjdCB0YXNrX3N0cnVjdCAq cCkKK3sKK30KKwordm9pZCBjcHVfc2NhbGluZyhpbnQgX191bnVzZWQpCit7Cit9CisKK3ZvaWQg Y3B1X25vbnNjYWxpbmcoaW50IF9fdW51c2VkKQoreworfQorCisvKgorICogQWx0aG91Z2ggQ1BV cyBjYW4gc2NhbGUgaW4gVVAsIHRoZXJlIGlzIG5vd2hlcmUgZWxzZSBmb3IgdGFza3MgdG8gZ28g c28gdGhpcworICogYWx3YXlzIHJldHVybnMgMC4KKyAqLworc3RhdGljIGlubGluZSBib29sIHNj YWxpbmdfcnEoc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBp bmxpbmUgaW50IGxvY2FsaXR5X2RpZmYoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEg KnJxKQoreworCXJldHVybiAwOworfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK0VYUE9SVF9T WU1CT0xfR1BMKGNwdV9zY2FsaW5nKTsKK0VYUE9SVF9TWU1CT0xfR1BMKGNwdV9ub25zY2FsaW5n KTsKKworLyoKKyAqIGFjdGl2YXRlX2lkbGVfdGFzayAtIG1vdmUgaWRsZSB0YXNrIHRvIHRoZSBf ZnJvbnRfIG9mIHJ1bnF1ZXVlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfaWRs ZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwllbnF1ZXVlX3Rhc2tfaGVhZChwKTsK KwlncnEubnJfcnVubmluZysrOworCWluY19xbnIoKTsKK30KKworLyoKKyAqIGFjdGl2YXRlX3Rh c2sgLSBtb3ZlIGEgdGFzayB0byB0aGUgcnVucXVldWUuIEVudGVyIHdpdGggZ3JxIGxvY2tlZC4K KyAqLworc3RhdGljIHZvaWQgYWN0aXZhdGVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0 cnVjdCBycSAqcnEpCit7CisJLyoKKwkgKiBTbGVlcCB0aW1lIGlzIGluIHVuaXRzIG9mIG5hbm9z ZWNzLCBzbyBzaGlmdCBieSAyMCB0byBnZXQgYQorCSAqIG1pbGxpc2Vjb25kcy1yYW5nZSBlc3Rp bWF0aW9uIG9mIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0IHRoZSB0YXNrCisJICogc3BlbnQgc2xl ZXBpbmc6CisJICovCisJaWYgKHVubGlrZWx5KHByb2Zfb24gPT0gU0xFRVBfUFJPRklMSU5HKSkg eworCQlpZiAocC0+c3RhdGUgPT0gVEFTS19VTklOVEVSUlVQVElCTEUpCisJCQlwcm9maWxlX2hp dHMoU0xFRVBfUFJPRklMSU5HLCAodm9pZCAqKWdldF93Y2hhbihwKSwKKwkJCQkJIChycS0+Y2xv Y2sgLSBwLT5sYXN0X3JhbikgPj4gMjApOworCQkKKwl9CisKKwlpZiAodGFza19jb250cmlidXRl c190b19sb2FkKHApKQorCQlncnEubnJfdW5pbnRlcnJ1cHRpYmxlLS07CisJZW5xdWV1ZV90YXNr X2hlYWQocCk7CisJZ3JxLm5yX3J1bm5pbmcrKzsKKwlpbmNfcW5yKCk7Cit9CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBjbGVhcl9zdGlja3koc3RydWN0IHRhc2tfc3RydWN0ICpwKTsKKworLyoKKyAq IGRlYWN0aXZhdGVfdGFzayAtIElmIGl0J3MgcnVubmluZywgaXQncyBub3Qgb24gdGhlIGdycSBh bmQgd2UgY2FuIGp1c3QKKyAqIGRlY3JlbWVudCB0aGUgbnJfcnVubmluZy4gRW50ZXIgd2l0aCBn cnEgbG9ja2VkLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgZGVhY3RpdmF0ZV90YXNrKHN0cnVj dCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlpZiAodGFza19jb250cmlidXRlc190b19sb2FkKHApKQor CQlncnEubnJfdW5pbnRlcnJ1cHRpYmxlKys7CisJZ3JxLm5yX3J1bm5pbmctLTsKKwljbGVhcl9z dGlja3kocCk7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCit2b2lkIHNldF90YXNrX2NwdShzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBjcHUpCit7CisjaWZkZWYgQ09ORklHX0xP Q0tERVAKKwkvKgorCSAqIFRoZSBjYWxsZXIgc2hvdWxkIGhvbGQgZ3JxIGxvY2suCisJICovCisJ V0FSTl9PTl9PTkNFKGRlYnVnX2xvY2tzICYmICFsb2NrZGVwX2lzX2hlbGQoJmdycS5sb2NrKSk7 CisjZW5kaWYKKwl0cmFjZV9zY2hlZF9taWdyYXRlX3Rhc2socCwgY3B1KTsKKwlpZiAodGFza19j cHUocCkgIT0gY3B1KQorCQlwZXJmX3N3X2V2ZW50KFBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElP TlMsIDEsIE5VTEwsIDApOworCisJLyoKKwkgKiBBZnRlciAtPmNwdSBpcyBzZXQgdXAgdG8gYSBu ZXcgdmFsdWUsIHRhc2tfZ3JxX2xvY2socCwgLi4uKSBjYW4gYmUKKwkgKiBzdWNjZXNzZnVsbHkg ZXhlY3V0ZWQgb24gYW5vdGhlciBDUFUuIFdlIG11c3QgZW5zdXJlIHRoYXQgdXBkYXRlcyBvZgor CSAqIHBlci10YXNrIGRhdGEgaGF2ZSBiZWVuIGNvbXBsZXRlZCBieSB0aGlzIG1vbWVudC4KKwkg Ki8KKwlzbXBfd21iKCk7CisJdGFza190aHJlYWRfaW5mbyhwKS0+Y3B1ID0gY3B1OworfQorCitz dGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc3RpY2t5KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sK KwlwLT5zdGlja3kgPSBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHRhc2tfc3RpY2t5 KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+c3RpY2t5OworfQorCisvKiBS ZXNjaGVkdWxlIHRoZSBiZXN0IGlkbGUgQ1BVIHRoYXQgaXMgbm90IHRoaXMgb25lLiAqLworc3Rh dGljIHZvaWQKK3Jlc2NoZWRfY2xvc2VzdF9pZGxlKHN0cnVjdCBycSAqcnEsIGludCBjcHUsIHN0 cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwljcHVtYXNrX3QgdG1wbWFzazsKKworCWNwdXNfYW5k KHRtcG1hc2ssIHAtPmNwdXNfYWxsb3dlZCwgZ3JxLmNwdV9pZGxlX21hcCk7CisJY3B1X2NsZWFy KGNwdSwgdG1wbWFzayk7CisJaWYgKGNwdXNfZW1wdHkodG1wbWFzaykpCisJCXJldHVybjsKKwly ZXNjaGVkX2Jlc3RfbWFzayhjcHUsIHJxLCAmdG1wbWFzayk7Cit9CisKKy8qCisgKiBXZSBzZXQg dGhlIHN0aWNreSBmbGFnIG9uIGEgdGFzayB0aGF0IGlzIGRlc2NoZWR1bGVkIGludm9sdW50YXJp bHkgbWVhbmluZworICogaXQgaXMgYXdhaXRpbmcgZnVydGhlciBDUFUgdGltZS4gSWYgdGhlIGxh c3Qgc3RpY2t5IHRhc2sgaXMgc3RpbGwgc3RpY2t5CisgKiBidXQgdW5sdWNreSBlbm91Z2ggdG8g bm90IGJlIHRoZSBuZXh0IHRhc2sgc2NoZWR1bGVkLCB3ZSB1bnN0aWNrIGl0IGFuZCB0cnkKKyAq IHRvIGZpbmQgaXQgYW4gaWRsZSBDUFUuIFJlYWx0aW1lIHRhc2tzIGRvIG5vdCBzdGljayB0byBt aW5pbWlzZSB0aGVpcgorICogbGF0ZW5jeSBhdCBhbGwgdGltZXMuCisgKi8KK3N0YXRpYyBpbmxp bmUgdm9pZAorc3dhcF9zdGlja3koc3RydWN0IHJxICpycSwgaW50IGNwdSwgc3RydWN0IHRhc2tf c3RydWN0ICpwKQoreworCWlmIChycS0+c3RpY2t5X3Rhc2spIHsKKwkJaWYgKHJxLT5zdGlja3lf dGFzayA9PSBwKSB7CisJCQlwLT5zdGlja3kgPSB0cnVlOworCQkJcmV0dXJuOworCQl9CisJCWlm ICh0YXNrX3N0aWNreShycS0+c3RpY2t5X3Rhc2spKSB7CisJCQljbGVhcl9zdGlja3kocnEtPnN0 aWNreV90YXNrKTsKKwkJCXJlc2NoZWRfY2xvc2VzdF9pZGxlKHJxLCBjcHUsIHJxLT5zdGlja3lf dGFzayk7CisJCX0KKwl9CisJaWYgKCFydF90YXNrKHApKSB7CisJCXAtPnN0aWNreSA9IHRydWU7 CisJCXJxLT5zdGlja3lfdGFzayA9IHA7CisJfSBlbHNlIHsKKwkJcmVzY2hlZF9jbG9zZXN0X2lk bGUocnEsIGNwdSwgcCk7CisJCXJxLT5zdGlja3lfdGFzayA9IE5VTEw7CisJfQorfQorCitzdGF0 aWMgaW5saW5lIHZvaWQgdW5zdGlja190YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0 cnVjdCAqcCkKK3sKKwlycS0+c3RpY2t5X3Rhc2sgPSBOVUxMOworCWNsZWFyX3N0aWNreShwKTsK K30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2xlYXJfc3RpY2t5KHN0cnVjdCB0YXNrX3N0 cnVjdCAqcCkKK3sKK30KKworc3RhdGljIGlubGluZSBib29sIHRhc2tfc3RpY2t5KHN0cnVjdCB0 YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p ZAorc3dhcF9zdGlja3koc3RydWN0IHJxICpycSwgaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0 ICpwKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdW5zdGlja190YXNrKHN0cnVjdCBycSAq cnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKK30KKyNlbmRpZgorCisKKy8qCisgKiByZXNj aGVkX3Rhc2sgLSBtYXJrIGEgdGFzayAndG8gYmUgcmVzY2hlZHVsZWQgbm93Jy4KKyAqCisgKiBP biBVUCB0aGlzIG1lYW5zIHRoZSBzZXR0aW5nIG9mIHRoZSBuZWVkX3Jlc2NoZWQgZmxhZywgb24g U01QIGl0CisgKiBtaWdodCBhbHNvIGludm9sdmUgYSBjcm9zcy1DUFUgY2FsbCB0byB0cmlnZ2Vy IHRoZSBzY2hlZHVsZXIgb24KKyAqIHRoZSB0YXJnZXQgQ1BVLgorICovCisjaWZkZWYgQ09ORklH X1NNUAorCisjaWZuZGVmIHRza19pc19wb2xsaW5nCisjZGVmaW5lIHRza19pc19wb2xsaW5nKHQp IHRlc3RfdHNrX3RocmVhZF9mbGFnKHQsIFRJRl9QT0xMSU5HX05SRkxBRykKKyNlbmRpZgorCitz dGF0aWMgdm9pZCByZXNjaGVkX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWludCBj cHU7CisKKwlhc3NlcnRfcmF3X3NwaW5fbG9ja2VkKCZncnEubG9jayk7CisKKwlpZiAodW5saWtl bHkodGVzdF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05FRURfUkVTQ0hFRCkpKQorCQlyZXR1cm47 CisKKwlzZXRfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9ORUVEX1JFU0NIRUQpOworCisJY3B1ID0g dGFza19jcHUocCk7CisJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXJldHVybjsK KworCS8qIE5FRURfUkVTQ0hFRCBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdlIHRlc3QgcG9sbGlu ZyAqLworCXNtcF9tYigpOworCWlmICghdHNrX2lzX3BvbGxpbmcocCkpCisJCXNtcF9zZW5kX3Jl c2NoZWR1bGUoY3B1KTsKK30KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNjaGVkX3Rh c2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWFzc2VydF9yYXdfc3Bpbl9sb2NrZWQoJmdy cS5sb2NrKTsKKwlzZXRfdHNrX25lZWRfcmVzY2hlZChwKTsKK30KKyNlbmRpZgorCisvKioKKyAq IHRhc2tfY3VyciAtIGlzIHRoaXMgdGFzayBjdXJyZW50bHkgZXhlY3V0aW5nIG9uIGEgQ1BVPwor ICogQHA6IHRoZSB0YXNrIGluIHF1ZXN0aW9uLgorICovCitpbmxpbmUgaW50IHRhc2tfY3Vycihj b25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIGNwdV9jdXJyKHRhc2tfY3B1 KHApKSA9PSBwOworfQorCisjaWZkZWYgQ09ORklHX1NNUAorc3RydWN0IG1pZ3JhdGlvbl9yZXEg eworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwlpbnQgZGVzdF9jcHU7Cit9OworCisvKgor ICogd2FpdF90YXNrX2luYWN0aXZlIC0gd2FpdCBmb3IgYSB0aHJlYWQgdG8gdW5zY2hlZHVsZS4K KyAqCisgKiBJZiBAbWF0Y2hfc3RhdGUgaXMgbm9uemVybywgaXQncyB0aGUgQHAtPnN0YXRlIHZh bHVlIGp1c3QgY2hlY2tlZCBhbmQKKyAqIG5vdCBleHBlY3RlZCB0byBjaGFuZ2UuICBJZiBpdCBj aGFuZ2VzLCBpLmUuIEBwIG1pZ2h0IGhhdmUgd29rZW4gdXAsCisgKiB0aGVuIHJldHVybiB6ZXJv LiAgV2hlbiB3ZSBzdWNjZWVkIGluIHdhaXRpbmcgZm9yIEBwIHRvIGJlIG9mZiBpdHMgQ1BVLAor ICogd2UgcmV0dXJuIGEgcG9zaXRpdmUgbnVtYmVyIChpdHMgdG90YWwgc3dpdGNoIGNvdW50KS4g IElmIGEgc2Vjb25kIGNhbGwKKyAqIGEgc2hvcnQgd2hpbGUgbGF0ZXIgcmV0dXJucyB0aGUgc2Ft ZSBudW1iZXIsIHRoZSBjYWxsZXIgY2FuIGJlIHN1cmUgdGhhdAorICogQHAgaGFzIHJlbWFpbmVk IHVuc2NoZWR1bGVkIHRoZSB3aG9sZSB0aW1lLgorICoKKyAqIFRoZSBjYWxsZXIgbXVzdCBlbnN1 cmUgdGhhdCB0aGUgdGFzayAqd2lsbCogdW5zY2hlZHVsZSBzb21ldGltZSBzb29uLAorICogZWxz ZSB0aGlzIGZ1bmN0aW9uIG1pZ2h0IHNwaW4gZm9yIGEgKmxvbmcqIHRpbWUuIFRoaXMgZnVuY3Rp b24gY2FuJ3QKKyAqIGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLCBvciBpdCBtYXkgaW50 cm9kdWNlIGRlYWRsb2NrIHdpdGgKKyAqIHNtcF9jYWxsX2Z1bmN0aW9uKCkgaWYgYW4gSVBJIGlz IHNlbnQgYnkgdGhlIHNhbWUgcHJvY2VzcyB3ZSBhcmUKKyAqIHdhaXRpbmcgdG8gYmVjb21lIGlu YWN0aXZlLgorICovCit1bnNpZ25lZCBsb25nIHdhaXRfdGFza19pbmFjdGl2ZShzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnAsIGxvbmcgbWF0Y2hfc3RhdGUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK Kwlib29sIHJ1bm5pbmcsIG9uX3JxOworCXVuc2lnbmVkIGxvbmcgbmNzdzsKKwlzdHJ1Y3QgcnEg KnJxOworCisJZm9yICg7OykgeworCQkvKgorCQkgKiBXZSBkbyB0aGUgaW5pdGlhbCBlYXJseSBo ZXVyaXN0aWNzIHdpdGhvdXQgaG9sZGluZworCQkgKiBhbnkgdGFzay1xdWV1ZSBsb2NrcyBhdCBh bGwuIFdlJ2xsIG9ubHkgdHJ5IHRvIGdldAorCQkgKiB0aGUgcnVucXVldWUgbG9jayB3aGVuIHRo aW5ncyBsb29rIGxpa2UgdGhleSB3aWxsCisJCSAqIHdvcmsgb3V0ISBJbiB0aGUgdW5saWtlbHkg ZXZlbnQgcnEgaXMgZGVyZWZlcmVuY2VkCisJCSAqIHNpbmNlIHdlJ3JlIGxvY2tsZXNzLCBncmFi IGl0IGFnYWluLgorCQkgKi8KKyNpZmRlZiBDT05GSUdfU01QCityZXRyeV9ycToKKwkJcnEgPSB0 YXNrX3JxKHApOworCQlpZiAodW5saWtlbHkoIXJxKSkKKwkJCWdvdG8gcmV0cnlfcnE7CisjZWxz ZSAvKiBDT05GSUdfU01QICovCisJCXJxID0gdGFza19ycShwKTsKKyNlbmRpZgorCQkvKgorCQkg KiBJZiB0aGUgdGFzayBpcyBhY3RpdmVseSBydW5uaW5nIG9uIGFub3RoZXIgQ1BVCisJCSAqIHN0 aWxsLCBqdXN0IHJlbGF4IGFuZCBidXN5LXdhaXQgd2l0aG91dCBob2xkaW5nCisJCSAqIGFueSBs b2Nrcy4KKwkJICoKKwkJICogTk9URSEgU2luY2Ugd2UgZG9uJ3QgaG9sZCBhbnkgbG9ja3MsIGl0 J3Mgbm90CisJCSAqIGV2ZW4gc3VyZSB0aGF0ICJycSIgc3RheXMgYXMgdGhlIHJpZ2h0IHJ1bnF1 ZXVlIQorCQkgKiBCdXQgd2UgZG9uJ3QgY2FyZSwgc2luY2UgdGhpcyB3aWxsIHJldHVybiBmYWxz ZQorCQkgKiBpZiB0aGUgcnVucXVldWUgaGFzIGNoYW5nZWQgYW5kIHAgaXMgYWN0dWFsbHkgbm93 CisJCSAqIHJ1bm5pbmcgc29tZXdoZXJlIGVsc2UhCisJCSAqLworCQl3aGlsZSAodGFza19ydW5u aW5nKHApICYmIHAgPT0gcnEtPmN1cnIpIHsKKwkJCWlmIChtYXRjaF9zdGF0ZSAmJiB1bmxpa2Vs eShwLT5zdGF0ZSAhPSBtYXRjaF9zdGF0ZSkpCisJCQkJcmV0dXJuIDA7CisJCQljcHVfcmVsYXgo KTsKKwkJfQorCisJCS8qCisJCSAqIE9rLCB0aW1lIHRvIGxvb2sgbW9yZSBjbG9zZWx5ISBXZSBu ZWVkIHRoZSBncnEKKwkJICogbG9jayBub3csIHRvIGJlICpzdXJlKi4gSWYgd2UncmUgd3Jvbmcs IHdlJ2xsCisJCSAqIGp1c3QgZ28gYmFjayBhbmQgcmVwZWF0LgorCQkgKi8KKwkJcnEgPSB0YXNr X2dycV9sb2NrKHAsICZmbGFncyk7CisJCXRyYWNlX3NjaGVkX3dhaXRfdGFzayhwKTsKKwkJcnVu bmluZyA9IHRhc2tfcnVubmluZyhwKTsKKwkJb25fcnEgPSB0YXNrX3F1ZXVlZChwKTsKKwkJbmNz dyA9IDA7CisJCWlmICghbWF0Y2hfc3RhdGUgfHwgcC0+c3RhdGUgPT0gbWF0Y2hfc3RhdGUpCisJ CQluY3N3ID0gcC0+bnZjc3cgfCBMT05HX01JTjsgLyogc2V0cyBNU0IgKi8KKwkJdGFza19ncnFf dW5sb2NrKCZmbGFncyk7CisKKwkJLyoKKwkJICogSWYgaXQgY2hhbmdlZCBmcm9tIHRoZSBleHBl Y3RlZCBzdGF0ZSwgYmFpbCBvdXQgbm93LgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCFuY3N3KSkK KwkJCWJyZWFrOworCisJCS8qCisJCSAqIFdhcyBpdCByZWFsbHkgcnVubmluZyBhZnRlciBhbGwg bm93IHRoYXQgd2UKKwkJICogY2hlY2tlZCB3aXRoIHRoZSBwcm9wZXIgbG9ja3MgYWN0dWFsbHkg aGVsZD8KKwkJICoKKwkJICogT29wcy4gR28gYmFjayBhbmQgdHJ5IGFnYWluLi4KKwkJICovCisJ CWlmICh1bmxpa2VseShydW5uaW5nKSkgeworCQkJY3B1X3JlbGF4KCk7CisJCQljb250aW51ZTsK KwkJfQorCisJCS8qCisJCSAqIEl0J3Mgbm90IGVub3VnaCB0aGF0IGl0J3Mgbm90IGFjdGl2ZWx5 IHJ1bm5pbmcsCisJCSAqIGl0IG11c3QgYmUgb2ZmIHRoZSBydW5xdWV1ZSBfZW50aXJlbHlfLCBh bmQgbm90CisJCSAqIHByZWVtcHRlZCEKKwkJICoKKwkJICogU28gaWYgaXQgd2FzIHN0aWxsIHJ1 bm5hYmxlIChidXQganVzdCBub3QgYWN0aXZlbHkKKwkJICogcnVubmluZyByaWdodCBub3cpLCBp dCdzIHByZWVtcHRlZCwgYW5kIHdlIHNob3VsZAorCQkgKiB5aWVsZCAtIGl0IGNvdWxkIGJlIGEg d2hpbGUuCisJCSAqLworCQlpZiAodW5saWtlbHkob25fcnEpKSB7CisJCQlrdGltZV90IHRvID0g a3RpbWVfc2V0KDAsIE5TRUNfUEVSX1NFQyAvIEhaKTsKKworCQkJc2V0X2N1cnJlbnRfc3RhdGUo VEFTS19VTklOVEVSUlVQVElCTEUpOworCQkJc2NoZWR1bGVfaHJ0aW1lb3V0KCZ0bywgSFJUSU1F Ul9NT0RFX1JFTCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIEFoaCwgYWxsIGdv b2QuIEl0IHdhc24ndCBydW5uaW5nLCBhbmQgaXQgd2Fzbid0CisJCSAqIHJ1bm5hYmxlLCB3aGlj aCBtZWFucyB0aGF0IGl0IHdpbGwgbmV2ZXIgYmVjb21lCisJCSAqIHJ1bm5pbmcgaW4gdGhlIGZ1 dHVyZSBlaXRoZXIuIFdlJ3JlIGFsbCBkb25lIQorCQkgKi8KKwkJYnJlYWs7CisJfQorCisJcmV0 dXJuIG5jc3c7Cit9CisKKy8qKioKKyAqIGtpY2tfcHJvY2VzcyAtIGtpY2sgYSBydW5uaW5nIHRo cmVhZCB0byBlbnRlci9leGl0IHRoZSBrZXJuZWwKKyAqIEBwOiB0aGUgdG8tYmUta2lja2VkIHRo cmVhZAorICoKKyAqIENhdXNlIGEgcHJvY2VzcyB3aGljaCBpcyBydW5uaW5nIG9uIGFub3RoZXIg Q1BVIHRvIGVudGVyCisgKiBrZXJuZWwtbW9kZSwgd2l0aG91dCBhbnkgZGVsYXkuICh0byBnZXQg c2lnbmFscyBoYW5kbGVkLikKKyAqCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2 ZSB0byB0YWtlIHRoZSBydW5xdWV1ZSBsb2NrLAorICogYmVjYXVzZSBhbGwgaXQgd2FudHMgdG8g ZW5zdXJlIGlzIHRoYXQgdGhlIHJlbW90ZSB0YXNrIGVudGVycworICogdGhlIGtlcm5lbC4gSWYg dGhlIElQSSByYWNlcyBhbmQgdGhlIHRhc2sgaGFzIGJlZW4gbWlncmF0ZWQKKyAqIHRvIGFub3Ro ZXIgQ1BVIHRoZW4gbm8gaGFybSBpcyBkb25lIGFuZCB0aGUgcHVycG9zZSBoYXMgYmVlbgorICog YWNoaWV2ZWQgYXMgd2VsbC4KKyAqLwordm9pZCBraWNrX3Byb2Nlc3Moc3RydWN0IHRhc2tfc3Ry dWN0ICpwKQoreworCWludCBjcHU7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwljcHUgPSB0YXNr X2NwdShwKTsKKwlpZiAoKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpICYmIHRhc2tfY3Vycihw KSkKKwkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOworCXByZWVtcHRfZW5hYmxlKCk7Cit9CitF WFBPUlRfU1lNQk9MX0dQTChraWNrX3Byb2Nlc3MpOworI2VuZGlmCisKKyNkZWZpbmUgcnFfaWRs ZShycSkJKChycSktPnJxX3ByaW8gPT0gUFJJT19MSU1JVCkKKworLyoKKyAqIFJUIHRhc2tzIHBy ZWVtcHQgb24gcHJpb3JpdHkuCisgKiBOT1JNQUwgdGFza3MgcHJlZW1wdCBvbiBzbGVlcCB0aW1l IGxlbmd0aC4KKyAqIFNDSEVEX0lETEVQUklPIGRvbid0IHByZWVtcHQgYW55dGhpbmcgZWxzZSBv cgorICogYmV0d2VlbiB0aGVtc2VsdmVzLCB0aGV5IGNvb3BlcmF0aXZlbHkgbXVsdGl0YXNrLiBB biBpZGxlIHJxIHNjb3JlcyBhcworICogcHJpbyBQUklPX0xJTUlUIHNvIGl0IGlzIGFsd2F5cyBw cmVlbXB0ZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbAorY2FuX3ByZWVtcHQoc3RydWN0IHRh c2tfc3RydWN0ICpwLCBpbnQgcHJpbykKK3sKKwlpZiAocC0+cHJpbyA8PSBwcmlvKQorCQlyZXR1 cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCisjaWZkZWYg Q09ORklHX0hPVFBMVUdfQ1BVCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgdGFz ayB0aGF0IGlzIGFmZmluZWQgb25seSB0byBvZmZsaW5lIENQVXMgYnV0CisgKiBzdGlsbCB3YW50 cyBydW50aW1lLiBUaGlzIGhhcHBlbnMgdG8ga2VybmVsIHRocmVhZHMgZHVyaW5nIHN1c3BlbmQv aGFsdCBhbmQKKyAqIGRpc2FibGluZyBvZiBDUFVzLgorICovCisjZGVmaW5lIGNwdV9vbmxpbmVf bWFwCQkoKihjcHVtYXNrX3QgKiljcHVfb25saW5lX21hc2spCitzdGF0aWMgaW5saW5lIGJvb2wg b25saW5lX2NwdXMoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiAobGlrZWx5KGNw dXNfaW50ZXJzZWN0cyhjcHVfb25saW5lX21hcCwgcC0+Y3B1c19hbGxvd2VkKSkpOworfQorI2Vs c2UgLyogQ09ORklHX0hPVFBMVUdfQ1BVICovCisvKiBBbGwgYXZhaWxhYmxlIENQVXMgYXJlIGFs d2F5cyBvbmxpbmUgd2l0aG91dCBob3RwbHVnLiAqLworc3RhdGljIGlubGluZSBib29sIG9ubGlu ZV9jcHVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gdHJ1ZTsKK30KKyNlbmRp ZgorCisvKgorICogQ2hlY2sgdG8gc2VlIGlmIHAgY2FuIHJ1biBvbiBjcHUsIGFuZCBpZiBub3Qs IHdoZXRoZXIgdGhlcmUgYXJlIGFueSBvbmxpbmUKKyAqIENQVXMgaXQgY2FuIHJ1biBvbiBpbnN0 ZWFkLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgbmVlZHNfb3RoZXJfY3B1KHN0cnVjdCB0YXNr X3N0cnVjdCAqcCwgaW50IGNwdSkKK3sKKwlpZiAodW5saWtlbHkoIWNwdV9pc3NldChjcHUsIHAt PmNwdXNfYWxsb3dlZCkpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8q CisgKiBXaGVuIGFsbCBlbHNlIGlzIGVxdWFsLCBzdGlsbCBwcmVmZXIgdGhpc19ycS4KKyAqLwor c3RhdGljIHZvaWQgdHJ5X3ByZWVtcHQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEg KnRoaXNfcnEpCit7CisJc3RydWN0IHJxICpoaWdoZXN0X3ByaW9fcnEgPSBOVUxMOworCWludCBj cHUsIGhpZ2hlc3RfcHJpbyA9IDA7CisJY3B1bWFza190IHRtcDsKKworCS8qCisJICogV2UgY2xl YXIgdGhlIHN0aWNreSBmbGFnIGhlcmUgYmVjYXVzZSBmb3IgYSB0YXNrIHRvIGhhdmUgY2FsbGVk CisJICogdHJ5X3ByZWVtcHQgd2l0aCB0aGUgc3RpY2t5IGZsYWcgZW5hYmxlZCBtZWFucyBzb21l IGNvbXBsaWNhdGVkCisJICogcmUtc2NoZWR1bGluZyBoYXMgb2NjdXJyZWQgYW5kIHdlIHNob3Vs ZCBpZ25vcmUgdGhlIHN0aWNreSBmbGFnLgorCSAqLworCWNsZWFyX3N0aWNreShwKTsKKworCWlm IChzdWl0YWJsZV9pZGxlX2NwdXMocCkpIHsKKwkJcmVzY2hlZF9iZXN0X2lkbGUocCk7CisJCXJl dHVybjsKKwl9CisKKwkvKiBJRExFUFJJTyB0YXNrcyBuZXZlciBwcmVlbXB0IGFueXRoaW5nIGJ1 dCBpZGxlICovCisJaWYgKHAtPnBvbGljeSA9PSBTQ0hFRF9JRExFUFJJTykKKwkJcmV0dXJuOwor CisJaWYgKGxpa2VseShvbmxpbmVfY3B1cyhwKSkpCisJCWNwdXNfYW5kKHRtcCwgY3B1X29ubGlu ZV9tYXAsIHAtPmNwdXNfYWxsb3dlZCk7CisJZWxzZQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9j cHVfbWFzayhjcHUsIHRtcCkgeworCQlzdHJ1Y3QgcnEgKnJxOworCQlpbnQgcnFfcHJpbzsKKwor CQlycSA9IGNwdV9ycShjcHUpOworCQlycV9wcmlvID0gcnEtPnJxX3ByaW87CisJCWlmIChycV9w cmlvIDwgaGlnaGVzdF9wcmlvKQorCQkJY29udGludWU7CisJCQorCQlpZiAocnFfcHJpbyA+IGhp Z2hlc3RfcHJpbykgeworCQkJaGlnaGVzdF9wcmlvID0gcnFfcHJpbzsKKwkJCWhpZ2hlc3RfcHJp b19ycSA9IHJxOworCQl9CisJfQorCisJaWYgKGxpa2VseShoaWdoZXN0X3ByaW9fcnEpKSB7CisJ CWlmIChjYW5fcHJlZW1wdChwLCBoaWdoZXN0X3ByaW8pKQorCQkJcmVzY2hlZF90YXNrKGhpZ2hl c3RfcHJpb19ycS0+Y3Vycik7CisJfQorfQorI2Vsc2UgLyogQ09ORklHX1NNUCAqLworc3RhdGlj IGlubGluZSBib29sIG5lZWRzX290aGVyX2NwdShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBj cHUpCit7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgdm9pZCB0cnlfcHJlZW1wdChzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBycSAqdGhpc19ycSkKK3sKKwlpZiAocC0+cG9saWN5 ID09IFNDSEVEX0lETEVQUklPKQorCQlyZXR1cm47CisJaWYgKGNhbl9wcmVlbXB0KHAsIHVwcnEt PnJxX3ByaW8pKSAKKwkJcmVzY2hlZF90YXNrKGN1cnJlbnQpOworfQorI2VuZGlmIC8qIENPTkZJ R19TTVAgKi8KKworc3RhdGljIHZvaWQKK3R0d3Vfc3RhdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAs IGludCBjcHUsIGludCB3YWtlX2ZsYWdzKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHR3 dV9hY3RpdmF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVjdCBycSAqcnEsCisJCQkJIGJv b2wgaXNfc3luYykKK3sKKwlhY3RpdmF0ZV90YXNrKHAsIHJxKTsKKworCS8qCisJICogU3luYyB3 YWtldXBzIChpLmUuIHRob3NlIHR5cGVzIG9mIHdha2V1cHMgd2hlcmUgdGhlIHdha2VyCisJICog aGFzIGluZGljYXRlZCB0aGF0IGl0IHdpbGwgbGVhdmUgdGhlIENQVSBpbiBzaG9ydCBvcmRlcikK KwkgKiBkb24ndCB0cmlnZ2VyIGEgcHJlZW1wdGlvbiBpZiB0aGVyZSBhcmUgbm8gaWRsZSBjcHVz LAorCSAqIGluc3RlYWQgd2FpdGluZyBmb3IgY3VycmVudCB0byBkZXNjaGVkdWxlLgorCSAqLwor CWlmICghaXNfc3luYyB8fCBzdWl0YWJsZV9pZGxlX2NwdXMocCkpIHsKKwkJdHJ5X3ByZWVtcHQo cCwgcnEpOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHR0d3VfcG9zdF9hY3RpdmF0aW9u KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHJxICpycSwKKwkJCQkJYm9vbCBzdWNjZXNz KQoreworCXRyYWNlX3NjaGVkX3dha2V1cChwLCBzdWNjZXNzKTsKKwlwLT5zdGF0ZSA9IFRBU0tf UlVOTklORzsKKworCS8qCisJICogaWYgYSB3b3JrZXIgaXMgd2FraW5nIHVwLCBub3RpZnkgd29y a3F1ZXVlLiBOb3RlIHRoYXQgb24gQkZTLCB3ZQorCSAqIGRvbid0IHJlYWxseSBrbm93IHdoYXQg Y3B1IGl0IHdpbGwgYmUsIHNvIHdlIGZha2UgaXQgZm9yCisJICogd3Ffd29ya2VyX3dha2luZ191 cCA6LworCSAqLworCWlmICgocC0+ZmxhZ3MgJiBQRl9XUV9XT1JLRVIpICYmIHN1Y2Nlc3MpCisJ CXdxX3dvcmtlcl93YWtpbmdfdXAocCwgY3B1X29mKHJxKSk7Cit9CisKKyNpZmRlZiBDT05GSUdf U01QCit2b2lkIHNjaGVkdWxlcl9pcGkodm9pZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfU01Q ICovCisKKy8qKioKKyAqIHRyeV90b193YWtlX3VwIC0gd2FrZSB1cCBhIHRocmVhZAorICogQHA6 IHRoZSB0aHJlYWQgdG8gYmUgYXdha2VuZWQKKyAqIEBzdGF0ZTogdGhlIG1hc2sgb2YgdGFzayBz dGF0ZXMgdGhhdCBjYW4gYmUgd29rZW4KKyAqIEB3YWtlX2ZsYWdzOiB3YWtlIG1vZGlmaWVyIGZs YWdzIChXRl8qKQorICoKKyAqIFB1dCBpdCBvbiB0aGUgcnVuLXF1ZXVlIGlmIGl0J3Mgbm90IGFs cmVhZHkgdGhlcmUuIFRoZSAiY3VycmVudCIKKyAqIHRocmVhZCBpcyBhbHdheXMgb24gdGhlIHJ1 bi1xdWV1ZSAoZXhjZXB0IHdoZW4gdGhlIGFjdHVhbAorICogcmUtc2NoZWR1bGUgaXMgaW4gcHJv Z3Jlc3MpLCBhbmQgYXMgc3VjaCB5b3UncmUgYWxsb3dlZCB0byBkbworICogdGhlIHNpbXBsZXIg ImN1cnJlbnQtPnN0YXRlID0gVEFTS19SVU5OSU5HIiB0byBtYXJrIHlvdXJzZWxmCisgKiBydW5u YWJsZSB3aXRob3V0IHRoZSBvdmVyaGVhZCBvZiB0aGlzLgorICoKKyAqIFJldHVybnMgJXRydWUg aWYgQHAgd2FzIHdva2VuIHVwLCAlZmFsc2UgaWYgaXQgd2FzIGFscmVhZHkgcnVubmluZworICog b3IgQHN0YXRlIGRpZG4ndCBtYXRjaCBAcCdzIHN0YXRlLgorICovCitzdGF0aWMgYm9vbCB0cnlf dG9fd2FrZV91cChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHVuc2lnbmVkIGludCBzdGF0ZSwKKwkJ CSAgaW50IHdha2VfZmxhZ3MpCit7CisJYm9vbCBzdWNjZXNzID0gZmFsc2U7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOworCWludCBjcHU7CisKKwlnZXRfY3B1KCk7CisK KwkvKiBUaGlzIGJhcnJpZXIgaXMgdW5kb2N1bWVudGVkLCBwcm9iYWJseSBmb3IgcC0+c3RhdGU/ IOOBj+OBnSAqLworCXNtcF93bWIoKTsKKworCS8qCisJICogTm8gbmVlZCB0byBkbyB0aW1lX2xv Y2tfZ3JxIGFzIHdlIG9ubHkgbmVlZCB0byB1cGRhdGUgdGhlIHJxIGNsb2NrCisJICogaWYgd2Ug YWN0aXZhdGUgdGhlIHRhc2sKKwkgKi8KKwlycSA9IHRhc2tfZ3JxX2xvY2socCwgJmZsYWdzKTsK KwljcHUgPSB0YXNrX2NwdShwKTsKKworCS8qIHN0YXRlIGlzIGEgdm9sYXRpbGUgbG9uZywg44Gp 44GG44GX44Gm44CB5YiG44GL44KJ44Gq44GEICovCisJaWYgKCEoKHVuc2lnbmVkIGludClwLT5z dGF0ZSAmIHN0YXRlKSkKKwkJZ290byBvdXRfdW5sb2NrOworCisJaWYgKHRhc2tfcXVldWVkKHAp IHx8IHRhc2tfcnVubmluZyhwKSkKKwkJZ290byBvdXRfcnVubmluZzsKKworCXR0d3VfYWN0aXZh dGUocCwgcnEsIHdha2VfZmxhZ3MgJiBXRl9TWU5DKTsKKwlzdWNjZXNzID0gdHJ1ZTsKKworb3V0 X3J1bm5pbmc6CisJdHR3dV9wb3N0X2FjdGl2YXRpb24ocCwgcnEsIHN1Y2Nlc3MpOworb3V0X3Vu bG9jazoKKwl0YXNrX2dycV91bmxvY2soJmZsYWdzKTsKKworCXR0d3Vfc3RhdChwLCBjcHUsIHdh a2VfZmxhZ3MpOworCisJcHV0X2NwdSgpOworCisJcmV0dXJuIHN1Y2Nlc3M7Cit9CisKKy8qKgor ICogdHJ5X3RvX3dha2VfdXBfbG9jYWwgLSB0cnkgdG8gd2FrZSB1cCBhIGxvY2FsIHRhc2sgd2l0 aCBncnEgbG9jayBoZWxkCisgKiBAcDogdGhlIHRocmVhZCB0byBiZSBhd2FrZW5lZAorICoKKyAq IFB1dCBAcCBvbiB0aGUgcnVuLXF1ZXVlIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUuIFRoZSBj YWxsZXIgbXVzdAorICogZW5zdXJlIHRoYXQgZ3JxIGlzIGxvY2tlZCBhbmQsIEBwIGlzIG5vdCB0 aGUgY3VycmVudCB0YXNrLgorICogZ3JxIHN0YXlzIGxvY2tlZCBvdmVyIGludm9jYXRpb24uCisg Ki8KK3N0YXRpYyB2b2lkIHRyeV90b193YWtlX3VwX2xvY2FsKHN0cnVjdCB0YXNrX3N0cnVjdCAq cCkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gdGFza19ycShwKTsKKwlib29sIHN1Y2Nlc3MgPSBmYWxz ZTsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmdycS5sb2NrKTsKKworCWlmICghKHAtPnN0YXRl ICYgVEFTS19OT1JNQUwpKQorCQlyZXR1cm47CisKKwlpZiAoIXRhc2tfcXVldWVkKHApKSB7CisJ CXR0d3VfYWN0aXZhdGUocCwgcnEsIGZhbHNlKTsKKwkJdHR3dV9zdGF0KHAsIHNtcF9wcm9jZXNz b3JfaWQoKSwgMCk7CisJCXN1Y2Nlc3MgPSB0cnVlOworCX0KKwl0dHd1X3Bvc3RfYWN0aXZhdGlv bihwLCBycSwgc3VjY2Vzcyk7Cit9CisKKy8qKgorICogd2FrZV91cF9wcm9jZXNzIC0gV2FrZSB1 cCBhIHNwZWNpZmljIHByb2Nlc3MKKyAqIEBwOiBUaGUgcHJvY2VzcyB0byBiZSB3b2tlbiB1cC4K KyAqCisgKiBBdHRlbXB0IHRvIHdha2UgdXAgdGhlIG5vbWluYXRlZCBwcm9jZXNzIGFuZCBtb3Zl IGl0IHRvIHRoZSBzZXQgb2YgcnVubmFibGUKKyAqIHByb2Nlc3Nlcy4gIFJldHVybnMgMSBpZiB0 aGUgcHJvY2VzcyB3YXMgd29rZW4gdXAsIDAgaWYgaXQgd2FzIGFscmVhZHkKKyAqIHJ1bm5pbmcu CisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxpZXMgYSB3 cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUKKyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0YXRlIGlm IGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUgd29rZW4gdXAuCisgKi8KK2ludCB3YWtlX3VwX3By b2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiB0cnlfdG9fd2FrZV91cChw LCBUQVNLX0FMTCwgMCk7Cit9CitFWFBPUlRfU1lNQk9MKHdha2VfdXBfcHJvY2Vzcyk7CisKK2lu dCB3YWtlX3VwX3N0YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IHN0YXRl KQoreworCXJldHVybiB0cnlfdG9fd2FrZV91cChwLCBzdGF0ZSwgMCk7Cit9CisKKy8qCisgKiBQ ZXJmb3JtIHNjaGVkdWxlciByZWxhdGVkIHNldHVwIGZvciBhIG5ld2x5IGZvcmtlZCBwcm9jZXNz IHAuCisgKiBwIGlzIGZvcmtlZCBieSBjdXJyZW50LgorICovCit2b2lkIHNjaGVkX2Zvcmsoc3Ry dWN0IHRhc2tfc3RydWN0ICpwKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VycjsKKwlpbnQg Y3B1ID0gZ2V0X2NwdSgpOworCXN0cnVjdCBycSAqcnE7CisKKyNpZmRlZiBDT05GSUdfUFJFRU1Q VF9OT1RJRklFUlMKKwlJTklUX0hMSVNUX0hFQUQoJnAtPnByZWVtcHRfbm90aWZpZXJzKTsKKyNl bmRpZgorCS8qCisJICogV2UgbWFyayB0aGUgcHJvY2VzcyBhcyBydW5uaW5nIGhlcmUuIFRoaXMg Z3VhcmFudGVlcyB0aGF0CisJICogbm9ib2R5IHdpbGwgYWN0dWFsbHkgcnVuIGl0LCBhbmQgYSBz aWduYWwgb3Igb3RoZXIgZXh0ZXJuYWwKKwkgKiBldmVudCBjYW5ub3Qgd2FrZSBpdCB1cCBhbmQg aW5zZXJ0IGl0IG9uIHRoZSBydW5xdWV1ZSBlaXRoZXIuCisJICovCisJcC0+c3RhdGUgPSBUQVNL X1JVTk5JTkc7CisJc2V0X3Rhc2tfY3B1KHAsIGNwdSk7CisKKwlwLT5zY2hlZF90aW1lID0gcC0+ c3RpbWVfcGMgPSBwLT51dGltZV9wYyA9IDA7CisKKwkvKgorCSAqIFJldmVydCB0byBkZWZhdWx0 IHByaW9yaXR5L3BvbGljeSBvbiBmb3JrIGlmIHJlcXVlc3RlZC4KKwkgKi8KKwlpZiAodW5saWtl bHkocC0+c2NoZWRfcmVzZXRfb25fZm9yaykpIHsKKwkJaWYgKHAtPnBvbGljeSA9PSBTQ0hFRF9G SUZPIHx8IHAtPnBvbGljeSA9PSBTQ0hFRF9SUikgeworCQkJcC0+cG9saWN5ID0gU0NIRURfTk9S TUFMOworCQl9CisKKwkJaWYgKFBSSU9fVE9fTklDRShwLT5zdGF0aWNfcHJpbykgPCAwKSB7CisJ CQlwLT5zdGF0aWNfcHJpbyA9IE5JQ0VfVE9fUFJJTygwKTsKKwkJfQorCisJCS8qCisJCSAqIFdl IGRvbid0IG5lZWQgdGhlIHJlc2V0IGZsYWcgYW55bW9yZSBhZnRlciB0aGUgZm9yay4gSXQgaGFz CisJCSAqIGZ1bGZpbGxlZCBpdHMgZHV0eToKKwkJICovCisJCXAtPnNjaGVkX3Jlc2V0X29uX2Zv cmsgPSAwOworCX0KKworCWN1cnIgPSBjdXJyZW50OworCS8qCisJICogTWFrZSBzdXJlIHdlIGRv IG5vdCBsZWFrIFBJIGJvb3N0aW5nIHByaW9yaXR5IHRvIHRoZSBjaGlsZC4KKwkgKi8KKwlwLT5w cmlvID0gY3Vyci0+c3RhdGljX3ByaW87CisJcC0+dGlja191c2VkID0gY3Vyci0+dGlja191c2Vk OworCisJSU5JVF9MSVNUX0hFQUQoJnAtPnJ1bl9saXN0KTsKKyNpZiBkZWZpbmVkKENPTkZJR19T Q0hFRFNUQVRTKSB8fCBkZWZpbmVkKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpCisJaWYgKHVubGlr ZWx5KHNjaGVkX2luZm9fb24oKSkpCisJCW1lbXNldCgmcC0+c2NoZWRfaW5mbywgMCwgc2l6ZW9m KHAtPnNjaGVkX2luZm8pKTsKKyNlbmRpZgorCisJcC0+b25fY3B1ID0gZmFsc2U7CisJY2xlYXJf c3RpY2t5KHApOworCisjaWZkZWYgQ09ORklHX1BSRUVNUFRfQ09VTlQKKwkvKiBXYW50IHRvIHN0 YXJ0IHdpdGgga2VybmVsIHByZWVtcHRpb24gZGlzYWJsZWQuICovCisJdGFza190aHJlYWRfaW5m byhwKS0+cHJlZW1wdF9jb3VudCA9IDE7CisjZW5kaWYKKwlpZiAodW5saWtlbHkocC0+cG9saWN5 ID09IFNDSEVEX0ZJRk8pKQorCQlnb3RvIG91dDsKKwkvKgorCSAqIFNoYXJlIHRoZSB0aW1lc2xp Y2UgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkLCB0aHVzIHRoZQorCSAqIHRvdGFsIGFtb3VudCBv ZiBwZW5kaW5nIHRpbWVzbGljZXMgaW4gdGhlIHN5c3RlbSBkb2Vzbid0IGNoYW5nZSwKKwkgKiBy ZXN1bHRpbmcgaW4gbW9yZSBzY2hlZHVsaW5nIGZhaXJuZXNzLiBJZiBpdCdzIG5lZ2F0aXZlLCBp dCB3b24ndAorCSAqIG1hdHRlciBzaW5jZSB0aGF0J3MgdGhlIHNhbWUgYXMgYmVpbmcgMC4gY3Vy cmVudCdzIHRpbWVfc2xpY2UgaXMKKwkgKiBhY3R1YWxseSBpbiB0aW1lc2xpY2Ugd2hlbiBpdCdz IHJ1bm5pbmcsIGFzIGlzIGl0cyBsYXN0X3JhbgorCSAqIHZhbHVlLiAKKwkgKi8KKwlycSA9IHRh c2tfZ3JxX2xvY2tfaXJxKGN1cnIpOworCWlmIChsaWtlbHkoY3Vyci0+dGltZV9zbGljZSA+PSBS RVNDSEVEX1VTICogMikpIHsKKwkJY3Vyci0+dGltZV9zbGljZSAvPSAyOworCQlwLT50aW1lX3Ns aWNlID0gY3Vyci0+dGltZV9zbGljZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBGb3JraW5nIHRh c2sgaGFzIHJ1biBvdXQgb2YgdGltZXNsaWNlLiBSZXNjaGVkdWxlIGl0LgorCQkgKi8KKwkJY3Vy ci0+dGltZV9zbGljZSA9IDA7CisJCXNldF90c2tfbmVlZF9yZXNjaGVkKGN1cnIpOworCQlnZXRf dGltZV9zbGljZShwKTsKKwl9CisJcC0+bGFzdF9yYW4gPSBycS0+cnFfbGFzdF9yYW47CisJdGFz a19ncnFfdW5sb2NrX2lycSgpOworb3V0OgorCXB1dF9jcHUoKTsKK30KKworLyoKKyAqIHdha2Vf dXBfbmV3X3Rhc2sgLSB3YWtlIHVwIGEgbmV3bHkgY3JlYXRlZCB0YXNrIGZvciB0aGUgZmlyc3Qg dGltZS4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZG8gc29tZSBpbml0aWFsIHNjaGVkdWxl ciBzdGF0aXN0aWNzIGhvdXNla2VlcGluZworICogdGhhdCBtdXN0IGJlIGRvbmUgZm9yIGV2ZXJ5 IG5ld2x5IGNyZWF0ZWQgY29udGV4dCwgdGhlbiBwdXRzIHRoZSB0YXNrCisgKiBvbiB0aGUgcnVu cXVldWUgYW5kIHdha2VzIGl0LgorICovCit2b2lkIHdha2VfdXBfbmV3X3Rhc2soc3RydWN0IHRh c2tfc3RydWN0ICpwKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcGFyZW50OworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJc3RydWN0IHJxICpycTsKKworCXJxID0gdGFza19ncnFfbG9jayhwLCAm ZmxhZ3MpOworCXAtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCXAtPnRpY2tfdXNlZCA9IDA7CisJ cGFyZW50ID0gcC0+cGFyZW50OworCS8qIFVubmVjZXNzYXJ5IGJ1dCBzbWFsbCBjaGFuY2UgdGhh dCB0aGUgcGFyZW50IGNoYW5nZWQgQ1BVICovCisJc2V0X3Rhc2tfY3B1KHAsIHRhc2tfY3B1KHBh cmVudCkpOworCWFjdGl2YXRlX3Rhc2socCwgcnEpOworCXRyYWNlX3NjaGVkX3dha2V1cF9uZXco cCwgMSk7CisJaWYgKHJxLT5jdXJyID09IHBhcmVudCAmJiAhc3VpdGFibGVfaWRsZV9jcHVzKHAp KSB7CisJCS8qCisJCSAqIFRoZSBWTSBpc24ndCBjbG9uZWQsIHNvIHdlJ3JlIGluIGEgZ29vZCBw b3NpdGlvbiB0bworCQkgKiBkbyBjaGlsZC1ydW5zLWZpcnN0IGluIGFudGljaXBhdGlvbiBvZiBh biBleGVjLiBUaGlzCisJCSAqIHVzdWFsbHkgYXZvaWRzIGEgbG90IG9mIENPVyBvdmVyaGVhZC4K KwkJICovCisJCXJlc2NoZWRfdGFzayhwYXJlbnQpOworCX0gZWxzZQorCQl0cnlfcHJlZW1wdChw LCBycSk7CisJdGFza19ncnFfdW5sb2NrKCZmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfUFJF RU1QVF9OT1RJRklFUlMKKworLyoqCisgKiBwcmVlbXB0X25vdGlmaWVyX3JlZ2lzdGVyIC0gdGVs bCBtZSB3aGVuIGN1cnJlbnQgaXMgYmVpbmcgcHJlZW1wdGVkICYgcmVzY2hlZHVsZWQKKyAqIEBu b3RpZmllcjogbm90aWZpZXIgc3RydWN0IHRvIHJlZ2lzdGVyCisgKi8KK3ZvaWQgcHJlZW1wdF9u b3RpZmllcl9yZWdpc3RlcihzdHJ1Y3QgcHJlZW1wdF9ub3RpZmllciAqbm90aWZpZXIpCit7CisJ aGxpc3RfYWRkX2hlYWQoJm5vdGlmaWVyLT5saW5rLCAmY3VycmVudC0+cHJlZW1wdF9ub3RpZmll cnMpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocHJlZW1wdF9ub3RpZmllcl9yZWdpc3Rlcik7CisK Ky8qKgorICogcHJlZW1wdF9ub3RpZmllcl91bnJlZ2lzdGVyIC0gbm8gbG9uZ2VyIGludGVyZXN0 ZWQgaW4gcHJlZW1wdGlvbiBub3RpZmljYXRpb25zCisgKiBAbm90aWZpZXI6IG5vdGlmaWVyIHN0 cnVjdCB0byB1bnJlZ2lzdGVyCisgKgorICogVGhpcyBpcyBzYWZlIHRvIGNhbGwgZnJvbSB3aXRo aW4gYSBwcmVlbXB0aW9uIG5vdGlmaWVyLgorICovCit2b2lkIHByZWVtcHRfbm90aWZpZXJfdW5y ZWdpc3RlcihzdHJ1Y3QgcHJlZW1wdF9ub3RpZmllciAqbm90aWZpZXIpCit7CisJaGxpc3RfZGVs KCZub3RpZmllci0+bGluayk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwcmVlbXB0X25vdGlmaWVy X3VucmVnaXN0ZXIpOworCitzdGF0aWMgdm9pZCBmaXJlX3NjaGVkX2luX3ByZWVtcHRfbm90aWZp ZXJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VycikKK3sKKwlzdHJ1Y3QgcHJlZW1wdF9ub3RpZmll ciAqbm90aWZpZXI7CisJc3RydWN0IGhsaXN0X25vZGUgKm5vZGU7CisKKwlobGlzdF9mb3JfZWFj aF9lbnRyeShub3RpZmllciwgbm9kZSwgJmN1cnItPnByZWVtcHRfbm90aWZpZXJzLCBsaW5rKQor CQlub3RpZmllci0+b3BzLT5zY2hlZF9pbihub3RpZmllciwgcmF3X3NtcF9wcm9jZXNzb3JfaWQo KSk7Cit9CisKK3N0YXRpYyB2b2lkCitmaXJlX3NjaGVkX291dF9wcmVlbXB0X25vdGlmaWVycyhz dHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIsCisJCQkJIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkK K3sKKwlzdHJ1Y3QgcHJlZW1wdF9ub3RpZmllciAqbm90aWZpZXI7CisJc3RydWN0IGhsaXN0X25v ZGUgKm5vZGU7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeShub3RpZmllciwgbm9kZSwgJmN1cnIt PnByZWVtcHRfbm90aWZpZXJzLCBsaW5rKQorCQlub3RpZmllci0+b3BzLT5zY2hlZF9vdXQobm90 aWZpZXIsIG5leHQpOworfQorCisjZWxzZSAvKiAhQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTICov CisKK3N0YXRpYyB2b2lkIGZpcmVfc2NoZWRfaW5fcHJlZW1wdF9ub3RpZmllcnMoc3RydWN0IHRh c2tfc3RydWN0ICpjdXJyKQoreworfQorCitzdGF0aWMgdm9pZAorZmlyZV9zY2hlZF9vdXRfcHJl ZW1wdF9ub3RpZmllcnMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLAorCQkJCSBzdHJ1Y3QgdGFz a19zdHJ1Y3QgKm5leHQpCit7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVF9OT1RJRklF UlMgKi8KKworLyoqCisgKiBwcmVwYXJlX3Rhc2tfc3dpdGNoIC0gcHJlcGFyZSB0byBzd2l0Y2gg dGFza3MKKyAqIEBycTogdGhlIHJ1bnF1ZXVlIHByZXBhcmluZyB0byBzd2l0Y2gKKyAqIEBuZXh0 OiB0aGUgdGFzayB3ZSBhcmUgZ29pbmcgdG8gc3dpdGNoIHRvLgorICoKKyAqIFRoaXMgaXMgY2Fs bGVkIHdpdGggdGhlIHJxIGxvY2sgaGVsZCBhbmQgaW50ZXJydXB0cyBvZmYuIEl0IG11c3QKKyAq IGJlIHBhaXJlZCB3aXRoIGEgc3Vic2VxdWVudCBmaW5pc2hfdGFza19zd2l0Y2ggYWZ0ZXIgdGhl IGNvbnRleHQKKyAqIHN3aXRjaC4KKyAqCisgKiBwcmVwYXJlX3Rhc2tfc3dpdGNoIHNldHMgdXAg bG9ja2luZyBhbmQgY2FsbHMgYXJjaGl0ZWN0dXJlIHNwZWNpZmljCisgKiBob29rcy4KKyAqLwor c3RhdGljIGlubGluZSB2b2lkCitwcmVwYXJlX3Rhc2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0 cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sK KwlwZXJmX2V2ZW50X3Rhc2tfc2NoZWRfb3V0KHByZXYsIG5leHQpOworCWZpcmVfc2NoZWRfb3V0 X3ByZWVtcHRfbm90aWZpZXJzKHByZXYsIG5leHQpOworCXByZXBhcmVfbG9ja19zd2l0Y2gocnEs IG5leHQpOworCXByZXBhcmVfYXJjaF9zd2l0Y2gobmV4dCk7CisJdHJhY2Vfc2NoZWRfc3dpdGNo KHByZXYsIG5leHQpOworfQorCisvKioKKyAqIGZpbmlzaF90YXNrX3N3aXRjaCAtIGNsZWFuIHVw IGFmdGVyIGEgdGFzay1zd2l0Y2gKKyAqIEBycTogcnVucXVldWUgYXNzb2NpYXRlZCB3aXRoIHRh c2stc3dpdGNoCisgKiBAcHJldjogdGhlIHRocmVhZCB3ZSBqdXN0IHN3aXRjaGVkIGF3YXkgZnJv bS4KKyAqCisgKiBmaW5pc2hfdGFza19zd2l0Y2ggbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGNv bnRleHQgc3dpdGNoLCBwYWlyZWQKKyAqIHdpdGggYSBwcmVwYXJlX3Rhc2tfc3dpdGNoIGNhbGwg YmVmb3JlIHRoZSBjb250ZXh0IHN3aXRjaC4KKyAqIGZpbmlzaF90YXNrX3N3aXRjaCB3aWxsIHJl Y29uY2lsZSBsb2NraW5nIHNldCB1cCBieSBwcmVwYXJlX3Rhc2tfc3dpdGNoLAorICogYW5kIGRv IGFueSBvdGhlciBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgY2xlYW51cCBhY3Rpb25zLgorICoKKyAq IE5vdGUgdGhhdCB3ZSBtYXkgaGF2ZSBkZWxheWVkIGRyb3BwaW5nIGFuIG1tIGluIGNvbnRleHRf c3dpdGNoKCkuIElmCisgKiBzbywgd2UgZmluaXNoIHRoYXQgaGVyZSBvdXRzaWRlIG9mIHRoZSBy dW5xdWV1ZSBsb2NrLiAgKERvaW5nIGl0CisgKiB3aXRoIHRoZSBsb2NrIGhlbGQgY2FuIGNhdXNl IGRlYWRsb2Nrczsgc2VlIHNjaGVkdWxlKCkgZm9yCisgKiBkZXRhaWxzLikKKyAqLworc3RhdGlj IGlubGluZSB2b2lkIGZpbmlzaF90YXNrX3N3aXRjaChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnByZXYpCisJX19yZWxlYXNlcyhncnEubG9jaykKK3sKKwlzdHJ1Y3QgbW1fc3Ry dWN0ICptbSA9IHJxLT5wcmV2X21tOworCWxvbmcgcHJldl9zdGF0ZTsKKworCXJxLT5wcmV2X21t ID0gTlVMTDsKKworCS8qCisJICogQSB0YXNrIHN0cnVjdCBoYXMgb25lIHJlZmVyZW5jZSBmb3Ig dGhlIHVzZSBhcyAiY3VycmVudCIuCisJICogSWYgYSB0YXNrIGRpZXMsIHRoZW4gaXQgc2V0cyBU QVNLX0RFQUQgaW4gdHNrLT5zdGF0ZSBhbmQgY2FsbHMKKwkgKiBzY2hlZHVsZSBvbmUgbGFzdCB0 aW1lLiBUaGUgc2NoZWR1bGUgY2FsbCB3aWxsIG5ldmVyIHJldHVybiwgYW5kCisJICogdGhlIHNj aGVkdWxlZCB0YXNrIG11c3QgZHJvcCB0aGF0IHJlZmVyZW5jZS4KKwkgKiBUaGUgdGVzdCBmb3Ig VEFTS19ERUFEIG11c3Qgb2NjdXIgd2hpbGUgdGhlIHJ1bnF1ZXVlIGxvY2tzIGFyZQorCSAqIHN0 aWxsIGhlbGQsIG90aGVyd2lzZSBwcmV2IGNvdWxkIGJlIHNjaGVkdWxlZCBvbiBhbm90aGVyIGNw dSwgZGllCisJICogdGhlcmUgYmVmb3JlIHdlIGxvb2sgYXQgcHJldi0+c3RhdGUsIGFuZCB0aGVu IHRoZSByZWZlcmVuY2Ugd291bGQKKwkgKiBiZSBkcm9wcGVkIHR3aWNlLgorCSAqCQlNYW5mcmVk IFNwcmF1bCA8bWFuZnJlZEBjb2xvcmZ1bGxpZmUuY29tPgorCSAqLworCXByZXZfc3RhdGUgPSBw cmV2LT5zdGF0ZTsKKwlmaW5pc2hfYXJjaF9zd2l0Y2gocHJldik7CisjaWZkZWYgX19BUkNIX1dB TlRfSU5URVJSVVBUU19PTl9DVFhTVworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisjZW5kaWYgLyog X19BUkNIX1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVyAqLworCXBlcmZfZXZlbnRfdGFza19zY2hl ZF9pbihwcmV2LCBjdXJyZW50KTsKKyNpZmRlZiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NU WFNXCisJbG9jYWxfaXJxX2VuYWJsZSgpOworI2VuZGlmIC8qIF9fQVJDSF9XQU5UX0lOVEVSUlVQ VFNfT05fQ1RYU1cgKi8KKwlmaW5pc2hfbG9ja19zd2l0Y2gocnEsIHByZXYpOworCisJZmlyZV9z Y2hlZF9pbl9wcmVlbXB0X25vdGlmaWVycyhjdXJyZW50KTsKKwlpZiAobW0pCisJCW1tZHJvcCht bSk7CisJaWYgKHVubGlrZWx5KHByZXZfc3RhdGUgPT0gVEFTS19ERUFEKSkgeworCQkvKgorCQkg KiBSZW1vdmUgZnVuY3Rpb24tcmV0dXJuIHByb2JlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGgg dGhpcworCQkgKiB0YXNrIGFuZCBwdXQgdGhlbSBiYWNrIG9uIHRoZSBmcmVlIGxpc3QuCisJCSAq LworCQlrcHJvYmVfZmx1c2hfdGFzayhwcmV2KTsKKwkJcHV0X3Rhc2tfc3RydWN0KHByZXYpOwor CX0KK30KKworLyoqCisgKiBzY2hlZHVsZV90YWlsIC0gZmlyc3QgdGhpbmcgYSBmcmVzaGx5IGZv cmtlZCB0aHJlYWQgbXVzdCBjYWxsLgorICogQHByZXY6IHRoZSB0aHJlYWQgd2UganVzdCBzd2l0 Y2hlZCBhd2F5IGZyb20uCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZV90YWlsKHN0cnVj dCB0YXNrX3N0cnVjdCAqcHJldikKKwlfX3JlbGVhc2VzKGdycS5sb2NrKQoreworCXN0cnVjdCBy cSAqcnEgPSB0aGlzX3JxKCk7CisKKwlmaW5pc2hfdGFza19zd2l0Y2gocnEsIHByZXYpOworI2lm ZGVmIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXCisJLyogSW4gdGhpcyBjYXNlLCBmaW5pc2hf dGFza19zd2l0Y2ggZG9lcyBub3QgcmVlbmFibGUgcHJlZW1wdGlvbiAqLworCXByZWVtcHRfZW5h YmxlKCk7CisjZW5kaWYKKwlpZiAoY3VycmVudC0+c2V0X2NoaWxkX3RpZCkKKwkJcHV0X3VzZXIo Y3VycmVudC0+cGlkLCBjdXJyZW50LT5zZXRfY2hpbGRfdGlkKTsKK30KKworLyoKKyAqIGNvbnRl eHRfc3dpdGNoIC0gc3dpdGNoIHRvIHRoZSBuZXcgTU0gYW5kIHRoZSBuZXcKKyAqIHRocmVhZCdz IHJlZ2lzdGVyIHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK2NvbnRleHRfc3dpdGNo KHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwKKwkJICAgc3RydWN0IHRh c2tfc3RydWN0ICpuZXh0KQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCAqb2xkbW07CisJCisJ cHJlcGFyZV90YXNrX3N3aXRjaChycSwgcHJldiwgbmV4dCk7CisKKwltbSA9IG5leHQtPm1tOwor CW9sZG1tID0gcHJldi0+YWN0aXZlX21tOworCS8qCisJICogRm9yIHBhcmF2aXJ0LCB0aGlzIGlz IGNvdXBsZWQgd2l0aCBhbiBleGl0IGluIHN3aXRjaF90byB0bworCSAqIGNvbWJpbmUgdGhlIHBh Z2UgdGFibGUgcmVsb2FkIGFuZCB0aGUgc3dpdGNoIGJhY2tlbmQgaW50bworCSAqIG9uZSBoeXBl cmNhbGwuCisJICovCisJYXJjaF9zdGFydF9jb250ZXh0X3N3aXRjaChwcmV2KTsKKworCWlmICgh bW0pIHsKKwkJbmV4dC0+YWN0aXZlX21tID0gb2xkbW07CisJCWF0b21pY19pbmMoJm9sZG1tLT5t bV9jb3VudCk7CisJCWVudGVyX2xhenlfdGxiKG9sZG1tLCBuZXh0KTsKKwl9IGVsc2UKKwkJc3dp dGNoX21tKG9sZG1tLCBtbSwgbmV4dCk7CisKKwlpZiAoIXByZXYtPm1tKSB7CisJCXByZXYtPmFj dGl2ZV9tbSA9IE5VTEw7CisJCXJxLT5wcmV2X21tID0gb2xkbW07CisJfQorCS8qCisJICogU2lu Y2UgdGhlIHJ1bnF1ZXVlIGxvY2sgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgbmV4dAorCSAqIHRh c2sgKHdoaWNoIGlzIGFuIGludmFsaWQgbG9ja2luZyBvcCBidXQgaW4gdGhlIGNhc2UKKwkgKiBv ZiB0aGUgc2NoZWR1bGVyIGl0J3MgYW4gb2J2aW91cyBzcGVjaWFsLWNhc2UpLCBzbyB3ZQorCSAq IGRvIGFuIGVhcmx5IGxvY2tkZXAgcmVsZWFzZSBoZXJlOgorCSAqLworI2lmbmRlZiBfX0FSQ0hf V0FOVF9VTkxPQ0tFRF9DVFhTVworCXNwaW5fcmVsZWFzZSgmZ3JxLmxvY2suZGVwX21hcCwgMSwg X1RISVNfSVBfKTsKKyNlbmRpZgorCisJLyogSGVyZSB3ZSBqdXN0IHN3aXRjaCB0aGUgcmVnaXN0 ZXIgc3RhdGUgYW5kIHRoZSBzdGFjay4gKi8KKwlzd2l0Y2hfdG8ocHJldiwgbmV4dCwgcHJldik7 CisKKwliYXJyaWVyKCk7CisJLyoKKwkgKiB0aGlzX3JxIG11c3QgYmUgZXZhbHVhdGVkIGFnYWlu IGJlY2F1c2UgcHJldiBtYXkgaGF2ZSBtb3ZlZAorCSAqIENQVXMgc2luY2UgaXQgY2FsbGVkIHNj aGVkdWxlKCksIHRodXMgdGhlICdycScgb24gaXRzIHN0YWNrCisJICogZnJhbWUgd2lsbCBiZSBp bnZhbGlkLgorCSAqLworCWZpbmlzaF90YXNrX3N3aXRjaCh0aGlzX3JxKCksIHByZXYpOworfQor CisvKgorICogbnJfcnVubmluZywgbnJfdW5pbnRlcnJ1cHRpYmxlIGFuZCBucl9jb250ZXh0X3N3 aXRjaGVzOgorICoKKyAqIGV4dGVybmFsbHkgdmlzaWJsZSBzY2hlZHVsZXIgc3RhdGlzdGljczog Y3VycmVudCBudW1iZXIgb2YgcnVubmFibGUKKyAqIHRocmVhZHMsIGN1cnJlbnQgbnVtYmVyIG9m IHVuaW50ZXJydXB0aWJsZS1zbGVlcGluZyB0aHJlYWRzLCB0b3RhbAorICogbnVtYmVyIG9mIGNv bnRleHQgc3dpdGNoZXMgcGVyZm9ybWVkIHNpbmNlIGJvb3R1cC4gQWxsIGFyZSBtZWFzdXJlZAor ICogd2l0aG91dCBncmFiYmluZyB0aGUgZ3JxIGxvY2sgYnV0IHRoZSBvY2Nhc2lvbmFsIGluYWNj dXJhdGUgcmVzdWx0CisgKiBkb2Vzbid0IG1hdHRlciBzbyBsb25nIGFzIGl0J3MgcG9zaXRpdmUu CisgKi8KK3Vuc2lnbmVkIGxvbmcgbnJfcnVubmluZyh2b2lkKQoreworCWxvbmcgbnIgPSBncnEu bnJfcnVubmluZzsKKworCWlmICh1bmxpa2VseShuciA8IDApKQorCQluciA9IDA7CisJcmV0dXJu ICh1bnNpZ25lZCBsb25nKW5yOworfQorCit1bnNpZ25lZCBsb25nIG5yX3VuaW50ZXJydXB0aWJs ZSh2b2lkKQoreworCWxvbmcgbnUgPSBncnEubnJfdW5pbnRlcnJ1cHRpYmxlOworCisJaWYgKHVu bGlrZWx5KG51IDwgMCkpCisJCW51ID0gMDsKKwlyZXR1cm4gbnU7Cit9CisKK3Vuc2lnbmVkIGxv bmcgbG9uZyBucl9jb250ZXh0X3N3aXRjaGVzKHZvaWQpCit7CisJbG9uZyBsb25nIG5zID0gZ3Jx Lm5yX3N3aXRjaGVzOworCisJLyogVGhpcyBpcyBvZiBjb3Vyc2UgaW1wb3NzaWJsZSAqLworCWlm ICh1bmxpa2VseShucyA8IDApKQorCQlucyA9IDE7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nIGxv bmcpbnM7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbnJfaW93YWl0KHZvaWQpCit7CisJdW5zaWduZWQg bG9uZyBpLCBzdW0gPSAwOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpCisJCXN1bSArPSBh dG9taWNfcmVhZCgmY3B1X3JxKGkpLT5ucl9pb3dhaXQpOworCisJcmV0dXJuIHN1bTsKK30KKwor dW5zaWduZWQgbG9uZyBucl9pb3dhaXRfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHJxICp0aGlz ID0gY3B1X3JxKGNwdSk7CisJcmV0dXJuIGF0b21pY19yZWFkKCZ0aGlzLT5ucl9pb3dhaXQpOwor fQorCit1bnNpZ25lZCBsb25nIG5yX2FjdGl2ZSh2b2lkKQoreworCXJldHVybiBucl9ydW5uaW5n KCkgKyBucl91bmludGVycnVwdGlibGUoKTsKK30KKworLyogQmV5b25kIGEgdGFzayBydW5uaW5n IG9uIHRoaXMgQ1BVLCBsb2FkIGlzIGVxdWFsIGV2ZXJ5d2hlcmUgb24gQkZTICovCit1bnNpZ25l ZCBsb25nIHRoaXNfY3B1X2xvYWQodm9pZCkKK3sKKwlyZXR1cm4gdGhpc19ycSgpLT5ycV9ydW5u aW5nICsKKwkJKChxdWV1ZWRfbm90cnVubmluZygpICsgbnJfdW5pbnRlcnJ1cHRpYmxlKCkpIC8g Z3JxLm5vYyk7Cit9CisKKy8qIFZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGZvciBjYWxjX2xvYWQg Ki8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNhbGNfbG9hZF91cGRhdGU7Cit1bnNpZ25lZCBsb25n IGF2ZW5ydW5bM107CitFWFBPUlRfU1lNQk9MKGF2ZW5ydW4pOworCisvKioKKyAqIGdldF9hdmVu cnVuIC0gZ2V0IHRoZSBsb2FkIGF2ZXJhZ2UgYXJyYXkKKyAqIEBsb2FkczoJcG9pbnRlciB0byBk ZXN0IGxvYWQgYXJyYXkKKyAqIEBvZmZzZXQ6CW9mZnNldCB0byBhZGQKKyAqIEBzaGlmdDoJc2hp ZnQgY291bnQgdG8gc2hpZnQgdGhlIHJlc3VsdCBsZWZ0CisgKgorICogVGhlc2UgdmFsdWVzIGFy ZSBlc3RpbWF0ZXMgYXQgYmVzdCwgc28gbm8gbmVlZCBmb3IgbG9ja2luZy4KKyAqLwordm9pZCBn ZXRfYXZlbnJ1bih1bnNpZ25lZCBsb25nICpsb2FkcywgdW5zaWduZWQgbG9uZyBvZmZzZXQsIGlu dCBzaGlmdCkKK3sKKwlsb2Fkc1swXSA9IChhdmVucnVuWzBdICsgb2Zmc2V0KSA8PCBzaGlmdDsK Kwlsb2Fkc1sxXSA9IChhdmVucnVuWzFdICsgb2Zmc2V0KSA8PCBzaGlmdDsKKwlsb2Fkc1syXSA9 IChhdmVucnVuWzJdICsgb2Zmc2V0KSA8PCBzaGlmdDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxv bmcKK2NhbGNfbG9hZCh1bnNpZ25lZCBsb25nIGxvYWQsIHVuc2lnbmVkIGxvbmcgZXhwLCB1bnNp Z25lZCBsb25nIGFjdGl2ZSkKK3sKKwlsb2FkICo9IGV4cDsKKwlsb2FkICs9IGFjdGl2ZSAqIChG SVhFRF8xIC0gZXhwKTsKKwlyZXR1cm4gbG9hZCA+PiBGU0hJRlQ7Cit9CisKKy8qCisgKiBjYWxj X2xvYWQgLSB1cGRhdGUgdGhlIGF2ZW5ydW4gbG9hZCBlc3RpbWF0ZXMgZXZlcnkgTE9BRF9GUkVR IHNlY29uZHMuCisgKi8KK3ZvaWQgY2FsY19nbG9iYWxfbG9hZCh1bnNpZ25lZCBsb25nIHRpY2tz KQoreworCWxvbmcgYWN0aXZlOworCisJaWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIGNhbGNfbG9h ZF91cGRhdGUpKQorCQlyZXR1cm47CisJYWN0aXZlID0gbnJfYWN0aXZlKCkgKiBGSVhFRF8xOwor CisJYXZlbnJ1blswXSA9IGNhbGNfbG9hZChhdmVucnVuWzBdLCBFWFBfMSwgYWN0aXZlKTsKKwlh dmVucnVuWzFdID0gY2FsY19sb2FkKGF2ZW5ydW5bMV0sIEVYUF81LCBhY3RpdmUpOworCWF2ZW5y dW5bMl0gPSBjYWxjX2xvYWQoYXZlbnJ1blsyXSwgRVhQXzE1LCBhY3RpdmUpOworCisJY2FsY19s b2FkX3VwZGF0ZSA9IGppZmZpZXMgKyBMT0FEX0ZSRVE7Cit9CisKK0RFRklORV9QRVJfQ1BVKHN0 cnVjdCBrZXJuZWxfc3RhdCwga3N0YXQpOworREVGSU5FX1BFUl9DUFUoc3RydWN0IGtlcm5lbF9j cHVzdGF0LCBrZXJuZWxfY3B1c3RhdCk7CisKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChrc3RhdCk7 CitFWFBPUlRfUEVSX0NQVV9TWU1CT0woa2VybmVsX2NwdXN0YXQpOworCisjaWZkZWYgQ09ORklH X0lSUV9USU1FX0FDQ09VTlRJTkcKKworLyoKKyAqIFRoZXJlIGFyZSBubyBsb2NrcyBjb3Zlcmlu ZyBwZXJjcHUgaGFyZGlycS9zb2Z0aXJxIHRpbWUuCisgKiBUaGV5IGFyZSBvbmx5IG1vZGlmaWVk IGluIGFjY291bnRfc3lzdGVtX3Z0aW1lLCBvbiBjb3JyZXNwb25kaW5nIENQVQorICogd2l0aCBp bnRlcnJ1cHRzIGRpc2FibGVkLiBTbywgd3JpdGVzIGFyZSBzYWZlLgorICogVGhleSBhcmUgcmVh ZCBhbmQgc2F2ZWQgb2ZmIG9udG8gc3RydWN0IHJxIGluIHVwZGF0ZV9ycV9jbG9jaygpLgorICog VGhpcyBtYXkgcmVzdWx0IGluIG90aGVyIENQVSByZWFkaW5nIHRoaXMgQ1BVJ3MgaXJxIHRpbWUg YW5kIGNhbgorICogcmFjZSB3aXRoIGlycS9hY2NvdW50X3N5c3RlbV92dGltZSBvbiB0aGlzIENQ VS4gV2Ugd291bGQgZWl0aGVyIGdldCBvbGQKKyAqIG9yIG5ldyB2YWx1ZSB3aXRoIGEgc2lkZSBl ZmZlY3Qgb2YgYWNjb3VudGluZyBhIHNsaWNlIG9mIGlycSB0aW1lIHRvIHdyb25nCisgKiB0YXNr IHdoZW4gaXJxIGlzIGluIHByb2dyZXNzIHdoaWxlIHdlIHJlYWQgcnEtPmNsb2NrLiBUaGF0IGlz IGEgd29ydGh5CisgKiBjb21wcm9taXNlIGluIHBsYWNlIG9mIGhhdmluZyBsb2NrcyBvbiBlYWNo IGlycSBpbiBhY2NvdW50X3N5c3RlbV90aW1lLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUo dTY0LCBjcHVfaGFyZGlycV90aW1lKTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQsIGNwdV9z b2Z0aXJxX3RpbWUpOworCitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTY0LCBpcnFfc3RhcnRfdGlt ZSk7CitzdGF0aWMgaW50IHNjaGVkX2Nsb2NrX2lycXRpbWU7CisKK3ZvaWQgZW5hYmxlX3NjaGVk X2Nsb2NrX2lycXRpbWUodm9pZCkKK3sKKwlzY2hlZF9jbG9ja19pcnF0aW1lID0gMTsKK30KKwor dm9pZCBkaXNhYmxlX3NjaGVkX2Nsb2NrX2lycXRpbWUodm9pZCkKK3sKKwlzY2hlZF9jbG9ja19p cnF0aW1lID0gMDsKK30KKworI2lmbmRlZiBDT05GSUdfNjRCSVQKK3N0YXRpYyBERUZJTkVfUEVS X0NQVShzZXFjb3VudF90LCBpcnFfdGltZV9zZXEpOworCitzdGF0aWMgaW5saW5lIHZvaWQgaXJx X3RpbWVfd3JpdGVfYmVnaW4odm9pZCkKK3sKKwlfX3RoaXNfY3B1X2luYyhpcnFfdGltZV9zZXEu c2VxdWVuY2UpOworCXNtcF93bWIoKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlycV90aW1l X3dyaXRlX2VuZCh2b2lkKQoreworCXNtcF93bWIoKTsKKwlfX3RoaXNfY3B1X2luYyhpcnFfdGlt ZV9zZXEuc2VxdWVuY2UpOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBpcnFfdGltZV9yZWFkKGlu dCBjcHUpCit7CisJdTY0IGlycV90aW1lOworCXVuc2lnbmVkIHNlcTsKKworCWRvIHsKKwkJc2Vx ID0gcmVhZF9zZXFjb3VudF9iZWdpbigmcGVyX2NwdShpcnFfdGltZV9zZXEsIGNwdSkpOworCQlp cnFfdGltZSA9IHBlcl9jcHUoY3B1X3NvZnRpcnFfdGltZSwgY3B1KSArCisJCQkgICBwZXJfY3B1 KGNwdV9oYXJkaXJxX3RpbWUsIGNwdSk7CisJfSB3aGlsZSAocmVhZF9zZXFjb3VudF9yZXRyeSgm cGVyX2NwdShpcnFfdGltZV9zZXEsIGNwdSksIHNlcSkpOworCisJcmV0dXJuIGlycV90aW1lOwor fQorI2Vsc2UgLyogQ09ORklHXzY0QklUICovCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX3RpbWVf d3JpdGVfYmVnaW4odm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlycV90aW1lX3dy aXRlX2VuZCh2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHU2NCBpcnFfdGltZV9yZWFkKGlu dCBjcHUpCit7CisJcmV0dXJuIHBlcl9jcHUoY3B1X3NvZnRpcnFfdGltZSwgY3B1KSArIHBlcl9j cHUoY3B1X2hhcmRpcnFfdGltZSwgY3B1KTsKK30KKyNlbmRpZiAvKiBDT05GSUdfNjRCSVQgKi8K KworYm9vbCBjcHVzX3NoYXJlX2NhY2hlKGludCB0aGlzX2NwdSwgaW50IHRoYXRfY3B1KQorewor CXN0cnVjdCBycSAqdGhpc19ycSA9IGNwdV9ycSh0aGlzX2NwdSk7CisKKwlyZXR1cm4gKHRoaXNf cnEtPmNwdV9sb2NhbGl0eVt0aGF0X2NwdV0gPCAyKTsKK30KK0VYUE9SVF9TWU1CT0woY3B1c19z aGFyZV9jYWNoZSk7CisKKy8qCisgKiBDYWxsZWQgYmVmb3JlIGluY3JlbWVudGluZyBwcmVlbXB0 X2NvdW50IG9uIHtzb2Z0LH1pcnFfZW50ZXIKKyAqIGFuZCBiZWZvcmUgZGVjcmVtZW50aW5nIHBy ZWVtcHRfY291bnQgb24ge3NvZnQsfWlycV9leGl0LgorICovCit2b2lkIGFjY291bnRfc3lzdGVt X3Z0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VycikKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCXM2NCBkZWx0YTsKKwlpbnQgY3B1OworCisJaWYgKCFzY2hlZF9jbG9ja19pcnF0aW1lKQor CQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljcHUgPSBzbXBfcHJvY2Vz c29yX2lkKCk7CisJZGVsdGEgPSBzY2hlZF9jbG9ja19jcHUoY3B1KSAtIF9fdGhpc19jcHVfcmVh ZChpcnFfc3RhcnRfdGltZSk7CisJX190aGlzX2NwdV9hZGQoaXJxX3N0YXJ0X3RpbWUsIGRlbHRh KTsKKworCWlycV90aW1lX3dyaXRlX2JlZ2luKCk7CisJLyoKKwkgKiBXZSBkbyBub3QgYWNjb3Vu dCBmb3Igc29mdGlycSB0aW1lIGZyb20ga3NvZnRpcnFkIGhlcmUuCisJICogV2Ugd2FudCB0byBj b250aW51ZSBhY2NvdW50aW5nIHNvZnRpcnEgdGltZSB0byBrc29mdGlycWQgdGhyZWFkCisJICog aW4gdGhhdCBjYXNlLCBzbyBhcyBub3QgdG8gY29uZnVzZSBzY2hlZHVsZXIgd2l0aCBhIHNwZWNp YWwgdGFzaworCSAqIHRoYXQgZG8gbm90IGNvbnN1bWUgYW55IHRpbWUsIGJ1dCBzdGlsbCB3YW50 cyB0byBydW4uCisJICovCisJaWYgKGhhcmRpcnFfY291bnQoKSkKKwkJX190aGlzX2NwdV9hZGQo Y3B1X2hhcmRpcnFfdGltZSwgZGVsdGEpOworCWVsc2UgaWYgKGluX3NlcnZpbmdfc29mdGlycSgp ICYmIGN1cnIgIT0gdGhpc19jcHVfa3NvZnRpcnFkKCkpCisJCV9fdGhpc19jcHVfYWRkKGNwdV9z b2Z0aXJxX3RpbWUsIGRlbHRhKTsKKworCWlycV90aW1lX3dyaXRlX2VuZCgpOworCWxvY2FsX2ly cV9yZXN0b3JlKGZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGFjY291bnRfc3lzdGVtX3Z0 aW1lKTsKKworI2VuZGlmIC8qIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HICovCisKK3N0YXRp YyB2b2lkIHVwZGF0ZV9ycV9jbG9ja190YXNrKHN0cnVjdCBycSAqcnEsIHM2NCBkZWx0YSkKK3sK KyNpZmRlZiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORworCXM2NCBpcnFfZGVsdGEgPSBpcnFf dGltZV9yZWFkKGNwdV9vZihycSkpIC0gcnEtPnByZXZfaXJxX3RpbWU7CisKKwkvKgorCSAqIFNp bmNlIGlycV90aW1lIGlzIG9ubHkgdXBkYXRlZCBvbiB7c29mdCx9aXJxX2V4aXQsIHdlIG1pZ2h0 IHJ1biBpbnRvCisJICogdGhpcyBjYXNlIHdoZW4gYSBwcmV2aW91cyB1cGRhdGVfcnFfY2xvY2so KSBoYXBwZW5lZCBpbnNpZGUgYQorCSAqIHtzb2Z0LH1pcnEgcmVnaW9uLgorCSAqCisJICogV2hl biB0aGlzIGhhcHBlbnMsIHdlIHN0b3AgLT5jbG9ja190YXNrIGFuZCBvbmx5IHVwZGF0ZSB0aGUK KwkgKiBwcmV2X2lycV90aW1lIHN0YW1wIHRvIGFjY291bnQgZm9yIHRoZSBwYXJ0IHRoYXQgZml0 LCBzbyB0aGF0IGEgbmV4dAorCSAqIHVwZGF0ZSB3aWxsIGNvbnN1bWUgdGhlIHJlc3QuIFRoaXMg ZW5zdXJlcyAtPmNsb2NrX3Rhc2sgaXMKKwkgKiBtb25vdG9uaWMuCisJICoKKwkgKiBJdCBkb2Vz IGhvd2V2ZXIgY2F1c2Ugc29tZSBzbGlnaHQgbWlzcy1hdHRyaWJ1dGlvbiBvZiB7c29mdCx9aXJx CisJICogdGltZSwgYSBtb3JlIGFjY3VyYXRlIHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVwZGF0ZSB0 aGUgaXJxX3RpbWUgdXNpbmcKKwkgKiB0aGUgY3VycmVudCBycS0+Y2xvY2sgdGltZXN0YW1wLCBl eGNlcHQgdGhhdCB3b3VsZCByZXF1aXJlIHVzaW5nCisJICogYXRvbWljIG9wcy4KKwkgKi8KKwlp ZiAoaXJxX2RlbHRhID4gZGVsdGEpCisJCWlycV9kZWx0YSA9IGRlbHRhOworCisJcnEtPnByZXZf aXJxX3RpbWUgKz0gaXJxX2RlbHRhOworCWRlbHRhIC09IGlycV9kZWx0YTsKKyNlbmRpZgorCXJx LT5jbG9ja190YXNrICs9IGRlbHRhOworfQorCisjaWZuZGVmIG5zZWNzX3RvX2NwdXRpbWUKKyMg ZGVmaW5lIG5zZWNzX3RvX2NwdXRpbWUoX19uc2VjcykJbnNlY3NfdG9famlmZmllcyhfX25zZWNz KQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORworc3RhdGljIHZv aWQgaXJxdGltZV9hY2NvdW50X2hpX3NpKHZvaWQpCit7CisJdTY0ICpjcHVzdGF0ID0ga2NwdXN0 YXRfdGhpc19jcHUtPmNwdXN0YXQ7CisJdTY0IGxhdGVzdF9uczsKKworCWxhdGVzdF9ucyA9IG5z ZWNzX3RvX2NwdXRpbWU2NCh0aGlzX2NwdV9yZWFkKGNwdV9oYXJkaXJxX3RpbWUpKTsKKwlpZiAo bGF0ZXN0X25zID4gY3B1c3RhdFtDUFVUSU1FX0lSUV0pCisJCWNwdXN0YXRbQ1BVVElNRV9JUlFd ICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsKKworCWxhdGVzdF9ucyA9IG5zZWNz X3RvX2NwdXRpbWU2NCh0aGlzX2NwdV9yZWFkKGNwdV9zb2Z0aXJxX3RpbWUpKTsKKwlpZiAobGF0 ZXN0X25zID4gY3B1c3RhdFtDUFVUSU1FX1NPRlRJUlFdKQorCQljcHVzdGF0W0NQVVRJTUVfU09G VElSUV0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWVfb25lX2ppZmZ5OworfQorI2Vsc2UgLyogQ09O RklHX0lSUV9USU1FX0FDQ09VTlRJTkcgKi8KKworI2RlZmluZSBzY2hlZF9jbG9ja19pcnF0aW1l CSgwKQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxdGltZV9hY2NvdW50X2hpX3NpKHZvaWQpCit7 Cit9CisjZW5kaWYgLyogQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgKi8KKworLyoKKyAqIE9u IGVhY2ggdGljaywgc2VlIHdoYXQgcGVyY2VudGFnZSBvZiB0aGF0IHRpY2sgd2FzIGF0dHJpYnV0 ZWQgdG8gZWFjaAorICogY29tcG9uZW50IGFuZCBhZGQgdGhlIHBlcmNlbnRhZ2UgdG8gdGhlIF9w YyB2YWx1ZXMuIE9uY2UgYSBfcGMgdmFsdWUgaGFzCisgKiBhY2N1bXVsYXRlZCBvbmUgdGljaydz IHdvcnRoLCBhY2NvdW50IGZvciB0aGF0LiBUaGlzIG1lYW5zIHRoZSB0b3RhbAorICogcGVyY2Vu dGFnZSBvZiBsb2FkIGNvbXBvbmVudHMgd2lsbCBhbHdheXMgYmUgMTI4IChwc2V1ZG8gMTAwKSBw ZXIgdGljay4KKyAqLworc3RhdGljIHZvaWQgcGNfaWRsZV90aW1lKHN0cnVjdCBycSAqcnEsIHVu c2lnbmVkIGxvbmcgcGMpCit7CisJdTY0ICpjcHVzdGF0ID0ga2NwdXN0YXRfdGhpc19jcHUtPmNw dXN0YXQ7CisKKwlpZiAoYXRvbWljX3JlYWQoJnJxLT5ucl9pb3dhaXQpID4gMCkgeworCQlycS0+ aW93YWl0X3BjICs9IHBjOworCQlpZiAocnEtPmlvd2FpdF9wYyA+PSAxMjgpIHsKKwkJCXJxLT5p b3dhaXRfcGMgJT0gMTI4OworCQkJY3B1c3RhdFtDUFVUSU1FX0lPV0FJVF0gKz0gKF9fZm9yY2Ug dTY0KWNwdXRpbWVfb25lX2ppZmZ5OworCQl9CisJfSBlbHNlIHsKKwkJcnEtPmlkbGVfcGMgKz0g cGM7CisJCWlmIChycS0+aWRsZV9wYyA+PSAxMjgpIHsKKwkJCXJxLT5pZGxlX3BjICU9IDEyODsK KwkJCWNwdXN0YXRbQ1BVVElNRV9JRExFXSArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9vbmVfamlm Znk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwY19zeXN0ZW1fdGltZShzdHJ1Y3QgcnEg KnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBoYXJkaXJxX29mZnNldCwKKwkJICAgdW5z aWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBucykKK3sKKwl1NjQgKmNwdXN0YXQgPSBrY3B1 c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKKwljcHV0aW1lX3Qgb25lX2ppZmZ5X3NjYWxlZCA9IGNw dXRpbWVfdG9fc2NhbGVkKGNwdXRpbWVfb25lX2ppZmZ5KTsKKworCXAtPnN0aW1lX3BjICs9IHBj OworCWlmIChwLT5zdGltZV9wYyA+PSAxMjgpIHsKKwkJcC0+c3RpbWVfcGMgJT0gMTI4OworCQlw LT5zdGltZSArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9vbmVfamlmZnk7CisJCXAtPnN0aW1lc2Nh bGVkICs9IG9uZV9qaWZmeV9zY2FsZWQ7CisJCWFjY3RfdXBkYXRlX2ludGVncmFscyhwKTsKKwl9 CisJcC0+c2NoZWRfdGltZSArPSBuczsKKworCWlmIChoYXJkaXJxX2NvdW50KCkgLSBoYXJkaXJx X29mZnNldCkgeworCQlycS0+aXJxX3BjICs9IHBjOworCQlpZiAocnEtPmlycV9wYyA+PSAxMjgp IHsKKwkJCXJxLT5pcnFfcGMgJT0gMTI4OworCQkJY3B1c3RhdFtDUFVUSU1FX0lSUV0gKz0gKF9f Zm9yY2UgdTY0KWNwdXRpbWVfb25lX2ppZmZ5OworCQl9CisJfSBlbHNlIGlmIChpbl9zZXJ2aW5n X3NvZnRpcnEoKSkgeworCQlycS0+c29mdGlycV9wYyArPSBwYzsKKwkJaWYgKHJxLT5zb2Z0aXJx X3BjID49IDEyOCkgeworCQkJcnEtPnNvZnRpcnFfcGMgJT0gMTI4OworCQkJY3B1c3RhdFtDUFVU SU1FX1NPRlRJUlFdICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsKKwkJfQorCX0g ZWxzZSB7CisJCXJxLT5zeXN0ZW1fcGMgKz0gcGM7CisJCWlmIChycS0+c3lzdGVtX3BjID49IDEy OCkgeworCQkJcnEtPnN5c3RlbV9wYyAlPSAxMjg7CisJCQljcHVzdGF0W0NQVVRJTUVfU1lTVEVN XSArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9vbmVfamlmZnk7CisJCX0KKwl9Cit9CisKK3N0YXRp YyB2b2lkIHBjX3VzZXJfdGltZShzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAs CisJCQkgdW5zaWduZWQgbG9uZyBwYywgdW5zaWduZWQgbG9uZyBucykKK3sKKwl1NjQgKmNwdXN0 YXQgPSBrY3B1c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKKwljcHV0aW1lX3Qgb25lX2ppZmZ5X3Nj YWxlZCA9IGNwdXRpbWVfdG9fc2NhbGVkKGNwdXRpbWVfb25lX2ppZmZ5KTsKKworCXAtPnV0aW1l X3BjICs9IHBjOworCWlmIChwLT51dGltZV9wYyA+PSAxMjgpIHsKKwkJcC0+dXRpbWVfcGMgJT0g MTI4OworCQlwLT51dGltZSArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9vbmVfamlmZnk7CisJCXAt PnV0aW1lc2NhbGVkICs9IG9uZV9qaWZmeV9zY2FsZWQ7CisJCWFjY3RfdXBkYXRlX2ludGVncmFs cyhwKTsKKwl9CisJcC0+c2NoZWRfdGltZSArPSBuczsKKworCWlmICh0aGlzX2NwdV9rc29mdGly cWQoKSA9PSBwKSB7CisJCS8qCisJCSAqIGtzb2Z0aXJxZCB0aW1lIGRvIG5vdCBnZXQgYWNjb3Vu dGVkIGluIGNwdV9zb2Z0aXJxX3RpbWUuCisJCSAqIFNvLCB3ZSBoYXZlIHRvIGhhbmRsZSBpdCBz ZXBhcmF0ZWx5IGhlcmUuCisJCSAqLworCQlycS0+c29mdGlycV9wYyArPSBwYzsKKwkJaWYgKHJx LT5zb2Z0aXJxX3BjID49IDEyOCkgeworCQkJcnEtPnNvZnRpcnFfcGMgJT0gMTI4OworCQkJY3B1 c3RhdFtDUFVUSU1FX1NPRlRJUlFdICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsK KwkJfQorCX0KKworCWlmIChUQVNLX05JQ0UocCkgPiAwIHx8IGlkbGVwcmlvX3Rhc2socCkpIHsK KwkJcnEtPm5pY2VfcGMgKz0gcGM7CisJCWlmIChycS0+bmljZV9wYyA+PSAxMjgpIHsKKwkJCXJx LT5uaWNlX3BjICU9IDEyODsKKwkJCWNwdXN0YXRbQ1BVVElNRV9OSUNFXSArPSAoX19mb3JjZSB1 NjQpY3B1dGltZV9vbmVfamlmZnk7CisJCX0KKwl9IGVsc2UgeworCQlycS0+dXNlcl9wYyArPSBw YzsKKwkJaWYgKHJxLT51c2VyX3BjID49IDEyOCkgeworCQkJcnEtPnVzZXJfcGMgJT0gMTI4Owor CQkJY3B1c3RhdFtDUFVUSU1FX1VTRVJdICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZm eTsKKwkJfQorCX0KK30KKworLyoKKyAqIENvbnZlcnQgbmFub3NlY29uZHMgdG8gcHNldWRvIHBl cmNlbnRhZ2Ugb2Ygb25lIHRpY2suIFVzZSAxMjggZm9yIGZhc3QKKyAqIHNoaWZ0cyBpbnN0ZWFk IG9mIDEwMAorICovCisjZGVmaW5lIE5TX1RPX1BDKE5TKQkoTlMgKiAxMjggLyBKSUZGWV9OUykK KworLyoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uIGNsb2NrIHRpY2tzIGFuZCBvbiBjb250ZXh0IHN3 aXRjaGVzLgorICogQmFuayBpbiBwLT5zY2hlZF90aW1lIHRoZSBucyBlbGFwc2VkIHNpbmNlIHRo ZSBsYXN0IHRpY2sgb3Igc3dpdGNoLgorICogQ1BVIHNjaGVkdWxlciBxdW90YSBhY2NvdW50aW5n IGlzIGFsc28gcGVyZm9ybWVkIGhlcmUgaW4gbWljcm9zZWNvbmRzLgorICovCitzdGF0aWMgdm9p ZAordXBkYXRlX2NwdV9jbG9jayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAp Cit7CisJbG9uZyBhY2NvdW50X25zID0gcnEtPmNsb2NrIC0gcnEtPnRpbWVrZWVwX2Nsb2NrOwor CXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSA9IHJxLT5pZGxlOworCXVuc2lnbmVkIGxvbmcgYWNj b3VudF9wYzsKKwlpbnQgdXNlcl90aWNrOworCisJcC0+bGFzdF9yYW4gPSBycS0+Y2xvY2s7CisK KwlpZiAodW5saWtlbHkoYWNjb3VudF9ucyA8IDApKQorCQlhY2NvdW50X25zID0gMDsKKworCWFj Y291bnRfcGMgPSBOU19UT19QQyhhY2NvdW50X25zKTsKKworCS8qIEFjY3VyYXRlIHRpY2sgdGlt ZWtlZXBpbmcgKi8KKwlycS0+YWNjb3VudF9wYyArPSBhY2NvdW50X3BjIC0gMTI4OworCWlmIChy cS0+YWNjb3VudF9wYyA8IDApIHsKKwkJLyoKKwkJICogU21hbGwgZXJyb3JzIGluIG1pY3JvIGFj Y291bnRpbmcgbWF5IG5vdCBtYWtlIHRoZQorCQkgKiBhY2NvdW50aW5nIGFkZCB1cCB0byAxMjgg ZWFjaCB0aWNrIHNvIHdlIGtlZXAgdHJhY2sKKwkJICogb2YgdGhlIHBlcmNlbnRhZ2UgYW5kIHJv dW5kIGl0IHVwIHdoZW4gbGVzcyB0aGFuIDEyOAorCQkgKi8KKwkJYWNjb3VudF9wYyArPSAtcnEt PmFjY291bnRfcGM7CisJCXJxLT5hY2NvdW50X3BjID0gMDsKKwl9CisKKwl1c2VyX3RpY2sgPSB1 c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpOworCisJaWYgKHVzZXJfdGljaykKKwkJcGNfdXNlcl90 aW1lKHJxLCBwLCBhY2NvdW50X3BjLCBhY2NvdW50X25zKTsKKwllbHNlIGlmIChwICE9IGlkbGUg fHwgKGlycV9jb3VudCgpICE9IEhBUkRJUlFfT0ZGU0VUKSkKKwkJcGNfc3lzdGVtX3RpbWUocnEs IHAsIEhBUkRJUlFfT0ZGU0VULAorCQkJCSAgIGFjY291bnRfcGMsIGFjY291bnRfbnMpOworCWVs c2UKKwkJcGNfaWRsZV90aW1lKHJxLCBhY2NvdW50X3BjKTsKKworCWlmIChzY2hlZF9jbG9ja19p cnF0aW1lKQorCQlpcnF0aW1lX2FjY291bnRfaGlfc2koKTsKKworCS8qIHRpbWVfc2xpY2UgYWNj b3VudGluZyBpcyBkb25lIGluIHVzZWNzIHRvIGF2b2lkIG92ZXJmbG93IG9uIDMyYml0ICovCisJ aWYgKHJxLT5ycV9wb2xpY3kgIT0gU0NIRURfRklGTyAmJiBwICE9IGlkbGUpIHsKKwkJczY0IHRp bWVfZGlmZiA9IHJxLT5jbG9jayAtIHJxLT5ycV9sYXN0X3JhbjsKKworCQluaWZmeV9kaWZmKCZ0 aW1lX2RpZmYsIDEpOworCQlwLT50aW1lX3NsaWNlIC09IE5TX1RPX1VTKHRpbWVfZGlmZik7CisJ fQorCXJxLT5ycV9sYXN0X3JhbiA9IHJxLT50aW1la2VlcF9jbG9jayA9IHJxLT5jbG9jazsKK30K KworLyoKKyAqIFJldHVybiBhbnkgbnMgb24gdGhlIHNjaGVkX2Nsb2NrIHRoYXQgaGF2ZSBub3Qg eWV0IGJlZW4gYWNjb3VudGVkIGluCisgKiBAcCBpbiBjYXNlIHRoYXQgdGFzayBpcyBjdXJyZW50 bHkgcnVubmluZy4KKyAqCisgKiBDYWxsZWQgd2l0aCB0YXNrX2dycV9sb2NrKCkgaGVsZC4KKyAq Lworc3RhdGljIHU2NCBkb190YXNrX2RlbHRhX2V4ZWMoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBz dHJ1Y3QgcnEgKnJxKQoreworCXU2NCBucyA9IDA7CisKKwlpZiAocCA9PSBycS0+Y3Vycikgewor CQlucyA9IHJxLT5jbG9ja190YXNrIC0gcnEtPnJxX2xhc3RfcmFuOworCQlpZiAodW5saWtlbHko KHM2NClucyA8IDApKQorCQkJbnMgPSAwOworCX0KKworCXJldHVybiBuczsKK30KKwordW5zaWdu ZWQgbG9uZyBsb25nIHRhc2tfZGVsdGFfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOworCXU2NCBuczsKKworCXJxID0g dGFza19ncnFfbG9jayhwLCAmZmxhZ3MpOworCW5zID0gZG9fdGFza19kZWx0YV9leGVjKHAsIHJx KTsKKwl0YXNrX2dycV91bmxvY2soJmZsYWdzKTsKKworCXJldHVybiBuczsKK30KKworLyoKKyAq IFJldHVybiBhY2NvdW50ZWQgcnVudGltZSBmb3IgdGhlIHRhc2suCisgKiBJbiBjYXNlIHRoZSB0 YXNrIGlzIGN1cnJlbnRseSBydW5uaW5nLCByZXR1cm4gdGhlIHJ1bnRpbWUgcGx1cyBjdXJyZW50 J3MKKyAqIHBlbmRpbmcgcnVudGltZSB0aGF0IGhhdmUgbm90IGJlZW4gYWNjb3VudGVkIHlldC4K KyAqLwordW5zaWduZWQgbG9uZyBsb25nIHRhc2tfc2NoZWRfcnVudGltZShzdHJ1Y3QgdGFza19z dHJ1Y3QgKnApCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOworCXU2 NCBuczsKKworCXJxID0gdGFza19ncnFfbG9jayhwLCAmZmxhZ3MpOworCW5zID0gcC0+c2NoZWRf dGltZSArIGRvX3Rhc2tfZGVsdGFfZXhlYyhwLCBycSk7CisJdGFza19ncnFfdW5sb2NrKCZmbGFn cyk7CisKKwlyZXR1cm4gbnM7Cit9CisKKy8qIENvbXBhdGliaWxpdHkgY3JhcCBmb3IgcmVtb3Zh bCAqLwordm9pZCBhY2NvdW50X3VzZXJfdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRp bWVfdCBjcHV0aW1lLAorCQkJICAgY3B1dGltZV90IGNwdXRpbWVfc2NhbGVkKQoreworfQorCit2 b2lkIGFjY291bnRfaWRsZV90aW1lKGNwdXRpbWVfdCBjcHV0aW1lKQoreworfQorCisvKgorICog QWNjb3VudCBndWVzdCBjcHUgdGltZSB0byBhIHByb2Nlc3MuCisgKiBAcDogdGhlIHByb2Nlc3Mg dGhhdCB0aGUgY3B1IHRpbWUgZ2V0cyBhY2NvdW50ZWQgdG8KKyAqIEBjcHV0aW1lOiB0aGUgY3B1 IHRpbWUgc3BlbnQgaW4gdmlydHVhbCBtYWNoaW5lIHNpbmNlIHRoZSBsYXN0IHVwZGF0ZQorICog QGNwdXRpbWVfc2NhbGVkOiBjcHV0aW1lIHNjYWxlZCBieSBjcHUgZnJlcXVlbmN5CisgKi8KK3N0 YXRpYyB2b2lkIGFjY291bnRfZ3Vlc3RfdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRp bWVfdCBjcHV0aW1lLAorCQkJCSAgIGNwdXRpbWVfdCBjcHV0aW1lX3NjYWxlZCkKK3sKKwl1NjQg KmNwdXN0YXQgPSBrY3B1c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKKworCS8qIEFkZCBndWVzdCB0 aW1lIHRvIHByb2Nlc3MuICovCisJcC0+dXRpbWUgKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWU7CisJ cC0+dXRpbWVzY2FsZWQgKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWVfc2NhbGVkOworCXAtPmd0aW1l ICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lOworCisJLyogQWRkIGd1ZXN0IHRpbWUgdG8gY3B1c3Rh dC4gKi8KKwlpZiAoVEFTS19OSUNFKHApID4gMCkgeworCQljcHVzdGF0W0NQVVRJTUVfTklDRV0g Kz0gKF9fZm9yY2UgdTY0KWNwdXRpbWU7CisJCWNwdXN0YXRbQ1BVVElNRV9HVUVTVF9OSUNFXSAr PSAoX19mb3JjZSB1NjQpY3B1dGltZTsKKwl9IGVsc2UgeworCQljcHVzdGF0W0NQVVRJTUVfVVNF Ul0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWU7CisJCWNwdXN0YXRbQ1BVVElNRV9HVUVTVF0gKz0g KF9fZm9yY2UgdTY0KWNwdXRpbWU7CisJfQorfQorCisvKgorICogQWNjb3VudCBzeXN0ZW0gY3B1 IHRpbWUgdG8gYSBwcm9jZXNzIGFuZCBkZXNpcmVkIGNwdXN0YXQgZmllbGQKKyAqIEBwOiB0aGUg cHJvY2VzcyB0aGF0IHRoZSBjcHUgdGltZSBnZXRzIGFjY291bnRlZCB0bworICogQGNwdXRpbWU6 IHRoZSBjcHUgdGltZSBzcGVudCBpbiBrZXJuZWwgc3BhY2Ugc2luY2UgdGhlIGxhc3QgdXBkYXRl CisgKiBAY3B1dGltZV9zY2FsZWQ6IGNwdXRpbWUgc2NhbGVkIGJ5IGNwdSBmcmVxdWVuY3kKKyAq IEB0YXJnZXRfY3B1dGltZTY0OiBwb2ludGVyIHRvIGNwdXN0YXQgZmllbGQgdGhhdCBoYXMgdG8g YmUgdXBkYXRlZAorICovCitzdGF0aWMgaW5saW5lCit2b2lkIF9fYWNjb3VudF9zeXN0ZW1fdGlt ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRpbWVfdCBjcHV0aW1lLAorCQkJY3B1dGltZV90 IGNwdXRpbWVfc2NhbGVkLCBjcHV0aW1lNjRfdCAqdGFyZ2V0X2NwdXRpbWU2NCkKK3sKKwkvKiBB ZGQgc3lzdGVtIHRpbWUgdG8gcHJvY2Vzcy4gKi8KKwlwLT5zdGltZSArPSAoX19mb3JjZSB1NjQp Y3B1dGltZTsKKwlwLT5zdGltZXNjYWxlZCArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9zY2FsZWQ7 CisKKwkvKiBBZGQgc3lzdGVtIHRpbWUgdG8gY3B1c3RhdC4gKi8KKwkqdGFyZ2V0X2NwdXRpbWU2 NCArPSAoX19mb3JjZSB1NjQpY3B1dGltZTsKKworCS8qIEFjY291bnQgZm9yIHN5c3RlbSB0aW1l IHVzZWQgKi8KKwlhY2N0X3VwZGF0ZV9pbnRlZ3JhbHMocCk7Cit9CisKKy8qCisgKiBBY2NvdW50 IHN5c3RlbSBjcHUgdGltZSB0byBhIHByb2Nlc3MuCisgKiBAcDogdGhlIHByb2Nlc3MgdGhhdCB0 aGUgY3B1IHRpbWUgZ2V0cyBhY2NvdW50ZWQgdG8KKyAqIEBoYXJkaXJxX29mZnNldDogdGhlIG9m ZnNldCB0byBzdWJ0cmFjdCBmcm9tIGhhcmRpcnFfY291bnQoKQorICogQGNwdXRpbWU6IHRoZSBj cHUgdGltZSBzcGVudCBpbiBrZXJuZWwgc3BhY2Ugc2luY2UgdGhlIGxhc3QgdXBkYXRlCisgKiBA Y3B1dGltZV9zY2FsZWQ6IGNwdXRpbWUgc2NhbGVkIGJ5IGNwdSBmcmVxdWVuY3kKKyAqIFRoaXMg aXMgZm9yIGd1ZXN0IG9ubHkgbm93LgorICovCit2b2lkIGFjY291bnRfc3lzdGVtX3RpbWUoc3Ry dWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgaGFyZGlycV9vZmZzZXQsCisJCQkgY3B1dGltZV90IGNw dXRpbWUsIGNwdXRpbWVfdCBjcHV0aW1lX3NjYWxlZCkKK3sKKworCWlmICgocC0+ZmxhZ3MgJiBQ Rl9WQ1BVKSAmJiAoaXJxX2NvdW50KCkgLSBoYXJkaXJxX29mZnNldCA9PSAwKSkKKwkJYWNjb3Vu dF9ndWVzdF90aW1lKHAsIGNwdXRpbWUsIGNwdXRpbWVfc2NhbGVkKTsKK30KKworLyoKKyAqIEFj Y291bnQgZm9yIGludm9sdW50YXJ5IHdhaXQgdGltZS4KKyAqIEBzdGVhbDogdGhlIGNwdSB0aW1l IHNwZW50IGluIGludm9sdW50YXJ5IHdhaXQKKyAqLwordm9pZCBhY2NvdW50X3N0ZWFsX3RpbWUo Y3B1dGltZV90IGNwdXRpbWUpCit7CisJdTY0ICpjcHVzdGF0ID0ga2NwdXN0YXRfdGhpc19jcHUt PmNwdXN0YXQ7CisKKwljcHVzdGF0W0NQVVRJTUVfU1RFQUxdICs9IChfX2ZvcmNlIHU2NCljcHV0 aW1lOworfQorCisvKgorICogQWNjb3VudCBmb3IgaWRsZSB0aW1lLgorICogQGNwdXRpbWU6IHRo ZSBjcHUgdGltZSBzcGVudCBpbiBpZGxlIHdhaXQKKyAqLworc3RhdGljIHZvaWQgYWNjb3VudF9p ZGxlX3RpbWVzKGNwdXRpbWVfdCBjcHV0aW1lKQoreworCXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0 X3RoaXNfY3B1LT5jcHVzdGF0OworCXN0cnVjdCBycSAqcnEgPSB0aGlzX3JxKCk7CisKKwlpZiAo YXRvbWljX3JlYWQoJnJxLT5ucl9pb3dhaXQpID4gMCkKKwkJY3B1c3RhdFtDUFVUSU1FX0lPV0FJ VF0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWU7CisJZWxzZQorCQljcHVzdGF0W0NQVVRJTUVfSURM RV0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWU7Cit9CisKKyNpZm5kZWYgQ09ORklHX1ZJUlRfQ1BV X0FDQ09VTlRJTkcKKwordm9pZCBhY2NvdW50X3Byb2Nlc3NfdGljayhzdHJ1Y3QgdGFza19zdHJ1 Y3QgKnAsIGludCB1c2VyX3RpY2spCit7Cit9CisKKy8qCisgKiBBY2NvdW50IG11bHRpcGxlIHRp Y2tzIG9mIHN0ZWFsIHRpbWUuCisgKiBAcDogdGhlIHByb2Nlc3MgZnJvbSB3aGljaCB0aGUgY3B1 IHRpbWUgaGFzIGJlZW4gc3RvbGVuCisgKiBAdGlja3M6IG51bWJlciBvZiBzdG9sZW4gdGlja3MK KyAqLwordm9pZCBhY2NvdW50X3N0ZWFsX3RpY2tzKHVuc2lnbmVkIGxvbmcgdGlja3MpCit7CisJ YWNjb3VudF9zdGVhbF90aW1lKGppZmZpZXNfdG9fY3B1dGltZSh0aWNrcykpOworfQorCisvKgor ICogQWNjb3VudCBtdWx0aXBsZSB0aWNrcyBvZiBpZGxlIHRpbWUuCisgKiBAdGlja3M6IG51bWJl ciBvZiBzdG9sZW4gdGlja3MKKyAqLwordm9pZCBhY2NvdW50X2lkbGVfdGlja3ModW5zaWduZWQg bG9uZyB0aWNrcykKK3sKKwlhY2NvdW50X2lkbGVfdGltZXMoamlmZmllc190b19jcHV0aW1lKHRp Y2tzKSk7Cit9CisjZW5kaWYKKworLyogVGhpcyBtYW5hZ2VzIHRhc2tzIHRoYXQgaGF2ZSBydW4g b3V0IG9mIHRpbWVzbGljZSBkdXJpbmcgYSBzY2hlZHVsZXJfdGljayAqLworLyog5b2T5YmN6Zif 5YiX5pe26ZKf55qE5o6n5Yi2ICovCitzdGF0aWMgdm9pZCB0YXNrX3J1bm5pbmdfdGljayhzdHJ1 Y3QgcnEgKnJxKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlwID0gcnEtPmN1cnI7CisK KwkvKiBTQ0hFRF9GSUZPIHRhc2tzIG5ldmVyIHJ1biBvdXQgb2YgdGltZXNsaWNlLiAqLworCWlm IChycS0+cnFfcG9saWN5ID09IFNDSEVEX0ZJRk8pCisJCXJldHVybjsKKwlpZihwLT50aWNrX3Vz ZWQgPD0gTUFYX1RJQ0tfVVNFRCkKKwkJcC0+dGlja191c2VkKys7CisJaWYgKHAtPnRpbWVfc2xp Y2UgPiBSRVNDSEVEX1VTKQorCQlyZXR1cm47CisKKwkvKiB0aW1lX3NsaWNlIGV4cGlyZWQuIEdy cSBsb2NrZWQgKi8KKwlncnFfbG9jaygpOworCXJlcXVldWVfdGFzayhwKTsKKwlzZXRfdHNrX25l ZWRfcmVzY2hlZChwKTsKKwlncnFfdW5sb2NrKCk7Cit9CisKK3ZvaWQgd2FrZV91cF9pZGxlX2Nw dShpbnQgY3B1KTsKKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYnkgdGhlIHRp bWVyIGNvZGUsIHdpdGggSFogZnJlcXVlbmN5LgorICogV2UgY2FsbCBpdCB3aXRoIGludGVycnVw dHMgZGlzYWJsZWQuIFRoZSBkYXRhIG1vZGlmaWVkIGlzIGFsbAorICogbG9jYWwgdG8gc3RydWN0 IHJxIHNvIHdlIGRvbid0IG5lZWQgdG8gZ3JhYiBncnEgbG9jay4KKyAqLwordm9pZCBzY2hlZHVs ZXJfdGljayh2b2lkKQoreworCWludCBjcHUgX19tYXliZV91bnVzZWQgPSBzbXBfcHJvY2Vzc29y X2lkKCk7CisJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCisJc2NoZWRfY2xvY2tfdGlj aygpOworCS8qIGdycSBsb2NrIG5vdCBncmFiYmVkLCBzbyBvbmx5IHVwZGF0ZSBycSBjbG9jayAq LworCXVwZGF0ZV9ycV9jbG9jayhycSk7CisJdXBkYXRlX2NwdV9jbG9jayhycSwgcnEtPmN1cnIp OworCWlmICghcnFfaWRsZShycSkpCisJCXRhc2tfcnVubmluZ190aWNrKHJxKTsKKwlwZXJmX2V2 ZW50X3Rhc2tfdGljaygpOworfQorCitub3RyYWNlIHVuc2lnbmVkIGxvbmcgZ2V0X3BhcmVudF9p cCh1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJaWYgKGluX2xvY2tfZnVuY3Rpb25zKGFkZHIpKSB7 CisJCWFkZHIgPSBDQUxMRVJfQUREUjI7CisJCWlmIChpbl9sb2NrX2Z1bmN0aW9ucyhhZGRyKSkK KwkJCWFkZHIgPSBDQUxMRVJfQUREUjM7CisJfQorCXJldHVybiBhZGRyOworfQorCisjaWYgZGVm aW5lZChDT05GSUdfUFJFRU1QVCkgJiYgKGRlZmluZWQoQ09ORklHX0RFQlVHX1BSRUVNUFQpIHx8 IFwKKwkJCQlkZWZpbmVkKENPTkZJR19QUkVFTVBUX1RSQUNFUikpCit2b2lkIF9fa3Byb2JlcyBh ZGRfcHJlZW1wdF9jb3VudChpbnQgdmFsKQoreworI2lmZGVmIENPTkZJR19ERUJVR19QUkVFTVBU CisJLyoKKwkgKiBVbmRlcmZsb3c/CisJICovCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oKHBy ZWVtcHRfY291bnQoKSA8IDApKSkKKwkJcmV0dXJuOworI2VuZGlmCisJcHJlZW1wdF9jb3VudCgp ICs9IHZhbDsKKyNpZmRlZiBDT05GSUdfREVCVUdfUFJFRU1QVAorCS8qCisJICogU3BpbmxvY2sg Y291bnQgb3ZlcmZsb3dpbmcgc29vbj8KKwkgKi8KKwlERUJVR19MT0NLU19XQVJOX09OKChwcmVl bXB0X2NvdW50KCkgJiBQUkVFTVBUX01BU0spID49CisJCQkJUFJFRU1QVF9NQVNLIC0gMTApOwor I2VuZGlmCisJaWYgKHByZWVtcHRfY291bnQoKSA9PSB2YWwpCisJCXRyYWNlX3ByZWVtcHRfb2Zm KENBTExFUl9BRERSMCwgZ2V0X3BhcmVudF9pcChDQUxMRVJfQUREUjEpKTsKK30KK0VYUE9SVF9T WU1CT0woYWRkX3ByZWVtcHRfY291bnQpOworCit2b2lkIF9fa3Byb2JlcyBzdWJfcHJlZW1wdF9j b3VudChpbnQgdmFsKQoreworI2lmZGVmIENPTkZJR19ERUJVR19QUkVFTVBUCisJLyoKKwkgKiBV bmRlcmZsb3c/CisJICovCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04odmFsID4gcHJlZW1wdF9j b3VudCgpKSkKKwkJcmV0dXJuOworCS8qCisJICogSXMgdGhlIHNwaW5sb2NrIHBvcnRpb24gdW5k ZXJmbG93aW5nPworCSAqLworCWlmIChERUJVR19MT0NLU19XQVJOX09OKCh2YWwgPCBQUkVFTVBU X01BU0spICYmCisJCQkhKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfTUFTSykpKQorCQlyZXR1 cm47CisjZW5kaWYKKworCWlmIChwcmVlbXB0X2NvdW50KCkgPT0gdmFsKQorCQl0cmFjZV9wcmVl bXB0X29uKENBTExFUl9BRERSMCwgZ2V0X3BhcmVudF9pcChDQUxMRVJfQUREUjEpKTsKKwlwcmVl bXB0X2NvdW50KCkgLT0gdmFsOworfQorRVhQT1JUX1NZTUJPTChzdWJfcHJlZW1wdF9jb3VudCk7 CisjZW5kaWYKKworI2RlZmluZSBwcmlvX3JhaXNhYmxlKHApICgJXAorCXAtPnByaW8gPiAoKHAt PnN0YXRpY19wcmlvIC0gcmV2ZXJzZShNQVhfVElDS19VU0VELCBwLT50aWNrX3VzZWQpKSArIFwK KwkJCShwLT5zbGVlcF9jbnQgLyAzKSkpCisKKy8qCisgKiBUaW1lc2xpY2VzIGJlbG93IFJFU0NI RURfVVMgYXJlIGNvbnNpZGVyZWQgYXMgZ29vZCBhcyBleHBpcmVkIGFzIHRoZXJlJ3Mgbm8KKyAq IHBvaW50IHJlc2NoZWR1bGluZyB3aGVuIHRoZXJlJ3Mgc28gbGl0dGxlIHRpbWUgbGVmdC4gU0NI RURfQkFUQ0ggdGFza3MKKyAqIGhhdmUgYmVlbiBmbGFnZ2VkIGJlIG5vdCBsYXRlbmN5IHNlbnNp dGl2ZSBhbmQgbGlrZWx5IHRvIGJlIGZ1bGx5IENQVQorICogYm91bmQgc28gZXZlcnkgdGltZSB0 aGV5J3JlIHJlc2NoZWR1bGVkIHRoZXkgaGF2ZSB0aGVpciB0aW1lX3NsaWNlCisgKiByZWZpbGxl ZC4KKyAqLworc3RhdGljIGlubGluZSBib29sIGNoZWNrX3RpbWVzbGljZV9lbmQoc3RydWN0IHJx ICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXU2NCBzbGVlcF9qaWZmeSA9IGppZmZp ZXNfNjQ7CisJYm9vbCBwcmVlbXB0ID0gZmFsc2U7CisJaWYgKHAtPnBvbGljeSA9PSBTQ0hFRF9G SUZPKQorCQlnb3RvIG91dDsKKwlpZiAocC0+dGltZV9zbGljZSA8IFJFU0NIRURfVVMgfHwgYmF0 Y2hfdGFzayhwKSkgeworCQlpZihwLT5wcmlvID4gTUFYX1JUX1BSSU8pIHsKKwkJCXAtPnByaW8r KzsKKwkJCWlmKHAtPnByaW8gPj0gSURMRV9QUklPKSB7CisJCQkJcC0+cHJpbyA9IHAtPnN0YXRp Y19wcmlvICsgNTsKKwkJCQlpZihwLT5wcmlvID49IElETEVfUFJJTykKKwkJCQkJcC0+cHJpbyA9 IHAtPnN0YXRpY19wcmlvOworCQkJfQorCQl9CisJCWdldF90aW1lX3NsaWNlKHApOworCX0gZWxz ZSBpZihwLT5wb2xpY3kgIT0gU0NIRURfUlIpIHsKKwkJaWYocC0+c3RhdGUgIT0gVEFTS19SVU5O SU5HKSB7CisJCQlpZihwLT5wcmlvID4gTk9STUFMX1BSSU8pIHsKKwkJCQlpZihwLT5zbGVlcF9j bnQgPCBNQVhfU0xFRVBfQ09VTlQpIAorCQkJCQlwLT5zbGVlcF9jbnQrKzsKKwkJCQlpZihwcmlv X3JhaXNhYmxlKHApKSAKKwkJCQkJcC0+cHJpby0tOworCQkJCWlmKHNsZWVwX2ppZmZ5ICE9IHAt PnNsZWVwX2ppZmZ5KSAKKwkJCQkJcC0+c2xlZXBfY250IC89IDI7CisJCQkJcC0+c2xlZXBfamlm ZnkgPSBzbGVlcF9qaWZmeTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXByZWVtcHQgPSB0cnVlOwor CQl9CisJfQorCWlmKChwLT5zdGF0ZSAhPSBUQVNLX1JVTk5JTkcpIHx8IChwLT50aWNrX3VzZWQg Pj0gTUFYX1RJQ0tfVVNFRCkpIHsKKwkJcC0+dGlja191c2VkIC89IDI7CisJfQorb3V0OgorCXJl dHVybiBwcmVlbXB0OworfQorCisjZGVmaW5lIEJJVE9QX1dPUkQobnIpCQkoKG5yKSAvIEJJVFNf UEVSX0xPTkcpCisKKworLyoKKyAqIOacgOS9juS9jeafpeaJvu+8jOafpeaJvuacgOmrmOS8mOWF iOe6p+W8gOWni+OAggorICogRmluZCB0aGUgbG93ZXN0IGJpdCBzZXQgaW4gdGhlIGJpdG1hcC5X ZSB3b3VsZCBmaW5kIHRoZSBoaWdoZXN0IHByaW9yaXR5IGZpcnN0LworICovCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGxvbmcKK2dldF9wcmlvX2JpdCh1bnNpZ25lZCBsb25nICphZGRyLCB1bnNp Z25lZCBsb25nIG9mZnNldCkKK3sKKwl1bnNpZ25lZCBsb25nICpmcm9tID0gYWRkciArIChvZmZz ZXQgLyBCSVRTX1BFUl9MT05HKTsKKwl1bnNpZ25lZCBsb25nICpsaW1pdCA9IGFkZHIgKyBQUklP X0xJTUlUIC8gQklUU19QRVJfTE9ORzsKKwlpbnQgaSA9IG9mZnNldCAlIEJJVFNfUEVSX0xPTkc7 CisJCisJaWYgKG9mZnNldCA+PSAgUFJJT19MSU1JVCkKKwkJcmV0dXJuIFBSSU9fTElNSVQ7CisK Kwlmb3IoO2Zyb20gIT0gKGxpbWl0KTtmcm9tKyspIHsKKwkJZm9yKDtpIDwgQklUU19QRVJfTE9O RztpKyssIG9mZnNldCsrKSB7CisJCQlpZigoKCpmcm9tID4+IGkpICYgMHgxKSkgeworCQkJCWdv dG8gb3V0OworCQkJfQorCQl9CisJCQorCQkvKgorCQkgKiAgVGhpcyBjYW4gbWFrZSBzdXJlIHRv IGdlbmVyYXRlIHRoZSBiZXN0IG1hY2hpbmUgY29kZS4KKwkJICovCisJCWkgPSAwOworCX0KK291 dDoKKwlyZXR1cm4gb2Zmc2V0OworfQorCisvKgorICogVGhlIGN1cnJlbnRseSBydW5uaW5nIHRh c2sncyBpbmZvcm1hdGlvbiBpcyBhbGwgc3RvcmVkIGluIHJxIGxvY2FsIGRhdGEKKyAqIHdoaWNo IGlzIG9ubHkgbW9kaWZpZWQgYnkgdGhlIGxvY2FsIENQVSwgdGhlcmVieSBhbGxvd2luZyB0aGUg ZGF0YSB0byBiZQorICogY2hhbmdlZCB3aXRob3V0IGdyYWJiaW5nIHRoZSBncnEgbG9jay4KKyAq Lworc3RhdGljIGlubGluZSB2b2lkIHNldF9ycV90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0 YXNrX3N0cnVjdCAqcCkKK3sKKwlycS0+cnFfbGFzdF9yYW4gPSBwLT5sYXN0X3JhbiA9IHJxLT5j bG9jazsKKwlycS0+cnFfcG9saWN5ID0gcC0+cG9saWN5OworCXJxLT5ycV9wcmlvID0gcC0+cHJp bzsKKwlpZiAocCAhPSBycS0+aWRsZSkKKwkJcnEtPnJxX3J1bm5pbmcgPSB0cnVlOworCWVsc2UK KwkJcnEtPnJxX3J1bm5pbmcgPSBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcmVzZXRfcnFfdGFz ayhzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcnEtPnJxX3BvbGlj eSA9IHAtPnBvbGljeTsKKwlycS0+cnFfcHJpbyA9IHAtPnByaW87Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCBvcGVyYXRlX2Jsa19uZWVkc19mbHVzaF9wbHVnKHN0cnVjdCB0YXNrX3N0cnVjdCAq cCkKK3sKKwlncnFfdW5sb2NrX2lycSgpOworCXNjaGVkX3ByZWVtcHRfZW5hYmxlX25vX3Jlc2No ZWQoKTsKKwlibGtfc2NoZWR1bGVfZmx1c2hfcGx1ZyhwKTsKK30KKworc3RhdGljIGlubGluZSB2 b2lkIHRhc2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwg c3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQoreworCS8qCisJICogRG9uJ3Qgc3RpY2sgdGFza3Mg d2hlbiBhIHJlYWwgdGltZSB0YXNrIGlzIGdvaW5nIHRvIHJ1biBhcworCSAqIHRoZXkgbWF5IGxp dGVyYWxseSBnZXQgc3R1Y2suCisJICovCisJaWYgKHJ0X3Rhc2sobmV4dCkpCisJCXVuc3RpY2tf dGFzayhycSwgcHJldik7CisJc2V0X3JxX3Rhc2socnEsIG5leHQpOworCWdycS5ucl9zd2l0Y2hl cysrOworCXByZXYtPm9uX2NwdSA9IGZhbHNlOworCW5leHQtPm9uX2NwdSA9IHRydWU7CisJcnEt PmN1cnIgPSBuZXh0OworCisJLyoKKwkgKiBUaGUgY29udGV4dCBzd2l0Y2ggaGF2ZSBmbGlwcGVk IHRoZSBzdGFjayBmcm9tIHVuZGVyIHVzCisJICogYW5kIHJlc3RvcmVkIHRoZSBsb2NhbCB2YXJp YWJsZXMgd2hpY2ggd2VyZSBzYXZlZCB3aGVuCisJICogdGhpcyB0YXNrIGNhbGxlZCBzY2hlZHVs ZSgpIGluIHRoZSBwYXN0LiBwcmV2ID09IGN1cnJlbnQKKwkgKiBpcyBzdGlsbCBjb3JyZWN0LCBi dXQgaXQgY2FuIGJlIG1vdmVkIHRvIGFub3RoZXIgY3B1L3JxLgorCSAqLworCWNvbnRleHRfc3dp dGNoKHJxLCBwcmV2LCBuZXh0KTsgLyogdW5sb2NrcyB0aGUgZ3JxICovCit9CisKKworLyoKKyAq IE1vdmUgYSB0YXNrIG9mZiB0aGUgZ2xvYmFsIHF1ZXVlIGFuZCB0YWtlIGl0IHRvIGEgY3B1IGZv ciBpdCB3aWxsCisgKiBiZWNvbWUgdGhlIHJ1bm5pbmcgdGFzay4KKyAqLworc3RhdGljIGlubGlu ZSB2b2lkIHRha2VfdGFzayhpbnQgY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc2V0 X3Rhc2tfY3B1KHAsIGNwdSk7CisJZGVxdWV1ZV90YXNrKHApOworCWNsZWFyX3N0aWNreShwKTsK KwlkZWNfcW5yKCk7Cit9CisKKy8qCisgKiBQdXQgdGhlIGRlc2NoZWR1bGluZyB0YXNrIGJhY2sg dG8gZ3JxLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgcHV0X3ByZXZfdGFzayhzdHJ1Y3QgcnEg KnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGJvb2wgZGVhY3RpdmF0ZSwgYm9vbCBwcmVlbXB0 KQoreworCWlmKGRlYWN0aXZhdGUpCisJCWRlYWN0aXZhdGVfdGFzayhwKTsKKwllbHNlIHsKKwkJ aW5jX3FucigpOworCQlpZihwcmVlbXB0KQorCQkJZW5xdWV1ZV90YXNrX2hlYWQocCk7CisJCWVs c2UKKwkJCWVucXVldWVfdGFzayhwKTsKKwl9Cit9CisKKy8qCisgKiBUYXNrIHBpY2tpbmcgZm9y IG5leHQgdGltZSB0byBydW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgc3RydWN0Cit0YXNrX3N0cnVj dCAqZ2V0X3J1bm5hYmxlX3Rhc2soc3RydWN0IHJxICpycSwgaW50IGNwdSwgc3RydWN0IHRhc2tf c3RydWN0ICppZGxlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqZWR0ID0gTlVMTDsKKwl1bnNp Z25lZCBsb25nIGlkeCA9IC0xOworCisJZG8geworCQlzdHJ1Y3QgbGlzdF9oZWFkICpxdWV1ZTsK KwkJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCisJCWlkeCA9IGdldF9wcmlvX2JpdChncnEucHJp b19iaXRtYXAsICsraWR4KTsKKwkJaWYgKGlkeCA+PSBQUklPX0xJTUlUKQorCQkJcmV0dXJuIGlk bGU7CisJCXF1ZXVlID0gZ3JxLnF1ZXVlICsgaWR4OworCisJCWxpc3RfZm9yX2VhY2hfZW50cnko cCwgcXVldWUsIHJ1bl9saXN0KSB7CisJCQkvKiBNYWtlIHN1cmUgY3B1IGFmZmluaXR5IGlzIG9r ICovCisJCQlpZiAobmVlZHNfb3RoZXJfY3B1KHAsIGNwdSkpCisJCQkJY29udGludWU7CisJCQll ZHQgPSBwOworCQkJZ290byBvdXRfdGFrZTsKKwkJfQorCX0gd2hpbGUgKCFlZHQpOworCitvdXRf dGFrZToKKwl0YWtlX3Rhc2soY3B1LCBlZHQpOworCXJldHVybiBlZHQ7Cit9CisKKyNkZWZpbmUg U0NIRURfUkVTQ0hFRCAtMQorCisvKgorICogc2NoZWR1bGUoKSBpcyB0aGUgbWFpbiBzY2hlZHVs ZXIgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3NsZWVwX29uX3dxKGlu dCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlpbnQgZGVhY3RpdmF0ZTsKKwlkZWFj dGl2YXRlID0gMDsKKwlpZiAocC0+c3RhdGUgJiYgIShwcmVlbXB0X2NvdW50KCkgJiBQUkVFTVBU X0FDVElWRSkpIHsKKwkJaWYgKHVubGlrZWx5KHNpZ25hbF9wZW5kaW5nX3N0YXRlKHAtPnN0YXRl LCBwKSkpIHsKKwkJCXAtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCQl9IGVsc2UgeworCQkJZGVh Y3RpdmF0ZSA9IDE7CisJCQkvKgorCQkJICogSWYgYSB3b3JrZXIgaXMgZ29pbmcgdG8gc2xlZXAs IG5vdGlmeSBhbmQKKwkJCSAqIGFzayB3b3JrcXVldWUgd2hldGhlciBpdCB3YW50cyB0byB3YWtl IHVwIGEKKwkJCSAqIHRhc2sgdG8gbWFpbnRhaW4gY29uY3VycmVuY3kuICBJZiBzbywgd2FrZQor CQkJICogdXAgdGhlIHRhc2suCisJCQkgKi8KKwkJCWlmIChwLT5mbGFncyAmIFBGX1dRX1dPUktF UikgeworCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdG9fd2FrZXVwOworCisJCQkJdG9fd2FrZXVw ID0gd3Ffd29ya2VyX3NsZWVwaW5nKHAsIGNwdSk7CisJCQkJaWYgKHRvX3dha2V1cCkgeworCQkJ CQkvKiBUaGlzIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCBkb2VzICovCisJCQkJCWlmICh1bmxpa2Vs eSh0b193YWtldXAgPT0gcCkpCisJCQkJCQlkZWFjdGl2YXRlID0gMDsKKwkJCQkJZWxzZQorCQkJ CQkJdHJ5X3RvX3dha2VfdXBfbG9jYWwodG9fd2FrZXVwKTsKKwkJCQl9CisJCQl9CisKKwkJCS8q CisJCQkgKiBJZiB3ZSBhcmUgZ29pbmcgdG8gc2xlZXAgYW5kIHdlIGhhdmUgcGx1Z2dlZCBJTyBx dWV1ZWQsIG1ha2UKKwkJCSAqIHN1cmUgdG8gc3VibWl0IGl0IHRvIGF2b2lkIGRlYWRsb2Nrcy4K KwkJCSAqLworCQkJaWYgKHVubGlrZWx5KGRlYWN0aXZhdGUgJiYgYmxrX25lZWRzX2ZsdXNoX3Bs dWcocCkpKSB7CisJCQkJb3BlcmF0ZV9ibGtfbmVlZHNfZmx1c2hfcGx1ZyhwKTsKKwkJCQlkZWFj dGl2YXRlID0gU0NIRURfUkVTQ0hFRDsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KK291 dDoKKwlyZXR1cm4gZGVhY3RpdmF0ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZG9fc2NoZWR1 bGUodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsICpuZXh0LCAqaWRsZTsKKwlz dHJ1Y3QgcnEgKnJxOworCWludCBjcHU7CisJaW50IGRlYWN0aXZhdGU7CisKKwljcHUgPSBzbXBf cHJvY2Vzc29yX2lkKCk7CisJcnEgPSBjcHVfcnEoY3B1KTsKKwlyY3Vfbm90ZV9jb250ZXh0X3N3 aXRjaChjcHUpOworCXByZXYgPSBycS0+Y3VycjsKKworCWdycV9sb2NrX2lycSgpOworCisJaWYo KGRlYWN0aXZhdGUgPSBjaGVja19zbGVlcF9vbl93cShjcHUsIHByZXYpKSA9PSBTQ0hFRF9SRVND SEVEKSB7CisJCWdvdG8gb3V0OworCX0KKworCWNsZWFyX3Rza19uZWVkX3Jlc2NoZWQocHJldik7 CisKKwlpZGxlID0gcnEtPmlkbGU7CisJaWYgKGlkbGUgIT0gcHJldikgeworCQlib29sIHByZWVt cHQgPSBjaGVja190aW1lc2xpY2VfZW5kKHJxLCBwcmV2KTsKKworCQkvKiBUYXNrIGNoYW5nZWQg YWZmaW5pdHkgb2ZmIHRoaXMgQ1BVICovCisJCWlmIChuZWVkc19vdGhlcl9jcHUocHJldiwgY3B1 KSkKKwkJCXJlc2NoZWRfc3VpdGFibGVfaWRsZShwcmV2KTsKKwkJZWxzZSBpZiAoIWRlYWN0aXZh dGUpIHsKKwkJCWlmICghcXVldWVkX25vdHJ1bm5pbmcoKSkgeworCQkJCS8qCisJCQkJKiBSZXJ1 biB0aGUgcHJldiB0YXNrIGFnYWluLgorCQkJCSovCisJCQkJc2V0X3JxX3Rhc2socnEsIHByZXYp OworCQkJCWdycV91bmxvY2tfaXJxKCk7CisJCQkJZ290byBvdXQ7CisJCQl9IGVsc2UKKwkJCQlz d2FwX3N0aWNreShycSwgY3B1LCBwcmV2KTsKKwkJfQorCisJCXB1dF9wcmV2X3Rhc2socnEsIHBy ZXYsIGRlYWN0aXZhdGUsIHByZWVtcHQpOworCX0KKworCWlmICh1bmxpa2VseSghcXVldWVkX25v dHJ1bm5pbmcoKSkpIHsKKwkJLyoKKwkJICogVGhpcyBDUFUgaXMgbm93IHRydWx5IGlkbGUgYXMg b3Bwb3NlZCB0byB3aGVuIGlkbGUgaXMKKwkJICogc2NoZWR1bGVkIGFzIGEgaGlnaCBwcmlvcml0 eSB0YXNrIGluIGl0cyBvd24gcmlnaHQuCisJCSAqLworCQluZXh0ID0gaWRsZTsKKwkJc2V0X2Nw dWlkbGVfbWFwKGNwdSk7CisJfSBlbHNlIHsKKwkJbmV4dCA9IGdldF9ydW5uYWJsZV90YXNrKHJx LCBjcHUsIGlkbGUpOworCX0KKworCWlmIChsaWtlbHkocHJldiAhPSBuZXh0KSkgeworCQlwcmV2 LT5udmNzdysrOworCQlncnEubnJfc3dpdGNoZXMrKzsKKworCQl0YXNrX3N3aXRjaChycSwgcHJl diwgbmV4dCk7CisJCWlkbGUgPSBycS0+aWRsZTsKKwl9IGVsc2UKKwkJZ3JxX3VubG9ja19pcnEo KTsKKworb3V0OgorCXJldHVybiBkZWFjdGl2YXRlOworfQorCithc21saW5rYWdlIHZvaWQgX19z Y2hlZCBzY2hlZHVsZSh2b2lkKQoreworcmVzY2hlZHVsZToKKwkJcHJlZW1wdF9kaXNhYmxlKCk7 CisJCQorCQlpZihkb19zY2hlZHVsZSgpID09IFNDSEVEX1JFU0NIRUQpCisJCQlnb3RvIHJlc2No ZWR1bGU7CisJCQorCQlzY2hlZF9wcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJCWlmKHVu bGlrZWx5KG5lZWRfcmVzY2hlZCgpKSkKKwkJCWdvdG8gcmVzY2hlZHVsZTsKK30KK0VYUE9SVF9T WU1CT0woc2NoZWR1bGUpOworCisvKioKKyAqIHNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQgLSBj YWxsZWQgd2l0aCBwcmVlbXB0aW9uIGRpc2FibGVkCisgKgorICogUmV0dXJucyB3aXRoIHByZWVt cHRpb24gZGlzYWJsZWQuIE5vdGU6IHByZWVtcHRfY291bnQgbXVzdCBiZSAxCisgKi8KK3ZvaWQg X19zY2hlZCBzY2hlZHVsZV9wcmVlbXB0X2Rpc2FibGVkKHZvaWQpCit7CisJc2NoZWRfcHJlZW1w dF9lbmFibGVfbm9fcmVzY2hlZCgpOworCXNjaGVkdWxlKCk7CisJcHJlZW1wdF9kaXNhYmxlKCk7 Cit9CisKKyNpZmRlZiBDT05GSUdfTVVURVhfU1BJTl9PTl9PV05FUgorCitzdGF0aWMgaW5saW5l IGJvb2wgb3duZXJfcnVubmluZyhzdHJ1Y3QgbXV0ZXggKmxvY2ssIHN0cnVjdCB0YXNrX3N0cnVj dCAqb3duZXIpCit7CisJaWYgKGxvY2stPm93bmVyICE9IG93bmVyKQorCQlyZXR1cm4gZmFsc2U7 CisKKwkvKgorCSAqIEVuc3VyZSB3ZSBlbWl0IHRoZSBvd25lci0+b25fY3B1LCBkZXJlZmVyZW5j ZSBfYWZ0ZXJfIGNoZWNraW5nCisJICogbG9jay0+b3duZXIgc3RpbGwgbWF0Y2hlcyBvd25lciwg aWYgdGhhdCBmYWlscywgb3duZXIgbWlnaHQKKwkgKiBwb2ludCB0byBmcmVlKClkIG1lbW9yeSwg aWYgaXQgc3RpbGwgbWF0Y2hlcywgdGhlIHJjdV9yZWFkX2xvY2soKQorCSAqIGVuc3VyZXMgdGhl IG1lbW9yeSBzdGF5cyB2YWxpZC4KKwkgKi8KKwliYXJyaWVyKCk7CisKKwlyZXR1cm4gb3duZXIt Pm9uX2NwdTsKK30KKworLyoKKyAqIExvb2sgb3V0ISAib3duZXIiIGlzIGFuIGVudGlyZWx5IHNw ZWN1bGF0aXZlIHBvaW50ZXIKKyAqIGFjY2VzcyBhbmQgbm90IHJlbGlhYmxlLgorICovCitpbnQg bXV0ZXhfc3Bpbl9vbl9vd25lcihzdHJ1Y3QgbXV0ZXggKmxvY2ssIHN0cnVjdCB0YXNrX3N0cnVj dCAqb3duZXIpCit7CisJcmN1X3JlYWRfbG9jaygpOworCXdoaWxlIChvd25lcl9ydW5uaW5nKGxv Y2ssIG93bmVyKSkgeworCQlpZiAobmVlZF9yZXNjaGVkKCkpCisJCQlicmVhazsKKworCQlhcmNo X211dGV4X2NwdV9yZWxheCgpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCS8qCisJICog V2UgYnJlYWsgb3V0IHRoZSBsb29wIGFib3ZlIG9uIG5lZWRfcmVzY2hlZCgpIGFuZCB3aGVuIHRo ZQorCSAqIG93bmVyIGNoYW5nZWQsIHdoaWNoIGlzIGEgc2lnbiBmb3IgaGVhdnkgY29udGVudGlv bi4gUmV0dXJuCisJICogc3VjY2VzcyBvbmx5IHdoZW4gbG9jay0+b3duZXIgaXMgTlVMTC4KKwkg Ki8KKwlyZXR1cm4gbG9jay0+b3duZXIgPT0gTlVMTDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09O RklHX1BSRUVNUFQKKy8qCisgKiB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCB0byBzY2hlZHVsZSgp IGZyb20gaW4ta2VybmVsIHByZWVtcHRpb24KKyAqIG9mZiBvZiBwcmVlbXB0X2VuYWJsZS4gS2Vy bmVsIHByZWVtcHRpb25zIG9mZiByZXR1cm4gZnJvbSBpbnRlcnJ1cHQKKyAqIG9jY3VyIHRoZXJl IGFuZCBjYWxsIHNjaGVkdWxlIGRpcmVjdGx5LgorICovCithc21saW5rYWdlIHZvaWQgX19zY2hl ZCBub3RyYWNlIHByZWVtcHRfc2NoZWR1bGUodm9pZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkX2luZm8g KnRpID0gY3VycmVudF90aHJlYWRfaW5mbygpOworCisJLyoKKwkgKiBJZiB0aGVyZSBpcyBhIG5v bi16ZXJvIHByZWVtcHRfY291bnQgb3IgaW50ZXJydXB0cyBhcmUgZGlzYWJsZWQsCisJICogd2Ug ZG8gbm90IHdhbnQgdG8gcHJlZW1wdCB0aGUgY3VycmVudCB0YXNrLiBKdXN0IHJldHVybi4uCisJ ICovCisJaWYgKGxpa2VseSh0aS0+cHJlZW1wdF9jb3VudCB8fCBpcnFzX2Rpc2FibGVkKCkpKQor CQlyZXR1cm47CisKKwlkbyB7CisJCWFkZF9wcmVlbXB0X2NvdW50X25vdHJhY2UoUFJFRU1QVF9B Q1RJVkUpOworCQlzY2hlZHVsZSgpOworCQlzdWJfcHJlZW1wdF9jb3VudF9ub3RyYWNlKFBSRUVN UFRfQUNUSVZFKTsKKworCQkvKgorCQkgKiBDaGVjayBhZ2FpbiBpbiBjYXNlIHdlIG1pc3NlZCBh IHByZWVtcHRpb24gb3Bwb3J0dW5pdHkKKwkJICogYmV0d2VlbiBzY2hlZHVsZSBhbmQgbm93Lgor CQkgKi8KKwkJYmFycmllcigpOworCX0gd2hpbGUgKG5lZWRfcmVzY2hlZCgpKTsKK30KK0VYUE9S VF9TWU1CT0wocHJlZW1wdF9zY2hlZHVsZSk7CisKKy8qCisgKiB0aGlzIGlzIHRoZSBlbnRyeSBw b2ludCB0byBzY2hlZHVsZSgpIGZyb20ga2VybmVsIHByZWVtcHRpb24KKyAqIG9mZiBvZiBpcnEg Y29udGV4dC4KKyAqIE5vdGUsIHRoYXQgdGhpcyBpcyBjYWxsZWQgYW5kIHJldHVybiB3aXRoIGly cXMgZGlzYWJsZWQuIFRoaXMgd2lsbAorICogcHJvdGVjdCB1cyBhZ2FpbnN0IHJlY3Vyc2l2ZSBj YWxsaW5nIGZyb20gaXJxLgorICovCithc21saW5rYWdlIHZvaWQgX19zY2hlZCBwcmVlbXB0X3Nj aGVkdWxlX2lycSh2b2lkKQoreworCXN0cnVjdCB0aHJlYWRfaW5mbyAqdGkgPSBjdXJyZW50X3Ro cmVhZF9pbmZvKCk7CisKKwkvKiBDYXRjaCBjYWxsZXJzIHdoaWNoIG5lZWQgdG8gYmUgZml4ZWQg Ki8KKwlCVUdfT04odGktPnByZWVtcHRfY291bnQgfHwgIWlycXNfZGlzYWJsZWQoKSk7CisKKwlk byB7CisJCWFkZF9wcmVlbXB0X2NvdW50KFBSRUVNUFRfQUNUSVZFKTsKKwkJbG9jYWxfaXJxX2Vu YWJsZSgpOworCQlzY2hlZHVsZSgpOworCQlsb2NhbF9pcnFfZGlzYWJsZSgpOworCQlzdWJfcHJl ZW1wdF9jb3VudChQUkVFTVBUX0FDVElWRSk7CisKKwkJLyoKKwkJICogQ2hlY2sgYWdhaW4gaW4g Y2FzZSB3ZSBtaXNzZWQgYSBwcmVlbXB0aW9uIG9wcG9ydHVuaXR5CisJCSAqIGJldHdlZW4gc2No ZWR1bGUgYW5kIG5vdy4KKwkJICovCisJCWJhcnJpZXIoKTsKKwl9IHdoaWxlIChuZWVkX3Jlc2No ZWQoKSk7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUFJFRU1QVCAqLworCitpbnQgZGVmYXVsdF93 YWtlX2Z1bmN0aW9uKHdhaXRfcXVldWVfdCAqY3VyciwgdW5zaWduZWQgbW9kZSwgaW50IHdha2Vf ZmxhZ3MsCisJCQkgIHZvaWQgKmtleSkKK3sKKwlyZXR1cm4gdHJ5X3RvX3dha2VfdXAoY3Vyci0+ cHJpdmF0ZSwgbW9kZSwgd2FrZV9mbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKGRlZmF1bHRfd2Fr ZV9mdW5jdGlvbik7CisKKy8qCisgKiBUaGUgY29yZSB3YWtldXAgZnVuY3Rpb24uICBOb24tZXhj bHVzaXZlIHdha2V1cHMgKG5yX2V4Y2x1c2l2ZSA9PSAwKSBqdXN0CisgKiB3YWtlIGV2ZXJ5dGhp bmcgdXAuICBJZiBpdCdzIGFuIGV4Y2x1c2l2ZSB3YWtldXAgKG5yX2V4Y2x1c2l2ZSA9PSBzbWFs bCArdmUKKyAqIG51bWJlcikgdGhlbiB3ZSB3YWtlIGFsbCB0aGUgbm9uLWV4Y2x1c2l2ZSB0YXNr cyBhbmQgb25lIGV4Y2x1c2l2ZSB0YXNrLgorICoKKyAqIFRoZXJlIGFyZSBjaXJjdW1zdGFuY2Vz IGluIHdoaWNoIHdlIGNhbiB0cnkgdG8gd2FrZSBhIHRhc2sgd2hpY2ggaGFzIGFscmVhZHkKKyAq IHN0YXJ0ZWQgdG8gcnVuIGJ1dCBpcyBub3QgaW4gc3RhdGUgVEFTS19SVU5OSU5HLiAgdHJ5X3Rv X3dha2VfdXAoKSByZXR1cm5zCisgKiB6ZXJvIGluIHRoaXMgKHJhcmUpIGNhc2UsIGFuZCB3ZSBo YW5kbGUgaXQgYnkgY29udGludWluZyB0byBzY2FuIHRoZSBxdWV1ZS4KKyAqLworc3RhdGljIHZv aWQgX193YWtlX3VwX2NvbW1vbih3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1v ZGUsCisJCQlpbnQgbnJfZXhjbHVzaXZlLCBpbnQgd2FrZV9mbGFncywgdm9pZCAqa2V5KQorewor CXN0cnVjdCBsaXN0X2hlYWQgKnRtcCwgKm5leHQ7CisKKwlsaXN0X2Zvcl9lYWNoX3NhZmUodG1w LCBuZXh0LCAmcS0+dGFza19saXN0KSB7CisJCXdhaXRfcXVldWVfdCAqY3VyciA9IGxpc3RfZW50 cnkodG1wLCB3YWl0X3F1ZXVlX3QsIHRhc2tfbGlzdCk7CisJCXVuc2lnbmVkIGludCBmbGFncyA9 IGN1cnItPmZsYWdzOworCisJCWlmIChjdXJyLT5mdW5jKGN1cnIsIG1vZGUsIHdha2VfZmxhZ3Ms IGtleSkgJiYKKwkJCQkoZmxhZ3MgJiBXUV9GTEFHX0VYQ0xVU0lWRSkgJiYgIS0tbnJfZXhjbHVz aXZlKQorCQkJYnJlYWs7CisJfQorfQorCisvKioKKyAqIF9fd2FrZV91cCAtIHdha2UgdXAgdGhy ZWFkcyBibG9ja2VkIG9uIGEgd2FpdHF1ZXVlLgorICogQHE6IHRoZSB3YWl0cXVldWUKKyAqIEBt b2RlOiB3aGljaCB0aHJlYWRzCisgKiBAbnJfZXhjbHVzaXZlOiBob3cgbWFueSB3YWtlLW9uZSBv ciB3YWtlLW1hbnkgdGhyZWFkcyB0byB3YWtlIHVwCisgKiBAa2V5OiBpcyBkaXJlY3RseSBwYXNz ZWQgdG8gdGhlIHdha2V1cCBmdW5jdGlvbgorICoKKyAqIEl0IG1heSBiZSBhc3N1bWVkIHRoYXQg dGhpcyBmdW5jdGlvbiBpbXBsaWVzIGEgd3JpdGUgbWVtb3J5IGJhcnJpZXIgYmVmb3JlCisgKiBj aGFuZ2luZyB0aGUgdGFzayBzdGF0ZSBpZiBhbmQgb25seSBpZiBhbnkgdGFza3MgYXJlIHdva2Vu IHVwLgorICovCit2b2lkIF9fd2FrZV91cCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQg aW50IG1vZGUsCisJCQlpbnQgbnJfZXhjbHVzaXZlLCB2b2lkICprZXkpCit7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBmbGFncyk7CisJX193 YWtlX3VwX2NvbW1vbihxLCBtb2RlLCBucl9leGNsdXNpdmUsIDAsIGtleSk7CisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTChfX3dha2Vf dXApOworCisvKgorICogU2FtZSBhcyBfX3dha2VfdXAgYnV0IGNhbGxlZCB3aXRoIHRoZSBzcGlu bG9jayBpbiB3YWl0X3F1ZXVlX2hlYWRfdCBoZWxkLgorICovCit2b2lkIF9fd2FrZV91cF9sb2Nr ZWQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBpbnQgbnIpCit7CisJ X193YWtlX3VwX2NvbW1vbihxLCBtb2RlLCBuciwgMCwgTlVMTCk7Cit9CitFWFBPUlRfU1lNQk9M X0dQTChfX3dha2VfdXBfbG9ja2VkKTsKKwordm9pZCBfX3dha2VfdXBfbG9ja2VkX2tleSh3YWl0 X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1vZGUsIHZvaWQgKmtleSkKK3sKKwlfX3dh a2VfdXBfY29tbW9uKHEsIG1vZGUsIDEsIDAsIGtleSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChf X3dha2VfdXBfbG9ja2VkX2tleSk7CisKKy8qKgorICogX193YWtlX3VwX3N5bmNfa2V5IC0gd2Fr ZSB1cCB0aHJlYWRzIGJsb2NrZWQgb24gYSB3YWl0cXVldWUuCisgKiBAcTogdGhlIHdhaXRxdWV1 ZQorICogQG1vZGU6IHdoaWNoIHRocmVhZHMKKyAqIEBucl9leGNsdXNpdmU6IGhvdyBtYW55IHdh a2Utb25lIG9yIHdha2UtbWFueSB0aHJlYWRzIHRvIHdha2UgdXAKKyAqIEBrZXk6IG9wYXF1ZSB2 YWx1ZSB0byBiZSBwYXNzZWQgdG8gd2FrZXVwIHRhcmdldHMKKyAqCisgKiBUaGUgc3luYyB3YWtl dXAgZGlmZmVycyB0aGF0IHRoZSB3YWtlciBrbm93cyB0aGF0IGl0IHdpbGwgc2NoZWR1bGUKKyAq IGF3YXkgc29vbiwgc28gd2hpbGUgdGhlIHRhcmdldCB0aHJlYWQgd2lsbCBiZSB3b2tlbiB1cCwg aXQgd2lsbCBub3QKKyAqIGJlIG1pZ3JhdGVkIHRvIGFub3RoZXIgQ1BVIC0gaWUuIHRoZSB0d28g dGhyZWFkcyBhcmUgJ3N5bmNocm9uaXNlZCcKKyAqIHdpdGggZWFjaCBvdGhlci4gVGhpcyBjYW4g cHJldmVudCBuZWVkbGVzcyBib3VuY2luZyBiZXR3ZWVuIENQVXMuCisgKgorICogT24gVVAgaXQg Y2FuIHByZXZlbnQgZXh0cmEgcHJlZW1wdGlvbi4KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0 aGF0IHRoaXMgZnVuY3Rpb24gaW1wbGllcyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQor ICogY2hhbmdpbmcgdGhlIHRhc2sgc3RhdGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3 b2tlbiB1cC4KKyAqLwordm9pZCBfX3dha2VfdXBfc3luY19rZXkod2FpdF9xdWV1ZV9oZWFkX3Qg KnEsIHVuc2lnbmVkIGludCBtb2RlLAorCQkJaW50IG5yX2V4Y2x1c2l2ZSwgdm9pZCAqa2V5KQor eworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdha2VfZmxhZ3MgPSBXRl9TWU5DOworCisJ aWYgKHVubGlrZWx5KCFxKSkKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KCFucl9leGNsdXNp dmUpKQorCQl3YWtlX2ZsYWdzID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBm bGFncyk7CisJX193YWtlX3VwX2NvbW1vbihxLCBtb2RlLCBucl9leGNsdXNpdmUsIHdha2VfZmxh Z3MsIGtleSk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOworfQor RVhQT1JUX1NZTUJPTF9HUEwoX193YWtlX3VwX3N5bmNfa2V5KTsKKworLyoqCisgKiBfX3dha2Vf dXBfc3luYyAtIHdha2UgdXAgdGhyZWFkcyBibG9ja2VkIG9uIGEgd2FpdHF1ZXVlLgorICogQHE6 IHRoZSB3YWl0cXVldWUKKyAqIEBtb2RlOiB3aGljaCB0aHJlYWRzCisgKiBAbnJfZXhjbHVzaXZl OiBob3cgbWFueSB3YWtlLW9uZSBvciB3YWtlLW1hbnkgdGhyZWFkcyB0byB3YWtlIHVwCisgKgor ICogVGhlIHN5bmMgd2FrZXVwIGRpZmZlcnMgdGhhdCB0aGUgd2FrZXIga25vd3MgdGhhdCBpdCB3 aWxsIHNjaGVkdWxlCisgKiBhd2F5IHNvb24sIHNvIHdoaWxlIHRoZSB0YXJnZXQgdGhyZWFkIHdp bGwgYmUgd29rZW4gdXAsIGl0IHdpbGwgbm90CisgKiBiZSBtaWdyYXRlZCB0byBhbm90aGVyIENQ VSAtIGllLiB0aGUgdHdvIHRocmVhZHMgYXJlICdzeW5jaHJvbmlzZWQnCisgKiB3aXRoIGVhY2gg b3RoZXIuIFRoaXMgY2FuIHByZXZlbnQgbmVlZGxlc3MgYm91bmNpbmcgYmV0d2VlbiBDUFVzLgor ICoKKyAqIE9uIFVQIGl0IGNhbiBwcmV2ZW50IGV4dHJhIHByZWVtcHRpb24uCisgKi8KK3ZvaWQg X193YWtlX3VwX3N5bmMod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBp bnQgbnJfZXhjbHVzaXZlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHN5bmMgPSAx OworCisJaWYgKHVubGlrZWx5KCFxKSkKKwkJcmV0dXJuOworCisJaWYgKHVubGlrZWx5KCFucl9l eGNsdXNpdmUpKQorCQlzeW5jID0gMDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZxLT5sb2NrLCBm bGFncyk7CisJX193YWtlX3VwX2NvbW1vbihxLCBtb2RlLCBucl9leGNsdXNpdmUsIHN5bmMsIE5V TEwpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnEtPmxvY2ssIGZsYWdzKTsKK30KK0VYUE9S VF9TWU1CT0xfR1BMKF9fd2FrZV91cF9zeW5jKTsJLyogRm9yIGludGVybmFsIHVzZSBvbmx5ICov CisKKy8qKgorICogY29tcGxldGU6IC0gc2lnbmFscyBhIHNpbmdsZSB0aHJlYWQgd2FpdGluZyBv biB0aGlzIGNvbXBsZXRpb24KKyAqIEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGlj dWxhciBjb21wbGV0aW9uCisgKgorICogVGhpcyB3aWxsIHdha2UgdXAgYSBzaW5nbGUgdGhyZWFk IHdhaXRpbmcgb24gdGhpcyBjb21wbGV0aW9uLiBUaHJlYWRzIHdpbGwgYmUKKyAqIGF3YWtlbmVk IGluIHRoZSBzYW1lIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBxdWV1ZWQuCisgKgorICogU2Vl IGFsc28gY29tcGxldGVfYWxsKCksIHdhaXRfZm9yX2NvbXBsZXRpb24oKSBhbmQgcmVsYXRlZCBy b3V0aW5lcy4KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaW1w bGllcyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQorICogY2hhbmdpbmcgdGhlIHRhc2sg c3RhdGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3b2tlbiB1cC4KKyAqLwordm9pZCBj b21wbGV0ZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJngtPndhaXQubG9jaywgZmxhZ3MpOworCXgtPmRvbmUrKzsK KwlfX3dha2VfdXBfY29tbW9uKCZ4LT53YWl0LCBUQVNLX05PUk1BTCwgMSwgMCwgTlVMTCk7CisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeC0+d2FpdC5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRf U1lNQk9MKGNvbXBsZXRlKTsKKworLyoqCisgKiBjb21wbGV0ZV9hbGw6IC0gc2lnbmFscyBhbGwg dGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgY29tcGxldGlvbgorICogQHg6ICBob2xkcyB0aGUgc3Rh dGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqCisgKiBUaGlzIHdpbGwgd2FrZSB1 cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uIGV2ZW50 LgorICoKKyAqIEl0IG1heSBiZSBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpbXBsaWVzIGEg d3JpdGUgbWVtb3J5IGJhcnJpZXIgYmVmb3JlCisgKiBjaGFuZ2luZyB0aGUgdGFzayBzdGF0ZSBp ZiBhbmQgb25seSBpZiBhbnkgdGFza3MgYXJlIHdva2VuIHVwLgorICovCit2b2lkIGNvbXBsZXRl X2FsbChzdHJ1Y3QgY29tcGxldGlvbiAqeCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ c3Bpbl9sb2NrX2lycXNhdmUoJngtPndhaXQubG9jaywgZmxhZ3MpOworCXgtPmRvbmUgKz0gVUlO VF9NQVgvMjsKKwlfX3dha2VfdXBfY29tbW9uKCZ4LT53YWl0LCBUQVNLX05PUk1BTCwgMCwgMCwg TlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeC0+d2FpdC5sb2NrLCBmbGFncyk7Cit9 CitFWFBPUlRfU1lNQk9MKGNvbXBsZXRlX2FsbCk7CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBfX3Nj aGVkCitkb193YWl0X2Zvcl9jb21tb24oc3RydWN0IGNvbXBsZXRpb24gKngsIGxvbmcgdGltZW91 dCwgaW50IHN0YXRlKQoreworCWlmICgheC0+ZG9uZSkgeworCQlERUNMQVJFX1dBSVRRVUVVRSh3 YWl0LCBjdXJyZW50KTsKKworCQlfX2FkZF93YWl0X3F1ZXVlX3RhaWxfZXhjbHVzaXZlKCZ4LT53 YWl0LCAmd2FpdCk7CisJCWRvIHsKKwkJCWlmIChzaWduYWxfcGVuZGluZ19zdGF0ZShzdGF0ZSwg Y3VycmVudCkpIHsKKwkJCQl0aW1lb3V0ID0gLUVSRVNUQVJUU1lTOworCQkJCWJyZWFrOworCQkJ fQorCQkJX19zZXRfY3VycmVudF9zdGF0ZShzdGF0ZSk7CisJCQlzcGluX3VubG9ja19pcnEoJngt PndhaXQubG9jayk7CisJCQl0aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwkJ CXNwaW5fbG9ja19pcnEoJngtPndhaXQubG9jayk7CisJCX0gd2hpbGUgKCF4LT5kb25lICYmIHRp bWVvdXQpOworCQlfX3JlbW92ZV93YWl0X3F1ZXVlKCZ4LT53YWl0LCAmd2FpdCk7CisJCWlmICgh eC0+ZG9uZSkKKwkJCXJldHVybiB0aW1lb3V0OworCX0KKwl4LT5kb25lLS07CisJcmV0dXJuIHRp bWVvdXQgPzogMTsKK30KKworc3RhdGljIGxvbmcgX19zY2hlZAord2FpdF9mb3JfY29tbW9uKHN0 cnVjdCBjb21wbGV0aW9uICp4LCBsb25nIHRpbWVvdXQsIGludCBzdGF0ZSkKK3sKKwltaWdodF9z bGVlcCgpOworCisJc3Bpbl9sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKKwl0aW1lb3V0ID0gZG9f d2FpdF9mb3JfY29tbW9uKHgsIHRpbWVvdXQsIHN0YXRlKTsKKwlzcGluX3VubG9ja19pcnEoJngt PndhaXQubG9jayk7CisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKKy8qKgorICogd2FpdF9mb3JfY29t cGxldGlvbjogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sKKyAqIEB4OiAgaG9sZHMg dGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKgorICogVGhpcyB3YWl0 cyB0byBiZSBzaWduYWxlZCBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2suIEl0IGlz IE5PVAorICogaW50ZXJydXB0aWJsZSBhbmQgdGhlcmUgaXMgbm8gdGltZW91dC4KKyAqCisgKiBT ZWUgYWxzbyBzaW1pbGFyIHJvdXRpbmVzIChpLmUuIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91 dCgpKSB3aXRoIHRpbWVvdXQKKyAqIGFuZCBpbnRlcnJ1cHQgY2FwYWJpbGl0eS4gQWxzbyBzZWUg Y29tcGxldGUoKS4KKyAqLwordm9pZCBfX3NjaGVkIHdhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0 IGNvbXBsZXRpb24gKngpCit7CisJd2FpdF9mb3JfY29tbW9uKHgsIE1BWF9TQ0hFRFVMRV9USU1F T1VULCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CitFWFBPUlRfU1lNQk9MKHdhaXRfZm9yX2Nv bXBsZXRpb24pOworCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dDogLSB3YWl0 cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sgKHcvdGltZW91dCkKKyAqIEB4OiAgaG9sZHMgdGhl IHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKiBAdGltZW91dDogIHRpbWVv dXQgdmFsdWUgaW4gamlmZmllcworICoKKyAqIFRoaXMgd2FpdHMgZm9yIGVpdGhlciBhIGNvbXBs ZXRpb24gb2YgYSBzcGVjaWZpYyB0YXNrIHRvIGJlIHNpZ25hbGVkIG9yIGZvciBhCisgKiBzcGVj aWZpZWQgdGltZW91dCB0byBleHBpcmUuIFRoZSB0aW1lb3V0IGlzIGluIGppZmZpZXMuIEl0IGlz IG5vdAorICogaW50ZXJydXB0aWJsZS4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIDAgaWYg dGltZWQgb3V0LCBhbmQgcG9zaXRpdmUgKGF0IGxlYXN0IDEsIG9yIG51bWJlciBvZgorICogamlm ZmllcyBsZWZ0IHRpbGwgdGltZW91dCkgaWYgY29tcGxldGVkLgorICovCit1bnNpZ25lZCBsb25n IF9fc2NoZWQKK3dhaXRfZm9yX2NvbXBsZXRpb25fdGltZW91dChzdHJ1Y3QgY29tcGxldGlvbiAq eCwgdW5zaWduZWQgbG9uZyB0aW1lb3V0KQoreworCXJldHVybiB3YWl0X2Zvcl9jb21tb24oeCwg dGltZW91dCwgVEFTS19VTklOVEVSUlVQVElCTEUpOworfQorRVhQT1JUX1NZTUJPTCh3YWl0X2Zv cl9jb21wbGV0aW9uX3RpbWVvdXQpOworCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25faW50 ZXJydXB0aWJsZTogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sgKHcvaW50cikKKyAq IEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKgor ICogVGhpcyB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2ln bmFsZWQuIEl0IGlzCisgKiBpbnRlcnJ1cHRpYmxlLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUg aXMgLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkLCAwIGlmIGNvbXBsZXRlZC4KKyAqLworaW50 IF9fc2NoZWQgd2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1cHRpYmxlKHN0cnVjdCBjb21wbGV0 aW9uICp4KQoreworCWxvbmcgdCA9IHdhaXRfZm9yX2NvbW1vbih4LCBNQVhfU0NIRURVTEVfVElN RU9VVCwgVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlpZiAodCA9PSAtRVJFU1RBUlRTWVMpCisJCXJl dHVybiB0OworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTCh3YWl0X2Zvcl9jb21wbGV0aW9u X2ludGVycnVwdGlibGUpOworCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25faW50ZXJydXB0 aWJsZV90aW1lb3V0OiAtIHdhaXRzIGZvciBjb21wbGV0aW9uICh3Lyh0byxpbnRyKSkKKyAqIEB4 OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKiBAdGlt ZW91dDogIHRpbWVvdXQgdmFsdWUgaW4gamlmZmllcworICoKKyAqIFRoaXMgd2FpdHMgZm9yIGVp dGhlciBhIGNvbXBsZXRpb24gb2YgYSBzcGVjaWZpYyB0YXNrIHRvIGJlIHNpZ25hbGVkIG9yIGZv ciBhCisgKiBzcGVjaWZpZWQgdGltZW91dCB0byBleHBpcmUuIEl0IGlzIGludGVycnVwdGlibGUu IFRoZSB0aW1lb3V0IGlzIGluIGppZmZpZXMuCisgKgorICogVGhlIHJldHVybiB2YWx1ZSBpcyAt RVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQsIDAgaWYgdGltZWQgb3V0LAorICogcG9zaXRpdmUg KGF0IGxlYXN0IDEsIG9yIG51bWJlciBvZiBqaWZmaWVzIGxlZnQgdGlsbCB0aW1lb3V0KSBpZiBj b21wbGV0ZWQuCisgKi8KK2xvbmcgX19zY2hlZAord2FpdF9mb3JfY29tcGxldGlvbl9pbnRlcnJ1 cHRpYmxlX3RpbWVvdXQoc3RydWN0IGNvbXBsZXRpb24gKngsCisJCQkJCSAgdW5zaWduZWQgbG9u ZyB0aW1lb3V0KQoreworCXJldHVybiB3YWl0X2Zvcl9jb21tb24oeCwgdGltZW91dCwgVEFTS19J TlRFUlJVUFRJQkxFKTsKK30KK0VYUE9SVF9TWU1CT0wod2FpdF9mb3JfY29tcGxldGlvbl9pbnRl cnJ1cHRpYmxlX3RpbWVvdXQpOworCisvKioKKyAqIHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFi bGU6IC0gd2FpdHMgZm9yIGNvbXBsZXRpb24gb2YgYSB0YXNrIChraWxsYWJsZSkKKyAqIEB4OiAg aG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uCisgKgorICogVGhp cyB3YWl0cyB0byBiZSBzaWduYWxlZCBmb3IgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2su IEl0IGNhbiBiZQorICogaW50ZXJydXB0ZWQgYnkgYSBraWxsIHNpZ25hbC4KKyAqCisgKiBUaGUg cmV0dXJuIHZhbHVlIGlzIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCwgMCBpZiB0aW1lZCBv dXQsCisgKiBwb3NpdGl2ZSAoYXQgbGVhc3QgMSwgb3IgbnVtYmVyIG9mIGppZmZpZXMgbGVmdCB0 aWxsIHRpbWVvdXQpIGlmIGNvbXBsZXRlZC4KKyAqLworaW50IF9fc2NoZWQgd2FpdF9mb3JfY29t cGxldGlvbl9raWxsYWJsZShzdHJ1Y3QgY29tcGxldGlvbiAqeCkKK3sKKwlsb25nIHQgPSB3YWl0 X2Zvcl9jb21tb24oeCwgTUFYX1NDSEVEVUxFX1RJTUVPVVQsIFRBU0tfS0lMTEFCTEUpOworCWlm ICh0ID09IC1FUkVTVEFSVFNZUykKKwkJcmV0dXJuIHQ7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRf U1lNQk9MKHdhaXRfZm9yX2NvbXBsZXRpb25fa2lsbGFibGUpOworCisvKioKKyAqIHdhaXRfZm9y X2NvbXBsZXRpb25fa2lsbGFibGVfdGltZW91dDogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBh IHRhc2sgKHcvKHRvLGtpbGxhYmxlKSkKKyAqIEB4OiAgaG9sZHMgdGhlIHN0YXRlIG9mIHRoaXMg cGFydGljdWxhciBjb21wbGV0aW9uCisgKiBAdGltZW91dDogIHRpbWVvdXQgdmFsdWUgaW4gamlm ZmllcworICoKKyAqIFRoaXMgd2FpdHMgZm9yIGVpdGhlciBhIGNvbXBsZXRpb24gb2YgYSBzcGVj aWZpYyB0YXNrIHRvIGJlCisgKiBzaWduYWxlZCBvciBmb3IgYSBzcGVjaWZpZWQgdGltZW91dCB0 byBleHBpcmUuIEl0IGNhbiBiZQorICogaW50ZXJydXB0ZWQgYnkgYSBraWxsIHNpZ25hbC4gVGhl IHRpbWVvdXQgaXMgaW4gamlmZmllcy4KKyAqLworbG9uZyBfX3NjaGVkCit3YWl0X2Zvcl9jb21w bGV0aW9uX2tpbGxhYmxlX3RpbWVvdXQoc3RydWN0IGNvbXBsZXRpb24gKngsCisJCQkJCSB1bnNp Z25lZCBsb25nIHRpbWVvdXQpCit7CisJcmV0dXJuIHdhaXRfZm9yX2NvbW1vbih4LCB0aW1lb3V0 LCBUQVNLX0tJTExBQkxFKTsKK30KK0VYUE9SVF9TWU1CT0wod2FpdF9mb3JfY29tcGxldGlvbl9r aWxsYWJsZV90aW1lb3V0KTsKKworLyoqCisgKgl0cnlfd2FpdF9mb3JfY29tcGxldGlvbiAtIHRy eSB0byBkZWNyZW1lbnQgYSBjb21wbGV0aW9uIHdpdGhvdXQgYmxvY2tpbmcKKyAqCUB4Ogljb21w bGV0aW9uIHN0cnVjdHVyZQorICoKKyAqCVJldHVybnM6IDAgaWYgYSBkZWNyZW1lbnQgY2Fubm90 IGJlIGRvbmUgd2l0aG91dCBibG9ja2luZworICoJCSAxIGlmIGEgZGVjcmVtZW50IHN1Y2NlZWRl ZC4KKyAqCisgKglJZiBhIGNvbXBsZXRpb24gaXMgYmVpbmcgdXNlZCBhcyBhIGNvdW50aW5nIGNv bXBsZXRpb24sCisgKglhdHRlbXB0IHRvIGRlY3JlbWVudCB0aGUgY291bnRlciB3aXRob3V0IGJs b2NraW5nLiBUaGlzCisgKgllbmFibGVzIHVzIHRvIGF2b2lkIHdhaXRpbmcgaWYgdGhlIHJlc291 cmNlIHRoZSBjb21wbGV0aW9uCisgKglpcyBwcm90ZWN0aW5nIGlzIG5vdCBhdmFpbGFibGUuCisg Ki8KK2Jvb2wgdHJ5X3dhaXRfZm9yX2NvbXBsZXRpb24oc3RydWN0IGNvbXBsZXRpb24gKngpCit7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZ4LT53YWl0LmxvY2ssIGZsYWdzKTsKKwlpZiAoIXgtPmRvbmUpCisJCXJldCA9IDA7CisJ ZWxzZQorCQl4LT5kb25lLS07CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeC0+d2FpdC5sb2Nr LCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0wodHJ5X3dhaXRfZm9yX2Nv bXBsZXRpb24pOworCisvKioKKyAqCWNvbXBsZXRpb25fZG9uZSAtIFRlc3QgdG8gc2VlIGlmIGEg Y29tcGxldGlvbiBoYXMgYW55IHdhaXRlcnMKKyAqCUB4Ogljb21wbGV0aW9uIHN0cnVjdHVyZQor ICoKKyAqCVJldHVybnM6IDAgaWYgdGhlcmUgYXJlIHdhaXRlcnMgKHdhaXRfZm9yX2NvbXBsZXRp b24oKSBpbiBwcm9ncmVzcykKKyAqCQkgMSBpZiB0aGVyZSBhcmUgbm8gd2FpdGVycy4KKyAqCisg Ki8KK2Jvb2wgY29tcGxldGlvbl9kb25lKHN0cnVjdCBjb21wbGV0aW9uICp4KQoreworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldCA9IDE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeC0+ d2FpdC5sb2NrLCBmbGFncyk7CisJaWYgKCF4LT5kb25lKQorCQlyZXQgPSAwOworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJngtPndhaXQubG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CitF WFBPUlRfU1lNQk9MKGNvbXBsZXRpb25fZG9uZSk7CisKK3N0YXRpYyBsb25nIF9fc2NoZWQKK3Ns ZWVwX29uX2NvbW1vbih3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgaW50IHN0YXRlLCBsb25nIHRpbWVv dXQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl3YWl0X3F1ZXVlX3Qgd2FpdDsKKworCWlu aXRfd2FpdHF1ZXVlX2VudHJ5KCZ3YWl0LCBjdXJyZW50KTsKKworCV9fc2V0X2N1cnJlbnRfc3Rh dGUoc3RhdGUpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsKKwlfX2Fk ZF93YWl0X3F1ZXVlKHEsICZ3YWl0KTsKKwlzcGluX3VubG9jaygmcS0+bG9jayk7CisJdGltZW91 dCA9IHNjaGVkdWxlX3RpbWVvdXQodGltZW91dCk7CisJc3Bpbl9sb2NrX2lycSgmcS0+bG9jayk7 CisJX19yZW1vdmVfd2FpdF9xdWV1ZShxLCAmd2FpdCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmcS0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHRpbWVvdXQ7Cit9CisKK3ZvaWQgX19zY2hl ZCBpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKHdhaXRfcXVldWVfaGVhZF90ICpxKQoreworCXNsZWVw X29uX2NvbW1vbihxLCBUQVNLX0lOVEVSUlVQVElCTEUsIE1BWF9TQ0hFRFVMRV9USU1FT1VUKTsK K30KK0VYUE9SVF9TWU1CT0woaW50ZXJydXB0aWJsZV9zbGVlcF9vbik7CisKK2xvbmcgX19zY2hl ZAoraW50ZXJydXB0aWJsZV9zbGVlcF9vbl90aW1lb3V0KHdhaXRfcXVldWVfaGVhZF90ICpxLCBs b25nIHRpbWVvdXQpCit7CisJcmV0dXJuIHNsZWVwX29uX2NvbW1vbihxLCBUQVNLX0lOVEVSUlVQ VElCTEUsIHRpbWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChpbnRlcnJ1cHRpYmxlX3NsZWVwX29u X3RpbWVvdXQpOworCit2b2lkIF9fc2NoZWQgc2xlZXBfb24od2FpdF9xdWV1ZV9oZWFkX3QgKnEp Cit7CisJc2xlZXBfb25fY29tbW9uKHEsIFRBU0tfVU5JTlRFUlJVUFRJQkxFLCBNQVhfU0NIRURV TEVfVElNRU9VVCk7Cit9CitFWFBPUlRfU1lNQk9MKHNsZWVwX29uKTsKKworbG9uZyBfX3NjaGVk IHNsZWVwX29uX3RpbWVvdXQod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIGxvbmcgdGltZW91dCkKK3sK KwlyZXR1cm4gc2xlZXBfb25fY29tbW9uKHEsIFRBU0tfVU5JTlRFUlJVUFRJQkxFLCB0aW1lb3V0 KTsKK30KK0VYUE9SVF9TWU1CT0woc2xlZXBfb25fdGltZW91dCk7CisKKyNpZmRlZiBDT05GSUdf UlRfTVVURVhFUworCisvKgorICogcnRfbXV0ZXhfc2V0cHJpbyAtIHNldCB0aGUgY3VycmVudCBw cmlvcml0eSBvZiBhIHRhc2sKKyAqIEBwOiB0YXNrCisgKiBAcHJpbzogcHJpbyB2YWx1ZSAoa2Vy bmVsLWludGVybmFsIGZvcm0pCisgKgorICogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSAnZWZm ZWN0aXZlJyBwcmlvcml0eSBvZiBhIHRhc2suIEl0IGRvZXMKKyAqIG5vdCB0b3VjaCAtPnByaW8g bGlrZSBfX3NldHNjaGVkdWxlcigpLgorICoKKyAqIFVzZWQgYnkgdGhlIHJ0X211dGV4IGNvZGUg dG8gaW1wbGVtZW50IHByaW9yaXR5IGluaGVyaXRhbmNlIGxvZ2ljLgorICovCit2b2lkIHJ0X211 dGV4X3NldHByaW8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgcHJpbykKK3sKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCWludCBxdWV1ZWQsIG9sZHByaW87CisJc3RydWN0IHJxICpycTsKKwor CUJVR19PTihwcmlvIDwgMCB8fCBwcmlvID4gTUFYX1BSSU8pOworCisJcnEgPSB0YXNrX2dycV9s b2NrKHAsICZmbGFncyk7CisKKwl0cmFjZV9zY2hlZF9waV9zZXRwcmlvKHAsIHByaW8pOworCW9s ZHByaW8gPSBwLT5wcmlvOworCXF1ZXVlZCA9IHRhc2tfcXVldWVkKHApOworCXAtPnByaW8gPSBw cmlvOworCWlmICh0YXNrX3J1bm5pbmcocCkgJiYgcHJpbyA+IG9sZHByaW8pCisJCXJlc2NoZWRf dGFzayhwKTsKKwlpZiAocXVldWVkKSB7CisJCXRyeV9wcmVlbXB0KHAsIHJxKTsKKwl9CisKKwl0 YXNrX2dycV91bmxvY2soJmZsYWdzKTsKK30KKworI2VuZGlmCisKK3ZvaWQgc2V0X3VzZXJfbmlj ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGxvbmcgbmljZSkKK3sKKwlpbnQgcXVldWVkLCBuZXdf c3RhdGljLCBvbGRfc3RhdGljOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJc3RydWN0IHJxICpy cTsKKworCWlmIChUQVNLX05JQ0UocCkgPT0gbmljZSB8fCBuaWNlIDwgLTIwIHx8IG5pY2UgPiAx OSkKKwkJcmV0dXJuOworCW5ld19zdGF0aWMgPSBOSUNFX1RPX1BSSU8obmljZSk7CisJLyoKKwkg KiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwsIGlmIGNhbGxlZCBmcm9tIHN5c19zZXRwcmlvcml0eSgp LAorCSAqIHRoZSB0YXNrIG1pZ2h0IGJlIGluIHRoZSBtaWRkbGUgb2Ygc2NoZWR1bGluZyBvbiBh bm90aGVyIENQVS4KKwkgKi8KKwlycSA9IHRpbWVfdGFza19ncnFfbG9jayhwLCAmZmxhZ3MpOwor CS8qCisJICogVGhlIFJUIHByaW9yaXRpZXMgYXJlIHNldCB2aWEgc2NoZWRfc2V0c2NoZWR1bGVy KCksIGJ1dCB3ZSBzdGlsbAorCSAqIGFsbG93IHRoZSAnbm9ybWFsJyBuaWNlIHZhbHVlIHRvIGJl IHNldCAtIGJ1dCBhcyBleHBlY3RlZAorCSAqIGl0IHdvbnQgaGF2ZSBhbnkgZWZmZWN0IG9uIHNj aGVkdWxpbmcgdW50aWwgdGhlIHRhc2sgaXMKKwkgKiBub3QgU0NIRURfTk9STUFML1NDSEVEX0JB VENIOgorCSAqLworCWlmIChoYXNfcnRfcG9saWN5KHApKSB7CisJCXAtPnN0YXRpY19wcmlvID0g bmV3X3N0YXRpYzsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKwlxdWV1ZWQgPSB0YXNrX3F1ZXVl ZChwKTsKKworCW9sZF9zdGF0aWMgPSBwLT5zdGF0aWNfcHJpbzsKKwlwLT5zdGF0aWNfcHJpbyA9 IG5ld19zdGF0aWM7CisJcC0+cHJpbyA9IHAtPnN0YXRpY19wcmlvOworCisJaWYgKHF1ZXVlZCkg eworCQlpZiAobmV3X3N0YXRpYyA8IG9sZF9zdGF0aWMpCisJCQl0cnlfcHJlZW1wdChwLCBycSk7 CisJfSBlbHNlIGlmICh0YXNrX3J1bm5pbmcocCkpIHsKKwkJcmVzZXRfcnFfdGFzayhycSwgcCk7 CisJCWlmIChvbGRfc3RhdGljIDwgbmV3X3N0YXRpYykKKwkJCXJlc2NoZWRfdGFzayhwKTsKKwl9 CitvdXRfdW5sb2NrOgorCXRhc2tfZ3JxX3VubG9jaygmZmxhZ3MpOworfQorRVhQT1JUX1NZTUJP TChzZXRfdXNlcl9uaWNlKTsKKworLyoKKyAqIGNhbl9uaWNlIC0gY2hlY2sgaWYgYSB0YXNrIGNh biByZWR1Y2UgaXRzIG5pY2UgdmFsdWUKKyAqIEBwOiB0YXNrCisgKiBAbmljZTogbmljZSB2YWx1 ZQorICovCitpbnQgY2FuX25pY2UoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBp bnQgbmljZSkKK3sKKwkvKiBjb252ZXJ0IG5pY2UgdmFsdWUgWzE5LC0yMF0gdG8gcmxpbWl0IHN0 eWxlIHZhbHVlIFsxLDQwXSAqLworCWludCBuaWNlX3JsaW0gPSAyMCAtIG5pY2U7CisKKwlyZXR1 cm4gKG5pY2VfcmxpbSA8PSB0YXNrX3JsaW1pdChwLCBSTElNSVRfTklDRSkgfHwKKwkJY2FwYWJs ZShDQVBfU1lTX05JQ0UpKTsKK30KKworI2lmZGVmIF9fQVJDSF9XQU5UX1NZU19OSUNFCisKKy8q CisgKiBzeXNfbmljZSAtIGNoYW5nZSB0aGUgcHJpb3JpdHkgb2YgdGhlIGN1cnJlbnQgcHJvY2Vz cy4KKyAqIEBpbmNyZW1lbnQ6IHByaW9yaXR5IGluY3JlbWVudAorICoKKyAqIHN5c19zZXRwcmlv cml0eSBpcyBhIG1vcmUgZ2VuZXJpYywgYnV0IG11Y2ggc2xvd2VyIGZ1bmN0aW9uIHRoYXQKKyAq IGRvZXMgc2ltaWxhciB0aGluZ3MuCisgKi8KK1NZU0NBTExfREVGSU5FMShuaWNlLCBpbnQsIGlu Y3JlbWVudCkKK3sKKwlsb25nIG5pY2UsIHJldHZhbDsKKworCS8qCisJICogU2V0cHJpb3JpdHkg bWlnaHQgY2hhbmdlIG91ciBwcmlvcml0eSBhdCB0aGUgc2FtZSBtb21lbnQuCisJICogV2UgZG9u J3QgaGF2ZSB0byB3b3JyeS4gQ29uY2VwdHVhbGx5IG9uZSBjYWxsIG9jY3VycyBmaXJzdAorCSAq IGFuZCB3ZSBoYXZlIGEgc2luZ2xlIHdpbm5lci4KKwkgKi8KKwlpZiAoaW5jcmVtZW50IDwgLTQw KQorCQlpbmNyZW1lbnQgPSAtNDA7CisJaWYgKGluY3JlbWVudCA+IDQwKQorCQlpbmNyZW1lbnQg PSA0MDsKKworCW5pY2UgPSBUQVNLX05JQ0UoY3VycmVudCkgKyBpbmNyZW1lbnQ7CisJaWYgKG5p Y2UgPCAtMjApCisJCW5pY2UgPSAtMjA7CisJaWYgKG5pY2UgPiAxOSkKKwkJbmljZSA9IDE5Owor CisJaWYgKGluY3JlbWVudCA8IDAgJiYgIWNhbl9uaWNlKGN1cnJlbnQsIG5pY2UpKQorCQlyZXR1 cm4gLUVQRVJNOworCisJcmV0dmFsID0gc2VjdXJpdHlfdGFza19zZXRuaWNlKGN1cnJlbnQsIG5p Y2UpOworCWlmIChyZXR2YWwpCisJCXJldHVybiByZXR2YWw7CisKKwlzZXRfdXNlcl9uaWNlKGN1 cnJlbnQsIG5pY2UpOworCXJldHVybiAwOworfQorCisjZW5kaWYKKworLyoqCisgKiB0YXNrX3By aW8gLSByZXR1cm4gdGhlIHByaW9yaXR5IHZhbHVlIG9mIGEgZ2l2ZW4gdGFzay4KKyAqIEBwOiB0 aGUgdGFzayBpbiBxdWVzdGlvbi4KKyAqCisgKiBUaGlzIGlzIHRoZSBwcmlvcml0eSB2YWx1ZSBh cyBzZWVuIGJ5IHVzZXJzIGluIC9wcm9jLgorICogUlQgdGFza3MgYXJlIG9mZnNldCBieSAtMTAw LiBOb3JtYWwgdGFza3MgYXJlIGNlbnRlcmVkIGFyb3VuZCAxLgorICovCitpbnQgdGFza19wcmlv KGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+cHJpbyAtIE5PUk1B TF9QUklPOworfQorCisvKioKKyAqIHRhc2tfbmljZSAtIHJldHVybiB0aGUgbmljZSB2YWx1ZSBv ZiBhIGdpdmVuIHRhc2suCisgKiBAcDogdGhlIHRhc2sgaW4gcXVlc3Rpb24uCisgKi8KK2ludCB0 YXNrX25pY2UoY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBUQVNLX05J Q0UocCk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0YXNrX25pY2UpOworCisvKioKKyAqIGlkbGVf Y3B1IC0gaXMgYSBnaXZlbiBjcHUgaWRsZSBjdXJyZW50bHk/CisgKiBAY3B1OiB0aGUgcHJvY2Vz c29yIGluIHF1ZXN0aW9uLgorICovCitpbnQgaWRsZV9jcHUoaW50IGNwdSkKK3sKKwlyZXR1cm4g Y3B1X2N1cnIoY3B1KSA9PSBjcHVfcnEoY3B1KS0+aWRsZTsKK30KKworLyoqCisgKiBpZGxlX3Rh c2sgLSByZXR1cm4gdGhlIGlkbGUgdGFzayBmb3IgYSBnaXZlbiBjcHUuCisgKiBAY3B1OiB0aGUg cHJvY2Vzc29yIGluIHF1ZXN0aW9uLgorICovCitzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGVfdGFz ayhpbnQgY3B1KQoreworCXJldHVybiBjcHVfcnEoY3B1KS0+aWRsZTsKK30KKworLyoqCisgKiBm aW5kX3Byb2Nlc3NfYnlfcGlkIC0gZmluZCBhIHByb2Nlc3Mgd2l0aCBhIG1hdGNoaW5nIFBJRCB2 YWx1ZS4KKyAqIEBwaWQ6IHRoZSBwaWQgaW4gcXVlc3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUg c3RydWN0IHRhc2tfc3RydWN0ICpmaW5kX3Byb2Nlc3NfYnlfcGlkKHBpZF90IHBpZCkKK3sKKwly ZXR1cm4gcGlkID8gZmluZF90YXNrX2J5X3ZwaWQocGlkKSA6IGN1cnJlbnQ7Cit9CisKKy8qIEFj dHVhbGx5IGRvIHByaW9yaXR5IGNoYW5nZTogbXVzdCBob2xkIGdycSBsb2NrLiAqLworc3RhdGlj IHZvaWQKK19fc2V0c2NoZWR1bGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHJxICpy cSwgaW50IHBvbGljeSwgaW50IHByaW8pCit7CisJaW50IG9sZHJ0cHJpbywgb2xkcHJpbzsKKwor CXAtPnBvbGljeSA9IHBvbGljeTsKKwlvbGRydHByaW8gPSBwLT5ydF9wcmlvcml0eTsKKwlwLT5y dF9wcmlvcml0eSA9IHByaW87CisJb2xkcHJpbyA9IHAtPnByaW87CisJLyogd2UgYXJlIGhvbGRp bmcgcC0+cGlfbG9jayBhbHJlYWR5ICovCisJcC0+cHJpbyA9IHJ0X211dGV4X2dldHByaW8ocCk7 CisJaWYgKHRhc2tfcnVubmluZyhwKSkgeworCQlyZXNldF9ycV90YXNrKHJxLCBwKTsKKwkJLyog UmVzY2hlZCBvbmx5IGlmIHdlIG1pZ2h0IG5vdyBiZSBwcmVlbXB0ZWQgKi8KKwkJaWYgKHAtPnBy aW8gPiBvbGRwcmlvIHx8IHAtPnJ0X3ByaW9yaXR5ID4gb2xkcnRwcmlvKQorCQkJcmVzY2hlZF90 YXNrKHApOworCX0KK30KKworLyoKKyAqIGNoZWNrIHRoZSB0YXJnZXQgcHJvY2VzcyBoYXMgYSBV SUQgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHByb2Nlc3MncworICovCitzdGF0aWMgYm9vbCBj aGVja19zYW1lX293bmVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwljb25zdCBzdHJ1Y3Qg Y3JlZCAqY3JlZCA9IGN1cnJlbnRfY3JlZCgpLCAqcGNyZWQ7CisJYm9vbCBtYXRjaDsKKworCXJj dV9yZWFkX2xvY2soKTsKKwlwY3JlZCA9IF9fdGFza19jcmVkKHApOworCWlmIChjcmVkLT51c2Vy LT51c2VyX25zID09IHBjcmVkLT51c2VyLT51c2VyX25zKQorCQltYXRjaCA9IChjcmVkLT5ldWlk ID09IHBjcmVkLT5ldWlkIHx8CisJCQkgY3JlZC0+ZXVpZCA9PSBwY3JlZC0+dWlkKTsKKwllbHNl CisJCW1hdGNoID0gZmFsc2U7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIG1hdGNoOwor fQorCitzdGF0aWMgaW50IF9fc2NoZWRfc2V0c2NoZWR1bGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAq cCwgaW50IHBvbGljeSwKKwkJCQljb25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtLCBib29s IHVzZXIpCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIHplcm9fcGFyYW0gPSB7IC5zY2hlZF9wcmlv cml0eSA9IDAgfTsKKwlpbnQgcXVldWVkLCByZXR2YWwsIG9sZHBvbGljeSA9IC0xOworCXVuc2ln bmVkIGxvbmcgZmxhZ3MsIHJsaW1fcnRwcmlvID0gMDsKKwlpbnQgcmVzZXRfb25fZm9yazsKKwlz dHJ1Y3QgcnEgKnJxOworCisJLyogbWF5IGdyYWIgbm9uLWlycSBwcm90ZWN0ZWQgc3Bpbl9sb2Nr cyAqLworCUJVR19PTihpbl9pbnRlcnJ1cHQoKSk7CisKKwlpZiAoaXNfcnRfcG9saWN5KHBvbGlj eSkgJiYgIWNhcGFibGUoQ0FQX1NZU19OSUNFKSkgeworCQl1bnNpZ25lZCBsb25nIGxmbGFnczsK KworCQlpZiAoIWxvY2tfdGFza19zaWdoYW5kKHAsICZsZmxhZ3MpKQorCQkJcmV0dXJuIC1FU1JD SDsKKwkJcmxpbV9ydHByaW8gPSB0YXNrX3JsaW1pdChwLCBSTElNSVRfUlRQUklPKTsKKwkJdW5s b2NrX3Rhc2tfc2lnaGFuZChwLCAmbGZsYWdzKTsKKwkJaWYgKHJsaW1fcnRwcmlvKQorCQkJZ290 byByZWNoZWNrOworCQlwYXJhbSA9ICZ6ZXJvX3BhcmFtOworCX0KK3JlY2hlY2s6CisJLyogZG91 YmxlIGNoZWNrIHBvbGljeSBvbmNlIHJxIGxvY2sgaGVsZCAqLworCWlmIChwb2xpY3kgPCAwKSB7 CisJCXJlc2V0X29uX2ZvcmsgPSBwLT5zY2hlZF9yZXNldF9vbl9mb3JrOworCQlwb2xpY3kgPSBv bGRwb2xpY3kgPSBwLT5wb2xpY3k7CisJfSBlbHNlIHsKKwkJcmVzZXRfb25fZm9yayA9ICEhKHBv bGljeSAmIFNDSEVEX1JFU0VUX09OX0ZPUkspOworCQlwb2xpY3kgJj0gflNDSEVEX1JFU0VUX09O X0ZPUks7CisKKwkJaWYgKCFTQ0hFRF9SQU5HRShwb2xpY3kpKQorCQkJcmV0dXJuIC1FSU5WQUw7 CisJfQorCisJLyoKKwkgKiBWYWxpZCBwcmlvcml0aWVzIGZvciBTQ0hFRF9GSUZPIGFuZCBTQ0hF RF9SUiBhcmUKKwkgKiAxLi5NQVhfVVNFUl9SVF9QUklPLTEsIHZhbGlkIHByaW9yaXR5IGZvciBT Q0hFRF9OT1JNQUwgYW5kCisJICogU0NIRURfQkFUQ0ggaXMgMC4KKwkgKi8KKwlpZiAocGFyYW0t PnNjaGVkX3ByaW9yaXR5IDwgMCB8fAorCQkocC0+bW0gJiYgcGFyYW0tPnNjaGVkX3ByaW9yaXR5 ID4gTUFYX1VTRVJfUlRfUFJJTyAtIDEpIHx8CisJCSghcC0+bW0gJiYgcGFyYW0tPnNjaGVkX3By aW9yaXR5ID4gTUFYX1JUX1BSSU8gLSAxKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGlzX3J0 X3BvbGljeShwb2xpY3kpICE9IChwYXJhbS0+c2NoZWRfcHJpb3JpdHkgIT0gMCkpCisJCXJldHVy biAtRUlOVkFMOworCisJLyoKKwkgKiBBbGxvdyB1bnByaXZpbGVnZWQgUlQgdGFza3MgdG8gZGVj cmVhc2UgcHJpb3JpdHk6CisJICovCisJaWYgKHVzZXIgJiYgIWNhcGFibGUoQ0FQX1NZU19OSUNF KSkgeworCQlpZiAoaXNfcnRfcG9saWN5KHBvbGljeSkpIHsKKwkJCXVuc2lnbmVkIGxvbmcgcmxp bV9ydHByaW8gPQorCQkJCQl0YXNrX3JsaW1pdChwLCBSTElNSVRfUlRQUklPKTsKKworCQkJLyog Y2FuJ3Qgc2V0L2NoYW5nZSB0aGUgcnQgcG9saWN5ICovCisJCQlpZiAocG9saWN5ICE9IHAtPnBv bGljeSAmJiAhcmxpbV9ydHByaW8pCisJCQkJcmV0dXJuIC1FUEVSTTsKKworCQkJLyogY2FuJ3Qg aW5jcmVhc2UgcHJpb3JpdHkgKi8KKwkJCWlmIChwYXJhbS0+c2NoZWRfcHJpb3JpdHkgPiBwLT5y dF9wcmlvcml0eSAmJgorCQkJCXBhcmFtLT5zY2hlZF9wcmlvcml0eSA+IHJsaW1fcnRwcmlvKQor CQkJCXJldHVybiAtRVBFUk07CisJCX0gZWxzZSB7CisJCQlzd2l0Y2ggKHAtPnBvbGljeSkgewor CQkJCWNhc2UgU0NIRURfQkFUQ0g6CisJCQkJCWlmIChwb2xpY3kgPT0gU0NIRURfQkFUQ0gpCisJ CQkJCQlnb3RvIG91dDsKKwkJCQkJaWYgKHBvbGljeSAhPSBTQ0hFRF9JRExFUFJJTykKKwkJCQkJ CXJldHVybiAtRVBFUk07CisJCQkJCWJyZWFrOworCQkJCWNhc2UgU0NIRURfSURMRVBSSU86CisJ CQkJCWlmIChwb2xpY3kgPT0gU0NIRURfSURMRVBSSU8pCisJCQkJCQlnb3RvIG91dDsKKwkJCQkJ cmV0dXJuIC1FUEVSTTsKKwkJCQlkZWZhdWx0OgorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJ CS8qIGNhbid0IGNoYW5nZSBvdGhlciB1c2VyJ3MgcHJpb3JpdGllcyAqLworCQlpZiAoIWNoZWNr X3NhbWVfb3duZXIocCkpCisJCQlyZXR1cm4gLUVQRVJNOworCisJCS8qIE5vcm1hbCB1c2VycyBz aGFsbCBub3QgcmVzZXQgdGhlIHNjaGVkX3Jlc2V0X29uX2ZvcmsgZmxhZyAqLworCQlpZiAocC0+ c2NoZWRfcmVzZXRfb25fZm9yayAmJiAhcmVzZXRfb25fZm9yaykKKwkJCXJldHVybiAtRVBFUk07 CisJfQorCisJaWYgKHVzZXIpIHsKKwkJcmV0dmFsID0gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVs ZXIocCk7CisJCWlmIChyZXR2YWwpCisJCQlyZXR1cm4gcmV0dmFsOworCX0KKworCS8qCisJICog bWFrZSBzdXJlIG5vIFBJLXdhaXRlcnMgYXJyaXZlIChvciBsZWF2ZSkgd2hpbGUgd2UgYXJlCisJ ICogY2hhbmdpbmcgdGhlIHByaW9yaXR5IG9mIHRoZSB0YXNrOgorCSAqLworCXJhd19zcGluX2xv Y2tfaXJxc2F2ZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCS8qCisJICogVG8gYmUgYWJsZSB0byBj aGFuZ2UgcC0+cG9saWN5IHNhZmVseSwgdGhlIGdydW5xdWV1ZSBsb2NrIG11c3QgYmUKKwkgKiBo ZWxkLgorCSAqLworCXJxID0gX190YXNrX2dycV9sb2NrKHApOworCisJLyoKKwkgKiBDaGFuZ2lu ZyB0aGUgcG9saWN5IG9mIHRoZSBzdG9wIHRocmVhZHMgaXRzIGEgdmVyeSBiYWQgaWRlYQorCSAq LworCWlmIChwID09IHJxLT5zdG9wKSB7CisJCV9fdGFza19ncnFfdW5sb2NrKCk7CisJCXJhd19z cGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUlO VkFMOworCX0KKworCS8qCisJICogSWYgbm90IGNoYW5naW5nIGFueXRoaW5nIHRoZXJlJ3Mgbm8g bmVlZCB0byBwcm9jZWVkIGZ1cnRoZXI6CisJICovCisJaWYgKHVubGlrZWx5KHBvbGljeSA9PSBw LT5wb2xpY3kgJiYgKCFpc19ydF9wb2xpY3kocG9saWN5KSB8fAorCQkJcGFyYW0tPnNjaGVkX3By aW9yaXR5ID09IHAtPnJ0X3ByaW9yaXR5KSkpIHsKKworCQlfX3Rhc2tfZ3JxX3VubG9jaygpOwor CQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCQlyZXR1 cm4gMDsKKwl9CisKKwkvKiByZWNoZWNrIHBvbGljeSBub3cgd2l0aCBycSBsb2NrIGhlbGQgKi8K KwlpZiAodW5saWtlbHkob2xkcG9saWN5ICE9IC0xICYmIG9sZHBvbGljeSAhPSBwLT5wb2xpY3kp KSB7CisJCXBvbGljeSA9IG9sZHBvbGljeSA9IC0xOworCQlfX3Rhc2tfZ3JxX3VubG9jaygpOwor CQlyYXdfc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCQlnb3Rv IHJlY2hlY2s7CisJfQorCXAtPnNjaGVkX3Jlc2V0X29uX2ZvcmsgPSByZXNldF9vbl9mb3JrOwor CisJcXVldWVkID0gdGFza19xdWV1ZWQocCk7CisJX19zZXRzY2hlZHVsZXIocCwgcnEsIHBvbGlj eSwgcGFyYW0tPnNjaGVkX3ByaW9yaXR5KTsKKwlpZiAocXVldWVkKSB7CisJCXRyeV9wcmVlbXB0 KHAsIHJxKTsKKwl9CisJX190YXNrX2dycV91bmxvY2soKTsKKwlyYXdfc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCisJcnRfbXV0ZXhfYWRqdXN0X3BpKHApOwor b3V0OgorCXJldHVybiAwOworfQorCisvKioKKyAqIHNjaGVkX3NldHNjaGVkdWxlciAtIGNoYW5n ZSB0aGUgc2NoZWR1bGluZyBwb2xpY3kgYW5kL29yIFJUIHByaW9yaXR5IG9mIGEgdGhyZWFkLgor ICogQHA6IHRoZSB0YXNrIGluIHF1ZXN0aW9uLgorICogQHBvbGljeTogbmV3IHBvbGljeS4KKyAq IEBwYXJhbTogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5ldyBSVCBwcmlvcml0eS4KKyAqCisg KiBOT1RFIHRoYXQgdGhlIHRhc2sgbWF5IGJlIGFscmVhZHkgZGVhZC4KKyAqLworaW50IHNjaGVk X3NldHNjaGVkdWxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwb2xpY3ksCisJCQkgICBj b25zdCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gKnBhcmFtKQoreworCXJldHVybiBfX3NjaGVkX3NldHNj aGVkdWxlcihwLCBwb2xpY3ksIHBhcmFtLCB0cnVlKTsKK30KKworRVhQT1JUX1NZTUJPTF9HUEwo c2NoZWRfc2V0c2NoZWR1bGVyKTsKKworLyoqCisgKiBzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVj ayAtIGNoYW5nZSB0aGUgc2NoZWR1bGluZyBwb2xpY3kgYW5kL29yIFJUIHByaW9yaXR5IG9mIGEg dGhyZWFkIGZyb20ga2VybmVsc3BhY2UuCisgKiBAcDogdGhlIHRhc2sgaW4gcXVlc3Rpb24uCisg KiBAcG9saWN5OiBuZXcgcG9saWN5LgorICogQHBhcmFtOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0 aGUgbmV3IFJUIHByaW9yaXR5LgorICoKKyAqIEp1c3QgbGlrZSBzY2hlZF9zZXRzY2hlZHVsZXIs IG9ubHkgZG9uJ3QgYm90aGVyIGNoZWNraW5nIGlmIHRoZQorICogY3VycmVudCBjb250ZXh0IGhh cyBwZXJtaXNzaW9uLiAgRm9yIGV4YW1wbGUsIHRoaXMgaXMgbmVlZGVkIGluCisgKiBzdG9wX21h Y2hpbmUoKTogd2UgY3JlYXRlIHRlbXBvcmFyeSBoaWdoIHByaW9yaXR5IHdvcmtlciB0aHJlYWRz LAorICogYnV0IG91ciBjYWxsZXIgbWlnaHQgbm90IGhhdmUgdGhhdCBjYXBhYmlsaXR5LgorICov CitpbnQgc2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBp bnQgcG9saWN5LAorCQkJCSAgIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0pCit7CisJ cmV0dXJuIF9fc2NoZWRfc2V0c2NoZWR1bGVyKHAsIHBvbGljeSwgcGFyYW0sIGZhbHNlKTsKK30K Kworc3RhdGljIGludAorZG9fc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90IHBpZCwgaW50IHBvbGlj eSwgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqcGFyYW0pCit7CisJc3RydWN0IHNjaGVkX3Bh cmFtIGxwYXJhbTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisJaW50IHJldHZhbDsKKworCWlm ICghcGFyYW0gfHwgcGlkIDwgMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGNvcHlfZnJvbV91 c2VyKCZscGFyYW0sIHBhcmFtLCBzaXplb2Yoc3RydWN0IHNjaGVkX3BhcmFtKSkpCisJCXJldHVy biAtRUZBVUxUOworCisJcmN1X3JlYWRfbG9jaygpOworCXJldHZhbCA9IC1FU1JDSDsKKwlwID0g ZmluZF9wcm9jZXNzX2J5X3BpZChwaWQpOworCWlmIChwICE9IE5VTEwpCisJCXJldHZhbCA9IHNj aGVkX3NldHNjaGVkdWxlcihwLCBwb2xpY3ksICZscGFyYW0pOworCXJjdV9yZWFkX3VubG9jaygp OworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoqCisgKiBzeXNfc2NoZWRfc2V0c2NoZWR1bGVy IC0gc2V0L2NoYW5nZSB0aGUgc2NoZWR1bGVyIHBvbGljeSBhbmQgUlQgcHJpb3JpdHkKKyAqIEBw aWQ6IHRoZSBwaWQgaW4gcXVlc3Rpb24uCisgKiBAcG9saWN5OiBuZXcgcG9saWN5LgorICogQHBh cmFtOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmV3IFJUIHByaW9yaXR5LgorICovCithc21s aW5rYWdlIGxvbmcgc3lzX3NjaGVkX3NldHNjaGVkdWxlcihwaWRfdCBwaWQsIGludCBwb2xpY3ks CisJCQkJCSAgIHN0cnVjdCBzY2hlZF9wYXJhbSBfX3VzZXIgKnBhcmFtKQoreworCS8qIG5lZ2F0 aXZlIHZhbHVlcyBmb3IgcG9saWN5IGFyZSBub3QgdmFsaWQgKi8KKwlpZiAocG9saWN5IDwgMCkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gZG9fc2NoZWRfc2V0c2NoZWR1bGVyKHBpZCwg cG9saWN5LCBwYXJhbSk7Cit9CisKKy8qKgorICogc3lzX3NjaGVkX3NldHBhcmFtIC0gc2V0L2No YW5nZSB0aGUgUlQgcHJpb3JpdHkgb2YgYSB0aHJlYWQKKyAqIEBwaWQ6IHRoZSBwaWQgaW4gcXVl c3Rpb24uCisgKiBAcGFyYW06IHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXcgUlQgcHJpb3Jp dHkuCisgKi8KK1NZU0NBTExfREVGSU5FMihzY2hlZF9zZXRwYXJhbSwgcGlkX3QsIHBpZCwgc3Ry dWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqLCBwYXJhbSkKK3sKKwlyZXR1cm4gZG9fc2NoZWRfc2V0 c2NoZWR1bGVyKHBpZCwgLTEsIHBhcmFtKTsKK30KKworLyoqCisgKiBzeXNfc2NoZWRfZ2V0c2No ZWR1bGVyIC0gZ2V0IHRoZSBwb2xpY3kgKHNjaGVkdWxpbmcgY2xhc3MpIG9mIGEgdGhyZWFkCisg KiBAcGlkOiB0aGUgcGlkIGluIHF1ZXN0aW9uLgorICovCitTWVNDQUxMX0RFRklORTEoc2NoZWRf Z2V0c2NoZWR1bGVyLCBwaWRfdCwgcGlkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlp bnQgcmV0dmFsID0gLUVJTlZBTDsKKworCWlmIChwaWQgPCAwKQorCQlnb3RvIG91dF9ub3VubG9j azsKKworCXJldHZhbCA9IC1FU1JDSDsKKwlyY3VfcmVhZF9sb2NrKCk7CisJcCA9IGZpbmRfcHJv Y2Vzc19ieV9waWQocGlkKTsKKwlpZiAocCkgeworCQlyZXR2YWwgPSBzZWN1cml0eV90YXNrX2dl dHNjaGVkdWxlcihwKTsKKwkJaWYgKCFyZXR2YWwpCisJCQlyZXR2YWwgPSBwLT5wb2xpY3k7CisJ fQorCXJjdV9yZWFkX3VubG9jaygpOworCitvdXRfbm91bmxvY2s6CisJcmV0dXJuIHJldHZhbDsK K30KKworLyoqCisgKiBzeXNfc2NoZWRfZ2V0c2NoZWR1bGVyIC0gZ2V0IHRoZSBSVCBwcmlvcml0 eSBvZiBhIHRocmVhZAorICogQHBpZDogdGhlIHBpZCBpbiBxdWVzdGlvbi4KKyAqIEBwYXJhbTog c3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIFJUIHByaW9yaXR5LgorICovCitTWVNDQUxMX0RFRklO RTIoc2NoZWRfZ2V0cGFyYW0sIHBpZF90LCBwaWQsIHN0cnVjdCBzY2hlZF9wYXJhbSBfX3VzZXIg KiwgcGFyYW0pCit7CisJc3RydWN0IHNjaGVkX3BhcmFtIGxwOworCXN0cnVjdCB0YXNrX3N0cnVj dCAqcDsKKwlpbnQgcmV0dmFsID0gLUVJTlZBTDsKKworCWlmICghcGFyYW0gfHwgcGlkIDwgMCkK KwkJZ290byBvdXRfbm91bmxvY2s7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcCA9IGZpbmRfcHJv Y2Vzc19ieV9waWQocGlkKTsKKwlyZXR2YWwgPSAtRVNSQ0g7CisJaWYgKCFwKQorCQlnb3RvIG91 dF91bmxvY2s7CisKKwlyZXR2YWwgPSBzZWN1cml0eV90YXNrX2dldHNjaGVkdWxlcihwKTsKKwlp ZiAocmV0dmFsKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlscC5zY2hlZF9wcmlvcml0eSA9IHAt PnJ0X3ByaW9yaXR5OworCXJjdV9yZWFkX3VubG9jaygpOworCisJLyoKKwkgKiBUaGlzIG9uZSBt aWdodCBzbGVlcCwgd2UgY2Fubm90IGRvIGl0IHdpdGggYSBzcGlubG9jayBoZWxkIC4uLgorCSAq LworCXJldHZhbCA9IGNvcHlfdG9fdXNlcihwYXJhbSwgJmxwLCBzaXplb2YoKnBhcmFtKSkgPyAt RUZBVUxUIDogMDsKKworb3V0X25vdW5sb2NrOgorCXJldHVybiByZXR2YWw7CisKK291dF91bmxv Y2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworbG9uZyBzY2hl ZF9zZXRhZmZpbml0eShwaWRfdCBwaWQsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICppbl9tYXNrKQor eworCWNwdW1hc2tfdmFyX3QgY3B1c19hbGxvd2VkLCBuZXdfbWFzazsKKwlzdHJ1Y3QgdGFza19z dHJ1Y3QgKnA7CisJaW50IHJldHZhbDsKKworCWdldF9vbmxpbmVfY3B1cygpOworCXJjdV9yZWFk X2xvY2soKTsKKworCXAgPSBmaW5kX3Byb2Nlc3NfYnlfcGlkKHBpZCk7CisJaWYgKCFwKSB7CisJ CXJjdV9yZWFkX3VubG9jaygpOworCQlwdXRfb25saW5lX2NwdXMoKTsKKwkJcmV0dXJuIC1FU1JD SDsKKwl9CisKKwkvKiBQcmV2ZW50IHAgZ29pbmcgYXdheSAqLworCWdldF90YXNrX3N0cnVjdChw KTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWlmICghYWxsb2NfY3B1bWFza192YXIoJmNwdXNf YWxsb3dlZCwgR0ZQX0tFUk5FTCkpIHsKKwkJcmV0dmFsID0gLUVOT01FTTsKKwkJZ290byBvdXRf cHV0X3Rhc2s7CisJfQorCWlmICghYWxsb2NfY3B1bWFza192YXIoJm5ld19tYXNrLCBHRlBfS0VS TkVMKSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3RvIG91dF9mcmVlX2NwdXNfYWxsb3dl ZDsKKwl9CisJcmV0dmFsID0gLUVQRVJNOworCWlmICghY2hlY2tfc2FtZV9vd25lcihwKSAmJiAh bnNfY2FwYWJsZSh0YXNrX3VzZXJfbnMocCksIENBUF9TWVNfTklDRSkpCisJCWdvdG8gb3V0X3Vu bG9jazsKKworCXJldHZhbCA9IHNlY3VyaXR5X3Rhc2tfc2V0c2NoZWR1bGVyKHApOworCWlmIChy ZXR2YWwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWNwdXNldF9jcHVzX2FsbG93ZWQocCwgY3B1 c19hbGxvd2VkKTsKKwljcHVtYXNrX2FuZChuZXdfbWFzaywgaW5fbWFzaywgY3B1c19hbGxvd2Vk KTsKK2FnYWluOgorCXJldHZhbCA9IHNldF9jcHVzX2FsbG93ZWRfcHRyKHAsIG5ld19tYXNrKTsK KworCWlmICghcmV0dmFsKSB7CisJCWNwdXNldF9jcHVzX2FsbG93ZWQocCwgY3B1c19hbGxvd2Vk KTsKKwkJaWYgKCFjcHVtYXNrX3N1YnNldChuZXdfbWFzaywgY3B1c19hbGxvd2VkKSkgeworCQkJ LyoKKwkJCSAqIFdlIG11c3QgaGF2ZSByYWNlZCB3aXRoIGEgY29uY3VycmVudCBjcHVzZXQKKwkJ CSAqIHVwZGF0ZS4gSnVzdCByZXNldCB0aGUgY3B1c19hbGxvd2VkIHRvIHRoZQorCQkJICogY3B1 c2V0J3MgY3B1c19hbGxvd2VkCisJCQkgKi8KKwkJCWNwdW1hc2tfY29weShuZXdfbWFzaywgY3B1 c19hbGxvd2VkKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CitvdXRfdW5sb2NrOgorCWZyZWVf Y3B1bWFza192YXIobmV3X21hc2spOworb3V0X2ZyZWVfY3B1c19hbGxvd2VkOgorCWZyZWVfY3B1 bWFza192YXIoY3B1c19hbGxvd2VkKTsKK291dF9wdXRfdGFzazoKKwlwdXRfdGFza19zdHJ1Y3Qo cCk7CisJcHV0X29ubGluZV9jcHVzKCk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGlu dCBnZXRfdXNlcl9jcHVfbWFzayh1bnNpZ25lZCBsb25nIF9fdXNlciAqdXNlcl9tYXNrX3B0ciwg dW5zaWduZWQgbGVuLAorCQkJCSBjcHVtYXNrX3QgKm5ld19tYXNrKQoreworCWlmIChsZW4gPCBz aXplb2YoY3B1bWFza190KSkgeworCQltZW1zZXQobmV3X21hc2ssIDAsIHNpemVvZihjcHVtYXNr X3QpKTsKKwl9IGVsc2UgaWYgKGxlbiA+IHNpemVvZihjcHVtYXNrX3QpKSB7CisJCWxlbiA9IHNp emVvZihjcHVtYXNrX3QpOworCX0KKwlyZXR1cm4gY29weV9mcm9tX3VzZXIobmV3X21hc2ssIHVz ZXJfbWFza19wdHIsIGxlbikgPyAtRUZBVUxUIDogMDsKK30KKworCisvKioKKyAqIHN5c19zY2hl ZF9zZXRhZmZpbml0eSAtIHNldCB0aGUgY3B1IGFmZmluaXR5IG9mIGEgcHJvY2VzcworICogQHBp ZDogcGlkIG9mIHRoZSBwcm9jZXNzCisgKiBAbGVuOiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGJp dG1hc2sgcG9pbnRlZCB0byBieSB1c2VyX21hc2tfcHRyCisgKiBAdXNlcl9tYXNrX3B0cjogdXNl ci1zcGFjZSBwb2ludGVyIHRvIHRoZSBuZXcgY3B1IG1hc2sKKyAqLworU1lTQ0FMTF9ERUZJTkUz KHNjaGVkX3NldGFmZmluaXR5LCBwaWRfdCwgcGlkLCB1bnNpZ25lZCBpbnQsIGxlbiwKKwkJdW5z aWduZWQgbG9uZyBfX3VzZXIgKiwgdXNlcl9tYXNrX3B0cikKK3sKKwljcHVtYXNrX3Zhcl90IG5l d19tYXNrOworCWludCByZXR2YWw7CisKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZuZXdfbWFz aywgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJcmV0dmFsID0gZ2V0X3VzZXJf Y3B1X21hc2sodXNlcl9tYXNrX3B0ciwgbGVuLCBuZXdfbWFzayk7CisJaWYgKHJldHZhbCA9PSAw KQorCQlyZXR2YWwgPSBzY2hlZF9zZXRhZmZpbml0eShwaWQsIG5ld19tYXNrKTsKKwlmcmVlX2Nw dW1hc2tfdmFyKG5ld19tYXNrKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitsb25nIHNjaGVkX2dl dGFmZmluaXR5KHBpZF90IHBpZCwgY3B1bWFza190ICptYXNrKQoreworCXN0cnVjdCB0YXNrX3N0 cnVjdCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXR2YWw7CisKKwlnZXRfb25s aW5lX2NwdXMoKTsKKwlyY3VfcmVhZF9sb2NrKCk7CisKKwlyZXR2YWwgPSAtRVNSQ0g7CisJcCA9 IGZpbmRfcHJvY2Vzc19ieV9waWQocGlkKTsKKwlpZiAoIXApCisJCWdvdG8gb3V0X3VubG9jazsK KworCXJldHZhbCA9IHNlY3VyaXR5X3Rhc2tfZ2V0c2NoZWR1bGVyKHApOworCWlmIChyZXR2YWwp CisJCWdvdG8gb3V0X3VubG9jazsKKworCWdycV9sb2NrX2lycXNhdmUoJmZsYWdzKTsKKwljcHVt YXNrX2FuZChtYXNrLCB0c2tfY3B1c19hbGxvd2VkKHApLCBjcHVfb25saW5lX21hc2spOworCWdy cV91bmxvY2tfaXJxcmVzdG9yZSgmZmxhZ3MpOworCitvdXRfdW5sb2NrOgorCXJjdV9yZWFkX3Vu bG9jaygpOworCXB1dF9vbmxpbmVfY3B1cygpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoq CisgKiBzeXNfc2NoZWRfZ2V0YWZmaW5pdHkgLSBnZXQgdGhlIGNwdSBhZmZpbml0eSBvZiBhIHBy b2Nlc3MKKyAqIEBwaWQ6IHBpZCBvZiB0aGUgcHJvY2VzcworICogQGxlbjogbGVuZ3RoIGluIGJ5 dGVzIG9mIHRoZSBiaXRtYXNrIHBvaW50ZWQgdG8gYnkgdXNlcl9tYXNrX3B0cgorICogQHVzZXJf bWFza19wdHI6IHVzZXItc3BhY2UgcG9pbnRlciB0byBob2xkIHRoZSBjdXJyZW50IGNwdSBtYXNr CisgKi8KK1NZU0NBTExfREVGSU5FMyhzY2hlZF9nZXRhZmZpbml0eSwgcGlkX3QsIHBpZCwgdW5z aWduZWQgaW50LCBsZW4sCisJCXVuc2lnbmVkIGxvbmcgX191c2VyICosIHVzZXJfbWFza19wdHIp Cit7CisJaW50IHJldDsKKwljcHVtYXNrX3Zhcl90IG1hc2s7CisKKwlpZiAoKGxlbiAqIEJJVFNf UEVSX0JZVEUpIDwgbnJfY3B1X2lkcykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKGxlbiAmIChz aXplb2YodW5zaWduZWQgbG9uZyktMSkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFhbGxv Y19jcHVtYXNrX3ZhcigmbWFzaywgR0ZQX0tFUk5FTCkpCisJCXJldHVybiAtRU5PTUVNOworCisJ cmV0ID0gc2NoZWRfZ2V0YWZmaW5pdHkocGlkLCBtYXNrKTsKKwlpZiAocmV0ID09IDApIHsKKwkJ c2l6ZV90IHJldGxlbiA9IG1pbl90KHNpemVfdCwgbGVuLCBjcHVtYXNrX3NpemUoKSk7CisKKwkJ aWYgKGNvcHlfdG9fdXNlcih1c2VyX21hc2tfcHRyLCBtYXNrLCByZXRsZW4pKQorCQkJcmV0ID0g LUVGQVVMVDsKKwkJZWxzZQorCQkJcmV0ID0gcmV0bGVuOworCX0KKwlmcmVlX2NwdW1hc2tfdmFy KG1hc2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzeXNfc2NoZWRfeWllbGQgLSB5 aWVsZCB0aGUgY3VycmVudCBwcm9jZXNzb3IgdG8gb3RoZXIgdGhyZWFkcy4KKyAqCisgKiBUaGlz IGZ1bmN0aW9uIHlpZWxkcyB0aGUgY3VycmVudCBDUFUgdG8gb3RoZXIgdGFza3MuIEl0IGRvZXMg dGhpcyBieQorICogc2NoZWR1bGluZyBhd2F5IHRoZSBjdXJyZW50IHRhc2suIAorICovCitTWVND QUxMX0RFRklORTAoc2NoZWRfeWllbGQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCisJ cCA9IGN1cnJlbnQ7CisJZ3JxX2xvY2tfaXJxKCk7CisJcmVxdWV1ZV90YXNrKHApOworCisJLyoK KwkgKiBTaW5jZSB3ZSBhcmUgZ29pbmcgdG8gY2FsbCBzY2hlZHVsZSgpIGFueXdheSwgdGhlcmUn cworCSAqIG5vIG5lZWQgdG8gcHJlZW1wdCBvciBlbmFibGUgaW50ZXJydXB0czoKKwkgKi8KKwlf X3JlbGVhc2UoZ3JxLmxvY2spOworCXNwaW5fcmVsZWFzZSgmZ3JxLmxvY2suZGVwX21hcCwgMSwg X1RISVNfSVBfKTsKKwlkb19yYXdfc3Bpbl91bmxvY2soJmdycS5sb2NrKTsKKwlzY2hlZF9wcmVl bXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisKKwlzY2hlZHVsZSgpOworCisJcmV0dXJuIDA7Cit9 CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRfcmVzY2hlZCh2b2lkKQoreworCXJldHVybiBu ZWVkX3Jlc2NoZWQoKSAmJiAhKHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfQUNUSVZFKTsKK30K Kworc3RhdGljIHZvaWQgX19jb25kX3Jlc2NoZWQodm9pZCkKK3sKKwkvKiBOT1QgYSByZWFsIGZp eCBidXQgd2lsbCBtYWtlIHZvbHVudGFyeSBwcmVlbXB0IHdvcmsuIOmmrOm5v+OBquS6iyAqLwor CWlmICh1bmxpa2VseShzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX1JVTk5JTkcpKQorCQlyZXR1cm47 CisKKwlhZGRfcHJlZW1wdF9jb3VudChQUkVFTVBUX0FDVElWRSk7CisJc2NoZWR1bGUoKTsKKwlz dWJfcHJlZW1wdF9jb3VudChQUkVFTVBUX0FDVElWRSk7Cit9CisKK2ludCBfX3NjaGVkIF9jb25k X3Jlc2NoZWQodm9pZCkKK3sKKwlpZiAoc2hvdWxkX3Jlc2NoZWQoKSkgeworCQlfX2NvbmRfcmVz Y2hlZCgpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKF9j b25kX3Jlc2NoZWQpOworCisvKgorICogX19jb25kX3Jlc2NoZWRfbG9jaygpIC0gaWYgYSByZXNj aGVkdWxlIGlzIHBlbmRpbmcsIGRyb3AgdGhlIGdpdmVuIGxvY2ssCisgKiBjYWxsIHNjaGVkdWxl LCBhbmQgb24gcmV0dXJuIHJlYWNxdWlyZSB0aGUgbG9jay4KKyAqCisgKiBUaGlzIHdvcmtzIE9L IGJvdGggd2l0aCBhbmQgd2l0aG91dCBDT05GSUdfUFJFRU1QVC4gIFdlIGRvIHN0cmFuZ2UgbG93 LWxldmVsCisgKiBvcGVyYXRpb25zIGhlcmUgdG8gcHJldmVudCBzY2hlZHVsZSgpIGZyb20gYmVp bmcgY2FsbGVkIHR3aWNlIChvbmNlIHZpYQorICogc3Bpbl91bmxvY2soKSwgb25jZSBieSBoYW5k KS4KKyAqLworaW50IF9fY29uZF9yZXNjaGVkX2xvY2soc3BpbmxvY2tfdCAqbG9jaykKK3sKKwlp bnQgcmVzY2hlZCA9IHNob3VsZF9yZXNjaGVkKCk7CisJaW50IHJldCA9IDA7CisKKwlsb2NrZGVw X2Fzc2VydF9oZWxkKGxvY2spOworCisJaWYgKHNwaW5fbmVlZGJyZWFrKGxvY2spIHx8IHJlc2No ZWQpIHsKKwkJc3Bpbl91bmxvY2sobG9jayk7CisJCWlmIChyZXNjaGVkKQorCQkJX19jb25kX3Jl c2NoZWQoKTsKKwkJZWxzZQorCQkJY3B1X3JlbGF4KCk7CisJCXJldCA9IDE7CisJCXNwaW5fbG9j ayhsb2NrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woX19jb25kX3Jlc2No ZWRfbG9jayk7CisKK2ludCBfX3NjaGVkIF9fY29uZF9yZXNjaGVkX3NvZnRpcnEodm9pZCkKK3sK KwlCVUdfT04oIWluX3NvZnRpcnEoKSk7CisKKwlpZiAoc2hvdWxkX3Jlc2NoZWQoKSkgeworCQls b2NhbF9iaF9lbmFibGUoKTsKKwkJX19jb25kX3Jlc2NoZWQoKTsKKwkJbG9jYWxfYmhfZGlzYWJs ZSgpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKF9fY29u ZF9yZXNjaGVkX3NvZnRpcnEpOworCisvKioKKyAqIHlpZWxkIC0geWllbGQgdGhlIGN1cnJlbnQg cHJvY2Vzc29yIHRvIG90aGVyIHRocmVhZHMuCisgKgorICogVGhpcyBpcyBhIHNob3J0Y3V0IGZv ciBrZXJuZWwtc3BhY2UgeWllbGRpbmcgLSBpdCBtYXJrcyB0aGUKKyAqIHRocmVhZCBydW5uYWJs ZSBhbmQgY2FsbHMgc3lzX3NjaGVkX3lpZWxkKCkuCisgKi8KK3ZvaWQgX19zY2hlZCB5aWVsZCh2 b2lkKQoreworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJc3lzX3NjaGVkX3lp ZWxkKCk7Cit9CitFWFBPUlRfU1lNQk9MKHlpZWxkKTsKKworLyoqCisgKiB5aWVsZF90byAtIHlp ZWxkIHRoZSBjdXJyZW50IHByb2Nlc3NvciB0byBhbm90aGVyIHRocmVhZCBpbgorICogeW91ciB0 aHJlYWQgZ3JvdXAsIG9yIGFjY2VsZXJhdGUgdGhhdCB0aHJlYWQgdG93YXJkIHRoZQorICogcHJv Y2Vzc29yIGl0J3Mgb24uCisgKiBAcDogdGFyZ2V0IHRhc2sKKyAqIEBwcmVlbXB0OiB3aGV0aGVy IHRhc2sgcHJlZW1wdGlvbiBpcyBhbGxvd2VkIG9yIG5vdAorICoKKyAqIEl0J3MgdGhlIGNhbGxl cidzIGpvYiB0byBlbnN1cmUgdGhhdCB0aGUgdGFyZ2V0IHRhc2sgc3RydWN0CisgKiBjYW4ndCBn byBhd2F5IG9uIHVzIGJlZm9yZSB3ZSBjYW4gZG8gYW55IGNoZWNrcy4KKyAqCisgKiBSZXR1cm5z IHRydWUgaWYgd2UgaW5kZWVkIGJvb3N0ZWQgdGhlIHRhcmdldCB0YXNrLgorICovCitib29sIF9f c2NoZWQgeWllbGRfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBib29sIHByZWVtcHQpCit7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIHlpZWxkZWQgPSAwOworCXN0cnVjdCBycSAqcnE7 CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyOworCisJcnEgPSB0aGlzX3JxKCk7CisJZ3JxX2xv Y2tfaXJxc2F2ZSgmZmxhZ3MpOworCWlmICh0YXNrX3J1bm5pbmcocCkgfHwgcC0+c3RhdGUpCisJ CWdvdG8gb3V0X3VubG9jazsKKwl5aWVsZGVkID0gMTsKKwljdXJyID0gcnEtPmN1cnI7CisJcC0+ dGltZV9zbGljZSArPSBjdXJyLT50aW1lX3NsaWNlOworCWN1cnItPnRpbWVfc2xpY2UgPSAwOwor CWlmIChwLT50aW1lX3NsaWNlID4gdGltZXNsaWNlKCkpCisJCXAtPnRpbWVfc2xpY2UgPSB0aW1l c2xpY2UoKTsKKwlzZXRfdHNrX25lZWRfcmVzY2hlZChjdXJyKTsKK291dF91bmxvY2s6CisJZ3Jx X3VubG9ja19pcnFyZXN0b3JlKCZmbGFncyk7CisKKwlpZiAoeWllbGRlZCkKKwkJc2NoZWR1bGUo KTsKKwlyZXR1cm4geWllbGRlZDsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHlpZWxkX3RvKTsKKwor LyoKKyAqIFRoaXMgdGFzayBpcyBhYm91dCB0byBnbyB0byBzbGVlcCBvbiBJTy4gIEluY3JlbWVu dCBycS0+bnJfaW93YWl0IHNvCisgKiB0aGF0IHByb2Nlc3MgYWNjb3VudGluZyBrbm93cyB0aGF0 IHRoaXMgaXMgYSB0YXNrIGluIElPIHdhaXQgc3RhdGUuCisgKgorICogQnV0IGRvbid0IGRvIHRo YXQgaWYgaXQgaXMgYSBkZWxpYmVyYXRlLCB0aHJvdHRsaW5nIElPIHdhaXQgKHRoaXMgdGFzawor ICogaGFzIHNldCBpdHMgYmFja2luZ19kZXZfaW5mbzogdGhlIHF1ZXVlIGFnYWluc3Qgd2hpY2gg aXQgc2hvdWxkIHRocm90dGxlKQorICovCit2b2lkIF9fc2NoZWQgaW9fc2NoZWR1bGUodm9pZCkK K3sKKwlzdHJ1Y3QgcnEgKnJxID0gcmF3X3JxKCk7CisKKwlkZWxheWFjY3RfYmxraW9fc3RhcnQo KTsKKwlhdG9taWNfaW5jKCZycS0+bnJfaW93YWl0KTsKKwlibGtfZmx1c2hfcGx1ZyhjdXJyZW50 KTsKKwljdXJyZW50LT5pbl9pb3dhaXQgPSAxOworCXNjaGVkdWxlKCk7CisJY3VycmVudC0+aW5f aW93YWl0ID0gMDsKKwlhdG9taWNfZGVjKCZycS0+bnJfaW93YWl0KTsKKwlkZWxheWFjY3RfYmxr aW9fZW5kKCk7Cit9CitFWFBPUlRfU1lNQk9MKGlvX3NjaGVkdWxlKTsKKworbG9uZyBfX3NjaGVk IGlvX3NjaGVkdWxlX3RpbWVvdXQobG9uZyB0aW1lb3V0KQoreworCXN0cnVjdCBycSAqcnEgPSBy YXdfcnEoKTsKKwlsb25nIHJldDsKKworCWRlbGF5YWNjdF9ibGtpb19zdGFydCgpOworCWF0b21p Y19pbmMoJnJxLT5ucl9pb3dhaXQpOworCWJsa19mbHVzaF9wbHVnKGN1cnJlbnQpOworCWN1cnJl bnQtPmluX2lvd2FpdCA9IDE7CisJcmV0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwlj dXJyZW50LT5pbl9pb3dhaXQgPSAwOworCWF0b21pY19kZWMoJnJxLT5ucl9pb3dhaXQpOworCWRl bGF5YWNjdF9ibGtpb19lbmQoKTsKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHN5c19zY2hl ZF9nZXRfcHJpb3JpdHlfbWF4IC0gcmV0dXJuIG1heGltdW0gUlQgcHJpb3JpdHkuCisgKiBAcG9s aWN5OiBzY2hlZHVsaW5nIGNsYXNzLgorICoKKyAqIHRoaXMgc3lzY2FsbCByZXR1cm5zIHRoZSBt YXhpbXVtIHJ0X3ByaW9yaXR5IHRoYXQgY2FuIGJlIHVzZWQKKyAqIGJ5IGEgZ2l2ZW4gc2NoZWR1 bGluZyBjbGFzcy4KKyAqLworU1lTQ0FMTF9ERUZJTkUxKHNjaGVkX2dldF9wcmlvcml0eV9tYXgs IGludCwgcG9saWN5KQoreworCWludCByZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChwb2xpY3kp IHsKKwljYXNlIFNDSEVEX0ZJRk86CisJY2FzZSBTQ0hFRF9SUjoKKwkJcmV0ID0gTUFYX1VTRVJf UlRfUFJJTy0xOworCQlicmVhazsKKwljYXNlIFNDSEVEX05PUk1BTDoKKwljYXNlIFNDSEVEX0JB VENIOgorCWNhc2UgU0NIRURfSURMRVBSSU86CisJCXJldCA9IDA7CisJCWJyZWFrOworCX0KKwly ZXR1cm4gcmV0OworfQorCisvKioKKyAqIHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWluIC0gcmV0 dXJuIG1pbmltdW0gUlQgcHJpb3JpdHkuCisgKiBAcG9saWN5OiBzY2hlZHVsaW5nIGNsYXNzLgor ICoKKyAqIHRoaXMgc3lzY2FsbCByZXR1cm5zIHRoZSBtaW5pbXVtIHJ0X3ByaW9yaXR5IHRoYXQg Y2FuIGJlIHVzZWQKKyAqIGJ5IGEgZ2l2ZW4gc2NoZWR1bGluZyBjbGFzcy4KKyAqLworU1lTQ0FM TF9ERUZJTkUxKHNjaGVkX2dldF9wcmlvcml0eV9taW4sIGludCwgcG9saWN5KQoreworCWludCBy ZXQgPSAtRUlOVkFMOworCisJc3dpdGNoIChwb2xpY3kpIHsKKwljYXNlIFNDSEVEX0ZJRk86CisJ Y2FzZSBTQ0hFRF9SUjoKKwkJcmV0ID0gMTsKKwkJYnJlYWs7CisJY2FzZSBTQ0hFRF9OT1JNQUw6 CisJY2FzZSBTQ0hFRF9CQVRDSDoKKwljYXNlIFNDSEVEX0lETEVQUklPOgorCQlyZXQgPSAwOwor CQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBzeXNfc2NoZWRfcnJfZ2V0 X2ludGVydmFsIC0gcmV0dXJuIHRoZSBkZWZhdWx0IHRpbWVzbGljZSBvZiBhIHByb2Nlc3MuCisg KiBAcGlkOiBwaWQgb2YgdGhlIHByb2Nlc3MuCisgKiBAaW50ZXJ2YWw6IHVzZXJzcGFjZSBwb2lu dGVyIHRvIHRoZSB0aW1lc2xpY2UgdmFsdWUuCisgKgorICogdGhpcyBzeXNjYWxsIHdyaXRlcyB0 aGUgZGVmYXVsdCB0aW1lc2xpY2UgdmFsdWUgb2YgYSBnaXZlbiBwcm9jZXNzCisgKiBpbnRvIHRo ZSB1c2VyLXNwYWNlIHRpbWVzcGVjIGJ1ZmZlci4gQSB2YWx1ZSBvZiAnMCcgbWVhbnMgaW5maW5p dHkuCisgKi8KK1NZU0NBTExfREVGSU5FMihzY2hlZF9ycl9nZXRfaW50ZXJ2YWwsIHBpZF90LCBw aWQsCisJCXN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKiwgaW50ZXJ2YWwpCit7CisJc3RydWN0IHRh c2tfc3RydWN0ICpwOworCXVuc2lnbmVkIGludCB0aW1lX3NsaWNlOworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3QgdGltZXNwZWMgdDsKKworCWlmIChwaWQgPCAw KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHZhbCA9IC1FU1JDSDsKKwlyY3VfcmVhZF9sb2Nr KCk7CisJcCA9IGZpbmRfcHJvY2Vzc19ieV9waWQocGlkKTsKKwlpZiAoIXApCisJCWdvdG8gb3V0 X3VubG9jazsKKworCXJldHZhbCA9IHNlY3VyaXR5X3Rhc2tfZ2V0c2NoZWR1bGVyKHApOworCWlm IChyZXR2YWwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWdycV9sb2NrX2lycXNhdmUoJmZsYWdz KTsKKwl0aW1lX3NsaWNlID0gcC0+cG9saWN5ID09IFNDSEVEX0ZJRk8gPyAwIDogTVNfVE9fTlMo cnJfaW50ZXJ2YWwpOworCWdycV91bmxvY2tfaXJxcmVzdG9yZSgmZmxhZ3MpOworCisJcmN1X3Jl YWRfdW5sb2NrKCk7CisJdCA9IG5zX3RvX3RpbWVzcGVjKHRpbWVfc2xpY2UpOworCXJldHZhbCA9 IGNvcHlfdG9fdXNlcihpbnRlcnZhbCwgJnQsIHNpemVvZih0KSkgPyAtRUZBVUxUIDogMDsKKwly ZXR1cm4gcmV0dmFsOworCitvdXRfdW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVy biByZXR2YWw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIHN0YXRfbmFtW10gPSBUQVNLX1NUQVRF X1RPX0NIQVJfU1RSOworCit2b2lkIHNjaGVkX3Nob3dfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnApCit7CisJdW5zaWduZWQgbG9uZyBmcmVlID0gMDsKKwl1bnNpZ25lZCBzdGF0ZTsKKworCXN0 YXRlID0gcC0+c3RhdGUgPyBfX2ZmcyhwLT5zdGF0ZSkgKyAxIDogMDsKKwlwcmludGsoS0VSTl9J TkZPICIlLTE1LjE1cyAlYyIsIHAtPmNvbW0sCisJCXN0YXRlIDwgc2l6ZW9mKHN0YXRfbmFtKSAt IDEgPyBzdGF0X25hbVtzdGF0ZV0gOiAnPycpOworI2lmIEJJVFNfUEVSX0xPTkcgPT0gMzIKKwlp ZiAoc3RhdGUgPT0gVEFTS19SVU5OSU5HKQorCQlwcmludGsoS0VSTl9DT05UICIgcnVubmluZyAg Iik7CisJZWxzZQorCQlwcmludGsoS0VSTl9DT05UICIgJTA4bHggIiwgdGhyZWFkX3NhdmVkX3Bj KHApKTsKKyNlbHNlCisJaWYgKHN0YXRlID09IFRBU0tfUlVOTklORykKKwkJcHJpbnRrKEtFUk5f Q09OVCAiICBydW5uaW5nIHRhc2sJIik7CisJZWxzZQorCQlwcmludGsoS0VSTl9DT05UICIgJTAx Nmx4ICIsIHRocmVhZF9zYXZlZF9wYyhwKSk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfREVCVUdf U1RBQ0tfVVNBR0UKKwlmcmVlID0gc3RhY2tfbm90X3VzZWQocCk7CisjZW5kaWYKKwlwcmludGso S0VSTl9DT05UICIlNWx1ICU1ZCAlNmQgMHglMDhseFxuIiwgZnJlZSwKKwkJdGFza19waWRfbnIo cCksIHRhc2tfcGlkX25yKHAtPnJlYWxfcGFyZW50KSwKKwkJKHVuc2lnbmVkIGxvbmcpdGFza190 aHJlYWRfaW5mbyhwKS0+ZmxhZ3MpOworCisJc2hvd19zdGFjayhwLCBOVUxMKTsKK30KKwordm9p ZCBzaG93X3N0YXRlX2ZpbHRlcih1bnNpZ25lZCBsb25nIHN0YXRlX2ZpbHRlcikKK3sKKwlzdHJ1 Y3QgdGFza19zdHJ1Y3QgKmcsICpwOworCisjaWYgQklUU19QRVJfTE9ORyA9PSAzMgorCXByaW50 ayhLRVJOX0lORk8KKwkJIiAgdGFzawkJCQlQQyBzdGFjayAgIHBpZCBmYXRoZXJcbiIpOworI2Vs c2UKKwlwcmludGsoS0VSTl9JTkZPCisJCSIgIHRhc2sJCQkJCQlQQyBzdGFjayAgIHBpZCBmYXRo ZXJcbiIpOworI2VuZGlmCisJcmN1X3JlYWRfbG9jaygpOworCWRvX2VhY2hfdGhyZWFkKGcsIHAp IHsKKwkJLyoKKwkJICogcmVzZXQgdGhlIE5NSS10aW1lb3V0LCBsaXN0aW5nIGFsbCBmaWxlcyBv biBhIHNsb3cKKwkJICogY29uc29sZSBtaWdodCB0YWtlIGEgbG90IG9mIHRpbWU6CisJCSAqLwor CQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKKwkJaWYgKCFzdGF0ZV9maWx0ZXIgfHwgKHAtPnN0YXRl ICYgc3RhdGVfZmlsdGVyKSkKKwkJCXNjaGVkX3Nob3dfdGFzayhwKTsKKwl9IHdoaWxlX2VhY2hf dGhyZWFkKGcsIHApOworCisJdG91Y2hfYWxsX3NvZnRsb2NrdXBfd2F0Y2hkb2dzKCk7CisKKwly Y3VfcmVhZF91bmxvY2soKTsKKwkvKgorCSAqIE9ubHkgc2hvdyBsb2NrcyBpZiBhbGwgdGFza3Mg YXJlIGR1bXBlZDoKKwkgKi8KKwlpZiAoIXN0YXRlX2ZpbHRlcikKKwkJZGVidWdfc2hvd19hbGxf bG9ja3MoKTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKK3ZvaWQgZG9fc2V0X2NwdXNfYWxsb3dl ZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpuZXdfbWFzaykK K3sKKwljcHVtYXNrX2NvcHkodHNrX2NwdXNfYWxsb3dlZChwKSwgbmV3X21hc2spOworfQorI2Vu ZGlmCisKKy8qKgorICogaW5pdF9pZGxlIC0gc2V0IHVwIGFuIGlkbGUgdGhyZWFkIGZvciBhIGdp dmVuIENQVQorICogQGlkbGU6IHRhc2sgaW4gcXVlc3Rpb24KKyAqIEBjcHU6IGNwdSB0aGUgaWRs ZSB0YXNrIGJlbG9uZ3MgdG8KKyAqCisgKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IHNl dCB0aGUgaWRsZSB0aHJlYWQncyBORUVEX1JFU0NIRUQKKyAqIGZsYWcsIHRvIG1ha2UgYm9vdGlu ZyBtb3JlIHJvYnVzdC4KKyAqLwordm9pZCBpbml0X2lkbGUoc3RydWN0IHRhc2tfc3RydWN0ICpp ZGxlLCBpbnQgY3B1KQoreworCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCisJdGltZV9ncnFfbG9jayhycSwgJmZsYWdzKTsKKwlpZGxlLT5sYXN0 X3JhbiA9IHJxLT5jbG9jazsKKwlpZGxlLT5zdGF0ZSA9IFRBU0tfUlVOTklORzsKKwkvKiBTZXR0 aW5nIHByaW8gdG8gaWxsZWdhbCB2YWx1ZSBzaG91bGRuJ3QgbWF0dGVyIHdoZW4gbmV2ZXIgcXVl dWVkICovCisJaWRsZS0+cHJpbyA9IFBSSU9fTElNSVQ7CisJaWRsZS0+cG9saWN5ID0gU0NIRURf SURMRTsKKwlzZXRfcnFfdGFzayhycSwgaWRsZSk7CisJZG9fc2V0X2NwdXNfYWxsb3dlZChpZGxl LCAmY3B1bWFza19vZl9jcHUoY3B1KSk7CisJLyogU2lsZW5jZSBQUk9WRV9SQ1UgKi8KKwlyY3Vf cmVhZF9sb2NrKCk7CisJc2V0X3Rhc2tfY3B1KGlkbGUsIGNwdSk7CisJcmN1X3JlYWRfdW5sb2Nr KCk7CisJcnEtPmN1cnIgPSBycS0+aWRsZSA9IGlkbGU7CisJaWRsZS0+b25fY3B1ID0gMTsKKwln cnFfdW5sb2NrX2lycXJlc3RvcmUoJmZsYWdzKTsKKworCS8qIFNldCB0aGUgcHJlZW1wdCBjb3Vu dCBfb3V0c2lkZV8gdGhlIHNwaW5sb2NrcyEgKi8KKwl0YXNrX3RocmVhZF9pbmZvKGlkbGUpLT5w cmVlbXB0X2NvdW50ID0gMDsKKworCWZ0cmFjZV9ncmFwaF9pbml0X2lkbGVfdGFzayhpZGxlLCBj cHUpOworI2lmIGRlZmluZWQoQ09ORklHX1NNUCkKKwlzcHJpbnRmKGlkbGUtPmNvbW0sICIlcy8l ZCIsIElOSVRfVEFTS19DT01NLCBjcHUpOworI2VuZGlmCit9CisKKyNpZmRlZiBDT05GSUdfU01Q CisjaWZkZWYgQ09ORklHX05PX0haCit2b2lkIHNlbGVjdF9ub2h6X2xvYWRfYmFsYW5jZXIoaW50 IHN0b3BfdGljaykKK3sKK30KKwordm9pZCBzZXRfY3B1X3NkX3N0YXRlX2lkbGUodm9pZCkge30K KyNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9NQykgfHwgZGVmaW5lZChDT05GSUdfU0NIRURfU01U KQorLyoqCisgKiBsb3dlc3RfZmxhZ19kb21haW4gLSBSZXR1cm4gbG93ZXN0IHNjaGVkX2RvbWFp biBjb250YWluaW5nIGZsYWcuCisgKiBAY3B1OglUaGUgY3B1IHdob3NlIGxvd2VzdCBsZXZlbCBv ZiBzY2hlZCBkb21haW4gaXMgdG8KKyAqCQliZSByZXR1cm5lZC4KKyAqIEBmbGFnOglUaGUgZmxh ZyB0byBjaGVjayBmb3IgdGhlIGxvd2VzdCBzY2hlZF9kb21haW4KKyAqCQlmb3IgdGhlIGdpdmVu IGNwdS4KKyAqCisgKiBSZXR1cm5zIHRoZSBsb3dlc3Qgc2NoZWRfZG9tYWluIG9mIGEgY3B1IHdo aWNoIGNvbnRhaW5zIHRoZSBnaXZlbiBmbGFnLgorICovCitzdGF0aWMgaW5saW5lIHN0cnVjdCBz Y2hlZF9kb21haW4gKmxvd2VzdF9mbGFnX2RvbWFpbihpbnQgY3B1LCBpbnQgZmxhZykKK3sKKwlz dHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKworCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKQorCQlp ZiAoc2QgJiYgKHNkLT5mbGFncyAmIGZsYWcpKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gc2Q7Cit9 CisKKy8qKgorICogZm9yX2VhY2hfZmxhZ19kb21haW4gLSBJdGVyYXRlcyBvdmVyIHNjaGVkX2Rv bWFpbnMgY29udGFpbmluZyB0aGUgZmxhZy4KKyAqIEBjcHU6CVRoZSBjcHUgd2hvc2UgZG9tYWlu cyB3ZSdyZSBpdGVyYXRpbmcgb3Zlci4KKyAqIEBzZDoJCXZhcmlhYmxlIGhvbGRpbmcgdGhlIHZh bHVlIG9mIHRoZSBwb3dlcl9zYXZpbmdzX3NkCisgKgkJZm9yIGNwdS4KKyAqIEBmbGFnOglUaGUg ZmxhZyB0byBmaWx0ZXIgdGhlIHNjaGVkX2RvbWFpbnMgdG8gYmUgaXRlcmF0ZWQuCisgKgorICog SXRlcmF0ZXMgb3ZlciBhbGwgdGhlIHNjaGVkdWxlciBkb21haW5zIGZvciBhIGdpdmVuIGNwdSB0 aGF0IGhhcyB0aGUgJ2ZsYWcnCisgKiBzZXQsIHN0YXJ0aW5nIGZyb20gdGhlIGxvd2VzdCBzY2hl ZF9kb21haW4gdG8gdGhlIGhpZ2hlc3QuCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfZmxhZ19kb21h aW4oY3B1LCBzZCwgZmxhZykgXAorCWZvciAoc2QgPSBsb3dlc3RfZmxhZ19kb21haW4oY3B1LCBm bGFnKTsgXAorCQkoc2QgJiYgKHNkLT5mbGFncyAmIGZsYWcpKTsgc2QgPSBzZC0+cGFyZW50KQor CisjZW5kaWYgLyogIChDT05GSUdfU0NIRURfTUMgfHwgQ09ORklHX1NDSEVEX1NNVCkgKi8KKwor c3RhdGljIGlubGluZSB2b2lkIHJlc2NoZWRfY3B1KGludCBjcHUpCit7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKworCWdycV9sb2NrX2lycXNhdmUoJmZsYWdzKTsKKwlyZXNjaGVkX3Rhc2soY3B1 X2N1cnIoY3B1KSk7CisJZ3JxX3VubG9ja19pcnFyZXN0b3JlKCZmbGFncyk7Cit9CisKKy8qCisg KiBJbiB0aGUgc2VtaSBpZGxlIGNhc2UsIHVzZSB0aGUgbmVhcmVzdCBidXN5IGNwdSBmb3IgbWln cmF0aW5nIHRpbWVycworICogZnJvbSBhbiBpZGxlIGNwdS4gIFRoaXMgaXMgZ29vZCBmb3IgcG93 ZXItc2F2aW5ncy4KKyAqCisgKiBXZSBkb24ndCBkbyBzaW1pbGFyIG9wdGltaXphdGlvbiBmb3Ig Y29tcGxldGVseSBpZGxlIHN5c3RlbSwgYXMKKyAqIHNlbGVjdGluZyBhbiBpZGxlIGNwdSB3aWxs IGFkZCBtb3JlIGRlbGF5cyB0byB0aGUgdGltZXJzIHRoYW4gaW50ZW5kZWQKKyAqIChhcyB0aGF0 IGNwdSdzIHRpbWVyIGJhc2UgbWF5IG5vdCBiZSB1cHRvZGF0ZSB3cnQgamlmZmllcyBldGMpLgor ICovCitpbnQgZ2V0X25vaHpfdGltZXJfdGFyZ2V0KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9w cm9jZXNzb3JfaWQoKTsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKworCXJj dV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQlmb3JfZWFjaF9j cHUoaSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKSB7CisJCQlpZiAoIWlkbGVfY3B1KGkpKQorCQkJ CWNwdSA9IGk7CisJCQlnb3RvIHVubG9jazsKKwkJfQorCX0KK3VubG9jazoKKwlyY3VfcmVhZF91 bmxvY2soKTsKKwlyZXR1cm4gY3B1OworfQorCisvKgorICogV2hlbiBhZGRfdGltZXJfb24oKSBl bnF1ZXVlcyBhIHRpbWVyIGludG8gdGhlIHRpbWVyIHdoZWVsIG9mIGFuCisgKiBpZGxlIENQVSB0 aGVuIHRoaXMgdGltZXIgbWlnaHQgZXhwaXJlIGJlZm9yZSB0aGUgbmV4dCB0aW1lciBldmVudAor ICogd2hpY2ggaXMgc2NoZWR1bGVkIHRvIHdha2UgdXAgdGhhdCBDUFUuIEluIGNhc2Ugb2YgYSBj b21wbGV0ZWx5CisgKiBpZGxlIHN5c3RlbSB0aGUgbmV4dCBldmVudCBtaWdodCBldmVuIGJlIGlu ZmluaXRlIHRpbWUgaW50byB0aGUKKyAqIGZ1dHVyZS4gd2FrZV91cF9pZGxlX2NwdSgpIGVuc3Vy ZXMgdGhhdCB0aGUgQ1BVIGlzIHdva2VuIHVwIGFuZAorICogbGVhdmVzIHRoZSBpbm5lciBpZGxl IGxvb3Agc28gdGhlIG5ld2x5IGFkZGVkIHRpbWVyIGlzIHRha2VuIGludG8KKyAqIGFjY291bnQg d2hlbiB0aGUgQ1BVIGdvZXMgYmFjayB0byBpZGxlIGFuZCBldmFsdWF0ZXMgdGhlIHRpbWVyCisg KiB3aGVlbCBmb3IgdGhlIG5leHQgdGltZXIgZXZlbnQuCisgKi8KK3ZvaWQgd2FrZV91cF9pZGxl X2NwdShpbnQgY3B1KQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZTsKKwlzdHJ1Y3QgcnEg KnJxOworCisJaWYgKGNwdSA9PSBzbXBfcHJvY2Vzc29yX2lkKCkpCisJCXJldHVybjsKKworCXJx ID0gY3B1X3JxKGNwdSk7CisJaWRsZSA9IHJxLT5pZGxlOworCisJLyoKKwkgKiBUaGlzIGlzIHNh ZmUsIGFzIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggdGhlIHRpbWVyCisJICogd2hlZWwg YmFzZSBsb2NrIG9mIChjcHUpIGhlbGQuIFdoZW4gdGhlIENQVSBpcyBvbiB0aGUgd2F5CisJICog dG8gaWRsZSBhbmQgaGFzIG5vdCB5ZXQgc2V0IHJxLT5jdXJyIHRvIGlkbGUgdGhlbiBpdCB3aWxs CisJICogYmUgc2VyaWFsaXNlZCBvbiB0aGUgdGltZXIgd2hlZWwgYmFzZSBsb2NrIGFuZCB0YWtl IHRoZSBuZXcKKwkgKiB0aW1lciBpbnRvIGFjY291bnQgYXV0b21hdGljYWxseS4KKwkgKi8KKwlp ZiAodW5saWtlbHkocnEtPmN1cnIgIT0gaWRsZSkpCisJCXJldHVybjsKKworCS8qCisJICogV2Ug Y2FuIHNldCBUSUZfUkVTQ0hFRCBvbiB0aGUgaWRsZSB0YXNrIG9mIHRoZSBvdGhlciBDUFUKKwkg KiBsb2NrbGVzcy4gVGhlIHdvcnN0IGNhc2UgaXMgdGhhdCB0aGUgb3RoZXIgQ1BVIHJ1bnMgdGhl CisJICogaWRsZSB0YXNrIHRocm91Z2ggYW4gYWRkaXRpb25hbCBOT09QIHNjaGVkdWxlKCkKKwkg Ki8KKwlzZXRfdHNrX25lZWRfcmVzY2hlZChpZGxlKTsKKworCS8qIE5FRURfUkVTQ0hFRCBtdXN0 IGJlIHZpc2libGUgYmVmb3JlIHdlIHRlc3QgcG9sbGluZyAqLworCXNtcF9tYigpOworCWlmICgh dHNrX2lzX3BvbGxpbmcoaWRsZSkpCisJCXNtcF9zZW5kX3Jlc2NoZWR1bGUoY3B1KTsKK30KKwor I2VuZGlmIC8qIENPTkZJR19OT19IWiAqLworCisvKgorICogQ2hhbmdlIGEgZ2l2ZW4gdGFzaydz IENQVSBhZmZpbml0eS4gTWlncmF0ZSB0aGUgdGhyZWFkIHRvIGEKKyAqIHByb3BlciBDUFUgYW5k IHNjaGVkdWxlIGl0IGF3YXkgaWYgdGhlIENQVSBpdCdzIGV4ZWN1dGluZyBvbgorICogaXMgcmVt b3ZlZCBmcm9tIHRoZSBhbGxvd2VkIGJpdG1hc2suCisgKgorICogTk9URTogdGhlIGNhbGxlciBt dXN0IGhhdmUgYSB2YWxpZCByZWZlcmVuY2UgdG8gdGhlIHRhc2ssIHRoZQorICogdGFzayBtdXN0 IG5vdCBleGl0KCkgJiBkZWFsbG9jYXRlIGl0c2VsZiBwcmVtYXR1cmVseS4gVGhlCisgKiBjYWxs IGlzIG5vdCBhdG9taWM7IG5vIHNwaW5sb2NrcyBtYXkgYmUgaGVsZC4KKyAqLworaW50IHNldF9j cHVzX2FsbG93ZWRfcHRyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY29uc3Qgc3RydWN0IGNwdW1h c2sgKm5ld19tYXNrKQoreworCWJvb2wgcnVubmluZ193cm9uZyA9IGZhbHNlOworCWJvb2wgcXVl dWVkID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOworCWlu dCByZXQgPSAwOworCisJcnEgPSB0YXNrX2dycV9sb2NrKHAsICZmbGFncyk7CisKKwlpZiAoY3B1 bWFza19lcXVhbCh0c2tfY3B1c19hbGxvd2VkKHApLCBuZXdfbWFzaykpCisJCWdvdG8gb3V0Owor CisJaWYgKCFjcHVtYXNrX2ludGVyc2VjdHMobmV3X21hc2ssIGNwdV9hY3RpdmVfbWFzaykpIHsK KwkJcmV0ID0gLUVJTlZBTDsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKHVubGlrZWx5KChwLT5m bGFncyAmIFBGX1RIUkVBRF9CT1VORCkgJiYgcCAhPSBjdXJyZW50KSkgeworCQlyZXQgPSAtRUlO VkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlxdWV1ZWQgPSB0YXNrX3F1ZXVlZChwKTsKKworCWRv X3NldF9jcHVzX2FsbG93ZWQocCwgbmV3X21hc2spOworCisJLyogQ2FuIHRoZSB0YXNrIHJ1biBv biB0aGUgdGFzaydzIGN1cnJlbnQgQ1BVPyBJZiBzbywgd2UncmUgZG9uZSAqLworCWlmIChjcHVt YXNrX3Rlc3RfY3B1KHRhc2tfY3B1KHApLCBuZXdfbWFzaykpCisJCWdvdG8gb3V0OworCisJaWYg KHRhc2tfcnVubmluZyhwKSkgeworCQkvKiBUYXNrIGlzIHJ1bm5pbmcgb24gdGhlIHdyb25nIGNw dSBub3csIHJlc2NoZWR1bGUgaXQuICovCisJCWlmIChycSA9PSB0aGlzX3JxKCkpIHsKKwkJCXNl dF90c2tfbmVlZF9yZXNjaGVkKHApOworCQkJcnVubmluZ193cm9uZyA9IHRydWU7CisJCX0gZWxz ZQorCQkJcmVzY2hlZF90YXNrKHApOworCX0gZWxzZQorCQlzZXRfdGFza19jcHUocCwgY3B1bWFz a19hbnlfYW5kKGNwdV9hY3RpdmVfbWFzaywgbmV3X21hc2spKTsKKworb3V0OgorCWlmIChxdWV1 ZWQpCisJCXRyeV9wcmVlbXB0KHAsIHJxKTsKKwl0YXNrX2dycV91bmxvY2soJmZsYWdzKTsKKwor CWlmIChydW5uaW5nX3dyb25nKQorCQlfY29uZF9yZXNjaGVkKCk7CisKKwlyZXR1cm4gcmV0Owor fQorRVhQT1JUX1NZTUJPTF9HUEwoc2V0X2NwdXNfYWxsb3dlZF9wdHIpOworCisjaWZkZWYgQ09O RklHX0hPVFBMVUdfQ1BVCisvKiBSdW4gdGhyb3VnaCB0YXNrIGxpc3QgYW5kIGZpbmQgdGFza3Mg YWZmaW5lZCB0byBqdXN0IHRoZSBkZWFkIGNwdSwgdGhlbgorICogYWxsb2NhdGUgYSBuZXcgYWZm aW5pdHkgKi8KK3N0YXRpYyB2b2lkIGJyZWFrX3NvbGVfYWZmaW5pdHkoaW50IHNyY19jcHUsIHN0 cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsICp0Owor CisJZG9fZWFjaF90aHJlYWQodCwgcCkgeworCQlpZiAocCAhPSBpZGxlICYmICFvbmxpbmVfY3B1 cyhwKSkgeworCQkJY3B1bWFza19jb3B5KHRza19jcHVzX2FsbG93ZWQocCksIGNwdV9wb3NzaWJs ZV9tYXNrKTsKKwkJCS8qCisJCQkgKiBEb24ndCB0ZWxsIHRoZW0gYWJvdXQgbW92aW5nIGV4aXRp bmcgdGFza3Mgb3IKKwkJCSAqIGtlcm5lbCB0aHJlYWRzIChib3RoIG1tIE5VTEwpLCBzaW5jZSB0 aGV5IG5ldmVyCisJCQkgKiBsZWF2ZSBrZXJuZWwuCisJCQkgKi8KKwkJCWlmIChwLT5tbSAmJiBw cmludGtfcmF0ZWxpbWl0KCkpIHsKKwkJCQlwcmludGsoS0VSTl9JTkZPICJwcm9jZXNzICVkICgl cykgbm8gIgorCQkJCQkgICAibG9uZ2VyIGFmZmluZSB0byBjcHUgJWRcbiIsCisJCQkJCSAgIHRh c2tfcGlkX25yKHApLCBwLT5jb21tLCBzcmNfY3B1KTsKKwkJCX0KKwkJfQorCQljbGVhcl9zdGlj a3kocCk7CisJfSB3aGlsZV9lYWNoX3RocmVhZCh0LCBwKTsKK30KKworLyoKKyAqIFNjaGVkdWxl cyBpZGxlIHRhc2sgdG8gYmUgdGhlIG5leHQgcnVubmFibGUgdGFzayBvbiBjdXJyZW50IENQVS4K KyAqIEl0IGRvZXMgc28gYnkgYm9vc3RpbmcgaXRzIHByaW9yaXR5IHRvIGhpZ2hlc3QgcG9zc2li bGUuCisgKiBVc2VkIGJ5IENQVSBvZmZsaW5lIGNvZGUuCisgKi8KK3ZvaWQgc2NoZWRfaWRsZV9u ZXh0KHN0cnVjdCBycSAqcnEsIGludCB0aGlzX2NwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxl KQoreworCS8qIGNwdSBoYXMgdG8gYmUgb2ZmbGluZSAqLworCUJVR19PTihjcHVfb25saW5lKHRo aXNfY3B1KSk7CisKKwlfX3NldHNjaGVkdWxlcihpZGxlLCBycSwgU0NIRURfRklGTywgU1RPUF9Q UklPKTsKKworCWFjdGl2YXRlX2lkbGVfdGFzayhpZGxlKTsKKwlzZXRfdHNrX25lZWRfcmVzY2hl ZChycS0+Y3Vycik7Cit9CisKKy8qCisgKiBFbnN1cmVzIHRoYXQgdGhlIGlkbGUgdGFzayBpcyB1 c2luZyBpbml0X21tIHJpZ2h0IGJlZm9yZSBpdHMgY3B1IGdvZXMKKyAqIG9mZmxpbmUuCisgKi8K K3ZvaWQgaWRsZV90YXNrX2V4aXQodm9pZCkKK3sKKwlzdHJ1Y3QgbW1fc3RydWN0ICptbSA9IGN1 cnJlbnQtPmFjdGl2ZV9tbTsKKworCUJVR19PTihjcHVfb25saW5lKHNtcF9wcm9jZXNzb3JfaWQo KSkpOworCisJaWYgKG1tICE9ICZpbml0X21tKQorCQlzd2l0Y2hfbW0obW0sICZpbml0X21tLCBj dXJyZW50KTsKKwltbWRyb3AobW0pOworfQorI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAq Lwordm9pZCBzY2hlZF9zZXRfc3RvcF90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAq c3RvcCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3RvcF9wYXJhbSA9IHsgLnNjaGVkX3ByaW9y aXR5ID0gU1RPUF9QUklPIH07CisJc3RydWN0IHNjaGVkX3BhcmFtIHN0YXJ0X3BhcmFtID0geyAu c2NoZWRfcHJpb3JpdHkgPSBNQVhfVVNFUl9SVF9QUklPIC0gMSB9OworCXN0cnVjdCB0YXNrX3N0 cnVjdCAqb2xkX3N0b3AgPSBjcHVfcnEoY3B1KS0+c3RvcDsKKworCWlmIChzdG9wKSB7CisJCS8q CisJCSAqIE1ha2UgaXQgYXBwZWFyIGxpa2UgYSBTQ0hFRF9GSUZPIHRhc2ssIGl0cyBzb21ldGhp bmcKKwkJICogdXNlcnNwYWNlIGtub3dzIGFib3V0IGFuZCB3b24ndCBnZXQgY29uZnVzZWQgYWJv dXQuCisJCSAqCisJCSAqIEFsc28sIGl0IHdpbGwgbWFrZSBQSSBtb3JlIG9yIGxlc3Mgd29yayB3 aXRob3V0IHRvbworCQkgKiBtdWNoIGNvbmZ1c2lvbiAtLSBidXQgdGhlbiwgc3RvcCB3b3JrIHNo b3VsZCBub3QKKwkJICogcmVseSBvbiBQSSB3b3JraW5nIGFueXdheS4KKwkJICovCisJCXNjaGVk X3NldHNjaGVkdWxlcl9ub2NoZWNrKHN0b3AsIFNDSEVEX0ZJRk8sICZzdG9wX3BhcmFtKTsKKwl9 CisKKwljcHVfcnEoY3B1KS0+c3RvcCA9IHN0b3A7CisKKwlpZiAob2xkX3N0b3ApIHsKKwkJLyoK KwkJICogUmVzZXQgaXQgYmFjayB0byBhIG5vcm1hbCBydCBzY2hlZHVsaW5nIHByaW8gc28gdGhh dAorCQkgKiBpdCBjYW4gZGllIGluIHBpZWNlcy4KKwkJICovCisJCXNjaGVkX3NldHNjaGVkdWxl cl9ub2NoZWNrKG9sZF9zdG9wLCBTQ0hFRF9GSUZPLCAmc3RhcnRfcGFyYW0pOworCX0KK30KKwor CisjaWYgZGVmaW5lZChDT05GSUdfU0NIRURfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1NZU0NU TCkKKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgc2RfY3RsX2RpcltdID0geworCXsKKwkJLnBy b2NuYW1lCT0gInNjaGVkX2RvbWFpbiIsCisJCS5tb2RlCQk9IDA1NTUsCisJfSwKKwl7fQorfTsK Kworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgc2RfY3RsX3Jvb3RbXSA9IHsKKwl7CisJCS5wcm9j bmFtZQk9ICJrZXJuZWwiLAorCQkubW9kZQkJPSAwNTU1LAorCQkuY2hpbGQJCT0gc2RfY3RsX2Rp ciwKKwl9LAorCXt9Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSAqc2RfYWxsb2NfY3Rs X2VudHJ5KGludCBuKQoreworCXN0cnVjdCBjdGxfdGFibGUgKmVudHJ5ID0KKwkJa2NhbGxvYyhu LCBzaXplb2Yoc3RydWN0IGN0bF90YWJsZSksIEdGUF9LRVJORUwpOworCisJcmV0dXJuIGVudHJ5 OworfQorCitzdGF0aWMgdm9pZCBzZF9mcmVlX2N0bF9lbnRyeShzdHJ1Y3QgY3RsX3RhYmxlICoq dGFibGVwKQoreworCXN0cnVjdCBjdGxfdGFibGUgKmVudHJ5OworCisJLyoKKwkgKiBJbiB0aGUg aW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzLCBib3RoIHRoZSBjaGlsZCBkaXJlY3RvcnkgYW5kCisJ ICogcHJvY25hbWUgYXJlIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBhbmQgY291bGQgZmFpbCBidXQg dGhlIG1vZGUKKwkgKiB3aWxsIGFsd2F5cyBiZSBzZXQuIEluIHRoZSBsb3dlc3QgZGlyZWN0b3J5 IHRoZSBuYW1lcyBhcmUKKwkgKiBzdGF0aWMgc3RyaW5ncyBhbmQgYWxsIGhhdmUgcHJvYyBoYW5k bGVycy4KKwkgKi8KKwlmb3IgKGVudHJ5ID0gKnRhYmxlcDsgZW50cnktPm1vZGU7IGVudHJ5Kysp IHsKKwkJaWYgKGVudHJ5LT5jaGlsZCkKKwkJCXNkX2ZyZWVfY3RsX2VudHJ5KCZlbnRyeS0+Y2hp bGQpOworCQlpZiAoZW50cnktPnByb2NfaGFuZGxlciA9PSBOVUxMKQorCQkJa2ZyZWUoZW50cnkt PnByb2NuYW1lKTsKKwl9CisKKwlrZnJlZSgqdGFibGVwKTsKKwkqdGFibGVwID0gTlVMTDsKK30K Kworc3RhdGljIHZvaWQKK3NldF90YWJsZV9lbnRyeShzdHJ1Y3QgY3RsX3RhYmxlICplbnRyeSwK KwkJY29uc3QgY2hhciAqcHJvY25hbWUsIHZvaWQgKmRhdGEsIGludCBtYXhsZW4sCisJCW1vZGVf dCBtb2RlLCBwcm9jX2hhbmRsZXIgKnByb2NfaGFuZGxlcikKK3sKKwllbnRyeS0+cHJvY25hbWUg PSBwcm9jbmFtZTsKKwllbnRyeS0+ZGF0YSA9IGRhdGE7CisJZW50cnktPm1heGxlbiA9IG1heGxl bjsKKwllbnRyeS0+bW9kZSA9IG1vZGU7CisJZW50cnktPnByb2NfaGFuZGxlciA9IHByb2NfaGFu ZGxlcjsKK30KKworc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgKgorc2RfYWxsb2NfY3RsX2RvbWFp bl90YWJsZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKK3sKKwlzdHJ1Y3QgY3RsX3RhYmxlICp0 YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeSgxMyk7CisKKwlpZiAodGFibGUgPT0gTlVMTCkKKwkJ cmV0dXJuIE5VTEw7CisKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzBdLCAibWluX2ludGVydmFs IiwgJnNkLT5taW5faW50ZXJ2YWwsCisJCXNpemVvZihsb25nKSwgMDY0NCwgcHJvY19kb3Vsb25n dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVsxXSwgIm1heF9pbnRlcnZhbCIs ICZzZC0+bWF4X2ludGVydmFsLAorCQlzaXplb2YobG9uZyksIDA2NDQsIHByb2NfZG91bG9uZ3Zl Y19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMl0sICJidXN5X2lkeCIsICZzZC0+ YnVzeV9pZHgsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJ c2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVszXSwgImlkbGVfaWR4IiwgJnNkLT5pZGxlX2lkeCwKKwkJ c2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50 cnkoJnRhYmxlWzRdLCAibmV3aWRsZV9pZHgiLCAmc2QtPm5ld2lkbGVfaWR4LAorCQlzaXplb2Yo aW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFi bGVbNV0sICJ3YWtlX2lkeCIsICZzZC0+d2FrZV9pZHgsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBw cm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs2XSwgImZvcmtl eGVjX2lkeCIsICZzZC0+Zm9ya2V4ZWNfaWR4LAorCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19k b2ludHZlY19taW5tYXgpOworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbN10sICJidXN5X2ZhY3Rv ciIsICZzZC0+YnVzeV9mYWN0b3IsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVj X21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs4XSwgImltYmFsYW5jZV9wY3QiLCAm c2QtPmltYmFsYW5jZV9wY3QsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21p bm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs5XSwgImNhY2hlX25pY2VfdHJpZXMiLAor CQkmc2QtPmNhY2hlX25pY2VfdHJpZXMsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50 dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVsxMF0sICJmbGFncyIsICZzZC0+ ZmxhZ3MsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0 X3RhYmxlX2VudHJ5KCZ0YWJsZVsxMV0sICJuYW1lIiwgc2QtPm5hbWUsCisJCUNPUkVOQU1FX01B WF9TSVpFLCAwNDQ0LCBwcm9jX2Rvc3RyaW5nKTsKKwkvKiAmdGFibGVbMTJdIGlzIHRlcm1pbmF0 b3IgKi8KKworCXJldHVybiB0YWJsZTsKK30KKworc3RhdGljIGN0bF90YWJsZSAqc2RfYWxsb2Nf Y3RsX2NwdV90YWJsZShpbnQgY3B1KQoreworCXN0cnVjdCBjdGxfdGFibGUgKmVudHJ5LCAqdGFi bGU7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJaW50IGRvbWFpbl9udW0gPSAwLCBpOwor CWNoYXIgYnVmWzMyXTsKKworCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKQorCQlkb21haW5fbnVt Kys7CisJZW50cnkgPSB0YWJsZSA9IHNkX2FsbG9jX2N0bF9lbnRyeShkb21haW5fbnVtICsgMSk7 CisJaWYgKHRhYmxlID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJaSA9IDA7CisJZm9yX2Vh Y2hfZG9tYWluKGNwdSwgc2QpIHsKKwkJc25wcmludGYoYnVmLCAzMiwgImRvbWFpbiVkIiwgaSk7 CisJCWVudHJ5LT5wcm9jbmFtZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKKwkJZW50cnkt Pm1vZGUgPSAwNTU1OworCQllbnRyeS0+Y2hpbGQgPSBzZF9hbGxvY19jdGxfZG9tYWluX3RhYmxl KHNkKTsKKwkJZW50cnkrKzsKKwkJaSsrOworCX0KKwlyZXR1cm4gdGFibGU7Cit9CisKK3N0YXRp YyBzdHJ1Y3QgY3RsX3RhYmxlX2hlYWRlciAqc2Rfc3lzY3RsX2hlYWRlcjsKK3N0YXRpYyB2b2lk IHJlZ2lzdGVyX3NjaGVkX2RvbWFpbl9zeXNjdGwodm9pZCkKK3sKKwlpbnQgaSwgY3B1X251bSA9 IG51bV9wb3NzaWJsZV9jcHVzKCk7CisJc3RydWN0IGN0bF90YWJsZSAqZW50cnkgPSBzZF9hbGxv Y19jdGxfZW50cnkoY3B1X251bSArIDEpOworCWNoYXIgYnVmWzMyXTsKKworCVdBUk5fT04oc2Rf Y3RsX2RpclswXS5jaGlsZCk7CisJc2RfY3RsX2RpclswXS5jaGlsZCA9IGVudHJ5OworCisJaWYg KGVudHJ5ID09IE5VTEwpCisJCXJldHVybjsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7 CisJCXNucHJpbnRmKGJ1ZiwgMzIsICJjcHUlZCIsIGkpOworCQllbnRyeS0+cHJvY25hbWUgPSBr c3RyZHVwKGJ1ZiwgR0ZQX0tFUk5FTCk7CisJCWVudHJ5LT5tb2RlID0gMDU1NTsKKwkJZW50cnkt PmNoaWxkID0gc2RfYWxsb2NfY3RsX2NwdV90YWJsZShpKTsKKwkJZW50cnkrKzsKKwl9CisKKwlX QVJOX09OKHNkX3N5c2N0bF9oZWFkZXIpOworCXNkX3N5c2N0bF9oZWFkZXIgPSByZWdpc3Rlcl9z eXNjdGxfdGFibGUoc2RfY3RsX3Jvb3QpOworfQorCisvKiBtYXkgYmUgY2FsbGVkIG11bHRpcGxl IHRpbWVzIHBlciByZWdpc3RlciAqLworc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9zY2hlZF9kb21h aW5fc3lzY3RsKHZvaWQpCit7CisJaWYgKHNkX3N5c2N0bF9oZWFkZXIpCisJCXVucmVnaXN0ZXJf c3lzY3RsX3RhYmxlKHNkX3N5c2N0bF9oZWFkZXIpOworCXNkX3N5c2N0bF9oZWFkZXIgPSBOVUxM OworCWlmIChzZF9jdGxfZGlyWzBdLmNoaWxkKQorCQlzZF9mcmVlX2N0bF9lbnRyeSgmc2RfY3Rs X2RpclswXS5jaGlsZCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcmVnaXN0ZXJfc2NoZWRfZG9t YWluX3N5c2N0bCh2b2lkKQoreworfQorc3RhdGljIHZvaWQgdW5yZWdpc3Rlcl9zY2hlZF9kb21h aW5fc3lzY3RsKHZvaWQpCit7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0X3JxX29ubGlu ZShzdHJ1Y3QgcnEgKnJxKQoreworCWlmICghcnEtPm9ubGluZSkgeworCQljcHVtYXNrX3NldF9j cHUoY3B1X29mKHJxKSwgcnEtPnJkLT5vbmxpbmUpOworCQlycS0+b25saW5lID0gdHJ1ZTsKKwl9 Cit9CisKK3N0YXRpYyB2b2lkIHNldF9ycV9vZmZsaW5lKHN0cnVjdCBycSAqcnEpCit7CisJaWYg KHJxLT5vbmxpbmUpIHsKKwkJY3B1bWFza19jbGVhcl9jcHUoY3B1X29mKHJxKSwgcnEtPnJkLT5v bmxpbmUpOworCQlycS0+b25saW5lID0gZmFsc2U7CisJfQorfQorCisvKgorICogbWlncmF0aW9u X2NhbGwgLSBjYWxsYmFjayB0aGF0IGdldHMgdHJpZ2dlcmVkIHdoZW4gYSBDUFUgaXMgYWRkZWQu CisgKi8KK3N0YXRpYyBpbnQgX19jcHVpbml0CittaWdyYXRpb25fY2FsbChzdHJ1Y3Qgbm90aWZp ZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJaW50 IGNwdSA9IChsb25nKWhjcHU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJx ID0gY3B1X3JxKGNwdSk7CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJc3RydWN0IHRhc2tf c3RydWN0ICppZGxlID0gcnEtPmlkbGU7CisjZW5kaWYKKworCXN3aXRjaCAoYWN0aW9uICYgfkNQ VV9UQVNLU19GUk9aRU4pIHsKKworCWNhc2UgQ1BVX1VQX1BSRVBBUkU6CisJCWJyZWFrOworCisJ Y2FzZSBDUFVfT05MSU5FOgorCQkvKiBVcGRhdGUgb3VyIHJvb3QtZG9tYWluICovCisJCWdycV9s b2NrX2lycXNhdmUoJmZsYWdzKTsKKwkJaWYgKHJxLT5yZCkgeworCQkJQlVHX09OKCFjcHVtYXNr X3Rlc3RfY3B1KGNwdSwgcnEtPnJkLT5zcGFuKSk7CisKKwkJCXNldF9ycV9vbmxpbmUocnEpOwor CQl9CisJCWdycS5ub2MgPSBudW1fb25saW5lX2NwdXMoKTsKKwkJZ3JxX3VubG9ja19pcnFyZXN0 b3JlKCZmbGFncyk7CisJCWJyZWFrOworCisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJY2Fz ZSBDUFVfREVBRDoKKwkJLyogSWRsZSB0YXNrIGJhY2sgdG8gbm9ybWFsIChvZmYgcnVucXVldWUs IGxvdyBwcmlvKSAqLworCQlncnFfbG9ja19pcnEoKTsKKwkJcHV0X3ByZXZfdGFzayhycSwgaWRs ZSwgdHJ1ZSwgZmFsc2UpOworCQlpZGxlLT5zdGF0aWNfcHJpbyA9IE1BWF9QUklPOworCQlfX3Nl dHNjaGVkdWxlcihpZGxlLCBycSwgU0NIRURfTk9STUFMLCAwKTsKKwkJaWRsZS0+cHJpbyA9IFBS SU9fTElNSVQ7CisJCXNldF9ycV90YXNrKHJxLCBpZGxlKTsKKwkJZ3JxX3VubG9ja19pcnEoKTsK KwkJYnJlYWs7CisKKwljYXNlIENQVV9EWUlORzoKKwkJLyogVXBkYXRlIG91ciByb290LWRvbWFp biAqLworCQlncnFfbG9ja19pcnFzYXZlKCZmbGFncyk7CisJCXNjaGVkX2lkbGVfbmV4dChycSwg Y3B1LCBpZGxlKTsKKwkJaWYgKHJxLT5yZCkgeworCQkJQlVHX09OKCFjcHVtYXNrX3Rlc3RfY3B1 KGNwdSwgcnEtPnJkLT5zcGFuKSk7CisJCQlzZXRfcnFfb2ZmbGluZShycSk7CisJCX0KKwkJYnJl YWtfc29sZV9hZmZpbml0eShjcHUsIGlkbGUpOworCQlncnEubm9jID0gbnVtX29ubGluZV9jcHVz KCk7CisJCWdycV91bmxvY2tfaXJxcmVzdG9yZSgmZmxhZ3MpOworCQlicmVhazsKKyNlbmRpZgor CX0KKwlyZXR1cm4gTk9USUZZX09LOworfQorCisvKgorICogUmVnaXN0ZXIgYXQgaGlnaCBwcmlv cml0eSBzbyB0aGF0IHRhc2sgbWlncmF0aW9uIChtaWdyYXRlX2FsbF90YXNrcykKKyAqIGhhcHBl bnMgYmVmb3JlIGV2ZXJ5dGhpbmcgZWxzZS4gIFRoaXMgaGFzIHRvIGJlIGxvd2VyIHByaW9yaXR5 IHRoYW4KKyAqIHRoZSBub3RpZmllciBpbiB0aGUgcGVyZl9jb3VudGVyIHN1YnN5c3RlbSwgdGhv dWdoLgorICovCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIF9fY3B1aW5pdGRhdGEgbWln cmF0aW9uX25vdGlmaWVyID0geworCS5ub3RpZmllcl9jYWxsID0gbWlncmF0aW9uX2NhbGwsCisJ LnByaW9yaXR5ID0gQ1BVX1BSSV9NSUdSQVRJT04sCit9OworCitzdGF0aWMgaW50IF9fY3B1aW5p dCBzY2hlZF9jcHVfYWN0aXZlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmZiLAorCQkJCQkgIHVu c2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpoY3B1KQoreworCXN3aXRjaCAoYWN0aW9uICYgfkNQ VV9UQVNLU19GUk9aRU4pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJY2FzZSBDUFVfRE9XTl9GQUlM RUQ6CisJCXNldF9jcHVfYWN0aXZlKChsb25nKWhjcHUsIHRydWUpOworCQlyZXR1cm4gTk9USUZZ X09LOworCWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKK3N0YXRpYyBp bnQgX19jcHVpbml0IHNjaGVkX2NwdV9pbmFjdGl2ZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5m YiwKKwkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJc3dpdGNoIChh Y3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCWNhc2UgQ1BVX0RPV05fUFJFUEFSRToKKwkJ c2V0X2NwdV9hY3RpdmUoKGxvbmcpaGNwdSwgZmFsc2UpOworCQlyZXR1cm4gTk9USUZZX09LOwor CWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKK2ludCBfX2luaXQgbWln cmF0aW9uX2luaXQodm9pZCkKK3sKKwl2b2lkICpjcHUgPSAodm9pZCAqKShsb25nKXNtcF9wcm9j ZXNzb3JfaWQoKTsKKwlpbnQgZXJyOworCisJLyogSW5pdGlhbGlzZSBtaWdyYXRpb24gZm9yIHRo ZSBib290IENQVSAqLworCWVyciA9IG1pZ3JhdGlvbl9jYWxsKCZtaWdyYXRpb25fbm90aWZpZXIs IENQVV9VUF9QUkVQQVJFLCBjcHUpOworCUJVR19PTihlcnIgPT0gTk9USUZZX0JBRCk7CisJbWln cmF0aW9uX2NhbGwoJm1pZ3JhdGlvbl9ub3RpZmllciwgQ1BVX09OTElORSwgY3B1KTsKKwlyZWdp c3Rlcl9jcHVfbm90aWZpZXIoJm1pZ3JhdGlvbl9ub3RpZmllcik7CisKKwkvKiBSZWdpc3RlciBj cHUgYWN0aXZlIG5vdGlmaWVycyAqLworCWNwdV9ub3RpZmllcihzY2hlZF9jcHVfYWN0aXZlLCBD UFVfUFJJX1NDSEVEX0FDVElWRSk7CisJY3B1X25vdGlmaWVyKHNjaGVkX2NwdV9pbmFjdGl2ZSwg Q1BVX1BSSV9TQ0hFRF9JTkFDVElWRSk7CisKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X2luaXRjYWxs KG1pZ3JhdGlvbl9pbml0KTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAorCitzdGF0aWMg Y3B1bWFza192YXJfdCBzY2hlZF9kb21haW5zX3RtcG1hc2s7IC8qIHNjaGVkX2RvbWFpbnNfbXV0 ZXggKi8KKworI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRworCitzdGF0aWMgX19yZWFkX21vc3Rs eSBpbnQgc2NoZWRfZG9tYWluX2RlYnVnX2VuYWJsZWQ7CisKK3N0YXRpYyBpbnQgX19pbml0IHNj aGVkX2RvbWFpbl9kZWJ1Z19zZXR1cChjaGFyICpzdHIpCit7CisJc2NoZWRfZG9tYWluX2RlYnVn X2VuYWJsZWQgPSAxOworCisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgic2NoZWRfZGVidWci LCBzY2hlZF9kb21haW5fZGVidWdfc2V0dXApOworCitzdGF0aWMgaW50IHNjaGVkX2RvbWFpbl9k ZWJ1Z19vbmUoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUsIGludCBsZXZlbCwKKwkJ CQkgIHN0cnVjdCBjcHVtYXNrICpncm91cG1hc2spCit7CisJc3RydWN0IHNjaGVkX2dyb3VwICpn cm91cCA9IHNkLT5ncm91cHM7CisJY2hhciBzdHJbMjU2XTsKKworCWNwdWxpc3Rfc2NucHJpbnRm KHN0ciwgc2l6ZW9mKHN0ciksIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7CisJY3B1bWFza19jbGVh cihncm91cG1hc2spOworCisJcHJpbnRrKEtFUk5fREVCVUcgIiUqcyBkb21haW4gJWQ6ICIsIGxl dmVsLCAiIiwgbGV2ZWwpOworCisJaWYgKCEoc2QtPmZsYWdzICYgU0RfTE9BRF9CQUxBTkNFKSkg eworCQlwcmludGsoImRvZXMgbm90IGxvYWQtYmFsYW5jZVxuIik7CisJCWlmIChzZC0+cGFyZW50 KQorCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogIVNEX0xPQURfQkFMQU5DRSBkb21haW4iCisJ CQkJCSIgaGFzIHBhcmVudCIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcHJpbnRrKEtFUk5fQ09O VCAic3BhbiAlcyBsZXZlbCAlc1xuIiwgc3RyLCBzZC0+bmFtZSk7CisKKwlpZiAoIWNwdW1hc2tf dGVzdF9jcHUoY3B1LCBzY2hlZF9kb21haW5fc3BhbihzZCkpKSB7CisJCXByaW50ayhLRVJOX0VS UiAiRVJST1I6IGRvbWFpbi0+c3BhbiBkb2VzIG5vdCBjb250YWluICIKKwkJCQkiQ1BVJWRcbiIs IGNwdSk7CisJfQorCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIHNjaGVkX2dyb3VwX2NwdXMo Z3JvdXApKSkgeworCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBkb21haW4tPmdyb3VwcyBkb2Vz IG5vdCBjb250YWluIgorCQkJCSIgQ1BVJWRcbiIsIGNwdSk7CisJfQorCisJcHJpbnRrKEtFUk5f REVCVUcgIiUqcyBncm91cHM6IiwgbGV2ZWwgKyAxLCAiIik7CisJZG8geworCQlpZiAoIWdyb3Vw KSB7CisJCQlwcmludGsoIlxuIik7CisJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiBncm91cCBp cyBOVUxMXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKCFncm91cC0+c2dwLT5wb3dlcikg eworCQkJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6 IGRvbWFpbi0+Y3B1X3Bvd2VyIG5vdCAiCisJCQkJCSJzZXRcbiIpOworCQkJYnJlYWs7CisJCX0K KworCQlpZiAoIWNwdW1hc2tfd2VpZ2h0KHNjaGVkX2dyb3VwX2NwdXMoZ3JvdXApKSkgeworCQkJ cHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGVtcHR5 IGdyb3VwXG4iKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGNwdW1hc2tfaW50ZXJzZWN0cyhn cm91cG1hc2ssIHNjaGVkX2dyb3VwX2NwdXMoZ3JvdXApKSkgeworCQkJcHJpbnRrKEtFUk5fQ09O VCAiXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IHJlcGVhdGVkIENQVXNcbiIpOwor CQkJYnJlYWs7CisJCX0KKworCQljcHVtYXNrX29yKGdyb3VwbWFzaywgZ3JvdXBtYXNrLCBzY2hl ZF9ncm91cF9jcHVzKGdyb3VwKSk7CisKKwkJY3B1bGlzdF9zY25wcmludGYoc3RyLCBzaXplb2Yo c3RyKSwgc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpOworCisJCXByaW50ayhLRVJOX0NPTlQgIiAl cyIsIHN0cik7CisJCWlmIChncm91cC0+c2dwLT5wb3dlciAhPSBTQ0hFRF9QT1dFUl9TQ0FMRSkg eworCQkJcHJpbnRrKEtFUk5fQ09OVCAiIChjcHVfcG93ZXIgPSAlZCkiLAorCQkJCWdyb3VwLT5z Z3AtPnBvd2VyKTsKKwkJfQorCisJCWdyb3VwID0gZ3JvdXAtPm5leHQ7CisJfSB3aGlsZSAoZ3Jv dXAgIT0gc2QtPmdyb3Vwcyk7CisJcHJpbnRrKEtFUk5fQ09OVCAiXG4iKTsKKworCWlmICghY3B1 bWFza19lcXVhbChzY2hlZF9kb21haW5fc3BhbihzZCksIGdyb3VwbWFzaykpCisJCXByaW50ayhL RVJOX0VSUiAiRVJST1I6IGdyb3VwcyBkb24ndCBzcGFuIGRvbWFpbi0+c3BhblxuIik7CisKKwlp ZiAoc2QtPnBhcmVudCAmJgorCQkhY3B1bWFza19zdWJzZXQoZ3JvdXBtYXNrLCBzY2hlZF9kb21h aW5fc3BhbihzZC0+cGFyZW50KSkpCisJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IHBhcmVudCBz cGFuIGlzIG5vdCBhIHN1cGVyc2V0ICIKKwkJCSJvZiBkb21haW4tPnNwYW5cbiIpOworCXJldHVy biAwOworfQorCitzdGF0aWMgdm9pZCBzY2hlZF9kb21haW5fZGVidWcoc3RydWN0IHNjaGVkX2Rv bWFpbiAqc2QsIGludCBjcHUpCit7CisJaW50IGxldmVsID0gMDsKKworCWlmICghc2NoZWRfZG9t YWluX2RlYnVnX2VuYWJsZWQpCisJCXJldHVybjsKKworCWlmICghc2QpIHsKKwkJcHJpbnRrKEtF Uk5fREVCVUcgIkNQVSVkIGF0dGFjaGluZyBOVUxMIHNjaGVkLWRvbWFpbi5cbiIsIGNwdSk7CisJ CXJldHVybjsKKwl9CisKKwlwcmludGsoS0VSTl9ERUJVRyAiQ1BVJWQgYXR0YWNoaW5nIHNjaGVk LWRvbWFpbjpcbiIsIGNwdSk7CisKKwlmb3IgKDs7KSB7CisJCWlmIChzY2hlZF9kb21haW5fZGVi dWdfb25lKHNkLCBjcHUsIGxldmVsLCBzY2hlZF9kb21haW5zX3RtcG1hc2spKQorCQkJYnJlYWs7 CisJCWxldmVsKys7CisJCXNkID0gc2QtPnBhcmVudDsKKwkJaWYgKCFzZCkKKwkJCWJyZWFrOwor CX0KK30KKyNlbHNlIC8qICFDT05GSUdfU0NIRURfREVCVUcgKi8KKyMgZGVmaW5lIHNjaGVkX2Rv bWFpbl9kZWJ1ZyhzZCwgY3B1KSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYgLyogQ09ORklHX1ND SEVEX0RFQlVHICovCisKK3N0YXRpYyBpbnQgc2RfZGVnZW5lcmF0ZShzdHJ1Y3Qgc2NoZWRfZG9t YWluICpzZCkKK3sKKwlpZiAoY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWluX3NwYW4oc2QpKSA9 PSAxKQorCQlyZXR1cm4gMTsKKworCS8qIEZvbGxvd2luZyBmbGFncyBuZWVkIGF0IGxlYXN0IDIg Z3JvdXBzICovCisJaWYgKHNkLT5mbGFncyAmIChTRF9MT0FEX0JBTEFOQ0UgfAorCQkJIFNEX0JB TEFOQ0VfTkVXSURMRSB8CisJCQkgU0RfQkFMQU5DRV9GT1JLIHwKKwkJCSBTRF9CQUxBTkNFX0VY RUMgfAorCQkJIFNEX1NIQVJFX0NQVVBPV0VSIHwKKwkJCSBTRF9TSEFSRV9QS0dfUkVTT1VSQ0VT KSkgeworCQlpZiAoc2QtPmdyb3VwcyAhPSBzZC0+Z3JvdXBzLT5uZXh0KQorCQkJcmV0dXJuIDA7 CisJfQorCisJLyogRm9sbG93aW5nIGZsYWdzIGRvbid0IHVzZSBncm91cHMgKi8KKwlpZiAoc2Qt PmZsYWdzICYgKFNEX1dBS0VfQUZGSU5FKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30K Kworc3RhdGljIGludAorc2RfcGFyZW50X2RlZ2VuZXJhdGUoc3RydWN0IHNjaGVkX2RvbWFpbiAq c2QsIHN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmbGFn cyA9IHNkLT5mbGFncywgcGZsYWdzID0gcGFyZW50LT5mbGFnczsKKworCWlmIChzZF9kZWdlbmVy YXRlKHBhcmVudCkpCisJCXJldHVybiAxOworCisJaWYgKCFjcHVtYXNrX2VxdWFsKHNjaGVkX2Rv bWFpbl9zcGFuKHNkKSwgc2NoZWRfZG9tYWluX3NwYW4ocGFyZW50KSkpCisJCXJldHVybiAwOwor CisJLyogRmxhZ3MgbmVlZGluZyBncm91cHMgZG9uJ3QgY291bnQgaWYgb25seSAxIGdyb3VwIGlu IHBhcmVudCAqLworCWlmIChwYXJlbnQtPmdyb3VwcyA9PSBwYXJlbnQtPmdyb3Vwcy0+bmV4dCkg eworCQlwZmxhZ3MgJj0gfihTRF9MT0FEX0JBTEFOQ0UgfAorCQkJCVNEX0JBTEFOQ0VfTkVXSURM RSB8CisJCQkJU0RfQkFMQU5DRV9GT1JLIHwKKwkJCQlTRF9CQUxBTkNFX0VYRUMgfAorCQkJCVNE X1NIQVJFX0NQVVBPV0VSIHwKKwkJCQlTRF9TSEFSRV9QS0dfUkVTT1VSQ0VTKTsKKwkJaWYgKG5y X25vZGVfaWRzID09IDEpCisJCQlwZmxhZ3MgJj0gflNEX1NFUklBTElaRTsKKwl9CisJaWYgKH5j ZmxhZ3MgJiBwZmxhZ3MpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2 b2lkIGZyZWVfcm9vdGRvbWFpbihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlzdHJ1Y3Qgcm9v dF9kb21haW4gKnJkID0gY29udGFpbmVyX29mKHJjdSwgc3RydWN0IHJvb3RfZG9tYWluLCByY3Up OworCisJY3B1cHJpX2NsZWFudXAoJnJkLT5jcHVwcmkpOworCWZyZWVfY3B1bWFza192YXIocmQt PnJ0b19tYXNrKTsKKwlmcmVlX2NwdW1hc2tfdmFyKHJkLT5vbmxpbmUpOworCWZyZWVfY3B1bWFz a192YXIocmQtPnNwYW4pOworCWtmcmVlKHJkKTsKK30KKworc3RhdGljIHZvaWQgcnFfYXR0YWNo X3Jvb3Qoc3RydWN0IHJxICpycSwgc3RydWN0IHJvb3RfZG9tYWluICpyZCkKK3sKKwlzdHJ1Y3Qg cm9vdF9kb21haW4gKm9sZF9yZCA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWdy cV9sb2NrX2lycXNhdmUoJmZsYWdzKTsKKworCWlmIChycS0+cmQpIHsKKwkJb2xkX3JkID0gcnEt PnJkOworCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHJxLT5jcHUsIG9sZF9yZC0+b25saW5lKSkK KwkJCXNldF9ycV9vZmZsaW5lKHJxKTsKKworCQljcHVtYXNrX2NsZWFyX2NwdShycS0+Y3B1LCBv bGRfcmQtPnNwYW4pOworCisJCS8qCisJCSAqIElmIHdlIGRvbnQgd2FudCB0byBmcmVlIHRoZSBv bGRfcnQgeWV0IHRoZW4KKwkJICogc2V0IG9sZF9yZCB0byBOVUxMIHRvIHNraXAgdGhlIGZyZWVp bmcgbGF0ZXIKKwkJICogaW4gdGhpcyBmdW5jdGlvbjoKKwkJICovCisJCWlmICghYXRvbWljX2Rl Y19hbmRfdGVzdCgmb2xkX3JkLT5yZWZjb3VudCkpCisJCQlvbGRfcmQgPSBOVUxMOworCX0KKwor CWF0b21pY19pbmMoJnJkLT5yZWZjb3VudCk7CisJcnEtPnJkID0gcmQ7CisKKwljcHVtYXNrX3Nl dF9jcHUocnEtPmNwdSwgcmQtPnNwYW4pOworCWlmIChjcHVtYXNrX3Rlc3RfY3B1KHJxLT5jcHUs IGNwdV9hY3RpdmVfbWFzaykpCisJCXNldF9ycV9vbmxpbmUocnEpOworCisJZ3JxX3VubG9ja19p cnFyZXN0b3JlKCZmbGFncyk7CisKKwlpZiAob2xkX3JkKQorCQljYWxsX3JjdV9zY2hlZCgmb2xk X3JkLT5yY3UsIGZyZWVfcm9vdGRvbWFpbik7Cit9CisKK3N0YXRpYyBpbnQgaW5pdF9yb290ZG9t YWluKHN0cnVjdCByb290X2RvbWFpbiAqcmQpCit7CisJbWVtc2V0KHJkLCAwLCBzaXplb2YoKnJk KSk7CisKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+c3BhbiwgR0ZQX0tFUk5FTCkpCisJ CWdvdG8gb3V0OworCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5vbmxpbmUsIEdGUF9LRVJO RUwpKQorCQlnb3RvIGZyZWVfc3BhbjsKKwlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyKCZyZC0+cnRv X21hc2ssIEdGUF9LRVJORUwpKQorCQlnb3RvIGZyZWVfb25saW5lOworCisJaWYgKGNwdXByaV9p bml0KCZyZC0+Y3B1cHJpKSAhPSAwKQorCQlnb3RvIGZyZWVfcnRvX21hc2s7CisJcmV0dXJuIDA7 CisKK2ZyZWVfcnRvX21hc2s6CisJZnJlZV9jcHVtYXNrX3ZhcihyZC0+cnRvX21hc2spOworZnJl ZV9vbmxpbmU6CisJZnJlZV9jcHVtYXNrX3ZhcihyZC0+b25saW5lKTsKK2ZyZWVfc3BhbjoKKwlm cmVlX2NwdW1hc2tfdmFyKHJkLT5zcGFuKTsKK291dDoKKwlyZXR1cm4gLUVOT01FTTsKK30KKwor c3RhdGljIHZvaWQgaW5pdF9kZWZyb290ZG9tYWluKHZvaWQpCit7CisJaW5pdF9yb290ZG9tYWlu KCZkZWZfcm9vdF9kb21haW4pOworCisJYXRvbWljX3NldCgmZGVmX3Jvb3RfZG9tYWluLnJlZmNv dW50LCAxKTsKK30KKworc3RhdGljIHN0cnVjdCByb290X2RvbWFpbiAqYWxsb2Nfcm9vdGRvbWFp bih2b2lkKQoreworCXN0cnVjdCByb290X2RvbWFpbiAqcmQ7CisKKwlyZCA9IGttYWxsb2Moc2l6 ZW9mKCpyZCksIEdGUF9LRVJORUwpOworCWlmICghcmQpCisJCXJldHVybiBOVUxMOworCisJaWYg KGluaXRfcm9vdGRvbWFpbihyZCkgIT0gMCkgeworCQlrZnJlZShyZCk7CisJCXJldHVybiBOVUxM OworCX0KKworCXJldHVybiByZDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9zY2hlZF9ncm91cHMo c3RydWN0IHNjaGVkX2dyb3VwICpzZywgaW50IGZyZWVfc2dwKQoreworCXN0cnVjdCBzY2hlZF9n cm91cCAqdG1wLCAqZmlyc3Q7CisKKwlpZiAoIXNnKQorCQlyZXR1cm47CisKKwlmaXJzdCA9IHNn OworCWRvIHsKKwkJdG1wID0gc2ctPm5leHQ7CisKKwkJaWYgKGZyZWVfc2dwICYmIGF0b21pY19k ZWNfYW5kX3Rlc3QoJnNnLT5zZ3AtPnJlZikpCisJCQlrZnJlZShzZy0+c2dwKTsKKworCQlrZnJl ZShzZyk7CisJCXNnID0gdG1wOworCX0gd2hpbGUgKHNnICE9IGZpcnN0KTsKK30KKworc3RhdGlj IHZvaWQgZnJlZV9zY2hlZF9kb21haW4oc3RydWN0IHJjdV9oZWFkICpyY3UpCit7CisJc3RydWN0 IHNjaGVkX2RvbWFpbiAqc2QgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgc2NoZWRfZG9tYWlu LCByY3UpOworCisJLyoKKwkgKiBJZiBpdHMgYW4gb3ZlcmxhcHBpbmcgZG9tYWluIGl0IGhhcyBw cml2YXRlIGdyb3VwcywgaXRlcmF0ZSBhbmQKKwkgKiBudWtlIHRoZW0gYWxsLgorCSAqLworCWlm IChzZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSB7CisJCWZyZWVfc2NoZWRfZ3JvdXBzKHNkLT5ncm91 cHMsIDEpOworCX0gZWxzZSBpZiAoYXRvbWljX2RlY19hbmRfdGVzdCgmc2QtPmdyb3Vwcy0+cmVm KSkgeworCQlrZnJlZShzZC0+Z3JvdXBzLT5zZ3ApOworCQlrZnJlZShzZC0+Z3JvdXBzKTsKKwl9 CisJa2ZyZWUoc2QpOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbihzdHJ1 Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3sKKwljYWxsX3JjdSgmc2QtPnJjdSwgZnJl ZV9zY2hlZF9kb21haW4pOworfQorCitzdGF0aWMgdm9pZCBkZXN0cm95X3NjaGVkX2RvbWFpbnMo c3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit7CisJZm9yICg7IHNkOyBzZCA9IHNk LT5wYXJlbnQpCisJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHNkLCBjcHUpOworfQorCisvKgorICog QXR0YWNoIHRoZSBkb21haW4gJ3NkJyB0byAnY3B1JyBhcyBpdHMgYmFzZSBkb21haW4uIENhbGxl cnMgbXVzdAorICogaG9sZCB0aGUgaG90cGx1ZyBsb2NrLgorICovCitzdGF0aWMgdm9pZAorY3B1 X2F0dGFjaF9kb21haW4oc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIHN0cnVjdCByb290X2RvbWFp biAqcmQsIGludCBjcHUpCit7CisJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCXN0cnVj dCBzY2hlZF9kb21haW4gKnRtcDsKKworCS8qIFJlbW92ZSB0aGUgc2NoZWQgZG9tYWlucyB3aGlj aCBkbyBub3QgY29udHJpYnV0ZSB0byBzY2hlZHVsaW5nLiAqLworCWZvciAodG1wID0gc2Q7IHRt cDsgKSB7CisJCXN0cnVjdCBzY2hlZF9kb21haW4gKnBhcmVudCA9IHRtcC0+cGFyZW50OworCQlp ZiAoIXBhcmVudCkKKwkJCWJyZWFrOworCisJCWlmIChzZF9wYXJlbnRfZGVnZW5lcmF0ZSh0bXAs IHBhcmVudCkpIHsKKwkJCXRtcC0+cGFyZW50ID0gcGFyZW50LT5wYXJlbnQ7CisJCQlpZiAocGFy ZW50LT5wYXJlbnQpCisJCQkJcGFyZW50LT5wYXJlbnQtPmNoaWxkID0gdG1wOworCQkJZGVzdHJv eV9zY2hlZF9kb21haW4ocGFyZW50LCBjcHUpOworCQl9IGVsc2UKKwkJCXRtcCA9IHRtcC0+cGFy ZW50OworCX0KKworCWlmIChzZCAmJiBzZF9kZWdlbmVyYXRlKHNkKSkgeworCQl0bXAgPSBzZDsK KwkJc2QgPSBzZC0+cGFyZW50OworCQlkZXN0cm95X3NjaGVkX2RvbWFpbih0bXAsIGNwdSk7CisJ CWlmIChzZCkKKwkJCXNkLT5jaGlsZCA9IE5VTEw7CisJfQorCisJc2NoZWRfZG9tYWluX2RlYnVn KHNkLCBjcHUpOworCisJcnFfYXR0YWNoX3Jvb3QocnEsIHJkKTsKKwl0bXAgPSBycS0+c2Q7CisJ cmN1X2Fzc2lnbl9wb2ludGVyKHJxLT5zZCwgc2QpOworCWRlc3Ryb3lfc2NoZWRfZG9tYWlucyh0 bXAsIGNwdSk7Cit9CisKKy8qIGNwdXMgd2l0aCBpc29sYXRlZCBkb21haW5zICovCitzdGF0aWMg Y3B1bWFza192YXJfdCBjcHVfaXNvbGF0ZWRfbWFwOworCisvKiBTZXR1cCB0aGUgbWFzayBvZiBj cHVzIGNvbmZpZ3VyZWQgZm9yIGlzb2xhdGVkIGRvbWFpbnMgKi8KK3N0YXRpYyBpbnQgX19pbml0 IGlzb2xhdGVkX2NwdV9zZXR1cChjaGFyICpzdHIpCit7CisJYWxsb2NfYm9vdG1lbV9jcHVtYXNr X3ZhcigmY3B1X2lzb2xhdGVkX21hcCk7CisJY3B1bGlzdF9wYXJzZShzdHIsIGNwdV9pc29sYXRl ZF9tYXApOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJpc29sY3B1cz0iLCBpc29sYXRlZF9j cHVfc2V0dXApOworCisjZGVmaW5lIFNEX05PREVTX1BFUl9ET01BSU4gMTYKKworI2lmZGVmIENP TkZJR19OVU1BCisKKy8qKgorICogZmluZF9uZXh0X2Jlc3Rfbm9kZSAtIGZpbmQgdGhlIG5leHQg bm9kZSB0byBpbmNsdWRlIGluIGEgc2NoZWRfZG9tYWluCisgKiBAbm9kZTogbm9kZSB3aG9zZSBz Y2hlZF9kb21haW4gd2UncmUgYnVpbGRpbmcKKyAqIEB1c2VkX25vZGVzOiBub2RlcyBhbHJlYWR5 IGluIHRoZSBzY2hlZF9kb21haW4KKyAqCisgKiBGaW5kIHRoZSBuZXh0IG5vZGUgdG8gaW5jbHVk ZSBpbiBhIGdpdmVuIHNjaGVkdWxpbmcgZG9tYWluLiBTaW1wbHkKKyAqIGZpbmRzIHRoZSBjbG9z ZXN0IG5vZGUgbm90IGFscmVhZHkgaW4gdGhlIEB1c2VkX25vZGVzIG1hcC4KKyAqCisgKiBTaG91 bGQgdXNlIG5vZGVtYXNrX3QuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9uZXh0X2Jlc3Rfbm9kZShp bnQgbm9kZSwgbm9kZW1hc2tfdCAqdXNlZF9ub2RlcykKK3sKKwlpbnQgaSwgbiwgdmFsLCBtaW5f dmFsLCBiZXN0X25vZGUgPSAtMTsKKworCW1pbl92YWwgPSBJTlRfTUFYOworCisJZm9yIChpID0g MDsgaSA8IG5yX25vZGVfaWRzOyBpKyspIHsKKwkJLyogU3RhcnQgYXQgQG5vZGUgKi8KKwkJbiA9 IChub2RlICsgaSkgJSBucl9ub2RlX2lkczsKKworCQlpZiAoIW5yX2NwdXNfbm9kZShuKSkKKwkJ CWNvbnRpbnVlOworCisJCS8qIFNraXAgYWxyZWFkeSB1c2VkIG5vZGVzICovCisJCWlmIChub2Rl X2lzc2V0KG4sICp1c2VkX25vZGVzKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNpbXBsZSBtaW4g ZGlzdGFuY2Ugc2VhcmNoICovCisJCXZhbCA9IG5vZGVfZGlzdGFuY2Uobm9kZSwgbik7CisKKwkJ aWYgKHZhbCA8IG1pbl92YWwpIHsKKwkJCW1pbl92YWwgPSB2YWw7CisJCQliZXN0X25vZGUgPSBu OworCQl9CisJfQorCisJaWYgKGJlc3Rfbm9kZSAhPSAtMSkKKwkJbm9kZV9zZXQoYmVzdF9ub2Rl LCAqdXNlZF9ub2Rlcyk7CisJcmV0dXJuIGJlc3Rfbm9kZTsKK30KKworLyoqCisgKiBzY2hlZF9k b21haW5fbm9kZV9zcGFuIC0gZ2V0IGEgY3B1bWFzayBmb3IgYSBub2RlJ3Mgc2NoZWRfZG9tYWlu CisgKiBAbm9kZTogbm9kZSB3aG9zZSBjcHVtYXNrIHdlJ3JlIGNvbnN0cnVjdGluZworICogQHNw YW46IHJlc3VsdGluZyBjcHVtYXNrCisgKgorICogR2l2ZW4gYSBub2RlLCBjb25zdHJ1Y3QgYSBn b29kIGNwdW1hc2sgZm9yIGl0cyBzY2hlZF9kb21haW4gdG8gc3Bhbi4gSXQKKyAqIHNob3VsZCBi ZSBvbmUgdGhhdCBwcmV2ZW50cyB1bm5lY2Vzc2FyeSBiYWxhbmNpbmcsIGJ1dCBhbHNvIHNwcmVh ZHMgdGFza3MKKyAqIG91dCBvcHRpbWFsbHkuCisgKi8KK3N0YXRpYyB2b2lkIHNjaGVkX2RvbWFp bl9ub2RlX3NwYW4oaW50IG5vZGUsIHN0cnVjdCBjcHVtYXNrICpzcGFuKQoreworCW5vZGVtYXNr X3QgdXNlZF9ub2RlczsKKwlpbnQgaTsKKworCWNwdW1hc2tfY2xlYXIoc3Bhbik7CisJbm9kZXNf Y2xlYXIodXNlZF9ub2Rlcyk7CisKKwljcHVtYXNrX29yKHNwYW4sIHNwYW4sIGNwdW1hc2tfb2Zf bm9kZShub2RlKSk7CisJbm9kZV9zZXQobm9kZSwgdXNlZF9ub2Rlcyk7CisKKwlmb3IgKGkgPSAx OyBpIDwgU0RfTk9ERVNfUEVSX0RPTUFJTjsgaSsrKSB7CisJCWludCBuZXh0X25vZGUgPSBmaW5k X25leHRfYmVzdF9ub2RlKG5vZGUsICZ1c2VkX25vZGVzKTsKKwkJaWYgKG5leHRfbm9kZSA8IDAp CisJCQlicmVhazsKKwkJY3B1bWFza19vcihzcGFuLCBzcGFuLCBjcHVtYXNrX29mX25vZGUobmV4 dF9ub2RlKSk7CisJfQorfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9ub2Rl X21hc2soaW50IGNwdSkKK3sKKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZzY2hlZF9kb21haW5zX211 dGV4KTsKKworCXNjaGVkX2RvbWFpbl9ub2RlX3NwYW4oY3B1X3RvX25vZGUoY3B1KSwgc2NoZWRf ZG9tYWluc190bXBtYXNrKTsKKworCXJldHVybiBzY2hlZF9kb21haW5zX3RtcG1hc2s7Cit9CisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X2FsbG5vZGVzX21hc2soaW50IGNwdSkK K3sKKwlyZXR1cm4gY3B1X3Bvc3NpYmxlX21hc2s7Cit9CisjZW5kaWYgLyogQ09ORklHX05VTUEg Ki8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfY3B1X21hc2soaW50IGNwdSkK K3sKKwlyZXR1cm4gY3B1bWFza19vZl9ub2RlKGNwdV90b19ub2RlKGNwdSkpOworfQorCitpbnQg c2NoZWRfc210X3Bvd2VyX3NhdmluZ3MgPSAwLCBzY2hlZF9tY19wb3dlcl9zYXZpbmdzID0gMDsK Kworc3RydWN0IHNkX2RhdGEgeworCXN0cnVjdCBzY2hlZF9kb21haW4gKipfX3BlcmNwdSBzZDsK KwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKipfX3BlcmNwdSBzZzsKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXBf cG93ZXIgKipfX3BlcmNwdSBzZ3A7Cit9OworCitzdHJ1Y3Qgc19kYXRhIHsKKwlzdHJ1Y3Qgc2No ZWRfZG9tYWluICoqIF9fcGVyY3B1IHNkOworCXN0cnVjdCByb290X2RvbWFpbgkqcmQ7Cit9Owor CitlbnVtIHNfYWxsb2MgeworCXNhX3Jvb3Rkb21haW4sCisJc2Ffc2QsCisJc2Ffc2Rfc3RvcmFn ZSwKKwlzYV9ub25lLAorfTsKKworc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbDsK KwordHlwZWRlZiBzdHJ1Y3Qgc2NoZWRfZG9tYWluICooKnNjaGVkX2RvbWFpbl9pbml0X2YpKHN0 cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lfbGV2ZWwgKnRsLCBpbnQgY3B1KTsKK3R5cGVkZWYg Y29uc3Qgc3RydWN0IGNwdW1hc2sgKigqc2NoZWRfZG9tYWluX21hc2tfZikoaW50IGNwdSk7CisK KyNkZWZpbmUgU0RUTF9PVkVSTEFQCTB4MDEKKworc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9n eV9sZXZlbCB7CisJc2NoZWRfZG9tYWluX2luaXRfZiBpbml0OworCXNjaGVkX2RvbWFpbl9tYXNr X2YgbWFzazsKKwlpbnQJCQlmbGFnczsKKwlzdHJ1Y3Qgc2RfZGF0YQkgIGRhdGE7Cit9OworCitz dGF0aWMgaW50CitidWlsZF9vdmVybGFwX3NjaGVkX2dyb3VwcyhzdHJ1Y3Qgc2NoZWRfZG9tYWlu ICpzZCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmZpcnN0ID0gTlVMTCwgKmxh c3QgPSBOVUxMLCAqZ3JvdXBzID0gTlVMTCwgKnNnOworCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpz cGFuID0gc2NoZWRfZG9tYWluX3NwYW4oc2QpOworCXN0cnVjdCBjcHVtYXNrICpjb3ZlcmVkID0g c2NoZWRfZG9tYWluc190bXBtYXNrOworCXN0cnVjdCBzZF9kYXRhICpzZGQgPSBzZC0+cHJpdmF0 ZTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpjaGlsZDsKKwlpbnQgaTsKKworCWNwdW1hc2tfY2xl YXIoY292ZXJlZCk7CisKKwlmb3JfZWFjaF9jcHUoaSwgc3BhbikgeworCQlzdHJ1Y3QgY3B1bWFz ayAqc2dfc3BhbjsKKworCQlpZiAoY3B1bWFza190ZXN0X2NwdShpLCBjb3ZlcmVkKSkKKwkJCWNv bnRpbnVlOworCisJCXNnID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2NoZWRfZ3JvdXAp ICsgY3B1bWFza19zaXplKCksCisJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaSkpOworCisJ CWlmICghc2cpCisJCQlnb3RvIGZhaWw7CisKKwkJc2dfc3BhbiA9IHNjaGVkX2dyb3VwX2NwdXMo c2cpOworCisJCWNoaWxkID0gKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGkpOworCQlpZiAoY2hpbGQt PmNoaWxkKSB7CisJCQljaGlsZCA9IGNoaWxkLT5jaGlsZDsKKwkJCWNwdW1hc2tfY29weShzZ19z cGFuLCBzY2hlZF9kb21haW5fc3BhbihjaGlsZCkpOworCQl9IGVsc2UKKwkJCWNwdW1hc2tfc2V0 X2NwdShpLCBzZ19zcGFuKTsKKworCQljcHVtYXNrX29yKGNvdmVyZWQsIGNvdmVyZWQsIHNnX3Nw YW4pOworCisJCXNnLT5zZ3AgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdW1hc2tfZmlyc3Qo c2dfc3BhbikpOworCQlhdG9taWNfaW5jKCZzZy0+c2dwLT5yZWYpOworCisJCWlmIChjcHVtYXNr X3Rlc3RfY3B1KGNwdSwgc2dfc3BhbikpCisJCQlncm91cHMgPSBzZzsKKworCQlpZiAoIWZpcnN0 KQorCQkJZmlyc3QgPSBzZzsKKwkJaWYgKGxhc3QpCisJCQlsYXN0LT5uZXh0ID0gc2c7CisJCWxh c3QgPSBzZzsKKwkJbGFzdC0+bmV4dCA9IGZpcnN0OworCX0KKwlzZC0+Z3JvdXBzID0gZ3JvdXBz OworCisJcmV0dXJuIDA7CisKK2ZhaWw6CisJZnJlZV9zY2hlZF9ncm91cHMoZmlyc3QsIDApOwor CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2dyb3VwKGludCBjcHUsIHN0 cnVjdCBzZF9kYXRhICpzZGQsIHN0cnVjdCBzY2hlZF9ncm91cCAqKnNnKQoreworCXN0cnVjdCBz Y2hlZF9kb21haW4gKnNkID0gKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSk7CisJc3RydWN0IHNj aGVkX2RvbWFpbiAqY2hpbGQgPSBzZC0+Y2hpbGQ7CisKKwlpZiAoY2hpbGQpCisJCWNwdSA9IGNw dW1hc2tfZmlyc3Qoc2NoZWRfZG9tYWluX3NwYW4oY2hpbGQpKTsKKworCWlmIChzZykgeworCQkq c2cgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZywgY3B1KTsKKwkJKCpzZyktPnNncCA9ICpwZXJfY3B1 X3B0cihzZGQtPnNncCwgY3B1KTsKKwkJYXRvbWljX3NldCgmKCpzZyktPnNncC0+cmVmLCAxKTsg LyogZm9yIGNsYWltX2FsbG9jYXRpb25zICovCisJfQorCisJcmV0dXJuIGNwdTsKK30KKworLyoK KyAqIGJ1aWxkX3NjaGVkX2dyb3VwcyB3aWxsIGJ1aWxkIGEgY2lyY3VsYXIgbGlua2VkIGxpc3Qg b2YgdGhlIGdyb3VwcworICogY292ZXJlZCBieSB0aGUgZ2l2ZW4gc3BhbiwgYW5kIHdpbGwgc2V0 IGVhY2ggZ3JvdXAncyAtPmNwdW1hc2sgY29ycmVjdGx5LAorICogYW5kIC0+Y3B1X3Bvd2VyIHRv IDAuCisgKgorICogQXNzdW1lcyB0aGUgc2NoZWRfZG9tYWluIHRyZWUgaXMgZnVsbHkgY29uc3Ry dWN0ZWQKKyAqLworc3RhdGljIGludAorYnVpbGRfc2NoZWRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9k b21haW4gKnNkLCBpbnQgY3B1KQoreworCXN0cnVjdCBzY2hlZF9ncm91cCAqZmlyc3QgPSBOVUxM LCAqbGFzdCA9IE5VTEw7CisJc3RydWN0IHNkX2RhdGEgKnNkZCA9IHNkLT5wcml2YXRlOworCWNv bnN0IHN0cnVjdCBjcHVtYXNrICpzcGFuID0gc2NoZWRfZG9tYWluX3NwYW4oc2QpOworCXN0cnVj dCBjcHVtYXNrICpjb3ZlcmVkOworCWludCBpOworCisJZ2V0X2dyb3VwKGNwdSwgc2RkLCAmc2Qt Pmdyb3Vwcyk7CisJYXRvbWljX2luYygmc2QtPmdyb3Vwcy0+cmVmKTsKKworCWlmIChjcHUgIT0g Y3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihzZCkpKQorCQlyZXR1cm4gMDsKKworCWxv Y2tkZXBfYXNzZXJ0X2hlbGQoJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOworCWNvdmVyZWQgPSBzY2hl ZF9kb21haW5zX3RtcG1hc2s7CisKKwljcHVtYXNrX2NsZWFyKGNvdmVyZWQpOworCisJZm9yX2Vh Y2hfY3B1KGksIHNwYW4pIHsKKwkJc3RydWN0IHNjaGVkX2dyb3VwICpzZzsKKwkJaW50IGdyb3Vw ID0gZ2V0X2dyb3VwKGksIHNkZCwgJnNnKTsKKwkJaW50IGo7CisKKwkJaWYgKGNwdW1hc2tfdGVz dF9jcHUoaSwgY292ZXJlZCkpCisJCQljb250aW51ZTsKKworCQljcHVtYXNrX2NsZWFyKHNjaGVk X2dyb3VwX2NwdXMoc2cpKTsKKwkJc2ctPnNncC0+cG93ZXIgPSAwOworCisJCWZvcl9lYWNoX2Nw dShqLCBzcGFuKSB7CisJCQlpZiAoZ2V0X2dyb3VwKGosIHNkZCwgTlVMTCkgIT0gZ3JvdXApCisJ CQkJY29udGludWU7CisKKwkJCWNwdW1hc2tfc2V0X2NwdShqLCBjb3ZlcmVkKTsKKwkJCWNwdW1h c2tfc2V0X2NwdShqLCBzY2hlZF9ncm91cF9jcHVzKHNnKSk7CisJCX0KKworCQlpZiAoIWZpcnN0 KQorCQkJZmlyc3QgPSBzZzsKKwkJaWYgKGxhc3QpCisJCQlsYXN0LT5uZXh0ID0gc2c7CisJCWxh c3QgPSBzZzsKKwl9CisJbGFzdC0+bmV4dCA9IGZpcnN0OworCisJcmV0dXJuIDA7Cit9CisKKy8q CisgKiBJbml0aWFsaXplcnMgZm9yIHNjaGVkdWxlIGRvbWFpbnMKKyAqIE5vbi1pbmxpbmVkIHRv IHJlZHVjZSBhY2N1bXVsYXRlZCBzdGFjayBwcmVzc3VyZSBpbiBidWlsZF9zY2hlZF9kb21haW5z KCkKKyAqLworCisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisjIGRlZmluZSBTRF9JTklUX05B TUUoc2QsIHR5cGUpCQlzZC0+bmFtZSA9ICN0eXBlCisjZWxzZQorIyBkZWZpbmUgU0RfSU5JVF9O QU1FKHNkLCB0eXBlKQkJZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgU0RfSU5J VF9GVU5DKHR5cGUpCQkJCQkJXAorc3RhdGljIG5vaW5saW5lIHN0cnVjdCBzY2hlZF9kb21haW4g KgkJCQkJXAorc2RfaW5pdF8jI3R5cGUoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZl bCAqdGwsIGludCBjcHUpIAlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBzY2hlZF9kb21haW4gKnNk ID0gKnBlcl9jcHVfcHRyKHRsLT5kYXRhLnNkLCBjcHUpOwlcCisJKnNkID0gU0RfIyN0eXBlIyNf SU5JVDsJCQkJCQlcCisJU0RfSU5JVF9OQU1FKHNkLCB0eXBlKTsJCQkJCQlcCisJc2QtPnByaXZh dGUgPSAmdGwtPmRhdGE7CQkJCQlcCisJcmV0dXJuIHNkOwkJCQkJCQlcCit9CisKK1NEX0lOSVRf RlVOQyhDUFUpCisjaWZkZWYgQ09ORklHX05VTUEKKyBTRF9JTklUX0ZVTkMoQUxMTk9ERVMpCisg U0RfSU5JVF9GVU5DKE5PREUpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisgU0Rf SU5JVF9GVU5DKFNJQkxJTkcpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfTUMKKyBTRF9J TklUX0ZVTkMoTUMpCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfQk9PSworIFNEX0lOSVRf RlVOQyhCT09LKQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZGVmYXVsdF9yZWxheF9kb21haW5fbGV2 ZWwgPSAtMTsKK2ludCBzY2hlZF9kb21haW5fbGV2ZWxfbWF4OworCitzdGF0aWMgaW50IF9faW5p dCBzZXR1cF9yZWxheF9kb21haW5fbGV2ZWwoY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxvbmcg dmFsOworCisJdmFsID0gc2ltcGxlX3N0cnRvdWwoc3RyLCBOVUxMLCAwKTsKKwlpZiAodmFsIDwg c2NoZWRfZG9tYWluX2xldmVsX21heCkKKwkJZGVmYXVsdF9yZWxheF9kb21haW5fbGV2ZWwgPSB2 YWw7CisKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoInJlbGF4X2RvbWFpbl9sZXZlbD0iLCBzZXR1 cF9yZWxheF9kb21haW5fbGV2ZWwpOworCitzdGF0aWMgdm9pZCBzZXRfZG9tYWluX2F0dHJpYnV0 ZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwKKwkJCQkgc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRy ICphdHRyKQoreworCWludCByZXF1ZXN0OworCisJaWYgKCFhdHRyIHx8IGF0dHItPnJlbGF4X2Rv bWFpbl9sZXZlbCA8IDApIHsKKwkJaWYgKGRlZmF1bHRfcmVsYXhfZG9tYWluX2xldmVsIDwgMCkK KwkJCXJldHVybjsKKwkJZWxzZQorCQkJcmVxdWVzdCA9IGRlZmF1bHRfcmVsYXhfZG9tYWluX2xl dmVsOworCX0gZWxzZQorCQlyZXF1ZXN0ID0gYXR0ci0+cmVsYXhfZG9tYWluX2xldmVsOworCWlm IChyZXF1ZXN0IDwgc2QtPmxldmVsKSB7CisJCS8qIHR1cm4gb2ZmIGlkbGUgYmFsYW5jZSBvbiB0 aGlzIGRvbWFpbiAqLworCQlzZC0+ZmxhZ3MgJj0gfihTRF9CQUxBTkNFX1dBS0V8U0RfQkFMQU5D RV9ORVdJRExFKTsKKwl9IGVsc2UgeworCQkvKiB0dXJuIG9uIGlkbGUgYmFsYW5jZSBvbiB0aGlz IGRvbWFpbiAqLworCQlzZC0+ZmxhZ3MgfD0gKFNEX0JBTEFOQ0VfV0FLRXxTRF9CQUxBTkNFX05F V0lETEUpOworCX0KK30KKworc3RhdGljIHZvaWQgX19zZHRfZnJlZShjb25zdCBzdHJ1Y3QgY3B1 bWFzayAqY3B1X21hcCk7CitzdGF0aWMgaW50IF9fc2R0X2FsbG9jKGNvbnN0IHN0cnVjdCBjcHVt YXNrICpjcHVfbWFwKTsKKworc3RhdGljIHZvaWQgX19mcmVlX2RvbWFpbl9hbGxvY3Moc3RydWN0 IHNfZGF0YSAqZCwgZW51bSBzX2FsbG9jIHdoYXQsCisJCQkJIGNvbnN0IHN0cnVjdCBjcHVtYXNr ICpjcHVfbWFwKQoreworCXN3aXRjaCAod2hhdCkgeworCWNhc2Ugc2Ffcm9vdGRvbWFpbjoKKwkJ aWYgKCFhdG9taWNfcmVhZCgmZC0+cmQtPnJlZmNvdW50KSkKKwkJCWZyZWVfcm9vdGRvbWFpbigm ZC0+cmQtPnJjdSk7IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2Ugc2Ffc2Q6CisJCWZyZWVfcGVy Y3B1KGQtPnNkKTsgLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBzYV9zZF9zdG9yYWdlOgorCQlf X3NkdF9mcmVlKGNwdV9tYXApOyAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIHNhX25vbmU6CisJ CWJyZWFrOworCX0KK30KKworc3RhdGljIGVudW0gc19hbGxvYyBfX3Zpc2l0X2RvbWFpbl9hbGxv Y2F0aW9uX2hlbGwoc3RydWN0IHNfZGF0YSAqZCwKKwkJCQkJCSAgIGNvbnN0IHN0cnVjdCBjcHVt YXNrICpjcHVfbWFwKQoreworCW1lbXNldChkLCAwLCBzaXplb2YoKmQpKTsKKworCWlmIChfX3Nk dF9hbGxvYyhjcHVfbWFwKSkKKwkJcmV0dXJuIHNhX3NkX3N0b3JhZ2U7CisJZC0+c2QgPSBhbGxv Y19wZXJjcHUoc3RydWN0IHNjaGVkX2RvbWFpbiAqKTsKKwlpZiAoIWQtPnNkKQorCQlyZXR1cm4g c2Ffc2Rfc3RvcmFnZTsKKwlkLT5yZCA9IGFsbG9jX3Jvb3Rkb21haW4oKTsKKwlpZiAoIWQtPnJk KQorCQlyZXR1cm4gc2Ffc2Q7CisJcmV0dXJuIHNhX3Jvb3Rkb21haW47Cit9CisKKy8qCisgKiBO VUxMIHRoZSBzZF9kYXRhIGVsZW1lbnRzIHdlJ3ZlIHVzZWQgdG8gYnVpbGQgdGhlIHNjaGVkX2Rv bWFpbiBhbmQKKyAqIHNjaGVkX2dyb3VwIHN0cnVjdHVyZSBzbyB0aGF0IHRoZSBzdWJzZXF1ZW50 IF9fZnJlZV9kb21haW5fYWxsb2NzKCkKKyAqIHdpbGwgbm90IGZyZWUgdGhlIGRhdGEgd2UncmUg dXNpbmcuCisgKi8KK3N0YXRpYyB2b2lkIGNsYWltX2FsbG9jYXRpb25zKGludCBjcHUsIHN0cnVj dCBzY2hlZF9kb21haW4gKnNkKQoreworCXN0cnVjdCBzZF9kYXRhICpzZGQgPSBzZC0+cHJpdmF0 ZTsKKworCVdBUk5fT05fT05DRSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KSAhPSBzZCk7CisJ KnBlcl9jcHVfcHRyKHNkZC0+c2QsIGNwdSkgPSBOVUxMOworCisJaWYgKGF0b21pY19yZWFkKCYo KnBlcl9jcHVfcHRyKHNkZC0+c2csIGNwdSkpLT5yZWYpKQorCQkqcGVyX2NwdV9wdHIoc2RkLT5z ZywgY3B1KSA9IE5VTEw7CisKKwlpZiAoYXRvbWljX3JlYWQoJigqcGVyX2NwdV9wdHIoc2RkLT5z Z3AsIGNwdSkpLT5yZWYpKQorCQkqcGVyX2NwdV9wdHIoc2RkLT5zZ3AsIGNwdSkgPSBOVUxMOwor fQorCisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVtYXNr ICpjcHVfc210X21hc2soaW50IGNwdSkKK3sKKwlyZXR1cm4gdG9wb2xvZ3lfdGhyZWFkX2NwdW1h c2soY3B1KTsKK30KKyNlbmRpZgorCisvKgorICogVG9wb2xvZ3kgbGlzdCwgYm90dG9tLXVwLgor ICovCitzdGF0aWMgc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCBkZWZhdWx0X3Rv cG9sb2d5W10gPSB7CisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorCXsgc2RfaW5pdF9TSUJMSU5H LCBjcHVfc210X21hc2ssIH0sCisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfTUMKKwl7IHNk X2luaXRfTUMsIGNwdV9jb3JlZ3JvdXBfbWFzaywgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19T Q0hFRF9CT09LCisJeyBzZF9pbml0X0JPT0ssIGNwdV9ib29rX21hc2ssIH0sCisjZW5kaWYKKwl7 IHNkX2luaXRfQ1BVLCBjcHVfY3B1X21hc2ssIH0sCisjaWZkZWYgQ09ORklHX05VTUEKKwl7IHNk X2luaXRfTk9ERSwgY3B1X25vZGVfbWFzaywgU0RUTF9PVkVSTEFQLCB9LAorCXsgc2RfaW5pdF9B TExOT0RFUywgY3B1X2FsbG5vZGVzX21hc2ssIH0sCisjZW5kaWYKKwl7IE5VTEwsIH0sCit9Owor CitzdGF0aWMgc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqc2NoZWRfZG9tYWlu X3RvcG9sb2d5ID0gZGVmYXVsdF90b3BvbG9neTsKKworc3RhdGljIGludCBfX3NkdF9hbGxvYyhj b25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3Rv cG9sb2d5X2xldmVsICp0bDsKKwlpbnQgajsKKworCWZvciAodGwgPSBzY2hlZF9kb21haW5fdG9w b2xvZ3k7IHRsLT5pbml0OyB0bCsrKSB7CisJCXN0cnVjdCBzZF9kYXRhICpzZGQgPSAmdGwtPmRh dGE7CisKKwkJc2RkLT5zZCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRfZG9tYWluICopOwor CQlpZiAoIXNkZC0+c2QpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlzZGQtPnNnID0gYWxsb2Nf cGVyY3B1KHN0cnVjdCBzY2hlZF9ncm91cCAqKTsKKwkJaWYgKCFzZGQtPnNnKQorCQkJcmV0dXJu IC1FTk9NRU07CisKKwkJc2RkLT5zZ3AgPSBhbGxvY19wZXJjcHUoc3RydWN0IHNjaGVkX2dyb3Vw X3Bvd2VyICopOworCQlpZiAoIXNkZC0+c2dwKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJZm9y X2VhY2hfY3B1KGosIGNwdV9tYXApIHsKKwkJCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCQkJ c3RydWN0IHNjaGVkX2dyb3VwICpzZzsKKwkJCXN0cnVjdCBzY2hlZF9ncm91cF9wb3dlciAqc2dw OworCisJCQkgICAJc2QgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9kb21haW4p ICsgY3B1bWFza19zaXplKCksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGopKTsKKwkJ CWlmICghc2QpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCSpwZXJfY3B1X3B0cihzZGQtPnNk LCBqKSA9IHNkOworCisJCQlzZyA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2dy b3VwKSArIGNwdW1hc2tfc2l6ZSgpLAorCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShqKSk7 CisJCQlpZiAoIXNnKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkqcGVyX2NwdV9wdHIoc2Rk LT5zZywgaikgPSBzZzsKKworCQkJc2dwID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2No ZWRfZ3JvdXBfcG93ZXIpLAorCQkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShqKSk7CisJCQlp ZiAoIXNncCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJKnBlcl9jcHVfcHRyKHNkZC0+c2dw LCBqKSA9IHNncDsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX3Nk dF9mcmVlKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwKQoreworCXN0cnVjdCBzY2hlZF9k b21haW5fdG9wb2xvZ3lfbGV2ZWwgKnRsOworCWludCBqOworCisJZm9yICh0bCA9IHNjaGVkX2Rv bWFpbl90b3BvbG9neTsgdGwtPmluaXQ7IHRsKyspIHsKKwkJc3RydWN0IHNkX2RhdGEgKnNkZCA9 ICZ0bC0+ZGF0YTsKKworCQlmb3JfZWFjaF9jcHUoaiwgY3B1X21hcCkgeworCQkJc3RydWN0IHNj aGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaik7CisJCQlpZiAoc2QgJiYg KHNkLT5mbGFncyAmIFNEX09WRVJMQVApKQorCQkJCWZyZWVfc2NoZWRfZ3JvdXBzKHNkLT5ncm91 cHMsIDApOworCQkJa2ZyZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2QsIGopKTsKKwkJCWtmcmVlKCpw ZXJfY3B1X3B0cihzZGQtPnNnLCBqKSk7CisJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZ3As IGopKTsKKwkJfQorCQlmcmVlX3BlcmNwdShzZGQtPnNkKTsKKwkJZnJlZV9wZXJjcHUoc2RkLT5z Zyk7CisJCWZyZWVfcGVyY3B1KHNkZC0+c2dwKTsKKwl9Cit9CisKK3N0cnVjdCBzY2hlZF9kb21h aW4gKmJ1aWxkX3NjaGVkX2RvbWFpbihzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVs ICp0bCwKKwkJc3RydWN0IHNfZGF0YSAqZCwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXAs CisJCXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0ciwgc3RydWN0IHNjaGVkX2RvbWFpbiAq Y2hpbGQsCisJCWludCBjcHUpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QgPSB0bC0+aW5p dCh0bCwgY3B1KTsKKwlpZiAoIXNkKQorCQlyZXR1cm4gY2hpbGQ7CisKKwlzZXRfZG9tYWluX2F0 dHJpYnV0ZShzZCwgYXR0cik7CisJY3B1bWFza19hbmQoc2NoZWRfZG9tYWluX3NwYW4oc2QpLCBj cHVfbWFwLCB0bC0+bWFzayhjcHUpKTsKKwlpZiAoY2hpbGQpIHsKKwkJc2QtPmxldmVsID0gY2hp bGQtPmxldmVsICsgMTsKKwkJc2NoZWRfZG9tYWluX2xldmVsX21heCA9IG1heChzY2hlZF9kb21h aW5fbGV2ZWxfbWF4LCBzZC0+bGV2ZWwpOworCQljaGlsZC0+cGFyZW50ID0gc2Q7CisJfQorCXNk LT5jaGlsZCA9IGNoaWxkOworCisJcmV0dXJuIHNkOworfQorCisvKgorICogQnVpbGQgc2NoZWQg ZG9tYWlucyBmb3IgYSBnaXZlbiBzZXQgb2YgY3B1cyBhbmQgYXR0YWNoIHRoZSBzY2hlZCBkb21h aW5zCisgKiB0byB0aGUgaW5kaXZpZHVhbCBjcHVzCisgKi8KK3N0YXRpYyBpbnQgYnVpbGRfc2No ZWRfZG9tYWlucyhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1X21hcCwKKwkJCQkgICBzdHJ1Y3Qg c2NoZWRfZG9tYWluX2F0dHIgKmF0dHIpCit7CisJZW51bSBzX2FsbG9jIGFsbG9jX3N0YXRlID0g c2Ffbm9uZTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwlzdHJ1Y3Qgc19kYXRhIGQ7CisJ aW50IGksIHJldCA9IC1FTk9NRU07CisKKwlhbGxvY19zdGF0ZSA9IF9fdmlzaXRfZG9tYWluX2Fs bG9jYXRpb25faGVsbCgmZCwgY3B1X21hcCk7CisJaWYgKGFsbG9jX3N0YXRlICE9IHNhX3Jvb3Rk b21haW4pCisJCWdvdG8gZXJyb3I7CisKKwkvKiBTZXQgdXAgZG9tYWlucyBmb3IgY3B1cyBzcGVj aWZpZWQgYnkgdGhlIGNwdV9tYXAuICovCisJZm9yX2VhY2hfY3B1KGksIGNwdV9tYXApIHsKKwkJ c3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGw7CisKKwkJc2QgPSBOVUxMOwor CQlmb3IgKHRsID0gc2NoZWRfZG9tYWluX3RvcG9sb2d5OyB0bC0+aW5pdDsgdGwrKykgeworCQkJ c2QgPSBidWlsZF9zY2hlZF9kb21haW4odGwsICZkLCBjcHVfbWFwLCBhdHRyLCBzZCwgaSk7CisJ CQlpZiAodGwtPmZsYWdzICYgU0RUTF9PVkVSTEFQKQorCQkJCXNkLT5mbGFncyB8PSBTRF9PVkVS TEFQOworCQkJaWYgKGNwdW1hc2tfZXF1YWwoY3B1X21hcCwgc2NoZWRfZG9tYWluX3NwYW4oc2Qp KSkKKwkJCQlicmVhazsKKwkJfQorCisJCXdoaWxlIChzZC0+Y2hpbGQpCisJCQlzZCA9IHNkLT5j aGlsZDsKKworCQkqcGVyX2NwdV9wdHIoZC5zZCwgaSkgPSBzZDsKKwl9CisKKwkvKiBCdWlsZCB0 aGUgZ3JvdXBzIGZvciB0aGUgZG9tYWlucyAqLworCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKSB7 CisJCWZvciAoc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7IHNkOyBzZCA9IHNkLT5wYXJlbnQp IHsKKwkJCXNkLT5zcGFuX3dlaWdodCA9IGNwdW1hc2tfd2VpZ2h0KHNjaGVkX2RvbWFpbl9zcGFu KHNkKSk7CisJCQlpZiAoc2QtPmZsYWdzICYgU0RfT1ZFUkxBUCkgeworCQkJCWlmIChidWlsZF9v dmVybGFwX3NjaGVkX2dyb3VwcyhzZCwgaSkpCisJCQkJCWdvdG8gZXJyb3I7CisJCQl9IGVsc2Ug eworCQkJCWlmIChidWlsZF9zY2hlZF9ncm91cHMoc2QsIGkpKQorCQkJCQlnb3RvIGVycm9yOwor CQkJfQorCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIENQVSBwb3dlciBmb3IgcGh5c2ljYWwgcGFj a2FnZXMgYW5kIG5vZGVzICovCisJZm9yIChpID0gbnJfY3B1bWFza19iaXRzLTE7IGkgPj0gMDsg aS0tKSB7CisJCWlmICghY3B1bWFza190ZXN0X2NwdShpLCBjcHVfbWFwKSkKKwkJCWNvbnRpbnVl OworCisJCWZvciAoc2QgPSAqcGVyX2NwdV9wdHIoZC5zZCwgaSk7IHNkOyBzZCA9IHNkLT5wYXJl bnQpIHsKKwkJCWNsYWltX2FsbG9jYXRpb25zKGksIHNkKTsKKwkJfQorCX0KKworCS8qIEF0dGFj aCB0aGUgZG9tYWlucyAqLworCXJjdV9yZWFkX2xvY2soKTsKKwlmb3JfZWFjaF9jcHUoaSwgY3B1 X21hcCkgeworCQlzZCA9ICpwZXJfY3B1X3B0cihkLnNkLCBpKTsKKwkJY3B1X2F0dGFjaF9kb21h aW4oc2QsIGQucmQsIGkpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldCA9IDA7Citl cnJvcjoKKwlfX2ZyZWVfZG9tYWluX2FsbG9jcygmZCwgYWxsb2Nfc3RhdGUsIGNwdV9tYXApOwor CXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjcHVtYXNrX3Zhcl90ICpkb21zX2N1cjsJLyogY3Vy cmVudCBzY2hlZCBkb21haW5zICovCitzdGF0aWMgaW50IG5kb21zX2N1cjsJCS8qIG51bWJlciBv ZiBzY2hlZCBkb21haW5zIGluICdkb21zX2N1cicgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9t YWluX2F0dHIgKmRhdHRyX2N1cjsKKwkJCQkvKiBhdHRyaWJ1ZXMgb2YgY3VzdG9tIGRvbWFpbnMg aW4gJ2RvbXNfY3VyJyAqLworCisvKgorICogU3BlY2lhbCBjYXNlOiBJZiBhIGttYWxsb2Mgb2Yg YSBkb21zX2N1ciBwYXJ0aXRpb24gKGFycmF5IG9mCisgKiBjcHVtYXNrKSBmYWlscywgdGhlbiBm YWxsYmFjayB0byBhIHNpbmdsZSBzY2hlZCBkb21haW4sCisgKiBhcyBkZXRlcm1pbmVkIGJ5IHRo ZSBzaW5nbGUgY3B1bWFzayBmYWxsYmFja19kb21zLgorICovCitzdGF0aWMgY3B1bWFza192YXJf dCBmYWxsYmFja19kb21zOworCisvKgorICogYXJjaF91cGRhdGVfY3B1X3RvcG9sb2d5IGxldHMg dmlydHVhbGl6ZWQgYXJjaGl0ZWN0dXJlcyB1cGRhdGUgdGhlCisgKiBjcHUgY29yZSBtYXBzLiBJ dCBpcyBzdXBwb3NlZCB0byByZXR1cm4gMSBpZiB0aGUgdG9wb2xvZ3kgY2hhbmdlZAorICogb3Ig MCBpZiBpdCBzdGF5ZWQgdGhlIHNhbWUuCisgKi8KK2ludCBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkg YXJjaF91cGRhdGVfY3B1X3RvcG9sb2d5KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CisKK2NwdW1h c2tfdmFyX3QgKmFsbG9jX3NjaGVkX2RvbWFpbnModW5zaWduZWQgaW50IG5kb21zKQoreworCWlu dCBpOworCWNwdW1hc2tfdmFyX3QgKmRvbXM7CisKKwlkb21zID0ga21hbGxvYyhzaXplb2YoKmRv bXMpICogbmRvbXMsIEdGUF9LRVJORUwpOworCWlmICghZG9tcykKKwkJcmV0dXJuIE5VTEw7CisJ Zm9yIChpID0gMDsgaSA8IG5kb21zOyBpKyspIHsKKwkJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigm ZG9tc1tpXSwgR0ZQX0tFUk5FTCkpIHsKKwkJCWZyZWVfc2NoZWRfZG9tYWlucyhkb21zLCBpKTsK KwkJCXJldHVybiBOVUxMOworCQl9CisJfQorCXJldHVybiBkb21zOworfQorCit2b2lkIGZyZWVf c2NoZWRfZG9tYWlucyhjcHVtYXNrX3Zhcl90IGRvbXNbXSwgdW5zaWduZWQgaW50IG5kb21zKQor eworCXVuc2lnbmVkIGludCBpOworCWZvciAoaSA9IDA7IGkgPCBuZG9tczsgaSsrKQorCQlmcmVl X2NwdW1hc2tfdmFyKGRvbXNbaV0pOworCWtmcmVlKGRvbXMpOworfQorCisvKgorICogU2V0IHVw IHNjaGVkdWxlciBkb21haW5zIGFuZCBncm91cHMuIENhbGxlcnMgbXVzdCBob2xkIHRoZSBob3Rw bHVnIGxvY2suCisgKiBGb3Igbm93IHRoaXMganVzdCBleGNsdWRlcyBpc29sYXRlZCBjcHVzLCBi dXQgY291bGQgYmUgdXNlZCB0bworICogZXhjbHVkZSBvdGhlciBzcGVjaWFsIGNhc2VzIGluIHRo ZSBmdXR1cmUuCisgKi8KK3N0YXRpYyBpbnQgaW5pdF9zY2hlZF9kb21haW5zKGNvbnN0IHN0cnVj dCBjcHVtYXNrICpjcHVfbWFwKQoreworCWludCBlcnI7CisKKwlhcmNoX3VwZGF0ZV9jcHVfdG9w b2xvZ3koKTsKKwluZG9tc19jdXIgPSAxOworCWRvbXNfY3VyID0gYWxsb2Nfc2NoZWRfZG9tYWlu cyhuZG9tc19jdXIpOworCWlmICghZG9tc19jdXIpCisJCWRvbXNfY3VyID0gJmZhbGxiYWNrX2Rv bXM7CisJY3B1bWFza19hbmRub3QoZG9tc19jdXJbMF0sIGNwdV9tYXAsIGNwdV9pc29sYXRlZF9t YXApOworCWRhdHRyX2N1ciA9IE5VTEw7CisJZXJyID0gYnVpbGRfc2NoZWRfZG9tYWlucyhkb21z X2N1clswXSwgTlVMTCk7CisJcmVnaXN0ZXJfc2NoZWRfZG9tYWluX3N5c2N0bCgpOworCisJcmV0 dXJuIGVycjsKK30KKworLyoKKyAqIERldGFjaCBzY2hlZCBkb21haW5zIGZyb20gYSBncm91cCBv ZiBjcHVzIHNwZWNpZmllZCBpbiBjcHVfbWFwCisgKiBUaGVzZSBjcHVzIHdpbGwgbm93IGJlIGF0 dGFjaGVkIHRvIHRoZSBOVUxMIGRvbWFpbgorICovCitzdGF0aWMgdm9pZCBkZXRhY2hfZGVzdHJv eV9kb21haW5zKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwKQoreworCWludCBpOworCisJ cmN1X3JlYWRfbG9jaygpOworCWZvcl9lYWNoX2NwdShpLCBjcHVfbWFwKQorCQljcHVfYXR0YWNo X2RvbWFpbihOVUxMLCAmZGVmX3Jvb3RfZG9tYWluLCBpKTsKKwlyY3VfcmVhZF91bmxvY2soKTsK K30KKworLyogaGFuZGxlIG51bGwgYXMgImRlZmF1bHQiICovCitzdGF0aWMgaW50IGRhdHRyc19l cXVhbChzdHJ1Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKmN1ciwgaW50IGlkeF9jdXIsCisJCQlzdHJ1 Y3Qgc2NoZWRfZG9tYWluX2F0dHIgKm5ldywgaW50IGlkeF9uZXcpCit7CisJc3RydWN0IHNjaGVk X2RvbWFpbl9hdHRyIHRtcDsKKworCS8qIGZhc3QgcGF0aCAqLworCWlmICghbmV3ICYmICFjdXIp CisJCXJldHVybiAxOworCisJdG1wID0gU0RfQVRUUl9JTklUOworCXJldHVybiAhbWVtY21wKGN1 ciA/IChjdXIgKyBpZHhfY3VyKSA6ICZ0bXAsCisJCQluZXcgPyAobmV3ICsgaWR4X25ldykgOiAm dG1wLAorCQkJc2l6ZW9mKHN0cnVjdCBzY2hlZF9kb21haW5fYXR0cikpOworfQorCisvKgorICog UGFydGl0aW9uIHNjaGVkIGRvbWFpbnMgYXMgc3BlY2lmaWVkIGJ5IHRoZSAnbmRvbXNfbmV3Jwor ICogY3B1bWFza3MgaW4gdGhlIGFycmF5IGRvbXNfbmV3W10gb2YgY3B1bWFza3MuIFRoaXMgY29t cGFyZXMKKyAqIGRvbXNfbmV3W10gdG8gdGhlIGN1cnJlbnQgc2NoZWQgZG9tYWluIHBhcnRpdGlv bmluZywgZG9tc19jdXJbXS4KKyAqIEl0IGRlc3Ryb3lzIGVhY2ggZGVsZXRlZCBkb21haW4gYW5k IGJ1aWxkcyBlYWNoIG5ldyBkb21haW4uCisgKgorICogJ2RvbXNfbmV3JyBpcyBhbiBhcnJheSBv ZiBjcHVtYXNrX3Zhcl90J3Mgb2YgbGVuZ3RoICduZG9tc19uZXcnLgorICogVGhlIG1hc2tzIGRv bid0IGludGVyc2VjdCAoZG9uJ3Qgb3ZlcmxhcC4pIFdlIHNob3VsZCBzZXR1cCBvbmUKKyAqIHNj aGVkIGRvbWFpbiBmb3IgZWFjaCBtYXNrLiBDUFVzIG5vdCBpbiBhbnkgb2YgdGhlIGNwdW1hc2tz IHdpbGwKKyAqIG5vdCBiZSBsb2FkIGJhbGFuY2VkLiBJZiB0aGUgc2FtZSBjcHVtYXNrIGFwcGVh cnMgYm90aCBpbiB0aGUKKyAqIGN1cnJlbnQgJ2RvbXNfY3VyJyBkb21haW5zIGFuZCBpbiB0aGUg bmV3ICdkb21zX25ldycsIHdlIGNhbiBsZWF2ZQorICogaXQgYXMgaXQgaXMuCisgKgorICogVGhl IHBhc3NlZCBpbiAnZG9tc19uZXcnIHNob3VsZCBiZSBhbGxvY2F0ZWQgdXNpbmcKKyAqIGFsbG9j X3NjaGVkX2RvbWFpbnMuICBUaGlzIHJvdXRpbmUgdGFrZXMgb3duZXJzaGlwIG9mIGl0IGFuZCB3 aWxsCisgKiBmcmVlX3NjaGVkX2RvbWFpbnMgaXQgd2hlbiBkb25lIHdpdGggaXQuIElmIHRoZSBj YWxsZXIgZmFpbGVkIHRoZQorICogYWxsb2MgY2FsbCwgdGhlbiBpdCBjYW4gcGFzcyBpbiBkb21z X25ldyA9PSBOVUxMICYmIG5kb21zX25ldyA9PSAxLAorICogYW5kIHBhcnRpdGlvbl9zY2hlZF9k b21haW5zKCkgd2lsbCBmYWxsYmFjayB0byB0aGUgc2luZ2xlIHBhcnRpdGlvbgorICogJ2ZhbGxi YWNrX2RvbXMnLCBpdCBhbHNvIGZvcmNlcyB0aGUgZG9tYWlucyB0byBiZSByZWJ1aWx0LgorICoK KyAqIElmIGRvbXNfbmV3ID09IE5VTEwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIGNwdV9vbmxp bmVfbWFzay4KKyAqIG5kb21zX25ldyA9PSAwIGlzIGEgc3BlY2lhbCBjYXNlIGZvciBkZXN0cm95 aW5nIGV4aXN0aW5nIGRvbWFpbnMsCisgKiBhbmQgaXQgd2lsbCBub3QgY3JlYXRlIHRoZSBkZWZh dWx0IGRvbWFpbi4KKyAqCisgKiBDYWxsIHdpdGggaG90cGx1ZyBsb2NrIGhlbGQKKyAqLwordm9p ZCBwYXJ0aXRpb25fc2NoZWRfZG9tYWlucyhpbnQgbmRvbXNfbmV3LCBjcHVtYXNrX3Zhcl90IGRv bXNfbmV3W10sCisJCQkJIHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqZGF0dHJfbmV3KQorewor CWludCBpLCBqLCBuOworCWludCBuZXdfdG9wb2xvZ3k7CisKKwltdXRleF9sb2NrKCZzY2hlZF9k b21haW5zX211dGV4KTsKKworCS8qIGFsd2F5cyB1bnJlZ2lzdGVyIGluIGNhc2Ugd2UgZG9uJ3Qg ZGVzdHJveSBhbnkgZG9tYWlucyAqLworCXVucmVnaXN0ZXJfc2NoZWRfZG9tYWluX3N5c2N0bCgp OworCisJLyogTGV0IGFyY2hpdGVjdHVyZSB1cGRhdGUgY3B1IGNvcmUgbWFwcGluZ3MuICovCisJ bmV3X3RvcG9sb2d5ID0gYXJjaF91cGRhdGVfY3B1X3RvcG9sb2d5KCk7CisKKwluID0gZG9tc19u ZXcgPyBuZG9tc19uZXcgOiAwOworCisJLyogRGVzdHJveSBkZWxldGVkIGRvbWFpbnMgKi8KKwlm b3IgKGkgPSAwOyBpIDwgbmRvbXNfY3VyOyBpKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IG4gJiYg IW5ld190b3BvbG9neTsgaisrKSB7CisJCQlpZiAoY3B1bWFza19lcXVhbChkb21zX2N1cltpXSwg ZG9tc19uZXdbal0pCisJCQkJJiYgZGF0dHJzX2VxdWFsKGRhdHRyX2N1ciwgaSwgZGF0dHJfbmV3 LCBqKSkKKwkJCQlnb3RvIG1hdGNoMTsKKwkJfQorCQkvKiBubyBtYXRjaCAtIGEgY3VycmVudCBz Y2hlZCBkb21haW4gbm90IGluIG5ldyBkb21zX25ld1tdICovCisJCWRldGFjaF9kZXN0cm95X2Rv bWFpbnMoZG9tc19jdXJbaV0pOworbWF0Y2gxOgorCQk7CisJfQorCisJaWYgKGRvbXNfbmV3ID09 IE5VTEwpIHsKKwkJbmRvbXNfY3VyID0gMDsKKwkJZG9tc19uZXcgPSAmZmFsbGJhY2tfZG9tczsK KwkJY3B1bWFza19hbmRub3QoZG9tc19uZXdbMF0sIGNwdV9hY3RpdmVfbWFzaywgY3B1X2lzb2xh dGVkX21hcCk7CisJCVdBUk5fT05fT05DRShkYXR0cl9uZXcpOworCX0KKworCS8qIEJ1aWxkIG5l dyBkb21haW5zICovCisJZm9yIChpID0gMDsgaSA8IG5kb21zX25ldzsgaSsrKSB7CisJCWZvciAo aiA9IDA7IGogPCBuZG9tc19jdXIgJiYgIW5ld190b3BvbG9neTsgaisrKSB7CisJCQlpZiAoY3B1 bWFza19lcXVhbChkb21zX25ld1tpXSwgZG9tc19jdXJbal0pCisJCQkJJiYgZGF0dHJzX2VxdWFs KGRhdHRyX25ldywgaSwgZGF0dHJfY3VyLCBqKSkKKwkJCQlnb3RvIG1hdGNoMjsKKwkJfQorCQkv KiBubyBtYXRjaCAtIGFkZCBhIG5ldyBkb21zX25ldyAqLworCQlidWlsZF9zY2hlZF9kb21haW5z KGRvbXNfbmV3W2ldLCBkYXR0cl9uZXcgPyBkYXR0cl9uZXcgKyBpIDogTlVMTCk7CittYXRjaDI6 CisJCTsKKwl9CisKKwkvKiBSZW1lbWJlciB0aGUgbmV3IHNjaGVkIGRvbWFpbnMgKi8KKwlpZiAo ZG9tc19jdXIgIT0gJmZhbGxiYWNrX2RvbXMpCisJCWZyZWVfc2NoZWRfZG9tYWlucyhkb21zX2N1 ciwgbmRvbXNfY3VyKTsKKwlrZnJlZShkYXR0cl9jdXIpOwkvKiBrZnJlZShOVUxMKSBpcyBzYWZl ICovCisJZG9tc19jdXIgPSBkb21zX25ldzsKKwlkYXR0cl9jdXIgPSBkYXR0cl9uZXc7CisJbmRv bXNfY3VyID0gbmRvbXNfbmV3OworCisJcmVnaXN0ZXJfc2NoZWRfZG9tYWluX3N5c2N0bCgpOwor CisJbXV0ZXhfdW5sb2NrKCZzY2hlZF9kb21haW5zX211dGV4KTsKK30KKworI2lmIGRlZmluZWQo Q09ORklHX1NDSEVEX01DKSB8fCBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpCitzdGF0aWMgdm9p ZCByZWluaXRfc2NoZWRfZG9tYWlucyh2b2lkKQoreworCWdldF9vbmxpbmVfY3B1cygpOworCisJ LyogRGVzdHJveSBkb21haW5zIGZpcnN0IHRvIGZvcmNlIHRoZSByZWJ1aWxkICovCisJcGFydGl0 aW9uX3NjaGVkX2RvbWFpbnMoMCwgTlVMTCwgTlVMTCk7CisKKwlyZWJ1aWxkX3NjaGVkX2RvbWFp bnMoKTsKKwlwdXRfb25saW5lX2NwdXMoKTsKK30KKworc3RhdGljIHNzaXplX3Qgc2NoZWRfcG93 ZXJfc2F2aW5nc19zdG9yZShjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCwgaW50IHNtdCkK K3sKKwl1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOworCisJaWYgKHNzY2FuZihidWYsICIldSIsICZs ZXZlbCkgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIGxldmVsIGlzIGFsd2F5 cyBiZSBwb3NpdGl2ZSBzbyBkb24ndCBjaGVjayBmb3IKKwkgKiBsZXZlbCA8IFBPV0VSU0FWSU5H U19CQUxBTkNFX05PTkUgd2hpY2ggaXMgMAorCSAqIFdoYXQgaGFwcGVucyBvbiAwIG9yIDEgYnl0 ZSB3cml0ZSwKKwkgKiBuZWVkIHRvIGNoZWNrIGZvciBjb3VudCBhcyB3ZWxsPworCSAqLworCisJ aWYgKGxldmVsID49IE1BWF9QT1dFUlNBVklOR1NfQkFMQU5DRV9MRVZFTFMpCisJCXJldHVybiAt RUlOVkFMOworCisJaWYgKHNtdCkKKwkJc2NoZWRfc210X3Bvd2VyX3NhdmluZ3MgPSBsZXZlbDsK KwllbHNlCisJCXNjaGVkX21jX3Bvd2VyX3NhdmluZ3MgPSBsZXZlbDsKKworCXJlaW5pdF9zY2hl ZF9kb21haW5zKCk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NIRURf TUMKK3N0YXRpYyBzc2l6ZV90IHNjaGVkX21jX3Bvd2VyX3NhdmluZ3Nfc2hvdyhzdHJ1Y3QgZGV2 aWNlICpkZXYsCisJCQkJCSAgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkg ICBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJXVcbiIsIHNjaGVkX21jX3Bv d2VyX3NhdmluZ3MpOworfQorc3RhdGljIHNzaXplX3Qgc2NoZWRfbWNfcG93ZXJfc2F2aW5nc19z dG9yZShzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAq YXR0ciwKKwkJCQkJCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXJldHVybiBz Y2hlZF9wb3dlcl9zYXZpbmdzX3N0b3JlKGJ1ZiwgY291bnQsIDApOworfQorc3RhdGljIERFVklD RV9BVFRSKHNjaGVkX21jX3Bvd2VyX3NhdmluZ3MsIDA2NDQsCisJCSAgIHNjaGVkX21jX3Bvd2Vy X3NhdmluZ3Nfc2hvdywKKwkJICAgc2NoZWRfbWNfcG93ZXJfc2F2aW5nc19zdG9yZSk7CisjZW5k aWYKKworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKK3N0YXRpYyBzc2l6ZV90IHNjaGVkX3NtdF9w b3dlcl9zYXZpbmdzX3Nob3coc3RydWN0IGRldmljZSAqZGV2LAorCQkJCQkJc3RydWN0IGRldmlj ZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQljaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYo YnVmLCAiJXVcbiIsIHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzKTsKK30KK3N0YXRpYyBzc2l6ZV90 IHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJ CXN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAorCQkJCQkJIGNvbnN0IGNoYXIgKmJ1Ziwg c2l6ZV90IGNvdW50KQoreworCXJldHVybiBzY2hlZF9wb3dlcl9zYXZpbmdzX3N0b3JlKGJ1Ziwg Y291bnQsIDEpOworfQorc3RhdGljIERFVklDRV9BVFRSKHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdz LCAwNjQ0LAorCQkgICBzY2hlZF9zbXRfcG93ZXJfc2F2aW5nc19zaG93LAorCQkgICBzY2hlZF9z bXRfcG93ZXJfc2F2aW5nc19zdG9yZSk7CisjZW5kaWYKKworaW50IF9faW5pdCBzY2hlZF9jcmVh dGVfc3lzZnNfcG93ZXJfc2F2aW5nc19lbnRyaWVzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlp bnQgZXJyID0gMDsKKworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwlpZiAoc210X2NhcGFibGUo KSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9hdHRyX3NjaGVkX3NtdF9w b3dlcl9zYXZpbmdzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9NQworCWlmICghZXJy ICYmIG1jX2NhcGFibGUoKSkKKwkJZXJyID0gZGV2aWNlX2NyZWF0ZV9maWxlKGRldiwgJmRldl9h dHRyX3NjaGVkX21jX3Bvd2VyX3NhdmluZ3MpOworI2VuZGlmCisJcmV0dXJuIGVycjsKK30KKyNl bmRpZiAvKiBDT05GSUdfU0NIRURfTUMgfHwgQ09ORklHX1NDSEVEX1NNVCAqLworCisvKgorICog VXBkYXRlIGNwdXNldHMgYWNjb3JkaW5nIHRvIGNwdV9hY3RpdmUgbWFzay4gIElmIGNwdXNldHMg YXJlCisgKiBkaXNhYmxlZCwgY3B1c2V0X3VwZGF0ZV9hY3RpdmVfY3B1cygpIGJlY29tZXMgYSBz aW1wbGUgd3JhcHBlcgorICogYXJvdW5kIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKCkuCisgKi8K K3N0YXRpYyBpbnQgY3B1c2V0X2NwdV9hY3RpdmUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIs IHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQkJCSB2b2lkICpoY3B1KQoreworCXN3aXRjaCAoYWN0 aW9uICYgfkNQVV9UQVNLU19GUk9aRU4pIHsKKwljYXNlIENQVV9PTkxJTkU6CisJY2FzZSBDUFVf U1RBUlRJTkc6CisJY2FzZSBDUFVfRE9XTl9GQUlMRUQ6CisJCWNwdXNldF91cGRhdGVfYWN0aXZl X2NwdXMoKTsKKwkJcmV0dXJuIE5PVElGWV9PSzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gTk9USUZZ X0RPTkU7CisJfQorfQorCitzdGF0aWMgaW50IGNwdXNldF9jcHVfaW5hY3RpdmUoc3RydWN0IG5v dGlmaWVyX2Jsb2NrICpuZmIsIHVuc2lnbmVkIGxvbmcgYWN0aW9uLAorCQkJCSAgIHZvaWQgKmhj cHUpCit7CisJc3dpdGNoIChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCWNhc2UgQ1BV X0RPV05fUFJFUEFSRToKKwkJY3B1c2V0X3VwZGF0ZV9hY3RpdmVfY3B1cygpOworCQlyZXR1cm4g Tk9USUZZX09LOworCWRlZmF1bHQ6CisJCXJldHVybiBOT1RJRllfRE9ORTsKKwl9Cit9CisKKyNp ZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9TTVQpIHx8IGRlZmluZWQoQ09ORklHX1NDSEVEX01DKQor LyoKKyAqIENoZWFwZXIgdmVyc2lvbiBvZiB0aGUgYmVsb3cgZnVuY3Rpb25zIGluIGNhc2Ugc3Vw cG9ydCBmb3IgU01UIGFuZCBNQyBpcworICogY29tcGlsZWQgaW4gYnV0IENQVXMgaGF2ZSBubyBz aWJsaW5ncy4KKyAqLworc3RhdGljIGJvb2wgc29sZV9jcHVfaWRsZShpbnQgY3B1KQoreworCXJl dHVybiBycV9pZGxlKGNwdV9ycShjcHUpKTsKK30KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hF RF9TTVQKKy8qIEFsbCB0aGlzIENQVSdzIFNNVCBzaWJsaW5ncyBhcmUgaWRsZSAqLworc3RhdGlj IGJvb2wgc2libGluZ3NfY3B1X2lkbGUoaW50IGNwdSkKK3sKKwlyZXR1cm4gY3B1bWFza19zdWJz ZXQoJihjcHVfcnEoY3B1KS0+c210X3NpYmxpbmdzKSwKKwkJCQkgICZncnEuY3B1X2lkbGVfbWFw KTsKK30KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9NQworLyogQWxsIHRoaXMgQ1BVJ3Mg c2hhcmVkIGNhY2hlIHNpYmxpbmdzIGFyZSBpZGxlICovCitzdGF0aWMgYm9vbCBjYWNoZV9jcHVf aWRsZShpbnQgY3B1KQoreworCXJldHVybiBjcHVtYXNrX3N1YnNldCgmKGNwdV9ycShjcHUpLT5j YWNoZV9zaWJsaW5ncyksCisJCQkJICAmZ3JxLmNwdV9pZGxlX21hcCk7Cit9CisjZW5kaWYKKwor ZW51bSBzY2hlZF9kb21haW5fbGV2ZWwgeworCVNEX0xWX05PTkUgPSAwLAorCVNEX0xWX1NJQkxJ TkcsCisJU0RfTFZfTUMsCisJU0RfTFZfQk9PSywKKwlTRF9MVl9DUFUsCisJU0RfTFZfTk9ERSwK KwlTRF9MVl9BTExOT0RFUywKKwlTRF9MVl9NQVgKK307CisKK3ZvaWQgX19pbml0IHNjaGVkX2lu aXRfc21wKHZvaWQpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJaW50IGNwdTsKKwor CWNwdW1hc2tfdmFyX3Qgbm9uX2lzb2xhdGVkX2NwdXM7CisKKwlhbGxvY19jcHVtYXNrX3Zhcigm bm9uX2lzb2xhdGVkX2NwdXMsIEdGUF9LRVJORUwpOworCWFsbG9jX2NwdW1hc2tfdmFyKCZmYWxs YmFja19kb21zLCBHRlBfS0VSTkVMKTsKKworCWdldF9vbmxpbmVfY3B1cygpOworCW11dGV4X2xv Y2soJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOworCWluaXRfc2NoZWRfZG9tYWlucyhjcHVfYWN0aXZl X21hc2spOworCWNwdW1hc2tfYW5kbm90KG5vbl9pc29sYXRlZF9jcHVzLCBjcHVfcG9zc2libGVf bWFzaywgY3B1X2lzb2xhdGVkX21hcCk7CisJaWYgKGNwdW1hc2tfZW1wdHkobm9uX2lzb2xhdGVk X2NwdXMpKQorCQljcHVtYXNrX3NldF9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpLCBub25faXNvbGF0 ZWRfY3B1cyk7CisJbXV0ZXhfdW5sb2NrKCZzY2hlZF9kb21haW5zX211dGV4KTsKKwlwdXRfb25s aW5lX2NwdXMoKTsKKworCWhvdGNwdV9ub3RpZmllcihjcHVzZXRfY3B1X2FjdGl2ZSwgQ1BVX1BS SV9DUFVTRVRfQUNUSVZFKTsKKwlob3RjcHVfbm90aWZpZXIoY3B1c2V0X2NwdV9pbmFjdGl2ZSwg Q1BVX1BSSV9DUFVTRVRfSU5BQ1RJVkUpOworCisJLyogTW92ZSBpbml0IG92ZXIgdG8gYSBub24t aXNvbGF0ZWQgQ1BVICovCisJaWYgKHNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsIG5vbl9p c29sYXRlZF9jcHVzKSA8IDApCisJCUJVRygpOworCWZyZWVfY3B1bWFza192YXIobm9uX2lzb2xh dGVkX2NwdXMpOworCisJZ3JxX2xvY2tfaXJxKCk7CisJLyoKKwkgKiBTZXQgdXAgdGhlIHJlbGF0 aXZlIGNhY2hlIGRpc3RhbmNlIG9mIGVhY2ggb25saW5lIGNwdSBmcm9tIGVhY2gKKwkgKiBvdGhl ciBpbiBhIHNpbXBsZSBhcnJheSBmb3IgcXVpY2sgbG9va3VwLiBMb2NhbGl0eSBpcyBkZXRlcm1p bmVkCisJICogYnkgdGhlIGNsb3Nlc3Qgc2NoZWRfZG9tYWluIHRoYXQgQ1BVcyBhcmUgc2VwYXJh dGVkIGJ5LiBDUFVzIHdpdGgKKwkgKiBzaGFyZWQgY2FjaGUgaW4gU01UIGFuZCBNQyBhcmUgdHJl YXRlZCBhcyBsb2NhbC4gU2VwYXJhdGUgQ1BVcworCSAqICh3aXRoaW4gdGhlIHNhbWUgcGFja2Fn ZSBvciBwaHlzaWNhbGx5KSB3aXRoaW4gdGhlIHNhbWUgbm9kZSBhcmUKKwkgKiB0cmVhdGVkIGFz IG5vdCBsb2NhbC4gQ1BVcyBub3QgZXZlbiBpbiB0aGUgc2FtZSBkb21haW4gKGRpZmZlcmVudAor CSAqIG5vZGVzKSBhcmUgdHJlYXRlZCBhcyB2ZXJ5IGRpc3RhbnQuCisJICovCisJZm9yX2VhY2hf b25saW5lX2NwdShjcHUpIHsKKwkJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCQlmb3Jf ZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQkJaW50IGxvY2FsaXR5LCBvdGhlcl9jcHU7CisKKyNp ZmRlZiBDT05GSUdfU0NIRURfU01UCisJCQlpZiAoc2QtPmxldmVsID09IFNEX0xWX1NJQkxJTkcp IHsKKwkJCQlmb3JfZWFjaF9jcHVfbWFzayhvdGhlcl9jcHUsICpzY2hlZF9kb21haW5fc3Bhbihz ZCkpCisJCQkJCWNwdW1hc2tfc2V0X2NwdShvdGhlcl9jcHUsICZycS0+c210X3NpYmxpbmdzKTsK KwkJCX0KKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9NQworCQkJaWYgKHNkLT5sZXZlbCA9 PSBTRF9MVl9NQykgeworCQkJCWZvcl9lYWNoX2NwdV9tYXNrKG90aGVyX2NwdSwgKnNjaGVkX2Rv bWFpbl9zcGFuKHNkKSkKKwkJCQkJY3B1bWFza19zZXRfY3B1KG90aGVyX2NwdSwgJnJxLT5jYWNo ZV9zaWJsaW5ncyk7CisJCQl9CisjZW5kaWYKKwkJCWlmIChzZC0+bGV2ZWwgPD0gU0RfTFZfU0lC TElORykKKwkJCQlsb2NhbGl0eSA9IDE7CisJCQllbHNlIGlmIChzZC0+bGV2ZWwgPD0gU0RfTFZf TUMpCisJCQkJbG9jYWxpdHkgPSAyOworCQkJZWxzZSBpZiAoc2QtPmxldmVsIDw9IFNEX0xWX05P REUpCisJCQkJbG9jYWxpdHkgPSAzOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCisJCQlmb3Jf ZWFjaF9jcHVfbWFzayhvdGhlcl9jcHUsICpzY2hlZF9kb21haW5fc3BhbihzZCkpIHsKKwkJCQlp ZiAobG9jYWxpdHkgPCBycS0+Y3B1X2xvY2FsaXR5W290aGVyX2NwdV0pCisJCQkJCXJxLT5jcHVf bG9jYWxpdHlbb3RoZXJfY3B1XSA9IGxvY2FsaXR5OworCQkJfQorCQl9CisKKy8qCisJCSAqIEVh Y2ggcnVucXVldWUgaGFzIGl0cyBvd24gZnVuY3Rpb24gaW4gY2FzZSBpdCBkb2Vzbid0IGhhdmUK KwkJICogc2libGluZ3Mgb2YgaXRzIG93biBhbGxvd2luZyBtaXhlZCB0b3BvbG9naWVzLgorCQkg Ki8KKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisJCWlmIChjcHVzX3dlaWdodChycS0+c210X3Np YmxpbmdzKSA+IDEpCisJCQlycS0+c2libGluZ3NfaWRsZSA9IHNpYmxpbmdzX2NwdV9pZGxlOwor I2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEX01DCisJCWlmIChjcHVzX3dlaWdodChycS0+Y2Fj aGVfc2libGluZ3MpID4gMSkKKwkJCXJxLT5jYWNoZV9pZGxlID0gY2FjaGVfY3B1X2lkbGU7Cisj ZW5kaWYKKwl9CisJZ3JxX3VubG9ja19pcnEoKTsKK30KKyNlbHNlCit2b2lkIF9faW5pdCBzY2hl ZF9pbml0X3NtcCh2b2lkKQoreworfQorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwordW5zaWdu ZWQgaW50IHN5c2N0bF90aW1lcl9taWdyYXRpb24gPSAxOworCitpbnQgaW5fc2NoZWRfZnVuY3Rp b25zKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlyZXR1cm4gaW5fbG9ja19mdW5jdGlvbnMoYWRk cikgfHwKKwkJKGFkZHIgPj0gKHVuc2lnbmVkIGxvbmcpX19zY2hlZF90ZXh0X3N0YXJ0CisJCSYm IGFkZHIgPCAodW5zaWduZWQgbG9uZylfX3NjaGVkX3RleHRfZW5kKTsKK30KKwordm9pZCBfX2lu aXQgc2NoZWRfaW5pdCh2b2lkKQoreworCWludCBpOworCXN0cnVjdCBycSAqcnE7CisKKwlwcmlu dF9zY2hlZHVsZXJfdmVyc2lvbigpOworCisJcmF3X3NwaW5fbG9ja19pbml0KCZncnEubG9jayk7 CisJZ3JxLm5yX3J1bm5pbmcgPSBncnEubnJfdW5pbnRlcnJ1cHRpYmxlID0gZ3JxLm5yX3N3aXRj aGVzID0gMDsKKwlncnEubm9jID0gMTsKKyNpZmRlZiBDT05GSUdfU01QCisJaW5pdF9kZWZyb290 ZG9tYWluKCk7CisJZ3JxLnFuciA9IGdycS5pZGxlX2NwdXMgPSAwOworCWNwdW1hc2tfY2xlYXIo JmdycS5jcHVfaWRsZV9tYXApOworCisjZWxzZQorCXVwcnEgPSAmcGVyX2NwdShydW5xdWV1ZXMs IDApOworI2VuZGlmCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKKwkJcnEgPSBjcHVfcnEo aSk7CisJCXJxLT51c2VyX3BjID0gcnEtPm5pY2VfcGMgPSBycS0+c29mdGlycV9wYyA9IHJxLT5z eXN0ZW1fcGMgPQorCQkJCSAgcnEtPmlvd2FpdF9wYyA9IHJxLT5pZGxlX3BjID0gMDsKKwkJcnEt Pmxhc3RfcnVuX3NjYWxlID0gMDsKKyNpZmRlZiBDT05GSUdfU01QCisJCXJxLT5zdGlja3lfdGFz ayA9IE5VTEw7CisJCXJxLT5zZCA9IE5VTEw7CisJCXJxLT5yZCA9IE5VTEw7CisJCXJxLT5vbmxp bmUgPSBmYWxzZTsKKwkJcnEtPmNwdSA9IGk7CisJCXJxX2F0dGFjaF9yb290KHJxLCAmZGVmX3Jv b3RfZG9tYWluKTsKKyNlbmRpZgorCQlhdG9taWNfc2V0KCZycS0+bnJfaW93YWl0LCAwKTsKKwl9 CisKKyNpZmRlZiBDT05GSUdfU01QCisJbnJfY3B1X2lkcyA9IGk7CisJLyoKKwkgKiBTZXQgdGhl IGJhc2UgbG9jYWxpdHkgZm9yIGNwdSBjYWNoZSBkaXN0YW5jZSBjYWxjdWxhdGlvbiB0bworCSAq ICJkaXN0YW50IiAoMykuIE1ha2Ugc3VyZSB0aGUgZGlzdGFuY2UgZnJvbSBhIENQVSB0byBpdHNl bGYgaXMgMC4KKwkgKi8KKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlpbnQgajsKKwor CQlycSA9IGNwdV9ycShpKTsKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisJCWNwdW1hc2tfY2xl YXIoJnJxLT5zbXRfc2libGluZ3MpOworCQljcHVtYXNrX3NldF9jcHUoaSwgJnJxLT5zbXRfc2li bGluZ3MpOworCQlycS0+c2libGluZ3NfaWRsZSA9IHNvbGVfY3B1X2lkbGU7CisJCWNwdW1hc2tf c2V0X2NwdShpLCAmcnEtPnNtdF9zaWJsaW5ncyk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NI RURfTUMKKwkJY3B1bWFza19jbGVhcigmcnEtPmNhY2hlX3NpYmxpbmdzKTsKKwkJY3B1bWFza19z ZXRfY3B1KGksICZycS0+Y2FjaGVfc2libGluZ3MpOworCQlycS0+Y2FjaGVfaWRsZSA9IHNvbGVf Y3B1X2lkbGU7CisJCWNwdW1hc2tfc2V0X2NwdShpLCAmcnEtPmNhY2hlX3NpYmxpbmdzKTsKKyNl bmRpZgorCQlycS0+Y3B1X2xvY2FsaXR5ID0ga21hbGxvYyhucl9jcHVfaWRzICogc2l6ZW9mKGlu dCAqKSwgR0ZQX0FUT01JQyk7CisJCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShqKSB7CisJCQlpZiAo aSA9PSBqKQorCQkJCXJxLT5jcHVfbG9jYWxpdHlbal0gPSAwOworCQkJZWxzZQorCQkJCXJxLT5j cHVfbG9jYWxpdHlbal0gPSA0OworCQl9CisJfQorI2VuZGlmCisKKwlmb3IgKGkgPSAwOyBpIDwg UFJJT19MSU1JVDsgaSsrKQorCQlJTklUX0xJU1RfSEVBRChncnEucXVldWUgKyBpKTsKKwkvKiBk ZWxpbWl0ZXIgZm9yIGJpdHNlYXJjaCAqLworCV9fc2V0X2JpdChQUklPX0xJTUlULCBncnEucHJp b19iaXRtYXApOworCisjaWZkZWYgQ09ORklHX1BSRUVNUFRfTk9USUZJRVJTCisJSU5JVF9ITElT VF9IRUFEKCZpbml0X3Rhc2sucHJlZW1wdF9ub3RpZmllcnMpOworI2VuZGlmCisKKyNpZmRlZiBD T05GSUdfUlRfTVVURVhFUworCXBsaXN0X2hlYWRfaW5pdCgmaW5pdF90YXNrLnBpX3dhaXRlcnMp OworI2VuZGlmCisKKwkvKgorCSAqIFRoZSBib290IGlkbGUgdGhyZWFkIGRvZXMgbGF6eSBNTVUg c3dpdGNoaW5nIGFzIHdlbGw6CisJICovCisJYXRvbWljX2luYygmaW5pdF9tbS5tbV9jb3VudCk7 CisJZW50ZXJfbGF6eV90bGIoJmluaXRfbW0sIGN1cnJlbnQpOworCisJLyoKKwkgKiBNYWtlIHVz IHRoZSBpZGxlIHRocmVhZC4gVGVjaG5pY2FsbHksIHNjaGVkdWxlKCkgc2hvdWxkIG5vdCBiZQor CSAqIGNhbGxlZCBmcm9tIHRoaXMgdGhyZWFkLCBob3dldmVyIHNvbWV3aGVyZSBiZWxvdyBpdCBt aWdodCBiZSwKKwkgKiBidXQgYmVjYXVzZSB3ZSBhcmUgdGhlIGlkbGUgdGhyZWFkLCB3ZSBqdXN0 IHBpY2sgdXAgcnVubmluZyBhZ2FpbgorCSAqIHdoZW4gdGhpcyBydW5xdWV1ZSBiZWNvbWVzICJp ZGxlIi4KKwkgKi8KKwlpbml0X2lkbGUoY3VycmVudCwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwor I2lmZGVmIENPTkZJR19TTVAKKwl6YWxsb2NfY3B1bWFza192YXIoJnNjaGVkX2RvbWFpbnNfdG1w bWFzaywgR0ZQX05PV0FJVCk7CisJLyogTWF5IGJlIGFsbG9jYXRlZCBhdCBpc29sY3B1cyBjbWRs aW5lIHBhcnNlIHRpbWUgKi8KKwlpZiAoY3B1X2lzb2xhdGVkX21hcCA9PSBOVUxMKQorCQl6YWxs b2NfY3B1bWFza192YXIoJmNwdV9pc29sYXRlZF9tYXAsIEdGUF9OT1dBSVQpOworI2VuZGlmIC8q IFNNUCAqLworfQorCisjaWZkZWYgQ09ORklHX0RFQlVHX0FUT01JQ19TTEVFUAorc3RhdGljIGlu bGluZSBpbnQgcHJlZW1wdF9jb3VudF9lcXVhbHMoaW50IHByZWVtcHRfb2Zmc2V0KQoreworCWlu dCBuZXN0ZWQgPSAocHJlZW1wdF9jb3VudCgpICYgflBSRUVNUFRfQUNUSVZFKSArIHJjdV9wcmVl bXB0X2RlcHRoKCk7CisKKwlyZXR1cm4gKG5lc3RlZCA9PSBwcmVlbXB0X29mZnNldCk7Cit9CisK K3ZvaWQgX19taWdodF9zbGVlcChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgaW50IHByZWVt cHRfb2Zmc2V0KQoreworCXN0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfamlmZnk7CS8qIHJhdGVs aW1pdGluZyAqLworCisJcmN1X3NsZWVwX2NoZWNrKCk7IC8qIFdBUk5fT05fT05DRSgpIGJ5IGRl ZmF1bHQsIG5vIHJhdGUgbGltaXQgcmVxZC4gKi8KKwlpZiAoKHByZWVtcHRfY291bnRfZXF1YWxz KHByZWVtcHRfb2Zmc2V0KSAmJiAhaXJxc19kaXNhYmxlZCgpKSB8fAorCQlzeXN0ZW1fc3RhdGUg IT0gU1lTVEVNX1JVTk5JTkcgfHwgb29wc19pbl9wcm9ncmVzcykKKwkJcmV0dXJuOworCWlmICh0 aW1lX2JlZm9yZShqaWZmaWVzLCBwcmV2X2ppZmZ5ICsgSFopICYmIHByZXZfamlmZnkpCisJCXJl dHVybjsKKwlwcmV2X2ppZmZ5ID0gamlmZmllczsKKworCXByaW50ayhLRVJOX0VSUgorCQkiQlVH OiBzbGVlcGluZyBmdW5jdGlvbiBjYWxsZWQgZnJvbSBpbnZhbGlkIGNvbnRleHQgYXQgJXM6JWRc biIsCisJCQlmaWxlLCBsaW5lKTsKKwlwcmludGsoS0VSTl9FUlIKKwkJImluX2F0b21pYygpOiAl ZCwgaXJxc19kaXNhYmxlZCgpOiAlZCwgcGlkOiAlZCwgbmFtZTogJXNcbiIsCisJCQlpbl9hdG9t aWMoKSwgaXJxc19kaXNhYmxlZCgpLAorCQkJY3VycmVudC0+cGlkLCBjdXJyZW50LT5jb21tKTsK KworCWRlYnVnX3Nob3dfaGVsZF9sb2NrcyhjdXJyZW50KTsKKwlpZiAoaXJxc19kaXNhYmxlZCgp KQorCQlwcmludF9pcnF0cmFjZV9ldmVudHMoY3VycmVudCk7CisJZHVtcF9zdGFjaygpOworfQor RVhQT1JUX1NZTUJPTChfX21pZ2h0X3NsZWVwKTsKKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX01B R0lDX1NZU1JRCit2b2lkIG5vcm1hbGl6ZV9ydF90YXNrcyh2b2lkKQoreworCXN0cnVjdCB0YXNr X3N0cnVjdCAqZywgKnA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOwor CWludCBxdWV1ZWQ7CisKKwlyZWFkX2xvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKKworCWRvX2Vh Y2hfdGhyZWFkKGcsIHApIHsKKwkJaWYgKCFydF90YXNrKHApKQorCQkJY29udGludWU7CisKKwkJ cmF3X3NwaW5fbG9ja19pcnFzYXZlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJCXJxID0gX190YXNr X2dycV9sb2NrKHApOworCisJCXF1ZXVlZCA9IHRhc2tfcXVldWVkKHApOworCQlfX3NldHNjaGVk dWxlcihwLCBycSwgU0NIRURfTk9STUFMLCAwKTsKKwkJaWYgKHF1ZXVlZCkgeworCQkJdHJ5X3By ZWVtcHQocCwgcnEpOworCQl9CisKKwkJX190YXNrX2dycV91bmxvY2soKTsKKwkJcmF3X3NwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnAtPnBpX2xvY2ssIGZsYWdzKTsKKwl9IHdoaWxlX2VhY2hfdGhy ZWFkKGcsIHApOworCisJcmVhZF91bmxvY2tfaXJxKCZ0YXNrbGlzdF9sb2NrKTsKK30KKyNlbmRp ZiAvKiBDT05GSUdfTUFHSUNfU1lTUlEgKi8KKworI2lmIGRlZmluZWQoQ09ORklHX0lBNjQpIHx8 IGRlZmluZWQoQ09ORklHX0tHREJfS0RCKQorLyoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgb25s eSB1c2VmdWwgZm9yIHRoZSBJQTY0IE1DQSBoYW5kbGluZywgb3Iga2RiLgorICoKKyAqIFRoZXkg Y2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIHdob2xlIHN5c3RlbSBoYXMgYmVlbgorICogc3Rv cHBlZCAtIGV2ZXJ5IENQVSBuZWVkcyB0byBiZSBxdWllc2NlbnQsIGFuZCBubyBzY2hlZHVsaW5n CisgKiBhY3Rpdml0eSBjYW4gdGFrZSBwbGFjZS4gVXNpbmcgdGhlbSBmb3IgYW55dGhpbmcgZWxz ZSB3b3VsZAorICogYmUgYSBzZXJpb3VzIGJ1ZywgYW5kIGFzIGEgcmVzdWx0LCB0aGV5IGFyZW4n dCBldmVuIHZpc2libGUKKyAqIHVuZGVyIGFueSBvdGhlciBjb25maWd1cmF0aW9uLgorICovCisK Ky8qKgorICogY3Vycl90YXNrIC0gcmV0dXJuIHRoZSBjdXJyZW50IHRhc2sgZm9yIGEgZ2l2ZW4g Y3B1LgorICogQGNwdTogdGhlIHByb2Nlc3NvciBpbiBxdWVzdGlvbi4KKyAqCisgKiBPTkxZIFZB TElEIFdIRU4gVEhFIFdIT0xFIFNZU1RFTSBJUyBTVE9QUEVEIQorICovCitzdHJ1Y3QgdGFza19z dHJ1Y3QgKmN1cnJfdGFzayhpbnQgY3B1KQoreworCXJldHVybiBjcHVfY3VycihjcHUpOworfQor CisjZW5kaWYgLyogZGVmaW5lZChDT05GSUdfSUE2NCkgfHwgZGVmaW5lZChDT05GSUdfS0dEQl9L REIpICovCisKKyNpZmRlZiBDT05GSUdfSUE2NAorLyoqCisgKiBzZXRfY3Vycl90YXNrIC0gc2V0 IHRoZSBjdXJyZW50IHRhc2sgZm9yIGEgZ2l2ZW4gY3B1LgorICogQGNwdTogdGhlIHByb2Nlc3Nv ciBpbiBxdWVzdGlvbi4KKyAqIEBwOiB0aGUgdGFzayBwb2ludGVyIHRvIHNldC4KKyAqCisgKiBE ZXNjcmlwdGlvbjogVGhpcyBmdW5jdGlvbiBtdXN0IG9ubHkgYmUgdXNlZCB3aGVuIG5vbi1tYXNr YWJsZSBpbnRlcnJ1cHRzCisgKiBhcmUgc2VydmljZWQgb24gYSBzZXBhcmF0ZSBzdGFjay4gIEl0 IGFsbG93cyB0aGUgYXJjaGl0ZWN0dXJlIHRvIHN3aXRjaCB0aGUKKyAqIG5vdGlvbiBvZiB0aGUg Y3VycmVudCB0YXNrIG9uIGEgY3B1IGluIGEgbm9uLWJsb2NraW5nIG1hbm5lci4gIFRoaXMgZnVu Y3Rpb24KKyAqIG11c3QgYmUgY2FsbGVkIHdpdGggYWxsIENQVSdzIHN5bmNocm9uaXNlZCwgYW5k IGludGVycnVwdHMgZGlzYWJsZWQsIHRoZQorICogYW5kIGNhbGxlciBtdXN0IHNhdmUgdGhlIG9y aWdpbmFsIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRhc2sgKHNlZQorICogY3Vycl90YXNrKCkgYWJv dmUpIGFuZCByZXN0b3JlIHRoYXQgdmFsdWUgYmVmb3JlIHJlZW5hYmxpbmcgaW50ZXJydXB0cyBh bmQKKyAqIHJlLXN0YXJ0aW5nIHRoZSBzeXN0ZW0uCisgKgorICogT05MWSBWQUxJRCBXSEVOIFRI RSBXSE9MRSBTWVNURU0gSVMgU1RPUFBFRCEKKyAqLwordm9pZCBzZXRfY3Vycl90YXNrKGludCBj cHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwljcHVfY3VycihjcHUpID0gcDsKK30KKwor I2VuZGlmCisKKy8qCisgKiBVc2UgcHJlY2lzZSBwbGF0Zm9ybSBzdGF0aXN0aWNzIGlmIGF2YWls YWJsZToKKyAqLworI2lmZGVmIENPTkZJR19WSVJUX0NQVV9BQ0NPVU5USU5HCit2b2lkIHRhc2tf dGltZXMoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjcHV0aW1lX3QgKnV0LCBjcHV0aW1lX3QgKnN0 KQoreworCSp1dCA9IHAtPnV0aW1lOworCSpzdCA9IHAtPnN0aW1lOworfQorCit2b2lkIHRocmVh ZF9ncm91cF90aW1lcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRpbWVfdCAqdXQsIGNwdXRp bWVfdCAqc3QpCit7CisJc3RydWN0IHRhc2tfY3B1dGltZSBjcHV0aW1lOworCisJdGhyZWFkX2dy b3VwX2NwdXRpbWUocCwgJmNwdXRpbWUpOworCisJKnV0ID0gY3B1dGltZS51dGltZTsKKwkqc3Qg PSBjcHV0aW1lLnN0aW1lOworfQorI2Vsc2UKKwordm9pZCB0YXNrX3RpbWVzKHN0cnVjdCB0YXNr X3N0cnVjdCAqcCwgY3B1dGltZV90ICp1dCwgY3B1dGltZV90ICpzdCkKK3sKKwljcHV0aW1lX3Qg cnRpbWUsIHV0aW1lID0gcC0+dXRpbWUsIHRvdGFsID0gdXRpbWUgKyBwLT5zdGltZTsKKworCXJ0 aW1lID0gbnNlY3NfdG9fY3B1dGltZShwLT5zY2hlZF90aW1lKTsKKworCWlmICh0b3RhbCkgewor CQl1NjQgdGVtcDsKKworCQl0ZW1wID0gKHU2NCkocnRpbWUgKiB1dGltZSk7CisJCWRvX2Rpdih0 ZW1wLCB0b3RhbCk7CisJCXV0aW1lID0gKGNwdXRpbWVfdCl0ZW1wOworCX0gZWxzZQorCQl1dGlt ZSA9IHJ0aW1lOworCisJLyoKKwkgKiBDb21wYXJlIHdpdGggcHJldmlvdXMgdmFsdWVzLCB0byBr ZWVwIG1vbm90b25pY2l0eToKKwkgKi8KKwlwLT5wcmV2X3V0aW1lID0gbWF4KHAtPnByZXZfdXRp bWUsIHV0aW1lKTsKKwlwLT5wcmV2X3N0aW1lID0gbWF4KHAtPnByZXZfc3RpbWUsIChydGltZSAt IHAtPnByZXZfdXRpbWUpKTsKKworCSp1dCA9IHAtPnByZXZfdXRpbWU7CisJKnN0ID0gcC0+cHJl dl9zdGltZTsKK30KKworLyoKKyAqIE11c3QgYmUgY2FsbGVkIHdpdGggc2lnbG9jayBoZWxkLgor ICovCit2b2lkIHRocmVhZF9ncm91cF90aW1lcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRp bWVfdCAqdXQsIGNwdXRpbWVfdCAqc3QpCit7CisJc3RydWN0IHNpZ25hbF9zdHJ1Y3QgKnNpZyA9 IHAtPnNpZ25hbDsKKwlzdHJ1Y3QgdGFza19jcHV0aW1lIGNwdXRpbWU7CisJY3B1dGltZV90IHJ0 aW1lLCB1dGltZSwgdG90YWw7CisKKwl0aHJlYWRfZ3JvdXBfY3B1dGltZShwLCAmY3B1dGltZSk7 CisKKwl0b3RhbCA9IGNwdXRpbWUudXRpbWUgKyBjcHV0aW1lLnN0aW1lOworCXJ0aW1lID0gbnNl Y3NfdG9fY3B1dGltZShjcHV0aW1lLnN1bV9leGVjX3J1bnRpbWUpOworCisJaWYgKHRvdGFsKSB7 CisJCXU2NCB0ZW1wOworCisJCXRlbXAgPSAodTY0KShydGltZSAqIGNwdXRpbWUudXRpbWUpOwor CQlkb19kaXYodGVtcCwgdG90YWwpOworCQl1dGltZSA9IChjcHV0aW1lX3QpdGVtcDsKKwl9IGVs c2UKKwkJdXRpbWUgPSBydGltZTsKKworCXNpZy0+cHJldl91dGltZSA9IG1heChzaWctPnByZXZf dXRpbWUsIHV0aW1lKTsKKwlzaWctPnByZXZfc3RpbWUgPSBtYXgoc2lnLT5wcmV2X3N0aW1lLCAo cnRpbWUgLSBzaWctPnByZXZfdXRpbWUpKTsKKworCSp1dCA9IHNpZy0+cHJldl91dGltZTsKKwkq c3QgPSBzaWctPnByZXZfc3RpbWU7Cit9CisjZW5kaWYKKworaW5saW5lIGNwdXRpbWVfdCB0YXNr X2d0aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+Z3RpbWU7Cit9CisK K3ZvaWQgX19jcHVpbml0IGluaXRfaWRsZV9ib290dXBfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KmlkbGUpCit7fQorCisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCit2b2lkIHByb2Nfc2NoZWRf c2hvd190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHNlcV9maWxlICptKQore30K Kwordm9pZCBwcm9jX3NjaGVkX3NldF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3t9Cisj ZW5kaWYKKworI2lmZGVmIENPTkZJR19TTVAKK3Vuc2lnbmVkIGxvbmcgZGVmYXVsdF9zY2FsZV9m cmVxX3Bvd2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQoreworCXJldHVybiBT Q0hFRF9MT0FEX1NDQUxFOworfQorCit1bnNpZ25lZCBsb25nIGRlZmF1bHRfc2NhbGVfc210X3Bv d2VyKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQoreworCXVuc2lnbmVkIGxvbmcg d2VpZ2h0ID0gY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKKwl1bnNpZ25l ZCBsb25nIHNtdF9nYWluID0gc2QtPnNtdF9nYWluOworCisJc210X2dhaW4gLz0gd2VpZ2h0Owor CisJcmV0dXJuIHNtdF9nYWluOworfQorI2VuZGlmCmRpZmYgLXJ1TiBsaW51eC0zLjQuMS9rZXJu ZWwvc2NoZWQvc3RhdHMuYyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9zY2hlZC9zdGF0cy5jCi0t LSBsaW51eC0zLjQuMS9rZXJuZWwvc2NoZWQvc3RhdHMuYwkyMDEyLTA2LTAxIDE1OjE4OjQ0LjAw MDAwMDAwMCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9rZXJuZWwvc2NoZWQvc3RhdHMuYwkx OTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAwMDAwMCArMDgwMApAQCAtMSwxMTEgKzAsMCBAQAotCi0j aW5jbHVkZSA8bGludXgvc2xhYi5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8 bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0KLSNpbmNsdWRl ICJzY2hlZC5oIgotCi0vKgotICogYnVtcCB0aGlzIHVwIHdoZW4gY2hhbmdpbmcgdGhlIG91dHB1 dCBmb3JtYXQgb3IgdGhlIG1lYW5pbmcgb2YgYW4gZXhpc3RpbmcKLSAqIGZvcm1hdCwgc28gdGhh dCB0b29scyBjYW4gYWRhcHQgKG9yIGFib3J0KQotICovCi0jZGVmaW5lIFNDSEVEU1RBVF9WRVJT SU9OIDE1Ci0KLXN0YXRpYyBpbnQgc2hvd19zY2hlZHN0YXQoc3RydWN0IHNlcV9maWxlICpzZXEs IHZvaWQgKnYpCi17Ci0JaW50IGNwdTsKLQlpbnQgbWFza19sZW4gPSBESVZfUk9VTkRfVVAoTlJf Q1BVUywgMzIpICogOTsKLQljaGFyICptYXNrX3N0ciA9IGttYWxsb2MobWFza19sZW4sIEdGUF9L RVJORUwpOwotCi0JaWYgKG1hc2tfc3RyID09IE5VTEwpCi0JCXJldHVybiAtRU5PTUVNOwotCi0J c2VxX3ByaW50ZihzZXEsICJ2ZXJzaW9uICVkXG4iLCBTQ0hFRFNUQVRfVkVSU0lPTik7Ci0Jc2Vx X3ByaW50ZihzZXEsICJ0aW1lc3RhbXAgJWx1XG4iLCBqaWZmaWVzKTsKLQlmb3JfZWFjaF9vbmxp bmVfY3B1KGNwdSkgewotCQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7Ci0jaWZkZWYgQ09O RklHX1NNUAotCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKLQkJaW50IGRjb3VudCA9IDA7Ci0j ZW5kaWYKLQotCQkvKiBydW5xdWV1ZS1zcGVjaWZpYyBzdGF0cyAqLwotCQlzZXFfcHJpbnRmKHNl cSwKLQkJICAgICJjcHUlZCAldSAwICV1ICV1ICV1ICV1ICVsbHUgJWxsdSAlbHUiLAotCQkgICAg Y3B1LCBycS0+eWxkX2NvdW50LAotCQkgICAgcnEtPnNjaGVkX2NvdW50LCBycS0+c2NoZWRfZ29p ZGxlLAotCQkgICAgcnEtPnR0d3VfY291bnQsIHJxLT50dHd1X2xvY2FsLAotCQkgICAgcnEtPnJx X2NwdV90aW1lLAotCQkgICAgcnEtPnJxX3NjaGVkX2luZm8ucnVuX2RlbGF5LCBycS0+cnFfc2No ZWRfaW5mby5wY291bnQpOwotCi0JCXNlcV9wcmludGYoc2VxLCAiXG4iKTsKLQotI2lmZGVmIENP TkZJR19TTVAKLQkJLyogZG9tYWluLXNwZWNpZmljIHN0YXRzICovCi0JCXJjdV9yZWFkX2xvY2so KTsKLQkJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpIHsKLQkJCWVudW0gY3B1X2lkbGVfdHlwZSBp dHlwZTsKLQotCQkJY3B1bWFza19zY25wcmludGYobWFza19zdHIsIG1hc2tfbGVuLAotCQkJCQkg IHNjaGVkX2RvbWFpbl9zcGFuKHNkKSk7Ci0JCQlzZXFfcHJpbnRmKHNlcSwgImRvbWFpbiVkICVz IiwgZGNvdW50KyssIG1hc2tfc3RyKTsKLQkJCWZvciAoaXR5cGUgPSBDUFVfSURMRTsgaXR5cGUg PCBDUFVfTUFYX0lETEVfVFlQRVM7Ci0JCQkJCWl0eXBlKyspIHsKLQkJCQlzZXFfcHJpbnRmKHNl cSwgIiAldSAldSAldSAldSAldSAldSAldSAldSIsCi0JCQkJICAgIHNkLT5sYl9jb3VudFtpdHlw ZV0sCi0JCQkJICAgIHNkLT5sYl9iYWxhbmNlZFtpdHlwZV0sCi0JCQkJICAgIHNkLT5sYl9mYWls ZWRbaXR5cGVdLAotCQkJCSAgICBzZC0+bGJfaW1iYWxhbmNlW2l0eXBlXSwKLQkJCQkgICAgc2Qt PmxiX2dhaW5lZFtpdHlwZV0sCi0JCQkJICAgIHNkLT5sYl9ob3RfZ2FpbmVkW2l0eXBlXSwKLQkJ CQkgICAgc2QtPmxiX25vYnVzeXFbaXR5cGVdLAotCQkJCSAgICBzZC0+bGJfbm9idXN5Z1tpdHlw ZV0pOwotCQkJfQotCQkJc2VxX3ByaW50ZihzZXEsCi0JCQkJICAgIiAldSAldSAldSAldSAldSAl dSAldSAldSAldSAldSAldSAldVxuIiwKLQkJCSAgICBzZC0+YWxiX2NvdW50LCBzZC0+YWxiX2Zh aWxlZCwgc2QtPmFsYl9wdXNoZWQsCi0JCQkgICAgc2QtPnNiZV9jb3VudCwgc2QtPnNiZV9iYWxh bmNlZCwgc2QtPnNiZV9wdXNoZWQsCi0JCQkgICAgc2QtPnNiZl9jb3VudCwgc2QtPnNiZl9iYWxh bmNlZCwgc2QtPnNiZl9wdXNoZWQsCi0JCQkgICAgc2QtPnR0d3Vfd2FrZV9yZW1vdGUsIHNkLT50 dHd1X21vdmVfYWZmaW5lLAotCQkJICAgIHNkLT50dHd1X21vdmVfYmFsYW5jZSk7Ci0JCX0KLQkJ cmN1X3JlYWRfdW5sb2NrKCk7Ci0jZW5kaWYKLQl9Ci0Ja2ZyZWUobWFza19zdHIpOwotCXJldHVy biAwOwotfQotCi1zdGF0aWMgaW50IHNjaGVkc3RhdF9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUs IHN0cnVjdCBmaWxlICpmaWxlKQotewotCXVuc2lnbmVkIGludCBzaXplID0gUEFHRV9TSVpFICog KDEgKyBudW1fb25saW5lX2NwdXMoKSAvIDMyKTsKLQljaGFyICpidWYgPSBrbWFsbG9jKHNpemUs IEdGUF9LRVJORUwpOwotCXN0cnVjdCBzZXFfZmlsZSAqbTsKLQlpbnQgcmVzOwotCi0JaWYgKCFi dWYpCi0JCXJldHVybiAtRU5PTUVNOwotCXJlcyA9IHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfc2No ZWRzdGF0LCBOVUxMKTsKLQlpZiAoIXJlcykgewotCQltID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwot CQltLT5idWYgPSBidWY7Ci0JCW0tPnNpemUgPSBzaXplOwotCX0gZWxzZQotCQlrZnJlZShidWYp OwotCXJldHVybiByZXM7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25z IHByb2Nfc2NoZWRzdGF0X29wZXJhdGlvbnMgPSB7Ci0JLm9wZW4gICAgPSBzY2hlZHN0YXRfb3Bl biwKLQkucmVhZCAgICA9IHNlcV9yZWFkLAotCS5sbHNlZWsgID0gc2VxX2xzZWVrLAotCS5yZWxl YXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdGF0aWMgaW50IF9faW5pdCBwcm9jX3NjaGVk c3RhdF9pbml0KHZvaWQpCi17Ci0JcHJvY19jcmVhdGUoInNjaGVkc3RhdCIsIDAsIE5VTEwsICZw cm9jX3NjaGVkc3RhdF9vcGVyYXRpb25zKTsKLQlyZXR1cm4gMDsKLX0KLW1vZHVsZV9pbml0KHBy b2Nfc2NoZWRzdGF0X2luaXQpOwpkaWZmIC1ydU4gbGludXgtMy40LjEva2VybmVsL3NjaGVkL3N0 YXRzLmggbGludXgtMy40LjEtUklGUy9rZXJuZWwvc2NoZWQvc3RhdHMuaAotLS0gbGludXgtMy40 LjEva2VybmVsL3NjaGVkL3N0YXRzLmgJMjAxMi0wNi0wMSAxNToxODo0NC4wMDAwMDAwMDAgKzA4 MDAKKysrIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3NjaGVkL3N0YXRzLmgJMjAxMi0wNi0wNiAx NDo0MzowMi4wMDAwMDAwMDAgKzA4MDAKQEAgLTEsMjMxICswLDAgQEAKLQotI2lmZGVmIENPTkZJ R19TQ0hFRFNUQVRTCi0KLS8qCi0gKiBFeHBlY3RzIHJ1bnF1ZXVlIGxvY2sgdG8gYmUgaGVsZCBm b3IgYXRvbWljaXR5IG9mIHVwZGF0ZQotICovCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJxX3NjaGVk X2luZm9fYXJyaXZlKHN0cnVjdCBycSAqcnEsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkKLXsK LQlpZiAocnEpIHsKLQkJcnEtPnJxX3NjaGVkX2luZm8ucnVuX2RlbGF5ICs9IGRlbHRhOwotCQly cS0+cnFfc2NoZWRfaW5mby5wY291bnQrKzsKLQl9Ci19Ci0KLS8qCi0gKiBFeHBlY3RzIHJ1bnF1 ZXVlIGxvY2sgdG8gYmUgaGVsZCBmb3IgYXRvbWljaXR5IG9mIHVwZGF0ZQotICovCi1zdGF0aWMg aW5saW5lIHZvaWQKLXJxX3NjaGVkX2luZm9fZGVwYXJ0KHN0cnVjdCBycSAqcnEsIHVuc2lnbmVk IGxvbmcgbG9uZyBkZWx0YSkKLXsKLQlpZiAocnEpCi0JCXJxLT5ycV9jcHVfdGltZSArPSBkZWx0 YTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkCi1ycV9zY2hlZF9pbmZvX2RlcXVldWVkKHN0cnVj dCBycSAqcnEsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkKLXsKLQlpZiAocnEpCi0JCXJxLT5y cV9zY2hlZF9pbmZvLnJ1bl9kZWxheSArPSBkZWx0YTsKLX0KLSMgZGVmaW5lIHNjaGVkc3RhdF9p bmMocnEsIGZpZWxkKQlkbyB7IChycSktPmZpZWxkKys7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBz Y2hlZHN0YXRfYWRkKHJxLCBmaWVsZCwgYW10KQlkbyB7IChycSktPmZpZWxkICs9IChhbXQpOyB9 IHdoaWxlICgwKQotIyBkZWZpbmUgc2NoZWRzdGF0X3NldCh2YXIsIHZhbCkJZG8geyB2YXIgPSAo dmFsKTsgfSB3aGlsZSAoMCkKLSNlbHNlIC8qICFDT05GSUdfU0NIRURTVEFUUyAqLwotc3RhdGlj IGlubGluZSB2b2lkCi1ycV9zY2hlZF9pbmZvX2Fycml2ZShzdHJ1Y3QgcnEgKnJxLCB1bnNpZ25l ZCBsb25nIGxvbmcgZGVsdGEpCi17fQotc3RhdGljIGlubGluZSB2b2lkCi1ycV9zY2hlZF9pbmZv X2RlcXVldWVkKHN0cnVjdCBycSAqcnEsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkKLXt9Ci1z dGF0aWMgaW5saW5lIHZvaWQKLXJxX3NjaGVkX2luZm9fZGVwYXJ0KHN0cnVjdCBycSAqcnEsIHVu c2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkKLXt9Ci0jIGRlZmluZSBzY2hlZHN0YXRfaW5jKHJxLCBm aWVsZCkJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgc2NoZWRzdGF0X2FkZChycSwgZmllbGQs IGFtdCkJZG8geyB9IHdoaWxlICgwKQotIyBkZWZpbmUgc2NoZWRzdGF0X3NldCh2YXIsIHZhbCkJ ZG8geyB9IHdoaWxlICgwKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRFNUQVRT KSB8fCBkZWZpbmVkKENPTkZJR19UQVNLX0RFTEFZX0FDQ1QpCi1zdGF0aWMgaW5saW5lIHZvaWQg c2NoZWRfaW5mb19yZXNldF9kZXF1ZXVlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCi17Ci0JdC0+ c2NoZWRfaW5mby5sYXN0X3F1ZXVlZCA9IDA7Ci19Ci0KLS8qCi0gKiBXZSBhcmUgaW50ZXJlc3Rl ZCBpbiBrbm93aW5nIGhvdyBsb25nIGl0IHdhcyBmcm9tIHRoZSAqZmlyc3QqIHRpbWUgYQotICog dGFzayB3YXMgcXVldWVkIHRvIHRoZSB0aW1lIHRoYXQgaXQgZmluYWxseSBoaXQgYSBjcHUsIHdl IGNhbGwgdGhpcyByb3V0aW5lCi0gKiBmcm9tIGRlcXVldWVfdGFzaygpIHRvIGFjY291bnQgZm9y IHBvc3NpYmxlIHJxLT5jbG9jayBza2V3IGFjcm9zcyBjcHVzLiBUaGUKLSAqIGRlbHRhIHRha2Vu IG9uIGVhY2ggY3B1IHdvdWxkIGFubnVsIHRoZSBza2V3LgotICovCi1zdGF0aWMgaW5saW5lIHZv aWQgc2NoZWRfaW5mb19kZXF1ZXVlZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCi17Ci0JdW5zaWdu ZWQgbG9uZyBsb25nIG5vdyA9IHRhc2tfcnEodCktPmNsb2NrLCBkZWx0YSA9IDA7Ci0KLQlpZiAo dW5saWtlbHkoc2NoZWRfaW5mb19vbigpKSkKLQkJaWYgKHQtPnNjaGVkX2luZm8ubGFzdF9xdWV1 ZWQpCi0JCQlkZWx0YSA9IG5vdyAtIHQtPnNjaGVkX2luZm8ubGFzdF9xdWV1ZWQ7Ci0Jc2NoZWRf aW5mb19yZXNldF9kZXF1ZXVlZCh0KTsKLQl0LT5zY2hlZF9pbmZvLnJ1bl9kZWxheSArPSBkZWx0 YTsKLQotCXJxX3NjaGVkX2luZm9fZGVxdWV1ZWQodGFza19ycSh0KSwgZGVsdGEpOwotfQotCi0v KgotICogQ2FsbGVkIHdoZW4gYSB0YXNrIGZpbmFsbHkgaGl0cyB0aGUgY3B1LiAgV2UgY2FuIG5v dyBjYWxjdWxhdGUgaG93Ci0gKiBsb25nIGl0IHdhcyB3YWl0aW5nIHRvIHJ1bi4gIFdlIGFsc28g bm90ZSB3aGVuIGl0IGJlZ2FuIHNvIHRoYXQgd2UKLSAqIGNhbiBrZWVwIHN0YXRzIG9uIGhvdyBs b25nIGl0cyB0aW1lc2xpY2UgaXMuCi0gKi8KLXN0YXRpYyB2b2lkIHNjaGVkX2luZm9fYXJyaXZl KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgbm93ID0gdGFz a19ycSh0KS0+Y2xvY2ssIGRlbHRhID0gMDsKLQotCWlmICh0LT5zY2hlZF9pbmZvLmxhc3RfcXVl dWVkKQotCQlkZWx0YSA9IG5vdyAtIHQtPnNjaGVkX2luZm8ubGFzdF9xdWV1ZWQ7Ci0Jc2NoZWRf aW5mb19yZXNldF9kZXF1ZXVlZCh0KTsKLQl0LT5zY2hlZF9pbmZvLnJ1bl9kZWxheSArPSBkZWx0 YTsKLQl0LT5zY2hlZF9pbmZvLmxhc3RfYXJyaXZhbCA9IG5vdzsKLQl0LT5zY2hlZF9pbmZvLnBj b3VudCsrOwotCi0JcnFfc2NoZWRfaW5mb19hcnJpdmUodGFza19ycSh0KSwgZGVsdGEpOwotfQot Ci0vKgotICogVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBmcm9tIGVucXVldWVfdGFzaygp LCBidXQgYWxzbyBvbmx5IHVwZGF0ZXMKLSAqIHRoZSB0aW1lc3RhbXAgaWYgaXQgaXMgYWxyZWFk eSBub3Qgc2V0LiAgSXQncyBhc3N1bWVkIHRoYXQKLSAqIHNjaGVkX2luZm9fZGVxdWV1ZWQoKSB3 aWxsIGNsZWFyIHRoYXQgc3RhbXAgd2hlbiBhcHByb3ByaWF0ZS4KLSAqLwotc3RhdGljIGlubGlu ZSB2b2lkIHNjaGVkX2luZm9fcXVldWVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKLXsKLQlpZiAo dW5saWtlbHkoc2NoZWRfaW5mb19vbigpKSkKLQkJaWYgKCF0LT5zY2hlZF9pbmZvLmxhc3RfcXVl dWVkKQotCQkJdC0+c2NoZWRfaW5mby5sYXN0X3F1ZXVlZCA9IHRhc2tfcnEodCktPmNsb2NrOwot fQotCi0vKgotICogQ2FsbGVkIHdoZW4gYSBwcm9jZXNzIGNlYXNlcyBiZWluZyB0aGUgYWN0aXZl LXJ1bm5pbmcgcHJvY2VzcywgZWl0aGVyCi0gKiB2b2x1bnRhcmlseSBvciBpbnZvbHVudGFyaWx5 LiAgTm93IHdlIGNhbiBjYWxjdWxhdGUgaG93IGxvbmcgd2UgcmFuLgotICogQWxzbywgaWYgdGhl IHByb2Nlc3MgaXMgc3RpbGwgaW4gdGhlIFRBU0tfUlVOTklORyBzdGF0ZSwgY2FsbAotICogc2No ZWRfaW5mb19xdWV1ZWQoKSB0byBtYXJrIHRoYXQgaXQgaGFzIG5vdyBhZ2FpbiBzdGFydGVkIHdh aXRpbmcgb24KLSAqIHRoZSBydW5xdWV1ZS4KLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHNjaGVk X2luZm9fZGVwYXJ0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKLXsKLQl1bnNpZ25lZCBsb25nIGxv bmcgZGVsdGEgPSB0YXNrX3JxKHQpLT5jbG9jayAtCi0JCQkJCXQtPnNjaGVkX2luZm8ubGFzdF9h cnJpdmFsOwotCi0JcnFfc2NoZWRfaW5mb19kZXBhcnQodGFza19ycSh0KSwgZGVsdGEpOwotCi0J aWYgKHQtPnN0YXRlID09IFRBU0tfUlVOTklORykKLQkJc2NoZWRfaW5mb19xdWV1ZWQodCk7Ci19 Ci0KLS8qCi0gKiBDYWxsZWQgd2hlbiB0YXNrcyBhcmUgc3dpdGNoZWQgaW52b2x1bnRhcmlseSBk dWUsIHR5cGljYWxseSwgdG8gZXhwaXJpbmcKLSAqIHRoZWlyIHRpbWUgc2xpY2UuICAoVGhpcyBt YXkgYWxzbyBiZSBjYWxsZWQgd2hlbiBzd2l0Y2hpbmcgdG8gb3IgZnJvbQotICogdGhlIGlkbGUg dGFzay4pICBXZSBhcmUgb25seSBjYWxsZWQgd2hlbiBwcmV2ICE9IG5leHQuCi0gKi8KLXN0YXRp YyBpbmxpbmUgdm9pZAotX19zY2hlZF9pbmZvX3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnBy ZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKLXsKLQlzdHJ1Y3QgcnEgKnJxID0gdGFza19y cShwcmV2KTsKLQotCS8qCi0JICogcHJldiBub3cgZGVwYXJ0cyB0aGUgY3B1LiAgSXQncyBub3Qg aW50ZXJlc3RpbmcgdG8gcmVjb3JkCi0JICogc3RhdHMgYWJvdXQgaG93IGVmZmljaWVudCB3ZSB3 ZXJlIGF0IHNjaGVkdWxpbmcgdGhlIGlkbGUKLQkgKiBwcm9jZXNzLCBob3dldmVyLgotCSAqLwot CWlmIChwcmV2ICE9IHJxLT5pZGxlKQotCQlzY2hlZF9pbmZvX2RlcGFydChwcmV2KTsKLQotCWlm IChuZXh0ICE9IHJxLT5pZGxlKQotCQlzY2hlZF9pbmZvX2Fycml2ZShuZXh0KTsKLX0KLXN0YXRp YyBpbmxpbmUgdm9pZAotc2NoZWRfaW5mb19zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2 LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCi17Ci0JaWYgKHVubGlrZWx5KHNjaGVkX2luZm9f b24oKSkpCi0JCV9fc2NoZWRfaW5mb19zd2l0Y2gocHJldiwgbmV4dCk7Ci19Ci0jZWxzZQotI2Rl ZmluZSBzY2hlZF9pbmZvX3F1ZXVlZCh0KQkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc2No ZWRfaW5mb19yZXNldF9kZXF1ZXVlZCh0KQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNjaGVk X2luZm9fZGVxdWV1ZWQodCkJCQlkbyB7IH0gd2hpbGUgKDApCi0jZGVmaW5lIHNjaGVkX2luZm9f c3dpdGNoKHQsIG5leHQpCQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYgLyogQ09ORklHX1NDSEVE U1RBVFMgfHwgQ09ORklHX1RBU0tfREVMQVlfQUNDVCAqLwotCi0vKgotICogVGhlIGZvbGxvd2lu ZyBhcmUgZnVuY3Rpb25zIHRoYXQgc3VwcG9ydCBzY2hlZHVsZXItaW50ZXJuYWwgdGltZSBhY2Nv dW50aW5nLgotICogVGhlc2UgZnVuY3Rpb25zIGFyZSBnZW5lcmFsbHkgY2FsbGVkIGF0IHRoZSB0 aW1lciB0aWNrLiAgTm9uZSBvZiB0aGlzIGRlcGVuZHMKLSAqIG9uIENPTkZJR19TQ0hFRFNUQVRT LgotICovCi0KLS8qKgotICogYWNjb3VudF9ncm91cF91c2VyX3RpbWUgLSBNYWludGFpbiB1dGlt ZSBmb3IgYSB0aHJlYWQgZ3JvdXAuCi0gKgotICogQHRzazoJUG9pbnRlciB0byB0YXNrIHN0cnVj dHVyZS4KLSAqIEBjcHV0aW1lOglUaW1lIHZhbHVlIGJ5IHdoaWNoIHRvIGluY3JlbWVudCB0aGUg dXRpbWUgZmllbGQgb2YgdGhlCi0gKgkJdGhyZWFkX2dyb3VwX2NwdXRpbWUgc3RydWN0dXJlLgot ICoKLSAqIElmIHRocmVhZCBncm91cCB0aW1lIGlzIGJlaW5nIG1haW50YWluZWQsIGdldCB0aGUg c3RydWN0dXJlIGZvciB0aGUKLSAqIHJ1bm5pbmcgQ1BVIGFuZCB1cGRhdGUgdGhlIHV0aW1lIGZp ZWxkIHRoZXJlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNjb3VudF9ncm91cF91c2VyX3Rp bWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkJCSAgIGNwdXRpbWVfdCBjcHV0aW1lKQot ewotCXN0cnVjdCB0aHJlYWRfZ3JvdXBfY3B1dGltZXIgKmNwdXRpbWVyID0gJnRzay0+c2lnbmFs LT5jcHV0aW1lcjsKLQotCWlmICghY3B1dGltZXItPnJ1bm5pbmcpCi0JCXJldHVybjsKLQotCXJh d19zcGluX2xvY2soJmNwdXRpbWVyLT5sb2NrKTsKLQljcHV0aW1lci0+Y3B1dGltZS51dGltZSAr PSBjcHV0aW1lOwotCXJhd19zcGluX3VubG9jaygmY3B1dGltZXItPmxvY2spOwotfQotCi0vKioK LSAqIGFjY291bnRfZ3JvdXBfc3lzdGVtX3RpbWUgLSBNYWludGFpbiBzdGltZSBmb3IgYSB0aHJl YWQgZ3JvdXAuCi0gKgotICogQHRzazoJUG9pbnRlciB0byB0YXNrIHN0cnVjdHVyZS4KLSAqIEBj cHV0aW1lOglUaW1lIHZhbHVlIGJ5IHdoaWNoIHRvIGluY3JlbWVudCB0aGUgc3RpbWUgZmllbGQg b2YgdGhlCi0gKgkJdGhyZWFkX2dyb3VwX2NwdXRpbWUgc3RydWN0dXJlLgotICoKLSAqIElmIHRo cmVhZCBncm91cCB0aW1lIGlzIGJlaW5nIG1haW50YWluZWQsIGdldCB0aGUgc3RydWN0dXJlIGZv ciB0aGUKLSAqIHJ1bm5pbmcgQ1BVIGFuZCB1cGRhdGUgdGhlIHN0aW1lIGZpZWxkIHRoZXJlLgot ICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNjb3VudF9ncm91cF9zeXN0ZW1fdGltZShzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnRzaywKLQkJCQkJICAgICBjcHV0aW1lX3QgY3B1dGltZSkKLXsKLQlzdHJ1 Y3QgdGhyZWFkX2dyb3VwX2NwdXRpbWVyICpjcHV0aW1lciA9ICZ0c2stPnNpZ25hbC0+Y3B1dGlt ZXI7Ci0KLQlpZiAoIWNwdXRpbWVyLT5ydW5uaW5nKQotCQlyZXR1cm47Ci0KLQlyYXdfc3Bpbl9s b2NrKCZjcHV0aW1lci0+bG9jayk7Ci0JY3B1dGltZXItPmNwdXRpbWUuc3RpbWUgKz0gY3B1dGlt ZTsKLQlyYXdfc3Bpbl91bmxvY2soJmNwdXRpbWVyLT5sb2NrKTsKLX0KLQotLyoqCi0gKiBhY2Nv dW50X2dyb3VwX2V4ZWNfcnVudGltZSAtIE1haW50YWluIGV4ZWMgcnVudGltZSBmb3IgYSB0aHJl YWQgZ3JvdXAuCi0gKgotICogQHRzazoJUG9pbnRlciB0byB0YXNrIHN0cnVjdHVyZS4KLSAqIEBu czoJCVRpbWUgdmFsdWUgYnkgd2hpY2ggdG8gaW5jcmVtZW50IHRoZSBzdW1fZXhlY19ydW50aW1l IGZpZWxkCi0gKgkJb2YgdGhlIHRocmVhZF9ncm91cF9jcHV0aW1lIHN0cnVjdHVyZS4KLSAqCi0g KiBJZiB0aHJlYWQgZ3JvdXAgdGltZSBpcyBiZWluZyBtYWludGFpbmVkLCBnZXQgdGhlIHN0cnVj dHVyZSBmb3IgdGhlCi0gKiBydW5uaW5nIENQVSBhbmQgdXBkYXRlIHRoZSBzdW1fZXhlY19ydW50 aW1lIGZpZWxkIHRoZXJlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNjb3VudF9ncm91cF9l eGVjX3J1bnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkJCSAgICAgIHVuc2lnbmVk IGxvbmcgbG9uZyBucykKLXsKLQlzdHJ1Y3QgdGhyZWFkX2dyb3VwX2NwdXRpbWVyICpjcHV0aW1l ciA9ICZ0c2stPnNpZ25hbC0+Y3B1dGltZXI7Ci0KLQlpZiAoIWNwdXRpbWVyLT5ydW5uaW5nKQot CQlyZXR1cm47Ci0KLQlyYXdfc3Bpbl9sb2NrKCZjcHV0aW1lci0+bG9jayk7Ci0JY3B1dGltZXIt PmNwdXRpbWUuc3VtX2V4ZWNfcnVudGltZSArPSBuczsKLQlyYXdfc3Bpbl91bmxvY2soJmNwdXRp bWVyLT5sb2NrKTsKLX0KZGlmZiAtcnVOIGxpbnV4LTMuNC4xL2tlcm5lbC9zeXNjdGwuYyBsaW51 eC0zLjQuMS1SSUZTL2tlcm5lbC9zeXNjdGwuYwotLS0gbGludXgtMy40LjEva2VybmVsL3N5c2N0 bC5jCTIwMTItMDYtMDEgMTU6MTg6NDQuMDAwMDAwMDAwICswODAwCisrKyBsaW51eC0zLjQuMS1S SUZTL2tlcm5lbC9zeXNjdGwuYwkyMDEyLTA2LTE1IDIzOjQ2OjQ0LjAwMDAwMDAwMCArMDgwMApA QCAtMjQyLDYgKzI0Miw3IEBACiB9OwogCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisjaWZu ZGVmIENPTkZJR19TQ0hFRF9SSUZTCiBzdGF0aWMgaW50IG1pbl9zY2hlZF9ncmFudWxhcml0eV9u cyA9IDEwMDAwMDsJCS8qIDEwMCB1c2VjcyAqLwogc3RhdGljIGludCBtYXhfc2NoZWRfZ3JhbnVs YXJpdHlfbnMgPSBOU0VDX1BFUl9TRUM7CS8qIDEgc2Vjb25kICovCiBzdGF0aWMgaW50IG1pbl93 YWtldXBfZ3JhbnVsYXJpdHlfbnM7CQkJLyogMCB1c2VjcyAqLwpAQCAtMjQ5LDYgKzI1MCw3IEBA CiBzdGF0aWMgaW50IG1pbl9zY2hlZF90dW5hYmxlX3NjYWxpbmcgPSBTQ0hFRF9UVU5BQkxFU0NB TElOR19OT05FOwogc3RhdGljIGludCBtYXhfc2NoZWRfdHVuYWJsZV9zY2FsaW5nID0gU0NIRURf VFVOQUJMRVNDQUxJTkdfRU5ELTE7CiAjZW5kaWYKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0NP TVBBQ1RJT04KIHN0YXRpYyBpbnQgbWluX2V4dGZyYWdfdGhyZXNob2xkOwpAQCAtMjU2LDE0ICsy NTgsOCBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlIGtlcm5fdGFibGVbXSA9 IHsKLQl7Ci0JCS5wcm9jbmFtZQk9ICJzY2hlZF9jaGlsZF9ydW5zX2ZpcnN0IiwKLQkJLmRhdGEJ CT0gJnN5c2N0bF9zY2hlZF9jaGlsZF9ydW5zX2ZpcnN0LAotCQkubWF4bGVuCQk9IHNpemVvZih1 bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0LAotCQkucHJvY19oYW5kbGVyCT0gcHJvY19k b2ludHZlYywKLQl9LAogI2lmZGVmIENPTkZJR19TQ0hFRF9ERUJVRworI2lmbmRlZiBDT05GSUdf U0NIRURfUklGUwogCXsKIAkJLnByb2NuYW1lCT0gInNjaGVkX21pbl9ncmFudWxhcml0eV9ucyIs CiAJCS5kYXRhCQk9ICZzeXNjdGxfc2NoZWRfbWluX2dyYW51bGFyaXR5LApAQCAtMzM4LDIwICsz MzQsNyBAQAogCQkuZXh0cmEyCQk9ICZvbmUsCiAJfSwKICNlbmRpZgotCXsKLQkJLnByb2NuYW1l CT0gInNjaGVkX3J0X3BlcmlvZF91cyIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfc2NoZWRfcnRfcGVy aW9kLAotCQkubWF4bGVuCQk9IHNpemVvZih1bnNpZ25lZCBpbnQpLAotCQkubW9kZQkJPSAwNjQ0 LAotCQkucHJvY19oYW5kbGVyCT0gc2NoZWRfcnRfaGFuZGxlciwKLQl9LAotCXsKLQkJLnByb2Nu YW1lCT0gInNjaGVkX3J0X3J1bnRpbWVfdXMiLAotCQkuZGF0YQkJPSAmc3lzY3RsX3NjaGVkX3J0 X3J1bnRpbWUsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0J CS5wcm9jX2hhbmRsZXIJPSBzY2hlZF9ydF9oYW5kbGVyLAotCX0sCisjZW5kaWYKICNpZmRlZiBD T05GSUdfU0NIRURfQVVUT0dST1VQCiAJewogCQkucHJvY25hbWUJPSAic2NoZWRfYXV0b2dyb3Vw X2VuYWJsZWQiLAo= --20cf30244ca3ad66a004c29a1fb9-- -- 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/