From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S267514AbUIVBpe (ORCPT ); Tue, 21 Sep 2004 21:45:34 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S267646AbUIVBpe (ORCPT ); Tue, 21 Sep 2004 21:45:34 -0400 Received: from mx1.redhat.com ([66.187.233.31]:19130 "EHLO mx1.redhat.com") by vger.kernel.org with ESMTP id S267514AbUIVBoP (ORCPT ); Tue, 21 Sep 2004 21:44:15 -0400 Date: Tue, 21 Sep 2004 18:44:02 -0700 From: Pete Zaitcev To: Benjamin Herrenschmidt Cc: Linux Kernel list Subject: Re: [BUG] ub.c badness in current bk Message-Id: <20040921184402.1cad1414@lembas.zaitcev.lan> In-Reply-To: <1095651446.31131.48.camel@gaston> References: <20040917002935.77620d1d@lembas.zaitcev.lan> <1095414394.13531.77.camel@gaston> <20040917090448.32ff763c@lembas.zaitcev.lan> <1095469463.3574.2.camel@gaston> <1095473325.3574.4.camel@gaston> <20040919202126.1073925b@lembas.zaitcev.lan> <1095651446.31131.48.camel@gaston> Organization: Red Hat, Inc. X-Mailer: Sylpheed version 0.9.11claws (GTK+ 1.2.10; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="Multipart=_Tue__21_Sep_2004_18_44_02_-0700_BLl.GK08K_hjMtRl" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --Multipart=_Tue__21_Sep_2004_18_44_02_-0700_BLl.GK08K_hjMtRl Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit --Multipart=_Tue__21_Sep_2004_18_44_02_-0700_BLl.GK08K_hjMtRl Content-Type: application/octet-stream; name="ub.c" Content-Disposition: attachment; filename="ub.c" Content-Transfer-Encoding: base64 LyoKICogVGhlIGxvdyBwZXJmb3JtYW5jZSBVU0Igc3RvcmFnZSBkcml2ZXIgKHViKS4KICoKICog Q29weXJpZ2h0IChjKSAxOTk5LCAyMDAwIE1hdHRoZXcgRGhhcm0gKG1kaGFybS11c2JAb25lLWV5 ZWQtYWxpZW4ubmV0KQogKiBDb3B5cmlnaHQgKEMpIDIwMDQgUGV0ZSBaYWl0Y2V2ICh6YWl0Y2V2 QHlhaG9vLmNvbSkKICoKICogVGhpcyB3b3JrIGlzIGEgcGFydCBvZiBMaW51eCBrZXJuZWwsIGlz IGRlcml2ZWQgZnJvbSBpdCwKICogYW5kIGlzIG5vdCBsaWNlbnNlZCBzZXBhcmF0ZWx5LiBTZWUg ZmlsZSBDT1BZSU5HIGZvciBkZXRhaWxzLgogKgogKiBUT0RPIChzb3J0ZWQgYnkgZGVjcmVhc2lu ZyBwcmlvcml0eSkKICogIC0tIFpJUCBkb2VzICJ1YjogcmVzaWQgMTggbGVuIDAgYWN0IDAiIGFu ZCB3aG9sZSB0cmFuc3BvcnQgcXVpdHMgKHRvZ2dsZXM/KQogKiAgLS0gc2V0IHJlYWRvbmx5IGZs YWcgZm9yIENEcywgc2V0IHJlbW92YWJsZSBmbGFnIGZvciBDRiByZWFkZXJzCiAqICAtLSBkbyBp bnF1aXJ5IGFuZCB2ZXJpZnkgd2UgZ290IGEgZGlzayBhbmQgbm90IGEgdGFwZSAoZm9yIExVTiBt aXNtYXRjaCkKICogIC0tIHN1cHBvcnQgcHBoYW5ldWYncyBTRERSLTc1IHdpdGggdHdvIExVTnMg KGFsc28gYnJva2VuIGNhcGFjaXR5Li4uKQogKiAgLS0gc3BlY2lhbCBjYXNlIHNvbWUgc2Vuc2Vz LCBlLmcuIDNhLzAgLT4gbm8gbWVkaWEgcHJlc2VudCwgcmVkdWNlIHJldHJpZXMKICogIC0tIGRv IHNvbWV0aGluZyBhYm91dCBzcGluLWRvd24gZGV2aWNlcywgdGhleSBhcmUgZXh0cmVtZWx5IGRh bmdlcm91cwogKiAgICAgKFpJUCBpcyBvbmUuIE5lZWRzIHNwaW4tdXAgY29tbWFuZCBhcyB3ZWxs LikKICogIC0tIHZlcmlmeSB0aGUgMTMgY29uZGl0aW9ucyBhbmQgZG8gYnVsayByZXNldHMKICog IC0tIG5vcm1hbCBwb29sIG9mIGNvbW1hbmRzIGluc3RlYWQgb2YgY21kdltdPwogKiAgLS0ga2ls bCBsYXN0X3BpcGUgYW5kIHNpbXBseSBkbyB0d28tc3RhdGUgY2xlYXJpbmcgb24gYm90aCBwaXBl cwogKiAgLS0gdmVyaWZ5IHByb3RvY29sIChidWxrKSBmcm9tIFVTQiBkZXNjcmlwdG9ycyAobWF5 YmUuLi4pCiAqICAtLSBoaWdobWVtIGFuZCBzZwogKiAgLS0gbW92ZSB0b3Bfc2Vuc2UgYW5kIHdv cmtfYmNzIGludG8gc2VwYXJhdGUgYWxsb2NhdGlvbnMgKGlmIHRoZXkgc3Vydml2ZSkKICogICAg IGZvciBjYWNoZSBwdXJpc3RzIGFuZCBlc290ZXJpYyBhcmNoaXRlY3R1cmVzLgogKiAgLS0gcHJ1 bmUgY29tbWVudHMsIHRoZXkgYXJlIHRvbyB2b2x1bW5vdXMKICogIC0tIEV4dGVybWluYXRlIFAz IHByaW50a3MKICogIC0tIFJlc292ZSBYWFgncwogKiAgLS0gUmVkbyAiYmVuaCdzIHJldHJpZXMi LCBwZXJoYXBzIGhhdmUgc3Bpbi11cCBjb2RlIHRvIGhhbmRsZSB0aGVtLiBWOkQ9PwogKi8KI2lu Y2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRl IDxsaW51eC91c2IuaD4KI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgojaW5jbHVkZSA8bGludXgv ZGV2ZnNfZnNfa2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC90aW1lci5oPgojaW5jbHVkZSA8c2Nz aS9zY3NpLmg+CgojZGVmaW5lIERSVl9OQU1FICJ1YiIKI2RlZmluZSBERVZGU19OQU1FIERSVl9O QU1FCgojZGVmaW5lIFVCX01BSk9SIDEyNQkvKiBTdG9sZW4gZnJvbSBFeHBlcmltZW50YWwgcmFu Z2UgZm9yIGEgd2VlayAtIFhYWCAqLwoKLyoKICogRGVmaW5pdGlvbnMgd2hpY2ggaGF2ZSB0byBi ZSBzY2F0dGVyZWQgb25jZSB3ZSB1bmRlcnN0YW5kIHRoZSBsYXlvdXQgYmV0dGVyLgogKi8KCi8q IFRyYW5zcG9ydCAoZGVzcGl0ZSBQUiBpbiB0aGUgbmFtZSkgKi8KI2RlZmluZSBVU19QUl9CVUxL CTB4NTAJCS8qIGJ1bGsgb25seSAqLwoKLyogUHJvdG9jb2wgKi8KI2RlZmluZSBVU19TQ19TQ1NJ CTB4MDYJCS8qIFRyYW5zcGFyZW50ICovCgovKgogKi8KI2RlZmluZSBVQl9NSU5PUlNfUEVSX01B Sk9SCTgKCiNkZWZpbmUgVUJfTUFYX0NEQl9TSVpFICAgICAgMTYJCS8qIENvcnJlc3BvbmRzIHRv IEJ1bGsgKi8KCiNkZWZpbmUgVUJfU0VOU0VfU0laRSAgMTgKCi8qCiAqLwoKLyogY29tbWFuZCBi bG9jayB3cmFwcGVyICovCnN0cnVjdCBidWxrX2NiX3dyYXAgewoJdTMyCVNpZ25hdHVyZTsJCS8q IGNvbnRhaW5zICdVU0JDJyAqLwoJdTMyCVRhZzsJCQkvKiB1bmlxdWUgcGVyIGNvbW1hbmQgaWQg Ki8KCXUzMglEYXRhVHJhbnNmZXJMZW5ndGg7CS8qIHNpemUgb2YgZGF0YSAqLwoJdTgJRmxhZ3M7 CQkJLyogZGlyZWN0aW9uIGluIGJpdCAwICovCgl1OAlMdW47CQkJLyogTFVOIG5vcm1hbGx5IDAg Ki8KCXU4CUxlbmd0aDsJCQkvKiBvZiBvZiB0aGUgQ0RCICovCgl1OAlDREJbVUJfTUFYX0NEQl9T SVpFXTsJLyogbWF4IGNvbW1hbmQgKi8KfTsKCiNkZWZpbmUgVVNfQlVMS19DQl9XUkFQX0xFTgkz MQojZGVmaW5lIFVTX0JVTEtfQ0JfU0lHTgkJMHg0MzQyNTM1NQkvKnNwZWxscyBvdXQgVVNCQyAq LwojZGVmaW5lIFVTX0JVTEtfRkxBR19JTgkJMQojZGVmaW5lIFVTX0JVTEtfRkxBR19PVVQJMAoK LyogY29tbWFuZCBzdGF0dXMgd3JhcHBlciAqLwpzdHJ1Y3QgYnVsa19jc193cmFwIHsKCXUzMglT aWduYXR1cmU7CQkvKiBzaG91bGQgPSAnVVNCUycgKi8KCXUzMglUYWc7CQkJLyogc2FtZSBhcyBv cmlnaW5hbCBjb21tYW5kICovCgl1MzIJUmVzaWR1ZTsJCS8qIGFtb3VudCBub3QgdHJhbnNmZXJy ZWQgKi8KCXU4CVN0YXR1czsJCQkvKiBzZWUgYmVsb3cgKi8KfTsKCiNkZWZpbmUgVVNfQlVMS19D U19XUkFQX0xFTgkxMwojZGVmaW5lIFVTX0JVTEtfQ1NfU0lHTgkJMHg1MzQyNTM1NQkvKiBzcGVs bHMgb3V0ICdVU0JTJyAqLwovKiBUaGlzIGlzIGZvciBPbHltcHVzIENhbWVkaWEgZGlnaXRhbCBj YW1lcmFzICovCiNkZWZpbmUgVVNfQlVMS19DU19PTFlNUFVTX1NJR04JMHg1NTQyNTM1NQkvKiBz cGVsbHMgb3V0ICdVU0JVJyAqLwojZGVmaW5lIFVTX0JVTEtfU1RBVF9PSwkJMAojZGVmaW5lIFVT X0JVTEtfU1RBVF9GQUlMCTEKI2RlZmluZSBVU19CVUxLX1NUQVRfUEhBU0UJMgoKLyogYnVsay1v bmx5IGNsYXNzIHNwZWNpZmljIHJlcXVlc3RzICovCiNkZWZpbmUgVVNfQlVMS19SRVNFVF9SRVFV RVNUCTB4ZmYKI2RlZmluZSBVU19CVUxLX0dFVF9NQVhfTFVOCTB4ZmUKCi8qCiAqLwpzdHJ1Y3Qg dWJfZGV2OwoKI2RlZmluZSBVQl9NQVhfUkVRX1NHCTEKI2RlZmluZSBVQl9NQVhfU0VDVE9SUyA2 NAoKLyoKICogQSBzZWNvbmQgb3VnaHQgdG8gYmUgZW5vdWdoIGZvciBhIDMySyB0cmFuc2ZlciAo VUJfTUFYX1NFQ1RPUlMpCiAqIGV2ZW4gaWYgYSB3ZWJjYW0gaG9ncyB0aGUgYnVzIChmYW1vdXMg bGFzdCB3b3JkcykuCiAqIFNvbWUgQ0RzIG5lZWQgYSBzZWNvbmQgdG8gc3BpbiB1cCB0aG91Z2gu CiAqIFpJUCBkcml2ZSByZWplY3RzIGNvbW1hbmRzIHdoZW4gaXQncyBub3Qgc3Bpbm5pbmcsCiAq IHNvIGl0IGRvZXMgbm90IG5lZWQgbG9uZyB0aW1lb3V0cyBlaXRoZXIuCiAqLwojZGVmaW5lIFVC X1VSQl9USU1FT1VUCShIWioyKQojZGVmaW5lIFVCX0NUUkxfVElNRU9VVAkoSFovMikgLyogNTAw bXMgb3VnaHQgdG8gYmUgZW5vdWdoIHRvIGNsZWFyIGEgc3RhbGwgKi8KCi8qCiAqIEFuIGluc3Rh bmNlIG9mIGEgU0NTSSBjb21tYW5kIGluIHRyYW5zaXQuCiAqLwojZGVmaW5lIFVCX0RJUl9OT05F CTAKI2RlZmluZSBVQl9ESVJfUkVBRAkxCiNkZWZpbmUgVUJfRElSX0lMTEVHQUwyCTIKI2RlZmlu ZSBVQl9ESVJfV1JJVEUJMwoKI2RlZmluZSBVQl9ESVJfQ0hBUihjKSAgKCgoYyk9PVVCX0RJUl9X UklURSk/ICd3JzogXAoJCQkgKCgoYyk9PVVCX0RJUl9SRUFEKT8gJ3InOiAnbicpKQoKZW51bSB1 Yl9zY3NpX2NtZF9zdGF0ZSB7CglVQl9DTURTVF9JTklULAkJCS8qIEluaXRpYWwgc3RhdGUgKi8K CVVCX0NNRFNUX0NNRCwJCQkvKiBDb21tYW5kIHN1Ym1pdHRlZCAqLwoJVUJfQ01EU1RfREFUQSwJ CQkvKiBEYXRhIHBoYXNlICovCglVQl9DTURTVF9DTFIyU1RTLAkJLyogQ2xlYXJpbmcgYmVmb3Jl IHJlcXVlc3Rpbmcgc3RhdHVzICovCglVQl9DTURTVF9TVEFULAkJCS8qIFN0YXR1cyBwaGFzZSAq LwoJVUJfQ01EU1RfQ0xFQVIsCQkJLyogQ2xlYXJpbmcgYSBzdGFsbCAoaGFsdCwgYWN0dWFsbHkp ICovCglVQl9DTURTVF9TRU5TRSwJCQkvKiBTZW5kaW5nIFJlcXVlc3QgU2Vuc2UgKi8KCVVCX0NN RFNUX0RPTkUJCQkvKiBGaW5hbCBzdGF0ZSAqLwp9OwoKc3RhdGljIGNoYXIgKnViX3Njc2lfY21k X3N0bmFtZVtdID0gewoJIi4gICIsCgkiQ21kIiwKCSJkYXQiLAoJImMycyIsCgkic3RzIiwKCSJj bHIiLAoJIlNlbiIsCgkiZmluIgp9OwoKc3RydWN0IHViX3Njc2lfY21kIHsKCXVuc2lnbmVkIGNo YXIgY2RiW1VCX01BWF9DREJfU0laRV07Cgl1bnNpZ25lZCBjaGFyIGNkYl9sZW47CgoJdW5zaWdu ZWQgY2hhciBkaXI7CQkvKiAwIC0gbm9uZSwgMSAtIHJlYWQsIDMgLSB3cml0ZS4gKi8KCXVuc2ln bmVkIGNoYXIgdHJhY2VfaW5kZXg7CgllbnVtIHViX3Njc2lfY21kX3N0YXRlIHN0YXRlOwoJdW5z aWduZWQgaW50IHRhZzsKCXN0cnVjdCB1Yl9zY3NpX2NtZCAqbmV4dDsKCglpbnQgZXJyb3I7CQkJ LyogUmV0dXJuIGNvZGUgLSB2YWxpZCB1cG9uIGRvbmUgKi8KCXVuc2lnbmVkIGludCBhY3RfbGVu OwkJLyogUmV0dXJuIHNpemUgKi8KCXVuc2lnbmVkIGNoYXIga2V5LCBhc2MsIGFzY3E7CS8qIE1h eSBiZSB2YWxpZCBpZiBlcnJvcj09LUVJTyAqLwoKCWludCBzdGF0X2NvdW50OwkJCS8qIFJldHJp ZXMgZ2V0dGluZyBzdGF0dXMuICovCgoJLyoKCSAqIFdlIGRvIG5vdCBzdXBwb3J0IHRyYW5zZmVy cyBmcm9tIGhpZ2htZW0gcGFnZXMKCSAqIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgVVNCIGZyYW1l d29yayBkb2VzIG5vdCBkbyB3aGF0IHdlIG5lZWQuCgkgKi8KCWNoYXIgKmRhdGE7CQkJLyogUmVx dWVzdGVkIGJ1ZmZlciAqLwoJdW5zaWduZWQgaW50IGxlbjsJCS8qIFJlcXVlc3RlZCBsZW5ndGgg Ki8KCS8vIHN0cnVjdCBzY2F0dGVybGlzdCBzZ3ZbVUJfTUFYX1JFUV9TR107CgoJdm9pZCAoKmRv bmUpKHN0cnVjdCB1Yl9kZXYgKiwgc3RydWN0IHViX3Njc2lfY21kICopOwoJdm9pZCAqYmFjazsK fTsKCi8qCiAqLwpzdHJ1Y3QgdWJfY2FwYWNpdHkgewoJdW5zaWduZWQgbG9uZyBuc2VjOwkJLyog TGludXggc2l6ZSAtIDUxMiBieXRlIHNlY3RvcnMgKi8KCXVuc2lnbmVkIGludCBic2l6ZTsJCS8q IExpbnV4IGhhcmRzZWN0X3NpemUgKi8KCXVuc2lnbmVkIGludCBic2hpZnQ7CQkvKiBTaGlmdCBi ZXR3ZWVuIDUxMiBhbmQgaGFyZCBzZWN0cyAqLwp9OwoKLyoKICogVGhlIFNDU0kgY29tbWFuZCB0 cmFjaW5nIHN0cnVjdHVyZS4KICovCgojZGVmaW5lIFNDTURfU1RfSElTVF9TWiAgIDgKI2RlZmlu ZSBTQ01EX1RSQUNFX1NaICAgIDE1CS8qIE5vIG1vcmUgdGhhbiAyNTYgKHRyYWNlX2luZGV4KSAq LwoKc3RydWN0IHViX3Njc2lfY21kX3RyYWNlIHsKCWludCBoY3VyOwoJdW5zaWduZWQgaW50IHRh ZzsKCXVuc2lnbmVkIGludCByZXFfc2l6ZSwgYWN0X3NpemU7Cgl1bnNpZ25lZCBjaGFyIG9wOwoJ dW5zaWduZWQgY2hhciBkaXI7Cgl1bnNpZ25lZCBjaGFyIGtleSwgYXNjLCBhc2NxOwoJY2hhciBz dF9oc3RbU0NNRF9TVF9ISVNUX1NaXTsJCn07CgpzdHJ1Y3QgdWJfc2NzaV90cmFjZSB7CglpbnQg Y3VyOwoJc3RydWN0IHViX3Njc2lfY21kX3RyYWNlIHZlY1tTQ01EX1RSQUNFX1NaXTsKfTsKCi8q CiAqIFRoaXMgaXMgYSBkaXJlY3QgdGFrZS1vZmYgZnJvbSBsaW51eC9pbmNsdWRlL2NvbXBsZXRp b24uaAogKiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IEkgZG8gbm90IHdhaXQgb24gdGhpcyB0aGlu ZywganVzdCBwb2xsLgogKiBXaGVuIEkgd2FudCB0byB3YWl0ICh1Yl9wcm9iZSksIEkganVzdCB1 c2UgdGhlIHN0b2NrIGNvbXBsZXRpb24uCiAqCiAqIE5vdGUgdGhhdCBJTklUX0NPTVBMRVRJT04g dGFrZXMgbm8gbG9jay4gSXQgaXMgY29ycmVjdC4gQnV0IHdoeQogKiBpbiB0aGUgYmxvb2R5IGhl bGwgdGhhdCB0aGluZyB0YWtlcyBzdHJ1Y3QgaW5zdGVhZCBvZiBwb2ludGVyIHRvIHN0cnVjdAog KiBpcyBxdWl0ZSBiZXlvbmQgbWUuIEkganVzdCBjb3BpZWQgaXQgZnJvbSB0aGUgc3RvY2sgY29t cGxldGlvbi4KICovCnN0cnVjdCB1Yl9jb21wbGV0aW9uIHsKCXVuc2lnbmVkIGludCBkb25lOwoJ c3BpbmxvY2tfdCBsb2NrOwp9OwoKc3RhdGljIGlubGluZSB2b2lkIHViX2luaXRfY29tcGxldGlv bihzdHJ1Y3QgdWJfY29tcGxldGlvbiAqeCkKewoJeC0+ZG9uZSA9IDA7CglzcGluX2xvY2tfaW5p dCgmeC0+bG9jayk7Cn0KCiNkZWZpbmUgVUJfSU5JVF9DT01QTEVUSU9OKHgpCSgoeCkuZG9uZSA9 IDApCgpzdGF0aWMgdm9pZCB1Yl9jb21wbGV0ZShzdHJ1Y3QgdWJfY29tcGxldGlvbiAqeCkKewoJ dW5zaWduZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmeC0+bG9jaywgZmxhZ3Mp OwoJeC0+ZG9uZSsrOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeC0+bG9jaywgZmxhZ3MpOwp9 CgpzdGF0aWMgaW50IHViX2lzX2NvbXBsZXRlZChzdHJ1Y3QgdWJfY29tcGxldGlvbiAqeCkKewoJ dW5zaWduZWQgbG9uZyBmbGFnczsKCWludCByZXQ7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJngtPmxv Y2ssIGZsYWdzKTsKCXJldCA9IHgtPmRvbmU7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4LT5s b2NrLCBmbGFncyk7CglyZXR1cm4gcmV0Owp9CgovKgogKi8Kc3RydWN0IHViX3Njc2lfY21kX3F1 ZXVlIHsKCWludCBxbGVuLCBxbWF4OwoJc3RydWN0IHViX3Njc2lfY21kICpoZWFkLCAqdGFpbDsK fTsKCi8qCiAqIFRoZSBVQiBkZXZpY2UgaW5zdGFuY2UuCiAqLwpzdHJ1Y3QgdWJfZGV2IHsKCXNw aW5sb2NrX3QgbG9jazsKCWludCBpZDsJCQkJLyogTnVtYmVyIGFtb25nIHViJ3MgKi8KCWF0b21p Y190IHBvaXNvbjsJCS8qIFRoZSBVU0IgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCAqLwoJaW50IG9w ZW5jOwkJCS8qIHByb3RlY3RlZCBieSB1Yl9sb2NrISAqLwoJCQkJCS8qIGtyZWYgaXMgdG9vIGlt cGxpY2l0IGZvciBvdXIgdGFzdGUgKi8KCXVuc2lnbmVkIGludCB0YWdjbnQ7CglpbnQgY2hhbmdl ZDsJCQkvKiBNZWRpYSB3YXMgY2hhbmdlZCAqLwoJaW50IHJlbW92YWJsZTsKCWludCByZWFkb25s eTsKCWNoYXIgbmFtZVs4XTsKCXN0cnVjdCB1c2JfZGV2aWNlICpkZXY7CglzdHJ1Y3QgdXNiX2lu dGVyZmFjZSAqaW50ZjsKCglzdHJ1Y3QgdWJfY2FwYWNpdHkgY2FwYWNpdHk7IAoJc3RydWN0IGdl bmRpc2sgKmRpc2s7CgoJdW5zaWduZWQgaW50IHNlbmRfYnVsa19waXBlOwkvKiBjYWNoZWQgcGlw ZSB2YWx1ZXMgKi8KCXVuc2lnbmVkIGludCByZWN2X2J1bGtfcGlwZTsKCXVuc2lnbmVkIGludCBz ZW5kX2N0cmxfcGlwZTsKCXVuc2lnbmVkIGludCByZWN2X2N0cmxfcGlwZTsKCglzdHJ1Y3QgdGFz a2xldF9zdHJ1Y3QgdGFza2xldDsKCgkvKiBYWFggVXNlIEluZ28ncyBtZW1wb29sIChvbmNlIHdl IGhhdmUgbW9yZSB0aGFuIG9uZSkgKi8KCWludCBjbWRhWzFdOwoJc3RydWN0IHViX3Njc2lfY21k IGNtZHZbMV07CgoJc3RydWN0IHViX3Njc2lfY21kX3F1ZXVlIGNtZF9xdWV1ZTsKCXN0cnVjdCB1 Yl9zY3NpX2NtZCB0b3BfcnFzX2NtZDsJLyogUkVRVUVTVCBTRU5TRSAqLwoJdW5zaWduZWQgY2hh ciB0b3Bfc2Vuc2VbVUJfU0VOU0VfU0laRV07CgoJc3RydWN0IHViX2NvbXBsZXRpb24gd29ya19k b25lOwoJc3RydWN0IHVyYiB3b3JrX3VyYjsKCXN0cnVjdCB0aW1lcl9saXN0IHdvcmtfdGltZXI7 CglpbnQgbGFzdF9waXBlOwkJCS8qIFdoYXQgbWlnaHQgbmVlZCBjbGVhcmluZyAqLwoJc3RydWN0 IGJ1bGtfY2Jfd3JhcCB3b3JrX2JjYjsKCXN0cnVjdCBidWxrX2NzX3dyYXAgd29ya19iY3M7Cglz dHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IHdvcmtfY3I7CgoJc3RydWN0IHViX3Njc2lfdHJhY2UgdHI7 Cn07CgovKgogKi8Kc3RhdGljIHZvaWQgdWJfcndfY21kX2RvbmUoc3RydWN0IHViX2RldiAqc2Ms IHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKc3RhdGljIHZvaWQgdWJfZW5kX3JxKHN0cnVjdCBy ZXF1ZXN0ICpycSwgaW50IHVwdG9kYXRlKTsKc3RhdGljIGludCB1Yl9zdWJtaXRfc2NzaShzdHJ1 Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpOwpzdGF0aWMgdm9pZCB1Yl91 cmJfY29tcGxldGUoc3RydWN0IHVyYiAqdXJiLCBzdHJ1Y3QgcHRfcmVncyAqcHQpOwpzdGF0aWMg dm9pZCB1Yl9zY3NpX2FjdGlvbih1bnNpZ25lZCBsb25nIF9kZXYpOwpzdGF0aWMgdm9pZCB1Yl9z Y3NpX2Rpc3BhdGNoKHN0cnVjdCB1Yl9kZXYgKnNjKTsKc3RhdGljIHZvaWQgdWJfc2NzaV91cmJf Y29tcGwoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKc3RhdGlj IHZvaWQgdWJfc3RhdGVfZG9uZShzdHJ1Y3QgdWJfZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21k ICpjbWQsIGludCByYyk7CnN0YXRpYyB2b2lkIHViX3N0YXRlX3N0YXQoc3RydWN0IHViX2RldiAq c2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKc3RhdGljIHZvaWQgdWJfc3RhdGVfc2Vuc2Uo c3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKTsKc3RhdGljIGludCB1 Yl9zdWJtaXRfY2xlYXJfc3RhbGwoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2Nt ZCAqY21kLAogICAgaW50IHN0YWxsZWRfcGlwZSk7CnN0YXRpYyB2b2lkIHViX3RvcF9zZW5zZV9k b25lKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKnNjbWQpOwpzdGF0aWMg aW50IHViX3N5bmNfdHVyKHN0cnVjdCB1Yl9kZXYgKnNjKTsKc3RhdGljIGludCB1Yl9zeW5jX3Jl YWRfY2FwKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfY2FwYWNpdHkgKnJldCk7CgovKgog Ki8Kc3RhdGljIHN0cnVjdCB1c2JfZGV2aWNlX2lkIHViX3VzYl9pZHNbXSA9IHsKCS8vIHsgVVNC X0RFVklDRV9WRVIoMHgwNzgxLCAweDAwMDIsIDB4MDAwOSwgMHgwMDA5KSB9LAkvKiBTRERSLTMx ICovCgl7IFVTQl9JTlRFUkZBQ0VfSU5GTyhVU0JfQ0xBU1NfTUFTU19TVE9SQUdFLCBVU19TQ19T Q1NJLCBVU19QUl9CVUxLKSB9LAoJeyB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwgdWJf dXNiX2lkcyk7CgovKgogKiBGaW5kIG1lIGEgd2F5IHRvIGlkZW50aWZ5ICJuZXh0IGZyZWUgbWlu b3IiIGZvciBhZGRfZGlzaygpLAogKiBhbmQgdGhlIGFycmF5IGRpc2FwcGVhcnMgdGhlIG5leHQg ZGF5LiBIb3dldmVyLCB0aGUgbnVtYmVyIG9mCiAqIGhvc3RzIGhhcyBzb21ldGhpbmcgdG8gZG8g d2l0aCB0aGUgbmFtaW5nIGFuZCAvcHJvYy9wYXJ0aXRpb25zLgogKiBUaGlzIGhhcyB0byBiZSB0 aG91Z2h0IG91dCBpbiBkZXRhaWwgYmVmb3JlIGNoYW5naW5nLgogKiBJZiBVQl9NQVhfSE9TVCB3 YXMgMTAwMCwgd2UnZCB1c2UgYSBiaXRtYXAuIE9yIGEgYmV0dGVyIGRhdGEgc3RydWN0dXJlLgog Ki8KI2RlZmluZSBVQl9NQVhfSE9TVFMgIDI2CnN0YXRpYyBjaGFyIHViX2hvc3R2W1VCX01BWF9I T1NUU107CnN0YXRpYyBzcGlubG9ja190IHViX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CS8q IExvY2tzIGdsb2JhbHMgYW5kIC0+b3BlbmMgKi8KCi8qCiAqIFRoZSBTQ1NJIGNvbW1hbmQgdHJh Y2luZyBwcm9jZWR1cmVzLgogKi8KCnN0YXRpYyB2b2lkIHViX2NtZHRyX25ldyhzdHJ1Y3QgdWJf ZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpCnsKCWludCBuOwoJc3RydWN0IHViX3Nj c2lfY21kX3RyYWNlICp0OwoKCWlmICgobiA9IHNjLT50ci5jdXIgKyAxKSA9PSBTQ01EX1RSQUNF X1NaKSBuID0gMDsKCXQgPSAmc2MtPnRyLnZlY1tuXTsKCgltZW1zZXQodCwgMCwgc2l6ZW9mKHN0 cnVjdCB1Yl9zY3NpX2NtZF90cmFjZSkpOwoJdC0+dGFnID0gY21kLT50YWc7Cgl0LT5vcCA9IGNt ZC0+Y2RiWzBdOwoJdC0+ZGlyID0gY21kLT5kaXI7Cgl0LT5yZXFfc2l6ZSA9IGNtZC0+bGVuOwoJ dC0+c3RfaHN0WzBdID0gY21kLT5zdGF0ZTsKCglzYy0+dHIuY3VyID0gbjsKCWNtZC0+dHJhY2Vf aW5kZXggPSBuOwp9CgpzdGF0aWMgdm9pZCB1Yl9jbWR0cl9zdGF0ZShzdHJ1Y3QgdWJfZGV2ICpz Yywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpCnsKCWludCBuOwoJc3RydWN0IHViX3Njc2lfY21k X3RyYWNlICp0OwoKCXQgPSAmc2MtPnRyLnZlY1tjbWQtPnRyYWNlX2luZGV4XTsKCWlmICh0LT50 YWcgPT0gY21kLT50YWcpIHsKCQlpZiAoKG4gPSB0LT5oY3VyICsgMSkgPT0gU0NNRF9TVF9ISVNU X1NaKSBuID0gMDsKCQl0LT5zdF9oc3Rbbl0gPSBjbWQtPnN0YXRlOwoJCXQtPmhjdXIgPSBuOwoJ fQp9CgpzdGF0aWMgdm9pZCB1Yl9jbWR0cl9hY3RfbGVuKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1 Y3QgdWJfc2NzaV9jbWQgKmNtZCkKewoJc3RydWN0IHViX3Njc2lfY21kX3RyYWNlICp0OwoKCXQg PSAmc2MtPnRyLnZlY1tjbWQtPnRyYWNlX2luZGV4XTsKCWlmICh0LT50YWcgPT0gY21kLT50YWcp CgkJdC0+YWN0X3NpemUgPSBjbWQtPmFjdF9sZW47Cn0KCnN0YXRpYyB2b2lkIHViX2NtZHRyX3Nl bnNlKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwKICAgIHVuc2ln bmVkIGNoYXIgKnNlbnNlKQp7CglzdHJ1Y3QgdWJfc2NzaV9jbWRfdHJhY2UgKnQ7CgoJdCA9ICZz Yy0+dHIudmVjW2NtZC0+dHJhY2VfaW5kZXhdOwoJaWYgKHQtPnRhZyA9PSBjbWQtPnRhZykgewoJ CXQtPmtleSA9IHNlbnNlWzJdICYgMHgwRjsKCQl0LT5hc2MgPSBzZW5zZVsxMl07CgkJdC0+YXNj cSA9IHNlbnNlWzEzXTsKCX0KfQoKc3RhdGljIHNzaXplX3QgdWJfZGlhZ19zaG93KHN0cnVjdCBk ZXZpY2UgKmRldiwgY2hhciAqcGFnZSkKewoJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGY7Cglz dHJ1Y3QgdWJfZGV2ICpzYzsKCWludCBjbnQ7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50IG5j LCBuaDsKCWludCBpLCBqOwoJc3RydWN0IHViX3Njc2lfY21kX3RyYWNlICp0OwoKCWludGYgPSB0 b191c2JfaW50ZXJmYWNlKGRldik7CglzYyA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7CglpZiAo c2MgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCgljbnQgPSAwOwoJc3Bpbl9sb2NrX2lycXNhdmUoJnNj LT5sb2NrLCBmbGFncyk7CgoJY250ICs9IHNwcmludGYocGFnZSArIGNudCwKCSAgICAicWxlbiAl ZCBxbWF4ICVkIGNoYW5nZWQgJWQgcmVtb3ZhYmxlICVkIHJlYWRvbmx5ICVkXG4iLAoJICAgIHNj LT5jbWRfcXVldWUucWxlbiwgc2MtPmNtZF9xdWV1ZS5xbWF4LAoJICAgIHNjLT5jaGFuZ2VkLCBz Yy0+cmVtb3ZhYmxlLCBzYy0+cmVhZG9ubHkpOwoKCWlmICgobmMgPSBzYy0+dHIuY3VyICsgMSkg PT0gU0NNRF9UUkFDRV9TWikgbmMgPSAwOwoJZm9yIChqID0gMDsgaiA8IFNDTURfVFJBQ0VfU1o7 IGorKykgewoJCXQgPSAmc2MtPnRyLnZlY1tuY107CgoJCWNudCArPSBzcHJpbnRmKHBhZ2UgKyBj bnQsICIlMDh4ICUwMngiLCB0LT50YWcsIHQtPm9wKTsKCQlpZiAodC0+b3AgPT0gUkVRVUVTVF9T RU5TRSkgewoJCQljbnQgKz0gc3ByaW50ZihwYWdlICsgY250LCAiIFtzZW5zZSAleCAlMDJ4ICUw MnhdIiwKCQkJCQl0LT5rZXksIHQtPmFzYywgdC0+YXNjcSk7CgkJfSBlbHNlIHsKCQkJY250ICs9 IHNwcmludGYocGFnZSArIGNudCwgIiAlYyIsIFVCX0RJUl9DSEFSKHQtPmRpcikpOwoJCQljbnQg Kz0gc3ByaW50ZihwYWdlICsgY250LCAiIFslNWQgJTVkXSIsCgkJCQkJdC0+cmVxX3NpemUsIHQt PmFjdF9zaXplKTsKCQl9CgkJaWYgKChuaCA9IHQtPmhjdXIgKyAxKSA9PSBTQ01EX1NUX0hJU1Rf U1opIG5oID0gMDsKCQlmb3IgKGkgPSAwOyBpIDwgU0NNRF9TVF9ISVNUX1NaOyBpKyspIHsKCQkJ Y250ICs9IHNwcmludGYocGFnZSArIGNudCwgIiAlcyIsCgkJCQkJdWJfc2NzaV9jbWRfc3RuYW1l WyhpbnQpdC0+c3RfaHN0W25oXV0pOwoJCQlpZiAoKytuaCA9PSBTQ01EX1NUX0hJU1RfU1opIG5o ID0gMDsKCQl9CgkJY250ICs9IHNwcmludGYocGFnZSArIGNudCwgIlxuIik7CgoJCWlmICgrK25j ID09IFNDTURfVFJBQ0VfU1opIG5jID0gMDsKCX0KCglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZz Yy0+bG9jaywgZmxhZ3MpOwoJcmV0dXJuIGNudDsKfQoKc3RhdGljIERFVklDRV9BVFRSKGRpYWcs IFNfSVJVR08sIHViX2RpYWdfc2hvdywgTlVMTCk7IC8qIE4uQi4gV29ybGQgcmVhZGFibGUgKi8K Ci8qCiAqIFRoZSBpZCBhbGxvY2F0b3IuCiAqCiAqIFRoaXMgYWxzbyBzdG9yZXMgdGhlIGhvc3Qg Zm9yIGluZGV4aW5nIGJ5IG1pbm9yLCB3aGljaCBpcyBzb21ld2hhdCBkaXJ0eS4KICovCnN0YXRp YyBpbnQgdWJfaWRfZ2V0KHZvaWQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CglpbnQgaTsKCglz cGluX2xvY2tfaXJxc2F2ZSgmdWJfbG9jaywgZmxhZ3MpOwoJZm9yIChpID0gMDsgaSA8IFVCX01B WF9IT1NUUzsgaSsrKSB7CgkJaWYgKHViX2hvc3R2W2ldID09IDApIHsKCQkJdWJfaG9zdHZbaV0g PSAxOwoJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ1Yl9sb2NrLCBmbGFncyk7CgkJCXJldHVy biBpOwoJCX0KCX0KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnViX2xvY2ssIGZsYWdzKTsKCXJl dHVybiAtMTsKfQoKc3RhdGljIHZvaWQgdWJfaWRfcHV0KGludCBpZCkKewoKCWlmIChpZCA8IDAg fHwgaWQgPj0gVUJfTUFYX0hPU1RTKSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGJh ZCBob3N0IElEICVkXG4iLCBpZCk7CgkJcmV0dXJuOwoJfQoJaWYgKHViX2hvc3R2W2lkXSA9PSAw KSB7CgkJcHJpbnRrKEtFUk5fRVJSIERSVl9OQU1FICI6IGZyZWVpbmcgZnJlZSBob3N0IElEICVk XG4iLCBpZCk7CgkJcmV0dXJuOwoJfQoJdWJfaG9zdHZbaWRdID0gMDsKfQoKLyoKICogRmluYWwg Y2xlYW51cCBhbmQgZGVhbGxvY2F0aW9uLgogKiBUaGlzIG11c3QgYmUgY2FsbGVkIHdpdGggdWJf bG9jayB0YWtlbi4KICovCnN0YXRpYyB2b2lkIHViX2NsZWFudXAoc3RydWN0IHViX2RldiAqc2Mp CnsKCgkvKgoJICogSWYgd2UgemVybyBkaXNrLT5wcml2YXRlX2RhdGEgQkVGT1JFIHB1dF9kaXNr LCB3ZSBoYXZlIHRvIGNoZWNrCgkgKiBmb3IgTlVMTCBhbGwgb3ZlciB0aGUgcGxhY2UgaW4gb3Bl biwgcmVsZWFzZSwgY2hlY2tfbWVkaWEgYW5kCgkgKiByZXZhbGlkYXRlLCBiZWNhdXNlIHRoZSBi bG9jayBsZXZlbCBzZW1hcGhvcmUgaXMgd2VsbCBpbnNpZGUgdGhlCgkgKiBwdXRfZGlzay4gQnV0 IHdlIGNhbm5vdCB6ZXJvIGFmdGVyIHRoZSBjYWxsLCBiZWNhdXNlICpkaXNrIGlzIGdvbmUuCgkg KiBUaGUgc2QuYyBpcyBibGF0YW50bHkgcmFjeSBpbiB0aGlzIGFyZWEuCgkgKi8KCS8qIGRpc2st PnByaXZhdGVfZGF0YSA9IE5VTEw7ICovCglwdXRfZGlzayhzYy0+ZGlzayk7CglzYy0+ZGlzayA9 IE5VTEw7CgoJdWJfaWRfcHV0KHNjLT5pZCk7CglrZnJlZShzYyk7Cn0KCi8qCiAqIFRoZSAiY29t bWFuZCBhbGxvY2F0b3IiLgogKi8Kc3RhdGljIHN0cnVjdCB1Yl9zY3NpX2NtZCAqdWJfZ2V0X2Nt ZChzdHJ1Y3QgdWJfZGV2ICpzYykKewoJc3RydWN0IHViX3Njc2lfY21kICpyZXQ7CgoJaWYgKHNj LT5jbWRhWzBdKQoJCXJldHVybiBOVUxMOwoJcmV0ID0gJnNjLT5jbWR2WzBdOwoJc2MtPmNtZGFb MF0gPSAxOwoJcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQgdWJfcHV0X2NtZChzdHJ1Y3QgdWJf ZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpCnsKCWlmIChjbWQgIT0gJnNjLT5jbWR2 WzBdKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlbGVhc2luZyBhIGZvcmVpZ24gY21k ICVwXG4iLAoJCSAgICBzYy0+bmFtZSwgY21kKTsKCQlyZXR1cm47Cgl9CglpZiAoIXNjLT5jbWRh WzBdKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6IHJlbGVhc2luZyBhIGZyZWUgY21kXG4i LCBzYy0+bmFtZSk7CgkJcmV0dXJuOwoJfQoJc2MtPmNtZGFbMF0gPSAwOwp9CgovKgogKiBUaGUg Y29tbWFuZCBxdWV1ZS4KICovCnN0YXRpYyB2b2lkIHViX2NtZHFfYWRkKHN0cnVjdCB1Yl9kZXYg KnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCkKewoJc3RydWN0IHViX3Njc2lfY21kX3F1ZXVl ICp0ID0gJnNjLT5jbWRfcXVldWU7CgoJaWYgKHQtPnFsZW4rKyA9PSAwKSB7CgkJdC0+aGVhZCA9 IGNtZDsKCQl0LT50YWlsID0gY21kOwoJfSBlbHNlIHsKCQl0LT50YWlsLT5uZXh0ID0gY21kOwoJ CXQtPnRhaWwgPSBjbWQ7Cgl9CgoJaWYgKHQtPnFsZW4gPiB0LT5xbWF4KQoJCXQtPnFtYXggPSB0 LT5xbGVuOwp9CgpzdGF0aWMgdm9pZCB1Yl9jbWRxX2luc2VydChzdHJ1Y3QgdWJfZGV2ICpzYywg c3RydWN0IHViX3Njc2lfY21kICpjbWQpCnsKCXN0cnVjdCB1Yl9zY3NpX2NtZF9xdWV1ZSAqdCA9 ICZzYy0+Y21kX3F1ZXVlOwoKCWlmICh0LT5xbGVuKysgPT0gMCkgewoJCXQtPmhlYWQgPSBjbWQ7 CgkJdC0+dGFpbCA9IGNtZDsKCX0gZWxzZSB7CgkJY21kLT5uZXh0ID0gdC0+aGVhZDsKCQl0LT5o ZWFkID0gY21kOwoJfQoKCWlmICh0LT5xbGVuID4gdC0+cW1heCkKCQl0LT5xbWF4ID0gdC0+cWxl bjsKfQoKc3RhdGljIHN0cnVjdCB1Yl9zY3NpX2NtZCAqdWJfY21kcV9wb3Aoc3RydWN0IHViX2Rl diAqc2MpCnsKCXN0cnVjdCB1Yl9zY3NpX2NtZF9xdWV1ZSAqdCA9ICZzYy0+Y21kX3F1ZXVlOwoJ c3RydWN0IHViX3Njc2lfY21kICpjbWQ7CgoJaWYgKHQtPnFsZW4gPT0gMCkKCQlyZXR1cm4gTlVM TDsKCWlmICgtLXQtPnFsZW4gPT0gMCkKCQl0LT50YWlsID0gTlVMTDsKCWNtZCA9IHQtPmhlYWQ7 Cgl0LT5oZWFkID0gY21kLT5uZXh0OwoJY21kLT5uZXh0ID0gTlVMTDsKCXJldHVybiBjbWQ7Cn0K CiNkZWZpbmUgdWJfY21kcV9wZWVrKHNjKSAgKChzYyktPmNtZF9xdWV1ZS5oZWFkKQoKLyoKICog VGhlIHJlcXVlc3QgZnVuY3Rpb24gaXMgb3VyIG1haW4gZW50cnkgcG9pbnQKICovCgpzdGF0aWMg aW5saW5lIGludCB1Yl9iZF9ycV9mbl8xKHJlcXVlc3RfcXVldWVfdCAqcSkKewojaWYgMAoJaW50 IHdyaXRpbmcgPSAwLCBwY2lfZGlyLCBpLCBuX2VsZW07Cgl1MzIgdG1wOwoJdW5zaWduZWQgaW50 IG1zZ19zaXplOwojZW5kaWYKCXN0cnVjdCB1Yl9kZXYgKnNjID0gcS0+cXVldWVkYXRhOwoJc3Ry dWN0IHJlcXVlc3QgKnJxOwojaWYgMCAvKiBXZSB1c2UgcnEtPmJ1ZmZlciBmb3Igbm93ICovCglz dHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwoJaW50IG5fZWxlbTsKI2VuZGlmCglzdHJ1Y3QgdWJfc2Nz aV9jbWQgKmNtZDsKCWludCB1Yl9kaXI7Cgl1bnNpZ25lZCBpbnQgYmxvY2ssIG5ibGtzOwoJaW50 IHJjOwoKCWlmICgocnEgPSBlbHZfbmV4dF9yZXF1ZXN0KHEpKSA9PSBOVUxMKQoJCXJldHVybiAx OwoKCWlmIChhdG9taWNfcmVhZCgmc2MtPnBvaXNvbikgfHwgc2MtPmNoYW5nZWQpIHsKCQlibGtk ZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKCQl1Yl9lbmRfcnEocnEsIDApOwoJCXJldHVybiAwOwoJ fQoKCWlmICgoY21kID0gdWJfZ2V0X2NtZChzYykpID09IE5VTEwpIHsKCQlibGtfc3RvcF9xdWV1 ZShxKTsKCQlyZXR1cm4gMTsKCX0KCglibGtkZXZfZGVxdWV1ZV9yZXF1ZXN0KHJxKTsKCglpZiAo cnFfZGF0YV9kaXIocnEpID09IFdSSVRFKQoJCXViX2RpciA9IFVCX0RJUl9XUklURTsKCWVsc2UK CQl1Yl9kaXIgPSBVQl9ESVJfUkVBRDsKCgkvKgoJICogZ2V0IHNjYXR0ZXJsaXN0IGZyb20gYmxv Y2sgbGF5ZXIKCSAqLwojaWYgMCAvKiBXZSB1c2UgcnEtPmJ1ZmZlciBmb3Igbm93ICovCglzZyA9 ICZjbWQtPnNndlswXTsKCW5fZWxlbSA9IGJsa19ycV9tYXBfc2cocSwgcnEsIHNnKTsKCWlmIChu X2VsZW0gPD0gMCkgewoJCXViX3B1dF9jbWQoc2MsIGNtZCk7CgkJdWJfZW5kX3JxKHJxLCAwKTsK CQlibGtfc3RhcnRfcXVldWUocSk7CgkJcmV0dXJuIDA7CQkvKiByZXF1ZXN0IHdpdGggbm8gcy9n IGVudHJpZXM/ICovCgl9CgoJaWYgKG5fZWxlbSAhPSAxKSB7CQkvKiBQYXJhbm9pYSAqLwoJCXBy aW50ayhLRVJOX1dBUk5JTkcgIiVzOiByZXF1ZXN0IHdpdGggJWQgc2VnbWVudHNcbiIsCgkJICAg IHNjLT5uYW1lLCBuX2VsZW0pOwoJCXViX3B1dF9jbWQoc2MsIGNtZCk7CgkJdWJfZW5kX3JxKHJx LCAwKTsKCQlibGtfc3RhcnRfcXVldWUocSk7CgkJcmV0dXJuIDA7Cgl9CiNlbmRpZgoJLyoKCSAq IFhYWCBVbmZvcnR1bmF0ZWx5LCB0aGlzIGNoZWNrIGRvZXMgbm90IHdvcmsuIEl0IGlzIHF1aXRl IHBvc3NpYmxlCgkgKiB0byBnZXQgYm9ndXMgbm9uLW51bGwgcnEtPmJ1ZmZlciBpZiB5b3UgYWxs b3cgc2cgYnkgbWlzdGFrZS4KCSAqLwoJaWYgKHJxLT5idWZmZXIgPT0gTlVMTCkgewoJCS8qCgkJ ICogVGhpcyBtdXN0IG5vdCBoYXBwZW4gaWYgd2Ugc2V0IHRoZSBxdWV1ZSByaWdodC4KCQkgKiBU aGUgYmxvY2sgbGV2ZWwgbXVzdCBjcmVhdGUgYm91bmNlIGJ1ZmZlcnMgZm9yIHVzLgoJCSAqLwoJ CXN0YXRpYyBpbnQgZG9fcHJpbnQgPSAxOwoJCWlmIChkb19wcmludCkgewoJCQlwcmludGsoS0VS Tl9XQVJOSU5HICIlczogdW5tYXBwZWQgcmVxdWVzdFxuIiwgc2MtPm5hbWUpOwoJCQlkb19wcmlu dCA9IDA7CgkJfQoJCXViX3B1dF9jbWQoc2MsIGNtZCk7CgkJdWJfZW5kX3JxKHJxLCAwKTsKCQli bGtfc3RhcnRfcXVldWUocSk7CgkJcmV0dXJuIDA7Cgl9CgoJLyoKCSAqIGJ1aWxkIHRoZSBjb21t YW5kCgkgKgoJICogVGhlIGNhbGwgdG8gYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoKSBndWFyYW50 ZWVzIHRoYXQgcmVxdWVzdAoJICogaXMgYWxpZ25lZCwgYnV0IGl0IGlzIGdpdmVuIGluIHRlcm1z IG9mIDUxMiBieXRlIHVuaXRzLCBhbHdheXMuCgkgKi8KCWJsb2NrID0gcnEtPnNlY3RvciA+PiBz Yy0+Y2FwYWNpdHkuYnNoaWZ0OwoJbmJsa3MgPSBycS0+bnJfc2VjdG9ycyA+PiBzYy0+Y2FwYWNp dHkuYnNoaWZ0OwoKCW1lbXNldChjbWQsIDAsIHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpKTsK CWNtZC0+Y2RiWzBdID0gKHViX2RpciA9PSBVQl9ESVJfUkVBRCk/IFJFQURfMTA6IFdSSVRFXzEw OwoJLyogMTAtYnl0ZSB1c2VzIDQgYnl0ZXMgb2YgTEJBOiAyMTQ3NDgzNjQ4S0IsIDIwOTcxNTJN QiwgMjA0OEdCICovCgljbWQtPmNkYlsyXSA9IGJsb2NrID4+IDI0OwoJY21kLT5jZGJbM10gPSBi bG9jayA+PiAxNjsKCWNtZC0+Y2RiWzRdID0gYmxvY2sgPj4gODsKCWNtZC0+Y2RiWzVdID0gYmxv Y2s7CgljbWQtPmNkYls3XSA9IG5ibGtzID4+IDg7CgljbWQtPmNkYls4XSA9IG5ibGtzOwoJY21k LT5jZGJfbGVuID0gMTA7CgljbWQtPmRpciA9IHViX2RpcjsKCWNtZC0+c3RhdGUgPSBVQl9DTURT VF9JTklUOwoJY21kLT5kYXRhID0gcnEtPmJ1ZmZlcjsKCWNtZC0+bGVuID0gcnEtPm5yX3NlY3Rv cnMgKiA1MTI7CgljbWQtPmRvbmUgPSB1Yl9yd19jbWRfZG9uZTsKCWNtZC0+YmFjayA9IHJxOwoK CWNtZC0+dGFnID0gc2MtPnRhZ2NudCsrOwoJaWYgKChyYyA9IHViX3N1Ym1pdF9zY3NpKHNjLCBj bWQpKSAhPSAwKSB7CgkJdWJfcHV0X2NtZChzYywgY21kKTsKCQl1Yl9lbmRfcnEocnEsIDApOwoJ CWJsa19zdGFydF9xdWV1ZShxKTsKCQlyZXR1cm4gMDsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGlj IHZvaWQgdWJfYmRfcnFfZm4ocmVxdWVzdF9xdWV1ZV90ICpxKQp7CglkbyB7IH0gd2hpbGUgKHVi X2JkX3JxX2ZuXzEocSkgPT0gMCk7Cn0KCnN0YXRpYyB2b2lkIHViX3J3X2NtZF9kb25lKHN0cnVj dCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCkKewoJc3RydWN0IHJlcXVlc3Qg KnJxID0gY21kLT5iYWNrOwoJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBzYy0+ZGlzazsKCXJlcXVl c3RfcXVldWVfdCAqcSA9IGRpc2stPnF1ZXVlOwoJaW50IHVwdG9kYXRlOwoKCWlmIChjbWQtPmVy cm9yID09IDApCgkJdXB0b2RhdGUgPSAxOwoJZWxzZQoJCXVwdG9kYXRlID0gMDsKCgl1Yl9wdXRf Y21kKHNjLCBjbWQpOwoJdWJfZW5kX3JxKHJxLCB1cHRvZGF0ZSk7CglibGtfc3RhcnRfcXVldWUo cSk7Cn0KCnN0YXRpYyB2b2lkIHViX2VuZF9ycShzdHJ1Y3QgcmVxdWVzdCAqcnEsIGludCB1cHRv ZGF0ZSkKewoJaW50IHJjOwoKCXJjID0gZW5kX3RoYXRfcmVxdWVzdF9maXJzdChycSwgdXB0b2Rh dGUsIHJxLT5oYXJkX25yX3NlY3RvcnMpOwoJLy8gYXNzZXJ0KHJjID09IDApOwoJZW5kX3RoYXRf cmVxdWVzdF9sYXN0KHJxKTsKfQoKLyoKICogU3VibWl0IGEgcmVndWxhciBTQ1NJIG9wZXJhdGlv biAobm90IGFuIGF1dG8tc2Vuc2UpLgogKgogKiBUaGUgSXJvbiBMYXcgb2YgR29vZCBTdWJtaXQg Um91dGluZSBpczoKICogWmVybyByZXR1cm4gLSBjYWxsYmFjayBpcyBkb25lLCBOb256ZXJvIHJl dHVybiAtIGNhbGxiYWNrIGlzIG5vdCBkb25lLgogKiBObyBleGNlcHRpb25zLgogKgogKiBIb3N0 IGlzIGFzc3VtZWQgbG9ja2VkLgogKgogKiBYWFggV2Ugb25seSBzdXBwb3J0IEJ1bGsgZm9yIHRo ZSBtb21lbnQuCiAqLwpzdGF0aWMgaW50IHViX3N1Ym1pdF9zY3NpKHN0cnVjdCB1Yl9kZXYgKnNj LCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCkKewoKCWlmIChjbWQtPnN0YXRlICE9IFVCX0NNRFNU X0lOSVQgfHwKCSAgICAoY21kLT5kaXIgIT0gVUJfRElSX05PTkUgJiYgY21kLT5sZW4gPT0gMCkp IHsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgl1Yl9jbWRxX2FkZChzYywgY21kKTsKCS8qCgkgKiBX ZSBjYW4gY2FsbCB1Yl9zY3NpX2Rpc3BhdGNoKHNjKSByaWdodCBhd2F5IGhlcmUsIGJ1dCBpdCdz IGEgbGl0dGxlCgkgKiBzYWZlciB0byBqdW1wIHRvIGEgdGFza2xldCwgaW4gY2FzZSB1cHBlciBs YXllcnMgZG8gc29tZXRoaW5nIHNpbGx5LgoJICovCgl0YXNrbGV0X3NjaGVkdWxlKCZzYy0+dGFz a2xldCk7CglyZXR1cm4gMDsKfQoKLyoKICogU3VibWl0IHRoZSBmaXJzdCBVUkIgZm9yIHRoZSBx dWV1ZWQgY29tbWFuZC4KICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZWFsIHdpdGggcXVldWVp bmcgaW4gYW55IHdheS4KICovCnN0YXRpYyBpbnQgdWJfc2NzaV9jbWRfc3RhcnQoc3RydWN0IHVi X2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kKQp7CglzdHJ1Y3QgYnVsa19jYl93cmFw ICpiY2I7CglpbnQgcmM7CgoJYmNiID0gJnNjLT53b3JrX2JjYjsKCgkvKiBzZXQgdXAgdGhlIGNv bW1hbmQgd3JhcHBlciAqLwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NC X1NJR04pOwoJYmNiLT5UYWcgPSBjbWQtPnRhZzsJCS8qIEVuZGlhbm5lc3MgaXMgbm90IGltcG9y dGFudCAqLwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGggPSBjcHVfdG9fbGUzMihjbWQtPmxlbik7 CgliY2ItPkZsYWdzID0gKGNtZC0+ZGlyID09IFVCX0RJUl9SRUFEKSA/IDB4ODAgOiAwOwoJYmNi LT5MdW4gPSAwOwkJCS8qIE5vIG11bHRpLUxVTiB5ZXQgKi8KCWJjYi0+TGVuZ3RoID0gY21kLT5j ZGJfbGVuOwoKCS8qIGNvcHkgdGhlIGNvbW1hbmQgcGF5bG9hZCAqLwoJbWVtY3B5KGJjYi0+Q0RC LCBjbWQtPmNkYiwgVUJfTUFYX0NEQl9TSVpFKTsKCglVQl9JTklUX0NPTVBMRVRJT04oc2MtPndv cmtfZG9uZSk7CgoJc2MtPmxhc3RfcGlwZSA9IHNjLT5zZW5kX2J1bGtfcGlwZTsKCXVzYl9maWxs X2J1bGtfdXJiKCZzYy0+d29ya191cmIsIHNjLT5kZXYsIHNjLT5zZW5kX2J1bGtfcGlwZSwKCSAg ICBiY2IsIFVTX0JVTEtfQ0JfV1JBUF9MRU4sIHViX3VyYl9jb21wbGV0ZSwgc2MpOwoJc2MtPndv cmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKCgkvKiBGaWxsIHdoYXQg d2Ugc2hvdWxkbid0IGJlIGZpbGxpbmcsIGJlY2F1c2UgdXNiLXN0b3JhZ2UgZGlkIHNvLiAqLwoJ c2MtPndvcmtfdXJiLmFjdHVhbF9sZW5ndGggPSAwOwoJc2MtPndvcmtfdXJiLmVycm9yX2NvdW50 ID0gMDsKCXNjLT53b3JrX3VyYi5zdGF0dXMgPSAwOwoKCWlmICgocmMgPSB1c2Jfc3VibWl0X3Vy Yigmc2MtPndvcmtfdXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewoJCS8qIFhYWCBDbGVhciBzdGFs bHMgKi8KCQlwcmludGsoInViOiBjbWQgIyVkIHN0YXJ0IGZhaWxlZCAoJWQpXG4iLCBjbWQtPnRh ZywgcmMpOyAvKiBQMyAqLwoJCXViX2NvbXBsZXRlKCZzYy0+d29ya19kb25lKTsKCQlyZXR1cm4g cmM7Cgl9CgoJc2MtPndvcmtfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBVQl9VUkJfVElNRU9V VDsKCWFkZF90aW1lcigmc2MtPndvcmtfdGltZXIpOwoKCWNtZC0+c3RhdGUgPSBVQl9DTURTVF9D TUQ7Cgl1Yl9jbWR0cl9zdGF0ZShzYywgY21kKTsKCXJldHVybiAwOwp9CgovKgogKiBUaW1lb3V0 IGhhbmRsZXIuCiAqLwpzdGF0aWMgdm9pZCB1Yl91cmJfdGltZW91dCh1bnNpZ25lZCBsb25nIGFy ZykKewoJc3RydWN0IHViX2RldiAqc2MgPSAoc3RydWN0IHViX2RldiAqKSBhcmc7Cgl1bnNpZ25l ZCBsb25nIGZsYWdzOwoKCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG9jaywgZmxhZ3MpOwoJdXNi X3VubGlua191cmIoJnNjLT53b3JrX3VyYik7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+ bG9jaywgZmxhZ3MpOwp9CgovKgogKiBDb21wbGV0aW9uIHJvdXRpbmUgZm9yIHRoZSB3b3JrIFVS Qi4KICoKICogVGhpcyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGZyb20gdXNiX3N1Ym1pdF91cmIg KHdoaWxlIHdlIGhhdmUKICogdGhlIHNjLT5sb2NrIHRha2VuKSBhbmQgZnJvbSBhbiBpbnRlcnJ1 cHQgKHdoaWxlIHdlIGRvIE5PVCBoYXZlCiAqIHRoZSBzYy0+bG9jayB0YWtlbikuIFRoZXJlZm9y ZSwgYm91bmNlIHRoaXMgb2ZmIHRvIGEgdGFza2xldC4KICovCnN0YXRpYyB2b2lkIHViX3VyYl9j b21wbGV0ZShzdHJ1Y3QgdXJiICp1cmIsIHN0cnVjdCBwdF9yZWdzICpwdCkKewoJc3RydWN0IHVi X2RldiAqc2MgPSB1cmItPmNvbnRleHQ7CgoJdWJfY29tcGxldGUoJnNjLT53b3JrX2RvbmUpOwoJ dGFza2xldF9zY2hlZHVsZSgmc2MtPnRhc2tsZXQpOwp9CgpzdGF0aWMgdm9pZCB1Yl9zY3NpX2Fj dGlvbih1bnNpZ25lZCBsb25nIF9kZXYpCnsKCXN0cnVjdCB1Yl9kZXYgKnNjID0gKHN0cnVjdCB1 Yl9kZXYgKikgX2RldjsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJc3Bpbl9sb2NrX2lycXNhdmUo JnNjLT5sb2NrLCBmbGFncyk7Cgl1Yl9zY3NpX2Rpc3BhdGNoKHNjKTsKCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnNjLT5sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyB2b2lkIHViX3Njc2lfZGlzcGF0 Y2goc3RydWN0IHViX2RldiAqc2MpCnsKCXN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kOwoJaW50IHJj OwoKCXdoaWxlICgoY21kID0gdWJfY21kcV9wZWVrKHNjKSkgIT0gTlVMTCkgewoJCWlmIChjbWQt PnN0YXRlID09IFVCX0NNRFNUX0RPTkUpIHsKCQkJdWJfY21kcV9wb3Aoc2MpOwoJCQkoKmNtZC0+ ZG9uZSkoc2MsIGNtZCk7CgkJfSBlbHNlIGlmIChjbWQtPnN0YXRlID09IFVCX0NNRFNUX0lOSVQp IHsKCQkJdWJfY21kdHJfbmV3KHNjLCBjbWQpOwoJCQlpZiAoKHJjID0gdWJfc2NzaV9jbWRfc3Rh cnQoc2MsIGNtZCkpID09IDApCgkJCQlicmVhazsKCQkJY21kLT5lcnJvciA9IHJjOwoJCQljbWQt PnN0YXRlID0gVUJfQ01EU1RfRE9ORTsKCQkJdWJfY21kdHJfc3RhdGUoc2MsIGNtZCk7CgkJfSBl bHNlIHsKCQkJaWYgKCF1Yl9pc19jb21wbGV0ZWQoJnNjLT53b3JrX2RvbmUpKQoJCQkJYnJlYWs7 CgkJCXViX3Njc2lfdXJiX2NvbXBsKHNjLCBjbWQpOwoJCX0KCX0KfQoKc3RhdGljIHZvaWQgdWJf c2NzaV91cmJfY29tcGwoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAqY21k KQp7CglzdHJ1Y3QgdXJiICp1cmIgPSAmc2MtPndvcmtfdXJiOwoJc3RydWN0IGJ1bGtfY3Nfd3Jh cCAqYmNzOwoJaW50IHBpcGU7CglpbnQgcmM7CgovKiBQMyAqLyAvKiogcHJpbnRrKCJ1YjogdXJi IHN0YXR1cyAlZCBwaXBlIDB4JTA4eCBsZW4gJWQgYWN0ICVkXG4iLAogdXJiLT5zdGF0dXMsIHVy Yi0+cGlwZSwgdXJiLT50cmFuc2Zlcl9idWZmZXJfbGVuZ3RoLCB1cmItPmFjdHVhbF9sZW5ndGgp OyAqKi8KCglpZiAoYXRvbWljX3JlYWQoJnNjLT5wb2lzb24pKSB7CgkJLyogQSBsaXR0bGUgdG9v IHNpbXBsaXN0aWMsIEkgZmVlbC4uLiAqLwoJCWdvdG8gQmFkX0VuZDsKCX0KCglpZiAoY21kLT5z dGF0ZSA9PSBVQl9DTURTVF9DTEVBUikgewoJCWlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUpIHsK CQkJLyoKCQkJICogU1RBTEwgd2hpbGUgY2xlYXJuaW5nIFNUQUxMLgoJCQkgKiBBIFNUQUxMIGlz IGlsbGVnYWwgb24gYSBjb250cm9sIHBpcGUhCgkJCSAqIFhYWCBNaWdodCB0cnkgdG8gcmVzZXQg dGhlIGRldmljZSBoZXJlIGFuZCByZXRyeS4KCQkJICovCgkJCXByaW50ayhLRVJOX05PVElDRSAi JXM6ICIKCQkJICAgICJzdGFsbCBvbiBjb250cm9sIHBpcGUgZm9yIGRldmljZSAldVxuIiwKCQkJ ICAgIHNjLT5uYW1lLCBzYy0+ZGV2LT5kZXZudW0pOwoJCQlnb3RvIEJhZF9FbmQ7CgkJfQoKCQkv KgoJCSAqIFdlIGlnbm9yZSB0aGUgcmVzdWx0IGZvciB0aGUgaGFsdCBjbGVhci4KCQkgKi8KCgkJ LyogcmVzZXQgdGhlIGVuZHBvaW50IHRvZ2dsZSAqLwoJCXVzYl9zZXR0b2dnbGUoc2MtPmRldiwg dXNiX3BpcGVlbmRwb2ludChzYy0+bGFzdF9waXBlKSwKCQkJdXNiX3BpcGVvdXQoc2MtPmxhc3Rf cGlwZSksIDApOwoKCQl1Yl9zdGF0ZV9zZW5zZShzYywgY21kKTsKCgl9IGVsc2UgaWYgKGNtZC0+ c3RhdGUgPT0gVUJfQ01EU1RfQ0xSMlNUUykgewoJCWlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUp IHsKCQkJLyoKCQkJICogU1RBTEwgd2hpbGUgY2xlYXJuaW5nIFNUQUxMLgoJCQkgKiBBIFNUQUxM IGlzIGlsbGVnYWwgb24gYSBjb250cm9sIHBpcGUhCgkJCSAqIFhYWCBNaWdodCB0cnkgdG8gcmVz ZXQgdGhlIGRldmljZSBoZXJlIGFuZCByZXRyeS4KCQkJICovCgkJCXByaW50ayhLRVJOX05PVElD RSAiJXM6ICIKCQkJICAgICJzdGFsbCBvbiBjb250cm9sIHBpcGUgZm9yIGRldmljZSAldVxuIiwK CQkJICAgIHNjLT5uYW1lLCBzYy0+ZGV2LT5kZXZudW0pOwoJCQlnb3RvIEJhZF9FbmQ7CgkJfQoK CQkvKgoJCSAqIFdlIGlnbm9yZSB0aGUgcmVzdWx0IGZvciB0aGUgaGFsdCBjbGVhci4KCQkgKi8K CgkJLyogcmVzZXQgdGhlIGVuZHBvaW50IHRvZ2dsZSAqLwoJCXVzYl9zZXR0b2dnbGUoc2MtPmRl diwgdXNiX3BpcGVlbmRwb2ludChzYy0+bGFzdF9waXBlKSwKCQkJdXNiX3BpcGVvdXQoc2MtPmxh c3RfcGlwZSksIDApOwoKCQl1Yl9zdGF0ZV9zdGF0KHNjLCBjbWQpOwoKCX0gZWxzZSBpZiAoY21k LT5zdGF0ZSA9PSBVQl9DTURTVF9DTUQpIHsKCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKSB7 CgkJCXJjID0gdWJfc3VibWl0X2NsZWFyX3N0YWxsKHNjLCBjbWQsIHNjLT5sYXN0X3BpcGUpOwoJ CQlpZiAocmMgIT0gMCkgewoJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogIgoJCQkJICAgICJ1 bmFibGUgdG8gc3VibWl0IGNsZWFyIGZvciBkZXZpY2UgJXUgKCVkKVxuIiwKCQkJCSAgICBzYy0+ bmFtZSwgc2MtPmRldi0+ZGV2bnVtLCByYyk7CgkJCQkvKgoJCQkJICogVGhpcyBpcyB0eXBpY2Fs bHkgRU5PTUVNIG9yIHNvbWUgb3RoZXIgc3VjaCBzaGl0LgoJCQkJICogUmV0cnlpbmcgaXMgcG9p bnRsZXNzLiBKdXN0IGRvIEJhZCBFbmQgb24gaXQuLi4KCQkJCSAqLwoJCQkJZ290byBCYWRfRW5k OwoJCQl9CgkJCWNtZC0+c3RhdGUgPSBVQl9DTURTVF9DTEVBUjsKCQkJdWJfY21kdHJfc3RhdGUo c2MsIGNtZCk7CgkJCXJldHVybjsKCQl9CgkJaWYgKHVyYi0+c3RhdHVzICE9IDApCgkJCWdvdG8g QmFkX0VuZDsKCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoICE9IFVTX0JVTEtfQ0JfV1JBUF9MRU4p IHsKCQkJLyogWFhYIE11c3QgZG8gcmVzZXQgaGVyZSB0byB1bmNvbmZ1c2UgdGhlIGRldmljZSAq LwoJCQlnb3RvIEJhZF9FbmQ7CgkJfQoKCQlpZiAoY21kLT5kaXIgPT0gVUJfRElSX05PTkUpIHsK CQkJdWJfc3RhdGVfc3RhdChzYywgY21kKTsKCQkJcmV0dXJuOwoJCX0KCgkJVUJfSU5JVF9DT01Q TEVUSU9OKHNjLT53b3JrX2RvbmUpOwoKCQlpZiAoY21kLT5kaXIgPT0gVUJfRElSX1JFQUQpCgkJ CXBpcGUgPSBzYy0+cmVjdl9idWxrX3BpcGU7CgkJZWxzZQoJCQlwaXBlID0gc2MtPnNlbmRfYnVs a19waXBlOwoJCXNjLT5sYXN0X3BpcGUgPSBwaXBlOwoJCXVzYl9maWxsX2J1bGtfdXJiKCZzYy0+ d29ya191cmIsIHNjLT5kZXYsIHBpcGUsCgkJICAgIGNtZC0+ZGF0YSwgY21kLT5sZW4sIHViX3Vy Yl9jb21wbGV0ZSwgc2MpOwoJCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IFVSQl9BU1lO Q19VTkxJTks7CgkJc2MtPndvcmtfdXJiLmFjdHVhbF9sZW5ndGggPSAwOwoJCXNjLT53b3JrX3Vy Yi5lcnJvcl9jb3VudCA9IDA7CgkJc2MtPndvcmtfdXJiLnN0YXR1cyA9IDA7CgoJCWlmICgocmMg PSB1c2Jfc3VibWl0X3VyYigmc2MtPndvcmtfdXJiLCBHRlBfQVRPTUlDKSkgIT0gMCkgewoJCQkv KiBYWFggQ2xlYXIgc3RhbGxzICovCgkJCXByaW50aygidWI6IGRhdGEgIyVkIHN1Ym1pdCBmYWls ZWQgKCVkKVxuIiwgY21kLT50YWcsIHJjKTsgLyogUDMgKi8KCQkJdWJfY29tcGxldGUoJnNjLT53 b3JrX2RvbmUpOwoJCQl1Yl9zdGF0ZV9kb25lKHNjLCBjbWQsIHJjKTsKCQkJcmV0dXJuOwoJCX0K CgkJc2MtPndvcmtfdGltZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBVQl9VUkJfVElNRU9VVDsKCQlh ZGRfdGltZXIoJnNjLT53b3JrX3RpbWVyKTsKCgkJY21kLT5zdGF0ZSA9IFVCX0NNRFNUX0RBVEE7 CgkJdWJfY21kdHJfc3RhdGUoc2MsIGNtZCk7CgoJfSBlbHNlIGlmIChjbWQtPnN0YXRlID09IFVC X0NNRFNUX0RBVEEpIHsKCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKSB7CgkJCXJjID0gdWJf c3VibWl0X2NsZWFyX3N0YWxsKHNjLCBjbWQsIHNjLT5sYXN0X3BpcGUpOwoJCQlpZiAocmMgIT0g MCkgewoJCQkJcHJpbnRrKEtFUk5fTk9USUNFICIlczogIgoJCQkJICAgICJ1bmFibGUgdG8gc3Vi bWl0IGNsZWFyIGZvciBkZXZpY2UgJXUgKCVkKVxuIiwKCQkJCSAgICBzYy0+bmFtZSwgc2MtPmRl di0+ZGV2bnVtLCByYyk7CgkJCQkvKgoJCQkJICogVGhpcyBpcyB0eXBpY2FsbHkgRU5PTUVNIG9y IHNvbWUgb3RoZXIgc3VjaCBzaGl0LgoJCQkJICogUmV0cnlpbmcgaXMgcG9pbnRsZXNzLiBKdXN0 IGRvIEJhZCBFbmQgb24gaXQuLi4KCQkJCSAqLwoJCQkJZ290byBCYWRfRW5kOwoJCQl9CgkJCWNt ZC0+c3RhdGUgPSBVQl9DTURTVF9DTFIyU1RTOwoJCQl1Yl9jbWR0cl9zdGF0ZShzYywgY21kKTsK CQkJcmV0dXJuOwoJCX0KCQlpZiAodXJiLT5zdGF0dXMgPT0gLUVPVkVSRkxPVykgewoJCQkvKgoJ CQkgKiBBIGJhYmJsZT8gRmFpbHVyZSwgYnV0IHdlIG11c3QgdHJhbnNmZXIgQ1NXIG5vdy4KCQkJ ICovCgkJCWNtZC0+ZXJyb3IgPSAtRU9WRVJGTE9XOwkvKiBBIGNoZWFwIHRyaWNrLi4uICovCgkJ fSBlbHNlIHsKCQkJaWYgKHVyYi0+c3RhdHVzICE9IDApCgkJCQlnb3RvIEJhZF9FbmQ7CgkJfQoK CQljbWQtPmFjdF9sZW4gPSB1cmItPmFjdHVhbF9sZW5ndGg7CgkJdWJfY21kdHJfYWN0X2xlbihz YywgY21kKTsKCgkJdWJfc3RhdGVfc3RhdChzYywgY21kKTsKCgl9IGVsc2UgaWYgKGNtZC0+c3Rh dGUgPT0gVUJfQ01EU1RfU1RBVCkgewoJCWlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUpIHsKCQkJ cmMgPSB1Yl9zdWJtaXRfY2xlYXJfc3RhbGwoc2MsIGNtZCwgc2MtPmxhc3RfcGlwZSk7CgkJCWlm IChyYyAhPSAwKSB7CgkJCQlwcmludGsoS0VSTl9OT1RJQ0UgIiVzOiAiCgkJCQkgICAgInVuYWJs ZSB0byBzdWJtaXQgY2xlYXIgZm9yIGRldmljZSAldSAoJWQpXG4iLAoJCQkJICAgIHNjLT5uYW1l LCBzYy0+ZGV2LT5kZXZudW0sIHJjKTsKCQkJCS8qCgkJCQkgKiBUaGlzIGlzIHR5cGljYWxseSBF Tk9NRU0gb3Igc29tZSBvdGhlciBzdWNoIHNoaXQuCgkJCQkgKiBSZXRyeWluZyBpcyBwb2ludGxl c3MuIEp1c3QgZG8gQmFkIEVuZCBvbiBpdC4uLgoJCQkJICovCgkJCQlnb3RvIEJhZF9FbmQ7CgkJ CX0KCQkJY21kLT5zdGF0ZSA9IFVCX0NNRFNUX0NMRUFSOwoJCQl1Yl9jbWR0cl9zdGF0ZShzYywg Y21kKTsKCQkJcmV0dXJuOwoJCX0KCQlpZiAodXJiLT5zdGF0dXMgIT0gMCkKCQkJZ290byBCYWRf RW5kOwoKCQlpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApIHsKCQkJLyoKCQkJICogU29tZSBi cm9rZW4gZGV2aWNlcyBhZGQgdW5uZWNlc3NhcnkgemVyby1sZW5ndGgKCQkJICogcGFja2V0cyB0 byB0aGUgZW5kIG9mIHRoZWlyIGRhdGEgdHJhbnNmZXJzLgoJCQkgKiBTdWNoIHBhY2tldHMgc2hv dyB1cCBhcyAwLWxlbmd0aCBDU1dzLiBJZiB3ZQoJCQkgKiBlbmNvdW50ZXIgc3VjaCBhIHRoaW5n LCB0cnkgdG8gcmVhZCB0aGUgQ1NXIGFnYWluLgoJCQkgKi8KCQkJaWYgKCsrY21kLT5zdGF0X2Nv dW50ID49IDQpIHsKCQkJCXByaW50ayhLRVJOX05PVElDRSAiJXM6ICIKCQkJCSAgICAidW5hYmxl IHRvIGdldCBDU1cgb24gZGV2aWNlICV1XG4iLAoJCQkJICAgIHNjLT5uYW1lLCBzYy0+ZGV2LT5k ZXZudW0pOwoJCQkJZ290byBCYWRfRW5kOwoJCQl9CgoJCQkvKgoJCQkgKiB1Yl9zdGF0ZV9zdGF0 IG9ubHkgbm90IGRyb3BwaW5nIHRoZSBjb3VudC4uLgoJCQkgKi8KCQkJVUJfSU5JVF9DT01QTEVU SU9OKHNjLT53b3JrX2RvbmUpOwoKCQkJc2MtPmxhc3RfcGlwZSA9IHNjLT5yZWN2X2J1bGtfcGlw ZTsKCQkJdXNiX2ZpbGxfYnVsa191cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwKCQkJICAgIHNj LT5yZWN2X2J1bGtfcGlwZSwgJnNjLT53b3JrX2JjcywKCQkJICAgIFVTX0JVTEtfQ1NfV1JBUF9M RU4sIHViX3VyYl9jb21wbGV0ZSwgc2MpOwoJCQlzYy0+d29ya191cmIudHJhbnNmZXJfZmxhZ3Mg PSBVUkJfQVNZTkNfVU5MSU5LOwoJCQlzYy0+d29ya191cmIuYWN0dWFsX2xlbmd0aCA9IDA7CgkJ CXNjLT53b3JrX3VyYi5lcnJvcl9jb3VudCA9IDA7CgkJCXNjLT53b3JrX3VyYi5zdGF0dXMgPSAw OwoKCQkJcmMgPSB1c2Jfc3VibWl0X3VyYigmc2MtPndvcmtfdXJiLCBHRlBfQVRPTUlDKTsKCQkJ aWYgKHJjICE9IDApIHsKCQkJCS8qIFhYWCBDbGVhciBzdGFsbHMgKi8KCQkJCXByaW50aygiJXM6 IENTVyAjJWQgc3VibWl0IGZhaWxlZCAoJWQpXG4iLAoJCQkJICAgc2MtPm5hbWUsIGNtZC0+dGFn LCByYyk7IC8qIFAzICovCgkJCQl1Yl9jb21wbGV0ZSgmc2MtPndvcmtfZG9uZSk7CgkJCQl1Yl9z dGF0ZV9kb25lKHNjLCBjbWQsIHJjKTsKCQkJCXJldHVybjsKCQkJfQoKCQkJc2MtPndvcmtfdGlt ZXIuZXhwaXJlcyA9IGppZmZpZXMgKyBVQl9VUkJfVElNRU9VVDsKCQkJYWRkX3RpbWVyKCZzYy0+ d29ya190aW1lcik7CgkJCXJldHVybjsKCQl9CgoJCS8qCgkJICogQ2hlY2sgdGhlIHJldHVybmVk IEJ1bGsgcHJvdG9jb2wgc3RhdHVzLgoJCSAqLwoKCQliY3MgPSAmc2MtPndvcmtfYmNzOwoJCXJj ID0gbGUzMl90b19jcHUoYmNzLT5SZXNpZHVlKTsKCQlpZiAocmMgIT0gY21kLT5sZW4gLSBjbWQt PmFjdF9sZW4pIHsKCQkJLyoKCQkJICogSXQgaXMgYWxsIHJpZ2h0IHRvIHRyYW5zZmVyIGxlc3Ms IHRoZSBjYWxsZXIgaGFzCgkJCSAqIHRvIGNoZWNrLiBCdXQgaXQncyBub3QgYWxsIHJpZ2h0IGlm IHRoZSBkZXZpY2UKCQkJICogY291bnRzIGRpc2FncmVlIHdpdGggb3VyIGNvdW50cy4KCQkJICov CgkJCS8qIFAzICovIHByaW50aygiJXM6IHJlc2lkICVkIGxlbiAlZCBhY3QgJWRcbiIsCgkJCSAg ICBzYy0+bmFtZSwgcmMsIGNtZC0+bGVuLCBjbWQtPmFjdF9sZW4pOwoJCQlnb3RvIEJhZF9FbmQ7 CgkJfQoKCQlpZiAoYmNzLT5TaWduYXR1cmUgIT0gY3B1X3RvX2xlMzIoVVNfQlVMS19DU19TSUdO KSAmJgoJCSAgICBiY3MtPlNpZ25hdHVyZSAhPSBjcHVfdG9fbGUzMihVU19CVUxLX0NTX09MWU1Q VVNfU0lHTikpIHsKCQkJLyogWFhYIFJhdGUtbGltaXQsIGV2ZW4gZm9yIFAzIHRhZ2dlZCAqLwoJ CQkvKiBQMyAqLyBwcmludGsoInViOiBzaWduYXR1cmUgMHgleFxuIiwgYmNzLT5TaWduYXR1cmUp OwoJCQkvKiBXaW5kb3dzIGlnbm9yZXMgc2lnbmF0dXJlcywgc28gZG8gd2UuICovCgkJfQoKCQlp ZiAoYmNzLT5UYWcgIT0gY21kLT50YWcpIHsKCQkJLyogUDMgKi8gcHJpbnRrKCIlczogdGFnIG9y aWcgMHgleCByZXBseSAweCV4XG4iLAoJCQkgICAgc2MtPm5hbWUsIGNtZC0+dGFnLCBiY3MtPlRh Zyk7CgkJCWdvdG8gQmFkX0VuZDsKCQl9CgoJCXN3aXRjaCAoYmNzLT5TdGF0dXMpIHsKCQljYXNl IFVTX0JVTEtfU1RBVF9PSzoKCQkJYnJlYWs7CgkJY2FzZSBVU19CVUxLX1NUQVRfRkFJTDoKCQkJ dWJfc3RhdGVfc2Vuc2Uoc2MsIGNtZCk7CgkJCXJldHVybjsKCQljYXNlIFVTX0JVTEtfU1RBVF9Q SEFTRToKCQkJLyogWFhYIFdlIG11c3QgcmVzZXQgdGhlIHRyYW5zcG9ydCBoZXJlICovCgkJCS8q IFAzICovIHByaW50aygiJXM6IHN0YXR1cyBQSEFTRVxuIiwgc2MtPm5hbWUpOwoJCQlnb3RvIEJh ZF9FbmQ7CgkJZGVmYXVsdDoKCQkJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IHVua25vd24gQ1NXIHN0 YXR1cyAweCV4XG4iLAoJCQkgICAgc2MtPm5hbWUsIGJjcy0+U3RhdHVzKTsKCQkJZ290byBCYWRf RW5kOwoJCX0KCgkJLyogTm90IHplcm9pbmcgZXJyb3IgdG8gcHJlc2VydmUgYSBiYWJibGUgaW5k aWNhdG9yICovCgkJY21kLT5zdGF0ZSA9IFVCX0NNRFNUX0RPTkU7CgkJdWJfY21kdHJfc3RhdGUo c2MsIGNtZCk7CgkJdWJfY21kcV9wb3Aoc2MpOwoJCSgqY21kLT5kb25lKShzYywgY21kKTsKCgl9 IGVsc2UgaWYgKGNtZC0+c3RhdGUgPT0gVUJfQ01EU1RfU0VOU0UpIHsKCQl1Yl9zdGF0ZV9kb25l KHNjLCBjbWQsIC1FSU8pOwoKCX0gZWxzZSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6ICIK CQkgICAgIndyb25nIGNvbW1hbmQgc3RhdGUgJWQgb24gZGV2aWNlICV1XG4iLAoJCSAgICBzYy0+ bmFtZSwgY21kLT5zdGF0ZSwgc2MtPmRldi0+ZGV2bnVtKTsKCQlnb3RvIEJhZF9FbmQ7Cgl9Cgly ZXR1cm47CgpCYWRfRW5kOiAvKiBMaXR0bGUgRXhjZWwgaXMgZGVhZCAqLwoJdWJfc3RhdGVfZG9u ZShzYywgY21kLCAtRUlPKTsKfQoKLyoKICogRmFjdG9yaXphdGlvbiBoZWxwZXIgZm9yIHRoZSBj b21tYW5kIHN0YXRlIG1hY2hpbmU6CiAqIEZpbmlzaCB0aGUgY29tbWFuZC4KICovCnN0YXRpYyB2 b2lkIHViX3N0YXRlX2RvbmUoc3RydWN0IHViX2RldiAqc2MsIHN0cnVjdCB1Yl9zY3NpX2NtZCAq Y21kLCBpbnQgcmMpCnsKCgljbWQtPmVycm9yID0gcmM7CgljbWQtPnN0YXRlID0gVUJfQ01EU1Rf RE9ORTsKCXViX2NtZHRyX3N0YXRlKHNjLCBjbWQpOwoJdWJfY21kcV9wb3Aoc2MpOwoJKCpjbWQt PmRvbmUpKHNjLCBjbWQpOwp9CgovKgogKiBGYWN0b3JpemF0aW9uIGhlbHBlciBmb3IgdGhlIGNv bW1hbmQgc3RhdGUgbWFjaGluZToKICogU3VibWl0IGEgQ1NXIHJlYWQgYW5kIGdvIHRvIFNUQVQg c3RhdGUuCiAqLwpzdGF0aWMgdm9pZCB1Yl9zdGF0ZV9zdGF0KHN0cnVjdCB1Yl9kZXYgKnNjLCBz dHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCkKewoJaW50IHJjOwoKCVVCX0lOSVRfQ09NUExFVElPTihz Yy0+d29ya19kb25lKTsKCglzYy0+bGFzdF9waXBlID0gc2MtPnJlY3ZfYnVsa19waXBlOwoJdXNi X2ZpbGxfYnVsa191cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgc2MtPnJlY3ZfYnVsa19waXBl LAoJICAgICZzYy0+d29ya19iY3MsIFVTX0JVTEtfQ1NfV1JBUF9MRU4sIHViX3VyYl9jb21wbGV0 ZSwgc2MpOwoJc2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsK CXNjLT53b3JrX3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKCXNjLT53b3JrX3VyYi5lcnJvcl9jb3Vu dCA9IDA7CglzYy0+d29ya191cmIuc3RhdHVzID0gMDsKCglpZiAoKHJjID0gdXNiX3N1Ym1pdF91 cmIoJnNjLT53b3JrX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKCQkvKiBYWFggQ2xlYXIgc3Rh bGxzICovCgkJcHJpbnRrKCJ1YjogQ1NXICMlZCBzdWJtaXQgZmFpbGVkICglZClcbiIsIGNtZC0+ dGFnLCByYyk7IC8qIFAzICovCgkJdWJfY29tcGxldGUoJnNjLT53b3JrX2RvbmUpOwoJCXViX3N0 YXRlX2RvbmUoc2MsIGNtZCwgcmMpOwoJCXJldHVybjsKCX0KCglzYy0+d29ya190aW1lci5leHBp cmVzID0gamlmZmllcyArIFVCX1VSQl9USU1FT1VUOwoJYWRkX3RpbWVyKCZzYy0+d29ya190aW1l cik7CgoJY21kLT5zdGF0X2NvdW50ID0gMDsKCWNtZC0+c3RhdGUgPSBVQl9DTURTVF9TVEFUOwoJ dWJfY21kdHJfc3RhdGUoc2MsIGNtZCk7Cn0KCi8qCiAqIEZhY3Rvcml6YXRpb24gaGVscGVyIGZv ciB0aGUgY29tbWFuZCBzdGF0ZSBtYWNoaW5lOgogKiBTdWJtaXQgYSBSRVFVRVNUIFNFTlNFIGFu ZCBnbyB0byBTRU5TRSBzdGF0ZS4KICovCnN0YXRpYyB2b2lkIHViX3N0YXRlX3NlbnNlKHN0cnVj dCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCkKewoJc3RydWN0IHViX3Njc2lf Y21kICpzY21kOwoJaW50IHJjOwoKCWlmIChjbWQtPmNkYlswXSA9PSBSRVFVRVNUX1NFTlNFKSB7 CgkJcmMgPSAtRVBJUEU7CgkJZ290byBlcnJvcjsKCX0KCgkvKgoJICogYGBJZiB0aGUgYWxsb2Nh dGlvbiBsZW5ndGggaXMgZWlnaHRlZW4gb3IgZ3JlYXRlciwgYW5kIGEgZGV2aWNlCgkgKiBzZXJ2 ZXIgcmV0dXJucyBsZXNzIHRoYW4gZWl0aHRlZW4gYnl0ZXMgb2YgZGF0YSwgdGhlIGFwcGxpY2F0 aW9uCgkgKiBjbGllbnQgc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBieXRlcyBub3QgdHJhbnNmZXJy ZWQgd291bGQgaGF2ZSBiZWVuCgkgKiB6ZXJvZXMgaGFkIHRoZSBkZXZpY2Ugc2VydmVyIHJldHVy bmVkIHRob3NlIGJ5dGVzLicnCgkgKi8KCW1lbXNldCgmc2MtPnRvcF9zZW5zZSwgMCwgVUJfU0VO U0VfU0laRSk7CgoJc2NtZCA9ICZzYy0+dG9wX3Jxc19jbWQ7CglzY21kLT5jZGJbMF0gPSBSRVFV RVNUX1NFTlNFOwoJc2NtZC0+Y2RiWzRdID0gVUJfU0VOU0VfU0laRTsKCXNjbWQtPmNkYl9sZW4g PSA2OwoJc2NtZC0+ZGlyID0gVUJfRElSX1JFQUQ7CglzY21kLT5zdGF0ZSA9IFVCX0NNRFNUX0lO SVQ7CglzY21kLT5kYXRhID0gc2MtPnRvcF9zZW5zZTsKCXNjbWQtPmxlbiA9IFVCX1NFTlNFX1NJ WkU7CglzY21kLT5kb25lID0gdWJfdG9wX3NlbnNlX2RvbmU7CglzY21kLT5iYWNrID0gY21kOwoK CXNjbWQtPnRhZyA9IHNjLT50YWdjbnQrKzsKCgljbWQtPnN0YXRlID0gVUJfQ01EU1RfU0VOU0U7 Cgl1Yl9jbWR0cl9zdGF0ZShzYywgY21kKTsKCgl1Yl9jbWRxX2luc2VydChzYywgc2NtZCk7Cgly ZXR1cm47CgplcnJvcjoKCXViX3N0YXRlX2RvbmUoc2MsIGNtZCwgcmMpOwp9CgovKgogKiBBIGhl bHBlciBmb3IgdGhlIGNvbW1hbmQncyBzdGF0ZSBtYWNoaW5lOgogKiBTdWJtaXQgYSBzdGFsbCBj bGVhci4KICovCnN0YXRpYyBpbnQgdWJfc3VibWl0X2NsZWFyX3N0YWxsKHN0cnVjdCB1Yl9kZXYg KnNjLCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZCwKICAgIGludCBzdGFsbGVkX3BpcGUpCnsKCWlu dCBlbmRwOwoJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3I7CglpbnQgcmM7CgoJZW5kcCA9IHVz Yl9waXBlZW5kcG9pbnQoc3RhbGxlZF9waXBlKTsKCWlmICh1c2JfcGlwZWluIChzdGFsbGVkX3Bp cGUpKQoJCWVuZHAgfD0gVVNCX0RJUl9JTjsKCgljciA9ICZzYy0+d29ya19jcjsKCWNyLT5iUmVx dWVzdFR5cGUgPSBVU0JfUkVDSVBfRU5EUE9JTlQ7Cgljci0+YlJlcXVlc3QgPSBVU0JfUkVRX0NM RUFSX0ZFQVRVUkU7Cgljci0+d1ZhbHVlID0gY3B1X3RvX2xlMTYoVVNCX0VORFBPSU5UX0hBTFQp OwoJY3ItPndJbmRleCA9IGNwdV90b19sZTE2KGVuZHApOwoJY3ItPndMZW5ndGggPSBjcHVfdG9f bGUxNigwKTsKCglVQl9JTklUX0NPTVBMRVRJT04oc2MtPndvcmtfZG9uZSk7CgoJdXNiX2ZpbGxf Y29udHJvbF91cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgc2MtPnNlbmRfY3RybF9waXBlLAoJ ICAgICh1bnNpZ25lZCBjaGFyKikgY3IsIE5VTEwsIDAsIHViX3VyYl9jb21wbGV0ZSwgc2MpOwoJ c2MtPndvcmtfdXJiLnRyYW5zZmVyX2ZsYWdzID0gVVJCX0FTWU5DX1VOTElOSzsKCXNjLT53b3Jr X3VyYi5hY3R1YWxfbGVuZ3RoID0gMDsKCXNjLT53b3JrX3VyYi5lcnJvcl9jb3VudCA9IDA7Cglz Yy0+d29ya191cmIuc3RhdHVzID0gMDsKCglpZiAoKHJjID0gdXNiX3N1Ym1pdF91cmIoJnNjLT53 b3JrX3VyYiwgR0ZQX0FUT01JQykpICE9IDApIHsKCQl1Yl9jb21wbGV0ZSgmc2MtPndvcmtfZG9u ZSk7CgkJcmV0dXJuIHJjOwoJfQoKCXNjLT53b3JrX3RpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsg VUJfQ1RSTF9USU1FT1VUOwoJYWRkX3RpbWVyKCZzYy0+d29ya190aW1lcik7CglyZXR1cm4gMDsK fQoKLyoKICovCnN0YXRpYyB2b2lkIHViX3RvcF9zZW5zZV9kb25lKHN0cnVjdCB1Yl9kZXYgKnNj LCBzdHJ1Y3QgdWJfc2NzaV9jbWQgKnNjbWQpCnsKCXVuc2lnbmVkIGNoYXIgKnNlbnNlID0gc2Nt ZC0+ZGF0YTsKCXN0cnVjdCB1Yl9zY3NpX2NtZCAqY21kOwoKCS8qCgkgKiBJZ25vcmluZyBzY21k LT5hY3RfbGVuLCBiZWNhdXNlIHRoZSBidWZmZXIgd2FzIHByZS16ZXJvZWQuCgkgKi8KCXViX2Nt ZHRyX3NlbnNlKHNjLCBzY21kLCBzZW5zZSk7CgoJLyoKCSAqIEZpbmQgdGhlIGNvbW1hbmQgd2hp Y2ggdHJpZ2dlcmVkIHRoZSB1bml0IGF0dGVudGlvbiBvciBhIGNoZWNrLAoJICogc2F2ZSB0aGUg c2Vuc2UgaW50byBpdCwgYW5kIGFkdmFuY2UgaXRzIHN0YXRlIG1hY2hpbmUuCgkgKi8KCWlmICgo Y21kID0gdWJfY21kcV9wZWVrKHNjKSkgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcg IiVzOiBzZW5zZSBkb25lIHdoaWxlIGlkbGVcbiIsIHNjLT5uYW1lKTsKCQlyZXR1cm47Cgl9Cglp ZiAoY21kICE9IHNjbWQtPmJhY2spIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HICIlczogIgoJCSAg ICAic2Vuc2UgZG9uZSBmb3Igd3JvbmcgY29tbWFuZCAweCV4IG9uIGRldmljZSAldVxuIiwKCQkg ICAgc2MtPm5hbWUsIGNtZC0+dGFnLCBzYy0+ZGV2LT5kZXZudW0pOwoJCXJldHVybjsKCX0KCWlm IChjbWQtPnN0YXRlICE9IFVCX0NNRFNUX1NFTlNFKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAi JXM6ICIKCQkgICAgInNlbnNlIGRvbmUgd2l0aCBiYWQgY21kIHN0YXRlICVkIG9uIGRldmljZSAl dVxuIiwKCQkgICAgc2MtPm5hbWUsIGNtZC0+c3RhdGUsIHNjLT5kZXYtPmRldm51bSk7CgkJcmV0 dXJuOwoJfQoKCWNtZC0+a2V5ID0gc2Vuc2VbMl0gJiAweDBGOwoJY21kLT5hc2MgPSBzZW5zZVsx Ml07CgljbWQtPmFzY3EgPSBzZW5zZVsxM107CgoJdWJfc2NzaV91cmJfY29tcGwoc2MsIGNtZCk7 Cn0KCiNpZiAwCi8qIERldGVybWluZSB3aGF0IHRoZSBtYXhpbXVtIExVTiBzdXBwb3J0ZWQgaXMg Ki8KaW50IHVzYl9zdG9yX0J1bGtfbWF4X2x1bihzdHJ1Y3QgdXNfZGF0YSAqdXMpCnsKCWludCBy ZXN1bHQ7CgoJLyogaXNzdWUgdGhlIGNvbW1hbmQgKi8KCXJlc3VsdCA9IHVzYl9zdG9yX2NvbnRy b2xfbXNnKHVzLCB1cy0+cmVjdl9jdHJsX3BpcGUsCgkJCQkgVVNfQlVMS19HRVRfTUFYX0xVTiwg CgkJCQkgVVNCX0RJUl9JTiB8IFVTQl9UWVBFX0NMQVNTIHwgCgkJCQkgVVNCX1JFQ0lQX0lOVEVS RkFDRSwKCQkJCSAwLCB1cy0+aWZudW0sIHVzLT5pb2J1ZiwgMSwgSFopOwoKCS8qIAoJICogU29t ZSBkZXZpY2VzIChpLmUuIElvbWVnYSBaaXAxMDApIG5lZWQgdGhpcyAtLSBhcHBhcmVudGx5Cgkg KiB0aGUgYnVsayBwaXBlcyBnZXQgU1RBTExlZCB3aGVuIHRoZSBHZXRNYXhMVU4gcmVxdWVzdCBp cwoJICogcHJvY2Vzc2VkLiAgIFRoaXMgaXMsIGluIHRoZW9yeSwgaGFybWxlc3MgdG8gYWxsIG90 aGVyIGRldmljZXMKCSAqIChyZWdhcmRsZXNzIG9mIGlmIHRoZXkgc3RhbGwgb3Igbm90KS4KCSAq LwoJaWYgKHJlc3VsdCA8IDApIHsKCQl1c2Jfc3Rvcl9jbGVhcl9oYWx0KHVzLCB1cy0+cmVjdl9i dWxrX3BpcGUpOwoJCXVzYl9zdG9yX2NsZWFyX2hhbHQodXMsIHVzLT5zZW5kX2J1bGtfcGlwZSk7 Cgl9CgoJVVNfREVCVUdQKCJHZXRNYXhMVU4gY29tbWFuZCByZXN1bHQgaXMgJWQsIGRhdGEgaXMg JWRcbiIsIAoJCSAgcmVzdWx0LCB1cy0+aW9idWZbMF0pOwoKCS8qIGlmIHdlIGhhdmUgYSBzdWNj ZXNzZnVsIHJlcXVlc3QsIHJldHVybiB0aGUgcmVzdWx0ICovCglpZiAocmVzdWx0ID09IDEpCgkJ cmV0dXJuIHVzLT5pb2J1ZlswXTsKCgkvKiByZXR1cm4gdGhlIGRlZmF1bHQgLS0gbm8gTFVOcyAq LwoJcmV0dXJuIDA7Cn0KI2VuZGlmCgovKgogKiBUaGlzIGlzIGNhbGxlZCBmcm9tIGEgcHJvY2Vz cyBjb250ZXh0LgogKi8Kc3RhdGljIHZvaWQgdWJfcmV2YWxpZGF0ZShzdHJ1Y3QgdWJfZGV2ICpz YykKewoKCXNjLT5yZWFkb25seSA9IDA7CS8qIFhYWCBRdWVyeSB0aGlzIGZyb20gdGhlIGRldmlj ZSAqLwoKCS8qCgkgKiBYWFggc2QuYyBzZXRzIGNhcGFjaXR5IHRvIHplcm8gaW4gc3VjaCBjYXNl LiBIb3dldmVyLCBpdCBkb2Vzbid0CgkgKiB3b3JrIGZvciB1cy4gSW4gY2FzZSBvZiB6ZXJvIGNh cGFjaXR5LCBibG9jayBsYXllciByZWZ1c2VzIHRvCgkgKiBoYXZlIHRoZSAvZGV2L3ViYSBvcGVu ZWQgKHdoeT8pIFNldCBjYXBhY2l0eSB0byBzb21lIHJhbmRvbSB2YWx1ZS4KCig0LzE0LzIwMDQg YWJvdXQgMi42LjktcmMxLW1tNCkKPGplamI+IHZpcm86IGFjdHVhbGx5IGJlY2F1c2UgdGhlcmUg d2FzIGEgY2hlY2sgb24gc2l6ZSA9PSAwIGJlZm9yZSBhc3NpZ25pbmcgZl9vcHMgc28geW91IGNh biBuZXZlciBvcGVuIGEgemVybyBzaXplIGRldmljZSB0byByZXZhbGlkYXRlIGl0Cjx2aXJvPiBq ZWpiOiBhaCwgSSByZW1lbWJlcgo8amVqYj4gdmlybzogSSdtIHN0aWxsIHNlZWluZyBvbiBzY3Np IHRoYXQgSSBuZWVkIHRvIGlzc3VlIHR3byBCTEtSUlBBUlRzIHRvIGdldCB0aGUgcGFydGl0aW9u IHRhYmxlIHJlYWQKPHZpcm8+IGplamI6IHRoZXJlIHdhcyBhIHZlcnkgb2RkIEFQSSBmb3IgaXNz dWluZyBjb21tYW5kcyBvbiBhYnNlbnQgZGV2aWNlCjx2aXJvPiBqZWpiOiBJSVJDLCBjY2lzcywg aWRhIG9yIERBQzk2MAo8emFpdGNldj4gamVqYjogSSBoYWQgdGhhdCBwcm9ibGVtIHdpdGggYSB6 ZXJvIHNpemUgZGV2aWNlIHdoaWNoIEkgInNvbHZlZCIgYnkgc2V0dGluZyB0aGUgc2l6ZSB0byBz b21lIHJhbmRvbSBudW1iZXIgKDUwS0IpLgo8aGNoPiB2aXJvOiBEQUM5NjAgYWxsb3dlZCB0byBp c3N1ZSBpb2N0bHMgd2hlbiBvcGVuZWQgd2l0aCBPX05PTkJMT0NLCiogdmlybyByZWFsbHkgb3Vn aHQgdG8gZGlnIG91dCB0aGUgMi43IHByb2plY3RzIGFuZCBkbyBzb21lIHRyaWFnZQo8amVqYj4g emFpdGNldjogeWVzLCB3ZSBkbyB0aGF0IGluIFNDU0kuICBIb3dldmVyLCBwdXR0aW5nIGJvZ3Vz IHNpemVzIGluIGlzIHJhdGhlciBzaWxseQoKCSAqLwoJc2MtPmNhcGFjaXR5Lm5zZWMgPSA1MDsK CXNjLT5jYXBhY2l0eS5ic2l6ZSA9IDUxMjsKCXNjLT5jYXBhY2l0eS5ic2hpZnQgPSAwOwoKCWlm ICh1Yl9zeW5jX3R1cihzYykgIT0gMCkKCQlyZXR1cm47CQkJLyogTm90IHJlYWR5ICovCglzYy0+ Y2hhbmdlZCA9IDA7CgoJaWYgKHViX3N5bmNfcmVhZF9jYXAoc2MsICZzYy0+Y2FwYWNpdHkpICE9 IDApIHsKCQkvKgoJCSAqIFRoZSByZXRyeSBoZXJlIG1lYW5zIHNvbWV0aGluZyBpcyB3cm9uZywg ZWl0aGVyIHdpdGggdGhlCgkJICogZGV2aWNlLCB3aXRoIHRoZSB0cmFuc3BvcnQsIG9yIHdpdGgg b3VyIGNvZGUuCgkJICogV2Uga2VlcCB0aGlzIGJlY2F1c2Ugc2QuYyBoYXMgcmV0cmllcyBmb3Ig Y2FwYWNpdHkuCgkJICovCgkJaWYgKHViX3N5bmNfcmVhZF9jYXAoc2MsICZzYy0+Y2FwYWNpdHkp ICE9IDApIHsKCQkJc2MtPmNhcGFjaXR5Lm5zZWMgPSAxMDA7CgkJCXNjLT5jYXBhY2l0eS5ic2l6 ZSA9IDUxMjsKCQkJc2MtPmNhcGFjaXR5LmJzaGlmdCA9IDA7CgkJfQoJfQp9CgovKgogKiBUaGUg b3BlbiBmdW5jaW9uLgogKiBUaGlzIGlzIG1vc3RseSBuZWVkZWQgdG8ga2VlcCByZWZjb3VudGlu ZywgYnV0IGFsc28gdG8gc3VwcG9ydAogKiBtZWRpYSBjaGVja3Mgb24gcmVtb3ZhYmxlIG1lZGlh IGRyaXZlcy4KICovCnN0YXRpYyBpbnQgdWJfYmRfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBz dHJ1Y3QgZmlsZSAqZmlscCkKewoJc3RydWN0IGdlbmRpc2sgKmRpc2sgPSBpbm9kZS0+aV9iZGV2 LT5iZF9kaXNrOwoJc3RydWN0IHViX2RldiAqc2M7Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJaW50 IHJjOwoKCWlmICgoc2MgPSBkaXNrLT5wcml2YXRlX2RhdGEpID09IE5VTEwpCgkJcmV0dXJuIC1F TlhJTzsKCXNwaW5fbG9ja19pcnFzYXZlKCZ1Yl9sb2NrLCBmbGFncyk7CglpZiAoYXRvbWljX3Jl YWQoJnNjLT5wb2lzb24pKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWJfbG9jaywgZmxh Z3MpOwoJCXJldHVybiAtRU5YSU87Cgl9CglzYy0+b3BlbmMrKzsKCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnViX2xvY2ssIGZsYWdzKTsKCglpZiAoc2MtPnJlbW92YWJsZSB8fCBzYy0+cmVhZG9u bHkpCgkJY2hlY2tfZGlza19jaGFuZ2UoaW5vZGUtPmlfYmRldik7CgoJLyoKCSAqIFRoZSBzZC5j IGNvbnNpZGVycyAtPm1lZGlhX3ByZXNlbnQgYW5kIC0+Y2hhbmdlZCBub3QgZXF1aXZhbGVudCwK CSAqIHVuZGVyIHNvbWUgcHJldHR5IG11cmt5IGNvbmRpdGlvbnMgKGEgZmFpbHVyZSBvZiBSRUFE IENBUEFDSVRZKS4KCSAqIFdlIG1heSBuZWVkIGl0IG9uZSBkYXkuCgkgKi8KCWlmIChzYy0+cmVt b3ZhYmxlICYmIHNjLT5jaGFuZ2VkICYmICEoZmlscC0+Zl9mbGFncyAmIE9fTkRFTEFZKSkgewoJ CXJjID0gLUVOT01FRElVTTsKCQlnb3RvIGVycl9vcGVuOwoJfQoKCWlmIChzYy0+cmVhZG9ubHkg JiYgKGZpbHAtPmZfbW9kZSAmIEZNT0RFX1dSSVRFKSkgewoJCXJjID0gLUVST0ZTOwoJCWdvdG8g ZXJyX29wZW47Cgl9CgoJcmV0dXJuIDA7CgplcnJfb3BlbjoKCXNwaW5fbG9ja19pcnFzYXZlKCZ1 Yl9sb2NrLCBmbGFncyk7CgktLXNjLT5vcGVuYzsKCWlmIChzYy0+b3BlbmMgPT0gMCAmJiBhdG9t aWNfcmVhZCgmc2MtPnBvaXNvbikpCgkJdWJfY2xlYW51cChzYyk7CglzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZ1Yl9sb2NrLCBmbGFncyk7CglyZXR1cm4gcmM7Cn0KCi8qCiAqLwpzdGF0aWMgaW50 IHViX2JkX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbHApCnsK CXN0cnVjdCBnZW5kaXNrICpkaXNrID0gaW5vZGUtPmlfYmRldi0+YmRfZGlzazsKCXN0cnVjdCB1 Yl9kZXYgKnNjID0gZGlzay0+cHJpdmF0ZV9kYXRhOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglz cGluX2xvY2tfaXJxc2F2ZSgmdWJfbG9jaywgZmxhZ3MpOwoJLS1zYy0+b3BlbmM7CglpZiAoc2Mt Pm9wZW5jID09IDAgJiYgYXRvbWljX3JlYWQoJnNjLT5wb2lzb24pKQoJCXViX2NsZWFudXAoc2Mp OwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdWJfbG9jaywgZmxhZ3MpOwoJcmV0dXJuIDA7Cn0K Ci8qCiAqIFRoZSBpb2N0bCBpbnRlcmZhY2UuCiAqLwpzdGF0aWMgaW50IHViX2JkX2lvY3RsKHN0 cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwLAogICAgdW5zaWduZWQgaW50IGNt ZCwgdW5zaWduZWQgbG9uZyBhcmcpCnsKLy8gdm9pZCBfX3VzZXIgKnVzZXJtZW0gPSAodm9pZCAq KSBhcmc7Ci8vIHN0cnVjdCBjYXJtX3BvcnQgKnBvcnQgPSBpbm8tPmlfYmRldi0+YmRfZGlzay0+ cHJpdmF0ZV9kYXRhOwovLyBzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbTsKCiNpZiAwCglzd2l0Y2gg KGNtZCkgewoJY2FzZSBIRElPX0dFVEdFTzoKCQlpZiAodXNlcm1lbSA9PSBOVUxMKQkJLy8gWFhY IEJpenphcmUuIFdoeT8KCQkJcmV0dXJuIC1FSU5WQUw7CgoJCWdlb20uaGVhZHMgPSAodTgpIHBv cnQtPmRldl9nZW9tX2hlYWQ7CgkJZ2VvbS5zZWN0b3JzID0gKHU4KSBwb3J0LT5kZXZfZ2VvbV9z ZWN0OwoJCWdlb20uY3lsaW5kZXJzID0gcG9ydC0+ZGV2X2dlb21fY3lsOwoJCWdlb20uc3RhcnQg PSBnZXRfc3RhcnRfc2VjdChpbm8tPmlfYmRldik7CgoJCWlmIChjb3B5X3RvX3VzZXIodXNlcm1l bSwgJmdlb20sIHNpemVvZihnZW9tKSkpCgkJCXJldHVybiAtRUZBVUxUOwoJCXJldHVybiAwOwoK CWRlZmF1bHQ6IDsKCX0KI2VuZGlmCgoJcmV0dXJuIC1FTk9UVFk7Cn0KCi8qCiAqIFRoaXMgaXMg Y2FsbGVkIG9uY2UgYSBuZXcgZGlzayB3YXMgc2VlbiBieSB0aGUgYmxvY2sgbGF5ZXIgb3IgYnkg dWJfcHJvYmUoKS4KICogVGhlIG1haW4gb25qZWN0aXZlIGhlcmUgaXMgdG8gZGlzY292ZXIgdGhl IGZlYXR1cmVzIG9mIHRoZSBtZWRpYSBzdWNoIGFzCiAqIHRoZSBjYXBhY2l0eSwgcmVhZC1vbmx5 IHN0YXR1cywgZXRjLiBVU0Igc3RvcmFnZSBnZW5lcmFsbHkgZG9lcyBub3QKICogbmVlZCB0byBi ZSBzcHVuIHVwLCBidXQgaWYgd2UgbmVlZGVkIGl0LCB0aGlzIHdvdWxkIGJlIHRoZSBwbGFjZS4K ICoKICogVGhpcyBjYWxsIGNhbiBzbGVlcC4KICoKICogVGhlIHJldHVybiBjb2RlIGlzIG5vdCB1 c2VkLgogKi8Kc3RhdGljIGludCB1Yl9iZF9yZXZhbGlkYXRlKHN0cnVjdCBnZW5kaXNrICpkaXNr KQp7CglzdHJ1Y3QgdWJfZGV2ICpzYyA9IGRpc2stPnByaXZhdGVfZGF0YTsKCgl1Yl9yZXZhbGlk YXRlKHNjKTsKCS8qIFRoaXMgaXMgcHJldHR5IG11Y2ggYSBsb25nIHRlcm0gUDMgKi8KCXByaW50 ayhLRVJOX0lORk8gIiVzOiBkZXZpY2UgJXUgY2FwYWNpdHkgbnNlYyAlbGQgYnNpemUgJXVcbiIs CgkgICAgc2MtPm5hbWUsIHNjLT5kZXYtPmRldm51bSwgc2MtPmNhcGFjaXR5Lm5zZWMsIHNjLT5j YXBhY2l0eS5ic2l6ZSk7CgoJLyogWFhYIFN1cHBvcnQgc2VjdG9yIHNpemUgc3dpdGNoaW5nIGxp a2UgaW4gc3IuYyAqLwoJYmxrX3F1ZXVlX2hhcmRzZWN0X3NpemUoZGlzay0+cXVldWUsIHNjLT5j YXBhY2l0eS5ic2l6ZSk7CglzZXRfY2FwYWNpdHkoZGlzaywgc2MtPmNhcGFjaXR5Lm5zZWMpOwoJ Ly8gc2V0X2Rpc2tfcm8oc2RrcC0+ZGlzaywgc2MtPnJlYWRvbmx5KTsKCglyZXR1cm4gMDsKfQoK LyoKICogVGhlIGNoZWNrIGlzIGNhbGxlZCBieSB0aGUgYmxvY2sgbGF5ZXIgdG8gdmVyaWZ5IGlm IHRoZSBtZWRpYQogKiBpcyBzdGlsbCBhdmFpbGFibGUuIEl0IGlzIHN1cHBvc2VkIHRvIGJlIGhh cm1sZXNzLCBsaWdodHdlaWdodCBhbmQKICogbm9uLWludHJ1c2l2ZSBpbiBjYXNlIHRoZSBtZWRp YSB3YXMgbm90IGNoYW5nZWQuCiAqCiAqIFRoaXMgY2FsbCBjYW4gc2xlZXAuCiAqCiAqIFRoZSBy ZXR1cm4gY29kZSBpcyBib29sIQogKi8Kc3RhdGljIGludCB1Yl9iZF9tZWRpYV9jaGFuZ2VkKHN0 cnVjdCBnZW5kaXNrICpkaXNrKQp7CglzdHJ1Y3QgdWJfZGV2ICpzYyA9IGRpc2stPnByaXZhdGVf ZGF0YTsKCglpZiAoIXNjLT5yZW1vdmFibGUpCgkJcmV0dXJuIDA7CgoJLyoKCSAqIFdlIGNsZWFu IGNoZWNrcyBhbHdheXMgYWZ0ZXIgZXZlcnkgY29tbWFuZCwgc28gdGhpcyBpcyBub3QKCSAqIGFz IGRhbmdlcm91cyBhcyBpdCBsb29rcy4gSWYgdGhlIFRFU1RfVU5JVF9SRUFEWSBmYWlscyBoZXJl LAoJICogdGhlIGRldmljZSBpcyBhY3R1YWxseSBub3QgcmVhZHkgd2l0aCBvcGVyYXRvciBvciBz b2Z0d2FyZQoJICogaW50ZXJ2ZW50aW9uIHJlcXVpcmVkLiBPbmUgZGFuZ2Vyb3VzIGl0ZW0gbWln aHQgYmUgYSBkcml2ZSB3aGljaAoJICogc3BpbnMgaXRzZWxmIGRvd24sIGFuZCBjb21lIHRoZSB0 aW1lIHRvIHdyaXRlIGRpcnR5IHBhZ2VzLCB0aGlzCgkgKiB3aWxsIGZhaWwsIHRoZW4gYmxvY2sg bGF5ZXIgZGlzY2FyZHMgdGhlIGRhdGEuIFNpbmNlIHdlIG5ldmVyCgkgKiBzcGluIGRyaXZlcyB1 cCwgc3VjaCBkZXZpY2VzIHNpbXBseSBjYW5ub3QgYmUgdXNlZCB3aXRoIHViIGFueXdheS4KCSAq LwoJaWYgKHViX3N5bmNfdHVyKHNjKSAhPSAwKSB7CgkJc2MtPmNoYW5nZWQgPSAxOwoJCS8qIFAz ICovIHByaW50aygiJXM6IG1hZGUgY2hhbmdlZFxuIiwgc2MtPm5hbWUpOwoJCXJldHVybiAxOwoJ fQoKCS8qIFRoZSBzZC5jIGNsZWFycyB0aGlzIGJlZm9yZSByZXR1cm5pbmcgKG9uZS1zaG90IGZs YWcpLiBXaHk/ICovCgkvKiBQMyAqLyBwcmludGsoIiVzOiAlcyBjaGFuZ2VkXG4iLCBzYy0+bmFt ZSwKCSAgICBzYy0+Y2hhbmdlZD8gImlzIjogIndhcyBub3QiKTsKCXJldHVybiBzYy0+Y2hhbmdl ZDsKfQoKc3RhdGljIHN0cnVjdCBibG9ja19kZXZpY2Vfb3BlcmF0aW9ucyB1Yl9iZF9mb3BzID0g ewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLm9wZW4JCT0gdWJfYmRfb3BlbiwKCS5yZWxlYXNl CT0gdWJfYmRfcmVsZWFzZSwKCS5pb2N0bAkJPSB1Yl9iZF9pb2N0bCwKCS5tZWRpYV9jaGFuZ2Vk CT0gdWJfYmRfbWVkaWFfY2hhbmdlZCwKCS5yZXZhbGlkYXRlX2Rpc2sgPSB1Yl9iZF9yZXZhbGlk YXRlLAp9OwoKLyoKICogQ29tbW9uIC0+ZG9uZSByb3V0aW5lIGZvciBjb21tYW5kcyBleGVjdXRl ZCBzeW5jaHJvbm91c2x5LgogKi8Kc3RhdGljIHZvaWQgdWJfcHJvYmVfZG9uZShzdHJ1Y3QgdWJf ZGV2ICpzYywgc3RydWN0IHViX3Njc2lfY21kICpjbWQpCnsKCXN0cnVjdCBjb21wbGV0aW9uICpj b3AgPSBjbWQtPmJhY2s7Cgljb21wbGV0ZShjb3ApOwp9CgovKgogKiBUZXN0IGlmIHRoZSBkZXZp Y2UgaGFzIGEgY2hlY2sgY29uZGl0aW9uIG9uIGl0LCBzeW5jaHJvbm91c2x5LgogKi8Kc3RhdGlj IGludCB1Yl9zeW5jX3R1cihzdHJ1Y3QgdWJfZGV2ICpzYykKewoJc3RydWN0IHViX3Njc2lfY21k ICpjbWQ7CgllbnVtIHsgQUxMT0NfU0laRSA9IHNpemVvZihzdHJ1Y3QgdWJfc2NzaV9jbWQpIH07 Cgl1bnNpZ25lZCBsb25nIGZsYWdzOwoJc3RydWN0IGNvbXBsZXRpb24gY29tcGw7CglpbnQgcmM7 CgoJaW5pdF9jb21wbGV0aW9uKCZjb21wbCk7CgoJcmMgPSAtRU5PTUVNOwoJaWYgKChjbWQgPSBr bWFsbG9jKEFMTE9DX1NJWkUsIEdGUF9LRVJORUwpKSA9PSBOVUxMKQoJCWdvdG8gZXJyX2FsbG9j OwoJbWVtc2V0KGNtZCwgMCwgQUxMT0NfU0laRSk7CgoJY21kLT5jZGJbMF0gPSBURVNUX1VOSVRf UkVBRFk7CgljbWQtPmNkYl9sZW4gPSA2OwoJY21kLT5kaXIgPSBVQl9ESVJfTk9ORTsKCWNtZC0+ c3RhdGUgPSBVQl9DTURTVF9JTklUOwoJY21kLT5kb25lID0gdWJfcHJvYmVfZG9uZTsKCWNtZC0+ YmFjayA9ICZjb21wbDsKCglzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxvY2ssIGZsYWdzKTsKCWNt ZC0+dGFnID0gc2MtPnRhZ2NudCsrOwoKCXJjID0gdWJfc3VibWl0X3Njc2koc2MsIGNtZCk7Cglz cGluX3VubG9ja19pcnFyZXN0b3JlKCZzYy0+bG9jaywgZmxhZ3MpOwoKCWlmIChyYyAhPSAwKSB7 CgkJcHJpbnRrKCJ1YjogdGVzdGluZyByZWFkeTogc3VibWl0IGVycm9yICglZClcbiIsIHJjKTsg LyogUDMgKi8KCQlnb3RvIGVycl9zdWJtaXQ7Cgl9CgoJd2FpdF9mb3JfY29tcGxldGlvbigmY29t cGwpOwoKCXJjID0gY21kLT5lcnJvcjsKCglpZiAocmMgPT0gLUVJTyAmJiBjbWQtPmtleSAhPSAw KQkvKiBSZXRyaWVzIGZvciBiZW5oJ3Mga2V5ICovCgkJcmMgPSBjbWQtPmtleTsKCmVycl9zdWJt aXQ6CglrZnJlZShjbWQpOwplcnJfYWxsb2M6CglyZXR1cm4gcmM7Cn0KCi8qCiAqIFJlYWQgdGhl IFNDU0kgY2FwYWNpdHkgc3luY2hyb25vdXNseSAoZm9yIHByb2JpbmcpLgogKi8Kc3RhdGljIGlu dCB1Yl9zeW5jX3JlYWRfY2FwKHN0cnVjdCB1Yl9kZXYgKnNjLCBzdHJ1Y3QgdWJfY2FwYWNpdHkg KnJldCkKewoJc3RydWN0IHViX3Njc2lfY21kICpjbWQ7CgljaGFyICpwOwoJZW51bSB7IEFMTE9D X1NJWkUgPSBzaXplb2Yoc3RydWN0IHViX3Njc2lfY21kKSArIDggfTsKCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7Cgl1bnNpZ25lZCBpbnQgYnNpemUsIHNoaWZ0OwoJdW5zaWduZWQgbG9uZyBuc2VjOwoJ c3RydWN0IGNvbXBsZXRpb24gY29tcGw7CglpbnQgcmM7CgoJaW5pdF9jb21wbGV0aW9uKCZjb21w bCk7CgoJcmMgPSAtRU5PTUVNOwoJaWYgKChjbWQgPSBrbWFsbG9jKEFMTE9DX1NJWkUsIEdGUF9L RVJORUwpKSA9PSBOVUxMKQoJCWdvdG8gZXJyX2FsbG9jOwoJbWVtc2V0KGNtZCwgMCwgQUxMT0Nf U0laRSk7CglwID0gKGNoYXIgKiljbWQgKyBzaXplb2Yoc3RydWN0IHViX3Njc2lfY21kKTsKCglj bWQtPmNkYlswXSA9IDB4MjU7CgljbWQtPmNkYl9sZW4gPSAxMDsKCWNtZC0+ZGlyID0gVUJfRElS X1JFQUQ7CgljbWQtPnN0YXRlID0gVUJfQ01EU1RfSU5JVDsKCWNtZC0+ZGF0YSA9IHA7CgljbWQt PmxlbiA9IDg7CgljbWQtPmRvbmUgPSB1Yl9wcm9iZV9kb25lOwoJY21kLT5iYWNrID0gJmNvbXBs OwoKCXNwaW5fbG9ja19pcnFzYXZlKCZzYy0+bG9jaywgZmxhZ3MpOwoJY21kLT50YWcgPSBzYy0+ dGFnY250Kys7CgoJcmMgPSB1Yl9zdWJtaXRfc2NzaShzYywgY21kKTsKCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnNjLT5sb2NrLCBmbGFncyk7CgoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoInVi OiByZWFkaW5nIGNhcGFjaXR5OiBzdWJtaXQgZXJyb3IgKCVkKVxuIiwgcmMpOyAvKiBQMyAqLwoJ CWdvdG8gZXJyX3N1Ym1pdDsKCX0KCgl3YWl0X2Zvcl9jb21wbGV0aW9uKCZjb21wbCk7CgoJaWYg KGNtZC0+ZXJyb3IgIT0gMCkgewoJCXByaW50aygidWI6IHJlYWRpbmcgY2FwYWNpdHk6IGVycm9y ICVkXG4iLCBjbWQtPmVycm9yKTsgLyogUDMgKi8KCQlyYyA9IC1FSU87CgkJZ290byBlcnJfcmVh ZDsKCX0KCWlmIChjbWQtPmFjdF9sZW4gIT0gOCkgewoJCXByaW50aygidWI6IHJlYWRpbmcgY2Fw YWNpdHk6IHNpemUgJWRcbiIsIGNtZC0+YWN0X2xlbik7IC8qIFAzICovCgkJcmMgPSAtRUlPOwoJ CWdvdG8gZXJyX3JlYWQ7Cgl9CgoJLyogc2QuYyBzcGVjaWFsLWNhc2VzIHNlY3RvciBzaXplIG9m IDAgdG8gbWVhbiA1MTIuIE5lZWRlZD8gU2FmZT8gKi8KCW5zZWMgPSBiZTMyX3RvX2NwdSgqKHUz MiAqKXApICsgMTsKCWJzaXplID0gYmUzMl90b19jcHUoKih1MzIgKikocCArIDQpKTsKCXN3aXRj aCAoYnNpemUpIHsKCWNhc2UgNTEyOglzaGlmdCA9IDA7CWJyZWFrOwoJY2FzZSAxMDI0OglzaGlm dCA9IDE7CWJyZWFrOwoJY2FzZSAyMDQ4OglzaGlmdCA9IDI7CWJyZWFrOwoJY2FzZSA0MDk2Oglz aGlmdCA9IDM7CWJyZWFrOwoJZGVmYXVsdDoKCQlwcmludGsoInViOiBCYWQgc2VjdG9yIHNpemUg JXVcbiIsIGJzaXplKTsgLyogUDMgKi8KCQlyYyA9IC1FRE9NOwoJCWdvdG8gZXJyX2ludl9ic2l6 ZTsKCX0KCglyZXQtPmJzaXplID0gYnNpemU7CglyZXQtPmJzaGlmdCA9IHNoaWZ0OwoJcmV0LT5u c2VjID0gbnNlYyA8PCBzaGlmdDsKCXJjID0gMDsKCmVycl9pbnZfYnNpemU6CmVycl9yZWFkOgpl cnJfc3VibWl0OgoJa2ZyZWUoY21kKTsKZXJyX2FsbG9jOgoJcmV0dXJuIHJjOwp9CgovKgogKi8K c3RhdGljIHZvaWQgdWJfcHJvYmVfdXJiX2NvbXBsZXRlKHN0cnVjdCB1cmIgKnVyYiwgc3RydWN0 IHB0X3JlZ3MgKnB0KQp7CglzdHJ1Y3QgY29tcGxldGlvbiAqY29wID0gdXJiLT5jb250ZXh0OwoJ Y29tcGxldGUoY29wKTsKfQoKc3RhdGljIHZvaWQgdWJfcHJvYmVfdGltZW91dCh1bnNpZ25lZCBs b25nIGFyZykKewoJc3RydWN0IGNvbXBsZXRpb24gKmNvcCA9IChzdHJ1Y3QgY29tcGxldGlvbiAq KSBhcmc7Cgljb21wbGV0ZShjb3ApOwp9CgovKgogKiBDbGVhciBpbml0aWFsIHN0YWxscy4KICov CnN0YXRpYyBpbnQgdWJfcHJvYmVfY2xlYXJfc3RhbGwoc3RydWN0IHViX2RldiAqc2MsIGludCBz dGFsbGVkX3BpcGUpCnsKCWludCBlbmRwOwoJc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3I7Cglz dHJ1Y3QgY29tcGxldGlvbiBjb21wbDsKCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOwoJaW50IHJj OwoKCWluaXRfY29tcGxldGlvbigmY29tcGwpOwoKCWVuZHAgPSB1c2JfcGlwZWVuZHBvaW50KHN0 YWxsZWRfcGlwZSk7CglpZiAodXNiX3BpcGVpbiAoc3RhbGxlZF9waXBlKSkKCQllbmRwIHw9IFVT Ql9ESVJfSU47CgoJY3IgPSAmc2MtPndvcmtfY3I7Cgljci0+YlJlcXVlc3RUeXBlID0gVVNCX1JF Q0lQX0VORFBPSU5UOwoJY3ItPmJSZXF1ZXN0ID0gVVNCX1JFUV9DTEVBUl9GRUFUVVJFOwoJY3It PndWYWx1ZSA9IGNwdV90b19sZTE2KFVTQl9FTkRQT0lOVF9IQUxUKTsKCWNyLT53SW5kZXggPSBj cHVfdG9fbGUxNihlbmRwKTsKCWNyLT53TGVuZ3RoID0gY3B1X3RvX2xlMTYoMCk7CgoJdXNiX2Zp bGxfY29udHJvbF91cmIoJnNjLT53b3JrX3VyYiwgc2MtPmRldiwgc2MtPnNlbmRfY3RybF9waXBl LAoJICAgICh1bnNpZ25lZCBjaGFyKikgY3IsIE5VTEwsIDAsIHViX3Byb2JlX3VyYl9jb21wbGV0 ZSwgJmNvbXBsKTsKCXNjLT53b3JrX3VyYi50cmFuc2Zlcl9mbGFncyA9IDA7CglzYy0+d29ya191 cmIuYWN0dWFsX2xlbmd0aCA9IDA7CglzYy0+d29ya191cmIuZXJyb3JfY291bnQgPSAwOwoJc2Mt PndvcmtfdXJiLnN0YXR1cyA9IDA7CgoJaWYgKChyYyA9IHVzYl9zdWJtaXRfdXJiKCZzYy0+d29y a191cmIsIEdGUF9LRVJORUwpKSAhPSAwKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORwoJCSAgICAg IiVzOiBVbmFibGUgdG8gc3VibWl0IGEgcHJvYmUgY2xlYXIgKCVkKVxuIiwgc2MtPm5hbWUsIHJj KTsKCQlyZXR1cm4gcmM7Cgl9CgoJaW5pdF90aW1lcigmdGltZXIpOwoJdGltZXIuZnVuY3Rpb24g PSB1Yl9wcm9iZV90aW1lb3V0OwoJdGltZXIuZGF0YSA9ICh1bnNpZ25lZCBsb25nKSAmY29tcGw7 Cgl0aW1lci5leHBpcmVzID0gamlmZmllcyArIFVCX0NUUkxfVElNRU9VVDsKCWFkZF90aW1lcigm dGltZXIpOwoKCXdhaXRfZm9yX2NvbXBsZXRpb24oJmNvbXBsKTsKCglkZWxfdGltZXJfc3luYygm dGltZXIpOwoJdXNiX2tpbGxfdXJiKCZzYy0+d29ya191cmIpOwoKCS8qIHJlc2V0IHRoZSBlbmRw b2ludCB0b2dnbGUgKi8KCXVzYl9zZXR0b2dnbGUoc2MtPmRldiwgZW5kcCwgdXNiX3BpcGVvdXQo c2MtPmxhc3RfcGlwZSksIDApOwoKCXJldHVybiAwOwp9CgovKgogKiBHZXQgdGhlIHBpcGUgc2V0 dGluZ3MuCiAqLwpzdGF0aWMgaW50IHViX2dldF9waXBlcyhzdHJ1Y3QgdWJfZGV2ICpzYywgc3Ry dWN0IHVzYl9kZXZpY2UgKmRldiwKICAgIHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQp7Cglz dHJ1Y3QgdXNiX2hvc3RfaW50ZXJmYWNlICphbHRzZXR0aW5nID0gaW50Zi0+Y3VyX2FsdHNldHRp bmc7CglzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwX2luID0gTlVMTDsKCXN0cnVj dCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXBfb3V0ID0gTlVMTDsKCXN0cnVjdCB1c2JfZW5k cG9pbnRfZGVzY3JpcHRvciAqZXA7CglpbnQgaTsKCgkvKgoJICogRmluZCB0aGUgZW5kcG9pbnRz IHdlIG5lZWQuCgkgKiBXZSBhcmUgZXhwZWN0aW5nIGEgbWluaW11bSBvZiAyIGVuZHBvaW50cyAt IGluIGFuZCBvdXQgKGJ1bGspLgoJICogV2Ugd2lsbCBpZ25vcmUgYW55IG90aGVycy4KCSAqLwoJ Zm9yIChpID0gMDsgaSA8IGFsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50czsgaSsrKSB7CgkJ ZXAgPSAmYWx0c2V0dGluZy0+ZW5kcG9pbnRbaV0uZGVzYzsKCgkJLyogSXMgaXQgYSBCVUxLIGVu ZHBvaW50PyAqLwoJCWlmICgoZXAtPmJtQXR0cmlidXRlcyAmIFVTQl9FTkRQT0lOVF9YRkVSVFlQ RV9NQVNLKQoJCQkJPT0gVVNCX0VORFBPSU5UX1hGRVJfQlVMSykgewoJCQkvKiBCVUxLIGluIG9y IG91dD8gKi8KCQkJaWYgKGVwLT5iRW5kcG9pbnRBZGRyZXNzICYgVVNCX0RJUl9JTikKCQkJCWVw X2luID0gZXA7CgkJCWVsc2UKCQkJCWVwX291dCA9IGVwOwoJCX0KCX0KCglpZiAoZXBfaW4gPT0g TlVMTCB8fCBlcF9vdXQgPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX05PVElDRSAiJXM6IGRldmlj ZSAldSBmYWlsZWQgZW5kcG9pbnQgY2hlY2tcbiIsCgkJICAgIHNjLT5uYW1lLCBzYy0+ZGV2LT5k ZXZudW0pOwoJCXJldHVybiAtRUlPOwoJfQoKCS8qIENhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlIHBp cGUgdmFsdWVzICovCglzYy0+c2VuZF9jdHJsX3BpcGUgPSB1c2Jfc25kY3RybHBpcGUoZGV2LCAw KTsKCXNjLT5yZWN2X2N0cmxfcGlwZSA9IHVzYl9yY3ZjdHJscGlwZShkZXYsIDApOwoJc2MtPnNl bmRfYnVsa19waXBlID0gdXNiX3NuZGJ1bGtwaXBlKGRldiwKCQllcF9vdXQtPmJFbmRwb2ludEFk ZHJlc3MgJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0spOwoJc2MtPnJlY3ZfYnVsa19waXBlID0g dXNiX3JjdmJ1bGtwaXBlKGRldiwgCgkJZXBfaW4tPmJFbmRwb2ludEFkZHJlc3MgJiBVU0JfRU5E UE9JTlRfTlVNQkVSX01BU0spOwoKCXJldHVybiAwOwp9CgovKgogKiBQcm9iaW5nIGlzIGRvbmUg aW4gdGhlIHByb2Nlc3MgY29udGV4dCwgd2hpY2ggYWxsb3dzIHVzIHRvIGNoZWF0CiAqIGFuZCBu b3QgdG8gYnVpbGQgYSBzdGF0ZSBtYWNoaW5lIGZvciB0aGUgZGlzY292ZXJ5LgogKi8Kc3RhdGlj IGludCB1Yl9wcm9iZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwKICAgIGNvbnN0IHN0cnVj dCB1c2JfZGV2aWNlX2lkICpkZXZfaWQpCnsKCXN0cnVjdCB1Yl9kZXYgKnNjOwoJcmVxdWVzdF9x dWV1ZV90ICpxOwoJc3RydWN0IGdlbmRpc2sgKmRpc2s7CglpbnQgcmM7CglpbnQgaTsKCglyYyA9 IC1FTk9NRU07CglpZiAoKHNjID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHViX2RldiksIEdGUF9L RVJORUwpKSA9PSBOVUxMKQoJCWdvdG8gZXJyX2NvcmU7CgltZW1zZXQoc2MsIDAsIHNpemVvZihz dHJ1Y3QgdWJfZGV2KSk7CglzcGluX2xvY2tfaW5pdCgmc2MtPmxvY2spOwoJdXNiX2luaXRfdXJi KCZzYy0+d29ya191cmIpOwoJdGFza2xldF9pbml0KCZzYy0+dGFza2xldCwgdWJfc2NzaV9hY3Rp b24sICh1bnNpZ25lZCBsb25nKXNjKTsKCWF0b21pY19zZXQoJnNjLT5wb2lzb24sIDApOwoKCWlu aXRfdGltZXIoJnNjLT53b3JrX3RpbWVyKTsKCXNjLT53b3JrX3RpbWVyLmRhdGEgPSAodW5zaWdu ZWQgbG9uZykgc2M7CglzYy0+d29ya190aW1lci5mdW5jdGlvbiA9IHViX3VyYl90aW1lb3V0OwoK CXViX2luaXRfY29tcGxldGlvbigmc2MtPndvcmtfZG9uZSk7CglzYy0+d29ya19kb25lLmRvbmUg PSAxOwkJLyogQSBsaXR0bGUgeXVrLCBidXQgb2ggd2VsbC4uLiAqLwoKCXJjID0gLUVOT1NSOwoJ aWYgKChzYy0+aWQgPSB1Yl9pZF9nZXQoKSkgPT0gLTEpCgkJZ290byBlcnJfaWQ7CglzbnByaW50 ZihzYy0+bmFtZSwgOCwgRFJWX05BTUUgIiVjIiwgc2MtPmlkICsgJ2EnKTsKCglzYy0+ZGV2ID0g aW50ZXJmYWNlX3RvX3VzYmRldihpbnRmKTsKCXNjLT5pbnRmID0gaW50ZjsKCS8vIHNjLT5pZm51 bSA9IGludGYtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VOdW1iZXI7CgoJdXNiX3Nl dF9pbnRmZGF0YShpbnRmLCBzYyk7Cgl1c2JfZ2V0X2RldihzYy0+ZGV2KTsKCS8vIHVzYl9nZXRf aW50ZihzYy0+aW50Zik7CS8qIERvIHdlIG5lZWQgdGhpcz8gKi8KCgkvKiBYWFggVmVyaWZ5IHRo YXQgd2UgY2FuIGhhbmRsZSB0aGUgZGV2aWNlIChmcm9tIGRlc2NyaXB0b3JzKSAqLwoKCXViX2dl dF9waXBlcyhzYywgc2MtPmRldiwgaW50Zik7CgoJaWYgKGRldmljZV9jcmVhdGVfZmlsZSgmc2Mt PmludGYtPmRldiwgJmRldl9hdHRyX2RpYWcpICE9IDApCgkJZ290byBlcnJfZGlhZzsKCgkvKgoJ ICogQXQgdGhpcyBwb2ludCwgYWxsIFVTQiBpbml0aWFsaXphdGlvbiBpcyBkb25lLCBkbyB1cHBl ciBsYXllci4KCSAqIFdlIHJlYWxseSBoYXRlIGhhbGZ3YXkgaW5pdGlhbGl6ZWQgc3RydWN0dXJl cywgc28gZnJvbSB0aGUKCSAqIGludmFyaWFudHMgcGVyc3BlY3RpdmUsIHRoaXMgdWJfZGV2IGlz IGZ1bGx5IGNvbnN0cnVjdGVkIGF0CgkgKiB0aGlzIHBvaW50LgoJICovCgoJLyoKCSAqIFRoaXMg aXMgbmVlZGVkIHRvIGNsZWFyIHRvZ2dsZXMuIEl0IGlzIGEgcHJvYmxlbSBvbmx5IGlmIHdlIGRv CgkgKiBgcm1tb2QgdWIgJiYgbW9kcHJvYmUgdWJgIHdpdGhvdXQgZGlzY29ubmVjdHMsIGJ1dCB3 ZSBsaWtlIHRoYXQuCgkgKi8KCXViX3Byb2JlX2NsZWFyX3N0YWxsKHNjLCBzYy0+cmVjdl9idWxr X3BpcGUpOwoJdWJfcHJvYmVfY2xlYXJfc3RhbGwoc2MsIHNjLT5zZW5kX2J1bGtfcGlwZSk7CgoJ LyoKCSAqIFRoZSB3YXkgdGhpcyBpcyB1c2VkIGJ5IHRoZSBzdGFydHVwIGNvZGUgaXMgYSBsaXR0 bGUgc3BlY2lmaWMuCgkgKiBBIFNDU0kgY2hlY2sgY2F1c2VzIGEgVVNCIHN0YWxsLiBPdXIgY29t bW9uIGNhc2UgY29kZSBzZWVzIGl0CgkgKiBhbmQgY2xlYXJzIHRoZSBjaGVjaywgYWZ0ZXIgd2hp Y2ggdGhlIGRldmljZSBpcyByZWFkeSBmb3IgdXNlLgoJICogQnV0IGlmIGEgY2hlY2sgd2FzIG5v dCBwcmVzZW50LCBhbnkgY29tbWFuZCBvdGhlciB0aGFuCgkgKiBURVNUX1VOSVRfUkVBRFkgZW5k cyB3aXRoIGEgbG9ja3VwIChpbmNsdWRpbmcgUkVRVUVTVF9TRU5TRSkuCgkgKgoJICogSWYgd2Ug bmVnbGVjdCB0byBjbGVhciB0aGUgU0NTSSBjaGVjaywgdGhlIGZpcnN0IHJlYWwgY29tbWFuZCBm YWlscwoJICogKHdoaWNoIGlzIHRoZSBjYXBhY2l0eSByZWFkb3V0KS4gV2UgY2xlYXIgdGhhdCBh bmQgcmV0cnksIGJ1dCB3aHkKCSAqIGNhdXNpbmcgc3B1cmlvdXMgcmV0cmllcyBmb3Igbm8gcmVh c29uLgoJICoKCSAqIFJldmFsaWRhdGlvbiBtYXkgc3RhcnQgd2l0aCBpdHMgb3duIFRFU1RfVU5J VF9SRUFEWSwgYnV0IHRoYXQgb25lCgkgKiBoYXMgdG8gc3VjY2VlZCwgc28gd2UgY2xlYXIgY2hl Y2tzIHdpdGggYW4gYWRkaXRpb25hbCBvbmUgaGVyZS4KCSAqIEluIGFueSBjYXNlIGl0J3Mgbm90 IG91ciBidXNpbmVzcyBob3cgcmV2YWxpYWRhdGlvbiBpcyBpbXBsZW1lbnRlZC4KCSAqLwoJZm9y IChpID0gMDsgaSA8IDM7IGkrKykgewkvKiBSZXRyaWVzIGZvciBiZW5oJ3Mga2V5ICovCgkJaWYg KChyYyA9IHViX3N5bmNfdHVyKHNjKSkgPD0gMCkgYnJlYWs7CgkJaWYgKHJjICE9IDB4NikgYnJl YWs7CgkJbXNsZWVwKDEwKTsKCX0KCglzYy0+cmVtb3ZhYmxlID0gMTsJCS8qIFhYWCBRdWVyeSB0 aGlzIGZyb20gdGhlIGRldmljZSAqLwoKCXViX3JldmFsaWRhdGUoc2MpOwoJLyogVGhpcyBpcyBw cmV0dHkgbXVjaCBhIGxvbmcgdGVybSBQMyAqLwoJcHJpbnRrKEtFUk5fSU5GTyAiJXM6IGRldmlj ZSAldSBjYXBhY2l0eSBuc2VjICVsZCBic2l6ZSAldVxuIiwKCSAgICBzYy0+bmFtZSwgc2MtPmRl di0+ZGV2bnVtLCBzYy0+Y2FwYWNpdHkubnNlYywgc2MtPmNhcGFjaXR5LmJzaXplKTsKCgkvKgoJ ICogSnVzdCBvbmUgZGlzayBwZXIgc2MgY3VycmVudGx5LCBidXQgbWF5YmUgbW9yZS4KCSAqLwoJ cmMgPSAtRU5PTUVNOwoJaWYgKChkaXNrID0gYWxsb2NfZGlzayhVQl9NSU5PUlNfUEVSX01BSk9S KSkgPT0gTlVMTCkKCQlnb3RvIGVycl9kaXNrYWxsb2M7CgoJc2MtPmRpc2sgPSBkaXNrOwoJc3By aW50ZihkaXNrLT5kaXNrX25hbWUsIERSVl9OQU1FICIlYyIsIHNjLT5pZCArICdhJyk7CglzcHJp bnRmKGRpc2stPmRldmZzX25hbWUsIERFVkZTX05BTUUgIi8lYyIsIHNjLT5pZCArICdhJyk7Cglk aXNrLT5tYWpvciA9IFVCX01BSk9SOwoJZGlzay0+Zmlyc3RfbWlub3IgPSBzYy0+aWQgKiBVQl9N SU5PUlNfUEVSX01BSk9SOwoJZGlzay0+Zm9wcyA9ICZ1Yl9iZF9mb3BzOwoJZGlzay0+cHJpdmF0 ZV9kYXRhID0gc2M7CglkaXNrLT5kcml2ZXJmc19kZXYgPSAmaW50Zi0+ZGV2OwoKCXJjID0gLUVO T01FTTsKCWlmICgocSA9IGJsa19pbml0X3F1ZXVlKHViX2JkX3JxX2ZuLCAmc2MtPmxvY2spKSA9 PSBOVUxMKQoJCWdvdG8gZXJyX2Jsa3Fpbml0OwoKCWRpc2stPnF1ZXVlID0gcTsKCiAgICAgICAg Ly8gYmxrX3F1ZXVlX2JvdW5jZV9saW1pdChxLCBoYmFbaV0tPnBkZXYtPmRtYV9tYXNrKTsKCWJs a19xdWV1ZV9tYXhfaHdfc2VnbWVudHMocSwgVUJfTUFYX1JFUV9TRyk7CglibGtfcXVldWVfbWF4 X3BoeXNfc2VnbWVudHMocSwgVUJfTUFYX1JFUV9TRyk7CgkvLyBibGtfcXVldWVfc2VnbWVudF9i b3VuZGFyeShxLCBDQVJNX1NHX0JPVU5EQVJZKTsKCWJsa19xdWV1ZV9tYXhfc2VjdG9ycyhxLCBV Ql9NQVhfU0VDVE9SUyk7CglibGtfcXVldWVfaGFyZHNlY3Rfc2l6ZShxLCBzYy0+Y2FwYWNpdHku YnNpemUpOwoKCS8qCgkgKiBUaGlzIGlzIGEgc2VyaW91cyBpbmZyYWN0aW9uLCBjYXVzZWQgYnkg YSBkZWZpY2llbmN5IGluIHRoZQoJICogVVNCIHNnIGludGVyZmFjZSAodXNiX3NnX3dhaXQoKSku IFdlIHBsYW4gdG8gcmVtb3ZlIHRoaXMgb25jZQoJICogd2UgZ2V0IG1pbGVhZ2Ugb24gdGhlIGRy aXZlciBhbmQgY2FuIGp1c3RpZnkgYSBjaGFuZ2UgdG8gVVNCIEFQSS4KCSAqIFNlZSBibGtfcXVl dWVfYm91bmNlX2xpbWl0KCkgdG8gdW5kZXJzdGFuZCB0aGlzIHBhcnQuCgkgKgoJICogWFhYIEFu ZCBJIHN0aWxsIG5lZWQgdG8gYmUgYXdhcmUgb2YgdGhlIERNQSBtYXNrIGluIHRoZSBIQy4KCSAq LwoJcS0+Ym91bmNlX3BmbiA9IGJsa19tYXhfbG93X3BmbjsKCXEtPmJvdW5jZV9nZnAgPSBHRlBf Tk9JTzsKCglxLT5xdWV1ZWRhdGEgPSBzYzsKCglzZXRfY2FwYWNpdHkoZGlzaywgc2MtPmNhcGFj aXR5Lm5zZWMpOwoJaWYgKHNjLT5yZW1vdmFibGUpCgkJZGlzay0+ZmxhZ3MgfD0gR0VOSERfRkxf UkVNT1ZBQkxFOwoKCWFkZF9kaXNrKGRpc2spOwoKCXJldHVybiAwOwoKZXJyX2Jsa3Fpbml0OgoJ cHV0X2Rpc2soZGlzayk7CmVycl9kaXNrYWxsb2M6CglkZXZpY2VfcmVtb3ZlX2ZpbGUoJnNjLT5p bnRmLT5kZXYsICZkZXZfYXR0cl9kaWFnKTsKZXJyX2RpYWc6Cgl1c2Jfc2V0X2ludGZkYXRhKGlu dGYsIE5VTEwpOwoJLy8gdXNiX3B1dF9pbnRmKHNjLT5pbnRmKTsKCXVzYl9wdXRfZGV2KHNjLT5k ZXYpOwoJc3Bpbl9sb2NrX2lycSgmdWJfbG9jayk7Cgl1Yl9pZF9wdXQoc2MtPmlkKTsKCXNwaW5f dW5sb2NrX2lycSgmdWJfbG9jayk7CmVycl9pZDoKCWtmcmVlKHNjKTsKZXJyX2NvcmU6CglyZXR1 cm4gcmM7Cn0KCnN0YXRpYyB2b2lkIHViX2Rpc2Nvbm5lY3Qoc3RydWN0IHVzYl9pbnRlcmZhY2Ug KmludGYpCnsKCXN0cnVjdCB1Yl9kZXYgKnNjID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKCXN0 cnVjdCBnZW5kaXNrICpkaXNrID0gc2MtPmRpc2s7CglyZXF1ZXN0X3F1ZXVlX3QgKnEgPSBkaXNr LT5xdWV1ZTsKCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CgoJLyoKCSAqIEZlbmNlIHN0YWxsIGNsZWFy bmluZ3MsIG9wZXJhdGlvbnMgdHJpZ2dlcmVkIGJ5IHVubGlua2luZ3MgYW5kIHNvIG9uLgoJICog V2UgZG8gbm90IGF0dGVtcHQgdG8gdW5saW5rIGFueSBVUkJzLCBiZWNhdXNlIHdlIGRvIG5vdCB0 cnVzdCB0aGUKCSAqIHVubGluayBwYXRocyBpbiBIQyBkcml2ZXJzLiBBbHNvLCB3ZSBnZXQgLTg0 IHVwb24gZGlzY29ubmVjdCBhbnl3YXkuCgkgKi8KCWF0b21pY19zZXQoJnNjLT5wb2lzb24sIDEp OwoKCS8qCgkgKiBCbG93IGF3YXkgcXVldWVkIGNvbW1hbmRzLgoJICoKCSAqIEFjdHVhbGx5LCB0 aGlzIG5ldmVyIHdvcmtzLCBiZWNhdXNlIGJlZm9yZSB3ZSBnZXQgaGVyZQoJICogdGhlIEhDRCB0 ZXJtaW5hdGVzIG91dHN0YW5kaW5nIFVSQihzKS4gSXQgY2F1c2VzIG91cgoJICogU0NTSSBjb21t YW5kIHF1ZXVlIHRvIGFkdmFuY2UsIGNvbW1hbmRzIGZhaWwgdG8gc3VibWl0LAoJICogYW5kIHRo ZSB3aG9sZSBxdWV1ZSBkcmFpbnMuIFNvLCB3ZSBqdXN0IHVzZSB0aGlzIGNvZGUgdG8KCSAqIHBy aW50IHdhcm5pbmdzLgoJICovCglzcGluX2xvY2tfaXJxc2F2ZSgmc2MtPmxvY2ssIGZsYWdzKTsK CXsKCQlzdHJ1Y3QgdWJfc2NzaV9jbWQgKmNtZDsKCQlpbnQgY250ID0gMDsKCQl3aGlsZSAoKGNt ZCA9IHViX2NtZHFfcG9wKHNjKSkgIT0gTlVMTCkgewoJCQljbWQtPmVycm9yID0gLUVOT1RDT05O OwoJCQljbWQtPnN0YXRlID0gVUJfQ01EU1RfRE9ORTsKCQkJdWJfY21kdHJfc3RhdGUoc2MsIGNt ZCk7CgkJCXViX2NtZHFfcG9wKHNjKTsKCQkJKCpjbWQtPmRvbmUpKHNjLCBjbWQpOwoJCQljbnQr KzsKCQl9CgkJaWYgKGNudCAhPSAwKSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzOiAiCgkJ CSAgICAiJWQgd2FzIHF1ZXVlZCBhZnRlciBzaHV0ZG93blxuIiwgc2MtPm5hbWUsIGNudCk7CgkJ fQoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxvY2ssIGZsYWdzKTsKCgkvKgoJICog VW5yZWdpc3RlciB0aGUgdXBwZXIgbGF5ZXIsIHRoaXMgd2FpdHMgZm9yIGFsbCBjb21tYW5kcyB0 byBlbmQuCgkgKi8KCWlmIChkaXNrLT5mbGFncyAmIEdFTkhEX0ZMX1VQKQoJCWRlbF9nZW5kaXNr KGRpc2spOwoJaWYgKHEpCgkJYmxrX2NsZWFudXBfcXVldWUocSk7CgoJLyoKCSAqIFdlIHJlYWxs eSBleHBlY3QgYmxrX2NsZWFudXBfcXVldWUoKSB0byB3YWl0LCBzbyBubyBhbW91bnQKCSAqIG9m IHBhcmFub3lhIGlzIHRvbyBtdWNoLgoJICoKCSAqIFRha2luZyBhIGxvY2sgb24gYSBzdHJ1Y3R1 cmUgd2hpY2ggaXMgYWJvdXQgdG8gYmUgZnJlZWQKCSAqIGlzIHZlcnkgbm9uc2Vuc3VhbC4gSGVy ZSBpdCBpcyBsYXJnZWx5IGEgd2F5IHRvIGRvIGEgZGVidWcgZnJlZXplLAoJICogYW5kIGEgYnJh Y2tldCB3aGljaCBzaG93cyB3aGVyZSB0aGUgbm9uc2Vuc3VhbCBjb2RlIHNlZ21lbnQgZW5kcy4K CSAqCgkgKiBUZXN0aW5nIGZvciAtRUlOUFJPR1JFU1MgaXMgYWx3YXlzIGEgYnVnLCBzbyB3ZSBh cmUgYmVuZGluZwoJICogdGhlIHJ1bGVzIGEgbGl0dGxlLgoJICovCglzcGluX2xvY2tfaXJxc2F2 ZSgmc2MtPmxvY2ssIGZsYWdzKTsKCWlmIChzYy0+d29ya191cmIuc3RhdHVzID09IC1FSU5QUk9H UkVTUykgewkvKiBqYW5pdG9yczogaWdub3JlICovCgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6 ICIKCQkgICAgIlVSQiBpcyBhY3RpdmUgYWZ0ZXIgZGlzY29ubmVjdFxuIiwgc2MtPm5hbWUpOwoJ fQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2MtPmxvY2ssIGZsYWdzKTsKCgkvKgoJICogQXQg dGhpcyBwb2ludCB0aGVyZSBtdXN0IGJlIG5vIGNvbW1hbmRzIGNvbWluZyBmcm9tIGFueW9uZQoJ ICogYW5kIG5vIFVSQnMgbGVmdCBpbiB0cmFuc2l0LgoJICovCgoJZGV2aWNlX3JlbW92ZV9maWxl KCZzYy0+aW50Zi0+ZGV2LCAmZGV2X2F0dHJfZGlhZyk7Cgl1c2Jfc2V0X2ludGZkYXRhKGludGYs IE5VTEwpOwoJLy8gdXNiX3B1dF9pbnRmKHNjLT5pbnRmKTsKCXNjLT5pbnRmID0gTlVMTDsKCXVz Yl9wdXRfZGV2KHNjLT5kZXYpOwoJc2MtPmRldiA9IE5VTEw7CgoJc3Bpbl9sb2NrX2lycXNhdmUo JnViX2xvY2ssIGZsYWdzKTsKCWlmIChzYy0+b3BlbmMgPT0gMCkKCQl1Yl9jbGVhbnVwKHNjKTsK CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnViX2xvY2ssIGZsYWdzKTsKfQoKc3RydWN0IHVzYl9k cml2ZXIgdWJfZHJpdmVyID0gewoJLm93bmVyID0JVEhJU19NT0RVTEUsCgkubmFtZSA9CQkidWIi LAoJLnByb2JlID0JdWJfcHJvYmUsCgkuZGlzY29ubmVjdCA9CXViX2Rpc2Nvbm5lY3QsCgkuaWRf dGFibGUgPQl1Yl91c2JfaWRzLAp9OwoKc3RhdGljIGludCBfX2luaXQgdWJfaW5pdCh2b2lkKQp7 CglpbnQgcmM7CgoJLyogUDMgKi8gcHJpbnRrKCJ1Yjogc2l6ZW9mIHViX3Njc2lfY21kICV6dSB1 Yl9kZXYgJXp1XG4iLAoJCQlzaXplb2Yoc3RydWN0IHViX3Njc2lfY21kKSwgc2l6ZW9mKHN0cnVj dCB1Yl9kZXYpKTsKCglpZiAoKHJjID0gcmVnaXN0ZXJfYmxrZGV2KFVCX01BSk9SLCBEUlZfTkFN RSkpICE9IDApCgkJZ290byBlcnJfcmVnYmxrZGV2OwoJZGV2ZnNfbWtfZGlyKERFVkZTX05BTUUp OwoKCWlmICgocmMgPSB1c2JfcmVnaXN0ZXIoJnViX2RyaXZlcikpICE9IDApCgkJZ290byBlcnJf cmVnaXN0ZXI7CgoJcmV0dXJuIDA7CgplcnJfcmVnaXN0ZXI6CglkZXZmc19yZW1vdmUoREVWRlNf TkFNRSk7Cgl1bnJlZ2lzdGVyX2Jsa2RldihVQl9NQUpPUiwgRFJWX05BTUUpOwplcnJfcmVnYmxr ZGV2OgoJcmV0dXJuIHJjOwp9CgpzdGF0aWMgdm9pZCBfX2V4aXQgdWJfZXhpdCh2b2lkKQp7Cgl1 c2JfZGVyZWdpc3RlcigmdWJfZHJpdmVyKTsKCglkZXZmc19yZW1vdmUoREVWRlNfTkFNRSk7Cgl1 bnJlZ2lzdGVyX2Jsa2RldihVQl9NQUpPUiwgRFJWX05BTUUpOwp9Cgptb2R1bGVfaW5pdCh1Yl9p bml0KTsKbW9kdWxlX2V4aXQodWJfZXhpdCk7CgpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cg== --Multipart=_Tue__21_Sep_2004_18_44_02_-0700_BLl.GK08K_hjMtRl--