Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757971Ab2FQWYo (ORCPT ); Sun, 17 Jun 2012 18:24:44 -0400 Received: from mail-ob0-f174.google.com ([209.85.214.174]:42791 "EHLO mail-ob0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757867Ab2FQWYk (ORCPT ); Sun, 17 Jun 2012 18:24:40 -0400 MIME-Version: 1.0 In-Reply-To: <1339914285.7349.75.camel@marge.simpson.net> References: <1339914285.7349.75.camel@marge.simpson.net> Date: Mon, 18 Jun 2012 06:24:38 +0800 Message-ID: Subject: Re: [PATCH][ANNOUNCE]RIFS-ES Scheduling V1 release. From: Chen To: Mike Galbraith Cc: linux-kernel@vger.kernel.org Content-Type: multipart/mixed; boundary=14dae9340435de35f104c2b2835a Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 265024 Lines: 3452 --14dae9340435de35f104c2b2835a Content-Type: text/plain; charset=ISO-8859-1 Sorry for my fault. The patch has build issue and I post the new one. --14dae9340435de35f104c2b2835a 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_h3konkta0 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 CmRpZmYgLXJ1TiBsaW51eC0zLjQuMS9pbmNsdWRlL2xpbnV4L3NjaGVkLmggbGludXgtMy40LjEt UklGUy9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKLS0tIGxpbnV4LTMuNC4xL2luY2x1ZGUvbGludXgv c2NoZWQuaAkyMDEyLTA2LTAxIDE1OjE4OjQ0LjAwMDAwMDAwMCArMDgwMAorKysgbGludXgtMy40 LjEtUklGUy9pbmNsdWRlL2xpbnV4L3NjaGVkLmgJMjAxMi0wNi0xNiAyMDoyODozNC4wMDAwMDAw MDAgKzA4MDAKQEAgLTM3LDkgKzM3LDEzIEBACiAjZGVmaW5lIFNDSEVEX0ZJRk8JCTEKICNkZWZp bmUgU0NIRURfUlIJCTIKICNkZWZpbmUgU0NIRURfQkFUQ0gJCTMKLS8qIFNDSEVEX0lTTzogcmVz ZXJ2ZWQgYnV0IG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KICNkZWZpbmUgU0NIRURfSURMRQkJNQot LyogQ2FuIGJlIE9SZWQgaW4gdG8gbWFrZSBzdXJlIHRoZSBwcm9jZXNzIGlzIHJldmVydGVkIGJh Y2sgdG8gU0NIRURfTk9STUFMIG9uIGZvcmsgKi8KKyNkZWZpbmUgU0NIRURfSURMRVBSSU8JCVND SEVEX0lETEUKKyNpZmRlZiBDT05GSUdfU0NIRURfUklGUworI2RlZmluZSBTQ0hFRF9NQVgJCShT Q0hFRF9JRExFUFJJTykKKyNkZWZpbmUgU0NIRURfUkFOR0UocG9saWN5KQkoKHBvbGljeSkgPD0g U0NIRURfTUFYKQorI2VuZGlmCisKICNkZWZpbmUgU0NIRURfUkVTRVRfT05fRk9SSyAgICAgMHg0 MDAwMDAwMAogCiAjaWZkZWYgX19LRVJORUxfXwpAQCAtMjY4LDggKzI3Miw2IEBACiBleHRlcm4g dm9pZCBpbml0X2lkbGUoc3RydWN0IHRhc2tfc3RydWN0ICppZGxlLCBpbnQgY3B1KTsKIGV4dGVy biB2b2lkIGluaXRfaWRsZV9ib290dXBfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpOwog Ci1leHRlcm4gaW50IHJ1bnF1ZXVlX2lzX2xvY2tlZChpbnQgY3B1KTsKLQogI2lmIGRlZmluZWQo Q09ORklHX1NNUCkgJiYgZGVmaW5lZChDT05GSUdfTk9fSFopCiBleHRlcm4gdm9pZCBzZWxlY3Rf bm9oel9sb2FkX2JhbGFuY2VyKGludCBzdG9wX3RpY2spOwogZXh0ZXJuIHZvaWQgc2V0X2NwdV9z ZF9zdGF0ZV9pZGxlKHZvaWQpOwpAQCAtMTI3MCwxNSArMTI3MiwzMyBAQAogCiAjaWZkZWYgQ09O RklHX1NNUAogCXN0cnVjdCBsbGlzdF9ub2RlIHdha2VfZW50cnk7Ci0JaW50IG9uX2NwdTsKICNl bmRpZgorI2lmbmRlZiBDT05GSUdfU0NIRURfUklGUworCWludCBvbl9jcHU7CiAJaW50IG9uX3Jx OwotCisjZWxzZQorCWJvb2wgb25fY3B1OworCWJvb2wgb25fcnE7CisjZW5kaWYKIAlpbnQgcHJp bywgc3RhdGljX3ByaW8sIG5vcm1hbF9wcmlvOwogCXVuc2lnbmVkIGludCBydF9wcmlvcml0eTsK KyNpZmRlZiBDT05GSUdfU0NIRURfUklGUworCWludCB0aW1lX3NsaWNlOworCWludCB0aWNrX3Vz ZWQ7CisJaW50IHNsZWVwX2NudDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHJ1bl9saXN0OworCXU2NCBs YXN0X3JhbjsKKwl1NjQgc2xlZXBfamlmZnk7CisJdTY0IHNjaGVkX3RpbWU7IC8qIHNjaGVkX2Ns b2NrIHRpbWUgc3BlbnQgcnVubmluZyAqLworI2lmZGVmIENPTkZJR19TTVAKKwlib29sIHN0aWNr eTsgLyogU29mdCBhZmZpbmVkIGZsYWcgKi8KKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgcnRfdGlt ZW91dDsKKyNlbHNlIC8qIENPTkZJR19TQ0hFRF9SSUZTICovCiAJY29uc3Qgc3RydWN0IHNjaGVk X2NsYXNzICpzY2hlZF9jbGFzczsKIAlzdHJ1Y3Qgc2NoZWRfZW50aXR5IHNlOwogCXN0cnVjdCBz Y2hlZF9ydF9lbnRpdHkgcnQ7CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19QUkVFTVBUX05PVElG SUVSUwogCS8qIGxpc3Qgb2Ygc3RydWN0IHByZWVtcHRfbm90aWZpZXI6ICovCkBAIC0xMzkxLDYg KzE0MTEsOSBAQAogCiAJY3B1dGltZV90IHV0aW1lLCBzdGltZSwgdXRpbWVzY2FsZWQsIHN0aW1l c2NhbGVkOwogCWNwdXRpbWVfdCBndGltZTsKKyNpZmRlZiBDT05GSUdfU0NIRURfUklGUworCXVu c2lnbmVkIGxvbmcgdXRpbWVfcGMsIHN0aW1lX3BjOworI2VuZGlmCiAjaWZuZGVmIENPTkZJR19W SVJUX0NQVV9BQ0NPVU5USU5HCiAJY3B1dGltZV90IHByZXZfdXRpbWUsIHByZXZfc3RpbWU7CiAj ZW5kaWYKQEAgLTE2MTksNiArMTY0Miw1NSBAQAogI2VuZGlmCiB9OwogCisjaWZkZWYgQ09ORklH X1NDSEVEX1JJRlMKK2Jvb2wgZ3J1bnF1ZXVlX2lzX2xvY2tlZCh2b2lkKTsKK3ZvaWQgZ3JxX3Vu bG9ja193YWl0KHZvaWQpOwordm9pZCBjcHVfc2NhbGluZyhpbnQgY3B1KTsKK3ZvaWQgY3B1X25v bnNjYWxpbmcoaW50IGNwdSk7Citib29sIGFib3ZlX2JhY2tncm91bmRfbG9hZCh2b2lkKTsKKyNk ZWZpbmUgdHNrX3NlcnVudGltZSh0KQkJKCh0KS0+c2NoZWRfdGltZSkKKyNkZWZpbmUgdHNrX3J0 dGltZW91dCh0KQkJKCh0KS0+cnRfdGltZW91dCkKKworc3RhdGljIGlubGluZSB2b2lkIHRza19j cHVzX2N1cnJlbnQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorCitzdGF0aWMgaW5saW5l IGludCBydW5xdWV1ZV9pc19sb2NrZWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gZ3J1bnF1ZXVlX2lz X2xvY2tlZCgpOworfQorCit2b2lkIHByaW50X3NjaGVkdWxlcl92ZXJzaW9uKHZvaWQpOworCisj ZWxzZSAvKiBDRlMgKi8KK2V4dGVybiBpbnQgcnVucXVldWVfaXNfbG9ja2VkKGludCBjcHUpOwor c3RhdGljIGlubGluZSB2b2lkIGNwdV9zY2FsaW5nKGludCBjcHUpCit7Cit9CisKK3N0YXRpYyBp bmxpbmUgdm9pZCBjcHVfbm9uc2NhbGluZyhpbnQgY3B1KQoreworfQorI2RlZmluZSB0c2tfc2Vy dW50aW1lKHQpCSgodCktPnNlLnN1bV9leGVjX3J1bnRpbWUpCisjZGVmaW5lIHRza19ydHRpbWVv dXQodCkJKCh0KS0+cnQudGltZW91dCkKKworc3RhdGljIGlubGluZSB2b2lkIHRza19jcHVzX2N1 cnJlbnQoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXAtPnJ0Lm5yX2NwdXNfYWxsb3dlZCA9 IGN1cnJlbnQtPnJ0Lm5yX2NwdXNfYWxsb3dlZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHBy aW50X3NjaGVkdWxlcl92ZXJzaW9uKHZvaWQpCit7CisJcHJpbnRrKEtFUk5fSU5GTyJDRlMgQ1BV IHNjaGVkdWxlci5cbiIpOworfQorCisvKiBBbnlvbmUgZmVlbCBsaWtlIGltcGxlbWVudGluZyB0 aGlzPyAqLworc3RhdGljIGlubGluZSBib29sIGFib3ZlX2JhY2tncm91bmRfbG9hZCh2b2lkKQor eworCXJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAvKiBDT05GSUdfU0NIRURfUklGUyAqLworCiAv KiBGdXR1cmUtc2FmZSBhY2Nlc3NvciBmb3Igc3RydWN0IHRhc2tfc3RydWN0J3MgY3B1c19hbGxv d2VkLiAqLwogI2RlZmluZSB0c2tfY3B1c19hbGxvd2VkKHRzaykgKCYodHNrKS0+Y3B1c19hbGxv d2VkKQogCkBAIC0xNjM2LDEwICsxNzA4LDIwIEBACiAgKi8KIAogI2RlZmluZSBNQVhfVVNFUl9S VF9QUklPCTEwMAotI2RlZmluZSBNQVhfUlRfUFJJTwkJTUFYX1VTRVJfUlRfUFJJTworI2RlZmlu ZSBNQVhfUlRfUFJJTwkJKE1BWF9VU0VSX1JUX1BSSU8pCisjZGVmaW5lIERFRkFVTFRfUFJJTwkJ KE1BWF9SVF9QUklPICsgMjApCiAKKyNpZmRlZiBDT05GSUdfU0NIRURfUklGUworI2RlZmluZSBQ UklPX1JBTkdFCQkoNDApCisjZGVmaW5lIE1BWF9QUklPCQkoTUFYX1JUX1BSSU8gKyBQUklPX1JB TkdFKQorLy8jZGVmaW5lIElTT19QUklPCQkoTUFYX1JUX1BSSU8pIOW3sue7j+iiq+aIkeW5suaO ie+8jOWTiOWTiAorI2RlZmluZSBOT1JNQUxfUFJJTwkJKE1BWF9SVF9QUklPICsgMSkKKyNkZWZp bmUgSURMRV9QUklPCQkoTUFYX1BSSU8gKyAxKQorI2RlZmluZSBQUklPX0xJTUlUCQkoKElETEVf UFJJTykgKyAxKQorI2Vsc2UgLyogQ09ORklHX1NDSEVEX1JJRlMgKi8KICNkZWZpbmUgTUFYX1BS SU8JCShNQVhfUlRfUFJJTyArIDQwKQotI2RlZmluZSBERUZBVUxUX1BSSU8JCShNQVhfUlRfUFJJ TyArIDIwKQorI2RlZmluZSBOT1JNQUxfUFJJTwkJKERFRkFVTFRfUFJJTykKKyNlbmRpZiAvKiBD T05GSUdfU0NIRURfUklGUyAqLwogCiBzdGF0aWMgaW5saW5lIGludCBydF9wcmlvKGludCBwcmlv KQogewpAQCAtMjAwMiw3ICsyMDg0LDcgQEAKIHRhc2tfc2NoZWRfcnVudGltZShzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnRhc2spOwogCiAvKiBzY2hlZF9leGVjIGlzIGNhbGxlZCBieSBwcm9jZXNzZXMg cGVyZm9ybWluZyBhbiBleGVjICovCi0jaWZkZWYgQ09ORklHX1NNUAorI2lmIGRlZmluZWQoQ09O RklHX1NNUCkgJiYgIWRlZmluZWQoQ09ORklHX1NDSEVEX1JJRlMpCiBleHRlcm4gdm9pZCBzY2hl ZF9leGVjKHZvaWQpOwogI2Vsc2UKICNkZWZpbmUgc2NoZWRfZXhlYygpICAge30KZGlmZiAtcnVO IGxpbnV4LTMuNC4xL2luaXQvS2NvbmZpZyBsaW51eC0zLjQuMS1SSUZTL2luaXQvS2NvbmZpZwot LS0gbGludXgtMy40LjEvaW5pdC9LY29uZmlnCTIwMTItMDYtMDEgMTU6MTg6NDQuMDAwMDAwMDAw ICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2luaXQvS2NvbmZpZwkyMDEyLTA2LTA4IDIyOjE1 OjMwLjAwMDAwMDAwMCArMDgwMApAQCAtMjksNiArMjksMTggQEAKIAogbWVudSAiR2VuZXJhbCBz ZXR1cCIKIAorY29uZmlnIFNDSEVEX1JJRlMKKwlib29sICJSSUZTIGNwdSBzY2hlZHVsZXIiCisJ LS0taGVscC0tLQorCSAgVGhlIFJJRlMgY3B1IHNjaGVkdWxlciBpcyBkZXNpZ25lZCBmb3IgZXhj ZWxsZW50IGludGVyYWN0aXZpdHkgYW5kCisJICByZXNwb25zaXZlbmVzcy4KKworCSAgQ3VycmVu dGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBHcm91cCBDUFUgc2NoZWR1bGVyLCBhbmQgUkNVIFRP UlRVUkUKKyAgICAgICAgICBURVNUIHNvIHRoZXNlIG9wdGlvbnMgYXJlIGRpc2FibGVkLgorCisg ICAgICAgICAgU2F5IFkgaGVyZS4KKwlkZWZhdWx0IHkKKwogY29uZmlnIEVYUEVSSU1FTlRBTAog CWJvb2wgIlByb21wdCBmb3IgZGV2ZWxvcG1lbnQgYW5kL29yIGluY29tcGxldGUgY29kZS9kcml2 ZXJzIgogCS0tLWhlbHAtLS0KQEAgLTYzMSw2ICs2NDMsNyBAQAogCiBjb25maWcgQ0dST1VQX0NQ VUFDQ1QKIAlib29sICJTaW1wbGUgQ1BVIGFjY291bnRpbmcgY2dyb3VwIHN1YnN5c3RlbSIKKwlk ZXBlbmRzIG9uICFTQ0hFRF9SSUZTCiAJaGVscAogCSAgUHJvdmlkZXMgYSBzaW1wbGUgUmVzb3Vy Y2UgQ29udHJvbGxlciBmb3IgbW9uaXRvcmluZyB0aGUKIAkgIHRvdGFsIENQVSBjb25zdW1lZCBi eSB0aGUgdGFza3MgaW4gYSBjZ3JvdXAuCkBAIC03MTgsNiArNzMxLDcgQEAKIAogbWVudWNvbmZp ZyBDR1JPVVBfU0NIRUQKIAlib29sICJHcm91cCBDUFUgc2NoZWR1bGVyIgorCWRlcGVuZHMgb24g IVNDSEVEX1JJRlMKIAlkZWZhdWx0IG4KIAloZWxwCiAJICBUaGlzIGZlYXR1cmUgbGV0cyBDUFUg c2NoZWR1bGVyIHJlY29nbml6ZSB0YXNrIGdyb3VwcyBhbmQgY29udHJvbCBDUFUKQEAgLTg1NCw2 ICs4NjgsNyBAQAogCiBjb25maWcgU0NIRURfQVVUT0dST1VQCiAJYm9vbCAiQXV0b21hdGljIHBy b2Nlc3MgZ3JvdXAgc2NoZWR1bGluZyIKKwlkZXBlbmRzIG9uICFTQ0hFRF9SSUZTCiAJc2VsZWN0 IEVWRU5URkQKIAlzZWxlY3QgQ0dST1VQUwogCXNlbGVjdCBDR1JPVVBfU0NIRUQKZGlmZiAtcnVO IGxpbnV4LTMuNC4xL2tlcm5lbC9kZWxheWFjY3QuYyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9k ZWxheWFjY3QuYwotLS0gbGludXgtMy40LjEva2VybmVsL2RlbGF5YWNjdC5jCTIwMTItMDYtMDEg MTU6MTg6NDQuMDAwMDAwMDAwICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9kZWxh eWFjY3QuYwkyMDEyLTA2LTA2IDE1OjAzOjMwLjAwMDAwMDAwMCArMDgwMApAQCAtMTMwLDcgKzEz MCw3IEBACiAJICovCiAJdDEgPSB0c2stPnNjaGVkX2luZm8ucGNvdW50OwogCXQyID0gdHNrLT5z Y2hlZF9pbmZvLnJ1bl9kZWxheTsKLQl0MyA9IHRzay0+c2Uuc3VtX2V4ZWNfcnVudGltZTsKKwl0 MyA9IHRza19zZXJ1bnRpbWUodHNrKTsKIAogCWQtPmNwdV9jb3VudCArPSB0MTsKIApkaWZmIC1y dU4gbGludXgtMy40LjEva2VybmVsL2V4aXQuYyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9leGl0 LmMKLS0tIGxpbnV4LTMuNC4xL2tlcm5lbC9leGl0LmMJMjAxMi0wNi0wMSAxNToxODo0NC4wMDAw MDAwMDAgKzA4MDAKKysrIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL2V4aXQuYwkyMDEyLTA2LTA1 IDIwOjQ2OjQ1LjAwMDAwMDAwMCArMDgwMApAQCAtMTMzLDcgKzEzMyw3IEBACiAJCXNpZy0+aW5i bG9jayArPSB0YXNrX2lvX2dldF9pbmJsb2NrKHRzayk7CiAJCXNpZy0+b3VibG9jayArPSB0YXNr X2lvX2dldF9vdWJsb2NrKHRzayk7CiAJCXRhc2tfaW9fYWNjb3VudGluZ19hZGQoJnNpZy0+aW9h YywgJnRzay0+aW9hYyk7Ci0JCXNpZy0+c3VtX3NjaGVkX3J1bnRpbWUgKz0gdHNrLT5zZS5zdW1f ZXhlY19ydW50aW1lOworCQlzaWctPnN1bV9zY2hlZF9ydW50aW1lICs9IHRza19zZXJ1bnRpbWUo dHNrKTsKIAl9CiAKIAlzaWctPm5yX3RocmVhZHMtLTsKZGlmZiAtcnVOIGxpbnV4LTMuNC4xL2tl cm5lbC9wb3NpeC1jcHUtdGltZXJzLmMgbGludXgtMy40LjEtUklGUy9rZXJuZWwvcG9zaXgtY3B1 LXRpbWVycy5jCi0tLSBsaW51eC0zLjQuMS9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCTIwMTIt MDYtMDEgMTU6MTg6NDQuMDAwMDAwMDAwICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2tlcm5l bC9wb3NpeC1jcHUtdGltZXJzLmMJMjAxMi0wNi0wNiAxNDozNzozNS4wMDAwMDAwMDAgKzA4MDAK QEAgLTQ5NSw3ICs0OTUsNyBAQAogdm9pZCBwb3NpeF9jcHVfdGltZXJzX2V4aXQoc3RydWN0IHRh c2tfc3RydWN0ICp0c2spCiB7CiAJY2xlYW51cF90aW1lcnModHNrLT5jcHVfdGltZXJzLAotCQkg ICAgICAgdHNrLT51dGltZSwgdHNrLT5zdGltZSwgdHNrLT5zZS5zdW1fZXhlY19ydW50aW1lKTsK KwkJICAgICAgIHRzay0+dXRpbWUsIHRzay0+c3RpbWUsIHRza19zZXJ1bnRpbWUodHNrKSk7CiAK IH0KIHZvaWQgcG9zaXhfY3B1X3RpbWVyc19leGl0X2dyb3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAq dHNrKQpAQCAtNTA0LDcgKzUwNCw3IEBACiAKIAljbGVhbnVwX3RpbWVycyh0c2stPnNpZ25hbC0+ Y3B1X3RpbWVycywKIAkJICAgICAgIHRzay0+dXRpbWUgKyBzaWctPnV0aW1lLCB0c2stPnN0aW1l ICsgc2lnLT5zdGltZSwKLQkJICAgICAgIHRzay0+c2Uuc3VtX2V4ZWNfcnVudGltZSArIHNpZy0+ c3VtX3NjaGVkX3J1bnRpbWUpOworCQkgICAgICAgdHNrX3NlcnVudGltZSh0c2spICsgc2lnLT5z dW1fc2NoZWRfcnVudGltZSk7CiB9CiAKIHN0YXRpYyB2b2lkIGNsZWFyX2RlYWRfdGFzayhzdHJ1 Y3Qga19pdGltZXIgKnRpbWVyLCB1bmlvbiBjcHVfdGltZV9jb3VudCBub3cpCkBAIC05MzQsNyAr OTM0LDcgQEAKIAkJc3RydWN0IGNwdV90aW1lcl9saXN0ICp0ID0gbGlzdF9maXJzdF9lbnRyeSh0 aW1lcnMsCiAJCQkJCQkgICAgICBzdHJ1Y3QgY3B1X3RpbWVyX2xpc3QsCiAJCQkJCQkgICAgICBl bnRyeSk7Ci0JCWlmICghLS1tYXhmaXJlIHx8IHRzay0+c2Uuc3VtX2V4ZWNfcnVudGltZSA8IHQt PmV4cGlyZXMuc2NoZWQpIHsKKwkJaWYgKCEtLW1heGZpcmUgfHwgdHNrX3NlcnVudGltZSh0c2sp IDwgdC0+ZXhwaXJlcy5zY2hlZCkgewogCQkJdHNrLT5jcHV0aW1lX2V4cGlyZXMuc2NoZWRfZXhw ID0gdC0+ZXhwaXJlcy5zY2hlZDsKIAkJCWJyZWFrOwogCQl9CkBAIC05NTEsNyArOTUxLDcgQEAK IAkJCUFDQ0VTU19PTkNFKHNpZy0+cmxpbVtSTElNSVRfUlRUSU1FXS5ybGltX21heCk7CiAKIAkJ aWYgKGhhcmQgIT0gUkxJTV9JTkZJTklUWSAmJgotCQkgICAgdHNrLT5ydC50aW1lb3V0ID4gRElW X1JPVU5EX1VQKGhhcmQsIFVTRUNfUEVSX1NFQy9IWikpIHsKKwkJICAgIHRza19ydHRpbWVvdXQo dHNrKSA+IERJVl9ST1VORF9VUChoYXJkLCBVU0VDX1BFUl9TRUMvSFopKSB7CiAJCQkvKgogCQkJ ICogQXQgdGhlIGhhcmQgbGltaXQsIHdlIGp1c3QgZGllLgogCQkJICogTm8gbmVlZCB0byBjYWxj dWxhdGUgYW55dGhpbmcgZWxzZSBub3cuCkBAIC05NTksNyArOTU5LDcgQEAKIAkJCV9fZ3JvdXBf c2VuZF9zaWdfaW5mbyhTSUdLSUxMLCBTRU5EX1NJR19QUklWLCB0c2spOwogCQkJcmV0dXJuOwog CQl9Ci0JCWlmICh0c2stPnJ0LnRpbWVvdXQgPiBESVZfUk9VTkRfVVAoc29mdCwgVVNFQ19QRVJf U0VDL0haKSkgeworCQlpZiAodHNrX3J0dGltZW91dCh0c2spID4gRElWX1JPVU5EX1VQKHNvZnQs IFVTRUNfUEVSX1NFQy9IWikpIHsKIAkJCS8qCiAJCQkgKiBBdCB0aGUgc29mdCBsaW1pdCwgc2Vu ZCBhIFNJR1hDUFUgZXZlcnkgc2Vjb25kLgogCQkJICovCkBAIC0xMjUyLDcgKzEyNTIsNyBAQAog CQlzdHJ1Y3QgdGFza19jcHV0aW1lIHRhc2tfc2FtcGxlID0gewogCQkJLnV0aW1lID0gdHNrLT51 dGltZSwKIAkJCS5zdGltZSA9IHRzay0+c3RpbWUsCi0JCQkuc3VtX2V4ZWNfcnVudGltZSA9IHRz ay0+c2Uuc3VtX2V4ZWNfcnVudGltZQorCQkJLnN1bV9leGVjX3J1bnRpbWUgPSB0c2tfc2VydW50 aW1lKHRzaykKIAkJfTsKIAogCQlpZiAodGFza19jcHV0aW1lX2V4cGlyZWQoJnRhc2tfc2FtcGxl LCAmdHNrLT5jcHV0aW1lX2V4cGlyZXMpKQpkaWZmIC1ydU4gbGludXgtMy40LjEva2VybmVsL3Nj aGVkL01ha2VmaWxlIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3NjaGVkL01ha2VmaWxlCi0tLSBs aW51eC0zLjQuMS9rZXJuZWwvc2NoZWQvTWFrZWZpbGUJMjAxMi0wNi0wMSAxNToxODo0NC4wMDAw MDAwMDAgKzA4MDAKKysrIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3NjaGVkL01ha2VmaWxlCTIw MTItMDYtMDUgMjA6NDI6MjIuMDAwMDAwMDAwICswODAwCkBAIC0xMSwxMCArMTEsMTMgQEAKIENG TEFHU19jb3JlLm8gOj0gJChQUk9GSUxJTkcpIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyCiBlbmRp ZgogCitpZmRlZiBDT05GSUdfU0NIRURfUklGUworb2JqLXkgKz0gcmlmcy5vIGNsb2NrLm8KK2Vs c2UKIG9iai15ICs9IGNvcmUubyBjbG9jay5vIGlkbGVfdGFzay5vIGZhaXIubyBydC5vIHN0b3Bf dGFzay5vCi1vYmotJChDT05GSUdfU01QKSArPSBjcHVwcmkubwogb2JqLSQoQ09ORklHX1NDSEVE X0FVVE9HUk9VUCkgKz0gYXV0b19ncm91cC5vCi1vYmotJChDT05GSUdfU0NIRURTVEFUUykgKz0g c3RhdHMubwogb2JqLSQoQ09ORklHX1NDSEVEX0RFQlVHKSArPSBkZWJ1Zy5vCitlbmRpZgorb2Jq LSQoQ09ORklHX1NNUCkgKz0gY3B1cHJpLm8KIAogCmRpZmYgLXJ1TiBsaW51eC0zLjQuMS9rZXJu ZWwvc2NoZWQvcmlmcy5jIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3NjaGVkL3JpZnMuYwotLS0g bGludXgtMy40LjEva2VybmVsL3NjaGVkL3JpZnMuYwkxOTcwLTAxLTAxIDA4OjAwOjAwLjAwMDAw MDAwMCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9rZXJuZWwvc2NoZWQvcmlmcy5jCTIwMTIt MDYtMTYgMjI6NTc6NTAuMDAwMDAwMDAwICswODAwCkBAIC0wLDAgKzEsNjY5MiBAQAorLyoKKyAq ICBrZXJuZWwvc2NoZWQvcmlmcy5jCisgKgorICogIEtlcm5lbCBzY2hlZHVsZXIgYW5kIHJlbGF0 ZWQgc3lzY2FsbHMKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTkxLTIwMDIgIExpbnVzIFRvcnZh bGRzCisgKgorICogIDE5OTYtMTItMjMgIE1vZGlmaWVkIGJ5IERhdmUgR3JvdGhlIHRvIGZpeCBi dWdzIGluIHNlbWFwaG9yZXMgYW5kCisgKgkJbWFrZSBzZW1hcGhvcmVzIFNNUCBzYWZlCisgKiAg MTk5OC0xMS0xOQlJbXBsZW1lbnRlZCBzY2hlZHVsZV90aW1lb3V0KCkgYW5kIHJlbGF0ZWQgc3R1 ZmYKKyAqCQlieSBBbmRyZWEgQXJjYW5nZWxpCisgKiAgMjAwMi0wMS0wNAlOZXcgdWx0cmEtc2Nh bGFibGUgTygxKSBzY2hlZHVsZXIgYnkgSW5nbyBNb2xuYXI6CisgKgkJaHlicmlkIHByaW9yaXR5 LWxpc3QgYW5kIHJvdW5kLXJvYmluIGRlc2lnbiB3aXRoCisgKgkJYW4gYXJyYXktc3dpdGNoIG1l dGhvZCBvZiBkaXN0cmlidXRpbmcgdGltZXNsaWNlcworICoJCWFuZCBwZXItQ1BVIHJ1bnF1ZXVl cy4gIENsZWFudXBzIGFuZCB1c2VmdWwgc3VnZ2VzdGlvbnMKKyAqCQlieSBEYXZpZGUgTGliZW56 aSwgcHJlZW1wdGlibGUga2VybmVsIGJpdHMgYnkgUm9iZXJ0IExvdmUuCisgKiAgMjAwMy0wOS0w MwlJbnRlcmFjdGl2aXR5IHR1bmluZyBieSBDb24gS29saXZhcy4KKyAqICAyMDA0LTA0LTAyCVNj aGVkdWxlciBkb21haW5zIGNvZGUgYnkgTmljayBQaWdnaW4KKyAqICAyMDA3LTA0LTE1ICBXb3Jr IGJlZ3VuIG9uIHJlcGxhY2luZyBhbGwgaW50ZXJhY3Rpdml0eSB0dW5pbmcgd2l0aCBhCisgKgkJ CSAgZmFpciBzY2hlZHVsaW5nIGRlc2lnbiBieSBDb24gS29saXZhcy4KKyAqICAyMDA3LTA1LTA1 ICBMb2FkIGJhbGFuY2luZyAoc21wLW5pY2UpIGFuZCBvdGhlciBpbXByb3ZlbWVudHMKKyAqCQkJ ICBieSBQZXRlciBXaWxsaWFtcworICogIDIwMDctMDUtMDYgIEludGVyYWN0aXZpdHkgaW1wcm92 ZW1lbnRzIHRvIENGUyBieSBNaWtlIEdhbGJyYWl0aAorICogIDIwMDctMDctMDEgIEdyb3VwIHNj aGVkdWxpbmcgZW5oYW5jZW1lbnRzIGJ5IFNyaXZhdHNhIFZhZGRhZ2lyaQorICogIDIwMDctMTEt MjkgIFJUIGJhbGFuY2luZyBpbXByb3ZlbWVudHMgYnkgU3RldmVuIFJvc3RlZHQsIEdyZWdvcnkg SGFza2lucywKKyAqCQkJICBUaG9tYXMgR2xlaXhuZXIsIE1pa2UgS3JhdmV0egorICovCisKKyNp bmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L25taS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxhc20vdWFj Y2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0uaD4KKyNpbmNsdWRlIDxhc20vbW11X2Nv bnRleHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9j YXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvY29tcGxldGlvbi5oPgorI2luY2x1ZGUgPGxp bnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvZGVidWdfbG9ja3MuaD4KKyNpbmNs dWRlIDxsaW51eC9wZXJmX2V2ZW50Lmg+CisjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KKyNp bmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KKyNp bmNsdWRlIDxsaW51eC9mcmVlemVyLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorI2lu Y2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVk ZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGxp bnV4L3RpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51 eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVzZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9jcHVt YXNrLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19m cy5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3lzY2Fs bHMuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RzYWNjdF9r ZXJuLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5 YWNjdC5oPgorI2luY2x1ZGUgPGxpbnV4L2xvZzIuaD4KKyNpbmNsdWRlIDxsaW51eC9ib290bWVt Lmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgor I2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgorI2luY2x1ZGUgPGxpbnV4L21hdGg2NC5oPgor CisjaW5jbHVkZSA8YXNtL3N3aXRjaF90by5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKyNpbmNs dWRlIDxhc20vdW5pc3RkLmg+CisjaW5jbHVkZSA8YXNtL211dGV4Lmg+CisKKyNpbmNsdWRlICJj cHVwcmkuaCIKKyNpbmNsdWRlICIuLi93b3JrcXVldWVfc2NoZWQuaCIKKworI2RlZmluZSBDUkVB VEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CisKKyNkZWZp bmUgTUFYX1RJQ0tfVVNFRAkJKHJyX2ludGVydmFsICogMykKKyNkZWZpbmUgTUFYX1NMRUVQX0NP VU5UCQkocnJfaW50ZXJ2YWwgKiAzKQorI2RlZmluZSBydF9wcmlvKHByaW8pCQl1bmxpa2VseSgo cHJpbykgPCBNQVhfUlRfUFJJTykKKyNkZWZpbmUgcnRfdGFzayhwKQkJcnRfcHJpbygocCktPnBy aW8pCisjZGVmaW5lIHJ0X3F1ZXVlKHJxKQkJcnRfcHJpbygocnEpLT5ycV9wcmlvKQorI2RlZmlu ZSBiYXRjaF90YXNrKHApCQkodW5saWtlbHkoKHApLT5wb2xpY3kgPT0gU0NIRURfQkFUQ0gpKQor I2RlZmluZSBpc19ydF9wb2xpY3kocG9saWN5KQkoKHBvbGljeSkgPT0gU0NIRURfRklGTyB8fCBc CisJCQkJCShwb2xpY3kpID09IFNDSEVEX1JSKQorI2RlZmluZSBoYXNfcnRfcG9saWN5KHApCXVu bGlrZWx5KGlzX3J0X3BvbGljeSgocCktPnBvbGljeSkpCisjZGVmaW5lIGlkbGVwcmlvX3Rhc2so cCkJdW5saWtlbHkoKHApLT5wb2xpY3kgPT0gU0NIRURfSURMRVBSSU8pCisjZGVmaW5lIHJldmVy c2UobWF4LCB2YWwpCShtYXggLSB2YWwpCisKKy8qCisgKiBDb252ZXJ0IHVzZXItbmljZSB2YWx1 ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0KKyAqIHRvIHN0YXRpYyBwcmlvcml0eSBbIE1BWF9SVF9Q UklPLi5NQVhfUFJJTy0xIF0sCisgKiBhbmQgYmFjay4KKyAqLworI2RlZmluZSBOSUNFX1RPX1BS SU8obmljZSkJKE1BWF9SVF9QUklPICsgKG5pY2UpICsgMjApCisjZGVmaW5lIFBSSU9fVE9fTklD RShwcmlvKQkoKHByaW8pIC0gTUFYX1JUX1BSSU8gLSAyMCkKKyNkZWZpbmUgVEFTS19OSUNFKHAp CQlQUklPX1RPX05JQ0UoKHApLT5zdGF0aWNfcHJpbykKKworLyoKKyAqICdVc2VyIHByaW9yaXR5 JyBpcyB0aGUgbmljZSB2YWx1ZSBjb252ZXJ0ZWQgdG8gc29tZXRoaW5nIHdlCisgKiBjYW4gd29y ayB3aXRoIGJldHRlciB3aGVuIHNjYWxpbmcgdmFyaW91cyBzY2hlZHVsZXIgcGFyYW1ldGVycywK KyAqIGl0J3MgYSBbIDAgLi4uIDM5IF0gcmFuZ2UuCisgKi8KKyNkZWZpbmUgVVNFUl9QUklPKHAp CQkoKHApIC0gTUFYX1JUX1BSSU8pCisjZGVmaW5lIFRBU0tfVVNFUl9QUklPKHApCVVTRVJfUFJJ TygocCktPnN0YXRpY19wcmlvKQorI2RlZmluZSBNQVhfVVNFUl9QUklPCQkoVVNFUl9QUklPKE1B WF9QUklPKSkKKyNkZWZpbmUgU0NIRURfUFJJTyhwKQkJKChwKSArIE1BWF9SVF9QUklPKQorI2Rl ZmluZSBTVE9QX1BSSU8JCShNQVhfUlRfUFJJTyAtIDEpCisKKy8qCisgKiBTb21lIGhlbHBlcnMg Zm9yIGNvbnZlcnRpbmcgdG8vZnJvbSB2YXJpb3VzIHNjYWxlcy4gVXNlIHNoaWZ0cyB0byBnZXQK KyAqIGFwcHJveGltYXRlIG11bHRpcGxlcyBvZiB0ZW4gZm9yIGxlc3Mgb3ZlcmhlYWQuCisgKi8K KyNkZWZpbmUgSklGRklFU19UT19OUyhUSU1FKQkoKFRJTUUpICogKDEwMDAwMDAwMDAgLyBIWikp CisjZGVmaW5lIEpJRkZZX05TCQkoMTAwMDAwMDAwMCAvIEhaKQorI2RlZmluZSBIQUxGX0pJRkZZ X05TCQkoMTAwMDAwMDAwMCAvIEhaIC8gMikKKyNkZWZpbmUgSEFMRl9KSUZGWV9VUwkJKDEwMDAw MDAgLyBIWiAvIDIpCisjZGVmaW5lIE1TX1RPX05TKFRJTUUpCQkoKFRJTUUpIDw8IDIwKQorI2Rl ZmluZSBNU19UT19VUyhUSU1FKQkJKChUSU1FKSA8PCAxMCkKKyNkZWZpbmUgTlNfVE9fTVMoVElN RSkJCSgoVElNRSkgPj4gMjApCisjZGVmaW5lIE5TX1RPX1VTKFRJTUUpCQkoKFRJTUUpID4+IDEw KQorCisjZGVmaW5lIFJFU0NIRURfVVMJKDEwMCkgLyogUmVzY2hlZHVsZSBpZiBsZXNzIHRoYW4g dGhpcyBtYW55IM68cyBsZWZ0ICovCisKK3ZvaWQgcHJpbnRfc2NoZWR1bGVyX3ZlcnNpb24odm9p ZCkKK3sKKwlwcmludGsoS0VSTl9JTkZPICJSb3RhcnkgSW50ZXJhY3Rpdml0eSBGYXZvciBTY2hl ZHVsZXIgLSBSSUZTIEJ5IFFROjM3NjY2OTEuXG4iKTsKK30KKworLyoKKyAqIFRoaXMgaXMgdGhl IHRpbWUgYWxsIHRhc2tzIHdpdGhpbiB0aGUgc2FtZSBwcmlvcml0eSByb3VuZCByb2Jpbi4KKyAq IFZhbHVlIGlzIGluIG1zIGFuZCBzZXQgdG8gYSBtaW5pbXVtIG9mIDZtcy4gU2NhbGVzIHdpdGgg bnVtYmVyIG9mIGNwdXMuCisgKiBUdW5hYmxlIHZpYSAvcHJvYyBpbnRlcmZhY2UuCisgKi8KK2lu dCBycl9pbnRlcnZhbCBfX3JlYWRfbW9zdGx5ID0gNjsKKworLyoKKyAqIOWFvOWuueOAggorICov CitpbnQgc2NoZWRfaXNvX2NwdSBfX3JlYWRfbW9zdGx5ID0gMDsKKworLyoKKyAqIHRpbWVfc2xp Y2UgZm9yIGVhY2ggcHJvY2VzcworICovCisjZGVmaW5lIHRpbWVzbGljZSgpIE1TX1RPX1VTKHJy X2ludGVydmFsKQorCisjZGVmaW5lIGdldF90aW1lX3NsaWNlKHApIHsgXAorCXAtPnRpbWVfc2xp Y2UgPSB0aW1lc2xpY2UoKTsJXAorfQorCisvKgorICogVGhlIGdsb2JhbCBydW5xdWV1ZSBkYXRh IHRoYXQgYWxsIENQVXMgd29yayBvZmYuIERhdGEgaXMgcHJvdGVjdGVkIGVpdGhlcgorICogYnkg dGhlIGdsb2JhbCBncnEgbG9jaywgb3IgdGhlIGRpc2NyZXRlIGxvY2sgdGhhdCBwcmVjZWRlcyB0 aGUgZGF0YSBpbiB0aGlzCisgKiBzdHJ1Y3QuCisgKi8KK3N0cnVjdCBnbG9iYWxfcnEgeworCXJh d19zcGlubG9ja190IGxvY2s7CisJdW5zaWduZWQgbG9uZyBucl9ydW5uaW5nOworCXVuc2lnbmVk IGxvbmcgbnJfdW5pbnRlcnJ1cHRpYmxlOworCXVuc2lnbmVkIGxvbmcgbG9uZyBucl9zd2l0Y2hl czsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHF1ZXVlW1BSSU9fTElNSVRdOworCURFQ0xBUkVfQklUTUFQ KHByaW9fYml0bWFwLCBQUklPX0xJTUlUICsgMSk7CisjaWZkZWYgQ09ORklHX1NNUAorCXVuc2ln bmVkIGxvbmcgcW5yOyAvKiBxdWV1ZWQgbm90IHJ1bm5pbmcgKi8KKwljcHVtYXNrX3QgY3B1X2lk bGVfbWFwOworCWJvb2wgaWRsZV9jcHVzOworI2VuZGlmCisJaW50IG5vYzsgLyogbnVtX29ubGlu ZV9jcHVzIHN0b3JlZCBhbmQgdXBkYXRlZCB3aGVuIGl0IGNoYW5nZXMgKi8KK307CisKKyNpZmRl ZiBDT05GSUdfU01QCisKKy8qCisgKiBXZSBhZGQgdGhlIG5vdGlvbiBvZiBhIHJvb3QtZG9tYWlu IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkZWZpbmUgcGVyLWRvbWFpbgorICogdmFyaWFibGVzLiBF YWNoIGV4Y2x1c2l2ZSBjcHVzZXQgZXNzZW50aWFsbHkgZGVmaW5lcyBhbiBpc2xhbmQgZG9tYWlu IGJ5CisgKiBmdWxseSBwYXJ0aXRpb25pbmcgdGhlIG1lbWJlciBjcHVzIGZyb20gYW55IG90aGVy IGNwdXNldC4gV2hlbmV2ZXIgYSBuZXcKKyAqIGV4Y2x1c2l2ZSBjcHVzZXQgaXMgY3JlYXRlZCwg d2UgYWxzbyBjcmVhdGUgYW5kIGF0dGFjaCBhIG5ldyByb290LWRvbWFpbgorICogb2JqZWN0Lgor ICoKKyAqLworc3RydWN0IHJvb3RfZG9tYWluIHsKKwlhdG9taWNfdCByZWZjb3VudDsKKwlhdG9t aWNfdCBydG9fY291bnQ7CisJc3RydWN0IHJjdV9oZWFkIHJjdTsKKwljcHVtYXNrX3Zhcl90IHNw YW47CisJY3B1bWFza192YXJfdCBvbmxpbmU7CisKKwkvKgorCSAqIFRoZSAiUlQgb3ZlcmxvYWQi IGZsYWc6IGl0IGdldHMgc2V0IGlmIGEgQ1BVIGhhcyBtb3JlIHRoYW4KKwkgKiBvbmUgcnVubmFi bGUgUlQgdGFzay4KKwkgKi8KKwljcHVtYXNrX3Zhcl90IHJ0b19tYXNrOworCXN0cnVjdCBjcHVw cmkgY3B1cHJpOworfTsKKworLyoKKyAqIEJ5IGRlZmF1bHQgdGhlIHN5c3RlbSBjcmVhdGVzIGEg c2luZ2xlIHJvb3QtZG9tYWluIHdpdGggYWxsIGNwdXMgYXMKKyAqIG1lbWJlcnMgKG1pbWlja2lu ZyB0aGUgZ2xvYmFsIHN0YXRlIHdlIGhhdmUgdG9kYXkpLgorICovCitzdGF0aWMgc3RydWN0IHJv b3RfZG9tYWluIGRlZl9yb290X2RvbWFpbjsKKworI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KKwor LyogVGhlcmUgY2FuIGJlIG9ubHkgb25lICovCitzdGF0aWMgc3RydWN0IGdsb2JhbF9ycSBncnE7 CisKKy8qCisgKiBUaGlzIGlzIHRoZSBtYWluLCBwZXItQ1BVIHJ1bnF1ZXVlIGRhdGEgc3RydWN0 dXJlLgorICogVGhpcyBkYXRhIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIGJ5IHRoZSBsb2NhbCBj cHUuCisgKi8KK3N0cnVjdCBycSB7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLCAqaWRsZSwg KnN0b3A7CisJc3RydWN0IG1tX3N0cnVjdCAqcHJldl9tbTsKKwl1NjQgbGFzdF9ydW5fc2NhbGU7 CisKKwl1bnNpZ25lZCBpbnQgcnFfcG9saWN5OworCXU2NCBycV9sYXN0X3JhbjsKKwlpbnQgcnFf cHJpbzsKKwlib29sIHJxX3J1bm5pbmc7IC8qIFRoZXJlIGlzIGEgdGFzayBydW5uaW5nICovCisK KwkvKiBBY2N1cmF0ZSB0aW1la2VlcGluZyBkYXRhICovCisJdTY0IHRpbWVrZWVwX2Nsb2NrOwor CXVuc2lnbmVkIGxvbmcgdXNlcl9wYywgbmljZV9wYywgaXJxX3BjLCBzb2Z0aXJxX3BjLCBzeXN0 ZW1fcGMsCisJCWlvd2FpdF9wYywgaWRsZV9wYzsKKwlsb25nIGFjY291bnRfcGM7CisJYXRvbWlj X3QgbnJfaW93YWl0OworCisjaWZkZWYgQ09ORklHX1NNUAorCWludCBjcHU7CQkvKiBjcHUgb2Yg dGhpcyBydW5xdWV1ZSAqLworCWJvb2wgb25saW5lOworCWJvb2wgc2NhbGluZzsgLyogVGhpcyBD UFUgaXMgbWFuYWdlZCBieSBhIHNjYWxpbmcgQ1BVIGZyZXEgZ292ZXJub3IgKi8KKwlzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnN0aWNreV90YXNrOworCisJc3RydWN0IHJvb3RfZG9tYWluICpyZDsKKwlz dHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwlpbnQgKmNwdV9sb2NhbGl0eTsgLyogQ1BVIHJlbGF0 aXZlIGNhY2hlIGRpc3RhbmNlICovCisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorCWJvb2wgKCpz aWJsaW5nc19pZGxlKShpbnQgY3B1KTsKKwkvKiBTZWUgaWYgYWxsIHNtdCBzaWJsaW5ncyBhcmUg aWRsZSAqLworCWNwdW1hc2tfdCBzbXRfc2libGluZ3M7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdf U0NIRURfTUMKKwlib29sICgqY2FjaGVfaWRsZSkoaW50IGNwdSk7CisJLyogU2VlIGlmIGFsbCBj YWNoZSBzaWJsaW5ncyBhcmUgaWRsZSAqLworCWNwdW1hc2tfdCBjYWNoZV9zaWJsaW5nczsKKyNl bmRpZgorI2VuZGlmCisjaWZkZWYgQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcKKwl1NjQgcHJl dl9pcnFfdGltZTsKKyNlbmRpZgorCisJdTY0IGNsb2NrOworCXU2NCBjbG9ja190YXNrOworfTsK KworREVGSU5FX1BFUl9DUFVfU0hBUkVEX0FMSUdORUQoc3RydWN0IHJxLCBydW5xdWV1ZXMpOwor c3RhdGljIERFRklORV9NVVRFWChzY2hlZF9ob3RjcHVfbXV0ZXgpOworCisjaWZkZWYgQ09ORklH X1NNUAorLyoKKyAqIHNjaGVkX2RvbWFpbnNfbXV0ZXggc2VyaWFsaXNlcyBjYWxscyB0byBpbml0 X3NjaGVkX2RvbWFpbnMsCisgKiBkZXRhY2hfZGVzdHJveV9kb21haW5zIGFuZCBwYXJ0aXRpb25f c2NoZWRfZG9tYWlucy4KKyAqLworc3RhdGljIERFRklORV9NVVRFWChzY2hlZF9kb21haW5zX211 dGV4KTsKKworLyoKKyAqIEJ5IGRlZmF1bHQgdGhlIHN5c3RlbSBjcmVhdGVzIGEgc2luZ2xlIHJv b3QtZG9tYWluIHdpdGggYWxsIGNwdXMgYXMKKyAqIG1lbWJlcnMgKG1pbWlja2luZyB0aGUgZ2xv YmFsIHN0YXRlIHdlIGhhdmUgdG9kYXkpLgorICovCitzdGF0aWMgc3RydWN0IHJvb3RfZG9tYWlu IGRlZl9yb290X2RvbWFpbjsKKworaW50IF9fd2VhayBhcmNoX3NkX3NpYmxpbmdfYXN5bV9wYWNr aW5nKHZvaWQpCit7CisJICAgcmV0dXJuIDAqU0RfQVNZTV9QQUNLSU5HOworfQorI2VuZGlmCisK KyNkZWZpbmUgcmN1X2RlcmVmZXJlbmNlX2NoZWNrX3NjaGVkX2RvbWFpbihwKSBcCisJcmN1X2Rl cmVmZXJlbmNlX2NoZWNrKChwKSwgXAorCQkJCSAgbG9ja2RlcF9pc19oZWxkKCZzY2hlZF9kb21h aW5zX211dGV4KSkKKworLyoKKyAqIFRoZSBkb21haW4gdHJlZSAocnEtPnNkKSBpcyBwcm90ZWN0 ZWQgYnkgUkNVJ3MgcXVpZXNjZW50IHN0YXRlIHRyYW5zaXRpb24uCisgKiBTZWUgZGV0YWNoX2Rl c3Ryb3lfZG9tYWluczogc3luY2hyb25pemVfc2NoZWQgZm9yIGRldGFpbHMuCisgKgorICogVGhl IGRvbWFpbiB0cmVlIG9mIGFueSBDUFUgbWF5IG9ubHkgYmUgYWNjZXNzZWQgZnJvbSB3aXRoaW4K KyAqIHByZWVtcHQtZGlzYWJsZWQgc2VjdGlvbnMuCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfZG9t YWluKGNwdSwgX19zZCkgXAorCWZvciAoX19zZCA9IHJjdV9kZXJlZmVyZW5jZV9jaGVja19zY2hl ZF9kb21haW4oY3B1X3JxKGNwdSktPnNkKTsgX19zZDsgX19zZCA9IF9fc2QtPnBhcmVudCkKKwor c3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9ycV9jbG9jayhzdHJ1Y3QgcnEgKnJxKTsKKworLyoK KyAqIFNhbml0eSBjaGVjayBzaG91bGQgc2NoZWRfY2xvY2sgcmV0dXJuIGJvZ3VzIHZhbHVlcy4g V2UgbWFrZSBzdXJlIGl0IGRvZXMKKyAqIG5vdCBhcHBlYXIgdG8gZ28gYmFja3dhcmRzLCBhbmQg dXNlIGppZmZpZXMgdG8gZGV0ZXJtaW5lIHRoZSBtYXhpbXVtIGFuZAorICogbWluaW11bSBpdCBj b3VsZCBwb3NzaWJseSBoYXZlIGluY3JlYXNlZCwgYW5kIHJvdW5kIGRvd24gdG8gdGhlIG5lYXJl c3QKKyAqIGppZmZ5IHdoZW4gaXQgZmFsbHMgb3V0c2lkZSB0aGlzLgorICovCitzdGF0aWMgaW5s aW5lIHZvaWQgbmlmZnlfZGlmZihzNjQgKm5pZmZfZGlmZiwgaW50IGppZmZfZGlmZikKK3sKKwl1 bnNpZ25lZCBsb25nIG1pbl9kaWZmLCBtYXhfZGlmZjsKKworCWlmIChqaWZmX2RpZmYgPiAxKQor CQltaW5fZGlmZiA9IEpJRkZJRVNfVE9fTlMoamlmZl9kaWZmIC0gMSk7CisJZWxzZQorCQltaW5f ZGlmZiA9IDE7CisJLyogIFJvdW5kIHVwIHRvIHRoZSBuZWFyZXN0IHRpY2sgZm9yIG1heGltdW0g Ki8KKwltYXhfZGlmZiA9IEpJRkZJRVNfVE9fTlMoamlmZl9kaWZmICsgMSk7CisKKwlpZiAodW5s aWtlbHkoKm5pZmZfZGlmZiA8IG1pbl9kaWZmIHx8ICpuaWZmX2RpZmYgPiBtYXhfZGlmZikpCisJ CSpuaWZmX2RpZmYgPSBtaW5fZGlmZjsKK30KKworI2lmZGVmIENPTkZJR19TTVAKKyNkZWZpbmUg Y3B1X3JxKGNwdSkJCSgmcGVyX2NwdShydW5xdWV1ZXMsIChjcHUpKSkKKyNkZWZpbmUgdGhpc19y cSgpCQkoJl9fZ2V0X2NwdV92YXIocnVucXVldWVzKSkKKyNkZWZpbmUgdGFza19ycShwKQkJY3B1 X3JxKHRhc2tfY3B1KHApKQorI2RlZmluZSBjcHVfY3VycihjcHUpCQkoY3B1X3JxKGNwdSktPmN1 cnIpCitzdGF0aWMgaW5saW5lIGludCBjcHVfb2Yoc3RydWN0IHJxICpycSkKK3sKKwlyZXR1cm4g cnEtPmNwdTsKK30KKworI2Vsc2UgLyogQ09ORklHX1NNUCAqLworc3RhdGljIHN0cnVjdCBycSAq dXBycTsKKyNkZWZpbmUgY3B1X3JxKGNwdSkJKHVwcnEpCisjZGVmaW5lIHRoaXNfcnEoKQkodXBy cSkKKyNkZWZpbmUgdGFza19ycShwKQkodXBycSkKKyNkZWZpbmUgY3B1X2N1cnIoY3B1KQkoKHVw cnEpLT5jdXJyKQorc3RhdGljIGlubGluZSBpbnQgY3B1X29mKHN0cnVjdCBycSAqcnEpCit7CisJ cmV0dXJuIDA7Cit9CisKKyNlbmRpZgorI2RlZmluZSByYXdfcnEoKQkoJl9fcmF3X2dldF9jcHVf dmFyKHJ1bnF1ZXVlcykpCisKKyNpbmNsdWRlICJzdGF0cy5oIgorCisjaWZuZGVmIHByZXBhcmVf YXJjaF9zd2l0Y2gKKyMgZGVmaW5lIHByZXBhcmVfYXJjaF9zd2l0Y2gobmV4dCkJZG8geyB9IHdo aWxlICgwKQorI2VuZGlmCisjaWZuZGVmIGZpbmlzaF9hcmNoX3N3aXRjaAorIyBkZWZpbmUgZmlu aXNoX2FyY2hfc3dpdGNoKHByZXYpCWRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisvKgorICog QWxsIGNvbW1vbiBsb2NraW5nIGZ1bmN0aW9ucyBwZXJmb3JtZWQgb24gZ3JxLmxvY2suIHJxLT5j bG9jayBpcyBsb2NhbCB0bworICogdGhlIENQVSBhY2Nlc3NpbmcgaXQgc28gaXQgY2FuIGJlIG1v ZGlmaWVkIGp1c3Qgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkCisgKiB3aGVuIHdlJ3JlIG5vdCB1 cGRhdGluZyB0aGUgdGltZS4KKyAqIExvb2tpbmcgdXAgdGFza19ycSBtdXN0IGJlIGRvbmUgdW5k ZXIgZ3JxLmxvY2sgdG8gYmUgc2FmZS4KKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3JxX2Nsb2Nr X3Rhc2soc3RydWN0IHJxICpycSwgczY0IGRlbHRhKTsKKworc3RhdGljIGlubGluZSB2b2lkIHVw ZGF0ZV9ycV9jbG9jayhzdHJ1Y3QgcnEgKnJxKQoreworCXM2NCBkZWx0YSA9IHNjaGVkX2Nsb2Nr X2NwdShjcHVfb2YocnEpKSAtIHJxLT5jbG9jazsKKworCXJxLT5jbG9jayArPSBkZWx0YTsKKwl1 cGRhdGVfcnFfY2xvY2tfdGFzayhycSwgZGVsdGEpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wg dGFza19ydW5uaW5nKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gcC0+b25fY3B1 OworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3JxX2xvY2sodm9pZCkKKwlfX2FjcXVpcmVzKGdy cS5sb2NrKQoreworCXJhd19zcGluX2xvY2soJmdycS5sb2NrKTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkIGdycV91bmxvY2sodm9pZCkKKwlfX3JlbGVhc2VzKGdycS5sb2NrKQoreworCXJhd19z cGluX3VubG9jaygmZ3JxLmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZ3JxX2xvY2tf aXJxKHZvaWQpCisJX19hY3F1aXJlcyhncnEubG9jaykKK3sKKwlyYXdfc3Bpbl9sb2NrX2lycSgm Z3JxLmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZV9sb2NrX2dycShzdHJ1Y3Qg cnEgKnJxKQorCV9fYWNxdWlyZXMoZ3JxLmxvY2spCit7CisJZ3JxX2xvY2soKTsKK30KKworc3Rh dGljIGlubGluZSB2b2lkIGdycV91bmxvY2tfaXJxKHZvaWQpCisJX19yZWxlYXNlcyhncnEubG9j aykKK3sKKwlyYXdfc3Bpbl91bmxvY2tfaXJxKCZncnEubG9jayk7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCBncnFfbG9ja19pcnFzYXZlKHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorCV9fYWNxdWly ZXMoZ3JxLmxvY2spCit7CisJcmF3X3NwaW5fbG9ja19pcnFzYXZlKCZncnEubG9jaywgKmZsYWdz KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGdycV91bmxvY2tfaXJxcmVzdG9yZSh1bnNpZ25l ZCBsb25nICpmbGFncykKKwlfX3JlbGVhc2VzKGdycS5sb2NrKQoreworCXJhd19zcGluX3VubG9j a19pcnFyZXN0b3JlKCZncnEubG9jaywgKmZsYWdzKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1 Y3QgcnEKKyp0YXNrX2dycV9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgbG9u ZyAqZmxhZ3MpCisJX19hY3F1aXJlcyhncnEubG9jaykKK3sKKwlncnFfbG9ja19pcnFzYXZlKGZs YWdzKTsKKwlyZXR1cm4gdGFza19ycShwKTsKK30KKworc3RhdGljIGlubGluZSBzdHJ1Y3QgcnEK Kyp0aW1lX3Rhc2tfZ3JxX2xvY2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBsb25n ICpmbGFncykKKwlfX2FjcXVpcmVzKGdycS5sb2NrKQoreworCXN0cnVjdCBycSAqcnEgPSB0YXNr X2dycV9sb2NrKHAsIGZsYWdzKTsKKwlyZXR1cm4gcnE7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IHJxICp0YXNrX2dycV9sb2NrX2lycShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCisJX19hY3F1 aXJlcyhncnEubG9jaykKK3sKKwlncnFfbG9ja19pcnEoKTsKKwlyZXR1cm4gdGFza19ycShwKTsK K30KKworc3RhdGljIGlubGluZSB2b2lkIHRhc2tfZ3JxX3VubG9ja19pcnEodm9pZCkKKwlfX3Jl bGVhc2VzKGdycS5sb2NrKQoreworCWdycV91bmxvY2tfaXJxKCk7Cit9CisKK3N0YXRpYyBpbmxp bmUgdm9pZCB0YXNrX2dycV91bmxvY2sodW5zaWduZWQgbG9uZyAqZmxhZ3MpCisJX19yZWxlYXNl cyhncnEubG9jaykKK3sKKwlncnFfdW5sb2NrX2lycXJlc3RvcmUoZmxhZ3MpOworfQorCisvKioK KyAqIGdydW5xdWV1ZV9pc19sb2NrZWQKKyAqCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdsb2Jh bCBydW5xdWV1ZSBpcyBsb2NrZWQuCisgKiBUaGlzIGludGVyZmFjZSBhbGxvd3MgcHJpbnRrIHRv IGJlIGNhbGxlZCB3aXRoIHRoZSBydW5xdWV1ZSBsb2NrCisgKiBoZWxkIGFuZCBrbm93IHdoZXRo ZXIgb3Igbm90IGl0IGlzIE9LIHRvIHdha2UgdXAgdGhlIGtsb2dkLgorICovCitib29sIGdydW5x dWV1ZV9pc19sb2NrZWQodm9pZCkKK3sKKwlyZXR1cm4gcmF3X3NwaW5faXNfbG9ja2VkKCZncnEu bG9jayk7Cit9CisKK3ZvaWQgZ3JxX3VubG9ja193YWl0KHZvaWQpCisJX19yZWxlYXNlcyhncnEu bG9jaykKK3sKKwlzbXBfbWIoKTsgLyogc3Bpbi11bmxvY2std2FpdCBpcyBub3QgYSBmdWxsIG1l bW9yeSBiYXJyaWVyICovCisJcmF3X3NwaW5fdW5sb2NrX3dhaXQoJmdycS5sb2NrKTsKK30KKwor c3RhdGljIGlubGluZSB2b2lkIHRpbWVfZ3JxX2xvY2soc3RydWN0IHJxICpycSwgdW5zaWduZWQg bG9uZyAqZmxhZ3MpCisJX19hY3F1aXJlcyhncnEubG9jaykKK3sKKwlsb2NhbF9pcnFfc2F2ZSgq ZmxhZ3MpOworCXRpbWVfbG9ja19ncnEocnEpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBy cSAqX190YXNrX2dycV9sb2NrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKKwlfX2FjcXVpcmVzKGdy cS5sb2NrKQoreworCWdycV9sb2NrKCk7CisJcmV0dXJuIHRhc2tfcnEocCk7Cit9CisKK3N0YXRp YyBpbmxpbmUgdm9pZCBfX3Rhc2tfZ3JxX3VubG9jayh2b2lkKQorCV9fcmVsZWFzZXMoZ3JxLmxv Y2spCit7CisJZ3JxX3VubG9jaygpOworfQorCisvKgorICogTG9vayBmb3IgYW55IHRhc2tzICph bnl3aGVyZSogdGhhdCBhcmUgcnVubmluZyBuaWNlIDAgb3IgYmV0dGVyLiBXZSBkbworICogdGhp cyBsb2NrbGVzcyBmb3Igb3ZlcmhlYWQgcmVhc29ucyBzaW5jZSB0aGUgb2NjYXNpb25hbCB3cm9u ZyByZXN1bHQKKyAqIGlzIGhhcm1sZXNzLgorICovCitib29sIGFib3ZlX2JhY2tncm91bmRfbG9h ZCh2b2lkKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlz dHJ1Y3QgdGFza19zdHJ1Y3QgKmNwdV9jdXJyID0gY3B1X3JxKGNwdSktPmN1cnI7CisKKwkJaWYg KHVubGlrZWx5KCFjcHVfY3VycikpCisJCQljb250aW51ZTsKKwkJaWYgKFBSSU9fVE9fTklDRShj cHVfY3Vyci0+c3RhdGljX3ByaW8pIDwgMSkgeworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisJ cmV0dXJuIGZhbHNlOworfQorCisjaWZuZGVmIF9fQVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXCitz dGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9sb2NrX3N3aXRjaChzdHJ1Y3QgcnEgKnJxLCBzdHJ1 Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBmaW5pc2hf bG9ja19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQorewor I2lmZGVmIENPTkZJR19ERUJVR19TUElOTE9DSworCS8qIHRoaXMgaXMgYSB2YWxpZCBjYXNlIHdo ZW4gYW5vdGhlciB0YXNrIHJlbGVhc2VzIHRoZSBzcGlubG9jayAqLworCWdycS5sb2NrLm93bmVy ID0gY3VycmVudDsKKyNlbmRpZgorCS8qCisJICogSWYgd2UgYXJlIHRyYWNraW5nIHNwaW5sb2Nr IGRlcGVuZGVuY2llcyB0aGVuIHdlIGhhdmUgdG8KKwkgKiBmaXggdXAgdGhlIHJ1bnF1ZXVlIGxv Y2sgLSB3aGljaCBnZXRzICdjYXJyaWVkIG92ZXInIGZyb20KKwkgKiBwcmV2IGludG8gY3VycmVu dDoKKwkgKi8KKwlzcGluX2FjcXVpcmUoJmdycS5sb2NrLmRlcF9tYXAsIDAsIDAsIF9USElTX0lQ Xyk7CisKKwlncnFfdW5sb2NrX2lycSgpOworfQorCisjZWxzZSAvKiBfX0FSQ0hfV0FOVF9VTkxP Q0tFRF9DVFhTVyAqLworCitzdGF0aWMgaW5saW5lIHZvaWQgcHJlcGFyZV9sb2NrX3N3aXRjaChz dHJ1Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisjaWZkZWYgX19BUkNI X1dBTlRfSU5URVJSVVBUU19PTl9DVFhTVworCWdycV91bmxvY2tfaXJxKCk7CisjZWxzZQorCWdy cV91bmxvY2soKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX2xvY2tf c3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKK3sKKwlzbXBf d21iKCk7CisjaWZuZGVmIF9fQVJDSF9XQU5UX0lOVEVSUlVQVFNfT05fQ1RYU1cKKwlsb2NhbF9p cnFfZW5hYmxlKCk7CisjZW5kaWYKK30KKyNlbmRpZiAvKiBfX0FSQ0hfV0FOVF9VTkxPQ0tFRF9D VFhTVyAqLworCisvKgorICogQSB0YXNrIHRoYXQgaXMgcXVldWVkIGJ1dCBub3QgcnVubmluZyB3 aWxsIGJlIG9uIHRoZSBncnEgcnVuIGxpc3QuCisgKiBBIHRhc2sgdGhhdCBpcyBub3QgcnVubmlu ZyBvciBxdWV1ZWQgd2lsbCBub3QgYmUgb24gdGhlIGdycSBydW4gbGlzdC4KKyAqIEEgdGFzayB0 aGF0IGlzIGN1cnJlbnRseSBydW5uaW5nIHdpbGwgaGF2ZSAtPm9uX2NwdSBzZXQgYnV0IG5vdCBv biB0aGUKKyAqIGdycSBydW4gbGlzdC4KKyAqLworc3RhdGljIGlubGluZSBib29sIHRhc2tfcXVl dWVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gKCFsaXN0X2VtcHR5KCZwLT5y dW5fbGlzdCkpOworfQorCisvKgorICogUmVtb3ZpbmcgZnJvbSB0aGUgZ2xvYmFsIHJ1bnF1ZXVl LiBFbnRlciB3aXRoIGdycSBsb2NrZWQuCisgKi8KK3N0YXRpYyB2b2lkIGRlcXVldWVfdGFzayhz dHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaW50IHByaW8gPSBwLT5wcmlvOworCWxpc3RfZGVs X2luaXQoJnAtPnJ1bl9saXN0KTsKKwlpZiAobGlzdF9lbXB0eShncnEucXVldWUgKyBwcmlvKSkK KwkJX19jbGVhcl9iaXQocHJpbywgZ3JxLnByaW9fYml0bWFwKTsKK30KKworLyoKKyAqIEFkZGlu ZyB0byB0aGUgZ2xvYmFsIHJ1bnF1ZXVlLiBFbnRlciB3aXRoIGdycSBsb2NrZWQuCisgKi8KK3N0 YXRpYyB2b2lkIGVucXVldWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaW50IHBy aW8gPSBwLT5wcmlvOworCV9fc2V0X2JpdChwcmlvLCBncnEucHJpb19iaXRtYXApOworCWxpc3Rf YWRkX3RhaWwoJnAtPnJ1bl9saXN0LCBncnEucXVldWUgKyBwcmlvKTsKK30KKworLyogT25seSBp ZGxlIHRhc2sgZG9lcyB0aGlzIGFzIGEgcmVhbCB0aW1lIHRhc2sqLworc3RhdGljIGlubGluZSB2 b2lkIGVucXVldWVfdGFza19oZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlpbnQgcHJp byA9IHAtPnByaW87CisJX19zZXRfYml0KHByaW8sIGdycS5wcmlvX2JpdG1hcCk7CisJbGlzdF9h ZGQoJnAtPnJ1bl9saXN0LCBncnEucXVldWUgKyBwcmlvKTsKK30KKworc3RhdGljIGlubGluZSB2 b2lkIHJlcXVldWVfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7Cit9CisKKyNpZmRlZiBD T05GSUdfU01QCisvKgorICogcW5yIGlzIHRoZSAicXVldWVkIGJ1dCBub3QgcnVubmluZyIgY291 bnQgd2hpY2ggaXMgdGhlIHRvdGFsIG51bWJlciBvZgorICogdGFza3Mgb24gdGhlIGdsb2JhbCBy dW5xdWV1ZSBsaXN0IHdhaXRpbmcgZm9yIGNwdSB0aW1lIGJ1dCBub3QgYWN0dWFsbHkKKyAqIGN1 cnJlbnRseSBydW5uaW5nIG9uIGEgY3B1LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW5jX3Fu cih2b2lkKQoreworCWdycS5xbnIrKzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY19xbnIo dm9pZCkKK3sKKwlncnEucW5yLS07Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IHF1ZXVlZF9ub3Ry dW5uaW5nKHZvaWQpCit7CisJcmV0dXJuIGdycS5xbnI7Cit9CisKKy8qCisgKiBUaGUgY3B1X2lk bGVfbWFwIHN0b3JlcyBhIGJpdG1hcCBvZiBhbGwgdGhlIENQVXMgY3VycmVudGx5IGlkbGUgdG8K KyAqIGFsbG93IGVhc3kgbG9va3VwIG9mIHdoZXRoZXIgYW55IHN1aXRhYmxlIGlkbGUgQ1BVcyBh cmUgYXZhaWxhYmxlLgorICogSXQncyBjaGVhcGVyIHRvIG1haW50YWluIGEgYmluYXJ5IHllcy9u byBpZiB0aGVyZSBhcmUgYW55IGlkbGUgQ1BVcyBvbiB0aGUKKyAqIGlkbGVfY3B1cyB2YXJpYWJs ZSB0aGFuIHRvIGRvIGEgZnVsbCBiaXRtYXNrIGNoZWNrIHdoZW4gd2UgYXJlIGJ1c3kuCisgKi8K K3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1aWRsZV9tYXAoaW50IGNwdSkKK3sKKwlpZiAobGlr ZWx5KGNwdV9vbmxpbmUoY3B1KSkpIHsKKwkJY3B1X3NldChjcHUsIGdycS5jcHVfaWRsZV9tYXAp OworCQlncnEuaWRsZV9jcHVzID0gdHJ1ZTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBj bGVhcl9jcHVpZGxlX21hcChpbnQgY3B1KQoreworCWNwdV9jbGVhcihjcHUsIGdycS5jcHVfaWRs ZV9tYXApOworCWlmIChjcHVzX2VtcHR5KGdycS5jcHVfaWRsZV9tYXApKQorCQlncnEuaWRsZV9j cHVzID0gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIHN1aXRhYmxlX2lkbGVfY3B1cyhzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnApCit7CisJaWYgKCFncnEuaWRsZV9jcHVzKQorCQlyZXR1cm4gZmFsc2U7 CisJcmV0dXJuIChjcHVzX2ludGVyc2VjdHMocC0+Y3B1c19hbGxvd2VkLCBncnEuY3B1X2lkbGVf bWFwKSk7Cit9CisKKyNkZWZpbmUgQ1BVSURMRV9ESUZGX1RIUkVBRAkoMSkKKyNkZWZpbmUgQ1BV SURMRV9ESUZGX0NPUkUJKDIpCisjZGVmaW5lIENQVUlETEVfQ0FDSEVfQlVTWQkoNCkKKyNkZWZp bmUgQ1BVSURMRV9ESUZGX0NQVQkoOCkKKyNkZWZpbmUgQ1BVSURMRV9USFJFQURfQlVTWQkoMTYp CisjZGVmaW5lIENQVUlETEVfRElGRl9OT0RFCSgzMikKKworc3RhdGljIHZvaWQgcmVzY2hlZF90 YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CisKKy8qCisgKiBUaGUgYmVzdCBpZGxlIENQVSBp cyBjaG9zZW4gYWNjb3JkaW5nIHRvIHRoZSBDUFVJRExFIHJhbmtpbmcgYWJvdmUgd2hlcmUgdGhl CisgKiBsb3dlc3QgdmFsdWUgd291bGQgZ2l2ZSB0aGUgbW9zdCBzdWl0YWJsZSBDUFUgdG8gc2No ZWR1bGUgcCBvbnRvIG5leHQuIFRoZQorICogb3JkZXIgd29ya3Mgb3V0IHRvIGJlIHRoZSBmb2xs b3dpbmc6CisgKgorICogU2FtZSBjb3JlLCBpZGxlIG9yIGJ1c3kgY2FjaGUsIGlkbGUgb3IgYnVz eSB0aHJlYWRzCisgKiBPdGhlciBjb3JlLCBzYW1lIGNhY2hlLCBpZGxlIG9yIGJ1c3kgY2FjaGUs IGlkbGUgdGhyZWFkcy4KKyAqIFNhbWUgbm9kZSwgb3RoZXIgQ1BVLCBpZGxlIGNhY2hlLCBpZGxl IHRocmVhZHMuCisgKiBTYW1lIG5vZGUsIG90aGVyIENQVSwgYnVzeSBjYWNoZSwgaWRsZSB0aHJl YWRzLgorICogT3RoZXIgY29yZSwgc2FtZSBjYWNoZSwgYnVzeSB0aHJlYWRzLgorICogU2FtZSBu b2RlLCBvdGhlciBDUFUsIGJ1c3kgdGhyZWFkcy4KKyAqIE90aGVyIG5vZGUsIG90aGVyIENQVSwg aWRsZSBjYWNoZSwgaWRsZSB0aHJlYWRzLgorICogT3RoZXIgbm9kZSwgb3RoZXIgQ1BVLCBidXN5 IGNhY2hlLCBpZGxlIHRocmVhZHMuCisgKiBPdGhlciBub2RlLCBvdGhlciBDUFUsIGJ1c3kgdGhy ZWFkcy4KKyAqLworc3RhdGljIHZvaWQKK3Jlc2NoZWRfYmVzdF9tYXNrKGludCBiZXN0X2NwdSwg c3RydWN0IHJxICpycSwgY3B1bWFza190ICp0bXBtYXNrKQoreworCXVuc2lnbmVkIGludCBiZXN0 X3JhbmtpbmcgPSBDUFVJRExFX0RJRkZfTk9ERSB8IENQVUlETEVfVEhSRUFEX0JVU1kgfAorCQlD UFVJRExFX0RJRkZfQ1BVIHwgQ1BVSURMRV9DQUNIRV9CVVNZIHwgQ1BVSURMRV9ESUZGX0NPUkUg fAorCQlDUFVJRExFX0RJRkZfVEhSRUFEOworCWludCBjcHVfdG1wOworCisJaWYgKGNwdV9pc3Nl dChiZXN0X2NwdSwgKnRtcG1hc2spKQorCQlnb3RvIG91dDsKKworCWZvcl9lYWNoX2NwdV9tYXNr KGNwdV90bXAsICp0bXBtYXNrKSB7CisJCXVuc2lnbmVkIGludCByYW5raW5nOworCQlzdHJ1Y3Qg cnEgKnRtcF9ycTsKKworCQlyYW5raW5nID0gMDsKKwkJdG1wX3JxID0gY3B1X3JxKGNwdV90bXAp OworCisjaWZkZWYgQ09ORklHX05VTUEKKwkJaWYgKHJxLT5jcHVfbG9jYWxpdHlbY3B1X3RtcF0g PiAzKQorCQkJcmFua2luZyB8PSBDUFVJRExFX0RJRkZfTk9ERTsKKwkJZWxzZQorI2VuZGlmCisJ CWlmIChycS0+Y3B1X2xvY2FsaXR5W2NwdV90bXBdID4gMikKKwkJCXJhbmtpbmcgfD0gQ1BVSURM RV9ESUZGX0NQVTsKKyNpZmRlZiBDT05GSUdfU0NIRURfTUMKKwkJaWYgKHJxLT5jcHVfbG9jYWxp dHlbY3B1X3RtcF0gPT0gMikKKwkJCXJhbmtpbmcgfD0gQ1BVSURMRV9ESUZGX0NPUkU7CisJCWlm ICghKHRtcF9ycS0+Y2FjaGVfaWRsZShjcHVfdG1wKSkpCisJCQlyYW5raW5nIHw9IENQVUlETEVf Q0FDSEVfQlVTWTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwkJaWYgKHJxLT5j cHVfbG9jYWxpdHlbY3B1X3RtcF0gPT0gMSkKKwkJCXJhbmtpbmcgfD0gQ1BVSURMRV9ESUZGX1RI UkVBRDsKKwkJaWYgKCEodG1wX3JxLT5zaWJsaW5nc19pZGxlKGNwdV90bXApKSkKKwkJCXJhbmtp bmcgfD0gQ1BVSURMRV9USFJFQURfQlVTWTsKKyNlbmRpZgorCQlpZiAocmFua2luZyA8IGJlc3Rf cmFua2luZykgeworCQkJYmVzdF9jcHUgPSBjcHVfdG1wOworCQkJYmVzdF9yYW5raW5nID0gcmFu a2luZzsKKwkJfQorCX0KK291dDoKKwlyZXNjaGVkX3Rhc2soY3B1X3JxKGJlc3RfY3B1KS0+Y3Vy cik7Cit9CisKK3N0YXRpYyB2b2lkIHJlc2NoZWRfYmVzdF9pZGxlKHN0cnVjdCB0YXNrX3N0cnVj dCAqcCkKK3sKKwljcHVtYXNrX3QgdG1wbWFzazsKKworCWNwdXNfYW5kKHRtcG1hc2ssIHAtPmNw dXNfYWxsb3dlZCwgZ3JxLmNwdV9pZGxlX21hcCk7CisJcmVzY2hlZF9iZXN0X21hc2sodGFza19j cHUocCksIHRhc2tfcnEocCksICZ0bXBtYXNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJl c2NoZWRfc3VpdGFibGVfaWRsZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJaWYgKHN1aXRh YmxlX2lkbGVfY3B1cyhwKSkKKwkJcmVzY2hlZF9iZXN0X2lkbGUocCk7Cit9CisvKgorICogRmxh Z3MgdG8gdGVsbCB1cyB3aGV0aGVyIHRoaXMgQ1BVIGlzIHJ1bm5pbmcgYSBDUFUgZnJlcXVlbmN5 IGdvdmVybm9yIHRoYXQKKyAqIGhhcyBzbG93ZWQgaXRzIHNwZWVkIG9yIG5vdC4gTm8gbG9ja2lu ZyByZXF1aXJlZCBhcyB0aGUgdmVyeSByYXJlIHdyb25nbHkKKyAqIHJlYWQgdmFsdWUgd291bGQg YmUgaGFybWxlc3MuCisgKi8KK3ZvaWQgY3B1X3NjYWxpbmcoaW50IGNwdSkKK3sKKwljcHVfcnEo Y3B1KS0+c2NhbGluZyA9IHRydWU7Cit9CisKK3ZvaWQgY3B1X25vbnNjYWxpbmcoaW50IGNwdSkK K3sKKwljcHVfcnEoY3B1KS0+c2NhbGluZyA9IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJv b2wgc2NhbGluZ19ycShzdHJ1Y3QgcnEgKnJxKQoreworCXJldHVybiBycS0+c2NhbGluZzsKK30K Kworc3RhdGljIGlubGluZSBpbnQgbG9jYWxpdHlfZGlmZihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAs IHN0cnVjdCBycSAqcnEpCit7CisJcmV0dXJuIHJxLT5jcHVfbG9jYWxpdHlbdGFza19jcHUocCld OworfQorI2Vsc2UgLyogQ09ORklHX1NNUCAqLworc3RhdGljIGlubGluZSB2b2lkIGluY19xbnIo dm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGRlY19xbnIodm9pZCkKK3sKK30KKwor c3RhdGljIGlubGluZSBpbnQgcXVldWVkX25vdHJ1bm5pbmcodm9pZCkKK3sKKwlyZXR1cm4gZ3Jx Lm5yX3J1bm5pbmc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3B1aWRsZV9tYXAoaW50 IGNwdSkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX2NwdWlkbGVfbWFwKGludCBj cHUpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzdWl0YWJsZV9pZGxlX2NwdXMoc3RydWN0 IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBjdXJyZW50ID09IHVwcnEtPmlkbGU7Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCByZXNjaGVkX3N1aXRhYmxlX2lkbGUoc3RydWN0IHRhc2tfc3Ry dWN0ICpwKQoreworfQorCit2b2lkIGNwdV9zY2FsaW5nKGludCBfX3VudXNlZCkKK3sKK30KKwor dm9pZCBjcHVfbm9uc2NhbGluZyhpbnQgX191bnVzZWQpCit7Cit9CisKKy8qCisgKiBBbHRob3Vn aCBDUFVzIGNhbiBzY2FsZSBpbiBVUCwgdGhlcmUgaXMgbm93aGVyZSBlbHNlIGZvciB0YXNrcyB0 byBnbyBzbyB0aGlzCisgKiBhbHdheXMgcmV0dXJucyAwLgorICovCitzdGF0aWMgaW5saW5lIGJv b2wgc2NhbGluZ19ycShzdHJ1Y3QgcnEgKnJxKQoreworCXJldHVybiBmYWxzZTsKK30KKworc3Rh dGljIGlubGluZSBpbnQgbG9jYWxpdHlfZGlmZihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVj dCBycSAqcnEpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworRVhQ T1JUX1NZTUJPTF9HUEwoY3B1X3NjYWxpbmcpOworRVhQT1JUX1NZTUJPTF9HUEwoY3B1X25vbnNj YWxpbmcpOworCisvKgorICogYWN0aXZhdGVfaWRsZV90YXNrIC0gbW92ZSBpZGxlIHRhc2sgdG8g dGhlIF9mcm9udF8gb2YgcnVucXVldWUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0 ZV9pZGxlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWVucXVldWVfdGFza19oZWFk KHApOworCWdycS5ucl9ydW5uaW5nKys7CisJaW5jX3FucigpOworfQorCisvKgorICogYWN0aXZh dGVfdGFzayAtIG1vdmUgYSB0YXNrIHRvIHRoZSBydW5xdWV1ZS4gRW50ZXIgd2l0aCBncnEgbG9j a2VkLgorICovCitzdGF0aWMgdm9pZCBhY3RpdmF0ZV90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAq cCwgc3RydWN0IHJxICpycSkKK3sKKwkvKgorCSAqIFNsZWVwIHRpbWUgaXMgaW4gdW5pdHMgb2Yg bmFub3NlY3MsIHNvIHNoaWZ0IGJ5IDIwIHRvIGdldCBhCisJICogbWlsbGlzZWNvbmRzLXJhbmdl IGVzdGltYXRpb24gb2YgdGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIHRhc2sKKwkgKiBzcGVu dCBzbGVlcGluZzoKKwkgKi8KKwlpZiAodW5saWtlbHkocHJvZl9vbiA9PSBTTEVFUF9QUk9GSUxJ TkcpKSB7CisJCWlmIChwLT5zdGF0ZSA9PSBUQVNLX1VOSU5URVJSVVBUSUJMRSkKKwkJCXByb2Zp bGVfaGl0cyhTTEVFUF9QUk9GSUxJTkcsICh2b2lkICopZ2V0X3djaGFuKHApLAorCQkJCQkgKHJx LT5jbG9jayAtIHAtPmxhc3RfcmFuKSA+PiAyMCk7CisJCQorCX0KKworCWlmICh0YXNrX2NvbnRy aWJ1dGVzX3RvX2xvYWQocCkpCisJCWdycS5ucl91bmludGVycnVwdGlibGUtLTsKKwllbnF1ZXVl X3Rhc2tfaGVhZChwKTsKKwlncnEubnJfcnVubmluZysrOworCWluY19xbnIoKTsKK30KKworc3Rh dGljIGlubGluZSB2b2lkIGNsZWFyX3N0aWNreShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOworCisv KgorICogZGVhY3RpdmF0ZV90YXNrIC0gSWYgaXQncyBydW5uaW5nLCBpdCdzIG5vdCBvbiB0aGUg Z3JxIGFuZCB3ZSBjYW4ganVzdAorICogZGVjcmVtZW50IHRoZSBucl9ydW5uaW5nLiBFbnRlciB3 aXRoIGdycSBsb2NrZWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBkZWFjdGl2YXRlX3Rhc2so c3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWlmICh0YXNrX2NvbnRyaWJ1dGVzX3RvX2xvYWQo cCkpCisJCWdycS5ucl91bmludGVycnVwdGlibGUrKzsKKwlncnEubnJfcnVubmluZy0tOworCWNs ZWFyX3N0aWNreShwKTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKK3ZvaWQgc2V0X3Rhc2tfY3B1 KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IGNwdSkKK3sKKyNpZmRlZiBDT05G SUdfTE9DS0RFUAorCS8qCisJICogVGhlIGNhbGxlciBzaG91bGQgaG9sZCBncnEgbG9jay4KKwkg Ki8KKwlXQVJOX09OX09OQ0UoZGVidWdfbG9ja3MgJiYgIWxvY2tkZXBfaXNfaGVsZCgmZ3JxLmxv Y2spKTsKKyNlbmRpZgorCXRyYWNlX3NjaGVkX21pZ3JhdGVfdGFzayhwLCBjcHUpOworCWlmICh0 YXNrX2NwdShwKSAhPSBjcHUpCisJCXBlcmZfc3dfZXZlbnQoUEVSRl9DT1VOVF9TV19DUFVfTUlH UkFUSU9OUywgMSwgTlVMTCwgMCk7CisKKwkvKgorCSAqIEFmdGVyIC0+Y3B1IGlzIHNldCB1cCB0 byBhIG5ldyB2YWx1ZSwgdGFza19ncnFfbG9jayhwLCAuLi4pIGNhbiBiZQorCSAqIHN1Y2Nlc3Nm dWxseSBleGVjdXRlZCBvbiBhbm90aGVyIENQVS4gV2UgbXVzdCBlbnN1cmUgdGhhdCB1cGRhdGVz IG9mCisJICogcGVyLXRhc2sgZGF0YSBoYXZlIGJlZW4gY29tcGxldGVkIGJ5IHRoaXMgbW9tZW50 LgorCSAqLworCXNtcF93bWIoKTsKKwl0YXNrX3RocmVhZF9pbmZvKHApLT5jcHUgPSBjcHU7Cit9 CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zdGlja3koc3RydWN0IHRhc2tfc3RydWN0ICpw KQoreworCXAtPnN0aWNreSA9IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza19z dGlja3koc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBwLT5zdGlja3k7Cit9CisK Ky8qIFJlc2NoZWR1bGUgdGhlIGJlc3QgaWRsZSBDUFUgdGhhdCBpcyBub3QgdGhpcyBvbmUuICov CitzdGF0aWMgdm9pZAorcmVzY2hlZF9jbG9zZXN0X2lkbGUoc3RydWN0IHJxICpycSwgaW50IGNw dSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWNwdW1hc2tfdCB0bXBtYXNrOworCisJY3B1 c19hbmQodG1wbWFzaywgcC0+Y3B1c19hbGxvd2VkLCBncnEuY3B1X2lkbGVfbWFwKTsKKwljcHVf Y2xlYXIoY3B1LCB0bXBtYXNrKTsKKwlpZiAoY3B1c19lbXB0eSh0bXBtYXNrKSkKKwkJcmV0dXJu OworCXJlc2NoZWRfYmVzdF9tYXNrKGNwdSwgcnEsICZ0bXBtYXNrKTsKK30KKworLyoKKyAqIFdl IHNldCB0aGUgc3RpY2t5IGZsYWcgb24gYSB0YXNrIHRoYXQgaXMgZGVzY2hlZHVsZWQgaW52b2x1 bnRhcmlseSBtZWFuaW5nCisgKiBpdCBpcyBhd2FpdGluZyBmdXJ0aGVyIENQVSB0aW1lLiBJZiB0 aGUgbGFzdCBzdGlja3kgdGFzayBpcyBzdGlsbCBzdGlja3kKKyAqIGJ1dCB1bmx1Y2t5IGVub3Vn aCB0byBub3QgYmUgdGhlIG5leHQgdGFzayBzY2hlZHVsZWQsIHdlIHVuc3RpY2sgaXQgYW5kIHRy eQorICogdG8gZmluZCBpdCBhbiBpZGxlIENQVS4gUmVhbHRpbWUgdGFza3MgZG8gbm90IHN0aWNr IHRvIG1pbmltaXNlIHRoZWlyCisgKiBsYXRlbmN5IGF0IGFsbCB0aW1lcy4KKyAqLworc3RhdGlj IGlubGluZSB2b2lkCitzd2FwX3N0aWNreShzdHJ1Y3QgcnEgKnJxLCBpbnQgY3B1LCBzdHJ1Y3Qg dGFza19zdHJ1Y3QgKnApCit7CisJaWYgKHJxLT5zdGlja3lfdGFzaykgeworCQlpZiAocnEtPnN0 aWNreV90YXNrID09IHApIHsKKwkJCXAtPnN0aWNreSA9IHRydWU7CisJCQlyZXR1cm47CisJCX0K KwkJaWYgKHRhc2tfc3RpY2t5KHJxLT5zdGlja3lfdGFzaykpIHsKKwkJCWNsZWFyX3N0aWNreShy cS0+c3RpY2t5X3Rhc2spOworCQkJcmVzY2hlZF9jbG9zZXN0X2lkbGUocnEsIGNwdSwgcnEtPnN0 aWNreV90YXNrKTsKKwkJfQorCX0KKwlpZiAoIXJ0X3Rhc2socCkpIHsKKwkJcC0+c3RpY2t5ID0g dHJ1ZTsKKwkJcnEtPnN0aWNreV90YXNrID0gcDsKKwl9IGVsc2UgeworCQlyZXNjaGVkX2Nsb3Nl c3RfaWRsZShycSwgY3B1LCBwKTsKKwkJcnEtPnN0aWNreV90YXNrID0gTlVMTDsKKwl9Cit9CisK K3N0YXRpYyBpbmxpbmUgdm9pZCB1bnN0aWNrX3Rhc2soc3RydWN0IHJxICpycSwgc3RydWN0IHRh c2tfc3RydWN0ICpwKQoreworCXJxLT5zdGlja3lfdGFzayA9IE5VTEw7CisJY2xlYXJfc3RpY2t5 KHApOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9zdGlja3koc3RydWN0IHRh c2tfc3RydWN0ICpwKQoreworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgdGFza19zdGlja3koc3Ry dWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGlubGlu ZSB2b2lkCitzd2FwX3N0aWNreShzdHJ1Y3QgcnEgKnJxLCBpbnQgY3B1LCBzdHJ1Y3QgdGFza19z dHJ1Y3QgKnApCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB1bnN0aWNrX3Rhc2soc3RydWN0 IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworfQorI2VuZGlmCisKKworLyoKKyAq IHJlc2NoZWRfdGFzayAtIG1hcmsgYSB0YXNrICd0byBiZSByZXNjaGVkdWxlZCBub3cnLgorICoK KyAqIE9uIFVQIHRoaXMgbWVhbnMgdGhlIHNldHRpbmcgb2YgdGhlIG5lZWRfcmVzY2hlZCBmbGFn LCBvbiBTTVAgaXQKKyAqIG1pZ2h0IGFsc28gaW52b2x2ZSBhIGNyb3NzLUNQVSBjYWxsIHRvIHRy aWdnZXIgdGhlIHNjaGVkdWxlciBvbgorICogdGhlIHRhcmdldCBDUFUuCisgKi8KKyNpZmRlZiBD T05GSUdfU01QCisKKyNpZm5kZWYgdHNrX2lzX3BvbGxpbmcKKyNkZWZpbmUgdHNrX2lzX3BvbGxp bmcodCkgdGVzdF90c2tfdGhyZWFkX2ZsYWcodCwgVElGX1BPTExJTkdfTlJGTEFHKQorI2VuZGlm CisKK3N0YXRpYyB2b2lkIHJlc2NoZWRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJ aW50IGNwdTsKKworCWFzc2VydF9yYXdfc3Bpbl9sb2NrZWQoJmdycS5sb2NrKTsKKworCWlmICh1 bmxpa2VseSh0ZXN0X3Rza190aHJlYWRfZmxhZyhwLCBUSUZfTkVFRF9SRVNDSEVEKSkpCisJCXJl dHVybjsKKworCXNldF90c2tfdGhyZWFkX2ZsYWcocCwgVElGX05FRURfUkVTQ0hFRCk7CisKKwlj cHUgPSB0YXNrX2NwdShwKTsKKwlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJcmV0 dXJuOworCisJLyogTkVFRF9SRVNDSEVEIG11c3QgYmUgdmlzaWJsZSBiZWZvcmUgd2UgdGVzdCBw b2xsaW5nICovCisJc21wX21iKCk7CisJaWYgKCF0c2tfaXNfcG9sbGluZyhwKSkKKwkJc21wX3Nl bmRfcmVzY2hlZHVsZShjcHUpOworfQorCisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHJlc2No ZWRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJYXNzZXJ0X3Jhd19zcGluX2xvY2tl ZCgmZ3JxLmxvY2spOworCXNldF90c2tfbmVlZF9yZXNjaGVkKHApOworfQorI2VuZGlmCisKKy8q KgorICogdGFza19jdXJyIC0gaXMgdGhpcyB0YXNrIGN1cnJlbnRseSBleGVjdXRpbmcgb24gYSBD UFU/CisgKiBAcDogdGhlIHRhc2sgaW4gcXVlc3Rpb24uCisgKi8KK2lubGluZSBpbnQgdGFza19j dXJyKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlyZXR1cm4gY3B1X2N1cnIodGFz a19jcHUocCkpID09IHA7Cit9CisKKyNpZmRlZiBDT05GSUdfU01QCitzdHJ1Y3QgbWlncmF0aW9u X3JlcSB7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCWludCBkZXN0X2NwdTsKK307CisK Ky8qCisgKiB3YWl0X3Rhc2tfaW5hY3RpdmUgLSB3YWl0IGZvciBhIHRocmVhZCB0byB1bnNjaGVk dWxlLgorICoKKyAqIElmIEBtYXRjaF9zdGF0ZSBpcyBub256ZXJvLCBpdCdzIHRoZSBAcC0+c3Rh dGUgdmFsdWUganVzdCBjaGVja2VkIGFuZAorICogbm90IGV4cGVjdGVkIHRvIGNoYW5nZS4gIElm IGl0IGNoYW5nZXMsIGkuZS4gQHAgbWlnaHQgaGF2ZSB3b2tlbiB1cCwKKyAqIHRoZW4gcmV0dXJu IHplcm8uICBXaGVuIHdlIHN1Y2NlZWQgaW4gd2FpdGluZyBmb3IgQHAgdG8gYmUgb2ZmIGl0cyBD UFUsCisgKiB3ZSByZXR1cm4gYSBwb3NpdGl2ZSBudW1iZXIgKGl0cyB0b3RhbCBzd2l0Y2ggY291 bnQpLiAgSWYgYSBzZWNvbmQgY2FsbAorICogYSBzaG9ydCB3aGlsZSBsYXRlciByZXR1cm5zIHRo ZSBzYW1lIG51bWJlciwgdGhlIGNhbGxlciBjYW4gYmUgc3VyZSB0aGF0CisgKiBAcCBoYXMgcmVt YWluZWQgdW5zY2hlZHVsZWQgdGhlIHdob2xlIHRpbWUuCisgKgorICogVGhlIGNhbGxlciBtdXN0 IGVuc3VyZSB0aGF0IHRoZSB0YXNrICp3aWxsKiB1bnNjaGVkdWxlIHNvbWV0aW1lIHNvb24sCisg KiBlbHNlIHRoaXMgZnVuY3Rpb24gbWlnaHQgc3BpbiBmb3IgYSAqbG9uZyogdGltZS4gVGhpcyBm dW5jdGlvbiBjYW4ndAorICogYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYsIG9yIGl0IG1h eSBpbnRyb2R1Y2UgZGVhZGxvY2sgd2l0aAorICogc21wX2NhbGxfZnVuY3Rpb24oKSBpZiBhbiBJ UEkgaXMgc2VudCBieSB0aGUgc2FtZSBwcm9jZXNzIHdlIGFyZQorICogd2FpdGluZyB0byBiZWNv bWUgaW5hY3RpdmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcgd2FpdF90YXNrX2luYWN0aXZlKHN0cnVj dCB0YXNrX3N0cnVjdCAqcCwgbG9uZyBtYXRjaF9zdGF0ZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCWJvb2wgcnVubmluZywgb25fcnE7CisJdW5zaWduZWQgbG9uZyBuY3N3OworCXN0cnVj dCBycSAqcnE7CisKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIFdlIGRvIHRoZSBpbml0aWFsIGVh cmx5IGhldXJpc3RpY3Mgd2l0aG91dCBob2xkaW5nCisJCSAqIGFueSB0YXNrLXF1ZXVlIGxvY2tz IGF0IGFsbC4gV2UnbGwgb25seSB0cnkgdG8gZ2V0CisJCSAqIHRoZSBydW5xdWV1ZSBsb2NrIHdo ZW4gdGhpbmdzIGxvb2sgbGlrZSB0aGV5IHdpbGwKKwkJICogd29yayBvdXQhIEluIHRoZSB1bmxp a2VseSBldmVudCBycSBpcyBkZXJlZmVyZW5jZWQKKwkJICogc2luY2Ugd2UncmUgbG9ja2xlc3Ms IGdyYWIgaXQgYWdhaW4uCisJCSAqLworI2lmZGVmIENPTkZJR19TTVAKK3JldHJ5X3JxOgorCQly cSA9IHRhc2tfcnEocCk7CisJCWlmICh1bmxpa2VseSghcnEpKQorCQkJZ290byByZXRyeV9ycTsK KyNlbHNlIC8qIENPTkZJR19TTVAgKi8KKwkJcnEgPSB0YXNrX3JxKHApOworI2VuZGlmCisJCS8q CisJCSAqIElmIHRoZSB0YXNrIGlzIGFjdGl2ZWx5IHJ1bm5pbmcgb24gYW5vdGhlciBDUFUKKwkJ ICogc3RpbGwsIGp1c3QgcmVsYXggYW5kIGJ1c3ktd2FpdCB3aXRob3V0IGhvbGRpbmcKKwkJICog YW55IGxvY2tzLgorCQkgKgorCQkgKiBOT1RFISBTaW5jZSB3ZSBkb24ndCBob2xkIGFueSBsb2Nr cywgaXQncyBub3QKKwkJICogZXZlbiBzdXJlIHRoYXQgInJxIiBzdGF5cyBhcyB0aGUgcmlnaHQg cnVucXVldWUhCisJCSAqIEJ1dCB3ZSBkb24ndCBjYXJlLCBzaW5jZSB0aGlzIHdpbGwgcmV0dXJu IGZhbHNlCisJCSAqIGlmIHRoZSBydW5xdWV1ZSBoYXMgY2hhbmdlZCBhbmQgcCBpcyBhY3R1YWxs eSBub3cKKwkJICogcnVubmluZyBzb21ld2hlcmUgZWxzZSEKKwkJICovCisJCXdoaWxlICh0YXNr X3J1bm5pbmcocCkgJiYgcCA9PSBycS0+Y3VycikgeworCQkJaWYgKG1hdGNoX3N0YXRlICYmIHVu bGlrZWx5KHAtPnN0YXRlICE9IG1hdGNoX3N0YXRlKSkKKwkJCQlyZXR1cm4gMDsKKwkJCWNwdV9y ZWxheCgpOworCQl9CisKKwkJLyoKKwkJICogT2ssIHRpbWUgdG8gbG9vayBtb3JlIGNsb3NlbHkh IFdlIG5lZWQgdGhlIGdycQorCQkgKiBsb2NrIG5vdywgdG8gYmUgKnN1cmUqLiBJZiB3ZSdyZSB3 cm9uZywgd2UnbGwKKwkJICoganVzdCBnbyBiYWNrIGFuZCByZXBlYXQuCisJCSAqLworCQlycSA9 IHRhc2tfZ3JxX2xvY2socCwgJmZsYWdzKTsKKwkJdHJhY2Vfc2NoZWRfd2FpdF90YXNrKHApOwor CQlydW5uaW5nID0gdGFza19ydW5uaW5nKHApOworCQlvbl9ycSA9IHRhc2tfcXVldWVkKHApOwor CQluY3N3ID0gMDsKKwkJaWYgKCFtYXRjaF9zdGF0ZSB8fCBwLT5zdGF0ZSA9PSBtYXRjaF9zdGF0 ZSkKKwkJCW5jc3cgPSBwLT5udmNzdyB8IExPTkdfTUlOOyAvKiBzZXRzIE1TQiAqLworCQl0YXNr X2dycV91bmxvY2soJmZsYWdzKTsKKworCQkvKgorCQkgKiBJZiBpdCBjaGFuZ2VkIGZyb20gdGhl IGV4cGVjdGVkIHN0YXRlLCBiYWlsIG91dCBub3cuCisJCSAqLworCQlpZiAodW5saWtlbHkoIW5j c3cpKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogV2FzIGl0IHJlYWxseSBydW5uaW5nIGFmdGVy IGFsbCBub3cgdGhhdCB3ZQorCQkgKiBjaGVja2VkIHdpdGggdGhlIHByb3BlciBsb2NrcyBhY3R1 YWxseSBoZWxkPworCQkgKgorCQkgKiBPb3BzLiBHbyBiYWNrIGFuZCB0cnkgYWdhaW4uLgorCQkg Ki8KKwkJaWYgKHVubGlrZWx5KHJ1bm5pbmcpKSB7CisJCQljcHVfcmVsYXgoKTsKKwkJCWNvbnRp bnVlOworCQl9CisKKwkJLyoKKwkJICogSXQncyBub3QgZW5vdWdoIHRoYXQgaXQncyBub3QgYWN0 aXZlbHkgcnVubmluZywKKwkJICogaXQgbXVzdCBiZSBvZmYgdGhlIHJ1bnF1ZXVlIF9lbnRpcmVs eV8sIGFuZCBub3QKKwkJICogcHJlZW1wdGVkIQorCQkgKgorCQkgKiBTbyBpZiBpdCB3YXMgc3Rp bGwgcnVubmFibGUgKGJ1dCBqdXN0IG5vdCBhY3RpdmVseQorCQkgKiBydW5uaW5nIHJpZ2h0IG5v dyksIGl0J3MgcHJlZW1wdGVkLCBhbmQgd2Ugc2hvdWxkCisJCSAqIHlpZWxkIC0gaXQgY291bGQg YmUgYSB3aGlsZS4KKwkJICovCisJCWlmICh1bmxpa2VseShvbl9ycSkpIHsKKwkJCWt0aW1lX3Qg dG8gPSBrdGltZV9zZXQoMCwgTlNFQ19QRVJfU0VDIC8gSFopOworCisJCQlzZXRfY3VycmVudF9z dGF0ZShUQVNLX1VOSU5URVJSVVBUSUJMRSk7CisJCQlzY2hlZHVsZV9ocnRpbWVvdXQoJnRvLCBI UlRJTUVSX01PREVfUkVMKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogQWhoLCBh bGwgZ29vZC4gSXQgd2Fzbid0IHJ1bm5pbmcsIGFuZCBpdCB3YXNuJ3QKKwkJICogcnVubmFibGUs IHdoaWNoIG1lYW5zIHRoYXQgaXQgd2lsbCBuZXZlciBiZWNvbWUKKwkJICogcnVubmluZyBpbiB0 aGUgZnV0dXJlIGVpdGhlci4gV2UncmUgYWxsIGRvbmUhCisJCSAqLworCQlicmVhazsKKwl9CisK KwlyZXR1cm4gbmNzdzsKK30KKworLyoqKgorICoga2lja19wcm9jZXNzIC0ga2ljayBhIHJ1bm5p bmcgdGhyZWFkIHRvIGVudGVyL2V4aXQgdGhlIGtlcm5lbAorICogQHA6IHRoZSB0by1iZS1raWNr ZWQgdGhyZWFkCisgKgorICogQ2F1c2UgYSBwcm9jZXNzIHdoaWNoIGlzIHJ1bm5pbmcgb24gYW5v dGhlciBDUFUgdG8gZW50ZXIKKyAqIGtlcm5lbC1tb2RlLCB3aXRob3V0IGFueSBkZWxheS4gKHRv IGdldCBzaWduYWxzIGhhbmRsZWQuKQorICoKKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gZG9lc24n dCBoYXZlIHRvIHRha2UgdGhlIHJ1bnF1ZXVlIGxvY2ssCisgKiBiZWNhdXNlIGFsbCBpdCB3YW50 cyB0byBlbnN1cmUgaXMgdGhhdCB0aGUgcmVtb3RlIHRhc2sgZW50ZXJzCisgKiB0aGUga2VybmVs LiBJZiB0aGUgSVBJIHJhY2VzIGFuZCB0aGUgdGFzayBoYXMgYmVlbiBtaWdyYXRlZAorICogdG8g YW5vdGhlciBDUFUgdGhlbiBubyBoYXJtIGlzIGRvbmUgYW5kIHRoZSBwdXJwb3NlIGhhcyBiZWVu CisgKiBhY2hpZXZlZCBhcyB3ZWxsLgorICovCit2b2lkIGtpY2tfcHJvY2VzcyhzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnApCit7CisJaW50IGNwdTsKKworCXByZWVtcHRfZGlzYWJsZSgpOworCWNwdSA9 IHRhc2tfY3B1KHApOworCWlmICgoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgJiYgdGFza19j dXJyKHApKQorCQlzbXBfc2VuZF9yZXNjaGVkdWxlKGNwdSk7CisJcHJlZW1wdF9lbmFibGUoKTsK K30KK0VYUE9SVF9TWU1CT0xfR1BMKGtpY2tfcHJvY2Vzcyk7CisjZW5kaWYKKworI2RlZmluZSBy cV9pZGxlKHJxKQkoKHJxKS0+cnFfcHJpbyA9PSBQUklPX0xJTUlUKQorCisvKgorICogUlQgdGFz a3MgcHJlZW1wdCBvbiBwcmlvcml0eS4KKyAqIE5PUk1BTCB0YXNrcyBwcmVlbXB0IG9uIHNsZWVw IHRpbWUgbGVuZ3RoLgorICogU0NIRURfSURMRVBSSU8gZG9uJ3QgcHJlZW1wdCBhbnl0aGluZyBl bHNlIG9yCisgKiBiZXR3ZWVuIHRoZW1zZWx2ZXMsIHRoZXkgY29vcGVyYXRpdmVseSBtdWx0aXRh c2suIEFuIGlkbGUgcnEgc2NvcmVzIGFzCisgKiBwcmlvIFBSSU9fTElNSVQgc28gaXQgaXMgYWx3 YXlzIHByZWVtcHRlZC4KKyAqLworc3RhdGljIGlubGluZSBib29sCitjYW5fcHJlZW1wdChzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwcmlvKQoreworCWlmIChwLT5wcmlvIDw9IHByaW8pCisJ CXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIENPTkZJR19TTVAKKyNp ZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgdGhlcmUgaXMg YSB0YXNrIHRoYXQgaXMgYWZmaW5lZCBvbmx5IHRvIG9mZmxpbmUgQ1BVcyBidXQKKyAqIHN0aWxs IHdhbnRzIHJ1bnRpbWUuIFRoaXMgaGFwcGVucyB0byBrZXJuZWwgdGhyZWFkcyBkdXJpbmcgc3Vz cGVuZC9oYWx0IGFuZAorICogZGlzYWJsaW5nIG9mIENQVXMuCisgKi8KKyNkZWZpbmUgY3B1X29u bGluZV9tYXAJCSgqKGNwdW1hc2tfdCAqKWNwdV9vbmxpbmVfbWFzaykKK3N0YXRpYyBpbmxpbmUg Ym9vbCBvbmxpbmVfY3B1cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIChsaWtl bHkoY3B1c19pbnRlcnNlY3RzKGNwdV9vbmxpbmVfbWFwLCBwLT5jcHVzX2FsbG93ZWQpKSk7Cit9 CisjZWxzZSAvKiBDT05GSUdfSE9UUExVR19DUFUgKi8KKy8qIEFsbCBhdmFpbGFibGUgQ1BVcyBh cmUgYWx3YXlzIG9ubGluZSB3aXRob3V0IGhvdHBsdWcuICovCitzdGF0aWMgaW5saW5lIGJvb2wg b25saW5lX2NwdXMoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiB0cnVlOworfQor I2VuZGlmCisKKy8qCisgKiBDaGVjayB0byBzZWUgaWYgcCBjYW4gcnVuIG9uIGNwdSwgYW5kIGlm IG5vdCwgd2hldGhlciB0aGVyZSBhcmUgYW55IG9ubGluZQorICogQ1BVcyBpdCBjYW4gcnVuIG9u IGluc3RlYWQuCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBuZWVkc19vdGhlcl9jcHUoc3RydWN0 IHRhc2tfc3RydWN0ICpwLCBpbnQgY3B1KQoreworCWlmICh1bmxpa2VseSghY3B1X2lzc2V0KGNw dSwgcC0+Y3B1c19hbGxvd2VkKSkpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30K KworLyoKKyAqIFdoZW4gYWxsIGVsc2UgaXMgZXF1YWwsIHN0aWxsIHByZWZlciB0aGlzX3JxLgor ICovCitzdGF0aWMgdm9pZCB0cnlfcHJlZW1wdChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIHN0cnVj dCBycSAqdGhpc19ycSkKK3sKKwlzdHJ1Y3QgcnEgKmhpZ2hlc3RfcHJpb19ycSA9IE5VTEw7CisJ aW50IGNwdSwgaGlnaGVzdF9wcmlvID0gMDsKKwljcHVtYXNrX3QgdG1wOworCisJLyoKKwkgKiBX ZSBjbGVhciB0aGUgc3RpY2t5IGZsYWcgaGVyZSBiZWNhdXNlIGZvciBhIHRhc2sgdG8gaGF2ZSBj YWxsZWQKKwkgKiB0cnlfcHJlZW1wdCB3aXRoIHRoZSBzdGlja3kgZmxhZyBlbmFibGVkIG1lYW5z IHNvbWUgY29tcGxpY2F0ZWQKKwkgKiByZS1zY2hlZHVsaW5nIGhhcyBvY2N1cnJlZCBhbmQgd2Ug c2hvdWxkIGlnbm9yZSB0aGUgc3RpY2t5IGZsYWcuCisJICovCisJY2xlYXJfc3RpY2t5KHApOwor CisJaWYgKHN1aXRhYmxlX2lkbGVfY3B1cyhwKSkgeworCQlyZXNjaGVkX2Jlc3RfaWRsZShwKTsK KwkJcmV0dXJuOworCX0KKworCS8qIElETEVQUklPIHRhc2tzIG5ldmVyIHByZWVtcHQgYW55dGhp bmcgYnV0IGlkbGUgKi8KKwlpZiAocC0+cG9saWN5ID09IFNDSEVEX0lETEVQUklPKQorCQlyZXR1 cm47CisKKwlpZiAobGlrZWx5KG9ubGluZV9jcHVzKHApKSkKKwkJY3B1c19hbmQodG1wLCBjcHVf b25saW5lX21hcCwgcC0+Y3B1c19hbGxvd2VkKTsKKwllbHNlCisJCXJldHVybjsKKworCWZvcl9l YWNoX2NwdV9tYXNrKGNwdSwgdG1wKSB7CisJCXN0cnVjdCBycSAqcnE7CisJCWludCBycV9wcmlv OworCisJCXJxID0gY3B1X3JxKGNwdSk7CisJCXJxX3ByaW8gPSBycS0+cnFfcHJpbzsKKwkJaWYg KHJxX3ByaW8gPCBoaWdoZXN0X3ByaW8pCisJCQljb250aW51ZTsKKwkJCisJCWlmIChycV9wcmlv ID4gaGlnaGVzdF9wcmlvKSB7CisJCQloaWdoZXN0X3ByaW8gPSBycV9wcmlvOworCQkJaGlnaGVz dF9wcmlvX3JxID0gcnE7CisJCX0KKwl9CisKKwlpZiAobGlrZWx5KGhpZ2hlc3RfcHJpb19ycSkp IHsKKwkJaWYgKGNhbl9wcmVlbXB0KHAsIGhpZ2hlc3RfcHJpbykpCisJCQlyZXNjaGVkX3Rhc2so aGlnaGVzdF9wcmlvX3JxLT5jdXJyKTsKKwl9Cit9CisjZWxzZSAvKiBDT05GSUdfU01QICovCitz dGF0aWMgaW5saW5lIGJvb2wgbmVlZHNfb3RoZXJfY3B1KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwg aW50IGNwdSkKK3sKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIHRyeV9wcmVlbXB0 KHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHJxICp0aGlzX3JxKQoreworCWlmIChwLT5w b2xpY3kgPT0gU0NIRURfSURMRVBSSU8pCisJCXJldHVybjsKKwlpZiAoY2FuX3ByZWVtcHQocCwg dXBycS0+cnFfcHJpbykpIAorCQlyZXNjaGVkX3Rhc2soY3VycmVudCk7Cit9CisjZW5kaWYgLyog Q09ORklHX1NNUCAqLworCitzdGF0aWMgdm9pZAordHR3dV9zdGF0KHN0cnVjdCB0YXNrX3N0cnVj dCAqcCwgaW50IGNwdSwgaW50IHdha2VfZmxhZ3MpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCB0dHd1X2FjdGl2YXRlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgc3RydWN0IHJxICpycSwKKwkJ CQkgYm9vbCBpc19zeW5jKQoreworCWFjdGl2YXRlX3Rhc2socCwgcnEpOworCisJLyoKKwkgKiBT eW5jIHdha2V1cHMgKGkuZS4gdGhvc2UgdHlwZXMgb2Ygd2FrZXVwcyB3aGVyZSB0aGUgd2FrZXIK KwkgKiBoYXMgaW5kaWNhdGVkIHRoYXQgaXQgd2lsbCBsZWF2ZSB0aGUgQ1BVIGluIHNob3J0IG9y ZGVyKQorCSAqIGRvbid0IHRyaWdnZXIgYSBwcmVlbXB0aW9uIGlmIHRoZXJlIGFyZSBubyBpZGxl IGNwdXMsCisJICogaW5zdGVhZCB3YWl0aW5nIGZvciBjdXJyZW50IHRvIGRlc2NoZWR1bGUuCisJ ICovCisJaWYgKCFpc19zeW5jIHx8IHN1aXRhYmxlX2lkbGVfY3B1cyhwKSkgeworCQl0cnlfcHJl ZW1wdChwLCBycSk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdHR3dV9wb3N0X2FjdGl2 YXRpb24oc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3QgcnEgKnJxLAorCQkJCQlib29sIHN1 Y2Nlc3MpCit7CisJdHJhY2Vfc2NoZWRfd2FrZXVwKHAsIHN1Y2Nlc3MpOworCXAtPnN0YXRlID0g VEFTS19SVU5OSU5HOworCisJLyoKKwkgKiBpZiBhIHdvcmtlciBpcyB3YWtpbmcgdXAsIG5vdGlm eSB3b3JrcXVldWUuIE5vdGUgdGhhdCBvbiBCRlMsIHdlCisJICogZG9uJ3QgcmVhbGx5IGtub3cg d2hhdCBjcHUgaXQgd2lsbCBiZSwgc28gd2UgZmFrZSBpdCBmb3IKKwkgKiB3cV93b3JrZXJfd2Fr aW5nX3VwIDovCisJICovCisJaWYgKChwLT5mbGFncyAmIFBGX1dRX1dPUktFUikgJiYgc3VjY2Vz cykKKwkJd3Ffd29ya2VyX3dha2luZ191cChwLCBjcHVfb2YocnEpKTsKK30KKworI2lmZGVmIENP TkZJR19TTVAKK3ZvaWQgc2NoZWR1bGVyX2lwaSh2b2lkKQoreworfQorI2VuZGlmIC8qIENPTkZJ R19TTVAgKi8KKworLyoqKgorICogdHJ5X3RvX3dha2VfdXAgLSB3YWtlIHVwIGEgdGhyZWFkCisg KiBAcDogdGhlIHRocmVhZCB0byBiZSBhd2FrZW5lZAorICogQHN0YXRlOiB0aGUgbWFzayBvZiB0 YXNrIHN0YXRlcyB0aGF0IGNhbiBiZSB3b2tlbgorICogQHdha2VfZmxhZ3M6IHdha2UgbW9kaWZp ZXIgZmxhZ3MgKFdGXyopCisgKgorICogUHV0IGl0IG9uIHRoZSBydW4tcXVldWUgaWYgaXQncyBu b3QgYWxyZWFkeSB0aGVyZS4gVGhlICJjdXJyZW50IgorICogdGhyZWFkIGlzIGFsd2F5cyBvbiB0 aGUgcnVuLXF1ZXVlIChleGNlcHQgd2hlbiB0aGUgYWN0dWFsCisgKiByZS1zY2hlZHVsZSBpcyBp biBwcm9ncmVzcyksIGFuZCBhcyBzdWNoIHlvdSdyZSBhbGxvd2VkIHRvIGRvCisgKiB0aGUgc2lt cGxlciAiY3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkciIHRvIG1hcmsgeW91cnNlbGYKKyAq IHJ1bm5hYmxlIHdpdGhvdXQgdGhlIG92ZXJoZWFkIG9mIHRoaXMuCisgKgorICogUmV0dXJucyAl dHJ1ZSBpZiBAcCB3YXMgd29rZW4gdXAsICVmYWxzZSBpZiBpdCB3YXMgYWxyZWFkeSBydW5uaW5n CisgKiBvciBAc3RhdGUgZGlkbid0IG1hdGNoIEBwJ3Mgc3RhdGUuCisgKi8KK3N0YXRpYyBib29s IHRyeV90b193YWtlX3VwKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgdW5zaWduZWQgaW50IHN0YXRl LAorCQkJICBpbnQgd2FrZV9mbGFncykKK3sKKwlib29sIHN1Y2Nlc3MgPSBmYWxzZTsKKwl1bnNp Z25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBycSAqcnE7CisJaW50IGNwdTsKKworCWdldF9jcHUo KTsKKworCS8qIFRoaXMgYmFycmllciBpcyB1bmRvY3VtZW50ZWQsIHByb2JhYmx5IGZvciBwLT5z dGF0ZT8g44GP44GdICovCisJc21wX3dtYigpOworCisJLyoKKwkgKiBObyBuZWVkIHRvIGRvIHRp bWVfbG9ja19ncnEgYXMgd2Ugb25seSBuZWVkIHRvIHVwZGF0ZSB0aGUgcnEgY2xvY2sKKwkgKiBp ZiB3ZSBhY3RpdmF0ZSB0aGUgdGFzaworCSAqLworCXJxID0gdGFza19ncnFfbG9jayhwLCAmZmxh Z3MpOworCWNwdSA9IHRhc2tfY3B1KHApOworCisJLyogc3RhdGUgaXMgYSB2b2xhdGlsZSBsb25n LCDjganjgYbjgZfjgabjgIHliIbjgYvjgonjgarjgYQgKi8KKwlpZiAoISgodW5zaWduZWQgaW50 KXAtPnN0YXRlICYgc3RhdGUpKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwlpZiAodGFza19xdWV1 ZWQocCkgfHwgdGFza19ydW5uaW5nKHApKQorCQlnb3RvIG91dF9ydW5uaW5nOworCisJdHR3dV9h Y3RpdmF0ZShwLCBycSwgd2FrZV9mbGFncyAmIFdGX1NZTkMpOworCXN1Y2Nlc3MgPSB0cnVlOwor CitvdXRfcnVubmluZzoKKwl0dHd1X3Bvc3RfYWN0aXZhdGlvbihwLCBycSwgc3VjY2Vzcyk7Citv dXRfdW5sb2NrOgorCXRhc2tfZ3JxX3VubG9jaygmZmxhZ3MpOworCisJdHR3dV9zdGF0KHAsIGNw dSwgd2FrZV9mbGFncyk7CisKKwlwdXRfY3B1KCk7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKwor LyoqCisgKiB0cnlfdG9fd2FrZV91cF9sb2NhbCAtIHRyeSB0byB3YWtlIHVwIGEgbG9jYWwgdGFz ayB3aXRoIGdycSBsb2NrIGhlbGQKKyAqIEBwOiB0aGUgdGhyZWFkIHRvIGJlIGF3YWtlbmVkCisg KgorICogUHV0IEBwIG9uIHRoZSBydW4tcXVldWUgaWYgaXQncyBub3QgYWxyZWFkeSB0aGVyZS4g VGhlIGNhbGxlciBtdXN0CisgKiBlbnN1cmUgdGhhdCBncnEgaXMgbG9ja2VkIGFuZCwgQHAgaXMg bm90IHRoZSBjdXJyZW50IHRhc2suCisgKiBncnEgc3RheXMgbG9ja2VkIG92ZXIgaW52b2NhdGlv bi4KKyAqLworc3RhdGljIHZvaWQgdHJ5X3RvX3dha2VfdXBfbG9jYWwoc3RydWN0IHRhc2tfc3Ry dWN0ICpwKQoreworCXN0cnVjdCBycSAqcnEgPSB0YXNrX3JxKHApOworCWJvb2wgc3VjY2VzcyA9 IGZhbHNlOworCisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmZ3JxLmxvY2spOworCisJaWYgKCEocC0+ c3RhdGUgJiBUQVNLX05PUk1BTCkpCisJCXJldHVybjsKKworCWlmICghdGFza19xdWV1ZWQocCkp IHsKKwkJdHR3dV9hY3RpdmF0ZShwLCBycSwgZmFsc2UpOworCQl0dHd1X3N0YXQocCwgc21wX3By b2Nlc3Nvcl9pZCgpLCAwKTsKKwkJc3VjY2VzcyA9IHRydWU7CisJfQorCXR0d3VfcG9zdF9hY3Rp dmF0aW9uKHAsIHJxLCBzdWNjZXNzKTsKK30KKworLyoqCisgKiB3YWtlX3VwX3Byb2Nlc3MgLSBX YWtlIHVwIGEgc3BlY2lmaWMgcHJvY2VzcworICogQHA6IFRoZSBwcm9jZXNzIHRvIGJlIHdva2Vu IHVwLgorICoKKyAqIEF0dGVtcHQgdG8gd2FrZSB1cCB0aGUgbm9taW5hdGVkIHByb2Nlc3MgYW5k IG1vdmUgaXQgdG8gdGhlIHNldCBvZiBydW5uYWJsZQorICogcHJvY2Vzc2VzLiAgUmV0dXJucyAx IGlmIHRoZSBwcm9jZXNzIHdhcyB3b2tlbiB1cCwgMCBpZiBpdCB3YXMgYWxyZWFkeQorICogcnVu bmluZy4KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaW1wbGll cyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQorICogY2hhbmdpbmcgdGhlIHRhc2sgc3Rh dGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3b2tlbiB1cC4KKyAqLworaW50IHdha2Vf dXBfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIHRyeV90b193YWtl X3VwKHAsIFRBU0tfQUxMLCAwKTsKK30KK0VYUE9SVF9TWU1CT0wod2FrZV91cF9wcm9jZXNzKTsK KworaW50IHdha2VfdXBfc3RhdGUoc3RydWN0IHRhc2tfc3RydWN0ICpwLCB1bnNpZ25lZCBpbnQg c3RhdGUpCit7CisJcmV0dXJuIHRyeV90b193YWtlX3VwKHAsIHN0YXRlLCAwKTsKK30KKworLyoK KyAqIFBlcmZvcm0gc2NoZWR1bGVyIHJlbGF0ZWQgc2V0dXAgZm9yIGEgbmV3bHkgZm9ya2VkIHBy b2Nlc3MgcC4KKyAqIHAgaXMgZm9ya2VkIGJ5IGN1cnJlbnQuCisgKi8KK3ZvaWQgc2NoZWRfZm9y ayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyOwor CWludCBjcHUgPSBnZXRfY3B1KCk7CisJc3RydWN0IHJxICpycTsKKworI2lmZGVmIENPTkZJR19Q UkVFTVBUX05PVElGSUVSUworCUlOSVRfSExJU1RfSEVBRCgmcC0+cHJlZW1wdF9ub3RpZmllcnMp OworI2VuZGlmCisJLyoKKwkgKiBXZSBtYXJrIHRoZSBwcm9jZXNzIGFzIHJ1bm5pbmcgaGVyZS4g VGhpcyBndWFyYW50ZWVzIHRoYXQKKwkgKiBub2JvZHkgd2lsbCBhY3R1YWxseSBydW4gaXQsIGFu ZCBhIHNpZ25hbCBvciBvdGhlciBleHRlcm5hbAorCSAqIGV2ZW50IGNhbm5vdCB3YWtlIGl0IHVw IGFuZCBpbnNlcnQgaXQgb24gdGhlIHJ1bnF1ZXVlIGVpdGhlci4KKwkgKi8KKwlwLT5zdGF0ZSA9 IFRBU0tfUlVOTklORzsKKwlzZXRfdGFza19jcHUocCwgY3B1KTsKKworCXAtPnNjaGVkX3RpbWUg PSBwLT5zdGltZV9wYyA9IHAtPnV0aW1lX3BjID0gMDsKKworCS8qCisJICogUmV2ZXJ0IHRvIGRl ZmF1bHQgcHJpb3JpdHkvcG9saWN5IG9uIGZvcmsgaWYgcmVxdWVzdGVkLgorCSAqLworCWlmICh1 bmxpa2VseShwLT5zY2hlZF9yZXNldF9vbl9mb3JrKSkgeworCQlpZiAocC0+cG9saWN5ID09IFND SEVEX0ZJRk8gfHwgcC0+cG9saWN5ID09IFNDSEVEX1JSKSB7CisJCQlwLT5wb2xpY3kgPSBTQ0hF RF9OT1JNQUw7CisJCX0KKworCQlpZiAoUFJJT19UT19OSUNFKHAtPnN0YXRpY19wcmlvKSA8IDAp IHsKKwkJCXAtPnN0YXRpY19wcmlvID0gTklDRV9UT19QUklPKDApOworCQl9CisKKwkJLyoKKwkJ ICogV2UgZG9uJ3QgbmVlZCB0aGUgcmVzZXQgZmxhZyBhbnltb3JlIGFmdGVyIHRoZSBmb3JrLiBJ dCBoYXMKKwkJICogZnVsZmlsbGVkIGl0cyBkdXR5OgorCQkgKi8KKwkJcC0+c2NoZWRfcmVzZXRf b25fZm9yayA9IDA7CisJfQorCisJY3VyciA9IGN1cnJlbnQ7CisJLyoKKwkgKiBNYWtlIHN1cmUg d2UgZG8gbm90IGxlYWsgUEkgYm9vc3RpbmcgcHJpb3JpdHkgdG8gdGhlIGNoaWxkLgorCSAqLwor CXAtPnByaW8gPSBjdXJyLT5zdGF0aWNfcHJpbzsKKwlwLT50aWNrX3VzZWQgPSBjdXJyLT50aWNr X3VzZWQ7CisKKwlJTklUX0xJU1RfSEVBRCgmcC0+cnVuX2xpc3QpOworI2lmIGRlZmluZWQoQ09O RklHX1NDSEVEU1RBVFMpIHx8IGRlZmluZWQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkKKwlpZiAo dW5saWtlbHkoc2NoZWRfaW5mb19vbigpKSkKKwkJbWVtc2V0KCZwLT5zY2hlZF9pbmZvLCAwLCBz aXplb2YocC0+c2NoZWRfaW5mbykpOworI2VuZGlmCisKKwlwLT5vbl9jcHUgPSBmYWxzZTsKKwlj bGVhcl9zdGlja3kocCk7CisKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9DT1VOVAorCS8qIFdhbnQg dG8gc3RhcnQgd2l0aCBrZXJuZWwgcHJlZW1wdGlvbiBkaXNhYmxlZC4gKi8KKwl0YXNrX3RocmVh ZF9pbmZvKHApLT5wcmVlbXB0X2NvdW50ID0gMTsKKyNlbmRpZgorCWlmICh1bmxpa2VseShwLT5w b2xpY3kgPT0gU0NIRURfRklGTykpCisJCWdvdG8gb3V0OworCS8qCisJICogU2hhcmUgdGhlIHRp bWVzbGljZSBiZXR3ZWVuIHBhcmVudCBhbmQgY2hpbGQsIHRodXMgdGhlCisJICogdG90YWwgYW1v dW50IG9mIHBlbmRpbmcgdGltZXNsaWNlcyBpbiB0aGUgc3lzdGVtIGRvZXNuJ3QgY2hhbmdlLAor CSAqIHJlc3VsdGluZyBpbiBtb3JlIHNjaGVkdWxpbmcgZmFpcm5lc3MuIElmIGl0J3MgbmVnYXRp dmUsIGl0IHdvbid0CisJICogbWF0dGVyIHNpbmNlIHRoYXQncyB0aGUgc2FtZSBhcyBiZWluZyAw LiBjdXJyZW50J3MgdGltZV9zbGljZSBpcworCSAqIGFjdHVhbGx5IGluIHRpbWVzbGljZSB3aGVu IGl0J3MgcnVubmluZywgYXMgaXMgaXRzIGxhc3RfcmFuCisJICogdmFsdWUuIAorCSAqLworCXJx ID0gdGFza19ncnFfbG9ja19pcnEoY3Vycik7CisJaWYgKGxpa2VseShjdXJyLT50aW1lX3NsaWNl ID49IFJFU0NIRURfVVMgKiAyKSkgeworCQljdXJyLT50aW1lX3NsaWNlIC89IDI7CisJCXAtPnRp bWVfc2xpY2UgPSBjdXJyLT50aW1lX3NsaWNlOworCX0gZWxzZSB7CisJCS8qCisJCSAqIEZvcmtp bmcgdGFzayBoYXMgcnVuIG91dCBvZiB0aW1lc2xpY2UuIFJlc2NoZWR1bGUgaXQuCisJCSAqLwor CQljdXJyLT50aW1lX3NsaWNlID0gMDsKKwkJc2V0X3Rza19uZWVkX3Jlc2NoZWQoY3Vycik7CisJ CWdldF90aW1lX3NsaWNlKHApOworCX0KKwlwLT5sYXN0X3JhbiA9IHJxLT5ycV9sYXN0X3JhbjsK Kwl0YXNrX2dycV91bmxvY2tfaXJxKCk7CitvdXQ6CisJcHV0X2NwdSgpOworfQorCisvKgorICog d2FrZV91cF9uZXdfdGFzayAtIHdha2UgdXAgYSBuZXdseSBjcmVhdGVkIHRhc2sgZm9yIHRoZSBm aXJzdCB0aW1lLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkbyBzb21lIGluaXRpYWwgc2No ZWR1bGVyIHN0YXRpc3RpY3MgaG91c2VrZWVwaW5nCisgKiB0aGF0IG11c3QgYmUgZG9uZSBmb3Ig ZXZlcnkgbmV3bHkgY3JlYXRlZCBjb250ZXh0LCB0aGVuIHB1dHMgdGhlIHRhc2sKKyAqIG9uIHRo ZSBydW5xdWV1ZSBhbmQgd2FrZXMgaXQuCisgKi8KK3ZvaWQgd2FrZV91cF9uZXdfdGFzayhzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQ7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcnEgKnJxOworCisJcnEgPSB0YXNrX2dycV9sb2Nr KHAsICZmbGFncyk7CisJcC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJcC0+dGlja191c2VkID0g MDsKKwlwYXJlbnQgPSBwLT5wYXJlbnQ7CisJLyogVW5uZWNlc3NhcnkgYnV0IHNtYWxsIGNoYW5j ZSB0aGF0IHRoZSBwYXJlbnQgY2hhbmdlZCBDUFUgKi8KKwlzZXRfdGFza19jcHUocCwgdGFza19j cHUocGFyZW50KSk7CisJYWN0aXZhdGVfdGFzayhwLCBycSk7CisJdHJhY2Vfc2NoZWRfd2FrZXVw X25ldyhwLCAxKTsKKwlpZiAocnEtPmN1cnIgPT0gcGFyZW50ICYmICFzdWl0YWJsZV9pZGxlX2Nw dXMocCkpIHsKKwkJLyoKKwkJICogVGhlIFZNIGlzbid0IGNsb25lZCwgc28gd2UncmUgaW4gYSBn b29kIHBvc2l0aW9uIHRvCisJCSAqIGRvIGNoaWxkLXJ1bnMtZmlyc3QgaW4gYW50aWNpcGF0aW9u IG9mIGFuIGV4ZWMuIFRoaXMKKwkJICogdXN1YWxseSBhdm9pZHMgYSBsb3Qgb2YgQ09XIG92ZXJo ZWFkLgorCQkgKi8KKwkJcmVzY2hlZF90YXNrKHBhcmVudCk7CisJfSBlbHNlCisJCXRyeV9wcmVl bXB0KHAsIHJxKTsKKwl0YXNrX2dycV91bmxvY2soJmZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJ R19QUkVFTVBUX05PVElGSUVSUworCisvKioKKyAqIHByZWVtcHRfbm90aWZpZXJfcmVnaXN0ZXIg LSB0ZWxsIG1lIHdoZW4gY3VycmVudCBpcyBiZWluZyBwcmVlbXB0ZWQgJiByZXNjaGVkdWxlZAor ICogQG5vdGlmaWVyOiBub3RpZmllciBzdHJ1Y3QgdG8gcmVnaXN0ZXIKKyAqLwordm9pZCBwcmVl bXB0X25vdGlmaWVyX3JlZ2lzdGVyKHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcikK K3sKKwlobGlzdF9hZGRfaGVhZCgmbm90aWZpZXItPmxpbmssICZjdXJyZW50LT5wcmVlbXB0X25v dGlmaWVycyk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChwcmVlbXB0X25vdGlmaWVyX3JlZ2lzdGVy KTsKKworLyoqCisgKiBwcmVlbXB0X25vdGlmaWVyX3VucmVnaXN0ZXIgLSBubyBsb25nZXIgaW50 ZXJlc3RlZCBpbiBwcmVlbXB0aW9uIG5vdGlmaWNhdGlvbnMKKyAqIEBub3RpZmllcjogbm90aWZp ZXIgc3RydWN0IHRvIHVucmVnaXN0ZXIKKyAqCisgKiBUaGlzIGlzIHNhZmUgdG8gY2FsbCBmcm9t IHdpdGhpbiBhIHByZWVtcHRpb24gbm90aWZpZXIuCisgKi8KK3ZvaWQgcHJlZW1wdF9ub3RpZmll cl91bnJlZ2lzdGVyKHN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcikKK3sKKwlobGlz dF9kZWwoJm5vdGlmaWVyLT5saW5rKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHByZWVtcHRfbm90 aWZpZXJfdW5yZWdpc3Rlcik7CisKK3N0YXRpYyB2b2lkIGZpcmVfc2NoZWRfaW5fcHJlZW1wdF9u b3RpZmllcnMoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQoreworCXN0cnVjdCBwcmVlbXB0X25v dGlmaWVyICpub3RpZmllcjsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqbm9kZTsKKworCWhsaXN0X2Zv cl9lYWNoX2VudHJ5KG5vdGlmaWVyLCBub2RlLCAmY3Vyci0+cHJlZW1wdF9ub3RpZmllcnMsIGxp bmspCisJCW5vdGlmaWVyLT5vcHMtPnNjaGVkX2luKG5vdGlmaWVyLCByYXdfc21wX3Byb2Nlc3Nv cl9pZCgpKTsKK30KKworc3RhdGljIHZvaWQKK2ZpcmVfc2NoZWRfb3V0X3ByZWVtcHRfbm90aWZp ZXJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwKKwkJCQkgc3RydWN0IHRhc2tfc3RydWN0ICpu ZXh0KQoreworCXN0cnVjdCBwcmVlbXB0X25vdGlmaWVyICpub3RpZmllcjsKKwlzdHJ1Y3QgaGxp c3Rfbm9kZSAqbm9kZTsKKworCWhsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vdGlmaWVyLCBub2RlLCAm Y3Vyci0+cHJlZW1wdF9ub3RpZmllcnMsIGxpbmspCisJCW5vdGlmaWVyLT5vcHMtPnNjaGVkX291 dChub3RpZmllciwgbmV4dCk7Cit9CisKKyNlbHNlIC8qICFDT05GSUdfUFJFRU1QVF9OT1RJRklF UlMgKi8KKworc3RhdGljIHZvaWQgZmlyZV9zY2hlZF9pbl9wcmVlbXB0X25vdGlmaWVycyhzdHJ1 Y3QgdGFza19zdHJ1Y3QgKmN1cnIpCit7Cit9CisKK3N0YXRpYyB2b2lkCitmaXJlX3NjaGVkX291 dF9wcmVlbXB0X25vdGlmaWVycyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnIsCisJCQkJIHN0cnVj dCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKK30KKworI2VuZGlmIC8qIENPTkZJR19QUkVFTVBUX05P VElGSUVSUyAqLworCisvKioKKyAqIHByZXBhcmVfdGFza19zd2l0Y2ggLSBwcmVwYXJlIHRvIHN3 aXRjaCB0YXNrcworICogQHJxOiB0aGUgcnVucXVldWUgcHJlcGFyaW5nIHRvIHN3aXRjaAorICog QG5leHQ6IHRoZSB0YXNrIHdlIGFyZSBnb2luZyB0byBzd2l0Y2ggdG8uCisgKgorICogVGhpcyBp cyBjYWxsZWQgd2l0aCB0aGUgcnEgbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIG9mZi4gSXQgbXVz dAorICogYmUgcGFpcmVkIHdpdGggYSBzdWJzZXF1ZW50IGZpbmlzaF90YXNrX3N3aXRjaCBhZnRl ciB0aGUgY29udGV4dAorICogc3dpdGNoLgorICoKKyAqIHByZXBhcmVfdGFza19zd2l0Y2ggc2V0 cyB1cCBsb2NraW5nIGFuZCBjYWxscyBhcmNoaXRlY3R1cmUgc3BlY2lmaWMKKyAqIGhvb2tzLgor ICovCitzdGF0aWMgaW5saW5lIHZvaWQKK3ByZXBhcmVfdGFza19zd2l0Y2goc3RydWN0IHJxICpy cSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAorCQkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0 KQoreworCXBlcmZfZXZlbnRfdGFza19zY2hlZF9vdXQocHJldiwgbmV4dCk7CisJZmlyZV9zY2hl ZF9vdXRfcHJlZW1wdF9ub3RpZmllcnMocHJldiwgbmV4dCk7CisJcHJlcGFyZV9sb2NrX3N3aXRj aChycSwgbmV4dCk7CisJcHJlcGFyZV9hcmNoX3N3aXRjaChuZXh0KTsKKwl0cmFjZV9zY2hlZF9z d2l0Y2gocHJldiwgbmV4dCk7Cit9CisKKy8qKgorICogZmluaXNoX3Rhc2tfc3dpdGNoIC0gY2xl YW4gdXAgYWZ0ZXIgYSB0YXNrLXN3aXRjaAorICogQHJxOiBydW5xdWV1ZSBhc3NvY2lhdGVkIHdp dGggdGFzay1zd2l0Y2gKKyAqIEBwcmV2OiB0aGUgdGhyZWFkIHdlIGp1c3Qgc3dpdGNoZWQgYXdh eSBmcm9tLgorICoKKyAqIGZpbmlzaF90YXNrX3N3aXRjaCBtdXN0IGJlIGNhbGxlZCBhZnRlciB0 aGUgY29udGV4dCBzd2l0Y2gsIHBhaXJlZAorICogd2l0aCBhIHByZXBhcmVfdGFza19zd2l0Y2gg Y2FsbCBiZWZvcmUgdGhlIGNvbnRleHQgc3dpdGNoLgorICogZmluaXNoX3Rhc2tfc3dpdGNoIHdp bGwgcmVjb25jaWxlIGxvY2tpbmcgc2V0IHVwIGJ5IHByZXBhcmVfdGFza19zd2l0Y2gsCisgKiBh bmQgZG8gYW55IG90aGVyIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjbGVhbnVwIGFjdGlvbnMuCisg KgorICogTm90ZSB0aGF0IHdlIG1heSBoYXZlIGRlbGF5ZWQgZHJvcHBpbmcgYW4gbW0gaW4gY29u dGV4dF9zd2l0Y2goKS4gSWYKKyAqIHNvLCB3ZSBmaW5pc2ggdGhhdCBoZXJlIG91dHNpZGUgb2Yg dGhlIHJ1bnF1ZXVlIGxvY2suICAoRG9pbmcgaXQKKyAqIHdpdGggdGhlIGxvY2sgaGVsZCBjYW4g Y2F1c2UgZGVhZGxvY2tzOyBzZWUgc2NoZWR1bGUoKSBmb3IKKyAqIGRldGFpbHMuKQorICovCitz dGF0aWMgaW5saW5lIHZvaWQgZmluaXNoX3Rhc2tfc3dpdGNoKHN0cnVjdCBycSAqcnEsIHN0cnVj dCB0YXNrX3N0cnVjdCAqcHJldikKKwlfX3JlbGVhc2VzKGdycS5sb2NrKQoreworCXN0cnVjdCBt bV9zdHJ1Y3QgKm1tID0gcnEtPnByZXZfbW07CisJbG9uZyBwcmV2X3N0YXRlOworCisJcnEtPnBy ZXZfbW0gPSBOVUxMOworCisJLyoKKwkgKiBBIHRhc2sgc3RydWN0IGhhcyBvbmUgcmVmZXJlbmNl IGZvciB0aGUgdXNlIGFzICJjdXJyZW50Ii4KKwkgKiBJZiBhIHRhc2sgZGllcywgdGhlbiBpdCBz ZXRzIFRBU0tfREVBRCBpbiB0c2stPnN0YXRlIGFuZCBjYWxscworCSAqIHNjaGVkdWxlIG9uZSBs YXN0IHRpbWUuIFRoZSBzY2hlZHVsZSBjYWxsIHdpbGwgbmV2ZXIgcmV0dXJuLCBhbmQKKwkgKiB0 aGUgc2NoZWR1bGVkIHRhc2sgbXVzdCBkcm9wIHRoYXQgcmVmZXJlbmNlLgorCSAqIFRoZSB0ZXN0 IGZvciBUQVNLX0RFQUQgbXVzdCBvY2N1ciB3aGlsZSB0aGUgcnVucXVldWUgbG9ja3MgYXJlCisJ ICogc3RpbGwgaGVsZCwgb3RoZXJ3aXNlIHByZXYgY291bGQgYmUgc2NoZWR1bGVkIG9uIGFub3Ro ZXIgY3B1LCBkaWUKKwkgKiB0aGVyZSBiZWZvcmUgd2UgbG9vayBhdCBwcmV2LT5zdGF0ZSwgYW5k IHRoZW4gdGhlIHJlZmVyZW5jZSB3b3VsZAorCSAqIGJlIGRyb3BwZWQgdHdpY2UuCisJICoJCU1h bmZyZWQgU3ByYXVsIDxtYW5mcmVkQGNvbG9yZnVsbGlmZS5jb20+CisJICovCisJcHJldl9zdGF0 ZSA9IHByZXYtPnN0YXRlOworCWZpbmlzaF9hcmNoX3N3aXRjaChwcmV2KTsKKyNpZmRlZiBfX0FS Q0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXCisJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKyNlbmRp ZiAvKiBfX0FSQ0hfV0FOVF9JTlRFUlJVUFRTX09OX0NUWFNXICovCisJcGVyZl9ldmVudF90YXNr X3NjaGVkX2luKHByZXYsIGN1cnJlbnQpOworI2lmZGVmIF9fQVJDSF9XQU5UX0lOVEVSUlVQVFNf T05fQ1RYU1cKKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisjZW5kaWYgLyogX19BUkNIX1dBTlRfSU5U RVJSVVBUU19PTl9DVFhTVyAqLworCWZpbmlzaF9sb2NrX3N3aXRjaChycSwgcHJldik7CisKKwlm aXJlX3NjaGVkX2luX3ByZWVtcHRfbm90aWZpZXJzKGN1cnJlbnQpOworCWlmIChtbSkKKwkJbW1k cm9wKG1tKTsKKwlpZiAodW5saWtlbHkocHJldl9zdGF0ZSA9PSBUQVNLX0RFQUQpKSB7CisJCS8q CisJCSAqIFJlbW92ZSBmdW5jdGlvbi1yZXR1cm4gcHJvYmUgaW5zdGFuY2VzIGFzc29jaWF0ZWQg d2l0aCB0aGlzCisJCSAqIHRhc2sgYW5kIHB1dCB0aGVtIGJhY2sgb24gdGhlIGZyZWUgbGlzdC4K KwkJICovCisJCWtwcm9iZV9mbHVzaF90YXNrKHByZXYpOworCQlwdXRfdGFza19zdHJ1Y3QocHJl dik7CisJfQorfQorCisvKioKKyAqIHNjaGVkdWxlX3RhaWwgLSBmaXJzdCB0aGluZyBhIGZyZXNo bHkgZm9ya2VkIHRocmVhZCBtdXN0IGNhbGwuCisgKiBAcHJldjogdGhlIHRocmVhZCB3ZSBqdXN0 IHN3aXRjaGVkIGF3YXkgZnJvbS4KKyAqLworYXNtbGlua2FnZSB2b2lkIHNjaGVkdWxlX3RhaWwo c3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQorCV9fcmVsZWFzZXMoZ3JxLmxvY2spCit7CisJc3Ry dWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKworCWZpbmlzaF90YXNrX3N3aXRjaChycSwgcHJldik7 CisjaWZkZWYgX19BUkNIX1dBTlRfVU5MT0NLRURfQ1RYU1cKKwkvKiBJbiB0aGlzIGNhc2UsIGZp bmlzaF90YXNrX3N3aXRjaCBkb2VzIG5vdCByZWVuYWJsZSBwcmVlbXB0aW9uICovCisJcHJlZW1w dF9lbmFibGUoKTsKKyNlbmRpZgorCWlmIChjdXJyZW50LT5zZXRfY2hpbGRfdGlkKQorCQlwdXRf dXNlcihjdXJyZW50LT5waWQsIGN1cnJlbnQtPnNldF9jaGlsZF90aWQpOworfQorCisvKgorICog Y29udGV4dF9zd2l0Y2ggLSBzd2l0Y2ggdG8gdGhlIG5ldyBNTSBhbmQgdGhlIG5ldworICogdGhy ZWFkJ3MgcmVnaXN0ZXIgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZAorY29udGV4dF9z d2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAorCQkgICBzdHJ1 Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0sICpvbGRtbTsK KwkKKwlwcmVwYXJlX3Rhc2tfc3dpdGNoKHJxLCBwcmV2LCBuZXh0KTsKKworCW1tID0gbmV4dC0+ bW07CisJb2xkbW0gPSBwcmV2LT5hY3RpdmVfbW07CisJLyoKKwkgKiBGb3IgcGFyYXZpcnQsIHRo aXMgaXMgY291cGxlZCB3aXRoIGFuIGV4aXQgaW4gc3dpdGNoX3RvIHRvCisJICogY29tYmluZSB0 aGUgcGFnZSB0YWJsZSByZWxvYWQgYW5kIHRoZSBzd2l0Y2ggYmFja2VuZCBpbnRvCisJICogb25l IGh5cGVyY2FsbC4KKwkgKi8KKwlhcmNoX3N0YXJ0X2NvbnRleHRfc3dpdGNoKHByZXYpOworCisJ aWYgKCFtbSkgeworCQluZXh0LT5hY3RpdmVfbW0gPSBvbGRtbTsKKwkJYXRvbWljX2luYygmb2xk bW0tPm1tX2NvdW50KTsKKwkJZW50ZXJfbGF6eV90bGIob2xkbW0sIG5leHQpOworCX0gZWxzZQor CQlzd2l0Y2hfbW0ob2xkbW0sIG1tLCBuZXh0KTsKKworCWlmICghcHJldi0+bW0pIHsKKwkJcHJl di0+YWN0aXZlX21tID0gTlVMTDsKKwkJcnEtPnByZXZfbW0gPSBvbGRtbTsKKwl9CisJLyoKKwkg KiBTaW5jZSB0aGUgcnVucXVldWUgbG9jayB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBuZXh0CisJ ICogdGFzayAod2hpY2ggaXMgYW4gaW52YWxpZCBsb2NraW5nIG9wIGJ1dCBpbiB0aGUgY2FzZQor CSAqIG9mIHRoZSBzY2hlZHVsZXIgaXQncyBhbiBvYnZpb3VzIHNwZWNpYWwtY2FzZSksIHNvIHdl CisJICogZG8gYW4gZWFybHkgbG9ja2RlcCByZWxlYXNlIGhlcmU6CisJICovCisjaWZuZGVmIF9f QVJDSF9XQU5UX1VOTE9DS0VEX0NUWFNXCisJc3Bpbl9yZWxlYXNlKCZncnEubG9jay5kZXBfbWFw LCAxLCBfVEhJU19JUF8pOworI2VuZGlmCisKKwkvKiBIZXJlIHdlIGp1c3Qgc3dpdGNoIHRoZSBy ZWdpc3RlciBzdGF0ZSBhbmQgdGhlIHN0YWNrLiAqLworCXN3aXRjaF90byhwcmV2LCBuZXh0LCBw cmV2KTsKKworCWJhcnJpZXIoKTsKKwkvKgorCSAqIHRoaXNfcnEgbXVzdCBiZSBldmFsdWF0ZWQg YWdhaW4gYmVjYXVzZSBwcmV2IG1heSBoYXZlIG1vdmVkCisJICogQ1BVcyBzaW5jZSBpdCBjYWxs ZWQgc2NoZWR1bGUoKSwgdGh1cyB0aGUgJ3JxJyBvbiBpdHMgc3RhY2sKKwkgKiBmcmFtZSB3aWxs IGJlIGludmFsaWQuCisJICovCisJZmluaXNoX3Rhc2tfc3dpdGNoKHRoaXNfcnEoKSwgcHJldik7 Cit9CisKKy8qCisgKiBucl9ydW5uaW5nLCBucl91bmludGVycnVwdGlibGUgYW5kIG5yX2NvbnRl eHRfc3dpdGNoZXM6CisgKgorICogZXh0ZXJuYWxseSB2aXNpYmxlIHNjaGVkdWxlciBzdGF0aXN0 aWNzOiBjdXJyZW50IG51bWJlciBvZiBydW5uYWJsZQorICogdGhyZWFkcywgY3VycmVudCBudW1i ZXIgb2YgdW5pbnRlcnJ1cHRpYmxlLXNsZWVwaW5nIHRocmVhZHMsIHRvdGFsCisgKiBudW1iZXIg b2YgY29udGV4dCBzd2l0Y2hlcyBwZXJmb3JtZWQgc2luY2UgYm9vdHVwLiBBbGwgYXJlIG1lYXN1 cmVkCisgKiB3aXRob3V0IGdyYWJiaW5nIHRoZSBncnEgbG9jayBidXQgdGhlIG9jY2FzaW9uYWwg aW5hY2N1cmF0ZSByZXN1bHQKKyAqIGRvZXNuJ3QgbWF0dGVyIHNvIGxvbmcgYXMgaXQncyBwb3Np dGl2ZS4KKyAqLwordW5zaWduZWQgbG9uZyBucl9ydW5uaW5nKHZvaWQpCit7CisJbG9uZyBuciA9 IGdycS5ucl9ydW5uaW5nOworCisJaWYgKHVubGlrZWx5KG5yIDwgMCkpCisJCW5yID0gMDsKKwly ZXR1cm4gKHVuc2lnbmVkIGxvbmcpbnI7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbnJfdW5pbnRlcnJ1 cHRpYmxlKHZvaWQpCit7CisJbG9uZyBudSA9IGdycS5ucl91bmludGVycnVwdGlibGU7CisKKwlp ZiAodW5saWtlbHkobnUgPCAwKSkKKwkJbnUgPSAwOworCXJldHVybiBudTsKK30KKwordW5zaWdu ZWQgbG9uZyBsb25nIG5yX2NvbnRleHRfc3dpdGNoZXModm9pZCkKK3sKKwlsb25nIGxvbmcgbnMg PSBncnEubnJfc3dpdGNoZXM7CisKKwkvKiBUaGlzIGlzIG9mIGNvdXJzZSBpbXBvc3NpYmxlICov CisJaWYgKHVubGlrZWx5KG5zIDwgMCkpCisJCW5zID0gMTsKKwlyZXR1cm4gKHVuc2lnbmVkIGxv bmcgbG9uZyluczsKK30KKwordW5zaWduZWQgbG9uZyBucl9pb3dhaXQodm9pZCkKK3sKKwl1bnNp Z25lZCBsb25nIGksIHN1bSA9IDA7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkKKwkJc3Vt ICs9IGF0b21pY19yZWFkKCZjcHVfcnEoaSktPm5yX2lvd2FpdCk7CisKKwlyZXR1cm4gc3VtOwor fQorCit1bnNpZ25lZCBsb25nIG5yX2lvd2FpdF9jcHUoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcnEg KnRoaXMgPSBjcHVfcnEoY3B1KTsKKwlyZXR1cm4gYXRvbWljX3JlYWQoJnRoaXMtPm5yX2lvd2Fp dCk7Cit9CisKK3Vuc2lnbmVkIGxvbmcgbnJfYWN0aXZlKHZvaWQpCit7CisJcmV0dXJuIG5yX3J1 bm5pbmcoKSArIG5yX3VuaW50ZXJydXB0aWJsZSgpOworfQorCisvKiBCZXlvbmQgYSB0YXNrIHJ1 bm5pbmcgb24gdGhpcyBDUFUsIGxvYWQgaXMgZXF1YWwgZXZlcnl3aGVyZSBvbiBCRlMgKi8KK3Vu c2lnbmVkIGxvbmcgdGhpc19jcHVfbG9hZCh2b2lkKQoreworCXJldHVybiB0aGlzX3JxKCktPnJx X3J1bm5pbmcgKworCQkoKHF1ZXVlZF9ub3RydW5uaW5nKCkgKyBucl91bmludGVycnVwdGlibGUo KSkgLyBncnEubm9jKTsKK30KKworLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZm9yIGNhbGNf bG9hZCAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19sb2FkX3VwZGF0ZTsKK3Vuc2lnbmVk IGxvbmcgYXZlbnJ1blszXTsKK0VYUE9SVF9TWU1CT0woYXZlbnJ1bik7CisKKy8qKgorICogZ2V0 X2F2ZW5ydW4gLSBnZXQgdGhlIGxvYWQgYXZlcmFnZSBhcnJheQorICogQGxvYWRzOglwb2ludGVy IHRvIGRlc3QgbG9hZCBhcnJheQorICogQG9mZnNldDoJb2Zmc2V0IHRvIGFkZAorICogQHNoaWZ0 OglzaGlmdCBjb3VudCB0byBzaGlmdCB0aGUgcmVzdWx0IGxlZnQKKyAqCisgKiBUaGVzZSB2YWx1 ZXMgYXJlIGVzdGltYXRlcyBhdCBiZXN0LCBzbyBubyBuZWVkIGZvciBsb2NraW5nLgorICovCit2 b2lkIGdldF9hdmVucnVuKHVuc2lnbmVkIGxvbmcgKmxvYWRzLCB1bnNpZ25lZCBsb25nIG9mZnNl dCwgaW50IHNoaWZ0KQoreworCWxvYWRzWzBdID0gKGF2ZW5ydW5bMF0gKyBvZmZzZXQpIDw8IHNo aWZ0OworCWxvYWRzWzFdID0gKGF2ZW5ydW5bMV0gKyBvZmZzZXQpIDw8IHNoaWZ0OworCWxvYWRz WzJdID0gKGF2ZW5ydW5bMl0gKyBvZmZzZXQpIDw8IHNoaWZ0OworfQorCitzdGF0aWMgdW5zaWdu ZWQgbG9uZworY2FsY19sb2FkKHVuc2lnbmVkIGxvbmcgbG9hZCwgdW5zaWduZWQgbG9uZyBleHAs IHVuc2lnbmVkIGxvbmcgYWN0aXZlKQoreworCWxvYWQgKj0gZXhwOworCWxvYWQgKz0gYWN0aXZl ICogKEZJWEVEXzEgLSBleHApOworCXJldHVybiBsb2FkID4+IEZTSElGVDsKK30KKworLyoKKyAq IGNhbGNfbG9hZCAtIHVwZGF0ZSB0aGUgYXZlbnJ1biBsb2FkIGVzdGltYXRlcyBldmVyeSBMT0FE X0ZSRVEgc2Vjb25kcy4KKyAqLwordm9pZCBjYWxjX2dsb2JhbF9sb2FkKHVuc2lnbmVkIGxvbmcg dGlja3MpCit7CisJbG9uZyBhY3RpdmU7CisKKwlpZiAodGltZV9iZWZvcmUoamlmZmllcywgY2Fs Y19sb2FkX3VwZGF0ZSkpCisJCXJldHVybjsKKwlhY3RpdmUgPSBucl9hY3RpdmUoKSAqIEZJWEVE XzE7CisKKwlhdmVucnVuWzBdID0gY2FsY19sb2FkKGF2ZW5ydW5bMF0sIEVYUF8xLCBhY3RpdmUp OworCWF2ZW5ydW5bMV0gPSBjYWxjX2xvYWQoYXZlbnJ1blsxXSwgRVhQXzUsIGFjdGl2ZSk7CisJ YXZlbnJ1blsyXSA9IGNhbGNfbG9hZChhdmVucnVuWzJdLCBFWFBfMTUsIGFjdGl2ZSk7CisKKwlj YWxjX2xvYWRfdXBkYXRlID0gamlmZmllcyArIExPQURfRlJFUTsKK30KKworREVGSU5FX1BFUl9D UFUoc3RydWN0IGtlcm5lbF9zdGF0LCBrc3RhdCk7CitERUZJTkVfUEVSX0NQVShzdHJ1Y3Qga2Vy bmVsX2NwdXN0YXQsIGtlcm5lbF9jcHVzdGF0KTsKKworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGtz dGF0KTsKK0VYUE9SVF9QRVJfQ1BVX1NZTUJPTChrZXJuZWxfY3B1c3RhdCk7CisKKyNpZmRlZiBD T05GSUdfSVJRX1RJTUVfQUNDT1VOVElORworCisvKgorICogVGhlcmUgYXJlIG5vIGxvY2tzIGNv dmVyaW5nIHBlcmNwdSBoYXJkaXJxL3NvZnRpcnEgdGltZS4KKyAqIFRoZXkgYXJlIG9ubHkgbW9k aWZpZWQgaW4gYWNjb3VudF9zeXN0ZW1fdnRpbWUsIG9uIGNvcnJlc3BvbmRpbmcgQ1BVCisgKiB3 aXRoIGludGVycnVwdHMgZGlzYWJsZWQuIFNvLCB3cml0ZXMgYXJlIHNhZmUuCisgKiBUaGV5IGFy ZSByZWFkIGFuZCBzYXZlZCBvZmYgb250byBzdHJ1Y3QgcnEgaW4gdXBkYXRlX3JxX2Nsb2NrKCku CisgKiBUaGlzIG1heSByZXN1bHQgaW4gb3RoZXIgQ1BVIHJlYWRpbmcgdGhpcyBDUFUncyBpcnEg dGltZSBhbmQgY2FuCisgKiByYWNlIHdpdGggaXJxL2FjY291bnRfc3lzdGVtX3Z0aW1lIG9uIHRo aXMgQ1BVLiBXZSB3b3VsZCBlaXRoZXIgZ2V0IG9sZAorICogb3IgbmV3IHZhbHVlIHdpdGggYSBz aWRlIGVmZmVjdCBvZiBhY2NvdW50aW5nIGEgc2xpY2Ugb2YgaXJxIHRpbWUgdG8gd3JvbmcKKyAq IHRhc2sgd2hlbiBpcnEgaXMgaW4gcHJvZ3Jlc3Mgd2hpbGUgd2UgcmVhZCBycS0+Y2xvY2suIFRo YXQgaXMgYSB3b3J0aHkKKyAqIGNvbXByb21pc2UgaW4gcGxhY2Ugb2YgaGF2aW5nIGxvY2tzIG9u IGVhY2ggaXJxIGluIGFjY291bnRfc3lzdGVtX3RpbWUuCisgKi8KK3N0YXRpYyBERUZJTkVfUEVS X0NQVSh1NjQsIGNwdV9oYXJkaXJxX3RpbWUpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHU2NCwg Y3B1X3NvZnRpcnFfdGltZSk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQsIGlycV9zdGFy dF90aW1lKTsKK3N0YXRpYyBpbnQgc2NoZWRfY2xvY2tfaXJxdGltZTsKKwordm9pZCBlbmFibGVf c2NoZWRfY2xvY2tfaXJxdGltZSh2b2lkKQoreworCXNjaGVkX2Nsb2NrX2lycXRpbWUgPSAxOwor fQorCit2b2lkIGRpc2FibGVfc2NoZWRfY2xvY2tfaXJxdGltZSh2b2lkKQoreworCXNjaGVkX2Ns b2NrX2lycXRpbWUgPSAwOworfQorCisjaWZuZGVmIENPTkZJR182NEJJVAorc3RhdGljIERFRklO RV9QRVJfQ1BVKHNlcWNvdW50X3QsIGlycV90aW1lX3NlcSk7CisKK3N0YXRpYyBpbmxpbmUgdm9p ZCBpcnFfdGltZV93cml0ZV9iZWdpbih2b2lkKQoreworCV9fdGhpc19jcHVfaW5jKGlycV90aW1l X3NlcS5zZXF1ZW5jZSk7CisJc21wX3dtYigpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJx X3RpbWVfd3JpdGVfZW5kKHZvaWQpCit7CisJc21wX3dtYigpOworCV9fdGhpc19jcHVfaW5jKGly cV90aW1lX3NlcS5zZXF1ZW5jZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGlycV90aW1lX3Jl YWQoaW50IGNwdSkKK3sKKwl1NjQgaXJxX3RpbWU7CisJdW5zaWduZWQgc2VxOworCisJZG8gewor CQlzZXEgPSByZWFkX3NlcWNvdW50X2JlZ2luKCZwZXJfY3B1KGlycV90aW1lX3NlcSwgY3B1KSk7 CisJCWlycV90aW1lID0gcGVyX2NwdShjcHVfc29mdGlycV90aW1lLCBjcHUpICsKKwkJCSAgIHBl cl9jcHUoY3B1X2hhcmRpcnFfdGltZSwgY3B1KTsKKwl9IHdoaWxlIChyZWFkX3NlcWNvdW50X3Jl dHJ5KCZwZXJfY3B1KGlycV90aW1lX3NlcSwgY3B1KSwgc2VxKSk7CisKKwlyZXR1cm4gaXJxX3Rp bWU7Cit9CisjZWxzZSAvKiBDT05GSUdfNjRCSVQgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnFf dGltZV93cml0ZV9iZWdpbih2b2lkKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaXJxX3Rp bWVfd3JpdGVfZW5kKHZvaWQpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTY0IGlycV90aW1lX3Jl YWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gcGVyX2NwdShjcHVfc29mdGlycV90aW1lLCBjcHUpICsg cGVyX2NwdShjcHVfaGFyZGlycV90aW1lLCBjcHUpOworfQorI2VuZGlmIC8qIENPTkZJR182NEJJ VCAqLworCitib29sIGNwdXNfc2hhcmVfY2FjaGUoaW50IHRoaXNfY3B1LCBpbnQgdGhhdF9jcHUp Cit7CisJc3RydWN0IHJxICp0aGlzX3JxID0gY3B1X3JxKHRoaXNfY3B1KTsKKworCXJldHVybiAo dGhpc19ycS0+Y3B1X2xvY2FsaXR5W3RoYXRfY3B1XSA8IDIpOworfQorRVhQT1JUX1NZTUJPTChj cHVzX3NoYXJlX2NhY2hlKTsKKworLyoKKyAqIENhbGxlZCBiZWZvcmUgaW5jcmVtZW50aW5nIHBy ZWVtcHRfY291bnQgb24ge3NvZnQsfWlycV9lbnRlcgorICogYW5kIGJlZm9yZSBkZWNyZW1lbnRp bmcgcHJlZW1wdF9jb3VudCBvbiB7c29mdCx9aXJxX2V4aXQuCisgKi8KK3ZvaWQgYWNjb3VudF9z eXN0ZW1fdnRpbWUoc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyKQoreworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisJczY0IGRlbHRhOworCWludCBjcHU7CisKKwlpZiAoIXNjaGVkX2Nsb2NrX2lycXRp bWUpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCWNwdSA9IHNtcF9w cm9jZXNzb3JfaWQoKTsKKwlkZWx0YSA9IHNjaGVkX2Nsb2NrX2NwdShjcHUpIC0gX190aGlzX2Nw dV9yZWFkKGlycV9zdGFydF90aW1lKTsKKwlfX3RoaXNfY3B1X2FkZChpcnFfc3RhcnRfdGltZSwg ZGVsdGEpOworCisJaXJxX3RpbWVfd3JpdGVfYmVnaW4oKTsKKwkvKgorCSAqIFdlIGRvIG5vdCBh Y2NvdW50IGZvciBzb2Z0aXJxIHRpbWUgZnJvbSBrc29mdGlycWQgaGVyZS4KKwkgKiBXZSB3YW50 IHRvIGNvbnRpbnVlIGFjY291bnRpbmcgc29mdGlycSB0aW1lIHRvIGtzb2Z0aXJxZCB0aHJlYWQK KwkgKiBpbiB0aGF0IGNhc2UsIHNvIGFzIG5vdCB0byBjb25mdXNlIHNjaGVkdWxlciB3aXRoIGEg c3BlY2lhbCB0YXNrCisJICogdGhhdCBkbyBub3QgY29uc3VtZSBhbnkgdGltZSwgYnV0IHN0aWxs IHdhbnRzIHRvIHJ1bi4KKwkgKi8KKwlpZiAoaGFyZGlycV9jb3VudCgpKQorCQlfX3RoaXNfY3B1 X2FkZChjcHVfaGFyZGlycV90aW1lLCBkZWx0YSk7CisJZWxzZSBpZiAoaW5fc2VydmluZ19zb2Z0 aXJxKCkgJiYgY3VyciAhPSB0aGlzX2NwdV9rc29mdGlycWQoKSkKKwkJX190aGlzX2NwdV9hZGQo Y3B1X3NvZnRpcnFfdGltZSwgZGVsdGEpOworCisJaXJxX3RpbWVfd3JpdGVfZW5kKCk7CisJbG9j YWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorRVhQT1JUX1NZTUJPTF9HUEwoYWNjb3VudF9zeXN0 ZW1fdnRpbWUpOworCisjZW5kaWYgLyogQ09ORklHX0lSUV9USU1FX0FDQ09VTlRJTkcgKi8KKwor c3RhdGljIHZvaWQgdXBkYXRlX3JxX2Nsb2NrX3Rhc2soc3RydWN0IHJxICpycSwgczY0IGRlbHRh KQoreworI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCisJczY0IGlycV9kZWx0YSA9 IGlycV90aW1lX3JlYWQoY3B1X29mKHJxKSkgLSBycS0+cHJldl9pcnFfdGltZTsKKworCS8qCisJ ICogU2luY2UgaXJxX3RpbWUgaXMgb25seSB1cGRhdGVkIG9uIHtzb2Z0LH1pcnFfZXhpdCwgd2Ug bWlnaHQgcnVuIGludG8KKwkgKiB0aGlzIGNhc2Ugd2hlbiBhIHByZXZpb3VzIHVwZGF0ZV9ycV9j bG9jaygpIGhhcHBlbmVkIGluc2lkZSBhCisJICoge3NvZnQsfWlycSByZWdpb24uCisJICoKKwkg KiBXaGVuIHRoaXMgaGFwcGVucywgd2Ugc3RvcCAtPmNsb2NrX3Rhc2sgYW5kIG9ubHkgdXBkYXRl IHRoZQorCSAqIHByZXZfaXJxX3RpbWUgc3RhbXAgdG8gYWNjb3VudCBmb3IgdGhlIHBhcnQgdGhh dCBmaXQsIHNvIHRoYXQgYSBuZXh0CisJICogdXBkYXRlIHdpbGwgY29uc3VtZSB0aGUgcmVzdC4g VGhpcyBlbnN1cmVzIC0+Y2xvY2tfdGFzayBpcworCSAqIG1vbm90b25pYy4KKwkgKgorCSAqIEl0 IGRvZXMgaG93ZXZlciBjYXVzZSBzb21lIHNsaWdodCBtaXNzLWF0dHJpYnV0aW9uIG9mIHtzb2Z0 LH1pcnEKKwkgKiB0aW1lLCBhIG1vcmUgYWNjdXJhdGUgc29sdXRpb24gd291bGQgYmUgdG8gdXBk YXRlIHRoZSBpcnFfdGltZSB1c2luZworCSAqIHRoZSBjdXJyZW50IHJxLT5jbG9jayB0aW1lc3Rh bXAsIGV4Y2VwdCB0aGF0IHdvdWxkIHJlcXVpcmUgdXNpbmcKKwkgKiBhdG9taWMgb3BzLgorCSAq LworCWlmIChpcnFfZGVsdGEgPiBkZWx0YSkKKwkJaXJxX2RlbHRhID0gZGVsdGE7CisKKwlycS0+ cHJldl9pcnFfdGltZSArPSBpcnFfZGVsdGE7CisJZGVsdGEgLT0gaXJxX2RlbHRhOworI2VuZGlm CisJcnEtPmNsb2NrX3Rhc2sgKz0gZGVsdGE7Cit9CisKKyNpZm5kZWYgbnNlY3NfdG9fY3B1dGlt ZQorIyBkZWZpbmUgbnNlY3NfdG9fY3B1dGltZShfX25zZWNzKQluc2Vjc190b19qaWZmaWVzKF9f bnNlY3MpCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19JUlFfVElNRV9BQ0NPVU5USU5HCitzdGF0 aWMgdm9pZCBpcnF0aW1lX2FjY291bnRfaGlfc2kodm9pZCkKK3sKKwl1NjQgKmNwdXN0YXQgPSBr Y3B1c3RhdF90aGlzX2NwdS0+Y3B1c3RhdDsKKwl1NjQgbGF0ZXN0X25zOworCisJbGF0ZXN0X25z ID0gbnNlY3NfdG9fY3B1dGltZTY0KHRoaXNfY3B1X3JlYWQoY3B1X2hhcmRpcnFfdGltZSkpOwor CWlmIChsYXRlc3RfbnMgPiBjcHVzdGF0W0NQVVRJTUVfSVJRXSkKKwkJY3B1c3RhdFtDUFVUSU1F X0lSUV0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWVfb25lX2ppZmZ5OworCisJbGF0ZXN0X25zID0g bnNlY3NfdG9fY3B1dGltZTY0KHRoaXNfY3B1X3JlYWQoY3B1X3NvZnRpcnFfdGltZSkpOworCWlm IChsYXRlc3RfbnMgPiBjcHVzdGF0W0NQVVRJTUVfU09GVElSUV0pCisJCWNwdXN0YXRbQ1BVVElN RV9TT0ZUSVJRXSArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9vbmVfamlmZnk7Cit9CisjZWxzZSAv KiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyAqLworCisjZGVmaW5lIHNjaGVkX2Nsb2NrX2ly cXRpbWUJKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpcnF0aW1lX2FjY291bnRfaGlfc2kodm9p ZCkKK3sKK30KKyNlbmRpZiAvKiBDT05GSUdfSVJRX1RJTUVfQUNDT1VOVElORyAqLworCisvKgor ICogT24gZWFjaCB0aWNrLCBzZWUgd2hhdCBwZXJjZW50YWdlIG9mIHRoYXQgdGljayB3YXMgYXR0 cmlidXRlZCB0byBlYWNoCisgKiBjb21wb25lbnQgYW5kIGFkZCB0aGUgcGVyY2VudGFnZSB0byB0 aGUgX3BjIHZhbHVlcy4gT25jZSBhIF9wYyB2YWx1ZSBoYXMKKyAqIGFjY3VtdWxhdGVkIG9uZSB0 aWNrJ3Mgd29ydGgsIGFjY291bnQgZm9yIHRoYXQuIFRoaXMgbWVhbnMgdGhlIHRvdGFsCisgKiBw ZXJjZW50YWdlIG9mIGxvYWQgY29tcG9uZW50cyB3aWxsIGFsd2F5cyBiZSAxMjggKHBzZXVkbyAx MDApIHBlciB0aWNrLgorICovCitzdGF0aWMgdm9pZCBwY19pZGxlX3RpbWUoc3RydWN0IHJxICpy cSwgdW5zaWduZWQgbG9uZyBwYykKK3sKKwl1NjQgKmNwdXN0YXQgPSBrY3B1c3RhdF90aGlzX2Nw dS0+Y3B1c3RhdDsKKworCWlmIChhdG9taWNfcmVhZCgmcnEtPm5yX2lvd2FpdCkgPiAwKSB7CisJ CXJxLT5pb3dhaXRfcGMgKz0gcGM7CisJCWlmIChycS0+aW93YWl0X3BjID49IDEyOCkgeworCQkJ cnEtPmlvd2FpdF9wYyAlPSAxMjg7CisJCQljcHVzdGF0W0NQVVRJTUVfSU9XQUlUXSArPSAoX19m b3JjZSB1NjQpY3B1dGltZV9vbmVfamlmZnk7CisJCX0KKwl9IGVsc2UgeworCQlycS0+aWRsZV9w YyArPSBwYzsKKwkJaWYgKHJxLT5pZGxlX3BjID49IDEyOCkgeworCQkJcnEtPmlkbGVfcGMgJT0g MTI4OworCQkJY3B1c3RhdFtDUFVUSU1FX0lETEVdICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29u ZV9qaWZmeTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3BjX3N5c3RlbV90aW1lKHN0cnVj dCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGhhcmRpcnFfb2Zmc2V0LAorCQkg ICB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIG5zKQoreworCXU2NCAqY3B1c3RhdCA9 IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OworCWNwdXRpbWVfdCBvbmVfamlmZnlfc2NhbGVk ID0gY3B1dGltZV90b19zY2FsZWQoY3B1dGltZV9vbmVfamlmZnkpOworCisJcC0+c3RpbWVfcGMg Kz0gcGM7CisJaWYgKHAtPnN0aW1lX3BjID49IDEyOCkgeworCQlwLT5zdGltZV9wYyAlPSAxMjg7 CisJCXAtPnN0aW1lICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsKKwkJcC0+c3Rp bWVzY2FsZWQgKz0gb25lX2ppZmZ5X3NjYWxlZDsKKwkJYWNjdF91cGRhdGVfaW50ZWdyYWxzKHAp OworCX0KKwlwLT5zY2hlZF90aW1lICs9IG5zOworCisJaWYgKGhhcmRpcnFfY291bnQoKSAtIGhh cmRpcnFfb2Zmc2V0KSB7CisJCXJxLT5pcnFfcGMgKz0gcGM7CisJCWlmIChycS0+aXJxX3BjID49 IDEyOCkgeworCQkJcnEtPmlycV9wYyAlPSAxMjg7CisJCQljcHVzdGF0W0NQVVRJTUVfSVJRXSAr PSAoX19mb3JjZSB1NjQpY3B1dGltZV9vbmVfamlmZnk7CisJCX0KKwl9IGVsc2UgaWYgKGluX3Nl cnZpbmdfc29mdGlycSgpKSB7CisJCXJxLT5zb2Z0aXJxX3BjICs9IHBjOworCQlpZiAocnEtPnNv ZnRpcnFfcGMgPj0gMTI4KSB7CisJCQlycS0+c29mdGlycV9wYyAlPSAxMjg7CisJCQljcHVzdGF0 W0NQVVRJTUVfU09GVElSUV0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWVfb25lX2ppZmZ5OworCQl9 CisJfSBlbHNlIHsKKwkJcnEtPnN5c3RlbV9wYyArPSBwYzsKKwkJaWYgKHJxLT5zeXN0ZW1fcGMg Pj0gMTI4KSB7CisJCQlycS0+c3lzdGVtX3BjICU9IDEyODsKKwkJCWNwdXN0YXRbQ1BVVElNRV9T WVNURU1dICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsKKwkJfQorCX0KK30KKwor c3RhdGljIHZvaWQgcGNfdXNlcl90aW1lKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVj dCAqcCwKKwkJCSB1bnNpZ25lZCBsb25nIHBjLCB1bnNpZ25lZCBsb25nIG5zKQoreworCXU2NCAq Y3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OworCWNwdXRpbWVfdCBvbmVfamlm Znlfc2NhbGVkID0gY3B1dGltZV90b19zY2FsZWQoY3B1dGltZV9vbmVfamlmZnkpOworCisJcC0+ dXRpbWVfcGMgKz0gcGM7CisJaWYgKHAtPnV0aW1lX3BjID49IDEyOCkgeworCQlwLT51dGltZV9w YyAlPSAxMjg7CisJCXAtPnV0aW1lICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsK KwkJcC0+dXRpbWVzY2FsZWQgKz0gb25lX2ppZmZ5X3NjYWxlZDsKKwkJYWNjdF91cGRhdGVfaW50 ZWdyYWxzKHApOworCX0KKwlwLT5zY2hlZF90aW1lICs9IG5zOworCisJaWYgKHRoaXNfY3B1X2tz b2Z0aXJxZCgpID09IHApIHsKKwkJLyoKKwkJICoga3NvZnRpcnFkIHRpbWUgZG8gbm90IGdldCBh Y2NvdW50ZWQgaW4gY3B1X3NvZnRpcnFfdGltZS4KKwkJICogU28sIHdlIGhhdmUgdG8gaGFuZGxl IGl0IHNlcGFyYXRlbHkgaGVyZS4KKwkJICovCisJCXJxLT5zb2Z0aXJxX3BjICs9IHBjOworCQlp ZiAocnEtPnNvZnRpcnFfcGMgPj0gMTI4KSB7CisJCQlycS0+c29mdGlycV9wYyAlPSAxMjg7CisJ CQljcHVzdGF0W0NQVVRJTUVfU09GVElSUV0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWVfb25lX2pp ZmZ5OworCQl9CisJfQorCisJaWYgKFRBU0tfTklDRShwKSA+IDAgfHwgaWRsZXByaW9fdGFzayhw KSkgeworCQlycS0+bmljZV9wYyArPSBwYzsKKwkJaWYgKHJxLT5uaWNlX3BjID49IDEyOCkgewor CQkJcnEtPm5pY2VfcGMgJT0gMTI4OworCQkJY3B1c3RhdFtDUFVUSU1FX05JQ0VdICs9IChfX2Zv cmNlIHU2NCljcHV0aW1lX29uZV9qaWZmeTsKKwkJfQorCX0gZWxzZSB7CisJCXJxLT51c2VyX3Bj ICs9IHBjOworCQlpZiAocnEtPnVzZXJfcGMgPj0gMTI4KSB7CisJCQlycS0+dXNlcl9wYyAlPSAx Mjg7CisJCQljcHVzdGF0W0NQVVRJTUVfVVNFUl0gKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWVfb25l X2ppZmZ5OworCQl9CisJfQorfQorCisvKgorICogQ29udmVydCBuYW5vc2Vjb25kcyB0byBwc2V1 ZG8gcGVyY2VudGFnZSBvZiBvbmUgdGljay4gVXNlIDEyOCBmb3IgZmFzdAorICogc2hpZnRzIGlu c3RlYWQgb2YgMTAwCisgKi8KKyNkZWZpbmUgTlNfVE9fUEMoTlMpCShOUyAqIDEyOCAvIEpJRkZZ X05TKQorCisvKgorICogVGhpcyBpcyBjYWxsZWQgb24gY2xvY2sgdGlja3MgYW5kIG9uIGNvbnRl eHQgc3dpdGNoZXMuCisgKiBCYW5rIGluIHAtPnNjaGVkX3RpbWUgdGhlIG5zIGVsYXBzZWQgc2lu Y2UgdGhlIGxhc3QgdGljayBvciBzd2l0Y2guCisgKiBDUFUgc2NoZWR1bGVyIHF1b3RhIGFjY291 bnRpbmcgaXMgYWxzbyBwZXJmb3JtZWQgaGVyZSBpbiBtaWNyb3NlY29uZHMuCisgKi8KK3N0YXRp YyB2b2lkCit1cGRhdGVfY3B1X2Nsb2NrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVj dCAqcCkKK3sKKwlsb25nIGFjY291bnRfbnMgPSBycS0+Y2xvY2sgLSBycS0+dGltZWtlZXBfY2xv Y2s7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlID0gcnEtPmlkbGU7CisJdW5zaWduZWQgbG9u ZyBhY2NvdW50X3BjOworCWludCB1c2VyX3RpY2s7CisKKwlwLT5sYXN0X3JhbiA9IHJxLT5jbG9j azsKKworCWlmICh1bmxpa2VseShhY2NvdW50X25zIDwgMCkpCisJCWFjY291bnRfbnMgPSAwOwor CisJYWNjb3VudF9wYyA9IE5TX1RPX1BDKGFjY291bnRfbnMpOworCisJLyogQWNjdXJhdGUgdGlj ayB0aW1la2VlcGluZyAqLworCXJxLT5hY2NvdW50X3BjICs9IGFjY291bnRfcGMgLSAxMjg7CisJ aWYgKHJxLT5hY2NvdW50X3BjIDwgMCkgeworCQkvKgorCQkgKiBTbWFsbCBlcnJvcnMgaW4gbWlj cm8gYWNjb3VudGluZyBtYXkgbm90IG1ha2UgdGhlCisJCSAqIGFjY291bnRpbmcgYWRkIHVwIHRv IDEyOCBlYWNoIHRpY2sgc28gd2Uga2VlcCB0cmFjaworCQkgKiBvZiB0aGUgcGVyY2VudGFnZSBh bmQgcm91bmQgaXQgdXAgd2hlbiBsZXNzIHRoYW4gMTI4CisJCSAqLworCQlhY2NvdW50X3BjICs9 IC1ycS0+YWNjb3VudF9wYzsKKwkJcnEtPmFjY291bnRfcGMgPSAwOworCX0KKworCXVzZXJfdGlj ayA9IHVzZXJfbW9kZShnZXRfaXJxX3JlZ3MoKSk7CisKKwlpZiAodXNlcl90aWNrKQorCQlwY191 c2VyX3RpbWUocnEsIHAsIGFjY291bnRfcGMsIGFjY291bnRfbnMpOworCWVsc2UgaWYgKHAgIT0g aWRsZSB8fCAoaXJxX2NvdW50KCkgIT0gSEFSRElSUV9PRkZTRVQpKQorCQlwY19zeXN0ZW1fdGlt ZShycSwgcCwgSEFSRElSUV9PRkZTRVQsCisJCQkJICAgYWNjb3VudF9wYywgYWNjb3VudF9ucyk7 CisJZWxzZQorCQlwY19pZGxlX3RpbWUocnEsIGFjY291bnRfcGMpOworCisJaWYgKHNjaGVkX2Ns b2NrX2lycXRpbWUpCisJCWlycXRpbWVfYWNjb3VudF9oaV9zaSgpOworCisJLyogdGltZV9zbGlj ZSBhY2NvdW50aW5nIGlzIGRvbmUgaW4gdXNlY3MgdG8gYXZvaWQgb3ZlcmZsb3cgb24gMzJiaXQg Ki8KKwlpZiAocnEtPnJxX3BvbGljeSAhPSBTQ0hFRF9GSUZPICYmIHAgIT0gaWRsZSkgeworCQlz NjQgdGltZV9kaWZmID0gcnEtPmNsb2NrIC0gcnEtPnJxX2xhc3RfcmFuOworCisJCW5pZmZ5X2Rp ZmYoJnRpbWVfZGlmZiwgMSk7CisJCXAtPnRpbWVfc2xpY2UgLT0gTlNfVE9fVVModGltZV9kaWZm KTsKKwl9CisJcnEtPnJxX2xhc3RfcmFuID0gcnEtPnRpbWVrZWVwX2Nsb2NrID0gcnEtPmNsb2Nr OworfQorCisvKgorICogUmV0dXJuIGFueSBucyBvbiB0aGUgc2NoZWRfY2xvY2sgdGhhdCBoYXZl IG5vdCB5ZXQgYmVlbiBhY2NvdW50ZWQgaW4KKyAqIEBwIGluIGNhc2UgdGhhdCB0YXNrIGlzIGN1 cnJlbnRseSBydW5uaW5nLgorICoKKyAqIENhbGxlZCB3aXRoIHRhc2tfZ3JxX2xvY2soKSBoZWxk LgorICovCitzdGF0aWMgdTY0IGRvX3Rhc2tfZGVsdGFfZXhlYyhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnAsIHN0cnVjdCBycSAqcnEpCit7CisJdTY0IG5zID0gMDsKKworCWlmIChwID09IHJxLT5jdXJy KSB7CisJCW5zID0gcnEtPmNsb2NrX3Rhc2sgLSBycS0+cnFfbGFzdF9yYW47CisJCWlmICh1bmxp a2VseSgoczY0KW5zIDwgMCkpCisJCQlucyA9IDA7CisJfQorCisJcmV0dXJuIG5zOworfQorCit1 bnNpZ25lZCBsb25nIGxvbmcgdGFza19kZWx0YV9leGVjKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkK K3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBycSAqcnE7CisJdTY0IG5zOworCisJ cnEgPSB0YXNrX2dycV9sb2NrKHAsICZmbGFncyk7CisJbnMgPSBkb190YXNrX2RlbHRhX2V4ZWMo cCwgcnEpOworCXRhc2tfZ3JxX3VubG9jaygmZmxhZ3MpOworCisJcmV0dXJuIG5zOworfQorCisv KgorICogUmV0dXJuIGFjY291bnRlZCBydW50aW1lIGZvciB0aGUgdGFzay4KKyAqIEluIGNhc2Ug dGhlIHRhc2sgaXMgY3VycmVudGx5IHJ1bm5pbmcsIHJldHVybiB0aGUgcnVudGltZSBwbHVzIGN1 cnJlbnQncworICogcGVuZGluZyBydW50aW1lIHRoYXQgaGF2ZSBub3QgYmVlbiBhY2NvdW50ZWQg eWV0LgorICovCit1bnNpZ25lZCBsb25nIGxvbmcgdGFza19zY2hlZF9ydW50aW1lKHN0cnVjdCB0 YXNrX3N0cnVjdCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBycSAqcnE7 CisJdTY0IG5zOworCisJcnEgPSB0YXNrX2dycV9sb2NrKHAsICZmbGFncyk7CisJbnMgPSBwLT5z Y2hlZF90aW1lICsgZG9fdGFza19kZWx0YV9leGVjKHAsIHJxKTsKKwl0YXNrX2dycV91bmxvY2so JmZsYWdzKTsKKworCXJldHVybiBuczsKK30KKworLyogQ29tcGF0aWJpbGl0eSBjcmFwIGZvciBy ZW1vdmFsICovCit2b2lkIGFjY291bnRfdXNlcl90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwg Y3B1dGltZV90IGNwdXRpbWUsCisJCQkgICBjcHV0aW1lX3QgY3B1dGltZV9zY2FsZWQpCit7Cit9 CisKK3ZvaWQgYWNjb3VudF9pZGxlX3RpbWUoY3B1dGltZV90IGNwdXRpbWUpCit7Cit9CisKKy8q CisgKiBBY2NvdW50IGd1ZXN0IGNwdSB0aW1lIHRvIGEgcHJvY2Vzcy4KKyAqIEBwOiB0aGUgcHJv Y2VzcyB0aGF0IHRoZSBjcHUgdGltZSBnZXRzIGFjY291bnRlZCB0bworICogQGNwdXRpbWU6IHRo ZSBjcHUgdGltZSBzcGVudCBpbiB2aXJ0dWFsIG1hY2hpbmUgc2luY2UgdGhlIGxhc3QgdXBkYXRl CisgKiBAY3B1dGltZV9zY2FsZWQ6IGNwdXRpbWUgc2NhbGVkIGJ5IGNwdSBmcmVxdWVuY3kKKyAq Lworc3RhdGljIHZvaWQgYWNjb3VudF9ndWVzdF90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwg Y3B1dGltZV90IGNwdXRpbWUsCisJCQkJICAgY3B1dGltZV90IGNwdXRpbWVfc2NhbGVkKQorewor CXU2NCAqY3B1c3RhdCA9IGtjcHVzdGF0X3RoaXNfY3B1LT5jcHVzdGF0OworCisJLyogQWRkIGd1 ZXN0IHRpbWUgdG8gcHJvY2Vzcy4gKi8KKwlwLT51dGltZSArPSAoX19mb3JjZSB1NjQpY3B1dGlt ZTsKKwlwLT51dGltZXNjYWxlZCArPSAoX19mb3JjZSB1NjQpY3B1dGltZV9zY2FsZWQ7CisJcC0+ Z3RpbWUgKz0gKF9fZm9yY2UgdTY0KWNwdXRpbWU7CisKKwkvKiBBZGQgZ3Vlc3QgdGltZSB0byBj cHVzdGF0LiAqLworCWlmIChUQVNLX05JQ0UocCkgPiAwKSB7CisJCWNwdXN0YXRbQ1BVVElNRV9O SUNFXSArPSAoX19mb3JjZSB1NjQpY3B1dGltZTsKKwkJY3B1c3RhdFtDUFVUSU1FX0dVRVNUX05J Q0VdICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lOworCX0gZWxzZSB7CisJCWNwdXN0YXRbQ1BVVElN RV9VU0VSXSArPSAoX19mb3JjZSB1NjQpY3B1dGltZTsKKwkJY3B1c3RhdFtDUFVUSU1FX0dVRVNU XSArPSAoX19mb3JjZSB1NjQpY3B1dGltZTsKKwl9Cit9CisKKy8qCisgKiBBY2NvdW50IHN5c3Rl bSBjcHUgdGltZSB0byBhIHByb2Nlc3MgYW5kIGRlc2lyZWQgY3B1c3RhdCBmaWVsZAorICogQHA6 IHRoZSBwcm9jZXNzIHRoYXQgdGhlIGNwdSB0aW1lIGdldHMgYWNjb3VudGVkIHRvCisgKiBAY3B1 dGltZTogdGhlIGNwdSB0aW1lIHNwZW50IGluIGtlcm5lbCBzcGFjZSBzaW5jZSB0aGUgbGFzdCB1 cGRhdGUKKyAqIEBjcHV0aW1lX3NjYWxlZDogY3B1dGltZSBzY2FsZWQgYnkgY3B1IGZyZXF1ZW5j eQorICogQHRhcmdldF9jcHV0aW1lNjQ6IHBvaW50ZXIgdG8gY3B1c3RhdCBmaWVsZCB0aGF0IGhh cyB0byBiZSB1cGRhdGVkCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgX19hY2NvdW50X3N5c3Rl bV90aW1lKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1dGltZV90IGNwdXRpbWUsCisJCQljcHV0 aW1lX3QgY3B1dGltZV9zY2FsZWQsIGNwdXRpbWU2NF90ICp0YXJnZXRfY3B1dGltZTY0KQorewor CS8qIEFkZCBzeXN0ZW0gdGltZSB0byBwcm9jZXNzLiAqLworCXAtPnN0aW1lICs9IChfX2ZvcmNl IHU2NCljcHV0aW1lOworCXAtPnN0aW1lc2NhbGVkICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lX3Nj YWxlZDsKKworCS8qIEFkZCBzeXN0ZW0gdGltZSB0byBjcHVzdGF0LiAqLworCSp0YXJnZXRfY3B1 dGltZTY0ICs9IChfX2ZvcmNlIHU2NCljcHV0aW1lOworCisJLyogQWNjb3VudCBmb3Igc3lzdGVt IHRpbWUgdXNlZCAqLworCWFjY3RfdXBkYXRlX2ludGVncmFscyhwKTsKK30KKworLyoKKyAqIEFj Y291bnQgc3lzdGVtIGNwdSB0aW1lIHRvIGEgcHJvY2Vzcy4KKyAqIEBwOiB0aGUgcHJvY2VzcyB0 aGF0IHRoZSBjcHUgdGltZSBnZXRzIGFjY291bnRlZCB0bworICogQGhhcmRpcnFfb2Zmc2V0OiB0 aGUgb2Zmc2V0IHRvIHN1YnRyYWN0IGZyb20gaGFyZGlycV9jb3VudCgpCisgKiBAY3B1dGltZTog dGhlIGNwdSB0aW1lIHNwZW50IGluIGtlcm5lbCBzcGFjZSBzaW5jZSB0aGUgbGFzdCB1cGRhdGUK KyAqIEBjcHV0aW1lX3NjYWxlZDogY3B1dGltZSBzY2FsZWQgYnkgY3B1IGZyZXF1ZW5jeQorICog VGhpcyBpcyBmb3IgZ3Vlc3Qgb25seSBub3cuCisgKi8KK3ZvaWQgYWNjb3VudF9zeXN0ZW1fdGlt ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBoYXJkaXJxX29mZnNldCwKKwkJCSBjcHV0aW1l X3QgY3B1dGltZSwgY3B1dGltZV90IGNwdXRpbWVfc2NhbGVkKQoreworCisJaWYgKChwLT5mbGFn cyAmIFBGX1ZDUFUpICYmIChpcnFfY291bnQoKSAtIGhhcmRpcnFfb2Zmc2V0ID09IDApKQorCQlh Y2NvdW50X2d1ZXN0X3RpbWUocCwgY3B1dGltZSwgY3B1dGltZV9zY2FsZWQpOworfQorCisvKgor ICogQWNjb3VudCBmb3IgaW52b2x1bnRhcnkgd2FpdCB0aW1lLgorICogQHN0ZWFsOiB0aGUgY3B1 IHRpbWUgc3BlbnQgaW4gaW52b2x1bnRhcnkgd2FpdAorICovCit2b2lkIGFjY291bnRfc3RlYWxf dGltZShjcHV0aW1lX3QgY3B1dGltZSkKK3sKKwl1NjQgKmNwdXN0YXQgPSBrY3B1c3RhdF90aGlz X2NwdS0+Y3B1c3RhdDsKKworCWNwdXN0YXRbQ1BVVElNRV9TVEVBTF0gKz0gKF9fZm9yY2UgdTY0 KWNwdXRpbWU7Cit9CisKKy8qCisgKiBBY2NvdW50IGZvciBpZGxlIHRpbWUuCisgKiBAY3B1dGlt ZTogdGhlIGNwdSB0aW1lIHNwZW50IGluIGlkbGUgd2FpdAorICovCitzdGF0aWMgdm9pZCBhY2Nv dW50X2lkbGVfdGltZXMoY3B1dGltZV90IGNwdXRpbWUpCit7CisJdTY0ICpjcHVzdGF0ID0ga2Nw dXN0YXRfdGhpc19jcHUtPmNwdXN0YXQ7CisJc3RydWN0IHJxICpycSA9IHRoaXNfcnEoKTsKKwor CWlmIChhdG9taWNfcmVhZCgmcnEtPm5yX2lvd2FpdCkgPiAwKQorCQljcHVzdGF0W0NQVVRJTUVf SU9XQUlUXSArPSAoX19mb3JjZSB1NjQpY3B1dGltZTsKKwllbHNlCisJCWNwdXN0YXRbQ1BVVElN RV9JRExFXSArPSAoX19mb3JjZSB1NjQpY3B1dGltZTsKK30KKworI2lmbmRlZiBDT05GSUdfVklS VF9DUFVfQUNDT1VOVElORworCit2b2lkIGFjY291bnRfcHJvY2Vzc190aWNrKHN0cnVjdCB0YXNr X3N0cnVjdCAqcCwgaW50IHVzZXJfdGljaykKK3sKK30KKworLyoKKyAqIEFjY291bnQgbXVsdGlw bGUgdGlja3Mgb2Ygc3RlYWwgdGltZS4KKyAqIEBwOiB0aGUgcHJvY2VzcyBmcm9tIHdoaWNoIHRo ZSBjcHUgdGltZSBoYXMgYmVlbiBzdG9sZW4KKyAqIEB0aWNrczogbnVtYmVyIG9mIHN0b2xlbiB0 aWNrcworICovCit2b2lkIGFjY291bnRfc3RlYWxfdGlja3ModW5zaWduZWQgbG9uZyB0aWNrcykK K3sKKwlhY2NvdW50X3N0ZWFsX3RpbWUoamlmZmllc190b19jcHV0aW1lKHRpY2tzKSk7Cit9CisK Ky8qCisgKiBBY2NvdW50IG11bHRpcGxlIHRpY2tzIG9mIGlkbGUgdGltZS4KKyAqIEB0aWNrczog bnVtYmVyIG9mIHN0b2xlbiB0aWNrcworICovCit2b2lkIGFjY291bnRfaWRsZV90aWNrcyh1bnNp Z25lZCBsb25nIHRpY2tzKQoreworCWFjY291bnRfaWRsZV90aW1lcyhqaWZmaWVzX3RvX2NwdXRp bWUodGlja3MpKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIG1hbmFnZXMgdGFza3MgdGhhdCBoYXZl IHJ1biBvdXQgb2YgdGltZXNsaWNlIGR1cmluZyBhIHNjaGVkdWxlcl90aWNrICovCisvKiDlvZPl iY3pmJ/liJfml7bpkp/nmoTmjqfliLYgKi8KK3N0YXRpYyB2b2lkIHRhc2tfcnVubmluZ190aWNr KHN0cnVjdCBycSAqcnEpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwOworCXAgPSBycS0+Y3Vy cjsKKworCS8qIFNDSEVEX0ZJRk8gdGFza3MgbmV2ZXIgcnVuIG91dCBvZiB0aW1lc2xpY2UuICov CisJaWYgKHJxLT5ycV9wb2xpY3kgPT0gU0NIRURfRklGTykKKwkJcmV0dXJuOworCWlmKHAtPnRp Y2tfdXNlZCA8PSBNQVhfVElDS19VU0VEKQorCQlwLT50aWNrX3VzZWQrKzsKKwlpZiAocC0+dGlt ZV9zbGljZSA+IFJFU0NIRURfVVMpCisJCXJldHVybjsKKworCS8qIHRpbWVfc2xpY2UgZXhwaXJl ZC4gR3JxIGxvY2tlZCAqLworCWdycV9sb2NrKCk7CisJcmVxdWV1ZV90YXNrKHApOworCXNldF90 c2tfbmVlZF9yZXNjaGVkKHApOworCWdycV91bmxvY2soKTsKK30KKwordm9pZCB3YWtlX3VwX2lk bGVfY3B1KGludCBjcHUpOworCisvKgorICogVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBieSB0 aGUgdGltZXIgY29kZSwgd2l0aCBIWiBmcmVxdWVuY3kuCisgKiBXZSBjYWxsIGl0IHdpdGggaW50 ZXJydXB0cyBkaXNhYmxlZC4gVGhlIGRhdGEgbW9kaWZpZWQgaXMgYWxsCisgKiBsb2NhbCB0byBz dHJ1Y3QgcnEgc28gd2UgZG9uJ3QgbmVlZCB0byBncmFiIGdycSBsb2NrLgorICovCit2b2lkIHNj aGVkdWxlcl90aWNrKHZvaWQpCit7CisJaW50IGNwdSBfX21heWJlX3VudXNlZCA9IHNtcF9wcm9j ZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CisKKwlzY2hlZF9jbG9j a190aWNrKCk7CisJLyogZ3JxIGxvY2sgbm90IGdyYWJiZWQsIHNvIG9ubHkgdXBkYXRlIHJxIGNs b2NrICovCisJdXBkYXRlX3JxX2Nsb2NrKHJxKTsKKwl1cGRhdGVfY3B1X2Nsb2NrKHJxLCBycS0+ Y3Vycik7CisJaWYgKCFycV9pZGxlKHJxKSkKKwkJdGFza19ydW5uaW5nX3RpY2socnEpOworCXBl cmZfZXZlbnRfdGFza190aWNrKCk7Cit9CisKK25vdHJhY2UgdW5zaWduZWQgbG9uZyBnZXRfcGFy ZW50X2lwKHVuc2lnbmVkIGxvbmcgYWRkcikKK3sKKwlpZiAoaW5fbG9ja19mdW5jdGlvbnMoYWRk cikpIHsKKwkJYWRkciA9IENBTExFUl9BRERSMjsKKwkJaWYgKGluX2xvY2tfZnVuY3Rpb25zKGFk ZHIpKQorCQkJYWRkciA9IENBTExFUl9BRERSMzsKKwl9CisJcmV0dXJuIGFkZHI7Cit9CisKKyNp ZiBkZWZpbmVkKENPTkZJR19QUkVFTVBUKSAmJiAoZGVmaW5lZChDT05GSUdfREVCVUdfUFJFRU1Q VCkgfHwgXAorCQkJCWRlZmluZWQoQ09ORklHX1BSRUVNUFRfVFJBQ0VSKSkKK3ZvaWQgX19rcHJv YmVzIGFkZF9wcmVlbXB0X2NvdW50KGludCB2YWwpCit7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BS RUVNUFQKKwkvKgorCSAqIFVuZGVyZmxvdz8KKwkgKi8KKwlpZiAoREVCVUdfTE9DS1NfV0FSTl9P TigocHJlZW1wdF9jb3VudCgpIDwgMCkpKQorCQlyZXR1cm47CisjZW5kaWYKKwlwcmVlbXB0X2Nv dW50KCkgKz0gdmFsOworI2lmZGVmIENPTkZJR19ERUJVR19QUkVFTVBUCisJLyoKKwkgKiBTcGlu bG9jayBjb3VudCBvdmVyZmxvd2luZyBzb29uPworCSAqLworCURFQlVHX0xPQ0tTX1dBUk5fT04o KHByZWVtcHRfY291bnQoKSAmIFBSRUVNUFRfTUFTSykgPj0KKwkJCQlQUkVFTVBUX01BU0sgLSAx MCk7CisjZW5kaWYKKwlpZiAocHJlZW1wdF9jb3VudCgpID09IHZhbCkKKwkJdHJhY2VfcHJlZW1w dF9vZmYoQ0FMTEVSX0FERFIwLCBnZXRfcGFyZW50X2lwKENBTExFUl9BRERSMSkpOworfQorRVhQ T1JUX1NZTUJPTChhZGRfcHJlZW1wdF9jb3VudCk7CisKK3ZvaWQgX19rcHJvYmVzIHN1Yl9wcmVl bXB0X2NvdW50KGludCB2YWwpCit7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BSRUVNUFQKKwkvKgor CSAqIFVuZGVyZmxvdz8KKwkgKi8KKwlpZiAoREVCVUdfTE9DS1NfV0FSTl9PTih2YWwgPiBwcmVl bXB0X2NvdW50KCkpKQorCQlyZXR1cm47CisJLyoKKwkgKiBJcyB0aGUgc3BpbmxvY2sgcG9ydGlv biB1bmRlcmZsb3dpbmc/CisJICovCisJaWYgKERFQlVHX0xPQ0tTX1dBUk5fT04oKHZhbCA8IFBS RUVNUFRfTUFTSykgJiYKKwkJCSEocHJlZW1wdF9jb3VudCgpICYgUFJFRU1QVF9NQVNLKSkpCisJ CXJldHVybjsKKyNlbmRpZgorCisJaWYgKHByZWVtcHRfY291bnQoKSA9PSB2YWwpCisJCXRyYWNl X3ByZWVtcHRfb24oQ0FMTEVSX0FERFIwLCBnZXRfcGFyZW50X2lwKENBTExFUl9BRERSMSkpOwor CXByZWVtcHRfY291bnQoKSAtPSB2YWw7Cit9CitFWFBPUlRfU1lNQk9MKHN1Yl9wcmVlbXB0X2Nv dW50KTsKKyNlbmRpZgorCisjZGVmaW5lIHByaW9fcmFpc2FibGUocCkgKAlcCisJcC0+cHJpbyA+ ICgocC0+c3RhdGljX3ByaW8gLSByZXZlcnNlKE1BWF9USUNLX1VTRUQsIHAtPnRpY2tfdXNlZCkp ICsgXAorCQkJKHAtPnNsZWVwX2NudCAvIDMpKSkKKworLyoKKyAqIFRpbWVzbGljZXMgYmVsb3cg UkVTQ0hFRF9VUyBhcmUgY29uc2lkZXJlZCBhcyBnb29kIGFzIGV4cGlyZWQgYXMgdGhlcmUncyBu bworICogcG9pbnQgcmVzY2hlZHVsaW5nIHdoZW4gdGhlcmUncyBzbyBsaXR0bGUgdGltZSBsZWZ0 LiBTQ0hFRF9CQVRDSCB0YXNrcworICogaGF2ZSBiZWVuIGZsYWdnZWQgYmUgbm90IGxhdGVuY3kg c2Vuc2l0aXZlIGFuZCBsaWtlbHkgdG8gYmUgZnVsbHkgQ1BVCisgKiBib3VuZCBzbyBldmVyeSB0 aW1lIHRoZXkncmUgcmVzY2hlZHVsZWQgdGhleSBoYXZlIHRoZWlyIHRpbWVfc2xpY2UKKyAqIHJl ZmlsbGVkLgorICovCitzdGF0aWMgaW5saW5lIGJvb2wgY2hlY2tfdGltZXNsaWNlX2VuZChzdHJ1 Y3QgcnEgKnJxLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJdTY0IHNsZWVwX2ppZmZ5ID0g amlmZmllc182NDsKKwlib29sIHByZWVtcHQgPSBmYWxzZTsKKwlpZiAocC0+cG9saWN5ID09IFND SEVEX0ZJRk8pCisJCWdvdG8gb3V0OworCWlmIChwLT50aW1lX3NsaWNlIDwgUkVTQ0hFRF9VUyB8 fCBiYXRjaF90YXNrKHApKSB7CisJCWlmKHAtPnByaW8gPiBNQVhfUlRfUFJJTykgeworCQkJcC0+ cHJpbysrOworCQkJaWYocC0+cHJpbyA+PSBJRExFX1BSSU8pIHsKKwkJCQlwLT5wcmlvID0gcC0+ c3RhdGljX3ByaW8gKyA1OworCQkJCWlmKHAtPnByaW8gPj0gSURMRV9QUklPKQorCQkJCQlwLT5w cmlvID0gcC0+c3RhdGljX3ByaW87CisJCQl9CisJCX0KKwkJZ2V0X3RpbWVfc2xpY2UocCk7CisJ fSBlbHNlIGlmKHAtPnBvbGljeSAhPSBTQ0hFRF9SUikgeworCQlpZihwLT5zdGF0ZSAhPSBUQVNL X1JVTk5JTkcpIHsKKwkJCWlmKHAtPnByaW8gPiBOT1JNQUxfUFJJTykgeworCQkJCWlmKHAtPnNs ZWVwX2NudCA8IE1BWF9TTEVFUF9DT1VOVCkgCisJCQkJCXAtPnNsZWVwX2NudCsrOworCQkJCWlm KHByaW9fcmFpc2FibGUocCkpIAorCQkJCQlwLT5wcmlvLS07CisJCQkJaWYoc2xlZXBfamlmZnkg IT0gcC0+c2xlZXBfamlmZnkpIAorCQkJCQlwLT5zbGVlcF9jbnQgLz0gMjsKKwkJCQlwLT5zbGVl cF9qaWZmeSA9IHNsZWVwX2ppZmZ5OworCQkJfQorCQl9IGVsc2UgeworCQkJcHJlZW1wdCA9IHRy dWU7CisJCX0KKwl9CisJaWYoKHAtPnN0YXRlICE9IFRBU0tfUlVOTklORykgfHwgKHAtPnRpY2tf dXNlZCA+PSBNQVhfVElDS19VU0VEKSkgeworCQlwLT50aWNrX3VzZWQgLz0gMjsKKwl9CitvdXQ6 CisJcmV0dXJuIHByZWVtcHQ7Cit9CisKKyNkZWZpbmUgQklUT1BfV09SRChucikJCSgobnIpIC8g QklUU19QRVJfTE9ORykKKworCisvKgorICog5pyA5L2O5L2N5p+l5om+77yM5p+l5om+5pyA6auY 5LyY5YWI57qn5byA5aeL44CCCisgKiBGaW5kIHRoZSBsb3dlc3QgYml0IHNldCBpbiB0aGUgYml0 bWFwLldlIHdvdWxkIGZpbmQgdGhlIGhpZ2hlc3QgcHJpb3JpdHkgZmlyc3QvCisgKi8KK3N0YXRp YyBpbmxpbmUgdW5zaWduZWQgbG9uZworZ2V0X3ByaW9fYml0KHVuc2lnbmVkIGxvbmcgKmFkZHIs IHVuc2lnbmVkIGxvbmcgb2Zmc2V0KQoreworCXVuc2lnbmVkIGxvbmcgKmZyb20gPSBhZGRyICsg KG9mZnNldCAvIEJJVFNfUEVSX0xPTkcpOworCXVuc2lnbmVkIGxvbmcgKmxpbWl0ID0gYWRkciAr IFBSSU9fTElNSVQgLyBCSVRTX1BFUl9MT05HOworCWludCBpID0gb2Zmc2V0ICUgQklUU19QRVJf TE9ORzsKKwkKKwlpZiAob2Zmc2V0ID49ICBQUklPX0xJTUlUKQorCQlyZXR1cm4gUFJJT19MSU1J VDsKKworCWZvcig7ZnJvbSAhPSAobGltaXQpO2Zyb20rKykgeworCQlmb3IoO2kgPCBCSVRTX1BF Ul9MT05HO2krKywgb2Zmc2V0KyspIHsKKwkJCWlmKCgoKmZyb20gPj4gaSkgJiAweDEpKSB7CisJ CQkJZ290byBvdXQ7CisJCQl9CisJCX0KKwkJCisJCS8qCisJCSAqICBUaGlzIGNhbiBtYWtlIHN1 cmUgdG8gZ2VuZXJhdGUgdGhlIGJlc3QgbWFjaGluZSBjb2RlLgorCQkgKi8KKwkJaSA9IDA7CisJ fQorb3V0OgorCXJldHVybiBvZmZzZXQ7Cit9CisKKy8qCisgKiBUaGUgY3VycmVudGx5IHJ1bm5p bmcgdGFzaydzIGluZm9ybWF0aW9uIGlzIGFsbCBzdG9yZWQgaW4gcnEgbG9jYWwgZGF0YQorICog d2hpY2ggaXMgb25seSBtb2RpZmllZCBieSB0aGUgbG9jYWwgQ1BVLCB0aGVyZWJ5IGFsbG93aW5n IHRoZSBkYXRhIHRvIGJlCisgKiBjaGFuZ2VkIHdpdGhvdXQgZ3JhYmJpbmcgdGhlIGdycSBsb2Nr LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X3JxX3Rhc2soc3RydWN0IHJxICpycSwgc3Ry dWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJxLT5ycV9sYXN0X3JhbiA9IHAtPmxhc3RfcmFuID0g cnEtPmNsb2NrOworCXJxLT5ycV9wb2xpY3kgPSBwLT5wb2xpY3k7CisJcnEtPnJxX3ByaW8gPSBw LT5wcmlvOworCWlmIChwICE9IHJxLT5pZGxlKQorCQlycS0+cnFfcnVubmluZyA9IHRydWU7CisJ ZWxzZQorCQlycS0+cnFfcnVubmluZyA9IGZhbHNlOworfQorCitzdGF0aWMgdm9pZCByZXNldF9y cV90YXNrKHN0cnVjdCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwlycS0+cnFf cG9saWN5ID0gcC0+cG9saWN5OworCXJxLT5ycV9wcmlvID0gcC0+cHJpbzsKK30KKworc3RhdGlj IGlubGluZSB2b2lkIG9wZXJhdGVfYmxrX25lZWRzX2ZsdXNoX3BsdWcoc3RydWN0IHRhc2tfc3Ry dWN0ICpwKQoreworCWdycV91bmxvY2tfaXJxKCk7CisJc2NoZWRfcHJlZW1wdF9lbmFibGVfbm9f cmVzY2hlZCgpOworCWJsa19zY2hlZHVsZV9mbHVzaF9wbHVnKHApOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgdGFza19zd2l0Y2goc3RydWN0IHJxICpycSwgc3RydWN0IHRhc2tfc3RydWN0ICpw cmV2LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisJLyoKKwkgKiBEb24ndCBzdGljayB0 YXNrcyB3aGVuIGEgcmVhbCB0aW1lIHRhc2sgaXMgZ29pbmcgdG8gcnVuIGFzCisJICogdGhleSBt YXkgbGl0ZXJhbGx5IGdldCBzdHVjay4KKwkgKi8KKwlpZiAocnRfdGFzayhuZXh0KSkKKwkJdW5z dGlja190YXNrKHJxLCBwcmV2KTsKKwlzZXRfcnFfdGFzayhycSwgbmV4dCk7CisJZ3JxLm5yX3N3 aXRjaGVzKys7CisJcHJldi0+b25fY3B1ID0gZmFsc2U7CisJbmV4dC0+b25fY3B1ID0gdHJ1ZTsK KwlycS0+Y3VyciA9IG5leHQ7CisKKwkvKgorCSAqIFRoZSBjb250ZXh0IHN3aXRjaCBoYXZlIGZs aXBwZWQgdGhlIHN0YWNrIGZyb20gdW5kZXIgdXMKKwkgKiBhbmQgcmVzdG9yZWQgdGhlIGxvY2Fs IHZhcmlhYmxlcyB3aGljaCB3ZXJlIHNhdmVkIHdoZW4KKwkgKiB0aGlzIHRhc2sgY2FsbGVkIHNj aGVkdWxlKCkgaW4gdGhlIHBhc3QuIHByZXYgPT0gY3VycmVudAorCSAqIGlzIHN0aWxsIGNvcnJl Y3QsIGJ1dCBpdCBjYW4gYmUgbW92ZWQgdG8gYW5vdGhlciBjcHUvcnEuCisJICovCisJY29udGV4 dF9zd2l0Y2gocnEsIHByZXYsIG5leHQpOyAvKiB1bmxvY2tzIHRoZSBncnEgKi8KK30KKworCisv KgorICogTW92ZSBhIHRhc2sgb2ZmIHRoZSBnbG9iYWwgcXVldWUgYW5kIHRha2UgaXQgdG8gYSBj cHUgZm9yIGl0IHdpbGwKKyAqIGJlY29tZSB0aGUgcnVubmluZyB0YXNrLgorICovCitzdGF0aWMg aW5saW5lIHZvaWQgdGFrZV90YXNrKGludCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sK KwlzZXRfdGFza19jcHUocCwgY3B1KTsKKwlkZXF1ZXVlX3Rhc2socCk7CisJY2xlYXJfc3RpY2t5 KHApOworCWRlY19xbnIoKTsKK30KKworLyoKKyAqIFB1dCB0aGUgZGVzY2hlZHVsaW5nIHRhc2sg YmFjayB0byBncnEuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBwdXRfcHJldl90YXNrKHN0cnVj dCBycSAqcnEsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgYm9vbCBkZWFjdGl2YXRlLCBib29sIHBy ZWVtcHQpCit7CisJaWYoZGVhY3RpdmF0ZSkKKwkJZGVhY3RpdmF0ZV90YXNrKHApOworCWVsc2Ug eworCQlpbmNfcW5yKCk7CisJCWlmKHByZWVtcHQpCisJCQllbnF1ZXVlX3Rhc2tfaGVhZChwKTsK KwkJZWxzZQorCQkJZW5xdWV1ZV90YXNrKHApOworCX0KK30KKworLyoKKyAqIFRhc2sgcGlja2lu ZyBmb3IgbmV4dCB0aW1lIHRvIHJ1bi4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3QKK3Rhc2tf c3RydWN0ICpnZXRfcnVubmFibGVfdGFzayhzdHJ1Y3QgcnEgKnJxLCBpbnQgY3B1LCBzdHJ1Y3Qg dGFza19zdHJ1Y3QgKmlkbGUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICplZHQgPSBOVUxMOwor CXVuc2lnbmVkIGxvbmcgaWR4ID0gLTE7CisKKwlkbyB7CisJCXN0cnVjdCBsaXN0X2hlYWQgKnF1 ZXVlOworCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7CisKKwkJaWR4ID0gZ2V0X3ByaW9fYml0KGdy cS5wcmlvX2JpdG1hcCwgKytpZHgpOworCQlpZiAoaWR4ID49IFBSSU9fTElNSVQpCisJCQlyZXR1 cm4gaWRsZTsKKwkJcXVldWUgPSBncnEucXVldWUgKyBpZHg7CisKKwkJbGlzdF9mb3JfZWFjaF9l bnRyeShwLCBxdWV1ZSwgcnVuX2xpc3QpIHsKKwkJCS8qIE1ha2Ugc3VyZSBjcHUgYWZmaW5pdHkg aXMgb2sgKi8KKwkJCWlmIChuZWVkc19vdGhlcl9jcHUocCwgY3B1KSkKKwkJCQljb250aW51ZTsK KwkJCWVkdCA9IHA7CisJCQlnb3RvIG91dF90YWtlOworCQl9CisJfSB3aGlsZSAoIWVkdCk7CisK K291dF90YWtlOgorCXRha2VfdGFzayhjcHUsIGVkdCk7CisJcmV0dXJuIGVkdDsKK30KKworI2Rl ZmluZSBTQ0hFRF9SRVNDSEVEIC0xCisKKy8qCisgKiBzY2hlZHVsZSgpIGlzIHRoZSBtYWluIHNj aGVkdWxlciBmdW5jdGlvbi4KKyAqLworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfc2xlZXBfb25f d3EoaW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWludCBkZWFjdGl2YXRlOwor CWRlYWN0aXZhdGUgPSAwOworCWlmIChwLT5zdGF0ZSAmJiAhKHByZWVtcHRfY291bnQoKSAmIFBS RUVNUFRfQUNUSVZFKSkgeworCQlpZiAodW5saWtlbHkoc2lnbmFsX3BlbmRpbmdfc3RhdGUocC0+ c3RhdGUsIHApKSkgeworCQkJcC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisJCX0gZWxzZSB7CisJ CQlkZWFjdGl2YXRlID0gMTsKKwkJCS8qCisJCQkgKiBJZiBhIHdvcmtlciBpcyBnb2luZyB0byBz bGVlcCwgbm90aWZ5IGFuZAorCQkJICogYXNrIHdvcmtxdWV1ZSB3aGV0aGVyIGl0IHdhbnRzIHRv IHdha2UgdXAgYQorCQkJICogdGFzayB0byBtYWludGFpbiBjb25jdXJyZW5jeS4gIElmIHNvLCB3 YWtlCisJCQkgKiB1cCB0aGUgdGFzay4KKwkJCSAqLworCQkJaWYgKHAtPmZsYWdzICYgUEZfV1Ff V09SS0VSKSB7CisJCQkJc3RydWN0IHRhc2tfc3RydWN0ICp0b193YWtldXA7CisKKwkJCQl0b193 YWtldXAgPSB3cV93b3JrZXJfc2xlZXBpbmcocCwgY3B1KTsKKwkJCQlpZiAodG9fd2FrZXVwKSB7 CisJCQkJCS8qIFRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGRvZXMgKi8KKwkJCQkJaWYgKHVu bGlrZWx5KHRvX3dha2V1cCA9PSBwKSkKKwkJCQkJCWRlYWN0aXZhdGUgPSAwOworCQkJCQllbHNl CisJCQkJCQl0cnlfdG9fd2FrZV91cF9sb2NhbCh0b193YWtldXApOworCQkJCX0KKwkJCX0KKwor CQkJLyoKKwkJCSAqIElmIHdlIGFyZSBnb2luZyB0byBzbGVlcCBhbmQgd2UgaGF2ZSBwbHVnZ2Vk IElPIHF1ZXVlZCwgbWFrZQorCQkJICogc3VyZSB0byBzdWJtaXQgaXQgdG8gYXZvaWQgZGVhZGxv Y2tzLgorCQkJICovCisJCQlpZiAodW5saWtlbHkoZGVhY3RpdmF0ZSAmJiBibGtfbmVlZHNfZmx1 c2hfcGx1ZyhwKSkpIHsKKwkJCQlvcGVyYXRlX2Jsa19uZWVkc19mbHVzaF9wbHVnKHApOworCQkJ CWRlYWN0aXZhdGUgPSBTQ0hFRF9SRVNDSEVEOworCQkJCWdvdG8gb3V0OworCQkJfQorCQl9CisJ fQorb3V0OgorCXJldHVybiBkZWFjdGl2YXRlOworfQorCitzdGF0aWMgaW5saW5lIGludCBkb19z Y2hlZHVsZSh2b2lkKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwgKm5leHQsICppZGxl OworCXN0cnVjdCBycSAqcnE7CisJaW50IGNwdTsKKwlpbnQgZGVhY3RpdmF0ZTsKKworCWNwdSA9 IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlycSA9IGNwdV9ycShjcHUpOworCXJjdV9ub3RlX2NvbnRl eHRfc3dpdGNoKGNwdSk7CisJcHJldiA9IHJxLT5jdXJyOworCisJZ3JxX2xvY2tfaXJxKCk7CisK KwlpZigoZGVhY3RpdmF0ZSA9IGNoZWNrX3NsZWVwX29uX3dxKGNwdSwgcHJldikpID09IFNDSEVE X1JFU0NIRUQpIHsKKwkJZ290byBvdXQ7CisJfQorCisJY2xlYXJfdHNrX25lZWRfcmVzY2hlZChw cmV2KTsKKworCWlkbGUgPSBycS0+aWRsZTsKKwlpZiAoaWRsZSAhPSBwcmV2KSB7CisJCWJvb2wg cHJlZW1wdCA9IGNoZWNrX3RpbWVzbGljZV9lbmQocnEsIHByZXYpOworCisJCS8qIFRhc2sgY2hh bmdlZCBhZmZpbml0eSBvZmYgdGhpcyBDUFUgKi8KKwkJaWYgKG5lZWRzX290aGVyX2NwdShwcmV2 LCBjcHUpKQorCQkJcmVzY2hlZF9zdWl0YWJsZV9pZGxlKHByZXYpOworCQllbHNlIGlmICghZGVh Y3RpdmF0ZSkgeworCQkJaWYgKCFxdWV1ZWRfbm90cnVubmluZygpKSB7CisJCQkJLyoKKwkJCQkq IFJlcnVuIHRoZSBwcmV2IHRhc2sgYWdhaW4uCisJCQkJKi8KKwkJCQlzZXRfcnFfdGFzayhycSwg cHJldik7CisJCQkJZ3JxX3VubG9ja19pcnEoKTsKKwkJCQlnb3RvIG91dDsKKwkJCX0gZWxzZQor CQkJCXN3YXBfc3RpY2t5KHJxLCBjcHUsIHByZXYpOworCQl9CisKKwkJcHV0X3ByZXZfdGFzayhy cSwgcHJldiwgZGVhY3RpdmF0ZSwgcHJlZW1wdCk7CisJfQorCisJaWYgKHVubGlrZWx5KCFxdWV1 ZWRfbm90cnVubmluZygpKSkgeworCQkvKgorCQkgKiBUaGlzIENQVSBpcyBub3cgdHJ1bHkgaWRs ZSBhcyBvcHBvc2VkIHRvIHdoZW4gaWRsZSBpcworCQkgKiBzY2hlZHVsZWQgYXMgYSBoaWdoIHBy aW9yaXR5IHRhc2sgaW4gaXRzIG93biByaWdodC4KKwkJICovCisJCW5leHQgPSBpZGxlOworCQlz ZXRfY3B1aWRsZV9tYXAoY3B1KTsKKwl9IGVsc2UgeworCQluZXh0ID0gZ2V0X3J1bm5hYmxlX3Rh c2socnEsIGNwdSwgaWRsZSk7CisJfQorCisJaWYgKGxpa2VseShwcmV2ICE9IG5leHQpKSB7CisJ CXByZXYtPm52Y3N3Kys7CisJCWdycS5ucl9zd2l0Y2hlcysrOworCisJCXRhc2tfc3dpdGNoKHJx LCBwcmV2LCBuZXh0KTsKKwkJaWRsZSA9IHJxLT5pZGxlOworCX0gZWxzZQorCQlncnFfdW5sb2Nr X2lycSgpOworCitvdXQ6CisJcmV0dXJuIGRlYWN0aXZhdGU7Cit9CisKK2FzbWxpbmthZ2Ugdm9p ZCBfX3NjaGVkIHNjaGVkdWxlKHZvaWQpCit7CityZXNjaGVkdWxlOgorCQlwcmVlbXB0X2Rpc2Fi bGUoKTsKKwkJCisJCWlmKGRvX3NjaGVkdWxlKCkgPT0gU0NIRURfUkVTQ0hFRCkKKwkJCWdvdG8g cmVzY2hlZHVsZTsKKwkJCisJCXNjaGVkX3ByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwkJ aWYodW5saWtlbHkobmVlZF9yZXNjaGVkKCkpKQorCQkJZ290byByZXNjaGVkdWxlOworfQorRVhQ T1JUX1NZTUJPTChzY2hlZHVsZSk7CisKKy8qKgorICogc2NoZWR1bGVfcHJlZW1wdF9kaXNhYmxl ZCAtIGNhbGxlZCB3aXRoIHByZWVtcHRpb24gZGlzYWJsZWQKKyAqCisgKiBSZXR1cm5zIHdpdGgg cHJlZW1wdGlvbiBkaXNhYmxlZC4gTm90ZTogcHJlZW1wdF9jb3VudCBtdXN0IGJlIDEKKyAqLwor dm9pZCBfX3NjaGVkIHNjaGVkdWxlX3ByZWVtcHRfZGlzYWJsZWQodm9pZCkKK3sKKwlzY2hlZF9w cmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkKCk7CisJc2NoZWR1bGUoKTsKKwlwcmVlbXB0X2Rpc2Fi bGUoKTsKK30KKworI2lmZGVmIENPTkZJR19NVVRFWF9TUElOX09OX09XTkVSCisKK3N0YXRpYyBp bmxpbmUgYm9vbCBvd25lcl9ydW5uaW5nKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IHRhc2tf c3RydWN0ICpvd25lcikKK3sKKwlpZiAobG9jay0+b3duZXIgIT0gb3duZXIpCisJCXJldHVybiBm YWxzZTsKKworCS8qCisJICogRW5zdXJlIHdlIGVtaXQgdGhlIG93bmVyLT5vbl9jcHUsIGRlcmVm ZXJlbmNlIF9hZnRlcl8gY2hlY2tpbmcKKwkgKiBsb2NrLT5vd25lciBzdGlsbCBtYXRjaGVzIG93 bmVyLCBpZiB0aGF0IGZhaWxzLCBvd25lciBtaWdodAorCSAqIHBvaW50IHRvIGZyZWUoKWQgbWVt b3J5LCBpZiBpdCBzdGlsbCBtYXRjaGVzLCB0aGUgcmN1X3JlYWRfbG9jaygpCisJICogZW5zdXJl cyB0aGUgbWVtb3J5IHN0YXlzIHZhbGlkLgorCSAqLworCWJhcnJpZXIoKTsKKworCXJldHVybiBv d25lci0+b25fY3B1OworfQorCisvKgorICogTG9vayBvdXQhICJvd25lciIgaXMgYW4gZW50aXJl bHkgc3BlY3VsYXRpdmUgcG9pbnRlcgorICogYWNjZXNzIGFuZCBub3QgcmVsaWFibGUuCisgKi8K K2ludCBtdXRleF9zcGluX29uX293bmVyKHN0cnVjdCBtdXRleCAqbG9jaywgc3RydWN0IHRhc2tf c3RydWN0ICpvd25lcikKK3sKKwlyY3VfcmVhZF9sb2NrKCk7CisJd2hpbGUgKG93bmVyX3J1bm5p bmcobG9jaywgb3duZXIpKSB7CisJCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJCWJyZWFrOworCisJ CWFyY2hfbXV0ZXhfY3B1X3JlbGF4KCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJLyoK KwkgKiBXZSBicmVhayBvdXQgdGhlIGxvb3AgYWJvdmUgb24gbmVlZF9yZXNjaGVkKCkgYW5kIHdo ZW4gdGhlCisJICogb3duZXIgY2hhbmdlZCwgd2hpY2ggaXMgYSBzaWduIGZvciBoZWF2eSBjb250 ZW50aW9uLiBSZXR1cm4KKwkgKiBzdWNjZXNzIG9ubHkgd2hlbiBsb2NrLT5vd25lciBpcyBOVUxM LgorCSAqLworCXJldHVybiBsb2NrLT5vd25lciA9PSBOVUxMOworfQorI2VuZGlmCisKKyNpZmRl ZiBDT05GSUdfUFJFRU1QVAorLyoKKyAqIHRoaXMgaXMgdGhlIGVudHJ5IHBvaW50IHRvIHNjaGVk dWxlKCkgZnJvbSBpbi1rZXJuZWwgcHJlZW1wdGlvbgorICogb2ZmIG9mIHByZWVtcHRfZW5hYmxl LiBLZXJuZWwgcHJlZW1wdGlvbnMgb2ZmIHJldHVybiBmcm9tIGludGVycnVwdAorICogb2NjdXIg dGhlcmUgYW5kIGNhbGwgc2NoZWR1bGUgZGlyZWN0bHkuCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBf X3NjaGVkIG5vdHJhY2UgcHJlZW1wdF9zY2hlZHVsZSh2b2lkKQoreworCXN0cnVjdCB0aHJlYWRf aW5mbyAqdGkgPSBjdXJyZW50X3RocmVhZF9pbmZvKCk7CisKKwkvKgorCSAqIElmIHRoZXJlIGlz IGEgbm9uLXplcm8gcHJlZW1wdF9jb3VudCBvciBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwKKwkg KiB3ZSBkbyBub3Qgd2FudCB0byBwcmVlbXB0IHRoZSBjdXJyZW50IHRhc2suIEp1c3QgcmV0dXJu Li4KKwkgKi8KKwlpZiAobGlrZWx5KHRpLT5wcmVlbXB0X2NvdW50IHx8IGlycXNfZGlzYWJsZWQo KSkpCisJCXJldHVybjsKKworCWRvIHsKKwkJYWRkX3ByZWVtcHRfY291bnRfbm90cmFjZShQUkVF TVBUX0FDVElWRSk7CisJCXNjaGVkdWxlKCk7CisJCXN1Yl9wcmVlbXB0X2NvdW50X25vdHJhY2Uo UFJFRU1QVF9BQ1RJVkUpOworCisJCS8qCisJCSAqIENoZWNrIGFnYWluIGluIGNhc2Ugd2UgbWlz c2VkIGEgcHJlZW1wdGlvbiBvcHBvcnR1bml0eQorCQkgKiBiZXR3ZWVuIHNjaGVkdWxlIGFuZCBu b3cuCisJCSAqLworCQliYXJyaWVyKCk7CisJfSB3aGlsZSAobmVlZF9yZXNjaGVkKCkpOworfQor RVhQT1JUX1NZTUJPTChwcmVlbXB0X3NjaGVkdWxlKTsKKworLyoKKyAqIHRoaXMgaXMgdGhlIGVu dHJ5IHBvaW50IHRvIHNjaGVkdWxlKCkgZnJvbSBrZXJuZWwgcHJlZW1wdGlvbgorICogb2ZmIG9m IGlycSBjb250ZXh0LgorICogTm90ZSwgdGhhdCB0aGlzIGlzIGNhbGxlZCBhbmQgcmV0dXJuIHdp dGggaXJxcyBkaXNhYmxlZC4gVGhpcyB3aWxsCisgKiBwcm90ZWN0IHVzIGFnYWluc3QgcmVjdXJz aXZlIGNhbGxpbmcgZnJvbSBpcnEuCisgKi8KK2FzbWxpbmthZ2Ugdm9pZCBfX3NjaGVkIHByZWVt cHRfc2NoZWR1bGVfaXJxKHZvaWQpCit7CisJc3RydWN0IHRocmVhZF9pbmZvICp0aSA9IGN1cnJl bnRfdGhyZWFkX2luZm8oKTsKKworCS8qIENhdGNoIGNhbGxlcnMgd2hpY2ggbmVlZCB0byBiZSBm aXhlZCAqLworCUJVR19PTih0aS0+cHJlZW1wdF9jb3VudCB8fCAhaXJxc19kaXNhYmxlZCgpKTsK KworCWRvIHsKKwkJYWRkX3ByZWVtcHRfY291bnQoUFJFRU1QVF9BQ1RJVkUpOworCQlsb2NhbF9p cnFfZW5hYmxlKCk7CisJCXNjaGVkdWxlKCk7CisJCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJCXN1 Yl9wcmVlbXB0X2NvdW50KFBSRUVNUFRfQUNUSVZFKTsKKworCQkvKgorCQkgKiBDaGVjayBhZ2Fp biBpbiBjYXNlIHdlIG1pc3NlZCBhIHByZWVtcHRpb24gb3Bwb3J0dW5pdHkKKwkJICogYmV0d2Vl biBzY2hlZHVsZSBhbmQgbm93LgorCQkgKi8KKwkJYmFycmllcigpOworCX0gd2hpbGUgKG5lZWRf cmVzY2hlZCgpKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19QUkVFTVBUICovCisKK2ludCBkZWZh dWx0X3dha2VfZnVuY3Rpb24od2FpdF9xdWV1ZV90ICpjdXJyLCB1bnNpZ25lZCBtb2RlLCBpbnQg d2FrZV9mbGFncywKKwkJCSAgdm9pZCAqa2V5KQoreworCXJldHVybiB0cnlfdG9fd2FrZV91cChj dXJyLT5wcml2YXRlLCBtb2RlLCB3YWtlX2ZsYWdzKTsKK30KK0VYUE9SVF9TWU1CT0woZGVmYXVs dF93YWtlX2Z1bmN0aW9uKTsKKworLyoKKyAqIFRoZSBjb3JlIHdha2V1cCBmdW5jdGlvbi4gIE5v bi1leGNsdXNpdmUgd2FrZXVwcyAobnJfZXhjbHVzaXZlID09IDApIGp1c3QKKyAqIHdha2UgZXZl cnl0aGluZyB1cC4gIElmIGl0J3MgYW4gZXhjbHVzaXZlIHdha2V1cCAobnJfZXhjbHVzaXZlID09 IHNtYWxsICt2ZQorICogbnVtYmVyKSB0aGVuIHdlIHdha2UgYWxsIHRoZSBub24tZXhjbHVzaXZl IHRhc2tzIGFuZCBvbmUgZXhjbHVzaXZlIHRhc2suCisgKgorICogVGhlcmUgYXJlIGNpcmN1bXN0 YW5jZXMgaW4gd2hpY2ggd2UgY2FuIHRyeSB0byB3YWtlIGEgdGFzayB3aGljaCBoYXMgYWxyZWFk eQorICogc3RhcnRlZCB0byBydW4gYnV0IGlzIG5vdCBpbiBzdGF0ZSBUQVNLX1JVTk5JTkcuICB0 cnlfdG9fd2FrZV91cCgpIHJldHVybnMKKyAqIHplcm8gaW4gdGhpcyAocmFyZSkgY2FzZSwgYW5k IHdlIGhhbmRsZSBpdCBieSBjb250aW51aW5nIHRvIHNjYW4gdGhlIHF1ZXVlLgorICovCitzdGF0 aWMgdm9pZCBfX3dha2VfdXBfY29tbW9uKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBp bnQgbW9kZSwKKwkJCWludCBucl9leGNsdXNpdmUsIGludCB3YWtlX2ZsYWdzLCB2b2lkICprZXkp Cit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqbmV4dDsKKworCWxpc3RfZm9yX2VhY2hfc2Fm ZSh0bXAsIG5leHQsICZxLT50YXNrX2xpc3QpIHsKKwkJd2FpdF9xdWV1ZV90ICpjdXJyID0gbGlz dF9lbnRyeSh0bXAsIHdhaXRfcXVldWVfdCwgdGFza19saXN0KTsKKwkJdW5zaWduZWQgaW50IGZs YWdzID0gY3Vyci0+ZmxhZ3M7CisKKwkJaWYgKGN1cnItPmZ1bmMoY3VyciwgbW9kZSwgd2FrZV9m bGFncywga2V5KSAmJgorCQkJCShmbGFncyAmIFdRX0ZMQUdfRVhDTFVTSVZFKSAmJiAhLS1ucl9l eGNsdXNpdmUpCisJCQlicmVhazsKKwl9Cit9CisKKy8qKgorICogX193YWtlX3VwIC0gd2FrZSB1 cCB0aHJlYWRzIGJsb2NrZWQgb24gYSB3YWl0cXVldWUuCisgKiBAcTogdGhlIHdhaXRxdWV1ZQor ICogQG1vZGU6IHdoaWNoIHRocmVhZHMKKyAqIEBucl9leGNsdXNpdmU6IGhvdyBtYW55IHdha2Ut b25lIG9yIHdha2UtbWFueSB0aHJlYWRzIHRvIHdha2UgdXAKKyAqIEBrZXk6IGlzIGRpcmVjdGx5 IHBhc3NlZCB0byB0aGUgd2FrZXVwIGZ1bmN0aW9uCisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQg dGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxpZXMgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUK KyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0YXRlIGlmIGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUg d29rZW4gdXAuCisgKi8KK3ZvaWQgX193YWtlX3VwKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNp Z25lZCBpbnQgbW9kZSwKKwkJCWludCBucl9leGNsdXNpdmUsIHZvaWQgKmtleSkKK3sKKwl1bnNp Z25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxvY2ssIGZsYWdzKTsK KwlfX3dha2VfdXBfY29tbW9uKHEsIG1vZGUsIG5yX2V4Y2x1c2l2ZSwgMCwga2V5KTsKKwlzcGlu X3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7Cit9CitFWFBPUlRfU1lNQk9MKF9f d2FrZV91cCk7CisKKy8qCisgKiBTYW1lIGFzIF9fd2FrZV91cCBidXQgY2FsbGVkIHdpdGggdGhl IHNwaW5sb2NrIGluIHdhaXRfcXVldWVfaGVhZF90IGhlbGQuCisgKi8KK3ZvaWQgX193YWtlX3Vw X2xvY2tlZCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1vZGUsIGludCBucikK K3sKKwlfX3dha2VfdXBfY29tbW9uKHEsIG1vZGUsIG5yLCAwLCBOVUxMKTsKK30KK0VYUE9SVF9T WU1CT0xfR1BMKF9fd2FrZV91cF9sb2NrZWQpOworCit2b2lkIF9fd2FrZV91cF9sb2NrZWRfa2V5 KHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KQorewor CV9fd2FrZV91cF9jb21tb24ocSwgbW9kZSwgMSwgMCwga2V5KTsKK30KK0VYUE9SVF9TWU1CT0xf R1BMKF9fd2FrZV91cF9sb2NrZWRfa2V5KTsKKworLyoqCisgKiBfX3dha2VfdXBfc3luY19rZXkg LSB3YWtlIHVwIHRocmVhZHMgYmxvY2tlZCBvbiBhIHdhaXRxdWV1ZS4KKyAqIEBxOiB0aGUgd2Fp dHF1ZXVlCisgKiBAbW9kZTogd2hpY2ggdGhyZWFkcworICogQG5yX2V4Y2x1c2l2ZTogaG93IG1h bnkgd2FrZS1vbmUgb3Igd2FrZS1tYW55IHRocmVhZHMgdG8gd2FrZSB1cAorICogQGtleTogb3Bh cXVlIHZhbHVlIHRvIGJlIHBhc3NlZCB0byB3YWtldXAgdGFyZ2V0cworICoKKyAqIFRoZSBzeW5j IHdha2V1cCBkaWZmZXJzIHRoYXQgdGhlIHdha2VyIGtub3dzIHRoYXQgaXQgd2lsbCBzY2hlZHVs ZQorICogYXdheSBzb29uLCBzbyB3aGlsZSB0aGUgdGFyZ2V0IHRocmVhZCB3aWxsIGJlIHdva2Vu IHVwLCBpdCB3aWxsIG5vdAorICogYmUgbWlncmF0ZWQgdG8gYW5vdGhlciBDUFUgLSBpZS4gdGhl IHR3byB0aHJlYWRzIGFyZSAnc3luY2hyb25pc2VkJworICogd2l0aCBlYWNoIG90aGVyLiBUaGlz IGNhbiBwcmV2ZW50IG5lZWRsZXNzIGJvdW5jaW5nIGJldHdlZW4gQ1BVcy4KKyAqCisgKiBPbiBV UCBpdCBjYW4gcHJldmVudCBleHRyYSBwcmVlbXB0aW9uLgorICoKKyAqIEl0IG1heSBiZSBhc3N1 bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpbXBsaWVzIGEgd3JpdGUgbWVtb3J5IGJhcnJpZXIgYmVm b3JlCisgKiBjaGFuZ2luZyB0aGUgdGFzayBzdGF0ZSBpZiBhbmQgb25seSBpZiBhbnkgdGFza3Mg YXJlIHdva2VuIHVwLgorICovCit2b2lkIF9fd2FrZV91cF9zeW5jX2tleSh3YWl0X3F1ZXVlX2hl YWRfdCAqcSwgdW5zaWduZWQgaW50IG1vZGUsCisJCQlpbnQgbnJfZXhjbHVzaXZlLCB2b2lkICpr ZXkpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgd2FrZV9mbGFncyA9IFdGX1NZTkM7 CisKKwlpZiAodW5saWtlbHkoIXEpKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHkoIW5yX2V4 Y2x1c2l2ZSkpCisJCXdha2VfZmxhZ3MgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxv Y2ssIGZsYWdzKTsKKwlfX3dha2VfdXBfY29tbW9uKHEsIG1vZGUsIG5yX2V4Y2x1c2l2ZSwgd2Fr ZV9mbGFncywga2V5KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7 Cit9CitFWFBPUlRfU1lNQk9MX0dQTChfX3dha2VfdXBfc3luY19rZXkpOworCisvKioKKyAqIF9f d2FrZV91cF9zeW5jIC0gd2FrZSB1cCB0aHJlYWRzIGJsb2NrZWQgb24gYSB3YWl0cXVldWUuCisg KiBAcTogdGhlIHdhaXRxdWV1ZQorICogQG1vZGU6IHdoaWNoIHRocmVhZHMKKyAqIEBucl9leGNs dXNpdmU6IGhvdyBtYW55IHdha2Utb25lIG9yIHdha2UtbWFueSB0aHJlYWRzIHRvIHdha2UgdXAK KyAqCisgKiBUaGUgc3luYyB3YWtldXAgZGlmZmVycyB0aGF0IHRoZSB3YWtlciBrbm93cyB0aGF0 IGl0IHdpbGwgc2NoZWR1bGUKKyAqIGF3YXkgc29vbiwgc28gd2hpbGUgdGhlIHRhcmdldCB0aHJl YWQgd2lsbCBiZSB3b2tlbiB1cCwgaXQgd2lsbCBub3QKKyAqIGJlIG1pZ3JhdGVkIHRvIGFub3Ro ZXIgQ1BVIC0gaWUuIHRoZSB0d28gdGhyZWFkcyBhcmUgJ3N5bmNocm9uaXNlZCcKKyAqIHdpdGgg ZWFjaCBvdGhlci4gVGhpcyBjYW4gcHJldmVudCBuZWVkbGVzcyBib3VuY2luZyBiZXR3ZWVuIENQ VXMuCisgKgorICogT24gVVAgaXQgY2FuIHByZXZlbnQgZXh0cmEgcHJlZW1wdGlvbi4KKyAqLwor dm9pZCBfX3dha2VfdXBfc3luYyh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1v ZGUsIGludCBucl9leGNsdXNpdmUpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgc3lu YyA9IDE7CisKKwlpZiAodW5saWtlbHkoIXEpKQorCQlyZXR1cm47CisKKwlpZiAodW5saWtlbHko IW5yX2V4Y2x1c2l2ZSkpCisJCXN5bmMgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnEtPmxv Y2ssIGZsYWdzKTsKKwlfX3dha2VfdXBfY29tbW9uKHEsIG1vZGUsIG5yX2V4Y2x1c2l2ZSwgc3lu YywgTlVMTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcS0+bG9jaywgZmxhZ3MpOworfQor RVhQT1JUX1NZTUJPTF9HUEwoX193YWtlX3VwX3N5bmMpOwkvKiBGb3IgaW50ZXJuYWwgdXNlIG9u bHkgKi8KKworLyoqCisgKiBjb21wbGV0ZTogLSBzaWduYWxzIGEgc2luZ2xlIHRocmVhZCB3YWl0 aW5nIG9uIHRoaXMgY29tcGxldGlvbgorICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBw YXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqCisgKiBUaGlzIHdpbGwgd2FrZSB1cCBhIHNpbmdsZSB0 aHJlYWQgd2FpdGluZyBvbiB0aGlzIGNvbXBsZXRpb24uIFRocmVhZHMgd2lsbCBiZQorICogYXdh a2VuZWQgaW4gdGhlIHNhbWUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIHF1ZXVlZC4KKyAqCisg KiBTZWUgYWxzbyBjb21wbGV0ZV9hbGwoKSwgd2FpdF9mb3JfY29tcGxldGlvbigpIGFuZCByZWxh dGVkIHJvdXRpbmVzLgorICoKKyAqIEl0IG1heSBiZSBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlv biBpbXBsaWVzIGEgd3JpdGUgbWVtb3J5IGJhcnJpZXIgYmVmb3JlCisgKiBjaGFuZ2luZyB0aGUg dGFzayBzdGF0ZSBpZiBhbmQgb25seSBpZiBhbnkgdGFza3MgYXJlIHdva2VuIHVwLgorICovCit2 b2lkIGNvbXBsZXRlKHN0cnVjdCBjb21wbGV0aW9uICp4KQoreworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeC0+d2FpdC5sb2NrLCBmbGFncyk7CisJeC0+ZG9u ZSsrOworCV9fd2FrZV91cF9jb21tb24oJngtPndhaXQsIFRBU0tfTk9STUFMLCAxLCAwLCBOVUxM KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4LT53YWl0LmxvY2ssIGZsYWdzKTsKK30KK0VY UE9SVF9TWU1CT0woY29tcGxldGUpOworCisvKioKKyAqIGNvbXBsZXRlX2FsbDogLSBzaWduYWxz IGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBjb21wbGV0aW9uCisgKiBAeDogIGhvbGRzIHRo ZSBzdGF0ZSBvZiB0aGlzIHBhcnRpY3VsYXIgY29tcGxldGlvbgorICoKKyAqIFRoaXMgd2lsbCB3 YWtlIHVwIGFsbCB0aHJlYWRzIHdhaXRpbmcgb24gdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24g ZXZlbnQuCisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxp ZXMgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUKKyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0 YXRlIGlmIGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUgd29rZW4gdXAuCisgKi8KK3ZvaWQgY29t cGxldGVfYWxsKHN0cnVjdCBjb21wbGV0aW9uICp4KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeC0+d2FpdC5sb2NrLCBmbGFncyk7CisJeC0+ZG9uZSAr PSBVSU5UX01BWC8yOworCV9fd2FrZV91cF9jb21tb24oJngtPndhaXQsIFRBU0tfTk9STUFMLCAw LCAwLCBOVUxMKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4LT53YWl0LmxvY2ssIGZsYWdz KTsKK30KK0VYUE9SVF9TWU1CT0woY29tcGxldGVfYWxsKTsKKworc3RhdGljIGlubGluZSBsb25n IF9fc2NoZWQKK2RvX3dhaXRfZm9yX2NvbW1vbihzdHJ1Y3QgY29tcGxldGlvbiAqeCwgbG9uZyB0 aW1lb3V0LCBpbnQgc3RhdGUpCit7CisJaWYgKCF4LT5kb25lKSB7CisJCURFQ0xBUkVfV0FJVFFV RVVFKHdhaXQsIGN1cnJlbnQpOworCisJCV9fYWRkX3dhaXRfcXVldWVfdGFpbF9leGNsdXNpdmUo JngtPndhaXQsICZ3YWl0KTsKKwkJZG8geworCQkJaWYgKHNpZ25hbF9wZW5kaW5nX3N0YXRlKHN0 YXRlLCBjdXJyZW50KSkgeworCQkJCXRpbWVvdXQgPSAtRVJFU1RBUlRTWVM7CisJCQkJYnJlYWs7 CisJCQl9CisJCQlfX3NldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKKwkJCXNwaW5fdW5sb2NrX2ly cSgmeC0+d2FpdC5sb2NrKTsKKwkJCXRpbWVvdXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQp OworCQkJc3Bpbl9sb2NrX2lycSgmeC0+d2FpdC5sb2NrKTsKKwkJfSB3aGlsZSAoIXgtPmRvbmUg JiYgdGltZW91dCk7CisJCV9fcmVtb3ZlX3dhaXRfcXVldWUoJngtPndhaXQsICZ3YWl0KTsKKwkJ aWYgKCF4LT5kb25lKQorCQkJcmV0dXJuIHRpbWVvdXQ7CisJfQorCXgtPmRvbmUtLTsKKwlyZXR1 cm4gdGltZW91dCA/OiAxOworfQorCitzdGF0aWMgbG9uZyBfX3NjaGVkCit3YWl0X2Zvcl9jb21t b24oc3RydWN0IGNvbXBsZXRpb24gKngsIGxvbmcgdGltZW91dCwgaW50IHN0YXRlKQoreworCW1p Z2h0X3NsZWVwKCk7CisKKwlzcGluX2xvY2tfaXJxKCZ4LT53YWl0LmxvY2spOworCXRpbWVvdXQg PSBkb193YWl0X2Zvcl9jb21tb24oeCwgdGltZW91dCwgc3RhdGUpOworCXNwaW5fdW5sb2NrX2ly cSgmeC0+d2FpdC5sb2NrKTsKKwlyZXR1cm4gdGltZW91dDsKK30KKworLyoqCisgKiB3YWl0X2Zv cl9jb21wbGV0aW9uOiAtIHdhaXRzIGZvciBjb21wbGV0aW9uIG9mIGEgdGFzaworICogQHg6ICBo b2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqCisgKiBUaGlz IHdhaXRzIHRvIGJlIHNpZ25hbGVkIGZvciBjb21wbGV0aW9uIG9mIGEgc3BlY2lmaWMgdGFzay4g SXQgaXMgTk9UCisgKiBpbnRlcnJ1cHRpYmxlIGFuZCB0aGVyZSBpcyBubyB0aW1lb3V0LgorICoK KyAqIFNlZSBhbHNvIHNpbWlsYXIgcm91dGluZXMgKGkuZS4gd2FpdF9mb3JfY29tcGxldGlvbl90 aW1lb3V0KCkpIHdpdGggdGltZW91dAorICogYW5kIGludGVycnVwdCBjYXBhYmlsaXR5LiBBbHNv IHNlZSBjb21wbGV0ZSgpLgorICovCit2b2lkIF9fc2NoZWQgd2FpdF9mb3JfY29tcGxldGlvbihz dHJ1Y3QgY29tcGxldGlvbiAqeCkKK3sKKwl3YWl0X2Zvcl9jb21tb24oeCwgTUFYX1NDSEVEVUxF X1RJTUVPVVQsIFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKK30KK0VYUE9SVF9TWU1CT0wod2FpdF9m b3JfY29tcGxldGlvbik7CisKKy8qKgorICogd2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0OiAt IHdhaXRzIGZvciBjb21wbGV0aW9uIG9mIGEgdGFzayAody90aW1lb3V0KQorICogQHg6ICBob2xk cyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqIEB0aW1lb3V0OiAg dGltZW91dCB2YWx1ZSBpbiBqaWZmaWVzCisgKgorICogVGhpcyB3YWl0cyBmb3IgZWl0aGVyIGEg Y29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2lnbmFsZWQgb3IgZm9yIGEKKyAq IHNwZWNpZmllZCB0aW1lb3V0IHRvIGV4cGlyZS4gVGhlIHRpbWVvdXQgaXMgaW4gamlmZmllcy4g SXQgaXMgbm90CisgKiBpbnRlcnJ1cHRpYmxlLgorICoKKyAqIFRoZSByZXR1cm4gdmFsdWUgaXMg MCBpZiB0aW1lZCBvdXQsIGFuZCBwb3NpdGl2ZSAoYXQgbGVhc3QgMSwgb3IgbnVtYmVyIG9mCisg KiBqaWZmaWVzIGxlZnQgdGlsbCB0aW1lb3V0KSBpZiBjb21wbGV0ZWQuCisgKi8KK3Vuc2lnbmVk IGxvbmcgX19zY2hlZAord2FpdF9mb3JfY29tcGxldGlvbl90aW1lb3V0KHN0cnVjdCBjb21wbGV0 aW9uICp4LCB1bnNpZ25lZCBsb25nIHRpbWVvdXQpCit7CisJcmV0dXJuIHdhaXRfZm9yX2NvbW1v bih4LCB0aW1lb3V0LCBUQVNLX1VOSU5URVJSVVBUSUJMRSk7Cit9CitFWFBPUlRfU1lNQk9MKHdh aXRfZm9yX2NvbXBsZXRpb25fdGltZW91dCk7CisKKy8qKgorICogd2FpdF9mb3JfY29tcGxldGlv bl9pbnRlcnJ1cHRpYmxlOiAtIHdhaXRzIGZvciBjb21wbGV0aW9uIG9mIGEgdGFzayAody9pbnRy KQorICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24K KyAqCisgKiBUaGlzIHdhaXRzIGZvciBjb21wbGV0aW9uIG9mIGEgc3BlY2lmaWMgdGFzayB0byBi ZSBzaWduYWxlZC4gSXQgaXMKKyAqIGludGVycnVwdGlibGUuCisgKgorICogVGhlIHJldHVybiB2 YWx1ZSBpcyAtRVJFU1RBUlRTWVMgaWYgaW50ZXJydXB0ZWQsIDAgaWYgY29tcGxldGVkLgorICov CitpbnQgX19zY2hlZCB3YWl0X2Zvcl9jb21wbGV0aW9uX2ludGVycnVwdGlibGUoc3RydWN0IGNv bXBsZXRpb24gKngpCit7CisJbG9uZyB0ID0gd2FpdF9mb3JfY29tbW9uKHgsIE1BWF9TQ0hFRFVM RV9USU1FT1VULCBUQVNLX0lOVEVSUlVQVElCTEUpOworCWlmICh0ID09IC1FUkVTVEFSVFNZUykK KwkJcmV0dXJuIHQ7CisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKHdhaXRfZm9yX2NvbXBs ZXRpb25faW50ZXJydXB0aWJsZSk7CisKKy8qKgorICogd2FpdF9mb3JfY29tcGxldGlvbl9pbnRl cnJ1cHRpYmxlX3RpbWVvdXQ6IC0gd2FpdHMgZm9yIGNvbXBsZXRpb24gKHcvKHRvLGludHIpKQor ICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAq IEB0aW1lb3V0OiAgdGltZW91dCB2YWx1ZSBpbiBqaWZmaWVzCisgKgorICogVGhpcyB3YWl0cyBm b3IgZWl0aGVyIGEgY29tcGxldGlvbiBvZiBhIHNwZWNpZmljIHRhc2sgdG8gYmUgc2lnbmFsZWQg b3IgZm9yIGEKKyAqIHNwZWNpZmllZCB0aW1lb3V0IHRvIGV4cGlyZS4gSXQgaXMgaW50ZXJydXB0 aWJsZS4gVGhlIHRpbWVvdXQgaXMgaW4gamlmZmllcy4KKyAqCisgKiBUaGUgcmV0dXJuIHZhbHVl IGlzIC1FUkVTVEFSVFNZUyBpZiBpbnRlcnJ1cHRlZCwgMCBpZiB0aW1lZCBvdXQsCisgKiBwb3Np dGl2ZSAoYXQgbGVhc3QgMSwgb3IgbnVtYmVyIG9mIGppZmZpZXMgbGVmdCB0aWxsIHRpbWVvdXQp IGlmIGNvbXBsZXRlZC4KKyAqLworbG9uZyBfX3NjaGVkCit3YWl0X2Zvcl9jb21wbGV0aW9uX2lu dGVycnVwdGlibGVfdGltZW91dChzdHJ1Y3QgY29tcGxldGlvbiAqeCwKKwkJCQkJICB1bnNpZ25l ZCBsb25nIHRpbWVvdXQpCit7CisJcmV0dXJuIHdhaXRfZm9yX2NvbW1vbih4LCB0aW1lb3V0LCBU QVNLX0lOVEVSUlVQVElCTEUpOworfQorRVhQT1JUX1NZTUJPTCh3YWl0X2Zvcl9jb21wbGV0aW9u X2ludGVycnVwdGlibGVfdGltZW91dCk7CisKKy8qKgorICogd2FpdF9mb3JfY29tcGxldGlvbl9r aWxsYWJsZTogLSB3YWl0cyBmb3IgY29tcGxldGlvbiBvZiBhIHRhc2sgKGtpbGxhYmxlKQorICog QHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqCisg KiBUaGlzIHdhaXRzIHRvIGJlIHNpZ25hbGVkIGZvciBjb21wbGV0aW9uIG9mIGEgc3BlY2lmaWMg dGFzay4gSXQgY2FuIGJlCisgKiBpbnRlcnJ1cHRlZCBieSBhIGtpbGwgc2lnbmFsLgorICoKKyAq IFRoZSByZXR1cm4gdmFsdWUgaXMgLUVSRVNUQVJUU1lTIGlmIGludGVycnVwdGVkLCAwIGlmIHRp bWVkIG91dCwKKyAqIHBvc2l0aXZlIChhdCBsZWFzdCAxLCBvciBudW1iZXIgb2YgamlmZmllcyBs ZWZ0IHRpbGwgdGltZW91dCkgaWYgY29tcGxldGVkLgorICovCitpbnQgX19zY2hlZCB3YWl0X2Zv cl9jb21wbGV0aW9uX2tpbGxhYmxlKHN0cnVjdCBjb21wbGV0aW9uICp4KQoreworCWxvbmcgdCA9 IHdhaXRfZm9yX2NvbW1vbih4LCBNQVhfU0NIRURVTEVfVElNRU9VVCwgVEFTS19LSUxMQUJMRSk7 CisJaWYgKHQgPT0gLUVSRVNUQVJUU1lTKQorCQlyZXR1cm4gdDsKKwlyZXR1cm4gMDsKK30KK0VY UE9SVF9TWU1CT0wod2FpdF9mb3JfY29tcGxldGlvbl9raWxsYWJsZSk7CisKKy8qKgorICogd2Fp dF9mb3JfY29tcGxldGlvbl9raWxsYWJsZV90aW1lb3V0OiAtIHdhaXRzIGZvciBjb21wbGV0aW9u IG9mIGEgdGFzayAody8odG8sa2lsbGFibGUpKQorICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2Yg dGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KKyAqIEB0aW1lb3V0OiAgdGltZW91dCB2YWx1ZSBp biBqaWZmaWVzCisgKgorICogVGhpcyB3YWl0cyBmb3IgZWl0aGVyIGEgY29tcGxldGlvbiBvZiBh IHNwZWNpZmljIHRhc2sgdG8gYmUKKyAqIHNpZ25hbGVkIG9yIGZvciBhIHNwZWNpZmllZCB0aW1l b3V0IHRvIGV4cGlyZS4gSXQgY2FuIGJlCisgKiBpbnRlcnJ1cHRlZCBieSBhIGtpbGwgc2lnbmFs LiBUaGUgdGltZW91dCBpcyBpbiBqaWZmaWVzLgorICovCitsb25nIF9fc2NoZWQKK3dhaXRfZm9y X2NvbXBsZXRpb25fa2lsbGFibGVfdGltZW91dChzdHJ1Y3QgY29tcGxldGlvbiAqeCwKKwkJCQkJ IHVuc2lnbmVkIGxvbmcgdGltZW91dCkKK3sKKwlyZXR1cm4gd2FpdF9mb3JfY29tbW9uKHgsIHRp bWVvdXQsIFRBU0tfS0lMTEFCTEUpOworfQorRVhQT1JUX1NZTUJPTCh3YWl0X2Zvcl9jb21wbGV0 aW9uX2tpbGxhYmxlX3RpbWVvdXQpOworCisvKioKKyAqCXRyeV93YWl0X2Zvcl9jb21wbGV0aW9u IC0gdHJ5IHRvIGRlY3JlbWVudCBhIGNvbXBsZXRpb24gd2l0aG91dCBibG9ja2luZworICoJQHg6 CWNvbXBsZXRpb24gc3RydWN0dXJlCisgKgorICoJUmV0dXJuczogMCBpZiBhIGRlY3JlbWVudCBj YW5ub3QgYmUgZG9uZSB3aXRob3V0IGJsb2NraW5nCisgKgkJIDEgaWYgYSBkZWNyZW1lbnQgc3Vj Y2VlZGVkLgorICoKKyAqCUlmIGEgY29tcGxldGlvbiBpcyBiZWluZyB1c2VkIGFzIGEgY291bnRp bmcgY29tcGxldGlvbiwKKyAqCWF0dGVtcHQgdG8gZGVjcmVtZW50IHRoZSBjb3VudGVyIHdpdGhv dXQgYmxvY2tpbmcuIFRoaXMKKyAqCWVuYWJsZXMgdXMgdG8gYXZvaWQgd2FpdGluZyBpZiB0aGUg cmVzb3VyY2UgdGhlIGNvbXBsZXRpb24KKyAqCWlzIHByb3RlY3RpbmcgaXMgbm90IGF2YWlsYWJs ZS4KKyAqLworYm9vbCB0cnlfd2FpdF9mb3JfY29tcGxldGlvbihzdHJ1Y3QgY29tcGxldGlvbiAq eCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAxOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJngtPndhaXQubG9jaywgZmxhZ3MpOworCWlmICgheC0+ZG9uZSkKKwkJcmV0ID0g MDsKKwllbHNlCisJCXgtPmRvbmUtLTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4LT53YWl0 LmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTCh0cnlfd2FpdF9m b3JfY29tcGxldGlvbik7CisKKy8qKgorICoJY29tcGxldGlvbl9kb25lIC0gVGVzdCB0byBzZWUg aWYgYSBjb21wbGV0aW9uIGhhcyBhbnkgd2FpdGVycworICoJQHg6CWNvbXBsZXRpb24gc3RydWN0 dXJlCisgKgorICoJUmV0dXJuczogMCBpZiB0aGVyZSBhcmUgd2FpdGVycyAod2FpdF9mb3JfY29t cGxldGlvbigpIGluIHByb2dyZXNzKQorICoJCSAxIGlmIHRoZXJlIGFyZSBubyB3YWl0ZXJzLgor ICoKKyAqLworYm9vbCBjb21wbGV0aW9uX2RvbmUoc3RydWN0IGNvbXBsZXRpb24gKngpCit7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0ID0gMTsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZ4LT53YWl0LmxvY2ssIGZsYWdzKTsKKwlpZiAoIXgtPmRvbmUpCisJCXJldCA9IDA7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmeC0+d2FpdC5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsK K30KK0VYUE9SVF9TWU1CT0woY29tcGxldGlvbl9kb25lKTsKKworc3RhdGljIGxvbmcgX19zY2hl ZAorc2xlZXBfb25fY29tbW9uKHdhaXRfcXVldWVfaGVhZF90ICpxLCBpbnQgc3RhdGUsIGxvbmcg dGltZW91dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXdhaXRfcXVldWVfdCB3YWl0Owor CisJaW5pdF93YWl0cXVldWVfZW50cnkoJndhaXQsIGN1cnJlbnQpOworCisJX19zZXRfY3VycmVu dF9zdGF0ZShzdGF0ZSk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmcS0+bG9jaywgZmxhZ3MpOwor CV9fYWRkX3dhaXRfcXVldWUocSwgJndhaXQpOworCXNwaW5fdW5sb2NrKCZxLT5sb2NrKTsKKwl0 aW1lb3V0ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lb3V0KTsKKwlzcGluX2xvY2tfaXJxKCZxLT5s b2NrKTsKKwlfX3JlbW92ZV93YWl0X3F1ZXVlKHEsICZ3YWl0KTsKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gdGltZW91dDsKK30KKwordm9pZCBf X3NjaGVkIGludGVycnVwdGlibGVfc2xlZXBfb24od2FpdF9xdWV1ZV9oZWFkX3QgKnEpCit7CisJ c2xlZXBfb25fY29tbW9uKHEsIFRBU0tfSU5URVJSVVBUSUJMRSwgTUFYX1NDSEVEVUxFX1RJTUVP VVQpOworfQorRVhQT1JUX1NZTUJPTChpbnRlcnJ1cHRpYmxlX3NsZWVwX29uKTsKKworbG9uZyBf X3NjaGVkCitpbnRlcnJ1cHRpYmxlX3NsZWVwX29uX3RpbWVvdXQod2FpdF9xdWV1ZV9oZWFkX3Qg KnEsIGxvbmcgdGltZW91dCkKK3sKKwlyZXR1cm4gc2xlZXBfb25fY29tbW9uKHEsIFRBU0tfSU5U RVJSVVBUSUJMRSwgdGltZW91dCk7Cit9CitFWFBPUlRfU1lNQk9MKGludGVycnVwdGlibGVfc2xl ZXBfb25fdGltZW91dCk7CisKK3ZvaWQgX19zY2hlZCBzbGVlcF9vbih3YWl0X3F1ZXVlX2hlYWRf dCAqcSkKK3sKKwlzbGVlcF9vbl9jb21tb24ocSwgVEFTS19VTklOVEVSUlVQVElCTEUsIE1BWF9T Q0hFRFVMRV9USU1FT1VUKTsKK30KK0VYUE9SVF9TWU1CT0woc2xlZXBfb24pOworCitsb25nIF9f c2NoZWQgc2xlZXBfb25fdGltZW91dCh3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgbG9uZyB0aW1lb3V0 KQoreworCXJldHVybiBzbGVlcF9vbl9jb21tb24ocSwgVEFTS19VTklOVEVSUlVQVElCTEUsIHRp bWVvdXQpOworfQorRVhQT1JUX1NZTUJPTChzbGVlcF9vbl90aW1lb3V0KTsKKworI2lmZGVmIENP TkZJR19SVF9NVVRFWEVTCisKKy8qCisgKiBydF9tdXRleF9zZXRwcmlvIC0gc2V0IHRoZSBjdXJy ZW50IHByaW9yaXR5IG9mIGEgdGFzaworICogQHA6IHRhc2sKKyAqIEBwcmlvOiBwcmlvIHZhbHVl IChrZXJuZWwtaW50ZXJuYWwgZm9ybSkKKyAqCisgKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhl ICdlZmZlY3RpdmUnIHByaW9yaXR5IG9mIGEgdGFzay4gSXQgZG9lcworICogbm90IHRvdWNoIC0+ cHJpbyBsaWtlIF9fc2V0c2NoZWR1bGVyKCkuCisgKgorICogVXNlZCBieSB0aGUgcnRfbXV0ZXgg Y29kZSB0byBpbXBsZW1lbnQgcHJpb3JpdHkgaW5oZXJpdGFuY2UgbG9naWMuCisgKi8KK3ZvaWQg cnRfbXV0ZXhfc2V0cHJpbyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGludCBwcmlvKQoreworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHF1ZXVlZCwgb2xkcHJpbzsKKwlzdHJ1Y3QgcnEgKnJx OworCisJQlVHX09OKHByaW8gPCAwIHx8IHByaW8gPiBNQVhfUFJJTyk7CisKKwlycSA9IHRhc2tf Z3JxX2xvY2socCwgJmZsYWdzKTsKKworCXRyYWNlX3NjaGVkX3BpX3NldHByaW8ocCwgcHJpbyk7 CisJb2xkcHJpbyA9IHAtPnByaW87CisJcXVldWVkID0gdGFza19xdWV1ZWQocCk7CisJcC0+cHJp byA9IHByaW87CisJaWYgKHRhc2tfcnVubmluZyhwKSAmJiBwcmlvID4gb2xkcHJpbykKKwkJcmVz Y2hlZF90YXNrKHApOworCWlmIChxdWV1ZWQpIHsKKwkJdHJ5X3ByZWVtcHQocCwgcnEpOworCX0K KworCXRhc2tfZ3JxX3VubG9jaygmZmxhZ3MpOworfQorCisjZW5kaWYKKwordm9pZCBzZXRfdXNl cl9uaWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgbG9uZyBuaWNlKQoreworCWludCBxdWV1ZWQs IG5ld19zdGF0aWMsIG9sZF9zdGF0aWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3Qg cnEgKnJxOworCisJaWYgKFRBU0tfTklDRShwKSA9PSBuaWNlIHx8IG5pY2UgPCAtMjAgfHwgbmlj ZSA+IDE5KQorCQlyZXR1cm47CisJbmV3X3N0YXRpYyA9IE5JQ0VfVE9fUFJJTyhuaWNlKTsKKwkv KgorCSAqIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bCwgaWYgY2FsbGVkIGZyb20gc3lzX3NldHByaW9y aXR5KCksCisJICogdGhlIHRhc2sgbWlnaHQgYmUgaW4gdGhlIG1pZGRsZSBvZiBzY2hlZHVsaW5n IG9uIGFub3RoZXIgQ1BVLgorCSAqLworCXJxID0gdGltZV90YXNrX2dycV9sb2NrKHAsICZmbGFn cyk7CisJLyoKKwkgKiBUaGUgUlQgcHJpb3JpdGllcyBhcmUgc2V0IHZpYSBzY2hlZF9zZXRzY2hl ZHVsZXIoKSwgYnV0IHdlIHN0aWxsCisJICogYWxsb3cgdGhlICdub3JtYWwnIG5pY2UgdmFsdWUg dG8gYmUgc2V0IC0gYnV0IGFzIGV4cGVjdGVkCisJICogaXQgd29udCBoYXZlIGFueSBlZmZlY3Qg b24gc2NoZWR1bGluZyB1bnRpbCB0aGUgdGFzayBpcworCSAqIG5vdCBTQ0hFRF9OT1JNQUwvU0NI RURfQkFUQ0g6CisJICovCisJaWYgKGhhc19ydF9wb2xpY3kocCkpIHsKKwkJcC0+c3RhdGljX3By aW8gPSBuZXdfc3RhdGljOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCXF1ZXVlZCA9IHRhc2tf cXVldWVkKHApOworCisJb2xkX3N0YXRpYyA9IHAtPnN0YXRpY19wcmlvOworCXAtPnN0YXRpY19w cmlvID0gbmV3X3N0YXRpYzsKKwlwLT5wcmlvID0gcC0+c3RhdGljX3ByaW87CisKKwlpZiAocXVl dWVkKSB7CisJCWlmIChuZXdfc3RhdGljIDwgb2xkX3N0YXRpYykKKwkJCXRyeV9wcmVlbXB0KHAs IHJxKTsKKwl9IGVsc2UgaWYgKHRhc2tfcnVubmluZyhwKSkgeworCQlyZXNldF9ycV90YXNrKHJx LCBwKTsKKwkJaWYgKG9sZF9zdGF0aWMgPCBuZXdfc3RhdGljKQorCQkJcmVzY2hlZF90YXNrKHAp OworCX0KK291dF91bmxvY2s6CisJdGFza19ncnFfdW5sb2NrKCZmbGFncyk7Cit9CitFWFBPUlRf U1lNQk9MKHNldF91c2VyX25pY2UpOworCisvKgorICogY2FuX25pY2UgLSBjaGVjayBpZiBhIHRh c2sgY2FuIHJlZHVjZSBpdHMgbmljZSB2YWx1ZQorICogQHA6IHRhc2sKKyAqIEBuaWNlOiBuaWNl IHZhbHVlCisgKi8KK2ludCBjYW5fbmljZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNv bnN0IGludCBuaWNlKQoreworCS8qIGNvbnZlcnQgbmljZSB2YWx1ZSBbMTksLTIwXSB0byBybGlt aXQgc3R5bGUgdmFsdWUgWzEsNDBdICovCisJaW50IG5pY2VfcmxpbSA9IDIwIC0gbmljZTsKKwor CXJldHVybiAobmljZV9ybGltIDw9IHRhc2tfcmxpbWl0KHAsIFJMSU1JVF9OSUNFKSB8fAorCQlj YXBhYmxlKENBUF9TWVNfTklDRSkpOworfQorCisjaWZkZWYgX19BUkNIX1dBTlRfU1lTX05JQ0UK KworLyoKKyAqIHN5c19uaWNlIC0gY2hhbmdlIHRoZSBwcmlvcml0eSBvZiB0aGUgY3VycmVudCBw cm9jZXNzLgorICogQGluY3JlbWVudDogcHJpb3JpdHkgaW5jcmVtZW50CisgKgorICogc3lzX3Nl dHByaW9yaXR5IGlzIGEgbW9yZSBnZW5lcmljLCBidXQgbXVjaCBzbG93ZXIgZnVuY3Rpb24gdGhh dAorICogZG9lcyBzaW1pbGFyIHRoaW5ncy4KKyAqLworU1lTQ0FMTF9ERUZJTkUxKG5pY2UsIGlu dCwgaW5jcmVtZW50KQoreworCWxvbmcgbmljZSwgcmV0dmFsOworCisJLyoKKwkgKiBTZXRwcmlv cml0eSBtaWdodCBjaGFuZ2Ugb3VyIHByaW9yaXR5IGF0IHRoZSBzYW1lIG1vbWVudC4KKwkgKiBX ZSBkb24ndCBoYXZlIHRvIHdvcnJ5LiBDb25jZXB0dWFsbHkgb25lIGNhbGwgb2NjdXJzIGZpcnN0 CisJICogYW5kIHdlIGhhdmUgYSBzaW5nbGUgd2lubmVyLgorCSAqLworCWlmIChpbmNyZW1lbnQg PCAtNDApCisJCWluY3JlbWVudCA9IC00MDsKKwlpZiAoaW5jcmVtZW50ID4gNDApCisJCWluY3Jl bWVudCA9IDQwOworCisJbmljZSA9IFRBU0tfTklDRShjdXJyZW50KSArIGluY3JlbWVudDsKKwlp ZiAobmljZSA8IC0yMCkKKwkJbmljZSA9IC0yMDsKKwlpZiAobmljZSA+IDE5KQorCQluaWNlID0g MTk7CisKKwlpZiAoaW5jcmVtZW50IDwgMCAmJiAhY2FuX25pY2UoY3VycmVudCwgbmljZSkpCisJ CXJldHVybiAtRVBFUk07CisKKwlyZXR2YWwgPSBzZWN1cml0eV90YXNrX3NldG5pY2UoY3VycmVu dCwgbmljZSk7CisJaWYgKHJldHZhbCkKKwkJcmV0dXJuIHJldHZhbDsKKworCXNldF91c2VyX25p Y2UoY3VycmVudCwgbmljZSk7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZgorCisvKioKKyAqIHRh c2tfcHJpbyAtIHJldHVybiB0aGUgcHJpb3JpdHkgdmFsdWUgb2YgYSBnaXZlbiB0YXNrLgorICog QHA6IHRoZSB0YXNrIGluIHF1ZXN0aW9uLgorICoKKyAqIFRoaXMgaXMgdGhlIHByaW9yaXR5IHZh bHVlIGFzIHNlZW4gYnkgdXNlcnMgaW4gL3Byb2MuCisgKiBSVCB0YXNrcyBhcmUgb2Zmc2V0IGJ5 IC0xMDAuIE5vcm1hbCB0YXNrcyBhcmUgY2VudGVyZWQgYXJvdW5kIDEuCisgKi8KK2ludCB0YXNr X3ByaW8oY29uc3Qgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBwLT5wcmlvIC0g Tk9STUFMX1BSSU87Cit9CisKKy8qKgorICogdGFza19uaWNlIC0gcmV0dXJuIHRoZSBuaWNlIHZh bHVlIG9mIGEgZ2l2ZW4gdGFzay4KKyAqIEBwOiB0aGUgdGFzayBpbiBxdWVzdGlvbi4KKyAqLwor aW50IHRhc2tfbmljZShjb25zdCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCit7CisJcmV0dXJuIFRB U0tfTklDRShwKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHRhc2tfbmljZSk7CisKKy8qKgorICog aWRsZV9jcHUgLSBpcyBhIGdpdmVuIGNwdSBpZGxlIGN1cnJlbnRseT8KKyAqIEBjcHU6IHRoZSBw cm9jZXNzb3IgaW4gcXVlc3Rpb24uCisgKi8KK2ludCBpZGxlX2NwdShpbnQgY3B1KQoreworCXJl dHVybiBjcHVfY3VycihjcHUpID09IGNwdV9ycShjcHUpLT5pZGxlOworfQorCisvKioKKyAqIGlk bGVfdGFzayAtIHJldHVybiB0aGUgaWRsZSB0YXNrIGZvciBhIGdpdmVuIGNwdS4KKyAqIEBjcHU6 IHRoZSBwcm9jZXNzb3IgaW4gcXVlc3Rpb24uCisgKi8KK3N0cnVjdCB0YXNrX3N0cnVjdCAqaWRs ZV90YXNrKGludCBjcHUpCit7CisJcmV0dXJuIGNwdV9ycShjcHUpLT5pZGxlOworfQorCisvKioK KyAqIGZpbmRfcHJvY2Vzc19ieV9waWQgLSBmaW5kIGEgcHJvY2VzcyB3aXRoIGEgbWF0Y2hpbmcg UElEIHZhbHVlLgorICogQHBpZDogdGhlIHBpZCBpbiBxdWVzdGlvbi4KKyAqLworc3RhdGljIGlu bGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmZpbmRfcHJvY2Vzc19ieV9waWQocGlkX3QgcGlkKQor eworCXJldHVybiBwaWQgPyBmaW5kX3Rhc2tfYnlfdnBpZChwaWQpIDogY3VycmVudDsKK30KKwor LyogQWN0dWFsbHkgZG8gcHJpb3JpdHkgY2hhbmdlOiBtdXN0IGhvbGQgZ3JxIGxvY2suICovCitz dGF0aWMgdm9pZAorX19zZXRzY2hlZHVsZXIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3Qg cnEgKnJxLCBpbnQgcG9saWN5LCBpbnQgcHJpbykKK3sKKwlpbnQgb2xkcnRwcmlvLCBvbGRwcmlv OworCisJcC0+cG9saWN5ID0gcG9saWN5OworCW9sZHJ0cHJpbyA9IHAtPnJ0X3ByaW9yaXR5Owor CXAtPnJ0X3ByaW9yaXR5ID0gcHJpbzsKKwlvbGRwcmlvID0gcC0+cHJpbzsKKwkvKiB3ZSBhcmUg aG9sZGluZyBwLT5waV9sb2NrIGFscmVhZHkgKi8KKwlwLT5wcmlvID0gcnRfbXV0ZXhfZ2V0cHJp byhwKTsKKwlpZiAodGFza19ydW5uaW5nKHApKSB7CisJCXJlc2V0X3JxX3Rhc2socnEsIHApOwor CQkvKiBSZXNjaGVkIG9ubHkgaWYgd2UgbWlnaHQgbm93IGJlIHByZWVtcHRlZCAqLworCQlpZiAo cC0+cHJpbyA+IG9sZHByaW8gfHwgcC0+cnRfcHJpb3JpdHkgPiBvbGRydHByaW8pCisJCQlyZXNj aGVkX3Rhc2socCk7CisJfQorfQorCisvKgorICogY2hlY2sgdGhlIHRhcmdldCBwcm9jZXNzIGhh cyBhIFVJRCB0aGF0IG1hdGNoZXMgdGhlIGN1cnJlbnQgcHJvY2VzcydzCisgKi8KK3N0YXRpYyBi b29sIGNoZWNrX3NhbWVfb3duZXIoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWNvbnN0IHN0 cnVjdCBjcmVkICpjcmVkID0gY3VycmVudF9jcmVkKCksICpwY3JlZDsKKwlib29sIG1hdGNoOwor CisJcmN1X3JlYWRfbG9jaygpOworCXBjcmVkID0gX190YXNrX2NyZWQocCk7CisJaWYgKGNyZWQt PnVzZXItPnVzZXJfbnMgPT0gcGNyZWQtPnVzZXItPnVzZXJfbnMpCisJCW1hdGNoID0gKGNyZWQt PmV1aWQgPT0gcGNyZWQtPmV1aWQgfHwKKwkJCSBjcmVkLT5ldWlkID09IHBjcmVkLT51aWQpOwor CWVsc2UKKwkJbWF0Y2ggPSBmYWxzZTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gbWF0 Y2g7Cit9CisKK3N0YXRpYyBpbnQgX19zY2hlZF9zZXRzY2hlZHVsZXIoc3RydWN0IHRhc2tfc3Ry dWN0ICpwLCBpbnQgcG9saWN5LAorCQkJCWNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0s IGJvb2wgdXNlcikKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gemVyb19wYXJhbSA9IHsgLnNjaGVk X3ByaW9yaXR5ID0gMCB9OworCWludCBxdWV1ZWQsIHJldHZhbCwgb2xkcG9saWN5ID0gLTE7CisJ dW5zaWduZWQgbG9uZyBmbGFncywgcmxpbV9ydHByaW8gPSAwOworCWludCByZXNldF9vbl9mb3Jr OworCXN0cnVjdCBycSAqcnE7CisKKwkvKiBtYXkgZ3JhYiBub24taXJxIHByb3RlY3RlZCBzcGlu X2xvY2tzICovCisJQlVHX09OKGluX2ludGVycnVwdCgpKTsKKworCWlmIChpc19ydF9wb2xpY3ko cG9saWN5KSAmJiAhY2FwYWJsZShDQVBfU1lTX05JQ0UpKSB7CisJCXVuc2lnbmVkIGxvbmcgbGZs YWdzOworCisJCWlmICghbG9ja190YXNrX3NpZ2hhbmQocCwgJmxmbGFncykpCisJCQlyZXR1cm4g LUVTUkNIOworCQlybGltX3J0cHJpbyA9IHRhc2tfcmxpbWl0KHAsIFJMSU1JVF9SVFBSSU8pOwor CQl1bmxvY2tfdGFza19zaWdoYW5kKHAsICZsZmxhZ3MpOworCQlpZiAocmxpbV9ydHByaW8pCisJ CQlnb3RvIHJlY2hlY2s7CisJCXBhcmFtID0gJnplcm9fcGFyYW07CisJfQorcmVjaGVjazoKKwkv KiBkb3VibGUgY2hlY2sgcG9saWN5IG9uY2UgcnEgbG9jayBoZWxkICovCisJaWYgKHBvbGljeSA8 IDApIHsKKwkJcmVzZXRfb25fZm9yayA9IHAtPnNjaGVkX3Jlc2V0X29uX2Zvcms7CisJCXBvbGlj eSA9IG9sZHBvbGljeSA9IHAtPnBvbGljeTsKKwl9IGVsc2UgeworCQlyZXNldF9vbl9mb3JrID0g ISEocG9saWN5ICYgU0NIRURfUkVTRVRfT05fRk9SSyk7CisJCXBvbGljeSAmPSB+U0NIRURfUkVT RVRfT05fRk9SSzsKKworCQlpZiAoIVNDSEVEX1JBTkdFKHBvbGljeSkpCisJCQlyZXR1cm4gLUVJ TlZBTDsKKwl9CisKKwkvKgorCSAqIFZhbGlkIHByaW9yaXRpZXMgZm9yIFNDSEVEX0ZJRk8gYW5k IFNDSEVEX1JSIGFyZQorCSAqIDEuLk1BWF9VU0VSX1JUX1BSSU8tMSwgdmFsaWQgcHJpb3JpdHkg Zm9yIFNDSEVEX05PUk1BTCBhbmQKKwkgKiBTQ0hFRF9CQVRDSCBpcyAwLgorCSAqLworCWlmIChw YXJhbS0+c2NoZWRfcHJpb3JpdHkgPCAwIHx8CisJCShwLT5tbSAmJiBwYXJhbS0+c2NoZWRfcHJp b3JpdHkgPiBNQVhfVVNFUl9SVF9QUklPIC0gMSkgfHwKKwkJKCFwLT5tbSAmJiBwYXJhbS0+c2No ZWRfcHJpb3JpdHkgPiBNQVhfUlRfUFJJTyAtIDEpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAo aXNfcnRfcG9saWN5KHBvbGljeSkgIT0gKHBhcmFtLT5zY2hlZF9wcmlvcml0eSAhPSAwKSkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwkvKgorCSAqIEFsbG93IHVucHJpdmlsZWdlZCBSVCB0YXNrcyB0 byBkZWNyZWFzZSBwcmlvcml0eToKKwkgKi8KKwlpZiAodXNlciAmJiAhY2FwYWJsZShDQVBfU1lT X05JQ0UpKSB7CisJCWlmIChpc19ydF9wb2xpY3kocG9saWN5KSkgeworCQkJdW5zaWduZWQgbG9u ZyBybGltX3J0cHJpbyA9CisJCQkJCXRhc2tfcmxpbWl0KHAsIFJMSU1JVF9SVFBSSU8pOworCisJ CQkvKiBjYW4ndCBzZXQvY2hhbmdlIHRoZSBydCBwb2xpY3kgKi8KKwkJCWlmIChwb2xpY3kgIT0g cC0+cG9saWN5ICYmICFybGltX3J0cHJpbykKKwkJCQlyZXR1cm4gLUVQRVJNOworCisJCQkvKiBj YW4ndCBpbmNyZWFzZSBwcmlvcml0eSAqLworCQkJaWYgKHBhcmFtLT5zY2hlZF9wcmlvcml0eSA+ IHAtPnJ0X3ByaW9yaXR5ICYmCisJCQkJcGFyYW0tPnNjaGVkX3ByaW9yaXR5ID4gcmxpbV9ydHBy aW8pCisJCQkJcmV0dXJuIC1FUEVSTTsKKwkJfSBlbHNlIHsKKwkJCXN3aXRjaCAocC0+cG9saWN5 KSB7CisJCQkJY2FzZSBTQ0hFRF9CQVRDSDoKKwkJCQkJaWYgKHBvbGljeSA9PSBTQ0hFRF9CQVRD SCkKKwkJCQkJCWdvdG8gb3V0OworCQkJCQlpZiAocG9saWN5ICE9IFNDSEVEX0lETEVQUklPKQor CQkJCQkJcmV0dXJuIC1FUEVSTTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBTQ0hFRF9JRExFUFJJ TzoKKwkJCQkJaWYgKHBvbGljeSA9PSBTQ0hFRF9JRExFUFJJTykKKwkJCQkJCWdvdG8gb3V0Owor CQkJCQlyZXR1cm4gLUVQRVJNOworCQkJCWRlZmF1bHQ6CisJCQkJCWJyZWFrOworCQkJfQorCQl9 CisKKwkJLyogY2FuJ3QgY2hhbmdlIG90aGVyIHVzZXIncyBwcmlvcml0aWVzICovCisJCWlmICgh Y2hlY2tfc2FtZV9vd25lcihwKSkKKwkJCXJldHVybiAtRVBFUk07CisKKwkJLyogTm9ybWFsIHVz ZXJzIHNoYWxsIG5vdCByZXNldCB0aGUgc2NoZWRfcmVzZXRfb25fZm9yayBmbGFnICovCisJCWlm IChwLT5zY2hlZF9yZXNldF9vbl9mb3JrICYmICFyZXNldF9vbl9mb3JrKQorCQkJcmV0dXJuIC1F UEVSTTsKKwl9CisKKwlpZiAodXNlcikgeworCQlyZXR2YWwgPSBzZWN1cml0eV90YXNrX3NldHNj aGVkdWxlcihwKTsKKwkJaWYgKHJldHZhbCkKKwkJCXJldHVybiByZXR2YWw7CisJfQorCisJLyoK KwkgKiBtYWtlIHN1cmUgbm8gUEktd2FpdGVycyBhcnJpdmUgKG9yIGxlYXZlKSB3aGlsZSB3ZSBh cmUKKwkgKiBjaGFuZ2luZyB0aGUgcHJpb3JpdHkgb2YgdGhlIHRhc2s6CisJICovCisJcmF3X3Nw aW5fbG9ja19pcnFzYXZlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJLyoKKwkgKiBUbyBiZSBhYmxl IHRvIGNoYW5nZSBwLT5wb2xpY3kgc2FmZWx5LCB0aGUgZ3J1bnF1ZXVlIGxvY2sgbXVzdCBiZQor CSAqIGhlbGQuCisJICovCisJcnEgPSBfX3Rhc2tfZ3JxX2xvY2socCk7CisKKwkvKgorCSAqIENo YW5naW5nIHRoZSBwb2xpY3kgb2YgdGhlIHN0b3AgdGhyZWFkcyBpdHMgYSB2ZXJ5IGJhZCBpZGVh CisJICovCisJaWYgKHAgPT0gcnEtPnN0b3ApIHsKKwkJX190YXNrX2dycV91bmxvY2soKTsKKwkJ cmF3X3NwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnAtPnBpX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBJZiBub3QgY2hhbmdpbmcgYW55dGhpbmcgdGhlcmUn cyBubyBuZWVkIHRvIHByb2NlZWQgZnVydGhlcjoKKwkgKi8KKwlpZiAodW5saWtlbHkocG9saWN5 ID09IHAtPnBvbGljeSAmJiAoIWlzX3J0X3BvbGljeShwb2xpY3kpIHx8CisJCQlwYXJhbS0+c2No ZWRfcHJpb3JpdHkgPT0gcC0+cnRfcHJpb3JpdHkpKSkgeworCisJCV9fdGFza19ncnFfdW5sb2Nr KCk7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJ CXJldHVybiAwOworCX0KKworCS8qIHJlY2hlY2sgcG9saWN5IG5vdyB3aXRoIHJxIGxvY2sgaGVs ZCAqLworCWlmICh1bmxpa2VseShvbGRwb2xpY3kgIT0gLTEgJiYgb2xkcG9saWN5ICE9IHAtPnBv bGljeSkpIHsKKwkJcG9saWN5ID0gb2xkcG9saWN5ID0gLTE7CisJCV9fdGFza19ncnFfdW5sb2Nr KCk7CisJCXJhd19zcGluX3VubG9ja19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CisJ CWdvdG8gcmVjaGVjazsKKwl9CisJcC0+c2NoZWRfcmVzZXRfb25fZm9yayA9IHJlc2V0X29uX2Zv cms7CisKKwlxdWV1ZWQgPSB0YXNrX3F1ZXVlZChwKTsKKwlfX3NldHNjaGVkdWxlcihwLCBycSwg cG9saWN5LCBwYXJhbS0+c2NoZWRfcHJpb3JpdHkpOworCWlmIChxdWV1ZWQpIHsKKwkJdHJ5X3By ZWVtcHQocCwgcnEpOworCX0KKwlfX3Rhc2tfZ3JxX3VubG9jaygpOworCXJhd19zcGluX3VubG9j a19pcnFyZXN0b3JlKCZwLT5waV9sb2NrLCBmbGFncyk7CisKKwlydF9tdXRleF9hZGp1c3RfcGko cCk7CitvdXQ6CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICogc2NoZWRfc2V0c2NoZWR1bGVyIC0g Y2hhbmdlIHRoZSBzY2hlZHVsaW5nIHBvbGljeSBhbmQvb3IgUlQgcHJpb3JpdHkgb2YgYSB0aHJl YWQuCisgKiBAcDogdGhlIHRhc2sgaW4gcXVlc3Rpb24uCisgKiBAcG9saWN5OiBuZXcgcG9saWN5 LgorICogQHBhcmFtOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgbmV3IFJUIHByaW9yaXR5Lgor ICoKKyAqIE5PVEUgdGhhdCB0aGUgdGFzayBtYXkgYmUgYWxyZWFkeSBkZWFkLgorICovCitpbnQg c2NoZWRfc2V0c2NoZWR1bGVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IHBvbGljeSwKKwkJ CSAgIGNvbnN0IHN0cnVjdCBzY2hlZF9wYXJhbSAqcGFyYW0pCit7CisJcmV0dXJuIF9fc2NoZWRf c2V0c2NoZWR1bGVyKHAsIHBvbGljeSwgcGFyYW0sIHRydWUpOworfQorCitFWFBPUlRfU1lNQk9M X0dQTChzY2hlZF9zZXRzY2hlZHVsZXIpOworCisvKioKKyAqIHNjaGVkX3NldHNjaGVkdWxlcl9u b2NoZWNrIC0gY2hhbmdlIHRoZSBzY2hlZHVsaW5nIHBvbGljeSBhbmQvb3IgUlQgcHJpb3JpdHkg b2YgYSB0aHJlYWQgZnJvbSBrZXJuZWxzcGFjZS4KKyAqIEBwOiB0aGUgdGFzayBpbiBxdWVzdGlv bi4KKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kuCisgKiBAcGFyYW06IHN0cnVjdHVyZSBjb250YWlu aW5nIHRoZSBuZXcgUlQgcHJpb3JpdHkuCisgKgorICogSnVzdCBsaWtlIHNjaGVkX3NldHNjaGVk dWxlciwgb25seSBkb24ndCBib3RoZXIgY2hlY2tpbmcgaWYgdGhlCisgKiBjdXJyZW50IGNvbnRl eHQgaGFzIHBlcm1pc3Npb24uICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBuZWVkZWQgaW4KKyAqIHN0 b3BfbWFjaGluZSgpOiB3ZSBjcmVhdGUgdGVtcG9yYXJ5IGhpZ2ggcHJpb3JpdHkgd29ya2VyIHRo cmVhZHMsCisgKiBidXQgb3VyIGNhbGxlciBtaWdodCBub3QgaGF2ZSB0aGF0IGNhcGFiaWxpdHku CisgKi8KK2ludCBzY2hlZF9zZXRzY2hlZHVsZXJfbm9jaGVjayhzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnAsIGludCBwb2xpY3ksCisJCQkJICAgY29uc3Qgc3RydWN0IHNjaGVkX3BhcmFtICpwYXJhbSkK K3sKKwlyZXR1cm4gX19zY2hlZF9zZXRzY2hlZHVsZXIocCwgcG9saWN5LCBwYXJhbSwgZmFsc2Up OworfQorCitzdGF0aWMgaW50Citkb19zY2hlZF9zZXRzY2hlZHVsZXIocGlkX3QgcGlkLCBpbnQg cG9saWN5LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc2No ZWRfcGFyYW0gbHBhcmFtOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKKwlpbnQgcmV0dmFsOwor CisJaWYgKCFwYXJhbSB8fCBwaWQgPCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY29weV9m cm9tX3VzZXIoJmxwYXJhbSwgcGFyYW0sIHNpemVvZihzdHJ1Y3Qgc2NoZWRfcGFyYW0pKSkKKwkJ cmV0dXJuIC1FRkFVTFQ7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJcmV0dmFsID0gLUVTUkNIOwor CXAgPSBmaW5kX3Byb2Nlc3NfYnlfcGlkKHBpZCk7CisJaWYgKHAgIT0gTlVMTCkKKwkJcmV0dmFs ID0gc2NoZWRfc2V0c2NoZWR1bGVyKHAsIHBvbGljeSwgJmxwYXJhbSk7CisJcmN1X3JlYWRfdW5s b2NrKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKioKKyAqIHN5c19zY2hlZF9zZXRzY2hl ZHVsZXIgLSBzZXQvY2hhbmdlIHRoZSBzY2hlZHVsZXIgcG9saWN5IGFuZCBSVCBwcmlvcml0eQor ICogQHBpZDogdGhlIHBpZCBpbiBxdWVzdGlvbi4KKyAqIEBwb2xpY3k6IG5ldyBwb2xpY3kuCisg KiBAcGFyYW06IHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBuZXcgUlQgcHJpb3JpdHkuCisgKi8K K2FzbWxpbmthZ2UgbG9uZyBzeXNfc2NoZWRfc2V0c2NoZWR1bGVyKHBpZF90IHBpZCwgaW50IHBv bGljeSwKKwkJCQkJICAgc3RydWN0IHNjaGVkX3BhcmFtIF9fdXNlciAqcGFyYW0pCit7CisJLyog bmVnYXRpdmUgdmFsdWVzIGZvciBwb2xpY3kgYXJlIG5vdCB2YWxpZCAqLworCWlmIChwb2xpY3kg PCAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBkb19zY2hlZF9zZXRzY2hlZHVsZXIo cGlkLCBwb2xpY3ksIHBhcmFtKTsKK30KKworLyoqCisgKiBzeXNfc2NoZWRfc2V0cGFyYW0gLSBz ZXQvY2hhbmdlIHRoZSBSVCBwcmlvcml0eSBvZiBhIHRocmVhZAorICogQHBpZDogdGhlIHBpZCBp biBxdWVzdGlvbi4KKyAqIEBwYXJhbTogc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIG5ldyBSVCBw cmlvcml0eS4KKyAqLworU1lTQ0FMTF9ERUZJTkUyKHNjaGVkX3NldHBhcmFtLCBwaWRfdCwgcGlk LCBzdHJ1Y3Qgc2NoZWRfcGFyYW0gX191c2VyICosIHBhcmFtKQoreworCXJldHVybiBkb19zY2hl ZF9zZXRzY2hlZHVsZXIocGlkLCAtMSwgcGFyYW0pOworfQorCisvKioKKyAqIHN5c19zY2hlZF9n ZXRzY2hlZHVsZXIgLSBnZXQgdGhlIHBvbGljeSAoc2NoZWR1bGluZyBjbGFzcykgb2YgYSB0aHJl YWQKKyAqIEBwaWQ6IHRoZSBwaWQgaW4gcXVlc3Rpb24uCisgKi8KK1NZU0NBTExfREVGSU5FMShz Y2hlZF9nZXRzY2hlZHVsZXIsIHBpZF90LCBwaWQpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICpw OworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJaWYgKHBpZCA8IDApCisJCWdvdG8gb3V0X25v dW5sb2NrOworCisJcmV0dmFsID0gLUVTUkNIOworCXJjdV9yZWFkX2xvY2soKTsKKwlwID0gZmlu ZF9wcm9jZXNzX2J5X3BpZChwaWQpOworCWlmIChwKSB7CisJCXJldHZhbCA9IHNlY3VyaXR5X3Rh c2tfZ2V0c2NoZWR1bGVyKHApOworCQlpZiAoIXJldHZhbCkKKwkJCXJldHZhbCA9IHAtPnBvbGlj eTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKK291dF9ub3VubG9jazoKKwlyZXR1cm4gcmV0 dmFsOworfQorCisvKioKKyAqIHN5c19zY2hlZF9nZXRzY2hlZHVsZXIgLSBnZXQgdGhlIFJUIHBy aW9yaXR5IG9mIGEgdGhyZWFkCisgKiBAcGlkOiB0aGUgcGlkIGluIHF1ZXN0aW9uLgorICogQHBh cmFtOiBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgUlQgcHJpb3JpdHkuCisgKi8KK1NZU0NBTExf REVGSU5FMihzY2hlZF9nZXRwYXJhbSwgcGlkX3QsIHBpZCwgc3RydWN0IHNjaGVkX3BhcmFtIF9f dXNlciAqLCBwYXJhbSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gbHA7CisJc3RydWN0IHRhc2tf c3RydWN0ICpwOworCWludCByZXR2YWwgPSAtRUlOVkFMOworCisJaWYgKCFwYXJhbSB8fCBwaWQg PCAwKQorCQlnb3RvIG91dF9ub3VubG9jazsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwID0gZmlu ZF9wcm9jZXNzX2J5X3BpZChwaWQpOworCXJldHZhbCA9IC1FU1JDSDsKKwlpZiAoIXApCisJCWdv dG8gb3V0X3VubG9jazsKKworCXJldHZhbCA9IHNlY3VyaXR5X3Rhc2tfZ2V0c2NoZWR1bGVyKHAp OworCWlmIChyZXR2YWwpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWxwLnNjaGVkX3ByaW9yaXR5 ID0gcC0+cnRfcHJpb3JpdHk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwkvKgorCSAqIFRoaXMg b25lIG1pZ2h0IHNsZWVwLCB3ZSBjYW5ub3QgZG8gaXQgd2l0aCBhIHNwaW5sb2NrIGhlbGQgLi4u CisJICovCisJcmV0dmFsID0gY29weV90b191c2VyKHBhcmFtLCAmbHAsIHNpemVvZigqcGFyYW0p KSA/IC1FRkFVTFQgOiAwOworCitvdXRfbm91bmxvY2s6CisJcmV0dXJuIHJldHZhbDsKKworb3V0 X3VubG9jazoKKwlyY3VfcmVhZF91bmxvY2soKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitsb25n IHNjaGVkX3NldGFmZmluaXR5KHBpZF90IHBpZCwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmluX21h c2spCit7CisJY3B1bWFza192YXJfdCBjcHVzX2FsbG93ZWQsIG5ld19tYXNrOworCXN0cnVjdCB0 YXNrX3N0cnVjdCAqcDsKKwlpbnQgcmV0dmFsOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJcmN1 X3JlYWRfbG9jaygpOworCisJcCA9IGZpbmRfcHJvY2Vzc19ieV9waWQocGlkKTsKKwlpZiAoIXAp IHsKKwkJcmN1X3JlYWRfdW5sb2NrKCk7CisJCXB1dF9vbmxpbmVfY3B1cygpOworCQlyZXR1cm4g LUVTUkNIOworCX0KKworCS8qIFByZXZlbnQgcCBnb2luZyBhd2F5ICovCisJZ2V0X3Rhc2tfc3Ry dWN0KHApOworCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcigm Y3B1c19hbGxvd2VkLCBHRlBfS0VSTkVMKSkgeworCQlyZXR2YWwgPSAtRU5PTUVNOworCQlnb3Rv IG91dF9wdXRfdGFzazsKKwl9CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmbmV3X21hc2ssIEdG UF9LRVJORUwpKSB7CisJCXJldHZhbCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X2ZyZWVfY3B1c19h bGxvd2VkOworCX0KKwlyZXR2YWwgPSAtRVBFUk07CisJaWYgKCFjaGVja19zYW1lX293bmVyKHAp ICYmICFuc19jYXBhYmxlKHRhc2tfdXNlcl9ucyhwKSwgQ0FQX1NZU19OSUNFKSkKKwkJZ290byBv dXRfdW5sb2NrOworCisJcmV0dmFsID0gc2VjdXJpdHlfdGFza19zZXRzY2hlZHVsZXIocCk7CisJ aWYgKHJldHZhbCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJY3B1c2V0X2NwdXNfYWxsb3dlZChw LCBjcHVzX2FsbG93ZWQpOworCWNwdW1hc2tfYW5kKG5ld19tYXNrLCBpbl9tYXNrLCBjcHVzX2Fs bG93ZWQpOworYWdhaW46CisJcmV0dmFsID0gc2V0X2NwdXNfYWxsb3dlZF9wdHIocCwgbmV3X21h c2spOworCisJaWYgKCFyZXR2YWwpIHsKKwkJY3B1c2V0X2NwdXNfYWxsb3dlZChwLCBjcHVzX2Fs bG93ZWQpOworCQlpZiAoIWNwdW1hc2tfc3Vic2V0KG5ld19tYXNrLCBjcHVzX2FsbG93ZWQpKSB7 CisJCQkvKgorCQkJICogV2UgbXVzdCBoYXZlIHJhY2VkIHdpdGggYSBjb25jdXJyZW50IGNwdXNl dAorCQkJICogdXBkYXRlLiBKdXN0IHJlc2V0IHRoZSBjcHVzX2FsbG93ZWQgdG8gdGhlCisJCQkg KiBjcHVzZXQncyBjcHVzX2FsbG93ZWQKKwkJCSAqLworCQkJY3B1bWFza19jb3B5KG5ld19tYXNr LCBjcHVzX2FsbG93ZWQpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCX0KK291dF91bmxvY2s6CisJ ZnJlZV9jcHVtYXNrX3ZhcihuZXdfbWFzayk7CitvdXRfZnJlZV9jcHVzX2FsbG93ZWQ6CisJZnJl ZV9jcHVtYXNrX3ZhcihjcHVzX2FsbG93ZWQpOworb3V0X3B1dF90YXNrOgorCXB1dF90YXNrX3N0 cnVjdChwKTsKKwlwdXRfb25saW5lX2NwdXMoKTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitzdGF0 aWMgaW50IGdldF91c2VyX2NwdV9tYXNrKHVuc2lnbmVkIGxvbmcgX191c2VyICp1c2VyX21hc2tf cHRyLCB1bnNpZ25lZCBsZW4sCisJCQkJIGNwdW1hc2tfdCAqbmV3X21hc2spCit7CisJaWYgKGxl biA8IHNpemVvZihjcHVtYXNrX3QpKSB7CisJCW1lbXNldChuZXdfbWFzaywgMCwgc2l6ZW9mKGNw dW1hc2tfdCkpOworCX0gZWxzZSBpZiAobGVuID4gc2l6ZW9mKGNwdW1hc2tfdCkpIHsKKwkJbGVu ID0gc2l6ZW9mKGNwdW1hc2tfdCk7CisJfQorCXJldHVybiBjb3B5X2Zyb21fdXNlcihuZXdfbWFz aywgdXNlcl9tYXNrX3B0ciwgbGVuKSA/IC1FRkFVTFQgOiAwOworfQorCisKKy8qKgorICogc3lz X3NjaGVkX3NldGFmZmluaXR5IC0gc2V0IHRoZSBjcHUgYWZmaW5pdHkgb2YgYSBwcm9jZXNzCisg KiBAcGlkOiBwaWQgb2YgdGhlIHByb2Nlc3MKKyAqIEBsZW46IGxlbmd0aCBpbiBieXRlcyBvZiB0 aGUgYml0bWFzayBwb2ludGVkIHRvIGJ5IHVzZXJfbWFza19wdHIKKyAqIEB1c2VyX21hc2tfcHRy OiB1c2VyLXNwYWNlIHBvaW50ZXIgdG8gdGhlIG5ldyBjcHUgbWFzaworICovCitTWVNDQUxMX0RF RklORTMoc2NoZWRfc2V0YWZmaW5pdHksIHBpZF90LCBwaWQsIHVuc2lnbmVkIGludCwgbGVuLAor CQl1bnNpZ25lZCBsb25nIF9fdXNlciAqLCB1c2VyX21hc2tfcHRyKQoreworCWNwdW1hc2tfdmFy X3QgbmV3X21hc2s7CisJaW50IHJldHZhbDsKKworCWlmICghYWxsb2NfY3B1bWFza192YXIoJm5l d19tYXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyZXR2YWwgPSBnZXRf dXNlcl9jcHVfbWFzayh1c2VyX21hc2tfcHRyLCBsZW4sIG5ld19tYXNrKTsKKwlpZiAocmV0dmFs ID09IDApCisJCXJldHZhbCA9IHNjaGVkX3NldGFmZmluaXR5KHBpZCwgbmV3X21hc2spOworCWZy ZWVfY3B1bWFza192YXIobmV3X21hc2spOworCXJldHVybiByZXR2YWw7Cit9CisKK2xvbmcgc2No ZWRfZ2V0YWZmaW5pdHkocGlkX3QgcGlkLCBjcHVtYXNrX3QgKm1hc2spCit7CisJc3RydWN0IHRh c2tfc3RydWN0ICpwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldHZhbDsKKworCWdl dF9vbmxpbmVfY3B1cygpOworCXJjdV9yZWFkX2xvY2soKTsKKworCXJldHZhbCA9IC1FU1JDSDsK KwlwID0gZmluZF9wcm9jZXNzX2J5X3BpZChwaWQpOworCWlmICghcCkKKwkJZ290byBvdXRfdW5s b2NrOworCisJcmV0dmFsID0gc2VjdXJpdHlfdGFza19nZXRzY2hlZHVsZXIocCk7CisJaWYgKHJl dHZhbCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZ3JxX2xvY2tfaXJxc2F2ZSgmZmxhZ3MpOwor CWNwdW1hc2tfYW5kKG1hc2ssIHRza19jcHVzX2FsbG93ZWQocCksIGNwdV9vbmxpbmVfbWFzayk7 CisJZ3JxX3VubG9ja19pcnFyZXN0b3JlKCZmbGFncyk7CisKK291dF91bmxvY2s6CisJcmN1X3Jl YWRfdW5sb2NrKCk7CisJcHV0X29ubGluZV9jcHVzKCk7CisKKwlyZXR1cm4gcmV0dmFsOworfQor CisvKioKKyAqIHN5c19zY2hlZF9nZXRhZmZpbml0eSAtIGdldCB0aGUgY3B1IGFmZmluaXR5IG9m IGEgcHJvY2VzcworICogQHBpZDogcGlkIG9mIHRoZSBwcm9jZXNzCisgKiBAbGVuOiBsZW5ndGgg aW4gYnl0ZXMgb2YgdGhlIGJpdG1hc2sgcG9pbnRlZCB0byBieSB1c2VyX21hc2tfcHRyCisgKiBA dXNlcl9tYXNrX3B0cjogdXNlci1zcGFjZSBwb2ludGVyIHRvIGhvbGQgdGhlIGN1cnJlbnQgY3B1 IG1hc2sKKyAqLworU1lTQ0FMTF9ERUZJTkUzKHNjaGVkX2dldGFmZmluaXR5LCBwaWRfdCwgcGlk LCB1bnNpZ25lZCBpbnQsIGxlbiwKKwkJdW5zaWduZWQgbG9uZyBfX3VzZXIgKiwgdXNlcl9tYXNr X3B0cikKK3sKKwlpbnQgcmV0OworCWNwdW1hc2tfdmFyX3QgbWFzazsKKworCWlmICgobGVuICog QklUU19QRVJfQllURSkgPCBucl9jcHVfaWRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAobGVu ICYgKHNpemVvZih1bnNpZ25lZCBsb25nKS0xKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAo IWFsbG9jX2NwdW1hc2tfdmFyKCZtYXNrLCBHRlBfS0VSTkVMKSkKKwkJcmV0dXJuIC1FTk9NRU07 CisKKwlyZXQgPSBzY2hlZF9nZXRhZmZpbml0eShwaWQsIG1hc2spOworCWlmIChyZXQgPT0gMCkg eworCQlzaXplX3QgcmV0bGVuID0gbWluX3Qoc2l6ZV90LCBsZW4sIGNwdW1hc2tfc2l6ZSgpKTsK KworCQlpZiAoY29weV90b191c2VyKHVzZXJfbWFza19wdHIsIG1hc2ssIHJldGxlbikpCisJCQly ZXQgPSAtRUZBVUxUOworCQllbHNlCisJCQlyZXQgPSByZXRsZW47CisJfQorCWZyZWVfY3B1bWFz a192YXIobWFzayk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHN5c19zY2hlZF95aWVs ZCAtIHlpZWxkIHRoZSBjdXJyZW50IHByb2Nlc3NvciB0byBvdGhlciB0aHJlYWRzLgorICoKKyAq IFRoaXMgZnVuY3Rpb24geWllbGRzIHRoZSBjdXJyZW50IENQVSB0byBvdGhlciB0YXNrcy4gSXQg ZG9lcyB0aGlzIGJ5CisgKiBzY2hlZHVsaW5nIGF3YXkgdGhlIGN1cnJlbnQgdGFzay4gCisgKi8K K1NZU0NBTExfREVGSU5FMChzY2hlZF95aWVsZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnA7 CisKKwlwID0gY3VycmVudDsKKwlncnFfbG9ja19pcnEoKTsKKwlyZXF1ZXVlX3Rhc2socCk7CisK KwkvKgorCSAqIFNpbmNlIHdlIGFyZSBnb2luZyB0byBjYWxsIHNjaGVkdWxlKCkgYW55d2F5LCB0 aGVyZSdzCisJICogbm8gbmVlZCB0byBwcmVlbXB0IG9yIGVuYWJsZSBpbnRlcnJ1cHRzOgorCSAq LworCV9fcmVsZWFzZShncnEubG9jayk7CisJc3Bpbl9yZWxlYXNlKCZncnEubG9jay5kZXBfbWFw LCAxLCBfVEhJU19JUF8pOworCWRvX3Jhd19zcGluX3VubG9jaygmZ3JxLmxvY2spOworCXNjaGVk X3ByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKworCXNjaGVkdWxlKCk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGlubGluZSBib29sIHNob3VsZF9yZXNjaGVkKHZvaWQpCit7CisJcmV0 dXJuIG5lZWRfcmVzY2hlZCgpICYmICEocHJlZW1wdF9jb3VudCgpICYgUFJFRU1QVF9BQ1RJVkUp OworfQorCitzdGF0aWMgdm9pZCBfX2NvbmRfcmVzY2hlZCh2b2lkKQoreworCS8qIE5PVCBhIHJl YWwgZml4IGJ1dCB3aWxsIG1ha2Ugdm9sdW50YXJ5IHByZWVtcHQgd29yay4g6aas6bm/44Gq5LqL ICovCisJaWYgKHVubGlrZWx5KHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fUlVOTklORykpCisJCXJl dHVybjsKKworCWFkZF9wcmVlbXB0X2NvdW50KFBSRUVNUFRfQUNUSVZFKTsKKwlzY2hlZHVsZSgp OworCXN1Yl9wcmVlbXB0X2NvdW50KFBSRUVNUFRfQUNUSVZFKTsKK30KKworaW50IF9fc2NoZWQg X2NvbmRfcmVzY2hlZCh2b2lkKQoreworCWlmIChzaG91bGRfcmVzY2hlZCgpKSB7CisJCV9fY29u ZF9yZXNjaGVkKCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1C T0woX2NvbmRfcmVzY2hlZCk7CisKKy8qCisgKiBfX2NvbmRfcmVzY2hlZF9sb2NrKCkgLSBpZiBh IHJlc2NoZWR1bGUgaXMgcGVuZGluZywgZHJvcCB0aGUgZ2l2ZW4gbG9jaywKKyAqIGNhbGwgc2No ZWR1bGUsIGFuZCBvbiByZXR1cm4gcmVhY3F1aXJlIHRoZSBsb2NrLgorICoKKyAqIFRoaXMgd29y a3MgT0sgYm90aCB3aXRoIGFuZCB3aXRob3V0IENPTkZJR19QUkVFTVBULiAgV2UgZG8gc3RyYW5n ZSBsb3ctbGV2ZWwKKyAqIG9wZXJhdGlvbnMgaGVyZSB0byBwcmV2ZW50IHNjaGVkdWxlKCkgZnJv bSBiZWluZyBjYWxsZWQgdHdpY2UgKG9uY2UgdmlhCisgKiBzcGluX3VubG9jaygpLCBvbmNlIGJ5 IGhhbmQpLgorICovCitpbnQgX19jb25kX3Jlc2NoZWRfbG9jayhzcGlubG9ja190ICpsb2NrKQor eworCWludCByZXNjaGVkID0gc2hvdWxkX3Jlc2NoZWQoKTsKKwlpbnQgcmV0ID0gMDsKKworCWxv Y2tkZXBfYXNzZXJ0X2hlbGQobG9jayk7CisKKwlpZiAoc3Bpbl9uZWVkYnJlYWsobG9jaykgfHwg cmVzY2hlZCkgeworCQlzcGluX3VubG9jayhsb2NrKTsKKwkJaWYgKHJlc2NoZWQpCisJCQlfX2Nv bmRfcmVzY2hlZCgpOworCQllbHNlCisJCQljcHVfcmVsYXgoKTsKKwkJcmV0ID0gMTsKKwkJc3Bp bl9sb2NrKGxvY2spOworCX0KKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChfX2NvbmRf cmVzY2hlZF9sb2NrKTsKKworaW50IF9fc2NoZWQgX19jb25kX3Jlc2NoZWRfc29mdGlycSh2b2lk KQoreworCUJVR19PTighaW5fc29mdGlycSgpKTsKKworCWlmIChzaG91bGRfcmVzY2hlZCgpKSB7 CisJCWxvY2FsX2JoX2VuYWJsZSgpOworCQlfX2NvbmRfcmVzY2hlZCgpOworCQlsb2NhbF9iaF9k aXNhYmxlKCk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0wo X19jb25kX3Jlc2NoZWRfc29mdGlycSk7CisKKy8qKgorICogeWllbGQgLSB5aWVsZCB0aGUgY3Vy cmVudCBwcm9jZXNzb3IgdG8gb3RoZXIgdGhyZWFkcy4KKyAqCisgKiBUaGlzIGlzIGEgc2hvcnRj dXQgZm9yIGtlcm5lbC1zcGFjZSB5aWVsZGluZyAtIGl0IG1hcmtzIHRoZQorICogdGhyZWFkIHJ1 bm5hYmxlIGFuZCBjYWxscyBzeXNfc2NoZWRfeWllbGQoKS4KKyAqLwordm9pZCBfX3NjaGVkIHlp ZWxkKHZvaWQpCit7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKwlzeXNfc2No ZWRfeWllbGQoKTsKK30KK0VYUE9SVF9TWU1CT0woeWllbGQpOworCisvKioKKyAqIHlpZWxkX3Rv IC0geWllbGQgdGhlIGN1cnJlbnQgcHJvY2Vzc29yIHRvIGFub3RoZXIgdGhyZWFkIGluCisgKiB5 b3VyIHRocmVhZCBncm91cCwgb3IgYWNjZWxlcmF0ZSB0aGF0IHRocmVhZCB0b3dhcmQgdGhlCisg KiBwcm9jZXNzb3IgaXQncyBvbi4KKyAqIEBwOiB0YXJnZXQgdGFzaworICogQHByZWVtcHQ6IHdo ZXRoZXIgdGFzayBwcmVlbXB0aW9uIGlzIGFsbG93ZWQgb3Igbm90CisgKgorICogSXQncyB0aGUg Y2FsbGVyJ3Mgam9iIHRvIGVuc3VyZSB0aGF0IHRoZSB0YXJnZXQgdGFzayBzdHJ1Y3QKKyAqIGNh bid0IGdvIGF3YXkgb24gdXMgYmVmb3JlIHdlIGNhbiBkbyBhbnkgY2hlY2tzLgorICoKKyAqIFJl dHVybnMgdHJ1ZSBpZiB3ZSBpbmRlZWQgYm9vc3RlZCB0aGUgdGFyZ2V0IHRhc2suCisgKi8KK2Jv b2wgX19zY2hlZCB5aWVsZF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGJvb2wgcHJlZW1wdCkK K3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJvb2wgeWllbGRlZCA9IDA7CisJc3RydWN0IHJx ICpycTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKmN1cnI7CisKKwlycSA9IHRoaXNfcnEoKTsKKwln cnFfbG9ja19pcnFzYXZlKCZmbGFncyk7CisJaWYgKHRhc2tfcnVubmluZyhwKSB8fCBwLT5zdGF0 ZSkKKwkJZ290byBvdXRfdW5sb2NrOworCXlpZWxkZWQgPSAxOworCWN1cnIgPSBycS0+Y3VycjsK KwlwLT50aW1lX3NsaWNlICs9IGN1cnItPnRpbWVfc2xpY2U7CisJY3Vyci0+dGltZV9zbGljZSA9 IDA7CisJaWYgKHAtPnRpbWVfc2xpY2UgPiB0aW1lc2xpY2UoKSkKKwkJcC0+dGltZV9zbGljZSA9 IHRpbWVzbGljZSgpOworCXNldF90c2tfbmVlZF9yZXNjaGVkKGN1cnIpOworb3V0X3VubG9jazoK KwlncnFfdW5sb2NrX2lycXJlc3RvcmUoJmZsYWdzKTsKKworCWlmICh5aWVsZGVkKQorCQlzY2hl ZHVsZSgpOworCXJldHVybiB5aWVsZGVkOworfQorRVhQT1JUX1NZTUJPTF9HUEwoeWllbGRfdG8p OworCisvKgorICogVGhpcyB0YXNrIGlzIGFib3V0IHRvIGdvIHRvIHNsZWVwIG9uIElPLiAgSW5j cmVtZW50IHJxLT5ucl9pb3dhaXQgc28KKyAqIHRoYXQgcHJvY2VzcyBhY2NvdW50aW5nIGtub3dz IHRoYXQgdGhpcyBpcyBhIHRhc2sgaW4gSU8gd2FpdCBzdGF0ZS4KKyAqCisgKiBCdXQgZG9uJ3Qg ZG8gdGhhdCBpZiBpdCBpcyBhIGRlbGliZXJhdGUsIHRocm90dGxpbmcgSU8gd2FpdCAodGhpcyB0 YXNrCisgKiBoYXMgc2V0IGl0cyBiYWNraW5nX2Rldl9pbmZvOiB0aGUgcXVldWUgYWdhaW5zdCB3 aGljaCBpdCBzaG91bGQgdGhyb3R0bGUpCisgKi8KK3ZvaWQgX19zY2hlZCBpb19zY2hlZHVsZSh2 b2lkKQoreworCXN0cnVjdCBycSAqcnEgPSByYXdfcnEoKTsKKworCWRlbGF5YWNjdF9ibGtpb19z dGFydCgpOworCWF0b21pY19pbmMoJnJxLT5ucl9pb3dhaXQpOworCWJsa19mbHVzaF9wbHVnKGN1 cnJlbnQpOworCWN1cnJlbnQtPmluX2lvd2FpdCA9IDE7CisJc2NoZWR1bGUoKTsKKwljdXJyZW50 LT5pbl9pb3dhaXQgPSAwOworCWF0b21pY19kZWMoJnJxLT5ucl9pb3dhaXQpOworCWRlbGF5YWNj dF9ibGtpb19lbmQoKTsKK30KK0VYUE9SVF9TWU1CT0woaW9fc2NoZWR1bGUpOworCitsb25nIF9f c2NoZWQgaW9fc2NoZWR1bGVfdGltZW91dChsb25nIHRpbWVvdXQpCit7CisJc3RydWN0IHJxICpy cSA9IHJhd19ycSgpOworCWxvbmcgcmV0OworCisJZGVsYXlhY2N0X2Jsa2lvX3N0YXJ0KCk7CisJ YXRvbWljX2luYygmcnEtPm5yX2lvd2FpdCk7CisJYmxrX2ZsdXNoX3BsdWcoY3VycmVudCk7CisJ Y3VycmVudC0+aW5faW93YWl0ID0gMTsKKwlyZXQgPSBzY2hlZHVsZV90aW1lb3V0KHRpbWVvdXQp OworCWN1cnJlbnQtPmluX2lvd2FpdCA9IDA7CisJYXRvbWljX2RlYygmcnEtPm5yX2lvd2FpdCk7 CisJZGVsYXlhY2N0X2Jsa2lvX2VuZCgpOworCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3lz X3NjaGVkX2dldF9wcmlvcml0eV9tYXggLSByZXR1cm4gbWF4aW11bSBSVCBwcmlvcml0eS4KKyAq IEBwb2xpY3k6IHNjaGVkdWxpbmcgY2xhc3MuCisgKgorICogdGhpcyBzeXNjYWxsIHJldHVybnMg dGhlIG1heGltdW0gcnRfcHJpb3JpdHkgdGhhdCBjYW4gYmUgdXNlZAorICogYnkgYSBnaXZlbiBz Y2hlZHVsaW5nIGNsYXNzLgorICovCitTWVNDQUxMX0RFRklORTEoc2NoZWRfZ2V0X3ByaW9yaXR5 X21heCwgaW50LCBwb2xpY3kpCit7CisJaW50IHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHBv bGljeSkgeworCWNhc2UgU0NIRURfRklGTzoKKwljYXNlIFNDSEVEX1JSOgorCQlyZXQgPSBNQVhf VVNFUl9SVF9QUklPLTE7CisJCWJyZWFrOworCWNhc2UgU0NIRURfTk9STUFMOgorCWNhc2UgU0NI RURfQkFUQ0g6CisJY2FzZSBTQ0hFRF9JRExFUFJJTzoKKwkJcmV0ID0gMDsKKwkJYnJlYWs7CisJ fQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogc3lzX3NjaGVkX2dldF9wcmlvcml0eV9taW4g LSByZXR1cm4gbWluaW11bSBSVCBwcmlvcml0eS4KKyAqIEBwb2xpY3k6IHNjaGVkdWxpbmcgY2xh c3MuCisgKgorICogdGhpcyBzeXNjYWxsIHJldHVybnMgdGhlIG1pbmltdW0gcnRfcHJpb3JpdHkg dGhhdCBjYW4gYmUgdXNlZAorICogYnkgYSBnaXZlbiBzY2hlZHVsaW5nIGNsYXNzLgorICovCitT WVNDQUxMX0RFRklORTEoc2NoZWRfZ2V0X3ByaW9yaXR5X21pbiwgaW50LCBwb2xpY3kpCit7CisJ aW50IHJldCA9IC1FSU5WQUw7CisKKwlzd2l0Y2ggKHBvbGljeSkgeworCWNhc2UgU0NIRURfRklG TzoKKwljYXNlIFNDSEVEX1JSOgorCQlyZXQgPSAxOworCQlicmVhazsKKwljYXNlIFNDSEVEX05P Uk1BTDoKKwljYXNlIFNDSEVEX0JBVENIOgorCWNhc2UgU0NIRURfSURMRVBSSU86CisJCXJldCA9 IDA7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIHN5c19zY2hlZF9y cl9nZXRfaW50ZXJ2YWwgLSByZXR1cm4gdGhlIGRlZmF1bHQgdGltZXNsaWNlIG9mIGEgcHJvY2Vz cy4KKyAqIEBwaWQ6IHBpZCBvZiB0aGUgcHJvY2Vzcy4KKyAqIEBpbnRlcnZhbDogdXNlcnNwYWNl IHBvaW50ZXIgdG8gdGhlIHRpbWVzbGljZSB2YWx1ZS4KKyAqCisgKiB0aGlzIHN5c2NhbGwgd3Jp dGVzIHRoZSBkZWZhdWx0IHRpbWVzbGljZSB2YWx1ZSBvZiBhIGdpdmVuIHByb2Nlc3MKKyAqIGlu dG8gdGhlIHVzZXItc3BhY2UgdGltZXNwZWMgYnVmZmVyLiBBIHZhbHVlIG9mICcwJyBtZWFucyBp bmZpbml0eS4KKyAqLworU1lTQ0FMTF9ERUZJTkUyKHNjaGVkX3JyX2dldF9pbnRlcnZhbCwgcGlk X3QsIHBpZCwKKwkJc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqLCBpbnRlcnZhbCkKK3sKKwlzdHJ1 Y3QgdGFza19zdHJ1Y3QgKnA7CisJdW5zaWduZWQgaW50IHRpbWVfc2xpY2U7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCB0aW1lc3BlYyB0OworCisJaWYgKHBp ZCA8IDApCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dmFsID0gLUVTUkNIOworCXJjdV9yZWFk X2xvY2soKTsKKwlwID0gZmluZF9wcm9jZXNzX2J5X3BpZChwaWQpOworCWlmICghcCkKKwkJZ290 byBvdXRfdW5sb2NrOworCisJcmV0dmFsID0gc2VjdXJpdHlfdGFza19nZXRzY2hlZHVsZXIocCk7 CisJaWYgKHJldHZhbCkKKwkJZ290byBvdXRfdW5sb2NrOworCisJZ3JxX2xvY2tfaXJxc2F2ZSgm ZmxhZ3MpOworCXRpbWVfc2xpY2UgPSBwLT5wb2xpY3kgPT0gU0NIRURfRklGTyA/IDAgOiBNU19U T19OUyhycl9pbnRlcnZhbCk7CisJZ3JxX3VubG9ja19pcnFyZXN0b3JlKCZmbGFncyk7CisKKwly Y3VfcmVhZF91bmxvY2soKTsKKwl0ID0gbnNfdG9fdGltZXNwZWModGltZV9zbGljZSk7CisJcmV0 dmFsID0gY29weV90b191c2VyKGludGVydmFsLCAmdCwgc2l6ZW9mKHQpKSA/IC1FRkFVTFQgOiAw OworCXJldHVybiByZXR2YWw7CisKK291dF91bmxvY2s6CisJcmN1X3JlYWRfdW5sb2NrKCk7CisJ cmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgc3RhdF9uYW1bXSA9IFRBU0tf U1RBVEVfVE9fQ0hBUl9TVFI7CisKK3ZvaWQgc2NoZWRfc2hvd190YXNrKHN0cnVjdCB0YXNrX3N0 cnVjdCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIGZyZWUgPSAwOworCXVuc2lnbmVkIHN0YXRlOwor CisJc3RhdGUgPSBwLT5zdGF0ZSA/IF9fZmZzKHAtPnN0YXRlKSArIDEgOiAwOworCXByaW50ayhL RVJOX0lORk8gIiUtMTUuMTVzICVjIiwgcC0+Y29tbSwKKwkJc3RhdGUgPCBzaXplb2Yoc3RhdF9u YW0pIC0gMSA/IHN0YXRfbmFtW3N0YXRlXSA6ICc/Jyk7CisjaWYgQklUU19QRVJfTE9ORyA9PSAz MgorCWlmIChzdGF0ZSA9PSBUQVNLX1JVTk5JTkcpCisJCXByaW50ayhLRVJOX0NPTlQgIiBydW5u aW5nICAiKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0NPTlQgIiAlMDhseCAiLCB0aHJlYWRfc2F2 ZWRfcGMocCkpOworI2Vsc2UKKwlpZiAoc3RhdGUgPT0gVEFTS19SVU5OSU5HKQorCQlwcmludGso S0VSTl9DT05UICIgIHJ1bm5pbmcgdGFzawkiKTsKKwllbHNlCisJCXByaW50ayhLRVJOX0NPTlQg IiAlMDE2bHggIiwgdGhyZWFkX3NhdmVkX3BjKHApKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJR19E RUJVR19TVEFDS19VU0FHRQorCWZyZWUgPSBzdGFja19ub3RfdXNlZChwKTsKKyNlbmRpZgorCXBy aW50ayhLRVJOX0NPTlQgIiU1bHUgJTVkICU2ZCAweCUwOGx4XG4iLCBmcmVlLAorCQl0YXNrX3Bp ZF9ucihwKSwgdGFza19waWRfbnIocC0+cmVhbF9wYXJlbnQpLAorCQkodW5zaWduZWQgbG9uZyl0 YXNrX3RocmVhZF9pbmZvKHApLT5mbGFncyk7CisKKwlzaG93X3N0YWNrKHAsIE5VTEwpOworfQor Cit2b2lkIHNob3dfc3RhdGVfZmlsdGVyKHVuc2lnbmVkIGxvbmcgc3RhdGVfZmlsdGVyKQorewor CXN0cnVjdCB0YXNrX3N0cnVjdCAqZywgKnA7CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisJ cHJpbnRrKEtFUk5fSU5GTworCQkiICB0YXNrCQkJCVBDIHN0YWNrICAgcGlkIGZhdGhlclxuIik7 CisjZWxzZQorCXByaW50ayhLRVJOX0lORk8KKwkJIiAgdGFzawkJCQkJCVBDIHN0YWNrICAgcGlk IGZhdGhlclxuIik7CisjZW5kaWYKKwlyY3VfcmVhZF9sb2NrKCk7CisJZG9fZWFjaF90aHJlYWQo ZywgcCkgeworCQkvKgorCQkgKiByZXNldCB0aGUgTk1JLXRpbWVvdXQsIGxpc3RpbmcgYWxsIGZp bGVzIG9uIGEgc2xvdworCQkgKiBjb25zb2xlIG1pZ2h0IHRha2UgYSBsb3Qgb2YgdGltZToKKwkJ ICovCisJCXRvdWNoX25taV93YXRjaGRvZygpOworCQlpZiAoIXN0YXRlX2ZpbHRlciB8fCAocC0+ c3RhdGUgJiBzdGF0ZV9maWx0ZXIpKQorCQkJc2NoZWRfc2hvd190YXNrKHApOworCX0gd2hpbGVf ZWFjaF90aHJlYWQoZywgcCk7CisKKwl0b3VjaF9hbGxfc29mdGxvY2t1cF93YXRjaGRvZ3MoKTsK KworCXJjdV9yZWFkX3VubG9jaygpOworCS8qCisJICogT25seSBzaG93IGxvY2tzIGlmIGFsbCB0 YXNrcyBhcmUgZHVtcGVkOgorCSAqLworCWlmICghc3RhdGVfZmlsdGVyKQorCQlkZWJ1Z19zaG93 X2FsbF9sb2NrcygpOworfQorCisjaWZkZWYgQ09ORklHX1NNUAordm9pZCBkb19zZXRfY3B1c19h bGxvd2VkKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm5ld19t YXNrKQoreworCWNwdW1hc2tfY29weSh0c2tfY3B1c19hbGxvd2VkKHApLCBuZXdfbWFzayk7Cit9 CisjZW5kaWYKKworLyoqCisgKiBpbml0X2lkbGUgLSBzZXQgdXAgYW4gaWRsZSB0aHJlYWQgZm9y IGEgZ2l2ZW4gQ1BVCisgKiBAaWRsZTogdGFzayBpbiBxdWVzdGlvbgorICogQGNwdTogY3B1IHRo ZSBpZGxlIHRhc2sgYmVsb25ncyB0bworICoKKyAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gZG9lcyBu b3Qgc2V0IHRoZSBpZGxlIHRocmVhZCdzIE5FRURfUkVTQ0hFRAorICogZmxhZywgdG8gbWFrZSBi b290aW5nIG1vcmUgcm9idXN0LgorICovCit2b2lkIGluaXRfaWRsZShzdHJ1Y3QgdGFza19zdHJ1 Y3QgKmlkbGUsIGludCBjcHUpCit7CisJc3RydWN0IHJxICpycSA9IGNwdV9ycShjcHUpOworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisKKwl0aW1lX2dycV9sb2NrKHJxLCAmZmxhZ3MpOworCWlkbGUt Pmxhc3RfcmFuID0gcnEtPmNsb2NrOworCWlkbGUtPnN0YXRlID0gVEFTS19SVU5OSU5HOworCS8q IFNldHRpbmcgcHJpbyB0byBpbGxlZ2FsIHZhbHVlIHNob3VsZG4ndCBtYXR0ZXIgd2hlbiBuZXZl ciBxdWV1ZWQgKi8KKwlpZGxlLT5wcmlvID0gUFJJT19MSU1JVDsKKwlpZGxlLT5wb2xpY3kgPSBT Q0hFRF9JRExFOworCXNldF9ycV90YXNrKHJxLCBpZGxlKTsKKwlkb19zZXRfY3B1c19hbGxvd2Vk KGlkbGUsICZjcHVtYXNrX29mX2NwdShjcHUpKTsKKwkvKiBTaWxlbmNlIFBST1ZFX1JDVSAqLwor CXJjdV9yZWFkX2xvY2soKTsKKwlzZXRfdGFza19jcHUoaWRsZSwgY3B1KTsKKwlyY3VfcmVhZF91 bmxvY2soKTsKKwlycS0+Y3VyciA9IHJxLT5pZGxlID0gaWRsZTsKKwlpZGxlLT5vbl9jcHUgPSAx OworCWdycV91bmxvY2tfaXJxcmVzdG9yZSgmZmxhZ3MpOworCisJLyogU2V0IHRoZSBwcmVlbXB0 IGNvdW50IF9vdXRzaWRlXyB0aGUgc3BpbmxvY2tzISAqLworCXRhc2tfdGhyZWFkX2luZm8oaWRs ZSktPnByZWVtcHRfY291bnQgPSAwOworCisJZnRyYWNlX2dyYXBoX2luaXRfaWRsZV90YXNrKGlk bGUsIGNwdSk7CisjaWYgZGVmaW5lZChDT05GSUdfU01QKQorCXNwcmludGYoaWRsZS0+Y29tbSwg IiVzLyVkIiwgSU5JVF9UQVNLX0NPTU0sIGNwdSk7CisjZW5kaWYKK30KKworI2lmZGVmIENPTkZJ R19TTVAKKyNpZmRlZiBDT05GSUdfTk9fSFoKK3ZvaWQgc2VsZWN0X25vaHpfbG9hZF9iYWxhbmNl cihpbnQgc3RvcF90aWNrKQoreworfQorCit2b2lkIHNldF9jcHVfc2Rfc3RhdGVfaWRsZSh2b2lk KSB7fQorI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX01DKSB8fCBkZWZpbmVkKENPTkZJR19TQ0hF RF9TTVQpCisvKioKKyAqIGxvd2VzdF9mbGFnX2RvbWFpbiAtIFJldHVybiBsb3dlc3Qgc2NoZWRf ZG9tYWluIGNvbnRhaW5pbmcgZmxhZy4KKyAqIEBjcHU6CVRoZSBjcHUgd2hvc2UgbG93ZXN0IGxl dmVsIG9mIHNjaGVkIGRvbWFpbiBpcyB0bworICoJCWJlIHJldHVybmVkLgorICogQGZsYWc6CVRo ZSBmbGFnIHRvIGNoZWNrIGZvciB0aGUgbG93ZXN0IHNjaGVkX2RvbWFpbgorICoJCWZvciB0aGUg Z2l2ZW4gY3B1LgorICoKKyAqIFJldHVybnMgdGhlIGxvd2VzdCBzY2hlZF9kb21haW4gb2YgYSBj cHUgd2hpY2ggY29udGFpbnMgdGhlIGdpdmVuIGZsYWcuCisgKi8KK3N0YXRpYyBpbmxpbmUgc3Ry dWN0IHNjaGVkX2RvbWFpbiAqbG93ZXN0X2ZsYWdfZG9tYWluKGludCBjcHUsIGludCBmbGFnKQor eworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCisJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2Qp CisJCWlmIChzZCAmJiAoc2QtPmZsYWdzICYgZmxhZykpCisJCQlicmVhazsKKworCXJldHVybiBz ZDsKK30KKworLyoqCisgKiBmb3JfZWFjaF9mbGFnX2RvbWFpbiAtIEl0ZXJhdGVzIG92ZXIgc2No ZWRfZG9tYWlucyBjb250YWluaW5nIHRoZSBmbGFnLgorICogQGNwdToJVGhlIGNwdSB3aG9zZSBk b21haW5zIHdlJ3JlIGl0ZXJhdGluZyBvdmVyLgorICogQHNkOgkJdmFyaWFibGUgaG9sZGluZyB0 aGUgdmFsdWUgb2YgdGhlIHBvd2VyX3NhdmluZ3Nfc2QKKyAqCQlmb3IgY3B1LgorICogQGZsYWc6 CVRoZSBmbGFnIHRvIGZpbHRlciB0aGUgc2NoZWRfZG9tYWlucyB0byBiZSBpdGVyYXRlZC4KKyAq CisgKiBJdGVyYXRlcyBvdmVyIGFsbCB0aGUgc2NoZWR1bGVyIGRvbWFpbnMgZm9yIGEgZ2l2ZW4g Y3B1IHRoYXQgaGFzIHRoZSAnZmxhZycKKyAqIHNldCwgc3RhcnRpbmcgZnJvbSB0aGUgbG93ZXN0 IHNjaGVkX2RvbWFpbiB0byB0aGUgaGlnaGVzdC4KKyAqLworI2RlZmluZSBmb3JfZWFjaF9mbGFn X2RvbWFpbihjcHUsIHNkLCBmbGFnKSBcCisJZm9yIChzZCA9IGxvd2VzdF9mbGFnX2RvbWFpbihj cHUsIGZsYWcpOyBcCisJCShzZCAmJiAoc2QtPmZsYWdzICYgZmxhZykpOyBzZCA9IHNkLT5wYXJl bnQpCisKKyNlbmRpZiAvKiAgKENPTkZJR19TQ0hFRF9NQyB8fCBDT05GSUdfU0NIRURfU01UKSAq LworCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzY2hlZF9jcHUoaW50IGNwdSkKK3sKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCisJZ3JxX2xvY2tfaXJxc2F2ZSgmZmxhZ3MpOworCXJlc2NoZWRfdGFz ayhjcHVfY3VycihjcHUpKTsKKwlncnFfdW5sb2NrX2lycXJlc3RvcmUoJmZsYWdzKTsKK30KKwor LyoKKyAqIEluIHRoZSBzZW1pIGlkbGUgY2FzZSwgdXNlIHRoZSBuZWFyZXN0IGJ1c3kgY3B1IGZv ciBtaWdyYXRpbmcgdGltZXJzCisgKiBmcm9tIGFuIGlkbGUgY3B1LiAgVGhpcyBpcyBnb29kIGZv ciBwb3dlci1zYXZpbmdzLgorICoKKyAqIFdlIGRvbid0IGRvIHNpbWlsYXIgb3B0aW1pemF0aW9u IGZvciBjb21wbGV0ZWx5IGlkbGUgc3lzdGVtLCBhcworICogc2VsZWN0aW5nIGFuIGlkbGUgY3B1 IHdpbGwgYWRkIG1vcmUgZGVsYXlzIHRvIHRoZSB0aW1lcnMgdGhhbiBpbnRlbmRlZAorICogKGFz IHRoYXQgY3B1J3MgdGltZXIgYmFzZSBtYXkgbm90IGJlIHVwdG9kYXRlIHdydCBqaWZmaWVzIGV0 YykuCisgKi8KK2ludCBnZXRfbm9oel90aW1lcl90YXJnZXQodm9pZCkKK3sKKwlpbnQgY3B1ID0g c21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBpOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwor CisJcmN1X3JlYWRfbG9jaygpOworCWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7CisJCWZvcl9l YWNoX2NwdShpLCBzY2hlZF9kb21haW5fc3BhbihzZCkpIHsKKwkJCWlmICghaWRsZV9jcHUoaSkp CisJCQkJY3B1ID0gaTsKKwkJCWdvdG8gdW5sb2NrOworCQl9CisJfQordW5sb2NrOgorCXJjdV9y ZWFkX3VubG9jaygpOworCXJldHVybiBjcHU7Cit9CisKKy8qCisgKiBXaGVuIGFkZF90aW1lcl9v bigpIGVucXVldWVzIGEgdGltZXIgaW50byB0aGUgdGltZXIgd2hlZWwgb2YgYW4KKyAqIGlkbGUg Q1BVIHRoZW4gdGhpcyB0aW1lciBtaWdodCBleHBpcmUgYmVmb3JlIHRoZSBuZXh0IHRpbWVyIGV2 ZW50CisgKiB3aGljaCBpcyBzY2hlZHVsZWQgdG8gd2FrZSB1cCB0aGF0IENQVS4gSW4gY2FzZSBv ZiBhIGNvbXBsZXRlbHkKKyAqIGlkbGUgc3lzdGVtIHRoZSBuZXh0IGV2ZW50IG1pZ2h0IGV2ZW4g YmUgaW5maW5pdGUgdGltZSBpbnRvIHRoZQorICogZnV0dXJlLiB3YWtlX3VwX2lkbGVfY3B1KCkg ZW5zdXJlcyB0aGF0IHRoZSBDUFUgaXMgd29rZW4gdXAgYW5kCisgKiBsZWF2ZXMgdGhlIGlubmVy IGlkbGUgbG9vcCBzbyB0aGUgbmV3bHkgYWRkZWQgdGltZXIgaXMgdGFrZW4gaW50bworICogYWNj b3VudCB3aGVuIHRoZSBDUFUgZ29lcyBiYWNrIHRvIGlkbGUgYW5kIGV2YWx1YXRlcyB0aGUgdGlt ZXIKKyAqIHdoZWVsIGZvciB0aGUgbmV4dCB0aW1lciBldmVudC4KKyAqLwordm9pZCB3YWtlX3Vw X2lkbGVfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICppZGxlOworCXN0cnVj dCBycSAqcnE7CisKKwlpZiAoY3B1ID09IHNtcF9wcm9jZXNzb3JfaWQoKSkKKwkJcmV0dXJuOwor CisJcnEgPSBjcHVfcnEoY3B1KTsKKwlpZGxlID0gcnEtPmlkbGU7CisKKwkvKgorCSAqIFRoaXMg aXMgc2FmZSwgYXMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aGUgdGltZXIKKwkgKiB3 aGVlbCBiYXNlIGxvY2sgb2YgKGNwdSkgaGVsZC4gV2hlbiB0aGUgQ1BVIGlzIG9uIHRoZSB3YXkK KwkgKiB0byBpZGxlIGFuZCBoYXMgbm90IHlldCBzZXQgcnEtPmN1cnIgdG8gaWRsZSB0aGVuIGl0 IHdpbGwKKwkgKiBiZSBzZXJpYWxpc2VkIG9uIHRoZSB0aW1lciB3aGVlbCBiYXNlIGxvY2sgYW5k IHRha2UgdGhlIG5ldworCSAqIHRpbWVyIGludG8gYWNjb3VudCBhdXRvbWF0aWNhbGx5LgorCSAq LworCWlmICh1bmxpa2VseShycS0+Y3VyciAhPSBpZGxlKSkKKwkJcmV0dXJuOworCisJLyoKKwkg KiBXZSBjYW4gc2V0IFRJRl9SRVNDSEVEIG9uIHRoZSBpZGxlIHRhc2sgb2YgdGhlIG90aGVyIENQ VQorCSAqIGxvY2tsZXNzLiBUaGUgd29yc3QgY2FzZSBpcyB0aGF0IHRoZSBvdGhlciBDUFUgcnVu cyB0aGUKKwkgKiBpZGxlIHRhc2sgdGhyb3VnaCBhbiBhZGRpdGlvbmFsIE5PT1Agc2NoZWR1bGUo KQorCSAqLworCXNldF90c2tfbmVlZF9yZXNjaGVkKGlkbGUpOworCisJLyogTkVFRF9SRVNDSEVE IG11c3QgYmUgdmlzaWJsZSBiZWZvcmUgd2UgdGVzdCBwb2xsaW5nICovCisJc21wX21iKCk7CisJ aWYgKCF0c2tfaXNfcG9sbGluZyhpZGxlKSkKKwkJc21wX3NlbmRfcmVzY2hlZHVsZShjcHUpOwor fQorCisjZW5kaWYgLyogQ09ORklHX05PX0haICovCisKKy8qCisgKiBDaGFuZ2UgYSBnaXZlbiB0 YXNrJ3MgQ1BVIGFmZmluaXR5LiBNaWdyYXRlIHRoZSB0aHJlYWQgdG8gYQorICogcHJvcGVyIENQ VSBhbmQgc2NoZWR1bGUgaXQgYXdheSBpZiB0aGUgQ1BVIGl0J3MgZXhlY3V0aW5nIG9uCisgKiBp cyByZW1vdmVkIGZyb20gdGhlIGFsbG93ZWQgYml0bWFzay4KKyAqCisgKiBOT1RFOiB0aGUgY2Fs bGVyIG11c3QgaGF2ZSBhIHZhbGlkIHJlZmVyZW5jZSB0byB0aGUgdGFzaywgdGhlCisgKiB0YXNr IG11c3Qgbm90IGV4aXQoKSAmIGRlYWxsb2NhdGUgaXRzZWxmIHByZW1hdHVyZWx5LiBUaGUKKyAq IGNhbGwgaXMgbm90IGF0b21pYzsgbm8gc3BpbmxvY2tzIG1heSBiZSBoZWxkLgorICovCitpbnQg c2V0X2NwdXNfYWxsb3dlZF9wdHIoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBzdHJ1Y3Qg Y3B1bWFzayAqbmV3X21hc2spCit7CisJYm9vbCBydW5uaW5nX3dyb25nID0gZmFsc2U7CisJYm9v bCBxdWV1ZWQgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBycSAqcnE7 CisJaW50IHJldCA9IDA7CisKKwlycSA9IHRhc2tfZ3JxX2xvY2socCwgJmZsYWdzKTsKKworCWlm IChjcHVtYXNrX2VxdWFsKHRza19jcHVzX2FsbG93ZWQocCksIG5ld19tYXNrKSkKKwkJZ290byBv dXQ7CisKKwlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhuZXdfbWFzaywgY3B1X2FjdGl2ZV9tYXNr KSkgeworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAodW5saWtlbHko KHAtPmZsYWdzICYgUEZfVEhSRUFEX0JPVU5EKSAmJiBwICE9IGN1cnJlbnQpKSB7CisJCXJldCA9 IC1FSU5WQUw7CisJCWdvdG8gb3V0OworCX0KKworCXF1ZXVlZCA9IHRhc2tfcXVldWVkKHApOwor CisJZG9fc2V0X2NwdXNfYWxsb3dlZChwLCBuZXdfbWFzayk7CisKKwkvKiBDYW4gdGhlIHRhc2sg cnVuIG9uIHRoZSB0YXNrJ3MgY3VycmVudCBDUFU/IElmIHNvLCB3ZSdyZSBkb25lICovCisJaWYg KGNwdW1hc2tfdGVzdF9jcHUodGFza19jcHUocCksIG5ld19tYXNrKSkKKwkJZ290byBvdXQ7CisK KwlpZiAodGFza19ydW5uaW5nKHApKSB7CisJCS8qIFRhc2sgaXMgcnVubmluZyBvbiB0aGUgd3Jv bmcgY3B1IG5vdywgcmVzY2hlZHVsZSBpdC4gKi8KKwkJaWYgKHJxID09IHRoaXNfcnEoKSkgewor CQkJc2V0X3Rza19uZWVkX3Jlc2NoZWQocCk7CisJCQlydW5uaW5nX3dyb25nID0gdHJ1ZTsKKwkJ fSBlbHNlCisJCQlyZXNjaGVkX3Rhc2socCk7CisJfSBlbHNlCisJCXNldF90YXNrX2NwdShwLCBj cHVtYXNrX2FueV9hbmQoY3B1X2FjdGl2ZV9tYXNrLCBuZXdfbWFzaykpOworCitvdXQ6CisJaWYg KHF1ZXVlZCkKKwkJdHJ5X3ByZWVtcHQocCwgcnEpOworCXRhc2tfZ3JxX3VubG9jaygmZmxhZ3Mp OworCisJaWYgKHJ1bm5pbmdfd3JvbmcpCisJCV9jb25kX3Jlc2NoZWQoKTsKKworCXJldHVybiBy ZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChzZXRfY3B1c19hbGxvd2VkX3B0cik7CisKKyNpZmRl ZiBDT05GSUdfSE9UUExVR19DUFUKKy8qIFJ1biB0aHJvdWdoIHRhc2sgbGlzdCBhbmQgZmluZCB0 YXNrcyBhZmZpbmVkIHRvIGp1c3QgdGhlIGRlYWQgY3B1LCB0aGVuCisgKiBhbGxvY2F0ZSBhIG5l dyBhZmZpbml0eSAqLworc3RhdGljIHZvaWQgYnJlYWtfc29sZV9hZmZpbml0eShpbnQgc3JjX2Nw dSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqcCwg KnQ7CisKKwlkb19lYWNoX3RocmVhZCh0LCBwKSB7CisJCWlmIChwICE9IGlkbGUgJiYgIW9ubGlu ZV9jcHVzKHApKSB7CisJCQljcHVtYXNrX2NvcHkodHNrX2NwdXNfYWxsb3dlZChwKSwgY3B1X3Bv c3NpYmxlX21hc2spOworCQkJLyoKKwkJCSAqIERvbid0IHRlbGwgdGhlbSBhYm91dCBtb3Zpbmcg ZXhpdGluZyB0YXNrcyBvcgorCQkJICoga2VybmVsIHRocmVhZHMgKGJvdGggbW0gTlVMTCksIHNp bmNlIHRoZXkgbmV2ZXIKKwkJCSAqIGxlYXZlIGtlcm5lbC4KKwkJCSAqLworCQkJaWYgKHAtPm1t ICYmIHByaW50a19yYXRlbGltaXQoKSkgeworCQkJCXByaW50ayhLRVJOX0lORk8gInByb2Nlc3Mg JWQgKCVzKSBubyAiCisJCQkJCSAgICJsb25nZXIgYWZmaW5lIHRvIGNwdSAlZFxuIiwKKwkJCQkJ ICAgdGFza19waWRfbnIocCksIHAtPmNvbW0sIHNyY19jcHUpOworCQkJfQorCQl9CisJCWNsZWFy X3N0aWNreShwKTsKKwl9IHdoaWxlX2VhY2hfdGhyZWFkKHQsIHApOworfQorCisvKgorICogU2No ZWR1bGVzIGlkbGUgdGFzayB0byBiZSB0aGUgbmV4dCBydW5uYWJsZSB0YXNrIG9uIGN1cnJlbnQg Q1BVLgorICogSXQgZG9lcyBzbyBieSBib29zdGluZyBpdHMgcHJpb3JpdHkgdG8gaGlnaGVzdCBw b3NzaWJsZS4KKyAqIFVzZWQgYnkgQ1BVIG9mZmxpbmUgY29kZS4KKyAqLwordm9pZCBzY2hlZF9p ZGxlX25leHQoc3RydWN0IHJxICpycSwgaW50IHRoaXNfY3B1LCBzdHJ1Y3QgdGFza19zdHJ1Y3Qg KmlkbGUpCit7CisJLyogY3B1IGhhcyB0byBiZSBvZmZsaW5lICovCisJQlVHX09OKGNwdV9vbmxp bmUodGhpc19jcHUpKTsKKworCV9fc2V0c2NoZWR1bGVyKGlkbGUsIHJxLCBTQ0hFRF9GSUZPLCBT VE9QX1BSSU8pOworCisJYWN0aXZhdGVfaWRsZV90YXNrKGlkbGUpOworCXNldF90c2tfbmVlZF9y ZXNjaGVkKHJxLT5jdXJyKTsKK30KKworLyoKKyAqIEVuc3VyZXMgdGhhdCB0aGUgaWRsZSB0YXNr IGlzIHVzaW5nIGluaXRfbW0gcmlnaHQgYmVmb3JlIGl0cyBjcHUgZ29lcworICogb2ZmbGluZS4K KyAqLwordm9pZCBpZGxlX3Rhc2tfZXhpdCh2b2lkKQoreworCXN0cnVjdCBtbV9zdHJ1Y3QgKm1t ID0gY3VycmVudC0+YWN0aXZlX21tOworCisJQlVHX09OKGNwdV9vbmxpbmUoc21wX3Byb2Nlc3Nv cl9pZCgpKSk7CisKKwlpZiAobW0gIT0gJmluaXRfbW0pCisJCXN3aXRjaF9tbShtbSwgJmluaXRf bW0sIGN1cnJlbnQpOworCW1tZHJvcChtbSk7Cit9CisjZW5kaWYgLyogQ09ORklHX0hPVFBMVUdf Q1BVICovCit2b2lkIHNjaGVkX3NldF9zdG9wX3Rhc2soaW50IGNwdSwgc3RydWN0IHRhc2tfc3Ry dWN0ICpzdG9wKQoreworCXN0cnVjdCBzY2hlZF9wYXJhbSBzdG9wX3BhcmFtID0geyAuc2NoZWRf cHJpb3JpdHkgPSBTVE9QX1BSSU8gfTsKKwlzdHJ1Y3Qgc2NoZWRfcGFyYW0gc3RhcnRfcGFyYW0g PSB7IC5zY2hlZF9wcmlvcml0eSA9IE1BWF9VU0VSX1JUX1BSSU8gLSAxIH07CisJc3RydWN0IHRh c2tfc3RydWN0ICpvbGRfc3RvcCA9IGNwdV9ycShjcHUpLT5zdG9wOworCisJaWYgKHN0b3ApIHsK KwkJLyoKKwkJICogTWFrZSBpdCBhcHBlYXIgbGlrZSBhIFNDSEVEX0ZJRk8gdGFzaywgaXRzIHNv bWV0aGluZworCQkgKiB1c2Vyc3BhY2Uga25vd3MgYWJvdXQgYW5kIHdvbid0IGdldCBjb25mdXNl ZCBhYm91dC4KKwkJICoKKwkJICogQWxzbywgaXQgd2lsbCBtYWtlIFBJIG1vcmUgb3IgbGVzcyB3 b3JrIHdpdGhvdXQgdG9vCisJCSAqIG11Y2ggY29uZnVzaW9uIC0tIGJ1dCB0aGVuLCBzdG9wIHdv cmsgc2hvdWxkIG5vdAorCQkgKiByZWx5IG9uIFBJIHdvcmtpbmcgYW55d2F5LgorCQkgKi8KKwkJ c2NoZWRfc2V0c2NoZWR1bGVyX25vY2hlY2soc3RvcCwgU0NIRURfRklGTywgJnN0b3BfcGFyYW0p OworCX0KKworCWNwdV9ycShjcHUpLT5zdG9wID0gc3RvcDsKKworCWlmIChvbGRfc3RvcCkgewor CQkvKgorCQkgKiBSZXNldCBpdCBiYWNrIHRvIGEgbm9ybWFsIHJ0IHNjaGVkdWxpbmcgcHJpbyBz byB0aGF0CisJCSAqIGl0IGNhbiBkaWUgaW4gcGllY2VzLgorCQkgKi8KKwkJc2NoZWRfc2V0c2No ZWR1bGVyX25vY2hlY2sob2xkX3N0b3AsIFNDSEVEX0ZJRk8sICZzdGFydF9wYXJhbSk7CisJfQor fQorCisKKyNpZiBkZWZpbmVkKENPTkZJR19TQ0hFRF9ERUJVRykgJiYgZGVmaW5lZChDT05GSUdf U1lTQ1RMKQorCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBzZF9jdGxfZGlyW10gPSB7CisJewor CQkucHJvY25hbWUJPSAic2NoZWRfZG9tYWluIiwKKwkJLm1vZGUJCT0gMDU1NSwKKwl9LAorCXt9 Cit9OworCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSBzZF9jdGxfcm9vdFtdID0geworCXsKKwkJ LnByb2NuYW1lCT0gImtlcm5lbCIsCisJCS5tb2RlCQk9IDA1NTUsCisJCS5jaGlsZAkJPSBzZF9j dGxfZGlyLAorCX0sCisJe30KK307CisKK3N0YXRpYyBzdHJ1Y3QgY3RsX3RhYmxlICpzZF9hbGxv Y19jdGxfZW50cnkoaW50IG4pCit7CisJc3RydWN0IGN0bF90YWJsZSAqZW50cnkgPQorCQlrY2Fs bG9jKG4sIHNpemVvZihzdHJ1Y3QgY3RsX3RhYmxlKSwgR0ZQX0tFUk5FTCk7CisKKwlyZXR1cm4g ZW50cnk7Cit9CisKK3N0YXRpYyB2b2lkIHNkX2ZyZWVfY3RsX2VudHJ5KHN0cnVjdCBjdGxfdGFi bGUgKip0YWJsZXApCit7CisJc3RydWN0IGN0bF90YWJsZSAqZW50cnk7CisKKwkvKgorCSAqIElu IHRoZSBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMsIGJvdGggdGhlIGNoaWxkIGRpcmVjdG9yeSBh bmQKKwkgKiBwcm9jbmFtZSBhcmUgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFuZCBjb3VsZCBmYWls IGJ1dCB0aGUgbW9kZQorCSAqIHdpbGwgYWx3YXlzIGJlIHNldC4gSW4gdGhlIGxvd2VzdCBkaXJl Y3RvcnkgdGhlIG5hbWVzIGFyZQorCSAqIHN0YXRpYyBzdHJpbmdzIGFuZCBhbGwgaGF2ZSBwcm9j IGhhbmRsZXJzLgorCSAqLworCWZvciAoZW50cnkgPSAqdGFibGVwOyBlbnRyeS0+bW9kZTsgZW50 cnkrKykgeworCQlpZiAoZW50cnktPmNoaWxkKQorCQkJc2RfZnJlZV9jdGxfZW50cnkoJmVudHJ5 LT5jaGlsZCk7CisJCWlmIChlbnRyeS0+cHJvY19oYW5kbGVyID09IE5VTEwpCisJCQlrZnJlZShl bnRyeS0+cHJvY25hbWUpOworCX0KKworCWtmcmVlKCp0YWJsZXApOworCSp0YWJsZXAgPSBOVUxM OworfQorCitzdGF0aWMgdm9pZAorc2V0X3RhYmxlX2VudHJ5KHN0cnVjdCBjdGxfdGFibGUgKmVu dHJ5LAorCQljb25zdCBjaGFyICpwcm9jbmFtZSwgdm9pZCAqZGF0YSwgaW50IG1heGxlbiwKKwkJ bW9kZV90IG1vZGUsIHByb2NfaGFuZGxlciAqcHJvY19oYW5kbGVyKQoreworCWVudHJ5LT5wcm9j bmFtZSA9IHByb2NuYW1lOworCWVudHJ5LT5kYXRhID0gZGF0YTsKKwllbnRyeS0+bWF4bGVuID0g bWF4bGVuOworCWVudHJ5LT5tb2RlID0gbW9kZTsKKwllbnRyeS0+cHJvY19oYW5kbGVyID0gcHJv Y19oYW5kbGVyOworfQorCitzdGF0aWMgc3RydWN0IGN0bF90YWJsZSAqCitzZF9hbGxvY19jdGxf ZG9tYWluX3RhYmxlKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkKQoreworCXN0cnVjdCBjdGxfdGFi bGUgKnRhYmxlID0gc2RfYWxsb2NfY3RsX2VudHJ5KDEzKTsKKworCWlmICh0YWJsZSA9PSBOVUxM KQorCQlyZXR1cm4gTlVMTDsKKworCXNldF90YWJsZV9lbnRyeSgmdGFibGVbMF0sICJtaW5faW50 ZXJ2YWwiLCAmc2QtPm1pbl9pbnRlcnZhbCwKKwkJc2l6ZW9mKGxvbmcpLCAwNjQ0LCBwcm9jX2Rv dWxvbmd2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzFdLCAibWF4X2ludGVy dmFsIiwgJnNkLT5tYXhfaW50ZXJ2YWwsCisJCXNpemVvZihsb25nKSwgMDY0NCwgcHJvY19kb3Vs b25ndmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVsyXSwgImJ1c3lfaWR4Iiwg JnNkLT5idXN5X2lkeCwKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4 KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzNdLCAiaWRsZV9pZHgiLCAmc2QtPmlkbGVfaWR4 LAorCQlzaXplb2YoaW50KSwgMDY0NCwgcHJvY19kb2ludHZlY19taW5tYXgpOworCXNldF90YWJs ZV9lbnRyeSgmdGFibGVbNF0sICJuZXdpZGxlX2lkeCIsICZzZC0+bmV3aWRsZV9pZHgsCisJCXNp emVvZihpbnQpLCAwNjQ0LCBwcm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5 KCZ0YWJsZVs1XSwgIndha2VfaWR4IiwgJnNkLT53YWtlX2lkeCwKKwkJc2l6ZW9mKGludCksIDA2 NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzZdLCAi Zm9ya2V4ZWNfaWR4IiwgJnNkLT5mb3JrZXhlY19pZHgsCisJCXNpemVvZihpbnQpLCAwNjQ0LCBw cm9jX2RvaW50dmVjX21pbm1heCk7CisJc2V0X3RhYmxlX2VudHJ5KCZ0YWJsZVs3XSwgImJ1c3lf ZmFjdG9yIiwgJnNkLT5idXN5X2ZhY3RvciwKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9p bnR2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzhdLCAiaW1iYWxhbmNlX3Bj dCIsICZzZC0+aW1iYWxhbmNlX3BjdCwKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2 ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzldLCAiY2FjaGVfbmljZV90cmll cyIsCisJCSZzZC0+Y2FjaGVfbmljZV90cmllcywKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2Nf ZG9pbnR2ZWNfbWlubWF4KTsKKwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzEwXSwgImZsYWdzIiwg JnNkLT5mbGFncywKKwkJc2l6ZW9mKGludCksIDA2NDQsIHByb2NfZG9pbnR2ZWNfbWlubWF4KTsK KwlzZXRfdGFibGVfZW50cnkoJnRhYmxlWzExXSwgIm5hbWUiLCBzZC0+bmFtZSwKKwkJQ09SRU5B TUVfTUFYX1NJWkUsIDA0NDQsIHByb2NfZG9zdHJpbmcpOworCS8qICZ0YWJsZVsxMl0gaXMgdGVy bWluYXRvciAqLworCisJcmV0dXJuIHRhYmxlOworfQorCitzdGF0aWMgY3RsX3RhYmxlICpzZF9h bGxvY19jdGxfY3B1X3RhYmxlKGludCBjcHUpCit7CisJc3RydWN0IGN0bF90YWJsZSAqZW50cnks ICp0YWJsZTsKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwlpbnQgZG9tYWluX251bSA9IDAs IGk7CisJY2hhciBidWZbMzJdOworCisJZm9yX2VhY2hfZG9tYWluKGNwdSwgc2QpCisJCWRvbWFp bl9udW0rKzsKKwllbnRyeSA9IHRhYmxlID0gc2RfYWxsb2NfY3RsX2VudHJ5KGRvbWFpbl9udW0g KyAxKTsKKwlpZiAodGFibGUgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlpID0gMDsKKwlm b3JfZWFjaF9kb21haW4oY3B1LCBzZCkgeworCQlzbnByaW50ZihidWYsIDMyLCAiZG9tYWluJWQi LCBpKTsKKwkJZW50cnktPnByb2NuYW1lID0ga3N0cmR1cChidWYsIEdGUF9LRVJORUwpOworCQll bnRyeS0+bW9kZSA9IDA1NTU7CisJCWVudHJ5LT5jaGlsZCA9IHNkX2FsbG9jX2N0bF9kb21haW5f dGFibGUoc2QpOworCQllbnRyeSsrOworCQlpKys7CisJfQorCXJldHVybiB0YWJsZTsKK30KKwor c3RhdGljIHN0cnVjdCBjdGxfdGFibGVfaGVhZGVyICpzZF9zeXNjdGxfaGVhZGVyOworc3RhdGlj IHZvaWQgcmVnaXN0ZXJfc2NoZWRfZG9tYWluX3N5c2N0bCh2b2lkKQoreworCWludCBpLCBjcHVf bnVtID0gbnVtX3Bvc3NpYmxlX2NwdXMoKTsKKwlzdHJ1Y3QgY3RsX3RhYmxlICplbnRyeSA9IHNk X2FsbG9jX2N0bF9lbnRyeShjcHVfbnVtICsgMSk7CisJY2hhciBidWZbMzJdOworCisJV0FSTl9P TihzZF9jdGxfZGlyWzBdLmNoaWxkKTsKKwlzZF9jdGxfZGlyWzBdLmNoaWxkID0gZW50cnk7CisK KwlpZiAoZW50cnkgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1 KGkpIHsKKwkJc25wcmludGYoYnVmLCAzMiwgImNwdSVkIiwgaSk7CisJCWVudHJ5LT5wcm9jbmFt ZSA9IGtzdHJkdXAoYnVmLCBHRlBfS0VSTkVMKTsKKwkJZW50cnktPm1vZGUgPSAwNTU1OworCQll bnRyeS0+Y2hpbGQgPSBzZF9hbGxvY19jdGxfY3B1X3RhYmxlKGkpOworCQllbnRyeSsrOworCX0K KworCVdBUk5fT04oc2Rfc3lzY3RsX2hlYWRlcik7CisJc2Rfc3lzY3RsX2hlYWRlciA9IHJlZ2lz dGVyX3N5c2N0bF90YWJsZShzZF9jdGxfcm9vdCk7Cit9CisKKy8qIG1heSBiZSBjYWxsZWQgbXVs dGlwbGUgdGltZXMgcGVyIHJlZ2lzdGVyICovCitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX3NjaGVk X2RvbWFpbl9zeXNjdGwodm9pZCkKK3sKKwlpZiAoc2Rfc3lzY3RsX2hlYWRlcikKKwkJdW5yZWdp c3Rlcl9zeXNjdGxfdGFibGUoc2Rfc3lzY3RsX2hlYWRlcik7CisJc2Rfc3lzY3RsX2hlYWRlciA9 IE5VTEw7CisJaWYgKHNkX2N0bF9kaXJbMF0uY2hpbGQpCisJCXNkX2ZyZWVfY3RsX2VudHJ5KCZz ZF9jdGxfZGlyWzBdLmNoaWxkKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9zY2hl ZF9kb21haW5fc3lzY3RsKHZvaWQpCit7Cit9CitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX3NjaGVk X2RvbWFpbl9zeXNjdGwodm9pZCkKK3sKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzZXRfcnFf b25saW5lKHN0cnVjdCBycSAqcnEpCit7CisJaWYgKCFycS0+b25saW5lKSB7CisJCWNwdW1hc2tf c2V0X2NwdShjcHVfb2YocnEpLCBycS0+cmQtPm9ubGluZSk7CisJCXJxLT5vbmxpbmUgPSB0cnVl OworCX0KK30KKworc3RhdGljIHZvaWQgc2V0X3JxX29mZmxpbmUoc3RydWN0IHJxICpycSkKK3sK KwlpZiAocnEtPm9ubGluZSkgeworCQljcHVtYXNrX2NsZWFyX2NwdShjcHVfb2YocnEpLCBycS0+ cmQtPm9ubGluZSk7CisJCXJxLT5vbmxpbmUgPSBmYWxzZTsKKwl9Cit9CisKKy8qCisgKiBtaWdy YXRpb25fY2FsbCAtIGNhbGxiYWNrIHRoYXQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiBhIENQVSBpcyBh ZGRlZC4KKyAqLworc3RhdGljIGludCBfX2NwdWluaXQKK21pZ3JhdGlvbl9jYWxsKHN0cnVjdCBu b3RpZmllcl9ibG9jayAqbmZiLCB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sK KwlpbnQgY3B1ID0gKGxvbmcpaGNwdTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBy cSAqcnEgPSBjcHVfcnEoY3B1KTsKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKKwlzdHJ1Y3Qg dGFza19zdHJ1Y3QgKmlkbGUgPSBycS0+aWRsZTsKKyNlbmRpZgorCisJc3dpdGNoIChhY3Rpb24g JiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwkJYnJlYWs7 CisKKwljYXNlIENQVV9PTkxJTkU6CisJCS8qIFVwZGF0ZSBvdXIgcm9vdC1kb21haW4gKi8KKwkJ Z3JxX2xvY2tfaXJxc2F2ZSgmZmxhZ3MpOworCQlpZiAocnEtPnJkKSB7CisJCQlCVUdfT04oIWNw dW1hc2tfdGVzdF9jcHUoY3B1LCBycS0+cmQtPnNwYW4pKTsKKworCQkJc2V0X3JxX29ubGluZShy cSk7CisJCX0KKwkJZ3JxLm5vYyA9IG51bV9vbmxpbmVfY3B1cygpOworCQlncnFfdW5sb2NrX2ly cXJlc3RvcmUoJmZsYWdzKTsKKwkJYnJlYWs7CisKKyNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUK KwljYXNlIENQVV9ERUFEOgorCQkvKiBJZGxlIHRhc2sgYmFjayB0byBub3JtYWwgKG9mZiBydW5x dWV1ZSwgbG93IHByaW8pICovCisJCWdycV9sb2NrX2lycSgpOworCQlwdXRfcHJldl90YXNrKHJx LCBpZGxlLCB0cnVlLCBmYWxzZSk7CisJCWlkbGUtPnN0YXRpY19wcmlvID0gTUFYX1BSSU87CisJ CV9fc2V0c2NoZWR1bGVyKGlkbGUsIHJxLCBTQ0hFRF9OT1JNQUwsIDApOworCQlpZGxlLT5wcmlv ID0gUFJJT19MSU1JVDsKKwkJc2V0X3JxX3Rhc2socnEsIGlkbGUpOworCQlncnFfdW5sb2NrX2ly cSgpOworCQlicmVhazsKKworCWNhc2UgQ1BVX0RZSU5HOgorCQkvKiBVcGRhdGUgb3VyIHJvb3Qt ZG9tYWluICovCisJCWdycV9sb2NrX2lycXNhdmUoJmZsYWdzKTsKKwkJc2NoZWRfaWRsZV9uZXh0 KHJxLCBjcHUsIGlkbGUpOworCQlpZiAocnEtPnJkKSB7CisJCQlCVUdfT04oIWNwdW1hc2tfdGVz dF9jcHUoY3B1LCBycS0+cmQtPnNwYW4pKTsKKwkJCXNldF9ycV9vZmZsaW5lKHJxKTsKKwkJfQor CQlicmVha19zb2xlX2FmZmluaXR5KGNwdSwgaWRsZSk7CisJCWdycS5ub2MgPSBudW1fb25saW5l X2NwdXMoKTsKKwkJZ3JxX3VubG9ja19pcnFyZXN0b3JlKCZmbGFncyk7CisJCWJyZWFrOworI2Vu ZGlmCisJfQorCXJldHVybiBOT1RJRllfT0s7Cit9CisKKy8qCisgKiBSZWdpc3RlciBhdCBoaWdo IHByaW9yaXR5IHNvIHRoYXQgdGFzayBtaWdyYXRpb24gKG1pZ3JhdGVfYWxsX3Rhc2tzKQorICog aGFwcGVucyBiZWZvcmUgZXZlcnl0aGluZyBlbHNlLiAgVGhpcyBoYXMgdG8gYmUgbG93ZXIgcHJp b3JpdHkgdGhhbgorICogdGhlIG5vdGlmaWVyIGluIHRoZSBwZXJmX2NvdW50ZXIgc3Vic3lzdGVt LCB0aG91Z2guCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0 YSBtaWdyYXRpb25fbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSBtaWdyYXRpb25fY2Fs bCwKKwkucHJpb3JpdHkgPSBDUFVfUFJJX01JR1JBVElPTiwKK307CisKK3N0YXRpYyBpbnQgX19j cHVpbml0IHNjaGVkX2NwdV9hY3RpdmUoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCisJCQkJ CSAgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJc3dpdGNoIChhY3Rpb24g JiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCWNhc2UgQ1BVX09OTElORToKKwljYXNlIENQVV9ET1dO X0ZBSUxFRDoKKwkJc2V0X2NwdV9hY3RpdmUoKGxvbmcpaGNwdSwgdHJ1ZSk7CisJCXJldHVybiBO T1RJRllfT0s7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KK30KKworc3Rh dGljIGludCBfX2NwdWluaXQgc2NoZWRfY3B1X2luYWN0aXZlKHN0cnVjdCBub3RpZmllcl9ibG9j ayAqbmZiLAorCQkJCQl1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKK3sKKwlzd2l0 Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CisJY2FzZSBDUFVfRE9XTl9QUkVQQVJF OgorCQlzZXRfY3B1X2FjdGl2ZSgobG9uZyloY3B1LCBmYWxzZSk7CisJCXJldHVybiBOT1RJRllf T0s7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KK30KKworaW50IF9faW5p dCBtaWdyYXRpb25faW5pdCh2b2lkKQoreworCXZvaWQgKmNwdSA9ICh2b2lkICopKGxvbmcpc21w X3Byb2Nlc3Nvcl9pZCgpOworCWludCBlcnI7CisKKwkvKiBJbml0aWFsaXNlIG1pZ3JhdGlvbiBm b3IgdGhlIGJvb3QgQ1BVICovCisJZXJyID0gbWlncmF0aW9uX2NhbGwoJm1pZ3JhdGlvbl9ub3Rp ZmllciwgQ1BVX1VQX1BSRVBBUkUsIGNwdSk7CisJQlVHX09OKGVyciA9PSBOT1RJRllfQkFEKTsK KwltaWdyYXRpb25fY2FsbCgmbWlncmF0aW9uX25vdGlmaWVyLCBDUFVfT05MSU5FLCBjcHUpOwor CXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmbWlncmF0aW9uX25vdGlmaWVyKTsKKworCS8qIFJlZ2lz dGVyIGNwdSBhY3RpdmUgbm90aWZpZXJzICovCisJY3B1X25vdGlmaWVyKHNjaGVkX2NwdV9hY3Rp dmUsIENQVV9QUklfU0NIRURfQUNUSVZFKTsKKwljcHVfbm90aWZpZXIoc2NoZWRfY3B1X2luYWN0 aXZlLCBDUFVfUFJJX1NDSEVEX0lOQUNUSVZFKTsKKworCXJldHVybiAwOworfQorZWFybHlfaW5p dGNhbGwobWlncmF0aW9uX2luaXQpOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfU01QCisKK3N0 YXRpYyBjcHVtYXNrX3Zhcl90IHNjaGVkX2RvbWFpbnNfdG1wbWFzazsgLyogc2NoZWRfZG9tYWlu c19tdXRleCAqLworCisjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisKK3N0YXRpYyBfX3JlYWRf bW9zdGx5IGludCBzY2hlZF9kb21haW5fZGVidWdfZW5hYmxlZDsKKworc3RhdGljIGludCBfX2lu aXQgc2NoZWRfZG9tYWluX2RlYnVnX3NldHVwKGNoYXIgKnN0cikKK3sKKwlzY2hlZF9kb21haW5f ZGVidWdfZW5hYmxlZCA9IDE7CisKKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJzY2hlZF9k ZWJ1ZyIsIHNjaGVkX2RvbWFpbl9kZWJ1Z19zZXR1cCk7CisKK3N0YXRpYyBpbnQgc2NoZWRfZG9t YWluX2RlYnVnX29uZShzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSwgaW50IGxldmVs LAorCQkJCSAgc3RydWN0IGNwdW1hc2sgKmdyb3VwbWFzaykKK3sKKwlzdHJ1Y3Qgc2NoZWRfZ3Jv dXAgKmdyb3VwID0gc2QtPmdyb3VwczsKKwljaGFyIHN0clsyNTZdOworCisJY3B1bGlzdF9zY25w cmludGYoc3RyLCBzaXplb2Yoc3RyKSwgc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKKwljcHVtYXNr X2NsZWFyKGdyb3VwbWFzayk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiJSpzIGRvbWFpbiAlZDog IiwgbGV2ZWwsICIiLCBsZXZlbCk7CisKKwlpZiAoIShzZC0+ZmxhZ3MgJiBTRF9MT0FEX0JBTEFO Q0UpKSB7CisJCXByaW50aygiZG9lcyBub3QgbG9hZC1iYWxhbmNlXG4iKTsKKwkJaWYgKHNkLT5w YXJlbnQpCisJCQlwcmludGsoS0VSTl9FUlIgIkVSUk9SOiAhU0RfTE9BRF9CQUxBTkNFIGRvbWFp biIKKwkJCQkJIiBoYXMgcGFyZW50Iik7CisJCXJldHVybiAtMTsKKwl9CisKKwlwcmludGsoS0VS Tl9DT05UICJzcGFuICVzIGxldmVsICVzXG4iLCBzdHIsIHNkLT5uYW1lKTsKKworCWlmICghY3B1 bWFza190ZXN0X2NwdShjcHUsIHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkpIHsKKwkJcHJpbnRrKEtF Uk5fRVJSICJFUlJPUjogZG9tYWluLT5zcGFuIGRvZXMgbm90IGNvbnRhaW4gIgorCQkJCSJDUFUl ZFxuIiwgY3B1KTsKKwl9CisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgc2NoZWRfZ3JvdXBf Y3B1cyhncm91cCkpKSB7CisJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGRvbWFpbi0+Z3JvdXBz IGRvZXMgbm90IGNvbnRhaW4iCisJCQkJIiBDUFUlZFxuIiwgY3B1KTsKKwl9CisKKwlwcmludGso S0VSTl9ERUJVRyAiJSpzIGdyb3VwczoiLCBsZXZlbCArIDEsICIiKTsKKwlkbyB7CisJCWlmICgh Z3JvdXApIHsKKwkJCXByaW50aygiXG4iKTsKKwkJCXByaW50ayhLRVJOX0VSUiAiRVJST1I6IGdy b3VwIGlzIE5VTExcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoIWdyb3VwLT5zZ3AtPnBv d2VyKSB7CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJF UlJPUjogZG9tYWluLT5jcHVfcG93ZXIgbm90ICIKKwkJCQkJInNldFxuIik7CisJCQlicmVhazsK KwkJfQorCisJCWlmICghY3B1bWFza193ZWlnaHQoc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpKSB7 CisJCQlwcmludGsoS0VSTl9DT05UICJcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjog ZW1wdHkgZ3JvdXBcbiIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoY3B1bWFza19pbnRlcnNl Y3RzKGdyb3VwbWFzaywgc2NoZWRfZ3JvdXBfY3B1cyhncm91cCkpKSB7CisJCQlwcmludGsoS0VS Tl9DT05UICJcbiIpOworCQkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogcmVwZWF0ZWQgQ1BVc1xu Iik7CisJCQlicmVhazsKKwkJfQorCisJCWNwdW1hc2tfb3IoZ3JvdXBtYXNrLCBncm91cG1hc2ss IHNjaGVkX2dyb3VwX2NwdXMoZ3JvdXApKTsKKworCQljcHVsaXN0X3NjbnByaW50ZihzdHIsIHNp emVvZihzdHIpLCBzY2hlZF9ncm91cF9jcHVzKGdyb3VwKSk7CisKKwkJcHJpbnRrKEtFUk5fQ09O VCAiICVzIiwgc3RyKTsKKwkJaWYgKGdyb3VwLT5zZ3AtPnBvd2VyICE9IFNDSEVEX1BPV0VSX1ND QUxFKSB7CisJCQlwcmludGsoS0VSTl9DT05UICIgKGNwdV9wb3dlciA9ICVkKSIsCisJCQkJZ3Jv dXAtPnNncC0+cG93ZXIpOworCQl9CisKKwkJZ3JvdXAgPSBncm91cC0+bmV4dDsKKwl9IHdoaWxl IChncm91cCAhPSBzZC0+Z3JvdXBzKTsKKwlwcmludGsoS0VSTl9DT05UICJcbiIpOworCisJaWYg KCFjcHVtYXNrX2VxdWFsKHNjaGVkX2RvbWFpbl9zcGFuKHNkKSwgZ3JvdXBtYXNrKSkKKwkJcHJp bnRrKEtFUk5fRVJSICJFUlJPUjogZ3JvdXBzIGRvbid0IHNwYW4gZG9tYWluLT5zcGFuXG4iKTsK KworCWlmIChzZC0+cGFyZW50ICYmCisJCSFjcHVtYXNrX3N1YnNldChncm91cG1hc2ssIHNjaGVk X2RvbWFpbl9zcGFuKHNkLT5wYXJlbnQpKSkKKwkJcHJpbnRrKEtFUk5fRVJSICJFUlJPUjogcGFy ZW50IHNwYW4gaXMgbm90IGEgc3VwZXJzZXQgIgorCQkJIm9mIGRvbWFpbi0+c3BhblxuIik7CisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNjaGVkX2RvbWFpbl9kZWJ1ZyhzdHJ1Y3Qgc2No ZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3sKKwlpbnQgbGV2ZWwgPSAwOworCisJaWYgKCFzY2hl ZF9kb21haW5fZGVidWdfZW5hYmxlZCkKKwkJcmV0dXJuOworCisJaWYgKCFzZCkgeworCQlwcmlu dGsoS0VSTl9ERUJVRyAiQ1BVJWQgYXR0YWNoaW5nIE5VTEwgc2NoZWQtZG9tYWluLlxuIiwgY3B1 KTsKKwkJcmV0dXJuOworCX0KKworCXByaW50ayhLRVJOX0RFQlVHICJDUFUlZCBhdHRhY2hpbmcg c2NoZWQtZG9tYWluOlxuIiwgY3B1KTsKKworCWZvciAoOzspIHsKKwkJaWYgKHNjaGVkX2RvbWFp bl9kZWJ1Z19vbmUoc2QsIGNwdSwgbGV2ZWwsIHNjaGVkX2RvbWFpbnNfdG1wbWFzaykpCisJCQli cmVhazsKKwkJbGV2ZWwrKzsKKwkJc2QgPSBzZC0+cGFyZW50OworCQlpZiAoIXNkKQorCQkJYnJl YWs7CisJfQorfQorI2Vsc2UgLyogIUNPTkZJR19TQ0hFRF9ERUJVRyAqLworIyBkZWZpbmUgc2No ZWRfZG9tYWluX2RlYnVnKHNkLCBjcHUpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZiAvKiBDT05G SUdfU0NIRURfREVCVUcgKi8KKworc3RhdGljIGludCBzZF9kZWdlbmVyYXRlKHN0cnVjdCBzY2hl ZF9kb21haW4gKnNkKQoreworCWlmIChjcHVtYXNrX3dlaWdodChzY2hlZF9kb21haW5fc3Bhbihz ZCkpID09IDEpCisJCXJldHVybiAxOworCisJLyogRm9sbG93aW5nIGZsYWdzIG5lZWQgYXQgbGVh c3QgMiBncm91cHMgKi8KKwlpZiAoc2QtPmZsYWdzICYgKFNEX0xPQURfQkFMQU5DRSB8CisJCQkg U0RfQkFMQU5DRV9ORVdJRExFIHwKKwkJCSBTRF9CQUxBTkNFX0ZPUksgfAorCQkJIFNEX0JBTEFO Q0VfRVhFQyB8CisJCQkgU0RfU0hBUkVfQ1BVUE9XRVIgfAorCQkJIFNEX1NIQVJFX1BLR19SRVNP VVJDRVMpKSB7CisJCWlmIChzZC0+Z3JvdXBzICE9IHNkLT5ncm91cHMtPm5leHQpCisJCQlyZXR1 cm4gMDsKKwl9CisKKwkvKiBGb2xsb3dpbmcgZmxhZ3MgZG9uJ3QgdXNlIGdyb3VwcyAqLworCWlm IChzZC0+ZmxhZ3MgJiAoU0RfV0FLRV9BRkZJTkUpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAx OworfQorCitzdGF0aWMgaW50CitzZF9wYXJlbnRfZGVnZW5lcmF0ZShzdHJ1Y3Qgc2NoZWRfZG9t YWluICpzZCwgc3RydWN0IHNjaGVkX2RvbWFpbiAqcGFyZW50KQoreworCXVuc2lnbmVkIGxvbmcg Y2ZsYWdzID0gc2QtPmZsYWdzLCBwZmxhZ3MgPSBwYXJlbnQtPmZsYWdzOworCisJaWYgKHNkX2Rl Z2VuZXJhdGUocGFyZW50KSkKKwkJcmV0dXJuIDE7CisKKwlpZiAoIWNwdW1hc2tfZXF1YWwoc2No ZWRfZG9tYWluX3NwYW4oc2QpLCBzY2hlZF9kb21haW5fc3BhbihwYXJlbnQpKSkKKwkJcmV0dXJu IDA7CisKKwkvKiBGbGFncyBuZWVkaW5nIGdyb3VwcyBkb24ndCBjb3VudCBpZiBvbmx5IDEgZ3Jv dXAgaW4gcGFyZW50ICovCisJaWYgKHBhcmVudC0+Z3JvdXBzID09IHBhcmVudC0+Z3JvdXBzLT5u ZXh0KSB7CisJCXBmbGFncyAmPSB+KFNEX0xPQURfQkFMQU5DRSB8CisJCQkJU0RfQkFMQU5DRV9O RVdJRExFIHwKKwkJCQlTRF9CQUxBTkNFX0ZPUksgfAorCQkJCVNEX0JBTEFOQ0VfRVhFQyB8CisJ CQkJU0RfU0hBUkVfQ1BVUE9XRVIgfAorCQkJCVNEX1NIQVJFX1BLR19SRVNPVVJDRVMpOworCQlp ZiAobnJfbm9kZV9pZHMgPT0gMSkKKwkJCXBmbGFncyAmPSB+U0RfU0VSSUFMSVpFOworCX0KKwlp ZiAofmNmbGFncyAmIHBmbGFncykKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3Rh dGljIHZvaWQgZnJlZV9yb290ZG9tYWluKHN0cnVjdCByY3VfaGVhZCAqcmN1KQoreworCXN0cnVj dCByb290X2RvbWFpbiAqcmQgPSBjb250YWluZXJfb2YocmN1LCBzdHJ1Y3Qgcm9vdF9kb21haW4s IHJjdSk7CisKKwljcHVwcmlfY2xlYW51cCgmcmQtPmNwdXByaSk7CisJZnJlZV9jcHVtYXNrX3Zh cihyZC0+cnRvX21hc2spOworCWZyZWVfY3B1bWFza192YXIocmQtPm9ubGluZSk7CisJZnJlZV9j cHVtYXNrX3ZhcihyZC0+c3Bhbik7CisJa2ZyZWUocmQpOworfQorCitzdGF0aWMgdm9pZCBycV9h dHRhY2hfcm9vdChzdHJ1Y3QgcnEgKnJxLCBzdHJ1Y3Qgcm9vdF9kb21haW4gKnJkKQoreworCXN0 cnVjdCByb290X2RvbWFpbiAqb2xkX3JkID0gTlVMTDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJZ3JxX2xvY2tfaXJxc2F2ZSgmZmxhZ3MpOworCisJaWYgKHJxLT5yZCkgeworCQlvbGRfcmQg PSBycS0+cmQ7CisKKwkJaWYgKGNwdW1hc2tfdGVzdF9jcHUocnEtPmNwdSwgb2xkX3JkLT5vbmxp bmUpKQorCQkJc2V0X3JxX29mZmxpbmUocnEpOworCisJCWNwdW1hc2tfY2xlYXJfY3B1KHJxLT5j cHUsIG9sZF9yZC0+c3Bhbik7CisKKwkJLyoKKwkJICogSWYgd2UgZG9udCB3YW50IHRvIGZyZWUg dGhlIG9sZF9ydCB5ZXQgdGhlbgorCQkgKiBzZXQgb2xkX3JkIHRvIE5VTEwgdG8gc2tpcCB0aGUg ZnJlZWluZyBsYXRlcgorCQkgKiBpbiB0aGlzIGZ1bmN0aW9uOgorCQkgKi8KKwkJaWYgKCFhdG9t aWNfZGVjX2FuZF90ZXN0KCZvbGRfcmQtPnJlZmNvdW50KSkKKwkJCW9sZF9yZCA9IE5VTEw7CisJ fQorCisJYXRvbWljX2luYygmcmQtPnJlZmNvdW50KTsKKwlycS0+cmQgPSByZDsKKworCWNwdW1h c2tfc2V0X2NwdShycS0+Y3B1LCByZC0+c3Bhbik7CisJaWYgKGNwdW1hc2tfdGVzdF9jcHUocnEt PmNwdSwgY3B1X2FjdGl2ZV9tYXNrKSkKKwkJc2V0X3JxX29ubGluZShycSk7CisKKwlncnFfdW5s b2NrX2lycXJlc3RvcmUoJmZsYWdzKTsKKworCWlmIChvbGRfcmQpCisJCWNhbGxfcmN1X3NjaGVk KCZvbGRfcmQtPnJjdSwgZnJlZV9yb290ZG9tYWluKTsKK30KKworc3RhdGljIGludCBpbml0X3Jv b3Rkb21haW4oc3RydWN0IHJvb3RfZG9tYWluICpyZCkKK3sKKwltZW1zZXQocmQsIDAsIHNpemVv ZigqcmQpKTsKKworCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJkLT5zcGFuLCBHRlBfS0VSTkVM KSkKKwkJZ290byBvdXQ7CisJaWYgKCFhbGxvY19jcHVtYXNrX3ZhcigmcmQtPm9ubGluZSwgR0ZQ X0tFUk5FTCkpCisJCWdvdG8gZnJlZV9zcGFuOworCWlmICghYWxsb2NfY3B1bWFza192YXIoJnJk LT5ydG9fbWFzaywgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZnJlZV9vbmxpbmU7CisKKwlpZiAoY3B1 cHJpX2luaXQoJnJkLT5jcHVwcmkpICE9IDApCisJCWdvdG8gZnJlZV9ydG9fbWFzazsKKwlyZXR1 cm4gMDsKKworZnJlZV9ydG9fbWFzazoKKwlmcmVlX2NwdW1hc2tfdmFyKHJkLT5ydG9fbWFzayk7 CitmcmVlX29ubGluZToKKwlmcmVlX2NwdW1hc2tfdmFyKHJkLT5vbmxpbmUpOworZnJlZV9zcGFu OgorCWZyZWVfY3B1bWFza192YXIocmQtPnNwYW4pOworb3V0OgorCXJldHVybiAtRU5PTUVNOwor fQorCitzdGF0aWMgdm9pZCBpbml0X2RlZnJvb3Rkb21haW4odm9pZCkKK3sKKwlpbml0X3Jvb3Rk b21haW4oJmRlZl9yb290X2RvbWFpbik7CisKKwlhdG9taWNfc2V0KCZkZWZfcm9vdF9kb21haW4u cmVmY291bnQsIDEpOworfQorCitzdGF0aWMgc3RydWN0IHJvb3RfZG9tYWluICphbGxvY19yb290 ZG9tYWluKHZvaWQpCit7CisJc3RydWN0IHJvb3RfZG9tYWluICpyZDsKKworCXJkID0ga21hbGxv YyhzaXplb2YoKnJkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZCkKKwkJcmV0dXJuIE5VTEw7CisK KwlpZiAoaW5pdF9yb290ZG9tYWluKHJkKSAhPSAwKSB7CisJCWtmcmVlKHJkKTsKKwkJcmV0dXJu IE5VTEw7CisJfQorCisJcmV0dXJuIHJkOworfQorCitzdGF0aWMgdm9pZCBmcmVlX3NjaGVkX2dy b3VwcyhzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnLCBpbnQgZnJlZV9zZ3ApCit7CisJc3RydWN0IHNj aGVkX2dyb3VwICp0bXAsICpmaXJzdDsKKworCWlmICghc2cpCisJCXJldHVybjsKKworCWZpcnN0 ID0gc2c7CisJZG8geworCQl0bXAgPSBzZy0+bmV4dDsKKworCQlpZiAoZnJlZV9zZ3AgJiYgYXRv bWljX2RlY19hbmRfdGVzdCgmc2ctPnNncC0+cmVmKSkKKwkJCWtmcmVlKHNnLT5zZ3ApOworCisJ CWtmcmVlKHNnKTsKKwkJc2cgPSB0bXA7CisJfSB3aGlsZSAoc2cgIT0gZmlyc3QpOworfQorCitz dGF0aWMgdm9pZCBmcmVlX3NjaGVkX2RvbWFpbihzdHJ1Y3QgcmN1X2hlYWQgKnJjdSkKK3sKKwlz dHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IGNvbnRhaW5lcl9vZihyY3UsIHN0cnVjdCBzY2hlZF9k b21haW4sIHJjdSk7CisKKwkvKgorCSAqIElmIGl0cyBhbiBvdmVybGFwcGluZyBkb21haW4gaXQg aGFzIHByaXZhdGUgZ3JvdXBzLCBpdGVyYXRlIGFuZAorCSAqIG51a2UgdGhlbSBhbGwuCisJICov CisJaWYgKHNkLT5mbGFncyAmIFNEX09WRVJMQVApIHsKKwkJZnJlZV9zY2hlZF9ncm91cHMoc2Qt Pmdyb3VwcywgMSk7CisJfSBlbHNlIGlmIChhdG9taWNfZGVjX2FuZF90ZXN0KCZzZC0+Z3JvdXBz LT5yZWYpKSB7CisJCWtmcmVlKHNkLT5ncm91cHMtPnNncCk7CisJCWtmcmVlKHNkLT5ncm91cHMp OworCX0KKwlrZnJlZShzZCk7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2NoZWRfZG9tYWlu KHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLCBpbnQgY3B1KQoreworCWNhbGxfcmN1KCZzZC0+cmN1 LCBmcmVlX3NjaGVkX2RvbWFpbik7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2NoZWRfZG9t YWlucyhzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgaW50IGNwdSkKK3sKKwlmb3IgKDsgc2Q7IHNk ID0gc2QtPnBhcmVudCkKKwkJZGVzdHJveV9zY2hlZF9kb21haW4oc2QsIGNwdSk7Cit9CisKKy8q CisgKiBBdHRhY2ggdGhlIGRvbWFpbiAnc2QnIHRvICdjcHUnIGFzIGl0cyBiYXNlIGRvbWFpbi4g Q2FsbGVycyBtdXN0CisgKiBob2xkIHRoZSBob3RwbHVnIGxvY2suCisgKi8KK3N0YXRpYyB2b2lk CitjcHVfYXR0YWNoX2RvbWFpbihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCwgc3RydWN0IHJvb3Rf ZG9tYWluICpyZCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CisJ c3RydWN0IHNjaGVkX2RvbWFpbiAqdG1wOworCisJLyogUmVtb3ZlIHRoZSBzY2hlZCBkb21haW5z IHdoaWNoIGRvIG5vdCBjb250cmlidXRlIHRvIHNjaGVkdWxpbmcuICovCisJZm9yICh0bXAgPSBz ZDsgdG1wOyApIHsKKwkJc3RydWN0IHNjaGVkX2RvbWFpbiAqcGFyZW50ID0gdG1wLT5wYXJlbnQ7 CisJCWlmICghcGFyZW50KQorCQkJYnJlYWs7CisKKwkJaWYgKHNkX3BhcmVudF9kZWdlbmVyYXRl KHRtcCwgcGFyZW50KSkgeworCQkJdG1wLT5wYXJlbnQgPSBwYXJlbnQtPnBhcmVudDsKKwkJCWlm IChwYXJlbnQtPnBhcmVudCkKKwkJCQlwYXJlbnQtPnBhcmVudC0+Y2hpbGQgPSB0bXA7CisJCQlk ZXN0cm95X3NjaGVkX2RvbWFpbihwYXJlbnQsIGNwdSk7CisJCX0gZWxzZQorCQkJdG1wID0gdG1w LT5wYXJlbnQ7CisJfQorCisJaWYgKHNkICYmIHNkX2RlZ2VuZXJhdGUoc2QpKSB7CisJCXRtcCA9 IHNkOworCQlzZCA9IHNkLT5wYXJlbnQ7CisJCWRlc3Ryb3lfc2NoZWRfZG9tYWluKHRtcCwgY3B1 KTsKKwkJaWYgKHNkKQorCQkJc2QtPmNoaWxkID0gTlVMTDsKKwl9CisKKwlzY2hlZF9kb21haW5f ZGVidWcoc2QsIGNwdSk7CisKKwlycV9hdHRhY2hfcm9vdChycSwgcmQpOworCXRtcCA9IHJxLT5z ZDsKKwlyY3VfYXNzaWduX3BvaW50ZXIocnEtPnNkLCBzZCk7CisJZGVzdHJveV9zY2hlZF9kb21h aW5zKHRtcCwgY3B1KTsKK30KKworLyogY3B1cyB3aXRoIGlzb2xhdGVkIGRvbWFpbnMgKi8KK3N0 YXRpYyBjcHVtYXNrX3Zhcl90IGNwdV9pc29sYXRlZF9tYXA7CisKKy8qIFNldHVwIHRoZSBtYXNr IG9mIGNwdXMgY29uZmlndXJlZCBmb3IgaXNvbGF0ZWQgZG9tYWlucyAqLworc3RhdGljIGludCBf X2luaXQgaXNvbGF0ZWRfY3B1X3NldHVwKGNoYXIgKnN0cikKK3sKKwlhbGxvY19ib290bWVtX2Nw dW1hc2tfdmFyKCZjcHVfaXNvbGF0ZWRfbWFwKTsKKwljcHVsaXN0X3BhcnNlKHN0ciwgY3B1X2lz b2xhdGVkX21hcCk7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImlzb2xjcHVzPSIsIGlzb2xh dGVkX2NwdV9zZXR1cCk7CisKKyNkZWZpbmUgU0RfTk9ERVNfUEVSX0RPTUFJTiAxNgorCisjaWZk ZWYgQ09ORklHX05VTUEKKworLyoqCisgKiBmaW5kX25leHRfYmVzdF9ub2RlIC0gZmluZCB0aGUg bmV4dCBub2RlIHRvIGluY2x1ZGUgaW4gYSBzY2hlZF9kb21haW4KKyAqIEBub2RlOiBub2RlIHdo b3NlIHNjaGVkX2RvbWFpbiB3ZSdyZSBidWlsZGluZworICogQHVzZWRfbm9kZXM6IG5vZGVzIGFs cmVhZHkgaW4gdGhlIHNjaGVkX2RvbWFpbgorICoKKyAqIEZpbmQgdGhlIG5leHQgbm9kZSB0byBp bmNsdWRlIGluIGEgZ2l2ZW4gc2NoZWR1bGluZyBkb21haW4uIFNpbXBseQorICogZmluZHMgdGhl IGNsb3Nlc3Qgbm9kZSBub3QgYWxyZWFkeSBpbiB0aGUgQHVzZWRfbm9kZXMgbWFwLgorICoKKyAq IFNob3VsZCB1c2Ugbm9kZW1hc2tfdC4KKyAqLworc3RhdGljIGludCBmaW5kX25leHRfYmVzdF9u b2RlKGludCBub2RlLCBub2RlbWFza190ICp1c2VkX25vZGVzKQoreworCWludCBpLCBuLCB2YWws IG1pbl92YWwsIGJlc3Rfbm9kZSA9IC0xOworCisJbWluX3ZhbCA9IElOVF9NQVg7CisKKwlmb3Ig KGkgPSAwOyBpIDwgbnJfbm9kZV9pZHM7IGkrKykgeworCQkvKiBTdGFydCBhdCBAbm9kZSAqLwor CQluID0gKG5vZGUgKyBpKSAlIG5yX25vZGVfaWRzOworCisJCWlmICghbnJfY3B1c19ub2RlKG4p KQorCQkJY29udGludWU7CisKKwkJLyogU2tpcCBhbHJlYWR5IHVzZWQgbm9kZXMgKi8KKwkJaWYg KG5vZGVfaXNzZXQobiwgKnVzZWRfbm9kZXMpKQorCQkJY29udGludWU7CisKKwkJLyogU2ltcGxl IG1pbiBkaXN0YW5jZSBzZWFyY2ggKi8KKwkJdmFsID0gbm9kZV9kaXN0YW5jZShub2RlLCBuKTsK KworCQlpZiAodmFsIDwgbWluX3ZhbCkgeworCQkJbWluX3ZhbCA9IHZhbDsKKwkJCWJlc3Rfbm9k ZSA9IG47CisJCX0KKwl9CisKKwlpZiAoYmVzdF9ub2RlICE9IC0xKQorCQlub2RlX3NldChiZXN0 X25vZGUsICp1c2VkX25vZGVzKTsKKwlyZXR1cm4gYmVzdF9ub2RlOworfQorCisvKioKKyAqIHNj aGVkX2RvbWFpbl9ub2RlX3NwYW4gLSBnZXQgYSBjcHVtYXNrIGZvciBhIG5vZGUncyBzY2hlZF9k b21haW4KKyAqIEBub2RlOiBub2RlIHdob3NlIGNwdW1hc2sgd2UncmUgY29uc3RydWN0aW5nCisg KiBAc3BhbjogcmVzdWx0aW5nIGNwdW1hc2sKKyAqCisgKiBHaXZlbiBhIG5vZGUsIGNvbnN0cnVj dCBhIGdvb2QgY3B1bWFzayBmb3IgaXRzIHNjaGVkX2RvbWFpbiB0byBzcGFuLiBJdAorICogc2hv dWxkIGJlIG9uZSB0aGF0IHByZXZlbnRzIHVubmVjZXNzYXJ5IGJhbGFuY2luZywgYnV0IGFsc28g c3ByZWFkcyB0YXNrcworICogb3V0IG9wdGltYWxseS4KKyAqLworc3RhdGljIHZvaWQgc2NoZWRf ZG9tYWluX25vZGVfc3BhbihpbnQgbm9kZSwgc3RydWN0IGNwdW1hc2sgKnNwYW4pCit7CisJbm9k ZW1hc2tfdCB1c2VkX25vZGVzOworCWludCBpOworCisJY3B1bWFza19jbGVhcihzcGFuKTsKKwlu b2Rlc19jbGVhcih1c2VkX25vZGVzKTsKKworCWNwdW1hc2tfb3Ioc3Bhbiwgc3BhbiwgY3B1bWFz a19vZl9ub2RlKG5vZGUpKTsKKwlub2RlX3NldChub2RlLCB1c2VkX25vZGVzKTsKKworCWZvciAo aSA9IDE7IGkgPCBTRF9OT0RFU19QRVJfRE9NQUlOOyBpKyspIHsKKwkJaW50IG5leHRfbm9kZSA9 IGZpbmRfbmV4dF9iZXN0X25vZGUobm9kZSwgJnVzZWRfbm9kZXMpOworCQlpZiAobmV4dF9ub2Rl IDwgMCkKKwkJCWJyZWFrOworCQljcHVtYXNrX29yKHNwYW4sIHNwYW4sIGNwdW1hc2tfb2Zfbm9k ZShuZXh0X25vZGUpKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1 X25vZGVfbWFzayhpbnQgY3B1KQoreworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnNjaGVkX2RvbWFp bnNfbXV0ZXgpOworCisJc2NoZWRfZG9tYWluX25vZGVfc3BhbihjcHVfdG9fbm9kZShjcHUpLCBz Y2hlZF9kb21haW5zX3RtcG1hc2spOworCisJcmV0dXJuIHNjaGVkX2RvbWFpbnNfdG1wbWFzazsK K30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfYWxsbm9kZXNfbWFzayhpbnQg Y3B1KQoreworCXJldHVybiBjcHVfcG9zc2libGVfbWFzazsKK30KKyNlbmRpZiAvKiBDT05GSUdf TlVNQSAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9jcHVfbWFzayhpbnQg Y3B1KQoreworCXJldHVybiBjcHVtYXNrX29mX25vZGUoY3B1X3RvX25vZGUoY3B1KSk7Cit9CisK K2ludCBzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyA9IDAsIHNjaGVkX21jX3Bvd2VyX3NhdmluZ3Mg PSAwOworCitzdHJ1Y3Qgc2RfZGF0YSB7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqKl9fcGVyY3B1 IHNkOworCXN0cnVjdCBzY2hlZF9ncm91cCAqKl9fcGVyY3B1IHNnOworCXN0cnVjdCBzY2hlZF9n cm91cF9wb3dlciAqKl9fcGVyY3B1IHNncDsKK307CisKK3N0cnVjdCBzX2RhdGEgeworCXN0cnVj dCBzY2hlZF9kb21haW4gKiogX19wZXJjcHUgc2Q7CisJc3RydWN0IHJvb3RfZG9tYWluCSpyZDsK K307CisKK2VudW0gc19hbGxvYyB7CisJc2Ffcm9vdGRvbWFpbiwKKwlzYV9zZCwKKwlzYV9zZF9z dG9yYWdlLAorCXNhX25vbmUsCit9OworCitzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xl dmVsOworCit0eXBlZGVmIHN0cnVjdCBzY2hlZF9kb21haW4gKigqc2NoZWRfZG9tYWluX2luaXRf Zikoc3RydWN0IHNjaGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGwsIGludCBjcHUpOwordHlw ZWRlZiBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqKCpzY2hlZF9kb21haW5fbWFza19mKShpbnQgY3B1 KTsKKworI2RlZmluZSBTRFRMX09WRVJMQVAJMHgwMQorCitzdHJ1Y3Qgc2NoZWRfZG9tYWluX3Rv cG9sb2d5X2xldmVsIHsKKwlzY2hlZF9kb21haW5faW5pdF9mIGluaXQ7CisJc2NoZWRfZG9tYWlu X21hc2tfZiBtYXNrOworCWludAkJCWZsYWdzOworCXN0cnVjdCBzZF9kYXRhCSAgZGF0YTsKK307 CisKK3N0YXRpYyBpbnQKK2J1aWxkX292ZXJsYXBfc2NoZWRfZ3JvdXBzKHN0cnVjdCBzY2hlZF9k b21haW4gKnNkLCBpbnQgY3B1KQoreworCXN0cnVjdCBzY2hlZF9ncm91cCAqZmlyc3QgPSBOVUxM LCAqbGFzdCA9IE5VTEwsICpncm91cHMgPSBOVUxMLCAqc2c7CisJY29uc3Qgc3RydWN0IGNwdW1h c2sgKnNwYW4gPSBzY2hlZF9kb21haW5fc3BhbihzZCk7CisJc3RydWN0IGNwdW1hc2sgKmNvdmVy ZWQgPSBzY2hlZF9kb21haW5zX3RtcG1hc2s7CisJc3RydWN0IHNkX2RhdGEgKnNkZCA9IHNkLT5w cml2YXRlOworCXN0cnVjdCBzY2hlZF9kb21haW4gKmNoaWxkOworCWludCBpOworCisJY3B1bWFz a19jbGVhcihjb3ZlcmVkKTsKKworCWZvcl9lYWNoX2NwdShpLCBzcGFuKSB7CisJCXN0cnVjdCBj cHVtYXNrICpzZ19zcGFuOworCisJCWlmIChjcHVtYXNrX3Rlc3RfY3B1KGksIGNvdmVyZWQpKQor CQkJY29udGludWU7CisKKwkJc2cgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVjdCBzY2hlZF9n cm91cCkgKyBjcHVtYXNrX3NpemUoKSwKKwkJCQlHRlBfS0VSTkVMLCBjcHVfdG9fbm9kZShpKSk7 CisKKwkJaWYgKCFzZykKKwkJCWdvdG8gZmFpbDsKKworCQlzZ19zcGFuID0gc2NoZWRfZ3JvdXBf Y3B1cyhzZyk7CisKKwkJY2hpbGQgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaSk7CisJCWlmIChj aGlsZC0+Y2hpbGQpIHsKKwkJCWNoaWxkID0gY2hpbGQtPmNoaWxkOworCQkJY3B1bWFza19jb3B5 KHNnX3NwYW4sIHNjaGVkX2RvbWFpbl9zcGFuKGNoaWxkKSk7CisJCX0gZWxzZQorCQkJY3B1bWFz a19zZXRfY3B1KGksIHNnX3NwYW4pOworCisJCWNwdW1hc2tfb3IoY292ZXJlZCwgY292ZXJlZCwg c2dfc3Bhbik7CisKKwkJc2ctPnNncCA9ICpwZXJfY3B1X3B0cihzZGQtPnNncCwgY3B1bWFza19m aXJzdChzZ19zcGFuKSk7CisJCWF0b21pY19pbmMoJnNnLT5zZ3AtPnJlZik7CisKKwkJaWYgKGNw dW1hc2tfdGVzdF9jcHUoY3B1LCBzZ19zcGFuKSkKKwkJCWdyb3VwcyA9IHNnOworCisJCWlmICgh Zmlyc3QpCisJCQlmaXJzdCA9IHNnOworCQlpZiAobGFzdCkKKwkJCWxhc3QtPm5leHQgPSBzZzsK KwkJbGFzdCA9IHNnOworCQlsYXN0LT5uZXh0ID0gZmlyc3Q7CisJfQorCXNkLT5ncm91cHMgPSBn cm91cHM7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlmcmVlX3NjaGVkX2dyb3VwcyhmaXJzdCwg MCk7CisKKwlyZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIGludCBnZXRfZ3JvdXAoaW50IGNw dSwgc3RydWN0IHNkX2RhdGEgKnNkZCwgc3RydWN0IHNjaGVkX2dyb3VwICoqc2cpCit7CisJc3Ry dWN0IHNjaGVkX2RvbWFpbiAqc2QgPSAqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KTsKKwlzdHJ1 Y3Qgc2NoZWRfZG9tYWluICpjaGlsZCA9IHNkLT5jaGlsZDsKKworCWlmIChjaGlsZCkKKwkJY3B1 ID0gY3B1bWFza19maXJzdChzY2hlZF9kb21haW5fc3BhbihjaGlsZCkpOworCisJaWYgKHNnKSB7 CisJCSpzZyA9ICpwZXJfY3B1X3B0cihzZGQtPnNnLCBjcHUpOworCQkoKnNnKS0+c2dwID0gKnBl cl9jcHVfcHRyKHNkZC0+c2dwLCBjcHUpOworCQlhdG9taWNfc2V0KCYoKnNnKS0+c2dwLT5yZWYs IDEpOyAvKiBmb3IgY2xhaW1fYWxsb2NhdGlvbnMgKi8KKwl9CisKKwlyZXR1cm4gY3B1OworfQor CisvKgorICogYnVpbGRfc2NoZWRfZ3JvdXBzIHdpbGwgYnVpbGQgYSBjaXJjdWxhciBsaW5rZWQg bGlzdCBvZiB0aGUgZ3JvdXBzCisgKiBjb3ZlcmVkIGJ5IHRoZSBnaXZlbiBzcGFuLCBhbmQgd2ls bCBzZXQgZWFjaCBncm91cCdzIC0+Y3B1bWFzayBjb3JyZWN0bHksCisgKiBhbmQgLT5jcHVfcG93 ZXIgdG8gMC4KKyAqCisgKiBBc3N1bWVzIHRoZSBzY2hlZF9kb21haW4gdHJlZSBpcyBmdWxseSBj b25zdHJ1Y3RlZAorICovCitzdGF0aWMgaW50CitidWlsZF9zY2hlZF9ncm91cHMoc3RydWN0IHNj aGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit7CisJc3RydWN0IHNjaGVkX2dyb3VwICpmaXJzdCA9 IE5VTEwsICpsYXN0ID0gTlVMTDsKKwlzdHJ1Y3Qgc2RfZGF0YSAqc2RkID0gc2QtPnByaXZhdGU7 CisJY29uc3Qgc3RydWN0IGNwdW1hc2sgKnNwYW4gPSBzY2hlZF9kb21haW5fc3BhbihzZCk7CisJ c3RydWN0IGNwdW1hc2sgKmNvdmVyZWQ7CisJaW50IGk7CisKKwlnZXRfZ3JvdXAoY3B1LCBzZGQs ICZzZC0+Z3JvdXBzKTsKKwlhdG9taWNfaW5jKCZzZC0+Z3JvdXBzLT5yZWYpOworCisJaWYgKGNw dSAhPSBjcHVtYXNrX2ZpcnN0KHNjaGVkX2RvbWFpbl9zcGFuKHNkKSkpCisJCXJldHVybiAwOwor CisJbG9ja2RlcF9hc3NlcnRfaGVsZCgmc2NoZWRfZG9tYWluc19tdXRleCk7CisJY292ZXJlZCA9 IHNjaGVkX2RvbWFpbnNfdG1wbWFzazsKKworCWNwdW1hc2tfY2xlYXIoY292ZXJlZCk7CisKKwlm b3JfZWFjaF9jcHUoaSwgc3BhbikgeworCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOworCQlpbnQg Z3JvdXAgPSBnZXRfZ3JvdXAoaSwgc2RkLCAmc2cpOworCQlpbnQgajsKKworCQlpZiAoY3B1bWFz a190ZXN0X2NwdShpLCBjb3ZlcmVkKSkKKwkJCWNvbnRpbnVlOworCisJCWNwdW1hc2tfY2xlYXIo c2NoZWRfZ3JvdXBfY3B1cyhzZykpOworCQlzZy0+c2dwLT5wb3dlciA9IDA7CisKKwkJZm9yX2Vh Y2hfY3B1KGosIHNwYW4pIHsKKwkJCWlmIChnZXRfZ3JvdXAoaiwgc2RkLCBOVUxMKSAhPSBncm91 cCkKKwkJCQljb250aW51ZTsKKworCQkJY3B1bWFza19zZXRfY3B1KGosIGNvdmVyZWQpOworCQkJ Y3B1bWFza19zZXRfY3B1KGosIHNjaGVkX2dyb3VwX2NwdXMoc2cpKTsKKwkJfQorCisJCWlmICgh Zmlyc3QpCisJCQlmaXJzdCA9IHNnOworCQlpZiAobGFzdCkKKwkJCWxhc3QtPm5leHQgPSBzZzsK KwkJbGFzdCA9IHNnOworCX0KKwlsYXN0LT5uZXh0ID0gZmlyc3Q7CisKKwlyZXR1cm4gMDsKK30K KworLyoKKyAqIEluaXRpYWxpemVycyBmb3Igc2NoZWR1bGUgZG9tYWlucworICogTm9uLWlubGlu ZWQgdG8gcmVkdWNlIGFjY3VtdWxhdGVkIHN0YWNrIHByZXNzdXJlIGluIGJ1aWxkX3NjaGVkX2Rv bWFpbnMoKQorICovCisKKyNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKKyMgZGVmaW5lIFNEX0lO SVRfTkFNRShzZCwgdHlwZSkJCXNkLT5uYW1lID0gI3R5cGUKKyNlbHNlCisjIGRlZmluZSBTRF9J TklUX05BTUUoc2QsIHR5cGUpCQlkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworI2RlZmluZSBT RF9JTklUX0ZVTkModHlwZSkJCQkJCQlcCitzdGF0aWMgbm9pbmxpbmUgc3RydWN0IHNjaGVkX2Rv bWFpbiAqCQkJCQlcCitzZF9pbml0XyMjdHlwZShzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5 X2xldmVsICp0bCwgaW50IGNwdSkgCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IHNjaGVkX2RvbWFp biAqc2QgPSAqcGVyX2NwdV9wdHIodGwtPmRhdGEuc2QsIGNwdSk7CVwKKwkqc2QgPSBTRF8jI3R5 cGUjI19JTklUOwkJCQkJCVwKKwlTRF9JTklUX05BTUUoc2QsIHR5cGUpOwkJCQkJCVwKKwlzZC0+ cHJpdmF0ZSA9ICZ0bC0+ZGF0YTsJCQkJCVwKKwlyZXR1cm4gc2Q7CQkJCQkJCVwKK30KKworU0Rf SU5JVF9GVU5DKENQVSkKKyNpZmRlZiBDT05GSUdfTlVNQQorIFNEX0lOSVRfRlVOQyhBTExOT0RF UykKKyBTRF9JTklUX0ZVTkMoTk9ERSkKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQK KyBTRF9JTklUX0ZVTkMoU0lCTElORykKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9NQwor IFNEX0lOSVRfRlVOQyhNQykKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9CT09LCisgU0Rf SU5JVF9GVU5DKEJPT0spCisjZW5kaWYKKworc3RhdGljIGludCBkZWZhdWx0X3JlbGF4X2RvbWFp bl9sZXZlbCA9IC0xOworaW50IHNjaGVkX2RvbWFpbl9sZXZlbF9tYXg7CisKK3N0YXRpYyBpbnQg X19pbml0IHNldHVwX3JlbGF4X2RvbWFpbl9sZXZlbChjaGFyICpzdHIpCit7CisJdW5zaWduZWQg bG9uZyB2YWw7CisKKwl2YWwgPSBzaW1wbGVfc3RydG91bChzdHIsIE5VTEwsIDApOworCWlmICh2 YWwgPCBzY2hlZF9kb21haW5fbGV2ZWxfbWF4KQorCQlkZWZhdWx0X3JlbGF4X2RvbWFpbl9sZXZl bCA9IHZhbDsKKworCXJldHVybiAxOworfQorX19zZXR1cCgicmVsYXhfZG9tYWluX2xldmVsPSIs IHNldHVwX3JlbGF4X2RvbWFpbl9sZXZlbCk7CisKK3N0YXRpYyB2b2lkIHNldF9kb21haW5fYXR0 cmlidXRlKHN0cnVjdCBzY2hlZF9kb21haW4gKnNkLAorCQkJCSBzdHJ1Y3Qgc2NoZWRfZG9tYWlu X2F0dHIgKmF0dHIpCit7CisJaW50IHJlcXVlc3Q7CisKKwlpZiAoIWF0dHIgfHwgYXR0ci0+cmVs YXhfZG9tYWluX2xldmVsIDwgMCkgeworCQlpZiAoZGVmYXVsdF9yZWxheF9kb21haW5fbGV2ZWwg PCAwKQorCQkJcmV0dXJuOworCQllbHNlCisJCQlyZXF1ZXN0ID0gZGVmYXVsdF9yZWxheF9kb21h aW5fbGV2ZWw7CisJfSBlbHNlCisJCXJlcXVlc3QgPSBhdHRyLT5yZWxheF9kb21haW5fbGV2ZWw7 CisJaWYgKHJlcXVlc3QgPCBzZC0+bGV2ZWwpIHsKKwkJLyogdHVybiBvZmYgaWRsZSBiYWxhbmNl IG9uIHRoaXMgZG9tYWluICovCisJCXNkLT5mbGFncyAmPSB+KFNEX0JBTEFOQ0VfV0FLRXxTRF9C QUxBTkNFX05FV0lETEUpOworCX0gZWxzZSB7CisJCS8qIHR1cm4gb24gaWRsZSBiYWxhbmNlIG9u IHRoaXMgZG9tYWluICovCisJCXNkLT5mbGFncyB8PSAoU0RfQkFMQU5DRV9XQUtFfFNEX0JBTEFO Q0VfTkVXSURMRSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX3NkdF9mcmVlKGNvbnN0IHN0cnVj dCBjcHVtYXNrICpjcHVfbWFwKTsKK3N0YXRpYyBpbnQgX19zZHRfYWxsb2MoY29uc3Qgc3RydWN0 IGNwdW1hc2sgKmNwdV9tYXApOworCitzdGF0aWMgdm9pZCBfX2ZyZWVfZG9tYWluX2FsbG9jcyhz dHJ1Y3Qgc19kYXRhICpkLCBlbnVtIHNfYWxsb2Mgd2hhdCwKKwkJCQkgY29uc3Qgc3RydWN0IGNw dW1hc2sgKmNwdV9tYXApCit7CisJc3dpdGNoICh3aGF0KSB7CisJY2FzZSBzYV9yb290ZG9tYWlu OgorCQlpZiAoIWF0b21pY19yZWFkKCZkLT5yZC0+cmVmY291bnQpKQorCQkJZnJlZV9yb290ZG9t YWluKCZkLT5yZC0+cmN1KTsgLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBzYV9zZDoKKwkJZnJl ZV9wZXJjcHUoZC0+c2QpOyAvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIHNhX3NkX3N0b3JhZ2U6 CisJCV9fc2R0X2ZyZWUoY3B1X21hcCk7IC8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2Ugc2Ffbm9u ZToKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgZW51bSBzX2FsbG9jIF9fdmlzaXRfZG9tYWlu X2FsbG9jYXRpb25faGVsbChzdHJ1Y3Qgc19kYXRhICpkLAorCQkJCQkJICAgY29uc3Qgc3RydWN0 IGNwdW1hc2sgKmNwdV9tYXApCit7CisJbWVtc2V0KGQsIDAsIHNpemVvZigqZCkpOworCisJaWYg KF9fc2R0X2FsbG9jKGNwdV9tYXApKQorCQlyZXR1cm4gc2Ffc2Rfc3RvcmFnZTsKKwlkLT5zZCA9 IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRfZG9tYWluICopOworCWlmICghZC0+c2QpCisJCXJl dHVybiBzYV9zZF9zdG9yYWdlOworCWQtPnJkID0gYWxsb2Nfcm9vdGRvbWFpbigpOworCWlmICgh ZC0+cmQpCisJCXJldHVybiBzYV9zZDsKKwlyZXR1cm4gc2Ffcm9vdGRvbWFpbjsKK30KKworLyoK KyAqIE5VTEwgdGhlIHNkX2RhdGEgZWxlbWVudHMgd2UndmUgdXNlZCB0byBidWlsZCB0aGUgc2No ZWRfZG9tYWluIGFuZAorICogc2NoZWRfZ3JvdXAgc3RydWN0dXJlIHNvIHRoYXQgdGhlIHN1YnNl cXVlbnQgX19mcmVlX2RvbWFpbl9hbGxvY3MoKQorICogd2lsbCBub3QgZnJlZSB0aGUgZGF0YSB3 ZSdyZSB1c2luZy4KKyAqLworc3RhdGljIHZvaWQgY2xhaW1fYWxsb2NhdGlvbnMoaW50IGNwdSwg c3RydWN0IHNjaGVkX2RvbWFpbiAqc2QpCit7CisJc3RydWN0IHNkX2RhdGEgKnNkZCA9IHNkLT5w cml2YXRlOworCisJV0FSTl9PTl9PTkNFKCpwZXJfY3B1X3B0cihzZGQtPnNkLCBjcHUpICE9IHNk KTsKKwkqcGVyX2NwdV9wdHIoc2RkLT5zZCwgY3B1KSA9IE5VTEw7CisKKwlpZiAoYXRvbWljX3Jl YWQoJigqcGVyX2NwdV9wdHIoc2RkLT5zZywgY3B1KSktPnJlZikpCisJCSpwZXJfY3B1X3B0cihz ZGQtPnNnLCBjcHUpID0gTlVMTDsKKworCWlmIChhdG9taWNfcmVhZCgmKCpwZXJfY3B1X3B0cihz ZGQtPnNncCwgY3B1KSktPnJlZikpCisJCSpwZXJfY3B1X3B0cihzZGQtPnNncCwgY3B1KSA9IE5V TEw7Cit9CisKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCitzdGF0aWMgY29uc3Qgc3RydWN0IGNw dW1hc2sgKmNwdV9zbXRfbWFzayhpbnQgY3B1KQoreworCXJldHVybiB0b3BvbG9neV90aHJlYWRf Y3B1bWFzayhjcHUpOworfQorI2VuZGlmCisKKy8qCisgKiBUb3BvbG9neSBsaXN0LCBib3R0b20t dXAuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsIGRlZmF1 bHRfdG9wb2xvZ3lbXSA9IHsKKyNpZmRlZiBDT05GSUdfU0NIRURfU01UCisJeyBzZF9pbml0X1NJ QkxJTkcsIGNwdV9zbXRfbWFzaywgfSwKKyNlbmRpZgorI2lmZGVmIENPTkZJR19TQ0hFRF9NQwor CXsgc2RfaW5pdF9NQywgY3B1X2NvcmVncm91cF9tYXNrLCB9LAorI2VuZGlmCisjaWZkZWYgQ09O RklHX1NDSEVEX0JPT0sKKwl7IHNkX2luaXRfQk9PSywgY3B1X2Jvb2tfbWFzaywgfSwKKyNlbmRp ZgorCXsgc2RfaW5pdF9DUFUsIGNwdV9jcHVfbWFzaywgfSwKKyNpZmRlZiBDT05GSUdfTlVNQQor CXsgc2RfaW5pdF9OT0RFLCBjcHVfbm9kZV9tYXNrLCBTRFRMX09WRVJMQVAsIH0sCisJeyBzZF9p bml0X0FMTE5PREVTLCBjcHVfYWxsbm9kZXNfbWFzaywgfSwKKyNlbmRpZgorCXsgTlVMTCwgfSwK K307CisKK3N0YXRpYyBzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICpzY2hlZF9k b21haW5fdG9wb2xvZ3kgPSBkZWZhdWx0X3RvcG9sb2d5OworCitzdGF0aWMgaW50IF9fc2R0X2Fs bG9jKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwKQoreworCXN0cnVjdCBzY2hlZF9kb21h aW5fdG9wb2xvZ3lfbGV2ZWwgKnRsOworCWludCBqOworCisJZm9yICh0bCA9IHNjaGVkX2RvbWFp bl90b3BvbG9neTsgdGwtPmluaXQ7IHRsKyspIHsKKwkJc3RydWN0IHNkX2RhdGEgKnNkZCA9ICZ0 bC0+ZGF0YTsKKworCQlzZGQtPnNkID0gYWxsb2NfcGVyY3B1KHN0cnVjdCBzY2hlZF9kb21haW4g Kik7CisJCWlmICghc2RkLT5zZCkKKwkJCXJldHVybiAtRU5PTUVNOworCisJCXNkZC0+c2cgPSBh bGxvY19wZXJjcHUoc3RydWN0IHNjaGVkX2dyb3VwICopOworCQlpZiAoIXNkZC0+c2cpCisJCQly ZXR1cm4gLUVOT01FTTsKKworCQlzZGQtPnNncCA9IGFsbG9jX3BlcmNwdShzdHJ1Y3Qgc2NoZWRf Z3JvdXBfcG93ZXIgKik7CisJCWlmICghc2RkLT5zZ3ApCisJCQlyZXR1cm4gLUVOT01FTTsKKwor CQlmb3JfZWFjaF9jcHUoaiwgY3B1X21hcCkgeworCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7 CisJCQlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnOworCQkJc3RydWN0IHNjaGVkX2dyb3VwX3Bvd2Vy ICpzZ3A7CisKKwkJCSAgIAlzZCA9IGt6YWxsb2Nfbm9kZShzaXplb2Yoc3RydWN0IHNjaGVkX2Rv bWFpbikgKyBjcHVtYXNrX3NpemUoKSwKKwkJCQkJR0ZQX0tFUk5FTCwgY3B1X3RvX25vZGUoaikp OworCQkJaWYgKCFzZCkKKwkJCQlyZXR1cm4gLUVOT01FTTsKKworCQkJKnBlcl9jcHVfcHRyKHNk ZC0+c2QsIGopID0gc2Q7CisKKwkJCXNnID0ga3phbGxvY19ub2RlKHNpemVvZihzdHJ1Y3Qgc2No ZWRfZ3JvdXApICsgY3B1bWFza19zaXplKCksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2Rl KGopKTsKKwkJCWlmICghc2cpCisJCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJCSpwZXJfY3B1X3B0 cihzZGQtPnNnLCBqKSA9IHNnOworCisJCQlzZ3AgPSBremFsbG9jX25vZGUoc2l6ZW9mKHN0cnVj dCBzY2hlZF9ncm91cF9wb3dlciksCisJCQkJCUdGUF9LRVJORUwsIGNwdV90b19ub2RlKGopKTsK KwkJCWlmICghc2dwKQorCQkJCXJldHVybiAtRU5PTUVNOworCisJCQkqcGVyX2NwdV9wdHIoc2Rk LT5zZ3AsIGopID0gc2dwOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IF9fc2R0X2ZyZWUoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCit7CisJc3RydWN0IHNj aGVkX2RvbWFpbl90b3BvbG9neV9sZXZlbCAqdGw7CisJaW50IGo7CisKKwlmb3IgKHRsID0gc2No ZWRfZG9tYWluX3RvcG9sb2d5OyB0bC0+aW5pdDsgdGwrKykgeworCQlzdHJ1Y3Qgc2RfZGF0YSAq c2RkID0gJnRsLT5kYXRhOworCisJCWZvcl9lYWNoX2NwdShqLCBjcHVfbWFwKSB7CisJCQlzdHJ1 Y3Qgc2NoZWRfZG9tYWluICpzZCA9ICpwZXJfY3B1X3B0cihzZGQtPnNkLCBqKTsKKwkJCWlmIChz ZCAmJiAoc2QtPmZsYWdzICYgU0RfT1ZFUkxBUCkpCisJCQkJZnJlZV9zY2hlZF9ncm91cHMoc2Qt Pmdyb3VwcywgMCk7CisJCQlrZnJlZSgqcGVyX2NwdV9wdHIoc2RkLT5zZCwgaikpOworCQkJa2Zy ZWUoKnBlcl9jcHVfcHRyKHNkZC0+c2csIGopKTsKKwkJCWtmcmVlKCpwZXJfY3B1X3B0cihzZGQt PnNncCwgaikpOworCQl9CisJCWZyZWVfcGVyY3B1KHNkZC0+c2QpOworCQlmcmVlX3BlcmNwdShz ZGQtPnNnKTsKKwkJZnJlZV9wZXJjcHUoc2RkLT5zZ3ApOworCX0KK30KKworc3RydWN0IHNjaGVk X2RvbWFpbiAqYnVpbGRfc2NoZWRfZG9tYWluKHN0cnVjdCBzY2hlZF9kb21haW5fdG9wb2xvZ3lf bGV2ZWwgKnRsLAorCQlzdHJ1Y3Qgc19kYXRhICpkLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1 X21hcCwKKwkJc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICphdHRyLCBzdHJ1Y3Qgc2NoZWRfZG9t YWluICpjaGlsZCwKKwkJaW50IGNwdSkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCA9IHRs LT5pbml0KHRsLCBjcHUpOworCWlmICghc2QpCisJCXJldHVybiBjaGlsZDsKKworCXNldF9kb21h aW5fYXR0cmlidXRlKHNkLCBhdHRyKTsKKwljcHVtYXNrX2FuZChzY2hlZF9kb21haW5fc3Bhbihz ZCksIGNwdV9tYXAsIHRsLT5tYXNrKGNwdSkpOworCWlmIChjaGlsZCkgeworCQlzZC0+bGV2ZWwg PSBjaGlsZC0+bGV2ZWwgKyAxOworCQlzY2hlZF9kb21haW5fbGV2ZWxfbWF4ID0gbWF4KHNjaGVk X2RvbWFpbl9sZXZlbF9tYXgsIHNkLT5sZXZlbCk7CisJCWNoaWxkLT5wYXJlbnQgPSBzZDsKKwl9 CisJc2QtPmNoaWxkID0gY2hpbGQ7CisKKwlyZXR1cm4gc2Q7Cit9CisKKy8qCisgKiBCdWlsZCBz Y2hlZCBkb21haW5zIGZvciBhIGdpdmVuIHNldCBvZiBjcHVzIGFuZCBhdHRhY2ggdGhlIHNjaGVk IGRvbWFpbnMKKyAqIHRvIHRoZSBpbmRpdmlkdWFsIGNwdXMKKyAqLworc3RhdGljIGludCBidWls ZF9zY2hlZF9kb21haW5zKGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVfbWFwLAorCQkJCSAgIHN0 cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqYXR0cikKK3sKKwllbnVtIHNfYWxsb2MgYWxsb2Nfc3Rh dGUgPSBzYV9ub25lOworCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOworCXN0cnVjdCBzX2RhdGEg ZDsKKwlpbnQgaSwgcmV0ID0gLUVOT01FTTsKKworCWFsbG9jX3N0YXRlID0gX192aXNpdF9kb21h aW5fYWxsb2NhdGlvbl9oZWxsKCZkLCBjcHVfbWFwKTsKKwlpZiAoYWxsb2Nfc3RhdGUgIT0gc2Ff cm9vdGRvbWFpbikKKwkJZ290byBlcnJvcjsKKworCS8qIFNldCB1cCBkb21haW5zIGZvciBjcHVz IHNwZWNpZmllZCBieSB0aGUgY3B1X21hcC4gKi8KKwlmb3JfZWFjaF9jcHUoaSwgY3B1X21hcCkg eworCQlzdHJ1Y3Qgc2NoZWRfZG9tYWluX3RvcG9sb2d5X2xldmVsICp0bDsKKworCQlzZCA9IE5V TEw7CisJCWZvciAodGwgPSBzY2hlZF9kb21haW5fdG9wb2xvZ3k7IHRsLT5pbml0OyB0bCsrKSB7 CisJCQlzZCA9IGJ1aWxkX3NjaGVkX2RvbWFpbih0bCwgJmQsIGNwdV9tYXAsIGF0dHIsIHNkLCBp KTsKKwkJCWlmICh0bC0+ZmxhZ3MgJiBTRFRMX09WRVJMQVApCisJCQkJc2QtPmZsYWdzIHw9IFNE X09WRVJMQVA7CisJCQlpZiAoY3B1bWFza19lcXVhbChjcHVfbWFwLCBzY2hlZF9kb21haW5fc3Bh bihzZCkpKQorCQkJCWJyZWFrOworCQl9CisKKwkJd2hpbGUgKHNkLT5jaGlsZCkKKwkJCXNkID0g c2QtPmNoaWxkOworCisJCSpwZXJfY3B1X3B0cihkLnNkLCBpKSA9IHNkOworCX0KKworCS8qIEJ1 aWxkIHRoZSBncm91cHMgZm9yIHRoZSBkb21haW5zICovCisJZm9yX2VhY2hfY3B1KGksIGNwdV9t YXApIHsKKwkJZm9yIChzZCA9ICpwZXJfY3B1X3B0cihkLnNkLCBpKTsgc2Q7IHNkID0gc2QtPnBh cmVudCkgeworCQkJc2QtPnNwYW5fd2VpZ2h0ID0gY3B1bWFza193ZWlnaHQoc2NoZWRfZG9tYWlu X3NwYW4oc2QpKTsKKwkJCWlmIChzZC0+ZmxhZ3MgJiBTRF9PVkVSTEFQKSB7CisJCQkJaWYgKGJ1 aWxkX292ZXJsYXBfc2NoZWRfZ3JvdXBzKHNkLCBpKSkKKwkJCQkJZ290byBlcnJvcjsKKwkJCX0g ZWxzZSB7CisJCQkJaWYgKGJ1aWxkX3NjaGVkX2dyb3VwcyhzZCwgaSkpCisJCQkJCWdvdG8gZXJy b3I7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDYWxjdWxhdGUgQ1BVIHBvd2VyIGZvciBwaHlzaWNh bCBwYWNrYWdlcyBhbmQgbm9kZXMgKi8KKwlmb3IgKGkgPSBucl9jcHVtYXNrX2JpdHMtMTsgaSA+ PSAwOyBpLS0pIHsKKwkJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGksIGNwdV9tYXApKQorCQkJY29u dGludWU7CisKKwkJZm9yIChzZCA9ICpwZXJfY3B1X3B0cihkLnNkLCBpKTsgc2Q7IHNkID0gc2Qt PnBhcmVudCkgeworCQkJY2xhaW1fYWxsb2NhdGlvbnMoaSwgc2QpOworCQl9CisJfQorCisJLyog QXR0YWNoIHRoZSBkb21haW5zICovCisJcmN1X3JlYWRfbG9jaygpOworCWZvcl9lYWNoX2NwdShp LCBjcHVfbWFwKSB7CisJCXNkID0gKnBlcl9jcHVfcHRyKGQuc2QsIGkpOworCQljcHVfYXR0YWNo X2RvbWFpbihzZCwgZC5yZCwgaSk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0ID0g MDsKK2Vycm9yOgorCV9fZnJlZV9kb21haW5fYWxsb2NzKCZkLCBhbGxvY19zdGF0ZSwgY3B1X21h cCk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNwdW1hc2tfdmFyX3QgKmRvbXNfY3VyOwkv KiBjdXJyZW50IHNjaGVkIGRvbWFpbnMgKi8KK3N0YXRpYyBpbnQgbmRvbXNfY3VyOwkJLyogbnVt YmVyIG9mIHNjaGVkIGRvbWFpbnMgaW4gJ2RvbXNfY3VyJyAqLworc3RhdGljIHN0cnVjdCBzY2hl ZF9kb21haW5fYXR0ciAqZGF0dHJfY3VyOworCQkJCS8qIGF0dHJpYnVlcyBvZiBjdXN0b20gZG9t YWlucyBpbiAnZG9tc19jdXInICovCisKKy8qCisgKiBTcGVjaWFsIGNhc2U6IElmIGEga21hbGxv YyBvZiBhIGRvbXNfY3VyIHBhcnRpdGlvbiAoYXJyYXkgb2YKKyAqIGNwdW1hc2spIGZhaWxzLCB0 aGVuIGZhbGxiYWNrIHRvIGEgc2luZ2xlIHNjaGVkIGRvbWFpbiwKKyAqIGFzIGRldGVybWluZWQg YnkgdGhlIHNpbmdsZSBjcHVtYXNrIGZhbGxiYWNrX2RvbXMuCisgKi8KK3N0YXRpYyBjcHVtYXNr X3Zhcl90IGZhbGxiYWNrX2RvbXM7CisKKy8qCisgKiBhcmNoX3VwZGF0ZV9jcHVfdG9wb2xvZ3kg bGV0cyB2aXJ0dWFsaXplZCBhcmNoaXRlY3R1cmVzIHVwZGF0ZSB0aGUKKyAqIGNwdSBjb3JlIG1h cHMuIEl0IGlzIHN1cHBvc2VkIHRvIHJldHVybiAxIGlmIHRoZSB0b3BvbG9neSBjaGFuZ2VkCisg KiBvciAwIGlmIGl0IHN0YXllZCB0aGUgc2FtZS4KKyAqLworaW50IF9fYXR0cmlidXRlX18oKHdl YWspKSBhcmNoX3VwZGF0ZV9jcHVfdG9wb2xvZ3kodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwor Y3B1bWFza192YXJfdCAqYWxsb2Nfc2NoZWRfZG9tYWlucyh1bnNpZ25lZCBpbnQgbmRvbXMpCit7 CisJaW50IGk7CisJY3B1bWFza192YXJfdCAqZG9tczsKKworCWRvbXMgPSBrbWFsbG9jKHNpemVv ZigqZG9tcykgKiBuZG9tcywgR0ZQX0tFUk5FTCk7CisJaWYgKCFkb21zKQorCQlyZXR1cm4gTlVM TDsKKwlmb3IgKGkgPSAwOyBpIDwgbmRvbXM7IGkrKykgeworCQlpZiAoIWFsbG9jX2NwdW1hc2tf dmFyKCZkb21zW2ldLCBHRlBfS0VSTkVMKSkgeworCQkJZnJlZV9zY2hlZF9kb21haW5zKGRvbXMs IGkpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9CisJcmV0dXJuIGRvbXM7Cit9CisKK3ZvaWQg ZnJlZV9zY2hlZF9kb21haW5zKGNwdW1hc2tfdmFyX3QgZG9tc1tdLCB1bnNpZ25lZCBpbnQgbmRv bXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IG5kb21zOyBpKyspCisJ CWZyZWVfY3B1bWFza192YXIoZG9tc1tpXSk7CisJa2ZyZWUoZG9tcyk7Cit9CisKKy8qCisgKiBT ZXQgdXAgc2NoZWR1bGVyIGRvbWFpbnMgYW5kIGdyb3Vwcy4gQ2FsbGVycyBtdXN0IGhvbGQgdGhl IGhvdHBsdWcgbG9jay4KKyAqIEZvciBub3cgdGhpcyBqdXN0IGV4Y2x1ZGVzIGlzb2xhdGVkIGNw dXMsIGJ1dCBjb3VsZCBiZSB1c2VkIHRvCisgKiBleGNsdWRlIG90aGVyIHNwZWNpYWwgY2FzZXMg aW4gdGhlIGZ1dHVyZS4KKyAqLworc3RhdGljIGludCBpbml0X3NjaGVkX2RvbWFpbnMoY29uc3Qg c3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCit7CisJaW50IGVycjsKKworCWFyY2hfdXBkYXRlX2Nw dV90b3BvbG9neSgpOworCW5kb21zX2N1ciA9IDE7CisJZG9tc19jdXIgPSBhbGxvY19zY2hlZF9k b21haW5zKG5kb21zX2N1cik7CisJaWYgKCFkb21zX2N1cikKKwkJZG9tc19jdXIgPSAmZmFsbGJh Y2tfZG9tczsKKwljcHVtYXNrX2FuZG5vdChkb21zX2N1clswXSwgY3B1X21hcCwgY3B1X2lzb2xh dGVkX21hcCk7CisJZGF0dHJfY3VyID0gTlVMTDsKKwllcnIgPSBidWlsZF9zY2hlZF9kb21haW5z KGRvbXNfY3VyWzBdLCBOVUxMKTsKKwlyZWdpc3Rlcl9zY2hlZF9kb21haW5fc3lzY3RsKCk7CisK KwlyZXR1cm4gZXJyOworfQorCisvKgorICogRGV0YWNoIHNjaGVkIGRvbWFpbnMgZnJvbSBhIGdy b3VwIG9mIGNwdXMgc3BlY2lmaWVkIGluIGNwdV9tYXAKKyAqIFRoZXNlIGNwdXMgd2lsbCBub3cg YmUgYXR0YWNoZWQgdG8gdGhlIE5VTEwgZG9tYWluCisgKi8KK3N0YXRpYyB2b2lkIGRldGFjaF9k ZXN0cm95X2RvbWFpbnMoY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXApCit7CisJaW50IGk7 CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZm9yX2VhY2hfY3B1KGksIGNwdV9tYXApCisJCWNwdV9h dHRhY2hfZG9tYWluKE5VTEwsICZkZWZfcm9vdF9kb21haW4sIGkpOworCXJjdV9yZWFkX3VubG9j aygpOworfQorCisvKiBoYW5kbGUgbnVsbCBhcyAiZGVmYXVsdCIgKi8KK3N0YXRpYyBpbnQgZGF0 dHJzX2VxdWFsKHN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqY3VyLCBpbnQgaWR4X2N1ciwKKwkJ CXN0cnVjdCBzY2hlZF9kb21haW5fYXR0ciAqbmV3LCBpbnQgaWR4X25ldykKK3sKKwlzdHJ1Y3Qg c2NoZWRfZG9tYWluX2F0dHIgdG1wOworCisJLyogZmFzdCBwYXRoICovCisJaWYgKCFuZXcgJiYg IWN1cikKKwkJcmV0dXJuIDE7CisKKwl0bXAgPSBTRF9BVFRSX0lOSVQ7CisJcmV0dXJuICFtZW1j bXAoY3VyID8gKGN1ciArIGlkeF9jdXIpIDogJnRtcCwKKwkJCW5ldyA/IChuZXcgKyBpZHhfbmV3 KSA6ICZ0bXAsCisJCQlzaXplb2Yoc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyKSk7Cit9CisKKy8q CisgKiBQYXJ0aXRpb24gc2NoZWQgZG9tYWlucyBhcyBzcGVjaWZpZWQgYnkgdGhlICduZG9tc19u ZXcnCisgKiBjcHVtYXNrcyBpbiB0aGUgYXJyYXkgZG9tc19uZXdbXSBvZiBjcHVtYXNrcy4gVGhp cyBjb21wYXJlcworICogZG9tc19uZXdbXSB0byB0aGUgY3VycmVudCBzY2hlZCBkb21haW4gcGFy dGl0aW9uaW5nLCBkb21zX2N1cltdLgorICogSXQgZGVzdHJveXMgZWFjaCBkZWxldGVkIGRvbWFp biBhbmQgYnVpbGRzIGVhY2ggbmV3IGRvbWFpbi4KKyAqCisgKiAnZG9tc19uZXcnIGlzIGFuIGFy cmF5IG9mIGNwdW1hc2tfdmFyX3QncyBvZiBsZW5ndGggJ25kb21zX25ldycuCisgKiBUaGUgbWFz a3MgZG9uJ3QgaW50ZXJzZWN0IChkb24ndCBvdmVybGFwLikgV2Ugc2hvdWxkIHNldHVwIG9uZQor ICogc2NoZWQgZG9tYWluIGZvciBlYWNoIG1hc2suIENQVXMgbm90IGluIGFueSBvZiB0aGUgY3B1 bWFza3Mgd2lsbAorICogbm90IGJlIGxvYWQgYmFsYW5jZWQuIElmIHRoZSBzYW1lIGNwdW1hc2sg YXBwZWFycyBib3RoIGluIHRoZQorICogY3VycmVudCAnZG9tc19jdXInIGRvbWFpbnMgYW5kIGlu IHRoZSBuZXcgJ2RvbXNfbmV3Jywgd2UgY2FuIGxlYXZlCisgKiBpdCBhcyBpdCBpcy4KKyAqCisg KiBUaGUgcGFzc2VkIGluICdkb21zX25ldycgc2hvdWxkIGJlIGFsbG9jYXRlZCB1c2luZworICog YWxsb2Nfc2NoZWRfZG9tYWlucy4gIFRoaXMgcm91dGluZSB0YWtlcyBvd25lcnNoaXAgb2YgaXQg YW5kIHdpbGwKKyAqIGZyZWVfc2NoZWRfZG9tYWlucyBpdCB3aGVuIGRvbmUgd2l0aCBpdC4gSWYg dGhlIGNhbGxlciBmYWlsZWQgdGhlCisgKiBhbGxvYyBjYWxsLCB0aGVuIGl0IGNhbiBwYXNzIGlu IGRvbXNfbmV3ID09IE5VTEwgJiYgbmRvbXNfbmV3ID09IDEsCisgKiBhbmQgcGFydGl0aW9uX3Nj aGVkX2RvbWFpbnMoKSB3aWxsIGZhbGxiYWNrIHRvIHRoZSBzaW5nbGUgcGFydGl0aW9uCisgKiAn ZmFsbGJhY2tfZG9tcycsIGl0IGFsc28gZm9yY2VzIHRoZSBkb21haW5zIHRvIGJlIHJlYnVpbHQu CisgKgorICogSWYgZG9tc19uZXcgPT0gTlVMTCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggY3B1 X29ubGluZV9tYXNrLgorICogbmRvbXNfbmV3ID09IDAgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIGRl c3Ryb3lpbmcgZXhpc3RpbmcgZG9tYWlucywKKyAqIGFuZCBpdCB3aWxsIG5vdCBjcmVhdGUgdGhl IGRlZmF1bHQgZG9tYWluLgorICoKKyAqIENhbGwgd2l0aCBob3RwbHVnIGxvY2sgaGVsZAorICov Cit2b2lkIHBhcnRpdGlvbl9zY2hlZF9kb21haW5zKGludCBuZG9tc19uZXcsIGNwdW1hc2tfdmFy X3QgZG9tc19uZXdbXSwKKwkJCQkgc3RydWN0IHNjaGVkX2RvbWFpbl9hdHRyICpkYXR0cl9uZXcp Cit7CisJaW50IGksIGosIG47CisJaW50IG5ld190b3BvbG9neTsKKworCW11dGV4X2xvY2soJnNj aGVkX2RvbWFpbnNfbXV0ZXgpOworCisJLyogYWx3YXlzIHVucmVnaXN0ZXIgaW4gY2FzZSB3ZSBk b24ndCBkZXN0cm95IGFueSBkb21haW5zICovCisJdW5yZWdpc3Rlcl9zY2hlZF9kb21haW5fc3lz Y3RsKCk7CisKKwkvKiBMZXQgYXJjaGl0ZWN0dXJlIHVwZGF0ZSBjcHUgY29yZSBtYXBwaW5ncy4g Ki8KKwluZXdfdG9wb2xvZ3kgPSBhcmNoX3VwZGF0ZV9jcHVfdG9wb2xvZ3koKTsKKworCW4gPSBk b21zX25ldyA/IG5kb21zX25ldyA6IDA7CisKKwkvKiBEZXN0cm95IGRlbGV0ZWQgZG9tYWlucyAq LworCWZvciAoaSA9IDA7IGkgPCBuZG9tc19jdXI7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwg biAmJiAhbmV3X3RvcG9sb2d5OyBqKyspIHsKKwkJCWlmIChjcHVtYXNrX2VxdWFsKGRvbXNfY3Vy W2ldLCBkb21zX25ld1tqXSkKKwkJCQkmJiBkYXR0cnNfZXF1YWwoZGF0dHJfY3VyLCBpLCBkYXR0 cl9uZXcsIGopKQorCQkJCWdvdG8gbWF0Y2gxOworCQl9CisJCS8qIG5vIG1hdGNoIC0gYSBjdXJy ZW50IHNjaGVkIGRvbWFpbiBub3QgaW4gbmV3IGRvbXNfbmV3W10gKi8KKwkJZGV0YWNoX2Rlc3Ry b3lfZG9tYWlucyhkb21zX2N1cltpXSk7CittYXRjaDE6CisJCTsKKwl9CisKKwlpZiAoZG9tc19u ZXcgPT0gTlVMTCkgeworCQluZG9tc19jdXIgPSAwOworCQlkb21zX25ldyA9ICZmYWxsYmFja19k b21zOworCQljcHVtYXNrX2FuZG5vdChkb21zX25ld1swXSwgY3B1X2FjdGl2ZV9tYXNrLCBjcHVf aXNvbGF0ZWRfbWFwKTsKKwkJV0FSTl9PTl9PTkNFKGRhdHRyX25ldyk7CisJfQorCisJLyogQnVp bGQgbmV3IGRvbWFpbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbmRvbXNfbmV3OyBpKyspIHsKKwkJ Zm9yIChqID0gMDsgaiA8IG5kb21zX2N1ciAmJiAhbmV3X3RvcG9sb2d5OyBqKyspIHsKKwkJCWlm IChjcHVtYXNrX2VxdWFsKGRvbXNfbmV3W2ldLCBkb21zX2N1cltqXSkKKwkJCQkmJiBkYXR0cnNf ZXF1YWwoZGF0dHJfbmV3LCBpLCBkYXR0cl9jdXIsIGopKQorCQkJCWdvdG8gbWF0Y2gyOworCQl9 CisJCS8qIG5vIG1hdGNoIC0gYWRkIGEgbmV3IGRvbXNfbmV3ICovCisJCWJ1aWxkX3NjaGVkX2Rv bWFpbnMoZG9tc19uZXdbaV0sIGRhdHRyX25ldyA/IGRhdHRyX25ldyArIGkgOiBOVUxMKTsKK21h dGNoMjoKKwkJOworCX0KKworCS8qIFJlbWVtYmVyIHRoZSBuZXcgc2NoZWQgZG9tYWlucyAqLwor CWlmIChkb21zX2N1ciAhPSAmZmFsbGJhY2tfZG9tcykKKwkJZnJlZV9zY2hlZF9kb21haW5zKGRv bXNfY3VyLCBuZG9tc19jdXIpOworCWtmcmVlKGRhdHRyX2N1cik7CS8qIGtmcmVlKE5VTEwpIGlz IHNhZmUgKi8KKwlkb21zX2N1ciA9IGRvbXNfbmV3OworCWRhdHRyX2N1ciA9IGRhdHRyX25ldzsK KwluZG9tc19jdXIgPSBuZG9tc19uZXc7CisKKwlyZWdpc3Rlcl9zY2hlZF9kb21haW5fc3lzY3Rs KCk7CisKKwltdXRleF91bmxvY2soJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOworfQorCisjaWYgZGVm aW5lZChDT05GSUdfU0NIRURfTUMpIHx8IGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkKK3N0YXRp YyB2b2lkIHJlaW5pdF9zY2hlZF9kb21haW5zKHZvaWQpCit7CisJZ2V0X29ubGluZV9jcHVzKCk7 CisKKwkvKiBEZXN0cm95IGRvbWFpbnMgZmlyc3QgdG8gZm9yY2UgdGhlIHJlYnVpbGQgKi8KKwlw YXJ0aXRpb25fc2NoZWRfZG9tYWlucygwLCBOVUxMLCBOVUxMKTsKKworCXJlYnVpbGRfc2NoZWRf ZG9tYWlucygpOworCXB1dF9vbmxpbmVfY3B1cygpOworfQorCitzdGF0aWMgc3NpemVfdCBzY2hl ZF9wb3dlcl9zYXZpbmdzX3N0b3JlKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBpbnQg c210KQoreworCXVuc2lnbmVkIGludCBsZXZlbCA9IDA7CisKKwlpZiAoc3NjYW5mKGJ1ZiwgIiV1 IiwgJmxldmVsKSAhPSAxKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qCisJICogbGV2ZWwgaXMg YWx3YXlzIGJlIHBvc2l0aXZlIHNvIGRvbid0IGNoZWNrIGZvcgorCSAqIGxldmVsIDwgUE9XRVJT QVZJTkdTX0JBTEFOQ0VfTk9ORSB3aGljaCBpcyAwCisJICogV2hhdCBoYXBwZW5zIG9uIDAgb3Ig MSBieXRlIHdyaXRlLAorCSAqIG5lZWQgdG8gY2hlY2sgZm9yIGNvdW50IGFzIHdlbGw/CisJICov CisKKwlpZiAobGV2ZWwgPj0gTUFYX1BPV0VSU0FWSU5HU19CQUxBTkNFX0xFVkVMUykKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwlpZiAoc210KQorCQlzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyA9IGxl dmVsOworCWVsc2UKKwkJc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyA9IGxldmVsOworCisJcmVpbml0 X3NjaGVkX2RvbWFpbnMoKTsKKworCXJldHVybiBjb3VudDsKK30KKworI2lmZGVmIENPTkZJR19T Q0hFRF9NQworc3RhdGljIHNzaXplX3Qgc2NoZWRfbWNfcG93ZXJfc2F2aW5nc19zaG93KHN0cnVj dCBkZXZpY2UgKmRldiwKKwkJCQkJICAgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJ CQkJCSAgIGNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIldVxuIiwgc2NoZWRf bWNfcG93ZXJfc2F2aW5ncyk7Cit9CitzdGF0aWMgc3NpemVfdCBzY2hlZF9tY19wb3dlcl9zYXZp bmdzX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCQkJCXN0cnVjdCBkZXZpY2VfYXR0cmli dXRlICphdHRyLAorCQkJCQkJY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0 dXJuIHNjaGVkX3Bvd2VyX3NhdmluZ3Nfc3RvcmUoYnVmLCBjb3VudCwgMCk7Cit9CitzdGF0aWMg REVWSUNFX0FUVFIoc2NoZWRfbWNfcG93ZXJfc2F2aW5ncywgMDY0NCwKKwkJICAgc2NoZWRfbWNf cG93ZXJfc2F2aW5nc19zaG93LAorCQkgICBzY2hlZF9tY19wb3dlcl9zYXZpbmdzX3N0b3JlKTsK KyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorc3RhdGljIHNzaXplX3Qgc2NoZWRf c210X3Bvd2VyX3NhdmluZ3Nfc2hvdyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCQlzdHJ1Y3Qg ZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCQkJCWNoYXIgKmJ1ZikKK3sKKwlyZXR1cm4gc3By aW50ZihidWYsICIldVxuIiwgc2NoZWRfc210X3Bvd2VyX3NhdmluZ3MpOworfQorc3RhdGljIHNz aXplX3Qgc2NoZWRfc210X3Bvd2VyX3NhdmluZ3Nfc3RvcmUoc3RydWN0IGRldmljZSAqZGV2LAor CQkJCQkJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkJCQkgY29uc3QgY2hhciAq YnVmLCBzaXplX3QgY291bnQpCit7CisJcmV0dXJuIHNjaGVkX3Bvd2VyX3NhdmluZ3Nfc3RvcmUo YnVmLCBjb3VudCwgMSk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFIoc2NoZWRfc210X3Bvd2VyX3Nh dmluZ3MsIDA2NDQsCisJCSAgIHNjaGVkX3NtdF9wb3dlcl9zYXZpbmdzX3Nob3csCisJCSAgIHNj aGVkX3NtdF9wb3dlcl9zYXZpbmdzX3N0b3JlKTsKKyNlbmRpZgorCitpbnQgX19pbml0IHNjaGVk X2NyZWF0ZV9zeXNmc19wb3dlcl9zYXZpbmdzX2VudHJpZXMoc3RydWN0IGRldmljZSAqZGV2KQor eworCWludCBlcnIgPSAwOworCisjaWZkZWYgQ09ORklHX1NDSEVEX1NNVAorCWlmIChzbXRfY2Fw YWJsZSgpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAmZGV2X2F0dHJfc2NoZWRf c210X3Bvd2VyX3NhdmluZ3MpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEX01DCisJaWYg KCFlcnIgJiYgbWNfY2FwYWJsZSgpKQorCQllcnIgPSBkZXZpY2VfY3JlYXRlX2ZpbGUoZGV2LCAm ZGV2X2F0dHJfc2NoZWRfbWNfcG93ZXJfc2F2aW5ncyk7CisjZW5kaWYKKwlyZXR1cm4gZXJyOwor fQorI2VuZGlmIC8qIENPTkZJR19TQ0hFRF9NQyB8fCBDT05GSUdfU0NIRURfU01UICovCisKKy8q CisgKiBVcGRhdGUgY3B1c2V0cyBhY2NvcmRpbmcgdG8gY3B1X2FjdGl2ZSBtYXNrLiAgSWYgY3B1 c2V0cyBhcmUKKyAqIGRpc2FibGVkLCBjcHVzZXRfdXBkYXRlX2FjdGl2ZV9jcHVzKCkgYmVjb21l cyBhIHNpbXBsZSB3cmFwcGVyCisgKiBhcm91bmQgcGFydGl0aW9uX3NjaGVkX2RvbWFpbnMoKS4K KyAqLworc3RhdGljIGludCBjcHVzZXRfY3B1X2FjdGl2ZShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sg Km5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkJIHZvaWQgKmhjcHUpCit7CisJc3dpdGNo IChhY3Rpb24gJiB+Q1BVX1RBU0tTX0ZST1pFTikgeworCWNhc2UgQ1BVX09OTElORToKKwljYXNl IENQVV9TVEFSVElORzoKKwljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJY3B1c2V0X3VwZGF0ZV9h Y3RpdmVfY3B1cygpOworCQlyZXR1cm4gTk9USUZZX09LOworCWRlZmF1bHQ6CisJCXJldHVybiBO T1RJRllfRE9ORTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3B1c2V0X2NwdV9pbmFjdGl2ZShzdHJ1 Y3Qgbm90aWZpZXJfYmxvY2sgKm5mYiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sCisJCQkJICAgdm9p ZCAqaGNwdSkKK3sKKwlzd2l0Y2ggKGFjdGlvbiAmIH5DUFVfVEFTS1NfRlJPWkVOKSB7CisJY2Fz ZSBDUFVfRE9XTl9QUkVQQVJFOgorCQljcHVzZXRfdXBkYXRlX2FjdGl2ZV9jcHVzKCk7CisJCXJl dHVybiBOT1RJRllfT0s7CisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KK30K KworI2lmIGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkgfHwgZGVmaW5lZChDT05GSUdfU0NIRURf TUMpCisvKgorICogQ2hlYXBlciB2ZXJzaW9uIG9mIHRoZSBiZWxvdyBmdW5jdGlvbnMgaW4gY2Fz ZSBzdXBwb3J0IGZvciBTTVQgYW5kIE1DIGlzCisgKiBjb21waWxlZCBpbiBidXQgQ1BVcyBoYXZl IG5vIHNpYmxpbmdzLgorICovCitzdGF0aWMgYm9vbCBzb2xlX2NwdV9pZGxlKGludCBjcHUpCit7 CisJcmV0dXJuIHJxX2lkbGUoY3B1X3JxKGNwdSkpOworfQorI2VuZGlmCisjaWZkZWYgQ09ORklH X1NDSEVEX1NNVAorLyogQWxsIHRoaXMgQ1BVJ3MgU01UIHNpYmxpbmdzIGFyZSBpZGxlICovCitz dGF0aWMgYm9vbCBzaWJsaW5nc19jcHVfaWRsZShpbnQgY3B1KQoreworCXJldHVybiBjcHVtYXNr X3N1YnNldCgmKGNwdV9ycShjcHUpLT5zbXRfc2libGluZ3MpLAorCQkJCSAgJmdycS5jcHVfaWRs ZV9tYXApOworfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEX01DCisvKiBBbGwgdGhpcyBD UFUncyBzaGFyZWQgY2FjaGUgc2libGluZ3MgYXJlIGlkbGUgKi8KK3N0YXRpYyBib29sIGNhY2hl X2NwdV9pZGxlKGludCBjcHUpCit7CisJcmV0dXJuIGNwdW1hc2tfc3Vic2V0KCYoY3B1X3JxKGNw dSktPmNhY2hlX3NpYmxpbmdzKSwKKwkJCQkgICZncnEuY3B1X2lkbGVfbWFwKTsKK30KKyNlbmRp ZgorCitlbnVtIHNjaGVkX2RvbWFpbl9sZXZlbCB7CisJU0RfTFZfTk9ORSA9IDAsCisJU0RfTFZf U0lCTElORywKKwlTRF9MVl9NQywKKwlTRF9MVl9CT09LLAorCVNEX0xWX0NQVSwKKwlTRF9MVl9O T0RFLAorCVNEX0xWX0FMTE5PREVTLAorCVNEX0xWX01BWAorfTsKKwordm9pZCBfX2luaXQgc2No ZWRfaW5pdF9zbXAodm9pZCkKK3sKKwlzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZDsKKwlpbnQgY3B1 OworCisJY3B1bWFza192YXJfdCBub25faXNvbGF0ZWRfY3B1czsKKworCWFsbG9jX2NwdW1hc2tf dmFyKCZub25faXNvbGF0ZWRfY3B1cywgR0ZQX0tFUk5FTCk7CisJYWxsb2NfY3B1bWFza192YXIo JmZhbGxiYWNrX2RvbXMsIEdGUF9LRVJORUwpOworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJbXV0 ZXhfbG9jaygmc2NoZWRfZG9tYWluc19tdXRleCk7CisJaW5pdF9zY2hlZF9kb21haW5zKGNwdV9h Y3RpdmVfbWFzayk7CisJY3B1bWFza19hbmRub3Qobm9uX2lzb2xhdGVkX2NwdXMsIGNwdV9wb3Nz aWJsZV9tYXNrLCBjcHVfaXNvbGF0ZWRfbWFwKTsKKwlpZiAoY3B1bWFza19lbXB0eShub25faXNv bGF0ZWRfY3B1cykpCisJCWNwdW1hc2tfc2V0X2NwdShzbXBfcHJvY2Vzc29yX2lkKCksIG5vbl9p c29sYXRlZF9jcHVzKTsKKwltdXRleF91bmxvY2soJnNjaGVkX2RvbWFpbnNfbXV0ZXgpOworCXB1 dF9vbmxpbmVfY3B1cygpOworCisJaG90Y3B1X25vdGlmaWVyKGNwdXNldF9jcHVfYWN0aXZlLCBD UFVfUFJJX0NQVVNFVF9BQ1RJVkUpOworCWhvdGNwdV9ub3RpZmllcihjcHVzZXRfY3B1X2luYWN0 aXZlLCBDUFVfUFJJX0NQVVNFVF9JTkFDVElWRSk7CisKKwkvKiBNb3ZlIGluaXQgb3ZlciB0byBh IG5vbi1pc29sYXRlZCBDUFUgKi8KKwlpZiAoc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwg bm9uX2lzb2xhdGVkX2NwdXMpIDwgMCkKKwkJQlVHKCk7CisJZnJlZV9jcHVtYXNrX3Zhcihub25f aXNvbGF0ZWRfY3B1cyk7CisKKwlncnFfbG9ja19pcnEoKTsKKwkvKgorCSAqIFNldCB1cCB0aGUg cmVsYXRpdmUgY2FjaGUgZGlzdGFuY2Ugb2YgZWFjaCBvbmxpbmUgY3B1IGZyb20gZWFjaAorCSAq IG90aGVyIGluIGEgc2ltcGxlIGFycmF5IGZvciBxdWljayBsb29rdXAuIExvY2FsaXR5IGlzIGRl dGVybWluZWQKKwkgKiBieSB0aGUgY2xvc2VzdCBzY2hlZF9kb21haW4gdGhhdCBDUFVzIGFyZSBz ZXBhcmF0ZWQgYnkuIENQVXMgd2l0aAorCSAqIHNoYXJlZCBjYWNoZSBpbiBTTVQgYW5kIE1DIGFy ZSB0cmVhdGVkIGFzIGxvY2FsLiBTZXBhcmF0ZSBDUFVzCisJICogKHdpdGhpbiB0aGUgc2FtZSBw YWNrYWdlIG9yIHBoeXNpY2FsbHkpIHdpdGhpbiB0aGUgc2FtZSBub2RlIGFyZQorCSAqIHRyZWF0 ZWQgYXMgbm90IGxvY2FsLiBDUFVzIG5vdCBldmVuIGluIHRoZSBzYW1lIGRvbWFpbiAoZGlmZmVy ZW50CisJICogbm9kZXMpIGFyZSB0cmVhdGVkIGFzIHZlcnkgZGlzdGFudC4KKwkgKi8KKwlmb3Jf ZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlzdHJ1Y3QgcnEgKnJxID0gY3B1X3JxKGNwdSk7CisJ CWZvcl9lYWNoX2RvbWFpbihjcHUsIHNkKSB7CisJCQlpbnQgbG9jYWxpdHksIG90aGVyX2NwdTsK KworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwkJCWlmIChzZC0+bGV2ZWwgPT0gU0RfTFZfU0lC TElORykgeworCQkJCWZvcl9lYWNoX2NwdV9tYXNrKG90aGVyX2NwdSwgKnNjaGVkX2RvbWFpbl9z cGFuKHNkKSkKKwkJCQkJY3B1bWFza19zZXRfY3B1KG90aGVyX2NwdSwgJnJxLT5zbXRfc2libGlu Z3MpOworCQkJfQorI2VuZGlmCisjaWZkZWYgQ09ORklHX1NDSEVEX01DCisJCQlpZiAoc2QtPmxl dmVsID09IFNEX0xWX01DKSB7CisJCQkJZm9yX2VhY2hfY3B1X21hc2sob3RoZXJfY3B1LCAqc2No ZWRfZG9tYWluX3NwYW4oc2QpKQorCQkJCQljcHVtYXNrX3NldF9jcHUob3RoZXJfY3B1LCAmcnEt PmNhY2hlX3NpYmxpbmdzKTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKHNkLT5sZXZlbCA8PSBTRF9M Vl9TSUJMSU5HKQorCQkJCWxvY2FsaXR5ID0gMTsKKwkJCWVsc2UgaWYgKHNkLT5sZXZlbCA8PSBT RF9MVl9NQykKKwkJCQlsb2NhbGl0eSA9IDI7CisJCQllbHNlIGlmIChzZC0+bGV2ZWwgPD0gU0Rf TFZfTk9ERSkKKwkJCQlsb2NhbGl0eSA9IDM7CisJCQllbHNlCisJCQkJY29udGludWU7CisKKwkJ CWZvcl9lYWNoX2NwdV9tYXNrKG90aGVyX2NwdSwgKnNjaGVkX2RvbWFpbl9zcGFuKHNkKSkgewor CQkJCWlmIChsb2NhbGl0eSA8IHJxLT5jcHVfbG9jYWxpdHlbb3RoZXJfY3B1XSkKKwkJCQkJcnEt PmNwdV9sb2NhbGl0eVtvdGhlcl9jcHVdID0gbG9jYWxpdHk7CisJCQl9CisJCX0KKworLyoKKwkJ ICogRWFjaCBydW5xdWV1ZSBoYXMgaXRzIG93biBmdW5jdGlvbiBpbiBjYXNlIGl0IGRvZXNuJ3Qg aGF2ZQorCQkgKiBzaWJsaW5ncyBvZiBpdHMgb3duIGFsbG93aW5nIG1peGVkIHRvcG9sb2dpZXMu CisJCSAqLworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwkJaWYgKGNwdXNfd2VpZ2h0KHJxLT5z bXRfc2libGluZ3MpID4gMSkKKwkJCXJxLT5zaWJsaW5nc19pZGxlID0gc2libGluZ3NfY3B1X2lk bGU7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfU0NIRURfTUMKKwkJaWYgKGNwdXNfd2VpZ2h0KHJx LT5jYWNoZV9zaWJsaW5ncykgPiAxKQorCQkJcnEtPmNhY2hlX2lkbGUgPSBjYWNoZV9jcHVfaWRs ZTsKKyNlbmRpZgorCX0KKwlncnFfdW5sb2NrX2lycSgpOworfQorI2Vsc2UKK3ZvaWQgX19pbml0 IHNjaGVkX2luaXRfc21wKHZvaWQpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX1NNUCAqLworCit1 bnNpZ25lZCBpbnQgc3lzY3RsX3RpbWVyX21pZ3JhdGlvbiA9IDE7CisKK2ludCBpbl9zY2hlZF9m dW5jdGlvbnModW5zaWduZWQgbG9uZyBhZGRyKQoreworCXJldHVybiBpbl9sb2NrX2Z1bmN0aW9u cyhhZGRyKSB8fAorCQkoYWRkciA+PSAodW5zaWduZWQgbG9uZylfX3NjaGVkX3RleHRfc3RhcnQK KwkJJiYgYWRkciA8ICh1bnNpZ25lZCBsb25nKV9fc2NoZWRfdGV4dF9lbmQpOworfQorCit2b2lk IF9faW5pdCBzY2hlZF9pbml0KHZvaWQpCit7CisJaW50IGk7CisJc3RydWN0IHJxICpycTsKKwor CXByaW50X3NjaGVkdWxlcl92ZXJzaW9uKCk7CisKKwlyYXdfc3Bpbl9sb2NrX2luaXQoJmdycS5s b2NrKTsKKwlncnEubnJfcnVubmluZyA9IGdycS5ucl91bmludGVycnVwdGlibGUgPSBncnEubnJf c3dpdGNoZXMgPSAwOworCWdycS5ub2MgPSAxOworI2lmZGVmIENPTkZJR19TTVAKKwlpbml0X2Rl ZnJvb3Rkb21haW4oKTsKKwlncnEucW5yID0gZ3JxLmlkbGVfY3B1cyA9IDA7CisJY3B1bWFza19j bGVhcigmZ3JxLmNwdV9pZGxlX21hcCk7CisKKyNlbHNlCisJdXBycSA9ICZwZXJfY3B1KHJ1bnF1 ZXVlcywgMCk7CisjZW5kaWYKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgeworCQlycSA9IGNw dV9ycShpKTsKKwkJcnEtPnVzZXJfcGMgPSBycS0+bmljZV9wYyA9IHJxLT5zb2Z0aXJxX3BjID0g cnEtPnN5c3RlbV9wYyA9CisJCQkJICBycS0+aW93YWl0X3BjID0gcnEtPmlkbGVfcGMgPSAwOwor CQlycS0+bGFzdF9ydW5fc2NhbGUgPSAwOworI2lmZGVmIENPTkZJR19TTVAKKwkJcnEtPnN0aWNr eV90YXNrID0gTlVMTDsKKwkJcnEtPnNkID0gTlVMTDsKKwkJcnEtPnJkID0gTlVMTDsKKwkJcnEt Pm9ubGluZSA9IGZhbHNlOworCQlycS0+Y3B1ID0gaTsKKwkJcnFfYXR0YWNoX3Jvb3QocnEsICZk ZWZfcm9vdF9kb21haW4pOworI2VuZGlmCisJCWF0b21pY19zZXQoJnJxLT5ucl9pb3dhaXQsIDAp OworCX0KKworI2lmZGVmIENPTkZJR19TTVAKKwlucl9jcHVfaWRzID0gaTsKKwkvKgorCSAqIFNl dCB0aGUgYmFzZSBsb2NhbGl0eSBmb3IgY3B1IGNhY2hlIGRpc3RhbmNlIGNhbGN1bGF0aW9uIHRv CisJICogImRpc3RhbnQiICgzKS4gTWFrZSBzdXJlIHRoZSBkaXN0YW5jZSBmcm9tIGEgQ1BVIHRv IGl0c2VsZiBpcyAwLgorCSAqLworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCWludCBq OworCisJCXJxID0gY3B1X3JxKGkpOworI2lmZGVmIENPTkZJR19TQ0hFRF9TTVQKKwkJY3B1bWFz a19jbGVhcigmcnEtPnNtdF9zaWJsaW5ncyk7CisJCWNwdW1hc2tfc2V0X2NwdShpLCAmcnEtPnNt dF9zaWJsaW5ncyk7CisJCXJxLT5zaWJsaW5nc19pZGxlID0gc29sZV9jcHVfaWRsZTsKKwkJY3B1 bWFza19zZXRfY3B1KGksICZycS0+c210X3NpYmxpbmdzKTsKKyNlbmRpZgorI2lmZGVmIENPTkZJ R19TQ0hFRF9NQworCQljcHVtYXNrX2NsZWFyKCZycS0+Y2FjaGVfc2libGluZ3MpOworCQljcHVt YXNrX3NldF9jcHUoaSwgJnJxLT5jYWNoZV9zaWJsaW5ncyk7CisJCXJxLT5jYWNoZV9pZGxlID0g c29sZV9jcHVfaWRsZTsKKwkJY3B1bWFza19zZXRfY3B1KGksICZycS0+Y2FjaGVfc2libGluZ3Mp OworI2VuZGlmCisJCXJxLT5jcHVfbG9jYWxpdHkgPSBrbWFsbG9jKG5yX2NwdV9pZHMgKiBzaXpl b2YoaW50ICopLCBHRlBfQVRPTUlDKTsKKwkJZm9yX2VhY2hfcG9zc2libGVfY3B1KGopIHsKKwkJ CWlmIChpID09IGopCisJCQkJcnEtPmNwdV9sb2NhbGl0eVtqXSA9IDA7CisJCQllbHNlCisJCQkJ cnEtPmNwdV9sb2NhbGl0eVtqXSA9IDQ7CisJCX0KKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7 IGkgPCBQUklPX0xJTUlUOyBpKyspCisJCUlOSVRfTElTVF9IRUFEKGdycS5xdWV1ZSArIGkpOwor CS8qIGRlbGltaXRlciBmb3IgYml0c2VhcmNoICovCisJX19zZXRfYml0KFBSSU9fTElNSVQsIGdy cS5wcmlvX2JpdG1hcCk7CisKKyNpZmRlZiBDT05GSUdfUFJFRU1QVF9OT1RJRklFUlMKKwlJTklU X0hMSVNUX0hFQUQoJmluaXRfdGFzay5wcmVlbXB0X25vdGlmaWVycyk7CisjZW5kaWYKKworI2lm ZGVmIENPTkZJR19SVF9NVVRFWEVTCisJcGxpc3RfaGVhZF9pbml0KCZpbml0X3Rhc2sucGlfd2Fp dGVycyk7CisjZW5kaWYKKworCS8qCisJICogVGhlIGJvb3QgaWRsZSB0aHJlYWQgZG9lcyBsYXp5 IE1NVSBzd2l0Y2hpbmcgYXMgd2VsbDoKKwkgKi8KKwlhdG9taWNfaW5jKCZpbml0X21tLm1tX2Nv dW50KTsKKwllbnRlcl9sYXp5X3RsYigmaW5pdF9tbSwgY3VycmVudCk7CisKKwkvKgorCSAqIE1h a2UgdXMgdGhlIGlkbGUgdGhyZWFkLiBUZWNobmljYWxseSwgc2NoZWR1bGUoKSBzaG91bGQgbm90 IGJlCisJICogY2FsbGVkIGZyb20gdGhpcyB0aHJlYWQsIGhvd2V2ZXIgc29tZXdoZXJlIGJlbG93 IGl0IG1pZ2h0IGJlLAorCSAqIGJ1dCBiZWNhdXNlIHdlIGFyZSB0aGUgaWRsZSB0aHJlYWQsIHdl IGp1c3QgcGljayB1cCBydW5uaW5nIGFnYWluCisJICogd2hlbiB0aGlzIHJ1bnF1ZXVlIGJlY29t ZXMgImlkbGUiLgorCSAqLworCWluaXRfaWRsZShjdXJyZW50LCBzbXBfcHJvY2Vzc29yX2lkKCkp OworCisjaWZkZWYgQ09ORklHX1NNUAorCXphbGxvY19jcHVtYXNrX3Zhcigmc2NoZWRfZG9tYWlu c190bXBtYXNrLCBHRlBfTk9XQUlUKTsKKwkvKiBNYXkgYmUgYWxsb2NhdGVkIGF0IGlzb2xjcHVz IGNtZGxpbmUgcGFyc2UgdGltZSAqLworCWlmIChjcHVfaXNvbGF0ZWRfbWFwID09IE5VTEwpCisJ CXphbGxvY19jcHVtYXNrX3ZhcigmY3B1X2lzb2xhdGVkX21hcCwgR0ZQX05PV0FJVCk7CisjZW5k aWYgLyogU01QICovCit9CisKKyNpZmRlZiBDT05GSUdfREVCVUdfQVRPTUlDX1NMRUVQCitzdGF0 aWMgaW5saW5lIGludCBwcmVlbXB0X2NvdW50X2VxdWFscyhpbnQgcHJlZW1wdF9vZmZzZXQpCit7 CisJaW50IG5lc3RlZCA9IChwcmVlbXB0X2NvdW50KCkgJiB+UFJFRU1QVF9BQ1RJVkUpICsgcmN1 X3ByZWVtcHRfZGVwdGgoKTsKKworCXJldHVybiAobmVzdGVkID09IHByZWVtcHRfb2Zmc2V0KTsK K30KKwordm9pZCBfX21pZ2h0X3NsZWVwKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQg cHJlZW1wdF9vZmZzZXQpCit7CisJc3RhdGljIHVuc2lnbmVkIGxvbmcgcHJldl9qaWZmeTsJLyog cmF0ZWxpbWl0aW5nICovCisKKwlyY3Vfc2xlZXBfY2hlY2soKTsgLyogV0FSTl9PTl9PTkNFKCkg YnkgZGVmYXVsdCwgbm8gcmF0ZSBsaW1pdCByZXFkLiAqLworCWlmICgocHJlZW1wdF9jb3VudF9l cXVhbHMocHJlZW1wdF9vZmZzZXQpICYmICFpcnFzX2Rpc2FibGVkKCkpIHx8CisJCXN5c3RlbV9z dGF0ZSAhPSBTWVNURU1fUlVOTklORyB8fCBvb3BzX2luX3Byb2dyZXNzKQorCQlyZXR1cm47CisJ aWYgKHRpbWVfYmVmb3JlKGppZmZpZXMsIHByZXZfamlmZnkgKyBIWikgJiYgcHJldl9qaWZmeSkK KwkJcmV0dXJuOworCXByZXZfamlmZnkgPSBqaWZmaWVzOworCisJcHJpbnRrKEtFUk5fRVJSCisJ CSJCVUc6IHNsZWVwaW5nIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGludmFsaWQgY29udGV4dCBhdCAl czolZFxuIiwKKwkJCWZpbGUsIGxpbmUpOworCXByaW50ayhLRVJOX0VSUgorCQkiaW5fYXRvbWlj KCk6ICVkLCBpcnFzX2Rpc2FibGVkKCk6ICVkLCBwaWQ6ICVkLCBuYW1lOiAlc1xuIiwKKwkJCWlu X2F0b21pYygpLCBpcnFzX2Rpc2FibGVkKCksCisJCQljdXJyZW50LT5waWQsIGN1cnJlbnQtPmNv bW0pOworCisJZGVidWdfc2hvd19oZWxkX2xvY2tzKGN1cnJlbnQpOworCWlmIChpcnFzX2Rpc2Fi bGVkKCkpCisJCXByaW50X2lycXRyYWNlX2V2ZW50cyhjdXJyZW50KTsKKwlkdW1wX3N0YWNrKCk7 Cit9CitFWFBPUlRfU1lNQk9MKF9fbWlnaHRfc2xlZXApOworI2VuZGlmCisKKyNpZmRlZiBDT05G SUdfTUFHSUNfU1lTUlEKK3ZvaWQgbm9ybWFsaXplX3J0X3Rhc2tzKHZvaWQpCit7CisJc3RydWN0 IHRhc2tfc3RydWN0ICpnLCAqcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBycSAq cnE7CisJaW50IHF1ZXVlZDsKKworCXJlYWRfbG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworCisJ ZG9fZWFjaF90aHJlYWQoZywgcCkgeworCQlpZiAoIXJ0X3Rhc2socCkpCisJCQljb250aW51ZTsK KworCQlyYXdfc3Bpbl9sb2NrX2lycXNhdmUoJnAtPnBpX2xvY2ssIGZsYWdzKTsKKwkJcnEgPSBf X3Rhc2tfZ3JxX2xvY2socCk7CisKKwkJcXVldWVkID0gdGFza19xdWV1ZWQocCk7CisJCV9fc2V0 c2NoZWR1bGVyKHAsIHJxLCBTQ0hFRF9OT1JNQUwsIDApOworCQlpZiAocXVldWVkKSB7CisJCQl0 cnlfcHJlZW1wdChwLCBycSk7CisJCX0KKworCQlfX3Rhc2tfZ3JxX3VubG9jaygpOworCQlyYXdf c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcC0+cGlfbG9jaywgZmxhZ3MpOworCX0gd2hpbGVfZWFj aF90aHJlYWQoZywgcCk7CisKKwlyZWFkX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOworfQor I2VuZGlmIC8qIENPTkZJR19NQUdJQ19TWVNSUSAqLworCisjaWYgZGVmaW5lZChDT05GSUdfSUE2 NCkgfHwgZGVmaW5lZChDT05GSUdfS0dEQl9LREIpCisvKgorICogVGhlc2UgZnVuY3Rpb25zIGFy ZSBvbmx5IHVzZWZ1bCBmb3IgdGhlIElBNjQgTUNBIGhhbmRsaW5nLCBvciBrZGIuCisgKgorICog VGhleSBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgd2hvbGUgc3lzdGVtIGhhcyBiZWVuCisg KiBzdG9wcGVkIC0gZXZlcnkgQ1BVIG5lZWRzIHRvIGJlIHF1aWVzY2VudCwgYW5kIG5vIHNjaGVk dWxpbmcKKyAqIGFjdGl2aXR5IGNhbiB0YWtlIHBsYWNlLiBVc2luZyB0aGVtIGZvciBhbnl0aGlu ZyBlbHNlIHdvdWxkCisgKiBiZSBhIHNlcmlvdXMgYnVnLCBhbmQgYXMgYSByZXN1bHQsIHRoZXkg YXJlbid0IGV2ZW4gdmlzaWJsZQorICogdW5kZXIgYW55IG90aGVyIGNvbmZpZ3VyYXRpb24uCisg Ki8KKworLyoqCisgKiBjdXJyX3Rhc2sgLSByZXR1cm4gdGhlIGN1cnJlbnQgdGFzayBmb3IgYSBn aXZlbiBjcHUuCisgKiBAY3B1OiB0aGUgcHJvY2Vzc29yIGluIHF1ZXN0aW9uLgorICoKKyAqIE9O TFkgVkFMSUQgV0hFTiBUSEUgV0hPTEUgU1lTVEVNIElTIFNUT1BQRUQhCisgKi8KK3N0cnVjdCB0 YXNrX3N0cnVjdCAqY3Vycl90YXNrKGludCBjcHUpCit7CisJcmV0dXJuIGNwdV9jdXJyKGNwdSk7 Cit9CisKKyNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19JQTY0KSB8fCBkZWZpbmVkKENPTkZJR19L R0RCX0tEQikgKi8KKworI2lmZGVmIENPTkZJR19JQTY0CisvKioKKyAqIHNldF9jdXJyX3Rhc2sg LSBzZXQgdGhlIGN1cnJlbnQgdGFzayBmb3IgYSBnaXZlbiBjcHUuCisgKiBAY3B1OiB0aGUgcHJv Y2Vzc29yIGluIHF1ZXN0aW9uLgorICogQHA6IHRoZSB0YXNrIHBvaW50ZXIgdG8gc2V0LgorICoK KyAqIERlc2NyaXB0aW9uOiBUaGlzIGZ1bmN0aW9uIG11c3Qgb25seSBiZSB1c2VkIHdoZW4gbm9u LW1hc2thYmxlIGludGVycnVwdHMKKyAqIGFyZSBzZXJ2aWNlZCBvbiBhIHNlcGFyYXRlIHN0YWNr LiAgSXQgYWxsb3dzIHRoZSBhcmNoaXRlY3R1cmUgdG8gc3dpdGNoIHRoZQorICogbm90aW9uIG9m IHRoZSBjdXJyZW50IHRhc2sgb24gYSBjcHUgaW4gYSBub24tYmxvY2tpbmcgbWFubmVyLiAgVGhp cyBmdW5jdGlvbgorICogbXVzdCBiZSBjYWxsZWQgd2l0aCBhbGwgQ1BVJ3Mgc3luY2hyb25pc2Vk LCBhbmQgaW50ZXJydXB0cyBkaXNhYmxlZCwgdGhlCisgKiBhbmQgY2FsbGVyIG11c3Qgc2F2ZSB0 aGUgb3JpZ2luYWwgdmFsdWUgb2YgdGhlIGN1cnJlbnQgdGFzayAoc2VlCisgKiBjdXJyX3Rhc2so KSBhYm92ZSkgYW5kIHJlc3RvcmUgdGhhdCB2YWx1ZSBiZWZvcmUgcmVlbmFibGluZyBpbnRlcnJ1 cHRzIGFuZAorICogcmUtc3RhcnRpbmcgdGhlIHN5c3RlbS4KKyAqCisgKiBPTkxZIFZBTElEIFdI RU4gVEhFIFdIT0xFIFNZU1RFTSBJUyBTVE9QUEVEIQorICovCit2b2lkIHNldF9jdXJyX3Rhc2so aW50IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCWNwdV9jdXJyKGNwdSkgPSBwOwor fQorCisjZW5kaWYKKworLyoKKyAqIFVzZSBwcmVjaXNlIHBsYXRmb3JtIHN0YXRpc3RpY3MgaWYg YXZhaWxhYmxlOgorICovCisjaWZkZWYgQ09ORklHX1ZJUlRfQ1BVX0FDQ09VTlRJTkcKK3ZvaWQg dGFza190aW1lcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsIGNwdXRpbWVfdCAqdXQsIGNwdXRpbWVf dCAqc3QpCit7CisJKnV0ID0gcC0+dXRpbWU7CisJKnN0ID0gcC0+c3RpbWU7Cit9CisKK3ZvaWQg dGhyZWFkX2dyb3VwX3RpbWVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgY3B1dGltZV90ICp1dCwg Y3B1dGltZV90ICpzdCkKK3sKKwlzdHJ1Y3QgdGFza19jcHV0aW1lIGNwdXRpbWU7CisKKwl0aHJl YWRfZ3JvdXBfY3B1dGltZShwLCAmY3B1dGltZSk7CisKKwkqdXQgPSBjcHV0aW1lLnV0aW1lOwor CSpzdCA9IGNwdXRpbWUuc3RpbWU7Cit9CisjZWxzZQorCit2b2lkIHRhc2tfdGltZXMoc3RydWN0 IHRhc2tfc3RydWN0ICpwLCBjcHV0aW1lX3QgKnV0LCBjcHV0aW1lX3QgKnN0KQoreworCWNwdXRp bWVfdCBydGltZSwgdXRpbWUgPSBwLT51dGltZSwgdG90YWwgPSB1dGltZSArIHAtPnN0aW1lOwor CisJcnRpbWUgPSBuc2Vjc190b19jcHV0aW1lKHAtPnNjaGVkX3RpbWUpOworCisJaWYgKHRvdGFs KSB7CisJCXU2NCB0ZW1wOworCisJCXRlbXAgPSAodTY0KShydGltZSAqIHV0aW1lKTsKKwkJZG9f ZGl2KHRlbXAsIHRvdGFsKTsKKwkJdXRpbWUgPSAoY3B1dGltZV90KXRlbXA7CisJfSBlbHNlCisJ CXV0aW1lID0gcnRpbWU7CisKKwkvKgorCSAqIENvbXBhcmUgd2l0aCBwcmV2aW91cyB2YWx1ZXMs IHRvIGtlZXAgbW9ub3RvbmljaXR5OgorCSAqLworCXAtPnByZXZfdXRpbWUgPSBtYXgocC0+cHJl dl91dGltZSwgdXRpbWUpOworCXAtPnByZXZfc3RpbWUgPSBtYXgocC0+cHJldl9zdGltZSwgKHJ0 aW1lIC0gcC0+cHJldl91dGltZSkpOworCisJKnV0ID0gcC0+cHJldl91dGltZTsKKwkqc3QgPSBw LT5wcmV2X3N0aW1lOworfQorCisvKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBzaWdsb2NrIGhl bGQuCisgKi8KK3ZvaWQgdGhyZWFkX2dyb3VwX3RpbWVzKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwg Y3B1dGltZV90ICp1dCwgY3B1dGltZV90ICpzdCkKK3sKKwlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAq c2lnID0gcC0+c2lnbmFsOworCXN0cnVjdCB0YXNrX2NwdXRpbWUgY3B1dGltZTsKKwljcHV0aW1l X3QgcnRpbWUsIHV0aW1lLCB0b3RhbDsKKworCXRocmVhZF9ncm91cF9jcHV0aW1lKHAsICZjcHV0 aW1lKTsKKworCXRvdGFsID0gY3B1dGltZS51dGltZSArIGNwdXRpbWUuc3RpbWU7CisJcnRpbWUg PSBuc2Vjc190b19jcHV0aW1lKGNwdXRpbWUuc3VtX2V4ZWNfcnVudGltZSk7CisKKwlpZiAodG90 YWwpIHsKKwkJdTY0IHRlbXA7CisKKwkJdGVtcCA9ICh1NjQpKHJ0aW1lICogY3B1dGltZS51dGlt ZSk7CisJCWRvX2Rpdih0ZW1wLCB0b3RhbCk7CisJCXV0aW1lID0gKGNwdXRpbWVfdCl0ZW1wOwor CX0gZWxzZQorCQl1dGltZSA9IHJ0aW1lOworCisJc2lnLT5wcmV2X3V0aW1lID0gbWF4KHNpZy0+ cHJldl91dGltZSwgdXRpbWUpOworCXNpZy0+cHJldl9zdGltZSA9IG1heChzaWctPnByZXZfc3Rp bWUsIChydGltZSAtIHNpZy0+cHJldl91dGltZSkpOworCisJKnV0ID0gc2lnLT5wcmV2X3V0aW1l OworCSpzdCA9IHNpZy0+cHJldl9zdGltZTsKK30KKyNlbmRpZgorCitpbmxpbmUgY3B1dGltZV90 IHRhc2tfZ3RpbWUoc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCXJldHVybiBwLT5ndGltZTsK K30KKwordm9pZCBfX2NwdWluaXQgaW5pdF9pZGxlX2Jvb3R1cF90YXNrKHN0cnVjdCB0YXNrX3N0 cnVjdCAqaWRsZSkKK3t9CisKKyNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcKK3ZvaWQgcHJvY19z Y2hlZF9zaG93X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwLCBzdHJ1Y3Qgc2VxX2ZpbGUgKm0p Cit7fQorCit2b2lkIHByb2Nfc2NoZWRfc2V0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpwKQor e30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1NNUAordW5zaWduZWQgbG9uZyBkZWZhdWx0X3Nj YWxlX2ZyZXFfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit7CisJcmV0 dXJuIFNDSEVEX0xPQURfU0NBTEU7Cit9CisKK3Vuc2lnbmVkIGxvbmcgZGVmYXVsdF9zY2FsZV9z bXRfcG93ZXIoc3RydWN0IHNjaGVkX2RvbWFpbiAqc2QsIGludCBjcHUpCit7CisJdW5zaWduZWQg bG9uZyB3ZWlnaHQgPSBjcHVtYXNrX3dlaWdodChzY2hlZF9kb21haW5fc3BhbihzZCkpOworCXVu c2lnbmVkIGxvbmcgc210X2dhaW4gPSBzZC0+c210X2dhaW47CisKKwlzbXRfZ2FpbiAvPSB3ZWln aHQ7CisKKwlyZXR1cm4gc210X2dhaW47Cit9CisjZW5kaWYKZGlmZiAtcnVOIGxpbnV4LTMuNC4x L2tlcm5lbC9zY2hlZC9zdGF0cy5jIGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3NjaGVkL3N0YXRz LmMKLS0tIGxpbnV4LTMuNC4xL2tlcm5lbC9zY2hlZC9zdGF0cy5jCTIwMTItMDYtMDEgMTU6MTg6 NDQuMDAwMDAwMDAwICswODAwCisrKyBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9zY2hlZC9zdGF0 cy5jCTE5NzAtMDEtMDEgMDg6MDA6MDAuMDAwMDAwMDAwICswODAwCkBAIC0xLDExMSArMCwwIEBA Ci0KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNs dWRlIDxsaW51eC9zZXFfZmlsZS5oPgotI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KLQotI2lu Y2x1ZGUgInNjaGVkLmgiCi0KLS8qCi0gKiBidW1wIHRoaXMgdXAgd2hlbiBjaGFuZ2luZyB0aGUg b3V0cHV0IGZvcm1hdCBvciB0aGUgbWVhbmluZyBvZiBhbiBleGlzdGluZwotICogZm9ybWF0LCBz byB0aGF0IHRvb2xzIGNhbiBhZGFwdCAob3IgYWJvcnQpCi0gKi8KLSNkZWZpbmUgU0NIRURTVEFU X1ZFUlNJT04gMTUKLQotc3RhdGljIGludCBzaG93X3NjaGVkc3RhdChzdHJ1Y3Qgc2VxX2ZpbGUg KnNlcSwgdm9pZCAqdikKLXsKLQlpbnQgY3B1OwotCWludCBtYXNrX2xlbiA9IERJVl9ST1VORF9V UChOUl9DUFVTLCAzMikgKiA5OwotCWNoYXIgKm1hc2tfc3RyID0ga21hbGxvYyhtYXNrX2xlbiwg R0ZQX0tFUk5FTCk7Ci0KLQlpZiAobWFza19zdHIgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07 Ci0KLQlzZXFfcHJpbnRmKHNlcSwgInZlcnNpb24gJWRcbiIsIFNDSEVEU1RBVF9WRVJTSU9OKTsK LQlzZXFfcHJpbnRmKHNlcSwgInRpbWVzdGFtcCAlbHVcbiIsIGppZmZpZXMpOwotCWZvcl9lYWNo X29ubGluZV9jcHUoY3B1KSB7Ci0JCXN0cnVjdCBycSAqcnEgPSBjcHVfcnEoY3B1KTsKLSNpZmRl ZiBDT05GSUdfU01QCi0JCXN0cnVjdCBzY2hlZF9kb21haW4gKnNkOwotCQlpbnQgZGNvdW50ID0g MDsKLSNlbmRpZgotCi0JCS8qIHJ1bnF1ZXVlLXNwZWNpZmljIHN0YXRzICovCi0JCXNlcV9wcmlu dGYoc2VxLAotCQkgICAgImNwdSVkICV1IDAgJXUgJXUgJXUgJXUgJWxsdSAlbGx1ICVsdSIsCi0J CSAgICBjcHUsIHJxLT55bGRfY291bnQsCi0JCSAgICBycS0+c2NoZWRfY291bnQsIHJxLT5zY2hl ZF9nb2lkbGUsCi0JCSAgICBycS0+dHR3dV9jb3VudCwgcnEtPnR0d3VfbG9jYWwsCi0JCSAgICBy cS0+cnFfY3B1X3RpbWUsCi0JCSAgICBycS0+cnFfc2NoZWRfaW5mby5ydW5fZGVsYXksIHJxLT5y cV9zY2hlZF9pbmZvLnBjb3VudCk7Ci0KLQkJc2VxX3ByaW50ZihzZXEsICJcbiIpOwotCi0jaWZk ZWYgQ09ORklHX1NNUAotCQkvKiBkb21haW4tc3BlY2lmaWMgc3RhdHMgKi8KLQkJcmN1X3JlYWRf bG9jaygpOwotCQlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkgewotCQkJZW51bSBjcHVfaWRsZV90 eXBlIGl0eXBlOwotCi0JCQljcHVtYXNrX3NjbnByaW50ZihtYXNrX3N0ciwgbWFza19sZW4sCi0J CQkJCSAgc2NoZWRfZG9tYWluX3NwYW4oc2QpKTsKLQkJCXNlcV9wcmludGYoc2VxLCAiZG9tYWlu JWQgJXMiLCBkY291bnQrKywgbWFza19zdHIpOwotCQkJZm9yIChpdHlwZSA9IENQVV9JRExFOyBp dHlwZSA8IENQVV9NQVhfSURMRV9UWVBFUzsKLQkJCQkJaXR5cGUrKykgewotCQkJCXNlcV9wcmlu dGYoc2VxLCAiICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1IiwKLQkJCQkgICAgc2QtPmxiX2NvdW50 W2l0eXBlXSwKLQkJCQkgICAgc2QtPmxiX2JhbGFuY2VkW2l0eXBlXSwKLQkJCQkgICAgc2QtPmxi X2ZhaWxlZFtpdHlwZV0sCi0JCQkJICAgIHNkLT5sYl9pbWJhbGFuY2VbaXR5cGVdLAotCQkJCSAg ICBzZC0+bGJfZ2FpbmVkW2l0eXBlXSwKLQkJCQkgICAgc2QtPmxiX2hvdF9nYWluZWRbaXR5cGVd LAotCQkJCSAgICBzZC0+bGJfbm9idXN5cVtpdHlwZV0sCi0JCQkJICAgIHNkLT5sYl9ub2J1c3ln W2l0eXBlXSk7Ci0JCQl9Ci0JCQlzZXFfcHJpbnRmKHNlcSwKLQkJCQkgICAiICV1ICV1ICV1ICV1 ICV1ICV1ICV1ICV1ICV1ICV1ICV1ICV1XG4iLAotCQkJICAgIHNkLT5hbGJfY291bnQsIHNkLT5h bGJfZmFpbGVkLCBzZC0+YWxiX3B1c2hlZCwKLQkJCSAgICBzZC0+c2JlX2NvdW50LCBzZC0+c2Jl X2JhbGFuY2VkLCBzZC0+c2JlX3B1c2hlZCwKLQkJCSAgICBzZC0+c2JmX2NvdW50LCBzZC0+c2Jm X2JhbGFuY2VkLCBzZC0+c2JmX3B1c2hlZCwKLQkJCSAgICBzZC0+dHR3dV93YWtlX3JlbW90ZSwg c2QtPnR0d3VfbW92ZV9hZmZpbmUsCi0JCQkgICAgc2QtPnR0d3VfbW92ZV9iYWxhbmNlKTsKLQkJ fQotCQlyY3VfcmVhZF91bmxvY2soKTsKLSNlbmRpZgotCX0KLQlrZnJlZShtYXNrX3N0cik7Ci0J cmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2NoZWRzdGF0X29wZW4oc3RydWN0IGlub2RlICpp bm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JdW5zaWduZWQgaW50IHNpemUgPSBQQUdFX1NJ WkUgKiAoMSArIG51bV9vbmxpbmVfY3B1cygpIC8gMzIpOwotCWNoYXIgKmJ1ZiA9IGttYWxsb2Mo c2l6ZSwgR0ZQX0tFUk5FTCk7Ci0Jc3RydWN0IHNlcV9maWxlICptOwotCWludCByZXM7Ci0KLQlp ZiAoIWJ1ZikKLQkJcmV0dXJuIC1FTk9NRU07Ci0JcmVzID0gc2luZ2xlX29wZW4oZmlsZSwgc2hv d19zY2hlZHN0YXQsIE5VTEwpOwotCWlmICghcmVzKSB7Ci0JCW0gPSBmaWxlLT5wcml2YXRlX2Rh dGE7Ci0JCW0tPmJ1ZiA9IGJ1ZjsKLQkJbS0+c2l6ZSA9IHNpemU7Ci0JfSBlbHNlCi0JCWtmcmVl KGJ1Zik7Ci0JcmV0dXJuIHJlczsKLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJh dGlvbnMgcHJvY19zY2hlZHN0YXRfb3BlcmF0aW9ucyA9IHsKLQkub3BlbiAgICA9IHNjaGVkc3Rh dF9vcGVuLAotCS5yZWFkICAgID0gc2VxX3JlYWQsCi0JLmxsc2VlayAgPSBzZXFfbHNlZWssCi0J LnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IHByb2Nf c2NoZWRzdGF0X2luaXQodm9pZCkKLXsKLQlwcm9jX2NyZWF0ZSgic2NoZWRzdGF0IiwgMCwgTlVM TCwgJnByb2Nfc2NoZWRzdGF0X29wZXJhdGlvbnMpOwotCXJldHVybiAwOwotfQotbW9kdWxlX2lu aXQocHJvY19zY2hlZHN0YXRfaW5pdCk7CmRpZmYgLXJ1TiBsaW51eC0zLjQuMS9rZXJuZWwvc2No ZWQvc3RhdHMuaCBsaW51eC0zLjQuMS1SSUZTL2tlcm5lbC9zY2hlZC9zdGF0cy5oCi0tLSBsaW51 eC0zLjQuMS9rZXJuZWwvc2NoZWQvc3RhdHMuaAkyMDEyLTA2LTAxIDE1OjE4OjQ0LjAwMDAwMDAw MCArMDgwMAorKysgbGludXgtMy40LjEtUklGUy9rZXJuZWwvc2NoZWQvc3RhdHMuaAkyMDEyLTA2 LTA2IDE0OjQzOjAyLjAwMDAwMDAwMCArMDgwMApAQCAtMSwyMzEgKzAsMCBAQAotCi0jaWZkZWYg Q09ORklHX1NDSEVEU1RBVFMKLQotLyoKLSAqIEV4cGVjdHMgcnVucXVldWUgbG9jayB0byBiZSBo ZWxkIGZvciBhdG9taWNpdHkgb2YgdXBkYXRlCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZAotcnFf c2NoZWRfaW5mb19hcnJpdmUoc3RydWN0IHJxICpycSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRh KQotewotCWlmIChycSkgewotCQlycS0+cnFfc2NoZWRfaW5mby5ydW5fZGVsYXkgKz0gZGVsdGE7 Ci0JCXJxLT5ycV9zY2hlZF9pbmZvLnBjb3VudCsrOwotCX0KLX0KLQotLyoKLSAqIEV4cGVjdHMg cnVucXVldWUgbG9jayB0byBiZSBoZWxkIGZvciBhdG9taWNpdHkgb2YgdXBkYXRlCi0gKi8KLXN0 YXRpYyBpbmxpbmUgdm9pZAotcnFfc2NoZWRfaW5mb19kZXBhcnQoc3RydWN0IHJxICpycSwgdW5z aWduZWQgbG9uZyBsb25nIGRlbHRhKQotewotCWlmIChycSkKLQkJcnEtPnJxX2NwdV90aW1lICs9 IGRlbHRhOwotfQotCi1zdGF0aWMgaW5saW5lIHZvaWQKLXJxX3NjaGVkX2luZm9fZGVxdWV1ZWQo c3RydWN0IHJxICpycSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKQotewotCWlmIChycSkKLQkJ cnEtPnJxX3NjaGVkX2luZm8ucnVuX2RlbGF5ICs9IGRlbHRhOwotfQotIyBkZWZpbmUgc2NoZWRz dGF0X2luYyhycSwgZmllbGQpCWRvIHsgKHJxKS0+ZmllbGQrKzsgfSB3aGlsZSAoMCkKLSMgZGVm aW5lIHNjaGVkc3RhdF9hZGQocnEsIGZpZWxkLCBhbXQpCWRvIHsgKHJxKS0+ZmllbGQgKz0gKGFt dCk7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwgdmFsKQlkbyB7IHZh ciA9ICh2YWwpOyB9IHdoaWxlICgwKQotI2Vsc2UgLyogIUNPTkZJR19TQ0hFRFNUQVRTICovCi1z dGF0aWMgaW5saW5lIHZvaWQKLXJxX3NjaGVkX2luZm9fYXJyaXZlKHN0cnVjdCBycSAqcnEsIHVu c2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkKLXt9Ci1zdGF0aWMgaW5saW5lIHZvaWQKLXJxX3NjaGVk X2luZm9fZGVxdWV1ZWQoc3RydWN0IHJxICpycSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKQot e30KLXN0YXRpYyBpbmxpbmUgdm9pZAotcnFfc2NoZWRfaW5mb19kZXBhcnQoc3RydWN0IHJxICpy cSwgdW5zaWduZWQgbG9uZyBsb25nIGRlbHRhKQote30KLSMgZGVmaW5lIHNjaGVkc3RhdF9pbmMo cnEsIGZpZWxkKQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfYWRkKHJxLCBm aWVsZCwgYW10KQlkbyB7IH0gd2hpbGUgKDApCi0jIGRlZmluZSBzY2hlZHN0YXRfc2V0KHZhciwg dmFsKQlkbyB7IH0gd2hpbGUgKDApCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQ09ORklHX1NDSEVE U1RBVFMpIHx8IGRlZmluZWQoQ09ORklHX1RBU0tfREVMQVlfQUNDVCkKLXN0YXRpYyBpbmxpbmUg dm9pZCBzY2hlZF9pbmZvX3Jlc2V0X2RlcXVldWVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKLXsK LQl0LT5zY2hlZF9pbmZvLmxhc3RfcXVldWVkID0gMDsKLX0KLQotLyoKLSAqIFdlIGFyZSBpbnRl cmVzdGVkIGluIGtub3dpbmcgaG93IGxvbmcgaXQgd2FzIGZyb20gdGhlICpmaXJzdCogdGltZSBh Ci0gKiB0YXNrIHdhcyBxdWV1ZWQgdG8gdGhlIHRpbWUgdGhhdCBpdCBmaW5hbGx5IGhpdCBhIGNw dSwgd2UgY2FsbCB0aGlzIHJvdXRpbmUKLSAqIGZyb20gZGVxdWV1ZV90YXNrKCkgdG8gYWNjb3Vu dCBmb3IgcG9zc2libGUgcnEtPmNsb2NrIHNrZXcgYWNyb3NzIGNwdXMuIFRoZQotICogZGVsdGEg dGFrZW4gb24gZWFjaCBjcHUgd291bGQgYW5udWwgdGhlIHNrZXcuCi0gKi8KLXN0YXRpYyBpbmxp bmUgdm9pZCBzY2hlZF9pbmZvX2RlcXVldWVkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdCkKLXsKLQl1 bnNpZ25lZCBsb25nIGxvbmcgbm93ID0gdGFza19ycSh0KS0+Y2xvY2ssIGRlbHRhID0gMDsKLQot CWlmICh1bmxpa2VseShzY2hlZF9pbmZvX29uKCkpKQotCQlpZiAodC0+c2NoZWRfaW5mby5sYXN0 X3F1ZXVlZCkKLQkJCWRlbHRhID0gbm93IC0gdC0+c2NoZWRfaW5mby5sYXN0X3F1ZXVlZDsKLQlz Y2hlZF9pbmZvX3Jlc2V0X2RlcXVldWVkKHQpOwotCXQtPnNjaGVkX2luZm8ucnVuX2RlbGF5ICs9 IGRlbHRhOwotCi0JcnFfc2NoZWRfaW5mb19kZXF1ZXVlZCh0YXNrX3JxKHQpLCBkZWx0YSk7Ci19 Ci0KLS8qCi0gKiBDYWxsZWQgd2hlbiBhIHRhc2sgZmluYWxseSBoaXRzIHRoZSBjcHUuICBXZSBj YW4gbm93IGNhbGN1bGF0ZSBob3cKLSAqIGxvbmcgaXQgd2FzIHdhaXRpbmcgdG8gcnVuLiAgV2Ug YWxzbyBub3RlIHdoZW4gaXQgYmVnYW4gc28gdGhhdCB3ZQotICogY2FuIGtlZXAgc3RhdHMgb24g aG93IGxvbmcgaXRzIHRpbWVzbGljZSBpcy4KLSAqLwotc3RhdGljIHZvaWQgc2NoZWRfaW5mb19h cnJpdmUoc3RydWN0IHRhc2tfc3RydWN0ICp0KQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyBub3cg PSB0YXNrX3JxKHQpLT5jbG9jaywgZGVsdGEgPSAwOwotCi0JaWYgKHQtPnNjaGVkX2luZm8ubGFz dF9xdWV1ZWQpCi0JCWRlbHRhID0gbm93IC0gdC0+c2NoZWRfaW5mby5sYXN0X3F1ZXVlZDsKLQlz Y2hlZF9pbmZvX3Jlc2V0X2RlcXVldWVkKHQpOwotCXQtPnNjaGVkX2luZm8ucnVuX2RlbGF5ICs9 IGRlbHRhOwotCXQtPnNjaGVkX2luZm8ubGFzdF9hcnJpdmFsID0gbm93OwotCXQtPnNjaGVkX2lu Zm8ucGNvdW50Kys7Ci0KLQlycV9zY2hlZF9pbmZvX2Fycml2ZSh0YXNrX3JxKHQpLCBkZWx0YSk7 Ci19Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGZyb20gZW5xdWV1ZV90 YXNrKCksIGJ1dCBhbHNvIG9ubHkgdXBkYXRlcwotICogdGhlIHRpbWVzdGFtcCBpZiBpdCBpcyBh bHJlYWR5IG5vdCBzZXQuICBJdCdzIGFzc3VtZWQgdGhhdAotICogc2NoZWRfaW5mb19kZXF1ZXVl ZCgpIHdpbGwgY2xlYXIgdGhhdCBzdGFtcCB3aGVuIGFwcHJvcHJpYXRlLgotICovCi1zdGF0aWMg aW5saW5lIHZvaWQgc2NoZWRfaW5mb19xdWV1ZWQoc3RydWN0IHRhc2tfc3RydWN0ICp0KQotewot CWlmICh1bmxpa2VseShzY2hlZF9pbmZvX29uKCkpKQotCQlpZiAoIXQtPnNjaGVkX2luZm8ubGFz dF9xdWV1ZWQpCi0JCQl0LT5zY2hlZF9pbmZvLmxhc3RfcXVldWVkID0gdGFza19ycSh0KS0+Y2xv Y2s7Ci19Ci0KLS8qCi0gKiBDYWxsZWQgd2hlbiBhIHByb2Nlc3MgY2Vhc2VzIGJlaW5nIHRoZSBh Y3RpdmUtcnVubmluZyBwcm9jZXNzLCBlaXRoZXIKLSAqIHZvbHVudGFyaWx5IG9yIGludm9sdW50 YXJpbHkuICBOb3cgd2UgY2FuIGNhbGN1bGF0ZSBob3cgbG9uZyB3ZSByYW4uCi0gKiBBbHNvLCBp ZiB0aGUgcHJvY2VzcyBpcyBzdGlsbCBpbiB0aGUgVEFTS19SVU5OSU5HIHN0YXRlLCBjYWxsCi0g KiBzY2hlZF9pbmZvX3F1ZXVlZCgpIHRvIG1hcmsgdGhhdCBpdCBoYXMgbm93IGFnYWluIHN0YXJ0 ZWQgd2FpdGluZyBvbgotICogdGhlIHJ1bnF1ZXVlLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQg c2NoZWRfaW5mb19kZXBhcnQoc3RydWN0IHRhc2tfc3RydWN0ICp0KQotewotCXVuc2lnbmVkIGxv bmcgbG9uZyBkZWx0YSA9IHRhc2tfcnEodCktPmNsb2NrIC0KLQkJCQkJdC0+c2NoZWRfaW5mby5s YXN0X2Fycml2YWw7Ci0KLQlycV9zY2hlZF9pbmZvX2RlcGFydCh0YXNrX3JxKHQpLCBkZWx0YSk7 Ci0KLQlpZiAodC0+c3RhdGUgPT0gVEFTS19SVU5OSU5HKQotCQlzY2hlZF9pbmZvX3F1ZXVlZCh0 KTsKLX0KLQotLyoKLSAqIENhbGxlZCB3aGVuIHRhc2tzIGFyZSBzd2l0Y2hlZCBpbnZvbHVudGFy aWx5IGR1ZSwgdHlwaWNhbGx5LCB0byBleHBpcmluZwotICogdGhlaXIgdGltZSBzbGljZS4gIChU aGlzIG1heSBhbHNvIGJlIGNhbGxlZCB3aGVuIHN3aXRjaGluZyB0byBvciBmcm9tCi0gKiB0aGUg aWRsZSB0YXNrLikgIFdlIGFyZSBvbmx5IGNhbGxlZCB3aGVuIHByZXYgIT0gbmV4dC4KLSAqLwot c3RhdGljIGlubGluZSB2b2lkCi1fX3NjaGVkX2luZm9fc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVj dCAqcHJldiwgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQotewotCXN0cnVjdCBycSAqcnEgPSB0 YXNrX3JxKHByZXYpOwotCi0JLyoKLQkgKiBwcmV2IG5vdyBkZXBhcnRzIHRoZSBjcHUuICBJdCdz IG5vdCBpbnRlcmVzdGluZyB0byByZWNvcmQKLQkgKiBzdGF0cyBhYm91dCBob3cgZWZmaWNpZW50 IHdlIHdlcmUgYXQgc2NoZWR1bGluZyB0aGUgaWRsZQotCSAqIHByb2Nlc3MsIGhvd2V2ZXIuCi0J ICovCi0JaWYgKHByZXYgIT0gcnEtPmlkbGUpCi0JCXNjaGVkX2luZm9fZGVwYXJ0KHByZXYpOwot Ci0JaWYgKG5leHQgIT0gcnEtPmlkbGUpCi0JCXNjaGVkX2luZm9fYXJyaXZlKG5leHQpOwotfQot c3RhdGljIGlubGluZSB2b2lkCi1zY2hlZF9pbmZvX3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3Qg KnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKLXsKLQlpZiAodW5saWtlbHkoc2NoZWRf aW5mb19vbigpKSkKLQkJX19zY2hlZF9pbmZvX3N3aXRjaChwcmV2LCBuZXh0KTsKLX0KLSNlbHNl Ci0jZGVmaW5lIHNjaGVkX2luZm9fcXVldWVkKHQpCQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmlu ZSBzY2hlZF9pbmZvX3Jlc2V0X2RlcXVldWVkKHQpCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUg c2NoZWRfaW5mb19kZXF1ZXVlZCh0KQkJCWRvIHsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgc2NoZWRf aW5mb19zd2l0Y2godCwgbmV4dCkJCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZiAvKiBDT05GSUdf U0NIRURTVEFUUyB8fCBDT05GSUdfVEFTS19ERUxBWV9BQ0NUICovCi0KLS8qCi0gKiBUaGUgZm9s bG93aW5nIGFyZSBmdW5jdGlvbnMgdGhhdCBzdXBwb3J0IHNjaGVkdWxlci1pbnRlcm5hbCB0aW1l IGFjY291bnRpbmcuCi0gKiBUaGVzZSBmdW5jdGlvbnMgYXJlIGdlbmVyYWxseSBjYWxsZWQgYXQg dGhlIHRpbWVyIHRpY2suICBOb25lIG9mIHRoaXMgZGVwZW5kcwotICogb24gQ09ORklHX1NDSEVE U1RBVFMuCi0gKi8KLQotLyoqCi0gKiBhY2NvdW50X2dyb3VwX3VzZXJfdGltZSAtIE1haW50YWlu IHV0aW1lIGZvciBhIHRocmVhZCBncm91cC4KLSAqCi0gKiBAdHNrOglQb2ludGVyIHRvIHRhc2sg c3RydWN0dXJlLgotICogQGNwdXRpbWU6CVRpbWUgdmFsdWUgYnkgd2hpY2ggdG8gaW5jcmVtZW50 IHRoZSB1dGltZSBmaWVsZCBvZiB0aGUKLSAqCQl0aHJlYWRfZ3JvdXBfY3B1dGltZSBzdHJ1Y3R1 cmUuCi0gKgotICogSWYgdGhyZWFkIGdyb3VwIHRpbWUgaXMgYmVpbmcgbWFpbnRhaW5lZCwgZ2V0 IHRoZSBzdHJ1Y3R1cmUgZm9yIHRoZQotICogcnVubmluZyBDUFUgYW5kIHVwZGF0ZSB0aGUgdXRp bWUgZmllbGQgdGhlcmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY2NvdW50X2dyb3VwX3Vz ZXJfdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCQkJICAgY3B1dGltZV90IGNwdXRp bWUpCi17Ci0Jc3RydWN0IHRocmVhZF9ncm91cF9jcHV0aW1lciAqY3B1dGltZXIgPSAmdHNrLT5z aWduYWwtPmNwdXRpbWVyOwotCi0JaWYgKCFjcHV0aW1lci0+cnVubmluZykKLQkJcmV0dXJuOwot Ci0JcmF3X3NwaW5fbG9jaygmY3B1dGltZXItPmxvY2spOwotCWNwdXRpbWVyLT5jcHV0aW1lLnV0 aW1lICs9IGNwdXRpbWU7Ci0JcmF3X3NwaW5fdW5sb2NrKCZjcHV0aW1lci0+bG9jayk7Ci19Ci0K LS8qKgotICogYWNjb3VudF9ncm91cF9zeXN0ZW1fdGltZSAtIE1haW50YWluIHN0aW1lIGZvciBh IHRocmVhZCBncm91cC4KLSAqCi0gKiBAdHNrOglQb2ludGVyIHRvIHRhc2sgc3RydWN0dXJlLgot ICogQGNwdXRpbWU6CVRpbWUgdmFsdWUgYnkgd2hpY2ggdG8gaW5jcmVtZW50IHRoZSBzdGltZSBm aWVsZCBvZiB0aGUKLSAqCQl0aHJlYWRfZ3JvdXBfY3B1dGltZSBzdHJ1Y3R1cmUuCi0gKgotICog SWYgdGhyZWFkIGdyb3VwIHRpbWUgaXMgYmVpbmcgbWFpbnRhaW5lZCwgZ2V0IHRoZSBzdHJ1Y3R1 cmUgZm9yIHRoZQotICogcnVubmluZyBDUFUgYW5kIHVwZGF0ZSB0aGUgc3RpbWUgZmllbGQgdGhl cmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY2NvdW50X2dyb3VwX3N5c3RlbV90aW1lKHN0 cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCQkgICAgIGNwdXRpbWVfdCBjcHV0aW1lKQotewot CXN0cnVjdCB0aHJlYWRfZ3JvdXBfY3B1dGltZXIgKmNwdXRpbWVyID0gJnRzay0+c2lnbmFsLT5j cHV0aW1lcjsKLQotCWlmICghY3B1dGltZXItPnJ1bm5pbmcpCi0JCXJldHVybjsKLQotCXJhd19z cGluX2xvY2soJmNwdXRpbWVyLT5sb2NrKTsKLQljcHV0aW1lci0+Y3B1dGltZS5zdGltZSArPSBj cHV0aW1lOwotCXJhd19zcGluX3VubG9jaygmY3B1dGltZXItPmxvY2spOwotfQotCi0vKioKLSAq IGFjY291bnRfZ3JvdXBfZXhlY19ydW50aW1lIC0gTWFpbnRhaW4gZXhlYyBydW50aW1lIGZvciBh IHRocmVhZCBncm91cC4KLSAqCi0gKiBAdHNrOglQb2ludGVyIHRvIHRhc2sgc3RydWN0dXJlLgot ICogQG5zOgkJVGltZSB2YWx1ZSBieSB3aGljaCB0byBpbmNyZW1lbnQgdGhlIHN1bV9leGVjX3J1 bnRpbWUgZmllbGQKLSAqCQlvZiB0aGUgdGhyZWFkX2dyb3VwX2NwdXRpbWUgc3RydWN0dXJlLgot ICoKLSAqIElmIHRocmVhZCBncm91cCB0aW1lIGlzIGJlaW5nIG1haW50YWluZWQsIGdldCB0aGUg c3RydWN0dXJlIGZvciB0aGUKLSAqIHJ1bm5pbmcgQ1BVIGFuZCB1cGRhdGUgdGhlIHN1bV9leGVj X3J1bnRpbWUgZmllbGQgdGhlcmUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBhY2NvdW50X2dy b3VwX2V4ZWNfcnVudGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywKLQkJCQkJICAgICAgdW5z aWduZWQgbG9uZyBsb25nIG5zKQotewotCXN0cnVjdCB0aHJlYWRfZ3JvdXBfY3B1dGltZXIgKmNw dXRpbWVyID0gJnRzay0+c2lnbmFsLT5jcHV0aW1lcjsKLQotCWlmICghY3B1dGltZXItPnJ1bm5p bmcpCi0JCXJldHVybjsKLQotCXJhd19zcGluX2xvY2soJmNwdXRpbWVyLT5sb2NrKTsKLQljcHV0 aW1lci0+Y3B1dGltZS5zdW1fZXhlY19ydW50aW1lICs9IG5zOwotCXJhd19zcGluX3VubG9jaygm Y3B1dGltZXItPmxvY2spOwotfQpkaWZmIC1ydU4gbGludXgtMy40LjEva2VybmVsL3N5c2N0bC5j IGxpbnV4LTMuNC4xLVJJRlMva2VybmVsL3N5c2N0bC5jCi0tLSBsaW51eC0zLjQuMS9rZXJuZWwv c3lzY3RsLmMJMjAxMi0wNi0wMSAxNToxODo0NC4wMDAwMDAwMDAgKzA4MDAKKysrIGxpbnV4LTMu NC4xLVJJRlMva2VybmVsL3N5c2N0bC5jCTIwMTItMDYtMTUgMjM6NDY6NDQuMDAwMDAwMDAwICsw ODAwCkBAIC0yNDIsNiArMjQyLDcgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfU0NIRURfREVCVUcK KyNpZm5kZWYgQ09ORklHX1NDSEVEX1JJRlMKIHN0YXRpYyBpbnQgbWluX3NjaGVkX2dyYW51bGFy aXR5X25zID0gMTAwMDAwOwkJLyogMTAwIHVzZWNzICovCiBzdGF0aWMgaW50IG1heF9zY2hlZF9n cmFudWxhcml0eV9ucyA9IE5TRUNfUEVSX1NFQzsJLyogMSBzZWNvbmQgKi8KIHN0YXRpYyBpbnQg bWluX3dha2V1cF9ncmFudWxhcml0eV9uczsJCQkvKiAwIHVzZWNzICovCkBAIC0yNDksNiArMjUw LDcgQEAKIHN0YXRpYyBpbnQgbWluX3NjaGVkX3R1bmFibGVfc2NhbGluZyA9IFNDSEVEX1RVTkFC TEVTQ0FMSU5HX05PTkU7CiBzdGF0aWMgaW50IG1heF9zY2hlZF90dW5hYmxlX3NjYWxpbmcgPSBT Q0hFRF9UVU5BQkxFU0NBTElOR19FTkQtMTsKICNlbmRpZgorI2VuZGlmCiAKICNpZmRlZiBDT05G SUdfQ09NUEFDVElPTgogc3RhdGljIGludCBtaW5fZXh0ZnJhZ190aHJlc2hvbGQ7CkBAIC0yNTYs MTQgKzI1OCw4IEBACiAjZW5kaWYKIAogc3RhdGljIHN0cnVjdCBjdGxfdGFibGUga2Vybl90YWJs ZVtdID0gewotCXsKLQkJLnByb2NuYW1lCT0gInNjaGVkX2NoaWxkX3J1bnNfZmlyc3QiLAotCQku ZGF0YQkJPSAmc3lzY3RsX3NjaGVkX2NoaWxkX3J1bnNfZmlyc3QsCi0JCS5tYXhsZW4JCT0gc2l6 ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBw cm9jX2RvaW50dmVjLAotCX0sCiAjaWZkZWYgQ09ORklHX1NDSEVEX0RFQlVHCisjaWZuZGVmIENP TkZJR19TQ0hFRF9SSUZTCiAJewogCQkucHJvY25hbWUJPSAic2NoZWRfbWluX2dyYW51bGFyaXR5 X25zIiwKIAkJLmRhdGEJCT0gJnN5c2N0bF9zY2hlZF9taW5fZ3JhbnVsYXJpdHksCkBAIC0zMzgs MjAgKzMzNCw3IEBACiAJCS5leHRyYTIJCT0gJm9uZSwKIAl9LAogI2VuZGlmCi0JewotCQkucHJv Y25hbWUJPSAic2NoZWRfcnRfcGVyaW9kX3VzIiwKLQkJLmRhdGEJCT0gJnN5c2N0bF9zY2hlZF9y dF9wZXJpb2QsCi0JCS5tYXhsZW4JCT0gc2l6ZW9mKHVuc2lnbmVkIGludCksCi0JCS5tb2RlCQk9 IDA2NDQsCi0JCS5wcm9jX2hhbmRsZXIJPSBzY2hlZF9ydF9oYW5kbGVyLAotCX0sCi0JewotCQku cHJvY25hbWUJPSAic2NoZWRfcnRfcnVudGltZV91cyIsCi0JCS5kYXRhCQk9ICZzeXNjdGxfc2No ZWRfcnRfcnVudGltZSwKLQkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKLQkJLm1vZGUJCT0gMDY0 NCwKLQkJLnByb2NfaGFuZGxlcgk9IHNjaGVkX3J0X2hhbmRsZXIsCi0JfSwKKyNlbmRpZgogI2lm ZGVmIENPTkZJR19TQ0hFRF9BVVRPR1JPVVAKIAl7CiAJCS5wcm9jbmFtZQk9ICJzY2hlZF9hdXRv Z3JvdXBfZW5hYmxlZCIsCg== --14dae9340435de35f104c2b2835a-- -- 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/