Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753044Ab1BGIgi (ORCPT ); Mon, 7 Feb 2011 03:36:38 -0500 Received: from mail-iw0-f174.google.com ([209.85.214.174]:42943 "EHLO mail-iw0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752693Ab1BGIgf (ORCPT ); Mon, 7 Feb 2011 03:36:35 -0500 DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; b=kNnCz1XQ0ibqZqi++aoX06i/W7jStEegJtRfDYdpqagmbKDG4jAApM147hPh+wKobO wFncgYzaDdfR0tMjQ8c2fCPnQylXeKZu7XoGwT3wkCib7kuFSX3KqMo/uaxe0V0sxY5a +SDi3qsGEFDtIlqBKJcfbYHdnKwdOYv5Bdz+M= MIME-Version: 1.0 In-Reply-To: References: <849307$bf0dak@azsmga001.ch.intel.com> Date: Mon, 7 Feb 2011 16:36:33 +0800 Message-ID: Subject: Re: Commit 500f7147cf5bafd139056d521536b10c2bc2e154 breaks _resume_ From: Jeff Chua To: Takashi Iwai Cc: Chris Wilson , Linus Torvalds , "Rafael J. Wysocki" , Len Brown , LKML Content-Type: multipart/mixed; boundary=20cf3056445b1dcb0f049bad219d Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 275883 Lines: 3625 --20cf3056445b1dcb0f049bad219d Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On Mon, Feb 7, 2011 at 4:25 PM, Takashi Iwai wrote: > At Mon, 7 Feb 2011 13:02:46 +0800, > Jeff Chua wrote: >> >> On Mon, Feb 7, 2011 at 12:48 PM, Jeff Chua w= rote: >> > On Sun, Feb 6, 2011 at 11:27 PM, Chris Wilson wrote: >> >> One last step: move contents of intel_crtc_reset() back to >> >> intel_crtc_init() one by one. >> >> >> >> The active flag is my suspicion. I was thinking that we brought up th= e >> >> outputs in a similar manner upon resume as upon initial boot. On >> >> reflection, this is the not case. >> >> >> >> However, the first action we take inside modesetting is to disable th= e >> >> outputs about to be reconfigured. So setting active should be the rig= ht >> >> course of action so that cleanup any residual state from resume. >> >> >> >> So I am intrigued as to which line is the cause, and just where the >> >> machine becomes unresponsive... >> > >> > It's this line causing the problem. >> > >> > intel_crtc->active =3D true; /* force the pipe off on setup_init_confi= g */ >> > >> > >> > When it's called before entering intel_crtc_reset(&intel_crtc->base), >> > it works, but if called within the function, it doesn't work. Strange. >> > Not sure whether is passing the correct value to to_intel_crtc(crtc)? >> >> I've added printk() below and the function returns a different value >> of intel_crtc. >> >> >> static void intel_crtc_reset(struct drm_crtc *crtc) >> { >> =A0 =A0 =A0 =A0 struct intel_crtc *intel_crtc =3D to_intel_crtc(crtc); >> =A0 =A0 =A0 =A0 printk("intel_crtc %p\n", intel_crtc); =3D=3D=3D> intel_= crtc ffff8802349d1000 >> >> } >> >> printk("intel_crtc %p\n", intel_crtc); =3D=3D=3D> intel_crtc ffff8802349= d0000 >> intel_crtc_reset(&intel_crtc->base); > > That's weird. =A0Since base is the first member, both intel_crtc and crtc > must be identical. In case I'm messing something up, here's my intel_display.c Thanks, Jeff --20cf3056445b1dcb0f049bad219d Content-Type: text/x-csrc; charset=UTF-8; name="intel_display.c" Content-Disposition: attachment; filename="intel_display.c" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gjv4mju61 LyoKICogQ29weXJpZ2h0IMKpIDIwMDYtMjAwNyBJbnRlbCBDb3Jwb3JhdGlvbgogKgogKiBQZXJt aXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBv YnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1l bnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2Fy ZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRo ZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRl LCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQg dG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRv IGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFi b3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGlu ZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMg b3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09G VFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwg RVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBX QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBB VVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1B R0VTIE9SIE9USEVSCiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJB Q1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HCiAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05O RUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKICogREVBTElOR1Mg SU4gVEhFIFNPRlRXQVJFLgogKgogKiBBdXRob3JzOgogKglFcmljIEFuaG9sdCA8ZXJpY0Bhbmhv bHQubmV0PgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2lu cHV0Lmg+CiNpbmNsdWRlIDxsaW51eC9pMmMuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgoj aW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdmdhYXJiLmg+CiNpbmNsdWRl ICJkcm1QLmgiCiNpbmNsdWRlICJpbnRlbF9kcnYuaCIKI2luY2x1ZGUgImk5MTVfZHJtLmgiCiNp bmNsdWRlICJpOTE1X2Rydi5oIgojaW5jbHVkZSAiaTkxNV90cmFjZS5oIgojaW5jbHVkZSAiZHJt X2RwX2hlbHBlci5oIgoKI2luY2x1ZGUgImRybV9jcnRjX2hlbHBlci5oIgoKI2RlZmluZSBIQVNf ZURQIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9FRFApKQoKYm9vbCBp bnRlbF9waXBlX2hhc190eXBlIChzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCB0eXBlKTsKc3Rh dGljIHZvaWQgaW50ZWxfdXBkYXRlX3dhdGVybWFya3Moc3RydWN0IGRybV9kZXZpY2UgKmRldik7 CnN0YXRpYyB2b2lkIGludGVsX2luY3JlYXNlX3BsbGNsb2NrKHN0cnVjdCBkcm1fY3J0YyAqY3J0 Yyk7CnN0YXRpYyB2b2lkIGludGVsX2NydGNfdXBkYXRlX2N1cnNvcihzdHJ1Y3QgZHJtX2NydGMg KmNydGMsIGJvb2wgb24pOwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgLyogZ2l2ZW4gdmFsdWVzICov CiAgICBpbnQgbjsKICAgIGludCBtMSwgbTI7CiAgICBpbnQgcDEsIHAyOwogICAgLyogZGVyaXZl ZCB2YWx1ZXMgKi8KICAgIGludAlkb3Q7CiAgICBpbnQJdmNvOwogICAgaW50CW07CiAgICBpbnQJ cDsKfSBpbnRlbF9jbG9ja190OwoKdHlwZWRlZiBzdHJ1Y3QgewogICAgaW50CW1pbiwgbWF4Owp9 IGludGVsX3JhbmdlX3Q7Cgp0eXBlZGVmIHN0cnVjdCB7CiAgICBpbnQJZG90X2xpbWl0OwogICAg aW50CXAyX3Nsb3csIHAyX2Zhc3Q7Cn0gaW50ZWxfcDJfdDsKCiNkZWZpbmUgSU5URUxfUDJfTlVN CQkgICAgICAyCnR5cGVkZWYgc3RydWN0IGludGVsX2xpbWl0IGludGVsX2xpbWl0X3Q7CnN0cnVj dCBpbnRlbF9saW1pdCB7CiAgICBpbnRlbF9yYW5nZV90ICAgZG90LCB2Y28sIG4sIG0sIG0xLCBt MiwgcCwgcDE7CiAgICBpbnRlbF9wMl90CSAgICBwMjsKICAgIGJvb2wgKCogZmluZF9wbGwpKGNv bnN0IGludGVsX2xpbWl0X3QgKiwgc3RydWN0IGRybV9jcnRjICosCgkJICAgICAgaW50LCBpbnQs IGludGVsX2Nsb2NrX3QgKik7Cn07CgojZGVmaW5lIEk4WFhfRE9UX01JTgkJICAyNTAwMAojZGVm aW5lIEk4WFhfRE9UX01BWAkJIDM1MDAwMAojZGVmaW5lIEk4WFhfVkNPX01JTgkJIDkzMDAwMAoj ZGVmaW5lIEk4WFhfVkNPX01BWAkJMTQwMDAwMAojZGVmaW5lIEk4WFhfTl9NSU4JCSAgICAgIDMK I2RlZmluZSBJOFhYX05fTUFYCQkgICAgIDE2CiNkZWZpbmUgSThYWF9NX01JTgkJICAgICA5Ngoj ZGVmaW5lIEk4WFhfTV9NQVgJCSAgICAxNDAKI2RlZmluZSBJOFhYX00xX01JTgkJICAgICAxOAoj ZGVmaW5lIEk4WFhfTTFfTUFYCQkgICAgIDI2CiNkZWZpbmUgSThYWF9NMl9NSU4JCSAgICAgIDYK I2RlZmluZSBJOFhYX00yX01BWAkJICAgICAxNgojZGVmaW5lIEk4WFhfUF9NSU4JCSAgICAgIDQK I2RlZmluZSBJOFhYX1BfTUFYCQkgICAgMTI4CiNkZWZpbmUgSThYWF9QMV9NSU4JCSAgICAgIDIK I2RlZmluZSBJOFhYX1AxX01BWAkJICAgICAzMwojZGVmaW5lIEk4WFhfUDFfTFZEU19NSU4JICAg ICAgMQojZGVmaW5lIEk4WFhfUDFfTFZEU19NQVgJICAgICAgNgojZGVmaW5lIEk4WFhfUDJfU0xP VwkJICAgICAgNAojZGVmaW5lIEk4WFhfUDJfRkFTVAkJICAgICAgMgojZGVmaW5lIEk4WFhfUDJf TFZEU19TTE9XCSAgICAgIDE0CiNkZWZpbmUgSThYWF9QMl9MVkRTX0ZBU1QJICAgICAgNwojZGVm aW5lIEk4WFhfUDJfU0xPV19MSU1JVAkgMTY1MDAwCgojZGVmaW5lIEk5WFhfRE9UX01JTgkJICAy MDAwMAojZGVmaW5lIEk5WFhfRE9UX01BWAkJIDQwMDAwMAojZGVmaW5lIEk5WFhfVkNPX01JTgkJ MTQwMDAwMAojZGVmaW5lIEk5WFhfVkNPX01BWAkJMjgwMDAwMAojZGVmaW5lIFBJTkVWSUVXX1ZD T19NSU4JCTE3MDAwMDAKI2RlZmluZSBQSU5FVklFV19WQ09fTUFYCQkzNTAwMDAwCiNkZWZpbmUg STlYWF9OX01JTgkJICAgICAgMQojZGVmaW5lIEk5WFhfTl9NQVgJCSAgICAgIDYKLyogUGluZXZp ZXcncyBOY291bnRlciBpcyBhIHJpbmcgY291bnRlciAqLwojZGVmaW5lIFBJTkVWSUVXX05fTUlO CQkgICAgICAzCiNkZWZpbmUgUElORVZJRVdfTl9NQVgJCSAgICAgIDYKI2RlZmluZSBJOVhYX01f TUlOCQkgICAgIDcwCiNkZWZpbmUgSTlYWF9NX01BWAkJICAgIDEyMAojZGVmaW5lIFBJTkVWSUVX X01fTUlOCQkgICAgICAyCiNkZWZpbmUgUElORVZJRVdfTV9NQVgJCSAgICAyNTYKI2RlZmluZSBJ OVhYX00xX01JTgkJICAgICAxMAojZGVmaW5lIEk5WFhfTTFfTUFYCQkgICAgIDIyCiNkZWZpbmUg STlYWF9NMl9NSU4JCSAgICAgIDUKI2RlZmluZSBJOVhYX00yX01BWAkJICAgICAgOQovKiBQaW5l dmlldyBNMSBpcyByZXNlcnZlZCwgYW5kIG11c3QgYmUgMCAqLwojZGVmaW5lIFBJTkVWSUVXX00x X01JTgkJICAgICAgMAojZGVmaW5lIFBJTkVWSUVXX00xX01BWAkJICAgICAgMAojZGVmaW5lIFBJ TkVWSUVXX00yX01JTgkJICAgICAgMAojZGVmaW5lIFBJTkVWSUVXX00yX01BWAkJICAgICAgMjU0 CiNkZWZpbmUgSTlYWF9QX1NEVk9fREFDX01JTgkgICAgICA1CiNkZWZpbmUgSTlYWF9QX1NEVk9f REFDX01BWAkgICAgIDgwCiNkZWZpbmUgSTlYWF9QX0xWRFNfTUlOCQkgICAgICA3CiNkZWZpbmUg STlYWF9QX0xWRFNfTUFYCQkgICAgIDk4CiNkZWZpbmUgUElORVZJRVdfUF9MVkRTX01JTgkJICAg ICAgNwojZGVmaW5lIFBJTkVWSUVXX1BfTFZEU19NQVgJCSAgICAgMTEyCiNkZWZpbmUgSTlYWF9Q MV9NSU4JCSAgICAgIDEKI2RlZmluZSBJOVhYX1AxX01BWAkJICAgICAgOAojZGVmaW5lIEk5WFhf UDJfU0RWT19EQUNfU0xPVwkJICAgICAxMAojZGVmaW5lIEk5WFhfUDJfU0RWT19EQUNfRkFTVAkJ ICAgICAgNQojZGVmaW5lIEk5WFhfUDJfU0RWT19EQUNfU0xPV19MSU1JVAkgMjAwMDAwCiNkZWZp bmUgSTlYWF9QMl9MVkRTX1NMT1cJCSAgICAgMTQKI2RlZmluZSBJOVhYX1AyX0xWRFNfRkFTVAkJ ICAgICAgNwojZGVmaW5lIEk5WFhfUDJfTFZEU19TTE9XX0xJTUlUCQkgMTEyMDAwCgovKlRoZSBw YXJhbWV0ZXIgaXMgZm9yIFNEVk8gb24gRzR4IHBsYXRmb3JtKi8KI2RlZmluZSBHNFhfRE9UX1NE Vk9fTUlOICAgICAgICAgICAyNTAwMAojZGVmaW5lIEc0WF9ET1RfU0RWT19NQVggICAgICAgICAg IDI3MDAwMAojZGVmaW5lIEc0WF9WQ09fTUlOICAgICAgICAgICAgICAgIDE3NTAwMDAKI2RlZmlu ZSBHNFhfVkNPX01BWCAgICAgICAgICAgICAgICAzNTAwMDAwCiNkZWZpbmUgRzRYX05fU0RWT19N SU4gICAgICAgICAgICAgMQojZGVmaW5lIEc0WF9OX1NEVk9fTUFYICAgICAgICAgICAgIDQKI2Rl ZmluZSBHNFhfTV9TRFZPX01JTiAgICAgICAgICAgICAxMDQKI2RlZmluZSBHNFhfTV9TRFZPX01B WCAgICAgICAgICAgICAxMzgKI2RlZmluZSBHNFhfTTFfU0RWT19NSU4gICAgICAgICAgICAxNwoj ZGVmaW5lIEc0WF9NMV9TRFZPX01BWCAgICAgICAgICAgIDIzCiNkZWZpbmUgRzRYX00yX1NEVk9f TUlOICAgICAgICAgICAgNQojZGVmaW5lIEc0WF9NMl9TRFZPX01BWCAgICAgICAgICAgIDExCiNk ZWZpbmUgRzRYX1BfU0RWT19NSU4gICAgICAgICAgICAgMTAKI2RlZmluZSBHNFhfUF9TRFZPX01B WCAgICAgICAgICAgICAzMAojZGVmaW5lIEc0WF9QMV9TRFZPX01JTiAgICAgICAgICAgIDEKI2Rl ZmluZSBHNFhfUDFfU0RWT19NQVggICAgICAgICAgICAzCiNkZWZpbmUgRzRYX1AyX1NEVk9fU0xP VyAgICAgICAgICAgMTAKI2RlZmluZSBHNFhfUDJfU0RWT19GQVNUICAgICAgICAgICAxMAojZGVm aW5lIEc0WF9QMl9TRFZPX0xJTUlUICAgICAgICAgIDI3MDAwMAoKLypUaGUgcGFyYW1ldGVyIGlz IGZvciBIRE1JX0RBQyBvbiBHNHggcGxhdGZvcm0qLwojZGVmaW5lIEc0WF9ET1RfSERNSV9EQUNf TUlOICAgICAgICAgICAyMjAwMAojZGVmaW5lIEc0WF9ET1RfSERNSV9EQUNfTUFYICAgICAgICAg ICA0MDAwMDAKI2RlZmluZSBHNFhfTl9IRE1JX0RBQ19NSU4gICAgICAgICAgICAgMQojZGVmaW5l IEc0WF9OX0hETUlfREFDX01BWCAgICAgICAgICAgICA0CiNkZWZpbmUgRzRYX01fSERNSV9EQUNf TUlOICAgICAgICAgICAgIDEwNAojZGVmaW5lIEc0WF9NX0hETUlfREFDX01BWCAgICAgICAgICAg ICAxMzgKI2RlZmluZSBHNFhfTTFfSERNSV9EQUNfTUlOICAgICAgICAgICAgMTYKI2RlZmluZSBH NFhfTTFfSERNSV9EQUNfTUFYICAgICAgICAgICAgMjMKI2RlZmluZSBHNFhfTTJfSERNSV9EQUNf TUlOICAgICAgICAgICAgNQojZGVmaW5lIEc0WF9NMl9IRE1JX0RBQ19NQVggICAgICAgICAgICAx MQojZGVmaW5lIEc0WF9QX0hETUlfREFDX01JTiAgICAgICAgICAgICA1CiNkZWZpbmUgRzRYX1Bf SERNSV9EQUNfTUFYICAgICAgICAgICAgIDgwCiNkZWZpbmUgRzRYX1AxX0hETUlfREFDX01JTiAg ICAgICAgICAgIDEKI2RlZmluZSBHNFhfUDFfSERNSV9EQUNfTUFYICAgICAgICAgICAgOAojZGVm aW5lIEc0WF9QMl9IRE1JX0RBQ19TTE9XICAgICAgICAgICAxMAojZGVmaW5lIEc0WF9QMl9IRE1J X0RBQ19GQVNUICAgICAgICAgICA1CiNkZWZpbmUgRzRYX1AyX0hETUlfREFDX0xJTUlUICAgICAg ICAgIDE2NTAwMAoKLypUaGUgcGFyYW1ldGVyIGlzIGZvciBTSU5HTEVfQ0hBTk5FTF9MVkRTIG9u IEc0eCBwbGF0Zm9ybSovCiNkZWZpbmUgRzRYX0RPVF9TSU5HTEVfQ0hBTk5FTF9MVkRTX01JTiAg ICAgICAgICAgMjAwMDAKI2RlZmluZSBHNFhfRE9UX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYICAg ICAgICAgICAxMTUwMDAKI2RlZmluZSBHNFhfTl9TSU5HTEVfQ0hBTk5FTF9MVkRTX01JTiAgICAg ICAgICAgICAxCiNkZWZpbmUgRzRYX05fU0lOR0xFX0NIQU5ORUxfTFZEU19NQVggICAgICAgICAg ICAgMwojZGVmaW5lIEc0WF9NX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUlOICAgICAgICAgICAgIDEw NAojZGVmaW5lIEc0WF9NX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYICAgICAgICAgICAgIDEzOAoj ZGVmaW5lIEc0WF9NMV9TSU5HTEVfQ0hBTk5FTF9MVkRTX01JTiAgICAgICAgICAgIDE3CiNkZWZp bmUgRzRYX00xX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYICAgICAgICAgICAgMjMKI2RlZmluZSBH NFhfTTJfU0lOR0xFX0NIQU5ORUxfTFZEU19NSU4gICAgICAgICAgICA1CiNkZWZpbmUgRzRYX00y X1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYICAgICAgICAgICAgMTEKI2RlZmluZSBHNFhfUF9TSU5H TEVfQ0hBTk5FTF9MVkRTX01JTiAgICAgICAgICAgICAyOAojZGVmaW5lIEc0WF9QX1NJTkdMRV9D SEFOTkVMX0xWRFNfTUFYICAgICAgICAgICAgIDExMgojZGVmaW5lIEc0WF9QMV9TSU5HTEVfQ0hB Tk5FTF9MVkRTX01JTiAgICAgICAgICAgIDIKI2RlZmluZSBHNFhfUDFfU0lOR0xFX0NIQU5ORUxf TFZEU19NQVggICAgICAgICAgICA4CiNkZWZpbmUgRzRYX1AyX1NJTkdMRV9DSEFOTkVMX0xWRFNf U0xPVyAgICAgICAgICAgMTQKI2RlZmluZSBHNFhfUDJfU0lOR0xFX0NIQU5ORUxfTFZEU19GQVNU ICAgICAgICAgICAxNAojZGVmaW5lIEc0WF9QMl9TSU5HTEVfQ0hBTk5FTF9MVkRTX0xJTUlUICAg ICAgICAgIDAKCi8qVGhlIHBhcmFtZXRlciBpcyBmb3IgRFVBTF9DSEFOTkVMX0xWRFMgb24gRzR4 IHBsYXRmb3JtKi8KI2RlZmluZSBHNFhfRE9UX0RVQUxfQ0hBTk5FTF9MVkRTX01JTiAgICAgICAg ICAgODAwMDAKI2RlZmluZSBHNFhfRE9UX0RVQUxfQ0hBTk5FTF9MVkRTX01BWCAgICAgICAgICAg MjI0MDAwCiNkZWZpbmUgRzRYX05fRFVBTF9DSEFOTkVMX0xWRFNfTUlOICAgICAgICAgICAgIDEK I2RlZmluZSBHNFhfTl9EVUFMX0NIQU5ORUxfTFZEU19NQVggICAgICAgICAgICAgMwojZGVmaW5l IEc0WF9NX0RVQUxfQ0hBTk5FTF9MVkRTX01JTiAgICAgICAgICAgICAxMDQKI2RlZmluZSBHNFhf TV9EVUFMX0NIQU5ORUxfTFZEU19NQVggICAgICAgICAgICAgMTM4CiNkZWZpbmUgRzRYX00xX0RV QUxfQ0hBTk5FTF9MVkRTX01JTiAgICAgICAgICAgIDE3CiNkZWZpbmUgRzRYX00xX0RVQUxfQ0hB Tk5FTF9MVkRTX01BWCAgICAgICAgICAgIDIzCiNkZWZpbmUgRzRYX00yX0RVQUxfQ0hBTk5FTF9M VkRTX01JTiAgICAgICAgICAgIDUKI2RlZmluZSBHNFhfTTJfRFVBTF9DSEFOTkVMX0xWRFNfTUFY ICAgICAgICAgICAgMTEKI2RlZmluZSBHNFhfUF9EVUFMX0NIQU5ORUxfTFZEU19NSU4gICAgICAg ICAgICAgMTQKI2RlZmluZSBHNFhfUF9EVUFMX0NIQU5ORUxfTFZEU19NQVggICAgICAgICAgICAg NDIKI2RlZmluZSBHNFhfUDFfRFVBTF9DSEFOTkVMX0xWRFNfTUlOICAgICAgICAgICAgMgojZGVm aW5lIEc0WF9QMV9EVUFMX0NIQU5ORUxfTFZEU19NQVggICAgICAgICAgICA2CiNkZWZpbmUgRzRY X1AyX0RVQUxfQ0hBTk5FTF9MVkRTX1NMT1cgICAgICAgICAgIDcKI2RlZmluZSBHNFhfUDJfRFVB TF9DSEFOTkVMX0xWRFNfRkFTVCAgICAgICAgICAgNwojZGVmaW5lIEc0WF9QMl9EVUFMX0NIQU5O RUxfTFZEU19MSU1JVCAgICAgICAgICAwCgovKlRoZSBwYXJhbWV0ZXIgaXMgZm9yIERJU1BMQVkg UE9SVCBvbiBHNHggcGxhdGZvcm0qLwojZGVmaW5lIEc0WF9ET1RfRElTUExBWV9QT1JUX01JTiAg ICAgICAgICAgMTYxNjcwCiNkZWZpbmUgRzRYX0RPVF9ESVNQTEFZX1BPUlRfTUFYICAgICAgICAg ICAyMjcwMDAKI2RlZmluZSBHNFhfTl9ESVNQTEFZX1BPUlRfTUlOICAgICAgICAgICAgIDEKI2Rl ZmluZSBHNFhfTl9ESVNQTEFZX1BPUlRfTUFYICAgICAgICAgICAgIDIKI2RlZmluZSBHNFhfTV9E SVNQTEFZX1BPUlRfTUlOICAgICAgICAgICAgIDk3CiNkZWZpbmUgRzRYX01fRElTUExBWV9QT1JU X01BWCAgICAgICAgICAgICAxMDgKI2RlZmluZSBHNFhfTTFfRElTUExBWV9QT1JUX01JTiAgICAg ICAgICAgIDB4MTAKI2RlZmluZSBHNFhfTTFfRElTUExBWV9QT1JUX01BWCAgICAgICAgICAgIDB4 MTIKI2RlZmluZSBHNFhfTTJfRElTUExBWV9QT1JUX01JTiAgICAgICAgICAgIDB4MDUKI2RlZmlu ZSBHNFhfTTJfRElTUExBWV9QT1JUX01BWCAgICAgICAgICAgIDB4MDYKI2RlZmluZSBHNFhfUF9E SVNQTEFZX1BPUlRfTUlOICAgICAgICAgICAgIDEwCiNkZWZpbmUgRzRYX1BfRElTUExBWV9QT1JU X01BWCAgICAgICAgICAgICAyMAojZGVmaW5lIEc0WF9QMV9ESVNQTEFZX1BPUlRfTUlOICAgICAg ICAgICAgMQojZGVmaW5lIEc0WF9QMV9ESVNQTEFZX1BPUlRfTUFYICAgICAgICAgICAgMgojZGVm aW5lIEc0WF9QMl9ESVNQTEFZX1BPUlRfU0xPVyAgICAgICAgICAgMTAKI2RlZmluZSBHNFhfUDJf RElTUExBWV9QT1JUX0ZBU1QgICAgICAgICAgIDEwCiNkZWZpbmUgRzRYX1AyX0RJU1BMQVlfUE9S VF9MSU1JVCAgICAgICAgICAwCgovKiBJcm9ubGFrZSAvIFNhbmR5YnJpZGdlICovCi8qIGFzIHdl IGNhbGN1bGF0ZSBjbG9jayB1c2luZyAocmVnaXN0ZXJfdmFsdWUgKyAyKSBmb3IKICAgTi9NMS9N Miwgc28gaGVyZSB0aGUgcmFuZ2UgdmFsdWUgZm9yIHRoZW0gaXMgKGFjdHVhbF92YWx1ZS0yKS4K ICovCiNkZWZpbmUgSVJPTkxBS0VfRE9UX01JTiAgICAgICAgIDI1MDAwCiNkZWZpbmUgSVJPTkxB S0VfRE9UX01BWCAgICAgICAgIDM1MDAwMAojZGVmaW5lIElST05MQUtFX1ZDT19NSU4gICAgICAg ICAxNzYwMDAwCiNkZWZpbmUgSVJPTkxBS0VfVkNPX01BWCAgICAgICAgIDM1MTAwMDAKI2RlZmlu ZSBJUk9OTEFLRV9NMV9NSU4gICAgICAgICAgMTIKI2RlZmluZSBJUk9OTEFLRV9NMV9NQVggICAg ICAgICAgMjIKI2RlZmluZSBJUk9OTEFLRV9NMl9NSU4gICAgICAgICAgNQojZGVmaW5lIElST05M QUtFX00yX01BWCAgICAgICAgICA5CiNkZWZpbmUgSVJPTkxBS0VfUDJfRE9UX0xJTUlUICAgIDIy NTAwMCAvKiAyMjVNaHogKi8KCi8qIFdlIGhhdmUgcGFyYW1ldGVyIHJhbmdlcyBmb3IgZGlmZmVy ZW50IHR5cGUgb2Ygb3V0cHV0cy4gKi8KCi8qIERBQyAmIEhETUkgUmVmY2xrIDEyME1oeiAqLwoj ZGVmaW5lIElST05MQUtFX0RBQ19OX01JTgkxCiNkZWZpbmUgSVJPTkxBS0VfREFDX05fTUFYCTUK I2RlZmluZSBJUk9OTEFLRV9EQUNfTV9NSU4JNzkKI2RlZmluZSBJUk9OTEFLRV9EQUNfTV9NQVgJ MTI3CiNkZWZpbmUgSVJPTkxBS0VfREFDX1BfTUlOCTUKI2RlZmluZSBJUk9OTEFLRV9EQUNfUF9N QVgJODAKI2RlZmluZSBJUk9OTEFLRV9EQUNfUDFfTUlOCTEKI2RlZmluZSBJUk9OTEFLRV9EQUNf UDFfTUFYCTgKI2RlZmluZSBJUk9OTEFLRV9EQUNfUDJfU0xPVwkxMAojZGVmaW5lIElST05MQUtF X0RBQ19QMl9GQVNUCTUKCi8qIExWRFMgc2luZ2xlLWNoYW5uZWwgMTIwTWh6IHJlZmNsayAqLwoj ZGVmaW5lIElST05MQUtFX0xWRFNfU19OX01JTgkxCiNkZWZpbmUgSVJPTkxBS0VfTFZEU19TX05f TUFYCTMKI2RlZmluZSBJUk9OTEFLRV9MVkRTX1NfTV9NSU4JNzkKI2RlZmluZSBJUk9OTEFLRV9M VkRTX1NfTV9NQVgJMTE4CiNkZWZpbmUgSVJPTkxBS0VfTFZEU19TX1BfTUlOCTI4CiNkZWZpbmUg SVJPTkxBS0VfTFZEU19TX1BfTUFYCTExMgojZGVmaW5lIElST05MQUtFX0xWRFNfU19QMV9NSU4J MgojZGVmaW5lIElST05MQUtFX0xWRFNfU19QMV9NQVgJOAojZGVmaW5lIElST05MQUtFX0xWRFNf U19QMl9TTE9XCTE0CiNkZWZpbmUgSVJPTkxBS0VfTFZEU19TX1AyX0ZBU1QJMTQKCi8qIExWRFMg ZHVhbC1jaGFubmVsIDEyME1oeiByZWZjbGsgKi8KI2RlZmluZSBJUk9OTEFLRV9MVkRTX0RfTl9N SU4JMQojZGVmaW5lIElST05MQUtFX0xWRFNfRF9OX01BWAkzCiNkZWZpbmUgSVJPTkxBS0VfTFZE U19EX01fTUlOCTc5CiNkZWZpbmUgSVJPTkxBS0VfTFZEU19EX01fTUFYCTEyNwojZGVmaW5lIElS T05MQUtFX0xWRFNfRF9QX01JTgkxNAojZGVmaW5lIElST05MQUtFX0xWRFNfRF9QX01BWAk1Ngoj ZGVmaW5lIElST05MQUtFX0xWRFNfRF9QMV9NSU4JMgojZGVmaW5lIElST05MQUtFX0xWRFNfRF9Q MV9NQVgJOAojZGVmaW5lIElST05MQUtFX0xWRFNfRF9QMl9TTE9XCTcKI2RlZmluZSBJUk9OTEFL RV9MVkRTX0RfUDJfRkFTVAk3CgovKiBMVkRTIHNpbmdsZS1jaGFubmVsIDEwME1oeiByZWZjbGsg Ki8KI2RlZmluZSBJUk9OTEFLRV9MVkRTX1NfU1NDX05fTUlOCTEKI2RlZmluZSBJUk9OTEFLRV9M VkRTX1NfU1NDX05fTUFYCTIKI2RlZmluZSBJUk9OTEFLRV9MVkRTX1NfU1NDX01fTUlOCTc5CiNk ZWZpbmUgSVJPTkxBS0VfTFZEU19TX1NTQ19NX01BWAkxMjYKI2RlZmluZSBJUk9OTEFLRV9MVkRT X1NfU1NDX1BfTUlOCTI4CiNkZWZpbmUgSVJPTkxBS0VfTFZEU19TX1NTQ19QX01BWAkxMTIKI2Rl ZmluZSBJUk9OTEFLRV9MVkRTX1NfU1NDX1AxX01JTgkyCiNkZWZpbmUgSVJPTkxBS0VfTFZEU19T X1NTQ19QMV9NQVgJOAojZGVmaW5lIElST05MQUtFX0xWRFNfU19TU0NfUDJfU0xPVwkxNAojZGVm aW5lIElST05MQUtFX0xWRFNfU19TU0NfUDJfRkFTVAkxNAoKLyogTFZEUyBkdWFsLWNoYW5uZWwg MTAwTWh6IHJlZmNsayAqLwojZGVmaW5lIElST05MQUtFX0xWRFNfRF9TU0NfTl9NSU4JMQojZGVm aW5lIElST05MQUtFX0xWRFNfRF9TU0NfTl9NQVgJMwojZGVmaW5lIElST05MQUtFX0xWRFNfRF9T U0NfTV9NSU4JNzkKI2RlZmluZSBJUk9OTEFLRV9MVkRTX0RfU1NDX01fTUFYCTEyNgojZGVmaW5l IElST05MQUtFX0xWRFNfRF9TU0NfUF9NSU4JMTQKI2RlZmluZSBJUk9OTEFLRV9MVkRTX0RfU1ND X1BfTUFYCTQyCiNkZWZpbmUgSVJPTkxBS0VfTFZEU19EX1NTQ19QMV9NSU4JMgojZGVmaW5lIElS T05MQUtFX0xWRFNfRF9TU0NfUDFfTUFYCTYKI2RlZmluZSBJUk9OTEFLRV9MVkRTX0RfU1NDX1Ay X1NMT1cJNwojZGVmaW5lIElST05MQUtFX0xWRFNfRF9TU0NfUDJfRkFTVAk3CgovKiBEaXNwbGF5 UG9ydCAqLwojZGVmaW5lIElST05MQUtFX0RQX05fTUlOCQkxCiNkZWZpbmUgSVJPTkxBS0VfRFBf Tl9NQVgJCTIKI2RlZmluZSBJUk9OTEFLRV9EUF9NX01JTgkJODEKI2RlZmluZSBJUk9OTEFLRV9E UF9NX01BWAkJOTAKI2RlZmluZSBJUk9OTEFLRV9EUF9QX01JTgkJMTAKI2RlZmluZSBJUk9OTEFL RV9EUF9QX01BWAkJMjAKI2RlZmluZSBJUk9OTEFLRV9EUF9QMl9GQVNUCQkxMAojZGVmaW5lIElS T05MQUtFX0RQX1AyX1NMT1cJCTEwCiNkZWZpbmUgSVJPTkxBS0VfRFBfUDJfTElNSVQJCTAKI2Rl ZmluZSBJUk9OTEFLRV9EUF9QMV9NSU4JCTEKI2RlZmluZSBJUk9OTEFLRV9EUF9QMV9NQVgJCTIK Ci8qIEZESSAqLwojZGVmaW5lIElST05MQUtFX0ZESV9GUkVRCQkyNzAwMDAwIC8qIGluIGtIeiBm b3IgbW9kZS0+Y2xvY2sgKi8KCnN0YXRpYyBib29sCmludGVsX2ZpbmRfYmVzdF9QTEwoY29uc3Qg aW50ZWxfbGltaXRfdCAqbGltaXQsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKCQkgICAgaW50IHRh cmdldCwgaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqYmVzdF9jbG9jayk7CnN0YXRpYyBib29s CmludGVsX2c0eF9maW5kX2Jlc3RfUExMKGNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0LCBzdHJ1 Y3QgZHJtX2NydGMgKmNydGMsCgkJCWludCB0YXJnZXQsIGludCByZWZjbGssIGludGVsX2Nsb2Nr X3QgKmJlc3RfY2xvY2spOwoKc3RhdGljIGJvb2wKaW50ZWxfZmluZF9wbGxfZzR4X2RwKGNvbnN0 IGludGVsX2xpbWl0X3QgKiwgc3RydWN0IGRybV9jcnRjICpjcnRjLAoJCSAgICAgIGludCB0YXJn ZXQsIGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmJlc3RfY2xvY2spOwpzdGF0aWMgYm9vbApp bnRlbF9maW5kX3BsbF9pcm9ubGFrZV9kcChjb25zdCBpbnRlbF9saW1pdF90ICosIHN0cnVjdCBk cm1fY3J0YyAqY3J0YywKCQkJICAgaW50IHRhcmdldCwgaW50IHJlZmNsaywgaW50ZWxfY2xvY2tf dCAqYmVzdF9jbG9jayk7CgpzdGF0aWMgaW5saW5lIHUzMiAvKiB1bml0cyBvZiAxMDBNSHogKi8K aW50ZWxfZmRpX2xpbmtfZnJlcShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglpZiAoSVNfR0VO NShkZXYpKSB7CgkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZf cHJpdmF0ZTsKCQlyZXR1cm4gKEk5MTVfUkVBRChGRElfUExMX0JJT1NfMCkgJiBGRElfUExMX0ZC X0NMT0NLX01BU0spICsgMjsKCX0gZWxzZQoJCXJldHVybiAyNzsKfQoKc3RhdGljIGNvbnN0IGlu dGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2k4eHhfZHZvID0gewogICAgICAgIC5kb3QgPSB7IC5t aW4gPSBJOFhYX0RPVF9NSU4sCQkubWF4ID0gSThYWF9ET1RfTUFYIH0sCiAgICAgICAgLnZjbyA9 IHsgLm1pbiA9IEk4WFhfVkNPX01JTiwJCS5tYXggPSBJOFhYX1ZDT19NQVggfSwKICAgICAgICAu biAgID0geyAubWluID0gSThYWF9OX01JTiwJCS5tYXggPSBJOFhYX05fTUFYIH0sCiAgICAgICAg Lm0gICA9IHsgLm1pbiA9IEk4WFhfTV9NSU4sCQkubWF4ID0gSThYWF9NX01BWCB9LAogICAgICAg IC5tMSAgPSB7IC5taW4gPSBJOFhYX00xX01JTiwJCS5tYXggPSBJOFhYX00xX01BWCB9LAogICAg ICAgIC5tMiAgPSB7IC5taW4gPSBJOFhYX00yX01JTiwJCS5tYXggPSBJOFhYX00yX01BWCB9LAog ICAgICAgIC5wICAgPSB7IC5taW4gPSBJOFhYX1BfTUlOLAkJLm1heCA9IEk4WFhfUF9NQVggfSwK ICAgICAgICAucDEgID0geyAubWluID0gSThYWF9QMV9NSU4sCQkubWF4ID0gSThYWF9QMV9NQVgg fSwKCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJOFhYX1AyX1NMT1dfTElNSVQsCgkJIC5wMl9zbG93 ID0gSThYWF9QMl9TTE9XLAkucDJfZmFzdCA9IEk4WFhfUDJfRkFTVCB9LAoJLmZpbmRfcGxsID0g aW50ZWxfZmluZF9iZXN0X1BMTCwKfTsKCnN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVs X2xpbWl0c19pOHh4X2x2ZHMgPSB7CiAgICAgICAgLmRvdCA9IHsgLm1pbiA9IEk4WFhfRE9UX01J TiwJCS5tYXggPSBJOFhYX0RPVF9NQVggfSwKICAgICAgICAudmNvID0geyAubWluID0gSThYWF9W Q09fTUlOLAkJLm1heCA9IEk4WFhfVkNPX01BWCB9LAogICAgICAgIC5uICAgPSB7IC5taW4gPSBJ OFhYX05fTUlOLAkJLm1heCA9IEk4WFhfTl9NQVggfSwKICAgICAgICAubSAgID0geyAubWluID0g SThYWF9NX01JTiwJCS5tYXggPSBJOFhYX01fTUFYIH0sCiAgICAgICAgLm0xICA9IHsgLm1pbiA9 IEk4WFhfTTFfTUlOLAkJLm1heCA9IEk4WFhfTTFfTUFYIH0sCiAgICAgICAgLm0yICA9IHsgLm1p biA9IEk4WFhfTTJfTUlOLAkJLm1heCA9IEk4WFhfTTJfTUFYIH0sCiAgICAgICAgLnAgICA9IHsg Lm1pbiA9IEk4WFhfUF9NSU4sCQkubWF4ID0gSThYWF9QX01BWCB9LAogICAgICAgIC5wMSAgPSB7 IC5taW4gPSBJOFhYX1AxX0xWRFNfTUlOLAkubWF4ID0gSThYWF9QMV9MVkRTX01BWCB9LAoJLnAy ICA9IHsgLmRvdF9saW1pdCA9IEk4WFhfUDJfU0xPV19MSU1JVCwKCQkgLnAyX3Nsb3cgPSBJOFhY X1AyX0xWRFNfU0xPVywJLnAyX2Zhc3QgPSBJOFhYX1AyX0xWRFNfRkFTVCB9LAoJLmZpbmRfcGxs ID0gaW50ZWxfZmluZF9iZXN0X1BMTCwKfTsKCQpzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBp bnRlbF9saW1pdHNfaTl4eF9zZHZvID0gewogICAgICAgIC5kb3QgPSB7IC5taW4gPSBJOVhYX0RP VF9NSU4sCQkubWF4ID0gSTlYWF9ET1RfTUFYIH0sCiAgICAgICAgLnZjbyA9IHsgLm1pbiA9IEk5 WFhfVkNPX01JTiwJCS5tYXggPSBJOVhYX1ZDT19NQVggfSwKICAgICAgICAubiAgID0geyAubWlu ID0gSTlYWF9OX01JTiwJCS5tYXggPSBJOVhYX05fTUFYIH0sCiAgICAgICAgLm0gICA9IHsgLm1p biA9IEk5WFhfTV9NSU4sCQkubWF4ID0gSTlYWF9NX01BWCB9LAogICAgICAgIC5tMSAgPSB7IC5t aW4gPSBJOVhYX00xX01JTiwJCS5tYXggPSBJOVhYX00xX01BWCB9LAogICAgICAgIC5tMiAgPSB7 IC5taW4gPSBJOVhYX00yX01JTiwJCS5tYXggPSBJOVhYX00yX01BWCB9LAogICAgICAgIC5wICAg PSB7IC5taW4gPSBJOVhYX1BfU0RWT19EQUNfTUlOLAkubWF4ID0gSTlYWF9QX1NEVk9fREFDX01B WCB9LAogICAgICAgIC5wMSAgPSB7IC5taW4gPSBJOVhYX1AxX01JTiwJCS5tYXggPSBJOVhYX1Ax X01BWCB9LAoJLnAyICA9IHsgLmRvdF9saW1pdCA9IEk5WFhfUDJfU0RWT19EQUNfU0xPV19MSU1J VCwKCQkgLnAyX3Nsb3cgPSBJOVhYX1AyX1NEVk9fREFDX1NMT1csCS5wMl9mYXN0ID0gSTlYWF9Q Ml9TRFZPX0RBQ19GQVNUIH0sCgkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLAp9OwoK c3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2k5eHhfbHZkcyA9IHsKICAg ICAgICAuZG90ID0geyAubWluID0gSTlYWF9ET1RfTUlOLAkJLm1heCA9IEk5WFhfRE9UX01BWCB9 LAogICAgICAgIC52Y28gPSB7IC5taW4gPSBJOVhYX1ZDT19NSU4sCQkubWF4ID0gSTlYWF9WQ09f TUFYIH0sCiAgICAgICAgLm4gICA9IHsgLm1pbiA9IEk5WFhfTl9NSU4sCQkubWF4ID0gSTlYWF9O X01BWCB9LAogICAgICAgIC5tICAgPSB7IC5taW4gPSBJOVhYX01fTUlOLAkJLm1heCA9IEk5WFhf TV9NQVggfSwKICAgICAgICAubTEgID0geyAubWluID0gSTlYWF9NMV9NSU4sCQkubWF4ID0gSTlY WF9NMV9NQVggfSwKICAgICAgICAubTIgID0geyAubWluID0gSTlYWF9NMl9NSU4sCQkubWF4ID0g STlYWF9NMl9NQVggfSwKICAgICAgICAucCAgID0geyAubWluID0gSTlYWF9QX0xWRFNfTUlOLAku bWF4ID0gSTlYWF9QX0xWRFNfTUFYIH0sCiAgICAgICAgLnAxICA9IHsgLm1pbiA9IEk5WFhfUDFf TUlOLAkJLm1heCA9IEk5WFhfUDFfTUFYIH0sCgkvKiBUaGUgc2luZ2xlLWNoYW5uZWwgcmFuZ2Ug aXMgMjUtMTEyTWh6LCBhbmQgZHVhbC1jaGFubmVsCgkgKiBpcyA4MC0yMjRNaHouICBQcmVmZXIg c2luZ2xlIGNoYW5uZWwgYXMgbXVjaCBhcyBwb3NzaWJsZS4KCSAqLwoJLnAyICA9IHsgLmRvdF9s aW1pdCA9IEk5WFhfUDJfTFZEU19TTE9XX0xJTUlULAoJCSAucDJfc2xvdyA9IEk5WFhfUDJfTFZE U19TTE9XLAkucDJfZmFzdCA9IEk5WFhfUDJfTFZEU19GQVNUIH0sCgkuZmluZF9wbGwgPSBpbnRl bF9maW5kX2Jlc3RfUExMLAp9OwoKICAgIC8qIGJlbG93IHBhcmFtZXRlciBhbmQgZnVuY3Rpb24g aXMgZm9yIEc0WCBDaGlwc2V0IEZhbWlseSovCnN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGlu dGVsX2xpbWl0c19nNHhfc2R2byA9IHsKCS5kb3QgPSB7IC5taW4gPSBHNFhfRE9UX1NEVk9fTUlO LAkubWF4ID0gRzRYX0RPVF9TRFZPX01BWCB9LAoJLnZjbyA9IHsgLm1pbiA9IEc0WF9WQ09fTUlO LAkgICAgICAgIC5tYXggPSBHNFhfVkNPX01BWH0sCgkubiAgID0geyAubWluID0gRzRYX05fU0RW T19NSU4sCSAgICAgICAgLm1heCA9IEc0WF9OX1NEVk9fTUFYIH0sCgkubSAgID0geyAubWluID0g RzRYX01fU0RWT19NSU4sICAgICAgICAgLm1heCA9IEc0WF9NX1NEVk9fTUFYIH0sCgkubTEgID0g eyAubWluID0gRzRYX00xX1NEVk9fTUlOLAkubWF4ID0gRzRYX00xX1NEVk9fTUFYIH0sCgkubTIg ID0geyAubWluID0gRzRYX00yX1NEVk9fTUlOLAkubWF4ID0gRzRYX00yX1NEVk9fTUFYIH0sCgku cCAgID0geyAubWluID0gRzRYX1BfU0RWT19NSU4sICAgICAgICAgLm1heCA9IEc0WF9QX1NEVk9f TUFYIH0sCgkucDEgID0geyAubWluID0gRzRYX1AxX1NEVk9fTUlOLAkubWF4ID0gRzRYX1AxX1NE Vk9fTUFYfSwKCS5wMiAgPSB7IC5kb3RfbGltaXQgPSBHNFhfUDJfU0RWT19MSU1JVCwKCQkgLnAy X3Nsb3cgPSBHNFhfUDJfU0RWT19TTE9XLAoJCSAucDJfZmFzdCA9IEc0WF9QMl9TRFZPX0ZBU1QK CX0sCgkuZmluZF9wbGwgPSBpbnRlbF9nNHhfZmluZF9iZXN0X1BMTCwKfTsKCnN0YXRpYyBjb25z dCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19nNHhfaGRtaSA9IHsKCS5kb3QgPSB7IC5taW4g PSBHNFhfRE9UX0hETUlfREFDX01JTiwJLm1heCA9IEc0WF9ET1RfSERNSV9EQUNfTUFYIH0sCgku dmNvID0geyAubWluID0gRzRYX1ZDT19NSU4sCSAgICAgICAgLm1heCA9IEc0WF9WQ09fTUFYfSwK CS5uICAgPSB7IC5taW4gPSBHNFhfTl9IRE1JX0RBQ19NSU4sCS5tYXggPSBHNFhfTl9IRE1JX0RB Q19NQVggfSwKCS5tICAgPSB7IC5taW4gPSBHNFhfTV9IRE1JX0RBQ19NSU4sCS5tYXggPSBHNFhf TV9IRE1JX0RBQ19NQVggfSwKCS5tMSAgPSB7IC5taW4gPSBHNFhfTTFfSERNSV9EQUNfTUlOLAku bWF4ID0gRzRYX00xX0hETUlfREFDX01BWCB9LAoJLm0yICA9IHsgLm1pbiA9IEc0WF9NMl9IRE1J X0RBQ19NSU4sCS5tYXggPSBHNFhfTTJfSERNSV9EQUNfTUFYIH0sCgkucCAgID0geyAubWluID0g RzRYX1BfSERNSV9EQUNfTUlOLAkubWF4ID0gRzRYX1BfSERNSV9EQUNfTUFYIH0sCgkucDEgID0g eyAubWluID0gRzRYX1AxX0hETUlfREFDX01JTiwJLm1heCA9IEc0WF9QMV9IRE1JX0RBQ19NQVh9 LAoJLnAyICA9IHsgLmRvdF9saW1pdCA9IEc0WF9QMl9IRE1JX0RBQ19MSU1JVCwKCQkgLnAyX3Ns b3cgPSBHNFhfUDJfSERNSV9EQUNfU0xPVywKCQkgLnAyX2Zhc3QgPSBHNFhfUDJfSERNSV9EQUNf RkFTVAoJfSwKCS5maW5kX3BsbCA9IGludGVsX2c0eF9maW5kX2Jlc3RfUExMLAp9OwoKc3RhdGlj IGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2c0eF9zaW5nbGVfY2hhbm5lbF9sdmRz ID0gewoJLmRvdCA9IHsgLm1pbiA9IEc0WF9ET1RfU0lOR0xFX0NIQU5ORUxfTFZEU19NSU4sCgkJ IC5tYXggPSBHNFhfRE9UX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYIH0sCgkudmNvID0geyAubWlu ID0gRzRYX1ZDT19NSU4sCgkJIC5tYXggPSBHNFhfVkNPX01BWCB9LAoJLm4gICA9IHsgLm1pbiA9 IEc0WF9OX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUlOLAoJCSAubWF4ID0gRzRYX05fU0lOR0xFX0NI QU5ORUxfTFZEU19NQVggfSwKCS5tICAgPSB7IC5taW4gPSBHNFhfTV9TSU5HTEVfQ0hBTk5FTF9M VkRTX01JTiwKCQkgLm1heCA9IEc0WF9NX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYIH0sCgkubTEg ID0geyAubWluID0gRzRYX00xX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUlOLAoJCSAubWF4ID0gRzRY X00xX1NJTkdMRV9DSEFOTkVMX0xWRFNfTUFYIH0sCgkubTIgID0geyAubWluID0gRzRYX00yX1NJ TkdMRV9DSEFOTkVMX0xWRFNfTUlOLAoJCSAubWF4ID0gRzRYX00yX1NJTkdMRV9DSEFOTkVMX0xW RFNfTUFYIH0sCgkucCAgID0geyAubWluID0gRzRYX1BfU0lOR0xFX0NIQU5ORUxfTFZEU19NSU4s CgkJIC5tYXggPSBHNFhfUF9TSU5HTEVfQ0hBTk5FTF9MVkRTX01BWCB9LAoJLnAxICA9IHsgLm1p biA9IEc0WF9QMV9TSU5HTEVfQ0hBTk5FTF9MVkRTX01JTiwKCQkgLm1heCA9IEc0WF9QMV9TSU5H TEVfQ0hBTk5FTF9MVkRTX01BWCB9LAoJLnAyICA9IHsgLmRvdF9saW1pdCA9IEc0WF9QMl9TSU5H TEVfQ0hBTk5FTF9MVkRTX0xJTUlULAoJCSAucDJfc2xvdyA9IEc0WF9QMl9TSU5HTEVfQ0hBTk5F TF9MVkRTX1NMT1csCgkJIC5wMl9mYXN0ID0gRzRYX1AyX1NJTkdMRV9DSEFOTkVMX0xWRFNfRkFT VAoJfSwKCS5maW5kX3BsbCA9IGludGVsX2c0eF9maW5kX2Jlc3RfUExMLAp9OwoKc3RhdGljIGNv bnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2c0eF9kdWFsX2NoYW5uZWxfbHZkcyA9IHsK CS5kb3QgPSB7IC5taW4gPSBHNFhfRE9UX0RVQUxfQ0hBTk5FTF9MVkRTX01JTiwKCQkgLm1heCA9 IEc0WF9ET1RfRFVBTF9DSEFOTkVMX0xWRFNfTUFYIH0sCgkudmNvID0geyAubWluID0gRzRYX1ZD T19NSU4sCgkJIC5tYXggPSBHNFhfVkNPX01BWCB9LAoJLm4gICA9IHsgLm1pbiA9IEc0WF9OX0RV QUxfQ0hBTk5FTF9MVkRTX01JTiwKCQkgLm1heCA9IEc0WF9OX0RVQUxfQ0hBTk5FTF9MVkRTX01B WCB9LAoJLm0gICA9IHsgLm1pbiA9IEc0WF9NX0RVQUxfQ0hBTk5FTF9MVkRTX01JTiwKCQkgLm1h eCA9IEc0WF9NX0RVQUxfQ0hBTk5FTF9MVkRTX01BWCB9LAoJLm0xICA9IHsgLm1pbiA9IEc0WF9N MV9EVUFMX0NIQU5ORUxfTFZEU19NSU4sCgkJIC5tYXggPSBHNFhfTTFfRFVBTF9DSEFOTkVMX0xW RFNfTUFYIH0sCgkubTIgID0geyAubWluID0gRzRYX00yX0RVQUxfQ0hBTk5FTF9MVkRTX01JTiwK CQkgLm1heCA9IEc0WF9NMl9EVUFMX0NIQU5ORUxfTFZEU19NQVggfSwKCS5wICAgPSB7IC5taW4g PSBHNFhfUF9EVUFMX0NIQU5ORUxfTFZEU19NSU4sCgkJIC5tYXggPSBHNFhfUF9EVUFMX0NIQU5O RUxfTFZEU19NQVggfSwKCS5wMSAgPSB7IC5taW4gPSBHNFhfUDFfRFVBTF9DSEFOTkVMX0xWRFNf TUlOLAoJCSAubWF4ID0gRzRYX1AxX0RVQUxfQ0hBTk5FTF9MVkRTX01BWCB9LAoJLnAyICA9IHsg LmRvdF9saW1pdCA9IEc0WF9QMl9EVUFMX0NIQU5ORUxfTFZEU19MSU1JVCwKCQkgLnAyX3Nsb3cg PSBHNFhfUDJfRFVBTF9DSEFOTkVMX0xWRFNfU0xPVywKCQkgLnAyX2Zhc3QgPSBHNFhfUDJfRFVB TF9DSEFOTkVMX0xWRFNfRkFTVAoJfSwKCS5maW5kX3BsbCA9IGludGVsX2c0eF9maW5kX2Jlc3Rf UExMLAp9OwoKc3RhdGljIGNvbnN0IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2c0eF9kaXNw bGF5X3BvcnQgPSB7CiAgICAgICAgLmRvdCA9IHsgLm1pbiA9IEc0WF9ET1RfRElTUExBWV9QT1JU X01JTiwKICAgICAgICAgICAgICAgICAubWF4ID0gRzRYX0RPVF9ESVNQTEFZX1BPUlRfTUFYIH0s CiAgICAgICAgLnZjbyA9IHsgLm1pbiA9IEc0WF9WQ09fTUlOLAogICAgICAgICAgICAgICAgIC5t YXggPSBHNFhfVkNPX01BWH0sCiAgICAgICAgLm4gICA9IHsgLm1pbiA9IEc0WF9OX0RJU1BMQVlf UE9SVF9NSU4sCiAgICAgICAgICAgICAgICAgLm1heCA9IEc0WF9OX0RJU1BMQVlfUE9SVF9NQVgg fSwKICAgICAgICAubSAgID0geyAubWluID0gRzRYX01fRElTUExBWV9QT1JUX01JTiwKICAgICAg ICAgICAgICAgICAubWF4ID0gRzRYX01fRElTUExBWV9QT1JUX01BWCB9LAogICAgICAgIC5tMSAg PSB7IC5taW4gPSBHNFhfTTFfRElTUExBWV9QT1JUX01JTiwKICAgICAgICAgICAgICAgICAubWF4 ID0gRzRYX00xX0RJU1BMQVlfUE9SVF9NQVggfSwKICAgICAgICAubTIgID0geyAubWluID0gRzRY X00yX0RJU1BMQVlfUE9SVF9NSU4sCiAgICAgICAgICAgICAgICAgLm1heCA9IEc0WF9NMl9ESVNQ TEFZX1BPUlRfTUFYIH0sCiAgICAgICAgLnAgICA9IHsgLm1pbiA9IEc0WF9QX0RJU1BMQVlfUE9S VF9NSU4sCiAgICAgICAgICAgICAgICAgLm1heCA9IEc0WF9QX0RJU1BMQVlfUE9SVF9NQVggfSwK ICAgICAgICAucDEgID0geyAubWluID0gRzRYX1AxX0RJU1BMQVlfUE9SVF9NSU4sCiAgICAgICAg ICAgICAgICAgLm1heCA9IEc0WF9QMV9ESVNQTEFZX1BPUlRfTUFYfSwKICAgICAgICAucDIgID0g eyAuZG90X2xpbWl0ID0gRzRYX1AyX0RJU1BMQVlfUE9SVF9MSU1JVCwKICAgICAgICAgICAgICAg ICAucDJfc2xvdyA9IEc0WF9QMl9ESVNQTEFZX1BPUlRfU0xPVywKICAgICAgICAgICAgICAgICAu cDJfZmFzdCA9IEc0WF9QMl9ESVNQTEFZX1BPUlRfRkFTVCB9LAogICAgICAgIC5maW5kX3BsbCA9 IGludGVsX2ZpbmRfcGxsX2c0eF9kcCwKfTsKCnN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGlu dGVsX2xpbWl0c19waW5ldmlld19zZHZvID0gewogICAgICAgIC5kb3QgPSB7IC5taW4gPSBJOVhY X0RPVF9NSU4sCQkubWF4ID0gSTlYWF9ET1RfTUFYfSwKICAgICAgICAudmNvID0geyAubWluID0g UElORVZJRVdfVkNPX01JTiwJCS5tYXggPSBQSU5FVklFV19WQ09fTUFYIH0sCiAgICAgICAgLm4g ICA9IHsgLm1pbiA9IFBJTkVWSUVXX05fTUlOLAkJLm1heCA9IFBJTkVWSUVXX05fTUFYIH0sCiAg ICAgICAgLm0gICA9IHsgLm1pbiA9IFBJTkVWSUVXX01fTUlOLAkJLm1heCA9IFBJTkVWSUVXX01f TUFYIH0sCiAgICAgICAgLm0xICA9IHsgLm1pbiA9IFBJTkVWSUVXX00xX01JTiwJCS5tYXggPSBQ SU5FVklFV19NMV9NQVggfSwKICAgICAgICAubTIgID0geyAubWluID0gUElORVZJRVdfTTJfTUlO LAkJLm1heCA9IFBJTkVWSUVXX00yX01BWCB9LAogICAgICAgIC5wICAgPSB7IC5taW4gPSBJOVhY X1BfU0RWT19EQUNfTUlOLCAgICAubWF4ID0gSTlYWF9QX1NEVk9fREFDX01BWCB9LAogICAgICAg IC5wMSAgPSB7IC5taW4gPSBJOVhYX1AxX01JTiwJCS5tYXggPSBJOVhYX1AxX01BWCB9LAoJLnAy ICA9IHsgLmRvdF9saW1pdCA9IEk5WFhfUDJfU0RWT19EQUNfU0xPV19MSU1JVCwKCQkgLnAyX3Ns b3cgPSBJOVhYX1AyX1NEVk9fREFDX1NMT1csCS5wMl9mYXN0ID0gSTlYWF9QMl9TRFZPX0RBQ19G QVNUIH0sCgkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLAp9OwoKc3RhdGljIGNvbnN0 IGludGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX3BpbmV2aWV3X2x2ZHMgPSB7CiAgICAgICAgLmRv dCA9IHsgLm1pbiA9IEk5WFhfRE9UX01JTiwJCS5tYXggPSBJOVhYX0RPVF9NQVggfSwKICAgICAg ICAudmNvID0geyAubWluID0gUElORVZJRVdfVkNPX01JTiwJCS5tYXggPSBQSU5FVklFV19WQ09f TUFYIH0sCiAgICAgICAgLm4gICA9IHsgLm1pbiA9IFBJTkVWSUVXX05fTUlOLAkJLm1heCA9IFBJ TkVWSUVXX05fTUFYIH0sCiAgICAgICAgLm0gICA9IHsgLm1pbiA9IFBJTkVWSUVXX01fTUlOLAkJ Lm1heCA9IFBJTkVWSUVXX01fTUFYIH0sCiAgICAgICAgLm0xICA9IHsgLm1pbiA9IFBJTkVWSUVX X00xX01JTiwJCS5tYXggPSBQSU5FVklFV19NMV9NQVggfSwKICAgICAgICAubTIgID0geyAubWlu ID0gUElORVZJRVdfTTJfTUlOLAkJLm1heCA9IFBJTkVWSUVXX00yX01BWCB9LAogICAgICAgIC5w ICAgPSB7IC5taW4gPSBQSU5FVklFV19QX0xWRFNfTUlOLAkubWF4ID0gUElORVZJRVdfUF9MVkRT X01BWCB9LAogICAgICAgIC5wMSAgPSB7IC5taW4gPSBJOVhYX1AxX01JTiwJCS5tYXggPSBJOVhY X1AxX01BWCB9LAoJLyogUGluZXZpZXcgb25seSBzdXBwb3J0cyBzaW5nbGUtY2hhbm5lbCBtb2Rl LiAqLwoJLnAyICA9IHsgLmRvdF9saW1pdCA9IEk5WFhfUDJfTFZEU19TTE9XX0xJTUlULAoJCSAu cDJfc2xvdyA9IEk5WFhfUDJfTFZEU19TTE9XLAkucDJfZmFzdCA9IEk5WFhfUDJfTFZEU19TTE9X IH0sCgkuZmluZF9wbGwgPSBpbnRlbF9maW5kX2Jlc3RfUExMLAp9OwoKc3RhdGljIGNvbnN0IGlu dGVsX2xpbWl0X3QgaW50ZWxfbGltaXRzX2lyb25sYWtlX2RhYyA9IHsKCS5kb3QgPSB7IC5taW4g PSBJUk9OTEFLRV9ET1RfTUlOLCAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfRE9UX01BWCB9LAoJ LnZjbyA9IHsgLm1pbiA9IElST05MQUtFX1ZDT19NSU4sICAgICAgICAgIC5tYXggPSBJUk9OTEFL RV9WQ09fTUFYIH0sCgkubiAgID0geyAubWluID0gSVJPTkxBS0VfREFDX05fTUlOLCAgICAgICAg Lm1heCA9IElST05MQUtFX0RBQ19OX01BWCB9LAoJLm0gICA9IHsgLm1pbiA9IElST05MQUtFX0RB Q19NX01JTiwgICAgICAgIC5tYXggPSBJUk9OTEFLRV9EQUNfTV9NQVggfSwKCS5tMSAgPSB7IC5t aW4gPSBJUk9OTEFLRV9NMV9NSU4sICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfTTFfTUFYIH0s CgkubTIgID0geyAubWluID0gSVJPTkxBS0VfTTJfTUlOLCAgICAgICAgICAgLm1heCA9IElST05M QUtFX00yX01BWCB9LAoJLnAgICA9IHsgLm1pbiA9IElST05MQUtFX0RBQ19QX01JTiwJICAgLm1h eCA9IElST05MQUtFX0RBQ19QX01BWCB9LAoJLnAxICA9IHsgLm1pbiA9IElST05MQUtFX0RBQ19Q MV9NSU4sICAgICAgIC5tYXggPSBJUk9OTEFLRV9EQUNfUDFfTUFYIH0sCgkucDIgID0geyAuZG90 X2xpbWl0ID0gSVJPTkxBS0VfUDJfRE9UX0xJTUlULAoJCSAucDJfc2xvdyA9IElST05MQUtFX0RB Q19QMl9TTE9XLAoJCSAucDJfZmFzdCA9IElST05MQUtFX0RBQ19QMl9GQVNUIH0sCgkuZmluZF9w bGwgPSBpbnRlbF9nNHhfZmluZF9iZXN0X1BMTCwKfTsKCnN0YXRpYyBjb25zdCBpbnRlbF9saW1p dF90IGludGVsX2xpbWl0c19pcm9ubGFrZV9zaW5nbGVfbHZkcyA9IHsKCS5kb3QgPSB7IC5taW4g PSBJUk9OTEFLRV9ET1RfTUlOLCAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfRE9UX01BWCB9LAoJ LnZjbyA9IHsgLm1pbiA9IElST05MQUtFX1ZDT19NSU4sICAgICAgICAgIC5tYXggPSBJUk9OTEFL RV9WQ09fTUFYIH0sCgkubiAgID0geyAubWluID0gSVJPTkxBS0VfTFZEU19TX05fTUlOLCAgICAg Lm1heCA9IElST05MQUtFX0xWRFNfU19OX01BWCB9LAoJLm0gICA9IHsgLm1pbiA9IElST05MQUtF X0xWRFNfU19NX01JTiwgICAgIC5tYXggPSBJUk9OTEFLRV9MVkRTX1NfTV9NQVggfSwKCS5tMSAg PSB7IC5taW4gPSBJUk9OTEFLRV9NMV9NSU4sICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfTTFf TUFYIH0sCgkubTIgID0geyAubWluID0gSVJPTkxBS0VfTTJfTUlOLCAgICAgICAgICAgLm1heCA9 IElST05MQUtFX00yX01BWCB9LAoJLnAgICA9IHsgLm1pbiA9IElST05MQUtFX0xWRFNfU19QX01J TiwgICAgIC5tYXggPSBJUk9OTEFLRV9MVkRTX1NfUF9NQVggfSwKCS5wMSAgPSB7IC5taW4gPSBJ Uk9OTEFLRV9MVkRTX1NfUDFfTUlOLCAgICAubWF4ID0gSVJPTkxBS0VfTFZEU19TX1AxX01BWCB9 LAoJLnAyICA9IHsgLmRvdF9saW1pdCA9IElST05MQUtFX1AyX0RPVF9MSU1JVCwKCQkgLnAyX3Ns b3cgPSBJUk9OTEFLRV9MVkRTX1NfUDJfU0xPVywKCQkgLnAyX2Zhc3QgPSBJUk9OTEFLRV9MVkRT X1NfUDJfRkFTVCB9LAoJLmZpbmRfcGxsID0gaW50ZWxfZzR4X2ZpbmRfYmVzdF9QTEwsCn07Cgpz dGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaXJvbmxha2VfZHVhbF9sdmRz ID0gewoJLmRvdCA9IHsgLm1pbiA9IElST05MQUtFX0RPVF9NSU4sICAgICAgICAgIC5tYXggPSBJ Uk9OTEFLRV9ET1RfTUFYIH0sCgkudmNvID0geyAubWluID0gSVJPTkxBS0VfVkNPX01JTiwgICAg ICAgICAgLm1heCA9IElST05MQUtFX1ZDT19NQVggfSwKCS5uICAgPSB7IC5taW4gPSBJUk9OTEFL RV9MVkRTX0RfTl9NSU4sICAgICAubWF4ID0gSVJPTkxBS0VfTFZEU19EX05fTUFYIH0sCgkubSAg ID0geyAubWluID0gSVJPTkxBS0VfTFZEU19EX01fTUlOLCAgICAgLm1heCA9IElST05MQUtFX0xW RFNfRF9NX01BWCB9LAoJLm0xICA9IHsgLm1pbiA9IElST05MQUtFX00xX01JTiwgICAgICAgICAg IC5tYXggPSBJUk9OTEFLRV9NMV9NQVggfSwKCS5tMiAgPSB7IC5taW4gPSBJUk9OTEFLRV9NMl9N SU4sICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfTTJfTUFYIH0sCgkucCAgID0geyAubWluID0g SVJPTkxBS0VfTFZEU19EX1BfTUlOLCAgICAgLm1heCA9IElST05MQUtFX0xWRFNfRF9QX01BWCB9 LAoJLnAxICA9IHsgLm1pbiA9IElST05MQUtFX0xWRFNfRF9QMV9NSU4sICAgIC5tYXggPSBJUk9O TEFLRV9MVkRTX0RfUDFfTUFYIH0sCgkucDIgID0geyAuZG90X2xpbWl0ID0gSVJPTkxBS0VfUDJf RE9UX0xJTUlULAoJCSAucDJfc2xvdyA9IElST05MQUtFX0xWRFNfRF9QMl9TTE9XLAoJCSAucDJf ZmFzdCA9IElST05MQUtFX0xWRFNfRF9QMl9GQVNUIH0sCgkuZmluZF9wbGwgPSBpbnRlbF9nNHhf ZmluZF9iZXN0X1BMTCwKfTsKCnN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0 c19pcm9ubGFrZV9zaW5nbGVfbHZkc18xMDBtID0gewoJLmRvdCA9IHsgLm1pbiA9IElST05MQUtF X0RPVF9NSU4sICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9ET1RfTUFYIH0sCgkudmNvID0geyAu bWluID0gSVJPTkxBS0VfVkNPX01JTiwgICAgICAgICAgLm1heCA9IElST05MQUtFX1ZDT19NQVgg fSwKCS5uICAgPSB7IC5taW4gPSBJUk9OTEFLRV9MVkRTX1NfU1NDX05fTUlOLCAubWF4ID0gSVJP TkxBS0VfTFZEU19TX1NTQ19OX01BWCB9LAoJLm0gICA9IHsgLm1pbiA9IElST05MQUtFX0xWRFNf U19TU0NfTV9NSU4sIC5tYXggPSBJUk9OTEFLRV9MVkRTX1NfU1NDX01fTUFYIH0sCgkubTEgID0g eyAubWluID0gSVJPTkxBS0VfTTFfTUlOLCAgICAgICAgICAgLm1heCA9IElST05MQUtFX00xX01B WCB9LAoJLm0yICA9IHsgLm1pbiA9IElST05MQUtFX00yX01JTiwgICAgICAgICAgIC5tYXggPSBJ Uk9OTEFLRV9NMl9NQVggfSwKCS5wICAgPSB7IC5taW4gPSBJUk9OTEFLRV9MVkRTX1NfU1NDX1Bf TUlOLCAubWF4ID0gSVJPTkxBS0VfTFZEU19TX1NTQ19QX01BWCB9LAoJLnAxICA9IHsgLm1pbiA9 IElST05MQUtFX0xWRFNfU19TU0NfUDFfTUlOLC5tYXggPSBJUk9OTEFLRV9MVkRTX1NfU1NDX1Ax X01BWCB9LAoJLnAyICA9IHsgLmRvdF9saW1pdCA9IElST05MQUtFX1AyX0RPVF9MSU1JVCwKCQkg LnAyX3Nsb3cgPSBJUk9OTEFLRV9MVkRTX1NfU1NDX1AyX1NMT1csCgkJIC5wMl9mYXN0ID0gSVJP TkxBS0VfTFZEU19TX1NTQ19QMl9GQVNUIH0sCgkuZmluZF9wbGwgPSBpbnRlbF9nNHhfZmluZF9i ZXN0X1BMTCwKfTsKCnN0YXRpYyBjb25zdCBpbnRlbF9saW1pdF90IGludGVsX2xpbWl0c19pcm9u bGFrZV9kdWFsX2x2ZHNfMTAwbSA9IHsKCS5kb3QgPSB7IC5taW4gPSBJUk9OTEFLRV9ET1RfTUlO LCAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfRE9UX01BWCB9LAoJLnZjbyA9IHsgLm1pbiA9IElS T05MQUtFX1ZDT19NSU4sICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9WQ09fTUFYIH0sCgkubiAg ID0geyAubWluID0gSVJPTkxBS0VfTFZEU19EX1NTQ19OX01JTiwgLm1heCA9IElST05MQUtFX0xW RFNfRF9TU0NfTl9NQVggfSwKCS5tICAgPSB7IC5taW4gPSBJUk9OTEFLRV9MVkRTX0RfU1NDX01f TUlOLCAubWF4ID0gSVJPTkxBS0VfTFZEU19EX1NTQ19NX01BWCB9LAoJLm0xICA9IHsgLm1pbiA9 IElST05MQUtFX00xX01JTiwgICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9NMV9NQVggfSwKCS5t MiAgPSB7IC5taW4gPSBJUk9OTEFLRV9NMl9NSU4sICAgICAgICAgICAubWF4ID0gSVJPTkxBS0Vf TTJfTUFYIH0sCgkucCAgID0geyAubWluID0gSVJPTkxBS0VfTFZEU19EX1NTQ19QX01JTiwgLm1h eCA9IElST05MQUtFX0xWRFNfRF9TU0NfUF9NQVggfSwKCS5wMSAgPSB7IC5taW4gPSBJUk9OTEFL RV9MVkRTX0RfU1NDX1AxX01JTiwubWF4ID0gSVJPTkxBS0VfTFZEU19EX1NTQ19QMV9NQVggfSwK CS5wMiAgPSB7IC5kb3RfbGltaXQgPSBJUk9OTEFLRV9QMl9ET1RfTElNSVQsCgkJIC5wMl9zbG93 ID0gSVJPTkxBS0VfTFZEU19EX1NTQ19QMl9TTE9XLAoJCSAucDJfZmFzdCA9IElST05MQUtFX0xW RFNfRF9TU0NfUDJfRkFTVCB9LAoJLmZpbmRfcGxsID0gaW50ZWxfZzR4X2ZpbmRfYmVzdF9QTEws Cn07CgpzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCBpbnRlbF9saW1pdHNfaXJvbmxha2VfZGlz cGxheV9wb3J0ID0gewogICAgICAgIC5kb3QgPSB7IC5taW4gPSBJUk9OTEFLRV9ET1RfTUlOLAog ICAgICAgICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9ET1RfTUFYIH0sCiAgICAgICAgLnZjbyA9 IHsgLm1pbiA9IElST05MQUtFX1ZDT19NSU4sCiAgICAgICAgICAgICAgICAgLm1heCA9IElST05M QUtFX1ZDT19NQVh9LAogICAgICAgIC5uICAgPSB7IC5taW4gPSBJUk9OTEFLRV9EUF9OX01JTiwK ICAgICAgICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfRFBfTl9NQVggfSwKICAgICAgICAubSAg ID0geyAubWluID0gSVJPTkxBS0VfRFBfTV9NSU4sCiAgICAgICAgICAgICAgICAgLm1heCA9IElS T05MQUtFX0RQX01fTUFYIH0sCiAgICAgICAgLm0xICA9IHsgLm1pbiA9IElST05MQUtFX00xX01J TiwKICAgICAgICAgICAgICAgICAubWF4ID0gSVJPTkxBS0VfTTFfTUFYIH0sCiAgICAgICAgLm0y ICA9IHsgLm1pbiA9IElST05MQUtFX00yX01JTiwKICAgICAgICAgICAgICAgICAubWF4ID0gSVJP TkxBS0VfTTJfTUFYIH0sCiAgICAgICAgLnAgICA9IHsgLm1pbiA9IElST05MQUtFX0RQX1BfTUlO LAogICAgICAgICAgICAgICAgIC5tYXggPSBJUk9OTEFLRV9EUF9QX01BWCB9LAogICAgICAgIC5w MSAgPSB7IC5taW4gPSBJUk9OTEFLRV9EUF9QMV9NSU4sCiAgICAgICAgICAgICAgICAgLm1heCA9 IElST05MQUtFX0RQX1AxX01BWH0sCiAgICAgICAgLnAyICA9IHsgLmRvdF9saW1pdCA9IElST05M QUtFX0RQX1AyX0xJTUlULAogICAgICAgICAgICAgICAgIC5wMl9zbG93ID0gSVJPTkxBS0VfRFBf UDJfU0xPVywKICAgICAgICAgICAgICAgICAucDJfZmFzdCA9IElST05MQUtFX0RQX1AyX0ZBU1Qg fSwKICAgICAgICAuZmluZF9wbGwgPSBpbnRlbF9maW5kX3BsbF9pcm9ubGFrZV9kcCwKfTsKCnN0 YXRpYyBjb25zdCBpbnRlbF9saW1pdF90ICppbnRlbF9pcm9ubGFrZV9saW1pdChzdHJ1Y3QgZHJt X2NydGMgKmNydGMsCgkJCQkJCWludCByZWZjbGspCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBjcnRjLT5kZXY7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRl dl9wcml2YXRlOwoJY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQ7CgoJaWYgKGludGVsX3BpcGVf aGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKSB7CgkJaWYgKChJOTE1X1JFQUQoUENI X0xWRFMpICYgTFZEU19DTEtCX1BPV0VSX01BU0spID09CgkJICAgIExWRFNfQ0xLQl9QT1dFUl9V UCkgewoJCQkvKiBMVkRTIGR1YWwgY2hhbm5lbCAqLwoJCQlpZiAocmVmY2xrID09IDEwMDAwMCkK CQkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9ubGFrZV9kdWFsX2x2ZHNfMTAwbTsKCQkJZWxz ZQoJCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2lyb25sYWtlX2R1YWxfbHZkczsKCQl9IGVsc2Ug ewoJCQlpZiAocmVmY2xrID09IDEwMDAwMCkKCQkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pcm9u bGFrZV9zaW5nbGVfbHZkc18xMDBtOwoJCQllbHNlCgkJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNf aXJvbmxha2Vfc2luZ2xlX2x2ZHM7CgkJfQoJfSBlbHNlIGlmIChpbnRlbF9waXBlX2hhc190eXBl KGNydGMsIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkgfHwKCQkJSEFTX2VEUCkKCQlsaW1pdCA9 ICZpbnRlbF9saW1pdHNfaXJvbmxha2VfZGlzcGxheV9wb3J0OwoJZWxzZQoJCWxpbWl0ID0gJmlu dGVsX2xpbWl0c19pcm9ubGFrZV9kYWM7CgoJcmV0dXJuIGxpbWl0Owp9CgpzdGF0aWMgY29uc3Qg aW50ZWxfbGltaXRfdCAqaW50ZWxfZzR4X2xpbWl0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJ c3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgljb25zdCBpbnRlbF9saW1pdF90ICps aW1pdDsKCglpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZEUykp IHsKCQlpZiAoKEk5MTVfUkVBRChMVkRTKSAmIExWRFNfQ0xLQl9QT1dFUl9NQVNLKSA9PQoJCSAg ICBMVkRTX0NMS0JfUE9XRVJfVVApCgkJCS8qIExWRFMgd2l0aCBkdWFsIGNoYW5uZWwgKi8KCQkJ bGltaXQgPSAmaW50ZWxfbGltaXRzX2c0eF9kdWFsX2NoYW5uZWxfbHZkczsKCQllbHNlCgkJCS8q IExWRFMgd2l0aCBkdWFsIGNoYW5uZWwgKi8KCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2c0eF9z aW5nbGVfY2hhbm5lbF9sdmRzOwoJfSBlbHNlIGlmIChpbnRlbF9waXBlX2hhc190eXBlKGNydGMs IElOVEVMX09VVFBVVF9IRE1JKSB8fAoJCSAgIGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5U RUxfT1VUUFVUX0FOQUxPRykpIHsKCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfZzR4X2hkbWk7Cgl9 IGVsc2UgaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX1NEVk8pKSB7 CgkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2c0eF9zZHZvOwoJfSBlbHNlIGlmIChpbnRlbF9waXBl X2hhc190eXBlIChjcnRjLCBJTlRFTF9PVVRQVVRfRElTUExBWVBPUlQpKSB7CgkJbGltaXQgPSAm aW50ZWxfbGltaXRzX2c0eF9kaXNwbGF5X3BvcnQ7Cgl9IGVsc2UgLyogVGhlIG9wdGlvbiBpcyBm b3Igb3RoZXIgb3V0cHV0cyAqLwoJCWxpbWl0ID0gJmludGVsX2xpbWl0c19pOXh4X3Nkdm87CgoJ cmV0dXJuIGxpbWl0Owp9CgpzdGF0aWMgY29uc3QgaW50ZWxfbGltaXRfdCAqaW50ZWxfbGltaXQo c3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgcmVmY2xrKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2ID0gY3J0Yy0+ZGV2OwoJY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQ7CgoJaWYgKEhBU19Q Q0hfU1BMSVQoZGV2KSkKCQlsaW1pdCA9IGludGVsX2lyb25sYWtlX2xpbWl0KGNydGMsIHJlZmNs ayk7CgllbHNlIGlmIChJU19HNFgoZGV2KSkgewoJCWxpbWl0ID0gaW50ZWxfZzR4X2xpbWl0KGNy dGMpOwoJfSBlbHNlIGlmIChJU19QSU5FVklFVyhkZXYpKSB7CgkJaWYgKGludGVsX3BpcGVfaGFz X3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKQoJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNf cGluZXZpZXdfbHZkczsKCQllbHNlCgkJCWxpbWl0ID0gJmludGVsX2xpbWl0c19waW5ldmlld19z ZHZvOwoJfSBlbHNlIGlmICghSVNfR0VOMihkZXYpKSB7CgkJaWYgKGludGVsX3BpcGVfaGFzX3R5 cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKQoJCQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfaTl4 eF9sdmRzOwoJCWVsc2UKCQkJbGltaXQgPSAmaW50ZWxfbGltaXRzX2k5eHhfc2R2bzsKCX0gZWxz ZSB7CgkJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKQoJ CQlsaW1pdCA9ICZpbnRlbF9saW1pdHNfaTh4eF9sdmRzOwoJCWVsc2UKCQkJbGltaXQgPSAmaW50 ZWxfbGltaXRzX2k4eHhfZHZvOwoJfQoJcmV0dXJuIGxpbWl0Owp9CgovKiBtMSBpcyByZXNlcnZl ZCBhcyAwIGluIFBpbmV2aWV3LCBuIGlzIGEgcmluZyBjb3VudGVyICovCnN0YXRpYyB2b2lkIHBp bmV2aWV3X2Nsb2NrKGludCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmNsb2NrKQp7CgljbG9jay0+ bSA9IGNsb2NrLT5tMiArIDI7CgljbG9jay0+cCA9IGNsb2NrLT5wMSAqIGNsb2NrLT5wMjsKCWNs b2NrLT52Y28gPSByZWZjbGsgKiBjbG9jay0+bSAvIGNsb2NrLT5uOwoJY2xvY2stPmRvdCA9IGNs b2NrLT52Y28gLyBjbG9jay0+cDsKfQoKc3RhdGljIHZvaWQgaW50ZWxfY2xvY2soc3RydWN0IGRy bV9kZXZpY2UgKmRldiwgaW50IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqY2xvY2spCnsKCWlmIChJ U19QSU5FVklFVyhkZXYpKSB7CgkJcGluZXZpZXdfY2xvY2socmVmY2xrLCBjbG9jayk7CgkJcmV0 dXJuOwoJfQoJY2xvY2stPm0gPSA1ICogKGNsb2NrLT5tMSArIDIpICsgKGNsb2NrLT5tMiArIDIp OwoJY2xvY2stPnAgPSBjbG9jay0+cDEgKiBjbG9jay0+cDI7CgljbG9jay0+dmNvID0gcmVmY2xr ICogY2xvY2stPm0gLyAoY2xvY2stPm4gKyAyKTsKCWNsb2NrLT5kb3QgPSBjbG9jay0+dmNvIC8g Y2xvY2stPnA7Cn0KCi8qKgogKiBSZXR1cm5zIHdoZXRoZXIgYW55IG91dHB1dCBvbiB0aGUgc3Bl Y2lmaWVkIHBpcGUgaXMgb2YgdGhlIHNwZWNpZmllZCB0eXBlCiAqLwpib29sIGludGVsX3BpcGVf aGFzX3R5cGUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgdHlwZSkKewoJc3RydWN0IGRybV9k ZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1fbW9kZV9jb25maWcgKm1vZGVfY29u ZmlnID0gJmRldi0+bW9kZV9jb25maWc7CglzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsK CglsaXN0X2Zvcl9lYWNoX2VudHJ5KGVuY29kZXIsICZtb2RlX2NvbmZpZy0+ZW5jb2Rlcl9saXN0 LCBiYXNlLmhlYWQpCgkJaWYgKGVuY29kZXItPmJhc2UuY3J0YyA9PSBjcnRjICYmIGVuY29kZXIt PnR5cGUgPT0gdHlwZSkKCQkJcmV0dXJuIHRydWU7CgoJcmV0dXJuIGZhbHNlOwp9CgojZGVmaW5l IElOVEVMUGxsSW52YWxpZChzKSAgIGRvIHsgLyogRFJNX0RFQlVHKHMpOyAqLyByZXR1cm4gZmFs c2U7IH0gd2hpbGUgKDApCi8qKgogKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGdpdmVuIHNldCBvZiBk aXZpc29ycyBhcmUgdmFsaWQgZm9yIGEgZ2l2ZW4gcmVmY2xrIHdpdGgKICogdGhlIGdpdmVuIGNv bm5lY3RvcnMuCiAqLwoKc3RhdGljIGJvb2wgaW50ZWxfUExMX2lzX3ZhbGlkKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsCgkJCSAgICAgICBjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwKCQkJICAg ICAgIGNvbnN0IGludGVsX2Nsb2NrX3QgKmNsb2NrKQp7CglpZiAoY2xvY2stPnAxICA8IGxpbWl0 LT5wMS5taW4gIHx8IGxpbWl0LT5wMS5tYXggIDwgY2xvY2stPnAxKQoJCUlOVEVMUGxsSW52YWxp ZCAoInAxIG91dCBvZiByYW5nZVxuIik7CglpZiAoY2xvY2stPnAgICA8IGxpbWl0LT5wLm1pbiAg IHx8IGxpbWl0LT5wLm1heCAgIDwgY2xvY2stPnApCgkJSU5URUxQbGxJbnZhbGlkICgicCBvdXQg b2YgcmFuZ2VcbiIpOwoJaWYgKGNsb2NrLT5tMiAgPCBsaW1pdC0+bTIubWluICB8fCBsaW1pdC0+ bTIubWF4ICA8IGNsb2NrLT5tMikKCQlJTlRFTFBsbEludmFsaWQgKCJtMiBvdXQgb2YgcmFuZ2Vc biIpOwoJaWYgKGNsb2NrLT5tMSAgPCBsaW1pdC0+bTEubWluICB8fCBsaW1pdC0+bTEubWF4ICA8 IGNsb2NrLT5tMSkKCQlJTlRFTFBsbEludmFsaWQgKCJtMSBvdXQgb2YgcmFuZ2VcbiIpOwoJaWYg KGNsb2NrLT5tMSA8PSBjbG9jay0+bTIgJiYgIUlTX1BJTkVWSUVXKGRldikpCgkJSU5URUxQbGxJ bnZhbGlkICgibTEgPD0gbTJcbiIpOwoJaWYgKGNsb2NrLT5tICAgPCBsaW1pdC0+bS5taW4gICB8 fCBsaW1pdC0+bS5tYXggICA8IGNsb2NrLT5tKQoJCUlOVEVMUGxsSW52YWxpZCAoIm0gb3V0IG9m IHJhbmdlXG4iKTsKCWlmIChjbG9jay0+biAgIDwgbGltaXQtPm4ubWluICAgfHwgbGltaXQtPm4u bWF4ICAgPCBjbG9jay0+bikKCQlJTlRFTFBsbEludmFsaWQgKCJuIG91dCBvZiByYW5nZVxuIik7 CglpZiAoY2xvY2stPnZjbyA8IGxpbWl0LT52Y28ubWluIHx8IGxpbWl0LT52Y28ubWF4IDwgY2xv Y2stPnZjbykKCQlJTlRFTFBsbEludmFsaWQgKCJ2Y28gb3V0IG9mIHJhbmdlXG4iKTsKCS8qIFhY WDogV2UgbWF5IG5lZWQgdG8gYmUgY2hlY2tpbmcgIkRvdCBjbG9jayIgZGVwZW5kaW5nIG9uIHRo ZSBtdWx0aXBsaWVyLAoJICogY29ubmVjdG9yLCBldGMuLCByYXRoZXIgdGhhbiBqdXN0IGEgc2lu Z2xlIHJhbmdlLgoJICovCglpZiAoY2xvY2stPmRvdCA8IGxpbWl0LT5kb3QubWluIHx8IGxpbWl0 LT5kb3QubWF4IDwgY2xvY2stPmRvdCkKCQlJTlRFTFBsbEludmFsaWQgKCJkb3Qgb3V0IG9mIHJh bmdlXG4iKTsKCglyZXR1cm4gdHJ1ZTsKfQoKc3RhdGljIGJvb2wKaW50ZWxfZmluZF9iZXN0X1BM TChjb25zdCBpbnRlbF9saW1pdF90ICpsaW1pdCwgc3RydWN0IGRybV9jcnRjICpjcnRjLAoJCSAg ICBpbnQgdGFyZ2V0LCBpbnQgcmVmY2xrLCBpbnRlbF9jbG9ja190ICpiZXN0X2Nsb2NrKQoKewoJ c3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglpbnRlbF9jbG9ja190IGNsb2NrOwoJ aW50IGVyciA9IHRhcmdldDsKCglpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9P VVRQVVRfTFZEUykgJiYKCSAgICAoSTkxNV9SRUFEKExWRFMpKSAhPSAwKSB7CgkJLyoKCQkgKiBG b3IgTFZEUywgaWYgdGhlIHBhbmVsIGlzIG9uLCBqdXN0IHJlbHkgb24gaXRzIGN1cnJlbnQKCQkg KiBzZXR0aW5ncyBmb3IgZHVhbC1jaGFubmVsLiAgV2UgaGF2ZW4ndCBmaWd1cmVkIG91dCBob3cg dG8KCQkgKiByZWxpYWJseSBzZXQgdXAgZGlmZmVyZW50IHNpbmdsZS9kdWFsIGNoYW5uZWwgc3Rh dGUsIGlmIHdlCgkJICogZXZlbiBjYW4uCgkJICovCgkJaWYgKChJOTE1X1JFQUQoTFZEUykgJiBM VkRTX0NMS0JfUE9XRVJfTUFTSykgPT0KCQkgICAgTFZEU19DTEtCX1BPV0VSX1VQKQoJCQljbG9j ay5wMiA9IGxpbWl0LT5wMi5wMl9mYXN0OwoJCWVsc2UKCQkJY2xvY2sucDIgPSBsaW1pdC0+cDIu cDJfc2xvdzsKCX0gZWxzZSB7CgkJaWYgKHRhcmdldCA8IGxpbWl0LT5wMi5kb3RfbGltaXQpCgkJ CWNsb2NrLnAyID0gbGltaXQtPnAyLnAyX3Nsb3c7CgkJZWxzZQoJCQljbG9jay5wMiA9IGxpbWl0 LT5wMi5wMl9mYXN0OwoJfQoKCW1lbXNldCAoYmVzdF9jbG9jaywgMCwgc2l6ZW9mICgqYmVzdF9j bG9jaykpOwoKCWZvciAoY2xvY2subTEgPSBsaW1pdC0+bTEubWluOyBjbG9jay5tMSA8PSBsaW1p dC0+bTEubWF4OwoJICAgICBjbG9jay5tMSsrKSB7CgkJZm9yIChjbG9jay5tMiA9IGxpbWl0LT5t Mi5taW47CgkJICAgICBjbG9jay5tMiA8PSBsaW1pdC0+bTIubWF4OyBjbG9jay5tMisrKSB7CgkJ CS8qIG0xIGlzIGFsd2F5cyAwIGluIFBpbmV2aWV3ICovCgkJCWlmIChjbG9jay5tMiA+PSBjbG9j ay5tMSAmJiAhSVNfUElORVZJRVcoZGV2KSkKCQkJCWJyZWFrOwoJCQlmb3IgKGNsb2NrLm4gPSBs aW1pdC0+bi5taW47CgkJCSAgICAgY2xvY2subiA8PSBsaW1pdC0+bi5tYXg7IGNsb2NrLm4rKykg ewoJCQkJZm9yIChjbG9jay5wMSA9IGxpbWl0LT5wMS5taW47CgkJCQkJY2xvY2sucDEgPD0gbGlt aXQtPnAxLm1heDsgY2xvY2sucDErKykgewoJCQkJCWludCB0aGlzX2VycjsKCgkJCQkJaW50ZWxf Y2xvY2soZGV2LCByZWZjbGssICZjbG9jayk7CgkJCQkJaWYgKCFpbnRlbF9QTExfaXNfdmFsaWQo ZGV2LCBsaW1pdCwKCQkJCQkJCQkmY2xvY2spKQoJCQkJCQljb250aW51ZTsKCgkJCQkJdGhpc19l cnIgPSBhYnMoY2xvY2suZG90IC0gdGFyZ2V0KTsKCQkJCQlpZiAodGhpc19lcnIgPCBlcnIpIHsK CQkJCQkJKmJlc3RfY2xvY2sgPSBjbG9jazsKCQkJCQkJZXJyID0gdGhpc19lcnI7CgkJCQkJfQoJ CQkJfQoJCQl9CgkJfQoJfQoKCXJldHVybiAoZXJyICE9IHRhcmdldCk7Cn0KCnN0YXRpYyBib29s CmludGVsX2c0eF9maW5kX2Jlc3RfUExMKGNvbnN0IGludGVsX2xpbWl0X3QgKmxpbWl0LCBzdHJ1 Y3QgZHJtX2NydGMgKmNydGMsCgkJCWludCB0YXJnZXQsIGludCByZWZjbGssIGludGVsX2Nsb2Nr X3QgKmJlc3RfY2xvY2spCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Cglz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJaW50 ZWxfY2xvY2tfdCBjbG9jazsKCWludCBtYXhfbjsKCWJvb2wgZm91bmQ7CgkvKiBhcHByb3hpbWF0 ZWx5IGVxdWFscyB0YXJnZXQgKiAwLjAwNTg1ICovCglpbnQgZXJyX21vc3QgPSAodGFyZ2V0ID4+ IDgpICsgKHRhcmdldCA+PiA5KTsKCWZvdW5kID0gZmFsc2U7CgoJaWYgKGludGVsX3BpcGVfaGFz X3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKSB7CgkJaW50IGx2ZHNfcmVnOwoKCQlpZiAo SEFTX1BDSF9TUExJVChkZXYpKQoJCQlsdmRzX3JlZyA9IFBDSF9MVkRTOwoJCWVsc2UKCQkJbHZk c19yZWcgPSBMVkRTOwoJCWlmICgoSTkxNV9SRUFEKGx2ZHNfcmVnKSAmIExWRFNfQ0xLQl9QT1dF Ul9NQVNLKSA9PQoJCSAgICBMVkRTX0NMS0JfUE9XRVJfVVApCgkJCWNsb2NrLnAyID0gbGltaXQt PnAyLnAyX2Zhc3Q7CgkJZWxzZQoJCQljbG9jay5wMiA9IGxpbWl0LT5wMi5wMl9zbG93OwoJfSBl bHNlIHsKCQlpZiAodGFyZ2V0IDwgbGltaXQtPnAyLmRvdF9saW1pdCkKCQkJY2xvY2sucDIgPSBs aW1pdC0+cDIucDJfc2xvdzsKCQllbHNlCgkJCWNsb2NrLnAyID0gbGltaXQtPnAyLnAyX2Zhc3Q7 Cgl9CgoJbWVtc2V0KGJlc3RfY2xvY2ssIDAsIHNpemVvZigqYmVzdF9jbG9jaykpOwoJbWF4X24g PSBsaW1pdC0+bi5tYXg7CgkvKiBiYXNlZCBvbiBoYXJkd2FyZSByZXF1aXJlbWVudCwgcHJlZmVy IHNtYWxsZXIgbiB0byBwcmVjaXNpb24gKi8KCWZvciAoY2xvY2subiA9IGxpbWl0LT5uLm1pbjsg Y2xvY2subiA8PSBtYXhfbjsgY2xvY2subisrKSB7CgkJLyogYmFzZWQgb24gaGFyZHdhcmUgcmVx dWlyZW1lbnQsIHByZWZlcmUgbGFyZ2VyIG0xLG0yICovCgkJZm9yIChjbG9jay5tMSA9IGxpbWl0 LT5tMS5tYXg7CgkJICAgICBjbG9jay5tMSA+PSBsaW1pdC0+bTEubWluOyBjbG9jay5tMS0tKSB7 CgkJCWZvciAoY2xvY2subTIgPSBsaW1pdC0+bTIubWF4OwoJCQkgICAgIGNsb2NrLm0yID49IGxp bWl0LT5tMi5taW47IGNsb2NrLm0yLS0pIHsKCQkJCWZvciAoY2xvY2sucDEgPSBsaW1pdC0+cDEu bWF4OwoJCQkJICAgICBjbG9jay5wMSA+PSBsaW1pdC0+cDEubWluOyBjbG9jay5wMS0tKSB7CgkJ CQkJaW50IHRoaXNfZXJyOwoKCQkJCQlpbnRlbF9jbG9jayhkZXYsIHJlZmNsaywgJmNsb2NrKTsK CQkJCQlpZiAoIWludGVsX1BMTF9pc192YWxpZChkZXYsIGxpbWl0LAoJCQkJCQkJCSZjbG9jaykp CgkJCQkJCWNvbnRpbnVlOwoKCQkJCQl0aGlzX2VyciA9IGFicyhjbG9jay5kb3QgLSB0YXJnZXQp OwoJCQkJCWlmICh0aGlzX2VyciA8IGVycl9tb3N0KSB7CgkJCQkJCSpiZXN0X2Nsb2NrID0gY2xv Y2s7CgkJCQkJCWVycl9tb3N0ID0gdGhpc19lcnI7CgkJCQkJCW1heF9uID0gY2xvY2subjsKCQkJ CQkJZm91bmQgPSB0cnVlOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0KCXJldHVybiBmb3VuZDsK fQoKc3RhdGljIGJvb2wKaW50ZWxfZmluZF9wbGxfaXJvbmxha2VfZHAoY29uc3QgaW50ZWxfbGlt aXRfdCAqbGltaXQsIHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKCQkJICAgaW50IHRhcmdldCwgaW50 IHJlZmNsaywgaW50ZWxfY2xvY2tfdCAqYmVzdF9jbG9jaykKewoJc3RydWN0IGRybV9kZXZpY2Ug KmRldiA9IGNydGMtPmRldjsKCWludGVsX2Nsb2NrX3QgY2xvY2s7CgoJaWYgKHRhcmdldCA8IDIw MDAwMCkgewoJCWNsb2NrLm4gPSAxOwoJCWNsb2NrLnAxID0gMjsKCQljbG9jay5wMiA9IDEwOwoJ CWNsb2NrLm0xID0gMTI7CgkJY2xvY2subTIgPSA5OwoJfSBlbHNlIHsKCQljbG9jay5uID0gMjsK CQljbG9jay5wMSA9IDE7CgkJY2xvY2sucDIgPSAxMDsKCQljbG9jay5tMSA9IDE0OwoJCWNsb2Nr Lm0yID0gODsKCX0KCWludGVsX2Nsb2NrKGRldiwgcmVmY2xrLCAmY2xvY2spOwoJbWVtY3B5KGJl c3RfY2xvY2ssICZjbG9jaywgc2l6ZW9mKGludGVsX2Nsb2NrX3QpKTsKCXJldHVybiB0cnVlOwp9 CgovKiBEaXNwbGF5UG9ydCBoYXMgb25seSB0d28gZnJlcXVlbmNpZXMsIDE2Mk1IeiBhbmQgMjcw TUh6ICovCnN0YXRpYyBib29sCmludGVsX2ZpbmRfcGxsX2c0eF9kcChjb25zdCBpbnRlbF9saW1p dF90ICpsaW1pdCwgc3RydWN0IGRybV9jcnRjICpjcnRjLAoJCSAgICAgIGludCB0YXJnZXQsIGlu dCByZWZjbGssIGludGVsX2Nsb2NrX3QgKmJlc3RfY2xvY2spCnsKCWludGVsX2Nsb2NrX3QgY2xv Y2s7CglpZiAodGFyZ2V0IDwgMjAwMDAwKSB7CgkJY2xvY2sucDEgPSAyOwoJCWNsb2NrLnAyID0g MTA7CgkJY2xvY2subiA9IDI7CgkJY2xvY2subTEgPSAyMzsKCQljbG9jay5tMiA9IDg7Cgl9IGVs c2UgewoJCWNsb2NrLnAxID0gMTsKCQljbG9jay5wMiA9IDEwOwoJCWNsb2NrLm4gPSAxOwoJCWNs b2NrLm0xID0gMTQ7CgkJY2xvY2subTIgPSAyOwoJfQoJY2xvY2subSA9IDUgKiAoY2xvY2subTEg KyAyKSArIChjbG9jay5tMiArIDIpOwoJY2xvY2sucCA9IChjbG9jay5wMSAqIGNsb2NrLnAyKTsK CWNsb2NrLmRvdCA9IDk2MDAwICogY2xvY2subSAvIChjbG9jay5uICsgMikgLyBjbG9jay5wOwoJ Y2xvY2sudmNvID0gMDsKCW1lbWNweShiZXN0X2Nsb2NrLCAmY2xvY2ssIHNpemVvZihpbnRlbF9j bG9ja190KSk7CglyZXR1cm4gdHJ1ZTsKfQoKLyoqCiAqIGludGVsX3dhaXRfZm9yX3ZibGFuayAt IHdhaXQgZm9yIHZibGFuayBvbiBhIGdpdmVuIHBpcGUKICogQGRldjogZHJtIGRldmljZQogKiBA cGlwZTogcGlwZSB0byB3YWl0IGZvcgogKgogKiBXYWl0IGZvciB2YmxhbmsgdG8gb2NjdXIgb24g YSBnaXZlbiBwaXBlLiAgTmVlZGVkIGZvciB2YXJpb3VzIGJpdHMgb2YKICogbW9kZSBzZXR0aW5n IGNvZGUuCiAqLwp2b2lkIGludGVsX3dhaXRfZm9yX3ZibGFuayhzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2LCBpbnQgcGlwZSkKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2 LT5kZXZfcHJpdmF0ZTsKCWludCBwaXBlc3RhdF9yZWcgPSAocGlwZSA9PSAwID8gUElQRUFTVEFU IDogUElQRUJTVEFUKTsKCgkvKiBDbGVhciBleGlzdGluZyB2Ymxhbmsgc3RhdHVzLiBOb3RlIHRo aXMgd2lsbCBjbGVhciBhbnkgb3RoZXIKCSAqIHN0aWNreSBzdGF0dXMgZmllbGRzIGFzIHdlbGwu CgkgKgoJICogVGhpcyByYWNlcyB3aXRoIGk5MTVfZHJpdmVyX2lycV9oYW5kbGVyKCkgd2l0aCB0 aGUgcmVzdWx0CgkgKiB0aGF0IGVpdGhlciBmdW5jdGlvbiBjb3VsZCBtaXNzIGEgdmJsYW5rIGV2 ZW50LiAgSGVyZSBpdCBpcyBub3QKCSAqIGZhdGFsLCBhcyB3ZSB3aWxsIGVpdGhlciB3YWl0IHVw b24gdGhlIG5leHQgdmJsYW5rIGludGVycnVwdCBvcgoJICogdGltZW91dC4gIEdlbmVyYWxseSBz cGVha2luZyBpbnRlbF93YWl0X2Zvcl92YmxhbmsoKSBpcyBvbmx5CgkgKiBjYWxsZWQgZHVyaW5n IG1vZGVzZXQgYXQgd2hpY2ggdGltZSB0aGUgR1BVIHNob3VsZCBiZSBpZGxlIGFuZAoJICogc2hv dWxkICpub3QqIGJlIHBlcmZvcm1pbmcgcGFnZSBmbGlwcyBhbmQgdGh1cyBub3Qgd2FpdGluZyBv bgoJICogdmJsYW5rcy4uLgoJICogQ3VycmVudGx5LCB0aGUgcmVzdWx0IG9mIHVzIHN0ZWFsaW5n IGEgdmJsYW5rIGZyb20gdGhlIGlycQoJICogaGFuZGxlciBpcyB0aGF0IGEgc2luZ2xlIGZyYW1l IHdpbGwgYmUgc2tpcHBlZCBkdXJpbmcgc3dhcGJ1ZmZlcnMuCgkgKi8KCUk5MTVfV1JJVEUocGlw ZXN0YXRfcmVnLAoJCSAgIEk5MTVfUkVBRChwaXBlc3RhdF9yZWcpIHwgUElQRV9WQkxBTktfSU5U RVJSVVBUX1NUQVRVUyk7CgoJLyogV2FpdCBmb3IgdmJsYW5rIGludGVycnVwdCBiaXQgdG8gc2V0 ICovCglpZiAod2FpdF9mb3IoSTkxNV9SRUFEKHBpcGVzdGF0X3JlZykgJgoJCSAgICAgUElQRV9W QkxBTktfSU5URVJSVVBUX1NUQVRVUywKCQkgICAgIDUwKSkKCQlEUk1fREVCVUdfS01TKCJ2Ymxh bmsgd2FpdCB0aW1lZCBvdXRcbiIpOwp9CgovKgogKiBpbnRlbF93YWl0X2Zvcl9waXBlX29mZiAt IHdhaXQgZm9yIHBpcGUgdG8gdHVybiBvZmYKICogQGRldjogZHJtIGRldmljZQogKiBAcGlwZTog cGlwZSB0byB3YWl0IGZvcgogKgogKiBBZnRlciBkaXNhYmxpbmcgYSBwaXBlLCB3ZSBjYW4ndCB3 YWl0IGZvciB2YmxhbmsgaW4gdGhlIHVzdWFsIHdheSwKICogc3Bpbm5pbmcgb24gdGhlIHZibGFu ayBpbnRlcnJ1cHQgc3RhdHVzIGJpdCwgc2luY2Ugd2Ugd29uJ3QgYWN0dWFsbHkKICogc2VlIGFu IGludGVycnVwdCB3aGVuIHRoZSBwaXBlIGlzIGRpc2FibGVkLgogKgogKiBPbiBHZW40IGFuZCBh Ym92ZToKICogICB3YWl0IGZvciB0aGUgcGlwZSByZWdpc3RlciBzdGF0ZSBiaXQgdG8gdHVybiBv ZmYKICoKICogT3RoZXJ3aXNlOgogKiAgIHdhaXQgZm9yIHRoZSBkaXNwbGF5IGxpbmUgdmFsdWUg dG8gc2V0dGxlIChpdCB1c3VhbGx5CiAqICAgZW5kcyB1cCBzdG9wcGluZyBhdCB0aGUgc3RhcnQg b2YgdGhlIG5leHQgZnJhbWUpLgogKgogKi8Kdm9pZCBpbnRlbF93YWl0X2Zvcl9waXBlX29mZihz dHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKewoJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCglpZiAoSU5URUxfSU5GTyhkZXYpLT5n ZW4gPj0gNCkgewoJCWludCByZWcgPSBQSVBFQ09ORihwaXBlKTsKCgkJLyogV2FpdCBmb3IgdGhl IFBpcGUgU3RhdGUgdG8gZ28gb2ZmICovCgkJaWYgKHdhaXRfZm9yKChJOTE1X1JFQUQocmVnKSAm IEk5NjVfUElQRUNPTkZfQUNUSVZFKSA9PSAwLAoJCQkgICAgIDEwMCkpCgkJCURSTV9ERUJVR19L TVMoInBpcGVfb2ZmIHdhaXQgdGltZWQgb3V0XG4iKTsKCX0gZWxzZSB7CgkJdTMyIGxhc3RfbGlu ZTsKCQlpbnQgcmVnID0gUElQRURTTChwaXBlKTsKCQl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSBq aWZmaWVzICsgbXNlY3NfdG9famlmZmllcygxMDApOwoKCQkvKiBXYWl0IGZvciB0aGUgZGlzcGxh eSBsaW5lIHRvIHNldHRsZSAqLwoJCWRvIHsKCQkJbGFzdF9saW5lID0gSTkxNV9SRUFEKHJlZykg JiBEU0xfTElORU1BU0s7CgkJCW1kZWxheSg1KTsKCQl9IHdoaWxlICgoKEk5MTVfUkVBRChyZWcp ICYgRFNMX0xJTkVNQVNLKSAhPSBsYXN0X2xpbmUpICYmCgkJCSB0aW1lX2FmdGVyKHRpbWVvdXQs IGppZmZpZXMpKTsKCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0aW1lb3V0KSkKCQkJRFJNX0RF QlVHX0tNUygicGlwZV9vZmYgd2FpdCB0aW1lZCBvdXRcbiIpOwoJfQp9CgpzdGF0aWMgdm9pZCBp OHh4X2VuYWJsZV9mYmMoc3RydWN0IGRybV9jcnRjICpjcnRjLCB1bnNpZ25lZCBsb25nIGludGVy dmFsKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBkcm1fZnJh bWVidWZmZXIgKmZiID0gY3J0Yy0+ZmI7CglzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVs X2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOwoJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaiA9IGludGVsX2ZiLT5vYmo7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9 IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGxhbmUsIGk7Cgl1MzIgZmJjX2N0bCwgZmJjX2N0 bDI7CgoJaWYgKGZiLT5waXRjaCA9PSBkZXZfcHJpdi0+Y2ZiX3BpdGNoICYmCgkgICAgb2JqLT5m ZW5jZV9yZWcgPT0gZGV2X3ByaXYtPmNmYl9mZW5jZSAmJgoJICAgIGludGVsX2NydGMtPnBsYW5l ID09IGRldl9wcml2LT5jZmJfcGxhbmUgJiYKCSAgICBJOTE1X1JFQUQoRkJDX0NPTlRST0wpICYg RkJDX0NUTF9FTikKCQlyZXR1cm47CgoJaTh4eF9kaXNhYmxlX2ZiYyhkZXYpOwoKCWRldl9wcml2 LT5jZmJfcGl0Y2ggPSBkZXZfcHJpdi0+Y2ZiX3NpemUgLyBGQkNfTExfU0laRTsKCglpZiAoZmIt PnBpdGNoIDwgZGV2X3ByaXYtPmNmYl9waXRjaCkKCQlkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gZmIt PnBpdGNoOwoKCS8qIEZCQ19DVEwgd2FudHMgNjRCIHVuaXRzICovCglkZXZfcHJpdi0+Y2ZiX3Bp dGNoID0gKGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOwoJZGV2X3ByaXYtPmNmYl9mZW5j ZSA9IG9iai0+ZmVuY2VfcmVnOwoJZGV2X3ByaXYtPmNmYl9wbGFuZSA9IGludGVsX2NydGMtPnBs YW5lOwoJcGxhbmUgPSBkZXZfcHJpdi0+Y2ZiX3BsYW5lID09IDAgPyBGQkNfQ1RMX1BMQU5FQSA6 IEZCQ19DVExfUExBTkVCOwoKCS8qIENsZWFyIG9sZCB0YWdzICovCglmb3IgKGkgPSAwOyBpIDwg KEZCQ19MTF9TSVpFIC8gMzIpICsgMTsgaSsrKQoJCUk5MTVfV1JJVEUoRkJDX1RBRyArIChpICog NCksIDApOwoKCS8qIFNldCBpdCB1cC4uLiAqLwoJZmJjX2N0bDIgPSBGQkNfQ1RMX0ZFTkNFX0RC TCB8IEZCQ19DVExfSURMRV9JTU0gfCBwbGFuZTsKCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5 MTVfVElMSU5HX05PTkUpCgkJZmJjX2N0bDIgfD0gRkJDX0NUTF9DUFVfRkVOQ0U7CglJOTE1X1dS SVRFKEZCQ19DT05UUk9MMiwgZmJjX2N0bDIpOwoJSTkxNV9XUklURShGQkNfRkVOQ0VfT0ZGLCBj cnRjLT55KTsKCgkvKiBlbmFibGUgaXQuLi4gKi8KCWZiY19jdGwgPSBGQkNfQ1RMX0VOIHwgRkJD X0NUTF9QRVJJT0RJQzsKCWlmIChJU19JOTQ1R00oZGV2KSkKCQlmYmNfY3RsIHw9IEZCQ19DVExf QzNfSURMRTsgLyogOTQ1IG5lZWRzIHNwZWNpYWwgU1IgaGFuZGxpbmcgKi8KCWZiY19jdGwgfD0g KGRldl9wcml2LT5jZmJfcGl0Y2ggJiAweGZmKSA8PCBGQkNfQ1RMX1NUUklERV9TSElGVDsKCWZi Y19jdGwgfD0gKGludGVydmFsICYgMHgyZmZmKSA8PCBGQkNfQ1RMX0lOVEVSVkFMX1NISUZUOwoJ aWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9ORSkKCQlmYmNfY3RsIHw9IGRl dl9wcml2LT5jZmJfZmVuY2U7CglJOTE1X1dSSVRFKEZCQ19DT05UUk9MLCBmYmNfY3RsKTsKCglE Uk1fREVCVUdfS01TKCJlbmFibGVkIEZCQywgcGl0Y2ggJWxkLCB5b2ZmICVkLCBwbGFuZSAlZCwg IiwKCQkgICAgICBkZXZfcHJpdi0+Y2ZiX3BpdGNoLCBjcnRjLT55LCBkZXZfcHJpdi0+Y2ZiX3Bs YW5lKTsKfQoKdm9pZCBpOHh4X2Rpc2FibGVfZmJjKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsK CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgl1 MzIgZmJjX2N0bDsKCgkvKiBEaXNhYmxlIGNvbXByZXNzaW9uICovCglmYmNfY3RsID0gSTkxNV9S RUFEKEZCQ19DT05UUk9MKTsKCWlmICgoZmJjX2N0bCAmIEZCQ19DVExfRU4pID09IDApCgkJcmV0 dXJuOwoKCWZiY19jdGwgJj0gfkZCQ19DVExfRU47CglJOTE1X1dSSVRFKEZCQ19DT05UUk9MLCBm YmNfY3RsKTsKCgkvKiBXYWl0IGZvciBjb21wcmVzc2luZyBiaXQgdG8gY2xlYXIgKi8KCWlmICh3 YWl0X2ZvcigoSTkxNV9SRUFEKEZCQ19TVEFUVVMpICYgRkJDX1NUQVRfQ09NUFJFU1NJTkcpID09 IDAsIDEwKSkgewoJCURSTV9ERUJVR19LTVMoIkZCQyBpZGxlIHRpbWVkIG91dFxuIik7CgkJcmV0 dXJuOwoJfQoKCURSTV9ERUJVR19LTVMoImRpc2FibGVkIEZCQ1xuIik7Cn0KCnN0YXRpYyBib29s IGk4eHhfZmJjX2VuYWJsZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCglyZXR1cm4gSTkxNV9S RUFEKEZCQ19DT05UUk9MKSAmIEZCQ19DVExfRU47Cn0KCnN0YXRpYyB2b2lkIGc0eF9lbmFibGVf ZmJjKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdW5zaWduZWQgbG9uZyBpbnRlcnZhbCkKewoJc3Ry dWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyICpm YiA9IGNydGMtPmZiOwoJc3RydWN0IGludGVsX2ZyYW1lYnVmZmVyICppbnRlbF9mYiA9IHRvX2lu dGVsX2ZyYW1lYnVmZmVyKGZiKTsKCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBp bnRlbF9mYi0+b2JqOwoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9j cnRjKGNydGMpOwoJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCA/IERQRkNfQ1RM X1BMQU5FQSA6IERQRkNfQ1RMX1BMQU5FQjsKCXVuc2lnbmVkIGxvbmcgc3RhbGxfd2F0ZXJtYXJr ID0gMjAwOwoJdTMyIGRwZmNfY3RsOwoKCWRwZmNfY3RsID0gSTkxNV9SRUFEKERQRkNfQ09OVFJP TCk7CglpZiAoZHBmY19jdGwgJiBEUEZDX0NUTF9FTikgewoJCWlmIChkZXZfcHJpdi0+Y2ZiX3Bp dGNoID09IGRldl9wcml2LT5jZmJfcGl0Y2ggLyA2NCAtIDEgJiYKCQkgICAgZGV2X3ByaXYtPmNm Yl9mZW5jZSA9PSBvYmotPmZlbmNlX3JlZyAmJgoJCSAgICBkZXZfcHJpdi0+Y2ZiX3BsYW5lID09 IGludGVsX2NydGMtPnBsYW5lICYmCgkJICAgIGRldl9wcml2LT5jZmJfeSA9PSBjcnRjLT55KQoJ CQlyZXR1cm47CgoJCUk5MTVfV1JJVEUoRFBGQ19DT05UUk9MLCBkcGZjX2N0bCAmIH5EUEZDX0NU TF9FTik7CgkJUE9TVElOR19SRUFEKERQRkNfQ09OVFJPTCk7CgkJaW50ZWxfd2FpdF9mb3JfdmJs YW5rKGRldiwgaW50ZWxfY3J0Yy0+cGlwZSk7Cgl9CgoJZGV2X3ByaXYtPmNmYl9waXRjaCA9IChk ZXZfcHJpdi0+Y2ZiX3BpdGNoIC8gNjQpIC0gMTsKCWRldl9wcml2LT5jZmJfZmVuY2UgPSBvYmot PmZlbmNlX3JlZzsKCWRldl9wcml2LT5jZmJfcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKCWRl dl9wcml2LT5jZmJfeSA9IGNydGMtPnk7CgoJZHBmY19jdGwgPSBwbGFuZSB8IERQRkNfU1JfRU4g fCBEUEZDX0NUTF9MSU1JVF8xWDsKCWlmIChvYmotPnRpbGluZ19tb2RlICE9IEk5MTVfVElMSU5H X05PTkUpIHsKCQlkcGZjX2N0bCB8PSBEUEZDX0NUTF9GRU5DRV9FTiB8IGRldl9wcml2LT5jZmJf ZmVuY2U7CgkJSTkxNV9XUklURShEUEZDX0NISUNLRU4sIERQRkNfSFRfTU9ESUZZKTsKCX0gZWxz ZSB7CgkJSTkxNV9XUklURShEUEZDX0NISUNLRU4sIH5EUEZDX0hUX01PRElGWSk7Cgl9CgoJSTkx NV9XUklURShEUEZDX1JFQ09NUF9DVEwsIERQRkNfUkVDT01QX1NUQUxMX0VOIHwKCQkgICAoc3Rh bGxfd2F0ZXJtYXJrIDw8IERQRkNfUkVDT01QX1NUQUxMX1dNX1NISUZUKSB8CgkJICAgKGludGVy dmFsIDw8IERQRkNfUkVDT01QX1RJTUVSX0NPVU5UX1NISUZUKSk7CglJOTE1X1dSSVRFKERQRkNf RkVOQ0VfWU9GRiwgY3J0Yy0+eSk7CgoJLyogZW5hYmxlIGl0Li4uICovCglJOTE1X1dSSVRFKERQ RkNfQ09OVFJPTCwgSTkxNV9SRUFEKERQRkNfQ09OVFJPTCkgfCBEUEZDX0NUTF9FTik7CgoJRFJN X0RFQlVHX0tNUygiZW5hYmxlZCBmYmMgb24gcGxhbmUgJWRcbiIsIGludGVsX2NydGMtPnBsYW5l KTsKfQoKdm9pZCBnNHhfZGlzYWJsZV9mYmMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXUzMiBk cGZjX2N0bDsKCgkvKiBEaXNhYmxlIGNvbXByZXNzaW9uICovCglkcGZjX2N0bCA9IEk5MTVfUkVB RChEUEZDX0NPTlRST0wpOwoJaWYgKGRwZmNfY3RsICYgRFBGQ19DVExfRU4pIHsKCQlkcGZjX2N0 bCAmPSB+RFBGQ19DVExfRU47CgkJSTkxNV9XUklURShEUEZDX0NPTlRST0wsIGRwZmNfY3RsKTsK CgkJRFJNX0RFQlVHX0tNUygiZGlzYWJsZWQgRkJDXG4iKTsKCX0KfQoKc3RhdGljIGJvb2wgZzR4 X2ZiY19lbmFibGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CgoJcmV0dXJuIEk5MTVfUkVBRChE UEZDX0NPTlRST0wpICYgRFBGQ19DVExfRU47Cn0KCnN0YXRpYyB2b2lkIHNhbmR5YnJpZGdlX2Js aXRfZmJjX3VwZGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJdTMyIGJsdF9lY29za3BkOwoK CS8qIE1ha2Ugc3VyZSBibGl0dGVyIG5vdGlmaWVzIEZCQyBvZiB3cml0ZXMgKi8KCV9fZ2VuNl9m b3JjZV93YWtlX2dldChkZXZfcHJpdik7CglibHRfZWNvc2twZCA9IEk5MTVfUkVBRChHRU42X0JM SVRURVJfRUNPU0tQRCk7CglibHRfZWNvc2twZCB8PSBHRU42X0JMSVRURVJfRkJDX05PVElGWSA8 PAoJCUdFTjZfQkxJVFRFUl9MT0NLX1NISUZUOwoJSTkxNV9XUklURShHRU42X0JMSVRURVJfRUNP U0tQRCwgYmx0X2Vjb3NrcGQpOwoJYmx0X2Vjb3NrcGQgfD0gR0VONl9CTElUVEVSX0ZCQ19OT1RJ Rlk7CglJOTE1X1dSSVRFKEdFTjZfQkxJVFRFUl9FQ09TS1BELCBibHRfZWNvc2twZCk7CglibHRf ZWNvc2twZCAmPSB+KEdFTjZfQkxJVFRFUl9GQkNfTk9USUZZIDw8CgkJCSBHRU42X0JMSVRURVJf TE9DS19TSElGVCk7CglJOTE1X1dSSVRFKEdFTjZfQkxJVFRFUl9FQ09TS1BELCBibHRfZWNvc2tw ZCk7CglQT1NUSU5HX1JFQUQoR0VONl9CTElUVEVSX0VDT1NLUEQpOwoJX19nZW42X2ZvcmNlX3dh a2VfcHV0KGRldl9wcml2KTsKfQoKc3RhdGljIHZvaWQgaXJvbmxha2VfZW5hYmxlX2ZiYyhzdHJ1 Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVkIGxvbmcgaW50ZXJ2YWwpCnsKCXN0cnVjdCBkcm1f ZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYgPSBkZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIgPSBjcnRj LT5mYjsKCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFt ZWJ1ZmZlcihmYik7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmIt Pm9iajsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRj KTsKCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lID09IDAgPyBEUEZDX0NUTF9QTEFORUEg OiBEUEZDX0NUTF9QTEFORUI7Cgl1bnNpZ25lZCBsb25nIHN0YWxsX3dhdGVybWFyayA9IDIwMDsK CXUzMiBkcGZjX2N0bDsKCglkcGZjX2N0bCA9IEk5MTVfUkVBRChJTEtfRFBGQ19DT05UUk9MKTsK CWlmIChkcGZjX2N0bCAmIERQRkNfQ1RMX0VOKSB7CgkJaWYgKGRldl9wcml2LT5jZmJfcGl0Y2gg PT0gZGV2X3ByaXYtPmNmYl9waXRjaCAvIDY0IC0gMSAmJgoJCSAgICBkZXZfcHJpdi0+Y2ZiX2Zl bmNlID09IG9iai0+ZmVuY2VfcmVnICYmCgkJICAgIGRldl9wcml2LT5jZmJfcGxhbmUgPT0gaW50 ZWxfY3J0Yy0+cGxhbmUgJiYKCQkgICAgZGV2X3ByaXYtPmNmYl9vZmZzZXQgPT0gb2JqLT5ndHRf b2Zmc2V0ICYmCgkJICAgIGRldl9wcml2LT5jZmJfeSA9PSBjcnRjLT55KQoJCQlyZXR1cm47CgoJ CUk5MTVfV1JJVEUoSUxLX0RQRkNfQ09OVFJPTCwgZHBmY19jdGwgJiB+RFBGQ19DVExfRU4pOwoJ CVBPU1RJTkdfUkVBRChJTEtfRFBGQ19DT05UUk9MKTsKCQlpbnRlbF93YWl0X2Zvcl92Ymxhbmso ZGV2LCBpbnRlbF9jcnRjLT5waXBlKTsKCX0KCglkZXZfcHJpdi0+Y2ZiX3BpdGNoID0gKGRldl9w cml2LT5jZmJfcGl0Y2ggLyA2NCkgLSAxOwoJZGV2X3ByaXYtPmNmYl9mZW5jZSA9IG9iai0+ZmVu Y2VfcmVnOwoJZGV2X3ByaXYtPmNmYl9wbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOwoJZGV2X3By aXYtPmNmYl9vZmZzZXQgPSBvYmotPmd0dF9vZmZzZXQ7CglkZXZfcHJpdi0+Y2ZiX3kgPSBjcnRj LT55OwoKCWRwZmNfY3RsICY9IERQRkNfUkVTRVJWRUQ7CglkcGZjX2N0bCB8PSAocGxhbmUgfCBE UEZDX0NUTF9MSU1JVF8xWCk7CglpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19O T05FKSB7CgkJZHBmY19jdGwgfD0gKERQRkNfQ1RMX0ZFTkNFX0VOIHwgZGV2X3ByaXYtPmNmYl9m ZW5jZSk7CgkJSTkxNV9XUklURShJTEtfRFBGQ19DSElDS0VOLCBEUEZDX0hUX01PRElGWSk7Cgl9 IGVsc2UgewoJCUk5MTVfV1JJVEUoSUxLX0RQRkNfQ0hJQ0tFTiwgfkRQRkNfSFRfTU9ESUZZKTsK CX0KCglJOTE1X1dSSVRFKElMS19EUEZDX1JFQ09NUF9DVEwsIERQRkNfUkVDT01QX1NUQUxMX0VO IHwKCQkgICAoc3RhbGxfd2F0ZXJtYXJrIDw8IERQRkNfUkVDT01QX1NUQUxMX1dNX1NISUZUKSB8 CgkJICAgKGludGVydmFsIDw8IERQRkNfUkVDT01QX1RJTUVSX0NPVU5UX1NISUZUKSk7CglJOTE1 X1dSSVRFKElMS19EUEZDX0ZFTkNFX1lPRkYsIGNydGMtPnkpOwoJSTkxNV9XUklURShJTEtfRkJD X1JUX0JBU0UsIG9iai0+Z3R0X29mZnNldCB8IElMS19GQkNfUlRfVkFMSUQpOwoJLyogZW5hYmxl IGl0Li4uICovCglJOTE1X1dSSVRFKElMS19EUEZDX0NPTlRST0wsIGRwZmNfY3RsIHwgRFBGQ19D VExfRU4pOwoKCWlmIChJU19HRU42KGRldikpIHsKCQlJOTE1X1dSSVRFKFNOQl9EUEZDX0NUTF9T QSwKCQkJICAgU05CX0NQVV9GRU5DRV9FTkFCTEUgfCBkZXZfcHJpdi0+Y2ZiX2ZlbmNlKTsKCQlJ OTE1X1dSSVRFKERQRkNfQ1BVX0ZFTkNFX09GRlNFVCwgY3J0Yy0+eSk7CgkJc2FuZHlicmlkZ2Vf YmxpdF9mYmNfdXBkYXRlKGRldik7Cgl9CgoJRFJNX0RFQlVHX0tNUygiZW5hYmxlZCBmYmMgb24g cGxhbmUgJWRcbiIsIGludGVsX2NydGMtPnBsYW5lKTsKfQoKdm9pZCBpcm9ubGFrZV9kaXNhYmxl X2ZiYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJdTMyIGRwZmNfY3RsOwoKCS8qIERpc2FibGUg Y29tcHJlc3Npb24gKi8KCWRwZmNfY3RsID0gSTkxNV9SRUFEKElMS19EUEZDX0NPTlRST0wpOwoJ aWYgKGRwZmNfY3RsICYgRFBGQ19DVExfRU4pIHsKCQlkcGZjX2N0bCAmPSB+RFBGQ19DVExfRU47 CgkJSTkxNV9XUklURShJTEtfRFBGQ19DT05UUk9MLCBkcGZjX2N0bCk7CgoJCURSTV9ERUJVR19L TVMoImRpc2FibGVkIEZCQ1xuIik7Cgl9Cn0KCnN0YXRpYyBib29sIGlyb25sYWtlX2ZiY19lbmFi bGVkKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CgoJcmV0dXJuIEk5MTVfUkVBRChJTEtfRFBGQ19D T05UUk9MKSAmIERQRkNfQ1RMX0VOOwp9Cgpib29sIGludGVsX2ZiY19lbmFibGVkKHN0cnVjdCBk cm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRl di0+ZGV2X3ByaXZhdGU7CgoJaWYgKCFkZXZfcHJpdi0+ZGlzcGxheS5mYmNfZW5hYmxlZCkKCQly ZXR1cm4gZmFsc2U7CgoJcmV0dXJuIGRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkKGRldik7 Cn0KCnZvaWQgaW50ZWxfZW5hYmxlX2ZiYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIHVuc2lnbmVk IGxvbmcgaW50ZXJ2YWwpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGNy dGMtPmRldi0+ZGV2X3ByaXZhdGU7CgoJaWYgKCFkZXZfcHJpdi0+ZGlzcGxheS5lbmFibGVfZmJj KQoJCXJldHVybjsKCglkZXZfcHJpdi0+ZGlzcGxheS5lbmFibGVfZmJjKGNydGMsIGludGVydmFs KTsKfQoKdm9pZCBpbnRlbF9kaXNhYmxlX2ZiYyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7Cglz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoKCWlm ICghZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMpCgkJcmV0dXJuOwoKCWRldl9wcml2LT5k aXNwbGF5LmRpc2FibGVfZmJjKGRldik7Cn0KCi8qKgogKiBpbnRlbF91cGRhdGVfZmJjIC0gZW5h YmxlL2Rpc2FibGUgRkJDIGFzIG5lZWRlZAogKiBAZGV2OiB0aGUgZHJtX2RldmljZQogKgogKiBT ZXQgdXAgdGhlIGZyYW1lYnVmZmVyIGNvbXByZXNzaW9uIGhhcmR3YXJlIGF0IG1vZGUgc2V0IHRp bWUuICBXZQogKiBlbmFibGUgaXQgaWYgcG9zc2libGU6CiAqICAgLSBwbGFuZSBBIG9ubHkgKG9u IHByZS05NjUpCiAqICAgLSBubyBwaXhlbCBtdWxpdHBseS9saW5lIGR1cGxpY2F0aW9uCiAqICAg LSBubyBhbHBoYSBidWZmZXIgZGlzY2FyZAogKiAgIC0gbm8gZHVhbCB3aWRlCiAqICAgLSBmcmFt ZWJ1ZmZlciA8PSAyMDQ4IGluIHdpZHRoLCAxNTM2IGluIGhlaWdodAogKgogKiBXZSBjYW4ndCBh c3N1bWUgdGhhdCBhbnkgY29tcHJlc3Npb24gd2lsbCB0YWtlIHBsYWNlICh3b3JzdCBjYXNlKSwK ICogc28gdGhlIGNvbXByZXNzZWQgYnVmZmVyIGhhcyB0byBiZSB0aGUgc2FtZSBzaXplIGFzIHRo ZSB1bmNvbXByZXNzZWQKICogb25lLiAgSXQgYWxzbyBtdXN0IHJlc2lkZSAoYWxvbmcgd2l0aCB0 aGUgbGluZSBsZW5ndGggYnVmZmVyKSBpbgogKiBzdG9sZW4gbWVtb3J5LgogKgogKiBXZSBuZWVk IHRvIGVuYWJsZS9kaXNhYmxlIEZCQyBvbiBhIGdsb2JhbCBiYXNpcy4KICovCnN0YXRpYyB2b2lk IGludGVsX3VwZGF0ZV9mYmMoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBkcm1fY3J0 YyAqY3J0YyA9IE5VTEwsICp0bXBfY3J0YzsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRj OwoJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmI7CglzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIg KmludGVsX2ZiOwoJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKCglEUk1fREVCVUdf S01TKCJcbiIpOwoKCWlmICghaTkxNV9wb3dlcnNhdmUpCgkJcmV0dXJuOwoKCWlmICghSTkxNV9I QVNfRkJDKGRldikpCgkJcmV0dXJuOwoKCS8qCgkgKiBJZiBGQkMgaXMgYWxyZWFkeSBvbiwgd2Ug anVzdCBoYXZlIHRvIHZlcmlmeSB0aGF0IHdlIGNhbgoJICoga2VlcCBpdCB0aGF0IHdheS4uLgoJ ICogTmVlZCB0byBkaXNhYmxlIGlmOgoJICogICAtIG1vcmUgdGhhbiBvbmUgcGlwZSBpcyBhY3Rp dmUKCSAqICAgLSBjaGFuZ2luZyBGQkMgcGFyYW1zIChzdHJpZGUsIGZlbmNlLCBtb2RlKQoJICog ICAtIG5ldyBmYiBpcyB0b28gbGFyZ2UgdG8gZml0IGluIGNvbXByZXNzZWQgYnVmZmVyCgkgKiAg IC0gZ29pbmcgdG8gYW4gdW5zdXBwb3J0ZWQgY29uZmlnIChpbnRlcmxhY2UsIHBpeGVsIG11bHRp cGx5LCBldGMuKQoJICovCglsaXN0X2Zvcl9lYWNoX2VudHJ5KHRtcF9jcnRjLCAmZGV2LT5tb2Rl X2NvbmZpZy5jcnRjX2xpc3QsIGhlYWQpIHsKCQlpZiAodG1wX2NydGMtPmVuYWJsZWQpIHsKCQkJ aWYgKGNydGMpIHsKCQkJCURSTV9ERUJVR19LTVMoIm1vcmUgdGhhbiBvbmUgcGlwZSBhY3RpdmUs IGRpc2FibGluZyBjb21wcmVzc2lvblxuIik7CgkJCQlkZXZfcHJpdi0+bm9fZmJjX3JlYXNvbiA9 IEZCQ19NVUxUSVBMRV9QSVBFUzsKCQkJCWdvdG8gb3V0X2Rpc2FibGU7CgkJCX0KCQkJY3J0YyA9 IHRtcF9jcnRjOwoJCX0KCX0KCglpZiAoIWNydGMgfHwgY3J0Yy0+ZmIgPT0gTlVMTCkgewoJCURS TV9ERUJVR19LTVMoIm5vIG91dHB1dCwgZGlzYWJsaW5nXG4iKTsKCQlkZXZfcHJpdi0+bm9fZmJj X3JlYXNvbiA9IEZCQ19OT19PVVRQVVQ7CgkJZ290byBvdXRfZGlzYWJsZTsKCX0KCglpbnRlbF9j cnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCWZiID0gY3J0Yy0+ZmI7CglpbnRlbF9mYiA9IHRv X2ludGVsX2ZyYW1lYnVmZmVyKGZiKTsKCW9iaiA9IGludGVsX2ZiLT5vYmo7CgoJaWYgKGludGVs X2ZiLT5vYmotPmJhc2Uuc2l6ZSA+IGRldl9wcml2LT5jZmJfc2l6ZSkgewoJCURSTV9ERUJVR19L TVMoImZyYW1lYnVmZmVyIHRvbyBsYXJnZSwgZGlzYWJsaW5nICIKCQkJICAgICAgImNvbXByZXNz aW9uXG4iKTsKCQlkZXZfcHJpdi0+bm9fZmJjX3JlYXNvbiA9IEZCQ19TVE9MRU5fVE9PX1NNQUxM OwoJCWdvdG8gb3V0X2Rpc2FibGU7Cgl9CglpZiAoKGNydGMtPm1vZGUuZmxhZ3MgJiBEUk1fTU9E RV9GTEFHX0lOVEVSTEFDRSkgfHwKCSAgICAoY3J0Yy0+bW9kZS5mbGFncyAmIERSTV9NT0RFX0ZM QUdfREJMU0NBTikpIHsKCQlEUk1fREVCVUdfS01TKCJtb2RlIGluY29tcGF0aWJsZSB3aXRoIGNv bXByZXNzaW9uLCAiCgkJCSAgICAgICJkaXNhYmxpbmdcbiIpOwoJCWRldl9wcml2LT5ub19mYmNf cmVhc29uID0gRkJDX1VOU1VQUE9SVEVEX01PREU7CgkJZ290byBvdXRfZGlzYWJsZTsKCX0KCWlm ICgoY3J0Yy0+bW9kZS5oZGlzcGxheSA+IDIwNDgpIHx8CgkgICAgKGNydGMtPm1vZGUudmRpc3Bs YXkgPiAxNTM2KSkgewoJCURSTV9ERUJVR19LTVMoIm1vZGUgdG9vIGxhcmdlIGZvciBjb21wcmVz c2lvbiwgZGlzYWJsaW5nXG4iKTsKCQlkZXZfcHJpdi0+bm9fZmJjX3JlYXNvbiA9IEZCQ19NT0RF X1RPT19MQVJHRTsKCQlnb3RvIG91dF9kaXNhYmxlOwoJfQoJaWYgKChJU19JOTE1R00oZGV2KSB8 fCBJU19JOTQ1R00oZGV2KSkgJiYgaW50ZWxfY3J0Yy0+cGxhbmUgIT0gMCkgewoJCURSTV9ERUJV R19LTVMoInBsYW5lIG5vdCAwLCBkaXNhYmxpbmcgY29tcHJlc3Npb25cbiIpOwoJCWRldl9wcml2 LT5ub19mYmNfcmVhc29uID0gRkJDX0JBRF9QTEFORTsKCQlnb3RvIG91dF9kaXNhYmxlOwoJfQoJ aWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfWCkgewoJCURSTV9ERUJVR19LTVMo ImZyYW1lYnVmZmVyIG5vdCB0aWxlZCwgZGlzYWJsaW5nIGNvbXByZXNzaW9uXG4iKTsKCQlkZXZf cHJpdi0+bm9fZmJjX3JlYXNvbiA9IEZCQ19OT1RfVElMRUQ7CgkJZ290byBvdXRfZGlzYWJsZTsK CX0KCgkvKiBJZiB0aGUga2VybmVsIGRlYnVnZ2VyIGlzIGFjdGl2ZSwgYWx3YXlzIGRpc2FibGUg Y29tcHJlc3Npb24gKi8KCWlmIChpbl9kYmdfbWFzdGVyKCkpCgkJZ290byBvdXRfZGlzYWJsZTsK CglpbnRlbF9lbmFibGVfZmJjKGNydGMsIDUwMCk7CglyZXR1cm47CgpvdXRfZGlzYWJsZToKCS8q IE11bHRpcGxlIGRpc2FibGVzIHNob3VsZCBiZSBoYXJtbGVzcyAqLwoJaWYgKGludGVsX2ZiY19l bmFibGVkKGRldikpIHsKCQlEUk1fREVCVUdfS01TKCJ1bnN1cHBvcnRlZCBjb25maWcsIGRpc2Fi bGluZyBGQkNcbiIpOwoJCWludGVsX2Rpc2FibGVfZmJjKGRldik7Cgl9Cn0KCmludAppbnRlbF9w aW5fYW5kX2ZlbmNlX2ZiX29iaihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LAoJCQkgICBzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAoJCQkgICBzdHJ1Y3QgaW50ZWxfcmluZ19idWZmZXIg KnBpcGVsaW5lZCkKewoJdTMyIGFsaWdubWVudDsKCWludCByZXQ7CgoJc3dpdGNoIChvYmotPnRp bGluZ19tb2RlKSB7CgljYXNlIEk5MTVfVElMSU5HX05PTkU6CgkJaWYgKElTX0JST0FEV0FURVIo ZGV2KSB8fCBJU19DUkVTVExJTkUoZGV2KSkKCQkJYWxpZ25tZW50ID0gMTI4ICogMTAyNDsKCQll bHNlIGlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KQoJCQlhbGlnbm1lbnQgPSA0ICogMTAy NDsKCQllbHNlCgkJCWFsaWdubWVudCA9IDY0ICogMTAyNDsKCQlicmVhazsKCWNhc2UgSTkxNV9U SUxJTkdfWDoKCQkvKiBwaW4oKSB3aWxsIGFsaWduIHRoZSBvYmplY3QgYXMgcmVxdWlyZWQgYnkg ZmVuY2UgKi8KCQlhbGlnbm1lbnQgPSAwOwoJCWJyZWFrOwoJY2FzZSBJOTE1X1RJTElOR19ZOgoJ CS8qIEZJWE1FOiBJcyB0aGlzIHRydWU/ICovCgkJRFJNX0VSUk9SKCJZIHRpbGVkIG5vdCBhbGxv d2VkIGZvciBzY2FuIG91dCBidWZmZXJzXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCWRlZmF1bHQ6 CgkJQlVHKCk7Cgl9CgoJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3BpbihvYmosIGFsaWdubWVudCwg dHJ1ZSk7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3Nl dF90b19kaXNwbGF5X3BsYW5lKG9iaiwgcGlwZWxpbmVkKTsKCWlmIChyZXQpCgkJZ290byBlcnJf dW5waW47CgoJLyogSW5zdGFsbCBhIGZlbmNlIGZvciB0aWxlZCBzY2FuLW91dC4gUHJlLWk5NjUg YWx3YXlzIG5lZWRzIGEKCSAqIGZlbmNlLCB3aGVyZWFzIDk2NSsgb25seSByZXF1aXJlcyBhIGZl bmNlIGlmIHVzaW5nCgkgKiBmcmFtZWJ1ZmZlciBjb21wcmVzc2lvbi4gIEZvciBzaW1wbGljaXR5 LCB3ZSBhbHdheXMgaW5zdGFsbAoJICogYSBmZW5jZSBhcyB0aGUgY29zdCBpcyBub3QgdGhhdCBv bmVyb3VzLgoJICovCglpZiAob2JqLT50aWxpbmdfbW9kZSAhPSBJOTE1X1RJTElOR19OT05FKSB7 CgkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X2dldF9mZW5jZShvYmosIHBpcGVsaW5lZCwgZmFsc2Up OwoJCWlmIChyZXQpCgkJCWdvdG8gZXJyX3VucGluOwoJfQoKCXJldHVybiAwOwoKZXJyX3VucGlu OgoJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CglyZXR1cm4gcmV0Owp9CgovKiBBc3N1bWUg ZmIgb2JqZWN0IGlzIHBpbm5lZCAmIGlkbGUgJiBmZW5jZWQgYW5kIGp1c3QgdXBkYXRlIGJhc2Ug cG9pbnRlcnMgKi8Kc3RhdGljIGludAppbnRlbF9waXBlX3NldF9iYXNlX2F0b21pYyhzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMsIHN0cnVjdCBkcm1fZnJhbWVidWZmZXIgKmZiLAoJCQkgICBpbnQgeCwg aW50IHksIGVudW0gbW9kZV9zZXRfYXRvbWljIHN0YXRlKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAq ZGV2ID0gY3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2 LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxf Y3J0YyhjcnRjKTsKCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmI7CglzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwoJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+cGxhbmU7 Cgl1bnNpZ25lZCBsb25nIFN0YXJ0LCBPZmZzZXQ7Cgl1MzIgZHNwY250cjsKCXUzMiByZWc7CgoJ c3dpdGNoIChwbGFuZSkgewoJY2FzZSAwOgoJY2FzZSAxOgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlE Uk1fRVJST1IoIkNhbid0IHVwZGF0ZSBwbGFuZSAlZCBpbiBTQVJFQVxuIiwgcGxhbmUpOwoJCXJl dHVybiAtRUlOVkFMOwoJfQoKCWludGVsX2ZiID0gdG9faW50ZWxfZnJhbWVidWZmZXIoZmIpOwoJ b2JqID0gaW50ZWxfZmItPm9iajsKCglyZWcgPSBEU1BDTlRSKHBsYW5lKTsKCWRzcGNudHIgPSBJ OTE1X1JFQUQocmVnKTsKCS8qIE1hc2sgb3V0IHBpeGVsIGZvcm1hdCBiaXRzIGluIGNhc2Ugd2Ug Y2hhbmdlIGl0ICovCglkc3BjbnRyICY9IH5ESVNQUExBTkVfUElYRk9STUFUX01BU0s7Cglzd2l0 Y2ggKGZiLT5iaXRzX3Blcl9waXhlbCkgewoJY2FzZSA4OgoJCWRzcGNudHIgfD0gRElTUFBMQU5F XzhCUFA7CgkJYnJlYWs7CgljYXNlIDE2OgoJCWlmIChmYi0+ZGVwdGggPT0gMTUpCgkJCWRzcGNu dHIgfD0gRElTUFBMQU5FXzE1XzE2QlBQOwoJCWVsc2UKCQkJZHNwY250ciB8PSBESVNQUExBTkVf MTZCUFA7CgkJYnJlYWs7CgljYXNlIDI0OgoJY2FzZSAzMjoKCQlkc3BjbnRyIHw9IERJU1BQTEFO RV8zMkJQUF9OT19BTFBIQTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJRFJNX0VSUk9SKCJVbmtub3du IGNvbG9yIGRlcHRoXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCWlmIChJTlRFTF9JTkZPKGRl diktPmdlbiA+PSA0KSB7CgkJaWYgKG9iai0+dGlsaW5nX21vZGUgIT0gSTkxNV9USUxJTkdfTk9O RSkKCQkJZHNwY250ciB8PSBESVNQUExBTkVfVElMRUQ7CgkJZWxzZQoJCQlkc3BjbnRyICY9IH5E SVNQUExBTkVfVElMRUQ7Cgl9CgoJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKCQkvKiBtdXN0IGRp c2FibGUgKi8KCQlkc3BjbnRyIHw9IERJU1BQTEFORV9UUklDS0xFX0ZFRURfRElTQUJMRTsKCglJ OTE1X1dSSVRFKHJlZywgZHNwY250cik7CgoJU3RhcnQgPSBvYmotPmd0dF9vZmZzZXQ7CglPZmZz ZXQgPSB5ICogZmItPnBpdGNoICsgeCAqIChmYi0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKCglEUk1f REVCVUdfS01TKCJXcml0aW5nIGJhc2UgJTA4bFggJTA4bFggJWQgJWQgJWRcbiIsCgkJICAgICAg U3RhcnQsIE9mZnNldCwgeCwgeSwgZmItPnBpdGNoKTsKCUk5MTVfV1JJVEUoRFNQU1RSSURFKHBs YW5lKSwgZmItPnBpdGNoKTsKCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7CgkJSTkx NV9XUklURShEU1BTVVJGKHBsYW5lKSwgU3RhcnQpOwoJCUk5MTVfV1JJVEUoRFNQVElMRU9GRihw bGFuZSksICh5IDw8IDE2KSB8IHgpOwoJCUk5MTVfV1JJVEUoRFNQQUREUihwbGFuZSksIE9mZnNl dCk7Cgl9IGVsc2UKCQlJOTE1X1dSSVRFKERTUEFERFIocGxhbmUpLCBTdGFydCArIE9mZnNldCk7 CglQT1NUSU5HX1JFQUQocmVnKTsKCglpbnRlbF91cGRhdGVfZmJjKGRldik7CglpbnRlbF9pbmNy ZWFzZV9wbGxjbG9jayhjcnRjKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludAppbnRlbF9waXBl X3NldF9iYXNlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgaW50IHgsIGludCB5LAoJCSAgICBzdHJ1 Y3QgZHJtX2ZyYW1lYnVmZmVyICpvbGRfZmIpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBj cnRjLT5kZXY7CglzdHJ1Y3QgZHJtX2k5MTVfbWFzdGVyX3ByaXZhdGUgKm1hc3Rlcl9wcml2OwoJ c3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJaW50 IHJldDsKCgkvKiBubyBmYiBib3VuZCAqLwoJaWYgKCFjcnRjLT5mYikgewoJCURSTV9ERUJVR19L TVMoIk5vIEZCIGJvdW5kXG4iKTsKCQlyZXR1cm4gMDsKCX0KCglzd2l0Y2ggKGludGVsX2NydGMt PnBsYW5lKSB7CgljYXNlIDA6CgljYXNlIDE6CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAt RUlOVkFMOwoJfQoKCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCXJldCA9IGludGVs X3Bpbl9hbmRfZmVuY2VfZmJfb2JqKGRldiwKCQkJCQkgdG9faW50ZWxfZnJhbWVidWZmZXIoY3J0 Yy0+ZmIpLT5vYmosCgkJCQkJIE5VTEwpOwoJaWYgKHJldCAhPSAwKSB7CgkJbXV0ZXhfdW5sb2Nr KCZkZXYtPnN0cnVjdF9tdXRleCk7CgkJcmV0dXJuIHJldDsKCX0KCglpZiAob2xkX2ZiKSB7CgkJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCQlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdG9faW50ZWxfZnJhbWVidWZmZXIob2xk X2ZiKS0+b2JqOwoKCQl3YWl0X2V2ZW50KGRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUsCgkJ CSAgIGF0b21pY19yZWFkKCZvYmotPnBlbmRpbmdfZmxpcCkgPT0gMCk7CgoJCS8qIEJpZyBIYW1t ZXIsIHdlIGFsc28gbmVlZCB0byBlbnN1cmUgdGhhdCBhbnkgcGVuZGluZwoJCSAqIE1JX1dBSVRf Rk9SX0VWRU5UIGluc2lkZSBhIHVzZXIgYmF0Y2ggYnVmZmVyIG9uIHRoZQoJCSAqIGN1cnJlbnQg c2Nhbm91dCBpcyByZXRpcmVkIGJlZm9yZSB1bnBpbm5pbmcgdGhlIG9sZAoJCSAqIGZyYW1lYnVm ZmVyLgoJCSAqLwoJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9mbHVzaF9ncHUob2JqLCBmYWxzZSk7 CgkJaWYgKHJldCkgewoJCQlpOTE1X2dlbV9vYmplY3RfdW5waW4odG9faW50ZWxfZnJhbWVidWZm ZXIoY3J0Yy0+ZmIpLT5vYmopOwoJCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsK CQkJcmV0dXJuIHJldDsKCQl9Cgl9CgoJcmV0ID0gaW50ZWxfcGlwZV9zZXRfYmFzZV9hdG9taWMo Y3J0YywgY3J0Yy0+ZmIsIHgsIHksCgkJCQkJIExFQVZFX0FUT01JQ19NT0RFX1NFVCk7CglpZiAo cmV0KSB7CgkJaTkxNV9nZW1fb2JqZWN0X3VucGluKHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNydGMt PmZiKS0+b2JqKTsKCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsKCQlyZXR1cm4g cmV0OwoJfQoKCWlmIChvbGRfZmIpIHsKCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBpbnRl bF9jcnRjLT5waXBlKTsKCQlpOTE1X2dlbV9vYmplY3RfdW5waW4odG9faW50ZWxfZnJhbWVidWZm ZXIob2xkX2ZiKS0+b2JqKTsKCX0KCgltdXRleF91bmxvY2soJmRldi0+c3RydWN0X211dGV4KTsK CglpZiAoIWRldi0+cHJpbWFyeS0+bWFzdGVyKQoJCXJldHVybiAwOwoKCW1hc3Rlcl9wcml2ID0g ZGV2LT5wcmltYXJ5LT5tYXN0ZXItPmRyaXZlcl9wcml2OwoJaWYgKCFtYXN0ZXJfcHJpdi0+c2Fy ZWFfcHJpdikKCQlyZXR1cm4gMDsKCglpZiAoaW50ZWxfY3J0Yy0+cGlwZSkgewoJCW1hc3Rlcl9w cml2LT5zYXJlYV9wcml2LT5waXBlQl94ID0geDsKCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+ cGlwZUJfeSA9IHk7Cgl9IGVsc2UgewoJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQV94 ID0geDsKCQltYXN0ZXJfcHJpdi0+c2FyZWFfcHJpdi0+cGlwZUFfeSA9IHk7Cgl9CgoJcmV0dXJu IDA7Cn0KCnN0YXRpYyB2b2lkIGlyb25sYWtlX3NldF9wbGxfZWRwKHN0cnVjdCBkcm1fY3J0YyAq Y3J0YywgaW50IGNsb2NrKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwoJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXUz MiBkcGFfY3RsOwoKCURSTV9ERUJVR19LTVMoImVEUCBQTEwgZW5hYmxlIGZvciBjbG9jayAlZFxu IiwgY2xvY2spOwoJZHBhX2N0bCA9IEk5MTVfUkVBRChEUF9BKTsKCWRwYV9jdGwgJj0gfkRQX1BM TF9GUkVRX01BU0s7CgoJaWYgKGNsb2NrIDwgMjAwMDAwKSB7CgkJdTMyIHRlbXA7CgkJZHBhX2N0 bCB8PSBEUF9QTExfRlJFUV8xNjBNSFo7CgkJLyogd29ya2Fyb3VuZCBmb3IgMTYwTWh6OgoJCSAg IDEpIHByb2dyYW0gMHg0NjAwYyBiaXRzIDE1OjAgPSAweDgxMjQKCQkgICAyKSBwcm9ncmFtIDB4 NDYwMTAgYml0IDAgPSAxCgkJICAgMykgcHJvZ3JhbSAweDQ2MDM0IGJpdCAyNCA9IDEKCQkgICA0 KSBwcm9ncmFtIDB4NjQwMDAgYml0IDE0ID0gMQoJCSAgICovCgkJdGVtcCA9IEk5MTVfUkVBRCgw eDQ2MDBjKTsKCQl0ZW1wICY9IDB4ZmZmZjAwMDA7CgkJSTkxNV9XUklURSgweDQ2MDBjLCB0ZW1w IHwgMHg4MTI0KTsKCgkJdGVtcCA9IEk5MTVfUkVBRCgweDQ2MDEwKTsKCQlJOTE1X1dSSVRFKDB4 NDYwMTAsIHRlbXAgfCAxKTsKCgkJdGVtcCA9IEk5MTVfUkVBRCgweDQ2MDM0KTsKCQlJOTE1X1dS SVRFKDB4NDYwMzQsIHRlbXAgfCAoMSA8PCAyNCkpOwoJfSBlbHNlIHsKCQlkcGFfY3RsIHw9IERQ X1BMTF9GUkVRXzI3ME1IWjsKCX0KCUk5MTVfV1JJVEUoRFBfQSwgZHBhX2N0bCk7CgoJUE9TVElO R19SRUFEKERQX0EpOwoJdWRlbGF5KDUwMCk7Cn0KCnN0YXRpYyB2b2lkIGludGVsX2ZkaV9ub3Jt YWxfdHJhaW4oc3RydWN0IGRybV9jcnRjICpjcnRjKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 ID0gY3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5k ZXZfcHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0 YyhjcnRjKTsKCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKCXUzMiByZWcsIHRlbXA7CgoJ LyogZW5hYmxlIG5vcm1hbCB0cmFpbiAqLwoJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKCXRlbXAg PSBJOTE1X1JFQUQocmVnKTsKCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX05PTkU7Cgl0ZW1wIHw9 IEZESV9MSU5LX1RSQUlOX05PTkUgfCBGRElfVFhfRU5IQU5DRV9GUkFNRV9FTkFCTEU7CglJOTE1 X1dSSVRFKHJlZywgdGVtcCk7CgoJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKCXRlbXAgPSBJOTE1 X1JFQUQocmVnKTsKCWlmIChIQVNfUENIX0NQVChkZXYpKSB7CgkJdGVtcCAmPSB+RkRJX0xJTktf VFJBSU5fUEFUVEVSTl9NQVNLX0NQVDsKCQl0ZW1wIHw9IEZESV9MSU5LX1RSQUlOX05PUk1BTF9D UFQ7Cgl9IGVsc2UgewoJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX05PTkU7CgkJdGVtcCB8PSBG RElfTElOS19UUkFJTl9OT05FOwoJfQoJSTkxNV9XUklURShyZWcsIHRlbXAgfCBGRElfUlhfRU5I QU5DRV9GUkFNRV9FTkFCTEUpOwoKCS8qIHdhaXQgb25lIGlkbGUgcGF0dGVybiB0aW1lICovCglQ T1NUSU5HX1JFQUQocmVnKTsKCXVkZWxheSgxMDAwKTsKfQoKLyogVGhlIEZESSBsaW5rIHRyYWlu aW5nIGZ1bmN0aW9ucyBmb3IgSUxLL0liZXhwZWFrLiAqLwpzdGF0aWMgdm9pZCBpcm9ubGFrZV9m ZGlfbGlua190cmFpbihzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCnsKCXN0cnVjdCBkcm1fZGV2aWNl ICpkZXYgPSBjcnRjLT5kZXY7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBk ZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRl bF9jcnRjKGNydGMpOwoJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwoJdTMyIHJlZywgdGVt cCwgdHJpZXM7CgoJLyogVHJhaW4gMTogdW1hc2sgRkRJIFJYIEludGVycnVwdCBzeW1ib2xfbG9j ayBhbmQgYml0X2xvY2sgYml0CgkgICBmb3IgdHJhaW4gcmVzdWx0ICovCglyZWcgPSBGRElfUlhf SU1SKHBpcGUpOwoJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJdGVtcCAmPSB+RkRJX1JYX1NZTUJP TF9MT0NLOwoJdGVtcCAmPSB+RkRJX1JYX0JJVF9MT0NLOwoJSTkxNV9XUklURShyZWcsIHRlbXAp OwoJSTkxNV9SRUFEKHJlZyk7Cgl1ZGVsYXkoMTUwKTsKCgkvKiBlbmFibGUgQ1BVIEZESSBUWCBh bmQgUENIIEZESSBSWCAqLwoJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKCXRlbXAgPSBJOTE1X1JF QUQocmVnKTsKCXRlbXAgJj0gfig3IDw8IDE5KTsKCXRlbXAgfD0gKGludGVsX2NydGMtPmZkaV9s YW5lcyAtIDEpIDw8IDE5OwoJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fTk9ORTsKCXRlbXAgfD0g RkRJX0xJTktfVFJBSU5fUEFUVEVSTl8xOwoJSTkxNV9XUklURShyZWcsIHRlbXAgfCBGRElfVFhf RU5BQkxFKTsKCglyZWcgPSBGRElfUlhfQ1RMKHBpcGUpOwoJdGVtcCA9IEk5MTVfUkVBRChyZWcp OwoJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fTk9ORTsKCXRlbXAgfD0gRkRJX0xJTktfVFJBSU5f UEFUVEVSTl8xOwoJSTkxNV9XUklURShyZWcsIHRlbXAgfCBGRElfUlhfRU5BQkxFKTsKCglQT1NU SU5HX1JFQUQocmVnKTsKCXVkZWxheSgxNTApOwoKCS8qIElyb25sYWtlIHdvcmthcm91bmQsIGVu YWJsZSBjbG9jayBwb2ludGVyIGFmdGVyIEZESSBlbmFibGUqLwoJSTkxNV9XUklURShGRElfUlhf Q0hJQ0tFTihwaXBlKSwgRkRJX1JYX1BIQVNFX1NZTkNfUE9JTlRFUl9FTkFCTEUpOwoKCXJlZyA9 IEZESV9SWF9JSVIocGlwZSk7Cglmb3IgKHRyaWVzID0gMDsgdHJpZXMgPCA1OyB0cmllcysrKSB7 CgkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJCURSTV9ERUJVR19LTVMoIkZESV9SWF9JSVIgMHgl eFxuIiwgdGVtcCk7CgoJCWlmICgodGVtcCAmIEZESV9SWF9CSVRfTE9DSykpIHsKCQkJRFJNX0RF QlVHX0tNUygiRkRJIHRyYWluIDEgZG9uZS5cbiIpOwoJCQlJOTE1X1dSSVRFKHJlZywgdGVtcCB8 IEZESV9SWF9CSVRfTE9DSyk7CgkJCWJyZWFrOwoJCX0KCX0KCWlmICh0cmllcyA9PSA1KQoJCURS TV9FUlJPUigiRkRJIHRyYWluIDEgZmFpbCFcbiIpOwoKCS8qIFRyYWluIDIgKi8KCXJlZyA9IEZE SV9UWF9DVEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7Cgl0ZW1wICY9IH5GRElfTElO S19UUkFJTl9OT05FOwoJdGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzI7CglJOTE1X1dS SVRFKHJlZywgdGVtcCk7CgoJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKCXRlbXAgPSBJOTE1X1JF QUQocmVnKTsKCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX05PTkU7Cgl0ZW1wIHw9IEZESV9MSU5L X1RSQUlOX1BBVFRFUk5fMjsKCUk5MTVfV1JJVEUocmVnLCB0ZW1wKTsKCglQT1NUSU5HX1JFQUQo cmVnKTsKCXVkZWxheSgxNTApOwoKCXJlZyA9IEZESV9SWF9JSVIocGlwZSk7Cglmb3IgKHRyaWVz ID0gMDsgdHJpZXMgPCA1OyB0cmllcysrKSB7CgkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJCURS TV9ERUJVR19LTVMoIkZESV9SWF9JSVIgMHgleFxuIiwgdGVtcCk7CgoJCWlmICh0ZW1wICYgRkRJ X1JYX1NZTUJPTF9MT0NLKSB7CgkJCUk5MTVfV1JJVEUocmVnLCB0ZW1wIHwgRkRJX1JYX1NZTUJP TF9MT0NLKTsKCQkJRFJNX0RFQlVHX0tNUygiRkRJIHRyYWluIDIgZG9uZS5cbiIpOwoJCQlicmVh azsKCQl9Cgl9CglpZiAodHJpZXMgPT0gNSkKCQlEUk1fRVJST1IoIkZESSB0cmFpbiAyIGZhaWwh XG4iKTsKCglEUk1fREVCVUdfS01TKCJGREkgdHJhaW4gZG9uZVxuIik7Cgp9CgpzdGF0aWMgY29u c3QgaW50IGNvbnN0IHNuYl9iX2ZkaV90cmFpbl9wYXJhbSBbXSA9IHsKCUZESV9MSU5LX1RSQUlO XzQwME1WXzBEQl9TTkJfQiwKCUZESV9MSU5LX1RSQUlOXzQwME1WXzZEQl9TTkJfQiwKCUZESV9M SU5LX1RSQUlOXzYwME1WXzNfNURCX1NOQl9CLAoJRkRJX0xJTktfVFJBSU5fODAwTVZfMERCX1NO Ql9CLAp9OwoKLyogVGhlIEZESSBsaW5rIHRyYWluaW5nIGZ1bmN0aW9ucyBmb3IgU05CL0NvdWdh cnBvaW50LiAqLwpzdGF0aWMgdm9pZCBnZW42X2ZkaV9saW5rX3RyYWluKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50 ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGlwZSA9IGlu dGVsX2NydGMtPnBpcGU7Cgl1MzIgcmVnLCB0ZW1wLCBpOwoKCS8qIFRyYWluIDE6IHVtYXNrIEZE SSBSWCBJbnRlcnJ1cHQgc3ltYm9sX2xvY2sgYW5kIGJpdF9sb2NrIGJpdAoJICAgZm9yIHRyYWlu IHJlc3VsdCAqLwoJcmVnID0gRkRJX1JYX0lNUihwaXBlKTsKCXRlbXAgPSBJOTE1X1JFQUQocmVn KTsKCXRlbXAgJj0gfkZESV9SWF9TWU1CT0xfTE9DSzsKCXRlbXAgJj0gfkZESV9SWF9CSVRfTE9D SzsKCUk5MTVfV1JJVEUocmVnLCB0ZW1wKTsKCglQT1NUSU5HX1JFQUQocmVnKTsKCXVkZWxheSgx NTApOwoKCS8qIGVuYWJsZSBDUFUgRkRJIFRYIGFuZCBQQ0ggRkRJIFJYICovCglyZWcgPSBGRElf VFhfQ1RMKHBpcGUpOwoJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJdGVtcCAmPSB+KDcgPDwgMTkp OwoJdGVtcCB8PSAoaW50ZWxfY3J0Yy0+ZmRpX2xhbmVzIC0gMSkgPDwgMTk7Cgl0ZW1wICY9IH5G RElfTElOS19UUkFJTl9OT05FOwoJdGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzE7Cgl0 ZW1wICY9IH5GRElfTElOS19UUkFJTl9WT0xfRU1QX01BU0s7CgkvKiBTTkItQiAqLwoJdGVtcCB8 PSBGRElfTElOS19UUkFJTl80MDBNVl8wREJfU05CX0I7CglJOTE1X1dSSVRFKHJlZywgdGVtcCB8 IEZESV9UWF9FTkFCTEUpOwoKCXJlZyA9IEZESV9SWF9DVEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9S RUFEKHJlZyk7CglpZiAoSEFTX1BDSF9DUFQoZGV2KSkgewoJCXRlbXAgJj0gfkZESV9MSU5LX1RS QUlOX1BBVFRFUk5fTUFTS19DUFQ7CgkJdGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzFf Q1BUOwoJfSBlbHNlIHsKCQl0ZW1wICY9IH5GRElfTElOS19UUkFJTl9OT05FOwoJCXRlbXAgfD0g RkRJX0xJTktfVFJBSU5fUEFUVEVSTl8xOwoJfQoJSTkxNV9XUklURShyZWcsIHRlbXAgfCBGRElf UlhfRU5BQkxFKTsKCglQT1NUSU5HX1JFQUQocmVnKTsKCXVkZWxheSgxNTApOwoKCWZvciAoaSA9 IDA7IGkgPCA0OyBpKysgKSB7CgkJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKCQl0ZW1wID0gSTkx NV9SRUFEKHJlZyk7CgkJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLOwoJCXRl bXAgfD0gc25iX2JfZmRpX3RyYWluX3BhcmFtW2ldOwoJCUk5MTVfV1JJVEUocmVnLCB0ZW1wKTsK CgkJUE9TVElOR19SRUFEKHJlZyk7CgkJdWRlbGF5KDUwMCk7CgoJCXJlZyA9IEZESV9SWF9JSVIo cGlwZSk7CgkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJCURSTV9ERUJVR19LTVMoIkZESV9SWF9J SVIgMHgleFxuIiwgdGVtcCk7CgoJCWlmICh0ZW1wICYgRkRJX1JYX0JJVF9MT0NLKSB7CgkJCUk5 MTVfV1JJVEUocmVnLCB0ZW1wIHwgRkRJX1JYX0JJVF9MT0NLKTsKCQkJRFJNX0RFQlVHX0tNUygi RkRJIHRyYWluIDEgZG9uZS5cbiIpOwoJCQlicmVhazsKCQl9Cgl9CglpZiAoaSA9PSA0KQoJCURS TV9FUlJPUigiRkRJIHRyYWluIDEgZmFpbCFcbiIpOwoKCS8qIFRyYWluIDIgKi8KCXJlZyA9IEZE SV9UWF9DVEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7Cgl0ZW1wICY9IH5GRElfTElO S19UUkFJTl9OT05FOwoJdGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzI7CglpZiAoSVNf R0VONihkZXYpKSB7CgkJdGVtcCAmPSB+RkRJX0xJTktfVFJBSU5fVk9MX0VNUF9NQVNLOwoJCS8q IFNOQi1CICovCgkJdGVtcCB8PSBGRElfTElOS19UUkFJTl80MDBNVl8wREJfU05CX0I7Cgl9CglJ OTE1X1dSSVRFKHJlZywgdGVtcCk7CgoJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKCXRlbXAgPSBJ OTE1X1JFQUQocmVnKTsKCWlmIChIQVNfUENIX0NQVChkZXYpKSB7CgkJdGVtcCAmPSB+RkRJX0xJ TktfVFJBSU5fUEFUVEVSTl9NQVNLX0NQVDsKCQl0ZW1wIHw9IEZESV9MSU5LX1RSQUlOX1BBVFRF Uk5fMl9DUFQ7Cgl9IGVsc2UgewoJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX05PTkU7CgkJdGVt cCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzI7Cgl9CglJOTE1X1dSSVRFKHJlZywgdGVtcCk7 CgoJUE9TVElOR19SRUFEKHJlZyk7Cgl1ZGVsYXkoMTUwKTsKCglmb3IgKGkgPSAwOyBpIDwgNDsg aSsrICkgewoJCXJlZyA9IEZESV9UWF9DVEwocGlwZSk7CgkJdGVtcCA9IEk5MTVfUkVBRChyZWcp OwoJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX1ZPTF9FTVBfTUFTSzsKCQl0ZW1wIHw9IHNuYl9i X2ZkaV90cmFpbl9wYXJhbVtpXTsKCQlJOTE1X1dSSVRFKHJlZywgdGVtcCk7CgoJCVBPU1RJTkdf UkVBRChyZWcpOwoJCXVkZWxheSg1MDApOwoKCQlyZWcgPSBGRElfUlhfSUlSKHBpcGUpOwoJCXRl bXAgPSBJOTE1X1JFQUQocmVnKTsKCQlEUk1fREVCVUdfS01TKCJGRElfUlhfSUlSIDB4JXhcbiIs IHRlbXApOwoKCQlpZiAodGVtcCAmIEZESV9SWF9TWU1CT0xfTE9DSykgewoJCQlJOTE1X1dSSVRF KHJlZywgdGVtcCB8IEZESV9SWF9TWU1CT0xfTE9DSyk7CgkJCURSTV9ERUJVR19LTVMoIkZESSB0 cmFpbiAyIGRvbmUuXG4iKTsKCQkJYnJlYWs7CgkJfQoJfQoJaWYgKGkgPT0gNCkKCQlEUk1fRVJS T1IoIkZESSB0cmFpbiAyIGZhaWwhXG4iKTsKCglEUk1fREVCVUdfS01TKCJGREkgdHJhaW4gZG9u ZS5cbiIpOwp9CgpzdGF0aWMgdm9pZCBpcm9ubGFrZV9mZGlfZW5hYmxlKHN0cnVjdCBkcm1fY3J0 YyAqY3J0YykKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50 ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGlwZSA9IGlu dGVsX2NydGMtPnBpcGU7Cgl1MzIgcmVnLCB0ZW1wOwoKCS8qIFdyaXRlIHRoZSBUVSBzaXplIGJp dHMgc28gZXJyb3IgZGV0ZWN0aW9uIHdvcmtzICovCglJOTE1X1dSSVRFKEZESV9SWF9UVVNJWkUx KHBpcGUpLAoJCSAgIEk5MTVfUkVBRChQSVBFX0RBVEFfTTEocGlwZSkpICYgVFVfU0laRV9NQVNL KTsKCgkvKiBlbmFibGUgUENIIEZESSBSWCBQTEwsIHdhaXQgd2FybXVwIHBsdXMgRE1JIGxhdGVu Y3kgKi8KCXJlZyA9IEZESV9SWF9DVEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7Cgl0 ZW1wICY9IH4oKDB4NyA8PCAxOSkgfCAoMHg3IDw8IDE2KSk7Cgl0ZW1wIHw9IChpbnRlbF9jcnRj LT5mZGlfbGFuZXMgLSAxKSA8PCAxOTsKCXRlbXAgfD0gKEk5MTVfUkVBRChQSVBFQ09ORihwaXBl KSkgJiBQSVBFX0JQQ19NQVNLKSA8PCAxMTsKCUk5MTVfV1JJVEUocmVnLCB0ZW1wIHwgRkRJX1JY X1BMTF9FTkFCTEUpOwoKCVBPU1RJTkdfUkVBRChyZWcpOwoJdWRlbGF5KDIwMCk7CgoJLyogU3dp dGNoIGZyb20gUmF3Y2xrIHRvIFBDRGNsayAqLwoJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJSTkx NV9XUklURShyZWcsIHRlbXAgfCBGRElfUENEQ0xLKTsKCglQT1NUSU5HX1JFQUQocmVnKTsKCXVk ZWxheSgyMDApOwoKCS8qIEVuYWJsZSBDUFUgRkRJIFRYIFBMTCwgYWx3YXlzIG9uIGZvciBJcm9u bGFrZSAqLwoJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsK CWlmICgodGVtcCAmIEZESV9UWF9QTExfRU5BQkxFKSA9PSAwKSB7CgkJSTkxNV9XUklURShyZWcs IHRlbXAgfCBGRElfVFhfUExMX0VOQUJMRSk7CgoJCVBPU1RJTkdfUkVBRChyZWcpOwoJCXVkZWxh eSgxMDApOwoJfQp9CgpzdGF0aWMgdm9pZCBpbnRlbF9mbHVzaF9kaXNwbGF5X3BsYW5lKHN0cnVj dCBkcm1fZGV2aWNlICpkZXYsCgkJCQkgICAgICBpbnQgcGxhbmUpCnsKCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgl1MzIgcmVnID0gRFNQQURE UihwbGFuZSk7CglJOTE1X1dSSVRFKHJlZywgSTkxNV9SRUFEKHJlZykpOwp9CgovKgogKiBXaGVu IHdlIGRpc2FibGUgYSBwaXBlLCB3ZSBuZWVkIHRvIGNsZWFyIGFueSBwZW5kaW5nIHNjYW5saW5l IHdhaXQgZXZlbnRzCiAqIHRvIGF2b2lkIGhhbmdpbmcgdGhlIHJpbmcsIHdoaWNoIHdlIGFzc3Vt ZSB3ZSBhcmUgd2FpdGluZyBvbi4KICovCnN0YXRpYyB2b2lkIGludGVsX2NsZWFyX3NjYW5saW5l X3dhaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9yaW5nX2J1ZmZlciAq cmluZzsKCXUzMiB0bXA7CgoJaWYgKElTX0dFTjIoZGV2KSkKCQkvKiBDYW4ndCBicmVhayB0aGUg aGFuZyBvbiBpOHh4ICovCgkJcmV0dXJuOwoKCXJpbmcgPSBMUF9SSU5HKGRldl9wcml2KTsKCXRt cCA9IEk5MTVfUkVBRF9DVEwocmluZyk7CglpZiAodG1wICYgUklOR19XQUlUKQoJCUk5MTVfV1JJ VEVfQ1RMKHJpbmcsIHRtcCk7Cn0KCnN0YXRpYyB2b2lkIGludGVsX2NydGNfd2FpdF9mb3JfcGVu ZGluZ19mbGlwcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCnsKCXN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmo7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CgoJaWYgKGNy dGMtPmZiID09IE5VTEwpCgkJcmV0dXJuOwoKCW9iaiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVyKGNy dGMtPmZiKS0+b2JqOwoJZGV2X3ByaXYgPSBjcnRjLT5kZXYtPmRldl9wcml2YXRlOwoJd2FpdF9l dmVudChkZXZfcHJpdi0+cGVuZGluZ19mbGlwX3F1ZXVlLAoJCSAgIGF0b21pY19yZWFkKCZvYmot PnBlbmRpbmdfZmxpcCkgPT0gMCk7Cn0KCnN0YXRpYyB2b2lkIGlyb25sYWtlX2NydGNfZW5hYmxl KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMt PmRldjsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZh dGU7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7 CglpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CglpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5w bGFuZTsKCXUzMiByZWcsIHRlbXA7CgoJaWYgKGludGVsX2NydGMtPmFjdGl2ZSkKCQlyZXR1cm47 CgoJaW50ZWxfY3J0Yy0+YWN0aXZlID0gdHJ1ZTsKCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGRl dik7CgoJaWYgKGludGVsX3BpcGVfaGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpKSB7 CgkJdGVtcCA9IEk5MTVfUkVBRChQQ0hfTFZEUyk7CgkJaWYgKCh0ZW1wICYgTFZEU19QT1JUX0VO KSA9PSAwKQoJCQlJOTE1X1dSSVRFKFBDSF9MVkRTLCB0ZW1wIHwgTFZEU19QT1JUX0VOKTsKCX0K Cglpcm9ubGFrZV9mZGlfZW5hYmxlKGNydGMpOwoKCS8qIEVuYWJsZSBwYW5lbCBmaXR0aW5nIGZv ciBMVkRTICovCglpZiAoZGV2X3ByaXYtPnBjaF9wZl9zaXplICYmCgkgICAgKGludGVsX3BpcGVf aGFzX3R5cGUoY3J0YywgSU5URUxfT1VUUFVUX0xWRFMpIHx8IEhBU19lRFApKSB7CgkJLyogRm9y Y2UgdXNlIG9mIGhhcmQtY29kZWQgZmlsdGVyIGNvZWZmaWNpZW50cwoJCSAqIGFzIHNvbWUgcHJl LXByb2dyYW1tZWQgdmFsdWVzIGFyZSBicm9rZW4sCgkJICogZS5nLiB4MjAxLgoJCSAqLwoJCUk5 MTVfV1JJVEUocGlwZSA/IFBGQl9DVExfMSA6IFBGQV9DVExfMSwKCQkJICAgUEZfRU5BQkxFIHwg UEZfRklMVEVSX01FRF8zeDMpOwoJCUk5MTVfV1JJVEUocGlwZSA/IFBGQl9XSU5fUE9TIDogUEZB X1dJTl9QT1MsCgkJCSAgIGRldl9wcml2LT5wY2hfcGZfcG9zKTsKCQlJOTE1X1dSSVRFKHBpcGUg PyBQRkJfV0lOX1NaIDogUEZBX1dJTl9TWiwKCQkJICAgZGV2X3ByaXYtPnBjaF9wZl9zaXplKTsK CX0KCgkvKiBFbmFibGUgQ1BVIHBpcGUgKi8KCXJlZyA9IFBJUEVDT05GKHBpcGUpOwoJdGVtcCA9 IEk5MTVfUkVBRChyZWcpOwoJaWYgKCh0ZW1wICYgUElQRUNPTkZfRU5BQkxFKSA9PSAwKSB7CgkJ STkxNV9XUklURShyZWcsIHRlbXAgfCBQSVBFQ09ORl9FTkFCTEUpOwoJCVBPU1RJTkdfUkVBRChy ZWcpOwoJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYsIGludGVsX2NydGMtPnBpcGUpOwoJfQoK CS8qIGNvbmZpZ3VyZSBhbmQgZW5hYmxlIENQVSBwbGFuZSAqLwoJcmVnID0gRFNQQ05UUihwbGFu ZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CglpZiAoKHRlbXAgJiBESVNQTEFZX1BMQU5FX0VO QUJMRSkgPT0gMCkgewoJCUk5MTVfV1JJVEUocmVnLCB0ZW1wIHwgRElTUExBWV9QTEFORV9FTkFC TEUpOwoJCWludGVsX2ZsdXNoX2Rpc3BsYXlfcGxhbmUoZGV2LCBwbGFuZSk7Cgl9CgoJLyogRm9y IFBDSCBvdXRwdXQsIHRyYWluaW5nIEZESSBsaW5rICovCglpZiAoSVNfR0VONihkZXYpKQoJCWdl bjZfZmRpX2xpbmtfdHJhaW4oY3J0Yyk7CgllbHNlCgkJaXJvbmxha2VfZmRpX2xpbmtfdHJhaW4o Y3J0Yyk7CgoJLyogZW5hYmxlIFBDSCBEUExMICovCglyZWcgPSBQQ0hfRFBMTChwaXBlKTsKCXRl bXAgPSBJOTE1X1JFQUQocmVnKTsKCWlmICgodGVtcCAmIERQTExfVkNPX0VOQUJMRSkgPT0gMCkg ewoJCUk5MTVfV1JJVEUocmVnLCB0ZW1wIHwgRFBMTF9WQ09fRU5BQkxFKTsKCQlQT1NUSU5HX1JF QUQocmVnKTsKCQl1ZGVsYXkoMjAwKTsKCX0KCglpZiAoSEFTX1BDSF9DUFQoZGV2KSkgewoJCS8q IEJlIHN1cmUgUENIIERQTEwgU0VMIGlzIHNldCAqLwoJCXRlbXAgPSBJOTE1X1JFQUQoUENIX0RQ TExfU0VMKTsKCQlpZiAocGlwZSA9PSAwICYmICh0ZW1wICYgVFJBTlNBX0RQTExfRU5BQkxFKSA9 PSAwKQoJCQl0ZW1wIHw9IChUUkFOU0FfRFBMTF9FTkFCTEUgfCBUUkFOU0FfRFBMTEFfU0VMKTsK CQllbHNlIGlmIChwaXBlID09IDEgJiYgKHRlbXAgJiBUUkFOU0JfRFBMTF9FTkFCTEUpID09IDAp CgkJCXRlbXAgfD0gKFRSQU5TQl9EUExMX0VOQUJMRSB8IFRSQU5TQl9EUExMQl9TRUwpOwoJCUk5 MTVfV1JJVEUoUENIX0RQTExfU0VMLCB0ZW1wKTsKCX0KCgkvKiBzZXQgdHJhbnNjb2RlciB0aW1p bmcgKi8KCUk5MTVfV1JJVEUoVFJBTlNfSFRPVEFMKHBpcGUpLCBJOTE1X1JFQUQoSFRPVEFMKHBp cGUpKSk7CglJOTE1X1dSSVRFKFRSQU5TX0hCTEFOSyhwaXBlKSwgSTkxNV9SRUFEKEhCTEFOSyhw aXBlKSkpOwoJSTkxNV9XUklURShUUkFOU19IU1lOQyhwaXBlKSwgIEk5MTVfUkVBRChIU1lOQyhw aXBlKSkpOwoKCUk5MTVfV1JJVEUoVFJBTlNfVlRPVEFMKHBpcGUpLCBJOTE1X1JFQUQoVlRPVEFM KHBpcGUpKSk7CglJOTE1X1dSSVRFKFRSQU5TX1ZCTEFOSyhwaXBlKSwgSTkxNV9SRUFEKFZCTEFO SyhwaXBlKSkpOwoJSTkxNV9XUklURShUUkFOU19WU1lOQyhwaXBlKSwgIEk5MTVfUkVBRChWU1lO QyhwaXBlKSkpOwoKCWludGVsX2ZkaV9ub3JtYWxfdHJhaW4oY3J0Yyk7CgoJLyogRm9yIFBDSCBE UCwgZW5hYmxlIFRSQU5TX0RQX0NUTCAqLwoJaWYgKEhBU19QQ0hfQ1BUKGRldikgJiYKCSAgICBp bnRlbF9waXBlX2hhc190eXBlKGNydGMsIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVCkpIHsKCQly ZWcgPSBUUkFOU19EUF9DVEwocGlwZSk7CgkJdGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJCXRlbXAg Jj0gfihUUkFOU19EUF9QT1JUX1NFTF9NQVNLIHwKCQkJICBUUkFOU19EUF9TWU5DX01BU0sgfAoJ CQkgIFRSQU5TX0RQX0JQQ19NQVNLKTsKCQl0ZW1wIHw9IChUUkFOU19EUF9PVVRQVVRfRU5BQkxF IHwKCQkJIFRSQU5TX0RQX0VOSF9GUkFNSU5HKTsKCQl0ZW1wIHw9IFRSQU5TX0RQXzhCUEM7CgoJ CWlmIChjcnRjLT5tb2RlLmZsYWdzICYgRFJNX01PREVfRkxBR19QSFNZTkMpCgkJCXRlbXAgfD0g VFJBTlNfRFBfSFNZTkNfQUNUSVZFX0hJR0g7CgkJaWYgKGNydGMtPm1vZGUuZmxhZ3MgJiBEUk1f TU9ERV9GTEFHX1BWU1lOQykKCQkJdGVtcCB8PSBUUkFOU19EUF9WU1lOQ19BQ1RJVkVfSElHSDsK CgkJc3dpdGNoIChpbnRlbF90cmFuc19kcF9wb3J0X3NlbChjcnRjKSkgewoJCWNhc2UgUENIX0RQ X0I6CgkJCXRlbXAgfD0gVFJBTlNfRFBfUE9SVF9TRUxfQjsKCQkJYnJlYWs7CgkJY2FzZSBQQ0hf RFBfQzoKCQkJdGVtcCB8PSBUUkFOU19EUF9QT1JUX1NFTF9DOwoJCQlicmVhazsKCQljYXNlIFBD SF9EUF9EOgoJCQl0ZW1wIHw9IFRSQU5TX0RQX1BPUlRfU0VMX0Q7CgkJCWJyZWFrOwoJCWRlZmF1 bHQ6CgkJCURSTV9ERUJVR19LTVMoIldyb25nIFBDSCBEUCBwb3J0IHJldHVybi4gR3Vlc3MgcG9y dCBCXG4iKTsKCQkJdGVtcCB8PSBUUkFOU19EUF9QT1JUX1NFTF9COwoJCQlicmVhazsKCQl9CgoJ CUk5MTVfV1JJVEUocmVnLCB0ZW1wKTsKCX0KCgkvKiBlbmFibGUgUENIIHRyYW5zY29kZXIgKi8K CXJlZyA9IFRSQU5TQ09ORihwaXBlKTsKCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKCS8qCgkgKiBt YWtlIHRoZSBCUEMgaW4gdHJhbnNjb2RlciBiZSBjb25zaXN0ZW50IHdpdGgKCSAqIHRoYXQgaW4g cGlwZWNvbmYgcmVnLgoJICovCgl0ZW1wICY9IH5QSVBFX0JQQ19NQVNLOwoJdGVtcCB8PSBJOTE1 X1JFQUQoUElQRUNPTkYocGlwZSkpICYgUElQRV9CUENfTUFTSzsKCUk5MTVfV1JJVEUocmVnLCB0 ZW1wIHwgVFJBTlNfRU5BQkxFKTsKCWlmICh3YWl0X2ZvcihJOTE1X1JFQUQocmVnKSAmIFRSQU5T X1NUQVRFX0VOQUJMRSwgMTAwKSkKCQlEUk1fRVJST1IoImZhaWxlZCB0byBlbmFibGUgdHJhbnNj b2RlciAlZFxuIiwgcGlwZSk7CgoJaW50ZWxfY3J0Y19sb2FkX2x1dChjcnRjKTsKCWludGVsX3Vw ZGF0ZV9mYmMoZGV2KTsKCWludGVsX2NydGNfdXBkYXRlX2N1cnNvcihjcnRjLCB0cnVlKTsKfQoK c3RhdGljIHZvaWQgaXJvbmxha2VfY3J0Y19kaXNhYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykK ewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50ZWxfY3J0YyAq aW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGlwZSA9IGludGVsX2NydGMt PnBpcGU7CglpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKCXUzMiByZWcsIHRlbXA7CgoJ aWYgKCFpbnRlbF9jcnRjLT5hY3RpdmUpCgkJcmV0dXJuOwoKCWludGVsX2NydGNfd2FpdF9mb3Jf cGVuZGluZ19mbGlwcyhjcnRjKTsKCWRybV92Ymxhbmtfb2ZmKGRldiwgcGlwZSk7CglpbnRlbF9j cnRjX3VwZGF0ZV9jdXJzb3IoY3J0YywgZmFsc2UpOwoKCS8qIERpc2FibGUgZGlzcGxheSBwbGFu ZSAqLwoJcmVnID0gRFNQQ05UUihwbGFuZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CglpZiAo dGVtcCAmIERJU1BMQVlfUExBTkVfRU5BQkxFKSB7CgkJSTkxNV9XUklURShyZWcsIHRlbXAgJiB+ RElTUExBWV9QTEFORV9FTkFCTEUpOwoJCWludGVsX2ZsdXNoX2Rpc3BsYXlfcGxhbmUoZGV2LCBw bGFuZSk7Cgl9CgoJaWYgKGRldl9wcml2LT5jZmJfcGxhbmUgPT0gcGxhbmUgJiYKCSAgICBkZXZf cHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYykKCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2Zi YyhkZXYpOwoKCS8qIGRpc2FibGUgY3B1IHBpcGUsIGRpc2FibGUgYWZ0ZXIgYWxsIHBsYW5lcyBk aXNhYmxlZCAqLwoJcmVnID0gUElQRUNPTkYocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7 CglpZiAodGVtcCAmIFBJUEVDT05GX0VOQUJMRSkgewoJCUk5MTVfV1JJVEUocmVnLCB0ZW1wICYg flBJUEVDT05GX0VOQUJMRSk7CgkJUE9TVElOR19SRUFEKHJlZyk7CgkJLyogd2FpdCBmb3IgY3B1 IHBpcGUgb2ZmLCBwaXBlIHN0YXRlICovCgkJaW50ZWxfd2FpdF9mb3JfcGlwZV9vZmYoZGV2LCBp bnRlbF9jcnRjLT5waXBlKTsKCX0KCgkvKiBEaXNhYmxlIFBGICovCglJOTE1X1dSSVRFKHBpcGUg PyBQRkJfQ1RMXzEgOiBQRkFfQ1RMXzEsIDApOwoJSTkxNV9XUklURShwaXBlID8gUEZCX1dJTl9T WiA6IFBGQV9XSU5fU1osIDApOwoKCS8qIGRpc2FibGUgQ1BVIEZESSB0eCBhbmQgUENIIEZESSBy eCAqLwoJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsKCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKCUk5 MTVfV1JJVEUocmVnLCB0ZW1wICYgfkZESV9UWF9FTkFCTEUpOwoJUE9TVElOR19SRUFEKHJlZyk7 CgoJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKCXRlbXAg Jj0gfigweDcgPDwgMTYpOwoJdGVtcCB8PSAoSTkxNV9SRUFEKFBJUEVDT05GKHBpcGUpKSAmIFBJ UEVfQlBDX01BU0spIDw8IDExOwoJSTkxNV9XUklURShyZWcsIHRlbXAgJiB+RkRJX1JYX0VOQUJM RSk7CgoJUE9TVElOR19SRUFEKHJlZyk7Cgl1ZGVsYXkoMTAwKTsKCgkvKiBJcm9ubGFrZSB3b3Jr YXJvdW5kLCBkaXNhYmxlIGNsb2NrIHBvaW50ZXIgYWZ0ZXIgZG93bmluZyBGREkgKi8KCWlmIChI QVNfUENIX0lCWChkZXYpKQoJCUk5MTVfV1JJVEUoRkRJX1JYX0NISUNLRU4ocGlwZSksCgkJCSAg IEk5MTVfUkVBRChGRElfUlhfQ0hJQ0tFTihwaXBlKSAmCgkJCQkgICAgIH5GRElfUlhfUEhBU0Vf U1lOQ19QT0lOVEVSX0VOQUJMRSkpOwoKCS8qIHN0aWxsIHNldCB0cmFpbiBwYXR0ZXJuIDEgKi8K CXJlZyA9IEZESV9UWF9DVEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7Cgl0ZW1wICY9 IH5GRElfTElOS19UUkFJTl9OT05FOwoJdGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzE7 CglJOTE1X1dSSVRFKHJlZywgdGVtcCk7CgoJcmVnID0gRkRJX1JYX0NUTChwaXBlKTsKCXRlbXAg PSBJOTE1X1JFQUQocmVnKTsKCWlmIChIQVNfUENIX0NQVChkZXYpKSB7CgkJdGVtcCAmPSB+RkRJ X0xJTktfVFJBSU5fUEFUVEVSTl9NQVNLX0NQVDsKCQl0ZW1wIHw9IEZESV9MSU5LX1RSQUlOX1BB VFRFUk5fMV9DUFQ7Cgl9IGVsc2UgewoJCXRlbXAgJj0gfkZESV9MSU5LX1RSQUlOX05PTkU7CgkJ dGVtcCB8PSBGRElfTElOS19UUkFJTl9QQVRURVJOXzE7Cgl9CgkvKiBCUEMgaW4gRkRJIHJ4IGlz IGNvbnNpc3RlbnQgd2l0aCB0aGF0IGluIFBJUEVDT05GICovCgl0ZW1wICY9IH4oMHgwNyA8PCAx Nik7Cgl0ZW1wIHw9IChJOTE1X1JFQUQoUElQRUNPTkYocGlwZSkpICYgUElQRV9CUENfTUFTSykg PDwgMTE7CglJOTE1X1dSSVRFKHJlZywgdGVtcCk7CgoJUE9TVElOR19SRUFEKHJlZyk7Cgl1ZGVs YXkoMTAwKTsKCglpZiAoaW50ZWxfcGlwZV9oYXNfdHlwZShjcnRjLCBJTlRFTF9PVVRQVVRfTFZE UykpIHsKCQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9MVkRTKTsKCQlpZiAodGVtcCAmIExWRFNfUE9S VF9FTikgewoJCQlJOTE1X1dSSVRFKFBDSF9MVkRTLCB0ZW1wICYgfkxWRFNfUE9SVF9FTik7CgkJ CVBPU1RJTkdfUkVBRChQQ0hfTFZEUyk7CgkJCXVkZWxheSgxMDApOwoJCX0KCX0KCgkvKiBkaXNh YmxlIFBDSCB0cmFuc2NvZGVyICovCglyZWcgPSBUUkFOU0NPTkYocGxhbmUpOwoJdGVtcCA9IEk5 MTVfUkVBRChyZWcpOwoJaWYgKHRlbXAgJiBUUkFOU19FTkFCTEUpIHsKCQlJOTE1X1dSSVRFKHJl ZywgdGVtcCAmIH5UUkFOU19FTkFCTEUpOwoJCS8qIHdhaXQgZm9yIFBDSCB0cmFuc2NvZGVyIG9m ZiwgdHJhbnNjb2RlciBzdGF0ZSAqLwoJCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKHJlZykgJiBU UkFOU19TVEFURV9FTkFCTEUpID09IDAsIDUwKSkKCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gZGlz YWJsZSB0cmFuc2NvZGVyXG4iKTsKCX0KCglpZiAoSEFTX1BDSF9DUFQoZGV2KSkgewoJCS8qIGRp c2FibGUgVFJBTlNfRFBfQ1RMICovCgkJcmVnID0gVFJBTlNfRFBfQ1RMKHBpcGUpOwoJCXRlbXAg PSBJOTE1X1JFQUQocmVnKTsKCQl0ZW1wICY9IH4oVFJBTlNfRFBfT1VUUFVUX0VOQUJMRSB8IFRS QU5TX0RQX1BPUlRfU0VMX01BU0spOwoJCUk5MTVfV1JJVEUocmVnLCB0ZW1wKTsKCgkJLyogZGlz YWJsZSBEUExMX1NFTCAqLwoJCXRlbXAgPSBJOTE1X1JFQUQoUENIX0RQTExfU0VMKTsKCQlpZiAo cGlwZSA9PSAwKQoJCQl0ZW1wICY9IH4oVFJBTlNBX0RQTExfRU5BQkxFIHwgVFJBTlNBX0RQTExC X1NFTCk7CgkJZWxzZQoJCQl0ZW1wICY9IH4oVFJBTlNCX0RQTExfRU5BQkxFIHwgVFJBTlNCX0RQ TExCX1NFTCk7CgkJSTkxNV9XUklURShQQ0hfRFBMTF9TRUwsIHRlbXApOwoJfQoKCS8qIGRpc2Fi bGUgUENIIERQTEwgKi8KCXJlZyA9IFBDSF9EUExMKHBpcGUpOwoJdGVtcCA9IEk5MTVfUkVBRChy ZWcpOwoJSTkxNV9XUklURShyZWcsIHRlbXAgJiB+RFBMTF9WQ09fRU5BQkxFKTsKCgkvKiBTd2l0 Y2ggZnJvbSBQQ0RjbGsgdG8gUmF3Y2xrICovCglyZWcgPSBGRElfUlhfQ1RMKHBpcGUpOwoJdGVt cCA9IEk5MTVfUkVBRChyZWcpOwoJSTkxNV9XUklURShyZWcsIHRlbXAgJiB+RkRJX1BDRENMSyk7 CgoJLyogRGlzYWJsZSBDUFUgRkRJIFRYIFBMTCAqLwoJcmVnID0gRkRJX1RYX0NUTChwaXBlKTsK CXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKCUk5MTVfV1JJVEUocmVnLCB0ZW1wICYgfkZESV9UWF9Q TExfRU5BQkxFKTsKCglQT1NUSU5HX1JFQUQocmVnKTsKCXVkZWxheSgxMDApOwoKCXJlZyA9IEZE SV9SWF9DVEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CglJOTE1X1dSSVRFKHJlZywg dGVtcCAmIH5GRElfUlhfUExMX0VOQUJMRSk7CgoJLyogV2FpdCBmb3IgdGhlIGNsb2NrcyB0byB0 dXJuIG9mZi4gKi8KCVBPU1RJTkdfUkVBRChyZWcpOwoJdWRlbGF5KDEwMCk7CgoJaW50ZWxfY3J0 Yy0+YWN0aXZlID0gZmFsc2U7CglpbnRlbF91cGRhdGVfd2F0ZXJtYXJrcyhkZXYpOwoJaW50ZWxf dXBkYXRlX2ZiYyhkZXYpOwoJaW50ZWxfY2xlYXJfc2NhbmxpbmVfd2FpdChkZXYpOwp9CgpzdGF0 aWMgdm9pZCBpcm9ubGFrZV9jcnRjX2RwbXMoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgbW9k ZSkKewoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMp OwoJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwoJaW50IHBsYW5lID0gaW50ZWxfY3J0Yy0+ cGxhbmU7CgoJLyogWFhYOiBXaGVuIG91ciBvdXRwdXRzIGFyZSBhbGwgdW5hd2FyZSBvZiBEUE1T IG1vZGVzIG90aGVyIHRoYW4gb2ZmCgkgKiBhbmQgb24sIHdlIHNob3VsZCBtYXAgdGhvc2UgbW9k ZXMgdG8gRFJNX01PREVfRFBNU19PRkYgaW4gdGhlIENSVEMuCgkgKi8KCXN3aXRjaCAobW9kZSkg ewoJY2FzZSBEUk1fTU9ERV9EUE1TX09OOgoJY2FzZSBEUk1fTU9ERV9EUE1TX1NUQU5EQlk6Cglj YXNlIERSTV9NT0RFX0RQTVNfU1VTUEVORDoKCQlEUk1fREVCVUdfS01TKCJjcnRjICVkLyVkIGRw bXMgb25cbiIsIHBpcGUsIHBsYW5lKTsKCQlpcm9ubGFrZV9jcnRjX2VuYWJsZShjcnRjKTsKCQli cmVhazsKCgljYXNlIERSTV9NT0RFX0RQTVNfT0ZGOgoJCURSTV9ERUJVR19LTVMoImNydGMgJWQv JWQgZHBtcyBvZmZcbiIsIHBpcGUsIHBsYW5lKTsKCQlpcm9ubGFrZV9jcnRjX2Rpc2FibGUoY3J0 Yyk7CgkJYnJlYWs7Cgl9Cn0KCnN0YXRpYyB2b2lkIGludGVsX2NydGNfZHBtc19vdmVybGF5KHN0 cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjLCBib29sIGVuYWJsZSkKewoJaWYgKCFlbmFibGUg JiYgaW50ZWxfY3J0Yy0+b3ZlcmxheSkgewoJCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBpbnRl bF9jcnRjLT5iYXNlLmRldjsKCgkJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJCSh2 b2lkKSBpbnRlbF9vdmVybGF5X3N3aXRjaF9vZmYoaW50ZWxfY3J0Yy0+b3ZlcmxheSwgZmFsc2Up OwoJCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJfQoKCS8qIExldCB1c2Vyc3Bh Y2Ugc3dpdGNoIHRoZSBvdmVybGF5IG9uIGFnYWluLiBJbiBtb3N0IGNhc2VzIHVzZXJzcGFjZQoJ ICogaGFzIHRvIHJlY29tcHV0ZSB3aGVyZSB0byBwdXQgaXQgYW55d2F5LgoJICovCn0KCnN0YXRp YyB2b2lkIGk5eHhfY3J0Y19lbmFibGUoc3RydWN0IGRybV9jcnRjICpjcnRjKQp7CglzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRj ID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKCWlu dCBwbGFuZSA9IGludGVsX2NydGMtPnBsYW5lOwoJdTMyIHJlZywgdGVtcDsKCglpZiAoaW50ZWxf Y3J0Yy0+YWN0aXZlKQoJCXJldHVybjsKCglpbnRlbF9jcnRjLT5hY3RpdmUgPSB0cnVlOwoJaW50 ZWxfdXBkYXRlX3dhdGVybWFya3MoZGV2KTsKCgkvKiBFbmFibGUgdGhlIERQTEwgKi8KCXJlZyA9 IERQTEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CglpZiAoKHRlbXAgJiBEUExMX1ZD T19FTkFCTEUpID09IDApIHsKCQlJOTE1X1dSSVRFKHJlZywgdGVtcCk7CgoJCS8qIFdhaXQgZm9y IHRoZSBjbG9ja3MgdG8gc3RhYmlsaXplLiAqLwoJCVBPU1RJTkdfUkVBRChyZWcpOwoJCXVkZWxh eSgxNTApOwoKCQlJOTE1X1dSSVRFKHJlZywgdGVtcCB8IERQTExfVkNPX0VOQUJMRSk7CgoJCS8q IFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gc3RhYmlsaXplLiAqLwoJCVBPU1RJTkdfUkVBRChyZWcp OwoJCXVkZWxheSgxNTApOwoKCQlJOTE1X1dSSVRFKHJlZywgdGVtcCB8IERQTExfVkNPX0VOQUJM RSk7CgoJCS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gc3RhYmlsaXplLiAqLwoJCVBPU1RJTkdf UkVBRChyZWcpOwoJCXVkZWxheSgxNTApOwoJfQoKCS8qIEVuYWJsZSB0aGUgcGlwZSAqLwoJcmVn ID0gUElQRUNPTkYocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CglpZiAoKHRlbXAgJiBQ SVBFQ09ORl9FTkFCTEUpID09IDApCgkJSTkxNV9XUklURShyZWcsIHRlbXAgfCBQSVBFQ09ORl9F TkFCTEUpOwoKCS8qIEVuYWJsZSB0aGUgcGxhbmUgKi8KCXJlZyA9IERTUENOVFIocGxhbmUpOwoJ dGVtcCA9IEk5MTVfUkVBRChyZWcpOwoJaWYgKCh0ZW1wICYgRElTUExBWV9QTEFORV9FTkFCTEUp ID09IDApIHsKCQlJOTE1X1dSSVRFKHJlZywgdGVtcCB8IERJU1BMQVlfUExBTkVfRU5BQkxFKTsK CQlpbnRlbF9mbHVzaF9kaXNwbGF5X3BsYW5lKGRldiwgcGxhbmUpOwoJfQoKCWludGVsX2NydGNf bG9hZF9sdXQoY3J0Yyk7CglpbnRlbF91cGRhdGVfZmJjKGRldik7CgoJLyogR2l2ZSB0aGUgb3Zl cmxheSBzY2FsZXIgYSBjaGFuY2UgdG8gZW5hYmxlIGlmIGl0J3Mgb24gdGhpcyBwaXBlICovCglp bnRlbF9jcnRjX2RwbXNfb3ZlcmxheShpbnRlbF9jcnRjLCB0cnVlKTsKCWludGVsX2NydGNfdXBk YXRlX2N1cnNvcihjcnRjLCB0cnVlKTsKfQoKc3RhdGljIHZvaWQgaTl4eF9jcnRjX2Rpc2FibGUo c3RydWN0IGRybV9jcnRjICpjcnRjKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ ZGV2OwoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0 ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsK CWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKCWludCBwbGFuZSA9IGludGVsX2NydGMtPnBs YW5lOwoJdTMyIHJlZywgdGVtcDsKCglpZiAoIWludGVsX2NydGMtPmFjdGl2ZSkKCQlyZXR1cm47 CgoJLyogR2l2ZSB0aGUgb3ZlcmxheSBzY2FsZXIgYSBjaGFuY2UgdG8gZGlzYWJsZSBpZiBpdCdz IG9uIHRoaXMgcGlwZSAqLwoJaW50ZWxfY3J0Y193YWl0X2Zvcl9wZW5kaW5nX2ZsaXBzKGNydGMp OwoJZHJtX3ZibGFua19vZmYoZGV2LCBwaXBlKTsKCWludGVsX2NydGNfZHBtc19vdmVybGF5KGlu dGVsX2NydGMsIGZhbHNlKTsKCWludGVsX2NydGNfdXBkYXRlX2N1cnNvcihjcnRjLCBmYWxzZSk7 CgoJaWYgKGRldl9wcml2LT5jZmJfcGxhbmUgPT0gcGxhbmUgJiYKCSAgICBkZXZfcHJpdi0+ZGlz cGxheS5kaXNhYmxlX2ZiYykKCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyhkZXYpOwoK CS8qIERpc2FibGUgZGlzcGxheSBwbGFuZSAqLwoJcmVnID0gRFNQQ05UUihwbGFuZSk7Cgl0ZW1w ID0gSTkxNV9SRUFEKHJlZyk7CglpZiAodGVtcCAmIERJU1BMQVlfUExBTkVfRU5BQkxFKSB7CgkJ STkxNV9XUklURShyZWcsIHRlbXAgJiB+RElTUExBWV9QTEFORV9FTkFCTEUpOwoJCS8qIEZsdXNo IHRoZSBwbGFuZSBjaGFuZ2VzICovCgkJaW50ZWxfZmx1c2hfZGlzcGxheV9wbGFuZShkZXYsIHBs YW5lKTsKCgkJLyogV2FpdCBmb3IgdmJsYW5rIGZvciB0aGUgZGlzYWJsZSB0byB0YWtlIGVmZmVj dCAqLwoJCWlmIChJU19HRU4yKGRldikpCgkJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYsIHBp cGUpOwoJfQoKCS8qIERvbid0IGRpc2FibGUgcGlwZSBBIG9yIHBpcGUgQSBQTExzIGlmIG5lZWRl ZCAqLwoJaWYgKHBpcGUgPT0gMCAmJiAoZGV2X3ByaXYtPnF1aXJrcyAmIFFVSVJLX1BJUEVBX0ZP UkNFKSkKCQlnb3RvIGRvbmU7CgoJLyogTmV4dCwgZGlzYWJsZSBkaXNwbGF5IHBpcGVzICovCgly ZWcgPSBQSVBFQ09ORihwaXBlKTsKCXRlbXAgPSBJOTE1X1JFQUQocmVnKTsKCWlmICh0ZW1wICYg UElQRUNPTkZfRU5BQkxFKSB7CgkJSTkxNV9XUklURShyZWcsIHRlbXAgJiB+UElQRUNPTkZfRU5B QkxFKTsKCgkJLyogV2FpdCBmb3IgdGhlIHBpcGUgdG8gdHVybiBvZmYgKi8KCQlQT1NUSU5HX1JF QUQocmVnKTsKCQlpbnRlbF93YWl0X2Zvcl9waXBlX29mZihkZXYsIHBpcGUpOwoJfQoKCXJlZyA9 IERQTEwocGlwZSk7Cgl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CglpZiAodGVtcCAmIERQTExfVkNP X0VOQUJMRSkgewoJCUk5MTVfV1JJVEUocmVnLCB0ZW1wICYgfkRQTExfVkNPX0VOQUJMRSk7CgoJ CS8qIFdhaXQgZm9yIHRoZSBjbG9ja3MgdG8gdHVybiBvZmYuICovCgkJUE9TVElOR19SRUFEKHJl Zyk7CgkJdWRlbGF5KDE1MCk7Cgl9Cgpkb25lOgoJaW50ZWxfY3J0Yy0+YWN0aXZlID0gZmFsc2U7 CglpbnRlbF91cGRhdGVfZmJjKGRldik7CglpbnRlbF91cGRhdGVfd2F0ZXJtYXJrcyhkZXYpOwoJ aW50ZWxfY2xlYXJfc2NhbmxpbmVfd2FpdChkZXYpOwp9CgpzdGF0aWMgdm9pZCBpOXh4X2NydGNf ZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2RlKQp7CgkvKiBYWFg6IFdoZW4gb3Vy IG91dHB1dHMgYXJlIGFsbCB1bmF3YXJlIG9mIERQTVMgbW9kZXMgb3RoZXIgdGhhbiBvZmYKCSAq IGFuZCBvbiwgd2Ugc2hvdWxkIG1hcCB0aG9zZSBtb2RlcyB0byBEUk1fTU9ERV9EUE1TX09GRiBp biB0aGUgQ1JUQy4KCSAqLwoJc3dpdGNoIChtb2RlKSB7CgljYXNlIERSTV9NT0RFX0RQTVNfT046 CgljYXNlIERSTV9NT0RFX0RQTVNfU1RBTkRCWToKCWNhc2UgRFJNX01PREVfRFBNU19TVVNQRU5E OgoJCWk5eHhfY3J0Y19lbmFibGUoY3J0Yyk7CgkJYnJlYWs7CgljYXNlIERSTV9NT0RFX0RQTVNf T0ZGOgoJCWk5eHhfY3J0Y19kaXNhYmxlKGNydGMpOwoJCWJyZWFrOwoJfQp9CgovKioKICogU2V0 cyB0aGUgcG93ZXIgbWFuYWdlbWVudCBtb2RlIG9mIHRoZSBwaXBlIGFuZCBwbGFuZS4KICovCnN0 YXRpYyB2b2lkIGludGVsX2NydGNfZHBtcyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMsIGludCBtb2Rl KQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBkcm1faTkxNV9t YXN0ZXJfcHJpdmF0ZSAqbWFzdGVyX3ByaXY7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0 YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7Cgli b29sIGVuYWJsZWQ7CgoJaWYgKGludGVsX2NydGMtPmRwbXNfbW9kZSA9PSBtb2RlKQoJCXJldHVy bjsKCglpbnRlbF9jcnRjLT5kcG1zX21vZGUgPSBtb2RlOwoKCWRldl9wcml2LT5kaXNwbGF5LmRw bXMoY3J0YywgbW9kZSk7CgoJaWYgKCFkZXYtPnByaW1hcnktPm1hc3RlcikKCQlyZXR1cm47CgoJ bWFzdGVyX3ByaXYgPSBkZXYtPnByaW1hcnktPm1hc3Rlci0+ZHJpdmVyX3ByaXY7CglpZiAoIW1h c3Rlcl9wcml2LT5zYXJlYV9wcml2KQoJCXJldHVybjsKCgllbmFibGVkID0gY3J0Yy0+ZW5hYmxl ZCAmJiBtb2RlICE9IERSTV9NT0RFX0RQTVNfT0ZGOwoKCXN3aXRjaCAocGlwZSkgewoJY2FzZSAw OgoJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQV93ID0gZW5hYmxlZCA/IGNydGMtPm1v ZGUuaGRpc3BsYXkgOiAwOwoJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQV9oID0gZW5h YmxlZCA/IGNydGMtPm1vZGUudmRpc3BsYXkgOiAwOwoJCWJyZWFrOwoJY2FzZSAxOgoJCW1hc3Rl cl9wcml2LT5zYXJlYV9wcml2LT5waXBlQl93ID0gZW5hYmxlZCA/IGNydGMtPm1vZGUuaGRpc3Bs YXkgOiAwOwoJCW1hc3Rlcl9wcml2LT5zYXJlYV9wcml2LT5waXBlQl9oID0gZW5hYmxlZCA/IGNy dGMtPm1vZGUudmRpc3BsYXkgOiAwOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlEUk1fRVJST1IoIkNh bid0IHVwZGF0ZSBwaXBlICVkIGluIFNBUkVBXG4iLCBwaXBlKTsKCQlicmVhazsKCX0KfQoKc3Rh dGljIHZvaWQgaW50ZWxfY3J0Y19kaXNhYmxlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJc3Ry dWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2 YXRlOwoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCgljcnRjX2Z1bmNzLT5k cG1zKGNydGMsIERSTV9NT0RFX0RQTVNfT0ZGKTsKCglpZiAoY3J0Yy0+ZmIpIHsKCQltdXRleF9s b2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CgkJaTkxNV9nZW1fb2JqZWN0X3VucGluKHRvX2ludGVs X2ZyYW1lYnVmZmVyKGNydGMtPmZiKS0+b2JqKTsKCQltdXRleF91bmxvY2soJmRldi0+c3RydWN0 X211dGV4KTsKCX0KfQoKLyogUHJlcGFyZSBmb3IgYSBtb2RlIHNldC4KICoKICogTm90ZSB3ZSBj b3VsZCBiZSBhIGxvdCBzbWFydGVyIGhlcmUuICBXZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2gg b3V0cHV0cwogKiB3aWxsIGJlIGVuYWJsZWQsIHdoaWNoIGRpc2FibGVkIChpbiBzaG9ydCwgaG93 IHRoZSBjb25maWcgd2lsbCBjaGFuZ2VzKQogKiBhbmQgcGVyZm9ybSB0aGUgbWluaW11bSBuZWNl c3Nhcnkgc3RlcHMgdG8gYWNjb21wbGlzaCB0aGF0LCBlLmcuIHVwZGF0aW5nCiAqIHdhdGVybWFy a3MsIEZCQyBjb25maWd1cmF0aW9uLCBtYWtpbmcgc3VyZSBQTExzIGFyZSBwcm9ncmFtbWVkIGNv cnJlY3RseSwKICogcGFuZWwgZml0dGluZyBpcyBpbiB0aGUgcHJvcGVyIHN0YXRlLCBldGMuCiAq LwpzdGF0aWMgdm9pZCBpOXh4X2NydGNfcHJlcGFyZShzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCnsK CWk5eHhfY3J0Y19kaXNhYmxlKGNydGMpOwp9CgpzdGF0aWMgdm9pZCBpOXh4X2NydGNfY29tbWl0 KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJaTl4eF9jcnRjX2VuYWJsZShjcnRjKTsKfQoKc3Rh dGljIHZvaWQgaXJvbmxha2VfY3J0Y19wcmVwYXJlKHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJ aXJvbmxha2VfY3J0Y19kaXNhYmxlKGNydGMpOwp9CgpzdGF0aWMgdm9pZCBpcm9ubGFrZV9jcnRj X2NvbW1pdChzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCnsKCWlyb25sYWtlX2NydGNfZW5hYmxlKGNy dGMpOwp9Cgp2b2lkIGludGVsX2VuY29kZXJfcHJlcGFyZSAoc3RydWN0IGRybV9lbmNvZGVyICpl bmNvZGVyKQp7CglzdHJ1Y3QgZHJtX2VuY29kZXJfaGVscGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNz ID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CgkvKiBsdmRzIGhhcyBpdHMgb3duIHZlcnNpb24g b2YgcHJlcGFyZSBzZWUgaW50ZWxfbHZkc19wcmVwYXJlICovCgllbmNvZGVyX2Z1bmNzLT5kcG1z KGVuY29kZXIsIERSTV9NT0RFX0RQTVNfT0ZGKTsKfQoKdm9pZCBpbnRlbF9lbmNvZGVyX2NvbW1p dCAoc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQp7CglzdHJ1Y3QgZHJtX2VuY29kZXJfaGVs cGVyX2Z1bmNzICplbmNvZGVyX2Z1bmNzID0gZW5jb2Rlci0+aGVscGVyX3ByaXZhdGU7CgkvKiBs dmRzIGhhcyBpdHMgb3duIHZlcnNpb24gb2YgY29tbWl0IHNlZSBpbnRlbF9sdmRzX2NvbW1pdCAq LwoJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKfQoKdm9p ZCBpbnRlbF9lbmNvZGVyX2Rlc3Ryb3koc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyKQp7Cglz dHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciA9IHRvX2ludGVsX2VuY29kZXIoZW5j b2Rlcik7CgoJZHJtX2VuY29kZXJfY2xlYW51cChlbmNvZGVyKTsKCWtmcmVlKGludGVsX2VuY29k ZXIpOwp9CgpzdGF0aWMgYm9vbCBpbnRlbF9jcnRjX21vZGVfZml4dXAoc3RydWN0IGRybV9jcnRj ICpjcnRjLAoJCQkJICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZSwKCQkJCSAgc3RydWN0 IGRybV9kaXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpk ZXYgPSBjcnRjLT5kZXY7CgoJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewoJCS8qIEZESSBsaW5r IGNsb2NrIGlzIGZpeGVkIGF0IDIuN0cgKi8KCQlpZiAobW9kZS0+Y2xvY2sgKiAzID4gSVJPTkxB S0VfRkRJX0ZSRVEgKiA0KQoJCQlyZXR1cm4gZmFsc2U7Cgl9CgoJLyogWFhYIHNvbWUgZW5jb2Rl cnMgc2V0IHRoZSBjcnRjaW5mbywgb3RoZXJzIGRvbid0LgoJICogT2J2aW91c2x5IHdlIG5lZWQg c29tZSBmb3JtIG9mIGNvbmZsaWN0IHJlc29sdXRpb24gaGVyZS4uLgoJICovCglpZiAoYWRqdXN0 ZWRfbW9kZS0+Y3J0Y19odG90YWwgPT0gMCkKCQlkcm1fbW9kZV9zZXRfY3J0Y2luZm8oYWRqdXN0 ZWRfbW9kZSwgMCk7CgoJcmV0dXJuIHRydWU7Cn0KCnN0YXRpYyBpbnQgaTk0NV9nZXRfZGlzcGxh eV9jbG9ja19zcGVlZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglyZXR1cm4gNDAwMDAwOwp9 CgpzdGF0aWMgaW50IGk5MTVfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQoc3RydWN0IGRybV9kZXZp Y2UgKmRldikKewoJcmV0dXJuIDMzMzAwMDsKfQoKc3RhdGljIGludCBpOXh4X21pc2NfZ2V0X2Rp c3BsYXlfY2xvY2tfc3BlZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJcmV0dXJuIDIwMDAw MDsKfQoKc3RhdGljIGludCBpOTE1Z21fZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQoc3RydWN0IGRy bV9kZXZpY2UgKmRldikKewoJdTE2IGdjZmdjID0gMDsKCglwY2lfcmVhZF9jb25maWdfd29yZChk ZXYtPnBkZXYsIEdDRkdDLCAmZ2NmZ2MpOwoKCWlmIChnY2ZnYyAmIEdDX0xPV19GUkVRVUVOQ1lf RU5BQkxFKQoJCXJldHVybiAxMzMwMDA7CgllbHNlIHsKCQlzd2l0Y2ggKGdjZmdjICYgR0NfRElT UExBWV9DTE9DS19NQVNLKSB7CgkJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzMzM19NSFo6CgkJCXJl dHVybiAzMzMwMDA7CgkJZGVmYXVsdDoKCQljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMTkwXzIwMF9N SFo6CgkJCXJldHVybiAxOTAwMDA7CgkJfQoJfQp9CgpzdGF0aWMgaW50IGk4NjVfZ2V0X2Rpc3Bs YXlfY2xvY2tfc3BlZWQoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJcmV0dXJuIDI2NjAwMDsK fQoKc3RhdGljIGludCBpODU1X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYpCnsKCXUxNiBocGxsY2MgPSAwOwoJLyogQXNzdW1lIHRoYXQgdGhlIGhhcmR3YXJl IGlzIGluIHRoZSBoaWdoIHNwZWVkIHN0YXRlLiAgVGhpcwoJICogc2hvdWxkIGJlIHRoZSBkZWZh dWx0LgoJICovCglzd2l0Y2ggKGhwbGxjYyAmIEdDX0NMT0NLX0NPTlRST0xfTUFTSykgewoJY2Fz ZSBHQ19DTE9DS18xMzNfMjAwOgoJY2FzZSBHQ19DTE9DS18xMDBfMjAwOgoJCXJldHVybiAyMDAw MDA7CgljYXNlIEdDX0NMT0NLXzE2Nl8yNTA6CgkJcmV0dXJuIDI1MDAwMDsKCWNhc2UgR0NfQ0xP Q0tfMTAwXzEzMzoKCQlyZXR1cm4gMTMzMDAwOwoJfQoKCS8qIFNob3VsZG4ndCBoYXBwZW4gKi8K CXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGk4MzBfZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQoc3Ry dWN0IGRybV9kZXZpY2UgKmRldikKewoJcmV0dXJuIDEzMzAwMDsKfQoKc3RydWN0IGZkaV9tX24g ewoJdTMyICAgICAgICB0dTsKCXUzMiAgICAgICAgZ21jaF9tOwoJdTMyICAgICAgICBnbWNoX247 Cgl1MzIgICAgICAgIGxpbmtfbTsKCXUzMiAgICAgICAgbGlua19uOwp9OwoKc3RhdGljIHZvaWQK ZmRpX3JlZHVjZV9yYXRpbyh1MzIgKm51bSwgdTMyICpkZW4pCnsKCXdoaWxlICgqbnVtID4gMHhm ZmZmZmYgfHwgKmRlbiA+IDB4ZmZmZmZmKSB7CgkJKm51bSA+Pj0gMTsKCQkqZGVuID4+PSAxOwoJ fQp9CgpzdGF0aWMgdm9pZAppcm9ubGFrZV9jb21wdXRlX21fbihpbnQgYml0c19wZXJfcGl4ZWws IGludCBubGFuZXMsIGludCBwaXhlbF9jbG9jaywKCQkgICAgIGludCBsaW5rX2Nsb2NrLCBzdHJ1 Y3QgZmRpX21fbiAqbV9uKQp7CgltX24tPnR1ID0gNjQ7IC8qIGRlZmF1bHQgc2l6ZSAqLwoKCS8q IEJVR19PTihwaXhlbF9jbG9jayA+IElOVF9NQVggLyAzNik7ICovCgltX24tPmdtY2hfbSA9IGJp dHNfcGVyX3BpeGVsICogcGl4ZWxfY2xvY2s7CgltX24tPmdtY2hfbiA9IGxpbmtfY2xvY2sgKiBu bGFuZXMgKiA4OwoJZmRpX3JlZHVjZV9yYXRpbygmbV9uLT5nbWNoX20sICZtX24tPmdtY2hfbik7 CgoJbV9uLT5saW5rX20gPSBwaXhlbF9jbG9jazsKCW1fbi0+bGlua19uID0gbGlua19jbG9jazsK CWZkaV9yZWR1Y2VfcmF0aW8oJm1fbi0+bGlua19tLCAmbV9uLT5saW5rX24pOwp9CgoKc3RydWN0 IGludGVsX3dhdGVybWFya19wYXJhbXMgewoJdW5zaWduZWQgbG9uZyBmaWZvX3NpemU7Cgl1bnNp Z25lZCBsb25nIG1heF93bTsKCXVuc2lnbmVkIGxvbmcgZGVmYXVsdF93bTsKCXVuc2lnbmVkIGxv bmcgZ3VhcmRfc2l6ZTsKCXVuc2lnbmVkIGxvbmcgY2FjaGVsaW5lX3NpemU7Cn07CgovKiBQaW5l dmlldyBoYXMgZGlmZmVyZW50IHZhbHVlcyBmb3IgdmFyaW91cyBjb25maWdzICovCnN0YXRpYyBz dHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBwaW5ldmlld19kaXNwbGF5X3dtID0gewoJUElO RVZJRVdfRElTUExBWV9GSUZPLAoJUElORVZJRVdfTUFYX1dNLAoJUElORVZJRVdfREZUX1dNLAoJ UElORVZJRVdfR1VBUkRfV00sCglQSU5FVklFV19GSUZPX0xJTkVfU0laRQp9OwpzdGF0aWMgc3Ry dWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgcGluZXZpZXdfZGlzcGxheV9ocGxsb2ZmX3dtID0g ewoJUElORVZJRVdfRElTUExBWV9GSUZPLAoJUElORVZJRVdfTUFYX1dNLAoJUElORVZJRVdfREZU X0hQTExPRkZfV00sCglQSU5FVklFV19HVUFSRF9XTSwKCVBJTkVWSUVXX0ZJRk9fTElORV9TSVpF Cn07CnN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBwaW5ldmlld19jdXJzb3Jf d20gPSB7CglQSU5FVklFV19DVVJTT1JfRklGTywKCVBJTkVWSUVXX0NVUlNPUl9NQVhfV00sCglQ SU5FVklFV19DVVJTT1JfREZUX1dNLAoJUElORVZJRVdfQ1VSU09SX0dVQVJEX1dNLAoJUElORVZJ RVdfRklGT19MSU5FX1NJWkUsCn07CnN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFt cyBwaW5ldmlld19jdXJzb3JfaHBsbG9mZl93bSA9IHsKCVBJTkVWSUVXX0NVUlNPUl9GSUZPLAoJ UElORVZJRVdfQ1VSU09SX01BWF9XTSwKCVBJTkVWSUVXX0NVUlNPUl9ERlRfV00sCglQSU5FVklF V19DVVJTT1JfR1VBUkRfV00sCglQSU5FVklFV19GSUZPX0xJTkVfU0laRQp9OwpzdGF0aWMgc3Ry dWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgZzR4X3dtX2luZm8gPSB7CglHNFhfRklGT19TSVpF LAoJRzRYX01BWF9XTSwKCUc0WF9NQVhfV00sCgkyLAoJRzRYX0ZJRk9fTElORV9TSVpFLAp9Owpz dGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgZzR4X2N1cnNvcl93bV9pbmZvID0g ewoJSTk2NV9DVVJTT1JfRklGTywKCUk5NjVfQ1VSU09SX01BWF9XTSwKCUk5NjVfQ1VSU09SX0RG VF9XTSwKCTIsCglHNFhfRklGT19MSU5FX1NJWkUsCn07CnN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0 ZXJtYXJrX3BhcmFtcyBpOTY1X2N1cnNvcl93bV9pbmZvID0gewoJSTk2NV9DVVJTT1JfRklGTywK CUk5NjVfQ1VSU09SX01BWF9XTSwKCUk5NjVfQ1VSU09SX0RGVF9XTSwKCTIsCglJOTE1X0ZJRk9f TElORV9TSVpFLAp9OwpzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaTk0NV93 bV9pbmZvID0gewoJSTk0NV9GSUZPX1NJWkUsCglJOTE1X01BWF9XTSwKCTEsCgkyLAoJSTkxNV9G SUZPX0xJTkVfU0laRQp9OwpzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaTkx NV93bV9pbmZvID0gewoJSTkxNV9GSUZPX1NJWkUsCglJOTE1X01BWF9XTSwKCTEsCgkyLAoJSTkx NV9GSUZPX0xJTkVfU0laRQp9OwpzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMg aTg1NV93bV9pbmZvID0gewoJSTg1NUdNX0ZJRk9fU0laRSwKCUk5MTVfTUFYX1dNLAoJMSwKCTIs CglJODMwX0ZJRk9fTElORV9TSVpFCn07CnN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3Bh cmFtcyBpODMwX3dtX2luZm8gPSB7CglJODMwX0ZJRk9fU0laRSwKCUk5MTVfTUFYX1dNLAoJMSwK CTIsCglJODMwX0ZJRk9fTElORV9TSVpFCn07CgpzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFy a19wYXJhbXMgaXJvbmxha2VfZGlzcGxheV93bV9pbmZvID0gewoJSUxLX0RJU1BMQVlfRklGTywK CUlMS19ESVNQTEFZX01BWFdNLAoJSUxLX0RJU1BMQVlfREZUV00sCgkyLAoJSUxLX0ZJRk9fTElO RV9TSVpFCn07CgpzdGF0aWMgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgaXJvbmxha2Vf Y3Vyc29yX3dtX2luZm8gPSB7CglJTEtfQ1VSU09SX0ZJRk8sCglJTEtfQ1VSU09SX01BWFdNLAoJ SUxLX0NVUlNPUl9ERlRXTSwKCTIsCglJTEtfRklGT19MSU5FX1NJWkUKfTsKCnN0YXRpYyBzdHJ1 Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBpcm9ubGFrZV9kaXNwbGF5X3Nyd21faW5mbyA9IHsK CUlMS19ESVNQTEFZX1NSX0ZJRk8sCglJTEtfRElTUExBWV9NQVhfU1JXTSwKCUlMS19ESVNQTEFZ X0RGVF9TUldNLAoJMiwKCUlMS19GSUZPX0xJTkVfU0laRQp9OwoKc3RhdGljIHN0cnVjdCBpbnRl bF93YXRlcm1hcmtfcGFyYW1zIGlyb25sYWtlX2N1cnNvcl9zcndtX2luZm8gPSB7CglJTEtfQ1VS U09SX1NSX0ZJRk8sCglJTEtfQ1VSU09SX01BWF9TUldNLAoJSUxLX0NVUlNPUl9ERlRfU1JXTSwK CTIsCglJTEtfRklGT19MSU5FX1NJWkUKfTsKCnN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJr X3BhcmFtcyBzYW5keWJyaWRnZV9kaXNwbGF5X3dtX2luZm8gPSB7CglTTkJfRElTUExBWV9GSUZP LAoJU05CX0RJU1BMQVlfTUFYV00sCglTTkJfRElTUExBWV9ERlRXTSwKCTIsCglTTkJfRklGT19M SU5FX1NJWkUKfTsKCnN0YXRpYyBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyBzYW5keWJy aWRnZV9jdXJzb3Jfd21faW5mbyA9IHsKCVNOQl9DVVJTT1JfRklGTywKCVNOQl9DVVJTT1JfTUFY V00sCglTTkJfQ1VSU09SX0RGVFdNLAoJMiwKCVNOQl9GSUZPX0xJTkVfU0laRQp9OwoKc3RhdGlj IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9p bmZvID0gewoJU05CX0RJU1BMQVlfU1JfRklGTywKCVNOQl9ESVNQTEFZX01BWF9TUldNLAoJU05C X0RJU1BMQVlfREZUX1NSV00sCgkyLAoJU05CX0ZJRk9fTElORV9TSVpFCn07CgpzdGF0aWMgc3Ry dWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgc2FuZHlicmlkZ2VfY3Vyc29yX3Nyd21faW5mbyA9 IHsKCVNOQl9DVVJTT1JfU1JfRklGTywKCVNOQl9DVVJTT1JfTUFYX1NSV00sCglTTkJfQ1VSU09S X0RGVF9TUldNLAoJMiwKCVNOQl9GSUZPX0xJTkVfU0laRQp9OwoKCi8qKgogKiBpbnRlbF9jYWxj dWxhdGVfd20gLSBjYWxjdWxhdGUgd2F0ZXJtYXJrIGxldmVsCiAqIEBjbG9ja19pbl9raHo6IHBp eGVsIGNsb2NrCiAqIEB3bTogY2hpcCBGSUZPIHBhcmFtcwogKiBAcGl4ZWxfc2l6ZTogZGlzcGxh eSBwaXhlbCBzaXplCiAqIEBsYXRlbmN5X25zOiBtZW1vcnkgbGF0ZW5jeSBmb3IgdGhlIHBsYXRm b3JtCiAqCiAqIENhbGN1bGF0ZSB0aGUgd2F0ZXJtYXJrIGxldmVsICh0aGUgbGV2ZWwgYXQgd2hp Y2ggdGhlIGRpc3BsYXkgcGxhbmUgd2lsbAogKiBzdGFydCBmZXRjaGluZyBmcm9tIG1lbW9yeSBh Z2FpbikuICBFYWNoIGNoaXAgaGFzIGEgZGlmZmVyZW50IGRpc3BsYXkKICogRklGTyBzaXplIGFu ZCBhbGxvY2F0aW9uLCBzbyB0aGUgY2FsbGVyIG5lZWRzIHRvIGZpZ3VyZSB0aGF0IG91dCBhbmQg cGFzcwogKiBpbiB0aGUgY29ycmVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHN0cnVjdHVyZS4K ICoKICogQXMgdGhlIHBpeGVsIGNsb2NrIHJ1bnMsIHRoZSBGSUZPIHdpbGwgYmUgZHJhaW5lZCBh dCBhIHJhdGUgdGhhdCBkZXBlbmRzCiAqIG9uIHRoZSBwaXhlbCBzaXplLiAgV2hlbiBpdCByZWFj aGVzIHRoZSB3YXRlcm1hcmsgbGV2ZWwsIGl0J2xsIHN0YXJ0CiAqIGZldGNoaW5nIEZJRk8gbGlu ZSBzaXplZCBiYXNlZCBjaHVua3MgZnJvbSBtZW1vcnkgdW50aWwgdGhlIEZJRk8gZmlsbHMKICog cGFzdCB0aGUgd2F0ZXJtYXJrIHBvaW50LiAgSWYgdGhlIEZJRk8gZHJhaW5zIGNvbXBsZXRlbHks IGEgRklGTyB1bmRlcnJ1bgogKiB3aWxsIG9jY3VyLCBhbmQgYSBkaXNwbGF5IGVuZ2luZSBoYW5n IGNvdWxkIHJlc3VsdC4KICovCnN0YXRpYyB1bnNpZ25lZCBsb25nIGludGVsX2NhbGN1bGF0ZV93 bSh1bnNpZ25lZCBsb25nIGNsb2NrX2luX2toeiwKCQkJCQlzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJr X3BhcmFtcyAqd20sCgkJCQkJaW50IHBpeGVsX3NpemUsCgkJCQkJdW5zaWduZWQgbG9uZyBsYXRl bmN5X25zKQp7Cglsb25nIGVudHJpZXNfcmVxdWlyZWQsIHdtX3NpemU7CgoJLyoKCSAqIE5vdGU6 IHdlIG5lZWQgdG8gbWFrZSBzdXJlIHdlIGRvbid0IG92ZXJmbG93IGZvciB2YXJpb3VzIGNsb2Nr ICYKCSAqIGxhdGVuY3kgdmFsdWVzLgoJICogY2xvY2tzIGdvIGZyb20gYSBmZXcgdGhvdXNhbmQg dG8gc2V2ZXJhbCBodW5kcmVkIHRob3VzYW5kLgoJICogbGF0ZW5jeSBpcyB1c3VhbGx5IGEgZmV3 IHRob3VzYW5kCgkgKi8KCWVudHJpZXNfcmVxdWlyZWQgPSAoKGNsb2NrX2luX2toeiAvIDEwMDAp ICogcGl4ZWxfc2l6ZSAqIGxhdGVuY3lfbnMpIC8KCQkxMDAwOwoJZW50cmllc19yZXF1aXJlZCA9 IERJVl9ST1VORF9VUChlbnRyaWVzX3JlcXVpcmVkLCB3bS0+Y2FjaGVsaW5lX3NpemUpOwoKCURS TV9ERUJVR19LTVMoIkZJRk8gZW50cmllcyByZXF1aXJlZCBmb3IgbW9kZTogJWRcbiIsIGVudHJp ZXNfcmVxdWlyZWQpOwoKCXdtX3NpemUgPSB3bS0+Zmlmb19zaXplIC0gKGVudHJpZXNfcmVxdWly ZWQgKyB3bS0+Z3VhcmRfc2l6ZSk7CgoJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmsgbGV2 ZWw6ICVkXG4iLCB3bV9zaXplKTsKCgkvKiBEb24ndCBwcm9tb3RlIHdtX3NpemUgdG8gdW5zaWdu ZWQuLi4gKi8KCWlmICh3bV9zaXplID4gKGxvbmcpd20tPm1heF93bSkKCQl3bV9zaXplID0gd20t Pm1heF93bTsKCWlmICh3bV9zaXplIDw9IDApCgkJd21fc2l6ZSA9IHdtLT5kZWZhdWx0X3dtOwoJ cmV0dXJuIHdtX3NpemU7Cn0KCnN0cnVjdCBjeHNyX2xhdGVuY3kgewoJaW50IGlzX2Rlc2t0b3A7 CglpbnQgaXNfZGRyMzsKCXVuc2lnbmVkIGxvbmcgZnNiX2ZyZXE7Cgl1bnNpZ25lZCBsb25nIG1l bV9mcmVxOwoJdW5zaWduZWQgbG9uZyBkaXNwbGF5X3NyOwoJdW5zaWduZWQgbG9uZyBkaXNwbGF5 X2hwbGxfZGlzYWJsZTsKCXVuc2lnbmVkIGxvbmcgY3Vyc29yX3NyOwoJdW5zaWduZWQgbG9uZyBj dXJzb3JfaHBsbF9kaXNhYmxlOwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBjeHNyX2xhdGVuY3kg Y3hzcl9sYXRlbmN5X3RhYmxlW10gPSB7Cgl7MSwgMCwgODAwLCA0MDAsIDMzODIsIDMzMzgyLCAz OTgzLCAzMzk4M30sICAgIC8qIEREUjItNDAwIFNDICovCgl7MSwgMCwgODAwLCA2NjcsIDMzNTQs IDMzMzU0LCAzODA3LCAzMzgwN30sICAgIC8qIEREUjItNjY3IFNDICovCgl7MSwgMCwgODAwLCA4 MDAsIDMzNDcsIDMzMzQ3LCAzNzYzLCAzMzc2M30sICAgIC8qIEREUjItODAwIFNDICovCgl7MSwg MSwgODAwLCA2NjcsIDY0MjAsIDM2NDIwLCA2ODczLCAzNjg3M30sICAgIC8qIEREUjMtNjY3IFND ICovCgl7MSwgMSwgODAwLCA4MDAsIDU5MDIsIDM1OTAyLCA2MzE4LCAzNjMxOH0sICAgIC8qIERE UjMtODAwIFNDICovCgoJezEsIDAsIDY2NywgNDAwLCAzNDAwLCAzMzQwMCwgNDAyMSwgMzQwMjF9 LCAgICAvKiBERFIyLTQwMCBTQyAqLwoJezEsIDAsIDY2NywgNjY3LCAzMzcyLCAzMzM3MiwgMzg0 NSwgMzM4NDV9LCAgICAvKiBERFIyLTY2NyBTQyAqLwoJezEsIDAsIDY2NywgODAwLCAzMzg2LCAz MzM4NiwgMzgyMiwgMzM4MjJ9LCAgICAvKiBERFIyLTgwMCBTQyAqLwoJezEsIDEsIDY2NywgNjY3 LCA2NDM4LCAzNjQzOCwgNjkxMSwgMzY5MTF9LCAgICAvKiBERFIzLTY2NyBTQyAqLwoJezEsIDEs IDY2NywgODAwLCA1OTQxLCAzNTk0MSwgNjM3NywgMzYzNzd9LCAgICAvKiBERFIzLTgwMCBTQyAq LwoKCXsxLCAwLCA0MDAsIDQwMCwgMzQ3MiwgMzM0NzIsIDQxNzMsIDM0MTczfSwgICAgLyogRERS Mi00MDAgU0MgKi8KCXsxLCAwLCA0MDAsIDY2NywgMzQ0MywgMzM0NDMsIDM5OTYsIDMzOTk2fSwg ICAgLyogRERSMi02NjcgU0MgKi8KCXsxLCAwLCA0MDAsIDgwMCwgMzQzMCwgMzM0MzAsIDM5NDYs IDMzOTQ2fSwgICAgLyogRERSMi04MDAgU0MgKi8KCXsxLCAxLCA0MDAsIDY2NywgNjUwOSwgMzY1 MDksIDcwNjIsIDM3MDYyfSwgICAgLyogRERSMy02NjcgU0MgKi8KCXsxLCAxLCA0MDAsIDgwMCwg NTk4NSwgMzU5ODUsIDY1MDEsIDM2NTAxfSwgICAgLyogRERSMy04MDAgU0MgKi8KCgl7MCwgMCwg ODAwLCA0MDAsIDM0MzgsIDMzNDM4LCA0MDY1LCAzNDA2NX0sICAgIC8qIEREUjItNDAwIFNDICov Cgl7MCwgMCwgODAwLCA2NjcsIDM0MTAsIDMzNDEwLCAzODg5LCAzMzg4OX0sICAgIC8qIEREUjIt NjY3IFNDICovCgl7MCwgMCwgODAwLCA4MDAsIDM0MDMsIDMzNDAzLCAzODQ1LCAzMzg0NX0sICAg IC8qIEREUjItODAwIFNDICovCgl7MCwgMSwgODAwLCA2NjcsIDY0NzYsIDM2NDc2LCA2OTU1LCAz Njk1NX0sICAgIC8qIEREUjMtNjY3IFNDICovCgl7MCwgMSwgODAwLCA4MDAsIDU5NTgsIDM1OTU4 LCA2NDAwLCAzNjQwMH0sICAgIC8qIEREUjMtODAwIFNDICovCgoJezAsIDAsIDY2NywgNDAwLCAz NDU2LCAzMzQ1NiwgNDEwMywgMzQxMDZ9LCAgICAvKiBERFIyLTQwMCBTQyAqLwoJezAsIDAsIDY2 NywgNjY3LCAzNDI4LCAzMzQyOCwgMzkyNywgMzM5Mjd9LCAgICAvKiBERFIyLTY2NyBTQyAqLwoJ ezAsIDAsIDY2NywgODAwLCAzNDQzLCAzMzQ0MywgMzkwNSwgMzM5MDV9LCAgICAvKiBERFIyLTgw MCBTQyAqLwoJezAsIDEsIDY2NywgNjY3LCA2NDk0LCAzNjQ5NCwgNjk5MywgMzY5OTN9LCAgICAv KiBERFIzLTY2NyBTQyAqLwoJezAsIDEsIDY2NywgODAwLCA1OTk4LCAzNTk5OCwgNjQ2MCwgMzY0 NjB9LCAgICAvKiBERFIzLTgwMCBTQyAqLwoKCXswLCAwLCA0MDAsIDQwMCwgMzUyOCwgMzM1Mjgs IDQyNTUsIDM0MjU1fSwgICAgLyogRERSMi00MDAgU0MgKi8KCXswLCAwLCA0MDAsIDY2NywgMzUw MCwgMzM1MDAsIDQwNzksIDM0MDc5fSwgICAgLyogRERSMi02NjcgU0MgKi8KCXswLCAwLCA0MDAs IDgwMCwgMzQ4NywgMzM0ODcsIDQwMjksIDM0MDI5fSwgICAgLyogRERSMi04MDAgU0MgKi8KCXsw LCAxLCA0MDAsIDY2NywgNjU2NiwgMzY1NjYsIDcxNDUsIDM3MTQ1fSwgICAgLyogRERSMy02Njcg U0MgKi8KCXswLCAxLCA0MDAsIDgwMCwgNjA0MiwgMzYwNDIsIDY1ODQsIDM2NTg0fSwgICAgLyog RERSMy04MDAgU0MgKi8KfTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3QgY3hzcl9sYXRlbmN5ICppbnRl bF9nZXRfY3hzcl9sYXRlbmN5KGludCBpc19kZXNrdG9wLAoJCQkJCQkJIGludCBpc19kZHIzLAoJ CQkJCQkJIGludCBmc2IsCgkJCQkJCQkgaW50IG1lbSkKewoJY29uc3Qgc3RydWN0IGN4c3JfbGF0 ZW5jeSAqbGF0ZW5jeTsKCWludCBpOwoKCWlmIChmc2IgPT0gMCB8fCBtZW0gPT0gMCkKCQlyZXR1 cm4gTlVMTDsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjeHNyX2xhdGVuY3lfdGFibGUp OyBpKyspIHsKCQlsYXRlbmN5ID0gJmN4c3JfbGF0ZW5jeV90YWJsZVtpXTsKCQlpZiAoaXNfZGVz a3RvcCA9PSBsYXRlbmN5LT5pc19kZXNrdG9wICYmCgkJICAgIGlzX2RkcjMgPT0gbGF0ZW5jeS0+ aXNfZGRyMyAmJgoJCSAgICBmc2IgPT0gbGF0ZW5jeS0+ZnNiX2ZyZXEgJiYgbWVtID09IGxhdGVu Y3ktPm1lbV9mcmVxKQoJCQlyZXR1cm4gbGF0ZW5jeTsKCX0KCglEUk1fREVCVUdfS01TKCJVbmtu b3duIEZTQi9NRU0gZm91bmQsIGRpc2FibGUgQ3hTUlxuIik7CgoJcmV0dXJuIE5VTEw7Cn0KCnN0 YXRpYyB2b2lkIHBpbmV2aWV3X2Rpc2FibGVfY3hzcihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7 CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoK CS8qIGRlYWN0aXZhdGUgY3hzciAqLwoJSTkxNV9XUklURShEU1BGVzMsIEk5MTVfUkVBRChEU1BG VzMpICYgflBJTkVWSUVXX1NFTEZfUkVGUkVTSF9FTik7Cn0KCi8qCiAqIExhdGVuY3kgZm9yIEZJ Rk8gZmV0Y2hlcyBpcyBkZXBlbmRlbnQgb24gc2V2ZXJhbCBmYWN0b3JzOgogKiAgIC0gbWVtb3J5 IGNvbmZpZ3VyYXRpb24gKHNwZWVkLCBjaGFubmVscykKICogICAtIGNoaXBzZXQKICogICAtIGN1 cnJlbnQgTUNIIHN0YXRlCiAqIEl0IGNhbiBiZSBmYWlybHkgaGlnaCBpbiBzb21lIHNpdHVhdGlv bnMsIHNvIGhlcmUgd2UgYXNzdW1lIGEgZmFpcmx5CiAqIHBlc3NpbWFsIHZhbHVlLiAgSXQncyBh IHRyYWRlb2ZmIGJldHdlZW4gZXh0cmEgbWVtb3J5IGZldGNoZXMgKGlmIHdlCiAqIHNldCB0aGlz IHZhbHVlIHRvbyBoaWdoLCB0aGUgRklGTyB3aWxsIGZldGNoIGZyZXF1ZW50bHkgdG8gc3RheSBm dWxsKQogKiBhbmQgcG93ZXIgY29uc3VtcHRpb24gKHNldCBpdCB0b28gbG93IHRvIHNhdmUgcG93 ZXIgYW5kIHdlIG1pZ2h0IHNlZQogKiBGSUZPIHVuZGVycnVucyBhbmQgZGlzcGxheSAiZmxpY2tl ciIpLgogKgogKiBBIHZhbHVlIG9mIDV1cyBzZWVtcyB0byBiZSBhIGdvb2QgYmFsYW5jZTsgc2Fm ZSBmb3IgdmVyeSBsb3cgZW5kCiAqIHBsYXRmb3JtcyBidXQgbm90IG92ZXJseSBhZ2dyZXNzaXZl IG9uIGxvd2VyIGxhdGVuY3kgY29uZmlncy4KICovCnN0YXRpYyBjb25zdCBpbnQgbGF0ZW5jeV9u cyA9IDUwMDA7CgpzdGF0aWMgaW50IGk5eHhfZ2V0X2ZpZm9fc2l6ZShzdHJ1Y3QgZHJtX2Rldmlj ZSAqZGV2LCBpbnQgcGxhbmUpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IGRldi0+ZGV2X3ByaXZhdGU7Cgl1aW50MzJfdCBkc3BhcmIgPSBJOTE1X1JFQUQoRFNQQVJCKTsK CWludCBzaXplOwoKCXNpemUgPSBkc3BhcmIgJiAweDdmOwoJaWYgKHBsYW5lKQoJCXNpemUgPSAo KGRzcGFyYiA+PiBEU1BBUkJfQ1NUQVJUX1NISUZUKSAmIDB4N2YpIC0gc2l6ZTsKCglEUk1fREVC VUdfS01TKCJGSUZPIHNpemUgLSAoMHglMDh4KSAlczogJWRcbiIsIGRzcGFyYiwKCQkgICAgICBw bGFuZSA/ICJCIiA6ICJBIiwgc2l6ZSk7CgoJcmV0dXJuIHNpemU7Cn0KCnN0YXRpYyBpbnQgaTg1 eF9nZXRfZmlmb19zaXplKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZSkKewoJc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXVpbnQz Ml90IGRzcGFyYiA9IEk5MTVfUkVBRChEU1BBUkIpOwoJaW50IHNpemU7CgoJc2l6ZSA9IGRzcGFy YiAmIDB4MWZmOwoJaWYgKHBsYW5lKQoJCXNpemUgPSAoKGRzcGFyYiA+PiBEU1BBUkJfQkVORF9T SElGVCkgJiAweDFmZikgLSBzaXplOwoJc2l6ZSA+Pj0gMTsgLyogQ29udmVydCB0byBjYWNoZWxp bmVzICovCgoJRFJNX0RFQlVHX0tNUygiRklGTyBzaXplIC0gKDB4JTA4eCkgJXM6ICVkXG4iLCBk c3BhcmIsCgkJICAgICAgcGxhbmUgPyAiQiIgOiAiQSIsIHNpemUpOwoKCXJldHVybiBzaXplOwp9 CgpzdGF0aWMgaW50IGk4NDVfZ2V0X2ZpZm9fc2l6ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBp bnQgcGxhbmUpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2 X3ByaXZhdGU7Cgl1aW50MzJfdCBkc3BhcmIgPSBJOTE1X1JFQUQoRFNQQVJCKTsKCWludCBzaXpl OwoKCXNpemUgPSBkc3BhcmIgJiAweDdmOwoJc2l6ZSA+Pj0gMjsgLyogQ29udmVydCB0byBjYWNo ZWxpbmVzICovCgoJRFJNX0RFQlVHX0tNUygiRklGTyBzaXplIC0gKDB4JTA4eCkgJXM6ICVkXG4i LCBkc3BhcmIsCgkJICAgICAgcGxhbmUgPyAiQiIgOiAiQSIsCgkJICAgICAgc2l6ZSk7CgoJcmV0 dXJuIHNpemU7Cn0KCnN0YXRpYyBpbnQgaTgzMF9nZXRfZmlmb19zaXplKHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYsIGludCBwbGFuZSkKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXVpbnQzMl90IGRzcGFyYiA9IEk5MTVfUkVBRChEU1BBUkIp OwoJaW50IHNpemU7CgoJc2l6ZSA9IGRzcGFyYiAmIDB4N2Y7CglzaXplID4+PSAxOyAvKiBDb252 ZXJ0IHRvIGNhY2hlbGluZXMgKi8KCglEUk1fREVCVUdfS01TKCJGSUZPIHNpemUgLSAoMHglMDh4 KSAlczogJWRcbiIsIGRzcGFyYiwKCQkgICAgICBwbGFuZSA/ICJCIiA6ICJBIiwgc2l6ZSk7CgoJ cmV0dXJuIHNpemU7Cn0KCnN0YXRpYyB2b2lkIHBpbmV2aWV3X3VwZGF0ZV93bShzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCAgaW50IHBsYW5lYV9jbG9jaywKCQkJICAgICAgIGludCBwbGFuZWJfY2xv Y2ssIGludCBzcl9oZGlzcGxheSwgaW50IHVudXNlZCwKCQkJICAgICAgIGludCBwaXhlbF9zaXpl KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRl OwoJY29uc3Qgc3RydWN0IGN4c3JfbGF0ZW5jeSAqbGF0ZW5jeTsKCXUzMiByZWc7Cgl1bnNpZ25l ZCBsb25nIHdtOwoJaW50IHNyX2Nsb2NrOwoKCWxhdGVuY3kgPSBpbnRlbF9nZXRfY3hzcl9sYXRl bmN5KElTX1BJTkVWSUVXX0coZGV2KSwgZGV2X3ByaXYtPmlzX2RkcjMsCgkJCQkJIGRldl9wcml2 LT5mc2JfZnJlcSwgZGV2X3ByaXYtPm1lbV9mcmVxKTsKCWlmICghbGF0ZW5jeSkgewoJCURSTV9E RUJVR19LTVMoIlVua25vd24gRlNCL01FTSBmb3VuZCwgZGlzYWJsZSBDeFNSXG4iKTsKCQlwaW5l dmlld19kaXNhYmxlX2N4c3IoZGV2KTsKCQlyZXR1cm47Cgl9CgoJaWYgKCFwbGFuZWFfY2xvY2sg fHwgIXBsYW5lYl9jbG9jaykgewoJCXNyX2Nsb2NrID0gcGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Ns b2NrIDogcGxhbmViX2Nsb2NrOwoKCQkvKiBEaXNwbGF5IFNSICovCgkJd20gPSBpbnRlbF9jYWxj dWxhdGVfd20oc3JfY2xvY2ssICZwaW5ldmlld19kaXNwbGF5X3dtLAoJCQkJCXBpeGVsX3NpemUs IGxhdGVuY3ktPmRpc3BsYXlfc3IpOwoJCXJlZyA9IEk5MTVfUkVBRChEU1BGVzEpOwoJCXJlZyAm PSB+RFNQRldfU1JfTUFTSzsKCQlyZWcgfD0gd20gPDwgRFNQRldfU1JfU0hJRlQ7CgkJSTkxNV9X UklURShEU1BGVzEsIHJlZyk7CgkJRFJNX0RFQlVHX0tNUygiRFNQRlcxIHJlZ2lzdGVyIGlzICV4 XG4iLCByZWcpOwoKCQkvKiBjdXJzb3IgU1IgKi8KCQl3bSA9IGludGVsX2NhbGN1bGF0ZV93bShz cl9jbG9jaywgJnBpbmV2aWV3X2N1cnNvcl93bSwKCQkJCQlwaXhlbF9zaXplLCBsYXRlbmN5LT5j dXJzb3Jfc3IpOwoJCXJlZyA9IEk5MTVfUkVBRChEU1BGVzMpOwoJCXJlZyAmPSB+RFNQRldfQ1VS U09SX1NSX01BU0s7CgkJcmVnIHw9ICh3bSAmIDB4M2YpIDw8IERTUEZXX0NVUlNPUl9TUl9TSElG VDsKCQlJOTE1X1dSSVRFKERTUEZXMywgcmVnKTsKCgkJLyogRGlzcGxheSBIUExMIG9mZiBTUiAq LwoJCXdtID0gaW50ZWxfY2FsY3VsYXRlX3dtKHNyX2Nsb2NrLCAmcGluZXZpZXdfZGlzcGxheV9o cGxsb2ZmX3dtLAoJCQkJCXBpeGVsX3NpemUsIGxhdGVuY3ktPmRpc3BsYXlfaHBsbF9kaXNhYmxl KTsKCQlyZWcgPSBJOTE1X1JFQUQoRFNQRlczKTsKCQlyZWcgJj0gfkRTUEZXX0hQTExfU1JfTUFT SzsKCQlyZWcgfD0gd20gJiBEU1BGV19IUExMX1NSX01BU0s7CgkJSTkxNV9XUklURShEU1BGVzMs IHJlZyk7CgoJCS8qIGN1cnNvciBIUExMIG9mZiBTUiAqLwoJCXdtID0gaW50ZWxfY2FsY3VsYXRl X3dtKHNyX2Nsb2NrLCAmcGluZXZpZXdfY3Vyc29yX2hwbGxvZmZfd20sCgkJCQkJcGl4ZWxfc2l6 ZSwgbGF0ZW5jeS0+Y3Vyc29yX2hwbGxfZGlzYWJsZSk7CgkJcmVnID0gSTkxNV9SRUFEKERTUEZX Myk7CgkJcmVnICY9IH5EU1BGV19IUExMX0NVUlNPUl9NQVNLOwoJCXJlZyB8PSAod20gJiAweDNm KSA8PCBEU1BGV19IUExMX0NVUlNPUl9TSElGVDsKCQlJOTE1X1dSSVRFKERTUEZXMywgcmVnKTsK CQlEUk1fREVCVUdfS01TKCJEU1BGVzMgcmVnaXN0ZXIgaXMgJXhcbiIsIHJlZyk7CgoJCS8qIGFj dGl2YXRlIGN4c3IgKi8KCQlJOTE1X1dSSVRFKERTUEZXMywKCQkJICAgSTkxNV9SRUFEKERTUEZX MykgfCBQSU5FVklFV19TRUxGX1JFRlJFU0hfRU4pOwoJCURSTV9ERUJVR19LTVMoIlNlbGYtcmVm cmVzaCBpcyBlbmFibGVkXG4iKTsKCX0gZWxzZSB7CgkJcGluZXZpZXdfZGlzYWJsZV9jeHNyKGRl dik7CgkJRFJNX0RFQlVHX0tNUygiU2VsZi1yZWZyZXNoIGlzIGRpc2FibGVkXG4iKTsKCX0KfQoK c3RhdGljIHZvaWQgZzR4X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCAgaW50IHBs YW5lYV9jbG9jaywKCQkJICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBz cl9odG90YWwsCgkJCSAgaW50IHBpeGVsX3NpemUpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglpbnQgdG90YWxfc2l6ZSwgY2FjaGVsaW5l X3NpemU7CglpbnQgcGxhbmVhX3dtLCBwbGFuZWJfd20sIGN1cnNvcmFfd20sIGN1cnNvcmJfd20s IGN1cnNvcl9zcjsKCXN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFyYW1zIHBsYW5lYV9wYXJhbXMs IHBsYW5lYl9wYXJhbXM7Cgl1bnNpZ25lZCBsb25nIGxpbmVfdGltZV91czsKCWludCBzcl9jbG9j aywgc3JfZW50cmllcyA9IDAsIGVudHJpZXNfcmVxdWlyZWQ7CgoJLyogQ3JlYXRlIGNvcGllcyBv ZiB0aGUgYmFzZSBzZXR0aW5ncyBmb3IgZWFjaCBwaXBlICovCglwbGFuZWFfcGFyYW1zID0gcGxh bmViX3BhcmFtcyA9IGc0eF93bV9pbmZvOwoKCS8qIEdyYWIgYSBjb3VwbGUgb2YgZ2xvYmFsIHZh bHVlcyBiZWZvcmUgd2Ugb3ZlcndyaXRlIHRoZW0gKi8KCXRvdGFsX3NpemUgPSBwbGFuZWFfcGFy YW1zLmZpZm9fc2l6ZTsKCWNhY2hlbGluZV9zaXplID0gcGxhbmVhX3BhcmFtcy5jYWNoZWxpbmVf c2l6ZTsKCgkvKgoJICogTm90ZTogd2UgbmVlZCB0byBtYWtlIHN1cmUgd2UgZG9uJ3Qgb3ZlcmZs b3cgZm9yIHZhcmlvdXMgY2xvY2sgJgoJICogbGF0ZW5jeSB2YWx1ZXMuCgkgKiBjbG9ja3MgZ28g ZnJvbSBhIGZldyB0aG91c2FuZCB0byBzZXZlcmFsIGh1bmRyZWQgdGhvdXNhbmQuCgkgKiBsYXRl bmN5IGlzIHVzdWFsbHkgYSBmZXcgdGhvdXNhbmQKCSAqLwoJZW50cmllc19yZXF1aXJlZCA9ICgo cGxhbmVhX2Nsb2NrIC8gMTAwMCkgKiBwaXhlbF9zaXplICogbGF0ZW5jeV9ucykgLwoJCTEwMDA7 CgllbnRyaWVzX3JlcXVpcmVkID0gRElWX1JPVU5EX1VQKGVudHJpZXNfcmVxdWlyZWQsIEc0WF9G SUZPX0xJTkVfU0laRSk7CglwbGFuZWFfd20gPSBlbnRyaWVzX3JlcXVpcmVkICsgcGxhbmVhX3Bh cmFtcy5ndWFyZF9zaXplOwoKCWVudHJpZXNfcmVxdWlyZWQgPSAoKHBsYW5lYl9jbG9jayAvIDEw MDApICogcGl4ZWxfc2l6ZSAqIGxhdGVuY3lfbnMpIC8KCQkxMDAwOwoJZW50cmllc19yZXF1aXJl ZCA9IERJVl9ST1VORF9VUChlbnRyaWVzX3JlcXVpcmVkLCBHNFhfRklGT19MSU5FX1NJWkUpOwoJ cGxhbmViX3dtID0gZW50cmllc19yZXF1aXJlZCArIHBsYW5lYl9wYXJhbXMuZ3VhcmRfc2l6ZTsK CgljdXJzb3JhX3dtID0gY3Vyc29yYl93bSA9IDE2OwoJY3Vyc29yX3NyID0gMzI7CgoJRFJNX0RF QlVHKCJGSUZPIHdhdGVybWFya3MgLSBBOiAlZCwgQjogJWRcbiIsIHBsYW5lYV93bSwgcGxhbmVi X3dtKTsKCgkvKiBDYWxjIHNyIGVudHJpZXMgZm9yIG9uZSBwbGFuZSBjb25maWdzICovCglpZiAo c3JfaGRpc3BsYXkgJiYgKCFwbGFuZWFfY2xvY2sgfHwgIXBsYW5lYl9jbG9jaykpIHsKCQkvKiBz ZWxmLXJlZnJlc2ggaGFzIG11Y2ggaGlnaGVyIGxhdGVuY3kgKi8KCQlzdGF0aWMgY29uc3QgaW50 IHNyX2xhdGVuY3lfbnMgPSAxMjAwMDsKCgkJc3JfY2xvY2sgPSBwbGFuZWFfY2xvY2sgPyBwbGFu ZWFfY2xvY2sgOiBwbGFuZWJfY2xvY2s7CgkJbGluZV90aW1lX3VzID0gKChzcl9odG90YWwgKiAx MDAwKSAvIHNyX2Nsb2NrKTsKCgkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHByZXNlcnZl IHByZWNpc2lvbiAqLwoJCXNyX2VudHJpZXMgPSAoKChzcl9sYXRlbmN5X25zIC8gbGluZV90aW1l X3VzKSArIDEwMDApIC8gMTAwMCkgKgoJCQlwaXhlbF9zaXplICogc3JfaGRpc3BsYXk7CgkJc3Jf ZW50cmllcyA9IERJVl9ST1VORF9VUChzcl9lbnRyaWVzLCBjYWNoZWxpbmVfc2l6ZSk7CgoJCWVu dHJpZXNfcmVxdWlyZWQgPSAoKChzcl9sYXRlbmN5X25zIC8gbGluZV90aW1lX3VzKSArCgkJCQkg ICAgIDEwMDApIC8gMTAwMCkgKiBwaXhlbF9zaXplICogNjQ7CgkJZW50cmllc19yZXF1aXJlZCA9 IERJVl9ST1VORF9VUChlbnRyaWVzX3JlcXVpcmVkLAoJCQkJCQlnNHhfY3Vyc29yX3dtX2luZm8u Y2FjaGVsaW5lX3NpemUpOwoJCWN1cnNvcl9zciA9IGVudHJpZXNfcmVxdWlyZWQgKyBnNHhfY3Vy c29yX3dtX2luZm8uZ3VhcmRfc2l6ZTsKCgkJaWYgKGN1cnNvcl9zciA+IGc0eF9jdXJzb3Jfd21f aW5mby5tYXhfd20pCgkJCWN1cnNvcl9zciA9IGc0eF9jdXJzb3Jfd21faW5mby5tYXhfd207CgkJ RFJNX0RFQlVHX0tNUygic2VsZi1yZWZyZXNoIHdhdGVybWFyazogZGlzcGxheSBwbGFuZSAlZCAi CgkJCSAgICAgICJjdXJzb3IgJWRcbiIsIHNyX2VudHJpZXMsIGN1cnNvcl9zcik7CgoJCUk5MTVf V1JJVEUoRldfQkxDX1NFTEYsIEZXX0JMQ19TRUxGX0VOKTsKCX0gZWxzZSB7CgkJLyogVHVybiBv ZmYgc2VsZiByZWZyZXNoIGlmIGJvdGggcGlwZXMgYXJlIGVuYWJsZWQgKi8KCQlJOTE1X1dSSVRF KEZXX0JMQ19TRUxGLCBJOTE1X1JFQUQoRldfQkxDX1NFTEYpCgkJCSAgICYgfkZXX0JMQ19TRUxG X0VOKTsKCX0KCglEUk1fREVCVUcoIlNldHRpbmcgRklGTyB3YXRlcm1hcmtzIC0gQTogJWQsIEI6 ICVkLCBTUiAlZFxuIiwKCQkgIHBsYW5lYV93bSwgcGxhbmViX3dtLCBzcl9lbnRyaWVzKTsKCglw bGFuZWFfd20gJj0gMHgzZjsKCXBsYW5lYl93bSAmPSAweDNmOwoKCUk5MTVfV1JJVEUoRFNQRlcx LCAoc3JfZW50cmllcyA8PCBEU1BGV19TUl9TSElGVCkgfAoJCSAgIChjdXJzb3JiX3dtIDw8IERT UEZXX0NVUlNPUkJfU0hJRlQpIHwKCQkgICAocGxhbmViX3dtIDw8IERTUEZXX1BMQU5FQl9TSElG VCkgfCBwbGFuZWFfd20pOwoJSTkxNV9XUklURShEU1BGVzIsIChJOTE1X1JFQUQoRFNQRlcyKSAm IERTUEZXX0NVUlNPUkFfTUFTSykgfAoJCSAgIChjdXJzb3JhX3dtIDw8IERTUEZXX0NVUlNPUkFf U0hJRlQpKTsKCS8qIEhQTEwgb2ZmIGluIFNSIGhhcyBzb21lIGlzc3VlcyBvbiBHNHguLi4gZGlz YWJsZSBpdCAqLwoJSTkxNV9XUklURShEU1BGVzMsIChJOTE1X1JFQUQoRFNQRlczKSAmIH5EU1BG V19IUExMX1NSX0VOKSB8CgkJICAgKGN1cnNvcl9zciA8PCBEU1BGV19DVVJTT1JfU1JfU0hJRlQp KTsKfQoKc3RhdGljIHZvaWQgaTk2NV91cGRhdGVfd20oc3RydWN0IGRybV9kZXZpY2UgKmRldiwg aW50IHBsYW5lYV9jbG9jaywKCQkJICAgaW50IHBsYW5lYl9jbG9jaywgaW50IHNyX2hkaXNwbGF5 LCBpbnQgc3JfaHRvdGFsLAoJCQkgICBpbnQgcGl4ZWxfc2l6ZSkKewoJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXVuc2lnbmVkIGxvbmcgbGlu ZV90aW1lX3VzOwoJaW50IHNyX2Nsb2NrLCBzcl9lbnRyaWVzLCBzcndtID0gMTsKCWludCBjdXJz b3Jfc3IgPSAxNjsKCgkvKiBDYWxjIHNyIGVudHJpZXMgZm9yIG9uZSBwbGFuZSBjb25maWdzICov CglpZiAoc3JfaGRpc3BsYXkgJiYgKCFwbGFuZWFfY2xvY2sgfHwgIXBsYW5lYl9jbG9jaykpIHsK CQkvKiBzZWxmLXJlZnJlc2ggaGFzIG11Y2ggaGlnaGVyIGxhdGVuY3kgKi8KCQlzdGF0aWMgY29u c3QgaW50IHNyX2xhdGVuY3lfbnMgPSAxMjAwMDsKCgkJc3JfY2xvY2sgPSBwbGFuZWFfY2xvY2sg PyBwbGFuZWFfY2xvY2sgOiBwbGFuZWJfY2xvY2s7CgkJbGluZV90aW1lX3VzID0gKChzcl9odG90 YWwgKiAxMDAwKSAvIHNyX2Nsb2NrKTsKCgkJLyogVXNlIG5zL3VzIHRoZW4gZGl2aWRlIHRvIHBy ZXNlcnZlIHByZWNpc2lvbiAqLwoJCXNyX2VudHJpZXMgPSAoKChzcl9sYXRlbmN5X25zIC8gbGlu ZV90aW1lX3VzKSArIDEwMDApIC8gMTAwMCkgKgoJCQlwaXhlbF9zaXplICogc3JfaGRpc3BsYXk7 CgkJc3JfZW50cmllcyA9IERJVl9ST1VORF9VUChzcl9lbnRyaWVzLCBJOTE1X0ZJRk9fTElORV9T SVpFKTsKCQlEUk1fREVCVUcoInNlbGYtcmVmcmVzaCBlbnRyaWVzOiAlZFxuIiwgc3JfZW50cmll cyk7CgkJc3J3bSA9IEk5NjVfRklGT19TSVpFIC0gc3JfZW50cmllczsKCQlpZiAoc3J3bSA8IDAp CgkJCXNyd20gPSAxOwoJCXNyd20gJj0gMHgxZmY7CgoJCXNyX2VudHJpZXMgPSAoKChzcl9sYXRl bmN5X25zIC8gbGluZV90aW1lX3VzKSArIDEwMDApIC8gMTAwMCkgKgoJCQlwaXhlbF9zaXplICog NjQ7CgkJc3JfZW50cmllcyA9IERJVl9ST1VORF9VUChzcl9lbnRyaWVzLAoJCQkJCSAgaTk2NV9j dXJzb3Jfd21faW5mby5jYWNoZWxpbmVfc2l6ZSk7CgkJY3Vyc29yX3NyID0gaTk2NV9jdXJzb3Jf d21faW5mby5maWZvX3NpemUgLQoJCQkoc3JfZW50cmllcyArIGk5NjVfY3Vyc29yX3dtX2luZm8u Z3VhcmRfc2l6ZSk7CgoJCWlmIChjdXJzb3Jfc3IgPiBpOTY1X2N1cnNvcl93bV9pbmZvLm1heF93 bSkKCQkJY3Vyc29yX3NyID0gaTk2NV9jdXJzb3Jfd21faW5mby5tYXhfd207CgoJCURSTV9ERUJV R19LTVMoInNlbGYtcmVmcmVzaCB3YXRlcm1hcms6IGRpc3BsYXkgcGxhbmUgJWQgIgoJCQkgICAg ICAiY3Vyc29yICVkXG4iLCBzcndtLCBjdXJzb3Jfc3IpOwoKCQlpZiAoSVNfQ1JFU1RMSU5FKGRl dikpCgkJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEZXX0JMQ19TRUxGX0VOKTsKCX0gZWxzZSB7 CgkJLyogVHVybiBvZmYgc2VsZiByZWZyZXNoIGlmIGJvdGggcGlwZXMgYXJlIGVuYWJsZWQgKi8K CQlpZiAoSVNfQ1JFU1RMSU5FKGRldikpCgkJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEk5MTVf UkVBRChGV19CTENfU0VMRikKCQkJCSAgICYgfkZXX0JMQ19TRUxGX0VOKTsKCX0KCglEUk1fREVC VUdfS01TKCJTZXR0aW5nIEZJRk8gd2F0ZXJtYXJrcyAtIEE6IDgsIEI6IDgsIEM6IDgsIFNSICVk XG4iLAoJCSAgICAgIHNyd20pOwoKCS8qIDk2NSBoYXMgbGltaXRhdGlvbnMuLi4gKi8KCUk5MTVf V1JJVEUoRFNQRlcxLCAoc3J3bSA8PCBEU1BGV19TUl9TSElGVCkgfCAoOCA8PCAxNikgfCAoOCA8 PCA4KSB8CgkJICAgKDggPDwgMCkpOwoJSTkxNV9XUklURShEU1BGVzIsICg4IDw8IDgpIHwgKDgg PDwgMCkpOwoJLyogdXBkYXRlIGN1cnNvciBTUiB3YXRlcm1hcmsgKi8KCUk5MTVfV1JJVEUoRFNQ RlczLCAoY3Vyc29yX3NyIDw8IERTUEZXX0NVUlNPUl9TUl9TSElGVCkpOwp9CgpzdGF0aWMgdm9p ZCBpOXh4X3VwZGF0ZV93bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgcGxhbmVhX2Nsb2Nr LAoJCQkgICBpbnQgcGxhbmViX2Nsb2NrLCBpbnQgc3JfaGRpc3BsYXksIGludCBzcl9odG90YWws CgkJCSAgIGludCBwaXhlbF9zaXplKQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYgPSBkZXYtPmRldl9wcml2YXRlOwoJdWludDMyX3QgZndhdGVyX2xvOwoJdWludDMyX3QgZndh dGVyX2hpOwoJaW50IHRvdGFsX3NpemUsIGNhY2hlbGluZV9zaXplLCBjd20sIHNyd20gPSAxOwoJ aW50IHBsYW5lYV93bSwgcGxhbmViX3dtOwoJc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMg cGxhbmVhX3BhcmFtcywgcGxhbmViX3BhcmFtczsKCXVuc2lnbmVkIGxvbmcgbGluZV90aW1lX3Vz OwoJaW50IHNyX2Nsb2NrLCBzcl9lbnRyaWVzID0gMDsKCgkvKiBDcmVhdGUgY29waWVzIG9mIHRo ZSBiYXNlIHNldHRpbmdzIGZvciBlYWNoIHBpcGUgKi8KCWlmIChJU19DUkVTVExJTkUoZGV2KSB8 fCBJU19JOTQ1R00oZGV2KSkKCQlwbGFuZWFfcGFyYW1zID0gcGxhbmViX3BhcmFtcyA9IGk5NDVf d21faW5mbzsKCWVsc2UgaWYgKCFJU19HRU4yKGRldikpCgkJcGxhbmVhX3BhcmFtcyA9IHBsYW5l Yl9wYXJhbXMgPSBpOTE1X3dtX2luZm87CgllbHNlCgkJcGxhbmVhX3BhcmFtcyA9IHBsYW5lYl9w YXJhbXMgPSBpODU1X3dtX2luZm87CgoJLyogR3JhYiBhIGNvdXBsZSBvZiBnbG9iYWwgdmFsdWVz IGJlZm9yZSB3ZSBvdmVyd3JpdGUgdGhlbSAqLwoJdG90YWxfc2l6ZSA9IHBsYW5lYV9wYXJhbXMu Zmlmb19zaXplOwoJY2FjaGVsaW5lX3NpemUgPSBwbGFuZWFfcGFyYW1zLmNhY2hlbGluZV9zaXpl OwoKCS8qIFVwZGF0ZSBwZXItcGxhbmUgRklGTyBzaXplcyAqLwoJcGxhbmVhX3BhcmFtcy5maWZv X3NpemUgPSBkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZmlmb19zaXplKGRldiwgMCk7CglwbGFuZWJf cGFyYW1zLmZpZm9fc2l6ZSA9IGRldl9wcml2LT5kaXNwbGF5LmdldF9maWZvX3NpemUoZGV2LCAx KTsKCglwbGFuZWFfd20gPSBpbnRlbF9jYWxjdWxhdGVfd20ocGxhbmVhX2Nsb2NrLCAmcGxhbmVh X3BhcmFtcywKCQkJCSAgICAgICBwaXhlbF9zaXplLCBsYXRlbmN5X25zKTsKCXBsYW5lYl93bSA9 IGludGVsX2NhbGN1bGF0ZV93bShwbGFuZWJfY2xvY2ssICZwbGFuZWJfcGFyYW1zLAoJCQkJICAg ICAgIHBpeGVsX3NpemUsIGxhdGVuY3lfbnMpOwoJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1h cmtzIC0gQTogJWQsIEI6ICVkXG4iLCBwbGFuZWFfd20sIHBsYW5lYl93bSk7CgoJLyoKCSAqIE92 ZXJsYXkgZ2V0cyBhbiBhZ2dyZXNzaXZlIGRlZmF1bHQgc2luY2UgdmlkZW8gaml0dGVyIGlzIGJh ZC4KCSAqLwoJY3dtID0gMjsKCgkvKiBDYWxjIHNyIGVudHJpZXMgZm9yIG9uZSBwbGFuZSBjb25m aWdzICovCglpZiAoSEFTX0ZXX0JMQyhkZXYpICYmIHNyX2hkaXNwbGF5ICYmCgkgICAgKCFwbGFu ZWFfY2xvY2sgfHwgIXBsYW5lYl9jbG9jaykpIHsKCQkvKiBzZWxmLXJlZnJlc2ggaGFzIG11Y2gg aGlnaGVyIGxhdGVuY3kgKi8KCQlzdGF0aWMgY29uc3QgaW50IHNyX2xhdGVuY3lfbnMgPSA2MDAw OwoKCQlzcl9jbG9jayA9IHBsYW5lYV9jbG9jayA/IHBsYW5lYV9jbG9jayA6IHBsYW5lYl9jbG9j azsKCQlsaW5lX3RpbWVfdXMgPSAoKHNyX2h0b3RhbCAqIDEwMDApIC8gc3JfY2xvY2spOwoKCQkv KiBVc2UgbnMvdXMgdGhlbiBkaXZpZGUgdG8gcHJlc2VydmUgcHJlY2lzaW9uICovCgkJc3JfZW50 cmllcyA9ICgoKHNyX2xhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMpICsgMTAwMCkgLyAxMDAwKSAq CgkJCXBpeGVsX3NpemUgKiBzcl9oZGlzcGxheTsKCQlzcl9lbnRyaWVzID0gRElWX1JPVU5EX1VQ KHNyX2VudHJpZXMsIGNhY2hlbGluZV9zaXplKTsKCQlEUk1fREVCVUdfS01TKCJzZWxmLXJlZnJl c2ggZW50cmllczogJWRcbiIsIHNyX2VudHJpZXMpOwoJCXNyd20gPSB0b3RhbF9zaXplIC0gc3Jf ZW50cmllczsKCQlpZiAoc3J3bSA8IDApCgkJCXNyd20gPSAxOwoKCQlpZiAoSVNfSTk0NUcoZGV2 KSB8fCBJU19JOTQ1R00oZGV2KSkKCQkJSTkxNV9XUklURShGV19CTENfU0VMRiwgRldfQkxDX1NF TEZfRklGT19NQVNLIHwgKHNyd20gJiAweGZmKSk7CgkJZWxzZSBpZiAoSVNfSTkxNUdNKGRldikp IHsKCQkJLyogOTE1TSBoYXMgYSBzbWFsbGVyIFNSV00gZmllbGQgKi8KCQkJSTkxNV9XUklURShG V19CTENfU0VMRiwgc3J3bSAmIDB4M2YpOwoJCQlJOTE1X1dSSVRFKElOU1RQTSwgSTkxNV9SRUFE KElOU1RQTSkgfCBJTlNUUE1fU0VMRl9FTik7CgkJfQoJfSBlbHNlIHsKCQkvKiBUdXJuIG9mZiBz ZWxmIHJlZnJlc2ggaWYgYm90aCBwaXBlcyBhcmUgZW5hYmxlZCAqLwoJCWlmIChJU19JOTQ1Ryhk ZXYpIHx8IElTX0k5NDVHTShkZXYpKSB7CgkJCUk5MTVfV1JJVEUoRldfQkxDX1NFTEYsIEk5MTVf UkVBRChGV19CTENfU0VMRikKCQkJCSAgICYgfkZXX0JMQ19TRUxGX0VOKTsKCQl9IGVsc2UgaWYg KElTX0k5MTVHTShkZXYpKSB7CgkJCUk5MTVfV1JJVEUoSU5TVFBNLCBJOTE1X1JFQUQoSU5TVFBN KSAmIH5JTlNUUE1fU0VMRl9FTik7CgkJfQoJfQoKCURSTV9ERUJVR19LTVMoIlNldHRpbmcgRklG TyB3YXRlcm1hcmtzIC0gQTogJWQsIEI6ICVkLCBDOiAlZCwgU1IgJWRcbiIsCgkJICAgICAgcGxh bmVhX3dtLCBwbGFuZWJfd20sIGN3bSwgc3J3bSk7CgoJZndhdGVyX2xvID0gKChwbGFuZWJfd20g JiAweDNmKSA8PCAxNikgfCAocGxhbmVhX3dtICYgMHgzZik7Cglmd2F0ZXJfaGkgPSAoY3dtICYg MHgxZik7CgoJLyogU2V0IHJlcXVlc3QgbGVuZ3RoIHRvIDggY2FjaGVsaW5lcyBwZXIgZmV0Y2gg Ki8KCWZ3YXRlcl9sbyA9IGZ3YXRlcl9sbyB8ICgxIDw8IDI0KSB8ICgxIDw8IDgpOwoJZndhdGVy X2hpID0gZndhdGVyX2hpIHwgKDEgPDwgOCk7CgoJSTkxNV9XUklURShGV19CTEMsIGZ3YXRlcl9s byk7CglJOTE1X1dSSVRFKEZXX0JMQzIsIGZ3YXRlcl9oaSk7Cn0KCnN0YXRpYyB2b2lkIGk4MzBf dXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwbGFuZWFfY2xvY2ssIGludCB1 bnVzZWQsCgkJCSAgIGludCB1bnVzZWQyLCBpbnQgdW51c2VkMywgaW50IHBpeGVsX3NpemUpCnsK CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgl1 aW50MzJfdCBmd2F0ZXJfbG8gPSBJOTE1X1JFQUQoRldfQkxDKSAmIH4weGZmZjsKCWludCBwbGFu ZWFfd207CgoJaTgzMF93bV9pbmZvLmZpZm9fc2l6ZSA9IGRldl9wcml2LT5kaXNwbGF5LmdldF9m aWZvX3NpemUoZGV2LCAwKTsKCglwbGFuZWFfd20gPSBpbnRlbF9jYWxjdWxhdGVfd20ocGxhbmVh X2Nsb2NrLCAmaTgzMF93bV9pbmZvLAoJCQkJICAgICAgIHBpeGVsX3NpemUsIGxhdGVuY3lfbnMp OwoJZndhdGVyX2xvIHw9ICgzPDw4KSB8IHBsYW5lYV93bTsKCglEUk1fREVCVUdfS01TKCJTZXR0 aW5nIEZJRk8gd2F0ZXJtYXJrcyAtIEE6ICVkXG4iLCBwbGFuZWFfd20pOwoKCUk5MTVfV1JJVEUo RldfQkxDLCBmd2F0ZXJfbG8pOwp9CgojZGVmaW5lIElMS19MUDBfUExBTkVfTEFURU5DWQkJNzAw CiNkZWZpbmUgSUxLX0xQMF9DVVJTT1JfTEFURU5DWQkJMTMwMAoKc3RhdGljIGJvb2wgaXJvbmxh a2VfY29tcHV0ZV93bTAoc3RydWN0IGRybV9kZXZpY2UgKmRldiwKCQkJCSBpbnQgcGlwZSwKCQkJ CSBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqZGlzcGxheSwKCQkJCSBpbnQg ZGlzcGxheV9sYXRlbmN5X25zLAoJCQkJIGNvbnN0IHN0cnVjdCBpbnRlbF93YXRlcm1hcmtfcGFy YW1zICpjdXJzb3IsCgkJCQkgaW50IGN1cnNvcl9sYXRlbmN5X25zLAoJCQkJIGludCAqcGxhbmVf d20sCgkJCQkgaW50ICpjdXJzb3Jfd20pCnsKCXN0cnVjdCBkcm1fY3J0YyAqY3J0YzsKCWludCBo dG90YWwsIGhkaXNwbGF5LCBjbG9jaywgcGl4ZWxfc2l6ZTsKCWludCBsaW5lX3RpbWVfdXMsIGxp bmVfY291bnQ7CglpbnQgZW50cmllcywgdGxiX21pc3M7CgoJY3J0YyA9IGludGVsX2dldF9jcnRj X2Zvcl9waXBlKGRldiwgcGlwZSk7CglpZiAoY3J0Yy0+ZmIgPT0gTlVMTCB8fCAhY3J0Yy0+ZW5h YmxlZCkKCQlyZXR1cm4gZmFsc2U7CgoJaHRvdGFsID0gY3J0Yy0+bW9kZS5odG90YWw7CgloZGlz cGxheSA9IGNydGMtPm1vZGUuaGRpc3BsYXk7CgljbG9jayA9IGNydGMtPm1vZGUuY2xvY2s7Cglw aXhlbF9zaXplID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKCgkvKiBVc2UgdGhlIHNt YWxsIGJ1ZmZlciBtZXRob2QgdG8gY2FsY3VsYXRlIHBsYW5lIHdhdGVybWFyayAqLwoJZW50cmll cyA9ICgoY2xvY2sgKiBwaXhlbF9zaXplIC8gMTAwMCkgKiBkaXNwbGF5X2xhdGVuY3lfbnMpIC8g MTAwMDsKCXRsYl9taXNzID0gZGlzcGxheS0+Zmlmb19zaXplKmRpc3BsYXktPmNhY2hlbGluZV9z aXplIC0gaGRpc3BsYXkgKiA4OwoJaWYgKHRsYl9taXNzID4gMCkKCQllbnRyaWVzICs9IHRsYl9t aXNzOwoJZW50cmllcyA9IERJVl9ST1VORF9VUChlbnRyaWVzLCBkaXNwbGF5LT5jYWNoZWxpbmVf c2l6ZSk7CgkqcGxhbmVfd20gPSBlbnRyaWVzICsgZGlzcGxheS0+Z3VhcmRfc2l6ZTsKCWlmICgq cGxhbmVfd20gPiAoaW50KWRpc3BsYXktPm1heF93bSkKCQkqcGxhbmVfd20gPSBkaXNwbGF5LT5t YXhfd207CgoJLyogVXNlIHRoZSBsYXJnZSBidWZmZXIgbWV0aG9kIHRvIGNhbGN1bGF0ZSBjdXJz b3Igd2F0ZXJtYXJrICovCglsaW5lX3RpbWVfdXMgPSAoKGh0b3RhbCAqIDEwMDApIC8gY2xvY2sp OwoJbGluZV9jb3VudCA9IChjdXJzb3JfbGF0ZW5jeV9ucyAvIGxpbmVfdGltZV91cyArIDEwMDAp IC8gMTAwMDsKCWVudHJpZXMgPSBsaW5lX2NvdW50ICogNjQgKiBwaXhlbF9zaXplOwoJdGxiX21p c3MgPSBjdXJzb3ItPmZpZm9fc2l6ZSpjdXJzb3ItPmNhY2hlbGluZV9zaXplIC0gaGRpc3BsYXkg KiA4OwoJaWYgKHRsYl9taXNzID4gMCkKCQllbnRyaWVzICs9IHRsYl9taXNzOwoJZW50cmllcyA9 IERJVl9ST1VORF9VUChlbnRyaWVzLCBjdXJzb3ItPmNhY2hlbGluZV9zaXplKTsKCSpjdXJzb3Jf d20gPSBlbnRyaWVzICsgY3Vyc29yLT5ndWFyZF9zaXplOwoJaWYgKCpjdXJzb3Jfd20gPiAoaW50 KWN1cnNvci0+bWF4X3dtKQoJCSpjdXJzb3Jfd20gPSAoaW50KWN1cnNvci0+bWF4X3dtOwoKCXJl dHVybiB0cnVlOwp9CgovKgogKiBDaGVjayB0aGUgd20gcmVzdWx0LgogKgogKiBJZiBhbnkgY2Fs Y3VsYXRlZCB3YXRlcm1hcmsgdmFsdWVzIGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHZhbHVl IHRoYXQKICogY2FuIGJlIHByb2dyYW1tZWQgaW50byB0aGUgYXNzb2NpYXRlZCB3YXRlcm1hcmsg cmVnaXN0ZXIsIHRoYXQgd2F0ZXJtYXJrCiAqIG11c3QgYmUgZGlzYWJsZWQuCiAqLwpzdGF0aWMg Ym9vbCBpcm9ubGFrZV9jaGVja19zcndtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBsZXZl bCwKCQkJCWludCBmYmNfd20sIGludCBkaXNwbGF5X3dtLCBpbnQgY3Vyc29yX3dtLAoJCQkJY29u c3Qgc3RydWN0IGludGVsX3dhdGVybWFya19wYXJhbXMgKmRpc3BsYXksCgkJCQljb25zdCBzdHJ1 Y3QgaW50ZWxfd2F0ZXJtYXJrX3BhcmFtcyAqY3Vyc29yKQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoKCURSTV9ERUJVR19LTVMoIndhdGVy bWFyayAlZDogZGlzcGxheSBwbGFuZSAlZCwgZmJjIGxpbmVzICVkLCIKCQkgICAgICAiIGN1cnNv ciAlZFxuIiwgbGV2ZWwsIGRpc3BsYXlfd20sIGZiY193bSwgY3Vyc29yX3dtKTsKCglpZiAoZmJj X3dtID4gU05CX0ZCQ19NQVhfU1JXTSkgewoJCURSTV9ERUJVR19LTVMoImZiYyB3YXRlcm1hcmso JWQpIGlzIHRvbyBsYXJnZSglZCksIGRpc2FibGluZyB3bSVkK1xuIiwKCQkJICAgICAgZmJjX3dt LCBTTkJfRkJDX01BWF9TUldNLCBsZXZlbCk7CgoJCS8qIGZiYyBoYXMgaXQncyBvd24gd2F5IHRv IGRpc2FibGUgRkJDIFdNICovCgkJSTkxNV9XUklURShESVNQX0FSQl9DVEwsCgkJCSAgIEk5MTVf UkVBRChESVNQX0FSQl9DVEwpIHwgRElTUF9GQkNfV01fRElTKTsKCQlyZXR1cm4gZmFsc2U7Cgl9 CgoJaWYgKGRpc3BsYXlfd20gPiBkaXNwbGF5LT5tYXhfd20pIHsKCQlEUk1fREVCVUdfS01TKCJk aXNwbGF5IHdhdGVybWFyayglZCkgaXMgdG9vIGxhcmdlKCVkKSwgZGlzYWJsaW5nIHdtJWQrXG4i LAoJCQkgICAgICBkaXNwbGF5X3dtLCBTTkJfRElTUExBWV9NQVhfU1JXTSwgbGV2ZWwpOwoJCXJl dHVybiBmYWxzZTsKCX0KCglpZiAoY3Vyc29yX3dtID4gY3Vyc29yLT5tYXhfd20pIHsKCQlEUk1f REVCVUdfS01TKCJjdXJzb3Igd2F0ZXJtYXJrKCVkKSBpcyB0b28gbGFyZ2UoJWQpLCBkaXNhYmxp bmcgd20lZCtcbiIsCgkJCSAgICAgIGN1cnNvcl93bSwgU05CX0NVUlNPUl9NQVhfU1JXTSwgbGV2 ZWwpOwoJCXJldHVybiBmYWxzZTsKCX0KCglpZiAoIShmYmNfd20gfHwgZGlzcGxheV93bSB8fCBj dXJzb3Jfd20pKSB7CgkJRFJNX0RFQlVHX0tNUygibGF0ZW5jeSAlZCBpcyAwLCBkaXNhYmxpbmcg d20lZCtcbiIsIGxldmVsLCBsZXZlbCk7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCXJldHVybiB0cnVl Owp9CgovKgogKiBDb21wdXRlIHdhdGVybWFyayB2YWx1ZXMgb2YgV01bMS0zXSwKICovCnN0YXRp YyBib29sIGlyb25sYWtlX2NvbXB1dGVfc3J3bShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQg bGV2ZWwsCgkJCQkgIGludCBoZGlzcGxheSwgaW50IGh0b3RhbCwKCQkJCSAgaW50IHBpeGVsX3Np emUsIGludCBjbG9jaywgaW50IGxhdGVuY3lfbnMsCgkJCQkgIGNvbnN0IHN0cnVjdCBpbnRlbF93 YXRlcm1hcmtfcGFyYW1zICpkaXNwbGF5LAoJCQkJICBjb25zdCBzdHJ1Y3QgaW50ZWxfd2F0ZXJt YXJrX3BhcmFtcyAqY3Vyc29yLAoJCQkJICBpbnQgKmZiY193bSwgaW50ICpkaXNwbGF5X3dtLCBp bnQgKmN1cnNvcl93bSkKewoKCXVuc2lnbmVkIGxvbmcgbGluZV90aW1lX3VzOwoJaW50IGxpbmVf Y291bnQsIGxpbmVfc2l6ZTsKCWludCBzbWFsbCwgbGFyZ2U7CglpbnQgZW50cmllczsKCglpZiAo IWxhdGVuY3lfbnMpIHsKCQkqZmJjX3dtID0gKmRpc3BsYXlfd20gPSAqY3Vyc29yX3dtID0gMDsK CQlyZXR1cm4gZmFsc2U7Cgl9CgoJbGluZV90aW1lX3VzID0gKGh0b3RhbCAqIDEwMDApIC8gY2xv Y2s7CglsaW5lX2NvdW50ID0gKGxhdGVuY3lfbnMgLyBsaW5lX3RpbWVfdXMgKyAxMDAwKSAvIDEw MDA7CglsaW5lX3NpemUgPSBoZGlzcGxheSAqIHBpeGVsX3NpemU7CgoJLyogVXNlIHRoZSBtaW5p bXVtIG9mIHRoZSBzbWFsbCBhbmQgbGFyZ2UgYnVmZmVyIG1ldGhvZCBmb3IgcHJpbWFyeSAqLwoJ c21hbGwgPSAoKGNsb2NrICogcGl4ZWxfc2l6ZSAvIDEwMDApICogbGF0ZW5jeV9ucykgLyAxMDAw OwoJbGFyZ2UgPSBsaW5lX2NvdW50ICogbGluZV9zaXplOwoKCWVudHJpZXMgPSBESVZfUk9VTkRf VVAobWluKHNtYWxsLCBsYXJnZSksIGRpc3BsYXktPmNhY2hlbGluZV9zaXplKTsKCSpkaXNwbGF5 X3dtID0gZW50cmllcyArIGRpc3BsYXktPmd1YXJkX3NpemU7CgoJLyoKCSAqIFNwZWMgc2F5czoK CSAqIEZCQyBXTSA9ICgoRmluYWwgUHJpbWFyeSBXTSAqIDY0KSAvIG51bWJlciBvZiBieXRlcyBw ZXIgbGluZSkgKyAyCgkgKi8KCSpmYmNfd20gPSBESVZfUk9VTkRfVVAoKmRpc3BsYXlfd20gKiA2 NCwgbGluZV9zaXplKSArIDI7CgoJLyogY2FsY3VsYXRlIHRoZSBzZWxmLXJlZnJlc2ggd2F0ZXJt YXJrIGZvciBkaXNwbGF5IGN1cnNvciAqLwoJZW50cmllcyA9IGxpbmVfY291bnQgKiBwaXhlbF9z aXplICogNjQ7CgllbnRyaWVzID0gRElWX1JPVU5EX1VQKGVudHJpZXMsIGN1cnNvci0+Y2FjaGVs aW5lX3NpemUpOwoJKmN1cnNvcl93bSA9IGVudHJpZXMgKyBjdXJzb3ItPmd1YXJkX3NpemU7CgoJ cmV0dXJuIGlyb25sYWtlX2NoZWNrX3Nyd20oZGV2LCBsZXZlbCwKCQkJCSAgICpmYmNfd20sICpk aXNwbGF5X3dtLCAqY3Vyc29yX3dtLAoJCQkJICAgZGlzcGxheSwgY3Vyc29yKTsKfQoKc3RhdGlj IHZvaWQgaXJvbmxha2VfdXBkYXRlX3dtKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCgkJCSAgICAg ICBpbnQgcGxhbmVhX2Nsb2NrLCBpbnQgcGxhbmViX2Nsb2NrLAoJCQkgICAgICAgaW50IGhkaXNw bGF5LCBpbnQgaHRvdGFsLAoJCQkgICAgICAgaW50IHBpeGVsX3NpemUpCnsKCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglpbnQgZmJjX3dtLCBw bGFuZV93bSwgY3Vyc29yX3dtLCBlbmFibGVkOwoJaW50IGNsb2NrOwoKCWVuYWJsZWQgPSAwOwoJ aWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMCwKCQkJCSAmaXJvbmxha2VfZGlzcGxheV93 bV9pbmZvLAoJCQkJIElMS19MUDBfUExBTkVfTEFURU5DWSwKCQkJCSAmaXJvbmxha2VfY3Vyc29y X3dtX2luZm8sCgkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKCQkJCSAmcGxhbmVfd20sICZj dXJzb3Jfd20pKSB7CgkJSTkxNV9XUklURShXTTBfUElQRUFfSUxLLAoJCQkgICAocGxhbmVfd20g PDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKCQlEUk1fREVCVUdfS01TKCJG SUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQSAtIgoJCQkgICAgICAiIHBsYW5lICVkLCAiICJjdXJz b3I6ICVkXG4iLAoJCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKCQllbmFibGVkKys7Cgl9 CgoJaWYgKGlyb25sYWtlX2NvbXB1dGVfd20wKGRldiwgMSwKCQkJCSAmaXJvbmxha2VfZGlzcGxh eV93bV9pbmZvLAoJCQkJIElMS19MUDBfUExBTkVfTEFURU5DWSwKCQkJCSAmaXJvbmxha2VfY3Vy c29yX3dtX2luZm8sCgkJCQkgSUxLX0xQMF9DVVJTT1JfTEFURU5DWSwKCQkJCSAmcGxhbmVfd20s ICZjdXJzb3Jfd20pKSB7CgkJSTkxNV9XUklURShXTTBfUElQRUJfSUxLLAoJCQkgICAocGxhbmVf d20gPDwgV00wX1BJUEVfUExBTkVfU0hJRlQpIHwgY3Vyc29yX3dtKTsKCQlEUk1fREVCVUdfS01T KCJGSUZPIHdhdGVybWFya3MgRm9yIHBpcGUgQiAtIgoJCQkgICAgICAiIHBsYW5lICVkLCBjdXJz b3I6ICVkXG4iLAoJCQkgICAgICBwbGFuZV93bSwgY3Vyc29yX3dtKTsKCQllbmFibGVkKys7Cgl9 CgoJLyoKCSAqIENhbGN1bGF0ZSBhbmQgdXBkYXRlIHRoZSBzZWxmLXJlZnJlc2ggd2F0ZXJtYXJr IG9ubHkgd2hlbiBvbmUKCSAqIGRpc3BsYXkgcGxhbmUgaXMgdXNlZC4KCSAqLwoJSTkxNV9XUklU RShXTTNfTFBfSUxLLCAwKTsKCUk5MTVfV1JJVEUoV00yX0xQX0lMSywgMCk7CglJOTE1X1dSSVRF KFdNMV9MUF9JTEssIDApOwoKCWlmIChlbmFibGVkICE9IDEpCgkJcmV0dXJuOwoKCWNsb2NrID0g cGxhbmVhX2Nsb2NrID8gcGxhbmVhX2Nsb2NrIDogcGxhbmViX2Nsb2NrOwoKCS8qIFdNMSAqLwoJ aWYgKCFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAxLCBoZGlzcGxheSwgaHRvdGFsLCBwaXhl bF9zaXplLAoJCQkJICAgY2xvY2ssIElMS19SRUFEX1dNMV9MQVRFTkNZKCkgKiA1MDAsCgkJCQkg ICAmaXJvbmxha2VfZGlzcGxheV9zcndtX2luZm8sCgkJCQkgICAmaXJvbmxha2VfY3Vyc29yX3Ny d21faW5mbywKCQkJCSAgICZmYmNfd20sICZwbGFuZV93bSwgJmN1cnNvcl93bSkpCgkJcmV0dXJu OwoKCUk5MTVfV1JJVEUoV00xX0xQX0lMSywKCQkgICBXTTFfTFBfU1JfRU4gfAoJCSAgIChJTEtf UkVBRF9XTTFfTEFURU5DWSgpIDw8IFdNMV9MUF9MQVRFTkNZX1NISUZUKSB8CgkJICAgKGZiY193 bSA8PCBXTTFfTFBfRkJDX1NISUZUKSB8CgkJICAgKHBsYW5lX3dtIDw8IFdNMV9MUF9TUl9TSElG VCkgfAoJCSAgIGN1cnNvcl93bSk7CgoJLyogV00yICovCglpZiAoIWlyb25sYWtlX2NvbXB1dGVf c3J3bShkZXYsIDIsIGhkaXNwbGF5LCBodG90YWwsIHBpeGVsX3NpemUsCgkJCQkgICBjbG9jaywg SUxLX1JFQURfV00yX0xBVEVOQ1koKSAqIDUwMCwKCQkJCSAgICZpcm9ubGFrZV9kaXNwbGF5X3Ny d21faW5mbywKCQkJCSAgICZpcm9ubGFrZV9jdXJzb3Jfc3J3bV9pbmZvLAoJCQkJICAgJmZiY193 bSwgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkKCQlyZXR1cm47CgoJSTkxNV9XUklURShXTTJfTFBf SUxLLAoJCSAgIFdNMl9MUF9FTiB8CgkJICAgKElMS19SRUFEX1dNMl9MQVRFTkNZKCkgPDwgV00x X0xQX0xBVEVOQ1lfU0hJRlQpIHwKCQkgICAoZmJjX3dtIDw8IFdNMV9MUF9GQkNfU0hJRlQpIHwK CQkgICAocGxhbmVfd20gPDwgV00xX0xQX1NSX1NISUZUKSB8CgkJICAgY3Vyc29yX3dtKTsKCgkv KgoJICogV00zIGlzIHVuc3VwcG9ydGVkIG9uIElMSywgcHJvYmFibHkgYmVjYXVzZSB3ZSBkb24n dCBoYXZlIGxhdGVuY3kKCSAqIGRhdGEgZm9yIHRoYXQgcG93ZXIgc3RhdGUKCSAqLwp9CgpzdGF0 aWMgdm9pZCBzYW5keWJyaWRnZV91cGRhdGVfd20oc3RydWN0IGRybV9kZXZpY2UgKmRldiwKCQkJ ICAgICAgIGludCBwbGFuZWFfY2xvY2ssIGludCBwbGFuZWJfY2xvY2ssCgkJCSAgICAgICBpbnQg aGRpc3BsYXksIGludCBodG90YWwsCgkJCSAgICAgICBpbnQgcGl4ZWxfc2l6ZSkKewoJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWludCBsYXRl bmN5ID0gU05CX1JFQURfV00wX0xBVEVOQ1koKSAqIDEwMDsJLyogSW4gdW5pdCAwLjF1cyAqLwoJ aW50IGZiY193bSwgcGxhbmVfd20sIGN1cnNvcl93bSwgZW5hYmxlZDsKCWludCBjbG9jazsKCgll bmFibGVkID0gMDsKCWlmIChpcm9ubGFrZV9jb21wdXRlX3dtMChkZXYsIDAsCgkJCQkgJnNhbmR5 YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5jeSwKCQkJCSAmc2FuZHlicmlkZ2VfY3Vyc29y X3dtX2luZm8sIGxhdGVuY3ksCgkJCQkgJnBsYW5lX3dtLCAmY3Vyc29yX3dtKSkgewoJCUk5MTVf V1JJVEUoV00wX1BJUEVBX0lMSywKCQkJICAgKHBsYW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NI SUZUKSB8IGN1cnNvcl93bSk7CgkJRFJNX0RFQlVHX0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBw aXBlIEEgLSIKCQkJICAgICAgIiBwbGFuZSAlZCwgIiAiY3Vyc29yOiAlZFxuIiwKCQkJICAgICAg cGxhbmVfd20sIGN1cnNvcl93bSk7CgkJZW5hYmxlZCsrOwoJfQoKCWlmIChpcm9ubGFrZV9jb21w dXRlX3dtMChkZXYsIDEsCgkJCQkgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfd21faW5mbywgbGF0ZW5j eSwKCQkJCSAmc2FuZHlicmlkZ2VfY3Vyc29yX3dtX2luZm8sIGxhdGVuY3ksCgkJCQkgJnBsYW5l X3dtLCAmY3Vyc29yX3dtKSkgewoJCUk5MTVfV1JJVEUoV00wX1BJUEVCX0lMSywKCQkJICAgKHBs YW5lX3dtIDw8IFdNMF9QSVBFX1BMQU5FX1NISUZUKSB8IGN1cnNvcl93bSk7CgkJRFJNX0RFQlVH X0tNUygiRklGTyB3YXRlcm1hcmtzIEZvciBwaXBlIEIgLSIKCQkJICAgICAgIiBwbGFuZSAlZCwg Y3Vyc29yOiAlZFxuIiwKCQkJICAgICAgcGxhbmVfd20sIGN1cnNvcl93bSk7CgkJZW5hYmxlZCsr OwoJfQoKCS8qCgkgKiBDYWxjdWxhdGUgYW5kIHVwZGF0ZSB0aGUgc2VsZi1yZWZyZXNoIHdhdGVy bWFyayBvbmx5IHdoZW4gb25lCgkgKiBkaXNwbGF5IHBsYW5lIGlzIHVzZWQuCgkgKgoJICogU05C IHN1cHBvcnQgMyBsZXZlbHMgb2Ygd2F0ZXJtYXJrLgoJICoKCSAqIFdNMS9XTTIvV00yIHdhdGVy bWFya3MgaGF2ZSB0byBiZSBlbmFibGVkIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIsCgkgKiBhbmQg ZGlzYWJsZWQgaW4gdGhlIGRlc2NlbmRpbmcgb3JkZXIKCSAqCgkgKi8KCUk5MTVfV1JJVEUoV00z X0xQX0lMSywgMCk7CglJOTE1X1dSSVRFKFdNMl9MUF9JTEssIDApOwoJSTkxNV9XUklURShXTTFf TFBfSUxLLCAwKTsKCglpZiAoZW5hYmxlZCAhPSAxKQoJCXJldHVybjsKCgljbG9jayA9IHBsYW5l YV9jbG9jayA/IHBsYW5lYV9jbG9jayA6IHBsYW5lYl9jbG9jazsKCgkvKiBXTTEgKi8KCWlmICgh aXJvbmxha2VfY29tcHV0ZV9zcndtKGRldiwgMSwgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6 ZSwKCQkJCSAgIGNsb2NrLCBTTkJfUkVBRF9XTTFfTEFURU5DWSgpICogNTAwLAoJCQkJICAgJnNh bmR5YnJpZGdlX2Rpc3BsYXlfc3J3bV9pbmZvLAoJCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9z cndtX2luZm8sCgkJCQkgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQoJCXJldHVy bjsKCglJOTE1X1dSSVRFKFdNMV9MUF9JTEssCgkJICAgV00xX0xQX1NSX0VOIHwKCQkgICAoU05C X1JFQURfV00xX0xBVEVOQ1koKSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAoJCSAgIChmYmNf d20gPDwgV00xX0xQX0ZCQ19TSElGVCkgfAoJCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJ RlQpIHwKCQkgICBjdXJzb3Jfd20pOwoKCS8qIFdNMiAqLwoJaWYgKCFpcm9ubGFrZV9jb21wdXRl X3Nyd20oZGV2LCAyLAoJCQkJICAgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6ZSwKCQkJCSAg IGNsb2NrLCBTTkJfUkVBRF9XTTJfTEFURU5DWSgpICogNTAwLAoJCQkJICAgJnNhbmR5YnJpZGdl X2Rpc3BsYXlfc3J3bV9pbmZvLAoJCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8s CgkJCQkgICAmZmJjX3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQoJCXJldHVybjsKCglJOTE1 X1dSSVRFKFdNMl9MUF9JTEssCgkJICAgV00yX0xQX0VOIHwKCQkgICAoU05CX1JFQURfV00yX0xB VEVOQ1koKSA8PCBXTTFfTFBfTEFURU5DWV9TSElGVCkgfAoJCSAgIChmYmNfd20gPDwgV00xX0xQ X0ZCQ19TSElGVCkgfAoJCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKCQkgICBj dXJzb3Jfd20pOwoKCS8qIFdNMyAqLwoJaWYgKCFpcm9ubGFrZV9jb21wdXRlX3Nyd20oZGV2LCAz LAoJCQkJICAgaGRpc3BsYXksIGh0b3RhbCwgcGl4ZWxfc2l6ZSwKCQkJCSAgIGNsb2NrLCBTTkJf UkVBRF9XTTNfTEFURU5DWSgpICogNTAwLAoJCQkJICAgJnNhbmR5YnJpZGdlX2Rpc3BsYXlfc3J3 bV9pbmZvLAoJCQkJICAgJnNhbmR5YnJpZGdlX2N1cnNvcl9zcndtX2luZm8sCgkJCQkgICAmZmJj X3dtLCAmcGxhbmVfd20sICZjdXJzb3Jfd20pKQoJCXJldHVybjsKCglJOTE1X1dSSVRFKFdNM19M UF9JTEssCgkJICAgV00zX0xQX0VOIHwKCQkgICAoU05CX1JFQURfV00zX0xBVEVOQ1koKSA8PCBX TTFfTFBfTEFURU5DWV9TSElGVCkgfAoJCSAgIChmYmNfd20gPDwgV00xX0xQX0ZCQ19TSElGVCkg fAoJCSAgIChwbGFuZV93bSA8PCBXTTFfTFBfU1JfU0hJRlQpIHwKCQkgICBjdXJzb3Jfd20pOwp9 CgovKioKICogaW50ZWxfdXBkYXRlX3dhdGVybWFya3MgLSB1cGRhdGUgRklGTyB3YXRlcm1hcmsg dmFsdWVzIGJhc2VkIG9uIGN1cnJlbnQgbW9kZXMKICoKICogQ2FsY3VsYXRlIHdhdGVybWFyayB2 YWx1ZXMgZm9yIHRoZSB2YXJpb3VzIFdNIHJlZ3MgYmFzZWQgb24gY3VycmVudCBtb2RlCiAqIGFu ZCBwbGFuZSBjb25maWd1cmF0aW9uLgogKgogKiBUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB0byBk ZWFsIHdpdGggaGVyZToKICogICAtIG5vcm1hbCAoaS5lLiBub24tc2VsZi1yZWZyZXNoKQogKiAg IC0gc2VsZi1yZWZyZXNoIChTUikgbW9kZQogKiAgIC0gbGluZXMgYXJlIGxhcmdlIHJlbGF0aXZl IHRvIEZJRk8gc2l6ZSAoYnVmZmVyIGNhbiBob2xkIHVwIHRvIDIpCiAqICAgLSBsaW5lcyBhcmUg c21hbGwgcmVsYXRpdmUgdG8gRklGTyBzaXplIChidWZmZXIgY2FuIGhvbGQgbW9yZSB0aGFuIDIK ICogICAgIGxpbmVzKSwgc28gbmVlZCB0byBhY2NvdW50IGZvciBUTEIgbGF0ZW5jeQogKgogKiAg IFRoZSBub3JtYWwgY2FsY3VsYXRpb24gaXM6CiAqICAgICB3YXRlcm1hcmsgPSBkb3RjbG9jayAq IGJ5dGVzIHBlciBwaXhlbCAqIGxhdGVuY3kKICogICB3aGVyZSBsYXRlbmN5IGlzIHBsYXRmb3Jt ICYgY29uZmlndXJhdGlvbiBkZXBlbmRlbnQgKHdlIGFzc3VtZSBwZXNzaW1hbAogKiAgIHZhbHVl cyBoZXJlKS4KICoKICogICBUaGUgU1IgY2FsY3VsYXRpb24gaXM6CiAqICAgICB3YXRlcm1hcmsg PSAodHJ1bmMobGF0ZW5jeS9saW5lIHRpbWUpKzEpICogc3VyZmFjZSB3aWR0aCAqCiAqICAgICAg IGJ5dGVzIHBlciBwaXhlbAogKiAgIHdoZXJlCiAqICAgICBsaW5lIHRpbWUgPSBodG90YWwgLyBk b3RjbG9jawogKiAgICAgc3VyZmFjZSB3aWR0aCA9IGhkaXNwbGF5IGZvciBub3JtYWwgcGxhbmUg YW5kIDY0IGZvciBjdXJzb3IKICogICBhbmQgbGF0ZW5jeSBpcyBhc3N1bWVkIHRvIGJlIGhpZ2gs IGFzIGFib3ZlLgogKgogKiBUaGUgZmluYWwgdmFsdWUgcHJvZ3JhbW1lZCB0byB0aGUgcmVnaXN0 ZXIgc2hvdWxkIGFsd2F5cyBiZSByb3VuZGVkIHVwLAogKiBhbmQgaW5jbHVkZSBhbiBleHRyYSAy IGVudHJpZXMgdG8gYWNjb3VudCBmb3IgY2xvY2sgY3Jvc3NpbmdzLgogKgogKiBXZSBkb24ndCB1 c2UgdGhlIHNwcml0ZSwgc28gd2UgY2FuIGlnbm9yZSB0aGF0LiAgQW5kIG9uIENyZXN0bGluZSB3 ZSBoYXZlCiAqIHRvIHNldCB0aGUgbm9uLVNSIHdhdGVybWFya3MgdG8gOC4KICovCnN0YXRpYyB2 b2lkIGludGVsX3VwZGF0ZV93YXRlcm1hcmtzKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1 Y3QgZHJtX2NydGMgKmNydGM7CglpbnQgc3JfaGRpc3BsYXkgPSAwOwoJdW5zaWduZWQgbG9uZyBw bGFuZWFfY2xvY2sgPSAwLCBwbGFuZWJfY2xvY2sgPSAwLCBzcl9jbG9jayA9IDA7CglpbnQgZW5h YmxlZCA9IDAsIHBpeGVsX3NpemUgPSAwOwoJaW50IHNyX2h0b3RhbCA9IDA7CgoJaWYgKCFkZXZf cHJpdi0+ZGlzcGxheS51cGRhdGVfd20pCgkJcmV0dXJuOwoKCS8qIEdldCB0aGUgY2xvY2sgY29u ZmlnIGZyb20gYm90aCBwbGFuZXMgKi8KCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+ bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CgkJc3RydWN0IGludGVsX2NydGMgKmludGVs X2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJCWlmIChpbnRlbF9jcnRjLT5hY3RpdmUpIHsK CQkJZW5hYmxlZCsrOwoJCQlpZiAoaW50ZWxfY3J0Yy0+cGxhbmUgPT0gMCkgewoJCQkJRFJNX0RF QlVHX0tNUygicGxhbmUgQSAocGlwZSAlZCkgY2xvY2s6ICVkXG4iLAoJCQkJCSAgICAgIGludGVs X2NydGMtPnBpcGUsIGNydGMtPm1vZGUuY2xvY2spOwoJCQkJcGxhbmVhX2Nsb2NrID0gY3J0Yy0+ bW9kZS5jbG9jazsKCQkJfSBlbHNlIHsKCQkJCURSTV9ERUJVR19LTVMoInBsYW5lIEIgKHBpcGUg JWQpIGNsb2NrOiAlZFxuIiwKCQkJCQkgICAgICBpbnRlbF9jcnRjLT5waXBlLCBjcnRjLT5tb2Rl LmNsb2NrKTsKCQkJCXBsYW5lYl9jbG9jayA9IGNydGMtPm1vZGUuY2xvY2s7CgkJCX0KCQkJc3Jf aGRpc3BsYXkgPSBjcnRjLT5tb2RlLmhkaXNwbGF5OwoJCQlzcl9jbG9jayA9IGNydGMtPm1vZGUu Y2xvY2s7CgkJCXNyX2h0b3RhbCA9IGNydGMtPm1vZGUuaHRvdGFsOwoJCQlpZiAoY3J0Yy0+ZmIp CgkJCQlwaXhlbF9zaXplID0gY3J0Yy0+ZmItPmJpdHNfcGVyX3BpeGVsIC8gODsKCQkJZWxzZQoJ CQkJcGl4ZWxfc2l6ZSA9IDQ7IC8qIGJ5IGRlZmF1bHQgKi8KCQl9Cgl9CgoJaWYgKGVuYWJsZWQg PD0gMCkKCQlyZXR1cm47CgoJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtKGRldiwgcGxhbmVh X2Nsb2NrLCBwbGFuZWJfY2xvY2ssCgkJCQkgICAgc3JfaGRpc3BsYXksIHNyX2h0b3RhbCwgcGl4 ZWxfc2l6ZSk7Cn0KCnN0YXRpYyBpbmxpbmUgYm9vbCBpbnRlbF9wYW5lbF91c2Vfc3NjKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKewoJcmV0dXJuIGRldl9wcml2LT5sdmRzX3Vz ZV9zc2MgJiYgaTkxNV9wYW5lbF91c2Vfc3NjOwp9CgpzdGF0aWMgaW50IGludGVsX2NydGNfbW9k ZV9zZXQoc3RydWN0IGRybV9jcnRjICpjcnRjLAoJCQkgICAgICAgc3RydWN0IGRybV9kaXNwbGF5 X21vZGUgKm1vZGUsCgkJCSAgICAgICBzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqYWRqdXN0ZWRf bW9kZSwKCQkJICAgICAgIGludCB4LCBpbnQgeSwKCQkJICAgICAgIHN0cnVjdCBkcm1fZnJhbWVi dWZmZXIgKm9sZF9mYikKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1 Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGlw ZSA9IGludGVsX2NydGMtPnBpcGU7CglpbnQgcGxhbmUgPSBpbnRlbF9jcnRjLT5wbGFuZTsKCXUz MiBmcF9yZWcsIGRwbGxfcmVnOwoJaW50IHJlZmNsaywgbnVtX2Nvbm5lY3RvcnMgPSAwOwoJaW50 ZWxfY2xvY2tfdCBjbG9jaywgcmVkdWNlZF9jbG9jazsKCXUzMiBkcGxsLCBmcCA9IDAsIGZwMiA9 IDAsIGRzcGNudHIsIHBpcGVjb25mOwoJYm9vbCBvaywgaGFzX3JlZHVjZWRfY2xvY2sgPSBmYWxz ZSwgaXNfc2R2byA9IGZhbHNlLCBpc19kdm8gPSBmYWxzZTsKCWJvb2wgaXNfY3J0ID0gZmFsc2Us IGlzX2x2ZHMgPSBmYWxzZSwgaXNfdHYgPSBmYWxzZSwgaXNfZHAgPSBmYWxzZTsKCXN0cnVjdCBp bnRlbF9lbmNvZGVyICpoYXNfZWRwX2VuY29kZXIgPSBOVUxMOwoJc3RydWN0IGRybV9tb2RlX2Nv bmZpZyAqbW9kZV9jb25maWcgPSAmZGV2LT5tb2RlX2NvbmZpZzsKCXN0cnVjdCBpbnRlbF9lbmNv ZGVyICplbmNvZGVyOwoJY29uc3QgaW50ZWxfbGltaXRfdCAqbGltaXQ7CglpbnQgcmV0OwoJc3Ry dWN0IGZkaV9tX24gbV9uID0gezB9OwoJdTMyIHJlZywgdGVtcDsKCWludCB0YXJnZXRfY2xvY2s7 CgoJZHJtX3ZibGFua19wcmVfbW9kZXNldChkZXYsIHBpcGUpOwoKCWxpc3RfZm9yX2VhY2hfZW50 cnkoZW5jb2RlciwgJm1vZGVfY29uZmlnLT5lbmNvZGVyX2xpc3QsIGJhc2UuaGVhZCkgewoJCWlm IChlbmNvZGVyLT5iYXNlLmNydGMgIT0gY3J0YykKCQkJY29udGludWU7CgoJCXN3aXRjaCAoZW5j b2Rlci0+dHlwZSkgewoJCWNhc2UgSU5URUxfT1VUUFVUX0xWRFM6CgkJCWlzX2x2ZHMgPSB0cnVl OwoJCQlicmVhazsKCQljYXNlIElOVEVMX09VVFBVVF9TRFZPOgoJCWNhc2UgSU5URUxfT1VUUFVU X0hETUk6CgkJCWlzX3Nkdm8gPSB0cnVlOwoJCQlpZiAoZW5jb2Rlci0+bmVlZHNfdHZfY2xvY2sp CgkJCQlpc190diA9IHRydWU7CgkJCWJyZWFrOwoJCWNhc2UgSU5URUxfT1VUUFVUX0RWTzoKCQkJ aXNfZHZvID0gdHJ1ZTsKCQkJYnJlYWs7CgkJY2FzZSBJTlRFTF9PVVRQVVRfVFZPVVQ6CgkJCWlz X3R2ID0gdHJ1ZTsKCQkJYnJlYWs7CgkJY2FzZSBJTlRFTF9PVVRQVVRfQU5BTE9HOgoJCQlpc19j cnQgPSB0cnVlOwoJCQlicmVhazsKCQljYXNlIElOVEVMX09VVFBVVF9ESVNQTEFZUE9SVDoKCQkJ aXNfZHAgPSB0cnVlOwoJCQlicmVhazsKCQljYXNlIElOVEVMX09VVFBVVF9FRFA6CgkJCWhhc19l ZHBfZW5jb2RlciA9IGVuY29kZXI7CgkJCWJyZWFrOwoJCX0KCgkJbnVtX2Nvbm5lY3RvcnMrKzsK CX0KCglpZiAoaXNfbHZkcyAmJiBpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSAmJiBudW1f Y29ubmVjdG9ycyA8IDIpIHsKCQlyZWZjbGsgPSBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSAqIDEw MDA7CgkJRFJNX0RFQlVHX0tNUygidXNpbmcgU1NDIHJlZmVyZW5jZSBjbG9jayBvZiAlZCBNSHpc biIsCgkJCSAgICAgIHJlZmNsayAvIDEwMDApOwoJfSBlbHNlIGlmICghSVNfR0VOMihkZXYpKSB7 CgkJcmVmY2xrID0gOTYwMDA7CgkJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSAmJgoJCSAgICAoIWhh c19lZHBfZW5jb2RlciB8fCBpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmhhc19lZHBfZW5jb2Rl ci0+YmFzZSkpKQoJCQlyZWZjbGsgPSAxMjAwMDA7IC8qIDEyME1oeiByZWZjbGsgKi8KCX0gZWxz ZSB7CgkJcmVmY2xrID0gNDgwMDA7Cgl9CgoJLyoKCSAqIFJldHVybnMgYSBzZXQgb2YgZGl2aXNv cnMgZm9yIHRoZSBkZXNpcmVkIHRhcmdldCBjbG9jayB3aXRoIHRoZSBnaXZlbgoJICogcmVmY2xr LCBvciBGQUxTRS4gIFRoZSByZXR1cm5lZCB2YWx1ZXMgcmVwcmVzZW50IHRoZSBjbG9jayBlcXVh dGlvbjoKCSAqIHJlZmxjayAqICg1ICogKG0xICsgMikgKyAobTIgKyAyKSkgLyAobiArIDIpIC8g cDEgLyBwMi4KCSAqLwoJbGltaXQgPSBpbnRlbF9saW1pdChjcnRjLCByZWZjbGspOwoJb2sgPSBs aW1pdC0+ZmluZF9wbGwobGltaXQsIGNydGMsIGFkanVzdGVkX21vZGUtPmNsb2NrLCByZWZjbGss ICZjbG9jayk7CglpZiAoIW9rKSB7CgkJRFJNX0VSUk9SKCJDb3VsZG4ndCBmaW5kIFBMTCBzZXR0 aW5ncyBmb3IgbW9kZSFcbiIpOwoJCWRybV92YmxhbmtfcG9zdF9tb2Rlc2V0KGRldiwgcGlwZSk7 CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogRW5zdXJlIHRoYXQgdGhlIGN1cnNvciBpcyB2YWxp ZCBmb3IgdGhlIG5ldyBtb2RlIGJlZm9yZSBjaGFuZ2luZy4uLiAqLwoJaW50ZWxfY3J0Y191cGRh dGVfY3Vyc29yKGNydGMsIHRydWUpOwoKCWlmIChpc19sdmRzICYmIGRldl9wcml2LT5sdmRzX2Rv d25jbG9ja19hdmFpbCkgewoJCWhhc19yZWR1Y2VkX2Nsb2NrID0gbGltaXQtPmZpbmRfcGxsKGxp bWl0LCBjcnRjLAoJCQkJCQkgICAgZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2NrLAoJCQkJCQkgICAg cmVmY2xrLAoJCQkJCQkgICAgJnJlZHVjZWRfY2xvY2spOwoJCWlmIChoYXNfcmVkdWNlZF9jbG9j ayAmJiAoY2xvY2sucCAhPSByZWR1Y2VkX2Nsb2NrLnApKSB7CgkJCS8qCgkJCSAqIElmIHRoZSBk aWZmZXJlbnQgUCBpcyBmb3VuZCwgaXQgbWVhbnMgdGhhdCB3ZSBjYW4ndAoJCQkgKiBzd2l0Y2gg dGhlIGRpc3BsYXkgY2xvY2sgYnkgdXNpbmcgdGhlIEZQMC9GUDEuCgkJCSAqIEluIHN1Y2ggY2Fz ZSB3ZSB3aWxsIGRpc2FibGUgdGhlIExWRFMgZG93bmNsb2NrCgkJCSAqIGZlYXR1cmUuCgkJCSAq LwoJCQlEUk1fREVCVUdfS01TKCJEaWZmZXJlbnQgUCBpcyBmb3VuZCBmb3IgIgoJCQkJICAgICAg IkxWRFMgY2xvY2svZG93bmNsb2NrXG4iKTsKCQkJaGFzX3JlZHVjZWRfY2xvY2sgPSAwOwoJCX0K CX0KCS8qIFNEVk8gVFYgaGFzIGZpeGVkIFBMTCB2YWx1ZXMgZGVwZW5kIG9uIGl0cyBjbG9jayBy YW5nZSwKCSAgIHRoaXMgbWlycm9ycyB2YmlvcyBzZXR0aW5nLiAqLwoJaWYgKGlzX3Nkdm8gJiYg aXNfdHYpIHsKCQlpZiAoYWRqdXN0ZWRfbW9kZS0+Y2xvY2sgPj0gMTAwMDAwCgkJICAgICYmIGFk anVzdGVkX21vZGUtPmNsb2NrIDwgMTQwNTAwKSB7CgkJCWNsb2NrLnAxID0gMjsKCQkJY2xvY2su cDIgPSAxMDsKCQkJY2xvY2subiA9IDM7CgkJCWNsb2NrLm0xID0gMTY7CgkJCWNsb2NrLm0yID0g ODsKCQl9IGVsc2UgaWYgKGFkanVzdGVkX21vZGUtPmNsb2NrID49IDE0MDUwMAoJCQkgICAmJiBh ZGp1c3RlZF9tb2RlLT5jbG9jayA8PSAyMDAwMDApIHsKCQkJY2xvY2sucDEgPSAxOwoJCQljbG9j ay5wMiA9IDEwOwoJCQljbG9jay5uID0gNjsKCQkJY2xvY2subTEgPSAxMjsKCQkJY2xvY2subTIg PSA4OwoJCX0KCX0KCgkvKiBGREkgbGluayAqLwoJaWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkgewoJ CWludCBwaXhlbF9tdWx0aXBsaWVyID0gaW50ZWxfbW9kZV9nZXRfcGl4ZWxfbXVsdGlwbGllcihh ZGp1c3RlZF9tb2RlKTsKCQlpbnQgbGFuZSA9IDAsIGxpbmtfYncsIGJwcDsKCQkvKiBDUFUgZURQ IGRvZXNuJ3QgcmVxdWlyZSBGREkgbGluaywgc28ganVzdCBzZXQgRFAgTS9OCgkJICAgYWNjb3Jk aW5nIHRvIGN1cnJlbnQgbGluayBjb25maWcgKi8KCQlpZiAoaGFzX2VkcF9lbmNvZGVyICYmICFp bnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAoJmhhc19lZHBfZW5jb2Rlci0+YmFzZSkpIHsKCQkJdGFy Z2V0X2Nsb2NrID0gbW9kZS0+Y2xvY2s7CgkJCWludGVsX2VkcF9saW5rX2NvbmZpZyhoYXNfZWRw X2VuY29kZXIsCgkJCQkJICAgICAgJmxhbmUsICZsaW5rX2J3KTsKCQl9IGVsc2UgewoJCQkvKiBb ZV1EUCBvdmVyIEZESSByZXF1aXJlcyB0YXJnZXQgbW9kZSBjbG9jawoJCQkgICBpbnN0ZWFkIG9m IGxpbmsgY2xvY2sgKi8KCQkJaWYgKGlzX2RwIHx8IGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgm aGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkKCQkJCXRhcmdldF9jbG9jayA9IG1vZGUtPmNsb2NrOwoJ CQllbHNlCgkJCQl0YXJnZXRfY2xvY2sgPSBhZGp1c3RlZF9tb2RlLT5jbG9jazsKCgkJCS8qIEZE SSBpcyBhIGJpbmFyeSBzaWduYWwgcnVubmluZyBhdCB+Mi43R0h6LCBlbmNvZGluZwoJCQkgKiBl YWNoIG91dHB1dCBvY3RldCBhcyAxMCBiaXRzLiBUaGUgYWN0dWFsIGZyZXF1ZW5jeQoJCQkgKiBp cyBzdG9yZWQgYXMgYSBkaXZpZGVyIGludG8gYSAxMDBNSHogY2xvY2ssIGFuZCB0aGUKCQkJICog bW9kZSBwaXhlbCBjbG9jayBpcyBzdG9yZWQgaW4gdW5pdHMgb2YgMUtIei4KCQkJICogSGVuY2Ug dGhlIGJ3IG9mIGVhY2ggbGFuZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZSBzaWduYWwKCQkJICogaXM6 CgkJCSAqLwoJCQlsaW5rX2J3ID0gaW50ZWxfZmRpX2xpbmtfZnJlcShkZXYpICogTUh6KDEwMCkv S0h6KDEpLzEwOwoJCX0KCgkJLyogZGV0ZXJtaW5lIHBhbmVsIGNvbG9yIGRlcHRoICovCgkJdGVt cCA9IEk5MTVfUkVBRChQSVBFQ09ORihwaXBlKSk7CgkJdGVtcCAmPSB+UElQRV9CUENfTUFTSzsK CQlpZiAoaXNfbHZkcykgewoJCQkvKiB0aGUgQlBDIHdpbGwgYmUgNiBpZiBpdCBpcyAxOC1iaXQg TFZEUyBwYW5lbCAqLwoJCQlpZiAoKEk5MTVfUkVBRChQQ0hfTFZEUykgJiBMVkRTX0EzX1BPV0VS X01BU0spID09IExWRFNfQTNfUE9XRVJfVVApCgkJCQl0ZW1wIHw9IFBJUEVfOEJQQzsKCQkJZWxz ZQoJCQkJdGVtcCB8PSBQSVBFXzZCUEM7CgkJfSBlbHNlIGlmIChoYXNfZWRwX2VuY29kZXIpIHsK CQkJc3dpdGNoIChkZXZfcHJpdi0+ZWRwLmJwcC8zKSB7CgkJCWNhc2UgODoKCQkJCXRlbXAgfD0g UElQRV84QlBDOwoJCQkJYnJlYWs7CgkJCWNhc2UgMTA6CgkJCQl0ZW1wIHw9IFBJUEVfMTBCUEM7 CgkJCQlicmVhazsKCQkJY2FzZSA2OgoJCQkJdGVtcCB8PSBQSVBFXzZCUEM7CgkJCQlicmVhazsK CQkJY2FzZSAxMjoKCQkJCXRlbXAgfD0gUElQRV8xMkJQQzsKCQkJCWJyZWFrOwoJCQl9CgkJfSBl bHNlCgkJCXRlbXAgfD0gUElQRV84QlBDOwoJCUk5MTVfV1JJVEUoUElQRUNPTkYocGlwZSksIHRl bXApOwoKCQlzd2l0Y2ggKHRlbXAgJiBQSVBFX0JQQ19NQVNLKSB7CgkJY2FzZSBQSVBFXzhCUEM6 CgkJCWJwcCA9IDI0OwoJCQlicmVhazsKCQljYXNlIFBJUEVfMTBCUEM6CgkJCWJwcCA9IDMwOwoJ CQlicmVhazsKCQljYXNlIFBJUEVfNkJQQzoKCQkJYnBwID0gMTg7CgkJCWJyZWFrOwoJCWNhc2Ug UElQRV8xMkJQQzoKCQkJYnBwID0gMzY7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCURSTV9FUlJP UigidW5rbm93biBwaXBlIGJwYyB2YWx1ZVxuIik7CgkJCWJwcCA9IDI0OwoJCX0KCgkJaWYgKCFs YW5lKSB7CgkJCS8qIAoJCQkgKiBBY2NvdW50IGZvciBzcHJlYWQgc3BlY3RydW0gdG8gYXZvaWQK CQkJICogb3ZlcnN1YnNjcmliaW5nIHRoZSBsaW5rLiBNYXggY2VudGVyIHNwcmVhZAoJCQkgKiBp cyAyLjUlOyB1c2UgNSUgZm9yIHNhZmV0eSdzIHNha2UuCgkJCSAqLwoJCQl1MzIgYnBzID0gdGFy Z2V0X2Nsb2NrICogYnBwICogMjEgLyAyMDsKCQkJbGFuZSA9IGJwcyAvIChsaW5rX2J3ICogOCkg KyAxOwoJCX0KCgkJaW50ZWxfY3J0Yy0+ZmRpX2xhbmVzID0gbGFuZTsKCgkJaWYgKHBpeGVsX211 bHRpcGxpZXIgPiAxKQoJCQlsaW5rX2J3ICo9IHBpeGVsX211bHRpcGxpZXI7CgkJaXJvbmxha2Vf Y29tcHV0ZV9tX24oYnBwLCBsYW5lLCB0YXJnZXRfY2xvY2ssIGxpbmtfYncsICZtX24pOwoJfQoK CS8qIElyb25sYWtlOiB0cnkgdG8gc2V0dXAgZGlzcGxheSByZWYgY2xvY2sgYmVmb3JlIERQTEwK CSAqIGVuYWJsaW5nLiBUaGlzIGlzIG9ubHkgdW5kZXIgZHJpdmVyJ3MgY29udHJvbCBhZnRlcgoJ ICogUENIIEIgc3RlcHBpbmcsIHByZXZpb3VzIGNoaXBzZXQgc3RlcHBpbmcgc2hvdWxkIGJlCgkg KiBpZ25vcmluZyB0aGlzIHNldHRpbmcuCgkgKi8KCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsK CQl0ZW1wID0gSTkxNV9SRUFEKFBDSF9EUkVGX0NPTlRST0wpOwoJCS8qIEFsd2F5cyBlbmFibGUg bm9uc3ByZWFkIHNvdXJjZSAqLwoJCXRlbXAgJj0gfkRSRUZfTk9OU1BSRUFEX1NPVVJDRV9NQVNL OwoJCXRlbXAgfD0gRFJFRl9OT05TUFJFQURfU09VUkNFX0VOQUJMRTsKCQl0ZW1wICY9IH5EUkVG X1NTQ19TT1VSQ0VfTUFTSzsKCQl0ZW1wIHw9IERSRUZfU1NDX1NPVVJDRV9FTkFCTEU7CgkJSTkx NV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKCgkJUE9TVElOR19SRUFEKFBDSF9EUkVG X0NPTlRST0wpOwoJCXVkZWxheSgyMDApOwoKCQlpZiAoaGFzX2VkcF9lbmNvZGVyKSB7CgkJCWlm IChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSkgewoJCQkJdGVtcCB8PSBEUkVGX1NTQzFf RU5BQkxFOwoJCQkJSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1wKTsKCgkJCQlQT1NU SU5HX1JFQUQoUENIX0RSRUZfQ09OVFJPTCk7CgkJCQl1ZGVsYXkoMjAwKTsKCQkJfQoJCQl0ZW1w ICY9IH5EUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX01BU0s7CgoJCQkvKiBFbmFibGUgQ1BVIHNvdXJj ZSBvbiBDUFUgYXR0YWNoZWQgZURQICovCgkJCWlmICghaW50ZWxfZW5jb2Rlcl9pc19wY2hfZWRw KCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7CgkJCQlpZiAoaW50ZWxfcGFuZWxfdXNlX3NzYyhk ZXZfcHJpdikpCgkJCQkJdGVtcCB8PSBEUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX0RPV05TUFJFQUQ7 CgkJCQllbHNlCgkJCQkJdGVtcCB8PSBEUkVGX0NQVV9TT1VSQ0VfT1VUUFVUX05PTlNQUkVBRDsK CQkJfSBlbHNlIHsKCQkJCS8qIEVuYWJsZSBTU0Mgb24gUENIIGVEUCBpZiBuZWVkZWQgKi8KCQkJ CWlmIChpbnRlbF9wYW5lbF91c2Vfc3NjKGRldl9wcml2KSkgewoJCQkJCURSTV9FUlJPUigiZW5h YmxpbmcgU1NDIG9uIFBDSFxuIik7CgkJCQkJdGVtcCB8PSBEUkVGX1NVUEVSU1BSRUFEX1NPVVJD RV9FTkFCTEU7CgkJCQl9CgkJCX0KCQkJSTkxNV9XUklURShQQ0hfRFJFRl9DT05UUk9MLCB0ZW1w KTsKCQkJUE9TVElOR19SRUFEKFBDSF9EUkVGX0NPTlRST0wpOwoJCQl1ZGVsYXkoMjAwKTsKCQl9 Cgl9CgoJaWYgKElTX1BJTkVWSUVXKGRldikpIHsKCQlmcCA9ICgxIDw8IGNsb2NrLm4pIDw8IDE2 IHwgY2xvY2subTEgPDwgOCB8IGNsb2NrLm0yOwoJCWlmIChoYXNfcmVkdWNlZF9jbG9jaykKCQkJ ZnAyID0gKDEgPDwgcmVkdWNlZF9jbG9jay5uKSA8PCAxNiB8CgkJCQlyZWR1Y2VkX2Nsb2NrLm0x IDw8IDggfCByZWR1Y2VkX2Nsb2NrLm0yOwoJfSBlbHNlIHsKCQlmcCA9IGNsb2NrLm4gPDwgMTYg fCBjbG9jay5tMSA8PCA4IHwgY2xvY2subTI7CgkJaWYgKGhhc19yZWR1Y2VkX2Nsb2NrKQoJCQlm cDIgPSByZWR1Y2VkX2Nsb2NrLm4gPDwgMTYgfCByZWR1Y2VkX2Nsb2NrLm0xIDw8IDggfAoJCQkJ cmVkdWNlZF9jbG9jay5tMjsKCX0KCgkvKiBFbmFibGUgYXV0b3R1bmluZyBvZiB0aGUgUExMIGNs b2NrIChpZiBwZXJtaXNzaWJsZSkgKi8KCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKCQlpbnQg ZmFjdG9yID0gMjE7CgoJCWlmIChpc19sdmRzKSB7CgkJCWlmICgoaW50ZWxfcGFuZWxfdXNlX3Nz YyhkZXZfcHJpdikgJiYKCQkJICAgICBkZXZfcHJpdi0+bHZkc19zc2NfZnJlcSA9PSAxMDApIHx8 CgkJCSAgICAoSTkxNV9SRUFEKFBDSF9MVkRTKSAmIExWRFNfQ0xLQl9QT1dFUl9NQVNLKSA9PSBM VkRTX0NMS0JfUE9XRVJfVVApCgkJCQlmYWN0b3IgPSAyNTsKCQl9IGVsc2UgaWYgKGlzX3Nkdm8g JiYgaXNfdHYpCgkJCWZhY3RvciA9IDIwOwoKCQlpZiAoY2xvY2subTEgPCBmYWN0b3IgKiBjbG9j ay5uKQoJCQlmcCB8PSBGUF9DQl9UVU5FOwoJfQoKCWRwbGwgPSAwOwoJaWYgKCFIQVNfUENIX1NQ TElUKGRldikpCgkJZHBsbCA9IERQTExfVkdBX01PREVfRElTOwoKCWlmICghSVNfR0VOMihkZXYp KSB7CgkJaWYgKGlzX2x2ZHMpCgkJCWRwbGwgfD0gRFBMTEJfTU9ERV9MVkRTOwoJCWVsc2UKCQkJ ZHBsbCB8PSBEUExMQl9NT0RFX0RBQ19TRVJJQUw7CgkJaWYgKGlzX3Nkdm8pIHsKCQkJaW50IHBp eGVsX211bHRpcGxpZXIgPSBpbnRlbF9tb2RlX2dldF9waXhlbF9tdWx0aXBsaWVyKGFkanVzdGVk X21vZGUpOwoJCQlpZiAocGl4ZWxfbXVsdGlwbGllciA+IDEpIHsKCQkJCWlmIChJU19JOTQ1Ryhk ZXYpIHx8IElTX0k5NDVHTShkZXYpIHx8IElTX0czMyhkZXYpKQoJCQkJCWRwbGwgfD0gKHBpeGVs X211bHRpcGxpZXIgLSAxKSA8PCBTRFZPX01VTFRJUExJRVJfU0hJRlRfSElSRVM7CgkJCQllbHNl IGlmIChIQVNfUENIX1NQTElUKGRldikpCgkJCQkJZHBsbCB8PSAocGl4ZWxfbXVsdGlwbGllciAt IDEpIDw8IFBMTF9SRUZfU0RWT19IRE1JX01VTFRJUExJRVJfU0hJRlQ7CgkJCX0KCQkJZHBsbCB8 PSBEUExMX0RWT19ISUdIX1NQRUVEOwoJCX0KCQlpZiAoaXNfZHAgfHwgaW50ZWxfZW5jb2Rlcl9p c19wY2hfZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKQoJCQlkcGxsIHw9IERQTExfRFZPX0hJ R0hfU1BFRUQ7CgoJCS8qIGNvbXB1dGUgYml0bWFzayBmcm9tIHAxIHZhbHVlICovCgkJaWYgKElT X1BJTkVWSUVXKGRldikpCgkJCWRwbGwgfD0gKDEgPDwgKGNsb2NrLnAxIC0gMSkpIDw8IERQTExf RlBBMDFfUDFfUE9TVF9ESVZfU0hJRlRfUElORVZJRVc7CgkJZWxzZSB7CgkJCWRwbGwgfD0gKDEg PDwgKGNsb2NrLnAxIC0gMSkpIDw8IERQTExfRlBBMDFfUDFfUE9TVF9ESVZfU0hJRlQ7CgkJCS8q IGFsc28gRlBBMSAqLwoJCQlpZiAoSEFTX1BDSF9TUExJVChkZXYpKQoJCQkJZHBsbCB8PSAoMSA8 PCAoY2xvY2sucDEgLSAxKSkgPDwgRFBMTF9GUEExX1AxX1BPU1RfRElWX1NISUZUOwoJCQlpZiAo SVNfRzRYKGRldikgJiYgaGFzX3JlZHVjZWRfY2xvY2spCgkJCQlkcGxsIHw9ICgxIDw8IChyZWR1 Y2VkX2Nsb2NrLnAxIC0gMSkpIDw8IERQTExfRlBBMV9QMV9QT1NUX0RJVl9TSElGVDsKCQl9CgkJ c3dpdGNoIChjbG9jay5wMikgewoJCWNhc2UgNToKCQkJZHBsbCB8PSBEUExMX0RBQ19TRVJJQUxf UDJfQ0xPQ0tfRElWXzU7CgkJCWJyZWFrOwoJCWNhc2UgNzoKCQkJZHBsbCB8PSBEUExMQl9MVkRT X1AyX0NMT0NLX0RJVl83OwoJCQlicmVhazsKCQljYXNlIDEwOgoJCQlkcGxsIHw9IERQTExfREFD X1NFUklBTF9QMl9DTE9DS19ESVZfMTA7CgkJCWJyZWFrOwoJCWNhc2UgMTQ6CgkJCWRwbGwgfD0g RFBMTEJfTFZEU19QMl9DTE9DS19ESVZfMTQ7CgkJCWJyZWFrOwoJCX0KCQlpZiAoSU5URUxfSU5G TyhkZXYpLT5nZW4gPj0gNCAmJiAhSEFTX1BDSF9TUExJVChkZXYpKQoJCQlkcGxsIHw9ICg2IDw8 IFBMTF9MT0FEX1BVTFNFX1BIQVNFX1NISUZUKTsKCX0gZWxzZSB7CgkJaWYgKGlzX2x2ZHMpIHsK CQkJZHBsbCB8PSAoMSA8PCAoY2xvY2sucDEgLSAxKSkgPDwgRFBMTF9GUEEwMV9QMV9QT1NUX0RJ Vl9TSElGVDsKCQl9IGVsc2UgewoJCQlpZiAoY2xvY2sucDEgPT0gMikKCQkJCWRwbGwgfD0gUExM X1AxX0RJVklERV9CWV9UV087CgkJCWVsc2UKCQkJCWRwbGwgfD0gKGNsb2NrLnAxIC0gMikgPDwg RFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9TSElGVDsKCQkJaWYgKGNsb2NrLnAyID09IDQpCgkJCQlk cGxsIHw9IFBMTF9QMl9ESVZJREVfQllfNDsKCQl9Cgl9CgoJaWYgKGlzX3Nkdm8gJiYgaXNfdHYp CgkJZHBsbCB8PSBQTExfUkVGX0lOUFVUX1RWQ0xLSU5CQzsKCWVsc2UgaWYgKGlzX3R2KQoJCS8q IFhYWDoganVzdCBtYXRjaGluZyBCSU9TIGZvciBub3cgKi8KCQkvKglkcGxsIHw9IFBMTF9SRUZf SU5QVVRfVFZDTEtJTkJDOyAqLwoJCWRwbGwgfD0gMzsKCWVsc2UgaWYgKGlzX2x2ZHMgJiYgaW50 ZWxfcGFuZWxfdXNlX3NzYyhkZXZfcHJpdikgJiYgbnVtX2Nvbm5lY3RvcnMgPCAyKQoJCWRwbGwg fD0gUExMQl9SRUZfSU5QVVRfU1BSRUFEU1BFQ1RSVU1JTjsKCWVsc2UKCQlkcGxsIHw9IFBMTF9S RUZfSU5QVVRfRFJFRkNMSzsKCgkvKiBzZXR1cCBwaXBlY29uZiAqLwoJcGlwZWNvbmYgPSBJOTE1 X1JFQUQoUElQRUNPTkYocGlwZSkpOwoKCS8qIFNldCB1cCB0aGUgZGlzcGxheSBwbGFuZSByZWdp c3RlciAqLwoJZHNwY250ciA9IERJU1BQTEFORV9HQU1NQV9FTkFCTEU7CgoJLyogSXJvbmxha2Un cyBwbGFuZSBpcyBmb3JjZWQgdG8gcGlwZSwgYml0IDI0IGlzIHRvCgkgICBlbmFibGUgY29sb3Ig c3BhY2UgY29udmVyc2lvbiAqLwoJaWYgKCFIQVNfUENIX1NQTElUKGRldikpIHsKCQlpZiAocGlw ZSA9PSAwKQoJCQlkc3BjbnRyICY9IH5ESVNQUExBTkVfU0VMX1BJUEVfTUFTSzsKCQllbHNlCgkJ CWRzcGNudHIgfD0gRElTUFBMQU5FX1NFTF9QSVBFX0I7Cgl9CgoJaWYgKHBpcGUgPT0gMCAmJiBJ TlRFTF9JTkZPKGRldiktPmdlbiA8IDQpIHsKCQkvKiBFbmFibGUgcGl4ZWwgZG91Ymxpbmcgd2hl biB0aGUgZG90IGNsb2NrIGlzID4gOTAlIG9mIHRoZSAoZGlzcGxheSkKCQkgKiBjb3JlIHNwZWVk LgoJCSAqCgkJICogWFhYOiBObyBkb3VibGUtd2lkZSBvbiA5MTVHTSBwaXBlIEIuIElzIHRoYXQg dGhlIG9ubHkgcmVhc29uIGZvciB0aGUKCQkgKiBwaXBlID09IDAgY2hlY2s/CgkJICovCgkJaWYg KG1vZGUtPmNsb2NrID4KCQkgICAgZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tf c3BlZWQoZGV2KSAqIDkgLyAxMCkKCQkJcGlwZWNvbmYgfD0gUElQRUNPTkZfRE9VQkxFX1dJREU7 CgkJZWxzZQoJCQlwaXBlY29uZiAmPSB+UElQRUNPTkZfRE9VQkxFX1dJREU7Cgl9CgoJZHNwY250 ciB8PSBESVNQTEFZX1BMQU5FX0VOQUJMRTsKCXBpcGVjb25mIHw9IFBJUEVDT05GX0VOQUJMRTsK CWRwbGwgfD0gRFBMTF9WQ09fRU5BQkxFOwoKCURSTV9ERUJVR19LTVMoIk1vZGUgZm9yIHBpcGUg JWM6XG4iLCBwaXBlID09IDAgPyAnQScgOiAnQicpOwoJZHJtX21vZGVfZGVidWdfcHJpbnRtb2Rl bGluZShtb2RlKTsKCgkvKiBhc3NpZ24gdG8gSXJvbmxha2UgcmVnaXN0ZXJzICovCglpZiAoSEFT X1BDSF9TUExJVChkZXYpKSB7CgkJZnBfcmVnID0gUENIX0ZQMChwaXBlKTsKCQlkcGxsX3JlZyA9 IFBDSF9EUExMKHBpcGUpOwoJfSBlbHNlIHsKCQlmcF9yZWcgPSBGUDAocGlwZSk7CgkJZHBsbF9y ZWcgPSBEUExMKHBpcGUpOwoJfQoKCS8qIFBDSCBlRFAgbmVlZHMgRkRJLCBidXQgQ1BVIGVEUCBk b2VzIG5vdCAqLwoJaWYgKCFoYXNfZWRwX2VuY29kZXIgfHwgaW50ZWxfZW5jb2Rlcl9pc19wY2hf ZWRwKCZoYXNfZWRwX2VuY29kZXItPmJhc2UpKSB7CgkJSTkxNV9XUklURShmcF9yZWcsIGZwKTsK CQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsICYgfkRQTExfVkNPX0VOQUJMRSk7CgoJCVBPU1RJ TkdfUkVBRChkcGxsX3JlZyk7CgkJdWRlbGF5KDE1MCk7Cgl9CgoJLyogZW5hYmxlIHRyYW5zY29k ZXIgRFBMTCAqLwoJaWYgKEhBU19QQ0hfQ1BUKGRldikpIHsKCQl0ZW1wID0gSTkxNV9SRUFEKFBD SF9EUExMX1NFTCk7CgkJaWYgKHBpcGUgPT0gMCkKCQkJdGVtcCB8PSBUUkFOU0FfRFBMTF9FTkFC TEUgfCBUUkFOU0FfRFBMTEFfU0VMOwoJCWVsc2UKCQkJdGVtcCB8PQlUUkFOU0JfRFBMTF9FTkFC TEUgfCBUUkFOU0JfRFBMTEJfU0VMOwoJCUk5MTVfV1JJVEUoUENIX0RQTExfU0VMLCB0ZW1wKTsK CgkJUE9TVElOR19SRUFEKFBDSF9EUExMX1NFTCk7CgkJdWRlbGF5KDE1MCk7Cgl9CgoJLyogVGhl IExWRFMgcGluIHBhaXIgbmVlZHMgdG8gYmUgb24gYmVmb3JlIHRoZSBEUExMcyBhcmUgZW5hYmxl ZC4KCSAqIFRoaXMgaXMgYW4gZXhjZXB0aW9uIHRvIHRoZSBnZW5lcmFsIHJ1bGUgdGhhdCBtb2Rl X3NldCBkb2Vzbid0IHR1cm4KCSAqIHRoaW5ncyBvbi4KCSAqLwoJaWYgKGlzX2x2ZHMpIHsKCQly ZWcgPSBMVkRTOwoJCWlmIChIQVNfUENIX1NQTElUKGRldikpCgkJCXJlZyA9IFBDSF9MVkRTOwoK CQl0ZW1wID0gSTkxNV9SRUFEKHJlZyk7CgkJdGVtcCB8PSBMVkRTX1BPUlRfRU4gfCBMVkRTX0Ew QTJfQ0xLQV9QT1dFUl9VUDsKCQlpZiAocGlwZSA9PSAxKSB7CgkJCWlmIChIQVNfUENIX0NQVChk ZXYpKQoJCQkJdGVtcCB8PSBQT1JUX1RSQU5TX0JfU0VMX0NQVDsKCQkJZWxzZQoJCQkJdGVtcCB8 PSBMVkRTX1BJUEVCX1NFTEVDVDsKCQl9IGVsc2UgewoJCQlpZiAoSEFTX1BDSF9DUFQoZGV2KSkK CQkJCXRlbXAgJj0gflBPUlRfVFJBTlNfU0VMX01BU0s7CgkJCWVsc2UKCQkJCXRlbXAgJj0gfkxW RFNfUElQRUJfU0VMRUNUOwoJCX0KCQkvKiBzZXQgdGhlIGNvcnJlc3BvbnNkaW5nIExWRFNfQk9S REVSIGJpdCAqLwoJCXRlbXAgfD0gZGV2X3ByaXYtPmx2ZHNfYm9yZGVyX2JpdHM7CgkJLyogU2V0 IHRoZSBCMC1CMyBkYXRhIHBhaXJzIGNvcnJlc3BvbmRpbmcgdG8gd2hldGhlciB3ZSdyZSBnb2lu ZyB0bwoJCSAqIHNldCB0aGUgRFBMTHMgZm9yIGR1YWwtY2hhbm5lbCBtb2RlIG9yIG5vdC4KCQkg Ki8KCQlpZiAoY2xvY2sucDIgPT0gNykKCQkJdGVtcCB8PSBMVkRTX0IwQjNfUE9XRVJfVVAgfCBM VkRTX0NMS0JfUE9XRVJfVVA7CgkJZWxzZQoJCQl0ZW1wICY9IH4oTFZEU19CMEIzX1BPV0VSX1VQ IHwgTFZEU19DTEtCX1BPV0VSX1VQKTsKCgkJLyogSXQgd291bGQgYmUgbmljZSB0byBzZXQgMjQg dnMgMTgtYml0IG1vZGUgKExWRFNfQTNfUE9XRVJfVVApCgkJICogYXBwcm9wcmlhdGVseSBoZXJl LCBidXQgd2UgbmVlZCB0byBsb29rIG1vcmUgdGhvcm91Z2hseSBpbnRvIGhvdwoJCSAqIHBhbmVs cyBiZWhhdmUgaW4gdGhlIHR3byBtb2Rlcy4KCQkgKi8KCQkvKiBzZXQgdGhlIGRpdGhlcmluZyBm bGFnIG9uIG5vbi1QQ0ggTFZEUyBhcyBuZWVkZWQgKi8KCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5n ZW4gPj0gNCAmJiAhSEFTX1BDSF9TUExJVChkZXYpKSB7CgkJCWlmIChkZXZfcHJpdi0+bHZkc19k aXRoZXIpCgkJCQl0ZW1wIHw9IExWRFNfRU5BQkxFX0RJVEhFUjsKCQkJZWxzZQoJCQkJdGVtcCAm PSB+TFZEU19FTkFCTEVfRElUSEVSOwoJCX0KCQlJOTE1X1dSSVRFKHJlZywgdGVtcCk7Cgl9CgoJ Lyogc2V0IHRoZSBkaXRoZXJpbmcgZmxhZyBhbmQgY2xlYXIgZm9yIGFueXRoaW5nIG90aGVyIHRo YW4gYSBwYW5lbC4gKi8KCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKCQlwaXBlY29uZiAmPSB+ UElQRUNPTkZfRElUSEVSX0VOOwoJCXBpcGVjb25mICY9IH5QSVBFQ09ORl9ESVRIRVJfVFlQRV9N QVNLOwoJCWlmIChkZXZfcHJpdi0+bHZkc19kaXRoZXIgJiYgKGlzX2x2ZHMgfHwgaGFzX2VkcF9l bmNvZGVyKSkgewoJCQlwaXBlY29uZiB8PSBQSVBFQ09ORl9ESVRIRVJfRU47CgkJCXBpcGVjb25m IHw9IFBJUEVDT05GX0RJVEhFUl9UWVBFX1NUMTsKCQl9Cgl9CgoJaWYgKGlzX2RwIHx8IGludGVs X2VuY29kZXJfaXNfcGNoX2VkcCgmaGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkgewoJCWludGVsX2Rw X3NldF9tX24oY3J0YywgbW9kZSwgYWRqdXN0ZWRfbW9kZSk7Cgl9IGVsc2UgaWYgKEhBU19QQ0hf U1BMSVQoZGV2KSkgewoJCS8qIEZvciBub24tRFAgb3V0cHV0LCBjbGVhciBhbnkgdHJhbnMgRFAg Y2xvY2sgcmVjb3Zlcnkgc2V0dGluZy4qLwoJCWlmIChwaXBlID09IDApIHsKCQkJSTkxNV9XUklU RShUUkFOU0FfREFUQV9NMSwgMCk7CgkJCUk5MTVfV1JJVEUoVFJBTlNBX0RBVEFfTjEsIDApOwoJ CQlJOTE1X1dSSVRFKFRSQU5TQV9EUF9MSU5LX00xLCAwKTsKCQkJSTkxNV9XUklURShUUkFOU0Ff RFBfTElOS19OMSwgMCk7CgkJfSBlbHNlIHsKCQkJSTkxNV9XUklURShUUkFOU0JfREFUQV9NMSwg MCk7CgkJCUk5MTVfV1JJVEUoVFJBTlNCX0RBVEFfTjEsIDApOwoJCQlJOTE1X1dSSVRFKFRSQU5T Ql9EUF9MSU5LX00xLCAwKTsKCQkJSTkxNV9XUklURShUUkFOU0JfRFBfTElOS19OMSwgMCk7CgkJ fQoJfQoKCWlmICghaGFzX2VkcF9lbmNvZGVyIHx8IGludGVsX2VuY29kZXJfaXNfcGNoX2VkcCgm aGFzX2VkcF9lbmNvZGVyLT5iYXNlKSkgewoJCUk5MTVfV1JJVEUoZHBsbF9yZWcsIGRwbGwpOwoK CQkvKiBXYWl0IGZvciB0aGUgY2xvY2tzIHRvIHN0YWJpbGl6ZS4gKi8KCQlQT1NUSU5HX1JFQUQo ZHBsbF9yZWcpOwoJCXVkZWxheSgxNTApOwoKCQlpZiAoSU5URUxfSU5GTyhkZXYpLT5nZW4gPj0g NCAmJiAhSEFTX1BDSF9TUExJVChkZXYpKSB7CgkJCXRlbXAgPSAwOwoJCQlpZiAoaXNfc2R2bykg ewoJCQkJdGVtcCA9IGludGVsX21vZGVfZ2V0X3BpeGVsX211bHRpcGxpZXIoYWRqdXN0ZWRfbW9k ZSk7CgkJCQlpZiAodGVtcCA+IDEpCgkJCQkJdGVtcCA9ICh0ZW1wIC0gMSkgPDwgRFBMTF9NRF9V RElfTVVMVElQTElFUl9TSElGVDsKCQkJCWVsc2UKCQkJCQl0ZW1wID0gMDsKCQkJfQoJCQlJOTE1 X1dSSVRFKERQTExfTUQocGlwZSksIHRlbXApOwoJCX0gZWxzZSB7CgkJCS8qIFRoZSBwaXhlbCBt dWx0aXBsaWVyIGNhbiBvbmx5IGJlIHVwZGF0ZWQgb25jZSB0aGUKCQkJICogRFBMTCBpcyBlbmFi bGVkIGFuZCB0aGUgY2xvY2tzIGFyZSBzdGFibGUuCgkJCSAqCgkJCSAqIFNvIHdyaXRlIGl0IGFn YWluLgoJCQkgKi8KCQkJSTkxNV9XUklURShkcGxsX3JlZywgZHBsbCk7CgkJfQoJfQoKCWludGVs X2NydGMtPmxvd2ZyZXFfYXZhaWwgPSBmYWxzZTsKCWlmIChpc19sdmRzICYmIGhhc19yZWR1Y2Vk X2Nsb2NrICYmIGk5MTVfcG93ZXJzYXZlKSB7CgkJSTkxNV9XUklURShmcF9yZWcgKyA0LCBmcDIp OwoJCWludGVsX2NydGMtPmxvd2ZyZXFfYXZhaWwgPSB0cnVlOwoJCWlmIChIQVNfUElQRV9DWFNS KGRldikpIHsKCQkJRFJNX0RFQlVHX0tNUygiZW5hYmxpbmcgQ3hTUiBkb3duY2xvY2tpbmdcbiIp OwoJCQlwaXBlY29uZiB8PSBQSVBFQ09ORl9DWFNSX0RPV05DTE9DSzsKCQl9Cgl9IGVsc2UgewoJ CUk5MTVfV1JJVEUoZnBfcmVnICsgNCwgZnApOwoJCWlmIChIQVNfUElQRV9DWFNSKGRldikpIHsK CQkJRFJNX0RFQlVHX0tNUygiZGlzYWJsaW5nIEN4U1IgZG93bmNsb2NraW5nXG4iKTsKCQkJcGlw ZWNvbmYgJj0gflBJUEVDT05GX0NYU1JfRE9XTkNMT0NLOwoJCX0KCX0KCglpZiAoYWRqdXN0ZWRf bW9kZS0+ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0lOVEVSTEFDRSkgewoJCXBpcGVjb25mIHw9IFBJ UEVDT05GX0lOVEVSTEFDRV9XX0ZJRUxEX0lORElDQVRJT047CgkJLyogdGhlIGNoaXAgYWRkcyAy IGhhbGZsaW5lcyBhdXRvbWF0aWNhbGx5ICovCgkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y192ZGlzcGxh eSAtPSAxOwoJCWFkanVzdGVkX21vZGUtPmNydGNfdnRvdGFsIC09IDE7CgkJYWRqdXN0ZWRfbW9k ZS0+Y3J0Y192Ymxhbmtfc3RhcnQgLT0gMTsKCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZibGFua19l bmQgLT0gMTsKCQlhZGp1c3RlZF9tb2RlLT5jcnRjX3ZzeW5jX2VuZCAtPSAxOwoJCWFkanVzdGVk X21vZGUtPmNydGNfdnN5bmNfc3RhcnQgLT0gMTsKCX0gZWxzZQoJCXBpcGVjb25mICY9IH5QSVBF Q09ORl9JTlRFUkxBQ0VfV19GSUVMRF9JTkRJQ0FUSU9OOyAvKiBwcm9ncmVzc2l2ZSAqLwoKCUk5 MTVfV1JJVEUoSFRPVEFMKHBpcGUpLAoJCSAgIChhZGp1c3RlZF9tb2RlLT5jcnRjX2hkaXNwbGF5 IC0gMSkgfAoJCSAgICgoYWRqdXN0ZWRfbW9kZS0+Y3J0Y19odG90YWwgLSAxKSA8PCAxNikpOwoJ STkxNV9XUklURShIQkxBTksocGlwZSksCgkJICAgKGFkanVzdGVkX21vZGUtPmNydGNfaGJsYW5r X3N0YXJ0IC0gMSkgfAoJCSAgICgoYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oYmxhbmtfZW5kIC0gMSkg PDwgMTYpKTsKCUk5MTVfV1JJVEUoSFNZTkMocGlwZSksCgkJICAgKGFkanVzdGVkX21vZGUtPmNy dGNfaHN5bmNfc3RhcnQgLSAxKSB8CgkJICAgKChhZGp1c3RlZF9tb2RlLT5jcnRjX2hzeW5jX2Vu ZCAtIDEpIDw8IDE2KSk7CgoJSTkxNV9XUklURShWVE9UQUwocGlwZSksCgkJICAgKGFkanVzdGVk X21vZGUtPmNydGNfdmRpc3BsYXkgLSAxKSB8CgkJICAgKChhZGp1c3RlZF9tb2RlLT5jcnRjX3Z0 b3RhbCAtIDEpIDw8IDE2KSk7CglJOTE1X1dSSVRFKFZCTEFOSyhwaXBlKSwKCQkgICAoYWRqdXN0 ZWRfbW9kZS0+Y3J0Y192Ymxhbmtfc3RhcnQgLSAxKSB8CgkJICAgKChhZGp1c3RlZF9tb2RlLT5j cnRjX3ZibGFua19lbmQgLSAxKSA8PCAxNikpOwoJSTkxNV9XUklURShWU1lOQyhwaXBlKSwKCQkg ICAoYWRqdXN0ZWRfbW9kZS0+Y3J0Y192c3luY19zdGFydCAtIDEpIHwKCQkgICAoKGFkanVzdGVk X21vZGUtPmNydGNfdnN5bmNfZW5kIC0gMSkgPDwgMTYpKTsKCgkvKiBwaXBlc3JjIGFuZCBkc3Bz aXplIGNvbnRyb2wgdGhlIHNpemUgdGhhdCBpcyBzY2FsZWQgZnJvbSwKCSAqIHdoaWNoIHNob3Vs ZCBhbHdheXMgYmUgdGhlIHVzZXIncyByZXF1ZXN0ZWQgc2l6ZS4KCSAqLwoJaWYgKCFIQVNfUENI X1NQTElUKGRldikpIHsKCQlJOTE1X1dSSVRFKERTUFNJWkUocGxhbmUpLAoJCQkgICAoKG1vZGUt PnZkaXNwbGF5IC0gMSkgPDwgMTYpIHwKCQkJICAgKG1vZGUtPmhkaXNwbGF5IC0gMSkpOwoJCUk5 MTVfV1JJVEUoRFNQUE9TKHBsYW5lKSwgMCk7Cgl9CglJOTE1X1dSSVRFKFBJUEVTUkMocGlwZSks CgkJICAgKChtb2RlLT5oZGlzcGxheSAtIDEpIDw8IDE2KSB8IChtb2RlLT52ZGlzcGxheSAtIDEp KTsKCglpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CgkJSTkxNV9XUklURShQSVBFX0RBVEFfTTEo cGlwZSksIFRVX1NJWkUobV9uLnR1KSB8IG1fbi5nbWNoX20pOwoJCUk5MTVfV1JJVEUoUElQRV9E QVRBX04xKHBpcGUpLCBtX24uZ21jaF9uKTsKCQlJOTE1X1dSSVRFKFBJUEVfTElOS19NMShwaXBl KSwgbV9uLmxpbmtfbSk7CgkJSTkxNV9XUklURShQSVBFX0xJTktfTjEocGlwZSksIG1fbi5saW5r X24pOwoKCQlpZiAoaGFzX2VkcF9lbmNvZGVyICYmICFpbnRlbF9lbmNvZGVyX2lzX3BjaF9lZHAo Jmhhc19lZHBfZW5jb2Rlci0+YmFzZSkpIHsKCQkJaXJvbmxha2Vfc2V0X3BsbF9lZHAoY3J0Yywg YWRqdXN0ZWRfbW9kZS0+Y2xvY2spOwoJCX0KCX0KCglJOTE1X1dSSVRFKFBJUEVDT05GKHBpcGUp LCBwaXBlY29uZik7CglQT1NUSU5HX1JFQUQoUElQRUNPTkYocGlwZSkpOwoKCWludGVsX3dhaXRf Zm9yX3ZibGFuayhkZXYsIHBpcGUpOwoKCWlmIChJU19HRU41KGRldikpIHsKCQkvKiBlbmFibGUg YWRkcmVzcyBzd2l6emxlIGZvciB0aWxpbmcgYnVmZmVyICovCgkJdGVtcCA9IEk5MTVfUkVBRChE SVNQX0FSQl9DVEwpOwoJCUk5MTVfV1JJVEUoRElTUF9BUkJfQ1RMLCB0ZW1wIHwgRElTUF9USUxF X1NVUkZBQ0VfU1dJWlpMSU5HKTsKCX0KCglJOTE1X1dSSVRFKERTUENOVFIocGxhbmUpLCBkc3Bj bnRyKTsKCglyZXQgPSBpbnRlbF9waXBlX3NldF9iYXNlKGNydGMsIHgsIHksIG9sZF9mYik7CgoJ aW50ZWxfdXBkYXRlX3dhdGVybWFya3MoZGV2KTsKCglkcm1fdmJsYW5rX3Bvc3RfbW9kZXNldChk ZXYsIHBpcGUpOwoKCXJldHVybiByZXQ7Cn0KCi8qKiBMb2FkcyB0aGUgcGFsZXR0ZS9nYW1tYSB1 bml0IGZvciB0aGUgQ1JUQyB3aXRoIHRoZSBwcmVwYXJlZCB2YWx1ZXMgKi8Kdm9pZCBpbnRlbF9j cnRjX2xvYWRfbHV0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJc3RydWN0IGRybV9kZXZpY2Ug KmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRl di0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVs X2NydGMoY3J0Yyk7CglpbnQgcGFscmVnID0gKGludGVsX2NydGMtPnBpcGUgPT0gMCkgPyBQQUxF VFRFX0EgOiBQQUxFVFRFX0I7CglpbnQgaTsKCgkvKiBUaGUgY2xvY2tzIGhhdmUgdG8gYmUgb24g dG8gbG9hZCB0aGUgcGFsZXR0ZS4gKi8KCWlmICghY3J0Yy0+ZW5hYmxlZCkKCQlyZXR1cm47CgoJ LyogdXNlIGxlZ2FjeSBwYWxldHRlIGZvciBJcm9ubGFrZSAqLwoJaWYgKEhBU19QQ0hfU1BMSVQo ZGV2KSkKCQlwYWxyZWcgPSAoaW50ZWxfY3J0Yy0+cGlwZSA9PSAwKSA/IExHQ19QQUxFVFRFX0Eg OgoJCQkJCQkgICBMR0NfUEFMRVRURV9COwoKCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJ CUk5MTVfV1JJVEUocGFscmVnICsgNCAqIGksCgkJCSAgIChpbnRlbF9jcnRjLT5sdXRfcltpXSA8 PCAxNikgfAoJCQkgICAoaW50ZWxfY3J0Yy0+bHV0X2dbaV0gPDwgOCkgfAoJCQkgICBpbnRlbF9j cnRjLT5sdXRfYltpXSk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGk4NDVfdXBkYXRlX2N1cnNvcihzdHJ1 Y3QgZHJtX2NydGMgKmNydGMsIHUzMiBiYXNlKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g Y3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZf cHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0Yyhj cnRjKTsKCWJvb2wgdmlzaWJsZSA9IGJhc2UgIT0gMDsKCXUzMiBjbnRsOwoKCWlmIChpbnRlbF9j cnRjLT5jdXJzb3JfdmlzaWJsZSA9PSB2aXNpYmxlKQoJCXJldHVybjsKCgljbnRsID0gSTkxNV9S RUFEKENVUkFDTlRSKTsKCWlmICh2aXNpYmxlKSB7CgkJLyogT24gdGhlc2UgY2hpcHNldHMgd2Ug Y2FuIG9ubHkgbW9kaWZ5IHRoZSBiYXNlIHdoaWxzdAoJCSAqIHRoZSBjdXJzb3IgaXMgZGlzYWJs ZWQuCgkJICovCgkJSTkxNV9XUklURShDVVJBQkFTRSwgYmFzZSk7CgoJCWNudGwgJj0gfihDVVJT T1JfRk9STUFUX01BU0spOwoJCS8qIFhYWCB3aWR0aCBtdXN0IGJlIDY0LCBzdHJpZGUgMjU2ID0+ IDB4MDAgPDwgMjggKi8KCQljbnRsIHw9IENVUlNPUl9FTkFCTEUgfAoJCQlDVVJTT1JfR0FNTUFf RU5BQkxFIHwKCQkJQ1VSU09SX0ZPUk1BVF9BUkdCOwoJfSBlbHNlCgkJY250bCAmPSB+KENVUlNP Ul9FTkFCTEUgfCBDVVJTT1JfR0FNTUFfRU5BQkxFKTsKCUk5MTVfV1JJVEUoQ1VSQUNOVFIsIGNu dGwpOwoKCWludGVsX2NydGMtPmN1cnNvcl92aXNpYmxlID0gdmlzaWJsZTsKfQoKc3RhdGljIHZv aWQgaTl4eF91cGRhdGVfY3Vyc29yKHN0cnVjdCBkcm1fY3J0YyAqY3J0YywgdTMyIGJhc2UpCnsK CXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7CglzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGludGVsX2NydGMgKmlu dGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5w aXBlOwoJYm9vbCB2aXNpYmxlID0gYmFzZSAhPSAwOwoKCWlmIChpbnRlbF9jcnRjLT5jdXJzb3Jf dmlzaWJsZSAhPSB2aXNpYmxlKSB7CgkJdWludDMyX3QgY250bCA9IEk5MTVfUkVBRChwaXBlID09 IDAgPyBDVVJBQ05UUiA6IENVUkJDTlRSKTsKCQlpZiAoYmFzZSkgewoJCQljbnRsICY9IH4oQ1VS U09SX01PREUgfCBNQ1VSU09SX1BJUEVfU0VMRUNUKTsKCQkJY250bCB8PSBDVVJTT1JfTU9ERV82 NF9BUkdCX0FYIHwgTUNVUlNPUl9HQU1NQV9FTkFCTEU7CgkJCWNudGwgfD0gcGlwZSA8PCAyODsg LyogQ29ubmVjdCB0byBjb3JyZWN0IHBpcGUgKi8KCQl9IGVsc2UgewoJCQljbnRsICY9IH4oQ1VS U09SX01PREUgfCBNQ1VSU09SX0dBTU1BX0VOQUJMRSk7CgkJCWNudGwgfD0gQ1VSU09SX01PREVf RElTQUJMRTsKCQl9CgkJSTkxNV9XUklURShwaXBlID09IDAgPyBDVVJBQ05UUiA6IENVUkJDTlRS LCBjbnRsKTsKCgkJaW50ZWxfY3J0Yy0+Y3Vyc29yX3Zpc2libGUgPSB2aXNpYmxlOwoJfQoJLyog YW5kIGNvbW1pdCBjaGFuZ2VzIG9uIG5leHQgdmJsYW5rICovCglJOTE1X1dSSVRFKHBpcGUgPT0g MCA/IENVUkFCQVNFIDogQ1VSQkJBU0UsIGJhc2UpOwp9CgovKiBJZiBuby1wYXJ0IG9mIHRoZSBj dXJzb3IgaXMgdmlzaWJsZSBvbiB0aGUgZnJhbWVidWZmZXIsIHRoZW4gdGhlIEdQVSBtYXkgaGFu Zy4uLiAqLwpzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX3VwZGF0ZV9jdXJzb3Ioc3RydWN0IGRybV9j cnRjICpjcnRjLAoJCQkJICAgICBib29sIG9uKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0g Y3J0Yy0+ZGV2OwoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZf cHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0Yyhj cnRjKTsKCWludCBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKCWludCB4ID0gaW50ZWxfY3J0Yy0+ Y3Vyc29yX3g7CglpbnQgeSA9IGludGVsX2NydGMtPmN1cnNvcl95OwoJdTMyIGJhc2UsIHBvczsK CWJvb2wgdmlzaWJsZTsKCglwb3MgPSAwOwoKCWlmIChvbiAmJiBjcnRjLT5lbmFibGVkICYmIGNy dGMtPmZiKSB7CgkJYmFzZSA9IGludGVsX2NydGMtPmN1cnNvcl9hZGRyOwoJCWlmICh4ID4gKGlu dCkgY3J0Yy0+ZmItPndpZHRoKQoJCQliYXNlID0gMDsKCgkJaWYgKHkgPiAoaW50KSBjcnRjLT5m Yi0+aGVpZ2h0KQoJCQliYXNlID0gMDsKCX0gZWxzZQoJCWJhc2UgPSAwOwoKCWlmICh4IDwgMCkg ewoJCWlmICh4ICsgaW50ZWxfY3J0Yy0+Y3Vyc29yX3dpZHRoIDwgMCkKCQkJYmFzZSA9IDA7CgoJ CXBvcyB8PSBDVVJTT1JfUE9TX1NJR04gPDwgQ1VSU09SX1hfU0hJRlQ7CgkJeCA9IC14OwoJfQoJ cG9zIHw9IHggPDwgQ1VSU09SX1hfU0hJRlQ7CgoJaWYgKHkgPCAwKSB7CgkJaWYgKHkgKyBpbnRl bF9jcnRjLT5jdXJzb3JfaGVpZ2h0IDwgMCkKCQkJYmFzZSA9IDA7CgoJCXBvcyB8PSBDVVJTT1Jf UE9TX1NJR04gPDwgQ1VSU09SX1lfU0hJRlQ7CgkJeSA9IC15OwoJfQoJcG9zIHw9IHkgPDwgQ1VS U09SX1lfU0hJRlQ7CgoJdmlzaWJsZSA9IGJhc2UgIT0gMDsKCWlmICghdmlzaWJsZSAmJiAhaW50 ZWxfY3J0Yy0+Y3Vyc29yX3Zpc2libGUpCgkJcmV0dXJuOwoKCUk5MTVfV1JJVEUocGlwZSA9PSAw ID8gQ1VSQVBPUyA6IENVUkJQT1MsIHBvcyk7CglpZiAoSVNfODQ1RyhkZXYpIHx8IElTX0k4NjVH KGRldikpCgkJaTg0NV91cGRhdGVfY3Vyc29yKGNydGMsIGJhc2UpOwoJZWxzZQoJCWk5eHhfdXBk YXRlX2N1cnNvcihjcnRjLCBiYXNlKTsKCglpZiAodmlzaWJsZSkKCQlpbnRlbF9tYXJrX2J1c3ko ZGV2LCB0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYiktPm9iaik7Cn0KCnN0YXRpYyBpbnQg aW50ZWxfY3J0Y19jdXJzb3Jfc2V0KHN0cnVjdCBkcm1fY3J0YyAqY3J0YywKCQkJCSBzdHJ1Y3Qg ZHJtX2ZpbGUgKmZpbGUsCgkJCQkgdWludDMyX3QgaGFuZGxlLAoJCQkJIHVpbnQzMl90IHdpZHRo LCB1aW50MzJfdCBoZWlnaHQpCnsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7 CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJ c3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKCXVpbnQzMl90IGFkZHI7CglpbnQgcmV0OwoK CURSTV9ERUJVR19LTVMoIlxuIik7CgoJLyogaWYgd2Ugd2FudCB0byB0dXJuIG9mZiB0aGUgY3Vy c29yIGlnbm9yZSB3aWR0aCBhbmQgaGVpZ2h0ICovCglpZiAoIWhhbmRsZSkgewoJCURSTV9ERUJV R19LTVMoImN1cnNvciBvZmZcbiIpOwoJCWFkZHIgPSAwOwoJCW9iaiA9IE5VTEw7CgkJbXV0ZXhf bG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJCWdvdG8gZmluaXNoOwoJfQoKCS8qIEN1cnJlbnRs eSB3ZSBvbmx5IHN1cHBvcnQgNjR4NjQgY3Vyc29ycyAqLwoJaWYgKHdpZHRoICE9IDY0IHx8IGhl aWdodCAhPSA2NCkgewoJCURSTV9FUlJPUigid2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCA2NHg2 NCBjdXJzb3JzXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglvYmogPSB0b19pbnRlbF9ibyhk cm1fZ2VtX29iamVjdF9sb29rdXAoZGV2LCBmaWxlLCBoYW5kbGUpKTsKCWlmICghb2JqKQoJCXJl dHVybiAtRU5PRU5UOwoKCWlmIChvYmotPmJhc2Uuc2l6ZSA8IHdpZHRoICogaGVpZ2h0ICogNCkg ewoJCURSTV9FUlJPUigiYnVmZmVyIGlzIHRvIHNtYWxsXG4iKTsKCQlyZXQgPSAtRU5PTUVNOwoJ CWdvdG8gZmFpbDsKCX0KCgkvKiB3ZSBvbmx5IG5lZWQgdG8gcGluIGluc2lkZSBHVFQgaWYgY3Vy c29yIGlzIG5vbi1waHkgKi8KCW11dGV4X2xvY2soJmRldi0+c3RydWN0X211dGV4KTsKCWlmICgh ZGV2X3ByaXYtPmluZm8tPmN1cnNvcl9uZWVkc19waHlzaWNhbCkgewoJCWlmIChvYmotPnRpbGlu Z19tb2RlKSB7CgkJCURSTV9FUlJPUigiY3Vyc29yIGNhbm5vdCBiZSB0aWxlZFxuIik7CgkJCXJl dCA9IC1FSU5WQUw7CgkJCWdvdG8gZmFpbF9sb2NrZWQ7CgkJfQoKCQlyZXQgPSBpOTE1X2dlbV9v YmplY3RfcGluKG9iaiwgUEFHRV9TSVpFLCB0cnVlKTsKCQlpZiAocmV0KSB7CgkJCURSTV9FUlJP UigiZmFpbGVkIHRvIHBpbiBjdXJzb3IgYm9cbiIpOwoJCQlnb3RvIGZhaWxfbG9ja2VkOwoJCX0K CgkJcmV0ID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKG9iaiwgMCk7CgkJaWYg KHJldCkgewoJCQlEUk1fRVJST1IoImZhaWxlZCB0byBtb3ZlIGN1cnNvciBibyBpbnRvIHRoZSBH VFRcbiIpOwoJCQlnb3RvIGZhaWxfdW5waW47CgkJfQoKCQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rf cHV0X2ZlbmNlKG9iaik7CgkJaWYgKHJldCkgewoJCQlEUk1fRVJST1IoImZhaWxlZCB0byBtb3Zl IGN1cnNvciBibyBpbnRvIHRoZSBHVFRcbiIpOwoJCQlnb3RvIGZhaWxfdW5waW47CgkJfQoKCQlh ZGRyID0gb2JqLT5ndHRfb2Zmc2V0OwoJfSBlbHNlIHsKCQlpbnQgYWxpZ24gPSBJU19JODMwKGRl dikgPyAxNiAqIDEwMjQgOiAyNTY7CgkJcmV0ID0gaTkxNV9nZW1fYXR0YWNoX3BoeXNfb2JqZWN0 KGRldiwgb2JqLAoJCQkJCQkgIChpbnRlbF9jcnRjLT5waXBlID09IDApID8gSTkxNV9HRU1fUEhZ U19DVVJTT1JfMCA6IEk5MTVfR0VNX1BIWVNfQ1VSU09SXzEsCgkJCQkJCSAgYWxpZ24pOwoJCWlm IChyZXQpIHsKCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gYXR0YWNoIHBoeXMgb2JqZWN0XG4iKTsK CQkJZ290byBmYWlsX2xvY2tlZDsKCQl9CgkJYWRkciA9IG9iai0+cGh5c19vYmotPmhhbmRsZS0+ YnVzYWRkcjsKCX0KCglpZiAoSVNfR0VOMihkZXYpKQoJCUk5MTVfV1JJVEUoQ1VSU0laRSwgKGhl aWdodCA8PCAxMikgfCB3aWR0aCk7CgogZmluaXNoOgoJaWYgKGludGVsX2NydGMtPmN1cnNvcl9i bykgewoJCWlmIChkZXZfcHJpdi0+aW5mby0+Y3Vyc29yX25lZWRzX3BoeXNpY2FsKSB7CgkJCWlm IChpbnRlbF9jcnRjLT5jdXJzb3JfYm8gIT0gb2JqKQoJCQkJaTkxNV9nZW1fZGV0YWNoX3BoeXNf b2JqZWN0KGRldiwgaW50ZWxfY3J0Yy0+Y3Vyc29yX2JvKTsKCQl9IGVsc2UKCQkJaTkxNV9nZW1f b2JqZWN0X3VucGluKGludGVsX2NydGMtPmN1cnNvcl9ibyk7CgkJZHJtX2dlbV9vYmplY3RfdW5y ZWZlcmVuY2UoJmludGVsX2NydGMtPmN1cnNvcl9iby0+YmFzZSk7Cgl9CgoJbXV0ZXhfdW5sb2Nr KCZkZXYtPnN0cnVjdF9tdXRleCk7CgoJaW50ZWxfY3J0Yy0+Y3Vyc29yX2FkZHIgPSBhZGRyOwoJ aW50ZWxfY3J0Yy0+Y3Vyc29yX2JvID0gb2JqOwoJaW50ZWxfY3J0Yy0+Y3Vyc29yX3dpZHRoID0g d2lkdGg7CglpbnRlbF9jcnRjLT5jdXJzb3JfaGVpZ2h0ID0gaGVpZ2h0OwoKCWludGVsX2NydGNf dXBkYXRlX2N1cnNvcihjcnRjLCB0cnVlKTsKCglyZXR1cm4gMDsKZmFpbF91bnBpbjoKCWk5MTVf Z2VtX29iamVjdF91bnBpbihvYmopOwpmYWlsX2xvY2tlZDoKCW11dGV4X3VubG9jaygmZGV2LT5z dHJ1Y3RfbXV0ZXgpOwpmYWlsOgoJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQo Jm9iai0+YmFzZSk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGludGVsX2NydGNfY3Vyc29y X21vdmUoc3RydWN0IGRybV9jcnRjICpjcnRjLCBpbnQgeCwgaW50IHkpCnsKCXN0cnVjdCBpbnRl bF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCglpbnRlbF9jcnRjLT5j dXJzb3JfeCA9IHg7CglpbnRlbF9jcnRjLT5jdXJzb3JfeSA9IHk7CgoJaW50ZWxfY3J0Y191cGRh dGVfY3Vyc29yKGNydGMsIHRydWUpOwoKCXJldHVybiAwOwp9CgovKiogU2V0cyB0aGUgY29sb3Ig cmFtcHMgb24gYmVoYWxmIG9mIFJhbmRSICovCnZvaWQgaW50ZWxfY3J0Y19mYl9nYW1tYV9zZXQo c3RydWN0IGRybV9jcnRjICpjcnRjLCB1MTYgcmVkLCB1MTYgZ3JlZW4sCgkJCQkgdTE2IGJsdWUs IGludCByZWdubykKewoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9j cnRjKGNydGMpOwoKCWludGVsX2NydGMtPmx1dF9yW3JlZ25vXSA9IHJlZCA+PiA4OwoJaW50ZWxf Y3J0Yy0+bHV0X2dbcmVnbm9dID0gZ3JlZW4gPj4gODsKCWludGVsX2NydGMtPmx1dF9iW3JlZ25v XSA9IGJsdWUgPj4gODsKfQoKdm9pZCBpbnRlbF9jcnRjX2ZiX2dhbW1hX2dldChzdHJ1Y3QgZHJt X2NydGMgKmNydGMsIHUxNiAqcmVkLCB1MTYgKmdyZWVuLAoJCQkgICAgIHUxNiAqYmx1ZSwgaW50 IHJlZ25vKQp7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMo Y3J0Yyk7CgoJKnJlZCA9IGludGVsX2NydGMtPmx1dF9yW3JlZ25vXSA8PCA4OwoJKmdyZWVuID0g aW50ZWxfY3J0Yy0+bHV0X2dbcmVnbm9dIDw8IDg7CgkqYmx1ZSA9IGludGVsX2NydGMtPmx1dF9i W3JlZ25vXSA8PCA4Owp9CgpzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX2dhbW1hX3NldChzdHJ1Y3Qg ZHJtX2NydGMgKmNydGMsIHUxNiAqcmVkLCB1MTYgKmdyZWVuLAoJCQkJIHUxNiAqYmx1ZSwgdWlu dDMyX3Qgc3RhcnQsIHVpbnQzMl90IHNpemUpCnsKCWludCBlbmQgPSAoc3RhcnQgKyBzaXplID4g MjU2KSA/IDI1NiA6IHN0YXJ0ICsgc2l6ZSwgaTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9j cnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCglmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSsr KSB7CgkJaW50ZWxfY3J0Yy0+bHV0X3JbaV0gPSByZWRbaV0gPj4gODsKCQlpbnRlbF9jcnRjLT5s dXRfZ1tpXSA9IGdyZWVuW2ldID4+IDg7CgkJaW50ZWxfY3J0Yy0+bHV0X2JbaV0gPSBibHVlW2ld ID4+IDg7Cgl9CgoJaW50ZWxfY3J0Y19sb2FkX2x1dChjcnRjKTsKfQoKLyoqCiAqIEdldCBhIHBp cGUgd2l0aCBhIHNpbXBsZSBtb2RlIHNldCBvbiBpdCBmb3IgZG9pbmcgbG9hZC1iYXNlZCBtb25p dG9yCiAqIGRldGVjdGlvbi4KICoKICogSXQgd2lsbCBiZSB1cCB0byB0aGUgbG9hZC1kZXRlY3Qg Y29kZSB0byBhZGp1c3QgdGhlIHBpcGUgYXMgYXBwcm9wcmlhdGUgZm9yCiAqIGl0cyByZXF1aXJl bWVudHMuICBUaGUgcGlwZSB3aWxsIGJlIGNvbm5lY3RlZCB0byBubyBvdGhlciBlbmNvZGVycy4K ICoKICogQ3VycmVudGx5IHRoaXMgY29kZSB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGVyZSBpcyBh IHBpcGUgd2l0aCBubyBlbmNvZGVycwogKiBjb25maWd1cmVkIGZvciBpdC4gIEluIHRoZSBmdXR1 cmUsIGl0IGNvdWxkIGNob29zZSB0byB0ZW1wb3JhcmlseSBkaXNhYmxlCiAqIHNvbWUgb3V0cHV0 cyB0byBmcmVlIHVwIGEgcGlwZSBmb3IgaXRzIHVzZS4KICoKICogXHJldHVybiBjcnRjLCBvciBO VUxMIGlmIG5vIHBpcGVzIGFyZSBhdmFpbGFibGUuCiAqLwoKLyogVkVTQSA2NDB4NDgweDcySHog bW9kZSB0byBzZXQgb24gdGhlIHBpcGUgKi8Kc3RhdGljIHN0cnVjdCBkcm1fZGlzcGxheV9tb2Rl IGxvYWRfZGV0ZWN0X21vZGUgPSB7CglEUk1fTU9ERSgiNjQweDQ4MCIsIERSTV9NT0RFX1RZUEVf REVGQVVMVCwgMzE1MDAsIDY0MCwgNjY0LAoJCSA3MDQsIDgzMiwgMCwgNDgwLCA0ODksIDQ5MSwg NTIwLCAwLCBEUk1fTU9ERV9GTEFHX05IU1lOQyB8IERSTV9NT0RFX0ZMQUdfTlZTWU5DKSwKfTsK CnN0cnVjdCBkcm1fY3J0YyAqaW50ZWxfZ2V0X2xvYWRfZGV0ZWN0X3BpcGUoc3RydWN0IGludGVs X2VuY29kZXIgKmludGVsX2VuY29kZXIsCgkJCQkJICAgIHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IsCgkJCQkJICAgIHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICptb2RlLAoJCQkJCSAg ICBpbnQgKmRwbXNfbW9kZSkKewoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CglzdHJ1 Y3QgZHJtX2NydGMgKnBvc3NpYmxlX2NydGM7CglzdHJ1Y3QgZHJtX2NydGMgKnN1cHBvcnRlZF9j cnRjID1OVUxMOwoJc3RydWN0IGRybV9lbmNvZGVyICplbmNvZGVyID0gJmludGVsX2VuY29kZXIt PmJhc2U7CglzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBOVUxMOwoJc3RydWN0IGRybV9kZXZpY2Ug KmRldiA9IGVuY29kZXItPmRldjsKCXN0cnVjdCBkcm1fZW5jb2Rlcl9oZWxwZXJfZnVuY3MgKmVu Y29kZXJfZnVuY3MgPSBlbmNvZGVyLT5oZWxwZXJfcHJpdmF0ZTsKCXN0cnVjdCBkcm1fY3J0Y19o ZWxwZXJfZnVuY3MgKmNydGNfZnVuY3M7CglpbnQgaSA9IC0xOwoKCS8qCgkgKiBBbGdvcml0aG0g Z2V0cyBhIGxpdHRsZSBtZXNzeToKCSAqICAgLSBpZiB0aGUgY29ubmVjdG9yIGFscmVhZHkgaGFz IGFuIGFzc2lnbmVkIGNydGMsIHVzZSBpdCAoYnV0IG1ha2UKCSAqICAgICBzdXJlIGl0J3Mgb24g Zmlyc3QpCgkgKiAgIC0gdHJ5IHRvIGZpbmQgdGhlIGZpcnN0IHVudXNlZCBjcnRjIHRoYXQgY2Fu IGRyaXZlIHRoaXMgY29ubmVjdG9yLAoJICogICAgIGFuZCB1c2UgdGhhdCBpZiB3ZSBmaW5kIG9u ZQoJICogICAtIGlmIHRoZXJlIGFyZSBubyB1bnVzZWQgY3J0Y3MgYXZhaWxhYmxlLCB0cnkgdG8g dXNlIHRoZSBmaXJzdAoJICogICAgIG9uZSB3ZSBmb3VuZCB0aGF0IHN1cHBvcnRzIHRoZSBjb25u ZWN0b3IKCSAqLwoKCS8qIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBDUlRDIGZvciB0aGlzIGNv bm5lY3RvciAqLwoJaWYgKGVuY29kZXItPmNydGMpIHsKCQljcnRjID0gZW5jb2Rlci0+Y3J0YzsK CQkvKiBNYWtlIHN1cmUgdGhlIGNydGMgYW5kIGNvbm5lY3RvciBhcmUgcnVubmluZyAqLwoJCWlu dGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJCSpkcG1zX21vZGUgPSBpbnRlbF9jcnRj LT5kcG1zX21vZGU7CgkJaWYgKGludGVsX2NydGMtPmRwbXNfbW9kZSAhPSBEUk1fTU9ERV9EUE1T X09OKSB7CgkJCWNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKCQkJY3J0Y19mdW5j cy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKCQkJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhl bmNvZGVyLCBEUk1fTU9ERV9EUE1TX09OKTsKCQl9CgkJcmV0dXJuIGNydGM7Cgl9CgoJLyogRmlu ZCBhbiB1bnVzZWQgb25lIChpZiBwb3NzaWJsZSkgKi8KCWxpc3RfZm9yX2VhY2hfZW50cnkocG9z c2libGVfY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7CgkJaSsrOwoJ CWlmICghKGVuY29kZXItPnBvc3NpYmxlX2NydGNzICYgKDEgPDwgaSkpKQoJCQljb250aW51ZTsK CQlpZiAoIXBvc3NpYmxlX2NydGMtPmVuYWJsZWQpIHsKCQkJY3J0YyA9IHBvc3NpYmxlX2NydGM7 CgkJCWJyZWFrOwoJCX0KCQlpZiAoIXN1cHBvcnRlZF9jcnRjKQoJCQlzdXBwb3J0ZWRfY3J0YyA9 IHBvc3NpYmxlX2NydGM7Cgl9CgoJLyoKCSAqIElmIHdlIGRpZG4ndCBmaW5kIGFuIHVudXNlZCBD UlRDLCBkb24ndCB1c2UgYW55LgoJICovCglpZiAoIWNydGMpIHsKCQlyZXR1cm4gTlVMTDsKCX0K CgllbmNvZGVyLT5jcnRjID0gY3J0YzsKCWNvbm5lY3Rvci0+ZW5jb2RlciA9IGVuY29kZXI7Cglp bnRlbF9lbmNvZGVyLT5sb2FkX2RldGVjdF90ZW1wID0gdHJ1ZTsKCglpbnRlbF9jcnRjID0gdG9f aW50ZWxfY3J0YyhjcnRjKTsKCSpkcG1zX21vZGUgPSBpbnRlbF9jcnRjLT5kcG1zX21vZGU7CgoJ aWYgKCFjcnRjLT5lbmFibGVkKSB7CgkJaWYgKCFtb2RlKQoJCQltb2RlID0gJmxvYWRfZGV0ZWN0 X21vZGU7CgkJZHJtX2NydGNfaGVscGVyX3NldF9tb2RlKGNydGMsIG1vZGUsIDAsIDAsIGNydGMt PmZiKTsKCX0gZWxzZSB7CgkJaWYgKGludGVsX2NydGMtPmRwbXNfbW9kZSAhPSBEUk1fTU9ERV9E UE1TX09OKSB7CgkJCWNydGNfZnVuY3MgPSBjcnRjLT5oZWxwZXJfcHJpdmF0ZTsKCQkJY3J0Y19m dW5jcy0+ZHBtcyhjcnRjLCBEUk1fTU9ERV9EUE1TX09OKTsKCQl9CgoJCS8qIEFkZCB0aGlzIGNv bm5lY3RvciB0byB0aGUgY3J0YyAqLwoJCWVuY29kZXJfZnVuY3MtPm1vZGVfc2V0KGVuY29kZXIs ICZjcnRjLT5tb2RlLCAmY3J0Yy0+bW9kZSk7CgkJZW5jb2Rlcl9mdW5jcy0+Y29tbWl0KGVuY29k ZXIpOwoJfQoJLyogbGV0IHRoZSBjb25uZWN0b3IgZ2V0IHRocm91Z2ggb25lIGZ1bGwgY3ljbGUg YmVmb3JlIHRlc3RpbmcgKi8KCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYsIGludGVsX2NydGMt PnBpcGUpOwoKCXJldHVybiBjcnRjOwp9Cgp2b2lkIGludGVsX3JlbGVhc2VfbG9hZF9kZXRlY3Rf cGlwZShzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqaW50ZWxfZW5jb2RlciwKCQkJCSAgICBzdHJ1Y3Qg ZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yLCBpbnQgZHBtc19tb2RlKQp7CglzdHJ1Y3QgZHJtX2Vu Y29kZXIgKmVuY29kZXIgPSAmaW50ZWxfZW5jb2Rlci0+YmFzZTsKCXN0cnVjdCBkcm1fZGV2aWNl ICpkZXYgPSBlbmNvZGVyLT5kZXY7CglzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBlbmNvZGVyLT5j cnRjOwoJc3RydWN0IGRybV9lbmNvZGVyX2hlbHBlcl9mdW5jcyAqZW5jb2Rlcl9mdW5jcyA9IGVu Y29kZXItPmhlbHBlcl9wcml2YXRlOwoJc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyAqY3J0 Y19mdW5jcyA9IGNydGMtPmhlbHBlcl9wcml2YXRlOwoKCWlmIChpbnRlbF9lbmNvZGVyLT5sb2Fk X2RldGVjdF90ZW1wKSB7CgkJZW5jb2Rlci0+Y3J0YyA9IE5VTEw7CgkJY29ubmVjdG9yLT5lbmNv ZGVyID0gTlVMTDsKCQlpbnRlbF9lbmNvZGVyLT5sb2FkX2RldGVjdF90ZW1wID0gZmFsc2U7CgkJ Y3J0Yy0+ZW5hYmxlZCA9IGRybV9oZWxwZXJfY3J0Y19pbl91c2UoY3J0Yyk7CgkJZHJtX2hlbHBl cl9kaXNhYmxlX3VudXNlZF9mdW5jdGlvbnMoZGV2KTsKCX0KCgkvKiBTd2l0Y2ggY3J0YyBhbmQg ZW5jb2RlciBiYWNrIG9mZiBpZiBuZWNlc3NhcnkgKi8KCWlmIChjcnRjLT5lbmFibGVkICYmIGRw bXNfbW9kZSAhPSBEUk1fTU9ERV9EUE1TX09OKSB7CgkJaWYgKGVuY29kZXItPmNydGMgPT0gY3J0 YykKCQkJZW5jb2Rlcl9mdW5jcy0+ZHBtcyhlbmNvZGVyLCBkcG1zX21vZGUpOwoJCWNydGNfZnVu Y3MtPmRwbXMoY3J0YywgZHBtc19tb2RlKTsKCX0KfQoKLyogUmV0dXJucyB0aGUgY2xvY2sgb2Yg dGhlIGN1cnJlbnRseSBwcm9ncmFtbWVkIG1vZGUgb2YgdGhlIGdpdmVuIHBpcGUuICovCnN0YXRp YyBpbnQgaW50ZWxfY3J0Y19jbG9ja19nZXQoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgc3RydWN0 IGRybV9jcnRjICpjcnRjKQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBk ZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRl bF9jcnRjKGNydGMpOwoJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwoJdTMyIGRwbGwgPSBJ OTE1X1JFQUQoKHBpcGUgPT0gMCkgPyBEUExMX0EgOiBEUExMX0IpOwoJdTMyIGZwOwoJaW50ZWxf Y2xvY2tfdCBjbG9jazsKCglpZiAoKGRwbGwgJiBESVNQTEFZX1JBVEVfU0VMRUNUX0ZQQTEpID09 IDApCgkJZnAgPSBJOTE1X1JFQUQoKHBpcGUgPT0gMCkgPyBGUEEwIDogRlBCMCk7CgllbHNlCgkJ ZnAgPSBJOTE1X1JFQUQoKHBpcGUgPT0gMCkgPyBGUEExIDogRlBCMSk7CgoJY2xvY2subTEgPSAo ZnAgJiBGUF9NMV9ESVZfTUFTSykgPj4gRlBfTTFfRElWX1NISUZUOwoJaWYgKElTX1BJTkVWSUVX KGRldikpIHsKCQljbG9jay5uID0gZmZzKChmcCAmIEZQX05fUElORVZJRVdfRElWX01BU0spID4+ IEZQX05fRElWX1NISUZUKSAtIDE7CgkJY2xvY2subTIgPSAoZnAgJiBGUF9NMl9QSU5FVklFV19E SVZfTUFTSykgPj4gRlBfTTJfRElWX1NISUZUOwoJfSBlbHNlIHsKCQljbG9jay5uID0gKGZwICYg RlBfTl9ESVZfTUFTSykgPj4gRlBfTl9ESVZfU0hJRlQ7CgkJY2xvY2subTIgPSAoZnAgJiBGUF9N Ml9ESVZfTUFTSykgPj4gRlBfTTJfRElWX1NISUZUOwoJfQoKCWlmICghSVNfR0VOMihkZXYpKSB7 CgkJaWYgKElTX1BJTkVWSUVXKGRldikpCgkJCWNsb2NrLnAxID0gZmZzKChkcGxsICYgRFBMTF9G UEEwMV9QMV9QT1NUX0RJVl9NQVNLX1BJTkVWSUVXKSA+PgoJCQkJRFBMTF9GUEEwMV9QMV9QT1NU X0RJVl9TSElGVF9QSU5FVklFVyk7CgkJZWxzZQoJCQljbG9jay5wMSA9IGZmcygoZHBsbCAmIERQ TExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTSykgPj4KCQkJICAgICAgIERQTExfRlBBMDFfUDFfUE9T VF9ESVZfU0hJRlQpOwoKCQlzd2l0Y2ggKGRwbGwgJiBEUExMX01PREVfTUFTSykgewoJCWNhc2Ug RFBMTEJfTU9ERV9EQUNfU0VSSUFMOgoJCQljbG9jay5wMiA9IGRwbGwgJiBEUExMX0RBQ19TRVJJ QUxfUDJfQ0xPQ0tfRElWXzUgPwoJCQkJNSA6IDEwOwoJCQlicmVhazsKCQljYXNlIERQTExCX01P REVfTFZEUzoKCQkJY2xvY2sucDIgPSBkcGxsICYgRFBMTEJfTFZEU19QMl9DTE9DS19ESVZfNyA/ CgkJCQk3IDogMTQ7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCURSTV9ERUJVR19LTVMoIlVua25v d24gRFBMTCBtb2RlICUwOHggaW4gcHJvZ3JhbW1lZCAiCgkJCQkgICJtb2RlXG4iLCAoaW50KShk cGxsICYgRFBMTF9NT0RFX01BU0spKTsKCQkJcmV0dXJuIDA7CgkJfQoKCQkvKiBYWFg6IEhhbmRs ZSB0aGUgMTAwTWh6IHJlZmNsayAqLwoJCWludGVsX2Nsb2NrKGRldiwgOTYwMDAsICZjbG9jayk7 Cgl9IGVsc2UgewoJCWJvb2wgaXNfbHZkcyA9IChwaXBlID09IDEpICYmIChJOTE1X1JFQUQoTFZE UykgJiBMVkRTX1BPUlRfRU4pOwoKCQlpZiAoaXNfbHZkcykgewoJCQljbG9jay5wMSA9IGZmcygo ZHBsbCAmIERQTExfRlBBMDFfUDFfUE9TVF9ESVZfTUFTS19JODMwX0xWRFMpID4+CgkJCQkgICAg ICAgRFBMTF9GUEEwMV9QMV9QT1NUX0RJVl9TSElGVCk7CgkJCWNsb2NrLnAyID0gMTQ7CgoJCQlp ZiAoKGRwbGwgJiBQTExfUkVGX0lOUFVUX01BU0spID09CgkJCSAgICBQTExCX1JFRl9JTlBVVF9T UFJFQURTUEVDVFJVTUlOKSB7CgkJCQkvKiBYWFg6IG1pZ2h0IG5vdCBiZSA2Nk1IeiAqLwoJCQkJ aW50ZWxfY2xvY2soZGV2LCA2NjAwMCwgJmNsb2NrKTsKCQkJfSBlbHNlCgkJCQlpbnRlbF9jbG9j ayhkZXYsIDQ4MDAwLCAmY2xvY2spOwoJCX0gZWxzZSB7CgkJCWlmIChkcGxsICYgUExMX1AxX0RJ VklERV9CWV9UV08pCgkJCQljbG9jay5wMSA9IDI7CgkJCWVsc2UgewoJCQkJY2xvY2sucDEgPSAo KGRwbGwgJiBEUExMX0ZQQTAxX1AxX1BPU1RfRElWX01BU0tfSTgzMCkgPj4KCQkJCQkgICAgRFBM TF9GUEEwMV9QMV9QT1NUX0RJVl9TSElGVCkgKyAyOwoJCQl9CgkJCWlmIChkcGxsICYgUExMX1Ay X0RJVklERV9CWV80KQoJCQkJY2xvY2sucDIgPSA0OwoJCQllbHNlCgkJCQljbG9jay5wMiA9IDI7 CgoJCQlpbnRlbF9jbG9jayhkZXYsIDQ4MDAwLCAmY2xvY2spOwoJCX0KCX0KCgkvKiBYWFg6IEl0 IHdvdWxkIGJlIG5pY2UgdG8gdmFsaWRhdGUgdGhlIGNsb2NrcywgYnV0IHdlIGNhbid0IHJldXNl CgkgKiBpODMwUGxsSXNWYWxpZCgpIGJlY2F1c2UgaXQgcmVsaWVzIG9uIHRoZSB4Zjg2X2NvbmZp ZyBjb25uZWN0b3IKCSAqIGNvbmZpZ3VyYXRpb24gYmVpbmcgYWNjdXJhdGUsIHdoaWNoIGl0IGlz bid0IG5lY2Vzc2FyaWx5LgoJICovCgoJcmV0dXJuIGNsb2NrLmRvdDsKfQoKLyoqIFJldHVybnMg dGhlIGN1cnJlbnRseSBwcm9ncmFtbWVkIG1vZGUgb2YgdGhlIGdpdmVuIHBpcGUuICovCnN0cnVj dCBkcm1fZGlzcGxheV9tb2RlICppbnRlbF9jcnRjX21vZGVfZ2V0KHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYsCgkJCQkJICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCnsKCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50ZWxfY3J0 YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CglpbnQgcGlwZSA9IGludGVsX2Ny dGMtPnBpcGU7CglzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKCWludCBodG90ID0gSTkx NV9SRUFEKChwaXBlID09IDApID8gSFRPVEFMX0EgOiBIVE9UQUxfQik7CglpbnQgaHN5bmMgPSBJ OTE1X1JFQUQoKHBpcGUgPT0gMCkgPyBIU1lOQ19BIDogSFNZTkNfQik7CglpbnQgdnRvdCA9IEk5 MTVfUkVBRCgocGlwZSA9PSAwKSA/IFZUT1RBTF9BIDogVlRPVEFMX0IpOwoJaW50IHZzeW5jID0g STkxNV9SRUFEKChwaXBlID09IDApID8gVlNZTkNfQSA6IFZTWU5DX0IpOwoKCW1vZGUgPSBremFs bG9jKHNpemVvZigqbW9kZSksIEdGUF9LRVJORUwpOwoJaWYgKCFtb2RlKQoJCXJldHVybiBOVUxM OwoKCW1vZGUtPmNsb2NrID0gaW50ZWxfY3J0Y19jbG9ja19nZXQoZGV2LCBjcnRjKTsKCW1vZGUt PmhkaXNwbGF5ID0gKGh0b3QgJiAweGZmZmYpICsgMTsKCW1vZGUtPmh0b3RhbCA9ICgoaHRvdCAm IDB4ZmZmZjAwMDApID4+IDE2KSArIDE7Cgltb2RlLT5oc3luY19zdGFydCA9IChoc3luYyAmIDB4 ZmZmZikgKyAxOwoJbW9kZS0+aHN5bmNfZW5kID0gKChoc3luYyAmIDB4ZmZmZjAwMDApID4+IDE2 KSArIDE7Cgltb2RlLT52ZGlzcGxheSA9ICh2dG90ICYgMHhmZmZmKSArIDE7Cgltb2RlLT52dG90 YWwgPSAoKHZ0b3QgJiAweGZmZmYwMDAwKSA+PiAxNikgKyAxOwoJbW9kZS0+dnN5bmNfc3RhcnQg PSAodnN5bmMgJiAweGZmZmYpICsgMTsKCW1vZGUtPnZzeW5jX2VuZCA9ICgodnN5bmMgJiAweGZm ZmYwMDAwKSA+PiAxNikgKyAxOwoKCWRybV9tb2RlX3NldF9uYW1lKG1vZGUpOwoJZHJtX21vZGVf c2V0X2NydGNpbmZvKG1vZGUsIDApOwoKCXJldHVybiBtb2RlOwp9CgojZGVmaW5lIEdQVV9JRExF X1RJTUVPVVQgNTAwIC8qIG1zICovCgovKiBXaGVuIHRoaXMgdGltZXIgZmlyZXMsIHdlJ3ZlIGJl ZW4gaWRsZSBmb3IgYXdoaWxlICovCnN0YXRpYyB2b2lkIGludGVsX2dwdV9pZGxlX3RpbWVyKHVu c2lnbmVkIGxvbmcgYXJnKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gKHN0cnVjdCBkcm1f ZGV2aWNlICopYXJnOwoJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3By aXZhdGU7CgoJaWYgKCFsaXN0X2VtcHR5KCZkZXZfcHJpdi0+bW0uYWN0aXZlX2xpc3QpKSB7CgkJ LyogU3RpbGwgcHJvY2Vzc2luZyByZXF1ZXN0cywgc28ganVzdCByZS1hcm0gdGhlIHRpbWVyLiAq LwoJCW1vZF90aW1lcigmZGV2X3ByaXYtPmlkbGVfdGltZXIsIGppZmZpZXMgKwoJCQkgIG1zZWNz X3RvX2ppZmZpZXMoR1BVX0lETEVfVElNRU9VVCkpOwoJCXJldHVybjsKCX0KCglkZXZfcHJpdi0+ YnVzeSA9IGZhbHNlOwoJcXVldWVfd29yayhkZXZfcHJpdi0+d3EsICZkZXZfcHJpdi0+aWRsZV93 b3JrKTsKfQoKI2RlZmluZSBDUlRDX0lETEVfVElNRU9VVCAxMDAwIC8qIG1zICovCgpzdGF0aWMg dm9pZCBpbnRlbF9jcnRjX2lkbGVfdGltZXIodW5zaWduZWQgbG9uZyBhcmcpCnsKCXN0cnVjdCBp bnRlbF9jcnRjICppbnRlbF9jcnRjID0gKHN0cnVjdCBpbnRlbF9jcnRjICopYXJnOwoJc3RydWN0 IGRybV9jcnRjICpjcnRjID0gJmludGVsX2NydGMtPmJhc2U7Cglkcm1faTkxNV9wcml2YXRlX3Qg KmRldl9wcml2ID0gY3J0Yy0+ZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9mcmFtZWJ1 ZmZlciAqaW50ZWxfZmI7CgoJaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5m Yik7CglpZiAoaW50ZWxfZmIgJiYgaW50ZWxfZmItPm9iai0+YWN0aXZlKSB7CgkJLyogVGhlIGZy YW1lYnVmZmVyIGlzIHN0aWxsIGJlaW5nIGFjY2Vzc2VkIGJ5IHRoZSBHUFUuICovCgkJbW9kX3Rp bWVyKCZpbnRlbF9jcnRjLT5pZGxlX3RpbWVyLCBqaWZmaWVzICsKCQkJICBtc2Vjc190b19qaWZm aWVzKENSVENfSURMRV9USU1FT1VUKSk7CgkJcmV0dXJuOwoJfQoKCWludGVsX2NydGMtPmJ1c3kg PSBmYWxzZTsKCXF1ZXVlX3dvcmsoZGV2X3ByaXYtPndxLCAmZGV2X3ByaXYtPmlkbGVfd29yayk7 Cn0KCnN0YXRpYyB2b2lkIGludGVsX2luY3JlYXNlX3BsbGNsb2NrKHN0cnVjdCBkcm1fY3J0YyAq Y3J0YykKewoJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCWRybV9pOTE1X3By aXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGludGVsX2NydGMg KmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJaW50IHBpcGUgPSBpbnRlbF9jcnRj LT5waXBlOwoJaW50IGRwbGxfcmVnID0gRFBMTChwaXBlKTsKCWludCBkcGxsOwoKCWlmIChIQVNf UENIX1NQTElUKGRldikpCgkJcmV0dXJuOwoKCWlmICghZGV2X3ByaXYtPmx2ZHNfZG93bmNsb2Nr X2F2YWlsKQoJCXJldHVybjsKCglkcGxsID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsKCWlmICghSEFT X1BJUEVfQ1hTUihkZXYpICYmIChkcGxsICYgRElTUExBWV9SQVRFX1NFTEVDVF9GUEExKSkgewoJ CURSTV9ERUJVR19EUklWRVIoInVwY2xvY2tpbmcgTFZEU1xuIik7CgoJCS8qIFVubG9jayBwYW5l bCByZWdzICovCgkJSTkxNV9XUklURShQUF9DT05UUk9MLAoJCQkgICBJOTE1X1JFQUQoUFBfQ09O VFJPTCkgfCBQQU5FTF9VTkxPQ0tfUkVHUyk7CgoJCWRwbGwgJj0gfkRJU1BMQVlfUkFURV9TRUxF Q1RfRlBBMTsKCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsKTsKCQlQT1NUSU5HX1JFQUQoZHBs bF9yZWcpOwoJCWludGVsX3dhaXRfZm9yX3ZibGFuayhkZXYsIHBpcGUpOwoKCQlkcGxsID0gSTkx NV9SRUFEKGRwbGxfcmVnKTsKCQlpZiAoZHBsbCAmIERJU1BMQVlfUkFURV9TRUxFQ1RfRlBBMSkK CQkJRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRvIHVwY2xvY2sgTFZEUyFcbiIpOwoKCQkvKiAu Li5hbmQgbG9jayB0aGVtIGFnYWluICovCgkJSTkxNV9XUklURShQUF9DT05UUk9MLCBJOTE1X1JF QUQoUFBfQ09OVFJPTCkgJiAweDMpOwoJfQoKCS8qIFNjaGVkdWxlIGRvd25jbG9jayAqLwoJbW9k X3RpbWVyKCZpbnRlbF9jcnRjLT5pZGxlX3RpbWVyLCBqaWZmaWVzICsKCQkgIG1zZWNzX3RvX2pp ZmZpZXMoQ1JUQ19JRExFX1RJTUVPVVQpKTsKfQoKc3RhdGljIHZvaWQgaW50ZWxfZGVjcmVhc2Vf cGxsY2xvY2soc3RydWN0IGRybV9jcnRjICpjcnRjKQp7CglzdHJ1Y3QgZHJtX2RldmljZSAqZGV2 ID0gY3J0Yy0+ZGV2OwoJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9IGRldi0+ZGV2X3By aXZhdGU7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0 Yyk7CglpbnQgcGlwZSA9IGludGVsX2NydGMtPnBpcGU7CglpbnQgZHBsbF9yZWcgPSAocGlwZSA9 PSAwKSA/IERQTExfQSA6IERQTExfQjsKCWludCBkcGxsID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsK CglpZiAoSEFTX1BDSF9TUExJVChkZXYpKQoJCXJldHVybjsKCglpZiAoIWRldl9wcml2LT5sdmRz X2Rvd25jbG9ja19hdmFpbCkKCQlyZXR1cm47CgoJLyoKCSAqIFNpbmNlIHRoaXMgaXMgY2FsbGVk IGJ5IGEgdGltZXIsIHdlIHNob3VsZCBuZXZlciBnZXQgaGVyZSBpbgoJICogdGhlIG1hbnVhbCBj YXNlLgoJICovCglpZiAoIUhBU19QSVBFX0NYU1IoZGV2KSAmJiBpbnRlbF9jcnRjLT5sb3dmcmVx X2F2YWlsKSB7CgkJRFJNX0RFQlVHX0RSSVZFUigiZG93bmNsb2NraW5nIExWRFNcbiIpOwoKCQkv KiBVbmxvY2sgcGFuZWwgcmVncyAqLwoJCUk5MTVfV1JJVEUoUFBfQ09OVFJPTCwgSTkxNV9SRUFE KFBQX0NPTlRST0wpIHwKCQkJICAgUEFORUxfVU5MT0NLX1JFR1MpOwoKCQlkcGxsIHw9IERJU1BM QVlfUkFURV9TRUxFQ1RfRlBBMTsKCQlJOTE1X1dSSVRFKGRwbGxfcmVnLCBkcGxsKTsKCQlkcGxs ID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsKCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBwaXBl KTsKCQlkcGxsID0gSTkxNV9SRUFEKGRwbGxfcmVnKTsKCQlpZiAoIShkcGxsICYgRElTUExBWV9S QVRFX1NFTEVDVF9GUEExKSkKCQkJRFJNX0RFQlVHX0RSSVZFUigiZmFpbGVkIHRvIGRvd25jbG9j ayBMVkRTIVxuIik7CgoJCS8qIC4uLmFuZCBsb2NrIHRoZW0gYWdhaW4gKi8KCQlJOTE1X1dSSVRF KFBQX0NPTlRST0wsIEk5MTVfUkVBRChQUF9DT05UUk9MKSAmIDB4Myk7Cgl9Cgp9CgovKioKICog aW50ZWxfaWRsZV91cGRhdGUgLSBhZGp1c3QgY2xvY2tzIGZvciBpZGxlbmVzcwogKiBAd29yazog d29yayBzdHJ1Y3QKICoKICogRWl0aGVyIHRoZSBHUFUgb3IgZGlzcGxheSAob3IgYm90aCkgd2Vu dCBpZGxlLiAgQ2hlY2sgdGhlIGJ1c3kgc3RhdHVzCiAqIGhlcmUgYW5kIGFkanVzdCB0aGUgQ1JU QyBhbmQgR1BVIGNsb2NrcyBhcyBuZWNlc3NhcnkuCiAqLwpzdGF0aWMgdm9pZCBpbnRlbF9pZGxl X3VwZGF0ZShzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCnsKCWRybV9pOTE1X3ByaXZhdGVfdCAq ZGV2X3ByaXYgPSBjb250YWluZXJfb2Yod29yaywgZHJtX2k5MTVfcHJpdmF0ZV90LAoJCQkJCQkg ICAgaWRsZV93b3JrKTsKCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBkZXZfcHJpdi0+ZGV2OwoJ c3RydWN0IGRybV9jcnRjICpjcnRjOwoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7Cglp bnQgZW5hYmxlZCA9IDA7CgoJaWYgKCFpOTE1X3Bvd2Vyc2F2ZSkKCQlyZXR1cm47CgoJbXV0ZXhf bG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoKCWk5MTVfdXBkYXRlX2dmeF92YWwoZGV2X3ByaXYp OwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0 LCBoZWFkKSB7CgkJLyogU2tpcCBpbmFjdGl2ZSBDUlRDcyAqLwoJCWlmICghY3J0Yy0+ZmIpCgkJ CWNvbnRpbnVlOwoKCQllbmFibGVkKys7CgkJaW50ZWxfY3J0YyA9IHRvX2ludGVsX2NydGMoY3J0 Yyk7CgkJaWYgKCFpbnRlbF9jcnRjLT5idXN5KQoJCQlpbnRlbF9kZWNyZWFzZV9wbGxjbG9jayhj cnRjKTsKCX0KCglpZiAoKGVuYWJsZWQgPT0gMSkgJiYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0 NUdNKGRldikpKSB7CgkJRFJNX0RFQlVHX0RSSVZFUigiZW5hYmxlIG1lbW9yeSBzZWxmIHJlZnJl c2ggb24gOTQ1XG4iKTsKCQlJOTE1X1dSSVRFKEZXX0JMQ19TRUxGLCBGV19CTENfU0VMRl9FTl9N QVNLIHwgRldfQkxDX1NFTEZfRU4pOwoJfQoKCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0 ZXgpOwp9CgovKioKICogaW50ZWxfbWFya19idXN5IC0gbWFyayB0aGUgR1BVIGFuZCBwb3NzaWJs eSB0aGUgZGlzcGxheSBidXN5CiAqIEBkZXY6IGRybSBkZXZpY2UKICogQG9iajogb2JqZWN0IHdl J3JlIG9wZXJhdGluZyBvbgogKgogKiBDYWxsZXJzIGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBp bmRpY2F0ZSB0aGF0IHRoZSBHUFUgaXMgYnVzeSBwcm9jZXNzaW5nCiAqIGNvbW1hbmRzLiAgSWYg QG9iaiBtYXRjaGVzIG9uZSBvZiB0aGUgQ1JUQyBvYmplY3RzIChpLmUuIGl0J3MgYSBzY2Fub3V0 CiAqIGJ1ZmZlciksIHdlJ2xsIGFsc28gbWFyayB0aGUgZGlzcGxheSBhcyBidXN5LCBzbyB3ZSBr bm93IHRvIGluY3JlYXNlIGl0cwogKiBjbG9jayBmcmVxdWVuY3kuCiAqLwp2b2lkIGludGVsX21h cmtfYnVzeShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVj dCAqb2JqKQp7Cglkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0 ZTsKCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IE5VTEw7CglzdHJ1Y3QgaW50ZWxfZnJhbWVidWZm ZXIgKmludGVsX2ZiOwoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGM7CgoJaWYgKCFkcm1f Y29yZV9jaGVja19mZWF0dXJlKGRldiwgRFJJVkVSX01PREVTRVQpKQoJCXJldHVybjsKCglpZiAo IWRldl9wcml2LT5idXN5KSB7CgkJaWYgKElTX0k5NDVHKGRldikgfHwgSVNfSTk0NUdNKGRldikp IHsKCQkJdTMyIGZ3X2JsY19zZWxmOwoKCQkJRFJNX0RFQlVHX0RSSVZFUigiZGlzYWJsZSBtZW1v cnkgc2VsZiByZWZyZXNoIG9uIDk0NVxuIik7CgkJCWZ3X2JsY19zZWxmID0gSTkxNV9SRUFEKEZX X0JMQ19TRUxGKTsKCQkJZndfYmxjX3NlbGYgJj0gfkZXX0JMQ19TRUxGX0VOOwoJCQlJOTE1X1dS SVRFKEZXX0JMQ19TRUxGLCBmd19ibGNfc2VsZiB8IEZXX0JMQ19TRUxGX0VOX01BU0spOwoJCX0K CQlkZXZfcHJpdi0+YnVzeSA9IHRydWU7Cgl9IGVsc2UKCQltb2RfdGltZXIoJmRldl9wcml2LT5p ZGxlX3RpbWVyLCBqaWZmaWVzICsKCQkJICBtc2Vjc190b19qaWZmaWVzKEdQVV9JRExFX1RJTUVP VVQpKTsKCglsaXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNf bGlzdCwgaGVhZCkgewoJCWlmICghY3J0Yy0+ZmIpCgkJCWNvbnRpbnVlOwoKCQlpbnRlbF9jcnRj ID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCQlpbnRlbF9mYiA9IHRvX2ludGVsX2ZyYW1lYnVmZmVy KGNydGMtPmZiKTsKCQlpZiAoaW50ZWxfZmItPm9iaiA9PSBvYmopIHsKCQkJaWYgKCFpbnRlbF9j cnRjLT5idXN5KSB7CgkJCQlpZiAoSVNfSTk0NUcoZGV2KSB8fCBJU19JOTQ1R00oZGV2KSkgewoJ CQkJCXUzMiBmd19ibGNfc2VsZjsKCgkJCQkJRFJNX0RFQlVHX0RSSVZFUigiZGlzYWJsZSBtZW1v cnkgc2VsZiByZWZyZXNoIG9uIDk0NVxuIik7CgkJCQkJZndfYmxjX3NlbGYgPSBJOTE1X1JFQUQo RldfQkxDX1NFTEYpOwoJCQkJCWZ3X2JsY19zZWxmICY9IH5GV19CTENfU0VMRl9FTjsKCQkJCQlJ OTE1X1dSSVRFKEZXX0JMQ19TRUxGLCBmd19ibGNfc2VsZiB8IEZXX0JMQ19TRUxGX0VOX01BU0sp OwoJCQkJfQoJCQkJLyogTm9uLWJ1c3kgLT4gYnVzeSwgdXBjbG9jayAqLwoJCQkJaW50ZWxfaW5j cmVhc2VfcGxsY2xvY2soY3J0Yyk7CgkJCQlpbnRlbF9jcnRjLT5idXN5ID0gdHJ1ZTsKCQkJfSBl bHNlIHsKCQkJCS8qIEJ1c3kgLT4gYnVzeSwgcHV0IG9mZiB0aW1lciAqLwoJCQkJbW9kX3RpbWVy KCZpbnRlbF9jcnRjLT5pZGxlX3RpbWVyLCBqaWZmaWVzICsKCQkJCQkgIG1zZWNzX3RvX2ppZmZp ZXMoQ1JUQ19JRExFX1RJTUVPVVQpKTsKCQkJfQoJCX0KCX0KfQoKc3RhdGljIHZvaWQgaW50ZWxf Y3J0Y19kZXN0cm95KHN0cnVjdCBkcm1fY3J0YyAqY3J0YykKewoJc3RydWN0IGludGVsX2NydGMg KmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGNydGMtPmRldjsKCXN0cnVjdCBpbnRlbF91bnBpbl93b3JrICp3b3JrOwoJdW5zaWduZWQg bG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7 Cgl3b3JrID0gaW50ZWxfY3J0Yy0+dW5waW5fd29yazsKCWludGVsX2NydGMtPnVucGluX3dvcmsg PSBOVUxMOwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7 CgoJaWYgKHdvcmspIHsKCQljYW5jZWxfd29ya19zeW5jKCZ3b3JrLT53b3JrKTsKCQlrZnJlZSh3 b3JrKTsKCX0KCglkcm1fY3J0Y19jbGVhbnVwKGNydGMpOwoKCWtmcmVlKGludGVsX2NydGMpOwp9 CgpzdGF0aWMgdm9pZCBpbnRlbF91bnBpbl93b3JrX2ZuKHN0cnVjdCB3b3JrX3N0cnVjdCAqX193 b3JrKQp7CglzdHJ1Y3QgaW50ZWxfdW5waW5fd29yayAqd29yayA9CgkJY29udGFpbmVyX29mKF9f d29yaywgc3RydWN0IGludGVsX3VucGluX3dvcmssIHdvcmspOwoKCW11dGV4X2xvY2soJndvcmst PmRldi0+c3RydWN0X211dGV4KTsKCWk5MTVfZ2VtX29iamVjdF91bnBpbih3b3JrLT5vbGRfZmJf b2JqKTsKCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZ3b3JrLT5wZW5kaW5nX2ZsaXBfb2Jq LT5iYXNlKTsKCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZ3b3JrLT5vbGRfZmJfb2JqLT5i YXNlKTsKCgltdXRleF91bmxvY2soJndvcmstPmRldi0+c3RydWN0X211dGV4KTsKCWtmcmVlKHdv cmspOwp9CgpzdGF0aWMgdm9pZCBkb19pbnRlbF9maW5pc2hfcGFnZV9mbGlwKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYsCgkJCQkgICAgICBzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCnsKCWRybV9pOTE1 X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGludGVsX2Ny dGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJc3RydWN0IGludGVsX3VucGlu X3dvcmsgKndvcms7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwoJc3RydWN0IGRy bV9wZW5kaW5nX3ZibGFua19ldmVudCAqZTsKCXN0cnVjdCB0aW1ldmFsIHRub3csIHR2Ymw7Cgl1 bnNpZ25lZCBsb25nIGZsYWdzOwoKCS8qIElnbm9yZSBlYXJseSB2YmxhbmsgaXJxcyAqLwoJaWYg KGludGVsX2NydGMgPT0gTlVMTCkKCQlyZXR1cm47CgoJZG9fZ2V0dGltZW9mZGF5KCZ0bm93KTsK CglzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Cgl3b3JrID0gaW50 ZWxfY3J0Yy0+dW5waW5fd29yazsKCWlmICh3b3JrID09IE5VTEwgfHwgIXdvcmstPnBlbmRpbmcp IHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKCQly ZXR1cm47Cgl9CgoJaW50ZWxfY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7CgoJaWYgKHdvcmstPmV2 ZW50KSB7CgkJZSA9IHdvcmstPmV2ZW50OwoJCWUtPmV2ZW50LnNlcXVlbmNlID0gZHJtX3ZibGFu a19jb3VudF9hbmRfdGltZShkZXYsIGludGVsX2NydGMtPnBpcGUsICZ0dmJsKTsKCgkJLyogQ2Fs bGVkIGJlZm9yZSB2YmxhbmsgY291bnQgYW5kIHRpbWVzdGFtcHMgaGF2ZQoJCSAqIGJlZW4gdXBk YXRlZCBmb3IgdGhlIHZibGFuayBpbnRlcnZhbCBvZiBmbGlwCgkJICogY29tcGxldGlvbj8gTmVl ZCB0byBpbmNyZW1lbnQgdmJsYW5rIGNvdW50IGFuZAoJCSAqIGFkZCBvbmUgdmlkZW9yZWZyZXNo IGR1cmF0aW9uIHRvIHJldHVybmVkIHRpbWVzdGFtcAoJCSAqIHRvIGFjY291bnQgZm9yIHRoaXMu IFdlIGFzc3VtZSB0aGlzIGhhcHBlbmVkIGlmIHdlCgkJICogZ2V0IGNhbGxlZCBvdmVyIDAuOSBm cmFtZSBkdXJhdGlvbnMgYWZ0ZXIgdGhlIGxhc3QKCQkgKiB0aW1lc3RhbXBlZCB2YmxhbmsuCgkJ ICoKCQkgKiBUaGlzIGNhbGN1bGF0aW9uIGNhbiBub3QgYmUgdXNlZCB3aXRoIHZyZWZyZXNoIHJh dGVzCgkJICogYmVsb3cgNUh6ICgxMEh6IHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUpIHdpdGhvdXQK CQkgKiBwcm9tb3RpbmcgdG8gNjQgaW50ZWdlcnMuCgkJICovCgkJaWYgKDEwICogKHRpbWV2YWxf dG9fbnMoJnRub3cpIC0gdGltZXZhbF90b19ucygmdHZibCkpID4KCQkgICAgOSAqIGNydGMtPmZy YW1lZHVyX25zKSB7CgkJCWUtPmV2ZW50LnNlcXVlbmNlKys7CgkJCXR2YmwgPSBuc190b190aW1l dmFsKHRpbWV2YWxfdG9fbnMoJnR2YmwpICsKCQkJCQkgICAgIGNydGMtPmZyYW1lZHVyX25zKTsK CQl9CgoJCWUtPmV2ZW50LnR2X3NlYyA9IHR2YmwudHZfc2VjOwoJCWUtPmV2ZW50LnR2X3VzZWMg PSB0dmJsLnR2X3VzZWM7CgoJCWxpc3RfYWRkX3RhaWwoJmUtPmJhc2UubGluaywKCQkJICAgICAg JmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF9saXN0KTsKCQl3YWtlX3VwX2ludGVycnVwdGlibGUo JmUtPmJhc2UuZmlsZV9wcml2LT5ldmVudF93YWl0KTsKCX0KCglkcm1fdmJsYW5rX3B1dChkZXYs IGludGVsX2NydGMtPnBpcGUpOwoKCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRldi0+ZXZlbnRf bG9jaywgZmxhZ3MpOwoKCW9iaiA9IHdvcmstPm9sZF9mYl9vYmo7CgoJYXRvbWljX2NsZWFyX21h c2soMSA8PCBpbnRlbF9jcnRjLT5wbGFuZSwKCQkJICAmb2JqLT5wZW5kaW5nX2ZsaXAuY291bnRl cik7CglpZiAoYXRvbWljX3JlYWQoJm9iai0+cGVuZGluZ19mbGlwKSA9PSAwKQoJCXdha2VfdXAo JmRldl9wcml2LT5wZW5kaW5nX2ZsaXBfcXVldWUpOwoKCXNjaGVkdWxlX3dvcmsoJndvcmstPndv cmspOwoKCXRyYWNlX2k5MTVfZmxpcF9jb21wbGV0ZShpbnRlbF9jcnRjLT5wbGFuZSwgd29yay0+ cGVuZGluZ19mbGlwX29iaik7Cn0KCnZvaWQgaW50ZWxfZmluaXNoX3BhZ2VfZmxpcChzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2LCBpbnQgcGlwZSkKewoJZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJp diA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBkZXZfcHJpdi0+ cGlwZV90b19jcnRjX21hcHBpbmdbcGlwZV07CgoJZG9faW50ZWxfZmluaXNoX3BhZ2VfZmxpcChk ZXYsIGNydGMpOwp9Cgp2b2lkIGludGVsX2ZpbmlzaF9wYWdlX2ZsaXBfcGxhbmUoc3RydWN0IGRy bV9kZXZpY2UgKmRldiwgaW50IHBsYW5lKQp7Cglkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2 ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IGRldl9wcml2LT5w bGFuZV90b19jcnRjX21hcHBpbmdbcGxhbmVdOwoKCWRvX2ludGVsX2ZpbmlzaF9wYWdlX2ZsaXAo ZGV2LCBjcnRjKTsKfQoKdm9pZCBpbnRlbF9wcmVwYXJlX3BhZ2VfZmxpcChzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2LCBpbnQgcGxhbmUpCnsKCWRybV9pOTE1X3ByaXZhdGVfdCAqZGV2X3ByaXYgPSBk ZXYtPmRldl9wcml2YXRlOwoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPQoJCXRvX2lu dGVsX2NydGMoZGV2X3ByaXYtPnBsYW5lX3RvX2NydGNfbWFwcGluZ1twbGFuZV0pOwoJdW5zaWdu ZWQgbG9uZyBmbGFnczsKCglzcGluX2xvY2tfaXJxc2F2ZSgmZGV2LT5ldmVudF9sb2NrLCBmbGFn cyk7CglpZiAoaW50ZWxfY3J0Yy0+dW5waW5fd29yaykgewoJCWlmICgoKytpbnRlbF9jcnRjLT51 bnBpbl93b3JrLT5wZW5kaW5nKSA+IDEpCgkJCURSTV9FUlJPUigiUHJlcGFyZWQgZmxpcCBtdWx0 aXBsZSB0aW1lc1xuIik7Cgl9IGVsc2UgewoJCURSTV9ERUJVR19EUklWRVIoInByZXBhcmluZyBm bGlwIHdpdGggbm8gdW5waW4gd29yaz9cbiIpOwoJfQoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm ZGV2LT5ldmVudF9sb2NrLCBmbGFncyk7Cn0KCnN0YXRpYyBpbnQgaW50ZWxfY3J0Y19wYWdlX2Zs aXAoc3RydWN0IGRybV9jcnRjICpjcnRjLAoJCQkJc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIs CgkJCQlzdHJ1Y3QgZHJtX3BlbmRpbmdfdmJsYW5rX2V2ZW50ICpldmVudCkKewoJc3RydWN0IGRy bV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50ZWxfZnJhbWVidWZmZXIgKmludGVs X2ZiOwoJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKCXN0cnVjdCBpbnRlbF9jcnRj ICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCXN0cnVjdCBpbnRlbF91bnBpbl93 b3JrICp3b3JrOwoJdW5zaWduZWQgbG9uZyBmbGFncywgb2Zmc2V0OwoJaW50IHBpcGUgPSBpbnRl bF9jcnRjLT5waXBlOwoJdTMyIHBmLCBwaXBlc3JjOwoJaW50IHJldDsKCgl3b3JrID0ga3phbGxv YyhzaXplb2YgKndvcmssIEdGUF9LRVJORUwpOwoJaWYgKHdvcmsgPT0gTlVMTCkKCQlyZXR1cm4g LUVOT01FTTsKCgl3b3JrLT5ldmVudCA9IGV2ZW50OwoJd29yay0+ZGV2ID0gY3J0Yy0+ZGV2OwoJ aW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihjcnRjLT5mYik7Cgl3b3JrLT5vbGRfZmJf b2JqID0gaW50ZWxfZmItPm9iajsKCUlOSVRfV09SSygmd29yay0+d29yaywgaW50ZWxfdW5waW5f d29ya19mbik7CgoJLyogV2UgYm9ycm93IHRoZSBldmVudCBzcGluIGxvY2sgZm9yIHByb3RlY3Rp bmcgdW5waW5fd29yayAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZlbnRfbG9jaywgZmxh Z3MpOwoJaWYgKGludGVsX2NydGMtPnVucGluX3dvcmspIHsKCQlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKCQlrZnJlZSh3b3JrKTsKCgkJRFJNX0RFQlVH X0RSSVZFUigiZmxpcCBxdWV1ZTogY3J0YyBhbHJlYWR5IGJ1c3lcbiIpOwoJCXJldHVybiAtRUJV U1k7Cgl9CglpbnRlbF9jcnRjLT51bnBpbl93b3JrID0gd29yazsKCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmRldi0+ZXZlbnRfbG9jaywgZmxhZ3MpOwoKCWludGVsX2ZiID0gdG9faW50ZWxfZnJh bWVidWZmZXIoZmIpOwoJb2JqID0gaW50ZWxfZmItPm9iajsKCgltdXRleF9sb2NrKCZkZXYtPnN0 cnVjdF9tdXRleCk7CglyZXQgPSBpbnRlbF9waW5fYW5kX2ZlbmNlX2ZiX29iaihkZXYsIG9iaiwg TFBfUklORyhkZXZfcHJpdikpOwoJaWYgKHJldCkKCQlnb3RvIGNsZWFudXBfd29yazsKCgkvKiBS ZWZlcmVuY2UgdGhlIG9iamVjdHMgZm9yIHRoZSBzY2hlZHVsZWQgd29yay4gKi8KCWRybV9nZW1f b2JqZWN0X3JlZmVyZW5jZSgmd29yay0+b2xkX2ZiX29iai0+YmFzZSk7Cglkcm1fZ2VtX29iamVj dF9yZWZlcmVuY2UoJm9iai0+YmFzZSk7CgoJY3J0Yy0+ZmIgPSBmYjsKCglyZXQgPSBkcm1fdmJs YW5rX2dldChkZXYsIGludGVsX2NydGMtPnBpcGUpOwoJaWYgKHJldCkKCQlnb3RvIGNsZWFudXBf b2JqczsKCglpZiAoSVNfR0VOMyhkZXYpIHx8IElTX0dFTjIoZGV2KSkgewoJCXUzMiBmbGlwX21h c2s7CgoJCS8qIENhbid0IHF1ZXVlIG11bHRpcGxlIGZsaXBzLCBzbyB3YWl0IGZvciB0aGUgcHJl dmlvdXMKCQkgKiBvbmUgdG8gZmluaXNoIGJlZm9yZSBleGVjdXRpbmcgdGhlIG5leHQuCgkJICov CgkJcmV0ID0gQkVHSU5fTFBfUklORygyKTsKCQlpZiAocmV0KQoJCQlnb3RvIGNsZWFudXBfb2Jq czsKCgkJaWYgKGludGVsX2NydGMtPnBsYW5lKQoJCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9Q TEFORV9CX0ZMSVA7CgkJZWxzZQoJCQlmbGlwX21hc2sgPSBNSV9XQUlUX0ZPUl9QTEFORV9BX0ZM SVA7CgkJT1VUX1JJTkcoTUlfV0FJVF9GT1JfRVZFTlQgfCBmbGlwX21hc2spOwoJCU9VVF9SSU5H KE1JX05PT1ApOwoJCUFEVkFOQ0VfTFBfUklORygpOwoJfQoKCXdvcmstPnBlbmRpbmdfZmxpcF9v YmogPSBvYmo7CgoJd29yay0+ZW5hYmxlX3N0YWxsX2NoZWNrID0gdHJ1ZTsKCgkvKiBPZmZzZXQg aW50byB0aGUgbmV3IGJ1ZmZlciBmb3IgY2FzZXMgb2Ygc2hhcmVkIGZicyBiZXR3ZWVuIENSVENz ICovCglvZmZzZXQgPSBjcnRjLT55ICogZmItPnBpdGNoICsgY3J0Yy0+eCAqIGZiLT5iaXRzX3Bl cl9waXhlbC84OwoKCXJldCA9IEJFR0lOX0xQX1JJTkcoNCk7CglpZiAocmV0KQoJCWdvdG8gY2xl YW51cF9vYmpzOwoKCS8qIEJsb2NrIGNsaWVudHMgZnJvbSByZW5kZXJpbmcgdG8gdGhlIG5ldyBi YWNrIGJ1ZmZlciB1bnRpbAoJICogdGhlIGZsaXAgb2NjdXJzIGFuZCB0aGUgb2JqZWN0IGlzIG5v IGxvbmdlciB2aXNpYmxlLgoJICovCglhdG9taWNfYWRkKDEgPDwgaW50ZWxfY3J0Yy0+cGxhbmUs ICZ3b3JrLT5vbGRfZmJfb2JqLT5wZW5kaW5nX2ZsaXApOwoKCXN3aXRjaCAoSU5URUxfSU5GTyhk ZXYpLT5nZW4pIHsKCWNhc2UgMjoKCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAoJCQkgTUlf RElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMtPnBsYW5lKSk7CgkJT1VUX1JJTkcoZmItPnBp dGNoKTsKCQlPVVRfUklORyhvYmotPmd0dF9vZmZzZXQgKyBvZmZzZXQpOwoJCU9VVF9SSU5HKE1J X05PT1ApOwoJCWJyZWFrOwoKCWNhc2UgMzoKCQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVBfSTkx NSB8CgkJCSBNSV9ESVNQTEFZX0ZMSVBfUExBTkUoaW50ZWxfY3J0Yy0+cGxhbmUpKTsKCQlPVVRf UklORyhmYi0+cGl0Y2gpOwoJCU9VVF9SSU5HKG9iai0+Z3R0X29mZnNldCArIG9mZnNldCk7CgkJ T1VUX1JJTkcoTUlfTk9PUCk7CgkJYnJlYWs7CgoJY2FzZSA0OgoJY2FzZSA1OgoJCS8qIGk5NjUr IHVzZXMgdGhlIGxpbmVhciBvciB0aWxlZCBvZmZzZXRzIGZyb20gdGhlCgkJICogRGlzcGxheSBS ZWdpc3RlcnMgKHdoaWNoIGRvIG5vdCBjaGFuZ2UgYWNyb3NzIGEgcGFnZS1mbGlwKQoJCSAqIHNv IHdlIG5lZWQgb25seSByZXByb2dyYW0gdGhlIGJhc2UgYWRkcmVzcy4KCQkgKi8KCQlPVVRfUklO RyhNSV9ESVNQTEFZX0ZMSVAgfAoJCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGludGVsX2NydGMt PnBsYW5lKSk7CgkJT1VUX1JJTkcoZmItPnBpdGNoKTsKCQlPVVRfUklORyhvYmotPmd0dF9vZmZz ZXQgfCBvYmotPnRpbGluZ19tb2RlKTsKCgkJLyogWFhYIEVuYWJsaW5nIHRoZSBwYW5lbC1maXR0 ZXIgYWNyb3NzIHBhZ2UtZmxpcCBpcyBzbyBmYXIKCQkgKiB1bnRlc3RlZCBvbiBub24tbmF0aXZl IG1vZGVzLCBzbyBpZ25vcmUgaXQgZm9yIG5vdy4KCQkgKiBwZiA9IEk5MTVfUkVBRChwaXBlID09 IDAgPyBQRkFfQ1RMXzEgOiBQRkJfQ1RMXzEpICYgUEZfRU5BQkxFOwoJCSAqLwoJCXBmID0gMDsK CQlwaXBlc3JjID0gSTkxNV9SRUFEKHBpcGUgPT0gMCA/IFBJUEVBU1JDIDogUElQRUJTUkMpICYg MHgwZmZmMGZmZjsKCQlPVVRfUklORyhwZiB8IHBpcGVzcmMpOwoJCWJyZWFrOwoKCWNhc2UgNjoK CQlPVVRfUklORyhNSV9ESVNQTEFZX0ZMSVAgfAoJCQkgTUlfRElTUExBWV9GTElQX1BMQU5FKGlu dGVsX2NydGMtPnBsYW5lKSk7CgkJT1VUX1JJTkcoZmItPnBpdGNoIHwgb2JqLT50aWxpbmdfbW9k ZSk7CgkJT1VUX1JJTkcob2JqLT5ndHRfb2Zmc2V0KTsKCgkJcGYgPSBJOTE1X1JFQUQocGlwZSA9 PSAwID8gUEZBX0NUTF8xIDogUEZCX0NUTF8xKSAmIFBGX0VOQUJMRTsKCQlwaXBlc3JjID0gSTkx NV9SRUFEKHBpcGUgPT0gMCA/IFBJUEVBU1JDIDogUElQRUJTUkMpICYgMHgwZmZmMGZmZjsKCQlP VVRfUklORyhwZiB8IHBpcGVzcmMpOwoJCWJyZWFrOwoJfQoJQURWQU5DRV9MUF9SSU5HKCk7CgoJ bXV0ZXhfdW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CgoJdHJhY2VfaTkxNV9mbGlwX3JlcXVl c3QoaW50ZWxfY3J0Yy0+cGxhbmUsIG9iaik7CgoJcmV0dXJuIDA7CgpjbGVhbnVwX29ianM6Cglk cm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmd29yay0+b2xkX2ZiX29iai0+YmFzZSk7Cglkcm1f Z2VtX29iamVjdF91bnJlZmVyZW5jZSgmb2JqLT5iYXNlKTsKY2xlYW51cF93b3JrOgoJbXV0ZXhf dW5sb2NrKCZkZXYtPnN0cnVjdF9tdXRleCk7CgoJc3Bpbl9sb2NrX2lycXNhdmUoJmRldi0+ZXZl bnRfbG9jaywgZmxhZ3MpOwoJaW50ZWxfY3J0Yy0+dW5waW5fd29yayA9IE5VTEw7CglzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZkZXYtPmV2ZW50X2xvY2ssIGZsYWdzKTsKCglrZnJlZSh3b3JrKTsK CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdm9pZCBpbnRlbF9jcnRjX3Jlc2V0KHN0cnVjdCBkcm1f Y3J0YyAqY3J0YykKewoJc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9j cnRjKGNydGMpOwoKCS8qIFJlc2V0IGZsYWdzIGJhY2sgdG8gdGhlICd1bmtub3duJyBzdGF0dXMg c28gdGhhdCB0aGV5CgkgKiB3aWxsIGJlIGNvcnJlY3RseSBzZXQgb24gdGhlIGluaXRpYWwgbW9k ZXNldC4KCSAqLwoJaW50ZWxfY3J0Yy0+Y3Vyc29yX2FkZHIgPSAwOwoJaW50ZWxfY3J0Yy0+ZHBt c19tb2RlID0gLTE7CgoJcHJpbnRrKCJpbnRlbF9jcnRjICVwXG4iLCBpbnRlbF9jcnRjKTsKCgkv L2ludGVsX2NydGMtPmFjdGl2ZSA9IHRydWU7IC8vIGZvcmNlIHRoZSBwaXBlIG9mZiBvbiBzZXR1 cF9pbml0X2NvbmZpZwp9CgpzdGF0aWMgc3RydWN0IGRybV9jcnRjX2hlbHBlcl9mdW5jcyBpbnRl bF9oZWxwZXJfZnVuY3MgPSB7CgkuZHBtcyA9IGludGVsX2NydGNfZHBtcywKCS5tb2RlX2ZpeHVw ID0gaW50ZWxfY3J0Y19tb2RlX2ZpeHVwLAoJLm1vZGVfc2V0ID0gaW50ZWxfY3J0Y19tb2RlX3Nl dCwKCS5tb2RlX3NldF9iYXNlID0gaW50ZWxfcGlwZV9zZXRfYmFzZSwKCS5tb2RlX3NldF9iYXNl X2F0b21pYyA9IGludGVsX3BpcGVfc2V0X2Jhc2VfYXRvbWljLAoJLmxvYWRfbHV0ID0gaW50ZWxf Y3J0Y19sb2FkX2x1dCwKCS5kaXNhYmxlID0gaW50ZWxfY3J0Y19kaXNhYmxlLAp9OwoKc3RhdGlj IGNvbnN0IHN0cnVjdCBkcm1fY3J0Y19mdW5jcyBpbnRlbF9jcnRjX2Z1bmNzID0gewoJLnJlc2V0 ID0gaW50ZWxfY3J0Y19yZXNldCwKCS5jdXJzb3Jfc2V0ID0gaW50ZWxfY3J0Y19jdXJzb3Jfc2V0 LAoJLmN1cnNvcl9tb3ZlID0gaW50ZWxfY3J0Y19jdXJzb3JfbW92ZSwKCS5nYW1tYV9zZXQgPSBp bnRlbF9jcnRjX2dhbW1hX3NldCwKCS5zZXRfY29uZmlnID0gZHJtX2NydGNfaGVscGVyX3NldF9j b25maWcsCgkuZGVzdHJveSA9IGludGVsX2NydGNfZGVzdHJveSwKCS5wYWdlX2ZsaXAgPSBpbnRl bF9jcnRjX3BhZ2VfZmxpcCwKfTsKCnN0YXRpYyB2b2lkIGludGVsX3Nhbml0aXplX21vZGVzZXR0 aW5nKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCgkJCQkgICAgICAgaW50IHBpcGUsIGludCBwbGFu ZSkKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0 ZTsKCXUzMiByZWcsIHZhbDsKCglpZiAoSEFTX1BDSF9TUExJVChkZXYpKQoJCXJldHVybjsKCgkv KiBXaG8ga25vd3Mgd2hhdCBzdGF0ZSB0aGVzZSByZWdpc3RlcnMgd2VyZSBsZWZ0IGluIGJ5IHRo ZSBCSU9TIG9yCgkgKiBncnViPwoJICoKCSAqIElmIHdlIGxlYXZlIHRoZSByZWdpc3RlcnMgaW4g YSBjb25mbGljdGluZyBzdGF0ZSAoZS5nLiB3aXRoIHRoZQoJICogZGlzcGxheSBwbGFuZSByZWFk aW5nIGZyb20gdGhlIG90aGVyIHBpcGUgdGhhbiB0aGUgb25lIHdlIGludGVuZAoJICogdG8gdXNl KSB0aGVuIHdoZW4gd2UgYXR0ZW1wdCB0byB0ZWFyZG93biB0aGUgYWN0aXZlIG1vZGUsIHdlIHdp bGwKCSAqIG5vdCBkaXNhYmxlIHRoZSBwaXBlcyBhbmQgcGxhbmVzIGluIHRoZSBjb3JyZWN0IG9y ZGVyIC0tIGxlYXZpbmcKCSAqIGEgcGxhbmUgcmVhZGluZyBmcm9tIGEgZGlzYWJsZWQgcGlwZSBh bmQgcG9zc2libHkgbGVhZGluZyB0bwoJICogdW5kZWZpbmVkIGJlaGF2aW91ci4KCSAqLwoKCXJl ZyA9IERTUENOVFIocGxhbmUpOwoJdmFsID0gSTkxNV9SRUFEKHJlZyk7CgoJaWYgKCh2YWwgJiBE SVNQTEFZX1BMQU5FX0VOQUJMRSkgPT0gMCkKCQlyZXR1cm47CglpZiAoISEodmFsICYgRElTUFBM QU5FX1NFTF9QSVBFX01BU0spID09IHBpcGUpCgkJcmV0dXJuOwoKCS8qIFRoaXMgZGlzcGxheSBw bGFuZSBpcyBhY3RpdmUgYW5kIGF0dGFjaGVkIHRvIHRoZSBvdGhlciBDUFUgcGlwZS4gKi8KCXBp cGUgPSAhcGlwZTsKCgkvKiBEaXNhYmxlIHRoZSBwbGFuZSBhbmQgd2FpdCBmb3IgaXQgdG8gc3Rv cCByZWFkaW5nIGZyb20gdGhlIHBpcGUuICovCglJOTE1X1dSSVRFKHJlZywgdmFsICYgfkRJU1BM QVlfUExBTkVfRU5BQkxFKTsKCWludGVsX2ZsdXNoX2Rpc3BsYXlfcGxhbmUoZGV2LCBwbGFuZSk7 CgoJaWYgKElTX0dFTjIoZGV2KSkKCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2LCBwaXBlKTsK CglpZiAocGlwZSA9PSAwICYmIChkZXZfcHJpdi0+cXVpcmtzICYgUVVJUktfUElQRUFfRk9SQ0Up KQoJCXJldHVybjsKCgkvKiBTd2l0Y2ggb2ZmIHRoZSBwaXBlLiAqLwoJcmVnID0gUElQRUNPTkYo cGlwZSk7Cgl2YWwgPSBJOTE1X1JFQUQocmVnKTsKCWlmICh2YWwgJiBQSVBFQ09ORl9FTkFCTEUp IHsKCQlJOTE1X1dSSVRFKHJlZywgdmFsICYgflBJUEVDT05GX0VOQUJMRSk7CgkJaW50ZWxfd2Fp dF9mb3JfcGlwZV9vZmYoZGV2LCBwaXBlKTsKCX0KfQoKc3RhdGljIHZvaWQgaW50ZWxfY3J0Y19p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBwaXBlKQp7Cglkcm1faTkxNV9wcml2YXRl X3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9jcnRjICppbnRl bF9jcnRjOwoJaW50IGk7CgoJaW50ZWxfY3J0YyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBpbnRl bF9jcnRjKSArIChJTlRFTEZCX0NPTk5fTElNSVQgKiBzaXplb2Yoc3RydWN0IGRybV9jb25uZWN0 b3IgKikpLCBHRlBfS0VSTkVMKTsKCWlmIChpbnRlbF9jcnRjID09IE5VTEwpCgkJcmV0dXJuOwoK CWRybV9jcnRjX2luaXQoZGV2LCAmaW50ZWxfY3J0Yy0+YmFzZSwgJmludGVsX2NydGNfZnVuY3Mp OwoKCWRybV9tb2RlX2NydGNfc2V0X2dhbW1hX3NpemUoJmludGVsX2NydGMtPmJhc2UsIDI1Nik7 Cglmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKCQlpbnRlbF9jcnRjLT5sdXRfcltpXSA9IGk7 CgkJaW50ZWxfY3J0Yy0+bHV0X2dbaV0gPSBpOwoJCWludGVsX2NydGMtPmx1dF9iW2ldID0gaTsK CX0KCgkvKiBTd2FwIHBpcGVzICYgcGxhbmVzIGZvciBGQkMgb24gcHJlLTk2NSAqLwoJaW50ZWxf Y3J0Yy0+cGlwZSA9IHBpcGU7CglpbnRlbF9jcnRjLT5wbGFuZSA9IHBpcGU7CglpZiAoSVNfTU9C SUxFKGRldikgJiYgSVNfR0VOMyhkZXYpKSB7CgkJRFJNX0RFQlVHX0tNUygic3dhcHBpbmcgcGlw ZXMgJiBwbGFuZXMgZm9yIEZCQ1xuIik7CgkJaW50ZWxfY3J0Yy0+cGxhbmUgPSAhcGlwZTsKCX0K CglCVUdfT04ocGlwZSA+PSBBUlJBWV9TSVpFKGRldl9wcml2LT5wbGFuZV90b19jcnRjX21hcHBp bmcpIHx8CgkgICAgICAgZGV2X3ByaXYtPnBsYW5lX3RvX2NydGNfbWFwcGluZ1tpbnRlbF9jcnRj LT5wbGFuZV0gIT0gTlVMTCk7CglkZXZfcHJpdi0+cGxhbmVfdG9fY3J0Y19tYXBwaW5nW2ludGVs X2NydGMtPnBsYW5lXSA9ICZpbnRlbF9jcnRjLT5iYXNlOwoJZGV2X3ByaXYtPnBpcGVfdG9fY3J0 Y19tYXBwaW5nW2ludGVsX2NydGMtPnBpcGVdID0gJmludGVsX2NydGMtPmJhc2U7CgoJLy9pbnRl bF9jcnRjLT5jdXJzb3JfYWRkciA9IDA7CgkvL2ludGVsX2NydGMtPmRwbXNfbW9kZSA9IC0xOwoJ aW50ZWxfY3J0Yy0+YWN0aXZlID0gdHJ1ZTsgLy8gZm9yY2UgdGhlIHBpcGUgb2ZmIG9uIHNldHVw X2luaXRfY29uZmlnCgoJcHJpbnRrKCJpbnRlbF9jcnRjICVwXG4iLCBpbnRlbF9jcnRjKTsKCglp bnRlbF9jcnRjX3Jlc2V0KCZpbnRlbF9jcnRjLT5iYXNlKTsKCglpZiAoSEFTX1BDSF9TUExJVChk ZXYpKSB7CgkJaW50ZWxfaGVscGVyX2Z1bmNzLnByZXBhcmUgPSBpcm9ubGFrZV9jcnRjX3ByZXBh cmU7CgkJaW50ZWxfaGVscGVyX2Z1bmNzLmNvbW1pdCA9IGlyb25sYWtlX2NydGNfY29tbWl0OwoJ fSBlbHNlIHsKCQlpbnRlbF9oZWxwZXJfZnVuY3MucHJlcGFyZSA9IGk5eHhfY3J0Y19wcmVwYXJl OwoJCWludGVsX2hlbHBlcl9mdW5jcy5jb21taXQgPSBpOXh4X2NydGNfY29tbWl0OwoJfQoKCWRy bV9jcnRjX2hlbHBlcl9hZGQoJmludGVsX2NydGMtPmJhc2UsICZpbnRlbF9oZWxwZXJfZnVuY3Mp OwoKCWludGVsX2NydGMtPmJ1c3kgPSBmYWxzZTsKCglzZXR1cF90aW1lcigmaW50ZWxfY3J0Yy0+ aWRsZV90aW1lciwgaW50ZWxfY3J0Y19pZGxlX3RpbWVyLAoJCSAgICAodW5zaWduZWQgbG9uZylp bnRlbF9jcnRjKTsKCglpbnRlbF9zYW5pdGl6ZV9tb2Rlc2V0dGluZyhkZXYsIGludGVsX2NydGMt PnBpcGUsIGludGVsX2NydGMtPnBsYW5lKTsKfQoKaW50IGludGVsX2dldF9waXBlX2Zyb21fY3J0 Y19pZChzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAoJCQkJc3RydWN0IGRybV9m aWxlICpmaWxlKQp7Cglkcm1faTkxNV9wcml2YXRlX3QgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJp dmF0ZTsKCXN0cnVjdCBkcm1faTkxNV9nZXRfcGlwZV9mcm9tX2NydGNfaWQgKnBpcGVfZnJvbV9j cnRjX2lkID0gZGF0YTsKCXN0cnVjdCBkcm1fbW9kZV9vYmplY3QgKmRybW1vZGVfb2JqOwoJc3Ry dWN0IGludGVsX2NydGMgKmNydGM7CgoJaWYgKCFkZXZfcHJpdikgewoJCURSTV9FUlJPUigiY2Fs bGVkIHdpdGggbm8gaW5pdGlhbGl6YXRpb25cbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWRy bW1vZGVfb2JqID0gZHJtX21vZGVfb2JqZWN0X2ZpbmQoZGV2LCBwaXBlX2Zyb21fY3J0Y19pZC0+ Y3J0Y19pZCwKCQkJRFJNX01PREVfT0JKRUNUX0NSVEMpOwoKCWlmICghZHJtbW9kZV9vYmopIHsK CQlEUk1fRVJST1IoIm5vIHN1Y2ggQ1JUQyBpZFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJ Y3J0YyA9IHRvX2ludGVsX2NydGMob2JqX3RvX2NydGMoZHJtbW9kZV9vYmopKTsKCXBpcGVfZnJv bV9jcnRjX2lkLT5waXBlID0gY3J0Yy0+cGlwZTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBp bnRlbF9lbmNvZGVyX2Nsb25lcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgdHlwZV9tYXNr KQp7CglzdHJ1Y3QgaW50ZWxfZW5jb2RlciAqZW5jb2RlcjsKCWludCBpbmRleF9tYXNrID0gMDsK CWludCBlbnRyeSA9IDA7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2Rl X2NvbmZpZy5lbmNvZGVyX2xpc3QsIGJhc2UuaGVhZCkgewoJCWlmICh0eXBlX21hc2sgJiBlbmNv ZGVyLT5jbG9uZV9tYXNrKQoJCQlpbmRleF9tYXNrIHw9ICgxIDw8IGVudHJ5KTsKCQllbnRyeSsr OwoJfQoKCXJldHVybiBpbmRleF9tYXNrOwp9CgpzdGF0aWMgYm9vbCBoYXNfZWRwX2Eoc3RydWN0 IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0g ZGV2LT5kZXZfcHJpdmF0ZTsKCglpZiAoIUlTX01PQklMRShkZXYpKQoJCXJldHVybiBmYWxzZTsK CglpZiAoKEk5MTVfUkVBRChEUF9BKSAmIERQX0RFVEVDVEVEKSA9PSAwKQoJCXJldHVybiBmYWxz ZTsKCglpZiAoSVNfR0VONShkZXYpICYmCgkgICAgKEk5MTVfUkVBRChJTEtfRElTUExBWV9DSElD S0VOX0ZVU0VTKSAmIElMS19lRFBfQV9ESVNBQkxFKSkKCQlyZXR1cm4gZmFsc2U7CgoJcmV0dXJu IHRydWU7Cn0KCnN0YXRpYyB2b2lkIGludGVsX3NldHVwX291dHB1dHMoc3RydWN0IGRybV9kZXZp Y2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZf cHJpdmF0ZTsKCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyOwoJYm9vbCBkcGRfaXNfZWRw ID0gZmFsc2U7Cglib29sIGhhc19sdmRzID0gZmFsc2U7CgoJaWYgKElTX01PQklMRShkZXYpICYm ICFJU19JODMwKGRldikpCgkJaGFzX2x2ZHMgPSBpbnRlbF9sdmRzX2luaXQoZGV2KTsKCWlmICgh aGFzX2x2ZHMgJiYgIUhBU19QQ0hfU1BMSVQoZGV2KSkgewoJCS8qIGRpc2FibGUgdGhlIHBhbmVs IGZpdHRlciBvbiBldmVyeXRoaW5nIGJ1dCBMVkRTICovCgkJSTkxNV9XUklURShQRklUX0NPTlRS T0wsIDApOwoJfQoKCWlmIChIQVNfUENIX1NQTElUKGRldikpIHsKCQlkcGRfaXNfZWRwID0gaW50 ZWxfZHBkX2lzX2VkcChkZXYpOwoKCQlpZiAoaGFzX2VkcF9hKGRldikpCgkJCWludGVsX2RwX2lu aXQoZGV2LCBEUF9BKTsKCgkJaWYgKGRwZF9pc19lZHAgJiYgKEk5MTVfUkVBRChQQ0hfRFBfRCkg JiBEUF9ERVRFQ1RFRCkpCgkJCWludGVsX2RwX2luaXQoZGV2LCBQQ0hfRFBfRCk7Cgl9CgoJaW50 ZWxfY3J0X2luaXQoZGV2KTsKCglpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CgkJaW50IGZvdW5k OwoKCQlpZiAoSTkxNV9SRUFEKEhETUlCKSAmIFBPUlRfREVURUNURUQpIHsKCQkJLyogUENIIFNE Vk9CIG11bHRpcGxleCB3aXRoIEhETUlCICovCgkJCWZvdW5kID0gaW50ZWxfc2R2b19pbml0KGRl diwgUENIX1NEVk9CKTsKCQkJaWYgKCFmb3VuZCkKCQkJCWludGVsX2hkbWlfaW5pdChkZXYsIEhE TUlCKTsKCQkJaWYgKCFmb3VuZCAmJiAoSTkxNV9SRUFEKFBDSF9EUF9CKSAmIERQX0RFVEVDVEVE KSkKCQkJCWludGVsX2RwX2luaXQoZGV2LCBQQ0hfRFBfQik7CgkJfQoKCQlpZiAoSTkxNV9SRUFE KEhETUlDKSAmIFBPUlRfREVURUNURUQpCgkJCWludGVsX2hkbWlfaW5pdChkZXYsIEhETUlDKTsK CgkJaWYgKEk5MTVfUkVBRChIRE1JRCkgJiBQT1JUX0RFVEVDVEVEKQoJCQlpbnRlbF9oZG1pX2lu aXQoZGV2LCBIRE1JRCk7CgoJCWlmIChJOTE1X1JFQUQoUENIX0RQX0MpICYgRFBfREVURUNURUQp CgkJCWludGVsX2RwX2luaXQoZGV2LCBQQ0hfRFBfQyk7CgoJCWlmICghZHBkX2lzX2VkcCAmJiAo STkxNV9SRUFEKFBDSF9EUF9EKSAmIERQX0RFVEVDVEVEKSkKCQkJaW50ZWxfZHBfaW5pdChkZXYs IFBDSF9EUF9EKTsKCgl9IGVsc2UgaWYgKFNVUFBPUlRTX0RJR0lUQUxfT1VUUFVUUyhkZXYpKSB7 CgkJYm9vbCBmb3VuZCA9IGZhbHNlOwoKCQlpZiAoSTkxNV9SRUFEKFNEVk9CKSAmIFNEVk9fREVU RUNURUQpIHsKCQkJRFJNX0RFQlVHX0tNUygicHJvYmluZyBTRFZPQlxuIik7CgkJCWZvdW5kID0g aW50ZWxfc2R2b19pbml0KGRldiwgU0RWT0IpOwoJCQlpZiAoIWZvdW5kICYmIFNVUFBPUlRTX0lO VEVHUkFURURfSERNSShkZXYpKSB7CgkJCQlEUk1fREVCVUdfS01TKCJwcm9iaW5nIEhETUkgb24g U0RWT0JcbiIpOwoJCQkJaW50ZWxfaGRtaV9pbml0KGRldiwgU0RWT0IpOwoJCQl9CgoJCQlpZiAo IWZvdW5kICYmIFNVUFBPUlRTX0lOVEVHUkFURURfRFAoZGV2KSkgewoJCQkJRFJNX0RFQlVHX0tN UygicHJvYmluZyBEUF9CXG4iKTsKCQkJCWludGVsX2RwX2luaXQoZGV2LCBEUF9CKTsKCQkJfQoJ CX0KCgkJLyogQmVmb3JlIEc0WCBTRFZPQyBkb2Vzbid0IGhhdmUgaXRzIG93biBkZXRlY3QgcmVn aXN0ZXIgKi8KCgkJaWYgKEk5MTVfUkVBRChTRFZPQikgJiBTRFZPX0RFVEVDVEVEKSB7CgkJCURS TV9ERUJVR19LTVMoInByb2JpbmcgU0RWT0NcbiIpOwoJCQlmb3VuZCA9IGludGVsX3Nkdm9faW5p dChkZXYsIFNEVk9DKTsKCQl9CgoJCWlmICghZm91bmQgJiYgKEk5MTVfUkVBRChTRFZPQykgJiBT RFZPX0RFVEVDVEVEKSkgewoKCQkJaWYgKFNVUFBPUlRTX0lOVEVHUkFURURfSERNSShkZXYpKSB7 CgkJCQlEUk1fREVCVUdfS01TKCJwcm9iaW5nIEhETUkgb24gU0RWT0NcbiIpOwoJCQkJaW50ZWxf aGRtaV9pbml0KGRldiwgU0RWT0MpOwoJCQl9CgkJCWlmIChTVVBQT1JUU19JTlRFR1JBVEVEX0RQ KGRldikpIHsKCQkJCURSTV9ERUJVR19LTVMoInByb2JpbmcgRFBfQ1xuIik7CgkJCQlpbnRlbF9k cF9pbml0KGRldiwgRFBfQyk7CgkJCX0KCQl9CgoJCWlmIChTVVBQT1JUU19JTlRFR1JBVEVEX0RQ KGRldikgJiYKCQkgICAgKEk5MTVfUkVBRChEUF9EKSAmIERQX0RFVEVDVEVEKSkgewoJCQlEUk1f REVCVUdfS01TKCJwcm9iaW5nIERQX0RcbiIpOwoJCQlpbnRlbF9kcF9pbml0KGRldiwgRFBfRCk7 CgkJfQoJfSBlbHNlIGlmIChJU19HRU4yKGRldikpCgkJaW50ZWxfZHZvX2luaXQoZGV2KTsKCglp ZiAoU1VQUE9SVFNfVFYoZGV2KSkKCQlpbnRlbF90dl9pbml0KGRldik7CgoJbGlzdF9mb3JfZWFj aF9lbnRyeShlbmNvZGVyLCAmZGV2LT5tb2RlX2NvbmZpZy5lbmNvZGVyX2xpc3QsIGJhc2UuaGVh ZCkgewoJCWVuY29kZXItPmJhc2UucG9zc2libGVfY3J0Y3MgPSBlbmNvZGVyLT5jcnRjX21hc2s7 CgkJZW5jb2Rlci0+YmFzZS5wb3NzaWJsZV9jbG9uZXMgPQoJCQlpbnRlbF9lbmNvZGVyX2Nsb25l cyhkZXYsIGVuY29kZXItPmNsb25lX21hc2spOwoJfQoKCWludGVsX3BhbmVsX3NldHVwX2JhY2ts aWdodChkZXYpOwp9CgpzdGF0aWMgdm9pZCBpbnRlbF91c2VyX2ZyYW1lYnVmZmVyX2Rlc3Ryb3ko c3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIpCnsKCXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAq aW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZlcihmYik7CgoJZHJtX2ZyYW1lYnVmZmVyX2Ns ZWFudXAoZmIpOwoJZHJtX2dlbV9vYmplY3RfdW5yZWZlcmVuY2VfdW5sb2NrZWQoJmludGVsX2Zi LT5vYmotPmJhc2UpOwoKCWtmcmVlKGludGVsX2ZiKTsKfQoKc3RhdGljIGludCBpbnRlbF91c2Vy X2ZyYW1lYnVmZmVyX2NyZWF0ZV9oYW5kbGUoc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqZmIsCgkJ CQkJCXN0cnVjdCBkcm1fZmlsZSAqZmlsZSwKCQkJCQkJdW5zaWduZWQgaW50ICpoYW5kbGUpCnsK CXN0cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIgPSB0b19pbnRlbF9mcmFtZWJ1ZmZl cihmYik7CglzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gaW50ZWxfZmItPm9iajsK CglyZXR1cm4gZHJtX2dlbV9oYW5kbGVfY3JlYXRlKGZpbGUsICZvYmotPmJhc2UsIGhhbmRsZSk7 Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2ZyYW1lYnVmZmVyX2Z1bmNzIGludGVsX2ZiX2Z1 bmNzID0gewoJLmRlc3Ryb3kgPSBpbnRlbF91c2VyX2ZyYW1lYnVmZmVyX2Rlc3Ryb3ksCgkuY3Jl YXRlX2hhbmRsZSA9IGludGVsX3VzZXJfZnJhbWVidWZmZXJfY3JlYXRlX2hhbmRsZSwKfTsKCmlu dCBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCgkJCSAgIHN0 cnVjdCBpbnRlbF9mcmFtZWJ1ZmZlciAqaW50ZWxfZmIsCgkJCSAgIHN0cnVjdCBkcm1fbW9kZV9m Yl9jbWQgKm1vZGVfY21kLAoJCQkgICBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQp7 CglpbnQgcmV0OwoKCWlmIChvYmotPnRpbGluZ19tb2RlID09IEk5MTVfVElMSU5HX1kpCgkJcmV0 dXJuIC1FSU5WQUw7CgoJaWYgKG1vZGVfY21kLT5waXRjaCAmIDYzKQoJCXJldHVybiAtRUlOVkFM OwoKCXN3aXRjaCAobW9kZV9jbWQtPmJwcCkgewoJY2FzZSA4OgoJY2FzZSAxNjoKCWNhc2UgMjQ6 CgljYXNlIDMyOgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCglyZXQg PSBkcm1fZnJhbWVidWZmZXJfaW5pdChkZXYsICZpbnRlbF9mYi0+YmFzZSwgJmludGVsX2ZiX2Z1 bmNzKTsKCWlmIChyZXQpIHsKCQlEUk1fRVJST1IoImZyYW1lYnVmZmVyIGluaXQgZmFpbGVkICVk XG4iLCByZXQpOwoJCXJldHVybiByZXQ7Cgl9CgoJZHJtX2hlbHBlcl9tb2RlX2ZpbGxfZmJfc3Ry dWN0KCZpbnRlbF9mYi0+YmFzZSwgbW9kZV9jbWQpOwoJaW50ZWxfZmItPm9iaiA9IG9iajsKCXJl dHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IGRybV9mcmFtZWJ1ZmZlciAqCmludGVsX3VzZXJfZnJh bWVidWZmZXJfY3JlYXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsCgkJCSAgICAgIHN0cnVjdCBk cm1fZmlsZSAqZmlscCwKCQkJICAgICAgc3RydWN0IGRybV9tb2RlX2ZiX2NtZCAqbW9kZV9jbWQp CnsKCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CglzdHJ1Y3QgaW50ZWxfZnJhbWVi dWZmZXIgKmludGVsX2ZiOwoJaW50IHJldDsKCglvYmogPSB0b19pbnRlbF9ibyhkcm1fZ2VtX29i amVjdF9sb29rdXAoZGV2LCBmaWxwLCBtb2RlX2NtZC0+aGFuZGxlKSk7CglpZiAoIW9iaikKCQly ZXR1cm4gRVJSX1BUUigtRU5PRU5UKTsKCglpbnRlbF9mYiA9IGt6YWxsb2Moc2l6ZW9mKCppbnRl bF9mYiksIEdGUF9LRVJORUwpOwoJaWYgKCFpbnRlbF9mYikKCQlyZXR1cm4gRVJSX1BUUigtRU5P TUVNKTsKCglyZXQgPSBpbnRlbF9mcmFtZWJ1ZmZlcl9pbml0KGRldiwgaW50ZWxfZmIsIG1vZGVf Y21kLCBvYmopOwoJaWYgKHJldCkgewoJCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlX3VubG9j a2VkKCZvYmotPmJhc2UpOwoJCWtmcmVlKGludGVsX2ZiKTsKCQlyZXR1cm4gRVJSX1BUUihyZXQp OwoJfQoKCXJldHVybiAmaW50ZWxfZmItPmJhc2U7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3QgZHJt X21vZGVfY29uZmlnX2Z1bmNzIGludGVsX21vZGVfZnVuY3MgPSB7CgkuZmJfY3JlYXRlID0gaW50 ZWxfdXNlcl9mcmFtZWJ1ZmZlcl9jcmVhdGUsCgkub3V0cHV0X3BvbGxfY2hhbmdlZCA9IGludGVs X2ZiX291dHB1dF9wb2xsX2NoYW5nZWQsCn07CgpzdGF0aWMgc3RydWN0IGRybV9pOTE1X2dlbV9v YmplY3QgKgppbnRlbF9hbGxvY19jb250ZXh0X3BhZ2Uoc3RydWN0IGRybV9kZXZpY2UgKmRldikK ewoJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKmN0eDsKCWludCByZXQ7CgoJY3R4ID0gaTkx NV9nZW1fYWxsb2Nfb2JqZWN0KGRldiwgNDA5Nik7CglpZiAoIWN0eCkgewoJCURSTV9ERUJVRygi ZmFpbGVkIHRvIGFsbG9jIHBvd2VyIGNvbnRleHQsIFJDNiBkaXNhYmxlZFxuIik7CgkJcmV0dXJu IE5VTEw7Cgl9CgoJbXV0ZXhfbG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJcmV0ID0gaTkxNV9n ZW1fb2JqZWN0X3BpbihjdHgsIDQwOTYsIHRydWUpOwoJaWYgKHJldCkgewoJCURSTV9FUlJPUigi ZmFpbGVkIHRvIHBpbiBwb3dlciBjb250ZXh0OiAlZFxuIiwgcmV0KTsKCQlnb3RvIGVycl91bnJl ZjsKCX0KCglyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4oY3R4LCAxKTsK CWlmIChyZXQpIHsKCQlEUk1fRVJST1IoImZhaWxlZCB0byBzZXQtZG9tYWluIG9uIHBvd2VyIGNv bnRleHQ6ICVkXG4iLCByZXQpOwoJCWdvdG8gZXJyX3VucGluOwoJfQoJbXV0ZXhfdW5sb2NrKCZk ZXYtPnN0cnVjdF9tdXRleCk7CgoJcmV0dXJuIGN0eDsKCmVycl91bnBpbjoKCWk5MTVfZ2VtX29i amVjdF91bnBpbihjdHgpOwplcnJfdW5yZWY6Cglkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgm Y3R4LT5iYXNlKTsKCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoJcmV0dXJuIE5V TEw7Cn0KCmJvb2wgaXJvbmxha2Vfc2V0X2RycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTgg dmFsKQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2 YXRlOwoJdTE2IHJndnN3Y3RsOwoKCXJndnN3Y3RsID0gSTkxNV9SRUFEMTYoTUVNU1dDVEwpOwoJ aWYgKHJndnN3Y3RsICYgTUVNQ1RMX0NNRF9TVFMpIHsKCQlEUk1fREVCVUcoImdwdSBidXN5LCBS Q1MgY2hhbmdlIHJlamVjdGVkXG4iKTsKCQlyZXR1cm4gZmFsc2U7IC8qIHN0aWxsIGJ1c3kgd2l0 aCBhbm90aGVyIGNvbW1hbmQgKi8KCX0KCglyZ3Zzd2N0bCA9IChNRU1DVExfQ01EX0NIRlJFUSA8 PCBNRU1DVExfQ01EX1NISUZUKSB8CgkJKHZhbCA8PCBNRU1DVExfRlJFUV9TSElGVCkgfCBNRU1D VExfU0ZDQVZNOwoJSTkxNV9XUklURTE2KE1FTVNXQ1RMLCByZ3Zzd2N0bCk7CglQT1NUSU5HX1JF QUQxNihNRU1TV0NUTCk7CgoJcmd2c3djdGwgfD0gTUVNQ1RMX0NNRF9TVFM7CglJOTE1X1dSSVRF MTYoTUVNU1dDVEwsIHJndnN3Y3RsKTsKCglyZXR1cm4gdHJ1ZTsKfQoKdm9pZCBpcm9ubGFrZV9l bmFibGVfZHJwcyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJdTMyIHJndm1vZGVjdGwgPSBJOTE1 X1JFQUQoTUVNTU9ERUNUTCk7Cgl1OCBmbWF4LCBmbWluLCBmc3RhcnQsIHZzdGFydDsKCgkvKiBF bmFibGUgdGVtcCByZXBvcnRpbmcgKi8KCUk5MTVfV1JJVEUxNihQTU1JU0MsIEk5MTVfUkVBRChQ TU1JU0MpIHwgTUNQUENFX0VOKTsKCUk5MTVfV1JJVEUxNihUU0MxLCBJOTE1X1JFQUQoVFNDMSkg fCBUU0UpOwoKCS8qIDEwMG1zIFJDIGV2YWx1YXRpb24gaW50ZXJ2YWxzICovCglJOTE1X1dSSVRF KFJDVVBFSSwgMTAwMDAwKTsKCUk5MTVfV1JJVEUoUkNETkVJLCAxMDAwMDApOwoKCS8qIFNldCBt YXgvbWluIHRocmVzaG9sZHMgdG8gOTBtcyBhbmQgODBtcyByZXNwZWN0aXZlbHkgKi8KCUk5MTVf V1JJVEUoUkNCTUFYQVZHLCA5MDAwMCk7CglJOTE1X1dSSVRFKFJDQk1JTkFWRywgODAwMDApOwoK CUk5MTVfV1JJVEUoTUVNSUhZU1QsIDEpOwoKCS8qIFNldCB1cCBtaW4sIG1heCwgYW5kIGN1ciBm b3IgaW50ZXJydXB0IGhhbmRsaW5nICovCglmbWF4ID0gKHJndm1vZGVjdGwgJiBNRU1NT0RFX0ZN QVhfTUFTSykgPj4gTUVNTU9ERV9GTUFYX1NISUZUOwoJZm1pbiA9IChyZ3Ztb2RlY3RsICYgTUVN TU9ERV9GTUlOX01BU0spOwoJZnN0YXJ0ID0gKHJndm1vZGVjdGwgJiBNRU1NT0RFX0ZTVEFSVF9N QVNLKSA+PgoJCU1FTU1PREVfRlNUQVJUX1NISUZUOwoKCXZzdGFydCA9IChJOTE1X1JFQUQoUFhW RlJFUV9CQVNFICsgKGZzdGFydCAqIDQpKSAmIFBYVkZSRVFfUFhfTUFTSykgPj4KCQlQWFZGUkVR X1BYX1NISUZUOwoKCWRldl9wcml2LT5mbWF4ID0gZm1heDsgLyogSVBTIGNhbGxiYWNrIHdpbGwg aW5jcmVhc2UgdGhpcyAqLwoJZGV2X3ByaXYtPmZzdGFydCA9IGZzdGFydDsKCglkZXZfcHJpdi0+ bWF4X2RlbGF5ID0gZnN0YXJ0OwoJZGV2X3ByaXYtPm1pbl9kZWxheSA9IGZtaW47CglkZXZfcHJp di0+Y3VyX2RlbGF5ID0gZnN0YXJ0OwoKCURSTV9ERUJVR19EUklWRVIoImZtYXg6ICVkLCBmbWlu OiAlZCwgZnN0YXJ0OiAlZFxuIiwKCQkJIGZtYXgsIGZtaW4sIGZzdGFydCk7CgoJSTkxNV9XUklU RShNRU1JTlRSRU4sIE1FTUlOVF9DWF9TVVBSX0VOIHwgTUVNSU5UX0VWQUxfQ0hHX0VOKTsKCgkv KgoJICogSW50ZXJydXB0cyB3aWxsIGJlIGVuYWJsZWQgaW4gaXJvbmxha2VfaXJxX3Bvc3RpbnN0 YWxsCgkgKi8KCglJOTE1X1dSSVRFKFZJRFNUQVJULCB2c3RhcnQpOwoJUE9TVElOR19SRUFEKFZJ RFNUQVJUKTsKCglyZ3Ztb2RlY3RsIHw9IE1FTU1PREVfU1dNT0RFX0VOOwoJSTkxNV9XUklURShN RU1NT0RFQ1RMLCByZ3Ztb2RlY3RsKTsKCglpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChNRU1TV0NU TCkgJiBNRU1DVExfQ01EX1NUUykgPT0gMCwgMTApKQoJCURSTV9FUlJPUigic3R1Y2sgdHJ5aW5n IHRvIGNoYW5nZSBwZXJmIG1vZGVcbiIpOwoJbXNsZWVwKDEpOwoKCWlyb25sYWtlX3NldF9kcnBz KGRldiwgZnN0YXJ0KTsKCglkZXZfcHJpdi0+bGFzdF9jb3VudDEgPSBJOTE1X1JFQUQoMHgxMTJl NCkgKyBJOTE1X1JFQUQoMHgxMTJlOCkgKwoJCUk5MTVfUkVBRCgweDExMmUwKTsKCWRldl9wcml2 LT5sYXN0X3RpbWUxID0gamlmZmllc190b19tc2VjcyhqaWZmaWVzKTsKCWRldl9wcml2LT5sYXN0 X2NvdW50MiA9IEk5MTVfUkVBRCgweDExMmY0KTsKCWdldHJhd21vbm90b25pYygmZGV2X3ByaXYt Pmxhc3RfdGltZTIpOwp9Cgp2b2lkIGlyb25sYWtlX2Rpc2FibGVfZHJwcyhzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRl dl9wcml2YXRlOwoJdTE2IHJndnN3Y3RsID0gSTkxNV9SRUFEMTYoTUVNU1dDVEwpOwoKCS8qIEFj ayBpbnRlcnJ1cHRzLCBkaXNhYmxlIEVGQyBpbnRlcnJ1cHQgKi8KCUk5MTVfV1JJVEUoTUVNSU5U UkVOLCBJOTE1X1JFQUQoTUVNSU5UUkVOKSAmIH5NRU1JTlRfRVZBTF9DSEdfRU4pOwoJSTkxNV9X UklURShNRU1JTlRSU1RTLCBNRU1JTlRfRVZBTF9DSEcpOwoJSTkxNV9XUklURShERUlFUiwgSTkx NV9SRUFEKERFSUVSKSAmIH5ERV9QQ1VfRVZFTlQpOwoJSTkxNV9XUklURShERUlJUiwgREVfUENV X0VWRU5UKTsKCUk5MTVfV1JJVEUoREVJTVIsIEk5MTVfUkVBRChERUlNUikgfCBERV9QQ1VfRVZF TlQpOwoKCS8qIEdvIGJhY2sgdG8gdGhlIHN0YXJ0aW5nIGZyZXF1ZW5jeSAqLwoJaXJvbmxha2Vf c2V0X2RycHMoZGV2LCBkZXZfcHJpdi0+ZnN0YXJ0KTsKCW1zbGVlcCgxKTsKCXJndnN3Y3RsIHw9 IE1FTUNUTF9DTURfU1RTOwoJSTkxNV9XUklURShNRU1TV0NUTCwgcmd2c3djdGwpOwoJbXNsZWVw KDEpOwoKfQoKdm9pZCBnZW42X3NldF9ycHMoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgdTggdmFs KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRl OwoJdTMyIHN3cmVxOwoKCXN3cmVxID0gKHZhbCAmIDB4M2ZmKSA8PCAyNTsKCUk5MTVfV1JJVEUo R0VONl9SUE5TV1JFUSwgc3dyZXEpOwp9Cgp2b2lkIGdlbjZfZGlzYWJsZV9ycHMoc3RydWN0IGRy bV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2 LT5kZXZfcHJpdmF0ZTsKCglJOTE1X1dSSVRFKEdFTjZfUlBOU1dSRVEsIDEgPDwgMzEpOwoJSTkx NV9XUklURShHRU42X1BNSU5UUk1TSywgMHhmZmZmZmZmZik7CglJOTE1X1dSSVRFKEdFTjZfUE1J RVIsIDApOwoJSTkxNV9XUklURShHRU42X1BNSUlSLCBJOTE1X1JFQUQoR0VONl9QTUlJUikpOwp9 CgpzdGF0aWMgdW5zaWduZWQgbG9uZyBpbnRlbF9weGZyZXEodTMyIHZpZGZyZXEpCnsKCXVuc2ln bmVkIGxvbmcgZnJlcTsKCWludCBkaXYgPSAodmlkZnJlcSAmIDB4M2YwMDAwKSA+PiAxNjsKCWlu dCBwb3N0ID0gKHZpZGZyZXEgJiAweDMwMDApID4+IDEyOwoJaW50IHByZSA9ICh2aWRmcmVxICYg MHg3KTsKCglpZiAoIXByZSkKCQlyZXR1cm4gMDsKCglmcmVxID0gKChkaXYgKiAxMzMzMzMpIC8g KCgxPDxwb3N0KSAqIHByZSkpOwoKCXJldHVybiBmcmVxOwp9Cgp2b2lkIGludGVsX2luaXRfZW1v bihzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoJdTMyIGxjZnVzZTsKCXU4IHB4d1sxNl07CglpbnQg aTsKCgkvKiBEaXNhYmxlIHRvIHByb2dyYW0gKi8KCUk5MTVfV1JJVEUoRUNSLCAwKTsKCVBPU1RJ TkdfUkVBRChFQ1IpOwoKCS8qIFByb2dyYW0gZW5lcmd5IHdlaWdodHMgZm9yIHZhcmlvdXMgZXZl bnRzICovCglJOTE1X1dSSVRFKFNERVcsIDB4MTUwNDBkMDApOwoJSTkxNV9XUklURShDU0lFVzAs IDB4MDA3ZjAwMDApOwoJSTkxNV9XUklURShDU0lFVzEsIDB4MWUyMjAwMDQpOwoJSTkxNV9XUklU RShDU0lFVzIsIDB4MDQwMDAwMDQpOwoKCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspCgkJSTkxNV9X UklURShQRVcgKyAoaSAqIDQpLCAwKTsKCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCgkJSTkxNV9X UklURShERVcgKyAoaSAqIDQpLCAwKTsKCgkvKiBQcm9ncmFtIFAtc3RhdGUgd2VpZ2h0cyB0byBh Y2NvdW50IGZvciBmcmVxdWVuY3kgcG93ZXIgYWRqdXN0bWVudCAqLwoJZm9yIChpID0gMDsgaSA8 IDE2OyBpKyspIHsKCQl1MzIgcHh2aWRmcmVxID0gSTkxNV9SRUFEKFBYVkZSRVFfQkFTRSArIChp ICogNCkpOwoJCXVuc2lnbmVkIGxvbmcgZnJlcSA9IGludGVsX3B4ZnJlcShweHZpZGZyZXEpOwoJ CXVuc2lnbmVkIGxvbmcgdmlkID0gKHB4dmlkZnJlcSAmIFBYVkZSRVFfUFhfTUFTSykgPj4KCQkJ UFhWRlJFUV9QWF9TSElGVDsKCQl1bnNpZ25lZCBsb25nIHZhbDsKCgkJdmFsID0gdmlkICogdmlk OwoJCXZhbCAqPSAoZnJlcSAvIDEwMDApOwoJCXZhbCAqPSAyNTU7CgkJdmFsIC89ICgxMjcqMTI3 KjkwMCk7CgkJaWYgKHZhbCA+IDB4ZmYpCgkJCURSTV9FUlJPUigiYmFkIHB4dmFsOiAlbGRcbiIs IHZhbCk7CgkJcHh3W2ldID0gdmFsOwoJfQoJLyogUmVuZGVyIHN0YW5kYnkgc3RhdGVzIGdldCAw IHdlaWdodCAqLwoJcHh3WzE0XSA9IDA7CglweHdbMTVdID0gMDsKCglmb3IgKGkgPSAwOyBpIDwg NDsgaSsrKSB7CgkJdTMyIHZhbCA9IChweHdbaSo0XSA8PCAyNCkgfCAocHh3WyhpKjQpKzFdIDw8 IDE2KSB8CgkJCShweHdbKGkqNCkrMl0gPDwgOCkgfCAocHh3WyhpKjQpKzNdKTsKCQlJOTE1X1dS SVRFKFBYVyArIChpICogNCksIHZhbCk7Cgl9CgoJLyogQWRqdXN0IG1hZ2ljIHJlZ3MgdG8gbWFn aWMgdmFsdWVzIChtb3JlIGV4cGVyaW1lbnRhbCByZXN1bHRzKSAqLwoJSTkxNV9XUklURShPR1cw LCAwKTsKCUk5MTVfV1JJVEUoT0dXMSwgMCk7CglJOTE1X1dSSVRFKEVHMCwgMHgwMDAwN2YwMCk7 CglJOTE1X1dSSVRFKEVHMSwgMHgwMDAwMDAwZSk7CglJOTE1X1dSSVRFKEVHMiwgMHgwMDBlMDAw MCk7CglJOTE1X1dSSVRFKEVHMywgMHg2ODAwMDMwMCk7CglJOTE1X1dSSVRFKEVHNCwgMHg0MjAw MDAwMCk7CglJOTE1X1dSSVRFKEVHNSwgMHgwMDE0MDAzMSk7CglJOTE1X1dSSVRFKEVHNiwgMCk7 CglJOTE1X1dSSVRFKEVHNywgMCk7CgoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykKCQlJOTE1X1dS SVRFKFBYV0wgKyAoaSAqIDQpLCAwKTsKCgkvKiBFbmFibGUgUE1PTiArIHNlbGVjdCBldmVudHMg Ki8KCUk5MTVfV1JJVEUoRUNSLCAweDgwMDAwMDE5KTsKCglsY2Z1c2UgPSBJOTE1X1JFQUQoTENG VVNFMDIpOwoKCWRldl9wcml2LT5jb3JyID0gKGxjZnVzZSAmIExDRlVTRV9ISVZfTUFTSyk7Cn0K CnZvaWQgZ2VuNl9lbmFibGVfcnBzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK ewoJdTMyIHJwX3N0YXRlX2NhcCA9IEk5MTVfUkVBRChHRU42X1JQX1NUQVRFX0NBUCk7Cgl1MzIg Z3RfcGVyZl9zdGF0dXMgPSBJOTE1X1JFQUQoR0VONl9HVF9QRVJGX1NUQVRVUyk7Cgl1MzIgcGN1 X21ib3g7CglpbnQgY3VyX2ZyZXEsIG1pbl9mcmVxLCBtYXhfZnJlcTsKCWludCBpOwoKCS8qIEhl cmUgYmVnaW5zIGEgbWFnaWMgc2VxdWVuY2Ugb2YgcmVnaXN0ZXIgd3JpdGVzIHRvIGVuYWJsZQoJ ICogYXV0by1kb3duY2xvY2tpbmcuCgkgKgoJICogUGVyaGFwcyB0aGVyZSBtaWdodCBiZSBzb21l IHZhbHVlIGluIGV4cG9zaW5nIHRoZXNlIHRvCgkgKiB1c2Vyc3BhY2UuLi4KCSAqLwoJSTkxNV9X UklURShHRU42X1JDX1NUQVRFLCAwKTsKCV9fZ2VuNl9mb3JjZV93YWtlX2dldChkZXZfcHJpdik7 CgoJLyogZGlzYWJsZSB0aGUgY291bnRlcnMgYW5kIHNldCBkZXRlcm1pbmlzdGljIHRocmVzaG9s ZHMgKi8KCUk5MTVfV1JJVEUoR0VONl9SQ19DT05UUk9MLCAwKTsKCglJOTE1X1dSSVRFKEdFTjZf UkMxX1dBS0VfUkFURV9MSU1JVCwgMTAwMCA8PCAxNik7CglJOTE1X1dSSVRFKEdFTjZfUkM2X1dB S0VfUkFURV9MSU1JVCwgNDAgPDwgMTYgfCAzMCk7CglJOTE1X1dSSVRFKEdFTjZfUkM2cHBfV0FL RV9SQVRFX0xJTUlULCAzMCk7CglJOTE1X1dSSVRFKEdFTjZfUkNfRVZBTFVBVElPTl9JTlRFUlZB TCwgMTI1MDAwKTsKCUk5MTVfV1JJVEUoR0VONl9SQ19JRExFX0hZU1RFUlNJUywgMjUpOwoKCWZv ciAoaSA9IDA7IGkgPCBJOTE1X05VTV9SSU5HUzsgaSsrKQoJCUk5MTVfV1JJVEUoUklOR19NQVhf SURMRShkZXZfcHJpdi0+cmluZ1tpXS5tbWlvX2Jhc2UpLCAxMCk7CgoJSTkxNV9XUklURShHRU42 X1JDX1NMRUVQLCAwKTsKCUk5MTVfV1JJVEUoR0VONl9SQzFlX1RIUkVTSE9MRCwgMTAwMCk7CglJ OTE1X1dSSVRFKEdFTjZfUkM2X1RIUkVTSE9MRCwgNTAwMDApOwoJSTkxNV9XUklURShHRU42X1JD NnBfVEhSRVNIT0xELCAxMDAwMDApOwoJSTkxNV9XUklURShHRU42X1JDNnBwX1RIUkVTSE9MRCwg NjQwMDApOyAvKiB1bnVzZWQgKi8KCglJOTE1X1dSSVRFKEdFTjZfUkNfQ09OVFJPTCwKCQkgICBH RU42X1JDX0NUTF9SQzZwX0VOQUJMRSB8CgkJICAgR0VONl9SQ19DVExfUkM2X0VOQUJMRSB8CgkJ ICAgR0VONl9SQ19DVExfRUlfTU9ERSgxKSB8CgkJICAgR0VONl9SQ19DVExfSFdfRU5BQkxFKTsK CglJOTE1X1dSSVRFKEdFTjZfUlBOU1dSRVEsCgkJICAgR0VONl9GUkVRVUVOQ1koMTApIHwKCQkg ICBHRU42X09GRlNFVCgwKSB8CgkJICAgR0VONl9BR0dSRVNTSVZFX1RVUkJPKTsKCUk5MTVfV1JJ VEUoR0VONl9SQ19WSURFT19GUkVRLAoJCSAgIEdFTjZfRlJFUVVFTkNZKDEyKSk7CgoJSTkxNV9X UklURShHRU42X1JQX0RPV05fVElNRU9VVCwgMTAwMDAwMCk7CglJOTE1X1dSSVRFKEdFTjZfUlBf SU5URVJSVVBUX0xJTUlUUywKCQkgICAxOCA8PCAyNCB8CgkJICAgNiA8PCAxNik7CglJOTE1X1dS SVRFKEdFTjZfUlBfVVBfVEhSRVNIT0xELCA5MDAwMCk7CglJOTE1X1dSSVRFKEdFTjZfUlBfRE9X Tl9USFJFU0hPTEQsIDEwMDAwMCk7CglJOTE1X1dSSVRFKEdFTjZfUlBfVVBfRUksIDEwMDAwMCk7 CglJOTE1X1dSSVRFKEdFTjZfUlBfRE9XTl9FSSwgMzAwMDAwKTsKCUk5MTVfV1JJVEUoR0VONl9S UF9JRExFX0hZU1RFUlNJUywgMTApOwoJSTkxNV9XUklURShHRU42X1JQX0NPTlRST0wsCgkJICAg R0VONl9SUF9NRURJQV9UVVJCTyB8CgkJICAgR0VONl9SUF9VU0VfTk9STUFMX0ZSRVEgfAoJCSAg IEdFTjZfUlBfTUVESUFfSVNfR0ZYIHwKCQkgICBHRU42X1JQX0VOQUJMRSB8CgkJICAgR0VONl9S UF9VUF9CVVNZX01BWCB8CgkJICAgR0VONl9SUF9ET1dOX0JVU1lfTUlOKTsKCglpZiAod2FpdF9m b3IoKEk5MTVfUkVBRChHRU42X1BDT0RFX01BSUxCT1gpICYgR0VONl9QQ09ERV9SRUFEWSkgPT0g MCwKCQkgICAgIDUwMCkpCgkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIHBjb2RlIG1h aWxib3ggdG8gYmVjb21lIGlkbGVcbiIpOwoKCUk5MTVfV1JJVEUoR0VONl9QQ09ERV9EQVRBLCAw KTsKCUk5MTVfV1JJVEUoR0VONl9QQ09ERV9NQUlMQk9YLAoJCSAgIEdFTjZfUENPREVfUkVBRFkg fAoJCSAgIEdFTjZfUENPREVfV1JJVEVfTUlOX0ZSRVFfVEFCTEUpOwoJaWYgKHdhaXRfZm9yKChJ OTE1X1JFQUQoR0VONl9QQ09ERV9NQUlMQk9YKSAmIEdFTjZfUENPREVfUkVBRFkpID09IDAsCgkJ ICAgICA1MDApKQoJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBwY29kZSBtYWlsYm94 IHRvIGZpbmlzaFxuIik7CgoJbWluX2ZyZXEgPSAocnBfc3RhdGVfY2FwICYgMHhmZjAwMDApID4+ IDE2OwoJbWF4X2ZyZXEgPSBycF9zdGF0ZV9jYXAgJiAweGZmOwoJY3VyX2ZyZXEgPSAoZ3RfcGVy Zl9zdGF0dXMgJiAweGZmMDApID4+IDg7CgoJLyogQ2hlY2sgZm9yIG92ZXJjbG9jayBzdXBwb3J0 ICovCglpZiAod2FpdF9mb3IoKEk5MTVfUkVBRChHRU42X1BDT0RFX01BSUxCT1gpICYgR0VONl9Q Q09ERV9SRUFEWSkgPT0gMCwKCQkgICAgIDUwMCkpCgkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRp bmcgZm9yIHBjb2RlIG1haWxib3ggdG8gYmVjb21lIGlkbGVcbiIpOwoJSTkxNV9XUklURShHRU42 X1BDT0RFX01BSUxCT1gsIEdFTjZfUkVBRF9PQ19QQVJBTVMpOwoJcGN1X21ib3ggPSBJOTE1X1JF QUQoR0VONl9QQ09ERV9EQVRBKTsKCWlmICh3YWl0X2ZvcigoSTkxNV9SRUFEKEdFTjZfUENPREVf TUFJTEJPWCkgJiBHRU42X1BDT0RFX1JFQURZKSA9PSAwLAoJCSAgICAgNTAwKSkKCQlEUk1fRVJS T1IoInRpbWVvdXQgd2FpdGluZyBmb3IgcGNvZGUgbWFpbGJveCB0byBmaW5pc2hcbiIpOwoJaWYg KHBjdV9tYm94ICYgKDE8PDMxKSkgeyAvKiBPQyBzdXBwb3J0ZWQgKi8KCQltYXhfZnJlcSA9IHBj dV9tYm94ICYgMHhmZjsKCQlEUk1fREVCVUdfRFJJVkVSKCJvdmVyY2xvY2tpbmcgc3VwcG9ydGVk LCBhZGp1c3RpbmcgZnJlcXVlbmN5IG1heCB0byAlZE1IelxuIiwgcGN1X21ib3ggKiAxMDApOwoJ fQoKCS8qIEluIHVuaXRzIG9mIDEwME1IeiAqLwoJZGV2X3ByaXYtPm1heF9kZWxheSA9IG1heF9m cmVxOwoJZGV2X3ByaXYtPm1pbl9kZWxheSA9IG1pbl9mcmVxOwoJZGV2X3ByaXYtPmN1cl9kZWxh eSA9IGN1cl9mcmVxOwoKCS8qIHJlcXVpcmVzIE1TSSBlbmFibGVkICovCglJOTE1X1dSSVRFKEdF TjZfUE1JRVIsCgkJICAgR0VONl9QTV9NQk9YX0VWRU5UIHwKCQkgICBHRU42X1BNX1RIRVJNQUxf RVZFTlQgfAoJCSAgIEdFTjZfUE1fUlBfRE9XTl9USU1FT1VUIHwKCQkgICBHRU42X1BNX1JQX1VQ X1RIUkVTSE9MRCB8CgkJICAgR0VONl9QTV9SUF9ET1dOX1RIUkVTSE9MRCB8CgkJICAgR0VONl9Q TV9SUF9VUF9FSV9FWFBJUkVEIHwKCQkgICBHRU42X1BNX1JQX0RPV05fRUlfRVhQSVJFRCk7CglJ OTE1X1dSSVRFKEdFTjZfUE1JTVIsIDApOwoJLyogZW5hYmxlIGFsbCBQTSBpbnRlcnJ1cHRzICov CglJOTE1X1dSSVRFKEdFTjZfUE1JTlRSTVNLLCAwKTsKCglfX2dlbjZfZm9yY2Vfd2FrZV9wdXQo ZGV2X3ByaXYpOwp9Cgp2b2lkIGludGVsX2VuYWJsZV9jbG9ja19nYXRpbmcoc3RydWN0IGRybV9k ZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5k ZXZfcHJpdmF0ZTsKCgkvKgoJICogRGlzYWJsZSBjbG9jayBnYXRpbmcgcmVwb3J0ZWQgdG8gd29y ayBpbmNvcnJlY3RseSBhY2NvcmRpbmcgdG8gdGhlCgkgKiBzcGVjcywgYnV0IGVuYWJsZSBhcyBt dWNoIGVsc2UgYXMgd2UgY2FuLgoJICovCglpZiAoSEFTX1BDSF9TUExJVChkZXYpKSB7CgkJdWlu dDMyX3QgZHNwY2xrX2dhdGUgPSBWUkhVTklUX0NMT0NLX0dBVEVfRElTQUJMRTsKCgkJaWYgKElT X0dFTjUoZGV2KSkgewoJCQkvKiBSZXF1aXJlZCBmb3IgRkJDICovCgkJCWRzcGNsa19nYXRlIHw9 IERQRkNVTklUX0NMT0NLX0dBVEVfRElTQUJMRSB8CgkJCQlEUEZDUlVOSVRfQ0xPQ0tfR0FURV9E SVNBQkxFIHwKCQkJCURQRkRVTklUX0NMT0NLX0dBVEVfRElTQUJMRTsKCQkJLyogUmVxdWlyZWQg Zm9yIEN4U1IgKi8KCQkJZHNwY2xrX2dhdGUgfD0gRFBBUkJVTklUX0NMT0NLX0dBVEVfRElTQUJM RTsKCgkJCUk5MTVfV1JJVEUoUENIXzNEQ0dESVMwLAoJCQkJICAgTUFSSVVOSVRfQ0xPQ0tfR0FU RV9ESVNBQkxFIHwKCQkJCSAgIFNWU01VTklUX0NMT0NLX0dBVEVfRElTQUJMRSk7CgkJCUk5MTVf V1JJVEUoUENIXzNEQ0dESVMxLAoJCQkJICAgVkZNVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOwoJ CX0KCgkJSTkxNV9XUklURShQQ0hfRFNQQ0xLX0dBVEVfRCwgZHNwY2xrX2dhdGUpOwoKCQkvKgoJ CSAqIE9uIEliZXggUGVhayBhbmQgQ291Z2FyIFBvaW50LCB3ZSBuZWVkIHRvIGRpc2FibGUgY2xv Y2sKCQkgKiBnYXRpbmcgZm9yIHRoZSBwYW5lbCBwb3dlciBzZXF1ZW5jZXIgb3IgaXQgd2lsbCBm YWlsIHRvCgkJICogc3RhcnQgdXAgd2hlbiBubyBwb3J0cyBhcmUgYWN0aXZlLgoJCSAqLwoJCUk5 MTVfV1JJVEUoU09VVEhfRFNQQ0xLX0dBVEVfRCwgUENIX0RQTFNVTklUX0NMT0NLX0dBVEVfRElT QUJMRSk7CgoJCS8qCgkJICogQWNjb3JkaW5nIHRvIHRoZSBzcGVjIHRoZSBmb2xsb3dpbmcgYml0 cyBzaG91bGQgYmUgc2V0IGluCgkJICogb3JkZXIgdG8gZW5hYmxlIG1lbW9yeSBzZWxmLXJlZnJl c2gKCQkgKiBUaGUgYml0IDIyLzIxIG9mIDB4NDIwMDQKCQkgKiBUaGUgYml0IDUgb2YgMHg0MjAy MAoJCSAqIFRoZSBiaXQgMTUgb2YgMHg0NTAwMAoJCSAqLwoJCWlmIChJU19HRU41KGRldikpIHsK CQkJSTkxNV9XUklURShJTEtfRElTUExBWV9DSElDS0VOMiwKCQkJCQkoSTkxNV9SRUFEKElMS19E SVNQTEFZX0NISUNLRU4yKSB8CgkJCQkJSUxLX0RQQVJCX0dBVEUgfCBJTEtfVlNEUEZEX0ZVTEwp KTsKCQkJSTkxNV9XUklURShJTEtfRFNQQ0xLX0dBVEUsCgkJCQkJKEk5MTVfUkVBRChJTEtfRFNQ Q0xLX0dBVEUpIHwKCQkJCQkJSUxLX0RQQVJCX0NMS19HQVRFKSk7CgkJCUk5MTVfV1JJVEUoRElT UF9BUkJfQ1RMLAoJCQkJCShJOTE1X1JFQUQoRElTUF9BUkJfQ1RMKSB8CgkJCQkJCURJU1BfRkJD X1dNX0RJUykpOwoJCQlJOTE1X1dSSVRFKFdNM19MUF9JTEssIDApOwoJCQlJOTE1X1dSSVRFKFdN Ml9MUF9JTEssIDApOwoJCQlJOTE1X1dSSVRFKFdNMV9MUF9JTEssIDApOwoJCX0KCQkvKgoJCSAq IEJhc2VkIG9uIHRoZSBkb2N1bWVudCBmcm9tIGhhcmR3YXJlIGd1eXMgdGhlIGZvbGxvd2luZyBi aXRzCgkJICogc2hvdWxkIGJlIHNldCB1bmNvbmRpdGlvbmFsbHkgaW4gb3JkZXIgdG8gZW5hYmxl IEZCQy4KCQkgKiBUaGUgYml0IDIyIG9mIDB4NDIwMDAKCQkgKiBUaGUgYml0IDIyIG9mIDB4NDIw MDQKCQkgKiBUaGUgYml0IDcsOCw5IG9mIDB4NDIwMjAuCgkJICovCgkJaWYgKElTX0lST05MQUtF X00oZGV2KSkgewoJCQlJOTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4xLAoJCQkJICAgSTkx NV9SRUFEKElMS19ESVNQTEFZX0NISUNLRU4xKSB8CgkJCQkgICBJTEtfRkJDUV9ESVMpOwoJCQlJ OTE1X1dSSVRFKElMS19ESVNQTEFZX0NISUNLRU4yLAoJCQkJICAgSTkxNV9SRUFEKElMS19ESVNQ TEFZX0NISUNLRU4yKSB8CgkJCQkgICBJTEtfRFBBUkJfR0FURSk7CgkJCUk5MTVfV1JJVEUoSUxL X0RTUENMS19HQVRFLAoJCQkJICAgSTkxNV9SRUFEKElMS19EU1BDTEtfR0FURSkgfAoJCQkJICAg SUxLX0RQRkNfRElTMSB8CgkJCQkgICBJTEtfRFBGQ19ESVMyIHwKCQkJCSAgIElMS19DTEtfRkJD KTsKCQl9CgoJCUk5MTVfV1JJVEUoSUxLX0RJU1BMQVlfQ0hJQ0tFTjIsCgkJCSAgIEk5MTVfUkVB RChJTEtfRElTUExBWV9DSElDS0VOMikgfAoJCQkgICBJTEtfRUxQSU5fNDA5X1NFTEVDVCk7CgoJ CWlmIChJU19HRU41KGRldikpIHsKCQkJSTkxNV9XUklURShfM0RfQ0hJQ0tFTjIsCgkJCQkgICBf M0RfQ0hJQ0tFTjJfV01fUkVBRF9QSVBFTElORUQgPDwgMTYgfAoJCQkJICAgXzNEX0NISUNLRU4y X1dNX1JFQURfUElQRUxJTkVEKTsKCQl9CgoJCWlmIChJU19HRU42KGRldikpIHsKCQkJSTkxNV9X UklURShXTTNfTFBfSUxLLCAwKTsKCQkJSTkxNV9XUklURShXTTJfTFBfSUxLLCAwKTsKCQkJSTkx NV9XUklURShXTTFfTFBfSUxLLCAwKTsKCgkJCS8qCgkJCSAqIEFjY29yZGluZyB0byB0aGUgc3Bl YyB0aGUgZm9sbG93aW5nIGJpdHMgc2hvdWxkIGJlCgkJCSAqIHNldCBpbiBvcmRlciB0byBlbmFi bGUgbWVtb3J5IHNlbGYtcmVmcmVzaCBhbmQgZmJjOgoJCQkgKiBUaGUgYml0MjEgYW5kIGJpdDIy IG9mIDB4NDIwMDAKCQkJICogVGhlIGJpdDIxIGFuZCBiaXQyMiBvZiAweDQyMDA0CgkJCSAqIFRo ZSBiaXQ1IGFuZCBiaXQ3IG9mIDB4NDIwMjAKCQkJICogVGhlIGJpdDE0IG9mIDB4NzAxODAKCQkJ ICogVGhlIGJpdDE0IG9mIDB4NzExODAKCQkJICovCgkJCUk5MTVfV1JJVEUoSUxLX0RJU1BMQVlf Q0hJQ0tFTjEsCgkJCQkgICBJOTE1X1JFQUQoSUxLX0RJU1BMQVlfQ0hJQ0tFTjEpIHwKCQkJCSAg IElMS19GQkNRX0RJUyB8IElMS19QQUJTVFJFVENIX0RJUyk7CgkJCUk5MTVfV1JJVEUoSUxLX0RJ U1BMQVlfQ0hJQ0tFTjIsCgkJCQkgICBJOTE1X1JFQUQoSUxLX0RJU1BMQVlfQ0hJQ0tFTjIpIHwK CQkJCSAgIElMS19EUEFSQl9HQVRFIHwgSUxLX1ZTRFBGRF9GVUxMKTsKCQkJSTkxNV9XUklURShJ TEtfRFNQQ0xLX0dBVEUsCgkJCQkgICBJOTE1X1JFQUQoSUxLX0RTUENMS19HQVRFKSB8CgkJCQkg ICBJTEtfRFBBUkJfQ0xLX0dBVEUgIHwKCQkJCSAgIElMS19EUEZEX0NMS19HQVRFKTsKCgkJCUk5 MTVfV1JJVEUoRFNQQUNOVFIsCgkJCQkgICBJOTE1X1JFQUQoRFNQQUNOVFIpIHwKCQkJCSAgIERJ U1BQTEFORV9UUklDS0xFX0ZFRURfRElTQUJMRSk7CgkJCUk5MTVfV1JJVEUoRFNQQkNOVFIsCgkJ CQkgICBJOTE1X1JFQUQoRFNQQkNOVFIpIHwKCQkJCSAgIERJU1BQTEFORV9UUklDS0xFX0ZFRURf RElTQUJMRSk7CgkJfQoJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkgewoJCXVpbnQzMl90IGRzcGNs a19nYXRlOwoJCUk5MTVfV1JJVEUoUkVOQ0xLX0dBVEVfRDEsIDApOwoJCUk5MTVfV1JJVEUoUkVO Q0xLX0dBVEVfRDIsIFZGX1VOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFIHwKCQkgICAgICAgR1NfVU5J VF9DTE9DS19HQVRFX0RJU0FCTEUgfAoJCSAgICAgICBDTF9VTklUX0NMT0NLX0dBVEVfRElTQUJM RSk7CgkJSTkxNV9XUklURShSQU1DTEtfR0FURV9ELCAwKTsKCQlkc3BjbGtfZ2F0ZSA9IFZSSFVO SVRfQ0xPQ0tfR0FURV9ESVNBQkxFIHwKCQkJT1ZSVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUgfAoJ CQlPVkNVTklUX0NMT0NLX0dBVEVfRElTQUJMRTsKCQlpZiAoSVNfR000NShkZXYpKQoJCQlkc3Bj bGtfZ2F0ZSB8PSBEU1NVTklUX0NMT0NLX0dBVEVfRElTQUJMRTsKCQlJOTE1X1dSSVRFKERTUENM S19HQVRFX0QsIGRzcGNsa19nYXRlKTsKCX0gZWxzZSBpZiAoSVNfQ1JFU1RMSU5FKGRldikpIHsK CQlJOTE1X1dSSVRFKFJFTkNMS19HQVRFX0QxLCBJOTY1X1JDQ19DTE9DS19HQVRFX0RJU0FCTEUp OwoJCUk5MTVfV1JJVEUoUkVOQ0xLX0dBVEVfRDIsIDApOwoJCUk5MTVfV1JJVEUoRFNQQ0xLX0dB VEVfRCwgMCk7CgkJSTkxNV9XUklURShSQU1DTEtfR0FURV9ELCAwKTsKCQlJOTE1X1dSSVRFMTYo REVVQywgMCk7Cgl9IGVsc2UgaWYgKElTX0JST0FEV0FURVIoZGV2KSkgewoJCUk5MTVfV1JJVEUo UkVOQ0xLX0dBVEVfRDEsIEk5NjVfUkNaX0NMT0NLX0dBVEVfRElTQUJMRSB8CgkJICAgICAgIEk5 NjVfUkNDX0NMT0NLX0dBVEVfRElTQUJMRSB8CgkJICAgICAgIEk5NjVfUkNQQl9DTE9DS19HQVRF X0RJU0FCTEUgfAoJCSAgICAgICBJOTY1X0lTQ19DTE9DS19HQVRFX0RJU0FCTEUgfAoJCSAgICAg ICBJOTY1X0ZCQ19DTE9DS19HQVRFX0RJU0FCTEUpOwoJCUk5MTVfV1JJVEUoUkVOQ0xLX0dBVEVf RDIsIDApOwoJfSBlbHNlIGlmIChJU19HRU4zKGRldikpIHsKCQl1MzIgZHN0YXRlID0gSTkxNV9S RUFEKERfU1RBVEUpOwoKCQlkc3RhdGUgfD0gRFNUQVRFX1BMTF9EM19PRkYgfCBEU1RBVEVfR0ZY X0NMT0NLX0dBVElORyB8CgkJCURTVEFURV9ET1RfQ0xPQ0tfR0FUSU5HOwoJCUk5MTVfV1JJVEUo RF9TVEFURSwgZHN0YXRlKTsKCX0gZWxzZSBpZiAoSVNfSTg1WChkZXYpIHx8IElTX0k4NjVHKGRl dikpIHsKCQlJOTE1X1dSSVRFKFJFTkNMS19HQVRFX0QxLCBTVl9DTE9DS19HQVRFX0RJU0FCTEUp OwoJfSBlbHNlIGlmIChJU19JODMwKGRldikpIHsKCQlJOTE1X1dSSVRFKERTUENMS19HQVRFX0Qs IE9WUlVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKCX0KfQoKdm9pZCBpbnRlbF9kaXNhYmxlX2Ns b2NrX2dhdGluZyhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwoKCWlmIChkZXZfcHJpdi0+cmVuZGVy Y3R4KSB7CgkJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiA9IGRldl9wcml2LT5yZW5k ZXJjdHg7CgoJCUk5MTVfV1JJVEUoQ0NJRCwgMCk7CgkJUE9TVElOR19SRUFEKENDSUQpOwoKCQlp OTE1X2dlbV9vYmplY3RfdW5waW4ob2JqKTsKCQlkcm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgm b2JqLT5iYXNlKTsKCQlkZXZfcHJpdi0+cmVuZGVyY3R4ID0gTlVMTDsKCX0KCglpZiAoZGV2X3By aXYtPnB3cmN0eCkgewoJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmogPSBkZXZfcHJp di0+cHdyY3R4OwoKCQlJOTE1X1dSSVRFKFBXUkNUWEEsIDApOwoJCVBPU1RJTkdfUkVBRChQV1JD VFhBKTsKCgkJaTkxNV9nZW1fb2JqZWN0X3VucGluKG9iaik7CgkJZHJtX2dlbV9vYmplY3RfdW5y ZWZlcmVuY2UoJm9iai0+YmFzZSk7CgkJZGV2X3ByaXYtPnB3cmN0eCA9IE5VTEw7Cgl9Cn0KCnN0 YXRpYyB2b2lkIGlyb25sYWtlX2Rpc2FibGVfcmM2KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsK CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7CgoJ LyogV2FrZSB0aGUgR1BVLCBwcmV2ZW50IFJDNiwgdGhlbiByZXN0b3JlIFJTVERCWUNUTCAqLwoJ STkxNV9XUklURShSU1REQllDVEwsIEk5MTVfUkVBRChSU1REQllDVEwpIHwgUkNYX1NXX0VYSVQp OwoJd2FpdF9mb3IoKChJOTE1X1JFQUQoUlNUREJZQ1RMKSAmIFJTWF9TVEFUVVNfTUFTSykgPT0g UlNYX1NUQVRVU19PTiksCgkJIDEwKTsKCVBPU1RJTkdfUkVBRChDQ0lEKTsKCUk5MTVfV1JJVEUo UFdSQ1RYQSwgMCk7CglQT1NUSU5HX1JFQUQoUFdSQ1RYQSk7CglJOTE1X1dSSVRFKFJTVERCWUNU TCwgSTkxNV9SRUFEKFJTVERCWUNUTCkgJiB+UkNYX1NXX0VYSVQpOwoJUE9TVElOR19SRUFEKFJT VERCWUNUTCk7CglpOTE1X2dlbV9vYmplY3RfdW5waW4oZGV2X3ByaXYtPnJlbmRlcmN0eCk7Cglk cm1fZ2VtX29iamVjdF91bnJlZmVyZW5jZSgmZGV2X3ByaXYtPnJlbmRlcmN0eC0+YmFzZSk7Cglk ZXZfcHJpdi0+cmVuZGVyY3R4ID0gTlVMTDsKCWk5MTVfZ2VtX29iamVjdF91bnBpbihkZXZfcHJp di0+cHdyY3R4KTsKCWRybV9nZW1fb2JqZWN0X3VucmVmZXJlbmNlKCZkZXZfcHJpdi0+cHdyY3R4 LT5iYXNlKTsKCWRldl9wcml2LT5wd3JjdHggPSBOVUxMOwp9Cgp2b2lkIGlyb25sYWtlX2VuYWJs ZV9yYzYoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCWludCByZXQ7CgoJLyoKCSAqIEdQVSBjYW4g YXV0b21hdGljYWxseSBwb3dlciBkb3duIHRoZSByZW5kZXIgdW5pdCBpZiBnaXZlbiBhIHBhZ2UK CSAqIHRvIHNhdmUgc3RhdGUuCgkgKi8KCXJldCA9IEJFR0lOX0xQX1JJTkcoNik7CglpZiAocmV0 KSB7CgkJaXJvbmxha2VfZGlzYWJsZV9yYzYoZGV2KTsKCQlyZXR1cm47Cgl9CglPVVRfUklORyhN SV9TVVNQRU5EX0ZMVVNIIHwgTUlfU1VTUEVORF9GTFVTSF9FTik7CglPVVRfUklORyhNSV9TRVRf Q09OVEVYVCk7CglPVVRfUklORyhkZXZfcHJpdi0+cmVuZGVyY3R4LT5ndHRfb2Zmc2V0IHwKCQkg TUlfTU1fU1BBQ0VfR1RUIHwKCQkgTUlfU0FWRV9FWFRfU1RBVEVfRU4gfAoJCSBNSV9SRVNUT1JF X0VYVF9TVEFURV9FTiB8CgkJIE1JX1JFU1RPUkVfSU5ISUJJVCk7CglPVVRfUklORyhNSV9TVVNQ RU5EX0ZMVVNIKTsKCU9VVF9SSU5HKE1JX05PT1ApOwoJT1VUX1JJTkcoTUlfRkxVU0gpOwoJQURW QU5DRV9MUF9SSU5HKCk7CgoJSTkxNV9XUklURShQV1JDVFhBLCBkZXZfcHJpdi0+cHdyY3R4LT5n dHRfb2Zmc2V0IHwgUFdSQ1RYX0VOKTsKCUk5MTVfV1JJVEUoUlNUREJZQ1RMLCBJOTE1X1JFQUQo UlNUREJZQ1RMKSAmIH5SQ1hfU1dfRVhJVCk7Cn0KCi8qIFNldCB1cCBjaGlwIHNwZWNpZmljIGRp c3BsYXkgZnVuY3Rpb25zICovCnN0YXRpYyB2b2lkIGludGVsX2luaXRfZGlzcGxheShzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2KQp7CglzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBk ZXYtPmRldl9wcml2YXRlOwoKCS8qIFdlIGFsd2F5cyB3YW50IGEgRFBNUyBmdW5jdGlvbiAqLwoJ aWYgKEhBU19QQ0hfU1BMSVQoZGV2KSkKCQlkZXZfcHJpdi0+ZGlzcGxheS5kcG1zID0gaXJvbmxh a2VfY3J0Y19kcG1zOwoJZWxzZQoJCWRldl9wcml2LT5kaXNwbGF5LmRwbXMgPSBpOXh4X2NydGNf ZHBtczsKCglpZiAoSTkxNV9IQVNfRkJDKGRldikpIHsKCQlpZiAoSEFTX1BDSF9TUExJVChkZXYp KSB7CgkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19lbmFibGVkID0gaXJvbmxha2VfZmJjX2VuYWJs ZWQ7CgkJCWRldl9wcml2LT5kaXNwbGF5LmVuYWJsZV9mYmMgPSBpcm9ubGFrZV9lbmFibGVfZmJj OwoJCQlkZXZfcHJpdi0+ZGlzcGxheS5kaXNhYmxlX2ZiYyA9IGlyb25sYWtlX2Rpc2FibGVfZmJj OwoJCX0gZWxzZSBpZiAoSVNfR000NShkZXYpKSB7CgkJCWRldl9wcml2LT5kaXNwbGF5LmZiY19l bmFibGVkID0gZzR4X2ZiY19lbmFibGVkOwoJCQlkZXZfcHJpdi0+ZGlzcGxheS5lbmFibGVfZmJj ID0gZzR4X2VuYWJsZV9mYmM7CgkJCWRldl9wcml2LT5kaXNwbGF5LmRpc2FibGVfZmJjID0gZzR4 X2Rpc2FibGVfZmJjOwoJCX0gZWxzZSBpZiAoSVNfQ1JFU1RMSU5FKGRldikpIHsKCQkJZGV2X3By aXYtPmRpc3BsYXkuZmJjX2VuYWJsZWQgPSBpOHh4X2ZiY19lbmFibGVkOwoJCQlkZXZfcHJpdi0+ ZGlzcGxheS5lbmFibGVfZmJjID0gaTh4eF9lbmFibGVfZmJjOwoJCQlkZXZfcHJpdi0+ZGlzcGxh eS5kaXNhYmxlX2ZiYyA9IGk4eHhfZGlzYWJsZV9mYmM7CgkJfQoJCS8qIDg1NUdNIG5lZWRzIHRl c3RpbmcgKi8KCX0KCgkvKiBSZXR1cm5zIHRoZSBjb3JlIGRpc3BsYXkgY2xvY2sgc3BlZWQgKi8K CWlmIChJU19JOTQ1RyhkZXYpIHx8IChJU19HMzMoZGV2KSAmJiAhIElTX1BJTkVWSUVXX00oZGV2 KSkpCgkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQoJCQlpOTQ1 X2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkOwoJZWxzZSBpZiAoSVNfSTkxNUcoZGV2KSkKCQlkZXZf cHJpdi0+ZGlzcGxheS5nZXRfZGlzcGxheV9jbG9ja19zcGVlZCA9CgkJCWk5MTVfZ2V0X2Rpc3Bs YXlfY2xvY2tfc3BlZWQ7CgllbHNlIGlmIChJU19JOTQ1R00oZGV2KSB8fCBJU184NDVHKGRldikg fHwgSVNfUElORVZJRVdfTShkZXYpKQoJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Ns b2NrX3NwZWVkID0KCQkJaTl4eF9taXNjX2dldF9kaXNwbGF5X2Nsb2NrX3NwZWVkOwoJZWxzZSBp ZiAoSVNfSTkxNUdNKGRldikpCgkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tf c3BlZWQgPQoJCQlpOTE1Z21fZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CgllbHNlIGlmIChJU19J ODY1RyhkZXYpKQoJCWRldl9wcml2LT5kaXNwbGF5LmdldF9kaXNwbGF5X2Nsb2NrX3NwZWVkID0K CQkJaTg2NV9nZXRfZGlzcGxheV9jbG9ja19zcGVlZDsKCWVsc2UgaWYgKElTX0k4NVgoZGV2KSkK CQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfZGlzcGxheV9jbG9ja19zcGVlZCA9CgkJCWk4NTVfZ2V0 X2Rpc3BsYXlfY2xvY2tfc3BlZWQ7CgllbHNlIC8qIDg1MiwgODMwICovCgkJZGV2X3ByaXYtPmRp c3BsYXkuZ2V0X2Rpc3BsYXlfY2xvY2tfc3BlZWQgPQoJCQlpODMwX2dldF9kaXNwbGF5X2Nsb2Nr X3NwZWVkOwoKCS8qIEZvciBGSUZPIHdhdGVybWFyayB1cGRhdGVzICovCglpZiAoSEFTX1BDSF9T UExJVChkZXYpKSB7CgkJaWYgKElTX0dFTjUoZGV2KSkgewoJCQlpZiAoSTkxNV9SRUFEKE1MVFJf SUxLKSAmIElMS19TUkxUX01BU0spCgkJCQlkZXZfcHJpdi0+ZGlzcGxheS51cGRhdGVfd20gPSBp cm9ubGFrZV91cGRhdGVfd207CgkJCWVsc2UgewoJCQkJRFJNX0RFQlVHX0tNUygiRmFpbGVkIHRv IGdldCBwcm9wZXIgbGF0ZW5jeS4gIgoJCQkJCSAgICAgICJEaXNhYmxlIEN4U1JcbiIpOwoJCQkJ ZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gTlVMTDsKCQkJfQoJCX0gZWxzZSBpZiAoSVNf R0VONihkZXYpKSB7CgkJCWlmIChTTkJfUkVBRF9XTTBfTEFURU5DWSgpKSB7CgkJCQlkZXZfcHJp di0+ZGlzcGxheS51cGRhdGVfd20gPSBzYW5keWJyaWRnZV91cGRhdGVfd207CgkJCX0gZWxzZSB7 CgkJCQlEUk1fREVCVUdfS01TKCJGYWlsZWQgdG8gcmVhZCBkaXNwbGF5IHBsYW5lIGxhdGVuY3ku ICIKCQkJCQkgICAgICAiRGlzYWJsZSBDeFNSXG4iKTsKCQkJCWRldl9wcml2LT5kaXNwbGF5LnVw ZGF0ZV93bSA9IE5VTEw7CgkJCX0KCQl9IGVsc2UKCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRl X3dtID0gTlVMTDsKCX0gZWxzZSBpZiAoSVNfUElORVZJRVcoZGV2KSkgewoJCWlmICghaW50ZWxf Z2V0X2N4c3JfbGF0ZW5jeShJU19QSU5FVklFV19HKGRldiksCgkJCQkJICAgIGRldl9wcml2LT5p c19kZHIzLAoJCQkJCSAgICBkZXZfcHJpdi0+ZnNiX2ZyZXEsCgkJCQkJICAgIGRldl9wcml2LT5t ZW1fZnJlcSkpIHsKCQkJRFJNX0lORk8oImZhaWxlZCB0byBmaW5kIGtub3duIEN4U1IgbGF0ZW5j eSAiCgkJCQkgIihmb3VuZCBkZHIlcyBmc2IgZnJlcSAlZCwgbWVtIGZyZXEgJWQpLCAiCgkJCQkg ImRpc2FibGluZyBDeFNSXG4iLAoJCQkJIChkZXZfcHJpdi0+aXNfZGRyMyA9PSAxKSA/ICIzIjog IjIiLAoJCQkJIGRldl9wcml2LT5mc2JfZnJlcSwgZGV2X3ByaXYtPm1lbV9mcmVxKTsKCQkJLyog RGlzYWJsZSBDeFNSIGFuZCBuZXZlciB1cGRhdGUgaXRzIHdhdGVybWFyayBhZ2FpbiAqLwoJCQlw aW5ldmlld19kaXNhYmxlX2N4c3IoZGV2KTsKCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dt ID0gTlVMTDsKCQl9IGVsc2UKCQkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gcGluZXZp ZXdfdXBkYXRlX3dtOwoJfSBlbHNlIGlmIChJU19HNFgoZGV2KSkKCQlkZXZfcHJpdi0+ZGlzcGxh eS51cGRhdGVfd20gPSBnNHhfdXBkYXRlX3dtOwoJZWxzZSBpZiAoSVNfR0VONChkZXYpKQoJCWRl dl9wcml2LT5kaXNwbGF5LnVwZGF0ZV93bSA9IGk5NjVfdXBkYXRlX3dtOwoJZWxzZSBpZiAoSVNf R0VOMyhkZXYpKSB7CgkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRlX3dtID0gaTl4eF91cGRhdGVf d207CgkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9IGk5eHhfZ2V0X2ZpZm9fc2l6 ZTsKCX0gZWxzZSBpZiAoSVNfSTg1WChkZXYpKSB7CgkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRl X3dtID0gaTl4eF91cGRhdGVfd207CgkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9 IGk4NXhfZ2V0X2ZpZm9fc2l6ZTsKCX0gZWxzZSB7CgkJZGV2X3ByaXYtPmRpc3BsYXkudXBkYXRl X3dtID0gaTgzMF91cGRhdGVfd207CgkJaWYgKElTXzg0NUcoZGV2KSkKCQkJZGV2X3ByaXYtPmRp c3BsYXkuZ2V0X2ZpZm9fc2l6ZSA9IGk4NDVfZ2V0X2ZpZm9fc2l6ZTsKCQllbHNlCgkJCWRldl9w cml2LT5kaXNwbGF5LmdldF9maWZvX3NpemUgPSBpODMwX2dldF9maWZvX3NpemU7Cgl9Cn0KCi8q CiAqIFNvbWUgQklPU2VzIGluc2lzdCBvbiBhc3N1bWluZyB0aGUgR1BVJ3MgcGlwZSBBIGlzIGVu YWJsZWQgYXQgc3VzcGVuZCwKICogcmVzdW1lLCBvciBvdGhlciB0aW1lcy4gIFRoaXMgcXVpcmsg bWFrZXMgc3VyZSB0aGF0J3MgdGhlIGNhc2UgZm9yCiAqIGFmZmVjdGVkIHN5c3RlbXMuCiAqLwpz dGF0aWMgdm9pZCBxdWlya19waXBlYV9mb3JjZSAoc3RydWN0IGRybV9kZXZpY2UgKmRldikKewoJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsKCglk ZXZfcHJpdi0+cXVpcmtzIHw9IFFVSVJLX1BJUEVBX0ZPUkNFOwoJRFJNX0RFQlVHX0RSSVZFUigi YXBwbHlpbmcgcGlwZSBhIGZvcmNlIHF1aXJrXG4iKTsKfQoKc3RydWN0IGludGVsX3F1aXJrIHsK CWludCBkZXZpY2U7CglpbnQgc3Vic3lzdGVtX3ZlbmRvcjsKCWludCBzdWJzeXN0ZW1fZGV2aWNl OwoJdm9pZCAoKmhvb2spKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwp9OwoKc3RydWN0IGludGVs X3F1aXJrIGludGVsX3F1aXJrc1tdID0gewoJLyogSFAgQ29tcGFxIDI3MzBwIG5lZWRzIHBpcGUg QSBmb3JjZSBxdWlyayAoTFA6ICMyOTE1NTUpICovCgl7IDB4MmE0MiwgMHgxMDNjLCAweDMwZWIs IHF1aXJrX3BpcGVhX2ZvcmNlIH0sCgkvKiBIUCBNaW5pIG5lZWRzIHBpcGUgQSBmb3JjZSBxdWly ayAoTFA6ICMzMjIxMDQpICovCgl7IDB4MjdhZSwweDEwM2MsIDB4MzYxYSwgcXVpcmtfcGlwZWFf Zm9yY2UgfSwKCgkvKiBUaGlua3BhZCBSMzEgbmVlZHMgcGlwZSBBIGZvcmNlIHF1aXJrICovCgl7 IDB4MzU3NywgMHgxMDE0LCAweDA1MDUsIHF1aXJrX3BpcGVhX2ZvcmNlIH0sCgkvKiBUb3NoaWJh IFByb3RlZ2UgUi0yMDUsIFMtMjA5IG5lZWRzIHBpcGUgQSBmb3JjZSBxdWlyayAqLwoJeyAweDI1 OTIsIDB4MTE3OSwgMHgwMDAxLCBxdWlya19waXBlYV9mb3JjZSB9LAoKCS8qIFRoaW5rUGFkIFgz MCBuZWVkcyBwaXBlIEEgZm9yY2UgcXVpcmsgKExQOiAjMzA0NjE0KSAqLwoJeyAweDM1NzcsICAw eDEwMTQsIDB4MDUxMywgcXVpcmtfcGlwZWFfZm9yY2UgfSwKCS8qIFRoaW5rUGFkIFg0MCBuZWVk cyBwaXBlIEEgZm9yY2UgcXVpcmsgKi8KCgkvKiBUaGlua1BhZCBUNjAgbmVlZHMgcGlwZSBBIGZv cmNlIHF1aXJrIChidWcgIzE2NDk0KSAqLwoJeyAweDI3ODIsIDB4MTdhYSwgMHgyMDFhLCBxdWly a19waXBlYV9mb3JjZSB9LAoKCS8qIDg1NSAmIGJlZm9yZSBuZWVkIHRvIGxlYXZlIHBpcGUgQSAm IGRwbGwgQSB1cCAqLwoJeyAweDM1ODIsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIHF1aXJrX3Bp cGVhX2ZvcmNlIH0sCgl7IDB4MjU2MiwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgcXVpcmtfcGlw ZWFfZm9yY2UgfSwKfTsKCnN0YXRpYyB2b2lkIGludGVsX2luaXRfcXVpcmtzKHN0cnVjdCBkcm1f ZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBwY2lfZGV2ICpkID0gZGV2LT5wZGV2OwoJaW50IGk7CgoJ Zm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaW50ZWxfcXVpcmtzKTsgaSsrKSB7CgkJc3RydWN0 IGludGVsX3F1aXJrICpxID0gJmludGVsX3F1aXJrc1tpXTsKCgkJaWYgKGQtPmRldmljZSA9PSBx LT5kZXZpY2UgJiYKCQkgICAgKGQtPnN1YnN5c3RlbV92ZW5kb3IgPT0gcS0+c3Vic3lzdGVtX3Zl bmRvciB8fAoJCSAgICAgcS0+c3Vic3lzdGVtX3ZlbmRvciA9PSBQQ0lfQU5ZX0lEKSAmJgoJCSAg ICAoZC0+c3Vic3lzdGVtX2RldmljZSA9PSBxLT5zdWJzeXN0ZW1fZGV2aWNlIHx8CgkJICAgICBx LT5zdWJzeXN0ZW1fZGV2aWNlID09IFBDSV9BTllfSUQpKQoJCQlxLT5ob29rKGRldik7Cgl9Cn0K Ci8qIERpc2FibGUgdGhlIFZHQSBwbGFuZSB0aGF0IHdlIG5ldmVyIHVzZSAqLwpzdGF0aWMgdm9p ZCBpOTE1X2Rpc2FibGVfdmdhKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCnsKCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3ByaXZhdGU7Cgl1OCBzcjE7Cgl1MzIg dmdhX3JlZzsKCglpZiAoSEFTX1BDSF9TUExJVChkZXYpKQoJCXZnYV9yZWcgPSBDUFVfVkdBQ05U Ukw7CgllbHNlCgkJdmdhX3JlZyA9IFZHQUNOVFJMOwoKCXZnYV9nZXRfdW5pbnRlcnJ1cHRpYmxl KGRldi0+cGRldiwgVkdBX1JTUkNfTEVHQUNZX0lPKTsKCW91dGIoMSwgVkdBX1NSX0lOREVYKTsK CXNyMSA9IGluYihWR0FfU1JfREFUQSk7CglvdXRiKHNyMSB8IDE8PDUsIFZHQV9TUl9EQVRBKTsK CXZnYV9wdXQoZGV2LT5wZGV2LCBWR0FfUlNSQ19MRUdBQ1lfSU8pOwoJdWRlbGF5KDMwMCk7CgoJ STkxNV9XUklURSh2Z2FfcmVnLCBWR0FfRElTUF9ESVNBQkxFKTsKCVBPU1RJTkdfUkVBRCh2Z2Ff cmVnKTsKfQoKdm9pZCBpbnRlbF9tb2Rlc2V0X2luaXQoc3RydWN0IGRybV9kZXZpY2UgKmRldikK ewoJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZGV2LT5kZXZfcHJpdmF0ZTsK CWludCBpOwoKCWRybV9tb2RlX2NvbmZpZ19pbml0KGRldik7CgoJZGV2LT5tb2RlX2NvbmZpZy5t aW5fd2lkdGggPSAwOwoJZGV2LT5tb2RlX2NvbmZpZy5taW5faGVpZ2h0ID0gMDsKCglkZXYtPm1v ZGVfY29uZmlnLmZ1bmNzID0gKHZvaWQgKikmaW50ZWxfbW9kZV9mdW5jczsKCglpbnRlbF9pbml0 X3F1aXJrcyhkZXYpOwoKCWludGVsX2luaXRfZGlzcGxheShkZXYpOwoKCWlmIChJU19HRU4yKGRl dikpIHsKCQlkZXYtPm1vZGVfY29uZmlnLm1heF93aWR0aCA9IDIwNDg7CgkJZGV2LT5tb2RlX2Nv bmZpZy5tYXhfaGVpZ2h0ID0gMjA0ODsKCX0gZWxzZSBpZiAoSVNfR0VOMyhkZXYpKSB7CgkJZGV2 LT5tb2RlX2NvbmZpZy5tYXhfd2lkdGggPSA0MDk2OwoJCWRldi0+bW9kZV9jb25maWcubWF4X2hl aWdodCA9IDQwOTY7Cgl9IGVsc2UgewoJCWRldi0+bW9kZV9jb25maWcubWF4X3dpZHRoID0gODE5 MjsKCQlkZXYtPm1vZGVfY29uZmlnLm1heF9oZWlnaHQgPSA4MTkyOwoJfQoJZGV2LT5tb2RlX2Nv bmZpZy5mYl9iYXNlID0gZGV2LT5hZ3AtPmJhc2U7CgoJaWYgKElTX01PQklMRShkZXYpIHx8ICFJ U19HRU4yKGRldikpCgkJZGV2X3ByaXYtPm51bV9waXBlID0gMjsKCWVsc2UKCQlkZXZfcHJpdi0+ bnVtX3BpcGUgPSAxOwoJRFJNX0RFQlVHX0tNUygiJWQgZGlzcGxheSBwaXBlJXMgYXZhaWxhYmxl LlxuIiwKCQkgICAgICBkZXZfcHJpdi0+bnVtX3BpcGUsIGRldl9wcml2LT5udW1fcGlwZSA+IDEg PyAicyIgOiAiIik7CgoJZm9yIChpID0gMDsgaSA8IGRldl9wcml2LT5udW1fcGlwZTsgaSsrKSB7 CgkJaW50ZWxfY3J0Y19pbml0KGRldiwgaSk7Cgl9CgoJaW50ZWxfc2V0dXBfb3V0cHV0cyhkZXYp OwoKCWludGVsX2VuYWJsZV9jbG9ja19nYXRpbmcoZGV2KTsKCgkvKiBKdXN0IGRpc2FibGUgaXQg b25jZSBhdCBzdGFydHVwICovCglpOTE1X2Rpc2FibGVfdmdhKGRldik7CgoJaWYgKElTX0lST05M QUtFX00oZGV2KSkgewoJCWlyb25sYWtlX2VuYWJsZV9kcnBzKGRldik7CgkJaW50ZWxfaW5pdF9l bW9uKGRldik7Cgl9CgoJaWYgKElTX0dFTjYoZGV2KSkKCQlnZW42X2VuYWJsZV9ycHMoZGV2X3By aXYpOwoKCWlmIChJU19JUk9OTEFLRV9NKGRldikpIHsKCQlkZXZfcHJpdi0+cmVuZGVyY3R4ID0g aW50ZWxfYWxsb2NfY29udGV4dF9wYWdlKGRldik7CgkJaWYgKCFkZXZfcHJpdi0+cmVuZGVyY3R4 KQoJCQlnb3RvIHNraXBfcmM2OwoJCWRldl9wcml2LT5wd3JjdHggPSBpbnRlbF9hbGxvY19jb250 ZXh0X3BhZ2UoZGV2KTsKCQlpZiAoIWRldl9wcml2LT5wd3JjdHgpIHsKCQkJaTkxNV9nZW1fb2Jq ZWN0X3VucGluKGRldl9wcml2LT5yZW5kZXJjdHgpOwoJCQlkcm1fZ2VtX29iamVjdF91bnJlZmVy ZW5jZSgmZGV2X3ByaXYtPnJlbmRlcmN0eC0+YmFzZSk7CgkJCWRldl9wcml2LT5yZW5kZXJjdHgg PSBOVUxMOwoJCQlnb3RvIHNraXBfcmM2OwoJCX0KCQlpcm9ubGFrZV9lbmFibGVfcmM2KGRldik7 Cgl9Cgpza2lwX3JjNjoKCUlOSVRfV09SSygmZGV2X3ByaXYtPmlkbGVfd29yaywgaW50ZWxfaWRs ZV91cGRhdGUpOwoJc2V0dXBfdGltZXIoJmRldl9wcml2LT5pZGxlX3RpbWVyLCBpbnRlbF9ncHVf aWRsZV90aW1lciwKCQkgICAgKHVuc2lnbmVkIGxvbmcpZGV2KTsKCglpbnRlbF9zZXR1cF9vdmVy bGF5KGRldik7Cn0KCnZvaWQgaW50ZWxfbW9kZXNldF9jbGVhbnVwKHN0cnVjdCBkcm1fZGV2aWNl ICpkZXYpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3By aXZhdGU7CglzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CglzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxf Y3J0YzsKCglkcm1fa21zX2hlbHBlcl9wb2xsX2ZpbmkoZGV2KTsKCW11dGV4X2xvY2soJmRldi0+ c3RydWN0X211dGV4KTsKCglpbnRlbF91bnJlZ2lzdGVyX2RzbV9oYW5kbGVyKCk7CgoKCWxpc3Rf Zm9yX2VhY2hfZW50cnkoY3J0YywgJmRldi0+bW9kZV9jb25maWcuY3J0Y19saXN0LCBoZWFkKSB7 CgkJLyogU2tpcCBpbmFjdGl2ZSBDUlRDcyAqLwoJCWlmICghY3J0Yy0+ZmIpCgkJCWNvbnRpbnVl OwoKCQlpbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKCQlpbnRlbF9pbmNyZWFzZV9w bGxjbG9jayhjcnRjKTsKCX0KCglpZiAoZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMpCgkJ ZGV2X3ByaXYtPmRpc3BsYXkuZGlzYWJsZV9mYmMoZGV2KTsKCglpZiAoSVNfSVJPTkxBS0VfTShk ZXYpKQoJCWlyb25sYWtlX2Rpc2FibGVfZHJwcyhkZXYpOwoJaWYgKElTX0dFTjYoZGV2KSkKCQln ZW42X2Rpc2FibGVfcnBzKGRldik7CgoJaWYgKElTX0lST05MQUtFX00oZGV2KSkKCQlpcm9ubGFr ZV9kaXNhYmxlX3JjNihkZXYpOwoKCW11dGV4X3VubG9jaygmZGV2LT5zdHJ1Y3RfbXV0ZXgpOwoK CS8qIERpc2FibGUgdGhlIGlycSBiZWZvcmUgbW9kZSBvYmplY3QgdGVhcmRvd24sIGZvciB0aGUg aXJxIG1pZ2h0CgkgKiBlbnF1ZXVlIHVucGluL2hvdHBsdWcgd29yay4gKi8KCWRybV9pcnFfdW5p bnN0YWxsKGRldik7CgljYW5jZWxfd29ya19zeW5jKCZkZXZfcHJpdi0+aG90cGx1Z193b3JrKTsK CgkvKiBTaHV0IG9mZiBpZGxlIHdvcmsgYmVmb3JlIHRoZSBjcnRjcyBnZXQgZnJlZWQuICovCgls aXN0X2Zvcl9lYWNoX2VudHJ5KGNydGMsICZkZXYtPm1vZGVfY29uZmlnLmNydGNfbGlzdCwgaGVh ZCkgewoJCWludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOwoJCWRlbF90aW1lcl9zeW5j KCZpbnRlbF9jcnRjLT5pZGxlX3RpbWVyKTsKCX0KCWRlbF90aW1lcl9zeW5jKCZkZXZfcHJpdi0+ aWRsZV90aW1lcik7CgljYW5jZWxfd29ya19zeW5jKCZkZXZfcHJpdi0+aWRsZV93b3JrKTsKCglk cm1fbW9kZV9jb25maWdfY2xlYW51cChkZXYpOwp9CgovKgogKiBSZXR1cm4gd2hpY2ggZW5jb2Rl ciBpcyBjdXJyZW50bHkgYXR0YWNoZWQgZm9yIGNvbm5lY3Rvci4KICovCnN0cnVjdCBkcm1fZW5j b2RlciAqaW50ZWxfYmVzdF9lbmNvZGVyKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3Ip CnsKCXJldHVybiAmaW50ZWxfYXR0YWNoZWRfZW5jb2Rlcihjb25uZWN0b3IpLT5iYXNlOwp9Cgp2 b2lkIGludGVsX2Nvbm5lY3Rvcl9hdHRhY2hfZW5jb2RlcihzdHJ1Y3QgaW50ZWxfY29ubmVjdG9y ICpjb25uZWN0b3IsCgkJCQkgICAgc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpCnsKCWNv bm5lY3Rvci0+ZW5jb2RlciA9IGVuY29kZXI7Cglkcm1fbW9kZV9jb25uZWN0b3JfYXR0YWNoX2Vu Y29kZXIoJmNvbm5lY3Rvci0+YmFzZSwKCQkJCQkgICZlbmNvZGVyLT5iYXNlKTsKfQoKLyoKICog c2V0IHZnYSBkZWNvZGUgc3RhdGUgLSB0cnVlID09IGVuYWJsZSBWR0EgZGVjb2RlCiAqLwppbnQg aW50ZWxfbW9kZXNldF92Z2Ffc2V0X3N0YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGJvb2wg c3RhdGUpCnsKCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGRldi0+ZGV2X3By aXZhdGU7Cgl1MTYgZ21jaF9jdHJsOwoKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldl9wcml2LT5i cmlkZ2VfZGV2LCBJTlRFTF9HTUNIX0NUUkwsICZnbWNoX2N0cmwpOwoJaWYgKHN0YXRlKQoJCWdt Y2hfY3RybCAmPSB+SU5URUxfR01DSF9WR0FfRElTQUJMRTsKCWVsc2UKCQlnbWNoX2N0cmwgfD0g SU5URUxfR01DSF9WR0FfRElTQUJMRTsKCXBjaV93cml0ZV9jb25maWdfd29yZChkZXZfcHJpdi0+ YnJpZGdlX2RldiwgSU5URUxfR01DSF9DVFJMLCBnbWNoX2N0cmwpOwoJcmV0dXJuIDA7Cn0KCiNp ZmRlZiBDT05GSUdfREVCVUdfRlMKI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CgpzdHJ1Y3Qg aW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSB7CglzdHJ1Y3QgaW50ZWxfY3Vyc29yX2Vycm9yX3N0 YXRlIHsKCQl1MzIgY29udHJvbDsKCQl1MzIgcG9zaXRpb247CgkJdTMyIGJhc2U7CgkJdTMyIHNp emU7Cgl9IGN1cnNvclsyXTsKCglzdHJ1Y3QgaW50ZWxfcGlwZV9lcnJvcl9zdGF0ZSB7CgkJdTMy IGNvbmY7CgkJdTMyIHNvdXJjZTsKCgkJdTMyIGh0b3RhbDsKCQl1MzIgaGJsYW5rOwoJCXUzMiBo c3luYzsKCQl1MzIgdnRvdGFsOwoJCXUzMiB2Ymxhbms7CgkJdTMyIHZzeW5jOwoJfSBwaXBlWzJd OwoKCXN0cnVjdCBpbnRlbF9wbGFuZV9lcnJvcl9zdGF0ZSB7CgkJdTMyIGNvbnRyb2w7CgkJdTMy IHN0cmlkZTsKCQl1MzIgc2l6ZTsKCQl1MzIgcG9zOwoJCXUzMiBhZGRyOwoJCXUzMiBzdXJmYWNl OwoJCXUzMiB0aWxlX29mZnNldDsKCX0gcGxhbmVbMl07Cn07CgpzdHJ1Y3QgaW50ZWxfZGlzcGxh eV9lcnJvcl9zdGF0ZSAqCmludGVsX2Rpc3BsYXlfY2FwdHVyZV9lcnJvcl9zdGF0ZShzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2KQp7CiAgICAgICAgZHJtX2k5MTVfcHJpdmF0ZV90ICpkZXZfcHJpdiA9 IGRldi0+ZGV2X3ByaXZhdGU7CglzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAqZXJy b3I7CglpbnQgaTsKCgllcnJvciA9IGttYWxsb2Moc2l6ZW9mKCplcnJvciksIEdGUF9BVE9NSUMp OwoJaWYgKGVycm9yID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJZm9yIChpID0gMDsgaSA8IDI7 IGkrKykgewoJCWVycm9yLT5jdXJzb3JbaV0uY29udHJvbCA9IEk5MTVfUkVBRChDVVJDTlRSKGkp KTsKCQllcnJvci0+Y3Vyc29yW2ldLnBvc2l0aW9uID0gSTkxNV9SRUFEKENVUlBPUyhpKSk7CgkJ ZXJyb3ItPmN1cnNvcltpXS5iYXNlID0gSTkxNV9SRUFEKENVUkJBU0UoaSkpOwoKCQllcnJvci0+ cGxhbmVbaV0uY29udHJvbCA9IEk5MTVfUkVBRChEU1BDTlRSKGkpKTsKCQllcnJvci0+cGxhbmVb aV0uc3RyaWRlID0gSTkxNV9SRUFEKERTUFNUUklERShpKSk7CgkJZXJyb3ItPnBsYW5lW2ldLnNp emUgPSBJOTE1X1JFQUQoRFNQU0laRShpKSk7CgkJZXJyb3ItPnBsYW5lW2ldLnBvcz0gSTkxNV9S RUFEKERTUFBPUyhpKSk7CgkJZXJyb3ItPnBsYW5lW2ldLmFkZHIgPSBJOTE1X1JFQUQoRFNQQURE UihpKSk7CgkJaWYgKElOVEVMX0lORk8oZGV2KS0+Z2VuID49IDQpIHsKCQkJZXJyb3ItPnBsYW5l W2ldLnN1cmZhY2UgPSBJOTE1X1JFQUQoRFNQU1VSRihpKSk7CgkJCWVycm9yLT5wbGFuZVtpXS50 aWxlX29mZnNldCA9IEk5MTVfUkVBRChEU1BUSUxFT0ZGKGkpKTsKCQl9CgoJCWVycm9yLT5waXBl W2ldLmNvbmYgPSBJOTE1X1JFQUQoUElQRUNPTkYoaSkpOwoJCWVycm9yLT5waXBlW2ldLnNvdXJj ZSA9IEk5MTVfUkVBRChQSVBFU1JDKGkpKTsKCQllcnJvci0+cGlwZVtpXS5odG90YWwgPSBJOTE1 X1JFQUQoSFRPVEFMKGkpKTsKCQllcnJvci0+cGlwZVtpXS5oYmxhbmsgPSBJOTE1X1JFQUQoSEJM QU5LKGkpKTsKCQllcnJvci0+cGlwZVtpXS5oc3luYyA9IEk5MTVfUkVBRChIU1lOQyhpKSk7CgkJ ZXJyb3ItPnBpcGVbaV0udnRvdGFsID0gSTkxNV9SRUFEKFZUT1RBTChpKSk7CgkJZXJyb3ItPnBp cGVbaV0udmJsYW5rID0gSTkxNV9SRUFEKFZCTEFOSyhpKSk7CgkJZXJyb3ItPnBpcGVbaV0udnN5 bmMgPSBJOTE1X1JFQUQoVlNZTkMoaSkpOwoJfQoKCXJldHVybiBlcnJvcjsKfQoKdm9pZAppbnRl bF9kaXNwbGF5X3ByaW50X2Vycm9yX3N0YXRlKHN0cnVjdCBzZXFfZmlsZSAqbSwKCQkJCXN0cnVj dCBkcm1fZGV2aWNlICpkZXYsCgkJCQlzdHJ1Y3QgaW50ZWxfZGlzcGxheV9lcnJvcl9zdGF0ZSAq ZXJyb3IpCnsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKCQlzZXFfcHJpbnRm KG0sICJQaXBlIFslZF06XG4iLCBpKTsKCQlzZXFfcHJpbnRmKG0sICIgIENPTkY6ICUwOHhcbiIs IGVycm9yLT5waXBlW2ldLmNvbmYpOwoJCXNlcV9wcmludGYobSwgIiAgU1JDOiAlMDh4XG4iLCBl cnJvci0+cGlwZVtpXS5zb3VyY2UpOwoJCXNlcV9wcmludGYobSwgIiAgSFRPVEFMOiAlMDh4XG4i LCBlcnJvci0+cGlwZVtpXS5odG90YWwpOwoJCXNlcV9wcmludGYobSwgIiAgSEJMQU5LOiAlMDh4 XG4iLCBlcnJvci0+cGlwZVtpXS5oYmxhbmspOwoJCXNlcV9wcmludGYobSwgIiAgSFNZTkM6ICUw OHhcbiIsIGVycm9yLT5waXBlW2ldLmhzeW5jKTsKCQlzZXFfcHJpbnRmKG0sICIgIFZUT1RBTDog JTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0udnRvdGFsKTsKCQlzZXFfcHJpbnRmKG0sICIgIFZCTEFO SzogJTA4eFxuIiwgZXJyb3ItPnBpcGVbaV0udmJsYW5rKTsKCQlzZXFfcHJpbnRmKG0sICIgIFZT WU5DOiAlMDh4XG4iLCBlcnJvci0+cGlwZVtpXS52c3luYyk7CgoJCXNlcV9wcmludGYobSwgIlBs YW5lIFslZF06XG4iLCBpKTsKCQlzZXFfcHJpbnRmKG0sICIgIENOVFI6ICUwOHhcbiIsIGVycm9y LT5wbGFuZVtpXS5jb250cm9sKTsKCQlzZXFfcHJpbnRmKG0sICIgIFNUUklERTogJTA4eFxuIiwg ZXJyb3ItPnBsYW5lW2ldLnN0cmlkZSk7CgkJc2VxX3ByaW50ZihtLCAiICBTSVpFOiAlMDh4XG4i LCBlcnJvci0+cGxhbmVbaV0uc2l6ZSk7CgkJc2VxX3ByaW50ZihtLCAiICBQT1M6ICUwOHhcbiIs IGVycm9yLT5wbGFuZVtpXS5wb3MpOwoJCXNlcV9wcmludGYobSwgIiAgQUREUjogJTA4eFxuIiwg ZXJyb3ItPnBsYW5lW2ldLmFkZHIpOwoJCWlmIChJTlRFTF9JTkZPKGRldiktPmdlbiA+PSA0KSB7 CgkJCXNlcV9wcmludGYobSwgIiAgU1VSRjogJTA4eFxuIiwgZXJyb3ItPnBsYW5lW2ldLnN1cmZh Y2UpOwoJCQlzZXFfcHJpbnRmKG0sICIgIFRJTEVPRkY6ICUwOHhcbiIsIGVycm9yLT5wbGFuZVtp XS50aWxlX29mZnNldCk7CgkJfQoKCQlzZXFfcHJpbnRmKG0sICJDdXJzb3IgWyVkXTpcbiIsIGkp OwoJCXNlcV9wcmludGYobSwgIiAgQ05UUjogJTA4eFxuIiwgZXJyb3ItPmN1cnNvcltpXS5jb250 cm9sKTsKCQlzZXFfcHJpbnRmKG0sICIgIFBPUzogJTA4eFxuIiwgZXJyb3ItPmN1cnNvcltpXS5w b3NpdGlvbik7CgkJc2VxX3ByaW50ZihtLCAiICBCQVNFOiAlMDh4XG4iLCBlcnJvci0+Y3Vyc29y W2ldLmJhc2UpOwoJfQp9CiNlbmRpZgo= --20cf3056445b1dcb0f049bad219d-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/