From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Ramsay Subject: RFC: dm-switch target [v2] Date: Wed, 31 Aug 2011 16:19:24 -0400 Message-ID: <20110831201919.GA27111@freewill.equallogic.com> Reply-To: device-mapper development Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com To: dm-devel@redhat.com Cc: "Shah, Parind" , "Shamberger, Jason" , "OKelley, Kevin" List-Id: dm-devel.ids Tm90ZTogVGhpcyBpcyBhIHJlcG9zdCB3aXRoIGNsZWFuZWQtdXAgY29kZSwgd2hpY2ggd2FzIG9y aWdpbmFsbHkgcG9zdGVkCmJ5IEphc29uIFNoYW1iZXJnZXIuCiAgaHR0cDovL3d3dy5yZWRoYXQu Y29tL2FyY2hpdmVzL2RtLWRldmVsLzIwMTEtTWFyY2gvbXNnMDAxMzEuaHRtbAoKLSBUaGUgbGlj ZW5zZSBpbiB0aGUgaGVhZGVycyBoYXMgYmVlbiBjbGVhcmVkIHVwIC0gVGhpcyBpcyBhbmQgYWx3 YXlzCiAgaGFzIGJlZW4gR1BMIGNvZGUuCi0gQ29kZSBmb3JtYXR0aW5nIGFuZCBzdHlsZSBtb3Jl IGNsb3NlbHkgbWF0Y2ggdGhlIExpbnV4IEtlcm5lbC4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLQoKV2UgcHJvcG9zZSBhIG5ldyBETSB0YXJnZXQsIGRtLXN3aXRjaCwgd2hpY2ggY2FuIGJl IHVzZWQgdG8gZWZmaWNpZW50bHkKaW1wbGVtZW50IGEgbWFwcGluZyBvZiBJT3MgdG8gdW5kZXJs eWluZyBibG9jayBkZXZpY2VzIGluIHNjZW5hcmlvcwp3aGVyZSB0aGVyZSBhcmU6ICgxKSBhIGxh cmdlIG51bWJlciBvZiBhZGRyZXNzIHJlZ2lvbnMsICgyKSBhIGZpeGVkIHNpemUKb2YgdGhlc2Ug YWRkcmVzcyByZWdpb25zLCAoMykgbm8gcGF0dGVybiB0aGFuIGFsbG93cyBmb3IgYSBjb21wYWN0 CmRlc2NyaXB0aW9uIHdpdGggc29tZXRoaW5nIGxpa2UgdGhlIGRtLXN0cmlwZSB0YXJnZXQuCgpN b3RpdmF0aW9uOgoKRGVsbCBFcXVhbExvZ2ljIGFuZCBzb21lIG90aGVyIGlTQ1NJIHN0b3JhZ2Ug YXJyYXlzIHVzZSBhIGRpc3RyaWJ1dGVkCmZyYW1lbGVzcyBhcmNoaXRlY3R1cmUuICBJbiB0aGlz IGFyY2hpdGVjdHVyZSwgdGhlIHN0b3JhZ2UgZ3JvdXAKY29uc2lzdHMgb2YgYSBudW1iZXIgb2Yg ZGlzdGluY3Qgc3RvcmFnZSBhcnJheXMgKCJtZW1iZXJzIiksIGVhY2ggaGF2aW5nCmluZGVwZW5k ZW50IGNvbnRyb2xsZXJzLCBkaXNrIHN0b3JhZ2UgYW5kIG5ldHdvcmsgYWRhcHRlcnMuICBXaGVu IGEgTFVOCmlzIGNyZWF0ZWQgaXQgaXMgc3ByZWFkIGFjcm9zcyBtdWx0aXBsZSBtZW1iZXJzLiAg VGhlIGRldGFpbHMgb2YgdGhlCnNwcmVhZGluZyBhcmUgaGlkZGVuIGZyb20gaW5pdGlhdG9ycyBj b25uZWN0ZWQgdG8gdGhpcyBzdG9yYWdlIHN5c3RlbS4KVGhlIHN0b3JhZ2UgZ3JvdXAgZXhwb3Nl cyBhIHNpbmdsZSB0YXJnZXQgZGlzY292ZXJ5IHBvcnRhbCwgbm8gbWF0dGVyCmhvdyBtYW55IG1l bWJlcnMgYXJlIGJlaW5nIHVzZWQuICBXaGVuIGlTQ1NJIHNlc3Npb25zIGFyZSBjcmVhdGVkLCBl YWNoCnNlc3Npb24gaXMgY29ubmVjdGVkIHRvIGFuIGV0aCBwb3J0IG9uIGEgc2luZ2xlIG1lbWJl ci4gIERhdGEgdG8gYSBMVU4KY2FuIGJlIHNlbnQgb24gYW55IGlTQ1NJIHNlc3Npb24sIGFuZCBp ZiB0aGUgYmxvY2tzIGJlaW5nIGFjY2Vzc2VkIGFyZQpzdG9yZWQgb24gYW5vdGhlciBtZW1iZXIg dGhlIElPIHdpbGwgYmUgZm9yd2FyZGVkIGFzIHJlcXVpcmVkLiAgVGhpcwpmb3J3YXJkaW5nIGlz IGludmlzaWJsZSB0byB0aGUgaW5pdGlhdG9yLiAgVGhlIHN0b3JhZ2UgbGF5b3V0IGlzIGFsc28K ZHluYW1pYywgYW5kIHRoZSBibG9ja3Mgc3RvcmVkIG9uIGRpc2sgbWF5IGJlIG1vdmVkIGZyb20g bWVtYmVyIHRvCm1lbWJlciBhcyBuZWVkZWQgdG8gYmFsYW5jZSB0aGUgbG9hZC4KClRoaXMgYXJj aGl0ZWN0dXJlIHNpbXBsaWZpZXMgdGhlIG1hbmFnZW1lbnQgYW5kIGNvbmZpZ3VyYXRpb24gb2Yg Ym90aAp0aGUgc3RvcmFnZSBncm91cCBhbmQgaW5pdGlhdG9ycy4gIEluIGEgbXVsdGlwYXRoaW5n IGNvbmZpZ3VyYXRpb24sIGl0CmlzIHBvc3NpYmxlIHRvIHNldCB1cCBtdWx0aXBsZSBpU0NTSSBz ZXNzaW9ucyB0byB1c2UgbXVsdGlwbGUgbmV0d29yawppbnRlcmZhY2VzIG9uIGJvdGggdGhlIGhv c3QgYW5kIHRhcmdldCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGUKaW5jcmVhc2VkIG5ldHdvcmsg YmFuZHdpZHRoLiAgQW4gaW5pdGlhdG9yIGNhbiB1c2UgYSBzaW1wbGUgcm91bmQgcm9iaW4KYWxn b3JpdGhtIHRvIHNlbmQgSU8gb24gYWxsIHBhdGhzIGFuZCBsZXQgdGhlIHN0b3JhZ2UgYXJyYXkg bWVtYmVycwpmb3J3YXJkIGl0IGFzIG5lY2Vzc2FyeS4gIEhvd2V2ZXIsIHRoZXJlIGlzIGEgcGVy Zm9ybWFuY2UgYWR2YW50YWdlIHRvCnNlbmRpbmcgZGF0YSBkaXJlY3RseSB0byB0aGUgY29ycmVj dCBtZW1iZXIuICBUaGUgRGV2aWNlIE1hcHBlciB0YWJsZQphcmNoaXRlY3R1cmUgc3VwcG9ydHMg ZGVzaWduYXRpbmcgZGlmZmVyZW50IGFkZHJlc3MgcmVnaW9ucyB3aXRoCmRpZmZlcmVudCB0YXJn ZXRzLiAgSG93ZXZlciwgaW4gb3VyIGFyY2hpdGVjdHVyZSB0aGUgTFVOIGlzIHNwcmVhZCB3aXRo CmEgY2h1bmsgc2l6ZSBvbiB0aGUgb3JkZXIgb2YgMTBzIG9mIE1Ccywgd2hpY2ggbWVhbnMgdGhl IHJlc3VsdGluZyBETQp0YWJsZSBjb3VsZCBoYXZlIG1vcmUgdGhhbiBhIG1pbGxpb24gZW50cmll cywgd2hpY2ggY29uc3VtZXMgdG9vIG11Y2gKbWVtb3J5LgoKU29sdXRpb246CgpCYXNlZCBvbiBl YXJsaWVyIGRpc2N1c3Npb24gd2l0aCB0aGUgZG0tZGV2ZWwgY29udHJpYnV0b3JzLCB3ZSBoYXZl CnNvbHZlZCB0aGlzIHByb2JsZW0gYnkgdXNpbmcgRGV2aWNlIE1hcHBlciB0byBidWlsZCBhIHR3 by1sYXllciBkZXZpY2UKaGllcmFyY2h5OgoKICAgIFVwcGVyIFRpZXIg4oCTIERldGVybWluZSB3 aGljaCBhcnJheSBtZW1iZXIgdGhlIElPIHNob3VsZCBiZSBzZW50IHRvLgogICAgTG93ZXIgVGll ciDigJMgTG9hZCBiYWxhbmNlIGFtb25nc3QgcGF0aHMgdG8gYSBwYXJ0aWN1bGFyIG1lbWJlci4K ClRoZSBsb3dlciB0aWVyIGNvbnNpc3RzIG9mIGEgc2luZ2xlIG11bHRpcGF0aCBkZXZpY2UgZm9y IGVhY2ggbWVtYmVyLgpFYWNoIG9mIHRoZXNlIG11bHRpcGF0aCBkZXZpY2VzIGNvbnRhaW5zIHRo ZSBzZXQgb2YgcGF0aHMgZGlyZWN0bHkgdG8KdGhlIGFycmF5IG1lbWJlciBpbiBvbmUgcHJpb3Jp dHkgZ3JvdXAsIGFuZCBsZXZlcmFnZXMgZXhpc3RpbmcgcGF0aApzZWxlY3RvcnMgdG8gbG9hZCBi YWxhbmNlIGFtb25nc3QgdGhlc2UgcGF0aHMuICBXZSBhbHNvIGJ1aWxkIGEKbm9uLXByZWZlcnJl ZCBwcmlvcml0eSBncm91cCBjb250YWluaW5nIHBhdGhzIHRvIG90aGVyIGFycmF5IG1lbWJlcnMg Zm9yCmZhaWxvdmVyIHJlYXNvbnMuCgpUaGUgdXBwZXIgdGllciBjb25zaXN0cyBvZiBhIHNpbmds ZSBzd2l0Y2ggZGV2aWNlLCB1c2luZyB0aGUgbmV3IERNCnRhcmdldCBtb2R1bGUgcHJvcG9zZWQg aGVyZS4gIFRoaXMgZGV2aWNlIHVzZXMgYSBiaXRtYXAgdG8gbG9vayB1cCB0aGUKbG9jYXRpb24g b2YgdGhlIElPIGFuZCBjaG9vc2UgdGhlIGFwcHJvcHJpYXRlIGxvd2VyIHRpZXIgZGV2aWNlIHRv IHJvdXRlCnRoZSBJTy4gIEJ5IHVzaW5nIGEgYml0bWFwIHdlIGFyZSBhYmxlIHRvIHVzZSA0IGJp dHMgZm9yIGVhY2ggYWRkcmVzcwpyYW5nZSBpbiBhIDE2IG1lbWJlciBncm91cCAod2hpY2ggaXMg dmVyeSBsYXJnZSBmb3IgdXMpLiAgVGhpcyBpcyBhIG11Y2gKZGVuc2VyIHJlcHJlc2VudGF0aW9u IHRoYW4gdGhlIERNIHRhYmxlIEItdHJlZSBjYW4gYWNoaWV2ZS4KClRob3VnaCB3ZSBoYXZlIGRl dmVsb3BlZCB0aGlzIHRhcmdldCBmb3IgYSBzcGVjaWZpYyBzdG9yYWdlIGRldmljZSwgd2UKaGF2 ZSBtYWRlIGFuIGVmZm9ydCB0byBrZWVwIGl0IGEgZ2VuZXJhbCBwdXJwb3NlIGFzIHBvc3NpYmxl IGluIGhvcGVzCnRoYXQgb3RoZXJzIG1heSBiZW5lZml0LiAgV2Ugd2VsY29tZSBhbnkgZmVlZGJh Y2sgb24gdGhlIGRlc2lnbiBvcgppbXBsZW1lbnRhdGlvbi4KCi0tLSBkbS1zd2l0Y2guaCAtLS0K Ci8qCiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDExIGJ5IERlbGwsIEluYy4gIEFsbCByaWdodHMg cmVzZXJ2ZWQuCiAqCiAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciB0aGUgR1BMLgogKgog KiBEZXNjcmlwdGlvbjoKICoKICogICAgIGZpbGU6ICAgIGRtLXN3aXRjaC5oCiAqICAgICBhdXRo b3JzOiBLZXZpbl9PS2VsbGV5QGRlbGwuY29tCiAqICAgICAgICAgICAgICBKaW1fUmFtc2F5QGRl bGwuY29tCiAqICAgICAgICAgICAgICBOYXJlbmRyYW5fR2FuYXBhdGh5QGRlbGwuY29tCiAqCiAq IFRoaXMgZmlsZSBjb250YWlucyB0aGUgbmV0bGluayBtZXNzYWdlIGRlZmluaXRpb25zIGZvciB0 aGUgInN3aXRjaCIgdGFyZ2V0LgogKgogKiBUaGUgb25seSBkZWZpbmVkIG1lc3NhZ2UgYXQgdGhp cyB0aW1lIGlzIGZvciB1cGxvYWRpbmcgdGhlIG1hcHBpbmcgcGFnZQogKiB0YWJsZS4KICovCgoj aWZuZGVmIF9fRE1fU1dJVENIX0gKI2RlZmluZSBfX0RNX1NXSVRDSF9ICgojZGVmaW5lIE1BWF9J UENfTVNHX0xFTiA2NTQ4MAkvKiBkaWN0YXRlZCBieSBuZXRsaW5rIHNvY2tldCAqLwojZGVmaW5l IE1BWF9FUlJfU1RSX0xFTiAyNTUJLyogbWF4aW11bSBsZW5ndGggb2YgdGhlIGVycm9yIHN0cmlu ZyAqLwoKZW51bSBPcGNvZGUgewoJT1BDT0RFX1BBR0VfVEFCTEVfVVBMT0FEID0gMSwKfTsKCi8q CiAqIElQQyBQYWdlIFRhYmxlIG1lc3NhZ2UKICovCnN0cnVjdCBJcGNQZ1RhYmxlIHsKCXVpbnQz Ml90IHRvdGFsX2xlbjsJLyogVG90YWwgbGVuZ3RoIG9mIHRoaXMgSVBDIG1lc3NhZ2UgKi8KCWVu dW0gT3Bjb2RlIG9wY29kZTsKCXVpbnQzMl90IHVzZXJsYW5kWzJdOwkvKiBVc2VybGFuZCBvcHRp b25hbCBkYXRhIChkbXNldHVwIHN0YXR1cykgKi8KCXVpbnQzMl90IGRldl9tYWpvcjsJLyogRE0g ZGV2aWNlIG1ham9yICovCgl1aW50MzJfdCBkZXZfbWlub3I7CS8qIERNIGRldmljZSBtaW5vciAq LwoJdWludDMyX3QgcGFnZV90b3RhbDsJLyogVG90YWwgcGFnZXMgaW4gdGhlIHZvbHVtZSAqLwoJ dWludDMyX3QgcGFnZV9vZmZzZXQ7CS8qIFN0YXJ0aW5nIHBhZ2Ugb2Zmc2V0IGZvciB0aGlzIElQ QyAqLwoJdWludDMyX3QgcGFnZV9jb3VudDsJLyogTnVtYmVyIG9mIHBhZ2UgdGFibGUgZW50cmll cyBpbiB0aGlzIElQQyAqLwoJdWludDMyX3QgcGFnZV9zaXplOwkvKiBQYWdlIHNpemUgaW4gNTEy QiBzZWN0b3JzICovCgl1aW50MTZfdCBkZXZfY291bnQ7CS8qIE51bWJlciBvZiBkZXZpY2VzICov Cgl1aW50OF90IHB0ZV9iaXRzOwkvKiBQYWdlIFRhYmxlIEVudHJ5IGZpZWxkIHNpemUgaW4gYml0 cyAqLwoJdWludDhfdCByZXNlcnZlZDsJLyogSW50ZWdlciBhbGlnbm1lbnQgICovCgl1aW50OF90 IHB0YmxfYnVmZlsxXTsJLyogUGFnZSB0YWJsZSBlbnRyaWVzICh2YXJpYWJsZSBsZW5ndGgpICov Cn07CgovKgogKiBJUEMgUmVzcG9uc2UgbWVzc2FnZQogKi8Kc3RydWN0IElwY1Jlc3BvbnNlIHsK CXVpbnQzMl90IHRvdGFsX2xlbjsJLyogdG90YWwgbGVuZ3RoIG9mIHRoZSBJUEMgKi8KCWVudW0g T3Bjb2RlIG9wY29kZTsKCXVpbnQzMl90IHVzZXJsYW5kWzJdOwkvKiBVc2VybGFuZCBvcHRpb25h bCBkYXRhICovCgl1aW50MzJfdCBkZXZfbWFqb3I7CS8qIERNIGRldmljZSBtYWpvciAqLwoJdWlu dDMyX3QgZGV2X21pbm9yOwkvKiBETSBkZXZpY2UgbWlub3IgKi8KCXVpbnQzMl90IHN0YXR1czsJ LyogMCBvbiBzdWNjZXNzOyBlcnJubyBvbiBmYWlsdXJlICovCgljaGFyIGVycl9zdHJbTUFYX0VS Ul9TVFJfTEVOICsgMV07CgkvKiBJZiBzdGF0dXMgIT0gMCwgY29udGFpbnMgYW4gaW5mb3JtYXRp dmUgZXJyb3IgbWVzc2FnZSAqLwp9OwoKLyogR2VuZXJpYyBOZXRsaW5rIGZhbWlseSBhdHRyaWJ1 dGVzOiB1c2VkIHRvIGRlZmluZSB0aGUgZmFtaWx5ICovCmVudW0gewoJTkVUTElOS19BVFRSX1VO U1BFQywKCU5FVExJTktfQVRUUl9NU0csCglORVRMSU5LX0FUVFJfX01BWCwKfTsKI2RlZmluZSBO RVRMSU5LX0FUVFJfTUFYIChORVRMSU5LX0FUVFJfX01BWCAtIDEpCgovKiBOZXRsaW5rIGNvbW1h bmRzIChvcGVyYXRpb25zKSAqLwplbnVtIHsKCU5FVExJTktfQ01EX1VOU1BFQywKCU5FVExJTktf Q01EX0dFVF9QQUdFX1RCTCwKCU5FVExJTktfQ01EX19NQVgsCn07CiNkZWZpbmUgTkVUTElOS19D TURfTUFYIChORVRMSU5LX0NNRF9fTUFYIC0gMSkKCiNlbmRpZiAvKiBfX0RNX1NXSVRDSF9IICov CgotLS0gZG0tc3dpdGNoLmMgLS0tCgovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAxMSBieSBE ZWxsLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBUaGlzIGZpbGUgaXMgcmVsZWFz ZWQgdW5kZXIgdGhlIEdQTC4KICoKICogRGVzY3JpcHRpb246CiAqCiAqICAgICBmaWxlOiAgICBk bS1zd2l0Y2guYwogKiAgICAgYXV0aG9yczogS2V2aW5fT0tlbGxleUBkZWxsLmNvbQogKiAgICAg ICAgICAgICAgSmltX1JhbXNheUBkZWxsLmNvbQogKiAgICAgICAgICAgICAgTmFyZW5kcmFuX0dh bmFwYXRoeUBkZWxsLmNvbQogKgogKiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhICJzd2l0Y2giIHRh cmdldCB3aGljaCBlZmZpY2llbnRseSBpbXBsZW1lbnRzIGEKICogbWFwcGluZyBvZiBJT3MgdG8g dW5kZXJseWluZyBibG9jayBkZXZpY2VzIGluIHNjZW5hcmlvcyB3aGVyZSB0aGVyZSBhcmU6CiAq ICAgKDEpIGEgbGFyZ2UgbnVtYmVyIG9mIGFkZHJlc3MgcmVnaW9ucwogKiAgICgyKSBhIGZpeGVk IHNpemUgZXF1YWwgYWNyb3NzIGFsbCBhZGRyZXNzIHJlZ2lvbnMKICogICAoMykgbm8gcGF0dGVy biB0aGFuIGFsbG93cyBmb3IgYSBjb21wYWN0IGRlc2NyaXB0aW9uIHdpdGggc29tZXRoaW5nIGxp a2UKICogICAgICAgdGhlIGRtLXN0cmlwZSB0YXJnZXQuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+ CiNpbmNsdWRlIDxsaW51eC9iaW8uaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUg PGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgojaW5jbHVkZSA8bGlu dXgvZG0taW9jdGwuaD4KI2luY2x1ZGUgPGxpbnV4L2RldmljZS1tYXBwZXIuaD4KI2luY2x1ZGUg PG5ldC9nZW5ldGxpbmsuaD4KI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgoKI2luY2x1ZGUgImRtLXN3 aXRjaC5oIgojZGVmaW5lIERNX01TR19QUkVGSVggInN3aXRjaCIKTU9EVUxFX0RFU0NSSVBUSU9O KERNX05BTUUKCQkgICAiIGZpeGVkLXNpemUgYWRkcmVzcy1yZWdpb24tbWFwcGluZyB0aHJvdWdo cHV0LW9yaWVudGVkIHBhdGggc2VsZWN0b3IiKTsKTU9EVUxFX0FVVEhPUigiS2V2aW4gRC4gTydL ZWxsZXkgPEtldmluX09LZWxsZXlAZGVsbC5jb20+Iik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsK CiNpZiBkZWZpbmVkKERFQlVHKSB8fCBkZWZpbmVkKF9ERUJVRykKI2RlZmluZSBEQkdQUklOVCgu Li4pICBwcmludGsoS0VSTl9ERUJVRyAjYXJncykKI2RlZmluZSBEQkdQUklOVFYoLi4uKQovKiAj ZGVmaW5lIERFQlVHX0hFWERVTVAgMSAqLwojZWxzZQojZGVmaW5lIERCR1BSSU5UKC4uLikKI2Rl ZmluZSBEQkdQUklOVFYoLi4uKQojZW5kaWYKCi8qCiAqIFN3aXRjaCBkZXZpY2UgY29udGV4dCBi bG9jazogQSBuZXcgb25lIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZG0gZGV2aWNlLgogKiBDb250YWlu cyBhbiBhcnJheSBvZiBkZXZpY2VzIGZyb20gd2hpY2ggd2UgaGF2ZSB0YWtlbiByZWZlcmVuY2Vz LgogKi8Kc3RydWN0IHN3aXRjaF9kZXYgewoJc3RydWN0IGRtX2RldiAqZG1kZXY7CglzZWN0b3Jf dCBzdGFydDsKCWF0b21pY190IGVycm9yX2NvdW50Owp9OwoKLyogU3dpdGNoIHBhZ2UgdGFibGUg YmxvY2sgKi8Kc3RydWN0IHN3aXRjaF9wdGJsIHsKCXVpbnQzMl90IHB0ZV9iaXRzOwkvKiBQYWdl IFRhYmxlIEVudHJ5IGZpZWxkIHNpemUgaW4gYml0cyAqLwoJdWludDMyX3QgcHRlX21hc2s7CS8q IFBhZ2UgVGFibGUgRW50cnkgZmllbGQgbWFzayAqLwoJdWludDMyX3QgcHRlX2ZpZWxkczsJLyog TnVtYmVyIG9mIFBhZ2UgVGFibGUgRW50cmllcyBwZXIgdWludDMyX3QgKi8KCXVpbnQzMl90IHB0 YmxfYnl0ZXM7CS8qIFBhZ2UgdGFibGUgc2l6ZSBpbiBieXRlcyAqLwoJdWludDMyX3QgcHRibF9u dW07CS8qIFBhZ2UgdGFibGUgc2l6ZSBpbiBlbnRyaWVzICovCgl1aW50MzJfdCBwdGJsX21heDsJ LyogUGFnZSB0YWJsZSBtYXhpbXVtIHNpemUgaW4gZW50cmllczsgKi8KCXVpbnQzMl90IHB0Ymxf YnVmZlswXTsJLyogQWRkcmVzcyBvZiBwYWdlIHRhYmxlICovCn07CgovKiBTd2l0Y2ggY29udGV4 dCBoZWFkZXIgKi8Kc3RydWN0IHN3aXRjaF9jdHggewoJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwoJ ZGV2X3QgZGV2X3RoaXM7CQkvKiBEZXZpY2Ugc2VydmljZWQgYnkgdGhpcyB0YXJnZXQgKi8KCXVp bnQzMl90IGRldl9jb3VudDsJLyogTnVtYmVyIG9mIGRldmljZXMgKi8KCXVpbnQzMl90IHBhZ2Vf c2l6ZTsJLyogUGFnZSBzaXplIGluIDUxMkIgc2VjdG9ycyAqLwoJdWludDMyX3QgdXNlcmxhbmRb Ml07CS8qIFVzZXJsYW5kIG9wdGlvbmFsIGRhdGEgKGRtc2V0dXAgc3RhdHVzKSAqLwoJdWludDY0 X3QgaW9zX3JlbWFwcGVkOwkvKiBJL09zIHJlbWFwcGVkICovCgl1aW50NjRfdCBpb3NfdW5tYXBw ZWQ7CS8qIEkvT3Mgbm90IHJlbWFwcGVkICovCglzcGlubG9ja190IHNwaW5sb2NrOwkvKiBDb250 cm9sIGFjY2VzcyB0byBjb3VudGVycyAqLwoKCXN0cnVjdCBzd2l0Y2hfcHRibCAqcHRibDsJLyog UGFnZSB0YWJsZSAoaWYgbG9hZGVkKSAqLwoJc3RydWN0IHN3aXRjaF9kZXYgZGV2X2xpc3RbMF07 CgkvKiBBcnJheSBvZiBkbSBkZXZpY2VzIHRvIHN3aXRjaCBiZXR3ZWVuICovCn07CgovKgogKiBH bG9iYWwgdmFyaWFibGVzCiAqLwpMSVNUX0hFQUQoX19nX2NvbnRleHRfbGlzdCk7CS8qIExpbmtl ZCBsaXN0IG9mIGNvbnRleHQgYmxvY2tzICovCnN0YXRpYyBzcGlubG9ja190IF9fZ19zcGlubG9j azsJLyogQ29udHJvbCBhY2Nlc3MgdG8gbGlzdCBvZiBjb250ZXh0IGJsb2NrcyAqLwoKLyogTGlt aXQgY2hlY2sgZm9yIHRoZSBzd2l0Y2ggY29uc3RydWN0b3IgKi8Kc3RhdGljIGludCBzd2l0Y2hf Y3RyX2xpbWl0cyhzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgc3RydWN0IGRtX2RldiAqZG0pCnsKCXN0 cnVjdCBibG9ja19kZXZpY2UgKnNkID0gZG0tPmJkZXY7CglzdHJ1Y3QgaGRfc3RydWN0ICpoZCA9 IHNkLT5iZF9wYXJ0OwoJaWYgKGhkICE9IE5VTEwpIHsKCQlEQkdQUklOVCgiJXMgc2Q9MHglcCAo JWQ6JWQpLCBoZD0weCVwLCBzdGFydD0lbGx1LCAiCgkJCSAic2l6ZT0lbGx1XG4iLCBfX2Z1bmNf Xywgc2QsIE1BSk9SKHNkLT5iZF9kZXYpLAoJCQkgTUlOT1Ioc2QtPmJkX2RldiksIGhkLAoJCQkg KHVuc2lnbmVkIGxvbmcgbG9uZyloZC0+c3RhcnRfc2VjdCwKCQkJICh1bnNpZ25lZCBsb25nIGxv bmcpaGQtPm5yX3NlY3RzKTsKCQlpZiAodGktPmxlbiA8PSBoZC0+bnJfc2VjdHMpCgkJCXJldHVy biB0cnVlOwoJCXRpLT5lcnJvciA9ICJEZXZpY2UgdG9vIHNtYWxsIGZvciB0YXJnZXQiOwoJCXJl dHVybiBmYWxzZTsKCX0KCXRpLT5lcnJvciA9ICJNaXNzaW5nIGRldmljZSBsaW1pdHMiOwoJcHJp bnRrKEtFUk5fV0FSTklORyAiJXMgJXNcbiIsIF9fZnVuY19fLCB0aS0+ZXJyb3IpOwoJcmV0dXJu IHRydWU7Cn0KCi8qCiAqIENvbnN0cnVjdG9yOiBDYWxsZWQgZWFjaCB0aW1lIGEgZG1zZXR1cCBj b21tYW5kIGNyZWF0ZXMgYSBkbSBkZXZpY2UuICBUaGUKICogdGFyZ2V0IHBhcmFtZXRlciB3aWxs IGFscmVhZHkgaGF2ZSB0aGUgdGFibGUsIHR5cGUsIGJlZ2luIGFuZCBsZW4gZmllbGRzCiAqIGZp bGxlZCBpbi4gIEFyZ3VtZW50cyBhcmUgaW4gcGFpcnM6IDxkZXZfcGF0aD4gPG9mZnNldD4uICBU aGVyZWZvcmUsIHdlIGdldAogKiBtdWx0aXBsZSBjb25zdHJ1Y3RvciBjYWxscywgYnV0IHdlIHdp bGwgbmVlZCB0byBidWlsZCBhIGxpc3Qgb2Ygc3dpdGNoX2N0eAogKiBibG9ja3Mgc28gdGhhdCB0 aGUgcGFnZSB0YWJsZSBpbmZvcm1hdGlvbiBnZXRzIG1hdGNoZWQgdG8gdGhlIGNvcnJlY3QKICog ZGV2aWNlLgogKi8Kc3RhdGljIGludCBzd2l0Y2hfY3RyKHN0cnVjdCBkbV90YXJnZXQgKnRpLCB1 bnNpZ25lZCBpbnQgYXJnYywgY2hhciAqKmFyZ3YpCnsKCWludCBuOwoJdWludDMyX3QgZGV2X2Nv dW50OwoJdW5zaWduZWQgbG9uZyBmbGFncywgbWFqb3IsIG1pbm9yOwoJdW5zaWduZWQgbG9uZyBs b25nIHN0YXJ0OwoJc3RydWN0IHN3aXRjaF9jdHggKnBjdHg7CglzdHJ1Y3QgbWFwcGVkX2Rldmlj ZSAqbWQgPSBOVUxMOwoJc3RydWN0IGRtX2RldiAqZG07Cgljb25zdCBjaGFyICpkbV9kZXZuYW1l OwoKCURCR1BSSU5UVigiJXNcbiIsIF9fZnVuY19fKTsKCWlmIChhcmdjIDwgNCkgewoJCXRpLT5l cnJvciA9ICJJbnN1ZmZpY2llbnQgYXJndW1lbnRzIjsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCWlm IChrc3RydG91MzIoYXJndlswXSwgMTAsICZkZXZfY291bnQpICE9IDApIHsKCQl0aS0+ZXJyb3Ig PSAiSW52YWxpZCBkZXZpY2UgY291bnQiOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJaWYgKGRldl9j b3VudCAhPSAoYXJnYyAtIDIpIC8gMikgewoJCXRpLT5lcnJvciA9ICJJbnZhbGlkIGFyZ3VtZW50 IGNvdW50IjsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXBjdHggPSBrbWFsbG9jKHNpemVvZigqcGN0 eCkgKyAoZGV2X2NvdW50ICogc2l6ZW9mKHN0cnVjdCBzd2l0Y2hfZGV2KSksCgkJICAgICAgIEdG UF9LRVJORUwpOwoJaWYgKHBjdHggPT0gTlVMTCkgewoJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWxs b2NhdGUgcmVkaXJlY3QgY29udGV4dCI7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglwY3R4LT5kZXZf Y291bnQgPSBkZXZfY291bnQ7CglpZiAoKGtzdHJ0b3UzMihhcmd2WzFdLCAxMCwgJnBjdHgtPnBh Z2Vfc2l6ZSkgIT0gMCkgfHwKCSAgICAocGN0eC0+cGFnZV9zaXplID09IDApKSB7CgkJdGktPmVy cm9yID0gIkludmFsaWQgcGFnZSBzaXplIjsKCQlnb3RvIGZhaWxlZF9rZnJlZTsKCX0KCXBjdHgt PnB0YmwgPSBOVUxMOwoJcGN0eC0+dXNlcmxhbmRbMF0gPSBwY3R4LT51c2VybGFuZFsxXSA9IDA7 CglwY3R4LT5pb3NfcmVtYXBwZWQgPSBwY3R4LT5pb3NfdW5tYXBwZWQgPSAwOwoJc3Bpbl9sb2Nr X2luaXQoJnBjdHgtPnNwaW5sb2NrKTsKCgkvKgoJICogRmluZCB0aGUgZGV2aWNlIG1ham9yIGFu ZCBtaW5vciBmb3IgdGhlIGRldmljZSB0aGF0IGlzIGJlaW5nIHNlcnZlZAoJICogYnkgdGhpcyB0 YXJnZXQuCgkgKi8KCW1kID0gZG1fdGFibGVfZ2V0X21kKHRpLT50YWJsZSk7CglpZiAobWQgPT0g TlVMTCkgewoJCXRpLT5lcnJvciA9ICJDYW5ub3QgbG9jYXRlIGRtIGRldmljZSI7CgkJZ290byBm YWlsZWRfa2ZyZWU7Cgl9CglkbV9kZXZuYW1lID0gZG1fZGV2aWNlX25hbWUobWQpOwoJaWYgKGRt X2Rldm5hbWUgPT0gTlVMTCkgewoJCXRpLT5lcnJvciA9ICJDYW5ub3QgYWNxdWlyZSBkbSBkZXZp Y2UgbmFtZSI7CgkJZ290byBmYWlsZWRfa2ZyZWU7Cgl9CglpZiAoc3NjYW5mKGRtX2Rldm5hbWUs ICIlbHU6JWx1IiwgJm1ham9yLCAmbWlub3IpICE9IDIpIHsKCQl0aS0+ZXJyb3IgPSAiSW52YWxp ZCBkbSBkZXZpY2UgbmFtZSI7CgkJZ290byBmYWlsZWRfa2ZyZWU7Cgl9CglwY3R4LT5kZXZfdGhp cyA9IE1LREVWKG1ham9yLCBtaW5vcik7CglEQkdQUklOVCgiJXMgY3R4PTB4JXAgKCVkOiVkKSwg dHlwZT1cIiVzXCIsIGNvdW50PSVkLCAiCgkJICJzdGFydD0lbGx1LCBzaXplPSVsbHVcbiIsCgkJ IF9fZnVuY19fLCBwY3R4LCBNQUpPUihwY3R4LT5kZXZfdGhpcyksCgkJIE1JTk9SKHBjdHgtPmRl dl90aGlzKSwgdGktPnR5cGUtPm5hbWUsIHBjdHgtPmRldl9jb3VudCwKCQkgKHVuc2lnbmVkIGxv bmcgbG9uZyl0aS0+YmVnaW4sICh1bnNpZ25lZCBsb25nIGxvbmcpdGktPmxlbik7CgoJLyoKCSAq IENoZWNrIGVhY2ggZGV2aWNlIGJlbmVhdGggdGhlIHRhcmdldCB0byBlbnN1cmUgdGhhdCB0aGUg bGltaXRzIGFyZQoJICogY29uc2lzdGVudC4KCSAqLwoJZm9yIChuID0gMCwgYXJnYyA9IDI7IG4g PCBwY3R4LT5kZXZfY291bnQ7IG4rKywgYXJnYyArPSAyKSB7CgkJREJHUFJJTlRWKCIlcyAjJWQg MHglcCwgJXMsICVzXG4iLCBfX2Z1bmNfXywgbiwKCQkJICAmcGN0eC0+ZGV2X2xpc3Rbbl0sIGFy Z3ZbYXJnY10sIGFyZ3ZbYXJnYyArIDFdKTsKCQlpZiAoc3NjYW5mKGFyZ3ZbYXJnYyArIDFdLCAi JWxsdSIsICZzdGFydCkgIT0gMSkgewoJCQl0aS0+ZXJyb3IgPSAiSW52YWxpZCBkZXZpY2Ugc3Rh cnRpbmcgb2Zmc2V0IjsKCQkJZ290byBmYWlsZWRfZGV2X2xpc3RfcHJldjsKCQl9CgkJaWYgKGRt X2dldF9kZXZpY2UKCQkgICAgKHRpLCBhcmd2W2FyZ2NdLCBkbV90YWJsZV9nZXRfbW9kZSh0aS0+ dGFibGUpLCAmZG0pKSB7CgkJCXRpLT5lcnJvciA9ICJEZXZpY2UgbG9va3VwIGZhaWxlZCI7CgkJ CWdvdG8gZmFpbGVkX2Rldl9saXN0X3ByZXY7CgkJfQoJCXBjdHgtPmRldl9saXN0W25dLmRtZGV2 ID0gZG07CgkJcGN0eC0+ZGV2X2xpc3Rbbl0uc3RhcnQgPSBzdGFydDsKCQlhdG9taWNfc2V0KCYo cGN0eC0+ZGV2X2xpc3Rbbl0uZXJyb3JfY291bnQpLCAwKTsKCQlpZiAoIXN3aXRjaF9jdHJfbGlt aXRzKHRpLCBkbSkpCgkJCWdvdG8gZmFpbGVkX2Rldl9saXN0X2FsbDsKCX0KCglzcGluX2xvY2tf aXJxc2F2ZSgmX19nX3NwaW5sb2NrLCBmbGFncyk7CglsaXN0X2FkZF90YWlsKCZwY3R4LT5saXN0 LCAmX19nX2NvbnRleHRfbGlzdCk7CglzcGluX3VubG9ja19pcnFyZXN0b3JlKCZfX2dfc3Bpbmxv Y2ssIGZsYWdzKTsKCXRpLT5wcml2YXRlID0gcGN0eDsKCXJldHVybiAwOwoKZmFpbGVkX2Rldl9s aXN0X3ByZXY6CQkvKiBEZS1yZWZlcmVuY2UgcHJldmlvdXMgZGV2aWNlcyAqLwoJbi0tOwkJCS8q ICAgKGkuZS4gZG9uJ3QgaW5jbHVkZSB0aGlzIG9uZSkgKi8KCmZhaWxlZF9kZXZfbGlzdF9hbGw6 CQkvKiBEZS1yZWZlcmVuY2UgYWxsIGRldmljZXMgICovCglwcmludGsoS0VSTl9XQVJOSU5HICIl cyBkZXZpY2U9JXMsIHN0YXJ0PSVzXG4iLCBfX2Z1bmNfXywKCSAgICAgICBhcmd2W2FyZ2NdLCBh cmd2W2FyZ2MgKyAxXSk7Cglmb3IgKDsgbiA+PSAwOyBuLS0pCgkJZG1fcHV0X2RldmljZSh0aSwg cGN0eC0+ZGV2X2xpc3Rbbl0uZG1kZXYpOwoKZmFpbGVkX2tmcmVlOgoJcHJpbnRrKEtFUk5fV0FS TklORyAiJXMgJXNcbiIsIF9fZnVuY19fLCB0aS0+ZXJyb3IpOwoJa2ZyZWUocGN0eCk7CglyZXR1 cm4gLUVJTlZBTDsKfQoKLyoKICogRGVzdHJ1Y3RvcjogRG9uJ3QgZnJlZSB0aGUgZG1fdGFyZ2V0 LCBqdXN0IHRoZSB0aS0+cHJpdmF0ZSBkYXRhIChpZiBhbnkpLgogKi8Kc3RhdGljIHZvaWQgc3dp dGNoX2R0cihzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSkKewoJaW50IG47Cgl1bnNpZ25lZCBsb25nIGZs YWdzOwoJc3RydWN0IHN3aXRjaF9jdHggKnBjdHggPSAoc3RydWN0IHN3aXRjaF9jdHggKil0aS0+ cHJpdmF0ZTsKCXZvaWQgKnB0Ymw7CgoJREJHUFJJTlQoIiVzIGN0eD0weCVwICglZDolZClcbiIs IF9fZnVuY19fLCBwY3R4LAoJCSBNQUpPUihwY3R4LT5kZXZfdGhpcyksIE1JTk9SKHBjdHgtPmRl dl90aGlzKSk7CglzcGluX2xvY2tfaXJxc2F2ZSgmX19nX3NwaW5sb2NrLCBmbGFncyk7CglwdGJs ID0gcGN0eC0+cHRibDsKCXJjdV9hc3NpZ25fcG9pbnRlcihwY3R4LT5wdGJsLCBOVUxMKTsKCWxp c3RfZGVsKCZwY3R4LT5saXN0KTsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJl9fZ19zcGlubG9j aywgZmxhZ3MpOwoJZm9yIChuID0gMDsgbiA8IHBjdHgtPmRldl9jb3VudDsgbisrKSB7CgkJREJH UFJJTlRWKCIlcyBkbV9wdXRfZGV2aWNlKCVzKVxuIiwgX19mdW5jX18sCgkJCSAgcGN0eC0+ZGV2 X2xpc3Rbbl0uZG1kZXYtPm5hbWUpOwoJCWRtX3B1dF9kZXZpY2UodGksIHBjdHgtPmRldl9saXN0 W25dLmRtZGV2KTsKCX0KCXN5bmNocm9uaXplX3JjdSgpOwoJa2ZyZWUocHRibCk7CglrZnJlZShw Y3R4KTsKfQoKLyoKICogTk9URTogSWYgQ09ORklHX0xCRCBpcyBkaXNhYmxlZCwgc2VjdG9yX3Qg dHlwZXMgYXJlIHVpbnQzMl90LiAgVGhlcmVmb3JlLCBpbgogKiB0aGlzIHJvdXRpbmUsIHdlIGNv bnZlcnQgdGhlIG9mZnNldCBpbnRvIGEgdWludDY0X3QgaW5zdGVhZCBvZiBhIHNlY3Rvcl90IHNv CiAqIHRoYXQgYWxsIG9mIHRoZSByZW1haW5pbmcgYXJpdGhtYXRpYyBpcyBjb3JyZWN0LCBpbmNs dWRpbmcgdGhlIGRvX2RpdigpCiAqIGNhbGxzLgogKi8Kc3RhdGljIGludCBzd2l0Y2hfbWFwKHN0 cnVjdCBkbV90YXJnZXQgKnRpLCBzdHJ1Y3QgYmlvICpiaW8sCgkJICAgICAgdW5pb24gbWFwX2lu Zm8gKm1hcF9jb250ZXh0KQp7CglzdHJ1Y3Qgc3dpdGNoX2N0eCAqcGN0eCA9IChzdHJ1Y3Qgc3dp dGNoX2N0eCAqKXRpLT5wcml2YXRlOwoJc3RydWN0IHN3aXRjaF9wdGJsICpwdGJsOwoJdW5zaWdu ZWQgbG9uZyBmbGFnczsKCXVpbnQ2NF90IGl0YmwsIG9mZnNldCA9IGJpby0+Ymlfc2VjdG9yIC0g dGktPmJlZ2luOwoJdWludDMyX3QgaWRldiA9IDAsIGlyZW07Cgl1aW50NjRfdCAqcGluYyA9ICZw Y3R4LT5pb3NfdW5tYXBwZWQ7CgoJcmN1X3JlYWRfbG9jaygpOwoJcHRibCA9IHJjdV9kZXJlZmVy ZW5jZShwY3R4LT5wdGJsKTsKCWlmIChwdGJsICE9IE5VTEwpIHsKCQlpdGJsID0gb2Zmc2V0OwoJ CWRvX2RpdihpdGJsLCBwY3R4LT5wYWdlX3NpemUpOwoJCWlmIChpdGJsIDwgcHRibC0+cHRibF9u dW0pIHsKCQkJaXJlbSA9IGRvX2RpdihpdGJsLCBwdGJsLT5wdGVfZmllbGRzKTsKCQkJaWRldiA9 CgkJCSAgICAocHRibC0+cHRibF9idWZmW2l0YmxdID4+IChpcmVtICogcHRibC0+cHRlX2JpdHMp KQoJCQkgICAgJiBwdGJsLT5wdGVfbWFzazsKCQkJaWYgKGlkZXYgPD0gcGN0eC0+ZGV2X2NvdW50 KSB7CgkJCQlwaW5jID0gJnBjdHgtPmlvc19yZW1hcHBlZDsKCQkJfSBlbHNlIHsKCQkJCXByaW50 ayhLRVJOX1dBUk5JTkcgIiVzIFdBUk5JTkc6IGRldj0lZCwgIgoJCQkJICAgICAgICJvZmZzZXQ9 JWxsZFxuIiwgX19mdW5jX18sIGlkZXYsIG9mZnNldCk7CgkJCQlpZGV2ID0gMDsKCQkJfQoJCX0g ZWxzZSB7CgkJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIFdBUk5JTkc6IFBhZ2UgVGFibGUgRW50 cnkgIgoJCQkgICAgICAgIiVsbGQgPj0gJWRcbiIsIF9fZnVuY19fLCBpdGJsLCBwdGJsLT5wdGJs X251bSk7CgkJfQoJfQoJcmN1X3JlYWRfdW5sb2NrKCk7CglzcGluX2xvY2tfaXJxc2F2ZSgmcGN0 eC0+c3BpbmxvY2ssIGZsYWdzKTsKCSgqcGluYykrKzsKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnBjdHgtPnNwaW5sb2NrLCBmbGFncyk7CgliaW8tPmJpX2JkZXYgPSBwY3R4LT5kZXZfbGlzdFtp ZGV2XS5kbWRldi0+YmRldjsKCWJpby0+Ymlfc2VjdG9yID0gcGN0eC0+ZGV2X2xpc3RbaWRldl0u c3RhcnQgKyBvZmZzZXQ7CglyZXR1cm4gRE1fTUFQSU9fUkVNQVBQRUQ7Cn0KCi8qCiAqIFN3aXRj aCBzdGF0dXM6CiAqCiAqIElORk86ICNkZXZfY291bnQgZGV2aWNlIFtkZXZpY2VdIDUgJ0EnWydB JyAuLi5dIHVzZXJsYW5kWzBdIHVzZXJsYW5kWzFdCiAqICAgICAgICNyZW1hcHBlZCAjdW5tYXBw ZWQKICoKICogd2hlcmU6CiAqICAgIidBJ1snQSddIiBpcyBhIHNpbmdsZSB3b3JkIHdpdGggYW4g J0EnIChhY3RpdmUpIG9yICdEJyBmb3IgZWFjaCBkZXZpY2UKICogICBUaGUgdXNlcmxhbmQgdmFs dWVzIGFyZSBzZXQgYnkgdGhlIGxhc3QgdXNlcmxhbmQgbWVzc2FnZSB0byBsb2FkIHRoZSBwYWdl CiAqICAgdGFibGUKICogICAiI3JlbWFwcGVkIiBpcyB0aGUgbnVtYmVyIG9mIHJlbWFwcGVkIEkv T3MKICogICAiI3VubWFwcGVkIiBpcyB0aGUgbnVtYmVyIG9mIEkvT3MgdGhhdCBjb3VsZCBub3Qg YmUgcmVtYXBwZWQKICoKICogVEFCTEU6ICNwYWdlX3NpemUgI2Rldl9jb3VudCBkZXZpY2Ugc3Rh cnQgW2RldmljZSBzdGFydCAuLi5dCiAqLwpzdGF0aWMgaW50IHN3aXRjaF9zdGF0dXMoc3RydWN0 IGRtX3RhcmdldCAqdGksIHN0YXR1c190eXBlX3QgdHlwZSwgY2hhcgoJCQkgKnJlc3VsdCwgdW5z aWduZWQgaW50IG1heGxlbikKewoJc3RydWN0IHN3aXRjaF9jdHggKnBjdHggPSAoc3RydWN0IHN3 aXRjaF9jdHggKil0aS0+cHJpdmF0ZTsKCWNoYXIgYnVmZmVyW3BjdHgtPmRldl9jb3VudCArIDFd OwoJdW5zaWduZWQgaW50IHN6ID0gMDsKCWludCBuOwoJdWludDY0X3QgcmVtYXBwZWQsIHVubWFw cGVkOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCglyZXN1bHRbMF0gPSAnXDAnOwoJc3dpdGNoICh0 eXBlKSB7CgljYXNlIFNUQVRVU1RZUEVfSU5GTzoKCQlETUVNSVQoIiVkIiwgcGN0eC0+ZGV2X2Nv dW50KTsKCQlmb3IgKG4gPSAwOyBuIDwgcGN0eC0+ZGV2X2NvdW50OyBuKyspIHsKCQkJRE1FTUlU KCIgJXMiLCBwY3R4LT5kZXZfbGlzdFtuXS5kbWRldi0+bmFtZSk7CgkJCWJ1ZmZlcltuXSA9ICdB JzsKCQl9CgkJYnVmZmVyW25dID0gJ1wwJzsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGN0eC0+c3Bp bmxvY2ssIGZsYWdzKTsKCQlyZW1hcHBlZCA9IHBjdHgtPmlvc19yZW1hcHBlZDsKCQl1bm1hcHBl ZCA9IHBjdHgtPmlvc191bm1hcHBlZDsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwY3R4LT5z cGlubG9jaywgZmxhZ3MpOwoJCURNRU1JVCgiIDUgJXMgJTA4eCAlMDh4ICVsbGQgJWxsZCIsIGJ1 ZmZlciwgcGN0eC0+dXNlcmxhbmRbMF0sCgkJICAgICAgIHBjdHgtPnVzZXJsYW5kWzFdLCByZW1h cHBlZCwgdW5tYXBwZWQpOwoJCWJyZWFrOwoKCWNhc2UgU1RBVFVTVFlQRV9UQUJMRToKCQlETUVN SVQoIiVkICVkIiwgcGN0eC0+ZGV2X2NvdW50LCBwY3R4LT5wYWdlX3NpemUpOwoJCWZvciAobiA9 IDA7IG4gPCBwY3R4LT5kZXZfY291bnQ7IG4rKykgewoJCQlETUVNSVQoIiAlcyAlbGx1IiwgcGN0 eC0+ZGV2X2xpc3Rbbl0uZG1kZXYtPm5hbWUsCgkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25n KXBjdHgtPmRldl9saXN0W25dLnN0YXJ0KTsKCQl9CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlyZXR1 cm4gMDsKCX0KCXJldHVybiAwOwp9CgovKgogKiBTd2l0Y2ggaW9jdGw6CiAqCiAqIFBhc3N0aHJv dWdoIGFsbCBpb2N0bHMgdG8gdGhlIGZpcnN0IHBhdGguCiAqLwpzdGF0aWMgaW50IHN3aXRjaF9p b2N0bChzdHJ1Y3QgZG1fdGFyZ2V0ICp0aSwgdW5zaWduZWQgaW50IGNtZCwKCQkJdW5zaWduZWQg bG9uZyBhcmcpCnsKCXN0cnVjdCBzd2l0Y2hfY3R4ICpwY3R4ID0gKHN0cnVjdCBzd2l0Y2hfY3R4 ICopdGktPnByaXZhdGU7CglzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2OwoJZm1vZGVfdCBtb2Rl ID0gMDsKCgkvKiBTYW5pdHkgY2hlY2sgKi8KCWlmICh1bmxpa2VseSghcGN0eCB8fCAhcGN0eC0+ ZGV2X2xpc3RbMF0uZG1kZXYgfHwKCQkgICAgICFwY3R4LT5kZXZfbGlzdFswXS5kbWRldi0+YmRl dikpCgkJcmV0dXJuIC1FSU87CgoJYmRldiA9IHBjdHgtPmRldl9saXN0WzBdLmRtZGV2LT5iZGV2 OwoJbW9kZSA9IHBjdHgtPmRldl9saXN0WzBdLmRtZGV2LT5tb2RlOwoJcmV0dXJuIF9fYmxrZGV2 X2RyaXZlcl9pb2N0bChiZGV2LCBtb2RlLCBjbWQsIGFyZyk7Cn0KCnN0YXRpYyBzdHJ1Y3QgdGFy Z2V0X3R5cGUgX19nX3N3aXRjaF90YXJnZXQgPSB7CgkubmFtZSA9ICJzd2l0Y2giLAoJLnZlcnNp b24gPSB7MSwgMCwgMH0sCgkubW9kdWxlID0gVEhJU19NT0RVTEUsCgkuY3RyID0gc3dpdGNoX2N0 ciwKCS5kdHIgPSBzd2l0Y2hfZHRyLAoJLm1hcCA9IHN3aXRjaF9tYXAsCgkuc3RhdHVzID0gc3dp dGNoX3N0YXR1cywKCS5pb2N0bCA9IHN3aXRjaF9pb2N0bCwKfTsKCi8qIEdlbmVyaWMgTmV0bGlu ayBhdHRyaWJ1dGUgcG9saWN5IChzaW5nbGUgYXR0cmlidXRlLCBORVRMSU5LX0FUVFJfTVNHKSAq LwpzdGF0aWMgc3RydWN0IG5sYV9wb2xpY3kgX19nX2F0dHJfcG9saWN5W05FVExJTktfQVRUUl9N QVggKyAxXSA9IHsKCVtORVRMSU5LX0FUVFJfTVNHXSA9IHsudHlwZSA9IE5MQV9CSU5BUlksLmxl biA9IE1BWF9JUENfTVNHX0xFTn0sCn07CgovKiBEZWZpbmUgdGhlIEdlbmVyaWMgTmV0bGluayBm YW1pbHkgKi8Kc3RhdGljIHN0cnVjdCBnZW5sX2ZhbWlseSBfX2dfZmFtaWx5ID0gewoJLmlkID0g R0VOTF9JRF9HRU5FUkFURSwJLyogQXNzaWduIGNoYW5uZWwgd2hlbiBmYW1pbHkgaXMgcmVnaXN0 ZXJlZCAqLwoJLmhkcnNpemUgPSAwLAoJLm5hbWUgPSAiRE1fU1dJVENIIiwKCS52ZXJzaW9uID0g MSwKCS5tYXhhdHRyID0gTkVUTElOS19BVFRSX01BWCwKfTsKCiNpZmRlZiBERUJVR19IRVhEVU1Q CiNkZWZpbmUgREVCVUdfSEVYRFVNUF9XT1JEUyA4CiNkZWZpbmUgREVCVUdfSEVYRFVNUF9CWVRF UyAoREVCVUdfSEVYRFVNUF9XT1JEUyAqIHNpemVvZih1aW50MzJfdCkpCgpzdGF0aWMgaW5saW5l IHZvaWQgZGVidWdfaGV4ZHVtcF9saW5lKHZvaWQgKmlidWZmLCBzaXplX3Qgb2Zmc2V0LCBzaXpl X3QgaXNpemUsCgkJCQkgICAgICBjb25zdCBjaGFyICpmdW5jKQp7CglzdGF0aWMgY29uc3QgY2hh ciAqaGV4ID0gIjAxMjM0NTY3ODlhYmNkZWYiOwoJdW5zaWduZWQgY2hhciAqaXB0ciA9ICYoKHVu c2lnbmVkIGNoYXIgKilpYnVmZilbb2Zmc2V0XTsKCWNoYXIgKm9wdHIsIG9idWZmW0RFQlVHX0hF WERVTVBfQllURVMgKiAzXTsKCWludCBvc2l6ZTsKCgl3aGlsZSAoaXNpemUgPiAwKSB7CgkJb3B0 ciA9IG9idWZmOwoJCWZvciAob3NpemUgPSAwOyBvc2l6ZSA8IERFQlVHX0hFWERVTVBfQllURVM7 IG9zaXplKyspIHsKCQkJaWYgKCgob3NpemUgJiAzKSA9PSAwKSAmJiAob3NpemUgIT0gMCkpCgkJ CQkqb3B0cisrID0gJyAnOwoJCQkqb3B0cisrID0gaGV4WygqaXB0cikgPj4gNF07CgkJCSpvcHRy KysgPSBoZXhbKCppcHRyKyspICYgMTVdOwoJCQlpZiAoLS1pc2l6ZSA8PSAwKQoJCQkJYnJlYWs7 CgkJfQoJCSpvcHRyID0gJ1wwJzsKCQlEQkdQUklOVCgiJXMgJTA0eCAlc1xuIiwgZnVuYywgKHVu c2lnbmVkIGludClvZmZzZXQsIG9idWZmKTsKCQlvZmZzZXQgKz0gREVCVUdfSEVYRFVNUF9CWVRF UzsKCX0KfQoKc3RhdGljIGlubGluZSB2b2lkIGRlYnVnX2hleGR1bXAodm9pZCAqaWJ1ZmYsIHNp emVfdCBpc2l6ZSwgY29uc3QgY2hhciAqZnVuYykKewoJc2l6ZV90IGlsaW5lID0gaXNpemUgLyBE RUJVR19IRVhEVU1QX0JZVEVTOwoJc2l6ZV90IGlyZW0gPSBpc2l6ZSAlIERFQlVHX0hFWERVTVBf QllURVM7CglzaXplX3Qgb2Zmc2V0ID0gaXNpemU7CgoJaWYgKGlsaW5lIDwgNikgewoJCWRlYnVn X2hleGR1bXBfbGluZShpYnVmZiwgMCwgaXNpemUsIGZ1bmMpOwoJCXJldHVybjsKCX0KCWRlYnVn X2hleGR1bXBfbGluZShpYnVmZiwgMCwgKDMgKiBERUJVR19IRVhEVU1QX0JZVEVTKSwgZnVuYyk7 Cglpc2l6ZSA9IChpcmVtID09IDApID8gKDMgKiBERUJVR19IRVhEVU1QX0JZVEVTKQoJICAgIDog KCgyICogREVCVUdfSEVYRFVNUF9CWVRFUykgKyBpcmVtKTsKCW9mZnNldCAtPSBpc2l6ZTsKCWRl YnVnX2hleGR1bXBfbGluZShpYnVmZiwgb2Zmc2V0LCBpc2l6ZSwgZnVuYyk7Cn0KI2Vsc2UKc3Rh dGljIGlubGluZSB2b2lkIGRlYnVnX2hleGR1bXAodm9pZCAqaWJ1ZmYsIHNpemVfdCBpc2l6ZSwg Y29uc3QgY2hhciAqZnVuYykKewp9CiNlbmRpZgoKLyoKICogR2VuZXJpYyBOZXRsaW5rIHNvY2tl dCByZWFkIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBjb21tdW5pY2F0aW9uIGZyb20gdGhlCiAqIHVz ZXJsYW5kIGZvciBkb3dubG9hZGluZyB0aGUgcGFnZSB0YWJsZS4KICovCnN0YXRpYyBpbnQgZ2V0 X3BhZ2VfdGJsKHN0cnVjdCBza19idWZmICpza2JfMiwgc3RydWN0IGdlbmxfaW5mbyAqaW5mbykK ewoJdWludDMyX3QgcmMsIHB0ZV9tYXNrLCBwdGVfZmllbGRzLCBwdGJsX2J5dGVzLCBvZmZzZXQs IHNpemU7Cgl1aW50MzJfdCBzdGF0dXMgPSAwOwoJdW5zaWduZWQgbG9uZyBmbGFnczsKCWNoYXIg Km15ZGF0YTsKCXZvaWQgKm1zZ19oZWFkOwoJc3RydWN0IG5sYXR0ciAqbmE7CglzdHJ1Y3Qgc2tf YnVmZiAqc2tiOwoJc3RydWN0IHN3aXRjaF9jdHggKnBjdHgsICpuZXh0OwoJc3RydWN0IHN3aXRj aF9wdGJsICpwdGJsLCAqcG5ldzsKCXN0cnVjdCBJcGNQZ1RhYmxlICpwZ3A7CglzdHJ1Y3QgSXBj UmVzcG9uc2UgcmVzcDsKCWRldl90IGRldjsKCXN0YXRpYyBjb25zdCBjaGFyICppbnZtc2cgPSAi SW52YWxpZCBQYWdlIFRhYmxlIG1lc3NhZ2UiOwoKCS8qCgkgKiBGb3IgZWFjaCBhdHRyaWJ1dGUg dGhlcmUgaXMgYW4gaW5kZXggaW4gaW5mby0+YXR0cnMgd2hpY2ggcG9pbnRzIHRvCgkgKiBhIG5s YXR0ciBzdHJ1Y3R1cmUgaW4gdGhpcyBzdHJ1Y3R1cmUgdGhlIGRhdGEgaXMgZ2l2ZW4KCSAqLwoJ aWYgKGluZm8gPT0gTlVMTCkgewoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIG1pc3NpbmcgZ2Vu bF9pbmZvIHBhcmFtZXRlclxuIiwKCQkgICAgICAgX19mdW5jX18pOwoJCXJldHVybiAwOwoJfQoJ bmEgPSBpbmZvLT5hdHRyc1tORVRMSU5LX0FUVFJfTVNHXTsKCWlmIChuYSA9PSBOVUxMKSB7CgkJ cHJpbnRrKEtFUk5fV0FSTklORyAiJXMgbm8gaW5mby0+YXR0cnMgJWlcbiIsIF9fZnVuY19fLAoJ CSAgICAgICBORVRMSU5LX0FUVFJfTVNHKTsKCQlyZXR1cm4gMDsKCX0KCW15ZGF0YSA9IChjaGFy ICopbmxhX2RhdGEobmEpOwoJaWYgKG15ZGF0YSA9PSBOVUxMKSB7CgkJcHJpbnRrKEtFUk5fV0FS TklORyAiJXMgZXJyb3Igd2hpbGUgcmVjZWl2aW5nIGRhdGFcbiIsCgkJICAgICAgIF9fZnVuY19f KTsKCQlyZXR1cm4gMDsKCX0KCURCR1BSSU5UVigiJXMgc2VxPSVkLCBwaWQ9JWQsIHR5cGU9JWQs IGZsYWdzPTB4JXgsIGRhdGE9MHglcCAiCgkJICAiKDB4JXgsICVkKVxuIiwKCQkgIF9fZnVuY19f LCBpbmZvLT5zbmRfc2VxLCBpbmZvLT5zbmRfcGlkLAoJCSAgaW5mby0+bmxoZHItPm5sbXNnX3R5 cGUsIGluZm8tPm5saGRyLT5ubG1zZ19mbGFncywKCQkgIG15ZGF0YSwgbmEtPm5sYV9sZW4sIG5h LT5ubGFfbGVuKTsKCWRlYnVnX2hleGR1bXAobXlkYXRhLAoJCSAgICAgICgob2Zmc2V0b2Yoc3Ry dWN0IElwY1BnVGFibGUsIHB0YmxfYnVmZik8bmEtPm5sYV9sZW4pCgkJICAgICAgID8gb2Zmc2V0 b2Yoc3RydWN0IElwY1BnVGFibGUsIHB0YmxfYnVmZikKCQkgICAgICAgOiBuYS0+bmxhX2xlbiks IF9fZnVuY19fKTsKCS8qCgkgKiBGb3JtYXQgdGhlIHJlcGx5IG1lc3NhZ2UuICBSZXR1cm4gcG9z aXR2ZSBlcnJvciBjb2RlcyB0byB1c2VybGFuZC4KCSAqLwoJc2tiID0gbmxtc2dfbmV3KE5MTVNH X0dPT0RTSVpFLCBHRlBfS0VSTkVMKTsKCWlmIChza2IgPT0gTlVMTCkgewoJCXByaW50ayhLRVJO X1dBUk5JTkcgIiVzIGNhbm5vdCBhbGxvY2F0ZSByZXBseSBtZXNzYWdlXG4iLAoJCSAgICAgICBf X2Z1bmNfXyk7CgkJcmV0dXJuIDA7Cgl9Cgltc2dfaGVhZCA9IGdlbmxtc2dfcHV0KHNrYiwgMCwg aW5mby0+c25kX3NlcSwgJl9fZ19mYW1pbHksIDAsCgkJCSAgICAgICBORVRMSU5LX0NNRF9HRVRf UEFHRV9UQkwpOwoJaWYgKHNrYiA9PSBOVUxMKSB7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXMg Y2Fubm90IGZvcm1hdCByZXBseSBtZXNzYWdlIGhlYWRlclxuIiwKCQkgICAgICAgX19mdW5jX18p OwoJCXJldHVybiAwOwoJfQoJcGdwID0gKHN0cnVjdCBJcGNQZ1RhYmxlICopbXlkYXRhOwoJaWYg KG5hLT5ubGFfbGVuIDwgc2l6ZW9mKHN0cnVjdCBJcGNQZ1RhYmxlKSkgewoJCXNucHJpbnRmKHJl c3AuZXJyX3N0ciwgc2l6ZW9mKHJlc3AuZXJyX3N0ciksCgkJCSAiJXM6IHRvbyBzaG9ydCAoJWQp IiwgaW52bXNnLCBuYS0+bmxhX2xlbik7CgkJc3RhdHVzID0gRUlOVkFMOwoJCWdvdG8gZmFpbGVk X3Jlc3BvbmQ7Cgl9CglpZiAoKHBncC0+cGFnZV9vZmZzZXQgKyBwZ3AtPnBhZ2VfY291bnQpID4g cGdwLT5wYWdlX3RvdGFsKSB7CgkJc25wcmludGYocmVzcC5lcnJfc3RyLCBzaXplb2YocmVzcC5l cnJfc3RyKSwKCQkJICIlczogdG9vIG1hbnkgcGFnZSB0YWJsZSBlbnRyaWVzICglZCA+ICVkKSIs CgkJCSBpbnZtc2csIChwZ3AtPnBhZ2Vfb2Zmc2V0ICsgcGdwLT5wYWdlX2NvdW50KSwKCQkJIHBn cC0+cGFnZV90b3RhbCk7CgkJc3RhdHVzID0gRUlOVkFMOwoJCWdvdG8gZmFpbGVkX3Jlc3BvbmQ7 Cgl9CglwdGVfbWFzayA9ICgxIDw8IHBncC0+cHRlX2JpdHMpIC0gMTsKCWlmICgoKHBncC0+ZGV2 X2NvdW50IC0gMSkgJiAofnB0ZV9tYXNrKSkgIT0gMCkgewoJCXNucHJpbnRmKHJlc3AuZXJyX3N0 ciwgc2l6ZW9mKHJlc3AuZXJyX3N0ciksCgkJCSAiJXM6IGludmFsaWQgbWFzayAweCV4IGZvciAl ZCBkZXZpY2VzIiwKCQkJIGludm1zZywgcHRlX21hc2ssIHBncC0+ZGV2X2NvdW50KTsKCQlzdGF0 dXMgPSBFSU5WQUw7CgkJZ290byBmYWlsZWRfcmVzcG9uZDsKCX0KCXB0ZV9maWVsZHMgPSAzMiAv IHBncC0+cHRlX2JpdHM7CglzaXplID0gKChwZ3AtPnBhZ2VfY291bnQgKyBwdGVfZmllbGRzIC0g MSkgLyBwdGVfZmllbGRzKSAqCgkgICAgc2l6ZW9mKHVpbnQzMl90KTsKCWlmICgoc2l6ZW9mKCpw Z3ApIC0gMSArIHNpemUpID4gbmEtPm5sYV9sZW4pIHsKCQlzbnByaW50ZihyZXNwLmVycl9zdHIs IHNpemVvZihyZXNwLmVycl9zdHIpLAoJCQkgIkludmFsaWQgUGFnZSBUYWJsZSBtZXNzYWdlOiBp bmNvbXBsZXRlIG1lc3NzYWdlIik7CgkJc3RhdHVzID0gRUlOVkFMOwoJCWdvdG8gZmFpbGVkX3Jl c3BvbmQ7Cgl9CglkZWJ1Z19oZXhkdW1wKCZwZ3AtPnB0YmxfYnVmZiwgc2l6ZSwgX19mdW5jX18p OwoKCS8qCgkgKiBMb29rIGZvciB0aGUgY29ycmVzcG9uZGluZyBzd2l0Y2ggY29udGV4dCBibG9j ayB0byBjcmVhdGUgb3IgdXBkYXRlCgkgKiB0aGUgcGFnZSB0YWJsZS4KCSAqLwoJcmMgPSAwOwoJ ZGV2ID0gTUtERVYocGdwLT5kZXZfbWFqb3IsIHBncC0+ZGV2X21pbm9yKTsKCXNwaW5fbG9ja19p cnFzYXZlKCZfX2dfc3BpbmxvY2ssIGZsYWdzKTsKCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShw Y3R4LCBuZXh0LCAmX19nX2NvbnRleHRfbGlzdCwgbGlzdCkgewoJCWlmIChkZXYgPT0gcGN0eC0+ ZGV2X3RoaXMpIHsKCQkJcmMgPSAxOwoJCQlicmVhazsKCQl9Cgl9CglpZiAocmMgPT0gMCkgewoJ CXNucHJpbnRmKHJlc3AuZXJyX3N0ciwgc2l6ZW9mKHJlc3AuZXJyX3N0ciksCgkJCSAiJXM6IGlu dmFsaWQgdGFyZ2V0IGRldmljZSAlZDolZCIsCgkJCSBpbnZtc2csIHBncC0+ZGV2X21ham9yLCBw Z3AtPmRldl9taW5vcik7CgkJc3RhdHVzID0gRUlOVkFMOwoJCWdvdG8gZmFpbGVkX3VubG9jazsK CX0KCURCR1BSSU5UVigiJXMgY3R4PTB4JXAgKCVkOiVkKVxuIiwgX19mdW5jX18sIHBjdHgsIHBn cC0+ZGV2X21ham9yLAoJCSAgcGdwLT5kZXZfbWlub3IpOwoKCXB0YmwgPSBwY3R4LT5wdGJsOwoJ aWYgKCgocHRibCAhPSBOVUxMKSAmJiAocGdwLT5wYWdlX29mZnNldCA+IChwdGJsLT5wdGJsX251 bSArIDEpKSkgfHwKCSAgICAoKHB0YmwgPT0gTlVMTCkgJiYgKHBncC0+cGFnZV9vZmZzZXQgIT0g MCkpKSB7CgkJc25wcmludGYocmVzcC5lcnJfc3RyLCBzaXplb2YocmVzcC5lcnJfc3RyKSwKCQkJ ICIlczogbWlzc2luZyBlbnRyaWVzIiwgaW52bXNnKTsKCQlzdGF0dXMgPSBFSU5WQUw7CgkJZ290 byBmYWlsZWRfdW5sb2NrOwoJfQoJLyoKCSAqIERvbid0IGFsbG93IHVzZXJsYW5kIHRvIGNoYW5n ZSBjb250ZXh0IHBhcmFtZXRlcnMgdW5sZXNzIHRoZSBwYWdlCgkgKiB0YWJsZSBpcyBiZWluZyBy ZWJ1aWx0LgoJICovCglpZiAocGdwLT5wYWdlX29mZnNldCAhPSAwKSB7CgkJaWYgKChwZ3AtPmRl dl9jb3VudCkgIT0gcGN0eC0+ZGV2X2NvdW50KSB7CgkJCXNucHJpbnRmKHJlc3AuZXJyX3N0ciwg c2l6ZW9mKHJlc3AuZXJyX3N0ciksCgkJCQkgIiVzOiBpbnZhbGlkIGRldmljZSBjb3VudCAlZCIs CgkJCQkgaW52bXNnLCBwZ3AtPmRldl9jb3VudCk7CgkJCXN0YXR1cyA9IEVJTlZBTDsKCQkJZ290 byBmYWlsZWRfcmVzcG9uZDsKCQl9CgkJaWYgKHB0YmwgIT0gTlVMTCkgewoJCQlpZiAocGdwLT5w dGVfYml0cyAhPSBwdGJsLT5wdGVfYml0cykgewoJCQkJc25wcmludGYocmVzcC5lcnJfc3RyLCBz aXplb2YocmVzcC5lcnJfc3RyKSwKCQkJCQkgIiVzOiBudW1iZXIgb2YgYml0cyBjaGFuZ2VkIiwg aW52bXNnKTsKCQkJCXN0YXR1cyA9IEVJTlZBTDsKCQkJCWdvdG8gZmFpbGVkX3VubG9jazsKCQkJ fQoJCQlpZiAocGdwLT5wYWdlX3RvdGFsICE9IHB0YmwtPnB0YmxfbWF4KSB7CgkJCQlzbnByaW50 ZihyZXNwLmVycl9zdHIsIHNpemVvZihyZXNwLmVycl9zdHIpLAoJCQkJCSAiJXM6IHRvdGFsIG51 bWJlciBvZiBlbnRyaWVzIGNoYW5nZWQiLAoJCQkJCSBpbnZtc2cpOwoJCQkJc3RhdHVzID0gRUlO VkFMOwoJCQkJZ290byBmYWlsZWRfdW5sb2NrOwoJCQl9CgkJfQoJfQoKCS8qCgkgKiBDcmVhdGUg YSBQYWdlIFRhYmxlIGlmIG5lZWRlZC4gIE1vc3Qgb2YgdGhlIHRpbWUsIHRoZSBzaXplIG9mIHRo ZQoJICogdGFibGUgZG9lc24ndCBjaGFuZ2UuICBJbiB0aGF0IGNhc2UsIHJlLXVzZSB0aGUgZXhp c3RpbmcgdGFibGUuCgkgKi8KCXB0YmxfYnl0ZXMgPSAoKHBncC0+cGFnZV90b3RhbCArIHB0ZV9m aWVsZHMgLSAxKSAvIHB0ZV9maWVsZHMpICoKCSAgICBzaXplb2YodWludDMyX3QpOwoJaWYgKChw dGJsICE9IE5VTEwpICYmIChwdGJsX2J5dGVzID09IHB0YmwtPnB0YmxfYnl0ZXMpKSB7CgkJcG5l dyA9IHB0Ymw7Cgl9IGVsc2UgewoJCXBuZXcgPSBrbWFsbG9jKChzaXplb2YoKnBuZXcpICsgcHRi bF9ieXRlcyksIEdGUF9LRVJORUwpOwoJCWlmIChwbmV3ID09IE5VTEwpIHsKCQkJc25wcmludGYo cmVzcC5lcnJfc3RyLCBzaXplb2YocmVzcC5lcnJfc3RyKSwKCQkJCSAiQ2Fubm90IGFsbG9jYXRl IFBhZ2UgVGFibGUiKTsKCQkJc3RhdHVzID0gRUlOVkFMOwoJCQlnb3RvIGZhaWxlZF91bmxvY2s7 CgkJfQoJCXBuZXctPnB0YmxfYnl0ZXMgPSBwdGJsX2J5dGVzOwoJCURCR1BSSU5UKCIlcyBjdHg9 MHglcCAoJWQ6JWQpIHBuZXc9MHglcCwgYnVmZj0weCVwICglZCksIE9LXG4iLAoJCQkgX19mdW5j X18sIHBjdHgsIE1BSk9SKHBjdHgtPmRldl90aGlzKSwKCQkJIE1JTk9SKHBjdHgtPmRldl90aGlz KSwgcG5ldywgcG5ldy0+cHRibF9idWZmLAoJCQkgcHRibF9ieXRlcyk7Cgl9CglwbmV3LT5wdGVf Yml0cyA9IHBncC0+cHRlX2JpdHM7CglwbmV3LT5wdGVfbWFzayA9IHB0ZV9tYXNrOwoJcG5ldy0+ cHRlX2ZpZWxkcyA9IHB0ZV9maWVsZHM7CglwbmV3LT5wdGJsX21heCA9IHBncC0+cGFnZV90b3Rh bDsKCXBuZXctPnB0YmxfbnVtID0gcGdwLT5wYWdlX29mZnNldCArIHBncC0+cGFnZV9jb3VudDsK CURCR1BSSU5UKCIlcyBjdHg9MHglcCAoJWQ6JWQpOiBiaXRzPSVkLCBtYXNrPTB4JXgsIG51bT0l ZCwgbWF4PSVkXG4iLAoJCSBfX2Z1bmNfXywgcGN0eCwgTUFKT1IocGN0eC0+ZGV2X3RoaXMpLAoJ CSBNSU5PUihwY3R4LT5kZXZfdGhpcyksIHBuZXctPnB0ZV9iaXRzLCBwbmV3LT5wdGVfbWFzaywK CQkgcG5ldy0+cHRibF9udW0sIHBuZXctPnB0YmxfbWF4KTsKCW9mZnNldCA9IChwZ3AtPnBhZ2Vf b2Zmc2V0ICsgcHRlX2ZpZWxkcyAtIDEpIC8gcHRlX2ZpZWxkczsKCW1lbWNweSgmcG5ldy0+cHRi bF9idWZmW29mZnNldF0sIHBncC0+cHRibF9idWZmLCBzaXplKTsKCXBjdHgtPnVzZXJsYW5kWzBd ID0gcGdwLT51c2VybGFuZFswXTsKCXBjdHgtPnVzZXJsYW5kWzFdID0gcGdwLT51c2VybGFuZFsx XTsKCglpZiAocG5ldyAhPSBwdGJsKSB7CgkJcmN1X2Fzc2lnbl9wb2ludGVyKHBjdHgtPnB0Ymws IHBuZXcpOwoJCWtmcmVlKHB0YmwpOwoJfQoKZmFpbGVkX3VubG9jazoKCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJl9fZ19zcGlubG9jaywgZmxhZ3MpOwoKZmFpbGVkX3Jlc3BvbmQ6CglpZiAoc3Rh dHVzKQoJCXByaW50ayhLRVJOX1dBUk5JTkcgIiVzIFdBUk5JTkc6ICVzXG4iLCBfX2Z1bmNfXywg cmVzcC5lcnJfc3RyKTsKCWVsc2UKCQlyZXNwLmVycl9zdHJbMF0gPSAnXDAnOwoKCS8qIEZvcm1h dCB0aGUgcmVzcG9uc2UgbWVzc2FnZSAqLwoJcmVzcC50b3RhbF9sZW4gPSBzaXplb2Yoc3RydWN0 IElwY1Jlc3BvbnNlKTsKCXJlc3Aub3Bjb2RlID0gT1BDT0RFX1BBR0VfVEFCTEVfVVBMT0FEOwoJ cmVzcC51c2VybGFuZFswXSA9IHBncC0+dXNlcmxhbmRbMF07CglyZXNwLnVzZXJsYW5kWzFdID0g cGdwLT51c2VybGFuZFsxXTsKCXJlc3AuZGV2X21ham9yID0gcGdwLT5kZXZfbWFqb3I7CglyZXNw LmRldl9taW5vciA9IHBncC0+ZGV2X21pbm9yOwoJcmVzcC5zdGF0dXMgPSBzdGF0dXM7CglyYyA9 IG5sYV9wdXQoc2tiLCBOTEFfQklOQVJZLCBzaXplb2Yoc3RydWN0IElwY1Jlc3BvbnNlKSwgJnJl c3ApOwoJaWYgKHJjICE9IDApIHsKCQlwcmludGsoS0VSTl9XQVJOSU5HCgkJICAgICAgICIlcyBX QVJOSU5HOiBDYW5ub3QgZm9ybWF0IHJlcGx5IG1lc3NhZ2VcbiIsIF9fZnVuY19fKTsKCQlyZXR1 cm4gMDsKCX0KCWdlbmxtc2dfZW5kKHNrYiwgbXNnX2hlYWQpOwoJcmMgPSBnZW5sbXNnX3VuaWNh c3QoJmluaXRfbmV0LCBza2IsIGluZm8tPnNuZF9waWQpOwoJaWYgKHJjICE9IDApCgkJcHJpbnRr KEtFUk5fV0FSTklORyAiJXMgV0FSTklORzogQ2Fubm90IHNlbmQgcmVwbHkgbWVzc2FnZVxuIiwK CQkgICAgICAgX19mdW5jX18pOwoJcmV0dXJuIDA7Cn0KCi8qIE9wZXJhdGlvbiBmb3IgZ2V0dGlu ZyB0aGUgcGFnZSB0YWJsZSAqLwpzdGF0aWMgc3RydWN0IGdlbmxfb3BzIF9fZ19vcF9nZXRfcGFn ZV90YmwgPSB7CgkuY21kID0gTkVUTElOS19DTURfR0VUX1BBR0VfVEJMLAoJLmZsYWdzID0gMCwK CS5wb2xpY3kgPSBfX2dfYXR0cl9wb2xpY3ksCgkuZG9pdCA9IGdldF9wYWdlX3RibCwKCS5kdW1w aXQgPSBOVUxMLAp9OwoKLyoKICogVXNlIHRoZSBzeXNmcyBpbnRlcmZhY2UgdG8gaW5mb3JtIHRo ZSB1c2VybGFuZCBwcm9jZXNzIG9mIHRoZSBmYW1pbHkgaWQgdG8KICogYmUgdXNlZCBieSB0aGUg R2VuZXJpYyBOZXRsaW5rIHNvY2tldC4KICovCnN0YXRpYyBzc2l6ZV90IHN5c2ZzX2ZhbWlseWlk X3Nob3coc3RydWN0IGtvYmplY3QgKmtvYmosCgkJCQkgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRy LCBjaGFyICpidWZmKQp7CglyZXR1cm4gc25wcmludGYoYnVmZiwgUEFHRV9TSVpFLCAiJWQiLCBf X2dfZmFtaWx5LmlkKTsKfQoKc3RhdGljIHNzaXplX3Qgc3lzZnNfZmFtaWx5aWRfc3RvcmUoc3Ry dWN0IGtvYmplY3QgKmtvYmosCgkJCQkgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwgY29uc3Qg Y2hhciAqYnVmZiwKCQkJCSAgICBzaXplX3Qgc2l6ZSkKewoJcmV0dXJuIHNpemU7Cn0KCnN0cnVj dCBfc3lzZnNfYXR0cl9vcHMgewoJY29uc3Qgc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwoJY29uc3Qg c3RydWN0IHN5c2ZzX29wcyBvcHM7Cn07CnN0YXRpYyBjb25zdCBzdHJ1Y3QgX3N5c2ZzX2F0dHJf b3BzIF9fZ19zeXNmc19mYW1pbHlpZCA9IHsKCS5hdHRyID0geyJmYW1pbHlpZCIsIDA2NDR9LAoJ Lm9wcyA9IHsmc3lzZnNfZmFtaWx5aWRfc2hvdywgJnN5c2ZzX2ZhbWlseWlkX3N0b3JlfQp9OwoK aW50IF9faW5pdCBkbV9zd2l0Y2hfaW5pdCh2b2lkKQp7CglpbnQgcjsKCglEQkdQUklOVFYoIiVz XG4iLCBfX2Z1bmNfXyk7CglzcGluX2xvY2tfaW5pdCgmX19nX3NwaW5sb2NrKTsKCXIgPSBkbV9y ZWdpc3Rlcl90YXJnZXQoJl9fZ19zd2l0Y2hfdGFyZ2V0KTsKCWlmIChyKSB7CgkJRE1FUlIoImRt X3JlZ2lzdGVyX3RhcmdldCgpIGZhaWxlZCAlZCIsIHIpOwoJCXJldHVybiByOwoJfQoKCS8qIElu aXRpYWxpemUgR2VuZXJpYyBOZXRsaW5rIGNvbW11bmljYXRpb25zICovCglyID0gZ2VubF9yZWdp c3Rlcl9mYW1pbHkoJl9fZ19mYW1pbHkpOwoJaWYgKHIpIHsKCQlETUVSUigiZ2VubF9yZWdpc3Rl cl9mYW1pbHkoKSBmYWlsZWQiKTsKCQlnb3RvIGZhaWxlZDsKCX0KCXIgPSBnZW5sX3JlZ2lzdGVy X29wcygmX19nX2ZhbWlseSwgJl9fZ19vcF9nZXRfcGFnZV90YmwpOwoJaWYgKHIpIHsKCQlETUVS UigiZ2VubF9yZWdpc3Rlcl9vcHMoZ2V0X3BhZ2VfdGJsKSBmYWlsZWQgJWQiLCByKTsKCQlnb3Rv IGZhaWxlZDsKCX0KCURCR1BSSU5UVigiJXMgUmVnaXN0ZXJlZCBHZW5lcmljIE5ldGxpbmsgZ3Jv dXAgJWRcbiIsIF9fZnVuY19fLAoJCSAgX19nX2ZhbWlseS5pZCk7CglyID0gc3lzZnNfY3JlYXRl X2ZpbGUoJl9fZ19zd2l0Y2hfdGFyZ2V0Lm1vZHVsZS0+bWtvYmoua29iaiwKCQkJICAgICAgJl9f Z19zeXNmc19mYW1pbHlpZC5hdHRyKTsKCWlmIChyKSB7CgkJRE1FUlIoIi9zeXMvbW9kdWxlL2Zh bWlseWlkIGNyZWF0ZSBmYWlsZWQgJWQiLCByKTsKCQlnb3RvIGZhaWxlZDsKCX0KCXJldHVybiAw OwoKZmFpbGVkOgoJZG1fdW5yZWdpc3Rlcl90YXJnZXQoJl9fZ19zd2l0Y2hfdGFyZ2V0KTsKCXJl dHVybiByOwp9Cgp2b2lkIGRtX3N3aXRjaF9leGl0KHZvaWQpCnsKCWludCByOwoKCURCR1BSSU5U VigiJXNcbiIsIF9fZnVuY19fKTsKCWRtX3VucmVnaXN0ZXJfdGFyZ2V0KCZfX2dfc3dpdGNoX3Rh cmdldCk7CglyID0gZ2VubF91bnJlZ2lzdGVyX2ZhbWlseSgmX19nX2ZhbWlseSk7CglpZiAocikK CQlETVdBUk4oImdlbmxfdW5yZWdpc3Rlcl9mYW1pbHkoKSBmYWlsZWQgJWQiLCByKTsKCXJldHVy bjsKfQoKbW9kdWxlX2luaXQoZG1fc3dpdGNoX2luaXQpOwptb2R1bGVfZXhpdChkbV9zd2l0Y2hf ZXhpdCk7CgotLQpkbS1kZXZlbCBtYWlsaW5nIGxpc3QKZG0tZGV2ZWxAcmVkaGF0LmNvbQpodHRw czovL3d3dy5yZWRoYXQuY29tL21haWxtYW4vbGlzdGluZm8vZG0tZGV2ZWw=