From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S267446AbUJRVQt (ORCPT ); Mon, 18 Oct 2004 17:16:49 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S267405AbUJRVQs (ORCPT ); Mon, 18 Oct 2004 17:16:48 -0400 Received: from smtp2.wanadoo.fr ([193.252.22.29]:48047 "EHLO mwinf0202.wanadoo.fr") by vger.kernel.org with ESMTP id S267374AbUJRVGc (ORCPT ); Mon, 18 Oct 2004 17:06:32 -0400 Message-ID: <41743050.3080503@laposte.net> Date: Mon, 18 Oct 2004 23:06:24 +0200 From: JLM aka cityhunter Reply-To: jlm_devel@laposte.net User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.3) Gecko/20041005 X-Accept-Language: en-us, en MIME-Version: 1.0 To: linux-kernel Subject: [2.4.20][embeded][arm] memory management issue in a kernel module i'm writing Content-Type: multipart/mixed; boundary="------------080708080608090000010208" Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org This is a multi-part message in MIME format. --------------080708080608090000010208 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit hello everybody, nice to see you I'm working on an embeded solution on arm 920, which use an ov9640 camera the driver I got originaly was a montavista one under GPL, although there is not much left of the original (buggy) code the camera hasn't internal memory and since we use official kernel v4l2api we want to provide a buffering mechanism I saw that the only way to do that is to use the no_page method of vma is this the only way to remap memory obtained through __get_dma_page()? when I allocate the buffer I reserve the memory to prevent swapping using SetPageReserved() (I know this isn't be right way but if I use LockPage() I get one of the issue below) I perform my no_page work, evrything is fine, the perfs are here (60fps on a raw frame and 30 over a [userspace] rotated one) that's cool on close of the vma, I preform the step in reverse order : delock the memory using ClearPageReserved() and free the pages I putted some debug statement and the steps are strictly symetrical, the flags set are cleared.... so from my point of view everything is ok BUT launching my test application and doing a free on the shell several time shows me that there is a memory leak.... so my buffers aren't desallocated..... (or seems so) so I tried to use LockPage() instead of SetPageReserved() and now I get an even stranger issue : when I launch the 1rst test everything is ok, no frame corruption.... when I launch the second time the test that's the big mess.... activating the debug I see that everything goes right but my wake_up_interruptible () call don't wake up my application. and when I kill it I get a kernel panic....... (aie killing interrupt handler but the backtrace show me that this is in my desalocation function) I included a part of my source here the function to look for are mmap_vma_open mmap_vma_close mmap_vma_nopage DeallocateBuffer AllocateBuffer and BuffMemReserve if this is an already known issue just tell me, I'll report it to my leader and see what we can do if you have any ideas/test just ask we recently got a BDI2000, I'll see if I can manage to debug with it...... any help is wlecome, I know that the 2.4.* series are outdated but I'm not making the choices ^_^ Best regards --------------080708080608090000010208 Content-Type: text/plain; name="v4l2.c" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="v4l2.c" LyoKICogRmlsZTogdjRsMi5jCiAqCiAqIERlc2NyaXB0aW9uOgogKiAgIFZpZGVvIGZvciBM aW51eCBUd28gSW50ZXJmYWNlIGZvciBPTUFQIENhcHR1cmUgZGV2aWNlLgogKgogKiAgIFRo aXMgZHJpdmVyIHdhcyBoaWdobHkgbGV2ZXJhZ2VkIGZyb20gQmlsbCBEaXJrJ3MKICogICB2 NGwyIGV4YW1wbGUgZ2VuZXJpYyBkcml2ZXIuIE1vZGlmaWVkIGJ5IFJpZGdlUnVuCiAqICAg dG8gd29yayB3aXRoIHRoZSBvbWFwMTUwOSBjYW1lcmEgbW9kdWxlLgogKgogKiAgIEhlYXZp bHkgbW9kaWZpZWQgYWdhaW4gYnkgTW9udGFWaXN0YSBTb2Z0d2FyZSB0byB3b3JrIHdpdGgK ICogICBPTUFQIDE1MTAvMTYxMC9IMiBJbm5vdmF0b3IgcGxhdGZvcm1zLgogKgogKiBDcmVh dGVkIDIwMDIsIENvcHlyaWdodCAoQykgMjAwMiBSaWRnZVJ1biwgSW5jLiAgQWxsIHJpZ2h0 cyByZXNlcnZlZC4KICogQ3JlYXRlZCAyMDAyLCBDb3B5cmlnaHQgKEMpIDIwMDIgVGV4YXMg SW5zdHJ1bWVudHMgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIENvcHlyaWdodCAoQykgMjAw My0yMDA0IE1vbnRhVmlzdGEgU29mdHdhcmUsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K ICoKICogQ29uY2VwdHVhbCBVc2FnZTogKGV4YWN0IHN5bnRheCBtYXkgdmFyeSkKICogICAx LiBpbnNtb2QgdmlkZW9kZXZYCiAqICAgMi4gaW5zbW9kIGNhbWVyYSBbdW5pdF92aWRlbz0w XQogKiAgICAgIGRyaXZlciByZWdpc3RlcnMgbWFqb3IgODEsIG1pbm9yIDAsIHdoaWNoCiAq ICAgICAgb24gbW9zdCBzeXN0ZW1zIGVxdWF0ZXMgdG8gZWl0aGVyIC9kZXYvdmlkZW8wCiAq ICAgICAgb3Igc29tZXRpbWVzIHNpbXBseSAvZGV2L3ZpZGVvCiAqICAgMy4gTm93IHlvdSBj YW4gcnVuIGFwcHMgdGhhdCB1c2UgdGhlIHY0bDIgaW50ZXJmYWNlCiAqICAgICAgb2YgdGhl IGluc3RhbGxlZCBjYW1lcmEgZHJpdmVyLiAoc2VlIGFwcHMvdjRsMi88Pi5jKQogKgogKiBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQg YW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlCiAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG b3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgogKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBPcmlnaW5hbCBBdXRob3I6 IEJpbGwgRGlya3MgPGJkaXJrc0BwYWNiZWxsLm5ldD4KICogICAgICAgICAgICAgICAgICBi YXNlZCBvbiBjb2RlIGJ5IEFsYW4gQ294LCA8YWxhbkBjeW1ydS5uZXQ+CiAqLwojaW5jbHVk ZSA8bGludXgvY29uZmlnLmg+CS8qIHJldHJpZXZlIHRoZSBDT05GSUdfKiBtYWNyb3MgKi8K I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgoj aW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNs dWRlIDxsaW51eC9mcy5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxs aW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiNpbmNsdWRlIDxsaW51 eC9tbS5oPgojaW5jbHVkZSA8bGludXgvcG9sbC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0 Lmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L3NjaGVk Lmg+CiNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgojaW5jbHVkZSA8bGludXgvd3JhcHBl ci5oPgojaW5jbHVkZSA8YXNtLWFybS91bmlzdGQuaD4KI2luY2x1ZGUgPGFzbS91YWNjZXNz Lmg+CiNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgojaW5jbHVkZSA8YXNtL3BhZ2UuaD4KI2Rl ZmluZSBNT0RVTEVfTkFNRSAidjRsMi1vbWFwIgojaW5jbHVkZSAiY29tbW9uLmgiCiNpbmNs dWRlICJjYW1pZi5oIgojaW5jbHVkZSAidjRsMi5oIgoKI2RlZmluZSBTVEFUSUMKCgovLyNk ZWZpbmUJZGJnKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgIiVzOiAiIGZtdCwg X19mdW5jX18sICMjIGFyZ3MpCiNkZWZpbmUJZGJnKGZtdCwgYXJncy4uLikKI2RlZmluZSBF TlRSWSh4Li4uKSBkYmcoImVudGVyXG4iKTsKI2RlZmluZSBFWElUKHguLi4pICBkYmcoImV4 aXRcbiIpOwoKCnN0YXRpYyBzdHJ1Y3QgdHFfc3RydWN0IGZiaW5mb190c2tfcV9lbnRyeTsK c3RhdGljIHZvaWQgdXBkYXRlX2ZiaW5mb190YXNrICh2b2lkICopOwoKZXh0ZXJuIGxvbmcg c3lzX2lvY3RsICh1bnNpZ25lZCBpbnQgZmQsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVk IGxvbmcgYXJnKTsKCiNkZWZpbmUgREVGQVVMVF9GUkFNRV9CVUZGICIvZGV2L2ZiMCIKCi8q CiAqIFN1cHBvcnRlZCBwaXhlbCBmb3JtYXRzLiBBbGwgdGhlIHVuZGVybHlpbmcgY2FtZXJh cyBtdXN0IHN1cHBvcnQKICogdGhlc2UgcGl4ZWwgZm9ybWF0cy4gSWYgdGhlIGNhbWVyYSBk b2Vzbid0IHN1cHBvcnQgYSBwaXhlbCBmb3JtYXQKICogaW4gaGFyZHdhcmUsIGl0IHdpbGwg cHJvZ3JhbSB0aGUgY2FtZXJhIGZvciB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQKICogZm9ybWF0 IGFuZCB0aGVuIHVzZSBpdHMgY29udmVydF9pbWFnZSgpIG1ldGhvZC4KICovCnN0YXRpYyBz dHJ1Y3QgdjRsMl9mbXRkZXNjIGNhcGZtdFtdID0gewogIHswLCBWNEwyX0JVRl9UWVBFX1ZJ REVPX0NBUFRVUkUsIDAsIHsiUkdCLTE2ICg1LTUtNSkifSwgVjRMMl9QSVhfRk1UX1JHQjU1 NSwKICAgfSwKICB7MSwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAwLCB7IlJHQi0x NiAoNS02LTUpIn0sIFY0TDJfUElYX0ZNVF9SR0I1NjUsCiAgIH0sCiAgezIsIFY0TDJfQlVG X1RZUEVfVklERU9fQ0FQVFVSRSwgMCwgeyJSR0ItMjQgKEItRy1SKSJ9LCBWNEwyX1BJWF9G TVRfQkdSMjQsCiAgIH0sCiAgezMsIFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSwgMCwg eyJZVVYgNDoyOjIgKFktVS1ZLVYpIn0sCiAgIFY0TDJfUElYX0ZNVF9ZVVlWLAogICB9LAoj aWYgMAogIHs0LCBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUsIDAsIHsiUkdCLTMyIChC LUctUi0/KSJ9LAogICBWNEwyX1BJWF9GTVRfQkdSMzIsCiAgIH0sCiAgezUsIFY0TDJfQlVG X1RZUEVfVklERU9fQ0FQVFVSRSwgMCwgeyJHcmV5c2NhbGUtOCJ9LCBWNEwyX1BJWF9GTVRf R1JFWSwKICAgfSwKICB7NiwgVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFLCAwLCB7IllV ViA0OjI6MCAocGxhbmFyKSJ9LAogICBWNEwyX1BJWF9GTVRfWVVWNDIwLAogICB9LAojZW5k aWYKfTsKCiNkZWZpbmUgTlVNX0NBUEZNVCAoc2l6ZW9mKGNhcGZtdCkvc2l6ZW9mKGNhcGZt dFswXSkpCiNkZWZpbmUgTUFYX0JQUCAzCQkvKiBtYXggYnl0ZXMgcGVyIHBpeGVsIChCR1Iy NCkgKi8KCi8qCiAqIEFycmF5IG9mIGltYWdlIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSB2 YXJpb3VzIGNhbWVyYXMgdXNlZCBvbgogKiBPTUFQLiBUaGVzZSBtdXN0IGJlIG9yZGVyZWQg ZnJvbSBzbWFsbGVzdCBpbWFnZSBzaXplIHRvIGxhcmdlc3QuCiAqIFRoZSBzcGVjaWZpYyBj YW1lcmEgd2lsbCBzdXBwb3J0IGFsbCBvciBhIHN1YnNldCBvZiB0aGVzZS4KICovCmNvbnN0 IHN0cnVjdCBpbWFnZV9zaXplIG9tYXBfaW1hZ2Vfc2l6ZVtdID0gewogIHs4OCwgNzJ9LAkJ CS8qIFFRQ0lGICovCiAgezE2MCwgMTIwfSwJCQkvKiBRUVZHQSAqLwogIHsxNzYsIDE0NH0s CQkJLyogUUNJRiAqLwogIHszMjAsIDI0MH0sCQkJLyogUVZHQSAqLwogIHszNTIsIDI4OH0s CQkJLyogQ0lGICovCiAgezY0MCwgNDgwfSwJCQkvKiBWR0EgKi8KICB7MTI4MCwgOTYwfSwJ CQkvKiBTWEdBICovCn07CgojZGVmaW5lIE5VTV9JTUFHRV9TSVpFIChzaXplb2Yob21hcF9p bWFnZV9zaXplKS9zaXplb2Yob21hcF9pbWFnZV9zaXplWzBdKSkKCi8qCiAqIEFycmF5IG9m IHBpeGVsIGZvcm1hdHMgc3VwcG9ydGVkIGJ5IHRoZSB2YXJpb3VzIGNhbWVyYXMgdXNlZCBv bgogKiBPTUFQLiBUaGUgY2FtZXJhIHVzZXMgaXRzIGNvbnZlcnRfaW1hZ2UoKSBtZXRob2Qg dG8gY29udmVydCBmcm9tCiAqIGEgbmF0aXZlIHBpeGVsIGZvcm1hdCB0byBvbmUgb2YgdGhl IGFib3ZlIGNhcGZtdFtdIGZvcm1hdHMuCiAqLwpjb25zdCBpbnQgb21hcF9waXhmbXRfZGVw dGhbXSA9IHsKICAxNiwJCQkJLyogWVVWICovCiAgMTYsCQkJCS8qIFJHQjU2NSAqLwogIDE1 CQkJCS8qIFJHQjU1NSAqLwp9OwoKLyogRXh0cmVtZSB2aWRlbyBkaW1lbnNpb25zICovCiNk ZWZpbmUgTUlOX1dJRFRIICAzMgojZGVmaW5lIE1JTl9IRUlHSFQgMjQKI2RlZmluZSBNQVhf V0lEVEggIChvbWFwX2ltYWdlX3NpemVbTlVNX0lNQUdFX1NJWkUtMV0ud2lkdGgpCiNkZWZp bmUgTUFYX0hFSUdIVCAob21hcF9pbWFnZV9zaXplW05VTV9JTUFHRV9TSVpFLTFdLmhlaWdo dCkKI2RlZmluZSBNQVhfSU1BR0VfU0laRSAoTUFYX1dJRFRIICogTUFYX0hFSUdIVCAqIE1B WF9CUFApCgojZGVmaW5lIE1BWF9GUkFNRV9BR0UgICAgICAgICAgIDIwMAkvKiBtcyAqLwoK I3VuZGVmIGRiZwojZGVmaW5lIGRiZyh4Li4uKQoKCgovKgogKiAgICAgIFRoZSBDYXB0dXJl IGRldmljZSBzdHJ1Y3R1cmUgYXJyYXkuIFRoaXMgaXMgdGhlIG9ubHkgZ2xvYmFsCiAqICAg ICAgdmFyaWFibGUgaW4gdGhlIG1vZHVsZSBiZXNpZGVzIHRob3NlIHVzZWQgYnkgdGhlIGRl dmljZSBwcm9iaW5nCiAqICAgICAgYW5kIGVudW1lcmF0aW9uIHJvdXRpbmVzIChjb21tYW5k IGxpbmUgb3ZlcnJpZGVzKQogKi8KCi8vc3RhdGljIGludCB1bml0X3ZpZGVvID0gMDsKLy9N T0RVTEVfUEFSTSh1bml0X3ZpZGVvLCAiMS0iX19NT0RVTEVfU1RSSU5HKE5CT0FSRFMpImki KTsKCgpTVEFUSUMgaW50CmdldF9mcmFtZWJ1ZmZlcl9pbmZvIChzdHJ1Y3QgY2FwdHVyZV9k ZXZpY2UgKmRldikKewogIGludCBmYmZkLCByZXRjb2RlOwoKCUVOVFJZICgpOwogIGRldi0+ ZmJpbmZvX3ZhbGlkID0gMDsKICBmYmZkID0gc3lzX29wZW4gKERFRkFVTFRfRlJBTUVfQlVG RiwgT19SRFdSLCAwKTsKICBpZiAoZmJmZCA8IDApCiAgICB7CiAgICAgIGVyciAoIkVycm9y OiBjYW5ub3Qgb3BlbiBmcmFtZWJ1ZmZlciBkZXZpY2UuXG4iKTsKICAgICAgcmV0dXJuIGZi ZmQ7CiAgICB9CiAgLy8gR2V0IGZpeGVkIHNjcmVlbiBpbmZvcm1hdGlvbgogIGlmICgocmV0 Y29kZSA9IHN5c19pb2N0bCAoZmJmZCwgRkJJT0dFVF9GU0NSRUVOSU5GTywKCQkJICAgICh1 bnNpZ25lZCBsb25nKSAoJmRldi0+ZmJmaXgpKSkpCiAgICB7CiAgICAgIGVyciAoIkVycm9y IHJlYWRpbmcgZmIgZml4ZWQgaW5mb3JtYXRpb24uXG4iKTsKICAgICAgcmV0dXJuIHJldGNv ZGU7CiAgICB9CiAgLy8gR2V0IHZhcmlhYmxlIHNjcmVlbiBpbmZvcm1hdGlvbgogIGlmICgo cmV0Y29kZSA9IHN5c19pb2N0bCAoZmJmZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywKCQkJICAg ICh1bnNpZ25lZCBsb25nKSAoJmRldi0+ZmJ2YXIpKSkpCiAgICB7CiAgICAgIGVyciAoIkVy cm9yIHJlYWRpbmcgZmIgdmFyIGluZm9ybWF0aW9uLlxuIik7CiAgICAgIHJldHVybiByZXRj b2RlOwogICAgfQoKICBzeXNfY2xvc2UgKGZiZmQpOwogIGRldi0+ZmJpbmZvX3ZhbGlkID0g MTsKCiAgcmV0dXJuIDA7Cn0KCgoKU1RBVElDIGludAppc3FydCAodW5zaWduZWQgaW50IHEp CnsJCQkJLyogICAgIEEgbGl0dGxlIGludGVnZXIgc3F1YXJlIHJvb3Qgcm91dGluZSAqLwog IGludCBpOwogIGludCByOwogIHVuc2lnbmVkIGludCBiMiA9IDB4NDAwMDAwMDA7CiAgdW5z aWduZWQgaW50IHQ7CgoJRU5UUlkgKCk7CiAgZm9yIChpID0gMTYsIHIgPSAwOyBpID4gMCAm JiBxOyAtLWkpCiAgICB7CiAgICAgIHQgPSAoKHVuc2lnbmVkIGludCkgciA8PCBpKSArIGIy OwogICAgICBpZiAodCA8PSBxKQoJCQkJewoJCQkJCXEgLT0gdDsKCQkJCQlyIHw9ICgxIDw8 IChpIC0gMSkpOwoJCQkJfQogICAgICBiMiA+Pj0gMjsKICAgIH0KICByZXR1cm4gcjsKfQoK U1RBVElDIHVuc2lnbmVkIGxvbmcKY3VycmVudF90aW1lX21zICh2b2lkKQp7CiAgc3RydWN0 IHRpbWV2YWwgbm93OwoKCUVOVFJZICgpOwogIGRvX2dldHRpbWVvZmRheSAoJm5vdyk7CiAg cmV0dXJuIG5vdy50dl9zZWMgKiAxMDAwICsgbm93LnR2X3VzZWMgLyAxMDAwOwp9CgoKLyoK ICogIFNpbXBsZSBxdWV1ZSBtYW5hZ2VtZW50IHRha2VuIGZyb20gdjRsMiBvbGQgaGVscGlu ZyBhcGkKICovCnN0YXRpYyByd2xvY2tfdCByd19sb2NrX3VubG9ja2VkID0gUldfTE9DS19V TkxPQ0tFRDsKdm9pZAp2NGwyX3FfaW5pdCAoc3RydWN0IHY0bDJfcXVldWUgKnEpCnsKICBp ZiAocSA9PSBOVUxMKQogICAgcmV0dXJuOwogIHEtPnFsb2NrID0gcndfbG9ja191bmxvY2tl ZDsKICBxLT5mb3J3ID0gKHN0cnVjdCB2NGwyX3Ffbm9kZSAqKSBxOwogIHEtPmJhY2sgPSAo c3RydWN0IHY0bDJfcV9ub2RlICopIHE7Cn0KCnZvaWQKdjRsMl9xX2FkZF9oZWFkIChzdHJ1 Y3QgdjRsMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfcV9ub2RlICpub2RlKQp7CiAgdW5zaWdu ZWQgbG9uZyBmbGFnczsKICBpZiAocSA9PSBOVUxMIHx8IG5vZGUgPT0gTlVMTCkKICAgIHJl dHVybjsKICBpZiAocS0+Zm9ydyA9PSBOVUxMIHx8IHEtPmJhY2sgPT0gTlVMTCkKICAgIHY0 bDJfcV9pbml0IChxKTsKICB3cml0ZV9sb2NrX2lycXNhdmUgKCYocS0+cWxvY2spLCBmbGFn cyk7CiAgbm9kZS0+Zm9ydyA9IHEtPmZvcnc7CiAgbm9kZS0+YmFjayA9IChzdHJ1Y3QgdjRs Ml9xX25vZGUgKikgcTsKICBxLT5mb3J3LT5iYWNrID0gbm9kZTsKICBxLT5mb3J3ID0gbm9k ZTsKICB3cml0ZV91bmxvY2tfaXJxcmVzdG9yZSAoJihxLT5xbG9jayksIGZsYWdzKTsKfQoK dm9pZAp2NGwyX3FfYWRkX3RhaWwgKHN0cnVjdCB2NGwyX3F1ZXVlICpxLCBzdHJ1Y3QgdjRs Ml9xX25vZGUgKm5vZGUpCnsKICB1bnNpZ25lZCBsb25nIGZsYWdzOwogIGlmIChxID09IE5V TEwgfHwgbm9kZSA9PSBOVUxMKQogICAgcmV0dXJuOwogIGlmIChxLT5mb3J3ID09IE5VTEwg fHwgcS0+YmFjayA9PSBOVUxMKQogICAgdjRsMl9xX2luaXQgKHEpOwogIHdyaXRlX2xvY2tf aXJxc2F2ZSAoJihxLT5xbG9jayksIGZsYWdzKTsKICBub2RlLT5mb3J3ID0gKHN0cnVjdCB2 NGwyX3Ffbm9kZSAqKSBxOwogIG5vZGUtPmJhY2sgPSBxLT5iYWNrOwogIHEtPmJhY2stPmZv cncgPSBub2RlOwogIHEtPmJhY2sgPSBub2RlOwogIHdyaXRlX3VubG9ja19pcnFyZXN0b3Jl ICgmKHEtPnFsb2NrKSwgZmxhZ3MpOwp9Cgp2b2lkICoKdjRsMl9xX2RlbF9oZWFkIChzdHJ1 Y3QgdjRsMl9xdWV1ZSAqcSkKewogIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgc3RydWN0IHY0 bDJfcV9ub2RlICpub2RlOwogIGlmIChxID09IE5VTEwpCiAgICByZXR1cm4gTlVMTDsKICB3 cml0ZV9sb2NrX2lycXNhdmUgKCYocS0+cWxvY2spLCBmbGFncyk7CiAgaWYgKHEtPmZvcncg PT0gTlVMTCB8fCBxLT5iYWNrID09IE5VTEwgfHwKICAgICAgcS0+Zm9ydyA9PSAoc3RydWN0 IHY0bDJfcV9ub2RlICopIHEgfHwKICAgICAgcS0+YmFjayA9PSAoc3RydWN0IHY0bDJfcV9u b2RlICopIHEpCiAgICB7CiAgICAgIHdyaXRlX3VubG9ja19pcnFyZXN0b3JlICgmKHEtPnFs b2NrKSwgZmxhZ3MpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICBub2RlID0gcS0+Zm9y dzsKICBub2RlLT5mb3J3LT5iYWNrID0gKHN0cnVjdCB2NGwyX3Ffbm9kZSAqKSBxOwogIHEt PmZvcncgPSBub2RlLT5mb3J3OwogIG5vZGUtPmZvcncgPSBOVUxMOwogIG5vZGUtPmJhY2sg PSBOVUxMOwogIHdyaXRlX3VubG9ja19pcnFyZXN0b3JlICgmKHEtPnFsb2NrKSwgZmxhZ3Mp OwogIHJldHVybiBub2RlOwp9Cgp2b2lkICoKdjRsMl9xX2RlbF90YWlsIChzdHJ1Y3QgdjRs Ml9xdWV1ZSAqcSkKewogIHVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAgc3RydWN0IHY0bDJfcV9u b2RlICpub2RlOwogIGlmIChxID09IE5VTEwpCiAgICByZXR1cm4gTlVMTDsKICB3cml0ZV9s b2NrX2lycXNhdmUgKCYocS0+cWxvY2spLCBmbGFncyk7CiAgaWYgKHEtPmZvcncgPT0gTlVM TCB8fCBxLT5iYWNrID09IE5VTEwgfHwKICAgICAgcS0+Zm9ydyA9PSAoc3RydWN0IHY0bDJf cV9ub2RlICopIHEgfHwKICAgICAgcS0+YmFjayA9PSAoc3RydWN0IHY0bDJfcV9ub2RlICop IHEpCiAgICB7CiAgICAgIHdyaXRlX3VubG9ja19pcnFyZXN0b3JlICgmKHEtPnFsb2NrKSwg ZmxhZ3MpOwogICAgICByZXR1cm4gTlVMTDsKICAgIH0KICBub2RlID0gcS0+YmFjazsKICBu b2RlLT5iYWNrLT5mb3J3ID0gKHN0cnVjdCB2NGwyX3Ffbm9kZSAqKSBxOwogIHEtPmJhY2sg PSBub2RlLT5iYWNrOwogIG5vZGUtPmZvcncgPSBOVUxMOwogIG5vZGUtPmJhY2sgPSBOVUxM OwogIHdyaXRlX3VubG9ja19pcnFyZXN0b3JlICgmKHEtPnFsb2NrKSwgZmxhZ3MpOwogIHJl dHVybiBub2RlOwp9Cgp2b2lkICoKdjRsMl9xX3BlZWtfaGVhZCAoc3RydWN0IHY0bDJfcXVl dWUgKnEpCnsKICB1bnNpZ25lZCBsb25nIGZsYWdzOwogIHN0cnVjdCB2NGwyX3Ffbm9kZSAq bm9kZTsKICByZWFkX2xvY2tfaXJxc2F2ZSAoJihxLT5xbG9jayksIGZsYWdzKTsKICBpZiAo cSA9PSBOVUxMIHx8IHEtPmZvcncgPT0gTlVMTCB8fCBxLT5mb3J3ID09IChzdHJ1Y3QgdjRs Ml9xX25vZGUgKikgcSkKICAgIHsKICAgICAgcmVhZF91bmxvY2tfaXJxcmVzdG9yZSAoJihx LT5xbG9jayksIGZsYWdzKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgbm9kZSA9IHEt PmZvcnc7CiAgcmVhZF91bmxvY2tfaXJxcmVzdG9yZSAoJihxLT5xbG9jayksIGZsYWdzKTsK ICByZXR1cm4gbm9kZTsKfQoKdm9pZCAqCnY0bDJfcV9wZWVrX3RhaWwgKHN0cnVjdCB2NGwy X3F1ZXVlICpxKQp7CiAgdW5zaWduZWQgbG9uZyBmbGFnczsKICBzdHJ1Y3QgdjRsMl9xX25v ZGUgKm5vZGU7CiAgcmVhZF9sb2NrX2lycXNhdmUgKCYocS0+cWxvY2spLCBmbGFncyk7CiAg aWYgKHEgPT0gTlVMTCB8fCBxLT5iYWNrID09IE5VTEwgfHwgcS0+YmFjayA9PSAoc3RydWN0 IHY0bDJfcV9ub2RlICopIHEpCiAgICB7CiAgICAgIHJlYWRfdW5sb2NrX2lycXJlc3RvcmUg KCYocS0+cWxvY2spLCBmbGFncyk7CiAgICAgIHJldHVybiBOVUxMOwogICAgfQogIG5vZGUg PSBxLT5iYWNrOwogIHJlYWRfdW5sb2NrX2lycXJlc3RvcmUgKCYocS0+cWxvY2spLCBmbGFn cyk7CiAgcmV0dXJuIG5vZGU7Cn0KCnZvaWQgKgp2NGwyX3FfeWFua19ub2RlIChzdHJ1Y3Qg djRsMl9xdWV1ZSAqcSwgc3RydWN0IHY0bDJfcV9ub2RlICpub2RlKQp7CiAgdW5zaWduZWQg bG9uZyBmbGFnczsKICBzdHJ1Y3QgdjRsMl9xX25vZGUgKnQ7CiAgaWYgKHY0bDJfcV9wZWVr X2hlYWQgKHEpID09IE5VTEwgfHwgbm9kZSA9PSBOVUxMKQogICAgcmV0dXJuIE5VTEw7CiAg d3JpdGVfbG9ja19pcnFzYXZlICgmKHEtPnFsb2NrKSwgZmxhZ3MpOwogIGZvciAodCA9IHEt PmZvcnc7IHQgIT0gKHN0cnVjdCB2NGwyX3Ffbm9kZSAqKSBxOyB0ID0gdC0+Zm9ydykKCXsK CQlpZiAodCA9PSBub2RlKQoJCQl7CgkJCQlub2RlLT5iYWNrLT5mb3J3ID0gbm9kZS0+Zm9y dzsKCQkJCW5vZGUtPmZvcnctPmJhY2sgPSBub2RlLT5iYWNrOwoJCQkJbm9kZS0+Zm9ydyA9 IE5VTEw7CgkJCQlub2RlLT5iYWNrID0gTlVMTDsKCQkJCXdyaXRlX3VubG9ja19pcnFyZXN0 b3JlICgmKHEtPnFsb2NrKSwgZmxhZ3MpOwoJCQkJcmV0dXJuIG5vZGU7CgkJCX0KCX0KICB3 cml0ZV91bmxvY2tfaXJxcmVzdG9yZSAoJihxLT5xbG9jayksIGZsYWdzKTsKICByZXR1cm4g TlVMTDsKfQoKaW50CnY0bDJfcV9sYXN0IChzdHJ1Y3QgdjRsMl9xdWV1ZSAqcSkKewovKiAg VGhpcyBmdW5jdGlvbiBieSBPbGl2aWVyIENhcm1vbmEgICovCgogIHVuc2lnbmVkIGxvbmcg ZmxhZ3M7CiAgcmVhZF9sb2NrX2lycXNhdmUgKCYocS0+cWxvY2spLCBmbGFncyk7CiAgaWYg KHEgPT0gTlVMTCkKICAgIHsKICAgICAgcmVhZF91bmxvY2tfaXJxcmVzdG9yZSAoJihxLT5x bG9jayksIGZsYWdzKTsKICAgICAgcmV0dXJuIC0xOwogICAgfQogIGlmIChxLT5mb3J3ID09 IE5VTEwgfHwgcS0+YmFjayA9PSBOVUxMIHx8CiAgICAgIHEtPmZvcncgPT0gKHN0cnVjdCB2 NGwyX3Ffbm9kZSAqKSBxIHx8CiAgICAgIHEtPmJhY2sgPT0gKHN0cnVjdCB2NGwyX3Ffbm9k ZSAqKSBxKQogICAgewogICAgICByZWFkX3VubG9ja19pcnFyZXN0b3JlICgmKHEtPnFsb2Nr KSwgZmxhZ3MpOwogICAgICByZXR1cm4gLTE7CiAgICB9CiAgaWYgKHEtPmZvcncgPT0gcS0+ YmFjaykKICAgIHsKICAgICAgcmVhZF91bmxvY2tfaXJxcmVzdG9yZSAoJihxLT5xbG9jayks IGZsYWdzKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAgcmVhZF91bmxvY2tfaXJxcmVzdG9y ZSAoJihxLT5xbG9jayksIGZsYWdzKTsKICByZXR1cm4gMDsKfQoKLy9lbmQgb2Ygc25hcHNo b3Qgb2xkIGhlbHBpbmcgYXBpCgovKgogKgogKiAgICAgIFYgSSBEIEUgTyAgIEQgRSBDIE8g RCBFIFIgUwogKgogKi8KCgoKU1RBVElDIGludApkZWNvZGVyX3NldF9pbnB1dCAoc3RydWN0 IGNhcHR1cmVfZGV2aWNlICpkZXYsIGludCBpKQp7CiAgRU5UUlkgKCk7CiAgZGV2LT5pbnB1 dCA9IGk7CiAgLy9kZXYtPnZpZGVjLmRlY29kZXJfaXNfc3RhYmxlID0gMDsKICAvKiAgVE9E TzogU3dpdGNoIHRoZSBoYXJkd2FyZSB0byB0aGUgbmV3IGlucHV0ICAqLwogIHJldHVybiAx Owp9CgpTVEFUSUMgaW50CmRlY29kZXJfc2V0X2ZyYW1lX3BlcmlvZCAoc3RydWN0IGNhcHR1 cmVfZGV2aWNlICpkZXYsIHN0cnVjdCB2NGwyX2ZyYWN0IGZyYWN0KQp7CiAgaW50IHJldGNv ZGUgPSAtRUlOVkFMOwoJRU5UUlkgKCk7CiAgaWYgKGRldi0+Y2FtaWYtPnNldF9mcmFtZV9w ZXJpb2QpCiAgICByZXRjb2RlID0gZGV2LT5jYW1pZi0+c2V0X2ZyYW1lX3BlcmlvZCAoJmZy YWN0KTsKCWVsc2UKCQlyZXRjb2RlID0gLUVOT0VYRUM7CgogIGlmIChyZXRjb2RlID09IDAp CiAgICB7CgkJCWRldi0+dmlkZWMuZnJhbWVfZnJhY3Q9ZnJhY3Q7CiAgICAgIHJldHVybiAw OwogICAgfQoJCgogIGRldi0+dmlkZWMuZnJhbWVfZnJhY3QubnVtZXJhdG9yID0gMTsKCWRl di0+dmlkZWMuZnJhbWVfZnJhY3QuZGVub21pbmF0b3IgPSAzMDsKICByZXR1cm4gcmV0Y29k ZTsKfQoKU1RBVElDIGludApkZWNvZGVyX3NldF9zdGFuZGFyZCAoc3RydWN0IGNhcHR1cmVf ZGV2aWNlICpkZXYsIGludCB4KQp7CiAgZGV2LT52aWRlYy5zdGFuZGFyZCA9IHg7CiAgc3Ry dWN0IHY0bDJfZnJhY3QgZnJhY3Q9ezEsMzB9OwoJRU5UUlkgKCk7CiAgc3dpdGNoICh4KQog ICAgewogICAgY2FzZSBWNEwyX1NURF9OVFNDOgogICAgICBmcmFjdC5kZW5vbWluYXRvciA9 IDMwOwogICAgICBicmVhazsKICAgIGNhc2UgVjRMMl9TVERfUEFMOgogICAgY2FzZSBWNEwy X1NURF9TRUNBTToKICAgICAgZnJhY3QuZGVub21pbmF0b3IgPSAyNTsKICAgICAgYnJlYWs7 CiAgICB9CgogIHJldHVybiBkZWNvZGVyX3NldF9mcmFtZV9wZXJpb2QgKGRldiwgZnJhY3Qp Owp9CgpTVEFUSUMgaW50CmRlY29kZXJfc2V0X3Zjcm1vZGUgKHN0cnVjdCBjYXB0dXJlX2Rl dmljZSAqZGV2LCBpbnQgeCkKewoJRU5UUlkgKCk7CiAgZGV2LT5zb3VyY2VbZGV2LT5pbnB1 dF0udmNybW9kZSA9IHg7CiAgLyogIFRPRE86IFN3aXRjaCBkZWNvZGVyIHRvIFZDUiBzeW5j IHRpbWluZyBtb2RlICAqLwogIHJldHVybiAxOwp9CgpTVEFUSUMgaW50CmRlY29kZXJfaXNf c3RhYmxlIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldikKewoJRU5UUlkgKCk7CiAgLyog IFRPRE86IENoZWNrIGlmIGRlY29kZXIgaXMgc3luY2VkIHRvIGlucHV0ICAqLwogIHJldHVy biAxOwp9CgoKU1RBVElDIGludApkZWNvZGVyX2luaXQgKHN0cnVjdCBjYXB0dXJlX2Rldmlj ZSAqZGV2KQp7CglFTlRSWSAoKTsKCWRlY29kZXJfc2V0X2ZyYW1lX3BlcmlvZChkZXYsZGV2 LT52aWRlYy5mcmFtZV9mcmFjdCk7CglkZWNvZGVyX3NldF9pbnB1dChkZXYsZGV2LT5pbnB1 dCk7CiAgcmV0dXJuIDA7Cn0KCgpTVEFUSUMgaW50CmRlY29kZXJfcHJvYmUgKHN0cnVjdCBj YXB0dXJlX2RldmljZSAqZGV2KQp7CglFTlRSWSAoKTsKICAvKiAgVE9ETzogUHJvYmUgSTJD IGJ1cyBvciB3aGF0ZXZlciBmb3IgdGhlIHZpZGVvIGRlY29kZXIgKi8KICAvL2RiZygiRm91 bmQgZGVjb2RlciBjaGlwXG4iKTsKICByZXR1cm4gMTsJCQkvKiAgRm91bmQgICovCn0KCgov KiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0g LSAtIC0gLSAtIC0gLQogKgogKiAgICAgIFByb2JlIEkyQyBidXMgZm9yIHZpZGVvIGRlY29k ZXIgYW5kIGZpbGwgaW4gdGhlIGRldmljZSBmaWVsZHMKICovClNUQVRJQyBpbnQKZmluZF9k ZWNvZGVyIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldikKewoJRU5UUlkgKCk7CiAgaWYg KCFkZWNvZGVyX3Byb2JlIChkZXYpKQogICAgcmV0dXJuIDA7CQkJLyogIEZhaWx1cmUgICov CiAgcmV0dXJuIDE7Cn0KClNUQVRJQyB2b2lkCnNldF92aWRlb19pbnB1dCAoc3RydWN0IGNh cHR1cmVfZGV2aWNlICpkZXYsIGludCBpKQp7CglFTlRSWSAoKTsKICBpZiAoaSA8IDAgfHwg aSA+PSBkZXYtPnZpZGVjLm51bV9pbnB1dHMpCiAgICByZXR1cm47CiAgZGV2LT52aWRlYy5z ZXRfaW5wdXQgKGRldiwgaSk7CiAgZGV2LT52aWRlYy5zZXRfdmNybW9kZSAoZGV2LCBkZXYt PnNvdXJjZVtpXS52Y3Jtb2RlKTsKfQoKCgovKgogKgogKiAgICAgIFYgSSBEIEUgTyAgIEMg QSBQIFQgVSBSIEUgICBGIFUgTiBDIFQgSSBPIE4gUwogKgogKi8KCgovKiAgU3RvcCB0aGUg bXVzaWMhCiAqLwpTVEFUSUMgdm9pZApjYXB0dXJlX2Fib3J0IChzdHJ1Y3QgY2FwdHVyZV9k ZXZpY2UgKmRldikKewogIEVOVFJZICgpOwoKICAvKiAgVHVybiBvZmYgdGhlIGNhcHR1cmUg aGFyZHdhcmUgICovCiAgZGV2LT5jYW1pZi0+YWJvcnQgKCk7CiAgZGV2LT5jYXB0dXJlX3N0 YXJ0ZWQgPSAwOwoJZGV2LT5zdHJlYW1pbmcgPSAwOwoKCiAgd2hpbGUgKE5VTEwgIT0gdjRs Ml9xX2RlbF9oZWFkICgmZGV2LT5zdHJlYW1fcV9kb25lKSk7CiAgd2hpbGUgKE5VTEwgIT0g djRsMl9xX2RlbF9oZWFkICgmZGV2LT5zdHJlYW1fcV9jYXB0dXJlKSk7CiAgLyoKICAgKiBX YWtlIHVwIGFueSBwcm9jZXNzZXMgdGhhdCBtaWdodCBiZSB3YWl0aW5nIGZvciBhIGZyYW1l CiAgICogYW5kIGxldCB0aGVtIHJldHVybiBhbiBlcnJvcgogICAqLwogIHdha2VfdXBfaW50 ZXJydXB0aWJsZSAoJmRldi0+bmV3X3ZpZGVvX2ZyYW1lKTsKCQogIEVYSVQgKCk7Cn0KCgpT VEFUSUMgdm9pZAp2YWxpZGF0ZV9mb3JtYXQgKHN0cnVjdCB2NGwyX3BpeF9mb3JtYXQgKmZt dCkKewogIGludCBuOwoKICBFTlRSWSAoKTsKICBzd2l0Y2ggKGZtdC0+cGl4ZWxmb3JtYXQp CiAgICB7CiAgICBjYXNlIFY0TDJfUElYX0ZNVF9HUkVZOgogICAgY2FzZSBWNEwyX1BJWF9G TVRfWVVWNDIwOgogICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1OgogICAgY2FzZSBWNEwy X1BJWF9GTVRfUkdCNTY1OgogICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVZVjoKICAgIGNhc2Ug VjRMMl9QSVhfRk1UX1VZVlk6CiAgICBjYXNlIFY0TDJfUElYX0ZNVF9CR1IyNDoKICAgIGNh c2UgVjRMMl9QSVhfRk1UX0JHUjMyOgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAg IGRiZyAoInVua25vd24gZm9ybWF0ICU0LjRzXG4iLCAoY2hhciAqKSAmZm10LT5waXhlbGZv cm1hdCk7CiAgICAgIGZtdC0+cGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKICAg ICAgZm10LT5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKICAgICAgYnJlYWs7CiAgICB9CiAg Ly9maW5kIG5lYXJlc3Qgc2l6ZQogIGRiZyAoInJlcXVlc3RlZCBmb3JtYXQgV3hIIDogJWR4 JWRcbiIsIGZtdC0+d2lkdGgsIGZtdC0+aGVpZ2h0KTsKICBuID0gTlVNX0lNQUdFX1NJWkUg LSAxOwogIGlmIChmbXQtPndpZHRoID4gTUFYX1dJRFRIKQogICAgZm10LT53aWR0aCA9IE1B WF9XSURUSDsKICB3aGlsZSAobiA+IDAgJiYgb21hcF9pbWFnZV9zaXplW25dLndpZHRoID4g Zm10LT53aWR0aCkKICAgIHsKICAgICAgLy9kYmcoIm4gOiVkLCAlZD4lZFxuIixuLG9tYXBf aW1hZ2Vfc2l6ZVtuXS53aWR0aCxmbXQtPndpZHRoKTsKICAgICAgbi0tOwogICAgfQogIGZt dC0+d2lkdGggPSBvbWFwX2ltYWdlX3NpemVbbl0ud2lkdGg7CiAgZm10LT5oZWlnaHQgPSBv bWFwX2ltYWdlX3NpemVbbl0uaGVpZ2h0OwogIGRiZyAoImdyYW50ZWQgZm9ybWF0IFd4SCA6 ICVkeCVkXG4iLCBmbXQtPndpZHRoLCBmbXQtPmhlaWdodCk7CiAgRVhJVCAoKTsKfQoKLyog IFRoZSBpbWFnZSBmb3JtYXQgaGFzIGNoYW5nZWQsIHdpZHRoLCBoZWlnaHQsIHBpeGVsIGZv cm1hdC4KICogIERlY2lkZSBpZiB0aGUgZm9ybWF0IGlzIG9rIG9yIHRha2UgdGhlIGNsb3Nl c3QgdmFsaWQgZm9ybWF0LgogKi8KU1RBVElDIGludApjYXB0dXJlX25ld19mb3JtYXQgKHN0 cnVjdCBjYXB0dXJlX2RldmljZSAqZGV2KQp7CgogIGludCBtYXhfaGVpZ2h0OwogIGludCBt YXhfd2lkdGg7CiAgaW50IHJldGNvZGUgPSAwOwoKICBFTlRSWSAoKTsKCiAgZGV2LT5yZWFk eV90b19jYXB0dXJlID0gMDsKCiAgbWF4X3dpZHRoID0gTUFYX1dJRFRIOwogIG1heF9oZWln aHQgPSBNQVhfSEVJR0hUOwoKICB2YWxpZGF0ZV9mb3JtYXQgKCYoZGV2LT5jbGllbnRmbXQp KTsKCiAgLy8gZGVzaXJlZCBkZWZhdWx0LgogIGRldi0+Y2xpZW50Zm10LmZpZWxkID0gVjRM Ml9GSUVMRF9UT1A7CgogIHN3aXRjaCAoZGV2LT5jbGllbnRmbXQucGl4ZWxmb3JtYXQpCiAg ICB7CiAgICBjYXNlIFY0TDJfUElYX0ZNVF9HUkVZOgogICAgICBkZXYtPmRlcHRoID0gODsK ICAgICAgZGV2LT5jYXB0dXJlX2J5cHAgPSAxOwogICAgICBicmVhazsKICAgIGNhc2UgVjRM Ml9QSVhfRk1UX1lVVjQyMDoKICAgICAgZGV2LT5kZXB0aCA9IDEyOwogICAgICBkZXYtPmNh cHR1cmVfYnlwcCA9IDI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdC NTU1OgogICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgogICAgICBkZXYtPmNsaWVudGZt dC5maWVsZCA9IFY0TDJfRklFTERfTk9ORTsKICAgICAgLy8gZmFsbCB0aHJ1CiAgICBjYXNl IFY0TDJfUElYX0ZNVF9ZVVlWOgogICAgY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKICAgICAg ZGV2LT5kZXB0aCA9IDE2OwogICAgICBkZXYtPmNhcHR1cmVfYnlwcCA9IDI7CiAgICAgIGJy ZWFrOwogICAgY2FzZSBWNEwyX1BJWF9GTVRfQkdSMjQ6CiAgICAgIGRldi0+ZGVwdGggPSAy NDsKICAgICAgZGV2LT5jYXB0dXJlX2J5cHAgPSAzOwogICAgICBkZXYtPmNsaWVudGZtdC5m aWVsZCA9IFY0TDJfRklFTERfTk9ORTsKICAgICAgYnJlYWs7CiAgICBjYXNlIFY0TDJfUElY X0ZNVF9CR1IzMjoKICAgICAgZGV2LT5kZXB0aCA9IDMyOwogICAgICBkZXYtPmNhcHR1cmVf YnlwcCA9IDQ7CiAgICAgIGRldi0+Y2xpZW50Zm10LmZpZWxkID0gVjRMMl9GSUVMRF9OT05F OwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIGRiZyAoInVua25vd24gZm9ybWF0 ICU0LjRzXG4iLCAoY2hhciAqKSAmZGV2LT5jbGllbnRmbXQucGl4ZWxmb3JtYXQpOwogICAg ICBkZXYtPmRlcHRoID0gMTY7CiAgICAgIGRldi0+Y2FwdHVyZV9ieXBwID0gMjsKICAgICAg ZGV2LT5jbGllbnRmbXQucGl4ZWxmb3JtYXQgPSBWNEwyX1BJWF9GTVRfWVVZVjsKICAgICAg ZGV2LT5jbGllbnRmbXQuZmllbGQgPSBWNEwyX0ZJRUxEX05PTkU7CiAgICAgIGJyZWFrOwog ICAgfQoKCiAgZGJnICgiYWZ0ZXIgbWF4IFd4SCA6ICVkeCVkXG4iLCBkZXYtPmNsaWVudGZt dC53aWR0aCwKICAgICAgIGRldi0+Y2xpZW50Zm10LmhlaWdodCk7CgogIC8vIHRlbGwgdGhl IGNhbWVyYSBhYm91dCB0aGUgZm9ybWF0LCBpdCBtYXkgbW9kaWZ5IHdpZHRoCiAgLy8gYW5k IGhlaWdodC4KICBpZiAoZGV2LT5jYW1lcmEpCiAgICB7CiAgICAgIGlmICgocmV0Y29kZSA9 IGRldi0+Y2FtZXJhLT5zZXRfZm9ybWF0ICgmZGV2LT5jbGllbnRmbXQpKSkKCQkJewoJCQkJ RVhJVCAoKTsKCQkJCXJldHVybiByZXRjb2RlOwoJCQl9CiAgICB9CgogIGRiZyAoImFmdGVy IGNhbWVyYSBXeEggOiAlZHglZFxuIiwgZGV2LT5jbGllbnRmbXQud2lkdGgsCiAgICAgICBk ZXYtPmNsaWVudGZtdC5oZWlnaHQpOwogIGRldi0+Y2xpZW50Zm10LnNpemVpbWFnZSA9CiAg ICAoZGV2LT5jbGllbnRmbXQud2lkdGggKiBkZXYtPmNsaWVudGZtdC5oZWlnaHQgKiBkZXYt PmRlcHRoKSAvIDg7CgogIGRldi0+cmVhZF9idWZmZXIudmlkYnVmLmxlbmd0aCA9CiAgICBk ZXYtPmNsaWVudGZtdC53aWR0aCAqIGRldi0+Y2xpZW50Zm10LmhlaWdodCAqIGRldi0+Y2Fw dHVyZV9ieXBwOwoKICBFWElUICgpOwogIHJldHVybiAwOwp9CgpTVEFUSUMgdm9pZCAKQnVm Zk1lbVJlc2VydmUgKHN0cnVjdCBzY2F0dGVyX25vZGUgKmJ1ZmZfbWVtLCBpbnQgbG9jaykK ewoJc3RydWN0IHNjYXR0ZXJfbm9kZSAqY3Vycj1idWZmX21lbTsKCWludCBqOwogIHZvaWQg KmFkZHJlc3M7CglzdHJ1Y3QgcGFnZSAqcGFnZTsKCUVOVFJZKCk7CglpZiAoY3VyciA9PSBO VUxMICkKCQl7CgkJCWVtZXJnKCJub3RoaW5nIHRvIHVubG9ja1xuIik7CgkJfQoJZWxzZQoJ CXsKCQkJd2hpbGUgKGN1cnIgIT0gTlVMTCkKCQkJCXsKCQkJCQlmb3IgKGogPSAoMSA8PCBn ZXRfb3JkZXIgKGN1cnItPmxlbikpIC0gMTsgaiA+PSAwOyBqLS0pCgkJCQkJewoJCQkJCQlh ZGRyZXNzID0gKHZvaWQgKikgKGN1cnItPmFkZHIgKyBqICogUEFHRV9TSVpFKTsKCQkJCQkJ aWYgKGFkZHJlc3MgIT0gTlVMTCkKCQkJCQkJCXsKCQkJCQkJCQlwYWdlID0gdmlydF90b19w YWdlICgodm9pZCAqKSAoYWRkcmVzcykpOwoJCQkJCQkJCWlmIChwYWdlICE9IE5VTEwpCgkJ CQkJCQkJCXsKCQkJCQkJCQkJCWlmICggbG9jayApCgkJCQkJCQkJCQkJLy9+IExvY2tQYWdl KHBhZ2UpOwkKCQkJCQkJCQkJCQlTZXRQYWdlUmVzZXJ2ZWQgKHBhZ2UpOwoJCQkJCQkJCQkJ ZWxzZQoJCQkJCQkJCQkJCS8vfiBVbmxvY2tQYWdlKHBhZ2UpOwoJCQkJCQkJCQkJCUNsZWFy UGFnZVJlc2VydmVkIChwYWdlKTsKCQkJCQkJCQkJCSN3YXJuaW5nCgkJCQkJCQkJCQlzZXRf cGFnZV9jb3VudChwYWdlLDApOwoJCQkJCQkJCQkJZW1lcmcoIiBwYWdlICVwIGNvdW50IDog JWQgZmxhZ3MgJVggXHQgQCAlcCBAcCAlcFxuIiwKCQkJCQkJCQkJCQkJcGFnZSwgcGFnZS0+ Y291bnQsIHBhZ2UtPmZsYWdzLAoJCQkJCQkJCQkJCQlhZGRyZXNzLCBwYWdlX2FkZHJlc3Mo cGFnZSkpOwoJCQkJCQkJCQl9CgkJCQkJCQkJZWxzZQoJCQkJCQkJCQl7CgkJCQkJCQkJCQll bWVyZygicGFnZSA9PSBOVUxMIFxuIik7CgkJCQkJCQkJCX0KCQkJCQkJCX0KCQkJCQkJZWxz ZQoJCQkJCQkJewoJCQkJCQkJCWVtZXJnKCJhZHJlc3MgPT1OVUxMXG4iKTsKCQkJCQkJCX0K CQkJCQl9CgkJCQkJY3VyciA9IGN1cnItPm5leHQ7CgkJCQl9CgkJfQoJRVhJVCgpOwp9Ci8v ICoqKioqKioqKioqKioqKioqKioqKioqKioqCi8vIFJvdXRpbmU6Ci8vIERlc2NyaXB0aW9u OgovLyAqKioqKioqKioqKioqKioqKioqKioqKioqKgpTVEFUSUMgdm9pZApEZWFsbG9jYXRl QnVmZmVyIChzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqYnVmKQp7CiAgc3RydWN0IHNjYXR0ZXJf bm9kZSAqY3VycjsKICAKCUVOVFJZICgpOwogIGlmIChidWYgPT0gTlVMTCkKICAgIHJldHVy bjsKICBjdXJyID0gYnVmLT5kbWFfbGlzdDsKCWlmIChjdXJyID09IE5VTEwgKQoJCXsKCQkJ ZW1lcmcoIm5vdGhpbmcgdG8gZGVhbGxvY1xuIik7CgkJfQoJZWxzZQoJCXsKCQkJQnVmZk1l bVJlc2VydmUgKGN1cnIsIDApOwoJCQl3aGlsZSAoY3VyciAhPSBOVUxMKQoJCQkJewoJCQkJ CWVtZXJnKCJjdXJyIDolcCBhZHJyICVsdSBsZW4gJWx1IG9yZGVyICVkXG4iLCBjdXJyLCAK CQkJCQkJCQljdXJyLT5hZGRyLCBjdXJyLT5sZW4sZ2V0X29yZGVyIChjdXJyLT5sZW4pKTsK CQkJCQlmcmVlX3BhZ2VzICgodW5zaWduZWQgbG9uZykgY3Vyci0+YWRkciwgZ2V0X29yZGVy IChjdXJyLT5sZW4pKTsKCQkJCQljdXJyLT5hZGRyPTA7CgkJCQkJY3Vyci0+bGVuPTA7CgkJ CQkJY3VyciA9IGN1cnItPm5leHQ7CgkJCQl9CgkJfQoJCiAgaWYgKGJ1Zi0+ZG1hX2xpc3Qp CiAgICB7CiAgICAgIGtmcmVlIChidWYtPmRtYV9saXN0KTsKICAgICAgYnVmLT5kbWFfbGlz dCA9IE5VTEw7CiAgICB9Cn0KCgoKLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioKLy8g Um91dGluZToKLy8gRGVzY3JpcHRpb246Ci8vICoqKioqKioqKioqKioqKioqKioqKioqKioq CgojZGVmaW5lIE1BWF9PUkRFUl9pbnQgOQpTVEFUSUMgaW50CkFsbG9jYXRlQnVmZmVyIChz dHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqYnVmKQp7CgogIGludCBzY2F0dGVyZ2F0aGVyY291bnQg PSAwOwogIGludCBpID0gMDsKICB1bnNpZ25lZCBsb25nIGxlbmd0aCA9IGJ1Zi0+dmlkYnVm Lmxlbmd0aDsKICBpbnQgb3JkZXI7CglFTlRSWSAoKTsKICBEZWFsbG9jYXRlQnVmZmVyIChi dWYpOwoKCgkjd2FybmluZyBmaW5kIHRoZSBkZWZpbmUgdGhhdCBnaXZlIHRoZSBtYXhpbXVt IG9yZGVyCiAgb3JkZXIgPSBnZXRfb3JkZXIgKGxlbmd0aCk7CiAgc2NhdHRlcmdhdGhlcmNv dW50ID0gKG9yZGVyIC8gTUFYX09SREVSX2ludCkgKyAxOwogIGJ1Zi0+ZG1hX2xpc3QgPQog ICAga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3Qgc2NhdHRlcl9ub2RlKSAqIHNjYXR0ZXJnYXRo ZXJjb3VudCwgR0ZQX0tFUk5FTCk7CiAgaWYgKGJ1Zi0+ZG1hX2xpc3QgPT0gTlVMTCkKCQl7 CgkJCXJldHVybiAxOwoJCX0KICBkYmcgKCJhbGxvY2F0aW5nIGxpc3Qgc3VjY2VzcyBvcmRl cjogJWQgc2NhdHRlcmdhdGhlciAlZCBAJWx1XG4iLCBvcmRlciwKICAgICAgIHNjYXR0ZXJn YXRoZXJjb3VudCwgYnVmLT5kbWFfbGlzdCk7CgogIGZvciAoaSA9IDA7IGkgPCBzY2F0dGVy Z2F0aGVyY291bnQ7IGkrKykKCQl7CgkJCW9yZGVyID0gZ2V0X29yZGVyIChsZW5ndGgpOwoJ CQlkYmcgKCJsZW5ndGggJWx1XG4iLCBsZW5ndGgpOwoJCQlpZiAob3JkZXIgPj0gTUFYX09S REVSX2ludCkKCQkJCXsKCQkJCQlvcmRlciA9IE1BWF9PUkRFUl9pbnQgLSAxOwoJCQkJfQoJ CQlidWYtPmRtYV9saXN0W2ldLm5leHQgPSAmKGJ1Zi0+ZG1hX2xpc3RbaSArIDFdKTsKCQkJ YnVmLT5kbWFfbGlzdFtpXS5hZGRyID0gX19nZXRfZG1hX3BhZ2VzIChHRlBfS0VSTkVMLCBv cmRlcik7CgkJCWRiZygiYWxsb2NhdGVkIGJ1ZmZlcnAgJWx1IG9yZGVyICVkXG4iLGJ1Zi0+ ZG1hX2xpc3RbaV0uYWRkcixvcmRlcik7CgkJCWlmIChidWYtPmRtYV9saXN0W2ldLmFkZHIg PT0gMCkJLy93ZSB3b3JrIHdpdGggZ2V0cGFnZSByZXR1cm4gd2hpY2ggaXMgYSB1bG9uZwoJ CQkJewoJCQkJCURlYWxsb2NhdGVCdWZmZXIgKGJ1Zik7CgkJCQkJcmV0dXJuIDE7CgkJCQl9 CgkJCQoJCQlidWYtPmRtYV9saXN0W2ldLmxlbiA9CShpID09IHNjYXR0ZXJnYXRoZXJjb3Vu dCAtIDEpID8KCQkJCQkJCQkJCQkJCQkJbGVuZ3RoIDogUEFHRV9TSVpFICogMSA8PCBvcmRl cjsKCQkJbGVuZ3RoIC09IGJ1Zi0+ZG1hX2xpc3RbaV0ubGVuOwoJCQlkYmcgKCJvcmRlcnMg JWQgJWRcbiIsIG9yZGVyLCBnZXRfb3JkZXIgKGJ1Zi0+ZG1hX2xpc3RbaV0ubGVuKSk7CgoK CQkJLy9+IGludCBwYWdlY291bnQgPSAwOwoJCQkvL34gaW50IGo7CgkJCS8vfiB2b2lkICph ZGRyZXNzOwoJCQkvL34gZm9yIChqID0gKDEgPDwgZ2V0X29yZGVyIChidWYtPmRtYV9saXN0 W2ldLmxlbikpIC0gMTsgaiA+PSAwOyBqLS0pCgkJCS8vfiB7CgkJCQkvL34gYWRkcmVzcyA9 ICh2b2lkICopIChidWYtPmRtYV9saXN0W2ldLmFkZHIgKyBqICogUEFHRV9TSVpFKTsKCQkJ CS8vfiBkYmcgKCIlZCAlbHUgJWx1IFxuIiwgaiwgYWRkcmVzcywgYnVmLT5kbWFfbGlzdFtp XS5sZW4pOwoJCQkJLy9+IGlmIChhZGRyZXNzICE9IE5VTEwpCgkJCQkJLy9+IGNsZWFyX3Bh Z2UgKGFkZHJlc3MpOwoJCQkJLy9+IGVsc2UKCQkJCQkvL34gaW5mbyAoImNsZWFyaW5nIHBh Z2UgZmFpbGxlZCBPX08hXG4iKTsKCQkJLy9+IH0KCgkJCWRiZyAoImFsbG9jYXRpbmcgYnVm ZmVyIGxlbmd0aCAlZCBzdWNjZXNzXG4iLAoJCQkJCQlidWYtPnZpZGJ1Zi5sZW5ndGggLyBz Y2F0dGVyZ2F0aGVyY291bnQpOwoJCQlkYmcgKCJhbGxvY2F0aW5nIGJ1ZmZlciAlZCBzdWNj ZXNzXG4iLCBpKTsKCQl9CiAgYnVmLT5kbWFfbGlzdFtzY2F0dGVyZ2F0aGVyY291bnQgLSAx XS5uZXh0ID0gTlVMTDsKCWJ1Zi0+ZG1hX2xpc3Rbc2NhdHRlcmdhdGhlcmNvdW50IC0gMV0u bGFzdCA9IDE7CglCdWZmTWVtUmVzZXJ2ZSAoYnVmLT5kbWFfbGlzdCwgMSk7CiAgcmV0dXJu IDA7Cn0KCgovKiAgQWxsb2NhdGUgYnVmZmVycywgYW5kIGdldCBldmVyeXRoaW5nIHJlYWR5 IHRvIGNhcHR1cmUKICogIGFuIGltYWdlLCBidXQgZG9uJ3Qgc3RhcnQgY2FwdHVyaW5nIHll dC4KICovClNUQVRJQyBpbnQKY2FwdHVyZV9iZWdpbiAoc3RydWN0IGNhcHR1cmVfZGV2aWNl ICpkZXYpCnsKICAvL2RiZygiY2FwdHVyZV9iZWdpblxuIik7CiAgRU5UUlkgKCk7CgogIGlm IChkZXYtPnJlYWR5X3RvX2NhcHR1cmUpCiAgICB7CiAgICAgIEVYSVQgKCk7CiAgICAgIHJl dHVybiBkZXYtPnJlYWR5X3RvX2NhcHR1cmU7CiAgICB9CgoJI3dhcm5pbmcgaXQgcyBiZXR0 ZXIgdG8gcmVhbGxvY2F0ZSB0aGUgYnVmZmVyIG9uIGZvcm1hdCBjaGFuZ2UKICBpZiAoKGRl di0+Y2FwdHVyZV9idWZmZXJfc2l6ZSA8IGRldi0+cmVhZF9idWZmZXIudmlkYnVmLmxlbmd0 aCkgfHwKICAgICAgZGV2LT5Td2l0Y2hJbnB1dHMpCiAgICB7CiAgICAgIGRldi0+U3dpdGNo SW5wdXRzID0gMDsKICAgICAgaWYgKEFsbG9jYXRlQnVmZmVyICgmZGV2LT5yZWFkX2J1ZmZl cikpCgkJCQlyZXR1cm4gMDsKCQkJI3dhcm5pbmcgRklYIFRISVMKICAgICAgaWYgKGRldi0+ cmVhZF9idWZmZXIuZG1hX2xpc3QgPT0gTlVMTCkKCQkJCXsKCQkJCQlkZXYtPmNhcHR1cmVf YnVmZmVyX3NpemUgPSAwOwoJCQkJCWVyciAoIkNhbid0IGFsbG9jYXRlIGNhcHR1cmUgYnVm ZmVyIgoJCQkJCQkJICIgJWQgYnl0ZXNcbiIsIGRldi0+cmVhZF9idWZmZXIudmlkYnVmLmxl bmd0aCk7CgkJCQkJRVhJVCAoKTsKCQkJCQlyZXR1cm4gZGV2LT5yZWFkeV90b19jYXB0dXJl OwoJCQkJfQogICAgfQogIGRiZygiUmVhZHkgdG8gY2FwdHVyZSFcbiIpOwogIEVYSVQgKCk7 CiAgcmV0dXJuIChkZXYtPnJlYWR5X3RvX2NhcHR1cmUgPSAxKTsKfQoKI3dhcm5pbmcgbW92 ZSBjYWxscyB0byBwcmV2aW91cyBmdW5jdGlvbiBvbiBmb3JtYXQgY2hhbmdlLi4uLgoKLyog IFN0YXJ0IGFuIGltYWdlIGNhcHR1cmUKICovClNUQVRJQyB2b2lkCmNhcHR1cmVfZ3JhYl9m cmFtZSAoc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYpCnsKCUVOVFJZICgpOwogIGlmIChk ZXYtPnJlYWR5X3RvX2NhcHR1cmUgJiYgZGV2LT5jYXB0dXJlX3N0YXJ0ZWQpCiAgICB7CiAg ICAgIGRiZyAoImNhcHR1cmUgYWxyZWFkeSBhY3RpdmVcbiIpOwogICAgICByZXR1cm47CiAg ICB9CgogIGNhcHR1cmVfYmVnaW4gKGRldik7CiAgaWYgKCFkZXYtPnJlYWR5X3RvX2NhcHR1 cmUpCiAgICByZXR1cm47CiAgd2hpbGUgKE5VTEwgIT0gdjRsMl9xX2RlbF9oZWFkICgmZGV2 LT5zdHJlYW1fcV9kb25lKSk7CiAgd2hpbGUgKE5VTEwgIT0gdjRsMl9xX2RlbF9oZWFkICgm ZGV2LT5zdHJlYW1fcV9jYXB0dXJlKSk7CiAgaWYgKGRldi0+Y2FtZXJhICYmIGRldi0+aW5w dXQgPT0gMCkKICAgIHsKICAgICAgLy8gU3RhcnQgdGhlIGNhbWVyYSBoL3cuIEl0IHdpbGwg Y2FsbCB1cyBiYWNrCiAgICAgIC8vIG9uIGltYWdlIGNvbXBsZXRpb24uCiAgICAgIGRiZyAo InN0YXJ0aW5nIGhhcmR3YXJlIHNuYXBzaG90XG4iKTsKICAgICAgdjRsMl9xX2FkZF90YWls ICgmKGRldi0+c3RyZWFtX3FfY2FwdHVyZSksCgkJICAgICAgIChzdHJ1Y3QgdjRsMl9xX25v ZGUgKikgJihkZXYtPnJlYWRfYnVmZmVyKSk7CgkJCWRldi0+Y2FtaWYtPmFib3J0KCk7CiAg ICAgIGRldi0+Y2FtaWYtPmNhbWlmX3F1ZXVlX2J1ZmZlciAoZGV2LT5yZWFkX2J1ZmZlci5k bWFfbGlzdCk7CgkJCWRldi0+Y2FtaWYtPnJlc3VtZSgpOwogICAgfQogIGRldi0+Y2FwdHVy ZV9zdGFydGVkID0gMTsKICBkZXYtPmNhcHR1cmVfY29tcGxldGVkID0gMDsKfQoKLyogIFN0 YXJ0IGFuIGltYWdlIHN0cmVhbQogKi8KU1RBVElDIHZvaWQKY2FwdHVyZV9zdHJlYW1fc3Rh cnQgKHN0cnVjdCBjYXB0dXJlX2RldmljZSAqZGV2KQp7CiAgRU5UUlkoKTsKCXN0cnVjdCBz dHJlYW1fYnVmZmVyKiBoZWFkOwoKICBjYXB0dXJlX2JlZ2luIChkZXYpOwoKCWlmIChkZXYt PnJlYWR5X3RvX2NhcHR1cmUgJiYgZGV2LT5jYXB0dXJlX3N0YXJ0ZWQpCiAgICB7CiAgICAg IGRiZyAoImNhcHR1cmUgYWxyZWFkeSBhY3RpdmVcbiIpOwogICAgICByZXR1cm47CiAgICB9 CgloZWFkPSAoc3RydWN0IHN0cmVhbV9idWZmZXIqKSB2NGwyX3FfcGVla19oZWFkICgmZGV2 LT5zdHJlYW1fcV9jYXB0dXJlKTsKCiAgaWYgKGRldi0+Y2FtZXJhICYmIGRldi0+aW5wdXQg PT0gMCkKICAgIHsKICAgICAgLy8gU3RhcnQgdGhlIGNhbWVyYSBoL3cuIEl0IHdpbGwgY2Fs bCB1cyBiYWNrCiAgICAgIC8vIG9uIGltYWdlIGNvbXBsZXRpb24uCiAgICAgIGRldi0+Y2Ft aWYtPnJlc3VtZSgpOwoJCQlkZXYtPmNhcHR1cmVfc3RhcnRlZCA9IDE7CgkJCWRldi0+Y2Fw dHVyZV9jb21wbGV0ZWQgPSAwOwogICAgfQogIGVsc2UKICAgIHsKICAgICAgZGV2LT5jYXB0 dXJlX3N0YXJ0ZWQgPSAxOwogICAgICBkZXYtPmNhcHR1cmVfY29tcGxldGVkID0gMDsKICAg IH0KICBFWElUKCk7Cn0KCi8qCiAqICAgICAgU1RSRUFNSU5HIENBUFRVUkUKICovCgoKU1RB VElDIGludApjYXB0dXJlX3F1ZXVlYnVmZmVyIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRl diwgc3RydWN0IHY0bDJfYnVmZmVyICp2aWRidWYpCnsKICBpbnQgaSA9IHZpZGJ1Zi0+aW5k ZXg7CiAgc3RydWN0IHN0cmVhbV9idWZmZXIgKmJ1ZiA9IE5VTEw7CiAgRU5UUlkoKTsKICBp ZiAoIWRldi0+c3RyZWFtX2J1ZmZlcnNfbWFwcGVkKQogICAgewogICAgICBpbmZvICgiUUJV RiBubyBidWZmZXJzIG1hcHBlZFxuIik7CiAgICAgIHJldHVybiAxOwogICAgfQogIGlmICh2 aWRidWYtPnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQogICAgewogICAg ICBpbmZvICgiUUJVRiB3cm9uZyB0eXBlXG4iKTsKICAgICAgcmV0dXJuIDE7CiAgICB9CiAg aWYgKGkgPCAwIHx8IGkgPj0gTUFYX0NBUFRVUkVfQlVGRkVSUyB8fCAhZGV2LT5zdHJlYW1f YnVmW2ldLnJlcXVlc3RlZCkKICAgIHsKICAgICAgaW5mbyAoIlFCVUYgYnVmZmVyIGluZGV4 ICVkIGlzIG91dCBvZiByYW5nZVxuIiwgaSk7CiAgICAgIHJldHVybiAxOwogICAgfQoKICBi dWYgPSAmZGV2LT5zdHJlYW1fYnVmW2ldOwoKICBpZiAoIShidWYtPnZpZGJ1Zi5mbGFncyAm IFY0TDJfQlVGX0ZMQUdfTUFQUEVEKSkKICAgIHsKICAgICAgaW5mbyAoIlFCVUYgYnVmZmVy ICVkIGlzIG5vdCBtYXBwZWRcbiIsIGkpOwogICAgICByZXR1cm4gMTsKICAgIH0KICBpZiAo KGJ1Zi0+dmlkYnVmLmZsYWdzICYgVjRMMl9CVUZfRkxBR19RVUVVRUQpKQogICAgewogICAg ICBpbmZvICgiUUJVRiBidWZmZXIgJWQgaXMgYWxyZWFkeSBxdWV1ZWRcbiIsIGkpOwogICAg ICByZXR1cm4gMTsKICAgIH0KCiAgYnVmLT52aWRidWYuZmxhZ3MgJj0gflY0TDJfQlVGX0ZM QUdfRE9ORTsKICB2NGwyX3FfYWRkX3RhaWwgKCZkZXYtPnN0cmVhbV9xX2NhcHR1cmUsICZi dWYtPnFub2RlKTsKICBidWYtPnZpZGJ1Zi5mbGFncyB8PSBWNEwyX0JVRl9GTEFHX1FVRVVF RDsKCglkZXYtPmNhbWlmLT5jYW1pZl9xdWV1ZV9idWZmZXIgKGJ1Zi0+ZG1hX2xpc3QpOwoJ aWYgKGRldi0+c3RyZWFtaW5nKQoJCXsKCQkJLy9kbyBub3RoaW5nIGlmIHN0cmVhbWluZyBp cyBhbHJlYWR5IGFjdGl2ZSwgZWxzZSByZWFjdGl2YXRlIHRoZSBjYW1lcmEKCQkJZGV2LT5j YW1pZi0+cmVzdW1lKCk7CgkJfQogIHJldHVybiAwOwp9CgpTVEFUSUMgaW50CQkJLyogMSA9 IGdvdCBhIGJ1ZmZlcjsgMCA9IG5vIGJ1ZmZlcnMgKi8KY2FwdHVyZV9kZXF1ZXVlYnVmZmVy IChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldiwgc3RydWN0IHY0bDJfYnVmZmVyICpidWYp CnsKICBzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqbmV3YnVmOwogIEVOVFJZKCk7CiAgaWYgKGJ1 Zi0+dHlwZSAhPSBWNEwyX0JVRl9UWVBFX1ZJREVPX0NBUFRVUkUpCiAgICB7CiAgICAgIGRi ZyAoIkRRQlVGIHdyb25nIGJ1ZmZlciB0eXBlXG4iKTsKICAgICAgcmV0dXJuIC1FSU5WQUw7 CiAgICB9CiAgbmV3YnVmID0gdjRsMl9xX2RlbF9oZWFkICgmZGV2LT5zdHJlYW1fcV9kb25l KTsKICBpZiAobmV3YnVmID09IE5VTEwpCiAgICB7CiAgICAgIGRiZyAoIkRRQlVGIG5vdGhp bmcgb24gZG9uZSBxdWV1ZVxuIik7CiAgICAgIHJldHVybiAtRUFHQUlOOwogICAgfQogIG5l d2J1Zi0+dmlkYnVmLmZsYWdzICY9IH5WNEwyX0JVRl9GTEFHX1FVRVVFRDsKICBkYmcgKCJu ZXdidWYtPnZpZGJ1Zi5pbmRleCAlZFxuIiwgbmV3YnVmLT52aWRidWYuaW5kZXgpOwogIGRi ZyAoIm5ld2J1Zi0+dmlkYnVmLnR5cGUgJWRcbiIsIG5ld2J1Zi0+dmlkYnVmLnR5cGUpOwog IGRiZyAoIm5ld2J1Zi0+dmlkYnVmLmZsYWdzICVkXG4iLCBuZXdidWYtPnZpZGJ1Zi5mbGFn cyk7CiAgKmJ1ZiA9IG5ld2J1Zi0+dmlkYnVmOwogIHJldHVybiAwOwp9CgpTVEFUSUMgaW50 CmNhcHR1cmVfc3RyZWFtb24gKHN0cnVjdCBjYXB0dXJlX2RldmljZSAqZGV2KQp7CiAgc3Ry dWN0IHN0cmVhbV9idWZmZXIgKmJ1ZjsKICBFTlRSWSgpOwoKICBpZiAoZGV2LT5zdHJlYW1p bmcpCiAgICB7CiAgICAgIEVYSVQgKCk7CiAgICAgIHJldHVybiAxOwogICAgfQoKICAvKiAg LTIgaXMgYSBtYWdpYyBudW1iZXIgdGhhdCB0cmlnZ2VycyBzdGFydC1vZi1zdHJlYW0gbG9n aWMgaW4gKi8KICAvKiAgICBjYXB0dXJlX2ludGVycnVwdCgpICAqLwogIGRldi0+c3RyZWFt X2xhc3RfZnJhbWUgPSAtMjsKCgoJCgogIC8qICBNb3ZlIGFueSBsZWZ0b3ZlciBET05FIGJ1 ZmZlcnMgdG8gdGhlIGZyZWUgcG9vbCAqLwogIHdoaWxlICgoYnVmID0gdjRsMl9xX2RlbF9o ZWFkICgmZGV2LT5zdHJlYW1fcV9kb25lKSkpCiAgICBidWYtPnZpZGJ1Zi5mbGFncyAmPSB+ VjRMMl9CVUZfRkxBR19RVUVVRUQ7CgogIC8qICBLaWNrIG9mZiB0aGUgbWFjaGluZSBpbiBj b250aW51b3VzIGNhcHR1cmUgbW9kZSAqLwogIGRldi0+c3RyZWFtaW5nID0gMTsKICBjYXB0 dXJlX3N0cmVhbV9zdGFydCAoZGV2KTsKICBFWElUICgpOwogIC8vZGJnKCJlbmQgY2FwdHVy ZV9zdHJlYW1vblxuIik7CiAgcmV0dXJuIDE7Cn0KClNUQVRJQyB2b2lkCmNhcHR1cmVfc3Ry ZWFtb2ZmIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldikKewogIEVOVFJZICgpOwogIGlm ICghZGV2LT5zdHJlYW1pbmcpCiAgICB7CiAgICAgIEVYSVQgKCk7CiAgICAgIHJldHVybjsK ICAgIH0KICBjYXB0dXJlX2Fib3J0IChkZXYpOwkJLy9jYW5jZWwgZG1hcwoKICBFWElUICgp Owp9CgoKLyoKICogQ29udmVydCByYXcgY2FtZXJhIGltYWdlIGRpcmVjdGx5IGludG8gZnJh bWVidWZmZXIgKHVzZWQgYnkKICogcHJldmlldyBtb2RlKS4gUmV0dXJucyBsZW5ndGggb2Yg ZGF0YSBvciBuZWdhdGl2ZSBmb3IgZXJyb3IuCiAqLwpTVEFUSUMgaW50CmNhcHR1cmVfZGlz cGxheV9pbWFnZSAoc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYsIF9fdTggKiBjYXB0dXJl X2J1ZmZlcikKewoJRU5UUlkoKTsKICBpZiAoIWRldi0+Y2FwdHVyZV9zdGFydGVkKQogICAg ewogICAgICAvLyBJZiB3ZSBnZXQgaGVyZSBpcyBwcm9iYWJseSBiZWNhdXNlIHRoZSBQUkVW SUVXCiAgICAgIC8vIG1vZGUgd2FzIHR1cm5lZCBvZmYganVzdCBwcmlvciB0byB0aGUgaW50 ZXJydXB0CiAgICAgIC8vIHJvdXRpbmVzIGNvbXBsZXRpbmcgdGhlIGxhc3QgaW1hZ2UuIFdl IGRvbid0CiAgICAgIC8vIHdhbnQgYW55bW9yZSBpbWFnZXMuIEp1c3QgcmV0dXJuLgogICAg ICBkYmcgKCJjYXB0dXJlIG5vdCBzdGFydGVkPz9cbiIpOwogICAgICByZXR1cm4gMDsKICAg IH0KCiAgaWYgKGRldi0+Y2FtZXJhKQogICAgewogICAgICBpbnQgZGVzdF9zdHJpZGU7Cgog ICAgICBpZiAoIWRldi0+ZmJpbmZvX3ZhbGlkKQoJCQkJewoJCQkJCWVyciAoInByZXZpZXcg c2V0IGJ1dCBubyB2YWxpZCBmYiBpbmZvXG4iKTsKCQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJ CX0KCiAgICAgIGRlc3Rfc3RyaWRlID0gKGRldi0+ZmJ2YXIueHJlc192aXJ0dWFsICogZGV2 LT5mYnZhci5iaXRzX3Blcl9waXhlbCkgLyA4OwoKICAgICAgZGV2LT5jYW1lcmEtPmNvbnZl cnRfaW1hZ2UgKCh1OCAqKSBjYXB0dXJlX2J1ZmZlciwKCQkJCSAgKHU4ICopIHBoeXNfdG9f dmlydCAoZGV2LT5mYmZpeC4KCQkJCQkJICAgICAgIHNtZW1fc3RhcnQpLAoJCQkJICAwLCBk ZXN0X3N0cmlkZSwgJmRldi0+Y2xpZW50Zm10KTsKICAgIH0KCgogIHJldHVybiBkZXYtPmNs aWVudGZtdC5zaXplaW1hZ2U7Cn0KCgoKLyogIFRoZSBoYXJkd2FyZSBoYXMgaXNzdWVkIHRo ZSBpbnRlcnJ1cHQgc2lnbmFsLCBkbyBhbnkgcG9zdC1jYXB0dXJlCiAqICBwcm9jZXNzaW5n IHRoYXQgbWF5IGJlIG5lY2Vzc2FyeS4KICogIFtUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBp bmRpcmVjdGx5IHRocm91Z2ggdGhlIGltbWVkaWF0ZSB0YXNrIHF1ZXVlOwogKiAgaXQgZXhl Y3V0ZXMgYXQgZWxldmF0ZWQgSVJRTCwgYnV0IGl0IGlzIGludGVycnVwdGlibGUuIChJdCdz IGEgYi5oLildCiAqLwoKU1RBVElDIHZvaWQKY2FwdHVyZV9pbnRlcnJ1cHQgKHZvaWQgKnYp CnsKICBzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgY2FwdHVyZV9kZXZp Y2UgKikgdjsKICBzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqYnVmOwogIGludCBsZW47CiAgX19z NjQgZWxhcHNlZF90aW1lOwoJX191NjQgZGVzaXJlZHRpbWVwZXJmcmFtZSA9IDEwMDAwMDAw MDAgKiBkZXYtPmNhcHR1cmUudGltZXBlcmZyYW1lLm51bWVyYXRvciAvCiAgICAgIGRldi0+ Y2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3I7CgkKCQoJRU5UUlkoKTsKCQoJLy90 aGUgb21hcCBpbnRlcm5hbCBjbG9jayBoYXMgYSBwcmVjaXNpb24gb2YgdGhlIDAuMDFzLi4u LiBzbyBtYXNrIHRoZSBkZXNpcmVkIHRpbWVwZXJmcmFtZQoJLy9kZXNpcmVkdGltZXBlcmZy YW1lIGlzIGluIG5hbm9zZWMKCWRlc2lyZWR0aW1lcGVyZnJhbWUgLz0gMTAwMDAwMDA7Cglk ZXNpcmVkdGltZXBlcmZyYW1lICo9IDEwMDAwMDAwOwoJCglidWYgPSB2NGwyX3FfcGVla19o ZWFkICgmZGV2LT5zdHJlYW1fcV9jYXB0dXJlKTsKICBpZiAoIWRldi0+Y2FwdHVyZV9zdGFy dGVkIHx8IGRldi0+Y2FwdHVyZV9jb21wbGV0ZWQgfHwgYnVmID09IE5VTEwpCgkJewoJCQll cnIoImNhcHR1cmUgbm90IHN0YXJ0ZWQgb3IgY29tcGxldGVkIG9yIGJ1ZmYgbnVsbFxuIik7 CgkJCXJldHVybjsKCQl9CiAgaWYgKCFkZXYtPnN0cmVhbWluZykKICAgIGRldi0+Y2FwdHVy ZV9jb21wbGV0ZWQgPSAxOwoKICBpZiAoIWRldi0+c3RyZWFtaW5nKQogICAgewogICAgICBk ZXYtPnRpbWVfYWNxdWlyZWQgPSBjdXJyZW50X3RpbWVfbXMgKCk7CiAgICAgIGlmIChkZXYt PnByZXZpZXcpCgkJCQl7CgkJCQkJI3dhcm5pbmcgY2FwdHVyZSBkaXNwbGF5IGlzbnQgZnVu Y3Rpb25uYWwgZHVlIHRvIG5ldyBidWZmZXIgaGFuZGxpbmcKCQkJCQkvL2NhcHR1cmVfZGlz cGxheV9pbWFnZSAoZGV2LCBkZXYtPmNhcHR1cmVfYnVmZmVyKTsKCQkJCQlkZXYtPmNhcHR1 cmVfc3RhcnRlZCA9IDA7CgkJCQkJY2FwdHVyZV9ncmFiX2ZyYW1lIChkZXYpOwkvLyBTdGFy dCBhbm90aGVyIGNhcHR1cmUuCgkJCQl9CiAgICAgIGJ1ZiA9IHY0bDJfcV9kZWxfaGVhZCAo JmRldi0+c3RyZWFtX3FfY2FwdHVyZSk7CiAgICAgIHY0bDJfcV9hZGRfdGFpbCAoJmRldi0+ c3RyZWFtX3FfZG9uZSwgJmJ1Zi0+cW5vZGUpOwogICAgICB3YWtlX3VwX2ludGVycnVwdGli bGUgKCZkZXYtPm5ld192aWRlb19mcmFtZSk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgLyog IE9ubHkgZ2V0IGhlcmUgaW4gc3RyZWFtaW5nIG1vZGUgICovCiAgaWYgKGRldi0+c3RyZWFt X2xhc3RfZnJhbWUgPT0gLTIpCiAgICB7CiAgICAgIC8qIEZpcnN0IGZyYW1lIG9mIHRoZSBz dHJlYW0gICovCgkJCWRldi0+c3RyZWFtX2JlZ2luPWRldi0+bGFzdF90aW1lOwogICAgICBk ZXYtPnN0cmVhbV9sYXN0X2ZyYW1lID0gMDsKCQkJZGJnKCJzdHJlYW0gYmVnaW4gOiAlbHUs JS45bHUgYXQgJWxsdVxuIiwKCQkJCQkJZGV2LT5zdHJlYW1fYmVnaW4udHZfc2VjLAoJCQkJ CQlkZXYtPnN0cmVhbV9iZWdpbi50dl9uc2VjLAoJCQkJCQlkZXNpcmVkdGltZXBlcmZyYW1l KTsKICAgIH0KCiAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgewogICAgICAvKgoJCQkgKiBObyBh dmFpbGFibGUgYnVmZmVycy4gU2tpcCB0aGlzIGZyYW1lLiBUaGlzIGlzIG5vdCBhbgoJCQkg KiBlcnJvciwgaXQncyBhIG5vcm1hbCB3YXkgdG8gdGhyb3R0bGUgdGhlIGNhcHR1cmUgcmF0 ZQoJCQkgKi8KICAgICAgZXJyKCJza2lwIGZyYW1lIik7CiAgICAgIHJldHVybjsKICAgIH0K ICBkYmcoIml0IDogY2FwdHVyZSBidWZmZXIgJWQgZGVxdWV1ZWQgKGZyYW1lIHByZXNlbnQp XG4iLCBidWYtPnZpZGJ1Zi5pbmRleCk7CgoJLyogIENvbXB1dGUgY3VycmVudCBzdHJlYW0g dGltZSAgKi8KCQoJZWxhcHNlZF90aW1lID0gCgkJKGRldi0+bGFzdF90aW1lLnR2X3NlYyAt IGRldi0+c3RyZWFtX2JlZ2luLnR2X3NlYykgKiAxMDAwMDAwMDAwICsKCQkoZGV2LT5sYXN0 X3RpbWUudHZfbnNlYyAtIGRldi0+c3RyZWFtX2JlZ2luLnR2X25zZWMpOwoJZGJnKCIlbHUs JS45bHVcbiIsZGV2LT5sYXN0X3RpbWUudHZfc2VjLGRldi0+bGFzdF90aW1lLnR2X25zZWMp OwoJZGJnKCJlbGFwc2VkX3RpbWUgOiAlbGxkXG4iLGVsYXBzZWRfdGltZSk7CgkKCQoKCiAg LyogIENhcHR1cmUgcmF0ZSBjb250cm9sICAqLwoJaWYgKGRldi0+Y2FwdHVyZS50aW1lcGVy ZnJhbWUubnVtZXJhdG9yICE9IGRldi0+dmlkZWMuZnJhbWVfZnJhY3QubnVtZXJhdG9yIAoJ CQl8fGRldi0+Y2FwdHVyZS50aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgIT0gCgkJCQkJZGV2 LT52aWRlYy5mcmFtZV9mcmFjdC5kZW5vbWluYXRvciAKCQkJKQoJCXsKCQkJaWYgKCBlbGFw c2VkX3RpbWUgPCBkZXNpcmVkdGltZXBlcmZyYW1lKQoJCQkJewoJCQkJCS8qIE5vdCB0aW1l IHlldCwgZG9uJ3Qga2VlcCB0aGlzIGZyYW1lICovCgkJCQkJYnVmID0gdjRsMl9xX2RlbF9o ZWFkICgmZGV2LT5zdHJlYW1fcV9jYXB0dXJlKTsKCQkJCQkvL3JlcXVldWUgdGhlIGJ1ZmZl ciBmb3IgcHJvY2Vzc2luZy4uLgoJCQkJCSBidWYtPnZpZGJ1Zi5mbGFncyAmPSB+VjRMMl9C VUZfRkxBR19RVUVVRUQ7CgkJCQkJaWYgKGNhcHR1cmVfcXVldWVidWZmZXIgKGRldiwgJihi dWYtPnZpZGJ1ZikpKQoJCQkJCQllcnIgKCJub3QgYWJsZSB0byByZXF1ZXVlIE9fTyFcbiIp OwoJCQkJCWVtZXJnICgiZHJvcGluZyBmcmFtZSBcbiIpOwoJCQkJCXJldHVybjsKCQkJCX0K CQl9CgkKCS8qICBXZSBkbyBjb21wdXRhdGlvbnMgb24gYSByZWxhdGl2ZSB0aW1lc3RhbXAg KHNpbmNlIHByZXZpb3VzICAqLwogIC8qICBub24gZHJvcHBlZCBmcmFtZSkgICAqLwoJZGV2 LT5zdHJlYW1fYmVnaW49ZGV2LT5sYXN0X3RpbWU7CgoKICAvKiAgV2FudCB0aGlzIGZyYW1l ICAqLwogIGRldi0+c3RyZWFtX2xhc3RfZnJhbWUrKzsKCSAgbGVuID0gZGV2LT5jbGllbnRm bXQuc2l6ZWltYWdlOwoKICAvKiAgRmlsbCBpbiB0aGUgYnVmZmVyIGVtZXJncm1hdGlvbiBm aWVsZHMgICovCgkgIGJ1Zi0+dmlkYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZMQUdfRE9ORSB8 IFY0TDJfQlVGX0ZMQUdfS0VZRlJBTUU7CgogIC8qIFJldHVybmVkIHRpbWVzdGFtcCBzaG91 bGQgYmUgYWJzb2x1dGUgc3lzdGVtIHRpbWUgICovCglidWYtPnZpZGJ1Zi50aW1lc3RhbXAu dHZfc2VjID0gZGV2LT5sYXN0X3RpbWUudHZfc2VjOwoJYnVmLT52aWRidWYudGltZXN0YW1w LnR2X3VzZWMgPSBkZXYtPmxhc3RfdGltZS50dl9uc2VjKjEwMDA7CiAgYnVmLT52aWRidWYu c2VxdWVuY2UgPSBkZXYtPnN0cmVhbV9sYXN0X2ZyYW1lOwoKCiAgLyogIE1vdmUgYnVmZmVy IHRvIGRvbmUgcXVldWUgICovCiAgYnVmID0gdjRsMl9xX2RlbF9oZWFkICgmZGV2LT5zdHJl YW1fcV9jYXB0dXJlKTsKICB2NGwyX3FfYWRkX3RhaWwgKCZkZXYtPnN0cmVhbV9xX2RvbmUs ICZidWYtPnFub2RlKTsKCiAgLyogIEEgbmV3IGZyYW1lIGlzIHJlYWR5ISAgKi8KCWRiZygi ZnJhbWUgZWxhcHNlZCB0aW1lIDogJWxsZFxuIiwgZWxhcHNlZF90aW1lKTsKICB3YWtlX3Vw X2ludGVycnVwdGlibGUgKCZkZXYtPm5ld192aWRlb19mcmFtZSk7CgoJRVhJVCgpOwp9Cgov KgogKiBUaGlzIGlzIHRoZSBjYWxsYmFjayBmcm9tIHRoZSBDYW1lcmEgSW50ZXJmYWNlLCB3 aGVuCiAqIGEgbmV3IGltYWdlIGhhcyBiZWVuIGNhcHR1cmVkIGJ5IHRoZSBjYW1pZiBoL3cu IFRoaXMKICogaXMgY2FsbGVkIGF0IGludGVycnVwdCB0aW1lLCBzbyBqdXN0IG1hcmsgYSBi aCBhbmQgZG8KICogbm90aGluZyBtb3JlLgogKi8KU1RBVElDIHZvaWQKY2FtaWZfY2FwdHVy ZV9jYWxsYmFjayAodm9pZCAqZGF0YSkKewogIHN0cnVjdCBjYXB0dXJlX2RldmljZSAqZGV2 ID0gKHN0cnVjdCBjYXB0dXJlX2RldmljZSAqKSBkYXRhOwoJRU5UUlkoKTsKCWppZmZpZXNf dG9fdGltZXNwZWMgKGppZmZpZXMsICZkZXYtPmxhc3RfdGltZSk7CiAgZGV2LT50cW5vZGVf ZHBjLnJvdXRpbmUgPSBjYXB0dXJlX2ludGVycnVwdDsKICBkZXYtPnRxbm9kZV9kcGMuZGF0 YSA9IGRldjsKICBxdWV1ZV90YXNrICgmZGV2LT50cW5vZGVfZHBjLCAmdHFfaW1tZWRpYXRl KTsKICBtYXJrX2JoIChJTU1FRElBVEVfQkgpOwp9CgoKLyogIFJlYWQgY2FwdHVyZWQgZGF0 YSBpbnRvIGEgdXNlciBidWZmZXIuCiAqICBSZXR1cm46IG5lZ2F0aXZlID0gZXJyb3IKICog ICAgICAgICAgMCAgICAgICAgPSBrZWVwIHdhaXRpbmcKICogICAgICAgICAgcG9zaXRpdmUg PSBjb3VudCBvZiBieXRlcyByZWFkIHN1Y2Nlc3NmdWxseQogKi8KU1RBVElDIGxvbmcKY2Fw dHVyZV9yZWFkIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldiwKCSAgICAgIF9fdTggKiB1 c2VyX2J1ZmZlciwgaW50IHVzZXJfYnVmZmVyX3NpemUpCnsKICBzdHJ1Y3Qgc3RyZWFtX2J1 ZmZlciAqYnVmID0KICAgIChzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqKSB2NGwyX3FfZGVsX2hl YWQgKCZkZXYtPnN0cmVhbV9xX2RvbmUpOwogIGludCBsZW4gPSB1c2VyX2J1ZmZlcl9zaXpl OwogIHN0cnVjdCBzY2F0dGVyX25vZGUgKmN1cnIgPSBOVUxMOwoJdW5zaWduZWQgbG9uZyBv ZmZzZXQgPSAwOwoKCUVOVFJZKCk7CiAgaWYgKCFkZXYtPmNhcHR1cmVfY29tcGxldGVkIHx8 IGJ1ZiA9PSBOVUxMKQogICAgewogICAgICAvKiBObyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVk IHlldCwgb3IgRE1BIGRpZG4ndCBmaW5pc2guICAqLwogICAgICBkYmcgKCJObyBkYXRhIHJl YWR5LlxuIik7CiAgICAgIGlmICghZGV2LT5jYXB0dXJlX3N0YXJ0ZWQpCgl7CgkgIC8vY2Fw dHVyZV9ncmFiX2ZyYW1lIChkZXYpOwoJfQogICAgICByZXR1cm4gMDsJCQkvKiBjYWxsZXIg c2hvdWxkIGtlZXAgd2FpdGluZyAqLwogICAgfQoKICBjdXJyID0gYnVmLT5kbWFfbGlzdDsK CiAgbGVuID0gZGV2LT5jbGllbnRmbXQuc2l6ZWltYWdlOwogIHdoaWxlIChjdXJyICE9IE5V TEwpCiAgICB7CgkJCSN3YXJuaW5nIGlzIHRoZSBjYXN0IGNvcnJlY3Q/CiAgICAgIGNvcHlf dG9fdXNlciAodXNlcl9idWZmZXIgKyBvZmZzZXQsICh2b2lkICopIGN1cnItPmFkZHIsIGN1 cnItPmxlbik7CiAgICAgIG9mZnNldCArPSBjdXJyLT5sZW47CiAgICAgIGN1cnIgPSBjdXJy LT5uZXh0OwogICAgfQoKICBkZXYtPmNhcHR1cmVfc3RhcnRlZCA9IDA7CiAgcmV0dXJuIGxl bjsKfQoKLyogIFN0b3AgY2FwdHVyaW5nIGFuZCBmcmVlIGFsbCByZXNvdXJjZXMgdXNlZCBm b3IgY2FwdHVyZS4KICovClNUQVRJQyB2b2lkCmNhcHR1cmVfY2xvc2UgKHN0cnVjdCBjYXB0 dXJlX2RldmljZSAqZGV2KQp7CiAgRU5UUlkgKCk7CiAgaWYgKGRldi0+c3RyZWFtaW5nKQog ICAgY2FwdHVyZV9zdHJlYW1vZmYgKGRldik7CiAgY2FwdHVyZV9hYm9ydCAoZGV2KTsKICBk ZXYtPnJlYWR5X3RvX2NhcHR1cmUgPSAwOwogIERlYWxsb2NhdGVCdWZmZXIgKCYoZGV2LT5y ZWFkX2J1ZmZlcikpOwogIGRldi0+Y2FwdHVyZV9idWZmZXJfc2l6ZSA9IDA7CiAgRVhJVCAo KTsKfQoKCgoKLyoKICoKICogICAgICBQIE8gVyBFIFIgICBNIEEgTiBBIEcgRSBNIEUgTiBU CiAqCiAqLwoKI2lmIDEJCQkJLyogTVZMLUNFRSAqLwojaW5jbHVkZSA8bGludXgvZGV2aWNl Lmg+CgpTVEFUSUMgaW50IG9tYXBfY2FtZXJhX2RwbV9zdXNwZW5kIChzdHJ1Y3QgZGV2aWNl ICpkZXYsIHUzMiBzdGF0ZSwgdTMyIGxldmVsKTsKU1RBVElDIGludCBvbWFwX2NhbWVyYV9k cG1fcmVzdW1lIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBsZXZlbCk7CgpzdGF0aWMgc3Ry dWN0IGRldmljZV9kcml2ZXIgb21hcF9jYW1lcmFfZHJpdmVyX2xkbSA9IHsKCW5hbWU6Im9t YXAtY2FtZXJhIiwKCWRldmNsYXNzOk5VTEwsCglwcm9iZTpOVUxMLAoJc3VzcGVuZDpvbWFw X2NhbWVyYV9kcG1fc3VzcGVuZCwKCXJlc3VtZTpvbWFwX2NhbWVyYV9kcG1fcmVzdW1lLAoJ cmVtb3ZlOk5VTEwsCgl9OwoKc3RhdGljIHN0cnVjdCBkZXZpY2Ugb21hcF9jYW1lcmFfZGV2 aWNlX2xkbSA9IHsKCW5hbWU6Ik9NQVAgQ2FtZXJhIiwKCWJ1c19pZDoiQ2FtZXJhIiwKCWRy aXZlcjpOVUxMLAoJcG93ZXJfc3RhdGU6RFBNX1BPV0VSX09OLAoJfTsKClNUQVRJQyB2b2lk Cm9tYXBfY2FtZXJhX2xkbV9yZWdpc3RlciAoc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYp CnsKICBleHRlcm4gdm9pZCBtcHVfcHVibGljX2RyaXZlcl9yZWdpc3RlciAoc3RydWN0IGRl dmljZV9kcml2ZXIgKmRyaXZlcik7CiAgZXh0ZXJuIHZvaWQgbXB1X3B1YmxpY19kZXZpY2Vf cmVnaXN0ZXIgKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CgogIG9tYXBfY2FtZXJhX2Rldmlj ZV9sZG0ucGxhdGZvcm1fZGF0YSA9ICh2b2lkICopIGRldjsKICBtcHVfcHVibGljX2RyaXZl cl9yZWdpc3RlciAoJm9tYXBfY2FtZXJhX2RyaXZlcl9sZG0pOwogIG1wdV9wdWJsaWNfZGV2 aWNlX3JlZ2lzdGVyICgmb21hcF9jYW1lcmFfZGV2aWNlX2xkbSk7Cn0KClNUQVRJQyB2b2lk Cm9tYXBfY2FtZXJhX2xkbV91bnJlZ2lzdGVyIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRl dikKewogIGV4dGVybiB2b2lkIG1wdV9wdWJsaWNfZHJpdmVyX3VucmVnaXN0ZXIgKHN0cnVj dCBkZXZpY2VfZHJpdmVyICpkcml2ZXIpOwogIGV4dGVybiB2b2lkIG1wdV9wdWJsaWNfZGV2 aWNlX3VucmVnaXN0ZXIgKHN0cnVjdCBkZXZpY2UgKmRldmljZSk7CgogIG1wdV9wdWJsaWNf ZHJpdmVyX3VucmVnaXN0ZXIgKCZvbWFwX2NhbWVyYV9kcml2ZXJfbGRtKTsKICBtcHVfcHVi bGljX2RldmljZV91bnJlZ2lzdGVyICgmb21hcF9jYW1lcmFfZGV2aWNlX2xkbSk7Cn0KClNU QVRJQyBpbnQKb21hcF9jYW1lcmFfZHBtX3N1c3BlbmQgKHN0cnVjdCBkZXZpY2UgKmRldiwg dTMyIHN0YXRlLCB1MzIgbGV2ZWwpCnsKICBzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmNkZXYg PSAoc3RydWN0IGNhcHR1cmVfZGV2aWNlICopIGRldi0+cGxhdGZvcm1fZGF0YTsKCiAgc3dp dGNoIChsZXZlbCkKICAgIHsKCiAgICBjYXNlIFNVU1BFTkRfTk9USUZZOgogICAgICBjZGV2 LT5zdXNwZW5kZWQgPSAxOwogICAgICBicmVhazsKCiAgICBjYXNlIFNVU1BFTkRfUE9XRVJf RE9XTjoKICAgICAgY2Rldi0+c3VzcGVuZGVkID0gMTsKICAgICAgaWYgKGNkZXYtPnByZXZp ZXcpCgkJCQl7CgkJCQkJY2FwdHVyZV9hYm9ydCAoY2Rldik7CgkJCQkJY2Rldi0+Y2FtaWYt PmNsb3NlICgpOwoJCQkJfQogICAgICBicmVhazsKICAgIH0KCiAgcmV0dXJuIDA7Cgp9CgpT VEFUSUMgaW50CnJlc3VtZV90aHJlYWQgKHZvaWQgKmRhdGEpCnsKICBzdHJ1Y3QgY2FwdHVy ZV9kZXZpY2UgKmRldiA9IChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKikgZGF0YTsKCiAgZGFl bW9uaXplICgpOwogIHJlcGFyZW50X3RvX2luaXQgKCk7CiAgc3RyY3B5IChjdXJyZW50LT5j b21tLCAiY2FtZXJhX3Jlc3VtZSIpOwogIGNvbXBsZXRlICgmZGV2LT5yZXN1bWVfdGhyZWFk X3N5bmMpOwoKICBmb3IgKDs7KQogICAgewogICAgICB3YWl0X2V2ZW50IChkZXYtPnJlc3Vt ZV93cSwgZGV2LT5yZXN1bWVfcmVxdWVzdCk7CgogICAgICBpZiAoZGV2LT5yZXN1bWVfdGhy ZWFkX2V4aXQpCglicmVhazsKCiAgICAgIGlmIChkZXYtPnByZXZpZXcpCgkJCQl7CgkJCQkJ ZGV2LT5jYW1pZi0+b3BlbiAoKTsKCQkJCQlpZiAoZGV2LT5zdHJlYW1pbmcpCgkJCQkJCWNh cHR1cmVfc3RyZWFtX3N0YXJ0IChkZXYpOwoJCQkJCWVsc2UgaWYgKGRldi0+cHJldmlldykK CQkJCQkJY2FwdHVyZV9ncmFiX2ZyYW1lIChkZXYpOwoJCQkJfQoKICAgICAgZGV2LT5yZXN1 bWVfcmVxdWVzdCA9IGRldi0+c3VzcGVuZGVkID0gMDsKICAgICAgd2FrZV91cCAoJmRldi0+ c3VzcGVuZF93cSk7CiAgICB9CgogIGNvbXBsZXRlX2FuZF9leGl0ICgmZGV2LT5yZXN1bWVf dGhyZWFkX3N5bmMsIDApOwogIHJldHVybiAwOwp9CgpTVEFUSUMgaW50Cm9tYXBfY2FtZXJh X2RwbV9yZXN1bWUgKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGxldmVsKQp7CiAgc3RydWN0 IGNhcHR1cmVfZGV2aWNlICpjZGV2ID0gKHN0cnVjdCBjYXB0dXJlX2RldmljZSAqKSBkZXYt PnBsYXRmb3JtX2RhdGE7CgogIHN3aXRjaCAobGV2ZWwpCiAgICB7CiAgICBjYXNlIFJFU1VN RV9QT1dFUl9PTjoKICAgICAgLyoKICAgICAgICogUmVzdW1lIGlzIGdldHRpbmcgY2FsbGVk IGluIGFuIGludGVycnVwdCBjb250ZXh0IG9uCiAgICAgICAqIE9NQVAsIGFuZCByZXN1bWUg cmVxdWlyZXMgd2FpdGluZyBvbiBxdWV1ZXMgZXRjLiB0byBwb3dlcgogICAgICAgKiB1cCB0 aGUgY2FtZXJhLiBTbyB3ZSBjYW4ndCByZXN1bWUgaGVyZS4gU28gd2UgaGF2ZSB0bwogICAg ICAgKiB1c2UgYSBrZXJuZWwgdGhyZWFkIGZvciByZXN1bWUgcmVxdWVzdHMgKFBJVEEpLgog ICAgICAgKi8KICAgICAgY2Rldi0+cmVzdW1lX3JlcXVlc3QgPSAxOwogICAgICB3YWtlX3Vw ICgmY2Rldi0+cmVzdW1lX3dxKTsKICAgICAgYnJlYWs7CiAgICB9CiAgcmV0dXJuIDA7Cn0K CiNlbmRpZiAvKiBNVkwtQ0VFICovCgoKLyoKICoKICogICAgICBNIEUgTSBPIFIgWSAgIE0g QSBQIFAgSSBOIEcKICoKICoKICovClNUQVRJQyBzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqCm1t YXBfc3RyZWFtX2J1ZmZlcl9mcm9tX29mZnNldCAoc3RydWN0IGNhcHR1cmVfZGV2aWNlICpk ZXYsCgkJCQl1bnNpZ25lZCBsb25nIG9mZnNldCkKewogIGludCBpOwoJRU5UUlkoKTsKICBv ZmZzZXQgPSBvZmZzZXQgKiBQQUdFX1NJWkU7CgogIGZvciAoaSA9IDA7IGkgPCBNQVhfQ0FQ VFVSRV9CVUZGRVJTOyArK2kpCiAgICBpZiAob2Zmc2V0ID09IGRldi0+c3RyZWFtX2J1Zltp XS52aWRidWYubS5vZmZzZXQpCiAgICAgIHJldHVybiAmZGV2LT5zdHJlYW1fYnVmW2ldOwog IHJldHVybiBOVUxMOwp9CgpTVEFUSUMgaW50Cm1tYXBfcmVxdWVzdF9idWZmZXJzIChzdHJ1 Y3QgY2FwdHVyZV9kZXZpY2UgKmRldiwKCQkgICAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVm ZmVycyAqcmVxKQp7CiAgaW50IGk7CgogIHUzMiBidWZsZW47CiAgdTMyIHR5cGU7CglFTlRS WSgpOwogIGlmIChkZXYtPnN0cmVhbV9idWZmZXJzX21hcHBlZCkKICAgIHJldHVybiAwOwkJ CS8qIGNhbid0IG1ha2UgcmVxdWVzdHMgaWYgYnVmZmVycyBhcmUgbWFwcGVkICovCiAgaWYg KHJlcS0+Y291bnQgPCAxKQogICAgcmVxLT5jb3VudCA9IDE7CiAgaWYgKHJlcS0+Y291bnQg PiBNQVhfQ0FQVFVSRV9CVUZGRVJTKQogICAgcmVxLT5jb3VudCA9IE1BWF9DQVBUVVJFX0JV RkZFUlM7CiAgdHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRTsKCiAgLyogIFRo ZSBidWZmZXIgbGVuZ3RoIG5lZWRzIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlIHBhZ2Ugc2l6 ZSAgKi8KICBidWZsZW4gPSAoZGV2LT5jbGllbnRmbXQuc2l6ZWltYWdlICsgUEFHRV9TSVpF IC0gMSkgJiB+KFBBR0VfU0laRSAtIDEpOwogIGRiZygiR3JhbnRpbmcgJWQgYnVmZmVyc1xu IixyZXEtPmNvdW50KTsKCiAgLyogIE5vdyBpbml0aWFsaXplIHRoZSBidWZmZXIgc3RydWN0 dXJlcy4gRG9uJ3QgYWxsb2NhdGUgdGhlICovCiAgLyogIGJ1ZmZlcnMgdW50aWwgdGhleSdy ZSBtYXBwZWQuICovCiAgZm9yIChpID0gMDsgaSA8IHJlcS0+Y291bnQ7ICsraSkKICAgIHsK ICAgICAgZGV2LT5zdHJlYW1fYnVmW2ldLmRtYV9saXN0ID0gTlVMTDsKICAgICAgZGV2LT5z dHJlYW1fYnVmW2ldLnJlcXVlc3RlZCA9IDE7CiAgICAgIGRldi0+c3RyZWFtX2J1ZltpXS52 aWRidWYuaW5kZXggPSBpOwogICAgICBkZXYtPnN0cmVhbV9idWZbaV0udmlkYnVmLnR5cGUg PSB0eXBlOwogICAgICAvKiBvZmZzZXQgbXVzdCBiZSB1bmlxdWUgZm9yIGVhY2ggYnVmZmVy LCBhbmQgYSBtdWx0aXBsZSAqLwogICAgICAvKiBvZiBQQUdFX1NJWkUgb24gMi40LnggICov CiAgICAgIGRldi0+c3RyZWFtX2J1ZltpXS52aWRidWYubS5vZmZzZXQgPSBQQUdFX1NJWkUg KiAoaSArIDEpOwogICAgICBkZXYtPnN0cmVhbV9idWZbaV0udmlkYnVmLmxlbmd0aCA9IGRl di0+Y2xpZW50Zm10LnNpemVpbWFnZTsKICAgICAgZGV2LT5zdHJlYW1fYnVmW2ldLnZpZGJ1 Zi5ieXRlc3VzZWQgPSAwOwogICAgICBkZXYtPnN0cmVhbV9idWZbaV0udmlkYnVmLmZsYWdz ID0gMDsKICAgICAgZGV2LT5zdHJlYW1fYnVmW2ldLnZpZGJ1Zi50aW1lc3RhbXAudHZfc2Vj ID0gMDsKICAgICAgZGV2LT5zdHJlYW1fYnVmW2ldLnZpZGJ1Zi50aW1lc3RhbXAudHZfdXNl YyA9IDA7CiAgICAgIGRldi0+c3RyZWFtX2J1ZltpXS52aWRidWYuc2VxdWVuY2UgPSAwOwog ICAgICBtZW1zZXQgKCZkZXYtPnN0cmVhbV9idWZbaV0udmlkYnVmLnRpbWVjb2RlLCAwLAoJ ICAgICAgc2l6ZW9mIChzdHJ1Y3QgdjRsMl90aW1lY29kZSkpOwogICAgfQogIGZvciAoaSA9 IHJlcS0+Y291bnQ7IGkgPCBNQVhfQ0FQVFVSRV9CVUZGRVJTOyArK2kpCiAgICBkZXYtPnN0 cmVhbV9idWZbaV0ucmVxdWVzdGVkID0gMDsKICBkZXYtPnN0cmVhbV9idWZmZXJzX3JlcXVl c3RlZCA9IHJlcS0+Y291bnQ7CgogIHJldHVybiAxOwp9CgpTVEFUSUMgdm9pZAptbWFwX3Vu cmVxdWVzdF9idWZmZXJzIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldikKewogIGludCBp OwoJRU5UUlkoKTsKICBpZiAoZGV2LT5zdHJlYW1fYnVmZmVyc19yZXF1ZXN0ZWQgPT0gMCB8 fCBkZXYtPnN0cmVhbV9idWZmZXJzX21hcHBlZCkKICAgIHJldHVybjsKICBmb3IgKGkgPSAw OyBpIDwgTUFYX0NBUFRVUkVfQlVGRkVSUzsgKytpKQogICAgZGV2LT5zdHJlYW1fYnVmW2ld LnJlcXVlc3RlZCA9IDA7CiAgZGV2LT5zdHJlYW1fYnVmZmVyc19yZXF1ZXN0ZWQgPSAwOwp9 CgoKLyoqCiAqIG1ldGhvZHMgdXNlZCBieSB2bWEgb3BlcmF0aW9ucyA6IGl0J3Mgbm90IHBv c3NpYmxlIHRvIHJlbWFwIGFsbG9jYXRlZCBtZW1vcnkgc28gd2UgbmVlZCB0byBwYXNzIHZp YSB0aGUgIm5vcGFnZSBtZXRob2QiCiAqLwoKLyoqCiAqIG9wZW4gbWV0aG9kCiAqLwpTVEFU SUMgdm9pZAptbWFwX3ZtYV9vcGVuIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKewog IHN0cnVjdCBkZXZpY2Vfb3BlbiAqbyA9IChzdHJ1Y3QgZGV2aWNlX29wZW4gKikgdm1hLT52 bV9maWxlLT5wcml2YXRlX2RhdGE7CiAgc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYgPSBv LT5kZXY7CiAgc3RydWN0IHN0cmVhbV9idWZmZXIgKmJ1ZjsKCUVOVFJZKCk7CgkjaWYgMQkJ CQkvKiBNVkwtQ0VFICovCiAgd2FpdF9ldmVudCAoZGV2LT5zdXNwZW5kX3dxLCBkZXYtPnN1 c3BlbmRlZCA9PSAwKTsKCSNlbmRpZiAvKiBNVkwtQ0VFICovCgogIGlmIChkZXYgPT0gTlVM TCkKICAgIHJldHVybjsKICBidWYgPSBtbWFwX3N0cmVhbV9idWZmZXJfZnJvbV9vZmZzZXQg KGRldiwgdm1hLT52bV9wZ29mZik7CgogICsrYnVmLT52bWFfcmVmY291bnQ7CgkKCn0KClNU QVRJQyB2b2lkCm1tYXBfdm1hX2Nsb3NlIChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkK ewogIHN0cnVjdCBkZXZpY2Vfb3BlbiAqbyA9IChzdHJ1Y3QgZGV2aWNlX29wZW4gKikgdm1h LT52bV9maWxlLT5wcml2YXRlX2RhdGE7CiAgc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYg PSBvLT5kZXY7CiAgc3RydWN0IHN0cmVhbV9idWZmZXIgKmJ1ZiA9CiAgICBtbWFwX3N0cmVh bV9idWZmZXJfZnJvbV9vZmZzZXQgKGRldiwgdm1hLT52bV9wZ29mZik7CiAgaW50IGksIG4g PSAxOwoJCglFTlRSWSgpOwoJI2lmIDEJCQkJLyogTVZMLUNFRSAqLwoJCXdhaXRfZXZlbnQg KGRldi0+c3VzcGVuZF93cSwgZGV2LT5zdXNwZW5kZWQgPT0gMCk7CgkjZW5kaWYgLyogTVZM LUNFRSAqLwoKCiAgLS1idWYtPnZtYV9yZWZjb3VudDsKICBpZiAoYnVmLT52bWFfcmVmY291 bnQgPiAwKQogICAgcmV0dXJuOwogIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpCiAgICB7CiAg ICAgIGlmIChkZXYtPnN0cmVhbWluZykKCQkJCXsKCQkJCQkvL2RiZygiV2FybmluZy0gbXVu bWFwKCkgY2FsbGVkIHdoaWxlIHN0cmVhbWluZ1xuIik7CgkJCQkJY2FwdHVyZV9zdHJlYW1v ZmYgKGRldik7CgkJCQl9CiAgICAgIHY0bDJfcV95YW5rX25vZGUgKCZkZXYtPnN0cmVhbV9x X2NhcHR1cmUsICZidWYtPnFub2RlKTsKICAgICAgdjRsMl9xX3lhbmtfbm9kZSAoJmRldi0+ c3RyZWFtX3FfZG9uZSwgJmJ1Zi0+cW5vZGUpOwoKCQkJRGVhbGxvY2F0ZUJ1ZmZlcihidWYp OwoJCQkKICAgICAgYnVmLT52aWRidWYuZmxhZ3MgPSAwOwogICAgICAvL2RiZygiQnVmZmVy ICVkIGRlYWxsb2NhdGVkXG4iLChpbnQpdm1hLT52bV9wZ29mZik7CiAgICAgICsrYnVmOwog ICAgICBpZiAoZGV2LT5zdHJlYW1fYnVmZmVyc19tYXBwZWQgPiAwKQoJCQkJLS1kZXYtPnN0 cmVhbV9idWZmZXJzX21hcHBlZDsKCiAgICB9CiAgLy9NT0RfREVDX1VTRV9DT1VOVDsKCXZt YS0+dm1fZmxhZ3MgJj0gflZNX1JFU0VSVkVEOwoJRVhJVCgpOwp9CgpTVEFUSUMgc3RydWN0 IHBhZ2UgKgptbWFwX3ZtYV9ub3BhZ2UgKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1 bnNpZ25lZCBsb25nIGFkZHJlc3MsIGludCB3cml0ZSkKewogIHN0cnVjdCBkZXZpY2Vfb3Bl biAqbyA9IChzdHJ1Y3QgZGV2aWNlX29wZW4gKikgdm1hLT52bV9maWxlLT5wcml2YXRlX2Rh dGE7CiAgc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYgPSBvLT5kZXY7CiAgc3RydWN0IHN0 cmVhbV9idWZmZXIgKmJ1ZjsKICB1bnNpZ25lZCBsb25nIG9mZnNldF9pbnRvX2J1ZmZlcjsK ICBzdHJ1Y3Qgc2NhdHRlcl9ub2RlICpjdXJyOwogIHN0cnVjdCBwYWdlICpwYWdlOwogIC8v aW50IG4gPSAxOwoKICBFTlRSWSAoKTsKICBkYmcgKCJub3BhZ2UgOkBwYWdlIDB4JWx4LCBA IDB4JWx4XG4iLCB2bWEtPnZtX3Bnb2ZmLCBhZGRyZXNzKTsKICBpZiAoZGV2ID09IE5VTEwp CiAgICB7CiAgICAgIGRiZyAoIm5vcGFnZSA6IGRldiA9PSBOVUxMIFxuIik7CiAgICAgIEVY SVQgKCk7CiAgICAgIHJldHVybiAwOwogICAgfQoKCSNpZiAxCQkJCS8qIE1WTC1DRUUgKi8K CQl3YWl0X2V2ZW50IChkZXYtPnN1c3BlbmRfd3EsIGRldi0+c3VzcGVuZGVkID09IDApOwoJ I2VuZGlmIC8qIE1WTC1DRUUgKi8KCiAgYnVmID0gbW1hcF9zdHJlYW1fYnVmZmVyX2Zyb21f b2Zmc2V0IChkZXYsIHZtYS0+dm1fcGdvZmYpOwoKICBpZiAoYnVmID09IE5VTEwpCiAgICB7 CiAgICAgIGRiZyAoIm5vcGFnZSA6IGNhbid0IGZpbmQgYXNzb2NpYXRlZCBidWZmZXIsIEBw YWdlIDB4JWx4LCBAIDB4JWx4XG4iLAoJCQkJCQl2bWEtPnZtX3Bnb2ZmLCBhZGRyZXNzKTsK ICAgICAgRVhJVCAoKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogIG9mZnNldF9pbnRvX2J1 ZmZlciA9IGFkZHJlc3MgLSB2bWEtPnZtX3N0YXJ0OwogIGRiZyAoIm9mZnNldF9pbnRvX2J1 ZmZlciA6IDB4JWx4XG4iLCBvZmZzZXRfaW50b19idWZmZXIpOwoKICBpZiAob2Zmc2V0X2lu dG9fYnVmZmVyID49IGJ1Zi0+dmlkYnVmLmxlbmd0aCkKICAgIHsKICAgICAgZXJyICgiQXR0 ZW1wdCB0byByZWFkIHBhc3QgZW5kIG9mIG1tYXAoKSBidWZmZXJcbiIpOwogICAgICBFWElU ICgpOwogICAgICByZXR1cm4gMDsKICAgIH0KICBjdXJyID0gYnVmLT5kbWFfbGlzdDsKICB3 aGlsZSAob2Zmc2V0X2ludG9fYnVmZmVyID49IGN1cnItPmxlbikKICAgIHsKICAgICAgb2Zm c2V0X2ludG9fYnVmZmVyIC09IGN1cnItPmxlbjsKICAgICAgY3VyciA9IGN1cnItPm5leHQ7 CiAgICB9CgogIHBhZ2UgPSB2aXJ0X3RvX3BhZ2UgKCh2b2lkICopIChjdXJyLT5hZGRyICsg b2Zmc2V0X2ludG9fYnVmZmVyKSk7CiAgZGJnICgibm9wYWdlICVkOiBwYWdlICVsdSBjdXJy LT5hZGRyICVsdSBvZmZlc3RfaW50b19idWZmZXIgJWx1ICIKICAgICAgICJjdXJyLT5hZGRy ICsgb2Zmc2V0X2ludG9fYnVmZmVyICVsdVxuIiwgdm1hLT52bV9wZ29mZiwKICAgICAgIHBh Z2VfYWRkcmVzcyAocGFnZSksIGN1cnItPmFkZHIsIG9mZnNldF9pbnRvX2J1ZmZlciwKICAg ICAgIGN1cnItPmFkZHIgKyBvZmZzZXRfaW50b19idWZmZXIpOwogIGlmIChwYWdlID09IE5V TEwpCiAgICB7CiAgICAgIGRiZyAoIm5vcGFnZSA6IHZtYWxsb2NfdG9fcGFnZSByZXR1cm4g TlVMTCAgQHBhZ2UgMHglbHgsIEAgMHglbHhcbiIsCgkgICB2bWEtPnZtX3Bnb2ZmLCBhZGRy ZXNzKTsKICAgICAgRVhJVCAoKTsKICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgZ2V0X3Bh Z2UgKHBhZ2UpOwoKICBFWElUICgpOwogIHJldHVybiBwYWdlOwp9CgoKc3RhdGljIHN0cnVj dCB2bV9vcGVyYXRpb25zX3N0cnVjdCBjYXB0dXJlX3ZtYV9vcGVyYXRpb25zID0gewoJLm9w ZW4JCT0gbW1hcF92bWFfb3BlbiwKCS5jbG9zZQk9IG1tYXBfdm1hX2Nsb3NlLAogIC5ub3Bh Z2UgPSBtbWFwX3ZtYV9ub3BhZ2UsCn07CgovKgogKgogKiAgICAgIFYgNCBMIDIgICBJIE4g VCBFIFIgRiBBIEMgRQogKgogKi8KClNUQVRJQyBpbnQKdjRsMl9vcGVuIChzdHJ1Y3QgaW5v ZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSkKewoKCiAgc3RydWN0IGNhcHR1cmVfZGV2 aWNlICpkZXY7CiAgaW50IHJldGNvZGU7CgoJRU5UUlkoKTsKCiAgLy93ZSBrbm93IGhhdmUg YWNjZXNzIHRvIGZpbGUgc3RydWN0IDogc3RvcmUgaW5mb3JtYXRpb25zIGludG8gcHJpdmF0 ZSBkYXRhCiAgLy90aGlzIGlzIGEgaGFjayBhbmQgYSBiZXR0ZXIgdXNlIG9mIHByaXZhdGVf ZGF0YSBzaG91bGQgYmUgcGVyZm9ybWVkCiAgaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBO VUxMKQkvL2ZpcnN0IG9wZW4KICAgIHsKCQkJLy90aGlzIGlzIG5vdCBjbGVhbiBidXQgc2lu Y2Ugc3RydWN0IGNhcHR1cmVfZGV2aWNlIGlzIHVzZWQgZXZlcnl3aGVyZS4uLi4KICAgICAg ZmlsZS0+cHJpdmF0ZV9kYXRhID0ga21hbGxvYyAoc2l6ZW9mIChzdHJ1Y3QgZGV2aWNlX29w ZW4pLCBHRlBfS0VSTkVMKTsKICAgICAgaWYgKGZpbGUtPnByaXZhdGVfZGF0YSA9PSBOVUxM KQoJCQkJcmV0dXJuIC1FTk9NRU07CiAgICAgICgoc3RydWN0IGRldmljZV9vcGVuICopIGZp bGUtPnByaXZhdGVfZGF0YSktPmRldiA9ICZjYXB0dXJlOwogICAgfQogIGRldiA9ICgoc3Ry dWN0IGRldmljZV9vcGVuICopIGZpbGUtPnByaXZhdGVfZGF0YSktPmRldjsKCSNpZiAxCQkJ CS8qIE1WTC1DRUUgKi8KCQl3YWl0X2V2ZW50IChkZXYtPnN1c3BlbmRfd3EsIGRldi0+c3Vz cGVuZGVkID09IDApOwoJI2VuZGlmIC8qIE1WTC1DRUUgKi8KCiAgaWYgKEdFVF9VU0VfQ09V TlQgKFRISVNfTU9EVUxFKSA+PSBNQVhfT1BFTlMpCiAgICByZXR1cm4gLUVCVVNZOwoKCSNp ZiAxCQkJCS8qIE1WTC1DRUUgKi8KCQl3YWl0X2V2ZW50IChkZXYtPnN1c3BlbmRfd3EsIGRl di0+c3VzcGVuZGVkID09IDApOwoJI2VuZGlmIC8qIE1WTC1DRUUgKi8KCiAgLy9kYmcoImZf ZmxhZ3MgOiAleCA6ICV4IFxuIixmaWxlLT5mX2ZsYWdzLE9fVFJVTkMpOwogIGlmIChmaWxl LT5mX2ZsYWdzICYgT19UUlVOQykKICAgIHsKICAgICAgLy9kYmcoIk5vbi1jYXB0dXJpbmcg b3BlblxuIik7CiAgICAgICgoc3RydWN0IGRldmljZV9vcGVuICopIGZpbGUtPnByaXZhdGVf ZGF0YSktPm5vbmNhcHR1cmluZyA9IDE7CiAgICB9CiAgZWxzZSBpZiAoZGV2LT5jYXB0dXJp bmdfb3BlbnMpCiAgICB7CiAgICAgIC8vZGJnKCJObyBtb3JlIGNhcHR1cmluZyBvcGVucyBv biB0aGlzIGRldmljZVxuIik7CiAgICAgIHJldHVybiAtRUJVU1k7CiAgICB9CiAgZWxzZQog ICAgewogICAgICAvKiAgS2VlcCB0cmFjayBvZiB3aGV0aGVyIHRoZXJlIGlzIGEgY2FwdHVy aW5nIG9wZW4gICovCiAgICAgICgoc3RydWN0IGRldmljZV9vcGVuICopIGZpbGUtPnByaXZh dGVfZGF0YSktPm5vbmNhcHR1cmluZyA9IDA7CiAgICAgIGRldi0+Y2FwdHVyaW5nX29wZW5z ID0gMTsKICAgIH0KCgogIGlmIChHRVRfVVNFX0NPVU5UIChUSElTX01PRFVMRSkgPT0gMCkK ICAgIHsKICAgICAgaWYgKGRldi0+cHJldmlldykKCQkJCXsKCQkJCQkvKiBJZiBwcmV2aWV3 IG1vZGUgaXMgb24gdGhlbiB3ZSB3aWxsIHJlZnJhaW4KCQkJCQkJIGZyb20gYW55IGZ1cnRo dXIgZGV2aWNlIGluaXRpYWxpemF0aW9uIHNpbmNlCgkJCQkJCSBpdCBpc24ndCBuZWVkZWQg YW5kIGFjdHVhbGx5IHdpbGwgZGlzcnVwdCB0aGUKCQkJCQkJIGF1dG9tYXRpYyBwcmV2aWV3 IG9wZXJhdGlvbiB0aGF0IHRoZSBkcml2ZXIKCQkJCQkJIGlzIGluIHRoZSBwcm9jZXNzIG9m IGRvaW5nLiBSZWNhbGwgdGhhdCBhcHBzCgkJCQkJCSBjYW4gb3BlbigpIHRoZSB2aWRlbyBk ZXZpY2UsIHR1cm4gb24gcHJldmlldywKCQkJCQkJIGFuZCB0aGVuIGNsb3NlKCkgaXQ7IHBy ZXZpZXcgY29udGludWVzLiBTb21ldGltZQoJCQkJCQkgbGF0ZXIgdGhleSBtYXkgcmUtb3Bl bigpIHRoZSBkZXZpY2UgYW5kIHdlIGRvbid0CgkJCQkJCSB3YW50IHRoYXQgZGlzcnVwdGlu ZyB0aGUgb24tZ29pbmcgcHJldmlldwoJCQkJCQkgcHJvY2Vzc2luZy4gKi8KCQkJCQlyZXR1 cm4gMDsKCQkJCX0KCiAgICAgIGlmICgocmV0Y29kZSA9IGRldi0+Y2FtaWYtPm9wZW4gKCkp KQoJCQkJewoJCQkJCXJldHVybiByZXRjb2RlOwoJCQkJfQoKICAgICAgZGV2LT5yZWFkeV90 b19jYXB0dXJlID0gMDsJLyogYmVuY2htYXJrIGNoYW5nZXMgcGFyYW1ldGVycyEgKi8KICAg ICAgZGV2LT5jYXB0dXJlX2NvbXBsZXRlZCA9IDA7CiAgICAgIGRldi0+Y2FwdHVyZV9zdGFy dGVkID0gMDsKICAgICAgdjRsMl9xX2luaXQgKCZkZXYtPnN0cmVhbV9xX2NhcHR1cmUpOwog ICAgICB2NGwyX3FfaW5pdCAoJmRldi0+c3RyZWFtX3FfZG9uZSk7CiAgICB9CiAgLy9kYmco Ik9wZW4gc3VjY2VlZGVkXG4iKTsKCiAgLyogZnJhbWUgY291bnRlciBmb3IgdGVzdCBpbWFn ZXMgb25seSAqLwogIGlmICghKChzdHJ1Y3QgZGV2aWNlX29wZW4gKikgZmlsZS0+cHJpdmF0 ZV9kYXRhKS0+bm9uY2FwdHVyaW5nKQogICAgZGV2LT5oID0gZGV2LT5tID0gZGV2LT5zID0g ZGV2LT5mID0gMDsKCiAgTU9EX0lOQ19VU0VfQ09VTlQ7CiAgcmV0dXJuIDA7Cn0KClNUQVRJ QyBpbnQKdjRsMl9jbG9zZSAoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZp bGUpCnsKCiAgc3RydWN0IGRldmljZV9vcGVuICpvID0gKHN0cnVjdCBkZXZpY2Vfb3BlbiAq KSBmaWxlLT5wcml2YXRlX2RhdGE7CiAgc3RydWN0IGNhcHR1cmVfZGV2aWNlICpkZXYgPSBv LT5kZXY7CglFTlRSWSgpOwoJI2lmIDEJCQkJLyogTVZMLUNFRSAqLwoJCXdhaXRfZXZlbnQg KGRldi0+c3VzcGVuZF93cSwgZGV2LT5zdXNwZW5kZWQgPT0gMCk7CgkjZW5kaWYgLyogTVZM LUNFRSAqLwoKICBpZiAoIW8tPm5vbmNhcHR1cmluZykKICAgIHsKICAgICAgZGV2LT5jYXB0 dXJpbmdfb3BlbnMgPSAwOwogICAgICAvL2RiZygiQ2xvc2VcbiIpOwogICAgfQoKICBpZiAo ZGV2LT5wcmV2aWV3KQogICAgewogICAgICAvKiBJZiB3ZSBoYXZlIGJlZW4gcGxhY2VkIGlu dG8gcHJldmlldyBtb2RlIHRoZW4KICAgICAgICAgd2Ugd2FudCB0byBrZWVwIHRoYXQgZ29p bmcgZXZlbiBpZiB0aGUgYXBwCiAgICAgICAgIGNsb3NlcyB0aGUgdmlkZW8gZGV2aWNlLiBX ZSBleHBlY3Qgc29tZXRpbWUKICAgICAgICAgbGF0ZXIgdGhlIGFwcCwgb3Igc29tZSBhcHAs IHdpbGwgb3BlbiB0aGUKICAgICAgICAgdmlkZW8gZGV2aWNlIGFuZCB0dXJuIG9mZiBwcmV2 aWV3IHdoZW4gaXQKICAgICAgICAgZGVzaXJlcy4gVGhpcyB2aWRlbyBkcml2ZXIgaGFuZGxl cyB0aGUKICAgICAgICAgcHJldmlldyBvcGVyYXRpb24gYW5kIGFsbCB0aGUgYXBwIG5lZWRz IHRvCiAgICAgICAgIGRvIGlzIGJyaWVmbHkgb3BlbigpIHVzIGFuZCB0dXJuIG9uIG9yCiAg ICAgICAgIG9mZiB0aGUgcHJldmlldyBtb2RlIGFuZCB0aGVuLCBpZiBkZXNpcmVkLAogICAg ICAgICBjbG9zZSgpIHVzLiAqLwogICAgICByZXR1cm4gMDsKICAgIH0KICAvLyBzaHV0IHRo aW5ncyBkb3duLgogIGlmIChHRVRfVVNFX0NPVU5UIChUSElTX01PRFVMRSkgPT0gMSkKICAg IHsKICAgICAgY2FwdHVyZV9jbG9zZSAoZGV2KTsKICAgICAgZGV2LT5jYW1pZi0+Y2xvc2Ug KCk7CiAgICB9CiAga2ZyZWUgKGZpbGUtPnByaXZhdGVfZGF0YSk7CiAgTU9EX0RFQ19VU0Vf Q09VTlQ7CiAgcmV0dXJuIDA7Cn0KCgpTVEFUSUMgaW50CnY0bDJfaW9jdGwgKHN0cnVjdCBp bm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLAoJICAg IHVuc2lnbmVkIGxvbmcgYXJncCkKewogIHN0cnVjdCBkZXZpY2Vfb3BlbiAqbyA9IChzdHJ1 Y3QgZGV2aWNlX29wZW4gKikgZmlsZS0+cHJpdmF0ZV9kYXRhOwogIHN0cnVjdCBjYXB0dXJl X2RldmljZSAqZGV2ID0gby0+ZGV2OwogIHZvaWQgKmFyZyA9ICh2b2lkICopIGFyZ3A7CglF TlRSWSgpOwoKICBkYmcoImlvY3RsIGNhbGxlZCA6ICVzICgweCV4KSBcbiIsIHY0bDJfaW9j dGxfbmFtZXNbX0lPQ19OUiAoY21kKV0sIGNtZCk7CgoJI2lmIDEJCQkJLyogTVZMLUNFRSAq LwoJCXdhaXRfZXZlbnQgKGRldi0+c3VzcGVuZF93cSwgZGV2LT5zdXNwZW5kZWQgPT0gMCk7 CgkjZW5kaWYgLyogTVZMLUNFRSAqLwoKICBzd2l0Y2ggKGNtZCkKICAgIHsKICAgIGNhc2Ug VklESU9DX1FVRVJZQ0FQOgogICAgICB7CgkJCQkjZGVmaW5lIEtFUk5FTF9WRVJTSU9OKGEs YixjKSAoKChhKSA8PCAxNikgKyAoKGIpIDw8IDgpICsgKGMpKQoJCQkJc3RydWN0IHY0bDJf Y2FwYWJpbGl0eSBiID0gewoJCQkJZHJpdmVyOiJvbWFwIiwKCQkJCWNhcmQ6Imlubm92YXRv ciIsCgkJCQlidXNfaW5mbzoiaTJjKz8/PyIsCgkJCQl2ZXJzaW9uOktFUk5FTF9WRVJTSU9O ICgwLCAwLCAxKSwKCQkJCWNhcGFiaWxpdGllczpWNEwyX0NBUF9WSURFT19DQVBUVVJFIHwg VjRMMl9DQVBfUkVBRFdSSVRFIHwKCQkJCQkJVjRMMl9DQVBfU1RSRUFNSU5HLAoJCQkJfTsK CgkJCQlpZiAoY29weV90b191c2VyKGFyZywgJmIsIHNpemVvZihzdHJ1Y3QgdjRsMl9jYXBh YmlsaXR5KSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQkvL34gKigoc3RydWN0IHY0bDJf Y2FwYWJpbGl0eSAqKSBhcmcpID0gYjsKCQkJCXJldHVybiAwOwogICAgICB9CiAgICBjYXNl IFZJRElPQ19FTlVNX0ZNVDoKICAgICAgewoJCQkJc3RydWN0IHY0bDJfZm10ZGVzYyBmOwoK CQkJCWlmIChjb3B5X2Zyb21fdXNlcigmZiwgYXJnLCBzaXplb2Yoc3RydWN0IHY0bDJfZm10 ZGVzYykpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKGYuaW5kZXggPCAwIHx8IGYu aW5kZXggPj0gTlVNX0NBUEZNVCkKCQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJCWYgPSBjYXBm bXRbZi5pbmRleF07CgkJCQkjd2FybmluZyBpZ25vcmUgdGhlIGZvbGxvd2luZyB3YXJuaW5n IGlmIGRlYnVnIGlzbnQgYWN0aXZhdGVkCgkJCQljaGFyICpwaXhlbGYgPSAoY2hhciAqKSAm KGYucGl4ZWxmb3JtYXQpOwoJCQkJZGJnICgiaW5kZXggOiAlZCwgJXMsIGZsYWdzICVkLCAl cywgJWMlYyVjJWNcbiIsIGYuaW5kZXgsCgkJCQkJCSB2NGwyX3R5cGVfbmFtZXNbZi50eXBl XSwgZi5mbGFncywgZi5kZXNjcmlwdGlvbiwgcGl4ZWxmWzBdLAoJCQkJCQkgcGl4ZWxmWzFd LCBwaXhlbGZbMl0sIHBpeGVsZlszXSk7CgkJCQlpZiAoY29weV90b191c2VyIChhcmcsICZm LCAgc2l6ZW9mKHN0cnVjdCB2NGwyX2ZtdGRlc2MpKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsK CQkJCXJldHVybiAwOwogICAgICB9CiAgICBjYXNlIFZJRElPQ19HX0ZNVDoKICAgICAgewoJ CQkJc3RydWN0IHY0bDJfZm9ybWF0IGZtdDsKCgkJCQlpZiAoY29weV9mcm9tX3VzZXIoJmZt dCwgYXJnLCBzaXplb2Yoc3RydWN0IHY0bDJfZm9ybWF0KSkpCgkJCQkJcmV0dXJuIC1FRkFV TFQ7CgkJCQlpZiAoZm10LnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQoJ CQkJCXsKCQkJCQkJZGJnKCJHX0ZNVCB3cm9uZyBidWZmZXIgdHlwZSAlZFxuIixmbXQudHlw ZSk7CgkJCQkJCXJldHVybiAtRUlOVkFMOwoJCQkJCX0KCQkJCWZtdC5mbXQucGl4ID0gZGV2 LT5jbGllbnRmbXQ7CgkJCQlpZiAoY29weV90b191c2VyKGFyZywgJmZtdCwgc2l6ZW9mKHN0 cnVjdCB2NGwyX2Zvcm1hdCkpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJcmV0dXJuIDA7 CiAgICAgIH0KICAgIGNhc2UgVklESU9DX1RSWV9GTVQ6CiAgICAgIHsKCQkJCXN0cnVjdCB2 NGwyX2Zvcm1hdCBmbXQ7CgoJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmbXQsIGFyZywgc2l6 ZW9mKHN0cnVjdCB2NGwyX2Zvcm1hdCkpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYg KGZtdC50eXBlICE9IFY0TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKCQkJCQlyZXR1cm4g LUVJTlZBTDsKCQkJCXZhbGlkYXRlX2Zvcm1hdCAoJmZtdC5mbXQucGl4KTsKCQkJCSN3YXJu aW5nIGlnbm9yZSB0aGUgZm9sbG93aW5nIHdhcm5pbmcgaWYgZGVidWcgaXNudCBhY3RpdmF0 ZWQKCQkJCWNoYXIgKnBpeGVsZm9ybWF0ID0gKGNoYXIgKikgJmZtdC5mbXQucGl4LnBpeGVs Zm9ybWF0OwoJCQkJZGJnICgiV3hIeEQgOiAlZHglZHglYyVjJWMlYyAsICVzLCBicGwgOiAl ZCwgc2l6ZSA6JWQsIGNvbG9yIDogJWRcbiIsCgkJCQkJCSBmbXQuZm10LnBpeC53aWR0aCwg Zm10LmZtdC5waXguaGVpZ2h0LAoJCQkJCQkgcGl4ZWxmb3JtYXRbMF0sIHBpeGVsZm9ybWF0 WzFdLCBwaXhlbGZvcm1hdFsyXSwgcGl4ZWxmb3JtYXRbM10sCgkJCQkJCSB2NGwyX2ZpZWxk X25hbWVzW2ZtdC5mbXQucGl4LmZpZWxkXSwgZm10LmZtdC5waXguYnl0ZXNwZXJsaW5lLAoJ CQkJCQkgZm10LmZtdC5waXguc2l6ZWltYWdlLCBmbXQuZm10LnBpeC5jb2xvcnNwYWNlKTsK CQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm10LCBzaXplb2Yoc3RydWN0IHY0bDJfZm9y bWF0KSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQlyZXR1cm4gMDsKICAgICAgfQogICAg Y2FzZSBWSURJT0NfU19GTVQ6CiAgICAgIHsKCQkJCXN0cnVjdCB2NGwyX2Zvcm1hdCBmbXQ7 CgoJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZmbXQsIGFyZywgc2l6ZW9mKHN0cnVjdCB2NGwy X2Zvcm1hdCkpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKGZtdC50eXBlICE9IFY0 TDJfQlVGX1RZUEVfVklERU9fQ0FQVFVSRSkKCQkJCQlyZXR1cm4gLUVJTlZBTDsKCgkJCQlp ZiAoby0+bm9uY2FwdHVyaW5nKQoJCQkJCXsKCQkJCQkJZGJnICgiU19GTVQgaWxsZWdhbCBp biBub24tY2FwdHVyaW5nIG9wZW5cbiIpOwoJCQkJCQlyZXR1cm4gLUVQRVJNOwoJCQkJCX0K CQkJCWlmIChkZXYtPnN0cmVhbV9idWZmZXJzX21hcHBlZCkKCQkJCQl7CgkJCQkJCWRiZyAo IlNfRk1UIGlsbGVnYWwgd2hlbiBidWZmZXIgbWFwcGVkXG4iKTsKCQkJCQkJcmV0dXJuIC1F UEVSTTsKCQkJCQl9CgoJCQkJZGV2LT5jbGllbnRmbXQgPSBmbXQuZm10LnBpeDsKCgkJCQlj YXB0dXJlX2Fib3J0IChkZXYpOwoJCQkJaWYgKGNhcHR1cmVfbmV3X2Zvcm1hdCAoZGV2KSkK CQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJCWlmIChkZXYtPnN0cmVhbWluZykKCQkJCQljYXB0 dXJlX3N0cmVhbV9zdGFydCAoZGV2KTsKCQkJCWVsc2UgaWYgKGRldi0+cHJldmlldykKCQkJ CQljYXB0dXJlX2dyYWJfZnJhbWUgKGRldik7CgkJCQlmbXQuZm10LnBpeCA9IGRldi0+Y2xp ZW50Zm10OwoKCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmZm10LCBzaXplb2Yoc3RydWN0 IHY0bDJfZm9ybWF0KSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQlyZXR1cm4gMDsKICAg ICAgfQogICAgY2FzZSBWSURJT0NfUkVRQlVGUzoKICAgICAgewoJCQkJc3RydWN0IHY0bDJf cmVxdWVzdGJ1ZmZlcnMgcmVxOwoKCQkJCWlmKGNvcHlfZnJvbV91c2VyKCZyZXEsIGFyZywg c2l6ZW9mKHN0cnVjdCB2NGwyX3JlcXVlc3RidWZmZXJzKSkpCgkJCQkJcmV0dXJuIC1FRkFV TFQ7CgkJCQlpZiAoby0+bm9uY2FwdHVyaW5nKQoJCQkJCXsKCQkJCQkJZGJnKCJSRVFCVUZT IGlsbGVnYWwgaW4gbm9uLWNhcHR1cmluZyBvcGVuXG4iKTsKCQkJCQkJcmV0dXJuIC1FUEVS TTsKCQkJCQl9CgkJCQlpZiAoZGV2LT5zdHJlYW1fYnVmZmVyc19tYXBwZWQpCgkJCQkJewoJ CQkJCQlkYmcoIkNhbid0IHJlcXVlc3QgYnVmZmVycyBpZiBidWZmZXJzIGFyZSAiCgkJCQkJ CSAgICAgICAgICJhbHJlYWR5IG1hcHBlZFxuIik7CgkJCQkJCXJldHVybiAtRVBFUk07CgkJ CQkJfQoJCQkJbW1hcF91bnJlcXVlc3RfYnVmZmVycyAoZGV2KTsKCQkJCWNhcHR1cmVfYmVn aW4gKGRldik7CgkJCQlpZiAoIW1tYXBfcmVxdWVzdF9idWZmZXJzIChkZXYsICZyZXEpKQoJ CQkJCXJldHVybiAtRUlOVkFMOwoJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZyZXEsIHNp emVvZihzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycykpKQoJCQkJCXJldHVybiAtRUZBVUxU OwoJCQkJcmV0dXJuIDA7CiAgICAgIH0KICAgIGNhc2UgVklESU9DX1FVRVJZQlVGOgogICAg ICB7CgkJCQlzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOwoJCQkJaW50IGk7CgoJCQkJaWYgKGNv cHlfZnJvbV91c2VyKCZidWYsIGFyZywgc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKQoJ CQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKG8tPm5vbmNhcHR1cmluZykKCQkJCQl7CgkJ CQkJCWRiZygiUVVFUllCVUYgaWxsZWdhbCBpbiBub24tY2FwdHVyaW5nIG9wZW5cbiIpOwoJ CQkJCQlyZXR1cm4gLUVQRVJNOwoJCQkJCX0KCQkJCWkgPSBidWYuaW5kZXg7CgkJCQlpZiAo aSA8IDAgfHwgaSA+PSBNQVhfQ0FQVFVSRV9CVUZGRVJTIHx8CgkJCQkJCSFkZXYtPnN0cmVh bV9idWZbaV0ucmVxdWVzdGVkIHx8CgkJCQkJCShidWYuZmllbGQgIT0gZGV2LT5zdHJlYW1f YnVmW2ldLnZpZGJ1Zi5maWVsZCkpCgkJCQkJewoJCQkJCQlkYmcoIlFVRVJZQlVGIGJhZCBw YXJhbWV0ZXJcbiIpOwoJCQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJCQl9CgkJCQlidWYgPSBk ZXYtPnN0cmVhbV9idWZbaV0udmlkYnVmOwoJCQkJaWYgKGNvcHlfdG9fdXNlcihhcmcsICZi dWYsIHNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsK CQkJCXJldHVybiAwOwogICAgICB9CiAgICBjYXNlIFZJRElPQ19RQlVGOgogICAgICB7CgkJ CQlzdHJ1Y3QgdjRsMl9idWZmZXIgYnVmOwoKCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmYnVm LCBhcmcsIHNpemVvZihzdHJ1Y3QgdjRsMl9idWZmZXIpKSkKCQkJCQlyZXR1cm4gLUVGQVVM VDsKCQkJCWlmIChvLT5ub25jYXB0dXJpbmcpCgkJCQkJewoJCQkJCQlkYmcgKCJRQlVGIGls bGVnYWwgaW4gbm9uLWNhcHR1cmluZyBvcGVuXG4iKTsKCQkJCQkJcmV0dXJuIC1FUEVSTTsK CQkJCQl9CgkJCQlpZiAoIWRldi0+c3RyZWFtX2J1ZmZlcnNfbWFwcGVkKQoJCQkJCXsKCQkJ CQkJZGJnICgiUUJVRiBubyBidWZmZXJzIGFyZSBtYXBwZWRcbiIpOwoJCQkJCQlyZXR1cm4g LUVJTlZBTDsKCQkJCQl9CgkJCQlpZiAoY2FwdHVyZV9xdWV1ZWJ1ZmZlciAoZGV2LCAmYnVm KSkKCQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmYnVm LCBzaXplb2Yoc3RydWN0IHY0bDJfYnVmZmVyKSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJ CQlyZXR1cm4gMDsKCQkJfQoJCWNhc2UgVklESU9DX0RRQlVGOgoJCQl7CgkJCQlzdHJ1Y3Qg djRsMl9idWZmZXIgYnVmZjsKCQkJCWludCBlcnI9MDsKCgkJCQlpZiAoY29weV9mcm9tX3Vz ZXIoJmJ1ZmYsIGFyZywgc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKQoJCQkJCXJldHVy biAtRUZBVUxUOwoJCQkJaWYgKG8tPm5vbmNhcHR1cmluZykKCQkJCQl7CgkJCQkJCWRiZyAo IkRRQlVGIGlsbGVnYWwgaW4gbm9uLWNhcHR1cmluZyBvcGVuXG4iKTsKCQkJCQkJcmV0dXJu IC1FUEVSTTsKCQkJCQl9CgoJCQkJZXJyPWNhcHR1cmVfZGVxdWV1ZWJ1ZmZlciAoZGV2LCAm YnVmZik7CgkJCQlpZiAoIGVyciApCgkJCQkJewoJCQkJCQlkYmcgKCJkZXF1ZXVlIGVycm9y ICVkXG4iLCBlcnIpOwoJCQkJCQlyZXR1cm4gZXJyOwoJCQkJCX0KCQkJCWlmIChjb3B5X3Rv X3VzZXIoYXJnLCAmYnVmZiwgc2l6ZW9mKHN0cnVjdCB2NGwyX2J1ZmZlcikpKQoJCQkJCXJl dHVybiAtRUZBVUxUOwoJCQkJcmV0dXJuIDA7CgkJCX0KICAgIGNhc2UgVklESU9DX1NUUkVB TU9OOgogICAgICB7CgkJCQlkYmcgKCJTVFJFQU1PTlxuIik7CgkJCQkKCQkJCWlmIChvLT5u b25jYXB0dXJpbmcpCgkJCQkJewoJCQkJCQlkYmcoIlNUUkVBTU9OIGlsbGVnYWwgaW4gbm9u LWNhcHR1cmluZyBvcGVuXG4iKTsKCQkJCQkJcmV0dXJuIC1FUEVSTTsKCQkJCQl9CgkJCQlp ZiAoIWNhcHR1cmVfc3RyZWFtb24gKGRldikpCgkJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCQly ZXR1cm4gMDsKICAgICAgfQogICAgY2FzZSBWSURJT0NfU1RSRUFNT0ZGOgogICAgICB7CgkJ CQlkYmcgKCJTVFJFQU1PRkZcbiIpOwoKCQkJCWlmIChvLT5ub25jYXB0dXJpbmcpCgkJCQkJ ewoJCQkJCQlkYmcoIlNUUkVBTU9GRiBpbGxlZ2FsIGluIG5vbi1jYXB0dXJpbmcgb3Blblxu Iik7CgkJCQkJCXJldHVybiAtRVBFUk07CgkJCQkJfQoJCQkJY2FwdHVyZV9zdHJlYW1vZmYg KGRldik7CgkJCQlyZXR1cm4gMDsKICAgICAgfQogICAgY2FzZSBWSURJT0NfT1ZFUkxBWToK ICAgICAgewoJCQkJaW50IG9uOwoKCQkJCWlmIChjb3B5X2Zyb21fdXNlcigmb24sIGFyZywg c2l6ZW9mKGludCkpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJZGJnICgiVklESU9DX09W RVJMQVkgJWRcbiIsIG9uKTsJLy8gKnJldmlzaXQtc2tyYW56KiB0ZW1wLgoJCQkJaWYgKCFk ZXYtPnByZXZpZXcgJiYgKG9uID09IDEpKQoJCQkJCXsKCQkJCQkJLy8gSXQgaXMgIm9mZiIg bm93IGJ1dCB3ZSB3YW50IGl0ICJvbiIsIHNvLi4uCgoJCQkJCQkvKgoJCQkJCQkgKiBzY2hl ZHVsZSB0aGUgZnJhbWVidWZmZXIgZGJnIHVwZGF0ZXIgdG8gcnVuCgkJCQkJCSAqIChpdCBo YXMgdG8gcnVuIHVuZGVyIGtldmVudGQpLgoJCQkJCQkgKi8KCQkJCQkJZGV2LT5mYmluZm9f dmFsaWQgPSAwOwoJCQkJCQlmYmluZm9fdHNrX3FfZW50cnkucm91dGluZSA9IHVwZGF0ZV9m YmluZm9fdGFzazsKCQkJCQkJZmJpbmZvX3Rza19xX2VudHJ5LmRhdGEgPSAodm9pZCAqKSBk ZXY7CgkJCQkJCXNjaGVkdWxlX3Rhc2sgKCZmYmluZm9fdHNrX3FfZW50cnkpOwoJCQkJCQlp bnRlcnJ1cHRpYmxlX3NsZWVwX29uICgmZGV2LT5mYmluZm9fd2FpdCk7CgkJCQkJCWlmIChz aWduYWxfcGVuZGluZyAoY3VycmVudCkpCgkJCQkJCQlyZXR1cm4gLUVSRVNUQVJUU1lTOwoK CQkJCQkJZGV2LT5wcmV2aWV3ID0gMTsKCQkJCQkJY2FwdHVyZV9ncmFiX2ZyYW1lIChkZXYp OwoJCQkJCQlpZiAoIWRldi0+cmVhZHlfdG9fY2FwdHVyZSkKCQkJCQkJCXsKCQkJCQkJCQlk YmcgKCJpb2N0bCguLixWSURJT0NfUFJFVklFVywuLi4pOyBDYW4ndCBncmFiIGZyYW1lcyFc biIpOwoJCQkJCQkJCXJldHVybiAtRUlOVkFMOwoJCQkJCQkJfQoJCQkJCX0KCQkJCWVsc2UK CQkJCQl7CgkJCQkJCWlmIChkZXYtPnByZXZpZXcgJiYgKG9uID09IDApKQoJCQkJCQkJewoJ CQkJCQkJCS8vIEl0IGlzICJvbiIgbm93IGJ1dCB3ZSB3YW50IGl0ICJvZmYiLCBzby4uLgoJ CQkJCQkJCWNhcHR1cmVfYWJvcnQgKGRldik7CgkJCQkJCQkJZGV2LT5yZWFkeV90b19jYXB0 dXJlID0gMDsKCQkJCQkJCQlkZXYtPnByZXZpZXcgPSAwOwoJCQkJCQkJfQoJCQkJCX0KCQkJ CXJldHVybiAwOwogICAgICB9CiAgICBjYXNlIFZJRElPQ19HX0lOUFVUOgogICAgICB7CgkJ CQlpZiAoY29weV90b191c2VyKGFyZywgJmRldi0+aW5wdXQsIHNpemVvZiAoZGV2LT5pbnB1 dCkpKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQljYXNlIFZJ RElPQ19TX0lOUFVUOgoJCQl7CgkJCQlpbnQgaW5wdXQ7CgoJCQkJaWYgKGNvcHlfZnJvbV91 c2VyKCZpbnB1dCwgYXJnLCBzaXplb2YoaW50KSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJ CQlpZiAoaW5wdXQgPCAwIHx8IGlucHV0ID49IGRldi0+dmlkZWMubnVtX2lucHV0cykKCQkJ CQl7CgkJCQkJCS8vZGJnKCJJbnB1dCBvdXQgb2YgcmFuZ2UgJWRcbiIsIGlucHV0KTsKCQkJ CQkJcmV0dXJuIC1FSU5WQUw7CgkJCQkJfQoJCQkJaWYgKGlucHV0ICE9IGRldi0+aW5wdXQp CgkJCQkJewoJCQkJCQlkZXYtPlN3aXRjaElucHV0cyA9IDE7CgkJCQkJCWRldi0+aW5wdXQg PSBpbnB1dDsKCQkJCQkJc2V0X3ZpZGVvX2lucHV0IChkZXYsIGlucHV0KTsKCQkJCQl9CgkJ CQlyZXR1cm4gMDsKCQkJfQogICAgY2FzZSBWSURJT0NfR19QQVJNOgogICAgICB7CgkJCQlz dHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHNwOwoJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZzcCwg YXJnLCBzaXplb2Yoc3RydWN0IHY0bDJfc3RyZWFtcGFybSkpKQoJCQkJCXJldHVybiAtRUZB VUxUOwoJCQkJaWYgKHNwLnR5cGUgIT0gVjRMMl9CVUZfVFlQRV9WSURFT19DQVBUVVJFKQoJ CQkJCXJldHVybiAtRUlOVkFMOwoJCQkJaWYgKGNvcHlfdG9fdXNlcigmc3AucGFybS5jYXB0 dXJlLAoJCQkJCQkmKGRldi0+Y2FwdHVyZSksCgkJCQkJCXNpemVvZihzdHJ1Y3QgdjRsMl9z dHJlYW1wYXJtKSkKCQkJCQkJKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJcmV0dXJuIDA7 CiAgICAgIH0KICAgIGNhc2UgVklESU9DX1NfUEFSTToKICAgICAgewoJCQkJZGJnKCJWSURJ T0NfU19QQVJNIFxuIik7CgkJCQlzdHJ1Y3QgdjRsMl9zdHJlYW1wYXJtIHNwOwoJCQkJc3Ry dWN0IHY0bDJfY2FwdHVyZXBhcm0gKnZwOwoJCQkJaW50IGVycm5vOwoKCQkJCWlmIChjb3B5 X2Zyb21fdXNlcigmc3AsIGFyZywgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0cmVhbXBhcm0pKSkK CQkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQl2cCA9ICYoc3AucGFybS5jYXB0dXJlKTsKCQkJ CQoJCQkJZGJnICggInNldHRpbmcgdGltZXBlcmZyYW1lIDogJWQvJWRcbiIsCgkJCQkJCQkJ CQl2cC0+dGltZXBlcmZyYW1lLm51bWVyYXRvciwKCQkJCQkJCQkJCXZwLT50aW1lcGVyZnJh bWUuZGVub21pbmF0b3IpOwoKCQkJCWlmICh2cC0+Y2FwdHVyZW1vZGUgJiB+ZGV2LT5jYXB0 dXJlLmNhcGFiaWxpdHkpCgkJCQkJewoJCQkJCQlkYmcgKCJQQVJNIHVuc3VwcG9ydGVkIGNh cHR1cmUgY2FwYWJpbGl0eSAlMDhYXG4iLAoJCQkJCQkJCQl2cC0+Y2FwdHVyZW1vZGUpOwoJ CQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJCQl9CgkJCQkKCQkJCWlmICgoZGV2LT5jYXB0dXJl LmNhcGFiaWxpdHkgJiBWNEwyX0NBUF9USU1FUEVSRlJBTUUpCgkJCQkJCSYmICgxMDAwMDAw MDAqIHZwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yIC8gCgkJCQkJCQkJdnAtPnRpbWVwZXJm cmFtZS5kZW5vbWluYXRvcikgPAoJCQkJCQkxMDAwMCkKCQkJCQl7CgkJCQkJCWRiZyAoIlBB Uk0gdGltZSBwZXIgZnJhbWUgb3V0IG9mIHJhbmdlICVkXG4iLAoJCQkJCQkJCXZwLT50aW1l cGVyZnJhbWUubnVtZXJhdG9yIC8gdnAtPnRpbWVwZXJmcmFtZS5kZW5vbWluYXRvcik7CgkJ CQkJCXJldHVybiAtRUlOVkFMOwoJCQkJCX0KCQkJCWlmICh2cC0+Y2FwdHVyZW1vZGUgIT0g ZGV2LT5jYXB0dXJlLmNhcHR1cmVtb2RlICYmCgkJCQkJCSFvLT5ub25jYXB0dXJpbmcgJiYg ZGV2LT5zdHJlYW1pbmcpCgkJCQkJewoJCQkJCQlkYmcgKCJTX1BBUk0gc3RhdGUgZXJyb3Jc biIpOwoJCQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJCQl9CgoJCQkJaWYgKG8tPm5vbmNhcHR1 cmluZykKCQkJCQlyZXR1cm4gMDsKCQkJCWlmIChkZXYtPmNhcHR1cmUuY2FwYWJpbGl0eSAm IFY0TDJfQ0FQX1RJTUVQRVJGUkFNRSkKCQkJCQl7CgkJCQkJCWRldi0+Y2FwdHVyZS5jYXB0 dXJlbW9kZSA9IHZwLT5jYXB0dXJlbW9kZTsKCQkKCQkJCQkJaWYgKHZwLT5jYXB0dXJlbW9k ZSAmIFY0TDJfTU9ERV9ISUdIUVVBTElUWSkKCQkJCQkJCXsKCQkJCQkJCQl2cC0+dGltZXBl cmZyYW1lLm51bWVyYXRvcj0xOwoJCQkJCQkJCXZwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0 b3I9MTU7CgkJCQkJCQl9CgkJCgkJCQkJCWNhcHR1cmVfYWJvcnQgKGRldik7CgkJCQkJCWRi ZyAoICJzZXR0aW5nIHRpbWVwZXJmcmFtZSA6ICVkLyVkXG4iLAoJCQkJCQkJCXZwLT50aW1l cGVyZnJhbWUubnVtZXJhdG9yLAoJCQkJCQkJCXZwLT50aW1lcGVyZnJhbWUuZGVub21pbmF0 b3IpOwoJCQkJCQkvL21ha2Ugc29tZSBzYW5pdHkgY2hlY2tzCgkJCQkJCWlmICggZGV2LT5j YXB0dXJlLnRpbWVwZXJmcmFtZS5udW1lcmF0b3IgPT0gMCApCgkJCQkJCQlkZXYtPmNhcHR1 cmUudGltZXBlcmZyYW1lLm51bWVyYXRvcj0xOwoJCQkJCQlpZiAoIGRldi0+Y2FwdHVyZS50 aW1lcGVyZnJhbWUuZGVub21pbmF0b3IgPT0gMCApCgkJCQkJCQlkZXYtPmNhcHR1cmUudGlt ZXBlcmZyYW1lLmRlbm9taW5hdG9yPTMwOwoJCQkJCQlpZiAoIGRldi0+dmlkZWMuZnJhbWVf ZnJhY3QubnVtZXJhdG9yID09IDAgKQoJCQkJCQkJZGV2LT52aWRlYy5mcmFtZV9mcmFjdC5u dW1lcmF0b3I9MTsKCQkJCQkJaWYgKCBkZXYtPnZpZGVjLmZyYW1lX2ZyYWN0LmRlbm9taW5h dG9yID09IDAgKQoJCQkJCQkJZGV2LT52aWRlYy5mcmFtZV9mcmFjdC5kZW5vbWluYXRvcj0z MDsKCQkJCQkJaWYgKCB2cC0+dGltZXBlcmZyYW1lLm51bWVyYXRvciA9PSAwICkKCQkJCQkJ CXZwLT50aW1lcGVyZnJhbWUubnVtZXJhdG9yPTE7CgkJCQkJCWlmICggdnAtPnRpbWVwZXJm cmFtZS5kZW5vbWluYXRvciA9PSAwICkKCQkJCQkJCXZwLT50aW1lcGVyZnJhbWUuZGVub21p bmF0b3I9MzA7CgkJCQkJCQoJCQkJCQllcnJubz1kZXYtPnZpZGVjLnNldF9mcmFtZV9wZXJp b2QgKGRldiwgdnAtPnRpbWVwZXJmcmFtZSk7CgkJCQkJCWlmIChlcnJubyAhPSAwICYmIGVy cm5vICE9IC1FTk9FWEVDICkKCQkJCQkJCXsKCQkJCQkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJ CQkJCX0KCQkJCQkJCgkJCQkJCWlmICh2cC0+dGltZXBlcmZyYW1lLmRlbm9taW5hdG9yL3Zw LT50aW1lcGVyZnJhbWUubnVtZXJhdG9yCgkJCQkJCQkJPCBkZXYtPnZpZGVjLmZyYW1lX2Zy YWN0LmRlbm9taW5hdG9yL2Rldi0+dmlkZWMuZnJhbWVfZnJhY3QubnVtZXJhdG9yKQoJCQkJ CQkJewoJCQkJCQkJCWRldi0+Y2FwdHVyZS50aW1lcGVyZnJhbWU9dnAtPnRpbWVwZXJmcmFt ZTsKCQkJCQkJCQlkYmcgKCJzZXR0aW5nIGZwIGF0ICVkLyVkXG4iLGRldi0+Y2FwdHVyZS50 aW1lcGVyZnJhbWUubnVtZXJhdG9yLAoJCQkJCQkJCQkJCWRldi0+Y2FwdHVyZS50aW1lcGVy ZnJhbWUuZGVub21pbmF0b3IpOwoJCQkJCQkJfQoJCQkJCQllbHNlCgkJCQkJCQl7CgkJCQkJ CQkJZGV2LT5jYXB0dXJlLnRpbWVwZXJmcmFtZT1kZXYtPnZpZGVjLmZyYW1lX2ZyYWN0OwoJ CQkJCQkJfQoJCQkJCQkKCQkJCQkJaWYgKGRldi0+c3RyZWFtaW5nKQoJCQkJCQkJY2FwdHVy ZV9zdHJlYW1fc3RhcnQgKGRldik7CgkJCQkJCWVsc2UgaWYgKGRldi0+cHJldmlldykKCQkJ CQkJCWNhcHR1cmVfZ3JhYl9mcmFtZSAoZGV2KTsKCgkJCQkJfQoJCQkJcmV0dXJuIDA7CiAg ICAgIH0KICAgIGNhc2UgVklESU9DX0dfU1REOgogICAgICB7CgkJCQl2NGwyX3N0ZF9pZCBz dGQ7CgkJCQlpZiAoZGV2LT52aWRlYy5zdGFuZGFyZCA9PSBWNEwyX1NURF9QQUwpCgkJCQkJ c3RkID0gVjRMMl9TVERfUEFMOwoJCQkJZWxzZQoJCQkJCXN0ZCA9IFY0TDJfU1REX05UU0M7 CgkJCQlpZiAoY29weV90b191c2VyKGFyZywmc3RkLHNpemVvZih2NGwyX3N0ZF9pZCkpKQoJ CQkJCXJldHVybiAtRUZBVUxUOwoJCQkJcmV0dXJuIDA7CiAgICAgIH0KICAgIGNhc2UgVklE SU9DX1NfU1REOgogICAgICB7CgkJCQl2NGwyX3N0ZF9pZCBpZDsKCgkJCQlpZiAoY29weV9m cm9tX3VzZXIoJmlkLGFyZywgc2l6ZW9mKHY0bDJfc3RkX2lkKSkpCgkJCQkJcmV0dXJuIC1F RkFVTFQ7CgoJCQkJaWYgKChvLT5ub25jYXB0dXJpbmcgJiYgZGV2LT5jYXB0dXJpbmdfb3Bl bnMpKQoJCQkJCXJldHVybiAtRVBFUk07CgoJCQkJaWYgKCEoaWQgJiBkZXYtPnZpZGVjLnN0 YW5kYXJkcykpCgkJCQkJewoJCQkJCQlkYmcgKCJCYWQgc3RhbmRhcmQ6ICV1XG4iLCAodW5z aWduZWQpIGlkKTsKCQkJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCQkJfQoJCQkJaWYgKGRldi0+ c3RyZWFtX2J1ZmZlcnNfbWFwcGVkKQoJCQkJCXsKCQkJCQkJZGJnICgiU19GTVQgaWxsZWdh bCB3aGVuIGJ1ZmZlciBtYXBwZWRcbiIpOwoJCQkJCQlyZXR1cm4gLUVQRVJNOwoJCQkJCX0K CQkJCWNhcHR1cmVfYWJvcnQgKGRldik7CgkJCQlkZXYtPnZpZGVjLnNldF9zdGFuZGFyZCAo ZGV2LCBpZCk7CgkJCQlpZiAoY2FwdHVyZV9uZXdfZm9ybWF0IChkZXYpKQoJCQkJCXJldHVy biAtRUlOVkFMOwoJCQkJaWYgKGRldi0+c3RyZWFtaW5nKQoJCQkJCWNhcHR1cmVfc3RyZWFt X3N0YXJ0IChkZXYpOwoJCQkJZWxzZSBpZiAoZGV2LT5wcmV2aWV3KQoJCQkJCWNhcHR1cmVf Z3JhYl9mcmFtZSAoZGV2KTsKCQkJCXJldHVybiAwOwogICAgICB9CiAgICBjYXNlIFZJRElP Q19FTlVNU1REOgogICAgICB7CgkJCQljb25zdCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCBudHNj ID0gTlRTQzsJLy9zZWUgdjRsMi5jCgkJCQljb25zdCBzdHJ1Y3QgdjRsMl9zdGFuZGFyZCBw YWwgPSBQQUw7CS8vc2VlIHY0bDIuaAoJCQkJc3RydWN0IHY0bDJfc3RhbmRhcmQgc3RkOwoK CQkJCWlmIChjb3B5X2Zyb21fdXNlcigmc3RkLGFyZywgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0 YW5kYXJkKSkpCgkJCQkJcmV0dXJuIC1FRkFVTFQ7CgoJCQkJaWYgKHN0ZC5pbmRleCA9PSAw KQoJCQkJCXN0ZCA9IG50c2M7CgkJCQllbHNlIGlmIChzdGQuaW5kZXggPT0gMSkKCQkJCQlz dGQgPSBwYWw7CgkJCQllbHNlCgkJCQkJcmV0dXJuIC1FSU5WQUw7CgoJCQkJaWYgKGNvcHlf dG9fdXNlcihhcmcsJnN0ZCwgc2l6ZW9mKHN0cnVjdCB2NGwyX3N0YW5kYXJkKSkpCgkJCQkJ cmV0dXJuIC1FRkFVTFQ7CgkJCQlyZXR1cm4gMDsKICAgICAgfQogICAgY2FzZSBWSURJT0Nf RU5VTUlOUFVUOgogICAgICB7CgkJCQlzdHJ1Y3QgdjRsMl9pbnB1dCB2aTsKCgkJCQlpZiAo Y29weV9mcm9tX3VzZXIgKCZ2aSwgYXJnLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKSkK CQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCWlmICh2aS5pbmRleCA8IDAgfHwgdmkuaW5kZXgg Pj0gZGV2LT52aWRlYy5udW1faW5wdXRzKQoJCQkJCXJldHVybiAtRUlOVkFMOwoJCQkJdmkg PSBkZXYtPnNvdXJjZVt2aS5pbmRleF0uaW5wdXQ7CgkJCQlpZiAoY29weV90b191c2VyKGFy ZywgJnZpLCBzaXplb2Yoc3RydWN0IHY0bDJfaW5wdXQpKSkKCQkJCQlyZXR1cm4gLUVGQVVM VDsKCQkJCXJldHVybiAwOwogICAgICB9CiAgICBjYXNlIFZJRElPQ19RVUVSWUNUUkw6CiAg ICAgIHsKCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5Y3RybCBxYzsKCQkJCWludCBlcnI7CgoJCQkJ aWYgKGNvcHlfZnJvbV91c2VyKCZxYywgYXJnLCBzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnlj dHJsKSApKQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKGRldi0+Y2FtZXJhKQoJCQkJ CXsKCQkJCQkJZXJyPWRldi0+Y2FtZXJhLT5xdWVyeV9jb250cm9sICgmcWMpOwoJCQkJCQlp ZiAoZXJyKSByZXR1cm4gZXJyOwoJCQkJCQlpZiAoY29weV90b191c2VyKGFyZywgJnFjLCBz aXplb2Yoc3RydWN0IHY0bDJfcXVlcnljdHJsKSApKQoJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7 CgkJCQkJCXJldHVybiAwOwoJCQkJCX0KCQkJCXJldHVybiAtRU5PREVWOwogICAgICB9CiAg ICBjYXNlIFZJRElPQ19RVUVSWU1FTlU6CiAgICAgIHsKCQkJCXN0cnVjdCB2NGwyX3F1ZXJ5 bWVudSBxbTsKCQkJCWludCBlcnI7CgoJCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZxbSAsIGFy Zywgc2l6ZW9mKHN0cnVjdCB2NGwyX3F1ZXJ5bWVudSkgKSkKCQkJCQlyZXR1cm4gLUVGQVVM VDsKCQkJCWlmIChkZXYtPmNhbWVyYSkKCQkJCQl7CgkJCQkJCWVycj1kZXYtPmNhbWVyYS0+ cXVlcnlfbWVudSAoJnFtICk7CgkJCQkJCWlmIChlcnIpIHJldHVybiBlcnI7CgkJCQkJCWlm IChjb3B5X3RvX3VzZXIoYXJnLCAmcW0gLCBzaXplb2Yoc3RydWN0IHY0bDJfcXVlcnltZW51 KSApKQoJCQkJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCQkJCXJldHVybiAwOwoJCQkJCX0KCQkJ CXJldHVybiAtRU5PREVWOwogICAgICB9CiAgICBjYXNlIFZJRElPQ19HX0NUUkw6CiAgICAg IHsKCQkJCXN0cnVjdCB2NGwyX2NvbnRyb2wgdmM7CgkJCQlpbnQgZXJyOwoKCQkJCWlmIChj b3B5X2Zyb21fdXNlcigmdmMgLCBhcmcsIHNpemVvZihzdHJ1Y3QgdjRsMl9jb250cm9sKSAp KQoJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJaWYgKGRldi0+Y2FtZXJhKQoJCQkJCXsKCQkJ CQkJZXJyPWRldi0+Y2FtZXJhLT5nZXRfY29udHJvbCAoJnZjICk7CgkJCQkJCWlmIChlcnIp IHJldHVybiBlcnI7CgkJCQkJCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdmMgLCBzaXplb2Yo c3RydWN0IHY0bDJfY29udHJvbCkgKSkKCQkJCQkJCXJldHVybiAtRUZBVUxUOwoJCQkJCQly ZXR1cm4gMDsKCQkJCQl9CgkJCQlyZXR1cm4gLUVOT0RFVjsKICAgICAgfQogICAgY2FzZSBW SURJT0NfU19DVFJMOgogICAgICB7CgkJCQlzdHJ1Y3QgdjRsMl9jb250cm9sIHZjOwoJCQkJ aW50IGVycjsKCgkJCQlpZiAoY29weV9mcm9tX3VzZXIoJnZjICwgYXJnLCBzaXplb2Yoc3Ry dWN0IHY0bDJfY29udHJvbCkgKSkKCQkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJCWlmIChkZXYt PmNhbWVyYSkKCQkJCQl7CgkJCQkJCWVycj1kZXYtPmNhbWVyYS0+c2V0X2NvbnRyb2wgKCZ2 YyApOwoJCQkJCQlpZiAoZXJyKSByZXR1cm4gZXJyOwoJCQkJCQlpZiAoY29weV90b191c2Vy KGFyZywgJnZjICwgc2l6ZW9mKHN0cnVjdCB2NGwyX2NvbnRyb2wpICkpXAoJCQkJCQkJcmV0 dXJuIC1FRkFVTFQ7CgkJCQkJCXJldHVybiAwOwoJCQkJCX0KCQkJCXJldHVybiAtRU5PREVW OwoKICAgICAgfQogICAgY2FzZSBWSURJT0NfR19UVU5FUjoKICAgICAgcmV0dXJuIC1FSU5W QUw7CiAgICBjYXNlIFZJRElPQ19TX1RVTkVSOgogICAgICByZXR1cm4gLUVJTlZBTDsKCiAg ICBkZWZhdWx0OgogICAgICByZXR1cm4gLUVJTlZBTDsKICAgIH0KICByZXR1cm4gMDsKfQoK U1RBVElDIGludAp2NGwyX21tYXAgKHN0cnVjdCBmaWxlICpmaWxwLCBzdHJ1Y3Qgdm1fYXJl YV9zdHJ1Y3QgKnZtYSkKewogIHN0cnVjdCBkZXZpY2Vfb3BlbiAqbyA9IChzdHJ1Y3QgZGV2 aWNlX29wZW4gKikgZmlscC0+cHJpdmF0ZV9kYXRhOwoKICBzdHJ1Y3QgY2FwdHVyZV9kZXZp Y2UgKmRldiA9IG8tPmRldjsKICBzdHJ1Y3Qgc3RyZWFtX2J1ZmZlciAqYnVmOwoJRU5UUlko KTsKCgkjaWYgMQkJCQkvKiBNVkwtQ0VFICovCgkJd2FpdF9ldmVudCAoZGV2LT5zdXNwZW5k X3dxLCBkZXYtPnN1c3BlbmRlZCA9PSAwKTsKCSNlbmRpZiAvKiBNVkwtQ0VFICovCgogIGlm IChvLT5ub25jYXB0dXJpbmcpCiAgICB7CiAgICAgIGRiZygibW1hcCgpIGNhbGxlZCBvbiBu b24tY2FwdHVyaW5nIG9wZW5cbiIpOwogICAgICByZXR1cm4gLUVOT0RFVjsKICAgIH0KICBi dWYgPSBtbWFwX3N0cmVhbV9idWZmZXJfZnJvbV9vZmZzZXQgKGRldiwgdm1hLT52bV9wZ29m Zik7CS8vZ2V0IGN1cnJlbnQgYnVmZmVyCiAgaWYgKGJ1ZiA9PSBOVUxMKQogICAgewogICAg ICBkYmcgKCJtbWFwKCkgSW52YWxpZCBvZmZzZXQgcGFyYW1ldGVyXG4iKTsKICAgICAgcmV0 dXJuIC1FSU5WQUw7CQkvKiBubyBzdWNoIGJ1ZmZlciAqLwogICAgfQoKICBpZiAoIWJ1Zi0+ cmVxdWVzdGVkKQogICAgewogICAgICBkYmcgKCJtbWFwKCkgQnVmZmVyIGlzIG5vdCBhdmFp bGFibGUgZm9yIiAiIG1hcHBpbmdcbiIpOwogICAgICByZXR1cm4gLUVJTlZBTDsJCS8qIG5v dCByZXF1ZXN0ZWQgKi8KICAgIH0KICBpZiAoYnVmLT52aWRidWYuZmxhZ3MgJiBWNEwyX0JV Rl9GTEFHX01BUFBFRCkKICAgIHsKICAgICAgZGJnKCJtbWFwKCkgQnVmZmVyIGlzIGFscmVh ZHkgbWFwcGVkXG4iKTsKICAgICAgcmV0dXJuIC1FSU5WQUw7CQkvKiBhbHJlYWR5IG1hcHBl ZCAqLwogICAgfQoKICBpZiAoQWxsb2NhdGVCdWZmZXIgKGJ1ZikpCgkJewoJCQlyZXR1cm4g LUVOT01FTTsKCQl9CgogIGlmIChidWYtPmRtYV9saXN0ID09IE5VTEwpCiAgICB7CiAgICAg IGVyciAoIkNvdWxkIG5vdCBhbGxvY2F0ZSBtbWFwKCkgYnVmZmVyXG4iKTsKICAgICAgcmV0 dXJuIC1FTk9ERVY7CiAgICB9CgogIGJ1Zi0+dmlkYnVmLmZsYWdzIHw9IFY0TDJfQlVGX0ZM QUdfTUFQUEVEOwogICsrZGV2LT5zdHJlYW1fYnVmZmVyc19tYXBwZWQ7CgogIHZtYS0+dm1f b3BzID0gJmNhcHR1cmVfdm1hX29wZXJhdGlvbnM7Cgl2bWEtPnZtX2ZsYWdzIHw9IFZNX0xP Q0tFRDsKICB2bWEtPnZtX2ZpbGUgPSBmaWxwOwogIGlmICh2bWEtPnZtX29wcy0+b3BlbikK ICAgIHZtYS0+dm1fb3BzLT5vcGVuICh2bWEpOwoKCUVYSVQoKTsKICByZXR1cm4gMDsKfQoK U1RBVElDIHVuc2lnbmVkIGludAp2NGwyX3BvbGwgKHN0cnVjdCBmaWxlICpmaWxlLCBzdHJ1 Y3QgcG9sbF90YWJsZV9zdHJ1Y3QgKnRhYmxlKQp7CiAgc3RydWN0IGRldmljZV9vcGVuICpv ID0gKHN0cnVjdCBkZXZpY2Vfb3BlbiAqKSBmaWxlLT5wcml2YXRlX2RhdGE7CiAgc3RydWN0 IGNhcHR1cmVfZGV2aWNlICpkZXYgPSBvLT5kZXY7CglFTlRSWSgpOwoJI2lmIDEJCQkJLyog TVZMLUNFRSAqLwoJCXdhaXRfZXZlbnQgKGRldi0+c3VzcGVuZF93cSwgZGV2LT5zdXNwZW5k ZWQgPT0gMCk7CgkjZW5kaWYgLyogTVZMLUNFRSAqLwoKICBpZiAoby0+bm9uY2FwdHVyaW5n KQogICAgewogICAgICBkYmcoInBvbGwoKSBpbGxlZ2FsIGluIG5vbi1jYXB0dXJpbmcgb3Bl blxuIik7CiAgICAgIHJldHVybiBQT0xMRVJSOwogICAgfQoKICBpZiAoZGV2LT5zdHJlYW1p bmcpCiAgICB7CiAgICAgIHZvaWQgKm5vZGU7CiAgICAgIG5vZGUgPSB2NGwyX3FfcGVla19o ZWFkICgmZGV2LT5zdHJlYW1fcV9kb25lKTsKICAgICAgaWYgKG5vZGUgIT0gTlVMTCkKCQkJ CXJldHVybiAoUE9MTElOIHwgUE9MTFJETk9STSk7CS8qIGRhdGEgaXMgcmVhZHkgbm93ICov CiAgICAgIG5vZGUgPSB2NGwyX3FfcGVla19oZWFkICgmZGV2LT5zdHJlYW1fcV9jYXB0dXJl KTsKICAgICAgaWYgKG5vZGUgPT0gTlVMTCkKCQkJCXsKCQkJCQlyZXR1cm4gUE9MTEVSUjsJ Lyogbm8gZnJhbWVzIHF1ZXVlZCAqLwoJCQkJfQogICAgICBwb2xsX3dhaXQgKGZpbGUsICZk ZXYtPm5ld192aWRlb19mcmFtZSwgdGFibGUpOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAg LyogIENhcHR1cmUgaXMgdGhyb3VnaCByZWFkKCkgY2FsbCAqLwogIGlmIChkZXYtPmNhcHR1 cmVfY29tcGxldGVkKQkvKiBkYXRhIGlzIHJlYWR5IG5vdyAqLwogICAgcmV0dXJuIChQT0xM SU4gfCBQT0xMUkROT1JNKTsKCiAgY2FwdHVyZV9ncmFiX2ZyYW1lIChkZXYpOwkvKiBkb2Vz IG5vdGhpbmcgaWYgY2FwdHVyZSBpcyBpbiBwcm9ncmVzcyAqLwogIGlmICghZGV2LT5yZWFk eV90b19jYXB0dXJlKQogICAgewogICAgICBkYmcgKCJDYW4ndCBncmFiIGZyYW1lcyFcbiIp OwogICAgICByZXR1cm4gUE9MTEVSUjsKICAgIH0KCglkYmcoImF2YW50IHBvbGxcbiIpOwog IHBvbGxfd2FpdCAoZmlsZSwgJmRldi0+bmV3X3ZpZGVvX2ZyYW1lLCB0YWJsZSk7CglkYmco ImFwcmVzIHBvbGwgXG4iKTsKICByZXR1cm4gMDsKfQoKU1RBVElDIHNzaXplX3QKdjRsMl9y ZWFkIChzdHJ1Y3QgZmlsZSAqIGZpbGUsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2Zm X3QgKiBmX3BvcykKewogIGRiZyAoInJlYWQgY2FsbGVkXG4iKTsKICBzdHJ1Y3QgZGV2aWNl X29wZW4gKm8gPSAoc3RydWN0IGRldmljZV9vcGVuICopIGZpbGUtPnByaXZhdGVfZGF0YTsK ICBzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldiA9IG8tPmRldjsKICBsb25nIGxlbiA9IDA7 CiAgbG9uZyBteV90aW1lb3V0OwoKCSNpZiAxCQkJCS8qIE1WTC1DRUUgKi8KCQl3YWl0X2V2 ZW50IChkZXYtPnN1c3BlbmRfd3EsIGRldi0+c3VzcGVuZGVkID09IDApOwoJI2VuZGlmIC8q IE1WTC1DRUUgKi8KCiAgaWYgKG8tPm5vbmNhcHR1cmluZykKICAgIHsKICAgICAgZGJnICgi cmVhZCgpIGlsbGVnYWwgaW4gbm9uLWNhcHR1cmluZyBvcGVuXG4iKTsKICAgICAgcmV0dXJu IC1FUEVSTTsKICAgIH0KICBpZiAoZGV2LT5zdHJlYW1pbmcpCiAgICB7CiAgICAgIGRiZyAo IkNhbid0IHJlYWQoKSB3aGVuIHN0cmVhbWluZyBpcyBvblxuIik7CiAgICAgIHJldHVybiAt RVBFUk07CiAgICB9CgogIGNhcHR1cmVfZ3JhYl9mcmFtZSAoZGV2KTsJLyogZG9lcyBub3Ro aW5nIGlmIGNhcHR1cmUgaXMgaW4gcHJvZ3Jlc3MgKi8KCiAgaWYgKCFkZXYtPnJlYWR5X3Rv X2NhcHR1cmUpCiAgICB7CiAgICAgIGRiZyAoIkNhbid0IGdyYWIgZnJhbWVzIVxuIik7CiAg ICAgIHJldHVybiAwOwogICAgfQoKICBteV90aW1lb3V0ID0gSFogLyA1OwogIGRiZygiYmVm b3JlIHdoaWxlIGxlbiA6ICVsZFxuIixsZW4pOwogIHdoaWxlIChsZW4gPT0gMCkKICAgIHsK ICAgICAgaWYgKCFkZXYtPmNhcHR1cmVfY29tcGxldGVkKQoJCQkJewoJCQkJCWRiZygicmVh ZDpzbGVlcCBmb3IgZGF0YVxuIik7CgkJCQkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJM T0NLKQoJCQkJCQl7CgkJCQkJCQlkYmcoIkVBR0FJTlxuIik7CgkJCQkJCQlyZXR1cm4gLUVB R0FJTjsKCQkJCQkJfQoJCQkJCW15X3RpbWVvdXQgPQoJCQkJCQlpbnRlcnJ1cHRpYmxlX3Ns ZWVwX29uX3RpbWVvdXQgKCZkZXYtPgoJCQkJCQkJCQkJbmV3X3ZpZGVvX2ZyYW1lLCBteV90 aW1lb3V0KTsKCgkJCQl9CgogICAgICBpZiAobXlfdGltZW91dCA9PSAwKQoJCQkJewoJCQkJ CWRiZygiVGltZW91dCBvbiByZWFkXG4iKTsKCQkJCQlicmVhazsKCQkJCX0KICAgICAgbGVu ID0gY2FwdHVyZV9yZWFkIChkZXYsIGJ1ZiwgY291bnQpOwogICAgfQoKICByZXR1cm4gbGVu Owp9CgoKLyoKICogICAgICBSZW1haW5pbmcgaW5pdGlhbGl6YXRpb24gb2YgdmlkZW8gZGVj b2RlciBldGMuIFRoaXMgaXMgb25seQogKiAgICAgIGRvbmUgd2hlbiB0aGUgZGV2aWNlIGlz IHN1Y2Nlc3NmdWxseSBpZGVudGlmaWVkIGFuZCByZWdpc3RlcmVkLgogKi8KU1RBVElDIGlu dAp2NGwyX2luaXRfZG9uZSAoc3RydWN0IHZpZGVvX2RldmljZSAqdikKewogIHN0cnVjdCBj YXB0dXJlX2RldmljZSAqZGV2ID0gKHN0cnVjdCBjYXB0dXJlX2RldmljZSAqKSB2OwogIGlu dCBpOwoKICBpbmZvICgidjRsMl9pbml0X2RvbmVcbiIpOwoJI2lmIDEJCQkJLyogTVZMLUNF RSAqLwoJCXdhaXRfZXZlbnQgKGRldi0+c3VzcGVuZF93cSwgZGV2LT5zdXNwZW5kZWQgPT0g MCk7CgkjZW5kaWYgLyogTVZMLUNFRSAqLwoKICAvKiAgSW5pdGlhbGl6ZSB2aWRlbyBpbnB1 dCBhcnJheSAgICAgICAgKi8KICBmb3IgKGkgPSAwOyBpIDwgVlNPVVJDRV9DT1VOVDsgKytp KQogICAgewogICAgICBkZXYtPnNvdXJjZVtpXS5pbnB1dC5pbmRleCA9IGk7CiAgICAgIGRl di0+c291cmNlW2ldLmlucHV0LnR5cGUgPSBWNEwyX0lOUFVUX1RZUEVfQ0FNRVJBOwogICAg fQogIHN0cmNweSAoZGV2LT5zb3VyY2VbVlNPVVJDRV9DQU1FUkFdLmlucHV0Lm5hbWUsICJD YW1lcmEiKTsKICBzdHJjcHkgKGRldi0+c291cmNlW1ZTT1VSQ0VfVEVTVF0uaW5wdXQubmFt ZSwgIkNvbG9yIEJhciBUZXN0Iik7CiAgLypzdHJjcHkoZGV2LT5zb3VyY2VbVlNPVVJDRV9U VU5FUl0uaW5wdXQubmFtZSwgIlR1bmVyIik7ICovCiAgLypkZXYtPnNvdXJjZVtWU09VUkNF X1RVTkVSXS5pbnB1dC50eXBlID0gVjRMMl9JTlBVVF9UWVBFX1RVTkVSOyAqLwoKICAvKiAg SW5pdGlhbGl6ZSB0aGUgdmlkZW8gZGVjb2RlciBoYXJkd2FyZSAgICAgICAqLwogIGRldi0+ dmlkZWMuaW5pdGlhbGl6ZSAoZGV2KTsKCiAgLyogIEJVRzogZ2V0IGRlZmF1bHRzIGZyb20g dXNlciBzb21laG93Li4uICAqLwogIHNldF92aWRlb19pbnB1dCAoZGV2LCBWU09VUkNFX0NB TUVSQSk7CgogIGNhcHR1cmVfbmV3X2Zvcm1hdCAoZGV2KTsKICByZXR1cm4gMDsKfQoKCi8q ICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT0KICogICAgICBUaGUgZnVuY3Rpb25zIGJlbG93IHRoaXMgcG9p bnQgYXJlIG9ubHkgY2FsbGVkIGR1cmluZyBsb2FkaW5nCiAqICAgICAgYW5kIHVubG9hZGlu ZyBvZiB0aGUgZHJpdmVyLgogKi8KCgovKgogKiAgICAgIEQgRSBWIEkgQyBFICAgSSBOIEkg QSBMIEkgWiBBIFQgSSBPIE4gICBSIE8gVSBUIEkgTiBFIFMKICoKICogICAgICBUaGVzZSBy b3V0aW5lcyBsb2NhdGUgYW5kIGVuYWJsZSB0aGUgaGFyZHdhcmUsIGFuZCBpbml0aWFsaXpl CiAqICAgICAgdGhlIGRldmljZSBzdHJ1Y3R1cmUuCiAqLwoKCi8vaW4gbmV3IHY0bDIgYXBp IGlmIGZvcHMgZmllbGQgaXMgcHJvdmlkZWQgdGhlbiBvbiBvcGVuIGNhbGwsIGludGVyZmFj ZSB3aWxsIHJlcGxhY2UgZmlsZS5mb3BzCi8vZG8gTk9UIHNldCBvd25lciBmaWVsZCA6IHRo aXMgd2lsbCBjYXVzZSB1c2FnZWNvdW50IG9mIHRoaXMgbW9kdWxlIHRvIGJlIGV4dGVybmFs eSBoYW5kbGVkLCB0aGluZwovL3RoYXQgd2UgZG9uJ3Qgd2FudApzdGF0aWMgc3RydWN0IGZp bGVfb3BlcmF0aW9ucyB2aWRlb19mb3BzID0gewoJbGxzZWVrCToJTlVMTCwKCXJlYWQJCToJ djRsMl9yZWFkLAoJd3JpdGUJCToJTlVMTCwJCQkvLyAgICAgICB2NGwyX3dyaXRlLAoJaW9j dGwJCToJdjRsMl9pb2N0bCwKCW1tYXAJCToJdjRsMl9tbWFwLAoJb3BlbgkJOgl2NGwyX29w ZW4sCglyZWxlYXNlCToJdjRsMl9jbG9zZSwKCXBvbGwJCToJdjRsMl9wb2xsLAoJfTsKCi8q IGluaXRpYWxpc2F0aW9uIHN0cnVjdHVyZXMsIHRoaXMgaXMgZWFzaWVyIHRvIHJlYWQgcmF0 aGVyIHRoYW4gaW5pdGlhbGl6ZSB0aGVtIGludG8gZnVuY3Rpb25zKi8Kc3RhdGljIHN0cnVj dCBjYXB0dXJlX2RldmljZSBjYXB0dXJlID0gewoJdjoKCQl7CgkJCW5hbWUJOgkiT01BUDE2 NDAgVjRMMiBDYXB0dXJlIERyaXZlciIsCgkJCXR5cGUJOglWRkxfVFlQRV9HUkFCQkVSLAoJ CQlmb3BzCToJJnZpZGVvX2ZvcHMsCgkJfSwKCXByZXZpZXcJCQkJCQkJCToJMCwKCXN0cmVh bV9idWZmZXJzX21hcHBlZAk6CTAsCglzaG9ydG5hbWUJCQkJCQkJOgkiY2FwdHVyZSIsCglj YW1pZgkJCQkJCQkJCToJJmNhbWlmX2lubm92YXRvciwKCWNhcHR1cmUJOgoJCXsKCQkJY2Fw YWJpbGl0eQkJOglWNEwyX0NBUF9USU1FUEVSRlJBTUUgfCBWNEwyX01PREVfSElHSFFVQUxJ VFkKCQkJCQkJCQkJCQl8VjRMMl9DQVBfU1RSRUFNSU5HLAoJCQljYXB0dXJlbW9kZQkJOgkw LAoJCQlleHRlbmRlZG1vZGUJOgkwLAoJCQl0aW1lcGVyZnJhbWUJOiAKCQkJCXsKCQkJCQlu dW1lcmF0b3IJCToxLAoJCQkJCWRlbm9taW5hdG9yCTozMCwKCQkJCX0KCQl9LAoJY2xpZW50 Zm10OgoJCXsKCQkJcGl4ZWxmb3JtYXQJCToJVjRMMl9QSVhfRk1UX1JHQjU2NSwKCQkJYnl0 ZXNwZXJsaW5lCToJMCwKCQkJc2l6ZWltYWdlCQkJOgkwLAoJCX0sCglkZXB0aAk6CTE2LAoJ dmlkZWM6CgkJewoJCQlzdGFuZGFyZHMJCQkJCToJVjRMMl9TVERfTlRTQyB8IFY0TDJfU1RE X1BBTCwKCQkJbnRzY19oc2tpcAkJCQk6CTMwLAoJCQludHNjX3Zza2lwCQkJCToJMTIsCgkJ CW50c2Nfd2lkdGgJCQkJOgk2NDAsCgkJCW50c2NfaGVpZ2h0CQkJCToJNDgwLAoJCQludHNj X2ZpZWxkX29yZGVyCToJMCwKCQkJcGFsX2hza2lwCQkJCQk6CTYyLAoJCQlwYWxfdnNraXAJ CQkJCToJMTQsCgkJCXBhbF93aWR0aAkJCQkJOgk2NDAsCgkJCXBhbF9oZWlnaHQJCQkJOgk0 ODAsCgkJCXBhbF9maWVsZF9vcmRlcgkJOgkwLAoJCQlwcmVmZXJyZWRfZmllbGQJCToJMCwK CQkJbnVtX2lucHV0cwkJCQk6CTIsCgkJCWRlY29kZXJfaXNfc3RhYmxlCToJMSwKCQkJZnJh bWVfZnJhY3QJCQkJOiAKCQkJCXsKCQkJCQludW1lcmF0b3IJCQk6MSwKCQkJCQlkZW5vbWlu YXRvcgkJOjMwLAoJCQkJfSwKCQkJIC8vZGVjb2RlciBtZXRob2RzCgkJCWluaXRpYWxpemUJ CQkJOglkZWNvZGVyX2luaXQsCgkJCXNldF9pbnB1dAkJCQkJOglkZWNvZGVyX3NldF9pbnB1 dCwKCQkJc2V0X3N0YW5kYXJkCQkJOglkZWNvZGVyX3NldF9zdGFuZGFyZCwKCQkJc2V0X3Zj cm1vZGUJCQkJOglkZWNvZGVyX3NldF92Y3Jtb2RlLAoJCQlpc19zdGFibGUJCQkJCToJZGVj b2Rlcl9pc19zdGFibGUsCgkJCXNldF9mcmFtZV9wZXJpb2QJOglkZWNvZGVyX3NldF9mcmFt ZV9wZXJpb2QsCgkJfSwKCXNvdXJjZToKCQl7CgkJCXsKCQkJCWlucHV0OgoJCQkJCXsKCQkJ CQkJbmFtZQkJOgkiQ2FtZXJhIiwKCQkJCQkJaW5kZXgJCToJMSwKCQkJCQkJdHlwZQkJOglW NEwyX0lOUFVUX1RZUEVfQ0FNRVJBLAoJCQkJCX0KCQkJfSwKCQkJewoJCQkJaW5wdXQ6CgkJ CQkJewoJCQkJCQluYW1lCQk6CSJDb2xvciBCYXIgVGVzdCIsCgkJCQkJCWluZGV4CQk6CTIs CgkJCQkJCXR5cGUJCToJVjRMMl9JTlBVVF9UWVBFX0NBTUVSQSwKCQkJCQl9CgkJCX0sCgkJ fSwKCX07CgoKClNUQVRJQyBpbnQKY29uZmlnX2FfZGV2aWNlIChzdHJ1Y3QgY2FwdHVyZV9k ZXZpY2UgKmRldikKewogIHNwcmludGYgKGRldi0+c2hvcnRuYW1lLCAiY2FwdHVyZSIpOwoK ICBkYmcgKCJhdmFudCBmaW5kX2RlY29kZXJcbiIpOwogIGlmICghZmluZF9kZWNvZGVyIChk ZXYpKQogICAgewogICAgICBlcnIgKCJCYWQgb3IgdW5yZWNvZ25pemVkIHZpZGVvIGRlY29k ZXJcbiIpOwogICAgICByZXR1cm4gLUVOT0RFVjsKICAgIH0KICBkYmcgKCJhdmFudCBwb3dl ciBtYW5hZ2VtZW50XG4iKTsKCSN3YXJuaW5nIGZpeCB0aGlzIHdlIGdvdCBhIHNlZ2ZhdWx0 IG9mIHRoZSBwb3dlciBtYW5hZ2VtZW50IHRocmVhZAoJI2lmIDEJCQkJLyogTVZMLUNFRSAq LwoJCS8qZGV2LT5yZXN1bWVfdGhyZWFkX2V4aXQgPSAwOwoJCQkgZGV2LT5yZXN1bWVfdGhy ZWFkX3BpZCA9CgkJCSBrZXJuZWxfdGhyZWFkKCZyZXN1bWVfdGhyZWFkLCBkZXYsCgkJCSBD TE9ORV9GUyB8IENMT05FX0ZJTEVTIHwgQ0xPTkVfU0lHSEFORCk7CgkJCSBpZiAoZGV2LT5y ZXN1bWVfdGhyZWFkX3BpZCA8IDApIHsKCQkJIGVycigiY291bGQgbm90IHN0YXJ0IHJlc3Vt ZSB0aHJlYWRcbiIpOwoJCQkgcmV0dXJuIC1FTk9ERVY7CgkJCSB9CgkJCSBpbmZvKCJhdmFu dCBvbWFwX2NhbWVyYV9sZG1fcmVnaXN0ZXJcbiIpOwoJCQkgb21hcF9jYW1lcmFfbGRtX3Jl Z2lzdGVyKGRldik7ICovCgkjZW5kaWYKCiAgcmV0dXJuIDA7Cn0KClNUQVRJQyB2b2lkCnVu Y29uZmlnX2FfZGV2aWNlIChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKmRldikKewogIGNhcHR1 cmVfY2xvc2UgKGRldik7CgogIGRldi0+Y2FtaWYtPmNsZWFudXAgKCk7CgoKCSNpZiAxCQkJ CS8qIE1WTC1DRUUgKi8KCQlpZiAoZGV2LT5yZXN1bWVfdGhyZWFkX3BpZCA+PSAwKQoJCQl7 CgkJCQlkZXYtPnJlc3VtZV90aHJlYWRfZXhpdCA9IDE7CgkJCQl3YWtlX3VwICgmZGV2LT5y ZXN1bWVfd3EpOwoJCQkJd2FpdF9mb3JfY29tcGxldGlvbiAoJmRldi0+cmVzdW1lX3RocmVh ZF9zeW5jKTsKCQkJfQoKCQlvbWFwX2NhbWVyYV9sZG1fdW5yZWdpc3RlciAoZGV2KTsKCSNl bmRpZgoKICBtZW1zZXQgKGRldiwgMCwgc2l6ZW9mIChjYXB0dXJlKSk7Cn0KCgoKU1RBVElD IHZvaWQKdXBkYXRlX2ZiaW5mb190YXNrICh2b2lkICpkZXYpCnsKICBzdHJ1Y3QgY2FwdHVy ZV9kZXZpY2UgKmRldmljZSA9IChzdHJ1Y3QgY2FwdHVyZV9kZXZpY2UgKikgZGV2OwoKICBp ZiAoZGV2aWNlKQogICAgewogICAgICBnZXRfZnJhbWVidWZmZXJfaW5mbyAoZGV2aWNlKTsK ICAgICAgd2FrZV91cCAoJmRldmljZS0+ZmJpbmZvX3dhaXQpOwogICAgfQp9CgoKCgovKgog KiAgICAgIE0gTyBEIFUgTCBFICAgSSBOIEkgVCAgIEEgTiBEICAgQyBMIEUgQSBOIFUgUAog Ki8KU1RBVElDIHZvaWQgX19leGl0Cm9tYXBfdjRsMl9jbGVhbnVwICh2b2lkKQp7CiAgaW5m byAoInJtbW9kIik7CiAgY2FwdHVyZV9jbG9zZSAoJmNhcHR1cmUpOwogIGNhcHR1cmUuY2Ft aWYtPmNsZWFudXAgKCk7CiAgaWYgKGNhcHR1cmUuaXNfcmVnaXN0ZXJlZCkKICAgIHsKICAg ICAgdmlkZW9fdW5yZWdpc3Rlcl9kZXZpY2UgKChzdHJ1Y3QgdmlkZW9fZGV2aWNlICopICZj YXB0dXJlKTsKICAgICAgZGJnKCJSZW1vdmVkIGRldmljZSAlc1xuIiwgZGV2LT5zaG9ydG5h bWUpOwogICAgfQogIG1lbXNldCAoJmNhcHR1cmUsIDAsIHNpemVvZiAoY2FwdHVyZSkpOwp9 CgoKU1RBVElDIGludCBfX2luaXQKb21hcF92NGwyX2luaXQgKHZvaWQpCnsKICBpbnQgcmV0 Y29kZTsKCWluZm8gKCJjYW1lcmEgZHJpdmVyIHJldmlzaW9uIDAuMC4xLjYgKGFscGhhKSBc biIpOwogIC8vIGluaXRpYWxpemUgdGhlIGNhbWVyYSBpbnRlcmZhY2UKICBpZiAoKHJldGNv ZGUgPSBjYXB0dXJlLmNhbWlmLT5pbml0IChjYW1pZl9jYXB0dXJlX2NhbGxiYWNrLCAmY2Fw dHVyZSkpKQogICAgewogICAgICBlcnIgKCJDYW1lcmEgSW50ZXJmYWNlIGluaXQgZmFpbGVk XG4iKTsKICAgICAgcmV0dXJuIHJldGNvZGU7CiAgICB9CgogIGNhcHR1cmUuY2FtZXJhID0g Y2FwdHVyZS5jYW1pZi0+Y2FtZXJhX2RldGVjdCAoKTsKCiAgaWYgKCFjYXB0dXJlLmNhbWVy YSkKICAgIHsKICAgICAgaW5mbyAoIk5vIGNhbWVyYSBkZXRlY3RlZC5cbiIpOwogICAgICBy ZXR1cm4gLUVOT0RFVjsKICAgIH0KCiAgaWYgKGNvbmZpZ19hX2RldmljZSAoJmNhcHR1cmUp KQogICAgewogICAgICB1bmNvbmZpZ19hX2RldmljZSAoJmNhcHR1cmUpOwogICAgICByZXR1 cm4gLUVOT0RFVjsKICAgIH0KICBpZiAodmlkZW9fcmVnaXN0ZXJfZGV2aWNlCiAgICAgICgo c3RydWN0IHZpZGVvX2RldmljZSAqKSAmY2FwdHVyZSwgVkZMX1RZUEVfR1JBQkJFUiwgLTEp ICE9IDApCiAgICB7CiAgICAgIGVyciAoIkNvdWxkbid0IHJlZ2lzdGVyIHRoZSBkcml2ZXIu XG4iKTsKICAgICAgb21hcF92NGwyX2NsZWFudXAgKCk7CiAgICAgIHJldHVybiAtRU5PREVW OwogICAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCgog IC8vaW5mbygiSW5pdGlhbGl6ZSB0aGUgdmlkZW8gZGVjb2RlciBoYXJkd2FyZVxuIik7CiAg Y2FwdHVyZS5jYW1pZi0+b3BlbiAoKTsKICAvLyAgQlVHOiBnZXQgZGVmYXVsdHMgZnJvbSB1 c2VyIHNvbWVob3cuLi4KICAvL2luZm8oImNhcHR1cmUudmlkZWMuc2V0X3N0YW5kYXJkXG4i KTsKICBjYXB0dXJlLnZpZGVjLnNldF9zdGFuZGFyZCAoJmNhcHR1cmUsIFY0TDJfU1REX05U U0MpOwogIC8vaW5mbygiY2FwdHVyZS52aWRlYy5zZXRfdmNybW9kZVxuIik7CiAgY2FwdHVy ZS52aWRlYy5zZXRfdmNybW9kZSAoJmNhcHR1cmUsIDApOwogIC8vaW5mbygic2V0X3ZpZGVv X2lucHV0XG4iKTsKICBzZXRfdmlkZW9faW5wdXQgKCZjYXB0dXJlLCBWU09VUkNFX0NBTUVS QSk7CgogIGluaXRfd2FpdHF1ZXVlX2hlYWQgKCZjYXB0dXJlLm5ld192aWRlb19mcmFtZSk7 CiAgaW5pdF93YWl0cXVldWVfaGVhZCAoJmNhcHR1cmUuZmJpbmZvX3dhaXQpOwogIGluaXRf d2FpdHF1ZXVlX2hlYWQgKCZjYXB0dXJlLnN1c3BlbmRfd3EpOwogIGluaXRfd2FpdHF1ZXVl X2hlYWQgKCZjYXB0dXJlLnJlc3VtZV93cSk7CiAgaW5pdF9jb21wbGV0aW9uICgmY2FwdHVy ZS5yZXN1bWVfdGhyZWFkX3N5bmMpOwoKCiAgY2FwdHVyZV9uZXdfZm9ybWF0ICgmY2FwdHVy ZSk7CgogIGNhcHR1cmUuY2FtaWYtPmNsb3NlICgpOwoKICBjYXB0dXJlLmlzX3JlZ2lzdGVy ZWQgPSAxOwoKICByZXR1cm4gMDsKfQoKCgojaWZuZGVmIE1PRFVMRQppbnQKaW5pdF92NGwy X29tYXAgKHN0cnVjdCB2aWRlb19pbml0ICppZ25vcmUpCnsKICByZXR1cm4gb21hcF92NGwy X2luaXQgKCk7Cn0KI2Vsc2UKbW9kdWxlX2luaXQgKG9tYXBfdjRsMl9pbml0KTsKbW9kdWxl X2V4aXQgKG9tYXBfdjRsMl9jbGVhbnVwKTsKI2VuZGlmCgoKTU9EVUxFX0FVVEhPUiAoIlJp ZGdlUnVuLCBtb2RpZmllZCBzYWdlbSAoamwubWFsZXRAbGFwb3N0ZS5uZXQpIik7Ck1PRFVM RV9ERVNDUklQVElPTiAoIm9tYXAgdmlkZW8gZHJpdmVyIik7Ck1PRFVMRV9MSUNFTlNFICgi R1BMIik7Cg== --------------080708080608090000010208--